summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xAndroid.bp420
-rwxr-xr-xAndroid.mk356
-rw-r--r--CleanSpec.mk3
-rw-r--r--PREUPLOAD.cfg1
-rw-r--r--apct-tests/perftests/autofill/Android.mk34
-rw-r--r--apct-tests/perftests/autofill/AndroidManifest.xml40
-rw-r--r--apct-tests/perftests/autofill/AndroidTest.xml28
-rw-r--r--apct-tests/perftests/autofill/res/layout/autofill_dataset_picker_text_only.xml25
-rw-r--r--apct-tests/perftests/autofill/res/layout/test_autofill_login.xml94
-rw-r--r--apct-tests/perftests/autofill/src/android/view/autofill/AbstractAutofillPerfTestCase.java125
-rw-r--r--apct-tests/perftests/autofill/src/android/view/autofill/LoginTest.java318
-rw-r--r--apct-tests/perftests/autofill/src/android/view/autofill/MyAutofillCallback.java127
-rw-r--r--apct-tests/perftests/autofill/src/android/view/autofill/MyAutofillService.java219
-rw-r--r--apct-tests/perftests/core/Android.mk3
-rw-r--r--apct-tests/perftests/core/AndroidManifest.xml10
-rw-r--r--apct-tests/perftests/core/jni/Android.bp13
-rw-r--r--apct-tests/perftests/core/jni/Android.mk17
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java6
-rw-r--r--apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java9
-rw-r--r--apct-tests/perftests/core/src/android/os/TracePerfTest.java86
-rw-r--r--apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java2
-rw-r--r--apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java2
-rw-r--r--apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java2
-rw-r--r--apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java108
-rw-r--r--apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java2
-rw-r--r--apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java100
-rw-r--r--apct-tests/perftests/core/src/android/text/TextPerfUtils.java62
-rw-r--r--apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java2
-rw-r--r--apct-tests/perftests/multiuser/Android.mk2
-rw-r--r--apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkRunner.java11
-rw-r--r--apct-tests/perftests/utils/Android.mk4
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/OneTimeSettingsListener.java82
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java4
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/SettingsHelper.java118
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/SettingsStateKeeperRule.java39
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/SettingsStateManager.java63
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/ShellHelper.java72
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/StateKeeperRule.java63
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/StateManager.java34
-rw-r--r--api/current.txt142
-rw-r--r--api/removed.txt5
-rw-r--r--api/system-current.txt290
-rw-r--r--api/test-current.txt268
-rw-r--r--cmds/app_process/app_main.cpp18
-rw-r--r--cmds/backup/Android.bp20
-rw-r--r--cmds/backup/Android.mk17
-rw-r--r--cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java59
-rw-r--r--cmds/bootanimation/Android.mk7
-rw-r--r--cmds/bootanimation/BootAnimation.h1
-rw-r--r--cmds/bootanimation/BootAnimationUtil.cpp43
-rw-r--r--cmds/bootanimation/BootAnimationUtil.h7
-rw-r--r--cmds/bootanimation/audioplay.cpp81
-rw-r--r--cmds/bootanimation/audioplay.h5
-rw-r--r--cmds/bootanimation/bootanimation_main.cpp111
-rw-r--r--cmds/bootanimation/iot/Android.mk (renamed from packages/DefaultContainerService/jni/Android.mk)39
-rw-r--r--cmds/bootanimation/iot/BootAction.cpp33
-rw-r--r--cmds/bootanimation/iot/BootAction.h9
-rw-r--r--cmds/bootanimation/iot/BootParameters.cpp179
-rw-r--r--cmds/bootanimation/iot/BootParameters.h49
-rw-r--r--cmds/bootanimation/iot/BootParameters_test.cpp263
-rw-r--r--cmds/bootanimation/iot/iotbootanimation_main.cpp14
-rw-r--r--cmds/content/src/com/android/commands/content/Content.java2
-rw-r--r--cmds/dpm/src/com/android/commands/dpm/Dpm.java19
-rw-r--r--cmds/idmap/Android.bp38
-rw-r--r--cmds/idmap/Android.mk30
-rw-r--r--cmds/incident_helper/src/main.cpp3
-rw-r--r--cmds/incidentd/src/FdBuffer.cpp14
-rw-r--r--cmds/incidentd/src/IncidentService.cpp18
-rw-r--r--cmds/incidentd/src/PrivacyBuffer.cpp4
-rw-r--r--cmds/incidentd/src/Section.cpp122
-rw-r--r--cmds/incidentd/src/Section.h6
-rw-r--r--cmds/incidentd/src/Throttler.cpp11
-rw-r--r--cmds/incidentd/tests/Reporter_test.cpp2
-rw-r--r--cmds/incidentd/tests/Section_test.cpp8
-rw-r--r--cmds/input/src/com/android/commands/input/Input.java3
-rw-r--r--cmds/screencap/screencap.cpp13
-rw-r--r--cmds/statsd/Android.bp2
-rw-r--r--cmds/statsd/Android.mk28
-rw-r--r--cmds/statsd/benchmark/metric_util.cpp7
-rw-r--r--cmds/statsd/src/FieldValue.cpp147
-rw-r--r--cmds/statsd/src/FieldValue.h27
-rw-r--r--cmds/statsd/src/HashableDimensionKey.cpp4
-rw-r--r--cmds/statsd/src/StatsLogProcessor.cpp16
-rw-r--r--cmds/statsd/src/StatsLogProcessor.h5
-rw-r--r--cmds/statsd/src/StatsService.cpp47
-rw-r--r--cmds/statsd/src/StatsService.h5
-rw-r--r--cmds/statsd/src/anomaly/AlarmMonitor.cpp2
-rw-r--r--cmds/statsd/src/anomaly/AnomalyTracker.cpp8
-rw-r--r--cmds/statsd/src/anomaly/subscriber_util.cpp7
-rw-r--r--cmds/statsd/src/atoms.proto59
-rw-r--r--cmds/statsd/src/external/Perfprofd.cpp83
-rw-r--r--cmds/statsd/src/external/Perfprofd.h38
-rw-r--r--cmds/statsd/src/external/ResourceHealthManagerPuller.cpp2
-rw-r--r--cmds/statsd/src/external/StatsPuller.cpp4
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.cpp (renamed from cmds/statsd/src/external/StatsPullerManagerImpl.cpp)38
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.h97
-rw-r--r--cmds/statsd/src/external/StatsPullerManagerImpl.h102
-rw-r--r--cmds/statsd/src/external/puller_util.cpp10
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.cpp2
-rw-r--r--cmds/statsd/src/guardrail/StatsdStats.h1
-rw-r--r--cmds/statsd/src/logd/LogEvent.cpp2
-rw-r--r--cmds/statsd/src/main.cpp11
-rw-r--r--cmds/statsd/src/matchers/LogMatchingTracker.h2
-rw-r--r--cmds/statsd/src/metrics/CountMetricProducer.cpp1
-rw-r--r--cmds/statsd/src/metrics/CountMetricProducer.h2
-rw-r--r--cmds/statsd/src/metrics/DurationMetricProducer.cpp5
-rw-r--r--cmds/statsd/src/metrics/DurationMetricProducer.h1
-rw-r--r--cmds/statsd/src/metrics/EventMetricProducer.h1
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.cpp23
-rw-r--r--cmds/statsd/src/metrics/GaugeMetricProducer.h15
-rw-r--r--cmds/statsd/src/metrics/MetricsManager.cpp18
-rw-r--r--cmds/statsd/src/metrics/MetricsManager.h8
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.cpp164
-rw-r--r--cmds/statsd/src/metrics/ValueMetricProducer.h46
-rw-r--r--cmds/statsd/src/metrics/duration_helper/DurationTracker.h1
-rw-r--r--cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp1
-rw-r--r--cmds/statsd/src/metrics/metrics_manager_util.cpp31
-rw-r--r--cmds/statsd/src/metrics/metrics_manager_util.h13
l---------cmds/statsd/src/metrics_constants/metrics_constants.proto1
-rw-r--r--cmds/statsd/src/packages/UidMap.cpp2
-rw-r--r--cmds/statsd/src/packages/UidMap.h3
l---------cmds/statsd/src/perfprofd/perfprofd_config.proto1
-rw-r--r--cmds/statsd/src/stats_log.proto6
-rw-r--r--cmds/statsd/src/statsd_config.proto9
-rw-r--r--cmds/statsd/src/storage/StorageManager.cpp2
-rw-r--r--cmds/statsd/tests/FieldValue_test.cpp5
-rw-r--r--cmds/statsd/tests/MetricsManager_test.cpp93
-rw-r--r--cmds/statsd/tests/StatsLogProcessor_test.cpp67
-rw-r--r--cmds/statsd/tests/UidMap_test.cpp5
-rw-r--r--cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp16
-rw-r--r--cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp24
-rw-r--r--cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp1
-rw-r--r--cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp38
-rw-r--r--cmds/statsd/tests/metrics/EventMetricProducer_test.cpp4
-rw-r--r--cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp31
-rw-r--r--cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp441
-rw-r--r--cmds/statsd/tests/statsd_test_util.cpp6
-rw-r--r--cmds/uiautomator/library/Android.bp59
-rw-r--r--cmds/uiautomator/library/Android.mk72
-rw-r--r--cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java2
-rwxr-xr-xconfig/generate-preloaded-classes.sh2
-rw-r--r--config/hiddenapi-light-greylist.txt113
-rw-r--r--config/hiddenapi-p-light-greylist.txt5992
-rw-r--r--config/hiddenapi-vendor-list.txt9
-rw-r--r--core/java/android/accounts/ChooseAccountActivity.java5
-rw-r--r--core/java/android/accounts/ChooseTypeAndAccountActivity.java5
-rw-r--r--core/java/android/animation/AnimatorSet.java15
-rw-r--r--core/java/android/animation/IntEvaluator.java4
-rw-r--r--core/java/android/app/Activity.java132
-rw-r--r--core/java/android/app/ActivityManager.java276
-rw-r--r--core/java/android/app/ActivityManagerInternal.java284
-rw-r--r--core/java/android/app/ActivityOptions.java52
-rw-r--r--core/java/android/app/ActivityTaskManager.java253
-rw-r--r--core/java/android/app/ActivityThread.java39
-rw-r--r--core/java/android/app/ActivityView.java8
-rw-r--r--core/java/android/app/AlarmManager.java3
-rw-r--r--core/java/android/app/AppOpsManager.java115
-rw-r--r--core/java/android/app/AppOpsManagerInternal.java43
-rw-r--r--core/java/android/app/Application.java32
-rw-r--r--core/java/android/app/ApplicationPackageManager.java265
-rw-r--r--core/java/android/app/ClientTransactionHandler.java5
-rw-r--r--core/java/android/app/ContextImpl.java12
-rw-r--r--core/java/android/app/Dialog.java2
-rw-r--r--core/java/android/app/IActivityManager.aidl233
-rw-r--r--core/java/android/app/IActivityTaskManager.aidl425
-rw-r--r--core/java/android/app/IApplicationThread.aidl3
-rw-r--r--core/java/android/app/IUiAutomationConnection.aidl3
-rw-r--r--core/java/android/app/Instrumentation.java44
-rw-r--r--core/java/android/app/KeyguardManager.java12
-rw-r--r--core/java/android/app/Notification.java111
-rw-r--r--core/java/android/app/NotificationChannel.java31
-rw-r--r--core/java/android/app/PictureInPictureParams.java4
-rw-r--r--core/java/android/app/SearchManager.java2
-rw-r--r--core/java/android/app/StatusBarManager.java6
-rw-r--r--core/java/android/app/SystemServiceRegistry.java56
-rw-r--r--core/java/android/app/UiAutomation.java60
-rw-r--r--core/java/android/app/UiAutomationConnection.java35
-rw-r--r--core/java/android/app/Vr2dDisplayProperties.java39
-rw-r--r--core/java/android/app/VrManager.java45
-rw-r--r--core/java/android/app/VrStateCallback.java3
-rw-r--r--core/java/android/app/WallpaperColors.java28
-rw-r--r--core/java/android/app/WallpaperManager.java20
-rw-r--r--core/java/android/app/WindowConfiguration.java74
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java57
-rw-r--r--core/java/android/app/admin/IDevicePolicyManager.aidl5
-rw-r--r--core/java/android/app/assist/AssistStructure.java16
-rw-r--r--core/java/android/app/backup/BackupAgent.java34
-rw-r--r--core/java/android/app/backup/BackupManager.java21
-rw-r--r--core/java/android/app/backup/BackupUtils.java58
-rw-r--r--core/java/android/app/backup/IBackupManager.aidl12
-rw-r--r--core/java/android/app/backup/IBackupObserver.aidl2
-rw-r--r--core/java/android/app/backup/RestoreSession.java8
-rw-r--r--core/java/android/app/servertransaction/ClientTransaction.java25
-rw-r--r--core/java/android/app/servertransaction/DestroyActivityItem.java5
-rw-r--r--core/java/android/app/servertransaction/PauseActivityItem.java3
-rw-r--r--core/java/android/app/servertransaction/PendingTransactionActions.java3
-rw-r--r--core/java/android/app/servertransaction/ResumeActivityItem.java3
-rw-r--r--core/java/android/app/servertransaction/TransactionExecutor.java21
-rw-r--r--core/java/android/app/slice/Slice.java16
-rw-r--r--core/java/android/app/slice/SliceProvider.java4
-rw-r--r--core/java/android/app/slice/SliceSpec.java2
-rw-r--r--core/java/android/app/timedetector/ITimeDetectorService.aidl36
-rw-r--r--core/java/android/app/timedetector/TimeDetector.java59
-rw-r--r--core/java/android/app/timedetector/TimeSignal.aidl (renamed from packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionCategory.java)10
-rw-r--r--core/java/android/app/timedetector/TimeSignal.java110
-rw-r--r--core/java/android/app/timezone/RulesState.aidl2
-rw-r--r--core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl34
-rw-r--r--core/java/android/app/timezonedetector/TimeZoneDetector.java57
-rw-r--r--core/java/android/app/trust/ITrustManager.aidl5
-rw-r--r--core/java/android/app/trust/TrustManager.java17
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java152
-rw-r--r--core/java/android/bluetooth/le/ScanRecord.java2
-rw-r--r--core/java/android/content/ContentProviderClient.java17
-rw-r--r--core/java/android/content/ContentResolver.java11
-rw-r--r--core/java/android/content/ContentValues.java120
-rw-r--r--core/java/android/content/Context.java44
-rw-r--r--core/java/android/content/Intent.java64
-rw-r--r--core/java/android/content/QuickViewConstants.java4
-rw-r--r--core/java/android/content/UriMatcher.java33
-rw-r--r--core/java/android/content/pm/ActivityInfo.java3
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java8
-rw-r--r--core/java/android/content/pm/CrossProfileApps.java4
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl3
-rw-r--r--core/java/android/content/pm/LimitedLengthInputStream.java5
-rw-r--r--core/java/android/content/pm/PackageInstaller.java11
-rw-r--r--core/java/android/content/pm/PackageItemInfo.java81
-rw-r--r--core/java/android/content/pm/PackageManager.java76
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java43
-rw-r--r--core/java/android/content/pm/PackageParser.java51
-rw-r--r--core/java/android/content/pm/PackageUserState.java4
-rw-r--r--core/java/android/content/pm/PermissionGroupInfo.java45
-rw-r--r--core/java/android/content/pm/PermissionInfo.java18
-rw-r--r--core/java/android/content/res/Resources.java3
-rw-r--r--core/java/android/database/sqlite/SQLiteDatabase.java6
-rw-r--r--core/java/android/database/sqlite/SQLiteDebug.java1
-rw-r--r--core/java/android/database/sqlite/SQLiteQueryBuilder.java523
-rw-r--r--core/java/android/hardware/Camera.java4
-rw-r--r--core/java/android/hardware/SensorManager.java4
-rw-r--r--core/java/android/hardware/biometrics/BiometricAuthenticator.java51
-rw-r--r--core/java/android/hardware/biometrics/BiometricFaceConstants.java215
-rw-r--r--core/java/android/hardware/biometrics/BiometricPrompt.java2
-rw-r--r--core/java/android/hardware/biometrics/BiometricSourceType.aidl22
-rw-r--r--core/java/android/hardware/biometrics/BiometricSourceType.java51
-rw-r--r--core/java/android/hardware/biometrics/IBiometricServiceLockoutResetCallback.aidl (renamed from core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl)7
-rw-r--r--core/java/android/hardware/camera2/CameraCaptureSession.java4
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java22
-rw-r--r--core/java/android/hardware/camera2/CaptureFailure.java4
-rw-r--r--core/java/android/hardware/camera2/CaptureRequest.java144
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java174
-rw-r--r--core/java/android/hardware/camera2/TotalCaptureResult.java2
-rw-r--r--core/java/android/hardware/camera2/impl/CameraMetadataNative.java3
-rw-r--r--core/java/android/hardware/camera2/params/Face.java1
-rw-r--r--core/java/android/hardware/camera2/params/LensShadingMap.java22
-rw-r--r--core/java/android/hardware/camera2/params/OutputConfiguration.java6
-rw-r--r--core/java/android/hardware/camera2/params/StreamConfigurationMap.java16
-rw-r--r--core/java/android/hardware/camera2/params/TonemapCurve.java6
-rw-r--r--core/java/android/hardware/face/Face.aidl21
-rw-r--r--core/java/android/hardware/face/Face.java100
-rw-r--r--core/java/android/hardware/face/FaceManager.java1007
-rw-r--r--core/java/android/hardware/face/IFaceService.aidl85
-rw-r--r--core/java/android/hardware/face/IFaceServiceReceiver.aidl33
-rw-r--r--core/java/android/hardware/fingerprint/Fingerprint.java44
-rw-r--r--core/java/android/hardware/fingerprint/FingerprintManager.java76
-rw-r--r--core/java/android/hardware/fingerprint/IFingerprintService.aidl4
-rw-r--r--core/java/android/hardware/input/InputManagerInternal.java9
-rw-r--r--core/java/android/hardware/location/NanoAppFilter.java3
-rw-r--r--core/java/android/hardware/radio/RadioManager.aidl3
-rw-r--r--core/java/android/inputmethodservice/IInputMethodSessionWrapper.java2
-rw-r--r--core/java/android/inputmethodservice/InputMethodService.java32
-rw-r--r--core/java/android/net/ConnectivityManager.java54
-rw-r--r--core/java/android/net/IpSecManager.java6
-rw-r--r--core/java/android/net/IpSecTransform.java5
-rw-r--r--core/java/android/net/LinkProperties.java187
-rw-r--r--core/java/android/net/Network.java16
-rw-r--r--core/java/android/net/NetworkCapabilities.java9
-rw-r--r--core/java/android/net/SSLCertificateSocketFactory.java7
-rw-r--r--core/java/android/net/http/HttpResponseCache.java64
-rw-r--r--core/java/android/nfc/NdefMessage.java8
-rw-r--r--core/java/android/nfc/tech/MifareClassic.java4
-rw-r--r--core/java/android/os/BatteryProperties.java110
-rw-r--r--core/java/android/os/BatteryStats.java4
-rw-r--r--core/java/android/os/Binder.java466
-rw-r--r--core/java/android/os/BinderProxy.java588
-rw-r--r--core/java/android/os/Build.java28
-rw-r--r--core/java/android/os/CommonClock.java405
-rw-r--r--core/java/android/os/CommonTimeConfig.java447
-rw-r--r--core/java/android/os/CommonTimeUtils.java293
-rw-r--r--core/java/android/os/DropBoxManager.java22
-rw-r--r--core/java/android/os/Environment.java3
-rw-r--r--core/java/android/os/FileBridge.java4
-rw-r--r--core/java/android/os/FileUtils.java263
-rw-r--r--core/java/android/os/Handler.java2
-rw-r--r--core/java/android/os/IBatteryPropertiesListener.aidl27
-rw-r--r--core/java/android/os/IBatteryPropertiesRegistrar.aidl3
-rw-r--r--core/java/android/os/IncidentReportArgs.java1
-rw-r--r--core/java/android/os/MessageQueue.java3
-rw-r--r--core/java/android/os/Parcel.java267
-rw-r--r--core/java/android/os/ParcelFileDescriptor.aidl2
-rw-r--r--core/java/android/os/PowerManager.java1
-rw-r--r--core/java/android/os/Process.java6
-rw-r--r--core/java/android/os/RedactingFileDescriptor.java143
-rw-r--r--core/java/android/os/ServiceManager.java4
-rw-r--r--core/java/android/os/ShellCommand.java6
-rw-r--r--core/java/android/os/StrictMode.java707
-rw-r--r--core/java/android/os/SystemProperties.java1
-rw-r--r--core/java/android/os/Trace.java53
-rw-r--r--core/java/android/os/UserHandle.java1
-rw-r--r--core/java/android/os/UserManager.java14
-rw-r--r--core/java/android/os/VibrationEffect.java50
-rw-r--r--core/java/android/os/WorkSource.java9
-rw-r--r--core/java/android/os/ZygoteProcess.java29
-rw-r--r--core/java/android/os/health/HealthKeys.java6
-rw-r--r--core/java/android/os/health/HealthStats.java2
-rw-r--r--core/java/android/os/health/HealthStatsParceler.java2
-rw-r--r--core/java/android/os/health/HealthStatsWriter.java2
-rw-r--r--core/java/android/os/storage/StorageManager.java4
-rw-r--r--core/java/android/os/storage/StorageVolume.java2
-rw-r--r--core/java/android/os/storage/VolumeInfo.java4
-rw-r--r--core/java/android/os/strictmode/CredentialProtectedWhileLockedViolation.java39
-rw-r--r--core/java/android/os/strictmode/ExplicitGcViolation.java31
-rw-r--r--core/java/android/os/strictmode/ImplicitDirectBootViolation.java33
-rw-r--r--core/java/android/os/strictmode/UntaggedSocketViolation.java8
-rw-r--r--core/java/android/preference/DialogPreference.java128
-rw-r--r--core/java/android/preference/ListPreference.java44
-rw-r--r--core/java/android/preference/PreferenceManager.java1
-rw-r--r--core/java/android/print/PrintFileDocumentAdapter.java2
-rw-r--r--core/java/android/print/PrintJobInfo.java9
-rw-r--r--core/java/android/printservice/recommendation/RecommendationService.java18
-rw-r--r--core/java/android/provider/ContactsContract.java3
-rw-r--r--core/java/android/provider/DocumentsContract.java7
-rw-r--r--core/java/android/provider/MediaStore.java2
-rw-r--r--core/java/android/provider/Settings.java236
-rw-r--r--core/java/android/security/net/config/WfaCertificateSource.java42
-rw-r--r--core/java/android/security/net/config/XmlConfigSource.java2
-rw-r--r--core/java/android/service/notification/Adjustment.java6
-rw-r--r--core/java/android/service/notification/NotificationListenerService.java32
-rw-r--r--core/java/android/service/notification/NotificationRankingUpdate.java10
-rw-r--r--core/java/android/service/notification/ZenModeConfig.java18
-rw-r--r--core/java/android/service/restrictions/RestrictionsReceiver.java1
-rw-r--r--core/java/android/service/voice/VoiceInteractionSession.java6
-rw-r--r--core/java/android/service/wallpaper/WallpaperService.java2
-rw-r--r--core/java/android/speech/tts/TextToSpeech.java6
-rw-r--r--core/java/android/text/BoringLayout.java9
-rw-r--r--core/java/android/text/Layout.java38
-rw-r--r--core/java/android/text/PrecomputedText.java1
-rw-r--r--core/java/android/text/StaticLayout.java46
-rw-r--r--core/java/android/text/TextLine.java39
-rw-r--r--core/java/android/text/TextUtils.java48
-rw-r--r--core/java/android/text/method/TransformationMethod.java2
-rw-r--r--core/java/android/text/style/EasyEditSpan.java1
-rw-r--r--core/java/android/text/style/LocaleSpan.java2
-rw-r--r--core/java/android/text/style/TtsSpan.java2
-rw-r--r--core/java/android/text/util/Linkify.java375
-rw-r--r--core/java/android/transition/Scene.java6
-rw-r--r--core/java/android/transition/TransitionManager.java16
-rw-r--r--core/java/android/transition/TransitionSet.java50
-rw-r--r--core/java/android/util/FeatureFlagUtils.java7
-rw-r--r--core/java/android/util/Half.java4
-rw-r--r--core/java/android/util/IntArray.java18
-rw-r--r--core/java/android/util/Log.java66
-rw-r--r--core/java/android/util/LongArray.java14
-rw-r--r--core/java/android/util/MathUtils.java15
-rw-r--r--core/java/android/util/TimestampedValue.java137
-rw-r--r--core/java/android/util/Xml.java46
-rw-r--r--core/java/android/view/Display.java15
-rw-r--r--core/java/android/view/DisplayCutout.java50
-rw-r--r--core/java/android/view/DisplayInfo.java2
-rw-r--r--core/java/android/view/DisplayListCanvas.java5
-rw-r--r--core/java/android/view/InputEvent.java21
-rw-r--r--core/java/android/view/InputEventReceiver.java7
-rw-r--r--core/java/android/view/KeyCharacterMap.java4
-rw-r--r--core/java/android/view/KeyEvent.java84
-rw-r--r--core/java/android/view/MotionEvent.java84
-rw-r--r--core/java/android/view/RecordingCanvas.java31
-rw-r--r--core/java/android/view/RenderNode.java58
-rw-r--r--core/java/android/view/RoundScrollbarRenderer.java23
-rw-r--r--core/java/android/view/SurfaceSession.java7
-rw-r--r--core/java/android/view/ThreadedRenderer.java16
-rw-r--r--core/java/android/view/View.java110
-rw-r--r--core/java/android/view/ViewDebug.java1
-rw-r--r--core/java/android/view/ViewGroup.java26
-rw-r--r--core/java/android/view/ViewRootImpl.java40
-rw-r--r--core/java/android/view/Window.java8
-rw-r--r--core/java/android/view/WindowManager.java16
-rw-r--r--core/java/android/view/WindowManagerPolicyConstants.java11
-rw-r--r--core/java/android/view/accessibility/AccessibilityEvent.java15
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java75
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeProvider.java2
-rw-r--r--core/java/android/view/accessibility/AccessibilityRequestPreparer.java4
-rw-r--r--core/java/android/view/autofill/AutofillManager.java190
-rw-r--r--core/java/android/view/autofill/AutofillValue.java13
-rw-r--r--core/java/android/view/autofill/IAutoFillManager.aidl38
-rw-r--r--core/java/android/view/inputmethod/InputMethodInfo.java8
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java30
-rw-r--r--core/java/android/view/inputmethod/InputMethodManagerInternal.java5
-rw-r--r--core/java/android/view/inputmethod/InputMethodSession.java47
-rw-r--r--core/java/android/view/textservice/TextServicesManager.java3
-rw-r--r--core/java/android/webkit/WebBackForwardList.java3
-rw-r--r--core/java/android/webkit/WebHistoryItem.java12
-rw-r--r--core/java/android/webkit/WebSettings.java8
-rw-r--r--core/java/android/webkit/WebView.java292
-rwxr-xr-xcore/java/android/widget/AbsListView.java2
-rw-r--r--core/java/android/widget/AdapterView.java4
-rw-r--r--core/java/android/widget/DateTimeView.java4
-rw-r--r--core/java/android/widget/DayPickerPagerAdapter.java3
-rw-r--r--core/java/android/widget/Editor.java1
-rw-r--r--core/java/android/widget/GridLayout.java8
-rw-r--r--core/java/android/widget/ImageView.java43
-rw-r--r--core/java/android/widget/Magnifier.java1
-rw-r--r--core/java/android/widget/RemoteViews.java4
-rw-r--r--core/java/android/widget/SpellChecker.java5
-rw-r--r--core/java/android/widget/TextInputTimePickerView.java42
-rw-r--r--core/java/android/widget/TextView.java54
-rw-r--r--core/java/android/widget/Toolbar.java92
-rw-r--r--core/java/com/android/internal/app/HarmfulAppWarningActivity.java6
-rw-r--r--core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java3
-rw-r--r--core/java/com/android/internal/app/IAppOpsService.aidl2
-rw-r--r--core/java/com/android/internal/app/ISoundTriggerService.aidl7
-rw-r--r--core/java/com/android/internal/app/IntentForwarderActivity.java5
-rw-r--r--core/java/com/android/internal/app/LocaleStore.java3
-rw-r--r--core/java/com/android/internal/app/PlatLogoActivity.java80
-rw-r--r--core/java/com/android/internal/app/ResolverActivity.java5
-rw-r--r--core/java/com/android/internal/app/procstats/AssociationState.java472
-rw-r--r--core/java/com/android/internal/app/procstats/DumpUtils.java5
-rw-r--r--core/java/com/android/internal/app/procstats/ProcessState.java79
-rw-r--r--core/java/com/android/internal/app/procstats/ProcessStats.java298
-rw-r--r--core/java/com/android/internal/app/procstats/ServiceState.java107
-rw-r--r--core/java/com/android/internal/app/procstats/SparseMappingTable.java2
-rw-r--r--core/java/com/android/internal/content/FileSystemProvider.java39
-rw-r--r--core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java6
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java64
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodUtils.java93
-rw-r--r--core/java/com/android/internal/net/NetworkStatsFactory.java12
-rw-r--r--core/java/com/android/internal/os/BatteryStatsHistory.java455
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java548
-rw-r--r--core/java/com/android/internal/os/BinderCallsStats.java518
-rw-r--r--core/java/com/android/internal/os/IDropBoxManagerService.aidl2
-rw-r--r--core/java/com/android/internal/os/ZygoteConnection.java25
-rw-r--r--core/java/com/android/internal/policy/DecorView.java37
-rw-r--r--core/java/com/android/internal/policy/PhoneWindow.java49
-rw-r--r--core/java/com/android/internal/textservice/ITextServicesManager.aidl3
-rw-r--r--core/java/com/android/internal/util/ArrayUtils.java30
-rw-r--r--core/java/com/android/internal/util/ContrastColorUtil.java (renamed from core/java/com/android/internal/util/NotificationColorUtil.java)60
-rw-r--r--core/java/com/android/internal/util/DumpUtils.java60
-rw-r--r--core/java/com/android/internal/util/HexDump.java9
-rw-r--r--core/java/com/android/internal/util/LatencyTracker.java8
-rw-r--r--core/java/com/android/internal/view/IInputMethodManager.aidl4
-rw-r--r--core/java/com/android/internal/widget/BackgroundFallback.java5
-rw-r--r--core/java/com/android/internal/widget/ExploreByTouchHelper.java2
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java21
-rw-r--r--core/java/com/android/internal/widget/LockPatternView.java2
-rw-r--r--core/java/com/android/internal/widget/MessagingLayout.java20
-rw-r--r--core/java/com/android/internal/widget/PointerLocationView.java49
-rw-r--r--core/jni/Android.bp4
-rw-r--r--core/jni/AndroidRuntime.cpp49
-rwxr-xr-xcore/jni/android/graphics/Bitmap.cpp33
-rw-r--r--core/jni/android/graphics/FontFamily.cpp4
-rw-r--r--core/jni/android/graphics/Graphics.cpp8
-rw-r--r--core/jni/android/graphics/GraphicsJNI.h1
-rw-r--r--core/jni/android/graphics/MaskFilter.cpp2
-rw-r--r--core/jni/android/graphics/Paint.cpp31
-rw-r--r--core/jni/android/graphics/PaintFilter.cpp (renamed from core/jni/android/graphics/DrawFilter.cpp)59
-rw-r--r--core/jni/android/graphics/Path.cpp5
-rw-r--r--core/jni/android_graphics_Canvas.cpp83
-rw-r--r--core/jni/android_media_AudioSystem.cpp12
-rw-r--r--core/jni/android_media_MediaMetricsJNI.h1
-rw-r--r--core/jni/android_media_midi.cpp52
-rw-r--r--core/jni/android_os_Debug.cpp147
-rw-r--r--core/jni/android_os_GraphicsEnvironment.cpp3
-rw-r--r--core/jni/android_os_Trace.cpp89
-rw-r--r--core/jni/android_os_VintfObject.cpp2
-rw-r--r--core/jni/android_text_MeasuredParagraph.cpp1
-rw-r--r--core/jni/android_text_StaticLayout.cpp10
-rw-r--r--core/jni/android_util_Binder.cpp65
-rw-r--r--core/jni/android_view_DisplayListCanvas.cpp18
-rw-r--r--core/jni/android_view_InputEventReceiver.cpp8
-rw-r--r--core/jni/android_view_InputEventSender.cpp9
-rw-r--r--core/jni/android_view_KeyEvent.cpp10
-rw-r--r--core/jni/android_view_MotionEvent.cpp26
-rw-r--r--core/jni/android_view_RenderNode.cpp16
-rw-r--r--core/jni/android_view_TextureLayer.cpp1
-rw-r--r--core/jni/android_view_ThreadedRenderer.cpp7
-rw-r--r--core/jni/com_android_internal_os_Zygote.cpp414
-rw-r--r--core/proto/android/os/incident.proto10
-rw-r--r--core/proto/android/os/system_properties.proto2
-rw-r--r--core/proto/android/providers/settings/global.proto13
-rw-r--r--core/proto/android/server/face.proto67
-rw-r--r--core/proto/android/server/fingerprint.proto4
-rw-r--r--core/proto/android/server/windowmanagerservice.proto2
-rw-r--r--core/proto/android/service/usb.proto16
-rw-r--r--core/res/AndroidManifest.xml74
-rw-r--r--core/res/res/anim/lock_screen_behind_enter_fade_in.xml1
-rw-r--r--core/res/res/drawable-hdpi/ic_grayedout_printer.pngbin3418 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_grayedout_printer.pngbin3418 -> 0 bytes
-rw-r--r--core/res/res/drawable-watch/toast_frame.xml (renamed from core/java/android/os/BatteryProperties.aidl)15
-rw-r--r--core/res/res/drawable-xhdpi/ic_grayedout_printer.pngbin3418 -> 0 bytes
-rw-r--r--core/res/res/layout-watch/transient_notification.xml37
-rw-r--r--core/res/res/layout/time_picker_header_material.xml2
-rw-r--r--core/res/res/values-af/strings.xml48
-rw-r--r--core/res/res/values-am/strings.xml52
-rw-r--r--core/res/res/values-ar/strings.xml54
-rw-r--r--core/res/res/values-as/strings.xml58
-rw-r--r--core/res/res/values-az/strings.xml48
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml48
-rw-r--r--core/res/res/values-be/strings.xml52
-rw-r--r--core/res/res/values-bg/strings.xml48
-rw-r--r--core/res/res/values-bn/strings.xml52
-rw-r--r--core/res/res/values-bs/strings.xml56
-rw-r--r--core/res/res/values-ca/strings.xml52
-rw-r--r--core/res/res/values-cs/strings.xml48
-rw-r--r--core/res/res/values-da/strings.xml52
-rw-r--r--core/res/res/values-de/strings.xml48
-rw-r--r--core/res/res/values-el/strings.xml48
-rw-r--r--core/res/res/values-en-rAU/strings.xml48
-rw-r--r--core/res/res/values-en-rCA/strings.xml48
-rw-r--r--core/res/res/values-en-rGB/strings.xml48
-rw-r--r--core/res/res/values-en-rIN/strings.xml48
-rw-r--r--core/res/res/values-en-rXC/strings.xml48
-rw-r--r--core/res/res/values-es-rUS/strings.xml48
-rw-r--r--core/res/res/values-es/strings.xml52
-rw-r--r--core/res/res/values-et/strings.xml48
-rw-r--r--core/res/res/values-eu/strings.xml48
-rw-r--r--core/res/res/values-fa/strings.xml48
-rw-r--r--core/res/res/values-fi/strings.xml48
-rw-r--r--core/res/res/values-fr-rCA/strings.xml58
-rw-r--r--core/res/res/values-fr/strings.xml52
-rw-r--r--core/res/res/values-gl/strings.xml48
-rw-r--r--core/res/res/values-gu/strings.xml48
-rw-r--r--core/res/res/values-hi/strings.xml52
-rw-r--r--core/res/res/values-hr/strings.xml48
-rw-r--r--core/res/res/values-hu/strings.xml48
-rw-r--r--core/res/res/values-hy/strings.xml56
-rw-r--r--core/res/res/values-in/strings.xml58
-rw-r--r--core/res/res/values-is/strings.xml48
-rw-r--r--core/res/res/values-it/strings.xml62
-rw-r--r--core/res/res/values-iw/strings.xml50
-rw-r--r--core/res/res/values-ja/strings.xml48
-rw-r--r--core/res/res/values-ka/strings.xml48
-rw-r--r--core/res/res/values-kk/strings.xml48
-rw-r--r--core/res/res/values-km/strings.xml48
-rw-r--r--core/res/res/values-kn/strings.xml48
-rw-r--r--core/res/res/values-ko/strings.xml50
-rw-r--r--core/res/res/values-ky/strings.xml48
-rw-r--r--core/res/res/values-land/dimens_package_installer.xml22
-rw-r--r--core/res/res/values-lo/strings.xml48
-rw-r--r--core/res/res/values-lt/strings.xml48
-rw-r--r--core/res/res/values-lv/strings.xml48
-rw-r--r--core/res/res/values-mcc334-mnc03/config.xml20
-rw-r--r--core/res/res/values-mcc334-mnc030/config.xml20
-rw-r--r--core/res/res/values-mcc704-mnc03/config.xml20
-rw-r--r--core/res/res/values-mcc706-mnc04/config.xml20
-rw-r--r--core/res/res/values-mcc712-mnc04/config.xml20
-rw-r--r--core/res/res/values-mcc716-mnc06/config.xml20
-rw-r--r--core/res/res/values-mcc716-mnc10/config.xml20
-rw-r--r--core/res/res/values-mcc716-mnc17/config.xml20
-rw-r--r--core/res/res/values-mcc722-mnc07/config.xml20
-rw-r--r--core/res/res/values-mcc732-mnc123/config.xml20
-rw-r--r--core/res/res/values-mcc740-mnc00/config.xml20
-rw-r--r--core/res/res/values-mk/strings.xml48
-rw-r--r--core/res/res/values-ml/strings.xml48
-rw-r--r--core/res/res/values-mn/strings.xml48
-rw-r--r--core/res/res/values-mr/strings.xml48
-rw-r--r--core/res/res/values-ms/strings.xml48
-rw-r--r--core/res/res/values-my/strings.xml50
-rw-r--r--core/res/res/values-nb/strings.xml62
-rw-r--r--core/res/res/values-ne/strings.xml48
-rw-r--r--core/res/res/values-night/colors.xml31
-rw-r--r--core/res/res/values-night/themes_device_defaults.xml54
-rw-r--r--core/res/res/values-night/values.xml39
-rw-r--r--core/res/res/values-nl/strings.xml62
-rw-r--r--core/res/res/values-or/strings.xml58
-rw-r--r--core/res/res/values-pa/strings.xml48
-rw-r--r--core/res/res/values-pl/strings.xml54
-rw-r--r--core/res/res/values-port/dimens_package_installer.xml22
-rw-r--r--core/res/res/values-pt-rBR/strings.xml54
-rw-r--r--core/res/res/values-pt-rPT/strings.xml56
-rw-r--r--core/res/res/values-pt/strings.xml54
-rw-r--r--core/res/res/values-ro/strings.xml48
-rw-r--r--core/res/res/values-ru/strings.xml68
-rw-r--r--core/res/res/values-si/strings.xml48
-rw-r--r--core/res/res/values-sk/strings.xml48
-rw-r--r--core/res/res/values-sl/strings.xml48
-rw-r--r--core/res/res/values-sq/strings.xml48
-rw-r--r--core/res/res/values-sr/strings.xml48
-rw-r--r--core/res/res/values-sv/strings.xml58
-rw-r--r--core/res/res/values-sw/strings.xml76
-rw-r--r--core/res/res/values-ta/strings.xml48
-rw-r--r--core/res/res/values-te/strings.xml48
-rw-r--r--core/res/res/values-th/strings.xml50
-rw-r--r--core/res/res/values-tl/strings.xml48
-rw-r--r--core/res/res/values-tr/strings.xml50
-rw-r--r--core/res/res/values-uk/strings.xml48
-rw-r--r--core/res/res/values-ur/strings.xml48
-rw-r--r--core/res/res/values-uz/strings.xml48
-rw-r--r--core/res/res/values-vi/strings.xml48
-rw-r--r--core/res/res/values-w210dp-round-watch/styles.xml22
-rw-r--r--core/res/res/values-watch/config.xml3
-rw-r--r--core/res/res/values-watch/dimens.xml2
-rw-r--r--core/res/res/values-watch/styles.xml22
-rw-r--r--core/res/res/values-zh-rCN/strings.xml48
-rw-r--r--core/res/res/values-zh-rHK/strings.xml48
-rw-r--r--core/res/res/values-zh-rTW/strings.xml48
-rw-r--r--core/res/res/values-zu/strings.xml48
-rw-r--r--core/res/res/values/attrs.xml44
-rw-r--r--core/res/res/values/attrs_manifest.xml4
-rw-r--r--core/res/res/values/config.xml83
-rw-r--r--core/res/res/values/public.xml4
-rw-r--r--core/res/res/values/strings.xml155
-rw-r--r--core/res/res/values/styles_package_installer.xml97
-rw-r--r--core/res/res/values/symbols.xml59
-rw-r--r--core/res/res/values/themes_package_installer.xml35
-rw-r--r--core/res/res/xml/sms_short_codes.xml32
-rw-r--r--core/tests/HdmiCec/Android.mk (renamed from media/tests/NativeMidiDemo/jni/Android.mk)27
-rw-r--r--core/tests/HdmiCec/AndroidManifest.xml23
-rw-r--r--core/tests/HdmiCec/AndroidTest.xml28
-rw-r--r--core/tests/HdmiCec/HelloWorldTests_HalloWelt.config26
-rw-r--r--core/tests/HdmiCec/OWNERS3
-rw-r--r--core/tests/HdmiCec/src/android/test/example/helloworld/HelloWorldTest.java66
-rw-r--r--core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java12
-rw-r--r--core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java10
-rw-r--r--core/tests/coretests/Android.mk7
-rw-r--r--core/tests/coretests/apks/install_jni_lib/Android.bp26
-rw-r--r--core/tests/coretests/apks/install_jni_lib/Android.mk37
-rw-r--r--core/tests/coretests/apks/install_multi_package/Android.mk6
-rw-r--r--core/tests/coretests/apks/install_verifier_bad/Android.mk6
-rw-r--r--core/tests/coretests/apks/install_verifier_good/Android.mk6
-rw-r--r--core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttfbin864 -> 888 bytes
-rw-r--r--core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx2
-rw-r--r--core/tests/coretests/res/values/styles.xml8
-rw-r--r--core/tests/coretests/src/android/app/NotificationTest.java2
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java40
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java3
-rw-r--r--core/tests/coretests/src/android/content/UriMatcherTest.java (renamed from core/tests/coretests/src/android/net/UriMatcherTest.java)60
-rw-r--r--core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java83
-rw-r--r--core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java2
-rw-r--r--core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java (renamed from core/tests/coretests/src/android/net/SSLTest.java)41
-rw-r--r--core/tests/coretests/src/android/net/SntpClientTest.java39
-rw-r--r--core/tests/coretests/src/android/os/FileUtilsTest.java2
-rw-r--r--core/tests/coretests/src/android/os/ParcelNullabilityTest.java391
-rw-r--r--core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java109
-rw-r--r--core/tests/coretests/src/android/os/VibrationEffectTest.java90
-rw-r--r--core/tests/coretests/src/android/provider/DocumentsProviderTest.java6
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java31
-rw-r--r--core/tests/coretests/src/android/text/LayoutTest.java55
-rw-r--r--core/tests/coretests/src/android/text/TextLineTest.java253
-rw-r--r--core/tests/coretests/src/android/text/TextUtilsTest.java15
-rw-r--r--core/tests/coretests/src/android/text/method/ForwardDeleteTest.java3
-rw-r--r--core/tests/coretests/src/android/text/util/LinkifyTest.java60
-rw-r--r--core/tests/coretests/src/android/util/LogNullabilityTest.java170
-rw-r--r--core/tests/coretests/src/android/util/TimestampedValueTest.java129
-rw-r--r--core/tests/coretests/src/android/view/KeyEventTest.java100
-rw-r--r--core/tests/coretests/src/android/view/MotionEventTest.java72
-rw-r--r--core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java163
-rw-r--r--core/tests/coretests/src/android/view/ViewInvalidateTest.java1
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java29
-rw-r--r--core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java14
-rw-r--r--core/tests/coretests/src/android/widget/DateTimeViewTest.java22
-rw-r--r--core/tests/coretests/src/android/widget/TextViewTest.java33
-rw-r--r--core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java50
-rw-r--r--core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java252
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java145
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java1
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java406
-rw-r--r--core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java47
-rw-r--r--core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java44
-rw-r--r--core/tests/coretests/src/com/android/internal/util/HexDumpTest.java3
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/32/Android.mk5
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp38
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/32/jni/Android.mk38
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/64/Android.mk5
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp37
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/64/jni/Android.mk39
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/dual/Android.mk5
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp39
-rw-r--r--core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.mk38
-rw-r--r--core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java64
-rw-r--r--data/etc/platform.xml4
-rw-r--r--data/etc/privapp-permissions-platform.xml1
-rw-r--r--data/fonts/fonts.xml78
-rw-r--r--data/sounds/AllAudio.mk8
-rw-r--r--data/sounds/AudioPackage10.mk2
-rw-r--r--data/sounds/AudioPackage11.mk2
-rw-r--r--data/sounds/AudioPackage12.mk2
-rw-r--r--data/sounds/AudioPackage12_48.mk2
-rw-r--r--data/sounds/AudioPackage13.mk2
-rw-r--r--data/sounds/AudioPackage13_48.mk2
-rw-r--r--data/sounds/AudioPackage14.mk32
-rw-r--r--data/sounds/README.txt10
-rw-r--r--data/sounds/effects/ChargingStarted.oggbin0 -> 33370 bytes
-rw-r--r--data/sounds/effects/ogg/ChargingStarted.oggbin0 -> 33370 bytes
-rw-r--r--data/sounds/effects/ogg/ChargingStarted_48k.oggbin0 -> 33370 bytes
-rw-r--r--data/sounds/effects/ogg/InCallNotification_48k.oggbin0 -> 6275 bytes
-rw-r--r--data/sounds/effects/ogg/NFCFailure.oggbin0 -> 31870 bytes
-rw-r--r--data/sounds/effects/ogg/NFCInitiated.oggbin0 -> 25194 bytes
-rw-r--r--data/sounds/effects/ogg/NFCSuccess.oggbin0 -> 27201 bytes
-rw-r--r--data/sounds/effects/ogg/NFCTransferComplete.oggbin0 -> 33297 bytes
-rw-r--r--data/sounds/effects/ogg/NFCTransferInitiated.oggbin0 -> 28204 bytes
-rw-r--r--docs/html/reference/images/text/widget/first_last_baseline.pngbin0 -> 22570 bytes
-rw-r--r--drm/java/android/drm/DrmOutputStream.java4
-rw-r--r--drm/jni/Android.bp38
-rw-r--r--drm/jni/Android.mk45
-rw-r--r--graphics/java/android/graphics/BaseCanvas.java31
-rw-r--r--graphics/java/android/graphics/Bitmap.java69
-rw-r--r--graphics/java/android/graphics/ColorSpace.java46
-rw-r--r--graphics/java/android/graphics/Insets.java1
-rw-r--r--graphics/java/android/graphics/Path.java47
-rw-r--r--graphics/java/android/graphics/Picture.java2
-rw-r--r--graphics/java/android/graphics/PorterDuffColorFilter.java41
-rw-r--r--graphics/java/android/graphics/Rect.java39
-rw-r--r--graphics/java/android/graphics/RectF.java42
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java1
-rw-r--r--graphics/java/android/graphics/drawable/BitmapDrawable.java4
-rw-r--r--graphics/java/android/graphics/drawable/ColorDrawable.java21
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java16
-rw-r--r--graphics/java/android/graphics/drawable/DrawableContainer.java3
-rw-r--r--graphics/java/android/graphics/drawable/DrawableWrapper.java22
-rw-r--r--graphics/java/android/graphics/drawable/GradientDrawable.java13
-rw-r--r--graphics/java/android/graphics/drawable/InsetDrawable.java11
-rw-r--r--graphics/java/android/graphics/drawable/NinePatchDrawable.java3
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java5
-rw-r--r--graphics/java/android/graphics/drawable/ShapeDrawable.java4
-rw-r--r--graphics/java/android/graphics/drawable/StateListDrawable.java26
-rw-r--r--graphics/java/android/graphics/drawable/VectorDrawable.java7
-rw-r--r--graphics/java/android/graphics/drawable/shapes/ArcShape.java23
-rw-r--r--graphics/java/android/graphics/drawable/shapes/PathShape.java27
-rw-r--r--graphics/java/android/graphics/drawable/shapes/RectShape.java22
-rw-r--r--graphics/java/android/graphics/drawable/shapes/RoundRectShape.java30
-rw-r--r--graphics/java/android/graphics/drawable/shapes/Shape.java20
-rw-r--r--keystore/java/android/security/KeyChain.java8
-rw-r--r--keystore/java/android/security/KeyStore.java19
-rw-r--r--keystore/java/android/security/keystore/AndroidKeyStoreSpi.java2
-rw-r--r--keystore/java/android/security/keystore/KeyGenParameterSpec.java10
-rw-r--r--keystore/java/android/security/keystore/KeyProtection.java2
-rw-r--r--keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java102
-rw-r--r--keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java6
-rw-r--r--libs/androidfw/Android.bp1
-rw-r--r--libs/androidfw/include/androidfw/StringPiece.h8
-rwxr-xr-xlibs/androidfw/tests/data/appaslib/build2
-rwxr-xr-xlibs/androidfw/tests/data/basic/build2
-rwxr-xr-xlibs/androidfw/tests/data/feature/build2
-rwxr-xr-xlibs/androidfw/tests/data/libclient/build2
-rwxr-xr-xlibs/androidfw/tests/data/sparse/build2
-rw-r--r--libs/common_time/Android.mk39
-rw-r--r--libs/common_time/LinearTransform.cpp281
-rw-r--r--libs/common_time/LinearTransform.h64
-rw-r--r--libs/common_time/clock_recovery.cpp423
-rw-r--r--libs/common_time/clock_recovery.h159
-rw-r--r--libs/common_time/common_clock.cpp150
-rw-r--r--libs/common_time/common_clock.h58
-rw-r--r--libs/common_time/common_clock_service.cpp157
-rw-r--r--libs/common_time/common_clock_service.h91
-rw-r--r--libs/common_time/common_time_config_service.cpp112
-rw-r--r--libs/common_time/common_time_config_service.h60
-rw-r--r--libs/common_time/common_time_server.cpp1507
-rw-r--r--libs/common_time/common_time_server.h324
-rw-r--r--libs/common_time/common_time_server_api.cpp440
-rw-r--r--libs/common_time/common_time_server_packets.cpp293
-rw-r--r--libs/common_time/common_time_server_packets.h189
-rw-r--r--libs/common_time/diag_thread.cpp323
-rw-r--r--libs/common_time/diag_thread.h76
-rw-r--r--libs/common_time/main.cpp43
-rw-r--r--libs/common_time/utils.cpp164
-rw-r--r--libs/common_time/utils.h83
-rw-r--r--libs/hwui/AmbientShadow.cpp329
-rw-r--r--libs/hwui/AmbientShadow.h42
-rw-r--r--libs/hwui/Android.bp67
-rw-r--r--libs/hwui/Animator.h4
-rw-r--r--libs/hwui/BakedOpDispatcher.cpp879
-rw-r--r--libs/hwui/BakedOpDispatcher.h52
-rw-r--r--libs/hwui/BakedOpRenderer.cpp383
-rw-r--r--libs/hwui/BakedOpRenderer.h149
-rw-r--r--libs/hwui/BakedOpState.cpp173
-rw-r--r--libs/hwui/BakedOpState.h171
-rw-r--r--libs/hwui/Caches.cpp175
-rw-r--r--libs/hwui/Caches.h66
-rw-r--r--libs/hwui/CanvasTransform.cpp113
-rw-r--r--libs/hwui/CanvasTransform.h40
-rw-r--r--libs/hwui/DeviceInfo.cpp2
-rw-r--r--libs/hwui/DisplayList.cpp145
-rw-r--r--libs/hwui/DisplayList.h132
-rw-r--r--libs/hwui/EglReadback.cpp95
-rw-r--r--libs/hwui/EglReadback.h (renamed from libs/hwui/OpenGLReadback.h)27
-rw-r--r--libs/hwui/Extensions.cpp83
-rw-r--r--libs/hwui/Extensions.h42
-rw-r--r--libs/hwui/FboCache.cpp82
-rw-r--r--libs/hwui/FboCache.h79
-rw-r--r--libs/hwui/FontRenderer.cpp802
-rw-r--r--libs/hwui/FontRenderer.h208
-rw-r--r--libs/hwui/FrameBuilder.cpp976
-rw-r--r--libs/hwui/FrameBuilder.h251
-rw-r--r--libs/hwui/FrameInfoVisualizer.cpp1
-rw-r--r--libs/hwui/GammaFontRenderer.cpp43
-rw-r--r--libs/hwui/GammaFontRenderer.h70
-rw-r--r--libs/hwui/GlLayer.cpp8
-rw-r--r--libs/hwui/GlLayer.h4
-rw-r--r--libs/hwui/Glop.h179
-rw-r--r--libs/hwui/GlopBuilder.cpp691
-rw-r--r--libs/hwui/GlopBuilder.h142
-rw-r--r--libs/hwui/GradientCache.cpp272
-rw-r--r--libs/hwui/GradientCache.h177
-rw-r--r--libs/hwui/HardwareBitmapUploader.cpp292
-rw-r--r--libs/hwui/HardwareBitmapUploader.h (renamed from media/tests/NativeMidiDemo/jni/messagequeue.h)20
-rw-r--r--libs/hwui/Image.cpp61
-rw-r--r--libs/hwui/Image.h63
-rw-r--r--libs/hwui/Layer.h5
-rw-r--r--libs/hwui/LayerBuilder.cpp378
-rw-r--r--libs/hwui/LayerBuilder.h137
-rw-r--r--libs/hwui/Lighting.h (renamed from libs/hwui/OpDumper.h)17
-rw-r--r--libs/hwui/NinePatchUtils.h5
-rw-r--r--libs/hwui/OpDumper.cpp53
-rw-r--r--libs/hwui/OpenGLReadback.cpp287
-rw-r--r--libs/hwui/Outline.h3
-rw-r--r--libs/hwui/Patch.cpp229
-rw-r--r--libs/hwui/Patch.h73
-rw-r--r--libs/hwui/PatchCache.cpp264
-rw-r--r--libs/hwui/PatchCache.h171
-rw-r--r--libs/hwui/PathCache.cpp559
-rw-r--r--libs/hwui/PathCache.h267
-rw-r--r--libs/hwui/PathParser.cpp13
-rw-r--r--libs/hwui/PathTessellator.cpp1069
-rw-r--r--libs/hwui/PathTessellator.h148
-rw-r--r--libs/hwui/ProfileData.cpp4
-rw-r--r--libs/hwui/ProfileRenderer.cpp40
-rw-r--r--libs/hwui/ProfileRenderer.h40
-rw-r--r--libs/hwui/Program.cpp199
-rw-r--r--libs/hwui/Program.h446
-rw-r--r--libs/hwui/ProgramCache.cpp865
-rw-r--r--libs/hwui/ProgramCache.h68
-rw-r--r--libs/hwui/Properties.cpp23
-rw-r--r--libs/hwui/Properties.h11
-rw-r--r--libs/hwui/RecordedOp.h500
-rw-r--r--libs/hwui/RecordingCanvas.cpp631
-rw-r--r--libs/hwui/RecordingCanvas.h320
-rw-r--r--libs/hwui/RenderBuffer.h181
-rw-r--r--libs/hwui/RenderBufferCache.cpp161
-rw-r--r--libs/hwui/RenderBufferCache.h115
-rw-r--r--libs/hwui/RenderNode.cpp154
-rw-r--r--libs/hwui/RenderNode.h27
-rw-r--r--libs/hwui/RenderProperties.cpp6
-rw-r--r--libs/hwui/RenderProperties.h19
-rw-r--r--libs/hwui/ResourceCache.cpp4
-rw-r--r--libs/hwui/ShadowTessellator.cpp191
-rw-r--r--libs/hwui/ShadowTessellator.h94
-rw-r--r--libs/hwui/SkiaCanvas.cpp125
-rw-r--r--libs/hwui/SkiaCanvas.h60
-rw-r--r--libs/hwui/SkiaShader.cpp360
-rw-r--r--libs/hwui/SkiaShader.h86
-rw-r--r--libs/hwui/SpotShadow.cpp1120
-rw-r--r--libs/hwui/SpotShadow.h79
-rw-r--r--libs/hwui/TessellationCache.cpp444
-rw-r--r--libs/hwui/TessellationCache.h225
-rw-r--r--libs/hwui/TextDropShadowCache.cpp209
-rw-r--r--libs/hwui/TextDropShadowCache.h164
-rw-r--r--libs/hwui/TextureCache.cpp227
-rw-r--r--libs/hwui/TextureCache.h144
-rw-r--r--libs/hwui/VectorDrawable.cpp8
-rw-r--r--libs/hwui/VectorDrawable.h42
-rw-r--r--libs/hwui/Vertex.h40
-rw-r--r--libs/hwui/font/CacheTexture.cpp355
-rw-r--r--libs/hwui/font/CacheTexture.h173
-rw-r--r--libs/hwui/font/CachedGlyphInfo.h56
-rw-r--r--libs/hwui/font/Font.cpp490
-rw-r--r--libs/hwui/font/Font.h161
-rw-r--r--libs/hwui/font/FontCacheHistoryTracker.cpp100
-rw-r--r--libs/hwui/font/FontCacheHistoryTracker.h65
-rw-r--r--libs/hwui/font/FontUtil.h46
-rw-r--r--libs/hwui/hwui/AnimatedImageDrawable.h4
-rw-r--r--libs/hwui/hwui/Bitmap.cpp40
-rw-r--r--libs/hwui/hwui/Bitmap.h4
-rw-r--r--libs/hwui/hwui/Canvas.cpp30
-rw-r--r--libs/hwui/hwui/Canvas.h21
-rw-r--r--libs/hwui/hwui/MinikinSkia.cpp11
-rw-r--r--libs/hwui/hwui/MinikinUtils.cpp17
-rw-r--r--libs/hwui/hwui/MinikinUtils.h5
-rw-r--r--libs/hwui/hwui/Paint.h7
-rw-r--r--libs/hwui/hwui/PaintFilter.h19
-rw-r--r--libs/hwui/hwui/PaintImpl.cpp4
-rw-r--r--libs/hwui/hwui/Typeface.cpp6
-rw-r--r--libs/hwui/pipeline/skia/GLFunctorDrawable.cpp17
-rw-r--r--libs/hwui/pipeline/skia/GLFunctorDrawable.h4
-rw-r--r--libs/hwui/pipeline/skia/LayerDrawable.cpp13
-rw-r--r--libs/hwui/pipeline/skia/RenderNodeDrawable.cpp24
-rw-r--r--libs/hwui/pipeline/skia/RenderNodeDrawable.h8
-rw-r--r--libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp20
-rw-r--r--libs/hwui/pipeline/skia/SkiaDisplayList.h54
-rw-r--r--libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp238
-rw-r--r--libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h6
-rw-r--r--libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp32
-rw-r--r--libs/hwui/pipeline/skia/SkiaOpenGLReadback.h6
-rw-r--r--libs/hwui/pipeline/skia/SkiaPipeline.cpp5
-rw-r--r--libs/hwui/pipeline/skia/SkiaPipeline.h10
-rw-r--r--libs/hwui/pipeline/skia/SkiaProfileRenderer.h2
-rw-r--r--libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp73
-rw-r--r--libs/hwui/pipeline/skia/SkiaRecordingCanvas.h40
-rw-r--r--libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp4
-rw-r--r--libs/hwui/pipeline/skia/SkiaVulkanPipeline.h4
-rw-r--r--libs/hwui/protos/ProtoHelpers.h41
-rw-r--r--libs/hwui/protos/hwui.proto99
-rw-r--r--libs/hwui/renderstate/Blend.cpp140
-rw-r--r--libs/hwui/renderstate/Blend.h63
-rw-r--r--libs/hwui/renderstate/MeshState.cpp179
-rw-r--r--libs/hwui/renderstate/MeshState.h133
-rw-r--r--libs/hwui/renderstate/OffscreenBufferPool.cpp217
-rw-r--r--libs/hwui/renderstate/OffscreenBufferPool.h162
-rw-r--r--libs/hwui/renderstate/RenderState.cpp285
-rw-r--r--libs/hwui/renderstate/RenderState.h22
-rw-r--r--libs/hwui/renderstate/Scissor.cpp103
-rw-r--r--libs/hwui/renderstate/Scissor.h51
-rw-r--r--libs/hwui/renderstate/Stencil.cpp140
-rw-r--r--libs/hwui/renderstate/Stencil.h103
-rw-r--r--libs/hwui/renderthread/CacheManager.cpp5
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp115
-rw-r--r--libs/hwui/renderthread/CanvasContext.h10
-rw-r--r--libs/hwui/renderthread/DrawFrameTask.h1
-rw-r--r--libs/hwui/renderthread/EglManager.cpp63
-rw-r--r--libs/hwui/renderthread/EglManager.h16
-rw-r--r--libs/hwui/renderthread/IRenderPipeline.h11
-rw-r--r--libs/hwui/renderthread/OpenGLPipeline.cpp452
-rw-r--r--libs/hwui/renderthread/OpenGLPipeline.h75
-rw-r--r--libs/hwui/renderthread/RenderProxy.cpp24
-rw-r--r--libs/hwui/renderthread/RenderProxy.h6
-rw-r--r--libs/hwui/renderthread/RenderThread.cpp78
-rw-r--r--libs/hwui/renderthread/RenderThread.h3
-rw-r--r--libs/hwui/renderthread/VulkanManager.cpp427
-rw-r--r--libs/hwui/renderthread/VulkanManager.h31
-rw-r--r--libs/hwui/service/GraphicsStatsService.cpp2
-rw-r--r--libs/hwui/tests/common/TestUtils.cpp56
-rw-r--r--libs/hwui/tests/common/TestUtils.h48
-rw-r--r--libs/hwui/tests/common/scenes/TestSceneBase.h2
-rw-r--r--libs/hwui/tests/macrobench/main.cpp9
-rw-r--r--libs/hwui/tests/microbench/DisplayListCanvasBench.cpp8
-rw-r--r--libs/hwui/tests/microbench/FontBench.cpp50
-rw-r--r--libs/hwui/tests/microbench/FrameBuilderBench.cpp149
-rw-r--r--libs/hwui/tests/microbench/ShadowBench.cpp101
-rw-r--r--libs/hwui/tests/unit/BakedOpDispatcherTests.cpp289
-rw-r--r--libs/hwui/tests/unit/BakedOpRendererTests.cpp106
-rw-r--r--libs/hwui/tests/unit/BakedOpStateTests.cpp266
-rw-r--r--libs/hwui/tests/unit/FontRendererTests.cpp55
-rw-r--r--libs/hwui/tests/unit/FrameBuilderTests.cpp2705
-rw-r--r--libs/hwui/tests/unit/GlopBuilderTests.cpp145
-rw-r--r--libs/hwui/tests/unit/GpuMemoryTrackerTests.cpp2
-rw-r--r--libs/hwui/tests/unit/GradientCacheTests.cpp40
-rw-r--r--libs/hwui/tests/unit/LeakCheckTests.cpp65
-rw-r--r--libs/hwui/tests/unit/MeshStateTests.cpp37
-rw-r--r--libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp244
-rw-r--r--libs/hwui/tests/unit/OpDumperTests.cpp43
-rw-r--r--libs/hwui/tests/unit/RecordingCanvasTests.cpp847
-rw-r--r--libs/hwui/tests/unit/RenderNodeDrawableTests.cpp33
-rw-r--r--libs/hwui/tests/unit/SkiaCanvasTests.cpp36
-rw-r--r--libs/hwui/tests/unit/SkiaPipelineTests.cpp4
-rw-r--r--libs/hwui/tests/unit/TextDropShadowCacheTests.cpp56
-rw-r--r--libs/hwui/tests/unit/TextureCacheTests.cpp39
-rw-r--r--libs/hwui/thread/ThreadBase.h2
-rw-r--r--libs/hwui/utils/PaintUtils.h1
-rw-r--r--libs/hwui/utils/TestWindowContext.cpp6
-rw-r--r--libs/incident/proto/android/section.proto3
-rw-r--r--libs/protoutil/Android.bp31
-rw-r--r--libs/protoutil/include/android/util/ProtoOutputStream.h22
-rw-r--r--libs/protoutil/src/ProtoOutputStream.cpp174
-rw-r--r--libs/protoutil/tests/EncodedBuffer_test.cpp133
-rw-r--r--libs/protoutil/tests/ProtoOutputStream_test.cpp228
-rw-r--r--libs/protoutil/tests/protobuf_test.cpp51
-rw-r--r--libs/protoutil/tests/test.proto42
-rw-r--r--libs/services/src/os/DropBoxManager.cpp2
-rw-r--r--libs/usb/Android.bp22
-rw-r--r--libs/usb/api/current.txt25
-rw-r--r--libs/usb/api/removed.txt0
-rw-r--r--libs/usb/api/system-current.txt0
-rw-r--r--libs/usb/api/system-removed.txt0
-rw-r--r--libs/usb/api/test-current.txt0
-rw-r--r--libs/usb/api/test-removed.txt0
-rw-r--r--libs/usb/tests/AccessoryChat/Android.mk2
-rw-r--r--location/java/android/location/GnssStatus.java5
-rw-r--r--location/java/android/location/Location.java5
-rw-r--r--location/java/android/location/LocationManager.java24
-rw-r--r--location/lib/Android.bp21
-rw-r--r--location/lib/Android.mk66
-rw-r--r--location/lib/api/current.txt47
-rw-r--r--location/lib/api/removed.txt0
-rw-r--r--location/lib/api/system-current.txt0
-rw-r--r--location/lib/api/system-removed.txt0
-rw-r--r--location/lib/api/test-current.txt0
-rw-r--r--location/lib/api/test-removed.txt0
-rw-r--r--lowpan/tests/Android.mk4
-rw-r--r--media/java/android/media/AudioManager.java10
-rw-r--r--media/java/android/media/MediaCodecInfo.java4
-rw-r--r--media/java/android/media/MediaCodecList.java4
-rw-r--r--media/java/android/media/MediaFormat.java2
-rw-r--r--media/java/android/media/MediaPlayer.java2
-rw-r--r--media/java/android/media/MediaPlayer2.java424
-rw-r--r--media/java/android/media/MediaPlayer2Impl.java337
-rw-r--r--media/java/android/media/MediaRouter.java25
-rw-r--r--media/java/android/media/MediaTimestamp.java10
-rw-r--r--media/java/android/media/RingtoneManager.java3
-rw-r--r--media/java/android/media/SyncParams.java8
-rw-r--r--media/java/android/media/TimedMetaData.java2
-rw-r--r--media/java/android/media/midi/MidiDevice.java72
-rw-r--r--media/java/android/media/midi/MidiDeviceInfo.java2
-rw-r--r--media/java/android/media/soundtrigger/SoundTriggerManager.java21
-rw-r--r--media/java/android/media/tv/ITvInputSessionWrapper.java2
-rw-r--r--media/java/android/media/tv/TvContract.java11
-rw-r--r--media/java/android/media/tv/TvInputManager.java4
-rw-r--r--media/jni/Android.bp21
-rw-r--r--media/jni/android_media_ImageReader.cpp6
-rw-r--r--media/jni/android_media_Media2DataSource.cpp16
-rw-r--r--media/jni/android_media_Media2HTTPConnection.cpp18
-rw-r--r--media/jni/android_media_Media2HTTPService.cpp8
-rw-r--r--media/jni/android_media_MediaPlayer2.cpp33
-rw-r--r--media/jni/audioeffect/android_media_AudioEffect.cpp10
-rw-r--r--media/jni/midi/android_media_midi_MidiDevice.cpp50
-rw-r--r--media/lib/signer/Android.bp21
-rw-r--r--media/lib/signer/Android.mk65
-rw-r--r--media/lib/signer/api/current.txt21
-rw-r--r--media/lib/signer/api/removed.txt0
-rw-r--r--media/lib/signer/api/system-current.txt0
-rw-r--r--media/lib/signer/api/system-removed.txt0
-rw-r--r--media/lib/signer/api/test-current.txt0
-rw-r--r--media/lib/signer/api/test-removed.txt0
-rw-r--r--media/lib/tvremote/Android.bp24
-rw-r--r--media/lib/tvremote/Android.mk46
-rw-r--r--media/lib/tvremote/api/current.txt21
-rw-r--r--media/lib/tvremote/api/removed.txt0
-rw-r--r--media/lib/tvremote/api/system-current.txt0
-rw-r--r--media/lib/tvremote/api/system-removed.txt0
-rw-r--r--media/lib/tvremote/api/test-current.txt0
-rw-r--r--media/lib/tvremote/api/test-removed.txt0
-rw-r--r--media/mca/filterfw/Android.bp73
-rw-r--r--media/mca/filterfw/Android.mk48
-rw-r--r--media/mca/filterfw/jni/Android.mk48
-rw-r--r--media/mca/filterfw/native/Android.bp43
-rw-r--r--media/mca/filterfw/native/Android.mk52
-rw-r--r--media/mca/filterfw/native/libfilterfw.mk30
-rw-r--r--media/mca/filterpacks/Android.bp58
-rw-r--r--media/mca/filterpacks/Android.mk57
-rw-r--r--media/native/midi/Android.bp29
-rw-r--r--media/native/midi/include/NOTICE13
-rw-r--r--media/native/midi/include/midi.h255
-rw-r--r--media/native/midi/libamidi.map.txt18
-rw-r--r--media/native/midi/midi.cpp372
-rw-r--r--media/native/midi/midi.h182
-rw-r--r--media/native/midi/midi_internal.h22
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java49
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/Camera2RecordingTest.java7
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ImageReaderTest.java1
-rw-r--r--media/tests/NativeMidiDemo/AndroidManifest.xml20
-rw-r--r--media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/NativeMidi.java354
-rw-r--r--media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/TouchableScrollView.java32
-rw-r--r--media/tests/NativeMidiDemo/jni/messagequeue.cpp138
-rw-r--r--media/tests/NativeMidiDemo/jni/nativemidi-jni.cpp286
-rw-r--r--media/tests/NativeMidiDemo/res/layout/main.xml93
-rw-r--r--media/tests/NativeMidiDemo/res/mipmap-hdpi/ic_launcher.pngbin3418 -> 0 bytes
-rw-r--r--media/tests/NativeMidiDemo/res/mipmap-mdpi/ic_launcher.pngbin2206 -> 0 bytes
-rw-r--r--media/tests/NativeMidiDemo/res/mipmap-xhdpi/ic_launcher.pngbin4842 -> 0 bytes
-rw-r--r--media/tests/NativeMidiDemo/res/mipmap-xxhdpi/ic_launcher.pngbin7718 -> 0 bytes
-rw-r--r--media/tests/NativeMidiDemo/res/values/strings.xml6
-rw-r--r--media/tests/audiotests/Android.bp24
-rw-r--r--media/tests/audiotests/Android.mk25
-rw-r--r--native/android/libandroid.map.txt1
-rw-r--r--native/graphics/jni/Android.bp1
-rw-r--r--native/webview/OWNERS1
-rw-r--r--native/webview/loader/Android.bp32
-rw-r--r--native/webview/loader/Android.mk40
-rw-r--r--native/webview/plat_support/draw_gl_functor.cpp9
-rw-r--r--nfc-extras/Android.bp21
-rw-r--r--nfc-extras/Android.mk33
-rw-r--r--nfc-extras/api/current.txt60
-rw-r--r--nfc-extras/api/removed.txt0
-rw-r--r--nfc-extras/api/system-current.txt0
-rw-r--r--nfc-extras/api/system-removed.txt0
-rw-r--r--nfc-extras/api/test-current.txt0
-rw-r--r--nfc-extras/api/test-removed.txt0
-rw-r--r--obex/Android.bp21
-rw-r--r--obex/Android.mk20
-rw-r--r--obex/CleanSpec.mk (renamed from packages/CtsShim/build/jni/Android.mk)15
-rw-r--r--obex/api/current.txt12
-rw-r--r--obex/api/removed.txt0
-rw-r--r--obex/api/system-current.txt0
-rw-r--r--obex/api/system-removed.txt0
-rw-r--r--obex/api/test-current.txt0
-rw-r--r--obex/api/test-removed.txt0
-rw-r--r--packages/BackupRestoreConfirmation/res/values-pt-rBR/strings.xml2
-rw-r--r--packages/BackupRestoreConfirmation/res/values-pt/strings.xml2
-rw-r--r--packages/CaptivePortalLogin/Android.mk4
-rw-r--r--packages/CaptivePortalLogin/AndroidManifest.xml2
-rw-r--r--packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml4
-rw-r--r--packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java2
-rw-r--r--packages/CarSystemUI/Android.mk86
-rw-r--r--packages/CarSystemUI/AndroidManifest.xml24
-rw-r--r--packages/CarSystemUI/proguard.flags1
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_apps.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_apps_black.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_apps_selected.xml20
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_music.xml34
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_music_black.xml34
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_music_selected.xml20
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_navigation.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_navigation_black.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_navigation_selected.xml21
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_notification.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_notification_black.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_notification_selected.xml21
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_overview.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_overview_black.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_overview_selected.xml20
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_phone.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_phone_black.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_phone_selected.xml20
-rw-r--r--packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml28
-rw-r--r--packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml37
-rw-r--r--packages/CarSystemUI/res/drawable/ic_mic_white.xml9
-rw-r--r--packages/CarSystemUI/res/drawable/nav_button_background.xml26
-rw-r--r--packages/CarSystemUI/res/drawable/notification_material_bg.xml26
-rw-r--r--packages/CarSystemUI/res/drawable/notification_material_bg_dim.xml26
-rw-r--r--packages/CarSystemUI/res/drawable/volume_dialog_background.xml26
-rw-r--r--packages/CarSystemUI/res/layout/car_navigation_bar.xml145
-rw-r--r--packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml44
-rw-r--r--packages/CarSystemUI/res/layout/car_status_bar_header.xml29
-rw-r--r--packages/CarSystemUI/res/layout/car_top_navigation_bar.xml151
-rw-r--r--packages/CarSystemUI/res/layout/car_volume_dialog.xml30
-rw-r--r--packages/CarSystemUI/res/layout/status_bar_wifi_group.xml85
-rw-r--r--packages/CarSystemUI/res/layout/super_status_bar.xml91
-rw-r--r--packages/CarSystemUI/res/layout/system_icons.xml40
-rw-r--r--packages/CarSystemUI/res/values-night/colors.xml24
-rw-r--r--packages/CarSystemUI/res/values/attrs.xml35
-rw-r--r--packages/CarSystemUI/res/values/colors.xml54
-rw-r--r--packages/CarSystemUI/res/values/config.xml31
-rw-r--r--packages/CarSystemUI/res/values/dimens.xml62
-rw-r--r--packages/CarSystemUI/res/values/integers.xml20
-rw-r--r--packages/CarSystemUI/res/values/strings.xml23
-rw-r--r--packages/CarSystemUI/res/values/styles.xml54
-rw-r--r--packages/CarSystemUI/res/xml/car_volume_items.xml55
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java51
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java276
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java338
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureColorStore.java202
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureTextAnimator.java164
-rw-r--r--packages/CtsShim/build/Android.mk12
-rw-r--r--packages/CtsShim/build/jni/Android.bp21
-rw-r--r--packages/DefaultContainerService/Android.mk2
-rw-r--r--packages/DefaultContainerService/jni/Android.bp36
-rw-r--r--packages/EasterEgg/Android.bp33
-rw-r--r--packages/EasterEgg/Android.mk29
-rw-r--r--packages/EasterEgg/AndroidManifest.xml91
-rw-r--r--packages/EasterEgg/res/color-night/toolbar_icon_color.xml (renamed from packages/EasterEgg/res/drawable/leg1.xml)16
-rw-r--r--packages/EasterEgg/res/color/toolbar_icon_color.xml (renamed from packages/EasterEgg/res/values/dimens.xml)9
-rw-r--r--packages/EasterEgg/res/drawable/belly.xml22
-rw-r--r--packages/EasterEgg/res/drawable/body.xml22
-rw-r--r--packages/EasterEgg/res/drawable/cap.xml22
-rw-r--r--packages/EasterEgg/res/drawable/collar.xml22
-rw-r--r--packages/EasterEgg/res/drawable/face_spot.xml22
-rw-r--r--packages/EasterEgg/res/drawable/food_bits.xml33
-rw-r--r--packages/EasterEgg/res/drawable/food_chicken.xml39
-rw-r--r--packages/EasterEgg/res/drawable/food_cookie.xml35
-rw-r--r--packages/EasterEgg/res/drawable/food_dish.xml24
-rw-r--r--packages/EasterEgg/res/drawable/food_donut.xml24
-rw-r--r--packages/EasterEgg/res/drawable/food_sysuituna.xml24
-rw-r--r--packages/EasterEgg/res/drawable/foot1.xml22
-rw-r--r--packages/EasterEgg/res/drawable/foot2.xml22
-rw-r--r--packages/EasterEgg/res/drawable/foot3.xml22
-rw-r--r--packages/EasterEgg/res/drawable/foot4.xml22
-rw-r--r--packages/EasterEgg/res/drawable/head.xml22
-rw-r--r--packages/EasterEgg/res/drawable/ic_clear.xml (renamed from packages/EasterEgg/res/drawable/back.xml)17
-rw-r--r--packages/EasterEgg/res/drawable/ic_dropper.xml39
-rw-r--r--packages/EasterEgg/res/drawable/ic_hourglass.xml27
-rw-r--r--packages/EasterEgg/res/drawable/ic_share.xml24
-rw-r--r--packages/EasterEgg/res/drawable/icon.xml33
-rw-r--r--packages/EasterEgg/res/drawable/icon_bg.xml (renamed from packages/EasterEgg/res/xml/filepaths.xml)9
-rw-r--r--packages/EasterEgg/res/drawable/left_ear.xml22
-rw-r--r--packages/EasterEgg/res/drawable/left_ear_inside.xml22
-rw-r--r--packages/EasterEgg/res/drawable/left_eye.xml22
-rw-r--r--packages/EasterEgg/res/drawable/leg2.xml22
-rw-r--r--packages/EasterEgg/res/drawable/leg2_shadow.xml22
-rw-r--r--packages/EasterEgg/res/drawable/leg3.xml22
-rw-r--r--packages/EasterEgg/res/drawable/leg4.xml22
-rw-r--r--packages/EasterEgg/res/drawable/mouth.xml27
-rw-r--r--packages/EasterEgg/res/drawable/nose.xml22
-rw-r--r--packages/EasterEgg/res/drawable/octo_bg.xml8
-rw-r--r--packages/EasterEgg/res/drawable/p.xml33
-rw-r--r--packages/EasterEgg/res/drawable/right_ear.xml22
-rw-r--r--packages/EasterEgg/res/drawable/right_eye.xml22
-rw-r--r--packages/EasterEgg/res/drawable/stat_icon.xml30
-rw-r--r--packages/EasterEgg/res/drawable/tail.xml26
-rw-r--r--packages/EasterEgg/res/drawable/tail_cap.xml22
-rw-r--r--packages/EasterEgg/res/drawable/tail_shadow.xml22
-rw-r--r--packages/EasterEgg/res/drawable/toolbar_bg.xml19
-rw-r--r--packages/EasterEgg/res/drawable/toolbar_button_bg.xml (renamed from packages/EasterEgg/res/layout/neko_activity.xml)22
-rw-r--r--packages/EasterEgg/res/layout/activity_paint.xml48
-rw-r--r--packages/EasterEgg/res/layout/brushes.xml (renamed from packages/EasterEgg/res/drawable/bowtie.xml)21
-rw-r--r--packages/EasterEgg/res/layout/cat_view.xml82
-rw-r--r--packages/EasterEgg/res/layout/colors.xml (renamed from packages/EasterEgg/res/drawable/right_ear_inside.xml)21
-rw-r--r--packages/EasterEgg/res/layout/edit_text.xml30
-rw-r--r--packages/EasterEgg/res/layout/food_layout.xml31
-rw-r--r--packages/EasterEgg/res/layout/toolbar.xml111
-rw-r--r--packages/EasterEgg/res/values-night/colors.xml21
-rw-r--r--packages/EasterEgg/res/values-night/styles.xml21
-rw-r--r--packages/EasterEgg/res/values/attrs_toolbar_view.xml19
-rw-r--r--packages/EasterEgg/res/values/colors.xml21
-rw-r--r--packages/EasterEgg/res/values/strings.xml39
-rw-r--r--packages/EasterEgg/res/values/styles.xml23
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/Cat.java434
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/Food.java60
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/NekoActivationActivity.java57
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/NekoDialog.java107
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/NekoLand.java338
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/NekoLockedActivity.java45
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/NekoService.java165
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/NekoTile.java114
-rw-r--r--packages/EasterEgg/src/com/android/egg/neko/PrefState.java92
-rw-r--r--packages/EasterEgg/src/com/android/egg/octo/Ocquarium.java89
-rw-r--r--packages/EasterEgg/src/com/android/egg/octo/OctopusDrawable.java436
-rw-r--r--packages/EasterEgg/src/com/android/egg/octo/TaperedPathStroke.java55
-rw-r--r--packages/EasterEgg/src/com/android/egg/paint/BrushPropertyDrawable.kt93
-rw-r--r--packages/EasterEgg/src/com/android/egg/paint/CutoutAvoidingToolbar.kt88
-rw-r--r--packages/EasterEgg/src/com/android/egg/paint/PaintActivity.java351
-rw-r--r--packages/EasterEgg/src/com/android/egg/paint/Painting.kt358
-rw-r--r--packages/EasterEgg/src/com/android/egg/paint/Palette.kt83
-rw-r--r--packages/EasterEgg/src/com/android/egg/paint/SpotFilter.kt124
-rw-r--r--packages/EasterEgg/src/com/android/egg/paint/ToolbarView.kt77
-rw-r--r--packages/ExtServices/AndroidManifest.xml5
-rw-r--r--packages/ExtServices/res/values/strings.xml1
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/Assistant.java30
-rw-r--r--packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java227
-rw-r--r--packages/InputDevices/Android.mk4
-rw-r--r--packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/PrinterHashMap.java33
-rw-r--r--packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/ServiceListener.java5
-rwxr-xr-xpackages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/PrinterHashMap.java34
-rwxr-xr-xpackages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/ServiceResolver.java8
-rw-r--r--packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/MDNSFilteredDiscovery.java55
-rw-r--r--packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/PrinterHashMap.java91
-rw-r--r--packages/PrintSpooler/jni/Android.bp18
-rw-r--r--packages/PrintSpooler/jni/Android.mk21
-rw-r--r--packages/PrintSpooler/res/drawable-hdpi/ic_expand_less.pngbin632 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-hdpi/ic_expand_more.pngbin656 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-hdpi/ic_grayedout_printer.pngbin3418 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-hdpi/ic_restart.pngbin3138 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-hdpi/stat_notify_cancelling.pngbin790 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-mdpi/ic_expand_less.pngbin532 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-mdpi/ic_expand_less_24dp.pngbin217 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-mdpi/ic_expand_more.pngbin536 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-mdpi/ic_expand_more_24dp.pngbin221 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-mdpi/ic_grayedout_printer.pngbin3418 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-mdpi/ic_restart.pngbin3033 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-mdpi/stat_notify_cancelling.pngbin683 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xhdpi/ic_expand_less.pngbin747 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xhdpi/ic_expand_more.pngbin778 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xhdpi/ic_grayedout_printer.pngbin3418 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xhdpi/ic_restart.pngbin3219 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xhdpi/stat_notify_cancelling.pngbin986 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xxhdpi/ic_expand_less.pngbin1060 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xxhdpi/ic_expand_more.pngbin1068 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xxxhdpi/ic_expand_less.pngbin1752 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable-xxxhdpi/ic_expand_more.pngbin1859 -> 0 bytes
-rw-r--r--packages/PrintSpooler/res/drawable/ic_clear.xml26
-rw-r--r--packages/PrintSpooler/res/drawable/ic_expand_less.xml67
-rw-r--r--packages/PrintSpooler/res/drawable/ic_expand_more.xml67
-rw-r--r--packages/PrintSpooler/res/drawable/print_warning.xml25
-rw-r--r--packages/PrintSpooler/res/layout/preview_page.xml2
-rw-r--r--packages/PrintSpooler/res/layout/preview_page_error.xml13
-rw-r--r--packages/PrintSpooler/res/layout/preview_page_loading.xml15
-rw-r--r--packages/PrintSpooler/res/layout/preview_page_selected.xml2
-rw-r--r--packages/PrintSpooler/res/layout/print_activity.xml5
-rw-r--r--packages/PrintSpooler/res/layout/print_activity_controls.xml2
-rw-r--r--packages/PrintSpooler/res/layout/print_error_fragment.xml36
-rw-r--r--packages/PrintSpooler/res/layout/print_progress_fragment.xml41
-rw-r--r--packages/PrintSpooler/res/layout/select_printer_activity.xml45
-rw-r--r--packages/PrintSpooler/res/values-km/strings.xml4
-rw-r--r--packages/PrintSpooler/res/values-sw/strings.xml2
-rw-r--r--packages/PrintSpooler/res/values/colors.xml2
-rw-r--r--packages/PrintSpooler/res/values/themes.xml7
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/model/NotificationController.java6
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java67
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java4
-rw-r--r--packages/SettingsLib/Android.mk16
-rw-r--r--packages/SettingsLib/common.mk16
-rw-r--r--packages/SettingsLib/res/layout/preference_access_point.xml2
-rw-r--r--packages/SettingsLib/res/layout/preference_category_material_settings.xml68
-rw-r--r--packages/SettingsLib/res/layout/preference_category_material_settings_with_divider.xml4
-rw-r--r--packages/SettingsLib/res/layout/preference_dropdown_material_settings.xml35
-rw-r--r--packages/SettingsLib/res/layout/preference_two_target.xml2
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml29
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml16
-rw-r--r--packages/SettingsLib/res/values-bs/arrays.xml50
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml72
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml12
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml14
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-gl/arrays.xml14
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml11
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml10
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/arrays.xml10
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml14
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-pt/arrays.xml10
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml14
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-sw/arrays.xml18
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml18
-rw-r--r--packages/SettingsLib/res/values-ta/arrays.xml40
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml14
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml8
-rw-r--r--packages/SettingsLib/res/values/strings.xml11
-rw-r--r--packages/SettingsLib/res/values/styles_support_preference.xml72
-rw-r--r--packages/SettingsLib/search/Android.mk33
-rw-r--r--packages/SettingsLib/search/common.mk10
-rw-r--r--packages/SettingsLib/search/processor-src/com/android/settingslib/search/IndexableProcessor.java213
-rw-r--r--packages/SettingsLib/search/resources/META-INF/services/javax.annotation.processing.Processor (renamed from libs/usb/Android.mk)14
-rw-r--r--packages/SettingsLib/search/src/com/android/settingslib/search/SearchIndexable.java65
-rw-r--r--packages/SettingsLib/search/src/com/android/settingslib/search/SearchIndexableResources.java (renamed from libs/hwui/tests/unit/DeviceInfoTests.cpp)28
-rw-r--r--packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesArc.java (renamed from packages/SettingsLib/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java)11
-rw-r--r--packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesAuto.java (renamed from packages/SettingsLib/tests/robotests/src/android/bluetooth/BluetoothCodecStatus.java)10
-rw-r--r--packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesBase.java34
-rw-r--r--packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesMobile.java23
-rw-r--r--packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesTv.java23
-rw-r--r--packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesWear.java23
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/CustomDialogPreference.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/CustomDialogPreferenceCompat.java129
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreferenceCompat.java136
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java8
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/TetherUtil.java15
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/Utils.java37
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java18
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java76
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java17
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java26
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java (renamed from packages/SettingsLib/src/com/android/settingslib/bluetooth/Utils.java)24
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java49
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java8
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java3
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java12
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/ConfirmationDialogController.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/Lifecycle.java20
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/LifecycleObserver.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableActivity.java20
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableDialogFragment.java28
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableFragment.java19
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservablePreferenceFragment.java25
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnCreate.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnDestroy.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnPause.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnResume.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStart.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStop.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/SetPreferenceScreen.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java8
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java15
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/development/AbstractLogdSizePreferenceController.java10
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/development/AbstractLogpersistPreferenceController.java10
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/development/DeveloperOptionsPreferenceController.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractBluetoothAddressPreferenceController.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractImsStatusPreferenceController.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractIpAddressPreferenceController.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractSerialNumberPreferenceController.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractUptimePreferenceController.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractWifiMacAddressPreferenceController.java19
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java18
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/drawer/Tile.java11
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java46
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java19
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java3
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java15
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java5
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java12
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManager.java10
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManagerCompat.java265
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java35
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilCompat.java436
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java16
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java134
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSubtypePreference.java14
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/inputmethod/SwitchWithNoTextPreference.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java111
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/net/ChartDataLoaderCompat.java146
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java28
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/net/SummaryForAllUidLoaderCompat.java81
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixin.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixinCompat.java143
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionList.java85
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionLoaderCompat.java54
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java498
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/utils/AsyncLoaderCompat.java111
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixin.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixinCompat.java72
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java7
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java8
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java4
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java2
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wrapper/BluetoothA2dpWrapper.java70
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wrapper/LocationManagerWrapper.java64
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java253
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java29
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodPreferenceTest.java1
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodSubtypePreferenceTest.java6
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java9
-rw-r--r--packages/SettingsLib/tests/robotests/res/xml/suggestion_ordering.xml31
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/CustomEditTextPreferenceComaptTest.java77
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java2
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/TetherUtilTest.java105
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java2
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java8
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/accessibility/AccessibilityUtilsTest.java82
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java11
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java29
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java (renamed from packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/UtilsTest.java)12
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java39
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/AbstractPreferenceControllerTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixinTest.java2
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java68
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DeveloperOptionsPreferenceControllerTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java13
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java6
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogdSizePreferenceControllerTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogpersistPreferenceControllerTest.java8
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/BluetoothAddressPreferenceControllerTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/ImsStatusPreferenceControllerTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/IpAddressPreferenceControllerTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/SerialNumberPreferenceControllerTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/UptimePreferenceControllerTest.java4
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/WifiMacAddressPreferenceControllerTest.java141
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java48
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java136
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java2
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilCompatTest.java271
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java269
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java108
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java101
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinCompatTest.java127
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinTest.java6
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionParserTest.java200
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/FragmentTestUtils.java74
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java100
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java10
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java2
-rw-r--r--packages/SettingsProvider/Android.mk2
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java12
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java47
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java9
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java45
-rw-r--r--packages/SettingsProvider/test/Android.mk8
-rw-r--r--packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java116
-rw-r--r--packages/Shell/Android.mk3
-rw-r--r--packages/Shell/AndroidManifest.xml3
-rw-r--r--packages/Shell/res/values-hy/strings.xml12
-rw-r--r--packages/Shell/src/com/android/shell/BugreportProgressService.java2
-rw-r--r--packages/SimAppDialog/Android.mk2
-rw-r--r--packages/SystemUI/Android.mk28
-rw-r--r--packages/SystemUI/AndroidManifest.xml13
-rw-r--r--packages/SystemUI/OWNERS1
-rw-r--r--packages/SystemUI/proguard.flags4
-rw-r--r--packages/SystemUI/res-keyguard/values-af/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-am/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ar/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-as/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-az/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-be/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-bg/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-bn/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-bs/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ca/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-cs/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-da/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-de/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-el/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rAU/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rGB/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rIN/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-en-rXC/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-es-rUS/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-es/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-et/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-eu/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fa/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fi/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-gl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-gu/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-hi/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-hr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-hu/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-hy/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-in/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-is/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-it/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-iw/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ja/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ka/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-kk/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-km/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-kn/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-ko/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ky/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-lo/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-lt/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-lv/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-mk/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ml/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-mn/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-mr/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-ms/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-my/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-nb/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ne/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-nl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-or/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pa/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-pl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-pt/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ro/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ru/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-si/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sk/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sq/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sv/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-sw/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ta/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-te/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-th/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-tl/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-tr/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-uk/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-ur/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-uz/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-vi/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml5
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-zu/strings.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values/strings.xml15
-rw-r--r--packages/SystemUI/res/color-night/qs_detail_progress_track.xml (renamed from packages/overlays/SysuiDarkThemeOverlay/res/color/qs_detail_progress_track.xml)0
-rw-r--r--packages/SystemUI/res/color/notification_guts_buttons.xml2
-rw-r--r--packages/SystemUI/res/drawable-hdpi/qs_scrubber_track.9.pngbin365 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/qs_scrubber_track.9.pngbin223 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/qs_scrubber_track.9.pngbin386 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxhdpi/qs_scrubber_track.9.pngbin685 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable-xxxhdpi/qs_scrubber_track.9.pngbin747 -> 0 bytes
-rw-r--r--packages/SystemUI/res/drawable/faster_emergency_icon.xml (renamed from packages/EasterEgg/res/drawable/ic_close.xml)14
-rw-r--r--packages/SystemUI/res/layout/contextual.xml1
-rw-r--r--packages/SystemUI/res/layout/global_actions_wrapped.xml18
-rw-r--r--packages/SystemUI/res/layout/menu_ime.xml8
-rw-r--r--packages/SystemUI/res/layout/notification_info.xml19
-rw-r--r--packages/SystemUI/res/layout/notification_snooze.xml2
-rw-r--r--packages/SystemUI/res/layout/qs_customize_panel_content.xml2
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request_buttons.xml6
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml6
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml6
-rw-r--r--packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml1
-rw-r--r--packages/SystemUI/res/layout/status_bar_no_notifications.xml4
-rw-r--r--packages/SystemUI/res/layout/tuner_shortcut_list.xml2
-rw-r--r--packages/SystemUI/res/values-af/strings.xml3
-rw-r--r--packages/SystemUI/res/values-am/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml3
-rw-r--r--packages/SystemUI/res/values-as/strings.xml9
-rw-r--r--packages/SystemUI/res/values-as/strings_car.xml6
-rw-r--r--packages/SystemUI/res/values-az/strings.xml3
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml3
-rw-r--r--packages/SystemUI/res/values-be/strings.xml3
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml3
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml21
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml3
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml3
-rw-r--r--packages/SystemUI/res/values-da/strings.xml3
-rw-r--r--packages/SystemUI/res/values-de/strings.xml3
-rw-r--r--packages/SystemUI/res/values-el/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml3
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml3
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml3
-rw-r--r--packages/SystemUI/res/values-es/strings.xml3
-rw-r--r--packages/SystemUI/res/values-et/strings.xml3
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml7
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml3
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml3
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml5
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml3
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml19
-rw-r--r--packages/SystemUI/res/values-in/strings.xml5
-rw-r--r--packages/SystemUI/res/values-is/strings.xml3
-rw-r--r--packages/SystemUI/res/values-it/strings.xml3
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml3
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-km/strings.xml3
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml3
-rw-r--r--packages/SystemUI/res/values-land/dimens.xml2
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml3
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml3
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml3
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml3
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml3
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml3
-rw-r--r--packages/SystemUI/res/values-my/strings.xml3
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml3
-rw-r--r--packages/SystemUI/res/values-night/colors.xml44
-rw-r--r--packages/SystemUI/res/values-night/dimens.xml21
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-or/strings.xml12
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml3
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml3
-rw-r--r--packages/SystemUI/res/values-si/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml3
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml9
-rw-r--r--packages/SystemUI/res/values-sw600dp/dimens.xml2
-rw-r--r--packages/SystemUI/res/values-sw600dp/styles.xml2
-rw-r--r--packages/SystemUI/res/values-sw900dp-land/dimen.xml (renamed from packages/overlays/SysuiDarkThemeOverlay/res/values/strings.xml)12
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml3
-rw-r--r--packages/SystemUI/res/values-te/strings.xml3
-rw-r--r--packages/SystemUI/res/values-th/strings.xml3
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml3
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml3
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml3
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml3
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml3
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml3
-rw-r--r--packages/SystemUI/res/values-w550dp-land/dimens.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml3
-rw-r--r--packages/SystemUI/res/values/colors.xml9
-rw-r--r--packages/SystemUI/res/values/config.xml9
-rw-r--r--packages/SystemUI/res/values/dimens.xml32
-rw-r--r--packages/SystemUI/res/values/strings.xml7
-rw-r--r--packages/SystemUI/res/values/styles.xml15
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java3
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java7
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java21
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java4
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java2
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java1
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/EmergencyButton.java3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java5
-rwxr-xr-xpackages/SystemUI/src/com/android/keyguard/KeyguardConstants.java2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java5
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java21
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java5
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java8
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java5
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java5
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java9
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java22
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java468
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java45
-rw-r--r--packages/SystemUI/src/com/android/keyguard/SecurityMessageDisplay.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/BatteryMeterView.java40
-rw-r--r--packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java156
-rw-r--r--packages/SystemUI/src/com/android/systemui/ImageWallpaper.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/Interpolators.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/LatencyTester.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/OverviewProxyService.java27
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorations.java101
-rw-r--r--packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeUi.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java69
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java46
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java53
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/phone/PipUtils.java5
-rwxr-xr-x[-rw-r--r--]packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/power/PowerUI.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooter.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFragment.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java75
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java35
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileColorPicker.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/touch/SwipeDetector.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUserService.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/DockState.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java163
-rw-r--r--packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java69
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java38
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java47
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java137
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationBlockingHelperManager.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java49
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java69
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java151
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationUndoLayout.java139
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java37
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java (renamed from packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java)137
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java44
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java47
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java41
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java52
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java88
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java33
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java93
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java66
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadowKeyDrawable.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java235
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java49
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java49
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java45
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java41
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java226
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/BetterListPreference.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/CustomListPreference.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/OtherPrefs.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/SelectablePreference.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerPreferenceFragment.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/Utils.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/leak/LeakReporter.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/MediaRouterWrapper.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java5
-rw-r--r--packages/SystemUI/tests/Android.mk28
-rw-r--r--packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java19
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java15
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java34
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/recents/RecentsTest.java12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java19
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java60
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java97
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java180
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java21
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java23
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java18
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java25
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java101
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java4
-rw-r--r--packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.pngbin943 -> 0 bytes
-rw-r--r--packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.pngbin629 -> 0 bytes
-rw-r--r--packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.pngbin1035 -> 0 bytes
-rw-r--r--packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.pngbin1257 -> 0 bytes
-rw-r--r--packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.pngbin1884 -> 0 bytes
-rw-r--r--packages/VpnDialogs/res/drawable/ic_vpn_dialog.xml30
-rw-r--r--packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml2
-rw-r--r--packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml2
-rw-r--r--packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml2
-rw-r--r--packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml2
-rw-r--r--packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml2
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/Android.mk14
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/AndroidManifest.xml8
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-af/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-am/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ar/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-as/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-az/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-b+sr+Latn/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-be/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-bg/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-bn/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-bs/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ca/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-cs/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-da/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-de/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-el/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-en-rAU/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-en-rCA/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-en-rGB/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-en-rIN/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-en-rXC/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-es-rUS/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-es/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-et/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-eu/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-fa/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-fi/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-fr-rCA/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-fr/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-gl/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-gu/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-hi/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-hr/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-hu/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-hy/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-in/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-is/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-it/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-iw/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ja/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ka/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-kk/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-km/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-kn/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ko/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ky/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-lo/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-lt/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-lv/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-mk/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ml/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-mn/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-mr/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ms/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-my/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-nb/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ne/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-nl/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-or/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-pa/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-pl/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rBR/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rPT/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-pt/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ro/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ru/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-si/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-sk/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-sl/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-sq/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-sr/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-sv/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-sw/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ta/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-te/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-th/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-tl/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-tr/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-uk/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-ur/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-uz/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-vi/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rCN/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rHK/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rTW/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values-zu/strings.xml23
-rw-r--r--packages/overlays/SysuiDarkThemeOverlay/res/values/styles.xml12
-rw-r--r--packages/services/PacProcessor/Android.mk2
-rw-r--r--proto/Android.bp30
-rw-r--r--proto/src/metrics_constants.proto53
-rw-r--r--proto/src/system_messages.proto4
-rw-r--r--proto/src/wifi.proto116
-rw-r--r--sax/tests/saxtests/src/android/sax/ExpatPerformanceTest.java125
-rw-r--r--services/Android.bp1
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java24
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java6
-rw-r--r--services/accessibility/java/com/android/server/accessibility/MagnificationController.java24
-rw-r--r--services/art-profile22144
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerService.java155
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java7
-rw-r--r--services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java10
-rw-r--r--services/autofill/java/com/android/server/autofill/Helper.java5
-rw-r--r--services/autofill/java/com/android/server/autofill/RemoteFillService.java11
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java35
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/FillUi.java5
-rw-r--r--services/backup/OWNERS2
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerConstants.java2
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java78
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java5
-rw-r--r--services/backup/java/com/android/server/backup/Trampoline.java13
-rw-r--r--services/backup/java/com/android/server/backup/TransportManager.java48
-rw-r--r--services/backup/java/com/android/server/backup/internal/BackupRequest.java20
-rw-r--r--services/backup/java/com/android/server/backup/internal/PerformBackupTask.java29
-rw-r--r--services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java9
-rw-r--r--services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedRunnable.java33
-rw-r--r--services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java52
-rw-r--r--services/backup/java/com/android/server/backup/restore/FullRestoreEngineThread.java63
-rw-r--r--services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java488
-rw-r--r--services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java50
-rw-r--r--services/backup/java/com/android/server/backup/utils/AppBackupUtils.java3
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java7
-rw-r--r--services/core/Android.bp3
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java89
-rw-r--r--services/core/java/com/android/server/AppOpsService.java102
-rw-r--r--services/core/java/com/android/server/BatteryService.java9
-rw-r--r--services/core/java/com/android/server/BinderCallsStatsService.java138
-rw-r--r--services/core/java/com/android/server/BluetoothManagerService.java13
-rw-r--r--services/core/java/com/android/server/CommonTimeManagementService.java364
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java354
-rw-r--r--services/core/java/com/android/server/DeviceIdleController.java14
-rw-r--r--services/core/java/com/android/server/DropBoxManagerService.java38
-rw-r--r--services/core/java/com/android/server/InputMethodManagerService.java211
-rw-r--r--services/core/java/com/android/server/IpSecService.java26
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java77
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java5
-rw-r--r--services/core/java/com/android/server/NetworkTimeUpdateService.java311
-rw-r--r--services/core/java/com/android/server/NewNetworkTimeUpdateService.java329
-rw-r--r--services/core/java/com/android/server/OldNetworkTimeUpdateService.java329
-rw-r--r--services/core/java/com/android/server/PinnerService.java458
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java22
-rw-r--r--services/core/java/com/android/server/TelephonyRegistry.java6
-rw-r--r--services/core/java/com/android/server/TextServicesManagerService.java114
-rw-r--r--services/core/java/com/android/server/UiModeManagerService.java25
-rw-r--r--services/core/java/com/android/server/Watchdog.java58
-rw-r--r--services/core/java/com/android/server/accounts/TokenCache.java7
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java91
-rw-r--r--services/core/java/com/android/server/am/ActivityDisplay.java49
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java6393
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerShellCommand.java89
-rw-r--r--services/core/java/com/android/server/am/ActivityMetricsLogger.java38
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java148
-rw-r--r--services/core/java/com/android/server/am/ActivityStack.java226
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java352
-rw-r--r--services/core/java/com/android/server/am/ActivityStartController.java30
-rw-r--r--services/core/java/com/android/server/am/ActivityStartInterceptor.java21
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java90
-rw-r--r--services/core/java/com/android/server/am/ActivityTaskManagerService.java5243
-rw-r--r--services/core/java/com/android/server/am/AppErrorDialog.java2
-rw-r--r--services/core/java/com/android/server/am/AppErrors.java94
-rw-r--r--services/core/java/com/android/server/am/AppNotRespondingDialog.java2
-rw-r--r--services/core/java/com/android/server/am/AppTaskImpl.java15
-rw-r--r--services/core/java/com/android/server/am/AssistDataRequester.java17
-rw-r--r--services/core/java/com/android/server/am/BatteryExternalStatsWorker.java28
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java18
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueue.java10
-rw-r--r--services/core/java/com/android/server/am/BroadcastRecord.java14
-rw-r--r--services/core/java/com/android/server/am/CompatModePackages.java36
-rw-r--r--services/core/java/com/android/server/am/ConnectionRecord.java53
-rw-r--r--services/core/java/com/android/server/am/ContentProviderConnection.java43
-rw-r--r--services/core/java/com/android/server/am/ContentProviderRecord.java83
-rw-r--r--services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java8
-rw-r--r--services/core/java/com/android/server/am/KeyguardController.java20
-rw-r--r--services/core/java/com/android/server/am/LaunchParamsController.java4
-rw-r--r--services/core/java/com/android/server/am/LockTaskController.java4
-rw-r--r--services/core/java/com/android/server/am/NativeCrashListener.java5
-rw-r--r--services/core/java/com/android/server/am/OomAdjProfiler.java185
-rw-r--r--services/core/java/com/android/server/am/PendingIntentRecord.java4
-rw-r--r--services/core/java/com/android/server/am/PendingRemoteAnimationRegistry.java6
-rw-r--r--services/core/java/com/android/server/am/PinnedActivityStack.java2
-rw-r--r--services/core/java/com/android/server/am/ProcessMemInfo.java1
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java305
-rw-r--r--services/core/java/com/android/server/am/ProcessStatsService.java34
-rw-r--r--services/core/java/com/android/server/am/ProviderMap.java3
-rw-r--r--services/core/java/com/android/server/am/RecentTasks.java60
-rw-r--r--services/core/java/com/android/server/am/RecentsAnimation.java22
-rw-r--r--services/core/java/com/android/server/am/SafeActivityOptions.java6
-rw-r--r--services/core/java/com/android/server/am/ServiceRecord.java17
-rw-r--r--services/core/java/com/android/server/am/TEST_MAPPING70
-rw-r--r--services/core/java/com/android/server/am/TaskChangeNotificationController.java17
-rw-r--r--services/core/java/com/android/server/am/TaskPersister.java12
-rw-r--r--services/core/java/com/android/server/am/TaskRecord.java75
-rw-r--r--services/core/java/com/android/server/am/UnsupportedCompileSdkDialog.java6
-rw-r--r--services/core/java/com/android/server/am/UnsupportedDisplaySizeDialog.java6
-rw-r--r--services/core/java/com/android/server/am/UserController.java54
-rw-r--r--services/core/java/com/android/server/am/VrController.java32
-rw-r--r--services/core/java/com/android/server/am/WindowProcessController.java531
-rw-r--r--services/core/java/com/android/server/am/WindowProcessListener.java50
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java61
-rw-r--r--services/core/java/com/android/server/biometrics/common/AuthenticationClient.java (renamed from services/core/java/com/android/server/fingerprint/AuthenticationClient.java)123
-rw-r--r--services/core/java/com/android/server/biometrics/common/BiometricService.java1099
-rw-r--r--services/core/java/com/android/server/biometrics/common/BiometricUserState.java213
-rw-r--r--services/core/java/com/android/server/biometrics/common/BiometricUtils.java34
-rw-r--r--services/core/java/com/android/server/biometrics/common/ClientMonitor.java (renamed from services/core/java/com/android/server/fingerprint/ClientMonitor.java)133
-rw-r--r--services/core/java/com/android/server/biometrics/common/EnrollClient.java133
-rw-r--r--services/core/java/com/android/server/biometrics/common/EnumerateClient.java112
-rw-r--r--services/core/java/com/android/server/biometrics/common/Metrics.java34
-rw-r--r--services/core/java/com/android/server/biometrics/common/RemovalClient.java124
-rw-r--r--services/core/java/com/android/server/biometrics/face/FaceMetrics.java67
-rw-r--r--services/core/java/com/android/server/biometrics/face/FaceService.java785
-rw-r--r--services/core/java/com/android/server/biometrics/face/FaceUserState.java156
-rw-r--r--services/core/java/com/android/server/biometrics/face/FaceUtils.java94
-rw-r--r--services/core/java/com/android/server/biometrics/fingerprint/FingerprintMetrics.java68
-rw-r--r--services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java1026
-rw-r--r--services/core/java/com/android/server/biometrics/fingerprint/FingerprintUserState.java163
-rw-r--r--services/core/java/com/android/server/biometrics/fingerprint/FingerprintUtils.java (renamed from services/core/java/com/android/server/fingerprint/FingerprintUtils.java)41
-rw-r--r--services/core/java/com/android/server/connectivity/PacManager.java26
-rw-r--r--services/core/java/com/android/server/connectivity/ProxyTracker.java256
-rw-r--r--services/core/java/com/android/server/connectivity/Tethering.java35
-rw-r--r--services/core/java/com/android/server/connectivity/Vpn.java16
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/SimChangeListener.java79
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java2
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java14
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java5
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java161
-rw-r--r--services/core/java/com/android/server/content/SyncJobService.java171
-rw-r--r--services/core/java/com/android/server/content/SyncManager.java229
-rw-r--r--services/core/java/com/android/server/content/SyncStorageEngine.java157
-rw-r--r--services/core/java/com/android/server/display/AutomaticBrightnessController.java1
-rw-r--r--services/core/java/com/android/server/display/BrightnessTracker.java3
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java2
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java5
-rw-r--r--services/core/java/com/android/server/display/DisplayTransformManager.java3
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java6
-rw-r--r--services/core/java/com/android/server/fingerprint/EnrollClient.java146
-rw-r--r--services/core/java/com/android/server/fingerprint/EnumerateClient.java118
-rw-r--r--services/core/java/com/android/server/fingerprint/FingerprintService.java1589
-rw-r--r--services/core/java/com/android/server/fingerprint/FingerprintsUserState.java272
-rw-r--r--services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java93
-rw-r--r--services/core/java/com/android/server/fingerprint/InternalRemovalClient.java33
-rw-r--r--services/core/java/com/android/server/fingerprint/RemovalClient.java129
-rw-r--r--services/core/java/com/android/server/hdmi/Constants.java24
-rw-r--r--services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java6
-rwxr-xr-xservices/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java1
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecController.java141
-rwxr-xr-xservices/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java61
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java253
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecMessage.java23
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java82
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java2
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java55
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiLogger.java5
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiUtils.java2
-rw-r--r--services/core/java/com/android/server/hdmi/PowerStatusMonitorAction.java4
-rw-r--r--services/core/java/com/android/server/hdmi/RequestArcAction.java2
-rw-r--r--services/core/java/com/android/server/hdmi/SystemAudioAction.java2
-rw-r--r--services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java2
-rw-r--r--services/core/java/com/android/server/hdmi/SystemAudioActionFromTv.java2
-rw-r--r--services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java2
-rw-r--r--services/core/java/com/android/server/input/InputForwarder.java5
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java14
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java49
-rw-r--r--services/core/java/com/android/server/location/GnssPositionMode.java46
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java18
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java64
-rw-r--r--services/core/java/com/android/server/media/MediaRouterService.java4
-rw-r--r--services/core/java/com/android/server/media/MediaSessionRecord.java2
-rw-r--r--services/core/java/com/android/server/net/NetworkStatsService.java12
-rw-r--r--services/core/java/com/android/server/notification/GroupHelper.java7
-rw-r--r--services/core/java/com/android/server/notification/ManagedServices.java60
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java366
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecord.java42
-rw-r--r--services/core/java/com/android/server/notification/PreferencesHelper.java1373
-rw-r--r--services/core/java/com/android/server/notification/RankingHelper.java1305
-rw-r--r--services/core/java/com/android/server/notification/ZenModeHelper.java8
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java2
-rw-r--r--services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java10
-rw-r--r--services/core/java/com/android/server/pm/DumpState.java1
-rw-r--r--services/core/java/com/android/server/pm/Installer.java30
-rw-r--r--services/core/java/com/android/server/pm/InstantAppResolver.java7
-rw-r--r--services/core/java/com/android/server/pm/LauncherAppsService.java10
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java19
-rwxr-xr-xservices/core/java/com/android/server/pm/PackageManagerService.java1247
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java3
-rw-r--r--services/core/java/com/android/server/pm/PreferredComponent.java27
-rw-r--r--services/core/java/com/android/server/pm/Settings.java38
-rw-r--r--services/core/java/com/android/server/pm/ShortcutService.java24
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java16
-rw-r--r--services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java19
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java16
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java126
-rw-r--r--services/core/java/com/android/server/policy/BarController.java2
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java116
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java13
-rw-r--r--services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java3
-rw-r--r--services/core/java/com/android/server/power/Notifier.java11
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java6
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java17
-rw-r--r--services/core/java/com/android/server/search/SearchManagerService.java4
-rw-r--r--services/core/java/com/android/server/slice/PinnedSliceState.java4
-rw-r--r--services/core/java/com/android/server/slice/SliceManagerService.java27
-rw-r--r--services/core/java/com/android/server/stats/StatsCompanionService.java109
-rw-r--r--services/core/java/com/android/server/timedetector/SimpleTimeDetectorStrategy.java232
-rw-r--r--services/core/java/com/android/server/timedetector/TimeDetectorService.java134
-rw-r--r--services/core/java/com/android/server/timedetector/TimeDetectorStrategy.java93
-rw-r--r--services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java125
-rw-r--r--services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java67
-rw-r--r--services/core/java/com/android/server/trust/TrustManagerService.java29
-rw-r--r--services/core/java/com/android/server/vr/Vr2dDisplay.java15
-rw-r--r--services/core/java/com/android/server/vr/VrManagerService.java25
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerService.java148
-rw-r--r--services/core/java/com/android/server/webkit/WebViewUpdater.java2
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java277
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java20
-rw-r--r--services/core/java/com/android/server/wm/BoundsAnimationController.java24
-rw-r--r--services/core/java/com/android/server/wm/BoundsAnimationTarget.java8
-rw-r--r--services/core/java/com/android/server/wm/ConfigurationContainer.java14
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java102
-rw-r--r--services/core/java/com/android/server/wm/DockedStackDividerController.java2
-rw-r--r--services/core/java/com/android/server/wm/DragAndDropPermissionsHandler.java5
-rw-r--r--services/core/java/com/android/server/wm/DragInputEventReceiver.java2
-rw-r--r--services/core/java/com/android/server/wm/InputMonitor.java5
-rw-r--r--services/core/java/com/android/server/wm/PointerEventDispatcher.java4
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimationController.java7
-rw-r--r--services/core/java/com/android/server/wm/SurfaceAnimationRunner.java13
-rw-r--r--services/core/java/com/android/server/wm/TEST_MAPPING42
-rw-r--r--services/core/java/com/android/server/wm/Task.java8
-rw-r--r--services/core/java/com/android/server/wm/TaskPositioner.java26
-rw-r--r--services/core/java/com/android/server/wm/TaskPositioningController.java5
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotPersister.java5
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotSurface.java3
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java96
-rw-r--r--services/core/java/com/android/server/wm/TaskTapPointerEventListener.java10
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java27
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerInternal.java23
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java84
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java42
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java41
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfacePlacer.java20
-rw-r--r--services/core/java/com/android/server/wm/utils/CoordinateTransforms.java93
-rw-r--r--services/core/java/com/android/server/wm/utils/InsetUtils.java29
-rw-r--r--services/core/jni/Android.bp2
-rw-r--r--services/core/jni/com_android_server_AlarmManagerService.cpp35
-rw-r--r--services/core/jni/com_android_server_VibratorService.cpp2
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp8
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java5
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java136
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java4
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java30
-rw-r--r--services/java/com/android/server/SystemServer.java87
-rw-r--r--services/net/java/android/net/ip/IpClient.java41
-rw-r--r--services/net/java/android/net/netlink/NetlinkSocket.java7
-rw-r--r--services/print/java/com/android/server/print/UserState.java2
-rw-r--r--services/robotests/src/android/app/backup/BackupUtilsTest.java195
-rw-r--r--services/robotests/src/android/app/backup/ForwardingBackupAgent.java113
-rw-r--r--services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java350
-rw-r--r--services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java746
-rw-r--r--services/robotests/src/com/android/server/backup/TransportManagerTest.java260
-rw-r--r--services/robotests/src/com/android/server/backup/Utils.java40
-rw-r--r--services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java32
-rw-r--r--services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java8
-rw-r--r--services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java129
-rw-r--r--services/robotests/src/com/android/server/backup/testing/TestUtils.java14
-rw-r--r--services/robotests/src/com/android/server/backup/testing/TransportTestUtils.java23
-rw-r--r--services/robotests/src/com/android/server/location/GnssPositionModeTest.java61
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java41
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowBackupDataOutput.java1
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowBinder.java44
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java38
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowPerformBackupTask.java89
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java80
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java76
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java31
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java50
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java19
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java46
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java99
-rw-r--r--services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java13
-rw-r--r--services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java200
-rw-r--r--services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java124
-rw-r--r--services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java27
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java34
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java272
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java326
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java221
-rw-r--r--services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/CrossProfileAppsServiceImplTest.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java40
-rw-r--r--services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java10
-rw-r--r--services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java89
-rw-r--r--services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java513
-rw-r--r--services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java170
-rw-r--r--services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java46
-rw-r--r--services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java45
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java57
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java28
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java113
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java27
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java32
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/utils/CoordinateTransformsTest.java133
-rw-r--r--services/tests/uiservicestests/Android.mk2
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java198
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java43
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java14
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java25
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java32
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java180
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java19
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java1742
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java1602
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java16
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java9
-rw-r--r--services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java20
-rw-r--r--services/usage/java/com/android/server/usage/IntervalStats.java10
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsDatabase.java4
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java11
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsXmlV1.java13
-rw-r--r--services/usage/java/com/android/server/usage/UserUsageStatsService.java38
-rwxr-xr-xservices/usb/java/com/android/server/usb/UsbDeviceManager.java7
-rw-r--r--services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java122
-rw-r--r--services/usb/java/com/android/server/usb/UsbSettingsManager.java7
-rw-r--r--services/usb/java/com/android/server/usb/UsbUserSettingsManager.java77
-rw-r--r--services/usb/java/com/android/server/usb/descriptors/UsbDescriptor.java5
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java190
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java12
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java16
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java13
-rw-r--r--telecomm/java/android/telecom/Connection.java59
-rw-r--r--telecomm/java/android/telecom/ConnectionService.java16
-rw-r--r--telecomm/java/android/telecom/InCallService.java74
-rw-r--r--telecomm/java/android/telecom/Log.java28
-rw-r--r--telecomm/java/android/telecom/PhoneAccount.java12
-rw-r--r--telecomm/java/android/telecom/TelecomManager.java2
-rw-r--r--telephony/java/android/provider/Telephony.java74
-rw-r--r--telephony/java/android/telephony/AccessNetworkConstants.java3
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java67
-rw-r--r--telephony/java/android/telephony/CellIdentity.java7
-rw-r--r--telephony/java/android/telephony/CellIdentityTdscdma.java56
-rw-r--r--telephony/java/android/telephony/CellIdentityWcdma.java6
-rw-r--r--telephony/java/android/telephony/CellInfo.java4
-rw-r--r--telephony/java/android/telephony/CellInfoCdma.java2
-rw-r--r--telephony/java/android/telephony/CellInfoGsm.java2
-rw-r--r--telephony/java/android/telephony/CellInfoLte.java2
-rw-r--r--telephony/java/android/telephony/CellInfoTdscdma.java151
-rw-r--r--telephony/java/android/telephony/CellInfoWcdma.java6
-rw-r--r--telephony/java/android/telephony/CellSignalStrength.java10
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthCdma.java5
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthGsm.java5
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthLte.java22
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthTdscdma.java228
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthWcdma.java34
-rw-r--r--telephony/java/android/telephony/LocationAccessPolicy.java19
-rw-r--r--telephony/java/android/telephony/NetworkRegistrationState.java121
-rw-r--r--telephony/java/android/telephony/NetworkService.java6
-rw-r--r--telephony/java/android/telephony/NetworkServiceCallback.java2
-rw-r--r--telephony/java/android/telephony/PhoneStateListener.java15
-rw-r--r--telephony/java/android/telephony/PreciseDisconnectCause.java2
-rw-r--r--telephony/java/android/telephony/ServiceState.java68
-rw-r--r--telephony/java/android/telephony/SignalStrength.java7
-rw-r--r--telephony/java/android/telephony/SubscriptionInfo.java56
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java14
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java235
-rw-r--r--telephony/java/android/telephony/data/ApnSetting.java592
-rw-r--r--telephony/java/android/telephony/data/DataCallResponse.java2
-rw-r--r--telephony/java/android/telephony/data/DataProfile.java2
-rw-r--r--telephony/java/android/telephony/data/DataService.java8
-rw-r--r--telephony/java/android/telephony/data/DataServiceCallback.java3
-rw-r--r--telephony/java/android/telephony/ims/ImsReasonInfo.java24
-rw-r--r--telephony/java/android/telephony/ims/aidl/IImsMmTelListener.aidl2
-rw-r--r--telephony/java/android/telephony/ims/feature/ImsFeature.java10
-rw-r--r--telephony/java/android/telephony/ims/feature/MmTelFeature.java70
-rw-r--r--telephony/java/com/android/internal/telephony/CarrierAppUtils.java57
-rw-r--r--telephony/java/com/android/internal/telephony/DcParamObject.java58
-rw-r--r--telephony/java/com/android/internal/telephony/DctConstants.java22
-rw-r--r--telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl2
-rw-r--r--telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl10
-rw-r--r--telephony/java/com/android/internal/telephony/ISmsBaseImpl.java158
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl33
-rw-r--r--telephony/java/com/android/internal/telephony/RILConstants.java54
-rw-r--r--telephony/java/com/android/internal/telephony/uicc/IccUtils.java2
-rw-r--r--test-base/Android.bp38
-rw-r--r--test-base/Android.mk63
-rw-r--r--test-base/src/android/test/suitebuilder/annotation/Smoke.java2
-rw-r--r--test-mock/Android.bp81
-rw-r--r--test-mock/Android.mk144
l---------test-mock/jarjar-rules.txt1
-rw-r--r--test-runner/Android.bp51
-rw-r--r--test-runner/Android.mk71
-rw-r--r--tests/ActivityTests/Android.mk6
-rw-r--r--tests/ActivityTests/res/values/themes.xml2
-rw-r--r--tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java8
-rw-r--r--tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp41
-rw-r--r--tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.mk45
-rw-r--r--tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameManager.java2
-rw-r--r--tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java2
-rw-r--r--tests/JankBench/Android.mk12
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/app/BenchmarkDashboardFragment.java2
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java4
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/app/RunLocalBenchmarksActivity.java8
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/app/UiResultsFragment.java4
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/registry/BenchmarkCategory.java2
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/ui/BitmapUploadActivity.java2
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/ui/EditTextInputActivity.java4
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/ui/FullScreenOverdrawActivity.java2
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListActivityBase.java6
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListViewScrollActivity.java2
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/ui/ShadowGridActivity.java6
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/FrameTimingStats.java2
-rw-r--r--tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/Interaction.java2
-rw-r--r--tests/JankBench/app/src/main/res/layout/activity_bitmap_upload.xml12
-rw-r--r--tests/JankBench/app/src/main/res/layout/activity_home.xml6
-rw-r--r--tests/JankBench/app/src/main/res/layout/card_row.xml8
-rw-r--r--tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml10
-rw-r--r--tests/LotsOfApps/AndroidManifest.xml200
-rw-r--r--tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java6
-rw-r--r--tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java62
-rw-r--r--tests/UiBench/Android.mk12
-rw-r--r--tests/UiBench/res/layout/activity_bitmap_upload.xml12
-rw-r--r--tests/UiBench/res/layout/activity_navigation_drawer.xml4
-rw-r--r--tests/UiBench/res/layout/app_bar_navigation_drawer.xml6
-rw-r--r--tests/UiBench/res/layout/card_row.xml8
-rw-r--r--tests/UiBench/res/layout/recycler_view.xml2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/ActivityTransition.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java14
-rw-r--r--tests/UiBench/src/com/android/test/uibench/DialogListActivity.java4
-rw-r--r--tests/UiBench/src/com/android/test/uibench/EditTextTypeActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/FadingEdgeListActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/FullscreenOverdrawActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/InvalidateActivity.java4
-rw-r--r--tests/UiBench/src/com/android/test/uibench/InvalidateTreeActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/MainActivity.java6
-rw-r--r--tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java10
-rw-r--r--tests/UiBench/src/com/android/test/uibench/NotificationShadeActivity.java4
-rw-r--r--tests/UiBench/src/com/android/test/uibench/ResizeHWLayerActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/SaveLayerInterleaveActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/ScrollableWebViewActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/ShadowGridActivity.java6
-rw-r--r--tests/UiBench/src/com/android/test/uibench/SlowBindRecyclerViewActivity.java4
-rw-r--r--tests/UiBench/src/com/android/test/uibench/SlowNestedRecyclerViewActivity.java4
-rw-r--r--tests/UiBench/src/com/android/test/uibench/TrivialAnimationActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/TrivialRecyclerViewActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/leanback/BitmapLoader.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/leanback/BrowseActivity.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/leanback/BrowseFragment.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/leanback/CardPresenter.java6
-rw-r--r--tests/UiBench/src/com/android/test/uibench/leanback/TestHelper.java14
-rw-r--r--tests/UiBench/src/com/android/test/uibench/listview/CompatListActivity.java6
-rw-r--r--tests/UiBench/src/com/android/test/uibench/listview/FadingEdgeListFragment.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/recyclerview/RvArrayAdapter.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/recyclerview/RvBoxAdapter.java2
-rw-r--r--tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java12
-rw-r--r--tests/UsageStatsPerfTests/Android.mk (renamed from media/tests/NativeMidiDemo/Android.mk)21
-rw-r--r--tests/UsageStatsPerfTests/AndroidManifest.xml29
-rw-r--r--tests/UsageStatsPerfTests/AndroidTest.xml28
-rw-r--r--tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java183
-rw-r--r--tests/UsageStatsTest/Android.mk3
-rw-r--r--tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java2
-rw-r--r--tests/net/Android.mk7
-rw-r--r--tests/net/java/android/net/NetworkCapabilitiesTest.java3
-rw-r--r--tests/net/java/android/net/apf/ApfTest.java106
-rw-r--r--tests/net/java/android/net/ip/IpClientTest.java13
-rw-r--r--tests/net/java/com/android/server/ConnectivityServiceTest.java106
-rw-r--r--tests/net/java/com/android/server/IpSecServiceParameterizedTest.java2
-rw-r--r--tests/net/java/com/android/server/connectivity/TetheringTest.java45
-rw-r--r--tests/net/java/com/android/server/connectivity/tethering/SimChangeListenerTest.java132
-rw-r--r--tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java147
-rw-r--r--tests/net/java/com/android/server/net/NetworkStatsServiceTest.java6
-rw-r--r--tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java13
-rw-r--r--tests/testables/src/android/testing/TestableContentResolver.java30
-rw-r--r--tests/testables/tests/src/android/testing/TestableContentResolverTest.java61
-rw-r--r--tests/touchlag/Android.bp17
-rw-r--r--tests/touchlag/Android.mk16
-rw-r--r--tools/aapt/ResourceTable.cpp11
-rw-r--r--tools/aapt/StringPool.cpp11
-rw-r--r--tools/aapt/XMLNode.cpp7
-rw-r--r--tools/aapt2/Android.bp3
-rw-r--r--tools/aapt2/AppInfo.h5
-rw-r--r--tools/aapt2/Flags.h71
-rw-r--r--tools/aapt2/Main.cpp180
-rw-r--r--tools/aapt2/ResourceParser.cpp62
-rw-r--r--tools/aapt2/ResourceParser.h4
-rw-r--r--tools/aapt2/ResourceParser_test.cpp54
-rw-r--r--tools/aapt2/ResourceUtils.cpp15
-rw-r--r--tools/aapt2/ResourceUtils.h6
-rw-r--r--tools/aapt2/ResourceUtils_test.cpp23
-rw-r--r--tools/aapt2/StringPool.cpp2
-rw-r--r--tools/aapt2/StringPool_test.cpp19
-rw-r--r--tools/aapt2/cmd/Command.cpp (renamed from tools/aapt2/Flags.cpp)123
-rw-r--r--tools/aapt2/cmd/Command.h90
-rw-r--r--tools/aapt2/cmd/Compile.cpp100
-rw-r--r--tools/aapt2/cmd/Compile.h58
-rw-r--r--tools/aapt2/cmd/Compile_test.cpp5
-rw-r--r--tools/aapt2/cmd/Convert.cpp54
-rw-r--r--tools/aapt2/cmd/Convert.h54
-rw-r--r--tools/aapt2/cmd/Diff.cpp22
-rw-r--r--tools/aapt2/cmd/Diff.h35
-rw-r--r--tools/aapt2/cmd/Dump.cpp42
-rw-r--r--tools/aapt2/cmd/Dump.h54
-rw-r--r--tools/aapt2/cmd/Link.cpp367
-rw-r--r--tools/aapt2/cmd/Link.h282
-rw-r--r--tools/aapt2/cmd/Optimize.cpp227
-rw-r--r--tools/aapt2/cmd/Optimize.h124
-rw-r--r--tools/aapt2/cmd/Util.cpp40
-rw-r--r--tools/aapt2/cmd/Util.h12
-rw-r--r--tools/aapt2/cmd/Util_test.cpp48
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/Android.mk (renamed from native/webview/Android.mk)7
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/Android.mk29
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/AndroidManifest.xml (renamed from nfc-extras/com.android.nfc_extras.xml)7
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/res/values/values.xml27
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/src/com/example/android/aapt2/autonamespace/staticlib/one/StaticLibOne.java18
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/Android.mk29
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/AndroidManifest.xml (renamed from media/lib/signer/com.android.mediadrm.signer.xml)7
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/res/layout/layout_two.xml (renamed from location/lib/com.android.location.provider.xml)12
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/res/values/values.xml (renamed from media/lib/tvremote/com.android.media.tv.remoteprovider.xml)9
-rw-r--r--tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/src/com/example/android/aapt2/autonamespace/staticlib/two/StaticLibTwo.java25
-rw-r--r--tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk1
-rw-r--r--tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk1
-rw-r--r--tools/aapt2/java/JavaClassGenerator.cpp5
-rw-r--r--tools/aapt2/java/JavaClassGenerator_test.cpp18
-rw-r--r--tools/aapt2/java/ProguardRules.cpp46
-rw-r--r--tools/aapt2/java/ProguardRules.h27
-rw-r--r--tools/aapt2/java/ProguardRules_test.cpp127
-rw-r--r--tools/aapt2/jni/aapt2_jni.cpp11
-rw-r--r--tools/aapt2/link/ManifestFixer.cpp6
-rw-r--r--tools/aapt2/link/ManifestFixer.h9
-rw-r--r--tools/aapt2/link/ManifestFixer_test.cpp130
-rw-r--r--tools/aapt2/link/NoDefaultResourceRemover.cpp50
-rw-r--r--tools/aapt2/link/NoDefaultResourceRemover_test.cpp60
-rw-r--r--tools/aapt2/link/ReferenceLinker.cpp26
-rw-r--r--tools/aapt2/link/ReferenceLinker.h10
-rw-r--r--tools/aapt2/link/ReferenceLinker_test.cpp71
-rw-r--r--tools/aapt2/link/TableMerger.cpp14
-rw-r--r--tools/aapt2/link/TableMerger.h2
-rw-r--r--tools/aapt2/link/TableMerger_test.cpp31
-rw-r--r--tools/aapt2/link/XmlReferenceLinker.cpp4
-rw-r--r--tools/aapt2/link/XmlReferenceLinker_test.cpp43
-rw-r--r--tools/aapt2/optimize/MultiApkGenerator.cpp35
-rw-r--r--tools/aapt2/optimize/ResourceFilter.cpp43
-rw-r--r--tools/aapt2/optimize/ResourceFilter.h42
-rw-r--r--tools/aapt2/optimize/ResourceFilter_test.cpp74
-rw-r--r--tools/aapt2/process/IResourceTableConsumer.h1
-rw-r--r--tools/aapt2/process/SymbolTable.cpp29
-rw-r--r--tools/aapt2/process/SymbolTable.h16
-rw-r--r--tools/aapt2/process/SymbolTable_test.cpp35
-rw-r--r--tools/aapt2/test/Context.h19
-rw-r--r--tools/aapt2/util/Util.cpp47
-rw-r--r--tools/aapt2/util/Util.h3
-rw-r--r--tools/aapt2/xml/XmlDom.cpp9
-rw-r--r--tools/aapt2/xml/XmlDom.h2
-rw-r--r--tools/aapt2/xml/XmlPullParser.cpp17
-rw-r--r--tools/aapt2/xml/XmlPullParser.h10
-rw-r--r--tools/apilint/apilint.py107
-rwxr-xr-xtools/apilint/apilint_stats.sh7
-rw-r--r--tools/bit/util.cpp2
-rw-r--r--tools/incident_report/main.cpp1
-rw-r--r--tools/incident_section_gen/main.cpp17
-rw-r--r--tools/stats_log_api_gen/main.cpp92
-rw-r--r--tools/stringslint/stringslint.py99
-rw-r--r--vr/Android.bp41
-rw-r--r--vr/Android.mk39
-rw-r--r--wifi/OWNERS3
-rw-r--r--wifi/java/android/net/wifi/IWifiManager.aidl2
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java15
-rw-r--r--wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java2
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pDevice.java7
-rw-r--r--wifi/tests/Android.mk4
-rw-r--r--wifi/tests/assets/pps/PerProviderSubscription.xml2
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceTest.java42
2693 files changed, 102956 insertions, 78658 deletions
diff --git a/Android.bp b/Android.bp
index f1580c31fd46..4f13c6664627 100755
--- a/Android.bp
+++ b/Android.bp
@@ -27,6 +27,7 @@
java_library {
name: "framework",
+ installable: true,
srcs: [
// From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
@@ -58,6 +59,7 @@ java_library {
"core/java/android/app/IActivityController.aidl",
"core/java/android/app/IActivityManager.aidl",
"core/java/android/app/IActivityPendingResult.aidl",
+ "core/java/android/app/IActivityTaskManager.aidl",
"core/java/android/app/IAlarmCompleteListener.aidl",
"core/java/android/app/IAlarmListener.aidl",
"core/java/android/app/IAlarmManager.aidl",
@@ -100,8 +102,10 @@ java_library {
"core/java/android/app/backup/ISelectBackupTransportCallback.aidl",
"core/java/android/app/slice/ISliceManager.aidl",
"core/java/android/app/slice/ISliceListener.aidl",
+ "core/java/android/app/timedetector/ITimeDetectorService.aidl",
"core/java/android/app/timezone/ICallback.aidl",
"core/java/android/app/timezone/IRulesManager.aidl",
+ "core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl",
"core/java/android/app/usage/ICacheQuotaService.aidl",
"core/java/android/app/usage/IStorageStatsManager.aidl",
"core/java/android/app/usage/IUsageStatsManager.aidl",
@@ -146,12 +150,14 @@ java_library {
"core/java/android/hardware/IConsumerIrService.aidl",
"core/java/android/hardware/ISerialManager.aidl",
"core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl",
+ "core/java/android/hardware/biometrics/IBiometricServiceLockoutResetCallback.aidl",
"core/java/android/hardware/display/IDisplayManager.aidl",
"core/java/android/hardware/display/IDisplayManagerCallback.aidl",
"core/java/android/hardware/display/IVirtualDisplayCallback.aidl",
"core/java/android/hardware/fingerprint/IFingerprintClientActiveCallback.aidl",
+ "core/java/android/hardware/face/IFaceService.aidl",
+ "core/java/android/hardware/face/IFaceServiceReceiver.aidl",
"core/java/android/hardware/fingerprint/IFingerprintService.aidl",
- "core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl",
"core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl",
"core/java/android/hardware/hdmi/IHdmiControlCallback.aidl",
"core/java/android/hardware/hdmi/IHdmiControlService.aidl",
@@ -215,7 +221,6 @@ java_library {
"core/java/android/se/omapi/ISecureElementChannel.aidl",
"core/java/android/se/omapi/ISecureElementReader.aidl",
"core/java/android/se/omapi/ISecureElementSession.aidl",
- "core/java/android/os/IBatteryPropertiesListener.aidl",
"core/java/android/os/IBatteryPropertiesRegistrar.aidl",
"core/java/android/os/ICancellationSignal.aidl",
"core/java/android/os/IDeviceIdentifiersPolicyService.aidl",
@@ -705,6 +710,7 @@ java_library {
// specified on the build command line.
java_library {
name: "framework-oahl-backward-compatibility",
+ installable: true,
srcs: [
"core/java/android/content/pm/OrgApacheHttpLegacyUpdater.java",
],
@@ -760,6 +766,7 @@ gensrcs {
// ============================================================
java_library {
name: "ext",
+ installable: true,
no_framework_libs: true,
static_libs: [
"libphonenumber-platform",
@@ -770,6 +777,24 @@ java_library {
dxflags: ["--core-library"],
}
+// ==== java proto host library ==============================
+java_library_host {
+ name: "platformprotos",
+ srcs: [
+ "cmds/am/proto/instrumentation_data.proto",
+ "core/proto/**/*.proto",
+ "libs/incident/proto/**/*.proto",
+ "cmds/statsd/src/**/*.proto",
+ ],
+ proto: {
+ include_dirs: ["external/protobuf/src"],
+ type: "full",
+ },
+ errorprone: {
+ javacflags: ["-Xep:MissingOverride:OFF"], // b/72714520
+ },
+}
+
// ==== c++ proto device library ==============================
cc_library {
name: "libplatformprotos",
@@ -857,6 +882,8 @@ optional_subdirs = [
"core/tests/utiltests/jni",
]
+// TODO(b/77285514): remove this once the last few hidl interfaces have been
+// updated to use hwbinder.stubs.
java_library {
name: "hwbinder",
no_framework_libs: true,
@@ -906,3 +933,392 @@ python_binary_host {
"fontTools",
],
}
+
+// TODO: Don't rely on this list once droiddoc can take a list of packages to document
+frameworks_base_subdirs = [
+ "core/java",
+ "graphics/java",
+ "location/java",
+ "media/java",
+ "media/mca/effect/java",
+ "media/mca/filterfw/java",
+ "media/mca/filterpacks/java",
+ "drm/java",
+ "opengl/java",
+ "sax/java",
+ "telecomm/java",
+ "telephony/java",
+ "wifi/java",
+ "lowpan/java",
+ "keystore/java",
+ "rs/java",
+]
+
+packages_to_document = [
+ "android",
+ "javax/microedition/khronos",
+ "org/apache/http/conn",
+ "org/apache/http/params",
+]
+
+// The since flag (-since N.xml API_LEVEL) is used to add API Level information
+// to the reference documentation. Must be in order of oldest to newest.
+//
+// Conscrypt (com.android.org.conscrypt) is an implementation detail and should
+// not be referenced in the documentation.
+framework_docs_args = "-android -manifest $(location core/res/AndroidManifest.xml) " +
+ "-hidePackage com.android.internal " +
+ "-hidePackage com.android.internal.util " +
+ "-hidePackage com.android.okhttp " +
+ "-hidePackage com.android.org.conscrypt " +
+ "-hidePackage com.android.server " +
+ "-since $(location 1/public/api/android.xml) 1 " +
+ "-since $(location 2/public/api/android.xml) 2 " +
+ "-since $(location 3/public/api/android.xml) 3 " +
+ "-since $(location 4/public/api/android.xml) 4 " +
+ "-since $(location 5/public/api/android.xml) 5 " +
+ "-since $(location 6/public/api/android.xml) 6 " +
+ "-since $(location 7/public/api/android.xml) 7 " +
+ "-since $(location 8/public/api/android.xml) 8 " +
+ "-since $(location 9/public/api/android.xml) 9 " +
+ "-since $(location 10/public/api/android.xml) 10 " +
+ "-since $(location 11/public/api/android.xml) 11 " +
+ "-since $(location 12/public/api/android.xml) 12 " +
+ "-since $(location 13/public/api/android.xml) 13 " +
+ "-since $(location 14/public/api/android.txt) 14 " +
+ "-since $(location 15/public/api/android.txt) 15 " +
+ "-since $(location 16/public/api/android.txt) 16 " +
+ "-since $(location 17/public/api/android.txt) 17 " +
+ "-since $(location 18/public/api/android.txt) 18 " +
+ "-since $(location 19/public/api/android.txt) 19 " +
+ "-since $(location 20/public/api/android.txt) 20 " +
+ "-since $(location 21/public/api/android.txt) 21 " +
+ "-since $(location 22/public/api/android.txt) 22 " +
+ "-since $(location 23/public/api/android.txt) 23 " +
+ "-since $(location 24/public/api/android.txt) 24 " +
+ "-since $(location 25/public/api/android.txt) 25 " +
+ "-since $(location 26/public/api/android.txt) 26 " +
+ "-since $(location 27/public/api/android.txt) 27 " +
+ "-since $(location 28/public/api/android.txt) 28 " +
+ "-werror -lerror -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 " +
+ "-overview $(location core/java/overview.html) " +
+ // Federate Support Library references against local API file.
+ "-federate SupportLib https://developer.android.com " +
+ "-federationapi SupportLib $(location current/support-api.txt) "
+
+doc_defaults {
+ name: "framework-docs-default",
+ srcs: [
+ ":opt-telephony-srcs",
+ ":opt-net-voip-srcs",
+ ":openjdk_javadoc_files",
+ ":non_openjdk_javadoc_files",
+ ":android_icu4j_src_files_for_docs",
+ ":gen-ojluni-jaif-annotated-srcs",
+ ],
+ exclude_srcs: [
+ ":annotated_ojluni_files",
+ ],
+ srcs_lib: "framework",
+ srcs_lib_whitelist_dirs: frameworks_base_subdirs,
+ srcs_lib_whitelist_pkgs: packages_to_document,
+ libs: [
+ "core-oj",
+ "core-libart",
+ "conscrypt",
+ "bouncycastle",
+ "okhttp",
+ "ext",
+ "framework",
+ "voip-common",
+ "android.test.mock",
+ ],
+ local_sourcepaths: frameworks_base_subdirs,
+ html_dirs: [
+ "docs/html",
+ ],
+ knowntags: [
+ "docs/knowntags.txt",
+ ":known-oj-tags",
+ ],
+ custom_template: "droiddoc-templates-sdk",
+ hdf: [
+ "dac true",
+ "sdk.codename O",
+ "sdk.preview.version 1",
+ "sdk.version 7.0",
+ "sdk.rel.id 1",
+ "sdk.preview 0",
+ ],
+ resourcesdir: "docs/html/reference/images",
+ resourcesoutdir: "reference/android/images",
+ installable: false,
+}
+
+droiddoc {
+ name: "api-stubs-docs",
+ defaults: ["framework-docs-default"],
+ arg_files: [
+ "core/res/AndroidManifest.xml",
+ ":api-version-xml",
+ "core/java/overview.html",
+ ":current-support-api",
+ "api/current.txt",
+ ],
+ api_filename: "public_api.txt",
+ removed_api_filename: "removed.txt",
+ args: framework_docs_args + " -referenceonly -nodocs",
+ check_api: {
+ last_released: {
+ api_file: ":last-released-public-api",
+ removed_api_file: "api/removed.txt",
+ args: "-hide 2 -hide 3 -hide 4 -hide 5 -hide 6 -hide 24 -hide 25 -hide 26 -hide 27 " +
+ "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
+ "-error 16 -error 17 -error 18 -error 31",
+ },
+ current: {
+ api_file: "api/current.txt",
+ removed_api_file: "api/removed.txt",
+ args: "-error 2 -error 3 -error 4 -error 5 -error 6 " +
+ "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
+ "-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 " +
+ "-error 25 -error 26 -error 27",
+ },
+ },
+}
+
+droiddoc {
+ name: "system-api-stubs-docs",
+ defaults: ["framework-docs-default"],
+ arg_files: [
+ "core/res/AndroidManifest.xml",
+ ":api-version-xml",
+ "core/java/overview.html",
+ ":current-support-api",
+ "api/current.txt",
+ ],
+ api_tag_name: "SYSTEM",
+ api_filename: "system-api.txt",
+ removed_api_filename: "system-removed.txt",
+ exact_api_filename: "system-exact.txt",
+ args: framework_docs_args + " -referenceonly -showAnnotation android.annotation.SystemApi -nodocs",
+ check_api: {
+ last_released: {
+ api_file: ":last-released-system-api",
+ removed_api_file: "api/system-removed.txt",
+ args: "-hide 2 -hide 3 -hide 4 -hide 5 -hide 6 -hide 24 -hide 25 -hide 26 -hide 27 " +
+ "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
+ "-error 16 -error 17 -error 18 -error 31",
+ },
+ current: {
+ api_file: "api/system-current.txt",
+ removed_api_file: "api/system-removed.txt",
+ args: "-error 2 -error 3 -error 4 -error 5 -error 6 " +
+ "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
+ "-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 " +
+ "-error 25 -error 26 -error 27",
+ },
+ },
+}
+
+droiddoc {
+ name: "test-api-stubs-docs",
+ defaults: ["framework-docs-default"],
+ arg_files: [
+ "core/res/AndroidManifest.xml",
+ ":api-version-xml",
+ "core/java/overview.html",
+ ":current-support-api",
+ "api/current.txt",
+ ],
+ api_tag_name: "TEST",
+ api_filename: "test-api.txt",
+ removed_api_filename: "test-removed.txt",
+ exact_api_filename: "test-exact.txt",
+ args: framework_docs_args + " -referenceonly -showAnnotation android.annotation.TestApi -nodocs",
+ check_api: {
+ current: {
+ api_file: "api/test-current.txt",
+ removed_api_file: "api/test-removed.txt",
+ args: "-error 2 -error 3 -error 4 -error 5 -error 6 " +
+ "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
+ "-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 " +
+ "-error 25 -error 26 -error 27",
+ },
+ },
+}
+
+droiddoc {
+ name: "hwbinder-stubs-docs",
+ srcs: [
+ "core/java/android/os/HidlSupport.java",
+ "core/java/android/annotation/IntDef.java",
+ "core/java/android/annotation/NonNull.java",
+ "core/java/android/annotation/SystemApi.java",
+ "core/java/android/os/HwBinder.java",
+ "core/java/android/os/HwBlob.java",
+ "core/java/android/os/HwParcel.java",
+ "core/java/android/os/IHwBinder.java",
+ "core/java/android/os/IHwInterface.java",
+ "core/java/android/os/DeadObjectException.java",
+ "core/java/android/os/DeadSystemException.java",
+ "core/java/android/os/RemoteException.java",
+ "core/java/android/util/AndroidException.java",
+ ],
+ custom_template: "droiddoc-templates-sdk",
+ installable: false,
+ no_framework_libs: true,
+ args: "-showAnnotation android.annotation.SystemApi -nodocs -stubsourceonly",
+}
+
+java_library_static {
+ name: "hwbinder.stubs",
+ sdk_version: "core_current",
+ srcs: [
+ ":hwbinder-stubs-docs",
+ ],
+}
+
+droiddoc {
+ name: "hiddenapi-lists",
+ defaults: ["framework-docs-default"],
+ arg_files: [
+ "core/res/AndroidManifest.xml",
+ ":api-version-xml",
+ "core/java/overview.html",
+ ":current-support-api",
+ ],
+ dex_api_filename: "public-dex.txt",
+ private_dex_api_filename: "private-dex.txt",
+ removed_dex_api_filename: "removed-dex.txt",
+ args: framework_docs_args +
+ " -referenceonly" +
+ " -nodocs" +
+ " -showUnannotated" +
+ " -showAnnotation android.annotation.SystemApi" +
+ " -showAnnotation android.annotation.TestApi",
+}
+
+droiddoc {
+ name: "hiddenapi-mappings",
+ defaults: ["framework-docs-default"],
+ arg_files: [
+ "core/res/AndroidManifest.xml",
+ ":api-version-xml",
+ "core/java/overview.html",
+ ":current-support-api",
+ ],
+ dex_mapping_filename: "dex-mapping.txt",
+ args: framework_docs_args +
+ " -referenceonly" +
+ " -nodocs" +
+ " -showUnannotated" +
+ " -showAnnotation android.annotation.SystemApi" +
+ " -showAnnotation 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/HttpResponseCache.java",
+ "core/java/android/net/http/SslCertificate.java",
+ "core/java/android/net/http/SslError.java",
+ "core/java/com/android/internal/util/HexDump.java",
+ ],
+}
+
+metalava_framework_docs_args = "--manifest $(location core/res/AndroidManifest.xml) " +
+ "--hide-package com.android.okhttp " +
+ "--hide-package com.android.org.conscrypt --hide-package com.android.server " +
+ "--hide RequiresPermission " +
+ "--hide MissingPermission --hide BroadcastBehavior " +
+ "--hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol " +
+ "--hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo"
+
+doc_defaults {
+ name: "metalava-framework-docs-default",
+ srcs: [
+ ":opt-telephony-srcs",
+ ":opt-net-voip-srcs",
+ ":openjdk_javadoc_files",
+ ":non_openjdk_javadoc_files",
+ ":android_icu4j_src_files_for_docs",
+ ":gen-ojluni-jaif-annotated-srcs",
+ ],
+ exclude_srcs: [
+ ":annotated_ojluni_files",
+ ],
+ srcs_lib: "framework",
+ srcs_lib_whitelist_dirs: frameworks_base_subdirs,
+ srcs_lib_whitelist_pkgs: packages_to_document,
+ libs: [
+ "core-oj",
+ "core-libart",
+ "conscrypt",
+ "bouncycastle",
+ "okhttp",
+ "ext",
+ "framework",
+ "voip-common",
+ "android.test.mock",
+ ],
+ local_sourcepaths: frameworks_base_subdirs,
+ installable: false,
+ metalava_enabled: true,
+ metalava_annotations_enabled: true,
+ metalava_previous_api: ":public-api-for-metalava-annotations",
+ metalava_merge_annotations_dir: "tools/metalava/manual",
+}
+
+droiddoc {
+ name: "metalava-api-stubs-docs",
+ defaults: ["metalava-framework-docs-default"],
+ api_tag_name: "METALAVA_PUBLIC",
+ api_filename: "public_api.txt",
+ private_api_filename: "private.txt",
+ removed_api_filename: "removed.txt",
+ arg_files: [
+ "core/res/AndroidManifest.xml",
+ ],
+ args: metalava_framework_docs_args,
+}
+
+droiddoc {
+ name: "metalava-system-api-stubs-docs",
+ defaults: ["metalava-framework-docs-default"],
+ api_tag_name: "METALAVA_SYSTEM",
+ api_filename: "system-api.txt",
+ private_api_filename: "system-private.txt",
+ private_dex_api_filename: "system-private-dex.txt",
+ removed_api_filename: "system-removed.txt",
+ arg_files: [
+ "core/res/AndroidManifest.xml",
+ ],
+ args: metalava_framework_docs_args + " --show-annotation android.annotation.SystemApi",
+}
+
+droiddoc {
+ name: "metalava-test-api-stubs-docs",
+ defaults: ["metalava-framework-docs-default"],
+ api_tag_name: "METALAVA_TEST",
+ api_filename: "test-api.txt",
+ removed_api_filename: "test-removed.txt",
+ arg_files: [
+ "core/res/AndroidManifest.xml",
+ ],
+ args: metalava_framework_docs_args + " --show-annotation android.annotation.TestApi",
+}
diff --git a/Android.mk b/Android.mk
index 25d8fc61c2ae..1d5f1e248cab 100755
--- a/Android.mk
+++ b/Android.mk
@@ -168,37 +168,25 @@ framework_docs_LOCAL_DROIDDOC_OPTIONS := \
-hidePackage com.android.internal.util \
-hidePackage com.android.okhttp \
-hidePackage com.android.org.conscrypt \
- -hidePackage com.android.server \
- -since $(SRC_API_DIR)/1.xml 1 \
- -since $(SRC_API_DIR)/2.xml 2 \
- -since $(SRC_API_DIR)/3.xml 3 \
- -since $(SRC_API_DIR)/4.xml 4 \
- -since $(SRC_API_DIR)/5.xml 5 \
- -since $(SRC_API_DIR)/6.xml 6 \
- -since $(SRC_API_DIR)/7.xml 7 \
- -since $(SRC_API_DIR)/8.xml 8 \
- -since $(SRC_API_DIR)/9.xml 9 \
- -since $(SRC_API_DIR)/10.xml 10 \
- -since $(SRC_API_DIR)/11.xml 11 \
- -since $(SRC_API_DIR)/12.xml 12 \
- -since $(SRC_API_DIR)/13.xml 13 \
- -since $(SRC_API_DIR)/14.txt 14 \
- -since $(SRC_API_DIR)/15.txt 15 \
- -since $(SRC_API_DIR)/16.txt 16 \
- -since $(SRC_API_DIR)/17.txt 17 \
- -since $(SRC_API_DIR)/18.txt 18 \
- -since $(SRC_API_DIR)/19.txt 19 \
- -since $(SRC_API_DIR)/20.txt 20 \
- -since $(SRC_API_DIR)/21.txt 21 \
- -since $(SRC_API_DIR)/22.txt 22 \
- -since $(SRC_API_DIR)/23.txt 23 \
- -since $(SRC_API_DIR)/24.txt 24 \
- -since $(SRC_API_DIR)/25.txt 25 \
- -since $(SRC_API_DIR)/26.txt 26 \
- -since $(SRC_API_DIR)/27.txt 27 \
- -since $(SRC_API_DIR)/28.txt 28 \
+ -hidePackage com.android.server
+
+# Convert an sdk level to a "since" argument.
+since-arg = -since $(wildcard $(HISTORICAL_SDK_VERSIONS_ROOT)/$(1)/public/api/android.*) $(1)
+
+finalized_sdks := $(patsubst $(HISTORICAL_SDK_VERSIONS_ROOT)/%/public/api/android.xml,%,\
+ $(wildcard $(HISTORICAL_SDK_VERSIONS_ROOT)/*/public/api/android.xml))
+finalized_sdks += $(patsubst $(HISTORICAL_SDK_VERSIONS_ROOT)/%/public/api/android.txt,%,\
+ $(wildcard $(HISTORICAL_SDK_VERSIONS_ROOT)/*/public/api/android.txt))
+finalized_sdks := $(call numerically_sort,$(finalized_sdks))
+
+framework_docs_LOCAL_DROIDDOC_OPTIONS += $(foreach sdk,$(finalized_sdks),$(call since-arg,$(sdk)))
+ifneq ($(PLATFORM_VERSION_CODENAME),REL)
+ framework_docs_LOCAL_DROIDDOC_OPTIONS += \
+ -since ./frameworks/base/api/current.txt $(PLATFORM_VERSION_CODENAME)
+endif
+framework_docs_LOCAL_DROIDDOC_OPTIONS += \
-werror -lerror -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \
- -overview $(LOCAL_PATH)/core/java/overview.html \
+ -overview $(LOCAL_PATH)/core/java/overview.html
framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR:= \
$(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)
@@ -257,14 +245,17 @@ framework_docs_LOCAL_DROIDDOC_OPTIONS += \
-federate AndroidX https://developer.android.com \
-federationapi AndroidX prebuilts/sdk/current/androidx-api.txt
-framework_metalava_docs_LOCAL_DROIDDOC_OPTIONS := \
- --manifest ./frameworks/base/core/res/AndroidManifest.xml \
- --hide-package com.android.okhttp \
- --hide-package com.android.org.conscrypt --hide-package com.android.server \
- --hide RequiresPermission \
- --hide MissingPermission --hide BroadcastBehavior \
- --hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol \
- --hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo
+# Get the highest numbered api txt for the given api level.
+# $(1): the api level (e.g. public, system)
+define highest_sdk_txt
+$(HISTORICAL_SDK_VERSIONS_ROOT)/$(lastword $(call numerically_sort, \
+ $(patsubst \
+ $(HISTORICAL_SDK_VERSIONS_ROOT)/%,\
+ %,\
+ $(wildcard $(HISTORICAL_SDK_VERSIONS_ROOT)/*/$(1)/api/android.txt)\
+ ) \
+))
+endef
# ==== Public API diff ===========================
include $(CLEAR_VARS)
@@ -281,13 +272,8 @@ LOCAL_ADDITIONAL_DEPENDENCIES := \
LOCAL_MODULE := offline-sdk-referenceonly
-last_released_sdk_version := $(lastword $(call numerically_sort, \
- $(filter-out current, \
- $(patsubst $(SRC_API_DIR)/%.txt,%, $(wildcard $(SRC_API_DIR)/*.txt)) \
- )\
- ))
-
-LOCAL_APIDIFF_OLDAPI := $(LOCAL_PATH)/../../$(SRC_API_DIR)/$(last_released_sdk_version)
+# Basename, because apidiff adds .txt internally.
+LOCAL_APIDIFF_OLDAPI := $(basename $(call highest_sdk_txt,public))
LOCAL_APIDIFF_NEWAPI := $(LOCAL_PATH)/../../$(basename $(INTERNAL_PLATFORM_API_FILE))
include $(BUILD_APIDIFF)
@@ -311,13 +297,8 @@ LOCAL_ADDITIONAL_DEPENDENCIES := \
LOCAL_MODULE := offline-system-sdk-referenceonly
-last_released_sdk_version := $(lastword $(call numerically_sort, \
- $(filter-out current, \
- $(patsubst $(SRC_SYSTEM_API_DIR)/%.txt,%, $(wildcard $(SRC_SYSTEM_API_DIR)/*.txt)) \
- )\
- ))
-
-LOCAL_APIDIFF_OLDAPI := $(LOCAL_PATH)/../../$(SRC_SYSTEM_API_DIR)/$(last_released_sdk_version)
+# Basename, because apidiff adds .txt internally.
+LOCAL_APIDIFF_OLDAPI := $(basename $(call highest_sdk_txt,system))
LOCAL_APIDIFF_NEWAPI := $(LOCAL_PATH)/../../$(basename $(INTERNAL_PLATFORM_SYSTEM_API_FILE))
include $(BUILD_APIDIFF)
@@ -326,264 +307,10 @@ include $(BUILD_APIDIFF)
out_zip := $(OUT_DOCS)/$(LOCAL_MODULE)-docs.zip
$(out_zip): $(full_target)
-# ==== the api stubs and current.xml ===========================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:=$(framework_docs_LOCAL_API_CHECK_SRC_FILES)
-LOCAL_GENERATED_SOURCES:=$(framework_docs_LOCAL_GENERATED_SOURCES)
-LOCAL_SRCJARS:=$(framework_docs_LOCAL_SRCJARS)
-LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES)
-LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
-LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
-LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
-LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
-
-LOCAL_MODULE := api-stubs
-
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_stubs_current_intermediates/src
-
-LOCAL_DROIDDOC_OPTIONS:=\
- $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \
- -referenceonly \
- -api $(INTERNAL_PLATFORM_API_FILE) \
- -removedApi $(INTERNAL_PLATFORM_REMOVED_API_FILE) \
- -nodocs
-
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
-
-LOCAL_UNINSTALLABLE_MODULE := true
-
-include $(BUILD_DROIDDOC)
-
-$(full_target): .KATI_IMPLICIT_OUTPUTS := $(INTERNAL_PLATFORM_API_FILE) \
- $(INTERNAL_PLATFORM_REMOVED_API_FILE)
$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_API_FILE))
-
-# ==== the metalava api stubs and current.xml ===========================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:=$(framework_docs_LOCAL_API_CHECK_SRC_FILES)
-LOCAL_GENERATED_SOURCES:=$(framework_docs_LOCAL_GENERATED_SOURCES)
-LOCAL_SRCJARS:=$(framework_docs_LOCAL_SRCJARS)
-LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES)
-LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
-LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
-LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
-
-LOCAL_MODULE := metalava-api-stubs
-LOCAL_DROIDDOC_USE_METALAVA := true
-LOCAL_DROIDDOC_METALAVA_PREVIOUS_API := prebuilts/sdk/api/27.txt
-LOCAL_DROIDDOC_METALAVA_ANNOTATIONS_ENABLED := true
-LOCAL_DROIDDOC_METALAVA_MERGE_ANNOTATIONS_DIR := tools/metalava/manual
-
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/metalava_android_stubs_current_intermediates/src
-
-INTERNAL_PLATFORM_METALAVA_PUBLIC_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/metalava_public_api.txt
-INTERNAL_PLATFORM_METALAVA_PUBLIC_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/metalava_removed.txt
-
-LOCAL_DROIDDOC_OPTIONS:=\
- $(framework_metalava_docs_LOCAL_DROIDDOC_OPTIONS) \
- --api $(INTERNAL_PLATFORM_METALAVA_PUBLIC_API_FILE) \
- --removed-api $(INTERNAL_PLATFORM_METALAVA_PUBLIC_REMOVED_API_FILE) \
- -nodocs
-
-LOCAL_UNINSTALLABLE_MODULE := true
-
-include $(BUILD_DROIDDOC)
-
-$(full_target): .KATI_IMPLICIT_OUTPUTS := $(INTERNAL_PLATFORM_METALAVA_PUBLIC_API_FILE) \
- $(INTERNAL_PLATFORM_METALAVA_PUBLIC_REMOVED_API_FILE)
-$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_METALAVA_PUBLIC_API_FILE))
-
-# ==== the system api stubs ===================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:=$(framework_docs_LOCAL_API_CHECK_SRC_FILES)
-LOCAL_GENERATED_SOURCES:=$(framework_docs_LOCAL_GENERATED_SOURCES)
-LOCAL_SRCJARS:=$(framework_docs_LOCAL_SRCJARS)
-LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES)
-LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
-LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
-LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
-LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
-
-LOCAL_MODULE := system-api-stubs
-
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_system_stubs_current_intermediates/src
-
-LOCAL_DROIDDOC_OPTIONS:=\
- $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \
- -referenceonly \
- -showAnnotation android.annotation.SystemApi \
- -api $(INTERNAL_PLATFORM_SYSTEM_API_FILE) \
- -removedApi $(INTERNAL_PLATFORM_SYSTEM_REMOVED_API_FILE) \
- -exactApi $(INTERNAL_PLATFORM_SYSTEM_EXACT_API_FILE) \
- -nodocs
-
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
-
-LOCAL_UNINSTALLABLE_MODULE := true
-
-include $(BUILD_DROIDDOC)
-
-$(full_target): .KATI_IMPLICIT_OUTPUTS := $(INTERNAL_PLATFORM_SYSTEM_API_FILE) \
- $(INTERNAL_PLATFORM_SYSTEM_REMOVED_API_FILE) \
- $(INTERNAL_PLATFORM_SYSTEM_EXACT_API_FILE)
$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_SYSTEM_API_FILE))
-
-# ==== the metalava system api stubs ===================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:=$(framework_docs_LOCAL_API_CHECK_SRC_FILES)
-LOCAL_GENERATED_SOURCES:=$(framework_docs_LOCAL_GENERATED_SOURCES)
-LOCAL_SRCJARS:=$(framework_docs_LOCAL_SRCJARS)
-LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES)
-LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
-LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
-LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
-
-LOCAL_MODULE := metalava-system-api-stubs
-LOCAL_DROIDDOC_USE_METALAVA := true
-LOCAL_DROIDDOC_METALAVA_PREVIOUS_API := prebuilts/sdk/api/27.txt
-LOCAL_DROIDDOC_METALAVA_ANNOTATIONS_ENABLED := true
-LOCAL_DROIDDOC_METALAVA_MERGE_ANNOTATIONS_DIR := tools/metalava/manual
-
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/metalava_android_system_stubs_current_intermediates/src
-
-INTERNAL_PLATFORM_METALAVA_SYSTEM_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/metalava-system-api.txt
-INTERNAL_PLATFORM_METALAVA_SYSTEM_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/metalava-system-removed.txt
-
-LOCAL_DROIDDOC_OPTIONS:=\
- $(framework_metalava_docs_LOCAL_DROIDDOC_OPTIONS) \
- --show-annotation android.annotation.SystemApi \
- --api $(INTERNAL_PLATFORM_METALAVA_SYSTEM_API_FILE) \
- --removed-api $(INTERNAL_PLATFORM_METALAVA_SYSTEM_REMOVED_API_FILE) \
- -nodocs
-
-LOCAL_UNINSTALLABLE_MODULE := true
-
-include $(BUILD_DROIDDOC)
-
-$(full_target): .KATI_IMPLICIT_OUTPUTS := $(INTERNAL_PLATFORM_METALAVA_SYSTEM_API_FILE) \
- $(INTERNAL_PLATFORM_METALAVA_SYSTEM_REMOVED_API_FILE) \
-$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_METALAVA_SYSTEM_API_FILE))
-
-# ==== the test api stubs ===================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:=$(framework_docs_LOCAL_API_CHECK_SRC_FILES)
-LOCAL_GENERATED_SOURCES:=$(framework_docs_LOCAL_GENERATED_SOURCES)
-LOCAL_SRCJARS:=$(framework_docs_LOCAL_SRCJARS)
-LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES)
-LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
-LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
-LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
-LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
-
-LOCAL_MODULE := test-api-stubs
-
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_test_stubs_current_intermediates/src
-
-LOCAL_DROIDDOC_OPTIONS:=\
- $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \
- -referenceonly \
- -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_test_stubs_current_intermediates/src \
- -showAnnotation android.annotation.TestApi \
- -api $(INTERNAL_PLATFORM_TEST_API_FILE) \
- -removedApi $(INTERNAL_PLATFORM_TEST_REMOVED_API_FILE) \
- -exactApi $(INTERNAL_PLATFORM_TEST_EXACT_API_FILE) \
- -nodocs
-
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
-
-LOCAL_UNINSTALLABLE_MODULE := true
-
-include $(BUILD_DROIDDOC)
-
-$(full_target): .KATI_IMPLICIT_OUTPUTS := $(INTERNAL_PLATFORM_TEST_API_FILE) \
- $(INTERNAL_PLATFORM_TEST_REMOVED_API_FILE) \
- $(INTERNAL_PLATFORM_TEST_EXACT_API_FILE)
$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_TEST_API_FILE))
-# ==== the metalava test api stubs ===================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:=$(framework_docs_LOCAL_API_CHECK_SRC_FILES)
-LOCAL_GENERATED_SOURCES:=$(framework_docs_LOCAL_GENERATED_SOURCES)
-LOCAL_SRCJARS:=$(framework_docs_LOCAL_SRCJARS)
-LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES)
-LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
-LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
-LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
-
-LOCAL_MODULE := metalava-test-api-stubs
-LOCAL_DROIDDOC_USE_METALAVA := true
-LOCAL_DROIDDOC_METALAVA_PREVIOUS_API := prebuilts/sdk/api/27.txt
-LOCAL_DROIDDOC_METALAVA_ANNOTATIONS_ENABLED := true
-LOCAL_DROIDDOC_METALAVA_MERGE_ANNOTATIONS_DIR := tools/metalava/manual
-
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/metalava_android_test_stubs_current_intermediates/src
-
-INTERNAL_PLATFORM_METALAVA_TEST_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/metalava-test-api.txt
-INTERNAL_PLATFORM_METALAVA_TEST_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/metalava-test-removed.txt
-
-LOCAL_DROIDDOC_OPTIONS:=\
- $(framework_metalava_docs_LOCAL_DROIDDOC_OPTIONS) \
- --show-annotation android.annotation.TestApi \
- --api $(INTERNAL_PLATFORM_METALAVA_TEST_API_FILE) \
- --removed-api $(INTERNAL_PLATFORM_METALAVA_TEST_REMOVED_API_FILE) \
- -nodocs
-
-LOCAL_UNINSTALLABLE_MODULE := true
-
-include $(BUILD_DROIDDOC)
-
-$(full_target): .KATI_IMPLICIT_OUTPUTS := $(INTERNAL_PLATFORM_METALAVA_TEST_API_FILE) \
- $(INTERNAL_PLATFORM_METALAVA_TEST_REMOVED_API_FILE) \
-$(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_METALAVA_TEST_API_FILE))
-
-# ==== the complete hidden api list ===================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:=$(framework_docs_LOCAL_API_CHECK_SRC_FILES)
-LOCAL_GENERATED_SOURCES:=$(framework_docs_LOCAL_GENERATED_SOURCES)
-LOCAL_SRCJARS:=$(framework_docs_LOCAL_SRCJARS)
-LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_API_CHECK_JAVA_LIBRARIES)
-LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS)
-LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH)
-LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR)
-LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_API_CHECK_ADDITIONAL_JAVA_DIR)
-LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES)
-
-LOCAL_MODULE := hidden-api-list
-
-LOCAL_DROIDDOC_OPTIONS:=\
- $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \
- -referenceonly \
- -showUnannotated \
- -showAnnotation android.annotation.SystemApi \
- -showAnnotation android.annotation.TestApi \
- -dexApi $(INTERNAL_PLATFORM_DEX_API_FILE) \
- -privateDexApi $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) \
- -removedDexApi $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE) \
- -nodocs
-
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
-
-LOCAL_UNINSTALLABLE_MODULE := true
-
-include $(BUILD_DROIDDOC)
-
-$(full_target): .KATI_IMPLICIT_OUTPUTS := $(INTERNAL_PLATFORM_DEX_API_FILE) \
- $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) \
- $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE)
-
# ==== check javadoc comments but don't generate docs ========
include $(CLEAR_VARS)
@@ -943,23 +670,6 @@ LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=external/doclava/res/assets/templates-sdk
include $(BUILD_DROIDDOC)
-# ==== java proto host library ==============================
-include $(CLEAR_VARS)
-LOCAL_MODULE := platformprotos
-LOCAL_PROTOC_OPTIMIZE_TYPE := full
-LOCAL_PROTOC_FLAGS := \
- -Iexternal/protobuf/src
-LOCAL_SOURCE_FILES_ALL_GENERATED := true
-LOCAL_SRC_FILES := \
- cmds/am/proto/instrumentation_data.proto \
- cmds/statsd/src/perfetto/perfetto_config.proto \
- $(call all-proto-files-under, core/proto) \
- $(call all-proto-files-under, libs/incident/proto) \
- $(call all-proto-files-under, cmds/statsd/src)
-# b/72714520
-LOCAL_ERROR_PRONE_FLAGS := -Xep:MissingOverride:OFF
-include $(BUILD_HOST_JAVA_LIBRARY)
-
# ==== java proto device library (for test only) ==============================
include $(CLEAR_VARS)
LOCAL_MODULE := platformprotosnano
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 2e949c5c05a9..2247e43758d7 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -244,6 +244,9 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framew
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/core/java/android/os/storage/*)
$(call add-clean-step, rm -rf $(OUT_DIR)/host/common/obj/JAVA_LIBRARIES/platformprotos_intermediates)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/statsdprotolite_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/com.android.mediadrm.signer.jar)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/com.android.location.provider.jar)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/com.android.future.usb.accessory.jar)
# ******************************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
# ******************************************************************
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index de4e7bd42cbc..1f8ab21783ac 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -7,6 +7,7 @@ checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPL
packages/PrintSpooler/
services/print/
services/usb/
+ telephony/
api_lint_hook = ${REPO_ROOT}/frameworks/base/tools/apilint/apilint_sha.sh ${PREUPLOAD_COMMIT}
diff --git a/apct-tests/perftests/autofill/Android.mk b/apct-tests/perftests/autofill/Android.mk
new file mode 100644
index 000000000000..28555a0d5ca5
--- /dev/null
+++ b/apct-tests/perftests/autofill/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ android-support-test \
+ androidx.annotation_annotation \
+ apct-perftests-utils
+
+LOCAL_PACKAGE_NAME := AutofillPerfTests
+LOCAL_PRIVATE_PLATFORM_APIS := true
+
+LOCAL_COMPATIBILITY_SUITE += device-tests
+
+include $(BUILD_PACKAGE)
diff --git a/apct-tests/perftests/autofill/AndroidManifest.xml b/apct-tests/perftests/autofill/AndroidManifest.xml
new file mode 100644
index 000000000000..e706a32ad0c8
--- /dev/null
+++ b/apct-tests/perftests/autofill/AndroidManifest.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.perftests.autofill">
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ <activity android:name="android.perftests.utils.StubActivity">
+ <intent-filter>
+ <action android:name="com.android.perftests.core.PERFTEST" />
+ </intent-filter>
+ </activity>
+
+ <service
+ android:name="android.view.autofill.MyAutofillService"
+ android:label="PERF AutofillService"
+ android:permission="android.permission.BIND_AUTOFILL_SERVICE" >
+ <intent-filter>
+ <action android:name="android.service.autofill.AutofillService" />
+ </intent-filter>
+ </service>
+
+ </application>
+
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.perftests.autofill"/>
+</manifest>
diff --git a/apct-tests/perftests/autofill/AndroidTest.xml b/apct-tests/perftests/autofill/AndroidTest.xml
new file mode 100644
index 000000000000..29f9f94bcac7
--- /dev/null
+++ b/apct-tests/perftests/autofill/AndroidTest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs AutofillPerfTests metric instrumentation.">
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-suite-tag" value="apct-metric-instrumentation" />
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="AutofillPerfTests.apk" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.perftests.autofill" />
+ <option name="hidden-api-checks" value="false"/>
+ </test>
+</configuration>
diff --git a/apct-tests/perftests/autofill/res/layout/autofill_dataset_picker_text_only.xml b/apct-tests/perftests/autofill/res/layout/autofill_dataset_picker_text_only.xml
new file mode 100644
index 000000000000..5e6b277a0a08
--- /dev/null
+++ b/apct-tests/perftests/autofill/res/layout/autofill_dataset_picker_text_only.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@+id/text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+</LinearLayout> \ No newline at end of file
diff --git a/apct-tests/perftests/autofill/res/layout/test_autofill_login.xml b/apct-tests/perftests/autofill/res/layout/test_autofill_login.xml
new file mode 100644
index 000000000000..b35bdf1b757b
--- /dev/null
+++ b/apct-tests/perftests/autofill/res/layout/test_autofill_login.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:id="@+id/username_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:id="@+id/username_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Username" />
+
+ <EditText
+ android:id="@+id/username"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:imeOptions="flagNoFullscreen" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:id="@+id/password_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Password" />
+
+ <EditText
+ android:id="@+id/password"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="textPassword"
+ android:imeOptions="flagNoFullscreen" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <Button
+ android:id="@+id/login"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Login" />
+
+ <Button
+ android:id="@+id/cancel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Cancel" />
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/output"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/apct-tests/perftests/autofill/src/android/view/autofill/AbstractAutofillPerfTestCase.java b/apct-tests/perftests/autofill/src/android/view/autofill/AbstractAutofillPerfTestCase.java
new file mode 100644
index 000000000000..86a5c109f95a
--- /dev/null
+++ b/apct-tests/perftests/autofill/src/android/view/autofill/AbstractAutofillPerfTestCase.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.view.autofill;
+
+import android.os.Looper;
+import android.perftests.utils.PerfStatusReporter;
+import android.perftests.utils.SettingsHelper;
+import android.perftests.utils.SettingsStateKeeperRule;
+import android.perftests.utils.ShellHelper;
+import android.view.View;
+import android.perftests.utils.StubActivity;
+import android.provider.Settings;
+import android.support.test.filters.LargeTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.InstrumentationRegistry;
+
+import com.android.perftests.autofill.R;
+
+import java.util.Locale;
+import java.util.Collection;
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Base class for all autofill tests.
+ */
+@LargeTest
+public abstract class AbstractAutofillPerfTestCase {
+
+ @ClassRule
+ public static final SettingsStateKeeperRule mServiceSettingsKeeper =
+ new SettingsStateKeeperRule(InstrumentationRegistry.getTargetContext(),
+ Settings.Secure.AUTOFILL_SERVICE);
+
+ @Rule
+ public ActivityTestRule<StubActivity> mActivityRule =
+ new ActivityTestRule<StubActivity>(StubActivity.class);
+
+ @Rule
+ public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
+
+ private final int mLayoutId;
+
+ protected AbstractAutofillPerfTestCase(int layoutId) {
+ mLayoutId = layoutId;
+ }
+
+ /**
+ * Prepares the activity so that by the time the test is run it has reference to its fields.
+ */
+ @Before
+ public void prepareActivity() throws Throwable {
+ mActivityRule.runOnUiThread(() -> {
+ assertTrue("We should be running on the main thread",
+ Looper.getMainLooper().getThread() == Thread.currentThread());
+ assertTrue("We should be running on the main thread",
+ Looper.myLooper() == Looper.getMainLooper());
+ StubActivity activity = mActivityRule.getActivity();
+ activity.setContentView(mLayoutId);
+ onCreate(activity);
+ });
+ }
+
+ @Before
+ public void enableService() {
+ MyAutofillService.resetStaticState();
+ MyAutofillService.setEnabled(true);
+ }
+
+ @After
+ public void disableService() {
+ // Must disable service so calls are ignored in case of errors during the test case;
+ // otherwise, other tests will fail because these calls are made in the UI thread (as both
+ // the service, the tests, and the app run in the same process).
+ MyAutofillService.setEnabled(false);
+ }
+
+ /**
+ * Initializes the {@link StubActivity} after it was launched.
+ */
+ protected abstract void onCreate(StubActivity activity);
+
+ /**
+ * Uses the {@code settings} binary to set the autofill service.
+ */
+ protected void setService() {
+ SettingsHelper.syncSet(InstrumentationRegistry.getTargetContext(),
+ SettingsHelper.NAMESPACE_SECURE,
+ Settings.Secure.AUTOFILL_SERVICE,
+ MyAutofillService.COMPONENT_NAME);
+ }
+
+ /**
+ * Uses the {@code settings} binary to reset the autofill service.
+ */
+ protected void resetService() {
+ SettingsHelper.syncDelete(InstrumentationRegistry.getTargetContext(),
+ SettingsHelper.NAMESPACE_SECURE,
+ Settings.Secure.AUTOFILL_SERVICE);
+ }
+}
diff --git a/apct-tests/perftests/autofill/src/android/view/autofill/LoginTest.java b/apct-tests/perftests/autofill/src/android/view/autofill/LoginTest.java
new file mode 100644
index 000000000000..62662e477fd8
--- /dev/null
+++ b/apct-tests/perftests/autofill/src/android/view/autofill/LoginTest.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.view.autofill;
+
+import android.app.Activity;
+import android.os.Looper;
+import android.os.Bundle;
+import android.perftests.utils.PerfStatusReporter;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.StubActivity;
+import android.provider.Settings;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.InstrumentationRegistry;
+import com.android.perftests.autofill.R;
+
+import java.util.Locale;
+import java.util.Collection;
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.runner.RunWith;
+
+import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_HIDDEN;
+import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_SHOWN;
+
+public class LoginTest extends AbstractAutofillPerfTestCase {
+
+ private EditText mUsername;
+ private EditText mPassword;
+ private AutofillManager mAfm;
+
+ public LoginTest() {
+ super(R.layout.test_autofill_login);
+ }
+
+ @Override
+ protected void onCreate(StubActivity activity) {
+ View root = activity.getWindow().getDecorView();
+ mUsername = root.findViewById(R.id.username);
+ mPassword = root.findViewById(R.id.password);
+ mAfm = activity.getSystemService(AutofillManager.class);
+ }
+
+ /**
+ * This is the baseline test for focusing the 2 views when autofill is disabled.
+ */
+ @Test
+ public void testFocus_noService() throws Throwable {
+ resetService();
+
+ mActivityRule.runOnUiThread(() -> {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mUsername.requestFocus();
+ mPassword.requestFocus();
+ }
+ });
+ }
+
+ /**
+ * This time the service is called, but it returns a {@code null} response so the UI behaves
+ * as if autofill was disabled.
+ */
+ @Test
+ public void testFocus_serviceDoesNotAutofill() throws Throwable {
+ MyAutofillService.newCannedResponse().reply();
+ setService();
+
+ // Must first focus in a field to trigger autofill and wait for service response
+ // outside the loop
+ mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
+ MyAutofillService.getLastFillRequest();
+ // Then focus on password so loop start with focus away from username
+ mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
+
+ mActivityRule.runOnUiThread(() -> {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mUsername.requestFocus();
+ mPassword.requestFocus();
+ }
+ });
+ }
+
+ /**
+ * Now the service returns autofill data, for both username and password.
+ */
+ @Test
+ public void testFocus_autofillBothFields() throws Throwable {
+ MyAutofillService.newCannedResponse()
+ .setUsername(mUsername.getAutofillId(), "user")
+ .setPassword(mPassword.getAutofillId(), "pass")
+ .reply();
+ setService();
+
+ // Callback is used to slow down the calls made to the autofill server so the
+ // app is not crashed due to binder exhaustion. But the time spent waiting for the callbacks
+ // is not measured here...
+ MyAutofillCallback callback = new MyAutofillCallback();
+ mAfm.registerCallback(callback);
+
+ // Must first trigger autofill and wait for service response outside the loop
+ mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
+ MyAutofillService.getLastFillRequest();
+ callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
+
+ // Then focus on password so loop start with focus away from username
+ mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
+ callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
+ callback.expectEvent(mPassword, EVENT_INPUT_SHOWN);
+
+
+ // NOTE: we cannot run the whole loop inside the UI thread, because the autofill callback
+ // is called on it, which would cause a deadlock on expectEvent().
+ try {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
+ state.pauseTiming(); // Ignore time spent waiting for callbacks
+ callback.expectEvent(mPassword, EVENT_INPUT_HIDDEN);
+ callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
+ state.resumeTiming();
+ mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
+ state.pauseTiming(); // Ignore time spent waiting for callbacks
+ callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
+ callback.expectEvent(mPassword, EVENT_INPUT_SHOWN);
+ state.resumeTiming();
+ }
+
+ // Sanity check
+ callback.assertNoAsyncErrors();
+ } finally {
+ mAfm.unregisterCallback(callback);
+ }
+ }
+
+ /**
+ * Now the service returns autofill data, but just for username.
+ */
+ @Test
+ public void testFocus_autofillUsernameOnly() throws Throwable {
+ // Must set ignored ids so focus on password does not trigger new requests
+ MyAutofillService.newCannedResponse()
+ .setUsername(mUsername.getAutofillId(), "user")
+ .setIgnored(mPassword.getAutofillId())
+ .reply();
+ setService();
+
+ // Callback is used to slow down the calls made to the autofill server so the
+ // app is not crashed due to binder exhaustion. But the time spent waiting for the callbacks
+ // is not measured here...
+ MyAutofillCallback callback = new MyAutofillCallback();
+ mAfm.registerCallback(callback);
+
+ // Must first trigger autofill and wait for service response outside the loop
+ mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
+ MyAutofillService.getLastFillRequest();
+ callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
+
+ // Then focus on password so loop start with focus away from username
+ mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
+ callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
+
+ // NOTE: we cannot run the whole loop inside the UI thread, because the autofill callback
+ // is called on it, which would cause a deadlock on expectEvent().
+ try {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
+ state.pauseTiming(); // Ignore time spent waiting for callbacks
+ callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
+ state.resumeTiming();
+ mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
+ state.pauseTiming(); // Ignore time spent waiting for callbacks
+ callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
+ state.resumeTiming();
+ }
+
+ // Sanity check
+ callback.assertNoAsyncErrors();
+ } finally {
+ mAfm.unregisterCallback(callback);
+ }
+ }
+
+ /**
+ * This is the baseline test for changing the 2 views when autofill is disabled.
+ */
+ @Test
+ public void testChange_noService() throws Throwable {
+ resetService();
+
+ changeTest(false);
+ }
+
+ /**
+ * This time the service is called, but it returns a {@code null} response so the UI behaves
+ * as if autofill was disabled.
+ */
+ @Test
+ public void testChange_serviceDoesNotAutofill() throws Throwable {
+ MyAutofillService.newCannedResponse().reply();
+ setService();
+
+ changeTest(true);
+ }
+
+ /**
+ * Now the service returns autofill data, for both username and password.
+ */
+ @Test
+ public void testChange_autofillBothFields() throws Throwable {
+ MyAutofillService.newCannedResponse()
+ .setUsername(mUsername.getAutofillId(), "user")
+ .setPassword(mPassword.getAutofillId(), "pass")
+ .reply();
+ setService();
+
+ changeTest(true);
+ }
+
+ /**
+ * Now the service returns autofill data, but just for username.
+ */
+ @Test
+ public void testChange_autofillUsernameOnly() throws Throwable {
+ // Must set ignored ids so focus on password does not trigger new requests
+ MyAutofillService.newCannedResponse()
+ .setUsername(mUsername.getAutofillId(), "user")
+ .setIgnored(mPassword.getAutofillId())
+ .reply();
+ setService();
+
+ changeTest(true);
+ }
+
+ private void changeTest(boolean waitForService) throws Throwable {
+ // Must first focus in a field to trigger autofill and wait for service response
+ // outside the loop
+ mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
+ if (waitForService) {
+ MyAutofillService.getLastFillRequest();
+ }
+ mActivityRule.runOnUiThread(() -> {
+
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mUsername.setText("");
+ mUsername.setText("a");
+ mPassword.setText("");
+ mPassword.setText("x");
+ }
+ });
+ }
+
+ @Test
+ public void testCallbacks() throws Throwable {
+ MyAutofillService.newCannedResponse()
+ .setUsername(mUsername.getAutofillId(), "user")
+ .setPassword(mPassword.getAutofillId(), "pass")
+ .reply();
+ setService();
+
+ MyAutofillCallback callback = new MyAutofillCallback();
+ mAfm.registerCallback(callback);
+
+ // Must first focus in a field to trigger autofill and wait for service response
+ // outside the loop
+ mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
+ MyAutofillService.getLastFillRequest();
+ callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
+
+ // Now focus on password to prepare loop state
+ mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
+ callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
+ callback.expectEvent(mPassword, EVENT_INPUT_SHOWN);
+
+ // NOTE: we cannot run the whole loop inside the UI thread, because the autofill callback
+ // is called on it, which would cause a deadlock on expectEvent().
+ try {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
+ callback.expectEvent(mPassword, EVENT_INPUT_HIDDEN);
+ callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
+ mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
+ callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
+ callback.expectEvent(mPassword, EVENT_INPUT_SHOWN);
+ }
+
+ // Sanity check
+ callback.assertNoAsyncErrors();
+ } finally {
+ mAfm.unregisterCallback(callback);
+ }
+ }
+}
diff --git a/apct-tests/perftests/autofill/src/android/view/autofill/MyAutofillCallback.java b/apct-tests/perftests/autofill/src/android/view/autofill/MyAutofillCallback.java
new file mode 100644
index 000000000000..208d632f4f69
--- /dev/null
+++ b/apct-tests/perftests/autofill/src/android/view/autofill/MyAutofillCallback.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package android.view.autofill;
+
+import android.view.View;
+import android.view.autofill.AutofillManager.AutofillCallback;
+
+import androidx.annotation.NonNull;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_HIDDEN;
+import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_SHOWN;
+import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_UNAVAILABLE;
+
+import android.os.CancellationSignal;
+import android.service.autofill.FillCallback;
+import android.service.autofill.FillRequest;
+import android.util.Log;
+
+/**
+ * Custom {@link AutofillCallback} used to recover events during tests.
+ */
+public final class MyAutofillCallback extends AutofillCallback {
+
+ private static final String TAG = "MyAutofillCallback";
+ private static final int TIMEOUT_MS = 5000;
+
+ private final BlockingQueue<MyEvent> mEvents = new LinkedBlockingQueue<>(2);
+ private final List<String> mAsyncErrors = new ArrayList<>();
+
+ @Override
+ public void onAutofillEvent(View view, int event) {
+ boolean offered = false;
+ try {
+ offered = mEvents.offer(new MyEvent(view, event), TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ if (!offered) {
+ String error = "could not offer " + toString(view, event) + " in " + TIMEOUT_MS + "ms";
+ Log.e(TAG, error);
+ mAsyncErrors.add(error);
+ }
+ }
+
+ /**
+ * Asserts the callback is called for the given view and event, or fail if it times out.
+ */
+ public void expectEvent(@NonNull View view, int event) {
+ MyEvent myEvent;
+ try {
+ myEvent = mEvents.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ if (myEvent == null) {
+ throw new IllegalStateException("no event received in " + TIMEOUT_MS
+ + "ms while waiting for " + toString(view, event));
+ }
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IllegalStateException("interrupted waiting for " + toString(view, event));
+ }
+ if (!myEvent.view.equals(view) || myEvent.event != event) {
+ throw new AssertionError("Invalid event: expected " + myEvent + ", got "
+ + toString(view, event));
+ }
+ }
+
+ /**
+ * Throws an exception if an error happened asynchronously while handing
+ * {@link #onAutofillEvent(View, int)}.
+ */
+ public void assertNoAsyncErrors() {
+ if (!mAsyncErrors.isEmpty()) {
+ throw new IllegalStateException(mAsyncErrors.size() + " errors: " + mAsyncErrors);
+ }
+ }
+
+ private static String eventToString(int event) {
+ switch (event) {
+ case EVENT_INPUT_HIDDEN:
+ return "HIDDEN";
+ case EVENT_INPUT_SHOWN:
+ return "SHOWN";
+ case EVENT_INPUT_UNAVAILABLE:
+ return "UNAVAILABLE";
+ default:
+ throw new IllegalArgumentException("invalid event: " + event);
+ }
+ }
+
+ private static String toString(View view, int event) {
+ return eventToString(event) + ": " + view + ")";
+ }
+
+ private static final class MyEvent {
+ public final View view;
+ public final int event;
+
+ MyEvent(View view, int event) {
+ this.view = view;
+ this.event = event;
+ }
+
+ @Override
+ public String toString() {
+ return MyAutofillCallback.toString(view, event);
+ }
+ }
+}
diff --git a/apct-tests/perftests/autofill/src/android/view/autofill/MyAutofillService.java b/apct-tests/perftests/autofill/src/android/view/autofill/MyAutofillService.java
new file mode 100644
index 000000000000..7060233fc80f
--- /dev/null
+++ b/apct-tests/perftests/autofill/src/android/view/autofill/MyAutofillService.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package android.view.autofill;
+
+import android.os.CancellationSignal;
+import android.service.autofill.AutofillService;
+import android.service.autofill.Dataset;
+import android.service.autofill.FillCallback;
+import android.service.autofill.FillRequest;
+import android.service.autofill.FillResponse;
+import android.service.autofill.SaveCallback;
+import android.service.autofill.SaveRequest;
+import android.util.Log;
+import android.util.Pair;
+import android.widget.RemoteViews;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.perftests.autofill.R;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * An {@link AutofillService} implementation whose replies can be programmed by the test case.
+ */
+public class MyAutofillService extends AutofillService {
+
+ private static final String TAG = "MyAutofillService";
+ private static final int TIMEOUT_MS = 5000;
+
+ private static final String PACKAGE_NAME = "com.android.perftests.autofill";
+ static final String COMPONENT_NAME = PACKAGE_NAME + "/android.view.autofill.MyAutofillService";
+
+ private static final BlockingQueue<FillRequest> sFillRequests = new LinkedBlockingQueue<>();
+ private static final BlockingQueue<CannedResponse> sCannedResponses =
+ new LinkedBlockingQueue<>();
+
+ private static boolean sEnabled;
+
+ /**
+ * Resets the static state associated with the service.
+ */
+ static void resetStaticState() {
+ sFillRequests.clear();
+ sCannedResponses.clear();
+ sEnabled = false;
+ }
+
+ /**
+ * Sets whether the service is enabled or not - when disabled, calls to
+ * {@link #onFillRequest(FillRequest, CancellationSignal, FillCallback)} will be ignored.
+ */
+ static void setEnabled(boolean enabled) {
+ sEnabled = enabled;
+ }
+
+ /**
+ * Gets the the last {@link FillRequest} passed to
+ * {@link #onFillRequest(FillRequest, CancellationSignal, FillCallback)} or throws an
+ * exception if that method was not called.
+ */
+ @NonNull
+ static FillRequest getLastFillRequest() {
+ FillRequest request = null;
+ try {
+ request = sFillRequests.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IllegalStateException("onFillRequest() interrupted");
+ }
+ if (request == null) {
+ throw new IllegalStateException("onFillRequest() not called in " + TIMEOUT_MS + "ms");
+ }
+ return request;
+ }
+
+ @Override
+ public void onFillRequest(FillRequest request, CancellationSignal cancellationSignal,
+ FillCallback callback) {
+ try {
+ handleRequest(request, callback);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ onError("onFillRequest() interrupted", e, callback);
+ } catch (Exception e) {
+ onError("exception on onFillRequest()", e, callback);
+ }
+ }
+
+
+ private void handleRequest(FillRequest request, FillCallback callback) throws Exception {
+ if (!sEnabled) {
+ onError("ignoring onFillRequest(): service is disabled", callback);
+ return;
+ }
+ CannedResponse response = sCannedResponses.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ if (response == null) {
+ onError("ignoring onFillRequest(): response not set", callback);
+ return;
+ }
+ Dataset.Builder dataset = new Dataset.Builder(newDatasetPresentation("dataset"));
+ boolean hasData = false;
+ if (response.mUsername != null) {
+ hasData = true;
+ dataset.setValue(response.mUsername.first,
+ AutofillValue.forText(response.mUsername.second));
+ }
+ if (response.mPassword != null) {
+ hasData = true;
+ dataset.setValue(response.mPassword.first,
+ AutofillValue.forText(response.mPassword.second));
+ }
+ if (hasData) {
+ FillResponse.Builder fillResponse = new FillResponse.Builder();
+ if (response.mIgnoredIds != null) {
+ fillResponse.setIgnoredIds(response.mIgnoredIds);
+ }
+
+ callback.onSuccess(fillResponse.addDataset(dataset.build()).build());
+ } else {
+ callback.onSuccess(null);
+ }
+ if (!sFillRequests.offer(request, TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+ Log.w(TAG, "could not offer request in " + TIMEOUT_MS + "ms");
+ }
+ }
+
+ @Override
+ public void onSaveRequest(SaveRequest request, SaveCallback callback) {
+ // No current test should have triggered it...
+ Log.e(TAG, "onSaveRequest() should not have been called");
+ callback.onFailure("onSaveRequest() should not have been called");
+ }
+
+ static final class CannedResponse {
+ private final Pair<AutofillId, String> mUsername;
+ private final Pair<AutofillId, String> mPassword;
+ private final AutofillId[] mIgnoredIds;
+
+ private CannedResponse(@NonNull Builder builder) {
+ mUsername = builder.mUsername;
+ mPassword = builder.mPassword;
+ mIgnoredIds = builder.mIgnoredIds;
+ }
+
+ static class Builder {
+ private Pair<AutofillId, String> mUsername;
+ private Pair<AutofillId, String> mPassword;
+ private AutofillId[] mIgnoredIds;
+
+ @NonNull
+ Builder setUsername(@NonNull AutofillId id, @NonNull String value) {
+ mUsername = new Pair<>(id, value);
+ return this;
+ }
+
+ @NonNull
+ Builder setPassword(@NonNull AutofillId id, @NonNull String value) {
+ mPassword = new Pair<>(id, value);
+ return this;
+ }
+
+ @NonNull
+ Builder setIgnored(AutofillId... ids) {
+ mIgnoredIds = ids;
+ return this;
+ }
+
+ void reply() {
+ sCannedResponses.add(new CannedResponse(this));
+ }
+ }
+ }
+
+ /**
+ * Sets the expected canned {@link FillResponse} for the next
+ * {@link AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)}.
+ */
+ static CannedResponse.Builder newCannedResponse() {
+ return new CannedResponse.Builder();
+ }
+
+ private void onError(@NonNull String msg, @NonNull FillCallback callback) {
+ Log.e(TAG, msg);
+ callback.onFailure(msg);
+ }
+
+ private void onError(@NonNull String msg, @NonNull Exception e,
+ @NonNull FillCallback callback) {
+ Log.e(TAG, msg, e);
+ callback.onFailure(msg);
+ }
+
+ @NonNull
+ private static RemoteViews newDatasetPresentation(@NonNull CharSequence text) {
+ RemoteViews presentation =
+ new RemoteViews(PACKAGE_NAME, R.layout.autofill_dataset_picker_text_only);
+ presentation.setTextViewText(R.id.text, text);
+ return presentation;
+ }
+}
diff --git a/apct-tests/perftests/core/Android.mk b/apct-tests/perftests/core/Android.mk
index 6156a0c1f8e8..77bacbe4213d 100644
--- a/apct-tests/perftests/core/Android.mk
+++ b/apct-tests/perftests/core/Android.mk
@@ -10,6 +10,7 @@ LOCAL_SRC_FILES := \
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
+ androidx.annotation_annotation \
apct-perftests-utils \
guava
@@ -26,5 +27,3 @@ LOCAL_ASSET_DIR := $(TOP)/external/google-fonts/dancing-script
LOCAL_COMPATIBILITY_SUITE += device-tests
include $(BUILD_PACKAGE)
-
-include $(call all-makefiles-under, $(LOCAL_PATH))
diff --git a/apct-tests/perftests/core/AndroidManifest.xml b/apct-tests/perftests/core/AndroidManifest.xml
index 132a2f9b2d0c..13c24d9b478d 100644
--- a/apct-tests/perftests/core/AndroidManifest.xml
+++ b/apct-tests/perftests/core/AndroidManifest.xml
@@ -16,6 +16,16 @@
</intent-filter>
</activity>
<service android:name="android.os.SomeService" android:exported="false" android:process=":some_service" />
+
+ <service
+ android:name="android.view.autofill.MyAutofillService"
+ android:label="PERF AutofillService"
+ android:permission="android.permission.BIND_AUTOFILL_SERVICE" >
+ <intent-filter>
+ <action android:name="android.service.autofill.AutofillService" />
+ </intent-filter>
+ </service>
+
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/apct-tests/perftests/core/jni/Android.bp b/apct-tests/perftests/core/jni/Android.bp
new file mode 100644
index 000000000000..4c0f2aaba145
--- /dev/null
+++ b/apct-tests/perftests/core/jni/Android.bp
@@ -0,0 +1,13 @@
+cc_library_shared {
+ name: "libperftestscore_jni",
+ sdk_version: "21",
+
+ srcs: ["SystemPerfTest.cpp"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/apct-tests/perftests/core/jni/Android.mk b/apct-tests/perftests/core/jni/Android.mk
deleted file mode 100644
index d4c3f1e4a3ab..000000000000
--- a/apct-tests/perftests/core/jni/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_SDK_VERSION := 21
-
-LOCAL_SRC_FILES:= \
- SystemPerfTest.cpp \
-
-LOCAL_C_INCLUDES += \
- $(JNI_H_INCLUDE)
-
-LOCAL_MODULE := libperftestscore_jni
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
index dfbabebbcc04..a283e0664bc6 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
@@ -47,8 +47,7 @@ public class RenderNodePerfTest {
public void testCreateRenderNodeNoName() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
- RenderNode node = RenderNode.create(null, null);
- node.destroy();
+ RenderNode.create(null, null);
}
}
@@ -56,8 +55,7 @@ public class RenderNodePerfTest {
public void testCreateRenderNode() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
- RenderNode node = RenderNode.create("LinearLayout", null);
- node.destroy();
+ RenderNode.create("LinearLayout", null);
}
}
diff --git a/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java b/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java
index ba072da8071e..e126fb807b99 100644
--- a/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java
+++ b/apct-tests/perftests/core/src/android/os/BinderCallsStatsPerfTest.java
@@ -45,7 +45,7 @@ public class BinderCallsStatsPerfTest {
@Before
public void setUp() {
- mBinderCallsStats = new BinderCallsStats(true);
+ mBinderCallsStats = new BinderCallsStats();
}
@After
@@ -54,24 +54,25 @@ public class BinderCallsStatsPerfTest {
@Test
public void timeCallSession() {
+ mBinderCallsStats.setDetailedTracking(true);
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Binder b = new Binder();
int i = 0;
while (state.keepRunning()) {
BinderCallsStats.CallSession s = mBinderCallsStats.callStarted(b, i % 100);
- mBinderCallsStats.callEnded(s);
+ mBinderCallsStats.callEnded(s, 0, 0);
i++;
}
}
@Test
public void timeCallSessionTrackingDisabled() {
+ mBinderCallsStats.setDetailedTracking(false);
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Binder b = new Binder();
- mBinderCallsStats = new BinderCallsStats(false);
while (state.keepRunning()) {
BinderCallsStats.CallSession s = mBinderCallsStats.callStarted(b, 0);
- mBinderCallsStats.callEnded(s);
+ mBinderCallsStats.callEnded(s, 0, 0);
}
}
diff --git a/apct-tests/perftests/core/src/android/os/TracePerfTest.java b/apct-tests/perftests/core/src/android/os/TracePerfTest.java
new file mode 100644
index 000000000000..8e5cfaafde52
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/os/TracePerfTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+
+package android.os;
+
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
+import android.perftests.utils.ShellHelper;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class TracePerfTest {
+ @Rule
+ public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
+
+ @BeforeClass
+ public static void startTracing() {
+ ShellHelper.runShellCommandRaw("atrace -c --async_start -a *");
+ }
+
+ @AfterClass
+ public static void endTracing() {
+ ShellHelper.runShellCommandRaw("atrace --async_stop");
+ }
+
+ @Before
+ public void verifyTracingEnabled() {
+ Assert.assertTrue(Trace.isEnabled());
+ }
+
+ @Test
+ public void testEnabled() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ Trace.isEnabled();
+ }
+ }
+
+ @Test
+ public void testBeginEndSection() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ Trace.beginSection("testBeginEndSection");
+ Trace.endSection();
+ }
+ }
+
+ @Test
+ public void testAsyncBeginEnd() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ Trace.beginAsyncSection("testAsyncBeginEnd", 42);
+ Trace.endAsyncSection("testAsyncBeginEnd", 42);
+ }
+ }
+
+ @Test
+ public void testCounter() {
+ BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ Trace.setCounter("testCounter", 123);
+ }
+ }
+}
diff --git a/apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java b/apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java
index 586c3852325a..64f2800ee112 100644
--- a/apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/BoringLayoutCreateDrawPerfTest.java
@@ -46,7 +46,7 @@ public class BoringLayoutCreateDrawPerfTest {
private static final float SPACING_ADD = 10f;
private static final float SPACING_MULT = 1.5f;
- @Parameterized.Parameters(name = "cached={3},{1}chars,{0}")
+ @Parameterized.Parameters(name = "cached {3} {1}chars {0}")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
diff --git a/apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java b/apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java
index 9d11f29557d2..194a88c36bba 100644
--- a/apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/BoringLayoutIsBoringPerfTest.java
@@ -40,7 +40,7 @@ public class BoringLayoutIsBoringPerfTest {
private static final boolean[] BOOLEANS = new boolean[]{false, true};
- @Parameterized.Parameters(name = "cached={4},{1}chars,{0}")
+ @Parameterized.Parameters(name = "cached {4} {1}chars {0}")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
diff --git a/apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java b/apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java
index 676879857491..ad5a34e44997 100644
--- a/apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/PaintMeasureDrawPerfTest.java
@@ -42,7 +42,7 @@ public class PaintMeasureDrawPerfTest {
private static final boolean[] BOOLEANS = new boolean[]{false, true};
- @Parameterized.Parameters(name = "cached={1},{0}chars")
+ @Parameterized.Parameters(name = "cached {1} {0}chars")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
diff --git a/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
index ccbccca87b69..d98df059e2d3 100644
--- a/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
+++ b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
@@ -42,6 +42,7 @@ import org.junit.runner.RunWith;
import java.nio.CharBuffer;
import java.util.Random;
+import java.util.Locale;
@LargeTest
@RunWith(AndroidJUnit4.class)
@@ -49,9 +50,7 @@ public class PrecomputedTextMemoryUsageTest {
private static final int WORD_LENGTH = 9; // Random word has 9 characters.
private static final boolean NO_STYLE_TEXT = false;
- private static TextPaint PAINT = new TextPaint();
-
- private static int TRIAL_COUNT = 100;
+ private static int TRIAL_COUNT = 10;
public PrecomputedTextMemoryUsageTest() {}
@@ -75,9 +74,10 @@ public class PrecomputedTextMemoryUsageTest {
}
@Test
- public void testMemoryUsage_NoHyphenation() {
+ public void testMemoryUsage_Latin_NoHyphenation() {
+ TextPaint paint = new TextPaint();
int[] memories = new int[TRIAL_COUNT];
- final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
.build();
@@ -88,13 +88,14 @@ public class PrecomputedTextMemoryUsageTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), param)
.getMemoryUsage();
}
- reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation");
+ reportMemoryUsage(median(memories), "MemoryUsage_Latin_NoHyphenation");
}
@Test
- public void testMemoryUsage_Hyphenation() {
+ public void testMemoryUsage_Latin_Hyphenation() {
+ TextPaint paint = new TextPaint();
int[] memories = new int[TRIAL_COUNT];
- final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
.build();
@@ -105,48 +106,97 @@ public class PrecomputedTextMemoryUsageTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), param)
.getMemoryUsage();
}
- reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation");
+ reportMemoryUsage(median(memories), "MemoryUsage_Latin_Hyphenation");
+ }
+
+ @Test
+ public void testMemoryUsage_CJK_NoHyphenation() {
+ TextPaint paint = new TextPaint();
+ int[] memories = new int[TRIAL_COUNT];
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
+ .build();
+
+ // Report median of randomly generated PrecomputedText.
+ for (int i = 0; i < TRIAL_COUNT; ++i) {
+ memories[i] = PrecomputedText.create(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[\\u4E00-\\u9FA0]"),
+ param).getMemoryUsage();
+ }
+ reportMemoryUsage(median(memories), "MemoryUsage_CJK_NoHyphenation");
+ }
+
+ @Test
+ public void testMemoryUsage_CJK_Hyphenation() {
+ TextPaint paint = new TextPaint();
+ int[] memories = new int[TRIAL_COUNT];
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
+ .build();
+
+ // Report median of randomly generated PrecomputedText.
+ for (int i = 0; i < TRIAL_COUNT; ++i) {
+ memories[i] = PrecomputedText.create(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[\\u4E00-\\u9FA0]"),
+ param).getMemoryUsage();
+ }
+ reportMemoryUsage(median(memories), "MemoryUsage_CJK_Hyphenation");
}
@Test
- public void testMemoryUsage_NoHyphenation_WidthOnly() {
+ public void testMemoryUsage_Arabic_NoHyphenation() {
+ TextPaint paint = new TextPaint();
+ paint.setTextLocale(Locale.forLanguageTag("ar"));
int[] memories = new int[TRIAL_COUNT];
- final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
.build();
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
- CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
- PrecomputedText.ParagraphInfo[] paragraphInfo =
- PrecomputedText.createMeasuredParagraphs(cs, param, 0, cs.length(), false);
- memories[i] = 0;
- for (PrecomputedText.ParagraphInfo info : paragraphInfo) {
- memories[i] += info.measured.getMemoryUsage();
- }
+ memories[i] = PrecomputedText.create(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[\\u0600-\\u06FF]"),
+ param).getMemoryUsage();
}
- reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation_WidthOnly");
+ reportMemoryUsage(median(memories), "MemoryUsage_Arabic_NoHyphenation");
}
@Test
- public void testMemoryUsage_Hyphenatation_WidthOnly() {
+ public void testMemoryUsage_Arabic_Hyphenation() {
+ TextPaint paint = new TextPaint();
+ paint.setTextLocale(Locale.forLanguageTag("ar"));
int[] memories = new int[TRIAL_COUNT];
- final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
.build();
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
- CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
- PrecomputedText.ParagraphInfo[] paragraphInfo =
- PrecomputedText.createMeasuredParagraphs(cs, param, 0, cs.length(), false);
- memories[i] = 0;
- for (PrecomputedText.ParagraphInfo info : paragraphInfo) {
- memories[i] += info.measured.getMemoryUsage();
- }
+ memories[i] = PrecomputedText.create(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[\\u0600-\\u06FF]"),
+ param).getMemoryUsage();
+ }
+ reportMemoryUsage(median(memories), "MemoryUsage_Arabic_Hyphenation");
+ }
+ @Test
+ public void testMemoryUsage_Emoji() {
+ TextPaint paint = new TextPaint();
+ int[] memories = new int[TRIAL_COUNT];
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
+ .build();
+
+ // Report median of randomly generated PrecomputedText.
+ for (int i = 0; i < TRIAL_COUNT; ++i) {
+ memories[i] = PrecomputedText.create(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[:emoji:]"),
+ param).getMemoryUsage();
}
- reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation_WidthOnly");
+ reportMemoryUsage(median(memories), "MemoryUsage_Emoji_NoHyphenation");
}
}
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java
index bfdb7589bdff..deb2b0a74aaa 100644
--- a/apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutCreateDrawPerfTest.java
@@ -50,7 +50,7 @@ public class StaticLayoutCreateDrawPerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
- @Parameterized.Parameters(name = "cached={3},{1}chars,{0}")
+ @Parameterized.Parameters(name = "cached {3} {1}chars {0}")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java
new file mode 100644
index 000000000000..2768a7d89e16
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutGetOffsetForHorizontalPerfTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package android.text;
+
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
+
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class StaticLayoutGetOffsetForHorizontalPerfTest {
+ private static final int WORD_LENGTH = 9; // Random word has 9 characters.
+ private static final int WORDS_IN_LINE = 64; // Roughly, 64 words in a line.
+ private static final boolean NO_STYLE_TEXT = false;
+ private static final boolean STYLE_TEXT = true;
+
+ private static TextPaint PAINT = new TextPaint();
+ static {
+ PAINT.setTextSize(16.0f);
+ }
+ private static final int TEXT_WIDTH = WORDS_IN_LINE * WORD_LENGTH * (int) PAINT.getTextSize();
+
+ public StaticLayoutGetOffsetForHorizontalPerfTest() {}
+
+ @Rule
+ public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
+
+ private TextPerfUtils mTextUtil = new TextPerfUtils();
+
+ @Before
+ public void setUp() {
+ mTextUtil.resetRandom(0 /* seed */);
+ }
+
+ @Test
+ public void testGetOffsetForHorizontal_LTR() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ state.pauseTiming();
+ final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT,
+ "[a-zA-Z]");
+ StaticLayout layout =
+ StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
+ state.resumeTiming();
+
+ layout.getOffsetForHorizontal(0, TEXT_WIDTH / 2.0f);
+ }
+ }
+
+ @Test
+ public void testGetOffsetForHorizontal_RTL() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ state.pauseTiming();
+ final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT,
+ "[:Arabic:]");
+ StaticLayout layout =
+ StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
+ state.resumeTiming();
+
+ layout.getOffsetForHorizontal(0, TEXT_WIDTH / 2.0f);
+ }
+ }
+
+ @Test
+ public void testGetOffsetForHorizontal_BiDi() {
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ while (state.keepRunning()) {
+ state.pauseTiming();
+ final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT,
+ "[[a-zA-Z][:Arabic:]]");
+ StaticLayout layout =
+ StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
+ state.resumeTiming();
+
+ layout.getOffsetForHorizontal(0, TEXT_WIDTH / 2.0f);
+ }
+ }
+}
diff --git a/apct-tests/perftests/core/src/android/text/TextPerfUtils.java b/apct-tests/perftests/core/src/android/text/TextPerfUtils.java
index fefda64b51a7..aa505b533f26 100644
--- a/apct-tests/perftests/core/src/android/text/TextPerfUtils.java
+++ b/apct-tests/perftests/core/src/android/text/TextPerfUtils.java
@@ -27,6 +27,8 @@ import android.support.test.runner.AndroidJUnit4;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Typeface;
+import android.icu.text.UnicodeSet;
+import android.icu.text.UnicodeSetIterator;
import android.text.Layout;
import android.text.style.TextAppearanceSpan;
import android.view.DisplayListCanvas;
@@ -39,6 +41,7 @@ import org.junit.runner.RunWith;
import java.nio.CharBuffer;
import java.util.Random;
+import java.util.ArrayList;
public class TextPerfUtils {
@@ -46,8 +49,17 @@ public class TextPerfUtils {
private Random mRandom = new Random(0);
- private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
- private static final int ALPHABET_LENGTH = ALPHABET.length();
+ private static final String[] ALPHABET;
+ private static final int ALPHABET_LENGTH;
+ static {
+ String alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ ALPHABET_LENGTH = alphabets.length();
+ ALPHABET = new String[ALPHABET_LENGTH];
+ for (int i = 0; i < ALPHABET_LENGTH; ++i) {
+ ALPHABET[i] = Character.toString(alphabets.charAt(i));
+ }
+ }
+
private static final ColorStateList TEXT_COLOR = ColorStateList.valueOf(0x00000000);
private static final String[] FAMILIES = { "sans-serif", "serif", "monospace" };
@@ -55,30 +67,59 @@ public class TextPerfUtils {
Typeface.NORMAL, Typeface.BOLD, Typeface.ITALIC, Typeface.BOLD_ITALIC
};
- private final char[] mBuffer = new char[PARA_LENGTH];
-
public void resetRandom(long seed) {
mRandom = new Random(seed);
}
+ private static String[] UnicodeSetToArray(String setStr) {
+ final UnicodeSet set = new UnicodeSet(setStr);
+ final UnicodeSetIterator iterator = new UnicodeSetIterator(set);
+ final ArrayList<String> out = new ArrayList<>(set.size());
+ while (iterator.next()) {
+ out.add(iterator.getString());
+ }
+ return out.toArray(new String[out.size()]);
+ }
+
+ public CharSequence nextRandomParagraph(int wordLen, boolean applyRandomStyle, String setStr) {
+ return nextRandomParagraph(wordLen, applyRandomStyle, UnicodeSetToArray(setStr));
+ }
+
public CharSequence nextRandomParagraph(int wordLen, boolean applyRandomStyle) {
+ return nextRandomParagraph(wordLen, applyRandomStyle, ALPHABET);
+ }
+
+ public CharSequence nextRandomParagraph(int wordLen, boolean applyRandomStyle,
+ String[] charSet) {
+ ArrayList<Character> chars = new ArrayList<>();
+ ArrayList<Integer> wordOffsets = new ArrayList<>();
for (int i = 0; i < PARA_LENGTH; i++) {
if (i % (wordLen + 1) == wordLen) {
- mBuffer[i] = ' ';
+ chars.add(' ');
+ wordOffsets.add(chars.size());
} else {
- mBuffer[i] = ALPHABET.charAt(mRandom.nextInt(ALPHABET_LENGTH));
+ final String str = charSet[mRandom.nextInt(charSet.length)];
+ for (int j = 0; j < str.length(); ++j) {
+ chars.add(str.charAt(j));
+ }
}
}
+ wordOffsets.add(chars.size());
- CharSequence cs = CharBuffer.wrap(mBuffer);
+ char[] buffer = new char[chars.size()];
+ for (int i = 0; i < buffer.length; ++i) {
+ buffer[i] = chars.get(i);
+ }
+ CharSequence cs = CharBuffer.wrap(buffer);
if (!applyRandomStyle) {
return cs;
}
SpannableStringBuilder ssb = new SpannableStringBuilder(cs);
- for (int i = 0; i < ssb.length(); i += wordLen + 1) {
- final int spanStart = i;
- final int spanEnd = (i + wordLen) > ssb.length() ? ssb.length() : i + wordLen;
+ int prevWordStart = 0;
+ for (int i = 0; i < wordOffsets.size(); i++) {
+ final int spanStart = prevWordStart;
+ final int spanEnd = wordOffsets.get(i);
final TextAppearanceSpan span = new TextAppearanceSpan(
FAMILIES[mRandom.nextInt(FAMILIES.length)],
@@ -87,6 +128,7 @@ public class TextPerfUtils {
TEXT_COLOR, TEXT_COLOR);
ssb.setSpan(span, spanStart, spanEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ prevWordStart = spanEnd;
}
return ssb;
}
diff --git a/apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java b/apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java
index ff2d57edb11b..c2898fa05c81 100644
--- a/apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/TextViewSetTextMeasurePerfTest.java
@@ -51,7 +51,7 @@ public class TextViewSetTextMeasurePerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
- @Parameterized.Parameters(name = "cached={3},{1}chars,{0}")
+ @Parameterized.Parameters(name = "cached {3} {1}chars {0}")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
diff --git a/apct-tests/perftests/multiuser/Android.mk b/apct-tests/perftests/multiuser/Android.mk
index 9bc7d051121a..5ff4ebc0eb80 100644
--- a/apct-tests/perftests/multiuser/Android.mk
+++ b/apct-tests/perftests/multiuser/Android.mk
@@ -21,7 +21,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
- ub-uiautomator
+ apct-perftests-utils
LOCAL_PACKAGE_NAME := MultiUserPerfTests
LOCAL_PRIVATE_PLATFORM_APIS := true
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkRunner.java b/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkRunner.java
index 629e6f453824..7b65bfa02a18 100644
--- a/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkRunner.java
+++ b/apct-tests/perftests/multiuser/src/android/multiuser/BenchmarkRunner.java
@@ -17,10 +17,8 @@ package android.multiuser;
import android.os.Bundle;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.uiautomator.UiDevice;
+import android.perftests.utils.ShellHelper;
-import java.io.IOException;
import java.util.ArrayList;
// Based on //platform/frameworks/base/apct-tests/perftests/utils/BenchmarkState.java
@@ -74,12 +72,7 @@ public class BenchmarkRunner {
private void prepareForNextRun() {
SystemClock.sleep(COOL_OFF_PERIOD_MS);
- try {
- UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
- .executeShellCommand("am wait-for-broadcast-idle");
- } catch (IOException e) {
- throw new IllegalStateException("Cannot execute shell command", e);
- }
+ ShellHelper.runShellCommand("am wait-for-broadcast-idle");
mStartTimeNs = System.nanoTime();
mPausedDurationNs = 0;
}
diff --git a/apct-tests/perftests/utils/Android.mk b/apct-tests/perftests/utils/Android.mk
index 55c13b087626..604f0adbe23e 100644
--- a/apct-tests/perftests/utils/Android.mk
+++ b/apct-tests/perftests/utils/Android.mk
@@ -1,7 +1,9 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ android-support-test \
+ androidx.annotation_annotation
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/OneTimeSettingsListener.java b/apct-tests/perftests/utils/src/android/perftests/utils/OneTimeSettingsListener.java
new file mode 100644
index 000000000000..37af4c7f6181
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/OneTimeSettingsListener.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.perftests.utils;
+
+import static android.perftests.utils.SettingsHelper.NAMESPACE_SECURE;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+
+import androidx.annotation.NonNull;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Helper used to block tests until a secure settings value has been updated.
+ */
+public final class OneTimeSettingsListener extends ContentObserver {
+ private final CountDownLatch mLatch = new CountDownLatch(1);
+ private final ContentResolver mResolver;
+ private final String mKey;
+ private final int mTimeoutMs;
+
+ public OneTimeSettingsListener(@NonNull Context context, @NonNull String namespace,
+ @NonNull String key, int timeoutMs) {
+ super(new Handler(Looper.getMainLooper()));
+ mKey = key;
+ mResolver = context.getContentResolver();
+ mTimeoutMs = timeoutMs;
+ final Uri uri;
+ switch (namespace) {
+ case NAMESPACE_SECURE:
+ uri = Settings.Secure.getUriFor(key);
+ break;
+ default:
+ throw new IllegalArgumentException("invalid namespace: " + namespace);
+ }
+ mResolver.registerContentObserver(uri, false, this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ mResolver.unregisterContentObserver(this);
+ mLatch.countDown();
+ }
+
+ /**
+ * Blocks for a few seconds until it's called, or throws an {@link IllegalStateException} if
+ * it isn't.
+ */
+ public void assertCalled() {
+ try {
+ final boolean updated = mLatch.await(mTimeoutMs, TimeUnit.MILLISECONDS);
+ if (!updated) {
+ throw new IllegalStateException(
+ "Settings " + mKey + " not called in " + mTimeoutMs + "ms");
+ }
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IllegalStateException("Interrupted", e);
+ }
+ }
+}
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java b/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java
index 64b0bf589a1b..4b7b98da442b 100644
--- a/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/PerfStatusReporter.java
@@ -17,6 +17,7 @@
package android.perftests.utils;
import android.support.test.InstrumentationRegistry;
+import android.util.Log;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
@@ -49,6 +50,7 @@ import static junit.framework.Assert.assertTrue;
*/
public class PerfStatusReporter implements TestRule {
+ private static final String TAG = "PerfStatusReporter";
private final BenchmarkState mState = new BenchmarkState();
public BenchmarkState getBenchmarkState() {
@@ -61,6 +63,8 @@ public class PerfStatusReporter implements TestRule {
@Override
public void evaluate() throws Throwable {
String invokeMethodName = description.getMethodName();
+ Log.i(TAG, "Running " + description.getClassName() + "#" + invokeMethodName);
+
// validate and simplify the function name.
// First, remove the "test" prefix which normally comes from CTS test.
// Then make sure the [subTestName] is valid, not just numbers like [0].
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/SettingsHelper.java b/apct-tests/perftests/utils/src/android/perftests/utils/SettingsHelper.java
new file mode 100644
index 000000000000..d7d1d6b7f817
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/SettingsHelper.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.perftests.utils;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import java.util.Objects;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * Provides utilities to interact with the device's {@link Settings}.
+ */
+public final class SettingsHelper {
+
+ public static final String NAMESPACE_SECURE = "secure";
+
+ private static int DEFAULT_TIMEOUT_MS = 5000;
+
+ /**
+ * Uses a Shell command to "asynchronously" set the given preference, returning right away.
+ */
+ public static void set(@NonNull String namespace, @NonNull String key, @Nullable String value) {
+ if (value == null) {
+ delete(namespace, key);
+ return;
+ }
+ ShellHelper.runShellCommand("settings put %s %s %s default", namespace, key, value);
+ }
+
+ /**
+ * Uses a Shell command to "synchronously" set the given preference by registering a listener
+ * and wait until it's set.
+ */
+ public static void syncSet(@NonNull Context context, @NonNull String namespace,
+ @NonNull String key, @Nullable String value) {
+ if (value == null) {
+ syncDelete(context, namespace, key);
+ return;
+ }
+
+ String currentValue = get(namespace, key);
+ if (value.equals(currentValue)) {
+ // Already set, ignore
+ return;
+ }
+
+ OneTimeSettingsListener observer = new OneTimeSettingsListener(context, namespace, key,
+ DEFAULT_TIMEOUT_MS);
+ set(namespace, key, value);
+ observer.assertCalled();
+ assertNewValue(namespace, key, value);
+ }
+
+ /**
+ * Uses a Shell command to "asynchronously" delete the given preference, returning right away.
+ */
+ public static void delete(@NonNull String namespace, @NonNull String key) {
+ ShellHelper.runShellCommand("settings delete %s %s", namespace, key);
+ }
+
+ /**
+ * Uses a Shell command to "synchronously" delete the given preference by registering a listener
+ * and wait until it's called.
+ */
+ public static void syncDelete(@NonNull Context context, @NonNull String namespace,
+ @NonNull String key) {
+ String currentValue = get(namespace, key);
+ if (currentValue == null || currentValue.equals("null")) {
+ // Already set, ignore
+ return;
+ }
+
+ OneTimeSettingsListener observer = new OneTimeSettingsListener(context, namespace, key,
+ DEFAULT_TIMEOUT_MS);
+ delete(namespace, key);
+ observer.assertCalled();
+ assertNewValue(namespace, key, "null");
+ }
+
+ /**
+ * Gets the value of a given preference using Shell command.
+ */
+ @NonNull
+ public static String get(@NonNull String namespace, @NonNull String key) {
+ return ShellHelper.runShellCommand("settings get %s %s", namespace, key);
+ }
+
+ private static void assertNewValue(@NonNull String namespace, @NonNull String key,
+ @Nullable String expectedValue) {
+ String actualValue = get(namespace, key);
+ if (!Objects.equals(actualValue, expectedValue)) {
+ throw new AssertionError("invalid value for " + namespace + ":" + key + ": expected '"
+ + actualValue + "' , got '" + expectedValue + "'");
+ }
+ }
+
+ private SettingsHelper() {
+ throw new UnsupportedOperationException("contain static methods only");
+ }
+}
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/SettingsStateKeeperRule.java b/apct-tests/perftests/utils/src/android/perftests/utils/SettingsStateKeeperRule.java
new file mode 100644
index 000000000000..a8e2fdf3388d
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/SettingsStateKeeperRule.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.perftests.utils;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.annotation.NonNull;
+
+/**
+ * JUnit rule used to restore a {@link Settings} preference after the test is run.
+ *
+ * <p>It stores the current value before the test, and restores it after the test (if necessary).
+ */
+public class SettingsStateKeeperRule extends StateKeeperRule<String> {
+
+ /**
+ * Default constructor.
+ *
+ * @param context context used to retrieve the {@link Settings} provider.
+ * @param key prefence key.
+ */
+ public SettingsStateKeeperRule(@NonNull Context context, @NonNull String key) {
+ super(new SettingsStateManager(context, SettingsHelper.NAMESPACE_SECURE, key));
+ }
+}
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/SettingsStateManager.java b/apct-tests/perftests/utils/src/android/perftests/utils/SettingsStateManager.java
new file mode 100644
index 000000000000..13ad66a70ffd
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/SettingsStateManager.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.perftests.utils;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * Manages the state of a preference backed by {@link Settings}.
+ */
+public class SettingsStateManager implements StateManager<String> {
+
+ private final Context mContext;
+ private final String mNamespace;
+ private final String mKey;
+
+ /**
+ * Default constructor.
+ *
+ * @param context context used to retrieve the {@link Settings} provider.
+ * @param namespace settings namespace.
+ * @param key prefence key.
+ */
+ public SettingsStateManager(@NonNull Context context, @NonNull String namespace,
+ @NonNull String key) {
+ mContext = context;
+ mNamespace = namespace;
+ mKey = key;
+ }
+
+ @Override
+ public void set(@Nullable String value) {
+ SettingsHelper.syncSet(mContext, mNamespace, mKey, value);
+ }
+
+ @Override
+ @Nullable
+ public String get() {
+ return SettingsHelper.get(mNamespace, mKey);
+ }
+
+ @Override
+ public String toString() {
+ return "SettingsStateManager[namespace=" + mNamespace + ", key=" + mKey + "]";
+ }
+}
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/ShellHelper.java b/apct-tests/perftests/utils/src/android/perftests/utils/ShellHelper.java
new file mode 100644
index 000000000000..895547df0393
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/ShellHelper.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.perftests.utils;
+
+import android.app.UiAutomation;
+import android.os.ParcelFileDescriptor;
+import android.support.test.InstrumentationRegistry;
+import android.text.TextUtils;
+import android.util.AndroidRuntimeException;
+import android.util.Log;
+
+import java.io.FileInputStream;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Provides Shell-based utilities such as running a command.
+ */
+public final class ShellHelper {
+
+ /**
+ * Runs a Shell command, returning a trimmed response.
+ */
+ @NonNull
+ public static String runShellCommand(@NonNull String template, Object...args) {
+ String command = String.format(template, args);
+ return runShellCommandRaw(command);
+ }
+
+ /**
+ * Runs a Shell command, returning a trimmed response.
+ */
+ @NonNull
+ public static String runShellCommandRaw(@NonNull String command) {
+ UiAutomation automan = InstrumentationRegistry.getInstrumentation()
+ .getUiAutomation();
+ ParcelFileDescriptor pfd = automan.executeShellCommand(command);
+ byte[] buf = new byte[512];
+ int bytesRead;
+ try(FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) {
+ StringBuilder stdout = new StringBuilder();
+ while ((bytesRead = fis.read(buf)) != -1) {
+ stdout.append(new String(buf, 0, bytesRead));
+ }
+ String result = stdout.toString();
+ return TextUtils.isEmpty(result) ? "" : result.trim();
+ } catch (Exception e) {
+ throw new AndroidRuntimeException("Command '" + command + "' failed: ", e);
+ } finally {
+ // Must disconnect UI automation after every call, otherwise its accessibility service
+ // skews the performance tests.
+ automan.destroy();
+ }
+ }
+
+ private ShellHelper() {
+ throw new UnsupportedOperationException("contain static methods only");
+ }
+}
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/StateKeeperRule.java b/apct-tests/perftests/utils/src/android/perftests/utils/StateKeeperRule.java
new file mode 100644
index 000000000000..1bb09b2a69ca
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/StateKeeperRule.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.perftests.utils;
+
+import androidx.annotation.NonNull;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import java.util.Objects;
+
+/**
+ * JUnit rule used to restore a state after the test is run.
+ *
+ * <p>It stores the current state before the test, and restores it after the test (if necessary).
+ */
+public class StateKeeperRule<T> implements TestRule {
+
+ private final StateManager<T> mStateManager;
+
+ /**
+ * Default constructor.
+ *
+ * @param stateManager abstraction used to manage the state.
+ */
+ public StateKeeperRule(StateManager<T> stateManager) {
+ mStateManager = stateManager;
+ }
+
+ @Override
+ public Statement apply(Statement base, Description description) {
+ return new Statement() {
+
+ @Override
+ public void evaluate() throws Throwable {
+ final T previousValue = mStateManager.get();
+ try {
+ base.evaluate();
+ } finally {
+ final T currentValue = mStateManager.get();
+ if (!Objects.equals(previousValue, currentValue)) {
+ mStateManager.set(previousValue);
+ }
+ }
+ }
+ };
+ }
+}
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/StateManager.java b/apct-tests/perftests/utils/src/android/perftests/utils/StateManager.java
new file mode 100644
index 000000000000..5fc499a9e6a1
--- /dev/null
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/StateManager.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.perftests.utils;
+
+import androidx.annotation.Nullable;
+
+/**
+ * Abstraction for a state that is managed somewhere, like Android Settings.
+ */
+public interface StateManager<T> {
+
+ /**
+ * Sets a new state.
+ */
+ void set(@Nullable T value);
+
+ /**
+ * Gets the current state.
+ */
+ @Nullable T get();
+}
diff --git a/api/current.txt b/api/current.txt
index 557d5365a92c..d5fd889e3e94 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -966,6 +966,10 @@ package android {
field public static final int onClick = 16843375; // 0x101026f
field public static final int oneshot = 16843159; // 0x1010197
field public static final int opacity = 16843550; // 0x101031e
+ field public static final int opticalInsetBottom = 16844170; // 0x101058a
+ field public static final int opticalInsetLeft = 16844167; // 0x1010587
+ field public static final int opticalInsetRight = 16844169; // 0x1010589
+ field public static final int opticalInsetTop = 16844168; // 0x1010588
field public static final int order = 16843242; // 0x10101ea
field public static final int orderInCategory = 16843231; // 0x10101df
field public static final int ordering = 16843490; // 0x10102e2
@@ -4207,8 +4211,8 @@ package android.app {
}
public class AppOpsManager {
- method public int checkOp(java.lang.String, int, java.lang.String);
- method public int checkOpNoThrow(java.lang.String, int, java.lang.String);
+ method public deprecated int checkOp(java.lang.String, int, java.lang.String);
+ method public deprecated int checkOpNoThrow(java.lang.String, int, java.lang.String);
method public void checkPackage(int, java.lang.String);
method public void finishOp(java.lang.String, int, java.lang.String);
method public int noteOp(java.lang.String, int, java.lang.String);
@@ -4219,10 +4223,15 @@ package android.app {
method public int startOp(java.lang.String, int, java.lang.String);
method public int startOpNoThrow(java.lang.String, int, java.lang.String);
method public void startWatchingMode(java.lang.String, java.lang.String, android.app.AppOpsManager.OnOpChangedListener);
+ method public void startWatchingMode(java.lang.String, java.lang.String, int, android.app.AppOpsManager.OnOpChangedListener);
method public void stopWatchingMode(android.app.AppOpsManager.OnOpChangedListener);
+ method public int unsafeCheckOp(java.lang.String, int, java.lang.String);
+ method public int unsafeCheckOpNoThrow(java.lang.String, int, java.lang.String);
+ method public int unsafeCheckOpRaw(java.lang.String, int, java.lang.String);
field public static final int MODE_ALLOWED = 0; // 0x0
field public static final int MODE_DEFAULT = 3; // 0x3
field public static final int MODE_ERRORED = 2; // 0x2
+ field public static final int MODE_FOREGROUND = 4; // 0x4
field public static final int MODE_IGNORED = 1; // 0x1
field public static final java.lang.String OPSTR_ADD_VOICEMAIL = "android:add_voicemail";
field public static final java.lang.String OPSTR_ANSWER_PHONE_CALLS = "android:answer_phone_calls";
@@ -4258,6 +4267,7 @@ package android.app {
field public static final java.lang.String OPSTR_WRITE_CONTACTS = "android:write_contacts";
field public static final java.lang.String OPSTR_WRITE_EXTERNAL_STORAGE = "android:write_external_storage";
field public static final java.lang.String OPSTR_WRITE_SETTINGS = "android:write_settings";
+ field public static final int WATCH_FOREGROUND_CHANGES = 1; // 0x1
}
public static abstract interface AppOpsManager.OnOpChangedListener {
@@ -6110,8 +6120,10 @@ package android.app {
}
public final class UiAutomation {
+ method public void adoptShellPermissionIdentity();
method public void clearWindowAnimationFrameStats();
method public boolean clearWindowContentFrameStats(int);
+ method public void dropShellPermissionIdentity();
method public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(java.lang.Runnable, android.app.UiAutomation.AccessibilityEventFilter, long) throws java.util.concurrent.TimeoutException;
method public android.os.ParcelFileDescriptor executeShellCommand(java.lang.String);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
@@ -9125,6 +9137,7 @@ package android.content {
method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException;
method public final android.net.Uri canonicalize(android.net.Uri) throws android.os.RemoteException;
method public void close();
+ method public static void closeQuietly(android.content.ContentProviderClient);
method public int delete(android.net.Uri, java.lang.String, java.lang.String[]) throws android.os.RemoteException;
method public android.content.ContentProvider getLocalContentProvider();
method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String) throws android.os.RemoteException;
@@ -10127,6 +10140,7 @@ package android.content {
field public static final int FLAG_ACTIVITY_SINGLE_TOP = 536870912; // 0x20000000
field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
field public static final int FLAG_DEBUG_LOG_RESOLUTION = 8; // 0x8
+ field public static final int FLAG_DIRECT_BOOT_AUTO = 256; // 0x100
field public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 16; // 0x10
field public static final int FLAG_FROM_BACKGROUND = 4; // 0x4
field public static final int FLAG_GRANT_PERSISTABLE_URI_PERMISSION = 64; // 0x40
@@ -11378,6 +11392,7 @@ package android.content.pm {
field public static final int INSTALL_REASON_USER = 4; // 0x4
field public static final int MATCH_ALL = 131072; // 0x20000
field public static final int MATCH_DEFAULT_ONLY = 65536; // 0x10000
+ field public static final int MATCH_DIRECT_BOOT_AUTO = 268435456; // 0x10000000
field public static final int MATCH_DIRECT_BOOT_AWARE = 524288; // 0x80000
field public static final int MATCH_DIRECT_BOOT_UNAWARE = 262144; // 0x40000
field public static final int MATCH_DISABLED_COMPONENTS = 512; // 0x200
@@ -12655,22 +12670,30 @@ package android.database.sqlite {
ctor public SQLiteQueryBuilder();
method public static void appendColumns(java.lang.StringBuilder, java.lang.String[]);
method public void appendWhere(java.lang.CharSequence);
+ method public void appendWhere(java.lang.CharSequence, java.lang.String...);
method public void appendWhereEscapeString(java.lang.String);
+ method public void appendWhereEscapeString(java.lang.String, java.lang.String...);
+ method public void appendWhereExpression(java.lang.CharSequence);
+ method public void appendWhereExpression(java.lang.CharSequence, java.lang.String...);
method public java.lang.String buildQuery(java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method public deprecated java.lang.String buildQuery(java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method public static java.lang.String buildQueryString(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method public java.lang.String buildUnionQuery(java.lang.String[], java.lang.String, java.lang.String);
method public java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method public deprecated java.lang.String buildUnionSubQuery(java.lang.String, java.lang.String[], java.util.Set<java.lang.String>, int, java.lang.String, java.lang.String, java.lang.String[], java.lang.String, java.lang.String);
+ method public int delete(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String[]);
method public java.lang.String getTables();
method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
+ method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
method public void setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
method public void setDistinct(boolean);
method public void setProjectionMap(java.util.Map<java.lang.String, java.lang.String>);
method public void setStrict(boolean);
method public void setTables(java.lang.String);
+ method public int update(android.database.sqlite.SQLiteDatabase, android.content.ContentValues, java.lang.String, java.lang.String[]);
}
public class SQLiteReadOnlyDatabaseException extends android.database.sqlite.SQLiteException {
@@ -13748,6 +13771,16 @@ package android.graphics {
field public static final int YV12 = 842094169; // 0x32315659
}
+ public class Insets {
+ method public static android.graphics.Insets of(int, int, int, int);
+ method public static android.graphics.Insets of(android.graphics.Rect);
+ field public static final android.graphics.Insets NONE;
+ field public final int bottom;
+ field public final int left;
+ field public final int right;
+ field public final int top;
+ }
+
public class Interpolator {
ctor public Interpolator(int);
ctor public Interpolator(int, int);
@@ -14189,13 +14222,11 @@ package android.graphics {
ctor public Picture();
ctor public Picture(android.graphics.Picture);
method public android.graphics.Canvas beginRecording(int, int);
- method public static deprecated android.graphics.Picture createFromStream(java.io.InputStream);
method public void draw(android.graphics.Canvas);
method public void endRecording();
method public int getHeight();
method public int getWidth();
method public boolean requiresHardwareAcceleration();
- method public deprecated void writeToStream(java.io.OutputStream);
}
public class PixelFormat {
@@ -14716,6 +14747,7 @@ package android.graphics.drawable {
method public int getMinimumHeight();
method public int getMinimumWidth();
method public abstract int getOpacity();
+ method public android.graphics.Insets getOpticalInsets();
method public void getOutline(android.graphics.Outline);
method public boolean getPadding(android.graphics.Rect);
method public int[] getState();
@@ -15074,6 +15106,10 @@ package android.graphics.drawable {
public class StateListDrawable extends android.graphics.drawable.DrawableContainer {
ctor public StateListDrawable();
method public void addState(int[], android.graphics.drawable.Drawable);
+ method public int getStateCount();
+ method public android.graphics.drawable.Drawable getStateDrawable(int);
+ method public int getStateDrawableIndex(int[]);
+ method public int[] getStateSet(int);
}
public class TransitionDrawable extends android.graphics.drawable.LayerDrawable implements android.graphics.drawable.Drawable.Callback {
@@ -20852,6 +20888,7 @@ package android.icu.util {
field public static final android.icu.util.MeasureUnit PICOMETER;
field public static final android.icu.util.MeasureUnit PINT;
field public static final android.icu.util.MeasureUnit PINT_METRIC;
+ field public static final android.icu.util.MeasureUnit POINT;
field public static final android.icu.util.MeasureUnit POUND;
field public static final android.icu.util.MeasureUnit POUND_PER_SQUARE_INCH;
field public static final android.icu.util.MeasureUnit QUART;
@@ -24482,7 +24519,8 @@ package android.media {
public final class MediaTimestamp {
method public long getAnchorMediaTimeUs();
- method public long getAnchorSytemNanoTime();
+ method public long getAnchorSystemNanoTime();
+ method public deprecated long getAnchorSytemNanoTime();
method public float getMediaClockRate();
field public static final android.media.MediaTimestamp TIMESTAMP_UNKNOWN;
}
@@ -26140,6 +26178,7 @@ package android.media.tv {
field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+ field public static final java.lang.String COLUMN_SERIES_ID = "series_id";
field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
@@ -26202,6 +26241,7 @@ package android.media.tv {
field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
field public static final deprecated java.lang.String COLUMN_SEASON_NUMBER = "season_number";
field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+ field public static final java.lang.String COLUMN_SERIES_ID = "series_id";
field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
@@ -26266,6 +26306,7 @@ package android.media.tv {
field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+ field public static final java.lang.String COLUMN_SERIES_ID = "series_id";
field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
@@ -26325,6 +26366,7 @@ package android.media.tv {
field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
field public static final java.lang.String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number";
field public static final java.lang.String COLUMN_SEASON_TITLE = "season_title";
+ field public static final java.lang.String COLUMN_SERIES_ID = "series_id";
field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
field public static final java.lang.String COLUMN_STARTING_PRICE = "starting_price";
field public static final java.lang.String COLUMN_THUMBNAIL_ASPECT_RATIO = "poster_thumbnail_aspect_ratio";
@@ -32193,6 +32235,7 @@ package android.os {
field public static final int O = 26; // 0x1a
field public static final int O_MR1 = 27; // 0x1b
field public static final int P = 28; // 0x1c
+ field public static final int Q = 10000; // 0x2710
}
public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable {
@@ -32513,6 +32556,21 @@ package android.os {
ctor public FileUriExposedException(java.lang.String);
}
+ public class FileUtils {
+ method public static void closeQuietly(java.lang.AutoCloseable);
+ method public static void closeQuietly(java.io.FileDescriptor);
+ method public static long copy(java.io.File, java.io.File) throws java.io.IOException;
+ method public static long copy(java.io.File, java.io.File, android.os.CancellationSignal, java.util.concurrent.Executor, android.os.FileUtils.ProgressListener) throws java.io.IOException;
+ method public static long copy(java.io.InputStream, java.io.OutputStream) throws java.io.IOException;
+ method public static long copy(java.io.InputStream, java.io.OutputStream, android.os.CancellationSignal, java.util.concurrent.Executor, android.os.FileUtils.ProgressListener) throws java.io.IOException;
+ method public static long copy(java.io.FileDescriptor, java.io.FileDescriptor) throws java.io.IOException;
+ method public static long copy(java.io.FileDescriptor, java.io.FileDescriptor, android.os.CancellationSignal, java.util.concurrent.Executor, android.os.FileUtils.ProgressListener) throws java.io.IOException;
+ }
+
+ public static abstract interface FileUtils.ProgressListener {
+ method public abstract void onProgress(long);
+ }
+
public class Handler {
ctor public Handler();
ctor public Handler(android.os.Handler.Callback);
@@ -32525,6 +32583,7 @@ package android.os {
method public final android.os.Looper getLooper();
method public java.lang.String getMessageName(android.os.Message);
method public void handleMessage(android.os.Message);
+ method public final boolean hasCallbacks(java.lang.Runnable);
method public final boolean hasMessages(int);
method public final boolean hasMessages(int, java.lang.Object);
method public final android.os.Message obtainMessage();
@@ -32755,6 +32814,7 @@ package android.os {
method public java.util.ArrayList readArrayList(java.lang.ClassLoader);
method public void readBinderArray(android.os.IBinder[]);
method public void readBinderList(java.util.List<android.os.IBinder>);
+ method public boolean readBoolean();
method public void readBooleanArray(boolean[]);
method public android.os.Bundle readBundle();
method public android.os.Bundle readBundle(java.lang.ClassLoader);
@@ -32777,6 +32837,7 @@ package android.os {
method public void readMap(java.util.Map, java.lang.ClassLoader);
method public <T extends android.os.Parcelable> T readParcelable(java.lang.ClassLoader);
method public android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
+ method public <T extends android.os.Parcelable> java.util.List<T> readParcelableList(java.util.List<T>, java.lang.ClassLoader);
method public android.os.PersistableBundle readPersistableBundle();
method public android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
method public java.io.Serializable readSerializable();
@@ -32800,6 +32861,7 @@ package android.os {
method public void writeArray(java.lang.Object[]);
method public void writeBinderArray(android.os.IBinder[]);
method public void writeBinderList(java.util.List<android.os.IBinder>);
+ method public void writeBoolean(boolean);
method public void writeBooleanArray(boolean[]);
method public void writeBundle(android.os.Bundle);
method public void writeByte(byte);
@@ -32822,6 +32884,7 @@ package android.os {
method public void writeNoException();
method public void writeParcelable(android.os.Parcelable, int);
method public <T extends android.os.Parcelable> void writeParcelableArray(T[], int);
+ method public <T extends android.os.Parcelable> void writeParcelableList(java.util.List<T>, int);
method public void writePersistableBundle(android.os.PersistableBundle);
method public void writeSerializable(java.io.Serializable);
method public void writeSize(android.util.Size);
@@ -33173,7 +33236,9 @@ package android.os {
method public android.os.StrictMode.VmPolicy.Builder detectAll();
method public android.os.StrictMode.VmPolicy.Builder detectCleartextNetwork();
method public android.os.StrictMode.VmPolicy.Builder detectContentUriWithoutPermission();
+ method public android.os.StrictMode.VmPolicy.Builder detectCredentialProtectedWhileLocked();
method public android.os.StrictMode.VmPolicy.Builder detectFileUriExposure();
+ method public android.os.StrictMode.VmPolicy.Builder detectImplicitDirectBoot();
method public android.os.StrictMode.VmPolicy.Builder detectLeakedClosableObjects();
method public android.os.StrictMode.VmPolicy.Builder detectLeakedRegistrationObjects();
method public android.os.StrictMode.VmPolicy.Builder detectLeakedSqlLiteObjects();
@@ -33221,8 +33286,12 @@ package android.os {
}
public final class Trace {
+ method public static void beginAsyncSection(java.lang.String, int);
method public static void beginSection(java.lang.String);
+ method public static void endAsyncSection(java.lang.String, int);
method public static void endSection();
+ method public static boolean isEnabled();
+ method public static void setCounter(java.lang.String, int);
}
public class TransactionTooLargeException extends android.os.RemoteException {
@@ -33575,6 +33644,9 @@ package android.os.strictmode {
public final class ContentUriWithoutPermissionViolation extends android.os.strictmode.Violation {
}
+ public final class CredentialProtectedWhileLockedViolation extends android.os.strictmode.Violation {
+ }
+
public final class CustomViolation extends android.os.strictmode.Violation {
}
@@ -33587,6 +33659,9 @@ package android.os.strictmode {
public final class FileUriExposedViolation extends android.os.strictmode.Violation {
}
+ public final class ImplicitDirectBootViolation extends android.os.strictmode.Violation {
+ }
+
public class InstanceCountViolation extends android.os.strictmode.Violation {
method public long getNumberOfInstances();
}
@@ -39621,6 +39696,7 @@ package android.service.voice {
field public static final int SHOW_SOURCE_ACTIVITY = 16; // 0x10
field public static final int SHOW_SOURCE_APPLICATION = 8; // 0x8
field public static final int SHOW_SOURCE_ASSIST_GESTURE = 4; // 0x4
+ field public static final int SHOW_SOURCE_PUSH_TO_TALK = 32; // 0x20
field public static final int SHOW_WITH_ASSIST = 1; // 0x1
field public static final int SHOW_WITH_SCREENSHOT = 2; // 0x2
}
@@ -40973,6 +41049,7 @@ package android.telecom {
method public void onReject(java.lang.String);
method public void onSeparate();
method public void onShowIncomingCallUi();
+ method public void onSilence();
method public void onStartRtt(android.telecom.Connection.RttTextStream);
method public void onStateChanged(int);
method public void onStopDtmfTone();
@@ -41766,6 +41843,7 @@ package android.telephony {
field public static final java.lang.String KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL = "sms_requires_destination_number_conversion_bool";
field public static final java.lang.String KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL = "support_3gpp_call_forwarding_while_roaming_bool";
field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool";
+ field public static final java.lang.String KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL = "support_emergency_sms_over_ims_bool";
field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool";
field public static final java.lang.String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool";
field public static final java.lang.String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool";
@@ -42365,8 +42443,10 @@ package android.telephony {
method public java.lang.CharSequence getDisplayName();
method public java.lang.String getIccId();
method public int getIconTint();
- method public int getMcc();
- method public int getMnc();
+ method public deprecated int getMcc();
+ method public java.lang.String getMccString();
+ method public deprecated int getMnc();
+ method public java.lang.String getMncString();
method public java.lang.String getNumber();
method public int getSimSlotIndex();
method public int getSubscriptionId();
@@ -42460,6 +42540,8 @@ package android.telephony {
method public java.lang.String getImei();
method public java.lang.String getImei(int);
method public java.lang.String getLine1Number();
+ method public java.lang.String getManufacturerCode();
+ method public java.lang.String getManufacturerCode(int);
method public java.lang.String getMeid();
method public java.lang.String getMeid(int);
method public java.lang.String getMmsUAProfUrl();
@@ -42484,6 +42566,8 @@ package android.telephony {
method public int getSimState();
method public int getSimState(int);
method public java.lang.String getSubscriberId();
+ method public java.lang.String getTypeAllocationCode();
+ method public java.lang.String getTypeAllocationCode(int);
method public java.lang.String getVisualVoicemailPackageName();
method public java.lang.String getVoiceMailAlphaTag();
method public java.lang.String getVoiceMailNumber();
@@ -42696,7 +42780,8 @@ package android.telephony.data {
method public int getAuthType();
method public java.lang.String getEntryName();
method public int getId();
- method public java.net.InetAddress getMmsProxyAddress();
+ method public deprecated java.net.InetAddress getMmsProxyAddress();
+ method public java.lang.String getMmsProxyAddressAsString();
method public int getMmsProxyPort();
method public android.net.Uri getMmsc();
method public int getMvnoType();
@@ -42704,7 +42789,8 @@ package android.telephony.data {
method public java.lang.String getOperatorNumeric();
method public java.lang.String getPassword();
method public int getProtocol();
- method public java.net.InetAddress getProxyAddress();
+ method public deprecated java.net.InetAddress getProxyAddress();
+ method public java.lang.String getProxyAddressAsString();
method public int getProxyPort();
method public int getRoamingProtocol();
method public java.lang.String getUser();
@@ -42724,7 +42810,7 @@ package android.telephony.data {
field public static final int PROTOCOL_IPV6 = 1; // 0x1
field public static final int PROTOCOL_PPP = 3; // 0x3
field public static final int TYPE_CBS = 128; // 0x80
- field public static final int TYPE_DEFAULT = 17; // 0x11
+ field public static final int TYPE_DEFAULT = 1; // 0x1
field public static final int TYPE_DUN = 8; // 0x8
field public static final int TYPE_EMERGENCY = 512; // 0x200
field public static final int TYPE_FOTA = 32; // 0x20
@@ -42743,7 +42829,8 @@ package android.telephony.data {
method public android.telephony.data.ApnSetting.Builder setAuthType(int);
method public android.telephony.data.ApnSetting.Builder setCarrierEnabled(boolean);
method public android.telephony.data.ApnSetting.Builder setEntryName(java.lang.String);
- method public android.telephony.data.ApnSetting.Builder setMmsProxyAddress(java.net.InetAddress);
+ method public deprecated android.telephony.data.ApnSetting.Builder setMmsProxyAddress(java.net.InetAddress);
+ method public android.telephony.data.ApnSetting.Builder setMmsProxyAddress(java.lang.String);
method public android.telephony.data.ApnSetting.Builder setMmsProxyPort(int);
method public android.telephony.data.ApnSetting.Builder setMmsc(android.net.Uri);
method public android.telephony.data.ApnSetting.Builder setMvnoType(int);
@@ -42751,7 +42838,8 @@ package android.telephony.data {
method public android.telephony.data.ApnSetting.Builder setOperatorNumeric(java.lang.String);
method public android.telephony.data.ApnSetting.Builder setPassword(java.lang.String);
method public android.telephony.data.ApnSetting.Builder setProtocol(int);
- method public android.telephony.data.ApnSetting.Builder setProxyAddress(java.net.InetAddress);
+ method public deprecated android.telephony.data.ApnSetting.Builder setProxyAddress(java.net.InetAddress);
+ method public android.telephony.data.ApnSetting.Builder setProxyAddress(java.lang.String);
method public android.telephony.data.ApnSetting.Builder setProxyPort(int);
method public android.telephony.data.ApnSetting.Builder setRoamingProtocol(int);
method public android.telephony.data.ApnSetting.Builder setUser(java.lang.String);
@@ -44692,6 +44780,7 @@ package android.text.util {
public class Linkify {
ctor public Linkify();
method public static final boolean addLinks(android.text.Spannable, int);
+ method public static final boolean addLinks(android.text.Spannable, int, android.text.util.Linkify.UrlSpanFactory);
method public static final boolean addLinks(android.widget.TextView, int);
method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String);
method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
@@ -44699,6 +44788,7 @@ package android.text.util {
method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String);
method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+ method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter, android.text.util.Linkify.UrlSpanFactory);
field public static final int ALL = 15; // 0xf
field public static final int EMAIL_ADDRESSES = 2; // 0x2
field public static final deprecated int MAP_ADDRESSES = 8; // 0x8
@@ -44717,6 +44807,11 @@ package android.text.util {
method public abstract java.lang.String transformUrl(java.util.regex.Matcher, java.lang.String);
}
+ public static class Linkify.UrlSpanFactory {
+ ctor public Linkify.UrlSpanFactory();
+ method public android.text.style.URLSpan create(java.lang.String);
+ }
+
public class Rfc822Token {
ctor public Rfc822Token(java.lang.String, java.lang.String, java.lang.String);
method public java.lang.String getAddress();
@@ -45916,6 +46011,7 @@ package android.view {
public final class Display {
method public long getAppVsyncOffsetNanos();
method public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
+ method public android.view.DisplayCutout getCutout();
method public int getDisplayId();
method public int getFlags();
method public android.view.Display.HdrCapabilities getHdrCapabilities();
@@ -49337,18 +49433,18 @@ package android.view.accessibility {
method public void setCheckable(boolean);
method public void setChecked(boolean);
method public void setClassName(java.lang.CharSequence);
- method public void setClickable(boolean);
+ method public deprecated void setClickable(boolean);
method public void setCollectionInfo(android.view.accessibility.AccessibilityNodeInfo.CollectionInfo);
method public void setCollectionItemInfo(android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo);
method public void setContentDescription(java.lang.CharSequence);
method public void setContentInvalid(boolean);
- method public void setContextClickable(boolean);
- method public void setDismissable(boolean);
+ method public deprecated void setContextClickable(boolean);
+ method public deprecated void setDismissable(boolean);
method public void setDrawingOrder(int);
method public void setEditable(boolean);
method public void setEnabled(boolean);
method public void setError(java.lang.CharSequence);
- method public void setFocusable(boolean);
+ method public deprecated void setFocusable(boolean);
method public void setFocused(boolean);
method public void setHeading(boolean);
method public void setHintText(java.lang.CharSequence);
@@ -49359,7 +49455,7 @@ package android.view.accessibility {
method public void setLabeledBy(android.view.View);
method public void setLabeledBy(android.view.View, int);
method public void setLiveRegion(int);
- method public void setLongClickable(boolean);
+ method public deprecated void setLongClickable(boolean);
method public void setMaxTextLength(int);
method public void setMovementGranularities(int);
method public void setMultiLine(boolean);
@@ -49370,7 +49466,7 @@ package android.view.accessibility {
method public void setPassword(boolean);
method public void setRangeInfo(android.view.accessibility.AccessibilityNodeInfo.RangeInfo);
method public void setScreenReaderFocusable(boolean);
- method public void setScrollable(boolean);
+ method public deprecated void setScrollable(boolean);
method public void setSelected(boolean);
method public void setShowingHintText(boolean);
method public void setSource(android.view.View);
@@ -54055,6 +54151,8 @@ package android.widget {
method protected android.widget.Toolbar.LayoutParams generateDefaultLayoutParams();
method public android.widget.Toolbar.LayoutParams generateLayoutParams(android.util.AttributeSet);
method protected android.widget.Toolbar.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+ method public java.lang.CharSequence getCollapseContentDescription();
+ method public android.graphics.drawable.Drawable getCollapseIcon();
method public int getContentInsetEnd();
method public int getContentInsetEndWithActions();
method public int getContentInsetLeft();
@@ -54082,6 +54180,10 @@ package android.widget {
method public boolean hideOverflowMenu();
method public void inflateMenu(int);
method public boolean isOverflowMenuShowing();
+ method public void setCollapseContentDescription(int);
+ method public void setCollapseContentDescription(java.lang.CharSequence);
+ method public void setCollapseIcon(int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable);
method public void setContentInsetEndWithActions(int);
method public void setContentInsetStartWithNavigation(int);
method public void setContentInsetsAbsolute(int, int);
@@ -70111,7 +70213,7 @@ package java.util.regex {
method public java.util.regex.Matcher reset();
method public java.util.regex.Matcher reset(java.lang.CharSequence);
method public int start();
- method public int start(int) throws java.lang.IllegalStateException;
+ method public int start(int);
method public int start(java.lang.String);
method public java.util.regex.MatchResult toMatchResult();
method public java.util.regex.Matcher useAnchoringBounds(boolean);
@@ -70122,7 +70224,7 @@ package java.util.regex {
public final class Pattern implements java.io.Serializable {
method public java.util.function.Predicate<java.lang.String> asPredicate();
method public static java.util.regex.Pattern compile(java.lang.String);
- method public static java.util.regex.Pattern compile(java.lang.String, int) throws java.util.regex.PatternSyntaxException;
+ method public static java.util.regex.Pattern compile(java.lang.String, int);
method public int flags();
method public java.util.regex.Matcher matcher(java.lang.CharSequence);
method public static boolean matches(java.lang.String, java.lang.CharSequence);
diff --git a/api/removed.txt b/api/removed.txt
index f35348ec8bfd..b6dabcd8614b 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -239,6 +239,11 @@ package android.graphics {
method public deprecated android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
}
+ public class Picture {
+ method public static deprecated android.graphics.Picture createFromStream(java.io.InputStream);
+ method public deprecated void writeToStream(java.io.OutputStream);
+ }
+
public deprecated class PixelXorXfermode extends android.graphics.Xfermode {
ctor public PixelXorXfermode(int);
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 3a32eca57fd0..bbc12ecada0b 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -255,6 +255,7 @@ package android.app {
method public int getUidImportance(int);
method public void killUid(int, java.lang.String);
method public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
+ method public static void setPersistentVrThread(int);
}
public static abstract interface ActivityManager.OnUidImportanceListener {
@@ -268,6 +269,7 @@ package android.app {
public class AppOpsManager {
method public static java.lang.String[] getOpStrs();
+ method public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, java.lang.String, int[]);
method public void setMode(java.lang.String, int, java.lang.String, int);
method public void setUidMode(java.lang.String, int, int);
field public static final java.lang.String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
@@ -315,6 +317,33 @@ package android.app {
field public static final java.lang.String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
}
+ public static final class AppOpsManager.OpEntry implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getDuration();
+ method public long getLastAccessBackgroundTime();
+ method public long getLastAccessForegroundTime();
+ method public long getLastAccessTime();
+ method public long getLastRejectBackgroundTime();
+ method public long getLastRejectForegroundTime();
+ method public long getLastRejectTime();
+ method public int getMode();
+ method public java.lang.String getOpStr();
+ method public java.lang.String getProxyPackageName();
+ method public int getProxyUid();
+ method public boolean isRunning();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEntry> CREATOR;
+ }
+
+ public static final class AppOpsManager.PackageOps implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.util.List<android.app.AppOpsManager.OpEntry> getOps();
+ method public java.lang.String getPackageName();
+ method public int getUid();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.AppOpsManager.PackageOps> CREATOR;
+ }
+
public class BroadcastOptions {
method public static android.app.BroadcastOptions makeBasic();
method public void setDontSendToRestrictedApps(boolean);
@@ -409,9 +438,49 @@ package android.app {
ctor public StatsManager.StatsUnavailableException(java.lang.String, java.lang.Throwable);
}
+ public final class Vr2dDisplayProperties implements android.os.Parcelable {
+ ctor public Vr2dDisplayProperties(int, int, int);
+ method public int describeContents();
+ method public void dump(java.io.PrintWriter, java.lang.String);
+ method public int getAddedFlags();
+ method public int getDpi();
+ method public int getHeight();
+ method public int getRemovedFlags();
+ method public int getWidth();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.Vr2dDisplayProperties> CREATOR;
+ field public static final int FLAG_VIRTUAL_DISPLAY_ENABLED = 1; // 0x1
+ }
+
+ public static class Vr2dDisplayProperties.Builder {
+ ctor public Vr2dDisplayProperties.Builder();
+ method public android.app.Vr2dDisplayProperties.Builder addFlags(int);
+ method public android.app.Vr2dDisplayProperties build();
+ method public android.app.Vr2dDisplayProperties.Builder removeFlags(int);
+ method public android.app.Vr2dDisplayProperties.Builder setDimensions(int, int, int);
+ method public android.app.Vr2dDisplayProperties.Builder setEnabled(boolean);
+ }
+
+ public static abstract class Vr2dDisplayProperties.Vr2dDisplayFlag implements java.lang.annotation.Annotation {
+ }
+
public class VrManager {
+ method public int getVr2dDisplayId();
+ method public boolean isPersistentVrModeEnabled();
+ method public boolean isVrModeEnabled();
+ method public void registerVrStateCallback(java.util.concurrent.Executor, android.app.VrStateCallback);
method public void setAndBindVrCompositor(android.content.ComponentName);
method public void setPersistentVrModeEnabled(boolean);
+ method public void setStandbyEnabled(boolean);
+ method public void setVr2dDisplayProperties(android.app.Vr2dDisplayProperties);
+ method public void setVrInputMethod(android.content.ComponentName);
+ method public void unregisterVrStateCallback(android.app.VrStateCallback);
+ }
+
+ public abstract class VrStateCallback {
+ ctor public VrStateCallback();
+ method public void onPersistentVrStateChanged(boolean);
+ method public void onVrStateChanged(boolean);
}
public class WallpaperManager {
@@ -497,6 +566,7 @@ package android.app.backup {
method public long getAvailableRestoreToken(java.lang.String);
method public android.content.Intent getConfigurationIntent(java.lang.String);
method public java.lang.String getCurrentTransport();
+ method public android.content.ComponentName getCurrentTransportComponent();
method public android.content.Intent getDataManagementIntent(java.lang.String);
method public java.lang.String getDataManagementLabel(java.lang.String);
method public java.lang.String getDestinationString(java.lang.String);
@@ -1021,7 +1091,11 @@ package android.content.pm {
}
public class PackageItemInfo {
- method public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager);
+ method public deprecated java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager);
+ method public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager, float, int);
+ field public static final int SAFE_LABEL_FLAG_FIRST_LINE = 4; // 0x4
+ field public static final int SAFE_LABEL_FLAG_SINGLE_LINE = 2; // 0x2
+ field public static final int SAFE_LABEL_FLAG_TRIM = 1; // 0x1
}
public abstract class PackageManager {
@@ -1128,6 +1202,9 @@ package android.content.pm {
}
public class PermissionGroupInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
+ field public int backgroundRequestDetailResourceId;
+ field public int backgroundRequestResourceId;
+ field public int requestDetailResourceId;
field public int requestRes;
}
@@ -1135,6 +1212,7 @@ package android.content.pm {
field public static final int FLAG_REMOVED = 2; // 0x2
field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000
field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
+ field public java.lang.String backgroundPermission;
field public int requestRes;
}
@@ -3088,6 +3166,37 @@ package android.net {
method public void onTetheringStarted();
}
+ public final class IpSecManager {
+ method public void applyTunnelModeTransform(android.net.IpSecManager.IpSecTunnelInterface, int, android.net.IpSecTransform) throws java.io.IOException;
+ method public android.net.IpSecManager.IpSecTunnelInterface createIpSecTunnelInterface(java.net.InetAddress, java.net.InetAddress, android.net.Network) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
+ }
+
+ public static final class IpSecManager.IpSecTunnelInterface implements java.lang.AutoCloseable {
+ method public void addAddress(java.net.InetAddress, int) throws java.io.IOException;
+ method public void close();
+ method public java.lang.String getInterfaceName();
+ method public void removeAddress(java.net.InetAddress, int) throws java.io.IOException;
+ }
+
+ public final class IpSecTransform implements java.lang.AutoCloseable {
+ method public void startNattKeepalive(android.net.IpSecTransform.NattKeepaliveCallback, int, android.os.Handler) throws java.io.IOException;
+ method public void stopNattKeepalive();
+ }
+
+ public static class IpSecTransform.Builder {
+ method public android.net.IpSecTransform buildTunnelModeTransform(java.net.InetAddress, android.net.IpSecManager.SecurityParameterIndex) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
+ }
+
+ public static class IpSecTransform.NattKeepaliveCallback {
+ ctor public IpSecTransform.NattKeepaliveCallback();
+ method public void onError(int);
+ method public void onStarted();
+ method public void onStopped();
+ field public static final int ERROR_HARDWARE_ERROR = 3; // 0x3
+ field public static final int ERROR_HARDWARE_UNSUPPORTED = 2; // 0x2
+ field public static final int ERROR_INVALID_NETWORK = 1; // 0x1
+ }
+
public final class NetworkCapabilities implements android.os.Parcelable {
field public static final int NET_CAPABILITY_OEM_PAID = 22; // 0x16
}
@@ -3818,6 +3927,7 @@ package android.os {
method public void readFromParcel(android.os.Parcel);
method public int sectionCount();
method public void setAll(boolean);
+ method public void setPrivacyPolicy(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.IncidentReportArgs> CREATOR;
}
@@ -4237,6 +4347,7 @@ package android.provider {
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean);
method public static void resetToDefaults(android.content.ContentResolver, java.lang.String);
+ field public static final java.lang.String APP_STANDBY_ENABLED = "app_standby_enabled";
field public static final java.lang.String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages";
field public static final java.lang.String CARRIER_APP_NAMES = "carrier_app_names";
field public static final java.lang.String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
@@ -4553,6 +4664,7 @@ package android.service.notification {
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
field public static final java.lang.String KEY_PEOPLE = "key_people";
+ field public static final java.lang.String KEY_SMART_ACTIONS = "key_smart_actions";
field public static final java.lang.String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
field public static final java.lang.String KEY_USER_SENTIMENT = "key_user_sentiment";
}
@@ -5041,6 +5153,11 @@ package android.telecom {
package android.telephony {
+ public static final class AccessNetworkConstants.TransportType {
+ field public static final int WLAN = 2; // 0x2
+ field public static final int WWAN = 1; // 0x1
+ }
+
public class CarrierConfigManager {
method public static android.os.PersistableBundle getDefaultConfig();
method public void updateConfigForPhoneId(int, java.lang.String);
@@ -5055,6 +5172,66 @@ package android.telephony {
field public static final java.lang.String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
}
+ public class NetworkRegistrationState implements android.os.Parcelable {
+ ctor public NetworkRegistrationState(int, int, int, int, int, boolean, int[], android.telephony.CellIdentity);
+ ctor protected NetworkRegistrationState(android.os.Parcel);
+ method public int describeContents();
+ method public int getAccessNetworkTechnology();
+ method public int[] getAvailableServices();
+ method public android.telephony.CellIdentity getCellIdentity();
+ method public int getDomain();
+ method public int getRegState();
+ method public int getRejectCause();
+ method public int getTransportType();
+ method public boolean isEmergencyEnabled();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.NetworkRegistrationState> CREATOR;
+ field public static final int DOMAIN_CS = 1; // 0x1
+ field public static final int DOMAIN_PS = 2; // 0x2
+ field public static final int REG_STATE_DENIED = 3; // 0x3
+ field public static final int REG_STATE_HOME = 1; // 0x1
+ field public static final int REG_STATE_NOT_REG_NOT_SEARCHING = 0; // 0x0
+ field public static final int REG_STATE_NOT_REG_SEARCHING = 2; // 0x2
+ field public static final int REG_STATE_ROAMING = 5; // 0x5
+ field public static final int REG_STATE_UNKNOWN = 4; // 0x4
+ field public static final int SERVICE_TYPE_DATA = 2; // 0x2
+ field public static final int SERVICE_TYPE_EMERGENCY = 5; // 0x5
+ field public static final int SERVICE_TYPE_SMS = 3; // 0x3
+ field public static final int SERVICE_TYPE_VIDEO = 4; // 0x4
+ field public static final int SERVICE_TYPE_VOICE = 1; // 0x1
+ }
+
+ public abstract class NetworkService extends android.app.Service {
+ ctor public NetworkService();
+ method protected abstract android.telephony.NetworkService.NetworkServiceProvider createNetworkServiceProvider(int);
+ field public static final java.lang.String NETWORK_SERVICE_EXTRA_SLOT_ID = "android.telephony.extra.SLOT_ID";
+ field public static final java.lang.String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService";
+ }
+
+ public class NetworkService.NetworkServiceProvider {
+ ctor public NetworkService.NetworkServiceProvider(int);
+ method public void getNetworkRegistrationState(int, android.telephony.NetworkServiceCallback);
+ method public final int getSlotId();
+ method public final void notifyNetworkRegistrationStateChanged();
+ method protected void onDestroy();
+ }
+
+ public class NetworkServiceCallback {
+ method public void onGetNetworkRegistrationStateComplete(int, android.telephony.NetworkRegistrationState);
+ field public static final int RESULT_ERROR_BUSY = 3; // 0x3
+ field public static final int RESULT_ERROR_FAILED = 5; // 0x5
+ field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4
+ field public static final int RESULT_ERROR_INVALID_ARG = 2; // 0x2
+ field public static final int RESULT_ERROR_UNSUPPORTED = 1; // 0x1
+ field public static final int RESULT_SUCCESS = 0; // 0x0
+ }
+
+ public class ServiceState implements android.os.Parcelable {
+ method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates();
+ method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates(int);
+ method public android.telephony.NetworkRegistrationState getNetworkRegistrationStates(int, int);
+ }
+
public final class SmsManager {
method public void sendMultipartTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
method public void sendTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);
@@ -5257,6 +5434,94 @@ package android.telephony {
}
+package android.telephony.data {
+
+ public final class DataCallResponse implements android.os.Parcelable {
+ ctor public DataCallResponse(int, int, int, int, java.lang.String, java.lang.String, java.util.List<android.net.LinkAddress>, java.util.List<java.net.InetAddress>, java.util.List<java.net.InetAddress>, java.util.List<java.lang.String>, int);
+ ctor public DataCallResponse(android.os.Parcel);
+ method public int describeContents();
+ method public int getActive();
+ method public java.util.List<android.net.LinkAddress> getAddresses();
+ method public int getCallId();
+ method public java.util.List<java.net.InetAddress> getDnses();
+ method public java.util.List<java.net.InetAddress> getGateways();
+ method public java.lang.String getIfname();
+ method public int getMtu();
+ method public java.util.List<java.lang.String> getPcscfs();
+ method public int getStatus();
+ method public int getSuggestedRetryTime();
+ method public java.lang.String getType();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR;
+ }
+
+ public final class DataProfile implements android.os.Parcelable {
+ ctor public DataProfile(int, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, int, int, int, int, boolean, int, java.lang.String, int, int, java.lang.String, java.lang.String, boolean);
+ ctor public DataProfile(android.os.Parcel);
+ method public int describeContents();
+ method public java.lang.String getApn();
+ method public int getAuthType();
+ method public int getBearerBitmap();
+ method public int getMaxConns();
+ method public int getMaxConnsTime();
+ method public int getMtu();
+ method public java.lang.String getMvnoMatchData();
+ method public java.lang.String getMvnoType();
+ method public java.lang.String getPassword();
+ method public int getProfileId();
+ method public java.lang.String getProtocol();
+ method public java.lang.String getRoamingProtocol();
+ method public int getSupportedApnTypesBitmap();
+ method public int getType();
+ method public java.lang.String getUserName();
+ method public int getWaitTime();
+ method public boolean isEnabled();
+ method public boolean isModemCognitive();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.telephony.data.DataProfile> CREATOR;
+ field public static final int TYPE_3GPP = 1; // 0x1
+ field public static final int TYPE_3GPP2 = 2; // 0x2
+ field public static final int TYPE_COMMON = 0; // 0x0
+ }
+
+ public abstract class DataService extends android.app.Service {
+ ctor public DataService();
+ method public abstract android.telephony.data.DataService.DataServiceProvider createDataServiceProvider(int);
+ field public static final java.lang.String DATA_SERVICE_EXTRA_SLOT_ID = "android.telephony.data.extra.SLOT_ID";
+ field public static final java.lang.String DATA_SERVICE_INTERFACE = "android.telephony.data.DataService";
+ field public static final int REQUEST_REASON_HANDOVER = 3; // 0x3
+ field public static final int REQUEST_REASON_NORMAL = 1; // 0x1
+ field public static final int REQUEST_REASON_SHUTDOWN = 2; // 0x2
+ }
+
+ public class DataService.DataServiceProvider {
+ ctor public DataService.DataServiceProvider(int);
+ method public void deactivateDataCall(int, int, android.telephony.data.DataServiceCallback);
+ method public void getDataCallList(android.telephony.data.DataServiceCallback);
+ method public final int getSlotId();
+ method public final void notifyDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>);
+ method protected void onDestroy();
+ method public void setDataProfile(java.util.List<android.telephony.data.DataProfile>, boolean, android.telephony.data.DataServiceCallback);
+ method public void setInitialAttachApn(android.telephony.data.DataProfile, boolean, android.telephony.data.DataServiceCallback);
+ method public void setupDataCall(int, android.telephony.data.DataProfile, boolean, boolean, int, android.net.LinkProperties, android.telephony.data.DataServiceCallback);
+ }
+
+ public class DataServiceCallback {
+ method public void onDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>);
+ method public void onDeactivateDataCallComplete(int);
+ method public void onGetDataCallListComplete(int, java.util.List<android.telephony.data.DataCallResponse>);
+ method public void onSetDataProfileComplete(int);
+ method public void onSetInitialAttachApnComplete(int);
+ method public void onSetupDataCallComplete(int, android.telephony.data.DataCallResponse);
+ field public static final int RESULT_ERROR_BUSY = 3; // 0x3
+ field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4
+ field public static final int RESULT_ERROR_INVALID_ARG = 2; // 0x2
+ field public static final int RESULT_ERROR_UNSUPPORTED = 1; // 0x1
+ field public static final int RESULT_SUCCESS = 0; // 0x0
+ }
+
+}
+
package android.telephony.euicc {
public final class DownloadableSubscription implements android.os.Parcelable {
@@ -5632,6 +5897,28 @@ package android.telephony.ims {
field public static final int CODE_RADIO_SETUP_FAILURE = 1509; // 0x5e5
field public static final int CODE_RADIO_UPLINK_FAILURE = 1508; // 0x5e4
field public static final int CODE_REGISTRATION_ERROR = 1000; // 0x3e8
+ field public static final int CODE_REJECT_1X_COLLISION = 1603; // 0x643
+ field public static final int CODE_REJECT_CALL_ON_OTHER_SUB = 1602; // 0x642
+ field public static final int CODE_REJECT_CALL_TYPE_NOT_ALLOWED = 1605; // 0x645
+ field public static final int CODE_REJECT_CONFERENCE_TTY_NOT_ALLOWED = 1617; // 0x651
+ field public static final int CODE_REJECT_INTERNAL_ERROR = 1612; // 0x64c
+ field public static final int CODE_REJECT_MAX_CALL_LIMIT_REACHED = 1608; // 0x648
+ field public static final int CODE_REJECT_ONGOING_CALL_SETUP = 1607; // 0x647
+ field public static final int CODE_REJECT_ONGOING_CALL_TRANSFER = 1611; // 0x64b
+ field public static final int CODE_REJECT_ONGOING_CALL_UPGRADE = 1616; // 0x650
+ field public static final int CODE_REJECT_ONGOING_CALL_WAITING_DISABLED = 1601; // 0x641
+ field public static final int CODE_REJECT_ONGOING_CONFERENCE_CALL = 1618; // 0x652
+ field public static final int CODE_REJECT_ONGOING_CS_CALL = 1621; // 0x655
+ field public static final int CODE_REJECT_ONGOING_E911_CALL = 1606; // 0x646
+ field public static final int CODE_REJECT_ONGOING_ENCRYPTED_CALL = 1620; // 0x654
+ field public static final int CODE_REJECT_ONGOING_HANDOVER = 1614; // 0x64e
+ field public static final int CODE_REJECT_QOS_FAILURE = 1613; // 0x64d
+ field public static final int CODE_REJECT_SERVICE_NOT_REGISTERED = 1604; // 0x644
+ field public static final int CODE_REJECT_UNKNOWN = 1600; // 0x640
+ field public static final int CODE_REJECT_UNSUPPORTED_SDP_HEADERS = 1610; // 0x64a
+ field public static final int CODE_REJECT_UNSUPPORTED_SIP_HEADERS = 1609; // 0x649
+ field public static final int CODE_REJECT_VT_AVPF_NOT_ALLOWED = 1619; // 0x653
+ field public static final int CODE_REJECT_VT_TTY_NOT_ALLOWED = 1615; // 0x64f
field public static final int CODE_REMOTE_CALL_DECLINE = 1404; // 0x57c
field public static final int CODE_SIP_ALTERNATE_EMERGENCY_CALL = 1514; // 0x5ea
field public static final int CODE_SIP_BAD_ADDRESS = 337; // 0x151
@@ -5904,6 +6191,7 @@ package android.telephony.ims.feature {
method public android.telephony.ims.stub.ImsUtImplBase getUt();
method public final void notifyCapabilitiesStatusChanged(android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
method public final void notifyIncomingCall(android.telephony.ims.stub.ImsCallSessionImplBase, android.os.Bundle);
+ method public final void notifyRejectedCall(android.telephony.ims.ImsCallProfile, android.telephony.ims.ImsReasonInfo);
method public final void notifyVoiceMessageCountUpdate(int);
method public void onFeatureReady();
method public void onFeatureRemoved();
diff --git a/api/test-current.txt b/api/test-current.txt
index e34614e966c4..b8acfdb7a7e4 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -1,10 +1,13 @@
package android {
public static final class Manifest.permission {
+ field public static final java.lang.String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
field public static final java.lang.String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
field public static final java.lang.String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
+ field public static final java.lang.String CHANGE_APP_IDLE_STATE = "android.permission.CHANGE_APP_IDLE_STATE";
field public static final java.lang.String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
field public static final java.lang.String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
+ field public static final java.lang.String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS";
}
}
@@ -27,25 +30,12 @@ package android.app {
method public long getTotalRam();
method public int getUidImportance(int);
method public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
- method public void removeStacksInWindowingModes(int[]) throws java.lang.SecurityException;
- method public void removeStacksWithActivityTypes(int[]) throws java.lang.SecurityException;
- method public void resizeStack(int, android.graphics.Rect) throws java.lang.SecurityException;
- method public void setTaskWindowingMode(int, int, boolean) throws java.lang.SecurityException;
- method public void setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean) throws java.lang.SecurityException;
- method public static boolean supportsMultiWindow(android.content.Context);
- method public static boolean supportsSplitScreenMultiWindow(android.content.Context);
- field public static final int SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT = 1; // 0x1
- field public static final int SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT = 0; // 0x0
}
public static abstract interface ActivityManager.OnUidImportanceListener {
method public abstract void onUidImportance(int, int);
}
- public static class ActivityManager.StackId {
- field public static final int INVALID_STACK_ID = -1; // 0xffffffff
- }
-
public static class ActivityManager.TaskDescription implements android.os.Parcelable {
method public java.lang.String getIconFilename();
method public int getIconResource();
@@ -58,12 +48,29 @@ package android.app {
method public void setTaskOverlay(boolean, boolean);
}
+ public class ActivityTaskManager {
+ method public void removeStacksInWindowingModes(int[]) throws java.lang.SecurityException;
+ method public void removeStacksWithActivityTypes(int[]) throws java.lang.SecurityException;
+ method public void resizeStack(int, android.graphics.Rect) throws java.lang.SecurityException;
+ method public void setTaskWindowingMode(int, int, boolean) throws java.lang.SecurityException;
+ method public void setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean) throws java.lang.SecurityException;
+ method public static boolean supportsMultiWindow(android.content.Context);
+ method public static boolean supportsSplitScreenMultiWindow(android.content.Context);
+ field public static final int INVALID_STACK_ID = -1; // 0xffffffff
+ field public static final int SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT = 1; // 0x1
+ field public static final int SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT = 0; // 0x0
+ }
+
public class AppOpsManager {
+ method public static int getNumOps();
method public static java.lang.String[] getOpStrs();
method public boolean isOperationActive(int, int, java.lang.String);
+ method public static java.lang.String opToPermission(int);
+ method public static int permissionToOpCode(java.lang.String);
method public void setMode(int, int, java.lang.String, int);
method public void startWatchingActive(int[], android.app.AppOpsManager.OnOpActiveChangedListener);
method public void stopWatchingActive(android.app.AppOpsManager.OnOpActiveChangedListener);
+ method public static int strOpToOp(java.lang.String);
field public static final java.lang.String OPSTR_ACCEPT_HANDOVER = "android:accept_handover";
field public static final java.lang.String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications";
field public static final java.lang.String OPSTR_ACTIVATE_VPN = "android:activate_vpn";
@@ -123,6 +130,12 @@ package android.app {
method public android.content.ComponentName getEffectsSuppressor();
}
+ public final class PictureInPictureParams implements android.os.Parcelable {
+ method public java.util.List<android.app.RemoteAction> getActions();
+ method public float getAspectRatio();
+ method public android.graphics.Rect getSourceRectHint();
+ }
+
public class TimePickerDialog extends android.app.AlertDialog implements android.content.DialogInterface.OnClickListener android.widget.TimePicker.OnTimeChangedListener {
method public android.widget.TimePicker getTimePicker();
}
@@ -222,11 +235,16 @@ package android.content {
}
public abstract class Context {
+ method public abstract java.lang.String getOpPackageName();
method public android.os.UserHandle getUser();
method public int getUserId();
method public void setAutofillCompatibilityEnabled(boolean);
}
+ public class ContextWrapper extends android.content.Context {
+ method public java.lang.String getOpPackageName();
+ }
+
}
package android.content.pm {
@@ -239,6 +257,8 @@ package android.content.pm {
public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
method public boolean isPrivilegedApp();
method public boolean isSystemApp();
+ field public static final int PRIVATE_FLAG_PRIVILEGED = 8; // 0x8
+ field public int privateFlags;
}
public class LauncherApps {
@@ -248,22 +268,27 @@ package android.content.pm {
public abstract class PackageManager {
method public abstract java.lang.String getDefaultBrowserPackageNameAsUser(int);
method public abstract int getInstallReason(java.lang.String, android.os.UserHandle);
- method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int);
+ method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int);
method public abstract java.lang.String[] getNamesForUids(int[]);
method public abstract java.lang.String getPermissionControllerPackageName();
method public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
method public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
+ method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
method public abstract boolean isPermissionReviewModeEnabled();
+ method public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
field public static final java.lang.String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage";
field public static final java.lang.String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption";
field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000
+ field public static final java.lang.String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services";
+ field public static final java.lang.String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared";
}
public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
field public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 32768; // 0x8000
+ field public java.lang.String backgroundPermission;
}
public final class ShortcutInfo implements android.os.Parcelable {
@@ -286,6 +311,31 @@ package android.content.res {
package android.database.sqlite {
+ public final class SQLiteDebug {
+ method public static void dump(android.util.Printer, java.lang.String[]);
+ method public static android.database.sqlite.SQLiteDebug.PagerStats getDatabaseInfo();
+ field public static final boolean DEBUG_SQL_LOG;
+ field public static final boolean DEBUG_SQL_STATEMENTS;
+ field public static final boolean DEBUG_SQL_TIME;
+ }
+
+ public static class SQLiteDebug.DbStats {
+ ctor public SQLiteDebug.DbStats(java.lang.String, long, long, int, int, int, int);
+ field public java.lang.String cache;
+ field public java.lang.String dbName;
+ field public long dbSize;
+ field public int lookaside;
+ field public long pageSize;
+ }
+
+ public static class SQLiteDebug.PagerStats {
+ ctor public SQLiteDebug.PagerStats();
+ field public java.util.ArrayList<android.database.sqlite.SQLiteDebug.DbStats> dbStats;
+ field public int largestMemAlloc;
+ field public int memoryUsed;
+ field public int pageCacheOverflow;
+ }
+
public final class SQLiteDirectCursorDriver implements android.database.sqlite.SQLiteCursorDriver {
ctor public SQLiteDirectCursorDriver(android.database.sqlite.SQLiteDatabase, java.lang.String, java.lang.String, android.os.CancellationSignal);
method public void cursorClosed();
@@ -475,6 +525,10 @@ package android.location {
method public void setType(int);
}
+ public class Location implements android.os.Parcelable {
+ method public void makeComplete();
+ }
+
public class LocationManager {
method public java.lang.String[] getBackgroundThrottlingWhitelist();
}
@@ -584,6 +638,10 @@ package android.net {
package android.os {
+ public class Build {
+ method public static boolean is64BitAbi(java.lang.String);
+ }
+
public static class Build.VERSION {
field public static final int FIRST_SDK_INT;
field public static final int RESOURCES_SDK_INT;
@@ -596,6 +654,7 @@ package android.os {
public class Environment {
method public static java.io.File buildPath(java.io.File, java.lang.String...);
+ method public static java.io.File getStorageDirectory();
}
public class IncidentManager {
@@ -613,12 +672,14 @@ package android.os {
method public void readFromParcel(android.os.Parcel);
method public int sectionCount();
method public void setAll(boolean);
+ method public void setPrivacyPolicy(int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.IncidentReportArgs> CREATOR;
}
- public final class PowerManager {
- method public void nap(long);
+ public final class MessageQueue {
+ method public int postSyncBarrier();
+ method public void removeSyncBarrier(int);
}
public class Process {
@@ -639,23 +700,12 @@ package android.os {
}
public final class StrictMode {
+ method public static void conditionallyCheckInstanceCounts();
method public static void setViolationLogger(android.os.StrictMode.ViolationLogger);
- field public static final int DETECT_CUSTOM = 8; // 0x8
- field public static final int DETECT_DISK_READ = 2; // 0x2
- field public static final int DETECT_DISK_WRITE = 1; // 0x1
- field public static final int DETECT_NETWORK = 4; // 0x4
- field public static final int DETECT_RESOURCE_MISMATCH = 16; // 0x10
- field public static final int DETECT_UNBUFFERED_IO = 32; // 0x20
- field public static final int DETECT_VM_ACTIVITY_LEAKS = 1024; // 0x400
- field public static final int DETECT_VM_CLEARTEXT_NETWORK = 16384; // 0x4000
- field public static final int DETECT_VM_CLOSABLE_LEAKS = 512; // 0x200
- field public static final int DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION = 32768; // 0x8000
- field public static final int DETECT_VM_CURSOR_LEAKS = 256; // 0x100
- field public static final int DETECT_VM_FILE_URI_EXPOSURE = 8192; // 0x2000
- field public static final int DETECT_VM_INSTANCE_LEAKS = 2048; // 0x800
- field public static final int DETECT_VM_NON_SDK_API_USAGE = 1073741824; // 0x40000000
- field public static final int DETECT_VM_REGISTRATION_LEAKS = 4096; // 0x1000
- field public static final int DETECT_VM_UNTAGGED_SOCKET = -2147483648; // 0x80000000
+ }
+
+ public static final class StrictMode.ThreadPolicy.Builder {
+ method public android.os.StrictMode.ThreadPolicy.Builder detectExplicitGc();
}
public static final class StrictMode.ViolationInfo implements android.os.Parcelable {
@@ -663,9 +713,8 @@ package android.os {
ctor public StrictMode.ViolationInfo(android.os.Parcel, boolean);
method public int describeContents();
method public void dump(android.util.Printer, java.lang.String);
- method public int getPolicyMask();
method public java.lang.String getStackTrace();
- method public int getViolationBit();
+ method public java.lang.Class<? extends android.os.strictmode.Violation> getViolationClass();
method public java.lang.String getViolationDetails();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.os.StrictMode.ViolationInfo> CREATOR;
@@ -683,12 +732,14 @@ package android.os {
}
public class SystemProperties {
+ method public static java.lang.String get(java.lang.String);
method public static java.lang.String get(java.lang.String, java.lang.String);
}
public final class UserHandle implements android.os.Parcelable {
method public static int getAppId(int);
method public int getIdentifier();
+ method public static boolean isApp(int);
field public static final android.os.UserHandle SYSTEM;
}
@@ -697,6 +748,141 @@ package android.os {
field public static final java.lang.String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
}
+ public abstract class VibrationEffect implements android.os.Parcelable {
+ method public static android.os.VibrationEffect get(int);
+ method public static android.os.VibrationEffect get(int, boolean);
+ method public static android.os.VibrationEffect get(android.net.Uri, android.content.Context);
+ method public abstract long getDuration();
+ method protected static int scale(int, float, int);
+ field public static final int EFFECT_CLICK = 0; // 0x0
+ field public static final int EFFECT_DOUBLE_CLICK = 1; // 0x1
+ field public static final int EFFECT_HEAVY_CLICK = 5; // 0x5
+ field public static final int EFFECT_POP = 4; // 0x4
+ field public static final int EFFECT_STRENGTH_LIGHT = 0; // 0x0
+ field public static final int EFFECT_STRENGTH_MEDIUM = 1; // 0x1
+ field public static final int EFFECT_STRENGTH_STRONG = 2; // 0x2
+ field public static final int EFFECT_THUD = 3; // 0x3
+ field public static final int EFFECT_TICK = 2; // 0x2
+ field public static final int[] RINGTONES;
+ }
+
+ public static class VibrationEffect.OneShot extends android.os.VibrationEffect implements android.os.Parcelable {
+ ctor public VibrationEffect.OneShot(android.os.Parcel);
+ ctor public VibrationEffect.OneShot(long, int);
+ method public int getAmplitude();
+ method public long getDuration();
+ method public android.os.VibrationEffect.OneShot scale(float, int);
+ method public void validate();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.VibrationEffect.OneShot> CREATOR;
+ }
+
+ public static class VibrationEffect.Prebaked extends android.os.VibrationEffect implements android.os.Parcelable {
+ ctor public VibrationEffect.Prebaked(android.os.Parcel);
+ ctor public VibrationEffect.Prebaked(int, boolean);
+ method public long getDuration();
+ method public int getEffectStrength();
+ method public int getId();
+ method public void setEffectStrength(int);
+ method public boolean shouldFallback();
+ method public void validate();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.VibrationEffect.Prebaked> CREATOR;
+ }
+
+ public static class VibrationEffect.Waveform extends android.os.VibrationEffect implements android.os.Parcelable {
+ ctor public VibrationEffect.Waveform(android.os.Parcel);
+ ctor public VibrationEffect.Waveform(long[], int[], int);
+ method public int[] getAmplitudes();
+ method public long getDuration();
+ method public int getRepeatIndex();
+ method public long[] getTimings();
+ method public android.os.VibrationEffect.Waveform scale(float, int);
+ method public void validate();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.VibrationEffect.Waveform> CREATOR;
+ }
+
+ public class WorkSource implements android.os.Parcelable {
+ ctor public WorkSource(int);
+ method public boolean add(int);
+ method public boolean add(int, java.lang.String);
+ method public deprecated android.os.WorkSource addReturningNewbs(android.os.WorkSource);
+ method public int get(int);
+ method public java.lang.String getName(int);
+ method public deprecated android.os.WorkSource[] setReturningDiffs(android.os.WorkSource);
+ method public int size();
+ }
+
+}
+
+package android.os.health {
+
+ public class HealthKeys {
+ ctor public HealthKeys();
+ field public static final int BASE_PACKAGE = 40000; // 0x9c40
+ field public static final int BASE_PID = 20000; // 0x4e20
+ field public static final int BASE_PROCESS = 30000; // 0x7530
+ field public static final int BASE_SERVICE = 50000; // 0xc350
+ field public static final int BASE_UID = 10000; // 0x2710
+ field public static final int TYPE_COUNT = 5; // 0x5
+ field public static final int TYPE_MEASUREMENT = 1; // 0x1
+ field public static final int TYPE_MEASUREMENTS = 4; // 0x4
+ field public static final int TYPE_STATS = 2; // 0x2
+ field public static final int TYPE_TIMER = 0; // 0x0
+ field public static final int TYPE_TIMERS = 3; // 0x3
+ field public static final int UNKNOWN_KEY = 0; // 0x0
+ }
+
+ public static abstract class HealthKeys.Constant implements java.lang.annotation.Annotation {
+ }
+
+ public static class HealthKeys.Constants {
+ ctor public HealthKeys.Constants(java.lang.Class);
+ method public java.lang.String getDataType();
+ method public int getIndex(int, int);
+ method public int[] getKeys(int);
+ method public int getSize(int);
+ }
+
+ public class HealthStats {
+ ctor public HealthStats(android.os.Parcel);
+ }
+
+ public class HealthStatsParceler implements android.os.Parcelable {
+ ctor public HealthStatsParceler(android.os.health.HealthStatsWriter);
+ ctor public HealthStatsParceler(android.os.Parcel);
+ method public int describeContents();
+ method public android.os.health.HealthStats getHealthStats();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.health.HealthStatsParceler> CREATOR;
+ }
+
+ public class HealthStatsWriter {
+ ctor public HealthStatsWriter(android.os.health.HealthKeys.Constants);
+ method public void addMeasurement(int, long);
+ method public void addMeasurements(int, java.lang.String, long);
+ method public void addStats(int, java.lang.String, android.os.health.HealthStatsWriter);
+ method public void addTimer(int, int, long);
+ method public void addTimers(int, java.lang.String, android.os.health.TimerStat);
+ method public void flattenToParcel(android.os.Parcel);
+ }
+
+}
+
+package android.os.storage {
+
+ public final class StorageVolume implements android.os.Parcelable {
+ method public java.lang.String getPath();
+ }
+
+}
+
+package android.os.strictmode {
+
+ public final class ExplicitGcViolation extends android.os.strictmode.Violation {
+ }
+
}
package android.print {
@@ -714,6 +900,14 @@ package android.print {
package android.provider {
+ public static final class ContactsContract.CommonDataKinds.Phone implements android.provider.ContactsContract.CommonDataKinds.CommonColumns android.provider.ContactsContract.DataColumnsWithJoins {
+ field public static final android.net.Uri ENTERPRISE_CONTENT_URI;
+ }
+
+ public static final class ContactsContract.RawContactsEntity implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.RawContactsColumns {
+ field public static final android.net.Uri CORP_CONTENT_URI;
+ }
+
public final class Settings {
field public static final java.lang.String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
}
@@ -849,6 +1043,7 @@ package android.service.notification {
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
field public static final java.lang.String KEY_PEOPLE = "key_people";
+ field public static final java.lang.String KEY_SMART_ACTIONS = "key_smart_actions";
field public static final java.lang.String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
field public static final java.lang.String KEY_USER_SENTIMENT = "key_user_sentiment";
}
@@ -1239,6 +1434,11 @@ package android.view {
method public void enable();
}
+ public class KeyEvent extends android.view.InputEvent implements android.os.Parcelable {
+ method public static java.lang.String actionToString(int);
+ field public static final int LAST_KEYCODE = 285; // 0x11d
+ }
+
public final class KeyboardShortcutGroup implements android.os.Parcelable {
ctor public KeyboardShortcutGroup(java.lang.CharSequence, java.util.List<android.view.KeyboardShortcutInfo>, boolean);
ctor public KeyboardShortcutGroup(java.lang.CharSequence, boolean);
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 9ac05dcd402c..002df808501c 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -13,6 +13,7 @@
#include <sys/stat.h>
#include <unistd.h>
+#include <android-base/macros.h>
#include <binder/IPCThreadState.h>
#include <hwbinder/IPCThreadState.h>
#include <utils/Log.h>
@@ -140,27 +141,12 @@ static size_t computeArgBlockSize(int argc, char* const argv[]) {
}
static void maybeCreateDalvikCache() {
-#if defined(__aarch64__)
- static const char kInstructionSet[] = "arm64";
-#elif defined(__x86_64__)
- static const char kInstructionSet[] = "x86_64";
-#elif defined(__arm__)
- static const char kInstructionSet[] = "arm";
-#elif defined(__i386__)
- static const char kInstructionSet[] = "x86";
-#elif defined (__mips__) && !defined(__LP64__)
- static const char kInstructionSet[] = "mips";
-#elif defined (__mips__) && defined(__LP64__)
- static const char kInstructionSet[] = "mips64";
-#else
-#error "Unknown instruction set"
-#endif
const char* androidRoot = getenv("ANDROID_DATA");
LOG_ALWAYS_FATAL_IF(androidRoot == NULL, "ANDROID_DATA environment variable unset");
char dalvikCacheDir[PATH_MAX];
const int numChars = snprintf(dalvikCacheDir, PATH_MAX,
- "%s/dalvik-cache/%s", androidRoot, kInstructionSet);
+ "%s/dalvik-cache/" ABI_STRING, androidRoot);
LOG_ALWAYS_FATAL_IF((numChars >= PATH_MAX || numChars < 0),
"Error constructing dalvik cache : %s", strerror(errno));
diff --git a/cmds/backup/Android.bp b/cmds/backup/Android.bp
new file mode 100644
index 000000000000..287c23b27fbb
--- /dev/null
+++ b/cmds/backup/Android.bp
@@ -0,0 +1,20 @@
+// Copyright 2009 The Android Open Source Project
+
+cc_binary {
+ name: "btool",
+
+ srcs: ["backup.cpp"],
+
+ shared_libs: [
+ "libcutils",
+ "libutils",
+ "libandroidfw",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/cmds/backup/Android.mk b/cmds/backup/Android.mk
deleted file mode 100644
index 8e1508c9efe8..000000000000
--- a/cmds/backup/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2009 The Android Open Source Project
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= backup.cpp
-
-LOCAL_SHARED_LIBRARIES := libcutils libutils libandroidfw
-
-LOCAL_MODULE:= btool
-
-LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_EXECUTABLE)
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index 84a04e5ad6e3..641ae00deda5 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -71,9 +71,7 @@ public final class Bmgr {
return;
}
- mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService("backup"));
- if (mBmgr == null) {
- System.err.println(BMGR_NOT_RUNNING_ERR);
+ if (!isBmgrActive()) {
return;
}
@@ -150,6 +148,27 @@ public final class Bmgr {
showUsage();
}
+ private boolean isBmgrActive() {
+ mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService("backup"));
+ if (mBmgr == null) {
+ System.err.println(BMGR_NOT_RUNNING_ERR);
+ return false;
+ }
+
+ try {
+ if (!mBmgr.isBackupServiceActive(UserHandle.USER_SYSTEM)) {
+ System.err.println(BMGR_NOT_RUNNING_ERR);
+ return false;
+ }
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(BMGR_NOT_RUNNING_ERR);
+ return false;
+ }
+
+ return true;
+ }
+
private String enableToString(boolean enabled) {
return enabled ? "enabled" : "disabled";
}
@@ -704,34 +723,11 @@ public final class Bmgr {
return;
}
}
-
- System.out.println("done");
}
private void doRestorePackage(String pkg) {
- try {
- mRestore = mBmgr.beginRestoreSession(pkg, null);
- if (mRestore == null) {
- System.err.println(BMGR_NOT_RUNNING_ERR);
- return;
- }
-
- RestoreObserver observer = new RestoreObserver();
- // TODO implement monitor here
- int err = mRestore.restorePackage(pkg, observer, null );
- if (err == 0) {
- // Off and running -- wait for the restore to complete
- observer.waitForCompletion();
- } else {
- System.err.println("Unable to restore package " + pkg);
- }
-
- // And finally shut down the session
- mRestore.endRestoreSession();
- } catch (RemoteException e) {
- System.err.println(e.toString());
- System.err.println(BMGR_NOT_RUNNING_ERR);
- }
+ System.err.println("The syntax 'restore <package>' is no longer supported, please use ");
+ System.err.println("'restore <token> <package>'.");
}
private void doRestoreAll(long token, HashSet<String> filter) {
@@ -784,6 +780,8 @@ public final class Bmgr {
// once the restore has finished, close down the session and we're done
mRestore.endRestoreSession();
+
+ System.out.println("done");
} catch (RemoteException e) {
System.err.println(e.toString());
System.err.println(BMGR_NOT_RUNNING_ERR);
@@ -823,7 +821,6 @@ public final class Bmgr {
System.err.println(" bmgr transport WHICH|-c WHICH_COMPONENT");
System.err.println(" bmgr restore TOKEN");
System.err.println(" bmgr restore TOKEN PACKAGE...");
- System.err.println(" bmgr restore PACKAGE");
System.err.println(" bmgr run");
System.err.println(" bmgr wipe TRANSPORT PACKAGE");
System.err.println(" bmgr fullbackup PACKAGE...");
@@ -867,10 +864,6 @@ public final class Bmgr {
System.err.println("'restore' operation supplying only a token, but applies a filter to the");
System.err.println("set of applications to be restored.");
System.err.println("");
- System.err.println("The 'restore' command when given just a package name intiates a restore of");
- System.err.println("just that one package according to the restore set selection algorithm");
- System.err.println("used by the RestoreSession.restorePackage() method.");
- System.err.println("");
System.err.println("The 'run' command causes any scheduled backup operation to be initiated");
System.err.println("immediately, without the usual waiting period for batching together");
System.err.println("data changes.");
diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk
index e5d35b3b8a0e..6943dab0acbe 100644
--- a/cmds/bootanimation/Android.mk
+++ b/cmds/bootanimation/Android.mk
@@ -27,7 +27,12 @@ ifeq ($(PRODUCT_IOT),true)
LOCAL_SHARED_LIBRARIES += \
libandroidthings \
+ libandroidthings_protos \
libchrome \
+ libprotobuf-cpp-lite \
+
+LOCAL_STATIC_LIBRARIES += \
+ libjsoncpp
LOCAL_SRC_FILES += \
iot/iotbootanimation_main.cpp \
@@ -94,3 +99,5 @@ LOCAL_32_BIT_ONLY := true
endif
include ${BUILD_SHARED_LIBRARY}
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index 56e131523bcb..dffbfde649e0 100644
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -22,6 +22,7 @@
#include <androidfw/AssetManager.h>
#include <utils/Thread.h>
+#include <binder/IBinder.h>
#include <EGL/egl.h>
#include <GLES/gl.h>
diff --git a/cmds/bootanimation/BootAnimationUtil.cpp b/cmds/bootanimation/BootAnimationUtil.cpp
index 7718daf61d81..1e417e938359 100644
--- a/cmds/bootanimation/BootAnimationUtil.cpp
+++ b/cmds/bootanimation/BootAnimationUtil.cpp
@@ -16,14 +16,30 @@
#include "BootAnimationUtil.h"
+#include <vector>
#include <inttypes.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <utils/Log.h>
#include <utils/SystemClock.h>
+#include <android-base/properties.h>
namespace android {
+namespace {
+
+static constexpr char PLAY_SOUND_PROP_NAME[] = "persist.sys.bootanim.play_sound";
+static constexpr char BOOT_COMPLETED_PROP_NAME[] = "sys.boot_completed";
+static constexpr char POWER_CTL_PROP_NAME[] = "sys.powerctl";
+static constexpr char BOOTREASON_PROP_NAME[] = "ro.boot.bootreason";
+static const std::vector<std::string> PLAY_SOUND_BOOTREASON_BLACKLIST {
+ "kernel_panic",
+ "Panic",
+ "Watchdog",
+};
+
+} // namespace
+
bool bootAnimationDisabled() {
char value[PROPERTY_VALUE_MAX];
@@ -58,4 +74,31 @@ void waitForSurfaceFlinger() {
}
}
+bool playSoundsAllowed() {
+ // Only play sounds for system boots, not runtime restarts.
+ if (android::base::GetBoolProperty(BOOT_COMPLETED_PROP_NAME, false)) {
+ return false;
+ }
+ // no audio while shutting down
+ if (!android::base::GetProperty(POWER_CTL_PROP_NAME, "").empty()) {
+ return false;
+ }
+ // Read the system property to see if we should play the sound.
+ // If it's not present, default to allowed.
+ if (!property_get_bool(PLAY_SOUND_PROP_NAME, 1)) {
+ return false;
+ }
+
+ // Don't play sounds if this is a reboot due to an error.
+ char bootreason[PROPERTY_VALUE_MAX];
+ if (property_get(BOOTREASON_PROP_NAME, bootreason, nullptr) > 0) {
+ for (const auto& str : PLAY_SOUND_BOOTREASON_BLACKLIST) {
+ if (strcasecmp(str.c_str(), bootreason) == 0) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
} // namespace android
diff --git a/cmds/bootanimation/BootAnimationUtil.h b/cmds/bootanimation/BootAnimationUtil.h
index 60987cd1ccd1..1e1140a51763 100644
--- a/cmds/bootanimation/BootAnimationUtil.h
+++ b/cmds/bootanimation/BootAnimationUtil.h
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+#ifndef ANDROID_BOOTANIMATION_UTIL_H
+#define ANDROID_BOOTANIMATION_UTIL_H
+
namespace android {
// Returns true if boot animation is disabled.
@@ -22,4 +25,8 @@ bool bootAnimationDisabled();
// Waits until the surface flinger is up.
void waitForSurfaceFlinger();
+// Returns whether sounds should be played during current boot.
+bool playSoundsAllowed();
} // namespace android
+
+#endif // ANDROID_BOOTANIMATION_UTIL_H
diff --git a/cmds/bootanimation/audioplay.cpp b/cmds/bootanimation/audioplay.cpp
index c546072e733a..874aab08862e 100644
--- a/cmds/bootanimation/audioplay.cpp
+++ b/cmds/bootanimation/audioplay.cpp
@@ -17,22 +17,27 @@
// cribbed from samples/native-audio
-#include "audioplay.h"
-
#define CHATTY ALOGD
#define LOG_TAG "audioplay"
+#include "audioplay.h"
+
#include <string.h>
#include <utils/Log.h>
+#include <utils/threads.h>
// for native audio
#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>
+#include "BootAnimationUtil.h"
+
namespace audioplay {
namespace {
+using namespace android;
+
// engine interfaces
static SLObjectItf engineObject = NULL;
static SLEngineItf engineEngine;
@@ -305,6 +310,74 @@ bool parseClipBuf(const uint8_t* clipBuf, int clipBufSize, const ChunkFormat** o
return true;
}
+class InitAudioThread : public Thread {
+public:
+ InitAudioThread(uint8_t* exampleAudioData, int exampleAudioLength)
+ : Thread(false),
+ mExampleAudioData(exampleAudioData),
+ mExampleAudioLength(exampleAudioLength) {}
+private:
+ virtual bool threadLoop() {
+ audioplay::create(mExampleAudioData, mExampleAudioLength);
+ // Exit immediately
+ return false;
+ }
+
+ uint8_t* mExampleAudioData;
+ int mExampleAudioLength;
+};
+
+// Typedef to aid readability.
+typedef android::BootAnimation::Animation Animation;
+
+class AudioAnimationCallbacks : public android::BootAnimation::Callbacks {
+public:
+ void init(const Vector<Animation::Part>& parts) override {
+ const Animation::Part* partWithAudio = nullptr;
+ for (const Animation::Part& part : parts) {
+ if (part.audioData != nullptr) {
+ partWithAudio = &part;
+ break;
+ }
+ }
+
+ if (partWithAudio == nullptr) {
+ return;
+ }
+
+ ALOGD("found audio.wav, creating playback engine");
+ // The audioData is used to initialize the audio system. Different data
+ // can be played later for other parts BUT the assumption is that they
+ // will all be the same format and only the format of this audioData
+ // will work correctly.
+ initAudioThread = new InitAudioThread(partWithAudio->audioData,
+ partWithAudio->audioLength);
+ initAudioThread->run("BootAnimation::InitAudioThread", PRIORITY_NORMAL);
+ };
+
+ void playPart(int partNumber, const Animation::Part& part, int playNumber) override {
+ // only play audio file the first time we animate the part
+ if (playNumber == 0 && part.audioData && playSoundsAllowed()) {
+ ALOGD("playing clip for part%d, size=%d",
+ partNumber, part.audioLength);
+ // Block until the audio engine is finished initializing.
+ if (initAudioThread != nullptr) {
+ initAudioThread->join();
+ }
+ audioplay::playClip(part.audioData, part.audioLength);
+ }
+ };
+
+ void shutdown() override {
+ // we've finally played everything we're going to play
+ audioplay::setPlaying(false);
+ audioplay::destroy();
+ };
+
+private:
+ sp<InitAudioThread> initAudioThread = nullptr;
+};
+
} // namespace
bool create(const uint8_t* exampleClipBuf, int exampleClipBufSize) {
@@ -397,4 +470,8 @@ void destroy() {
}
}
+sp<BootAnimation::Callbacks> createAnimationCallbacks() {
+ return new AudioAnimationCallbacks();
+}
+
} // namespace audioplay
diff --git a/cmds/bootanimation/audioplay.h b/cmds/bootanimation/audioplay.h
index 0e5705af0ad0..4704a702d50b 100644
--- a/cmds/bootanimation/audioplay.h
+++ b/cmds/bootanimation/audioplay.h
@@ -20,6 +20,8 @@
#include <string.h>
+#include "BootAnimation.h"
+
namespace audioplay {
// Initializes the engine with an example of the type of WAV clip to play.
@@ -32,6 +34,9 @@ bool playClip(const uint8_t* buf, int size);
void setPlaying(bool isPlaying);
void destroy();
+// Generates callbacks to integrate the audioplay system with the BootAnimation.
+android::sp<android::BootAnimation::Callbacks> createAnimationCallbacks();
+
}
#endif // AUDIOPLAY_H_
diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp
index 8501982d071c..a52a5e92a840 100644
--- a/cmds/bootanimation/bootanimation_main.cpp
+++ b/cmds/bootanimation/bootanimation_main.cpp
@@ -26,8 +26,6 @@
#include <sys/resource.h>
#include <utils/Log.h>
#include <utils/SystemClock.h>
-#include <utils/threads.h>
-#include <android-base/properties.h>
#include "BootAnimation.h"
#include "BootAnimationUtil.h"
@@ -35,113 +33,6 @@
using namespace android;
-// ---------------------------------------------------------------------------
-
-namespace {
-
-// Create a typedef for readability.
-typedef android::BootAnimation::Animation Animation;
-
-static const char PLAY_SOUND_PROP_NAME[] = "persist.sys.bootanim.play_sound";
-static const char BOOT_COMPLETED_PROP_NAME[] = "sys.boot_completed";
-static const char POWER_CTL_PROP_NAME[] = "sys.powerctl";
-static const char BOOTREASON_PROP_NAME[] = "ro.boot.bootreason";
-static const std::vector<std::string> PLAY_SOUND_BOOTREASON_BLACKLIST {
- "kernel_panic",
- "Panic",
- "Watchdog",
-};
-
-class InitAudioThread : public Thread {
-public:
- InitAudioThread(uint8_t* exampleAudioData, int exampleAudioLength)
- : Thread(false),
- mExampleAudioData(exampleAudioData),
- mExampleAudioLength(exampleAudioLength) {}
-private:
- virtual bool threadLoop() {
- audioplay::create(mExampleAudioData, mExampleAudioLength);
- // Exit immediately
- return false;
- }
-
- uint8_t* mExampleAudioData;
- int mExampleAudioLength;
-};
-
-bool playSoundsAllowed() {
- // Only play sounds for system boots, not runtime restarts.
- if (android::base::GetBoolProperty(BOOT_COMPLETED_PROP_NAME, false)) {
- return false;
- }
- // no audio while shutting down
- if (!android::base::GetProperty(POWER_CTL_PROP_NAME, "").empty()) {
- return false;
- }
- // Read the system property to see if we should play the sound.
- // If it's not present, default to allowed.
- if (!property_get_bool(PLAY_SOUND_PROP_NAME, 1)) {
- return false;
- }
-
- // Don't play sounds if this is a reboot due to an error.
- char bootreason[PROPERTY_VALUE_MAX];
- if (property_get(BOOTREASON_PROP_NAME, bootreason, nullptr) > 0) {
- for (const auto& str : PLAY_SOUND_BOOTREASON_BLACKLIST) {
- if (strcasecmp(str.c_str(), bootreason) == 0) {
- return false;
- }
- }
- }
- return true;
-}
-
-class AudioAnimationCallbacks : public android::BootAnimation::Callbacks {
-public:
- void init(const Vector<Animation::Part>& parts) override {
- const Animation::Part* partWithAudio = nullptr;
- for (const Animation::Part& part : parts) {
- if (part.audioData != nullptr) {
- partWithAudio = &part;
- }
- }
-
- if (partWithAudio == nullptr) {
- return;
- }
-
- ALOGD("found audio.wav, creating playback engine");
- initAudioThread = new InitAudioThread(partWithAudio->audioData,
- partWithAudio->audioLength);
- initAudioThread->run("BootAnimation::InitAudioThread", PRIORITY_NORMAL);
- };
-
- void playPart(int partNumber, const Animation::Part& part, int playNumber) override {
- // only play audio file the first time we animate the part
- if (playNumber == 0 && part.audioData && playSoundsAllowed()) {
- ALOGD("playing clip for part%d, size=%d",
- partNumber, part.audioLength);
- // Block until the audio engine is finished initializing.
- if (initAudioThread != nullptr) {
- initAudioThread->join();
- }
- audioplay::playClip(part.audioData, part.audioLength);
- }
- };
-
- void shutdown() override {
- // we've finally played everything we're going to play
- audioplay::setPlaying(false);
- audioplay::destroy();
- };
-
-private:
- sp<InitAudioThread> initAudioThread = nullptr;
-};
-
-} // namespace
-
-
int main()
{
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
@@ -156,7 +47,7 @@ int main()
waitForSurfaceFlinger();
// create the boot animation object
- sp<BootAnimation> boot = new BootAnimation(new AudioAnimationCallbacks());
+ sp<BootAnimation> boot = new BootAnimation(audioplay::createAnimationCallbacks());
ALOGV("Boot animation set up. Joining pool.");
IPCThreadState::self()->joinThreadPool();
diff --git a/packages/DefaultContainerService/jni/Android.mk b/cmds/bootanimation/iot/Android.mk
index 7808ae15336b..3d288e4e111b 100644
--- a/packages/DefaultContainerService/jni/Android.mk
+++ b/cmds/bootanimation/iot/Android.mk
@@ -1,5 +1,4 @@
-#
-# Copyright (C) 2010 The Android Open Source Project
+# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -14,27 +13,31 @@
# limitations under the License.
#
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
+LOCAL_PATH:= $(call my-dir)
-LOCAL_SRC_FILES := \
- com_android_defcontainer_MeasurementUtils.cpp
+ifeq ($(PRODUCT_IOT),true)
-LOCAL_C_INCLUDES += \
- $(JNI_H_INCLUDES)
+# libbootanimation_iot_test
+# ===========================================================
+include $(CLEAR_VARS)
+LOCAL_MODULE := libbootanimation_iot_test
+LOCAL_CFLAGS := -Wall -Werror -Wunused -Wunreachable-code
LOCAL_SHARED_LIBRARIES := \
- libnativehelper \
- libutils \
- liblog
+ libandroidthings \
+ libandroidthings_protos \
+ libbase \
+ libchrome \
+ liblog \
+ libprotobuf-cpp-lite \
-LOCAL_STATIC_LIBRARIES := \
- libdiskusage
+LOCAL_STATIC_LIBRARIES += \
+ libjsoncpp
-LOCAL_MODULE := libdefcontainer_jni
-LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := \
+ BootParameters.cpp \
+ BootParameters_test.cpp \
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
+include $(BUILD_NATIVE_TEST)
-include $(BUILD_SHARED_LIBRARY)
+endif # PRODUCT_IOT
diff --git a/cmds/bootanimation/iot/BootAction.cpp b/cmds/bootanimation/iot/BootAction.cpp
index fa797444d569..8b55147110bc 100644
--- a/cmds/bootanimation/iot/BootAction.cpp
+++ b/cmds/bootanimation/iot/BootAction.cpp
@@ -32,7 +32,7 @@ BootAction::~BootAction() {
}
bool BootAction::init(const std::string& libraryPath,
- const std::vector<ABootActionParameter>& parameters) {
+ const std::unique_ptr<BootParameters>& bootParameters) {
APeripheralManagerClient* client = nullptr;
ALOGD("Connecting to peripheralmanager");
// Wait for peripheral manager to come up.
@@ -77,9 +77,32 @@ bool BootAction::init(const std::string& libraryPath,
mLibStartPart = reinterpret_cast<libStartPart>(loaded);
}
- ALOGD("Entering boot_action_init");
- bool result = mLibInit(parameters.data(), parameters.size());
- ALOGD("Returned from boot_action_init");
+ // SilentBoot is considered optional, if it isn't exported by the library
+ // and the boot is silent, no method is called.
+ loaded = nullptr;
+ if (!loadSymbol("boot_action_silent_boot", &loaded) || loaded == nullptr) {
+ ALOGW("No boot_action_silent_boot found, boot action will not be "
+ "executed during a silent boot.");
+ } else {
+ mLibSilentBoot = reinterpret_cast<libInit>(loaded);
+ }
+
+ bool result = true;
+ const auto& parameters = bootParameters->getParameters();
+ if (bootParameters->isSilentBoot()) {
+ if (mLibSilentBoot != nullptr) {
+ ALOGD("Entering boot_action_silent_boot");
+ result = mLibSilentBoot(parameters.data(), parameters.size());
+ ALOGD("Returned from boot_action_silent_boot");
+ } else {
+ ALOGW("Skipping missing boot_action_silent_boot");
+ }
+ } else {
+ ALOGD("Entering boot_action_init");
+ result = mLibInit(parameters.data(), parameters.size());
+ ALOGD("Returned from boot_action_init");
+ }
+
return result;
}
@@ -99,7 +122,7 @@ void BootAction::shutdown() {
bool BootAction::loadSymbol(const char* symbol, void** loaded) {
*loaded = dlsym(mLibHandle, symbol);
- if (loaded == nullptr) {
+ if (*loaded == nullptr) {
ALOGE("Unable to load symbol : %s :: %s", symbol, dlerror());
return false;
}
diff --git a/cmds/bootanimation/iot/BootAction.h b/cmds/bootanimation/iot/BootAction.h
index 5e2495fe6c51..7119c35db0f9 100644
--- a/cmds/bootanimation/iot/BootAction.h
+++ b/cmds/bootanimation/iot/BootAction.h
@@ -20,6 +20,8 @@
#include <string>
#include <vector>
+#include "BootParameters.h"
+
#include <boot_action/boot_action.h> // libandroidthings native API.
#include <utils/RefBase.h>
@@ -31,7 +33,7 @@ public:
// libraryPath is a fully qualified path to the target .so library.
bool init(const std::string& libraryPath,
- const std::vector<ABootActionParameter>& parameters);
+ const std::unique_ptr<BootParameters>& bootParameters);
// The animation is going to start playing partNumber for the playCount'th
// time, update the action as needed.
@@ -45,7 +47,7 @@ public:
private:
typedef bool (*libInit)(const ABootActionParameter* parameters,
- size_t num_parameters);
+ size_t numParameters);
typedef void (*libStartPart)(int partNumber, int playNumber);
typedef void (*libShutdown)();
@@ -55,6 +57,9 @@ private:
libInit mLibInit = nullptr;
libStartPart mLibStartPart = nullptr;
libShutdown mLibShutdown = nullptr;
+
+ // Called only if the boot is silent.
+ libInit mLibSilentBoot = nullptr;
};
} // namespace android
diff --git a/cmds/bootanimation/iot/BootParameters.cpp b/cmds/bootanimation/iot/BootParameters.cpp
index da6ad0d1f08f..30a9b2895c44 100644
--- a/cmds/bootanimation/iot/BootParameters.cpp
+++ b/cmds/bootanimation/iot/BootParameters.cpp
@@ -18,45 +18,52 @@
#define LOG_TAG "BootParameters"
+#include <errno.h>
#include <fcntl.h>
-#include <string>
-
#include <android-base/file.h>
-#include <base/json/json_parser.h>
-#include <base/json/json_reader.h>
-#include <base/json/json_value_converter.h>
+#include <json/json.h>
#include <utils/Log.h>
-using android::base::RemoveFileIfExists;
using android::base::ReadFileToString;
-using base::JSONReader;
-using base::JSONValueConverter;
-using base::Value;
+using android::base::RemoveFileIfExists;
+using android::base::WriteStringToFile;
+using Json::ArrayIndex;
+using Json::Reader;
+using Json::Value;
namespace android {
namespace {
-// Brightness and volume are stored as integer strings in next_boot.json.
-// They are divided by this constant to produce the actual float values in
-// range [0.0, 1.0]. This constant must match its counterpart in
-// DeviceManager.
-constexpr const float kFloatScaleFactor = 1000.0f;
+// Keys for deprecated parameters. Devices that OTA from N to O and that used
+// the hidden BootParameters API will store these in the JSON blob. To support
+// the transition from N to O, these keys are mapped to the new parameters.
+constexpr const char *kKeyLegacyVolume = "volume";
+constexpr const char *kKeyLegacyAnimationsDisabled = "boot_animation_disabled";
+constexpr const char *kKeyLegacyParamNames = "param_names";
+constexpr const char *kKeyLegacyParamValues = "param_values";
+
+constexpr const char *kNextBootFile = "/data/misc/bootanimation/next_boot.proto";
+constexpr const char *kLastBootFile = "/data/misc/bootanimation/last_boot.proto";
-constexpr const char* kNextBootFile = "/data/misc/bootanimation/next_boot.json";
-constexpr const char* kLastBootFile = "/data/misc/bootanimation/last_boot.json";
+constexpr const char *kLegacyNextBootFile = "/data/misc/bootanimation/next_boot.json";
+constexpr const char *kLegacyLastBootFile = "/data/misc/bootanimation/last_boot.json";
-void swapBootConfigs() {
- // rename() will fail if next_boot.json doesn't exist, so delete
- // last_boot.json manually first.
+void removeLegacyFiles() {
std::string err;
- if (!RemoveFileIfExists(kLastBootFile, &err))
- ALOGE("Unable to delete last boot file: %s", err.c_str());
+ if (!RemoveFileIfExists(kLegacyLastBootFile, &err)) {
+ ALOGW("Unable to delete %s: %s", kLegacyLastBootFile, err.c_str());
+ }
- if (rename(kNextBootFile, kLastBootFile) && errno != ENOENT)
- ALOGE("Unable to swap boot files: %s", strerror(errno));
+ err.clear();
+ if (!RemoveFileIfExists(kLegacyNextBootFile, &err)) {
+ ALOGW("Unable to delete %s: %s", kLegacyNextBootFile, err.c_str());
+ }
+}
+void createNextBootFile() {
+ errno = 0;
int fd = open(kNextBootFile, O_CREAT, DEFFILEMODE);
if (fd == -1) {
ALOGE("Unable to create next boot file: %s", strerror(errno));
@@ -71,54 +78,120 @@ void swapBootConfigs() {
} // namespace
-BootParameters::SavedBootParameters::SavedBootParameters()
- : brightness(-kFloatScaleFactor), volume(-kFloatScaleFactor) {}
-
-void BootParameters::SavedBootParameters::RegisterJSONConverter(
- JSONValueConverter<SavedBootParameters>* converter) {
- converter->RegisterIntField("brightness", &SavedBootParameters::brightness);
- converter->RegisterIntField("volume", &SavedBootParameters::volume);
- converter->RegisterRepeatedString("param_names",
- &SavedBootParameters::param_names);
- converter->RegisterRepeatedString("param_values",
- &SavedBootParameters::param_values);
+// Renames the 'next' boot file to the 'last' file and reads its contents.
+bool BootParameters::swapAndLoadBootConfigContents(const char *lastBootFile,
+ const char *nextBootFile,
+ std::string *contents) {
+ if (!ReadFileToString(nextBootFile, contents)) {
+ RemoveFileIfExists(lastBootFile);
+ return false;
+ }
+
+ errno = 0;
+ if (rename(nextBootFile, lastBootFile) && errno != ENOENT)
+ ALOGE("Unable to swap boot files: %s", strerror(errno));
+
+ return true;
}
BootParameters::BootParameters() {
- swapBootConfigs();
loadParameters();
}
+// Saves the boot parameters state to disk so the framework can read it.
+void BootParameters::storeParameters() {
+ errno = 0;
+ if (!WriteStringToFile(mProto.SerializeAsString(), kLastBootFile)) {
+ ALOGE("Failed to write boot parameters to %s: %s", kLastBootFile, strerror(errno));
+ }
+
+ // WriteStringToFile sets the file permissions to 0666, but these are not
+ // honored by the system.
+ errno = 0;
+ if (chmod(kLastBootFile, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) {
+ ALOGE("Failed to set permissions for %s: %s", kLastBootFile, strerror(errno));
+ }
+}
+
+// Load the boot parameters from disk, try the old location and format if the
+// file does not exist. Note:
+// - Parse errors result in defaults being used (a normal boot).
+// - Legacy boot parameters default to a silent boot.
void BootParameters::loadParameters() {
+ // Precedence is given to the new file format (.proto).
std::string contents;
- if (!ReadFileToString(kLastBootFile, &contents)) {
- if (errno != ENOENT)
- ALOGE("Unable to read from %s: %s", kLastBootFile, strerror(errno));
+ if (swapAndLoadBootConfigContents(kLastBootFile, kNextBootFile, &contents)) {
+ parseBootParameters(contents);
+ } else if (swapAndLoadBootConfigContents(kLegacyLastBootFile, kLegacyNextBootFile, &contents)) {
+ parseLegacyBootParameters(contents);
+ storeParameters();
+ removeLegacyFiles();
+ }
+
+ createNextBootFile();
+}
+void BootParameters::parseBootParameters(const std::string &contents) {
+ if (!mProto.ParseFromString(contents)) {
+ ALOGW("Failed to parse parameters from %s", kLastBootFile);
return;
}
- std::unique_ptr<Value> json = JSONReader::Read(contents);
- if (json.get() == nullptr) {
+ loadStateFromProto();
+}
+
+// Parses the JSON in the proto.
+void BootParameters::parseLegacyBootParameters(const std::string &contents) {
+ Value json;
+ if (!Reader().parse(contents, json)) {
+ ALOGW("Failed to parse parameters from %s", kLegacyLastBootFile);
return;
}
- JSONValueConverter<SavedBootParameters> converter;
- if (converter.Convert(*(json.get()), &mRawParameters)) {
- mBrightness = mRawParameters.brightness / kFloatScaleFactor;
- mVolume = mRawParameters.volume / kFloatScaleFactor;
-
- if (mRawParameters.param_names.size() == mRawParameters.param_values.size()) {
- for (size_t i = 0; i < mRawParameters.param_names.size(); i++) {
- mParameters.push_back({
- .key = mRawParameters.param_names[i]->c_str(),
- .value = mRawParameters.param_values[i]->c_str()
- });
+ int volume = 0;
+ bool bootAnimationDisabled = true;
+
+ Value &jsonValue = json[kKeyLegacyVolume];
+ if (jsonValue.isIntegral()) {
+ volume = jsonValue.asInt();
+ }
+
+ jsonValue = json[kKeyLegacyAnimationsDisabled];
+ if (jsonValue.isIntegral()) {
+ bootAnimationDisabled = jsonValue.asInt() == 1;
+ }
+
+ // Assume a silent boot unless all of the following are true -
+ // 1. The volume is neither 0 nor -1000 (the legacy default value).
+ // 2. The boot animations are explicitly enabled.
+ // Note: brightness was never used.
+ mProto.set_silent_boot((volume == 0) || (volume == -1000) || bootAnimationDisabled);
+
+ Value &keys = json[kKeyLegacyParamNames];
+ Value &values = json[kKeyLegacyParamValues];
+ if (keys.isArray() && values.isArray() && (keys.size() == values.size())) {
+ for (ArrayIndex i = 0; i < keys.size(); ++i) {
+ auto &key = keys[i];
+ auto &value = values[i];
+ if (key.isString() && value.isString()) {
+ auto userParameter = mProto.add_user_parameter();
+ userParameter->set_key(key.asString());
+ userParameter->set_value(value.asString());
}
- } else {
- ALOGW("Parameter names and values size mismatch");
}
}
+
+ loadStateFromProto();
+}
+
+void BootParameters::loadStateFromProto() {
+ // A missing key returns a safe, default value.
+ // Ignore invalid or missing parameters.
+ mIsSilentBoot = mProto.silent_boot();
+
+ for (const auto &param : mProto.user_parameter()) {
+ mParameters.push_back({.key = param.key().c_str(), .value = param.value().c_str()});
+ }
}
} // namespace android
diff --git a/cmds/bootanimation/iot/BootParameters.h b/cmds/bootanimation/iot/BootParameters.h
index c10bd44bc2ca..cbd1ca61cfc3 100644
--- a/cmds/bootanimation/iot/BootParameters.h
+++ b/cmds/bootanimation/iot/BootParameters.h
@@ -18,10 +18,11 @@
#define _BOOTANIMATION_BOOT_PARAMETERS_H_
#include <list>
+#include <string>
#include <vector>
-#include <base/json/json_value_converter.h>
#include <boot_action/boot_action.h> // libandroidthings native API.
+#include <boot_parameters.pb.h>
namespace android {
@@ -32,39 +33,39 @@ public:
// to clear the parameters for next boot.
BootParameters();
- // Returns true if volume/brightness were explicitly set on reboot.
- bool hasVolume() const { return mVolume >= 0; }
- bool hasBrightness() const { return mBrightness >= 0; }
-
- // Returns volume/brightness in [0,1], or -1 if unset.
- float getVolume() const { return mVolume; }
- float getBrightness() const { return mBrightness; }
+ // Returns whether or not this is a silent boot.
+ bool isSilentBoot() const { return mIsSilentBoot; }
// Returns the additional boot parameters that were set on reboot.
const std::vector<ABootActionParameter>& getParameters() const { return mParameters; }
-private:
- // Raw boot saved_parameters loaded from .json.
- struct SavedBootParameters {
- int brightness;
- int volume;
- std::vector<std::unique_ptr<std::string>> param_names;
- std::vector<std::unique_ptr<std::string>> param_values;
+ // Exposed for testing. Sets the parameters to the serialized proto.
+ void parseBootParameters(const std::string &contents);
+
+ // For devices that OTA from N to O.
+ // Exposed for testing. Sets the parameters to the raw JSON.
+ void parseLegacyBootParameters(const std::string &contents);
- SavedBootParameters();
- static void RegisterJSONConverter(
- ::base::JSONValueConverter<SavedBootParameters>* converter);
- };
+ // Exposed for testing. Loads the contents from |nextBootFile| and replaces
+ // |lastBootFile| with |nextBootFile|.
+ static bool swapAndLoadBootConfigContents(const char *lastBootFile, const char *nextBootFile,
+ std::string *contents);
+ private:
void loadParameters();
- float mVolume = -1.f;
- float mBrightness = -1.f;
+ // Replaces the legacy JSON blob with the updated version, allowing the
+ // framework to read it.
+ void storeParameters();
+
+ void loadStateFromProto();
+
+ bool mIsSilentBoot = false;
+
std::vector<ABootActionParameter> mParameters;
- // ABootActionParameter is just a raw pointer so we need to keep the
- // original strings around to avoid losing them.
- SavedBootParameters mRawParameters;
+ // Store the proto because mParameters makes a shallow copy.
+ android::things::proto::BootParameters mProto;
};
} // namespace android
diff --git a/cmds/bootanimation/iot/BootParameters_test.cpp b/cmds/bootanimation/iot/BootParameters_test.cpp
new file mode 100644
index 000000000000..d55bce6eecc3
--- /dev/null
+++ b/cmds/bootanimation/iot/BootParameters_test.cpp
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "BootParameters.h"
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <android-base/file.h>
+#include <android-base/test_utils.h>
+#include <boot_parameters.pb.h>
+#include <gtest/gtest.h>
+
+namespace android {
+
+namespace {
+
+TEST(BootParametersTest, TestNoBootParametersIsNotSilent) {
+ android::things::proto::BootParameters proto;
+
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseBootParameters(proto.SerializeAsString());
+
+ ASSERT_FALSE(bootParameters.isSilentBoot());
+ ASSERT_EQ(0u, bootParameters.getParameters().size());
+}
+
+TEST(BootParametersTest, TestParseIsSilent) {
+ android::things::proto::BootParameters proto;
+ proto.set_silent_boot(true);
+
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseBootParameters(proto.SerializeAsString());
+
+ ASSERT_TRUE(bootParameters.isSilentBoot());
+}
+
+TEST(BootParametersTest, TestParseIsNotSilent) {
+ android::things::proto::BootParameters proto;
+ proto.set_silent_boot(false);
+
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseBootParameters(proto.SerializeAsString());
+
+ ASSERT_FALSE(bootParameters.isSilentBoot());
+}
+
+TEST(BootParametersTest, TestParseBootParameters) {
+ android::things::proto::BootParameters proto;
+ proto.set_silent_boot(false);
+
+ auto userParameter = proto.add_user_parameter();
+ userParameter->set_key("key1");
+ userParameter->set_value("value1");
+
+ userParameter = proto.add_user_parameter();
+ userParameter->set_key("key2");
+ userParameter->set_value("value2");
+
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseBootParameters(proto.SerializeAsString());
+
+ auto &parameters = bootParameters.getParameters();
+ ASSERT_EQ(2u, parameters.size());
+ ASSERT_STREQ(parameters[0].key, "key1");
+ ASSERT_STREQ(parameters[0].value, "value1");
+ ASSERT_STREQ(parameters[1].key, "key2");
+ ASSERT_STREQ(parameters[1].value, "value2");
+}
+
+TEST(BootParametersTest, TestParseLegacyDisableBootAnimationIsSilent) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":200,
+ "volume":100,
+ "boot_animation_disabled":1,
+ "param_names":[],
+ "param_values":[]
+ }
+ )");
+
+ ASSERT_TRUE(bootParameters.isSilentBoot());
+}
+
+TEST(BootParametersTest, TestParseLegacyZeroVolumeIsSilent) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":200,
+ "volume":0,
+ "boot_animation_disabled":0,
+ "param_names":[],
+ "param_values":[]
+ }
+ )");
+
+ ASSERT_TRUE(bootParameters.isSilentBoot());
+}
+
+TEST(BootParametersTest, TestParseLegacyDefaultVolumeIsSilent) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":200,
+ "volume":-1000,
+ "boot_animation_disabled":0,
+ "param_names":[],
+ "param_values":[]
+ }
+ )");
+
+ ASSERT_TRUE(bootParameters.isSilentBoot());
+}
+
+TEST(BootParametersTest, TestParseLegacyNotSilent) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":200,
+ "volume":500,
+ "boot_animation_disabled":0,
+ "param_names":[],
+ "param_values":[]
+ }
+ )");
+
+ ASSERT_FALSE(bootParameters.isSilentBoot());
+}
+
+TEST(BootParametersTest, TestParseLegacyParameters) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":200,
+ "volume":100,
+ "boot_animation_disabled":1,
+ "param_names":["key1", "key2"],
+ "param_values":["value1", "value2"]
+ }
+ )");
+
+ auto parameters = bootParameters.getParameters();
+ ASSERT_EQ(2u, parameters.size());
+ ASSERT_STREQ(parameters[0].key, "key1");
+ ASSERT_STREQ(parameters[0].value, "value1");
+ ASSERT_STREQ(parameters[1].key, "key2");
+ ASSERT_STREQ(parameters[1].value, "value2");
+}
+
+TEST(BootParametersTest, TestParseLegacyZeroParameters) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":200,
+ "volume":100,
+ "boot_animation_disabled":1,
+ "param_names":[],
+ "param_values":[]
+ }
+ )");
+
+ ASSERT_EQ(0u, bootParameters.getParameters().size());
+}
+
+TEST(BootParametersTest, TestMalformedLegacyParametersAreSkipped) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":500,
+ "volume":500,
+ "boot_animation_disabled":0,
+ "param_names":["key1", "key2"],
+ "param_values":[1, "value2"]
+ }
+ )");
+
+ auto parameters = bootParameters.getParameters();
+ ASSERT_EQ(1u, parameters.size());
+ ASSERT_STREQ(parameters[0].key, "key2");
+ ASSERT_STREQ(parameters[0].value, "value2");
+}
+
+TEST(BootParametersTest, TestLegacyUnequalParameterSizesAreSkipped) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":500,
+ "volume":500,
+ "boot_animation_disabled":0,
+ "param_names":["key1", "key2"],
+ "param_values":["value1"]
+ }
+ )");
+
+ ASSERT_EQ(0u, bootParameters.getParameters().size());
+}
+
+TEST(BootParametersTest, TestMissingLegacyBootParametersIsSilent) {
+ BootParameters bootParameters = BootParameters();
+ bootParameters.parseLegacyBootParameters(R"(
+ {
+ "brightness":500
+ }
+ )");
+
+ EXPECT_TRUE(bootParameters.isSilentBoot());
+ ASSERT_EQ(0u, bootParameters.getParameters().size());
+}
+
+TEST(BootParametersTest, TestLastFileIsRemovedOnError) {
+ TemporaryFile lastFile;
+ TemporaryDir tempDir;
+ std::string nonExistentFilePath(std::string(tempDir.path) + "/nonexistent");
+ std::string contents;
+
+ BootParameters::swapAndLoadBootConfigContents(lastFile.path, nonExistentFilePath.c_str(),
+ &contents);
+
+ struct stat buf;
+ ASSERT_EQ(-1, lstat(lastFile.path, &buf));
+ ASSERT_TRUE(contents.empty());
+}
+
+TEST(BootParametersTest, TestNextFileIsRemovedLastFileExistsOnSuccess) {
+ TemporaryFile lastFile;
+ TemporaryFile nextFile;
+
+ base::WriteStringToFile("foo", nextFile.path);
+
+ std::string contents;
+ // Expected side effects:
+ // - |next_file| is moved to |last_file|
+ // - |contents| is the contents of |next_file| before being moved.
+ BootParameters::swapAndLoadBootConfigContents(lastFile.path, nextFile.path, &contents);
+
+ struct stat buf;
+ ASSERT_EQ(0, lstat(lastFile.path, &buf));
+ ASSERT_EQ(-1, lstat(nextFile.path, &buf));
+ ASSERT_EQ(contents, "foo");
+
+ contents.clear();
+ ASSERT_TRUE(base::ReadFileToString(lastFile.path, &contents));
+ ASSERT_EQ(contents, "foo");
+}
+
+} // namespace
+
+} // namespace android
diff --git a/cmds/bootanimation/iot/iotbootanimation_main.cpp b/cmds/bootanimation/iot/iotbootanimation_main.cpp
index 00cef430135e..2a3d3766ab38 100644
--- a/cmds/bootanimation/iot/iotbootanimation_main.cpp
+++ b/cmds/bootanimation/iot/iotbootanimation_main.cpp
@@ -59,7 +59,7 @@ public:
}
mBootAction = new BootAction();
- if (!mBootAction->init(library_path, mBootParameters->getParameters())) {
+ if (!mBootAction->init(library_path, mBootParameters)) {
mBootAction = NULL;
}
};
@@ -116,8 +116,16 @@ int main() {
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
- sp<BootAnimation> boot = new BootAnimation(
- new BootActionAnimationCallbacks(std::move(bootParameters)));
+ bool isSilentBoot = bootParameters->isSilentBoot();
+ sp<BootActionAnimationCallbacks> callbacks =
+ new BootActionAnimationCallbacks(std::move(bootParameters));
+
+ // On silent boot, animations aren't displayed.
+ if (isSilentBoot) {
+ callbacks->init({});
+ } else {
+ sp<BootAnimation> boot = new BootAnimation(callbacks);
+ }
IPCThreadState::self()->joinThreadPool();
return 0;
diff --git a/cmds/content/src/com/android/commands/content/Content.java b/cmds/content/src/com/android/commands/content/Content.java
index 6e0bd3a81d84..36e51b9703c9 100644
--- a/cmds/content/src/com/android/commands/content/Content.java
+++ b/cmds/content/src/com/android/commands/content/Content.java
@@ -462,7 +462,7 @@ public class Content {
IBinder token = new Binder();
try {
ContentProviderHolder holder = activityManager.getContentProviderExternal(
- providerName, mUserId, token);
+ providerName, mUserId, token, "*cmd*");
if (holder == null) {
throw new IllegalStateException("Could not find provider: " + providerName);
}
diff --git a/cmds/dpm/src/com/android/commands/dpm/Dpm.java b/cmds/dpm/src/com/android/commands/dpm/Dpm.java
index 7c1a5557a1e9..376b13cd371e 100644
--- a/cmds/dpm/src/com/android/commands/dpm/Dpm.java
+++ b/cmds/dpm/src/com/android/commands/dpm/Dpm.java
@@ -46,6 +46,7 @@ public final class Dpm extends BaseCommand {
private static final String COMMAND_SET_PROFILE_OWNER = "set-profile-owner";
private static final String COMMAND_REMOVE_ACTIVE_ADMIN = "remove-active-admin";
private static final String COMMAND_CLEAR_FREEZE_PERIOD_RECORD = "clear-freeze-period-record";
+ private static final String COMMAND_FORCE_NETWORK_LOGS = "force-network-logs";
private static final String COMMAND_FORCE_SECURITY_LOGS = "force-security-logs";
private IDevicePolicyManager mDevicePolicyManager;
@@ -84,6 +85,9 @@ public final class Dpm extends BaseCommand {
"feature development to prevent triggering restriction on setting freeze " +
"periods.\n" +
"\n" +
+ "dpm " + COMMAND_FORCE_NETWORK_LOGS + ": makes all network logs available to " +
+ "the DPC and triggers DeviceAdminReceiver.onNetworkLogsAvailable() if needed.\n" +
+ "\n" +
"dpm " + COMMAND_FORCE_SECURITY_LOGS + ": makes all security logs available to " +
"the DPC and triggers DeviceAdminReceiver.onSecurityLogsAvailable() if needed.");
}
@@ -114,6 +118,9 @@ public final class Dpm extends BaseCommand {
case COMMAND_CLEAR_FREEZE_PERIOD_RECORD:
runClearFreezePeriodRecord();
break;
+ case COMMAND_FORCE_NETWORK_LOGS:
+ runForceNetworkLogs();
+ break;
case COMMAND_FORCE_SECURITY_LOGS:
runForceSecurityLogs();
break;
@@ -122,6 +129,18 @@ public final class Dpm extends BaseCommand {
}
}
+ private void runForceNetworkLogs() throws RemoteException, InterruptedException {
+ while (true) {
+ final long toWait = mDevicePolicyManager.forceNetworkLogs();
+ if (toWait == 0) {
+ break;
+ }
+ System.out.println("We have to wait for " + toWait + " milliseconds...");
+ Thread.sleep(toWait);
+ }
+ System.out.println("Success");
+ }
+
private void runForceSecurityLogs() throws RemoteException, InterruptedException {
while (true) {
final long toWait = mDevicePolicyManager.forceSecurityLogs();
diff --git a/cmds/idmap/Android.bp b/cmds/idmap/Android.bp
new file mode 100644
index 000000000000..ae5d74a47000
--- /dev/null
+++ b/cmds/idmap/Android.bp
@@ -0,0 +1,38 @@
+// Copyright (C) 2012 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.
+
+cc_binary {
+ name: "idmap",
+
+ srcs: [
+ "idmap.cpp",
+ "create.cpp",
+ "scan.cpp",
+ "inspect.cpp",
+ ],
+
+ shared_libs: [
+ "liblog",
+ "libutils",
+ "libandroidfw",
+ "libcutils",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/cmds/idmap/Android.mk b/cmds/idmap/Android.mk
deleted file mode 100644
index aeb8a0c001ec..000000000000
--- a/cmds/idmap/Android.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (C) 2012 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.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := idmap.cpp create.cpp scan.cpp inspect.cpp
-
-LOCAL_SHARED_LIBRARIES := liblog libutils libandroidfw libcutils
-
-LOCAL_MODULE := idmap
-
-LOCAL_C_INCLUDES := external/zlib
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_EXECUTABLE)
diff --git a/cmds/incident_helper/src/main.cpp b/cmds/incident_helper/src/main.cpp
index 418dc3fad761..5b6ac7af539c 100644
--- a/cmds/incident_helper/src/main.cpp
+++ b/cmds/incident_helper/src/main.cpp
@@ -73,7 +73,8 @@ static TextParserBase* selectParser(int section) {
case 2006:
return new BatteryTypeParser();
default:
- return NULL;
+ // Return no op parser when no specific ones are implemented.
+ return new NoopParser();
}
}
diff --git a/cmds/incidentd/src/FdBuffer.cpp b/cmds/incidentd/src/FdBuffer.cpp
index 0885b13483c6..a8ef8311720d 100644
--- a/cmds/incidentd/src/FdBuffer.cpp
+++ b/cmds/incidentd/src/FdBuffer.cpp
@@ -71,7 +71,8 @@ status_t FdBuffer::read(int fd, int64_t timeout) {
VLOG("return event has error %s", strerror(errno));
return errno != 0 ? -errno : UNKNOWN_ERROR;
} else {
- ssize_t amt = ::read(fd, mBuffer.writeBuffer(), mBuffer.currentToWrite());
+ ssize_t amt = TEMP_FAILURE_RETRY(
+ ::read(fd, mBuffer.writeBuffer(), mBuffer.currentToWrite()));
if (amt < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
continue;
@@ -182,9 +183,9 @@ status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd f
if (cirSize != BUFFER_SIZE && pfds[0].fd != -1) {
ssize_t amt;
if (rpos >= wpos) {
- amt = ::read(fd, cirBuf + rpos, BUFFER_SIZE - rpos);
+ amt = TEMP_FAILURE_RETRY(::read(fd, cirBuf + rpos, BUFFER_SIZE - rpos));
} else {
- amt = ::read(fd, cirBuf + rpos, wpos - rpos);
+ amt = TEMP_FAILURE_RETRY(::read(fd, cirBuf + rpos, wpos - rpos));
}
if (amt < 0) {
if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
@@ -204,9 +205,9 @@ status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd f
if (cirSize > 0 && pfds[1].fd != -1) {
ssize_t amt;
if (rpos > wpos) {
- amt = ::write(toFd.get(), cirBuf + wpos, rpos - wpos);
+ amt = TEMP_FAILURE_RETRY(::write(toFd.get(), cirBuf + wpos, rpos - wpos));
} else {
- amt = ::write(toFd.get(), cirBuf + wpos, BUFFER_SIZE - wpos);
+ amt = TEMP_FAILURE_RETRY(::write(toFd.get(), cirBuf + wpos, BUFFER_SIZE - wpos));
}
if (amt < 0) {
if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
@@ -235,7 +236,8 @@ status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd f
}
// read from parsing process
- ssize_t amt = ::read(fromFd.get(), mBuffer.writeBuffer(), mBuffer.currentToWrite());
+ ssize_t amt = TEMP_FAILURE_RETRY(
+ ::read(fromFd.get(), mBuffer.writeBuffer(), mBuffer.currentToWrite()));
if (amt < 0) {
if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
VLOG("Fail to read fromFd %d: %s", fromFd.get(), strerror(errno));
diff --git a/cmds/incidentd/src/IncidentService.cpp b/cmds/incidentd/src/IncidentService.cpp
index e305b5462b77..e92cf9444e15 100644
--- a/cmds/incidentd/src/IncidentService.cpp
+++ b/cmds/incidentd/src/IncidentService.cpp
@@ -314,6 +314,19 @@ status_t IncidentService::command(FILE* in, FILE* out, FILE* err, Vector<String8
mThrottler->dump(out);
return NO_ERROR;
}
+ if (!args[0].compare(String8("section"))) {
+ int id = atoi(args[1]);
+ int idx = 0;
+ while (SECTION_LIST[idx] != NULL) {
+ const Section* section = SECTION_LIST[idx];
+ if (section->id == id) {
+ fprintf(out, "Section[%d] %s\n", id, section->name.string());
+ break;
+ }
+ idx++;
+ }
+ return NO_ERROR;
+ }
}
return cmd_help(out);
}
@@ -321,8 +334,9 @@ status_t IncidentService::command(FILE* in, FILE* out, FILE* err, Vector<String8
status_t IncidentService::cmd_help(FILE* out) {
fprintf(out, "usage: adb shell cmd incident privacy print <section_id>\n");
fprintf(out, "usage: adb shell cmd incident privacy parse <section_id> < proto.txt\n");
- fprintf(out, " Prints/parses for the section id.\n");
- fprintf(out, "\n");
+ fprintf(out, " Prints/parses for the section id.\n\n");
+ fprintf(out, "usage: adb shell cmd incident section <section_id>\n");
+ fprintf(out, " Prints section id and its name.\n\n");
fprintf(out, "usage: adb shell cmd incident throttler\n");
fprintf(out, " Prints the current throttler state\n");
return NO_ERROR;
diff --git a/cmds/incidentd/src/PrivacyBuffer.cpp b/cmds/incidentd/src/PrivacyBuffer.cpp
index d753e5e6404e..7a8ebe394d51 100644
--- a/cmds/incidentd/src/PrivacyBuffer.cpp
+++ b/cmds/incidentd/src/PrivacyBuffer.cpp
@@ -86,8 +86,8 @@ status_t PrivacyBuffer::stripField(const Privacy* parentPolicy, const PrivacySpe
// iterator will point to head of next field
size_t currentAt = mData.rp()->pos();
writeFieldOrSkip(fieldTag, skip);
- VLOG("[Depth %2d]Field %d %ss %d bytes", depth, fieldId, skip ? "skip" : "write",
- (int)(get_varint_size(fieldTag) + mData.rp()->pos() - currentAt));
+ VLOG("[Depth %2d]Field %d %ss %zu bytes", depth, fieldId, skip ? "skip" : "write",
+ get_varint_size(fieldTag) + mData.rp()->pos() - currentAt);
return NO_ERROR;
}
// current field is message type and its sub-fields have extra privacy policies
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index 4bbe04204a54..87799b38906c 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -151,11 +151,10 @@ DONE:
}
// ================================================================================
-Section::Section(int i, int64_t timeoutMs, bool userdebugAndEngOnly, bool deviceSpecific)
+Section::Section(int i, int64_t timeoutMs, bool userdebugAndEngOnly)
: id(i),
timeoutMs(timeoutMs),
- userdebugAndEngOnly(userdebugAndEngOnly),
- deviceSpecific(deviceSpecific) {}
+ userdebugAndEngOnly(userdebugAndEngOnly) {}
Section::~Section() {}
@@ -240,10 +239,10 @@ status_t MetadataSection::Execute(ReportRequestSet* requests) const {
// ================================================================================
static inline bool isSysfs(const char* filename) { return strncmp(filename, "/sys/", 5) == 0; }
-FileSection::FileSection(int id, const char* filename, const bool deviceSpecific,
- const int64_t timeoutMs)
- : Section(id, timeoutMs, false, deviceSpecific), mFilename(filename) {
- name = filename;
+FileSection::FileSection(int id, const char* filename, const int64_t timeoutMs)
+ : Section(id, timeoutMs, false), mFilename(filename) {
+ name = "file ";
+ name += filename;
mIsSysfs = isSysfs(filename);
}
@@ -254,8 +253,10 @@ status_t FileSection::Execute(ReportRequestSet* requests) const {
// add O_CLOEXEC to make sure it is closed when exec incident helper
unique_fd fd(open(mFilename, O_RDONLY | O_CLOEXEC));
if (fd.get() == -1) {
- ALOGW("FileSection '%s' failed to open file", this->name.string());
- return this->deviceSpecific ? NO_ERROR : -errno;
+ ALOGW("[%s] failed to open file", this->name.string());
+ // There may be some devices/architectures that won't have the file.
+ // Just return here without an error.
+ return NO_ERROR;
}
FdBuffer buffer;
@@ -263,13 +264,13 @@ status_t FileSection::Execute(ReportRequestSet* requests) const {
Fpipe c2pPipe;
// initiate pipes to pass data to/from incident_helper
if (!p2cPipe.init() || !c2pPipe.init()) {
- ALOGW("FileSection '%s' failed to setup pipes", this->name.string());
+ ALOGW("[%s] failed to setup pipes", this->name.string());
return -errno;
}
pid_t pid = fork_execute_incident_helper(this->id, &p2cPipe, &c2pPipe);
if (pid == -1) {
- ALOGW("FileSection '%s' failed to fork", this->name.string());
+ ALOGW("[%s] failed to fork", this->name.string());
return -errno;
}
@@ -279,7 +280,7 @@ status_t FileSection::Execute(ReportRequestSet* requests) const {
this->timeoutMs, mIsSysfs);
write_section_stats(requests->sectionStats(this->id), buffer);
if (readStatus != NO_ERROR || buffer.timedOut()) {
- ALOGW("FileSection '%s' failed to read data from incident helper: %s, timedout: %s",
+ ALOGW("[%s] failed to read data from incident helper: %s, timedout: %s",
this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false");
kill_child(pid);
return readStatus;
@@ -287,20 +288,11 @@ status_t FileSection::Execute(ReportRequestSet* requests) const {
status_t ihStatus = wait_child(pid);
if (ihStatus != NO_ERROR) {
- ALOGW("FileSection '%s' abnormal child process: %s", this->name.string(),
- strerror(-ihStatus));
+ ALOGW("[%s] abnormal child process: %s", this->name.string(), strerror(-ihStatus));
return ihStatus;
}
- VLOG("FileSection '%s' wrote %zd bytes in %d ms", this->name.string(), buffer.size(),
- (int)buffer.durationMs());
- status_t err = write_report_requests(this->id, buffer, requests);
- if (err != NO_ERROR) {
- ALOGW("FileSection '%s' failed writing: %s", this->name.string(), strerror(-err));
- return err;
- }
-
- return NO_ERROR;
+ return write_report_requests(this->id, buffer, requests);
}
// ================================================================================
GZipSection::GZipSection(int id, const char* filename, ...) : Section(id) {
@@ -329,9 +321,8 @@ status_t GZipSection::Execute(ReportRequestSet* requests) const {
ALOGW("GZipSection failed to open file %s", mFilenames[index]);
index++; // look at the next file.
}
- VLOG("GZipSection is using file %s, fd=%d", mFilenames[index], fd.get());
if (fd.get() == -1) {
- ALOGW("GZipSection %s can't open all the files", this->name.string());
+ ALOGW("[%s] can't open all the files", this->name.string());
return NO_ERROR; // e.g. LAST_KMSG will reach here in user build.
}
FdBuffer buffer;
@@ -339,13 +330,13 @@ status_t GZipSection::Execute(ReportRequestSet* requests) const {
Fpipe c2pPipe;
// initiate pipes to pass data to/from gzip
if (!p2cPipe.init() || !c2pPipe.init()) {
- ALOGW("GZipSection '%s' failed to setup pipes", this->name.string());
+ ALOGW("[%s] failed to setup pipes", this->name.string());
return -errno;
}
pid_t pid = fork_execute_cmd((char* const*)GZIP, &p2cPipe, &c2pPipe);
if (pid == -1) {
- ALOGW("GZipSection '%s' failed to fork", this->name.string());
+ ALOGW("[%s] failed to fork", this->name.string());
return -errno;
}
// parent process
@@ -364,24 +355,22 @@ status_t GZipSection::Execute(ReportRequestSet* requests) const {
size_t editPos = internalBuffer->wp()->pos();
internalBuffer->wp()->move(8); // reserve 8 bytes for the varint of the data size.
size_t dataBeginAt = internalBuffer->wp()->pos();
- VLOG("GZipSection '%s' editPos=%zd, dataBeginAt=%zd", this->name.string(), editPos,
- dataBeginAt);
+ VLOG("[%s] editPos=%zu, dataBeginAt=%zu", this->name.string(), editPos, dataBeginAt);
status_t readStatus = buffer.readProcessedDataInStream(
fd.get(), std::move(p2cPipe.writeFd()), std::move(c2pPipe.readFd()), this->timeoutMs,
isSysfs(mFilenames[index]));
write_section_stats(requests->sectionStats(this->id), buffer);
if (readStatus != NO_ERROR || buffer.timedOut()) {
- ALOGW("GZipSection '%s' failed to read data from gzip: %s, timedout: %s",
- this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false");
+ ALOGW("[%s] failed to read data from gzip: %s, timedout: %s", this->name.string(),
+ strerror(-readStatus), buffer.timedOut() ? "true" : "false");
kill_child(pid);
return readStatus;
}
status_t gzipStatus = wait_child(pid);
if (gzipStatus != NO_ERROR) {
- ALOGW("GZipSection '%s' abnormal child process: %s", this->name.string(),
- strerror(-gzipStatus));
+ ALOGW("[%s] abnormal child process: %s", this->name.string(), strerror(-gzipStatus));
return gzipStatus;
}
// Revisit the actual size from gzip result and edit the internal buffer accordingly.
@@ -389,15 +378,8 @@ status_t GZipSection::Execute(ReportRequestSet* requests) const {
internalBuffer->wp()->rewind()->move(editPos);
internalBuffer->writeRawVarint32(dataSize);
internalBuffer->copy(dataBeginAt, dataSize);
- VLOG("GZipSection '%s' wrote %zd bytes in %d ms, dataSize=%zd", this->name.string(),
- buffer.size(), (int)buffer.durationMs(), dataSize);
- status_t err = write_report_requests(this->id, buffer, requests);
- if (err != NO_ERROR) {
- ALOGW("GZipSection '%s' failed writing: %s", this->name.string(), strerror(-err));
- return err;
- }
- return NO_ERROR;
+ return write_report_requests(this->id, buffer, requests);
}
// ================================================================================
@@ -482,8 +464,7 @@ status_t WorkerThreadSection::Execute(ReportRequestSet* requests) const {
err = buffer.read(data->pipe.readFd().get(), this->timeoutMs);
if (err != NO_ERROR) {
// TODO: Log this error into the incident report.
- ALOGW("WorkerThreadSection '%s' reader failed with error '%s'", this->name.string(),
- strerror(-err));
+ ALOGW("[%s] reader failed with error '%s'", this->name.string(), strerror(-err));
}
// Done with the read fd. The worker thread closes the write one so
@@ -501,39 +482,25 @@ status_t WorkerThreadSection::Execute(ReportRequestSet* requests) const {
if (data->workerError != NO_ERROR) {
err = data->workerError;
// TODO: Log this error into the incident report.
- ALOGW("WorkerThreadSection '%s' worker failed with error '%s'", this->name.string(),
- strerror(-err));
+ ALOGW("[%s] worker failed with error '%s'", this->name.string(), strerror(-err));
}
}
}
write_section_stats(requests->sectionStats(this->id), buffer);
if (timedOut || buffer.timedOut()) {
- ALOGW("WorkerThreadSection '%s' timed out", this->name.string());
+ ALOGW("[%s] timed out", this->name.string());
return NO_ERROR;
}
- if (buffer.truncated()) {
- // TODO: Log this into the incident report.
- }
-
// TODO: There was an error with the command or buffering. Report that. For now
// just exit with a log messasge.
if (err != NO_ERROR) {
- ALOGW("WorkerThreadSection '%s' failed with error '%s'", this->name.string(),
- strerror(-err));
+ ALOGW("[%s] failed with error '%s'", this->name.string(), strerror(-err));
return NO_ERROR;
}
// Write the data that was collected
- VLOG("WorkerThreadSection '%s' wrote %zd bytes in %d ms", name.string(), buffer.size(),
- (int)buffer.durationMs());
- err = write_report_requests(this->id, buffer, requests);
- if (err != NO_ERROR) {
- ALOGW("WorkerThreadSection '%s' failed writing: '%s'", this->name.string(), strerror(-err));
- return err;
- }
-
- return NO_ERROR;
+ return write_report_requests(this->id, buffer, requests);
}
// ================================================================================
@@ -570,18 +537,18 @@ status_t CommandSection::Execute(ReportRequestSet* requests) const {
Fpipe ihPipe;
if (!cmdPipe.init() || !ihPipe.init()) {
- ALOGW("CommandSection '%s' failed to setup pipes", this->name.string());
+ ALOGW("[%s] failed to setup pipes", this->name.string());
return -errno;
}
pid_t cmdPid = fork_execute_cmd((char* const*)mCommand, NULL, &cmdPipe);
if (cmdPid == -1) {
- ALOGW("CommandSection '%s' failed to fork", this->name.string());
+ ALOGW("[%s] failed to fork", this->name.string());
return -errno;
}
pid_t ihPid = fork_execute_incident_helper(this->id, &cmdPipe, &ihPipe);
if (ihPid == -1) {
- ALOGW("CommandSection '%s' failed to fork", this->name.string());
+ ALOGW("[%s] failed to fork", this->name.string());
return -errno;
}
@@ -589,7 +556,7 @@ status_t CommandSection::Execute(ReportRequestSet* requests) const {
status_t readStatus = buffer.read(ihPipe.readFd().get(), this->timeoutMs);
write_section_stats(requests->sectionStats(this->id), buffer);
if (readStatus != NO_ERROR || buffer.timedOut()) {
- ALOGW("CommandSection '%s' failed to read data from incident helper: %s, timedout: %s",
+ ALOGW("[%s] failed to read data from incident helper: %s, timedout: %s",
this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false");
kill_child(cmdPid);
kill_child(ihPid);
@@ -601,20 +568,13 @@ status_t CommandSection::Execute(ReportRequestSet* requests) const {
status_t cmdStatus = wait_child(cmdPid);
status_t ihStatus = wait_child(ihPid);
if (cmdStatus != NO_ERROR || ihStatus != NO_ERROR) {
- ALOGW("CommandSection '%s' abnormal child processes, return status: command: %s, incident "
+ ALOGW("[%s] abnormal child processes, return status: command: %s, incident "
"helper: %s",
this->name.string(), strerror(-cmdStatus), strerror(-ihStatus));
return cmdStatus != NO_ERROR ? cmdStatus : ihStatus;
}
- VLOG("CommandSection '%s' wrote %zd bytes in %d ms", this->name.string(), buffer.size(),
- (int)buffer.durationMs());
- status_t err = write_report_requests(this->id, buffer, requests);
- if (err != NO_ERROR) {
- ALOGW("CommandSection '%s' failed writing: %s", this->name.string(), strerror(-err));
- return err;
- }
- return NO_ERROR;
+ return write_report_requests(this->id, buffer, requests);
}
// ================================================================================
@@ -664,7 +624,7 @@ status_t DumpsysSection::BlockingCall(int pipeWriteFd) const {
map<log_id_t, log_time> LogSection::gLastLogsRetrieved;
LogSection::LogSection(int id, log_id_t logID) : WorkerThreadSection(id), mLogID(logID) {
- name += "logcat ";
+ name = "logcat ";
name += android_log_id_to_name(logID);
switch (logID) {
case LOG_ID_EVENTS:
@@ -705,7 +665,7 @@ status_t LogSection::BlockingCall(int pipeWriteFd) const {
android_logger_list_free);
if (android_logger_open(loggers.get(), mLogID) == NULL) {
- ALOGE("LogSection %s: Can't get logger.", this->name.string());
+ ALOGE("[%s] Can't get logger.", this->name.string());
return -1;
}
@@ -721,7 +681,7 @@ status_t LogSection::BlockingCall(int pipeWriteFd) const {
// err = -EAGAIN, graceful indication for ANDRODI_LOG_NONBLOCK that this is the end of data.
if (err <= 0) {
if (err != -EAGAIN) {
- ALOGW("LogSection %s: fails to read a log_msg.\n", this->name.string());
+ ALOGW("[%s] fails to read a log_msg.\n", this->name.string());
}
// dump previous logs and don't consider this error a failure.
break;
@@ -792,7 +752,7 @@ status_t LogSection::BlockingCall(int pipeWriteFd) const {
AndroidLogEntry entry;
err = android_log_processLogBuffer(&msg.entry_v1, &entry);
if (err != NO_ERROR) {
- ALOGW("LogSection %s: fails to process to an entry.\n", this->name.string());
+ ALOGW("[%s] fails to process to an entry.\n", this->name.string());
break;
}
lastTimestamp.tv_sec = entry.tv_sec;
@@ -821,7 +781,7 @@ status_t LogSection::BlockingCall(int pipeWriteFd) const {
TombstoneSection::TombstoneSection(int id, const char* type, const int64_t timeoutMs)
: WorkerThreadSection(id, timeoutMs), mType(type) {
- name += "tombstone ";
+ name = "tombstone ";
name += type;
}
@@ -876,7 +836,7 @@ status_t TombstoneSection::BlockingCall(int pipeWriteFd) const {
Fpipe dumpPipe;
if (!dumpPipe.init()) {
- ALOGW("TombstoneSection '%s' failed to setup dump pipe", this->name.string());
+ ALOGW("[%s] failed to setup dump pipe", this->name.string());
err = -errno;
break;
}
@@ -910,7 +870,7 @@ status_t TombstoneSection::BlockingCall(int pipeWriteFd) const {
// Wait on the child to avoid it becoming a zombie process.
status_t cStatus = wait_child(child);
if (err != NO_ERROR) {
- ALOGW("TombstoneSection '%s' failed to read stack dump: %d", this->name.string(), err);
+ ALOGW("[%s] failed to read stack dump: %d", this->name.string(), err);
dumpPipe.readFd().reset();
break;
}
diff --git a/cmds/incidentd/src/Section.h b/cmds/incidentd/src/Section.h
index a031a15fe7c9..302b4ef7ae34 100644
--- a/cmds/incidentd/src/Section.h
+++ b/cmds/incidentd/src/Section.h
@@ -41,11 +41,9 @@ public:
const int id;
const int64_t timeoutMs; // each section must have a timeout
const bool userdebugAndEngOnly;
- const bool deviceSpecific;
String8 name;
- Section(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS, bool userdebugAndEngOnly = false,
- bool deviceSpecific = false);
+ Section(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS, bool userdebugAndEngOnly = false);
virtual ~Section();
virtual status_t Execute(ReportRequestSet* requests) const = 0;
@@ -78,7 +76,7 @@ public:
*/
class FileSection : public Section {
public:
- FileSection(int id, const char* filename, bool deviceSpecific = false,
+ FileSection(int id, const char* filename,
int64_t timeoutMs = 5000 /* 5 seconds */);
virtual ~FileSection();
diff --git a/cmds/incidentd/src/Throttler.cpp b/cmds/incidentd/src/Throttler.cpp
index 2b790ca14176..11136ecca091 100644
--- a/cmds/incidentd/src/Throttler.cpp
+++ b/cmds/incidentd/src/Throttler.cpp
@@ -18,6 +18,7 @@
#include "Throttler.h"
+#include <inttypes.h>
#include <utils/SystemClock.h>
namespace android {
@@ -42,15 +43,15 @@ bool Throttler::shouldThrottle() {
}
void Throttler::addReportSize(size_t reportByteSize) {
- VLOG("The current request took %d bytes to dropbox", (int)reportByteSize);
+ VLOG("The current request took %zu bytes to dropbox", reportByteSize);
mAccumulatedSize += reportByteSize;
}
void Throttler::dump(FILE* out) {
- fprintf(out, "mSizeLimit=%d\n", (int)mSizeLimit);
- fprintf(out, "mAccumulatedSize=%d\n", (int)mAccumulatedSize);
- fprintf(out, "mRefractoryPeriodMs=%d\n", (int)mRefractoryPeriodMs);
- fprintf(out, "mLastRefractoryMs=%d\n", (int)mLastRefractoryMs);
+ fprintf(out, "mSizeLimit=%zu\n", mSizeLimit);
+ fprintf(out, "mAccumulatedSize=%zu\n", mAccumulatedSize);
+ fprintf(out, "mRefractoryPeriodMs=%" PRIi64 "\n", mRefractoryPeriodMs);
+ fprintf(out, "mLastRefractoryMs=%" PRIi64 "\n", mLastRefractoryMs);
}
} // namespace incidentd
diff --git a/cmds/incidentd/tests/Reporter_test.cpp b/cmds/incidentd/tests/Reporter_test.cpp
index cf107c858cca..108690844280 100644
--- a/cmds/incidentd/tests/Reporter_test.cpp
+++ b/cmds/incidentd/tests/Reporter_test.cpp
@@ -176,7 +176,7 @@ TEST_F(ReporterTest, RunReportToGivenDirectory) {
ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
vector<string> results = InspectFiles();
- ASSERT_EQ((int)results.size(), 1);
+ ASSERT_EQ(results.size(), 1UL);
EXPECT_EQ(results[0],
"\n\x2"
"\b\f\n\x6"
diff --git a/cmds/incidentd/tests/Section_test.cpp b/cmds/incidentd/tests/Section_test.cpp
index 3c338b3a36c8..9b684a060286 100644
--- a/cmds/incidentd/tests/Section_test.cpp
+++ b/cmds/incidentd/tests/Section_test.cpp
@@ -144,15 +144,15 @@ TEST_F(SectionTest, FileSection) {
}
TEST_F(SectionTest, FileSectionNotExist) {
- FileSection fs1(NOOP_PARSER, "notexist", false, QUICK_TIMEOUT_MS);
- ASSERT_EQ(NAME_NOT_FOUND, fs1.Execute(&requests));
+ FileSection fs1(NOOP_PARSER, "notexist", QUICK_TIMEOUT_MS);
+ ASSERT_EQ(NO_ERROR, fs1.Execute(&requests));
- FileSection fs2(NOOP_PARSER, "notexist", true, QUICK_TIMEOUT_MS);
+ FileSection fs2(NOOP_PARSER, "notexist", QUICK_TIMEOUT_MS);
ASSERT_EQ(NO_ERROR, fs2.Execute(&requests));
}
TEST_F(SectionTest, FileSectionTimeout) {
- FileSection fs(TIMEOUT_PARSER, tf.path, false, QUICK_TIMEOUT_MS);
+ FileSection fs(TIMEOUT_PARSER, tf.path, QUICK_TIMEOUT_MS);
ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
ASSERT_TRUE(requests.sectionStats(TIMEOUT_PARSER)->timed_out());
}
diff --git a/cmds/input/src/com/android/commands/input/Input.java b/cmds/input/src/com/android/commands/input/Input.java
index d3ec32076292..74edffb4738d 100644
--- a/cmds/input/src/com/android/commands/input/Input.java
+++ b/cmds/input/src/com/android/commands/input/Input.java
@@ -91,9 +91,6 @@ public class Input {
if (args.length > start) {
for (int i = start; i < args.length; i++) {
int keyCode = KeyEvent.keyCodeFromString(args[i]);
- if (keyCode == KeyEvent.KEYCODE_UNKNOWN) {
- keyCode = KeyEvent.keyCodeFromString("KEYCODE_" + args[i]);
- }
sendKeyEvent(inputSource, keyCode, longpress);
}
return;
diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp
index 31722815276c..b11e84322dde 100644
--- a/cmds/screencap/screencap.cpp
+++ b/cmds/screencap/screencap.cpp
@@ -182,8 +182,7 @@ int main(int argc, char** argv)
sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(displayId);
if (display == NULL) {
fprintf(stderr, "Unable to get handle for display %d\n", displayId);
- // b/36066697: Avoid running static destructors.
- _exit(1);
+ return 1;
}
Vector<DisplayInfo> configs;
@@ -192,8 +191,7 @@ int main(int argc, char** argv)
if (static_cast<size_t>(activeConfig) >= configs.size()) {
fprintf(stderr, "Active config %d not inside configs (size %zu)\n",
activeConfig, configs.size());
- // b/36066697: Avoid running static destructors.
- _exit(1);
+ return 1;
}
uint8_t displayOrientation = configs[activeConfig].orientation;
uint32_t captureOrientation = ORIENTATION_MAP[displayOrientation];
@@ -204,14 +202,14 @@ int main(int argc, char** argv)
&outBuffer);
if (result != NO_ERROR) {
close(fd);
- _exit(1);
+ return 1;
}
result = outBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &base);
if (base == NULL) {
close(fd);
- _exit(1);
+ return 1;
}
w = outBuffer->getWidth();
@@ -256,6 +254,5 @@ int main(int argc, char** argv)
munmap((void *)mapbase, mapsize);
}
- // b/36066697: Avoid running static destructors.
- _exit(0);
+ return 0;
} \ No newline at end of file
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp
index b5660995fa36..14af5b96ffac 100644
--- a/cmds/statsd/Android.bp
+++ b/cmds/statsd/Android.bp
@@ -25,6 +25,7 @@ cc_library_host_shared {
],
shared_libs: [
+ "libmetricprotos",
"libplatformprotos",
],
@@ -37,6 +38,7 @@ cc_library_host_shared {
},
export_shared_lib_headers: [
+ "libmetricprotos",
"libplatformprotos",
]
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index 091268e15ad4..e182ad1b1a9a 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -35,12 +35,13 @@ statsd_common_src := \
src/config/ConfigListener.cpp \
src/config/ConfigManager.cpp \
src/external/Perfetto.cpp \
+ src/external/Perfprofd.cpp \
src/external/StatsPuller.cpp \
src/external/StatsCompanionServicePuller.cpp \
src/external/SubsystemSleepStatePuller.cpp \
src/external/ResourceHealthManagerPuller.cpp \
src/external/ResourceThermalManagerPuller.cpp \
- src/external/StatsPullerManagerImpl.cpp \
+ src/external/StatsPullerManager.cpp \
src/external/puller_util.cpp \
src/logd/LogEvent.cpp \
src/logd/LogListener.cpp \
@@ -70,6 +71,11 @@ statsd_common_src := \
src/guardrail/StatsdStats.cpp \
src/socket/StatsSocketListener.cpp
+# TODO(b/110563449): Once statsd is using a blueprint file, migrate to the proper filegroups.
+statsd_common_src += \
+ ../../../../system/extras/perfprofd/binder_interface/aidl/android/os/IPerfProfd.aidl \
+ src/perfprofd/perfprofd_config.proto
+
statsd_common_c_includes := \
$(LOCAL_PATH)/src \
$(LOCAL_PATH)/../../libs/services/include
@@ -78,8 +84,7 @@ statsd_common_aidl_includes := \
$(LOCAL_PATH)/../../core/java
statsd_common_static_libraries := \
- libhealthhalutils \
- libplatformprotos \
+ libhealthhalutils
statsd_common_shared_libraries := \
libbase \
@@ -141,10 +146,14 @@ LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
LOCAL_MODULE_CLASS := EXECUTABLES
-# Enable sanitizer and allow very verbose printing on eng builds
+# Enable sanitizer ONLY on eng builds.
ifeq ($(TARGET_BUILD_VARIANT),eng)
LOCAL_CLANG := true
LOCAL_SANITIZE := address
+endif
+
+# Add a flag to enable stats log printing from statsd on debug builds.
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += \
-DVERY_VERBOSE_PRINTING
endif
@@ -224,7 +233,9 @@ LOCAL_SRC_FILES := \
LOCAL_STATIC_LIBRARIES := \
$(statsd_common_static_libraries) \
- libgmock
+ libgmock \
+ libmetricprotos \
+ libplatformprotos
LOCAL_PROTOC_OPTIMIZE_TYPE := full
@@ -244,9 +255,11 @@ include $(CLEAR_VARS)
LOCAL_MODULE := statsdprotolite
LOCAL_SRC_FILES := \
+ src/metrics_constants/metrics_constants.proto \
src/stats_log.proto \
src/statsd_config.proto \
src/perfetto/perfetto_config.proto \
+ src/perfprofd/perfprofd_config.proto \
src/atoms.proto
LOCAL_PROTOC_OPTIMIZE_TYPE := lite
@@ -290,7 +303,6 @@ LOCAL_PROTOC_FLAGS := \
LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
libprotobuf-cpp-full
-
LOCAL_STATIC_JAVA_LIBRARIES := \
platformprotoslite
@@ -308,7 +320,9 @@ LOCAL_CFLAGS += -Wno-varargs
LOCAL_AIDL_INCLUDES := $(statsd_common_aidl_includes)
LOCAL_STATIC_LIBRARIES := \
- $(statsd_common_static_libraries)
+ $(statsd_common_static_libraries) \
+ libmetricprotos \
+ libplatformprotos
LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
libgtest_prod \
diff --git a/cmds/statsd/benchmark/metric_util.cpp b/cmds/statsd/benchmark/metric_util.cpp
index 50ed18d3e2b0..067b6eddf254 100644
--- a/cmds/statsd/benchmark/metric_util.cpp
+++ b/cmds/statsd/benchmark/metric_util.cpp
@@ -362,11 +362,12 @@ std::unique_ptr<LogEvent> CreateSyncEndEvent(
sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
const ConfigKey& key) {
sp<UidMap> uidMap = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
- sp<StatsLogProcessor> processor = new StatsLogProcessor(
- uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec * NS_PER_SEC,
- [](const ConfigKey&){return true;});
+ sp<StatsLogProcessor> processor =
+ new StatsLogProcessor(uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
+ timeBaseSec * NS_PER_SEC, [](const ConfigKey&) { return true; });
processor->OnConfigUpdated(timeBaseSec * NS_PER_SEC, key, config);
return processor;
}
diff --git a/cmds/statsd/src/FieldValue.cpp b/cmds/statsd/src/FieldValue.cpp
index f150f074c52b..7b6d29b905bd 100644
--- a/cmds/statsd/src/FieldValue.cpp
+++ b/cmds/statsd/src/FieldValue.cpp
@@ -141,6 +141,9 @@ Value::Value(const Value& from) {
case FLOAT:
float_value = from.float_value;
break;
+ case DOUBLE:
+ double_value = from.double_value;
+ break;
case STRING:
str_value = from.str_value;
break;
@@ -157,6 +160,8 @@ std::string Value::toString() const {
return std::to_string(long_value) + "[L]";
case FLOAT:
return std::to_string(float_value) + "[F]";
+ case DOUBLE:
+ return std::to_string(double_value) + "[D]";
case STRING:
return str_value + "[S]";
default:
@@ -174,6 +179,8 @@ bool Value::operator==(const Value& that) const {
return long_value == that.long_value;
case FLOAT:
return float_value == that.float_value;
+ case DOUBLE:
+ return double_value == that.double_value;
case STRING:
return str_value == that.str_value;
default:
@@ -190,6 +197,8 @@ bool Value::operator!=(const Value& that) const {
return long_value != that.long_value;
case FLOAT:
return float_value != that.float_value;
+ case DOUBLE:
+ return double_value != that.double_value;
case STRING:
return str_value != that.str_value;
default:
@@ -207,6 +216,8 @@ bool Value::operator<(const Value& that) const {
return long_value < that.long_value;
case FLOAT:
return float_value < that.float_value;
+ case DOUBLE:
+ return double_value < that.double_value;
case STRING:
return str_value < that.str_value;
default:
@@ -214,6 +225,142 @@ bool Value::operator<(const Value& that) const {
}
}
+bool Value::operator>(const Value& that) const {
+ if (type != that.getType()) return type > that.getType();
+
+ switch (type) {
+ case INT:
+ return int_value > that.int_value;
+ case LONG:
+ return long_value > that.long_value;
+ case FLOAT:
+ return float_value > that.float_value;
+ case DOUBLE:
+ return double_value > that.double_value;
+ case STRING:
+ return str_value > that.str_value;
+ default:
+ return false;
+ }
+}
+
+bool Value::operator>=(const Value& that) const {
+ if (type != that.getType()) return type >= that.getType();
+
+ switch (type) {
+ case INT:
+ return int_value >= that.int_value;
+ case LONG:
+ return long_value >= that.long_value;
+ case FLOAT:
+ return float_value >= that.float_value;
+ case DOUBLE:
+ return double_value >= that.double_value;
+ case STRING:
+ return str_value >= that.str_value;
+ default:
+ return false;
+ }
+}
+
+Value Value::operator-(const Value& that) const {
+ Value v;
+ if (type != that.type) {
+ ALOGE("Can't operate on different value types, %d, %d", type, that.type);
+ return v;
+ }
+ if (type == STRING) {
+ ALOGE("Can't operate on string value type");
+ return v;
+ }
+
+ switch (type) {
+ case INT:
+ v.setInt(int_value - that.int_value);
+ break;
+ case LONG:
+ v.setLong(long_value - that.long_value);
+ break;
+ case FLOAT:
+ v.setFloat(float_value - that.float_value);
+ break;
+ case DOUBLE:
+ v.setDouble(double_value - that.double_value);
+ break;
+ default:
+ break;
+ }
+ return v;
+}
+
+Value& Value::operator=(const Value& that) {
+ type = that.type;
+ switch (type) {
+ case INT:
+ int_value = that.int_value;
+ break;
+ case LONG:
+ long_value = that.long_value;
+ break;
+ case FLOAT:
+ float_value = that.float_value;
+ break;
+ case DOUBLE:
+ double_value = that.double_value;
+ break;
+ case STRING:
+ str_value = that.str_value;
+ break;
+ default:
+ break;
+ }
+ return *this;
+}
+
+Value& Value::operator+=(const Value& that) {
+ if (type != that.type) {
+ ALOGE("Can't operate on different value types, %d, %d", type, that.type);
+ return *this;
+ }
+ if (type == STRING) {
+ ALOGE("Can't operate on string value type");
+ return *this;
+ }
+
+ switch (type) {
+ case INT:
+ int_value += that.int_value;
+ break;
+ case LONG:
+ long_value += that.long_value;
+ break;
+ case FLOAT:
+ float_value += that.float_value;
+ break;
+ case DOUBLE:
+ double_value += that.double_value;
+ break;
+ default:
+ break;
+ }
+ return *this;
+}
+
+double Value::getDouble() const {
+ switch (type) {
+ case INT:
+ return int_value;
+ case LONG:
+ return long_value;
+ case FLOAT:
+ return float_value;
+ case DOUBLE:
+ return double_value;
+ default:
+ return 0;
+ }
+}
+
bool equalDimensions(const std::vector<Matcher>& dimension_a,
const std::vector<Matcher>& dimension_b) {
bool eq = dimension_a.size() == dimension_b.size();
diff --git a/cmds/statsd/src/FieldValue.h b/cmds/statsd/src/FieldValue.h
index 02c49b99c583..b1b885ec4efa 100644
--- a/cmds/statsd/src/FieldValue.h
+++ b/cmds/statsd/src/FieldValue.h
@@ -32,7 +32,7 @@ const int32_t kLastBitMask = 0x80;
const int32_t kClearLastBitDeco = 0x7f;
const int32_t kClearAllPositionMatcherMask = 0xffff00ff;
-enum Type { UNKNOWN, INT, LONG, FLOAT, STRING };
+enum Type { UNKNOWN, INT, LONG, FLOAT, DOUBLE, STRING };
int32_t getEncodedField(int32_t pos[], int32_t depth, bool includeDepth);
@@ -212,7 +212,7 @@ public:
* the result is equal to the Matcher Field. That's a bit wise AND operation + check if 2 ints are
* equal. Nothing can beat the performance of this matching algorithm.
*
- * TODO: ADD EXAMPLE HERE.
+ * TODO(b/110561213): ADD EXAMPLE HERE.
*/
struct Matcher {
Matcher(const Field& matcher, int32_t mask) : mMatcher(matcher), mMask(mask){};
@@ -283,6 +283,11 @@ struct Value {
type = FLOAT;
}
+ Value(double v) {
+ double_value = v;
+ type = DOUBLE;
+ }
+
Value(const std::string& v) {
str_value = v;
type = STRING;
@@ -298,10 +303,21 @@ struct Value {
type = LONG;
}
+ void setFloat(float v) {
+ float_value = v;
+ type = FLOAT;
+ }
+
+ void setDouble(double v) {
+ double_value = v;
+ type = DOUBLE;
+ }
+
union {
int32_t int_value;
int64_t long_value;
float float_value;
+ double double_value;
};
std::string str_value;
@@ -313,12 +329,19 @@ struct Value {
return type;
}
+ double getDouble() const;
+
Value(const Value& from);
bool operator==(const Value& that) const;
bool operator!=(const Value& that) const;
bool operator<(const Value& that) const;
+ bool operator>(const Value& that) const;
+ bool operator>=(const Value& that) const;
+ Value operator-(const Value& that) const;
+ Value& operator+=(const Value& that);
+ Value& operator=(const Value& that);
};
/**
diff --git a/cmds/statsd/src/HashableDimensionKey.cpp b/cmds/statsd/src/HashableDimensionKey.cpp
index 71030345b0aa..af8b3af6ea61 100644
--- a/cmds/statsd/src/HashableDimensionKey.cpp
+++ b/cmds/statsd/src/HashableDimensionKey.cpp
@@ -65,8 +65,6 @@ bool filterValues(const vector<Matcher>& matcherFields, const vector<FieldValue>
for (const auto& value : values) {
for (size_t i = 0; i < matcherFields.size(); ++i) {
const auto& matcher = matcherFields[i];
- // TODO: potential optimization here to break early because all fields are naturally
- // sorted.
if (value.mField.matches(matcher)) {
output->addValue(value);
output->mutableValue(num_matches)->mField.setTag(value.mField.getTag());
@@ -196,4 +194,4 @@ bool MetricDimensionKey::operator<(const MetricDimensionKey& that) const {
} // namespace statsd
} // namespace os
-} // namespace android \ No newline at end of file
+} // namespace android
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index e7f1caf26932..ab0aa25103e9 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -72,18 +72,20 @@ const int FIELD_ID_STRINGS = 9;
#define STATS_DATA_DIR "/data/misc/stats-data"
StatsLogProcessor::StatsLogProcessor(const sp<UidMap>& uidMap,
+ const sp<StatsPullerManager>& pullerManager,
const sp<AlarmMonitor>& anomalyAlarmMonitor,
const sp<AlarmMonitor>& periodicAlarmMonitor,
const int64_t timeBaseNs,
const std::function<bool(const ConfigKey&)>& sendBroadcast)
: mUidMap(uidMap),
+ mPullerManager(pullerManager),
mAnomalyAlarmMonitor(anomalyAlarmMonitor),
mPeriodicAlarmMonitor(periodicAlarmMonitor),
mSendBroadcast(sendBroadcast),
mTimeBaseNs(timeBaseNs),
mLargestTimestampSeen(0),
mLastTimestampSeen(0) {
- mStatsPullerManager.ForceClearPullerCache();
+ mPullerManager->ForceClearPullerCache();
}
StatsLogProcessor::~StatsLogProcessor() {
@@ -152,7 +154,7 @@ void StatsLogProcessor::onIsolatedUidChangedEventLocked(const LogEvent& event) {
if (is_create) {
mUidMap->assignIsolatedUid(isolated_uid, parent_uid);
} else {
- mUidMap->removeIsolatedUid(isolated_uid, parent_uid);
+ mUidMap->removeIsolatedUid(isolated_uid);
}
} else {
ALOGE("Failed to parse uid in the isolated uid change event.");
@@ -238,7 +240,7 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event, bool reconnected) {
int64_t curTimeSec = getElapsedRealtimeSec();
if (curTimeSec - mLastPullerCacheClearTimeSec > StatsdStats::kPullerCacheClearIntervalSec) {
- mStatsPullerManager.ClearPullerCacheIfNecessary(curTimeSec * NS_PER_SEC);
+ mPullerManager->ClearPullerCacheIfNecessary(curTimeSec * NS_PER_SEC);
mLastPullerCacheClearTimeSec = curTimeSec;
}
@@ -266,8 +268,8 @@ void StatsLogProcessor::OnConfigUpdatedLocked(
const int64_t timestampNs, const ConfigKey& key, const StatsdConfig& config) {
VLOG("Updated configuration for key %s", key.ToString().c_str());
sp<MetricsManager> newMetricsManager =
- new MetricsManager(key, config, mTimeBaseNs, timestampNs, mUidMap,
- mAnomalyAlarmMonitor, mPeriodicAlarmMonitor);
+ new MetricsManager(key, config, mTimeBaseNs, timestampNs, mUidMap, mPullerManager,
+ mAnomalyAlarmMonitor, mPeriodicAlarmMonitor);
if (newMetricsManager->isConfigValid()) {
mUidMap->OnConfigUpdated(key);
if (newMetricsManager->shouldAddUidMapListener()) {
@@ -453,7 +455,7 @@ void StatsLogProcessor::OnConfigRemoved(const ConfigKey& key) {
mLastBroadcastTimes.erase(key);
if (mMetricsManagers.empty()) {
- mStatsPullerManager.ForceClearPullerCache();
+ mPullerManager->ForceClearPullerCache();
}
}
@@ -538,7 +540,7 @@ void StatsLogProcessor::WriteDataToDisk(const DumpReportReason dumpReportReason)
void StatsLogProcessor::informPullAlarmFired(const int64_t timestampNs) {
std::lock_guard<std::mutex> lock(mMetricsMutex);
- mStatsPullerManager.OnAlarmFired(timestampNs);
+ mPullerManager->OnAlarmFired(timestampNs);
}
int64_t StatsLogProcessor::getLastReportTimeNs(const ConfigKey& key) {
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index b175b3c544b5..05cf0c1fc764 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -45,7 +45,8 @@ enum DumpReportReason {
class StatsLogProcessor : public ConfigListener {
public:
- StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor,
+ StatsLogProcessor(const sp<UidMap>& uidMap, const sp<StatsPullerManager>& pullerManager,
+ const sp<AlarmMonitor>& anomalyAlarmMonitor,
const sp<AlarmMonitor>& subscriberTriggerAlarmMonitor,
const int64_t timeBaseNs,
const std::function<bool(const ConfigKey&)>& sendBroadcast);
@@ -126,7 +127,7 @@ private:
sp<UidMap> mUidMap; // Reference to the UidMap to lookup app name and version for each uid.
- StatsPullerManager mStatsPullerManager;
+ sp<StatsPullerManager> mPullerManager; // Reference to StatsPullerManager
sp<AlarmMonitor> mAnomalyAlarmMonitor;
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 10c04f67ca05..1119eb36c239 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -150,25 +150,26 @@ StatsService::StatsService(const sp<Looper>& handlerLooper)
})) {
mUidMap = new UidMap();
+ mPullerManager = new StatsPullerManager();
StatsPuller::SetUidMap(mUidMap);
mConfigManager = new ConfigManager();
- mProcessor = new StatsLogProcessor(mUidMap, mAnomalyAlarmMonitor, mPeriodicAlarmMonitor,
- getElapsedRealtimeNs(), [this](const ConfigKey& key) {
- sp<IStatsCompanionService> sc = getStatsCompanionService();
- auto receiver = mConfigManager->GetConfigReceiver(key);
- if (sc == nullptr) {
- VLOG("Could not find StatsCompanionService");
- return false;
- } else if (receiver == nullptr) {
- VLOG("Statscompanion could not find a broadcast receiver for %s",
- key.ToString().c_str());
- return false;
- } else {
- sc->sendDataBroadcast(receiver, mProcessor->getLastReportTimeNs(key));
- return true;
- }
- }
- );
+ mProcessor = new StatsLogProcessor(
+ mUidMap, mPullerManager, mAnomalyAlarmMonitor, mPeriodicAlarmMonitor,
+ getElapsedRealtimeNs(), [this](const ConfigKey& key) {
+ sp<IStatsCompanionService> sc = getStatsCompanionService();
+ auto receiver = mConfigManager->GetConfigReceiver(key);
+ if (sc == nullptr) {
+ VLOG("Could not find StatsCompanionService");
+ return false;
+ } else if (receiver == nullptr) {
+ VLOG("Statscompanion could not find a broadcast receiver for %s",
+ key.ToString().c_str());
+ return false;
+ } else {
+ sc->sendDataBroadcast(receiver, mProcessor->getLastReportTimeNs(key));
+ return true;
+ }
+ });
mConfigManager->AddListener(mProcessor);
@@ -439,7 +440,6 @@ status_t StatsService::cmd_trigger_broadcast(FILE* out, Vector<String8>& args) {
if (argCount == 2) {
// Automatically pick the UID
uid = IPCThreadState::self()->getCallingUid();
- // TODO: What if this isn't a binder call? Should we fail?
name.assign(args[1].c_str(), args[1].size());
good = true;
} else if (argCount == 3) {
@@ -492,7 +492,6 @@ status_t StatsService::cmd_config(FILE* in, FILE* out, FILE* err, Vector<String8
if (argCount == 3) {
// Automatically pick the UID
uid = IPCThreadState::self()->getCallingUid();
- // TODO: What if this isn't a binder call? Should we fail?
name.assign(args[2].c_str(), args[2].size());
good = true;
} else if (argCount == 4) {
@@ -577,7 +576,6 @@ status_t StatsService::cmd_dump_report(FILE* out, FILE* err, const Vector<String
if (argCount == 2) {
// Automatically pick the UID
uid = IPCThreadState::self()->getCallingUid();
- // TODO: What if this isn't a binder call? Should we fail?
name.assign(args[1].c_str(), args[1].size());
good = true;
} else if (argCount == 3) {
@@ -603,7 +601,6 @@ status_t StatsService::cmd_dump_report(FILE* out, FILE* err, const Vector<String
vector<uint8_t> data;
mProcessor->onDumpReport(ConfigKey(uid, StrToInt64(name)), getElapsedRealtimeNs(),
false /* include_current_bucket*/, ADB_DUMP, &data);
- // TODO: print the returned StatsLogReport to file instead of printing to logcat.
if (proto) {
for (size_t i = 0; i < data.size(); i ++) {
fprintf(out, "%c", data[i]);
@@ -711,7 +708,7 @@ status_t StatsService::cmd_log_app_breadcrumb(FILE* out, const Vector<String8>&
status_t StatsService::cmd_print_pulled_metrics(FILE* out, const Vector<String8>& args) {
int s = atoi(args[1].c_str());
vector<shared_ptr<LogEvent> > stats;
- if (mStatsPullerManager.Pull(s, getElapsedRealtimeNs(), &stats)) {
+ if (mPullerManager->Pull(s, getElapsedRealtimeNs(), &stats)) {
for (const auto& it : stats) {
fprintf(out, "Pull from %d: %s\n", s, it->ToString().c_str());
}
@@ -739,7 +736,7 @@ status_t StatsService::cmd_clear_puller_cache(FILE* out) {
VLOG("StatsService::cmd_clear_puller_cache with Pid %i, Uid %i",
ipc->getCallingPid(), ipc->getCallingUid());
if (checkCallingPermission(String16(kPermissionDump))) {
- int cleared = mStatsPullerManager.ForceClearPullerCache();
+ int cleared = mPullerManager->ForceClearPullerCache();
fprintf(out, "Puller removed %d cached data!\n", cleared);
return NO_ERROR;
} else {
@@ -870,7 +867,7 @@ Status StatsService::statsCompanionReady() {
}
VLOG("StatsService::statsCompanionReady linking to statsCompanion.");
IInterface::asBinder(statsCompanion)->linkToDeath(this);
- mStatsPullerManager.SetStatsCompanionService(statsCompanion);
+ mPullerManager->SetStatsCompanionService(statsCompanion);
mAnomalyAlarmMonitor->setStatsCompanionService(statsCompanion);
mPeriodicAlarmMonitor->setStatsCompanionService(statsCompanion);
SubscriberReporter::getInstance().setStatsCompanionService(statsCompanion);
@@ -1014,7 +1011,7 @@ void StatsService::binderDied(const wp <IBinder>& who) {
mAnomalyAlarmMonitor->setStatsCompanionService(nullptr);
mPeriodicAlarmMonitor->setStatsCompanionService(nullptr);
SubscriberReporter::getInstance().setStatsCompanionService(nullptr);
- mStatsPullerManager.SetStatsCompanionService(nullptr);
+ mPullerManager->SetStatsCompanionService(nullptr);
}
} // namespace statsd
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index b3a477645b73..ed90050aae0b 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -49,7 +49,6 @@ public:
virtual ~StatsService();
/** The anomaly alarm registered with AlarmManager won't be updated by less than this. */
- // TODO: Consider making this configurable. And choose a good number.
const uint32_t MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS = 5;
virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
@@ -246,9 +245,9 @@ private:
sp<UidMap> mUidMap;
/**
- * Fetches external metrics.
+ * Fetches external metrics
*/
- StatsPullerManager mStatsPullerManager;
+ sp<StatsPullerManager> mPullerManager;
/**
* Tracks the configurations that have been passed to statsd.
diff --git a/cmds/statsd/src/anomaly/AlarmMonitor.cpp b/cmds/statsd/src/anomaly/AlarmMonitor.cpp
index 78f0c2b09537..bc36dadacddb 100644
--- a/cmds/statsd/src/anomaly/AlarmMonitor.cpp
+++ b/cmds/statsd/src/anomaly/AlarmMonitor.cpp
@@ -60,7 +60,7 @@ void AlarmMonitor::add(sp<const InternalAlarm> alarm) {
ALOGW("Asked to add a 0-time alarm.");
return;
}
- // TODO: Ensure that refractory period is respected.
+ // TODO(b/110563466): Ensure that refractory period is respected.
VLOG("Adding alarm with time %u", alarm->timestampSec);
mPq.push(alarm);
if (mRegisteredAlarmTimeSec < 1 ||
diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.cpp b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
index f32efee56d64..ee111cddcfd7 100644
--- a/cmds/statsd/src/anomaly/AnomalyTracker.cpp
+++ b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
@@ -208,7 +208,8 @@ bool AnomalyTracker::detectAnomaly(const int64_t& currentBucketNum,
}
void AnomalyTracker::declareAnomaly(const int64_t& timestampNs, const MetricDimensionKey& key) {
- // TODO: Why receive timestamp? RefractoryPeriod should always be based on real time right now.
+ // TODO(b/110563466): Why receive timestamp? RefractoryPeriod should always be based on
+ // real time right now.
if (isInRefractoryPeriod(timestampNs, key)) {
VLOG("Skipping anomaly declaration since within refractory period");
return;
@@ -216,7 +217,8 @@ void AnomalyTracker::declareAnomaly(const int64_t& timestampNs, const MetricDime
if (mAlert.has_refractory_period_secs()) {
mRefractoryPeriodEndsSec[key] = ((timestampNs + NS_PER_SEC - 1) / NS_PER_SEC) // round up
+ mAlert.refractory_period_secs();
- // TODO: If we had access to the bucket_size_millis, consider calling resetStorage()
+ // TODO(b/110563466): If we had access to the bucket_size_millis, consider
+ // calling resetStorage()
// if (mAlert.refractory_period_secs() > mNumOfPastBuckets * bucketSizeNs) {resetStorage();}
}
@@ -230,7 +232,7 @@ void AnomalyTracker::declareAnomaly(const int64_t& timestampNs, const MetricDime
StatsdStats::getInstance().noteAnomalyDeclared(mConfigKey, mAlert.id());
- // TODO: This should also take in the const MetricDimensionKey& key?
+ // TODO(b/110564268): This should also take in the const MetricDimensionKey& key?
android::util::stats_write(android::util::ANOMALY_DETECTED, mConfigKey.GetUid(),
mConfigKey.GetId(), mAlert.id());
}
diff --git a/cmds/statsd/src/anomaly/subscriber_util.cpp b/cmds/statsd/src/anomaly/subscriber_util.cpp
index ee9e9c01a60a..9d37cdb2d4d7 100644
--- a/cmds/statsd/src/anomaly/subscriber_util.cpp
+++ b/cmds/statsd/src/anomaly/subscriber_util.cpp
@@ -22,6 +22,7 @@
#include <binder/IServiceManager.h>
#include "external/Perfetto.h"
+#include "external/Perfprofd.h"
#include "frameworks/base/libs/incident/proto/android/os/header.pb.h"
#include "subscriber/IncidentdReporter.h"
#include "subscriber/SubscriberReporter.h"
@@ -64,6 +65,12 @@ void triggerSubscribers(const int64_t rule_id,
SubscriberReporter::getInstance().alertBroadcastSubscriber(configKey, subscription,
dimensionKey);
break;
+ case Subscription::SubscriberInformationCase::kPerfprofdDetails:
+ if (!CollectPerfprofdTraceAndUploadToDropbox(subscription.perfprofd_details(),
+ rule_id, configKey)) {
+ ALOGW("Failed to generate perfprofd traces.");
+ }
+ break;
default:
break;
}
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index ab9c7e81a88e..279ed0250fc4 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -29,6 +29,7 @@ import "frameworks/base/core/proto/android/server/enums.proto";
import "frameworks/base/core/proto/android/telecomm/enums.proto";
import "frameworks/base/core/proto/android/telephony/enums.proto";
import "frameworks/base/core/proto/android/view/enums.proto";
+import "frameworks/base/proto/src/metrics_constants.proto";
/**
* The master atom class. This message defines all of the available
@@ -121,12 +122,11 @@ message Atom {
ANROccurred anr_occurred = 79;
WTFOccurred wtf_occurred = 80;
LowMemReported low_mem_reported = 81;
-
-
+ GenericAtom generic_atom = 82;
}
// Pulled events will start at field 10000.
- // Next: 10022
+ // Next: 10023
oneof pulled {
WifiBytesTransfer wifi_bytes_transfer = 10000;
WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001;
@@ -150,6 +150,7 @@ message Atom {
RemainingBatteryCapacity remaining_battery_capacity = 10019;
FullBatteryCapacity full_battery_capacity = 10020;
Temperature temperature = 10021;
+ BinderCalls binder_calls = 10022;
}
// DO NOT USE field numbers above 100,000 in AOSP. Field numbers above
@@ -579,7 +580,7 @@ message WakeupAlarmOccurred {
* Changing from LOW to MEDIUM or HIGH can be considered the app waking the mobile radio.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/NetworkManagementService.java
*/
message MobileRadioPowerStateChanged {
repeated AttributionNode attribution_node = 1;
@@ -593,7 +594,7 @@ message MobileRadioPowerStateChanged {
* Changing from LOW to MEDIUM or HIGH can be considered the app waking the wifi radio.
*
* Logged from:
- * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ * frameworks/base/services/core/java/com/android/server/NetworkManagementService.java
*/
message WifiRadioPowerStateChanged {
repeated AttributionNode attribution_node = 1;
@@ -1484,6 +1485,7 @@ message ForegroundServiceStateChanged {
message IsolatedUidChanged {
// The host UID. Generally, we should attribute metrics from the isolated uid to the host uid.
// NOTE: DO NOT annotate uid field in this atom. This atom is specially handled in statsd.
+ // This field is ignored when event == REMOVED.
optional int32 parent_uid = 1;
optional int32 isolated_uid = 2;
@@ -1974,3 +1976,50 @@ message Temperature {
// Temperature in tenths of a degree C.
optional int32 temperature_dC = 3;
}
+
+/**
+ * Pulls the statistics of calls to Binder.
+ *
+ * Binder stats are cumulative from boot unless somebody reset the data using
+ * > adb shell dumpsys binder_calls_stats --reset
+ */
+message BinderCalls {
+ // TODO(gaillard): figure out if binder call stats includes data from isolated uids, if a uid
+ // gets recycled and we have isolated uids, we might attribute the data incorrectly.
+ // TODO(gaillard): there is a high dimensions cardinality, figure out if we should drop the less
+ // commonly used APIs.
+ optional int32 uid = 1 [(is_uid) = true];
+ // Fully qualified class name of the API call.
+ optional string service_class_name = 2;
+ // Method name of the API call. It can also be a transaction code if we cannot resolve it to a
+ // name. See Binder#getTransactionName.
+ optional string service_method_name = 3;
+ // Total number of API calls.
+ optional int64 call_count = 4;
+ // Number of exceptions thrown by the API.
+ optional int64 exception_count = 5;
+ // Total latency of all API calls.
+ // Average can be computed using total_latency_micros / call_count.
+ optional int64 total_latency_micros = 6;
+ // Maximum latency of one API call.
+ optional int64 max_latency_micros = 7;
+ // Total CPU usage of all API calls.
+ optional int64 total_cpu_micros = 8;
+ // Maximum CPU usage of one API call.
+ optional int64 max_cpu_micros = 9;
+ // Maximum parcel reply size of one API call.
+ optional int64 max_reply_size_bytes = 10;
+ // Maximum parcel request size of one API call.
+ optional int64 max_request_size_bytes = 11;
+}
+
+/**
+ * An atom for generic metrics logging. Available from Android Q.
+ * One has to add an enum to frameworks/base/proto/src/metrics_constants.proto
+ * to extend another metric.
+ */
+message GenericAtom {
+ // Type of event. Previously it only indicated visual elements but now it
+ // is expanded to describe any type of event.
+ optional com_android_internal_logging.MetricsEvent.View view = 1;
+}
diff --git a/cmds/statsd/src/external/Perfprofd.cpp b/cmds/statsd/src/external/Perfprofd.cpp
new file mode 100644
index 000000000000..ff237e8f6317
--- /dev/null
+++ b/cmds/statsd/src/external/Perfprofd.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Perfprofd.h"
+
+#define DEBUG false // STOPSHIP if true
+#include "config/ConfigKey.h"
+#include "Log.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <string>
+
+#include <binder/IServiceManager.h>
+
+#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h" // Alert
+
+#include "android/os/IPerfProfd.h"
+
+namespace android {
+namespace os {
+namespace statsd {
+
+bool CollectPerfprofdTraceAndUploadToDropbox(const PerfprofdDetails& config,
+ int64_t alert_id,
+ const ConfigKey& configKey) {
+ VLOG("Starting trace collection through perfprofd");
+
+ if (!config.has_perfprofd_config()) {
+ ALOGE("The perfprofd trace config is empty, aborting");
+ return false;
+ }
+
+ sp<IPerfProfd> service = interface_cast<IPerfProfd>(
+ defaultServiceManager()->getService(android::String16("perfprofd")));
+ if (service == NULL) {
+ ALOGE("Could not find perfprofd service");
+ return false;
+ }
+
+ // Add protobufs can't be described in AIDL, we need to re-serialize
+ // the config proto to send it.
+ std::vector<uint8_t> proto_serialized;
+ {
+ const auto& config_proto = config.perfprofd_config();
+ int size = config_proto.ByteSize();
+ proto_serialized.resize(size);
+ ::google::protobuf::uint8* target_ptr =
+ reinterpret_cast<::google::protobuf::uint8*>(proto_serialized.data());
+ config_proto.SerializeWithCachedSizesToArray(target_ptr);
+ }
+
+ // TODO: alert-id etc?
+
+ binder::Status status = service->startProfilingProtobuf(proto_serialized);
+ if (status.isOk()) {
+ return true;
+ }
+
+ ALOGE("Error starting perfprofd profiling: %s", status.toString8().c_str());
+ return false;
+}
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/src/external/Perfprofd.h b/cmds/statsd/src/external/Perfprofd.h
new file mode 100644
index 000000000000..b93fdf8e1cb2
--- /dev/null
+++ b/cmds/statsd/src/external/Perfprofd.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <inttypes.h>
+
+namespace android {
+namespace os {
+namespace statsd {
+
+class ConfigKey;
+class PerfprofdDetails; // Declared in statsd_config.pb.h
+
+// Starts the collection of a Perfprofd trace with the given |config|.
+// The trace is uploaded to Dropbox by the perfprofd service once done.
+// This method returns immediately after passing the config and does NOT wait
+// for the full duration of the trace.
+bool CollectPerfprofdTraceAndUploadToDropbox(const PerfprofdDetails& config,
+ int64_t alert_id,
+ const ConfigKey& configKey);
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp b/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp
index 3741202763b3..ae97d7a2fc15 100644
--- a/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp
+++ b/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp
@@ -54,7 +54,7 @@ bool getHealthHal() {
ResourceHealthManagerPuller::ResourceHealthManagerPuller(int tagId) : StatsPuller(tagId) {
}
-// TODO: add other health atoms (eg. Temperature).
+// TODO(b/110565992): add other health atoms (eg. Temperature).
bool ResourceHealthManagerPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) {
if (!getHealthHal()) {
ALOGE("Health Hal not loaded");
diff --git a/cmds/statsd/src/external/StatsPuller.cpp b/cmds/statsd/src/external/StatsPuller.cpp
index b29e979b5236..436a8801896f 100644
--- a/cmds/statsd/src/external/StatsPuller.cpp
+++ b/cmds/statsd/src/external/StatsPuller.cpp
@@ -18,10 +18,10 @@
#include "Log.h"
#include "StatsPuller.h"
+#include "StatsPullerManager.h"
#include "guardrail/StatsdStats.h"
#include "puller_util.h"
#include "stats_log_util.h"
-#include "StatsPullerManagerImpl.h"
namespace android {
namespace os {
@@ -35,7 +35,7 @@ void StatsPuller::SetUidMap(const sp<UidMap>& uidMap) { mUidMap = uidMap; }
// ValueMetric has a minimum bucket size of 10min so that we don't pull too frequently
StatsPuller::StatsPuller(const int tagId)
: mTagId(tagId) {
- mCoolDownNs = StatsPullerManagerImpl::kAllPullAtomInfo.find(tagId)->second.coolDownNs;
+ mCoolDownNs = StatsPullerManager::kAllPullAtomInfo.find(tagId)->second.coolDownNs;
VLOG("Puller for tag %d created. Cooldown set to %lld", mTagId, (long long)mCoolDownNs);
}
diff --git a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index c020f9c12b87..160d6e86c55f 100644
--- a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -29,7 +29,7 @@
#include "ResourceHealthManagerPuller.h"
#include "ResourceThermalManagerPuller.h"
#include "StatsCompanionServicePuller.h"
-#include "StatsPullerManagerImpl.h"
+#include "StatsPullerManager.h"
#include "SubsystemSleepStatePuller.h"
#include "statslog.h"
@@ -49,7 +49,7 @@ namespace statsd {
// Values smaller than this may require to update the alarm.
const int64_t NO_ALARM_UPDATE = INT64_MAX;
-const std::map<int, PullAtomInfo> StatsPullerManagerImpl::kAllPullAtomInfo = {
+const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
// wifi_bytes_transfer
{android::util::WIFI_BYTES_TRANSFER,
{{2, 3, 4, 5},
@@ -171,12 +171,19 @@ const std::map<int, PullAtomInfo> StatsPullerManagerImpl::kAllPullAtomInfo = {
1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}},
// temperature
- {android::util::TEMPERATURE, {{}, {}, 1, new ResourceThermalManagerPuller()}}};
+ {android::util::TEMPERATURE, {{}, {}, 1, new ResourceThermalManagerPuller()}},
+ // binder_calls
+ {android::util::BINDER_CALLS,
+ {{4, 5, 6, 8},
+ {2, 3, 7, 9, 10, 11},
+ 1 * NS_PER_SEC,
+ new StatsCompanionServicePuller(android::util::BINDER_CALLS)}}
+ };
-StatsPullerManagerImpl::StatsPullerManagerImpl() : mNextPullTimeNs(NO_ALARM_UPDATE) {
+StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) {
}
-bool StatsPullerManagerImpl::Pull(const int tagId, const int64_t timeNs,
+bool StatsPullerManager::Pull(const int tagId, const int64_t timeNs,
vector<shared_ptr<LogEvent>>* data) {
VLOG("Initiating pulling %d", tagId);
@@ -190,16 +197,11 @@ bool StatsPullerManagerImpl::Pull(const int tagId, const int64_t timeNs,
}
}
-StatsPullerManagerImpl& StatsPullerManagerImpl::GetInstance() {
- static StatsPullerManagerImpl instance;
- return instance;
-}
-
-bool StatsPullerManagerImpl::PullerForMatcherExists(int tagId) const {
+bool StatsPullerManager::PullerForMatcherExists(int tagId) const {
return kAllPullAtomInfo.find(tagId) != kAllPullAtomInfo.end();
}
-void StatsPullerManagerImpl::updateAlarmLocked() {
+void StatsPullerManager::updateAlarmLocked() {
if (mNextPullTimeNs == NO_ALARM_UPDATE) {
VLOG("No need to set alarms. Skipping");
return;
@@ -214,7 +216,7 @@ void StatsPullerManagerImpl::updateAlarmLocked() {
return;
}
-void StatsPullerManagerImpl::SetStatsCompanionService(
+void StatsPullerManager::SetStatsCompanionService(
sp<IStatsCompanionService> statsCompanionService) {
AutoMutex _l(mLock);
sp<IStatsCompanionService> tmpForLock = mStatsCompanionService;
@@ -227,7 +229,7 @@ void StatsPullerManagerImpl::SetStatsCompanionService(
}
}
-void StatsPullerManagerImpl::RegisterReceiver(int tagId, wp<PullDataReceiver> receiver,
+void StatsPullerManager::RegisterReceiver(int tagId, wp<PullDataReceiver> receiver,
int64_t nextPullTimeNs, int64_t intervalNs) {
AutoMutex _l(mLock);
auto& receivers = mReceivers[tagId];
@@ -262,7 +264,7 @@ void StatsPullerManagerImpl::RegisterReceiver(int tagId, wp<PullDataReceiver> re
VLOG("Puller for tagId %d registered of %d", tagId, (int)receivers.size());
}
-void StatsPullerManagerImpl::UnRegisterReceiver(int tagId, wp<PullDataReceiver> receiver) {
+void StatsPullerManager::UnRegisterReceiver(int tagId, wp<PullDataReceiver> receiver) {
AutoMutex _l(mLock);
if (mReceivers.find(tagId) == mReceivers.end()) {
VLOG("Unknown pull code or no receivers: %d", tagId);
@@ -278,7 +280,7 @@ void StatsPullerManagerImpl::UnRegisterReceiver(int tagId, wp<PullDataReceiver>
}
}
-void StatsPullerManagerImpl::OnAlarmFired(const int64_t currentTimeNs) {
+void StatsPullerManager::OnAlarmFired(const int64_t currentTimeNs) {
AutoMutex _l(mLock);
int64_t minNextPullTimeNs = NO_ALARM_UPDATE;
@@ -331,7 +333,7 @@ void StatsPullerManagerImpl::OnAlarmFired(const int64_t currentTimeNs) {
updateAlarmLocked();
}
-int StatsPullerManagerImpl::ForceClearPullerCache() {
+int StatsPullerManager::ForceClearPullerCache() {
int totalCleared = 0;
for (const auto& pulledAtom : kAllPullAtomInfo) {
totalCleared += pulledAtom.second.puller->ForceClearCache();
@@ -339,7 +341,7 @@ int StatsPullerManagerImpl::ForceClearPullerCache() {
return totalCleared;
}
-int StatsPullerManagerImpl::ClearPullerCacheIfNecessary(int64_t timestampNs) {
+int StatsPullerManager::ClearPullerCacheIfNecessary(int64_t timestampNs) {
int totalCleared = 0;
for (const auto& pulledAtom : kAllPullAtomInfo) {
totalCleared += pulledAtom.second.puller->ClearCacheIfNecessary(timestampNs);
diff --git a/cmds/statsd/src/external/StatsPullerManager.h b/cmds/statsd/src/external/StatsPullerManager.h
index 50ffe17549c6..45efc4a8bea0 100644
--- a/cmds/statsd/src/external/StatsPullerManager.h
+++ b/cmds/statsd/src/external/StatsPullerManager.h
@@ -16,54 +16,87 @@
#pragma once
-#include "StatsPullerManagerImpl.h"
+#include <android/os/IStatsCompanionService.h>
+#include <binder/IServiceManager.h>
+#include <utils/RefBase.h>
+#include <utils/threads.h>
+#include <list>
+#include <string>
+#include <unordered_map>
+#include <vector>
+#include "PullDataReceiver.h"
+#include "StatsPuller.h"
+#include "logd/LogEvent.h"
namespace android {
namespace os {
namespace statsd {
-class StatsPullerManager {
- public:
- virtual ~StatsPullerManager() {}
+typedef struct {
+ // The field numbers of the fields that need to be summed when merging
+ // isolated uid with host uid.
+ std::vector<int> additiveFields;
+ // The field numbers of the fields that can't be merged when merging
+ // data belong to isolated uid and host uid.
+ std::vector<int> nonAdditiveFields;
+ // How long should the puller wait before doing an actual pull again. Default
+ // 1 sec. Set this to 0 if this is handled elsewhere.
+ int64_t coolDownNs = 1 * NS_PER_SEC;
+ // The actual puller
+ sp<StatsPuller> puller;
+} PullAtomInfo;
+
+class StatsPullerManager : public virtual RefBase {
+public:
+ StatsPullerManager();
+
+ virtual ~StatsPullerManager() {
+ }
virtual void RegisterReceiver(int tagId, wp<PullDataReceiver> receiver, int64_t nextPullTimeNs,
- int64_t intervalNs) {
- mPullerManager.RegisterReceiver(tagId, receiver, nextPullTimeNs, intervalNs);
- };
+ int64_t intervalNs);
- virtual void UnRegisterReceiver(int tagId, wp <PullDataReceiver> receiver) {
- mPullerManager.UnRegisterReceiver(tagId, receiver);
- };
+ virtual void UnRegisterReceiver(int tagId, wp<PullDataReceiver> receiver);
// Verify if we know how to pull for this matcher
- bool PullerForMatcherExists(int tagId) {
- return mPullerManager.PullerForMatcherExists(tagId);
- }
+ bool PullerForMatcherExists(int tagId) const;
- void OnAlarmFired(const int64_t currentTimeNs) {
- mPullerManager.OnAlarmFired(currentTimeNs);
- }
+ void OnAlarmFired(const int64_t timeNs);
- virtual bool Pull(const int tagId, const int64_t timesNs,
- vector<std::shared_ptr<LogEvent>>* data) {
- return mPullerManager.Pull(tagId, timesNs, data);
- }
+ virtual bool Pull(const int tagId, const int64_t timeNs,
+ vector<std::shared_ptr<LogEvent>>* data);
- int ForceClearPullerCache() {
- return mPullerManager.ForceClearPullerCache();
- }
+ int ForceClearPullerCache();
- void SetStatsCompanionService(sp<IStatsCompanionService> statsCompanionService) {
- mPullerManager.SetStatsCompanionService(statsCompanionService);
- }
+ int ClearPullerCacheIfNecessary(int64_t timestampNs);
- int ClearPullerCacheIfNecessary(int64_t timestampNs) {
- return mPullerManager.ClearPullerCacheIfNecessary(timestampNs);
- }
+ void SetStatsCompanionService(sp<IStatsCompanionService> statsCompanionService);
+
+ const static std::map<int, PullAtomInfo> kAllPullAtomInfo;
+
+private:
+ sp<IStatsCompanionService> mStatsCompanionService = nullptr;
+
+ typedef struct {
+ int64_t nextPullTimeNs;
+ int64_t intervalNs;
+ wp<PullDataReceiver> receiver;
+ } ReceiverInfo;
+
+ // mapping from simple matcher tagId to receivers
+ std::map<int, std::list<ReceiverInfo>> mReceivers;
+
+ // locks for data receiver and StatsCompanionService changes
+ Mutex mLock;
+
+ void updateAlarmLocked();
+
+ int64_t mNextPullTimeNs;
- private:
- StatsPullerManagerImpl
- & mPullerManager = StatsPullerManagerImpl::GetInstance();
+ FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents);
+ FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm);
+ FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
+ FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
};
} // namespace statsd
diff --git a/cmds/statsd/src/external/StatsPullerManagerImpl.h b/cmds/statsd/src/external/StatsPullerManagerImpl.h
deleted file mode 100644
index 56d04b41c5d5..000000000000
--- a/cmds/statsd/src/external/StatsPullerManagerImpl.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android/os/IStatsCompanionService.h>
-#include <binder/IServiceManager.h>
-#include <utils/RefBase.h>
-#include <utils/threads.h>
-#include <string>
-#include <unordered_map>
-#include <vector>
-#include <list>
-#include "PullDataReceiver.h"
-#include "StatsPuller.h"
-#include "logd/LogEvent.h"
-
-namespace android {
-namespace os {
-namespace statsd {
-
-typedef struct {
- // The field numbers of the fields that need to be summed when merging
- // isolated uid with host uid.
- std::vector<int> additiveFields;
- // The field numbers of the fields that can't be merged when merging
- // data belong to isolated uid and host uid.
- std::vector<int> nonAdditiveFields;
- // How long should the puller wait before doing an actual pull again. Default
- // 1 sec. Set this to 0 if this is handled elsewhere.
- int64_t coolDownNs = 1 * NS_PER_SEC;
- // The actual puller
- sp<StatsPuller> puller;
-} PullAtomInfo;
-
-class StatsPullerManagerImpl : public virtual RefBase {
-public:
- static StatsPullerManagerImpl& GetInstance();
-
- void RegisterReceiver(int tagId, wp<PullDataReceiver> receiver, int64_t nextPullTimeNs,
- int64_t intervalNs);
-
- void UnRegisterReceiver(int tagId, wp<PullDataReceiver> receiver);
-
- // Verify if we know how to pull for this matcher
- bool PullerForMatcherExists(int tagId) const;
-
- void OnAlarmFired(const int64_t timeNs);
-
- bool Pull(const int tagId, const int64_t timeNs, vector<std::shared_ptr<LogEvent>>* data);
-
- int ForceClearPullerCache();
-
- int ClearPullerCacheIfNecessary(int64_t timestampNs);
-
- void SetStatsCompanionService(sp<IStatsCompanionService> statsCompanionService);
-
- const static std::map<int, PullAtomInfo> kAllPullAtomInfo;
-
- private:
- StatsPullerManagerImpl();
-
- sp<IStatsCompanionService> mStatsCompanionService = nullptr;
-
- typedef struct {
- int64_t nextPullTimeNs;
- int64_t intervalNs;
- wp<PullDataReceiver> receiver;
- } ReceiverInfo;
-
- // mapping from simple matcher tagId to receivers
- std::map<int, std::list<ReceiverInfo>> mReceivers;
-
- // locks for data receiver and StatsCompanionService changes
- Mutex mLock;
-
- void updateAlarmLocked();
-
- int64_t mNextPullTimeNs;
-
- FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents);
- FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm);
- FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
- FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
-};
-
-} // namespace statsd
-} // namespace os
-} // namespace android
diff --git a/cmds/statsd/src/external/puller_util.cpp b/cmds/statsd/src/external/puller_util.cpp
index 57fe10e51bfc..ea7fa972cb9c 100644
--- a/cmds/statsd/src/external/puller_util.cpp
+++ b/cmds/statsd/src/external/puller_util.cpp
@@ -17,7 +17,7 @@
#define DEBUG false // STOPSHIP if true
#include "Log.h"
-#include "StatsPullerManagerImpl.h"
+#include "StatsPullerManager.h"
#include "puller_util.h"
#include "statslog.h"
@@ -107,8 +107,8 @@ bool tryMerge(vector<shared_ptr<LogEvent>>& data, int child_pos, const vector<in
*/
void mergeIsolatedUidsToHostUid(vector<shared_ptr<LogEvent>>& data, const sp<UidMap>& uidMap,
int tagId) {
- if (StatsPullerManagerImpl::kAllPullAtomInfo.find(tagId) ==
- StatsPullerManagerImpl::kAllPullAtomInfo.end()) {
+ if (StatsPullerManager::kAllPullAtomInfo.find(tagId) ==
+ StatsPullerManager::kAllPullAtomInfo.end()) {
VLOG("Unknown pull atom id %d", tagId);
return;
}
@@ -121,9 +121,9 @@ void mergeIsolatedUidsToHostUid(vector<shared_ptr<LogEvent>>& data, const sp<Uid
uidField = it->second; // uidField is the field number in proto,
}
const vector<int>& additiveFields =
- StatsPullerManagerImpl::kAllPullAtomInfo.find(tagId)->second.additiveFields;
+ StatsPullerManager::kAllPullAtomInfo.find(tagId)->second.additiveFields;
const vector<int>& nonAdditiveFields =
- StatsPullerManagerImpl::kAllPullAtomInfo.find(tagId)->second.nonAdditiveFields;
+ StatsPullerManager::kAllPullAtomInfo.find(tagId)->second.nonAdditiveFields;
// map of host uid to their position in the original vector
map<int, vector<int>> hostPosition;
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index 764366fc420a..a955511e198c 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -100,10 +100,10 @@ const int FIELD_ID_UID_MAP_DROPPED_CHANGES = 3;
const int FIELD_ID_UID_MAP_DELETED_APPS = 4;
const std::map<int, std::pair<size_t, size_t>> StatsdStats::kAtomDimensionKeySizeLimitMap = {
+ {android::util::BINDER_CALLS, {6000, 10000}},
{android::util::CPU_TIME_PER_UID_FREQ, {6000, 10000}},
};
-// TODO: add stats for pulled atoms.
StatsdStats::StatsdStats() {
mPushedAtomStats.resize(android::util::kMaxPushedAtomId + 1);
mStartTimeSec = getWallClockSec();
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index 74541d37b840..9fb2cd813fb8 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -86,7 +86,6 @@ public:
static StatsdStats& getInstance();
~StatsdStats(){};
- // TODO: set different limit if the device is low ram.
const static int kDimensionKeySizeSoftLimit = 500;
const static int kDimensionKeySizeHardLimit = 800;
diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp
index 4e4f146d27ac..04d34f3be2c0 100644
--- a/cmds/statsd/src/logd/LogEvent.cpp
+++ b/cmds/statsd/src/logd/LogEvent.cpp
@@ -273,7 +273,7 @@ void LogEvent::init(android_log_context context) {
}
int64_t LogEvent::GetLong(size_t key, status_t* err) const {
- // TODO: encapsulate the magical operations all in Field struct as a static function.
+ // TODO(b/110561208): encapsulate the magical operations in Field struct as static functions
int field = getSimpleField(key);
for (const auto& value : mValues) {
if (value.mField.getField() == field) {
diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp
index e8904c625325..2f15d0fe0b71 100644
--- a/cmds/statsd/src/main.cpp
+++ b/cmds/statsd/src/main.cpp
@@ -29,6 +29,8 @@
#include <utils/Looper.h>
#include <utils/StrongPointer.h>
+#include <memory>
+
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -72,7 +74,7 @@ static status_t start_log_reader_thread(const sp<StatsService>& service) {
pthread_t thread;
// Thread data.
- log_reader_thread_data* data = new log_reader_thread_data();
+ std::unique_ptr<log_reader_thread_data> data = std::make_unique<log_reader_thread_data>();
data->service = service;
// Create the thread
@@ -80,17 +82,20 @@ static status_t start_log_reader_thread(const sp<StatsService>& service) {
if (err != NO_ERROR) {
return err;
}
- // TODO: Do we need to tweak thread priority?
err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (err != NO_ERROR) {
pthread_attr_destroy(&attr);
return err;
}
- err = pthread_create(&thread, &attr, log_reader_thread_func, static_cast<void*>(data));
+ err = pthread_create(&thread, &attr, log_reader_thread_func,
+ static_cast<void*>(data.get()));
if (err != NO_ERROR) {
pthread_attr_destroy(&attr);
return err;
}
+ // Release here rather than in pthread_create, since an error creating the
+ // thread leaves `data` ownerless.
+ data.release();
pthread_attr_destroy(&attr);
return NO_ERROR;
diff --git a/cmds/statsd/src/matchers/LogMatchingTracker.h b/cmds/statsd/src/matchers/LogMatchingTracker.h
index 4f30a047e256..88ab4e6f683a 100644
--- a/cmds/statsd/src/matchers/LogMatchingTracker.h
+++ b/cmds/statsd/src/matchers/LogMatchingTracker.h
@@ -86,8 +86,6 @@ protected:
// The collection of the event tag ids that this LogMatchingTracker cares. So we can quickly
// return kNotMatched when we receive an event with an id not in the list. This is especially
// useful when we have a complex CombinationLogMatcherTracker.
- // TODO: Consider use an array instead of stl set. In reality, the number of the tag ids a
- // LogMatchingTracker cares is only a few.
std::set<int> mAtomIds;
};
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.cpp b/cmds/statsd/src/metrics/CountMetricProducer.cpp
index 43f53e057000..a894782db9f7 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/CountMetricProducer.cpp
@@ -68,7 +68,6 @@ CountMetricProducer::CountMetricProducer(const ConfigKey& key, const CountMetric
const sp<ConditionWizard>& wizard,
const int64_t startTimeNs)
: MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard) {
- // TODO: evaluate initial conditions. and set mConditionMet.
if (metric.has_bucket()) {
mBucketSizeNs =
TimeUnitToBucketSizeInMillisGuardrailed(key.GetUid(), metric.bucket()) * 1000000;
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.h b/cmds/statsd/src/metrics/CountMetricProducer.h
index 139c0838fef0..520d5de2b33f 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.h
+++ b/cmds/statsd/src/metrics/CountMetricProducer.h
@@ -40,7 +40,6 @@ struct CountBucket {
class CountMetricProducer : public MetricProducer {
public:
- // TODO: Pass in the start time from MetricsManager, it should be consistent for all metrics.
CountMetricProducer(const ConfigKey& key, const CountMetric& countMetric,
const int conditionIndex, const sp<ConditionWizard>& wizard,
const int64_t startTimeNs);
@@ -80,7 +79,6 @@ private:
void flushCurrentBucketLocked(const int64_t& eventTimeNs) override;
- // TODO: Add a lock to mPastBuckets.
std::unordered_map<MetricDimensionKey, std::vector<CountBucket>> mPastBuckets;
// The current bucket (may be a partial bucket).
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.cpp b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
index 62237bc04642..a19eb0b66bc7 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
@@ -76,9 +76,6 @@ DurationMetricProducer::DurationMetricProducer(const ConfigKey& key, const Durat
mStopAllIndex(stopAllIndex),
mNested(nesting),
mContainANYPositionInInternalDimensions(false) {
- // TODO: The following boiler plate code appears in all MetricProducers, but we can't abstract
- // them in the base class, because the proto generated CountMetric, and DurationMetric are
- // not related. Maybe we should add a template in the future??
if (metric.has_bucket()) {
mBucketSizeNs =
TimeUnitToBucketSizeInMillisGuardrailed(key.GetUid(), metric.bucket()) * 1000000;
@@ -434,8 +431,6 @@ void DurationMetricProducer::onConditionChangedLocked(const bool conditionMet,
VLOG("Metric %lld onConditionChanged", (long long)mMetricId);
mCondition = conditionMet;
flushIfNeededLocked(eventTime);
- // TODO: need to populate the condition change time from the event which triggers the condition
- // change, instead of using current time.
for (auto& whatIt : mCurrentSlicedDurationTrackerMap) {
for (auto& pair : whatIt.second) {
pair.second->onConditionChanged(conditionMet, eventTime);
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.h b/cmds/statsd/src/metrics/DurationMetricProducer.h
index 88e455a3f1a1..c496b12df935 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.h
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.h
@@ -115,7 +115,6 @@ private:
ConditionState mUnSlicedPartCondition;
// Save the past buckets and we can clear when the StatsLogReport is dumped.
- // TODO: Add a lock to mPastBuckets.
std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>> mPastBuckets;
// The duration trackers in the current bucket.
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.h b/cmds/statsd/src/metrics/EventMetricProducer.h
index 62d1105e0514..7f7aa3711255 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.h
+++ b/cmds/statsd/src/metrics/EventMetricProducer.h
@@ -33,7 +33,6 @@ namespace statsd {
class EventMetricProducer : public MetricProducer {
public:
- // TODO: Pass in the start time from MetricsManager, it should be consistent for all metrics.
EventMetricProducer(const ConfigKey& key, const EventMetric& eventMetric,
const int conditionIndex, const sp<ConditionWizard>& wizard,
const int64_t startTimeNs);
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index aabd3616e2fe..a77941017c2d 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -72,9 +72,9 @@ GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric
const int conditionIndex,
const sp<ConditionWizard>& wizard, const int pullTagId,
const int64_t timeBaseNs, const int64_t startTimeNs,
- shared_ptr<StatsPullerManager> statsPullerManager)
+ const sp<StatsPullerManager>& pullerManager)
: MetricProducer(metric.id(), key, timeBaseNs, conditionIndex, wizard),
- mStatsPullerManager(statsPullerManager),
+ mPullerManager(pullerManager),
mPullTagId(pullTagId),
mMinBucketSizeNs(metric.min_bucket_size_nanos()),
mDimensionSoftLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) !=
@@ -101,7 +101,6 @@ GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric
translateFieldMatcher(metric.gauge_fields_filter().fields(), &mFieldMatchers);
}
- // TODO: use UidMap if uid->pkg_name is required
if (metric.has_dimensions_in_what()) {
translateFieldMatcher(metric.dimensions_in_what(), &mDimensionsInWhat);
mContainANYPositionInDimensionsInWhat = HasPositionANY(metric.dimensions_in_what());
@@ -127,8 +126,8 @@ GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric
flushIfNeededLocked(startTimeNs);
// Kicks off the puller immediately.
if (mPullTagId != -1 && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
- mStatsPullerManager->RegisterReceiver(
- mPullTagId, this, getCurrentBucketEndTimeNs(), mBucketSizeNs);
+ mPullerManager->RegisterReceiver(mPullTagId, this, getCurrentBucketEndTimeNs(),
+ mBucketSizeNs);
}
VLOG("Gauge metric %lld created. bucket size %lld start_time: %lld sliced %d",
@@ -136,19 +135,10 @@ GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric
mConditionSliced);
}
-// for testing
-GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& metric,
- const int conditionIndex,
- const sp<ConditionWizard>& wizard, const int pullTagId,
- const int64_t timeBaseNs, const int64_t startTimeNs)
- : GaugeMetricProducer(key, metric, conditionIndex, wizard, pullTagId, timeBaseNs, startTimeNs,
- make_shared<StatsPullerManager>()) {
-}
-
GaugeMetricProducer::~GaugeMetricProducer() {
VLOG("~GaugeMetricProducer() called");
if (mPullTagId != -1 && mSamplingType == GaugeMetric::RANDOM_ONE_SAMPLE) {
- mStatsPullerManager->UnRegisterReceiver(mPullTagId, this);
+ mPullerManager->UnRegisterReceiver(mPullTagId, this);
}
}
@@ -308,7 +298,6 @@ void GaugeMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
protoOutput->end(protoToken);
mPastBuckets.clear();
- // TODO: Clear mDimensionKeyMap once the report is dumped.
}
void GaugeMetricProducer::pullLocked(const int64_t timestampNs) {
@@ -336,7 +325,7 @@ void GaugeMetricProducer::pullLocked(const int64_t timestampNs) {
}
vector<std::shared_ptr<LogEvent>> allData;
- if (!mStatsPullerManager->Pull(mPullTagId, timestampNs, &allData)) {
+ if (!mPullerManager->Pull(mPullTagId, timestampNs, &allData)) {
ALOGE("Gauge Stats puller failed for tag: %d", mPullTagId);
return;
}
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index c74f7927dfac..6984aa2d145d 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -33,7 +33,7 @@ namespace os {
namespace statsd {
struct GaugeAtom {
- GaugeAtom(std::shared_ptr<vector<FieldValue>> fields, int64_t elapsedTimeNs, int wallClockNs)
+ GaugeAtom(std::shared_ptr<vector<FieldValue>> fields, int64_t elapsedTimeNs, int64_t wallClockNs)
: mFields(fields), mElapsedTimestamps(elapsedTimeNs), mWallClockTimestampNs(wallClockNs) {
}
std::shared_ptr<vector<FieldValue>> mFields;
@@ -58,7 +58,8 @@ class GaugeMetricProducer : public virtual MetricProducer, public virtual PullDa
public:
GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& gaugeMetric,
const int conditionIndex, const sp<ConditionWizard>& wizard,
- const int pullTagId, const int64_t timeBaseNs, const int64_t startTimeNs);
+ const int pullTagId, const int64_t timeBaseNs, const int64_t startTimeNs,
+ const sp<StatsPullerManager>& pullerManager);
virtual ~GaugeMetricProducer();
@@ -94,13 +95,6 @@ private:
android::util::ProtoOutputStream* protoOutput) override;
void clearPastBucketsLocked(const int64_t dumpTimeNs) override;
- // for testing
- GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& gaugeMetric,
- const int conditionIndex, const sp<ConditionWizard>& wizard,
- const int pullTagId,
- const int64_t timeBaseNs, const int64_t startTimeNs,
- std::shared_ptr<StatsPullerManager> statsPullerManager);
-
// Internal interface to handle condition change.
void onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) override;
@@ -123,12 +117,11 @@ private:
int mTagId;
- std::shared_ptr<StatsPullerManager> mStatsPullerManager;
+ sp<StatsPullerManager> mPullerManager;
// tagId for pulled data. -1 if this is not pulled
const int mPullTagId;
// Save the past buckets and we can clear when the StatsLogReport is dumped.
- // TODO: Add a lock to mPastBuckets.
std::unordered_map<MetricDimensionKey, std::vector<GaugeBucket>> mPastBuckets;
// The current partial bucket.
diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp
index 4fac0e1a141b..0e5ef4d3e59a 100644
--- a/cmds/statsd/src/metrics/MetricsManager.cpp
+++ b/cmds/statsd/src/metrics/MetricsManager.cpp
@@ -56,10 +56,12 @@ const int FIELD_ID_ANNOTATIONS_INT32 = 2;
MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config,
const int64_t timeBaseNs, const int64_t currentTimeNs,
- const sp<UidMap> &uidMap,
+ const sp<UidMap>& uidMap,
+ const sp<StatsPullerManager>& pullerManager,
const sp<AlarmMonitor>& anomalyAlarmMonitor,
const sp<AlarmMonitor>& periodicAlarmMonitor)
- : mConfigKey(key), mUidMap(uidMap),
+ : mConfigKey(key),
+ mUidMap(uidMap),
mTtlNs(config.has_ttl_in_seconds() ? config.ttl_in_seconds() * NS_PER_SEC : -1),
mTtlEndNs(-1),
mLastReportTimeNs(currentTimeNs),
@@ -67,12 +69,11 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config,
// Init the ttl end timestamp.
refreshTtl(timeBaseNs);
- mConfigValid =
- initStatsdConfig(key, config, *uidMap, anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseNs, currentTimeNs, mTagIds, mAllAtomMatchers,
- mAllConditionTrackers, mAllMetricProducers, mAllAnomalyTrackers,
- mAllPeriodicAlarmTrackers, mConditionToMetricMap, mTrackerToMetricMap,
- mTrackerToConditionMap, mNoReportMetricIds);
+ mConfigValid = initStatsdConfig(
+ key, config, *uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
+ timeBaseNs, currentTimeNs, mTagIds, mAllAtomMatchers, mAllConditionTrackers,
+ mAllMetricProducers, mAllAnomalyTrackers, mAllPeriodicAlarmTrackers,
+ mConditionToMetricMap, mTrackerToMetricMap, mTrackerToConditionMap, mNoReportMetricIds);
mHashStringsInReport = config.hash_strings_in_metric_report();
@@ -237,7 +238,6 @@ void MetricsManager::onLogEvent(const LogEvent& event) {
if (event.GetTagId() == android::util::APP_BREADCRUMB_REPORTED) {
// Check that app breadcrumb reported fields are valid.
- // TODO: Find a way to make these checks easier to maintain.
status_t err = NO_ERROR;
// Uid is 3rd from last field and must match the caller's uid,
diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h
index 6f4db48def86..dfbb69f1ab7c 100644
--- a/cmds/statsd/src/metrics/MetricsManager.h
+++ b/cmds/statsd/src/metrics/MetricsManager.h
@@ -16,6 +16,7 @@
#pragma once
+#include "external/StatsPullerManager.h"
#include "anomaly/AlarmMonitor.h"
#include "anomaly/AlarmTracker.h"
#include "anomaly/AnomalyTracker.h"
@@ -36,9 +37,10 @@ namespace statsd {
// A MetricsManager is responsible for managing metrics from one single config source.
class MetricsManager : public PackageInfoListener {
public:
- MetricsManager(const ConfigKey& configKey, const StatsdConfig& config,
- const int64_t timeBaseNs, const int64_t currentTimeNs,
- const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor,
+ MetricsManager(const ConfigKey& configKey, const StatsdConfig& config, const int64_t timeBaseNs,
+ const int64_t currentTimeNs, const sp<UidMap>& uidMap,
+ const sp<StatsPullerManager>& pullerManager,
+ const sp<AlarmMonitor>& anomalyAlarmMonitor,
const sp<AlarmMonitor>& periodicAlarmMonitor);
virtual ~MetricsManager();
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 41e55cb27f5e..c6f7bb42e5d5 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#define DEBUG false // STOPSHIP if true
+#define DEBUG true // STOPSHIP if true
#include "Log.h"
#include "ValueMetricProducer.h"
@@ -27,7 +27,7 @@
using android::util::FIELD_COUNT_REPEATED;
using android::util::FIELD_TYPE_BOOL;
-using android::util::FIELD_TYPE_FLOAT;
+using android::util::FIELD_TYPE_DOUBLE;
using android::util::FIELD_TYPE_INT32;
using android::util::FIELD_TYPE_INT64;
using android::util::FIELD_TYPE_MESSAGE;
@@ -64,7 +64,8 @@ const int FIELD_ID_BUCKET_INFO = 3;
const int FIELD_ID_DIMENSION_LEAF_IN_WHAT = 4;
const int FIELD_ID_DIMENSION_LEAF_IN_CONDITION = 5;
// for ValueBucketInfo
-const int FIELD_ID_VALUE = 3;
+const int FIELD_ID_VALUE_LONG = 3;
+const int FIELD_ID_VALUE_DOUBLE = 7;
const int FIELD_ID_BUCKET_NUM = 4;
const int FIELD_ID_START_BUCKET_ELAPSED_MILLIS = 5;
const int FIELD_ID_END_BUCKET_ELAPSED_MILLIS = 6;
@@ -74,11 +75,12 @@ ValueMetricProducer::ValueMetricProducer(const ConfigKey& key, const ValueMetric
const int conditionIndex,
const sp<ConditionWizard>& wizard, const int pullTagId,
const int64_t timeBaseNs, const int64_t startTimestampNs,
- shared_ptr<StatsPullerManager> statsPullerManager)
+ const sp<StatsPullerManager>& pullerManager)
: MetricProducer(metric.id(), key, timeBaseNs, conditionIndex, wizard),
+ mPullerManager(pullerManager),
mValueField(metric.value_field()),
- mStatsPullerManager(statsPullerManager),
mPullTagId(pullTagId),
+ mIsPulled(pullTagId != -1),
mMinBucketSizeNs(metric.min_bucket_size_nanos()),
mDimensionSoftLimit(StatsdStats::kAtomDimensionKeySizeLimitMap.find(pullTagId) !=
StatsdStats::kAtomDimensionKeySizeLimitMap.end()
@@ -88,8 +90,9 @@ ValueMetricProducer::ValueMetricProducer(const ConfigKey& key, const ValueMetric
StatsdStats::kAtomDimensionKeySizeLimitMap.end()
? StatsdStats::kAtomDimensionKeySizeLimitMap.at(pullTagId).second
: StatsdStats::kDimensionKeySizeHardLimit),
- mUseAbsoluteValueOnReset(metric.use_absolute_value_on_reset()) {
- // TODO: valuemetric for pushed events may need unlimited bucket length
+ mUseAbsoluteValueOnReset(metric.use_absolute_value_on_reset()),
+ mAggregationType(metric.aggregation_type()),
+ mValueType(metric.aggregation_type() == ValueMetric::AVG ? DOUBLE : LONG) {
int64_t bucketSizeMills = 0;
if (metric.has_bucket()) {
bucketSizeMills = TimeUnitToBucketSizeInMillisGuardrailed(key.GetUid(), metric.bucket());
@@ -124,30 +127,21 @@ ValueMetricProducer::ValueMetricProducer(const ConfigKey& key, const ValueMetric
mSliceByPositionALL = HasPositionALL(metric.dimensions_in_what()) ||
HasPositionALL(metric.dimensions_in_condition());
- // Kicks off the puller immediately.
flushIfNeededLocked(startTimestampNs);
- if (mPullTagId != -1) {
- mStatsPullerManager->RegisterReceiver(
- mPullTagId, this, mCurrentBucketStartTimeNs + mBucketSizeNs, mBucketSizeNs);
+ // Kicks off the puller immediately.
+ if (mIsPulled) {
+ mPullerManager->RegisterReceiver(mPullTagId, this,
+ mCurrentBucketStartTimeNs + mBucketSizeNs, mBucketSizeNs);
}
VLOG("value metric %lld created. bucket size %lld start_time: %lld",
(long long)metric.id(), (long long)mBucketSizeNs, (long long)mTimeBaseNs);
}
-// for testing
-ValueMetricProducer::ValueMetricProducer(const ConfigKey& key, const ValueMetric& metric,
- const int conditionIndex,
- const sp<ConditionWizard>& wizard, const int pullTagId,
- const int64_t timeBaseNs, const int64_t startTimeNs)
- : ValueMetricProducer(key, metric, conditionIndex, wizard, pullTagId, timeBaseNs, startTimeNs,
- make_shared<StatsPullerManager>()) {
-}
-
ValueMetricProducer::~ValueMetricProducer() {
VLOG("~ValueMetricProducer() called");
- if (mPullTagId != -1) {
- mStatsPullerManager->UnRegisterReceiver(mPullTagId, this);
+ if (mIsPulled) {
+ mPullerManager->UnRegisterReceiver(mPullTagId, this);
}
}
@@ -255,11 +249,15 @@ void ValueMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_BUCKET_NUM,
(long long)(getBucketNumFromEndTimeNs(bucket.mBucketEndNs)));
}
-
- protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_VALUE, (long long)bucket.mValue);
+ if (mValueType == LONG) {
+ protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_VALUE_LONG,
+ (long long)bucket.mValueLong);
+ } else {
+ protoOutput->write(FIELD_TYPE_DOUBLE | FIELD_ID_VALUE_DOUBLE, bucket.mValueDouble);
+ }
protoOutput->end(bucketInfoToken);
- VLOG("\t bucket [%lld - %lld] count: %lld", (long long)bucket.mBucketStartNs,
- (long long)bucket.mBucketEndNs, (long long)bucket.mValue);
+ VLOG("\t bucket [%lld - %lld] count: %lld, %.2f", (long long)bucket.mBucketStartNs,
+ (long long)bucket.mBucketEndNs, (long long)bucket.mValueLong, bucket.mValueDouble);
}
protoOutput->end(wrapperToken);
}
@@ -281,9 +279,9 @@ void ValueMetricProducer::onConditionChangedLocked(const bool condition,
flushIfNeededLocked(eventTimeNs);
- if (mPullTagId != -1) {
+ if (mIsPulled) {
vector<shared_ptr<LogEvent>> allData;
- if (mStatsPullerManager->Pull(mPullTagId, eventTimeNs, &allData)) {
+ if (mPullerManager->Pull(mPullTagId, eventTimeNs, &allData)) {
if (allData.size() == 0) {
return;
}
@@ -331,10 +329,10 @@ void ValueMetricProducer::dumpStatesLocked(FILE* out, bool verbose) const {
(unsigned long)mCurrentSlicedBucket.size());
if (verbose) {
for (const auto& it : mCurrentSlicedBucket) {
- fprintf(out, "\t(what)%s\t(condition)%s (value)%lld\n",
- it.first.getDimensionKeyInWhat().toString().c_str(),
- it.first.getDimensionKeyInCondition().toString().c_str(),
- (unsigned long long)it.second.sum);
+ fprintf(out, "\t(what)%s\t(condition)%s (value)%s\n",
+ it.first.getDimensionKeyInWhat().toString().c_str(),
+ it.first.getDimensionKeyInCondition().toString().c_str(),
+ it.second.value.toString().c_str());
}
}
}
@@ -359,6 +357,27 @@ bool ValueMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) {
return false;
}
+const Value getDoubleOrLong(const Value& value) {
+ Value v;
+ switch (value.type) {
+ case INT:
+ v.setLong(value.int_value);
+ break;
+ case LONG:
+ v.setLong(value.long_value);
+ break;
+ case FLOAT:
+ v.setDouble(value.float_value);
+ break;
+ case DOUBLE:
+ v.setDouble(value.double_value);
+ break;
+ default:
+ break;
+ }
+ return v;
+}
+
void ValueMetricProducer::onMatchedLogEventInternalLocked(
const size_t matcherIndex, const MetricDimensionKey& eventKey,
const ConditionKey& conditionKey, bool condition,
@@ -377,19 +396,25 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked(
}
Interval& interval = mCurrentSlicedBucket[eventKey];
- int error = 0;
- const int64_t value = event.GetLong(mField, &error);
- if (error < 0) {
+ if (mField > event.size()) {
+ VLOG("Failed to extract value field %d from atom %s. %d", mField, event.ToString().c_str(),
+ (int)event.size());
return;
}
+ Value value = getDoubleOrLong(event.getValues()[mField - 1].mValue);
- if (mPullTagId != -1) { // for pulled events
+ Value diff;
+ bool hasDiff = false;
+ if (mIsPulled) {
+ // Always require condition for pulled events. In the case of no condition, only pull
+ // on bucket boundaries, in which we fake condition changes.
if (mCondition == true) {
if (!interval.startUpdated) {
interval.start = value;
interval.startUpdated = true;
} else {
- // skip it if there is already value recorded for the start
+ // Skip it if there is already value recorded for the start. Happens when puller
+ // takes too long to finish. In this case we take the previous value.
VLOG("Already recorded value for this dimension %s", eventKey.toString().c_str());
}
} else {
@@ -397,31 +422,55 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked(
// If not, take absolute value or drop it, based on config.
if (interval.startUpdated) {
if (value >= interval.start) {
- interval.sum += (value - interval.start);
- interval.hasValue = true;
+ diff = (value - interval.start);
+ hasDiff = true;
} else {
if (mUseAbsoluteValueOnReset) {
- interval.sum += value;
- interval.hasValue = true;
+ diff = value;
+ hasDiff = true;
} else {
- VLOG("Dropping data for atom %d, prev: %lld, now: %lld", mPullTagId,
- (long long)interval.start, (long long)value);
+ VLOG("Dropping data for atom %d, prev: %s, now: %s", mPullTagId,
+ interval.start.toString().c_str(), value.toString().c_str());
}
}
interval.startUpdated = false;
} else {
- VLOG("No start for matching end %lld", (long long)value);
- interval.tainted += 1;
+ VLOG("No start for matching end %s", value.toString().c_str());
}
}
- } else { // for pushed events, only accumulate when condition is true
- if (mCondition == true || mConditionTrackerIndex < 0) {
- interval.sum += value;
+ } else {
+ // for pushed events, only aggregate when sliced condition is true
+ if (condition == true || mConditionTrackerIndex < 0) {
+ diff = value;
+ hasDiff = true;
+ }
+ }
+ if (hasDiff) {
+ if (interval.hasValue) {
+ switch (mAggregationType) {
+ case ValueMetric::SUM:
+ // for AVG, we add up and take average when flushing the bucket
+ case ValueMetric::AVG:
+ interval.value += diff;
+ break;
+ case ValueMetric::MIN:
+ interval.value = diff < interval.value ? diff : interval.value;
+ break;
+ case ValueMetric::MAX:
+ interval.value = diff > interval.value ? diff : interval.value;
+ break;
+ default:
+ break;
+ }
+ } else {
+ interval.value = diff;
interval.hasValue = true;
}
+ interval.sampleSize += 1;
}
- long wholeBucketVal = interval.sum;
+ // TODO: propgate proper values down stream when anomaly support doubles
+ long wholeBucketVal = interval.value.long_value;
auto prev = mCurrentFullBucket.find(eventKey);
if (prev != mCurrentFullBucket.end()) {
wholeBucketVal += prev->second;
@@ -468,18 +517,15 @@ void ValueMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
if (info.mBucketEndNs - mCurrentBucketStartTimeNs >= mMinBucketSizeNs) {
// The current bucket is large enough to keep.
- int tainted = 0;
for (const auto& slice : mCurrentSlicedBucket) {
- tainted += slice.second.tainted;
- tainted += slice.second.startUpdated;
if (slice.second.hasValue) {
- info.mValue = slice.second.sum;
+ info.mValueLong = slice.second.value.long_value;
+ info.mValueDouble = (double)slice.second.value.long_value / slice.second.sampleSize;
// it will auto create new vector of ValuebucketInfo if the key is not found.
auto& bucketList = mPastBuckets[slice.first];
bucketList.push_back(info);
}
}
- VLOG("%d tainted pairs in the bucket", tainted);
} else {
mSkippedBuckets.emplace_back(info.mBucketStartNs, info.mBucketEndNs);
}
@@ -488,7 +534,8 @@ void ValueMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
// Accumulate partial buckets with current value and then send to anomaly tracker.
if (mCurrentFullBucket.size() > 0) {
for (const auto& slice : mCurrentSlicedBucket) {
- mCurrentFullBucket[slice.first] += slice.second.sum;
+ // TODO: fix this when anomaly can accept double values
+ mCurrentFullBucket[slice.first] += slice.second.value.long_value;
}
for (const auto& slice : mCurrentFullBucket) {
for (auto& tracker : mAnomalyTrackers) {
@@ -503,7 +550,9 @@ void ValueMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
for (const auto& slice : mCurrentSlicedBucket) {
for (auto& tracker : mAnomalyTrackers) {
if (tracker != nullptr) {
- tracker->addPastBucket(slice.first, slice.second.sum, mCurrentBucketNum);
+ // TODO: fix this when anomaly can accept double values
+ tracker->addPastBucket(slice.first, slice.second.value.long_value,
+ mCurrentBucketNum);
}
}
}
@@ -511,7 +560,8 @@ void ValueMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
} else {
// Accumulate partial bucket.
for (const auto& slice : mCurrentSlicedBucket) {
- mCurrentFullBucket[slice.first] += slice.second.sum;
+ // TODO: fix this when anomaly can accept double values
+ mCurrentFullBucket[slice.first] += slice.second.value.long_value;
}
}
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h
index cb6b051cd484..188e3de6a289 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.h
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.h
@@ -23,6 +23,7 @@
#include "../condition/ConditionTracker.h"
#include "../external/PullDataReceiver.h"
#include "../external/StatsPullerManager.h"
+#include "../stats_log_util.h"
#include "MetricProducer.h"
#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
@@ -33,17 +34,20 @@ namespace statsd {
struct ValueBucket {
int64_t mBucketStartNs;
int64_t mBucketEndNs;
- int64_t mValue;
+ int64_t mValueLong;
+ double mValueDouble;
};
class ValueMetricProducer : public virtual MetricProducer, public virtual PullDataReceiver {
public:
ValueMetricProducer(const ConfigKey& key, const ValueMetric& valueMetric,
const int conditionIndex, const sp<ConditionWizard>& wizard,
- const int pullTagId, const int64_t timeBaseNs, const int64_t startTimeNs);
+ const int pullTagId, const int64_t timeBaseNs, const int64_t startTimeNs,
+ const sp<StatsPullerManager>& pullerManager);
virtual ~ValueMetricProducer();
+ // Process data pulled on bucket boundary.
void onDataPulled(const std::vector<std::shared_ptr<LogEvent>>& data) override;
// ValueMetric needs special logic if it's a pulled atom.
@@ -53,7 +57,7 @@ public:
if (mPullTagId != -1 && (mCondition == true || mConditionTrackerIndex < 0) ) {
vector<shared_ptr<LogEvent>> allData;
- mStatsPullerManager->Pull(mPullTagId, eventTimeNs, &allData);
+ mPullerManager->Pull(mPullTagId, eventTimeNs, &allData);
if (allData.size() == 0) {
// This shouldn't happen since this valuemetric is not useful now.
}
@@ -112,33 +116,29 @@ private:
void dropDataLocked(const int64_t dropTimeNs) override;
- const FieldMatcher mValueField;
-
- std::shared_ptr<StatsPullerManager> mStatsPullerManager;
+ sp<StatsPullerManager> mPullerManager;
- // for testing
- ValueMetricProducer(const ConfigKey& key, const ValueMetric& valueMetric,
- const int conditionIndex, const sp<ConditionWizard>& wizard,
- const int pullTagId, const int64_t timeBaseNs, const int64_t startTimeNs,
- std::shared_ptr<StatsPullerManager> statsPullerManager);
+ const FieldMatcher mValueField;
// tagId for pulled data. -1 if this is not pulled
const int mPullTagId;
+ // if this is pulled metric
+ const bool mIsPulled;
+
int mField;
// internal state of a bucket.
typedef struct {
// Pulled data always come in pair of <start, end>. This holds the value
- // for start. The diff (end - start) is added to sum.
- int64_t start;
+ // for start. The diff (end - start) is taken as the real value.
+ Value start;
// Whether the start data point is updated
bool startUpdated;
- // If end data point comes before the start, record this pair as tainted
- // and the value is not added to the running sum.
- int tainted;
- // Running sum of known pairs in this bucket
- int64_t sum;
+ // Current value, depending on the aggregation type.
+ Value value;
+ // Number of samples collected.
+ int sampleSize;
// If this dimension has any non-tainted value. If not, don't report the
// dimension.
bool hasValue;
@@ -149,7 +149,6 @@ private:
std::unordered_map<MetricDimensionKey, int64_t> mCurrentFullBucket;
// Save the past buckets and we can clear when the StatsLogReport is dumped.
- // TODO: Add a lock to mPastBuckets.
std::unordered_map<MetricDimensionKey, std::vector<ValueBucket>> mPastBuckets;
// Pairs of (elapsed start, elapsed end) denoting buckets that were skipped.
@@ -168,6 +167,10 @@ private:
const bool mUseAbsoluteValueOnReset;
+ const ValueMetric::AggregationType mAggregationType;
+
+ const Type mValueType;
+
FRIEND_TEST(ValueMetricProducerTest, TestNonDimensionalEvents);
FRIEND_TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset);
FRIEND_TEST(ValueMetricProducerTest, TestPulledEventsTakeZeroOnReset);
@@ -182,6 +185,11 @@ private:
FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition);
FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2);
FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3);
+ FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateMin);
+ FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateMax);
+ FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateAvg);
+ FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateSum);
+ FRIEND_TEST(ValueMetricProducerTest, TestPushedAggregateSumSliced);
};
} // namespace statsd
diff --git a/cmds/statsd/src/metrics/duration_helper/DurationTracker.h b/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
index 149b3189dfba..ccb1d4359e89 100644
--- a/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
+++ b/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
@@ -44,7 +44,6 @@ struct DurationInfo {
int64_t lastStartTime;
// existing duration in current bucket.
int64_t lastDuration;
- // TODO: Optimize the way we track sliced condition in duration metrics.
// cache the HashableDimensionKeys we need to query the condition for this duration event.
ConditionKey conditionKeys;
diff --git a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
index b833dfc79a22..956383a99eea 100644
--- a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
+++ b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
@@ -326,7 +326,6 @@ void OringDurationTracker::onConditionChanged(bool condition, const int64_t time
int64_t OringDurationTracker::predictAnomalyTimestampNs(
const DurationAnomalyTracker& anomalyTracker, const int64_t eventTimestampNs) const {
- // TODO: Unit-test this and see if it can be done more efficiently (e.g. use int32).
// The anomaly threshold.
const int64_t thresholdNs = anomalyTracker.getAnomalyThreshold();
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.cpp b/cmds/statsd/src/metrics/metrics_manager_util.cpp
index 811a00e47ae5..e03edb3000ca 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.cpp
+++ b/cmds/statsd/src/metrics/metrics_manager_util.cpp
@@ -103,7 +103,6 @@ bool handleMetricWithConditions(
}
allConditionTrackers[condition_it->second]->setSliced(true);
allConditionTrackers[it->second]->setSliced(true);
- // TODO: We need to verify the link is valid.
}
conditionIndex = condition_it->second;
@@ -169,7 +168,6 @@ bool initLogTrackers(const StatsdConfig& config, const UidMap& uidMap,
bool isStateTracker(const SimplePredicate& simplePredicate, vector<Matcher>* primaryKeys) {
// 1. must not have "stop". must have "dimension"
if (!simplePredicate.has_stop() && simplePredicate.has_dimensions()) {
- // TODO: need to check the start atom matcher too.
auto it = android::util::AtomsInfo::kStateAtomsFieldOptions.find(
simplePredicate.dimensions().field());
// 2. must be based on a state atom.
@@ -262,9 +260,10 @@ bool initConditions(const ConfigKey& key, const StatsdConfig& config,
return true;
}
-bool initMetrics(const ConfigKey& key, const StatsdConfig& config,
- const int64_t timeBaseTimeNs, const int64_t currentTimeNs,
- UidMap& uidMap, const unordered_map<int64_t, int>& logTrackerMap,
+bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseTimeNs,
+ const int64_t currentTimeNs, UidMap& uidMap,
+ const sp<StatsPullerManager>& pullerManager,
+ const unordered_map<int64_t, int>& logTrackerMap,
const unordered_map<int64_t, int>& conditionTrackerMap,
const vector<sp<LogMatchingTracker>>& allAtomMatchers,
vector<sp<ConditionTracker>>& allConditionTrackers,
@@ -465,9 +464,9 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config,
}
}
- sp<MetricProducer> valueProducer = new ValueMetricProducer(key, metric, conditionIndex,
- wizard, pullTagId,
- timeBaseTimeNs, currentTimeNs);
+ sp<MetricProducer> valueProducer =
+ new ValueMetricProducer(key, metric, conditionIndex, wizard, pullTagId,
+ timeBaseTimeNs, currentTimeNs, pullerManager);
allMetricProducers.push_back(valueProducer);
}
@@ -525,8 +524,9 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config,
}
}
- sp<MetricProducer> gaugeProducer = new GaugeMetricProducer(
- key, metric, conditionIndex, wizard, pullTagId, timeBaseTimeNs, currentTimeNs);
+ sp<MetricProducer> gaugeProducer =
+ new GaugeMetricProducer(key, metric, conditionIndex, wizard, pullTagId,
+ timeBaseTimeNs, currentTimeNs, pullerManager);
allMetricProducers.push_back(gaugeProducer);
}
for (int i = 0; i < config.no_report_metric_size(); ++i) {
@@ -645,10 +645,10 @@ bool initAlarms(const StatsdConfig& config, const ConfigKey& key,
}
bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, UidMap& uidMap,
+ const sp<StatsPullerManager>& pullerManager,
const sp<AlarmMonitor>& anomalyAlarmMonitor,
- const sp<AlarmMonitor>& periodicAlarmMonitor,
- const int64_t timeBaseNs, const int64_t currentTimeNs,
- set<int>& allTagIds,
+ const sp<AlarmMonitor>& periodicAlarmMonitor, const int64_t timeBaseNs,
+ const int64_t currentTimeNs, set<int>& allTagIds,
vector<sp<LogMatchingTracker>>& allAtomMatchers,
vector<sp<ConditionTracker>>& allConditionTrackers,
vector<sp<MetricProducer>>& allMetricProducers,
@@ -674,9 +674,8 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, UidMap&
return false;
}
- if (!initMetrics(key, config, timeBaseNs, currentTimeNs, uidMap,
- logTrackerMap, conditionTrackerMap,
- allAtomMatchers, allConditionTrackers, allMetricProducers,
+ if (!initMetrics(key, config, timeBaseNs, currentTimeNs, uidMap, pullerManager, logTrackerMap,
+ conditionTrackerMap, allAtomMatchers, allConditionTrackers, allMetricProducers,
conditionToMetricMap, trackerToMetricMap, metricProducerMap,
noReportMetricIds)) {
ALOGE("initMetricProducers failed");
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.h b/cmds/statsd/src/metrics/metrics_manager_util.h
index d749bf43c9be..c6601493135f 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.h
+++ b/cmds/statsd/src/metrics/metrics_manager_util.h
@@ -23,7 +23,7 @@
#include "../anomaly/AlarmTracker.h"
#include "../condition/ConditionTracker.h"
-#include "../external/StatsPullerManagerImpl.h"
+#include "../external/StatsPullerManager.h"
#include "../matchers/LogMatchingTracker.h"
#include "../metrics/MetricProducer.h"
@@ -81,9 +81,8 @@ bool initConditions(const ConfigKey& key, const StatsdConfig& config,
// the list of MetricProducer index
// [trackerToMetricMap]: contains the mapping from log tracker to MetricProducer index.
bool initMetrics(
- const ConfigKey& key, const StatsdConfig& config,
- const int64_t timeBaseTimeNs, const int64_t currentTimeNs,
- UidMap& uidMap,
+ const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseTimeNs,
+ const int64_t currentTimeNs, UidMap& uidMap, const sp<StatsPullerManager>& pullerManager,
const std::unordered_map<int64_t, int>& logTrackerMap,
const std::unordered_map<int64_t, int>& conditionTrackerMap,
const std::unordered_map<int, std::vector<MetricConditionLink>>& eventConditionLinks,
@@ -97,10 +96,10 @@ bool initMetrics(
// Initialize MetricsManager from StatsdConfig.
// Parameters are the members of MetricsManager. See MetricsManager for declaration.
bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, UidMap& uidMap,
+ const sp<StatsPullerManager>& pullerManager,
const sp<AlarmMonitor>& anomalyAlarmMonitor,
- const sp<AlarmMonitor>& periodicAlarmMonitor,
- const int64_t timeBaseNs, const int64_t currentTimeNs,
- std::set<int>& allTagIds,
+ const sp<AlarmMonitor>& periodicAlarmMonitor, const int64_t timeBaseNs,
+ const int64_t currentTimeNs, std::set<int>& allTagIds,
std::vector<sp<LogMatchingTracker>>& allAtomMatchers,
std::vector<sp<ConditionTracker>>& allConditionTrackers,
std::vector<sp<MetricProducer>>& allMetricProducers,
diff --git a/cmds/statsd/src/metrics_constants/metrics_constants.proto b/cmds/statsd/src/metrics_constants/metrics_constants.proto
new file mode 120000
index 000000000000..8366db767fe8
--- /dev/null
+++ b/cmds/statsd/src/metrics_constants/metrics_constants.proto
@@ -0,0 +1 @@
+../../../../proto/src/metrics_constants.proto \ No newline at end of file
diff --git a/cmds/statsd/src/packages/UidMap.cpp b/cmds/statsd/src/packages/UidMap.cpp
index fff909c12441..be94725991af 100644
--- a/cmds/statsd/src/packages/UidMap.cpp
+++ b/cmds/statsd/src/packages/UidMap.cpp
@@ -272,7 +272,7 @@ void UidMap::assignIsolatedUid(int isolatedUid, int parentUid) {
mIsolatedUidMap[isolatedUid] = parentUid;
}
-void UidMap::removeIsolatedUid(int isolatedUid, int parentUid) {
+void UidMap::removeIsolatedUid(int isolatedUid) {
lock_guard<mutex> lock(mIsolatedMutex);
auto it = mIsolatedUidMap.find(isolatedUid);
diff --git a/cmds/statsd/src/packages/UidMap.h b/cmds/statsd/src/packages/UidMap.h
index 5e42cd18de32..91f203084388 100644
--- a/cmds/statsd/src/packages/UidMap.h
+++ b/cmds/statsd/src/packages/UidMap.h
@@ -119,7 +119,7 @@ public:
void OnConfigRemoved(const ConfigKey& key);
void assignIsolatedUid(int isolatedUid, int parentUid);
- void removeIsolatedUid(int isolatedUid, int parentUid);
+ void removeIsolatedUid(int isolatedUid);
// Returns the host uid if it exists. Otherwise, returns the same uid that was passed-in.
virtual int getHostUidOrSelf(int uid) const;
@@ -146,7 +146,6 @@ private:
void getListenerListCopyLocked(std::vector<wp<PackageInfoListener>>* output);
- // TODO: Use shared_mutex for improved read-locking if a library can be found in Android.
mutable mutex mMutex;
mutable mutex mIsolatedMutex;
diff --git a/cmds/statsd/src/perfprofd/perfprofd_config.proto b/cmds/statsd/src/perfprofd/perfprofd_config.proto
new file mode 120000
index 000000000000..c8be24707dfd
--- /dev/null
+++ b/cmds/statsd/src/perfprofd/perfprofd_config.proto
@@ -0,0 +1 @@
+../../../../../../system/extras/perfprofd/perfprofd_config.proto \ No newline at end of file
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index 2fe17daf7542..cfd62690dd1c 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -106,7 +106,11 @@ message ValueBucketInfo {
optional int64 end_bucket_elapsed_nanos = 2;
- optional int64 value = 3;
+ oneof values {
+ int64 value_long = 3;
+
+ double value_double = 7;
+ }
optional int64 bucket_num = 4;
diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto
index cf5530000555..fabc5f94c405 100644
--- a/cmds/statsd/src/statsd_config.proto
+++ b/cmds/statsd/src/statsd_config.proto
@@ -22,6 +22,7 @@ option java_package = "com.android.internal.os";
option java_outer_classname = "StatsdConfigProto";
import "frameworks/base/cmds/statsd/src/perfetto/perfetto_config.proto";
+import "frameworks/base/cmds/statsd/src/perfprofd/perfprofd_config.proto";
enum Position {
POSITION_UNKNOWN = 0;
@@ -261,6 +262,9 @@ message ValueMetric {
enum AggregationType {
SUM = 1;
+ MIN = 2;
+ MAX = 3;
+ AVG = 4;
}
optional AggregationType aggregation_type = 8 [default = SUM];
@@ -303,6 +307,10 @@ message PerfettoDetails {
optional perfetto.protos.TraceConfig trace_config = 1;
}
+message PerfprofdDetails {
+ optional android.perfprofd.ProfilingConfig perfprofd_config = 1;
+}
+
message BroadcastSubscriberDetails {
optional int64 subscriber_id = 1;
repeated string cookie = 2;
@@ -324,6 +332,7 @@ message Subscription {
IncidentdDetails incidentd_details = 4;
PerfettoDetails perfetto_details = 5;
BroadcastSubscriberDetails broadcast_subscriber_details = 6;
+ PerfprofdDetails perfprofd_details = 8;
}
optional float probability_of_informing = 7 [default = 1.1];
diff --git a/cmds/statsd/src/storage/StorageManager.cpp b/cmds/statsd/src/storage/StorageManager.cpp
index 1f8181266b65..3ebc8a492d68 100644
--- a/cmds/statsd/src/storage/StorageManager.cpp
+++ b/cmds/statsd/src/storage/StorageManager.cpp
@@ -57,7 +57,7 @@ static void parseFileName(char* name, int64_t* result) {
}
// When index ends before hitting 3, file name is corrupted. We
// intentionally put -1 at index 0 to indicate the error to caller.
- // TODO: consider removing files with unexpected name format.
+ // TODO(b/110563137): consider removing files with unexpected name format.
if (index < 3) {
result[0] = -1;
}
diff --git a/cmds/statsd/tests/FieldValue_test.cpp b/cmds/statsd/tests/FieldValue_test.cpp
index c253bc19d641..a9305accb1be 100644
--- a/cmds/statsd/tests/FieldValue_test.cpp
+++ b/cmds/statsd/tests/FieldValue_test.cpp
@@ -312,7 +312,8 @@ TEST(AtomMatcherTest, TestSubscriberDimensionWrite) {
dim.addValue(FieldValue(field4, value4));
SubscriberReporter::getStatsDimensionsValue(dim);
- // TODO: can't test anything here because SubscriberReport class doesn't have any read api.
+ // TODO(b/110562792): can't test anything here because StatsDimensionsValue class doesn't
+ // have any read api.
}
TEST(AtomMatcherTest, TestWriteDimensionToProto) {
@@ -483,4 +484,4 @@ TEST(AtomMatcherTest, TestWriteAtomToProto) {
} // namespace android
#else
GTEST_LOG_(INFO) << "This test does nothing.\n";
-#endif \ No newline at end of file
+#endif
diff --git a/cmds/statsd/tests/MetricsManager_test.cpp b/cmds/statsd/tests/MetricsManager_test.cpp
index 07378dbcce1a..8fbb58a956d5 100644
--- a/cmds/statsd/tests/MetricsManager_test.cpp
+++ b/cmds/statsd/tests/MetricsManager_test.cpp
@@ -39,8 +39,6 @@ using android::os::statsd::Predicate;
#ifdef __ANDROID__
-// TODO: ADD MORE TEST CASES.
-
const ConfigKey kConfigKey(0, 12345);
const long timeBaseSec = 1000;
@@ -271,6 +269,7 @@ StatsdConfig buildCirclePredicates() {
TEST(MetricsManagerTest, TestGoodConfig) {
UidMap uidMap;
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
StatsdConfig config = buildGoodConfig();
@@ -285,13 +284,11 @@ TEST(MetricsManagerTest, TestGoodConfig) {
unordered_map<int, std::vector<int>> trackerToConditionMap;
std::set<int64_t> noReportMetricIds;
- EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap,
- anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
- allConditionTrackers, allMetricProducers, allAnomalyTrackers,
- allAlarmTrackers,
- conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
- noReportMetricIds));
+ EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
+ periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
+ allAtomMatchers, allConditionTrackers, allMetricProducers,
+ allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
+ trackerToMetricMap, trackerToConditionMap, noReportMetricIds));
EXPECT_EQ(1u, allMetricProducers.size());
EXPECT_EQ(1u, allAnomalyTrackers.size());
EXPECT_EQ(1u, noReportMetricIds.size());
@@ -299,6 +296,7 @@ TEST(MetricsManagerTest, TestGoodConfig) {
TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) {
UidMap uidMap;
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
StatsdConfig config = buildDimensionMetricsWithMultiTags();
@@ -313,17 +311,16 @@ TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) {
unordered_map<int, std::vector<int>> trackerToConditionMap;
std::set<int64_t> noReportMetricIds;
- EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
- anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
- allConditionTrackers, allMetricProducers, allAnomalyTrackers,
- allAlarmTrackers,
- conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
- noReportMetricIds));
+ EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
+ periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
+ allAtomMatchers, allConditionTrackers, allMetricProducers,
+ allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
+ trackerToMetricMap, trackerToConditionMap, noReportMetricIds));
}
TEST(MetricsManagerTest, TestCircleLogMatcherDependency) {
UidMap uidMap;
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
StatsdConfig config = buildCircleMatchers();
@@ -338,17 +335,16 @@ TEST(MetricsManagerTest, TestCircleLogMatcherDependency) {
unordered_map<int, std::vector<int>> trackerToConditionMap;
std::set<int64_t> noReportMetricIds;
- EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
- anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
- allConditionTrackers, allMetricProducers, allAnomalyTrackers,
- allAlarmTrackers,
- conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
- noReportMetricIds));
+ EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
+ periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
+ allAtomMatchers, allConditionTrackers, allMetricProducers,
+ allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
+ trackerToMetricMap, trackerToConditionMap, noReportMetricIds));
}
TEST(MetricsManagerTest, TestMissingMatchers) {
UidMap uidMap;
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
StatsdConfig config = buildMissingMatchers();
@@ -362,17 +358,16 @@ TEST(MetricsManagerTest, TestMissingMatchers) {
unordered_map<int, std::vector<int>> trackerToMetricMap;
unordered_map<int, std::vector<int>> trackerToConditionMap;
std::set<int64_t> noReportMetricIds;
- EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
- anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
- allConditionTrackers, allMetricProducers, allAnomalyTrackers,
- allAlarmTrackers,
- conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
- noReportMetricIds));
+ EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
+ periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
+ allAtomMatchers, allConditionTrackers, allMetricProducers,
+ allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
+ trackerToMetricMap, trackerToConditionMap, noReportMetricIds));
}
TEST(MetricsManagerTest, TestMissingPredicate) {
UidMap uidMap;
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
StatsdConfig config = buildMissingPredicate();
@@ -386,17 +381,16 @@ TEST(MetricsManagerTest, TestMissingPredicate) {
unordered_map<int, std::vector<int>> trackerToMetricMap;
unordered_map<int, std::vector<int>> trackerToConditionMap;
std::set<int64_t> noReportMetricIds;
- EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
- anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
- allConditionTrackers, allMetricProducers, allAnomalyTrackers,
- allAlarmTrackers,
- conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
- noReportMetricIds));
+ EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
+ periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
+ allAtomMatchers, allConditionTrackers, allMetricProducers,
+ allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
+ trackerToMetricMap, trackerToConditionMap, noReportMetricIds));
}
TEST(MetricsManagerTest, TestCirclePredicateDependency) {
UidMap uidMap;
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
StatsdConfig config = buildCirclePredicates();
@@ -411,17 +405,16 @@ TEST(MetricsManagerTest, TestCirclePredicateDependency) {
unordered_map<int, std::vector<int>> trackerToConditionMap;
std::set<int64_t> noReportMetricIds;
- EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
- anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
- allConditionTrackers, allMetricProducers, allAnomalyTrackers,
- allAlarmTrackers,
- conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
- noReportMetricIds));
+ EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
+ periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
+ allAtomMatchers, allConditionTrackers, allMetricProducers,
+ allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
+ trackerToMetricMap, trackerToConditionMap, noReportMetricIds));
}
TEST(MetricsManagerTest, testAlertWithUnknownMetric) {
UidMap uidMap;
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
StatsdConfig config = buildAlertWithUnknownMetric();
@@ -436,13 +429,11 @@ TEST(MetricsManagerTest, testAlertWithUnknownMetric) {
unordered_map<int, std::vector<int>> trackerToConditionMap;
std::set<int64_t> noReportMetricIds;
- EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
- anomalyAlarmMonitor, periodicAlarmMonitor,
- timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
- allConditionTrackers, allMetricProducers, allAnomalyTrackers,
- allAlarmTrackers,
- conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
- noReportMetricIds));
+ EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor,
+ periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds,
+ allAtomMatchers, allConditionTrackers, allMetricProducers,
+ allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap,
+ trackerToMetricMap, trackerToConditionMap, noReportMetricIds));
}
#else
diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp
index 76f3d8181dee..ecc57f5c4b26 100644
--- a/cmds/statsd/tests/StatsLogProcessor_test.cpp
+++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp
@@ -44,13 +44,13 @@ using android::util::ProtoOutputStream;
*/
class MockMetricsManager : public MetricsManager {
public:
- MockMetricsManager() : MetricsManager(
- ConfigKey(1, 12345), StatsdConfig(), 1000, 1000,
- new UidMap(),
- new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t){},
- [](const sp<IStatsCompanionService>&){}),
- new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t){},
- [](const sp<IStatsCompanionService>&){})) {
+ MockMetricsManager()
+ : MetricsManager(ConfigKey(1, 12345), StatsdConfig(), 1000, 1000, new UidMap(),
+ new StatsPullerManager(),
+ new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t) {},
+ [](const sp<IStatsCompanionService>&) {}),
+ new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t) {},
+ [](const sp<IStatsCompanionService>&) {})) {
}
MOCK_METHOD0(byteSize, size_t());
@@ -60,11 +60,12 @@ public:
TEST(StatsLogProcessorTest, TestRateLimitByteSize) {
sp<UidMap> m = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> periodicAlarmMonitor;
// Construct the processor with a dummy sendBroadcast function that does nothing.
- StatsLogProcessor p(m, anomalyAlarmMonitor, periodicAlarmMonitor, 0,
- [](const ConfigKey& key) {return true;});
+ StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, 0,
+ [](const ConfigKey& key) { return true; });
MockMetricsManager mockMetricsManager;
@@ -79,11 +80,15 @@ TEST(StatsLogProcessorTest, TestRateLimitByteSize) {
TEST(StatsLogProcessorTest, TestRateLimitBroadcast) {
sp<UidMap> m = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> subscriberAlarmMonitor;
int broadcastCount = 0;
- StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
- [&broadcastCount](const ConfigKey& key) { broadcastCount++; return true;});
+ StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+ [&broadcastCount](const ConfigKey& key) {
+ broadcastCount++;
+ return true;
+ });
MockMetricsManager mockMetricsManager;
@@ -105,11 +110,15 @@ TEST(StatsLogProcessorTest, TestRateLimitBroadcast) {
TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge) {
sp<UidMap> m = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> subscriberAlarmMonitor;
int broadcastCount = 0;
- StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
- [&broadcastCount](const ConfigKey& key) { broadcastCount++; return true;});
+ StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+ [&broadcastCount](const ConfigKey& key) {
+ broadcastCount++;
+ return true;
+ });
MockMetricsManager mockMetricsManager;
@@ -143,12 +152,16 @@ StatsdConfig MakeConfig(bool includeMetric) {
TEST(StatsLogProcessorTest, TestUidMapHasSnapshot) {
// Setup simple config key corresponding to empty config.
sp<UidMap> m = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
m->updateMap(1, {1, 2}, {1, 2}, {String16("p1"), String16("p2")});
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> subscriberAlarmMonitor;
int broadcastCount = 0;
- StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
- [&broadcastCount](const ConfigKey& key) { broadcastCount++; return true;});
+ StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+ [&broadcastCount](const ConfigKey& key) {
+ broadcastCount++;
+ return true;
+ });
ConfigKey key(3, 4);
StatsdConfig config = MakeConfig(true);
p.OnConfigUpdated(0, key, config);
@@ -168,12 +181,16 @@ TEST(StatsLogProcessorTest, TestUidMapHasSnapshot) {
TEST(StatsLogProcessorTest, TestEmptyConfigHasNoUidMap) {
// Setup simple config key corresponding to empty config.
sp<UidMap> m = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
m->updateMap(1, {1, 2}, {1, 2}, {String16("p1"), String16("p2")});
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> subscriberAlarmMonitor;
int broadcastCount = 0;
- StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
- [&broadcastCount](const ConfigKey& key) { broadcastCount++; return true;});
+ StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+ [&broadcastCount](const ConfigKey& key) {
+ broadcastCount++;
+ return true;
+ });
ConfigKey key(3, 4);
StatsdConfig config = MakeConfig(false);
p.OnConfigUpdated(0, key, config);
@@ -191,11 +208,15 @@ TEST(StatsLogProcessorTest, TestEmptyConfigHasNoUidMap) {
TEST(StatsLogProcessorTest, TestReportIncludesSubConfig) {
// Setup simple config key corresponding to empty config.
sp<UidMap> m = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> subscriberAlarmMonitor;
int broadcastCount = 0;
- StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
- [&broadcastCount](const ConfigKey& key) { broadcastCount++; return true;});
+ StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+ [&broadcastCount](const ConfigKey& key) {
+ broadcastCount++;
+ return true;
+ });
ConfigKey key(3, 4);
StatsdConfig config;
auto annotation = config.add_annotation();
@@ -220,11 +241,15 @@ TEST(StatsLogProcessorTest, TestReportIncludesSubConfig) {
TEST(StatsLogProcessorTest, TestOutOfOrderLogs) {
// Setup simple config key corresponding to empty config.
sp<UidMap> m = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> subscriberAlarmMonitor;
int broadcastCount = 0;
- StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
- [&broadcastCount](const ConfigKey& key) { broadcastCount++; return true;});
+ StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+ [&broadcastCount](const ConfigKey& key) {
+ broadcastCount++;
+ return true;
+ });
LogEvent event1(0, 1 /*logd timestamp*/, 1001 /*elapsedRealtime*/);
event1.init();
diff --git a/cmds/statsd/tests/UidMap_test.cpp b/cmds/statsd/tests/UidMap_test.cpp
index e23131d7b45d..99082cc647f6 100644
--- a/cmds/statsd/tests/UidMap_test.cpp
+++ b/cmds/statsd/tests/UidMap_test.cpp
@@ -40,11 +40,12 @@ const string kApp2 = "app2.sharing.1";
TEST(UidMapTest, TestIsolatedUID) {
sp<UidMap> m = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor;
sp<AlarmMonitor> subscriberAlarmMonitor;
// Construct the processor with a dummy sendBroadcast function that does nothing.
- StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
- [](const ConfigKey& key) {return true;});
+ StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+ [](const ConfigKey& key) { return true; });
LogEvent addEvent(android::util::ISOLATED_UID_CHANGED, 1);
addEvent.write(100); // parent UID
addEvent.write(101); // isolated UID
diff --git a/cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp b/cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp
index 218d52a5c046..79bed52f0202 100644
--- a/cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp
+++ b/cmds/statsd/tests/anomaly/AnomalyTracker_test.cpp
@@ -305,10 +305,10 @@ TEST(AnomalyTrackerTest, TestSparseBuckets) {
EXPECT_EQ(anomalyTracker.getSumOverPastBuckets(keyB), 2LL);
EXPECT_EQ(anomalyTracker.getSumOverPastBuckets(keyC), 1LL);
EXPECT_TRUE(detectAnomaliesPass(anomalyTracker, 16, bucket16, {keyB}, {keyA, keyC, keyD}));
- // TODO: after detectAnomaly fix: EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
+ EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
EXPECT_EQ(anomalyTracker.mMostRecentBucketNum, 15L);
detectAndDeclareAnomalies(anomalyTracker, 16, bucket16, eventTimestamp2);
- // TODO: after detectAnomaly fix: EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
+ EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
EXPECT_EQ(anomalyTracker.mMostRecentBucketNum, 15L);
checkRefractoryTimes(anomalyTracker, eventTimestamp2, refractoryPeriodSec,
{{keyA, -1}, {keyB, eventTimestamp2}, {keyC, -1}, {keyD, -1}, {keyE, -1}});
@@ -366,7 +366,7 @@ TEST(AnomalyTrackerTest, TestSparseBuckets) {
EXPECT_EQ(anomalyTracker.getSumOverPastBuckets(keyC), 1LL);
EXPECT_TRUE(detectAnomaliesPass(anomalyTracker, 25, bucket25, {}, {keyA, keyB, keyC, keyD}));
EXPECT_EQ(anomalyTracker.mMostRecentBucketNum, 24L);
- // TODO: after detectAnomaly fix: EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
+ EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
detectAndDeclareAnomalies(anomalyTracker, 25, bucket25, eventTimestamp5);
checkRefractoryTimes(anomalyTracker, eventTimestamp5, refractoryPeriodSec,
{{keyA, -1}, {keyB, eventTimestamp4}, {keyC, -1}, {keyD, -1}, {keyE, -1}});
@@ -374,14 +374,14 @@ TEST(AnomalyTrackerTest, TestSparseBuckets) {
// Add past bucket #25
anomalyTracker.addPastBucket(bucket25, 25);
EXPECT_EQ(anomalyTracker.mMostRecentBucketNum, 25L);
- // TODO: after detectAnomaly fix: EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 1UL);
+ EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 1UL);
EXPECT_EQ(anomalyTracker.getSumOverPastBuckets(keyD), 1LL);
EXPECT_TRUE(detectAnomaliesPass(anomalyTracker, 28, bucket28, {},
{keyA, keyB, keyC, keyD, keyE}));
EXPECT_EQ(anomalyTracker.mMostRecentBucketNum, 27L);
- // TODO: after detectAnomaly fix: EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
+ EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
detectAndDeclareAnomalies(anomalyTracker, 28, bucket28, eventTimestamp6);
- // TODO: after detectAnomaly fix: EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
+ EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
checkRefractoryTimes(anomalyTracker, eventTimestamp6, refractoryPeriodSec,
{{keyA, -1}, {keyB, -1}, {keyC, -1}, {keyD, -1}, {keyE, -1}});
@@ -390,9 +390,9 @@ TEST(AnomalyTrackerTest, TestSparseBuckets) {
EXPECT_TRUE(detectAnomaliesPass(anomalyTracker, 28, bucket28, {keyE},
{keyA, keyB, keyC, keyD}));
EXPECT_EQ(anomalyTracker.mMostRecentBucketNum, 27L);
- // TODO: after detectAnomaly fix: EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
+ EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
detectAndDeclareAnomalies(anomalyTracker, 28, bucket28, eventTimestamp6 + 7);
- // TODO: after detectAnomaly fix: EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
+ EXPECT_EQ(anomalyTracker.mSumOverPastBuckets.size(), 0UL);
checkRefractoryTimes(anomalyTracker, eventTimestamp6, refractoryPeriodSec,
{{keyA, -1}, {keyB, -1}, {keyC, -1}, {keyD, -1}, {keyE, eventTimestamp6 + 7}});
}
diff --git a/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp b/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
index eca5690de478..d98395e78467 100644
--- a/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
+++ b/cmds/statsd/tests/e2e/GaugeMetric_e2e_pull_test.cpp
@@ -66,7 +66,7 @@ TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents) {
baseTimeNs, configAddedTimeNs, config, cfgKey);
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- processor->mStatsPullerManager.ForceClearPullerCache();
+ processor->mPullerManager->ForceClearPullerCache();
int startBucketNum = processor->mMetricsManagers.begin()->second->
mAllMetricProducers[0]->getCurrentBucketNum();
@@ -74,12 +74,11 @@ TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents) {
// When creating the config, the gauge metric producer should register the alarm at the
// end of the current bucket.
- EXPECT_EQ((size_t)1, StatsPullerManagerImpl::GetInstance().mReceivers.size());
+ EXPECT_EQ((size_t)1, processor->mPullerManager->mReceivers.size());
EXPECT_EQ(bucketSizeNs,
- StatsPullerManagerImpl::GetInstance().mReceivers.begin()->
- second.front().intervalNs);
- int64_t& nextPullTimeNs = StatsPullerManagerImpl::GetInstance().mReceivers.begin()->
- second.front().nextPullTimeNs;
+ processor->mPullerManager->mReceivers.begin()->second.front().intervalNs);
+ int64_t& nextPullTimeNs =
+ processor->mPullerManager->mReceivers.begin()->second.front().nextPullTimeNs;
EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, nextPullTimeNs);
auto screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF,
@@ -212,7 +211,7 @@ TEST(GaugeMetricE2eTest, TestAllConditionChangesSamplePulledEvents) {
baseTimeNs, configAddedTimeNs, config, cfgKey);
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- processor->mStatsPullerManager.ForceClearPullerCache();
+ processor->mPullerManager->ForceClearPullerCache();
int startBucketNum = processor->mMetricsManagers.begin()->second->
mAllMetricProducers[0]->getCurrentBucketNum();
@@ -313,7 +312,7 @@ TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm) {
baseTimeNs, configAddedTimeNs, config, cfgKey);
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- processor->mStatsPullerManager.ForceClearPullerCache();
+ processor->mPullerManager->ForceClearPullerCache();
int startBucketNum = processor->mMetricsManagers.begin()->second->
mAllMetricProducers[0]->getCurrentBucketNum();
@@ -321,12 +320,11 @@ TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm) {
// When creating the config, the gauge metric producer should register the alarm at the
// end of the current bucket.
- EXPECT_EQ((size_t)1, StatsPullerManagerImpl::GetInstance().mReceivers.size());
+ EXPECT_EQ((size_t)1, processor->mPullerManager->mReceivers.size());
EXPECT_EQ(bucketSizeNs,
- StatsPullerManagerImpl::GetInstance().mReceivers.begin()->
- second.front().intervalNs);
- int64_t& nextPullTimeNs = StatsPullerManagerImpl::GetInstance().mReceivers.begin()->
- second.front().nextPullTimeNs;
+ processor->mPullerManager->mReceivers.begin()->second.front().intervalNs);
+ int64_t& nextPullTimeNs =
+ processor->mPullerManager->mReceivers.begin()->second.front().nextPullTimeNs;
EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, nextPullTimeNs);
auto screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF,
diff --git a/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp b/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
index 11aaab00d88c..cc8894bdbca6 100644
--- a/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
@@ -99,7 +99,6 @@ StatsdConfig CreateStatsdConfig() {
// If we want to test multiple dump data, we must do it in separate tests, because in the e2e tests,
// we should use the real API which will clear the data after dump data is called.
-// TODO: better refactor the code so that the tests are not so verbose.
TEST(MetricConditionLinkE2eTest, TestMultiplePredicatesAndLinks1) {
auto config = CreateStatsdConfig();
uint64_t bucketStartTimeNs = 10000000000;
diff --git a/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp b/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
index dd28d3611b4f..f2e8f58fe763 100644
--- a/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/ValueMetric_pull_e2e_test.cpp
@@ -66,7 +66,7 @@ TEST(ValueMetricE2eTest, TestPulledEvents) {
baseTimeNs, configAddedTimeNs, config, cfgKey);
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- processor->mStatsPullerManager.ForceClearPullerCache();
+ processor->mPullerManager->ForceClearPullerCache();
int startBucketNum = processor->mMetricsManagers.begin()->second->
mAllMetricProducers[0]->getCurrentBucketNum();
@@ -74,12 +74,11 @@ TEST(ValueMetricE2eTest, TestPulledEvents) {
// When creating the config, the gauge metric producer should register the alarm at the
// end of the current bucket.
- EXPECT_EQ((size_t)1, StatsPullerManagerImpl::GetInstance().mReceivers.size());
+ EXPECT_EQ((size_t)1, processor->mPullerManager->mReceivers.size());
EXPECT_EQ(bucketSizeNs,
- StatsPullerManagerImpl::GetInstance().mReceivers.begin()->
- second.front().intervalNs);
- int64_t& expectedPullTimeNs = StatsPullerManagerImpl::GetInstance().mReceivers.begin()->
- second.front().nextPullTimeNs;
+ processor->mPullerManager->mReceivers.begin()->second.front().intervalNs);
+ int64_t& expectedPullTimeNs =
+ processor->mPullerManager->mReceivers.begin()->second.front().nextPullTimeNs;
EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, expectedPullTimeNs);
auto screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF,
@@ -142,23 +141,23 @@ TEST(ValueMetricE2eTest, TestPulledEvents) {
EXPECT_EQ(baseTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos());
- EXPECT_TRUE(data.bucket_info(0).has_value());
+ EXPECT_TRUE(data.bucket_info(0).has_value_long());
EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos());
- EXPECT_TRUE(data.bucket_info(1).has_value());
+ EXPECT_TRUE(data.bucket_info(1).has_value_long());
EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(2).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs, data.bucket_info(2).end_bucket_elapsed_nanos());
- EXPECT_TRUE(data.bucket_info(2).has_value());
+ EXPECT_TRUE(data.bucket_info(2).has_value_long());
EXPECT_EQ(baseTimeNs + 6 * bucketSizeNs, data.bucket_info(3).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 7 * bucketSizeNs, data.bucket_info(3).end_bucket_elapsed_nanos());
- EXPECT_TRUE(data.bucket_info(3).has_value());
+ EXPECT_TRUE(data.bucket_info(3).has_value_long());
EXPECT_EQ(baseTimeNs + 7 * bucketSizeNs, data.bucket_info(4).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 8 * bucketSizeNs, data.bucket_info(4).end_bucket_elapsed_nanos());
- EXPECT_TRUE(data.bucket_info(4).has_value());
+ EXPECT_TRUE(data.bucket_info(4).has_value_long());
}
TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm) {
@@ -173,7 +172,7 @@ TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm) {
baseTimeNs, configAddedTimeNs, config, cfgKey);
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- processor->mStatsPullerManager.ForceClearPullerCache();
+ processor->mPullerManager->ForceClearPullerCache();
int startBucketNum = processor->mMetricsManagers.begin()->second->
mAllMetricProducers[0]->getCurrentBucketNum();
@@ -181,12 +180,11 @@ TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm) {
// When creating the config, the gauge metric producer should register the alarm at the
// end of the current bucket.
- EXPECT_EQ((size_t)1, StatsPullerManagerImpl::GetInstance().mReceivers.size());
+ EXPECT_EQ((size_t)1, processor->mPullerManager->mReceivers.size());
EXPECT_EQ(bucketSizeNs,
- StatsPullerManagerImpl::GetInstance().mReceivers.begin()->
- second.front().intervalNs);
- int64_t& expectedPullTimeNs = StatsPullerManagerImpl::GetInstance().mReceivers.begin()->
- second.front().nextPullTimeNs;
+ processor->mPullerManager->mReceivers.begin()->second.front().intervalNs);
+ int64_t& expectedPullTimeNs =
+ processor->mPullerManager->mReceivers.begin()->second.front().nextPullTimeNs;
EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, expectedPullTimeNs);
// Screen off/on/off events.
@@ -250,15 +248,15 @@ TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm) {
EXPECT_EQ(baseTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos());
- EXPECT_TRUE(data.bucket_info(0).has_value());
+ EXPECT_TRUE(data.bucket_info(0).has_value_long());
EXPECT_EQ(baseTimeNs + 8 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 9 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos());
- EXPECT_TRUE(data.bucket_info(1).has_value());
+ EXPECT_TRUE(data.bucket_info(1).has_value_long());
EXPECT_EQ(baseTimeNs + 9 * bucketSizeNs, data.bucket_info(2).start_bucket_elapsed_nanos());
EXPECT_EQ(baseTimeNs + 10 * bucketSizeNs, data.bucket_info(2).end_bucket_elapsed_nanos());
- EXPECT_TRUE(data.bucket_info(2).has_value());
+ EXPECT_TRUE(data.bucket_info(2).has_value_long());
}
#else
diff --git a/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp b/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
index 3a1546641d45..d2fd95c818cf 100644
--- a/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
@@ -54,8 +54,8 @@ TEST(EventMetricProducerTest, TestNoCondition) {
eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1);
eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2);
- // TODO: get the report and check the content after the ProtoOutputStream change is done.
- // eventProducer.onDumpReport();
+ // TODO(b/110561136): get the report and check the content after the ProtoOutputStream change
+ // is done eventProducer.onDumpReport();
}
TEST(EventMetricProducerTest, TestEventsWithNonSlicedCondition) {
diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
index 698ce727e688..19c9f775465b 100644
--- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
@@ -59,10 +59,7 @@ TEST(GaugeMetricProducerTest, TestNoCondition) {
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- // TODO: pending refactor of StatsPullerManager
- // For now we still need this so that it doesn't do real pulling.
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
@@ -89,8 +86,7 @@ TEST(GaugeMetricProducerTest, TestNoCondition) {
EXPECT_EQ(0UL, gaugeProducer.mPastBuckets.size());
allData.clear();
- std::shared_ptr<LogEvent> event2 =
- std::make_shared<LogEvent>(tagId, bucket3StartTimeNs + 10);
+ std::shared_ptr<LogEvent> event2 = std::make_shared<LogEvent>(tagId, bucket3StartTimeNs + 10);
event2->write(24);
event2->write("some value");
event2->write(25);
@@ -140,8 +136,7 @@ TEST(GaugeMetricProducerTest, TestPushedEventsWithUpgrade) {
alert.set_trigger_if_sum_gt(25);
alert.set_num_buckets(100);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
-1 /* -1 means no pulling */, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
@@ -211,8 +206,7 @@ TEST(GaugeMetricProducerTest, TestPulledWithUpgrade) {
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
@@ -280,8 +274,7 @@ TEST(GaugeMetricProducerTest, TestWithCondition) {
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
@@ -296,8 +289,8 @@ TEST(GaugeMetricProducerTest, TestWithCondition) {
return true;
}));
- GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard, tagId,
- bucketStartTimeNs, bucketStartTimeNs, pullerManager);
+ GaugeMetricProducer gaugeProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs,
+ bucketStartTimeNs, pullerManager);
gaugeProducer.setBucketSize(60 * NS_PER_SEC);
gaugeProducer.onConditionChanged(true, bucketStartTimeNs + 8);
@@ -372,8 +365,7 @@ TEST(GaugeMetricProducerTest, TestWithSlicedCondition) {
return ConditionState::kTrue;
}));
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
@@ -421,8 +413,7 @@ TEST(GaugeMetricProducerTest, TestAnomalyDetection) {
sp<AlarmMonitor> alarmMonitor;
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
@@ -472,7 +463,7 @@ TEST(GaugeMetricProducerTest, TestAnomalyDetection) {
.mFields->begin()
->mValue.int_value);
EXPECT_EQ(anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY),
- std::ceil(1.0 * event2->GetElapsedTimestampNs() / NS_PER_SEC) + refPeriodSec);
+ std::ceil(1.0 * event2->GetElapsedTimestampNs() / NS_PER_SEC) + refPeriodSec);
std::shared_ptr<LogEvent> event3 =
std::make_shared<LogEvent>(tagId, bucketStartTimeNs + 2 * bucketSizeNs + 10);
@@ -487,7 +478,7 @@ TEST(GaugeMetricProducerTest, TestAnomalyDetection) {
.mFields->begin()
->mValue.int_value);
EXPECT_EQ(anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY),
- std::ceil(1.0 * event2->GetElapsedTimestampNs() / NS_PER_SEC + refPeriodSec));
+ std::ceil(1.0 * event2->GetElapsedTimestampNs() / NS_PER_SEC + refPeriodSec));
// The event4 does not have the gauge field. Thus the current bucket value is 0.
std::shared_ptr<LogEvent> event4 =
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index e3a8a553acc9..3559a7c2dd60 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -60,10 +60,7 @@ TEST(ValueMetricProducerTest, TestNonDimensionalEvents) {
metric.mutable_value_field()->add_child()->set_field(2);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- // TODO: pending refactor of StatsPullerManager
- // For now we still need this so that it doesn't do real pulling.
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
@@ -83,13 +80,11 @@ TEST(ValueMetricProducerTest, TestNonDimensionalEvents) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- valueProducer.setBucketSize(60 * NS_PER_SEC);
- // startUpdated:true tainted:0 sum:0 start:11
+ // startUpdated:true sum:0 start:11
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
- EXPECT_EQ(11, curInterval.start);
+ EXPECT_EQ(false, curInterval.hasValue);
+ EXPECT_EQ(11, curInterval.start.long_value);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
allData.clear();
@@ -102,13 +97,12 @@ TEST(ValueMetricProducerTest, TestNonDimensionalEvents) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // tartUpdated:false tainted:0 sum:12
+ // tartUpdated:false sum:12
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(0, curInterval.value.long_value);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
allData.clear();
event = make_shared<LogEvent>(tagId, bucket4StartTimeNs + 1);
@@ -119,13 +113,12 @@ TEST(ValueMetricProducerTest, TestNonDimensionalEvents) {
valueProducer.onDataPulled(allData);
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:false tainted:0 sum:12
+ // startUpdated:false sum:12
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(0, curInterval.value.long_value);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(13, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(13, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
}
/*
@@ -140,8 +133,7 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset) {
metric.set_use_absolute_value_on_reset(true);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
@@ -161,12 +153,10 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- valueProducer.setBucketSize(60 * NS_PER_SEC);
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
- EXPECT_EQ(11, curInterval.start);
+ EXPECT_EQ(false, curInterval.hasValue);
+ EXPECT_EQ(11, curInterval.start.long_value);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
allData.clear();
@@ -180,11 +170,10 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset) {
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(10, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(10, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
allData.clear();
event = make_shared<LogEvent>(tagId, bucket4StartTimeNs + 1);
@@ -196,11 +185,10 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset) {
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(26, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(26, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
}
/*
@@ -214,8 +202,7 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeZeroOnReset) {
metric.mutable_value_field()->add_child()->set_field(2);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
@@ -235,12 +222,10 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeZeroOnReset) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- valueProducer.setBucketSize(60 * NS_PER_SEC);
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
- EXPECT_EQ(11, curInterval.start);
+ EXPECT_EQ(false, curInterval.hasValue);
+ EXPECT_EQ(11, curInterval.start.long_value);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
allData.clear();
@@ -254,8 +239,7 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeZeroOnReset) {
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
allData.clear();
@@ -268,11 +252,10 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeZeroOnReset) {
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(26, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(26, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
}
/*
@@ -287,8 +270,7 @@ TEST(ValueMetricProducerTest, TestEventsWithNonSlicedCondition) {
metric.set_condition(StringToId("SCREEN_ON"));
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return());
@@ -322,11 +304,10 @@ TEST(ValueMetricProducerTest, TestEventsWithNonSlicedCondition) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:false tainted:0 sum:0 start:100
- EXPECT_EQ(100, curInterval.start);
+ // startUpdated:false sum:0 start:100
+ EXPECT_EQ(100, curInterval.start.long_value);
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
vector<shared_ptr<LogEvent>> allData;
@@ -341,19 +322,19 @@ TEST(ValueMetricProducerTest, TestEventsWithNonSlicedCondition) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:false tainted:0 sum:0 start:110
- EXPECT_EQ(110, curInterval.start);
+ // startUpdated:false sum:0 start:110
+ EXPECT_EQ(110, curInterval.start.long_value);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(10, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(10, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1);
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:false tainted:0 sum:0 start:110
- EXPECT_EQ(10, curInterval.sum);
+ // startUpdated:false sum:0 start:110
+ EXPECT_EQ(10, curInterval.value.long_value);
EXPECT_EQ(false, curInterval.startUpdated);
}
@@ -365,8 +346,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithUpgrade) {
metric.mutable_value_field()->add_child()->set_field(2);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, -1, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
valueProducer.setBucketSize(60 * NS_PER_SEC);
@@ -408,8 +388,7 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) {
metric.mutable_value_field()->add_child()->set_field(2);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
@@ -441,7 +420,7 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) {
valueProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
EXPECT_EQ(eventUpgradeTimeNs, valueProducer.mCurrentBucketStartTimeNs);
- EXPECT_EQ(20L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mValue);
+ EXPECT_EQ(20L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mValueLong);
allData.clear();
event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 1);
@@ -452,7 +431,7 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) {
valueProducer.onDataPulled(allData);
EXPECT_EQ(2UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
EXPECT_EQ(bucket2StartTimeNs, valueProducer.mCurrentBucketStartTimeNs);
- EXPECT_EQ(30L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mValue);
+ EXPECT_EQ(30L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mValueLong);
}
TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse) {
@@ -464,8 +443,7 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse) {
metric.set_condition(StringToId("SCREEN_ON"));
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, Pull(tagId, _, _))
@@ -502,7 +480,7 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse) {
EXPECT_EQ(bucket2StartTimeNs-50, valueProducer.mCurrentBucketStartTimeNs);
EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
EXPECT_EQ(bucketStartTimeNs, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs);
- EXPECT_EQ(20L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mValue);
+ EXPECT_EQ(20L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mValueLong);
EXPECT_FALSE(valueProducer.mCondition);
}
@@ -514,8 +492,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition) {
metric.mutable_value_field()->add_child()->set_field(2);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, -1, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
@@ -533,19 +510,20 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- EXPECT_EQ(10, curInterval.sum);
+ EXPECT_EQ(10, curInterval.value.long_value);
+ EXPECT_EQ(true, curInterval.hasValue);
valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- EXPECT_EQ(30, curInterval.sum);
+ EXPECT_EQ(30, curInterval.value.long_value);
valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(30, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(30, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
}
TEST(ValueMetricProducerTest, TestPushedEventsWithCondition) {
@@ -556,8 +534,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithCondition) {
metric.mutable_value_field()->add_child()->set_field(2);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, -1, bucketStartTimeNs,
bucketStartTimeNs, pullerManager);
@@ -583,7 +560,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithCondition) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- EXPECT_EQ(20, curInterval.sum);
+ EXPECT_EQ(20, curInterval.value.long_value);
shared_ptr<LogEvent> event3 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 30);
event3->write(1);
@@ -594,7 +571,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithCondition) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- EXPECT_EQ(50, curInterval.sum);
+ EXPECT_EQ(50, curInterval.value.long_value);
valueProducer.onConditionChangedLocked(false, bucketStartTimeNs + 35);
shared_ptr<LogEvent> event4 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 40);
@@ -606,12 +583,12 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithCondition) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- EXPECT_EQ(50, curInterval.sum);
+ EXPECT_EQ(50, curInterval.value.long_value);
valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(50, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(50, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
}
TEST(ValueMetricProducerTest, TestAnomalyDetection) {
@@ -631,8 +608,10 @@ TEST(ValueMetricProducerTest, TestAnomalyDetection) {
metric.mutable_value_field()->add_child()->set_field(2);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, wizard,
- -1 /*not pulled*/, bucketStartTimeNs, bucketStartTimeNs);
+ -1 /*not pulled*/, bucketStartTimeNs, bucketStartTimeNs,
+ pullerManager);
valueProducer.setBucketSize(60 * NS_PER_SEC);
sp<AnomalyTracker> anomalyTracker = valueProducer.addAnomalyTracker(alert, alarmMonitor);
@@ -705,8 +684,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) {
metric.mutable_value_field()->add_child()->set_field(2);
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return());
@@ -728,11 +706,10 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) {
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:true tainted:0 sum:0 start:11
+ // startUpdated:true sum:0 start:11
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
- EXPECT_EQ(11, curInterval.start);
+ EXPECT_EQ(false, curInterval.hasValue);
+ EXPECT_EQ(11, curInterval.start.long_value);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
// pull 2 at correct time
@@ -746,13 +723,12 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // tartUpdated:false tainted:0 sum:12
+ // tartUpdated:false sum:12
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
// pull 3 come late.
// The previous bucket gets closed with error. (Has start value 23, no ending)
@@ -767,14 +743,13 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) {
valueProducer.onDataPulled(allData);
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:false tainted:0 sum:12
+ // startUpdated:false sum:12
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(36, curInterval.start);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(36, curInterval.start.long_value);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
- EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValue);
+ EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
}
/*
@@ -790,8 +765,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition) {
metric.set_condition(StringToId("SCREEN_ON"));
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return());
@@ -827,19 +801,17 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:false tainted:0 sum:0 start:100
- EXPECT_EQ(100, curInterval.start);
+ // startUpdated:false sum:0 start:100
+ EXPECT_EQ(100, curInterval.start.long_value);
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
// pull on bucket boundary come late, condition change happens before it
valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1);
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(false, curInterval.startUpdated);
- EXPECT_EQ(1, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
// Now the alarm is delivered.
@@ -855,8 +827,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition) {
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(false, curInterval.startUpdated);
- EXPECT_EQ(1, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
}
@@ -873,8 +844,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) {
metric.set_condition(StringToId("SCREEN_ON"));
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillRepeatedly(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return());
@@ -921,28 +891,25 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:false tainted:0 sum:0 start:100
- EXPECT_EQ(100, curInterval.start);
+ // startUpdated:false sum:0 start:100
+ EXPECT_EQ(100, curInterval.start.long_value);
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
// pull on bucket boundary come late, condition change happens before it
valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1);
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(false, curInterval.startUpdated);
- EXPECT_EQ(1, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
// condition changed to true again, before the pull alarm is delivered
valueProducer.onConditionChanged(true, bucket2StartTimeNs + 25);
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(130, curInterval.start);
- EXPECT_EQ(1, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(130, curInterval.start.long_value);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
// Now the alarm is delivered, but it is considered late, it has no effect
@@ -957,9 +924,8 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) {
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(130, curInterval.start);
- EXPECT_EQ(1, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(130, curInterval.start.long_value);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
}
@@ -976,8 +942,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3) {
metric.set_condition(StringToId("SCREEN_ON"));
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
- shared_ptr<MockStatsPullerManager> pullerManager =
- make_shared<StrictMock<MockStatsPullerManager>>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return());
EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillRepeatedly(Return());
@@ -1013,11 +978,10 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3) {
// has one slice
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
- // startUpdated:false tainted:0 sum:0 start:100
- EXPECT_EQ(100, curInterval.start);
+ // startUpdated:false sum:0 start:100
+ EXPECT_EQ(100, curInterval.start.long_value);
EXPECT_EQ(true, curInterval.startUpdated);
- EXPECT_EQ(0, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
// pull on bucket boundary come late, condition change happens before it.
@@ -1025,8 +989,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3) {
valueProducer.onConditionChanged(false, bucket2StartTimeNs + 1);
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(false, curInterval.startUpdated);
- EXPECT_EQ(1, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
// Alarm is delivered in time, but the pull is very slow, and pullers are called in order,
@@ -1042,11 +1005,247 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3) {
curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
EXPECT_EQ(false, curInterval.startUpdated);
- EXPECT_EQ(1, curInterval.tainted);
- EXPECT_EQ(0, curInterval.sum);
+ EXPECT_EQ(false, curInterval.hasValue);
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
}
+TEST(ValueMetricProducerTest, TestPushedAggregateMin) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+ metric.set_aggregation_type(ValueMetric::MIN);
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, -1, bucketStartTimeNs,
+ bucketStartTimeNs, pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+
+ shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event1->write(1);
+ event1->write(10);
+ event1->init();
+ shared_ptr<LogEvent> event2 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20);
+ event2->write(1);
+ event2->write(20);
+ event2->init();
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event1);
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(10, curInterval.value.long_value);
+ EXPECT_EQ(true, curInterval.hasValue);
+
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
+
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(10, curInterval.value.long_value);
+
+ valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(10, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
+}
+
+TEST(ValueMetricProducerTest, TestPushedAggregateMax) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+ metric.set_aggregation_type(ValueMetric::MAX);
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, -1, bucketStartTimeNs,
+ bucketStartTimeNs, pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+
+ shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event1->write(1);
+ event1->write(10);
+ event1->init();
+ shared_ptr<LogEvent> event2 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20);
+ event2->write(1);
+ event2->write(20);
+ event2->init();
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event1);
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(10, curInterval.value.long_value);
+ EXPECT_EQ(true, curInterval.hasValue);
+
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
+
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(20, curInterval.value.long_value);
+
+ valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(20, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
+}
+
+TEST(ValueMetricProducerTest, TestPushedAggregateAvg) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+ metric.set_aggregation_type(ValueMetric::AVG);
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, -1, bucketStartTimeNs,
+ bucketStartTimeNs, pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+
+ shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event1->write(1);
+ event1->write(10);
+ event1->init();
+ shared_ptr<LogEvent> event2 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20);
+ event2->write(1);
+ event2->write(15);
+ event2->init();
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event1);
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval;
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(10, curInterval.value.long_value);
+ EXPECT_EQ(true, curInterval.hasValue);
+ EXPECT_EQ(1, curInterval.sampleSize);
+
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
+
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(25, curInterval.value.long_value);
+ EXPECT_EQ(2, curInterval.sampleSize);
+
+ valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(12.5, valueProducer.mPastBuckets.begin()->second.back().mValueDouble);
+}
+
+TEST(ValueMetricProducerTest, TestPushedAggregateSum) {
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(2);
+ metric.set_aggregation_type(ValueMetric::SUM);
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, -1, wizard, -1, bucketStartTimeNs,
+ bucketStartTimeNs, pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+
+ shared_ptr<LogEvent> event1 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
+ event1->write(1);
+ event1->write(10);
+ event1->init();
+ shared_ptr<LogEvent> event2 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20);
+ event2->write(1);
+ event2->write(15);
+ event2->init();
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event1);
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(10, curInterval.value.long_value);
+ EXPECT_EQ(true, curInterval.hasValue);
+
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
+
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(25, curInterval.value.long_value);
+
+ valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(25, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
+}
+
+TEST(ValueMetricProducerTest, TestPushedAggregateSumSliced) {
+ string slicedConditionName = "UID";
+ const int conditionTagId = 2;
+ ValueMetric metric;
+ metric.set_id(metricId);
+ metric.set_bucket(ONE_MINUTE);
+ metric.mutable_value_field()->set_field(tagId);
+ metric.mutable_value_field()->add_child()->set_field(1);
+ metric.set_aggregation_type(ValueMetric::SUM);
+
+ metric.set_condition(StringToId(slicedConditionName));
+ MetricConditionLink* link = metric.add_links();
+ link->set_condition(StringToId(slicedConditionName));
+ buildSimpleAtomFieldMatcher(tagId, 2, link->mutable_fields_in_what());
+ buildSimpleAtomFieldMatcher(conditionTagId, 2, link->mutable_fields_in_condition());
+
+ LogEvent event1(tagId, bucketStartTimeNs + 10);
+ event1.write(10); // value
+ event1.write("111"); // uid
+ event1.init();
+ ConditionKey key1;
+ key1[StringToId(slicedConditionName)] =
+ {getMockedDimensionKey(conditionTagId, 2, "111")};
+
+ LogEvent event2(tagId, bucketStartTimeNs + 20);
+ event2.write(15);
+ event2.write("222");
+ event2.init();
+ ConditionKey key2;
+ key2[StringToId(slicedConditionName)] =
+ {getMockedDimensionKey(conditionTagId, 2, "222")};
+
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+ EXPECT_CALL(*wizard, query(_, key1, _, _, _, _)).WillOnce(Return(ConditionState::kFalse));
+
+ EXPECT_CALL(*wizard, query(_, key2, _, _, _, _)).WillOnce(Return(ConditionState::kTrue));
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+
+ ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, -1, bucketStartTimeNs,
+ bucketStartTimeNs, pullerManager);
+ valueProducer.setBucketSize(60 * NS_PER_SEC);
+
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event1);
+
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(false, curInterval.hasValue);
+
+ valueProducer.onMatchedLogEvent(1 /*log matcher index*/, event2);
+
+ // has one slice
+ EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
+ curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
+ EXPECT_EQ(15, curInterval.value.long_value);
+
+ valueProducer.flushIfNeededLocked(bucket3StartTimeNs);
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
+ EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
+ EXPECT_EQ(15, valueProducer.mPastBuckets.begin()->second.back().mValueLong);
+}
+
} // namespace statsd
} // namespace os
} // namespace android
diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp
index e0c98cb9735b..b8b1a1db2c12 100644
--- a/cmds/statsd/tests/statsd_test_util.cpp
+++ b/cmds/statsd/tests/statsd_test_util.cpp
@@ -452,14 +452,16 @@ std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(
sp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs,
const StatsdConfig& config, const ConfigKey& key) {
sp<UidMap> uidMap = new UidMap();
+ sp<StatsPullerManager> pullerManager = new StatsPullerManager();
sp<AlarmMonitor> anomalyAlarmMonitor =
new AlarmMonitor(1, [](const sp<IStatsCompanionService>&, int64_t){},
[](const sp<IStatsCompanionService>&){});
sp<AlarmMonitor> periodicAlarmMonitor =
new AlarmMonitor(1, [](const sp<IStatsCompanionService>&, int64_t){},
[](const sp<IStatsCompanionService>&){});
- sp<StatsLogProcessor> processor = new StatsLogProcessor(
- uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseNs, [](const ConfigKey&){return true;});
+ sp<StatsLogProcessor> processor =
+ new StatsLogProcessor(uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
+ timeBaseNs, [](const ConfigKey&) { return true; });
processor->OnConfigUpdated(currentTimeNs, key, config);
return processor;
}
diff --git a/cmds/uiautomator/library/Android.bp b/cmds/uiautomator/library/Android.bp
new file mode 100644
index 000000000000..77f17c5cfb65
--- /dev/null
+++ b/cmds/uiautomator/library/Android.bp
@@ -0,0 +1,59 @@
+// Copyright (C) 2012 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.
+
+droiddoc {
+ name: "uiautomator-stubs-docs",
+ srcs: [
+ "core-src/**/*.java",
+ "testrunner-src/**/*.java",
+ ],
+ libs: [
+ "android.test.runner",
+ "junit",
+ "android.test.base",
+ ],
+ custom_template: "droiddoc-templates-sdk",
+ installable: false,
+ args: "-stubpackages com.android.uiautomator.core:" +
+ "com.android.uiautomator.testrunner",
+ api_tag_name: "UIAUTOMATOR",
+ api_filename: "uiautomator_api.txt",
+ removed_api_filename: "uiautomator_removed_api.txt",
+}
+
+java_library_static {
+ name: "android_uiautomator",
+ srcs: [
+ ":uiautomator-stubs-docs",
+ ],
+ libs: [
+ "android.test.runner",
+ "junit",
+ ],
+}
+
+java_library_static {
+ name: "uiautomator.core",
+ srcs: [
+ "core-src/**/*.java",
+ "testrunner-src/**/*.java",
+ ],
+ libs: [
+ "android.test.runner",
+ "android.test.base",
+ ],
+ static_libs: [
+ "junit",
+ ]
+}
diff --git a/cmds/uiautomator/library/Android.mk b/cmds/uiautomator/library/Android.mk
index 62a2865d0bcc..5ca201c9781a 100644
--- a/cmds/uiautomator/library/Android.mk
+++ b/cmds/uiautomator/library/Android.mk
@@ -16,58 +16,6 @@
LOCAL_PATH:= $(call my-dir)
-uiautomator.core_src_files := $(call all-java-files-under, core-src) \
- $(call all-java-files-under, testrunner-src)
-uiautomator.core_java_libraries := android.test.runner junit
-
-uiautomator_internal_api_file := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/uiautomator_api.txt
-uiautomator_internal_removed_api_file := \
- $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/uiautomator_removed_api.txt
-
-###############################################
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(uiautomator.core_src_files)
-LOCAL_MODULE := uiautomator.core
-LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base
-LOCAL_STATIC_JAVA_LIBRARIES := junit
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-###############################################
-# Generate the stub source files
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(uiautomator.core_src_files)
-LOCAL_JAVA_LIBRARIES := $(uiautomator.core_java_libraries) android.test.base
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/core-src \
- $(LOCAL_PATH)/testrunner-src
-LOCAL_DROIDDOC_HTML_DIR :=
-
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_uiautomator_intermediates/src
-
-LOCAL_DROIDDOC_OPTIONS:= \
- -stubpackages com.android.uiautomator.core:com.android.uiautomator.testrunner \
- -api $(uiautomator_internal_api_file) \
- -removedApi $(uiautomator_internal_removed_api_file)
-
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR := external/doclava/res/assets/templates-sdk
-LOCAL_UNINSTALLABLE_MODULE := true
-
-LOCAL_MODULE := uiautomator-stubs
-
-include $(BUILD_DROIDDOC)
-uiautomator_stubs_stamp := $(full_target)
-$(uiautomator_internal_api_file) : $(full_target)
-
-###############################################
-# Build the stub source files into a jar.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android_uiautomator
-LOCAL_JAVA_LIBRARIES := $(uiautomator.core_java_libraries)
-LOCAL_SOURCE_FILES_ALL_GENERATED := true
-# Make sure to run droiddoc first to generate the stub source files.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(uiautomator_stubs_stamp)
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
###############################################
# API check
# Please refer to build/core/tasks/apicheck.mk.
@@ -86,13 +34,13 @@ checkapi_last_error_level_flags := \
$(eval $(call check-api, \
uiautomator-checkapi-last, \
$(uiautomator_api_dir)/$(last_released_sdk_version).txt, \
- $(uiautomator_internal_api_file), \
+ $(INTERNAL_PLATFORM_UIAUTOMATOR_API_FILE), \
$(uiautomator_api_dir)/removed.txt, \
- $(uiautomator_internal_removed_api_file), \
+ $(INTERNAL_PLATFORM_UIAUTOMATOR_REMOVED_API_FILE), \
$(checkapi_last_error_level_flags), \
cat $(LOCAL_PATH)/apicheck_msg_last.txt, \
uiautomator.core, \
- $(uiautomator_stubs_stamp)))
+ $(OUT_DOCS)/uiautomator-stubs-docs-stubs.srcjar))
checkapi_current_error_level_flags := \
-error 2 -error 3 -error 4 -error 5 -error 6 \
@@ -105,28 +53,24 @@ checkapi_current_error_level_flags := \
$(eval $(call check-api, \
uiautomator-checkapi-current, \
$(uiautomator_api_dir)/current.txt, \
- $(uiautomator_internal_api_file), \
+ $(INTERNAL_PLATFORM_UIAUTOMATOR_API_FILE), \
$(uiautomator_api_dir)/removed.txt, \
- $(uiautomator_internal_removed_api_file), \
+ $(INTERNAL_PLATFORM_UIAUTOMATOR_REMOVED_API_FILE), \
$(checkapi_current_error_level_flags), \
cat $(LOCAL_PATH)/apicheck_msg_current.txt, \
uiautomator.core, \
- $(uiautomator_stubs_stamp)))
+ $(OUT_DOCS)/uiautomator-stubs-docs-stubs.srcjar))
.PHONY: update-uiautomator-api
update-uiautomator-api: PRIVATE_API_DIR := $(uiautomator_api_dir)
-update-uiautomator-api: PRIVATE_REMOVED_API_FILE := $(uiautomator_internal_removed_api_file)
-update-uiautomator-api: $(uiautomator_internal_api_file)
+update-uiautomator-api: PRIVATE_REMOVED_API_FILE := $(INTERNAL_PLATFORM_UIAUTOMATOR_REMOVED_API_FILE)
+update-uiautomator-api: $(INTERNAL_PLATFORM_UIAUTOMATOR_API_FILE)
@echo Copying uiautomator current.txt
$(hide) cp $< $(PRIVATE_API_DIR)/current.txt
@echo Copying uiautomator removed.txt
$(hide) cp $(PRIVATE_REMOVED_API_FILE) $(PRIVATE_API_DIR)/removed.txt
###############################################
# clean up temp vars
-uiautomator.core_src_files :=
-uiautomator.core_java_libraries :=
-uiautomator_stubs_stamp :=
-uiautomator_internal_api_file :=
uiautomator_api_dir :=
checkapi_last_error_level_flags :=
checkapi_current_error_level_flags :=
diff --git a/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java b/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java
index 653851546d01..950a258d123d 100644
--- a/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java
+++ b/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/ShellUiAutomatorBridge.java
@@ -62,7 +62,7 @@ public class ShellUiAutomatorBridge extends UiAutomatorBridge {
IBinder token = new Binder();
try {
ContentProviderHolder holder = activityManager.getContentProviderExternal(
- providerName, UserHandle.USER_SYSTEM, token);
+ providerName, UserHandle.USER_SYSTEM, token, "*uiautomator*");
if (holder == null) {
throw new IllegalStateException("Could not find provider: " + providerName);
}
diff --git a/config/generate-preloaded-classes.sh b/config/generate-preloaded-classes.sh
index e36e148c7476..0ad3a0263d95 100755
--- a/config/generate-preloaded-classes.sh
+++ b/config/generate-preloaded-classes.sh
@@ -36,4 +36,4 @@ shift 2
extra_classes_files=("$@")
# Disable locale to enable lexicographical sorting
-LC_ALL=C sort "$input" "${extra_classes_files[@]}" | uniq | grep -f "$blacklist" -v -F -x
+LC_ALL=C sort "$input" "${extra_classes_files[@]}" | uniq | grep -f "$blacklist" -v -F -x | grep -v "\$NoPreloadHolder"
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index b907bb4fb72c..d81e2dc1f7fc 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -163,7 +163,6 @@ Landroid/app/ActivityManager;->PROCESS_STATE_IMPORTANT_BACKGROUND:I
Landroid/app/ActivityManager;->PROCESS_STATE_RECEIVER:I
Landroid/app/ActivityManager;->PROCESS_STATE_SERVICE:I
Landroid/app/ActivityManager;->PROCESS_STATE_TOP:I
-Landroid/app/ActivityManager;->setPersistentVrThread(I)V
Landroid/app/ActivityManager;->staticGetMemoryClass()I
Landroid/app/ActivityManager;->switchUser(I)Z
Landroid/app/ActivityManagerNative;-><init>()V
@@ -357,28 +356,15 @@ Landroid/app/ApplicationPackageManager;->getPackageCurrentVolume(Landroid/conten
Landroid/app/ApplicationPackageManager;->getPackageSizeInfoAsUser(Ljava/lang/String;ILandroid/content/pm/IPackageStatsObserver;)V
Landroid/app/ApplicationPackageManager;->mPM:Landroid/content/pm/IPackageManager;
Landroid/app/ApplicationPackageManager;->shouldShowRequestPermissionRationale(Ljava/lang/String;)Z
-Landroid/app/AppOpsManager$OpEntry;->getDuration()I
-Landroid/app/AppOpsManager$OpEntry;->getLastAccessBackgroundTime()J
-Landroid/app/AppOpsManager$OpEntry;->getLastAccessForegroundTime()J
-Landroid/app/AppOpsManager$OpEntry;->getLastAccessTime()J
-Landroid/app/AppOpsManager$OpEntry;->getLastRejectBackgroundTime()J
-Landroid/app/AppOpsManager$OpEntry;->getLastRejectForegroundTime()J
-Landroid/app/AppOpsManager$OpEntry;->getLastRejectTime()J
-Landroid/app/AppOpsManager$OpEntry;->getMode()I
-Landroid/app/AppOpsManager$OpEntry;->getRejectTime()J
Landroid/app/AppOpsManager$PackageOps;-><init>(Ljava/lang/String;ILjava/util/List;)V
-Landroid/app/AppOpsManager$PackageOps;->CREATOR:Landroid/os/Parcelable$Creator;
Landroid/app/AppOpsManager;->checkOp(IILjava/lang/String;)I
Landroid/app/AppOpsManager;->checkOpNoThrow(IILjava/lang/String;)I
-Landroid/app/AppOpsManager;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List;
-Landroid/app/AppOpsManager;->MODE_FOREGROUND:I
Landroid/app/AppOpsManager;->mService:Lcom/android/internal/app/IAppOpsService;
Landroid/app/AppOpsManager;->noteOp(I)I
Landroid/app/AppOpsManager;->noteOp(IILjava/lang/String;)I
Landroid/app/AppOpsManager;->noteOpNoThrow(IILjava/lang/String;)I
Landroid/app/AppOpsManager;->noteProxyOp(ILjava/lang/String;)I
Landroid/app/AppOpsManager;->opToName(I)Ljava/lang/String;
-Landroid/app/AppOpsManager;->opToPermission(I)Ljava/lang/String;
Landroid/app/AppOpsManager;->opToSwitch(I)I
Landroid/app/AppOpsManager;->OP_ACCEPT_HANDOVER:I
Landroid/app/AppOpsManager;->OP_ACCESS_NOTIFICATIONS:I
@@ -457,14 +443,9 @@ Landroid/app/AppOpsManager;->OP_WRITE_ICC_SMS:I
Landroid/app/AppOpsManager;->OP_WRITE_SETTINGS:I
Landroid/app/AppOpsManager;->OP_WRITE_SMS:I
Landroid/app/AppOpsManager;->OP_WRITE_WALLPAPER:I
-Landroid/app/AppOpsManager;->permissionToOpCode(Ljava/lang/String;)I
Landroid/app/AppOpsManager;->resetAllModes()V
Landroid/app/AppOpsManager;->setRestriction(III[Ljava/lang/String;)V
Landroid/app/AppOpsManager;->sOpPerms:[Ljava/lang/String;
-Landroid/app/AppOpsManager;->startWatchingMode(Ljava/lang/String;Ljava/lang/String;ILandroid/app/AppOpsManager$OnOpChangedListener;)V
-Landroid/app/AppOpsManager;->strOpToOp(Ljava/lang/String;)I
-Landroid/app/AppOpsManager;->unsafeCheckOpRaw(Ljava/lang/String;ILjava/lang/String;)I
-Landroid/app/AppOpsManager;->WATCH_FOREGROUND_CHANGES:I
Landroid/app/AppOpsManager;->_NUM_OP:I
Landroid/app/assist/AssistContent;-><init>(Landroid/os/Parcel;)V
Landroid/app/assist/AssistContent;->mClipData:Landroid/content/ClipData;
@@ -876,9 +857,6 @@ Landroid/app/PendingIntent;->setOnMarshaledListener(Landroid/app/PendingIntent$O
Landroid/app/PictureInPictureArgs;-><init>()V
Landroid/app/PictureInPictureArgs;->setActions(Ljava/util/List;)V
Landroid/app/PictureInPictureArgs;->setAspectRatio(F)V
-Landroid/app/PictureInPictureParams;->getActions()Ljava/util/List;
-Landroid/app/PictureInPictureParams;->getAspectRatio()F
-Landroid/app/PictureInPictureParams;->getSourceRectHint()Landroid/graphics/Rect;
Landroid/app/Presentation;->createPresentationContext(Landroid/content/Context;Landroid/view/Display;I)Landroid/content/Context;
Landroid/app/ProgressDialog;->mMessageView:Landroid/widget/TextView;
Landroid/app/ProgressDialog;->mProgress:Landroid/widget/ProgressBar;
@@ -1004,15 +982,7 @@ Landroid/app/usage/UsageStatsManager;->mContext:Landroid/content/Context;
Landroid/app/usage/UsageStatsManager;->mService:Landroid/app/usage/IUsageStatsManager;
Landroid/app/usage/UsageStatsManager;->sEmptyResults:Landroid/app/usage/UsageEvents;
Landroid/app/UserSwitchObserver;-><init>()V
-Landroid/app/Vr2dDisplayProperties$Builder;-><init>()V
-Landroid/app/Vr2dDisplayProperties$Builder;->build()Landroid/app/Vr2dDisplayProperties;
-Landroid/app/Vr2dDisplayProperties$Builder;->setEnabled(Z)Landroid/app/Vr2dDisplayProperties$Builder;
-Landroid/app/Vr2dDisplayProperties;-><init>(III)V
-Landroid/app/VrManager;->getPersistentVrModeEnabled()Z
Landroid/app/VrManager;->mService:Landroid/service/vr/IVrManager;
-Landroid/app/VrManager;->registerVrStateCallback(Landroid/app/VrStateCallback;Landroid/os/Handler;)V
-Landroid/app/VrManager;->setVr2dDisplayProperties(Landroid/app/Vr2dDisplayProperties;)V
-Landroid/app/VrManager;->unregisterVrStateCallback(Landroid/app/VrStateCallback;)V
Landroid/app/WallpaperColors;->getColorHints()I
Landroid/app/WallpaperManager;->addOnColorsChangedListener(Landroid/app/WallpaperManager$OnColorsChangedListener;Landroid/os/Handler;I)V
Landroid/app/WallpaperManager;->getBitmap()Landroid/graphics/Bitmap;
@@ -1368,7 +1338,6 @@ Landroid/content/Context;->STATUS_BAR_SERVICE:Ljava/lang/String;
Landroid/content/ContextWrapper;->createApplicationContext(Landroid/content/pm/ApplicationInfo;I)Landroid/content/Context;
Landroid/content/ContextWrapper;->getBasePackageName()Ljava/lang/String;
Landroid/content/ContextWrapper;->getDisplay()Landroid/view/Display;
-Landroid/content/ContextWrapper;->getOpPackageName()Ljava/lang/String;
Landroid/content/ContextWrapper;->mBase:Landroid/content/Context;
Landroid/content/ContextWrapper;->registerReceiverAsUser(Landroid/content/BroadcastReceiver;Landroid/os/UserHandle;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
Landroid/content/ContextWrapper;->startActivityAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
@@ -1475,8 +1444,6 @@ Landroid/content/pm/ApplicationInfo;->isForwardLocked()Z
Landroid/content/pm/ApplicationInfo;->isPackageUnavailable(Landroid/content/pm/PackageManager;)Z
Landroid/content/pm/ApplicationInfo;->nativeLibraryRootDir:Ljava/lang/String;
Landroid/content/pm/ApplicationInfo;->primaryCpuAbi:Ljava/lang/String;
-Landroid/content/pm/ApplicationInfo;->privateFlags:I
-Landroid/content/pm/ApplicationInfo;->PRIVATE_FLAG_PRIVILEGED:I
Landroid/content/pm/ApplicationInfo;->resourceDirs:[Ljava/lang/String;
Landroid/content/pm/ApplicationInfo;->scanPublicSourceDir:Ljava/lang/String;
Landroid/content/pm/ApplicationInfo;->scanSourceDir:Ljava/lang/String;
@@ -2048,9 +2015,6 @@ Landroid/database/sqlite/SQLiteDatabase;->mThreadSession:Ljava/lang/ThreadLocal;
Landroid/database/sqlite/SQLiteDatabase;->openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Landroid/database/sqlite/SQLiteDatabase;
Landroid/database/sqlite/SQLiteDatabase;->reopenReadWrite()V
Landroid/database/sqlite/SQLiteDatabaseConfiguration;->maxSqlCacheSize:I
-Landroid/database/sqlite/SQLiteDebug$PagerStats;->largestMemAlloc:I
-Landroid/database/sqlite/SQLiteDebug$PagerStats;->memoryUsed:I
-Landroid/database/sqlite/SQLiteDebug$PagerStats;->pageCacheOverflow:I
Landroid/database/sqlite/SQLiteOpenHelper;->mName:Ljava/lang/String;
Landroid/database/sqlite/SQLiteProgram;->mBindArgs:[Ljava/lang/Object;
Landroid/database/sqlite/SQLiteProgram;->mSql:Ljava/lang/String;
@@ -2134,12 +2098,11 @@ Landroid/filterfw/GraphEnvironment;->loadGraph(Landroid/content/Context;I)I
Landroid/graphics/BaseCanvas;->mNativeCanvasWrapper:J
Landroid/graphics/Bitmap$Config;->nativeInt:I
Landroid/graphics/Bitmap$Config;->nativeToConfig(I)Landroid/graphics/Bitmap$Config;
-Landroid/graphics/Bitmap;-><init>(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V
+Landroid/graphics/Bitmap;-><init>(JIIIZ[BLandroid/graphics/NinePatch$InsetStruct;)V
Landroid/graphics/Bitmap;->createAshmemBitmap()Landroid/graphics/Bitmap;
Landroid/graphics/Bitmap;->createAshmemBitmap(Landroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
Landroid/graphics/Bitmap;->getDefaultDensity()I
Landroid/graphics/Bitmap;->mHeight:I
-Landroid/graphics/Bitmap;->mIsMutable:Z
Landroid/graphics/Bitmap;->mNativePtr:J
Landroid/graphics/Bitmap;->mNinePatchChunk:[B
Landroid/graphics/Bitmap;->mNinePatchInsets:Landroid/graphics/NinePatch$InsetStruct;
@@ -2180,11 +2143,9 @@ Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mT
Landroid/graphics/drawable/AnimatedStateListDrawable;->mState:Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;
Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->callOnFinished(Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;I)V
Landroid/graphics/drawable/AnimatedVectorDrawable;->forceAnimationOnUI()V
-Landroid/graphics/drawable/AnimatedVectorDrawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/AnimatedVectorDrawable;->mAnimatedVectorState:Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;
Landroid/graphics/drawable/AnimatedVectorDrawable;->mAnimatorSet:Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimator;
Landroid/graphics/drawable/AnimationDrawable;->mCurFrame:I
-Landroid/graphics/drawable/BitmapDrawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/BitmapDrawable;->getTint()Landroid/content/res/ColorStateList;
Landroid/graphics/drawable/BitmapDrawable;->getTintMode()Landroid/graphics/PorterDuff$Mode;
Landroid/graphics/drawable/BitmapDrawable;->mBitmapState:Landroid/graphics/drawable/BitmapDrawable$BitmapState;
@@ -2193,7 +2154,6 @@ Landroid/graphics/drawable/BitmapDrawable;->setBitmap(Landroid/graphics/Bitmap;)
Landroid/graphics/drawable/ClipDrawable;->mState:Landroid/graphics/drawable/ClipDrawable$ClipState;
Landroid/graphics/drawable/ColorDrawable$ColorState;->mUseColor:I
Landroid/graphics/drawable/ColorDrawable;->mPaint:Landroid/graphics/Paint;
-Landroid/graphics/drawable/Drawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/Drawable;->inflateWithAttributes(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/TypedArray;I)V
Landroid/graphics/drawable/Drawable;->mCallback:Ljava/lang/ref/WeakReference;
Landroid/graphics/drawable/Drawable;->mSrcDensityOverride:I
@@ -2202,11 +2162,9 @@ Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;-><init>(Lan
Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mConstantPadding:Landroid/graphics/Rect;
Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mDrawables:[Landroid/graphics/drawable/Drawable;
Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mHasColorFilter:Z
-Landroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/DrawableContainer;->mDrawableContainerState:Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
Landroid/graphics/drawable/DrawableContainer;->mLastDrawable:Landroid/graphics/drawable/Drawable;
Landroid/graphics/drawable/DrawableInflater;->mClassLoader:Ljava/lang/ClassLoader;
-Landroid/graphics/drawable/DrawableWrapper;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/DrawableWrapper;->mState:Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState;
Landroid/graphics/drawable/GradientDrawable$GradientState;->mAngle:I
Landroid/graphics/drawable/GradientDrawable$GradientState;->mGradient:I
@@ -2227,7 +2185,6 @@ Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeWidth:I
Landroid/graphics/drawable/GradientDrawable$GradientState;->mThickness:I
Landroid/graphics/drawable/GradientDrawable$GradientState;->mThicknessRatio:F
Landroid/graphics/drawable/GradientDrawable$GradientState;->mWidth:I
-Landroid/graphics/drawable/GradientDrawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/GradientDrawable;->mFillPaint:Landroid/graphics/Paint;
Landroid/graphics/drawable/GradientDrawable;->mGradientState:Landroid/graphics/drawable/GradientDrawable$GradientState;
Landroid/graphics/drawable/GradientDrawable;->mPadding:Landroid/graphics/Rect;
@@ -2241,7 +2198,6 @@ Landroid/graphics/drawable/Icon;->getResources()Landroid/content/res/Resources;
Landroid/graphics/drawable/Icon;->hasTint()Z
Landroid/graphics/drawable/Icon;->mString1:Ljava/lang/String;
Landroid/graphics/drawable/Icon;->mType:I
-Landroid/graphics/drawable/InsetDrawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/InsetDrawable;->mState:Landroid/graphics/drawable/InsetDrawable$InsetState;
Landroid/graphics/drawable/LayerDrawable$ChildDrawable;->mDrawable:Landroid/graphics/drawable/Drawable;
Landroid/graphics/drawable/LayerDrawable$LayerState;->mChildren:[Landroid/graphics/drawable/LayerDrawable$ChildDrawable;
@@ -2249,7 +2205,6 @@ Landroid/graphics/drawable/LayerDrawable;->addLayer(Landroid/graphics/drawable/L
Landroid/graphics/drawable/LayerDrawable;->ensurePadding()V
Landroid/graphics/drawable/LayerDrawable;->mLayerState:Landroid/graphics/drawable/LayerDrawable$LayerState;
Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;->mNinePatch:Landroid/graphics/NinePatch;
-Landroid/graphics/drawable/NinePatchDrawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/NinePatchDrawable;->mNinePatchState:Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;
Landroid/graphics/drawable/RippleDrawable$RippleState;->mColor:Landroid/content/res/ColorStateList;
Landroid/graphics/drawable/RippleDrawable;->getRipplePaint()Landroid/graphics/Paint;
@@ -2260,10 +2215,6 @@ Landroid/graphics/drawable/RotateDrawable;->mState:Landroid/graphics/drawable/Ro
Landroid/graphics/drawable/ScaleDrawable;->mState:Landroid/graphics/drawable/ScaleDrawable$ScaleState;
Landroid/graphics/drawable/StateListDrawable$StateListState;->addStateSet([ILandroid/graphics/drawable/Drawable;)I
Landroid/graphics/drawable/StateListDrawable;->extractStateSet(Landroid/util/AttributeSet;)[I
-Landroid/graphics/drawable/StateListDrawable;->getStateCount()I
-Landroid/graphics/drawable/StateListDrawable;->getStateDrawable(I)Landroid/graphics/drawable/Drawable;
-Landroid/graphics/drawable/StateListDrawable;->getStateDrawableIndex([I)I
-Landroid/graphics/drawable/StateListDrawable;->getStateSet(I)[I
Landroid/graphics/drawable/StateListDrawable;->mStateListState:Landroid/graphics/drawable/StateListDrawable$StateListState;
Landroid/graphics/drawable/StateListDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
Landroid/graphics/drawable/TransitionDrawable;->mAlpha:I
@@ -2274,7 +2225,6 @@ Landroid/graphics/drawable/VectorDrawable$VGroup;->setPivotY(F)V
Landroid/graphics/drawable/VectorDrawable$VGroup;->setRotation(F)V
Landroid/graphics/drawable/VectorDrawable$VGroup;->setTranslateX(F)V
Landroid/graphics/drawable/VectorDrawable$VGroup;->setTranslateY(F)V
-Landroid/graphics/drawable/VectorDrawable;->getOpticalInsets()Landroid/graphics/Insets;
Landroid/graphics/drawable/VectorDrawable;->getTargetByName(Ljava/lang/String;)Ljava/lang/Object;
Landroid/graphics/drawable/VectorDrawable;->mTintFilter:Landroid/graphics/PorterDuffColorFilter;
Landroid/graphics/drawable/VectorDrawable;->setAllowCaching(Z)V
@@ -2294,13 +2244,6 @@ Landroid/graphics/GraphicBuffer;->CREATOR:Landroid/os/Parcelable$Creator;
Landroid/graphics/GraphicBuffer;->mNativeObject:J
Landroid/graphics/ImageDecoder;->postProcessAndRelease(Landroid/graphics/Canvas;)I
Landroid/graphics/ImageFormat;->Y8:I
-Landroid/graphics/Insets;->bottom:I
-Landroid/graphics/Insets;->left:I
-Landroid/graphics/Insets;->NONE:Landroid/graphics/Insets;
-Landroid/graphics/Insets;->of(IIII)Landroid/graphics/Insets;
-Landroid/graphics/Insets;->of(Landroid/graphics/Rect;)Landroid/graphics/Insets;
-Landroid/graphics/Insets;->right:I
-Landroid/graphics/Insets;->top:I
Landroid/graphics/LightingColorFilter;->setColorAdd(I)V
Landroid/graphics/LightingColorFilter;->setColorMultiply(I)V
Landroid/graphics/LinearGradient;->mColor0:I
@@ -2335,8 +2278,6 @@ Landroid/graphics/Picture;->mNativePicture:J
Landroid/graphics/PorterDuff$Mode;->nativeInt:I
Landroid/graphics/PorterDuffColorFilter;->getColor()I
Landroid/graphics/PorterDuffColorFilter;->getMode()Landroid/graphics/PorterDuff$Mode;
-Landroid/graphics/PorterDuffColorFilter;->setColor(I)V
-Landroid/graphics/PorterDuffColorFilter;->setMode(Landroid/graphics/PorterDuff$Mode;)V
Landroid/graphics/RadialGradient;->mCenterColor:I
Landroid/graphics/RadialGradient;->mColors:[I
Landroid/graphics/RadialGradient;->mEdgeColor:I
@@ -2547,8 +2488,6 @@ Landroid/hardware/display/WifiDisplayStatus;->getScanState()I
Landroid/hardware/display/WifiDisplayStatus;->mActiveDisplay:Landroid/hardware/display/WifiDisplay;
Landroid/hardware/display/WifiDisplayStatus;->mDisplays:[Landroid/hardware/display/WifiDisplay;
Landroid/hardware/display/WifiDisplayStatus;->SCAN_STATE_NOT_SCANNING:I
-Landroid/hardware/fingerprint/Fingerprint;->getFingerId()I
-Landroid/hardware/fingerprint/Fingerprint;->getName()Ljava/lang/CharSequence;
Landroid/hardware/fingerprint/FingerprintManager$AuthenticationResult;->getFingerprint()Landroid/hardware/fingerprint/Fingerprint;
Landroid/hardware/fingerprint/FingerprintManager;->getAuthenticatorId()J
Landroid/hardware/fingerprint/FingerprintManager;->getEnrolledFingerprints()Ljava/util/List;
@@ -3181,7 +3120,6 @@ Landroid/media/soundtrigger/SoundTriggerDetector$EventPayload;->getCaptureSessio
Landroid/media/soundtrigger/SoundTriggerDetector$EventPayload;->getData()[B
Landroid/media/soundtrigger/SoundTriggerManager;->isRecognitionActive(Ljava/util/UUID;)Z
Landroid/media/soundtrigger/SoundTriggerManager;->loadSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;)I
-Landroid/media/soundtrigger/SoundTriggerManager;->startRecognition(Ljava/util/UUID;Landroid/app/PendingIntent;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
Landroid/media/soundtrigger/SoundTriggerManager;->startRecognition(Ljava/util/UUID;Landroid/os/Bundle;Landroid/content/ComponentName;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
Landroid/media/soundtrigger/SoundTriggerManager;->stopRecognition(Ljava/util/UUID;)I
Landroid/media/soundtrigger/SoundTriggerManager;->unloadSoundModel(Ljava/util/UUID;)I
@@ -3985,7 +3923,6 @@ Landroid/os/Environment;->buildExternalStorageAppObbDirs(Ljava/lang/String;)[Lja
Landroid/os/Environment;->getDataSystemDirectory()Ljava/io/File;
Landroid/os/Environment;->getLegacyExternalStorageObbDirectory()Ljava/io/File;
Landroid/os/Environment;->getOemDirectory()Ljava/io/File;
-Landroid/os/Environment;->getStorageDirectory()Ljava/io/File;
Landroid/os/Environment;->getVendorDirectory()Ljava/io/File;
Landroid/os/Environment;->initForCurrentUser()V
Landroid/os/Environment;->maybeTranslateEmulatedPathToInternal(Ljava/io/File;)Ljava/io/File;
@@ -4009,22 +3946,9 @@ Landroid/os/FileUtils;->sync(Ljava/io/FileOutputStream;)Z
Landroid/os/Handler;-><init>(Z)V
Landroid/os/Handler;->getIMessenger()Landroid/os/IMessenger;
Landroid/os/Handler;->getPostMessage(Ljava/lang/Runnable;Ljava/lang/Object;)Landroid/os/Message;
-Landroid/os/Handler;->hasCallbacks(Ljava/lang/Runnable;)Z
Landroid/os/Handler;->mCallback:Landroid/os/Handler$Callback;
Landroid/os/Handler;->mLooper:Landroid/os/Looper;
Landroid/os/Handler;->mMessenger:Landroid/os/IMessenger;
-Landroid/os/health/HealthKeys$Constants;-><init>(Ljava/lang/Class;)V
-Landroid/os/health/HealthStats;-><init>(Landroid/os/Parcel;)V
-Landroid/os/health/HealthStatsParceler;-><init>(Landroid/os/health/HealthStatsWriter;)V
-Landroid/os/health/HealthStatsParceler;-><init>(Landroid/os/Parcel;)V
-Landroid/os/health/HealthStatsParceler;->getHealthStats()Landroid/os/health/HealthStats;
-Landroid/os/health/HealthStatsWriter;-><init>(Landroid/os/health/HealthKeys$Constants;)V
-Landroid/os/health/HealthStatsWriter;->addMeasurement(IJ)V
-Landroid/os/health/HealthStatsWriter;->addMeasurements(ILjava/lang/String;J)V
-Landroid/os/health/HealthStatsWriter;->addStats(ILjava/lang/String;Landroid/os/health/HealthStatsWriter;)V
-Landroid/os/health/HealthStatsWriter;->addTimer(IIJ)V
-Landroid/os/health/HealthStatsWriter;->addTimers(ILjava/lang/String;Landroid/os/health/TimerStat;)V
-Landroid/os/health/HealthStatsWriter;->flattenToParcel(Landroid/os/Parcel;)V
Landroid/os/health/SystemHealthManager;-><init>()V
Landroid/os/health/SystemHealthManager;->from(Landroid/content/Context;)Landroid/os/health/SystemHealthManager;
Landroid/os/HwParcel;-><init>(Z)V
@@ -4100,8 +4024,6 @@ Landroid/os/MessageQueue;->mPtr:J
Landroid/os/MessageQueue;->mQuitAllowed:Z
Landroid/os/MessageQueue;->nativePollOnce(JI)V
Landroid/os/MessageQueue;->next()Landroid/os/Message;
-Landroid/os/MessageQueue;->postSyncBarrier()I
-Landroid/os/MessageQueue;->removeSyncBarrier(I)V
Landroid/os/Parcel$ReadWriteHelper;-><init>()V
Landroid/os/Parcel;->getGlobalAllocCount()J
Landroid/os/Parcel;->getGlobalAllocSize()J
@@ -4113,13 +4035,11 @@ Landroid/os/Parcel;->readCharSequence()Ljava/lang/CharSequence;
Landroid/os/Parcel;->readCreator(Landroid/os/Parcelable$Creator;Ljava/lang/ClassLoader;)Landroid/os/Parcelable;
Landroid/os/Parcel;->readExceptionCode()I
Landroid/os/Parcel;->readParcelableCreator(Ljava/lang/ClassLoader;)Landroid/os/Parcelable$Creator;
-Landroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List;
Landroid/os/Parcel;->readRawFileDescriptor()Ljava/io/FileDescriptor;
Landroid/os/Parcel;->writeArrayMap(Landroid/util/ArrayMap;)V
Landroid/os/Parcel;->writeArraySet(Landroid/util/ArraySet;)V
Landroid/os/Parcel;->writeCharSequence(Ljava/lang/CharSequence;)V
Landroid/os/Parcel;->writeParcelableCreator(Landroid/os/Parcelable;)V
-Landroid/os/Parcel;->writeParcelableList(Ljava/util/List;I)V
Landroid/os/ParcelableParcel;-><init>(Ljava/lang/ClassLoader;)V
Landroid/os/ParcelableParcel;->CREATOR:Landroid/os/Parcelable$ClassLoaderCreator;
Landroid/os/ParcelableParcel;->getClassLoader()Ljava/lang/ClassLoader;
@@ -4209,7 +4129,7 @@ Landroid/os/ServiceManager;->checkService(Ljava/lang/String;)Landroid/os/IBinder
Landroid/os/ServiceManager;->getIServiceManager()Landroid/os/IServiceManager;
Landroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;
Landroid/os/ServiceManager;->listServices()[Ljava/lang/String;
-Landroid/os/ServiceManager;->sCache:Ljava/util/HashMap;
+Landroid/os/ServiceManager;->sCache:Ljava/util/Map;
Landroid/os/ServiceManager;->sServiceManager:Landroid/os/IServiceManager;
Landroid/os/ServiceManagerNative;->asInterface(Landroid/os/IBinder;)Landroid/os/IServiceManager;
Landroid/os/ServiceSpecificException;-><init>(ILjava/lang/String;)V
@@ -4267,7 +4187,6 @@ Landroid/os/storage/StorageVolume;->allowMassStorage()Z
Landroid/os/storage/StorageVolume;->getFatVolumeId()I
Landroid/os/storage/StorageVolume;->getMaxFileSize()J
Landroid/os/storage/StorageVolume;->getOwner()Landroid/os/UserHandle;
-Landroid/os/storage/StorageVolume;->getPath()Ljava/lang/String;
Landroid/os/storage/StorageVolume;->getPathFile()Ljava/io/File;
Landroid/os/storage/StorageVolume;->getUserLabel()Ljava/lang/String;
Landroid/os/storage/StorageVolume;->mDescription:Ljava/lang/String;
@@ -4313,7 +4232,6 @@ Landroid/os/StrictMode$Span;->finish()V
Landroid/os/StrictMode$ThreadPolicy;->mask:I
Landroid/os/StrictMode$VmPolicy$Builder;->mMask:I
Landroid/os/StrictMode$VmPolicy;->mask:I
-Landroid/os/StrictMode;->conditionallyCheckInstanceCounts()V
Landroid/os/StrictMode;->disableDeathOnFileUriExposure()V
Landroid/os/StrictMode;->enableDeathOnFileUriExposure()V
Landroid/os/StrictMode;->enterCriticalSpan(Ljava/lang/String;)Landroid/os/StrictMode$Span;
@@ -4378,7 +4296,6 @@ Landroid/os/UserHandle;->getAppIdFromSharedAppGid(I)I
Landroid/os/UserHandle;->getCallingUserId()I
Landroid/os/UserHandle;->getUid(II)I
Landroid/os/UserHandle;->getUserId(I)I
-Landroid/os/UserHandle;->isApp(I)Z
Landroid/os/UserHandle;->isIsolated(I)Z
Landroid/os/UserHandle;->mHandle:I
Landroid/os/UserHandle;->MU_ENABLED:Z
@@ -4430,19 +4347,11 @@ Landroid/os/VintfRuntimeInfo;->getNodeName()Ljava/lang/String;
Landroid/os/VintfRuntimeInfo;->getOsName()Ljava/lang/String;
Landroid/os/VintfRuntimeInfo;->getOsRelease()Ljava/lang/String;
Landroid/os/VintfRuntimeInfo;->getOsVersion()Ljava/lang/String;
-Landroid/os/WorkSource;-><init>(I)V
Landroid/os/WorkSource;-><init>(Landroid/os/Parcel;)V
-Landroid/os/WorkSource;->add(I)Z
-Landroid/os/WorkSource;->add(ILjava/lang/String;)Z
-Landroid/os/WorkSource;->addReturningNewbs(Landroid/os/WorkSource;)Landroid/os/WorkSource;
-Landroid/os/WorkSource;->get(I)I
-Landroid/os/WorkSource;->getName(I)Ljava/lang/String;
Landroid/os/WorkSource;->mNames:[Ljava/lang/String;
Landroid/os/WorkSource;->mNum:I
Landroid/os/WorkSource;->mUids:[I
-Landroid/os/WorkSource;->setReturningDiffs(Landroid/os/WorkSource;)[Landroid/os/WorkSource;
Landroid/os/WorkSource;->sGoneWork:Landroid/os/WorkSource;
-Landroid/os/WorkSource;->size()I
Landroid/os/WorkSource;->sNewbWork:Landroid/os/WorkSource;
Landroid/os/WorkSource;->sTmpWorkSource:Landroid/os/WorkSource;
Landroid/os/WorkSource;->updateLocked(Landroid/os/WorkSource;ZZ)Z
@@ -5553,8 +5462,6 @@ Landroid/telephony/TelephonyManager;->getCallState(I)I
Landroid/telephony/TelephonyManager;->getCdmaEriIconIndex(I)I
Landroid/telephony/TelephonyManager;->getCdmaEriIconMode(I)I
Landroid/telephony/TelephonyManager;->getCdmaEriText(I)Ljava/lang/String;
-Landroid/telephony/TelephonyManager;->getCompleteVoiceMailNumber()Ljava/lang/String;
-Landroid/telephony/TelephonyManager;->getCompleteVoiceMailNumber(I)Ljava/lang/String;
Landroid/telephony/TelephonyManager;->getDataNetworkType(I)I
Landroid/telephony/TelephonyManager;->getDefault()Landroid/telephony/TelephonyManager;
Landroid/telephony/TelephonyManager;->getDeviceSoftwareVersion(I)Ljava/lang/String;
@@ -5624,8 +5531,6 @@ Landroid/telephony/TelephonyManager;->nvReadItem(I)Ljava/lang/String;
Landroid/telephony/TelephonyManager;->setBasebandVersionForPhone(ILjava/lang/String;)V
Landroid/telephony/TelephonyManager;->setDataNetworkTypeForPhone(II)V
Landroid/telephony/TelephonyManager;->setImsRegistrationState(Z)V
-Landroid/telephony/TelephonyManager;->setNetworkCountryIso(Ljava/lang/String;)V
-Landroid/telephony/TelephonyManager;->setNetworkCountryIsoForPhone(ILjava/lang/String;)V
Landroid/telephony/TelephonyManager;->setNetworkOperatorNameForPhone(ILjava/lang/String;)V
Landroid/telephony/TelephonyManager;->setNetworkOperatorNumericForPhone(ILjava/lang/String;)V
Landroid/telephony/TelephonyManager;->setNetworkRoamingForPhone(IZ)V
@@ -6036,7 +5941,7 @@ Landroid/view/InputEventConsistencyVerifier;->isInstrumentationEnabled()Z
Landroid/view/InputEventConsistencyVerifier;->onTouchEvent(Landroid/view/MotionEvent;I)V
Landroid/view/InputEventConsistencyVerifier;->onUnhandledEvent(Landroid/view/InputEvent;I)V
Landroid/view/InputEventReceiver;->dispatchBatchedInputEventPending()V
-Landroid/view/InputEventReceiver;->dispatchInputEvent(ILandroid/view/InputEvent;I)V
+Landroid/view/InputEventReceiver;->dispatchInputEvent(ILandroid/view/InputEvent;)V
Landroid/view/InputEventSender;->dispatchInputEventFinished(IZ)V
Landroid/view/InputFilter;-><init>(Landroid/os/Looper;)V
Landroid/view/InputFilter;->onInputEvent(Landroid/view/InputEvent;I)V
@@ -6132,7 +6037,6 @@ Landroid/view/IWindowSession;->wallpaperOffsetsComplete(Landroid/os/IBinder;)V
Landroid/view/KeyCharacterMap$FallbackAction;->keyCode:I
Landroid/view/KeyCharacterMap$FallbackAction;->metaState:I
Landroid/view/KeyCharacterMap;-><init>(J)V
-Landroid/view/KeyEvent;->actionToString(I)Ljava/lang/String;
Landroid/view/KeyEvent;->isConfirmKey(I)Z
Landroid/view/KeyEvent;->isDown()Z
Landroid/view/KeyEvent;->mAction:I
@@ -7700,7 +7604,6 @@ Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWakelockStats()Landroid/util/
Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiRunningTime(JI)J
Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiScanTime(JI)J
Lcom/android/internal/os/BatteryStatsImpl;-><init>(Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl;->commitPendingDataToDisk()V
Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryRealtime(JI)J
Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryTimeRemaining(J)J
Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryUptime(JI)J
@@ -7756,7 +7659,7 @@ Lcom/android/internal/os/HandlerCaller;->obtainMessageOO(ILjava/lang/Object;Ljav
Lcom/android/internal/os/HandlerCaller;->obtainMessageOOO(ILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message;
Lcom/android/internal/os/HandlerCaller;->sendMessage(Landroid/os/Message;)V
Lcom/android/internal/os/IDropBoxManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IDropBoxManagerService;
-Lcom/android/internal/os/IDropBoxManagerService;->getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;
+Lcom/android/internal/os/IDropBoxManagerService;->getNextEntry(Ljava/lang/String;JLjava/lang/String;)Landroid/os/DropBoxManager$Entry;
Lcom/android/internal/os/PowerProfile;-><init>(Landroid/content/Context;)V
Lcom/android/internal/os/PowerProfile;->getAveragePower(Ljava/lang/String;)D
Lcom/android/internal/os/PowerProfile;->getAveragePower(Ljava/lang/String;I)D
@@ -8293,7 +8196,7 @@ Lcom/android/internal/telephony/GsmAlphabet;->sLanguageTables:[Ljava/lang/String
Lcom/android/internal/telephony/GsmAlphabet;->stringToGsm7BitPacked(Ljava/lang/String;IZII)[B
Lcom/android/internal/telephony/GsmAlphabet;->stringToGsm7BitPackedWithHeader(Ljava/lang/String;[BII)[B
Lcom/android/internal/telephony/GsmAlphabet;->stringToGsm8BitPacked(Ljava/lang/String;)[B
-Lcom/android/internal/telephony/ICarrierConfigLoader;->getConfigForSubId(I)Landroid/os/PersistableBundle;
+Lcom/android/internal/telephony/ICarrierConfigLoader;->getConfigForSubId(ILjava/lang/String;)Landroid/os/PersistableBundle;
Lcom/android/internal/telephony/IMms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IMms;
Lcom/android/internal/telephony/IPhoneStateListener$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneStateListener;
Lcom/android/internal/telephony/IPhoneStateListener;->onCallForwardingIndicatorChanged(Z)V
@@ -8453,11 +8356,6 @@ Lcom/android/internal/util/AsyncChannel;->sendMessageSynchronously(III)Landroid/
Lcom/android/internal/util/AsyncChannel;->sendMessageSynchronously(Landroid/os/Message;)Landroid/os/Message;
Lcom/android/internal/util/AsyncChannel;->STATUS_SUCCESSFUL:I
Lcom/android/internal/util/FastPrintWriter;-><init>(Ljava/io/OutputStream;)V
-Lcom/android/internal/util/JournaledFile;-><init>(Ljava/io/File;Ljava/io/File;)V
-Lcom/android/internal/util/JournaledFile;->chooseForRead()Ljava/io/File;
-Lcom/android/internal/util/JournaledFile;->chooseForWrite()Ljava/io/File;
-Lcom/android/internal/util/JournaledFile;->commit()V
-Lcom/android/internal/util/JournaledFile;->rollback()V
Lcom/android/internal/util/XmlUtils;->convertValueToBoolean(Ljava/lang/CharSequence;Z)Z
Lcom/android/internal/util/XmlUtils;->convertValueToInt(Ljava/lang/CharSequence;I)I
Lcom/android/internal/util/XmlUtils;->readMapXml(Ljava/io/InputStream;)Ljava/util/HashMap;
@@ -9007,7 +8905,6 @@ Ljava/util/ArrayList$SubList;->size:I
Ljava/util/ArrayList;->elementData:[Ljava/lang/Object;
Ljava/util/ArrayList;->size:I
Ljava/util/Arrays$ArrayList;->a:[Ljava/lang/Object;
-Ljava/util/Arrays;->checkOffsetAndCount(III)V
Ljava/util/Arrays;->deepToString([Ljava/lang/Object;Ljava/lang/StringBuilder;Ljava/util/Set;)V
Ljava/util/Calendar;->zone:Ljava/util/TimeZone;
Ljava/util/Collections$EmptyList;-><init>()V
diff --git a/config/hiddenapi-p-light-greylist.txt b/config/hiddenapi-p-light-greylist.txt
new file mode 100644
index 000000000000..e360879ddc7b
--- /dev/null
+++ b/config/hiddenapi-p-light-greylist.txt
@@ -0,0 +1,5992 @@
+Landroid/R$styleable;->ActionBar:[I
+Landroid/R$styleable;->ActionBar_background:I
+Landroid/R$styleable;->ActionBar_backgroundSplit:I
+Landroid/R$styleable;->ActionBar_backgroundStacked:I
+Landroid/R$styleable;->ActionBar_divider:I
+Landroid/R$styleable;->ActionBar_itemPadding:I
+Landroid/R$styleable;->CalendarView:[I
+Landroid/R$styleable;->CalendarView_dateTextAppearance:I
+Landroid/R$styleable;->CalendarView_firstDayOfWeek:I
+Landroid/R$styleable;->CalendarView_focusedMonthDateColor:I
+Landroid/R$styleable;->CalendarView_selectedDateVerticalBar:I
+Landroid/R$styleable;->CalendarView_selectedWeekBackgroundColor:I
+Landroid/R$styleable;->CalendarView_showWeekNumber:I
+Landroid/R$styleable;->CalendarView_shownWeekCount:I
+Landroid/R$styleable;->CalendarView_unfocusedMonthDateColor:I
+Landroid/R$styleable;->CalendarView_weekDayTextAppearance:I
+Landroid/R$styleable;->CalendarView_weekNumberColor:I
+Landroid/R$styleable;->CalendarView_weekSeparatorLineColor:I
+Landroid/R$styleable;->CheckBoxPreference:[I
+Landroid/R$styleable;->CheckedTextView:[I
+Landroid/R$styleable;->CheckedTextView_checkMark:I
+Landroid/R$styleable;->CompoundButton:[I
+Landroid/R$styleable;->CompoundButton_button:I
+Landroid/R$styleable;->DrawableStates:[I
+Landroid/R$styleable;->ImageView:[I
+Landroid/R$styleable;->ImageView_adjustViewBounds:I
+Landroid/R$styleable;->ImageView_baselineAlignBottom:I
+Landroid/R$styleable;->ImageView_cropToPadding:I
+Landroid/R$styleable;->ImageView_maxHeight:I
+Landroid/R$styleable;->ImageView_maxWidth:I
+Landroid/R$styleable;->ImageView_scaleType:I
+Landroid/R$styleable;->ImageView_src:I
+Landroid/R$styleable;->ImageView_tint:I
+Landroid/R$styleable;->LinearLayout:[I
+Landroid/R$styleable;->LinearLayout_divider:I
+Landroid/R$styleable;->LinearLayout_dividerPadding:I
+Landroid/R$styleable;->LinearLayout_showDividers:I
+Landroid/R$styleable;->ListView:[I
+Landroid/R$styleable;->ListView_divider:I
+Landroid/R$styleable;->ListView_dividerHeight:I
+Landroid/R$styleable;->ProgressBar:[I
+Landroid/R$styleable;->ProgressBar_indeterminateDrawable:I
+Landroid/R$styleable;->ProgressBar_indeterminateDuration:I
+Landroid/R$styleable;->ProgressBar_maxHeight:I
+Landroid/R$styleable;->ProgressBar_maxWidth:I
+Landroid/R$styleable;->ProgressBar_minHeight:I
+Landroid/R$styleable;->ProgressBar_minWidth:I
+Landroid/R$styleable;->ProgressBar_progressDrawable:I
+Landroid/R$styleable;->SeekBar:[I
+Landroid/R$styleable;->SeekBar_thumb:I
+Landroid/R$styleable;->SeekBar_thumbOffset:I
+Landroid/R$styleable;->Switch:[I
+Landroid/R$styleable;->Switch_showText:I
+Landroid/R$styleable;->Switch_splitTrack:I
+Landroid/R$styleable;->Switch_switchMinWidth:I
+Landroid/R$styleable;->Switch_switchPadding:I
+Landroid/R$styleable;->Switch_switchTextAppearance:I
+Landroid/R$styleable;->Switch_textOff:I
+Landroid/R$styleable;->Switch_textOn:I
+Landroid/R$styleable;->Switch_thumb:I
+Landroid/R$styleable;->Switch_thumbTextPadding:I
+Landroid/R$styleable;->Switch_track:I
+Landroid/R$styleable;->TextAppearance:[I
+Landroid/R$styleable;->TextAppearance_textAllCaps:I
+Landroid/R$styleable;->TextAppearance_textColor:I
+Landroid/R$styleable;->TextAppearance_textColorHighlight:I
+Landroid/R$styleable;->TextAppearance_textColorHint:I
+Landroid/R$styleable;->TextAppearance_textColorLink:I
+Landroid/R$styleable;->TextAppearance_textSize:I
+Landroid/R$styleable;->TextAppearance_textStyle:I
+Landroid/R$styleable;->TextAppearance_typeface:I
+Landroid/R$styleable;->TextView:[I
+Landroid/R$styleable;->TextView_autoLink:I
+Landroid/R$styleable;->TextView_autoText:I
+Landroid/R$styleable;->TextView_bufferType:I
+Landroid/R$styleable;->TextView_capitalize:I
+Landroid/R$styleable;->TextView_cursorVisible:I
+Landroid/R$styleable;->TextView_digits:I
+Landroid/R$styleable;->TextView_drawableBottom:I
+Landroid/R$styleable;->TextView_drawableEnd:I
+Landroid/R$styleable;->TextView_drawableLeft:I
+Landroid/R$styleable;->TextView_drawablePadding:I
+Landroid/R$styleable;->TextView_drawableRight:I
+Landroid/R$styleable;->TextView_drawableStart:I
+Landroid/R$styleable;->TextView_drawableTop:I
+Landroid/R$styleable;->TextView_editable:I
+Landroid/R$styleable;->TextView_ellipsize:I
+Landroid/R$styleable;->TextView_ems:I
+Landroid/R$styleable;->TextView_enabled:I
+Landroid/R$styleable;->TextView_freezesText:I
+Landroid/R$styleable;->TextView_gravity:I
+Landroid/R$styleable;->TextView_height:I
+Landroid/R$styleable;->TextView_hint:I
+Landroid/R$styleable;->TextView_imeActionId:I
+Landroid/R$styleable;->TextView_imeActionLabel:I
+Landroid/R$styleable;->TextView_imeOptions:I
+Landroid/R$styleable;->TextView_includeFontPadding:I
+Landroid/R$styleable;->TextView_inputMethod:I
+Landroid/R$styleable;->TextView_inputType:I
+Landroid/R$styleable;->TextView_lineSpacingExtra:I
+Landroid/R$styleable;->TextView_lineSpacingMultiplier:I
+Landroid/R$styleable;->TextView_lines:I
+Landroid/R$styleable;->TextView_linksClickable:I
+Landroid/R$styleable;->TextView_marqueeRepeatLimit:I
+Landroid/R$styleable;->TextView_maxEms:I
+Landroid/R$styleable;->TextView_maxHeight:I
+Landroid/R$styleable;->TextView_maxLength:I
+Landroid/R$styleable;->TextView_maxLines:I
+Landroid/R$styleable;->TextView_maxWidth:I
+Landroid/R$styleable;->TextView_minEms:I
+Landroid/R$styleable;->TextView_minHeight:I
+Landroid/R$styleable;->TextView_minLines:I
+Landroid/R$styleable;->TextView_minWidth:I
+Landroid/R$styleable;->TextView_numeric:I
+Landroid/R$styleable;->TextView_password:I
+Landroid/R$styleable;->TextView_phoneNumber:I
+Landroid/R$styleable;->TextView_privateImeOptions:I
+Landroid/R$styleable;->TextView_scrollHorizontally:I
+Landroid/R$styleable;->TextView_selectAllOnFocus:I
+Landroid/R$styleable;->TextView_shadowColor:I
+Landroid/R$styleable;->TextView_shadowDx:I
+Landroid/R$styleable;->TextView_shadowDy:I
+Landroid/R$styleable;->TextView_shadowRadius:I
+Landroid/R$styleable;->TextView_singleLine:I
+Landroid/R$styleable;->TextView_text:I
+Landroid/R$styleable;->TextView_textAllCaps:I
+Landroid/R$styleable;->TextView_textAppearance:I
+Landroid/R$styleable;->TextView_textColor:I
+Landroid/R$styleable;->TextView_textColorHighlight:I
+Landroid/R$styleable;->TextView_textColorHint:I
+Landroid/R$styleable;->TextView_textColorLink:I
+Landroid/R$styleable;->TextView_textCursorDrawable:I
+Landroid/R$styleable;->TextView_textIsSelectable:I
+Landroid/R$styleable;->TextView_textScaleX:I
+Landroid/R$styleable;->TextView_textSelectHandle:I
+Landroid/R$styleable;->TextView_textSelectHandleLeft:I
+Landroid/R$styleable;->TextView_textSelectHandleRight:I
+Landroid/R$styleable;->TextView_textSize:I
+Landroid/R$styleable;->TextView_textStyle:I
+Landroid/R$styleable;->TextView_typeface:I
+Landroid/R$styleable;->TextView_width:I
+Landroid/R$styleable;->View:[I
+Landroid/R$styleable;->ViewDrawableStates:[I
+Landroid/R$styleable;->ViewGroup_Layout:[I
+Landroid/R$styleable;->ViewGroup_MarginLayout:[I
+Landroid/R$styleable;->View_background:I
+Landroid/R$styleable;->View_clickable:I
+Landroid/R$styleable;->View_contentDescription:I
+Landroid/R$styleable;->View_drawingCacheQuality:I
+Landroid/R$styleable;->View_duplicateParentState:I
+Landroid/R$styleable;->View_fadingEdge:I
+Landroid/R$styleable;->View_filterTouchesWhenObscured:I
+Landroid/R$styleable;->View_fitsSystemWindows:I
+Landroid/R$styleable;->View_focusable:I
+Landroid/R$styleable;->View_focusableInTouchMode:I
+Landroid/R$styleable;->View_hapticFeedbackEnabled:I
+Landroid/R$styleable;->View_id:I
+Landroid/R$styleable;->View_isScrollContainer:I
+Landroid/R$styleable;->View_keepScreenOn:I
+Landroid/R$styleable;->View_longClickable:I
+Landroid/R$styleable;->View_minHeight:I
+Landroid/R$styleable;->View_minWidth:I
+Landroid/R$styleable;->View_nextFocusDown:I
+Landroid/R$styleable;->View_nextFocusLeft:I
+Landroid/R$styleable;->View_nextFocusRight:I
+Landroid/R$styleable;->View_nextFocusUp:I
+Landroid/R$styleable;->View_onClick:I
+Landroid/R$styleable;->View_overScrollMode:I
+Landroid/R$styleable;->View_padding:I
+Landroid/R$styleable;->View_paddingBottom:I
+Landroid/R$styleable;->View_paddingEnd:I
+Landroid/R$styleable;->View_paddingLeft:I
+Landroid/R$styleable;->View_paddingRight:I
+Landroid/R$styleable;->View_paddingStart:I
+Landroid/R$styleable;->View_paddingTop:I
+Landroid/R$styleable;->View_saveEnabled:I
+Landroid/R$styleable;->View_scrollX:I
+Landroid/R$styleable;->View_scrollY:I
+Landroid/R$styleable;->View_scrollbarDefaultDelayBeforeFade:I
+Landroid/R$styleable;->View_scrollbarFadeDuration:I
+Landroid/R$styleable;->View_scrollbarSize:I
+Landroid/R$styleable;->View_scrollbarStyle:I
+Landroid/R$styleable;->View_scrollbarThumbHorizontal:I
+Landroid/R$styleable;->View_scrollbarThumbVertical:I
+Landroid/R$styleable;->View_scrollbarTrackHorizontal:I
+Landroid/R$styleable;->View_scrollbarTrackVertical:I
+Landroid/R$styleable;->View_scrollbars:I
+Landroid/R$styleable;->View_soundEffectsEnabled:I
+Landroid/R$styleable;->View_tag:I
+Landroid/R$styleable;->View_visibility:I
+Landroid/R$styleable;->Window:[I
+Landroid/R$styleable;->Window_windowBackground:I
+Landroid/R$styleable;->Window_windowFrame:I
+Landroid/accounts/AccountManager;-><init>(Landroid/content/Context;Landroid/accounts/IAccountManager;Landroid/os/Handler;)V
+Landroid/accounts/AccountManager;->mContext:Landroid/content/Context;
+Landroid/accounts/IAccountAuthenticator$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/accounts/IAccountAuthenticator$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/accounts/IAccountAuthenticator$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountAuthenticator;
+Landroid/accounts/IAccountAuthenticator;->addAccount(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)V
+Landroid/accounts/IAccountAuthenticator;->confirmCredentials(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)V
+Landroid/accounts/IAccountAuthenticator;->editProperties(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;)V
+Landroid/accounts/IAccountAuthenticator;->getAccountRemovalAllowed(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;)V
+Landroid/accounts/IAccountAuthenticator;->getAuthToken(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
+Landroid/accounts/IAccountAuthenticator;->getAuthTokenLabel(Landroid/accounts/IAccountAuthenticatorResponse;Ljava/lang/String;)V
+Landroid/accounts/IAccountAuthenticator;->hasFeatures(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;[Ljava/lang/String;)V
+Landroid/accounts/IAccountAuthenticator;->updateCredentials(Landroid/accounts/IAccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
+Landroid/accounts/IAccountAuthenticatorResponse$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/accounts/IAccountAuthenticatorResponse$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/accounts/IAccountAuthenticatorResponse$Stub;-><init>()V
+Landroid/accounts/IAccountAuthenticatorResponse$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountAuthenticatorResponse;
+Landroid/accounts/IAccountManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/accounts/IAccountManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManager;
+Landroid/accounts/IAccountManagerResponse$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/accounts/IAccountManagerResponse$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/accounts/IAccountManagerResponse$Stub;-><init>()V
+Landroid/accounts/IAccountManagerResponse$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManagerResponse;
+Landroid/accounts/IAccountManagerResponse;->onError(ILjava/lang/String;)V
+Landroid/accounts/IAccountManagerResponse;->onResult(Landroid/os/Bundle;)V
+Landroid/animation/LayoutTransition;->cancel()V
+Landroid/animation/LayoutTransition;->cancel(I)V
+Landroid/animation/ValueAnimator;->animateValue(F)V
+Landroid/animation/ValueAnimator;->sDurationScale:F
+Landroid/app/ActionBar;->setShowHideAnimationEnabled(Z)V
+Landroid/app/Activity;->enterPictureInPictureMode(Landroid/app/PictureInPictureArgs;)Z
+Landroid/app/Activity;->getActivityOptions()Landroid/app/ActivityOptions;
+Landroid/app/Activity;->getActivityToken()Landroid/os/IBinder;
+Landroid/app/Activity;->mActivityInfo:Landroid/content/pm/ActivityInfo;
+Landroid/app/Activity;->mApplication:Landroid/app/Application;
+Landroid/app/Activity;->mComponent:Landroid/content/ComponentName;
+Landroid/app/Activity;->mFinished:Z
+Landroid/app/Activity;->mFragments:Landroid/app/FragmentController;
+Landroid/app/Activity;->mHandler:Landroid/os/Handler;
+Landroid/app/Activity;->mInstrumentation:Landroid/app/Instrumentation;
+Landroid/app/Activity;->mMainThread:Landroid/app/ActivityThread;
+Landroid/app/Activity;->mReferrer:Ljava/lang/String;
+Landroid/app/Activity;->mResultCode:I
+Landroid/app/Activity;->mResultData:Landroid/content/Intent;
+Landroid/app/Activity;->mResumed:Z
+Landroid/app/Activity;->mToken:Landroid/os/IBinder;
+Landroid/app/Activity;->mWindow:Landroid/view/Window;
+Landroid/app/Activity;->mWindowManager:Landroid/view/WindowManager;
+Landroid/app/Activity;->managedQuery(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
+Landroid/app/Activity;->registerRemoteAnimations(Landroid/view/RemoteAnimationDefinition;)V
+Landroid/app/Activity;->setDisablePreviewScreenshots(Z)V
+Landroid/app/Activity;->setPersistent(Z)V
+Landroid/app/Activity;->setPictureInPictureArgs(Landroid/app/PictureInPictureArgs;)V
+Landroid/app/ActivityGroup;->mLocalActivityManager:Landroid/app/LocalActivityManager;
+Landroid/app/ActivityManager$RecentTaskInfo;->configuration:Landroid/content/res/Configuration;
+Landroid/app/ActivityManager$RecentTaskInfo;->firstActiveTime:J
+Landroid/app/ActivityManager$RecentTaskInfo;->lastActiveTime:J
+Landroid/app/ActivityManager$RecentTaskInfo;->resizeMode:I
+Landroid/app/ActivityManager$RecentTaskInfo;->supportsSplitScreenMultiWindow:Z
+Landroid/app/ActivityManager$RecentTaskInfo;->userId:I
+Landroid/app/ActivityManager$RunningAppProcessInfo;->flags:I
+Landroid/app/ActivityManager$RunningAppProcessInfo;->processState:I
+Landroid/app/ActivityManager$TaskDescription;->getBackgroundColor()I
+Landroid/app/ActivityManager$TaskDescription;->getInMemoryIcon()Landroid/graphics/Bitmap;
+Landroid/app/ActivityManager$TaskDescription;->loadTaskDescriptionIcon(Ljava/lang/String;I)Landroid/graphics/Bitmap;
+Landroid/app/ActivityManager$TaskSnapshot;->getContentInsets()Landroid/graphics/Rect;
+Landroid/app/ActivityManager$TaskSnapshot;->getOrientation()I
+Landroid/app/ActivityManager$TaskSnapshot;->getScale()F
+Landroid/app/ActivityManager$TaskSnapshot;->getSnapshot()Landroid/graphics/GraphicBuffer;
+Landroid/app/ActivityManager$TaskSnapshot;->isRealSnapshot()Z
+Landroid/app/ActivityManager$TaskSnapshot;->isReducedResolution()Z
+Landroid/app/ActivityManager;->IActivityManagerSingleton:Landroid/util/Singleton;
+Landroid/app/ActivityManager;->PROCESS_STATE_IMPORTANT_BACKGROUND:I
+Landroid/app/ActivityManager;->PROCESS_STATE_TOP:I
+Landroid/app/ActivityManager;->clearApplicationUserData(Ljava/lang/String;Landroid/content/pm/IPackageDataObserver;)Z
+Landroid/app/ActivityManager;->getMaxNumPictureInPictureActions()I
+Landroid/app/ActivityManager;->getMaxRecentTasksStatic()I
+Landroid/app/ActivityManager;->getService()Landroid/app/IActivityManager;
+Landroid/app/ActivityManager;->isHighEndGfx()Z
+Landroid/app/ActivityManager;->isLowRamDeviceStatic()Z
+Landroid/app/ActivityManager;->isUserRunning(I)Z
+Landroid/app/ActivityManager;->mContext:Landroid/content/Context;
+Landroid/app/ActivityManager;->setPersistentVrThread(I)V
+Landroid/app/ActivityManagerNative;->asInterface(Landroid/os/IBinder;)Landroid/app/IActivityManager;
+Landroid/app/ActivityManagerNative;->broadcastStickyIntent(Landroid/content/Intent;Ljava/lang/String;I)V
+Landroid/app/ActivityManagerNative;->getDefault()Landroid/app/IActivityManager;
+Landroid/app/ActivityOptions;->makeMultiThumbFutureAspectScaleAnimation(Landroid/content/Context;Landroid/os/Handler;Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/app/ActivityOptions$OnAnimationStartedListener;Z)Landroid/app/ActivityOptions;
+Landroid/app/ActivityOptions;->makeRemoteAnimation(Landroid/view/RemoteAnimationAdapter;)Landroid/app/ActivityOptions;
+Landroid/app/ActivityOptions;->setSplitScreenCreateMode(I)V
+Landroid/app/ActivityThread$ActivityClientRecord;->activity:Landroid/app/Activity;
+Landroid/app/ActivityThread$ActivityClientRecord;->activityInfo:Landroid/content/pm/ActivityInfo;
+Landroid/app/ActivityThread$ActivityClientRecord;->compatInfo:Landroid/content/res/CompatibilityInfo;
+Landroid/app/ActivityThread$ActivityClientRecord;->intent:Landroid/content/Intent;
+Landroid/app/ActivityThread$ActivityClientRecord;->mPreserveWindow:Z
+Landroid/app/ActivityThread$ActivityClientRecord;->packageInfo:Landroid/app/LoadedApk;
+Landroid/app/ActivityThread$ActivityClientRecord;->paused:Z
+Landroid/app/ActivityThread$ActivityClientRecord;->stopped:Z
+Landroid/app/ActivityThread$ActivityClientRecord;->token:Landroid/os/IBinder;
+Landroid/app/ActivityThread$AppBindData;->appInfo:Landroid/content/pm/ApplicationInfo;
+Landroid/app/ActivityThread$AppBindData;->info:Landroid/app/LoadedApk;
+Landroid/app/ActivityThread$AppBindData;->instrumentationArgs:Landroid/os/Bundle;
+Landroid/app/ActivityThread$AppBindData;->persistent:Z
+Landroid/app/ActivityThread$AppBindData;->processName:Ljava/lang/String;
+Landroid/app/ActivityThread$AppBindData;->providers:Ljava/util/List;
+Landroid/app/ActivityThread$AppBindData;->restrictedBackupMode:Z
+Landroid/app/ActivityThread$BindServiceData;->intent:Landroid/content/Intent;
+Landroid/app/ActivityThread$BindServiceData;->token:Landroid/os/IBinder;
+Landroid/app/ActivityThread$CreateServiceData;-><init>()V
+Landroid/app/ActivityThread$CreateServiceData;->compatInfo:Landroid/content/res/CompatibilityInfo;
+Landroid/app/ActivityThread$CreateServiceData;->info:Landroid/content/pm/ServiceInfo;
+Landroid/app/ActivityThread$CreateServiceData;->intent:Landroid/content/Intent;
+Landroid/app/ActivityThread$CreateServiceData;->token:Landroid/os/IBinder;
+Landroid/app/ActivityThread$H;->BIND_SERVICE:I
+Landroid/app/ActivityThread$H;->CREATE_SERVICE:I
+Landroid/app/ActivityThread$H;->DUMP_PROVIDER:I
+Landroid/app/ActivityThread$H;->ENTER_ANIMATION_COMPLETE:I
+Landroid/app/ActivityThread$H;->EXIT_APPLICATION:I
+Landroid/app/ActivityThread$H;->GC_WHEN_IDLE:I
+Landroid/app/ActivityThread$H;->INSTALL_PROVIDER:I
+Landroid/app/ActivityThread$H;->RECEIVER:I
+Landroid/app/ActivityThread$H;->REMOVE_PROVIDER:I
+Landroid/app/ActivityThread$H;->SCHEDULE_CRASH:I
+Landroid/app/ActivityThread$H;->SERVICE_ARGS:I
+Landroid/app/ActivityThread$H;->STOP_SERVICE:I
+Landroid/app/ActivityThread$H;->UNBIND_SERVICE:I
+Landroid/app/ActivityThread$ProviderClientRecord;->mHolder:Landroid/app/ContentProviderHolder;
+Landroid/app/ActivityThread$ProviderClientRecord;->mLocalProvider:Landroid/content/ContentProvider;
+Landroid/app/ActivityThread$ProviderClientRecord;->mProvider:Landroid/content/IContentProvider;
+Landroid/app/ActivityThread$ReceiverData;->compatInfo:Landroid/content/res/CompatibilityInfo;
+Landroid/app/ActivityThread$ReceiverData;->info:Landroid/content/pm/ActivityInfo;
+Landroid/app/ActivityThread$ReceiverData;->intent:Landroid/content/Intent;
+Landroid/app/ActivityThread$ServiceArgsData;->args:Landroid/content/Intent;
+Landroid/app/ActivityThread$ServiceArgsData;->token:Landroid/os/IBinder;
+Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread;
+Landroid/app/ActivityThread;->currentApplication()Landroid/app/Application;
+Landroid/app/ActivityThread;->currentPackageName()Ljava/lang/String;
+Landroid/app/ActivityThread;->currentProcessName()Ljava/lang/String;
+Landroid/app/ActivityThread;->getActivity(Landroid/os/IBinder;)Landroid/app/Activity;
+Landroid/app/ActivityThread;->getApplication()Landroid/app/Application;
+Landroid/app/ActivityThread;->getApplicationThread()Landroid/app/ActivityThread$ApplicationThread;
+Landroid/app/ActivityThread;->getHandler()Landroid/os/Handler;
+Landroid/app/ActivityThread;->getInstrumentation()Landroid/app/Instrumentation;
+Landroid/app/ActivityThread;->getPackageInfo(Landroid/content/pm/ApplicationInfo;Landroid/content/res/CompatibilityInfo;I)Landroid/app/LoadedApk;
+Landroid/app/ActivityThread;->getPackageInfoNoCheck(Landroid/content/pm/ApplicationInfo;Landroid/content/res/CompatibilityInfo;)Landroid/app/LoadedApk;
+Landroid/app/ActivityThread;->getPackageManager()Landroid/content/pm/IPackageManager;
+Landroid/app/ActivityThread;->getProcessName()Ljava/lang/String;
+Landroid/app/ActivityThread;->getSystemContext()Landroid/app/ContextImpl;
+Landroid/app/ActivityThread;->handleBindApplication(Landroid/app/ActivityThread$AppBindData;)V
+Landroid/app/ActivityThread;->installContentProviders(Landroid/content/Context;Ljava/util/List;)V
+Landroid/app/ActivityThread;->installProvider(Landroid/content/Context;Landroid/app/ContentProviderHolder;Landroid/content/pm/ProviderInfo;ZZZ)Landroid/app/ContentProviderHolder;
+Landroid/app/ActivityThread;->mActivities:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mAllApplications:Ljava/util/ArrayList;
+Landroid/app/ActivityThread;->mBoundApplication:Landroid/app/ActivityThread$AppBindData;
+Landroid/app/ActivityThread;->mConfiguration:Landroid/content/res/Configuration;
+Landroid/app/ActivityThread;->mCurDefaultDisplayDpi:I
+Landroid/app/ActivityThread;->mDensityCompatMode:Z
+Landroid/app/ActivityThread;->mH:Landroid/app/ActivityThread$H;
+Landroid/app/ActivityThread;->mInitialApplication:Landroid/app/Application;
+Landroid/app/ActivityThread;->mInstrumentation:Landroid/app/Instrumentation;
+Landroid/app/ActivityThread;->mLocalProviders:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mLocalProvidersByName:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mNumVisibleActivities:I
+Landroid/app/ActivityThread;->mPackages:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mPendingConfiguration:Landroid/content/res/Configuration;
+Landroid/app/ActivityThread;->mProviderMap:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mResourcePackages:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->mResourcesManager:Landroid/app/ResourcesManager;
+Landroid/app/ActivityThread;->mServices:Landroid/util/ArrayMap;
+Landroid/app/ActivityThread;->performNewIntents(Landroid/os/IBinder;Ljava/util/List;Z)V
+Landroid/app/ActivityThread;->performStopActivity(Landroid/os/IBinder;ZLjava/lang/String;)V
+Landroid/app/ActivityThread;->sCurrentActivityThread:Landroid/app/ActivityThread;
+Landroid/app/ActivityThread;->sPackageManager:Landroid/content/pm/IPackageManager;
+Landroid/app/ActivityThread;->sendActivityResult(Landroid/os/IBinder;Ljava/lang/String;IILandroid/content/Intent;)V
+Landroid/app/ActivityThread;->startActivityNow(Landroid/app/Activity;Ljava/lang/String;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Landroid/os/IBinder;Landroid/os/Bundle;Landroid/app/Activity$NonConfigurationInstances;)Landroid/app/Activity;
+Landroid/app/ActivityView;-><init>(Landroid/content/Context;)V
+Landroid/app/ActivityView;->release()V
+Landroid/app/ActivityView;->startActivity(Landroid/app/PendingIntent;)V
+Landroid/app/ActivityView;->startActivity(Landroid/content/Intent;)V
+Landroid/app/AlarmManager;->FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED:I
+Landroid/app/AlarmManager;->FLAG_IDLE_UNTIL:I
+Landroid/app/AlarmManager;->FLAG_STANDALONE:I
+Landroid/app/AlarmManager;->FLAG_WAKE_FROM_IDLE:I
+Landroid/app/AlarmManager;->WINDOW_EXACT:J
+Landroid/app/AlarmManager;->WINDOW_HEURISTIC:J
+Landroid/app/AlarmManager;->mService:Landroid/app/IAlarmManager;
+Landroid/app/AlertDialog$Builder;->P:Lcom/android/internal/app/AlertController$AlertParams;
+Landroid/app/AlertDialog$Builder;->setRecycleOnMeasureEnabled(Z)Landroid/app/AlertDialog$Builder;
+Landroid/app/AlertDialog$Builder;->setView(Landroid/view/View;IIII)Landroid/app/AlertDialog$Builder;
+Landroid/app/AlertDialog;->mAlert:Lcom/android/internal/app/AlertController;
+Landroid/app/AppGlobals;->getInitialApplication()Landroid/app/Application;
+Landroid/app/AppGlobals;->getInitialPackage()Ljava/lang/String;
+Landroid/app/AppGlobals;->getPackageManager()Landroid/content/pm/IPackageManager;
+Landroid/app/AppOpsManager$OpEntry;->getDuration()I
+Landroid/app/AppOpsManager$OpEntry;->getOp()I
+Landroid/app/AppOpsManager$OpEntry;->getRejectTime()J
+Landroid/app/AppOpsManager$OpEntry;->getTime()J
+Landroid/app/AppOpsManager;->OP_AUDIO_NOTIFICATION_VOLUME:I
+Landroid/app/AppOpsManager;->OP_COARSE_LOCATION:I
+Landroid/app/AppOpsManager;->OP_FINE_LOCATION:I
+Landroid/app/AppOpsManager;->OP_GET_USAGE_STATS:I
+Landroid/app/AppOpsManager;->OP_POST_NOTIFICATION:I
+Landroid/app/AppOpsManager;->OP_PROJECT_MEDIA:I
+Landroid/app/AppOpsManager;->OP_READ_CONTACTS:I
+Landroid/app/AppOpsManager;->OP_READ_PHONE_STATE:I
+Landroid/app/AppOpsManager;->OP_READ_SMS:I
+Landroid/app/AppOpsManager;->OP_RUN_IN_BACKGROUND:I
+Landroid/app/AppOpsManager;->OP_VIBRATE:I
+Landroid/app/AppOpsManager;->OP_WIFI_SCAN:I
+Landroid/app/AppOpsManager;->OP_WRITE_CONTACTS:I
+Landroid/app/AppOpsManager;->OP_WRITE_SMS:I
+Landroid/app/AppOpsManager;->checkOp(IILjava/lang/String;)I
+Landroid/app/AppOpsManager;->checkOpNoThrow(IILjava/lang/String;)I
+Landroid/app/AppOpsManager;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List;
+Landroid/app/AppOpsManager;->getPackagesForOps([I)Ljava/util/List;
+Landroid/app/AppOpsManager;->getToken(Lcom/android/internal/app/IAppOpsService;)Landroid/os/IBinder;
+Landroid/app/AppOpsManager;->mService:Lcom/android/internal/app/IAppOpsService;
+Landroid/app/AppOpsManager;->noteOp(I)I
+Landroid/app/AppOpsManager;->noteOp(IILjava/lang/String;)I
+Landroid/app/AppOpsManager;->permissionToOpCode(Ljava/lang/String;)I
+Landroid/app/AppOpsManager;->sOpPerms:[Ljava/lang/String;
+Landroid/app/AppOpsManager;->setRestriction(III[Ljava/lang/String;)V
+Landroid/app/AppOpsManager;->strOpToOp(Ljava/lang/String;)I
+Landroid/app/Application;->attach(Landroid/content/Context;)V
+Landroid/app/Application;->collectActivityLifecycleCallbacks()[Ljava/lang/Object;
+Landroid/app/Application;->dispatchActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V
+Landroid/app/Application;->dispatchActivityDestroyed(Landroid/app/Activity;)V
+Landroid/app/Application;->dispatchActivityPaused(Landroid/app/Activity;)V
+Landroid/app/Application;->dispatchActivityResumed(Landroid/app/Activity;)V
+Landroid/app/Application;->dispatchActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V
+Landroid/app/Application;->dispatchActivityStarted(Landroid/app/Activity;)V
+Landroid/app/Application;->dispatchActivityStopped(Landroid/app/Activity;)V
+Landroid/app/Application;->mComponentCallbacks:Ljava/util/ArrayList;
+Landroid/app/Application;->mLoadedApk:Landroid/app/LoadedApk;
+Landroid/app/ApplicationLoaders;->getDefault()Landroid/app/ApplicationLoaders;
+Landroid/app/ApplicationLoaders;->mLoaders:Landroid/util/ArrayMap;
+Landroid/app/ApplicationPackageManager;-><init>(Landroid/app/ContextImpl;Landroid/content/pm/IPackageManager;)V
+Landroid/app/ApplicationPackageManager;->configurationChanged()V
+Landroid/app/ApplicationPackageManager;->deletePackage(Ljava/lang/String;Landroid/content/pm/IPackageDeleteObserver;I)V
+Landroid/app/ApplicationPackageManager;->getPackageCurrentVolume(Landroid/content/pm/ApplicationInfo;)Landroid/os/storage/VolumeInfo;
+Landroid/app/ApplicationPackageManager;->getPackageSizeInfoAsUser(Ljava/lang/String;ILandroid/content/pm/IPackageStatsObserver;)V
+Landroid/app/ApplicationPackageManager;->mPM:Landroid/content/pm/IPackageManager;
+Landroid/app/ApplicationPackageManager;->setInstantAppCookie([B)Z
+Landroid/app/ApplicationPackageManager;->shouldShowRequestPermissionRationale(Ljava/lang/String;)Z
+Landroid/app/ContentProviderHolder;-><init>(Landroid/content/pm/ProviderInfo;)V
+Landroid/app/ContentProviderHolder;->info:Landroid/content/pm/ProviderInfo;
+Landroid/app/ContentProviderHolder;->provider:Landroid/content/IContentProvider;
+Landroid/app/ContextImpl;->createActivityContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;Landroid/content/pm/ActivityInfo;Landroid/os/IBinder;ILandroid/content/res/Configuration;)Landroid/app/ContextImpl;
+Landroid/app/ContextImpl;->getActivityToken()Landroid/os/IBinder;
+Landroid/app/ContextImpl;->getDisplay()Landroid/view/Display;
+Landroid/app/ContextImpl;->getPreferencesDir()Ljava/io/File;
+Landroid/app/ContextImpl;->getReceiverRestrictedContext()Landroid/content/Context;
+Landroid/app/ContextImpl;->getSharedPreferences(Ljava/io/File;I)Landroid/content/SharedPreferences;
+Landroid/app/ContextImpl;->getSharedPreferencesPath(Ljava/lang/String;)Ljava/io/File;
+Landroid/app/ContextImpl;->mBasePackageName:Ljava/lang/String;
+Landroid/app/ContextImpl;->mClassLoader:Ljava/lang/ClassLoader;
+Landroid/app/ContextImpl;->mContentResolver:Landroid/app/ContextImpl$ApplicationContentResolver;
+Landroid/app/ContextImpl;->mMainThread:Landroid/app/ActivityThread;
+Landroid/app/ContextImpl;->mOpPackageName:Ljava/lang/String;
+Landroid/app/ContextImpl;->mOuterContext:Landroid/content/Context;
+Landroid/app/ContextImpl;->mPackageInfo:Landroid/app/LoadedApk;
+Landroid/app/ContextImpl;->mPackageManager:Landroid/content/pm/PackageManager;
+Landroid/app/ContextImpl;->mResources:Landroid/content/res/Resources;
+Landroid/app/ContextImpl;->mServiceCache:[Ljava/lang/Object;
+Landroid/app/ContextImpl;->mTheme:Landroid/content/res/Resources$Theme;
+Landroid/app/ContextImpl;->mThemeResource:I
+Landroid/app/ContextImpl;->sSharedPrefsCache:Landroid/util/ArrayMap;
+Landroid/app/ContextImpl;->scheduleFinalCleanup(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/app/ContextImpl;->setOuterContext(Landroid/content/Context;)V
+Landroid/app/DatePickerDialog;->mDatePicker:Landroid/widget/DatePicker;
+Landroid/app/Dialog;->CANCEL:I
+Landroid/app/Dialog;->dismissDialog()V
+Landroid/app/Dialog;->mCancelMessage:Landroid/os/Message;
+Landroid/app/Dialog;->mDismissMessage:Landroid/os/Message;
+Landroid/app/Dialog;->mListenersHandler:Landroid/os/Handler;
+Landroid/app/Dialog;->mOwnerActivity:Landroid/app/Activity;
+Landroid/app/Dialog;->mShowMessage:Landroid/os/Message;
+Landroid/app/DialogFragment;->showAllowingStateLoss(Landroid/app/FragmentManager;Ljava/lang/String;)V
+Landroid/app/DownloadManager$Request;->mUri:Landroid/net/Uri;
+Landroid/app/DownloadManager;->setAccessFilename(Z)V
+Landroid/app/Fragment;->mChildFragmentManager:Landroid/app/FragmentManagerImpl;
+Landroid/app/Fragment;->mWho:Ljava/lang/String;
+Landroid/app/FragmentManagerImpl;->mAdded:Ljava/util/ArrayList;
+Landroid/app/FragmentManagerImpl;->mStateSaved:Z
+Landroid/app/FragmentManagerImpl;->noteStateNotSaved()V
+Landroid/app/IActivityController$Stub;-><init>()V
+Landroid/app/IActivityManager$Stub$Proxy;->getConfiguration()Landroid/content/res/Configuration;
+Landroid/app/IActivityManager$Stub$Proxy;->getLaunchedFromUid(Landroid/os/IBinder;)I
+Landroid/app/IActivityManager$Stub$Proxy;->getProcessLimit()I
+Landroid/app/IActivityManager$Stub$Proxy;->getProcessPss([I)[J
+Landroid/app/IActivityManager$Stub$Proxy;->isAppForeground(I)Z
+Landroid/app/IActivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/app/IActivityManager;->bindService(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;I)I
+Landroid/app/IActivityManager;->broadcastIntent(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I
+Landroid/app/IActivityManager;->cancelRecentsAnimation(Z)V
+Landroid/app/IActivityManager;->cancelTaskWindowTransition(I)V
+Landroid/app/IActivityManager;->closeSystemDialogs(Ljava/lang/String;)V
+Landroid/app/IActivityManager;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z
+Landroid/app/IActivityManager;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V
+Landroid/app/IActivityManager;->forceStopPackage(Ljava/lang/String;I)V
+Landroid/app/IActivityManager;->getConfiguration()Landroid/content/res/Configuration;
+Landroid/app/IActivityManager;->getCurrentUser()Landroid/content/pm/UserInfo;
+Landroid/app/IActivityManager;->getFilteredTasks(III)Ljava/util/List;
+Landroid/app/IActivityManager;->getIntentSender(ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;I)Landroid/content/IIntentSender;
+Landroid/app/IActivityManager;->getLaunchedFromPackage(Landroid/os/IBinder;)Ljava/lang/String;
+Landroid/app/IActivityManager;->getLockTaskModeState()I
+Landroid/app/IActivityManager;->getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;
+Landroid/app/IActivityManager;->getProviderMimeType(Landroid/net/Uri;I)Ljava/lang/String;
+Landroid/app/IActivityManager;->getRecentTasks(III)Landroid/content/pm/ParceledListSlice;
+Landroid/app/IActivityManager;->getRunningAppProcesses()Ljava/util/List;
+Landroid/app/IActivityManager;->getTaskForActivity(Landroid/os/IBinder;Z)I
+Landroid/app/IActivityManager;->getTaskSnapshot(IZ)Landroid/app/ActivityManager$TaskSnapshot;
+Landroid/app/IActivityManager;->moveActivityTaskToBack(Landroid/os/IBinder;Z)Z
+Landroid/app/IActivityManager;->moveTaskToFront(IILandroid/os/Bundle;)V
+Landroid/app/IActivityManager;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V
+Landroid/app/IActivityManager;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V
+Landroid/app/IActivityManager;->removeTask(I)Z
+Landroid/app/IActivityManager;->requestBugReport(I)V
+Landroid/app/IActivityManager;->resumeAppSwitches()V
+Landroid/app/IActivityManager;->setActivityController(Landroid/app/IActivityController;Z)V
+Landroid/app/IActivityManager;->setRequestedOrientation(Landroid/os/IBinder;I)V
+Landroid/app/IActivityManager;->setTaskResizeable(II)V
+Landroid/app/IActivityManager;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I
+Landroid/app/IActivityManager;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;I)I
+Landroid/app/IActivityManager;->startActivityFromRecents(ILandroid/os/Bundle;)I
+Landroid/app/IActivityManager;->startRecentsActivity(Landroid/content/Intent;Landroid/app/IAssistDataReceiver;Landroid/view/IRecentsAnimationRunner;)V
+Landroid/app/IActivityManager;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I
+Landroid/app/IActivityManager;->unbindService(Landroid/app/IServiceConnection;)Z
+Landroid/app/IActivityManager;->unstableProviderDied(Landroid/os/IBinder;)V
+Landroid/app/IAlarmManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/IAlarmManager$Stub;->TRANSACTION_remove:I
+Landroid/app/IAlarmManager$Stub;->TRANSACTION_set:I
+Landroid/app/IAlarmManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IAlarmManager;
+Landroid/app/IAlarmManager;->setTime(J)Z
+Landroid/app/IAppTask;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;
+Landroid/app/IApplicationThread;->scheduleTrimMemory(I)V
+Landroid/app/IAssistDataReceiver$Stub;-><init>()V
+Landroid/app/IAssistDataReceiver;->onHandleAssistData(Landroid/os/Bundle;)V
+Landroid/app/IAssistDataReceiver;->onHandleAssistScreenshot(Landroid/graphics/Bitmap;)V
+Landroid/app/INotificationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/INotificationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/INotificationManager;
+Landroid/app/INotificationManager;->cancelAllNotifications(Ljava/lang/String;I)V
+Landroid/app/INotificationManager;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;II)V
+Landroid/app/INotificationManager;->cancelToast(Ljava/lang/String;Landroid/app/ITransientNotification;)V
+Landroid/app/INotificationManager;->enqueueToast(Ljava/lang/String;Landroid/app/ITransientNotification;I)V
+Landroid/app/IProcessObserver$Stub;-><init>()V
+Landroid/app/ISearchManager$Stub$Proxy;->getGlobalSearchActivity()Landroid/content/ComponentName;
+Landroid/app/ISearchManager$Stub$Proxy;->getWebSearchActivity()Landroid/content/ComponentName;
+Landroid/app/ISearchManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/ISearchManager;
+Landroid/app/IServiceConnection$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/IServiceConnection$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/app/IServiceConnection$Stub;-><init>()V
+Landroid/app/IServiceConnection$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IServiceConnection;
+Landroid/app/IStopUserCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/IStopUserCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/app/IStopUserCallback$Stub;-><init>()V
+Landroid/app/IStopUserCallback;->userStopped(I)V
+Landroid/app/IUiModeManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/IWallpaperManager;->getWallpaper(Ljava/lang/String;Landroid/app/IWallpaperManagerCallback;ILandroid/os/Bundle;I)Landroid/os/ParcelFileDescriptor;
+Landroid/app/Instrumentation;->execStartActivities(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;[Landroid/content/Intent;Landroid/os/Bundle;)V
+Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult;
+Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult;
+Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;Landroid/os/UserHandle;)Landroid/app/Instrumentation$ActivityResult;
+Landroid/app/IntentService;->mServiceHandler:Landroid/app/IntentService$ServiceHandler;
+Landroid/app/KeyguardManager;->dismissKeyguard(Landroid/app/Activity;Landroid/app/KeyguardManager$KeyguardDismissCallback;Landroid/os/Handler;)V
+Landroid/app/KeyguardManager;->isDeviceLocked(I)Z
+Landroid/app/LoadedApk$ReceiverDispatcher;->getIIntentReceiver()Landroid/content/IIntentReceiver;
+Landroid/app/LoadedApk$ReceiverDispatcher;->getIntentReceiver()Landroid/content/BroadcastReceiver;
+Landroid/app/LoadedApk$ReceiverDispatcher;->mContext:Landroid/content/Context;
+Landroid/app/LoadedApk$ReceiverDispatcher;->mReceiver:Landroid/content/BroadcastReceiver;
+Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;->mDispatcher:Ljava/lang/ref/WeakReference;
+Landroid/app/LoadedApk$ServiceDispatcher;-><init>(Landroid/content/ServiceConnection;Landroid/content/Context;Landroid/os/Handler;I)V
+Landroid/app/LoadedApk$ServiceDispatcher;->getIServiceConnection()Landroid/app/IServiceConnection;
+Landroid/app/LoadedApk$ServiceDispatcher;->mConnection:Landroid/content/ServiceConnection;
+Landroid/app/LoadedApk$ServiceDispatcher;->mContext:Landroid/content/Context;
+Landroid/app/LoadedApk;->getAssets()Landroid/content/res/AssetManager;
+Landroid/app/LoadedApk;->getClassLoader()Ljava/lang/ClassLoader;
+Landroid/app/LoadedApk;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
+Landroid/app/LoadedApk;->getDataDirFile()Ljava/io/File;
+Landroid/app/LoadedApk;->getResources()Landroid/content/res/Resources;
+Landroid/app/LoadedApk;->mActivityThread:Landroid/app/ActivityThread;
+Landroid/app/LoadedApk;->mAppDir:Ljava/lang/String;
+Landroid/app/LoadedApk;->mApplication:Landroid/app/Application;
+Landroid/app/LoadedApk;->mApplicationInfo:Landroid/content/pm/ApplicationInfo;
+Landroid/app/LoadedApk;->mBaseClassLoader:Ljava/lang/ClassLoader;
+Landroid/app/LoadedApk;->mClassLoader:Ljava/lang/ClassLoader;
+Landroid/app/LoadedApk;->mDataDir:Ljava/lang/String;
+Landroid/app/LoadedApk;->mDataDirFile:Ljava/io/File;
+Landroid/app/LoadedApk;->mDisplayAdjustments:Landroid/view/DisplayAdjustments;
+Landroid/app/LoadedApk;->mLibDir:Ljava/lang/String;
+Landroid/app/LoadedApk;->mPackageName:Ljava/lang/String;
+Landroid/app/LoadedApk;->mReceivers:Landroid/util/ArrayMap;
+Landroid/app/LoadedApk;->mResDir:Ljava/lang/String;
+Landroid/app/LoadedApk;->mResources:Landroid/content/res/Resources;
+Landroid/app/LoadedApk;->mServices:Landroid/util/ArrayMap;
+Landroid/app/LoadedApk;->mSplitResDirs:[Ljava/lang/String;
+Landroid/app/LoadedApk;->makeApplication(ZLandroid/app/Instrumentation;)Landroid/app/Application;
+Landroid/app/LoadedApk;->rewriteRValues(Ljava/lang/ClassLoader;Ljava/lang/String;I)V
+Landroid/app/LocalActivityManager;->mActivities:Ljava/util/Map;
+Landroid/app/LocalActivityManager;->mActivityArray:Ljava/util/ArrayList;
+Landroid/app/LocalActivityManager;->mParent:Landroid/app/Activity;
+Landroid/app/LocalActivityManager;->mResumed:Landroid/app/LocalActivityManager$LocalActivityRecord;
+Landroid/app/LocalActivityManager;->mSingleMode:Z
+Landroid/app/NativeActivity;->hideIme(I)V
+Landroid/app/NativeActivity;->setWindowFlags(II)V
+Landroid/app/NativeActivity;->setWindowFormat(I)V
+Landroid/app/NativeActivity;->showIme(I)V
+Landroid/app/Notification$Action;->mIcon:Landroid/graphics/drawable/Icon;
+Landroid/app/Notification$Builder;->mActions:Ljava/util/ArrayList;
+Landroid/app/Notification$Builder;->makePublicContentView()Landroid/widget/RemoteViews;
+Landroid/app/Notification$Builder;->setChannel(Ljava/lang/String;)Landroid/app/Notification$Builder;
+Landroid/app/Notification$Builder;->setTimeout(J)Landroid/app/Notification$Builder;
+Landroid/app/Notification$TvExtender;->getChannel()Ljava/lang/String;
+Landroid/app/Notification;-><init>(Landroid/content/Context;ILjava/lang/CharSequence;JLjava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/content/Intent;)V
+Landroid/app/Notification;->getChannel()Ljava/lang/String;
+Landroid/app/Notification;->getNotificationStyleClass(Ljava/lang/String;)Ljava/lang/Class;
+Landroid/app/Notification;->getTimeout()J
+Landroid/app/Notification;->isGroupSummary()Z
+Landroid/app/Notification;->mChannelId:Ljava/lang/String;
+Landroid/app/Notification;->mGroupKey:Ljava/lang/String;
+Landroid/app/Notification;->mLargeIcon:Landroid/graphics/drawable/Icon;
+Landroid/app/Notification;->mSmallIcon:Landroid/graphics/drawable/Icon;
+Landroid/app/Notification;->setLatestEventInfo(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V
+Landroid/app/Notification;->setSmallIcon(Landroid/graphics/drawable/Icon;)V
+Landroid/app/NotificationManager;->cancelAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)V
+Landroid/app/NotificationManager;->getService()Landroid/app/INotificationManager;
+Landroid/app/NotificationManager;->notifyAsUser(Ljava/lang/String;ILandroid/app/Notification;Landroid/os/UserHandle;)V
+Landroid/app/NotificationManager;->sService:Landroid/app/INotificationManager;
+Landroid/app/PendingIntent;->getActivityAsUser(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;Landroid/os/UserHandle;)Landroid/app/PendingIntent;
+Landroid/app/PendingIntent;->getIntent()Landroid/content/Intent;
+Landroid/app/PendingIntent;->isActivity()Z
+Landroid/app/PictureInPictureArgs$Builder;
+Landroid/app/PictureInPictureArgs$Builder;-><init>()V
+Landroid/app/PictureInPictureArgs$Builder;->build()Landroid/app/PictureInPictureArgs;
+Landroid/app/PictureInPictureArgs$Builder;->setActions(Ljava/util/List;)Landroid/app/PictureInPictureArgs$Builder;
+Landroid/app/PictureInPictureArgs$Builder;->setAspectRatio(Landroid/util/Rational;)Landroid/app/PictureInPictureArgs$Builder;
+Landroid/app/PictureInPictureArgs$Builder;->setSourceRectHint(Landroid/graphics/Rect;)Landroid/app/PictureInPictureArgs$Builder;
+Landroid/app/PictureInPictureArgs;
+Landroid/app/PictureInPictureArgs;->CREATOR:Landroid/os/Parcelable$Creator;
+Landroid/app/PictureInPictureArgs;->convert(Landroid/app/PictureInPictureArgs;)Landroid/app/PictureInPictureParams;
+Landroid/app/PictureInPictureArgs;->convert(Landroid/app/PictureInPictureParams;)Landroid/app/PictureInPictureArgs;
+Landroid/app/PictureInPictureParams;->getAspectRatio()F
+Landroid/app/Presentation;->createPresentationContext(Landroid/content/Context;Landroid/view/Display;I)Landroid/content/Context;
+Landroid/app/ProgressDialog;->mProgressNumber:Landroid/widget/TextView;
+Landroid/app/QueuedWork;->addFinisher(Ljava/lang/Runnable;)V
+Landroid/app/QueuedWork;->removeFinisher(Ljava/lang/Runnable;)V
+Landroid/app/QueuedWork;->sFinishers:Ljava/util/LinkedList;
+Landroid/app/ResourcesManager;->appendLibAssetForMainAssetPath(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/app/ResourcesManager;->getInstance()Landroid/app/ResourcesManager;
+Landroid/app/ResourcesManager;->mActivityResourceReferences:Ljava/util/WeakHashMap;
+Landroid/app/ResourcesManager;->mResConfiguration:Landroid/content/res/Configuration;
+Landroid/app/ResourcesManager;->mResourceImpls:Landroid/util/ArrayMap;
+Landroid/app/ResourcesManager;->mResourceReferences:Ljava/util/ArrayList;
+Landroid/app/ResultInfo;->mData:Landroid/content/Intent;
+Landroid/app/ResultInfo;->mResultWho:Ljava/lang/String;
+Landroid/app/Service;->attach(Landroid/content/Context;Landroid/app/ActivityThread;Ljava/lang/String;Landroid/os/IBinder;Landroid/app/Application;Ljava/lang/Object;)V
+Landroid/app/Service;->mActivityManager:Landroid/app/IActivityManager;
+Landroid/app/Service;->mApplication:Landroid/app/Application;
+Landroid/app/Service;->mClassName:Ljava/lang/String;
+Landroid/app/Service;->mStartCompatibility:Z
+Landroid/app/Service;->mThread:Landroid/app/ActivityThread;
+Landroid/app/Service;->mToken:Landroid/os/IBinder;
+Landroid/app/Service;->setForeground(Z)V
+Landroid/app/SharedPreferencesImpl;-><init>(Ljava/io/File;I)V
+Landroid/app/SharedPreferencesImpl;->mFile:Ljava/io/File;
+Landroid/app/SharedPreferencesImpl;->startReloadIfChangedUnexpectedly()V
+Landroid/app/StatusBarManager;->collapsePanels()V
+Landroid/app/StatusBarManager;->disable(I)V
+Landroid/app/StatusBarManager;->expandNotificationsPanel()V
+Landroid/app/StatusBarManager;->expandSettingsPanel()V
+Landroid/app/StatusBarManager;->expandSettingsPanel(Ljava/lang/String;)V
+Landroid/app/StatusBarManager;->getService()Lcom/android/internal/statusbar/IStatusBarService;
+Landroid/app/StatusBarManager;->removeIcon(Ljava/lang/String;)V
+Landroid/app/StatusBarManager;->setIcon(Ljava/lang/String;IILjava/lang/String;)V
+Landroid/app/TaskStackListener;-><init>()V
+Landroid/app/TaskStackListener;->onActivityDismissingDockedStack()V
+Landroid/app/TaskStackListener;->onActivityForcedResizable(Ljava/lang/String;II)V
+Landroid/app/TaskStackListener;->onActivityLaunchOnSecondaryDisplayFailed()V
+Landroid/app/TaskStackListener;->onActivityPinned(Ljava/lang/String;III)V
+Landroid/app/TaskStackListener;->onActivityRequestedOrientationChanged(II)V
+Landroid/app/TaskStackListener;->onActivityUnpinned()V
+Landroid/app/TaskStackListener;->onPinnedActivityRestartAttempt(Z)V
+Landroid/app/TaskStackListener;->onPinnedStackAnimationEnded()V
+Landroid/app/TaskStackListener;->onPinnedStackAnimationStarted()V
+Landroid/app/TaskStackListener;->onTaskMovedToFront(I)V
+Landroid/app/TaskStackListener;->onTaskProfileLocked(II)V
+Landroid/app/TaskStackListener;->onTaskRemoved(I)V
+Landroid/app/TaskStackListener;->onTaskSnapshotChanged(ILandroid/app/ActivityManager$TaskSnapshot;)V
+Landroid/app/TaskStackListener;->onTaskStackChanged()V
+Landroid/app/TimePickerDialog;->mTimePicker:Landroid/widget/TimePicker;
+Landroid/app/Vr2dDisplayProperties$Builder;-><init>()V
+Landroid/app/Vr2dDisplayProperties$Builder;->build()Landroid/app/Vr2dDisplayProperties;
+Landroid/app/Vr2dDisplayProperties$Builder;->setEnabled(Z)Landroid/app/Vr2dDisplayProperties$Builder;
+Landroid/app/Vr2dDisplayProperties;-><init>(III)V
+Landroid/app/VrManager;->getPersistentVrModeEnabled()Z
+Landroid/app/VrManager;->mService:Landroid/service/vr/IVrManager;
+Landroid/app/VrManager;->registerVrStateCallback(Landroid/app/VrStateCallback;Landroid/os/Handler;)V
+Landroid/app/VrManager;->setVr2dDisplayProperties(Landroid/app/Vr2dDisplayProperties;)V
+Landroid/app/VrManager;->unregisterVrStateCallback(Landroid/app/VrStateCallback;)V
+Landroid/app/VrStateCallback;-><init>()V
+Landroid/app/VrStateCallback;->onPersistentVrStateChanged(Z)V
+Landroid/app/WallpaperColors;-><init>(Landroid/graphics/Color;Landroid/graphics/Color;Landroid/graphics/Color;I)V
+Landroid/app/WallpaperColors;->getColorHints()I
+Landroid/app/WallpaperManager;->getBitmap()Landroid/graphics/Bitmap;
+Landroid/app/WallpaperManager;->getBitmap(Z)Landroid/graphics/Bitmap;
+Landroid/app/WallpaperManager;->getIWallpaperManager()Landroid/app/IWallpaperManager;
+Landroid/app/WallpaperManager;->openDefaultWallpaper(Landroid/content/Context;I)Ljava/io/InputStream;
+Landroid/app/WallpaperManager;->sGlobals:Landroid/app/WallpaperManager$Globals;
+Landroid/app/WallpaperManager;->setBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;ZII)I
+Landroid/app/admin/DevicePolicyManager;->createAndInitializeUser(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)Landroid/os/UserHandle;
+Landroid/app/admin/DevicePolicyManager;->createUser(Landroid/content/ComponentName;Ljava/lang/String;)Landroid/os/UserHandle;
+Landroid/app/admin/DevicePolicyManager;->getDeviceInitializerApp()Ljava/lang/String;
+Landroid/app/admin/DevicePolicyManager;->getDeviceInitializerComponent()Landroid/content/ComponentName;
+Landroid/app/admin/DevicePolicyManager;->getMandatoryBackupTransport()Landroid/content/ComponentName;
+Landroid/app/admin/DevicePolicyManager;->getProfileOwnerAsUser(I)Landroid/content/ComponentName;
+Landroid/app/admin/DevicePolicyManager;->getTrustAgentConfiguration(Landroid/content/ComponentName;Landroid/content/ComponentName;I)Ljava/util/List;
+Landroid/app/admin/DevicePolicyManager;->packageHasActiveAdmins(Ljava/lang/String;I)Z
+Landroid/app/admin/DevicePolicyManager;->setActiveAdmin(Landroid/content/ComponentName;Z)V
+Landroid/app/admin/DevicePolicyManager;->setActiveAdmin(Landroid/content/ComponentName;ZI)V
+Landroid/app/admin/DevicePolicyManager;->setDefaultSmsApplication(Landroid/content/ComponentName;Ljava/lang/String;)V
+Landroid/app/admin/DevicePolicyManager;->throwIfParentInstance(Ljava/lang/String;)V
+Landroid/app/admin/IDevicePolicyManager$Stub;->TRANSACTION_packageHasActiveAdmins:I
+Landroid/app/admin/IDevicePolicyManager$Stub;->TRANSACTION_removeActiveAdmin:I
+Landroid/app/admin/IDevicePolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/admin/IDevicePolicyManager;
+Landroid/app/admin/SecurityLog$SecurityEvent;-><init>([B)V
+Landroid/app/backup/BackupDataInput$EntityHeader;->dataSize:I
+Landroid/app/backup/BackupDataInput$EntityHeader;->key:Ljava/lang/String;
+Landroid/app/backup/BackupDataInputStream;->dataSize:I
+Landroid/app/backup/BackupDataInputStream;->key:Ljava/lang/String;
+Landroid/app/backup/BackupDataOutput;->mBackupWriter:J
+Landroid/app/backup/BackupHelperDispatcher$Header;->chunkSize:I
+Landroid/app/backup/BackupHelperDispatcher$Header;->keyPrefix:Ljava/lang/String;
+Landroid/app/backup/FileBackupHelperBase;->writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V
+Landroid/app/backup/FullBackup;->backupToTar(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/backup/FullBackupDataOutput;)I
+Landroid/app/backup/FullBackupDataOutput;-><init>(Landroid/os/ParcelFileDescriptor;)V
+Landroid/app/backup/FullBackupDataOutput;->addSize(J)V
+Landroid/app/backup/FullBackupDataOutput;->mData:Landroid/app/backup/BackupDataOutput;
+Landroid/app/backup/IBackupManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/backup/IBackupManager;
+Landroid/app/job/IJobCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/job/IJobCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/app/job/IJobCallback$Stub;-><init>()V
+Landroid/app/job/IJobCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobCallback;
+Landroid/app/job/IJobCallback;->acknowledgeStartMessage(IZ)V
+Landroid/app/job/IJobCallback;->acknowledgeStopMessage(IZ)V
+Landroid/app/job/IJobCallback;->jobFinished(IZ)V
+Landroid/app/job/IJobScheduler$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler;
+Landroid/app/job/IJobService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/job/IJobService$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/app/job/IJobService$Stub;-><init>()V
+Landroid/app/job/IJobService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobService;
+Landroid/app/job/IJobService;->startJob(Landroid/app/job/JobParameters;)V
+Landroid/app/job/IJobService;->stopJob(Landroid/app/job/JobParameters;)V
+Landroid/app/job/JobInfo$Builder;->setEstimatedNetworkBytes(J)Landroid/app/job/JobInfo$Builder;
+Landroid/app/job/JobInfo$Builder;->setIsPrefetch(Z)Landroid/app/job/JobInfo$Builder;
+Landroid/app/job/JobInfo;->flags:I
+Landroid/app/job/JobInfo;->getEstimatedNetworkBytes()J
+Landroid/app/job/JobInfo;->jobId:I
+Landroid/app/job/JobInfo;->service:Landroid/content/ComponentName;
+Landroid/app/job/JobParameters;->callback:Landroid/os/IBinder;
+Landroid/app/job/JobParameters;->jobId:I
+Landroid/app/job/JobWorkItem;-><init>(Landroid/content/Intent;J)V
+Landroid/app/job/JobWorkItem;->getEstimatedNetworkBytes()J
+Landroid/app/slice/Slice$Builder;-><init>(Landroid/net/Uri;)V
+Landroid/app/slice/Slice$Builder;->addTimestamp(JLjava/lang/String;Ljava/util/List;)Landroid/app/slice/Slice$Builder;
+Landroid/app/slice/Slice$Builder;->setSpec(Landroid/app/slice/SliceSpec;)Landroid/app/slice/Slice$Builder;
+Landroid/app/slice/Slice;->EXTRA_SLIDER_VALUE:Ljava/lang/String;
+Landroid/app/slice/Slice;->SUBTYPE_SLIDER:Ljava/lang/String;
+Landroid/app/slice/SliceItem;->FORMAT_TIMESTAMP:Ljava/lang/String;
+Landroid/app/slice/SliceItem;->getTimestamp()J
+Landroid/app/slice/SliceManager;->bindSlice(Landroid/content/Intent;Ljava/util/List;)Landroid/app/slice/Slice;
+Landroid/app/slice/SliceManager;->bindSlice(Landroid/net/Uri;Ljava/util/List;)Landroid/app/slice/Slice;
+Landroid/app/slice/SliceManager;->pinSlice(Landroid/net/Uri;Ljava/util/List;)V
+Landroid/app/slice/SliceProvider;->onBindSlice(Landroid/net/Uri;Ljava/util/List;)Landroid/app/slice/Slice;
+Landroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/usage/StorageStats;->getCodeBytes()J
+Landroid/app/usage/StorageStatsManager;->getFreeBytes(Ljava/lang/String;)J
+Landroid/app/usage/StorageStatsManager;->getTotalBytes(Ljava/lang/String;)J
+Landroid/app/usage/StorageStatsManager;->isQuotaSupported(Ljava/lang/String;)Z
+Landroid/app/usage/StorageStatsManager;->queryExternalStatsForUser(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/ExternalStorageStats;
+Landroid/app/usage/StorageStatsManager;->queryStatsForPackage(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;
+Landroid/app/usage/StorageStatsManager;->queryStatsForUid(Ljava/lang/String;I)Landroid/app/usage/StorageStats;
+Landroid/app/usage/StorageStatsManager;->queryStatsForUser(Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;
+Landroid/app/usage/UsageStats;->mLastEvent:I
+Landroid/app/usage/UsageStats;->mLaunchCount:I
+Landroid/app/usage/UsageStats;->mTotalTimeInForeground:J
+Landroid/app/usage/UsageStatsManager;->mService:Landroid/app/usage/IUsageStatsManager;
+Landroid/appwidget/AppWidgetHost;->sService:Lcom/android/internal/appwidget/IAppWidgetService;
+Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;)V
+Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;Landroid/os/Bundle;)V
+Landroid/appwidget/AppWidgetManager;->bindAppWidgetIdIfAllowed(IILandroid/content/ComponentName;Landroid/os/Bundle;)Z
+Landroid/appwidget/AppWidgetManager;->mService:Lcom/android/internal/appwidget/IAppWidgetService;
+Landroid/appwidget/AppWidgetProviderInfo;->providerInfo:Landroid/content/pm/ActivityInfo;
+Landroid/bluetooth/BluetoothA2dp;->ACTION_ACTIVE_DEVICE_CHANGED:Ljava/lang/String;
+Landroid/bluetooth/BluetoothA2dp;->ACTION_CODEC_CONFIG_CHANGED:Ljava/lang/String;
+Landroid/bluetooth/BluetoothA2dp;->OPTIONAL_CODECS_NOT_SUPPORTED:I
+Landroid/bluetooth/BluetoothA2dp;->OPTIONAL_CODECS_PREF_DISABLED:I
+Landroid/bluetooth/BluetoothA2dp;->OPTIONAL_CODECS_PREF_ENABLED:I
+Landroid/bluetooth/BluetoothA2dp;->OPTIONAL_CODECS_PREF_UNKNOWN:I
+Landroid/bluetooth/BluetoothA2dp;->OPTIONAL_CODECS_SUPPORTED:I
+Landroid/bluetooth/BluetoothA2dp;->OPTIONAL_CODECS_SUPPORT_UNKNOWN:I
+Landroid/bluetooth/BluetoothA2dp;->connect(Landroid/bluetooth/BluetoothDevice;)Z
+Landroid/bluetooth/BluetoothA2dp;->disableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
+Landroid/bluetooth/BluetoothA2dp;->enableOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)V
+Landroid/bluetooth/BluetoothA2dp;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
+Landroid/bluetooth/BluetoothA2dp;->getCodecStatus(Landroid/bluetooth/BluetoothDevice;)Landroid/bluetooth/BluetoothCodecStatus;
+Landroid/bluetooth/BluetoothA2dp;->getOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;)I
+Landroid/bluetooth/BluetoothA2dp;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
+Landroid/bluetooth/BluetoothA2dp;->setCodecConfigPreference(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothCodecConfig;)V
+Landroid/bluetooth/BluetoothA2dp;->setOptionalCodecsEnabled(Landroid/bluetooth/BluetoothDevice;I)V
+Landroid/bluetooth/BluetoothA2dp;->supportsOptionalCodecs(Landroid/bluetooth/BluetoothDevice;)I
+Landroid/bluetooth/BluetoothAdapter;->disable(Z)Z
+Landroid/bluetooth/BluetoothAdapter;->factoryReset()Z
+Landroid/bluetooth/BluetoothAdapter;->getDiscoverableTimeout()I
+Landroid/bluetooth/BluetoothAdapter;->getLeState()I
+Landroid/bluetooth/BluetoothAdapter;->mService:Landroid/bluetooth/IBluetooth;
+Landroid/bluetooth/BluetoothAdapter;->setScanMode(I)Z
+Landroid/bluetooth/BluetoothAdapter;->setScanMode(II)Z
+Landroid/bluetooth/BluetoothCodecConfig;
+Landroid/bluetooth/BluetoothCodecConfig;-><init>(IIIIIJJJJ)V
+Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_16:I
+Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_24:I
+Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_32:I
+Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_NONE:I
+Landroid/bluetooth/BluetoothCodecConfig;->CHANNEL_MODE_MONO:I
+Landroid/bluetooth/BluetoothCodecConfig;->CHANNEL_MODE_NONE:I
+Landroid/bluetooth/BluetoothCodecConfig;->CHANNEL_MODE_STEREO:I
+Landroid/bluetooth/BluetoothCodecConfig;->CODEC_PRIORITY_DEFAULT:I
+Landroid/bluetooth/BluetoothCodecConfig;->CODEC_PRIORITY_DISABLED:I
+Landroid/bluetooth/BluetoothCodecConfig;->CODEC_PRIORITY_HIGHEST:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_176400:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_192000:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_44100:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_48000:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_88200:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_96000:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_NONE:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_AAC:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_APTX:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_APTX_HD:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_INVALID:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_LDAC:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_MAX:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_SBC:I
+Landroid/bluetooth/BluetoothCodecConfig;->getBitsPerSample()I
+Landroid/bluetooth/BluetoothCodecConfig;->getChannelMode()I
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecPriority()I
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecSpecific1()J
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecSpecific2()J
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecSpecific3()J
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecSpecific4()J
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecType()I
+Landroid/bluetooth/BluetoothCodecConfig;->getSampleRate()I
+Landroid/bluetooth/BluetoothCodecConfig;->setCodecPriority(I)V
+Landroid/bluetooth/BluetoothCodecStatus;
+Landroid/bluetooth/BluetoothCodecStatus;->EXTRA_CODEC_STATUS:Ljava/lang/String;
+Landroid/bluetooth/BluetoothCodecStatus;->getCodecConfig()Landroid/bluetooth/BluetoothCodecConfig;
+Landroid/bluetooth/BluetoothCodecStatus;->getCodecsLocalCapabilities()[Landroid/bluetooth/BluetoothCodecConfig;
+Landroid/bluetooth/BluetoothCodecStatus;->getCodecsSelectableCapabilities()[Landroid/bluetooth/BluetoothCodecConfig;
+Landroid/bluetooth/BluetoothDevice;->createBond(I)Z
+Landroid/bluetooth/BluetoothDevice;->getAlias()Ljava/lang/String;
+Landroid/bluetooth/BluetoothDevice;->getAliasName()Ljava/lang/String;
+Landroid/bluetooth/BluetoothGatt;->mAuthRetryState:I
+Landroid/bluetooth/BluetoothGatt;->mClientIf:I
+Landroid/bluetooth/BluetoothGatt;->refresh()Z
+Landroid/bluetooth/BluetoothGattCharacteristic;->mInstance:I
+Landroid/bluetooth/BluetoothGattCharacteristic;->mService:Landroid/bluetooth/BluetoothGattService;
+Landroid/bluetooth/BluetoothGattDescriptor;->mCharacteristic:Landroid/bluetooth/BluetoothGattCharacteristic;
+Landroid/bluetooth/BluetoothGattDescriptor;->mInstance:I
+Landroid/bluetooth/BluetoothHeadset;->ACTION_ACTIVE_DEVICE_CHANGED:Ljava/lang/String;
+Landroid/bluetooth/BluetoothHeadset;->close()V
+Landroid/bluetooth/BluetoothHeadset;->connectAudio()Z
+Landroid/bluetooth/BluetoothHeadset;->disconnectAudio()Z
+Landroid/bluetooth/BluetoothHeadset;->getActiveDevice()Landroid/bluetooth/BluetoothDevice;
+Landroid/bluetooth/BluetoothHeadset;->phoneStateChanged(IIILjava/lang/String;I)V
+Landroid/bluetooth/BluetoothHeadset;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
+Landroid/bluetooth/BluetoothHeadset;->startScoUsingVirtualVoiceCall()Z
+Landroid/bluetooth/BluetoothHeadset;->stopScoUsingVirtualVoiceCall()Z
+Landroid/bluetooth/BluetoothHearingAid;->ACTION_ACTIVE_DEVICE_CHANGED:Ljava/lang/String;
+Landroid/bluetooth/BluetoothHearingAid;->getActiveDevices()Ljava/util/List;
+Landroid/bluetooth/BluetoothHearingAid;->setActiveDevice(Landroid/bluetooth/BluetoothDevice;)Z
+Landroid/bluetooth/BluetoothMapClient;->sendMessage(Landroid/bluetooth/BluetoothDevice;[Landroid/net/Uri;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)Z
+Landroid/bluetooth/BluetoothPan;-><init>(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;)V
+Landroid/bluetooth/BluetoothPan;->close()V
+Landroid/bluetooth/BluetoothPan;->connect(Landroid/bluetooth/BluetoothDevice;)Z
+Landroid/bluetooth/BluetoothPan;->disconnect(Landroid/bluetooth/BluetoothDevice;)Z
+Landroid/bluetooth/BluetoothPan;->doBind()Z
+Landroid/bluetooth/BluetoothPan;->isEnabled()Z
+Landroid/bluetooth/BluetoothPan;->isTetheringOn()Z
+Landroid/bluetooth/BluetoothPan;->isValidDevice(Landroid/bluetooth/BluetoothDevice;)Z
+Landroid/bluetooth/BluetoothPan;->log(Ljava/lang/String;)V
+Landroid/bluetooth/BluetoothPan;->setBluetoothTethering(Z)V
+Landroid/bluetooth/BluetoothProfile;->PAN:I
+Landroid/bluetooth/BluetoothSocket;->mPfd:Landroid/os/ParcelFileDescriptor;
+Landroid/bluetooth/BluetoothUuid;->RESERVED_UUIDS:[Landroid/os/ParcelUuid;
+Landroid/bluetooth/IBluetooth$Stub$Proxy;->getAddress()Ljava/lang/String;
+Landroid/bluetooth/IBluetooth$Stub$Proxy;->getConnectionState(Landroid/bluetooth/BluetoothDevice;)I
+Landroid/bluetooth/IBluetooth$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetooth;
+Landroid/bluetooth/IBluetooth;->getAddress()Ljava/lang/String;
+Landroid/bluetooth/IBluetooth;->sendConnectionStateChange(Landroid/bluetooth/BluetoothDevice;III)V
+Landroid/bluetooth/IBluetoothManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/bluetooth/IBluetoothManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothManager;
+Landroid/bluetooth/le/ScanRecord;->parseFromBytes([B)Landroid/bluetooth/le/ScanRecord;
+Landroid/companion/AssociationRequest;->getDeviceFilters()Ljava/util/List;
+Landroid/companion/AssociationRequest;->isSingleDevice()Z
+Landroid/companion/BluetoothDeviceFilter;->getAddress()Ljava/lang/String;
+Landroid/companion/BluetoothDeviceFilterUtils;->getDeviceDisplayNameInternal(Landroid/bluetooth/BluetoothDevice;)Ljava/lang/String;
+Landroid/companion/BluetoothDeviceFilterUtils;->getDeviceDisplayNameInternal(Landroid/net/wifi/ScanResult;)Ljava/lang/String;
+Landroid/companion/BluetoothDeviceFilterUtils;->getDeviceMacAddress(Landroid/os/Parcelable;)Ljava/lang/String;
+Landroid/companion/BluetoothLeDeviceFilter;->getScanFilter()Landroid/bluetooth/le/ScanFilter;
+Landroid/companion/DeviceFilter;->getDeviceDisplayName(Landroid/os/Parcelable;)Ljava/lang/String;
+Landroid/companion/DeviceFilter;->matches(Landroid/os/Parcelable;)Z
+Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V
+Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelected(Ljava/lang/String;ILjava/lang/String;)V
+Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelectionCancel()V
+Landroid/companion/IFindDeviceCallback;->onSuccess(Landroid/app/PendingIntent;)V
+Landroid/content/AsyncTaskLoader;->mExecutor:Ljava/util/concurrent/Executor;
+Landroid/content/BroadcastReceiver$PendingResult;-><init>(ILjava/lang/String;Landroid/os/Bundle;IZZLandroid/os/IBinder;II)V
+Landroid/content/BroadcastReceiver$PendingResult;->mAbortBroadcast:Z
+Landroid/content/BroadcastReceiver$PendingResult;->mFinished:Z
+Landroid/content/BroadcastReceiver$PendingResult;->mFlags:I
+Landroid/content/BroadcastReceiver$PendingResult;->mInitialStickyHint:Z
+Landroid/content/BroadcastReceiver$PendingResult;->mOrderedHint:Z
+Landroid/content/BroadcastReceiver$PendingResult;->mResultCode:I
+Landroid/content/BroadcastReceiver$PendingResult;->mResultData:Ljava/lang/String;
+Landroid/content/BroadcastReceiver$PendingResult;->mResultExtras:Landroid/os/Bundle;
+Landroid/content/BroadcastReceiver$PendingResult;->mSendingUser:I
+Landroid/content/BroadcastReceiver$PendingResult;->mToken:Landroid/os/IBinder;
+Landroid/content/BroadcastReceiver$PendingResult;->mType:I
+Landroid/content/BroadcastReceiver;->getPendingResult()Landroid/content/BroadcastReceiver$PendingResult;
+Landroid/content/BroadcastReceiver;->setPendingResult(Landroid/content/BroadcastReceiver$PendingResult;)V
+Landroid/content/ClipData$Item;->mUri:Landroid/net/Uri;
+Landroid/content/ClipData;->addItem(Landroid/content/ClipData$Item;Landroid/content/ContentResolver;)V
+Landroid/content/ContentProvider;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Landroid/content/pm/PathPermission;)V
+Landroid/content/ContentProvider;->attachInfoForTesting(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V
+Landroid/content/ContentProvider;->coerceToLocalContentProvider(Landroid/content/IContentProvider;)Landroid/content/ContentProvider;
+Landroid/content/ContentProvider;->getIContentProvider()Landroid/content/IContentProvider;
+Landroid/content/ContentProvider;->mContext:Landroid/content/Context;
+Landroid/content/ContentProvider;->mPathPermissions:[Landroid/content/pm/PathPermission;
+Landroid/content/ContentProvider;->mReadPermission:Ljava/lang/String;
+Landroid/content/ContentProvider;->mWritePermission:Ljava/lang/String;
+Landroid/content/ContentProvider;->setAppOps(II)V
+Landroid/content/ContentProviderClient;->mContentProvider:Landroid/content/IContentProvider;
+Landroid/content/ContentProviderClient;->mPackageName:Ljava/lang/String;
+Landroid/content/ContentProviderOperation;->TYPE_DELETE:I
+Landroid/content/ContentProviderOperation;->TYPE_INSERT:I
+Landroid/content/ContentProviderOperation;->TYPE_UPDATE:I
+Landroid/content/ContentProviderOperation;->mSelection:Ljava/lang/String;
+Landroid/content/ContentProviderOperation;->mType:I
+Landroid/content/ContentProviderOperation;->mUri:Landroid/net/Uri;
+Landroid/content/ContentResolver;->acquireExistingProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider;
+Landroid/content/ContentResolver;->acquireProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider;
+Landroid/content/ContentResolver;->acquireProvider(Landroid/net/Uri;)Landroid/content/IContentProvider;
+Landroid/content/ContentResolver;->acquireProvider(Ljava/lang/String;)Landroid/content/IContentProvider;
+Landroid/content/ContentResolver;->acquireUnstableProvider(Landroid/content/Context;Ljava/lang/String;)Landroid/content/IContentProvider;
+Landroid/content/ContentResolver;->getContentService()Landroid/content/IContentService;
+Landroid/content/ContentResolver;->getSyncStatus(Landroid/accounts/Account;Ljava/lang/String;)Landroid/content/SyncStatusInfo;
+Landroid/content/ContentResolver;->mContext:Landroid/content/Context;
+Landroid/content/ContentResolver;->mPackageName:Ljava/lang/String;
+Landroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
+Landroid/content/ContentResolver;->releaseProvider(Landroid/content/IContentProvider;)Z
+Landroid/content/ContentResolver;->releaseUnstableProvider(Landroid/content/IContentProvider;)Z
+Landroid/content/ContentResolver;->takePersistableUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V
+Landroid/content/ContentResolver;->unstableProviderDied(Landroid/content/IContentProvider;)V
+Landroid/content/ContentValues;-><init>(Ljava/util/HashMap;)V
+Landroid/content/ContentValues;->getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
+Landroid/content/ContentValues;->mValues:Ljava/util/HashMap;
+Landroid/content/ContentValues;->putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
+Landroid/content/Context;->getBasePackageName()Ljava/lang/String;
+Landroid/content/Context;->getOpPackageName()Ljava/lang/String;
+Landroid/content/Context;->getSharedPreferences(Ljava/io/File;I)Landroid/content/SharedPreferences;
+Landroid/content/Context;->getSharedPreferencesPath(Ljava/lang/String;)Ljava/io/File;
+Landroid/content/Context;->getSharedPrefsFile(Ljava/lang/String;)Ljava/io/File;
+Landroid/content/Context;->getThemeResId()I
+Landroid/content/Context;->registerReceiverAsUser(Landroid/content/BroadcastReceiver;Landroid/os/UserHandle;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
+Landroid/content/Context;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;I)V
+Landroid/content/Context;->sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;ILandroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
+Landroid/content/Context;->sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;ILandroid/os/Bundle;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V
+Landroid/content/Context;->startActivityAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
+Landroid/content/Context;->startServiceAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/ComponentName;
+Landroid/content/ContextWrapper;->getDisplay()Landroid/view/Display;
+Landroid/content/ContextWrapper;->getSharedPreferences(Ljava/io/File;I)Landroid/content/SharedPreferences;
+Landroid/content/ContextWrapper;->getSharedPreferencesPath(Ljava/lang/String;)Ljava/io/File;
+Landroid/content/ContextWrapper;->getThemeResId()I
+Landroid/content/ContextWrapper;->mBase:Landroid/content/Context;
+Landroid/content/CursorLoader;->mCancellationSignal:Landroid/os/CancellationSignal;
+Landroid/content/CursorLoader;->mObserver:Landroid/content/Loader$ForceLoadContentObserver;
+Landroid/content/IClipboard$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/IClipboard$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IClipboard;
+Landroid/content/IContentProvider;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
+Landroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/IContentService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IContentService;
+Landroid/content/IContentService;->cancelSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)V
+Landroid/content/IContentService;->getMasterSyncAutomatically()Z
+Landroid/content/IContentService;->setMasterSyncAutomatically(Z)V
+Landroid/content/IIntentReceiver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/IIntentReceiver$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/IIntentReceiver$Stub;-><init>()V
+Landroid/content/IIntentReceiver;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+Landroid/content/IRestrictionsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IRestrictionsManager;
+Landroid/content/ISyncAdapter$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/ISyncAdapter$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/ISyncContext$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/ISyncContext$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/ISyncContext$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/ISyncContext;
+Landroid/content/ISyncStatusObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/ISyncStatusObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/Intent;->ACTION_ALARM_CHANGED:Ljava/lang/String;
+Landroid/content/Intent;->ACTION_DEVICE_INITIALIZATION_WIZARD:Ljava/lang/String;
+Landroid/content/Intent;->ACTION_MASTER_CLEAR:Ljava/lang/String;
+Landroid/content/Intent;->ACTION_SERVICE_STATE:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_CDMA_ROAMING_INDICATOR:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_CSS_INDICATOR:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_DATA_OPERATOR_ALPHA_LONG:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_DATA_OPERATOR_ALPHA_SHORT:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_DATA_OPERATOR_NUMERIC:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_DATA_RADIO_TECH:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_DATA_REG_STATE:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_DATA_ROAMING_TYPE:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_EMERGENCY_ONLY:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_IS_USING_CARRIER_AGGREGATION:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_LTE_EARFCN_RSRP_BOOST:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_MANUAL:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_NETWORK_ID:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_OPERATOR_ALPHA_LONG:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_OPERATOR_ALPHA_SHORT:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_OPERATOR_NUMERIC:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_QUICK_VIEW_ADVANCED:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_SYSTEM_ID:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_VOICE_RADIO_TECH:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_VOICE_REG_STATE:Ljava/lang/String;
+Landroid/content/Intent;->EXTRA_VOICE_ROAMING_TYPE:Ljava/lang/String;
+Landroid/content/Intent;->getExtra(Ljava/lang/String;)Ljava/lang/Object;
+Landroid/content/Intent;->getIBinderExtra(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/content/Intent;->mExtras:Landroid/os/Bundle;
+Landroid/content/Intent;->prepareToLeaveProcess(Landroid/content/Context;)V
+Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/IBinder;)Landroid/content/Intent;
+Landroid/content/Intent;->resolveSystemService(Landroid/content/pm/PackageManager;I)Landroid/content/ComponentName;
+Landroid/content/Intent;->setAllowFds(Z)V
+Landroid/content/Intent;->toInsecureString()Ljava/lang/String;
+Landroid/content/IntentFilter;->mActions:Ljava/util/ArrayList;
+Landroid/content/IntentSender;-><init>(Landroid/content/IIntentSender;)V
+Landroid/content/IntentSender;->mTarget:Landroid/content/IIntentSender;
+Landroid/content/RestrictionsManager;->mService:Landroid/content/IRestrictionsManager;
+Landroid/content/SearchRecentSuggestionsProvider;->mSuggestionProjection:[Ljava/lang/String;
+Landroid/content/SyncAdapterType;->allowParallelSyncs:Z
+Landroid/content/SyncAdapterType;->isAlwaysSyncable:Z
+Landroid/content/SyncAdapterType;->settingsActivity:Ljava/lang/String;
+Landroid/content/SyncContext;->setStatusText(Ljava/lang/String;)V
+Landroid/content/SyncInfo;-><init>(ILandroid/accounts/Account;Ljava/lang/String;J)V
+Landroid/content/SyncRequest;->mAccountToSync:Landroid/accounts/Account;
+Landroid/content/SyncRequest;->mAuthority:Ljava/lang/String;
+Landroid/content/SyncRequest;->mExtras:Landroid/os/Bundle;
+Landroid/content/SyncRequest;->mIsPeriodic:Z
+Landroid/content/SyncRequest;->mSyncRunTimeSecs:J
+Landroid/content/SyncStatusInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/content/SyncStatusInfo;->CREATOR:Landroid/os/Parcelable$Creator;
+Landroid/content/SyncStatusInfo;->authorityId:I
+Landroid/content/SyncStatusInfo;->ensurePeriodicSyncTimeSize(I)V
+Landroid/content/SyncStatusInfo;->initialFailureTime:J
+Landroid/content/SyncStatusInfo;->initialize:Z
+Landroid/content/SyncStatusInfo;->lastFailureMesg:Ljava/lang/String;
+Landroid/content/SyncStatusInfo;->lastFailureSource:I
+Landroid/content/SyncStatusInfo;->lastFailureTime:J
+Landroid/content/SyncStatusInfo;->lastSuccessSource:I
+Landroid/content/SyncStatusInfo;->lastSuccessTime:J
+Landroid/content/SyncStatusInfo;->pending:Z
+Landroid/content/SyncStatusInfo;->periodicSyncTimes:Ljava/util/ArrayList;
+Landroid/content/UriMatcher;->mChildren:Ljava/util/ArrayList;
+Landroid/content/UriMatcher;->mText:Ljava/lang/String;
+Landroid/content/pm/ActivityInfo;->isResizeableMode(I)Z
+Landroid/content/pm/ActivityInfo;->resizeMode:I
+Landroid/content/pm/ActivityInfo;->supportsPictureInPicture()Z
+Landroid/content/pm/ApplicationInfo;->enabledSetting:I
+Landroid/content/pm/ApplicationInfo;->getBaseResourcePath()Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->installLocation:I
+Landroid/content/pm/ApplicationInfo;->isForwardLocked()Z
+Landroid/content/pm/ApplicationInfo;->primaryCpuAbi:Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->privateFlags:I
+Landroid/content/pm/ApplicationInfo;->scanPublicSourceDir:Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->scanSourceDir:Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->secondaryCpuAbi:Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->secondaryNativeLibraryDir:Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->versionCode:I
+Landroid/content/pm/ApplicationInfo;->volumeUuid:Ljava/lang/String;
+Landroid/content/pm/ComponentInfo;->encryptionAware:Z
+Landroid/content/pm/ComponentInfo;->getComponentName()Landroid/content/ComponentName;
+Landroid/content/pm/IPackageDataObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/pm/IPackageDataObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/pm/IPackageDataObserver$Stub;-><init>()V
+Landroid/content/pm/IPackageDataObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDataObserver;
+Landroid/content/pm/IPackageDataObserver;->onRemoveCompleted(Ljava/lang/String;Z)V
+Landroid/content/pm/IPackageDeleteObserver$Stub;-><init>()V
+Landroid/content/pm/IPackageDeleteObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDeleteObserver;
+Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/pm/IPackageDeleteObserver2;->onPackageDeleted(Ljava/lang/String;ILjava/lang/String;)V
+Landroid/content/pm/IPackageDeleteObserver;->packageDeleted(Ljava/lang/String;I)V
+Landroid/content/pm/IPackageInstallObserver2$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/pm/IPackageInstallObserver2$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/pm/IPackageInstallObserver2$Stub;-><init>()V
+Landroid/content/pm/IPackageInstallObserver2;->onPackageInstalled(Ljava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V
+Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/pm/IPackageInstallerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallerCallback;
+Landroid/content/pm/IPackageInstallerCallback;->onSessionActiveChanged(IZ)V
+Landroid/content/pm/IPackageInstallerCallback;->onSessionBadgingChanged(I)V
+Landroid/content/pm/IPackageInstallerCallback;->onSessionCreated(I)V
+Landroid/content/pm/IPackageInstallerCallback;->onSessionFinished(IZ)V
+Landroid/content/pm/IPackageInstallerCallback;->onSessionProgressChanged(IF)V
+Landroid/content/pm/IPackageInstallerSession$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/pm/IPackageInstallerSession$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/pm/IPackageInstallerSession$Stub;-><init>()V
+Landroid/content/pm/IPackageInstallerSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallerSession;
+Landroid/content/pm/IPackageManager$Stub$Proxy;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
+Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
+Landroid/content/pm/IPackageManager$Stub$Proxy;->getPackagesForUid(I)[Ljava/lang/String;
+Landroid/content/pm/IPackageManager$Stub$Proxy;->getSystemSharedLibraryNames()[Ljava/lang/String;
+Landroid/content/pm/IPackageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageManager;
+Landroid/content/pm/IPackageManager;->addPermission(Landroid/content/pm/PermissionInfo;)Z
+Landroid/content/pm/IPackageManager;->addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z
+Landroid/content/pm/IPackageManager;->getActivityInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/IPackageManager;->getApplicationInfo(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
+Landroid/content/pm/IPackageManager;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I
+Landroid/content/pm/IPackageManager;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName;
+Landroid/content/pm/IPackageManager;->getInstallLocation()I
+Landroid/content/pm/IPackageManager;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
+Landroid/content/pm/IPackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
+Landroid/content/pm/IPackageManager;->getLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;I)Landroid/content/pm/ResolveInfo;
+Landroid/content/pm/IPackageManager;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
+Landroid/content/pm/IPackageManager;->getProviderInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ProviderInfo;
+Landroid/content/pm/IPackageManager;->getReceiverInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/IPackageManager;->getServiceInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ServiceInfo;
+Landroid/content/pm/IPackageManager;->setApplicationEnabledSetting(Ljava/lang/String;IIILjava/lang/String;)V
+Landroid/content/pm/IPackageManager;->setComponentEnabledSetting(Landroid/content/ComponentName;III)V
+Landroid/content/pm/IPackageManager;->setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/content/pm/IPackageManager;->setLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;ILandroid/content/IntentFilter;ILandroid/content/ComponentName;)V
+Landroid/content/pm/IPackageMoveObserver$Stub;-><init>()V
+Landroid/content/pm/IPackageMoveObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageMoveObserver;
+Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/content/pm/IPackageStatsObserver$Stub;-><init>()V
+Landroid/content/pm/IPackageStatsObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageStatsObserver;
+Landroid/content/pm/IPackageStatsObserver;->onGetStatsCompleted(Landroid/content/pm/PackageStats;Z)V
+Landroid/content/pm/IShortcutService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/content/pm/IShortcutService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IShortcutService;
+Landroid/content/pm/LauncherActivityInfo;->mActivityInfo:Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/LauncherApps;->mPm:Landroid/content/pm/PackageManager;
+Landroid/content/pm/LauncherApps;->startShortcut(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;Landroid/os/Bundle;I)V
+Landroid/content/pm/PackageInfo;->INSTALL_LOCATION_UNSPECIFIED:I
+Landroid/content/pm/PackageInfo;->REQUESTED_PERMISSION_REQUIRED:I
+Landroid/content/pm/PackageInstaller$SessionInfo;-><init>()V
+Landroid/content/pm/PackageInstaller$SessionInfo;->active:Z
+Landroid/content/pm/PackageInstaller$SessionInfo;->appIcon:Landroid/graphics/Bitmap;
+Landroid/content/pm/PackageInstaller$SessionInfo;->appLabel:Ljava/lang/CharSequence;
+Landroid/content/pm/PackageInstaller$SessionInfo;->appPackageName:Ljava/lang/String;
+Landroid/content/pm/PackageInstaller$SessionInfo;->installerPackageName:Ljava/lang/String;
+Landroid/content/pm/PackageInstaller$SessionInfo;->mode:I
+Landroid/content/pm/PackageInstaller$SessionInfo;->progress:F
+Landroid/content/pm/PackageInstaller$SessionInfo;->resolvedBaseCodePath:Ljava/lang/String;
+Landroid/content/pm/PackageInstaller$SessionInfo;->sealed:Z
+Landroid/content/pm/PackageInstaller$SessionInfo;->sessionId:I
+Landroid/content/pm/PackageInstaller$SessionInfo;->sizeBytes:J
+Landroid/content/pm/PackageInstaller$SessionParams;->appIcon:Landroid/graphics/Bitmap;
+Landroid/content/pm/PackageInstaller$SessionParams;->appLabel:Ljava/lang/String;
+Landroid/content/pm/PackageInstaller$SessionParams;->appPackageName:Ljava/lang/String;
+Landroid/content/pm/PackageInstaller$SessionParams;->installFlags:I
+Landroid/content/pm/PackageInstaller$SessionParams;->mode:I
+Landroid/content/pm/PackageInstaller$SessionParams;->sizeBytes:J
+Landroid/content/pm/PackageItemInfo;->setForceSafeLabels(Z)V
+Landroid/content/pm/PackageManager;->NO_NATIVE_LIBRARIES:I
+Landroid/content/pm/PackageManager;->buildRequestPermissionsIntent([Ljava/lang/String;)Landroid/content/Intent;
+Landroid/content/pm/PackageManager;->freeStorage(JLandroid/content/IntentSender;)V
+Landroid/content/pm/PackageManager;->freeStorage(Ljava/lang/String;JLandroid/content/IntentSender;)V
+Landroid/content/pm/PackageManager;->freeStorageAndNotify(JLandroid/content/pm/IPackageDataObserver;)V
+Landroid/content/pm/PackageManager;->freeStorageAndNotify(Ljava/lang/String;JLandroid/content/pm/IPackageDataObserver;)V
+Landroid/content/pm/PackageManager;->getApplicationInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
+Landroid/content/pm/PackageManager;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName;
+Landroid/content/pm/PackageManager;->getPackageCandidateVolumes(Landroid/content/pm/ApplicationInfo;)Ljava/util/List;
+Landroid/content/pm/PackageManager;->getPackageInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
+Landroid/content/pm/PackageManager;->getPackageSizeInfo(Ljava/lang/String;Landroid/content/pm/IPackageStatsObserver;)V
+Landroid/content/pm/PackageManager;->getResourcesForApplicationAsUser(Ljava/lang/String;I)Landroid/content/res/Resources;
+Landroid/content/pm/PackageManager;->movePackage(Ljava/lang/String;Landroid/os/storage/VolumeInfo;)I
+Landroid/content/pm/PackageManager;->queryBroadcastReceivers(Landroid/content/Intent;II)Ljava/util/List;
+Landroid/content/pm/PackageManager;->setInstantAppCookie([B)Z
+Landroid/content/pm/PackageParser$Activity;->info:Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/PackageParser$ActivityIntentInfo;->activity:Landroid/content/pm/PackageParser$Activity;
+Landroid/content/pm/PackageParser$Component;->className:Ljava/lang/String;
+Landroid/content/pm/PackageParser$Component;->getComponentName()Landroid/content/ComponentName;
+Landroid/content/pm/PackageParser$Component;->intents:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Component;->metaData:Landroid/os/Bundle;
+Landroid/content/pm/PackageParser$Instrumentation;->info:Landroid/content/pm/InstrumentationInfo;
+Landroid/content/pm/PackageParser$IntentInfo;-><init>()V
+Landroid/content/pm/PackageParser$IntentInfo;->banner:I
+Landroid/content/pm/PackageParser$IntentInfo;->hasDefault:Z
+Landroid/content/pm/PackageParser$IntentInfo;->icon:I
+Landroid/content/pm/PackageParser$IntentInfo;->labelRes:I
+Landroid/content/pm/PackageParser$IntentInfo;->logo:I
+Landroid/content/pm/PackageParser$IntentInfo;->nonLocalizedLabel:Ljava/lang/CharSequence;
+Landroid/content/pm/PackageParser$Package;->activities:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->applicationInfo:Landroid/content/pm/ApplicationInfo;
+Landroid/content/pm/PackageParser$Package;->configPreferences:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->instrumentation:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->mAppMetaData:Landroid/os/Bundle;
+Landroid/content/pm/PackageParser$Package;->mKeySetMapping:Landroid/util/ArrayMap;
+Landroid/content/pm/PackageParser$Package;->mPreferredOrder:I
+Landroid/content/pm/PackageParser$Package;->mSharedUserId:Ljava/lang/String;
+Landroid/content/pm/PackageParser$Package;->mSharedUserLabel:I
+Landroid/content/pm/PackageParser$Package;->mVersionCode:I
+Landroid/content/pm/PackageParser$Package;->mVersionName:Ljava/lang/String;
+Landroid/content/pm/PackageParser$Package;->packageName:Ljava/lang/String;
+Landroid/content/pm/PackageParser$Package;->permissionGroups:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->permissions:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->providers:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->receivers:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->reqFeatures:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->requestedPermissions:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->services:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->usesLibraries:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->usesOptionalLibraries:Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Provider;->info:Landroid/content/pm/ProviderInfo;
+Landroid/content/pm/PackageParser$ProviderIntentInfo;->provider:Landroid/content/pm/PackageParser$Provider;
+Landroid/content/pm/PackageParser$Service;->info:Landroid/content/pm/ServiceInfo;
+Landroid/content/pm/PackageParser$ServiceIntentInfo;->service:Landroid/content/pm/PackageParser$Service;
+Landroid/content/pm/PackageParser;-><init>()V
+Landroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Ljava/io/File;Z)V
+Landroid/content/pm/PackageParser;->collectCertificates(Landroid/content/pm/PackageParser$Package;Z)V
+Landroid/content/pm/PackageParser;->generateActivityInfo(Landroid/content/pm/PackageParser$Activity;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/PackageParser;->generateApplicationInfo(Landroid/content/pm/PackageParser$Package;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ApplicationInfo;
+Landroid/content/pm/PackageParser;->generateInstrumentationInfo(Landroid/content/pm/PackageParser$Instrumentation;I)Landroid/content/pm/InstrumentationInfo;
+Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;)Landroid/content/pm/PackageInfo;
+Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo;
+Landroid/content/pm/PackageParser;->generatePermissionGroupInfo(Landroid/content/pm/PackageParser$PermissionGroup;I)Landroid/content/pm/PermissionGroupInfo;
+Landroid/content/pm/PackageParser;->generatePermissionInfo(Landroid/content/pm/PackageParser$Permission;I)Landroid/content/pm/PermissionInfo;
+Landroid/content/pm/PackageParser;->generateProviderInfo(Landroid/content/pm/PackageParser$Provider;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ProviderInfo;
+Landroid/content/pm/PackageParser;->generateServiceInfo(Landroid/content/pm/PackageParser$Service;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ServiceInfo;
+Landroid/content/pm/PackageParser;->parseBaseApk(Ljava/lang/String;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/PackageParser;->parseMonolithicPackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;IZ)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/PackageUserState;-><init>()V
+Landroid/content/pm/ParceledListSlice;-><init>(Ljava/util/List;)V
+Landroid/content/pm/ResolveInfo;->instantAppAvailable:Z
+Landroid/content/pm/SharedLibraryInfo;->isBuiltin()Z
+Landroid/content/pm/SharedLibraryInfo;->isDynamic()Z
+Landroid/content/pm/SharedLibraryInfo;->isStatic()Z
+Landroid/content/pm/ShortcutManager;->mService:Landroid/content/pm/IShortcutService;
+Landroid/content/pm/Signature;->getPublicKey()Ljava/security/PublicKey;
+Landroid/content/pm/UserInfo;-><init>(ILjava/lang/String;I)V
+Landroid/content/pm/UserInfo;->FLAG_PRIMARY:I
+Landroid/content/pm/UserInfo;->id:I
+Landroid/content/pm/UserInfo;->isPrimary()Z
+Landroid/content/pm/UserInfo;->serialNumber:I
+Landroid/content/res/AssetFileDescriptor;->mFd:Landroid/os/ParcelFileDescriptor;
+Landroid/content/res/AssetFileDescriptor;->mLength:J
+Landroid/content/res/AssetFileDescriptor;->mStartOffset:J
+Landroid/content/res/AssetManager;-><init>()V
+Landroid/content/res/AssetManager;->addAssetPath(Ljava/lang/String;)I
+Landroid/content/res/AssetManager;->addAssetPathAsSharedLibrary(Ljava/lang/String;)I
+Landroid/content/res/AssetManager;->applyStyle(JIILandroid/content/res/XmlBlock$Parser;[IJJ)V
+Landroid/content/res/AssetManager;->createTheme()J
+Landroid/content/res/AssetManager;->getAssignedPackageIdentifiers()Landroid/util/SparseArray;
+Landroid/content/res/AssetManager;->getResourceBagText(II)Ljava/lang/CharSequence;
+Landroid/content/res/AssetManager;->getResourceEntryName(I)Ljava/lang/String;
+Landroid/content/res/AssetManager;->getResourceIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
+Landroid/content/res/AssetManager;->getResourceName(I)Ljava/lang/String;
+Landroid/content/res/AssetManager;->getResourcePackageName(I)Ljava/lang/String;
+Landroid/content/res/AssetManager;->getResourceTypeName(I)Ljava/lang/String;
+Landroid/content/res/AssetManager;->isUpToDate()Z
+Landroid/content/res/AssetManager;->mObject:J
+Landroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;)Ljava/io/InputStream;
+Landroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;I)Ljava/io/InputStream;
+Landroid/content/res/AssetManager;->openNonAsset(Ljava/lang/String;)Ljava/io/InputStream;
+Landroid/content/res/AssetManager;->openNonAsset(Ljava/lang/String;I)Ljava/io/InputStream;
+Landroid/content/res/AssetManager;->resolveAttrs(JII[I[I[I[I)Z
+Landroid/content/res/AssetManager;->retrieveAttributes(Landroid/content/res/XmlBlock$Parser;[I[I[I)Z
+Landroid/content/res/AssetManager;->setConfiguration(IILjava/lang/String;IIIIIIIIIIIIIII)V
+Landroid/content/res/ColorStateList$ColorStateListFactory;-><init>(Landroid/content/res/ColorStateList;)V
+Landroid/content/res/ColorStateList;->getColors()[I
+Landroid/content/res/ColorStateList;->mColors:[I
+Landroid/content/res/ColorStateList;->mDefaultColor:I
+Landroid/content/res/ColorStateList;->mFactory:Landroid/content/res/ColorStateList$ColorStateListFactory;
+Landroid/content/res/ColorStateList;->mStateSpecs:[[I
+Landroid/content/res/ColorStateList;->onColorsChanged()V
+Landroid/content/res/CompatibilityInfo;-><init>(Landroid/content/pm/ApplicationInfo;IIZ)V
+Landroid/content/res/CompatibilityInfo;->DEFAULT_COMPATIBILITY_INFO:Landroid/content/res/CompatibilityInfo;
+Landroid/content/res/CompatibilityInfo;->applicationScale:F
+Landroid/content/res/DrawableCache;-><init>()V
+Landroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
+Landroid/content/res/ObbInfo;->salt:[B
+Landroid/content/res/Resources;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
+Landroid/content/res/Resources;->loadXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser;
+Landroid/content/res/Resources;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser;
+Landroid/content/res/Resources;->mClassLoader:Ljava/lang/ClassLoader;
+Landroid/content/res/Resources;->mDrawableInflater:Landroid/graphics/drawable/DrawableInflater;
+Landroid/content/res/Resources;->mResourcesImpl:Landroid/content/res/ResourcesImpl;
+Landroid/content/res/Resources;->mSystem:Landroid/content/res/Resources;
+Landroid/content/res/Resources;->mTmpValue:Landroid/util/TypedValue;
+Landroid/content/res/Resources;->mTypedArrayPool:Landroid/util/Pools$SynchronizedPool;
+Landroid/content/res/Resources;->selectDefaultTheme(II)I
+Landroid/content/res/Resources;->setCompatibilityInfo(Landroid/content/res/CompatibilityInfo;)V
+Landroid/content/res/Resources;->updateSystemConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V
+Landroid/content/res/ResourcesImpl;->TRACE_FOR_MISS_PRELOAD:Z
+Landroid/content/res/ResourcesImpl;->TRACE_FOR_PRELOAD:Z
+Landroid/content/res/ResourcesImpl;->getAssets()Landroid/content/res/AssetManager;
+Landroid/content/res/ResourcesImpl;->getValue(ILandroid/util/TypedValue;Z)V
+Landroid/content/res/ResourcesImpl;->mAccessLock:Ljava/lang/Object;
+Landroid/content/res/ResourcesImpl;->mAnimatorCache:Landroid/content/res/ConfigurationBoundResourceCache;
+Landroid/content/res/ResourcesImpl;->mAssets:Landroid/content/res/AssetManager;
+Landroid/content/res/ResourcesImpl;->mColorDrawableCache:Landroid/content/res/DrawableCache;
+Landroid/content/res/ResourcesImpl;->mConfiguration:Landroid/content/res/Configuration;
+Landroid/content/res/ResourcesImpl;->mDrawableCache:Landroid/content/res/DrawableCache;
+Landroid/content/res/ResourcesImpl;->mPreloading:Z
+Landroid/content/res/ResourcesImpl;->mStateListAnimatorCache:Landroid/content/res/ConfigurationBoundResourceCache;
+Landroid/content/res/ResourcesImpl;->sPreloadedColorDrawables:Landroid/util/LongSparseArray;
+Landroid/content/res/ResourcesImpl;->sPreloadedComplexColors:Landroid/util/LongSparseArray;
+Landroid/content/res/ResourcesImpl;->sPreloadedDrawables:[Landroid/util/LongSparseArray;
+Landroid/content/res/ResourcesKey;->mSplitResDirs:[Ljava/lang/String;
+Landroid/content/res/StringBlock;-><init>(JZ)V
+Landroid/content/res/ThemedResourceCache;->onConfigurationChange(I)V
+Landroid/content/res/TypedArray;->extractThemeAttrs()[I
+Landroid/content/res/TypedArray;->getNonConfigurationString(II)Ljava/lang/String;
+Landroid/content/res/TypedArray;->getValueAt(ILandroid/util/TypedValue;)Z
+Landroid/content/res/TypedArray;->mAssets:Landroid/content/res/AssetManager;
+Landroid/content/res/TypedArray;->mData:[I
+Landroid/content/res/TypedArray;->mIndices:[I
+Landroid/content/res/TypedArray;->mLength:I
+Landroid/content/res/TypedArray;->mMetrics:Landroid/util/DisplayMetrics;
+Landroid/content/res/TypedArray;->mRecycled:Z
+Landroid/content/res/TypedArray;->mResources:Landroid/content/res/Resources;
+Landroid/content/res/TypedArray;->mTheme:Landroid/content/res/Resources$Theme;
+Landroid/content/res/TypedArray;->mValue:Landroid/util/TypedValue;
+Landroid/content/res/TypedArray;->mXml:Landroid/content/res/XmlBlock$Parser;
+Landroid/content/res/XmlBlock$Parser;->mBlock:Landroid/content/res/XmlBlock;
+Landroid/content/res/XmlBlock$Parser;->mParseState:J
+Landroid/content/res/XmlBlock;-><init>([B)V
+Landroid/content/res/XmlBlock;->newParser()Landroid/content/res/XmlResourceParser;
+Landroid/database/AbstractCursor;->mCurrentRowID:Ljava/lang/Long;
+Landroid/database/AbstractCursor;->mExtras:Landroid/os/Bundle;
+Landroid/database/AbstractCursor;->mNotifyUri:Landroid/net/Uri;
+Landroid/database/AbstractCursor;->mRowIdColumnIndex:I
+Landroid/database/AbstractCursor;->mUpdatedRows:Ljava/util/HashMap;
+Landroid/database/AbstractWindowedCursor;->clearOrCreateWindow(Ljava/lang/String;)V
+Landroid/database/CursorWindow;->mWindowPtr:J
+Landroid/database/CursorWindow;->sCursorWindowSize:I
+Landroid/database/CursorWindow;->sWindowToPidMap:Landroid/util/LongSparseArray;
+Landroid/database/CursorWrapper;->mCursor:Landroid/database/Cursor;
+Landroid/database/sqlite/SQLiteCustomFunction;->dispatchCallback([Ljava/lang/String;)V
+Landroid/database/sqlite/SQLiteCustomFunction;->name:Ljava/lang/String;
+Landroid/database/sqlite/SQLiteCustomFunction;->numArgs:I
+Landroid/database/sqlite/SQLiteDatabase;->CONFLICT_VALUES:[Ljava/lang/String;
+Landroid/database/sqlite/SQLiteDatabase;->mConfigurationLocked:Landroid/database/sqlite/SQLiteDatabaseConfiguration;
+Landroid/database/sqlite/SQLiteDatabase;->mConnectionPoolLocked:Landroid/database/sqlite/SQLiteConnectionPool;
+Landroid/database/sqlite/SQLiteDatabase;->reopenReadWrite()V
+Landroid/database/sqlite/SQLiteDatabaseConfiguration;->maxSqlCacheSize:I
+Landroid/database/sqlite/SQLiteDebug$PagerStats;->largestMemAlloc:I
+Landroid/database/sqlite/SQLiteDebug$PagerStats;->memoryUsed:I
+Landroid/database/sqlite/SQLiteDebug$PagerStats;->pageCacheOverflow:I
+Landroid/database/sqlite/SQLiteOpenHelper;->mName:Ljava/lang/String;
+Landroid/database/sqlite/SQLiteStatement;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V
+Landroid/database/sqlite/SqliteWrapper;->insert(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;
+Landroid/database/sqlite/SqliteWrapper;->query(Landroid/content/Context;Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
+Landroid/ddm/DdmHandleAppName;->getAppName()Ljava/lang/String;
+Landroid/ddm/DdmHandleAppName;->setAppName(Ljava/lang/String;I)V
+Landroid/graphics/AvoidXfermode$Mode;
+Landroid/graphics/AvoidXfermode$Mode;->AVOID:Landroid/graphics/AvoidXfermode$Mode;
+Landroid/graphics/AvoidXfermode$Mode;->TARGET:Landroid/graphics/AvoidXfermode$Mode;
+Landroid/graphics/AvoidXfermode$Mode;->valueOf(Ljava/lang/String;)Landroid/graphics/AvoidXfermode$Mode;
+Landroid/graphics/AvoidXfermode$Mode;->values()[Landroid/graphics/AvoidXfermode$Mode;
+Landroid/graphics/AvoidXfermode;
+Landroid/graphics/AvoidXfermode;-><init>(IILandroid/graphics/AvoidXfermode$Mode;)V
+Landroid/graphics/BaseCanvas;->mNativeCanvasWrapper:J
+Landroid/graphics/Bitmap$Config;->nativeInt:I
+Landroid/graphics/Bitmap$Config;->nativeToConfig(I)Landroid/graphics/Bitmap$Config;
+Landroid/graphics/Bitmap;-><init>(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V
+Landroid/graphics/Bitmap;->createAshmemBitmap()Landroid/graphics/Bitmap;
+Landroid/graphics/Bitmap;->createAshmemBitmap(Landroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
+Landroid/graphics/Bitmap;->createGraphicBufferHandle()Landroid/graphics/GraphicBuffer;
+Landroid/graphics/Bitmap;->createHardwareBitmap(Landroid/graphics/GraphicBuffer;)Landroid/graphics/Bitmap;
+Landroid/graphics/Bitmap;->getDefaultDensity()I
+Landroid/graphics/Bitmap;->mNativePtr:J
+Landroid/graphics/Bitmap;->mNinePatchChunk:[B
+Landroid/graphics/Bitmap;->mNinePatchInsets:Landroid/graphics/NinePatch$InsetStruct;
+Landroid/graphics/Bitmap;->reinit(IIZ)V
+Landroid/graphics/Bitmap;->setDefaultDensity(I)V
+Landroid/graphics/BitmapFactory;->nativeDecodeAsset(JLandroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
+Landroid/graphics/BitmapFactory;->nativeDecodeByteArray([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
+Landroid/graphics/BitmapFactory;->nativeDecodeFileDescriptor(Ljava/io/FileDescriptor;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
+Landroid/graphics/BitmapFactory;->nativeDecodeStream(Ljava/io/InputStream;[BLandroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;
+Landroid/graphics/BitmapRegionDecoder;-><init>(J)V
+Landroid/graphics/Camera;->native_instance:J
+Landroid/graphics/Canvas;-><init>(J)V
+Landroid/graphics/Canvas;->CLIP_SAVE_FLAG:I
+Landroid/graphics/Canvas;->CLIP_TO_LAYER_SAVE_FLAG:I
+Landroid/graphics/Canvas;->FULL_COLOR_LAYER_SAVE_FLAG:I
+Landroid/graphics/Canvas;->HAS_ALPHA_LAYER_SAVE_FLAG:I
+Landroid/graphics/Canvas;->MATRIX_SAVE_FLAG:I
+Landroid/graphics/Canvas;->clipRegion(Landroid/graphics/Region;)Z
+Landroid/graphics/Canvas;->clipRegion(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z
+Landroid/graphics/Canvas;->release()V
+Landroid/graphics/Canvas;->save(I)I
+Landroid/graphics/ColorMatrixColorFilter;->setColorMatrix(Landroid/graphics/ColorMatrix;)V
+Landroid/graphics/FontFamily;-><init>()V
+Landroid/graphics/FontFamily;->abortCreation()V
+Landroid/graphics/FontFamily;->addFontFromAssetManager(Landroid/content/res/AssetManager;Ljava/lang/String;IZIII[Landroid/graphics/fonts/FontVariationAxis;)Z
+Landroid/graphics/FontFamily;->addFontFromBuffer(Ljava/nio/ByteBuffer;I[Landroid/graphics/fonts/FontVariationAxis;II)Z
+Landroid/graphics/FontFamily;->freeze()Z
+Landroid/graphics/GraphicBuffer;-><init>(IIIIJ)V
+Landroid/graphics/GraphicBuffer;->CREATOR:Landroid/os/Parcelable$Creator;
+Landroid/graphics/GraphicBuffer;->createFromExisting(IIIIJ)Landroid/graphics/GraphicBuffer;
+Landroid/graphics/GraphicBuffer;->mNativeObject:J
+Landroid/graphics/ImageDecoder$IncompleteException;
+Landroid/graphics/ImageDecoder$IncompleteException;-><init>()V
+Landroid/graphics/ImageDecoder;->ERROR_SOURCE_ERROR:I
+Landroid/graphics/ImageDecoder;->ERROR_SOURCE_EXCEPTION:I
+Landroid/graphics/ImageDecoder;->ERROR_SOURCE_INCOMPLETE:I
+Landroid/graphics/ImageDecoder;->getAsAlphaMask()Z
+Landroid/graphics/ImageDecoder;->getConserveMemory()Z
+Landroid/graphics/ImageDecoder;->getDecodeAsAlphaMask()Z
+Landroid/graphics/ImageDecoder;->getMutable()Z
+Landroid/graphics/ImageDecoder;->getRequireUnpremultiplied()Z
+Landroid/graphics/ImageDecoder;->postProcessAndRelease(Landroid/graphics/Canvas;)I
+Landroid/graphics/ImageDecoder;->setAsAlphaMask(Z)Landroid/graphics/ImageDecoder;
+Landroid/graphics/ImageDecoder;->setConserveMemory(Z)V
+Landroid/graphics/ImageDecoder;->setDecodeAsAlphaMask(Z)Landroid/graphics/ImageDecoder;
+Landroid/graphics/ImageDecoder;->setMutable(Z)Landroid/graphics/ImageDecoder;
+Landroid/graphics/ImageDecoder;->setRequireUnpremultiplied(Z)Landroid/graphics/ImageDecoder;
+Landroid/graphics/ImageDecoder;->setResize(I)Landroid/graphics/ImageDecoder;
+Landroid/graphics/ImageDecoder;->setResize(II)Landroid/graphics/ImageDecoder;
+Landroid/graphics/Insets;->left:I
+Landroid/graphics/Insets;->right:I
+Landroid/graphics/LayerRasterizer;
+Landroid/graphics/LayerRasterizer;-><init>()V
+Landroid/graphics/LayerRasterizer;->addLayer(Landroid/graphics/Paint;)V
+Landroid/graphics/LayerRasterizer;->addLayer(Landroid/graphics/Paint;FF)V
+Landroid/graphics/LinearGradient;->mColors:[I
+Landroid/graphics/Matrix;->native_instance:J
+Landroid/graphics/Movie;-><init>(J)V
+Landroid/graphics/Movie;->mNativeMovie:J
+Landroid/graphics/NinePatch$InsetStruct;-><init>(IIIIIIIIFIF)V
+Landroid/graphics/NinePatch;->mBitmap:Landroid/graphics/Bitmap;
+Landroid/graphics/Paint;->getRasterizer()Landroid/graphics/Rasterizer;
+Landroid/graphics/Paint;->setRasterizer(Landroid/graphics/Rasterizer;)Landroid/graphics/Rasterizer;
+Landroid/graphics/Picture;->mNativePicture:J
+Landroid/graphics/PixelXorXfermode;
+Landroid/graphics/PixelXorXfermode;-><init>(I)V
+Landroid/graphics/PorterDuffColorFilter;->getColor()I
+Landroid/graphics/PorterDuffColorFilter;->setColor(I)V
+Landroid/graphics/PorterDuffColorFilter;->setMode(Landroid/graphics/PorterDuff$Mode;)V
+Landroid/graphics/Rasterizer;
+Landroid/graphics/Rasterizer;-><init>()V
+Landroid/graphics/Rect;->scale(F)V
+Landroid/graphics/Region;-><init>(JI)V
+Landroid/graphics/Region;->mNativeRegion:J
+Landroid/graphics/SurfaceTexture;->mFrameAvailableListener:J
+Landroid/graphics/SurfaceTexture;->mProducer:J
+Landroid/graphics/SurfaceTexture;->mSurfaceTexture:J
+Landroid/graphics/SurfaceTexture;->nativeDetachFromGLContext()I
+Landroid/graphics/SurfaceTexture;->postEventFromNative(Ljava/lang/ref/WeakReference;)V
+Landroid/graphics/Typeface;->createFromFamiliesWithDefault([Landroid/graphics/FontFamily;II)Landroid/graphics/Typeface;
+Landroid/graphics/Typeface;->createFromFamiliesWithDefault([Landroid/graphics/FontFamily;Ljava/lang/String;II)Landroid/graphics/Typeface;
+Landroid/graphics/Typeface;->mStyle:I
+Landroid/graphics/Typeface;->sDefaults:[Landroid/graphics/Typeface;
+Landroid/graphics/Typeface;->sSystemFontMap:Ljava/util/Map;
+Landroid/graphics/Typeface;->setDefault(Landroid/graphics/Typeface;)V
+Landroid/graphics/drawable/AnimatedImageDrawable;->LOOP_INFINITE:I
+Landroid/graphics/drawable/AnimatedImageDrawable;->getLoopCount(I)I
+Landroid/graphics/drawable/AnimatedImageDrawable;->onAnimationEnd()V
+Landroid/graphics/drawable/AnimatedImageDrawable;->setLoopCount(I)V
+Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mStateIds:Landroid/util/SparseIntArray;
+Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mTransitions:Landroid/util/LongSparseLongArray;
+Landroid/graphics/drawable/AnimatedStateListDrawable;->mState:Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;
+Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;->callOnFinished(Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorRT;I)V
+Landroid/graphics/drawable/AnimationDrawable;->mCurFrame:I
+Landroid/graphics/drawable/BitmapDrawable;->getOpticalInsets()Landroid/graphics/Insets;
+Landroid/graphics/drawable/BitmapDrawable;->getTint()Landroid/content/res/ColorStateList;
+Landroid/graphics/drawable/BitmapDrawable;->getTintMode()Landroid/graphics/PorterDuff$Mode;
+Landroid/graphics/drawable/BitmapDrawable;->mTargetDensity:I
+Landroid/graphics/drawable/BitmapDrawable;->setBitmap(Landroid/graphics/Bitmap;)V
+Landroid/graphics/drawable/ColorDrawable$ColorState;->mUseColor:I
+Landroid/graphics/drawable/Drawable;->getOpticalInsets()Landroid/graphics/Insets;
+Landroid/graphics/drawable/Drawable;->inflateWithAttributes(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/TypedArray;I)V
+Landroid/graphics/drawable/Drawable;->isProjected()Z
+Landroid/graphics/drawable/Drawable;->mCallback:Ljava/lang/ref/WeakReference;
+Landroid/graphics/drawable/Drawable;->parseTintMode(ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuff$Mode;
+Landroid/graphics/drawable/Drawable;->updateTintFilter(Landroid/graphics/PorterDuffColorFilter;Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter;
+Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mConstantPadding:Landroid/graphics/Rect;
+Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mDrawables:[Landroid/graphics/drawable/Drawable;
+Landroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets;
+Landroid/graphics/drawable/DrawableContainer;->mDrawableContainerState:Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;
+Landroid/graphics/drawable/DrawableInflater;->mClassLoader:Ljava/lang/ClassLoader;
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mAngle:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mGradient:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mGradientColors:[I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mHeight:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mInnerRadius:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mInnerRadiusRatio:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mOrientation:Landroid/graphics/drawable/GradientDrawable$Orientation;
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mPadding:Landroid/graphics/Rect;
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mPositions:[F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mRadius:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mRadiusArray:[F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mShape:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mSolidColors:Landroid/content/res/ColorStateList;
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeDashGap:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeDashWidth:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mStrokeWidth:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mThickness:I
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mThicknessRatio:F
+Landroid/graphics/drawable/GradientDrawable$GradientState;->mWidth:I
+Landroid/graphics/drawable/GradientDrawable;->getOpticalInsets()Landroid/graphics/Insets;
+Landroid/graphics/drawable/GradientDrawable;->mGradientState:Landroid/graphics/drawable/GradientDrawable$GradientState;
+Landroid/graphics/drawable/GradientDrawable;->mPadding:Landroid/graphics/Rect;
+Landroid/graphics/drawable/Icon;->getBitmap()Landroid/graphics/Bitmap;
+Landroid/graphics/drawable/Icon;->getDataBytes()[B
+Landroid/graphics/drawable/Icon;->getDataLength()I
+Landroid/graphics/drawable/Icon;->getDataOffset()I
+Landroid/graphics/drawable/Icon;->getResources()Landroid/content/res/Resources;
+Landroid/graphics/drawable/Icon;->hasTint()Z
+Landroid/graphics/drawable/Icon;->mString1:Ljava/lang/String;
+Landroid/graphics/drawable/Icon;->mType:I
+Landroid/graphics/drawable/InsetDrawable;->mState:Landroid/graphics/drawable/InsetDrawable$InsetState;
+Landroid/graphics/drawable/LayerDrawable$ChildDrawable;->mDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/graphics/drawable/LayerDrawable$LayerState;->mChildren:[Landroid/graphics/drawable/LayerDrawable$ChildDrawable;
+Landroid/graphics/drawable/LayerDrawable;->mLayerState:Landroid/graphics/drawable/LayerDrawable$LayerState;
+Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;->mNinePatch:Landroid/graphics/NinePatch;
+Landroid/graphics/drawable/NinePatchDrawable;->mNinePatchState:Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;
+Landroid/graphics/drawable/RippleDrawable$RippleState;->mColor:Landroid/content/res/ColorStateList;
+Landroid/graphics/drawable/RippleDrawable;->mState:Landroid/graphics/drawable/RippleDrawable$RippleState;
+Landroid/graphics/drawable/StateListDrawable;->extractStateSet(Landroid/util/AttributeSet;)[I
+Landroid/graphics/drawable/StateListDrawable;->getStateCount()I
+Landroid/graphics/drawable/StateListDrawable;->getStateDrawable(I)Landroid/graphics/drawable/Drawable;
+Landroid/graphics/drawable/StateListDrawable;->getStateDrawableIndex([I)I
+Landroid/graphics/drawable/StateListDrawable;->getStateSet(I)[I
+Landroid/graphics/drawable/StateListDrawable;->mStateListState:Landroid/graphics/drawable/StateListDrawable$StateListState;
+Landroid/graphics/drawable/StateListDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V
+Landroid/graphics/drawable/VectorDrawable$VGroup;->setRotation(F)V
+Landroid/graphics/drawable/VectorDrawable;->getTargetByName(Ljava/lang/String;)Ljava/lang/Object;
+Landroid/graphics/drawable/VectorDrawable;->mTintFilter:Landroid/graphics/PorterDuffColorFilter;
+Landroid/graphics/drawable/VectorDrawable;->setAllowCaching(Z)V
+Landroid/graphics/fonts/FontVariationAxis;->mStyleValue:F
+Landroid/graphics/fonts/FontVariationAxis;->mTag:I
+Landroid/hardware/Camera;->addCallbackBuffer([BI)V
+Landroid/hardware/Camera;->mNativeContext:J
+Landroid/hardware/Camera;->native_setup(Ljava/lang/Object;IILjava/lang/String;)I
+Landroid/hardware/Camera;->openLegacy(II)Landroid/hardware/Camera;
+Landroid/hardware/Camera;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
+Landroid/hardware/HardwareBuffer;-><init>(J)V
+Landroid/hardware/HardwareBuffer;->destroy()V
+Landroid/hardware/HardwareBuffer;->isDestroyed()Z
+Landroid/hardware/HardwareBuffer;->mNativeObject:J
+Landroid/hardware/ICameraService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/ICameraService;
+Landroid/hardware/SensorDirectChannel;->isValid()Z
+Landroid/hardware/SensorManager;->configureDirectChannel(Landroid/hardware/SensorDirectChannel;Landroid/hardware/Sensor;I)I
+Landroid/hardware/SerialPort;->mNativeContext:I
+Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchAdditionalInfoEvent(III[F[I)V
+Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchFlushCompleteEvent(I)V
+Landroid/hardware/SystemSensorManager$BaseEventQueue;->dispatchSensorEvent(I[FIJ)V
+Landroid/hardware/camera2/CameraAccessException;->serialVersionUID:J
+Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V
+Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
+Landroid/hardware/camera2/CameraCharacteristics$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V
+Landroid/hardware/camera2/CameraCharacteristics$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->CONTROL_MAX_REGIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->LED_AVAILABLE_LEDS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->LENS_INFO_SHADING_MAP_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->LOGICAL_MULTI_CAMERA_PHYSICAL_IDS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->QUIRKS_USE_PARTIAL_RESULT:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->REQUEST_AVAILABLE_CHARACTERISTICS_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->REQUEST_AVAILABLE_REQUEST_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->REQUEST_AVAILABLE_RESULT_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->REQUEST_AVAILABLE_SESSION_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->REQUEST_MAX_NUM_OUTPUT_STREAMS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_FORMATS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_JPEG_MIN_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_JPEG_SIZES:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_PROCESSED_SIZES:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CameraCharacteristics;->SCALER_AVAILABLE_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;
+Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V
+Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
+Landroid/hardware/camera2/CaptureRequest$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V
+Landroid/hardware/camera2/CaptureRequest$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key;
+Landroid/hardware/camera2/CaptureRequest;->JPEG_GPS_COORDINATES:Landroid/hardware/camera2/CaptureRequest$Key;
+Landroid/hardware/camera2/CaptureRequest;->JPEG_GPS_PROCESSING_METHOD:Landroid/hardware/camera2/CaptureRequest$Key;
+Landroid/hardware/camera2/CaptureRequest;->JPEG_GPS_TIMESTAMP:Landroid/hardware/camera2/CaptureRequest$Key;
+Landroid/hardware/camera2/CaptureRequest;->LED_TRANSMIT:Landroid/hardware/camera2/CaptureRequest$Key;
+Landroid/hardware/camera2/CaptureRequest;->REQUEST_ID:Landroid/hardware/camera2/CaptureRequest$Key;
+Landroid/hardware/camera2/CaptureRequest;->TONEMAP_CURVE_BLUE:Landroid/hardware/camera2/CaptureRequest$Key;
+Landroid/hardware/camera2/CaptureRequest;->TONEMAP_CURVE_GREEN:Landroid/hardware/camera2/CaptureRequest$Key;
+Landroid/hardware/camera2/CaptureRequest;->TONEMAP_CURVE_RED:Landroid/hardware/camera2/CaptureRequest$Key;
+Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Landroid/hardware/camera2/utils/TypeReference;)V
+Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
+Landroid/hardware/camera2/CaptureResult$Key;-><init>(Ljava/lang/String;Ljava/lang/Class;J)V
+Landroid/hardware/camera2/CaptureResult$Key;->getNativeKey()Landroid/hardware/camera2/impl/CameraMetadataNative$Key;
+Landroid/hardware/camera2/CaptureResult;->JPEG_GPS_COORDINATES:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->JPEG_GPS_PROCESSING_METHOD:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->JPEG_GPS_TIMESTAMP:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->LED_TRANSMIT:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->QUIRKS_PARTIAL_RESULT:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->REQUEST_FRAME_COUNT:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->REQUEST_ID:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_FACE_IDS:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_FACE_LANDMARKS:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_FACE_RECTANGLES:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_FACE_SCORES:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_LENS_SHADING_MAP:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_OIS_TIMESTAMPS:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_OIS_X_SHIFTS:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_OIS_Y_SHIFTS:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_PREDICTED_COLOR_GAINS:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->STATISTICS_PREDICTED_COLOR_TRANSFORM:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->SYNC_FRAME_NUMBER:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->TONEMAP_CURVE_BLUE:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->TONEMAP_CURVE_GREEN:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/CaptureResult;->TONEMAP_CURVE_RED:Landroid/hardware/camera2/CaptureResult$Key;
+Landroid/hardware/camera2/impl/CameraMetadataNative$Key;->getTag()I
+Landroid/hardware/camera2/impl/CameraMetadataNative;->mMetadataPtr:J
+Landroid/hardware/camera2/utils/TypeReference;->createSpecializedTypeReference(Ljava/lang/reflect/Type;)Landroid/hardware/camera2/utils/TypeReference;
+Landroid/hardware/display/DisplayManagerGlobal;->getInstance()Landroid/hardware/display/DisplayManagerGlobal;
+Landroid/hardware/display/DisplayManagerGlobal;->getRealDisplay(I)Landroid/view/Display;
+Landroid/hardware/display/DisplayManagerGlobal;->mDm:Landroid/hardware/display/IDisplayManager;
+Landroid/hardware/display/DisplayManagerGlobal;->sInstance:Landroid/hardware/display/DisplayManagerGlobal;
+Landroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager;
+Landroid/hardware/display/WifiDisplayStatus;->mActiveDisplay:Landroid/hardware/display/WifiDisplay;
+Landroid/hardware/display/WifiDisplayStatus;->mDisplays:[Landroid/hardware/display/WifiDisplay;
+Landroid/hardware/fingerprint/IFingerprintService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/hardware/input/IInputManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/hardware/input/IInputManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/input/IInputManager;
+Landroid/hardware/input/InputManager;->INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH:I
+Landroid/hardware/input/InputManager;->getInstance()Landroid/hardware/input/InputManager;
+Landroid/hardware/input/InputManager;->injectInputEvent(Landroid/view/InputEvent;I)Z
+Landroid/hardware/input/InputManager;->mIm:Landroid/hardware/input/IInputManager;
+Landroid/hardware/location/GeofenceHardware;-><init>(Landroid/hardware/location/IGeofenceHardware;)V
+Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;-><init>()V
+Landroid/hardware/location/IActivityRecognitionHardwareClient;->onAvailabilityChanged(ZLandroid/hardware/location/IActivityRecognitionHardware;)V
+Landroid/hardware/location/IContextHubService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/location/IContextHubService;
+Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;-><init>(II)V
+Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;->confidenceLevel:I
+Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;->userId:I
+Landroid/hardware/soundtrigger/SoundTrigger$GenericRecognitionEvent;-><init>(IIZIIIZLandroid/media/AudioFormat;[B)V
+Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;-><init>(Ljava/util/UUID;Ljava/util/UUID;[B)V
+Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->id:I
+Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->locale:Ljava/lang/String;
+Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->recognitionModes:I
+Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->text:Ljava/lang/String;
+Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;->users:[I
+Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent;-><init>(IIZIIIZLandroid/media/AudioFormat;[B[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;)V
+Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;-><init>(III[Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;)V
+Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->coarseConfidenceLevel:I
+Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->confidenceLevels:[Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;
+Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->id:I
+Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;->recognitionModes:I
+Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;->keyphrases:[Landroid/hardware/soundtrigger/SoundTrigger$Keyphrase;
+Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;-><init>(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIIZIZIZ)V
+Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;-><init>(ZZ[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;[B)V
+Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;->captureRequested:Z
+Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;->data:[B
+Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;->keyphrases:[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;
+Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;-><init>(IIZIIIZLandroid/media/AudioFormat;[B)V
+Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;->data:[B
+Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;->data:[B
+Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;->uuid:Ljava/util/UUID;
+Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;->vendorUuid:Ljava/util/UUID;
+Landroid/hardware/soundtrigger/SoundTrigger$SoundModelEvent;-><init>(II[B)V
+Landroid/hardware/soundtrigger/SoundTriggerModule;->mId:I
+Landroid/hardware/soundtrigger/SoundTriggerModule;->mNativeContext:J
+Landroid/hardware/soundtrigger/SoundTriggerModule;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
+Landroid/hardware/usb/IUsbManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/hardware/usb/UsbDeviceConnection;->mNativeContext:J
+Landroid/hardware/usb/UsbManager;->getPortStatus(Landroid/hardware/usb/UsbPort;)Landroid/hardware/usb/UsbPortStatus;
+Landroid/hardware/usb/UsbManager;->getPorts()[Landroid/hardware/usb/UsbPort;
+Landroid/hardware/usb/UsbManager;->setCurrentFunction(Ljava/lang/String;Z)V
+Landroid/hardware/usb/UsbManager;->setPortRoles(Landroid/hardware/usb/UsbPort;II)V
+Landroid/hardware/usb/UsbPortStatus;->getCurrentDataRole()I
+Landroid/hardware/usb/UsbPortStatus;->getCurrentMode()I
+Landroid/hardware/usb/UsbPortStatus;->getCurrentPowerRole()I
+Landroid/hardware/usb/UsbPortStatus;->getSupportedRoleCombinations()I
+Landroid/hardware/usb/UsbPortStatus;->isConnected()Z
+Landroid/hardware/usb/UsbPortStatus;->isRoleCombinationSupported(II)Z
+Landroid/hardware/usb/UsbRequest;->mBuffer:Ljava/nio/ByteBuffer;
+Landroid/hardware/usb/UsbRequest;->mLength:I
+Landroid/hardware/usb/UsbRequest;->mNativeContext:J
+Landroid/icu/impl/CurrencyData;-><init>()V
+Landroid/icu/impl/TimeZoneGenericNames;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/impl/TimeZoneGenericNames;->serialVersionUID:J
+Landroid/icu/impl/locale/LocaleSyntaxException;->serialVersionUID:J
+Landroid/icu/impl/number/DecimalFormatProperties;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/impl/number/DecimalFormatProperties;->serialVersionUID:J
+Landroid/icu/impl/number/DecimalFormatProperties;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/math/BigDecimal;->serialVersionUID:J
+Landroid/icu/math/MathContext;->serialVersionUID:J
+Landroid/icu/text/ArabicShaping;->isAlefMaksouraChar(C)Z
+Landroid/icu/text/ArabicShaping;->isSeenTailFamilyChar(C)I
+Landroid/icu/text/ArabicShaping;->isTailChar(C)Z
+Landroid/icu/text/ArabicShaping;->isYehHamzaChar(C)Z
+Landroid/icu/text/ArabicShapingException;->serialVersionUID:J
+Landroid/icu/text/ChineseDateFormat$Field;->serialVersionUID:J
+Landroid/icu/text/ChineseDateFormat;->serialVersionUID:J
+Landroid/icu/text/ChineseDateFormatSymbols;->serialVersionUID:J
+Landroid/icu/text/CompactDecimalFormat;->serialVersionUID:J
+Landroid/icu/text/CurrencyPluralInfo;->serialVersionUID:J
+Landroid/icu/text/DateFormat$Field;->serialVersionUID:J
+Landroid/icu/text/DateFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/DateFormat;->serialVersionUID:J
+Landroid/icu/text/DateFormatSymbols;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
+Landroid/icu/text/DateFormatSymbols;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/DateFormatSymbols;->serialVersionUID:J
+Landroid/icu/text/DateIntervalFormat;-><init>()V
+Landroid/icu/text/DateIntervalFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/DateIntervalFormat;->serialVersionUID:J
+Landroid/icu/text/DateIntervalInfo$PatternInfo;->serialVersionUID:J
+Landroid/icu/text/DateIntervalInfo;->serialVersionUID:J
+Landroid/icu/text/DateTimePatternGenerator$DistanceInfo;-><init>()V
+Landroid/icu/text/DecimalFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/DecimalFormat;->serialVersionUID:J
+Landroid/icu/text/DecimalFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/DecimalFormatSymbols;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
+Landroid/icu/text/DecimalFormatSymbols;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/DecimalFormatSymbols;->serialVersionUID:J
+Landroid/icu/text/DecimalFormat_ICU58_Android;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/DecimalFormat_ICU58_Android;->serialVersionUID:J
+Landroid/icu/text/DecimalFormat_ICU58_Android;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/DurationFormat;->serialVersionUID:J
+Landroid/icu/text/MeasureFormat$MeasureProxy;->readResolve()Ljava/lang/Object;
+Landroid/icu/text/MeasureFormat$MeasureProxy;->serialVersionUID:J
+Landroid/icu/text/MeasureFormat;->serialVersionUID:J
+Landroid/icu/text/MeasureFormat;->writeReplace()Ljava/lang/Object;
+Landroid/icu/text/MessageFormat$Field;->serialVersionUID:J
+Landroid/icu/text/MessageFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/MessageFormat;->serialVersionUID:J
+Landroid/icu/text/MessageFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/NumberFormat$Field;->serialVersionUID:J
+Landroid/icu/text/NumberFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/NumberFormat;->serialVersionUID:J
+Landroid/icu/text/NumberFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/PluralFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/PluralFormat;->serialVersionUID:J
+Landroid/icu/text/PluralRules$AndConstraint;->serialVersionUID:J
+Landroid/icu/text/PluralRules$BinaryConstraint;->serialVersionUID:J
+Landroid/icu/text/PluralRules$FixedDecimal;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/PluralRules$FixedDecimal;->serialVersionUID:J
+Landroid/icu/text/PluralRules$FixedDecimal;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/PluralRules$OrConstraint;->serialVersionUID:J
+Landroid/icu/text/PluralRules$RangeConstraint;->serialVersionUID:J
+Landroid/icu/text/PluralRules$Rule;->serialVersionUID:J
+Landroid/icu/text/PluralRules$RuleList;->serialVersionUID:J
+Landroid/icu/text/PluralRules;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/PluralRules;->serialVersionUID:J
+Landroid/icu/text/PluralRules;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/PluralRules;->writeReplace()Ljava/lang/Object;
+Landroid/icu/text/RuleBasedCollator;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
+Landroid/icu/text/RuleBasedNumberFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/RuleBasedNumberFormat;->serialVersionUID:J
+Landroid/icu/text/RuleBasedNumberFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/SelectFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/SelectFormat;->serialVersionUID:J
+Landroid/icu/text/SimpleDateFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/SimpleDateFormat;->serialVersionUID:J
+Landroid/icu/text/SimpleDateFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/SpoofChecker$ScriptSet;-><init>()V
+Landroid/icu/text/SpoofChecker$ScriptSet;->and(I)V
+Landroid/icu/text/SpoofChecker$ScriptSet;->isFull()Z
+Landroid/icu/text/SpoofChecker$ScriptSet;->serialVersionUID:J
+Landroid/icu/text/SpoofChecker$ScriptSet;->setAll()V
+Landroid/icu/text/StringPrepParseException;->serialVersionUID:J
+Landroid/icu/text/TimeUnitFormat;->readResolve()Ljava/lang/Object;
+Landroid/icu/text/TimeUnitFormat;->serialVersionUID:J
+Landroid/icu/text/TimeUnitFormat;->writeReplace()Ljava/lang/Object;
+Landroid/icu/text/TimeZoneFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/text/TimeZoneFormat;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Landroid/icu/text/TimeZoneFormat;->serialVersionUID:J
+Landroid/icu/text/TimeZoneFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames$FactoryImpl;-><init>()V
+Landroid/icu/text/TimeZoneNames$DefaultTimeZoneNames;->serialVersionUID:J
+Landroid/icu/text/TimeZoneNames;->serialVersionUID:J
+Landroid/icu/text/Transliterator;->createFromRules(Ljava/lang/String;Ljava/lang/String;I)Landroid/icu/text/Transliterator;
+Landroid/icu/text/Transliterator;->getInstance(Ljava/lang/String;)Landroid/icu/text/Transliterator;
+Landroid/icu/text/Transliterator;->transliterate(Ljava/lang/String;)Ljava/lang/String;
+Landroid/icu/text/UFormat;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
+Landroid/icu/text/UFormat;->serialVersionUID:J
+Landroid/icu/util/AnnualTimeZoneRule;->serialVersionUID:J
+Landroid/icu/util/BasicTimeZone;->serialVersionUID:J
+Landroid/icu/util/BuddhistCalendar;->serialVersionUID:J
+Landroid/icu/util/CECalendar;->serialVersionUID:J
+Landroid/icu/util/Calendar;->getLocale(Landroid/icu/util/ULocale$Type;)Landroid/icu/util/ULocale;
+Landroid/icu/util/Calendar;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/util/Calendar;->serialVersionUID:J
+Landroid/icu/util/Calendar;->writeObject(Ljava/io/ObjectOutputStream;)V
+Landroid/icu/util/ChineseCalendar;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/util/ChineseCalendar;->serialVersionUID:J
+Landroid/icu/util/CopticCalendar;->serialVersionUID:J
+Landroid/icu/util/Currency;->readResolve()Ljava/lang/Object;
+Landroid/icu/util/Currency;->serialVersionUID:J
+Landroid/icu/util/Currency;->writeReplace()Ljava/lang/Object;
+Landroid/icu/util/DangiCalendar;->serialVersionUID:J
+Landroid/icu/util/DateInterval;->serialVersionUID:J
+Landroid/icu/util/DateTimeRule;->serialVersionUID:J
+Landroid/icu/util/EthiopicCalendar;->serialVersionUID:J
+Landroid/icu/util/GregorianCalendar;->serialVersionUID:J
+Landroid/icu/util/HebrewCalendar;->serialVersionUID:J
+Landroid/icu/util/ICUCloneNotSupportedException;->serialVersionUID:J
+Landroid/icu/util/ICUException;->serialVersionUID:J
+Landroid/icu/util/ICUUncheckedIOException;->serialVersionUID:J
+Landroid/icu/util/IllformedLocaleException;->serialVersionUID:J
+Landroid/icu/util/IndianCalendar;->serialVersionUID:J
+Landroid/icu/util/InitialTimeZoneRule;->serialVersionUID:J
+Landroid/icu/util/IslamicCalendar;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/util/IslamicCalendar;->serialVersionUID:J
+Landroid/icu/util/JapaneseCalendar;->serialVersionUID:J
+Landroid/icu/util/MeasureUnit$MeasureUnitProxy;->readResolve()Ljava/lang/Object;
+Landroid/icu/util/MeasureUnit$MeasureUnitProxy;->serialVersionUID:J
+Landroid/icu/util/MeasureUnit;->serialVersionUID:J
+Landroid/icu/util/MeasureUnit;->writeReplace()Ljava/lang/Object;
+Landroid/icu/util/NoUnit;->serialVersionUID:J
+Landroid/icu/util/PersianCalendar;->serialVersionUID:J
+Landroid/icu/util/RuleBasedTimeZone;->serialVersionUID:J
+Landroid/icu/util/STZInfo;->serialVersionUID:J
+Landroid/icu/util/SimpleTimeZone;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/icu/util/SimpleTimeZone;->serialVersionUID:J
+Landroid/icu/util/TaiwanCalendar;->serialVersionUID:J
+Landroid/icu/util/TimeArrayTimeZoneRule;->serialVersionUID:J
+Landroid/icu/util/TimeUnit;->readResolve()Ljava/lang/Object;
+Landroid/icu/util/TimeUnit;->serialVersionUID:J
+Landroid/icu/util/TimeUnit;->writeReplace()Ljava/lang/Object;
+Landroid/icu/util/TimeZone$ConstantZone;->serialVersionUID:J
+Landroid/icu/util/TimeZone;->serialVersionUID:J
+Landroid/icu/util/TimeZoneRule;->serialVersionUID:J
+Landroid/icu/util/ULocale;->serialVersionUID:J
+Landroid/icu/util/UResourceTypeMismatchException;->serialVersionUID:J
+Landroid/icu/util/VTimeZone;->serialVersionUID:J
+Landroid/inputmethodservice/InputMethodService$SettingsObserver;->shouldShowImeWithHardKeyboard()Z
+Landroid/inputmethodservice/InputMethodService;->mExtractEditText:Landroid/inputmethodservice/ExtractEditText;
+Landroid/inputmethodservice/InputMethodService;->mRootView:Landroid/view/View;
+Landroid/inputmethodservice/InputMethodService;->mSettingsObserver:Landroid/inputmethodservice/InputMethodService$SettingsObserver;
+Landroid/location/Country;->getCountryIso()Ljava/lang/String;
+Landroid/location/Country;->getSource()I
+Landroid/location/CountryDetector;->detectCountry()Landroid/location/Country;
+Landroid/location/GeocoderParams;->getClientPackage()Ljava/lang/String;
+Landroid/location/GeocoderParams;->getLocale()Ljava/util/Locale;
+Landroid/location/IGeocodeProvider$Stub;-><init>()V
+Landroid/location/IGeocodeProvider;->getFromLocation(DDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
+Landroid/location/IGeocodeProvider;->getFromLocationName(Ljava/lang/String;DDDDILandroid/location/GeocoderParams;Ljava/util/List;)Ljava/lang/String;
+Landroid/location/IGeofenceProvider$Stub;-><init>()V
+Landroid/location/IGeofenceProvider;->setGeofenceHardware(Landroid/hardware/location/IGeofenceHardware;)V
+Landroid/location/ILocationListener$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/location/ILocationListener$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/location/ILocationListener;->onLocationChanged(Landroid/location/Location;)V
+Landroid/location/ILocationManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/location/ILocationManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/location/ILocationManager;
+Landroid/location/ILocationManager;->getNetworkProviderPackage()Ljava/lang/String;
+Landroid/location/ILocationManager;->reportLocation(Landroid/location/Location;Z)V
+Landroid/location/INetInitiatedListener$Stub;-><init>()V
+Landroid/location/INetInitiatedListener;->sendNiResponse(II)Z
+Landroid/location/Location;->mElapsedRealtimeNanos:J
+Landroid/location/Location;->removeBearingAccuracy()V
+Landroid/location/Location;->removeSpeedAccuracy()V
+Landroid/location/Location;->removeVerticalAccuracy()V
+Landroid/location/Location;->setExtraLocation(Ljava/lang/String;Landroid/location/Location;)V
+Landroid/location/LocationManager;->mService:Landroid/location/ILocationManager;
+Landroid/location/LocationRequest;->mHideFromAppOps:Z
+Landroid/location/LocationRequest;->mInterval:J
+Landroid/location/LocationRequest;->mProvider:Ljava/lang/String;
+Landroid/location/LocationRequest;->mWorkSource:Landroid/os/WorkSource;
+Landroid/media/AudioAttributes$Builder;->addTag(Ljava/lang/String;)Landroid/media/AudioAttributes$Builder;
+Landroid/media/AudioAttributes;->mContentType:I
+Landroid/media/AudioAttributes;->mFlags:I
+Landroid/media/AudioAttributes;->mFormattedTags:Ljava/lang/String;
+Landroid/media/AudioAttributes;->mSource:I
+Landroid/media/AudioAttributes;->mUsage:I
+Landroid/media/AudioAttributes;->toLegacyStreamType(Landroid/media/AudioAttributes;)I
+Landroid/media/AudioDevicePort;-><init>(Landroid/media/AudioHandle;Ljava/lang/String;[I[I[I[I[Landroid/media/AudioGain;ILjava/lang/String;)V
+Landroid/media/AudioDevicePortConfig;-><init>(Landroid/media/AudioDevicePort;IIILandroid/media/AudioGainConfig;)V
+Landroid/media/AudioFormat;-><init>()V
+Landroid/media/AudioFormat;-><init>(IIII)V
+Landroid/media/AudioFormat;->mChannelMask:I
+Landroid/media/AudioFormat;->mEncoding:I
+Landroid/media/AudioFormat;->mSampleRate:I
+Landroid/media/AudioGain;-><init>(IIIIIIIII)V
+Landroid/media/AudioGainConfig;-><init>(ILandroid/media/AudioGain;II[II)V
+Landroid/media/AudioGainConfig;->mChannelMask:I
+Landroid/media/AudioGainConfig;->mIndex:I
+Landroid/media/AudioGainConfig;->mMode:I
+Landroid/media/AudioGainConfig;->mRampDurationMs:I
+Landroid/media/AudioGainConfig;->mValues:[I
+Landroid/media/AudioHandle;-><init>(I)V
+Landroid/media/AudioHandle;->mId:I
+Landroid/media/AudioManager;-><init>(Landroid/content/Context;)V
+Landroid/media/AudioManager;->STREAM_BLUETOOTH_SCO:I
+Landroid/media/AudioManager;->STREAM_SYSTEM_ENFORCED:I
+Landroid/media/AudioManager;->STREAM_TTS:I
+Landroid/media/AudioManager;->forceVolumeControlStream(I)V
+Landroid/media/AudioManager;->getOutputLatency(I)I
+Landroid/media/AudioManager;->getService()Landroid/media/IAudioService;
+Landroid/media/AudioManager;->mAudioFocusIdListenerMap:Ljava/util/concurrent/ConcurrentHashMap;
+Landroid/media/AudioManager;->registerAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
+Landroid/media/AudioManager;->setMasterMute(ZI)V
+Landroid/media/AudioManager;->setRingerModeInternal(I)V
+Landroid/media/AudioManager;->startBluetoothScoVirtualCall()V
+Landroid/media/AudioManager;->unregisterAudioPortUpdateListener(Landroid/media/AudioManager$OnAudioPortUpdateListener;)V
+Landroid/media/AudioMixPort;-><init>(Landroid/media/AudioHandle;IILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V
+Landroid/media/AudioMixPortConfig;-><init>(Landroid/media/AudioMixPort;IIILandroid/media/AudioGainConfig;)V
+Landroid/media/AudioPatch;-><init>(Landroid/media/AudioHandle;[Landroid/media/AudioPortConfig;[Landroid/media/AudioPortConfig;)V
+Landroid/media/AudioPatch;->mHandle:Landroid/media/AudioHandle;
+Landroid/media/AudioPort;-><init>(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V
+Landroid/media/AudioPort;->mActiveConfig:Landroid/media/AudioPortConfig;
+Landroid/media/AudioPort;->mGains:[Landroid/media/AudioGain;
+Landroid/media/AudioPort;->mHandle:Landroid/media/AudioHandle;
+Landroid/media/AudioPort;->mRole:I
+Landroid/media/AudioPortConfig;-><init>(Landroid/media/AudioPort;IIILandroid/media/AudioGainConfig;)V
+Landroid/media/AudioPortConfig;->mChannelMask:I
+Landroid/media/AudioPortConfig;->mConfigMask:I
+Landroid/media/AudioPortConfig;->mFormat:I
+Landroid/media/AudioPortConfig;->mGain:Landroid/media/AudioGainConfig;
+Landroid/media/AudioPortConfig;->mPort:Landroid/media/AudioPort;
+Landroid/media/AudioPortConfig;->mSamplingRate:I
+Landroid/media/AudioPortEventHandler;->mJniCallback:J
+Landroid/media/AudioPortEventHandler;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
+Landroid/media/AudioRecord;->mNativeCallbackCookie:J
+Landroid/media/AudioRecord;->mNativeDeviceCallback:J
+Landroid/media/AudioRecord;->mNativeRecorderInJavaObj:J
+Landroid/media/AudioRecord;->native_release()V
+Landroid/media/AudioRecord;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
+Landroid/media/AudioRecordingConfiguration;->getClientPackageName()Ljava/lang/String;
+Landroid/media/AudioRecordingConfiguration;->getClientUid()I
+Landroid/media/AudioSystem;->checkAudioFlinger()I
+Landroid/media/AudioSystem;->dynamicPolicyCallbackFromNative(ILjava/lang/String;I)V
+Landroid/media/AudioSystem;->errorCallbackFromNative(I)V
+Landroid/media/AudioSystem;->getForceUse(I)I
+Landroid/media/AudioSystem;->getParameters(Ljava/lang/String;)Ljava/lang/String;
+Landroid/media/AudioSystem;->getPrimaryOutputFrameCount()I
+Landroid/media/AudioSystem;->getPrimaryOutputSamplingRate()I
+Landroid/media/AudioSystem;->isSourceActive(I)Z
+Landroid/media/AudioSystem;->isStreamActive(II)Z
+Landroid/media/AudioSystem;->recordingCallbackFromNative(IIII[I)V
+Landroid/media/AudioSystem;->setDeviceConnectionState(IILjava/lang/String;Ljava/lang/String;)I
+Landroid/media/AudioSystem;->setErrorCallback(Landroid/media/AudioSystem$ErrorCallback;)V
+Landroid/media/AudioSystem;->setForceUse(II)I
+Landroid/media/AudioSystem;->setParameters(Ljava/lang/String;)I
+Landroid/media/AudioTrack;->deferred_connect(J)V
+Landroid/media/AudioTrack;->getLatency()I
+Landroid/media/AudioTrack;->mJniData:J
+Landroid/media/AudioTrack;->mNativeTrackInJavaObj:J
+Landroid/media/AudioTrack;->mStreamType:I
+Landroid/media/AudioTrack;->native_release()V
+Landroid/media/AudioTrack;->postEventFromNative(Ljava/lang/Object;IIILjava/lang/Object;)V
+Landroid/media/ExifInterface;->getDateTime()J
+Landroid/media/IAudioService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/media/IAudioService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IAudioService;
+Landroid/media/IAudioService;->getStreamMaxVolume(I)I
+Landroid/media/IAudioService;->getStreamVolume(I)I
+Landroid/media/IAudioService;->setStreamVolume(IIILjava/lang/String;)V
+Landroid/media/IMediaRouterService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaRouterService;
+Landroid/media/IMediaScannerService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaScannerService;
+Landroid/media/IMediaScannerService;->scanFile(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/media/IRemoteDisplayCallback;->onStateChanged(Landroid/media/RemoteDisplayState;)V
+Landroid/media/IVolumeController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IVolumeController;
+Landroid/media/Image;-><init>()V
+Landroid/media/JetPlayer;->mNativePlayerInJavaObj:J
+Landroid/media/JetPlayer;->postEventFromNative(Ljava/lang/Object;III)V
+Landroid/media/MediaCodec$CodecException;-><init>(IILjava/lang/String;)V
+Landroid/media/MediaCodec;->getBuffers(Z)[Ljava/nio/ByteBuffer;
+Landroid/media/MediaCodec;->releaseOutputBuffer(IZZJ)V
+Landroid/media/MediaDrm$Certificate;->getContent()[B
+Landroid/media/MediaDrm$Certificate;->getWrappedPrivateKey()[B
+Landroid/media/MediaDrm$CertificateRequest;->getData()[B
+Landroid/media/MediaDrm$CertificateRequest;->getDefaultUrl()Ljava/lang/String;
+Landroid/media/MediaDrm;->getCertificateRequest(ILjava/lang/String;)Landroid/media/MediaDrm$CertificateRequest;
+Landroid/media/MediaDrm;->provideCertificateResponse([B)Landroid/media/MediaDrm$Certificate;
+Landroid/media/MediaDrm;->signRSA([BLjava/lang/String;[B[B)[B
+Landroid/media/MediaFile$MediaFileType;->fileType:I
+Landroid/media/MediaFile$MediaFileType;->mimeType:Ljava/lang/String;
+Landroid/media/MediaFile;-><init>()V
+Landroid/media/MediaFile;->FIRST_AUDIO_FILE_TYPE:I
+Landroid/media/MediaFile;->LAST_AUDIO_FILE_TYPE:I
+Landroid/media/MediaFile;->getFileType(Ljava/lang/String;)Landroid/media/MediaFile$MediaFileType;
+Landroid/media/MediaFile;->getFileTypeForMimeType(Ljava/lang/String;)I
+Landroid/media/MediaFile;->getMimeTypeForFile(Ljava/lang/String;)Ljava/lang/String;
+Landroid/media/MediaFile;->isAudioFileType(I)Z
+Landroid/media/MediaFile;->isImageFileType(I)Z
+Landroid/media/MediaFile;->isPlayListFileType(I)Z
+Landroid/media/MediaFile;->isVideoFileType(I)Z
+Landroid/media/MediaFile;->sFileTypeMap:Ljava/util/HashMap;
+Landroid/media/MediaFormat;->getMap()Ljava/util/Map;
+Landroid/media/MediaHTTPService;->createHttpServiceBinderIfNecessary(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/media/MediaMetadataRetriever;->getEmbeddedPicture(I)[B
+Landroid/media/MediaPlayer;->getMetadata(ZZ)Landroid/media/Metadata;
+Landroid/media/MediaPlayer;->invoke(Landroid/os/Parcel;Landroid/os/Parcel;)V
+Landroid/media/MediaPlayer;->mEventHandler:Landroid/media/MediaPlayer$EventHandler;
+Landroid/media/MediaPlayer;->newRequest()Landroid/os/Parcel;
+Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;Ljava/util/Map;)V
+Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;Ljava/util/Map;Ljava/util/List;)V
+Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/util/List;)V
+Landroid/media/MediaPlayer;->setRetransmitEndpoint(Ljava/net/InetSocketAddress;)V
+Landroid/media/MediaRecorder;->setParameter(Ljava/lang/String;)V
+Landroid/media/MediaRouter$RouteInfo;->STATUS_CONNECTING:I
+Landroid/media/MediaRouter$RouteInfo;->getStatusCode()I
+Landroid/media/MediaRouter;->selectRouteInt(ILandroid/media/MediaRouter$RouteInfo;Z)V
+Landroid/media/MediaScanner;->isNoMediaPath(Ljava/lang/String;)Z
+Landroid/media/MediaScanner;->mClient:Landroid/media/MediaScanner$MyMediaScannerClient;
+Landroid/media/MediaScanner;->scanSingleFile(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;
+Landroid/media/Metadata;->PAUSE_AVAILABLE:I
+Landroid/media/Metadata;->SEEK_BACKWARD_AVAILABLE:I
+Landroid/media/Metadata;->SEEK_FORWARD_AVAILABLE:I
+Landroid/media/Metadata;->getBoolean(I)Z
+Landroid/media/Metadata;->has(I)Z
+Landroid/media/MicrophoneInfo;-><init>(Ljava/lang/String;ILjava/lang/String;IIILandroid/media/MicrophoneInfo$Coordinate3F;Landroid/media/MicrophoneInfo$Coordinate3F;Ljava/util/List;Ljava/util/List;FFFI)V
+Landroid/media/MiniThumbFile;->reset()V
+Landroid/media/PlaybackParams;->SET_AUDIO_FALLBACK_MODE:I
+Landroid/media/PlaybackParams;->SET_AUDIO_STRETCH_MODE:I
+Landroid/media/PlaybackParams;->SET_PITCH:I
+Landroid/media/PlaybackParams;->SET_SPEED:I
+Landroid/media/PlaybackParams;->mAudioFallbackMode:I
+Landroid/media/PlaybackParams;->mAudioStretchMode:I
+Landroid/media/PlaybackParams;->mPitch:F
+Landroid/media/PlaybackParams;->mSet:I
+Landroid/media/PlaybackParams;->mSpeed:F
+Landroid/media/RemoteDisplay;->notifyDisplayConnected(Landroid/view/Surface;IIII)V
+Landroid/media/RemoteDisplay;->notifyDisplayDisconnected()V
+Landroid/media/RemoteDisplay;->notifyDisplayError(I)V
+Landroid/media/RemoteDisplayState;-><init>()V
+Landroid/media/RemoteDisplayState;->displays:Ljava/util/ArrayList;
+Landroid/media/RingtoneManager;->getRingtone(Landroid/content/Context;Landroid/net/Uri;I)Landroid/media/Ringtone;
+Landroid/media/SubtitleController;->mHandler:Landroid/os/Handler;
+Landroid/media/SubtitleTrack$RenderingWidget;->draw(Landroid/graphics/Canvas;)V
+Landroid/media/SubtitleTrack$RenderingWidget;->onAttachedToWindow()V
+Landroid/media/SubtitleTrack$RenderingWidget;->onDetachedFromWindow()V
+Landroid/media/SubtitleTrack$RenderingWidget;->setOnChangedListener(Landroid/media/SubtitleTrack$RenderingWidget$OnChangedListener;)V
+Landroid/media/SubtitleTrack$RenderingWidget;->setSize(II)V
+Landroid/media/ThumbnailUtils;->createImageThumbnail(Ljava/lang/String;I)Landroid/graphics/Bitmap;
+Landroid/media/ToneGenerator;->mNativeContext:J
+Landroid/media/VolumeShaper$Configuration;-><init>(IIIDI[F[F)V
+Landroid/media/VolumeShaper$Configuration;->mDurationMs:D
+Landroid/media/VolumeShaper$Configuration;->mId:I
+Landroid/media/VolumeShaper$Configuration;->mInterpolatorType:I
+Landroid/media/VolumeShaper$Configuration;->mOptionFlags:I
+Landroid/media/VolumeShaper$Configuration;->mTimes:[F
+Landroid/media/VolumeShaper$Configuration;->mType:I
+Landroid/media/VolumeShaper$Configuration;->mVolumes:[F
+Landroid/media/VolumeShaper$Operation;-><init>(IIF)V
+Landroid/media/VolumeShaper$Operation;->mFlags:I
+Landroid/media/VolumeShaper$Operation;->mReplaceId:I
+Landroid/media/VolumeShaper$Operation;->mXOffset:F
+Landroid/media/VolumeShaper$State;-><init>(FF)V
+Landroid/media/VolumeShaper$State;->mVolume:F
+Landroid/media/VolumeShaper$State;->mXOffset:F
+Landroid/media/audiofx/AudioEffect;-><init>(Ljava/util/UUID;Ljava/util/UUID;II)V
+Landroid/media/audiofx/AudioEffect;->command(I[B[B)I
+Landroid/media/audiofx/AudioEffect;->getParameter([I[B)I
+Landroid/media/audiofx/AudioEffect;->getParameter([I[I)I
+Landroid/media/audiofx/AudioEffect;->setParameter([I[S)I
+Landroid/media/audiopolicy/AudioMix;->mCallbackFlags:I
+Landroid/media/audiopolicy/AudioMix;->mDeviceAddress:Ljava/lang/String;
+Landroid/media/audiopolicy/AudioMix;->mDeviceSystemType:I
+Landroid/media/audiopolicy/AudioMix;->mFormat:Landroid/media/AudioFormat;
+Landroid/media/audiopolicy/AudioMix;->mMixType:I
+Landroid/media/audiopolicy/AudioMix;->mRouteFlags:I
+Landroid/media/audiopolicy/AudioMix;->mRule:Landroid/media/audiopolicy/AudioMixingRule;
+Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mAttr:Landroid/media/AudioAttributes;
+Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mIntProp:I
+Landroid/media/audiopolicy/AudioMixingRule$AudioMixMatchCriterion;->mRule:I
+Landroid/media/audiopolicy/AudioMixingRule;->mCriteria:Ljava/util/ArrayList;
+Landroid/media/session/ISessionManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/session/ISessionManager;
+Landroid/media/session/MediaSession;->getCallingPackage()Ljava/lang/String;
+Landroid/media/session/MediaSession;->mCallback:Landroid/media/session/MediaSession$CallbackMessageHandler;
+Landroid/media/session/MediaSessionLegacyHelper;->getHelper(Landroid/content/Context;)Landroid/media/session/MediaSessionLegacyHelper;
+Landroid/media/soundtrigger/SoundTriggerDetector$EventPayload;->getCaptureSession()Ljava/lang/Integer;
+Landroid/media/soundtrigger/SoundTriggerDetector$EventPayload;->getData()[B
+Landroid/media/soundtrigger/SoundTriggerManager;->loadSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;)I
+Landroid/media/soundtrigger/SoundTriggerManager;->startRecognition(Ljava/util/UUID;Landroid/app/PendingIntent;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+Landroid/media/soundtrigger/SoundTriggerManager;->startRecognition(Ljava/util/UUID;Landroid/os/Bundle;Landroid/content/ComponentName;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+Landroid/media/soundtrigger/SoundTriggerManager;->stopRecognition(Ljava/util/UUID;)I
+Landroid/media/soundtrigger/SoundTriggerManager;->unloadSoundModel(Ljava/util/UUID;)I
+Landroid/media/tv/ITvRemoteProvider$Stub;-><init>()V
+Landroid/media/tv/ITvRemoteServiceInput;->clearInputBridge(Landroid/os/IBinder;)V
+Landroid/media/tv/ITvRemoteServiceInput;->closeInputBridge(Landroid/os/IBinder;)V
+Landroid/media/tv/ITvRemoteServiceInput;->openInputBridge(Landroid/os/IBinder;Ljava/lang/String;III)V
+Landroid/media/tv/ITvRemoteServiceInput;->sendKeyDown(Landroid/os/IBinder;I)V
+Landroid/media/tv/ITvRemoteServiceInput;->sendKeyUp(Landroid/os/IBinder;I)V
+Landroid/media/tv/ITvRemoteServiceInput;->sendPointerDown(Landroid/os/IBinder;III)V
+Landroid/media/tv/ITvRemoteServiceInput;->sendPointerSync(Landroid/os/IBinder;)V
+Landroid/media/tv/ITvRemoteServiceInput;->sendPointerUp(Landroid/os/IBinder;I)V
+Landroid/media/tv/ITvRemoteServiceInput;->sendTimestamp(Landroid/os/IBinder;J)V
+Landroid/media/tv/TvInputManager$Hardware;->dispatchKeyEventToHdmi(Landroid/view/KeyEvent;)Z
+Landroid/media/tv/TvInputManager;->acquireTvInputHardware(ILandroid/media/tv/TvInputManager$HardwareCallback;Landroid/media/tv/TvInputInfo;)Landroid/media/tv/TvInputManager$Hardware;
+Landroid/media/tv/TvView;->requestUnblockContent(Landroid/media/tv/TvContentRating;)V
+Landroid/net/ConnectivityManager$PacketKeepalive;->stop()V
+Landroid/net/ConnectivityManager$PacketKeepaliveCallback;-><init>()V
+Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onError(I)V
+Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onStarted()V
+Landroid/net/ConnectivityManager$PacketKeepaliveCallback;->onStopped()V
+Landroid/net/ConnectivityManager;->ACTION_TETHER_STATE_CHANGED:Ljava/lang/String;
+Landroid/net/ConnectivityManager;->EXTRA_ACTIVE_TETHER:Ljava/lang/String;
+Landroid/net/ConnectivityManager;->TYPE_MOBILE_CBS:I
+Landroid/net/ConnectivityManager;->TYPE_MOBILE_EMERGENCY:I
+Landroid/net/ConnectivityManager;->TYPE_MOBILE_FOTA:I
+Landroid/net/ConnectivityManager;->TYPE_MOBILE_IA:I
+Landroid/net/ConnectivityManager;->TYPE_MOBILE_IMS:I
+Landroid/net/ConnectivityManager;->TYPE_NONE:I
+Landroid/net/ConnectivityManager;->TYPE_PROXY:I
+Landroid/net/ConnectivityManager;->TYPE_WIFI_P2P:I
+Landroid/net/ConnectivityManager;->getActiveLinkProperties()Landroid/net/LinkProperties;
+Landroid/net/ConnectivityManager;->getActiveNetworkQuotaInfo()Landroid/net/NetworkQuotaInfo;
+Landroid/net/ConnectivityManager;->getLinkProperties(I)Landroid/net/LinkProperties;
+Landroid/net/ConnectivityManager;->getMobileDataEnabled()Z
+Landroid/net/ConnectivityManager;->getTetherableUsbRegexs()[Ljava/lang/String;
+Landroid/net/ConnectivityManager;->getTetherableWifiRegexs()[Ljava/lang/String;
+Landroid/net/ConnectivityManager;->getTetheredIfaces()[Ljava/lang/String;
+Landroid/net/ConnectivityManager;->isNetworkSupported(I)Z
+Landroid/net/ConnectivityManager;->isNetworkTypeMobile(I)Z
+Landroid/net/ConnectivityManager;->mService:Landroid/net/IConnectivityManager;
+Landroid/net/ConnectivityManager;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V
+Landroid/net/ConnectivityManager;->requestRouteToHost(II)Z
+Landroid/net/ConnectivityManager;->requestRouteToHostAddress(ILjava/net/InetAddress;)Z
+Landroid/net/ConnectivityManager;->setAirplaneMode(Z)V
+Landroid/net/ConnectivityManager;->setBackgroundDataSetting(Z)V
+Landroid/net/ConnectivityManager;->startNattKeepalive(Landroid/net/Network;ILandroid/net/ConnectivityManager$PacketKeepaliveCallback;Ljava/net/InetAddress;ILjava/net/InetAddress;)Landroid/net/ConnectivityManager$PacketKeepalive;
+Landroid/net/ConnectivityManager;->startUsingNetworkFeature(ILjava/lang/String;)I
+Landroid/net/ConnectivityManager;->stopUsingNetworkFeature(ILjava/lang/String;)I
+Landroid/net/ConnectivityManager;->tether(Ljava/lang/String;)I
+Landroid/net/ConnectivityManager;->untether(Ljava/lang/String;)I
+Landroid/net/DhcpResults;-><init>()V
+Landroid/net/DhcpResults;-><init>(Landroid/net/DhcpResults;)V
+Landroid/net/DhcpResults;-><init>(Landroid/net/StaticIpConfiguration;)V
+Landroid/net/DhcpResults;->leaseDuration:I
+Landroid/net/DhcpResults;->mtu:I
+Landroid/net/DhcpResults;->serverAddress:Ljava/net/Inet4Address;
+Landroid/net/DhcpResults;->vendorInfo:Ljava/lang/String;
+Landroid/net/IConnectivityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveLinkProperties()Landroid/net/LinkProperties;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getAllNetworks()[Landroid/net/Network;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableIfaces()[Ljava/lang/String;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getTetherableUsbRegexs()[Ljava/lang/String;
+Landroid/net/IConnectivityManager$Stub$Proxy;->getTetheredIfaces()[Ljava/lang/String;
+Landroid/net/IConnectivityManager$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/net/IConnectivityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/IConnectivityManager;
+Landroid/net/IConnectivityManager;->getActiveLinkProperties()Landroid/net/LinkProperties;
+Landroid/net/IConnectivityManager;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
+Landroid/net/IConnectivityManager;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
+Landroid/net/IConnectivityManager;->getAllNetworkState()[Landroid/net/NetworkState;
+Landroid/net/IConnectivityManager;->getTetheredIfaces()[Ljava/lang/String;
+Landroid/net/INetd$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetd;
+Landroid/net/INetd;->interfaceAddAddress(Ljava/lang/String;Ljava/lang/String;I)V
+Landroid/net/INetworkPolicyManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkPolicyManager;
+Landroid/net/INetworkPolicyManager;->getNetworkQuotaInfo(Landroid/net/NetworkState;)Landroid/net/NetworkQuotaInfo;
+Landroid/net/INetworkScoreService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkScoreService;
+Landroid/net/INetworkStatsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String;
+Landroid/net/INetworkStatsService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/INetworkStatsService;
+Landroid/net/INetworkStatsService;->openSession()Landroid/net/INetworkStatsSession;
+Landroid/net/INetworkStatsSession;->getHistoryForNetwork(Landroid/net/NetworkTemplate;I)Landroid/net/NetworkStatsHistory;
+Landroid/net/INetworkStatsSession;->getHistoryForUid(Landroid/net/NetworkTemplate;IIII)Landroid/net/NetworkStatsHistory;
+Landroid/net/InterfaceConfiguration;-><init>()V
+Landroid/net/InterfaceConfiguration;->setLinkAddress(Landroid/net/LinkAddress;)V
+Landroid/net/IpConfiguration;->httpProxy:Landroid/net/ProxyInfo;
+Landroid/net/LinkAddress;-><init>(Ljava/lang/String;)V
+Landroid/net/LinkAddress;-><init>(Ljava/net/InetAddress;I)V
+Landroid/net/LinkAddress;->isIPv6()Z
+Landroid/net/LinkAddress;->isSameAddressAs(Landroid/net/LinkAddress;)Z
+Landroid/net/LinkProperties$ProvisioningChange;->GAINED_PROVISIONING:Landroid/net/LinkProperties$ProvisioningChange;
+Landroid/net/LinkProperties$ProvisioningChange;->LOST_PROVISIONING:Landroid/net/LinkProperties$ProvisioningChange;
+Landroid/net/LinkProperties$ProvisioningChange;->STILL_NOT_PROVISIONED:Landroid/net/LinkProperties$ProvisioningChange;
+Landroid/net/LinkProperties$ProvisioningChange;->STILL_PROVISIONED:Landroid/net/LinkProperties$ProvisioningChange;
+Landroid/net/LinkProperties$ProvisioningChange;->values()[Landroid/net/LinkProperties$ProvisioningChange;
+Landroid/net/LinkProperties;-><init>()V
+Landroid/net/LinkProperties;-><init>(Landroid/net/LinkProperties;)V
+Landroid/net/LinkProperties;->addDnsServer(Ljava/net/InetAddress;)Z
+Landroid/net/LinkProperties;->addRoute(Landroid/net/RouteInfo;)Z
+Landroid/net/LinkProperties;->addStackedLink(Landroid/net/LinkProperties;)Z
+Landroid/net/LinkProperties;->clear()V
+Landroid/net/LinkProperties;->compareProvisioning(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Landroid/net/LinkProperties$ProvisioningChange;
+Landroid/net/LinkProperties;->getAllInterfaceNames()Ljava/util/List;
+Landroid/net/LinkProperties;->getAllRoutes()Ljava/util/List;
+Landroid/net/LinkProperties;->getMtu()I
+Landroid/net/LinkProperties;->getStackedLinks()Ljava/util/List;
+Landroid/net/LinkProperties;->hasGlobalIPv6Address()Z
+Landroid/net/LinkProperties;->hasIPv4Address()Z
+Landroid/net/LinkProperties;->hasIPv4DefaultRoute()Z
+Landroid/net/LinkProperties;->hasIPv4DnsServer()Z
+Landroid/net/LinkProperties;->hasIPv6DefaultRoute()Z
+Landroid/net/LinkProperties;->hasIPv6DnsServer()Z
+Landroid/net/LinkProperties;->isIPv6Provisioned()Z
+Landroid/net/LinkProperties;->isIdenticalAddresses(Landroid/net/LinkProperties;)Z
+Landroid/net/LinkProperties;->isIdenticalDnses(Landroid/net/LinkProperties;)Z
+Landroid/net/LinkProperties;->isIdenticalRoutes(Landroid/net/LinkProperties;)Z
+Landroid/net/LinkProperties;->isIdenticalStackedLinks(Landroid/net/LinkProperties;)Z
+Landroid/net/LinkProperties;->isProvisioned()Z
+Landroid/net/LinkProperties;->isReachable(Ljava/net/InetAddress;)Z
+Landroid/net/LinkProperties;->removeDnsServer(Ljava/net/InetAddress;)Z
+Landroid/net/LinkProperties;->removeRoute(Landroid/net/RouteInfo;)Z
+Landroid/net/LinkProperties;->setDnsServers(Ljava/util/Collection;)V
+Landroid/net/LinkProperties;->setDomains(Ljava/lang/String;)V
+Landroid/net/LinkProperties;->setHttpProxy(Landroid/net/ProxyInfo;)V
+Landroid/net/LinkProperties;->setInterfaceName(Ljava/lang/String;)V
+Landroid/net/LinkProperties;->setLinkAddresses(Ljava/util/Collection;)V
+Landroid/net/LinkProperties;->setMtu(I)V
+Landroid/net/LinkProperties;->setTcpBufferSizes(Ljava/lang/String;)V
+Landroid/net/LocalSocketImpl;->inboundFileDescriptors:[Ljava/io/FileDescriptor;
+Landroid/net/LocalSocketImpl;->outboundFileDescriptors:[Ljava/io/FileDescriptor;
+Landroid/net/MacAddress;->ALL_ZEROS_ADDRESS:Landroid/net/MacAddress;
+Landroid/net/Network;-><init>(I)V
+Landroid/net/Network;->netId:I
+Landroid/net/NetworkBadging$Badging;
+Landroid/net/NetworkBadging;
+Landroid/net/NetworkBadging;->BADGING_4K:I
+Landroid/net/NetworkBadging;->BADGING_HD:I
+Landroid/net/NetworkBadging;->BADGING_NONE:I
+Landroid/net/NetworkBadging;->BADGING_SD:I
+Landroid/net/NetworkBadging;->getWifiIcon(IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
+Landroid/net/NetworkCapabilities;->getCapabilities()[I
+Landroid/net/NetworkCapabilities;->getNetworkSpecifier()Landroid/net/NetworkSpecifier;
+Landroid/net/NetworkCapabilities;->getSignalStrength()I
+Landroid/net/NetworkCapabilities;->getTransportTypes()[I
+Landroid/net/NetworkCapabilities;->hasSignalStrength()Z
+Landroid/net/NetworkCapabilities;->transportNamesOf([I)Ljava/lang/String;
+Landroid/net/NetworkPolicyManager;->mService:Landroid/net/INetworkPolicyManager;
+Landroid/net/NetworkQuotaInfo;->getEstimatedBytes()J
+Landroid/net/NetworkQuotaInfo;->getHardLimitBytes()J
+Landroid/net/NetworkQuotaInfo;->getSoftLimitBytes()J
+Landroid/net/NetworkRequest$Builder;->setSignalStrength(I)Landroid/net/NetworkRequest$Builder;
+Landroid/net/NetworkRequest;->networkCapabilities:Landroid/net/NetworkCapabilities;
+Landroid/net/NetworkState;->network:Landroid/net/Network;
+Landroid/net/NetworkStats$Entry;-><init>()V
+Landroid/net/NetworkStats$Entry;->iface:Ljava/lang/String;
+Landroid/net/NetworkStats$Entry;->rxBytes:J
+Landroid/net/NetworkStats$Entry;->rxPackets:J
+Landroid/net/NetworkStats$Entry;->set:I
+Landroid/net/NetworkStats$Entry;->tag:I
+Landroid/net/NetworkStats$Entry;->txBytes:J
+Landroid/net/NetworkStats$Entry;->txPackets:J
+Landroid/net/NetworkStats$Entry;->uid:I
+Landroid/net/NetworkStats;-><init>(JI)V
+Landroid/net/NetworkStats;->capacity:I
+Landroid/net/NetworkStats;->combineValues(Landroid/net/NetworkStats$Entry;)Landroid/net/NetworkStats;
+Landroid/net/NetworkStats;->defaultNetwork:[I
+Landroid/net/NetworkStats;->iface:[Ljava/lang/String;
+Landroid/net/NetworkStats;->metered:[I
+Landroid/net/NetworkStats;->operations:[J
+Landroid/net/NetworkStats;->roaming:[I
+Landroid/net/NetworkStats;->rxBytes:[J
+Landroid/net/NetworkStats;->rxPackets:[J
+Landroid/net/NetworkStats;->set:[I
+Landroid/net/NetworkStats;->size:I
+Landroid/net/NetworkStats;->tag:[I
+Landroid/net/NetworkStats;->txBytes:[J
+Landroid/net/NetworkStats;->txPackets:[J
+Landroid/net/NetworkStats;->uid:[I
+Landroid/net/NetworkStatsHistory$Entry;->rxBytes:J
+Landroid/net/NetworkStatsHistory$Entry;->txBytes:J
+Landroid/net/NetworkStatsHistory;->getStart()J
+Landroid/net/NetworkStatsHistory;->getValues(JJLandroid/net/NetworkStatsHistory$Entry;)Landroid/net/NetworkStatsHistory$Entry;
+Landroid/net/NetworkTemplate;->buildTemplateMobileAll(Ljava/lang/String;)Landroid/net/NetworkTemplate;
+Landroid/net/NetworkTemplate;->buildTemplateWifi()Landroid/net/NetworkTemplate;
+Landroid/net/NetworkUtils;->attachControlPacketFilter(Ljava/io/FileDescriptor;I)V
+Landroid/net/NetworkUtils;->attachDhcpFilter(Ljava/io/FileDescriptor;)V
+Landroid/net/NetworkUtils;->attachRaFilter(Ljava/io/FileDescriptor;I)V
+Landroid/net/NetworkUtils;->getImplicitNetmask(Ljava/net/Inet4Address;)I
+Landroid/net/NetworkUtils;->netmaskToPrefixLength(Ljava/net/Inet4Address;)I
+Landroid/net/NetworkUtils;->protectFromVpn(Ljava/io/FileDescriptor;)Z
+Landroid/net/Proxy;->getProxy(Landroid/content/Context;Ljava/lang/String;)Ljava/net/Proxy;
+Landroid/net/ProxyInfo;-><init>(Ljava/lang/String;ILjava/lang/String;)V
+Landroid/net/RouteInfo;-><init>(Landroid/net/IpPrefix;Ljava/net/InetAddress;Ljava/lang/String;)V
+Landroid/net/RouteInfo;->hasGateway()Z
+Landroid/net/RouteInfo;->selectBestRoute(Ljava/util/Collection;Ljava/net/InetAddress;)Landroid/net/RouteInfo;
+Landroid/net/SSLCertificateSocketFactory;-><init>(ILandroid/net/SSLSessionCache;Z)V
+Landroid/net/SSLCertificateSocketFactory;->INSECURE_TRUST_MANAGER:[Ljavax/net/ssl/TrustManager;
+Landroid/net/SSLCertificateSocketFactory;->TAG:Ljava/lang/String;
+Landroid/net/SSLCertificateSocketFactory;->castToOpenSSLSocket(Ljava/net/Socket;)Lcom/android/org/conscrypt/OpenSSLSocketImpl;
+Landroid/net/SSLCertificateSocketFactory;->getAlpnSelectedProtocol(Ljava/net/Socket;)[B
+Landroid/net/SSLCertificateSocketFactory;->getDelegate()Ljavax/net/ssl/SSLSocketFactory;
+Landroid/net/SSLCertificateSocketFactory;->getHttpSocketFactory(ILandroid/net/SSLSessionCache;)Lorg/apache/http/conn/ssl/SSLSocketFactory;
+Landroid/net/SSLCertificateSocketFactory;->isSslCheckRelaxed()Z
+Landroid/net/SSLCertificateSocketFactory;->mAlpnProtocols:[B
+Landroid/net/SSLCertificateSocketFactory;->mChannelIdPrivateKey:Ljava/security/PrivateKey;
+Landroid/net/SSLCertificateSocketFactory;->mHandshakeTimeoutMillis:I
+Landroid/net/SSLCertificateSocketFactory;->mInsecureFactory:Ljavax/net/ssl/SSLSocketFactory;
+Landroid/net/SSLCertificateSocketFactory;->mKeyManagers:[Ljavax/net/ssl/KeyManager;
+Landroid/net/SSLCertificateSocketFactory;->mNpnProtocols:[B
+Landroid/net/SSLCertificateSocketFactory;->mSecure:Z
+Landroid/net/SSLCertificateSocketFactory;->mSecureFactory:Ljavax/net/ssl/SSLSocketFactory;
+Landroid/net/SSLCertificateSocketFactory;->mSessionCache:Lcom/android/org/conscrypt/SSLClientSessionCache;
+Landroid/net/SSLCertificateSocketFactory;->mTrustManagers:[Ljavax/net/ssl/TrustManager;
+Landroid/net/SSLCertificateSocketFactory;->makeSocketFactory([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;)Ljavax/net/ssl/SSLSocketFactory;
+Landroid/net/SSLCertificateSocketFactory;->setAlpnProtocols([[B)V
+Landroid/net/SSLCertificateSocketFactory;->setChannelIdPrivateKey(Ljava/security/PrivateKey;)V
+Landroid/net/SSLCertificateSocketFactory;->setSoWriteTimeout(Ljava/net/Socket;I)V
+Landroid/net/SSLCertificateSocketFactory;->verifyHostname(Ljava/net/Socket;Ljava/lang/String;)V
+Landroid/net/SSLSessionCache;->mSessionCache:Lcom/android/org/conscrypt/SSLClientSessionCache;
+Landroid/net/SntpClient;-><init>()V
+Landroid/net/SntpClient;->getNtpTime()J
+Landroid/net/SntpClient;->getNtpTimeReference()J
+Landroid/net/SntpClient;->getRoundTripTime()J
+Landroid/net/SntpClient;->requestTime(Ljava/lang/String;I)Z
+Landroid/net/StaticIpConfiguration;-><init>()V
+Landroid/net/StaticIpConfiguration;->dnsServers:Ljava/util/ArrayList;
+Landroid/net/StaticIpConfiguration;->domains:Ljava/lang/String;
+Landroid/net/StaticIpConfiguration;->gateway:Ljava/net/InetAddress;
+Landroid/net/StaticIpConfiguration;->getRoutes(Ljava/lang/String;)Ljava/util/List;
+Landroid/net/StaticIpConfiguration;->ipAddress:Landroid/net/LinkAddress;
+Landroid/net/StringNetworkSpecifier;->specifier:Ljava/lang/String;
+Landroid/net/TrafficStats;->getMobileIfaces()[Ljava/lang/String;
+Landroid/net/TrafficStats;->getMobileTcpRxPackets()J
+Landroid/net/TrafficStats;->getMobileTcpTxPackets()J
+Landroid/net/TrafficStats;->getRxBytes(Ljava/lang/String;)J
+Landroid/net/TrafficStats;->getStatsService()Landroid/net/INetworkStatsService;
+Landroid/net/TrafficStats;->getTxBytes(Ljava/lang/String;)J
+Landroid/net/TrafficStats;->setThreadStatsUidSelf()V
+Landroid/net/Uri;-><init>()V
+Landroid/net/http/SslError;->mCertificate:Landroid/net/http/SslCertificate;
+Landroid/net/metrics/ApfProgramEvent;-><init>()V
+Landroid/net/metrics/ApfProgramEvent;->actualLifetime:J
+Landroid/net/metrics/ApfProgramEvent;->currentRas:I
+Landroid/net/metrics/ApfProgramEvent;->filteredRas:I
+Landroid/net/metrics/ApfProgramEvent;->flags:I
+Landroid/net/metrics/ApfProgramEvent;->flagsFor(ZZ)I
+Landroid/net/metrics/ApfProgramEvent;->lifetime:J
+Landroid/net/metrics/ApfProgramEvent;->programLength:I
+Landroid/net/metrics/ApfStats;-><init>()V
+Landroid/net/metrics/ApfStats;->droppedRas:I
+Landroid/net/metrics/ApfStats;->durationMs:J
+Landroid/net/metrics/ApfStats;->matchingRas:I
+Landroid/net/metrics/ApfStats;->maxProgramSize:I
+Landroid/net/metrics/ApfStats;->parseErrors:I
+Landroid/net/metrics/ApfStats;->programUpdates:I
+Landroid/net/metrics/ApfStats;->programUpdatesAll:I
+Landroid/net/metrics/ApfStats;->programUpdatesAllowingMulticast:I
+Landroid/net/metrics/ApfStats;->receivedRas:I
+Landroid/net/metrics/ApfStats;->zeroLifetimeRas:I
+Landroid/net/metrics/DhcpClientEvent;-><init>(Ljava/lang/String;I)V
+Landroid/net/metrics/DhcpErrorEvent;-><init>(I)V
+Landroid/net/metrics/DhcpErrorEvent;->BOOTP_TOO_SHORT:I
+Landroid/net/metrics/DhcpErrorEvent;->BUFFER_UNDERFLOW:I
+Landroid/net/metrics/DhcpErrorEvent;->DHCP_BAD_MAGIC_COOKIE:I
+Landroid/net/metrics/DhcpErrorEvent;->DHCP_INVALID_OPTION_LENGTH:I
+Landroid/net/metrics/DhcpErrorEvent;->DHCP_NO_COOKIE:I
+Landroid/net/metrics/DhcpErrorEvent;->DHCP_NO_MSG_TYPE:I
+Landroid/net/metrics/DhcpErrorEvent;->DHCP_UNKNOWN_MSG_TYPE:I
+Landroid/net/metrics/DhcpErrorEvent;->L2_TOO_SHORT:I
+Landroid/net/metrics/DhcpErrorEvent;->L2_WRONG_ETH_TYPE:I
+Landroid/net/metrics/DhcpErrorEvent;->L3_INVALID_IP:I
+Landroid/net/metrics/DhcpErrorEvent;->L3_NOT_IPV4:I
+Landroid/net/metrics/DhcpErrorEvent;->L3_TOO_SHORT:I
+Landroid/net/metrics/DhcpErrorEvent;->L4_NOT_UDP:I
+Landroid/net/metrics/DhcpErrorEvent;->L4_WRONG_PORT:I
+Landroid/net/metrics/DhcpErrorEvent;->PARSING_ERROR:I
+Landroid/net/metrics/DhcpErrorEvent;->RECEIVE_ERROR:I
+Landroid/net/metrics/DhcpErrorEvent;->errorCodeWithOption(II)I
+Landroid/net/metrics/IpConnectivityLog;-><init>()V
+Landroid/net/metrics/IpConnectivityLog;->log(Landroid/os/Parcelable;)Z
+Landroid/net/metrics/IpConnectivityLog;->log(Ljava/lang/String;Landroid/os/Parcelable;)Z
+Landroid/net/metrics/IpManagerEvent;-><init>(IJ)V
+Landroid/net/metrics/IpReachabilityEvent;-><init>(I)V
+Landroid/net/metrics/IpReachabilityEvent;->nudFailureEventType(ZZ)I
+Landroid/net/metrics/RaEvent$Builder;-><init>()V
+Landroid/net/metrics/RaEvent$Builder;->build()Landroid/net/metrics/RaEvent;
+Landroid/net/metrics/RaEvent$Builder;->updateDnsslLifetime(J)Landroid/net/metrics/RaEvent$Builder;
+Landroid/net/metrics/RaEvent$Builder;->updatePrefixPreferredLifetime(J)Landroid/net/metrics/RaEvent$Builder;
+Landroid/net/metrics/RaEvent$Builder;->updatePrefixValidLifetime(J)Landroid/net/metrics/RaEvent$Builder;
+Landroid/net/metrics/RaEvent$Builder;->updateRdnssLifetime(J)Landroid/net/metrics/RaEvent$Builder;
+Landroid/net/metrics/RaEvent$Builder;->updateRouteInfoLifetime(J)Landroid/net/metrics/RaEvent$Builder;
+Landroid/net/metrics/RaEvent$Builder;->updateRouterLifetime(J)Landroid/net/metrics/RaEvent$Builder;
+Landroid/net/sip/SipProfile;->readResolve()Ljava/lang/Object;
+Landroid/net/sip/SipProfile;->serialVersionUID:J
+Landroid/net/wifi/BatchedScanResult;
+Landroid/net/wifi/BatchedScanResult;-><init>()V
+Landroid/net/wifi/BatchedScanResult;-><init>(Landroid/net/wifi/BatchedScanResult;)V
+Landroid/net/wifi/BatchedScanResult;->scanResults:Ljava/util/List;
+Landroid/net/wifi/BatchedScanResult;->truncated:Z
+Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/net/wifi/IWifiManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiManager;
+Landroid/net/wifi/IWifiScanner$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/net/wifi/IWifiScanner$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Landroid/net/wifi/IWifiScanner$Stub;-><init>()V
+Landroid/net/wifi/IWifiScanner$Stub;->asInterface(Landroid/os/IBinder;)Landroid/net/wifi/IWifiScanner;
+Landroid/net/wifi/ScanResult$InformationElement;->EID_BSS_LOAD:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_ERP:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_EXTENDED_CAPS:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_EXTENDED_SUPPORTED_RATES:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_HT_OPERATION:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_INTERWORKING:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_ROAMING_CONSORTIUM:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_RSN:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_SSID:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_SUPPORTED_RATES:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_TIM:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_VHT_OPERATION:I
+Landroid/net/wifi/ScanResult$InformationElement;->EID_VSA:I
+Landroid/net/wifi/ScanResult$InformationElement;->bytes:[B
+Landroid/net/wifi/ScanResult$InformationElement;->id:I
+Landroid/net/wifi/ScanResult;->anqpDomainId:I
+Landroid/net/wifi/ScanResult;->anqpLines:Ljava/util/List;
+Landroid/net/wifi/ScanResult;->distanceCm:I
+Landroid/net/wifi/ScanResult;->distanceSdCm:I
+Landroid/net/wifi/ScanResult;->flags:J
+Landroid/net/wifi/ScanResult;->hessid:J
+Landroid/net/wifi/ScanResult;->informationElements:[Landroid/net/wifi/ScanResult$InformationElement;
+Landroid/net/wifi/ScanResult;->numUsage:I
+Landroid/net/wifi/ScanResult;->seen:J
+Landroid/net/wifi/ScanResult;->untrusted:Z
+Landroid/net/wifi/ScanResult;->wifiSsid:Landroid/net/wifi/WifiSsid;
+Landroid/net/wifi/WifiConfiguration;->apBand:I
+Landroid/net/wifi/WifiConfiguration;->apChannel:I
+Landroid/net/wifi/WifiConfiguration;->defaultGwMacAddress:Ljava/lang/String;
+Landroid/net/wifi/WifiConfiguration;->lastConnectUid:I
+Landroid/net/wifi/WifiConfiguration;->mIpConfiguration:Landroid/net/IpConfiguration;
+Landroid/net/wifi/WifiConfiguration;->setIpAssignment(Landroid/net/IpConfiguration$IpAssignment;)V
+Landroid/net/wifi/WifiConfiguration;->setStaticIpConfiguration(Landroid/net/StaticIpConfiguration;)V
+Landroid/net/wifi/WifiConfiguration;->validatedInternetAccess:Z
+Landroid/net/wifi/WifiEnterpriseConfig;->getCaCertificateAlias()Ljava/lang/String;
+Landroid/net/wifi/WifiEnterpriseConfig;->getClientCertificateAlias()Ljava/lang/String;
+Landroid/net/wifi/WifiInfo;->DEFAULT_MAC_ADDRESS:Ljava/lang/String;
+Landroid/net/wifi/WifiInfo;->getMeteredHint()Z
+Landroid/net/wifi/WifiInfo;->getWifiSsid()Landroid/net/wifi/WifiSsid;
+Landroid/net/wifi/WifiInfo;->is5GHz()Z
+Landroid/net/wifi/WifiInfo;->mMacAddress:Ljava/lang/String;
+Landroid/net/wifi/WifiInfo;->removeDoubleQuotes(Ljava/lang/String;)Ljava/lang/String;
+Landroid/net/wifi/WifiInfo;->score:I
+Landroid/net/wifi/WifiManager;->cancelLocalOnlyHotspotRequest()V
+Landroid/net/wifi/WifiManager;->connect(ILandroid/net/wifi/WifiManager$ActionListener;)V
+Landroid/net/wifi/WifiManager;->forget(ILandroid/net/wifi/WifiManager$ActionListener;)V
+Landroid/net/wifi/WifiManager;->isDualBandSupported()Z
+Landroid/net/wifi/WifiManager;->mService:Landroid/net/wifi/IWifiManager;
+Landroid/net/wifi/WifiManager;->save(Landroid/net/wifi/WifiConfiguration;Landroid/net/wifi/WifiManager$ActionListener;)V
+Landroid/net/wifi/WifiSsid;->NONE:Ljava/lang/String;
+Landroid/net/wifi/WifiSsid;->getOctets()[B
+Landroid/net/wifi/p2p/WifiP2pGroup;->TEMPORARY_NET_ID:I
+Landroid/net/wifi/p2p/WifiP2pGroup;->getNetworkId()I
+Landroid/net/wifi/p2p/WifiP2pGroupList;->getGroupList()Ljava/util/Collection;
+Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
+Landroid/net/wifi/p2p/WifiP2pManager$Channel;->putListener(Ljava/lang/Object;)I
+Landroid/net/wifi/p2p/WifiP2pManager;->CREATE_GROUP:I
+Landroid/net/wifi/p2p/WifiP2pManager;->deletePersistentGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;ILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
+Landroid/net/wifi/p2p/WifiP2pManager;->requestPersistentGroupInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$PersistentGroupInfoListener;)V
+Landroid/net/wifi/p2p/WifiP2pManager;->setDeviceName(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
+Landroid/net/wifi/p2p/WifiP2pManager;->setWifiP2pChannels(Landroid/net/wifi/p2p/WifiP2pManager$Channel;IILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
+Landroid/nfc/NfcAdapter;->getAdapterState()I
+Landroid/nfc/NfcAdapter;->getDefaultAdapter()Landroid/nfc/NfcAdapter;
+Landroid/nfc/NfcAdapter;->getNfcAdapter(Landroid/content/Context;)Landroid/nfc/NfcAdapter;
+Landroid/nfc/NfcAdapter;->setNdefPushMessageCallback(Landroid/nfc/NfcAdapter$CreateNdefMessageCallback;Landroid/app/Activity;I)V
+Landroid/opengl/GLSurfaceView$EglHelper;->mEglContext:Ljavax/microedition/khronos/egl/EGLContext;
+Landroid/opengl/GLSurfaceView$GLThread;->mEglHelper:Landroid/opengl/GLSurfaceView$EglHelper;
+Landroid/opengl/GLSurfaceView;->mGLThread:Landroid/opengl/GLSurfaceView$GLThread;
+Landroid/opengl/GLSurfaceView;->mRenderer:Landroid/opengl/GLSurfaceView$Renderer;
+Landroid/os/AsyncResult;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Throwable;)V
+Landroid/os/AsyncResult;->exception:Ljava/lang/Throwable;
+Landroid/os/AsyncResult;->forMessage(Landroid/os/Message;Ljava/lang/Object;Ljava/lang/Throwable;)Landroid/os/AsyncResult;
+Landroid/os/AsyncResult;->result:Ljava/lang/Object;
+Landroid/os/AsyncResult;->userObj:Ljava/lang/Object;
+Landroid/os/AsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;
+Landroid/os/AsyncTask;->mStatus:Landroid/os/AsyncTask$Status;
+Landroid/os/AsyncTask;->mTaskInvoked:Ljava/util/concurrent/atomic/AtomicBoolean;
+Landroid/os/AsyncTask;->mWorker:Landroid/os/AsyncTask$WorkerRunnable;
+Landroid/os/AsyncTask;->sDefaultExecutor:Ljava/util/concurrent/Executor;
+Landroid/os/AsyncTask;->setDefaultExecutor(Ljava/util/concurrent/Executor;)V
+Landroid/os/BatteryManager;-><init>()V
+Landroid/os/BatteryStats$Counter;->getCountLocked(I)I
+Landroid/os/BatteryStats$HistoryItem;-><init>()V
+Landroid/os/BatteryStats$HistoryItem;->CMD_UPDATE:B
+Landroid/os/BatteryStats$HistoryItem;->batteryLevel:B
+Landroid/os/BatteryStats$HistoryItem;->cmd:B
+Landroid/os/BatteryStats$HistoryItem;->states2:I
+Landroid/os/BatteryStats$HistoryItem;->states:I
+Landroid/os/BatteryStats$HistoryItem;->time:J
+Landroid/os/BatteryStats$Timer;->getCountLocked(I)I
+Landroid/os/BatteryStats$Timer;->getTotalTimeLocked(JI)J
+Landroid/os/BatteryStats$Uid$Pkg$Serv;->getLaunches(I)I
+Landroid/os/BatteryStats$Uid$Pkg$Serv;->getStartTime(JI)J
+Landroid/os/BatteryStats$Uid$Pkg;->getServiceStats()Landroid/util/ArrayMap;
+Landroid/os/BatteryStats$Uid$Pkg;->getWakeupAlarmStats()Landroid/util/ArrayMap;
+Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->overTime:J
+Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->type:I
+Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;->usedTime:J
+Landroid/os/BatteryStats$Uid$Proc;->countExcessivePowers()I
+Landroid/os/BatteryStats$Uid$Proc;->getExcessivePower(I)Landroid/os/BatteryStats$Uid$Proc$ExcessivePower;
+Landroid/os/BatteryStats$Uid$Proc;->getForegroundTime(I)J
+Landroid/os/BatteryStats$Uid$Proc;->getStarts(I)I
+Landroid/os/BatteryStats$Uid$Proc;->getSystemTime(I)J
+Landroid/os/BatteryStats$Uid$Proc;->getUserTime(I)J
+Landroid/os/BatteryStats$Uid$Sensor;->getHandle()I
+Landroid/os/BatteryStats$Uid$Sensor;->getSensorTime()Landroid/os/BatteryStats$Timer;
+Landroid/os/BatteryStats$Uid$Wakelock;->getWakeTime(I)Landroid/os/BatteryStats$Timer;
+Landroid/os/BatteryStats$Uid;-><init>()V
+Landroid/os/BatteryStats$Uid;->getAudioTurnedOnTimer()Landroid/os/BatteryStats$Timer;
+Landroid/os/BatteryStats$Uid;->getFullWifiLockTime(JI)J
+Landroid/os/BatteryStats$Uid;->getPackageStats()Landroid/util/ArrayMap;
+Landroid/os/BatteryStats$Uid;->getProcessStats()Landroid/util/ArrayMap;
+Landroid/os/BatteryStats$Uid;->getSensorStats()Landroid/util/SparseArray;
+Landroid/os/BatteryStats$Uid;->getUid()I
+Landroid/os/BatteryStats$Uid;->getVideoTurnedOnTimer()Landroid/os/BatteryStats$Timer;
+Landroid/os/BatteryStats$Uid;->getWifiMulticastTime(JI)J
+Landroid/os/BatteryStats$Uid;->getWifiRunningTime(JI)J
+Landroid/os/BatteryStats$Uid;->getWifiScanTime(JI)J
+Landroid/os/BatteryStats;->NUM_DATA_CONNECTION_TYPES:I
+Landroid/os/BatteryStats;->getNextHistoryLocked(Landroid/os/BatteryStats$HistoryItem;)Z
+Landroid/os/BatteryStats;->getUidStats()Landroid/util/SparseArray;
+Landroid/os/BatteryStats;->startIteratingHistoryLocked()Z
+Landroid/os/Binder;->execTransact(IJJI)Z
+Landroid/os/Binder;->mObject:J
+Landroid/os/Broadcaster;-><init>()V
+Landroid/os/Broadcaster;->broadcast(Landroid/os/Message;)V
+Landroid/os/Broadcaster;->cancelRequest(ILandroid/os/Handler;I)V
+Landroid/os/Broadcaster;->request(ILandroid/os/Handler;I)V
+Landroid/os/Build$VERSION;->ACTIVE_CODENAMES:[Ljava/lang/String;
+Landroid/os/Build;->IS_DEBUGGABLE:Z
+Landroid/os/Build;->IS_EMULATOR:Z
+Landroid/os/Build;->PERMISSIONS_REVIEW_REQUIRED:Z
+Landroid/os/Build;->getString(Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/Bundle;->getIBinder(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/Bundle;->putIBinder(Ljava/lang/String;Landroid/os/IBinder;)V
+Landroid/os/Debug$MemoryInfo;->NUM_DVK_STATS:I
+Landroid/os/Debug$MemoryInfo;->NUM_OTHER_STATS:I
+Landroid/os/Debug$MemoryInfo;->dalvikPrivateClean:I
+Landroid/os/Debug$MemoryInfo;->dalvikRss:I
+Landroid/os/Debug$MemoryInfo;->dalvikSharedClean:I
+Landroid/os/Debug$MemoryInfo;->dalvikSwappablePss:I
+Landroid/os/Debug$MemoryInfo;->dalvikSwappedOut:I
+Landroid/os/Debug$MemoryInfo;->dalvikSwappedOutPss:I
+Landroid/os/Debug$MemoryInfo;->getOtherLabel(I)Ljava/lang/String;
+Landroid/os/Debug$MemoryInfo;->getOtherPrivate(I)I
+Landroid/os/Debug$MemoryInfo;->getOtherPrivateDirty(I)I
+Landroid/os/Debug$MemoryInfo;->getOtherPss(I)I
+Landroid/os/Debug$MemoryInfo;->getOtherSharedDirty(I)I
+Landroid/os/Debug$MemoryInfo;->getTotalUss()I
+Landroid/os/Debug$MemoryInfo;->hasSwappedOutPss:Z
+Landroid/os/Debug$MemoryInfo;->nativePrivateClean:I
+Landroid/os/Debug$MemoryInfo;->nativeRss:I
+Landroid/os/Debug$MemoryInfo;->nativeSharedClean:I
+Landroid/os/Debug$MemoryInfo;->nativeSwappablePss:I
+Landroid/os/Debug$MemoryInfo;->nativeSwappedOut:I
+Landroid/os/Debug$MemoryInfo;->nativeSwappedOutPss:I
+Landroid/os/Debug$MemoryInfo;->otherPrivateClean:I
+Landroid/os/Debug$MemoryInfo;->otherRss:I
+Landroid/os/Debug$MemoryInfo;->otherSharedClean:I
+Landroid/os/Debug$MemoryInfo;->otherStats:[I
+Landroid/os/Debug$MemoryInfo;->otherSwappablePss:I
+Landroid/os/Debug$MemoryInfo;->otherSwappedOut:I
+Landroid/os/Debug$MemoryInfo;->otherSwappedOutPss:I
+Landroid/os/Debug;-><init>()V
+Landroid/os/Debug;->countInstancesOfClass(Ljava/lang/Class;)J
+Landroid/os/Debug;->dumpReferenceTables()V
+Landroid/os/DropBoxManager;->mService:Lcom/android/internal/os/IDropBoxManagerService;
+Landroid/os/Environment;->buildExternalStorageAppDataDirs(Ljava/lang/String;)[Ljava/io/File;
+Landroid/os/Environment;->getLegacyExternalStorageDirectory()Ljava/io/File;
+Landroid/os/Environment;->getStorageDirectory()Ljava/io/File;
+Landroid/os/Environment;->getVendorDirectory()Ljava/io/File;
+Landroid/os/Environment;->maybeTranslateEmulatedPathToInternal(Ljava/io/File;)Ljava/io/File;
+Landroid/os/FileObserver$ObserverThread;->onEvent(IILjava/lang/String;)V
+Landroid/os/FileUtils;->checksumCrc32(Ljava/io/File;)J
+Landroid/os/FileUtils;->copyFile(Ljava/io/File;Ljava/io/File;)Z
+Landroid/os/FileUtils;->copyToFile(Ljava/io/InputStream;Ljava/io/File;)Z
+Landroid/os/FileUtils;->deleteOlderFiles(Ljava/io/File;IJ)Z
+Landroid/os/FileUtils;->readTextFile(Ljava/io/File;ILjava/lang/String;)Ljava/lang/String;
+Landroid/os/FileUtils;->setPermissions(Ljava/io/File;III)I
+Landroid/os/FileUtils;->setPermissions(Ljava/io/FileDescriptor;III)I
+Landroid/os/FileUtils;->setPermissions(Ljava/lang/String;III)I
+Landroid/os/FileUtils;->stringToFile(Ljava/io/File;Ljava/lang/String;)V
+Landroid/os/FileUtils;->stringToFile(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/os/FileUtils;->sync(Ljava/io/FileOutputStream;)Z
+Landroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
+Landroid/os/Handler;-><init>(Z)V
+Landroid/os/Handler;->getIMessenger()Landroid/os/IMessenger;
+Landroid/os/Handler;->getMain()Landroid/os/Handler;
+Landroid/os/Handler;->hasCallbacks(Ljava/lang/Runnable;)Z
+Landroid/os/Handler;->mCallback:Landroid/os/Handler$Callback;
+Landroid/os/Handler;->mMessenger:Landroid/os/IMessenger;
+Landroid/os/HwBinder;->reportSyspropChanged()V
+Landroid/os/HwParcel;-><init>(Z)V
+Landroid/os/HwRemoteBinder;-><init>()V
+Landroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/os/INetworkManagementService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/INetworkManagementService;
+Landroid/os/INetworkManagementService;->clearInterfaceAddresses(Ljava/lang/String;)V
+Landroid/os/INetworkManagementService;->disableIpv6(Ljava/lang/String;)V
+Landroid/os/INetworkManagementService;->enableIpv6(Ljava/lang/String;)V
+Landroid/os/INetworkManagementService;->isBandwidthControlEnabled()Z
+Landroid/os/INetworkManagementService;->registerObserver(Landroid/net/INetworkManagementEventObserver;)V
+Landroid/os/INetworkManagementService;->setIPv6AddrGenMode(Ljava/lang/String;I)V
+Landroid/os/INetworkManagementService;->setInterfaceConfig(Ljava/lang/String;Landroid/net/InterfaceConfiguration;)V
+Landroid/os/INetworkManagementService;->setInterfaceIpv6PrivacyExtensions(Ljava/lang/String;Z)V
+Landroid/os/INetworkManagementService;->unregisterObserver(Landroid/net/INetworkManagementEventObserver;)V
+Landroid/os/IPermissionController$Stub$Proxy;->checkPermission(Ljava/lang/String;II)Z
+Landroid/os/IPermissionController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPermissionController;
+Landroid/os/IPowerManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/os/IPowerManager$Stub$Proxy;->isLightDeviceIdleMode()Z
+Landroid/os/IPowerManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IPowerManager;
+Landroid/os/IPowerManager;->goToSleep(JII)V
+Landroid/os/IPowerManager;->reboot(ZLjava/lang/String;Z)V
+Landroid/os/IPowerManager;->releaseWakeLock(Landroid/os/IBinder;I)V
+Landroid/os/IPowerManager;->userActivity(JII)V
+Landroid/os/IRecoverySystem$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IRecoverySystem;
+Landroid/os/IRemoteCallback$Stub;-><init>()V
+Landroid/os/IServiceManager;->checkService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/IServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/IUserManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/os/IUserManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IUserManager;
+Landroid/os/IVibratorService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IVibratorService;
+Landroid/os/LocaleList;->setDefault(Landroid/os/LocaleList;I)V
+Landroid/os/Looper;->mQueue:Landroid/os/MessageQueue;
+Landroid/os/Looper;->sThreadLocal:Ljava/lang/ThreadLocal;
+Landroid/os/Looper;->setTraceTag(J)V
+Landroid/os/MemoryFile;->getFileDescriptor()Ljava/io/FileDescriptor;
+Landroid/os/Message;->callback:Ljava/lang/Runnable;
+Landroid/os/Message;->flags:I
+Landroid/os/Message;->markInUse()V
+Landroid/os/Message;->next:Landroid/os/Message;
+Landroid/os/Message;->recycleUnchecked()V
+Landroid/os/Message;->setCallback(Ljava/lang/Runnable;)Landroid/os/Message;
+Landroid/os/Message;->target:Landroid/os/Handler;
+Landroid/os/Message;->when:J
+Landroid/os/MessageQueue;->dispatchEvents(II)I
+Landroid/os/MessageQueue;->mIdleHandlers:Ljava/util/ArrayList;
+Landroid/os/MessageQueue;->mMessages:Landroid/os/Message;
+Landroid/os/MessageQueue;->mPtr:J
+Landroid/os/MessageQueue;->mQuitAllowed:Z
+Landroid/os/MessageQueue;->nativePollOnce(JI)V
+Landroid/os/MessageQueue;->next()Landroid/os/Message;
+Landroid/os/MessageQueue;->postSyncBarrier()I
+Landroid/os/MessageQueue;->removeSyncBarrier(I)V
+Landroid/os/Parcel$ReadWriteHelper;-><init>()V
+Landroid/os/Parcel;->mNativePtr:J
+Landroid/os/Parcel;->readArrayMap(Landroid/util/ArrayMap;Ljava/lang/ClassLoader;)V
+Landroid/os/Parcel;->readBlob()[B
+Landroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List;
+Landroid/os/Parcel;->readStringArray()[Ljava/lang/String;
+Landroid/os/Parcel;->writeArrayMap(Landroid/util/ArrayMap;)V
+Landroid/os/Parcel;->writeBlob([B)V
+Landroid/os/Parcel;->writeParcelableList(Ljava/util/List;I)V
+Landroid/os/ParcelFileDescriptor$FileDescriptorDetachedException;->serialVersionUID:J
+Landroid/os/ParcelFileDescriptor;-><init>(Ljava/io/FileDescriptor;)V
+Landroid/os/ParcelFileDescriptor;->fromData([BLjava/lang/String;)Landroid/os/ParcelFileDescriptor;
+Landroid/os/PowerManager;->ACTION_SCREEN_BRIGHTNESS_BOOST_CHANGED:Ljava/lang/String;
+Landroid/os/PowerManager;->getDefaultScreenBrightnessSetting()I
+Landroid/os/PowerManager;->getMaximumScreenBrightnessSetting()I
+Landroid/os/PowerManager;->getMinimumScreenBrightnessSetting()I
+Landroid/os/PowerManager;->goToSleep(J)V
+Landroid/os/PowerManager;->isLightDeviceIdleMode()Z
+Landroid/os/PowerManager;->isScreenBrightnessBoosted()Z
+Landroid/os/PowerManager;->mService:Landroid/os/IPowerManager;
+Landroid/os/PowerManager;->userActivity(JZ)V
+Landroid/os/PowerManager;->validateWakeLockParameters(ILjava/lang/String;)V
+Landroid/os/PowerManager;->wakeUp(J)V
+Landroid/os/PowerManager;->wakeUp(JLjava/lang/String;)V
+Landroid/os/Process;->getFreeMemory()J
+Landroid/os/Process;->getParentPid(I)I
+Landroid/os/Process;->getPids(Ljava/lang/String;[I)[I
+Landroid/os/Process;->getTotalMemory()J
+Landroid/os/Process;->getUidForPid(I)I
+Landroid/os/Process;->isIsolated(I)Z
+Landroid/os/Process;->readProcFile(Ljava/lang/String;[I[Ljava/lang/String;[J[F)Z
+Landroid/os/Process;->readProcLines(Ljava/lang/String;[Ljava/lang/String;[J)V
+Landroid/os/Process;->setArgV0(Ljava/lang/String;)V
+Landroid/os/RecoverySystem;-><init>()V
+Landroid/os/Registrant;-><init>(Landroid/os/Handler;ILjava/lang/Object;)V
+Landroid/os/Registrant;->clear()V
+Landroid/os/Registrant;->notifyRegistrant()V
+Landroid/os/Registrant;->notifyRegistrant(Landroid/os/AsyncResult;)V
+Landroid/os/RegistrantList;-><init>()V
+Landroid/os/RegistrantList;->add(Landroid/os/Registrant;)V
+Landroid/os/RegistrantList;->addUnique(Landroid/os/Handler;ILjava/lang/Object;)V
+Landroid/os/RegistrantList;->notifyRegistrants()V
+Landroid/os/RegistrantList;->notifyRegistrants(Landroid/os/AsyncResult;)V
+Landroid/os/RegistrantList;->remove(Landroid/os/Handler;)V
+Landroid/os/RegistrantList;->removeCleared()V
+Landroid/os/RemoteException;->rethrowFromSystemServer()Ljava/lang/RuntimeException;
+Landroid/os/SELinux;->checkSELinuxAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
+Landroid/os/SELinux;->getFileContext(Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/SELinux;->getPidContext(I)Ljava/lang/String;
+Landroid/os/SELinux;->isSELinuxEnabled()Z
+Landroid/os/SELinux;->isSELinuxEnforced()Z
+Landroid/os/ServiceManager;-><init>()V
+Landroid/os/ServiceManager;->addService(Ljava/lang/String;Landroid/os/IBinder;)V
+Landroid/os/ServiceManager;->checkService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/ServiceManager;->getIServiceManager()Landroid/os/IServiceManager;
+Landroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/ServiceManager;->listServices()[Ljava/lang/String;
+Landroid/os/ServiceManager;->sCache:Ljava/util/HashMap;
+Landroid/os/ServiceManager;->sServiceManager:Landroid/os/IServiceManager;
+Landroid/os/ServiceManagerNative;->asInterface(Landroid/os/IBinder;)Landroid/os/IServiceManager;
+Landroid/os/ServiceSpecificException;->errorCode:I
+Landroid/os/SharedMemory;->getFd()I
+Landroid/os/StrictMode$Span;->finish()V
+Landroid/os/StrictMode$ThreadPolicy$Builder;->penaltyListener(Landroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;)Landroid/os/StrictMode$ThreadPolicy$Builder;
+Landroid/os/StrictMode$VmPolicy$Builder;->penaltyListener(Landroid/os/StrictMode$OnVmViolationListener;Ljava/util/concurrent/Executor;)Landroid/os/StrictMode$VmPolicy$Builder;
+Landroid/os/StrictMode;->conditionallyCheckInstanceCounts()V
+Landroid/os/StrictMode;->disableDeathOnFileUriExposure()V
+Landroid/os/StrictMode;->enterCriticalSpan(Ljava/lang/String;)Landroid/os/StrictMode$Span;
+Landroid/os/StrictMode;->getThreadPolicyMask()I
+Landroid/os/StrictMode;->onBinderStrictModePolicyChange(I)V
+Landroid/os/StrictMode;->violationsBeingTimed:Ljava/lang/ThreadLocal;
+Landroid/os/SystemClock;->elapsedRealtimeClock()Ljava/time/Clock;
+Landroid/os/SystemClock;->uptimeClock()Ljava/time/Clock;
+Landroid/os/SystemClock;->uptimeMillisClock()Ljava/time/Clock;
+Landroid/os/SystemProperties;-><init>()V
+Landroid/os/SystemProperties;->PROP_NAME_MAX:I
+Landroid/os/SystemProperties;->addChangeCallback(Ljava/lang/Runnable;)V
+Landroid/os/SystemProperties;->native_get(Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/SystemProperties;->reportSyspropChanged()V
+Landroid/os/SystemProperties;->set(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/os/SystemService;->start(Ljava/lang/String;)V
+Landroid/os/SystemService;->stop(Ljava/lang/String;)V
+Landroid/os/SystemVibrator;-><init>()V
+Landroid/os/TestLooperManager;->getQueue()Landroid/os/MessageQueue;
+Landroid/os/Trace;->TRACE_TAG_APP:J
+Landroid/os/Trace;->TRACE_TAG_VIEW:J
+Landroid/os/Trace;->asyncTraceBegin(JLjava/lang/String;I)V
+Landroid/os/Trace;->asyncTraceEnd(JLjava/lang/String;I)V
+Landroid/os/Trace;->isTagEnabled(J)Z
+Landroid/os/Trace;->setAppTracingAllowed(Z)V
+Landroid/os/Trace;->traceBegin(JLjava/lang/String;)V
+Landroid/os/Trace;->traceCounter(JLjava/lang/String;I)V
+Landroid/os/Trace;->traceEnd(J)V
+Landroid/os/UpdateLock;->NOW_IS_CONVENIENT:Ljava/lang/String;
+Landroid/os/UpdateLock;->TIMESTAMP:Ljava/lang/String;
+Landroid/os/UpdateLock;->UPDATE_LOCK_CHANGED:Ljava/lang/String;
+Landroid/os/UpdateLock;->acquire()V
+Landroid/os/UpdateLock;->isHeld()Z
+Landroid/os/UpdateLock;->release()V
+Landroid/os/UserHandle;-><init>(I)V
+Landroid/os/UserHandle;->AID_APP_END:I
+Landroid/os/UserHandle;->AID_APP_START:I
+Landroid/os/UserHandle;->AID_CACHE_GID_START:I
+Landroid/os/UserHandle;->AID_ROOT:I
+Landroid/os/UserHandle;->AID_SHARED_GID_START:I
+Landroid/os/UserHandle;->ALL:Landroid/os/UserHandle;
+Landroid/os/UserHandle;->CURRENT:Landroid/os/UserHandle;
+Landroid/os/UserHandle;->CURRENT_OR_SELF:Landroid/os/UserHandle;
+Landroid/os/UserHandle;->ERR_GID:I
+Landroid/os/UserHandle;->MU_ENABLED:Z
+Landroid/os/UserHandle;->OWNER:Landroid/os/UserHandle;
+Landroid/os/UserHandle;->PER_USER_RANGE:I
+Landroid/os/UserHandle;->USER_ALL:I
+Landroid/os/UserHandle;->USER_CURRENT:I
+Landroid/os/UserHandle;->USER_CURRENT_OR_SELF:I
+Landroid/os/UserHandle;->USER_NULL:I
+Landroid/os/UserHandle;->USER_OWNER:I
+Landroid/os/UserHandle;->USER_SERIAL_SYSTEM:I
+Landroid/os/UserHandle;->USER_SYSTEM:I
+Landroid/os/UserHandle;->getAppIdFromSharedAppGid(I)I
+Landroid/os/UserHandle;->getCallingUserId()I
+Landroid/os/UserHandle;->getUid(II)I
+Landroid/os/UserHandle;->getUserId(I)I
+Landroid/os/UserHandle;->isSameApp(II)Z
+Landroid/os/UserManager;->get(Landroid/content/Context;)Landroid/os/UserManager;
+Landroid/os/UserManager;->getBadgedDrawableForUser(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;Landroid/graphics/Rect;I)Landroid/graphics/drawable/Drawable;
+Landroid/os/UserManager;->getBadgedIconForUser(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;)Landroid/graphics/drawable/Drawable;
+Landroid/os/UserManager;->getBadgedLabelForUser(Ljava/lang/CharSequence;Landroid/os/UserHandle;)Ljava/lang/CharSequence;
+Landroid/os/UserManager;->getMaxSupportedUsers()I
+Landroid/os/UserManager;->getProfiles(I)Ljava/util/List;
+Landroid/os/UserManager;->getUserHandle()I
+Landroid/os/UserManager;->getUserHandle(I)I
+Landroid/os/UserManager;->getUserIcon(I)Landroid/graphics/Bitmap;
+Landroid/os/UserManager;->getUserInfo(I)Landroid/content/pm/UserInfo;
+Landroid/os/UserManager;->getUserSerialNumber(I)I
+Landroid/os/UserManager;->getUserStartRealtime()J
+Landroid/os/UserManager;->getUserUnlockRealtime()J
+Landroid/os/UserManager;->getUsers()Ljava/util/List;
+Landroid/os/UserManager;->hasBaseUserRestriction(Ljava/lang/String;Landroid/os/UserHandle;)Z
+Landroid/os/UserManager;->hasUserRestriction(Ljava/lang/String;Landroid/os/UserHandle;)Z
+Landroid/os/UserManager;->isAdminUser()Z
+Landroid/os/UserManager;->isLinkedUser()Z
+Landroid/os/UserManager;->isUserUnlocked(I)Z
+Landroid/os/UserManager;->mService:Landroid/os/IUserManager;
+Landroid/os/VintfObject;->getHalNamesAndVersions()[Ljava/lang/String;
+Landroid/os/VintfObject;->getSepolicyVersion()Ljava/lang/String;
+Landroid/os/VintfObject;->getTargetFrameworkCompatibilityMatrixVersion()Ljava/lang/Long;
+Landroid/os/VintfObject;->getVndkSnapshots()Ljava/util/Map;
+Landroid/os/VintfObject;->report()[Ljava/lang/String;
+Landroid/os/VintfRuntimeInfo;->getCpuInfo()Ljava/lang/String;
+Landroid/os/VintfRuntimeInfo;->getHardwareId()Ljava/lang/String;
+Landroid/os/VintfRuntimeInfo;->getKernelVersion()Ljava/lang/String;
+Landroid/os/VintfRuntimeInfo;->getNodeName()Ljava/lang/String;
+Landroid/os/VintfRuntimeInfo;->getOsName()Ljava/lang/String;
+Landroid/os/VintfRuntimeInfo;->getOsRelease()Ljava/lang/String;
+Landroid/os/VintfRuntimeInfo;->getOsVersion()Ljava/lang/String;
+Landroid/os/WorkSource;-><init>(I)V
+Landroid/os/WorkSource;->add(I)Z
+Landroid/os/WorkSource;->add(ILjava/lang/String;)Z
+Landroid/os/WorkSource;->addReturningNewbs(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+Landroid/os/WorkSource;->get(I)I
+Landroid/os/WorkSource;->getName(I)Ljava/lang/String;
+Landroid/os/WorkSource;->mNames:[Ljava/lang/String;
+Landroid/os/WorkSource;->mNum:I
+Landroid/os/WorkSource;->mUids:[I
+Landroid/os/WorkSource;->setReturningDiffs(Landroid/os/WorkSource;)[Landroid/os/WorkSource;
+Landroid/os/WorkSource;->size()I
+Landroid/os/health/HealthKeys$Constants;-><init>(Ljava/lang/Class;)V
+Landroid/os/health/HealthStats;-><init>(Landroid/os/Parcel;)V
+Landroid/os/health/HealthStatsParceler;-><init>(Landroid/os/Parcel;)V
+Landroid/os/health/HealthStatsParceler;-><init>(Landroid/os/health/HealthStatsWriter;)V
+Landroid/os/health/HealthStatsParceler;->getHealthStats()Landroid/os/health/HealthStats;
+Landroid/os/health/HealthStatsWriter;-><init>(Landroid/os/health/HealthKeys$Constants;)V
+Landroid/os/health/HealthStatsWriter;->addMeasurement(IJ)V
+Landroid/os/health/HealthStatsWriter;->addMeasurements(ILjava/lang/String;J)V
+Landroid/os/health/HealthStatsWriter;->addStats(ILjava/lang/String;Landroid/os/health/HealthStatsWriter;)V
+Landroid/os/health/HealthStatsWriter;->addTimer(IIJ)V
+Landroid/os/health/HealthStatsWriter;->addTimers(ILjava/lang/String;Landroid/os/health/TimerStat;)V
+Landroid/os/health/HealthStatsWriter;->flattenToParcel(Landroid/os/Parcel;)V
+Landroid/os/health/SystemHealthManager;->from(Landroid/content/Context;)Landroid/os/health/SystemHealthManager;
+Landroid/os/storage/DiskInfo;->getDescription()Ljava/lang/String;
+Landroid/os/storage/DiskInfo;->getId()Ljava/lang/String;
+Landroid/os/storage/DiskInfo;->isSd()Z
+Landroid/os/storage/DiskInfo;->isUsb()Z
+Landroid/os/storage/IStorageManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/os/storage/IStorageManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IStorageManager;
+Landroid/os/storage/StorageEventListener;-><init>()V
+Landroid/os/storage/StorageManager;->findVolumeById(Ljava/lang/String;)Landroid/os/storage/VolumeInfo;
+Landroid/os/storage/StorageManager;->findVolumeByUuid(Ljava/lang/String;)Landroid/os/storage/VolumeInfo;
+Landroid/os/storage/StorageManager;->from(Landroid/content/Context;)Landroid/os/storage/StorageManager;
+Landroid/os/storage/StorageManager;->getBestVolumeDescription(Landroid/os/storage/VolumeInfo;)Ljava/lang/String;
+Landroid/os/storage/StorageManager;->getDisks()Ljava/util/List;
+Landroid/os/storage/StorageManager;->getPrimaryVolume()Landroid/os/storage/StorageVolume;
+Landroid/os/storage/StorageManager;->getStorageBytesUntilLow(Ljava/io/File;)J
+Landroid/os/storage/StorageManager;->getStorageFullBytes(Ljava/io/File;)J
+Landroid/os/storage/StorageManager;->getStorageLowBytes(Ljava/io/File;)J
+Landroid/os/storage/StorageManager;->getVolumeList()[Landroid/os/storage/StorageVolume;
+Landroid/os/storage/StorageManager;->getVolumeList(II)[Landroid/os/storage/StorageVolume;
+Landroid/os/storage/StorageManager;->getVolumePaths()[Ljava/lang/String;
+Landroid/os/storage/StorageManager;->getVolumeState(Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/storage/StorageManager;->getVolumes()Ljava/util/List;
+Landroid/os/storage/StorageManager;->registerListener(Landroid/os/storage/StorageEventListener;)V
+Landroid/os/storage/StorageManager;->unregisterListener(Landroid/os/storage/StorageEventListener;)V
+Landroid/os/storage/StorageVolume;->allowMassStorage()Z
+Landroid/os/storage/StorageVolume;->getId()Ljava/lang/String;
+Landroid/os/storage/StorageVolume;->getMaxFileSize()J
+Landroid/os/storage/StorageVolume;->getPath()Ljava/lang/String;
+Landroid/os/storage/StorageVolume;->getPathFile()Ljava/io/File;
+Landroid/os/storage/StorageVolume;->getUserLabel()Ljava/lang/String;
+Landroid/os/storage/StorageVolume;->mPath:Ljava/io/File;
+Landroid/os/storage/VolumeInfo;->TYPE_EMULATED:I
+Landroid/os/storage/VolumeInfo;->TYPE_PUBLIC:I
+Landroid/os/storage/VolumeInfo;->buildStorageVolume(Landroid/content/Context;IZ)Landroid/os/storage/StorageVolume;
+Landroid/os/storage/VolumeInfo;->getDisk()Landroid/os/storage/DiskInfo;
+Landroid/os/storage/VolumeInfo;->getEnvironmentForState(I)Ljava/lang/String;
+Landroid/os/storage/VolumeInfo;->getFsUuid()Ljava/lang/String;
+Landroid/os/storage/VolumeInfo;->getId()Ljava/lang/String;
+Landroid/os/storage/VolumeInfo;->getPath()Ljava/io/File;
+Landroid/os/storage/VolumeInfo;->getState()I
+Landroid/os/storage/VolumeInfo;->getType()I
+Landroid/os/storage/VolumeInfo;->isPrimary()Z
+Landroid/os/storage/VolumeInfo;->isVisible()Z
+Landroid/permissionpresenterservice/RuntimePermissionPresenterService;->onRevokeRuntimePermission(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/preference/DialogPreference;->mBuilder:Landroid/app/AlertDialog$Builder;
+Landroid/preference/DialogPreference;->mDialog:Landroid/app/Dialog;
+Landroid/preference/DialogPreference;->mDialogIcon:Landroid/graphics/drawable/Drawable;
+Landroid/preference/DialogPreference;->mDialogMessage:Ljava/lang/CharSequence;
+Landroid/preference/DialogPreference;->mDialogTitle:Ljava/lang/CharSequence;
+Landroid/preference/DialogPreference;->mNegativeButtonText:Ljava/lang/CharSequence;
+Landroid/preference/DialogPreference;->mPositiveButtonText:Ljava/lang/CharSequence;
+Landroid/preference/DialogPreference;->mWhichButtonClicked:I
+Landroid/preference/ListPreference;->mClickedDialogEntryIndex:I
+Landroid/preference/Preference;->onKey(Landroid/view/View;ILandroid/view/KeyEvent;)Z
+Landroid/preference/Preference;->performClick(Landroid/preference/PreferenceScreen;)V
+Landroid/preference/PreferenceActivity;->mPreferenceManager:Landroid/preference/PreferenceManager;
+Landroid/preference/PreferenceActivity;->mPrefsContainer:Landroid/view/ViewGroup;
+Landroid/preference/PreferenceManager;-><init>(Landroid/app/Activity;I)V
+Landroid/preference/PreferenceManager;-><init>(Landroid/content/Context;)V
+Landroid/preference/PreferenceManager;->dispatchActivityDestroy()V
+Landroid/preference/PreferenceManager;->dispatchActivityResult(IILandroid/content/Intent;)V
+Landroid/preference/PreferenceManager;->dispatchActivityStop()V
+Landroid/preference/PreferenceManager;->getEditor()Landroid/content/SharedPreferences$Editor;
+Landroid/preference/PreferenceManager;->getPreferenceScreen()Landroid/preference/PreferenceScreen;
+Landroid/preference/PreferenceManager;->inflateFromIntent(Landroid/content/Intent;Landroid/preference/PreferenceScreen;)Landroid/preference/PreferenceScreen;
+Landroid/preference/PreferenceManager;->inflateFromResource(Landroid/content/Context;ILandroid/preference/PreferenceScreen;)Landroid/preference/PreferenceScreen;
+Landroid/preference/PreferenceManager;->mActivityDestroyListeners:Ljava/util/List;
+Landroid/preference/PreferenceManager;->mOnPreferenceTreeClickListener:Landroid/preference/PreferenceManager$OnPreferenceTreeClickListener;
+Landroid/preference/PreferenceManager;->mSharedPreferences:Landroid/content/SharedPreferences;
+Landroid/preference/PreferenceManager;->registerOnActivityDestroyListener(Landroid/preference/PreferenceManager$OnActivityDestroyListener;)V
+Landroid/preference/PreferenceManager;->registerOnActivityStopListener(Landroid/preference/PreferenceManager$OnActivityStopListener;)V
+Landroid/preference/PreferenceManager;->setFragment(Landroid/preference/PreferenceFragment;)V
+Landroid/preference/PreferenceManager;->setPreferences(Landroid/preference/PreferenceScreen;)Z
+Landroid/preference/PreferenceManager;->shouldCommit()Z
+Landroid/preference/PreferenceManager;->unregisterOnActivityDestroyListener(Landroid/preference/PreferenceManager$OnActivityDestroyListener;)V
+Landroid/preference/PreferenceManager;->unregisterOnActivityStopListener(Landroid/preference/PreferenceManager$OnActivityStopListener;)V
+Landroid/preference/PreferenceScreen;->mRootAdapter:Landroid/widget/ListAdapter;
+Landroid/print/PrintDocumentAdapter$LayoutResultCallback;-><init>()V
+Landroid/print/PrintDocumentAdapter$WriteResultCallback;-><init>()V
+Landroid/print/PrintJobInfo;->getAdvancedOptions()Landroid/os/Bundle;
+Landroid/print/PrintJobInfo;->getDocumentInfo()Landroid/print/PrintDocumentInfo;
+Landroid/print/PrinterId;->getServiceName()Landroid/content/ComponentName;
+Landroid/provider/Browser$BookmarkColumns;
+Landroid/provider/Browser$BookmarkColumns;-><init>()V
+Landroid/provider/Browser$BookmarkColumns;->BOOKMARK:Ljava/lang/String;
+Landroid/provider/Browser$BookmarkColumns;->CREATED:Ljava/lang/String;
+Landroid/provider/Browser$BookmarkColumns;->DATE:Ljava/lang/String;
+Landroid/provider/Browser$BookmarkColumns;->FAVICON:Ljava/lang/String;
+Landroid/provider/Browser$BookmarkColumns;->TITLE:Ljava/lang/String;
+Landroid/provider/Browser$BookmarkColumns;->URL:Ljava/lang/String;
+Landroid/provider/Browser$BookmarkColumns;->VISITS:Ljava/lang/String;
+Landroid/provider/Browser$SearchColumns;
+Landroid/provider/Browser$SearchColumns;-><init>()V
+Landroid/provider/Browser$SearchColumns;->DATE:Ljava/lang/String;
+Landroid/provider/Browser$SearchColumns;->SEARCH:Ljava/lang/String;
+Landroid/provider/Browser$SearchColumns;->URL:Ljava/lang/String;
+Landroid/provider/Browser;->BOOKMARKS_URI:Landroid/net/Uri;
+Landroid/provider/Browser;->HISTORY_PROJECTION:[Ljava/lang/String;
+Landroid/provider/Browser;->HISTORY_PROJECTION_BOOKMARK_INDEX:I
+Landroid/provider/Browser;->HISTORY_PROJECTION_DATE_INDEX:I
+Landroid/provider/Browser;->HISTORY_PROJECTION_FAVICON_INDEX:I
+Landroid/provider/Browser;->HISTORY_PROJECTION_ID_INDEX:I
+Landroid/provider/Browser;->HISTORY_PROJECTION_TITLE_INDEX:I
+Landroid/provider/Browser;->HISTORY_PROJECTION_URL_INDEX:I
+Landroid/provider/Browser;->HISTORY_PROJECTION_VISITS_INDEX:I
+Landroid/provider/Browser;->SEARCHES_PROJECTION:[Ljava/lang/String;
+Landroid/provider/Browser;->SEARCHES_PROJECTION_DATE_INDEX:I
+Landroid/provider/Browser;->SEARCHES_PROJECTION_SEARCH_INDEX:I
+Landroid/provider/Browser;->SEARCHES_URI:Landroid/net/Uri;
+Landroid/provider/Browser;->TRUNCATE_HISTORY_PROJECTION:[Ljava/lang/String;
+Landroid/provider/Browser;->TRUNCATE_HISTORY_PROJECTION_ID_INDEX:I
+Landroid/provider/Browser;->TRUNCATE_N_OLDEST:I
+Landroid/provider/Browser;->addSearchUrl(Landroid/content/ContentResolver;Ljava/lang/String;)V
+Landroid/provider/Browser;->canClearHistory(Landroid/content/ContentResolver;)Z
+Landroid/provider/Browser;->clearHistory(Landroid/content/ContentResolver;)V
+Landroid/provider/Browser;->clearSearches(Landroid/content/ContentResolver;)V
+Landroid/provider/Browser;->deleteFromHistory(Landroid/content/ContentResolver;Ljava/lang/String;)V
+Landroid/provider/Browser;->deleteHistoryTimeFrame(Landroid/content/ContentResolver;JJ)V
+Landroid/provider/Browser;->getAllBookmarks(Landroid/content/ContentResolver;)Landroid/database/Cursor;
+Landroid/provider/Browser;->getAllVisitedUrls(Landroid/content/ContentResolver;)Landroid/database/Cursor;
+Landroid/provider/Browser;->getVisitedHistory(Landroid/content/ContentResolver;)[Ljava/lang/String;
+Landroid/provider/Browser;->requestAllIcons(Landroid/content/ContentResolver;Ljava/lang/String;Landroid/webkit/WebIconDatabase$IconListener;)V
+Landroid/provider/Browser;->saveBookmark(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
+Landroid/provider/Browser;->sendString(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
+Landroid/provider/Browser;->truncateHistory(Landroid/content/ContentResolver;)V
+Landroid/provider/Browser;->updateVisitedHistory(Landroid/content/ContentResolver;Ljava/lang/String;Z)V
+Landroid/provider/CalendarContract$CalendarAlerts;->findNextAlarmTime(Landroid/content/ContentResolver;J)J
+Landroid/provider/CalendarContract$CalendarAlerts;->rescheduleMissedAlarms(Landroid/content/ContentResolver;Landroid/content/Context;Landroid/app/AlarmManager;)V
+Landroid/provider/CalendarContract$Events;->PROVIDER_WRITABLE_COLUMNS:[Ljava/lang/String;
+Landroid/provider/ContactsContract$CommonDataKinds$Phone;->getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;
+Landroid/provider/ContactsContract$Contacts$StreamItems;
+Landroid/provider/ContactsContract$Contacts$StreamItems;->CONTENT_DIRECTORY:Ljava/lang/String;
+Landroid/provider/ContactsContract$RawContacts$StreamItems;
+Landroid/provider/ContactsContract$RawContacts$StreamItems;->CONTENT_DIRECTORY:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotos;
+Landroid/provider/ContactsContract$StreamItemPhotos;->PHOTO:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;->PHOTO_FILE_ID:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;->PHOTO_URI:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;->SORT_INDEX:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;->STREAM_ITEM_ID:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;->SYNC1:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;->SYNC2:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;->SYNC3:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemPhotosColumns;->SYNC4:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItems$StreamItemPhotos;
+Landroid/provider/ContactsContract$StreamItems$StreamItemPhotos;->CONTENT_DIRECTORY:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItems$StreamItemPhotos;->CONTENT_ITEM_TYPE:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItems$StreamItemPhotos;->CONTENT_TYPE:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItems;
+Landroid/provider/ContactsContract$StreamItems;->CONTENT_ITEM_TYPE:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItems;->CONTENT_LIMIT_URI:Landroid/net/Uri;
+Landroid/provider/ContactsContract$StreamItems;->CONTENT_PHOTO_URI:Landroid/net/Uri;
+Landroid/provider/ContactsContract$StreamItems;->CONTENT_TYPE:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItems;->CONTENT_URI:Landroid/net/Uri;
+Landroid/provider/ContactsContract$StreamItems;->MAX_ITEMS:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;
+Landroid/provider/ContactsContract$StreamItemsColumns;->ACCOUNT_NAME:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->ACCOUNT_TYPE:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->COMMENTS:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->CONTACT_ID:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->CONTACT_LOOKUP_KEY:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->DATA_SET:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->RAW_CONTACT_ID:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->RAW_CONTACT_SOURCE_ID:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->RES_ICON:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->RES_LABEL:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->RES_PACKAGE:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->SYNC1:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->SYNC2:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->SYNC3:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->SYNC4:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->TEXT:Ljava/lang/String;
+Landroid/provider/ContactsContract$StreamItemsColumns;->TIMESTAMP:Ljava/lang/String;
+Landroid/provider/Downloads$Impl$RequestHeaders;->INSERT_KEY_PREFIX:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_ALLOWED_NETWORK_TYPES:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_ALLOW_ROAMING:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_COOKIE_DATA:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_DELETED:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_DESCRIPTION:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_DESTINATION:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_FILE_NAME_HINT:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_IS_PUBLIC_API:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_MEDIA_SCANNED:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_MIME_TYPE:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_NOTIFICATION_CLASS:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_NOTIFICATION_EXTRAS:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_NOTIFICATION_PACKAGE:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_REFERER:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_TITLE:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_URI:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->COLUMN_VISIBILITY:Ljava/lang/String;
+Landroid/provider/Downloads$Impl;->CONTENT_URI:Landroid/net/Uri;
+Landroid/provider/Downloads$Impl;->DESTINATION_CACHE_PARTITION_PURGEABLE:I
+Landroid/provider/Downloads$Impl;->DESTINATION_FILE_URI:I
+Landroid/provider/Settings$ContentProviderHolder;->mContentProvider:Landroid/content/IContentProvider;
+Landroid/provider/Settings$Global;->CONTACT_METADATA_SYNC:Ljava/lang/String;
+Landroid/provider/Settings$Global;->ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED:Ljava/lang/String;
+Landroid/provider/Settings$Global;->PACKAGE_VERIFIER_ENABLE:Ljava/lang/String;
+Landroid/provider/Settings$Global;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/provider/Settings$Global;->sNameValueCache:Landroid/provider/Settings$NameValueCache;
+Landroid/provider/Settings$NameValueCache;->mProviderHolder:Landroid/provider/Settings$ContentProviderHolder;
+Landroid/provider/Settings$Secure;->ACCESSIBILITY_AUTOCLICK_ENABLED:Ljava/lang/String;
+Landroid/provider/Settings$Secure;->ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:Ljava/lang/String;
+Landroid/provider/Settings$Secure;->ACCESSIBILITY_LARGE_POINTER_ICON:Ljava/lang/String;
+Landroid/provider/Settings$Secure;->ENABLED_NOTIFICATION_LISTENERS:Ljava/lang/String;
+Landroid/provider/Settings$Secure;->INCALL_POWER_BUTTON_BEHAVIOR:Ljava/lang/String;
+Landroid/provider/Settings$Secure;->LONG_PRESS_TIMEOUT:Ljava/lang/String;
+Landroid/provider/Settings$Secure;->PACKAGE_VERIFIER_USER_CONSENT:Ljava/lang/String;
+Landroid/provider/Settings$Secure;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/provider/Settings$Secure;->putIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)Z
+Landroid/provider/Settings$Secure;->sNameValueCache:Landroid/provider/Settings$NameValueCache;
+Landroid/provider/Settings$System;->AIRPLANE_MODE_TOGGLEABLE_RADIOS:Ljava/lang/String;
+Landroid/provider/Settings$System;->APPEND_FOR_LAST_AUDIBLE:Ljava/lang/String;
+Landroid/provider/Settings$System;->HEARING_AID:Ljava/lang/String;
+Landroid/provider/Settings$System;->MASTER_MONO:Ljava/lang/String;
+Landroid/provider/Settings$System;->SCREEN_AUTO_BRIGHTNESS_ADJ:Ljava/lang/String;
+Landroid/provider/Settings$System;->VOLUME_ALARM:Ljava/lang/String;
+Landroid/provider/Settings$System;->VOLUME_BLUETOOTH_SCO:Ljava/lang/String;
+Landroid/provider/Settings$System;->VOLUME_MUSIC:Ljava/lang/String;
+Landroid/provider/Settings$System;->VOLUME_NOTIFICATION:Ljava/lang/String;
+Landroid/provider/Settings$System;->VOLUME_RING:Ljava/lang/String;
+Landroid/provider/Settings$System;->VOLUME_SETTINGS:[Ljava/lang/String;
+Landroid/provider/Settings$System;->VOLUME_SYSTEM:Ljava/lang/String;
+Landroid/provider/Settings$System;->VOLUME_VOICE:Ljava/lang/String;
+Landroid/provider/Settings$System;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/provider/Settings$System;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;I)Z
+Landroid/provider/Settings$System;->sNameValueCache:Landroid/provider/Settings$NameValueCache;
+Landroid/provider/Settings;->isCallingPackageAllowedToDrawOverlays(Landroid/content/Context;ILjava/lang/String;Z)Z
+Landroid/provider/Settings;->isCallingPackageAllowedToWriteSettings(Landroid/content/Context;ILjava/lang/String;Z)Z
+Landroid/provider/Telephony$Mms;->isEmailAddress(Ljava/lang/String;)Z
+Landroid/provider/Telephony$Sms$Draft;->addMessage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms$Inbox;->addMessage(ILandroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Z)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms$Inbox;->addMessage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Z)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms$Intents;->SMS_EMERGENCY_CB_RECEIVED_ACTION:Ljava/lang/String;
+Landroid/provider/Telephony$Sms$Outbox;->addMessage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZJ)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms$Sent;->addMessage(ILandroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms$Sent;->addMessage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms;->addMessageToUri(ILandroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZ)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms;->addMessageToUri(ILandroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZJ)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms;->addMessageToUri(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZ)Landroid/net/Uri;
+Landroid/provider/Telephony$Sms;->addMessageToUri(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ZZJ)Landroid/net/Uri;
+Landroid/renderscript/RenderScript;->create(Landroid/content/Context;I)Landroid/renderscript/RenderScript;
+Landroid/renderscript/RenderScript;->create(Landroid/content/Context;ILandroid/renderscript/RenderScript$ContextType;I)Landroid/renderscript/RenderScript;
+Landroid/renderscript/RenderScript;->getMinorID()J
+Landroid/renderscript/RenderScriptCacheDir;->mCacheDir:Ljava/io/File;
+Landroid/renderscript/RenderScriptCacheDir;->setupDiskCache(Ljava/io/File;)V
+Landroid/security/KeyStore;->getInstance()Landroid/security/KeyStore;
+Landroid/security/keystore/AndroidKeyStoreProvider;->getKeyStoreOperationHandle(Ljava/lang/Object;)J
+Landroid/security/keystore/recovery/KeyChainSnapshot;->getTrustedHardwarePublicKey()[B
+Landroid/security/keystore/recovery/RecoveryController;->generateAndStoreKey(Ljava/lang/String;[B)[B
+Landroid/security/keystore/recovery/RecoveryController;->generateKey(Ljava/lang/String;[B)Ljava/security/Key;
+Landroid/security/keystore/recovery/RecoveryController;->getAliases(Ljava/lang/String;)Ljava/util/List;
+Landroid/security/keystore/recovery/RecoveryController;->getRecoveryData()Landroid/security/keystore/recovery/KeyChainSnapshot;
+Landroid/security/keystore/recovery/RecoveryController;->getRecoveryStatus(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/security/keystore/recovery/RecoveryController;->initRecoveryService(Ljava/lang/String;[B)V
+Landroid/security/keystore/recovery/RecoveryController;->setRecoveryStatus(Ljava/lang/String;Ljava/lang/String;I)V
+Landroid/security/keystore/recovery/RecoverySession;->recoverKeys([BLjava/util/List;)Ljava/util/Map;
+Landroid/security/keystore/recovery/RecoverySession;->start(Ljava/security/cert/CertPath;[B[BLjava/util/List;)[B
+Landroid/security/keystore/recovery/RecoverySession;->start([B[B[BLjava/util/List;)[B
+Landroid/security/keystore/recovery/WrappedApplicationKey$Builder;->setAccount([B)Landroid/security/keystore/recovery/WrappedApplicationKey$Builder;
+Landroid/security/keystore/recovery/WrappedApplicationKey;->getAccount()[B
+Landroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
+Landroid/service/dreams/DreamService;->canDoze()Z
+Landroid/service/dreams/DreamService;->isDozing()Z
+Landroid/service/dreams/DreamService;->startDozing()V
+Landroid/service/dreams/DreamService;->stopDozing()V
+Landroid/service/euicc/EuiccProfileInfo;-><init>(Ljava/lang/String;[Landroid/telephony/UiccAccessRule;Ljava/lang/String;)V
+Landroid/service/euicc/GetDefaultDownloadableSubscriptionListResult;->result:I
+Landroid/service/euicc/GetDownloadableSubscriptionMetadataResult;->result:I
+Landroid/service/media/IMediaBrowserServiceCallbacks$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/media/IMediaBrowserServiceCallbacks;
+Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnect(Ljava/lang/String;Landroid/media/session/MediaSession$Token;Landroid/os/Bundle;)V
+Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnectFailed()V
+Landroid/service/media/IMediaBrowserServiceCallbacks;->onLoadChildren(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
+Landroid/service/media/IMediaBrowserServiceCallbacks;->onLoadChildrenWithOptions(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;Landroid/os/Bundle;)V
+Landroid/service/media/MediaBrowserService$Result;->mFlags:I
+Landroid/service/media/MediaBrowserService;->KEY_MEDIA_ITEM:Ljava/lang/String;
+Landroid/service/notification/NotificationListenerService$Ranking;->getAdditionalPeople()Ljava/util/List;
+Landroid/service/notification/NotificationListenerService$Ranking;->getSnoozeCriteria()Ljava/util/List;
+Landroid/service/notification/NotificationListenerService;->TRIM_FULL:I
+Landroid/service/notification/NotificationListenerService;->TRIM_LIGHT:I
+Landroid/service/notification/NotificationListenerService;->getActiveNotifications(I)[Landroid/service/notification/StatusBarNotification;
+Landroid/service/notification/NotificationListenerService;->getActiveNotifications([Ljava/lang/String;I)[Landroid/service/notification/StatusBarNotification;
+Landroid/service/notification/NotificationListenerService;->isBound()Z
+Landroid/service/notification/NotificationListenerService;->mHandler:Landroid/os/Handler;
+Landroid/service/notification/NotificationListenerService;->registerAsSystemService(Landroid/content/Context;Landroid/content/ComponentName;I)V
+Landroid/service/notification/NotificationListenerService;->setOnNotificationPostedTrim(I)V
+Landroid/service/notification/NotificationListenerService;->snoozeNotification(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/service/notification/NotificationListenerService;->unregisterAsSystemService()V
+Landroid/service/notification/StatusBarNotification;->getInitialPid()I
+Landroid/service/notification/StatusBarNotification;->getUid()I
+Landroid/service/persistentdata/IPersistentDataBlockService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/service/persistentdata/IPersistentDataBlockService;
+Landroid/service/voice/AlwaysOnHotwordDetector$EventPayload;->getCaptureSession()Ljava/lang/Integer;
+Landroid/service/voice/VoiceInteractionService;->isKeyphraseAndLocaleSupportedForHotword(Ljava/lang/String;Ljava/util/Locale;)Z
+Landroid/service/vr/IVrManager;->getVr2dDisplayId()I
+Landroid/service/vr/VrListenerService;->onCurrentVrActivityChanged(Landroid/content/ComponentName;ZI)V
+Landroid/service/wallpaper/WallpaperService$Engine;->setFixedSizeAllowed(Z)V
+Landroid/speech/tts/TextToSpeech;->getCurrentEngine()Ljava/lang/String;
+Landroid/speech/tts/UtteranceProgressListener;->onUtteranceRangeStart(Ljava/lang/String;II)V
+Landroid/system/Int32Ref;->value:I
+Landroid/system/NetlinkSocketAddress;-><init>(II)V
+Landroid/system/Os;->bind(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)V
+Landroid/system/Os;->connect(Ljava/io/FileDescriptor;Ljava/net/SocketAddress;)V
+Landroid/system/Os;->sendto(Ljava/io/FileDescriptor;[BIIILjava/net/SocketAddress;)I
+Landroid/system/Os;->setsockoptIfreq(Ljava/io/FileDescriptor;IILjava/lang/String;)V
+Landroid/system/Os;->setsockoptTimeval(Ljava/io/FileDescriptor;IILandroid/system/StructTimeval;)V
+Landroid/system/OsConstants;-><init>()V
+Landroid/system/OsConstants;->AF_NETLINK:I
+Landroid/system/OsConstants;->AF_PACKET:I
+Landroid/system/OsConstants;->ARPHRD_ETHER:I
+Landroid/system/OsConstants;->ARPHRD_LOOPBACK:I
+Landroid/system/OsConstants;->CAP_TO_INDEX(I)I
+Landroid/system/OsConstants;->CAP_TO_MASK(I)I
+Landroid/system/OsConstants;->ENONET:I
+Landroid/system/OsConstants;->ETH_P_ALL:I
+Landroid/system/OsConstants;->ETH_P_ARP:I
+Landroid/system/OsConstants;->ETH_P_IP:I
+Landroid/system/OsConstants;->ETH_P_IPV6:I
+Landroid/system/OsConstants;->EUSERS:I
+Landroid/system/OsConstants;->ICMP6_ECHO_REPLY:I
+Landroid/system/OsConstants;->ICMP6_ECHO_REQUEST:I
+Landroid/system/OsConstants;->ICMP_ECHO:I
+Landroid/system/OsConstants;->ICMP_ECHOREPLY:I
+Landroid/system/OsConstants;->IP_MULTICAST_ALL:I
+Landroid/system/OsConstants;->IP_RECVTOS:I
+Landroid/system/OsConstants;->MAP_POPULATE:I
+Landroid/system/OsConstants;->NETLINK_NETFILTER:I
+Landroid/system/OsConstants;->NETLINK_ROUTE:I
+Landroid/system/OsConstants;->O_DIRECT:I
+Landroid/system/OsConstants;->PR_CAP_AMBIENT:I
+Landroid/system/OsConstants;->PR_CAP_AMBIENT_RAISE:I
+Landroid/system/OsConstants;->RLIMIT_NOFILE:I
+Landroid/system/OsConstants;->RTMGRP_IPV4_IFADDR:I
+Landroid/system/OsConstants;->RTMGRP_IPV4_MROUTE:I
+Landroid/system/OsConstants;->RTMGRP_IPV4_ROUTE:I
+Landroid/system/OsConstants;->RTMGRP_IPV4_RULE:I
+Landroid/system/OsConstants;->RTMGRP_IPV6_IFADDR:I
+Landroid/system/OsConstants;->RTMGRP_IPV6_IFINFO:I
+Landroid/system/OsConstants;->RTMGRP_IPV6_MROUTE:I
+Landroid/system/OsConstants;->RTMGRP_IPV6_PREFIX:I
+Landroid/system/OsConstants;->RTMGRP_IPV6_ROUTE:I
+Landroid/system/OsConstants;->RTMGRP_LINK:I
+Landroid/system/OsConstants;->RTMGRP_NEIGH:I
+Landroid/system/OsConstants;->RTMGRP_NOTIFY:I
+Landroid/system/OsConstants;->RTMGRP_TC:I
+Landroid/system/OsConstants;->SO_DOMAIN:I
+Landroid/system/OsConstants;->SO_PROTOCOL:I
+Landroid/system/OsConstants;->SPLICE_F_MORE:I
+Landroid/system/OsConstants;->SPLICE_F_MOVE:I
+Landroid/system/OsConstants;->SPLICE_F_NONBLOCK:I
+Landroid/system/OsConstants;->TIOCOUTQ:I
+Landroid/system/OsConstants;->UDP_ENCAP:I
+Landroid/system/OsConstants;->UDP_ENCAP_ESPINUDP:I
+Landroid/system/OsConstants;->UDP_ENCAP_ESPINUDP_NON_IKE:I
+Landroid/system/OsConstants;->UNIX_PATH_MAX:I
+Landroid/system/OsConstants;->XATTR_CREATE:I
+Landroid/system/OsConstants;->XATTR_REPLACE:I
+Landroid/system/OsConstants;->_LINUX_CAPABILITY_VERSION_3:I
+Landroid/system/OsConstants;->initConstants()V
+Landroid/system/OsConstants;->placeholder()I
+Landroid/system/PacketSocketAddress;-><init>(I[B)V
+Landroid/system/PacketSocketAddress;-><init>(SI)V
+Landroid/system/StructTimeval;->fromMillis(J)Landroid/system/StructTimeval;
+Landroid/telecom/AudioState;->isMuted:Z
+Landroid/telecom/ParcelableCall;->CREATOR:Landroid/os/Parcelable$Creator;
+Landroid/telecom/ParcelableCall;->getConnectTimeMillis()J
+Landroid/telecom/ParcelableCall;->getDisconnectCause()Landroid/telecom/DisconnectCause;
+Landroid/telecom/ParcelableCall;->getHandle()Landroid/net/Uri;
+Landroid/telecom/ParcelableCall;->getId()Ljava/lang/String;
+Landroid/telecom/TelecomManager;->EXTRA_IS_HANDOVER:Ljava/lang/String;
+Landroid/telecom/TelecomManager;->from(Landroid/content/Context;)Landroid/telecom/TelecomManager;
+Landroid/telecom/TelecomManager;->getUserSelectedOutgoingPhoneAccount()Landroid/telecom/PhoneAccountHandle;
+Landroid/telecom/TelecomManager;->setUserSelectedOutgoingPhoneAccount(Landroid/telecom/PhoneAccountHandle;)V
+Landroid/telecom/VideoProfile$CameraCapabilities;-><init>(IIZF)V
+Landroid/telephony/CellSignalStrengthLte;->mCqi:I
+Landroid/telephony/CellSignalStrengthLte;->mRsrp:I
+Landroid/telephony/CellSignalStrengthLte;->mRsrq:I
+Landroid/telephony/CellSignalStrengthLte;->mRssnr:I
+Landroid/telephony/CellSignalStrengthLte;->mSignalStrength:I
+Landroid/telephony/CellSignalStrengthLte;->mTimingAdvance:I
+Landroid/telephony/CellSignalStrengthWcdma;->mBitErrorRate:I
+Landroid/telephony/CellSignalStrengthWcdma;->mSignalStrength:I
+Landroid/telephony/NetworkScan;->stop()V
+Landroid/telephony/PhoneNumberUtils;->formatNumber(Ljava/lang/String;I)Ljava/lang/String;
+Landroid/telephony/PhoneNumberUtils;->isEmergencyNumber(ILjava/lang/String;)Z
+Landroid/telephony/PhoneNumberUtils;->isLocalEmergencyNumber(Landroid/content/Context;ILjava/lang/String;)Z
+Landroid/telephony/PhoneNumberUtils;->isPotentialEmergencyNumber(ILjava/lang/String;)Z
+Landroid/telephony/PhoneNumberUtils;->isPotentialLocalEmergencyNumber(Landroid/content/Context;ILjava/lang/String;)Z
+Landroid/telephony/PhoneStateListener;-><init>(Ljava/lang/Integer;)V
+Landroid/telephony/PhoneStateListener;-><init>(Ljava/lang/Integer;Landroid/os/Looper;)V
+Landroid/telephony/PhoneStateListener;->mSubId:Ljava/lang/Integer;
+Landroid/telephony/PreciseCallState;->getBackgroundCallState()I
+Landroid/telephony/PreciseCallState;->getForegroundCallState()I
+Landroid/telephony/RadioAccessFamily;-><init>(II)V
+Landroid/telephony/RadioAccessFamily;->getRafFromNetworkType(I)I
+Landroid/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/telephony/Rlog;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
+Landroid/telephony/Rlog;->i(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/telephony/ServiceState;->bitmaskHasTech(II)Z
+Landroid/telephony/ServiceState;->getDataRegState()I
+Landroid/telephony/ServiceState;->getDataRoaming()Z
+Landroid/telephony/ServiceState;->getRilDataRadioTechnology()I
+Landroid/telephony/ServiceState;->getVoiceNetworkType()I
+Landroid/telephony/ServiceState;->getVoiceRegState()I
+Landroid/telephony/ServiceState;->isCdma(I)Z
+Landroid/telephony/ServiceState;->isEmergencyOnly()Z
+Landroid/telephony/ServiceState;->isGsm(I)Z
+Landroid/telephony/ServiceState;->mergeServiceStates(Landroid/telephony/ServiceState;Landroid/telephony/ServiceState;)Landroid/telephony/ServiceState;
+Landroid/telephony/ServiceState;->newFromBundle(Landroid/os/Bundle;)Landroid/telephony/ServiceState;
+Landroid/telephony/ServiceState;->rilRadioTechnologyToString(I)Ljava/lang/String;
+Landroid/telephony/SignalStrength;-><init>()V
+Landroid/telephony/SignalStrength;->SIGNAL_STRENGTH_GOOD:I
+Landroid/telephony/SignalStrength;->SIGNAL_STRENGTH_GREAT:I
+Landroid/telephony/SignalStrength;->SIGNAL_STRENGTH_MODERATE:I
+Landroid/telephony/SignalStrength;->SIGNAL_STRENGTH_NONE_OR_UNKNOWN:I
+Landroid/telephony/SignalStrength;->SIGNAL_STRENGTH_POOR:I
+Landroid/telephony/SignalStrength;->getAsuLevel()I
+Landroid/telephony/SignalStrength;->getCdmaLevel()I
+Landroid/telephony/SignalStrength;->getDbm()I
+Landroid/telephony/SignalStrength;->getGsmDbm()I
+Landroid/telephony/SignalStrength;->getLteDbm()I
+Landroid/telephony/SignalStrength;->getLteRsrp()I
+Landroid/telephony/SignalStrength;->getLteRsrq()I
+Landroid/telephony/SignalStrength;->getLteRssnr()I
+Landroid/telephony/SignalStrength;->getLteSignalStrength()I
+Landroid/telephony/SignalStrength;->mGsmBitErrorRate:I
+Landroid/telephony/SignalStrength;->mGsmSignalStrength:I
+Landroid/telephony/SignalStrength;->mLteCqi:I
+Landroid/telephony/SignalStrength;->mLteRsrp:I
+Landroid/telephony/SignalStrength;->mLteRsrq:I
+Landroid/telephony/SignalStrength;->mLteRssnr:I
+Landroid/telephony/SignalStrength;->mLteSignalStrength:I
+Landroid/telephony/SmsManager;->sendMultipartTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;IZI)V
+Landroid/telephony/SmsManager;->sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;IZI)V
+Landroid/telephony/SmsMessage;->getSubId()I
+Landroid/telephony/SmsMessage;->mWrappedSmsMessage:Lcom/android/internal/telephony/SmsMessageBase;
+Landroid/telephony/SubscriptionInfo;->setDisplayName(Ljava/lang/CharSequence;)V
+Landroid/telephony/SubscriptionInfo;->setIconTint(I)V
+Landroid/telephony/SubscriptionManager;->clearDefaultsForInactiveSubIds()V
+Landroid/telephony/SubscriptionManager;->getActiveSubscriptionIdList()[I
+Landroid/telephony/SubscriptionManager;->getAllSubscriptionInfoCount()I
+Landroid/telephony/SubscriptionManager;->getAllSubscriptionInfoList()Ljava/util/List;
+Landroid/telephony/SubscriptionManager;->getDefaultDataPhoneId()I
+Landroid/telephony/SubscriptionManager;->getDefaultDataSubscriptionInfo()Landroid/telephony/SubscriptionInfo;
+Landroid/telephony/SubscriptionManager;->getDefaultSmsPhoneId()I
+Landroid/telephony/SubscriptionManager;->getDefaultVoicePhoneId()I
+Landroid/telephony/SubscriptionManager;->getDefaultVoiceSubscriptionInfo()Landroid/telephony/SubscriptionInfo;
+Landroid/telephony/SubscriptionManager;->getPhoneId(I)I
+Landroid/telephony/SubscriptionManager;->getResourcesForSubId(Landroid/content/Context;I)Landroid/content/res/Resources;
+Landroid/telephony/SubscriptionManager;->getSlotIndex(I)I
+Landroid/telephony/SubscriptionManager;->getSubId(I)[I
+Landroid/telephony/SubscriptionManager;->isActiveSubId(I)Z
+Landroid/telephony/SubscriptionManager;->isUsableSubIdValue(I)Z
+Landroid/telephony/SubscriptionManager;->isValidPhoneId(I)Z
+Landroid/telephony/SubscriptionManager;->isValidSlotIndex(I)Z
+Landroid/telephony/SubscriptionManager;->isValidSubscriptionId(I)Z
+Landroid/telephony/SubscriptionManager;->putPhoneIdAndSubIdExtra(Landroid/content/Intent;I)V
+Landroid/telephony/SubscriptionManager;->putPhoneIdAndSubIdExtra(Landroid/content/Intent;II)V
+Landroid/telephony/SubscriptionManager;->setDefaultDataSubId(I)V
+Landroid/telephony/SubscriptionManager;->setDefaultSmsSubId(I)V
+Landroid/telephony/SubscriptionManager;->setDisplayName(Ljava/lang/String;IJ)I
+Landroid/telephony/SubscriptionManager;->setIconTint(II)I
+Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDA:Landroid/telephony/TelephonyManager$MultiSimVariants;
+Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDS:Landroid/telephony/TelephonyManager$MultiSimVariants;
+Landroid/telephony/TelephonyManager;-><init>()V
+Landroid/telephony/TelephonyManager;-><init>(Landroid/content/Context;)V
+Landroid/telephony/TelephonyManager;->from(Landroid/content/Context;)Landroid/telephony/TelephonyManager;
+Landroid/telephony/TelephonyManager;->getCallState(I)I
+Landroid/telephony/TelephonyManager;->getDataNetworkType(I)I
+Landroid/telephony/TelephonyManager;->getDefault()Landroid/telephony/TelephonyManager;
+Landroid/telephony/TelephonyManager;->getGroupIdLevel1(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getITelephony()Lcom/android/internal/telephony/ITelephony;
+Landroid/telephony/TelephonyManager;->getIntAtIndex(Landroid/content/ContentResolver;Ljava/lang/String;I)I
+Landroid/telephony/TelephonyManager;->getIsimDomain()Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getLine1Number(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getMultiSimConfiguration()Landroid/telephony/TelephonyManager$MultiSimVariants;
+Landroid/telephony/TelephonyManager;->getNetworkClass(I)I
+Landroid/telephony/TelephonyManager;->getNetworkCountryIso(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getNetworkOperator(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getNetworkOperatorForPhone(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getNetworkOperatorName(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getNetworkType(I)I
+Landroid/telephony/TelephonyManager;->getNetworkTypeName()Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getNetworkTypeName(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getPhoneType(I)I
+Landroid/telephony/TelephonyManager;->getPreferredNetworkType(I)I
+Landroid/telephony/TelephonyManager;->getServiceStateForSubscriber(I)Landroid/telephony/ServiceState;
+Landroid/telephony/TelephonyManager;->getSimCount()I
+Landroid/telephony/TelephonyManager;->getSimOperator(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getSimOperatorName(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getSimOperatorNameForPhone(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getSimOperatorNumeric(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getSimOperatorNumericForPhone(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getSimSerialNumber(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getSubIdForPhoneAccount(Landroid/telecom/PhoneAccount;)I
+Landroid/telephony/TelephonyManager;->getSubscriberId(I)Ljava/lang/String;
+Landroid/telephony/TelephonyManager;->getSubscriberInfo()Lcom/android/internal/telephony/IPhoneSubInfo;
+Landroid/telephony/TelephonyManager;->getVoiceMessageCount()I
+Landroid/telephony/TelephonyManager;->getVoiceNetworkType(I)I
+Landroid/telephony/TelephonyManager;->hasIccCard(I)Z
+Landroid/telephony/TelephonyManager;->isImsRegistered()Z
+Landroid/telephony/TelephonyManager;->isMultiSimEnabled()Z
+Landroid/telephony/TelephonyManager;->isNetworkRoaming(I)Z
+Landroid/telephony/TelephonyManager;->isVideoTelephonyAvailable()Z
+Landroid/telephony/TelephonyManager;->isVolteAvailable()Z
+Landroid/telephony/TelephonyManager;->isWifiCallingAvailable()Z
+Landroid/telephony/TelephonyManager;->mSubscriptionManager:Landroid/telephony/SubscriptionManager;
+Landroid/telephony/TelephonyManager;->nvResetConfig(I)Z
+Landroid/telephony/TelephonyManager;->putIntAtIndex(Landroid/content/ContentResolver;Ljava/lang/String;II)Z
+Landroid/telephony/TelephonyManager;->requestNetworkScan(Landroid/telephony/NetworkScanRequest;Landroid/telephony/TelephonyScanManager$NetworkScanCallback;)Landroid/telephony/NetworkScan;
+Landroid/telephony/TelephonyManager;->setPreferredNetworkType(II)Z
+Landroid/telephony/euicc/DownloadableSubscription;->encodedActivationCode:Ljava/lang/String;
+Landroid/telephony/euicc/DownloadableSubscription;->setAccessRules([Landroid/telephony/UiccAccessRule;)V
+Landroid/telephony/euicc/DownloadableSubscription;->setCarrierName(Ljava/lang/String;)V
+Landroid/telephony/ims/ImsCallForwardInfo;-><init>()V
+Landroid/telephony/ims/ImsCallForwardInfo;->mCondition:I
+Landroid/telephony/ims/ImsCallForwardInfo;->mNumber:Ljava/lang/String;
+Landroid/telephony/ims/ImsCallForwardInfo;->mServiceClass:I
+Landroid/telephony/ims/ImsCallForwardInfo;->mStatus:I
+Landroid/telephony/ims/ImsCallForwardInfo;->mTimeSeconds:I
+Landroid/telephony/ims/ImsCallForwardInfo;->mToA:I
+Landroid/telephony/ims/ImsCallProfile;->mCallExtras:Landroid/os/Bundle;
+Landroid/telephony/ims/ImsCallProfile;->mCallType:I
+Landroid/telephony/ims/ImsCallProfile;->mMediaProfile:Landroid/telephony/ims/ImsStreamMediaProfile;
+Landroid/telephony/ims/ImsCallProfile;->mRestrictCause:I
+Landroid/telephony/ims/ImsCallProfile;->presentationToOIR(I)I
+Landroid/telephony/ims/ImsExternalCallState;-><init>(ILandroid/net/Uri;ZIIZ)V
+Landroid/telephony/ims/ImsReasonInfo;-><init>(II)V
+Landroid/telephony/ims/ImsReasonInfo;->mCode:I
+Landroid/telephony/ims/ImsReasonInfo;->mExtraCode:I
+Landroid/telephony/ims/ImsReasonInfo;->mExtraMessage:Ljava/lang/String;
+Landroid/telephony/ims/ImsSsInfo;->mIcbNum:Ljava/lang/String;
+Landroid/telephony/ims/ImsSsInfo;->mStatus:I
+Landroid/telephony/ims/ImsStreamMediaProfile;-><init>()V
+Landroid/telephony/ims/ImsStreamMediaProfile;->mAudioDirection:I
+Landroid/telephony/ims/ImsStreamMediaProfile;->mAudioQuality:I
+Landroid/telephony/ims/ImsStreamMediaProfile;->mVideoDirection:I
+Landroid/telephony/ims/ImsVideoCallProvider;->getInterface()Lcom/android/ims/internal/IImsVideoCallProvider;
+Landroid/telephony/ims/compat/ImsService;-><init>()V
+Landroid/telephony/ims/compat/ImsService;->mImsServiceController:Landroid/os/IBinder;
+Landroid/telephony/ims/compat/feature/ImsFeature;->getFeatureState()I
+Landroid/telephony/ims/compat/feature/ImsFeature;->setFeatureState(I)V
+Landroid/telephony/ims/compat/feature/MMTelFeature;-><init>()V
+Landroid/telephony/ims/compat/stub/ImsCallSessionImplBase;-><init>()V
+Landroid/telephony/ims/compat/stub/ImsConfigImplBase;-><init>(Landroid/content/Context;)V
+Landroid/telephony/ims/compat/stub/ImsConfigImplBase;->getIImsConfig()Lcom/android/ims/internal/IImsConfig;
+Landroid/telephony/ims/compat/stub/ImsUtListenerImplBase;-><init>()V
+Landroid/telephony/mbms/IMbmsStreamingSessionCallback$Stub;-><init>()V
+Landroid/telephony/mbms/IStreamingServiceCallback$Stub;-><init>()V
+Landroid/telephony/mbms/vendor/IMbmsStreamingService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/telephony/mbms/vendor/IMbmsStreamingService;
+Landroid/telephony/mbms/vendor/IMbmsStreamingService;->getPlaybackUri(ILjava/lang/String;)Landroid/net/Uri;
+Landroid/telephony/mbms/vendor/IMbmsStreamingService;->initialize(Landroid/telephony/mbms/IMbmsStreamingSessionCallback;I)I
+Landroid/telephony/mbms/vendor/IMbmsStreamingService;->requestUpdateStreamingServices(ILjava/util/List;)I
+Landroid/telephony/mbms/vendor/IMbmsStreamingService;->startStreaming(ILjava/lang/String;Landroid/telephony/mbms/IStreamingServiceCallback;)I
+Landroid/text/AndroidBidi;->bidi(I[C[B)I
+Landroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;
+Landroid/text/DynamicLayout;-><init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZIIILandroid/text/TextUtils$TruncateAt;I)V
+Landroid/text/DynamicLayout;->sStaticLayout:Landroid/text/StaticLayout;
+Landroid/text/Html;->withinStyle(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;II)V
+Landroid/text/Layout$Alignment;->ALIGN_LEFT:Landroid/text/Layout$Alignment;
+Landroid/text/Layout$Alignment;->ALIGN_RIGHT:Landroid/text/Layout$Alignment;
+Landroid/text/Layout;->DIRS_ALL_LEFT_TO_RIGHT:Landroid/text/Layout$Directions;
+Landroid/text/Layout;->getPrimaryHorizontal(IZ)F
+Landroid/text/SpanSet;->spans:[Ljava/lang/Object;
+Landroid/text/SpannableStringBuilder;->mGapLength:I
+Landroid/text/SpannableStringBuilder;->mGapStart:I
+Landroid/text/SpannableStringBuilder;->mSpanCount:I
+Landroid/text/SpannableStringBuilder;->mSpanEnds:[I
+Landroid/text/SpannableStringBuilder;->mSpanFlags:[I
+Landroid/text/SpannableStringBuilder;->mSpanStarts:[I
+Landroid/text/SpannableStringBuilder;->mSpans:[Ljava/lang/Object;
+Landroid/text/SpannableStringInternal;-><init>(Ljava/lang/CharSequence;II)V
+Landroid/text/SpannableStringInternal;->COLUMNS:I
+Landroid/text/SpannableStringInternal;->EMPTY:[Ljava/lang/Object;
+Landroid/text/SpannableStringInternal;->END:I
+Landroid/text/SpannableStringInternal;->FLAGS:I
+Landroid/text/SpannableStringInternal;->START:I
+Landroid/text/SpannableStringInternal;->charAt(I)C
+Landroid/text/SpannableStringInternal;->checkRange(Ljava/lang/String;II)V
+Landroid/text/SpannableStringInternal;->copySpans(Landroid/text/SpannableStringInternal;II)V
+Landroid/text/SpannableStringInternal;->copySpans(Landroid/text/Spanned;II)V
+Landroid/text/SpannableStringInternal;->getChars(II[CI)V
+Landroid/text/SpannableStringInternal;->getSpanEnd(Ljava/lang/Object;)I
+Landroid/text/SpannableStringInternal;->getSpanFlags(Ljava/lang/Object;)I
+Landroid/text/SpannableStringInternal;->getSpanStart(Ljava/lang/Object;)I
+Landroid/text/SpannableStringInternal;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
+Landroid/text/SpannableStringInternal;->isIndexFollowsNextLine(I)Z
+Landroid/text/SpannableStringInternal;->isOutOfCopyRange(IIII)Z
+Landroid/text/SpannableStringInternal;->length()I
+Landroid/text/SpannableStringInternal;->mSpanCount:I
+Landroid/text/SpannableStringInternal;->mSpanData:[I
+Landroid/text/SpannableStringInternal;->mSpans:[Ljava/lang/Object;
+Landroid/text/SpannableStringInternal;->mText:Ljava/lang/String;
+Landroid/text/SpannableStringInternal;->nextSpanTransition(IILjava/lang/Class;)I
+Landroid/text/SpannableStringInternal;->region(II)Ljava/lang/String;
+Landroid/text/SpannableStringInternal;->removeSpan(Ljava/lang/Object;)V
+Landroid/text/SpannableStringInternal;->sendSpanAdded(Ljava/lang/Object;II)V
+Landroid/text/SpannableStringInternal;->sendSpanChanged(Ljava/lang/Object;IIII)V
+Landroid/text/SpannableStringInternal;->sendSpanRemoved(Ljava/lang/Object;II)V
+Landroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;III)V
+Landroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;IIIZ)V
+Landroid/text/StaticLayout$LineBreaks;->ascents:[F
+Landroid/text/StaticLayout$LineBreaks;->breaks:[I
+Landroid/text/StaticLayout$LineBreaks;->descents:[F
+Landroid/text/StaticLayout$LineBreaks;->flags:[I
+Landroid/text/StaticLayout$LineBreaks;->widths:[F
+Landroid/text/StaticLayout;-><init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZLandroid/text/TextUtils$TruncateAt;II)V
+Landroid/text/StaticLayout;->getHeight(Z)I
+Landroid/text/StaticLayout;->mColumns:I
+Landroid/text/StaticLayout;->mLineCount:I
+Landroid/text/StaticLayout;->mLines:[I
+Landroid/text/StaticLayout;->mMaximumVisibleLineCount:I
+Landroid/text/TextLine;->mCharacterStyleSpanSet:Landroid/text/SpanSet;
+Landroid/text/TextLine;->mMetricAffectingSpanSpanSet:Landroid/text/SpanSet;
+Landroid/text/TextLine;->mReplacementSpanSpanSet:Landroid/text/SpanSet;
+Landroid/text/TextLine;->mSpanned:Landroid/text/Spanned;
+Landroid/text/TextLine;->mText:Ljava/lang/CharSequence;
+Landroid/text/TextLine;->obtain()Landroid/text/TextLine;
+Landroid/text/TextLine;->sCached:[Landroid/text/TextLine;
+Landroid/text/TextPaint;->setUnderlineText(IF)V
+Landroid/text/TextUtils$TruncateAt;->END_SMALL:Landroid/text/TextUtils$TruncateAt;
+Landroid/text/TextUtils;->isPrintableAsciiOnly(Ljava/lang/CharSequence;)Z
+Landroid/text/format/DateFormat;->AM_PM:C
+Landroid/text/format/DateFormat;->CAPITAL_AM_PM:C
+Landroid/text/format/DateFormat;->DATE:C
+Landroid/text/format/DateFormat;->DAY:C
+Landroid/text/format/DateFormat;->HOUR:C
+Landroid/text/format/DateFormat;->HOUR_OF_DAY:C
+Landroid/text/format/DateFormat;->MINUTE:C
+Landroid/text/format/DateFormat;->MONTH:C
+Landroid/text/format/DateFormat;->QUOTE:C
+Landroid/text/format/DateFormat;->SECONDS:C
+Landroid/text/format/DateFormat;->STANDALONE_MONTH:C
+Landroid/text/format/DateFormat;->TIME_ZONE:C
+Landroid/text/format/DateFormat;->YEAR:C
+Landroid/text/method/LinkMovementMethod;->sInstance:Landroid/text/method/LinkMovementMethod;
+Landroid/text/style/RasterizerSpan;
+Landroid/text/style/RasterizerSpan;-><init>(Landroid/graphics/Rasterizer;)V
+Landroid/text/style/RasterizerSpan;->getRasterizer()Landroid/graphics/Rasterizer;
+Landroid/transition/ChangeBounds;->BOTTOM_RIGHT_ONLY_PROPERTY:Landroid/util/Property;
+Landroid/transition/ChangeBounds;->POSITION_PROPERTY:Landroid/util/Property;
+Landroid/transition/Scene;->mEnterAction:Ljava/lang/Runnable;
+Landroid/transition/Scene;->mExitAction:Ljava/lang/Runnable;
+Landroid/transition/Scene;->setCurrentScene(Landroid/view/View;Landroid/transition/Scene;)V
+Landroid/transition/TransitionManager;->sRunningTransitions:Ljava/lang/ThreadLocal;
+Landroid/util/ArrayMap;->append(Ljava/lang/Object;Ljava/lang/Object;)V
+Landroid/util/ArrayMap;->mBaseCacheSize:I
+Landroid/util/ArrayMap;->mTwiceBaseCacheSize:I
+Landroid/util/ArraySet;-><init>(Ljava/util/Collection;)V
+Landroid/util/DisplayMetrics;->DENSITY_DEVICE:I
+Landroid/util/DisplayMetrics;->noncompatHeightPixels:I
+Landroid/util/DisplayMetrics;->noncompatWidthPixels:I
+Landroid/util/EventLog$Event;-><init>([B)V
+Landroid/util/FloatMath;->ceil(F)F
+Landroid/util/FloatMath;->cos(F)F
+Landroid/util/FloatMath;->exp(F)F
+Landroid/util/FloatMath;->floor(F)F
+Landroid/util/FloatMath;->hypot(FF)F
+Landroid/util/FloatMath;->pow(FF)F
+Landroid/util/FloatMath;->sin(F)F
+Landroid/util/FloatMath;->sqrt(F)F
+Landroid/util/IconDrawableFactory;->getBadgedIcon(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/ApplicationInfo;I)Landroid/graphics/drawable/Drawable;
+Landroid/util/IconDrawableFactory;->newInstance(Landroid/content/Context;)Landroid/util/IconDrawableFactory;
+Landroid/util/LocalLog$ReadOnlyLocalLog;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+Landroid/util/LocalLog;-><init>(I)V
+Landroid/util/LocalLog;->log(Ljava/lang/String;)V
+Landroid/util/LocalLog;->readOnlyLocalLog()Landroid/util/LocalLog$ReadOnlyLocalLog;
+Landroid/util/Log;->wtf(ILjava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;ZZ)I
+Landroid/util/LongArray;-><init>()V
+Landroid/util/LongArray;->add(IJ)V
+Landroid/util/LongArray;->get(I)J
+Landroid/util/LongArray;->size()I
+Landroid/util/LongSparseLongArray;->mKeys:[J
+Landroid/util/LongSparseLongArray;->mSize:I
+Landroid/util/LongSparseLongArray;->mValues:[J
+Landroid/util/MalformedJsonException;->serialVersionUID:J
+Landroid/util/MathUtils;->constrain(III)I
+Landroid/util/NtpTrustedTime;->forceRefresh()Z
+Landroid/util/NtpTrustedTime;->getCachedNtpTime()J
+Landroid/util/NtpTrustedTime;->getCachedNtpTimeReference()J
+Landroid/util/NtpTrustedTime;->getInstance(Landroid/content/Context;)Landroid/util/NtpTrustedTime;
+Landroid/util/NtpTrustedTime;->hasCache()Z
+Landroid/util/PathParser;->createPathFromPathData(Ljava/lang/String;)Landroid/graphics/Path;
+Landroid/util/Pools$SimplePool;->mPool:[Ljava/lang/Object;
+Landroid/util/Pools$SynchronizedPool;-><init>(I)V
+Landroid/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object;
+Landroid/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z
+Landroid/util/Rational;->mDenominator:I
+Landroid/util/Rational;->mNumerator:I
+Landroid/util/Rational;->readObject(Ljava/io/ObjectInputStream;)V
+Landroid/util/Rational;->serialVersionUID:J
+Landroid/util/RecurrenceRule;->buildRecurringMonthly(ILjava/time/ZoneId;)Landroid/util/RecurrenceRule;
+Landroid/util/RecurrenceRule;->start:Ljava/time/ZonedDateTime;
+Landroid/util/Singleton;-><init>()V
+Landroid/util/Singleton;->get()Ljava/lang/Object;
+Landroid/util/Singleton;->mInstance:Ljava/lang/Object;
+Landroid/util/Slog;->d(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/util/Slog;->e(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/util/Slog;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
+Landroid/util/Slog;->println(ILjava/lang/String;Ljava/lang/String;)I
+Landroid/util/Slog;->w(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/util/Slog;->wtf(Ljava/lang/String;Ljava/lang/String;)I
+Landroid/util/SparseIntArray;->mKeys:[I
+Landroid/util/SparseIntArray;->mSize:I
+Landroid/util/SparseIntArray;->mValues:[I
+Landroid/util/apk/SignatureNotFoundException;->serialVersionUID:J
+Landroid/view/AppTransitionAnimationSpec;-><init>(ILandroid/graphics/GraphicBuffer;Landroid/graphics/Rect;)V
+Landroid/view/BatchedInputEventReceiver;-><init>(Landroid/view/InputChannel;Landroid/os/Looper;Landroid/view/Choreographer;)V
+Landroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V
+Landroid/view/Choreographer;->USE_VSYNC:Z
+Landroid/view/Choreographer;->doFrame(JI)V
+Landroid/view/Choreographer;->getFrameTime()J
+Landroid/view/Choreographer;->getSfInstance()Landroid/view/Choreographer;
+Landroid/view/Choreographer;->mCallbackQueues:[Landroid/view/Choreographer$CallbackQueue;
+Landroid/view/Choreographer;->mFrameIntervalNanos:J
+Landroid/view/Choreographer;->mLastFrameTimeNanos:J
+Landroid/view/Choreographer;->mLock:Ljava/lang/Object;
+Landroid/view/Choreographer;->scheduleVsyncLocked()V
+Landroid/view/ContextThemeWrapper;->getThemeResId()I
+Landroid/view/ContextThemeWrapper;->initializeTheme()V
+Landroid/view/ContextThemeWrapper;->mInflater:Landroid/view/LayoutInflater;
+Landroid/view/ContextThemeWrapper;->mResources:Landroid/content/res/Resources;
+Landroid/view/ContextThemeWrapper;->mTheme:Landroid/content/res/Resources$Theme;
+Landroid/view/ContextThemeWrapper;->mThemeResource:I
+Landroid/view/Display$HdrCapabilities;-><init>([IFFF)V
+Landroid/view/Display;->getDisplayAdjustments()Landroid/view/DisplayAdjustments;
+Landroid/view/DisplayAdjustments;->getConfiguration()Landroid/content/res/Configuration;
+Landroid/view/DisplayAdjustments;->setCompatibilityInfo(Landroid/content/res/CompatibilityInfo;)V
+Landroid/view/DisplayEventReceiver;->dispatchHotplug(JIZ)V
+Landroid/view/DisplayEventReceiver;->dispatchVsync(JII)V
+Landroid/view/DisplayListCanvas;->callDrawGLFunction2(J)V
+Landroid/view/DisplayListCanvas;->drawGLFunctor2(JLjava/lang/Runnable;)V
+Landroid/view/DisplayListCanvas;->drawRenderNode(Landroid/view/RenderNode;)V
+Landroid/view/FrameMetrics;->mTimingData:[J
+Landroid/view/FrameMetricsObserver;->mFrameMetrics:Landroid/view/FrameMetrics;
+Landroid/view/FrameMetricsObserver;->mMessageQueue:Landroid/os/MessageQueue;
+Landroid/view/FrameMetricsObserver;->notifyDataAvailable(I)V
+Landroid/view/GestureDetector;->mMinimumFlingVelocity:I
+Landroid/view/GestureDetector;->mTouchSlopSquare:I
+Landroid/view/GhostView;->addGhost(Landroid/view/View;Landroid/view/ViewGroup;Landroid/graphics/Matrix;)Landroid/view/GhostView;
+Landroid/view/GhostView;->removeGhost(Landroid/view/View;)V
+Landroid/view/IAppTransitionAnimationSpecsFuture$Stub;-><init>()V
+Landroid/view/IGraphicsStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/view/IGraphicsStats$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IGraphicsStats;
+Landroid/view/IRecentsAnimationController;->finish(Z)V
+Landroid/view/IRecentsAnimationController;->screenshotTask(I)Landroid/app/ActivityManager$TaskSnapshot;
+Landroid/view/IRecentsAnimationController;->setAnimationTargetsBehindSystemBars(Z)V
+Landroid/view/IRecentsAnimationController;->setInputConsumerEnabled(Z)V
+Landroid/view/IRecentsAnimationRunner$Stub;-><init>()V
+Landroid/view/IRecentsAnimationRunner;->onAnimationCanceled()V
+Landroid/view/IRecentsAnimationRunner;->onAnimationStart(Landroid/view/IRecentsAnimationController;[Landroid/view/RemoteAnimationTarget;)V
+Landroid/view/IRecentsAnimationRunner;->onAnimationStart_New(Landroid/view/IRecentsAnimationController;[Landroid/view/RemoteAnimationTarget;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+Landroid/view/IRemoteAnimationFinishedCallback;->onAnimationFinished()V
+Landroid/view/IRemoteAnimationRunner$Stub;-><init>()V
+Landroid/view/IRemoteAnimationRunner;->onAnimationCancelled()V
+Landroid/view/IRemoteAnimationRunner;->onAnimationStart([Landroid/view/RemoteAnimationTarget;Landroid/view/IRemoteAnimationFinishedCallback;)V
+Landroid/view/IWindowManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/view/IWindowManager$Stub$Proxy;->getBaseDisplayDensity(I)I
+Landroid/view/IWindowManager$Stub$Proxy;->getDockedStackSide()I
+Landroid/view/IWindowManager$Stub$Proxy;->getInitialDisplayDensity(I)I
+Landroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar()Z
+Landroid/view/IWindowManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IWindowManager;
+Landroid/view/IWindowManager;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/InputChannel;)V
+Landroid/view/IWindowManager;->destroyInputConsumer(Ljava/lang/String;)Z
+Landroid/view/IWindowManager;->endProlongedAnimations()V
+Landroid/view/IWindowManager;->getAnimationScale(I)F
+Landroid/view/IWindowManager;->getStableInsets(ILandroid/graphics/Rect;)V
+Landroid/view/IWindowManager;->hasNavigationBar()Z
+Landroid/view/IWindowManager;->overridePendingAppTransitionMultiThumbFuture(Landroid/view/IAppTransitionAnimationSpecsFuture;Landroid/os/IRemoteCallback;Z)V
+Landroid/view/IWindowManager;->overridePendingAppTransitionRemote(Landroid/view/RemoteAnimationAdapter;)V
+Landroid/view/IWindowManager;->setAnimationScale(IF)V
+Landroid/view/IWindowManager;->setNavBarVirtualKeyHapticFeedbackEnabled(Z)V
+Landroid/view/IWindowManager;->setShelfHeight(ZI)V
+Landroid/view/IWindowManager;->setStrictModeVisualIndicatorPreference(Ljava/lang/String;)V
+Landroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+Landroid/view/InputChannel;-><init>()V
+Landroid/view/InputChannel;->mPtr:J
+Landroid/view/InputDevice;-><init>(IIILjava/lang/String;IILjava/lang/String;ZIILandroid/view/KeyCharacterMap;ZZZ)V
+Landroid/view/InputDevice;->addMotionRange(IIFFFFF)V
+Landroid/view/InputDevice;->isExternal()Z
+Landroid/view/InputEvent;->getSequenceNumber()I
+Landroid/view/InputEventReceiver;->dispatchBatchedInputEventPending()V
+Landroid/view/InputEventReceiver;->dispatchInputEvent(ILandroid/view/InputEvent;I)V
+Landroid/view/InputEventReceiver;->onInputEvent(Landroid/view/InputEvent;I)V
+Landroid/view/InputEventSender;->dispatchInputEventFinished(IZ)V
+Landroid/view/InputQueue;->finishInputEvent(JZ)V
+Landroid/view/KeyCharacterMap$FallbackAction;->keyCode:I
+Landroid/view/KeyCharacterMap$FallbackAction;->metaState:I
+Landroid/view/KeyCharacterMap;-><init>(J)V
+Landroid/view/KeyEvent;->isConfirmKey(I)Z
+Landroid/view/KeyEvent;->mAction:I
+Landroid/view/KeyEvent;->mCharacters:Ljava/lang/String;
+Landroid/view/KeyEvent;->mDeviceId:I
+Landroid/view/KeyEvent;->mDownTime:J
+Landroid/view/KeyEvent;->mEventTime:J
+Landroid/view/KeyEvent;->mFlags:I
+Landroid/view/KeyEvent;->mKeyCode:I
+Landroid/view/KeyEvent;->mMetaState:I
+Landroid/view/KeyEvent;->mRepeatCount:I
+Landroid/view/KeyEvent;->mScanCode:I
+Landroid/view/KeyEvent;->mSource:I
+Landroid/view/KeyEvent;->obtain(JJIIIIIIIILjava/lang/String;)Landroid/view/KeyEvent;
+Landroid/view/KeyEvent;->recycle()V
+Landroid/view/LayoutInflater;->createViewFromTag(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;
+Landroid/view/LayoutInflater;->createViewFromTag(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;Z)Landroid/view/View;
+Landroid/view/LayoutInflater;->mConstructorArgs:[Ljava/lang/Object;
+Landroid/view/LayoutInflater;->mContext:Landroid/content/Context;
+Landroid/view/LayoutInflater;->mFactory2:Landroid/view/LayoutInflater$Factory2;
+Landroid/view/LayoutInflater;->mFactory:Landroid/view/LayoutInflater$Factory;
+Landroid/view/LayoutInflater;->mFactorySet:Z
+Landroid/view/LayoutInflater;->mPrivateFactory:Landroid/view/LayoutInflater$Factory2;
+Landroid/view/LayoutInflater;->sConstructorMap:Ljava/util/HashMap;
+Landroid/view/LayoutInflater;->setPrivateFactory(Landroid/view/LayoutInflater$Factory2;)V
+Landroid/view/MotionEvent$PointerCoords;->mPackedAxisBits:J
+Landroid/view/MotionEvent$PointerCoords;->mPackedAxisValues:[F
+Landroid/view/MotionEvent;->HISTORY_CURRENT:I
+Landroid/view/MotionEvent;->getPointerIdBits()I
+Landroid/view/MotionEvent;->mNativePtr:J
+Landroid/view/MotionEvent;->nativeGetRawAxisValue(JIII)F
+Landroid/view/MotionEvent;->obtain()Landroid/view/MotionEvent;
+Landroid/view/MotionEvent;->scale(F)V
+Landroid/view/MotionEvent;->split(I)Landroid/view/MotionEvent;
+Landroid/view/PointerIcon;->load(Landroid/content/Context;)Landroid/view/PointerIcon;
+Landroid/view/PointerIcon;->mBitmap:Landroid/graphics/Bitmap;
+Landroid/view/PointerIcon;->mBitmapFrames:[Landroid/graphics/Bitmap;
+Landroid/view/PointerIcon;->mDurationPerFrame:I
+Landroid/view/PointerIcon;->mHotSpotX:F
+Landroid/view/PointerIcon;->mHotSpotY:F
+Landroid/view/PointerIcon;->mType:I
+Landroid/view/RemoteAnimationAdapter;-><init>(Landroid/view/IRemoteAnimationRunner;JJ)V
+Landroid/view/RemoteAnimationDefinition;-><init>()V
+Landroid/view/RemoteAnimationDefinition;->addRemoteAnimation(IILandroid/view/RemoteAnimationAdapter;)V
+Landroid/view/RemoteAnimationDefinition;->addRemoteAnimation(ILandroid/view/RemoteAnimationAdapter;)V
+Landroid/view/RemoteAnimationTarget;->clipRect:Landroid/graphics/Rect;
+Landroid/view/RemoteAnimationTarget;->contentInsets:Landroid/graphics/Rect;
+Landroid/view/RemoteAnimationTarget;->isNotInRecents:Z
+Landroid/view/RemoteAnimationTarget;->isTranslucent:Z
+Landroid/view/RemoteAnimationTarget;->leash:Landroid/view/SurfaceControl;
+Landroid/view/RemoteAnimationTarget;->mode:I
+Landroid/view/RemoteAnimationTarget;->position:Landroid/graphics/Point;
+Landroid/view/RemoteAnimationTarget;->prefixOrderIndex:I
+Landroid/view/RemoteAnimationTarget;->sourceContainerBounds:Landroid/graphics/Rect;
+Landroid/view/RemoteAnimationTarget;->taskId:I
+Landroid/view/RemoteAnimationTarget;->windowConfiguration:Landroid/app/WindowConfiguration;
+Landroid/view/RenderNode;->create(Ljava/lang/String;Landroid/view/View;)Landroid/view/RenderNode;
+Landroid/view/RenderNode;->discardDisplayList()V
+Landroid/view/RenderNode;->end(Landroid/view/DisplayListCanvas;)V
+Landroid/view/RenderNode;->isValid()Z
+Landroid/view/RenderNode;->output()V
+Landroid/view/RenderNode;->setClipToBounds(Z)Z
+Landroid/view/RenderNode;->setLeftTopRightBottom(IIII)Z
+Landroid/view/RenderNode;->start(II)Landroid/view/DisplayListCanvas;
+Landroid/view/RenderNodeAnimator;-><init>(IF)V
+Landroid/view/RenderNodeAnimator;->callOnFinished(Landroid/view/RenderNodeAnimator;)V
+Landroid/view/RenderNodeAnimator;->mapViewPropertyToRenderProperty(I)I
+Landroid/view/RenderNodeAnimator;->setTarget(Landroid/view/View;)V
+Landroid/view/ScaleGestureDetector;->mListener:Landroid/view/ScaleGestureDetector$OnScaleGestureListener;
+Landroid/view/ScaleGestureDetector;->mMinSpan:I
+Landroid/view/Surface;-><init>(J)V
+Landroid/view/Surface;->getNextFrameNumber()J
+Landroid/view/Surface;->mLock:Ljava/lang/Object;
+Landroid/view/Surface;->mNativeObject:J
+Landroid/view/Surface;->transferFrom(Landroid/view/Surface;)V
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;-><init>()V
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->appVsyncOffsetNanos:J
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->density:F
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->height:I
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->presentationDeadlineNanos:J
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->refreshRate:F
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->secure:Z
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->width:I
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->xDpi:F
+Landroid/view/SurfaceControl$PhysicalDisplayInfo;->yDpi:F
+Landroid/view/SurfaceControl$Transaction;-><init>()V
+Landroid/view/SurfaceControl$Transaction;->apply()V
+Landroid/view/SurfaceControl$Transaction;->deferTransactionUntil(Landroid/view/SurfaceControl;Landroid/os/IBinder;J)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->deferTransactionUntilSurface(Landroid/view/SurfaceControl;Landroid/view/Surface;J)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->hide(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setAlpha(Landroid/view/SurfaceControl;F)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setColor(Landroid/view/SurfaceControl;[F)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setFinalCrop(Landroid/view/SurfaceControl;Landroid/graphics/Rect;)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setLayer(Landroid/view/SurfaceControl;I)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setMatrix(Landroid/view/SurfaceControl;FFFF)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setMatrix(Landroid/view/SurfaceControl;Landroid/graphics/Matrix;[F)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setPosition(Landroid/view/SurfaceControl;FF)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setSize(Landroid/view/SurfaceControl;II)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->setWindowCrop(Landroid/view/SurfaceControl;Landroid/graphics/Rect;)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl$Transaction;->show(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceSession;->mNativeClient:J
+Landroid/view/SurfaceView;->isFixedSize()Z
+Landroid/view/SurfaceView;->mCallbacks:Ljava/util/ArrayList;
+Landroid/view/SurfaceView;->mFormat:I
+Landroid/view/SurfaceView;->mRequestedFormat:I
+Landroid/view/SurfaceView;->mSurfaceHolder:Landroid/view/SurfaceHolder;
+Landroid/view/SurfaceView;->setFrame(IIII)Z
+Landroid/view/SurfaceView;->surfacePositionLost_uiRtSync(J)V
+Landroid/view/SurfaceView;->updateSurfacePosition_renderWorker(JIIII)V
+Landroid/view/TextureView;->destroyHardwareLayer()V
+Landroid/view/TextureView;->destroyHardwareResources()V
+Landroid/view/TextureView;->mLayer:Landroid/view/TextureLayer;
+Landroid/view/TextureView;->mNativeWindow:J
+Landroid/view/TextureView;->mSurface:Landroid/graphics/SurfaceTexture;
+Landroid/view/TextureView;->mUpdateListener:Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;
+Landroid/view/ThreadedRenderer;->createHardwareBitmap(Landroid/view/RenderNode;II)Landroid/graphics/Bitmap;
+Landroid/view/ThreadedRenderer;->setupDiskCache(Ljava/io/File;)V
+Landroid/view/TouchDelegate;->mDelegateTargeted:Z
+Landroid/view/VelocityTracker$Estimator;->confidence:F
+Landroid/view/VelocityTracker$Estimator;->degree:I
+Landroid/view/VelocityTracker$Estimator;->xCoeff:[F
+Landroid/view/VelocityTracker$Estimator;->yCoeff:[F
+Landroid/view/VelocityTracker;->obtain(Ljava/lang/String;)Landroid/view/VelocityTracker;
+Landroid/view/View$AttachInfo;->mContentInsets:Landroid/graphics/Rect;
+Landroid/view/View$AttachInfo;->mDrawingTime:J
+Landroid/view/View$AttachInfo;->mStableInsets:Landroid/graphics/Rect;
+Landroid/view/View$ListenerInfo;-><init>()V
+Landroid/view/View$ListenerInfo;->mOnClickListener:Landroid/view/View$OnClickListener;
+Landroid/view/View$ListenerInfo;->mOnDragListener:Landroid/view/View$OnDragListener;
+Landroid/view/View$ListenerInfo;->mOnFocusChangeListener:Landroid/view/View$OnFocusChangeListener;
+Landroid/view/View$ListenerInfo;->mOnLongClickListener:Landroid/view/View$OnLongClickListener;
+Landroid/view/View$ListenerInfo;->mOnTouchListener:Landroid/view/View$OnTouchListener;
+Landroid/view/View$ScrollabilityCache;->scrollBar:Landroid/widget/ScrollBarDrawable;
+Landroid/view/View;->STATUS_BAR_DISABLE_BACK:I
+Landroid/view/View;->STATUS_BAR_DISABLE_EXPAND:I
+Landroid/view/View;->STATUS_BAR_DISABLE_HOME:I
+Landroid/view/View;->STATUS_BAR_DISABLE_RECENT:I
+Landroid/view/View;->applyDrawableToTransparentRegion(Landroid/graphics/drawable/Drawable;Landroid/graphics/Region;)V
+Landroid/view/View;->clearAccessibilityFocus()V
+Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
+Landroid/view/View;->computeOpaqueFlags()V
+Landroid/view/View;->createSnapshot(Landroid/view/ViewDebug$CanvasProvider;Z)Landroid/graphics/Bitmap;
+Landroid/view/View;->dispatchAttachedToWindow(Landroid/view/View$AttachInfo;I)V
+Landroid/view/View;->dispatchDetachedFromWindow()V
+Landroid/view/View;->fitsSystemWindows()Z
+Landroid/view/View;->getAccessibilityDelegate()Landroid/view/View$AccessibilityDelegate;
+Landroid/view/View;->getAccessibilityViewId()I
+Landroid/view/View;->getBoundsOnScreen(Landroid/graphics/Rect;)V
+Landroid/view/View;->getHorizontalScrollFactor()F
+Landroid/view/View;->getInverseMatrix()Landroid/graphics/Matrix;
+Landroid/view/View;->getListenerInfo()Landroid/view/View$ListenerInfo;
+Landroid/view/View;->getLocationOnScreen()[I
+Landroid/view/View;->getRawTextAlignment()I
+Landroid/view/View;->getRawTextDirection()I
+Landroid/view/View;->getTransitionAlpha()F
+Landroid/view/View;->getVerticalScrollFactor()F
+Landroid/view/View;->getViewRootImpl()Landroid/view/ViewRootImpl;
+Landroid/view/View;->getWindowDisplayFrame(Landroid/graphics/Rect;)V
+Landroid/view/View;->hideTooltip()V
+Landroid/view/View;->includeForAccessibility()Z
+Landroid/view/View;->initializeFadingEdge(Landroid/content/res/TypedArray;)V
+Landroid/view/View;->initializeScrollbars(Landroid/content/res/TypedArray;)V
+Landroid/view/View;->internalSetPadding(IIII)V
+Landroid/view/View;->invalidateParentIfNeeded()V
+Landroid/view/View;->isPaddingResolved()Z
+Landroid/view/View;->isRootNamespace()Z
+Landroid/view/View;->isVisibleToUser()Z
+Landroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z
+Landroid/view/View;->mAccessibilityDelegate:Landroid/view/View$AccessibilityDelegate;
+Landroid/view/View;->mAttachInfo:Landroid/view/View$AttachInfo;
+Landroid/view/View;->mBackground:Landroid/graphics/drawable/Drawable;
+Landroid/view/View;->mBottom:I
+Landroid/view/View;->mContext:Landroid/content/Context;
+Landroid/view/View;->mDrawingCache:Landroid/graphics/Bitmap;
+Landroid/view/View;->mLayoutParams:Landroid/view/ViewGroup$LayoutParams;
+Landroid/view/View;->mLeft:I
+Landroid/view/View;->mListenerInfo:Landroid/view/View$ListenerInfo;
+Landroid/view/View;->mMinHeight:I
+Landroid/view/View;->mMinWidth:I
+Landroid/view/View;->mPaddingBottom:I
+Landroid/view/View;->mPaddingLeft:I
+Landroid/view/View;->mPaddingRight:I
+Landroid/view/View;->mPaddingTop:I
+Landroid/view/View;->mParent:Landroid/view/ViewParent;
+Landroid/view/View;->mPrivateFlags2:I
+Landroid/view/View;->mPrivateFlags3:I
+Landroid/view/View;->mPrivateFlags:I
+Landroid/view/View;->mRecreateDisplayList:Z
+Landroid/view/View;->mResources:Landroid/content/res/Resources;
+Landroid/view/View;->mRight:I
+Landroid/view/View;->mScrollCache:Landroid/view/View$ScrollabilityCache;
+Landroid/view/View;->mScrollX:I
+Landroid/view/View;->mScrollY:I
+Landroid/view/View;->mStartActivityRequestWho:Ljava/lang/String;
+Landroid/view/View;->mTag:Ljava/lang/Object;
+Landroid/view/View;->mTop:I
+Landroid/view/View;->mUnscaledDrawingCache:Landroid/graphics/Bitmap;
+Landroid/view/View;->mViewFlags:I
+Landroid/view/View;->notifySubtreeAccessibilityStateChangedIfNeeded()V
+Landroid/view/View;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
+Landroid/view/View;->performAccessibilityActionInternal(ILandroid/os/Bundle;)Z
+Landroid/view/View;->recomputePadding()V
+Landroid/view/View;->requestAccessibilityFocus()Z
+Landroid/view/View;->resetDisplayList()V
+Landroid/view/View;->resetPaddingToInitialValues()V
+Landroid/view/View;->resetResolvedDrawables()V
+Landroid/view/View;->resetResolvedLayoutDirection()V
+Landroid/view/View;->resetResolvedPadding()V
+Landroid/view/View;->resetResolvedTextAlignment()V
+Landroid/view/View;->resetResolvedTextDirection()V
+Landroid/view/View;->resetRtlProperties()V
+Landroid/view/View;->setAlphaNoInvalidation(F)Z
+Landroid/view/View;->setAnimationMatrix(Landroid/graphics/Matrix;)V
+Landroid/view/View;->setAssistBlocked(Z)V
+Landroid/view/View;->setFrame(IIII)Z
+Landroid/view/View;->setIsRootNamespace(Z)V
+Landroid/view/View;->setLeftTopRightBottom(IIII)V
+Landroid/view/View;->setTooltip(Ljava/lang/CharSequence;)V
+Landroid/view/View;->setTransitionAlpha(F)V
+Landroid/view/View;->startActivityForResult(Landroid/content/Intent;I)V
+Landroid/view/View;->toGlobalMotionEvent(Landroid/view/MotionEvent;)Z
+Landroid/view/View;->toLocalMotionEvent(Landroid/view/MotionEvent;)Z
+Landroid/view/View;->transformMatrixToGlobal(Landroid/graphics/Matrix;)V
+Landroid/view/View;->transformMatrixToLocal(Landroid/graphics/Matrix;)V
+Landroid/view/ViewConfiguration;->getDeviceGlobalActionKeyTimeout()J
+Landroid/view/ViewConfiguration;->getDoubleTapMinTime()I
+Landroid/view/ViewConfiguration;->getScaledScrollFactor()I
+Landroid/view/ViewConfiguration;->mFadingMarqueeEnabled:Z
+Landroid/view/ViewConfiguration;->sHasPermanentMenuKey:Z
+Landroid/view/ViewConfiguration;->sHasPermanentMenuKeySet:Z
+Landroid/view/ViewDebug;->dispatchCommand(Landroid/view/View;Ljava/lang/String;Ljava/lang/String;Ljava/io/OutputStream;)V
+Landroid/view/ViewDebug;->dump(Landroid/view/View;ZZLjava/io/OutputStream;)V
+Landroid/view/ViewGroup$MarginLayoutParams;->endMargin:I
+Landroid/view/ViewGroup$MarginLayoutParams;->startMargin:I
+Landroid/view/ViewGroup;->FLAG_SUPPORT_STATIC_TRANSFORMATIONS:I
+Landroid/view/ViewGroup;->FLAG_USE_CHILD_DRAWING_ORDER:I
+Landroid/view/ViewGroup;->dispatchViewAdded(Landroid/view/View;)V
+Landroid/view/ViewGroup;->dispatchViewRemoved(Landroid/view/View;)V
+Landroid/view/ViewGroup;->mChildren:[Landroid/view/View;
+Landroid/view/ViewGroup;->mChildrenCount:I
+Landroid/view/ViewGroup;->mFirstTouchTarget:Landroid/view/ViewGroup$TouchTarget;
+Landroid/view/ViewGroup;->mGroupFlags:I
+Landroid/view/ViewGroup;->mOnHierarchyChangeListener:Landroid/view/ViewGroup$OnHierarchyChangeListener;
+Landroid/view/ViewGroup;->mPersistentDrawingCache:I
+Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V
+Landroid/view/ViewGroup;->offsetChildrenTopAndBottom(I)V
+Landroid/view/ViewGroup;->onChildVisibilityChanged(Landroid/view/View;II)V
+Landroid/view/ViewGroup;->resetResolvedDrawables()V
+Landroid/view/ViewGroup;->resetResolvedLayoutDirection()V
+Landroid/view/ViewGroup;->resetResolvedPadding()V
+Landroid/view/ViewGroup;->resetResolvedTextAlignment()V
+Landroid/view/ViewGroup;->resetResolvedTextDirection()V
+Landroid/view/ViewGroup;->suppressLayout(Z)V
+Landroid/view/ViewRootImpl;->detachFunctor(J)V
+Landroid/view/ViewRootImpl;->dispatchInputEvent(Landroid/view/InputEvent;)V
+Landroid/view/ViewRootImpl;->dispatchInputEvent(Landroid/view/InputEvent;Landroid/view/InputEventReceiver;)V
+Landroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;)V
+Landroid/view/ViewRootImpl;->getWindowFlags()I
+Landroid/view/ViewRootImpl;->invokeFunctor(JZ)V
+Landroid/view/ViewRootImpl;->mStopped:Z
+Landroid/view/ViewRootImpl;->mSurface:Landroid/view/Surface;
+Landroid/view/ViewRootImpl;->mView:Landroid/view/View;
+Landroid/view/ViewTreeObserver$InternalInsetsInfo;->TOUCHABLE_INSETS_REGION:I
+Landroid/view/ViewTreeObserver$InternalInsetsInfo;->setTouchableInsets(I)V
+Landroid/view/ViewTreeObserver$InternalInsetsInfo;->touchableRegion:Landroid/graphics/Region;
+Landroid/view/ViewTreeObserver;->addOnComputeInternalInsetsListener(Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;)V
+Landroid/view/ViewTreeObserver;->removeOnComputeInternalInsetsListener(Landroid/view/ViewTreeObserver$OnComputeInternalInsetsListener;)V
+Landroid/view/Window;->mAppName:Ljava/lang/String;
+Landroid/view/Window;->mAppToken:Landroid/os/IBinder;
+Landroid/view/Window;->mCallback:Landroid/view/Window$Callback;
+Landroid/view/Window;->mContext:Landroid/content/Context;
+Landroid/view/Window;->mHardwareAccelerated:Z
+Landroid/view/Window;->mWindowStyle:Landroid/content/res/TypedArray;
+Landroid/view/Window;->setNeedsMenuKey(I)V
+Landroid/view/WindowAnimationFrameStats;->init(J[J)V
+Landroid/view/WindowContentFrameStats;->init(J[J[J[J)V
+Landroid/view/WindowManager$LayoutParams;->NEEDS_MENU_SET_FALSE:I
+Landroid/view/WindowManager$LayoutParams;->NEEDS_MENU_SET_TRUE:I
+Landroid/view/WindowManager$LayoutParams;->TYPE_KEYGUARD:I
+Landroid/view/WindowManager$LayoutParams;->hideTimeoutMilliseconds:J
+Landroid/view/WindowManager$LayoutParams;->needsMenuKey:I
+Landroid/view/WindowManager$LayoutParams;->userActivityTimeout:J
+Landroid/view/WindowManagerGlobal;->getInstance()Landroid/view/WindowManagerGlobal;
+Landroid/view/WindowManagerGlobal;->getRootView(Ljava/lang/String;)Landroid/view/View;
+Landroid/view/WindowManagerGlobal;->getViewRootNames()[Ljava/lang/String;
+Landroid/view/WindowManagerGlobal;->getWindowManagerService()Landroid/view/IWindowManager;
+Landroid/view/WindowManagerGlobal;->initialize()V
+Landroid/view/WindowManagerGlobal;->mLock:Ljava/lang/Object;
+Landroid/view/WindowManagerGlobal;->mParams:Ljava/util/ArrayList;
+Landroid/view/WindowManagerGlobal;->mRoots:Ljava/util/ArrayList;
+Landroid/view/WindowManagerGlobal;->mViews:Ljava/util/ArrayList;
+Landroid/view/WindowManagerGlobal;->sDefaultWindowManager:Landroid/view/WindowManagerGlobal;
+Landroid/view/WindowManagerGlobal;->sWindowManagerService:Landroid/view/IWindowManager;
+Landroid/view/WindowManagerGlobal;->sWindowSession:Landroid/view/IWindowSession;
+Landroid/view/WindowManagerGlobal;->trimMemory(I)V
+Landroid/view/WindowManagerImpl;->mGlobal:Landroid/view/WindowManagerGlobal;
+Landroid/view/accessibility/AccessibilityInteractionClient;->clearCache()V
+Landroid/view/accessibility/AccessibilityInteractionClient;->getInstance()Landroid/view/accessibility/AccessibilityInteractionClient;
+Landroid/view/accessibility/AccessibilityManager;->getInstance(Landroid/content/Context;)Landroid/view/accessibility/AccessibilityManager;
+Landroid/view/accessibility/AccessibilityManager;->isHighTextContrastEnabled()Z
+Landroid/view/accessibility/AccessibilityManager;->mAccessibilityStateChangeListeners:Landroid/util/ArrayMap;
+Landroid/view/accessibility/AccessibilityManager;->mIsEnabled:Z
+Landroid/view/accessibility/AccessibilityManager;->mIsHighTextContrastEnabled:Z
+Landroid/view/accessibility/AccessibilityManager;->sInstance:Landroid/view/accessibility/AccessibilityManager;
+Landroid/view/accessibility/AccessibilityManager;->sInstanceSync:Ljava/lang/Object;
+Landroid/view/accessibility/AccessibilityNodeInfo;->isSealed()Z
+Landroid/view/accessibility/AccessibilityNodeInfo;->mChildNodeIds:Landroid/util/LongArray;
+Landroid/view/accessibility/AccessibilityNodeInfo;->mSealed:Z
+Landroid/view/accessibility/AccessibilityNodeInfo;->refresh(Landroid/os/Bundle;Z)Z
+Landroid/view/accessibility/AccessibilityNodeInfo;->setSealed(Z)V
+Landroid/view/accessibility/AccessibilityRecord;->getSourceNodeId()J
+Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/view/accessibility/IAccessibilityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/accessibility/IAccessibilityManager;
+Landroid/view/accessibility/IAccessibilityManager;->getEnabledAccessibilityServiceList(II)Ljava/util/List;
+Landroid/view/animation/Animation;->detach()V
+Landroid/view/animation/Animation;->initializeInvalidateRegion(IIII)V
+Landroid/view/animation/Animation;->mListener:Landroid/view/animation/Animation$AnimationListener;
+Landroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/view/inputmethod/InputMethodInfo;->mSubtypes:Landroid/view/inputmethod/InputMethodSubtypeArray;
+Landroid/view/inputmethod/InputMethodManager;->finishInputLocked()V
+Landroid/view/inputmethod/InputMethodManager;->focusIn(Landroid/view/View;)V
+Landroid/view/inputmethod/InputMethodManager;->focusOut(Landroid/view/View;)V
+Landroid/view/inputmethod/InputMethodManager;->getClient()Lcom/android/internal/view/IInputMethodClient;
+Landroid/view/inputmethod/InputMethodManager;->getInputMethodWindowVisibleHeight()I
+Landroid/view/inputmethod/InputMethodManager;->getInstance()Landroid/view/inputmethod/InputMethodManager;
+Landroid/view/inputmethod/InputMethodManager;->mCurId:Ljava/lang/String;
+Landroid/view/inputmethod/InputMethodManager;->mCurRootView:Landroid/view/View;
+Landroid/view/inputmethod/InputMethodManager;->mH:Landroid/view/inputmethod/InputMethodManager$H;
+Landroid/view/inputmethod/InputMethodManager;->mNextServedView:Landroid/view/View;
+Landroid/view/inputmethod/InputMethodManager;->mServedInputConnectionWrapper:Landroid/view/inputmethod/InputMethodManager$ControlledInputConnectionWrapper;
+Landroid/view/inputmethod/InputMethodManager;->mServedView:Landroid/view/View;
+Landroid/view/inputmethod/InputMethodManager;->mService:Lcom/android/internal/view/IInputMethodManager;
+Landroid/view/inputmethod/InputMethodManager;->notifyUserAction()V
+Landroid/view/inputmethod/InputMethodManager;->peekInstance()Landroid/view/inputmethod/InputMethodManager;
+Landroid/view/inputmethod/InputMethodManager;->sInstance:Landroid/view/inputmethod/InputMethodManager;
+Landroid/view/inputmethod/InputMethodManager;->showSoftInputUnchecked(ILandroid/os/ResultReceiver;)V
+Landroid/view/inputmethod/InputMethodManager;->windowDismissed(Landroid/os/IBinder;)V
+Landroid/view/inputmethod/InputMethodSubtypeArray;-><init>(Ljava/util/List;)V
+Landroid/view/textclassifier/TextClassificationManager;->getTextClassifier(I)Landroid/view/textclassifier/TextClassifier;
+Landroid/view/textclassifier/TextClassifier;->classifyText(Ljava/lang/CharSequence;IILandroid/view/textclassifier/TextClassification$Options;)Landroid/view/textclassifier/TextClassification;
+Landroid/view/textclassifier/TextClassifier;->generateLinks(Ljava/lang/CharSequence;Landroid/view/textclassifier/TextLinks$Options;)Landroid/view/textclassifier/TextLinks;
+Landroid/view/textclassifier/TextClassifier;->suggestSelection(Ljava/lang/CharSequence;IILandroid/view/textclassifier/TextSelection$Options;)Landroid/view/textclassifier/TextSelection;
+Landroid/view/textclassifier/TextLinks$Options;-><init>()V
+Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(III)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
+Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(IIILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
+Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(II)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
+Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
+Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextSelection;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
+Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionStarted(I)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
+Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V
+Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V
+Landroid/view/textservice/TextServicesManager;->isSpellCheckerEnabled()Z
+Landroid/webkit/CacheManager$CacheResult;-><init>()V
+Landroid/webkit/CacheManager$CacheResult;->getContentDisposition()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getContentLength()J
+Landroid/webkit/CacheManager$CacheResult;->getETag()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getEncoding()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getExpires()J
+Landroid/webkit/CacheManager$CacheResult;->getExpiresString()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getHttpStatusCode()I
+Landroid/webkit/CacheManager$CacheResult;->getInputStream()Ljava/io/InputStream;
+Landroid/webkit/CacheManager$CacheResult;->getLastModified()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getLocalPath()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getLocation()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getMimeType()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getOutputStream()Ljava/io/OutputStream;
+Landroid/webkit/CacheManager$CacheResult;->setEncoding(Ljava/lang/String;)V
+Landroid/webkit/CacheManager$CacheResult;->setInputStream(Ljava/io/InputStream;)V
+Landroid/webkit/CacheManager;->cacheDisabled()Z
+Landroid/webkit/CacheManager;->endCacheTransaction()Z
+Landroid/webkit/CacheManager;->getCacheFile(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;
+Landroid/webkit/CacheManager;->getCacheFileBaseDir()Ljava/io/File;
+Landroid/webkit/CacheManager;->saveCacheFile(Ljava/lang/String;Landroid/webkit/CacheManager$CacheResult;)V
+Landroid/webkit/CacheManager;->startCacheTransaction()Z
+Landroid/webkit/IWebViewUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/webkit/WebResourceResponse;->mImmutable:Z
+Landroid/webkit/WebSettings$TextSize;->value:I
+Landroid/webkit/WebSettings;->getPluginsPath()Ljava/lang/String;
+Landroid/webkit/WebSettings;->getUseDoubleTree()Z
+Landroid/webkit/WebSettings;->setPluginsPath(Ljava/lang/String;)V
+Landroid/webkit/WebSettings;->setUseDoubleTree(Z)V
+Landroid/webkit/WebSyncManager;->mHandler:Landroid/os/Handler;
+Landroid/webkit/WebView;->debugDump()V
+Landroid/webkit/WebView;->disablePlatformNotifications()V
+Landroid/webkit/WebView;->emulateShiftHeld()V
+Landroid/webkit/WebView;->enablePlatformNotifications()V
+Landroid/webkit/WebView;->getContentWidth()I
+Landroid/webkit/WebView;->getPluginList()Landroid/webkit/PluginList;
+Landroid/webkit/WebView;->getTouchIconUrl()Ljava/lang/String;
+Landroid/webkit/WebView;->getVisibleTitleHeight()I
+Landroid/webkit/WebView;->getZoomControls()Landroid/view/View;
+Landroid/webkit/WebView;->isPaused()Z
+Landroid/webkit/WebView;->mProvider:Landroid/webkit/WebViewProvider;
+Landroid/webkit/WebView;->notifyFindDialogDismissed()V
+Landroid/webkit/WebView;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
+Landroid/webkit/WebView;->refreshPlugins(Z)V
+Landroid/webkit/WebView;->restorePicture(Landroid/os/Bundle;Ljava/io/File;)Z
+Landroid/webkit/WebView;->sEnforceThreadChecking:Z
+Landroid/webkit/WebView;->savePicture(Landroid/os/Bundle;Ljava/io/File;)Z
+Landroid/webkit/WebViewClient;->onUnhandledInputEvent(Landroid/webkit/WebView;Landroid/view/InputEvent;)V
+Landroid/webkit/WebViewDelegate;-><init>()V
+Landroid/webkit/WebViewFactory;->getProvider()Landroid/webkit/WebViewFactoryProvider;
+Landroid/webkit/WebViewFactory;->getUpdateService()Landroid/webkit/IWebViewUpdateService;
+Landroid/webkit/WebViewFactory;->getWebViewContextAndSetProvider()Landroid/content/Context;
+Landroid/webkit/WebViewFactory;->sPackageInfo:Landroid/content/pm/PackageInfo;
+Landroid/webkit/WebViewFactory;->sProviderInstance:Landroid/webkit/WebViewFactoryProvider;
+Landroid/widget/AbsListView$FlingRunnable;->endFling()V
+Landroid/widget/AbsListView$FlingRunnable;->mScroller:Landroid/widget/OverScroller;
+Landroid/widget/AbsListView$FlingRunnable;->start(I)V
+Landroid/widget/AbsListView$RecycleBin;->clear()V
+Landroid/widget/AbsListView$RecycleBin;->mRecyclerListener:Landroid/widget/AbsListView$RecyclerListener;
+Landroid/widget/AbsListView$SavedState;->firstId:J
+Landroid/widget/AbsListView$SavedState;->viewTop:I
+Landroid/widget/AbsListView;->invokeOnItemScrollListener()V
+Landroid/widget/AbsListView;->isVerticalScrollBarHidden()Z
+Landroid/widget/AbsListView;->mAdapter:Landroid/widget/ListAdapter;
+Landroid/widget/AbsListView;->mDataSetObserver:Landroid/widget/AbsListView$AdapterDataSetObserver;
+Landroid/widget/AbsListView;->mEdgeGlowBottom:Landroid/widget/EdgeEffect;
+Landroid/widget/AbsListView;->mEdgeGlowTop:Landroid/widget/EdgeEffect;
+Landroid/widget/AbsListView;->mFastScroll:Landroid/widget/FastScroller;
+Landroid/widget/AbsListView;->mFlingRunnable:Landroid/widget/AbsListView$FlingRunnable;
+Landroid/widget/AbsListView;->mIsChildViewEnabled:Z
+Landroid/widget/AbsListView;->mLayoutMode:I
+Landroid/widget/AbsListView;->mMaximumVelocity:I
+Landroid/widget/AbsListView;->mMotionPosition:I
+Landroid/widget/AbsListView;->mOnScrollListener:Landroid/widget/AbsListView$OnScrollListener;
+Landroid/widget/AbsListView;->mPendingCheckForLongPress:Landroid/widget/AbsListView$CheckForLongPress;
+Landroid/widget/AbsListView;->mPendingCheckForTap:Landroid/widget/AbsListView$CheckForTap;
+Landroid/widget/AbsListView;->mRecycler:Landroid/widget/AbsListView$RecycleBin;
+Landroid/widget/AbsListView;->mSelectionTopPadding:I
+Landroid/widget/AbsListView;->mSelectorPosition:I
+Landroid/widget/AbsListView;->mSelectorRect:Landroid/graphics/Rect;
+Landroid/widget/AbsListView;->mTouchMode:I
+Landroid/widget/AbsListView;->mTouchSlop:I
+Landroid/widget/AbsListView;->mVelocityTracker:Landroid/view/VelocityTracker;
+Landroid/widget/AbsListView;->performLongPress(Landroid/view/View;IJ)Z
+Landroid/widget/AbsListView;->performLongPress(Landroid/view/View;IJFF)Z
+Landroid/widget/AbsListView;->reportScrollStateChange(I)V
+Landroid/widget/AbsListView;->smoothScrollBy(IIZZ)V
+Landroid/widget/AbsListView;->trackMotionScroll(II)Z
+Landroid/widget/AbsSeekBar;->mIsDragging:Z
+Landroid/widget/AbsSeekBar;->mSplitTrack:Z
+Landroid/widget/AbsSeekBar;->mThumb:Landroid/graphics/drawable/Drawable;
+Landroid/widget/AbsSeekBar;->mTouchProgressOffset:F
+Landroid/widget/ActivityChooserModel;->get(Landroid/content/Context;Ljava/lang/String;)Landroid/widget/ActivityChooserModel;
+Landroid/widget/ActivityChooserView;->setExpandActivityOverflowButtonDrawable(Landroid/graphics/drawable/Drawable;)V
+Landroid/widget/AdapterView;->mDataChanged:Z
+Landroid/widget/AdapterView;->mFirstPosition:I
+Landroid/widget/AdapterView;->mNextSelectedPosition:I
+Landroid/widget/AdapterView;->mNextSelectedRowId:J
+Landroid/widget/AdapterView;->mOldSelectedPosition:I
+Landroid/widget/AdapterView;->setNextSelectedPositionInt(I)V
+Landroid/widget/AdapterView;->setSelectedPositionInt(I)V
+Landroid/widget/AutoCompleteTextView;->doAfterTextChanged()V
+Landroid/widget/AutoCompleteTextView;->doBeforeTextChanged()V
+Landroid/widget/AutoCompleteTextView;->ensureImeVisible(Z)V
+Landroid/widget/AutoCompleteTextView;->mPopup:Landroid/widget/ListPopupWindow;
+Landroid/widget/AutoCompleteTextView;->setDropDownAlwaysVisible(Z)V
+Landroid/widget/AutoCompleteTextView;->setForceIgnoreOutsideTouch(Z)V
+Landroid/widget/BaseAdapter;->mDataSetObservable:Landroid/database/DataSetObservable;
+Landroid/widget/CompoundButton;->mBroadcasting:Z
+Landroid/widget/CompoundButton;->mButtonDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/CompoundButton;->mOnCheckedChangeListener:Landroid/widget/CompoundButton$OnCheckedChangeListener;
+Landroid/widget/CursorAdapter;->mChangeObserver:Landroid/widget/CursorAdapter$ChangeObserver;
+Landroid/widget/CursorAdapter;->mDataSetObserver:Landroid/database/DataSetObserver;
+Landroid/widget/CursorAdapter;->mDataValid:Z
+Landroid/widget/CursorAdapter;->mRowIDColumn:I
+Landroid/widget/DatePicker;->mDelegate:Landroid/widget/DatePicker$DatePickerDelegate;
+Landroid/widget/EdgeEffect;->mPaint:Landroid/graphics/Paint;
+Landroid/widget/Editor;->invalidateTextDisplayList()V
+Landroid/widget/Editor;->mSelectHandleLeft:Landroid/graphics/drawable/Drawable;
+Landroid/widget/Editor;->mShowCursor:J
+Landroid/widget/Editor;->mShowSoftInputOnFocus:Z
+Landroid/widget/ExpandableListView;->mChildDivider:Landroid/graphics/drawable/Drawable;
+Landroid/widget/ExpandableListView;->mGroupIndicator:Landroid/graphics/drawable/Drawable;
+Landroid/widget/FastScroller;->mContainerRect:Landroid/graphics/Rect;
+Landroid/widget/FastScroller;->mHeaderCount:I
+Landroid/widget/FastScroller;->mLongList:Z
+Landroid/widget/FastScroller;->mMinimumTouchTarget:I
+Landroid/widget/FastScroller;->mThumbDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/FastScroller;->mThumbImage:Landroid/widget/ImageView;
+Landroid/widget/FastScroller;->mTrackDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/FastScroller;->mTrackImage:Landroid/widget/ImageView;
+Landroid/widget/Gallery$FlingRunnable;->startUsingVelocity(I)V
+Landroid/widget/Gallery;->fillToGalleryLeft()V
+Landroid/widget/Gallery;->fillToGalleryRight()V
+Landroid/widget/Gallery;->mDownTouchPosition:I
+Landroid/widget/Gallery;->mDownTouchView:Landroid/view/View;
+Landroid/widget/Gallery;->mFlingRunnable:Landroid/widget/Gallery$FlingRunnable;
+Landroid/widget/Gallery;->mSpacing:I
+Landroid/widget/Gallery;->makeAndAddView(IIIZ)Landroid/view/View;
+Landroid/widget/Gallery;->moveDirection(I)Z
+Landroid/widget/GridView;->fillDown(II)Landroid/view/View;
+Landroid/widget/GridView;->fillUp(II)Landroid/view/View;
+Landroid/widget/GridView;->mColumnWidth:I
+Landroid/widget/GridView;->mHorizontalSpacing:I
+Landroid/widget/GridView;->mNumColumns:I
+Landroid/widget/GridView;->mRequestedNumColumns:I
+Landroid/widget/GridView;->mVerticalSpacing:I
+Landroid/widget/HorizontalScrollView;->mChildToScrollTo:Landroid/view/View;
+Landroid/widget/HorizontalScrollView;->mEdgeGlowLeft:Landroid/widget/EdgeEffect;
+Landroid/widget/HorizontalScrollView;->mEdgeGlowRight:Landroid/widget/EdgeEffect;
+Landroid/widget/HorizontalScrollView;->mScroller:Landroid/widget/OverScroller;
+Landroid/widget/ImageView;->animateTransform(Landroid/graphics/Matrix;)V
+Landroid/widget/ImageView;->mAdjustViewBounds:Z
+Landroid/widget/ImageView;->mAlpha:I
+Landroid/widget/ImageView;->mDrawMatrix:Landroid/graphics/Matrix;
+Landroid/widget/ImageView;->mMaxHeight:I
+Landroid/widget/ImageView;->mMaxWidth:I
+Landroid/widget/ImageView;->mRecycleableBitmapDrawable:Landroid/graphics/drawable/BitmapDrawable;
+Landroid/widget/ImageView;->mResource:I
+Landroid/widget/ImageView;->mUri:Landroid/net/Uri;
+Landroid/widget/ImageView;->updateDrawable(Landroid/graphics/drawable/Drawable;)V
+Landroid/widget/LinearLayout;->mGravity:I
+Landroid/widget/LinearLayout;->mUseLargestChild:Z
+Landroid/widget/ListPopupWindow;->mPopup:Landroid/widget/PopupWindow;
+Landroid/widget/ListPopupWindow;->setForceIgnoreOutsideTouch(Z)V
+Landroid/widget/ListView;->fillDown(II)Landroid/view/View;
+Landroid/widget/ListView;->fillSpecific(II)Landroid/view/View;
+Landroid/widget/ListView;->fillUp(II)Landroid/view/View;
+Landroid/widget/ListView;->findViewTraversal(I)Landroid/view/View;
+Landroid/widget/ListView;->findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View;
+Landroid/widget/ListView;->lookForSelectablePosition(IZ)I
+Landroid/widget/ListView;->mAreAllItemsSelectable:Z
+Landroid/widget/ListView;->mFooterViewInfos:Ljava/util/ArrayList;
+Landroid/widget/ListView;->mHeaderViewInfos:Ljava/util/ArrayList;
+Landroid/widget/ListView;->setSelectionInt(I)V
+Landroid/widget/MediaController;->mAnchor:Landroid/view/View;
+Landroid/widget/MediaController;->mDecor:Landroid/view/View;
+Landroid/widget/MediaController;->mDecorLayoutParams:Landroid/view/WindowManager$LayoutParams;
+Landroid/widget/MediaController;->mWindowManager:Landroid/view/WindowManager;
+Landroid/widget/NumberPicker;->mInputText:Landroid/widget/EditText;
+Landroid/widget/NumberPicker;->mSelectionDivider:Landroid/graphics/drawable/Drawable;
+Landroid/widget/NumberPicker;->mSelectorWheelPaint:Landroid/graphics/Paint;
+Landroid/widget/OverScroller$SplineOverScroller;->mCurrVelocity:F
+Landroid/widget/OverScroller;->isScrollingInDirection(FF)Z
+Landroid/widget/OverScroller;->mScrollerY:Landroid/widget/OverScroller$SplineOverScroller;
+Landroid/widget/PopupMenu;->mPopup:Lcom/android/internal/view/menu/MenuPopupHelper;
+Landroid/widget/PopupWindow;->computeAnimationResource()I
+Landroid/widget/PopupWindow;->createPopupLayoutParams(Landroid/os/IBinder;)Landroid/view/WindowManager$LayoutParams;
+Landroid/widget/PopupWindow;->invokePopup(Landroid/view/WindowManager$LayoutParams;)V
+Landroid/widget/PopupWindow;->mAboveAnchor:Z
+Landroid/widget/PopupWindow;->mAnchor:Ljava/lang/ref/WeakReference;
+Landroid/widget/PopupWindow;->mAnimationStyle:I
+Landroid/widget/PopupWindow;->mBackgroundView:Landroid/view/View;
+Landroid/widget/PopupWindow;->mContentView:Landroid/view/View;
+Landroid/widget/PopupWindow;->mHeightMode:I
+Landroid/widget/PopupWindow;->mIsDropdown:Z
+Landroid/widget/PopupWindow;->mIsShowing:Z
+Landroid/widget/PopupWindow;->mLastHeight:I
+Landroid/widget/PopupWindow;->mLastWidth:I
+Landroid/widget/PopupWindow;->mOnScrollChangedListener:Landroid/view/ViewTreeObserver$OnScrollChangedListener;
+Landroid/widget/PopupWindow;->mOverlapAnchor:Z
+Landroid/widget/PopupWindow;->mTouchInterceptor:Landroid/view/View$OnTouchListener;
+Landroid/widget/PopupWindow;->mWidthMode:I
+Landroid/widget/PopupWindow;->mWindowLayoutType:I
+Landroid/widget/PopupWindow;->preparePopup(Landroid/view/WindowManager$LayoutParams;)V
+Landroid/widget/PopupWindow;->setClipToScreenEnabled(Z)V
+Landroid/widget/PopupWindow;->setEpicenterBounds(Landroid/graphics/Rect;)V
+Landroid/widget/PopupWindow;->setLayoutInScreenEnabled(Z)V
+Landroid/widget/PopupWindow;->setLayoutInsetDecor(Z)V
+Landroid/widget/PopupWindow;->setTouchModal(Z)V
+Landroid/widget/PopupWindow;->showAtLocation(Landroid/os/IBinder;III)V
+Landroid/widget/ProgressBar;->mCurrentDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/ProgressBar;->mDuration:I
+Landroid/widget/ProgressBar;->mIndeterminate:Z
+Landroid/widget/ProgressBar;->mMaxHeight:I
+Landroid/widget/ProgressBar;->mMinHeight:I
+Landroid/widget/ProgressBar;->mOnlyIndeterminate:Z
+Landroid/widget/ProgressBar;->setProgressInternal(IZZ)Z
+Landroid/widget/RelativeLayout$LayoutParams;->mBottom:I
+Landroid/widget/RelativeLayout$LayoutParams;->mLeft:I
+Landroid/widget/RelativeLayout$LayoutParams;->mRight:I
+Landroid/widget/RelativeLayout$LayoutParams;->mTop:I
+Landroid/widget/RelativeLayout;->mGravity:I
+Landroid/widget/RemoteViews$Action;->mergeBehavior()I
+Landroid/widget/RemoteViews$Action;->viewId:I
+Landroid/widget/RemoteViews$BitmapCache;->mBitmaps:Ljava/util/ArrayList;
+Landroid/widget/RemoteViews$BitmapReflectionAction;->bitmap:Landroid/graphics/Bitmap;
+Landroid/widget/RemoteViews$BitmapReflectionAction;->methodName:Ljava/lang/String;
+Landroid/widget/RemoteViews$ReflectionAction;->methodName:Ljava/lang/String;
+Landroid/widget/RemoteViews$ReflectionAction;->value:Ljava/lang/Object;
+Landroid/widget/RemoteViews$SetOnClickPendingIntent;->pendingIntent:Landroid/app/PendingIntent;
+Landroid/widget/RemoteViews$SetPendingIntentTemplate;->pendingIntentTemplate:Landroid/app/PendingIntent;
+Landroid/widget/RemoteViews$ViewGroupActionAdd;->mNestedViews:Landroid/widget/RemoteViews;
+Landroid/widget/RemoteViews;->estimateMemoryUsage()I
+Landroid/widget/RemoteViews;->mActions:Ljava/util/ArrayList;
+Landroid/widget/RemoteViews;->mApplication:Landroid/content/pm/ApplicationInfo;
+Landroid/widget/RemoteViews;->mBitmapCache:Landroid/widget/RemoteViews$BitmapCache;
+Landroid/widget/RemoteViews;->mLayoutId:I
+Landroid/widget/RemoteViews;->mPortrait:Landroid/widget/RemoteViews;
+Landroid/widget/RemoteViews;->mergeRemoteViews(Landroid/widget/RemoteViews;)V
+Landroid/widget/RemoteViewsAdapter;->mCache:Landroid/widget/RemoteViewsAdapter$FixedSizeRemoteViewsCache;
+Landroid/widget/RemoteViewsAdapter;->mWorkerThread:Landroid/os/HandlerThread;
+Landroid/widget/ScrollBarDrawable;->mVerticalThumb:Landroid/graphics/drawable/Drawable;
+Landroid/widget/ScrollBarDrawable;->setHorizontalThumbDrawable(Landroid/graphics/drawable/Drawable;)V
+Landroid/widget/ScrollBarDrawable;->setVerticalThumbDrawable(Landroid/graphics/drawable/Drawable;)V
+Landroid/widget/ScrollView;->mChildToScrollTo:Landroid/view/View;
+Landroid/widget/ScrollView;->mEdgeGlowBottom:Landroid/widget/EdgeEffect;
+Landroid/widget/ScrollView;->mEdgeGlowTop:Landroid/widget/EdgeEffect;
+Landroid/widget/ScrollView;->mIsBeingDragged:Z
+Landroid/widget/ScrollView;->mMinimumVelocity:I
+Landroid/widget/ScrollView;->mOverflingDistance:I
+Landroid/widget/ScrollView;->mOverscrollDistance:I
+Landroid/widget/ScrollView;->mScroller:Landroid/widget/OverScroller;
+Landroid/widget/Scroller;->mInterpolator:Landroid/view/animation/Interpolator;
+Landroid/widget/SearchView;->mCloseButton:Landroid/widget/ImageView;
+Landroid/widget/SearchView;->mSearchButton:Landroid/widget/ImageView;
+Landroid/widget/SearchView;->mSearchPlate:Landroid/view/View;
+Landroid/widget/SearchView;->mSearchSrcTextView:Landroid/widget/SearchView$SearchAutoComplete;
+Landroid/widget/SearchView;->onCloseClicked()V
+Landroid/widget/SearchView;->setQuery(Ljava/lang/CharSequence;)V
+Landroid/widget/SlidingDrawer;->mTopOffset:I
+Landroid/widget/Spinner;->mPopup:Landroid/widget/Spinner$SpinnerPopup;
+Landroid/widget/Switch;->mThumbDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/Switch;->mTrackDrawable:Landroid/graphics/drawable/Drawable;
+Landroid/widget/TabHost$IntentContentStrategy;->getContentView()Landroid/view/View;
+Landroid/widget/TabHost$IntentContentStrategy;->tabClosed()V
+Landroid/widget/TabHost$TabSpec;->mContentStrategy:Landroid/widget/TabHost$ContentStrategy;
+Landroid/widget/TabHost$TabSpec;->mIndicatorStrategy:Landroid/widget/TabHost$IndicatorStrategy;
+Landroid/widget/TabHost;->mTabSpecs:Ljava/util/List;
+Landroid/widget/TabWidget;->mDrawBottomStrips:Z
+Landroid/widget/TabWidget;->mSelectedTab:I
+Landroid/widget/TabWidget;->setTabSelectionListener(Landroid/widget/TabWidget$OnTabSelectionChanged;)V
+Landroid/widget/TextView;->LINES:I
+Landroid/widget/TextView;->assumeLayout()V
+Landroid/widget/TextView;->createEditorIfNeeded()V
+Landroid/widget/TextView;->getHorizontallyScrolling()Z
+Landroid/widget/TextView;->getTextColor(Landroid/content/Context;Landroid/content/res/TypedArray;I)I
+Landroid/widget/TextView;->getTextColors(Landroid/content/Context;Landroid/content/res/TypedArray;)Landroid/content/res/ColorStateList;
+Landroid/widget/TextView;->isSingleLine()Z
+Landroid/widget/TextView;->mCurTextColor:I
+Landroid/widget/TextView;->mCursorDrawableRes:I
+Landroid/widget/TextView;->mEditor:Landroid/widget/Editor;
+Landroid/widget/TextView;->mListeners:Ljava/util/ArrayList;
+Landroid/widget/TextView;->mMarquee:Landroid/widget/TextView$Marquee;
+Landroid/widget/TextView;->mMaxMode:I
+Landroid/widget/TextView;->mMaximum:I
+Landroid/widget/TextView;->mSingleLine:Z
+Landroid/widget/TextView;->mText:Ljava/lang/CharSequence;
+Landroid/widget/TextView;->mTextPaint:Landroid/text/TextPaint;
+Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;ZI)V
+Landroid/widget/Toast$TN;->mNextView:Landroid/view/View;
+Landroid/widget/Toast$TN;->mParams:Landroid/view/WindowManager$LayoutParams;
+Landroid/widget/Toast$TN;->mView:Landroid/view/View;
+Landroid/widget/Toast;->getService()Landroid/app/INotificationManager;
+Landroid/widget/Toast;->getWindowParams()Landroid/view/WindowManager$LayoutParams;
+Landroid/widget/Toast;->mDuration:I
+Landroid/widget/Toast;->mTN:Landroid/widget/Toast$TN;
+Landroid/widget/Toast;->sService:Landroid/app/INotificationManager;
+Landroid/widget/VideoView2$OnViewTypeChangedListener;->onViewTypeChanged(Landroid/view/View;I)V
+Landroid/widget/VideoView2;->getMediaController()Landroid/media/session/MediaController;
+Landroid/widget/VideoView2;->setOnViewTypeChangedListener(Landroid/widget/VideoView2$OnViewTypeChangedListener;)V
+Landroid/widget/VideoView2;->setVideoPath(Ljava/lang/String;)V
+Landroid/widget/VideoView;->mCurrentBufferPercentage:I
+Landroid/widget/VideoView;->mMediaController:Landroid/widget/MediaController;
+Landroid/widget/VideoView;->mSHCallback:Landroid/view/SurfaceHolder$Callback;
+Landroid/widget/VideoView;->mUri:Landroid/net/Uri;
+Landroid/widget/VideoView;->mVideoHeight:I
+Landroid/widget/VideoView;->mVideoWidth:I
+Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat;->serialVersionUID:J
+Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->serialVersionUID:J
+Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->serialVersionUID:J
+Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->serialVersionUID:J
+Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->serialVersionUID:J
+Lcom/android/ims/ImsConfigListener;->onSetFeatureResponse(IIII)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionConferenceStateUpdated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsConferenceState;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandover(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHandoverFailed(Lcom/android/ims/internal/IImsCallSession;IILandroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHeld(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHoldFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionHoldReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionInviteParticipantsRequestDelivered(Lcom/android/ims/internal/IImsCallSession;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionInviteParticipantsRequestFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeComplete(Lcom/android/ims/internal/IImsCallSession;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMergeStarted(Lcom/android/ims/internal/IImsCallSession;Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionMultipartyStateChanged(Lcom/android/ims/internal/IImsCallSession;Z)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionProgressing(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsStreamMediaProfile;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumeFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumeReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionResumed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionStartFailed(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionStarted(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionSuppServiceReceived(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsSuppServiceNotification;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionTerminated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionTtyModeReceived(Lcom/android/ims/internal/IImsCallSession;I)V
+Lcom/android/ims/internal/IImsCallSessionListener;->callSessionUpdated(Lcom/android/ims/internal/IImsCallSession;Landroid/telephony/ims/ImsCallProfile;)V
+Lcom/android/ims/internal/IImsRegistrationListener;->registrationAssociatedUriChanged([Landroid/net/Uri;)V
+Lcom/android/ims/internal/IImsRegistrationListener;->registrationChangeFailed(ILandroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsRegistrationListener;->registrationConnectedWithRadioTech(I)V
+Lcom/android/ims/internal/IImsRegistrationListener;->registrationDisconnected(Landroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsRegistrationListener;->registrationFeatureCapabilityChanged(I[I[I)V
+Lcom/android/ims/internal/IImsRegistrationListener;->registrationProgressingWithRadioTech(I)V
+Lcom/android/ims/internal/IImsRegistrationListener;->voiceMessageCountUpdate(I)V
+Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallBarringQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsSsInfo;)V
+Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallForwardQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsCallForwardInfo;)V
+Lcom/android/ims/internal/IImsUtListener;->utConfigurationCallWaitingQueried(Lcom/android/ims/internal/IImsUt;I[Landroid/telephony/ims/ImsSsInfo;)V
+Lcom/android/ims/internal/IImsUtListener;->utConfigurationQueried(Lcom/android/ims/internal/IImsUt;ILandroid/os/Bundle;)V
+Lcom/android/ims/internal/IImsUtListener;->utConfigurationQueryFailed(Lcom/android/ims/internal/IImsUt;ILandroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsUtListener;->utConfigurationUpdateFailed(Lcom/android/ims/internal/IImsUt;ILandroid/telephony/ims/ImsReasonInfo;)V
+Lcom/android/ims/internal/IImsUtListener;->utConfigurationUpdated(Lcom/android/ims/internal/IImsUt;I)V
+Lcom/android/ims/internal/uce/common/CapInfo;-><init>()V
+Lcom/android/ims/internal/uce/common/CapInfo;->getCapTimestamp()J
+Lcom/android/ims/internal/uce/common/CapInfo;->isCdViaPresenceSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFtHttpSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFtSnFSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFtSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFtThumbSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isFullSnFGroupChatSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isGeoPullFtSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isGeoPullSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isGeoPushSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isImSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isIpVideoSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isIpVoiceSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isIsSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isRcsIpVideoCallSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isRcsIpVideoOnlyCallSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isRcsIpVoiceCallSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isSmSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isSpSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isVsDuringCSSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->isVsSupported()Z
+Lcom/android/ims/internal/uce/common/CapInfo;->setCapTimestamp(J)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setCdViaPresenceSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setExts([Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setFtHttpSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setFtSnFSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setFtSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setFtThumbSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setFullSnFGroupChatSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setGeoPullFtSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setGeoPullSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setGeoPushSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setImSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setIpVideoSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setIpVoiceSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setIsSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setRcsIpVideoCallSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setRcsIpVideoOnlyCallSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setRcsIpVoiceCallSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setSmSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setSpSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setVsDuringCSSupported(Z)V
+Lcom/android/ims/internal/uce/common/CapInfo;->setVsSupported(Z)V
+Lcom/android/ims/internal/uce/common/StatusCode;-><init>()V
+Lcom/android/ims/internal/uce/common/StatusCode;->getStatusCode()I
+Lcom/android/ims/internal/uce/common/StatusCode;->setStatusCode(I)V
+Lcom/android/ims/internal/uce/common/UceLong;-><init>()V
+Lcom/android/ims/internal/uce/common/UceLong;->getClientId()I
+Lcom/android/ims/internal/uce/common/UceLong;->getUceLong()J
+Lcom/android/ims/internal/uce/common/UceLong;->setClientId(I)V
+Lcom/android/ims/internal/uce/common/UceLong;->setUceLong(J)V
+Lcom/android/ims/internal/uce/options/IOptionsListener;->cmdStatus(Lcom/android/ims/internal/uce/options/OptionsCmdStatus;)V
+Lcom/android/ims/internal/uce/options/IOptionsListener;->getVersionCb(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/options/IOptionsListener;->incomingOptions(Ljava/lang/String;Lcom/android/ims/internal/uce/options/OptionsCapInfo;I)V
+Lcom/android/ims/internal/uce/options/IOptionsListener;->serviceAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V
+Lcom/android/ims/internal/uce/options/IOptionsListener;->serviceUnavailable(Lcom/android/ims/internal/uce/common/StatusCode;)V
+Lcom/android/ims/internal/uce/options/IOptionsListener;->sipResponseReceived(Ljava/lang/String;Lcom/android/ims/internal/uce/options/OptionsSipResponse;Lcom/android/ims/internal/uce/options/OptionsCapInfo;)V
+Lcom/android/ims/internal/uce/options/IOptionsService$Stub;-><init>()V
+Lcom/android/ims/internal/uce/options/IOptionsService;->addListener(ILcom/android/ims/internal/uce/options/IOptionsListener;Lcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/options/IOptionsService;->getContactCap(ILjava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/options/IOptionsService;->getContactListCap(I[Ljava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/options/IOptionsService;->getMyInfo(II)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/options/IOptionsService;->getVersion(I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/options/IOptionsService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/options/IOptionsService;->responseIncomingOptions(IIILjava/lang/String;Lcom/android/ims/internal/uce/options/OptionsCapInfo;Z)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/options/IOptionsService;->setMyInfo(ILcom/android/ims/internal/uce/common/CapInfo;I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;->getCapInfo()Lcom/android/ims/internal/uce/common/CapInfo;
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;->getSdp()Ljava/lang/String;
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;->setCapInfo(Lcom/android/ims/internal/uce/common/CapInfo;)V
+Lcom/android/ims/internal/uce/options/OptionsCapInfo;->setSdp(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/options/OptionsCmdId;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsCmdId;->setCmdId(I)V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;->setCapInfo(Lcom/android/ims/internal/uce/common/CapInfo;)V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;->setCmdId(Lcom/android/ims/internal/uce/options/OptionsCmdId;)V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;->setStatus(Lcom/android/ims/internal/uce/common/StatusCode;)V
+Lcom/android/ims/internal/uce/options/OptionsCmdStatus;->setUserData(I)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;-><init>()V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setCmdId(Lcom/android/ims/internal/uce/options/OptionsCmdId;)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setReasonPhrase(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setRequestId(I)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setRetryAfter(I)V
+Lcom/android/ims/internal/uce/options/OptionsSipResponse;->setSipResponseCode(I)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->capInfoReceived(Ljava/lang/String;[Lcom/android/ims/internal/uce/presence/PresTupleInfo;)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->cmdStatus(Lcom/android/ims/internal/uce/presence/PresCmdStatus;)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->getVersionCb(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->listCapInfoReceived(Lcom/android/ims/internal/uce/presence/PresRlmiInfo;[Lcom/android/ims/internal/uce/presence/PresResInfo;)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->publishTriggering(Lcom/android/ims/internal/uce/presence/PresPublishTriggerType;)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->serviceAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->serviceUnAvailable(Lcom/android/ims/internal/uce/common/StatusCode;)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->sipResponseReceived(Lcom/android/ims/internal/uce/presence/PresSipResponse;)V
+Lcom/android/ims/internal/uce/presence/IPresenceListener;->unpublishMessageSent()V
+Lcom/android/ims/internal/uce/presence/IPresenceService$Stub;-><init>()V
+Lcom/android/ims/internal/uce/presence/IPresenceService;->addListener(ILcom/android/ims/internal/uce/presence/IPresenceListener;Lcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/presence/IPresenceService;->getContactCap(ILjava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/presence/IPresenceService;->getContactListCap(I[Ljava/lang/String;I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/presence/IPresenceService;->getVersion(I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/presence/IPresenceService;->publishMyCap(ILcom/android/ims/internal/uce/presence/PresCapInfo;I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/presence/IPresenceService;->reenableService(II)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/presence/IPresenceService;->removeListener(ILcom/android/ims/internal/uce/common/UceLong;)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/presence/IPresenceService;->setNewFeatureTag(ILjava/lang/String;Lcom/android/ims/internal/uce/presence/PresServiceInfo;I)Lcom/android/ims/internal/uce/common/StatusCode;
+Lcom/android/ims/internal/uce/presence/PresCapInfo;->getCapInfo()Lcom/android/ims/internal/uce/common/CapInfo;
+Lcom/android/ims/internal/uce/presence/PresCapInfo;->getContactUri()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresCapInfo;->mContactUri:Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresCmdId;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresCmdId;->setCmdId(I)V
+Lcom/android/ims/internal/uce/presence/PresCmdStatus;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresCmdStatus;->setCmdId(Lcom/android/ims/internal/uce/presence/PresCmdId;)V
+Lcom/android/ims/internal/uce/presence/PresCmdStatus;->setRequestId(I)V
+Lcom/android/ims/internal/uce/presence/PresCmdStatus;->setStatus(Lcom/android/ims/internal/uce/common/StatusCode;)V
+Lcom/android/ims/internal/uce/presence/PresCmdStatus;->setUserData(I)V
+Lcom/android/ims/internal/uce/presence/PresPublishTriggerType;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresPublishTriggerType;->setPublishTrigeerType(I)V
+Lcom/android/ims/internal/uce/presence/PresResInfo;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresResInfo;->setDisplayName(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresResInfo;->setInstanceInfo(Lcom/android/ims/internal/uce/presence/PresResInstanceInfo;)V
+Lcom/android/ims/internal/uce/presence/PresResInfo;->setResUri(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresResInstanceInfo;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresResInstanceInfo;->setPresentityUri(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresResInstanceInfo;->setReason(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresResInstanceInfo;->setResId(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresResInstanceInfo;->setResInstanceState(I)V
+Lcom/android/ims/internal/uce/presence/PresResInstanceInfo;->setTupleInfo([Lcom/android/ims/internal/uce/presence/PresTupleInfo;)V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;->setFullState(Z)V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;->setListName(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;->setPresSubscriptionState(Lcom/android/ims/internal/uce/presence/PresSubscriptionState;)V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;->setRequestId(I)V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;->setSubscriptionExpireTime(I)V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;->setSubscriptionTerminatedReason(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;->setUri(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresRlmiInfo;->setVersion(I)V
+Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getMediaType()I
+Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getServiceDesc()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getServiceId()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getServiceVer()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresSipResponse;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->getCmdId()Lcom/android/ims/internal/uce/presence/PresCmdId;
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->getReasonPhrase()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->getRequestId()I
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->getRetryAfter()I
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->getSipResponseCode()I
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->setCmdId(Lcom/android/ims/internal/uce/presence/PresCmdId;)V
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->setReasonPhrase(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->setRequestId(I)V
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->setRetryAfter(I)V
+Lcom/android/ims/internal/uce/presence/PresSipResponse;->setSipResponseCode(I)V
+Lcom/android/ims/internal/uce/presence/PresSubscriptionState;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresSubscriptionState;->setPresSubscriptionState(I)V
+Lcom/android/ims/internal/uce/presence/PresTupleInfo;-><init>()V
+Lcom/android/ims/internal/uce/presence/PresTupleInfo;->setContactUri(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresTupleInfo;->setFeatureTag(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/presence/PresTupleInfo;->setTimestamp(Ljava/lang/String;)V
+Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub;-><init>()V
+Lcom/android/ims/internal/uce/uceservice/IUceListener;->setStatus(I)V
+Lcom/android/ims/internal/uce/uceservice/IUceService$Stub;-><init>()V
+Lcom/android/ims/internal/uce/uceservice/IUceService;->createOptionsService(Lcom/android/ims/internal/uce/options/IOptionsListener;Lcom/android/ims/internal/uce/common/UceLong;)I
+Lcom/android/ims/internal/uce/uceservice/IUceService;->createPresenceService(Lcom/android/ims/internal/uce/presence/IPresenceListener;Lcom/android/ims/internal/uce/common/UceLong;)I
+Lcom/android/ims/internal/uce/uceservice/IUceService;->destroyOptionsService(I)V
+Lcom/android/ims/internal/uce/uceservice/IUceService;->destroyPresenceService(I)V
+Lcom/android/ims/internal/uce/uceservice/IUceService;->getOptionsService()Lcom/android/ims/internal/uce/options/IOptionsService;
+Lcom/android/ims/internal/uce/uceservice/IUceService;->getPresenceService()Lcom/android/ims/internal/uce/presence/IPresenceService;
+Lcom/android/ims/internal/uce/uceservice/IUceService;->getServiceStatus()Z
+Lcom/android/ims/internal/uce/uceservice/IUceService;->isServiceStarted()Z
+Lcom/android/ims/internal/uce/uceservice/IUceService;->startService(Lcom/android/ims/internal/uce/uceservice/IUceListener;)Z
+Lcom/android/ims/internal/uce/uceservice/IUceService;->stopService()Z
+Lcom/android/internal/R$array;->config_mobile_hotspot_provision_app:I
+Lcom/android/internal/R$array;->config_tether_wifi_regexs:I
+Lcom/android/internal/R$array;->maps_starting_lat_lng:I
+Lcom/android/internal/R$array;->maps_starting_zoom:I
+Lcom/android/internal/R$attr;->actionBarStyle:I
+Lcom/android/internal/R$attr;->mapViewStyle:I
+Lcom/android/internal/R$attr;->state_focused:I
+Lcom/android/internal/R$attr;->state_pressed:I
+Lcom/android/internal/R$attr;->state_selected:I
+Lcom/android/internal/R$attr;->switchStyle:I
+Lcom/android/internal/R$bool;->config_mms_content_disposition_support:I
+Lcom/android/internal/R$bool;->config_showNavigationBar:I
+Lcom/android/internal/R$dimen;-><init>()V
+Lcom/android/internal/R$dimen;->navigation_bar_height:I
+Lcom/android/internal/R$dimen;->navigation_bar_height_landscape:I
+Lcom/android/internal/R$dimen;->status_bar_height:I
+Lcom/android/internal/R$dimen;->toast_y_offset:I
+Lcom/android/internal/R$drawable;->btn_check_off:I
+Lcom/android/internal/R$drawable;->compass_arrow:I
+Lcom/android/internal/R$drawable;->compass_base:I
+Lcom/android/internal/R$drawable;->ic_maps_indicator_current_position_anim:I
+Lcom/android/internal/R$drawable;->ic_menu_close_clear_cancel:I
+Lcom/android/internal/R$drawable;->loading_tile_android:I
+Lcom/android/internal/R$drawable;->maps_google_logo:I
+Lcom/android/internal/R$drawable;->no_tile_256:I
+Lcom/android/internal/R$drawable;->reticle:I
+Lcom/android/internal/R$id;->amPm:I
+Lcom/android/internal/R$id;->edittext_container:I
+Lcom/android/internal/R$id;->icon:I
+Lcom/android/internal/R$id;->message:I
+Lcom/android/internal/R$id;->minute:I
+Lcom/android/internal/R$id;->shortcut:I
+Lcom/android/internal/R$id;->text:I
+Lcom/android/internal/R$id;->time:I
+Lcom/android/internal/R$id;->timePicker:I
+Lcom/android/internal/R$id;->title:I
+Lcom/android/internal/R$id;->title_container:I
+Lcom/android/internal/R$integer;->config_screenBrightnessDim:I
+Lcom/android/internal/R$integer;->config_toastDefaultGravity:I
+Lcom/android/internal/R$layout;->screen_title:I
+Lcom/android/internal/R$string;->byteShort:I
+Lcom/android/internal/R$string;->gigabyteShort:I
+Lcom/android/internal/R$string;->kilobyteShort:I
+Lcom/android/internal/R$string;->megabyteShort:I
+Lcom/android/internal/R$string;->petabyteShort:I
+Lcom/android/internal/R$string;->terabyteShort:I
+Lcom/android/internal/R$style;->Theme:I
+Lcom/android/internal/R$styleable;->AbsListView:[I
+Lcom/android/internal/R$styleable;->AbsListView_cacheColorHint:I
+Lcom/android/internal/R$styleable;->AbsListView_choiceMode:I
+Lcom/android/internal/R$styleable;->AbsListView_drawSelectorOnTop:I
+Lcom/android/internal/R$styleable;->AbsListView_fastScrollAlwaysVisible:I
+Lcom/android/internal/R$styleable;->AbsListView_fastScrollEnabled:I
+Lcom/android/internal/R$styleable;->AbsListView_listSelector:I
+Lcom/android/internal/R$styleable;->AbsListView_scrollingCache:I
+Lcom/android/internal/R$styleable;->AbsListView_smoothScrollbar:I
+Lcom/android/internal/R$styleable;->AbsListView_stackFromBottom:I
+Lcom/android/internal/R$styleable;->AbsListView_textFilterEnabled:I
+Lcom/android/internal/R$styleable;->AbsListView_transcriptMode:I
+Lcom/android/internal/R$styleable;->AccountAuthenticator:[I
+Lcom/android/internal/R$styleable;->AccountAuthenticator_accountPreferences:I
+Lcom/android/internal/R$styleable;->AccountAuthenticator_accountType:I
+Lcom/android/internal/R$styleable;->AccountAuthenticator_customTokens:I
+Lcom/android/internal/R$styleable;->AccountAuthenticator_icon:I
+Lcom/android/internal/R$styleable;->AccountAuthenticator_label:I
+Lcom/android/internal/R$styleable;->AccountAuthenticator_smallIcon:I
+Lcom/android/internal/R$styleable;->AndroidManifest:[I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity:[I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_allowTaskReparenting:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_configChanges:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_description:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_enabled:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_excludeFromRecents:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_exported:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_hardwareAccelerated:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_icon:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_immersive:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_label:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_launchMode:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_logo:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_name:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_noHistory:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_permission:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_process:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_screenOrientation:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_taskAffinity:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_theme:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_uiOptions:I
+Lcom/android/internal/R$styleable;->AndroidManifestActivity_windowSoftInputMode:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication:[I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_enabled:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_hardwareAccelerated:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_label:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_largeHeap:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_name:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_permission:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_process:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_supportsRtl:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_theme:I
+Lcom/android/internal/R$styleable;->AndroidManifestApplication_uiOptions:I
+Lcom/android/internal/R$styleable;->AndroidManifestData:[I
+Lcom/android/internal/R$styleable;->AndroidManifestIntentFilter:[I
+Lcom/android/internal/R$styleable;->AndroidManifestIntentFilter_priority:I
+Lcom/android/internal/R$styleable;->AndroidManifestMetaData:[I
+Lcom/android/internal/R$styleable;->AndroidManifestMetaData_name:I
+Lcom/android/internal/R$styleable;->AndroidManifestMetaData_resource:I
+Lcom/android/internal/R$styleable;->AndroidManifestMetaData_value:I
+Lcom/android/internal/R$styleable;->AndroidManifestService:[I
+Lcom/android/internal/R$styleable;->AndroidManifestService_enabled:I
+Lcom/android/internal/R$styleable;->AndroidManifestService_exported:I
+Lcom/android/internal/R$styleable;->AndroidManifestService_name:I
+Lcom/android/internal/R$styleable;->AndroidManifestService_permission:I
+Lcom/android/internal/R$styleable;->AndroidManifestService_process:I
+Lcom/android/internal/R$styleable;->AndroidManifestUsesPermission:[I
+Lcom/android/internal/R$styleable;->AndroidManifestUsesPermission_name:I
+Lcom/android/internal/R$styleable;->AndroidManifestUsesSdk:[I
+Lcom/android/internal/R$styleable;->AndroidManifestUsesSdk_minSdkVersion:I
+Lcom/android/internal/R$styleable;->AndroidManifestUsesSdk_targetSdkVersion:I
+Lcom/android/internal/R$styleable;->AndroidManifest_installLocation:I
+Lcom/android/internal/R$styleable;->AndroidManifest_sharedUserId:I
+Lcom/android/internal/R$styleable;->AndroidManifest_versionCode:I
+Lcom/android/internal/R$styleable;->AndroidManifest_versionName:I
+Lcom/android/internal/R$styleable;->CheckBoxPreference:[I
+Lcom/android/internal/R$styleable;->CheckBoxPreference_disableDependentsState:I
+Lcom/android/internal/R$styleable;->CheckBoxPreference_summaryOff:I
+Lcom/android/internal/R$styleable;->CheckBoxPreference_summaryOn:I
+Lcom/android/internal/R$styleable;->CompoundButton:[I
+Lcom/android/internal/R$styleable;->CompoundButton_button:I
+Lcom/android/internal/R$styleable;->CompoundButton_checked:I
+Lcom/android/internal/R$styleable;->DialogPreference:[I
+Lcom/android/internal/R$styleable;->DialogPreference_dialogTitle:I
+Lcom/android/internal/R$styleable;->EdgeEffect:[I
+Lcom/android/internal/R$styleable;->EdgeEffect_colorEdgeEffect:I
+Lcom/android/internal/R$styleable;->GridView:[I
+Lcom/android/internal/R$styleable;->IconMenuView:[I
+Lcom/android/internal/R$styleable;->ImageView:[I
+Lcom/android/internal/R$styleable;->ImageView_scaleType:I
+Lcom/android/internal/R$styleable;->ImageView_src:I
+Lcom/android/internal/R$styleable;->ListPreference:[I
+Lcom/android/internal/R$styleable;->ListPreference_entries:I
+Lcom/android/internal/R$styleable;->ListView:[I
+Lcom/android/internal/R$styleable;->ListView_divider:I
+Lcom/android/internal/R$styleable;->ListView_dividerHeight:I
+Lcom/android/internal/R$styleable;->ListView_entries:I
+Lcom/android/internal/R$styleable;->ListView_footerDividersEnabled:I
+Lcom/android/internal/R$styleable;->ListView_headerDividersEnabled:I
+Lcom/android/internal/R$styleable;->ListView_overScrollFooter:I
+Lcom/android/internal/R$styleable;->ListView_overScrollHeader:I
+Lcom/android/internal/R$styleable;->NumberPicker:[I
+Lcom/android/internal/R$styleable;->PopupWindow:[I
+Lcom/android/internal/R$styleable;->Preference:[I
+Lcom/android/internal/R$styleable;->PreferenceGroup:[I
+Lcom/android/internal/R$styleable;->PreferenceGroup_orderingFromXml:I
+Lcom/android/internal/R$styleable;->Preference_defaultValue:I
+Lcom/android/internal/R$styleable;->Preference_dependency:I
+Lcom/android/internal/R$styleable;->Preference_enabled:I
+Lcom/android/internal/R$styleable;->Preference_fragment:I
+Lcom/android/internal/R$styleable;->Preference_icon:I
+Lcom/android/internal/R$styleable;->Preference_key:I
+Lcom/android/internal/R$styleable;->Preference_layout:I
+Lcom/android/internal/R$styleable;->Preference_order:I
+Lcom/android/internal/R$styleable;->Preference_persistent:I
+Lcom/android/internal/R$styleable;->Preference_selectable:I
+Lcom/android/internal/R$styleable;->Preference_shouldDisableView:I
+Lcom/android/internal/R$styleable;->Preference_summary:I
+Lcom/android/internal/R$styleable;->Preference_title:I
+Lcom/android/internal/R$styleable;->Preference_widgetLayout:I
+Lcom/android/internal/R$styleable;->ScrollView:[I
+Lcom/android/internal/R$styleable;->ScrollView_fillViewport:I
+Lcom/android/internal/R$styleable;->SyncAdapter:[I
+Lcom/android/internal/R$styleable;->SyncAdapter_accountType:I
+Lcom/android/internal/R$styleable;->SyncAdapter_allowParallelSyncs:I
+Lcom/android/internal/R$styleable;->SyncAdapter_contentAuthority:I
+Lcom/android/internal/R$styleable;->SyncAdapter_isAlwaysSyncable:I
+Lcom/android/internal/R$styleable;->SyncAdapter_settingsActivity:I
+Lcom/android/internal/R$styleable;->SyncAdapter_supportsUploading:I
+Lcom/android/internal/R$styleable;->SyncAdapter_userVisible:I
+Lcom/android/internal/R$styleable;->TabWidget:[I
+Lcom/android/internal/R$styleable;->TextAppearance:[I
+Lcom/android/internal/R$styleable;->TextView:[I
+Lcom/android/internal/R$styleable;->TextViewAppearance:[I
+Lcom/android/internal/R$styleable;->TextView_drawableBottom:I
+Lcom/android/internal/R$styleable;->TextView_drawableLeft:I
+Lcom/android/internal/R$styleable;->TextView_drawableRight:I
+Lcom/android/internal/R$styleable;->TextView_drawableTop:I
+Lcom/android/internal/R$styleable;->TextView_maxLines:I
+Lcom/android/internal/R$styleable;->TextView_textColor:I
+Lcom/android/internal/R$styleable;->TextView_textColorHint:I
+Lcom/android/internal/R$styleable;->TwoLineListItem:[I
+Lcom/android/internal/R$styleable;->View:[I
+Lcom/android/internal/R$styleable;->ViewGroup_Layout:[I
+Lcom/android/internal/R$styleable;->ViewGroup_Layout_layout_height:I
+Lcom/android/internal/R$styleable;->ViewGroup_Layout_layout_width:I
+Lcom/android/internal/R$styleable;->ViewStub:[I
+Lcom/android/internal/R$styleable;->ViewStub_inflatedId:I
+Lcom/android/internal/R$styleable;->ViewStub_layout:I
+Lcom/android/internal/R$styleable;->View_background:I
+Lcom/android/internal/R$styleable;->View_id:I
+Lcom/android/internal/R$styleable;->Window:[I
+Lcom/android/internal/R$styleable;->Window_windowActionBarFullscreenDecorLayout:I
+Lcom/android/internal/R$styleable;->Window_windowIsFloating:I
+Lcom/android/internal/R$styleable;->Window_windowIsTranslucent:I
+Lcom/android/internal/R$styleable;->Window_windowShowWallpaper:I
+Lcom/android/internal/R$xml;->power_profile:I
+Lcom/android/internal/app/AlertController$AlertParams;->mIconId:I
+Lcom/android/internal/app/AlertController$AlertParams;->mMessage:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController$AlertParams;->mNegativeButtonListener:Landroid/content/DialogInterface$OnClickListener;
+Lcom/android/internal/app/AlertController$AlertParams;->mNegativeButtonText:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController$AlertParams;->mPositiveButtonListener:Landroid/content/DialogInterface$OnClickListener;
+Lcom/android/internal/app/AlertController$AlertParams;->mPositiveButtonText:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController$AlertParams;->mTitle:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController$AlertParams;->mView:Landroid/view/View;
+Lcom/android/internal/app/AlertController$RecycleListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
+Lcom/android/internal/app/AlertController;->getButton(I)Landroid/widget/Button;
+Lcom/android/internal/app/AlertController;->mCustomTitleView:Landroid/view/View;
+Lcom/android/internal/app/AlertController;->mForceInverseBackground:Z
+Lcom/android/internal/app/AlertController;->mTitle:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController;->mView:Landroid/view/View;
+Lcom/android/internal/app/IAppOpsService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkOperation(IILjava/lang/String;)I
+Lcom/android/internal/app/IAppOpsService$Stub$Proxy;->setMode(IILjava/lang/String;I)V
+Lcom/android/internal/app/IAppOpsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsService;
+Lcom/android/internal/app/IAppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;)V
+Lcom/android/internal/app/IBatteryStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/app/IBatteryStats$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IBatteryStats;
+Lcom/android/internal/app/IBatteryStats;->getStatistics()[B
+Lcom/android/internal/app/IVoiceInteractionManagerService$Stub$Proxy;->showSessionFromSession(Landroid/os/IBinder;Landroid/os/Bundle;I)Z
+Lcom/android/internal/app/IVoiceInteractionManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IVoiceInteractionManagerService;
+Lcom/android/internal/app/IVoiceInteractionManagerService;->getKeyphraseSoundModel(ILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;
+Lcom/android/internal/appwidget/IAppWidgetService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/appwidget/IAppWidgetService;
+Lcom/android/internal/content/PackageMonitor;-><init>()V
+Lcom/android/internal/content/PackageMonitor;->register(Landroid/content/Context;Landroid/os/Looper;Landroid/os/UserHandle;Z)V
+Lcom/android/internal/content/PackageMonitor;->unregister()V
+Lcom/android/internal/content/ReferrerIntent;-><init>(Landroid/content/Intent;Ljava/lang/String;)V
+Lcom/android/internal/content/ReferrerIntent;->mReferrer:Ljava/lang/String;
+Lcom/android/internal/location/ILocationProvider$Stub;-><init>()V
+Lcom/android/internal/location/ILocationProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProvider;
+Lcom/android/internal/location/ILocationProvider;->disable()V
+Lcom/android/internal/location/ILocationProvider;->enable()V
+Lcom/android/internal/location/ILocationProvider;->getProperties()Lcom/android/internal/location/ProviderProperties;
+Lcom/android/internal/location/ILocationProvider;->getStatus(Landroid/os/Bundle;)I
+Lcom/android/internal/location/ILocationProvider;->getStatusUpdateTime()J
+Lcom/android/internal/location/ILocationProvider;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)Z
+Lcom/android/internal/location/ILocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+Lcom/android/internal/location/ProviderRequest;-><init>()V
+Lcom/android/internal/location/ProviderRequest;->interval:J
+Lcom/android/internal/location/ProviderRequest;->locationRequests:Ljava/util/List;
+Lcom/android/internal/location/ProviderRequest;->reportLocation:Z
+Lcom/android/internal/os/BatterySipper;-><init>(Lcom/android/internal/os/BatterySipper$DrainType;Landroid/os/BatteryStats$Uid;D)V
+Lcom/android/internal/os/BatterySipper;->add(Lcom/android/internal/os/BatterySipper;)V
+Lcom/android/internal/os/BatterySipper;->drainType:Lcom/android/internal/os/BatterySipper$DrainType;
+Lcom/android/internal/os/BatterySipper;->getUid()I
+Lcom/android/internal/os/BatterySipper;->mPackages:[Ljava/lang/String;
+Lcom/android/internal/os/BatterySipper;->packageWithHighestDrain:Ljava/lang/String;
+Lcom/android/internal/os/BatterySipper;->totalPowerMah:D
+Lcom/android/internal/os/BatterySipper;->uidObj:Landroid/os/BatteryStats$Uid;
+Lcom/android/internal/os/BatteryStatsHelper;-><init>(Landroid/content/Context;ZZ)V
+Lcom/android/internal/os/BatteryStatsHelper;->getMaxPower()D
+Lcom/android/internal/os/BatteryStatsHelper;->getStats()Landroid/os/BatteryStats;
+Lcom/android/internal/os/BatteryStatsHelper;->getTotalPower()D
+Lcom/android/internal/os/BatteryStatsHelper;->load()V
+Lcom/android/internal/os/BatteryStatsHelper;->mBatteryInfo:Lcom/android/internal/app/IBatteryStats;
+Lcom/android/internal/os/BatteryStatsHelper;->mPowerProfile:Lcom/android/internal/os/PowerProfile;
+Lcom/android/internal/os/BatteryStatsHelper;->mUsageList:Ljava/util/List;
+Lcom/android/internal/os/BatteryStatsHelper;->refreshStats(II)V
+Lcom/android/internal/os/BatteryStatsImpl$Timer;->getCountLocked(I)I
+Lcom/android/internal/os/BatteryStatsImpl$Timer;->getTotalTimeLocked(JI)J
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getForegroundTime(I)J
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getStarts(I)I
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getSystemTime(I)J
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getUserTime(I)J
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Sensor;->getHandle()I
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Sensor;->getSensorTime()Lcom/android/internal/os/BatteryStatsImpl$Timer;
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;->getWakeTime(I)Lcom/android/internal/os/BatteryStatsImpl$Timer;
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getProcessStats()Landroid/util/ArrayMap;
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getSensorStats()Landroid/util/SparseArray;
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getUid()I
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWakelockStats()Landroid/util/ArrayMap;
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiRunningTime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWifiScanTime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl;->CREATOR:Landroid/os/Parcelable$Creator;
+Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryRealtime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl;->computeBatteryUptime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl;->getBatteryRealtime(J)J
+Lcom/android/internal/os/BatteryStatsImpl;->getDischargeAmount(I)I
+Lcom/android/internal/os/BatteryStatsImpl;->getDischargeCurrentLevel()I
+Lcom/android/internal/os/BatteryStatsImpl;->getDischargeStartLevel()I
+Lcom/android/internal/os/BatteryStatsImpl;->getGlobalWifiRunningTime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl;->getPhoneOnTime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl;->getPhoneSignalScanningTime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl;->getPhoneSignalStrengthTime(IJI)J
+Lcom/android/internal/os/BatteryStatsImpl;->getScreenBrightnessTime(IJI)J
+Lcom/android/internal/os/BatteryStatsImpl;->getScreenOnTime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl;->getUidStats()Landroid/util/SparseArray;
+Lcom/android/internal/os/BatteryStatsImpl;->getUidStatsLocked(I)Lcom/android/internal/os/BatteryStatsImpl$Uid;
+Lcom/android/internal/os/BatteryStatsImpl;->getWifiOnTime(JI)J
+Lcom/android/internal/os/FuseAppLoop;->onCommand(IJJJI[B)V
+Lcom/android/internal/os/FuseAppLoop;->onOpen(JJ)[B
+Lcom/android/internal/os/IDropBoxManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IDropBoxManagerService;
+Lcom/android/internal/os/PowerProfile;-><init>(Landroid/content/Context;)V
+Lcom/android/internal/os/PowerProfile;->getAveragePower(Ljava/lang/String;)D
+Lcom/android/internal/os/PowerProfile;->getAveragePower(Ljava/lang/String;I)D
+Lcom/android/internal/os/PowerProfile;->getBatteryCapacity()D
+Lcom/android/internal/os/SomeArgs;->arg1:Ljava/lang/Object;
+Lcom/android/internal/os/SomeArgs;->arg2:Ljava/lang/Object;
+Lcom/android/internal/os/SomeArgs;->arg3:Ljava/lang/Object;
+Lcom/android/internal/os/SomeArgs;->obtain()Lcom/android/internal/os/SomeArgs;
+Lcom/android/internal/os/SomeArgs;->recycle()V
+Lcom/android/internal/telephony/GsmAlphabet;->gsm7BitPackedToString([BII)Ljava/lang/String;
+Lcom/android/internal/telephony/GsmAlphabet;->stringToGsm7BitPacked(Ljava/lang/String;)[B
+Lcom/android/internal/telephony/IMms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IMms;
+Lcom/android/internal/telephony/IPhoneSubInfo$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/IPhoneSubInfo;
+Lcom/android/internal/telephony/ISms$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ISms;
+Lcom/android/internal/telephony/ISub$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/telephony/ITelephony$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->endCall()Z
+Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->mRemote:Landroid/os/IBinder;
+Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_call:I
+Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_endCall:I
+Lcom/android/internal/telephony/ITelephony$Stub;->TRANSACTION_getDeviceId:I
+Lcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony;
+Lcom/android/internal/telephony/ITelephony;->answerRingingCall()V
+Lcom/android/internal/telephony/ITelephony;->call(Ljava/lang/String;Ljava/lang/String;)V
+Lcom/android/internal/telephony/ITelephony;->dial(Ljava/lang/String;)V
+Lcom/android/internal/telephony/ITelephony;->disableDataConnectivity()Z
+Lcom/android/internal/telephony/ITelephony;->enableDataConnectivity()Z
+Lcom/android/internal/telephony/ITelephony;->endCall()Z
+Lcom/android/internal/telephony/ITelephony;->endCallForSubscriber(I)Z
+Lcom/android/internal/telephony/ITelephony;->getCallState()I
+Lcom/android/internal/telephony/ITelephony;->getDataEnabled(I)Z
+Lcom/android/internal/telephony/ITelephony;->getDataState()I
+Lcom/android/internal/telephony/ITelephony;->isIdle(Ljava/lang/String;)Z
+Lcom/android/internal/telephony/ITelephony;->setRadio(Z)Z
+Lcom/android/internal/telephony/ITelephony;->silenceRinger()V
+Lcom/android/internal/telephony/ITelephonyRegistry$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry;
+Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallState(ILjava/lang/String;)V
+Lcom/android/internal/telephony/OperatorInfo$State;->CURRENT:Lcom/android/internal/telephony/OperatorInfo$State;
+Lcom/android/internal/telephony/OperatorInfo$State;->FORBIDDEN:Lcom/android/internal/telephony/OperatorInfo$State;
+Lcom/android/internal/telephony/OperatorInfo;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+Lcom/android/internal/telephony/OperatorInfo;->CREATOR:Landroid/os/Parcelable$Creator;
+Lcom/android/internal/telephony/OperatorInfo;->getOperatorAlphaLong()Ljava/lang/String;
+Lcom/android/internal/telephony/OperatorInfo;->getOperatorAlphaShort()Ljava/lang/String;
+Lcom/android/internal/telephony/OperatorInfo;->getOperatorNumeric()Ljava/lang/String;
+Lcom/android/internal/telephony/OperatorInfo;->getState()Lcom/android/internal/telephony/OperatorInfo$State;
+Lcom/android/internal/telephony/SmsHeader$ConcatRef;->msgCount:I
+Lcom/android/internal/telephony/SmsHeader$ConcatRef;->refNumber:I
+Lcom/android/internal/telephony/SmsHeader$ConcatRef;->seqNumber:I
+Lcom/android/internal/telephony/SmsHeader;->concatRef:Lcom/android/internal/telephony/SmsHeader$ConcatRef;
+Lcom/android/internal/telephony/SmsMessageBase;->mUserDataHeader:Lcom/android/internal/telephony/SmsHeader;
+Lcom/android/internal/telephony/SmsRawData;-><init>([B)V
+Lcom/android/internal/telephony/SmsRawData;->CREATOR:Landroid/os/Parcelable$Creator;
+Lcom/android/internal/textservice/ITextServicesManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/util/AsyncChannel;-><init>()V
+Lcom/android/internal/util/AsyncChannel;->connect(Landroid/content/Context;Landroid/os/Handler;Landroid/os/Messenger;)V
+Lcom/android/internal/util/AsyncChannel;->sendMessage(III)V
+Lcom/android/internal/util/AsyncChannel;->sendMessage(Landroid/os/Message;)V
+Lcom/android/internal/util/FastPrintWriter;-><init>(Ljava/io/OutputStream;)V
+Lcom/android/internal/util/IndentingPrintWriter;-><init>(Ljava/io/Writer;Ljava/lang/String;)V
+Lcom/android/internal/util/IndentingPrintWriter;->decreaseIndent()Lcom/android/internal/util/IndentingPrintWriter;
+Lcom/android/internal/util/IndentingPrintWriter;->increaseIndent()Lcom/android/internal/util/IndentingPrintWriter;
+Lcom/android/internal/util/XmlUtils;->beginDocument(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
+Lcom/android/internal/util/XmlUtils;->nextElement(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/internal/util/XmlUtils;->readMapXml(Ljava/io/InputStream;)Ljava/util/HashMap;
+Lcom/android/internal/util/XmlUtils;->skipCurrentTag(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Ljava/io/OutputStream;)V
+Lcom/android/internal/view/IInputConnectionWrapper;->mInputConnection:Landroid/view/inputmethod/InputConnection;
+Lcom/android/internal/view/IInputConnectionWrapper;->mLock:Ljava/lang/Object;
+Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodList()Ljava/util/List;
+Lcom/android/internal/view/IInputMethodManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/view/IInputMethodManager;
+Lcom/android/internal/view/InputBindResult;->CREATOR:Landroid/os/Parcelable$Creator;
+Lcom/android/internal/view/menu/MenuBuilder;-><init>(Landroid/content/Context;)V
+Lcom/android/internal/view/menu/MenuBuilder;->mContext:Landroid/content/Context;
+Lcom/android/internal/view/menu/MenuBuilder;->setCurrentMenuInfo(Landroid/view/ContextMenu$ContextMenuInfo;)V
+Lcom/android/internal/view/menu/MenuBuilder;->setOptionalIconsVisible(Z)V
+Lcom/android/internal/view/menu/MenuItemImpl;->mIconResId:I
+Lcom/android/internal/view/menu/MenuItemImpl;->setMenuInfo(Landroid/view/ContextMenu$ContextMenuInfo;)V
+Lcom/android/internal/view/menu/MenuPopupHelper;->mForceShowIcon:Z
+Lcom/android/internal/view/menu/MenuPopupHelper;->setForceShowIcon(Z)V
+Lcom/android/internal/view/menu/MenuView$ItemView;->getItemData()Lcom/android/internal/view/menu/MenuItemImpl;
+Lcom/android/okhttp/ConnectionPool;->keepAliveDurationNs:J
+Lcom/android/okhttp/ConnectionPool;->maxIdleConnections:I
+Lcom/android/okhttp/ConnectionPool;->systemDefault:Lcom/android/okhttp/ConnectionPool;
+Lcom/android/okhttp/HttpUrl;->encodedPath()Ljava/lang/String;
+Lcom/android/okhttp/HttpUrl;->query()Ljava/lang/String;
+Lcom/android/okhttp/OkHttpClient;->DEFAULT_PROTOCOLS:Ljava/util/List;
+Lcom/android/okhttp/OkHttpClient;->connectionPool:Lcom/android/okhttp/ConnectionPool;
+Lcom/android/okhttp/OkHttpClient;->dns:Lcom/android/okhttp/Dns;
+Lcom/android/okhttp/OkHttpClient;->setProtocols(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
+Lcom/android/okhttp/OkHttpClient;->setRetryOnConnectionFailure(Z)V
+Lcom/android/okhttp/Request;->headers:Lcom/android/okhttp/Headers;
+Lcom/android/okhttp/Request;->method:Ljava/lang/String;
+Lcom/android/okhttp/Request;->url:Lcom/android/okhttp/HttpUrl;
+Lcom/android/okhttp/Response;->code:I
+Lcom/android/okhttp/Response;->headers:Lcom/android/okhttp/Headers;
+Lcom/android/okhttp/Response;->message:Ljava/lang/String;
+Lcom/android/okhttp/Response;->networkResponse:Lcom/android/okhttp/Response;
+Lcom/android/okhttp/Response;->protocol:Lcom/android/okhttp/Protocol;
+Lcom/android/okhttp/internal/http/HttpEngine;->httpStream:Lcom/android/okhttp/internal/http/HttpStream;
+Lcom/android/okhttp/internal/http/HttpEngine;->networkRequest(Lcom/android/okhttp/Request;)Lcom/android/okhttp/Request;
+Lcom/android/okhttp/internal/http/HttpEngine;->networkRequest:Lcom/android/okhttp/Request;
+Lcom/android/okhttp/internal/http/HttpEngine;->priorResponse:Lcom/android/okhttp/Response;
+Lcom/android/okhttp/internal/http/HttpEngine;->userResponse:Lcom/android/okhttp/Response;
+Lcom/android/okhttp/okio/ByteString;->readObject(Ljava/io/ObjectInputStream;)V
+Lcom/android/okhttp/okio/ByteString;->serialVersionUID:J
+Lcom/android/okhttp/okio/ByteString;->writeObject(Ljava/io/ObjectOutputStream;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getAlpnSelectedProtocol()[B
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getApplicationProtocol()Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getApplicationProtocols()[Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getChannelId()[B
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getHandshakeApplicationProtocol()Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getHostname()Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getHostnameOrIP()Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getNpnSelectedProtocol()[B
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getSoWriteTimeout()I
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setAlpnProtocols([B)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setAlpnProtocols([Ljava/lang/String;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setApplicationProtocols([Ljava/lang/String;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setChannelIdEnabled(Z)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setChannelIdPrivateKey(Ljava/security/PrivateKey;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setHandshakeTimeout(I)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setHostname(Ljava/lang/String;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setNpnProtocols([B)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setSoWriteTimeout(I)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setUseSessionTickets(Z)V
+Lcom/android/org/conscrypt/ConscryptSocketBase;->getHostname()Ljava/lang/String;
+Lcom/android/org/conscrypt/ConscryptSocketBase;->getHostnameOrIP()Ljava/lang/String;
+Lcom/android/org/conscrypt/ConscryptSocketBase;->getSoWriteTimeout()I
+Lcom/android/org/conscrypt/ConscryptSocketBase;->setHandshakeTimeout(I)V
+Lcom/android/org/conscrypt/ConscryptSocketBase;->setHostname(Ljava/lang/String;)V
+Lcom/android/org/conscrypt/ConscryptSocketBase;->setSoWriteTimeout(I)V
+Lcom/android/org/conscrypt/ConscryptSocketBase;->socket:Ljava/net/Socket;
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getChannelId()[B
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getHostname()Ljava/lang/String;
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getHostnameOrIP()Ljava/lang/String;
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getNpnSelectedProtocol()[B
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getSoWriteTimeout()I
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([Ljava/lang/String;)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setChannelIdEnabled(Z)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setChannelIdPrivateKey(Ljava/security/PrivateKey;)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHandshakeTimeout(I)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHostname(Ljava/lang/String;)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setNpnProtocols([B)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setSoWriteTimeout(I)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setUseSessionTickets(Z)V
+Lcom/android/org/conscrypt/OpenSSLX509Certificate;->mContext:J
+Lcom/android/org/conscrypt/OpenSSLX509Certificate;->serialVersionUID:J
+Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$ParsingException;->serialVersionUID:J
+Lcom/android/org/conscrypt/TrustManagerImpl;-><init>(Ljava/security/KeyStore;)V
+Ldalvik/system/BaseDexClassLoader;->addDexPath(Ljava/lang/String;)V
+Ldalvik/system/BaseDexClassLoader;->getLdLibraryPath()Ljava/lang/String;
+Ldalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList;
+Ldalvik/system/BlockGuard$Policy;->onNetwork()V
+Ldalvik/system/BlockGuard$Policy;->onReadFromDisk()V
+Ldalvik/system/BlockGuard;->getThreadPolicy()Ldalvik/system/BlockGuard$Policy;
+Ldalvik/system/CloseGuard;->close()V
+Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard;
+Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V
+Ldalvik/system/CloseGuard;->warnIfOpen()V
+Ldalvik/system/DexFile$DFEnum;->mNameList:[Ljava/lang/String;
+Ldalvik/system/DexFile;->getClassNameList(Ljava/lang/Object;)[Ljava/lang/String;
+Ldalvik/system/DexFile;->isBackedByOatFile()Z
+Ldalvik/system/DexFile;->loadClassBinaryName(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/List;)Ljava/lang/Class;
+Ldalvik/system/DexFile;->mCookie:Ljava/lang/Object;
+Ldalvik/system/DexFile;->mFileName:Ljava/lang/String;
+Ldalvik/system/DexFile;->mInternalCookie:Ljava/lang/Object;
+Ldalvik/system/DexFile;->openDexFile(Ljava/lang/String;Ljava/lang/String;ILjava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ljava/lang/Object;
+Ldalvik/system/DexPathList$Element;-><init>(Ldalvik/system/DexFile;Ljava/io/File;)V
+Ldalvik/system/DexPathList$Element;-><init>(Ljava/io/File;ZLjava/io/File;Ldalvik/system/DexFile;)V
+Ldalvik/system/DexPathList$Element;->dexFile:Ldalvik/system/DexFile;
+Ldalvik/system/DexPathList$NativeLibraryElement;-><init>(Ljava/io/File;)V
+Ldalvik/system/DexPathList$NativeLibraryElement;->path:Ljava/io/File;
+Ldalvik/system/DexPathList;-><init>(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)V
+Ldalvik/system/DexPathList;->addDexPath(Ljava/lang/String;Ljava/io/File;)V
+Ldalvik/system/DexPathList;->definingContext:Ljava/lang/ClassLoader;
+Ldalvik/system/DexPathList;->dexElements:[Ldalvik/system/DexPathList$Element;
+Ldalvik/system/DexPathList;->loadDexFile(Ljava/io/File;Ljava/io/File;Ljava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ldalvik/system/DexFile;
+Ldalvik/system/DexPathList;->makeDexElements(Ljava/util/List;Ljava/io/File;Ljava/util/List;Ljava/lang/ClassLoader;)[Ldalvik/system/DexPathList$Element;
+Ldalvik/system/DexPathList;->makeInMemoryDexElements([Ljava/nio/ByteBuffer;Ljava/util/List;)[Ldalvik/system/DexPathList$Element;
+Ldalvik/system/DexPathList;->makePathElements(Ljava/util/List;)[Ldalvik/system/DexPathList$NativeLibraryElement;
+Ldalvik/system/DexPathList;->makePathElements(Ljava/util/List;Ljava/io/File;Ljava/util/List;)[Ldalvik/system/DexPathList$Element;
+Ldalvik/system/DexPathList;->nativeLibraryDirectories:Ljava/util/List;
+Ldalvik/system/DexPathList;->nativeLibraryPathElements:[Ldalvik/system/DexPathList$NativeLibraryElement;
+Ldalvik/system/DexPathList;->splitPaths(Ljava/lang/String;Z)Ljava/util/List;
+Ldalvik/system/DexPathList;->systemNativeLibraryDirectories:Ljava/util/List;
+Ldalvik/system/VMDebug;->dumpReferenceTables()V
+Ldalvik/system/VMDebug;->isDebuggerConnected()Z
+Ldalvik/system/VMRuntime;->addressOf(Ljava/lang/Object;)J
+Ldalvik/system/VMRuntime;->clearGrowthLimit()V
+Ldalvik/system/VMRuntime;->gcSoftReferences()V
+Ldalvik/system/VMRuntime;->getCurrentInstructionSet()Ljava/lang/String;
+Ldalvik/system/VMRuntime;->getExternalBytesAllocated()J
+Ldalvik/system/VMRuntime;->getInstructionSet(Ljava/lang/String;)Ljava/lang/String;
+Ldalvik/system/VMRuntime;->getRuntime()Ldalvik/system/VMRuntime;
+Ldalvik/system/VMRuntime;->is64Bit()Z
+Ldalvik/system/VMRuntime;->is64BitAbi(Ljava/lang/String;)Z
+Ldalvik/system/VMRuntime;->newNonMovableArray(Ljava/lang/Class;I)Ljava/lang/Object;
+Ldalvik/system/VMRuntime;->registerNativeAllocation(I)V
+Ldalvik/system/VMRuntime;->registerNativeFree(I)V
+Ldalvik/system/VMRuntime;->runFinalization(J)V
+Ldalvik/system/VMRuntime;->setMinimumHeapSize(J)J
+Ldalvik/system/VMRuntime;->setTargetHeapUtilization(F)F
+Ldalvik/system/VMRuntime;->setTargetSdkVersion(I)V
+Ldalvik/system/VMRuntime;->trackExternalAllocation(J)Z
+Ldalvik/system/VMRuntime;->trackExternalFree(J)V
+Ldalvik/system/VMRuntime;->vmInstructionSet()Ljava/lang/String;
+Ldalvik/system/VMRuntime;->vmLibrary()Ljava/lang/String;
+Ldalvik/system/VMStack;->getCallingClassLoader()Ljava/lang/ClassLoader;
+Ldalvik/system/VMStack;->getStackClass2()Ljava/lang/Class;
+Ljava/awt/font/NumericShaper;->serialVersionUID:J
+Ljava/awt/font/NumericShaper;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/awt/font/TextAttribute;->serialVersionUID:J
+Ljava/beans/IndexedPropertyChangeEvent;->serialVersionUID:J
+Ljava/beans/PropertyChangeEvent;->serialVersionUID:J
+Ljava/beans/PropertyChangeSupport;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/beans/PropertyChangeSupport;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/beans/PropertyChangeSupport;->serialVersionUID:J
+Ljava/beans/PropertyChangeSupport;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/io/CharConversionException;->serialVersionUID:J
+Ljava/io/EOFException;->serialVersionUID:J
+Ljava/io/File;->filePath:Ljava/nio/file/Path;
+Ljava/io/File;->fs:Ljava/io/FileSystem;
+Ljava/io/File;->path:Ljava/lang/String;
+Ljava/io/File;->prefixLength:I
+Ljava/io/File;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/io/File;->serialVersionUID:J
+Ljava/io/File;->status:Ljava/io/File$PathStatus;
+Ljava/io/File;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/io/FileDescriptor;->descriptor:I
+Ljava/io/FileDescriptor;->getInt$()I
+Ljava/io/FileDescriptor;->isSocket$()Z
+Ljava/io/FileDescriptor;->setInt$(I)V
+Ljava/io/FileInputStream;->fd:Ljava/io/FileDescriptor;
+Ljava/io/FileNotFoundException;->serialVersionUID:J
+Ljava/io/FileOutputStream;->fd:Ljava/io/FileDescriptor;
+Ljava/io/IOError;->serialVersionUID:J
+Ljava/io/IOException;->serialVersionUID:J
+Ljava/io/InterruptedIOException;->serialVersionUID:J
+Ljava/io/InvalidClassException;->serialVersionUID:J
+Ljava/io/InvalidObjectException;->serialVersionUID:J
+Ljava/io/NotActiveException;->serialVersionUID:J
+Ljava/io/NotSerializableException;->serialVersionUID:J
+Ljava/io/ObjectStreamClass;->getConstructorId(Ljava/lang/Class;)J
+Ljava/io/ObjectStreamClass;->newInstance()Ljava/lang/Object;
+Ljava/io/ObjectStreamClass;->newInstance(Ljava/lang/Class;J)Ljava/lang/Object;
+Ljava/io/ObjectStreamClass;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/io/ObjectStreamClass;->serialVersionUID:J
+Ljava/io/ObjectStreamException;->serialVersionUID:J
+Ljava/io/OptionalDataException;->serialVersionUID:J
+Ljava/io/StreamCorruptedException;->serialVersionUID:J
+Ljava/io/SyncFailedException;->serialVersionUID:J
+Ljava/io/UTFDataFormatException;->serialVersionUID:J
+Ljava/io/UncheckedIOException;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/io/UncheckedIOException;->serialVersionUID:J
+Ljava/io/UnsupportedEncodingException;->serialVersionUID:J
+Ljava/io/WriteAbortedException;->serialVersionUID:J
+Ljava/lang/AbstractMethodError;->serialVersionUID:J
+Ljava/lang/AbstractStringBuilder;->value:[C
+Ljava/lang/ArithmeticException;->serialVersionUID:J
+Ljava/lang/ArrayIndexOutOfBoundsException;->serialVersionUID:J
+Ljava/lang/ArrayStoreException;->serialVersionUID:J
+Ljava/lang/AssertionError;->serialVersionUID:J
+Ljava/lang/Boolean;->serialVersionUID:J
+Ljava/lang/Boolean;->value:Z
+Ljava/lang/BootstrapMethodError;->serialVersionUID:J
+Ljava/lang/Byte;->serialVersionUID:J
+Ljava/lang/Byte;->value:B
+Ljava/lang/Character;->serialVersionUID:J
+Ljava/lang/Character;->value:C
+Ljava/lang/Class;->accessFlags:I
+Ljava/lang/Class;->dexCache:Ljava/lang/Object;
+Ljava/lang/Class;->dexClassDefIndex:I
+Ljava/lang/Class;->ifTable:[Ljava/lang/Object;
+Ljava/lang/Class;->serialVersionUID:J
+Ljava/lang/ClassCastException;->serialVersionUID:J
+Ljava/lang/ClassCircularityError;->serialVersionUID:J
+Ljava/lang/ClassFormatError;->serialVersionUID:J
+Ljava/lang/ClassLoader;->parent:Ljava/lang/ClassLoader;
+Ljava/lang/ClassNotFoundException;->serialVersionUID:J
+Ljava/lang/CloneNotSupportedException;->serialVersionUID:J
+Ljava/lang/Daemons$Daemon;->isRunning()Z
+Ljava/lang/Daemons$Daemon;->start()V
+Ljava/lang/Daemons$Daemon;->stop()V
+Ljava/lang/Daemons$Daemon;->thread:Ljava/lang/Thread;
+Ljava/lang/Daemons$FinalizerDaemon;->INSTANCE:Ljava/lang/Daemons$FinalizerDaemon;
+Ljava/lang/Daemons$FinalizerDaemon;->finalizingObject:Ljava/lang/Object;
+Ljava/lang/Daemons$FinalizerWatchdogDaemon;->INSTANCE:Ljava/lang/Daemons$FinalizerWatchdogDaemon;
+Ljava/lang/Daemons$ReferenceQueueDaemon;->INSTANCE:Ljava/lang/Daemons$ReferenceQueueDaemon;
+Ljava/lang/Daemons;->MAX_FINALIZE_NANOS:J
+Ljava/lang/Daemons;->requestHeapTrim()V
+Ljava/lang/Daemons;->start()V
+Ljava/lang/Daemons;->stop()V
+Ljava/lang/Double;->serialVersionUID:J
+Ljava/lang/Double;->value:D
+Ljava/lang/Enum;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/lang/Enum;->readObjectNoData()V
+Ljava/lang/EnumConstantNotPresentException;->serialVersionUID:J
+Ljava/lang/Error;->serialVersionUID:J
+Ljava/lang/Exception;->serialVersionUID:J
+Ljava/lang/ExceptionInInitializerError;->serialVersionUID:J
+Ljava/lang/Float;->serialVersionUID:J
+Ljava/lang/Float;->value:F
+Ljava/lang/IllegalAccessError;->serialVersionUID:J
+Ljava/lang/IllegalAccessException;->serialVersionUID:J
+Ljava/lang/IllegalArgumentException;->serialVersionUID:J
+Ljava/lang/IllegalMonitorStateException;->serialVersionUID:J
+Ljava/lang/IllegalStateException;->serialVersionUID:J
+Ljava/lang/IllegalThreadStateException;->serialVersionUID:J
+Ljava/lang/IncompatibleClassChangeError;->serialVersionUID:J
+Ljava/lang/IndexOutOfBoundsException;->serialVersionUID:J
+Ljava/lang/InstantiationError;->serialVersionUID:J
+Ljava/lang/InstantiationException;->serialVersionUID:J
+Ljava/lang/Integer;->serialVersionUID:J
+Ljava/lang/Integer;->value:I
+Ljava/lang/InternalError;->serialVersionUID:J
+Ljava/lang/InterruptedException;->serialVersionUID:J
+Ljava/lang/LinkageError;->serialVersionUID:J
+Ljava/lang/Long;->serialVersionUID:J
+Ljava/lang/Long;->value:J
+Ljava/lang/NegativeArraySizeException;->serialVersionUID:J
+Ljava/lang/NoClassDefFoundError;->serialVersionUID:J
+Ljava/lang/NoSuchFieldError;->serialVersionUID:J
+Ljava/lang/NoSuchFieldException;->serialVersionUID:J
+Ljava/lang/NoSuchMethodError;->serialVersionUID:J
+Ljava/lang/NoSuchMethodException;->serialVersionUID:J
+Ljava/lang/NullPointerException;->serialVersionUID:J
+Ljava/lang/Number;->serialVersionUID:J
+Ljava/lang/NumberFormatException;->serialVersionUID:J
+Ljava/lang/OutOfMemoryError;->serialVersionUID:J
+Ljava/lang/ReflectiveOperationException;->serialVersionUID:J
+Ljava/lang/Runtime;->load(Ljava/lang/String;Ljava/lang/ClassLoader;)V
+Ljava/lang/Runtime;->loadLibrary(Ljava/lang/String;Ljava/lang/ClassLoader;)V
+Ljava/lang/Runtime;->mLibPaths:[Ljava/lang/String;
+Ljava/lang/Runtime;->nativeLoad(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/String;
+Ljava/lang/RuntimeException;->serialVersionUID:J
+Ljava/lang/RuntimePermission;->serialVersionUID:J
+Ljava/lang/SecurityException;->serialVersionUID:J
+Ljava/lang/Short;->serialVersionUID:J
+Ljava/lang/Short;->value:S
+Ljava/lang/StackOverflowError;->serialVersionUID:J
+Ljava/lang/StackTraceElement;->serialVersionUID:J
+Ljava/lang/String$CaseInsensitiveComparator;->readResolve()Ljava/lang/Object;
+Ljava/lang/String$CaseInsensitiveComparator;->serialVersionUID:J
+Ljava/lang/String;-><init>(II[C)V
+Ljava/lang/String;->getCharsNoCheck(II[CI)V
+Ljava/lang/String;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/lang/String;->serialVersionUID:J
+Ljava/lang/StringBuffer;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/lang/StringBuffer;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/lang/StringBuffer;->serialVersionUID:J
+Ljava/lang/StringBuffer;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/lang/StringBuilder;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/lang/StringBuilder;->serialVersionUID:J
+Ljava/lang/StringBuilder;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/lang/StringIndexOutOfBoundsException;->serialVersionUID:J
+Ljava/lang/System;-><init>()V
+Ljava/lang/System;->arraycopy([BI[BII)V
+Ljava/lang/System;->arraycopy([CI[CII)V
+Ljava/lang/System;->arraycopy([II[III)V
+Ljava/lang/Thread;-><init>(Ljava/lang/ThreadGroup;Ljava/lang/String;IZ)V
+Ljava/lang/Thread;->contextClassLoader:Ljava/lang/ClassLoader;
+Ljava/lang/Thread;->daemon:Z
+Ljava/lang/Thread;->dispatchUncaughtException(Ljava/lang/Throwable;)V
+Ljava/lang/Thread;->group:Ljava/lang/ThreadGroup;
+Ljava/lang/Thread;->inheritableThreadLocals:Ljava/lang/ThreadLocal$ThreadLocalMap;
+Ljava/lang/Thread;->lock:Ljava/lang/Object;
+Ljava/lang/Thread;->name:Ljava/lang/String;
+Ljava/lang/Thread;->nativePeer:J
+Ljava/lang/Thread;->parkBlocker:Ljava/lang/Object;
+Ljava/lang/Thread;->priority:I
+Ljava/lang/Thread;->threadLocals:Ljava/lang/ThreadLocal$ThreadLocalMap;
+Ljava/lang/ThreadDeath;->serialVersionUID:J
+Ljava/lang/ThreadGroup;->add(Ljava/lang/Thread;)V
+Ljava/lang/ThreadGroup;->groups:[Ljava/lang/ThreadGroup;
+Ljava/lang/ThreadGroup;->mainThreadGroup:Ljava/lang/ThreadGroup;
+Ljava/lang/ThreadGroup;->name:Ljava/lang/String;
+Ljava/lang/ThreadGroup;->ngroups:I
+Ljava/lang/ThreadGroup;->parent:Ljava/lang/ThreadGroup;
+Ljava/lang/ThreadGroup;->systemThreadGroup:Ljava/lang/ThreadGroup;
+Ljava/lang/ThreadGroup;->threadTerminated(Ljava/lang/Thread;)V
+Ljava/lang/Throwable;->backtrace:Ljava/lang/Object;
+Ljava/lang/Throwable;->cause:Ljava/lang/Throwable;
+Ljava/lang/Throwable;->detailMessage:Ljava/lang/String;
+Ljava/lang/Throwable;->nativeFillInStackTrace()Ljava/lang/Object;
+Ljava/lang/Throwable;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/lang/Throwable;->serialVersionUID:J
+Ljava/lang/Throwable;->stackTrace:[Ljava/lang/StackTraceElement;
+Ljava/lang/Throwable;->suppressedExceptions:Ljava/util/List;
+Ljava/lang/Throwable;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/lang/TypeNotPresentException;->serialVersionUID:J
+Ljava/lang/UnknownError;->serialVersionUID:J
+Ljava/lang/UnsatisfiedLinkError;->serialVersionUID:J
+Ljava/lang/UnsupportedClassVersionError;->serialVersionUID:J
+Ljava/lang/UnsupportedOperationException;->serialVersionUID:J
+Ljava/lang/VerifyError;->serialVersionUID:J
+Ljava/lang/VirtualMachineError;->serialVersionUID:J
+Ljava/lang/Void;-><init>()V
+Ljava/lang/annotation/AnnotationFormatError;->serialVersionUID:J
+Ljava/lang/annotation/AnnotationTypeMismatchException;->serialVersionUID:J
+Ljava/lang/annotation/IncompleteAnnotationException;->serialVersionUID:J
+Ljava/lang/invoke/LambdaConversionException;->serialVersionUID:J
+Ljava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;I)V
+Ljava/lang/invoke/MethodType;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/lang/invoke/MethodType;->readResolve()Ljava/lang/Object;
+Ljava/lang/invoke/MethodType;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/lang/invoke/MethodType;->serialVersionUID:J
+Ljava/lang/invoke/MethodType;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/lang/invoke/WrongMethodTypeException;->serialVersionUID:J
+Ljava/lang/ref/FinalizerReference;->add(Ljava/lang/Object;)V
+Ljava/lang/ref/FinalizerReference;->head:Ljava/lang/ref/FinalizerReference;
+Ljava/lang/ref/FinalizerReference;->next:Ljava/lang/ref/FinalizerReference;
+Ljava/lang/ref/FinalizerReference;->queue:Ljava/lang/ref/ReferenceQueue;
+Ljava/lang/ref/FinalizerReference;->remove(Ljava/lang/ref/FinalizerReference;)V
+Ljava/lang/ref/Reference;->getReferent()Ljava/lang/Object;
+Ljava/lang/ref/Reference;->referent:Ljava/lang/Object;
+Ljava/lang/ref/ReferenceQueue;->add(Ljava/lang/ref/Reference;)V
+Ljava/lang/reflect/Executable;->artMethod:J
+Ljava/lang/reflect/Field;->accessFlags:I
+Ljava/lang/reflect/GenericSignatureFormatError;->serialVersionUID:J
+Ljava/lang/reflect/InvocationTargetException;->serialVersionUID:J
+Ljava/lang/reflect/MalformedParameterizedTypeException;->serialVersionUID:J
+Ljava/lang/reflect/MalformedParametersException;->serialVersionUID:J
+Ljava/lang/reflect/Parameter;-><init>(Ljava/lang/String;ILjava/lang/reflect/Executable;I)V
+Ljava/lang/reflect/Proxy;->invoke(Ljava/lang/reflect/Proxy;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
+Ljava/lang/reflect/Proxy;->serialVersionUID:J
+Ljava/lang/reflect/UndeclaredThrowableException;->serialVersionUID:J
+Ljava/math/BigDecimal;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/math/BigDecimal;->serialVersionUID:J
+Ljava/math/BigDecimal;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/math/BigInteger;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/math/BigInteger;->serialVersionUID:J
+Ljava/math/BigInteger;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/math/MathContext;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/math/MathContext;->serialVersionUID:J
+Ljava/net/Authenticator;->theAuthenticator:Ljava/net/Authenticator;
+Ljava/net/BindException;->serialVersionUID:J
+Ljava/net/ConnectException;->serialVersionUID:J
+Ljava/net/DatagramSocket;->impl:Ljava/net/DatagramSocketImpl;
+Ljava/net/HttpCookie;->assignors:Ljava/util/Map;
+Ljava/net/HttpCookie;->comment:Ljava/lang/String;
+Ljava/net/HttpCookie;->commentURL:Ljava/lang/String;
+Ljava/net/HttpCookie;->domain:Ljava/lang/String;
+Ljava/net/HttpCookie;->header:Ljava/lang/String;
+Ljava/net/HttpCookie;->httpOnly:Z
+Ljava/net/HttpCookie;->maxAge:J
+Ljava/net/HttpCookie;->name:Ljava/lang/String;
+Ljava/net/HttpCookie;->path:Ljava/lang/String;
+Ljava/net/HttpCookie;->portlist:Ljava/lang/String;
+Ljava/net/HttpCookie;->secure:Z
+Ljava/net/HttpCookie;->toDiscard:Z
+Ljava/net/HttpCookie;->tspecials:Ljava/lang/String;
+Ljava/net/HttpCookie;->value:Ljava/lang/String;
+Ljava/net/HttpCookie;->version:I
+Ljava/net/HttpCookie;->whenCreated:J
+Ljava/net/HttpRetryException;->serialVersionUID:J
+Ljava/net/Inet4Address;-><init>()V
+Ljava/net/Inet4Address;->ALL:Ljava/net/InetAddress;
+Ljava/net/Inet4Address;->ANY:Ljava/net/InetAddress;
+Ljava/net/Inet4Address;->serialVersionUID:J
+Ljava/net/Inet4Address;->writeReplace()Ljava/lang/Object;
+Ljava/net/Inet6Address$Inet6AddressHolder;->ipaddress:[B
+Ljava/net/Inet6Address$Inet6AddressHolder;->scope_id:I
+Ljava/net/Inet6Address$Inet6AddressHolder;->scope_id_set:Z
+Ljava/net/Inet6Address$Inet6AddressHolder;->scope_ifname:Ljava/net/NetworkInterface;
+Ljava/net/Inet6Address;-><init>()V
+Ljava/net/Inet6Address;->ANY:Ljava/net/InetAddress;
+Ljava/net/Inet6Address;->holder6:Ljava/net/Inet6Address$Inet6AddressHolder;
+Ljava/net/Inet6Address;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/net/Inet6Address;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/net/Inet6Address;->serialVersionUID:J
+Ljava/net/Inet6Address;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/net/InetAddress$InetAddressHolder;->address:I
+Ljava/net/InetAddress$InetAddressHolder;->family:I
+Ljava/net/InetAddress$InetAddressHolder;->hostName:Ljava/lang/String;
+Ljava/net/InetAddress$InetAddressHolder;->originalHostName:Ljava/lang/String;
+Ljava/net/InetAddress;->clearDnsCache()V
+Ljava/net/InetAddress;->holder()Ljava/net/InetAddress$InetAddressHolder;
+Ljava/net/InetAddress;->holder:Ljava/net/InetAddress$InetAddressHolder;
+Ljava/net/InetAddress;->isNumeric(Ljava/lang/String;)Z
+Ljava/net/InetAddress;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAddress;
+Ljava/net/InetAddress;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/net/InetAddress;->readResolve()Ljava/lang/Object;
+Ljava/net/InetAddress;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/net/InetAddress;->serialVersionUID:J
+Ljava/net/InetAddress;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/net/InetSocketAddress;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/net/InetSocketAddress;->readObjectNoData()V
+Ljava/net/InetSocketAddress;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/net/InetSocketAddress;->serialVersionUID:J
+Ljava/net/InetSocketAddress;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/net/MalformedURLException;->serialVersionUID:J
+Ljava/net/NoRouteToHostException;->serialVersionUID:J
+Ljava/net/PortUnreachableException;->serialVersionUID:J
+Ljava/net/ProtocolException;->serialVersionUID:J
+Ljava/net/Socket;->getFileDescriptor$()Ljava/io/FileDescriptor;
+Ljava/net/Socket;->impl:Ljava/net/SocketImpl;
+Ljava/net/SocketAddress;->serialVersionUID:J
+Ljava/net/SocketException;->serialVersionUID:J
+Ljava/net/SocketImpl;->serverSocket:Ljava/net/ServerSocket;
+Ljava/net/SocketImpl;->socket:Ljava/net/Socket;
+Ljava/net/SocketTimeoutException;->serialVersionUID:J
+Ljava/net/URI;->fragment:Ljava/lang/String;
+Ljava/net/URI;->host:Ljava/lang/String;
+Ljava/net/URI;->port:I
+Ljava/net/URI;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/net/URI;->serialVersionUID:J
+Ljava/net/URI;->string:Ljava/lang/String;
+Ljava/net/URI;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/net/URISyntaxException;->serialVersionUID:J
+Ljava/net/URL;->handler:Ljava/net/URLStreamHandler;
+Ljava/net/URL;->handlers:Ljava/util/Hashtable;
+Ljava/net/URL;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/net/URL;->readResolve()Ljava/lang/Object;
+Ljava/net/URL;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/net/URL;->serialVersionUID:J
+Ljava/net/URL;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/net/UnknownHostException;->serialVersionUID:J
+Ljava/net/UnknownServiceException;->serialVersionUID:J
+Ljava/nio/Buffer;->_elementSizeShift:I
+Ljava/nio/Buffer;->address:J
+Ljava/nio/Buffer;->capacity:I
+Ljava/nio/Buffer;->limit:I
+Ljava/nio/Buffer;->position:I
+Ljava/nio/BufferOverflowException;->serialVersionUID:J
+Ljava/nio/BufferUnderflowException;->serialVersionUID:J
+Ljava/nio/ByteBuffer;->hb:[B
+Ljava/nio/ByteBuffer;->isReadOnly:Z
+Ljava/nio/ByteBuffer;->offset:I
+Ljava/nio/DirectByteBuffer;-><init>(JI)V
+Ljava/nio/InvalidMarkException;->serialVersionUID:J
+Ljava/nio/NIOAccess;->getBaseArray(Ljava/nio/Buffer;)Ljava/lang/Object;
+Ljava/nio/NIOAccess;->getBaseArrayOffset(Ljava/nio/Buffer;)I
+Ljava/nio/NIOAccess;->getBasePointer(Ljava/nio/Buffer;)J
+Ljava/nio/ReadOnlyBufferException;->serialVersionUID:J
+Ljava/nio/channels/AcceptPendingException;->serialVersionUID:J
+Ljava/nio/channels/AlreadyBoundException;->serialVersionUID:J
+Ljava/nio/channels/AlreadyConnectedException;->serialVersionUID:J
+Ljava/nio/channels/AsynchronousCloseException;->serialVersionUID:J
+Ljava/nio/channels/CancelledKeyException;->serialVersionUID:J
+Ljava/nio/channels/ClosedByInterruptException;->serialVersionUID:J
+Ljava/nio/channels/ClosedChannelException;->serialVersionUID:J
+Ljava/nio/channels/ClosedSelectorException;->serialVersionUID:J
+Ljava/nio/channels/ConnectionPendingException;->serialVersionUID:J
+Ljava/nio/channels/FileLockInterruptionException;->serialVersionUID:J
+Ljava/nio/channels/IllegalBlockingModeException;->serialVersionUID:J
+Ljava/nio/channels/IllegalChannelGroupException;->serialVersionUID:J
+Ljava/nio/channels/IllegalSelectorException;->serialVersionUID:J
+Ljava/nio/channels/InterruptedByTimeoutException;->serialVersionUID:J
+Ljava/nio/channels/NoConnectionPendingException;->serialVersionUID:J
+Ljava/nio/channels/NonReadableChannelException;->serialVersionUID:J
+Ljava/nio/channels/NonWritableChannelException;->serialVersionUID:J
+Ljava/nio/channels/NotYetBoundException;->serialVersionUID:J
+Ljava/nio/channels/NotYetConnectedException;->serialVersionUID:J
+Ljava/nio/channels/OverlappingFileLockException;->serialVersionUID:J
+Ljava/nio/channels/ReadPendingException;->serialVersionUID:J
+Ljava/nio/channels/ShutdownChannelGroupException;->serialVersionUID:J
+Ljava/nio/channels/UnresolvedAddressException;->serialVersionUID:J
+Ljava/nio/channels/UnsupportedAddressTypeException;->serialVersionUID:J
+Ljava/nio/channels/WritePendingException;->serialVersionUID:J
+Ljava/nio/charset/CharacterCodingException;->serialVersionUID:J
+Ljava/nio/charset/CharsetEncoder;->canEncode(Ljava/nio/CharBuffer;)Z
+Ljava/nio/charset/CoderMalfunctionError;->serialVersionUID:J
+Ljava/nio/charset/IllegalCharsetNameException;->serialVersionUID:J
+Ljava/nio/charset/MalformedInputException;->serialVersionUID:J
+Ljava/nio/charset/UnmappableCharacterException;->serialVersionUID:J
+Ljava/nio/charset/UnsupportedCharsetException;->serialVersionUID:J
+Ljava/nio/file/AccessDeniedException;->serialVersionUID:J
+Ljava/nio/file/AtomicMoveNotSupportedException;->serialVersionUID:J
+Ljava/nio/file/ClosedDirectoryStreamException;->serialVersionUID:J
+Ljava/nio/file/ClosedFileSystemException;->serialVersionUID:J
+Ljava/nio/file/ClosedWatchServiceException;->serialVersionUID:J
+Ljava/nio/file/DirectoryIteratorException;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/nio/file/DirectoryIteratorException;->serialVersionUID:J
+Ljava/nio/file/DirectoryNotEmptyException;->serialVersionUID:J
+Ljava/nio/file/FileAlreadyExistsException;->serialVersionUID:J
+Ljava/nio/file/FileSystemAlreadyExistsException;->serialVersionUID:J
+Ljava/nio/file/FileSystemException;->serialVersionUID:J
+Ljava/nio/file/FileSystemLoopException;->serialVersionUID:J
+Ljava/nio/file/FileSystemNotFoundException;->serialVersionUID:J
+Ljava/nio/file/InvalidPathException;->serialVersionUID:J
+Ljava/nio/file/LinkPermission;->serialVersionUID:J
+Ljava/nio/file/NoSuchFileException;->serialVersionUID:J
+Ljava/nio/file/NotDirectoryException;->serialVersionUID:J
+Ljava/nio/file/NotLinkException;->serialVersionUID:J
+Ljava/nio/file/ProviderMismatchException;->serialVersionUID:J
+Ljava/nio/file/ProviderNotFoundException;->serialVersionUID:J
+Ljava/nio/file/ReadOnlyFileSystemException;->serialVersionUID:J
+Ljava/nio/file/attribute/UserPrincipalNotFoundException;->serialVersionUID:J
+Ljava/security/AccessControlException;->serialVersionUID:J
+Ljava/security/CodeSigner;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/security/CodeSigner;->serialVersionUID:J
+Ljava/security/DigestException;->serialVersionUID:J
+Ljava/security/GeneralSecurityException;->serialVersionUID:J
+Ljava/security/GuardedObject;->serialVersionUID:J
+Ljava/security/GuardedObject;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/security/Identity;->serialVersionUID:J
+Ljava/security/IdentityScope;->serialVersionUID:J
+Ljava/security/InvalidAlgorithmParameterException;->serialVersionUID:J
+Ljava/security/InvalidKeyException;->serialVersionUID:J
+Ljava/security/InvalidParameterException;->serialVersionUID:J
+Ljava/security/KeyException;->serialVersionUID:J
+Ljava/security/KeyManagementException;->serialVersionUID:J
+Ljava/security/KeyPair;->serialVersionUID:J
+Ljava/security/KeyRep;->serialVersionUID:J
+Ljava/security/KeyStoreException;->serialVersionUID:J
+Ljava/security/NoSuchAlgorithmException;->serialVersionUID:J
+Ljava/security/NoSuchProviderException;->serialVersionUID:J
+Ljava/security/PrivilegedActionException;->serialVersionUID:J
+Ljava/security/Provider;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/security/Provider;->serialVersionUID:J
+Ljava/security/ProviderException;->serialVersionUID:J
+Ljava/security/SecureRandom;->serialVersionUID:J
+Ljava/security/SecureRandomSpi;->serialVersionUID:J
+Ljava/security/SignatureException;->serialVersionUID:J
+Ljava/security/SignedObject;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/security/SignedObject;->serialVersionUID:J
+Ljava/security/Signer;->serialVersionUID:J
+Ljava/security/Timestamp;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/security/Timestamp;->serialVersionUID:J
+Ljava/security/UnrecoverableEntryException;->serialVersionUID:J
+Ljava/security/UnrecoverableKeyException;->serialVersionUID:J
+Ljava/security/acl/AclNotFoundException;->serialVersionUID:J
+Ljava/security/acl/LastOwnerException;->serialVersionUID:J
+Ljava/security/acl/NotOwnerException;->serialVersionUID:J
+Ljava/security/cert/CRLException;->serialVersionUID:J
+Ljava/security/cert/CertPath$CertPathRep;->serialVersionUID:J
+Ljava/security/cert/CertPath;->serialVersionUID:J
+Ljava/security/cert/CertPathBuilderException;->serialVersionUID:J
+Ljava/security/cert/CertPathValidatorException;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/security/cert/CertPathValidatorException;->serialVersionUID:J
+Ljava/security/cert/CertStoreException;->serialVersionUID:J
+Ljava/security/cert/Certificate$CertificateRep;->serialVersionUID:J
+Ljava/security/cert/Certificate;->serialVersionUID:J
+Ljava/security/cert/CertificateEncodingException;->serialVersionUID:J
+Ljava/security/cert/CertificateException;->serialVersionUID:J
+Ljava/security/cert/CertificateExpiredException;->serialVersionUID:J
+Ljava/security/cert/CertificateNotYetValidException;->serialVersionUID:J
+Ljava/security/cert/CertificateParsingException;->serialVersionUID:J
+Ljava/security/cert/CertificateRevokedException;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/security/cert/CertificateRevokedException;->serialVersionUID:J
+Ljava/security/cert/CertificateRevokedException;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/security/cert/X509Certificate;->serialVersionUID:J
+Ljava/security/spec/ECParameterSpec;->getCurveName()Ljava/lang/String;
+Ljava/security/spec/ECParameterSpec;->setCurveName(Ljava/lang/String;)V
+Ljava/security/spec/InvalidKeySpecException;->serialVersionUID:J
+Ljava/security/spec/InvalidParameterSpecException;->serialVersionUID:J
+Ljava/sql/BatchUpdateException;->serialVersionUID:J
+Ljava/sql/DataTruncation;->serialVersionUID:J
+Ljava/sql/Date;->serialVersionUID:J
+Ljava/sql/SQLClientInfoException;->serialVersionUID:J
+Ljava/sql/SQLDataException;->serialVersionUID:J
+Ljava/sql/SQLException;->serialVersionUID:J
+Ljava/sql/SQLFeatureNotSupportedException;->serialVersionUID:J
+Ljava/sql/SQLIntegrityConstraintViolationException;->serialVersionUID:J
+Ljava/sql/SQLInvalidAuthorizationSpecException;->serialVersionUID:J
+Ljava/sql/SQLNonTransientConnectionException;->serialVersionUID:J
+Ljava/sql/SQLNonTransientException;->serialVersionUID:J
+Ljava/sql/SQLRecoverableException;->serialVersionUID:J
+Ljava/sql/SQLSyntaxErrorException;->serialVersionUID:J
+Ljava/sql/SQLTimeoutException;->serialVersionUID:J
+Ljava/sql/SQLTransactionRollbackException;->serialVersionUID:J
+Ljava/sql/SQLTransientConnectionException;->serialVersionUID:J
+Ljava/sql/SQLTransientException;->serialVersionUID:J
+Ljava/sql/SQLWarning;->serialVersionUID:J
+Ljava/sql/Time;->serialVersionUID:J
+Ljava/sql/Timestamp;->serialVersionUID:J
+Ljava/text/AttributedCharacterIterator$Attribute;->serialVersionUID:J
+Ljava/text/ChoiceFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/text/ChoiceFormat;->serialVersionUID:J
+Ljava/text/DateFormat$Field;->serialVersionUID:J
+Ljava/text/DateFormat;->is24Hour:Ljava/lang/Boolean;
+Ljava/text/DateFormat;->serialVersionUID:J
+Ljava/text/DateFormatSymbols;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/text/DateFormatSymbols;->serialVersionUID:J
+Ljava/text/DateFormatSymbols;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/text/DecimalFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/text/DecimalFormat;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/text/DecimalFormat;->serialVersionUID:J
+Ljava/text/DecimalFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/text/DecimalFormatSymbols;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/text/DecimalFormatSymbols;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/text/DecimalFormatSymbols;->serialVersionUID:J
+Ljava/text/DecimalFormatSymbols;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/text/Format$Field;->serialVersionUID:J
+Ljava/text/Format;->serialVersionUID:J
+Ljava/text/MessageFormat$Field;->serialVersionUID:J
+Ljava/text/MessageFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/text/MessageFormat;->serialVersionUID:J
+Ljava/text/NumberFormat$Field;->serialVersionUID:J
+Ljava/text/NumberFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/text/NumberFormat;->serialVersionUID:J
+Ljava/text/NumberFormat;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/text/ParseException;->serialVersionUID:J
+Ljava/text/SimpleDateFormat;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/text/SimpleDateFormat;->serialVersionUID:J
+Ljava/time/Clock$FixedClock;->serialVersionUID:J
+Ljava/time/Clock$OffsetClock;->serialVersionUID:J
+Ljava/time/Clock$SystemClock;->serialVersionUID:J
+Ljava/time/Clock$TickClock;->serialVersionUID:J
+Ljava/time/DateTimeException;->serialVersionUID:J
+Ljava/time/Duration;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/Duration;->serialVersionUID:J
+Ljava/time/Duration;->toSeconds()Ljava/math/BigDecimal;
+Ljava/time/Duration;->writeReplace()Ljava/lang/Object;
+Ljava/time/Instant;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/Instant;->serialVersionUID:J
+Ljava/time/Instant;->writeReplace()Ljava/lang/Object;
+Ljava/time/LocalDate;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/LocalDate;->serialVersionUID:J
+Ljava/time/LocalDate;->writeReplace()Ljava/lang/Object;
+Ljava/time/LocalDateTime;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/LocalDateTime;->serialVersionUID:J
+Ljava/time/LocalDateTime;->writeReplace()Ljava/lang/Object;
+Ljava/time/LocalTime;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/LocalTime;->serialVersionUID:J
+Ljava/time/LocalTime;->writeReplace()Ljava/lang/Object;
+Ljava/time/MonthDay;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/MonthDay;->serialVersionUID:J
+Ljava/time/MonthDay;->writeReplace()Ljava/lang/Object;
+Ljava/time/OffsetDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)V
+Ljava/time/OffsetDateTime;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/OffsetDateTime;->serialVersionUID:J
+Ljava/time/OffsetDateTime;->writeReplace()Ljava/lang/Object;
+Ljava/time/OffsetTime;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/OffsetTime;->serialVersionUID:J
+Ljava/time/OffsetTime;->writeReplace()Ljava/lang/Object;
+Ljava/time/Period;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/Period;->serialVersionUID:J
+Ljava/time/Period;->writeReplace()Ljava/lang/Object;
+Ljava/time/Year;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/Year;->serialVersionUID:J
+Ljava/time/Year;->writeReplace()Ljava/lang/Object;
+Ljava/time/YearMonth;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/YearMonth;->serialVersionUID:J
+Ljava/time/YearMonth;->writeReplace()Ljava/lang/Object;
+Ljava/time/ZoneId;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/ZoneId;->serialVersionUID:J
+Ljava/time/ZoneId;->writeReplace()Ljava/lang/Object;
+Ljava/time/ZoneOffset;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/ZoneOffset;->serialVersionUID:J
+Ljava/time/ZoneOffset;->writeReplace()Ljava/lang/Object;
+Ljava/time/ZonedDateTime;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/ZonedDateTime;->serialVersionUID:J
+Ljava/time/ZonedDateTime;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/AbstractChronology;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/AbstractChronology;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/ChronoLocalDateImpl;->serialVersionUID:J
+Ljava/time/chrono/HijrahChronology;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/HijrahChronology;->serialVersionUID:J
+Ljava/time/chrono/HijrahChronology;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/HijrahDate;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/HijrahDate;->serialVersionUID:J
+Ljava/time/chrono/HijrahDate;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/IsoChronology;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/IsoChronology;->serialVersionUID:J
+Ljava/time/chrono/IsoChronology;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/JapaneseChronology;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/JapaneseChronology;->serialVersionUID:J
+Ljava/time/chrono/JapaneseChronology;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/JapaneseDate;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/JapaneseDate;->serialVersionUID:J
+Ljava/time/chrono/JapaneseDate;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/JapaneseEra;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/JapaneseEra;->serialVersionUID:J
+Ljava/time/chrono/JapaneseEra;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/MinguoChronology;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/MinguoChronology;->serialVersionUID:J
+Ljava/time/chrono/MinguoChronology;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/MinguoDate;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/MinguoDate;->serialVersionUID:J
+Ljava/time/chrono/MinguoDate;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/ThaiBuddhistChronology;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/ThaiBuddhistChronology;->serialVersionUID:J
+Ljava/time/chrono/ThaiBuddhistChronology;->writeReplace()Ljava/lang/Object;
+Ljava/time/chrono/ThaiBuddhistDate;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/chrono/ThaiBuddhistDate;->serialVersionUID:J
+Ljava/time/chrono/ThaiBuddhistDate;->writeReplace()Ljava/lang/Object;
+Ljava/time/format/DateTimeParseException;->serialVersionUID:J
+Ljava/time/temporal/JulianFields$Field;->serialVersionUID:J
+Ljava/time/temporal/UnsupportedTemporalTypeException;->serialVersionUID:J
+Ljava/time/temporal/ValueRange;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/temporal/ValueRange;->serialVersionUID:J
+Ljava/time/temporal/WeekFields;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/temporal/WeekFields;->readResolve()Ljava/lang/Object;
+Ljava/time/temporal/WeekFields;->serialVersionUID:J
+Ljava/time/zone/ZoneOffsetTransition;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/zone/ZoneOffsetTransition;->serialVersionUID:J
+Ljava/time/zone/ZoneOffsetTransition;->writeReplace()Ljava/lang/Object;
+Ljava/time/zone/ZoneOffsetTransitionRule;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/zone/ZoneOffsetTransitionRule;->serialVersionUID:J
+Ljava/time/zone/ZoneOffsetTransitionRule;->writeReplace()Ljava/lang/Object;
+Ljava/time/zone/ZoneRules;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/time/zone/ZoneRules;->serialVersionUID:J
+Ljava/time/zone/ZoneRules;->writeReplace()Ljava/lang/Object;
+Ljava/time/zone/ZoneRulesException;->serialVersionUID:J
+Ljava/util/AbstractMap$SimpleEntry;->serialVersionUID:J
+Ljava/util/AbstractMap$SimpleImmutableEntry;->serialVersionUID:J
+Ljava/util/ArrayDeque;->elements:[Ljava/lang/Object;
+Ljava/util/ArrayDeque;->head:I
+Ljava/util/ArrayDeque;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/ArrayDeque;->serialVersionUID:J
+Ljava/util/ArrayDeque;->tail:I
+Ljava/util/ArrayDeque;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/ArrayList$SubList;->parent:Ljava/util/AbstractList;
+Ljava/util/ArrayList$SubList;->parentOffset:I
+Ljava/util/ArrayList$SubList;->size:I
+Ljava/util/ArrayList;->elementData:[Ljava/lang/Object;
+Ljava/util/ArrayList;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/ArrayList;->serialVersionUID:J
+Ljava/util/ArrayList;->size:I
+Ljava/util/ArrayList;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Arrays$ArrayList;->a:[Ljava/lang/Object;
+Ljava/util/Arrays$ArrayList;->serialVersionUID:J
+Ljava/util/BitSet;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/BitSet;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/util/BitSet;->serialVersionUID:J
+Ljava/util/BitSet;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Calendar;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/Calendar;->serialVersionUID:J
+Ljava/util/Calendar;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Calendar;->zone:Ljava/util/TimeZone;
+Ljava/util/Collections$AsLIFOQueue;->serialVersionUID:J
+Ljava/util/Collections$CheckedCollection;->serialVersionUID:J
+Ljava/util/Collections$CheckedList;->serialVersionUID:J
+Ljava/util/Collections$CheckedMap;->serialVersionUID:J
+Ljava/util/Collections$CheckedNavigableMap;->serialVersionUID:J
+Ljava/util/Collections$CheckedNavigableSet;->serialVersionUID:J
+Ljava/util/Collections$CheckedQueue;->serialVersionUID:J
+Ljava/util/Collections$CheckedRandomAccessList;->serialVersionUID:J
+Ljava/util/Collections$CheckedSet;->serialVersionUID:J
+Ljava/util/Collections$CheckedSortedMap;->serialVersionUID:J
+Ljava/util/Collections$CheckedSortedSet;->serialVersionUID:J
+Ljava/util/Collections$CopiesList;->serialVersionUID:J
+Ljava/util/Collections$EmptyList;-><init>()V
+Ljava/util/Collections$EmptyList;->readResolve()Ljava/lang/Object;
+Ljava/util/Collections$EmptyList;->serialVersionUID:J
+Ljava/util/Collections$EmptyMap;->readResolve()Ljava/lang/Object;
+Ljava/util/Collections$EmptyMap;->serialVersionUID:J
+Ljava/util/Collections$EmptySet;->readResolve()Ljava/lang/Object;
+Ljava/util/Collections$EmptySet;->serialVersionUID:J
+Ljava/util/Collections$ReverseComparator2;->serialVersionUID:J
+Ljava/util/Collections$ReverseComparator;->readResolve()Ljava/lang/Object;
+Ljava/util/Collections$ReverseComparator;->serialVersionUID:J
+Ljava/util/Collections$SetFromMap;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/Collections$SetFromMap;->serialVersionUID:J
+Ljava/util/Collections$SingletonList;->serialVersionUID:J
+Ljava/util/Collections$SingletonMap;->serialVersionUID:J
+Ljava/util/Collections$SingletonSet;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedCollection;->c:Ljava/util/Collection;
+Ljava/util/Collections$SynchronizedCollection;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedCollection;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Collections$SynchronizedList;->readResolve()Ljava/lang/Object;
+Ljava/util/Collections$SynchronizedList;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedMap;->m:Ljava/util/Map;
+Ljava/util/Collections$SynchronizedMap;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedMap;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Collections$SynchronizedNavigableMap;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedNavigableSet;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedRandomAccessList;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedRandomAccessList;->writeReplace()Ljava/lang/Object;
+Ljava/util/Collections$SynchronizedSet;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedSortedMap;->serialVersionUID:J
+Ljava/util/Collections$SynchronizedSortedSet;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableCollection;->c:Ljava/util/Collection;
+Ljava/util/Collections$UnmodifiableCollection;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableList;->readResolve()Ljava/lang/Object;
+Ljava/util/Collections$UnmodifiableList;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableMap;->m:Ljava/util/Map;
+Ljava/util/Collections$UnmodifiableMap;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableNavigableMap$EmptyNavigableMap;->readResolve()Ljava/lang/Object;
+Ljava/util/Collections$UnmodifiableNavigableMap$EmptyNavigableMap;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableNavigableMap;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableNavigableSet$EmptyNavigableSet;->readResolve()Ljava/lang/Object;
+Ljava/util/Collections$UnmodifiableNavigableSet$EmptyNavigableSet;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableNavigableSet;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableRandomAccessList;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableRandomAccessList;->writeReplace()Ljava/lang/Object;
+Ljava/util/Collections$UnmodifiableSet;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableSortedMap;->serialVersionUID:J
+Ljava/util/Collections$UnmodifiableSortedSet;->serialVersionUID:J
+Ljava/util/ConcurrentModificationException;->serialVersionUID:J
+Ljava/util/Currency;->readResolve()Ljava/lang/Object;
+Ljava/util/Currency;->serialVersionUID:J
+Ljava/util/Date;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/Date;->serialVersionUID:J
+Ljava/util/Date;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/DuplicateFormatFlagsException;->serialVersionUID:J
+Ljava/util/EmptyStackException;->serialVersionUID:J
+Ljava/util/EnumMap;->keyType:Ljava/lang/Class;
+Ljava/util/EnumMap;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/EnumMap;->serialVersionUID:J
+Ljava/util/EnumMap;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/EnumSet$SerializationProxy;->readResolve()Ljava/lang/Object;
+Ljava/util/EnumSet$SerializationProxy;->serialVersionUID:J
+Ljava/util/EnumSet;->elementType:Ljava/lang/Class;
+Ljava/util/EnumSet;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/EnumSet;->writeReplace()Ljava/lang/Object;
+Ljava/util/EventObject;->serialVersionUID:J
+Ljava/util/FormatFlagsConversionMismatchException;->serialVersionUID:J
+Ljava/util/FormatterClosedException;->serialVersionUID:J
+Ljava/util/GregorianCalendar;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/GregorianCalendar;->serialVersionUID:J
+Ljava/util/HashMap$HashIterator;->hasNext()Z
+Ljava/util/HashMap;->modCount:I
+Ljava/util/HashMap;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/HashMap;->serialVersionUID:J
+Ljava/util/HashMap;->table:[Ljava/util/HashMap$Node;
+Ljava/util/HashMap;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/HashSet;->map:Ljava/util/HashMap;
+Ljava/util/HashSet;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/HashSet;->serialVersionUID:J
+Ljava/util/HashSet;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Hashtable;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/Hashtable;->serialVersionUID:J
+Ljava/util/Hashtable;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/IdentityHashMap;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/IdentityHashMap;->serialVersionUID:J
+Ljava/util/IdentityHashMap;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/IllegalFormatCodePointException;->serialVersionUID:J
+Ljava/util/IllegalFormatConversionException;->serialVersionUID:J
+Ljava/util/IllegalFormatException;->serialVersionUID:J
+Ljava/util/IllegalFormatFlagsException;->serialVersionUID:J
+Ljava/util/IllegalFormatPrecisionException;->serialVersionUID:J
+Ljava/util/IllegalFormatWidthException;->serialVersionUID:J
+Ljava/util/IllformedLocaleException;->serialVersionUID:J
+Ljava/util/InputMismatchException;->serialVersionUID:J
+Ljava/util/InvalidPropertiesFormatException;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/InvalidPropertiesFormatException;->serialVersionUID:J
+Ljava/util/InvalidPropertiesFormatException;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/LinkedHashMap$LinkedHashIterator;->hasNext()Z
+Ljava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry;
+Ljava/util/LinkedHashMap;->serialVersionUID:J
+Ljava/util/LinkedHashSet;->serialVersionUID:J
+Ljava/util/LinkedList;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/LinkedList;->serialVersionUID:J
+Ljava/util/LinkedList;->size:I
+Ljava/util/LinkedList;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Locale;->createConstant(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale;
+Ljava/util/Locale;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/Locale;->readResolve()Ljava/lang/Object;
+Ljava/util/Locale;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/util/Locale;->serialVersionUID:J
+Ljava/util/Locale;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/MissingFormatArgumentException;->serialVersionUID:J
+Ljava/util/MissingFormatWidthException;->serialVersionUID:J
+Ljava/util/MissingResourceException;->serialVersionUID:J
+Ljava/util/NoSuchElementException;->serialVersionUID:J
+Ljava/util/PriorityQueue;->modCount:I
+Ljava/util/PriorityQueue;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/PriorityQueue;->serialVersionUID:J
+Ljava/util/PriorityQueue;->size:I
+Ljava/util/PriorityQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Properties;->serialVersionUID:J
+Ljava/util/Random;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/Random;->seedUniquifier()J
+Ljava/util/Random;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/util/Random;->serialVersionUID:J
+Ljava/util/Random;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/ServiceConfigurationError;->serialVersionUID:J
+Ljava/util/SimpleTimeZone;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/SimpleTimeZone;->serialVersionUID:J
+Ljava/util/SimpleTimeZone;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/Stack;->serialVersionUID:J
+Ljava/util/TimeZone;->serialVersionUID:J
+Ljava/util/TooManyListenersException;->serialVersionUID:J
+Ljava/util/TreeMap$AscendingSubMap;->serialVersionUID:J
+Ljava/util/TreeMap$DescendingSubMap;->serialVersionUID:J
+Ljava/util/TreeMap$NavigableSubMap;->serialVersionUID:J
+Ljava/util/TreeMap$SubMap;->readResolve()Ljava/lang/Object;
+Ljava/util/TreeMap$SubMap;->serialVersionUID:J
+Ljava/util/TreeMap;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/TreeMap;->serialVersionUID:J
+Ljava/util/TreeMap;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/TreeSet;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/TreeSet;->serialVersionUID:J
+Ljava/util/TreeSet;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/UUID;->leastSigBits:J
+Ljava/util/UUID;->mostSigBits:J
+Ljava/util/UUID;->serialVersionUID:J
+Ljava/util/UnknownFormatConversionException;->serialVersionUID:J
+Ljava/util/UnknownFormatFlagsException;->serialVersionUID:J
+Ljava/util/Vector;->elementData(I)Ljava/lang/Object;
+Ljava/util/Vector;->serialVersionUID:J
+Ljava/util/Vector;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/ArrayBlockingQueue;->serialVersionUID:J
+Ljava/util/concurrent/BrokenBarrierException;->serialVersionUID:J
+Ljava/util/concurrent/CancellationException;->serialVersionUID:J
+Ljava/util/concurrent/CompletionException;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->hasMoreElements()Z
+Ljava/util/concurrent/ConcurrentHashMap$CollectionView;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentHashMap$KeySetView;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentHashMap$Segment;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentHashMap$ValuesView;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentHashMap;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/ConcurrentHashMap;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/util/concurrent/ConcurrentHashMap;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentHashMap;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/ConcurrentLinkedDeque;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/ConcurrentLinkedDeque;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentLinkedDeque;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/ConcurrentLinkedQueue;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/ConcurrentLinkedQueue;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentLinkedQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/ConcurrentSkipListMap$SubMap;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentSkipListMap;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/ConcurrentSkipListMap;->serialVersionUID:J
+Ljava/util/concurrent/ConcurrentSkipListMap;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/ConcurrentSkipListSet;->serialVersionUID:J
+Ljava/util/concurrent/CopyOnWriteArrayList;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/CopyOnWriteArrayList;->serialVersionUID:J
+Ljava/util/concurrent/CopyOnWriteArrayList;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/CopyOnWriteArraySet;->al:Ljava/util/concurrent/CopyOnWriteArrayList;
+Ljava/util/concurrent/CopyOnWriteArraySet;->serialVersionUID:J
+Ljava/util/concurrent/CountDownLatch$Sync;->serialVersionUID:J
+Ljava/util/concurrent/CountedCompleter;->serialVersionUID:J
+Ljava/util/concurrent/ExecutionException;->serialVersionUID:J
+Ljava/util/concurrent/Executors$RunnableAdapter;->task:Ljava/lang/Runnable;
+Ljava/util/concurrent/ForkJoinPool$AuxState;->serialVersionUID:J
+Ljava/util/concurrent/ForkJoinPool$EmptyTask;->serialVersionUID:J
+Ljava/util/concurrent/ForkJoinTask$AdaptedCallable;->serialVersionUID:J
+Ljava/util/concurrent/ForkJoinTask$AdaptedRunnable;->serialVersionUID:J
+Ljava/util/concurrent/ForkJoinTask$AdaptedRunnableAction;->serialVersionUID:J
+Ljava/util/concurrent/ForkJoinTask$RunnableExecuteAction;->serialVersionUID:J
+Ljava/util/concurrent/ForkJoinTask;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/ForkJoinTask;->serialVersionUID:J
+Ljava/util/concurrent/ForkJoinTask;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/FutureTask;->EXCEPTIONAL:I
+Ljava/util/concurrent/FutureTask;->callable:Ljava/util/concurrent/Callable;
+Ljava/util/concurrent/FutureTask;->outcome:Ljava/lang/Object;
+Ljava/util/concurrent/FutureTask;->state:I
+Ljava/util/concurrent/LinkedBlockingDeque;->first:Ljava/util/concurrent/LinkedBlockingDeque$Node;
+Ljava/util/concurrent/LinkedBlockingDeque;->lock:Ljava/util/concurrent/locks/ReentrantLock;
+Ljava/util/concurrent/LinkedBlockingDeque;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/LinkedBlockingDeque;->serialVersionUID:J
+Ljava/util/concurrent/LinkedBlockingDeque;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/LinkedBlockingQueue;->capacity:I
+Ljava/util/concurrent/LinkedBlockingQueue;->head:Ljava/util/concurrent/LinkedBlockingQueue$Node;
+Ljava/util/concurrent/LinkedBlockingQueue;->putLock:Ljava/util/concurrent/locks/ReentrantLock;
+Ljava/util/concurrent/LinkedBlockingQueue;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/LinkedBlockingQueue;->serialVersionUID:J
+Ljava/util/concurrent/LinkedBlockingQueue;->takeLock:Ljava/util/concurrent/locks/ReentrantLock;
+Ljava/util/concurrent/LinkedBlockingQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/LinkedTransferQueue$Node;->serialVersionUID:J
+Ljava/util/concurrent/LinkedTransferQueue;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/LinkedTransferQueue;->serialVersionUID:J
+Ljava/util/concurrent/LinkedTransferQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/PriorityBlockingQueue;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/PriorityBlockingQueue;->serialVersionUID:J
+Ljava/util/concurrent/PriorityBlockingQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/RecursiveAction;->serialVersionUID:J
+Ljava/util/concurrent/RecursiveTask;->serialVersionUID:J
+Ljava/util/concurrent/RejectedExecutionException;->serialVersionUID:J
+Ljava/util/concurrent/Semaphore$FairSync;->serialVersionUID:J
+Ljava/util/concurrent/Semaphore$NonfairSync;->serialVersionUID:J
+Ljava/util/concurrent/Semaphore$Sync;->serialVersionUID:J
+Ljava/util/concurrent/Semaphore;->serialVersionUID:J
+Ljava/util/concurrent/SynchronousQueue$FifoWaitQueue;->serialVersionUID:J
+Ljava/util/concurrent/SynchronousQueue$LifoWaitQueue;->serialVersionUID:J
+Ljava/util/concurrent/SynchronousQueue;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/SynchronousQueue;->serialVersionUID:J
+Ljava/util/concurrent/SynchronousQueue;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/ThreadLocalRandom;->readResolve()Ljava/lang/Object;
+Ljava/util/concurrent/ThreadLocalRandom;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljava/util/concurrent/ThreadLocalRandom;->serialVersionUID:J
+Ljava/util/concurrent/ThreadLocalRandom;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/concurrent/ThreadPoolExecutor$Worker;->serialVersionUID:J
+Ljava/util/concurrent/ThreadPoolExecutor;->allowCoreThreadTimeOut:Z
+Ljava/util/concurrent/TimeoutException;->serialVersionUID:J
+Ljava/util/concurrent/atomic/AtomicBoolean;->serialVersionUID:J
+Ljava/util/concurrent/atomic/AtomicInteger;->serialVersionUID:J
+Ljava/util/concurrent/atomic/AtomicInteger;->value:I
+Ljava/util/concurrent/atomic/AtomicIntegerArray;->serialVersionUID:J
+Ljava/util/concurrent/atomic/AtomicLong;->serialVersionUID:J
+Ljava/util/concurrent/atomic/AtomicLongArray;->serialVersionUID:J
+Ljava/util/concurrent/atomic/AtomicReference;->serialVersionUID:J
+Ljava/util/concurrent/atomic/AtomicReferenceArray;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/atomic/AtomicReferenceArray;->serialVersionUID:J
+Ljava/util/concurrent/atomic/DoubleAccumulator$SerializationProxy;->readResolve()Ljava/lang/Object;
+Ljava/util/concurrent/atomic/DoubleAccumulator$SerializationProxy;->serialVersionUID:J
+Ljava/util/concurrent/atomic/DoubleAccumulator;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/atomic/DoubleAccumulator;->serialVersionUID:J
+Ljava/util/concurrent/atomic/DoubleAccumulator;->writeReplace()Ljava/lang/Object;
+Ljava/util/concurrent/atomic/DoubleAdder$SerializationProxy;->readResolve()Ljava/lang/Object;
+Ljava/util/concurrent/atomic/DoubleAdder$SerializationProxy;->serialVersionUID:J
+Ljava/util/concurrent/atomic/DoubleAdder;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/atomic/DoubleAdder;->serialVersionUID:J
+Ljava/util/concurrent/atomic/DoubleAdder;->writeReplace()Ljava/lang/Object;
+Ljava/util/concurrent/atomic/LongAccumulator$SerializationProxy;->readResolve()Ljava/lang/Object;
+Ljava/util/concurrent/atomic/LongAccumulator$SerializationProxy;->serialVersionUID:J
+Ljava/util/concurrent/atomic/LongAccumulator;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/atomic/LongAccumulator;->serialVersionUID:J
+Ljava/util/concurrent/atomic/LongAccumulator;->writeReplace()Ljava/lang/Object;
+Ljava/util/concurrent/atomic/LongAdder$SerializationProxy;->readResolve()Ljava/lang/Object;
+Ljava/util/concurrent/atomic/LongAdder$SerializationProxy;->serialVersionUID:J
+Ljava/util/concurrent/atomic/LongAdder;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/atomic/LongAdder;->serialVersionUID:J
+Ljava/util/concurrent/atomic/LongAdder;->writeReplace()Ljava/lang/Object;
+Ljava/util/concurrent/locks/AbstractOwnableSynchronizer;->serialVersionUID:J
+Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;->serialVersionUID:J
+Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;->serialVersionUID:J
+Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;->serialVersionUID:J
+Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantLock$FairSync;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantLock$NonfairSync;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantLock$Sync;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/locks/ReentrantLock$Sync;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantLock;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;->serialVersionUID:J
+Ljava/util/concurrent/locks/ReentrantReadWriteLock;->serialVersionUID:J
+Ljava/util/concurrent/locks/StampedLock;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/concurrent/locks/StampedLock;->serialVersionUID:J
+Ljava/util/jar/JarException;->serialVersionUID:J
+Ljava/util/jar/JarFile;->manifest:Ljava/util/jar/Manifest;
+Ljava/util/jar/JarVerifier$VerifierCodeSource;->serialVersionUID:J
+Ljava/util/logging/Level;->readResolve()Ljava/lang/Object;
+Ljava/util/logging/Level;->serialVersionUID:J
+Ljava/util/logging/LogRecord;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/logging/LogRecord;->serialVersionUID:J
+Ljava/util/logging/LogRecord;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/prefs/AbstractPreferences$NodeAddedEvent;->serialVersionUID:J
+Ljava/util/prefs/AbstractPreferences$NodeRemovedEvent;->serialVersionUID:J
+Ljava/util/prefs/BackingStoreException;->serialVersionUID:J
+Ljava/util/prefs/InvalidPreferencesFormatException;->serialVersionUID:J
+Ljava/util/prefs/NodeChangeEvent;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/prefs/NodeChangeEvent;->serialVersionUID:J
+Ljava/util/prefs/NodeChangeEvent;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/prefs/PreferenceChangeEvent;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/prefs/PreferenceChangeEvent;->serialVersionUID:J
+Ljava/util/prefs/PreferenceChangeEvent;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljava/util/regex/Matcher;->appendPos:I
+Ljava/util/regex/Pattern;->readObject(Ljava/io/ObjectInputStream;)V
+Ljava/util/regex/Pattern;->serialVersionUID:J
+Ljava/util/regex/PatternSyntaxException;->serialVersionUID:J
+Ljava/util/zip/DataFormatException;->serialVersionUID:J
+Ljava/util/zip/Deflater;->buf:[B
+Ljava/util/zip/Deflater;->finish:Z
+Ljava/util/zip/Deflater;->finished:Z
+Ljava/util/zip/Deflater;->len:I
+Ljava/util/zip/Deflater;->level:I
+Ljava/util/zip/Deflater;->off:I
+Ljava/util/zip/Deflater;->setParams:Z
+Ljava/util/zip/Deflater;->strategy:I
+Ljava/util/zip/Inflater;->buf:[B
+Ljava/util/zip/Inflater;->finished:Z
+Ljava/util/zip/Inflater;->len:I
+Ljava/util/zip/Inflater;->needDict:Z
+Ljava/util/zip/Inflater;->off:I
+Ljava/util/zip/ZipEntry;-><init>(Ljava/lang/String;Ljava/lang/String;JJJII[BJ)V
+Ljava/util/zip/ZipError;->serialVersionUID:J
+Ljava/util/zip/ZipException;->serialVersionUID:J
+Ljava/util/zip/ZipFile;->jzfile:J
+Ljavax/crypto/AEADBadTagException;->serialVersionUID:J
+Ljavax/crypto/BadPaddingException;->serialVersionUID:J
+Ljavax/crypto/ExemptionMechanismException;->serialVersionUID:J
+Ljavax/crypto/IllegalBlockSizeException;->serialVersionUID:J
+Ljavax/crypto/NoSuchPaddingException;->serialVersionUID:J
+Ljavax/crypto/SealedObject;->readObject(Ljava/io/ObjectInputStream;)V
+Ljavax/crypto/SealedObject;->serialVersionUID:J
+Ljavax/crypto/ShortBufferException;->serialVersionUID:J
+Ljavax/crypto/spec/SecretKeySpec;->serialVersionUID:J
+Ljavax/net/ssl/HandshakeCompletedEvent;->serialVersionUID:J
+Ljavax/net/ssl/SSLException;->serialVersionUID:J
+Ljavax/net/ssl/SSLHandshakeException;->serialVersionUID:J
+Ljavax/net/ssl/SSLKeyException;->serialVersionUID:J
+Ljavax/net/ssl/SSLPeerUnverifiedException;->serialVersionUID:J
+Ljavax/net/ssl/SSLProtocolException;->serialVersionUID:J
+Ljavax/net/ssl/SSLServerSocketFactory;->defaultServerSocketFactory:Ljavax/net/ssl/SSLServerSocketFactory;
+Ljavax/net/ssl/SSLSessionBindingEvent;->serialVersionUID:J
+Ljavax/net/ssl/SSLSocketFactory;->defaultSocketFactory:Ljavax/net/ssl/SSLSocketFactory;
+Ljavax/security/auth/DestroyFailedException;->serialVersionUID:J
+Ljavax/security/auth/Subject$SecureSet;->readObject(Ljava/io/ObjectInputStream;)V
+Ljavax/security/auth/Subject$SecureSet;->serialPersistentFields:[Ljava/io/ObjectStreamField;
+Ljavax/security/auth/Subject$SecureSet;->serialVersionUID:J
+Ljavax/security/auth/Subject$SecureSet;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljavax/security/auth/Subject;->readObject(Ljava/io/ObjectInputStream;)V
+Ljavax/security/auth/Subject;->serialVersionUID:J
+Ljavax/security/auth/Subject;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljavax/security/auth/callback/PasswordCallback;->serialVersionUID:J
+Ljavax/security/auth/callback/UnsupportedCallbackException;->serialVersionUID:J
+Ljavax/security/auth/login/LoginException;->serialVersionUID:J
+Ljavax/security/auth/x500/X500Principal;->readObject(Ljava/io/ObjectInputStream;)V
+Ljavax/security/auth/x500/X500Principal;->serialVersionUID:J
+Ljavax/security/auth/x500/X500Principal;->writeObject(Ljava/io/ObjectOutputStream;)V
+Ljavax/security/cert/CertificateEncodingException;->serialVersionUID:J
+Ljavax/security/cert/CertificateException;->serialVersionUID:J
+Ljavax/security/cert/CertificateExpiredException;->serialVersionUID:J
+Ljavax/security/cert/CertificateNotYetValidException;->serialVersionUID:J
+Ljavax/security/cert/CertificateParsingException;->serialVersionUID:J
+Ljavax/sql/ConnectionEvent;->serialVersionUID:J
+Ljavax/sql/RowSetEvent;->serialVersionUID:J
+Ljavax/xml/datatype/DatatypeConfigurationException;->readObject(Ljava/io/ObjectInputStream;)V
+Ljavax/xml/datatype/DatatypeConfigurationException;->serialVersionUID:J
+Ljavax/xml/namespace/QName;->readObject(Ljava/io/ObjectInputStream;)V
+Ljavax/xml/namespace/QName;->serialVersionUID:J
+Ljavax/xml/transform/TransformerException;->serialVersionUID:J
+Ljavax/xml/xpath/XPathException;->serialVersionUID:J
+Ljavax/xml/xpath/XPathExpressionException;->serialVersionUID:J
+Ljavax/xml/xpath/XPathFactoryConfigurationException;->serialVersionUID:J
+Ljavax/xml/xpath/XPathFunctionException;->serialVersionUID:J
+Llibcore/util/BasicLruCache;->map:Ljava/util/LinkedHashMap;
+Llibcore/util/ZoneInfo;->mTransitions:[J
+Llibcore/util/ZoneInfo;->readObject(Ljava/io/ObjectInputStream;)V
+Llibcore/util/ZoneInfo;->serialVersionUID:J
+Lorg/apache/http/conn/ConnectTimeoutException;->serialVersionUID:J
+Lorg/apache/http/conn/ssl/SSLSocketFactory;-><init>()V
+Lorg/apache/http/conn/ssl/SSLSocketFactory;-><init>(Ljavax/net/ssl/SSLSocketFactory;)V
+Lorg/ccil/cowan/tagsoup/AttributesImpl;->data:[Ljava/lang/String;
+Lorg/ccil/cowan/tagsoup/AttributesImpl;->length:I
+Lorg/json/JSONArray;->values:Ljava/util/List;
+Lorg/json/JSONObject;->append(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;
+Lorg/json/JSONObject;->keySet()Ljava/util/Set;
+Lorg/json/JSONObject;->writeTo(Lorg/json/JSONStringer;)V
+Lorg/w3c/dom/traversal/NodeIterator;->nextNode()Lorg/w3c/dom/Node;
+Lsun/misc/Unsafe;->theUnsafe:Lsun/misc/Unsafe;
+Lsun/security/pkcs/ParsingException;->serialVersionUID:J
+Lsun/security/util/ObjectIdentifier$HugeOidNotSupportedByOldJDK;->serialVersionUID:J
+Lsun/security/util/ObjectIdentifier;->readObject(Ljava/io/ObjectInputStream;)V
+Lsun/security/util/ObjectIdentifier;->serialVersionUID:J
+Lsun/security/util/ObjectIdentifier;->writeObject(Ljava/io/ObjectOutputStream;)V
+Lsun/security/x509/AlgorithmId;->serialVersionUID:J
+Lsun/util/locale/LocaleSyntaxException;->serialVersionUID:J
diff --git a/config/hiddenapi-vendor-list.txt b/config/hiddenapi-vendor-list.txt
index e20373c6f64a..43b1a0e1c38c 100644
--- a/config/hiddenapi-vendor-list.txt
+++ b/config/hiddenapi-vendor-list.txt
@@ -13,10 +13,6 @@ Landroid/app/ActivityView;->startActivity(Landroid/app/PendingIntent;)V
Landroid/app/ActivityView;->startActivity(Landroid/content/Intent;)V
Landroid/app/AppOpsManager$OpEntry;->getOp()I
Landroid/app/AppOpsManager$OpEntry;->getTime()J
-Landroid/app/AppOpsManager$OpEntry;->isRunning()Z
-Landroid/app/AppOpsManager$PackageOps;->getOps()Ljava/util/List;
-Landroid/app/AppOpsManager$PackageOps;->getPackageName()Ljava/lang/String;
-Landroid/app/AppOpsManager$PackageOps;->getUid()I
Landroid/app/AppOpsManager;->getPackagesForOps([I)Ljava/util/List;
Landroid/app/AppOpsManager;->getToken(Lcom/android/internal/app/IAppOpsService;)Landroid/os/IBinder;
Landroid/app/IActivityController$Stub;-><init>()V
@@ -58,8 +54,6 @@ Landroid/app/TaskStackListener;->onTaskProfileLocked(II)V
Landroid/app/TaskStackListener;->onTaskRemoved(I)V
Landroid/app/TaskStackListener;->onTaskSnapshotChanged(ILandroid/app/ActivityManager$TaskSnapshot;)V
Landroid/app/TaskStackListener;->onTaskStackChanged()V
-Landroid/app/VrStateCallback;-><init>()V
-Landroid/app/VrStateCallback;->onPersistentVrStateChanged(Z)V
Landroid/app/WallpaperColors;-><init>(Landroid/graphics/Color;Landroid/graphics/Color;Landroid/graphics/Color;I)V
Landroid/bluetooth/BluetoothHeadset;->phoneStateChanged(IIILjava/lang/String;I)V
Landroid/bluetooth/IBluetooth;->sendConnectionStateChange(Landroid/bluetooth/BluetoothDevice;III)V
@@ -82,7 +76,6 @@ Landroid/content/ContentProvider;->getIContentProvider()Landroid/content/IConten
Landroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
Landroid/content/ContentValues;->getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList;
Landroid/content/ContentValues;->putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V
-Landroid/content/Context;->getOpPackageName()Ljava/lang/String;
Landroid/content/Context;->registerReceiverAsUser(Landroid/content/BroadcastReceiver;Landroid/os/UserHandle;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
Landroid/content/Context;->startActivityAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
Landroid/content/Context;->startServiceAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/ComponentName;
@@ -527,7 +520,7 @@ Landroid/view/BatchedInputEventReceiver;-><init>(Landroid/view/InputChannel;Land
Landroid/view/Choreographer;->getSfInstance()Landroid/view/Choreographer;
Landroid/view/DisplayListCanvas;->drawRenderNode(Landroid/view/RenderNode;)V
Landroid/view/IAppTransitionAnimationSpecsFuture$Stub;-><init>()V
-Landroid/view/InputEventReceiver;->onInputEvent(Landroid/view/InputEvent;I)V
+Landroid/view/InputEventReceiver;->onInputEvent(Landroid/view/InputEvent;)V
Landroid/view/IRecentsAnimationController;->finish(Z)V
Landroid/view/IRecentsAnimationController;->screenshotTask(I)Landroid/app/ActivityManager$TaskSnapshot;
Landroid/view/IRecentsAnimationController;->setInputConsumerEnabled(Z)V
diff --git a/core/java/android/accounts/ChooseAccountActivity.java b/core/java/android/accounts/ChooseAccountActivity.java
index 6a436869a0ec..4af22bfac92d 100644
--- a/core/java/android/accounts/ChooseAccountActivity.java
+++ b/core/java/android/accounts/ChooseAccountActivity.java
@@ -17,6 +17,7 @@ package android.accounts;
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
@@ -72,8 +73,8 @@ public class ChooseAccountActivity extends Activity {
try {
IBinder activityToken = getActivityToken();
- mCallingUid = ActivityManager.getService().getLaunchedFromUid(activityToken);
- mCallingPackage = ActivityManager.getService().getLaunchedFromPackage(
+ mCallingUid = ActivityTaskManager.getService().getLaunchedFromUid(activityToken);
+ mCallingPackage = ActivityTaskManager.getService().getLaunchedFromPackage(
activityToken);
} catch (RemoteException re) {
// Couldn't figure out caller details
diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
index 6680ce6acb04..57c108326706 100644
--- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java
+++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
@@ -15,6 +15,7 @@
*/
package android.accounts;
+import android.app.ActivityTaskManager;
import com.google.android.collect.Sets;
import android.app.Activity;
@@ -147,8 +148,8 @@ public class ChooseTypeAndAccountActivity extends Activity
try {
IBinder activityToken = getActivityToken();
- mCallingUid = ActivityManager.getService().getLaunchedFromUid(activityToken);
- mCallingPackage = ActivityManager.getService().getLaunchedFromPackage(
+ mCallingUid = ActivityTaskManager.getService().getLaunchedFromUid(activityToken);
+ mCallingPackage = ActivityTaskManager.getService().getLaunchedFromPackage(
activityToken);
if (mCallingUid != 0 && mCallingPackage != null) {
Bundle restrictions = UserManager.get(this)
diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java
index 1a2dc5cde4e5..35cf39f1b056 100644
--- a/core/java/android/animation/AnimatorSet.java
+++ b/core/java/android/animation/AnimatorSet.java
@@ -836,8 +836,6 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim
lastPlayTime = duration - lastPlayTime;
inReverse = false;
}
- // Skip all values to start, and iterate mEvents to get animations to the right fraction.
- skipToStartValue(false);
ArrayList<Node> unfinishedNodes = new ArrayList<>();
// Assumes forward playing from here on.
@@ -872,6 +870,16 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim
}
node.mAnimation.animateBasedOnPlayTime(playTime, lastPlayTime, inReverse);
}
+
+ // Seek not yet started animations.
+ for (int i = 0; i < mEvents.size(); i++) {
+ AnimationEvent event = mEvents.get(i);
+ if (event.getTime() > currentPlayTime
+ && event.mEvent == AnimationEvent.ANIMATION_DELAY_ENDED) {
+ event.mNode.mAnimation.skipToEndValue(true);
+ }
+ }
+
}
@Override
@@ -923,7 +931,7 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim
initAnimation();
- if (!isStarted()) {
+ if (!isStarted() || isPaused()) {
if (mReversing) {
throw new UnsupportedOperationException("Error: Something went wrong. mReversing"
+ " should not be set when AnimatorSet is not started.");
@@ -932,7 +940,6 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim
findLatestEventIdForTime(0);
// Set all the values to start values.
initChildren();
- skipToStartValue(mReversing);
mSeekState.setPlayTime(0, mReversing);
}
animateBasedOnPlayTime(playTime, 0, mReversing);
diff --git a/core/java/android/animation/IntEvaluator.java b/core/java/android/animation/IntEvaluator.java
index 34fb0dc57bda..1de2ae7326ed 100644
--- a/core/java/android/animation/IntEvaluator.java
+++ b/core/java/android/animation/IntEvaluator.java
@@ -24,7 +24,7 @@ public class IntEvaluator implements TypeEvaluator<Integer> {
/**
* This function returns the result of linearly interpolating the start and end values, with
* <code>fraction</code> representing the proportion between the start and end values. The
- * calculation is a simple parametric calculation: <code>result = x0 + t * (v1 - v0)</code>,
+ * calculation is a simple parametric calculation: <code>result = x0 + t * (x1 - x0)</code>,
* where <code>x0</code> is <code>startValue</code>, <code>x1</code> is <code>endValue</code>,
* and <code>t</code> is <code>fraction</code>.
*
@@ -39,4 +39,4 @@ public class IntEvaluator implements TypeEvaluator<Integer> {
int startInt = startValue;
return (int)(startInt + fraction * (endValue - startInt));
}
-} \ No newline at end of file
+}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index a6d2be0842a7..6638dd94c6e4 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1086,7 +1086,7 @@ public class Activity extends ContextThemeWrapper
*
* @param savedInstanceState contains the saved state
*/
- final void performRestoreInstanceState(Bundle savedInstanceState) {
+ final void performRestoreInstanceState(@NonNull Bundle savedInstanceState) {
onRestoreInstanceState(savedInstanceState);
restoreManagedDialogs(savedInstanceState);
}
@@ -1100,8 +1100,8 @@ public class Activity extends ContextThemeWrapper
* @param savedInstanceState contains the saved state
* @param persistentState contains the persistable saved state
*/
- final void performRestoreInstanceState(Bundle savedInstanceState,
- PersistableBundle persistentState) {
+ final void performRestoreInstanceState(@Nullable Bundle savedInstanceState,
+ @Nullable PersistableBundle persistentState) {
onRestoreInstanceState(savedInstanceState, persistentState);
if (savedInstanceState != null) {
restoreManagedDialogs(savedInstanceState);
@@ -1128,7 +1128,7 @@ public class Activity extends ContextThemeWrapper
* @see #onResume
* @see #onSaveInstanceState
*/
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
if (mWindow != null) {
Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
if (windowState != null) {
@@ -1149,8 +1149,12 @@ public class Activity extends ContextThemeWrapper
*
* <p>If this method is called {@link #onRestoreInstanceState(Bundle)} will not be called.
*
- * @param savedInstanceState the data most recently supplied in {@link #onSaveInstanceState}.
- * @param persistentState the data most recently supplied in {@link #onSaveInstanceState}.
+ * <p>At least one of {@code savedInstanceState} or {@code persistentState} will not be null.
+ *
+ * @param savedInstanceState the data most recently supplied in {@link #onSaveInstanceState}
+ * or null.
+ * @param persistentState the data most recently supplied in {@link #onSaveInstanceState}
+ * or null.
*
* @see #onRestoreInstanceState(Bundle)
* @see #onCreate
@@ -1158,8 +1162,8 @@ public class Activity extends ContextThemeWrapper
* @see #onResume
* @see #onSaveInstanceState
*/
- public void onRestoreInstanceState(Bundle savedInstanceState,
- PersistableBundle persistentState) {
+ public void onRestoreInstanceState(@Nullable Bundle savedInstanceState,
+ @Nullable PersistableBundle persistentState) {
if (savedInstanceState != null) {
onRestoreInstanceState(savedInstanceState);
}
@@ -1442,7 +1446,7 @@ public class Activity extends ContextThemeWrapper
public boolean isVoiceInteractionRoot() {
try {
return mVoiceInteractor != null
- && ActivityManager.getService().isRootVoiceInteraction(mToken);
+ && ActivityTaskManager.getService().isRootVoiceInteraction(mToken);
} catch (RemoteException e) {
}
return false;
@@ -1465,7 +1469,7 @@ public class Activity extends ContextThemeWrapper
*/
public boolean isLocalVoiceInteractionSupported() {
try {
- return ActivityManager.getService().supportsLocalVoiceInteraction();
+ return ActivityTaskManager.getService().supportsLocalVoiceInteraction();
} catch (RemoteException re) {
}
return false;
@@ -1479,7 +1483,7 @@ public class Activity extends ContextThemeWrapper
*/
public void startLocalVoiceInteraction(Bundle privateOptions) {
try {
- ActivityManager.getService().startLocalVoiceInteraction(mToken, privateOptions);
+ ActivityTaskManager.getService().startLocalVoiceInteraction(mToken, privateOptions);
} catch (RemoteException re) {
}
}
@@ -1508,7 +1512,7 @@ public class Activity extends ContextThemeWrapper
*/
public void stopLocalVoiceInteraction() {
try {
- ActivityManager.getService().stopLocalVoiceInteraction(mToken);
+ ActivityTaskManager.getService().stopLocalVoiceInteraction(mToken);
} catch (RemoteException re) {
}
}
@@ -1545,7 +1549,7 @@ public class Activity extends ContextThemeWrapper
*
* @param outState The bundle to save the state to.
*/
- final void performSaveInstanceState(Bundle outState) {
+ final void performSaveInstanceState(@NonNull Bundle outState) {
onSaveInstanceState(outState);
saveManagedDialogs(outState);
mActivityTransitionState.saveState(outState);
@@ -1562,7 +1566,8 @@ public class Activity extends ContextThemeWrapper
* @param outState The bundle to save the state to.
* @param outPersistentState The bundle to save persistent state to.
*/
- final void performSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
+ final void performSaveInstanceState(@NonNull Bundle outState,
+ @NonNull PersistableBundle outPersistentState) {
onSaveInstanceState(outState, outPersistentState);
saveManagedDialogs(outState);
storeHasCurrentPermissionRequest(outState);
@@ -1618,7 +1623,7 @@ public class Activity extends ContextThemeWrapper
* @see #onRestoreInstanceState
* @see #onPause
*/
- protected void onSaveInstanceState(Bundle outState) {
+ protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());
outState.putInt(LAST_AUTOFILL_ID, mLastAutofillId);
@@ -1648,7 +1653,8 @@ public class Activity extends ContextThemeWrapper
* @see #onRestoreInstanceState(Bundle, PersistableBundle)
* @see #onPause
*/
- public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
+ public void onSaveInstanceState(@NonNull Bundle outState,
+ @NonNull PersistableBundle outPersistentState) {
onSaveInstanceState(outState);
}
@@ -1886,7 +1892,7 @@ public class Activity extends ContextThemeWrapper
*/
public boolean showAssist(Bundle args) {
try {
- return ActivityManager.getService().showAssistFromActivity(mToken, args);
+ return ActivityTaskManager.getService().showAssistFromActivity(mToken, args);
} catch (RemoteException e) {
}
return false;
@@ -2019,7 +2025,8 @@ public class Activity extends ContextThemeWrapper
if (mDoReportFullyDrawn) {
mDoReportFullyDrawn = false;
try {
- ActivityManager.getService().reportActivityFullyDrawn(mToken, mRestoredFromBundle);
+ ActivityTaskManager.getService().reportActivityFullyDrawn(
+ mToken, mRestoredFromBundle);
} catch (RemoteException e) {
}
}
@@ -2066,7 +2073,7 @@ public class Activity extends ContextThemeWrapper
*/
public boolean isInMultiWindowMode() {
try {
- return ActivityManager.getService().isInMultiWindowMode(mToken);
+ return ActivityTaskManager.getService().isInMultiWindowMode(mToken);
} catch (RemoteException e) {
}
return false;
@@ -2113,7 +2120,7 @@ public class Activity extends ContextThemeWrapper
*/
public boolean isInPictureInPictureMode() {
try {
- return ActivityManager.getService().isInPictureInPictureMode(mToken);
+ return ActivityTaskManager.getService().isInPictureInPictureMode(mToken);
} catch (RemoteException e) {
}
return false;
@@ -2168,7 +2175,7 @@ public class Activity extends ContextThemeWrapper
throw new IllegalStateException("Activity must be resumed to enter"
+ " picture-in-picture");
}
- return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, params);
+ return ActivityTaskManager.getService().enterPictureInPictureMode(mToken, params);
} catch (RemoteException e) {
return false;
}
@@ -2194,7 +2201,7 @@ public class Activity extends ContextThemeWrapper
if (params == null) {
throw new IllegalArgumentException("Expected non-null picture-in-picture params");
}
- ActivityManagerNative.getDefault().setPictureInPictureParams(mToken, params);
+ ActivityTaskManager.getService().setPictureInPictureParams(mToken, params);
} catch (RemoteException e) {
}
}
@@ -2207,7 +2214,7 @@ public class Activity extends ContextThemeWrapper
*/
public int getMaxNumPictureInPictureActions() {
try {
- return ActivityManagerNative.getDefault().getMaxNumPictureInPictureActions(mToken);
+ return ActivityTaskManager.getService().getMaxNumPictureInPictureActions(mToken);
} catch (RemoteException e) {
return 0;
}
@@ -3321,7 +3328,7 @@ public class Activity extends ContextThemeWrapper
*/
@Override
public void exitFreeformMode() throws RemoteException {
- ActivityManager.getService().exitFreeformMode(mToken);
+ ActivityTaskManager.getService().exitFreeformMode(mToken);
}
/**
@@ -4405,9 +4412,9 @@ public class Activity extends ContextThemeWrapper
/**
* Requests permissions to be granted to this application. These permissions
* must be requested in your manifest, they should not be granted to your app,
- * and they should have protection level {@link android.content.pm.PermissionInfo
- * #PROTECTION_DANGEROUS dangerous}, regardless whether they are declared by
- * the platform or a third-party app.
+ * and they should have protection level {@link
+ * android.content.pm.PermissionInfo#PROTECTION_DANGEROUS dangerous}, regardless
+ * whether they are declared by the platform or a third-party app.
* <p>
* Normal permissions {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL}
* are granted at install time if requested in the manifest. Signature permissions
@@ -4451,7 +4458,7 @@ public class Activity extends ContextThemeWrapper
* result callbacks including {@link #onRequestPermissionsResult(int, String[], int[])}.
* </p>
* <p>
- * The <a href="http://developer.android.com/samples/RuntimePermissions/index.html">
+ * The <a href="https://github.com/googlesamples/android-RuntimePermissions">
* RuntimePermissions</a> sample app demonstrates how to use this method to
* request permissions at run time.
* </p>
@@ -4833,7 +4840,7 @@ public class Activity extends ContextThemeWrapper
fillInIntent.prepareToLeaveProcess(this);
resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
}
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivityIntentSender(mMainThread.getApplicationThread(),
intent != null ? intent.getTarget() : null,
intent != null ? intent.getWhitelistToken() : null,
@@ -5065,7 +5072,7 @@ public class Activity extends ContextThemeWrapper
}
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(this);
- result = ActivityManager.getService()
+ result = ActivityTaskManager.getService()
.startActivity(mMainThread.getApplicationThread(), getBasePackageName(),
intent, intent.resolveTypeIfNeeded(getContentResolver()), mToken,
mEmbeddedID, requestCode, ActivityManager.START_FLAG_ONLY_IF_NEEDED,
@@ -5136,7 +5143,7 @@ public class Activity extends ContextThemeWrapper
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(this);
- return ActivityManager.getService()
+ return ActivityTaskManager.getService()
.startNextMatchingActivity(mToken, intent, options);
} catch (RemoteException e) {
// Empty
@@ -5351,7 +5358,7 @@ public class Activity extends ContextThemeWrapper
*/
public void overridePendingTransition(int enterAnim, int exitAnim) {
try {
- ActivityManager.getService().overridePendingTransition(
+ ActivityTaskManager.getService().overridePendingTransition(
mToken, getPackageName(), enterAnim, exitAnim);
} catch (RemoteException e) {
}
@@ -5476,7 +5483,7 @@ public class Activity extends ContextThemeWrapper
@Nullable
public String getCallingPackage() {
try {
- return ActivityManager.getService().getCallingPackage(mToken);
+ return ActivityTaskManager.getService().getCallingPackage(mToken);
} catch (RemoteException e) {
return null;
}
@@ -5499,7 +5506,7 @@ public class Activity extends ContextThemeWrapper
@Nullable
public ComponentName getCallingActivity() {
try {
- return ActivityManager.getService().getCallingActivity(mToken);
+ return ActivityTaskManager.getService().getCallingActivity(mToken);
} catch (RemoteException e) {
return null;
}
@@ -5603,7 +5610,7 @@ public class Activity extends ContextThemeWrapper
if (resultData != null) {
resultData.prepareToLeaveProcess(this);
}
- if (ActivityManager.getService()
+ if (ActivityTaskManager.getService()
.finishActivity(mToken, resultCode, resultData, finishTask)) {
mFinished = true;
}
@@ -5653,7 +5660,7 @@ public class Activity extends ContextThemeWrapper
throw new IllegalStateException("Can not be called to deliver a result");
}
try {
- if (ActivityManager.getService().finishActivityAffinity(mToken)) {
+ if (ActivityTaskManager.getService().finishActivityAffinity(mToken)) {
mFinished = true;
}
} catch (RemoteException e) {
@@ -5699,7 +5706,7 @@ public class Activity extends ContextThemeWrapper
public void finishActivity(int requestCode) {
if (mParent == null) {
try {
- ActivityManager.getService()
+ ActivityTaskManager.getService()
.finishSubActivity(mToken, mEmbeddedID, requestCode);
} catch (RemoteException e) {
// Empty
@@ -5719,7 +5726,7 @@ public class Activity extends ContextThemeWrapper
*/
public void finishActivityFromChild(@NonNull Activity child, int requestCode) {
try {
- ActivityManager.getService()
+ ActivityTaskManager.getService()
.finishSubActivity(mToken, child.mEmbeddedID, requestCode);
} catch (RemoteException e) {
// Empty
@@ -5747,7 +5754,7 @@ public class Activity extends ContextThemeWrapper
*/
public boolean releaseInstance() {
try {
- return ActivityManager.getService().releaseActivityInstance(mToken);
+ return ActivityTaskManager.getService().releaseActivityInstance(mToken);
} catch (RemoteException e) {
// Empty
}
@@ -5862,7 +5869,7 @@ public class Activity extends ContextThemeWrapper
public void setRequestedOrientation(@ActivityInfo.ScreenOrientation int requestedOrientation) {
if (mParent == null) {
try {
- ActivityManager.getService().setRequestedOrientation(
+ ActivityTaskManager.getService().setRequestedOrientation(
mToken, requestedOrientation);
} catch (RemoteException e) {
// Empty
@@ -5885,7 +5892,7 @@ public class Activity extends ContextThemeWrapper
public int getRequestedOrientation() {
if (mParent == null) {
try {
- return ActivityManager.getService()
+ return ActivityTaskManager.getService()
.getRequestedOrientation(mToken);
} catch (RemoteException e) {
// Empty
@@ -5904,8 +5911,7 @@ public class Activity extends ContextThemeWrapper
*/
public int getTaskId() {
try {
- return ActivityManager.getService()
- .getTaskForActivity(mToken, false);
+ return ActivityTaskManager.getService().getTaskForActivity(mToken, false);
} catch (RemoteException e) {
return -1;
}
@@ -5920,7 +5926,7 @@ public class Activity extends ContextThemeWrapper
@Override
public boolean isTaskRoot() {
try {
- return ActivityManager.getService().getTaskForActivity(mToken, true) >= 0;
+ return ActivityTaskManager.getService().getTaskForActivity(mToken, true) >= 0;
} catch (RemoteException e) {
return false;
}
@@ -5939,8 +5945,7 @@ public class Activity extends ContextThemeWrapper
*/
public boolean moveTaskToBack(boolean nonRoot) {
try {
- return ActivityManager.getService().moveActivityTaskToBack(
- mToken, nonRoot);
+ return ActivityTaskManager.getService().moveActivityTaskToBack(mToken, nonRoot);
} catch (RemoteException e) {
// Empty
}
@@ -6115,7 +6120,7 @@ public class Activity extends ContextThemeWrapper
}
}
try {
- ActivityManager.getService().setTaskDescription(mToken, mTaskDescription);
+ ActivityTaskManager.getService().setTaskDescription(mToken, mTaskDescription);
} catch (RemoteException e) {
}
}
@@ -6390,7 +6395,7 @@ public class Activity extends ContextThemeWrapper
*/
public boolean isImmersive() {
try {
- return ActivityManager.getService().isImmersive(mToken);
+ return ActivityTaskManager.getService().isImmersive(mToken);
} catch (RemoteException e) {
return false;
}
@@ -6408,7 +6413,7 @@ public class Activity extends ContextThemeWrapper
return false;
}
try {
- return ActivityManager.getService().isTopOfTask(getActivityToken());
+ return ActivityTaskManager.getService().isTopOfTask(getActivityToken());
} catch (RemoteException e) {
return false;
}
@@ -6434,7 +6439,7 @@ public class Activity extends ContextThemeWrapper
public void convertFromTranslucent() {
try {
mTranslucentCallback = null;
- if (ActivityManager.getService().convertFromTranslucent(mToken)) {
+ if (ActivityTaskManager.getService().convertFromTranslucent(mToken)) {
WindowManagerGlobal.getInstance().changeCanvasOpacity(mToken, true);
}
} catch (RemoteException e) {
@@ -6473,7 +6478,7 @@ public class Activity extends ContextThemeWrapper
boolean drawComplete;
try {
mTranslucentCallback = callback;
- mChangeCanvasToTranslucent = ActivityManager.getService().convertToTranslucent(
+ mChangeCanvasToTranslucent = ActivityTaskManager.getService().convertToTranslucent(
mToken, options == null ? null : options.toBundle());
WindowManagerGlobal.getInstance().changeCanvasOpacity(mToken, false);
drawComplete = true;
@@ -6519,7 +6524,7 @@ public class Activity extends ContextThemeWrapper
ActivityOptions getActivityOptions() {
try {
return ActivityOptions.fromBundle(
- ActivityManager.getService().getActivityOptions(mToken));
+ ActivityTaskManager.getService().getActivityOptions(mToken));
} catch (RemoteException e) {
}
return null;
@@ -6664,7 +6669,7 @@ public class Activity extends ContextThemeWrapper
*/
public void setImmersive(boolean i) {
try {
- ActivityManager.getService().setImmersive(mToken, i);
+ ActivityTaskManager.getService().setImmersive(mToken, i);
} catch (RemoteException e) {
// pass
}
@@ -6727,7 +6732,7 @@ public class Activity extends ContextThemeWrapper
public void setVrModeEnabled(boolean enabled, @NonNull ComponentName requestedComponent)
throws PackageManager.NameNotFoundException {
try {
- if (ActivityManager.getService().setVrMode(mToken, enabled, requestedComponent)
+ if (ActivityTaskManager.getService().setVrMode(mToken, enabled, requestedComponent)
!= 0) {
throw new PackageManager.NameNotFoundException(
requestedComponent.flattenToString());
@@ -6848,8 +6853,7 @@ public class Activity extends ContextThemeWrapper
if (info.taskAffinity == null) {
return false;
}
- return ActivityManager.getService()
- .shouldUpRecreateTask(mToken, info.taskAffinity);
+ return ActivityTaskManager.getService().shouldUpRecreateTask(mToken, info.taskAffinity);
} catch (RemoteException e) {
return false;
} catch (NameNotFoundException e) {
@@ -6901,7 +6905,7 @@ public class Activity extends ContextThemeWrapper
}
try {
upIntent.prepareToLeaveProcess(this);
- return ActivityManager.getService().navigateUpTo(mToken, upIntent,
+ return ActivityTaskManager.getService().navigateUpTo(mToken, upIntent,
resultCode, resultData);
} catch (RemoteException e) {
return false;
@@ -7508,7 +7512,7 @@ public class Activity extends ContextThemeWrapper
*/
public void startLockTask() {
try {
- ActivityManager.getService().startLockTaskModeByToken(mToken);
+ ActivityTaskManager.getService().startLockTaskModeByToken(mToken);
} catch (RemoteException e) {
}
}
@@ -7531,7 +7535,7 @@ public class Activity extends ContextThemeWrapper
*/
public void stopLockTask() {
try {
- ActivityManager.getService().stopLockTaskModeByToken(mToken);
+ ActivityTaskManager.getService().stopLockTaskModeByToken(mToken);
} catch (RemoteException e) {
}
}
@@ -7543,7 +7547,7 @@ public class Activity extends ContextThemeWrapper
*/
public void showLockTaskEscapeMessage() {
try {
- ActivityManager.getService().showLockTaskEscapeMessage(mToken);
+ ActivityTaskManager.getService().showLockTaskEscapeMessage(mToken);
} catch (RemoteException e) {
}
}
@@ -7813,7 +7817,7 @@ public class Activity extends ContextThemeWrapper
*/
public void setDisablePreviewScreenshots(boolean disable) {
try {
- ActivityManager.getService().setDisablePreviewScreenshots(mToken, disable);
+ ActivityTaskManager.getService().setDisablePreviewScreenshots(mToken, disable);
} catch (RemoteException e) {
Log.e(TAG, "Failed to call setDisablePreviewScreenshots", e);
}
@@ -7834,7 +7838,7 @@ public class Activity extends ContextThemeWrapper
*/
public void setShowWhenLocked(boolean showWhenLocked) {
try {
- ActivityManager.getService().setShowWhenLocked(mToken, showWhenLocked);
+ ActivityTaskManager.getService().setShowWhenLocked(mToken, showWhenLocked);
} catch (RemoteException e) {
Log.e(TAG, "Failed to call setShowWhenLocked", e);
}
@@ -7860,7 +7864,7 @@ public class Activity extends ContextThemeWrapper
*/
public void setTurnScreenOn(boolean turnScreenOn) {
try {
- ActivityManager.getService().setTurnScreenOn(mToken, turnScreenOn);
+ ActivityTaskManager.getService().setTurnScreenOn(mToken, turnScreenOn);
} catch (RemoteException e) {
Log.e(TAG, "Failed to call setTurnScreenOn", e);
}
@@ -7876,7 +7880,7 @@ public class Activity extends ContextThemeWrapper
@RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS)
public void registerRemoteAnimations(RemoteAnimationDefinition definition) {
try {
- ActivityManager.getService().registerRemoteAnimations(mToken, definition);
+ ActivityTaskManager.getService().registerRemoteAnimations(mToken, definition);
} catch (RemoteException e) {
Log.e(TAG, "Failed to call registerRemoteAnimations", e);
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 83630f4c3693..3f579bc442b7 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -123,8 +123,6 @@ import java.util.List;
public class ActivityManager {
private static String TAG = "ActivityManager";
- private static int gMaxRecentTasks = -1;
-
private final Context mContext;
private static volatile boolean sSystemReady = false;
@@ -746,86 +744,9 @@ public class ActivityManager {
SystemProperties.getBoolean("debug.force_low_ram", false);
/** @hide */
- @TestApi
- public static class StackId {
-
- private StackId() {
- }
-
- /** Invalid stack ID. */
- public static final int INVALID_STACK_ID = -1;
-
- }
-
- /**
- * Parameter to {@link android.app.IActivityManager#setTaskWindowingModeSplitScreenPrimary}
- * which specifies the position of the created docked stack at the top half of the screen if
- * in portrait mode or at the left half of the screen if in landscape mode.
- * @hide
- */
- @TestApi
- public static final int SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT = 0;
-
- /**
- * Parameter to {@link android.app.IActivityManager#setTaskWindowingModeSplitScreenPrimary}
- * which
- * specifies the position of the created docked stack at the bottom half of the screen if
- * in portrait mode or at the right half of the screen if in landscape mode.
- * @hide
- */
- @TestApi
- public static final int SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT = 1;
-
- /**
- * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
- * that the resize doesn't need to preserve the window, and can be skipped if bounds
- * is unchanged. This mode is used by window manager in most cases.
- * @hide
- */
- public static final int RESIZE_MODE_SYSTEM = 0;
-
- /**
- * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
- * that the resize should preserve the window if possible.
- * @hide
- */
- public static final int RESIZE_MODE_PRESERVE_WINDOW = (0x1 << 0);
-
- /**
- * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
- * that the resize should be performed even if the bounds appears unchanged.
- * @hide
- */
- public static final int RESIZE_MODE_FORCED = (0x1 << 1);
-
- /**
- * Input parameter to {@link android.app.IActivityManager#resizeTask} used by window
- * manager during a screen rotation.
- * @hide
- */
- public static final int RESIZE_MODE_SYSTEM_SCREEN_ROTATION = RESIZE_MODE_PRESERVE_WINDOW;
-
- /**
- * Input parameter to {@link android.app.IActivityManager#resizeTask} used when the
- * resize is due to a drag action.
- * @hide
- */
- public static final int RESIZE_MODE_USER = RESIZE_MODE_PRESERVE_WINDOW;
-
- /**
- * Input parameter to {@link android.app.IActivityManager#resizeTask} which indicates
- * that the resize should preserve the window if possible, and should not be skipped
- * even if the bounds is unchanged. Usually used to force a resizing when a drag action
- * is ending.
- * @hide
- */
- public static final int RESIZE_MODE_USER_FORCED =
- RESIZE_MODE_PRESERVE_WINDOW | RESIZE_MODE_FORCED;
-
- /** @hide */
public int getFrontActivityScreenCompatMode() {
try {
- return getService().getFrontActivityScreenCompatMode();
+ return getTaskService().getFrontActivityScreenCompatMode();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -834,7 +755,7 @@ public class ActivityManager {
/** @hide */
public void setFrontActivityScreenCompatMode(int mode) {
try {
- getService().setFrontActivityScreenCompatMode(mode);
+ getTaskService().setFrontActivityScreenCompatMode(mode);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -977,57 +898,13 @@ public class ActivityManager {
}
/**
- * Return the maximum number of recents entries that we will maintain and show.
+ * TODO(b/80414790): Remove once no longer on hiddenapi-light-greylist.txt
* @hide
+ * @deprecated Use {@link ActivityTaskManager#getMaxRecentTasksStatic()}
*/
+ @Deprecated
static public int getMaxRecentTasksStatic() {
- if (gMaxRecentTasks < 0) {
- return gMaxRecentTasks = isLowRamDeviceStatic() ? 36 : 48;
- }
- return gMaxRecentTasks;
- }
-
- /**
- * Return the default limit on the number of recents that an app can make.
- * @hide
- */
- static public int getDefaultAppRecentsLimitStatic() {
- return getMaxRecentTasksStatic() / 6;
- }
-
- /**
- * Return the maximum limit on the number of recents that an app can make.
- * @hide
- */
- static public int getMaxAppRecentsLimitStatic() {
- return getMaxRecentTasksStatic() / 2;
- }
-
- /**
- * Returns true if the system supports at least one form of multi-window.
- * E.g. freeform, split-screen, picture-in-picture.
- * @hide
- */
- @TestApi
- static public boolean supportsMultiWindow(Context context) {
- // On watches, multi-window is used to present essential system UI, and thus it must be
- // supported regardless of device memory characteristics.
- boolean isWatch = context.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_WATCH);
- return (!isLowRamDeviceStatic() || isWatch)
- && Resources.getSystem().getBoolean(
- com.android.internal.R.bool.config_supportsMultiWindow);
- }
-
- /**
- * Returns true if the system supports split screen multi-window.
- * @hide
- */
- @TestApi
- static public boolean supportsSplitScreenMultiWindow(Context context) {
- return supportsMultiWindow(context)
- && Resources.getSystem().getBoolean(
- com.android.internal.R.bool.config_supportsSplitScreenMultiWindow);
+ return ActivityTaskManager.getMaxRecentTasksStatic();
}
/** @removed */
@@ -1305,7 +1182,7 @@ public class ActivityManager {
public static Bitmap loadTaskDescriptionIcon(String iconFilename, int userId) {
if (iconFilename != null) {
try {
- return getService().getTaskDescriptionIcon(iconFilename,
+ return getTaskService().getTaskDescriptionIcon(iconFilename,
userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1705,7 +1582,7 @@ public class ActivityManager {
if (maxNum < 0) {
throw new IllegalArgumentException("The requested number of tasks should be >= 0");
}
- return getService().getRecentTasks(maxNum, flags, mContext.getUserId()).getList();
+ return getTaskService().getRecentTasks(maxNum, flags, mContext.getUserId()).getList();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1858,7 +1735,7 @@ public class ActivityManager {
ArrayList<AppTask> tasks = new ArrayList<AppTask>();
List<IBinder> appTasks;
try {
- appTasks = getService().getAppTasks(mContext.getPackageName());
+ appTasks = getTaskService().getAppTasks(mContext.getPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1883,7 +1760,7 @@ public class ActivityManager {
private void ensureAppTaskThumbnailSizeLocked() {
if (mAppTaskThumbnailSize == null) {
try {
- mAppTaskThumbnailSize = getService().getAppTaskThumbnailSize();
+ mAppTaskThumbnailSize = getTaskService().getAppTaskThumbnailSize();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1948,7 +1825,7 @@ public class ActivityManager {
description = new TaskDescription();
}
try {
- return getService().addAppTask(activity.getActivityToken(),
+ return getTaskService().addAppTask(activity.getActivityToken(),
intent, description, thumbnail);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1991,103 +1868,7 @@ public class ActivityManager {
public List<RunningTaskInfo> getRunningTasks(int maxNum)
throws SecurityException {
try {
- return getService().getTasks(maxNum);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Sets the windowing mode for a specific task. Only works on tasks of type
- * {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD}
- * @param taskId The id of the task to set the windowing mode for.
- * @param windowingMode The windowing mode to set for the task.
- * @param toTop If the task should be moved to the top once the windowing mode changes.
- * @hide
- */
- @TestApi
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
- public void setTaskWindowingMode(int taskId, int windowingMode, boolean toTop)
- throws SecurityException {
- try {
- getService().setTaskWindowingMode(taskId, windowingMode, toTop);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Moves the input task to the primary-split-screen stack.
- * @param taskId Id of task to move.
- * @param createMode The mode the primary split screen stack should be created in if it doesn't
- * exist already. See
- * {@link android.app.ActivityManager#SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT}
- * and
- * {@link android.app.ActivityManager
- * #SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT}
- * @param toTop If the task and stack should be moved to the top.
- * @param animate Whether we should play an animation for the moving the task
- * @param initialBounds If the primary stack gets created, it will use these bounds for the
- * docked stack. Pass {@code null} to use default bounds.
- * @param showRecents If the recents activity should be shown on the other side of the task
- * going into split-screen mode.
- * @hide
- */
- @TestApi
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
- public void setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode, boolean toTop,
- boolean animate, Rect initialBounds, boolean showRecents) throws SecurityException {
- try {
- getService().setTaskWindowingModeSplitScreenPrimary(taskId, createMode, toTop, animate,
- initialBounds, showRecents);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Resizes the input stack id to the given bounds.
- * @param stackId Id of the stack to resize.
- * @param bounds Bounds to resize the stack to or {@code null} for fullscreen.
- * @hide
- */
- @TestApi
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
- public void resizeStack(int stackId, Rect bounds) throws SecurityException {
- try {
- getService().resizeStack(stackId, bounds, false /* allowResizeInDockedMode */,
- false /* preserveWindows */, false /* animate */, -1 /* animationDuration */);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Removes stacks in the windowing modes from the system if they are of activity type
- * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
- *
- * @hide
- */
- @TestApi
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
- public void removeStacksInWindowingModes(int[] windowingModes) throws SecurityException {
- try {
- getService().removeStacksInWindowingModes(windowingModes);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Removes stack of the activity types from the system.
- *
- * @hide
- */
- @TestApi
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
- public void removeStacksWithActivityTypes(int[] activityTypes) throws SecurityException {
- try {
- getService().removeStacksWithActivityTypes(activityTypes);
+ return getTaskService().getTasks(maxNum);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2296,7 +2077,7 @@ public class ActivityManager {
@RequiresPermission(android.Manifest.permission.REORDER_TASKS)
public void moveTaskToFront(int taskId, @MoveTaskFlags int flags, Bundle options) {
try {
- getService().moveTaskToFront(taskId, flags, options);
+ getTaskService().moveTaskToFront(taskId, flags, options);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -3299,16 +3080,32 @@ public class ActivityManager {
*/
public int processState;
+ /**
+ * Whether the app is focused in multi-window environment.
+ * @hide
+ */
+ public boolean isFocused;
+
+ /**
+ * Copy of {@link com.android.server.am.ProcessRecord#lastActivityTime} of the process.
+ * @hide
+ */
+ public long lastActivityTime;
+
public RunningAppProcessInfo() {
importance = IMPORTANCE_FOREGROUND;
importanceReasonCode = REASON_UNKNOWN;
processState = PROCESS_STATE_IMPORTANT_FOREGROUND;
+ isFocused = false;
+ lastActivityTime = 0;
}
public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) {
processName = pProcessName;
pid = pPid;
pkgList = pArr;
+ isFocused = false;
+ lastActivityTime = 0;
}
public int describeContents() {
@@ -3329,6 +3126,8 @@ public class ActivityManager {
ComponentName.writeToParcel(importanceReasonComponent, dest);
dest.writeInt(importanceReasonImportance);
dest.writeInt(processState);
+ dest.writeInt(isFocused ? 1 : 0);
+ dest.writeLong(lastActivityTime);
}
public void readFromParcel(Parcel source) {
@@ -3345,6 +3144,8 @@ public class ActivityManager {
importanceReasonComponent = ComponentName.readFromParcel(source);
importanceReasonImportance = source.readInt();
processState = source.readInt();
+ isFocused = source.readInt() != 0;
+ lastActivityTime = source.readLong();
}
public static final Creator<RunningAppProcessInfo> CREATOR =
@@ -3803,7 +3604,7 @@ public class ActivityManager {
@TestApi
public void alwaysShowUnsupportedCompileSdkWarning(ComponentName activity) {
try {
- getService().alwaysShowUnsupportedCompileSdkWarning(activity);
+ getTaskService().alwaysShowUnsupportedCompileSdkWarning(activity);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -4126,6 +3927,10 @@ public class ActivityManager {
return IActivityManagerSingleton.get();
}
+ private static IActivityTaskManager getTaskService() {
+ return ActivityTaskManager.getService();
+ }
+
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
@@ -4241,7 +4046,7 @@ public class ActivityManager {
*/
public int getLockTaskModeState() {
try {
- return getService().getLockTaskModeState();
+ return getTaskService().getLockTaskModeState();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -4263,7 +4068,7 @@ public class ActivityManager {
*/
public static void setVrThread(int tid) {
try {
- getService().setVrThread(tid);
+ getTaskService().setVrThread(tid);
} catch (RemoteException e) {
// pass
}
@@ -4284,6 +4089,7 @@ public class ActivityManager {
* @param tid tid of the VR thread
* @hide
*/
+ @SystemApi
@RequiresPermission(Manifest.permission.RESTRICTED_VR_ACCESS)
public static void setPersistentVrThread(int tid) {
try {
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 1d5f49a879d5..2e4404c0feed 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -21,6 +21,8 @@ import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.IIntentSender;
import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.IBinder;
@@ -31,6 +33,7 @@ import android.view.RemoteAnimationAdapter;
import com.android.internal.app.IVoiceInteractor;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -40,61 +43,11 @@ import java.util.List;
*/
public abstract class ActivityManagerInternal {
- /**
- * Type for {@link #notifyAppTransitionStarting}: The transition was started because we drew
- * the splash screen.
- */
- public static final int APP_TRANSITION_SPLASH_SCREEN =
- AppProtoEnums.APP_TRANSITION_SPLASH_SCREEN; // 1
-
- /**
- * Type for {@link #notifyAppTransitionStarting}: The transition was started because we all
- * app windows were drawn
- */
- public static final int APP_TRANSITION_WINDOWS_DRAWN =
- AppProtoEnums.APP_TRANSITION_WINDOWS_DRAWN; // 2
-
- /**
- * Type for {@link #notifyAppTransitionStarting}: The transition was started because of a
- * timeout.
- */
- public static final int APP_TRANSITION_TIMEOUT =
- AppProtoEnums.APP_TRANSITION_TIMEOUT; // 3
-
- /**
- * Type for {@link #notifyAppTransitionStarting}: The transition was started because of a
- * we drew a task snapshot.
- */
- public static final int APP_TRANSITION_SNAPSHOT =
- AppProtoEnums.APP_TRANSITION_SNAPSHOT; // 4
-
- /**
- * Type for {@link #notifyAppTransitionStarting}: The transition was started because it was a
- * recents animation and we only needed to wait on the wallpaper.
- */
- public static final int APP_TRANSITION_RECENTS_ANIM =
- AppProtoEnums.APP_TRANSITION_RECENTS_ANIM; // 5
-
- /**
- * The bundle key to extract the assist data.
- */
- public static final String ASSIST_KEY_DATA = "data";
-
- /**
- * The bundle key to extract the assist structure.
- */
- public static final String ASSIST_KEY_STRUCTURE = "structure";
-
- /**
- * The bundle key to extract the assist content.
- */
- public static final String ASSIST_KEY_CONTENT = "content";
-
- /**
- * The bundle key to extract the assist receiver extras.
- */
- public static final String ASSIST_KEY_RECEIVER_EXTRAS = "receiverExtras";
+ // Access modes for handleIncomingUser.
+ public static final int ALLOW_NON_FULL = 0;
+ public static final int ALLOW_NON_FULL_IN_PROFILE = 1;
+ public static final int ALLOW_FULL_ONLY = 2;
/**
* Grant Uri permissions from one app to another. This method only extends
@@ -118,81 +71,6 @@ public abstract class ActivityManagerInternal {
String processName, String abiOverride, int uid, Runnable crashHandler);
/**
- * Acquires a sleep token for the specified display with the specified tag.
- *
- * @param tag A string identifying the purpose of the token (eg. "Dream").
- * @param displayId The display to apply the sleep token to.
- */
- public abstract SleepToken acquireSleepToken(@NonNull String tag, int displayId);
-
- /**
- * Sleep tokens cause the activity manager to put the top activity to sleep.
- * They are used by components such as dreams that may hide and block interaction
- * with underlying activities.
- */
- public static abstract class SleepToken {
-
- /**
- * Releases the sleep token.
- */
- public abstract void release();
- }
-
- /**
- * Returns home activity for the specified user.
- *
- * @param userId ID of the user or {@link android.os.UserHandle#USER_ALL}
- */
- public abstract ComponentName getHomeActivityForUser(int userId);
-
- /**
- * Called when a user has been deleted. This can happen during normal device usage
- * or just at startup, when partially removed users are purged. Any state persisted by the
- * ActivityManager should be purged now.
- *
- * @param userId The user being cleaned up.
- */
- public abstract void onUserRemoved(int userId);
-
- public abstract void onLocalVoiceInteractionStarted(IBinder callingActivity,
- IVoiceInteractionSession mSession,
- IVoiceInteractor mInteractor);
-
- /**
- * Callback for window manager to let activity manager know that we are finally starting the
- * app transition;
- *
- * @param reasons A map from windowing mode to a reason integer why the transition was started,
- * which must be one of the APP_TRANSITION_* values.
- * @param timestamp The time at which the app transition started in
- * {@link SystemClock#uptimeMillis()} timebase.
- */
- public abstract void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp);
-
- /**
- * Callback for window manager to let activity manager know that the app transition was
- * cancelled.
- */
- public abstract void notifyAppTransitionCancelled();
-
- /**
- * Callback for window manager to let activity manager know that the app transition is finished.
- */
- public abstract void notifyAppTransitionFinished();
-
- /**
- * Returns the top activity from each of the currently visible stacks. The first entry will be
- * the focused activity.
- */
- public abstract List<IBinder> getTopVisibleActivities();
-
- /**
- * Callback for window manager to let activity manager know that docked stack changes its
- * minimized state.
- */
- public abstract void notifyDockedStackMinimizedChanged(boolean minimized);
-
- /**
* Kill foreground apps from the specified user.
*/
public abstract void killForegroundAppsForUser(int userHandle);
@@ -216,37 +94,6 @@ public abstract class ActivityManagerInternal {
boolean adding);
/**
- * Updates and persists the {@link Configuration} for a given user.
- *
- * @param values the configuration to update
- * @param userId the user to update the configuration for
- */
- public abstract void updatePersistentConfigurationForUser(@NonNull Configuration values,
- int userId);
-
- /**
- * Start activity {@code intents} as if {@code packageName} on user {@code userId} did it.
- *
- * - DO NOT call it with the calling UID cleared.
- * - All the necessary caller permission checks must be done at callsites.
- *
- * @return error codes used by {@link IActivityManager#startActivity} and its siblings.
- */
- public abstract int startActivitiesAsPackage(String packageName,
- int userId, Intent[] intents, Bundle bOptions);
-
- /**
- * Start activity {@code intent} without calling user-id check.
- *
- * - DO NOT call it with the calling UID cleared.
- * - The caller must do the calling user ID check.
- *
- * @return error codes used by {@link IActivityManager#startActivity} and its siblings.
- */
- public abstract int startActivityAsUser(IApplicationThread caller, String callingPackage,
- Intent intent, @Nullable Bundle options, int userId);
-
- /**
* Get the procstate for the UID. The return value will be between
* {@link ActivityManager#MIN_PROCESS_STATE} and {@link ActivityManager#MAX_PROCESS_STATE}.
* Note if the UID doesn't exist, it'll return {@link ActivityManager#PROCESS_STATE_NONEXISTENT}
@@ -255,25 +102,11 @@ public abstract class ActivityManagerInternal {
public abstract int getUidProcessState(int uid);
/**
- * Called when Keyguard flags might have changed.
- *
- * @param callback Callback to run after activity visibilities have been reevaluated. This can
- * be used from window manager so that when the callback is called, it's
- * guaranteed that all apps have their visibility updated accordingly.
- */
- public abstract void notifyKeyguardFlagsChanged(@Nullable Runnable callback);
-
- /**
* @return {@code true} if system is ready, {@code false} otherwise.
*/
public abstract boolean isSystemReady();
/**
- * Called when the trusted state of Keyguard has changed.
- */
- public abstract void notifyKeyguardTrustedChanged();
-
- /**
* Sets if the given pid has an overlay UI or not.
*
* @param pid The pid we are setting overlay UI for.
@@ -301,18 +134,6 @@ public abstract class ActivityManagerInternal {
public abstract void notifyNetworkPolicyRulesUpdated(int uid, long procStateSeq);
/**
- * Called after the voice interaction service has changed.
- */
- public abstract void notifyActiveVoiceInteractionServiceChanged(ComponentName component);
-
- /**
- * Called after virtual display Id is updated by
- * {@link com.android.server.vr.Vr2dDisplay} with a specific
- * {@param vr2dDisplayId}.
- */
- public abstract void setVr2dDisplayId(int vr2dDisplayId);
-
- /**
* Saves the current activity manager state and includes the saved state in the next dump of
* activity manager.
*/
@@ -324,40 +145,11 @@ public abstract class ActivityManagerInternal {
public abstract void clearSavedANRState();
/**
- * Set focus on an activity.
- * @param token The IApplicationToken for the activity
- */
- public abstract void setFocusedActivity(IBinder token);
-
- /**
- * Set a uid that is allowed to bypass stopped app switches, launching an app
- * whenever it wants.
- *
- * @param type Type of the caller -- unique string the caller supplies to identify itself
- * and disambiguate with other calles.
- * @param uid The uid of the app to be allowed, or -1 to clear the uid for this type.
- * @param userId The user it is allowed for.
- */
- public abstract void setAllowAppSwitches(@NonNull String type, int uid, int userId);
-
- /**
* @return true if runtime was restarted, false if it's normal boot
*/
public abstract boolean isRuntimeRestarted();
/**
- * Returns {@code true} if {@code uid} is running an activity from {@code packageName}.
- */
- public abstract boolean hasRunningActivity(int uid, @Nullable String packageName);
-
- public interface ScreenObserver {
- public void onAwakeStateChanged(boolean isAwake);
- public void onKeyguardStateChanged(boolean isShowing);
- }
-
- public abstract void registerScreenObserver(ScreenObserver observer);
-
- /**
* Returns if more users can be started without stopping currently running users.
*/
public abstract boolean canStartMoreUsers();
@@ -378,33 +170,69 @@ public abstract class ActivityManagerInternal {
public abstract int getMaxRunningUsers();
/**
- * Returns is the caller has the same uid as the Recents component
+ * Whether an UID is active or idle.
*/
- public abstract boolean isCallerRecents(int callingUid);
+ public abstract boolean isUidActive(int uid);
/**
- * Returns whether the recents component is the home activity for the given user.
+ * Returns a list that contains the memory stats for currently running processes.
*/
- public abstract boolean isRecentsComponentHomeActivity(int userId);
+ public abstract List<ProcessMemoryState> getMemoryStateForProcesses();
/**
- * Cancels any currently running recents animation.
+ * Checks to see if the calling pid is allowed to handle the user. Returns adjusted user id as
+ * needed.
*/
- public abstract void cancelRecentsAnimation(boolean restoreHomeStackPosition);
+ public abstract int handleIncomingUser(int callingPid, int callingUid, int userId,
+ boolean allowAll, int allowMode, String name, String callerPackage);
+
+ /** Checks if the calling binder pid as the permission. */
+ public abstract void enforceCallingPermission(String permission, String func);
+
+ /** Returns the current user id. */
+ public abstract int getCurrentUserId();
+
+ /** Returns true if the user is running. */
+ public abstract boolean isUserRunning(int userId, int flags);
+
+ /** Trims memory usage in the system by removing/stopping unused application processes. */
+ public abstract void trimApplications();
+
+ /** Returns the screen compatibility mode for the given application. */
+ public abstract int getPackageScreenCompatMode(ApplicationInfo ai);
+
+ /** Sets the screen compatibility mode for the given application. */
+ public abstract void setPackageScreenCompatMode(ApplicationInfo ai, int mode);
+
+ /** Closes all system dialogs. */
+ public abstract void closeSystemDialogs(String reason);
+
+ /** Kill the processes in the list due to their tasks been removed. */
+ public abstract void killProcessesForRemovedTask(ArrayList<Object> procsToKill);
/**
- * Whether an UID is active or idle.
+ * Returns {@code true} if {@code uid} is running an activity from {@code packageName}.
*/
- public abstract boolean isUidActive(int uid);
+ public abstract boolean hasRunningActivity(int uid, @Nullable String packageName);
+
+ public abstract void updateOomAdj();
+ public abstract void sendForegroundProfileChanged(int userId);
/**
- * Returns a list that contains the memory stats for currently running processes.
+ * Returns whether the given user requires credential entry at this time. This is used to
+ * intercept activity launches for work apps when the Work Challenge is present.
*/
- public abstract List<ProcessMemoryState> getMemoryStateForProcesses();
+ public abstract boolean shouldConfirmCredentials(int userId);
/**
- * This enforces {@code func} can only be called if either the caller is Recents activity or
- * has {@code permission}.
+ * @return The intent used to launch the home activity.
*/
- public abstract void enforceCallerIsRecentsOrHasPermission(String permission, String func);
+ public abstract Intent getHomeIntent();
+
+ public abstract int[] getCurrentProfileIds();
+ public abstract UserInfo getCurrentUser();
+ public abstract void ensureNotSpecialUser(int userId);
+ public abstract boolean isCurrentProfile(int userId);
+ public abstract boolean hasStartedUserState(int userId);
+ public abstract void finishUserSwitch(Object uss);
}
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index ecd99a7b5402..89145351655a 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -17,7 +17,7 @@
package android.app;
import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.view.Display.INVALID_DISPLAY;
@@ -302,7 +302,6 @@ public class ActivityOptions {
private int mResultCode;
private int mExitCoordinatorIndex;
private PendingIntent mUsageTimeReport;
- private boolean mLockTaskMode = false;
private int mLaunchDisplayId = INVALID_DISPLAY;
@WindowConfiguration.WindowingMode
private int mLaunchWindowingMode = WINDOWING_MODE_UNDEFINED;
@@ -310,6 +309,7 @@ public class ActivityOptions {
private int mLaunchActivityType = ACTIVITY_TYPE_UNDEFINED;
private int mLaunchTaskId = -1;
private int mSplitScreenCreateMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+ private boolean mLockTaskMode = false;
private boolean mDisallowEnterPictureInPictureWhileLaunching;
private boolean mTaskOverlay;
private boolean mTaskOverlayCanResume;
@@ -946,7 +946,7 @@ public class ActivityOptions {
mAnimationFinishedListener = IRemoteCallback.Stub.asInterface(
opts.getBinder(KEY_ANIMATION_FINISHED_LISTENER));
}
- mRotationAnimationHint = opts.getInt(KEY_ROTATION_ANIMATION_HINT);
+ mRotationAnimationHint = opts.getInt(KEY_ROTATION_ANIMATION_HINT, -1);
mAppVerificationBundle = opts.getBundle(KEY_INSTANT_APP_VERIFICATION_BUNDLE);
if (opts.containsKey(KEY_SPECS_FUTURE)) {
mSpecsFuture = IAppTransitionAnimationSpecsFuture.Stub.asInterface(opts.getBinder(
@@ -1442,17 +1442,37 @@ public class ActivityOptions {
b.putInt(KEY_EXIT_COORDINATOR_INDEX, mExitCoordinatorIndex);
break;
}
- b.putBoolean(KEY_LOCK_TASK_MODE, mLockTaskMode);
- b.putInt(KEY_LAUNCH_DISPLAY_ID, mLaunchDisplayId);
- b.putInt(KEY_LAUNCH_WINDOWING_MODE, mLaunchWindowingMode);
- b.putInt(KEY_LAUNCH_ACTIVITY_TYPE, mLaunchActivityType);
- b.putInt(KEY_LAUNCH_TASK_ID, mLaunchTaskId);
- b.putBoolean(KEY_TASK_OVERLAY, mTaskOverlay);
- b.putBoolean(KEY_TASK_OVERLAY_CAN_RESUME, mTaskOverlayCanResume);
- b.putBoolean(KEY_AVOID_MOVE_TO_FRONT, mAvoidMoveToFront);
- b.putInt(KEY_SPLIT_SCREEN_CREATE_MODE, mSplitScreenCreateMode);
- b.putBoolean(KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING,
- mDisallowEnterPictureInPictureWhileLaunching);
+ if (mLockTaskMode) {
+ b.putBoolean(KEY_LOCK_TASK_MODE, mLockTaskMode);
+ }
+ if (mLaunchDisplayId != INVALID_DISPLAY) {
+ b.putInt(KEY_LAUNCH_DISPLAY_ID, mLaunchDisplayId);
+ }
+ if (mLaunchWindowingMode != WINDOWING_MODE_UNDEFINED) {
+ b.putInt(KEY_LAUNCH_WINDOWING_MODE, mLaunchWindowingMode);
+ }
+ if (mLaunchActivityType != ACTIVITY_TYPE_UNDEFINED) {
+ b.putInt(KEY_LAUNCH_ACTIVITY_TYPE, mLaunchActivityType);
+ }
+ if (mLaunchTaskId != -1) {
+ b.putInt(KEY_LAUNCH_TASK_ID, mLaunchTaskId);
+ }
+ if (mTaskOverlay) {
+ b.putBoolean(KEY_TASK_OVERLAY, mTaskOverlay);
+ }
+ if (mTaskOverlayCanResume) {
+ b.putBoolean(KEY_TASK_OVERLAY_CAN_RESUME, mTaskOverlayCanResume);
+ }
+ if (mAvoidMoveToFront) {
+ b.putBoolean(KEY_AVOID_MOVE_TO_FRONT, mAvoidMoveToFront);
+ }
+ if (mSplitScreenCreateMode != SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT) {
+ b.putInt(KEY_SPLIT_SCREEN_CREATE_MODE, mSplitScreenCreateMode);
+ }
+ if (mDisallowEnterPictureInPictureWhileLaunching) {
+ b.putBoolean(KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING,
+ mDisallowEnterPictureInPictureWhileLaunching);
+ }
if (mAnimSpecs != null) {
b.putParcelableArray(KEY_ANIM_SPECS, mAnimSpecs);
}
@@ -1462,7 +1482,9 @@ public class ActivityOptions {
if (mSpecsFuture != null) {
b.putBinder(KEY_SPECS_FUTURE, mSpecsFuture.asBinder());
}
- b.putInt(KEY_ROTATION_ANIMATION_HINT, mRotationAnimationHint);
+ if (mRotationAnimationHint != -1) {
+ b.putInt(KEY_ROTATION_ANIMATION_HINT, mRotationAnimationHint);
+ }
if (mAppVerificationBundle != null) {
b.putBundle(KEY_INSTANT_APP_VERIFICATION_BUNDLE, mAppVerificationBundle);
}
diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java
new file mode 100644
index 000000000000..398644afd17a
--- /dev/null
+++ b/core/java/android/app/ActivityTaskManager.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import android.annotation.RequiresPermission;
+import android.annotation.SystemService;
+import android.annotation.TestApi;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Singleton;
+
+/**
+ * This class gives information about, and interacts with activities and their containers like task,
+ * stacks, and displays.
+ *
+ * @hide
+ */
+@TestApi
+@SystemService(Context.ACTIVITY_TASK_SERVICE)
+public class ActivityTaskManager {
+
+ /** Invalid stack ID. */
+ public static final int INVALID_STACK_ID = -1;
+
+ /**
+ * Parameter to {@link IActivityTaskManager#setTaskWindowingModeSplitScreenPrimary} which
+ * specifies the position of the created docked stack at the top half of the screen if
+ * in portrait mode or at the left half of the screen if in landscape mode.
+ */
+ public static final int SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT = 0;
+
+ /**
+ * Parameter to {@link IActivityTaskManager#setTaskWindowingModeSplitScreenPrimary} which
+ * specifies the position of the created docked stack at the bottom half of the screen if
+ * in portrait mode or at the right half of the screen if in landscape mode.
+ */
+ public static final int SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT = 1;
+
+ /**
+ * Input parameter to {@link IActivityTaskManager#resizeTask} which indicates
+ * that the resize doesn't need to preserve the window, and can be skipped if bounds
+ * is unchanged. This mode is used by window manager in most cases.
+ * @hide
+ */
+ public static final int RESIZE_MODE_SYSTEM = 0;
+
+ /**
+ * Input parameter to {@link IActivityTaskManager#resizeTask} which indicates
+ * that the resize should preserve the window if possible.
+ * @hide
+ */
+ public static final int RESIZE_MODE_PRESERVE_WINDOW = (0x1 << 0);
+
+ /**
+ * Input parameter to {@link IActivityTaskManager#resizeTask} used when the
+ * resize is due to a drag action.
+ * @hide
+ */
+ public static final int RESIZE_MODE_USER = RESIZE_MODE_PRESERVE_WINDOW;
+
+ /**
+ * Input parameter to {@link IActivityTaskManager#resizeTask} used by window
+ * manager during a screen rotation.
+ * @hide
+ */
+ public static final int RESIZE_MODE_SYSTEM_SCREEN_ROTATION = RESIZE_MODE_PRESERVE_WINDOW;
+
+ /**
+ * Input parameter to {@link IActivityTaskManager#resizeTask} which indicates
+ * that the resize should be performed even if the bounds appears unchanged.
+ * @hide
+ */
+ public static final int RESIZE_MODE_FORCED = (0x1 << 1);
+
+ /**
+ * Input parameter to {@link IActivityTaskManager#resizeTask} which indicates
+ * that the resize should preserve the window if possible, and should not be skipped
+ * even if the bounds is unchanged. Usually used to force a resizing when a drag action
+ * is ending.
+ * @hide
+ */
+ public static final int RESIZE_MODE_USER_FORCED =
+ RESIZE_MODE_PRESERVE_WINDOW | RESIZE_MODE_FORCED;
+
+ private static int sMaxRecentTasks = -1;
+
+ ActivityTaskManager(Context context, Handler handler) {
+ }
+
+ /** @hide */
+ public static IActivityTaskManager getService() {
+ return IActivityTaskManagerSingleton.get();
+ }
+
+ private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
+ new Singleton<IActivityTaskManager>() {
+ @Override
+ protected IActivityTaskManager create() {
+ final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
+ return IActivityTaskManager.Stub.asInterface(b);
+ }
+ };
+
+ /**
+ * Sets the windowing mode for a specific task. Only works on tasks of type
+ * {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD}
+ * @param taskId The id of the task to set the windowing mode for.
+ * @param windowingMode The windowing mode to set for the task.
+ * @param toTop If the task should be moved to the top once the windowing mode changes.
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
+ public void setTaskWindowingMode(int taskId, int windowingMode, boolean toTop)
+ throws SecurityException {
+ try {
+ getService().setTaskWindowingMode(taskId, windowingMode, toTop);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Moves the input task to the primary-split-screen stack.
+ * @param taskId Id of task to move.
+ * @param createMode The mode the primary split screen stack should be created in if it doesn't
+ * exist already. See
+ * {@link ActivityTaskManager#SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT}
+ * and
+ * {@link android.app.ActivityManager
+ * #SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT}
+ * @param toTop If the task and stack should be moved to the top.
+ * @param animate Whether we should play an animation for the moving the task
+ * @param initialBounds If the primary stack gets created, it will use these bounds for the
+ * docked stack. Pass {@code null} to use default bounds.
+ * @param showRecents If the recents activity should be shown on the other side of the task
+ * going into split-screen mode.
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
+ public void setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode, boolean toTop,
+ boolean animate, Rect initialBounds, boolean showRecents) throws SecurityException {
+ try {
+ getService().setTaskWindowingModeSplitScreenPrimary(taskId, createMode, toTop, animate,
+ initialBounds, showRecents);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Resizes the input stack id to the given bounds.
+ * @param stackId Id of the stack to resize.
+ * @param bounds Bounds to resize the stack to or {@code null} for fullscreen.
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
+ public void resizeStack(int stackId, Rect bounds) throws SecurityException {
+ try {
+ getService().resizeStack(stackId, bounds, false /* allowResizeInDockedMode */,
+ false /* preserveWindows */, false /* animate */, -1 /* animationDuration */);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Removes stacks in the windowing modes from the system if they are of activity type
+ * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
+ public void removeStacksInWindowingModes(int[] windowingModes) throws SecurityException {
+ try {
+ getService().removeStacksInWindowingModes(windowingModes);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /** Removes stack of the activity types from the system. */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
+ public void removeStacksWithActivityTypes(int[] activityTypes) throws SecurityException {
+ try {
+ getService().removeStacksWithActivityTypes(activityTypes);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Return the maximum number of recents entries that we will maintain and show.
+ * @hide
+ */
+ public static int getMaxRecentTasksStatic() {
+ if (sMaxRecentTasks < 0) {
+ return sMaxRecentTasks = ActivityManager.isLowRamDeviceStatic() ? 36 : 48;
+ }
+ return sMaxRecentTasks;
+ }
+
+ /**
+ * Return the default limit on the number of recents that an app can make.
+ * @hide
+ */
+ public static int getDefaultAppRecentsLimitStatic() {
+ return getMaxRecentTasksStatic() / 6;
+ }
+
+ /**
+ * Return the maximum limit on the number of recents that an app can make.
+ * @hide
+ */
+ public static int getMaxAppRecentsLimitStatic() {
+ return getMaxRecentTasksStatic() / 2;
+ }
+
+ /**
+ * Returns true if the system supports at least one form of multi-window.
+ * E.g. freeform, split-screen, picture-in-picture.
+ */
+ public static boolean supportsMultiWindow(Context context) {
+ // On watches, multi-window is used to present essential system UI, and thus it must be
+ // supported regardless of device memory characteristics.
+ boolean isWatch = context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_WATCH);
+ return (!ActivityManager.isLowRamDeviceStatic() || isWatch)
+ && Resources.getSystem().getBoolean(
+ com.android.internal.R.bool.config_supportsMultiWindow);
+ }
+
+ /** Returns true if the system supports split screen multi-window. */
+ public static boolean supportsSplitScreenMultiWindow(Context context) {
+ return supportsMultiWindow(context)
+ && Resources.getSystem().getBoolean(
+ com.android.internal.R.bool.config_supportsSplitScreenMultiWindow);
+ }
+}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index cb67ddff220c..d9ae349f2c04 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -35,6 +35,7 @@ import android.app.servertransaction.ActivityLifecycleItem.LifecycleState;
import android.app.servertransaction.ActivityRelaunchItem;
import android.app.servertransaction.ActivityResultItem;
import android.app.servertransaction.ClientTransaction;
+import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.PendingTransactionActions;
import android.app.servertransaction.PendingTransactionActions.StopInfo;
import android.app.servertransaction.TransactionExecutor;
@@ -94,6 +95,7 @@ import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.Process;
+import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
@@ -176,6 +178,7 @@ import java.net.InetAddress;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -257,6 +260,8 @@ public final class ActivityThread extends ClientTransactionHandler {
final H mH = new H();
final Executor mExecutor = new HandlerExecutor(mH);
final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();
+ final Map<IBinder, ClientTransactionItem> mActivitiesToBeDestroyed =
+ Collections.synchronizedMap(new ArrayMap<IBinder, ClientTransactionItem>());
// List of new activities (via ActivityRecord.nextIdle) that should
// be reported when next we idle.
ActivityClientRecord mNewActivities = null;
@@ -740,6 +745,7 @@ public final class ActivityThread extends ClientTransactionHandler {
public boolean runGc;
String path;
ParcelFileDescriptor fd;
+ RemoteCallback finishCallback;
}
static final class UpdateCompatibilityData {
@@ -999,13 +1005,14 @@ public final class ActivityThread extends ClientTransactionHandler {
@Override
public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String path,
- ParcelFileDescriptor fd) {
+ ParcelFileDescriptor fd, RemoteCallback finishCallback) {
DumpHeapData dhd = new DumpHeapData();
dhd.managed = managed;
dhd.mallocInfo = mallocInfo;
dhd.runGc = runGc;
dhd.path = path;
dhd.fd = fd;
+ dhd.finishCallback = finishCallback;
sendMessage(H.DUMP_HEAP, dhd, 0, 0, true /*async*/);
}
@@ -1838,7 +1845,7 @@ public final class ActivityThread extends ClientTransactionHandler {
}
if (a != null) {
mNewActivities = null;
- IActivityManager am = ActivityManager.getService();
+ IActivityTaskManager am = ActivityTaskManager.getService();
ActivityClientRecord prev;
do {
if (localLOGV) Slog.v(
@@ -2991,7 +2998,7 @@ public final class ActivityThread extends ClientTransactionHandler {
private ContextImpl createBaseContextForActivity(ActivityClientRecord r) {
final int displayId;
try {
- displayId = ActivityManager.getService().getActivityDisplayId(r.token);
+ displayId = ActivityTaskManager.getService().getActivityDisplayId(r.token);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -3059,7 +3066,7 @@ public final class ActivityThread extends ClientTransactionHandler {
} else {
// If there was an error, for any reason, tell the activity manager to stop us.
try {
- ActivityManager.getService()
+ ActivityTaskManager.getService()
.finishActivity(r.token, Activity.RESULT_CANCELED, null,
Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
} catch (RemoteException ex) {
@@ -3091,7 +3098,7 @@ public final class ActivityThread extends ClientTransactionHandler {
}
}
try {
- ActivityManager.getService().reportSizeConfigurations(r.token,
+ ActivityTaskManager.getService().reportSizeConfigurations(r.token,
horizontal.copyKeys(), vertical.copyKeys(), smallest.copyKeys());
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
@@ -3208,7 +3215,7 @@ public final class ActivityThread extends ClientTransactionHandler {
structure.setAcquisitionEndTime(SystemClock.uptimeMillis());
mLastAssistStructures.add(new WeakReference<>(structure));
- IActivityManager mgr = ActivityManager.getService();
+ IActivityTaskManager mgr = ActivityTaskManager.getService();
try {
mgr.reportAssistContextExtras(cmd.requestToken, data, structure, content, referrer);
} catch (RemoteException e) {
@@ -3836,7 +3843,7 @@ public final class ActivityThread extends ClientTransactionHandler {
boolean willBeVisible = !a.mStartedActivity;
if (!willBeVisible) {
try {
- willBeVisible = ActivityManager.getService().willActivityBeVisible(
+ willBeVisible = ActivityTaskManager.getService().willActivityBeVisible(
a.getActivityToken());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -4141,7 +4148,7 @@ public final class ActivityThread extends ClientTransactionHandler {
}
try {
- r.activity.performStop(false /*preserveWindow*/, reason);
+ r.activity.performStop(r.mPreserveWindow, reason);
} catch (SuperNotCalledException e) {
throw e;
} catch (Exception e) {
@@ -4288,7 +4295,7 @@ public final class ActivityThread extends ClientTransactionHandler {
// Tell activity manager we slept.
try {
- ActivityManager.getService().activitySlept(r.token);
+ ActivityTaskManager.getService().activitySlept(r.token);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
@@ -4472,6 +4479,11 @@ public final class ActivityThread extends ClientTransactionHandler {
}
@Override
+ public Map<IBinder, ClientTransactionItem> getActivitiesToBeDestroyed() {
+ return mActivitiesToBeDestroyed;
+ }
+
+ @Override
public void handleDestroyActivity(IBinder token, boolean finishing, int configChanges,
boolean getNonConfigInstance, String reason) {
ActivityClientRecord r = performDestroyActivity(token, finishing,
@@ -4535,7 +4547,7 @@ public final class ActivityThread extends ClientTransactionHandler {
}
if (finishing) {
try {
- ActivityManager.getService().activityDestroyed(token);
+ ActivityTaskManager.getService().activityDestroyed(token);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
@@ -4788,7 +4800,7 @@ public final class ActivityThread extends ClientTransactionHandler {
@Override
public void reportRelaunch(IBinder token, PendingTransactionActions pendingActions) {
try {
- ActivityManager.getService().activityRelaunched(token);
+ ActivityTaskManager.getService().activityRelaunched(token);
final ActivityClientRecord r = mActivities.get(token);
if (pendingActions.shouldReportRelaunchToWindowManager() && r != null
&& r.window != null) {
@@ -5311,6 +5323,9 @@ public final class ActivityThread extends ClientTransactionHandler {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
+ if (dhd.finishCallback != null) {
+ dhd.finishCallback.sendResult(null);
+ }
}
final void handleDispatchPackageBroadcast(int cmd, String[] packages) {
@@ -6532,7 +6547,7 @@ public final class ActivityThread extends ClientTransactionHandler {
+ " used=" + (dalvikUsed/1024));
mSomeActivitiesChanged = false;
try {
- mgr.releaseSomeActivities(mAppThread);
+ ActivityTaskManager.getService().releaseSomeActivities(mAppThread);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
index e469098e22d5..c7fa33d1745d 100644
--- a/core/java/android/app/ActivityView.java
+++ b/core/java/android/app/ActivityView.java
@@ -64,6 +64,7 @@ public class ActivityView extends ViewGroup {
private StateCallback mActivityViewCallback;
private IActivityManager mActivityManager;
+ private IActivityTaskManager mActivityTaskManager;
private IInputForwarder mInputForwarder;
// Temp container to store view coordinates on screen.
private final int[] mLocationOnScreen = new int[2];
@@ -85,6 +86,7 @@ public class ActivityView extends ViewGroup {
super(context, attrs, defStyle);
mActivityManager = ActivityManager.getService();
+ mActivityTaskManager = ActivityTaskManager.getService();
mSurfaceView = new SurfaceView(context);
mSurfaceCallback = new SurfaceCallback();
mSurfaceView.getHolder().addCallback(mSurfaceCallback);
@@ -349,7 +351,7 @@ public class ActivityView extends ViewGroup {
mInputForwarder = InputManager.getInstance().createInputForwarder(displayId);
mTaskStackListener = new TaskStackListenerImpl();
try {
- mActivityManager.registerTaskStackListener(mTaskStackListener);
+ mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
} catch (RemoteException e) {
Log.e(TAG, "Failed to register task stack listener", e);
}
@@ -369,7 +371,7 @@ public class ActivityView extends ViewGroup {
if (mTaskStackListener != null) {
try {
- mActivityManager.unregisterTaskStackListener(mTaskStackListener);
+ mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener);
} catch (RemoteException e) {
Log.e(TAG, "Failed to unregister task stack listener", e);
}
@@ -474,7 +476,7 @@ public class ActivityView extends ViewGroup {
// Find the topmost task on our virtual display - it will define the background
// color of the surface view during resizing.
final int displayId = mVirtualDisplay.getDisplay().getDisplayId();
- final List<StackInfo> stackInfoList = mActivityManager.getAllStackInfos();
+ final List<StackInfo> stackInfoList = mActivityTaskManager.getAllStackInfos();
// Iterate through stacks from top to bottom.
final int stackCount = stackInfoList.size();
diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java
index 124f9338f781..f76f911db99b 100644
--- a/core/java/android/app/AlarmManager.java
+++ b/core/java/android/app/AlarmManager.java
@@ -28,7 +28,6 @@ import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
-import android.os.UserHandle;
import android.os.WorkSource;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -958,6 +957,7 @@ public class AlarmManager {
*
* @param millis time in milliseconds since the Epoch
*/
+ @RequiresPermission(android.Manifest.permission.SET_TIME)
public void setTime(long millis) {
try {
mService.setTime(millis);
@@ -981,6 +981,7 @@ public class AlarmManager {
* @param timeZone one of the Olson ids from the list returned by
* {@link java.util.TimeZone#getAvailableIDs}
*/
+ @RequiresPermission(android.Manifest.permission.SET_TIME_ZONE)
public void setTimeZone(String timeZone) {
if (TextUtils.isEmpty(timeZone)) {
return;
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index c58b91e39d0f..c3404a5c79e2 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -114,7 +114,6 @@ public class AppOpsManager {
* returned from {@link #checkOp}, {@link #noteOp}, {@link #startOp}; rather, when this
* mode is set, these functions will return {@link #MODE_ALLOWED} when the app being
* checked is currently in the foreground, otherwise {@link #MODE_IGNORED}.
- * @hide
*/
public static final int MODE_FOREGROUND = 4;
@@ -122,7 +121,6 @@ public class AppOpsManager {
* Flag for {@link #startWatchingMode(String, String, int, OnOpChangedListener)}:
* Also get reports if the foreground state of an op's uid changes. This only works
* when watching a particular op, not when watching a package.
- * @hide
*/
public static final int WATCH_FOREGROUND_CHANGES = 1 << 0;
@@ -352,8 +350,10 @@ public class AppOpsManager {
public static final int OP_START_FOREGROUND = 76;
/** @hide */
public static final int OP_BLUETOOTH_SCAN = 77;
+ /** @hide Use the face authentication API. */
+ public static final int OP_USE_FACE = 78;
/** @hide */
- public static final int _NUM_OP = 78;
+ public static final int _NUM_OP = 79;
/** Access to coarse location information. */
public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -598,6 +598,9 @@ public class AppOpsManager {
/** @hide */
public static final String OPSTR_BLUETOOTH_SCAN = "android:bluetooth_scan";
+ /** @hide Use the face authentication API. */
+ public static final String OPSTR_USE_FACE = "android:use_face";
+
// Warning: If an permission is added here it also has to be added to
// com.android.packageinstaller.permission.utils.EventLogger
private static final int[] RUNTIME_AND_APPOP_PERMISSIONS_OPS = {
@@ -735,6 +738,7 @@ public class AppOpsManager {
OP_MANAGE_IPSEC_TUNNELS, // MANAGE_IPSEC_HANDOVERS
OP_START_FOREGROUND, // START_FOREGROUND
OP_COARSE_LOCATION, // BLUETOOTH_SCAN
+ OP_USE_FACE, // FACE
};
/**
@@ -819,6 +823,7 @@ public class AppOpsManager {
OPSTR_MANAGE_IPSEC_TUNNELS,
OPSTR_START_FOREGROUND,
OPSTR_BLUETOOTH_SCAN,
+ OPSTR_USE_FACE,
};
/**
@@ -904,6 +909,7 @@ public class AppOpsManager {
"MANAGE_IPSEC_TUNNELS",
"START_FOREGROUND",
"BLUETOOTH_SCAN",
+ "USE_FACE",
};
/**
@@ -989,6 +995,7 @@ public class AppOpsManager {
null, // no permission for OP_MANAGE_IPSEC_TUNNELS
Manifest.permission.FOREGROUND_SERVICE,
null, // no permission for OP_BLUETOOTH_SCAN
+ Manifest.permission.USE_BIOMETRIC,
};
/**
@@ -1075,6 +1082,7 @@ public class AppOpsManager {
null, // MANAGE_IPSEC_TUNNELS
null, // START_FOREGROUND
null, // maybe should be UserManager.DISALLOW_SHARE_LOCATION, //BLUETOOTH_SCAN
+ null, // USE_FACE
};
/**
@@ -1160,6 +1168,7 @@ public class AppOpsManager {
false, // MANAGE_IPSEC_HANDOVERS
false, // START_FOREGROUND
true, // BLUETOOTH_SCAN
+ false, // USE_FACE
};
/**
@@ -1244,6 +1253,7 @@ public class AppOpsManager {
AppOpsManager.MODE_ERRORED, // MANAGE_IPSEC_TUNNELS
AppOpsManager.MODE_ALLOWED, // OP_START_FOREGROUND
AppOpsManager.MODE_ALLOWED, // OP_BLUETOOTH_SCAN
+ AppOpsManager.MODE_ALLOWED, // USE_FACE
};
/**
@@ -1332,6 +1342,7 @@ public class AppOpsManager {
false, // MANAGE_IPSEC_TUNNELS
false, // START_FOREGROUND
false, // BLUETOOTH_SCAN
+ false, // USE_FACE
};
/**
@@ -1422,6 +1433,7 @@ public class AppOpsManager {
* Retrieve the permission associated with an operation, or null if there is not one.
* @hide
*/
+ @TestApi
public static String opToPermission(int op) {
return sOpPerms[op];
}
@@ -1440,6 +1452,7 @@ public class AppOpsManager {
* to the corresponding app op.
* @hide
*/
+ @TestApi
public static int permissionToOpCode(String permission) {
Integer boxedOpCode = sPermToOp.get(permission);
return boxedOpCode != null ? boxedOpCode : OP_NONE;
@@ -1485,11 +1498,15 @@ public class AppOpsManager {
* Class holding all of the operation information associated with an app.
* @hide
*/
- public static class PackageOps implements Parcelable {
+ @SystemApi
+ public static final class PackageOps implements Parcelable {
private final String mPackageName;
private final int mUid;
private final List<OpEntry> mEntries;
+ /**
+ * @hide
+ */
public PackageOps(String packageName, int uid, List<OpEntry> entries) {
mPackageName = packageName;
mUid = uid;
@@ -1548,7 +1565,8 @@ public class AppOpsManager {
* Class holding the information about one unique operation of an application.
* @hide
*/
- public static class OpEntry implements Parcelable {
+ @SystemApi
+ public static final class OpEntry implements Parcelable {
private final int mOp;
private final int mMode;
private final long[] mTimes;
@@ -1558,6 +1576,9 @@ public class AppOpsManager {
private final boolean mRunning;
private final String mProxyPackageName;
+ /**
+ * @hide
+ */
public OpEntry(int op, int mode, long time, long rejectTime, int duration,
int proxyUid, String proxyPackage) {
mOp = op;
@@ -1572,6 +1593,9 @@ public class AppOpsManager {
mProxyPackageName = proxyPackage;
}
+ /**
+ * @hide
+ */
public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration,
boolean running, int proxyUid, String proxyPackage) {
mOp = op;
@@ -1586,55 +1610,104 @@ public class AppOpsManager {
mProxyPackageName = proxyPackage;
}
+ /**
+ * @hide
+ */
public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration,
int proxyUid, String proxyPackage) {
this(op, mode, times, rejectTimes, duration, duration == -1, proxyUid, proxyPackage);
}
+ /**
+ * @hide
+ */
public int getOp() {
return mOp;
}
+ /**
+ * Return this entry's op string name, such as {@link #OPSTR_COARSE_LOCATION}.
+ */
+ public String getOpStr() {
+ return sOpToString[mOp];
+ }
+
+ /**
+ * Return this entry's current mode, such as {@link #MODE_ALLOWED}.
+ */
public int getMode() {
return mMode;
}
+ /**
+ * @hide
+ */
public long getTime() {
return maxTime(mTimes, 0, _NUM_UID_STATE);
}
+ /**
+ * Return the last wall clock time this op was accessed by the app.
+ */
public long getLastAccessTime() {
return maxTime(mTimes, 0, _NUM_UID_STATE);
}
+ /**
+ * Return the last wall clock time this op was accessed by the app while in the foreground.
+ */
public long getLastAccessForegroundTime() {
return maxTime(mTimes, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
}
+ /**
+ * Return the last wall clock time this op was accessed by the app while in the background.
+ */
public long getLastAccessBackgroundTime() {
return maxTime(mTimes, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
}
+ /**
+ * @hide
+ */
public long getLastTimeFor(int uidState) {
return mTimes[uidState];
}
+ /**
+ * @hide
+ */
public long getRejectTime() {
return maxTime(mRejectTimes, 0, _NUM_UID_STATE);
}
+ /**
+ * Return the last wall clock time the app made an attempt to access this op but
+ * was rejected.
+ */
public long getLastRejectTime() {
return maxTime(mRejectTimes, 0, _NUM_UID_STATE);
}
+ /**
+ * Return the last wall clock time the app made an attempt to access this op while in
+ * the foreground but was rejected.
+ */
public long getLastRejectForegroundTime() {
return maxTime(mRejectTimes, UID_STATE_PERSISTENT, UID_STATE_LAST_NON_RESTRICTED + 1);
}
+ /**
+ * Return the last wall clock time the app made an attempt to access this op while in
+ * the background but was rejected.
+ */
public long getLastRejectBackgroundTime() {
return maxTime(mRejectTimes, UID_STATE_LAST_NON_RESTRICTED + 1, _NUM_UID_STATE);
}
+ /**
+ * @hide
+ */
public long getLastRejectTimeFor(int uidState) {
return mRejectTimes[uidState];
}
@@ -1757,6 +1830,7 @@ public class AppOpsManager {
* @param ops The set of operations you are interested in, or null if you want all of them.
* @hide
*/
+ @SystemApi
@RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS)
public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) {
try {
@@ -1929,7 +2003,6 @@ public class AppOpsManager {
* @param packageName The name of the application to monitor.
* @param flags Option flags: any combination of {@link #WATCH_FOREGROUND_CHANGES} or 0.
* @param callback Where to report changes.
- * @hide
*/
public void startWatchingMode(String op, String packageName, int flags,
final OnOpChangedListener callback) {
@@ -2088,6 +2161,7 @@ public class AppOpsManager {
/**
* {@hide}
*/
+ @TestApi
public static int strOpToOp(String op) {
Integer val = sOpStrToOp.get(op);
if (val == null) {
@@ -2123,6 +2197,14 @@ public class AppOpsManager {
* causing the app to crash).
* @throws SecurityException If the app has been configured to crash on this op.
*/
+ public int unsafeCheckOp(String op, int uid, String packageName) {
+ return checkOp(strOpToOp(op), uid, packageName);
+ }
+
+ /**
+ * @deprecated Renamed to {@link #unsafeCheckOp(String, int, String)}.
+ */
+ @Deprecated
public int checkOp(String op, int uid, String packageName) {
return checkOp(strOpToOp(op), uid, packageName);
}
@@ -2131,6 +2213,14 @@ public class AppOpsManager {
* Like {@link #checkOp} but instead of throwing a {@link SecurityException} it
* returns {@link #MODE_ERRORED}.
*/
+ public int unsafeCheckOpNoThrow(String op, int uid, String packageName) {
+ return checkOpNoThrow(strOpToOp(op), uid, packageName);
+ }
+
+ /**
+ * @deprecated Renamed to {@link #unsafeCheckOpNoThrow(String, int, String)}.
+ */
+ @Deprecated
public int checkOpNoThrow(String op, int uid, String packageName) {
return checkOpNoThrow(strOpToOp(op), uid, packageName);
}
@@ -2138,7 +2228,6 @@ public class AppOpsManager {
/**
* Like {@link #checkOp} but returns the <em>raw</em> mode associated with the op.
* Does not throw a security exception, does not translate {@link #MODE_FOREGROUND}.
- * @hide
*/
public int unsafeCheckOpRaw(String op, int uid, String packageName) {
try {
@@ -2398,7 +2487,7 @@ public class AppOpsManager {
*/
public int noteProxyOpNoThrow(int op, String proxiedPackageName) {
try {
- return mService.noteProxyOperation(op, mContext.getOpPackageName(),
+ return mService.noteProxyOperation(op, Process.myUid(), mContext.getOpPackageName(),
Binder.getCallingUid(), proxiedPackageName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -2577,6 +2666,16 @@ public class AppOpsManager {
return Arrays.copyOf(sOpToString, sOpToString.length);
}
+
+ /**
+ * @return number of App ops
+ * @hide
+ */
+ @TestApi
+ public static int getNumOps() {
+ return _NUM_OP;
+ }
+
/**
* @hide
*/
diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java
index 24c5d234c120..f5d5e6e9a950 100644
--- a/core/java/android/app/AppOpsManagerInternal.java
+++ b/core/java/android/app/AppOpsManagerInternal.java
@@ -18,12 +18,55 @@ package android.app;
import android.util.SparseIntArray;
+import com.android.internal.util.function.QuadFunction;
+import com.android.internal.util.function.TriFunction;
+
/**
* App ops service local interface.
*
* @hide Only for use within the system server.
*/
public abstract class AppOpsManagerInternal {
+ /** Interface to override app ops checks via composition */
+ public interface CheckOpsDelegate {
+ /**
+ * Allows overriding check operation behavior.
+ *
+ * @param code The op code to check.
+ * @param uid The UID for which to check.
+ * @param packageName The package for which to check.
+ * @param superImpl The super implementation.
+ * @return The app op check result.
+ */
+ int checkOperation(int code, int uid, String packageName,
+ TriFunction<Integer, Integer, String, Integer> superImpl);
+
+ /**
+ * Allows overriding check audio operation behavior.
+ *
+ * @param code The op code to check.
+ * @param usage The audio op usage.
+ * @param uid The UID for which to check.
+ * @param packageName The package for which to check.
+ * @param superImpl The super implementation.
+ * @return The app op check result.
+ */
+ int checkAudioOperation(int code, int usage, int uid, String packageName,
+ QuadFunction<Integer, Integer, Integer, String, Integer> superImpl);
+
+ /**
+ * Allows overriding note operation behavior.
+ *
+ * @param code The op code to note.
+ * @param uid The UID for which to note.
+ * @param packageName The package for which to note.
+ * @param superImpl The super implementation.
+ * @return The app op note result.
+ */
+ int noteOperation(int code, int uid, String packageName,
+ TriFunction<Integer, Integer, String, Integer> superImpl);
+ }
+
/**
* Set the currently configured device and profile owners. Specifies the package uid (value)
* that has been configured for each user (key) that has one. These will be allowed privileged
diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java
index 4531f53bd86f..6a58d9b0de36 100644
--- a/core/java/android/app/Application.java
+++ b/core/java/android/app/Application.java
@@ -17,6 +17,8 @@
package android.app;
import android.annotation.CallSuper;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.ComponentCallbacks;
import android.content.ComponentCallbacks2;
import android.content.Context;
@@ -58,13 +60,13 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
public LoadedApk mLoadedApk;
public interface ActivityLifecycleCallbacks {
- void onActivityCreated(Activity activity, Bundle savedInstanceState);
- void onActivityStarted(Activity activity);
- void onActivityResumed(Activity activity);
- void onActivityPaused(Activity activity);
- void onActivityStopped(Activity activity);
- void onActivitySaveInstanceState(Activity activity, Bundle outState);
- void onActivityDestroyed(Activity activity);
+ void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState);
+ void onActivityStarted(@NonNull Activity activity);
+ void onActivityResumed(@NonNull Activity activity);
+ void onActivityPaused(@NonNull Activity activity);
+ void onActivityStopped(@NonNull Activity activity);
+ void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState);
+ void onActivityDestroyed(@NonNull Activity activity);
}
/**
@@ -213,7 +215,8 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
}
- /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
+ /* package */ void dispatchActivityCreated(@NonNull Activity activity,
+ @Nullable Bundle savedInstanceState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
@@ -223,7 +226,7 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
}
}
- /* package */ void dispatchActivityStarted(Activity activity) {
+ /* package */ void dispatchActivityStarted(@NonNull Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
@@ -232,7 +235,7 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
}
}
- /* package */ void dispatchActivityResumed(Activity activity) {
+ /* package */ void dispatchActivityResumed(@NonNull Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
@@ -241,7 +244,7 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
}
}
- /* package */ void dispatchActivityPaused(Activity activity) {
+ /* package */ void dispatchActivityPaused(@NonNull Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
@@ -250,7 +253,7 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
}
}
- /* package */ void dispatchActivityStopped(Activity activity) {
+ /* package */ void dispatchActivityStopped(@NonNull Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
@@ -259,7 +262,8 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
}
}
- /* package */ void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) {
+ /* package */ void dispatchActivitySaveInstanceState(@NonNull Activity activity,
+ @NonNull Bundle outState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
@@ -269,7 +273,7 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
}
}
- /* package */ void dispatchActivityDestroyed(Activity activity) {
+ /* package */ void dispatchActivityDestroyed(@NonNull Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 0e4483312fd2..344610a5375f 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -73,6 +73,7 @@ import android.os.Message;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteException;
+import android.os.StrictMode;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
@@ -149,15 +150,16 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public PackageInfo getPackageInfo(String packageName, int flags)
throws NameNotFoundException {
- return getPackageInfoAsUser(packageName, flags, mContext.getUserId());
+ return getPackageInfoAsUser(packageName, flags, getUserId());
}
@Override
public PackageInfo getPackageInfo(VersionedPackage versionedPackage, int flags)
throws NameNotFoundException {
+ final int userId = getUserId();
try {
- PackageInfo pi = mPM.getPackageInfoVersioned(versionedPackage, flags,
- mContext.getUserId());
+ PackageInfo pi = mPM.getPackageInfoVersioned(versionedPackage,
+ updateFlagsForPackage(flags, userId), userId);
if (pi != null) {
return pi;
}
@@ -171,7 +173,8 @@ public class ApplicationPackageManager extends PackageManager {
public PackageInfo getPackageInfoAsUser(String packageName, int flags, int userId)
throws NameNotFoundException {
try {
- PackageInfo pi = mPM.getPackageInfo(packageName, flags, userId);
+ PackageInfo pi = mPM.getPackageInfo(packageName,
+ updateFlagsForPackage(flags, userId), userId);
if (pi != null) {
return pi;
}
@@ -262,8 +265,10 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public int[] getPackageGids(String packageName, int flags)
throws NameNotFoundException {
+ final int userId = getUserId();
try {
- int[] gids = mPM.getPackageGids(packageName, flags, mContext.getUserId());
+ int[] gids = mPM.getPackageGids(packageName,
+ updateFlagsForPackage(flags, userId), userId);
if (gids != null) {
return gids;
}
@@ -276,7 +281,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public int getPackageUid(String packageName, int flags) throws NameNotFoundException {
- return getPackageUidAsUser(packageName, flags, mContext.getUserId());
+ return getPackageUidAsUser(packageName, flags, getUserId());
}
@Override
@@ -288,7 +293,8 @@ public class ApplicationPackageManager extends PackageManager {
public int getPackageUidAsUser(String packageName, int flags, int userId)
throws NameNotFoundException {
try {
- int uid = mPM.getPackageUid(packageName, flags, userId);
+ int uid = mPM.getPackageUid(packageName,
+ updateFlagsForPackage(flags, userId), userId);
if (uid >= 0) {
return uid;
}
@@ -374,14 +380,15 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ApplicationInfo getApplicationInfo(String packageName, int flags)
throws NameNotFoundException {
- return getApplicationInfoAsUser(packageName, flags, mContext.getUserId());
+ return getApplicationInfoAsUser(packageName, flags, getUserId());
}
@Override
public ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId)
throws NameNotFoundException {
try {
- ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, userId);
+ ApplicationInfo ai = mPM.getApplicationInfo(packageName,
+ updateFlagsForApplication(flags, userId), userId);
if (ai != null) {
// This is a temporary hack. Callers must use
// createPackageContext(packageName).getApplicationInfo() to
@@ -423,8 +430,10 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ActivityInfo getActivityInfo(ComponentName className, int flags)
throws NameNotFoundException {
+ final int userId = getUserId();
try {
- ActivityInfo ai = mPM.getActivityInfo(className, flags, mContext.getUserId());
+ ActivityInfo ai = mPM.getActivityInfo(className,
+ updateFlagsForComponent(flags, userId, null), userId);
if (ai != null) {
return ai;
}
@@ -438,8 +447,10 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ActivityInfo getReceiverInfo(ComponentName className, int flags)
throws NameNotFoundException {
+ final int userId = getUserId();
try {
- ActivityInfo ai = mPM.getReceiverInfo(className, flags, mContext.getUserId());
+ ActivityInfo ai = mPM.getReceiverInfo(className,
+ updateFlagsForComponent(flags, userId, null), userId);
if (ai != null) {
return ai;
}
@@ -453,8 +464,10 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ServiceInfo getServiceInfo(ComponentName className, int flags)
throws NameNotFoundException {
+ final int userId = getUserId();
try {
- ServiceInfo si = mPM.getServiceInfo(className, flags, mContext.getUserId());
+ ServiceInfo si = mPM.getServiceInfo(className,
+ updateFlagsForComponent(flags, userId, null), userId);
if (si != null) {
return si;
}
@@ -468,8 +481,10 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ProviderInfo getProviderInfo(ComponentName className, int flags)
throws NameNotFoundException {
+ final int userId = getUserId();
try {
- ProviderInfo pi = mPM.getProviderInfo(className, flags, mContext.getUserId());
+ ProviderInfo pi = mPM.getProviderInfo(className,
+ updateFlagsForComponent(flags, userId, null), userId);
if (pi != null) {
return pi;
}
@@ -492,7 +507,7 @@ public class ApplicationPackageManager extends PackageManager {
/** @hide */
@Override
public @NonNull List<SharedLibraryInfo> getSharedLibraries(int flags) {
- return getSharedLibrariesAsUser(flags, mContext.getUserId());
+ return getSharedLibrariesAsUser(flags, getUserId());
}
/** @hide */
@@ -535,7 +550,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ChangedPackages getChangedPackages(int sequenceNumber) {
try {
- return mPM.getChangedPackages(sequenceNumber, mContext.getUserId());
+ return mPM.getChangedPackages(sequenceNumber, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -578,7 +593,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public int checkPermission(String permName, String pkgName) {
try {
- return mPM.checkPermission(permName, pkgName, mContext.getUserId());
+ return mPM.checkPermission(permName, pkgName, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -587,7 +602,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
try {
- return mPM.isPermissionRevokedByPolicy(permName, pkgName, mContext.getUserId());
+ return mPM.isPermissionRevokedByPolicy(permName, pkgName, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -681,7 +696,7 @@ public class ApplicationPackageManager extends PackageManager {
public boolean shouldShowRequestPermissionRationale(String permission) {
try {
return mPM.shouldShowRequestPermissionRationale(permission,
- mContext.getPackageName(), mContext.getUserId());
+ mContext.getPackageName(), getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -769,7 +784,7 @@ public class ApplicationPackageManager extends PackageManager {
@SuppressWarnings("unchecked")
@Override
public List<PackageInfo> getInstalledPackages(int flags) {
- return getInstalledPackagesAsUser(flags, mContext.getUserId());
+ return getInstalledPackagesAsUser(flags, getUserId());
}
/** @hide */
@@ -778,7 +793,7 @@ public class ApplicationPackageManager extends PackageManager {
public List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) {
try {
ParceledListSlice<PackageInfo> parceledList =
- mPM.getInstalledPackages(flags, userId);
+ mPM.getInstalledPackages(updateFlagsForPackage(flags, userId), userId);
if (parceledList == null) {
return Collections.emptyList();
}
@@ -792,10 +807,11 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public List<PackageInfo> getPackagesHoldingPermissions(
String[] permissions, int flags) {
- final int userId = mContext.getUserId();
+ final int userId = getUserId();
try {
ParceledListSlice<PackageInfo> parceledList =
- mPM.getPackagesHoldingPermissions(permissions, flags, userId);
+ mPM.getPackagesHoldingPermissions(permissions,
+ updateFlagsForPackage(flags, userId), userId);
if (parceledList == null) {
return Collections.emptyList();
}
@@ -808,7 +824,7 @@ public class ApplicationPackageManager extends PackageManager {
@SuppressWarnings("unchecked")
@Override
public List<ApplicationInfo> getInstalledApplications(int flags) {
- return getInstalledApplicationsAsUser(flags, mContext.getUserId());
+ return getInstalledApplicationsAsUser(flags, getUserId());
}
/** @hide */
@@ -817,7 +833,7 @@ public class ApplicationPackageManager extends PackageManager {
public List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
try {
ParceledListSlice<ApplicationInfo> parceledList =
- mPM.getInstalledApplications(flags, userId);
+ mPM.getInstalledApplications(updateFlagsForApplication(flags, userId), userId);
if (parceledList == null) {
return Collections.emptyList();
}
@@ -832,8 +848,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public List<InstantAppInfo> getInstantApps() {
try {
- ParceledListSlice<InstantAppInfo> slice =
- mPM.getInstantApps(mContext.getUserId());
+ ParceledListSlice<InstantAppInfo> slice = mPM.getInstantApps(getUserId());
if (slice != null) {
return slice.getList();
}
@@ -847,8 +862,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public Drawable getInstantAppIcon(String packageName) {
try {
- Bitmap bitmap = mPM.getInstantAppIcon(
- packageName, mContext.getUserId());
+ Bitmap bitmap = mPM.getInstantAppIcon(packageName, getUserId());
if (bitmap != null) {
return new BitmapDrawable(null, bitmap);
}
@@ -866,7 +880,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean isInstantApp(String packageName) {
try {
- return mPM.isInstantApp(packageName, mContext.getUserId());
+ return mPM.isInstantApp(packageName, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -886,8 +900,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public @NonNull byte[] getInstantAppCookie() {
try {
- final byte[] cookie = mPM.getInstantAppCookie(
- mContext.getPackageName(), mContext.getUserId());
+ final byte[] cookie = mPM.getInstantAppCookie(mContext.getPackageName(), getUserId());
if (cookie != null) {
return cookie;
} else {
@@ -910,8 +923,7 @@ public class ApplicationPackageManager extends PackageManager {
+ getInstantAppCookieMaxBytes());
}
try {
- mPM.setInstantAppCookie(mContext.getPackageName(),
- cookie, mContext.getUserId());
+ mPM.setInstantAppCookie(mContext.getPackageName(), cookie, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -920,8 +932,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean setInstantAppCookie(@NonNull byte[] cookie) {
try {
- return mPM.setInstantAppCookie(mContext.getPackageName(),
- cookie, mContext.getUserId());
+ return mPM.setInstantAppCookie(mContext.getPackageName(), cookie, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -929,7 +940,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ResolveInfo resolveActivity(Intent intent, int flags) {
- return resolveActivityAsUser(intent, flags, mContext.getUserId());
+ return resolveActivityAsUser(intent, flags, getUserId());
}
@Override
@@ -938,7 +949,7 @@ public class ApplicationPackageManager extends PackageManager {
return mPM.resolveIntent(
intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags,
+ updateFlagsForComponent(flags, userId, intent),
userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -948,7 +959,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public List<ResolveInfo> queryIntentActivities(Intent intent,
int flags) {
- return queryIntentActivitiesAsUser(intent, flags, mContext.getUserId());
+ return queryIntentActivitiesAsUser(intent, flags, getUserId());
}
/** @hide Same as above but for a specific user */
@@ -957,10 +968,11 @@ public class ApplicationPackageManager extends PackageManager {
public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
int flags, int userId) {
try {
- ParceledListSlice<ResolveInfo> parceledList =
- mPM.queryIntentActivities(intent,
- intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags, userId);
+ ParceledListSlice<ResolveInfo> parceledList = mPM.queryIntentActivities(
+ intent,
+ intent.resolveTypeIfNeeded(mContext.getContentResolver()),
+ updateFlagsForComponent(flags, userId, intent),
+ userId);
if (parceledList == null) {
return Collections.emptyList();
}
@@ -972,9 +984,9 @@ public class ApplicationPackageManager extends PackageManager {
@Override
@SuppressWarnings("unchecked")
- public List<ResolveInfo> queryIntentActivityOptions(
- ComponentName caller, Intent[] specifics, Intent intent,
- int flags) {
+ public List<ResolveInfo> queryIntentActivityOptions(ComponentName caller, Intent[] specifics,
+ Intent intent, int flags) {
+ final int userId = getUserId();
final ContentResolver resolver = mContext.getContentResolver();
String[] specificTypes = null;
@@ -995,9 +1007,14 @@ public class ApplicationPackageManager extends PackageManager {
}
try {
- ParceledListSlice<ResolveInfo> parceledList =
- mPM.queryIntentActivityOptions(caller, specifics, specificTypes, intent,
- intent.resolveTypeIfNeeded(resolver), flags, mContext.getUserId());
+ ParceledListSlice<ResolveInfo> parceledList = mPM.queryIntentActivityOptions(
+ caller,
+ specifics,
+ specificTypes,
+ intent,
+ intent.resolveTypeIfNeeded(resolver),
+ updateFlagsForComponent(flags, userId, intent),
+ userId);
if (parceledList == null) {
return Collections.emptyList();
}
@@ -1014,10 +1031,11 @@ public class ApplicationPackageManager extends PackageManager {
@SuppressWarnings("unchecked")
public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, int userId) {
try {
- ParceledListSlice<ResolveInfo> parceledList =
- mPM.queryIntentReceivers(intent,
- intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags, userId);
+ ParceledListSlice<ResolveInfo> parceledList = mPM.queryIntentReceivers(
+ intent,
+ intent.resolveTypeIfNeeded(mContext.getContentResolver()),
+ updateFlagsForComponent(flags, userId, intent),
+ userId);
if (parceledList == null) {
return Collections.emptyList();
}
@@ -1029,7 +1047,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
- return queryBroadcastReceiversAsUser(intent, flags, mContext.getUserId());
+ return queryBroadcastReceiversAsUser(intent, flags, getUserId());
}
@Override
@@ -1039,7 +1057,7 @@ public class ApplicationPackageManager extends PackageManager {
return mPM.resolveService(
intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags,
+ updateFlagsForComponent(flags, userId, intent),
userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1048,17 +1066,18 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public ResolveInfo resolveService(Intent intent, int flags) {
- return resolveServiceAsUser(intent, flags, mContext.getUserId());
+ return resolveServiceAsUser(intent, flags, getUserId());
}
@Override
@SuppressWarnings("unchecked")
public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
try {
- ParceledListSlice<ResolveInfo> parceledList =
- mPM.queryIntentServices(intent,
+ ParceledListSlice<ResolveInfo> parceledList = mPM.queryIntentServices(
+ intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags, userId);
+ updateFlagsForComponent(flags, userId, intent),
+ userId);
if (parceledList == null) {
return Collections.emptyList();
}
@@ -1070,7 +1089,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
- return queryIntentServicesAsUser(intent, flags, mContext.getUserId());
+ return queryIntentServicesAsUser(intent, flags, getUserId());
}
@Override
@@ -1078,10 +1097,11 @@ public class ApplicationPackageManager extends PackageManager {
public List<ResolveInfo> queryIntentContentProvidersAsUser(
Intent intent, int flags, int userId) {
try {
- ParceledListSlice<ResolveInfo> parceledList =
- mPM.queryIntentContentProviders(intent,
- intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags, userId);
+ ParceledListSlice<ResolveInfo> parceledList = mPM.queryIntentContentProviders(
+ intent,
+ intent.resolveTypeIfNeeded(mContext.getContentResolver()),
+ updateFlagsForComponent(flags, userId, intent),
+ userId);
if (parceledList == null) {
return Collections.emptyList();
}
@@ -1093,19 +1113,20 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
- return queryIntentContentProvidersAsUser(intent, flags, mContext.getUserId());
+ return queryIntentContentProvidersAsUser(intent, flags, getUserId());
}
@Override
public ProviderInfo resolveContentProvider(String name, int flags) {
- return resolveContentProviderAsUser(name, flags, mContext.getUserId());
+ return resolveContentProviderAsUser(name, flags, getUserId());
}
/** @hide **/
@Override
public ProviderInfo resolveContentProviderAsUser(String name, int flags, int userId) {
try {
- return mPM.resolveContentProvider(name, flags, userId);
+ return mPM.resolveContentProvider(name,
+ updateFlagsForComponent(flags, userId, null), userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1122,8 +1143,8 @@ public class ApplicationPackageManager extends PackageManager {
public List<ProviderInfo> queryContentProviders(String processName,
int uid, int flags, String metaDataKey) {
try {
- ParceledListSlice<ProviderInfo> slice =
- mPM.queryContentProviders(processName, uid, flags, metaDataKey);
+ ParceledListSlice<ProviderInfo> slice = mPM.queryContentProviders(processName, uid,
+ updateFlagsForComponent(flags, UserHandle.getUserId(uid), null), metaDataKey);
return slice != null ? slice.getList() : Collections.<ProviderInfo>emptyList();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1517,6 +1538,73 @@ public class ApplicationPackageManager extends PackageManager {
mPM = pm;
}
+ /**
+ * Update given flags when being used to request {@link PackageInfo}.
+ */
+ private int updateFlagsForPackage(int flags, int userId) {
+ if ((flags & (GET_ACTIVITIES | GET_RECEIVERS | GET_SERVICES | GET_PROVIDERS)) != 0) {
+ // Caller is asking for component details, so they'd better be
+ // asking for specific Direct Boot matching behavior
+ if ((flags & (MATCH_DIRECT_BOOT_UNAWARE
+ | MATCH_DIRECT_BOOT_AWARE
+ | MATCH_DIRECT_BOOT_AUTO)) == 0) {
+ onImplicitDirectBoot(userId);
+ }
+ }
+ return flags;
+ }
+
+ /**
+ * Update given flags when being used to request {@link ApplicationInfo}.
+ */
+ private int updateFlagsForApplication(int flags, int userId) {
+ return updateFlagsForPackage(flags, userId);
+ }
+
+ /**
+ * Update given flags when being used to request {@link ComponentInfo}.
+ */
+ private int updateFlagsForComponent(int flags, int userId, Intent intent) {
+ if (intent != null) {
+ if ((intent.getFlags() & Intent.FLAG_DIRECT_BOOT_AUTO) != 0) {
+ flags |= MATCH_DIRECT_BOOT_AUTO;
+ }
+ }
+
+ // Caller is asking for component details, so they'd better be
+ // asking for specific Direct Boot matching behavior
+ if ((flags & (MATCH_DIRECT_BOOT_UNAWARE
+ | MATCH_DIRECT_BOOT_AWARE
+ | MATCH_DIRECT_BOOT_AUTO)) == 0) {
+ onImplicitDirectBoot(userId);
+ }
+ return flags;
+ }
+
+ private void onImplicitDirectBoot(int userId) {
+ // Only report if someone is relying on implicit behavior while the user
+ // is locked; code running when unlocked is going to see both aware and
+ // unaware components.
+ if (StrictMode.vmImplicitDirectBootEnabled()) {
+ // We can cache the unlocked state for the userId we're running as,
+ // since any relocking of that user will always result in our
+ // process being killed to release any CE FDs we're holding onto.
+ if (userId == UserHandle.myUserId()) {
+ if (mUserUnlocked) {
+ return;
+ } else if (mContext.getSystemService(UserManager.class)
+ .isUserUnlockingOrUnlocked(userId)) {
+ mUserUnlocked = true;
+ } else {
+ StrictMode.onImplicitDirectBoot();
+ }
+ } else if (!mContext.getSystemService(UserManager.class)
+ .isUserUnlockingOrUnlocked(userId)) {
+ StrictMode.onImplicitDirectBoot();
+ }
+ }
+ }
+
@Nullable
private Drawable getCachedIcon(@NonNull ResourceName name) {
synchronized (sSync) {
@@ -1730,7 +1818,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public int installExistingPackage(String packageName, int installReason)
throws NameNotFoundException {
- return installExistingPackageAsUser(packageName, installReason, mContext.getUserId());
+ return installExistingPackageAsUser(packageName, installReason, getUserId());
}
@Override
@@ -2089,7 +2177,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
- deletePackageAsUser(packageName, observer, flags, mContext.getUserId());
+ deletePackageAsUser(packageName, observer, flags, getUserId());
}
@Override
@@ -2107,7 +2195,7 @@ public class ApplicationPackageManager extends PackageManager {
public void clearApplicationUserData(String packageName,
IPackageDataObserver observer) {
try {
- mPM.clearApplicationUserData(packageName, observer, mContext.getUserId());
+ mPM.clearApplicationUserData(packageName, observer, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2158,7 +2246,7 @@ public class ApplicationPackageManager extends PackageManager {
try {
return mPM.setPackagesSuspendedAsUser(packageNames, suspended, appExtras,
launcherExtras, dialogMessage, mContext.getOpPackageName(),
- mContext.getUserId());
+ getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2169,7 +2257,7 @@ public class ApplicationPackageManager extends PackageManager {
final PersistableBundle extras;
try {
extras = mPM.getSuspendedPackageAppExtras(mContext.getOpPackageName(),
- mContext.getUserId());
+ getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2189,7 +2277,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean isPackageSuspended(String packageName) throws NameNotFoundException {
try {
- return isPackageSuspendedForUser(packageName, mContext.getUserId());
+ return isPackageSuspendedForUser(packageName, getUserId());
} catch (IllegalArgumentException ie) {
throw new NameNotFoundException(packageName);
}
@@ -2197,7 +2285,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean isPackageSuspended() {
- return isPackageSuspendedForUser(mContext.getOpPackageName(), mContext.getUserId());
+ return isPackageSuspendedForUser(mContext.getOpPackageName(), getUserId());
}
/** @hide */
@@ -2247,7 +2335,7 @@ public class ApplicationPackageManager extends PackageManager {
public void addPreferredActivity(IntentFilter filter,
int match, ComponentName[] set, ComponentName activity) {
try {
- mPM.addPreferredActivity(filter, match, set, activity, mContext.getUserId());
+ mPM.addPreferredActivity(filter, match, set, activity, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2267,7 +2355,7 @@ public class ApplicationPackageManager extends PackageManager {
public void replacePreferredActivity(IntentFilter filter,
int match, ComponentName[] set, ComponentName activity) {
try {
- mPM.replacePreferredActivity(filter, match, set, activity, mContext.getUserId());
+ mPM.replacePreferredActivity(filter, match, set, activity, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2316,7 +2404,7 @@ public class ApplicationPackageManager extends PackageManager {
public void setComponentEnabledSetting(ComponentName componentName,
int newState, int flags) {
try {
- mPM.setComponentEnabledSetting(componentName, newState, flags, mContext.getUserId());
+ mPM.setComponentEnabledSetting(componentName, newState, flags, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2325,7 +2413,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public int getComponentEnabledSetting(ComponentName componentName) {
try {
- return mPM.getComponentEnabledSetting(componentName, mContext.getUserId());
+ return mPM.getComponentEnabledSetting(componentName, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2336,7 +2424,7 @@ public class ApplicationPackageManager extends PackageManager {
int newState, int flags) {
try {
mPM.setApplicationEnabledSetting(packageName, newState, flags,
- mContext.getUserId(), mContext.getOpPackageName());
+ getUserId(), mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2345,7 +2433,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public int getApplicationEnabledSetting(String packageName) {
try {
- return mPM.getApplicationEnabledSetting(packageName, mContext.getUserId());
+ return mPM.getApplicationEnabledSetting(packageName, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2457,7 +2545,7 @@ public class ApplicationPackageManager extends PackageManager {
if (mInstaller == null) {
try {
mInstaller = new PackageInstaller(mPM.getPackageInstaller(),
- mContext.getPackageName(), mContext.getUserId());
+ mContext.getPackageName(), getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2469,7 +2557,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean isPackageAvailable(String packageName) {
try {
- return mPM.isPackageAvailable(packageName, mContext.getUserId());
+ return mPM.isPackageAvailable(packageName, getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2509,7 +2597,7 @@ public class ApplicationPackageManager extends PackageManager {
if (itemInfo.showUserIcon != UserHandle.USER_NULL) {
return dr;
}
- return getUserBadgedIcon(dr, new UserHandle(mContext.getUserId()));
+ return getUserBadgedIcon(dr, new UserHandle(getUserId()));
}
/**
@@ -2657,6 +2745,9 @@ public class ApplicationPackageManager extends PackageManager {
private final ContextImpl mContext;
private final IPackageManager mPM;
+ /** Assume locked until we hear otherwise */
+ private volatile boolean mUserUnlocked = false;
+
private static final Object sSync = new Object();
private static ArrayMap<ResourceName, WeakReference<Drawable.ConstantState>> sIconCache
= new ArrayMap<ResourceName, WeakReference<Drawable.ConstantState>>();
@@ -2701,7 +2792,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean canRequestPackageInstalls() {
try {
- return mPM.canRequestPackageInstalls(mContext.getPackageName(), mContext.getUserId());
+ return mPM.canRequestPackageInstalls(mContext.getPackageName(), getUserId());
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
@@ -2811,7 +2902,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public CharSequence getHarmfulAppWarning(String packageName) {
try {
- return mPM.getHarmfulAppWarning(packageName, mContext.getUserId());
+ return mPM.getHarmfulAppWarning(packageName, getUserId());
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
@@ -2820,7 +2911,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public void setHarmfulAppWarning(String packageName, CharSequence warning) {
try {
- mPM.setHarmfulAppWarning(packageName, warning, mContext.getUserId());
+ mPM.setHarmfulAppWarning(packageName, warning, getUserId());
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java
index d9c7cf3ccc74..193f933df782 100644
--- a/core/java/android/app/ClientTransactionHandler.java
+++ b/core/java/android/app/ClientTransactionHandler.java
@@ -16,6 +16,7 @@
package android.app;
import android.app.servertransaction.ClientTransaction;
+import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.PendingTransactionActions;
import android.app.servertransaction.TransactionExecutor;
import android.content.Intent;
@@ -29,6 +30,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.ReferrerIntent;
import java.util.List;
+import java.util.Map;
/**
* Defines operations that a {@link android.app.servertransaction.ClientTransaction} or its items
@@ -78,6 +80,9 @@ public abstract class ClientTransactionHandler {
// Execute phase related logic and handlers. Methods here execute actual lifecycle transactions
// and deliver callbacks.
+ /** Get activity and its corresponding transaction item which are going to destroy. */
+ public abstract Map<IBinder, ClientTransactionItem> getActivitiesToBeDestroyed();
+
/** Destroy the activity. */
public abstract void handleDestroyActivity(IBinder token, boolean finishing, int configChanges,
boolean getNonConfigInstance, String reason);
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 95117862a8da..2eafb32d088f 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -80,6 +80,8 @@ import android.view.autofill.AutofillManager.AutofillClient;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;
+import dalvik.system.BlockGuard;
+
import libcore.io.Memory;
import java.io.File;
@@ -923,7 +925,7 @@ class ContextImpl extends Context {
@Override
public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
try {
- ActivityManager.getService().startActivityAsUser(
+ ActivityTaskManager.getService().startActivityAsUser(
mMainThread.getApplicationThread(), getBasePackageName(), intent,
intent.resolveTypeIfNeeded(getContentResolver()),
null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options,
@@ -985,7 +987,7 @@ class ContextImpl extends Context {
fillInIntent.prepareToLeaveProcess(this);
resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
}
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivityIntentSender(mMainThread.getApplicationThread(),
intent != null ? intent.getTarget() : null,
intent != null ? intent.getWhitelistToken() : null,
@@ -2521,7 +2523,11 @@ class ContextImpl extends Context {
private File makeFilename(File base, String name) {
if (name.indexOf(File.separatorChar) < 0) {
- return new File(base, name);
+ final File res = new File(base, name);
+ // We report as filesystem access here to give us the best shot at
+ // detecting apps that will pass the path down to native code.
+ BlockGuard.getVmPolicy().onPathAccess(res.getPath());
+ return res;
}
throw new IllegalArgumentException(
"File " + name + " contains a path separator");
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 8bed105990d9..6557ac4bea11 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -264,7 +264,7 @@ public class Dialog implements DialogInterface, Window.Callback,
* @return Whether the dialog is currently showing.
*/
public boolean isShowing() {
- return mShowing;
+ return mDecor == null ? false : mDecor.getVisibility() == View.VISIBLE;
}
/**
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 569c2bd37b6a..19d7c83818f6 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -63,6 +63,7 @@ import android.os.IBinder;
import android.os.IProgressListener;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
+import android.os.RemoteCallback;
import android.os.StrictMode;
import android.os.WorkSource;
import android.service.voice.IVoiceInteractionSession;
@@ -104,7 +105,6 @@ interface IActivityManager {
in String resolvedType, in IBinder resultTo, in String resultWho, int requestCode,
int flags, in ProfilerInfo profilerInfo, in Bundle options);
void unhandledBack();
-
boolean finishActivity(in IBinder token, int code, in Intent data, int finishTask);
Intent registerReceiver(in IApplicationThread caller, in String callerPackage,
in IIntentReceiver receiver, in IntentFilter filter,
@@ -118,25 +118,16 @@ interface IActivityManager {
oneway void finishReceiver(in IBinder who, int resultCode, in String resultData, in Bundle map,
boolean abortBroadcast, int flags);
void attachApplication(in IApplicationThread app, long startSeq);
- oneway void activityIdle(in IBinder token, in Configuration config,
- in boolean stopProfiling);
- void activityPaused(in IBinder token);
- oneway void activityStopped(in IBinder token, in Bundle state,
- in PersistableBundle persistentState, in CharSequence description);
- String getCallingPackage(in IBinder token);
- ComponentName getCallingActivity(in IBinder token);
List<ActivityManager.RunningTaskInfo> getTasks(int maxNum);
List<ActivityManager.RunningTaskInfo> getFilteredTasks(int maxNum, int ignoreActivityType,
int ignoreWindowingMode);
void moveTaskToFront(int task, int flags, in Bundle options);
- void moveTaskBackwards(int task);
int getTaskForActivity(in IBinder token, in boolean onlyRoot);
ContentProviderHolder getContentProvider(in IApplicationThread caller,
in String name, int userId, boolean stable);
void publishContentProviders(in IApplicationThread caller,
in List<ContentProviderHolder> providers);
boolean refContentProvider(in IBinder connection, int stableDelta, int unstableDelta);
- void finishSubActivity(in IBinder token, in String resultWho, int requestCode);
PendingIntent getRunningServiceControlPanel(in ComponentName service);
ComponentName startService(in IApplicationThread caller, in Intent service,
in String resolvedType, boolean requireForeground, in String callingPackage, int userId);
@@ -147,7 +138,6 @@ interface IActivityManager {
in String callingPackage, int userId);
boolean unbindService(in IServiceConnection connection);
void publishService(in IBinder token, in Intent intent, in IBinder service);
- void activityResumed(in IBinder token);
void setDebugApp(in String packageName, boolean waitForDebugger, boolean persistent);
void setAgentApp(in String packageName, @nullable String agent);
void setAlwaysFinish(boolean enabled);
@@ -173,8 +163,6 @@ interface IActivityManager {
*/
boolean updateConfiguration(in Configuration values);
boolean stopServiceToken(in ComponentName className, in IBinder token, int startId);
- ComponentName getActivityClassForToken(in IBinder token);
- String getPackageForToken(in IBinder token);
void setProcessLimit(int max);
int getProcessLimit();
int checkPermission(in String permission, int pid, int uid);
@@ -194,7 +182,6 @@ interface IActivityManager {
ParceledListSlice getRecentTasks(int maxNum, int flags, int userId);
oneway void serviceDoneExecuting(in IBinder token, int type, int startId, int res);
- oneway void activityDestroyed(in IBinder token);
IIntentSender getIntentSender(int type, in String packageName, in IBinder token,
in String resultWho, int requestCode, in Intent[] intents, in String[] resolvedTypes,
int flags, in Bundle options, int userId);
@@ -203,13 +190,10 @@ interface IActivityManager {
void registerIntentSenderCancelListener(in IIntentSender sender, in IResultReceiver receiver);
void unregisterIntentSenderCancelListener(in IIntentSender sender, in IResultReceiver receiver);
void enterSafeMode();
- boolean startNextMatchingActivity(in IBinder callingActivity,
- in Intent intent, in Bundle options);
void noteWakeupAlarm(in IIntentSender sender, in WorkSource workSource, int sourceUid,
in String sourcePkg, in String tag);
void removeContentProvider(in IBinder connection, boolean stable);
void setRequestedOrientation(in IBinder token, int requestedOrientation);
- int getRequestedOrientation(in IBinder token);
void unbindFinished(in IBinder token, in Intent service, boolean doRebind);
void setProcessImportant(in IBinder token, int pid, boolean isForeground, String reason);
void setServiceForeground(in ComponentName className, in IBinder token,
@@ -222,7 +206,6 @@ interface IActivityManager {
void forceStopPackage(in String packageName, int userId);
boolean killPids(in int[] pids, in String reason, boolean secure);
List<ActivityManager.RunningServiceInfo> getServices(int maxNum, int flags);
- ActivityManager.TaskDescription getTaskDescription(int taskId);
// Retrieve running application processes in the system
List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses();
// Get device configuration
@@ -245,38 +228,18 @@ interface IActivityManager {
void closeSystemDialogs(in String reason);
Debug.MemoryInfo[] getProcessMemoryInfo(in int[] pids);
void killApplicationProcess(in String processName, int uid);
- int startActivityIntentSender(in IApplicationThread caller,
- in IIntentSender target, in IBinder whitelistToken, in Intent fillInIntent,
- in String resolvedType, in IBinder resultTo, in String resultWho, int requestCode,
- int flagsMask, int flagsValues, in Bundle options);
- void overridePendingTransition(in IBinder token, in String packageName,
- int enterAnim, int exitAnim);
// Special low-level communication with activity manager.
boolean handleApplicationWtf(in IBinder app, in String tag, boolean system,
in ApplicationErrorReport.ParcelableCrashInfo crashInfo);
void killBackgroundProcesses(in String packageName, int userId);
boolean isUserAMonkey();
- WaitResult startActivityAndWait(in IApplicationThread caller, in String callingPackage,
- in Intent intent, in String resolvedType, in IBinder resultTo, in String resultWho,
- int requestCode, int flags, in ProfilerInfo profilerInfo, in Bundle options,
- int userId);
- boolean willActivityBeVisible(in IBinder token);
- int startActivityWithConfig(in IApplicationThread caller, in String callingPackage,
- in Intent intent, in String resolvedType, in IBinder resultTo, in String resultWho,
- int requestCode, int startFlags, in Configuration newConfig,
- in Bundle options, int userId);
// Retrieve info of applications installed on external media that are currently
// running.
List<ApplicationInfo> getRunningExternalApplications();
void finishHeavyWeightApp();
- // A StrictMode violation to be handled. The violationMask is a
- // subset of the original StrictMode policy bitmask, with only the
- // bit violated and penalty bits to be executed by the
- // ActivityManagerService remaining set.
- void handleApplicationStrictModeViolation(in IBinder app, int violationMask,
+ // A StrictMode violation to be handled.
+ void handleApplicationStrictModeViolation(in IBinder app, int penaltyMask,
in StrictMode.ViolationInfo crashInfo);
- boolean isImmersive(in IBinder token);
- void setImmersive(in IBinder token, boolean immersive);
boolean isTopActivityImmersive();
void crashApplication(int uid, int initialPid, in String packageName, int userId, in String message);
String getProviderMimeType(in Uri uri, int userId);
@@ -288,20 +251,14 @@ interface IActivityManager {
int modeFlags, int userId);
// Cause the specified process to dump the specified heap.
boolean dumpHeap(in String process, int userId, boolean managed, boolean mallocInfo,
- boolean runGc, in String path, in ParcelFileDescriptor fd);
- int startActivities(in IApplicationThread caller, in String callingPackage,
- in Intent[] intents, in String[] resolvedTypes, in IBinder resultTo,
- in Bundle options, int userId);
+ boolean runGc, in String path, in ParcelFileDescriptor fd,
+ in RemoteCallback finishCallback);
boolean isUserRunning(int userid, int flags);
- oneway void activitySlept(in IBinder token);
- int getFrontActivityScreenCompatMode();
- void setFrontActivityScreenCompatMode(int mode);
int getPackageScreenCompatMode(in String packageName);
void setPackageScreenCompatMode(in String packageName, int mode);
boolean getPackageAskScreenCompat(in String packageName);
void setPackageAskScreenCompat(in String packageName, boolean ask);
boolean switchUser(int userid);
- void setFocusedTask(int taskId);
boolean removeTask(int taskId);
void registerProcessObserver(in IProcessObserver observer);
void unregisterProcessObserver(in IProcessObserver observer);
@@ -311,15 +268,12 @@ interface IActivityManager {
void showBootMessage(in CharSequence msg, boolean always);
void killAllBackgroundProcesses();
ContentProviderHolder getContentProviderExternal(in String name, int userId,
- in IBinder token);
+ in IBinder token, String tag);
void removeContentProviderExternal(in String name, in IBinder token);
// Get memory information about the calling process.
void getMyMemoryState(out ActivityManager.RunningAppProcessInfo outInfo);
boolean killProcessesBelowForeground(in String reason);
UserInfo getCurrentUser();
- boolean shouldUpRecreateTask(in IBinder token, in String destAffinity);
- boolean navigateUpTo(in IBinder token, in Intent target, int resultCode,
- in Intent resultData);
/**
* Informs ActivityManagerService that the keyguard is showing.
*
@@ -331,7 +285,6 @@ interface IActivityManager {
*/
void setLockScreenShown(boolean showingKeyguard, boolean showingAod,
int secondaryDisplayShowing);
- boolean finishActivityAffinity(in IBinder token);
// This is not public because you need to be very careful in how you
// manage your activity to make sure it is always the uid you expect.
int getLaunchedFromUid(in IBinder activityToken);
@@ -381,9 +334,6 @@ interface IActivityManager {
long inputDispatchingTimedOut(int pid, boolean aboveSystem, in String reason);
void clearPendingBackup();
Intent getIntentForIntentSender(in IIntentSender sender);
- Bundle getAssistContextExtras(int requestType);
- void reportAssistContextExtras(in IBinder token, in Bundle extras,
- in AssistStructure structure, in AssistContent content, in Uri referrer);
// This is not public because you need to be very careful in how you
// manage your activity to make sure it is always the uid you expect.
String getLaunchedFromPackage(in IBinder activityToken);
@@ -391,14 +341,7 @@ interface IActivityManager {
void setUserIsMonkey(boolean monkey);
void hang(in IBinder who, boolean allowRestart);
- /**
- * Sets the windowing mode for a specific task. Only works on tasks of type
- * {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD}
- * @param taskId The id of the task to set the windowing mode for.
- * @param windowingMode The windowing mode to set for the task.
- * @param toTop If the task should be moved to the top once the windowing mode changes.
- */
- void setTaskWindowingMode(int taskId, int windowingMode, boolean toTop);
+ List<ActivityManager.StackInfo> getAllStackInfos();
void moveTaskToStack(int taskId, int stackId, boolean toTop);
/**
* Resizes the input stack id to the given bounds.
@@ -416,14 +359,8 @@ interface IActivityManager {
*/
void resizeStack(int stackId, in Rect bounds, boolean allowResizeInDockedMode,
boolean preserveWindows, boolean animate, int animationDuration);
- List<ActivityManager.StackInfo> getAllStackInfos();
void setFocusedStack(int stackId);
ActivityManager.StackInfo getFocusedStackInfo();
- ActivityManager.StackInfo getStackInfo(int windowingMode, int activityType);
- boolean convertFromTranslucent(in IBinder token);
- boolean convertToTranslucent(in IBinder token, in Bundle options);
- void notifyActivityDrawn(in IBinder token);
- void reportActivityFullyDrawn(in IBinder token, boolean restoredFromBundle);
void restart();
void performIdleMaintenance();
void takePersistableUriPermission(in Uri uri, int modeFlags, String toPackage, int userId);
@@ -431,83 +368,37 @@ interface IActivityManager {
ParceledListSlice getPersistedUriPermissions(in String packageName, boolean incoming);
void appNotRespondingViaProvider(in IBinder connection);
Rect getTaskBounds(int taskId);
- int getActivityDisplayId(in IBinder activityToken);
boolean setProcessMemoryTrimLevel(in String process, int uid, int level);
// Start of L transactions
String getTagForIntentSender(in IIntentSender sender, in String prefix);
boolean startUserInBackground(int userid);
- void startLockTaskModeByToken(in IBinder token);
- void stopLockTaskModeByToken(in IBinder token);
boolean isInLockTaskMode();
- void setTaskDescription(in IBinder token, in ActivityManager.TaskDescription values);
- int startVoiceActivity(in String callingPackage, int callingPid, int callingUid,
- in Intent intent, in String resolvedType, in IVoiceInteractionSession session,
- in IVoiceInteractor interactor, int flags, in ProfilerInfo profilerInfo,
- in Bundle options, int userId);
- int startAssistantActivity(in String callingPackage, int callingPid, int callingUid,
- in Intent intent, in String resolvedType, in Bundle options, int userId);
void startRecentsActivity(in Intent intent, in IAssistDataReceiver assistDataReceiver,
in IRecentsAnimationRunner recentsAnimationRunner);
void cancelRecentsAnimation(boolean restoreHomeStackPosition);
int startActivityFromRecents(int taskId, in Bundle options);
- Bundle getActivityOptions(in IBinder token);
- List<IBinder> getAppTasks(in String callingPackage);
void startSystemLockTaskMode(int taskId);
- void stopSystemLockTaskMode();
- void finishVoiceTask(in IVoiceInteractionSession session);
boolean isTopOfTask(in IBinder token);
- void notifyLaunchTaskBehindComplete(in IBinder token);
- void notifyEnterAnimationComplete(in IBinder token);
- int startActivityAsCaller(in IApplicationThread caller, in String callingPackage,
- in Intent intent, in String resolvedType, in IBinder resultTo, in String resultWho,
- int requestCode, int flags, in ProfilerInfo profilerInfo, in Bundle options,
- boolean ignoreTargetSecurity, int userId);
- int addAppTask(in IBinder activityToken, in Intent intent,
- in ActivityManager.TaskDescription description, in Bitmap thumbnail);
- Point getAppTaskThumbnailSize();
- boolean releaseActivityInstance(in IBinder token);
- void releaseSomeActivities(in IApplicationThread app);
void bootAnimationComplete();
- Bitmap getTaskDescriptionIcon(in String filename, int userId);
- boolean launchAssistIntent(in Intent intent, int requestType, in String hint, int userHandle,
- in Bundle args);
- void startInPlaceAnimationOnFrontMostApplication(in Bundle opts);
int checkPermissionWithToken(in String permission, int pid, int uid,
in IBinder callerToken);
void registerTaskStackListener(in ITaskStackListener listener);
void unregisterTaskStackListener(in ITaskStackListener listener);
-
void notifyCleartextNetwork(int uid, in byte[] firstPacket);
- int createStackOnDisplay(int displayId);
void setTaskResizeable(int taskId, int resizeableMode);
- boolean requestAssistContextExtras(int requestType, in IAssistDataReceiver receiver,
- in Bundle receiverExtras, in IBinder activityToken,
- boolean focused, boolean newSessionId);
void resizeTask(int taskId, in Rect bounds, int resizeMode);
int getLockTaskModeState();
void setDumpHeapDebugLimit(in String processName, int uid, long maxMemSize,
in String reportPackage);
void dumpHeapFinished(in String path);
- void setVoiceKeepAwake(in IVoiceInteractionSession session, boolean keepAwake);
void updateLockTaskPackages(int userId, in String[] packages);
void noteAlarmStart(in IIntentSender sender, in WorkSource workSource, int sourceUid, in String tag);
void noteAlarmFinish(in IIntentSender sender, in WorkSource workSource, int sourceUid, in String tag);
int getPackageProcessState(in String packageName, in String callingPackage);
- oneway void showLockTaskEscapeMessage(in IBinder token);
void updateDeviceOwner(in String packageName);
- /**
- * Notify the system that the keyguard is going away.
- *
- * @param flags See {@link android.view.WindowManagerPolicyConstants#KEYGUARD_GOING_AWAY_FLAG_TO_SHADE}
- * etc.
- */
- void keyguardGoingAway(int flags);
int getUidProcessState(int uid, in String callingPackage);
- boolean isAssistDataAllowedOnCurrentActivity();
- boolean showAssistFromActivity(in IBinder token, in Bundle args);
- boolean isRootVoiceInteraction(in IBinder token);
// Start of N transactions
@@ -522,37 +413,12 @@ interface IActivityManager {
* different stack.
*/
void positionTaskInStack(int taskId, int stackId, int position);
- void exitFreeformMode(in IBinder token);
- void reportSizeConfigurations(in IBinder token, in int[] horizontalSizeConfiguration,
- in int[] verticalSizeConfigurations, in int[] smallestWidthConfigurations);
- boolean setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode, boolean toTop,
- boolean animate, in Rect initialBounds, boolean showRecents);
- /**
- * Dismisses split-screen multi-window mode.
- * {@param toTop} If true the current primary split-screen stack will be placed or left on top.
- */
- void dismissSplitScreenMode(boolean toTop);
- /**
- * Dismisses PiP
- * @param animate True if the dismissal should be animated.
- * @param animationDuration The duration of the resize animation in milliseconds or -1 if the
- * default animation duration should be used.
- */
- void dismissPip(boolean animate, int animationDuration);
void suppressResizeConfigChanges(boolean suppress);
- void moveTasksToFullscreenStack(int fromStackId, boolean onTop);
boolean moveTopActivityToPinnedStack(int stackId, in Rect bounds);
boolean isAppStartModeDisabled(int uid, in String packageName);
boolean unlockUser(int userid, in byte[] token, in byte[] secret,
in IProgressListener listener);
- boolean isInMultiWindowMode(in IBinder token);
- boolean isInPictureInPictureMode(in IBinder token);
void killPackageDependents(in String packageName, int userId);
- boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureParams params);
- void setPictureInPictureParams(in IBinder token, in PictureInPictureParams params);
- int getMaxNumPictureInPictureActions(in IBinder token);
- void activityRelaunched(in IBinder token);
- IBinder getUriPermissionOwnerForActivity(in IBinder activityToken);
/**
* Resizes the docked stack, and all other stacks as the result of the dock stack bounds change.
*
@@ -575,12 +441,6 @@ interface IActivityManager {
void resizeDockedStack(in Rect dockedBounds, in Rect tempDockedTaskBounds,
in Rect tempDockedTaskInsetBounds,
in Rect tempOtherTaskBounds, in Rect tempOtherTaskInsetBounds);
- /**
- * Sets whether we are currently in an interactive split screen resize operation where we
- * are changing the docked stack size.
- */
- void setSplitScreenResizing(boolean resizing);
- int setVrMode(in IBinder token, boolean enabled, in ComponentName packageName);
// Gets the URI permissions granted to an arbitrary package (or all packages if null)
// NOTE: this is different from getPersistedUriPermissions(), which returns the URIs the package
// granted to another packages (instead of those granted to it).
@@ -588,31 +448,9 @@ interface IActivityManager {
// Clears the URI permissions granted to an arbitrary package.
void clearGrantedUriPermissions(in String packageName, int userId);
boolean isAppForeground(int uid);
- void startLocalVoiceInteraction(in IBinder token, in Bundle options);
- void stopLocalVoiceInteraction(in IBinder token);
- boolean supportsLocalVoiceInteraction();
- void notifyPinnedStackAnimationStarted();
- void notifyPinnedStackAnimationEnded();
void removeStack(int stackId);
- /**
- * Removes stacks in the input windowing modes from the system if they are of activity type
- * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
- */
- void removeStacksInWindowingModes(in int[] windowingModes);
- /** Removes stack of the activity types from the system. */
- void removeStacksWithActivityTypes(in int[] activityTypes);
void makePackageIdle(String packageName, int userId);
int getMemoryTrimLevel();
- /**
- * Resizes the pinned stack.
- *
- * @param pinnedBounds The bounds for the pinned stack.
- * @param tempPinnedTaskBounds The temporary bounds for the tasks in the pinned stack, which
- * might be different from the stack bounds to allow more
- * flexibility while resizing, or {@code null} if they should be the
- * same as the stack bounds.
- */
- void resizePinnedStack(in Rect pinnedBounds, in Rect tempPinnedTaskBounds);
boolean isVrModePackageEnabled(in ComponentName packageName);
void notifyLockedProfile(int userId);
void startConfirmDeviceCredentialIntent(in Intent intent, in Bundle options);
@@ -623,7 +461,6 @@ interface IActivityManager {
boolean isBackgroundRestricted(in String packageName);
// Start of N MR1 transactions
- void setVrThread(int tid);
void setRenderThread(int tid);
/**
* Lets activity manager know whether the calling process is currently showing "top-level" UI
@@ -636,25 +473,9 @@ interface IActivityManager {
void setHasTopUi(boolean hasTopUi);
// Start of O transactions
- /**
- * Updates override configuration applied to specific display.
- * @param values Update values for display configuration. If null is passed it will request the
- * Window Manager to compute new config for the specified display.
- * @param displayId Id of the display to apply the config to.
- * @throws RemoteException
- * @return Returns true if the configuration was updated.
- */
- boolean updateDisplayOverrideConfiguration(in Configuration values, int displayId);
- void moveStackToDisplay(int stackId, int displayId);
- boolean requestAutofillData(in IAssistDataReceiver receiver, in Bundle receiverExtras,
- in IBinder activityToken, int flags);
- void dismissKeyguard(in IBinder token, in IKeyguardDismissCallback callback,
- in CharSequence message);
int restartUserInBackground(int userId);
-
/** Cancels the window transitions for the given task. */
void cancelTaskWindowTransition(int taskId);
-
/**
* @param taskId the id of the task to retrieve the sAutoapshots for
* @param reducedResolution if set, if the snapshot needs to be loaded from disk, this will load
@@ -662,38 +483,16 @@ interface IActivityManager {
* @return a graphic buffer representing a screenshot of a task
*/
ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution);
-
void scheduleApplicationInfoChanged(in List<String> packageNames, int userId);
void setPersistentVrThread(int tid);
void waitForNetworkStateUpdate(long procStateSeq);
-
- /**
- * See {@link android.app.Activity#setDisablePreviewScreenshots}
- */
- void setDisablePreviewScreenshots(IBinder token, boolean disable);
-
- /**
- * Return the user id of last resumed activity.
- */
- int getLastResumedActivityUserId();
-
/**
* Add a bare uid to the background restrictions whitelist. Only the system uid may call this.
*/
void backgroundWhitelistUid(int uid);
// Start of P transactions
- void updateLockTaskFeatures(int userId, int flags);
-
- // WARNING: when these transactions are updated, check if they are any callers on the native
- // side. If so, make sure they are using the correct transaction ids and arguments.
- // If a transaction which will also be used on the native side is being inserted, add it
- // alongside with other transactions of this kind at the top of this file.
-
- void setShowWhenLocked(in IBinder token, boolean showWhenLocked);
- void setTurnScreenOn(in IBinder token, boolean turnScreenOn);
-
/**
* Similar to {@link #startUserInBackground(int userId), but with a listener to report
* user unlock progress.
@@ -701,17 +500,17 @@ interface IActivityManager {
boolean startUserInBackgroundWithListener(int userid, IProgressListener unlockProgressListener);
/**
- * Registers remote animations for a specific activity.
+ * Method for the shell UID to start deletating its permission identity to an
+ * active instrumenation. The shell can delegate permissions only to one active
+ * instrumentation at a time. An active instrumentation is one running and
+ * started from the shell.
*/
- void registerRemoteAnimations(in IBinder token, in RemoteAnimationDefinition definition);
+ void startDelegateShellPermissionIdentity(int uid);
/**
- * Registers a remote animation to be run for all activity starts from a certain package during
- * a short predefined amount of time.
+ * Method for the shell UID to stop deletating its permission identity to an
+ * active instrumenation. An active instrumentation is one running and
+ * started from the shell.
*/
- void registerRemoteAnimationForNextActivityStart(in String packageName,
- in RemoteAnimationAdapter adapter);
-
- /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */
- void alwaysShowUnsupportedCompileSdkWarning(in ComponentName activity);
+ void stopDelegateShellPermissionIdentity();
}
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
new file mode 100644
index 000000000000..3dbc31250c01
--- /dev/null
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -0,0 +1,425 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import android.app.ActivityManager;
+import android.app.ApplicationErrorReport;
+import android.app.ContentProviderHolder;
+import android.app.GrantedUriPermission;
+import android.app.IApplicationThread;
+import android.app.IActivityController;
+import android.app.IAppTask;
+import android.app.IAssistDataReceiver;
+import android.app.IInstrumentationWatcher;
+import android.app.IProcessObserver;
+import android.app.IServiceConnection;
+import android.app.IStopUserCallback;
+import android.app.ITaskStackListener;
+import android.app.IUiAutomationConnection;
+import android.app.IUidObserver;
+import android.app.IUserSwitchObserver;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.app.PictureInPictureParams;
+import android.app.ProfilerInfo;
+import android.app.WaitResult;
+import android.app.assist.AssistContent;
+import android.app.assist.AssistStructure;
+import android.content.ComponentName;
+import android.content.IIntentReceiver;
+import android.content.IIntentSender;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.IntentSender;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ConfigurationInfo;
+import android.content.pm.IPackageDataObserver;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.ProviderInfo;
+import android.content.pm.UserInfo;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Debug;
+import android.os.IBinder;
+import android.os.IProgressListener;
+import android.os.ParcelFileDescriptor;
+import android.os.PersistableBundle;
+import android.os.StrictMode;
+import android.os.WorkSource;
+import android.service.voice.IVoiceInteractionSession;
+import android.view.IRecentsAnimationRunner;
+import android.view.RemoteAnimationDefinition;
+import android.view.RemoteAnimationAdapter;
+import com.android.internal.app.IVoiceInteractor;
+import com.android.internal.os.IResultReceiver;
+import com.android.internal.policy.IKeyguardDismissCallback;
+
+import java.util.List;
+
+/**
+ * System private API for talking with the activity task manager that handles how activities are
+ * managed on screen.
+ *
+ * {@hide}
+ */
+interface IActivityTaskManager {
+ int startActivity(in IApplicationThread caller, in String callingPackage, in Intent intent,
+ in String resolvedType, in IBinder resultTo, in String resultWho, int requestCode,
+ int flags, in ProfilerInfo profilerInfo, in Bundle options);
+ int startActivities(in IApplicationThread caller, in String callingPackage,
+ in Intent[] intents, in String[] resolvedTypes, in IBinder resultTo,
+ in Bundle options, int userId);
+ int startActivityAsUser(in IApplicationThread caller, in String callingPackage,
+ in Intent intent, in String resolvedType, in IBinder resultTo, in String resultWho,
+ int requestCode, int flags, in ProfilerInfo profilerInfo,
+ in Bundle options, int userId);
+ boolean startNextMatchingActivity(in IBinder callingActivity,
+ in Intent intent, in Bundle options);
+ int startActivityIntentSender(in IApplicationThread caller,
+ in IIntentSender target, in IBinder whitelistToken, in Intent fillInIntent,
+ in String resolvedType, in IBinder resultTo, in String resultWho, int requestCode,
+ int flagsMask, int flagsValues, in Bundle options);
+ WaitResult startActivityAndWait(in IApplicationThread caller, in String callingPackage,
+ in Intent intent, in String resolvedType, in IBinder resultTo, in String resultWho,
+ int requestCode, int flags, in ProfilerInfo profilerInfo, in Bundle options,
+ int userId);
+ int startActivityWithConfig(in IApplicationThread caller, in String callingPackage,
+ in Intent intent, in String resolvedType, in IBinder resultTo, in String resultWho,
+ int requestCode, int startFlags, in Configuration newConfig,
+ in Bundle options, int userId);
+ int startVoiceActivity(in String callingPackage, int callingPid, int callingUid,
+ in Intent intent, in String resolvedType, in IVoiceInteractionSession session,
+ in IVoiceInteractor interactor, int flags, in ProfilerInfo profilerInfo,
+ in Bundle options, int userId);
+ int startAssistantActivity(in String callingPackage, int callingPid, int callingUid,
+ in Intent intent, in String resolvedType, in Bundle options, int userId);
+ void startRecentsActivity(in Intent intent, in IAssistDataReceiver assistDataReceiver,
+ in IRecentsAnimationRunner recentsAnimationRunner);
+ int startActivityFromRecents(int taskId, in Bundle options);
+ int startActivityAsCaller(in IApplicationThread caller, in String callingPackage,
+ in Intent intent, in String resolvedType, in IBinder resultTo, in String resultWho,
+ int requestCode, int flags, in ProfilerInfo profilerInfo, in Bundle options,
+ boolean ignoreTargetSecurity, int userId);
+
+ void unhandledBack();
+ boolean finishActivity(in IBinder token, int code, in Intent data, int finishTask);
+ boolean finishActivityAffinity(in IBinder token);
+
+ oneway void activityIdle(in IBinder token, in Configuration config,
+ in boolean stopProfiling);
+ void activityResumed(in IBinder token);
+ void activityPaused(in IBinder token);
+ void activityStopped(in IBinder token, in Bundle state,
+ in PersistableBundle persistentState, in CharSequence description);
+ oneway void activityDestroyed(in IBinder token);
+ void activityRelaunched(in IBinder token);
+ oneway void activitySlept(in IBinder token);
+ int getFrontActivityScreenCompatMode();
+ void setFrontActivityScreenCompatMode(int mode);
+ String getCallingPackage(in IBinder token);
+ ComponentName getCallingActivity(in IBinder token);
+ void setFocusedTask(int taskId);
+ boolean removeTask(int taskId);
+ List<ActivityManager.RunningTaskInfo> getTasks(int maxNum);
+ List<ActivityManager.RunningTaskInfo> getFilteredTasks(int maxNum, int ignoreActivityType,
+ int ignoreWindowingMode);
+ boolean shouldUpRecreateTask(in IBinder token, in String destAffinity);
+ boolean navigateUpTo(in IBinder token, in Intent target, int resultCode,
+ in Intent resultData);
+ void moveTaskToFront(int task, int flags, in Bundle options);
+ int getTaskForActivity(in IBinder token, in boolean onlyRoot);
+ void finishSubActivity(in IBinder token, in String resultWho, int requestCode);
+ ParceledListSlice getRecentTasks(int maxNum, int flags, int userId);
+ boolean willActivityBeVisible(in IBinder token);
+ void setRequestedOrientation(in IBinder token, int requestedOrientation);
+ int getRequestedOrientation(in IBinder token);
+ boolean convertFromTranslucent(in IBinder token);
+ boolean convertToTranslucent(in IBinder token, in Bundle options);
+ void notifyActivityDrawn(in IBinder token);
+ void reportActivityFullyDrawn(in IBinder token, boolean restoredFromBundle);
+ int getActivityDisplayId(in IBinder activityToken);
+ boolean isImmersive(in IBinder token);
+ void setImmersive(in IBinder token, boolean immersive);
+ boolean isTopActivityImmersive();
+ boolean moveActivityTaskToBack(in IBinder token, boolean nonRoot);
+ ActivityManager.TaskDescription getTaskDescription(int taskId);
+ void overridePendingTransition(in IBinder token, in String packageName,
+ int enterAnim, int exitAnim);
+ int getLaunchedFromUid(in IBinder activityToken);
+ String getLaunchedFromPackage(in IBinder activityToken);
+ void reportAssistContextExtras(in IBinder token, in Bundle extras,
+ in AssistStructure structure, in AssistContent content, in Uri referrer);
+
+ void setFocusedStack(int stackId);
+ ActivityManager.StackInfo getFocusedStackInfo();
+ Rect getTaskBounds(int taskId);
+
+ void cancelRecentsAnimation(boolean restoreHomeStackPosition);
+ void startLockTaskModeByToken(in IBinder token);
+ void stopLockTaskModeByToken(in IBinder token);
+ boolean isInLockTaskMode();
+ int getLockTaskModeState();
+ void setTaskDescription(in IBinder token, in ActivityManager.TaskDescription values);
+ Bundle getActivityOptions(in IBinder token);
+ List<IBinder> getAppTasks(in String callingPackage);
+ void startSystemLockTaskMode(int taskId);
+ void stopSystemLockTaskMode();
+ void finishVoiceTask(in IVoiceInteractionSession session);
+ boolean isTopOfTask(in IBinder token);
+ void notifyLaunchTaskBehindComplete(in IBinder token);
+ void notifyEnterAnimationComplete(in IBinder token);
+ int addAppTask(in IBinder activityToken, in Intent intent,
+ in ActivityManager.TaskDescription description, in Bitmap thumbnail);
+ Point getAppTaskThumbnailSize();
+ boolean releaseActivityInstance(in IBinder token);
+ void releaseSomeActivities(in IApplicationThread app);
+ Bitmap getTaskDescriptionIcon(in String filename, int userId);
+ void startInPlaceAnimationOnFrontMostApplication(in Bundle opts);
+ void registerTaskStackListener(in ITaskStackListener listener);
+ void unregisterTaskStackListener(in ITaskStackListener listener);
+ int createStackOnDisplay(int displayId);
+ void setTaskResizeable(int taskId, int resizeableMode);
+ void exitFreeformMode(in IBinder token);
+ void resizeTask(int taskId, in Rect bounds, int resizeMode);
+ void moveStackToDisplay(int stackId, int displayId);
+ void removeStack(int stackId);
+
+ /**
+ * Sets the windowing mode for a specific task. Only works on tasks of type
+ * {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD}
+ * @param taskId The id of the task to set the windowing mode for.
+ * @param windowingMode The windowing mode to set for the task.
+ * @param toTop If the task should be moved to the top once the windowing mode changes.
+ */
+ void setTaskWindowingMode(int taskId, int windowingMode, boolean toTop);
+ void moveTaskToStack(int taskId, int stackId, boolean toTop);
+ /**
+ * Resizes the input stack id to the given bounds.
+ *
+ * @param stackId Id of the stack to resize.
+ * @param bounds Bounds to resize the stack to or {@code null} for fullscreen.
+ * @param allowResizeInDockedMode True if the resize should be allowed when the docked stack is
+ * active.
+ * @param preserveWindows True if the windows of activities contained in the stack should be
+ * preserved.
+ * @param animate True if the stack resize should be animated.
+ * @param animationDuration The duration of the resize animation in milliseconds or -1 if the
+ * default animation duration should be used.
+ * @throws RemoteException
+ */
+ void resizeStack(int stackId, in Rect bounds, boolean allowResizeInDockedMode,
+ boolean preserveWindows, boolean animate, int animationDuration);
+ boolean setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode, boolean toTop,
+ boolean animate, in Rect initialBounds, boolean showRecents);
+
+
+ /**
+ * Removes stacks in the input windowing modes from the system if they are of activity type
+ * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
+ */
+ void removeStacksInWindowingModes(in int[] windowingModes);
+ /** Removes stack of the activity types from the system. */
+ void removeStacksWithActivityTypes(in int[] activityTypes);
+
+ List<ActivityManager.StackInfo> getAllStackInfos();
+ ActivityManager.StackInfo getStackInfo(int windowingMode, int activityType);
+
+ /**
+ * Informs ActivityManagerService that the keyguard is showing.
+ *
+ * @param showingKeyguard True if the keyguard is showing, false otherwise.
+ * @param showingAod True if AOD is showing, false otherwise.
+ * @param secondaryDisplayShowing The displayId of the secondary display on which the keyguard
+ * is showing, or INVALID_DISPLAY if there is no such display. Only meaningful if
+ * showing is true.
+ */
+ void setLockScreenShown(boolean showingKeyguard, boolean showingAod,
+ int secondaryDisplayShowing);
+ Bundle getAssistContextExtras(int requestType);
+ boolean launchAssistIntent(in Intent intent, int requestType, in String hint, int userHandle,
+ in Bundle args);
+ boolean requestAssistContextExtras(int requestType, in IAssistDataReceiver receiver,
+ in Bundle receiverExtras, in IBinder activityToken,
+ boolean focused, boolean newSessionId);
+ boolean requestAutofillData(in IAssistDataReceiver receiver, in Bundle receiverExtras,
+ in IBinder activityToken, int flags);
+ boolean isAssistDataAllowedOnCurrentActivity();
+ boolean showAssistFromActivity(in IBinder token, in Bundle args);
+ boolean isRootVoiceInteraction(in IBinder token);
+ oneway void showLockTaskEscapeMessage(in IBinder token);
+
+ /**
+ * Notify the system that the keyguard is going away.
+ *
+ * @param flags See
+ * {@link android.view.WindowManagerPolicyConstants#KEYGUARD_GOING_AWAY_FLAG_TO_SHADE}
+ * etc.
+ */
+ void keyguardGoingAway(int flags);
+ ComponentName getActivityClassForToken(in IBinder token);
+ String getPackageForToken(in IBinder token);
+
+ /**
+ * Try to place task to provided position. The final position might be different depending on
+ * current user and stacks state. The task will be moved to target stack if it's currently in
+ * different stack.
+ */
+ void positionTaskInStack(int taskId, int stackId, int position);
+ void reportSizeConfigurations(in IBinder token, in int[] horizontalSizeConfiguration,
+ in int[] verticalSizeConfigurations, in int[] smallestWidthConfigurations);
+ /**
+ * Dismisses split-screen multi-window mode.
+ * {@param toTop} If true the current primary split-screen stack will be placed or left on top.
+ */
+ void dismissSplitScreenMode(boolean toTop);
+
+ /**
+ * Dismisses PiP
+ * @param animate True if the dismissal should be animated.
+ * @param animationDuration The duration of the resize animation in milliseconds or -1 if the
+ * default animation duration should be used.
+ */
+ void dismissPip(boolean animate, int animationDuration);
+ void suppressResizeConfigChanges(boolean suppress);
+ void moveTasksToFullscreenStack(int fromStackId, boolean onTop);
+ boolean moveTopActivityToPinnedStack(int stackId, in Rect bounds);
+ boolean isInMultiWindowMode(in IBinder token);
+ boolean isInPictureInPictureMode(in IBinder token);
+ boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureParams params);
+ void setPictureInPictureParams(in IBinder token, in PictureInPictureParams params);
+ int getMaxNumPictureInPictureActions(in IBinder token);
+ IBinder getUriPermissionOwnerForActivity(in IBinder activityToken);
+
+ /**
+ * Resizes the docked stack, and all other stacks as the result of the dock stack bounds change.
+ *
+ * @param dockedBounds The bounds for the docked stack.
+ * @param tempDockedTaskBounds The temporary bounds for the tasks in the docked stack, which
+ * might be different from the stack bounds to allow more
+ * flexibility while resizing, or {@code null} if they should be the
+ * same as the stack bounds.
+ * @param tempDockedTaskInsetBounds The temporary bounds for the tasks to calculate the insets.
+ * When resizing, we usually "freeze" the layout of a task. To
+ * achieve that, we also need to "freeze" the insets, which
+ * gets achieved by changing task bounds but not bounds used
+ * to calculate the insets in this transient state
+ * @param tempOtherTaskBounds The temporary bounds for the tasks in all other stacks, or
+ * {@code null} if they should be the same as the stack bounds.
+ * @param tempOtherTaskInsetBounds Like {@code tempDockedTaskInsetBounds}, but for the other
+ * stacks.
+ * @throws RemoteException
+ */
+ void resizeDockedStack(in Rect dockedBounds, in Rect tempDockedTaskBounds,
+ in Rect tempDockedTaskInsetBounds,
+ in Rect tempOtherTaskBounds, in Rect tempOtherTaskInsetBounds);
+
+ /**
+ * Sets whether we are currently in an interactive split screen resize operation where we
+ * are changing the docked stack size.
+ */
+ void setSplitScreenResizing(boolean resizing);
+ int setVrMode(in IBinder token, boolean enabled, in ComponentName packageName);
+ void startLocalVoiceInteraction(in IBinder token, in Bundle options);
+ void stopLocalVoiceInteraction(in IBinder token);
+ boolean supportsLocalVoiceInteraction();
+ void notifyPinnedStackAnimationStarted();
+ void notifyPinnedStackAnimationEnded();
+
+ /**
+ * Resizes the pinned stack.
+ *
+ * @param pinnedBounds The bounds for the pinned stack.
+ * @param tempPinnedTaskBounds The temporary bounds for the tasks in the pinned stack, which
+ * might be different from the stack bounds to allow more
+ * flexibility while resizing, or {@code null} if they should be the
+ * same as the stack bounds.
+ */
+ void resizePinnedStack(in Rect pinnedBounds, in Rect tempPinnedTaskBounds);
+
+ /**
+ * Updates override configuration applied to specific display.
+ * @param values Update values for display configuration. If null is passed it will request the
+ * Window Manager to compute new config for the specified display.
+ * @param displayId Id of the display to apply the config to.
+ * @throws RemoteException
+ * @return Returns true if the configuration was updated.
+ */
+ boolean updateDisplayOverrideConfiguration(in Configuration values, int displayId);
+ void dismissKeyguard(in IBinder token, in IKeyguardDismissCallback callback,
+ in CharSequence message);
+
+ /** Cancels the window transitions for the given task. */
+ void cancelTaskWindowTransition(int taskId);
+
+ /**
+ * @param taskId the id of the task to retrieve the sAutoapshots for
+ * @param reducedResolution if set, if the snapshot needs to be loaded from disk, this will load
+ * a reduced resolution of it, which is much faster
+ * @return a graphic buffer representing a screenshot of a task
+ */
+ ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution);
+
+ /**
+ * See {@link android.app.Activity#setDisablePreviewScreenshots}
+ */
+ void setDisablePreviewScreenshots(IBinder token, boolean disable);
+
+ /**
+ * Return the user id of last resumed activity.
+ */
+ int getLastResumedActivityUserId();
+
+ /**
+ * Updates global configuration and applies changes to the entire system.
+ * @param values Update values for global configuration. If null is passed it will request the
+ * Window Manager to compute new config for the default display.
+ * @throws RemoteException
+ * @return Returns true if the configuration was updated.
+ */
+ boolean updateConfiguration(in Configuration values);
+ void updateLockTaskFeatures(int userId, int flags);
+
+ void setShowWhenLocked(in IBinder token, boolean showWhenLocked);
+ void setTurnScreenOn(in IBinder token, boolean turnScreenOn);
+
+ /**
+ * Registers remote animations for a specific activity.
+ */
+ void registerRemoteAnimations(in IBinder token, in RemoteAnimationDefinition definition);
+
+ /**
+ * Registers a remote animation to be run for all activity starts from a certain package during
+ * a short predefined amount of time.
+ */
+ void registerRemoteAnimationForNextActivityStart(in String packageName,
+ in RemoteAnimationAdapter adapter);
+
+ /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */
+ void alwaysShowUnsupportedCompileSdkWarning(in ComponentName activity);
+
+ void setVrThread(int tid);
+ void setPersistentVrThread(int tid);
+ void stopAppSwitches();
+ void resumeAppSwitches();
+ void setActivityController(in IActivityController watcher, boolean imAMonkey);
+ void setVoiceKeepAwake(in IVoiceInteractionSession session, boolean keepAwake);
+}
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index ae9b83ec0122..fcb6c14d052c 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -38,6 +38,7 @@ import android.os.IBinder;
import android.os.IInterface;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
+import android.os.RemoteCallback;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.content.ReferrerIntent;
@@ -95,7 +96,7 @@ oneway interface IApplicationThread {
void dispatchPackageBroadcast(int cmd, in String[] packages);
void scheduleCrash(in String msg);
void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, in String path,
- in ParcelFileDescriptor fd);
+ in ParcelFileDescriptor fd, in RemoteCallback finishCallback);
void dumpActivity(in ParcelFileDescriptor fd, IBinder servicetoken, in String prefix,
in String[] args);
void clearDnsCache();
diff --git a/core/java/android/app/IUiAutomationConnection.aidl b/core/java/android/app/IUiAutomationConnection.aidl
index d01938b123b1..ac4bf7d9c2c5 100644
--- a/core/java/android/app/IUiAutomationConnection.aidl
+++ b/core/java/android/app/IUiAutomationConnection.aidl
@@ -47,7 +47,8 @@ interface IUiAutomationConnection {
in ParcelFileDescriptor source);
void grantRuntimePermission(String packageName, String permission, int userId);
void revokeRuntimePermission(String packageName, String permission, int userId);
-
+ void adoptShellPermissionIdentity(int uid);
+ void dropShellPermissionIdentity();
// Called from the system process.
oneway void shutdown();
}
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index 0af024529a65..2d0b59870d7d 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -1314,7 +1314,8 @@ public class Instrumentation {
* @param activity The activity being restored.
* @param savedInstanceState The previously saved state being restored.
*/
- public void callActivityOnRestoreInstanceState(Activity activity, Bundle savedInstanceState) {
+ public void callActivityOnRestoreInstanceState(@NonNull Activity activity,
+ @NonNull Bundle savedInstanceState) {
activity.performRestoreInstanceState(savedInstanceState);
}
@@ -1323,11 +1324,12 @@ public class Instrumentation {
* method. The default implementation simply calls through to that method.
*
* @param activity The activity being restored.
- * @param savedInstanceState The previously saved state being restored.
+ * @param savedInstanceState The previously saved state being restored (or null).
* @param persistentState The previously persisted state (or null)
*/
- public void callActivityOnRestoreInstanceState(Activity activity, Bundle savedInstanceState,
- PersistableBundle persistentState) {
+ public void callActivityOnRestoreInstanceState(@NonNull Activity activity,
+ @Nullable Bundle savedInstanceState,
+ @Nullable PersistableBundle persistentState) {
activity.performRestoreInstanceState(savedInstanceState, persistentState);
}
@@ -1336,11 +1338,12 @@ public class Instrumentation {
* The default implementation simply calls through to that method.
*
* @param activity The activity being created.
- * @param icicle The previously frozen state (or null) to pass through to
+ * @param savedInstanceState The previously saved state (or null) to pass through to
* onPostCreate().
*/
- public void callActivityOnPostCreate(Activity activity, Bundle icicle) {
- activity.onPostCreate(icicle);
+ public void callActivityOnPostCreate(@NonNull Activity activity,
+ @Nullable Bundle savedInstanceState) {
+ activity.onPostCreate(savedInstanceState);
}
/**
@@ -1348,12 +1351,14 @@ public class Instrumentation {
* The default implementation simply calls through to that method.
*
* @param activity The activity being created.
- * @param icicle The previously frozen state (or null) to pass through to
+ * @param savedInstanceState The previously frozen state (or null) to pass through to
* onPostCreate().
+ * @param persistentState The previously persisted state (or null)
*/
- public void callActivityOnPostCreate(Activity activity, Bundle icicle,
- PersistableBundle persistentState) {
- activity.onPostCreate(icicle, persistentState);
+ public void callActivityOnPostCreate(@NonNull Activity activity,
+ @Nullable Bundle savedInstanceState,
+ @Nullable PersistableBundle persistentState) {
+ activity.onPostCreate(savedInstanceState, persistentState);
}
/**
@@ -1440,7 +1445,8 @@ public class Instrumentation {
* @param activity The activity being saved.
* @param outState The bundle to pass to the call.
*/
- public void callActivityOnSaveInstanceState(Activity activity, Bundle outState) {
+ public void callActivityOnSaveInstanceState(@NonNull Activity activity,
+ @NonNull Bundle outState) {
activity.performSaveInstanceState(outState);
}
@@ -1451,8 +1457,8 @@ public class Instrumentation {
* @param outState The bundle to pass to the call.
* @param outPersistentState The persistent bundle to pass to the call.
*/
- public void callActivityOnSaveInstanceState(Activity activity, Bundle outState,
- PersistableBundle outPersistentState) {
+ public void callActivityOnSaveInstanceState(@NonNull Activity activity,
+ @NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
activity.performSaveInstanceState(outState, outPersistentState);
}
@@ -1667,7 +1673,7 @@ public class Instrumentation {
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
@@ -1739,7 +1745,7 @@ public class Instrumentation {
intents[i].prepareToLeaveProcess(who);
resolvedTypes[i] = intents[i].resolveTypeIfNeeded(who.getContentResolver());
}
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivities(whoThread, who.getBasePackageName(), intents, resolvedTypes,
token, options, userId);
checkStartActivityResult(result, intents[0]);
@@ -1807,7 +1813,7 @@ public class Instrumentation {
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target, requestCode, 0, null, options);
@@ -1875,7 +1881,7 @@ public class Instrumentation {
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivityAsUser(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, resultWho,
@@ -1922,7 +1928,7 @@ public class Instrumentation {
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivityAsCaller(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java
index 4a3fcaf3e64e..9ceecd96363f 100644
--- a/core/java/android/app/KeyguardManager.java
+++ b/core/java/android/app/KeyguardManager.java
@@ -33,7 +33,6 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
-import android.os.UserHandle;
import android.provider.Settings;
import android.service.persistentdata.IPersistentDataBlockService;
import android.util.Log;
@@ -48,8 +47,8 @@ import com.android.internal.widget.LockPatternUtils;
import java.util.List;
/**
- * Class that can be used to lock and unlock the keyboard. The
- * actual class to control the keyboard locking is
+ * Class that can be used to lock and unlock the keyguard. The
+ * actual class to control the keyguard locking is
* {@link android.app.KeyguardManager.KeyguardLock}.
*/
@SystemService(Context.KEYGUARD_SERVICE)
@@ -343,11 +342,11 @@ public class KeyguardManager {
* moves in and out of the foreground and does not require that any special
* permissions be requested.
*
- * Enables you to lock or unlock the keyboard. Get an instance of this class by
+ * Enables you to lock or unlock the keyguard. Get an instance of this class by
* calling {@link android.content.Context#getSystemService(java.lang.String) Context.getSystemService()}.
* This class is wrapped by {@link android.app.KeyguardManager KeyguardManager}.
* @param tag A tag that informally identifies who you are (for debugging who
- * is disabling he keyguard).
+ * is disabling the keyguard).
*
* @return A {@link KeyguardLock} handle to use to disable and reenable the
* keyguard.
@@ -514,7 +513,8 @@ public class KeyguardManager {
public void requestDismissKeyguard(@NonNull Activity activity, @Nullable CharSequence message,
@Nullable KeyguardDismissCallback callback) {
try {
- mAm.dismissKeyguard(activity.getActivityToken(), new IKeyguardDismissCallback.Stub() {
+ ActivityTaskManager.getService().dismissKeyguard(
+ activity.getActivityToken(), new IKeyguardDismissCallback.Stub() {
@Override
public void onDismissError() throws RemoteException {
if (callback != null && !activity.isDestroyed()) {
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 1ea93a419113..74d3c0df87ad 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -16,7 +16,7 @@
package android.app;
-import static com.android.internal.util.NotificationColorUtil.satisfiesTextContrast;
+import static com.android.internal.util.ContrastColorUtil.satisfiesTextContrast;
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
@@ -79,7 +79,7 @@ import android.widget.RemoteViews;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.internal.util.Preconditions;
import java.lang.annotation.Retention;
@@ -202,6 +202,11 @@ public class Notification implements Parcelable
*/
private static final int MAX_REPLY_HISTORY = 5;
+ /**
+ * Maximum numbers of action buttons in a notification.
+ * @hide
+ */
+ public static final int MAX_ACTION_BUTTONS = 3;
/**
* If the notification contained an unsent draft for a RemoteInput when the user clicked on it,
@@ -1121,11 +1126,11 @@ public class Notification implements Parcelable
public static final String EXTRA_ALLOW_DURING_SETUP = "android.allowDuringSetup";
/**
- * {@link #extras} key: A
- * {@link android.content.ContentUris content URI} pointing to an image that can be displayed
- * in the background when the notification is selected. Used on television platforms.
- * The URI must point to an image stream suitable for passing into
- * {@link android.graphics.BitmapFactory#decodeStream(java.io.InputStream)
+ * {@link #extras} key:
+ * flat {@link String} representation of a {@link android.content.ContentUris content URI}
+ * pointing to an image that can be displayed in the background when the notification is
+ * selected. Used on television platforms. The URI must point to an image stream suitable for
+ * passing into {@link android.graphics.BitmapFactory#decodeStream(java.io.InputStream)
* BitmapFactory.decodeStream}; all other content types will be ignored.
*/
public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
@@ -2346,7 +2351,9 @@ public class Notification implements Parcelable
if (extras != null) {
visitor.accept(extras.getParcelable(EXTRA_AUDIO_CONTENTS_URI));
- visitor.accept(extras.getParcelable(EXTRA_BACKGROUND_IMAGE_URI));
+ if (extras.containsKey(EXTRA_BACKGROUND_IMAGE_URI)) {
+ visitor.accept(Uri.parse(extras.getString(EXTRA_BACKGROUND_IMAGE_URI)));
+ }
}
if (MessagingStyle.class.equals(getNotificationStyle()) && extras != null) {
@@ -2767,7 +2774,6 @@ public class Notification implements Parcelable
*/
private void fixDuplicateExtras() {
if (extras != null) {
- fixDuplicateExtra(mSmallIcon, EXTRA_SMALL_ICON);
fixDuplicateExtra(mLargeIcon, EXTRA_LARGE_ICON);
}
}
@@ -3150,8 +3156,6 @@ public class Notification implements Parcelable
public static final String EXTRA_REBUILD_HEADS_UP_CONTENT_VIEW_ACTION_COUNT
= "android.rebuild.hudViewActionCount";
- private static final int MAX_ACTION_BUTTONS = 3;
-
private static final boolean USE_ONLY_TITLE_IN_LOW_PRIORITY_SUMMARY =
SystemProperties.getBoolean("notifications.only_title", true);
@@ -3174,7 +3178,7 @@ public class Notification implements Parcelable
private Style mStyle;
private ArrayList<Action> mActions = new ArrayList<Action>(MAX_ACTION_BUTTONS);
private ArrayList<Person> mPersonList = new ArrayList<>();
- private NotificationColorUtil mColorUtil;
+ private ContrastColorUtil mColorUtil;
private boolean mIsLegacy;
private boolean mIsLegacyInitialized;
@@ -3305,9 +3309,9 @@ public class Notification implements Parcelable
}
}
- private NotificationColorUtil getColorUtil() {
+ private ContrastColorUtil getColorUtil() {
if (mColorUtil == null) {
- mColorUtil = NotificationColorUtil.getInstance(mContext);
+ mColorUtil = ContrastColorUtil.getInstance(mContext);
}
return mColorUtil;
}
@@ -3877,7 +3881,6 @@ public class Notification implements Parcelable
*
* @see Notification#FLAG_ONGOING_EVENT
- * @see Service#setForeground(boolean)
*/
public Builder setOngoing(boolean ongoing) {
setFlag(FLAG_ONGOING_EVENT, ongoing);
@@ -3896,7 +3899,7 @@ public class Notification implements Parcelable
* However, for {@link MediaStyle} and {@link DecoratedMediaCustomViewStyle} notifications
* that have a media session attached there is no such requirement.
*
- * @see Builder#setColor(int)
+ * @see #setColor(int)
* @see MediaStyle#setMediaSession(MediaSession.Token)
*/
public Builder setColorized(boolean colorize) {
@@ -4426,7 +4429,7 @@ public class Notification implements Parcelable
private CharSequence processTextSpans(CharSequence text) {
if (hasForegroundColor()) {
- return NotificationColorUtil.clearColorSpans(text);
+ return ContrastColorUtil.clearColorSpans(text);
}
return text;
}
@@ -4472,20 +4475,20 @@ public class Notification implements Parcelable
|| mTextColorsAreForBackground != backgroundColor) {
mTextColorsAreForBackground = backgroundColor;
if (!hasForegroundColor() || !isColorized()) {
- mPrimaryTextColor = NotificationColorUtil.resolvePrimaryColor(mContext,
- backgroundColor);
- mSecondaryTextColor = NotificationColorUtil.resolveSecondaryColor(mContext,
- backgroundColor);
+ mPrimaryTextColor = ContrastColorUtil.resolvePrimaryColor(mContext,
+ backgroundColor, mInNightMode);
+ mSecondaryTextColor = ContrastColorUtil.resolveSecondaryColor(mContext,
+ backgroundColor, mInNightMode);
if (backgroundColor != COLOR_DEFAULT && isColorized()) {
- mPrimaryTextColor = NotificationColorUtil.findAlphaToMeetContrast(
+ mPrimaryTextColor = ContrastColorUtil.findAlphaToMeetContrast(
mPrimaryTextColor, backgroundColor, 4.5);
- mSecondaryTextColor = NotificationColorUtil.findAlphaToMeetContrast(
+ mSecondaryTextColor = ContrastColorUtil.findAlphaToMeetContrast(
mSecondaryTextColor, backgroundColor, 4.5);
}
} else {
- double backLum = NotificationColorUtil.calculateLuminance(backgroundColor);
- double textLum = NotificationColorUtil.calculateLuminance(mForegroundColor);
- double contrast = NotificationColorUtil.calculateContrast(mForegroundColor,
+ double backLum = ContrastColorUtil.calculateLuminance(backgroundColor);
+ double textLum = ContrastColorUtil.calculateLuminance(mForegroundColor);
+ double contrast = ContrastColorUtil.calculateContrast(mForegroundColor,
backgroundColor);
// We only respect the given colors if worst case Black or White still has
// contrast
@@ -4495,46 +4498,46 @@ public class Notification implements Parcelable
&& !satisfiesTextContrast(backgroundColor, Color.WHITE);
if (contrast < 4.5f) {
if (backgroundLight) {
- mSecondaryTextColor = NotificationColorUtil.findContrastColor(
+ mSecondaryTextColor = ContrastColorUtil.findContrastColor(
mForegroundColor,
backgroundColor,
true /* findFG */,
4.5f);
- mPrimaryTextColor = NotificationColorUtil.changeColorLightness(
+ mPrimaryTextColor = ContrastColorUtil.changeColorLightness(
mSecondaryTextColor, -LIGHTNESS_TEXT_DIFFERENCE_LIGHT);
} else {
mSecondaryTextColor =
- NotificationColorUtil.findContrastColorAgainstDark(
+ ContrastColorUtil.findContrastColorAgainstDark(
mForegroundColor,
backgroundColor,
true /* findFG */,
4.5f);
- mPrimaryTextColor = NotificationColorUtil.changeColorLightness(
+ mPrimaryTextColor = ContrastColorUtil.changeColorLightness(
mSecondaryTextColor, -LIGHTNESS_TEXT_DIFFERENCE_DARK);
}
} else {
mPrimaryTextColor = mForegroundColor;
- mSecondaryTextColor = NotificationColorUtil.changeColorLightness(
+ mSecondaryTextColor = ContrastColorUtil.changeColorLightness(
mPrimaryTextColor, backgroundLight ? LIGHTNESS_TEXT_DIFFERENCE_LIGHT
: LIGHTNESS_TEXT_DIFFERENCE_DARK);
- if (NotificationColorUtil.calculateContrast(mSecondaryTextColor,
+ if (ContrastColorUtil.calculateContrast(mSecondaryTextColor,
backgroundColor) < 4.5f) {
// oh well the secondary is not good enough
if (backgroundLight) {
- mSecondaryTextColor = NotificationColorUtil.findContrastColor(
+ mSecondaryTextColor = ContrastColorUtil.findContrastColor(
mSecondaryTextColor,
backgroundColor,
true /* findFG */,
4.5f);
} else {
mSecondaryTextColor
- = NotificationColorUtil.findContrastColorAgainstDark(
+ = ContrastColorUtil.findContrastColorAgainstDark(
mSecondaryTextColor,
backgroundColor,
true /* findFG */,
4.5f);
}
- mPrimaryTextColor = NotificationColorUtil.changeColorLightness(
+ mPrimaryTextColor = ContrastColorUtil.changeColorLightness(
mSecondaryTextColor, backgroundLight
? -LIGHTNESS_TEXT_DIFFERENCE_LIGHT
: -LIGHTNESS_TEXT_DIFFERENCE_DARK);
@@ -5246,7 +5249,7 @@ public class Notification implements Parcelable
ColorStateList[] outResultColor = null;
int background = resolveBackgroundColor();
if (isLegacy()) {
- title = NotificationColorUtil.clearColorSpans(title);
+ title = ContrastColorUtil.clearColorSpans(title);
} else {
outResultColor = new ColorStateList[1];
title = ensureColorSpanContrast(title, background, outResultColor);
@@ -5259,8 +5262,8 @@ public class Notification implements Parcelable
// There's a span spanning the full text, let's take it and use it as the
// background color
background = outResultColor[0].getDefaultColor();
- int textColor = NotificationColorUtil.resolvePrimaryColor(mContext,
- background);
+ int textColor = ContrastColorUtil.resolvePrimaryColor(mContext,
+ background, mInNightMode);
button.setTextColor(R.id.action0, textColor);
rippleColor = textColor;
} else if (mN.color != COLOR_DEFAULT && !isColorized() && mTintActionButtons) {
@@ -5320,7 +5323,7 @@ public class Notification implements Parcelable
int[] colors = textColor.getColors();
int[] newColors = new int[colors.length];
for (int i = 0; i < newColors.length; i++) {
- newColors[i] = NotificationColorUtil.ensureLargeTextContrast(
+ newColors[i] = ContrastColorUtil.ensureLargeTextContrast(
colors[i], background, mInNightMode);
}
textColor = new ColorStateList(textColor.getStates().clone(),
@@ -5340,7 +5343,7 @@ public class Notification implements Parcelable
} else if (resultSpan instanceof ForegroundColorSpan) {
ForegroundColorSpan originalSpan = (ForegroundColorSpan) resultSpan;
int foregroundColor = originalSpan.getForegroundColor();
- foregroundColor = NotificationColorUtil.ensureLargeTextContrast(
+ foregroundColor = ContrastColorUtil.ensureLargeTextContrast(
foregroundColor, background, mInNightMode);
if (fullLength) {
outResultColor[0] = ColorStateList.valueOf(foregroundColor);
@@ -5440,14 +5443,14 @@ public class Notification implements Parcelable
com.android.internal.R.color.notification_material_background_color);
if (mN.color == COLOR_DEFAULT) {
ensureColors();
- color = NotificationColorUtil.resolveDefaultColor(mContext, background);
+ color = ContrastColorUtil.resolveDefaultColor(mContext, background, mInNightMode);
} else {
- color = NotificationColorUtil.resolveContrastColor(mContext, mN.color,
+ color = ContrastColorUtil.resolveContrastColor(mContext, mN.color,
background, mInNightMode);
}
if (Color.alpha(color) < 255) {
// alpha doesn't go well for color filters, so let's blend it manually
- color = NotificationColorUtil.compositeColors(color, background);
+ color = ContrastColorUtil.compositeColors(color, background);
}
mCachedContrastColorIsFor = mN.color;
return mCachedContrastColor = color;
@@ -5459,10 +5462,11 @@ public class Notification implements Parcelable
}
int background = mContext.getColor(
com.android.internal.R.color.notification_material_background_color);
- mNeutralColor = NotificationColorUtil.resolveDefaultColor(mContext, background);
+ mNeutralColor = ContrastColorUtil.resolveDefaultColor(mContext, background,
+ mInNightMode);
if (Color.alpha(mNeutralColor) < 255) {
// alpha doesn't go well for color filters, so let's blend it manually
- mNeutralColor = NotificationColorUtil.compositeColors(mNeutralColor, background);
+ mNeutralColor = ContrastColorUtil.compositeColors(mNeutralColor, background);
}
return mNeutralColor;
}
@@ -5471,7 +5475,7 @@ public class Notification implements Parcelable
if (mCachedAmbientColorIsFor == mN.color && mCachedAmbientColorIsFor != COLOR_INVALID) {
return mCachedAmbientColor;
}
- final int contrasted = NotificationColorUtil.resolveAmbientColor(mContext, mN.color);
+ final int contrasted = ContrastColorUtil.resolveAmbientColor(mContext, mN.color);
mCachedAmbientColorIsFor = mN.color;
return mCachedAmbientColor = contrasted;
@@ -6741,7 +6745,7 @@ public class Notification implements Parcelable
* Should be unique amongst all individuals in the conversation, and should be
* consistent during re-posts of the notification.
*
- * @see Message#Message(CharSequence, long, CharSequence)
+ * @see Message#Notification.MessagingStyle.Message(CharSequence, long, CharSequence)
*
* @return this object for method chaining
*
@@ -6761,7 +6765,7 @@ public class Notification implements Parcelable
* Should be <code>null</code> for messages by the current user, in which case
* the platform will insert the user set in {@code MessagingStyle(Person)}.
*
- * @see Message#Message(CharSequence, long, CharSequence)
+ * @see Message#Notification.MessagingStyle.Message(CharSequence, long, CharSequence)
*
* @return this object for method chaining
*/
@@ -7162,8 +7166,8 @@ public class Notification implements Parcelable
}
public static final class Message {
-
- static final String KEY_TEXT = "text";
+ /** @hide */
+ public static final String KEY_TEXT = "text";
static final String KEY_TIMESTAMP = "time";
static final String KEY_SENDER = "sender";
static final String KEY_SENDER_PERSON = "sender_person";
@@ -7830,10 +7834,13 @@ public class Notification implements Parcelable
// If the action buttons should not be tinted, then just use the default
// notification color. Otherwise, just use the passed-in color.
+ Configuration currentConfig = mBuilder.mContext.getResources().getConfiguration();
+ boolean inNightMode = (currentConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK)
+ == Configuration.UI_MODE_NIGHT_YES;
int tintColor = mBuilder.shouldTintActionButtons() || mBuilder.isColorized()
? color
- : NotificationColorUtil.resolveColor(mBuilder.mContext,
- Notification.COLOR_DEFAULT);
+ : ContrastColorUtil.resolveColor(mBuilder.mContext,
+ Notification.COLOR_DEFAULT, inNightMode);
button.setDrawableTint(R.id.action0, false, tintColor,
PorterDuff.Mode.SRC_ATOP);
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index ba355f9f9c1d..03fd139e12ff 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -38,6 +38,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.Arrays;
/**
@@ -644,7 +645,7 @@ public final class NotificationChannel implements Parcelable {
@Nullable
private Uri restoreSoundUri(Context context, @Nullable Uri uri) {
- if (uri == null) {
+ if (uri == null || Uri.EMPTY.equals(uri)) {
return null;
}
ContentResolver contentResolver = context.getContentResolver();
@@ -680,7 +681,7 @@ public final class NotificationChannel implements Parcelable {
private Uri getSoundForBackup(Context context) {
Uri sound = getSound();
- if (sound == null) {
+ if (sound == null || Uri.EMPTY.equals(sound)) {
return null;
}
Uri canonicalSound = context.getContentResolver().canonicalize(sound);
@@ -942,6 +943,32 @@ public final class NotificationChannel implements Parcelable {
return result;
}
+ /** @hide */
+ public void dump(PrintWriter pw, String prefix, boolean redacted) {
+ String redactedName = redacted ? TextUtils.trimToLengthWithEllipsis(mName, 3) : mName;
+ String output = "NotificationChannel{"
+ + "mId='" + mId + '\''
+ + ", mName=" + redactedName
+ + ", mDescription=" + (!TextUtils.isEmpty(mDesc) ? "hasDescription " : "")
+ + ", mImportance=" + mImportance
+ + ", mBypassDnd=" + mBypassDnd
+ + ", mLockscreenVisibility=" + mLockscreenVisibility
+ + ", mSound=" + mSound
+ + ", mLights=" + mLights
+ + ", mLightColor=" + mLightColor
+ + ", mVibration=" + Arrays.toString(mVibration)
+ + ", mUserLockedFields=" + Integer.toHexString(mUserLockedFields)
+ + ", mFgServiceShown=" + mFgServiceShown
+ + ", mVibrationEnabled=" + mVibrationEnabled
+ + ", mShowBadge=" + mShowBadge
+ + ", mDeleted=" + mDeleted
+ + ", mGroup='" + mGroup + '\''
+ + ", mAudioAttributes=" + mAudioAttributes
+ + ", mBlockableSystem=" + mBlockableSystem
+ + '}';
+ pw.println(prefix + output);
+ }
+
@Override
public String toString() {
return "NotificationChannel{"
diff --git a/core/java/android/app/PictureInPictureParams.java b/core/java/android/app/PictureInPictureParams.java
index 7313b0d941e5..edaae75eba53 100644
--- a/core/java/android/app/PictureInPictureParams.java
+++ b/core/java/android/app/PictureInPictureParams.java
@@ -17,6 +17,7 @@
package android.app;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
@@ -181,6 +182,7 @@ public final class PictureInPictureParams implements Parcelable {
* @return the aspect ratio. If none is set, return 0.
* @hide
*/
+ @TestApi
public float getAspectRatio() {
if (mAspectRatio != null) {
return mAspectRatio.floatValue();
@@ -205,6 +207,7 @@ public final class PictureInPictureParams implements Parcelable {
* @return the set of user actions.
* @hide
*/
+ @TestApi
public List<RemoteAction> getActions() {
return mUserActions;
}
@@ -231,6 +234,7 @@ public final class PictureInPictureParams implements Parcelable {
* @return the source rect hint
* @hide
*/
+ @TestApi
public Rect getSourceRectHint() {
return mSourceRectHint;
}
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 49faf4029157..ed6d2f57ba48 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -951,7 +951,7 @@ public class SearchManager
try {
Intent intent = new Intent(Intent.ACTION_ASSIST);
if (inclContext) {
- IActivityManager am = ActivityManager.getService();
+ IActivityTaskManager am = ActivityTaskManager.getService();
Bundle extras = am.getAssistContextExtras(ActivityManager.ASSIST_CONTEXT_BASIC);
if (extras != null) {
intent.replaceExtras(extras);
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index b83b44d295b4..c8a831366e23 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -132,9 +132,10 @@ public class StatusBarManager {
*/
public void disable(int what) {
try {
+ final int userId = Binder.getCallingUserHandle().getIdentifier();
final IStatusBarService svc = getService();
if (svc != null) {
- svc.disable(what, mToken, mContext.getPackageName());
+ svc.disableForUser(what, mToken, mContext.getPackageName(), userId);
}
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
@@ -149,9 +150,10 @@ public class StatusBarManager {
*/
public void disable2(@Disable2Flags int what) {
try {
+ final int userId = Binder.getCallingUserHandle().getIdentifier();
final IStatusBarService svc = getService();
if (svc != null) {
- svc.disable2(what, mToken, mContext.getPackageName());
+ svc.disable2ForUser(what, mToken, mContext.getPackageName(), userId);
}
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index db011dabac9e..b432baad04e6 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -24,7 +24,9 @@ import android.app.admin.IDevicePolicyManager;
import android.app.job.IJobScheduler;
import android.app.job.JobScheduler;
import android.app.slice.SliceManager;
+import android.app.timedetector.TimeDetector;
import android.app.timezone.RulesManager;
+import android.app.timezonedetector.TimeZoneDetector;
import android.app.trust.TrustManager;
import android.app.usage.IStorageStatsManager;
import android.app.usage.IUsageStatsManager;
@@ -53,6 +55,8 @@ import android.hardware.SerialManager;
import android.hardware.SystemSensorManager;
import android.hardware.camera2.CameraManager;
import android.hardware.display.DisplayManager;
+import android.hardware.face.FaceManager;
+import android.hardware.face.IFaceService;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.hdmi.HdmiControlManager;
@@ -141,6 +145,7 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.euicc.EuiccCardManager;
import android.telephony.euicc.EuiccManager;
+import android.util.ArrayMap;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
@@ -162,7 +167,7 @@ import com.android.internal.net.INetworkWatchlistManager;
import com.android.internal.os.IDropBoxManagerService;
import com.android.internal.policy.PhoneLayoutInflater;
-import java.util.HashMap;
+import java.util.Map;
/**
* Manages all of the system services that can be returned by {@link Context#getSystemService}.
@@ -173,10 +178,10 @@ final class SystemServiceRegistry {
// Service registry information.
// This information is never changed once static initialization has completed.
- private static final HashMap<Class<?>, String> SYSTEM_SERVICE_NAMES =
- new HashMap<Class<?>, String>();
- private static final HashMap<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS =
- new HashMap<String, ServiceFetcher<?>>();
+ private static final Map<Class<?>, String> SYSTEM_SERVICE_NAMES =
+ new ArrayMap<Class<?>, String>();
+ private static final Map<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS =
+ new ArrayMap<String, ServiceFetcher<?>>();
private static int sServiceCacheSize;
// Not instantiable.
@@ -213,6 +218,14 @@ final class SystemServiceRegistry {
return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
}});
+ registerService(Context.ACTIVITY_TASK_SERVICE, ActivityTaskManager.class,
+ new CachedServiceFetcher<ActivityTaskManager>() {
+ @Override
+ public ActivityTaskManager createService(ContextImpl ctx) {
+ return new ActivityTaskManager(
+ ctx.getOuterContext(), ctx.mMainThread.getHandler());
+ }});
+
registerService(Context.ALARM_SERVICE, AlarmManager.class,
new CachedServiceFetcher<AlarmManager>() {
@Override
@@ -516,7 +529,7 @@ final class SystemServiceRegistry {
new CachedServiceFetcher<CarrierConfigManager>() {
@Override
public CarrierConfigManager createService(ContextImpl ctx) {
- return new CarrierConfigManager();
+ return new CarrierConfigManager(ctx.getOuterContext());
}});
registerService(Context.TELECOM_SERVICE, TelecomManager.class,
@@ -781,6 +794,22 @@ final class SystemServiceRegistry {
return new FingerprintManager(ctx.getOuterContext(), service);
}});
+ registerService(Context.FACE_SERVICE, FaceManager.class,
+ new CachedServiceFetcher<FaceManager>() {
+ @Override
+ public FaceManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ final IBinder binder;
+ if (ctx.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
+ binder = ServiceManager.getServiceOrThrow(Context.FACE_SERVICE);
+ } else {
+ binder = ServiceManager.getService(Context.FACE_SERVICE);
+ }
+ IFaceService service = IFaceService.Stub.asInterface(binder);
+ return new FaceManager(ctx.getOuterContext(), service);
+ }
+ });
+
registerService(Context.TV_INPUT_SERVICE, TvInputManager.class,
new CachedServiceFetcher<TvInputManager>() {
@Override
@@ -997,6 +1026,21 @@ final class SystemServiceRegistry {
Context.DEVICE_IDLE_CONTROLLER));
return new DeviceIdleManager(ctx.getOuterContext(), service);
}});
+
+ registerService(Context.TIME_DETECTOR_SERVICE, TimeDetector.class,
+ new CachedServiceFetcher<TimeDetector>() {
+ @Override
+ public TimeDetector createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ return new TimeDetector();
+ }});
+ registerService(Context.TIME_ZONE_DETECTOR_SERVICE, TimeZoneDetector.class,
+ new CachedServiceFetcher<TimeZoneDetector>() {
+ @Override
+ public TimeZoneDetector createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ return new TimeZoneDetector();
+ }});
}
/**
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 5662aeae8110..44f2879601b8 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -33,6 +33,7 @@ import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
+import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
@@ -50,6 +51,7 @@ import android.view.accessibility.AccessibilityWindowInfo;
import android.view.accessibility.IAccessibilityInteractionConnection;
import com.android.internal.util.function.pooled.PooledLambda;
+
import libcore.io.IoUtils;
import java.io.IOException;
@@ -347,6 +349,46 @@ public final class UiAutomation {
}
/**
+ * Adopt the permission identity of the shell UID. This allows you to call APIs protected
+ * permissions which normal apps cannot hold but are granted to the shell UID. If you
+ * already adopted the shell permission identity this method would be a no-op.
+ * Note that your permission state becomes that of the shell UID and it is not a
+ * combination of your and the shell UID permissions.
+ *
+ * @see #dropShellPermissionIdentity()
+ */
+ public void adoptShellPermissionIdentity() {
+ synchronized (mLock) {
+ throwIfNotConnectedLocked();
+ }
+ try {
+ // Calling out without a lock held.
+ mUiAutomationConnection.adoptShellPermissionIdentity(Process.myUid());
+ } catch (RemoteException re) {
+ Log.e(LOG_TAG, "Error executing adopting shell permission identity!", re);
+ }
+ }
+
+ /**
+ * Drop the shell permission identity adopted by a previous call to
+ * {@link #adoptShellPermissionIdentity()}. If you did not adopt the shell permission
+ * identity this method would be a no-op.
+ *
+ * @see #adoptShellPermissionIdentity()
+ */
+ public void dropShellPermissionIdentity() {
+ synchronized (mLock) {
+ throwIfNotConnectedLocked();
+ }
+ try {
+ // Calling out without a lock held.
+ mUiAutomationConnection.dropShellPermissionIdentity();
+ } catch (RemoteException re) {
+ Log.e(LOG_TAG, "Error executing dropping shell permission identity!", re);
+ }
+ }
+
+ /**
* Performs a global action. Such an action can be performed at any moment
* regardless of the current application or user location in that application.
* For example going back, going home, opening recents, etc.
@@ -999,6 +1041,8 @@ public final class UiAutomation {
*
* @param command The command to execute.
* @return A file descriptor to the standard output stream.
+ *
+ * @see #adoptShellPermissionIdentity()
*/
public ParcelFileDescriptor executeShellCommand(String command) {
synchronized (mLock) {
@@ -1081,22 +1125,6 @@ public final class UiAutomation {
return result;
}
- private static float getDegreesForRotation(int value) {
- switch (value) {
- case Surface.ROTATION_90: {
- return 360f - 90f;
- }
- case Surface.ROTATION_180: {
- return 360f - 180f;
- }
- case Surface.ROTATION_270: {
- return 360f - 270f;
- } default: {
- return 0;
- }
- }
- }
-
private boolean isConnectedLocked() {
return mConnectionId != CONNECTION_ID_UNDEFINED;
}
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index d3828ab47883..ac3f2e7a14d0 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -30,6 +30,7 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
+import android.util.Log;
import android.view.IWindowManager;
import android.view.InputEvent;
import android.view.SurfaceControl;
@@ -37,7 +38,6 @@ import android.view.WindowAnimationFrameStats;
import android.view.WindowContentFrameStats;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.IAccessibilityManager;
-import android.util.Log;
import libcore.io.IoUtils;
@@ -71,6 +71,9 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
private final IPackageManager mPackageManager = IPackageManager.Stub
.asInterface(ServiceManager.getService("package"));
+ private final IActivityManager mActivityManager = IActivityManager.Stub
+ .asInterface(ServiceManager.getService("activity"));
+
private final Object mLock = new Object();
private final Binder mToken = new Binder();
@@ -274,6 +277,36 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
}
}
+ @Override
+ public void adoptShellPermissionIdentity(int uid) throws RemoteException {
+ synchronized (mLock) {
+ throwIfCalledByNotTrustedUidLocked();
+ throwIfShutdownLocked();
+ throwIfNotConnectedLocked();
+ }
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mActivityManager.startDelegateShellPermissionIdentity(uid);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void dropShellPermissionIdentity() throws RemoteException {
+ synchronized (mLock) {
+ throwIfCalledByNotTrustedUidLocked();
+ throwIfShutdownLocked();
+ throwIfNotConnectedLocked();
+ }
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mActivityManager.stopDelegateShellPermissionIdentity();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
public class Repeater implements Runnable {
// Continuously read readFrom and write back to writeTo until EOF is encountered
private final InputStream readFrom;
diff --git a/core/java/android/app/Vr2dDisplayProperties.java b/core/java/android/app/Vr2dDisplayProperties.java
index 0eb2af361ae9..2fd82b2d29e2 100644
--- a/core/java/android/app/Vr2dDisplayProperties.java
+++ b/core/java/android/app/Vr2dDisplayProperties.java
@@ -16,20 +16,31 @@
package android.app;
+import android.annotation.IntDef;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/**
* Display properties to be used by VR mode when creating a virtual display.
*
* @hide
*/
+@SystemApi
public final class Vr2dDisplayProperties implements Parcelable {
public static final int FLAG_VIRTUAL_DISPLAY_ENABLED = 1;
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ FLAG_VIRTUAL_DISPLAY_ENABLED
+ })
+ public @interface Vr2dDisplayFlag {}
+
/**
* The actual width, height and dpi.
*/
@@ -79,7 +90,7 @@ public final class Vr2dDisplayProperties implements Parcelable {
Vr2dDisplayProperties that = (Vr2dDisplayProperties) o;
- if (getFlags() != that.getFlags()) return false;
+ if (getAddedFlags() != that.getAddedFlags()) return false;
if (getRemovedFlags() != that.getRemovedFlags()) return false;
if (getWidth() != that.getWidth()) return false;
if (getHeight() != that.getHeight()) return false;
@@ -121,26 +132,46 @@ public final class Vr2dDisplayProperties implements Parcelable {
mRemovedFlags = source.readInt();
}
+ /**
+ * Prints out dump info.
+ */
public void dump(PrintWriter pw, String prefix) {
pw.println(prefix + toString());
}
+ /**
+ * Returns the width of VR 2d display.
+ */
public int getWidth() {
return mWidth;
}
+ /**
+ * Returns the height of VR 2d display.
+ */
public int getHeight() {
return mHeight;
}
+ /**
+ * Returns the dpi of VR 2d display.
+ */
public int getDpi() {
return mDpi;
}
- public int getFlags() {
+ /**
+ * Returns the added flags of VR 2d display. Flags are combined by logic or.
+ */
+ @Vr2dDisplayFlag
+ public int getAddedFlags() {
return mAddedFlags;
}
+ /**
+ * Returns the removed flags of VR 2d display. Flags are combined by logic or.
+ */
+ @Vr2dDisplayFlag
public int getRemovedFlags() {
return mRemovedFlags;
}
@@ -193,7 +224,7 @@ public final class Vr2dDisplayProperties implements Parcelable {
/**
* Adds property flags.
*/
- public Builder addFlags(int flags) {
+ public Builder addFlags(@Vr2dDisplayFlag int flags) {
mAddedFlags |= flags;
mRemovedFlags &= ~flags;
return this;
@@ -202,7 +233,7 @@ public final class Vr2dDisplayProperties implements Parcelable {
/**
* Removes property flags.
*/
- public Builder removeFlags(int flags) {
+ public Builder removeFlags(@Vr2dDisplayFlag int flags) {
mRemovedFlags |= flags;
mAddedFlags &= ~flags;
return this;
diff --git a/core/java/android/app/VrManager.java b/core/java/android/app/VrManager.java
index 61b90e1766e5..e118edd8dbb8 100644
--- a/core/java/android/app/VrManager.java
+++ b/core/java/android/app/VrManager.java
@@ -1,5 +1,6 @@
package android.app;
+import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
@@ -7,14 +8,15 @@ import android.annotation.SystemService;
import android.annotation.TestApi;
import android.content.ComponentName;
import android.content.Context;
-import android.os.Handler;
import android.os.RemoteException;
import android.service.vr.IPersistentVrStateCallbacks;
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.util.ArrayMap;
+import android.view.Display;
import java.util.Map;
+import java.util.concurrent.Executor;
/**
* Used to control aspects of a devices Virtual Reality (VR) capabilities.
@@ -28,7 +30,7 @@ public class VrManager {
final IVrStateCallbacks mStateCallback = new IVrStateCallbacks.Stub() {
@Override
public void onVrStateChanged(boolean enabled) {
- mHandler.post(() -> mCallback.onVrStateChanged(enabled));
+ mExecutor.execute(() -> mCallback.onVrStateChanged(enabled));
}
};
@@ -36,15 +38,15 @@ public class VrManager {
new IPersistentVrStateCallbacks.Stub() {
@Override
public void onPersistentVrStateChanged(boolean enabled) {
- mHandler.post(() -> mCallback.onPersistentVrStateChanged(enabled));
+ mExecutor.execute(() -> mCallback.onPersistentVrStateChanged(enabled));
}
};
final VrStateCallback mCallback;
- final Handler mHandler;
+ final Executor mExecutor;
- CallbackEntry(VrStateCallback callback, Handler handler) {
+ CallbackEntry(VrStateCallback callback, Executor executor) {
mCallback = callback;
- mHandler = handler;
+ mExecutor = executor;
}
}
@@ -62,18 +64,18 @@ public class VrManager {
* Registers a callback to be notified of changes to the VR Mode state.
*
* @param callback The callback to register.
- * @hide
*/
@RequiresPermission(anyOf = {
android.Manifest.permission.RESTRICTED_VR_ACCESS,
android.Manifest.permission.ACCESS_VR_STATE
})
- public void registerVrStateCallback(VrStateCallback callback, @NonNull Handler handler) {
+ public void registerVrStateCallback(@NonNull @CallbackExecutor Executor executor,
+ VrStateCallback callback) {
if (callback == null || mCallbackMap.containsKey(callback)) {
return;
}
- CallbackEntry entry = new CallbackEntry(callback, handler);
+ CallbackEntry entry = new CallbackEntry(callback, executor);
mCallbackMap.put(callback, entry);
try {
mService.registerListener(entry.mStateCallback);
@@ -91,7 +93,6 @@ public class VrManager {
* Deregisters VR State callbacks.
*
* @param callback The callback to deregister.
- * @hide
*/
@RequiresPermission(anyOf = {
android.Manifest.permission.RESTRICTED_VR_ACCESS,
@@ -116,13 +117,12 @@ public class VrManager {
/**
* Returns the current VrMode state.
- * @hide
*/
@RequiresPermission(anyOf = {
android.Manifest.permission.RESTRICTED_VR_ACCESS,
android.Manifest.permission.ACCESS_VR_STATE
})
- public boolean getVrModeEnabled() {
+ public boolean isVrModeEnabled() {
try {
return mService.getVrModeState();
} catch (RemoteException e) {
@@ -133,13 +133,12 @@ public class VrManager {
/**
* Returns the current VrMode state.
- * @hide
*/
@RequiresPermission(anyOf = {
android.Manifest.permission.RESTRICTED_VR_ACCESS,
android.Manifest.permission.ACCESS_VR_STATE
})
- public boolean getPersistentVrModeEnabled() {
+ public boolean isPersistentVrModeEnabled() {
try {
return mService.getPersistentVrModeEnabled();
} catch (RemoteException e) {
@@ -172,7 +171,6 @@ public class VrManager {
* @param vr2dDisplayProp properties to be set to the virtual display for
* 2D applications in VR mode.
*
- * {@hide}
*/
@RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS)
public void setVr2dDisplayProperties(
@@ -205,7 +203,6 @@ public class VrManager {
* devices. Standby mode is a deep sleep state where it's appropriate to turn off vr mode.
*
* @param standby True if the device is entering standby, false if it's exiting standby.
- * @hide
*/
@RequiresPermission(android.Manifest.permission.ACCESS_VR_MANAGER)
public void setStandbyEnabled(boolean standby) {
@@ -222,7 +219,6 @@ public class VrManager {
* regular phone IME.
* @param componentName ComponentName of a VR InputMethod that should be set as selected
* input by InputMethodManagerService.
- * @hide
*/
@TestApi
@RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS)
@@ -233,4 +229,19 @@ public class VrManager {
e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Returns the display id of VR's {@link VirtualDisplay}.
+ *
+ * @see DisplayManager#getDisplay(int)
+ */
+ @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS)
+ public int getVr2dDisplayId() {
+ try {
+ return mService.getVr2dDisplayId();
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ return Display.INVALID_DISPLAY;
+ }
}
diff --git a/core/java/android/app/VrStateCallback.java b/core/java/android/app/VrStateCallback.java
index 742faa06fd1d..c81c35130f62 100644
--- a/core/java/android/app/VrStateCallback.java
+++ b/core/java/android/app/VrStateCallback.java
@@ -15,11 +15,14 @@
*/
package android.app;
+import android.annotation.SystemApi;
+
/**
* Listens to VR Mode state changes. Use with methods in {@link VrManager}.
*
* @hide
*/
+@SystemApi
public abstract class VrStateCallback {
/**
diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java
index 60e8a121dc45..626b3be733a7 100644
--- a/core/java/android/app/WallpaperColors.java
+++ b/core/java/android/app/WallpaperColors.java
@@ -25,12 +25,15 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.Log;
import android.util.Size;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.graphics.palette.Palette;
import com.android.internal.graphics.palette.VariationalKMeansQuantizer;
+import com.android.internal.util.ContrastColorUtil;
+import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -44,6 +47,8 @@ import java.util.List;
*/
public final class WallpaperColors implements Parcelable {
+ private static final boolean DEBUG_DARK_PIXELS = false;
+
/**
* Specifies that dark text is preferred over the current wallpaper for best presentation.
* <p>
@@ -83,8 +88,8 @@ public final class WallpaperColors implements Parcelable {
private static final float BRIGHT_IMAGE_MEAN_LUMINANCE = 0.75f;
// We also check if the image has dark pixels in it,
// to avoid bright images with some dark spots.
- private static final float DARK_PIXEL_LUMINANCE = 0.45f;
- private static final float MAX_DARK_AREA = 0.05f;
+ private static final float DARK_PIXEL_CONTRAST = 6f;
+ private static final float MAX_DARK_AREA = 0.025f;
private final ArrayList<Color> mMainColors;
private int mColorHints;
@@ -382,8 +387,13 @@ public final class WallpaperColors implements Parcelable {
final int alpha = Color.alpha(pixels[i]);
// Make sure we don't have a dark pixel mass that will
// make text illegible.
- if (luminance < DARK_PIXEL_LUMINANCE && alpha != 0) {
+ final boolean satisfiesTextContrast = ContrastColorUtil
+ .calculateContrast(pixels[i], Color.BLACK) > DARK_PIXEL_CONTRAST;
+ if (!satisfiesTextContrast && alpha != 0) {
darkPixels++;
+ if (DEBUG_DARK_PIXELS) {
+ pixels[i] = Color.RED;
+ }
}
totalLuminance += luminance;
}
@@ -397,6 +407,18 @@ public final class WallpaperColors implements Parcelable {
hints |= HINT_SUPPORTS_DARK_THEME;
}
+ if (DEBUG_DARK_PIXELS) {
+ try (FileOutputStream out = new FileOutputStream("/data/pixels.png")) {
+ source.setPixels(pixels, 0, source.getWidth(), 0, 0, source.getWidth(),
+ source.getHeight());
+ source.compress(Bitmap.CompressFormat.PNG, 100, out);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ Log.d("WallpaperColors", "l: " + meanLuminance + ", d: " + darkPixels +
+ " maxD: " + maxDarkPixels + " numPixels: " + pixels.length);
+ }
+
return hints;
}
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index fde756c13234..6ad6c25c7f4b 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -996,17 +996,29 @@ public class WallpaperManager {
}
/**
- * If the current wallpaper is a live wallpaper component, return the
- * information about that wallpaper. Otherwise, if it is a static image,
- * simply return null.
+ * Returns the information about the wallpaper if the current wallpaper is
+ * a live wallpaper component. Otherwise, if the wallpaper is a static image,
+ * this returns null.
*/
public WallpaperInfo getWallpaperInfo() {
+ return getWallpaperInfo(mContext.getUserId());
+ }
+
+ /**
+ * Returns the information about the wallpaper if the current wallpaper is
+ * a live wallpaper component. Otherwise, if the wallpaper is a static image,
+ * this returns null.
+ *
+ * @param userId Owner of the wallpaper.
+ * @hide
+ */
+ public WallpaperInfo getWallpaperInfo(int userId) {
try {
if (sGlobals.mService == null) {
Log.w(TAG, "WallpaperService not running");
throw new RuntimeException(new DeadSystemException());
} else {
- return sGlobals.mService.getWallpaperInfo(mContext.getUserId());
+ return sGlobals.mService.getWallpaperInfo(userId);
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java
index 21d6762666a0..e6fb5dc02ce3 100644
--- a/core/java/android/app/WindowConfiguration.java
+++ b/core/java/android/app/WindowConfiguration.java
@@ -124,6 +124,24 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
})
public @interface ActivityType {}
+ /** The current always on top status of the configuration. */
+ private @AlwaysOnTop int mAlwaysOnTop;
+
+ /** Always on top is currently not defined. */
+ private static final int ALWAYS_ON_TOP_UNDEFINED = 0;
+ /** Always on top is currently on for this configuration. */
+ private static final int ALWAYS_ON_TOP_ON = 1;
+ /** Always on top is currently off for this configuration. */
+ private static final int ALWAYS_ON_TOP_OFF = 2;
+
+ /** @hide */
+ @IntDef(prefix = { "ALWAYS_ON_TOP_" }, value = {
+ ALWAYS_ON_TOP_UNDEFINED,
+ ALWAYS_ON_TOP_ON,
+ ALWAYS_ON_TOP_OFF,
+ })
+ private @interface AlwaysOnTop {}
+
/** Bit that indicates that the {@link #mBounds} changed.
* @hide */
public static final int WINDOW_CONFIG_BOUNDS = 1 << 0;
@@ -136,13 +154,16 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
/** Bit that indicates that the {@link #mActivityType} changed.
* @hide */
public static final int WINDOW_CONFIG_ACTIVITY_TYPE = 1 << 3;
-
+ /** Bit that indicates that the {@link #mAlwaysOnTop} changed.
+ * @hide */
+ public static final int WINDOW_CONFIG_ALWAYS_ON_TOP = 1 << 4;
/** @hide */
@IntDef(flag = true, prefix = { "WINDOW_CONFIG_" }, value = {
WINDOW_CONFIG_BOUNDS,
WINDOW_CONFIG_APP_BOUNDS,
WINDOW_CONFIG_WINDOWING_MODE,
- WINDOW_CONFIG_ACTIVITY_TYPE
+ WINDOW_CONFIG_ACTIVITY_TYPE,
+ WINDOW_CONFIG_ALWAYS_ON_TOP,
})
public @interface WindowConfig {}
@@ -168,6 +189,7 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
dest.writeParcelable(mAppBounds, flags);
dest.writeInt(mWindowingMode);
dest.writeInt(mActivityType);
+ dest.writeInt(mAlwaysOnTop);
}
private void readFromParcel(Parcel source) {
@@ -175,6 +197,7 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
mAppBounds = source.readParcelable(Rect.class.getClassLoader());
mWindowingMode = source.readInt();
mActivityType = source.readInt();
+ mAlwaysOnTop = source.readInt();
}
@Override
@@ -222,6 +245,21 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
setAppBounds(rect.left, rect.top, rect.right, rect.bottom);
}
+
+
+ /**
+ * Sets whether this window should be always on top.
+ * @param alwaysOnTop {@code true} to set window always on top, otherwise {@code false}
+ * @hide
+ */
+ public void setAlwaysOnTop(boolean alwaysOnTop) {
+ mAlwaysOnTop = alwaysOnTop ? ALWAYS_ON_TOP_ON : ALWAYS_ON_TOP_OFF;
+ }
+
+ private void setAlwaysOnTop(@AlwaysOnTop int alwaysOnTop) {
+ mAlwaysOnTop = alwaysOnTop;
+ }
+
/**
* @see #setAppBounds(Rect)
* @see #getAppBounds()
@@ -281,6 +319,7 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
setAppBounds(other.mAppBounds);
setWindowingMode(other.mWindowingMode);
setActivityType(other.mActivityType);
+ setAlwaysOnTop(other.mAlwaysOnTop);
}
/** Set this object to completely undefined.
@@ -295,6 +334,7 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
setBounds(null);
setWindowingMode(WINDOWING_MODE_UNDEFINED);
setActivityType(ACTIVITY_TYPE_UNDEFINED);
+ setAlwaysOnTop(ALWAYS_ON_TOP_UNDEFINED);
}
/**
@@ -326,6 +366,11 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
changed |= WINDOW_CONFIG_ACTIVITY_TYPE;
setActivityType(delta.mActivityType);
}
+ if (delta.mAlwaysOnTop != ALWAYS_ON_TOP_UNDEFINED
+ && mAlwaysOnTop != delta.mAlwaysOnTop) {
+ changed |= WINDOW_CONFIG_ALWAYS_ON_TOP;
+ setAlwaysOnTop(delta.mAlwaysOnTop);
+ }
return changed;
}
@@ -364,6 +409,11 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
changes |= WINDOW_CONFIG_ACTIVITY_TYPE;
}
+ if ((compareUndefined || other.mAlwaysOnTop != ALWAYS_ON_TOP_UNDEFINED)
+ && mAlwaysOnTop != other.mAlwaysOnTop) {
+ changes |= WINDOW_CONFIG_ALWAYS_ON_TOP;
+ }
+
return changes;
}
@@ -398,6 +448,8 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
if (n != 0) return n;
n = mActivityType - that.mActivityType;
if (n != 0) return n;
+ n = mAlwaysOnTop - that.mAlwaysOnTop;
+ if (n != 0) return n;
// if (n != 0) return n;
return n;
@@ -425,6 +477,7 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
result = 31 * result + mWindowingMode;
result = 31 * result + mActivityType;
+ result = 31 * result + mAlwaysOnTop;
return result;
}
@@ -434,7 +487,9 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
return "{ mBounds=" + mBounds
+ " mAppBounds=" + mAppBounds
+ " mWindowingMode=" + windowingModeToString(mWindowingMode)
- + " mActivityType=" + activityTypeToString(mActivityType) + "}";
+ + " mActivityType=" + activityTypeToString(mActivityType)
+ + " mAlwaysOnTop=" + alwaysOnTopToString(mAlwaysOnTop)
+ + "}";
}
/**
@@ -520,7 +575,8 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
* @hide
*/
public boolean isAlwaysOnTop() {
- return mWindowingMode == WINDOWING_MODE_PINNED;
+ return mWindowingMode == WINDOWING_MODE_PINNED
+ || (mWindowingMode == WINDOWING_MODE_FREEFORM && mAlwaysOnTop == ALWAYS_ON_TOP_ON);
}
/**
@@ -597,4 +653,14 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu
}
return String.valueOf(applicationType);
}
+
+ /** @hide */
+ public static String alwaysOnTopToString(@AlwaysOnTop int alwaysOnTop) {
+ switch (alwaysOnTop) {
+ case ALWAYS_ON_TOP_UNDEFINED: return "undefined";
+ case ALWAYS_ON_TOP_ON: return "on";
+ case ALWAYS_ON_TOP_OFF: return "off";
+ }
+ return String.valueOf(alwaysOnTop);
+ }
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 22367b21221a..cbd874176586 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -72,6 +72,7 @@ import android.security.keystore.AttestationUtils;
import android.security.keystore.KeyAttestationException;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.ParcelableKeyGenParameterSpec;
+import android.security.keystore.StrongBoxUnavailableException;
import android.service.restrictions.RestrictionsReceiver;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
@@ -1774,6 +1775,13 @@ public class DevicePolicyManager {
public static final int ID_TYPE_MEID = 8;
/**
+ * Service-specific error code for {@link #generateKeyPair}:
+ * Indicates the call has failed due to StrongBox unavailability.
+ * @hide
+ */
+ public static final int KEY_GEN_STRONGBOX_UNAVAILABLE = 1;
+
+ /**
* Specifies that the calling app should be granted access to the installed credentials
* immediately. Otherwise, access to the credentials will be gated by user approval.
* For use with {@link #installKeyPair(ComponentName, PrivateKey, Certificate[], String, int)}
@@ -3237,8 +3245,8 @@ public class DevicePolicyManager {
/**
* Called by a device/profile owner to set the timeout after which unlocking with secondary, non
- * strong auth (e.g. fingerprint, trust agents) times out, i.e. the user has to use a strong
- * authentication method like password, pin or pattern.
+ * strong auth (e.g. fingerprint, face, trust agents) times out, i.e. the user has to use a
+ * strong authentication method like password, pin or pattern.
*
* <p>This timeout is used internally to reset the timer to require strong auth again after
* specified timeout each time it has been successfully used.
@@ -3710,7 +3718,6 @@ public class DevicePolicyManager {
| DevicePolicyManager.KEYGUARD_DISABLE_IRIS
| DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
-
/**
* Disable all current and future keyguard customizations.
*/
@@ -4154,8 +4161,11 @@ public class DevicePolicyManager {
* Called by a device or profile owner, or delegated certificate installer, to generate a
* new private/public key pair. If the device supports key generation via secure hardware,
* this method is useful for creating a key in KeyChain that never left the secure hardware.
- *
* Access to the key is controlled the same way as in {@link #installKeyPair}.
+ *
+ * <p>Because this method might take several seconds to complete, it should only be called from
+ * a worker thread. This method returns {@code null} when called from the main thread.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
* {@code null} if calling from a delegated certificate installer.
* @param algorithm The key generation algorithm, see {@link java.security.KeyPairGenerator}.
@@ -4188,6 +4198,8 @@ public class DevicePolicyManager {
* {@code keySpec} does not contain an attestation challenge.
* @throws UnsupportedOperationException if Device ID attestation was requested but the
* underlying hardware does not support it.
+ * @throws StrongBoxUnavailableException if the use of StrongBox for key generation was
+ * specified in {@code keySpec} but the device does not have one.
* @see KeyGenParameterSpec.Builder#setAttestationChallenge(byte[])
*/
public AttestedKeyPair generateKeyPair(@Nullable ComponentName admin,
@@ -4228,6 +4240,15 @@ public class DevicePolicyManager {
} catch (InterruptedException e) {
Log.w(TAG, "Interrupted while generating key", e);
Thread.currentThread().interrupt();
+ } catch (ServiceSpecificException e) {
+ Log.w(TAG, String.format("Key Generation failure: %d", e.errorCode));
+ switch (e.errorCode) {
+ case KEY_GEN_STRONGBOX_UNAVAILABLE:
+ throw new StrongBoxUnavailableException("No StrongBox for key generation.");
+ default:
+ throw new RuntimeException(
+ String.format("Unknown error while generating key: %d", e.errorCode));
+ }
}
return null;
}
@@ -4898,10 +4919,10 @@ public class DevicePolicyManager {
/**
* @hide
*/
- public void reportFailedFingerprintAttempt(int userHandle) {
+ public void reportFailedBiometricAttempt(int userHandle) {
if (mService != null) {
try {
- mService.reportFailedFingerprintAttempt(userHandle);
+ mService.reportFailedBiometricAttempt(userHandle);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -4911,10 +4932,10 @@ public class DevicePolicyManager {
/**
* @hide
*/
- public void reportSuccessfulFingerprintAttempt(int userHandle) {
+ public void reportSuccessfulBiometricAttempt(int userHandle) {
if (mService != null) {
try {
- mService.reportSuccessfulFingerprintAttempt(userHandle);
+ mService.reportSuccessfulBiometricAttempt(userHandle);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -8300,6 +8321,22 @@ public class DevicePolicyManager {
}
/**
+ * Makes all accumulated network logs available to DPC in a new batch.
+ * Only callable by ADB. If throttled, returns time to wait in milliseconds, otherwise 0.
+ * @hide
+ */
+ public long forceNetworkLogs() {
+ if (mService == null) {
+ return -1;
+ }
+ try {
+ return mService.forceNetworkLogs();
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Forces a batch of security logs to be fetched from logd and makes it available for DPC.
* Only callable by ADB. If throttled, returns time to wait in milliseconds, otherwise 0.
* @hide
@@ -9398,9 +9435,9 @@ public class DevicePolicyManager {
* <ul>
* <li>{@link ApnSetting#getOperatorNumeric()}</li>
* <li>{@link ApnSetting#getApnName()}</li>
- * <li>{@link ApnSetting#getProxyAddress()}</li>
+ * <li>{@link ApnSetting#getProxyAddressAsString()}</li>
* <li>{@link ApnSetting#getProxyPort()}</li>
- * <li>{@link ApnSetting#getMmsProxyAddress()}</li>
+ * <li>{@link ApnSetting#getMmsProxyAddressAsString()}</li>
* <li>{@link ApnSetting#getMmsProxyPort()}</li>
* <li>{@link ApnSetting#getMmsc()}</li>
* <li>{@link ApnSetting#isEnabled()}</li>
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 37508cdc1119..c95bc5b9a156 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -132,8 +132,8 @@ interface IDevicePolicyManager {
void reportPasswordChanged(int userId);
void reportFailedPasswordAttempt(int userHandle);
void reportSuccessfulPasswordAttempt(int userHandle);
- void reportFailedFingerprintAttempt(int userHandle);
- void reportSuccessfulFingerprintAttempt(int userHandle);
+ void reportFailedBiometricAttempt(int userHandle);
+ void reportSuccessfulBiometricAttempt(int userHandle);
void reportKeyguardDismissed(int userHandle);
void reportKeyguardSecured(int userHandle);
@@ -347,6 +347,7 @@ interface IDevicePolicyManager {
boolean isSecurityLoggingEnabled(in ComponentName admin);
ParceledListSlice retrieveSecurityLogs(in ComponentName admin);
ParceledListSlice retrievePreRebootSecurityLogs(in ComponentName admin);
+ long forceNetworkLogs();
long forceSecurityLogs();
boolean isUninstallInQueue(String packageName);
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index d568662409d7..ef41b10640cb 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -2237,22 +2237,6 @@ public class AssistStructure implements Parcelable {
return mWindowNodes.get(index);
}
- // TODO(b/35708678): temporary method that disable one-way warning flag on binder.
- /** @hide */
- public void ensureDataForAutofill() {
- if (mHaveData) {
- return;
- }
- mHaveData = true;
- Binder.allowBlocking(mReceiveChannel);
- try {
- ParcelTransferReader reader = new ParcelTransferReader(mReceiveChannel);
- reader.go();
- } finally {
- Binder.defaultBlocking(mReceiveChannel);
- }
- }
-
/** @hide */
public void ensureData() {
if (mHaveData) {
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index d1c957b8fedc..ec2cf0cf0dae 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -43,7 +43,6 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.util.Collection;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
@@ -334,7 +333,6 @@ public abstract class BackupAgent extends ContextWrapper {
* @throws IOException
*
* @see Context#getNoBackupFilesDir()
- * @see ApplicationInfo#fullBackupContent
* @see #fullBackupFile(File, FullBackupDataOutput)
* @see #onRestoreFile(ParcelFileDescriptor, long, File, int, long, long)
*/
@@ -834,7 +832,7 @@ public abstract class BackupAgent extends ContextWrapper {
}
if (excludes != null &&
- isFileSpecifiedInPathList(destination, excludes)) {
+ BackupUtils.isFileSpecifiedInPathList(destination, excludes)) {
if (Log.isLoggable(FullBackup.TAG_XML_PARSER, Log.VERBOSE)) {
Log.v(FullBackup.TAG_XML_PARSER,
"onRestoreFile: \"" + destinationCanonicalPath + "\": listed in"
@@ -848,7 +846,8 @@ public abstract class BackupAgent extends ContextWrapper {
// it's a small list), we'll go through and look for it.
boolean explicitlyIncluded = false;
for (Set<PathWithRequiredFlags> domainIncludes : includes.values()) {
- explicitlyIncluded |= isFileSpecifiedInPathList(destination, domainIncludes);
+ explicitlyIncluded |=
+ BackupUtils.isFileSpecifiedInPathList(destination, domainIncludes);
if (explicitlyIncluded) {
break;
}
@@ -867,33 +866,6 @@ public abstract class BackupAgent extends ContextWrapper {
}
/**
- * @return True if the provided file is either directly in the provided list, or the provided
- * file is within a directory in the list.
- */
- private boolean isFileSpecifiedInPathList(File file,
- Collection<PathWithRequiredFlags> canonicalPathList) throws IOException {
- for (PathWithRequiredFlags canonical : canonicalPathList) {
- String canonicalPath = canonical.getPath();
- File fileFromList = new File(canonicalPath);
- if (fileFromList.isDirectory()) {
- if (file.isDirectory()) {
- // If they are both directories check exact equals.
- return file.equals(fileFromList);
- } else {
- // O/w we have to check if the file is within the directory from the list.
- return file.getCanonicalPath().startsWith(canonicalPath);
- }
- } else {
- if (file.equals(fileFromList)) {
- // Need to check the explicit "equals" so we don't end up with substrings.
- return true;
- }
- }
- }
- return false;
- }
-
- /**
* Only specialized platform agents should overload this entry point to support
* restores to crazy non-app locations.
* @hide
diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java
index 43f69e1c98f7..912baf9f6d72 100644
--- a/core/java/android/app/backup/BackupManager.java
+++ b/core/java/android/app/backup/BackupManager.java
@@ -450,6 +450,27 @@ public class BackupManager {
}
/**
+ * Returns the {@link ComponentName} of the host service of the selected transport or {@code
+ * null} if no transport selected or if the transport selected is not registered.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.BACKUP)
+ @Nullable
+ public ComponentName getCurrentTransportComponent() {
+ checkServiceBinder();
+ if (sService != null) {
+ try {
+ return sService.getCurrentTransportComponent();
+ } catch (RemoteException e) {
+ Log.e(TAG, "getCurrentTransportComponent() couldn't connect");
+ }
+ }
+ return null;
+ }
+
+ /**
* Request a list of all available backup transports' names.
*
* @hide
diff --git a/core/java/android/app/backup/BackupUtils.java b/core/java/android/app/backup/BackupUtils.java
new file mode 100644
index 000000000000..8cf8a84f0181
--- /dev/null
+++ b/core/java/android/app/backup/BackupUtils.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.backup;
+
+import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+
+/** @hide */
+public class BackupUtils {
+
+ private BackupUtils() {}
+
+ /**
+ * Returns {@code true} if {@code file} is either directly in {@code canonicalPathList} or is a
+ * file contained in a directory in the list.
+ */
+ public static boolean isFileSpecifiedInPathList(
+ File file, Collection<PathWithRequiredFlags> canonicalPathList) throws IOException {
+ for (PathWithRequiredFlags canonical : canonicalPathList) {
+ String canonicalPath = canonical.getPath();
+ File fileFromList = new File(canonicalPath);
+ if (fileFromList.isDirectory()) {
+ if (file.isDirectory()) {
+ // If they are both directories check exact equals.
+ if (file.equals(fileFromList)) {
+ return true;
+ }
+ } else {
+ // O/w we have to check if the file is within the directory from the list.
+ if (file.toPath().startsWith(canonicalPath)) {
+ return true;
+ }
+ }
+ } else if (file.equals(fileFromList)) {
+ // Need to check the explicit "equals" so we don't end up with substrings.
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl
index f3ca74656e8c..1c55d8add45b 100644
--- a/core/java/android/app/backup/IBackupManager.aidl
+++ b/core/java/android/app/backup/IBackupManager.aidl
@@ -244,8 +244,6 @@ interface IBackupManager {
* {@code null} and MUST NOT be {@code null} when dataManagementIntent is not {@code null}.
* @throws SecurityException If the UID of the calling process differs from the package UID of
* {@code transportComponent} or if the caller does NOT have BACKUP permission.
- *
- * @hide
*/
void updateTransportAttributes(in ComponentName transportComponent, in String name,
in Intent configurationIntent, in String currentDestinationString,
@@ -257,6 +255,13 @@ interface IBackupManager {
*/
String getCurrentTransport();
+ /**
+ * Returns the {@link ComponentName} of the host service of the selected transport or {@code
+ * null} if no transport selected or if the transport selected is not registered. Callers must
+ * hold the android.permission.BACKUP permission to use this method.
+ */
+ ComponentName getCurrentTransportComponent();
+
/**
* Request a list of all available backup transports' names. Callers must
* hold the android.permission.BACKUP permission to use this method.
@@ -296,8 +301,6 @@ interface IBackupManager {
* the transport's name that is returned by {@link BackupTransport#name()}.
* @param listener A listener object to get a callback on the transport being selected. It may
* be {@code null}.
- *
- * @hide
*/
void selectBackupTransportAsync(in ComponentName transport, ISelectBackupTransportCallback listener);
@@ -364,7 +367,6 @@ interface IBackupManager {
* @param result In the case of a full backup measure operation, the estimated
* total file size that would result from the operation. Unused in all other
* cases.
- * {@hide}
*/
void opComplete(int token, long result);
diff --git a/core/java/android/app/backup/IBackupObserver.aidl b/core/java/android/app/backup/IBackupObserver.aidl
index 07a6634b5a1e..fabe35396a4d 100644
--- a/core/java/android/app/backup/IBackupObserver.aidl
+++ b/core/java/android/app/backup/IBackupObserver.aidl
@@ -51,7 +51,7 @@ oneway interface IBackupObserver {
* even if no individual package backup operations were attempted.
*
* @param status Zero on success; a nonzero error code if the backup operation
- * as a whole failed.
+ * as a whole failed with a transport error.
*/
void backupFinished(int status);
}
diff --git a/core/java/android/app/backup/RestoreSession.java b/core/java/android/app/backup/RestoreSession.java
index 69d964da4949..2e0f940331c5 100644
--- a/core/java/android/app/backup/RestoreSession.java
+++ b/core/java/android/app/backup/RestoreSession.java
@@ -17,10 +17,6 @@
package android.app.backup;
import android.annotation.SystemApi;
-import android.app.backup.RestoreObserver;
-import android.app.backup.RestoreSet;
-import android.app.backup.IRestoreObserver;
-import android.app.backup.IRestoreSession;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
@@ -199,6 +195,10 @@ public class RestoreSession {
* backup dataset has no matching data. If no backup data exists for this package
* in either source, a nonzero value will be returned.
*
+ * <p class="caution">Note: Unlike other restore operations, this method doesn't terminate the
+ * application after the restore. The application continues running to receive the
+ * {@link RestoreObserver} callbacks on the {@code observer} argument.
+ *
* @return Zero on success; nonzero on error. The observer will only receive
* progress callbacks if this method returned zero.
* @param packageName The name of the package whose data to restore. If this is
diff --git a/core/java/android/app/servertransaction/ClientTransaction.java b/core/java/android/app/servertransaction/ClientTransaction.java
index 08ad2f055774..2c1e59bfc066 100644
--- a/core/java/android/app/servertransaction/ClientTransaction.java
+++ b/core/java/android/app/servertransaction/ClientTransaction.java
@@ -164,6 +164,31 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
ObjectPool.recycle(this);
}
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder(64);
+ sb.append("ClientTransaction{");
+ if (mActivityToken != null) {
+ sb.append(" a:").append(Integer.toHexString(System.identityHashCode(mActivityToken)));
+ }
+ if (mActivityCallbacks != null && !mActivityCallbacks.isEmpty()) {
+ sb.append(" c:");
+ final int size = mActivityCallbacks.size();
+ for (int i = 0; i < size; i++) {
+ sb.append(mActivityCallbacks.get(i).getClass().getSimpleName());
+ if (i < size - 1) {
+ sb.append(",");
+ }
+ }
+ }
+ if (mLifecycleStateRequest != null) {
+ sb.append(" s:");
+ sb.append(mLifecycleStateRequest.getClass().getSimpleName());
+ }
+ sb.append(" }");
+ return sb.toString();
+ }
+
// Parcelable implementation
diff --git a/core/java/android/app/servertransaction/DestroyActivityItem.java b/core/java/android/app/servertransaction/DestroyActivityItem.java
index b443166d151c..5941486c099d 100644
--- a/core/java/android/app/servertransaction/DestroyActivityItem.java
+++ b/core/java/android/app/servertransaction/DestroyActivityItem.java
@@ -33,6 +33,11 @@ public class DestroyActivityItem extends ActivityLifecycleItem {
private int mConfigChanges;
@Override
+ public void preExecute(ClientTransactionHandler client, IBinder token) {
+ client.getActivitiesToBeDestroyed().put(token, this);
+ }
+
+ @Override
public void execute(ClientTransactionHandler client, IBinder token,
PendingTransactionActions pendingActions) {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy");
diff --git a/core/java/android/app/servertransaction/PauseActivityItem.java b/core/java/android/app/servertransaction/PauseActivityItem.java
index 0c1eab56ec30..cae93b305a1a 100644
--- a/core/java/android/app/servertransaction/PauseActivityItem.java
+++ b/core/java/android/app/servertransaction/PauseActivityItem.java
@@ -19,6 +19,7 @@ package android.app.servertransaction;
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.ClientTransactionHandler;
import android.os.IBinder;
import android.os.Parcel;
@@ -60,7 +61,7 @@ public class PauseActivityItem extends ActivityLifecycleItem {
}
try {
// TODO(lifecycler): Use interface callback instead of AMS.
- ActivityManager.getService().activityPaused(token);
+ ActivityTaskManager.getService().activityPaused(token);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/servertransaction/PendingTransactionActions.java b/core/java/android/app/servertransaction/PendingTransactionActions.java
index af7b7a21a582..52ba8fb73f5f 100644
--- a/core/java/android/app/servertransaction/PendingTransactionActions.java
+++ b/core/java/android/app/servertransaction/PendingTransactionActions.java
@@ -19,6 +19,7 @@ package android.app.servertransaction;
import static android.app.ActivityThread.DEBUG_MEMORY_TRIM;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.ActivityThread.ActivityClientRecord;
import android.os.Build;
import android.os.Bundle;
@@ -141,7 +142,7 @@ public class PendingTransactionActions {
try {
if (DEBUG_MEMORY_TRIM) Slog.v(TAG, "Reporting activity stopped: " + mActivity);
// TODO(lifecycler): Use interface callback instead of AMS.
- ActivityManager.getService().activityStopped(
+ ActivityTaskManager.getService().activityStopped(
mActivity.token, mState, mPersistentState, mDescription);
} catch (RemoteException ex) {
// Dump statistics about bundle to help developers debug
diff --git a/core/java/android/app/servertransaction/ResumeActivityItem.java b/core/java/android/app/servertransaction/ResumeActivityItem.java
index 909eec751d65..a5b6f7c74e18 100644
--- a/core/java/android/app/servertransaction/ResumeActivityItem.java
+++ b/core/java/android/app/servertransaction/ResumeActivityItem.java
@@ -19,6 +19,7 @@ package android.app.servertransaction;
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.ClientTransactionHandler;
import android.os.IBinder;
import android.os.Parcel;
@@ -58,7 +59,7 @@ public class ResumeActivityItem extends ActivityLifecycleItem {
PendingTransactionActions pendingActions) {
try {
// TODO(lifecycler): Use interface callback instead of AMS.
- ActivityManager.getService().activityResumed(token);
+ ActivityTaskManager.getService().activityResumed(token);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/servertransaction/TransactionExecutor.java b/core/java/android/app/servertransaction/TransactionExecutor.java
index 43a2b4cc43f8..503e18b62cae 100644
--- a/core/java/android/app/servertransaction/TransactionExecutor.java
+++ b/core/java/android/app/servertransaction/TransactionExecutor.java
@@ -35,6 +35,7 @@ import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import java.util.List;
+import java.util.Map;
/**
* Class that manages transaction execution in the correct order.
@@ -63,6 +64,24 @@ public class TransactionExecutor {
*/
public void execute(ClientTransaction transaction) {
final IBinder token = transaction.getActivityToken();
+ if (token != null) {
+ final Map<IBinder, ClientTransactionItem> activitiesToBeDestroyed =
+ mTransactionHandler.getActivitiesToBeDestroyed();
+ final ClientTransactionItem destroyItem = activitiesToBeDestroyed.get(token);
+ if (destroyItem != null) {
+ if (transaction.getLifecycleStateRequest() == destroyItem) {
+ // It is going to execute the transaction that will destroy activity with the
+ // token, so the corresponding to-be-destroyed record can be removed.
+ activitiesToBeDestroyed.remove(token);
+ }
+ if (mTransactionHandler.getActivityClient(token) == null) {
+ // The activity has not been created but has been requested to destroy, so all
+ // transactions for the token are just like being cancelled.
+ Slog.w(TAG, "Skip pre-destroyed " + transaction);
+ return;
+ }
+ }
+ }
log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);
executeCallbacks(transaction);
@@ -76,7 +95,7 @@ public class TransactionExecutor {
@VisibleForTesting
public void executeCallbacks(ClientTransaction transaction) {
final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
- if (callbacks == null) {
+ if (callbacks == null || callbacks.isEmpty()) {
// No callbacks to execute, return early.
return;
}
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index e54d3b64f780..d1aec048bdf1 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -425,7 +425,7 @@ public final class Slice implements Parcelable {
/**
* Add a sub-slice to the slice being constructed
* @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @see SliceItem#getSubType()
*/
public Builder addSubSlice(@NonNull Slice slice, @Nullable @SliceSubtype String subType) {
Preconditions.checkNotNull(slice);
@@ -437,7 +437,7 @@ public final class Slice implements Parcelable {
/**
* Add an action to the slice being constructed
* @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @see SliceItem#getSubType()
*/
public Slice.Builder addAction(@NonNull PendingIntent action, @NonNull Slice s,
@Nullable @SliceSubtype String subType) {
@@ -453,7 +453,7 @@ public final class Slice implements Parcelable {
/**
* Add text to the slice being constructed
* @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @see SliceItem#getSubType()
*/
public Builder addText(CharSequence text, @Nullable @SliceSubtype String subType,
@SliceHint List<String> hints) {
@@ -464,7 +464,7 @@ public final class Slice implements Parcelable {
/**
* Add an image to the slice being constructed
* @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @see SliceItem#getSubType()
*/
public Builder addIcon(Icon icon, @Nullable @SliceSubtype String subType,
@SliceHint List<String> hints) {
@@ -476,7 +476,7 @@ public final class Slice implements Parcelable {
/**
* Add remote input to the slice being constructed
* @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @see SliceItem#getSubType()
*/
public Slice.Builder addRemoteInput(RemoteInput remoteInput,
@Nullable @SliceSubtype String subType,
@@ -490,7 +490,7 @@ public final class Slice implements Parcelable {
/**
* Add an integer to the slice being constructed
* @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @see SliceItem#getSubType()
*/
public Builder addInt(int value, @Nullable @SliceSubtype String subType,
@SliceHint List<String> hints) {
@@ -511,7 +511,7 @@ public final class Slice implements Parcelable {
/**
* Add a long to the slice being constructed
* @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @see SliceItem#getSubType()
*/
public Slice.Builder addLong(long value, @Nullable @SliceSubtype String subType,
@SliceHint List<String> hints) {
@@ -525,7 +525,7 @@ public final class Slice implements Parcelable {
* <p>Expected to be used for support library extension, should not be used for general
* development
* @param subType Optional template-specific type information
- * @see {@link SliceItem#getSubType()}
+ * @see SliceItem#getSubType()
*/
public Slice.Builder addBundle(Bundle bundle, @Nullable @SliceSubtype String subType,
@SliceHint List<String> hints) {
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index 4c22c94266d7..ca60e140ba8e 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -209,8 +209,8 @@ public abstract class SliceProvider extends ContentProvider {
*
* @param sliceUri Uri to bind.
* @param supportedSpecs List of supported specs.
- * @see {@link Slice}.
- * @see {@link Slice#HINT_PARTIAL}
+ * @see Slice.
+ * @see Slice#HINT_PARTIAL
*/
public Slice onBindSlice(Uri sliceUri, Set<SliceSpec> supportedSpecs) {
return onBindSlice(sliceUri, new ArrayList<>(supportedSpecs));
diff --git a/core/java/android/app/slice/SliceSpec.java b/core/java/android/app/slice/SliceSpec.java
index 03ffe6df88ce..b3790e22eca5 100644
--- a/core/java/android/app/slice/SliceSpec.java
+++ b/core/java/android/app/slice/SliceSpec.java
@@ -36,7 +36,7 @@ import android.os.Parcelable;
* {@link #canRender}.
*
* @see Slice
- * @see SliceProvider#onBindSlice(Uri)
+ * @see SliceProvider#onBindSlice(Uri, Set)
*/
public final class SliceSpec implements Parcelable {
diff --git a/core/java/android/app/timedetector/ITimeDetectorService.aidl b/core/java/android/app/timedetector/ITimeDetectorService.aidl
new file mode 100644
index 000000000000..f624446a2027
--- /dev/null
+++ b/core/java/android/app/timedetector/ITimeDetectorService.aidl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.timedetector;
+
+import android.app.timedetector.TimeSignal;
+
+/**
+ * System private API to comunicate with time detector service.
+ *
+ * <p>Used by parts of the Android system with signals associated with the device's time to provide
+ * information to the Time Detector Service.
+ *
+ * <p>Use the {@link android.app.timedetector.TimeDetector} class rather than going through
+ * this Binder interface directly. See {@link android.app.timedetector.TimeDetectorService} for
+ * more complete documentation.
+ *
+ *
+ * {@hide}
+ */
+interface ITimeDetectorService {
+ void suggestTime(in TimeSignal timeSignal);
+}
diff --git a/core/java/android/app/timedetector/TimeDetector.java b/core/java/android/app/timedetector/TimeDetector.java
new file mode 100644
index 000000000000..052050df8c9a
--- /dev/null
+++ b/core/java/android/app/timedetector/TimeDetector.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.timedetector;
+
+import android.annotation.NonNull;
+import android.annotation.SystemService;
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.ServiceManager.ServiceNotFoundException;
+import android.util.Log;
+
+/**
+ * The interface through which system components can send signals to the TimeDetectorService.
+ * @hide
+ */
+@SystemService(Context.TIME_DETECTOR_SERVICE)
+public final class TimeDetector {
+ private static final String TAG = "timedetector.TimeDetector";
+ private static final boolean DEBUG = false;
+
+ private final ITimeDetectorService mITimeDetectorService;
+
+ public TimeDetector() throws ServiceNotFoundException {
+ mITimeDetectorService = ITimeDetectorService.Stub.asInterface(
+ ServiceManager.getServiceOrThrow(Context.TIME_DETECTOR_SERVICE));
+ }
+
+ /**
+ * Suggests the current time to the detector. The detector may ignore the signal if better
+ * signals are available such as those that come from more reliable sources or were
+ * determined more recently.
+ */
+ public void suggestTime(@NonNull TimeSignal timeSignal) {
+ if (DEBUG) {
+ Log.d(TAG, "suggestTime called: " + timeSignal);
+ }
+ try {
+ mITimeDetectorService.suggestTime(timeSignal);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionCategory.java b/core/java/android/app/timedetector/TimeSignal.aidl
index 19e556ad55bb..d2ec357555bc 100644
--- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionCategory.java
+++ b/core/java/android/app/timedetector/TimeSignal.aidl
@@ -14,12 +14,6 @@
* limitations under the License.
*/
-package com.android.settingslib.suggestions;
+package android.app.timedetector;
-public class SuggestionCategory {
- public String category;
- public String pkg;
- public boolean multiple;
- public boolean exclusive;
- public long exclusiveExpireDaysInMillis;
-}
+parcelable TimeSignal; \ No newline at end of file
diff --git a/core/java/android/app/timedetector/TimeSignal.java b/core/java/android/app/timedetector/TimeSignal.java
new file mode 100644
index 000000000000..7ba03cc33454
--- /dev/null
+++ b/core/java/android/app/timedetector/TimeSignal.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.timedetector;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.TimestampedValue;
+
+import java.util.Objects;
+
+/**
+ * A time signal from a named source. The value consists of the number of milliseconds elapsed since
+ * 1/1/1970 00:00:00 UTC and the time according to the elapsed realtime clock when that number was
+ * established. The elapsed realtime clock is considered accurate but volatile, so time signals
+ * must not be persisted across device resets.
+ *
+ * @hide
+ */
+public final class TimeSignal implements Parcelable {
+
+ public static final Parcelable.Creator<TimeSignal> CREATOR =
+ new Parcelable.Creator<TimeSignal>() {
+ public TimeSignal createFromParcel(Parcel in) {
+ return TimeSignal.createFromParcel(in);
+ }
+
+ public TimeSignal[] newArray(int size) {
+ return new TimeSignal[size];
+ }
+ };
+
+ public static final String SOURCE_ID_NITZ = "nitz";
+
+ private final String mSourceId;
+ private final TimestampedValue<Long> mUtcTime;
+
+ public TimeSignal(String sourceId, TimestampedValue<Long> utcTime) {
+ mSourceId = Objects.requireNonNull(sourceId);
+ mUtcTime = Objects.requireNonNull(utcTime);
+ }
+
+ private static TimeSignal createFromParcel(Parcel in) {
+ String sourceId = in.readString();
+ TimestampedValue<Long> utcTime =
+ TimestampedValue.readFromParcel(in, null /* classLoader */, Long.class);
+ return new TimeSignal(sourceId, utcTime);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeString(mSourceId);
+ TimestampedValue.writeToParcel(dest, mUtcTime);
+ }
+
+ @NonNull
+ public String getSourceId() {
+ return mSourceId;
+ }
+
+ @NonNull
+ public TimestampedValue<Long> getUtcTime() {
+ return mUtcTime;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ TimeSignal that = (TimeSignal) o;
+ return Objects.equals(mSourceId, that.mSourceId)
+ && Objects.equals(mUtcTime, that.mUtcTime);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mSourceId, mUtcTime);
+ }
+
+ @Override
+ public String toString() {
+ return "TimeSignal{"
+ + "mSourceId='" + mSourceId + '\''
+ + ", mUtcTime=" + mUtcTime
+ + '}';
+ }
+}
diff --git a/core/java/android/app/timezone/RulesState.aidl b/core/java/android/app/timezone/RulesState.aidl
index f789120eb724..665220dddafd 100644
--- a/core/java/android/app/timezone/RulesState.aidl
+++ b/core/java/android/app/timezone/RulesState.aidl
@@ -14,4 +14,6 @@
* limitations under the License.
*/
+package android.app.timezone;
+
parcelable RulesState; \ No newline at end of file
diff --git a/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl b/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl
new file mode 100644
index 000000000000..ef2cbab137dc
--- /dev/null
+++ b/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.timezonedetector;
+
+/**
+ * System private API to comunicate with time zone detector service.
+ *
+ * <p>Used by parts of the Android system with signals associated with the device's time zone to
+ * provide information to the Time Zone Detector Service.
+ *
+ * <p>Use the {@link android.app.timezonedetector.TimeZoneDetector} class rather than going through
+ * this Binder interface directly. See {@link android.app.timezonedetector.TimeZoneDetectorService}
+ * for more complete documentation.
+ *
+ *
+ * {@hide}
+ */
+interface ITimeZoneDetectorService {
+ void stubbedCall();
+}
diff --git a/core/java/android/app/timezonedetector/TimeZoneDetector.java b/core/java/android/app/timezonedetector/TimeZoneDetector.java
new file mode 100644
index 000000000000..be3c7649a486
--- /dev/null
+++ b/core/java/android/app/timezonedetector/TimeZoneDetector.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.timezonedetector;
+
+import android.annotation.SystemService;
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.ServiceManager.ServiceNotFoundException;
+import android.util.Log;
+
+/**
+ * The interface through which system components can send signals to the TimeZoneDetectorService.
+ * @hide
+ */
+@SystemService(Context.TIME_ZONE_DETECTOR_SERVICE)
+public final class TimeZoneDetector {
+
+ private static final String TAG = "timezonedetector.TimeZoneDetector";
+ private static final boolean DEBUG = false;
+
+ private final ITimeZoneDetectorService mITimeZoneDetectorService;
+
+ public TimeZoneDetector() throws ServiceNotFoundException {
+ mITimeZoneDetectorService = ITimeZoneDetectorService.Stub.asInterface(
+ ServiceManager.getServiceOrThrow(Context.TIME_ZONE_DETECTOR_SERVICE));
+
+ }
+ /**
+ * Does nothing.
+ * TODO: Remove this when the service implementation is built out.
+ */
+ public void stubbedCall() {
+ if (DEBUG) {
+ Log.d(TAG, "stubbedCall called");
+ }
+ try {
+ mITimeZoneDetectorService.stubbedCall();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+}
diff --git a/core/java/android/app/trust/ITrustManager.aidl b/core/java/android/app/trust/ITrustManager.aidl
index 6d65e3eb3f91..9985cc02965b 100644
--- a/core/java/android/app/trust/ITrustManager.aidl
+++ b/core/java/android/app/trust/ITrustManager.aidl
@@ -17,6 +17,7 @@
package android.app.trust;
import android.app.trust.ITrustListener;
+import android.hardware.biometrics.BiometricSourceType;
/**
* System private API to comunicate with trust service.
@@ -34,6 +35,6 @@ interface ITrustManager {
boolean isDeviceLocked(int userId);
boolean isDeviceSecure(int userId);
boolean isTrustUsuallyManaged(int userId);
- void unlockedByFingerprintForUser(int userId);
- void clearAllFingerprints();
+ void unlockedByBiometricForUser(int userId, in BiometricSourceType source);
+ void clearAllBiometricRecognized(in BiometricSourceType target);
}
diff --git a/core/java/android/app/trust/TrustManager.java b/core/java/android/app/trust/TrustManager.java
index 8ab0b706a1e2..fb27bedb8d6f 100644
--- a/core/java/android/app/trust/TrustManager.java
+++ b/core/java/android/app/trust/TrustManager.java
@@ -20,6 +20,7 @@ import android.Manifest;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
import android.content.Context;
+import android.hardware.biometrics.BiometricSourceType;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -195,26 +196,28 @@ public class TrustManager {
}
/**
- * Updates the trust state for the user due to the user unlocking via fingerprint.
- * Should only be called if user authenticated via fingerprint and bouncer can be skipped.
+ * Updates the trust state for the user due to the user unlocking via a biometric sensor.
+ * Should only be called if user authenticated via fingerprint, face, or iris and bouncer
+ * can be skipped.
+ *
* @param userId
*/
@RequiresPermission(Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE)
- public void unlockedByFingerprintForUser(int userId) {
+ public void unlockedByBiometricForUser(int userId, BiometricSourceType source) {
try {
- mService.unlockedByFingerprintForUser(userId);
+ mService.unlockedByBiometricForUser(userId, source);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
- * Clears authenticated fingerprints for all users.
+ * Clears authentication by the specified biometric type for all users.
*/
@RequiresPermission(Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE)
- public void clearAllFingerprints() {
+ public void clearAllBiometricRecognized(BiometricSourceType source) {
try {
- mService.clearAllFingerprints();
+ mService.clearAllBiometricRecognized(source);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 3d5d7cdc87cd..75d0ddd973d3 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -394,6 +394,58 @@ public final class BluetoothAdapter {
public static final int SCAN_MODE_CONNECTABLE_DISCOVERABLE = 23;
/**
+ * Device only has a display.
+ *
+ * @hide
+ */
+ public static final int IO_CAPABILITY_OUT = 0;
+
+ /**
+ * Device has a display and the ability to input Yes/No.
+ *
+ * @hide
+ */
+ public static final int IO_CAPABILITY_IO = 1;
+
+ /**
+ * Device only has a keyboard for entry but no display.
+ *
+ * @hide
+ */
+ public static final int IO_CAPABILITY_IN = 2;
+
+ /**
+ * Device has no Input or Output capability.
+ *
+ * @hide
+ */
+ public static final int IO_CAPABILITY_NONE = 3;
+
+ /**
+ * Device has a display and a full keyboard.
+ *
+ * @hide
+ */
+ public static final int IO_CAPABILITY_KBDISP = 4;
+
+ /**
+ * Maximum range value for Input/Output capabilities.
+ *
+ * <p>This should be updated when adding a new Input/Output capability. Other code
+ * like validation depends on this being accurate.
+ *
+ * @hide
+ */
+ public static final int IO_CAPABILITY_MAX = 5;
+
+ /**
+ * The Input/Output capability of the device is unknown.
+ *
+ * @hide
+ */
+ public static final int IO_CAPABILITY_UNKNOWN = 255;
+
+ /**
* Broadcast Action: The local Bluetooth adapter has started the remote
* device discovery process.
* <p>This usually involves an inquiry scan of about 12 seconds, followed
@@ -1231,6 +1283,106 @@ public final class BluetoothAdapter {
}
/**
+ * Returns the Input/Output capability of the device for classic Bluetooth.
+ *
+ * @return Input/Output capability of the device. One of {@link #IO_CAPABILITY_OUT},
+ * {@link #IO_CAPABILITY_IO}, {@link #IO_CAPABILITY_IN}, {@link #IO_CAPABILITY_NONE},
+ * {@link #IO_CAPABILITY_KBDISP} or {@link #IO_CAPABILITY_UNKNOWN}.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ public int getIoCapability() {
+ if (getState() != STATE_ON) return BluetoothAdapter.IO_CAPABILITY_UNKNOWN;
+ try {
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.getIoCapability();
+ } catch (RemoteException e) {
+ Log.e(TAG, e.getMessage(), e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ return BluetoothAdapter.IO_CAPABILITY_UNKNOWN;
+ }
+
+ /**
+ * Sets the Input/Output capability of the device for classic Bluetooth.
+ *
+ * <p>Changing the Input/Output capability of a device only takes effect on restarting the
+ * Bluetooth stack. You would need to restart the stack using {@link BluetoothAdapter#disable()}
+ * and {@link BluetoothAdapter#enable()} to see the changes.
+ *
+ * @param capability Input/Output capability of the device. One of {@link #IO_CAPABILITY_OUT},
+ * {@link #IO_CAPABILITY_IO}, {@link #IO_CAPABILITY_IN},
+ * {@link #IO_CAPABILITY_NONE} or {@link #IO_CAPABILITY_KBDISP}.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public boolean setIoCapability(int capability) {
+ if (getState() != STATE_ON) return false;
+ try {
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.setIoCapability(capability);
+ } catch (RemoteException e) {
+ Log.e(TAG, e.getMessage(), e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ return false;
+ }
+
+ /**
+ * Returns the Input/Output capability of the device for BLE operations.
+ *
+ * @return Input/Output capability of the device. One of {@link #IO_CAPABILITY_OUT},
+ * {@link #IO_CAPABILITY_IO}, {@link #IO_CAPABILITY_IN}, {@link #IO_CAPABILITY_NONE},
+ * {@link #IO_CAPABILITY_KBDISP} or {@link #IO_CAPABILITY_UNKNOWN}.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ public int getLeIoCapability() {
+ if (getState() != STATE_ON) return BluetoothAdapter.IO_CAPABILITY_UNKNOWN;
+ try {
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.getLeIoCapability();
+ } catch (RemoteException e) {
+ Log.e(TAG, e.getMessage(), e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ return BluetoothAdapter.IO_CAPABILITY_UNKNOWN;
+ }
+
+ /**
+ * Sets the Input/Output capability of the device for BLE operations.
+ *
+ * <p>Changing the Input/Output capability of a device only takes effect on restarting the
+ * Bluetooth stack. You would need to restart the stack using {@link BluetoothAdapter#disable()}
+ * and {@link BluetoothAdapter#enable()} to see the changes.
+ *
+ * @param capability Input/Output capability of the device. One of {@link #IO_CAPABILITY_OUT},
+ * {@link #IO_CAPABILITY_IO}, {@link #IO_CAPABILITY_IN},
+ * {@link #IO_CAPABILITY_NONE} or {@link #IO_CAPABILITY_KBDISP}.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public boolean setLeIoCapability(int capability) {
+ if (getState() != STATE_ON) return false;
+ try {
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.setLeIoCapability(capability);
+ } catch (RemoteException e) {
+ Log.e(TAG, e.getMessage(), e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ return false;
+ }
+
+ /**
* Get the current Bluetooth scan mode of the local Bluetooth adapter.
* <p>The Bluetooth scan mode determines if the local adapter is
* connectable and/or discoverable from remote Bluetooth devices.
diff --git a/core/java/android/bluetooth/le/ScanRecord.java b/core/java/android/bluetooth/le/ScanRecord.java
index 8708b51daeae..5be416e848fd 100644
--- a/core/java/android/bluetooth/le/ScanRecord.java
+++ b/core/java/android/bluetooth/le/ScanRecord.java
@@ -131,7 +131,7 @@ public final class ScanRecord {
*/
@Nullable
public byte[] getServiceData(ParcelUuid serviceDataUuid) {
- if (serviceDataUuid == null) {
+ if (serviceDataUuid == null || mServiceData == null) {
return null;
}
return mServiceData.get(serviceDataUuid);
diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java
index 2d490a03bd76..9d8c318f8092 100644
--- a/core/java/android/content/ContentProviderClient.java
+++ b/core/java/android/content/ContentProviderClient.java
@@ -39,6 +39,8 @@ import com.android.internal.util.Preconditions;
import dalvik.system.CloseGuard;
+import libcore.io.IoUtils;
+
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -560,14 +562,17 @@ public class ContentProviderClient implements AutoCloseable {
return ContentProvider.coerceToLocalContentProvider(mContentProvider);
}
+ /**
+ * Closes the given object quietly, ignoring any checked exceptions. Does
+ * nothing if the given object is {@code null}.
+ */
+ public static void closeQuietly(ContentProviderClient client) {
+ IoUtils.closeQuietly(client);
+ }
+
/** {@hide} */
public static void releaseQuietly(ContentProviderClient client) {
- if (client != null) {
- try {
- client.release();
- } catch (Exception ignored) {
- }
- }
+ IoUtils.closeQuietly(client);
}
private class NotRespondingRunnable implements Runnable {
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 314bad3bfaad..b2adda4fb7e3 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -260,6 +260,13 @@ public abstract class ContentResolver {
*/
public static final String QUERY_ARG_SQL_SORT_ORDER = "android:query-arg-sql-sort-order";
+ /** {@hide} */
+ public static final String QUERY_ARG_SQL_GROUP_BY = "android:query-arg-sql-group-by";
+ /** {@hide} */
+ public static final String QUERY_ARG_SQL_HAVING = "android:query-arg-sql-having";
+ /** {@hide} */
+ public static final String QUERY_ARG_SQL_LIMIT = "android:query-arg-sql-limit";
+
/**
* Specifies the list of columns against which to sort results. When first column values
* are identical, records are then sorted based on second column values, and so on.
@@ -767,7 +774,9 @@ public abstract class ContentResolver {
* in the {@link Cursor} extras {@link Bundle}. See {@link #EXTRA_HONORED_ARGS}
* for details.
*
- * @see #QUERY_ARG_SORT_COLUMNS, #QUERY_ARG_SORT_DIRECTION, #QUERY_ARG_SORT_COLLATION.
+ * @see #QUERY_ARG_SORT_COLUMNS
+ * @see #QUERY_ARG_SORT_DIRECTION
+ * @see #QUERY_ARG_SORT_COLLATION
*
* @param uri The URI, using the content:// scheme, for the content to
* retrieve.
diff --git a/core/java/android/content/ContentValues.java b/core/java/android/content/ContentValues.java
index 6f9379890a3a..93fa403b760b 100644
--- a/core/java/android/content/ContentValues.java
+++ b/core/java/android/content/ContentValues.java
@@ -18,6 +18,7 @@ package android.content;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.ArrayMap;
import android.util.Log;
import java.util.ArrayList;
@@ -32,16 +33,20 @@ import java.util.Set;
public final class ContentValues implements Parcelable {
public static final String TAG = "ContentValues";
- /** Holds the actual values */
+ /**
+ * @hide
+ * @deprecated kept around for lame people doing reflection
+ */
+ @Deprecated
private HashMap<String, Object> mValues;
+ private final ArrayMap<String, Object> mMap;
+
/**
* Creates an empty set of values using the default initial size
*/
public ContentValues() {
- // Choosing a default size of 8 based on analysis of typical
- // consumption by applications.
- mValues = new HashMap<String, Object>(8);
+ mMap = new ArrayMap<>();
}
/**
@@ -50,7 +55,7 @@ public final class ContentValues implements Parcelable {
* @param size the initial size of the set of values
*/
public ContentValues(int size) {
- mValues = new HashMap<String, Object>(size, 1.0f);
+ mMap = new ArrayMap<>(size);
}
/**
@@ -59,18 +64,23 @@ public final class ContentValues implements Parcelable {
* @param from the values to copy
*/
public ContentValues(ContentValues from) {
- mValues = new HashMap<String, Object>(from.mValues);
+ mMap = new ArrayMap<>(from.mMap);
}
/**
- * Creates a set of values copied from the given HashMap. This is used
- * by the Parcel unmarshalling code.
- *
- * @param values the values to start with
- * {@hide}
+ * @hide
+ * @deprecated kept around for lame people doing reflection
*/
- private ContentValues(HashMap<String, Object> values) {
- mValues = values;
+ @Deprecated
+ private ContentValues(HashMap<String, Object> from) {
+ mMap = new ArrayMap<>();
+ mMap.putAll(from);
+ }
+
+ /** {@hide} */
+ private ContentValues(Parcel in) {
+ mMap = new ArrayMap<>(in.readInt());
+ in.readArrayMap(mMap, null);
}
@Override
@@ -78,12 +88,17 @@ public final class ContentValues implements Parcelable {
if (!(object instanceof ContentValues)) {
return false;
}
- return mValues.equals(((ContentValues) object).mValues);
+ return mMap.equals(((ContentValues) object).mMap);
+ }
+
+ /** {@hide} */
+ public ArrayMap<String, Object> getValues() {
+ return mMap;
}
@Override
public int hashCode() {
- return mValues.hashCode();
+ return mMap.hashCode();
}
/**
@@ -93,7 +108,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, String value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -102,7 +117,7 @@ public final class ContentValues implements Parcelable {
* @param other the ContentValues from which to copy
*/
public void putAll(ContentValues other) {
- mValues.putAll(other.mValues);
+ mMap.putAll(other.mMap);
}
/**
@@ -112,7 +127,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, Byte value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -122,7 +137,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, Short value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -132,7 +147,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, Integer value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -142,7 +157,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, Long value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -152,7 +167,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, Float value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -162,7 +177,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, Double value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -172,7 +187,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, Boolean value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -182,7 +197,7 @@ public final class ContentValues implements Parcelable {
* @param value the data for the value to put
*/
public void put(String key, byte[] value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -191,7 +206,7 @@ public final class ContentValues implements Parcelable {
* @param key the name of the value to make null
*/
public void putNull(String key) {
- mValues.put(key, null);
+ mMap.put(key, null);
}
/**
@@ -200,7 +215,7 @@ public final class ContentValues implements Parcelable {
* @return the number of values
*/
public int size() {
- return mValues.size();
+ return mMap.size();
}
/**
@@ -211,7 +226,7 @@ public final class ContentValues implements Parcelable {
* TODO: consider exposing this new method publicly
*/
public boolean isEmpty() {
- return mValues.isEmpty();
+ return mMap.isEmpty();
}
/**
@@ -220,14 +235,14 @@ public final class ContentValues implements Parcelable {
* @param key the name of the value to remove
*/
public void remove(String key) {
- mValues.remove(key);
+ mMap.remove(key);
}
/**
* Removes all values.
*/
public void clear() {
- mValues.clear();
+ mMap.clear();
}
/**
@@ -237,7 +252,7 @@ public final class ContentValues implements Parcelable {
* @return {@code true} if the value is present, {@code false} otherwise
*/
public boolean containsKey(String key) {
- return mValues.containsKey(key);
+ return mMap.containsKey(key);
}
/**
@@ -249,7 +264,7 @@ public final class ContentValues implements Parcelable {
* was previously added with the given {@code key}
*/
public Object get(String key) {
- return mValues.get(key);
+ return mMap.get(key);
}
/**
@@ -259,7 +274,7 @@ public final class ContentValues implements Parcelable {
* @return the String for the value
*/
public String getAsString(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
return value != null ? value.toString() : null;
}
@@ -270,7 +285,7 @@ public final class ContentValues implements Parcelable {
* @return the Long value, or {@code null} if the value is missing or cannot be converted
*/
public Long getAsLong(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
try {
return value != null ? ((Number) value).longValue() : null;
} catch (ClassCastException e) {
@@ -295,7 +310,7 @@ public final class ContentValues implements Parcelable {
* @return the Integer value, or {@code null} if the value is missing or cannot be converted
*/
public Integer getAsInteger(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
try {
return value != null ? ((Number) value).intValue() : null;
} catch (ClassCastException e) {
@@ -320,7 +335,7 @@ public final class ContentValues implements Parcelable {
* @return the Short value, or {@code null} if the value is missing or cannot be converted
*/
public Short getAsShort(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
try {
return value != null ? ((Number) value).shortValue() : null;
} catch (ClassCastException e) {
@@ -345,7 +360,7 @@ public final class ContentValues implements Parcelable {
* @return the Byte value, or {@code null} if the value is missing or cannot be converted
*/
public Byte getAsByte(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
try {
return value != null ? ((Number) value).byteValue() : null;
} catch (ClassCastException e) {
@@ -370,7 +385,7 @@ public final class ContentValues implements Parcelable {
* @return the Double value, or {@code null} if the value is missing or cannot be converted
*/
public Double getAsDouble(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
try {
return value != null ? ((Number) value).doubleValue() : null;
} catch (ClassCastException e) {
@@ -395,7 +410,7 @@ public final class ContentValues implements Parcelable {
* @return the Float value, or {@code null} if the value is missing or cannot be converted
*/
public Float getAsFloat(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
try {
return value != null ? ((Number) value).floatValue() : null;
} catch (ClassCastException e) {
@@ -420,7 +435,7 @@ public final class ContentValues implements Parcelable {
* @return the Boolean value, or {@code null} if the value is missing or cannot be converted
*/
public Boolean getAsBoolean(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
try {
return (Boolean) value;
} catch (ClassCastException e) {
@@ -448,7 +463,7 @@ public final class ContentValues implements Parcelable {
* {@code byte[]}
*/
public byte[] getAsByteArray(String key) {
- Object value = mValues.get(key);
+ Object value = mMap.get(key);
if (value instanceof byte[]) {
return (byte[]) value;
} else {
@@ -462,7 +477,7 @@ public final class ContentValues implements Parcelable {
* @return a set of all of the keys and values
*/
public Set<Map.Entry<String, Object>> valueSet() {
- return mValues.entrySet();
+ return mMap.entrySet();
}
/**
@@ -471,30 +486,31 @@ public final class ContentValues implements Parcelable {
* @return a set of all of the keys
*/
public Set<String> keySet() {
- return mValues.keySet();
+ return mMap.keySet();
}
public static final Parcelable.Creator<ContentValues> CREATOR =
new Parcelable.Creator<ContentValues>() {
- @SuppressWarnings({"deprecation", "unchecked"})
+ @Override
public ContentValues createFromParcel(Parcel in) {
- // TODO - what ClassLoader should be passed to readHashMap?
- HashMap<String, Object> values = in.readHashMap(null);
- return new ContentValues(values);
+ return new ContentValues(in);
}
+ @Override
public ContentValues[] newArray(int size) {
return new ContentValues[size];
}
};
+ @Override
public int describeContents() {
return 0;
}
- @SuppressWarnings("deprecation")
+ @Override
public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeMap(mValues);
+ parcel.writeInt(mMap.size());
+ parcel.writeArrayMap(mMap);
}
/**
@@ -503,7 +519,7 @@ public final class ContentValues implements Parcelable {
*/
@Deprecated
public void putStringArrayList(String key, ArrayList<String> value) {
- mValues.put(key, value);
+ mMap.put(key, value);
}
/**
@@ -513,7 +529,7 @@ public final class ContentValues implements Parcelable {
@SuppressWarnings("unchecked")
@Deprecated
public ArrayList<String> getStringArrayList(String key) {
- return (ArrayList<String>) mValues.get(key);
+ return (ArrayList<String>) mMap.get(key);
}
/**
@@ -523,7 +539,7 @@ public final class ContentValues implements Parcelable {
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
- for (String name : mValues.keySet()) {
+ for (String name : mMap.keySet()) {
String value = getAsString(name);
if (sb.length() > 0) sb.append(" ");
sb.append(name + "=" + value);
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 90a94ee76085..c515bce6eb6f 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -729,6 +729,7 @@ public abstract class Context {
* cases where system components are loaded into other app processes, in which
* case this will be the name of the primary package in that process (so that app
* ops uid verification will work with the name). */
+ @TestApi
public abstract String getOpPackageName();
/** Return the full application info for this context's package. */
@@ -3004,6 +3005,7 @@ public abstract class Context {
NSD_SERVICE,
AUDIO_SERVICE,
FINGERPRINT_SERVICE,
+ //@hide: FACE_SERVICE,
MEDIA_ROUTER_SERVICE,
TELEPHONY_SERVICE,
TELEPHONY_SUBSCRIPTION_SERVICE,
@@ -3058,6 +3060,8 @@ public abstract class Context {
COMPANION_DEVICE_SERVICE,
CROSS_PROFILE_APPS_SERVICE,
//@hide: SYSTEM_UPDATE_SERVICE,
+ //@hide: TIME_DETECTOR_SERVICE,
+ //@hide: TIME_ZONE_DETECTOR_SERVICE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ServiceName {}
@@ -3326,6 +3330,16 @@ public abstract class Context {
/**
* Use with {@link #getSystemService(String)} to retrieve a
+ * {@link android.app.ActivityTaskManager} for interacting with the global system state.
+ *
+ * @see #getSystemService(String)
+ * @see android.app.ActivityTaskManager
+ * @hide
+ */
+ public static final String ACTIVITY_TASK_SERVICE = "activity_task";
+
+ /**
+ * Use with {@link #getSystemService(String)} to retrieve a
* {@link android.app.AlarmManager} for receiving intents at a
* time of your choosing.
*
@@ -3640,6 +3654,18 @@ public abstract class Context {
/**
* Use with {@link #getSystemService(String)} to retrieve a
+ * Use with {@link #getSystemService} to retrieve a
+ * {@link android.hardware.face.FaceManager} for handling management
+ * of face authentication.
+ *
+ * @hide
+ * @see #getSystemService
+ * @see android.hardware.face.FaceManager
+ */
+ public static final String FACE_SERVICE = "face";
+
+ /**
+ * Use with {@link #getSystemService} to retrieve a
* {@link android.media.MediaRouter} for controlling and managing
* routing of media.
*
@@ -4210,6 +4236,24 @@ public abstract class Context {
public static final String SECURE_ELEMENT_SERVICE = "secure_element";
/**
+ * Use with {@link #getSystemService(String)} to retrieve an
+ * {@link android.app.timedetector.ITimeDetectorService}.
+ * @hide
+ *
+ * @see #getSystemService(String)
+ */
+ public static final String TIME_DETECTOR_SERVICE = "time_detector";
+
+ /**
+ * Use with {@link #getSystemService(String)} to retrieve an
+ * {@link android.app.timezonedetector.ITimeZoneDetectorService}.
+ * @hide
+ *
+ * @see #getSystemService(String)
+ */
+ public static final String TIME_ZONE_DETECTOR_SERVICE = "time_zone_detector";
+
+ /**
* Determine whether the given permission is allowed for a particular
* process and user ID running in the system.
*
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index bbbfa90ee6ac..2821451b7ca0 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4614,15 +4614,6 @@ public class Intent implements Parcelable, Cloneable {
public static final String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS";
/**
- * A {@link IntentSender} to start after ephemeral installation success.
- * @deprecated Use {@link #EXTRA_INSTANT_APP_SUCCESS).
- * @removed
- * @hide
- */
- @Deprecated
- public static final String EXTRA_EPHEMERAL_SUCCESS = "android.intent.extra.EPHEMERAL_SUCCESS";
-
- /**
* A {@link IntentSender} to start after instant app installation success.
* @hide
*/
@@ -4631,15 +4622,6 @@ public class Intent implements Parcelable, Cloneable {
"android.intent.extra.INSTANT_APP_SUCCESS";
/**
- * A {@link IntentSender} to start after ephemeral installation failure.
- * @deprecated Use {@link #EXTRA_INSTANT_APP_FAILURE).
- * @removed
- * @hide
- */
- @Deprecated
- public static final String EXTRA_EPHEMERAL_FAILURE = "android.intent.extra.EPHEMERAL_FAILURE";
-
- /**
* A {@link IntentSender} to start after instant app installation failure.
* @hide
*/
@@ -4648,15 +4630,6 @@ public class Intent implements Parcelable, Cloneable {
"android.intent.extra.INSTANT_APP_FAILURE";
/**
- * The host name that triggered an ephemeral resolution.
- * @deprecated Use {@link #EXTRA_INSTANT_APP_HOSTNAME).
- * @removed
- * @hide
- */
- @Deprecated
- public static final String EXTRA_EPHEMERAL_HOSTNAME = "android.intent.extra.EPHEMERAL_HOSTNAME";
-
- /**
* The host name that triggered an instant app resolution.
* @hide
*/
@@ -4665,15 +4638,6 @@ public class Intent implements Parcelable, Cloneable {
"android.intent.extra.INSTANT_APP_HOSTNAME";
/**
- * An opaque token to track ephemeral resolution.
- * @deprecated Use {@link #EXTRA_INSTANT_APP_TOKEN).
- * @removed
- * @hide
- */
- @Deprecated
- public static final String EXTRA_EPHEMERAL_TOKEN = "android.intent.extra.EPHEMERAL_TOKEN";
-
- /**
* An opaque token to track instant app resolution.
* @hide
*/
@@ -5420,19 +5384,23 @@ public class Intent implements Parcelable, Cloneable {
public static final int FLAG_GRANT_PREFIX_URI_PERMISSION = 0x00000080;
/**
- * Internal flag used to indicate that a system component has done their
- * homework and verified that they correctly handle packages and components
- * that come and go over time. In particular:
- * <ul>
- * <li>Apps installed on external storage, which will appear to be
- * uninstalled while the the device is ejected.
- * <li>Apps with encryption unaware components, which will appear to not
- * exist while the device is locked.
- * </ul>
- *
- * @hide
+ * Flag used to automatically match intents based on their Direct Boot
+ * awareness and the current user state.
+ * <p>
+ * Since the default behavior is to automatically apply the current user
+ * state, this is effectively a sentinel value that doesn't change the
+ * output of any queries based on its presence or absence.
+ * <p>
+ * Instead, this value can be useful in conjunction with
+ * {@link android.os.StrictMode.VmPolicy.Builder#detectImplicitDirectBoot()}
+ * to detect when a caller is relying on implicit automatic matching,
+ * instead of confirming the explicit behavior they want.
*/
- public static final int FLAG_DEBUG_TRIAGED_MISSING = 0x00000100;
+ public static final int FLAG_DIRECT_BOOT_AUTO = 0x00000100;
+
+ /** {@hide} */
+ @Deprecated
+ public static final int FLAG_DEBUG_TRIAGED_MISSING = FLAG_DIRECT_BOOT_AUTO;
/**
* Internal flag used to indicate ephemeral applications should not be
diff --git a/core/java/android/content/QuickViewConstants.java b/core/java/android/content/QuickViewConstants.java
index 132d43f2e143..ffb131c04bb9 100644
--- a/core/java/android/content/QuickViewConstants.java
+++ b/core/java/android/content/QuickViewConstants.java
@@ -45,8 +45,8 @@ public class QuickViewConstants {
* Feature to delete an individual document. Quick viewer implementations must use
* Storage Access Framework to both verify delete permission and to delete content.
*
- * @see DocumentsContract.Document#FLAG_SUPPORTS_DELETE
- * @see DocumentsContract#deleteDocument(ContentResolver, Uri)
+ * @see android.provider.DocumentsContract.Document#FLAG_SUPPORTS_DELETE
+ * @see android.provider.DocumentsContract#deleteDocument(ContentResolver, android.net.Uri)
*/
public static final String FEATURE_DELETE = "android:delete";
diff --git a/core/java/android/content/UriMatcher.java b/core/java/android/content/UriMatcher.java
index 444edd0deac2..8db82a8a1107 100644
--- a/core/java/android/content/UriMatcher.java
+++ b/core/java/android/content/UriMatcher.java
@@ -134,12 +134,12 @@ public class UriMatcher
mText = null;
}
- private UriMatcher()
+ private UriMatcher(int which, String text)
{
mCode = NO_MATCH;
- mWhich = -1;
+ mWhich = which;
mChildren = new ArrayList<UriMatcher>();
- mText = null;
+ mText = text;
}
/**
@@ -190,15 +190,7 @@ public class UriMatcher
}
if (j == numChildren) {
// Child not found, create it
- child = new UriMatcher();
- if (token.equals("#")) {
- child.mWhich = NUMBER;
- } else if (token.equals("*")) {
- child.mWhich = TEXT;
- } else {
- child.mWhich = EXACT;
- }
- child.mText = token;
+ child = createChild(token);
node.mChildren.add(child);
node = child;
}
@@ -206,12 +198,23 @@ public class UriMatcher
node.mCode = code;
}
+ private static UriMatcher createChild(String token) {
+ switch (token) {
+ case "#":
+ return new UriMatcher(NUMBER, "#");
+ case "*":
+ return new UriMatcher(TEXT, "*");
+ default:
+ return new UriMatcher(EXACT, token);
+ }
+ }
+
/**
* Try to match against the path in a url.
*
* @param uri The url whose path we will match against.
*
- * @return The code for the matched node (added using addURI),
+ * @return The code for the matched node (added using addURI),
* or -1 if there is no matched node.
*/
public int match(Uri uri)
@@ -273,7 +276,7 @@ public class UriMatcher
private static final int TEXT = 2;
private int mCode;
- private int mWhich;
- private String mText;
+ private final int mWhich;
+ private final String mText;
private ArrayList<UriMatcher> mChildren;
}
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 0e91a2927c79..dcf8c772fb5e 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -18,6 +18,7 @@ package android.content.pm;
import android.annotation.IntDef;
import android.annotation.TestApi;
+import android.content.ComponentName;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Configuration.NativeConfig;
@@ -400,7 +401,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
/**
* Bit in {@link #flags} indicating that this activity should be run with VR mode enabled.
*
- * {@see android.app.Activity#setVrMode(boolean)}.
+ * @see android.app.Activity#setVrModeEnabled(boolean, ComponentName)
*/
public static final int FLAG_ENABLE_VR_MODE = 0x8000;
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 2ba9aa521544..93de7f639e67 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -479,6 +479,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
*
* {@hide}
*/
+ @TestApi
public static final int PRIVATE_FLAG_PRIVILEGED = 1<<3;
/**
@@ -651,6 +652,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
* Private/hidden flags. See {@code PRIVATE_FLAG_...} constants.
* @hide
*/
+ @TestApi
public @ApplicationInfoPrivateFlags int privateFlags;
/**
@@ -1141,6 +1143,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
/** @hide */
public String[] splitClassLoaderNames;
+ /** @hide */
+ public boolean hiddenUntilInstalled;
+
/**
* Represents the default policy. The actual policy used will depend on other properties of
* the application, e.g. the target SDK version.
@@ -1484,6 +1489,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
compileSdkVersion = orig.compileSdkVersion;
compileSdkVersionCodename = orig.compileSdkVersionCodename;
mHiddenApiPolicy = orig.mHiddenApiPolicy;
+ hiddenUntilInstalled = orig.hiddenUntilInstalled;
}
public String toString() {
@@ -1561,6 +1567,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
dest.writeString(compileSdkVersionCodename);
dest.writeString(appComponentFactory);
dest.writeInt(mHiddenApiPolicy);
+ dest.writeInt(hiddenUntilInstalled ? 1 : 0);
}
public static final Parcelable.Creator<ApplicationInfo> CREATOR
@@ -1635,6 +1642,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
compileSdkVersionCodename = source.readString();
appComponentFactory = source.readString();
mHiddenApiPolicy = source.readInt();
+ hiddenUntilInstalled = source.readInt() != 0;
}
/**
diff --git a/core/java/android/content/pm/CrossProfileApps.java b/core/java/android/content/pm/CrossProfileApps.java
index 87f4dab1115a..1c564f3708df 100644
--- a/core/java/android/content/pm/CrossProfileApps.java
+++ b/core/java/android/content/pm/CrossProfileApps.java
@@ -19,9 +19,7 @@ import android.annotation.NonNull;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
-import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.os.Bundle;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
@@ -107,7 +105,7 @@ public class CrossProfileApps {
* @return a label that calling app can show user for the semantic of launching its own
* activity in the specified user profile.
*
- * @see #startMainActivity(ComponentName, UserHandle, Rect, Bundle)
+ * @see #startMainActivity(ComponentName, UserHandle)
*/
public @NonNull CharSequence getProfileSwitchingLabel(@NonNull UserHandle userHandle) {
verifyCanAccessUser(userHandle);
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index c988fa907f86..bc5b32c69b59 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -598,6 +598,9 @@ interface IPackageManager {
boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden, int userId);
boolean getApplicationHiddenSettingAsUser(String packageName, int userId);
+ void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden);
+ boolean setSystemAppInstallState(String packageName, boolean installed, int userId);
+
IPackageInstaller getPackageInstaller();
boolean setBlockUninstallForUser(String packageName, boolean blockUninstall, int userId);
diff --git a/core/java/android/content/pm/LimitedLengthInputStream.java b/core/java/android/content/pm/LimitedLengthInputStream.java
index e78727718cbd..19b681e4373a 100644
--- a/core/java/android/content/pm/LimitedLengthInputStream.java
+++ b/core/java/android/content/pm/LimitedLengthInputStream.java
@@ -1,9 +1,10 @@
package android.content.pm;
+import libcore.util.ArrayUtils;
+
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Arrays;
/**
* A class that limits the amount of data that is read from an InputStream. When
@@ -71,7 +72,7 @@ public class LimitedLengthInputStream extends FilterInputStream {
}
final int arrayLength = buffer.length;
- Arrays.checkOffsetAndCount(arrayLength, offset, byteCount);
+ ArrayUtils.throwsIfOutOfBounds(arrayLength, offset, byteCount);
if (mOffset > Long.MAX_VALUE - byteCount) {
throw new IOException("offset out of bounds: " + mOffset + " + " + byteCount);
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 25af1a76700f..2f3bf635d1aa 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -1236,8 +1236,6 @@ public class PackageInstaller {
/**
* Sets the UID that initiated the package installation. This is informational
* and may be used as a signal for anti-malware purposes.
- *
- * @see Intent#EXTRA_ORIGINATING_UID
*/
public void setOriginatingUid(int originatingUid) {
this.originatingUid = originatingUid;
@@ -1329,6 +1327,15 @@ public class PackageInstaller {
/**
* Set the reason for installing this package.
+ * <p>
+ * The install reason should be a pre-defined integer. The behavior is
+ * undefined if other values are used.
+ *
+ * @see PackageManager#INSTALL_REASON_UNKNOWN
+ * @see PackageManager#INSTALL_REASON_POLICY
+ * @see PackageManager#INSTALL_REASON_DEVICE_RESTORE
+ * @see PackageManager#INSTALL_REASON_DEVICE_SETUP
+ * @see PackageManager#INSTALL_REASON_USER
*/
public void setInstallReason(@InstallReason int installReason) {
this.installReason = installReason;
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 52e28a4b4b9b..14d3f91ffba0 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -53,6 +53,12 @@ public class PackageItemInfo {
private static final int LINE_FEED_CODE_POINT = 10;
private static final int NBSP_CODE_POINT = 160;
+ /** The maximum length of a safe label, in characters */
+ private static final int MAX_SAFE_LABEL_LENGTH = 50000;
+
+ /** @hide */
+ public static final float DEFAULT_MAX_LABEL_SIZE_PX = 500f;
+
/**
* Flags for {@link #loadSafeLabel(PackageManager, float, int)}
*
@@ -71,6 +77,7 @@ public class PackageItemInfo {
* @see #loadSafeLabel(PackageManager, float, int)
* @hide
*/
+ @SystemApi
public static final int SAFE_LABEL_FLAG_TRIM = 0x1;
/**
@@ -80,6 +87,7 @@ public class PackageItemInfo {
* @see #loadSafeLabel(PackageManager, float, int)
* @hide
*/
+ @SystemApi
public static final int SAFE_LABEL_FLAG_SINGLE_LINE = 0x2;
/**
@@ -89,12 +97,9 @@ public class PackageItemInfo {
* @see #loadSafeLabel(PackageManager, float, int)
* @hide
*/
+ @SystemApi
public static final int SAFE_LABEL_FLAG_FIRST_LINE = 0x4;
- private static final float MAX_LABEL_SIZE_PX = 500f;
- /** The maximum length of a safe label, in characters */
- private static final int MAX_SAFE_LABEL_LENGTH = 50000;
-
private static volatile boolean sForceSafeLabels = false;
/** {@hide} */
@@ -189,7 +194,8 @@ public class PackageItemInfo {
*/
public @NonNull CharSequence loadLabel(@NonNull PackageManager pm) {
if (sForceSafeLabels) {
- return loadSafeLabel(pm);
+ return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_LABEL_FLAG_TRIM
+ | SAFE_LABEL_FLAG_FIRST_LINE);
} else {
return loadUnsafeLabel(pm);
}
@@ -212,57 +218,6 @@ public class PackageItemInfo {
return packageName;
}
- /**
- * Deprecated use loadSafeLabel(PackageManager, float, int) instead
- *
- * @hide
- */
- @SystemApi
- public @NonNull CharSequence loadSafeLabel(@NonNull PackageManager pm) {
- // loadLabel() always returns non-null
- String label = loadUnsafeLabel(pm).toString();
- // strip HTML tags to avoid <br> and other tags overwriting original message
- String labelStr = Html.fromHtml(label).toString();
-
- // If the label contains new line characters it may push the UI
- // down to hide a part of it. Labels shouldn't have new line
- // characters, so just truncate at the first time one is seen.
- final int labelLength = Math.min(labelStr.length(), MAX_SAFE_LABEL_LENGTH);
- final StringBuffer sb = new StringBuffer(labelLength);
- int offset = 0;
- while (offset < labelLength) {
- final int codePoint = labelStr.codePointAt(offset);
- final int type = Character.getType(codePoint);
- if (type == Character.LINE_SEPARATOR
- || type == Character.CONTROL
- || type == Character.PARAGRAPH_SEPARATOR) {
- labelStr = labelStr.substring(0, offset);
- break;
- }
- // replace all non-break space to " " in order to be trimmed
- final int charCount = Character.charCount(codePoint);
- if (type == Character.SPACE_SEPARATOR) {
- sb.append(' ');
- } else {
- sb.append(labelStr.charAt(offset));
- if (charCount == 2) {
- sb.append(labelStr.charAt(offset + 1));
- }
- }
- offset += charCount;
- }
-
- labelStr = sb.toString().trim();
- if (labelStr.isEmpty()) {
- return packageName;
- }
- TextPaint paint = new TextPaint();
- paint.setTextSize(42);
-
- return TextUtils.ellipsize(labelStr, paint, MAX_LABEL_SIZE_PX,
- TextUtils.TruncateAt.END);
- }
-
private static boolean isNewline(int codePoint) {
int type = Character.getType(codePoint);
return type == Character.PARAGRAPH_SEPARATOR || type == Character.LINE_SEPARATOR
@@ -274,6 +229,17 @@ public class PackageItemInfo {
}
/**
+ * @hide
+ * @deprecated use loadSafeLabel(PackageManager, float, int) instead
+ */
+ @SystemApi
+ @Deprecated
+ public @NonNull CharSequence loadSafeLabel(@NonNull PackageManager pm) {
+ return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_LABEL_FLAG_TRIM
+ | SAFE_LABEL_FLAG_FIRST_LINE);
+ }
+
+ /**
* A special string manipulation class. Just records removals and executes the when onString()
* is called.
*/
@@ -387,6 +353,7 @@ public class PackageItemInfo {
* @return The safe label
* @hide
*/
+ @SystemApi
public @NonNull CharSequence loadSafeLabel(@NonNull PackageManager pm,
@FloatRange(from = 0) float ellipsizeDip, @SafeLabelFlags int flags) {
boolean onlyKeepFirstLine = ((flags & SAFE_LABEL_FLAG_FIRST_LINE) != 0);
@@ -399,7 +366,7 @@ public class PackageItemInfo {
| SAFE_LABEL_FLAG_FIRST_LINE);
Preconditions.checkArgument(!(onlyKeepFirstLine && forceSingleLine),
"Cannot set SAFE_LABEL_FLAG_SINGLE_LINE and SAFE_LABEL_FLAG_FIRST_LINE at the same "
- + "time");
+ + "time");
// loadLabel() always returns non-null
String label = loadUnsafeLabel(pm).toString();
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 7253e7758008..ce551ee6d5ae 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -147,6 +147,7 @@ public abstract class PackageManager {
GET_DISABLED_COMPONENTS,
GET_DISABLED_UNTIL_USED_COMPONENTS,
GET_UNINSTALLED_PACKAGES,
+ MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS,
})
@Retention(RetentionPolicy.SOURCE)
public @interface PackageInfoFlags {}
@@ -164,6 +165,7 @@ public abstract class PackageManager {
MATCH_STATIC_SHARED_LIBRARIES,
GET_DISABLED_UNTIL_USED_COMPONENTS,
GET_UNINSTALLED_PACKAGES,
+ MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ApplicationInfoFlags {}
@@ -177,6 +179,7 @@ public abstract class PackageManager {
MATCH_DEFAULT_ONLY,
MATCH_DISABLED_COMPONENTS,
MATCH_DISABLED_UNTIL_USED_COMPONENTS,
+ MATCH_DIRECT_BOOT_AUTO,
MATCH_DIRECT_BOOT_AWARE,
MATCH_DIRECT_BOOT_UNAWARE,
MATCH_SYSTEM_ONLY,
@@ -200,6 +203,7 @@ public abstract class PackageManager {
MATCH_DISABLED_COMPONENTS,
MATCH_DISABLED_UNTIL_USED_COMPONENTS,
MATCH_DEFAULT_ONLY,
+ MATCH_DIRECT_BOOT_AUTO,
MATCH_DIRECT_BOOT_AWARE,
MATCH_DIRECT_BOOT_UNAWARE,
MATCH_SYSTEM_ONLY,
@@ -504,22 +508,35 @@ public abstract class PackageManager {
public static final int GET_SIGNING_CERTIFICATES = 0x08000000;
/**
- * Internal flag used to indicate that a system component has done their
- * homework and verified that they correctly handle packages and components
- * that come and go over time. In particular:
+ * Querying flag: automatically match components based on their Direct Boot
+ * awareness and the current user state.
+ * <p>
+ * Since the default behavior is to automatically apply the current user
+ * state, this is effectively a sentinel value that doesn't change the
+ * output of any queries based on its presence or absence.
+ * <p>
+ * Instead, this value can be useful in conjunction with
+ * {@link android.os.StrictMode.VmPolicy.Builder#detectImplicitDirectBoot()}
+ * to detect when a caller is relying on implicit automatic matching,
+ * instead of confirming the explicit behavior they want, using a
+ * combination of these flags:
* <ul>
- * <li>Apps installed on external storage, which will appear to be
- * uninstalled while the the device is ejected.
- * <li>Apps with encryption unaware components, which will appear to not
- * exist while the device is locked.
+ * <li>{@link #MATCH_DIRECT_BOOT_AWARE}
+ * <li>{@link #MATCH_DIRECT_BOOT_UNAWARE}
+ * <li>{@link #MATCH_DIRECT_BOOT_AUTO}
* </ul>
- *
- * @see #MATCH_UNINSTALLED_PACKAGES
- * @see #MATCH_DIRECT_BOOT_AWARE
- * @see #MATCH_DIRECT_BOOT_UNAWARE
+ */
+ public static final int MATCH_DIRECT_BOOT_AUTO = 0x10000000;
+
+ /** @hide */
+ @Deprecated
+ public static final int MATCH_DEBUG_TRIAGED_MISSING = MATCH_DIRECT_BOOT_AUTO;
+
+ /**
+ * Internal flag used to indicate that a package is a hidden system app.
* @hide
*/
- public static final int MATCH_DEBUG_TRIAGED_MISSING = 0x10000000;
+ public static final int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS = 0x20000000;
/**
* Flag for {@link #addCrossProfileIntentFilter}: if this flag is set: when
@@ -2245,12 +2262,20 @@ public abstract class PackageManager {
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has biometric hardware to detect a fingerprint.
- */
+ */
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_FINGERPRINT = "android.hardware.fingerprint";
/**
* Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature}: The device has biometric hardware to perform face authentication.
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_FACE = "android.hardware.face";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports portrait orientation
* screens. For backwards compatibility, you can assume that if neither
* this nor {@link #FEATURE_SCREEN_LANDSCAPE} is set then the device supports
@@ -2912,6 +2937,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ @TestApi
public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services";
/**
@@ -2923,6 +2949,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ @TestApi
public static final String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared";
/**
@@ -3555,6 +3582,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ @TestApi
@SystemApi
@RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS)
public abstract void grantRuntimePermission(@NonNull String packageName,
@@ -3581,6 +3609,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ @TestApi
@SystemApi
@RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
public abstract void revokeRuntimePermission(@NonNull String packageName,
@@ -3983,7 +4012,7 @@ public abstract class PackageManager {
* <p>The sequence number starts at <code>0</code> and is
* reset every boot.
* @param sequenceNumber The first sequence number for which to retrieve package changes.
- * @see Settings.Global#BOOT_COUNT
+ * @see android.provider.Settings.Global#BOOT_COUNT
*/
public abstract @Nullable ChangedPackages getChangedPackages(
@IntRange(from=0) int sequenceNumber);
@@ -4272,14 +4301,20 @@ public abstract class PackageManager {
@ResolveInfoFlags int flags);
/**
- * Find a single content provider by its base path name.
+ * Find a single content provider by its authority.
+ * <p>
+ * Example:<p>
+ * <pre>
+ * Uri uri = Uri.parse("content://com.example.app.provider/table1");
+ * ProviderInfo info = packageManager.resolveContentProvider(uri.getAuthority(), flags);
+ * </pre>
*
- * @param name The name of the provider to find.
+ * @param authority The authority of the provider to find.
* @param flags Additional option flags to modify the data returned.
* @return A {@link ProviderInfo} object containing information about the
* provider. If a provider was not found, returns null.
*/
- public abstract ProviderInfo resolveContentProvider(String name,
+ public abstract ProviderInfo resolveContentProvider(String authority,
@ComponentInfoFlags int flags);
/**
@@ -4841,7 +4876,8 @@ public abstract class PackageManager {
* on the system for other users, also install it for the specified user.
* @hide
*/
- @RequiresPermission(anyOf = {
+ @RequiresPermission(anyOf = {
+ Manifest.permission.INSTALL_EXISTING_PACKAGES,
Manifest.permission.INSTALL_PACKAGES,
Manifest.permission.INTERACT_ACROSS_USERS_FULL})
public abstract int installExistingPackageAsUser(String packageName, @UserIdInt int userId)
@@ -5402,6 +5438,8 @@ public abstract class PackageManager {
* @param newState The new enabled state for the component.
* @param flags Optional behavior flags.
*/
+ @RequiresPermission(value = android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE,
+ conditional = true)
public abstract void setComponentEnabledSetting(ComponentName componentName,
@EnabledState int newState, @EnabledFlags int flags);
@@ -5429,6 +5467,8 @@ public abstract class PackageManager {
* @param newState The new enabled state for the application.
* @param flags Optional behavior flags.
*/
+ @RequiresPermission(value = android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE,
+ conditional = true)
public abstract void setApplicationEnabledSetting(String packageName,
@EnabledState int newState, @EnabledFlags int flags);
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index f30b3fee7f46..ee752f8b8186 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -29,9 +29,12 @@ import android.os.Bundle;
import android.os.PersistableBundle;
import android.util.SparseArray;
+import com.android.internal.util.function.TriFunction;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
+import java.util.function.BiFunction;
/**
* Package manager local system service interface.
@@ -64,6 +67,32 @@ public abstract class PackageManagerInternal {
void onPackageRemoved(@NonNull String packageName);
}
+ /** Interface to override permission checks via composition */
+ public interface CheckPermissionDelegate {
+ /**
+ * Allows overriding check permission behavior.
+ *
+ * @param permName The permission to check.
+ * @param pkgName The package for which to check.
+ * @param userId The user for which to check.
+ * @param superImpl The super implementation.
+ * @return The check permission result.
+ */
+ int checkPermission(String permName, String pkgName, int userId,
+ TriFunction<String, String, Integer, Integer> superImpl);
+
+ /**
+ * Allows overriding check UID permission behavior.
+ *
+ * @param permName The permission to check.
+ * @param uid The UID for which to check.
+ * @param superImpl The super implementation.
+ * @return The check permission result.
+ */
+ int checkUidPermission(String permName, int uid,
+ BiFunction<String, Integer, Integer> superImpl);
+ }
+
/**
* Provider for package names.
*/
@@ -628,4 +657,18 @@ public abstract class PackageManagerInternal {
*/
public abstract boolean hasSignatureCapability(int serverUid, int clientUid,
@PackageParser.SigningDetails.CertCapabilities int capability);
+
+ /**
+ * Get the delegate to influence permission checking.
+ *
+ * @return The delegate instance or null to clear.
+ */
+ public abstract @Nullable CheckPermissionDelegate getCheckPermissionDelegate();
+
+ /**
+ * Set a delegate to influence permission checking.
+ *
+ * @param delegate A delegate instance or null to clear.
+ */
+ public abstract void setCheckPermissionDelegate(@Nullable CheckPermissionDelegate delegate);
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 2da2cb4c9285..54d383a9948e 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -40,12 +40,13 @@ import static android.os.Build.VERSION_CODES.O;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_UNSPECIFIED;
+import android.Manifest;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
-import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
@@ -303,7 +304,13 @@ public class PackageParser {
android.os.Build.VERSION_CODES.JELLY_BEAN),
new PackageParser.SplitPermissionInfo(android.Manifest.permission.WRITE_CONTACTS,
new String[] { android.Manifest.permission.WRITE_CALL_LOG },
- android.os.Build.VERSION_CODES.JELLY_BEAN)
+ android.os.Build.VERSION_CODES.JELLY_BEAN),
+ new PackageParser.SplitPermissionInfo(Manifest.permission.ACCESS_FINE_LOCATION,
+ new String[] { android.Manifest.permission.ACCESS_BACKGROUND_LOCATION },
+ android.os.Build.VERSION_CODES.P0),
+ new PackageParser.SplitPermissionInfo(Manifest.permission.ACCESS_COARSE_LOCATION,
+ new String[] { android.Manifest.permission.ACCESS_BACKGROUND_LOCATION },
+ android.os.Build.VERSION_CODES.P0),
};
/**
@@ -639,11 +646,19 @@ public class PackageParser {
*/
private static boolean checkUseInstalledOrHidden(int flags, PackageUserState state,
ApplicationInfo appInfo) {
+ // Returns false if the package is hidden system app until installed.
+ if ((flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) == 0
+ && !state.installed
+ && appInfo != null && appInfo.hiddenUntilInstalled) {
+ return false;
+ }
+
// If available for the target user, or trying to match uninstalled packages and it's
// a system app.
return state.isAvailable(flags)
|| (appInfo != null && appInfo.isSystemApp()
- && (flags & PackageManager.MATCH_KNOWN_PACKAGES) != 0);
+ && ((flags & PackageManager.MATCH_KNOWN_PACKAGES) != 0
+ || (flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) != 0));
}
public static boolean isAvailable(PackageUserState state) {
@@ -2199,10 +2214,10 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
if (val != null) {
if (val.type == TypedValue.TYPE_STRING && val.string != null) {
- targetCode = minCode = val.string.toString();
+ minCode = val.string.toString();
} else {
// If it's not a string, it's an integer.
- targetVers = minVers = val.data;
+ minVers = val.data;
}
}
@@ -2218,6 +2233,9 @@ public class PackageParser {
// If it's not a string, it's an integer.
targetVers = val.data;
}
+ } else {
+ targetVers = minVers;
+ targetCode = minCode;
}
sa.recycle();
@@ -3090,6 +3108,14 @@ public class PackageParser {
0);
perm.info.requestRes = sa.getResourceId(
com.android.internal.R.styleable.AndroidManifestPermissionGroup_request, 0);
+ perm.info.requestDetailResourceId = sa.getResourceId(
+ com.android.internal.R.styleable.AndroidManifestPermissionGroup_requestDetail, 0);
+ perm.info.backgroundRequestResourceId = sa.getResourceId(
+ com.android.internal.R.styleable.AndroidManifestPermissionGroup_backgroundRequest,
+ 0);
+ perm.info.backgroundRequestDetailResourceId = sa.getResourceId(
+ com.android.internal.R.styleable
+ .AndroidManifestPermissionGroup_backgroundRequestDetail, 0);
perm.info.flags = sa.getInt(
com.android.internal.R.styleable.AndroidManifestPermissionGroup_permissionGroupFlags, 0);
perm.info.priority = sa.getInt(
@@ -3144,6 +3170,19 @@ public class PackageParser {
perm.info.requestRes = sa.getResourceId(
com.android.internal.R.styleable.AndroidManifestPermission_request, 0);
+ if (sa.hasValue(
+ com.android.internal.R.styleable.AndroidManifestPermission_backgroundPermission)) {
+ if ("android".equals(owner.packageName)) {
+ perm.info.backgroundPermission = sa.getNonResourceString(
+ com.android.internal.R.styleable
+ .AndroidManifestPermission_backgroundPermission);
+ } else {
+ Slog.w(TAG, owner.packageName + " defines permission '" + perm.info.name
+ + "' with a background permission. Only the 'android' package can do "
+ + "that.");
+ }
+ }
+
perm.info.protectionLevel = sa.getInt(
com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
PermissionInfo.PROTECTION_NORMAL);
@@ -4225,7 +4264,7 @@ public class PackageParser {
ActivityInfo.DOCUMENT_LAUNCH_NONE);
a.info.maxRecents = sa.getInt(
R.styleable.AndroidManifestActivity_maxRecents,
- ActivityManager.getDefaultAppRecentsLimitStatic());
+ ActivityTaskManager.getDefaultAppRecentsLimitStatic());
a.info.configChanges = getActivityConfigChanges(
sa.getInt(R.styleable.AndroidManifestActivity_configChanges, 0),
sa.getInt(R.styleable.AndroidManifestActivity_recreateOnConfigChanges, 0));
diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java
index f471a1d9b36c..de173c437916 100644
--- a/core/java/android/content/pm/PackageUserState.java
+++ b/core/java/android/content/pm/PackageUserState.java
@@ -21,6 +21,7 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+import static android.content.pm.PackageManager.MATCH_ALL;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
@@ -125,6 +126,9 @@ public class PackageUserState {
* </p>
*/
public boolean isMatch(ComponentInfo componentInfo, int flags) {
+ if ((flags & MATCH_ALL) != 0) {
+ return true;
+ }
final boolean isSystemApp = componentInfo.applicationInfo.isSystemApp();
final boolean matchUninstalled = (flags & PackageManager.MATCH_KNOWN_PACKAGES) != 0;
if (!isAvailable(flags)
diff --git a/core/java/android/content/pm/PermissionGroupInfo.java b/core/java/android/content/pm/PermissionGroupInfo.java
index 7c4478d0b689..8cf66d81972f 100644
--- a/core/java/android/content/pm/PermissionGroupInfo.java
+++ b/core/java/android/content/pm/PermissionGroupInfo.java
@@ -45,6 +45,42 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
public @StringRes int requestRes;
/**
+ * A string resource identifier (in the package's resources) used as subtitle when requesting
+ * only access while in the foreground.
+ *
+ * From the "requestDetail" attribute or, if not set, {@link
+ * android.content.res.ResourceId#ID_NULL}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public @StringRes int requestDetailResourceId;
+
+ /**
+ * A string resource identifier (in the package's resources) used when requesting background
+ * access. Also used when requesting both foreground and background access.
+ *
+ * From the "backgroundRequest" attribute or, if not set, {@link
+ * android.content.res.ResourceId#ID_NULL}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public @StringRes int backgroundRequestResourceId;
+
+ /**
+ * A string resource identifier (in the package's resources) used as subtitle when requesting
+ * background access.
+ *
+ * From the "backgroundRequestDetail" attribute or, if not set, {@link
+ * android.content.res.ResourceId#ID_NULL}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public @StringRes int backgroundRequestDetailResourceId;
+
+ /**
* The description string provided in the AndroidManifest file, if any. You
* probably don't want to use this, since it will be null if the description
* is in a resource. You probably want
@@ -76,6 +112,9 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
super(orig);
descriptionRes = orig.descriptionRes;
requestRes = orig.requestRes;
+ requestDetailResourceId = orig.requestDetailResourceId;
+ backgroundRequestResourceId = orig.backgroundRequestResourceId;
+ backgroundRequestDetailResourceId = orig.backgroundRequestDetailResourceId;
nonLocalizedDescription = orig.nonLocalizedDescription;
flags = orig.flags;
priority = orig.priority;
@@ -119,6 +158,9 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
super.writeToParcel(dest, parcelableFlags);
dest.writeInt(descriptionRes);
dest.writeInt(requestRes);
+ dest.writeInt(requestDetailResourceId);
+ dest.writeInt(backgroundRequestResourceId);
+ dest.writeInt(backgroundRequestDetailResourceId);
TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags);
dest.writeInt(flags);
dest.writeInt(priority);
@@ -138,6 +180,9 @@ public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
super(source);
descriptionRes = source.readInt();
requestRes = source.readInt();
+ requestDetailResourceId = source.readInt();
+ backgroundRequestResourceId = source.readInt();
+ backgroundRequestDetailResourceId = source.readInt();
nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
flags = source.readInt();
priority = source.readInt();
diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java
index 938409af90e9..535ef00d58a1 100644
--- a/core/java/android/content/pm/PermissionInfo.java
+++ b/core/java/android/content/pm/PermissionInfo.java
@@ -285,6 +285,21 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
public int requestRes;
/**
+ * Some permissions only grant access while the app is in foreground. Some of these permissions
+ * allow to add background capabilities by adding another permission.
+ *
+ * If this is such a permission, this is the name of the permission adding the background
+ * access.
+ *
+ * From the "backgroundPermission" attribute or, if not set null
+ *
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ public String backgroundPermission;
+
+ /**
* The description string provided in the AndroidManifest file, if any. You
* probably don't want to use this, since it will be null if the description
* is in a resource. You probably want
@@ -373,6 +388,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
protectionLevel = orig.protectionLevel;
flags = orig.flags;
group = orig.group;
+ backgroundPermission = orig.backgroundPermission;
descriptionRes = orig.descriptionRes;
requestRes = orig.requestRes;
nonLocalizedDescription = orig.nonLocalizedDescription;
@@ -436,6 +452,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
dest.writeInt(protectionLevel);
dest.writeInt(flags);
dest.writeString(group);
+ dest.writeString(backgroundPermission);
dest.writeInt(descriptionRes);
dest.writeInt(requestRes);
TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags);
@@ -475,6 +492,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
protectionLevel = source.readInt();
flags = source.readInt();
group = source.readString();
+ backgroundPermission = source.readString();
descriptionRes = source.readInt();
requestRes = source.readInt();
nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 7adea6a880be..ef0dce3a2f64 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -642,8 +642,7 @@ public class Resources {
* tool. This integer encodes the package, type, and resource
* entry. The value 0 is an invalid identifier.
*
- * @return Resource dimension value multiplied by the appropriate
- * metric.
+ * @return Resource dimension value multiplied by the appropriate metric to convert to pixels.
*
* @throws NotFoundException Throws NotFoundException if the given ID does not exist.
*
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index 6adae25fc38d..a4b989a72492 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -189,7 +189,8 @@ public final class SQLiteDatabase extends SQLiteClosable {
*/
public static final int CONFLICT_NONE = 0;
- private static final String[] CONFLICT_VALUES = new String[]
+ /** {@hide} */
+ public static final String[] CONFLICT_VALUES = new String[]
{"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "};
/**
@@ -1748,7 +1749,8 @@ public final class SQLiteDatabase extends SQLiteClosable {
executeSql(sql, bindArgs);
}
- private int executeSql(String sql, Object[] bindArgs) throws SQLException {
+ /** {@hide} */
+ public int executeSql(String sql, Object[] bindArgs) throws SQLException {
acquireReference();
try {
final int statementType = DatabaseUtils.getSqlStatementType(sql);
diff --git a/core/java/android/database/sqlite/SQLiteDebug.java b/core/java/android/database/sqlite/SQLiteDebug.java
index a921aa34eb92..d39252130d4b 100644
--- a/core/java/android/database/sqlite/SQLiteDebug.java
+++ b/core/java/android/database/sqlite/SQLiteDebug.java
@@ -29,6 +29,7 @@ import java.util.ArrayList;
*
* {@hide}
*/
+@TestApi
public final class SQLiteDebug {
private static native void nativeGetPagerStats(PagerStats stats);
diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
index c6c676f81758..b52c76154f56 100644
--- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java
+++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java
@@ -16,17 +16,39 @@
package android.database.sqlite;
+import static android.content.ContentResolver.QUERY_ARG_SQL_GROUP_BY;
+import static android.content.ContentResolver.QUERY_ARG_SQL_HAVING;
+import static android.content.ContentResolver.QUERY_ARG_SQL_LIMIT;
+import static android.content.ContentResolver.QUERY_ARG_SQL_SELECTION;
+import static android.content.ContentResolver.QUERY_ARG_SQL_SELECTION_ARGS;
+import static android.content.ContentResolver.QUERY_ARG_SQL_SORT_ORDER;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.ContentValues;
import android.database.Cursor;
import android.database.DatabaseUtils;
+import android.os.Build;
+import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.OperationCanceledException;
import android.provider.BaseColumns;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.Log;
+import com.android.internal.util.ArrayUtils;
+
+import dalvik.system.VMRuntime;
+
+import libcore.util.EmptyArray;
+
+import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Objects;
import java.util.Set;
import java.util.regex.Pattern;
@@ -34,8 +56,7 @@ import java.util.regex.Pattern;
* This is a convenience class that helps build SQL queries to be sent to
* {@link SQLiteDatabase} objects.
*/
-public class SQLiteQueryBuilder
-{
+public class SQLiteQueryBuilder {
private static final String TAG = "SQLiteQueryBuilder";
private static final Pattern sLimitPattern =
Pattern.compile("\\s*\\d+\\s*(,\\s*\\d+\\s*)?");
@@ -43,6 +64,7 @@ public class SQLiteQueryBuilder
private Map<String, String> mProjectionMap = null;
private String mTables = "";
private StringBuilder mWhereClause = null; // lazily created
+ private String[] mWhereArgs = EmptyArray.STRING;
private boolean mDistinct;
private SQLiteDatabase.CursorFactory mFactory;
private boolean mStrict;
@@ -82,43 +104,131 @@ public class SQLiteQueryBuilder
mTables = inTables;
}
+ /** {@hide} */
+ public @Nullable String getWhere() {
+ return (mWhereClause != null) ? mWhereClause.toString() : null;
+ }
+
+ /** {@hide} */
+ public String[] getWhereArgs() {
+ return mWhereArgs;
+ }
+
+ /**
+ * Append a chunk to the {@code WHERE} clause of the query. All chunks
+ * appended are surrounded by parenthesis and {@code AND}ed with the
+ * selection passed to {@link #query}. The final {@code WHERE} clause looks
+ * like:
+ *
+ * <pre>
+ * WHERE (&lt;append chunk 1>&lt;append chunk2>) AND (&lt;query() selection parameter>)
+ * </pre>
+ *
+ * @param inWhere the chunk of text to append to the {@code WHERE} clause.
+ */
+ public void appendWhere(@NonNull CharSequence inWhere) {
+ appendWhere(inWhere, EmptyArray.STRING);
+ }
+
/**
- * Append a chunk to the WHERE clause of the query. All chunks appended are surrounded
- * by parenthesis and ANDed with the selection passed to {@link #query}. The final
- * WHERE clause looks like:
+ * Append a chunk to the {@code WHERE} clause of the query. All chunks
+ * appended are surrounded by parenthesis and {@code AND}ed with the
+ * selection passed to {@link #query}. The final {@code WHERE} clause looks
+ * like:
*
+ * <pre>
* WHERE (&lt;append chunk 1>&lt;append chunk2>) AND (&lt;query() selection parameter>)
+ * </pre>
*
- * @param inWhere the chunk of text to append to the WHERE clause.
+ * @param inWhere the chunk of text to append to the {@code WHERE} clause.
+ * @param inWhereArgs list of arguments to be bound to any '?' occurrences
+ * in the where clause.
*/
- public void appendWhere(CharSequence inWhere) {
+ public void appendWhere(@NonNull CharSequence inWhere, String... inWhereArgs) {
if (mWhereClause == null) {
mWhereClause = new StringBuilder(inWhere.length() + 16);
}
- if (mWhereClause.length() == 0) {
- mWhereClause.append('(');
- }
mWhereClause.append(inWhere);
+ mWhereArgs = ArrayUtils.concat(String.class, mWhereArgs, inWhereArgs);
}
/**
- * Append a chunk to the WHERE clause of the query. All chunks appended are surrounded
- * by parenthesis and ANDed with the selection passed to {@link #query}. The final
- * WHERE clause looks like:
+ * Append a standalone expression to the {@code WHERE} clause of this query.
+ * <p>
+ * This method differs from {@link #appendWhere(CharSequence)} in that it
+ * automatically appends {@code AND} to any existing {@code WHERE} clause
+ * already under construction before appending the given standalone
+ * expression.
*
- * WHERE (&lt;append chunk 1>&lt;append chunk2>) AND (&lt;query() selection parameter>)
+ * @param inWhere the standalone expression to append to the {@code WHERE}
+ * clause. It will be wrapped in parentheses when it's appended.
+ */
+ public void appendWhereExpression(@NonNull CharSequence inWhere) {
+ appendWhereExpression(inWhere, EmptyArray.STRING);
+ }
+
+ /**
+ * Append a standalone expression to the {@code WHERE} clause of this query.
+ * <p>
+ * This method differs from {@link #appendWhere(CharSequence)} in that it
+ * automatically appends {@code AND} to any existing {@code WHERE} clause
+ * already under construction before appending the given standalone
+ * expression.
*
- * @param inWhere the chunk of text to append to the WHERE clause. it will be escaped
- * to avoid SQL injection attacks
+ * @param inWhere the standalone expression to append to the {@code WHERE}
+ * clause. It will be wrapped in parentheses when it's appended.
+ * @param inWhereArgs list of arguments to be bound to any '?' occurrences
+ * in the standalone expression.
*/
- public void appendWhereEscapeString(String inWhere) {
+ public void appendWhereExpression(@NonNull CharSequence inWhere, String... inWhereArgs) {
if (mWhereClause == null) {
mWhereClause = new StringBuilder(inWhere.length() + 16);
}
- if (mWhereClause.length() == 0) {
- mWhereClause.append('(');
+ if (mWhereClause.length() > 0) {
+ mWhereClause.append(" AND ");
+ }
+ mWhereClause.append('(').append(inWhere).append(')');
+ mWhereArgs = ArrayUtils.concat(String.class, mWhereArgs, inWhereArgs);
+ }
+
+ /**
+ * Append a chunk to the {@code WHERE} clause of the query. All chunks
+ * appended are surrounded by parenthesis and {@code AND}ed with the
+ * selection passed to {@link #query}. The final {@code WHERE} clause looks
+ * like this:
+ *
+ * <pre>
+ * WHERE (&lt;append chunk 1>&lt;append chunk2>) AND (&lt;query() selection parameter>)
+ * </pre>
+ *
+ * @param inWhere the chunk of text to append to the {@code WHERE} clause.
+ * It will be escaped to avoid SQL injection attacks.
+ */
+ public void appendWhereEscapeString(@NonNull String inWhere) {
+ appendWhereEscapeString(inWhere, EmptyArray.STRING);
+ }
+
+ /**
+ * Append a chunk to the {@code WHERE} clause of the query. All chunks
+ * appended are surrounded by parenthesis and {@code AND}ed with the
+ * selection passed to {@link #query}. The final {@code WHERE} clause looks
+ * like this:
+ *
+ * <pre>
+ * WHERE (&lt;append chunk 1>&lt;append chunk2>) AND (&lt;query() selection parameter>)
+ * </pre>
+ *
+ * @param inWhere the chunk of text to append to the {@code WHERE} clause.
+ * It will be escaped to avoid SQL injection attacks.
+ * @param inWhereArgs list of arguments to be bound to any '?' occurrences
+ * in the where clause.
+ */
+ public void appendWhereEscapeString(@NonNull String inWhere, String... inWhereArgs) {
+ if (mWhereClause == null) {
+ mWhereClause = new StringBuilder(inWhere.length() + 16);
}
DatabaseUtils.appendEscapedSQLString(mWhereClause, inWhere);
+ mWhereArgs = ArrayUtils.concat(String.class, mWhereArgs, inWhereArgs);
}
/**
@@ -168,8 +278,8 @@ public class SQLiteQueryBuilder
* </ul>
* By default, this value is false.
*/
- public void setStrict(boolean flag) {
- mStrict = flag;
+ public void setStrict(boolean strict) {
+ mStrict = strict;
}
/**
@@ -263,7 +373,7 @@ public class SQLiteQueryBuilder
* information passed into this method.
*
* @param db the database to query on
- * @param projectionIn A list of which columns to return. Passing
+ * @param projection A list of which columns to return. Passing
* null will return all columns, which is discouraged to prevent
* reading data from storage that isn't going to be used.
* @param selection A filter declaring which rows to return,
@@ -288,10 +398,14 @@ public class SQLiteQueryBuilder
* @see android.content.ContentResolver#query(android.net.Uri, String[],
* String, String[], String)
*/
- public Cursor query(SQLiteDatabase db, String[] projectionIn,
- String selection, String[] selectionArgs, String groupBy,
- String having, String sortOrder) {
- return query(db, projectionIn, selection, selectionArgs, groupBy, having, sortOrder,
+ public @Nullable Cursor query(@NonNull SQLiteDatabase db,
+ @Nullable String[] projection,
+ @Nullable String selection,
+ @Nullable String[] selectionArgs,
+ @Nullable String groupBy,
+ @Nullable String having,
+ @Nullable String sortOrder) {
+ return query(db, projection, selection, selectionArgs, groupBy, having, sortOrder,
null /* limit */, null /* cancellationSignal */);
}
@@ -300,7 +414,7 @@ public class SQLiteQueryBuilder
* information passed into this method.
*
* @param db the database to query on
- * @param projectionIn A list of which columns to return. Passing
+ * @param projection A list of which columns to return. Passing
* null will return all columns, which is discouraged to prevent
* reading data from storage that isn't going to be used.
* @param selection A filter declaring which rows to return,
@@ -327,10 +441,15 @@ public class SQLiteQueryBuilder
* @see android.content.ContentResolver#query(android.net.Uri, String[],
* String, String[], String)
*/
- public Cursor query(SQLiteDatabase db, String[] projectionIn,
- String selection, String[] selectionArgs, String groupBy,
- String having, String sortOrder, String limit) {
- return query(db, projectionIn, selection, selectionArgs,
+ public @Nullable Cursor query(@NonNull SQLiteDatabase db,
+ @Nullable String[] projection,
+ @Nullable String selection,
+ @Nullable String[] selectionArgs,
+ @Nullable String groupBy,
+ @Nullable String having,
+ @Nullable String sortOrder,
+ @Nullable String limit) {
+ return query(db, projection, selection, selectionArgs,
groupBy, having, sortOrder, limit, null);
}
@@ -339,7 +458,42 @@ public class SQLiteQueryBuilder
* information passed into this method.
*
* @param db the database to query on
- * @param projectionIn A list of which columns to return. Passing
+ * @param projection A list of which columns to return. Passing
+ * null will return all columns, which is discouraged to prevent
+ * reading data from storage that isn't going to be used.
+ * @param selection A filter declaring which rows to return,
+ * formatted as an SQL WHERE clause (excluding the WHERE
+ * itself). Passing null will return all rows for the given URL.
+ * @param selectionArgs You may include ?s in selection, which
+ * will be replaced by the values from selectionArgs, in order
+ * that they appear in the selection. The values will be bound
+ * as Strings.
+ * @param sortOrder How to order the rows, formatted as an SQL
+ * ORDER BY clause (excluding the ORDER BY itself). Passing null
+ * will use the default sort order, which may be unordered.
+ * @param cancellationSignal A signal to cancel the operation in progress, or null if none.
+ * If the operation is canceled, then {@link OperationCanceledException} will be thrown
+ * when the query is executed.
+ * @return a cursor over the result set
+ * @see android.content.ContentResolver#query(android.net.Uri, String[],
+ * String, String[], String)
+ */
+ public @Nullable Cursor query(@NonNull SQLiteDatabase db,
+ @Nullable String[] projection,
+ @Nullable String selection,
+ @Nullable String[] selectionArgs,
+ @Nullable String sortOrder,
+ @Nullable CancellationSignal cancellationSignal) {
+ return query(db, projection, selection, selectionArgs, null, null, sortOrder, null,
+ cancellationSignal);
+ }
+
+ /**
+ * Perform a query by combining all current settings and the
+ * information passed into this method.
+ *
+ * @param db the database to query on
+ * @param projection A list of which columns to return. Passing
* null will return all columns, which is discouraged to prevent
* reading data from storage that isn't going to be used.
* @param selection A filter declaring which rows to return,
@@ -369,14 +523,69 @@ public class SQLiteQueryBuilder
* @see android.content.ContentResolver#query(android.net.Uri, String[],
* String, String[], String)
*/
- public Cursor query(SQLiteDatabase db, String[] projectionIn,
- String selection, String[] selectionArgs, String groupBy,
- String having, String sortOrder, String limit, CancellationSignal cancellationSignal) {
- if (mTables == null) {
+ public @Nullable Cursor query(@NonNull SQLiteDatabase db,
+ @Nullable String[] projection,
+ @Nullable String selection,
+ @Nullable String[] selectionArgs,
+ @Nullable String groupBy,
+ @Nullable String having,
+ @Nullable String sortOrder,
+ @Nullable String limit,
+ @Nullable CancellationSignal cancellationSignal) {
+ final Bundle queryArgs = new Bundle();
+ maybePutString(queryArgs, QUERY_ARG_SQL_SELECTION, selection);
+ maybePutStringArray(queryArgs, QUERY_ARG_SQL_SELECTION_ARGS, selectionArgs);
+ maybePutString(queryArgs, QUERY_ARG_SQL_GROUP_BY, groupBy);
+ maybePutString(queryArgs, QUERY_ARG_SQL_HAVING, having);
+ maybePutString(queryArgs, QUERY_ARG_SQL_SORT_ORDER, sortOrder);
+ maybePutString(queryArgs, QUERY_ARG_SQL_LIMIT, limit);
+ return query(db, projection, queryArgs, cancellationSignal);
+ }
+
+ /**
+ * Perform a query by combining all current settings and the information
+ * passed into this method.
+ *
+ * @param db the database to query on
+ * @param projection A list of which columns to return. Passing null will
+ * return all columns, which is discouraged to prevent reading
+ * data from storage that isn't going to be used.
+ * @param queryArgs A collection of arguments for the query, defined using
+ * keys such as {@link ContentResolver#QUERY_ARG_SQL_SELECTION}
+ * and {@link ContentResolver#QUERY_ARG_SQL_SELECTION_ARGS}.
+ * @param cancellationSignal A signal to cancel the operation in progress,
+ * or null if none. If the operation is canceled, then
+ * {@link OperationCanceledException} will be thrown when the
+ * query is executed.
+ * @return a cursor over the result set
+ */
+ public Cursor query(@NonNull SQLiteDatabase db,
+ @Nullable String[] projection,
+ @Nullable Bundle queryArgs,
+ @Nullable CancellationSignal cancellationSignal) {
+ Objects.requireNonNull(db, "No database defined");
+
+ if (VMRuntime.getRuntime().getTargetSdkVersion() >= Build.VERSION_CODES.Q) {
+ Objects.requireNonNull(mTables, "No tables defined");
+ } else if (mTables == null) {
return null;
}
- if (mStrict && selection != null && selection.length() > 0) {
+ if (queryArgs == null) {
+ queryArgs = Bundle.EMPTY;
+ }
+
+ // Final SQL that we will execute
+ final String sql;
+
+ final String unwrappedSql = buildQuery(projection,
+ queryArgs.getString(QUERY_ARG_SQL_SELECTION),
+ queryArgs.getString(QUERY_ARG_SQL_GROUP_BY),
+ queryArgs.getString(QUERY_ARG_SQL_HAVING),
+ queryArgs.getString(QUERY_ARG_SQL_SORT_ORDER),
+ queryArgs.getString(QUERY_ARG_SQL_LIMIT));
+
+ if (mStrict) {
// Validate the user-supplied selection to detect syntactic anomalies
// in the selection string that could indicate a SQL injection attempt.
// The idea is to ensure that the selection clause is a valid SQL expression
@@ -384,25 +593,136 @@ public class SQLiteQueryBuilder
// originally specified. An attacker cannot create an expression that
// would escape the SQL expression while maintaining balanced parentheses
// in both the wrapped and original forms.
- String sqlForValidation = buildQuery(projectionIn, "(" + selection + ")", groupBy,
- having, sortOrder, limit);
- db.validateSql(sqlForValidation, cancellationSignal); // will throw if query is invalid
+
+ // NOTE: The ordering of the below operations is important; we must
+ // execute the wrapped query to ensure the untrusted clause has been
+ // fully isolated.
+
+ // TODO: decode SORT ORDER and LIMIT clauses, since they can contain
+ // "expr" inside that need to be validated
+
+ final String wrappedSql = buildQuery(projection,
+ wrap(queryArgs.getString(QUERY_ARG_SQL_SELECTION)),
+ queryArgs.getString(QUERY_ARG_SQL_GROUP_BY),
+ queryArgs.getString(QUERY_ARG_SQL_HAVING),
+ queryArgs.getString(QUERY_ARG_SQL_SORT_ORDER),
+ queryArgs.getString(QUERY_ARG_SQL_LIMIT));
+
+ // Validate the unwrapped query
+ db.validateSql(unwrappedSql, cancellationSignal);
+
+ // Execute wrapped query for extra protection
+ sql = wrappedSql;
+ } else {
+ // Execute unwrapped query
+ sql = unwrappedSql;
}
- String sql = buildQuery(
- projectionIn, selection, groupBy, having,
- sortOrder, limit);
+ final String[] sqlArgs = ArrayUtils.concat(String.class,
+ queryArgs.getStringArray(QUERY_ARG_SQL_SELECTION_ARGS), mWhereArgs);
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "Performing query: " + sql);
+ if (Build.IS_DEBUGGABLE && Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, sql + " with args " + Arrays.toString(sqlArgs));
}
+
return db.rawQueryWithFactory(
- mFactory, sql, selectionArgs,
+ mFactory, sql, sqlArgs,
SQLiteDatabase.findEditTable(mTables),
cancellationSignal); // will throw if query is invalid
}
/**
+ * Perform an update by combining all current settings and the
+ * information passed into this method.
+ *
+ * @param db the database to update on
+ * @param selection A filter declaring which rows to return,
+ * formatted as an SQL WHERE clause (excluding the WHERE
+ * itself). Passing null will return all rows for the given URL.
+ * @param selectionArgs You may include ?s in selection, which
+ * will be replaced by the values from selectionArgs, in order
+ * that they appear in the selection. The values will be bound
+ * as Strings.
+ * @return the number of rows updated
+ */
+ public int update(@NonNull SQLiteDatabase db, @NonNull ContentValues values,
+ @Nullable String selection, @Nullable String[] selectionArgs) {
+ Objects.requireNonNull(mTables, "No tables defined");
+ Objects.requireNonNull(db, "No database defined");
+ Objects.requireNonNull(values, "No values defined");
+
+ if (mStrict) {
+ // Validate the user-supplied selection to detect syntactic anomalies
+ // in the selection string that could indicate a SQL injection attempt.
+ // The idea is to ensure that the selection clause is a valid SQL expression
+ // by compiling it twice: once wrapped in parentheses and once as
+ // originally specified. An attacker cannot create an expression that
+ // would escape the SQL expression while maintaining balanced parentheses
+ // in both the wrapped and original forms.
+ final String sql = buildUpdate(values, wrap(selection));
+ db.validateSql(sql, null); // will throw if query is invalid
+ }
+
+ final ArrayMap<String, Object> rawValues = values.getValues();
+ final String[] updateArgs = new String[rawValues.size()];
+ for (int i = 0; i < updateArgs.length; i++) {
+ final Object arg = rawValues.valueAt(i);
+ updateArgs[i] = (arg != null) ? arg.toString() : null;
+ }
+
+ final String sql = buildUpdate(values, selection);
+ final String[] sqlArgs = ArrayUtils.concat(String.class, updateArgs,
+ ArrayUtils.concat(String.class, selectionArgs, mWhereArgs));
+
+ if (Build.IS_DEBUGGABLE && Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, sql + " with args " + Arrays.toString(sqlArgs));
+ }
+
+ return db.executeSql(sql, sqlArgs);
+ }
+
+ /**
+ * Perform a delete by combining all current settings and the
+ * information passed into this method.
+ *
+ * @param db the database to delete on
+ * @param selection A filter declaring which rows to return,
+ * formatted as an SQL WHERE clause (excluding the WHERE
+ * itself). Passing null will return all rows for the given URL.
+ * @param selectionArgs You may include ?s in selection, which
+ * will be replaced by the values from selectionArgs, in order
+ * that they appear in the selection. The values will be bound
+ * as Strings.
+ * @return the number of rows deleted
+ */
+ public int delete(@NonNull SQLiteDatabase db, @Nullable String selection,
+ @Nullable String[] selectionArgs) {
+ Objects.requireNonNull(mTables, "No tables defined");
+ Objects.requireNonNull(db, "No database defined");
+
+ if (mStrict) {
+ // Validate the user-supplied selection to detect syntactic anomalies
+ // in the selection string that could indicate a SQL injection attempt.
+ // The idea is to ensure that the selection clause is a valid SQL expression
+ // by compiling it twice: once wrapped in parentheses and once as
+ // originally specified. An attacker cannot create an expression that
+ // would escape the SQL expression while maintaining balanced parentheses
+ // in both the wrapped and original forms.
+ final String sql = buildDelete(wrap(selection));
+ db.validateSql(sql, null); // will throw if query is invalid
+ }
+
+ final String sql = buildDelete(selection);
+ final String[] sqlArgs = ArrayUtils.concat(String.class, selectionArgs, mWhereArgs);
+
+ if (Build.IS_DEBUGGABLE && Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, sql + " with args " + Arrays.toString(sqlArgs));
+ }
+
+ return db.executeSql(sql, sqlArgs);
+ }
+
+ /**
* Construct a SELECT statement suitable for use in a group of
* SELECT statements that will be joined through UNION operators
* in buildUnionQuery.
@@ -434,28 +754,10 @@ public class SQLiteQueryBuilder
String[] projectionIn, String selection, String groupBy,
String having, String sortOrder, String limit) {
String[] projection = computeProjection(projectionIn);
-
- StringBuilder where = new StringBuilder();
- boolean hasBaseWhereClause = mWhereClause != null && mWhereClause.length() > 0;
-
- if (hasBaseWhereClause) {
- where.append(mWhereClause.toString());
- where.append(')');
- }
-
- // Tack on the user's selection, if present.
- if (selection != null && selection.length() > 0) {
- if (hasBaseWhereClause) {
- where.append(" AND ");
- }
-
- where.append('(');
- where.append(selection);
- where.append(')');
- }
+ String where = computeWhere(selection);
return buildQueryString(
- mDistinct, mTables, projection, where.toString(),
+ mDistinct, mTables, projection, where,
groupBy, having, sortOrder, limit);
}
@@ -472,6 +774,42 @@ public class SQLiteQueryBuilder
return buildQuery(projectionIn, selection, groupBy, having, sortOrder, limit);
}
+ /** {@hide} */
+ public String buildUpdate(ContentValues values, String selection) {
+ if (values == null || values.isEmpty()) {
+ throw new IllegalArgumentException("Empty values");
+ }
+
+ StringBuilder sql = new StringBuilder(120);
+ sql.append("UPDATE ");
+ sql.append(mTables);
+ sql.append(" SET ");
+
+ final ArrayMap<String, Object> rawValues = values.getValues();
+ for (int i = 0; i < rawValues.size(); i++) {
+ if (i > 0) {
+ sql.append(',');
+ }
+ sql.append(rawValues.keyAt(i));
+ sql.append("=?");
+ }
+
+ final String where = computeWhere(selection);
+ appendClause(sql, " WHERE ", where);
+ return sql.toString();
+ }
+
+ /** {@hide} */
+ public String buildDelete(String selection) {
+ StringBuilder sql = new StringBuilder(120);
+ sql.append("DELETE FROM ");
+ sql.append(mTables);
+
+ final String where = computeWhere(selection);
+ appendClause(sql, " WHERE ", where);
+ return sql.toString();
+ }
+
/**
* Construct a SELECT statement suitable for use in a group of
* SELECT statements that will be joined through UNION operators
@@ -596,7 +934,7 @@ public class SQLiteQueryBuilder
return query.toString();
}
- private String[] computeProjection(String[] projectionIn) {
+ private @Nullable String[] computeProjection(@Nullable String[] projectionIn) {
if (projectionIn != null && projectionIn.length > 0) {
if (mProjectionMap != null) {
String[] projection = new String[projectionIn.length];
@@ -619,7 +957,7 @@ public class SQLiteQueryBuilder
}
throw new IllegalArgumentException("Invalid column "
- + projectionIn[i]);
+ + projectionIn[i] + " from tables " + mTables);
}
return projection;
} else {
@@ -645,4 +983,53 @@ public class SQLiteQueryBuilder
}
return null;
}
+
+ private @NonNull String computeWhere(@Nullable String selection) {
+ final boolean hasUser = selection != null && selection.length() > 0;
+ final boolean hasInternal = mWhereClause != null && mWhereClause.length() > 0;
+
+ if (hasUser || hasInternal) {
+ final StringBuilder where = new StringBuilder();
+ if (hasUser) {
+ where.append('(').append(selection).append(')');
+ }
+ if (hasUser && hasInternal) {
+ where.append(" AND ");
+ }
+ if (hasInternal) {
+ where.append('(').append(mWhereClause.toString()).append(')');
+ }
+ return where.toString();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Wrap given argument in parenthesis, unless it's {@code null} or
+ * {@code ()}, in which case return it verbatim.
+ */
+ private @Nullable String wrap(@Nullable String arg) {
+ if (arg == null) {
+ return null;
+ } else if (arg.equals("")) {
+ return arg;
+ } else {
+ return "(" + arg + ")";
+ }
+ }
+
+ private static void maybePutString(@NonNull Bundle bundle, @NonNull String key,
+ @Nullable String value) {
+ if (value != null) {
+ bundle.putString(key, value);
+ }
+ }
+
+ private static void maybePutStringArray(@NonNull Bundle bundle, @NonNull String key,
+ @Nullable String[] value) {
+ if (value != null) {
+ bundle.putStringArray(key, value);
+ }
+ }
}
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 3d442a21388e..bbe68abbbc7d 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -650,9 +650,7 @@ public class Camera {
/**
* An empty Camera for testing purpose.
*/
- Camera() {
- initAppOps();
- }
+ Camera() {}
private void initAppOps() {
IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE);
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index 35aaf78bc3c2..cbddc9167111 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -902,7 +902,6 @@ public abstract class SensorManager {
* @throws NullPointerException when mem is null.
* @throws UncheckedIOException if not able to create channel.
* @see SensorDirectChannel#close()
- * @see #configureDirectChannel(SensorDirectChannel, Sensor, int)
*/
public SensorDirectChannel createDirectChannel(MemoryFile mem) {
return createDirectChannelImpl(mem, null);
@@ -925,7 +924,6 @@ public abstract class SensorManager {
* @throws NullPointerException when mem is null.
* @throws UncheckedIOException if not able to create channel.
* @see SensorDirectChannel#close()
- * @see #configureDirectChannel(SensorDirectChannel, Sensor, int)
*/
public SensorDirectChannel createDirectChannel(HardwareBuffer mem) {
return createDirectChannelImpl(null, mem);
@@ -983,7 +981,7 @@ public abstract class SensorManager {
* {@link android.hardware.SensorManager.DynamicSensorCallback
* DynamicSensorCallback}
* interface for receiving callbacks.
- * @see #addDynamicSensorCallback(DynamicSensorCallback, Handler)
+ * @see #registerDynamicSensorCallback(DynamicSensorCallback, Handler)
*
* @throws IllegalArgumentException when callback is null.
*/
diff --git a/core/java/android/hardware/biometrics/BiometricAuthenticator.java b/core/java/android/hardware/biometrics/BiometricAuthenticator.java
index c811999ce304..e7c5116e5f6c 100644
--- a/core/java/android/hardware/biometrics/BiometricAuthenticator.java
+++ b/core/java/android/hardware/biometrics/BiometricAuthenticator.java
@@ -33,7 +33,50 @@ public interface BiometricAuthenticator {
* Container for biometric data
* @hide
*/
- abstract class BiometricIdentifier implements Parcelable {}
+ abstract class Identifier implements Parcelable {
+ private CharSequence mName;
+ private int mBiometricId;
+ private long mDeviceId; // physical device this is associated with
+
+ public Identifier() {}
+
+ public Identifier(CharSequence name, int biometricId, long deviceId) {
+ mName = name;
+ mBiometricId = biometricId;
+ mDeviceId = deviceId;
+ }
+
+ /**
+ * Gets the human-readable name for the given biometric.
+ * @return name given to the biometric
+ */
+ public CharSequence getName() {
+ return mName;
+ }
+
+ /**
+ * Gets the device-specific biometric id. Used by Settings to map a name to a specific
+ * biometric template.
+ */
+ public int getBiometricId() {
+ return mBiometricId;
+ }
+
+ /**
+ * Device this biometric belongs to.
+ */
+ public long getDeviceId() {
+ return mDeviceId;
+ }
+
+ public void setName(CharSequence name) {
+ mName = name;
+ }
+
+ public void setDeviceId(long deviceId) {
+ mDeviceId = deviceId;
+ }
+ }
/**
* Container for callback data from {@link BiometricAuthenticator#authenticate(
@@ -42,7 +85,7 @@ public interface BiometricAuthenticator {
* AuthenticationCallback)}
*/
class AuthenticationResult {
- private BiometricIdentifier mIdentifier;
+ private Identifier mIdentifier;
private CryptoObject mCryptoObject;
private int mUserId;
@@ -58,7 +101,7 @@ public interface BiometricAuthenticator {
* @param userId
* @hide
*/
- public AuthenticationResult(CryptoObject crypto, BiometricIdentifier identifier,
+ public AuthenticationResult(CryptoObject crypto, Identifier identifier,
int userId) {
mCryptoObject = crypto;
mIdentifier = identifier;
@@ -80,7 +123,7 @@ public interface BiometricAuthenticator {
* operations.
* @hide
*/
- public BiometricIdentifier getId() {
+ public Identifier getId() {
return mIdentifier;
}
diff --git a/core/java/android/hardware/biometrics/BiometricFaceConstants.java b/core/java/android/hardware/biometrics/BiometricFaceConstants.java
new file mode 100644
index 000000000000..008601c78e46
--- /dev/null
+++ b/core/java/android/hardware/biometrics/BiometricFaceConstants.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.biometrics;
+
+import android.hardware.face.FaceManager;
+
+/**
+ * Interface containing all of the face-specific constants.
+ * @hide
+ */
+public interface BiometricFaceConstants {
+ //
+ // Error messages from face authentication hardware during initialization, enrollment,
+ // authentication or removal. Must agree with the list in HAL h file
+ //
+ /**
+ * The hardware is unavailable. Try again later.
+ */
+ public static final int FACE_ERROR_HW_UNAVAILABLE = 1;
+ /**
+ * Error state returned when the sensor was unable to process the current image.
+ */
+ public static final int FACE_ERROR_UNABLE_TO_PROCESS = 2;
+ /**
+ * Error state returned when the current request has been running too long. This is intended to
+ * prevent programs from waiting for the face authentication sensor indefinitely. The timeout is
+ * platform and sensor-specific, but is generally on the order of 30 seconds.
+ */
+ public static final int FACE_ERROR_TIMEOUT = 3;
+ /**
+ * Error state returned for operations like enrollment; the operation cannot be completed
+ * because there's not enough storage remaining to complete the operation.
+ */
+ public static final int FACE_ERROR_NO_SPACE = 4;
+ /**
+ * The operation was canceled because the face authentication sensor is unavailable. For
+ * example, this may happen when the user is switched, the device is locked or another pending
+ * operation prevents or disables it.
+ */
+ public static final int FACE_ERROR_CANCELED = 5;
+ /**
+ * The {@link FaceManager#remove} call failed. Typically this will happen when the
+ * provided face id was incorrect.
+ *
+ * @hide
+ */
+ public static final int FACE_ERROR_UNABLE_TO_REMOVE = 6;
+ /**
+ * The operation was canceled because the API is locked out due to too many attempts.
+ * This occurs after 5 failed attempts, and lasts for 30 seconds.
+ */
+ public static final int FACE_ERROR_LOCKOUT = 7;
+ /**
+ * Hardware vendors may extend this list if there are conditions that do not fall under one of
+ * the above categories. Vendors are responsible for providing error strings for these errors.
+ * These messages are typically reserved for internal operations such as enrollment, but may be
+ * used to express vendor errors not covered by the ones in HAL h file. Applications are
+ * expected to show the error message string if they happen, but are advised not to rely on the
+ * message id since they will be device and vendor-specific
+ */
+ public static final int FACE_ERROR_VENDOR = 8;
+
+ /**
+ * The operation was canceled because FACE_ERROR_LOCKOUT occurred too many times.
+ * Face authentication is disabled until the user unlocks with strong authentication
+ * (PIN/Pattern/Password)
+ */
+ public static final int FACE_ERROR_LOCKOUT_PERMANENT = 9;
+ /**
+ * The user canceled the operation. Upon receiving this, applications should use alternate
+ * authentication (e.g. a password). The application should also provide the means to return
+ * to face authentication, such as a "use face authentication" button.
+ */
+ public static final int FACE_ERROR_USER_CANCELED = 10;
+ /**
+ * The user does not have a face enrolled.
+ */
+ public static final int FACE_ERROR_NOT_ENROLLED = 11;
+ /**
+ * The device does not have a face sensor. This message will propagate if the calling app
+ * ignores the result from PackageManager.hasFeature(FEATURE_FACE) and calls
+ * this API anyway. Apps should always check for the feature before calling this API.
+ */
+ public static final int FACE_ERROR_HW_NOT_PRESENT = 12;
+ /**
+ * @hide
+ */
+ public static final int FACE_ERROR_VENDOR_BASE = 1000;
+
+ //
+ // Image acquisition messages. These will not be sent to the user, since they conflict with
+ // existing constants. These must agree with face@1.0/types.hal.
+ //
+
+ /**
+ * The image acquired was good.
+ */
+ public static final int FACE_ACQUIRED_GOOD = 0;
+
+ /**
+ * The face image was not good enough to process due to a detected condition.
+ * (See {@link #FACE_ACQUIRED_TOO_BRIGHT or @link #FACE_ACQUIRED_TOO_DARK}).
+ */
+ public static final int FACE_ACQUIRED_INSUFFICIENT = 1;
+
+ /**
+ * The face image was too bright due to too much ambient light.
+ * For example, it's reasonable to return this after multiple
+ * {@link #FACE_ACQUIRED_INSUFFICIENT}
+ * The user is expected to take action to retry in better lighting conditions
+ * when this is returned.
+ */
+ public static final int FACE_ACQUIRED_TOO_BRIGHT = 2;
+
+ /**
+ * The face image was too dark due to illumination light obscured.
+ * For example, it's reasonable to return this after multiple
+ * {@link #FACE_ACQUIRED_INSUFFICIENT}
+ * The user is expected to take action to retry in better lighting conditions
+ * when this is returned.
+ */
+ public static final int FACE_ACQUIRED_TOO_DARK = 3;
+
+ /**
+ * The detected face is too close to the sensor, and the image can't be processed.
+ * The user should be informed to move farther from the sensor when this is returned.
+ */
+ public static final int FACE_ACQUIRED_TOO_CLOSE = 4;
+
+ /**
+ * The detected face is too small, as the user might be too far from the sensor.
+ * The user should be informed to move closer to the sensor when this is returned.
+ */
+ public static final int FACE_ACQUIRED_TOO_FAR = 5;
+
+ /**
+ * Only the upper part of the face was detected. The sensor field of view is too high.
+ * The user should be informed to move up with respect to the sensor when this is returned.
+ */
+ public static final int FACE_ACQUIRED_TOO_HIGH = 6;
+
+ /**
+ * Only the lower part of the face was detected. The sensor field of view is too low.
+ * The user should be informed to move down with respect to the sensor when this is returned.
+ */
+ public static final int FACE_ACQUIRED_TOO_LOW = 7;
+
+ /**
+ * Only the right part of the face was detected. The sensor field of view is too far right.
+ * The user should be informed to move to the right with respect to the sensor
+ * when this is returned.
+ */
+ public static final int FACE_ACQUIRED_TOO_RIGHT = 8;
+
+ /**
+ * Only the left part of the face was detected. The sensor field of view is too far left.
+ * The user should be informed to move to the left with respect to the sensor
+ * when this is returned.
+ */
+ public static final int FACE_ACQUIRED_TOO_LEFT = 9;
+
+ /**
+ * The user's eyes have strayed away from the sensor. If this message is sent, the user should
+ * be informed to look at the device. If the user can't be found in the frame, one of the other
+ * acquisition messages should be sent, e.g. FACE_ACQUIRED_NOT_DETECTED.
+ */
+ public static final int FACE_ACQUIRED_POOR_GAZE = 10;
+
+ /**
+ * No face was detected in front of the sensor.
+ * The user should be informed to point the sensor to a face when this is returned.
+ */
+ public static final int FACE_ACQUIRED_NOT_DETECTED = 11;
+
+ /**
+ * Too much motion was detected.
+ * The user should be informed to keep their face steady relative to the
+ * sensor.
+ */
+ public static final int FACE_ACQUIRED_TOO_MUCH_MOTION = 12;
+
+ /**
+ * The sensor needs to be re-calibrated. This is an unexpected condition, and should only be
+ * sent if a serious, uncorrectable, and unrecoverable calibration issue is detected which
+ * requires user intervention, e.g. re-enrolling. The expected response to this message is to
+ * direct the user to re-enroll.
+ */
+ public static final int FACE_ACQUIRED_RECALIBRATE = 13;
+
+ /**
+ * Hardware vendors may extend this list if there are conditions that do not fall under one of
+ * the above categories. Vendors are responsible for providing error strings for these errors.
+ *
+ * @hide
+ */
+ public static final int FACE_ACQUIRED_VENDOR = 13;
+ /**
+ * @hide
+ */
+ public static final int FACE_ACQUIRED_VENDOR_BASE = 1000;
+}
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index 1c9de457e951..bad418acc653 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -293,7 +293,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan
* @param userId
* @hide
*/
- public AuthenticationResult(CryptoObject crypto, BiometricIdentifier identifier,
+ public AuthenticationResult(CryptoObject crypto, Identifier identifier,
int userId) {
super(crypto, identifier, userId);
}
diff --git a/core/java/android/hardware/biometrics/BiometricSourceType.aidl b/core/java/android/hardware/biometrics/BiometricSourceType.aidl
new file mode 100644
index 000000000000..15440d8bccdf
--- /dev/null
+++ b/core/java/android/hardware/biometrics/BiometricSourceType.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.biometrics;
+
+/**
+ * @hide
+ */
+parcelable BiometricSourceType; \ No newline at end of file
diff --git a/core/java/android/hardware/biometrics/BiometricSourceType.java b/core/java/android/hardware/biometrics/BiometricSourceType.java
new file mode 100644
index 000000000000..4a08cf2cbfc5
--- /dev/null
+++ b/core/java/android/hardware/biometrics/BiometricSourceType.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.biometrics;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * @hide
+ */
+public enum BiometricSourceType implements Parcelable {
+ FINGERPRINT,
+ FACE,
+ IRIS;
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(name());
+ }
+
+ public static final Creator<BiometricSourceType> CREATOR = new Creator<BiometricSourceType>() {
+ @Override
+ public BiometricSourceType createFromParcel(final Parcel source) {
+ return BiometricSourceType.valueOf(source.readString());
+ }
+
+ @Override
+ public BiometricSourceType[] newArray(final int size) {
+ return new BiometricSourceType[size];
+ }
+ };
+}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl b/core/java/android/hardware/biometrics/IBiometricServiceLockoutResetCallback.aidl
index 971e14c7251f..ee033bfa0a8b 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricServiceLockoutResetCallback.aidl
@@ -13,18 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package android.hardware.fingerprint;
+package android.hardware.biometrics;
-import android.hardware.fingerprint.Fingerprint;
-import android.os.Bundle;
import android.os.IRemoteCallback;
-import android.os.UserHandle;
/**
* Callback when lockout period expired and clients are allowed to authenticate again.
* @hide
*/
-oneway interface IFingerprintServiceLockoutResetCallback {
+oneway interface IBiometricServiceLockoutResetCallback {
/**
* A wakelock will be held until the reciever calls back into {@param callback}
diff --git a/core/java/android/hardware/camera2/CameraCaptureSession.java b/core/java/android/hardware/camera2/CameraCaptureSession.java
index eafe5938d38b..bc7ab476b01b 100644
--- a/core/java/android/hardware/camera2/CameraCaptureSession.java
+++ b/core/java/android/hardware/camera2/CameraCaptureSession.java
@@ -23,8 +23,8 @@ import android.hardware.camera2.params.OutputConfiguration;
import android.os.Handler;
import android.view.Surface;
-import java.util.concurrent.Executor;
import java.util.List;
+import java.util.concurrent.Executor;
/**
* A configured capture session for a {@link CameraDevice}, used for capturing images from the
@@ -745,7 +745,7 @@ public abstract class CameraCaptureSession implements AutoCloseable {
*
* @see #setRepeatingRequest
* @see #setRepeatingBurst
- * @see StateCallback#onIdle
+ * @see StateCallback#onReady
*/
public abstract void stopRepeating() throws CameraAccessException;
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 87c64cd12903..32c6898e8c00 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -2365,13 +2365,25 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion}, is defined relative to the active array rectangle given in
* this field, with <code>(0, 0)</code> being the top-left of this rectangle.</p>
* <p>The active array may be smaller than the full pixel array, since the full array may
- * include black calibration pixels or other inactive regions, and geometric correction
- * resulting in scaling or cropping may have been applied.</p>
+ * include black calibration pixels or other inactive regions.</p>
+ * <p>For devices that do not support {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the active
+ * array must be the same as {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.</p>
+ * <p>For devices that support {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the active array must
+ * be enclosed by {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}. The difference between
+ * pre-correction active array and active array accounts for scaling or cropping caused
+ * by lens geometric distortion correction.</p>
+ * <p>In general, application should always refer to active array size for controls like
+ * metering regions or crop region. Two exceptions are when the application is dealing with
+ * RAW image buffers (RAW_SENSOR, RAW10, RAW12 etc), or when application explicitly set
+ * {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} to OFF. In these cases, application should refer
+ * to {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.</p>
* <p><b>Units</b>: Pixel coordinates on the image sensor</p>
* <p>This key is available on all devices.</p>
*
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CaptureRequest#SCALER_CROP_REGION
* @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE =
@@ -2616,9 +2628,9 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <ol>
* <li>{@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion}.</li>
* </ol>
- * <p>If all of the geometric distortion fields are no-ops, this rectangle will be the same
- * as the post-distortion-corrected rectangle given in
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.</p>
+ * <p>If the camera device doesn't support geometric distortion correction, or all of the
+ * geometric distortion fields are no-ops, this rectangle will be the same as the
+ * post-distortion-corrected rectangle given in {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.</p>
* <p>This rectangle is defined relative to the full pixel array; (0,0) is the top-left of
* the full pixel array, and the size of the full pixel array is given by
* {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize}.</p>
diff --git a/core/java/android/hardware/camera2/CaptureFailure.java b/core/java/android/hardware/camera2/CaptureFailure.java
index fbe0839ddc37..cd2bc5f943e7 100644
--- a/core/java/android/hardware/camera2/CaptureFailure.java
+++ b/core/java/android/hardware/camera2/CaptureFailure.java
@@ -15,8 +15,8 @@
*/
package android.hardware.camera2;
-import android.annotation.NonNull;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -150,7 +150,7 @@ public class CaptureFailure {
*
* @return int The ID for the sequence of requests that this capture failure is the result of
*
- * @see CameraDevice.CaptureCallback#onCaptureSequenceCompleted
+ * @see CameraCaptureSession.CaptureCallback#onCaptureSequenceCompleted
*/
public int getSequenceId() {
return mSequenceId;
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 411a97e3eca4..aca77a5be47e 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -1269,11 +1269,26 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* Otherwise will always be present.</p>
* <p>The maximum number of regions supported by the device is determined by the value
* of {@link CameraCharacteristics#CONTROL_MAX_REGIONS_AE android.control.maxRegionsAe}.</p>
- * <p>The coordinate system is based on the active pixel array,
- * with (0,0) being the top-left pixel in the active pixel array, and
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with (0,0) being
+ * the top-left pixel in the active pixel array, and
* ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the
- * bottom-right pixel in the active pixel array.</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.height - 1) being the bottom-right
+ * pixel in the pre-correction active pixel array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
* <p>The weight must be within <code>[0, 1000]</code>, and represents a weight
* for every pixel in the area. This means that a large metering area
* with the same weight as a smaller area will have more effect in
@@ -1289,15 +1304,20 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* region and output only the intersection rectangle as the metering region in the result
* metadata. If the region is entirely outside the crop region, it will be ignored and
* not reported in the result metadata.</p>
- * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} depending on
+ * distortion correction capability and mode</p>
* <p><b>Range of valid values:</b><br>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
+ * depending on distortion correction capability and mode</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AE
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CaptureRequest#SCALER_CROP_REGION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS =
@@ -1443,11 +1463,26 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* Otherwise will always be present.</p>
* <p>The maximum number of focus areas supported by the device is determined by the value
* of {@link CameraCharacteristics#CONTROL_MAX_REGIONS_AF android.control.maxRegionsAf}.</p>
- * <p>The coordinate system is based on the active pixel array,
- * with (0,0) being the top-left pixel in the active pixel array, and
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with (0,0) being
+ * the top-left pixel in the active pixel array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.height - 1) being the bottom-right
+ * pixel in the pre-correction active pixel array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the active array, and
* ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the
- * bottom-right pixel in the active pixel array.</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
* <p>The weight must be within <code>[0, 1000]</code>, and represents a weight
* for every pixel in the area. This means that a large metering area
* with the same weight as a smaller area will have more effect in
@@ -1464,15 +1499,20 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* region and output only the intersection rectangle as the metering region in the result
* metadata. If the region is entirely outside the crop region, it will be ignored and
* not reported in the result metadata.</p>
- * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} depending on
+ * distortion correction capability and mode</p>
* <p><b>Range of valid values:</b><br>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
+ * depending on distortion correction capability and mode</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AF
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CaptureRequest#SCALER_CROP_REGION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS =
@@ -1612,11 +1652,26 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* Otherwise will always be present.</p>
* <p>The maximum number of regions supported by the device is determined by the value
* of {@link CameraCharacteristics#CONTROL_MAX_REGIONS_AWB android.control.maxRegionsAwb}.</p>
- * <p>The coordinate system is based on the active pixel array,
- * with (0,0) being the top-left pixel in the active pixel array, and
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with (0,0) being
+ * the top-left pixel in the active pixel array, and
* ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the
- * bottom-right pixel in the active pixel array.</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.height - 1) being the bottom-right
+ * pixel in the pre-correction active pixel array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
* <p>The weight must range from 0 to 1000, and represents a weight
* for every pixel in the area. This means that a large metering area
* with the same weight as a smaller area will have more effect in
@@ -1632,15 +1687,20 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* region and output only the intersection rectangle as the metering region in the result
* metadata. If the region is entirely outside the crop region, it will be ignored and
* not reported in the result metadata.</p>
- * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} depending on
+ * distortion correction capability and mode</p>
* <p><b>Range of valid values:</b><br>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
+ * depending on distortion correction capability and mode</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AWB
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CaptureRequest#SCALER_CROP_REGION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS =
@@ -2433,9 +2493,17 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
/**
* <p>The desired region of the sensor to read out for this capture.</p>
* <p>This control can be used to implement digital zoom.</p>
- * <p>The crop region coordinate system is based off
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with <code>(0, 0)</code> being the
- * top-left corner of the sensor active array.</p>
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with <code>(0, 0)</code> being
+ * the top-left pixel of the active array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the active array.</p>
* <p>Output streams use this rectangle to produce their output,
* cropping to a smaller region if necessary to maintain the
* stream's aspect ratio, then scaling the sensor input to
@@ -2454,20 +2522,30 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* outputs will crop horizontally (pillarbox), and 16:9
* streams will match exactly. These additional crops will
* be centered within the crop region.</p>
- * <p>The width and height of the crop region cannot
- * be set to be smaller than
+ * <p>If the coordinate system is android.sensor.info.activeArraysSize, the width and height
+ * of the crop region cannot be set to be smaller than
* <code>floor( activeArraySize.width / {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM android.scaler.availableMaxDigitalZoom} )</code> and
* <code>floor( activeArraySize.height / {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM android.scaler.availableMaxDigitalZoom} )</code>, respectively.</p>
+ * <p>If the coordinate system is {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, the width
+ * and height of the crop region cannot be set to be smaller than
+ * <code>floor( preCorrectionActiveArraySize.width / {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM android.scaler.availableMaxDigitalZoom} )</code>
+ * and
+ * <code>floor( preCorrectionActiveArraySize.height / {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM android.scaler.availableMaxDigitalZoom} )</code>,
+ * respectively.</p>
* <p>The camera device may adjust the crop region to account
* for rounding and other hardware requirements; the final
* crop region used will be included in the output capture
* result.</p>
* <p><b>Units</b>: Pixel coordinates relative to
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} depending on distortion correction
+ * capability and mode</p>
* <p>This key is available on all devices.</p>
*
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.graphics.Rect> SCALER_CROP_REGION =
@@ -3186,15 +3264,14 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* any correction at all would slow down capture rate. Every output stream will have a
* similar amount of enhancement applied.</p>
* <p>The correction only applies to processed outputs such as YUV, JPEG, or DEPTH16; it is not
- * applied to any RAW output. Metadata coordinates such as face rectangles or metering
+ * applied to any RAW output. Metadata coordinates such as face rectangles or metering
* regions are also not affected by correction.</p>
- * <p>Applications enabling distortion correction need to pay extra attention when converting
- * image coordinates between corrected output buffers and the sensor array. For example, if
- * the app supports tap-to-focus and enables correction, it then has to apply the distortion
- * model described in {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} to the image buffer tap coordinates to properly
- * calculate the tap position on the sensor active array to be used with
- * {@link CaptureRequest#CONTROL_AF_REGIONS android.control.afRegions}. The same applies in reverse to detected face rectangles if
- * they need to be drawn on top of the corrected output buffers.</p>
+ * <p>This control will be on by default on devices that support this control. Applications
+ * disabling distortion correction need to pay extra attention with the coordinate system of
+ * metering regions, crop region, and face rectangles. When distortion correction is OFF,
+ * metadata coordinates follow the coordinate system of
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}. When distortion is not OFF, metadata
+ * coordinates follow the coordinate system of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.</p>
* <p><b>Possible values:</b>
* <ul>
* <li>{@link #DISTORTION_CORRECTION_MODE_OFF OFF}</li>
@@ -3205,9 +3282,10 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>>
* {@link CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES android.distortionCorrection.availableModes}</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
- * @see CaptureRequest#CONTROL_AF_REGIONS
* @see CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES
* @see CameraCharacteristics#LENS_DISTORTION
+ * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
* @see #DISTORTION_CORRECTION_MODE_OFF
* @see #DISTORTION_CORRECTION_MODE_FAST
* @see #DISTORTION_CORRECTION_MODE_HIGH_QUALITY
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 6439338428ee..d003f9aaf16b 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -370,8 +370,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
*
* @return int The ID for the sequence of requests that this capture result is a part of
*
- * @see CameraDevice.CaptureCallback#onCaptureSequenceCompleted
- * @see CameraDevice.CaptureCallback#onCaptureSequenceAborted
+ * @see CameraCaptureSession.CaptureCallback#onCaptureSequenceCompleted
+ * @see CameraCaptureSession.CaptureCallback#onCaptureSequenceAborted
*/
public int getSequenceId() {
return mSequenceId;
@@ -730,11 +730,26 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Otherwise will always be present.</p>
* <p>The maximum number of regions supported by the device is determined by the value
* of {@link CameraCharacteristics#CONTROL_MAX_REGIONS_AE android.control.maxRegionsAe}.</p>
- * <p>The coordinate system is based on the active pixel array,
- * with (0,0) being the top-left pixel in the active pixel array, and
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with (0,0) being
+ * the top-left pixel in the active pixel array, and
* ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the
- * bottom-right pixel in the active pixel array.</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.height - 1) being the bottom-right
+ * pixel in the pre-correction active pixel array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
* <p>The weight must be within <code>[0, 1000]</code>, and represents a weight
* for every pixel in the area. This means that a large metering area
* with the same weight as a smaller area will have more effect in
@@ -750,15 +765,20 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* region and output only the intersection rectangle as the metering region in the result
* metadata. If the region is entirely outside the crop region, it will be ignored and
* not reported in the result metadata.</p>
- * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} depending on
+ * distortion correction capability and mode</p>
* <p><b>Range of valid values:</b><br>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
+ * depending on distortion correction capability and mode</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AE
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CaptureRequest#SCALER_CROP_REGION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS =
@@ -1152,11 +1172,26 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Otherwise will always be present.</p>
* <p>The maximum number of focus areas supported by the device is determined by the value
* of {@link CameraCharacteristics#CONTROL_MAX_REGIONS_AF android.control.maxRegionsAf}.</p>
- * <p>The coordinate system is based on the active pixel array,
- * with (0,0) being the top-left pixel in the active pixel array, and
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with (0,0) being
+ * the top-left pixel in the active pixel array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.height - 1) being the bottom-right
+ * pixel in the pre-correction active pixel array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the active array, and
* ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the
- * bottom-right pixel in the active pixel array.</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
* <p>The weight must be within <code>[0, 1000]</code>, and represents a weight
* for every pixel in the area. This means that a large metering area
* with the same weight as a smaller area will have more effect in
@@ -1173,15 +1208,20 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* region and output only the intersection rectangle as the metering region in the result
* metadata. If the region is entirely outside the crop region, it will be ignored and
* not reported in the result metadata.</p>
- * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} depending on
+ * distortion correction capability and mode</p>
* <p><b>Range of valid values:</b><br>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
+ * depending on distortion correction capability and mode</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AF
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CaptureRequest#SCALER_CROP_REGION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS =
@@ -1730,11 +1770,26 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* Otherwise will always be present.</p>
* <p>The maximum number of regions supported by the device is determined by the value
* of {@link CameraCharacteristics#CONTROL_MAX_REGIONS_AWB android.control.maxRegionsAwb}.</p>
- * <p>The coordinate system is based on the active pixel array,
- * with (0,0) being the top-left pixel in the active pixel array, and
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with (0,0) being
+ * the top-left pixel in the active pixel array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array, and
+ * ({@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.width - 1,
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}.height - 1) being the bottom-right
+ * pixel in the pre-correction active pixel array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the active array, and
* ({@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.width - 1,
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the
- * bottom-right pixel in the active pixel array.</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.height - 1) being the bottom-right pixel in the
+ * active pixel array.</p>
* <p>The weight must range from 0 to 1000, and represents a weight
* for every pixel in the area. This means that a large metering area
* with the same weight as a smaller area will have more effect in
@@ -1750,15 +1805,20 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* region and output only the intersection rectangle as the metering region in the result
* metadata. If the region is entirely outside the crop region, it will be ignored and
* not reported in the result metadata.</p>
- * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * <p><b>Units</b>: Pixel coordinates within {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} depending on
+ * distortion correction capability and mode</p>
* <p><b>Range of valid values:</b><br>
* Coordinates must be between <code>[(0,0), (width, height))</code> of
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}
+ * depending on distortion correction capability and mode</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CameraCharacteristics#CONTROL_MAX_REGIONS_AWB
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CaptureRequest#SCALER_CROP_REGION
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS =
@@ -3099,9 +3159,17 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>The desired region of the sensor to read out for this capture.</p>
* <p>This control can be used to implement digital zoom.</p>
- * <p>The crop region coordinate system is based off
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with <code>(0, 0)</code> being the
- * top-left corner of the sensor active array.</p>
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with <code>(0, 0)</code> being
+ * the top-left pixel of the active array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the active array.</p>
* <p>Output streams use this rectangle to produce their output,
* cropping to a smaller region if necessary to maintain the
* stream's aspect ratio, then scaling the sensor input to
@@ -3120,20 +3188,30 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* outputs will crop horizontally (pillarbox), and 16:9
* streams will match exactly. These additional crops will
* be centered within the crop region.</p>
- * <p>The width and height of the crop region cannot
- * be set to be smaller than
+ * <p>If the coordinate system is android.sensor.info.activeArraysSize, the width and height
+ * of the crop region cannot be set to be smaller than
* <code>floor( activeArraySize.width / {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM android.scaler.availableMaxDigitalZoom} )</code> and
* <code>floor( activeArraySize.height / {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM android.scaler.availableMaxDigitalZoom} )</code>, respectively.</p>
+ * <p>If the coordinate system is {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, the width
+ * and height of the crop region cannot be set to be smaller than
+ * <code>floor( preCorrectionActiveArraySize.width / {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM android.scaler.availableMaxDigitalZoom} )</code>
+ * and
+ * <code>floor( preCorrectionActiveArraySize.height / {@link CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM android.scaler.availableMaxDigitalZoom} )</code>,
+ * respectively.</p>
* <p>The camera device may adjust the crop region to account
* for rounding and other hardware requirements; the final
* crop region used will be included in the output capture
* result.</p>
* <p><b>Units</b>: Pixel coordinates relative to
- * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</p>
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} depending on distortion correction
+ * capability and mode</p>
* <p>This key is available on all devices.</p>
*
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
*/
@PublicKey
public static final Key<android.graphics.Rect> SCALER_CROP_REGION =
@@ -3624,12 +3702,23 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>List of landmarks for detected
* faces.</p>
- * <p>The coordinate system is that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with <code>(0, 0)</code> being
+ * the top-left pixel of the active array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
* <code>(0, 0)</code> being the top-left pixel of the active array.</p>
* <p>Only available if {@link CaptureRequest#STATISTICS_FACE_DETECT_MODE android.statistics.faceDetectMode} == FULL
* This key is available on all devices.</p>
*
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
* @see CaptureRequest#STATISTICS_FACE_DETECT_MODE
* @hide
*/
@@ -3639,12 +3728,23 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>List of the bounding rectangles for detected
* faces.</p>
- * <p>The coordinate system is that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
+ * <p>For devices not supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system always follows that of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with <code>(0, 0)</code> being
+ * the top-left pixel of the active array.</p>
+ * <p>For devices supporting {@link CaptureRequest#DISTORTION_CORRECTION_MODE android.distortionCorrection.mode} control, the coordinate
+ * system depends on the mode being set.
+ * When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with
+ * <code>(0, 0)</code> being the top-left pixel of the pre-correction active array.
+ * When the distortion correction mode is not OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with
* <code>(0, 0)</code> being the top-left pixel of the active array.</p>
* <p>Only available if {@link CaptureRequest#STATISTICS_FACE_DETECT_MODE android.statistics.faceDetectMode} != OFF
* This key is available on all devices.</p>
*
+ * @see CaptureRequest#DISTORTION_CORRECTION_MODE
* @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
* @see CaptureRequest#STATISTICS_FACE_DETECT_MODE
* @hide
*/
@@ -4478,15 +4578,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* any correction at all would slow down capture rate. Every output stream will have a
* similar amount of enhancement applied.</p>
* <p>The correction only applies to processed outputs such as YUV, JPEG, or DEPTH16; it is not
- * applied to any RAW output. Metadata coordinates such as face rectangles or metering
+ * applied to any RAW output. Metadata coordinates such as face rectangles or metering
* regions are also not affected by correction.</p>
- * <p>Applications enabling distortion correction need to pay extra attention when converting
- * image coordinates between corrected output buffers and the sensor array. For example, if
- * the app supports tap-to-focus and enables correction, it then has to apply the distortion
- * model described in {@link CameraCharacteristics#LENS_DISTORTION android.lens.distortion} to the image buffer tap coordinates to properly
- * calculate the tap position on the sensor active array to be used with
- * {@link CaptureRequest#CONTROL_AF_REGIONS android.control.afRegions}. The same applies in reverse to detected face rectangles if
- * they need to be drawn on top of the corrected output buffers.</p>
+ * <p>This control will be on by default on devices that support this control. Applications
+ * disabling distortion correction need to pay extra attention with the coordinate system of
+ * metering regions, crop region, and face rectangles. When distortion correction is OFF,
+ * metadata coordinates follow the coordinate system of
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}. When distortion is not OFF, metadata
+ * coordinates follow the coordinate system of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.</p>
* <p><b>Possible values:</b>
* <ul>
* <li>{@link #DISTORTION_CORRECTION_MODE_OFF OFF}</li>
@@ -4497,9 +4596,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* {@link CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES android.distortionCorrection.availableModes}</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
- * @see CaptureRequest#CONTROL_AF_REGIONS
* @see CameraCharacteristics#DISTORTION_CORRECTION_AVAILABLE_MODES
* @see CameraCharacteristics#LENS_DISTORTION
+ * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
* @see #DISTORTION_CORRECTION_MODE_OFF
* @see #DISTORTION_CORRECTION_MODE_FAST
* @see #DISTORTION_CORRECTION_MODE_HIGH_QUALITY
diff --git a/core/java/android/hardware/camera2/TotalCaptureResult.java b/core/java/android/hardware/camera2/TotalCaptureResult.java
index 4e20cb8d129e..7cc2623a29ba 100644
--- a/core/java/android/hardware/camera2/TotalCaptureResult.java
+++ b/core/java/android/hardware/camera2/TotalCaptureResult.java
@@ -55,7 +55,7 @@ import java.util.Map;
*
* <p>{@link TotalCaptureResult} objects are immutable.</p>
*
- * @see CameraDevice.CaptureCallback#onCaptureCompleted
+ * @see CameraCaptureSession.CaptureCallback#onCaptureCompleted
*/
public final class TotalCaptureResult extends CaptureResult {
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index 4baf2638d888..86bd30c19ca3 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -747,6 +747,9 @@ public class CameraMetadataNative implements Parcelable {
if (faceDetectMode == null) {
Log.w(TAG, "Face detect mode metadata is null, assuming the mode is SIMPLE");
faceDetectMode = CaptureResult.STATISTICS_FACE_DETECT_MODE_SIMPLE;
+ } else if (faceDetectMode > CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL) {
+ // Face detect mode is larger than FULL, assuming the mode is FULL
+ faceDetectMode = CaptureResult.STATISTICS_FACE_DETECT_MODE_FULL;
} else {
if (faceDetectMode == CaptureResult.STATISTICS_FACE_DETECT_MODE_OFF) {
return new Face[0];
diff --git a/core/java/android/hardware/camera2/params/Face.java b/core/java/android/hardware/camera2/params/Face.java
index 2cd83a3254a3..e94f11d8a056 100644
--- a/core/java/android/hardware/camera2/params/Face.java
+++ b/core/java/android/hardware/camera2/params/Face.java
@@ -31,7 +31,6 @@ public final class Face {
/**
* The ID is {@code -1} when the optional set of fields is unsupported.
*
- * @see Face#Face(Rect, int)
* @see #getId()
*/
public static final int ID_UNSUPPORTED = -1;
diff --git a/core/java/android/hardware/camera2/params/LensShadingMap.java b/core/java/android/hardware/camera2/params/LensShadingMap.java
index d6b84f2c9821..9eb276f29c81 100644
--- a/core/java/android/hardware/camera2/params/LensShadingMap.java
+++ b/core/java/android/hardware/camera2/params/LensShadingMap.java
@@ -16,8 +16,16 @@
package android.hardware.camera2.params;
-import static com.android.internal.util.Preconditions.*;
-import static android.hardware.camera2.params.RggbChannelVector.*;
+import static android.hardware.camera2.params.RggbChannelVector.BLUE;
+import static android.hardware.camera2.params.RggbChannelVector.COUNT;
+import static android.hardware.camera2.params.RggbChannelVector.GREEN_EVEN;
+import static android.hardware.camera2.params.RggbChannelVector.GREEN_ODD;
+import static android.hardware.camera2.params.RggbChannelVector.RED;
+
+import static com.android.internal.util.Preconditions.checkArgumentNonnegative;
+import static com.android.internal.util.Preconditions.checkArgumentPositive;
+import static com.android.internal.util.Preconditions.checkArrayElementsInRange;
+import static com.android.internal.util.Preconditions.checkNotNull;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.utils.HashCodeHelpers;
@@ -117,10 +125,10 @@ public final class LensShadingMap {
*
* @throws IllegalArgumentException if any of the parameters was out of range
*
- * @see #RED
- * @see #GREEN_EVEN
- * @see #GREEN_ODD
- * @see #BLUE
+ * @see RggbChannelVector#RED
+ * @see RggbChannelVector#GREEN_EVEN
+ * @see RggbChannelVector#GREEN_ODD
+ * @see RggbChannelVector#BLUE
* @see #getRowCount
* @see #getColumnCount
*/
@@ -191,7 +199,7 @@ public final class LensShadingMap {
* If there's not enough room to write the elements at the specified destination and
* offset.
*
- * @see CaptureResult#STATISTICS_LENS_SHADING_MAP
+ * @see CaptureResult#STATISTICS_LENS_SHADING_CORRECTION_MAP
*/
public void copyGainFactors(final float[] destination, final int offset) {
checkArgumentNonnegative(offset, "offset must not be negative");
diff --git a/core/java/android/hardware/camera2/params/OutputConfiguration.java b/core/java/android/hardware/camera2/params/OutputConfiguration.java
index a040a09cf469..1ee3c933b326 100644
--- a/core/java/android/hardware/camera2/params/OutputConfiguration.java
+++ b/core/java/android/hardware/camera2/params/OutputConfiguration.java
@@ -82,9 +82,9 @@ import java.util.List;
*
* </ul>
*
- * <p> As of {@link android.os.Build.VERSION_CODES#P Android P}, all formats can be used for
- * sharing, subject to device support. On prior API levels, only {@link ImageFormat#PRIVATE}
- * format may be used.</p>
+ * <p> As of {@link android.os.Build.VERSION_CODES#P Android P}, all formats except
+ * {@link ImageFormat#JPEG} and {@link ImageFormat#RAW_PRIVATE} can be used for sharing, subject to
+ * device support. On prior API levels, only {@link ImageFormat#PRIVATE} format may be used.</p>
*
* @see CameraDevice#createCaptureSessionByOutputConfigurations
*
diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
index 00e047db98c0..414c463b4545 100644
--- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
+++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
@@ -16,28 +16,28 @@
package android.hardware.camera2.params;
+import static com.android.internal.util.Preconditions.checkArrayElementsNotNull;
+import static com.android.internal.util.Preconditions.checkNotNull;
+
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.legacy.LegacyCameraDevice;
import android.hardware.camera2.utils.HashCodeHelpers;
import android.hardware.camera2.utils.SurfaceUtils;
-import android.hardware.camera2.legacy.LegacyCameraDevice;
-import android.hardware.camera2.legacy.LegacyMetadataMapper;
-import android.view.Surface;
import android.util.Range;
import android.util.Size;
import android.util.SparseIntArray;
+import android.view.Surface;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Objects;
import java.util.Set;
-import static com.android.internal.util.Preconditions.*;
-
/**
* Immutable class to store the available stream
* {@link CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP configurations} to set up
@@ -609,7 +609,7 @@ public final class StreamConfigurationMap {
* @see #getHighSpeedVideoSizesFor
* @see CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO
* @see CameraDevice#createConstrainedHighSpeedCaptureSession
- * @see CameraDevice#createHighSpeedRequestList
+ * @see android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession#createHighSpeedRequestList
*/
@SuppressWarnings("unchecked")
public Range<Integer>[] getHighSpeedVideoFpsRanges() {
@@ -725,7 +725,7 @@ public final class StreamConfigurationMap {
* Get the minimum {@link CaptureRequest#SENSOR_FRAME_DURATION frame duration}
* for the class/size combination (in nanoseconds).
*
- * <p>This assumes a the {@code klass} is set up to use {@link ImageFormat#PRIVATE}.
+ * <p>This assumes that the {@code klass} is set up to use {@link ImageFormat#PRIVATE}.
* For user-defined formats, use {@link #getOutputMinFrameDuration(int, Size)}.</p>
*
* <p>{@code klass} should be one of the ones which is supported by
@@ -870,7 +870,7 @@ public final class StreamConfigurationMap {
/**
* Get the stall duration for the class/size combination (in nanoseconds).
*
- * <p>This assumes a the {@code klass} is set up to use {@link ImageFormat#PRIVATE}.
+ * <p>This assumes that the {@code klass} is set up to use {@link ImageFormat#PRIVATE}.
* For user-defined formats, use {@link #getOutputMinFrameDuration(int, Size)}.</p>
*
* <p>{@code klass} should be one of the ones with a non-empty array returned by
diff --git a/core/java/android/hardware/camera2/params/TonemapCurve.java b/core/java/android/hardware/camera2/params/TonemapCurve.java
index 2d7bbaa21c54..71e68a5271c2 100644
--- a/core/java/android/hardware/camera2/params/TonemapCurve.java
+++ b/core/java/android/hardware/camera2/params/TonemapCurve.java
@@ -40,9 +40,6 @@ import java.util.Arrays;
* <p>The coordinate system for each point is within the inclusive range
* [{@value #LEVEL_BLACK}, {@value #LEVEL_WHITE}].</p>
*
- * @see CaptureRequest#TONEMAP_CURVE_BLUE
- * @see CaptureRequest#TONEMAP_CURVE_GREEN
- * @see CaptureRequest#TONEMAP_CURVE_RED
* @see CameraMetadata#TONEMAP_MODE_CONTRAST_CURVE
* @see CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS
*/
@@ -223,9 +220,6 @@ public final class TonemapCurve {
* If there's not enough room to write the elements at the specified destination and
* offset.
*
- * @see CaptureRequest#TONEMAP_CURVE_BLUE
- * @see CaptureRequest#TONEMAP_CURVE_RED
- * @see CaptureRequest#TONEMAP_CURVE_GREEN
* @see #LEVEL_BLACK
* @see #LEVEL_WHITE
*/
diff --git a/core/java/android/hardware/face/Face.aidl b/core/java/android/hardware/face/Face.aidl
new file mode 100644
index 000000000000..a7c914166dc3
--- /dev/null
+++ b/core/java/android/hardware/face/Face.aidl
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.face;
+
+/**
+ * @hide
+ */
+parcelable Face;
diff --git a/core/java/android/hardware/face/Face.java b/core/java/android/hardware/face/Face.java
new file mode 100644
index 000000000000..6a508ac7accd
--- /dev/null
+++ b/core/java/android/hardware/face/Face.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.face;
+
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Container for face metadata.
+ *
+ * @hide
+ */
+public final class Face extends BiometricAuthenticator.Identifier {
+ private CharSequence mName;
+ private int mFaceId;
+ private long mDeviceId; // physical device this face is associated with
+
+ public Face(CharSequence name, int faceId, long deviceId) {
+ mName = name;
+ mFaceId = faceId;
+ mDeviceId = deviceId;
+ }
+
+ private Face(Parcel in) {
+ mName = in.readString();
+ mFaceId = in.readInt();
+ mDeviceId = in.readLong();
+ }
+
+ /**
+ * Gets the human-readable name for the given fingerprint.
+ * @return name given to finger
+ */
+ public CharSequence getName() {
+ return mName;
+ }
+
+ /**
+ * Gets the device-specific finger id. Used by Settings to map a name to a specific
+ * fingerprint template.
+ * @return device-specific id for this finger
+ * @hide
+ */
+ public int getFaceId() {
+ return mFaceId;
+ }
+
+ /**
+ * Device this face belongs to.
+ *
+ * @hide
+ */
+ public long getDeviceId() {
+ return mDeviceId;
+ }
+
+ /**
+ * Describes the contents.
+ * @return
+ */
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Writes to a parcel.
+ * @param out
+ * @param flags Additional flags about how the object should be written.
+ */
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeString(mName.toString());
+ out.writeInt(mFaceId);
+ out.writeLong(mDeviceId);
+ }
+
+ public static final Parcelable.Creator<Face> CREATOR = new Parcelable.Creator<Face>() {
+ public Face createFromParcel(Parcel in) {
+ return new Face(in);
+ }
+
+ public Face[] newArray(int size) {
+ return new Face[size];
+ }
+ };
+}
diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java
new file mode 100644
index 000000000000..3de9de3ed627
--- /dev/null
+++ b/core/java/android/hardware/face/FaceManager.java
@@ -0,0 +1,1007 @@
+/**
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.face;
+
+import static android.Manifest.permission.INTERACT_ACROSS_USERS;
+import static android.Manifest.permission.MANAGE_FACE;
+import static android.Manifest.permission.USE_BIOMETRIC;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemService;
+import android.app.ActivityManager;
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricFaceConstants;
+import android.hardware.biometrics.BiometricPrompt;
+import android.hardware.biometrics.CryptoObject;
+import android.hardware.biometrics.IBiometricPromptReceiver;
+import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.CancellationSignal.OnCancelListener;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.IRemoteCallback;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.util.Log;
+import android.util.Slog;
+
+import com.android.internal.R;
+
+import java.util.List;
+import java.util.concurrent.Executor;
+
+/**
+ * A class that coordinates access to the face authentication hardware.
+ * @hide
+ */
+@SystemService(Context.FACE_SERVICE)
+public class FaceManager implements BiometricFaceConstants {
+
+
+ private static final String TAG = "FaceManager";
+ private static final boolean DEBUG = true;
+ private static final int MSG_ENROLL_RESULT = 100;
+ private static final int MSG_ACQUIRED = 101;
+ private static final int MSG_AUTHENTICATION_SUCCEEDED = 102;
+ private static final int MSG_AUTHENTICATION_FAILED = 103;
+ private static final int MSG_ERROR = 104;
+ private static final int MSG_REMOVED = 105;
+
+ private IFaceService mService;
+ private final Context mContext;
+ private IBinder mToken = new Binder();
+ private BiometricAuthenticator.AuthenticationCallback mAuthenticationCallback;
+ private EnrollmentCallback mEnrollmentCallback;
+ private RemovalCallback mRemovalCallback;
+ private CryptoObject mCryptoObject;
+ private Face mRemovalFace;
+ private Handler mHandler;
+ private Executor mExecutor;
+
+ private IFaceServiceReceiver mServiceReceiver = new IFaceServiceReceiver.Stub() {
+
+ @Override // binder call
+ public void onEnrollResult(long deviceId, int faceId, int remaining) {
+ mHandler.obtainMessage(MSG_ENROLL_RESULT, remaining, 0,
+ new Face(null, faceId, deviceId)).sendToTarget();
+ }
+
+ @Override // binder call
+ public void onAcquired(long deviceId, int acquireInfo, int vendorCode) {
+ mHandler.obtainMessage(MSG_ACQUIRED, acquireInfo, vendorCode, deviceId).sendToTarget();
+ }
+
+ @Override // binder call
+ public void onAuthenticationSucceeded(long deviceId, Face face) {
+ mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, face).sendToTarget();
+ }
+
+ @Override // binder call
+ public void onAuthenticationFailed(long deviceId) {
+ mHandler.obtainMessage(MSG_AUTHENTICATION_FAILED).sendToTarget();
+ }
+
+ @Override // binder call
+ public void onError(long deviceId, int error, int vendorCode) {
+ mHandler.obtainMessage(MSG_ERROR, error, vendorCode, deviceId).sendToTarget();
+ }
+
+ @Override // binder call
+ public void onRemoved(long deviceId, int faceId, int remaining) {
+ mHandler.obtainMessage(MSG_REMOVED, remaining, 0,
+ new Face(null, faceId, deviceId)).sendToTarget();
+ }
+ };
+
+ /**
+ * @hide
+ */
+ public FaceManager(Context context, IFaceService service) {
+ mContext = context;
+ mService = service;
+ if (mService == null) {
+ Slog.v(TAG, "FaceAuthenticationManagerService was null");
+ }
+ mHandler = new MyHandler(context);
+ }
+
+ /**
+ * Request authentication of a crypto object. This call operates the face recognition hardware
+ * and starts capturing images. It terminates when
+ * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)} or
+ * {@link AuthenticationCallback#onAuthenticationSucceeded(AuthenticationResult)} is called, at
+ * which point the object is no longer valid. The operation can be canceled by using the
+ * provided cancel object.
+ *
+ * @param crypto object associated with the call or null if none required.
+ * @param cancel an object that can be used to cancel authentication
+ * @param flags optional flags; should be 0
+ * @param callback an object to receive authentication events
+ * @param handler an optional handler to handle callback events
+ * @throws IllegalArgumentException if the crypto operation is not supported or is not backed
+ * by
+ * <a href="{@docRoot}training/articles/keystore.html">Android
+ * Keystore facility</a>.
+ * @throws IllegalStateException if the crypto primitive is not initialized.
+ * @hide
+ */
+ @RequiresPermission(USE_BIOMETRIC)
+ public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel,
+ int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler) {
+ if (callback == null) {
+ throw new IllegalArgumentException("Must supply an authentication callback");
+ }
+
+ if (cancel != null) {
+ if (cancel.isCanceled()) {
+ Log.w(TAG, "authentication already canceled");
+ return;
+ } else {
+ cancel.setOnCancelListener(new OnAuthenticationCancelListener(crypto));
+ }
+ }
+
+ if (mService != null) {
+ try {
+ useHandler(handler);
+ mAuthenticationCallback = callback;
+ mCryptoObject = crypto;
+ long sessionId = crypto != null ? crypto.getOpId() : 0;
+ mService.authenticate(mToken, sessionId, mServiceReceiver, flags,
+ mContext.getOpPackageName(), null /* bundle */, null /* receiver */);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Remote exception while authenticating: ", e);
+ if (callback != null) {
+ // Though this may not be a hardware issue, it will cause apps to give up or try
+ // again later.
+ callback.onAuthenticationError(FACE_ERROR_HW_UNAVAILABLE,
+ getErrorString(FACE_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */));
+ }
+ }
+ }
+ }
+
+ /**
+ * Use the provided handler thread for events.
+ */
+ private void useHandler(Handler handler) {
+ if (handler != null) {
+ mHandler = new MyHandler(handler.getLooper());
+ } else if (mHandler.getLooper() != mContext.getMainLooper()) {
+ mHandler = new MyHandler(mContext.getMainLooper());
+ }
+ }
+
+ /**
+ * This method invokes the BiometricPrompt.
+ */
+ private void authenticateWithPrompt(@Nullable android.hardware.biometrics.CryptoObject crypto,
+ @NonNull CancellationSignal cancel,
+ @NonNull Bundle bundle,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull IBiometricPromptReceiver receiver,
+ @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
+ mCryptoObject = crypto;
+ if (cancel.isCanceled()) {
+ Slog.w(TAG, "authentication already canceled");
+ return;
+ } else {
+ cancel.setOnCancelListener(new OnAuthenticationCancelListener(crypto));
+ }
+
+ if (mService != null) {
+ try {
+ mExecutor = executor;
+ mAuthenticationCallback = callback;
+ final long sessionId = crypto != null ? crypto.getOpId() : 0;
+ mService.authenticate(mToken, sessionId, mServiceReceiver,
+ 0 /* flags */, mContext.getOpPackageName(), bundle, receiver);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Remote exception while authenticating", e);
+ mExecutor.execute(() -> {
+ callback.onAuthenticationError(FACE_ERROR_HW_UNAVAILABLE,
+ getErrorString(FACE_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */));
+ });
+ }
+ }
+ }
+
+ /**
+ * Private method, see {@link BiometricPrompt#authenticate(CancellationSignal, Executor,
+ * BiometricPrompt.AuthenticationCallback)}
+ * @param cancel
+ * @param executor
+ * @param callback
+ * @hide
+ */
+ public void authenticate(
+ @NonNull CancellationSignal cancel,
+ @NonNull Bundle bundle,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull IBiometricPromptReceiver receiver,
+ @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
+ if (cancel == null) {
+ throw new IllegalArgumentException("Must supply a cancellation signal");
+ }
+ if (bundle == null) {
+ throw new IllegalArgumentException("Must supply a bundle");
+ }
+ if (executor == null) {
+ throw new IllegalArgumentException("Must supply an executor");
+ }
+ if (receiver == null) {
+ throw new IllegalArgumentException("Must supply a receiver");
+ }
+ if (callback == null) {
+ throw new IllegalArgumentException("Must supply a calback");
+ }
+ authenticateWithPrompt(null, cancel, bundle, executor, receiver, callback);
+ }
+
+ /**
+ * Private method, see {@link BiometricPrompt#authenticate(BiometricPrompt.CryptoObject,
+ * CancellationSignal, Executor, BiometricPrompt.AuthenticationCallback)}
+ * @param crypto
+ * @param cancel
+ * @param executor
+ * @param callback
+ * @hide
+ */
+ public void authenticate(@NonNull android.hardware.biometrics.CryptoObject crypto,
+ @NonNull CancellationSignal cancel,
+ @NonNull Bundle bundle,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull IBiometricPromptReceiver receiver,
+ @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
+ if (crypto == null) {
+ throw new IllegalArgumentException("Must supply a crypto object");
+ }
+ if (cancel == null) {
+ throw new IllegalArgumentException("Must supply a cancellation signal");
+ }
+ if (bundle == null) {
+ throw new IllegalArgumentException("Must supply a bundle");
+ }
+ if (executor == null) {
+ throw new IllegalArgumentException("Must supply an executor");
+ }
+ if (receiver == null) {
+ throw new IllegalArgumentException("Must supply a receiver");
+ }
+ if (callback == null) {
+ throw new IllegalArgumentException("Must supply a callback");
+ }
+ authenticateWithPrompt(crypto, cancel, bundle, executor, receiver, callback);
+ }
+
+ /**
+ * Request face authentication enrollment. This call operates the face authentication hardware
+ * and starts capturing images. Progress will be indicated by callbacks to the
+ * {@link EnrollmentCallback} object. It terminates when
+ * {@link EnrollmentCallback#onEnrollmentError(int, CharSequence)} or
+ * {@link EnrollmentCallback#onEnrollmentProgress(int) is called with remaining == 0, at
+ * which point the object is no longer valid. The operation can be canceled by using the
+ * provided cancel object.
+ *
+ * @param token a unique token provided by a recent creation or verification of device
+ * credentials (e.g. pin, pattern or password).
+ * @param cancel an object that can be used to cancel enrollment
+ * @param flags optional flags
+ * @param userId the user to whom this face will belong to
+ * @param callback an object to receive enrollment events
+ * @hide
+ */
+ @RequiresPermission(MANAGE_FACE)
+ public void enroll(byte[] token, CancellationSignal cancel, int flags,
+ int userId, EnrollmentCallback callback) {
+ if (userId == UserHandle.USER_CURRENT) {
+ userId = getCurrentUserId();
+ }
+ if (callback == null) {
+ throw new IllegalArgumentException("Must supply an enrollment callback");
+ }
+
+ if (cancel != null) {
+ if (cancel.isCanceled()) {
+ Log.w(TAG, "enrollment already canceled");
+ return;
+ } else {
+ cancel.setOnCancelListener(new OnEnrollCancelListener());
+ }
+ }
+
+ if (mService != null) {
+ try {
+ mEnrollmentCallback = callback;
+ mService.enroll(mToken, token, userId, mServiceReceiver, flags,
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ Log.w(TAG, "Remote exception in enroll: ", e);
+ if (callback != null) {
+ // Though this may not be a hardware issue, it will cause apps to give up or try
+ // again later.
+ callback.onEnrollmentError(FACE_ERROR_HW_UNAVAILABLE,
+ getErrorString(FACE_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */));
+ }
+ }
+ }
+ }
+
+ /**
+ * Requests a pre-enrollment auth token to tie enrollment to the confirmation of
+ * existing device credentials (e.g. pin/pattern/password).
+ *
+ * @hide
+ */
+ @RequiresPermission(MANAGE_FACE)
+ public long preEnroll() {
+ long result = 0;
+ if (mService != null) {
+ try {
+ result = mService.preEnroll(mToken);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Finishes enrollment and cancels the current auth token.
+ *
+ * @hide
+ */
+ @RequiresPermission(MANAGE_FACE)
+ public int postEnroll() {
+ int result = 0;
+ if (mService != null) {
+ try {
+ result = mService.postEnroll(mToken);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Sets the active user. This is meant to be used to select the current profile for enrollment
+ * to allow separate enrolled faces for a work profile
+ *
+ * @hide
+ */
+ @RequiresPermission(MANAGE_FACE)
+ public void setActiveUser(int userId) {
+ if (mService != null) {
+ try {
+ mService.setActiveUser(userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Remove given face template from face hardware and/or protected storage.
+ *
+ * @param face the face item to remove
+ * @param userId the user who this face belongs to
+ * @param callback an optional callback to verify that face templates have been
+ * successfully removed. May be null if no callback is required.
+ * @hide
+ */
+ @RequiresPermission(MANAGE_FACE)
+ public void remove(Face face, int userId, RemovalCallback callback) {
+ if (mService != null) {
+ try {
+ mRemovalCallback = callback;
+ mRemovalFace = face;
+ mService.remove(mToken, face.getFaceId(), userId, mServiceReceiver);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Remote exception in remove: ", e);
+ if (callback != null) {
+ callback.onRemovalError(face, FACE_ERROR_HW_UNAVAILABLE,
+ getErrorString(FACE_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */));
+ }
+ }
+ }
+ }
+
+ /**
+ * Obtain the enrolled face template.
+ *
+ * @return the current face item
+ * @hide
+ */
+ @RequiresPermission(USE_BIOMETRIC)
+ public List<Face> getEnrolledFaces(int userId) {
+ if (mService != null) {
+ try {
+ return mService.getEnrolledFaces(userId, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Obtain the enrolled face template.
+ *
+ * @return the current face item
+ * @hide
+ */
+ @RequiresPermission(USE_BIOMETRIC)
+ public List<Face> getEnrolledFaces() {
+ return getEnrolledFaces(UserHandle.myUserId());
+ }
+
+ /**
+ * Determine if there is a face enrolled.
+ *
+ * @return true if a face is enrolled, false otherwise
+ */
+ @RequiresPermission(USE_BIOMETRIC)
+ public boolean hasEnrolledFaces() {
+ if (mService != null) {
+ try {
+ return mService.hasEnrolledFaces(
+ UserHandle.myUserId(), mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @hide
+ */
+ @RequiresPermission(allOf = {
+ USE_BIOMETRIC,
+ INTERACT_ACROSS_USERS})
+ public boolean hasEnrolledFaces(int userId) {
+ if (mService != null) {
+ try {
+ return mService.hasEnrolledFaces(userId, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Determine if face authentication sensor hardware is present and functional.
+ *
+ * @return true if hardware is present and functional, false otherwise.
+ */
+ @RequiresPermission(USE_BIOMETRIC)
+ public boolean isHardwareDetected() {
+ if (mService != null) {
+ try {
+ long deviceId = 0; /* TODO: plumb hardware id to FPMS */
+ return mService.isHardwareDetected(deviceId, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ } else {
+ Log.w(TAG, "isFaceHardwareDetected(): Service not connected!");
+ }
+ return false;
+ }
+
+ /**
+ * Retrieves the authenticator token for binding keys to the lifecycle
+ * of the calling user's face. Used only by internal clients.
+ *
+ * @hide
+ */
+ public long getAuthenticatorId() {
+ if (mService != null) {
+ try {
+ return mService.getAuthenticatorId(mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ } else {
+ Log.w(TAG, "getAuthenticatorId(): Service not connected!");
+ }
+ return 0;
+ }
+
+ /**
+ * Reset the lockout timer when asked to do so by keyguard.
+ *
+ * @param token an opaque token returned by password confirmation.
+ * @hide
+ */
+ public void resetTimeout(byte[] token) {
+ if (mService != null) {
+ try {
+ mService.resetTimeout(token);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ } else {
+ Log.w(TAG, "resetTimeout(): Service not connected!");
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public void addLockoutResetCallback(final LockoutResetCallback callback) {
+ if (mService != null) {
+ try {
+ final PowerManager powerManager = mContext.getSystemService(PowerManager.class);
+ mService.addLockoutResetCallback(
+ new IBiometricServiceLockoutResetCallback.Stub() {
+
+ @Override
+ public void onLockoutReset(long deviceId,
+ IRemoteCallback serverCallback)
+ throws RemoteException {
+ try {
+ final PowerManager.WakeLock wakeLock = powerManager.newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK,
+ "faceLockoutResetCallback");
+ wakeLock.acquire();
+ mHandler.post(() -> {
+ try {
+ callback.onLockoutReset();
+ } finally {
+ wakeLock.release();
+ }
+ });
+ } finally {
+ serverCallback.sendResult(null /* data */);
+ }
+ }
+ });
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ } else {
+ Log.w(TAG, "addLockoutResetCallback(): Service not connected!");
+ }
+ }
+
+ private int getCurrentUserId() {
+ try {
+ return ActivityManager.getService().getCurrentUser().id;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ private void cancelEnrollment() {
+ if (mService != null) {
+ try {
+ mService.cancelEnrollment(mToken);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ private void cancelAuthentication(CryptoObject cryptoObject) {
+ if (mService != null) {
+ try {
+ mService.cancelAuthentication(mToken, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ private String getErrorString(int errMsg, int vendorCode) {
+ switch (errMsg) {
+ case FACE_ERROR_HW_UNAVAILABLE:
+ return mContext.getString(
+ com.android.internal.R.string.face_error_hw_not_available);
+ case FACE_ERROR_UNABLE_TO_PROCESS:
+ return mContext.getString(
+ com.android.internal.R.string.face_error_unable_to_process);
+ case FACE_ERROR_TIMEOUT:
+ return mContext.getString(com.android.internal.R.string.face_error_timeout);
+ case FACE_ERROR_NO_SPACE:
+ return mContext.getString(com.android.internal.R.string.face_error_no_space);
+ case FACE_ERROR_CANCELED:
+ return mContext.getString(com.android.internal.R.string.face_error_canceled);
+ case FACE_ERROR_LOCKOUT:
+ return mContext.getString(com.android.internal.R.string.face_error_lockout);
+ case FACE_ERROR_LOCKOUT_PERMANENT:
+ return mContext.getString(
+ com.android.internal.R.string.face_error_lockout_permanent);
+ case FACE_ERROR_NOT_ENROLLED:
+ return mContext.getString(com.android.internal.R.string.face_error_not_enrolled);
+ case FACE_ERROR_HW_NOT_PRESENT:
+ return mContext.getString(com.android.internal.R.string.face_error_hw_not_present);
+ case FACE_ERROR_VENDOR: {
+ String[] msgArray = mContext.getResources().getStringArray(
+ com.android.internal.R.array.face_error_vendor);
+ if (vendorCode < msgArray.length) {
+ return msgArray[vendorCode];
+ }
+ }
+ }
+ Slog.w(TAG, "Invalid error message: " + errMsg + ", " + vendorCode);
+ return null;
+ }
+
+ private String getAcquiredString(int acquireInfo, int vendorCode) {
+ switch (acquireInfo) {
+ case FACE_ACQUIRED_GOOD:
+ return null;
+ case FACE_ACQUIRED_INSUFFICIENT:
+ return mContext.getString(R.string.face_acquired_insufficient);
+ case FACE_ACQUIRED_TOO_BRIGHT:
+ return mContext.getString(R.string.face_acquired_too_bright);
+ case FACE_ACQUIRED_TOO_DARK:
+ return mContext.getString(R.string.face_acquired_too_dark);
+ case FACE_ACQUIRED_TOO_CLOSE:
+ return mContext.getString(R.string.face_acquired_too_close);
+ case FACE_ACQUIRED_TOO_FAR:
+ return mContext.getString(R.string.face_acquired_too_far);
+ case FACE_ACQUIRED_TOO_HIGH:
+ return mContext.getString(R.string.face_acquired_too_high);
+ case FACE_ACQUIRED_TOO_LOW:
+ return mContext.getString(R.string.face_acquired_too_low);
+ case FACE_ACQUIRED_TOO_RIGHT:
+ return mContext.getString(R.string.face_acquired_too_right);
+ case FACE_ACQUIRED_TOO_LEFT:
+ return mContext.getString(R.string.face_acquired_too_left);
+ case FACE_ACQUIRED_POOR_GAZE:
+ return mContext.getString(R.string.face_acquired_poor_gaze);
+ case FACE_ACQUIRED_NOT_DETECTED:
+ return mContext.getString(R.string.face_acquired_not_detected);
+ case FACE_ACQUIRED_VENDOR: {
+ String[] msgArray = mContext.getResources().getStringArray(
+ R.array.face_acquired_vendor);
+ if (vendorCode < msgArray.length) {
+ return msgArray[vendorCode];
+ }
+ }
+ }
+ Slog.w(TAG, "Invalid acquired message: " + acquireInfo + ", " + vendorCode);
+ return null;
+ }
+
+ /**
+ * Container for callback data from {@link FaceManager#authenticate(CryptoObject,
+ * CancellationSignal, int, AuthenticationCallback, Handler)}.
+ */
+ public static class AuthenticationResult {
+ private Face mFace;
+ private CryptoObject mCryptoObject;
+ private int mUserId;
+
+ /**
+ * Authentication result
+ *
+ * @param crypto the crypto object
+ * @param face the recognized face data, if allowed.
+ * @hide
+ */
+ public AuthenticationResult(CryptoObject crypto, Face face, int userId) {
+ mCryptoObject = crypto;
+ mFace = face;
+ mUserId = userId;
+ }
+
+ /**
+ * Obtain the crypto object associated with this transaction
+ *
+ * @return crypto object provided to {@link FaceManager#authenticate
+ * (CryptoObject,
+ * CancellationSignal, int, AuthenticationCallback, Handler)}.
+ */
+ public CryptoObject getCryptoObject() {
+ return mCryptoObject;
+ }
+
+ /**
+ * Obtain the Face associated with this operation. Applications are strongly
+ * discouraged from associating specific faces with specific applications or operations.
+ *
+ * @hide
+ */
+ public Face getFace() {
+ return mFace;
+ }
+
+ /**
+ * Obtain the userId for which this face was authenticated.
+ *
+ * @hide
+ */
+ public int getUserId() {
+ return mUserId;
+ }
+ }
+
+ /**
+ * Callback structure provided to {@link FaceManager#authenticate(CryptoObject,
+ * CancellationSignal, int, AuthenticationCallback, Handler)}. Users of {@link
+ * FaceManager#authenticate(CryptoObject, CancellationSignal,
+ * int, AuthenticationCallback, Handler) } must provide an implementation of this for listening
+ * to face events.
+ */
+ public abstract static class AuthenticationCallback
+ extends BiometricAuthenticator.AuthenticationCallback {
+
+ /**
+ * Called when an unrecoverable error has been encountered and the operation is complete.
+ * No further callbacks will be made on this object.
+ *
+ * @param errorCode An integer identifying the error message
+ * @param errString A human-readable error string that can be shown in UI
+ */
+ public void onAuthenticationError(int errorCode, CharSequence errString) {
+ }
+
+ /**
+ * Called when a recoverable error has been encountered during authentication. The help
+ * string is provided to give the user guidance for what went wrong, such as
+ * "Sensor dirty, please clean it."
+ *
+ * @param helpCode An integer identifying the error message
+ * @param helpString A human-readable string that can be shown in UI
+ */
+ public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
+ }
+
+ /**
+ * Called when a face is recognized.
+ *
+ * @param result An object containing authentication-related data
+ */
+ public void onAuthenticationSucceeded(AuthenticationResult result) {
+ }
+
+ /**
+ * Called when a face is detected but not recognized.
+ */
+ public void onAuthenticationFailed() {
+ }
+
+ /**
+ * Called when a face image has been acquired, but wasn't processed yet.
+ *
+ * @param acquireInfo one of FACE_ACQUIRED_* constants
+ * @hide
+ */
+ public void onAuthenticationAcquired(int acquireInfo) {
+ }
+ }
+
+ /**
+ * Callback structure provided to {@link FaceManager#enroll(long,
+ * EnrollmentCallback, CancellationSignal, int). Users of {@link #FaceAuthenticationManager()}
+ * must provide an implementation of this to {@link FaceManager#enroll(long,
+ * CancellationSignal, int, EnrollmentCallback) for listening to face enrollment events.
+ *
+ * @hide
+ */
+ public abstract static class EnrollmentCallback {
+
+ /**
+ * Called when an unrecoverable error has been encountered and the operation is complete.
+ * No further callbacks will be made on this object.
+ *
+ * @param errMsgId An integer identifying the error message
+ * @param errString A human-readable error string that can be shown in UI
+ */
+ public void onEnrollmentError(int errMsgId, CharSequence errString) {
+ }
+
+ /**
+ * Called when a recoverable error has been encountered during enrollment. The help
+ * string is provided to give the user guidance for what went wrong, such as
+ * "Image too dark, uncover light source" or what they need to do next, such as
+ * "Rotate face up / down."
+ *
+ * @param helpMsgId An integer identifying the error message
+ * @param helpString A human-readable string that can be shown in UI
+ */
+ public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
+ }
+
+ /**
+ * Called as each enrollment step progresses. Enrollment is considered complete when
+ * remaining reaches 0. This function will not be called if enrollment fails. See
+ * {@link EnrollmentCallback#onEnrollmentError(int, CharSequence)}
+ *
+ * @param remaining The number of remaining steps
+ */
+ public void onEnrollmentProgress(int remaining) {
+ }
+ }
+
+ /**
+ * Callback structure provided to {@link #remove}. Users of {@link FaceManager}
+ * may
+ * optionally provide an implementation of this to
+ * {@link #remove(Face, int, RemovalCallback)} for listening to face template
+ * removal events.
+ *
+ * @hide
+ */
+ public abstract static class RemovalCallback {
+
+ /**
+ * Called when the given face can't be removed.
+ *
+ * @param face The face that the call attempted to remove
+ * @param errMsgId An associated error message id
+ * @param errString An error message indicating why the face id can't be removed
+ */
+ public void onRemovalError(Face face, int errMsgId, CharSequence errString) {
+ }
+
+ /**
+ * Called when a given face is successfully removed.
+ *
+ * @param face The face template that was removed.
+ */
+ public void onRemovalSucceeded(Face face, int remaining) {
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public abstract static class LockoutResetCallback {
+
+ /**
+ * Called when lockout period expired and clients are allowed to listen for face
+ * authentication
+ * again.
+ */
+ public void onLockoutReset() {
+ }
+ }
+
+ private class OnEnrollCancelListener implements OnCancelListener {
+ @Override
+ public void onCancel() {
+ cancelEnrollment();
+ }
+ }
+
+ private class OnAuthenticationCancelListener implements OnCancelListener {
+ private CryptoObject mCrypto;
+
+ OnAuthenticationCancelListener(CryptoObject crypto) {
+ mCrypto = crypto;
+ }
+
+ @Override
+ public void onCancel() {
+ cancelAuthentication(mCrypto);
+ }
+ }
+
+ private class MyHandler extends Handler {
+ private MyHandler(Context context) {
+ super(context.getMainLooper());
+ }
+
+ private MyHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(android.os.Message msg) {
+ switch (msg.what) {
+ case MSG_ENROLL_RESULT:
+ sendEnrollResult((Face) msg.obj, msg.arg1 /* remaining */);
+ break;
+ case MSG_ACQUIRED:
+ sendAcquiredResult((Long) msg.obj /* deviceId */, msg.arg1 /* acquire info */,
+ msg.arg2 /* vendorCode */);
+ break;
+ case MSG_AUTHENTICATION_SUCCEEDED:
+ sendAuthenticatedSucceeded((Face) msg.obj, msg.arg1 /* userId */);
+ break;
+ case MSG_AUTHENTICATION_FAILED:
+ sendAuthenticatedFailed();
+ break;
+ case MSG_ERROR:
+ sendErrorResult((Long) msg.obj /* deviceId */, msg.arg1 /* errMsgId */,
+ msg.arg2 /* vendorCode */);
+ break;
+ case MSG_REMOVED:
+ sendRemovedResult((Face) msg.obj, msg.arg1 /* remaining */);
+ break;
+ }
+ }
+ };
+
+ private void sendRemovedResult(Face face, int remaining) {
+ if (mRemovalCallback == null) {
+ return;
+ }
+ if (face == null) {
+ Log.e(TAG, "Received MSG_REMOVED, but face is null");
+ return;
+ }
+ mRemovalCallback.onRemovalSucceeded(face, remaining);
+ }
+
+ private void sendErrorResult(long deviceId, int errMsgId, int vendorCode) {
+ // emulate HAL 2.1 behavior and send real errMsgId
+ final int clientErrMsgId = errMsgId == FACE_ERROR_VENDOR
+ ? (vendorCode + FACE_ERROR_VENDOR_BASE) : errMsgId;
+ if (mEnrollmentCallback != null) {
+ mEnrollmentCallback.onEnrollmentError(clientErrMsgId,
+ getErrorString(errMsgId, vendorCode));
+ } else if (mAuthenticationCallback != null) {
+ mAuthenticationCallback.onAuthenticationError(clientErrMsgId,
+ getErrorString(errMsgId, vendorCode));
+ } else if (mRemovalCallback != null) {
+ mRemovalCallback.onRemovalError(mRemovalFace, clientErrMsgId,
+ getErrorString(errMsgId, vendorCode));
+ }
+ }
+
+ private void sendEnrollResult(Face face, int remaining) {
+ if (mEnrollmentCallback != null) {
+ mEnrollmentCallback.onEnrollmentProgress(remaining);
+ }
+ }
+
+ private void sendAuthenticatedSucceeded(Face face, int userId) {
+ if (mAuthenticationCallback != null) {
+ final BiometricAuthenticator.AuthenticationResult result =
+ new BiometricAuthenticator.AuthenticationResult(mCryptoObject, face, userId);
+ mAuthenticationCallback.onAuthenticationSucceeded(result);
+ }
+ }
+
+ private void sendAuthenticatedFailed() {
+ if (mAuthenticationCallback != null) {
+ mAuthenticationCallback.onAuthenticationFailed();
+ }
+ }
+
+ private void sendAcquiredResult(long deviceId, int acquireInfo, int vendorCode) {
+ if (mAuthenticationCallback != null) {
+ mAuthenticationCallback.onAuthenticationAcquired(acquireInfo);
+ }
+ final String msg = getAcquiredString(acquireInfo, vendorCode);
+ if (msg == null) {
+ return;
+ }
+ final int clientInfo = acquireInfo == FACE_ACQUIRED_VENDOR
+ ? (vendorCode + FACE_ACQUIRED_VENDOR_BASE) : acquireInfo;
+ if (mEnrollmentCallback != null) {
+ mEnrollmentCallback.onEnrollmentHelp(clientInfo, msg);
+ } else if (mAuthenticationCallback != null) {
+ mAuthenticationCallback.onAuthenticationHelp(clientInfo, msg);
+ }
+ }
+}
diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl
new file mode 100644
index 000000000000..03bb7aeccef3
--- /dev/null
+++ b/core/java/android/hardware/face/IFaceService.aidl
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.face;
+
+import android.os.Bundle;
+import android.hardware.biometrics.IBiometricPromptReceiver;
+import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
+import android.hardware.face.IFaceServiceReceiver;
+import android.hardware.face.Face;
+
+/**
+ * Communication channel from client to the face service.
+ * @hide
+ */
+interface IFaceService {
+ // Authenticate the given sessionId with a face
+ void authenticate(IBinder token, long sessionId,
+ IFaceServiceReceiver receiver, int flags, String opPackageName,
+ in Bundle bundle, IBiometricPromptReceiver dialogReceiver);
+
+ // Cancel authentication for the given sessionId
+ void cancelAuthentication(IBinder token, String opPackageName);
+
+ // Start face enrollment
+ void enroll(IBinder token, in byte [] cryptoToken, int userId, IFaceServiceReceiver receiver,
+ int flags, String opPackageName);
+
+ // Cancel enrollment in progress
+ void cancelEnrollment(IBinder token);
+
+ // Any errors resulting from this call will be returned to the listener
+ void remove(IBinder token, int faceId, int userId, IFaceServiceReceiver receiver);
+
+ // Rename the face specified by faceId to the given name
+ void rename(int faceId, String name);
+
+ // Get the enrolled face for user.
+ List<Face> getEnrolledFaces(int userId, String opPackageName);
+
+ // Determine if HAL is loaded and ready
+ boolean isHardwareDetected(long deviceId, String opPackageName);
+
+ // Get a pre-enrollment authentication token
+ long preEnroll(IBinder token);
+
+ // Finish an enrollment sequence and invalidate the authentication token
+ int postEnroll(IBinder token);
+
+ // Determine if a user has at least one enrolled face
+ boolean hasEnrolledFaces(int userId, String opPackageName);
+
+ // Gets the number of hardware devices
+ // int getHardwareDeviceCount();
+
+ // Gets the unique device id for hardware enumerated at i
+ // long getHardwareDevice(int i);
+
+ // Gets the authenticator ID for face
+ long getAuthenticatorId(String opPackageName);
+
+ // Reset the timeout when user authenticates with strong auth (e.g. PIN, pattern or password)
+ void resetTimeout(in byte [] cryptoToken);
+
+ // Add a callback which gets notified when the face lockout period expired.
+ void addLockoutResetCallback(IBiometricServiceLockoutResetCallback callback);
+
+ // Explicitly set the active user (for enrolling work profile)
+ void setActiveUser(int uid);
+
+ // Enumerate all faces
+ void enumerate(IBinder token, int userId, IFaceServiceReceiver receiver);
+}
diff --git a/core/java/android/hardware/face/IFaceServiceReceiver.aidl b/core/java/android/hardware/face/IFaceServiceReceiver.aidl
new file mode 100644
index 000000000000..16fb69021467
--- /dev/null
+++ b/core/java/android/hardware/face/IFaceServiceReceiver.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.hardware.face;
+
+import android.hardware.face.Face;
+import android.os.Bundle;
+import android.os.UserHandle;
+
+/**
+ * Communication channel from the FaceService back to FaceAuthenticationManager.
+ * @hide
+ */
+oneway interface IFaceServiceReceiver {
+ void onEnrollResult(long deviceId, int faceId, int remaining);
+ void onAcquired(long deviceId, int acquiredInfo, int vendorCode);
+ void onAuthenticationSucceeded(long deviceId, in Face face);
+ void onAuthenticationFailed(long deviceId);
+ void onError(long deviceId, int error, int vendorCode);
+ void onRemoved(long deviceId, int faceId, int remaining);
+}
diff --git a/core/java/android/hardware/fingerprint/Fingerprint.java b/core/java/android/hardware/fingerprint/Fingerprint.java
index c7ce8fad2543..bbd3d05bfbde 100644
--- a/core/java/android/hardware/fingerprint/Fingerprint.java
+++ b/core/java/android/hardware/fingerprint/Fingerprint.java
@@ -23,62 +23,36 @@ import android.os.Parcelable;
* Container for fingerprint metadata.
* @hide
*/
-public final class Fingerprint extends BiometricAuthenticator.BiometricIdentifier {
- private CharSequence mName;
+public final class Fingerprint extends BiometricAuthenticator.Identifier {
private int mGroupId;
- private int mFingerId;
- private long mDeviceId; // physical device this is associated with
public Fingerprint(CharSequence name, int groupId, int fingerId, long deviceId) {
- mName = name;
+ super(name, fingerId, deviceId);
mGroupId = groupId;
- mFingerId = fingerId;
- mDeviceId = deviceId;
}
private Fingerprint(Parcel in) {
- mName = in.readString();
+ super(in.readString(), in.readInt(), in.readLong());
mGroupId = in.readInt();
- mFingerId = in.readInt();
- mDeviceId = in.readLong();
}
/**
- * Gets the human-readable name for the given fingerprint.
- * @return name given to finger
- */
- public CharSequence getName() { return mName; }
-
- /**
- * Gets the device-specific finger id. Used by Settings to map a name to a specific
- * fingerprint template.
- * @return device-specific id for this finger
- * @hide
- */
- public int getFingerId() { return mFingerId; }
-
- /**
* Gets the group id specified when the fingerprint was enrolled.
* @return group id for the set of fingerprints this one belongs to.
- * @hide
*/
- public int getGroupId() { return mGroupId; }
-
- /**
- * Device this fingerprint belongs to.
- * @hide
- */
- public long getDeviceId() { return mDeviceId; }
+ public int getGroupId() {
+ return mGroupId;
+ }
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
- out.writeString(mName.toString());
+ out.writeString(getName().toString());
+ out.writeInt(getBiometricId());
+ out.writeLong(getDeviceId());
out.writeInt(mGroupId);
- out.writeInt(mFingerId);
- out.writeLong(mDeviceId);
}
public static final Parcelable.Creator<Fingerprint> CREATOR
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index ebbfe1c26a9c..91926520aa94 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -34,6 +34,7 @@ import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.IBiometricPromptReceiver;
+import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.os.Binder;
import android.os.Bundle;
import android.os.CancellationSignal;
@@ -403,7 +404,8 @@ public class FingerprintManager implements BiometricFingerprintConstants {
/**
* Per-user version, see {@link FingerprintManager#authenticate(CryptoObject,
- * CancellationSignal, int, AuthenticationCallback, Handler)}
+ * CancellationSignal, int, AuthenticationCallback, Handler)}. This version does not
+ * display the BiometricPrompt.
* @param userId the user ID that the fingerprint hardware will authenticate for.
* @hide
*/
@@ -442,9 +444,7 @@ public class FingerprintManager implements BiometricFingerprintConstants {
}
/**
- * Per-user version, see {@link FingerprintManager#authenticate(CryptoObject,
- * CancellationSignal, Bundle, Executor, IBiometricPromptReceiver, AuthenticationCallback)}
- * @param userId the user ID that the fingerprint hardware will authenticate for.
+ * Per-user version. This method invokes the BiometricPrompt.
*/
private void authenticate(int userId,
@Nullable android.hardware.biometrics.CryptoObject crypto,
@@ -657,7 +657,7 @@ public class FingerprintManager implements BiometricFingerprintConstants {
if (mService != null) try {
mRemovalCallback = callback;
mRemovalFingerprint = fp;
- mService.remove(mToken, fp.getFingerId(), fp.getGroupId(), userId, mServiceReceiver);
+ mService.remove(mToken, fp.getBiometricId(), fp.getGroupId(), userId, mServiceReceiver);
} catch (RemoteException e) {
Slog.w(TAG, "Remote exception in remove: ", e);
if (callback != null) {
@@ -841,7 +841,7 @@ public class FingerprintManager implements BiometricFingerprintConstants {
try {
final PowerManager powerManager = mContext.getSystemService(PowerManager.class);
mService.addLockoutResetCallback(
- new IFingerprintServiceLockoutResetCallback.Stub() {
+ new IBiometricServiceLockoutResetCallback.Stub() {
@Override
public void onLockoutReset(long deviceId, IRemoteCallback serverCallback)
@@ -881,7 +881,7 @@ public class FingerprintManager implements BiometricFingerprintConstants {
@Override
public void handleMessage(android.os.Message msg) {
- switch(msg.what) {
+ switch (msg.what) {
case MSG_ENROLL_RESULT:
sendEnrollResult((Fingerprint) msg.obj, msg.arg1 /* remaining */);
break;
@@ -908,44 +908,44 @@ public class FingerprintManager implements BiometricFingerprintConstants {
break;
}
}
+ };
- private void sendRemovedResult(Fingerprint fingerprint, int remaining) {
- if (mRemovalCallback == null) {
- return;
- }
- if (fingerprint == null) {
- Slog.e(TAG, "Received MSG_REMOVED, but fingerprint is null");
- return;
- }
-
- int fingerId = fingerprint.getFingerId();
- int reqFingerId = mRemovalFingerprint.getFingerId();
- if (reqFingerId != 0 && fingerId != 0 && fingerId != reqFingerId) {
- Slog.w(TAG, "Finger id didn't match: " + fingerId + " != " + reqFingerId);
- return;
- }
- int groupId = fingerprint.getGroupId();
- int reqGroupId = mRemovalFingerprint.getGroupId();
- if (groupId != reqGroupId) {
- Slog.w(TAG, "Group id didn't match: " + groupId + " != " + reqGroupId);
- return;
- }
+ private void sendRemovedResult(Fingerprint fingerprint, int remaining) {
+ if (mRemovalCallback == null) {
+ return;
+ }
+ if (fingerprint == null) {
+ Slog.e(TAG, "Received MSG_REMOVED, but fingerprint is null");
+ return;
+ }
- mRemovalCallback.onRemovalSucceeded(fingerprint, remaining);
+ int fingerId = fingerprint.getBiometricId();
+ int reqFingerId = mRemovalFingerprint.getBiometricId();
+ if (reqFingerId != 0 && fingerId != 0 && fingerId != reqFingerId) {
+ Slog.w(TAG, "Finger id didn't match: " + fingerId + " != " + reqFingerId);
+ return;
+ }
+ int groupId = fingerprint.getGroupId();
+ int reqGroupId = mRemovalFingerprint.getGroupId();
+ if (groupId != reqGroupId) {
+ Slog.w(TAG, "Group id didn't match: " + groupId + " != " + reqGroupId);
+ return;
}
- private void sendEnumeratedResult(long deviceId, int fingerId, int groupId) {
- if (mEnumerateCallback != null) {
- mEnumerateCallback.onEnumerate(new Fingerprint(null, groupId, fingerId, deviceId));
- }
+ mRemovalCallback.onRemovalSucceeded(fingerprint, remaining);
+ }
+
+ private void sendEnumeratedResult(long deviceId, int fingerId, int groupId) {
+ if (mEnumerateCallback != null) {
+ mEnumerateCallback.onEnumerate(new Fingerprint(null, groupId, fingerId, deviceId));
}
+ }
- private void sendEnrollResult(Fingerprint fp, int remaining) {
- if (mEnrollmentCallback != null) {
- mEnrollmentCallback.onEnrollmentProgress(remaining);
- }
+ private void sendEnrollResult(Fingerprint fp, int remaining) {
+ if (mEnrollmentCallback != null) {
+ mEnrollmentCallback.onEnrollmentProgress(remaining);
}
- };
+ }
private void sendAuthenticatedSucceeded(Fingerprint fp, int userId) {
if (mAuthenticationCallback != null) {
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 8aa218378d5c..71a642095148 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -17,9 +17,9 @@ package android.hardware.fingerprint;
import android.os.Bundle;
import android.hardware.biometrics.IBiometricPromptReceiver;
+import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback;
import android.hardware.fingerprint.Fingerprint;
import java.util.List;
@@ -78,7 +78,7 @@ interface IFingerprintService {
void resetTimeout(in byte [] cryptoToken);
// Add a callback which gets notified when the fingerprint lockout period expired.
- void addLockoutResetCallback(IFingerprintServiceLockoutResetCallback callback);
+ void addLockoutResetCallback(IBiometricServiceLockoutResetCallback callback);
// Explicitly set the active user (for enrolling work profile)
void setActiveUser(int uid);
diff --git a/core/java/android/hardware/input/InputManagerInternal.java b/core/java/android/hardware/input/InputManagerInternal.java
index eb7ea67eb886..c4d7e400795c 100644
--- a/core/java/android/hardware/input/InputManagerInternal.java
+++ b/core/java/android/hardware/input/InputManagerInternal.java
@@ -27,7 +27,14 @@ import java.util.List;
* @hide Only for use within the system server.
*/
public abstract class InputManagerInternal {
- public abstract boolean injectInputEvent(InputEvent event, int displayId, int mode);
+ /**
+ * Inject an input event.
+ *
+ * @param event The InputEvent to inject
+ * @param mode Synchronous or asynchronous mode
+ * @return True if injection has succeeded
+ */
+ public abstract boolean injectInputEvent(InputEvent event, int mode);
/**
* Called by the display manager to set information about the displays as needed
diff --git a/core/java/android/hardware/location/NanoAppFilter.java b/core/java/android/hardware/location/NanoAppFilter.java
index 4d8e7344cd75..562065e20815 100644
--- a/core/java/android/hardware/location/NanoAppFilter.java
+++ b/core/java/android/hardware/location/NanoAppFilter.java
@@ -85,7 +85,7 @@ public class NanoAppFilter implements Parcelable {
mAppId = in.readLong();
mAppVersion = in.readInt();
mVersionRestrictionMask = in.readInt();
- mAppIdVendorMask = in.readInt();
+ mAppIdVendorMask = in.readLong();
}
public int describeContents() {
@@ -93,7 +93,6 @@ public class NanoAppFilter implements Parcelable {
}
public void writeToParcel(Parcel out, int flags) {
-
out.writeLong(mAppId);
out.writeInt(mAppVersion);
out.writeInt(mVersionRestrictionMask);
diff --git a/core/java/android/hardware/radio/RadioManager.aidl b/core/java/android/hardware/radio/RadioManager.aidl
index 8a39388482fd..34c05d89d715 100644
--- a/core/java/android/hardware/radio/RadioManager.aidl
+++ b/core/java/android/hardware/radio/RadioManager.aidl
@@ -20,6 +20,9 @@ package android.hardware.radio;
parcelable RadioManager.BandConfig;
/** @hide */
+parcelable RadioManager.BandDescriptor;
+
+/** @hide */
parcelable RadioManager.ModuleProperties;
/** @hide */
diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
index d2e3510ee3b1..0982d65ee4c9 100644
--- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
+++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java
@@ -218,7 +218,7 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
if (mInputMethodSession == null) {
// The session has been finished.
finishInputEvent(event, false);
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index b4c8a5e504bc..431c6511b1f3 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -370,19 +370,6 @@ public class InputMethodService extends AbstractInputMethodService {
InputConnection mStartedInputConnection;
EditorInfo mInputEditorInfo;
- /**
- * A token to keep tracking the last IPC that triggered
- * {@link #doStartInput(InputConnection, EditorInfo, boolean)}. If
- * {@link #doStartInput(InputConnection, EditorInfo, boolean)} was not caused by IPCs from
- * {@link com.android.server.InputMethodManagerService}, this needs to remain unchanged.
- *
- * <p>Some IPCs to {@link com.android.server.InputMethodManagerService} require this token to
- * disentangle event flows for various purposes such as better window animation and providing
- * fine-grained debugging information.</p>
- */
- @Nullable
- private IBinder mStartInputToken;
-
int mShowInputFlags;
boolean mShowInputRequested;
boolean mLastShowInputRequested;
@@ -528,7 +515,7 @@ public class InputMethodService extends AbstractInputMethodService {
public void dispatchStartInputWithToken(@Nullable InputConnection inputConnection,
@NonNull EditorInfo editorInfo, boolean restarting,
@NonNull IBinder startInputToken) {
- mStartInputToken = startInputToken;
+ mImm.reportStartInput(mToken, startInputToken);
// This needs to be dispatched to interface methods rather than doStartInput().
// Otherwise IME developers who have overridden those interface methods will lose
@@ -579,8 +566,8 @@ public class InputMethodService extends AbstractInputMethodService {
}
clearInsetOfPreviousIme();
// If user uses hard keyboard, IME button should always be shown.
- mImm.setImeWindowStatus(mToken, mStartInputToken,
- mapToImeWindowStatus(isInputViewShown()), mBackDisposition);
+ mImm.setImeWindowStatus(mToken, mapToImeWindowStatus(isInputViewShown()),
+ mBackDisposition);
if (resultReceiver != null) {
resultReceiver.send(wasVis != isInputViewShown()
? InputMethodManager.RESULT_SHOWN
@@ -1059,8 +1046,8 @@ public class InputMethodService extends AbstractInputMethodService {
}
// If user uses hard keyboard, IME button should always be shown.
boolean showing = onEvaluateInputViewShown();
- mImm.setImeWindowStatus(mToken, mStartInputToken,
- IME_ACTIVE | (showing ? IME_VISIBLE : 0), mBackDisposition);
+ mImm.setImeWindowStatus(mToken, IME_ACTIVE | (showing ? IME_VISIBLE : 0),
+ mBackDisposition);
}
}
@@ -1110,8 +1097,7 @@ public class InputMethodService extends AbstractInputMethodService {
return;
}
mBackDisposition = disposition;
- mImm.setImeWindowStatus(mToken, mStartInputToken, mapToImeWindowStatus(isInputViewShown()),
- mBackDisposition);
+ mImm.setImeWindowStatus(mToken, mapToImeWindowStatus(isInputViewShown()), mBackDisposition);
}
/**
@@ -1861,8 +1847,7 @@ public class InputMethodService extends AbstractInputMethodService {
final int nextImeWindowStatus = mapToImeWindowStatus(isInputViewShown());
if (previousImeWindowStatus != nextImeWindowStatus) {
- mImm.setImeWindowStatus(mToken, mStartInputToken, nextImeWindowStatus,
- mBackDisposition);
+ mImm.setImeWindowStatus(mToken, nextImeWindowStatus, mBackDisposition);
}
if ((previousImeWindowStatus & IME_ACTIVE) == 0) {
if (DEBUG) Log.v(TAG, "showWindow: showing!");
@@ -1887,7 +1872,7 @@ public class InputMethodService extends AbstractInputMethodService {
}
private void doHideWindow() {
- mImm.setImeWindowStatus(mToken, mStartInputToken, 0, mBackDisposition);
+ mImm.setImeWindowStatus(mToken, 0, mBackDisposition);
hideWindow();
}
@@ -2869,7 +2854,6 @@ public class InputMethodService extends AbstractInputMethodService {
p.println(" mInputStarted=" + mInputStarted
+ " mInputViewStarted=" + mInputViewStarted
+ " mCandidatesViewStarted=" + mCandidatesViewStarted);
- p.println(" mStartInputToken=" + mStartInputToken);
if (mInputEditorInfo != null) {
p.println(" mInputEditorInfo:");
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index ddb96194015e..3b3a84f82a5a 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -125,8 +125,8 @@ public class ConnectivityManager {
/**
* A temporary hack until SUPL system can get off the legacy APIS.
* They do too many network requests and the long list of apps listening
- * and waking due to the CONNECTIVITY_ACTION bcast makes it expensive.
- * Use this bcast intent instead for SUPL requests.
+ * and waking due to the CONNECTIVITY_ACTION broadcast makes it expensive.
+ * Use this broadcast intent instead for SUPL requests.
* @hide
*/
public static final String CONNECTIVITY_ACTION_SUPL =
@@ -152,7 +152,7 @@ public class ConnectivityManager {
* call {@link CaptivePortal#reportCaptivePortalDismissed} so the system can
* reevaluate the network. If reevaluation finds the network no longer
* subject to a captive portal, the network may become the default active
- * data network. </li>
+ * data network.</li>
* <li> When the app handling this action believes the user explicitly wants
* to ignore the captive portal and the network, the app should call
* {@link CaptivePortal#ignoreNetwork}. </li>
@@ -260,7 +260,8 @@ public class ConnectivityManager {
* {@hide}
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String ACTION_DATA_ACTIVITY_CHANGE = "android.net.conn.DATA_ACTIVITY_CHANGE";
+ public static final String ACTION_DATA_ACTIVITY_CHANGE =
+ "android.net.conn.DATA_ACTIVITY_CHANGE";
/**
* The lookup key for an enum that indicates the network device type on which this data activity
* change happens.
@@ -391,14 +392,14 @@ public class ConnectivityManager {
/**
* Invalid tethering type.
- * @see #startTethering(int, OnStartTetheringCallback, boolean)
+ * @see #startTethering(int, boolean, OnStartTetheringCallback)
* @hide
*/
public static final int TETHERING_INVALID = -1;
/**
* Wifi tethering type.
- * @see #startTethering(int, OnStartTetheringCallback, boolean)
+ * @see #startTethering(int, boolean, OnStartTetheringCallback)
* @hide
*/
@SystemApi
@@ -406,7 +407,7 @@ public class ConnectivityManager {
/**
* USB tethering type.
- * @see #startTethering(int, OnStartTetheringCallback, boolean)
+ * @see #startTethering(int, boolean, OnStartTetheringCallback)
* @hide
*/
@SystemApi
@@ -414,7 +415,7 @@ public class ConnectivityManager {
/**
* Bluetooth tethering type.
- * @see #startTethering(int, OnStartTetheringCallback, boolean)
+ * @see #startTethering(int, boolean, OnStartTetheringCallback)
* @hide
*/
@SystemApi
@@ -671,7 +672,7 @@ public class ConnectivityManager {
/**
* Static unique request used as a tombstone for NetworkCallbacks that have been unregistered.
* This allows to distinguish when unregistering NetworkCallbacks those that were never
- * registered and those that were already unregistered.
+ * registered from those that were already unregistered.
* @hide
*/
private static final NetworkRequest ALREADY_UNREGISTERED =
@@ -1501,8 +1502,8 @@ public class ConnectivityManager {
};
}
- private static HashMap<NetworkCapabilities, LegacyRequest> sLegacyRequests =
- new HashMap<NetworkCapabilities, LegacyRequest>();
+ private static final HashMap<NetworkCapabilities, LegacyRequest> sLegacyRequests =
+ new HashMap<>();
private NetworkRequest findRequestForFeature(NetworkCapabilities netCap) {
synchronized (sLegacyRequests) {
@@ -1642,8 +1643,9 @@ public class ConnectivityManager {
* {@code onStarted} method will be called. If an error occurs, {@code onError} will be called,
* specifying one of the {@code ERROR_*} constants in this class.
*
- * To stop an existing keepalive, call {@link stop}. The system will call {@code onStopped} if
- * the operation was successfull or {@code onError} if an error occurred.
+ * To stop an existing keepalive, call {@link PacketKeepalive#stop}. The system will call
+ * {@link PacketKeepaliveCallback#onStopped} if the operation was successful or
+ * {@link PacketKeepaliveCallback#onError} if an error occurred.
*
* @hide
*/
@@ -1904,7 +1906,7 @@ public class ConnectivityManager {
* to initiate network traffic), you can retrieve its instantaneous state with
* {@link ConnectivityManager#isDefaultNetworkActive}.
*/
- public void onNetworkActive();
+ void onNetworkActive();
}
private INetworkManagementService getNetworkManagementService() {
@@ -1919,8 +1921,7 @@ public class ConnectivityManager {
}
private final ArrayMap<OnNetworkActiveListener, INetworkActivityListener>
- mNetworkActivityListeners
- = new ArrayMap<OnNetworkActiveListener, INetworkActivityListener>();
+ mNetworkActivityListeners = new ArrayMap<>();
/**
* Start listening to reports when the system's default data network is active, meaning it is
@@ -2223,12 +2224,12 @@ public class ConnectivityManager {
/**
* Called when tethering has been successfully started.
*/
- public void onTetheringStarted() {};
+ public void onTetheringStarted() {}
/**
* Called when starting tethering failed.
*/
- public void onTetheringFailed() {};
+ public void onTetheringFailed() {}
}
/**
@@ -2665,9 +2666,6 @@ public class ConnectivityManager {
/**
* Set sign in error notification to visible or in visible
*
- * @param visible
- * @param networkType
- *
* {@hide}
* @deprecated Doesn't properly deal with multiple connected networks of the same type.
*/
@@ -2876,7 +2874,7 @@ public class ConnectivityManager {
* @hide
*/
public interface Errors {
- static int TOO_MANY_REQUESTS = 1;
+ int TOO_MANY_REQUESTS = 1;
}
/** @hide */
@@ -3133,7 +3131,7 @@ public class ConnectivityManager {
* as these {@code NetworkCapabilities} represent states that a particular
* network may never attain, and whether a network will attain these states
* is unknown prior to bringing up the network so the framework does not
- * know how to go about satisfing a request with these capabilities.
+ * know how to go about satisfying a request with these capabilities.
*
* <p>This method requires the caller to hold either the
* {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
@@ -3193,7 +3191,7 @@ public class ConnectivityManager {
* Request a network to satisfy a set of {@link android.net.NetworkCapabilities}, limited
* by a timeout.
*
- * This function behaves identically to the non-timedout version, but if a suitable
+ * This function behaves identically to the version without timeout, but if a suitable
* network is not found within the given time (in milliseconds) the
* {@link NetworkCallback#onUnavailable} callback is called. The request can still be
* released normally by calling {@link #unregisterNetworkCallback(NetworkCallback)} but does
@@ -3274,7 +3272,7 @@ public class ConnectivityManager {
* as these {@code NetworkCapabilities} represent states that a particular
* network may never attain, and whether a network will attain these states
* is unknown prior to bringing up the network so the framework does not
- * know how to go about satisfing a request with these capabilities.
+ * know how to go about satisfying a request with these capabilities.
*
* <p>This method requires the caller to hold either the
* {@link android.Manifest.permission#CHANGE_NETWORK_STATE} permission
@@ -3439,9 +3437,9 @@ public class ConnectivityManager {
// capabilities, this request is guaranteed, at all times, to be
// satisfied by the same network, if any, that satisfies the default
// request, i.e., the system default network.
- NetworkCapabilities nullCapabilities = null;
CallbackHandler cbHandler = new CallbackHandler(handler);
- sendRequestForNetwork(nullCapabilities, networkCallback, 0, REQUEST, TYPE_NONE, cbHandler);
+ sendRequestForNetwork(null /* NetworkCapabilities need */, networkCallback, 0,
+ REQUEST, TYPE_NONE, cbHandler);
}
/**
@@ -3676,7 +3674,7 @@ public class ConnectivityManager {
* @return {@code true} on success, {@code false} if the {@link Network} is no longer valid.
*/
public boolean bindProcessToNetwork(Network network) {
- // Forcing callers to call thru non-static function ensures ConnectivityManager
+ // Forcing callers to call through non-static function ensures ConnectivityManager
// instantiated.
return setProcessDefaultNetwork(network);
}
diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java
index d4c3edca4367..1145d5bd4d9a 100644
--- a/core/java/android/net/IpSecManager.java
+++ b/core/java/android/net/IpSecManager.java
@@ -20,6 +20,7 @@ import static com.android.internal.util.Preconditions.checkNotNull;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.content.Context;
@@ -720,6 +721,7 @@ public final class IpSecManager {
* to create Network objects which are accessible to the Android system.
* @hide
*/
+ @SystemApi
public static final class IpSecTunnelInterface implements AutoCloseable {
private final String mOpPackageName;
private final IIpSecService mService;
@@ -746,6 +748,7 @@ public final class IpSecManager {
* @param prefixLen length of the InetAddress prefix
* @hide
*/
+ @SystemApi
@RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public void addAddress(@NonNull InetAddress address, int prefixLen) throws IOException {
try {
@@ -767,6 +770,7 @@ public final class IpSecManager {
* @param prefixLen length of the InetAddress prefix
* @hide
*/
+ @SystemApi
@RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public void removeAddress(@NonNull InetAddress address, int prefixLen) throws IOException {
try {
@@ -880,6 +884,7 @@ public final class IpSecManager {
* @throws ResourceUnavailableException indicating that too many encapsulation sockets are open
* @hide
*/
+ @SystemApi
@NonNull
@RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public IpSecTunnelInterface createIpSecTunnelInterface(@NonNull InetAddress localAddress,
@@ -910,6 +915,7 @@ public final class IpSecManager {
* layer failure.
* @hide
*/
+ @SystemApi
@RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public void applyTunnelModeTransform(@NonNull IpSecTunnelInterface tunnel,
@PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index a12df28eac6b..23c8aa368d87 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -22,6 +22,7 @@ import static com.android.internal.util.Preconditions.checkNotNull;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.content.Context;
import android.os.Binder;
import android.os.Handler;
@@ -256,6 +257,7 @@ public final class IpSecTransform implements AutoCloseable {
*
* @hide
*/
+ @SystemApi
public static class NattKeepaliveCallback {
/** The specified {@code Network} is not connected. */
public static final int ERROR_INVALID_NETWORK = 1;
@@ -286,6 +288,7 @@ public final class IpSecTransform implements AutoCloseable {
*
* @hide
*/
+ @SystemApi
@RequiresPermission(anyOf = {
android.Manifest.permission.MANAGE_IPSEC_TUNNELS,
android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD
@@ -328,6 +331,7 @@ public final class IpSecTransform implements AutoCloseable {
*
* @hide
*/
+ @SystemApi
@RequiresPermission(anyOf = {
android.Manifest.permission.MANAGE_IPSEC_TUNNELS,
android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD
@@ -480,6 +484,7 @@ public final class IpSecTransform implements AutoCloseable {
* @throws IOException indicating other errors
* @hide
*/
+ @SystemApi
@NonNull
@RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
public IpSecTransform buildTunnelModeTransform(
diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java
index 300a78b87a41..bd2db92b7804 100644
--- a/core/java/android/net/LinkProperties.java
+++ b/core/java/android/net/LinkProperties.java
@@ -32,6 +32,7 @@ import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Objects;
+import java.util.StringJoiner;
/**
* Describes the properties of a network link.
@@ -48,13 +49,13 @@ import java.util.Objects;
public final class LinkProperties implements Parcelable {
// The interface described by the network link.
private String mIfaceName;
- private ArrayList<LinkAddress> mLinkAddresses = new ArrayList<LinkAddress>();
- private ArrayList<InetAddress> mDnses = new ArrayList<InetAddress>();
- private ArrayList<InetAddress> mValidatedPrivateDnses = new ArrayList<InetAddress>();
+ private ArrayList<LinkAddress> mLinkAddresses = new ArrayList<>();
+ private ArrayList<InetAddress> mDnses = new ArrayList<>();
+ private ArrayList<InetAddress> mValidatedPrivateDnses = new ArrayList<>();
private boolean mUsePrivateDns;
private String mPrivateDnsServerName;
private String mDomains;
- private ArrayList<RouteInfo> mRoutes = new ArrayList<RouteInfo>();
+ private ArrayList<RouteInfo> mRoutes = new ArrayList<>();
private ProxyInfo mHttpProxy;
private int mMtu;
// in the format "rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max"
@@ -66,15 +67,14 @@ public final class LinkProperties implements Parcelable {
// Stores the properties of links that are "stacked" above this link.
// Indexed by interface name to allow modification and to prevent duplicates being added.
- private Hashtable<String, LinkProperties> mStackedLinks =
- new Hashtable<String, LinkProperties>();
+ private Hashtable<String, LinkProperties> mStackedLinks = new Hashtable<>();
/**
* @hide
*/
public static class CompareResult<T> {
- public final List<T> removed = new ArrayList<T>();
- public final List<T> added = new ArrayList<T>();
+ public final List<T> removed = new ArrayList<>();
+ public final List<T> added = new ArrayList<>();
public CompareResult() {}
@@ -93,12 +93,9 @@ public final class LinkProperties implements Parcelable {
@Override
public String toString() {
- String retVal = "removed=[";
- for (T addr : removed) retVal += addr.toString() + ",";
- retVal += "] added=[";
- for (T addr : added) retVal += addr.toString() + ",";
- retVal += "]";
- return retVal;
+ return "removed=[" + TextUtils.join(",", removed)
+ + "] added=[" + TextUtils.join(",", added)
+ + "]";
}
}
@@ -120,7 +117,7 @@ public final class LinkProperties implements Parcelable {
public static ProvisioningChange compareProvisioning(
LinkProperties before, LinkProperties after) {
if (before.isProvisioned() && after.isProvisioned()) {
- // On dualstack networks, DHCPv4 renewals can occasionally fail.
+ // On dual-stack networks, DHCPv4 renewals can occasionally fail.
// When this happens, IPv6-reachable services continue to function
// normally but IPv4-only services (naturally) fail.
//
@@ -131,7 +128,7 @@ public final class LinkProperties implements Parcelable {
//
// For users, this is confusing and unexpected behaviour, and is
// not necessarily easy to diagnose. Therefore, we treat changing
- // from a dualstack network to an IPv6-only network equivalent to
+ // from a dual-stack network to an IPv6-only network equivalent to
// a total loss of provisioning.
//
// For one such example of this, see b/18867306.
@@ -139,7 +136,7 @@ public final class LinkProperties implements Parcelable {
// Additionally, losing IPv6 provisioning can result in TCP
// connections getting stuck until timeouts fire and other
// baffling failures. Therefore, loss of either IPv4 or IPv6 on a
- // previously dualstack network is deemed a lost of provisioning.
+ // previously dual-stack network is deemed a lost of provisioning.
if ((before.isIPv4Provisioned() && !after.isIPv4Provisioned()) ||
(before.isIPv6Provisioned() && !after.isIPv6Provisioned())) {
return ProvisioningChange.LOST_PROVISIONING;
@@ -165,22 +162,19 @@ public final class LinkProperties implements Parcelable {
*/
public LinkProperties(LinkProperties source) {
if (source != null) {
- mIfaceName = source.getInterfaceName();
- for (LinkAddress l : source.getLinkAddresses()) mLinkAddresses.add(l);
- for (InetAddress i : source.getDnsServers()) mDnses.add(i);
- for (InetAddress i : source.getValidatedPrivateDnsServers()) {
- mValidatedPrivateDnses.add(i);
- }
+ mIfaceName = source.mIfaceName;
+ mLinkAddresses.addAll(source.mLinkAddresses);
+ mDnses.addAll(source.mDnses);
+ mValidatedPrivateDnses.addAll(source.mValidatedPrivateDnses);
mUsePrivateDns = source.mUsePrivateDns;
mPrivateDnsServerName = source.mPrivateDnsServerName;
- mDomains = source.getDomains();
- for (RouteInfo r : source.getRoutes()) mRoutes.add(r);
- mHttpProxy = (source.getHttpProxy() == null) ?
- null : new ProxyInfo(source.getHttpProxy());
+ mDomains = source.mDomains;
+ mRoutes.addAll(source.mRoutes);
+ mHttpProxy = (source.mHttpProxy == null) ? null : new ProxyInfo(source.mHttpProxy);
for (LinkProperties l: source.mStackedLinks.values()) {
addStackedLink(l);
}
- setMtu(source.getMtu());
+ setMtu(source.mMtu);
mTcpBufferSizes = source.mTcpBufferSizes;
}
}
@@ -194,7 +188,7 @@ public final class LinkProperties implements Parcelable {
*/
public void setInterfaceName(String iface) {
mIfaceName = iface;
- ArrayList<RouteInfo> newRoutes = new ArrayList<RouteInfo>(mRoutes.size());
+ ArrayList<RouteInfo> newRoutes = new ArrayList<>(mRoutes.size());
for (RouteInfo route : mRoutes) {
newRoutes.add(routeWithInterface(route));
}
@@ -214,8 +208,8 @@ public final class LinkProperties implements Parcelable {
* @hide
*/
public List<String> getAllInterfaceNames() {
- List<String> interfaceNames = new ArrayList<String>(mStackedLinks.size() + 1);
- if (mIfaceName != null) interfaceNames.add(new String(mIfaceName));
+ List<String> interfaceNames = new ArrayList<>(mStackedLinks.size() + 1);
+ if (mIfaceName != null) interfaceNames.add(mIfaceName);
for (LinkProperties stacked: mStackedLinks.values()) {
interfaceNames.addAll(stacked.getAllInterfaceNames());
}
@@ -229,11 +223,11 @@ public final class LinkProperties implements Parcelable {
* prefix lengths for each address. This is a simplified utility alternative to
* {@link LinkProperties#getLinkAddresses}.
*
- * @return An umodifiable {@link List} of {@link InetAddress} for this link.
+ * @return An unmodifiable {@link List} of {@link InetAddress} for this link.
* @hide
*/
public List<InetAddress> getAddresses() {
- List<InetAddress> addresses = new ArrayList<InetAddress>();
+ List<InetAddress> addresses = new ArrayList<>();
for (LinkAddress linkAddress : mLinkAddresses) {
addresses.add(linkAddress.getAddress());
}
@@ -245,7 +239,7 @@ public final class LinkProperties implements Parcelable {
* @hide
*/
public List<InetAddress> getAllAddresses() {
- List<InetAddress> addresses = new ArrayList<InetAddress>();
+ List<InetAddress> addresses = new ArrayList<>();
for (LinkAddress linkAddress : mLinkAddresses) {
addresses.add(linkAddress.getAddress());
}
@@ -322,8 +316,7 @@ public final class LinkProperties implements Parcelable {
* @hide
*/
public List<LinkAddress> getAllLinkAddresses() {
- List<LinkAddress> addresses = new ArrayList<LinkAddress>();
- addresses.addAll(mLinkAddresses);
+ List<LinkAddress> addresses = new ArrayList<>(mLinkAddresses);
for (LinkProperties stacked: mStackedLinks.values()) {
addresses.addAll(stacked.getAllLinkAddresses());
}
@@ -391,7 +384,7 @@ public final class LinkProperties implements Parcelable {
/**
* Returns all the {@link InetAddress} for DNS servers on this link.
*
- * @return An umodifiable {@link List} of {@link InetAddress} for DNS servers on
+ * @return An unmodifiable {@link List} of {@link InetAddress} for DNS servers on
* this link.
*/
public List<InetAddress> getDnsServers() {
@@ -643,7 +636,7 @@ public final class LinkProperties implements Parcelable {
* @hide
*/
public void ensureDirectlyConnectedRoutes() {
- for (LinkAddress addr: mLinkAddresses) {
+ for (LinkAddress addr : mLinkAddresses) {
addRoute(new RouteInfo(addr, null, mIfaceName));
}
}
@@ -653,8 +646,7 @@ public final class LinkProperties implements Parcelable {
* @hide
*/
public List<RouteInfo> getAllRoutes() {
- List<RouteInfo> routes = new ArrayList<>();
- routes.addAll(mRoutes);
+ List<RouteInfo> routes = new ArrayList<>(mRoutes);
for (LinkProperties stacked: mStackedLinks.values()) {
routes.addAll(stacked.getAllRoutes());
}
@@ -685,7 +677,7 @@ public final class LinkProperties implements Parcelable {
/**
* Adds a stacked link.
*
- * If there is already a stacked link with the same interfacename as link,
+ * If there is already a stacked link with the same interface name as link,
* that link is replaced with link. Otherwise, link is added to the list
* of stacked links. If link is null, nothing changes.
*
@@ -725,9 +717,9 @@ public final class LinkProperties implements Parcelable {
*/
public @NonNull List<LinkProperties> getStackedLinks() {
if (mStackedLinks.isEmpty()) {
- return Collections.EMPTY_LIST;
+ return Collections.emptyList();
}
- List<LinkProperties> stacked = new ArrayList<LinkProperties>();
+ List<LinkProperties> stacked = new ArrayList<>();
for (LinkProperties link : mStackedLinks.values()) {
stacked.add(new LinkProperties(link));
}
@@ -761,57 +753,76 @@ public final class LinkProperties implements Parcelable {
@Override
public String toString() {
- String ifaceName = (mIfaceName == null ? "" : "InterfaceName: " + mIfaceName + " ");
+ // Space as a separator, so no need for spaces at start/end of the individual fragments.
+ final StringJoiner resultJoiner = new StringJoiner(" ", "{", "}");
- String linkAddresses = "LinkAddresses: [";
- for (LinkAddress addr : mLinkAddresses) linkAddresses += addr.toString() + ",";
- linkAddresses += "] ";
+ if (mIfaceName != null) {
+ resultJoiner.add("InterfaceName:");
+ resultJoiner.add(mIfaceName);
+ }
- String dns = "DnsAddresses: [";
- for (InetAddress addr : mDnses) dns += addr.getHostAddress() + ",";
- dns += "] ";
+ resultJoiner.add("LinkAddresses: [");
+ if (!mLinkAddresses.isEmpty()) {
+ resultJoiner.add(TextUtils.join(",", mLinkAddresses));
+ }
+ resultJoiner.add("]");
- String usePrivateDns = "UsePrivateDns: " + mUsePrivateDns + " ";
+ resultJoiner.add("DnsAddresses: [");
+ if (!mDnses.isEmpty()) {
+ resultJoiner.add(TextUtils.join(",", mDnses));
+ }
+ resultJoiner.add("]");
- String privateDnsServerName = "";
- if (privateDnsServerName != null) {
- privateDnsServerName = "PrivateDnsServerName: " + mPrivateDnsServerName + " ";
+ if (mUsePrivateDns) {
+ resultJoiner.add("UsePrivateDns: true");
+ }
+
+ if (mPrivateDnsServerName != null) {
+ resultJoiner.add("PrivateDnsServerName:");
+ resultJoiner.add(mPrivateDnsServerName);
}
- String validatedPrivateDns = "";
if (!mValidatedPrivateDnses.isEmpty()) {
- validatedPrivateDns = "ValidatedPrivateDnsAddresses: [";
- for (InetAddress addr : mValidatedPrivateDnses) {
- validatedPrivateDns += addr.getHostAddress() + ",";
+ final StringJoiner validatedPrivateDnsesJoiner =
+ new StringJoiner(",", "ValidatedPrivateDnsAddresses: [", "]");
+ for (final InetAddress addr : mValidatedPrivateDnses) {
+ validatedPrivateDnsesJoiner.add(addr.getHostAddress());
}
- validatedPrivateDns += "] ";
+ resultJoiner.add(validatedPrivateDnsesJoiner.toString());
}
- String domainName = "Domains: " + mDomains;
+ resultJoiner.add("Domains:");
+ resultJoiner.add(mDomains);
- String mtu = " MTU: " + mMtu;
+ resultJoiner.add("MTU:");
+ resultJoiner.add(Integer.toString(mMtu));
- String tcpBuffSizes = "";
if (mTcpBufferSizes != null) {
- tcpBuffSizes = " TcpBufferSizes: " + mTcpBufferSizes;
+ resultJoiner.add("TcpBufferSizes:");
+ resultJoiner.add(mTcpBufferSizes);
+ }
+
+ resultJoiner.add("Routes: [");
+ if (!mRoutes.isEmpty()) {
+ resultJoiner.add(TextUtils.join(",", mRoutes));
}
+ resultJoiner.add("]");
- String routes = " Routes: [";
- for (RouteInfo route : mRoutes) routes += route.toString() + ",";
- routes += "] ";
- String proxy = (mHttpProxy == null ? "" : " HttpProxy: " + mHttpProxy.toString() + " ");
+ if (mHttpProxy != null) {
+ resultJoiner.add("HttpProxy:");
+ resultJoiner.add(mHttpProxy.toString());
+ }
- String stacked = "";
- if (mStackedLinks.values().size() > 0) {
- stacked += " Stacked: [";
- for (LinkProperties link: mStackedLinks.values()) {
- stacked += " [" + link.toString() + " ],";
+ final Collection<LinkProperties> stackedLinksValues = mStackedLinks.values();
+ if (!stackedLinksValues.isEmpty()) {
+ final StringJoiner stackedLinksJoiner = new StringJoiner(",", "Stacked: [", "]");
+ for (final LinkProperties lp : stackedLinksValues) {
+ stackedLinksJoiner.add("[ " + lp + " ]");
}
- stacked += "] ";
+ resultJoiner.add(stackedLinksJoiner.toString());
}
- return "{" + ifaceName + linkAddresses + routes + dns + usePrivateDns
- + privateDnsServerName + domainName + mtu + tcpBuffSizes + proxy
- + stacked + "}";
+
+ return resultJoiner.toString();
}
/**
@@ -1028,7 +1039,7 @@ public final class LinkProperties implements Parcelable {
if (mDomains == null) {
if (targetDomains != null) return false;
} else {
- if (mDomains.equals(targetDomains) == false) return false;
+ if (!mDomains.equals(targetDomains)) return false;
}
return (mDnses.size() == targetDnses.size()) ?
mDnses.containsAll(targetDnses) : false;
@@ -1130,7 +1141,6 @@ public final class LinkProperties implements Parcelable {
return Objects.equals(mTcpBufferSizes, target.mTcpBufferSizes);
}
- @Override
/**
* Compares this {@code LinkProperties} instance against the target
* LinkProperties in {@code obj}. Two LinkPropertieses are equal if
@@ -1145,13 +1155,14 @@ public final class LinkProperties implements Parcelable {
* @param obj the object to be tested for equality.
* @return {@code true} if both objects are equal, {@code false} otherwise.
*/
+ @Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof LinkProperties)) return false;
LinkProperties target = (LinkProperties) obj;
- /**
+ /*
* This method does not check that stacked interfaces are equal, because
* stacked interfaces are not so much a property of the link as a
* description of connections between links.
@@ -1258,12 +1269,13 @@ public final class LinkProperties implements Parcelable {
}
- @Override
/**
- * generate hashcode based on significant fields
+ * Generate hashcode based on significant fields
+ *
* Equal objects must produce the same hash code, while unequal objects
* may have the same hash codes.
*/
+ @Override
public int hashCode() {
return ((null == mIfaceName) ? 0 : mIfaceName.hashCode()
+ mLinkAddresses.size() * 31
@@ -1313,7 +1325,7 @@ public final class LinkProperties implements Parcelable {
} else {
dest.writeByte((byte)0);
}
- ArrayList<LinkProperties> stackedLinks = new ArrayList(mStackedLinks.values());
+ ArrayList<LinkProperties> stackedLinks = new ArrayList<>(mStackedLinks.values());
dest.writeList(stackedLinks);
}
@@ -1331,7 +1343,7 @@ public final class LinkProperties implements Parcelable {
}
int addressCount = in.readInt();
for (int i = 0; i < addressCount; i++) {
- netProp.addLinkAddress((LinkAddress) in.readParcelable(null));
+ netProp.addLinkAddress(in.readParcelable(null));
}
addressCount = in.readInt();
for (int i = 0; i < addressCount; i++) {
@@ -1353,10 +1365,10 @@ public final class LinkProperties implements Parcelable {
netProp.setTcpBufferSizes(in.readString());
addressCount = in.readInt();
for (int i = 0; i < addressCount; i++) {
- netProp.addRoute((RouteInfo) in.readParcelable(null));
+ netProp.addRoute(in.readParcelable(null));
}
if (in.readByte() == 1) {
- netProp.setHttpProxy((ProxyInfo) in.readParcelable(null));
+ netProp.setHttpProxy(in.readParcelable(null));
}
ArrayList<LinkProperties> stackedLinks = new ArrayList<LinkProperties>();
in.readList(stackedLinks, LinkProperties.class.getClassLoader());
@@ -1377,10 +1389,9 @@ public final class LinkProperties implements Parcelable {
*/
public static boolean isValidMtu(int mtu, boolean ipv6) {
if (ipv6) {
- if (mtu >= MIN_MTU_V6 && mtu <= MAX_MTU) return true;
+ return mtu >= MIN_MTU_V6 && mtu <= MAX_MTU;
} else {
- if (mtu >= MIN_MTU && mtu <= MAX_MTU) return true;
+ return mtu >= MIN_MTU && mtu <= MAX_MTU;
}
- return false;
}
}
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index d75d4391dee3..512e35e70726 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -142,7 +142,7 @@ public class Network implements Parcelable {
/**
* Specify whether or not Private DNS should be bypassed when attempting
- * to use {@link getAllByName()}/{@link getByName()} methods on the given
+ * to use {@link #getAllByName(String)}/{@link #getByName(String)} methods on the given
* instance for hostname resolution.
*
* @hide
@@ -169,13 +169,6 @@ public class Network implements Parcelable {
* A {@code SocketFactory} that produces {@code Socket}'s bound to this network.
*/
private class NetworkBoundSocketFactory extends SocketFactory {
- private final int mNetId;
-
- public NetworkBoundSocketFactory(int netId) {
- super();
- mNetId = netId;
- }
-
private Socket connectToHost(String host, int port, SocketAddress localAddress)
throws IOException {
// Lookup addresses only on this Network.
@@ -201,7 +194,8 @@ public class Network implements Parcelable {
}
@Override
- public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
+ public Socket createSocket(String host, int port, InetAddress localHost, int localPort)
+ throws IOException {
return connectToHost(host, port, new InetSocketAddress(localHost, localPort));
}
@@ -265,7 +259,7 @@ public class Network implements Parcelable {
if (mNetworkBoundSocketFactory == null) {
synchronized (mLock) {
if (mNetworkBoundSocketFactory == null) {
- mNetworkBoundSocketFactory = new NetworkBoundSocketFactory(netId);
+ mNetworkBoundSocketFactory = new NetworkBoundSocketFactory();
}
}
}
@@ -475,7 +469,7 @@ public class Network implements Parcelable {
@Override
public boolean equals(Object obj) {
- if (obj instanceof Network == false) return false;
+ if (!(obj instanceof Network)) return false;
Network other = (Network)obj;
return this.netId == other.netId;
}
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index e3a110706c45..72b4bfd57d96 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -400,7 +400,7 @@ public final class NetworkCapabilities implements Parcelable {
/**
* Removes (if found) the given capability from this {@code NetworkCapability} instance.
* <p>
- * Note that this method removes capabilities that was added via {@link #addCapability(int)},
+ * Note that this method removes capabilities that were added via {@link #addCapability(int)},
* {@link #addUnwantedCapability(int)} or {@link #setCapabilities(int[], int[])} .
*
* @param capability the capability to be removed.
@@ -490,6 +490,7 @@ public final class NetworkCapabilities implements Parcelable {
&& ((mUnwantedNetworkCapabilities & (1 << capability)) != 0);
}
+ /** Note this method may result in having the same capability in wanted and unwanted lists. */
private void combineNetCapabilities(NetworkCapabilities nc) {
this.mNetworkCapabilities |= nc.mNetworkCapabilities;
this.mUnwantedNetworkCapabilities |= nc.mUnwantedNetworkCapabilities;
@@ -1213,7 +1214,11 @@ public final class NetworkCapabilities implements Parcelable {
}
/**
- * Combine a set of Capabilities to this one. Useful for coming up with the complete set
+ * Combine a set of Capabilities to this one. Useful for coming up with the complete set.
+ * <p>
+ * Note that this method may break an invariant of having a particular capability in either
+ * wanted or unwanted lists but never in both. Requests that have the same capability in
+ * both lists will never be satisfied.
* @hide
*/
public void combineCapabilities(NetworkCapabilities nc) {
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index 4817813cab1b..1f53587f3a96 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -19,11 +19,13 @@ package android.net;
import android.os.SystemProperties;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.RoSystemProperties;
import com.android.org.conscrypt.Conscrypt;
import com.android.org.conscrypt.OpenSSLContextImpl;
import com.android.org.conscrypt.OpenSSLSocketImpl;
import com.android.org.conscrypt.SSLClientSessionCache;
+
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
@@ -31,6 +33,7 @@ import java.net.SocketException;
import java.security.KeyManagementException;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
+
import javax.net.SocketFactory;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
@@ -311,8 +314,10 @@ public class SSLCertificateSocketFactory extends SSLSocketFactory {
/**
* Returns an array containing the concatenation of length-prefixed byte
* strings.
+ * @hide
*/
- static byte[] toLengthPrefixedList(byte[]... items) {
+ @VisibleForTesting
+ public static byte[] toLengthPrefixedList(byte[]... items) {
if (items.length == 0) {
throw new IllegalArgumentException("items.length == 0");
}
diff --git a/core/java/android/net/http/HttpResponseCache.java b/core/java/android/net/http/HttpResponseCache.java
index 729aff0ce278..7da76d119ce4 100644
--- a/core/java/android/net/http/HttpResponseCache.java
+++ b/core/java/android/net/http/HttpResponseCache.java
@@ -16,9 +16,8 @@
package android.net.http;
-import com.android.okhttp.Cache;
-import com.android.okhttp.AndroidShimResponseCache;
-import com.android.okhttp.OkCacheContainer;
+import com.android.okhttp.internalandroidapi.AndroidResponseCacheAdapter;
+import com.android.okhttp.internalandroidapi.HasCacheHolder;
import java.io.Closeable;
import java.io.File;
@@ -149,12 +148,12 @@ import java.util.Map;
* } catch (Exception httpResponseCacheNotAvailable) {
* }}</pre>
*/
-public final class HttpResponseCache extends ResponseCache implements Closeable, OkCacheContainer {
+public final class HttpResponseCache extends ResponseCache implements HasCacheHolder, Closeable {
- private final AndroidShimResponseCache delegate;
+ private final AndroidResponseCacheAdapter mDelegate;
- private HttpResponseCache(AndroidShimResponseCache delegate) {
- this.delegate = delegate;
+ private HttpResponseCache(AndroidResponseCacheAdapter delegate) {
+ mDelegate = delegate;
}
/**
@@ -184,30 +183,33 @@ public final class HttpResponseCache extends ResponseCache implements Closeable,
ResponseCache installed = ResponseCache.getDefault();
if (installed instanceof HttpResponseCache) {
HttpResponseCache installedResponseCache = (HttpResponseCache) installed;
+ CacheHolder cacheHolder = installedResponseCache.getCacheHolder();
// don't close and reopen if an equivalent cache is already installed
- AndroidShimResponseCache trueResponseCache = installedResponseCache.delegate;
- if (trueResponseCache.isEquivalent(directory, maxSize)) {
+ if (cacheHolder.isEquivalent(directory, maxSize)) {
return installedResponseCache;
} else {
// The HttpResponseCache that owns this object is about to be replaced.
- trueResponseCache.close();
+ installedResponseCache.close();
}
}
- AndroidShimResponseCache trueResponseCache =
- AndroidShimResponseCache.create(directory, maxSize);
- HttpResponseCache newResponseCache = new HttpResponseCache(trueResponseCache);
- ResponseCache.setDefault(newResponseCache);
- return newResponseCache;
+ CacheHolder cacheHolder = CacheHolder.create(directory, maxSize);
+ AndroidResponseCacheAdapter androidResponseCacheAdapter =
+ new AndroidResponseCacheAdapter(cacheHolder);
+ HttpResponseCache responseCache = new HttpResponseCache(androidResponseCacheAdapter);
+ ResponseCache.setDefault(responseCache);
+ return responseCache;
}
- @Override public CacheResponse get(URI uri, String requestMethod,
+ @Override
+ public CacheResponse get(URI uri, String requestMethod,
Map<String, List<String>> requestHeaders) throws IOException {
- return delegate.get(uri, requestMethod, requestHeaders);
+ return mDelegate.get(uri, requestMethod, requestHeaders);
}
- @Override public CacheRequest put(URI uri, URLConnection urlConnection) throws IOException {
- return delegate.put(uri, urlConnection);
+ @Override
+ public CacheRequest put(URI uri, URLConnection urlConnection) throws IOException {
+ return mDelegate.put(uri, urlConnection);
}
/**
@@ -217,7 +219,7 @@ public final class HttpResponseCache extends ResponseCache implements Closeable,
*/
public long size() {
try {
- return delegate.size();
+ return mDelegate.getSize();
} catch (IOException e) {
// This can occur if the cache failed to lazily initialize.
return -1;
@@ -229,7 +231,7 @@ public final class HttpResponseCache extends ResponseCache implements Closeable,
* its data.
*/
public long maxSize() {
- return delegate.maxSize();
+ return mDelegate.getMaxSize();
}
/**
@@ -239,7 +241,7 @@ public final class HttpResponseCache extends ResponseCache implements Closeable,
*/
public void flush() {
try {
- delegate.flush();
+ mDelegate.flush();
} catch (IOException ignored) {
}
}
@@ -249,7 +251,7 @@ public final class HttpResponseCache extends ResponseCache implements Closeable,
* supply a response or validate a locally cached response.
*/
public int getNetworkCount() {
- return delegate.getNetworkCount();
+ return mDelegate.getNetworkCount();
}
/**
@@ -258,7 +260,7 @@ public final class HttpResponseCache extends ResponseCache implements Closeable,
* validated over the network.
*/
public int getHitCount() {
- return delegate.getHitCount();
+ return mDelegate.getHitCount();
}
/**
@@ -267,18 +269,19 @@ public final class HttpResponseCache extends ResponseCache implements Closeable,
* to handle a redirects and retries.
*/
public int getRequestCount() {
- return delegate.getRequestCount();
+ return mDelegate.getRequestCount();
}
/**
* Uninstalls the cache and releases any active resources. Stored contents
* will remain on the filesystem.
*/
- @Override public void close() throws IOException {
+ @Override
+ public void close() throws IOException {
if (ResponseCache.getDefault() == this) {
ResponseCache.setDefault(null);
}
- delegate.close();
+ mDelegate.close();
}
/**
@@ -288,13 +291,12 @@ public final class HttpResponseCache extends ResponseCache implements Closeable,
if (ResponseCache.getDefault() == this) {
ResponseCache.setDefault(null);
}
- delegate.delete();
+ mDelegate.delete();
}
/** @hide Needed for OkHttp integration. */
@Override
- public Cache getCache() {
- return delegate.getCache();
+ public CacheHolder getCacheHolder() {
+ return mDelegate.getCacheHolder();
}
-
}
diff --git a/core/java/android/nfc/NdefMessage.java b/core/java/android/nfc/NdefMessage.java
index 5df9272c9fea..0bb110885322 100644
--- a/core/java/android/nfc/NdefMessage.java
+++ b/core/java/android/nfc/NdefMessage.java
@@ -16,12 +16,12 @@
package android.nfc;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-
import android.os.Parcel;
import android.os.Parcelable;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
/**
* Represents an immutable NDEF Message.
@@ -187,7 +187,7 @@ public final class NdefMessage implements Parcelable {
* short record (SR) format and omit the identifier field when possible.
*
* @return NDEF Message in binary format
- * @see getByteArrayLength
+ * @see #getByteArrayLength()
*/
public byte[] toByteArray() {
int length = getByteArrayLength();
diff --git a/core/java/android/nfc/tech/MifareClassic.java b/core/java/android/nfc/tech/MifareClassic.java
index c7c07532d923..22a2e45c331b 100644
--- a/core/java/android/nfc/tech/MifareClassic.java
+++ b/core/java/android/nfc/tech/MifareClassic.java
@@ -324,7 +324,7 @@ public final class MifareClassic extends BasicTagTechnology {
* <p>Successful authentication of a sector with key A enables other
* I/O operations on that sector. The set of operations granted by key A
* key depends on the ACL bits set in that sector. For more information
- * see the MIFARE Classic specification on {@see http://www.nxp.com}.
+ * see the MIFARE Classic specification on <a href="http://www.nxp.com">http://www.nxp.com</a>.
*
* <p>A failed authentication attempt causes an implicit reconnection to the
* tag, so authentication to other sectors will be lost.
@@ -351,7 +351,7 @@ public final class MifareClassic extends BasicTagTechnology {
* <p>Successful authentication of a sector with key B enables other
* I/O operations on that sector. The set of operations granted by key B
* depends on the ACL bits set in that sector. For more information
- * see the MIFARE Classic specification on {@see http://www.nxp.com}.
+ * see the MIFARE Classic specification on <a href="http://www.nxp.com">http://www.nxp.com</a>.
*
* <p>A failed authentication attempt causes an implicit reconnection to the
* tag, so authentication to other sectors will be lost.
diff --git a/core/java/android/os/BatteryProperties.java b/core/java/android/os/BatteryProperties.java
deleted file mode 100644
index af328d0943ef..000000000000
--- a/core/java/android/os/BatteryProperties.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Copyright 2013, 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.os;
-
-/**
- * {@hide}
- */
-public class BatteryProperties implements Parcelable {
- public boolean chargerAcOnline;
- public boolean chargerUsbOnline;
- public boolean chargerWirelessOnline;
- public int maxChargingCurrent;
- public int maxChargingVoltage;
- public int batteryStatus;
- public int batteryHealth;
- public boolean batteryPresent;
- public int batteryLevel;
- public int batteryVoltage;
- public int batteryTemperature;
- public int batteryFullCharge;
- public int batteryChargeCounter;
- public String batteryTechnology;
-
- public BatteryProperties() {
- }
-
- public void set(BatteryProperties other) {
- chargerAcOnline = other.chargerAcOnline;
- chargerUsbOnline = other.chargerUsbOnline;
- chargerWirelessOnline = other.chargerWirelessOnline;
- maxChargingCurrent = other.maxChargingCurrent;
- maxChargingVoltage = other.maxChargingVoltage;
- batteryStatus = other.batteryStatus;
- batteryHealth = other.batteryHealth;
- batteryPresent = other.batteryPresent;
- batteryLevel = other.batteryLevel;
- batteryVoltage = other.batteryVoltage;
- batteryTemperature = other.batteryTemperature;
- batteryFullCharge = other.batteryFullCharge;
- batteryChargeCounter = other.batteryChargeCounter;
- batteryTechnology = other.batteryTechnology;
- }
-
- /*
- * Parcel read/write code must be kept in sync with
- * frameworks/native/services/batteryservice/BatteryProperties.cpp
- */
-
- private BatteryProperties(Parcel p) {
- chargerAcOnline = p.readInt() == 1 ? true : false;
- chargerUsbOnline = p.readInt() == 1 ? true : false;
- chargerWirelessOnline = p.readInt() == 1 ? true : false;
- maxChargingCurrent = p.readInt();
- maxChargingVoltage = p.readInt();
- batteryStatus = p.readInt();
- batteryHealth = p.readInt();
- batteryPresent = p.readInt() == 1 ? true : false;
- batteryLevel = p.readInt();
- batteryVoltage = p.readInt();
- batteryTemperature = p.readInt();
- batteryFullCharge = p.readInt();
- batteryChargeCounter = p.readInt();
- batteryTechnology = p.readString();
- }
-
- public void writeToParcel(Parcel p, int flags) {
- p.writeInt(chargerAcOnline ? 1 : 0);
- p.writeInt(chargerUsbOnline ? 1 : 0);
- p.writeInt(chargerWirelessOnline ? 1 : 0);
- p.writeInt(maxChargingCurrent);
- p.writeInt(maxChargingVoltage);
- p.writeInt(batteryStatus);
- p.writeInt(batteryHealth);
- p.writeInt(batteryPresent ? 1 : 0);
- p.writeInt(batteryLevel);
- p.writeInt(batteryVoltage);
- p.writeInt(batteryTemperature);
- p.writeInt(batteryFullCharge);
- p.writeInt(batteryChargeCounter);
- p.writeString(batteryTechnology);
- }
-
- public static final Parcelable.Creator<BatteryProperties> CREATOR
- = new Parcelable.Creator<BatteryProperties>() {
- public BatteryProperties createFromParcel(Parcel p) {
- return new BatteryProperties(p);
- }
-
- public BatteryProperties[] newArray(int size) {
- return new BatteryProperties[size];
- }
- };
-
- public int describeContents() {
- return 0;
- }
-}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 221abed92f81..9cf7de586d17 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -247,8 +247,10 @@ public abstract class BatteryStats implements Parcelable {
* - Deferred job metrics.
* New in version 32:
* - Ambient display properly output in data dump.
+ * New in version 33:
+ * - Fixed bug in min learned capacity updating process.
*/
- static final int CHECKIN_VERSION = 32;
+ static final int CHECKIN_VERSION = 33;
/**
* Old version, we hit 9 and ran out of room, need to remove.
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index 8e8565c3574c..175b40513a01 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -21,7 +21,6 @@ import android.annotation.Nullable;
import android.util.ExceptionUtils;
import android.util.Log;
import android.util.Slog;
-import android.util.SparseIntArray;
import com.android.internal.os.BinderCallsStats;
import com.android.internal.os.BinderInternal;
@@ -35,12 +34,7 @@ import libcore.util.NativeAllocationRegistry;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
/**
* Base class for a remotable object, the core part of a lightweight
@@ -551,6 +545,20 @@ public class Binder implements IBinder {
}
/**
+ * Resolves a transaction code to a human readable name.
+ *
+ * <p>Default implementation is a stub that returns null.
+ * <p>AIDL generated code will return the original method name.
+ *
+ * @param transactionCode The code to resolve.
+ * @return A human readable name.
+ * @hide
+ */
+ public @Nullable String getTransactionName(int transactionCode) {
+ return null;
+ }
+
+ /**
* Implemented to call the more convenient version
* {@link #dump(FileDescriptor, PrintWriter, String[])}.
*/
@@ -607,7 +615,7 @@ public class Binder implements IBinder {
/**
* Print the object's state into the given stream.
- *
+ *
* @param fd The raw file descriptor that the dump is being sent to.
* @param fout The file to which you should dump your state. This will be
* closed for you after you return.
@@ -730,6 +738,7 @@ public class Binder implements IBinder {
}
res = onTransact(code, data, reply, flags);
} catch (RemoteException|RuntimeException e) {
+ binderCallsStats.callThrewException(callSession, e);
if (LOG_RUNTIME_EXCEPTION) {
Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
}
@@ -750,6 +759,8 @@ public class Binder implements IBinder {
}
}
checkParcel(this, code, reply, "Unreasonably large binder reply buffer");
+ int replySizeBytes = reply.dataSize();
+ int requestSizeBytes = data.dataSize();
reply.recycle();
data.recycle();
@@ -759,448 +770,9 @@ public class Binder implements IBinder {
// to the main transaction loop to wait for another incoming transaction. Either
// way, strict mode begone!
StrictMode.clearGatheredViolations();
- binderCallsStats.callEnded(callSession);
+ binderCallsStats.callEnded(callSession, requestSizeBytes, replySizeBytes);
return res;
}
}
-/**
- * Java proxy for a native IBinder object.
- * Allocated and constructed by the native javaObjectforIBinder function. Never allocated
- * directly from Java code.
- */
-final class BinderProxy implements IBinder {
- // See android_util_Binder.cpp for the native half of this.
-
- // Assume the process-wide default value when created
- volatile boolean mWarnOnBlocking = Binder.sWarnOnBlocking;
-
- /*
- * Map from longs to BinderProxy, retaining only a WeakReference to the BinderProxies.
- * We roll our own only because we need to lazily remove WeakReferences during accesses
- * to avoid accumulating junk WeakReference objects. WeakHashMap isn't easily usable
- * because we want weak values, not keys.
- * Our hash table is never resized, but the number of entries is unlimited;
- * performance degrades as occupancy increases significantly past MAIN_INDEX_SIZE.
- * Not thread-safe. Client ensures there's a single access at a time.
- */
- private static final class ProxyMap {
- private static final int LOG_MAIN_INDEX_SIZE = 8;
- private static final int MAIN_INDEX_SIZE = 1 << LOG_MAIN_INDEX_SIZE;
- private static final int MAIN_INDEX_MASK = MAIN_INDEX_SIZE - 1;
- // Debuggable builds will throw an AssertionError if the number of map entries exceeds:
- private static final int CRASH_AT_SIZE = 20_000;
-
- /**
- * We next warn when we exceed this bucket size.
- */
- private int mWarnBucketSize = 20;
-
- /**
- * Increment mWarnBucketSize by WARN_INCREMENT each time we warn.
- */
- private static final int WARN_INCREMENT = 10;
-
- /**
- * Hash function tailored to native pointers.
- * Returns a value < MAIN_INDEX_SIZE.
- */
- private static int hash(long arg) {
- return ((int) ((arg >> 2) ^ (arg >> (2 + LOG_MAIN_INDEX_SIZE)))) & MAIN_INDEX_MASK;
- }
-
- /**
- * Return the total number of pairs in the map.
- */
- private int size() {
- int size = 0;
- for (ArrayList<WeakReference<BinderProxy>> a : mMainIndexValues) {
- if (a != null) {
- size += a.size();
- }
- }
- return size;
- }
-
- /**
- * Return the total number of pairs in the map containing values that have
- * not been cleared. More expensive than the above size function.
- */
- private int unclearedSize() {
- int size = 0;
- for (ArrayList<WeakReference<BinderProxy>> a : mMainIndexValues) {
- if (a != null) {
- for (WeakReference<BinderProxy> ref : a) {
- if (ref.get() != null) {
- ++size;
- }
- }
- }
- }
- return size;
- }
-
- /**
- * Remove ith entry from the hash bucket indicated by hash.
- */
- private void remove(int hash, int index) {
- Long[] keyArray = mMainIndexKeys[hash];
- ArrayList<WeakReference<BinderProxy>> valueArray = mMainIndexValues[hash];
- int size = valueArray.size(); // KeyArray may have extra elements.
- // Move last entry into empty slot, and truncate at end.
- if (index != size - 1) {
- keyArray[index] = keyArray[size - 1];
- valueArray.set(index, valueArray.get(size - 1));
- }
- valueArray.remove(size - 1);
- // Just leave key array entry; it's unused. We only trust the valueArray size.
- }
-
- /**
- * Look up the supplied key. If we have a non-cleared entry for it, return it.
- */
- BinderProxy get(long key) {
- int myHash = hash(key);
- Long[] keyArray = mMainIndexKeys[myHash];
- if (keyArray == null) {
- return null;
- }
- ArrayList<WeakReference<BinderProxy>> valueArray = mMainIndexValues[myHash];
- int bucketSize = valueArray.size();
- for (int i = 0; i < bucketSize; ++i) {
- long foundKey = keyArray[i];
- if (key == foundKey) {
- WeakReference<BinderProxy> wr = valueArray.get(i);
- BinderProxy bp = wr.get();
- if (bp != null) {
- return bp;
- } else {
- remove(myHash, i);
- return null;
- }
- }
- }
- return null;
- }
-
- private int mRandom; // A counter used to generate a "random" index. World's 2nd worst RNG.
-
- /**
- * Add the key-value pair to the map.
- * Requires that the indicated key is not already in the map.
- */
- void set(long key, @NonNull BinderProxy value) {
- int myHash = hash(key);
- ArrayList<WeakReference<BinderProxy>> valueArray = mMainIndexValues[myHash];
- if (valueArray == null) {
- valueArray = mMainIndexValues[myHash] = new ArrayList<>();
- mMainIndexKeys[myHash] = new Long[1];
- }
- int size = valueArray.size();
- WeakReference<BinderProxy> newWr = new WeakReference<>(value);
- // First look for a cleared reference.
- // This ensures that ArrayList size is bounded by the maximum occupancy of
- // that bucket.
- for (int i = 0; i < size; ++i) {
- if (valueArray.get(i).get() == null) {
- valueArray.set(i, newWr);
- Long[] keyArray = mMainIndexKeys[myHash];
- keyArray[i] = key;
- if (i < size - 1) {
- // "Randomly" check one of the remaining entries in [i+1, size), so that
- // needlessly long buckets are eventually pruned.
- int rnd = Math.floorMod(++mRandom, size - (i + 1));
- if (valueArray.get(i + 1 + rnd).get() == null) {
- remove(myHash, i + 1 + rnd);
- }
- }
- return;
- }
- }
- valueArray.add(size, newWr);
- Long[] keyArray = mMainIndexKeys[myHash];
- if (keyArray.length == size) {
- // size >= 1, since we initially allocated one element
- Long[] newArray = new Long[size + size / 2 + 2];
- System.arraycopy(keyArray, 0, newArray, 0, size);
- newArray[size] = key;
- mMainIndexKeys[myHash] = newArray;
- } else {
- keyArray[size] = key;
- }
- if (size >= mWarnBucketSize) {
- final int totalSize = size();
- Log.v(Binder.TAG, "BinderProxy map growth! bucket size = " + size
- + " total = " + totalSize);
- mWarnBucketSize += WARN_INCREMENT;
- if (Build.IS_DEBUGGABLE && totalSize >= CRASH_AT_SIZE) {
- // Use the number of uncleared entries to determine whether we should
- // really report a histogram and crash. We don't want to fundamentally
- // change behavior for a debuggable process, so we GC only if we are
- // about to crash.
- final int totalUnclearedSize = unclearedSize();
- if (totalUnclearedSize >= CRASH_AT_SIZE) {
- dumpProxyInterfaceCounts();
- dumpPerUidProxyCounts();
- Runtime.getRuntime().gc();
- throw new AssertionError("Binder ProxyMap has too many entries: "
- + totalSize + " (total), " + totalUnclearedSize + " (uncleared), "
- + unclearedSize() + " (uncleared after GC). BinderProxy leak?");
- } else if (totalSize > 3 * totalUnclearedSize / 2) {
- Log.v(Binder.TAG, "BinderProxy map has many cleared entries: "
- + (totalSize - totalUnclearedSize) + " of " + totalSize
- + " are cleared");
- }
- }
- }
- }
-
- /**
- * Dump a histogram to the logcat. Used to diagnose abnormally large proxy maps.
- */
- private void dumpProxyInterfaceCounts() {
- 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();
- } 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()]);
- Arrays.sort(sorted, (Map.Entry<String, Integer> a, Map.Entry<String, Integer> b)
- -> b.getValue().compareTo(a.getValue()));
- Log.v(Binder.TAG, "BinderProxy descriptor histogram (top ten):");
- int printLength = Math.min(10, sorted.length);
- for (int i = 0; i < printLength; i++) {
- Log.v(Binder.TAG, " #" + (i + 1) + ": " + sorted[i].getKey() + " x"
- + sorted[i].getValue());
- }
- }
-
- /**
- * Dump per uid binder proxy counts to the logcat.
- */
- private void dumpPerUidProxyCounts() {
- SparseIntArray counts = BinderInternal.nGetBinderProxyPerUidCounts();
- if (counts.size() == 0) return;
- Log.d(Binder.TAG, "Per Uid Binder Proxy Counts:");
- for (int i = 0; i < counts.size(); i++) {
- final int uid = counts.keyAt(i);
- final int binderCount = counts.valueAt(i);
- Log.d(Binder.TAG, "UID : " + uid + " count = " + binderCount);
- }
- }
-
- // Corresponding ArrayLists in the following two arrays always have the same size.
- // They contain no empty entries. However WeakReferences in the values ArrayLists
- // may have been cleared.
-
- // mMainIndexKeys[i][j] corresponds to mMainIndexValues[i].get(j) .
- // The values ArrayList has the proper size(), the corresponding keys array
- // is always at least the same size, but may be larger.
- // If either a particular keys array, or the corresponding values ArrayList
- // are null, then they both are.
- private final Long[][] mMainIndexKeys = new Long[MAIN_INDEX_SIZE][];
- private final ArrayList<WeakReference<BinderProxy>>[] mMainIndexValues =
- new ArrayList[MAIN_INDEX_SIZE];
- }
-
- private static ProxyMap sProxyMap = new ProxyMap();
-
- /**
- * Dump proxy debug information.
- *
- * Note: this method is not thread-safe; callers must serialize with other
- * accesses to sProxyMap, in particular {@link #getInstance(long, long)}.
- *
- * @hide
- */
- private static void dumpProxyDebugInfo() {
- if (Build.IS_DEBUGGABLE) {
- sProxyMap.dumpProxyInterfaceCounts();
- // Note that we don't call dumpPerUidProxyCounts(); this is because this
- // method may be called as part of the uid limit being hit, and calling
- // back into the UID tracking code would cause us to try to acquire a mutex
- // that is held during that callback.
- }
- }
-
- /**
- * Return a BinderProxy for IBinder.
- * This method is thread-hostile! The (native) caller serializes getInstance() calls using
- * gProxyLock.
- * If we previously returned a BinderProxy bp for the same iBinder, and bp is still
- * in use, then we return the same bp.
- *
- * @param nativeData C++ pointer to (possibly still empty) BinderProxyNativeData.
- * Takes ownership of nativeData iff <result>.mNativeData == nativeData, or if
- * we exit via an exception. If neither applies, it's the callers responsibility to
- * recycle nativeData.
- * @param iBinder C++ pointer to IBinder. Does not take ownership of referenced object.
- */
- private static BinderProxy getInstance(long nativeData, long iBinder) {
- BinderProxy result;
- try {
- result = sProxyMap.get(iBinder);
- if (result != null) {
- return result;
- }
- result = new BinderProxy(nativeData);
- } catch (Throwable e) {
- // We're throwing an exception (probably OOME); don't drop nativeData.
- NativeAllocationRegistry.applyFreeFunction(NoImagePreloadHolder.sNativeFinalizer,
- nativeData);
- throw e;
- }
- NoImagePreloadHolder.sRegistry.registerNativeAllocation(result, nativeData);
- // The registry now owns nativeData, even if registration threw an exception.
- sProxyMap.set(iBinder, result);
- return result;
- }
-
- private BinderProxy(long nativeData) {
- mNativeData = nativeData;
- }
-
- /**
- * Guestimate of native memory associated with a BinderProxy.
- * This includes the underlying IBinder, associated DeathRecipientList, and KeyedVector
- * that points back to us. We guess high since it includes a GlobalRef, which
- * may be in short supply.
- */
- private static final int NATIVE_ALLOCATION_SIZE = 1000;
-
- // Use a Holder to allow static initialization of BinderProxy in the boot image, and
- // to avoid some initialization ordering issues.
- private static class NoImagePreloadHolder {
- public static final long sNativeFinalizer = getNativeFinalizer();
- public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
- BinderProxy.class.getClassLoader(), sNativeFinalizer, NATIVE_ALLOCATION_SIZE);
- }
-
- public native boolean pingBinder();
- public native boolean isBinderAlive();
-
- public IInterface queryLocalInterface(String descriptor) {
- return null;
- }
-
- public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
- Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");
-
- if (mWarnOnBlocking && ((flags & FLAG_ONEWAY) == 0)) {
- // For now, avoid spamming the log by disabling after we've logged
- // about this interface at least once
- mWarnOnBlocking = false;
- Log.w(Binder.TAG, "Outgoing transactions from this process must be FLAG_ONEWAY",
- new Throwable());
- }
-
- final boolean tracingEnabled = Binder.isTracingEnabled();
- if (tracingEnabled) {
- final Throwable tr = new Throwable();
- Binder.getTransactionTracker().addTrace(tr);
- StackTraceElement stackTraceElement = tr.getStackTrace()[1];
- Trace.traceBegin(Trace.TRACE_TAG_ALWAYS,
- stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName());
- }
- try {
- return transactNative(code, data, reply, flags);
- } finally {
- if (tracingEnabled) {
- Trace.traceEnd(Trace.TRACE_TAG_ALWAYS);
- }
- }
- }
-
- private static native long getNativeFinalizer();
- public native String getInterfaceDescriptor() throws RemoteException;
- public native boolean transactNative(int code, Parcel data, Parcel reply,
- int flags) throws RemoteException;
- public native void linkToDeath(DeathRecipient recipient, int flags)
- throws RemoteException;
- public native boolean unlinkToDeath(DeathRecipient recipient, int flags);
-
- public void dump(FileDescriptor fd, String[] args) throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeFileDescriptor(fd);
- data.writeStringArray(args);
- try {
- transact(DUMP_TRANSACTION, data, reply, 0);
- reply.readException();
- } finally {
- data.recycle();
- reply.recycle();
- }
- }
-
- public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeFileDescriptor(fd);
- data.writeStringArray(args);
- try {
- transact(DUMP_TRANSACTION, data, reply, FLAG_ONEWAY);
- } finally {
- data.recycle();
- reply.recycle();
- }
- }
-
- public void shellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
- String[] args, ShellCallback callback,
- ResultReceiver resultReceiver) throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeFileDescriptor(in);
- data.writeFileDescriptor(out);
- data.writeFileDescriptor(err);
- data.writeStringArray(args);
- ShellCallback.writeToParcel(callback, data);
- resultReceiver.writeToParcel(data, 0);
- try {
- transact(SHELL_COMMAND_TRANSACTION, data, reply, 0);
- reply.readException();
- } finally {
- data.recycle();
- reply.recycle();
- }
- }
-
- private static final void sendDeathNotice(DeathRecipient recipient) {
- if (false) Log.v("JavaBinder", "sendDeathNotice to " + recipient);
- try {
- recipient.binderDied();
- }
- catch (RuntimeException exc) {
- Log.w("BinderNative", "Uncaught exception from death notification",
- exc);
- }
- }
-
- /**
- * C++ pointer to BinderProxyNativeData. That consists of strong pointers to the
- * native IBinder object, and a DeathRecipientList.
- */
- private final long mNativeData;
-}
diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java
new file mode 100644
index 000000000000..5752b6f54ce5
--- /dev/null
+++ b/core/java/android/os/BinderProxy.java
@@ -0,0 +1,588 @@
+/*
+ * Copyright (C) 2006 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.os;
+
+import android.annotation.NonNull;
+import android.util.Log;
+import android.util.SparseIntArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.BinderInternal;
+
+import libcore.util.NativeAllocationRegistry;
+
+import java.io.FileDescriptor;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Java proxy for a native IBinder object.
+ * Allocated and constructed by the native javaObjectforIBinder function. Never allocated
+ * directly from Java code.
+ *
+ * @hide
+ */
+public final class BinderProxy implements IBinder {
+ // See android_util_Binder.cpp for the native half of this.
+
+ // Assume the process-wide default value when created
+ volatile boolean mWarnOnBlocking = Binder.sWarnOnBlocking;
+
+ /*
+ * Map from longs to BinderProxy, retaining only a WeakReference to the BinderProxies.
+ * We roll our own only because we need to lazily remove WeakReferences during accesses
+ * to avoid accumulating junk WeakReference objects. WeakHashMap isn't easily usable
+ * because we want weak values, not keys.
+ * Our hash table is never resized, but the number of entries is unlimited;
+ * performance degrades as occupancy increases significantly past MAIN_INDEX_SIZE.
+ * Not thread-safe. Client ensures there's a single access at a time.
+ */
+ private static final class ProxyMap {
+ private static final int LOG_MAIN_INDEX_SIZE = 8;
+ private static final int MAIN_INDEX_SIZE = 1 << LOG_MAIN_INDEX_SIZE;
+ private static final int MAIN_INDEX_MASK = MAIN_INDEX_SIZE - 1;
+ // Debuggable builds will throw an AssertionError if the number of map entries exceeds:
+ private static final int CRASH_AT_SIZE = 20_000;
+
+ /**
+ * We next warn when we exceed this bucket size.
+ */
+ private int mWarnBucketSize = 20;
+
+ /**
+ * Increment mWarnBucketSize by WARN_INCREMENT each time we warn.
+ */
+ private static final int WARN_INCREMENT = 10;
+
+ /**
+ * Hash function tailored to native pointers.
+ * Returns a value < MAIN_INDEX_SIZE.
+ */
+ private static int hash(long arg) {
+ return ((int) ((arg >> 2) ^ (arg >> (2 + LOG_MAIN_INDEX_SIZE)))) & MAIN_INDEX_MASK;
+ }
+
+ /**
+ * Return the total number of pairs in the map.
+ */
+ private int size() {
+ int size = 0;
+ for (ArrayList<WeakReference<BinderProxy>> a : mMainIndexValues) {
+ if (a != null) {
+ size += a.size();
+ }
+ }
+ return size;
+ }
+
+ /**
+ * Return the total number of pairs in the map containing values that have
+ * not been cleared. More expensive than the above size function.
+ */
+ private int unclearedSize() {
+ int size = 0;
+ for (ArrayList<WeakReference<BinderProxy>> a : mMainIndexValues) {
+ if (a != null) {
+ for (WeakReference<BinderProxy> ref : a) {
+ if (ref.get() != null) {
+ ++size;
+ }
+ }
+ }
+ }
+ return size;
+ }
+
+ /**
+ * Remove ith entry from the hash bucket indicated by hash.
+ */
+ private void remove(int hash, int index) {
+ Long[] keyArray = mMainIndexKeys[hash];
+ ArrayList<WeakReference<BinderProxy>> valueArray = mMainIndexValues[hash];
+ int size = valueArray.size(); // KeyArray may have extra elements.
+ // Move last entry into empty slot, and truncate at end.
+ if (index != size - 1) {
+ keyArray[index] = keyArray[size - 1];
+ valueArray.set(index, valueArray.get(size - 1));
+ }
+ valueArray.remove(size - 1);
+ // Just leave key array entry; it's unused. We only trust the valueArray size.
+ }
+
+ /**
+ * Look up the supplied key. If we have a non-cleared entry for it, return it.
+ */
+ BinderProxy get(long key) {
+ int myHash = hash(key);
+ Long[] keyArray = mMainIndexKeys[myHash];
+ if (keyArray == null) {
+ return null;
+ }
+ ArrayList<WeakReference<BinderProxy>> valueArray = mMainIndexValues[myHash];
+ int bucketSize = valueArray.size();
+ for (int i = 0; i < bucketSize; ++i) {
+ long foundKey = keyArray[i];
+ if (key == foundKey) {
+ WeakReference<BinderProxy> wr = valueArray.get(i);
+ BinderProxy bp = wr.get();
+ if (bp != null) {
+ return bp;
+ } else {
+ remove(myHash, i);
+ return null;
+ }
+ }
+ }
+ return null;
+ }
+
+ private int mRandom; // A counter used to generate a "random" index. World's 2nd worst RNG.
+
+ /**
+ * Add the key-value pair to the map.
+ * Requires that the indicated key is not already in the map.
+ */
+ void set(long key, @NonNull BinderProxy value) {
+ int myHash = hash(key);
+ ArrayList<WeakReference<BinderProxy>> valueArray = mMainIndexValues[myHash];
+ if (valueArray == null) {
+ valueArray = mMainIndexValues[myHash] = new ArrayList<>();
+ mMainIndexKeys[myHash] = new Long[1];
+ }
+ int size = valueArray.size();
+ WeakReference<BinderProxy> newWr = new WeakReference<>(value);
+ // First look for a cleared reference.
+ // This ensures that ArrayList size is bounded by the maximum occupancy of
+ // that bucket.
+ for (int i = 0; i < size; ++i) {
+ if (valueArray.get(i).get() == null) {
+ valueArray.set(i, newWr);
+ Long[] keyArray = mMainIndexKeys[myHash];
+ keyArray[i] = key;
+ if (i < size - 1) {
+ // "Randomly" check one of the remaining entries in [i+1, size), so that
+ // needlessly long buckets are eventually pruned.
+ int rnd = Math.floorMod(++mRandom, size - (i + 1));
+ if (valueArray.get(i + 1 + rnd).get() == null) {
+ remove(myHash, i + 1 + rnd);
+ }
+ }
+ return;
+ }
+ }
+ valueArray.add(size, newWr);
+ Long[] keyArray = mMainIndexKeys[myHash];
+ if (keyArray.length == size) {
+ // size >= 1, since we initially allocated one element
+ Long[] newArray = new Long[size + size / 2 + 2];
+ System.arraycopy(keyArray, 0, newArray, 0, size);
+ newArray[size] = key;
+ mMainIndexKeys[myHash] = newArray;
+ } else {
+ keyArray[size] = key;
+ }
+ if (size >= mWarnBucketSize) {
+ final int totalSize = size();
+ Log.v(Binder.TAG, "BinderProxy map growth! bucket size = " + size
+ + " total = " + totalSize);
+ mWarnBucketSize += WARN_INCREMENT;
+ if (Build.IS_DEBUGGABLE && totalSize >= CRASH_AT_SIZE) {
+ // Use the number of uncleared entries to determine whether we should
+ // really report a histogram and crash. We don't want to fundamentally
+ // change behavior for a debuggable process, so we GC only if we are
+ // about to crash.
+ final int totalUnclearedSize = unclearedSize();
+ if (totalUnclearedSize >= CRASH_AT_SIZE) {
+ dumpProxyInterfaceCounts();
+ dumpPerUidProxyCounts();
+ Runtime.getRuntime().gc();
+ throw new AssertionError("Binder ProxyMap has too many entries: "
+ + totalSize + " (total), " + totalUnclearedSize + " (uncleared), "
+ + unclearedSize() + " (uncleared after GC). BinderProxy leak?");
+ } else if (totalSize > 3 * totalUnclearedSize / 2) {
+ Log.v(Binder.TAG, "BinderProxy map has many cleared entries: "
+ + (totalSize - totalUnclearedSize) + " of " + totalSize
+ + " are cleared");
+ }
+ }
+ }
+ }
+
+ private InterfaceCount[] getSortedInterfaceCounts(int maxToReturn) {
+ if (maxToReturn < 0) {
+ throw new IllegalArgumentException("negative interface count");
+ }
+
+ 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();
+ } 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()]);
+
+ Arrays.sort(sorted, (Map.Entry<String, Integer> a, Map.Entry<String, Integer> b)
+ -> b.getValue().compareTo(a.getValue()));
+
+ int returnCount = Math.min(maxToReturn, sorted.length);
+ InterfaceCount[] ifaceCounts = new InterfaceCount[returnCount];
+ for (int i = 0; i < returnCount; i++) {
+ ifaceCounts[i] = new InterfaceCount(sorted[i].getKey(), sorted[i].getValue());
+ }
+ return ifaceCounts;
+ }
+
+ static final int MAX_NUM_INTERFACES_TO_DUMP = 10;
+
+ /**
+ * Dump a histogram to the logcat. Used to diagnose abnormally large proxy maps.
+ */
+ private void dumpProxyInterfaceCounts() {
+ final InterfaceCount[] sorted = getSortedInterfaceCounts(MAX_NUM_INTERFACES_TO_DUMP);
+
+ Log.v(Binder.TAG, "BinderProxy descriptor histogram "
+ + "(top " + Integer.toString(MAX_NUM_INTERFACES_TO_DUMP) + "):");
+ for (int i = 0; i < sorted.length; i++) {
+ Log.v(Binder.TAG, " #" + (i + 1) + ": " + sorted[i]);
+ }
+ }
+
+ /**
+ * Dump per uid binder proxy counts to the logcat.
+ */
+ private void dumpPerUidProxyCounts() {
+ SparseIntArray counts = BinderInternal.nGetBinderProxyPerUidCounts();
+ if (counts.size() == 0) return;
+ Log.d(Binder.TAG, "Per Uid Binder Proxy Counts:");
+ for (int i = 0; i < counts.size(); i++) {
+ final int uid = counts.keyAt(i);
+ final int binderCount = counts.valueAt(i);
+ Log.d(Binder.TAG, "UID : " + uid + " count = " + binderCount);
+ }
+ }
+
+ // Corresponding ArrayLists in the following two arrays always have the same size.
+ // They contain no empty entries. However WeakReferences in the values ArrayLists
+ // may have been cleared.
+
+ // mMainIndexKeys[i][j] corresponds to mMainIndexValues[i].get(j) .
+ // The values ArrayList has the proper size(), the corresponding keys array
+ // is always at least the same size, but may be larger.
+ // If either a particular keys array, or the corresponding values ArrayList
+ // are null, then they both are.
+ private final Long[][] mMainIndexKeys = new Long[MAIN_INDEX_SIZE][];
+ private final ArrayList<WeakReference<BinderProxy>>[] mMainIndexValues =
+ new ArrayList[MAIN_INDEX_SIZE];
+ }
+
+ @GuardedBy("sProxyMap")
+ private static final ProxyMap sProxyMap = new ProxyMap();
+
+ /**
+ * Simple pair-value class to store number of binder proxy interfaces live in this process.
+ */
+ public static final class InterfaceCount {
+ private final String mInterfaceName;
+ private final int mCount;
+
+ InterfaceCount(String interfaceName, int count) {
+ mInterfaceName = interfaceName;
+ mCount = count;
+ }
+
+ @Override
+ public String toString() {
+ return mInterfaceName + " x" + Integer.toString(mCount);
+ }
+ }
+
+ /**
+ * Get a sorted array with entries mapping proxy interface names to the number
+ * of live proxies with those names.
+ *
+ * @param num maximum number of proxy interface counts to return. Use
+ * Integer.MAX_VALUE to retrieve all
+ * @hide
+ */
+ public static InterfaceCount[] getSortedInterfaceCounts(int num) {
+ synchronized (sProxyMap) {
+ return sProxyMap.getSortedInterfaceCounts(num);
+ }
+ }
+
+ /**
+ * Dump proxy debug information.
+ *
+ * @hide
+ */
+ public static void dumpProxyDebugInfo() {
+ if (Build.IS_DEBUGGABLE) {
+ synchronized (sProxyMap) {
+ sProxyMap.dumpProxyInterfaceCounts();
+ sProxyMap.dumpPerUidProxyCounts();
+ }
+ }
+ }
+
+ /**
+ * Return a BinderProxy for IBinder.
+ * If we previously returned a BinderProxy bp for the same iBinder, and bp is still
+ * in use, then we return the same bp.
+ *
+ * @param nativeData C++ pointer to (possibly still empty) BinderProxyNativeData.
+ * Takes ownership of nativeData iff <result>.mNativeData == nativeData, or if
+ * we exit via an exception. If neither applies, it's the callers responsibility to
+ * recycle nativeData.
+ * @param iBinder C++ pointer to IBinder. Does not take ownership of referenced object.
+ */
+ private static BinderProxy getInstance(long nativeData, long iBinder) {
+ BinderProxy result;
+ synchronized (sProxyMap) {
+ try {
+ result = sProxyMap.get(iBinder);
+ if (result != null) {
+ return result;
+ }
+ result = new BinderProxy(nativeData);
+ } catch (Throwable e) {
+ // We're throwing an exception (probably OOME); don't drop nativeData.
+ NativeAllocationRegistry.applyFreeFunction(NoImagePreloadHolder.sNativeFinalizer,
+ nativeData);
+ throw e;
+ }
+ NoImagePreloadHolder.sRegistry.registerNativeAllocation(result, nativeData);
+ // The registry now owns nativeData, even if registration threw an exception.
+ sProxyMap.set(iBinder, result);
+ }
+ return result;
+ }
+
+ private BinderProxy(long nativeData) {
+ mNativeData = nativeData;
+ }
+
+ /**
+ * Guestimate of native memory associated with a BinderProxy.
+ * This includes the underlying IBinder, associated DeathRecipientList, and KeyedVector
+ * that points back to us. We guess high since it includes a GlobalRef, which
+ * may be in short supply.
+ */
+ private static final int NATIVE_ALLOCATION_SIZE = 1000;
+
+ // Use a Holder to allow static initialization of BinderProxy in the boot image, and
+ // to avoid some initialization ordering issues.
+ private static class NoImagePreloadHolder {
+ public static final long sNativeFinalizer = getNativeFinalizer();
+ public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
+ BinderProxy.class.getClassLoader(), sNativeFinalizer, NATIVE_ALLOCATION_SIZE);
+ }
+
+ /**
+ * @return false if the hosting process is gone, otherwise whatever the remote returns
+ */
+ public native boolean pingBinder();
+
+ /**
+ * @return false if the hosting process is gone
+ */
+ public native boolean isBinderAlive();
+
+ /**
+ * Retrieve a local interface - always null in case of a proxy
+ */
+ public IInterface queryLocalInterface(String descriptor) {
+ return null;
+ }
+
+ /**
+ * Perform a binder transaction on a proxy.
+ *
+ * @param code The action to perform. This should
+ * be a number between {@link #FIRST_CALL_TRANSACTION} and
+ * {@link #LAST_CALL_TRANSACTION}.
+ * @param data Marshalled data to send to the target. Must not be null.
+ * If you are not sending any data, you must create an empty Parcel
+ * that is given here.
+ * @param reply Marshalled data to be received from the target. May be
+ * null if you are not interested in the return value.
+ * @param flags Additional operation flags. Either 0 for a normal
+ * RPC, or {@link #FLAG_ONEWAY} for a one-way RPC.
+ *
+ * @return
+ * @throws RemoteException
+ */
+ public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
+ Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");
+
+ if (mWarnOnBlocking && ((flags & FLAG_ONEWAY) == 0)) {
+ // For now, avoid spamming the log by disabling after we've logged
+ // about this interface at least once
+ mWarnOnBlocking = false;
+ Log.w(Binder.TAG, "Outgoing transactions from this process must be FLAG_ONEWAY",
+ new Throwable());
+ }
+
+ final boolean tracingEnabled = Binder.isTracingEnabled();
+ if (tracingEnabled) {
+ final Throwable tr = new Throwable();
+ Binder.getTransactionTracker().addTrace(tr);
+ StackTraceElement stackTraceElement = tr.getStackTrace()[1];
+ Trace.traceBegin(Trace.TRACE_TAG_ALWAYS,
+ stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName());
+ }
+ try {
+ return transactNative(code, data, reply, flags);
+ } finally {
+ if (tracingEnabled) {
+ Trace.traceEnd(Trace.TRACE_TAG_ALWAYS);
+ }
+ }
+ }
+
+ /* Returns the native free function */
+ private static native long getNativeFinalizer();
+ /**
+ * See {@link IBinder#getInterfaceDescriptor()}
+ */
+ public native String getInterfaceDescriptor() throws RemoteException;
+
+ /**
+ * Native implementation of transact() for proxies
+ */
+ public native boolean transactNative(int code, Parcel data, Parcel reply,
+ int flags) throws RemoteException;
+ /**
+ * See {@link IBinder#linkToDeath(DeathRecipient, int)}
+ */
+ public native void linkToDeath(DeathRecipient recipient, int flags)
+ throws RemoteException;
+ /**
+ * See {@link IBinder#unlinkToDeath}
+ */
+ public native boolean unlinkToDeath(DeathRecipient recipient, int flags);
+
+ /**
+ * Perform a dump on the remote object
+ *
+ * @param fd The raw file descriptor that the dump is being sent to.
+ * @param args additional arguments to the dump request.
+ * @throws RemoteException
+ */
+ public void dump(FileDescriptor fd, String[] args) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeFileDescriptor(fd);
+ data.writeStringArray(args);
+ try {
+ transact(DUMP_TRANSACTION, data, reply, 0);
+ reply.readException();
+ } finally {
+ data.recycle();
+ reply.recycle();
+ }
+ }
+
+ /**
+ * Perform an asynchronous dump on the remote object
+ *
+ * @param fd The raw file descriptor that the dump is being sent to.
+ * @param args additional arguments to the dump request.
+ * @throws RemoteException
+ */
+ public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeFileDescriptor(fd);
+ data.writeStringArray(args);
+ try {
+ transact(DUMP_TRANSACTION, data, reply, FLAG_ONEWAY);
+ } finally {
+ data.recycle();
+ reply.recycle();
+ }
+ }
+
+ /**
+ * See {@link IBinder#shellCommand(FileDescriptor, FileDescriptor, FileDescriptor,
+ * String[], ShellCallback, ResultReceiver)}
+ *
+ * @param in The raw file descriptor that an input data stream can be read from.
+ * @param out The raw file descriptor that normal command messages should be written to.
+ * @param err The raw file descriptor that command error messages should be written to.
+ * @param args Command-line arguments.
+ * @param callback Optional callback to the caller's shell to perform operations in it.
+ * @param resultReceiver Called when the command has finished executing, with the result code.
+ * @throws RemoteException
+ */
+ public void shellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
+ String[] args, ShellCallback callback,
+ ResultReceiver resultReceiver) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeFileDescriptor(in);
+ data.writeFileDescriptor(out);
+ data.writeFileDescriptor(err);
+ data.writeStringArray(args);
+ ShellCallback.writeToParcel(callback, data);
+ resultReceiver.writeToParcel(data, 0);
+ try {
+ transact(SHELL_COMMAND_TRANSACTION, data, reply, 0);
+ reply.readException();
+ } finally {
+ data.recycle();
+ reply.recycle();
+ }
+ }
+
+ private static void sendDeathNotice(DeathRecipient recipient) {
+ if (false) Log.v("JavaBinder", "sendDeathNotice to " + recipient);
+ try {
+ recipient.binderDied();
+ } catch (RuntimeException exc) {
+ Log.w("BinderNative", "Uncaught exception from death notification",
+ exc);
+ }
+ }
+
+ /**
+ * C++ pointer to BinderProxyNativeData. That consists of strong pointers to the
+ * native IBinder object, and a DeathRecipientList.
+ */
+ private final long mNativeData;
+}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 2de07b5bb408..e71f4e93b658 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -165,6 +165,11 @@ public class Build {
public static final String[] SUPPORTED_64_BIT_ABIS =
getStringList("ro.product.cpu.abilist64", ",");
+ /** {@hide} */
+ @TestApi
+ public static boolean is64BitAbi(String abi) {
+ return VMRuntime.is64BitAbi(abi);
+ }
static {
/*
@@ -197,7 +202,11 @@ public class Build {
public static final String INCREMENTAL = getString("ro.build.version.incremental");
/**
- * The user-visible version string. E.g., "1.0" or "3.4b5".
+ * The user-visible version string. E.g., "1.0" or "3.4b5" or "bananas".
+ *
+ * This field is an opaque string. Do not assume that its value
+ * has any particular structure or that values of RELEASE from
+ * different releases can be somehow ordered.
*/
public static final String RELEASE = getString("ro.build.version.release");
@@ -227,8 +236,6 @@ public class Build {
* increase when the hardware manufacturer provides an OTA update.
* <p>
* Possible values are defined in {@link Build.VERSION_CODES}.
- *
- * @see #FIRST_SDK_INT
*/
public static final int SDK_INT = SystemProperties.getInt(
"ro.build.version.sdk", 0);
@@ -912,6 +919,21 @@ public class Build {
* </ul>
*/
public static final int P = 28;
+
+ /**
+ * Q.
+ * <p>
+ * <em>Why? Why, to give you a taste of your future, a preview of things
+ * to come. Con permiso, Capitan. The hall is rented, the orchestra
+ * engaged. It's now time to see if you can dance.</em>
+ */
+ public static final int Q = CUR_DEVELOPMENT;
+
+ /**
+ * Stub for a potential new API level after P.
+ * @hide
+ */
+ public static final int P0 = Q;
}
/** The type of build, like "user" or "eng". */
diff --git a/core/java/android/os/CommonClock.java b/core/java/android/os/CommonClock.java
deleted file mode 100644
index 2ecf317c2d09..000000000000
--- a/core/java/android/os/CommonClock.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * Copyright (C) 2012 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.os;
-
-import java.net.InetSocketAddress;
-import java.util.NoSuchElementException;
-import android.os.Binder;
-import android.os.CommonTimeUtils;
-import android.os.IBinder;
-import android.os.Parcel;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-
-/**
- * Used for accessing the android common time service's common clock and receiving notifications
- * about common time synchronization status changes.
- * @hide
- */
-public class CommonClock {
- /**
- * Sentinel value returned by {@link #getTime()} and {@link #getEstimatedError()} when the
- * common time service is not able to determine the current common time due to a lack of
- * synchronization.
- */
- public static final long TIME_NOT_SYNCED = -1;
-
- /**
- * Sentinel value returned by {@link #getTimelineId()} when the common time service is not
- * currently synced to any timeline.
- */
- public static final long INVALID_TIMELINE_ID = 0;
-
- /**
- * Sentinel value returned by {@link #getEstimatedError()} when the common time service is not
- * currently synced to any timeline.
- */
- public static final int ERROR_ESTIMATE_UNKNOWN = 0x7FFFFFFF;
-
- /**
- * Value used by {@link #getState()} to indicate that there was an internal error while
- * attempting to determine the state of the common time service.
- */
- public static final int STATE_INVALID = -1;
-
- /**
- * Value used by {@link #getState()} to indicate that the common time service is in its initial
- * state and attempting to find the current timeline master, if any. The service will
- * transition to either {@link #STATE_CLIENT} if it finds an active master, or to
- * {@link #STATE_MASTER} if no active master is found and this client becomes the master of a
- * new timeline.
- */
- public static final int STATE_INITIAL = 0;
-
- /**
- * Value used by {@link #getState()} to indicate that the common time service is in its client
- * state and is synchronizing its time to a different timeline master on the network.
- */
- public static final int STATE_CLIENT = 1;
-
- /**
- * Value used by {@link #getState()} to indicate that the common time service is in its master
- * state and is serving as the timeline master for other common time service clients on the
- * network.
- */
- public static final int STATE_MASTER = 2;
-
- /**
- * Value used by {@link #getState()} to indicate that the common time service is in its Ronin
- * state. Common time service instances in the client state enter the Ronin state after their
- * timeline master becomes unreachable on the network. Common time services who enter the Ronin
- * state will begin a new master election for the timeline they were recently clients of. As
- * clients detect they are not the winner and drop out of the election, they will transition to
- * the {@link #STATE_WAIT_FOR_ELECTION} state. When there is only one client remaining in the
- * election, it will assume ownership of the timeline and transition to the
- * {@link #STATE_MASTER} state. During the election, all clients will allow their timeline to
- * drift without applying correction.
- */
- public static final int STATE_RONIN = 3;
-
- /**
- * Value used by {@link #getState()} to indicate that the common time service is waiting for a
- * master election to conclude and for the new master to announce itself before transitioning to
- * the {@link #STATE_CLIENT} state. If no new master announces itself within the timeout
- * threshold, the time service will transition back to the {@link #STATE_RONIN} state in order
- * to restart the election.
- */
- public static final int STATE_WAIT_FOR_ELECTION = 4;
-
- /**
- * Name of the underlying native binder service
- */
- public static final String SERVICE_NAME = "common_time.clock";
-
- /**
- * Class constructor.
- * @throws android.os.RemoteException
- */
- public CommonClock()
- throws RemoteException {
- mRemote = ServiceManager.getService(SERVICE_NAME);
- if (null == mRemote)
- throw new RemoteException();
-
- mInterfaceDesc = mRemote.getInterfaceDescriptor();
- mUtils = new CommonTimeUtils(mRemote, mInterfaceDesc);
- mRemote.linkToDeath(mDeathHandler, 0);
- registerTimelineChangeListener();
- }
-
- /**
- * Handy class factory method.
- */
- static public CommonClock create() {
- CommonClock retVal;
-
- try {
- retVal = new CommonClock();
- }
- catch (RemoteException e) {
- retVal = null;
- }
-
- return retVal;
- }
-
- /**
- * Release all native resources held by this {@link android.os.CommonClock} instance. Once
- * resources have been released, the {@link android.os.CommonClock} instance is disconnected from
- * the native service and will throw a {@link android.os.RemoteException} if any of its
- * methods are called. Clients should always call release on their client instances before
- * releasing their last Java reference to the instance. Failure to do this will cause
- * non-deterministic native resource reclamation and may cause the common time service to remain
- * active on the network for longer than it should.
- */
- public void release() {
- unregisterTimelineChangeListener();
- if (null != mRemote) {
- try {
- mRemote.unlinkToDeath(mDeathHandler, 0);
- }
- catch (NoSuchElementException e) { }
- mRemote = null;
- }
- mUtils = null;
- }
-
- /**
- * Gets the common clock's current time.
- *
- * @return a signed 64-bit value representing the current common time in microseconds, or the
- * special value {@link #TIME_NOT_SYNCED} if the common time service is currently not
- * synchronized.
- * @throws android.os.RemoteException
- */
- public long getTime()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetLong(METHOD_GET_COMMON_TIME, TIME_NOT_SYNCED);
- }
-
- /**
- * Gets the current estimation of common clock's synchronization accuracy from the common time
- * service.
- *
- * @return a signed 32-bit value representing the common time service's estimation of
- * synchronization accuracy in microseconds, or the special value
- * {@link #ERROR_ESTIMATE_UNKNOWN} if the common time service is currently not synchronized.
- * Negative values indicate that the local server estimates that the nominal common time is
- * behind the local server's time (in other words, the local clock is running fast) Positive
- * values indicate that the local server estimates that the nominal common time is ahead of the
- * local server's time (in other words, the local clock is running slow)
- * @throws android.os.RemoteException
- */
- public int getEstimatedError()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetInt(METHOD_GET_ESTIMATED_ERROR, ERROR_ESTIMATE_UNKNOWN);
- }
-
- /**
- * Gets the ID of the timeline the common time service is currently synchronizing its clock to.
- *
- * @return a long representing the unique ID of the timeline the common time service is
- * currently synchronizing with, or {@link #INVALID_TIMELINE_ID} if the common time service is
- * currently not synchronized.
- * @throws android.os.RemoteException
- */
- public long getTimelineId()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetLong(METHOD_GET_TIMELINE_ID, INVALID_TIMELINE_ID);
- }
-
- /**
- * Gets the current state of this clock's common time service in the the master election
- * algorithm.
- *
- * @return a integer indicating the current state of the this clock's common time service in the
- * master election algorithm or {@link #STATE_INVALID} if there is an internal error.
- * @throws android.os.RemoteException
- */
- public int getState()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetInt(METHOD_GET_STATE, STATE_INVALID);
- }
-
- /**
- * Gets the IP address and UDP port of the current timeline master.
- *
- * @return an InetSocketAddress containing the IP address and UDP port of the current timeline
- * master, or null if there is no current master.
- * @throws android.os.RemoteException
- */
- public InetSocketAddress getMasterAddr()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetSockaddr(METHOD_GET_MASTER_ADDRESS);
- }
-
- /**
- * The OnTimelineChangedListener interface defines a method called by the
- * {@link android.os.CommonClock} instance to indicate that the time synchronization service has
- * either synchronized with a new timeline, or is no longer a member of any timeline. The
- * client application can implement this interface and register the listener with the
- * {@link #setTimelineChangedListener(OnTimelineChangedListener)} method.
- */
- public interface OnTimelineChangedListener {
- /**
- * Method called when the time service's timeline has changed.
- *
- * @param newTimelineId a long which uniquely identifies the timeline the time
- * synchronization service is now a member of, or {@link #INVALID_TIMELINE_ID} if the the
- * service is not synchronized to any timeline.
- */
- void onTimelineChanged(long newTimelineId);
- }
-
- /**
- * Registers an OnTimelineChangedListener interface.
- * <p>Call this method with a null listener to stop receiving server death notifications.
- */
- public void setTimelineChangedListener(OnTimelineChangedListener listener) {
- synchronized (mListenerLock) {
- mTimelineChangedListener = listener;
- }
- }
-
- /**
- * The OnServerDiedListener interface defines a method called by the
- * {@link android.os.CommonClock} instance to indicate that the connection to the native media
- * server has been broken and that the {@link android.os.CommonClock} instance will need to be
- * released and re-created. The client application can implement this interface and register
- * the listener with the {@link #setServerDiedListener(OnServerDiedListener)} method.
- */
- public interface OnServerDiedListener {
- /**
- * Method called when the native media server has died. <p>If the native common time
- * service encounters a fatal error and needs to restart, the binder connection from the
- * {@link android.os.CommonClock} instance to the common time service will be broken. To
- * restore functionality, clients should {@link #release()} their old visualizer and create
- * a new instance.
- */
- void onServerDied();
- }
-
- /**
- * Registers an OnServerDiedListener interface.
- * <p>Call this method with a null listener to stop receiving server death notifications.
- */
- public void setServerDiedListener(OnServerDiedListener listener) {
- synchronized (mListenerLock) {
- mServerDiedListener = listener;
- }
- }
-
- protected void finalize() throws Throwable { release(); }
-
- private void throwOnDeadServer() throws RemoteException {
- if ((null == mRemote) || (null == mUtils))
- throw new RemoteException();
- }
-
- private final Object mListenerLock = new Object();
- private OnTimelineChangedListener mTimelineChangedListener = null;
- private OnServerDiedListener mServerDiedListener = null;
-
- private IBinder mRemote = null;
- private String mInterfaceDesc = "";
- private CommonTimeUtils mUtils;
-
- private IBinder.DeathRecipient mDeathHandler = new IBinder.DeathRecipient() {
- public void binderDied() {
- synchronized (mListenerLock) {
- if (null != mServerDiedListener)
- mServerDiedListener.onServerDied();
- }
- }
- };
-
- private class TimelineChangedListener extends Binder {
- @Override
- protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
- throws RemoteException {
- switch (code) {
- case METHOD_CBK_ON_TIMELINE_CHANGED:
- data.enforceInterface(DESCRIPTOR);
- long timelineId = data.readLong();
- synchronized (mListenerLock) {
- if (null != mTimelineChangedListener)
- mTimelineChangedListener.onTimelineChanged(timelineId);
- }
- return true;
- }
-
- return super.onTransact(code, data, reply, flags);
- }
-
- private static final String DESCRIPTOR = "android.os.ICommonClockListener";
- };
-
- private TimelineChangedListener mCallbackTgt = null;
-
- private void registerTimelineChangeListener() throws RemoteException {
- if (null != mCallbackTgt)
- return;
-
- boolean success = false;
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
- mCallbackTgt = new TimelineChangedListener();
-
- try {
- data.writeInterfaceToken(mInterfaceDesc);
- data.writeStrongBinder(mCallbackTgt);
- mRemote.transact(METHOD_REGISTER_LISTENER, data, reply, 0);
- success = (0 == reply.readInt());
- }
- catch (RemoteException e) {
- success = false;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
-
- // Did we catch a remote exception or fail to register our callback target? If so, our
- // object must already be dead (or be as good as dead). Clear out all of our state so that
- // our other methods will properly indicate a dead object.
- if (!success) {
- mCallbackTgt = null;
- mRemote = null;
- mUtils = null;
- }
- }
-
- private void unregisterTimelineChangeListener() {
- if (null == mCallbackTgt)
- return;
-
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
-
- try {
- data.writeInterfaceToken(mInterfaceDesc);
- data.writeStrongBinder(mCallbackTgt);
- mRemote.transact(METHOD_UNREGISTER_LISTENER, data, reply, 0);
- }
- catch (RemoteException e) { }
- finally {
- reply.recycle();
- data.recycle();
- mCallbackTgt = null;
- }
- }
-
- private static final int METHOD_IS_COMMON_TIME_VALID = IBinder.FIRST_CALL_TRANSACTION;
- private static final int METHOD_COMMON_TIME_TO_LOCAL_TIME = METHOD_IS_COMMON_TIME_VALID + 1;
- private static final int METHOD_LOCAL_TIME_TO_COMMON_TIME = METHOD_COMMON_TIME_TO_LOCAL_TIME + 1;
- private static final int METHOD_GET_COMMON_TIME = METHOD_LOCAL_TIME_TO_COMMON_TIME + 1;
- private static final int METHOD_GET_COMMON_FREQ = METHOD_GET_COMMON_TIME + 1;
- private static final int METHOD_GET_LOCAL_TIME = METHOD_GET_COMMON_FREQ + 1;
- private static final int METHOD_GET_LOCAL_FREQ = METHOD_GET_LOCAL_TIME + 1;
- private static final int METHOD_GET_ESTIMATED_ERROR = METHOD_GET_LOCAL_FREQ + 1;
- private static final int METHOD_GET_TIMELINE_ID = METHOD_GET_ESTIMATED_ERROR + 1;
- private static final int METHOD_GET_STATE = METHOD_GET_TIMELINE_ID + 1;
- private static final int METHOD_GET_MASTER_ADDRESS = METHOD_GET_STATE + 1;
- private static final int METHOD_REGISTER_LISTENER = METHOD_GET_MASTER_ADDRESS + 1;
- private static final int METHOD_UNREGISTER_LISTENER = METHOD_REGISTER_LISTENER + 1;
-
- private static final int METHOD_CBK_ON_TIMELINE_CHANGED = IBinder.FIRST_CALL_TRANSACTION;
-}
diff --git a/core/java/android/os/CommonTimeConfig.java b/core/java/android/os/CommonTimeConfig.java
deleted file mode 100644
index 1f9fab5eb73d..000000000000
--- a/core/java/android/os/CommonTimeConfig.java
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- * Copyright (C) 2012 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.os;
-
-import java.net.InetSocketAddress;
-import java.util.NoSuchElementException;
-
-import android.os.CommonTimeUtils;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-
-/**
- * Used for configuring and controlling the status of the android common time service.
- * @hide
- */
-public class CommonTimeConfig {
- /**
- * Successful operation.
- */
- public static final int SUCCESS = 0;
- /**
- * Unspecified error.
- */
- public static final int ERROR = -1;
- /**
- * Operation failed due to bad parameter value.
- */
- public static final int ERROR_BAD_VALUE = -4;
- /**
- * Operation failed due to dead remote object.
- */
- public static final int ERROR_DEAD_OBJECT = -7;
-
- /**
- * Sentinel value returned by {@link #getMasterElectionGroupId()} when an error occurs trying to
- * fetch the master election group.
- */
- public static final long INVALID_GROUP_ID = -1;
-
- /**
- * Name of the underlying native binder service
- */
- public static final String SERVICE_NAME = "common_time.config";
-
- /**
- * Class constructor.
- * @throws android.os.RemoteException
- */
- public CommonTimeConfig()
- throws RemoteException {
- mRemote = ServiceManager.getService(SERVICE_NAME);
- if (null == mRemote)
- throw new RemoteException();
-
- mInterfaceDesc = mRemote.getInterfaceDescriptor();
- mUtils = new CommonTimeUtils(mRemote, mInterfaceDesc);
- mRemote.linkToDeath(mDeathHandler, 0);
- }
-
- /**
- * Handy class factory method.
- */
- static public CommonTimeConfig create() {
- CommonTimeConfig retVal;
-
- try {
- retVal = new CommonTimeConfig();
- }
- catch (RemoteException e) {
- retVal = null;
- }
-
- return retVal;
- }
-
- /**
- * Release all native resources held by this {@link android.os.CommonTimeConfig} instance. Once
- * resources have been released, the {@link android.os.CommonTimeConfig} instance is
- * disconnected from the native service and will throw a {@link android.os.RemoteException} if
- * any of its methods are called. Clients should always call release on their client instances
- * before releasing their last Java reference to the instance. Failure to do this will cause
- * non-deterministic native resource reclamation and may cause the common time service to remain
- * active on the network for longer than it should.
- */
- public void release() {
- if (null != mRemote) {
- try {
- mRemote.unlinkToDeath(mDeathHandler, 0);
- }
- catch (NoSuchElementException e) { }
- mRemote = null;
- }
- mUtils = null;
- }
-
- /**
- * Gets the current priority of the common time service used in the master election protocol.
- *
- * @return an 8 bit value indicating the priority of this common time service relative to other
- * common time services operating in the same domain.
- * @throws android.os.RemoteException
- */
- public byte getMasterElectionPriority()
- throws RemoteException {
- throwOnDeadServer();
- return (byte)mUtils.transactGetInt(METHOD_GET_MASTER_ELECTION_PRIORITY, -1);
- }
-
- /**
- * Sets the current priority of the common time service used in the master election protocol.
- *
- * @param priority priority of the common time service used in the master election protocol.
- * Lower numbers are lower priority.
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int setMasterElectionPriority(byte priority) {
- if (checkDeadServer())
- return ERROR_DEAD_OBJECT;
- return mUtils.transactSetInt(METHOD_SET_MASTER_ELECTION_PRIORITY, priority);
- }
-
- /**
- * Gets the IP endpoint used by the time service to participate in the master election protocol.
- *
- * @return an InetSocketAddress containing the IP address and UDP port being used by the
- * system's common time service to participate in the master election protocol.
- * @throws android.os.RemoteException
- */
- public InetSocketAddress getMasterElectionEndpoint()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetSockaddr(METHOD_GET_MASTER_ELECTION_ENDPOINT);
- }
-
- /**
- * Sets the IP endpoint used by the common time service to participate in the master election
- * protocol.
- *
- * @param ep The IP address and UDP port to be used by the common time service to participate in
- * the master election protocol. The supplied IP address must be either the broadcast or
- * multicast address, unicast addresses are considered to be illegal values.
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR}, {@link #ERROR_BAD_VALUE} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int setMasterElectionEndpoint(InetSocketAddress ep) {
- if (checkDeadServer())
- return ERROR_DEAD_OBJECT;
- return mUtils.transactSetSockaddr(METHOD_SET_MASTER_ELECTION_ENDPOINT, ep);
- }
-
- /**
- * Gets the current group ID used by the common time service in the master election protocol.
- *
- * @return The 64-bit group ID of the common time service.
- * @throws android.os.RemoteException
- */
- public long getMasterElectionGroupId()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetLong(METHOD_GET_MASTER_ELECTION_GROUP_ID, INVALID_GROUP_ID);
- }
-
- /**
- * Sets the current group ID used by the common time service in the master election protocol.
- *
- * @param id The 64-bit group ID of the common time service.
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR}, {@link #ERROR_BAD_VALUE} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int setMasterElectionGroupId(long id) {
- if (checkDeadServer())
- return ERROR_DEAD_OBJECT;
- return mUtils.transactSetLong(METHOD_SET_MASTER_ELECTION_GROUP_ID, id);
- }
-
- /**
- * Gets the name of the network interface which the common time service attempts to bind to.
- *
- * @return a string with the network interface name which the common time service is bound to,
- * or null if the service is currently unbound. Examples of interface names are things like
- * "eth0", or "wlan0".
- * @throws android.os.RemoteException
- */
- public String getInterfaceBinding()
- throws RemoteException {
- throwOnDeadServer();
-
- String ifaceName = mUtils.transactGetString(METHOD_GET_INTERFACE_BINDING, null);
-
- if ((null != ifaceName) && (0 == ifaceName.length()))
- return null;
-
- return ifaceName;
- }
-
- /**
- * Sets the name of the network interface which the common time service should attempt to bind
- * to.
- *
- * @param ifaceName The name of the network interface ("eth0", "wlan0", etc...) wich the common
- * time service should attempt to bind to, or null to force the common time service to unbind
- * from the network and run in networkless mode.
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR}, {@link #ERROR_BAD_VALUE} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int setNetworkBinding(String ifaceName) {
- if (checkDeadServer())
- return ERROR_DEAD_OBJECT;
-
- return mUtils.transactSetString(METHOD_SET_INTERFACE_BINDING,
- (null == ifaceName) ? "" : ifaceName);
- }
-
- /**
- * Gets the amount of time the common time service will wait between master announcements when
- * it is the timeline master.
- *
- * @return The time (in milliseconds) between master announcements.
- * @throws android.os.RemoteException
- */
- public int getMasterAnnounceInterval()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetInt(METHOD_GET_MASTER_ANNOUNCE_INTERVAL, -1);
- }
-
- /**
- * Sets the amount of time the common time service will wait between master announcements when
- * it is the timeline master.
- *
- * @param interval The time (in milliseconds) between master announcements.
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR}, {@link #ERROR_BAD_VALUE} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int setMasterAnnounceInterval(int interval) {
- if (checkDeadServer())
- return ERROR_DEAD_OBJECT;
- return mUtils.transactSetInt(METHOD_SET_MASTER_ANNOUNCE_INTERVAL, interval);
- }
-
- /**
- * Gets the amount of time the common time service will wait between time synchronization
- * requests when it is the client of another common time service on the network.
- *
- * @return The time (in milliseconds) between time sync requests.
- * @throws android.os.RemoteException
- */
- public int getClientSyncInterval()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetInt(METHOD_GET_CLIENT_SYNC_INTERVAL, -1);
- }
-
- /**
- * Sets the amount of time the common time service will wait between time synchronization
- * requests when it is the client of another common time service on the network.
- *
- * @param interval The time (in milliseconds) between time sync requests.
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR}, {@link #ERROR_BAD_VALUE} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int setClientSyncInterval(int interval) {
- if (checkDeadServer())
- return ERROR_DEAD_OBJECT;
- return mUtils.transactSetInt(METHOD_SET_CLIENT_SYNC_INTERVAL, interval);
- }
-
- /**
- * Gets the panic threshold for the estimated error level of the common time service. When the
- * common time service's estimated error rises above this level, the service will panic and
- * reset, causing a discontinuity in the currently synchronized timeline.
- *
- * @return The threshold (in microseconds) past which the common time service will panic.
- * @throws android.os.RemoteException
- */
- public int getPanicThreshold()
- throws RemoteException {
- throwOnDeadServer();
- return mUtils.transactGetInt(METHOD_GET_PANIC_THRESHOLD, -1);
- }
-
- /**
- * Sets the panic threshold for the estimated error level of the common time service. When the
- * common time service's estimated error rises above this level, the service will panic and
- * reset, causing a discontinuity in the currently synchronized timeline.
- *
- * @param threshold The threshold (in microseconds) past which the common time service will
- * panic.
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR}, {@link #ERROR_BAD_VALUE} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int setPanicThreshold(int threshold) {
- if (checkDeadServer())
- return ERROR_DEAD_OBJECT;
- return mUtils.transactSetInt(METHOD_SET_PANIC_THRESHOLD, threshold);
- }
-
- /**
- * Gets the current state of the common time service's auto disable flag.
- *
- * @return The current state of the common time service's auto disable flag.
- * @throws android.os.RemoteException
- */
- public boolean getAutoDisable()
- throws RemoteException {
- throwOnDeadServer();
- return (1 == mUtils.transactGetInt(METHOD_GET_AUTO_DISABLE, 1));
- }
-
- /**
- * Sets the current state of the common time service's auto disable flag. When the time
- * service's auto disable flag is set, it will automatically cease all network activity when
- * it has no active local clients, resuming activity the next time the service has interested
- * local clients. When the auto disabled flag is cleared, the common time service will continue
- * to participate the time synchronization group even when it has no active local clients.
- *
- * @param autoDisable The desired state of the common time service's auto disable flag.
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int setAutoDisable(boolean autoDisable) {
- if (checkDeadServer())
- return ERROR_DEAD_OBJECT;
-
- return mUtils.transactSetInt(METHOD_SET_AUTO_DISABLE, autoDisable ? 1 : 0);
- }
-
- /**
- * At startup, the time service enters the initial state and remains there until it is given a
- * network interface to bind to. Common time will be unavailable to clients of the common time
- * service until the service joins a network (even an empty network). Devices may use the
- * {@link #forceNetworklessMasterMode()} method to force a time service in the INITIAL state
- * with no network configuration to assume MASTER status for a brand new timeline in order to
- * allow clients of the common time service to operate, even though the device is isolated and
- * not on any network. When a networkless master does join a network, it will defer to any
- * masters already on the network, or continue to maintain the timeline it made up during its
- * networkless state if no other masters are detected. Attempting to force a client into master
- * mode while it is actively bound to a network will fail with the status code {@link #ERROR}
- *
- * @return {@link #SUCCESS} in case of success,
- * {@link #ERROR} or {@link #ERROR_DEAD_OBJECT} in case of failure.
- */
- public int forceNetworklessMasterMode() {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
-
- try {
- data.writeInterfaceToken(mInterfaceDesc);
- mRemote.transact(METHOD_FORCE_NETWORKLESS_MASTER_MODE, data, reply, 0);
-
- return reply.readInt();
- }
- catch (RemoteException e) {
- return ERROR_DEAD_OBJECT;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
- }
-
- /**
- * The OnServerDiedListener interface defines a method called by the
- * {@link android.os.CommonTimeConfig} instance to indicate that the connection to the native
- * media server has been broken and that the {@link android.os.CommonTimeConfig} instance will
- * need to be released and re-created. The client application can implement this interface and
- * register the listener with the {@link #setServerDiedListener(OnServerDiedListener)} method.
- */
- public interface OnServerDiedListener {
- /**
- * Method called when the native common time service has died. <p>If the native common time
- * service encounters a fatal error and needs to restart, the binder connection from the
- * {@link android.os.CommonTimeConfig} instance to the common time service will be broken.
- */
- void onServerDied();
- }
-
- /**
- * Registers an OnServerDiedListener interface.
- * <p>Call this method with a null listener to stop receiving server death notifications.
- */
- public void setServerDiedListener(OnServerDiedListener listener) {
- synchronized (mListenerLock) {
- mServerDiedListener = listener;
- }
- }
-
- protected void finalize() throws Throwable { release(); }
-
- private boolean checkDeadServer() {
- return ((null == mRemote) || (null == mUtils));
- }
-
- private void throwOnDeadServer() throws RemoteException {
- if (checkDeadServer())
- throw new RemoteException();
- }
-
- private final Object mListenerLock = new Object();
- private OnServerDiedListener mServerDiedListener = null;
-
- private IBinder mRemote = null;
- private String mInterfaceDesc = "";
- private CommonTimeUtils mUtils;
-
- private IBinder.DeathRecipient mDeathHandler = new IBinder.DeathRecipient() {
- public void binderDied() {
- synchronized (mListenerLock) {
- if (null != mServerDiedListener)
- mServerDiedListener.onServerDied();
- }
- }
- };
-
- private static final int METHOD_GET_MASTER_ELECTION_PRIORITY = IBinder.FIRST_CALL_TRANSACTION;
- private static final int METHOD_SET_MASTER_ELECTION_PRIORITY = METHOD_GET_MASTER_ELECTION_PRIORITY + 1;
- private static final int METHOD_GET_MASTER_ELECTION_ENDPOINT = METHOD_SET_MASTER_ELECTION_PRIORITY + 1;
- private static final int METHOD_SET_MASTER_ELECTION_ENDPOINT = METHOD_GET_MASTER_ELECTION_ENDPOINT + 1;
- private static final int METHOD_GET_MASTER_ELECTION_GROUP_ID = METHOD_SET_MASTER_ELECTION_ENDPOINT + 1;
- private static final int METHOD_SET_MASTER_ELECTION_GROUP_ID = METHOD_GET_MASTER_ELECTION_GROUP_ID + 1;
- private static final int METHOD_GET_INTERFACE_BINDING = METHOD_SET_MASTER_ELECTION_GROUP_ID + 1;
- private static final int METHOD_SET_INTERFACE_BINDING = METHOD_GET_INTERFACE_BINDING + 1;
- private static final int METHOD_GET_MASTER_ANNOUNCE_INTERVAL = METHOD_SET_INTERFACE_BINDING + 1;
- private static final int METHOD_SET_MASTER_ANNOUNCE_INTERVAL = METHOD_GET_MASTER_ANNOUNCE_INTERVAL + 1;
- private static final int METHOD_GET_CLIENT_SYNC_INTERVAL = METHOD_SET_MASTER_ANNOUNCE_INTERVAL + 1;
- private static final int METHOD_SET_CLIENT_SYNC_INTERVAL = METHOD_GET_CLIENT_SYNC_INTERVAL + 1;
- private static final int METHOD_GET_PANIC_THRESHOLD = METHOD_SET_CLIENT_SYNC_INTERVAL + 1;
- private static final int METHOD_SET_PANIC_THRESHOLD = METHOD_GET_PANIC_THRESHOLD + 1;
- private static final int METHOD_GET_AUTO_DISABLE = METHOD_SET_PANIC_THRESHOLD + 1;
- private static final int METHOD_SET_AUTO_DISABLE = METHOD_GET_AUTO_DISABLE + 1;
- private static final int METHOD_FORCE_NETWORKLESS_MASTER_MODE = METHOD_SET_AUTO_DISABLE + 1;
-}
diff --git a/core/java/android/os/CommonTimeUtils.java b/core/java/android/os/CommonTimeUtils.java
deleted file mode 100644
index ba060b87567e..000000000000
--- a/core/java/android/os/CommonTimeUtils.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2012 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.os;
-
-import java.net.InetAddress;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetSocketAddress;
-import java.util.Locale;
-import static android.system.OsConstants.*;
-
-class CommonTimeUtils {
- /**
- * Successful operation.
- */
- public static final int SUCCESS = 0;
- /**
- * Unspecified error.
- */
- public static final int ERROR = -1;
- /**
- * Operation failed due to bad parameter value.
- */
- public static final int ERROR_BAD_VALUE = -4;
- /**
- * Operation failed due to dead remote object.
- */
- public static final int ERROR_DEAD_OBJECT = -7;
-
- public CommonTimeUtils(IBinder remote, String interfaceDesc) {
- mRemote = remote;
- mInterfaceDesc = interfaceDesc;
- }
-
- public int transactGetInt(int method_code, int error_ret_val)
- throws RemoteException {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
- int ret_val;
-
- try {
- int res;
- data.writeInterfaceToken(mInterfaceDesc);
- mRemote.transact(method_code, data, reply, 0);
-
- res = reply.readInt();
- ret_val = (0 == res) ? reply.readInt() : error_ret_val;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
-
- return ret_val;
- }
-
- public int transactSetInt(int method_code, int val) {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
-
- try {
- data.writeInterfaceToken(mInterfaceDesc);
- data.writeInt(val);
- mRemote.transact(method_code, data, reply, 0);
-
- return reply.readInt();
- }
- catch (RemoteException e) {
- return ERROR_DEAD_OBJECT;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
- }
-
- public long transactGetLong(int method_code, long error_ret_val)
- throws RemoteException {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
- long ret_val;
-
- try {
- int res;
- data.writeInterfaceToken(mInterfaceDesc);
- mRemote.transact(method_code, data, reply, 0);
-
- res = reply.readInt();
- ret_val = (0 == res) ? reply.readLong() : error_ret_val;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
-
- return ret_val;
- }
-
- public int transactSetLong(int method_code, long val) {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
-
- try {
- data.writeInterfaceToken(mInterfaceDesc);
- data.writeLong(val);
- mRemote.transact(method_code, data, reply, 0);
-
- return reply.readInt();
- }
- catch (RemoteException e) {
- return ERROR_DEAD_OBJECT;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
- }
-
- public String transactGetString(int method_code, String error_ret_val)
- throws RemoteException {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
- String ret_val;
-
- try {
- int res;
- data.writeInterfaceToken(mInterfaceDesc);
- mRemote.transact(method_code, data, reply, 0);
-
- res = reply.readInt();
- ret_val = (0 == res) ? reply.readString() : error_ret_val;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
-
- return ret_val;
- }
-
- public int transactSetString(int method_code, String val) {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
-
- try {
- data.writeInterfaceToken(mInterfaceDesc);
- data.writeString(val);
- mRemote.transact(method_code, data, reply, 0);
-
- return reply.readInt();
- }
- catch (RemoteException e) {
- return ERROR_DEAD_OBJECT;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
- }
-
- public InetSocketAddress transactGetSockaddr(int method_code)
- throws RemoteException {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
- InetSocketAddress ret_val = null;
-
- try {
- int res;
- data.writeInterfaceToken(mInterfaceDesc);
- mRemote.transact(method_code, data, reply, 0);
-
- res = reply.readInt();
- if (0 == res) {
- int type;
- int port = 0;
- String addrStr = null;
-
- type = reply.readInt();
-
- if (AF_INET == type) {
- int addr = reply.readInt();
- port = reply.readInt();
- addrStr = String.format(Locale.US, "%d.%d.%d.%d",
- (addr >> 24) & 0xFF,
- (addr >> 16) & 0xFF,
- (addr >> 8) & 0xFF,
- addr & 0xFF);
- } else if (AF_INET6 == type) {
- int addr1 = reply.readInt();
- int addr2 = reply.readInt();
- int addr3 = reply.readInt();
- int addr4 = reply.readInt();
-
- port = reply.readInt();
-
- int flowinfo = reply.readInt();
- int scope_id = reply.readInt();
-
- addrStr = String.format(Locale.US, "[%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X]",
- (addr1 >> 16) & 0xFFFF, addr1 & 0xFFFF,
- (addr2 >> 16) & 0xFFFF, addr2 & 0xFFFF,
- (addr3 >> 16) & 0xFFFF, addr3 & 0xFFFF,
- (addr4 >> 16) & 0xFFFF, addr4 & 0xFFFF);
- }
-
- if (null != addrStr) {
- ret_val = new InetSocketAddress(addrStr, port);
- }
- }
- }
- finally {
- reply.recycle();
- data.recycle();
- }
-
- return ret_val;
- }
-
- public int transactSetSockaddr(int method_code, InetSocketAddress addr) {
- android.os.Parcel data = android.os.Parcel.obtain();
- android.os.Parcel reply = android.os.Parcel.obtain();
- int ret_val = ERROR;
-
- try {
- data.writeInterfaceToken(mInterfaceDesc);
-
- if (null == addr) {
- data.writeInt(0);
- } else {
- data.writeInt(1);
- final InetAddress a = addr.getAddress();
- final byte[] b = a.getAddress();
- final int p = addr.getPort();
-
- if (a instanceof Inet4Address) {
- int v4addr = (((int)b[0] & 0xFF) << 24) |
- (((int)b[1] & 0xFF) << 16) |
- (((int)b[2] & 0xFF) << 8) |
- ((int)b[3] & 0xFF);
-
- data.writeInt(AF_INET);
- data.writeInt(v4addr);
- data.writeInt(p);
- } else
- if (a instanceof Inet6Address) {
- int i;
- Inet6Address v6 = (Inet6Address)a;
- data.writeInt(AF_INET6);
- for (i = 0; i < 4; ++i) {
- int aword = (((int)b[(i*4) + 0] & 0xFF) << 24) |
- (((int)b[(i*4) + 1] & 0xFF) << 16) |
- (((int)b[(i*4) + 2] & 0xFF) << 8) |
- ((int)b[(i*4) + 3] & 0xFF);
- data.writeInt(aword);
- }
- data.writeInt(p);
- data.writeInt(0); // flow info
- data.writeInt(v6.getScopeId());
- } else {
- return ERROR_BAD_VALUE;
- }
- }
-
- mRemote.transact(method_code, data, reply, 0);
- ret_val = reply.readInt();
- }
- catch (RemoteException e) {
- ret_val = ERROR_DEAD_OBJECT;
- }
- finally {
- reply.recycle();
- data.recycle();
- }
-
- return ret_val;
- }
-
- private IBinder mRemote;
- private String mInterfaceDesc;
-};
diff --git a/core/java/android/os/DropBoxManager.java b/core/java/android/os/DropBoxManager.java
index 97f0e0cf31e9..eeae25e9e913 100644
--- a/core/java/android/os/DropBoxManager.java
+++ b/core/java/android/os/DropBoxManager.java
@@ -16,9 +16,14 @@
package android.os;
+import static android.Manifest.permission.PACKAGE_USAGE_STATS;
+import static android.Manifest.permission.READ_LOGS;
+
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
-import android.annotation.SystemService;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SystemService;
import android.content.Context;
import android.util.Log;
@@ -351,16 +356,23 @@ public class DropBoxManager {
/**
* Gets the next entry from the drop box <em>after</em> the specified time.
- * Requires <code>android.permission.READ_LOGS</code>. You must always call
- * {@link Entry#close()} on the return value!
+ * You must always call {@link Entry#close()} on the return value!
*
* @param tag of entry to look for, null for all tags
* @param msec time of the last entry seen
* @return the next entry, or null if there are no more entries
*/
- public Entry getNextEntry(String tag, long msec) {
+ @RequiresPermission(allOf = { READ_LOGS, PACKAGE_USAGE_STATS })
+ public @Nullable Entry getNextEntry(String tag, long msec) {
try {
- return mService.getNextEntry(tag, msec);
+ return mService.getNextEntry(tag, msec, mContext.getOpPackageName());
+ } catch (SecurityException e) {
+ if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.P) {
+ throw e;
+ } else {
+ Log.w(TAG, e.getMessage());
+ return null;
+ }
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 213260fa9162..e32ed9deb270 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -33,6 +33,8 @@ import java.util.LinkedList;
public class Environment {
private static final String TAG = "Environment";
+ // NOTE: keep credential-protected paths in sync with StrictMode.java
+
private static final String ENV_EXTERNAL_STORAGE = "EXTERNAL_STORAGE";
private static final String ENV_ANDROID_ROOT = "ANDROID_ROOT";
private static final String ENV_ANDROID_DATA = "ANDROID_DATA";
@@ -149,6 +151,7 @@ public class Environment {
}
/** {@hide} */
+ @TestApi
public static File getStorageDirectory() {
return DIR_ANDROID_STORAGE;
}
diff --git a/core/java/android/os/FileBridge.java b/core/java/android/os/FileBridge.java
index 3ac88c564f41..21fd819f3d94 100644
--- a/core/java/android/os/FileBridge.java
+++ b/core/java/android/os/FileBridge.java
@@ -27,12 +27,12 @@ import libcore.io.IoBridge;
import libcore.io.IoUtils;
import libcore.io.Memory;
import libcore.io.Streams;
+import libcore.util.ArrayUtils;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteOrder;
-import java.util.Arrays;
/**
* Simple bridge that allows file access across process boundaries without
@@ -178,7 +178,7 @@ public class FileBridge extends Thread {
@Override
public void write(byte[] buffer, int byteOffset, int byteCount) throws IOException {
- Arrays.checkOffsetAndCount(buffer.length, byteOffset, byteCount);
+ ArrayUtils.throwsIfOutOfBounds(buffer.length, byteOffset, byteCount);
Memory.pokeInt(mTemp, 0, CMD_WRITE, ByteOrder.BIG_ENDIAN);
Memory.pokeInt(mTemp, 4, byteCount, ByteOrder.BIG_ENDIAN);
IoBridge.write(mClient, mTemp, 0, MSG_LENGTH);
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 88d6e847b644..3a3d9ea0b44f 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -53,32 +53,35 @@ import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Objects;
+import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
/**
- * Tools for managing files. Not for public consumption.
- * @hide
+ * Utility methods useful for working with files.
*/
public class FileUtils {
private static final String TAG = "FileUtils";
- public static final int S_IRWXU = 00700;
- public static final int S_IRUSR = 00400;
- public static final int S_IWUSR = 00200;
- public static final int S_IXUSR = 00100;
+ /** {@hide} */ public static final int S_IRWXU = 00700;
+ /** {@hide} */ public static final int S_IRUSR = 00400;
+ /** {@hide} */ public static final int S_IWUSR = 00200;
+ /** {@hide} */ public static final int S_IXUSR = 00100;
- public static final int S_IRWXG = 00070;
- public static final int S_IRGRP = 00040;
- public static final int S_IWGRP = 00020;
- public static final int S_IXGRP = 00010;
+ /** {@hide} */ public static final int S_IRWXG = 00070;
+ /** {@hide} */ public static final int S_IRGRP = 00040;
+ /** {@hide} */ public static final int S_IWGRP = 00020;
+ /** {@hide} */ public static final int S_IXGRP = 00010;
- public static final int S_IRWXO = 00007;
- public static final int S_IROTH = 00004;
- public static final int S_IWOTH = 00002;
- public static final int S_IXOTH = 00001;
+ /** {@hide} */ public static final int S_IRWXO = 00007;
+ /** {@hide} */ public static final int S_IROTH = 00004;
+ /** {@hide} */ public static final int S_IWOTH = 00002;
+ /** {@hide} */ public static final int S_IXOTH = 00001;
+
+ private FileUtils() {
+ }
/** Regular expression for safe filenames: no spaces or metacharacters.
*
@@ -90,10 +93,14 @@ public class FileUtils {
private static final File[] EMPTY = new File[0];
- private static final boolean ENABLE_COPY_OPTIMIZATIONS = true;
+ // non-final so it can be toggled by Robolectric's ShadowFileUtils
+ private static boolean sEnableCopyOptimizations = true;
private static final long COPY_CHECKPOINT_BYTES = 524288;
+ /**
+ * Listener that is called periodically as progress is made.
+ */
public interface ProgressListener {
public void onProgress(long progress);
}
@@ -105,6 +112,7 @@ public class FileUtils {
* @param uid to apply through {@code chown}, or -1 to leave unchanged
* @param gid to apply through {@code chown}, or -1 to leave unchanged
* @return 0 on success, otherwise errno.
+ * @hide
*/
public static int setPermissions(File path, int mode, int uid, int gid) {
return setPermissions(path.getAbsolutePath(), mode, uid, gid);
@@ -117,6 +125,7 @@ public class FileUtils {
* @param uid to apply through {@code chown}, or -1 to leave unchanged
* @param gid to apply through {@code chown}, or -1 to leave unchanged
* @return 0 on success, otherwise errno.
+ * @hide
*/
public static int setPermissions(String path, int mode, int uid, int gid) {
try {
@@ -145,6 +154,7 @@ public class FileUtils {
* @param uid to apply through {@code chown}, or -1 to leave unchanged
* @param gid to apply through {@code chown}, or -1 to leave unchanged
* @return 0 on success, otherwise errno.
+ * @hide
*/
public static int setPermissions(FileDescriptor fd, int mode, int uid, int gid) {
try {
@@ -166,7 +176,14 @@ public class FileUtils {
return 0;
}
- public static void copyPermissions(File from, File to) throws IOException {
+ /**
+ * Copy the owner UID, owner GID, and mode bits from one file to another.
+ *
+ * @param from File where attributes should be copied from.
+ * @param to File where attributes should be copied to.
+ * @hide
+ */
+ public static void copyPermissions(@NonNull File from, @NonNull File to) throws IOException {
try {
final StructStat stat = Os.stat(from.getAbsolutePath());
Os.chmod(to.getAbsolutePath(), stat.st_mode);
@@ -177,8 +194,10 @@ public class FileUtils {
}
/**
- * Return owning UID of given path, otherwise -1.
+ * @deprecated use {@link Os#stat(String)} instead.
+ * @hide
*/
+ @Deprecated
public static int getUid(String path) {
try {
return Os.stat(path).st_uid;
@@ -190,6 +209,8 @@ public class FileUtils {
/**
* Perform an fsync on the given FileOutputStream. The stream at this
* point must be flushed but not yet closed.
+ *
+ * @hide
*/
public static boolean sync(FileOutputStream stream) {
try {
@@ -204,6 +225,7 @@ public class FileUtils {
/**
* @deprecated use {@link #copy(File, File)} instead.
+ * @hide
*/
@Deprecated
public static boolean copyFile(File srcFile, File destFile) {
@@ -217,6 +239,7 @@ public class FileUtils {
/**
* @deprecated use {@link #copy(File, File)} instead.
+ * @hide
*/
@Deprecated
public static void copyFileOrThrow(File srcFile, File destFile) throws IOException {
@@ -227,6 +250,7 @@ public class FileUtils {
/**
* @deprecated use {@link #copy(InputStream, OutputStream)} instead.
+ * @hide
*/
@Deprecated
public static boolean copyToFile(InputStream inputStream, File destFile) {
@@ -240,6 +264,7 @@ public class FileUtils {
/**
* @deprecated use {@link #copy(InputStream, OutputStream)} instead.
+ * @hide
*/
@Deprecated
public static void copyToFileOrThrow(InputStream in, File destFile) throws IOException {
@@ -265,7 +290,7 @@ public class FileUtils {
* @return number of bytes copied.
*/
public static long copy(@NonNull File from, @NonNull File to) throws IOException {
- return copy(from, to, null, null);
+ return copy(from, to, null, null, null);
}
/**
@@ -274,16 +299,17 @@ public class FileUtils {
* Attempts to use several optimization strategies to copy the data in the
* kernel before falling back to a userspace copy as a last resort.
*
- * @param listener to be periodically notified as the copy progresses.
* @param signal to signal if the copy should be cancelled early.
+ * @param executor that listener events should be delivered via.
+ * @param listener to be periodically notified as the copy progresses.
* @return number of bytes copied.
*/
public static long copy(@NonNull File from, @NonNull File to,
- @Nullable ProgressListener listener, @Nullable CancellationSignal signal)
- throws IOException {
+ @Nullable CancellationSignal signal, @Nullable Executor executor,
+ @Nullable ProgressListener listener) throws IOException {
try (FileInputStream in = new FileInputStream(from);
FileOutputStream out = new FileOutputStream(to)) {
- return copy(in, out, listener, signal);
+ return copy(in, out, signal, executor, listener);
}
}
@@ -296,7 +322,7 @@ public class FileUtils {
* @return number of bytes copied.
*/
public static long copy(@NonNull InputStream in, @NonNull OutputStream out) throws IOException {
- return copy(in, out, null, null);
+ return copy(in, out, null, null, null);
}
/**
@@ -305,22 +331,23 @@ public class FileUtils {
* Attempts to use several optimization strategies to copy the data in the
* kernel before falling back to a userspace copy as a last resort.
*
- * @param listener to be periodically notified as the copy progresses.
* @param signal to signal if the copy should be cancelled early.
+ * @param executor that listener events should be delivered via.
+ * @param listener to be periodically notified as the copy progresses.
* @return number of bytes copied.
*/
public static long copy(@NonNull InputStream in, @NonNull OutputStream out,
- @Nullable ProgressListener listener, @Nullable CancellationSignal signal)
- throws IOException {
- if (ENABLE_COPY_OPTIMIZATIONS) {
+ @Nullable CancellationSignal signal, @Nullable Executor executor,
+ @Nullable ProgressListener listener) throws IOException {
+ if (sEnableCopyOptimizations) {
if (in instanceof FileInputStream && out instanceof FileOutputStream) {
return copy(((FileInputStream) in).getFD(), ((FileOutputStream) out).getFD(),
- listener, signal);
+ signal, executor, listener);
}
}
// Worse case fallback to userspace
- return copyInternalUserspace(in, out, listener, signal);
+ return copyInternalUserspace(in, out, signal, executor, listener);
}
/**
@@ -333,7 +360,7 @@ public class FileUtils {
*/
public static long copy(@NonNull FileDescriptor in, @NonNull FileDescriptor out)
throws IOException {
- return copy(in, out, null, null);
+ return copy(in, out, null, null, null);
}
/**
@@ -342,14 +369,15 @@ public class FileUtils {
* Attempts to use several optimization strategies to copy the data in the
* kernel before falling back to a userspace copy as a last resort.
*
- * @param listener to be periodically notified as the copy progresses.
* @param signal to signal if the copy should be cancelled early.
+ * @param executor that listener events should be delivered via.
+ * @param listener to be periodically notified as the copy progresses.
* @return number of bytes copied.
*/
public static long copy(@NonNull FileDescriptor in, @NonNull FileDescriptor out,
- @Nullable ProgressListener listener, @Nullable CancellationSignal signal)
- throws IOException {
- return copy(in, out, listener, signal, Long.MAX_VALUE);
+ @Nullable CancellationSignal signal, @Nullable Executor executor,
+ @Nullable ProgressListener listener) throws IOException {
+ return copy(in, out, Long.MAX_VALUE, signal, executor, listener);
}
/**
@@ -358,22 +386,24 @@ public class FileUtils {
* Attempts to use several optimization strategies to copy the data in the
* kernel before falling back to a userspace copy as a last resort.
*
- * @param listener to be periodically notified as the copy progresses.
- * @param signal to signal if the copy should be cancelled early.
* @param count the number of bytes to copy.
+ * @param signal to signal if the copy should be cancelled early.
+ * @param executor that listener events should be delivered via.
+ * @param listener to be periodically notified as the copy progresses.
* @return number of bytes copied.
+ * @hide
*/
- public static long copy(@NonNull FileDescriptor in, @NonNull FileDescriptor out,
- @Nullable ProgressListener listener, @Nullable CancellationSignal signal, long count)
- throws IOException {
- if (ENABLE_COPY_OPTIMIZATIONS) {
+ public static long copy(@NonNull FileDescriptor in, @NonNull FileDescriptor out, long count,
+ @Nullable CancellationSignal signal, @Nullable Executor executor,
+ @Nullable ProgressListener listener) throws IOException {
+ if (sEnableCopyOptimizations) {
try {
final StructStat st_in = Os.fstat(in);
final StructStat st_out = Os.fstat(out);
if (S_ISREG(st_in.st_mode) && S_ISREG(st_out.st_mode)) {
- return copyInternalSendfile(in, out, listener, signal, count);
+ return copyInternalSendfile(in, out, count, signal, executor, listener);
} else if (S_ISFIFO(st_in.st_mode) || S_ISFIFO(st_out.st_mode)) {
- return copyInternalSplice(in, out, listener, signal, count);
+ return copyInternalSplice(in, out, count, signal, executor, listener);
}
} catch (ErrnoException e) {
throw e.rethrowAsIOException();
@@ -381,15 +411,17 @@ public class FileUtils {
}
// Worse case fallback to userspace
- return copyInternalUserspace(in, out, listener, signal, count);
+ return copyInternalUserspace(in, out, count, signal, executor, listener);
}
/**
* Requires one of input or output to be a pipe.
+ *
+ * @hide
*/
@VisibleForTesting
- public static long copyInternalSplice(FileDescriptor in, FileDescriptor out,
- ProgressListener listener, CancellationSignal signal, long count)
+ public static long copyInternalSplice(FileDescriptor in, FileDescriptor out, long count,
+ CancellationSignal signal, Executor executor, ProgressListener listener)
throws ErrnoException {
long progress = 0;
long checkpoint = 0;
@@ -405,24 +437,32 @@ public class FileUtils {
if (signal != null) {
signal.throwIfCanceled();
}
- if (listener != null) {
- listener.onProgress(progress);
+ if (executor != null && listener != null) {
+ final long progressSnapshot = progress;
+ executor.execute(() -> {
+ listener.onProgress(progressSnapshot);
+ });
}
checkpoint = 0;
}
}
- if (listener != null) {
- listener.onProgress(progress);
+ if (executor != null && listener != null) {
+ final long progressSnapshot = progress;
+ executor.execute(() -> {
+ listener.onProgress(progressSnapshot);
+ });
}
return progress;
}
/**
* Requires both input and output to be a regular file.
+ *
+ * @hide
*/
@VisibleForTesting
- public static long copyInternalSendfile(FileDescriptor in, FileDescriptor out,
- ProgressListener listener, CancellationSignal signal, long count)
+ public static long copyInternalSendfile(FileDescriptor in, FileDescriptor out, long count,
+ CancellationSignal signal, Executor executor, ProgressListener listener)
throws ErrnoException {
long progress = 0;
long checkpoint = 0;
@@ -437,33 +477,52 @@ public class FileUtils {
if (signal != null) {
signal.throwIfCanceled();
}
- if (listener != null) {
- listener.onProgress(progress);
+ if (executor != null && listener != null) {
+ final long progressSnapshot = progress;
+ executor.execute(() -> {
+ listener.onProgress(progressSnapshot);
+ });
}
checkpoint = 0;
}
}
- if (listener != null) {
- listener.onProgress(progress);
+ if (executor != null && listener != null) {
+ final long progressSnapshot = progress;
+ executor.execute(() -> {
+ listener.onProgress(progressSnapshot);
+ });
}
return progress;
}
+ /** {@hide} */
+ @Deprecated
@VisibleForTesting
public static long copyInternalUserspace(FileDescriptor in, FileDescriptor out,
- ProgressListener listener, CancellationSignal signal, long count) throws IOException {
+ ProgressListener listener, CancellationSignal signal, long count)
+ throws IOException {
+ return copyInternalUserspace(in, out, count, signal, Runnable::run, listener);
+ }
+
+ /** {@hide} */
+ @VisibleForTesting
+ public static long copyInternalUserspace(FileDescriptor in, FileDescriptor out, long count,
+ CancellationSignal signal, Executor executor, ProgressListener listener)
+ throws IOException {
if (count != Long.MAX_VALUE) {
return copyInternalUserspace(new SizedInputStream(new FileInputStream(in), count),
- new FileOutputStream(out), listener, signal);
+ new FileOutputStream(out), signal, executor, listener);
} else {
return copyInternalUserspace(new FileInputStream(in),
- new FileOutputStream(out), listener, signal);
+ new FileOutputStream(out), signal, executor, listener);
}
}
+ /** {@hide} */
@VisibleForTesting
public static long copyInternalUserspace(InputStream in, OutputStream out,
- ProgressListener listener, CancellationSignal signal) throws IOException {
+ CancellationSignal signal, Executor executor, ProgressListener listener)
+ throws IOException {
long progress = 0;
long checkpoint = 0;
byte[] buffer = new byte[8192];
@@ -479,14 +538,20 @@ public class FileUtils {
if (signal != null) {
signal.throwIfCanceled();
}
- if (listener != null) {
- listener.onProgress(progress);
+ if (executor != null && listener != null) {
+ final long progressSnapshot = progress;
+ executor.execute(() -> {
+ listener.onProgress(progressSnapshot);
+ });
}
checkpoint = 0;
}
}
- if (listener != null) {
- listener.onProgress(progress);
+ if (executor != null && listener != null) {
+ final long progressSnapshot = progress;
+ executor.execute(() -> {
+ listener.onProgress(progressSnapshot);
+ });
}
return progress;
}
@@ -494,6 +559,7 @@ public class FileUtils {
/**
* Check if a filename is "safe" (no metacharacters or spaces).
* @param file The file to check
+ * @hide
*/
public static boolean isFilenameSafe(File file) {
// Note, we check whether it matches what's known to be safe,
@@ -509,6 +575,7 @@ public class FileUtils {
* @param ellipsis to add of the file was truncated (can be null)
* @return the contents of the file, possibly truncated
* @throws IOException if something goes wrong reading the file
+ * @hide
*/
public static String readTextFile(File file, int max, String ellipsis) throws IOException {
InputStream input = new FileInputStream(file);
@@ -563,13 +630,16 @@ public class FileUtils {
}
}
+ /** {@hide} */
public static void stringToFile(File file, String string) throws IOException {
stringToFile(file.getAbsolutePath(), string);
}
- /*
+ /**
* Writes the bytes given in {@code content} to the file whose absolute path
* is {@code filename}.
+ *
+ * @hide
*/
public static void bytesToFile(String filename, byte[] content) throws IOException {
if (filename.startsWith("/proc/")) {
@@ -592,18 +662,23 @@ public class FileUtils {
* @param filename
* @param string
* @throws IOException
+ * @hide
*/
public static void stringToFile(String filename, String string) throws IOException {
bytesToFile(filename, string.getBytes(StandardCharsets.UTF_8));
}
/**
- * Computes the checksum of a file using the CRC32 checksum routine.
- * The value of the checksum is returned.
+ * Computes the checksum of a file using the CRC32 checksum routine. The
+ * value of the checksum is returned.
*
- * @param file the file to checksum, must not be null
+ * @param file the file to checksum, must not be null
* @return the checksum value or an exception is thrown.
+ * @deprecated this is a weak hashing algorithm, and should not be used due
+ * to its potential for collision.
+ * @hide
*/
+ @Deprecated
public static long checksumCrc32(File file) throws FileNotFoundException, IOException {
CRC32 checkSummer = new CRC32();
CheckedInputStream cis = null;
@@ -632,6 +707,7 @@ public class FileUtils {
* @param minCount Always keep at least this many files.
* @param minAgeMs Always keep files younger than this age, in milliseconds.
* @return if any files were deleted.
+ * @hide
*/
public static boolean deleteOlderFiles(File dir, int minCount, long minAgeMs) {
if (minCount < 0 || minAgeMs < 0) {
@@ -673,6 +749,8 @@ public class FileUtils {
* Both files <em>must</em> have been resolved using
* {@link File#getCanonicalFile()} to avoid symlink or path traversal
* attacks.
+ *
+ * @hide
*/
public static boolean contains(File[] dirs, File file) {
for (File dir : dirs) {
@@ -690,12 +768,15 @@ public class FileUtils {
* Both files <em>must</em> have been resolved using
* {@link File#getCanonicalFile()} to avoid symlink or path traversal
* attacks.
+ *
+ * @hide
*/
public static boolean contains(File dir, File file) {
if (dir == null || file == null) return false;
return contains(dir.getAbsolutePath(), file.getAbsolutePath());
}
+ /** {@hide} */
public static boolean contains(String dirPath, String filePath) {
if (dirPath.equals(filePath)) {
return true;
@@ -706,6 +787,7 @@ public class FileUtils {
return filePath.startsWith(dirPath);
}
+ /** {@hide} */
public static boolean deleteContentsAndDir(File dir) {
if (deleteContents(dir)) {
return dir.delete();
@@ -714,6 +796,7 @@ public class FileUtils {
}
}
+ /** {@hide} */
public static boolean deleteContents(File dir) {
File[] files = dir.listFiles();
boolean success = true;
@@ -743,6 +826,8 @@ public class FileUtils {
/**
* Check if given filename is valid for an ext4 filesystem.
+ *
+ * @hide
*/
public static boolean isValidExtFilename(String name) {
return (name != null) && name.equals(buildValidExtFilename(name));
@@ -751,6 +836,8 @@ public class FileUtils {
/**
* Mutate the given filename to make it valid for an ext4 filesystem,
* replacing any invalid characters with "_".
+ *
+ * @hide
*/
public static String buildValidExtFilename(String name) {
if (TextUtils.isEmpty(name) || ".".equals(name) || "..".equals(name)) {
@@ -792,6 +879,8 @@ public class FileUtils {
/**
* Check if given filename is valid for a FAT filesystem.
+ *
+ * @hide
*/
public static boolean isValidFatFilename(String name) {
return (name != null) && name.equals(buildValidFatFilename(name));
@@ -800,6 +889,8 @@ public class FileUtils {
/**
* Mutate the given filename to make it valid for a FAT filesystem,
* replacing any invalid characters with "_".
+ *
+ * @hide
*/
public static String buildValidFatFilename(String name) {
if (TextUtils.isEmpty(name) || ".".equals(name) || "..".equals(name)) {
@@ -820,6 +911,7 @@ public class FileUtils {
return res.toString();
}
+ /** {@hide} */
@VisibleForTesting
public static String trimFilename(String str, int maxBytes) {
final StringBuilder res = new StringBuilder(str);
@@ -827,6 +919,7 @@ public class FileUtils {
return res.toString();
}
+ /** {@hide} */
private static void trimFilename(StringBuilder res, int maxBytes) {
byte[] raw = res.toString().getBytes(StandardCharsets.UTF_8);
if (raw.length > maxBytes) {
@@ -839,12 +932,14 @@ public class FileUtils {
}
}
+ /** {@hide} */
public static String rewriteAfterRename(File beforeDir, File afterDir, String path) {
if (path == null) return null;
final File result = rewriteAfterRename(beforeDir, afterDir, new File(path));
return (result != null) ? result.getAbsolutePath() : null;
}
+ /** {@hide} */
public static String[] rewriteAfterRename(File beforeDir, File afterDir, String[] paths) {
if (paths == null) return null;
final String[] result = new String[paths.length];
@@ -858,6 +953,8 @@ public class FileUtils {
* Given a path under the "before" directory, rewrite it to live under the
* "after" directory. For example, {@code /before/foo/bar.txt} would become
* {@code /after/foo/bar.txt}.
+ *
+ * @hide
*/
public static File rewriteAfterRename(File beforeDir, File afterDir, File file) {
if (file == null || beforeDir == null || afterDir == null) return null;
@@ -869,6 +966,7 @@ public class FileUtils {
return null;
}
+ /** {@hide} */
private static File buildUniqueFileWithExtension(File parent, String name, String ext)
throws FileNotFoundException {
File file = buildFile(parent, name, ext);
@@ -895,6 +993,7 @@ public class FileUtils {
* 'example.txt' or 'example (1).txt', etc.
*
* @throws FileNotFoundException
+ * @hide
*/
public static File buildUniqueFile(File parent, String mimeType, String displayName)
throws FileNotFoundException {
@@ -905,6 +1004,8 @@ public class FileUtils {
/**
* Generates a unique file name under the given parent directory, keeping
* any extension intact.
+ *
+ * @hide
*/
public static File buildUniqueFile(File parent, String displayName)
throws FileNotFoundException {
@@ -929,6 +1030,8 @@ public class FileUtils {
* If the display name doesn't have an extension that matches the requested MIME type, the
* extension is regarded as a part of filename and default extension for that MIME type is
* appended.
+ *
+ * @hide
*/
public static String[] splitFileName(String mimeType, String displayName) {
String name;
@@ -975,6 +1078,7 @@ public class FileUtils {
return new String[] { name, ext };
}
+ /** {@hide} */
private static File buildFile(File parent, String name, String ext) {
if (TextUtils.isEmpty(ext)) {
return new File(parent, name);
@@ -983,6 +1087,7 @@ public class FileUtils {
}
}
+ /** {@hide} */
public static @NonNull String[] listOrEmpty(@Nullable File dir) {
if (dir == null) return EmptyArray.STRING;
final String[] res = dir.list();
@@ -993,6 +1098,7 @@ public class FileUtils {
}
}
+ /** {@hide} */
public static @NonNull File[] listFilesOrEmpty(@Nullable File dir) {
if (dir == null) return EMPTY;
final File[] res = dir.listFiles();
@@ -1003,6 +1109,7 @@ public class FileUtils {
}
}
+ /** {@hide} */
public static @NonNull File[] listFilesOrEmpty(@Nullable File dir, FilenameFilter filter) {
if (dir == null) return EMPTY;
final File[] res = dir.listFiles(filter);
@@ -1013,6 +1120,7 @@ public class FileUtils {
}
}
+ /** {@hide} */
public static @Nullable File newFileOrNull(@Nullable String path) {
return (path != null) ? new File(path) : null;
}
@@ -1021,6 +1129,8 @@ public class FileUtils {
* Creates a directory with name {@code name} under an existing directory {@code baseDir}.
* Returns a {@code File} object representing the directory on success, {@code null} on
* failure.
+ *
+ * @hide
*/
public static @Nullable File createDir(File baseDir, String name) {
final File dir = new File(baseDir, name);
@@ -1036,6 +1146,8 @@ public class FileUtils {
* Round the given size of a storage device to a nice round power-of-two
* value, such as 256MB or 32GB. This avoids showing weird values like
* "29.5GB" in UI.
+ *
+ * @hide
*/
public static long roundStorageSize(long size) {
long val = 1;
@@ -1050,6 +1162,23 @@ public class FileUtils {
return val * pow;
}
+ /**
+ * Closes the given object quietly, ignoring any checked exceptions. Does
+ * nothing if the given object is {@code null}.
+ */
+ public static void closeQuietly(@Nullable AutoCloseable closeable) {
+ IoUtils.closeQuietly(closeable);
+ }
+
+ /**
+ * Closes the given object quietly, ignoring any checked exceptions. Does
+ * nothing if the given object is {@code null}.
+ */
+ public static void closeQuietly(@Nullable FileDescriptor fd) {
+ IoUtils.closeQuietly(fd);
+ }
+
+ /** {@hide} */
@VisibleForTesting
public static class MemoryPipe extends Thread implements AutoCloseable {
private final FileDescriptor[] pipe;
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java
index f5bca04ae104..9b202f27bd42 100644
--- a/core/java/android/os/Handler.java
+++ b/core/java/android/os/Handler.java
@@ -798,8 +798,6 @@ public class Handler {
/**
* Check if there are any pending posts of messages with callback r in
* the message queue.
- *
- * @hide
*/
public final boolean hasCallbacks(Runnable r) {
return mQueue.hasMessages(this, r, null);
diff --git a/core/java/android/os/IBatteryPropertiesListener.aidl b/core/java/android/os/IBatteryPropertiesListener.aidl
deleted file mode 100644
index 7e239249a33c..000000000000
--- a/core/java/android/os/IBatteryPropertiesListener.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-** Copyright 2013, 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.os;
-
-import android.os.BatteryProperties;
-
-/**
- * {@hide}
- */
-
-oneway interface IBatteryPropertiesListener {
- void batteryPropertiesChanged(in BatteryProperties props);
-}
diff --git a/core/java/android/os/IBatteryPropertiesRegistrar.aidl b/core/java/android/os/IBatteryPropertiesRegistrar.aidl
index 468b58b101e5..57a6873c88e0 100644
--- a/core/java/android/os/IBatteryPropertiesRegistrar.aidl
+++ b/core/java/android/os/IBatteryPropertiesRegistrar.aidl
@@ -16,7 +16,6 @@
package android.os;
-import android.os.IBatteryPropertiesListener;
import android.os.BatteryProperty;
/**
@@ -24,8 +23,6 @@ import android.os.BatteryProperty;
*/
interface IBatteryPropertiesRegistrar {
- void registerListener(IBatteryPropertiesListener listener);
- void unregisterListener(IBatteryPropertiesListener listener);
int getProperty(in int id, out BatteryProperty prop);
oneway void scheduleUpdate();
}
diff --git a/core/java/android/os/IncidentReportArgs.java b/core/java/android/os/IncidentReportArgs.java
index 1aeac5f53be0..3ca7f77b90d7 100644
--- a/core/java/android/os/IncidentReportArgs.java
+++ b/core/java/android/os/IncidentReportArgs.java
@@ -144,7 +144,6 @@ public final class IncidentReportArgs implements Parcelable {
/**
* Set this incident report privacy policy spec.
- * @hide
*/
public void setPrivacyPolicy(int dest) {
switch (dest) {
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index b1c33c2dac00..7c2ecc5080e1 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -18,6 +18,7 @@ package android.os;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.TestApi;
import android.os.MessageQueueProto;
import android.util.Log;
import android.util.Printer;
@@ -458,6 +459,7 @@ public final class MessageQueue {
*
* @hide
*/
+ @TestApi
public int postSyncBarrier() {
return postSyncBarrier(SystemClock.uptimeMillis());
}
@@ -501,6 +503,7 @@ public final class MessageQueue {
*
* @hide
*/
+ @TestApi
public void removeSyncBarrier(int token) {
// Remove a sync barrier token from the queue.
// If the queue is no longer stalled by a barrier then wake it.
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 514292872e90..887826090714 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -16,6 +16,7 @@
package android.os;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -32,6 +33,7 @@ import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;
import dalvik.system.VMRuntime;
+import libcore.util.ArrayUtils;
import libcore.util.SneakyThrow;
import java.io.ByteArrayInputStream;
@@ -47,7 +49,6 @@ import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -381,6 +382,7 @@ public final class Parcel {
/**
* Retrieve a new Parcel object from the pool.
*/
+ @NonNull
public static Parcel obtain() {
final Parcel[] pool = sOwnedPool;
synchronized (pool) {
@@ -432,7 +434,7 @@ public final class Parcel {
*
* @hide
*/
- public void setReadWriteHelper(ReadWriteHelper helper) {
+ public void setReadWriteHelper(@Nullable ReadWriteHelper helper) {
mReadWriteHelper = helper != null ? helper : ReadWriteHelper.DEFAULT;
}
@@ -543,7 +545,7 @@ public final class Parcel {
/**
* Set the bytes in data to be the raw bytes of this Parcel.
*/
- public final void unmarshall(byte[] data, int offset, int length) {
+ public final void unmarshall(@NonNull byte[] data, int offset, int length) {
updateNativeSize(nativeUnmarshall(mNativePtr, data, offset, length));
}
@@ -565,6 +567,7 @@ public final class Parcel {
}
/** @hide */
+ @Nullable
public final Object getClassCookie(Class clz) {
return mClassCookies != null ? mClassCookies.get(clz) : null;
}
@@ -615,7 +618,7 @@ public final class Parcel {
* growing {@link #dataCapacity} if needed.
* @param b Bytes to place into the parcel.
*/
- public final void writeByteArray(byte[] b) {
+ public final void writeByteArray(@Nullable byte[] b) {
writeByteArray(b, 0, (b != null) ? b.length : 0);
}
@@ -626,12 +629,12 @@ public final class Parcel {
* @param offset Index of first byte to be written.
* @param len Number of bytes to write.
*/
- public final void writeByteArray(byte[] b, int offset, int len) {
+ public final void writeByteArray(@Nullable byte[] b, int offset, int len) {
if (b == null) {
writeInt(-1);
return;
}
- Arrays.checkOffsetAndCount(b.length, offset, len);
+ ArrayUtils.throwsIfOutOfBounds(b.length, offset, len);
nativeWriteByteArray(mNativePtr, b, offset, len);
}
@@ -642,7 +645,7 @@ public final class Parcel {
* {@hide}
* {@SystemApi}
*/
- public final void writeBlob(byte[] b) {
+ public final void writeBlob(@Nullable byte[] b) {
writeBlob(b, 0, (b != null) ? b.length : 0);
}
@@ -655,12 +658,12 @@ public final class Parcel {
* {@hide}
* {@SystemApi}
*/
- public final void writeBlob(byte[] b, int offset, int len) {
+ public final void writeBlob(@Nullable byte[] b, int offset, int len) {
if (b == null) {
writeInt(-1);
return;
}
- Arrays.checkOffsetAndCount(b.length, offset, len);
+ ArrayUtils.throwsIfOutOfBounds(b.length, offset, len);
nativeWriteBlob(mNativePtr, b, offset, len);
}
@@ -700,7 +703,7 @@ public final class Parcel {
* Write a string value into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
*/
- public final void writeString(String val) {
+ public final void writeString(@Nullable String val) {
mReadWriteHelper.writeString(this, val);
}
@@ -711,11 +714,17 @@ public final class Parcel {
*
* @hide
*/
- public void writeStringNoHelper(String val) {
+ public void writeStringNoHelper(@Nullable String val) {
nativeWriteString(mNativePtr, val);
}
- /** @hide */
+ /**
+ * Write a boolean value into the parcel at the current dataPosition(),
+ * growing dataCapacity() if needed.
+ *
+ * <p>Note: This method currently delegates to writeInt with a value of 1 or 0
+ * for true or false, respectively, but may change in the future.
+ */
public final void writeBoolean(boolean val) {
writeInt(val ? 1 : 0);
}
@@ -725,7 +734,7 @@ public final class Parcel {
* growing dataCapacity() if needed.
* @hide
*/
- public final void writeCharSequence(CharSequence val) {
+ public final void writeCharSequence(@Nullable CharSequence val) {
TextUtils.writeToParcel(val, this, 0);
}
@@ -755,7 +764,7 @@ public final class Parcel {
* accepts contextual flags and will close the original file descriptor
* if {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set.</p>
*/
- public final void writeFileDescriptor(FileDescriptor val) {
+ public final void writeFileDescriptor(@NonNull FileDescriptor val) {
updateNativeSize(nativeWriteFileDescriptor(mNativePtr, val));
}
@@ -780,7 +789,7 @@ public final class Parcel {
* {@hide}
* This will be the new name for writeFileDescriptor, for consistency.
**/
- public final void writeRawFileDescriptor(FileDescriptor val) {
+ public final void writeRawFileDescriptor(@NonNull FileDescriptor val) {
nativeWriteFileDescriptor(mNativePtr, val);
}
@@ -790,7 +799,7 @@ public final class Parcel {
*
* @param value The array of objects to be written.
*/
- public final void writeRawFileDescriptorArray(FileDescriptor[] value) {
+ public final void writeRawFileDescriptorArray(@Nullable FileDescriptor[] value) {
if (value != null) {
int N = value.length;
writeInt(N);
@@ -805,6 +814,9 @@ public final class Parcel {
/**
* Write a byte value into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
+ *
+ * <p>Note: This method currently delegates to writeInt but may change in
+ * the future.
*/
public final void writeByte(byte val) {
writeInt(val);
@@ -821,7 +833,7 @@ public final class Parcel {
* this method, since the Bundle class provides a type-safe API that
* allows you to avoid mysterious type errors at the point of marshalling.
*/
- public final void writeMap(Map val) {
+ public final void writeMap(@Nullable Map val) {
writeMapInternal((Map<String, Object>) val);
}
@@ -829,7 +841,7 @@ public final class Parcel {
* Flatten a Map into the parcel at the current dataPosition(),
* growing dataCapacity() if needed. The Map keys must be String objects.
*/
- /* package */ void writeMapInternal(Map<String,Object> val) {
+ /* package */ void writeMapInternal(@Nullable Map<String,Object> val) {
if (val == null) {
writeInt(-1);
return;
@@ -846,7 +858,7 @@ public final class Parcel {
* Flatten an ArrayMap into the parcel at the current dataPosition(),
* growing dataCapacity() if needed. The Map keys must be String objects.
*/
- /* package */ void writeArrayMapInternal(ArrayMap<String, Object> val) {
+ /* package */ void writeArrayMapInternal(@Nullable ArrayMap<String, Object> val) {
if (val == null) {
writeInt(-1);
return;
@@ -875,7 +887,7 @@ public final class Parcel {
/**
* @hide For testing only.
*/
- public void writeArrayMap(ArrayMap<String, Object> val) {
+ public void writeArrayMap(@Nullable ArrayMap<String, Object> val) {
writeArrayMapInternal(val);
}
@@ -898,7 +910,7 @@ public final class Parcel {
* Flatten a Bundle into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
*/
- public final void writeBundle(Bundle val) {
+ public final void writeBundle(@Nullable Bundle val) {
if (val == null) {
writeInt(-1);
return;
@@ -911,7 +923,7 @@ public final class Parcel {
* Flatten a PersistableBundle into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
*/
- public final void writePersistableBundle(PersistableBundle val) {
+ public final void writePersistableBundle(@Nullable PersistableBundle val) {
if (val == null) {
writeInt(-1);
return;
@@ -924,7 +936,7 @@ public final class Parcel {
* Flatten a Size into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
*/
- public final void writeSize(Size val) {
+ public final void writeSize(@NonNull Size val) {
writeInt(val.getWidth());
writeInt(val.getHeight());
}
@@ -933,7 +945,7 @@ public final class Parcel {
* Flatten a SizeF into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
*/
- public final void writeSizeF(SizeF val) {
+ public final void writeSizeF(@NonNull SizeF val) {
writeFloat(val.getWidth());
writeFloat(val.getHeight());
}
@@ -943,7 +955,7 @@ public final class Parcel {
* dataCapacity() if needed. The List values are written using
* {@link #writeValue} and must follow the specification there.
*/
- public final void writeList(List val) {
+ public final void writeList(@Nullable List val) {
if (val == null) {
writeInt(-1);
return;
@@ -962,7 +974,7 @@ public final class Parcel {
* growing dataCapacity() if needed. The array values are written using
* {@link #writeValue} and must follow the specification there.
*/
- public final void writeArray(Object[] val) {
+ public final void writeArray(@Nullable Object[] val) {
if (val == null) {
writeInt(-1);
return;
@@ -982,7 +994,7 @@ public final class Parcel {
* values are written using {@link #writeValue} and must follow the
* specification there.
*/
- public final void writeSparseArray(SparseArray<Object> val) {
+ public final void writeSparseArray(@Nullable SparseArray<Object> val) {
if (val == null) {
writeInt(-1);
return;
@@ -997,7 +1009,7 @@ public final class Parcel {
}
}
- public final void writeSparseBooleanArray(SparseBooleanArray val) {
+ public final void writeSparseBooleanArray(@Nullable SparseBooleanArray val) {
if (val == null) {
writeInt(-1);
return;
@@ -1015,7 +1027,7 @@ public final class Parcel {
/**
* @hide
*/
- public final void writeSparseIntArray(SparseIntArray val) {
+ public final void writeSparseIntArray(@Nullable SparseIntArray val) {
if (val == null) {
writeInt(-1);
return;
@@ -1030,7 +1042,7 @@ public final class Parcel {
}
}
- public final void writeBooleanArray(boolean[] val) {
+ public final void writeBooleanArray(@Nullable boolean[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1042,6 +1054,7 @@ public final class Parcel {
}
}
+ @Nullable
public final boolean[] createBooleanArray() {
int N = readInt();
// >>2 as a fast divide-by-4 works in the create*Array() functions
@@ -1058,7 +1071,7 @@ public final class Parcel {
}
}
- public final void readBooleanArray(boolean[] val) {
+ public final void readBooleanArray(@NonNull boolean[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -1069,7 +1082,7 @@ public final class Parcel {
}
}
- public final void writeCharArray(char[] val) {
+ public final void writeCharArray(@Nullable char[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1081,6 +1094,7 @@ public final class Parcel {
}
}
+ @Nullable
public final char[] createCharArray() {
int N = readInt();
if (N >= 0 && N <= (dataAvail() >> 2)) {
@@ -1094,7 +1108,7 @@ public final class Parcel {
}
}
- public final void readCharArray(char[] val) {
+ public final void readCharArray(@NonNull char[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -1105,7 +1119,7 @@ public final class Parcel {
}
}
- public final void writeIntArray(int[] val) {
+ public final void writeIntArray(@Nullable int[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1117,6 +1131,7 @@ public final class Parcel {
}
}
+ @Nullable
public final int[] createIntArray() {
int N = readInt();
if (N >= 0 && N <= (dataAvail() >> 2)) {
@@ -1130,7 +1145,7 @@ public final class Parcel {
}
}
- public final void readIntArray(int[] val) {
+ public final void readIntArray(@NonNull int[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -1141,7 +1156,7 @@ public final class Parcel {
}
}
- public final void writeLongArray(long[] val) {
+ public final void writeLongArray(@Nullable long[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1153,6 +1168,7 @@ public final class Parcel {
}
}
+ @Nullable
public final long[] createLongArray() {
int N = readInt();
// >>3 because stored longs are 64 bits
@@ -1167,7 +1183,7 @@ public final class Parcel {
}
}
- public final void readLongArray(long[] val) {
+ public final void readLongArray(@NonNull long[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -1178,7 +1194,7 @@ public final class Parcel {
}
}
- public final void writeFloatArray(float[] val) {
+ public final void writeFloatArray(@Nullable float[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1190,6 +1206,7 @@ public final class Parcel {
}
}
+ @Nullable
public final float[] createFloatArray() {
int N = readInt();
// >>2 because stored floats are 4 bytes
@@ -1204,7 +1221,7 @@ public final class Parcel {
}
}
- public final void readFloatArray(float[] val) {
+ public final void readFloatArray(@NonNull float[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -1215,7 +1232,7 @@ public final class Parcel {
}
}
- public final void writeDoubleArray(double[] val) {
+ public final void writeDoubleArray(@Nullable double[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1227,6 +1244,7 @@ public final class Parcel {
}
}
+ @Nullable
public final double[] createDoubleArray() {
int N = readInt();
// >>3 because stored doubles are 8 bytes
@@ -1241,7 +1259,7 @@ public final class Parcel {
}
}
- public final void readDoubleArray(double[] val) {
+ public final void readDoubleArray(@NonNull double[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -1252,7 +1270,7 @@ public final class Parcel {
}
}
- public final void writeStringArray(String[] val) {
+ public final void writeStringArray(@Nullable String[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1264,6 +1282,7 @@ public final class Parcel {
}
}
+ @Nullable
public final String[] createStringArray() {
int N = readInt();
if (N >= 0) {
@@ -1277,7 +1296,7 @@ public final class Parcel {
}
}
- public final void readStringArray(String[] val) {
+ public final void readStringArray(@NonNull String[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -1288,7 +1307,7 @@ public final class Parcel {
}
}
- public final void writeBinderArray(IBinder[] val) {
+ public final void writeBinderArray(@Nullable IBinder[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1303,7 +1322,7 @@ public final class Parcel {
/**
* @hide
*/
- public final void writeCharSequenceArray(CharSequence[] val) {
+ public final void writeCharSequenceArray(@Nullable CharSequence[] val) {
if (val != null) {
int N = val.length;
writeInt(N);
@@ -1318,7 +1337,7 @@ public final class Parcel {
/**
* @hide
*/
- public final void writeCharSequenceList(ArrayList<CharSequence> val) {
+ public final void writeCharSequenceList(@Nullable ArrayList<CharSequence> val) {
if (val != null) {
int N = val.size();
writeInt(N);
@@ -1330,6 +1349,7 @@ public final class Parcel {
}
}
+ @Nullable
public final IBinder[] createBinderArray() {
int N = readInt();
if (N >= 0) {
@@ -1343,7 +1363,7 @@ public final class Parcel {
}
}
- public final void readBinderArray(IBinder[] val) {
+ public final void readBinderArray(@NonNull IBinder[] val) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -1368,14 +1388,14 @@ public final class Parcel {
* @see #readTypedList
* @see Parcelable
*/
- public final <T extends Parcelable> void writeTypedList(List<T> val) {
+ public final <T extends Parcelable> void writeTypedList(@Nullable List<T> val) {
writeTypedList(val, 0);
}
/**
* @hide
*/
- public <T extends Parcelable> void writeTypedList(List<T> val, int parcelableFlags) {
+ public <T extends Parcelable> void writeTypedList(@Nullable List<T> val, int parcelableFlags) {
if (val == null) {
writeInt(-1);
return;
@@ -1400,7 +1420,7 @@ public final class Parcel {
* @see #createStringArrayList
* @see #readStringList
*/
- public final void writeStringList(List<String> val) {
+ public final void writeStringList(@Nullable List<String> val) {
if (val == null) {
writeInt(-1);
return;
@@ -1425,7 +1445,7 @@ public final class Parcel {
* @see #createBinderArrayList
* @see #readBinderList
*/
- public final void writeBinderList(List<IBinder> val) {
+ public final void writeBinderList(@Nullable List<IBinder> val) {
if (val == null) {
writeInt(-1);
return;
@@ -1445,9 +1465,8 @@ public final class Parcel {
* {@link #readParcelableList(List, ClassLoader)} if required.
*
* @see #readParcelableList(List, ClassLoader)
- * @hide
*/
- public final <T extends Parcelable> void writeParcelableList(List<T> val, int flags) {
+ public final <T extends Parcelable> void writeParcelableList(@Nullable List<T> val, int flags) {
if (val == null) {
writeInt(-1);
return;
@@ -1480,7 +1499,7 @@ public final class Parcel {
* @see #writeParcelableArray
* @see Parcelable.Creator
*/
- public final <T extends Parcelable> void writeTypedArray(T[] val,
+ public final <T extends Parcelable> void writeTypedArray(@Nullable T[] val,
int parcelableFlags) {
if (val != null) {
int N = val.length;
@@ -1502,7 +1521,8 @@ public final class Parcel {
*
* @see #readTypedObject
*/
- public final <T extends Parcelable> void writeTypedObject(T val, int parcelableFlags) {
+ public final <T extends Parcelable> void writeTypedObject(@Nullable T val,
+ int parcelableFlags) {
if (val != null) {
writeInt(1);
val.writeToParcel(this, parcelableFlags);
@@ -1554,7 +1574,7 @@ public final class Parcel {
* Binder calls (where {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE}
* should be used).</p>
*/
- public final void writeValue(Object v) {
+ public final void writeValue(@Nullable Object v) {
if (v == null) {
writeInt(VAL_NULL);
} else if (v instanceof String) {
@@ -1666,7 +1686,7 @@ public final class Parcel {
* @param parcelableFlags Contextual flags as per
* {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}.
*/
- public final void writeParcelable(Parcelable p, int parcelableFlags) {
+ public final void writeParcelable(@Nullable Parcelable p, int parcelableFlags) {
if (p == null) {
writeString(null);
return;
@@ -1676,7 +1696,7 @@ public final class Parcel {
}
/** @hide */
- public final void writeParcelableCreator(Parcelable p) {
+ public final void writeParcelableCreator(@NonNull Parcelable p) {
String name = p.getClass().getName();
writeString(name);
}
@@ -1687,7 +1707,7 @@ public final class Parcel {
* overhead is extremely large, and this approach will be much slower than
* using the other approaches to writing data in to a Parcel.
*/
- public final void writeSerializable(Serializable s) {
+ public final void writeSerializable(@Nullable Serializable s) {
if (s == null) {
writeString(null);
return;
@@ -1738,7 +1758,7 @@ public final class Parcel {
* @see #writeNoException
* @see #readException
*/
- public final void writeException(Exception e) {
+ public final void writeException(@NonNull Exception e) {
int code = 0;
if (e instanceof Parcelable
&& (e.getClass().getClassLoader() == Parcelable.class.getClassLoader())) {
@@ -1992,6 +2012,7 @@ public final class Parcel {
/**
* Read a string value from the parcel at the current dataPosition().
*/
+ @Nullable
public final String readString() {
return mReadWriteHelper.readString(this);
}
@@ -2003,11 +2024,14 @@ public final class Parcel {
*
* @hide
*/
+ @Nullable
public String readStringNoHelper() {
return nativeReadString(mNativePtr);
}
- /** @hide */
+ /**
+ * Read a boolean value from the parcel at the current dataPosition().
+ */
public final boolean readBoolean() {
return readInt() != 0;
}
@@ -2016,6 +2040,7 @@ public final class Parcel {
* Read a CharSequence value from the parcel at the current dataPosition().
* @hide
*/
+ @Nullable
public final CharSequence readCharSequence() {
return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this);
}
@@ -2045,6 +2070,7 @@ public final class Parcel {
* Read and return a new array of FileDescriptors from the parcel.
* @return the FileDescriptor array, or null if the array is null.
**/
+ @Nullable
public final FileDescriptor[] createRawFileDescriptorArray() {
int N = readInt();
if (N < 0) {
@@ -2099,7 +2125,7 @@ public final class Parcel {
* been written with {@link #writeBundle}. Read into an existing Map object
* from the parcel at the current dataPosition().
*/
- public final void readMap(Map outVal, ClassLoader loader) {
+ public final void readMap(@NonNull Map outVal, @Nullable ClassLoader loader) {
int N = readInt();
readMapInternal(outVal, N, loader);
}
@@ -2109,7 +2135,7 @@ public final class Parcel {
* dataPosition(), using the given class loader to load any enclosed
* Parcelables. If it is null, the default class loader is used.
*/
- public final void readList(List outVal, ClassLoader loader) {
+ public final void readList(@NonNull List outVal, @Nullable ClassLoader loader) {
int N = readInt();
readListInternal(outVal, N, loader);
}
@@ -2121,7 +2147,8 @@ public final class Parcel {
* class loader to load any enclosed Parcelables. Returns null if
* the previously written map object was null.
*/
- public final HashMap readHashMap(ClassLoader loader)
+ @Nullable
+ public final HashMap readHashMap(@Nullable ClassLoader loader)
{
int N = readInt();
if (N < 0) {
@@ -2137,6 +2164,7 @@ public final class Parcel {
* dataPosition(). Returns null if the previously written Bundle object was
* null.
*/
+ @Nullable
public final Bundle readBundle() {
return readBundle(null);
}
@@ -2147,7 +2175,8 @@ public final class Parcel {
* loader of the Bundle for later retrieval of Parcelable objects.
* Returns null if the previously written Bundle object was null.
*/
- public final Bundle readBundle(ClassLoader loader) {
+ @Nullable
+ public final Bundle readBundle(@Nullable ClassLoader loader) {
int length = readInt();
if (length < 0) {
if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length);
@@ -2166,6 +2195,7 @@ public final class Parcel {
* dataPosition(). Returns null if the previously written Bundle object was
* null.
*/
+ @Nullable
public final PersistableBundle readPersistableBundle() {
return readPersistableBundle(null);
}
@@ -2176,7 +2206,8 @@ public final class Parcel {
* loader of the Bundle for later retrieval of Parcelable objects.
* Returns null if the previously written Bundle object was null.
*/
- public final PersistableBundle readPersistableBundle(ClassLoader loader) {
+ @Nullable
+ public final PersistableBundle readPersistableBundle(@Nullable ClassLoader loader) {
int length = readInt();
if (length < 0) {
if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length);
@@ -2193,6 +2224,7 @@ public final class Parcel {
/**
* Read a Size from the parcel at the current dataPosition().
*/
+ @NonNull
public final Size readSize() {
final int width = readInt();
final int height = readInt();
@@ -2202,6 +2234,7 @@ public final class Parcel {
/**
* Read a SizeF from the parcel at the current dataPosition().
*/
+ @NonNull
public final SizeF readSizeF() {
final float width = readFloat();
final float height = readFloat();
@@ -2211,6 +2244,7 @@ public final class Parcel {
/**
* Read and return a byte[] object from the parcel.
*/
+ @Nullable
public final byte[] createByteArray() {
return nativeCreateByteArray(mNativePtr);
}
@@ -2219,7 +2253,7 @@ public final class Parcel {
* Read a byte[] object from the parcel and copy it into the
* given byte array.
*/
- public final void readByteArray(byte[] val) {
+ public final void readByteArray(@NonNull byte[] val) {
boolean valid = nativeReadByteArray(mNativePtr, val, (val != null) ? val.length : 0);
if (!valid) {
throw new RuntimeException("bad array lengths");
@@ -2231,6 +2265,7 @@ public final class Parcel {
* {@hide}
* {@SystemApi}
*/
+ @Nullable
public final byte[] readBlob() {
return nativeReadBlob(mNativePtr);
}
@@ -2239,6 +2274,7 @@ public final class Parcel {
* Read and return a String[] object from the parcel.
* {@hide}
*/
+ @Nullable
public final String[] readStringArray() {
String[] array = null;
@@ -2260,6 +2296,7 @@ public final class Parcel {
* Read and return a CharSequence[] object from the parcel.
* {@hide}
*/
+ @Nullable
public final CharSequence[] readCharSequenceArray() {
CharSequence[] array = null;
@@ -2281,6 +2318,7 @@ public final class Parcel {
* Read and return an ArrayList&lt;CharSequence&gt; object from the parcel.
* {@hide}
*/
+ @Nullable
public final ArrayList<CharSequence> readCharSequenceList() {
ArrayList<CharSequence> array = null;
@@ -2302,7 +2340,8 @@ public final class Parcel {
* null. The given class loader will be used to load any enclosed
* Parcelables.
*/
- public final ArrayList readArrayList(ClassLoader loader) {
+ @Nullable
+ public final ArrayList readArrayList(@Nullable ClassLoader loader) {
int N = readInt();
if (N < 0) {
return null;
@@ -2318,7 +2357,8 @@ public final class Parcel {
* null. The given class loader will be used to load any enclosed
* Parcelables.
*/
- public final Object[] readArray(ClassLoader loader) {
+ @Nullable
+ public final Object[] readArray(@Nullable ClassLoader loader) {
int N = readInt();
if (N < 0) {
return null;
@@ -2334,7 +2374,8 @@ public final class Parcel {
* null. The given class loader will be used to load any enclosed
* Parcelables.
*/
- public final SparseArray readSparseArray(ClassLoader loader) {
+ @Nullable
+ public final SparseArray readSparseArray(@Nullable ClassLoader loader) {
int N = readInt();
if (N < 0) {
return null;
@@ -2349,6 +2390,7 @@ public final class Parcel {
* dataPosition(). Returns null if the previously written list object was
* null.
*/
+ @Nullable
public final SparseBooleanArray readSparseBooleanArray() {
int N = readInt();
if (N < 0) {
@@ -2364,6 +2406,7 @@ public final class Parcel {
* dataPosition(). Returns null if the previously written array object was null.
* @hide
*/
+ @Nullable
public final SparseIntArray readSparseIntArray() {
int N = readInt();
if (N < 0) {
@@ -2387,7 +2430,8 @@ public final class Parcel {
*
* @see #writeTypedList
*/
- public final <T> ArrayList<T> createTypedArrayList(Parcelable.Creator<T> c) {
+ @Nullable
+ public final <T> ArrayList<T> createTypedArrayList(@NonNull Parcelable.Creator<T> c) {
int N = readInt();
if (N < 0) {
return null;
@@ -2412,7 +2456,7 @@ public final class Parcel {
*
* @see #writeTypedList
*/
- public final <T> void readTypedList(List<T> list, Parcelable.Creator<T> c) {
+ public final <T> void readTypedList(@NonNull List<T> list, @NonNull Parcelable.Creator<T> c) {
int M = list.size();
int N = readInt();
int i = 0;
@@ -2438,6 +2482,7 @@ public final class Parcel {
*
* @see #writeStringList
*/
+ @Nullable
public final ArrayList<String> createStringArrayList() {
int N = readInt();
if (N < 0) {
@@ -2462,6 +2507,7 @@ public final class Parcel {
*
* @see #writeBinderList
*/
+ @Nullable
public final ArrayList<IBinder> createBinderArrayList() {
int N = readInt();
if (N < 0) {
@@ -2481,7 +2527,7 @@ public final class Parcel {
*
* @see #writeStringList
*/
- public final void readStringList(List<String> list) {
+ public final void readStringList(@NonNull List<String> list) {
int M = list.size();
int N = readInt();
int i = 0;
@@ -2502,7 +2548,7 @@ public final class Parcel {
*
* @see #writeBinderList
*/
- public final void readBinderList(List<IBinder> list) {
+ public final void readBinderList(@NonNull List<IBinder> list) {
int M = list.size();
int N = readInt();
int i = 0;
@@ -2523,9 +2569,10 @@ public final class Parcel {
* list was {@code null}, {@code list} is cleared.
*
* @see #writeParcelableList(List, int)
- * @hide
*/
- public final <T extends Parcelable> List<T> readParcelableList(List<T> list, ClassLoader cl) {
+ @NonNull
+ public final <T extends Parcelable> List<T> readParcelableList(@NonNull List<T> list,
+ @Nullable ClassLoader cl) {
final int N = readInt();
if (N == -1) {
list.clear();
@@ -2558,7 +2605,8 @@ public final class Parcel {
*
* @see #writeTypedArray
*/
- public final <T> T[] createTypedArray(Parcelable.Creator<T> c) {
+ @Nullable
+ public final <T> T[] createTypedArray(@NonNull Parcelable.Creator<T> c) {
int N = readInt();
if (N < 0) {
return null;
@@ -2570,7 +2618,7 @@ public final class Parcel {
return l;
}
- public final <T> void readTypedArray(T[] val, Parcelable.Creator<T> c) {
+ public final <T> void readTypedArray(@NonNull T[] val, @NonNull Parcelable.Creator<T> c) {
int N = readInt();
if (N == val.length) {
for (int i=0; i<N; i++) {
@@ -2601,7 +2649,8 @@ public final class Parcel {
*
* @see #writeTypedObject
*/
- public final <T> T readTypedObject(Parcelable.Creator<T> c) {
+ @Nullable
+ public final <T> T readTypedObject(@NonNull Parcelable.Creator<T> c) {
if (readInt() != 0) {
return c.createFromParcel(this);
} else {
@@ -2622,7 +2671,7 @@ public final class Parcel {
*
* @see #writeTypedArray
*/
- public final <T extends Parcelable> void writeParcelableArray(T[] value,
+ public final <T extends Parcelable> void writeParcelableArray(@Nullable T[] value,
int parcelableFlags) {
if (value != null) {
int N = value.length;
@@ -2640,7 +2689,8 @@ public final class Parcel {
* used to load any enclosed Parcelables. If it is null, the default class
* loader will be used.
*/
- public final Object readValue(ClassLoader loader) {
+ @Nullable
+ public final Object readValue(@Nullable ClassLoader loader) {
int type = readInt();
switch (type) {
@@ -2753,7 +2803,8 @@ public final class Parcel {
* was an error trying to instantiate the Parcelable.
*/
@SuppressWarnings("unchecked")
- public final <T extends Parcelable> T readParcelable(ClassLoader loader) {
+ @Nullable
+ public final <T extends Parcelable> T readParcelable(@Nullable ClassLoader loader) {
Parcelable.Creator<?> creator = readParcelableCreator(loader);
if (creator == null) {
return null;
@@ -2768,8 +2819,9 @@ public final class Parcel {
/** @hide */
@SuppressWarnings("unchecked")
- public final <T extends Parcelable> T readCreator(Parcelable.Creator<?> creator,
- ClassLoader loader) {
+ @Nullable
+ public final <T extends Parcelable> T readCreator(@NonNull Parcelable.Creator<?> creator,
+ @Nullable ClassLoader loader) {
if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
Parcelable.ClassLoaderCreator<?> classLoaderCreator =
(Parcelable.ClassLoaderCreator<?>) creator;
@@ -2779,7 +2831,8 @@ public final class Parcel {
}
/** @hide */
- public final Parcelable.Creator<?> readParcelableCreator(ClassLoader loader) {
+ @Nullable
+ public final Parcelable.Creator<?> readParcelableCreator(@Nullable ClassLoader loader) {
String name = readString();
if (name == null) {
return null;
@@ -2855,7 +2908,8 @@ public final class Parcel {
* Parcelables.
* @return the Parcelable array, or null if the array is null
*/
- public final Parcelable[] readParcelableArray(ClassLoader loader) {
+ @Nullable
+ public final Parcelable[] readParcelableArray(@Nullable ClassLoader loader) {
int N = readInt();
if (N < 0) {
return null;
@@ -2868,8 +2922,9 @@ public final class Parcel {
}
/** @hide */
- public final <T extends Parcelable> T[] readParcelableArray(ClassLoader loader,
- Class<T> clazz) {
+ @Nullable
+ public final <T extends Parcelable> T[] readParcelableArray(@Nullable ClassLoader loader,
+ @NonNull Class<T> clazz) {
int N = readInt();
if (N < 0) {
return null;
@@ -2886,11 +2941,13 @@ public final class Parcel {
* @return the Serializable object, or null if the Serializable name
* wasn't found in the parcel.
*/
+ @Nullable
public final Serializable readSerializable() {
return readSerializable(null);
}
- private final Serializable readSerializable(final ClassLoader loader) {
+ @Nullable
+ private final Serializable readSerializable(@Nullable final ClassLoader loader) {
String name = readString();
if (name == null) {
// For some reason we were unable to read the name of the Serializable (either there
@@ -3005,8 +3062,8 @@ public final class Parcel {
destroy();
}
- /* package */ void readMapInternal(Map outVal, int N,
- ClassLoader loader) {
+ /* package */ void readMapInternal(@NonNull Map outVal, int N,
+ @Nullable ClassLoader loader) {
while (N > 0) {
Object key = readValue(loader);
Object value = readValue(loader);
@@ -3015,8 +3072,8 @@ public final class Parcel {
}
}
- /* package */ void readArrayMapInternal(ArrayMap outVal, int N,
- ClassLoader loader) {
+ /* package */ void readArrayMapInternal(@NonNull ArrayMap outVal, int N,
+ @Nullable ClassLoader loader) {
if (DEBUG_ARRAY_MAP) {
RuntimeException here = new RuntimeException("here");
here.fillInStackTrace();
@@ -3036,8 +3093,8 @@ public final class Parcel {
outVal.validate();
}
- /* package */ void readArrayMapSafelyInternal(ArrayMap outVal, int N,
- ClassLoader loader) {
+ /* package */ void readArrayMapSafelyInternal(@NonNull ArrayMap outVal, int N,
+ @Nullable ClassLoader loader) {
if (DEBUG_ARRAY_MAP) {
RuntimeException here = new RuntimeException("here");
here.fillInStackTrace();
@@ -3056,7 +3113,7 @@ public final class Parcel {
/**
* @hide For testing only.
*/
- public void readArrayMap(ArrayMap outVal, ClassLoader loader) {
+ public void readArrayMap(@NonNull ArrayMap outVal, @Nullable ClassLoader loader) {
final int N = readInt();
if (N < 0) {
return;
@@ -3071,7 +3128,7 @@ public final class Parcel {
*
* @hide
*/
- public @Nullable ArraySet<? extends Object> readArraySet(ClassLoader loader) {
+ public @Nullable ArraySet<? extends Object> readArraySet(@Nullable ClassLoader loader) {
final int size = readInt();
if (size < 0) {
return null;
@@ -3084,8 +3141,8 @@ public final class Parcel {
return result;
}
- private void readListInternal(List outVal, int N,
- ClassLoader loader) {
+ private void readListInternal(@NonNull List outVal, int N,
+ @Nullable ClassLoader loader) {
while (N > 0) {
Object value = readValue(loader);
//Log.d(TAG, "Unmarshalling value=" + value);
@@ -3094,8 +3151,8 @@ public final class Parcel {
}
}
- private void readArrayInternal(Object[] outVal, int N,
- ClassLoader loader) {
+ private void readArrayInternal(@NonNull Object[] outVal, int N,
+ @Nullable ClassLoader loader) {
for (int i = 0; i < N; i++) {
Object value = readValue(loader);
//Log.d(TAG, "Unmarshalling value=" + value);
@@ -3103,8 +3160,8 @@ public final class Parcel {
}
}
- private void readSparseArrayInternal(SparseArray outVal, int N,
- ClassLoader loader) {
+ private void readSparseArrayInternal(@NonNull SparseArray outVal, int N,
+ @Nullable ClassLoader loader) {
while (N > 0) {
int key = readInt();
Object value = readValue(loader);
@@ -3115,7 +3172,7 @@ public final class Parcel {
}
- private void readSparseBooleanArrayInternal(SparseBooleanArray outVal, int N) {
+ private void readSparseBooleanArrayInternal(@NonNull SparseBooleanArray outVal, int N) {
while (N > 0) {
int key = readInt();
boolean value = this.readByte() == 1;
@@ -3125,7 +3182,7 @@ public final class Parcel {
}
}
- private void readSparseIntArrayInternal(SparseIntArray outVal, int N) {
+ private void readSparseIntArrayInternal(@NonNull SparseIntArray outVal, int N) {
while (N > 0) {
int key = readInt();
int value = readInt();
diff --git a/core/java/android/os/ParcelFileDescriptor.aidl b/core/java/android/os/ParcelFileDescriptor.aidl
index 6bbd99e3f20a..c07b98055d5a 100644
--- a/core/java/android/os/ParcelFileDescriptor.aidl
+++ b/core/java/android/os/ParcelFileDescriptor.aidl
@@ -17,4 +17,4 @@
package android.os;
-parcelable ParcelFileDescriptor cpp_header "android/os/parcel_file_descriptor.h";
+parcelable ParcelFileDescriptor cpp_header "binder/ParcelFileDescriptor.h";
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 9c258487447e..463a6aa20d04 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -961,7 +961,6 @@ public final class PowerManager {
*
* @hide Requires signature permission.
*/
- @TestApi
public void nap(long time) {
try {
mService.nap(time);
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index e94e223d0849..a713ad03e551 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -140,6 +140,12 @@ public class Process {
public static final int CAMERASERVER_UID = 1047;
/**
+ * Defines the UID/GID for the tethering DNS resolver (currently dnsmasq).
+ * @hide
+ */
+ public static final int DNS_TETHER_UID = 1052;
+
+ /**
* Defines the UID/GID for the WebView zygote process.
* @hide
*/
diff --git a/core/java/android/os/RedactingFileDescriptor.java b/core/java/android/os/RedactingFileDescriptor.java
new file mode 100644
index 000000000000..60eb5c3c4a89
--- /dev/null
+++ b/core/java/android/os/RedactingFileDescriptor.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.content.Context;
+import android.os.storage.StorageManager;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+import android.util.Slog;
+
+import libcore.io.IoUtils;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+
+/**
+ * Variant of {@link FileDescriptor} that allows its creator to specify regions
+ * that should be redacted (appearing as zeros to the reader).
+ *
+ * @hide
+ */
+public class RedactingFileDescriptor {
+ private static final String TAG = "RedactingFileDescriptor";
+ private static final boolean DEBUG = true;
+
+ private final long[] mRedactRanges;
+
+ private FileDescriptor mInner = null;
+ private ParcelFileDescriptor mOuter = null;
+
+ private RedactingFileDescriptor(Context context, File file, long[] redactRanges)
+ throws IOException {
+ mRedactRanges = checkRangesArgument(redactRanges);
+
+ try {
+ try {
+ mInner = Os.open(file.getAbsolutePath(), OsConstants.O_RDONLY, 0);
+ mOuter = context.getSystemService(StorageManager.class)
+ .openProxyFileDescriptor(ParcelFileDescriptor.MODE_READ_ONLY, mCallback);
+ } catch (ErrnoException e) {
+ throw e.rethrowAsIOException();
+ }
+ } catch (IOException e) {
+ IoUtils.closeQuietly(mInner);
+ IoUtils.closeQuietly(mOuter);
+ throw e;
+ }
+ }
+
+ private static long[] checkRangesArgument(long[] ranges) {
+ if (ranges.length % 2 != 0) {
+ throw new IllegalArgumentException();
+ }
+ for (int i = 0; i < ranges.length - 1; i += 2) {
+ if (ranges[i] > ranges[i + 1]) {
+ throw new IllegalArgumentException();
+ }
+ }
+ return ranges;
+ }
+
+ /**
+ * Open the given {@link File} and returns a {@link ParcelFileDescriptor}
+ * that offers a redacted, read-only view of the underlying data.
+ *
+ * @param file The underlying file to open.
+ * @param redactRanges List of file offsets that should be redacted, stored
+ * as {@code [start1, end1, start2, end2, ...]}. Start values are
+ * inclusive and end values are exclusive.
+ */
+ public static ParcelFileDescriptor open(Context context, File file, long[] redactRanges)
+ throws IOException {
+ return new RedactingFileDescriptor(context, file, redactRanges).mOuter;
+ }
+
+ private final ProxyFileDescriptorCallback mCallback = new ProxyFileDescriptorCallback() {
+ @Override
+ public long onGetSize() throws ErrnoException {
+ return Os.fstat(mInner).st_size;
+ }
+
+ @Override
+ public int onRead(long offset, int size, byte[] data) throws ErrnoException {
+ int n = 0;
+ while (n < size) {
+ try {
+ final int res = Os.pread(mInner, data, n, size - n, offset + n);
+ if (res == 0) {
+ break;
+ } else {
+ n += res;
+ }
+ } catch (InterruptedIOException e) {
+ n += e.bytesTransferred;
+ }
+ }
+
+ // Redact any relevant ranges before returning
+ final long[] ranges = mRedactRanges;
+ for (int i = 0; i < ranges.length; i += 2) {
+ final long start = Math.max(offset, ranges[i]);
+ final long end = Math.min(offset + size, ranges[i + 1]);
+ for (long j = start; j < end; j++) {
+ data[(int) (j - offset)] = 0;
+ }
+ }
+ return n;
+ }
+
+ @Override
+ public int onWrite(long offset, int size, byte[] data) throws ErrnoException {
+ throw new ErrnoException(TAG, OsConstants.EBADF);
+ }
+
+ @Override
+ public void onFsync() throws ErrnoException {
+ Os.fsync(mInner);
+ }
+
+ @Override
+ public void onRelease() {
+ if (DEBUG) Slog.v(TAG, "onRelease()");
+ IoUtils.closeQuietly(mInner);
+ }
+ };
+}
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java
index 165276d5c17e..2966bff2ee4c 100644
--- a/core/java/android/os/ServiceManager.java
+++ b/core/java/android/os/ServiceManager.java
@@ -16,13 +16,13 @@
package android.os;
+import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BinderInternal;
import com.android.internal.util.StatLogger;
-import java.util.HashMap;
import java.util.Map;
/** @hide */
@@ -35,7 +35,7 @@ public final class ServiceManager {
/**
* Cache for the "well known" services, such as WM and AM.
*/
- private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>();
+ private static Map<String, IBinder> sCache = new ArrayMap<String, IBinder>();
/**
* We do the "slow log" at most once every this interval.
diff --git a/core/java/android/os/ShellCommand.java b/core/java/android/os/ShellCommand.java
index fa05a5e1b22e..5228d6dcb475 100644
--- a/core/java/android/os/ShellCommand.java
+++ b/core/java/android/os/ShellCommand.java
@@ -247,7 +247,11 @@ public abstract class ShellCommand {
}
if (DEBUG) Slog.d(TAG, "Error: Unable to open file: " + path);
getErrPrintWriter().println("Error: Unable to open file: " + path);
- getErrPrintWriter().println("Consider using a file under /data/local/tmp/");
+
+ String suggestedPath = "/data/local/tmp/";
+ if (path == null || !path.startsWith(suggestedPath)) {
+ getErrPrintWriter().println("Consider using a file under " + suggestedPath);
+ }
return null;
}
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 3eaecf9985ec..5ff6e558736e 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -16,6 +16,7 @@
package android.os;
import android.animation.ValueAnimator;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
@@ -27,14 +28,19 @@ import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.net.TrafficStats;
import android.net.Uri;
+import android.os.storage.IStorageManager;
import android.os.strictmode.CleartextNetworkViolation;
import android.os.strictmode.ContentUriWithoutPermissionViolation;
+import android.os.strictmode.CredentialProtectedWhileLockedViolation;
import android.os.strictmode.CustomViolation;
import android.os.strictmode.DiskReadViolation;
import android.os.strictmode.DiskWriteViolation;
+import android.os.strictmode.ExplicitGcViolation;
import android.os.strictmode.FileUriExposedViolation;
+import android.os.strictmode.ImplicitDirectBootViolation;
import android.os.strictmode.InstanceCountViolation;
import android.os.strictmode.IntentReceiverLeakedViolation;
import android.os.strictmode.LeakedClosableViolation;
@@ -67,6 +73,8 @@ import dalvik.system.VMRuntime;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayDeque;
@@ -186,112 +194,105 @@ public final class StrictMode {
// of the Looper.
private static final int MAX_OFFENSES_PER_LOOP = 10;
- // Byte 1: Thread-policy
-
/** @hide */
- @TestApi public static final int DETECT_DISK_WRITE = 0x01; // for ThreadPolicy
+ @IntDef(flag = true, prefix = { "DETECT_THREAD_", "PENALTY_" }, value = {
+ DETECT_THREAD_DISK_WRITE,
+ DETECT_THREAD_DISK_READ,
+ DETECT_THREAD_NETWORK,
+ DETECT_THREAD_CUSTOM,
+ DETECT_THREAD_RESOURCE_MISMATCH,
+ DETECT_THREAD_UNBUFFERED_IO,
+ DETECT_THREAD_EXPLICIT_GC,
+ PENALTY_GATHER,
+ PENALTY_LOG,
+ PENALTY_DIALOG,
+ PENALTY_DEATH,
+ PENALTY_FLASH,
+ PENALTY_DROPBOX,
+ PENALTY_DEATH_ON_NETWORK,
+ PENALTY_DEATH_ON_CLEARTEXT_NETWORK,
+ PENALTY_DEATH_ON_FILE_URI_EXPOSURE,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ThreadPolicyMask {}
+
+ // Thread policy: bits 0-15
/** @hide */
- @TestApi public static final int DETECT_DISK_READ = 0x02; // for ThreadPolicy
-
+ private static final int DETECT_THREAD_DISK_WRITE = 1 << 0;
/** @hide */
- @TestApi public static final int DETECT_NETWORK = 0x04; // for ThreadPolicy
-
- /**
- * For StrictMode.noteSlowCall()
- *
- * @hide
- */
- @TestApi public static final int DETECT_CUSTOM = 0x08; // for ThreadPolicy
-
- /**
- * For StrictMode.noteResourceMismatch()
- *
- * @hide
- */
- @TestApi public static final int DETECT_RESOURCE_MISMATCH = 0x10; // for ThreadPolicy
-
+ private static final int DETECT_THREAD_DISK_READ = 1 << 1;
/** @hide */
- @TestApi public static final int DETECT_UNBUFFERED_IO = 0x20; // for ThreadPolicy
-
- private static final int ALL_THREAD_DETECT_BITS =
- DETECT_DISK_WRITE
- | DETECT_DISK_READ
- | DETECT_NETWORK
- | DETECT_CUSTOM
- | DETECT_RESOURCE_MISMATCH
- | DETECT_UNBUFFERED_IO;
-
- // Byte 2: Process-policy
-
- /**
- * Note, a "VM_" bit, not thread.
- *
- * @hide
- */
- @TestApi public static final int DETECT_VM_CURSOR_LEAKS = 0x01 << 8; // for VmPolicy
-
- /**
- * Note, a "VM_" bit, not thread.
- *
- * @hide
- */
- @TestApi public static final int DETECT_VM_CLOSABLE_LEAKS = 0x02 << 8; // for VmPolicy
-
- /**
- * Note, a "VM_" bit, not thread.
- *
- * @hide
- */
- @TestApi public static final int DETECT_VM_ACTIVITY_LEAKS = 0x04 << 8; // for VmPolicy
-
+ private static final int DETECT_THREAD_NETWORK = 1 << 2;
/** @hide */
- @TestApi public static final int DETECT_VM_INSTANCE_LEAKS = 0x08 << 8; // for VmPolicy
-
+ private static final int DETECT_THREAD_CUSTOM = 1 << 3;
/** @hide */
- @TestApi public static final int DETECT_VM_REGISTRATION_LEAKS = 0x10 << 8; // for VmPolicy
-
+ private static final int DETECT_THREAD_RESOURCE_MISMATCH = 1 << 4;
/** @hide */
- @TestApi public static final int DETECT_VM_FILE_URI_EXPOSURE = 0x20 << 8; // for VmPolicy
+ private static final int DETECT_THREAD_UNBUFFERED_IO = 1 << 5;
+ /** @hide */
+ private static final int DETECT_THREAD_EXPLICIT_GC = 1 << 6;
/** @hide */
- @TestApi public static final int DETECT_VM_CLEARTEXT_NETWORK = 0x40 << 8; // for VmPolicy
+ private static final int DETECT_THREAD_ALL = 0x0000ffff;
/** @hide */
- @TestApi
- public static final int DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION = 0x80 << 8; // for VmPolicy
+ @IntDef(flag = true, prefix = { "DETECT_THREAD_", "PENALTY_" }, value = {
+ DETECT_VM_CURSOR_LEAKS,
+ DETECT_VM_CLOSABLE_LEAKS,
+ DETECT_VM_ACTIVITY_LEAKS,
+ DETECT_VM_INSTANCE_LEAKS,
+ DETECT_VM_REGISTRATION_LEAKS,
+ DETECT_VM_FILE_URI_EXPOSURE,
+ DETECT_VM_CLEARTEXT_NETWORK,
+ DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION,
+ DETECT_VM_UNTAGGED_SOCKET,
+ DETECT_VM_NON_SDK_API_USAGE,
+ DETECT_VM_IMPLICIT_DIRECT_BOOT,
+ PENALTY_GATHER,
+ PENALTY_LOG,
+ PENALTY_DIALOG,
+ PENALTY_DEATH,
+ PENALTY_FLASH,
+ PENALTY_DROPBOX,
+ PENALTY_DEATH_ON_NETWORK,
+ PENALTY_DEATH_ON_CLEARTEXT_NETWORK,
+ PENALTY_DEATH_ON_FILE_URI_EXPOSURE,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface VmPolicyMask {}
+
+ // VM policy: bits 0-15
/** @hide */
- @TestApi public static final int DETECT_VM_UNTAGGED_SOCKET = 0x80 << 24; // for VmPolicy
-
+ private static final int DETECT_VM_CURSOR_LEAKS = 1 << 0;
/** @hide */
- @TestApi public static final int DETECT_VM_NON_SDK_API_USAGE = 0x40 << 24; // for VmPolicy
-
- private static final int ALL_VM_DETECT_BITS =
- DETECT_VM_CURSOR_LEAKS
- | DETECT_VM_CLOSABLE_LEAKS
- | DETECT_VM_ACTIVITY_LEAKS
- | DETECT_VM_INSTANCE_LEAKS
- | DETECT_VM_REGISTRATION_LEAKS
- | DETECT_VM_FILE_URI_EXPOSURE
- | DETECT_VM_CLEARTEXT_NETWORK
- | DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION
- | DETECT_VM_UNTAGGED_SOCKET
- | DETECT_VM_NON_SDK_API_USAGE;
+ private static final int DETECT_VM_CLOSABLE_LEAKS = 1 << 1;
+ /** @hide */
+ private static final int DETECT_VM_ACTIVITY_LEAKS = 1 << 2;
+ /** @hide */
+ private static final int DETECT_VM_INSTANCE_LEAKS = 1 << 3;
+ /** @hide */
+ private static final int DETECT_VM_REGISTRATION_LEAKS = 1 << 4;
+ /** @hide */
+ private static final int DETECT_VM_FILE_URI_EXPOSURE = 1 << 5;
+ /** @hide */
+ private static final int DETECT_VM_CLEARTEXT_NETWORK = 1 << 6;
+ /** @hide */
+ private static final int DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION = 1 << 7;
+ /** @hide */
+ private static final int DETECT_VM_UNTAGGED_SOCKET = 1 << 8;
+ /** @hide */
+ private static final int DETECT_VM_NON_SDK_API_USAGE = 1 << 9;
+ /** @hide */
+ private static final int DETECT_VM_IMPLICIT_DIRECT_BOOT = 1 << 10;
+ /** @hide */
+ private static final int DETECT_VM_CREDENTIAL_PROTECTED_WHILE_LOCKED = 1 << 11;
+ /** @hide */
+ private static final int DETECT_VM_ALL = 0x0000ffff;
- // Byte 3: Penalty
-
- /** {@hide} */
- public static final int PENALTY_LOG = 0x01 << 16; // normal android.util.Log
- /** {@hide} */
- public static final int PENALTY_DIALOG = 0x02 << 16;
- /** {@hide} */
- public static final int PENALTY_DEATH = 0x04 << 16;
- /** {@hide} */
- public static final int PENALTY_FLASH = 0x10 << 16;
- /** {@hide} */
- public static final int PENALTY_DROPBOX = 0x20 << 16;
+ // Penalty policy: bits 16-31
/**
* Non-public penalty mode which overrides all the other penalty bits and signals that we're in
@@ -302,50 +303,27 @@ public final class StrictMode {
*
* @hide
*/
- public static final int PENALTY_GATHER = 0x40 << 16;
-
- // Byte 4: Special cases
-
- /**
- * Death when network traffic is detected on main thread.
- *
- * @hide
- */
- public static final int PENALTY_DEATH_ON_NETWORK = 0x01 << 24;
+ public static final int PENALTY_GATHER = 1 << 31;
- /**
- * Death when cleartext network traffic is detected.
- *
- * @hide
- */
- public static final int PENALTY_DEATH_ON_CLEARTEXT_NETWORK = 0x02 << 24;
+ /** {@hide} */
+ public static final int PENALTY_LOG = 1 << 30;
+ /** {@hide} */
+ public static final int PENALTY_DIALOG = 1 << 29;
+ /** {@hide} */
+ public static final int PENALTY_DEATH = 1 << 28;
+ /** {@hide} */
+ public static final int PENALTY_FLASH = 1 << 27;
+ /** {@hide} */
+ public static final int PENALTY_DROPBOX = 1 << 26;
+ /** {@hide} */
+ public static final int PENALTY_DEATH_ON_NETWORK = 1 << 25;
+ /** {@hide} */
+ public static final int PENALTY_DEATH_ON_CLEARTEXT_NETWORK = 1 << 24;
+ /** {@hide} */
+ public static final int PENALTY_DEATH_ON_FILE_URI_EXPOSURE = 1 << 23;
- /**
- * Death when file exposure is detected.
- *
- * @hide
- */
- public static final int PENALTY_DEATH_ON_FILE_URI_EXPOSURE = 0x04 << 24;
-
- // CAUTION: we started stealing the top bits of Byte 4 for VM above
-
- /** Mask of all the penalty bits valid for thread policies. */
- private static final int THREAD_PENALTY_MASK =
- PENALTY_LOG
- | PENALTY_DIALOG
- | PENALTY_DEATH
- | PENALTY_DROPBOX
- | PENALTY_GATHER
- | PENALTY_DEATH_ON_NETWORK
- | PENALTY_FLASH;
-
- /** Mask of all the penalty bits valid for VM policies. */
- private static final int VM_PENALTY_MASK =
- PENALTY_LOG
- | PENALTY_DEATH
- | PENALTY_DROPBOX
- | PENALTY_DEATH_ON_CLEARTEXT_NETWORK
- | PENALTY_DEATH_ON_FILE_URI_EXPOSURE;
+ /** @hide */
+ public static final int PENALTY_ALL = 0xffff0000;
/** {@hide} */
public static final int NETWORK_POLICY_ACCEPT = 0;
@@ -443,11 +421,12 @@ public final class StrictMode {
/** The default, lax policy which doesn't catch anything. */
public static final ThreadPolicy LAX = new ThreadPolicy(0, null, null);
- final int mask;
+ final @ThreadPolicyMask int mask;
final OnThreadViolationListener mListener;
final Executor mCallbackExecutor;
- private ThreadPolicy(int mask, OnThreadViolationListener listener, Executor executor) {
+ private ThreadPolicy(@ThreadPolicyMask int mask, OnThreadViolationListener listener,
+ Executor executor) {
this.mask = mask;
mListener = listener;
mCallbackExecutor = executor;
@@ -477,7 +456,7 @@ public final class StrictMode {
* </pre>
*/
public static final class Builder {
- private int mMask = 0;
+ private @ThreadPolicyMask int mMask = 0;
private OnThreadViolationListener mListener;
private Executor mExecutor;
@@ -523,52 +502,52 @@ public final class StrictMode {
/** Disable the detection of everything. */
public Builder permitAll() {
- return disable(ALL_THREAD_DETECT_BITS);
+ return disable(DETECT_THREAD_ALL);
}
/** Enable detection of network operations. */
public Builder detectNetwork() {
- return enable(DETECT_NETWORK);
+ return enable(DETECT_THREAD_NETWORK);
}
/** Disable detection of network operations. */
public Builder permitNetwork() {
- return disable(DETECT_NETWORK);
+ return disable(DETECT_THREAD_NETWORK);
}
/** Enable detection of disk reads. */
public Builder detectDiskReads() {
- return enable(DETECT_DISK_READ);
+ return enable(DETECT_THREAD_DISK_READ);
}
/** Disable detection of disk reads. */
public Builder permitDiskReads() {
- return disable(DETECT_DISK_READ);
+ return disable(DETECT_THREAD_DISK_READ);
}
/** Enable detection of slow calls. */
public Builder detectCustomSlowCalls() {
- return enable(DETECT_CUSTOM);
+ return enable(DETECT_THREAD_CUSTOM);
}
/** Disable detection of slow calls. */
public Builder permitCustomSlowCalls() {
- return disable(DETECT_CUSTOM);
+ return disable(DETECT_THREAD_CUSTOM);
}
/** Disable detection of mismatches between defined resource types and getter calls. */
public Builder permitResourceMismatches() {
- return disable(DETECT_RESOURCE_MISMATCH);
+ return disable(DETECT_THREAD_RESOURCE_MISMATCH);
}
/** Detect unbuffered input/output operations. */
public Builder detectUnbufferedIo() {
- return enable(DETECT_UNBUFFERED_IO);
+ return enable(DETECT_THREAD_UNBUFFERED_IO);
}
/** Disable detection of unbuffered input/output operations. */
public Builder permitUnbufferedIo() {
- return disable(DETECT_UNBUFFERED_IO);
+ return disable(DETECT_THREAD_UNBUFFERED_IO);
}
/**
@@ -584,17 +563,41 @@ public final class StrictMode {
* resource as an integer to avoid unnecessary type conversion.
*/
public Builder detectResourceMismatches() {
- return enable(DETECT_RESOURCE_MISMATCH);
+ return enable(DETECT_THREAD_RESOURCE_MISMATCH);
}
/** Enable detection of disk writes. */
public Builder detectDiskWrites() {
- return enable(DETECT_DISK_WRITE);
+ return enable(DETECT_THREAD_DISK_WRITE);
}
/** Disable detection of disk writes. */
public Builder permitDiskWrites() {
- return disable(DETECT_DISK_WRITE);
+ return disable(DETECT_THREAD_DISK_WRITE);
+ }
+
+ /**
+ * Detect explicit GC requests, i.e. calls to Runtime.gc().
+ *
+ * @hide
+ */
+ @TestApi
+ public Builder detectExplicitGc() {
+ // TODO(b/3400644): Un-hide this for next API update
+ // TODO(b/3400644): Un-hide ExplicitGcViolation for next API update
+ // TODO(b/3400644): Make DETECT_EXPLICIT_GC a @TestApi for next API update
+ // TODO(b/3400644): Call this from detectAll in next API update
+ return enable(DETECT_THREAD_EXPLICIT_GC);
+ }
+
+ /**
+ * Disable detection of explicit GC requests, i.e. calls to Runtime.gc().
+ *
+ * @hide
+ */
+ public Builder permitExplicitGc() {
+ // TODO(b/3400644): Un-hide this for next API update
+ return disable(DETECT_THREAD_EXPLICIT_GC);
}
/**
@@ -667,13 +670,13 @@ public final class StrictMode {
return penaltyListener(executor, listener);
}
- private Builder enable(int bit) {
- mMask |= bit;
+ private Builder enable(@ThreadPolicyMask int mask) {
+ mMask |= mask;
return this;
}
- private Builder disable(int bit) {
- mMask &= ~bit;
+ private Builder disable(@ThreadPolicyMask int mask) {
+ mMask &= ~mask;
return this;
}
@@ -710,7 +713,7 @@ public final class StrictMode {
/** The default, lax policy which doesn't catch anything. */
public static final VmPolicy LAX = new VmPolicy(0, EMPTY_CLASS_LIMIT_MAP, null, null);
- final int mask;
+ final @VmPolicyMask int mask;
final OnVmViolationListener mListener;
final Executor mCallbackExecutor;
@@ -718,7 +721,7 @@ public final class StrictMode {
final HashMap<Class, Integer> classInstanceLimit;
private VmPolicy(
- int mask,
+ @VmPolicyMask int mask,
HashMap<Class, Integer> classInstanceLimit,
OnVmViolationListener listener,
Executor executor) {
@@ -755,7 +758,7 @@ public final class StrictMode {
* </pre>
*/
public static final class Builder {
- private int mMask;
+ private @VmPolicyMask int mMask;
private OnVmViolationListener mListener;
private Executor mExecutor;
@@ -861,8 +864,13 @@ public final class StrictMode {
detectContentUriWithoutPermission();
detectUntaggedSockets();
}
+ if (targetSdk >= Build.VERSION_CODES.Q) {
+ detectCredentialProtectedWhileLocked();
+ }
// TODO: Decide whether to detect non SDK API usage beyond a certain API level.
+ // TODO: enable detectImplicitDirectBoot() once system is less noisy
+
return this;
}
@@ -971,6 +979,51 @@ public final class StrictMode {
}
/**
+ * Detect any implicit reliance on Direct Boot automatic filtering
+ * of {@link PackageManager} values. Violations are only triggered
+ * when implicit calls are made while the user is locked.
+ * <p>
+ * Apps becoming Direct Boot aware need to carefully inspect each
+ * query site and explicitly decide which combination of flags they
+ * want to use:
+ * <ul>
+ * <li>{@link PackageManager#MATCH_DIRECT_BOOT_AWARE}
+ * <li>{@link PackageManager#MATCH_DIRECT_BOOT_UNAWARE}
+ * <li>{@link PackageManager#MATCH_DIRECT_BOOT_AUTO}
+ * </ul>
+ */
+ public Builder detectImplicitDirectBoot() {
+ return enable(DETECT_VM_IMPLICIT_DIRECT_BOOT);
+ }
+
+ /** @hide */
+ public Builder permitImplicitDirectBoot() {
+ return disable(DETECT_VM_IMPLICIT_DIRECT_BOOT);
+ }
+
+ /**
+ * Detect access to filesystem paths stored in credential protected
+ * storage areas while the user is locked.
+ * <p>
+ * When a user is locked, credential protected storage is
+ * unavailable, and files stored in these locations appear to not
+ * exist, which can result in subtle app bugs if they assume default
+ * behaviors or empty states. Instead, apps should store data needed
+ * while a user is locked under device protected storage areas.
+ *
+ * @see Context#createCredentialProtectedStorageContext()
+ * @see Context#createDeviceProtectedStorageContext()
+ */
+ public Builder detectCredentialProtectedWhileLocked() {
+ return enable(DETECT_VM_CREDENTIAL_PROTECTED_WHILE_LOCKED);
+ }
+
+ /** @hide */
+ public Builder permitCredentialProtectedWhileLocked() {
+ return disable(DETECT_VM_CREDENTIAL_PROTECTED_WHILE_LOCKED);
+ }
+
+ /**
* Crashes the whole process on violation. This penalty runs at the end of all enabled
* penalties so you'll still get your logging or other violations before the process
* dies.
@@ -1031,13 +1084,13 @@ public final class StrictMode {
return penaltyListener(executor, listener);
}
- private Builder enable(int bit) {
- mMask |= bit;
+ private Builder enable(@VmPolicyMask int mask) {
+ mMask |= mask;
return this;
}
- Builder disable(int bit) {
- mMask &= ~bit;
+ Builder disable(@VmPolicyMask int mask) {
+ mMask &= ~mask;
return this;
}
@@ -1102,21 +1155,21 @@ public final class StrictMode {
}
/** @hide */
- public static void setThreadPolicyMask(final int policyMask) {
+ public static void setThreadPolicyMask(@ThreadPolicyMask int threadPolicyMask) {
// In addition to the Java-level thread-local in Dalvik's
// BlockGuard, we also need to keep a native thread-local in
// Binder in order to propagate the value across Binder calls,
// even across native-only processes. The two are kept in
// sync via the callback to onStrictModePolicyChange, below.
- setBlockGuardPolicy(policyMask);
+ setBlockGuardPolicy(threadPolicyMask);
// And set the Android native version...
- Binder.setThreadStrictModePolicy(policyMask);
+ Binder.setThreadStrictModePolicy(threadPolicyMask);
}
// Sets the policy in Dalvik/libcore (BlockGuard)
- private static void setBlockGuardPolicy(final int policyMask) {
- if (policyMask == 0) {
+ private static void setBlockGuardPolicy(@ThreadPolicyMask int threadPolicyMask) {
+ if (threadPolicyMask == 0) {
BlockGuard.setThreadPolicy(BlockGuard.LAX_POLICY);
return;
}
@@ -1128,7 +1181,17 @@ public final class StrictMode {
androidPolicy = THREAD_ANDROID_POLICY.get();
BlockGuard.setThreadPolicy(androidPolicy);
}
- androidPolicy.setPolicyMask(policyMask);
+ androidPolicy.setThreadPolicyMask(threadPolicyMask);
+ }
+
+ private static void setBlockGuardVmPolicy(@VmPolicyMask int vmPolicyMask) {
+ // We only need to install BlockGuard for a small subset of VM policies
+ vmPolicyMask &= DETECT_VM_CREDENTIAL_PROTECTED_WHILE_LOCKED;
+ if (vmPolicyMask != 0) {
+ BlockGuard.setVmPolicy(VM_ANDROID_POLICY);
+ } else {
+ BlockGuard.setVmPolicy(BlockGuard.LAX_VM_POLICY);
+ }
}
// Sets up CloseGuard in Dalvik/libcore
@@ -1145,8 +1208,13 @@ public final class StrictMode {
* @return the bitmask of all the DETECT_* and PENALTY_* bits currently enabled
* @hide
*/
- public static int getThreadPolicyMask() {
- return BlockGuard.getThreadPolicy().getPolicyMask();
+ public static @ThreadPolicyMask int getThreadPolicyMask() {
+ final BlockGuard.Policy policy = BlockGuard.getThreadPolicy();
+ if (policy instanceof AndroidBlockGuardPolicy) {
+ return ((AndroidBlockGuardPolicy) policy).getThreadPolicyMask();
+ } else {
+ return 0;
+ }
}
/** Returns the current thread's policy. */
@@ -1178,9 +1246,9 @@ public final class StrictMode {
}
/** @hide */
- public static int allowThreadDiskWritesMask() {
+ public static @ThreadPolicyMask int allowThreadDiskWritesMask() {
int oldPolicyMask = getThreadPolicyMask();
- int newPolicyMask = oldPolicyMask & ~(DETECT_DISK_WRITE | DETECT_DISK_READ);
+ int newPolicyMask = oldPolicyMask & ~(DETECT_THREAD_DISK_WRITE | DETECT_THREAD_DISK_READ);
if (newPolicyMask != oldPolicyMask) {
setThreadPolicyMask(newPolicyMask);
}
@@ -1202,9 +1270,9 @@ public final class StrictMode {
}
/** @hide */
- public static int allowThreadDiskReadsMask() {
+ public static @ThreadPolicyMask int allowThreadDiskReadsMask() {
int oldPolicyMask = getThreadPolicyMask();
- int newPolicyMask = oldPolicyMask & ~(DETECT_DISK_READ);
+ int newPolicyMask = oldPolicyMask & ~(DETECT_THREAD_DISK_READ);
if (newPolicyMask != oldPolicyMask) {
setThreadPolicyMask(newPolicyMask);
}
@@ -1372,32 +1440,6 @@ public final class StrictMode {
sVmPolicy.mCallbackExecutor);
}
- /**
- * Parses the BlockGuard policy mask out from the Exception's getMessage() String value. Kinda
- * gross, but least invasive. :/
- *
- * <p>Input is of the following forms: "policy=137 violation=64" "policy=137 violation=64
- * msg=Arbitrary text"
- *
- * <p>Returns 0 on failure, which is a valid policy, but not a valid policy during a violation
- * (else there must've been some policy in effect to violate).
- */
- private static int parsePolicyFromMessage(String message) {
- if (message == null || !message.startsWith("policy=")) {
- return 0;
- }
- int spaceIndex = message.indexOf(' ');
- if (spaceIndex == -1) {
- return 0;
- }
- String policyString = message.substring(7, spaceIndex);
- try {
- return Integer.parseInt(policyString);
- } catch (NumberFormatException e) {
- return 0;
- }
- }
-
private static final ThreadLocal<ArrayList<ViolationInfo>> violationsBeingTimed =
new ThreadLocal<ArrayList<ViolationInfo>>() {
@Override
@@ -1428,30 +1470,30 @@ public final class StrictMode {
}
private static class AndroidBlockGuardPolicy implements BlockGuard.Policy {
- private int mPolicyMask;
+ private @ThreadPolicyMask int mThreadPolicyMask;
// Map from violation stacktrace hashcode -> uptimeMillis of
// last violation. No locking needed, as this is only
// accessed by the same thread.
private ArrayMap<Integer, Long> mLastViolationTime;
- public AndroidBlockGuardPolicy(final int policyMask) {
- mPolicyMask = policyMask;
+ public AndroidBlockGuardPolicy(@ThreadPolicyMask int threadPolicyMask) {
+ mThreadPolicyMask = threadPolicyMask;
}
@Override
public String toString() {
- return "AndroidBlockGuardPolicy; mPolicyMask=" + mPolicyMask;
+ return "AndroidBlockGuardPolicy; mPolicyMask=" + mThreadPolicyMask;
}
// Part of BlockGuard.Policy interface:
public int getPolicyMask() {
- return mPolicyMask;
+ return mThreadPolicyMask;
}
// Part of BlockGuard.Policy interface:
public void onWriteToDisk() {
- if ((mPolicyMask & DETECT_DISK_WRITE) == 0) {
+ if ((mThreadPolicyMask & DETECT_THREAD_DISK_WRITE) == 0) {
return;
}
if (tooManyViolationsThisLoop()) {
@@ -1462,7 +1504,7 @@ public final class StrictMode {
// Not part of BlockGuard.Policy; just part of StrictMode:
void onCustomSlowCall(String name) {
- if ((mPolicyMask & DETECT_CUSTOM) == 0) {
+ if ((mThreadPolicyMask & DETECT_THREAD_CUSTOM) == 0) {
return;
}
if (tooManyViolationsThisLoop()) {
@@ -1473,7 +1515,7 @@ public final class StrictMode {
// Not part of BlockGuard.Policy; just part of StrictMode:
void onResourceMismatch(Object tag) {
- if ((mPolicyMask & DETECT_RESOURCE_MISMATCH) == 0) {
+ if ((mThreadPolicyMask & DETECT_THREAD_RESOURCE_MISMATCH) == 0) {
return;
}
if (tooManyViolationsThisLoop()) {
@@ -1484,7 +1526,7 @@ public final class StrictMode {
// Not part of BlockGuard.Policy; just part of StrictMode:
public void onUnbufferedIO() {
- if ((mPolicyMask & DETECT_UNBUFFERED_IO) == 0) {
+ if ((mThreadPolicyMask & DETECT_THREAD_UNBUFFERED_IO) == 0) {
return;
}
if (tooManyViolationsThisLoop()) {
@@ -1495,7 +1537,7 @@ public final class StrictMode {
// Part of BlockGuard.Policy interface:
public void onReadFromDisk() {
- if ((mPolicyMask & DETECT_DISK_READ) == 0) {
+ if ((mThreadPolicyMask & DETECT_THREAD_DISK_READ) == 0) {
return;
}
if (tooManyViolationsThisLoop()) {
@@ -1506,10 +1548,10 @@ public final class StrictMode {
// Part of BlockGuard.Policy interface:
public void onNetwork() {
- if ((mPolicyMask & DETECT_NETWORK) == 0) {
+ if ((mThreadPolicyMask & DETECT_THREAD_NETWORK) == 0) {
return;
}
- if ((mPolicyMask & PENALTY_DEATH_ON_NETWORK) != 0) {
+ if ((mThreadPolicyMask & PENALTY_DEATH_ON_NETWORK) != 0) {
throw new NetworkOnMainThreadException();
}
if (tooManyViolationsThisLoop()) {
@@ -1518,8 +1560,23 @@ public final class StrictMode {
startHandlingViolationException(new NetworkViolation());
}
- public void setPolicyMask(int policyMask) {
- mPolicyMask = policyMask;
+ // Part of BlockGuard.Policy interface:
+ public void onExplicitGc() {
+ if ((mThreadPolicyMask & DETECT_THREAD_EXPLICIT_GC) == 0) {
+ return;
+ }
+ if (tooManyViolationsThisLoop()) {
+ return;
+ }
+ startHandlingViolationException(new ExplicitGcViolation());
+ }
+
+ public @ThreadPolicyMask int getThreadPolicyMask() {
+ return mThreadPolicyMask;
+ }
+
+ public void setThreadPolicyMask(@ThreadPolicyMask int threadPolicyMask) {
+ mThreadPolicyMask = threadPolicyMask;
}
// Start handling a violation that just started and hasn't
@@ -1528,7 +1585,8 @@ public final class StrictMode {
// thread and, if so, uses it to roughly measure how long the
// violation took.
void startHandlingViolationException(Violation e) {
- final ViolationInfo info = new ViolationInfo(e, mPolicyMask);
+ final int penaltyMask = (mThreadPolicyMask & PENALTY_ALL);
+ final ViolationInfo info = new ViolationInfo(e, penaltyMask);
info.violationUptimeMillis = SystemClock.uptimeMillis();
handleViolationWithTimingAttempt(info);
}
@@ -1557,7 +1615,7 @@ public final class StrictMode {
//
// TODO: if in gather mode, ignore Looper.myLooper() and always
// go into this immediate mode?
- if (looper == null || (info.mPolicy & THREAD_PENALTY_MASK) == PENALTY_DEATH) {
+ if (looper == null || (info.mPenaltyMask == PENALTY_DEATH)) {
info.durationMillis = -1; // unknown (redundant, already set)
onThreadPolicyViolation(info);
return;
@@ -1628,7 +1686,7 @@ public final class StrictMode {
// to people who push/pop temporary policy in regions of code,
// hence the policy being passed around.
void onThreadPolicyViolation(final ViolationInfo info) {
- if (LOG_V) Log.d(TAG, "onThreadPolicyViolation; policy=" + info.mPolicy);
+ if (LOG_V) Log.d(TAG, "onThreadPolicyViolation; penalty=" + info.mPenaltyMask);
if (info.penaltyEnabled(PENALTY_GATHER)) {
ArrayList<ViolationInfo> violations = gatheredViolations.get();
@@ -1669,25 +1727,20 @@ public final class StrictMode {
final Violation violation = info.mViolation;
- // The violationMaskSubset, passed to ActivityManager, is a
- // subset of the original StrictMode policy bitmask, with
- // only the bit violated and penalty bits to be executed
- // by the ActivityManagerService remaining set.
- int violationMaskSubset = 0;
+ // Penalties that ActivityManager should execute on our behalf.
+ int penaltyMask = 0;
if (info.penaltyEnabled(PENALTY_DIALOG)
&& timeSinceLastViolationMillis > MIN_DIALOG_INTERVAL_MS) {
- violationMaskSubset |= PENALTY_DIALOG;
+ penaltyMask |= PENALTY_DIALOG;
}
if (info.penaltyEnabled(PENALTY_DROPBOX) && lastViolationTime == 0) {
- violationMaskSubset |= PENALTY_DROPBOX;
+ penaltyMask |= PENALTY_DROPBOX;
}
- if (violationMaskSubset != 0) {
- violationMaskSubset |= info.getViolationBit();
-
- final boolean justDropBox = (info.mPolicy & THREAD_PENALTY_MASK) == PENALTY_DROPBOX;
+ if (penaltyMask != 0) {
+ final boolean justDropBox = (info.mPenaltyMask == PENALTY_DROPBOX);
if (justDropBox) {
// If all we're going to ask the activity manager
// to do is dropbox it (the common case during
@@ -1695,13 +1748,13 @@ public final class StrictMode {
// call synchronously which Binder data suggests
// isn't always super fast, despite the implementation
// in the ActivityManager trying to be mostly async.
- dropboxViolationAsync(violationMaskSubset, info);
+ dropboxViolationAsync(penaltyMask, info);
} else {
- handleApplicationStrictModeViolation(violationMaskSubset, info);
+ handleApplicationStrictModeViolation(penaltyMask, info);
}
}
- if ((info.getPolicyMask() & PENALTY_DEATH) != 0) {
+ if (info.penaltyEnabled(PENALTY_DEATH)) {
throw new RuntimeException("StrictMode ThreadPolicy violation", violation);
}
@@ -1714,11 +1767,11 @@ public final class StrictMode {
executor.execute(
() -> {
// Lift violated policy to prevent infinite recursion.
- ThreadPolicy oldPolicy = allowThreadViolations();
+ ThreadPolicy oldPolicy = StrictMode.allowThreadViolations();
try {
listener.onThreadViolation(violation);
} finally {
- setThreadPolicy(oldPolicy);
+ StrictMode.setThreadPolicy(oldPolicy);
}
});
} catch (RejectedExecutionException e) {
@@ -1728,6 +1781,34 @@ public final class StrictMode {
}
}
+ private static final BlockGuard.VmPolicy VM_ANDROID_POLICY = new BlockGuard.VmPolicy() {
+ @Override
+ public void onPathAccess(String path) {
+ if (path == null) return;
+
+ // NOTE: keep credential-protected paths in sync with Environment.java
+ if (path.startsWith("/data/user/")
+ || path.startsWith("/data/media/")
+ || path.startsWith("/data/system_ce/")
+ || path.startsWith("/data/misc_ce/")
+ || path.startsWith("/data/vendor_ce/")
+ || path.startsWith("/storage/emulated/")) {
+ final int second = path.indexOf('/', 1);
+ final int third = path.indexOf('/', second + 1);
+ final int fourth = path.indexOf('/', third + 1);
+ if (fourth == -1) return;
+
+ try {
+ final int userId = Integer.parseInt(path.substring(third + 1, fourth));
+ onCredentialProtectedPathAccess(path, userId);
+ } catch (NumberFormatException ignored) {
+ }
+ } else if (path.startsWith("/data/data/")) {
+ onCredentialProtectedPathAccess(path, UserHandle.USER_SYSTEM);
+ }
+ }
+ };
+
/**
* In the common case, as set by conditionallyEnableDebugLogging, we're just dropboxing any
* violations but not showing a dialog, not loggging, and not killing the process. In these
@@ -1735,7 +1816,7 @@ public final class StrictMode {
* per-thread and vm-wide violations when applicable.
*/
private static void dropboxViolationAsync(
- final int violationMaskSubset, final ViolationInfo info) {
+ final int penaltyMask, final ViolationInfo info) {
int outstanding = sDropboxCallsInFlight.incrementAndGet();
if (outstanding > 20) {
// What's going on? Let's not make make the situation
@@ -1747,13 +1828,13 @@ public final class StrictMode {
if (LOG_V) Log.d(TAG, "Dropboxing async; in-flight=" + outstanding);
BackgroundThread.getHandler().post(() -> {
- handleApplicationStrictModeViolation(violationMaskSubset, info);
+ handleApplicationStrictModeViolation(penaltyMask, info);
int outstandingInner = sDropboxCallsInFlight.decrementAndGet();
if (LOG_V) Log.d(TAG, "Dropbox complete; in-flight=" + outstandingInner);
});
}
- private static void handleApplicationStrictModeViolation(int violationMaskSubset,
+ private static void handleApplicationStrictModeViolation(int penaltyMask,
ViolationInfo info) {
final int oldMask = getThreadPolicyMask();
try {
@@ -1768,7 +1849,7 @@ public final class StrictMode {
Log.w(TAG, "No activity manager; failed to Dropbox violation.");
} else {
am.handleApplicationStrictModeViolation(
- RuntimeInit.getApplicationObject(), violationMaskSubset, info);
+ RuntimeInit.getApplicationObject(), penaltyMask, info);
}
} catch (RemoteException e) {
if (e instanceof DeadObjectException) {
@@ -1801,6 +1882,7 @@ public final class StrictMode {
}
/** @hide */
+ @TestApi
public static void conditionallyCheckInstanceCounts() {
VmPolicy policy = getVmPolicy();
int policySize = policy.classInstanceLimit.size();
@@ -1855,7 +1937,7 @@ public final class StrictMode {
if (looper != null) {
MessageQueue mq = looper.mQueue;
if (policy.classInstanceLimit.size() == 0
- || (sVmPolicy.mask & VM_PENALTY_MASK) == 0) {
+ || (sVmPolicy.mask & PENALTY_ALL) == 0) {
mq.removeIdleHandler(sProcessIdleHandler);
sIsIdlerRegistered = false;
} else if (!sIsIdlerRegistered) {
@@ -1894,6 +1976,8 @@ public final class StrictMode {
VMRuntime.setNonSdkApiUsageConsumer(null);
VMRuntime.setDedupeHiddenApiWarnings(true);
}
+
+ setBlockGuardVmPolicy(sVmPolicy.mask);
}
}
@@ -1952,6 +2036,16 @@ public final class StrictMode {
}
/** @hide */
+ public static boolean vmImplicitDirectBootEnabled() {
+ return (sVmPolicy.mask & DETECT_VM_IMPLICIT_DIRECT_BOOT) != 0;
+ }
+
+ /** @hide */
+ public static boolean vmCredentialProtectedWhileLockedEnabled() {
+ return (sVmPolicy.mask & DETECT_VM_CREDENTIAL_PROTECTED_WHILE_LOCKED) != 0;
+ }
+
+ /** @hide */
public static void onSqliteObjectLeaked(String message, Throwable originStack) {
onVmPolicyViolation(new SqliteObjectLeakedViolation(message, originStack));
}
@@ -1987,10 +2081,6 @@ public final class StrictMode {
}
/** @hide */
- public static final String CLEARTEXT_DETECTED_MSG =
- "Detected cleartext network traffic from UID ";
-
- /** @hide */
public static void onCleartextNetworkDetected(byte[] firstPacket) {
byte[] rawAddr = null;
if (firstPacket != null) {
@@ -2006,7 +2096,7 @@ public final class StrictMode {
}
final int uid = android.os.Process.myUid();
- String msg = CLEARTEXT_DETECTED_MSG + uid;
+ String msg = "Detected cleartext network traffic from UID " + uid;
if (rawAddr != null) {
try {
msg += " to " + InetAddress.getByAddress(rawAddr);
@@ -2023,6 +2113,47 @@ public final class StrictMode {
onVmPolicyViolation(new UntaggedSocketViolation());
}
+ /** @hide */
+ public static void onImplicitDirectBoot() {
+ onVmPolicyViolation(new ImplicitDirectBootViolation());
+ }
+
+ /** Assume locked until we hear otherwise */
+ private static volatile boolean sUserKeyUnlocked = false;
+
+ private static boolean isUserKeyUnlocked(int userId) {
+ final IStorageManager storage = IStorageManager.Stub
+ .asInterface(ServiceManager.getService("mount"));
+ if (storage != null) {
+ try {
+ return storage.isUserKeyUnlocked(userId);
+ } catch (RemoteException ignored) {
+ }
+ }
+ return false;
+ }
+
+ /** @hide */
+ private static void onCredentialProtectedPathAccess(String path, int userId) {
+ // We can cache the unlocked state for the userId we're running as,
+ // since any relocking of that user will always result in our
+ // process being killed to release any CE FDs we're holding onto.
+ if (userId == UserHandle.myUserId()) {
+ if (sUserKeyUnlocked) {
+ return;
+ } else if (isUserKeyUnlocked(userId)) {
+ sUserKeyUnlocked = true;
+ return;
+ }
+ } else if (isUserKeyUnlocked(userId)) {
+ return;
+ }
+
+ onVmPolicyViolation(new CredentialProtectedWhileLockedViolation(
+ "Accessed credential protected path " + path + " while user " + userId
+ + " was locked"));
+ }
+
// Map from VM violation fingerprint to uptime millis.
private static final HashMap<Integer, Long> sLastVmViolationTime = new HashMap<>();
@@ -2036,7 +2167,9 @@ public final class StrictMode {
final boolean penaltyDropbox = (sVmPolicy.mask & PENALTY_DROPBOX) != 0;
final boolean penaltyDeath = ((sVmPolicy.mask & PENALTY_DEATH) != 0) || forceDeath;
final boolean penaltyLog = (sVmPolicy.mask & PENALTY_LOG) != 0;
- final ViolationInfo info = new ViolationInfo(violation, sVmPolicy.mask);
+
+ final int penaltyMask = (sVmPolicy.mask & PENALTY_ALL);
+ final ViolationInfo info = new ViolationInfo(violation, penaltyMask);
// Erase stuff not relevant for process-wide violations
info.numAnimationsRunning = 0;
@@ -2065,16 +2198,14 @@ public final class StrictMode {
sLogger.log(info);
}
- int violationMaskSubset = PENALTY_DROPBOX | (ALL_VM_DETECT_BITS & sVmPolicy.mask);
-
if (penaltyDropbox) {
if (penaltyDeath) {
- handleApplicationStrictModeViolation(violationMaskSubset, info);
+ handleApplicationStrictModeViolation(PENALTY_DROPBOX, info);
} else {
// Common case for userdebug/eng builds. If no death and
// just dropboxing, we can do the ActivityManager call
// asynchronously.
- dropboxViolationAsync(violationMaskSubset, info);
+ dropboxViolationAsync(PENALTY_DROPBOX, info);
}
}
@@ -2149,7 +2280,7 @@ public final class StrictMode {
* Binder for its current (native) thread-local policy value and synchronize it to libcore's
* (Java) thread-local policy value.
*/
- private static void onBinderStrictModePolicyChange(int newPolicy) {
+ private static void onBinderStrictModePolicyChange(@ThreadPolicyMask int newPolicy) {
setBlockGuardPolicy(newPolicy);
}
@@ -2467,8 +2598,8 @@ public final class StrictMode {
/** Memoized stack trace of full violation. */
@Nullable private String mStackTrace;
- /** The strict mode policy mask at the time of violation. */
- private final int mPolicy;
+ /** The strict mode penalty mask at the time of violation. */
+ private final int mPenaltyMask;
/** The wall time duration of the violation, when known. -1 when not known. */
public int durationMillis = -1;
@@ -2499,9 +2630,9 @@ public final class StrictMode {
public long numInstances = -1;
/** Create an instance of ViolationInfo initialized from an exception. */
- ViolationInfo(Violation tr, int policy) {
+ ViolationInfo(Violation tr, int penaltyMask) {
this.mViolation = tr;
- this.mPolicy = policy;
+ this.mPenaltyMask = penaltyMask;
violationUptimeMillis = SystemClock.uptimeMillis();
this.numAnimationsRunning = ValueAnimator.getCurrentAnimationsCount();
Intent broadcastIntent = ActivityThread.getIntentBeingBroadcast();
@@ -2530,7 +2661,10 @@ public final class StrictMode {
}
}
- /** Equivalent output to {@link ApplicationErrorReport.CrashInfo#stackTrace}. */
+ /**
+ * Equivalent output to
+ * {@link android.app.ApplicationErrorReport.CrashInfo#stackTrace}.
+ */
public String getStackTrace() {
if (mStackTrace == null) {
StringWriter sw = new StringWriter();
@@ -2551,6 +2685,10 @@ public final class StrictMode {
return mStackTrace;
}
+ public Class<? extends Violation> getViolationClass() {
+ return mViolation.getClass();
+ }
+
/**
* Optional message describing this violation.
*
@@ -2561,18 +2699,8 @@ public final class StrictMode {
return mViolation.getMessage();
}
- /**
- * Policy mask at time of violation.
- *
- * @hide
- */
- @TestApi
- public int getPolicyMask() {
- return mPolicy;
- }
-
boolean penaltyEnabled(int p) {
- return (mPolicy & p) != 0;
+ return (mPenaltyMask & p) != 0;
}
/**
@@ -2585,49 +2713,6 @@ public final class StrictMode {
mBinderStack.addFirst(t.getStackTrace());
}
- /**
- * Retrieve the type of StrictMode violation.
- *
- * @hide
- */
- @TestApi
- public int getViolationBit() {
- if (mViolation instanceof DiskWriteViolation) {
- return DETECT_DISK_WRITE;
- } else if (mViolation instanceof DiskReadViolation) {
- return DETECT_DISK_READ;
- } else if (mViolation instanceof NetworkViolation) {
- return DETECT_NETWORK;
- } else if (mViolation instanceof CustomViolation) {
- return DETECT_CUSTOM;
- } else if (mViolation instanceof ResourceMismatchViolation) {
- return DETECT_RESOURCE_MISMATCH;
- } else if (mViolation instanceof UnbufferedIoViolation) {
- return DETECT_UNBUFFERED_IO;
- } else if (mViolation instanceof SqliteObjectLeakedViolation) {
- return DETECT_VM_CURSOR_LEAKS;
- } else if (mViolation instanceof LeakedClosableViolation) {
- return DETECT_VM_CLOSABLE_LEAKS;
- } else if (mViolation instanceof InstanceCountViolation) {
- return DETECT_VM_INSTANCE_LEAKS;
- } else if (mViolation instanceof IntentReceiverLeakedViolation) {
- return DETECT_VM_REGISTRATION_LEAKS;
- } else if (mViolation instanceof ServiceConnectionLeakedViolation) {
- return DETECT_VM_REGISTRATION_LEAKS;
- } else if (mViolation instanceof FileUriExposedViolation) {
- return DETECT_VM_FILE_URI_EXPOSURE;
- } else if (mViolation instanceof CleartextNetworkViolation) {
- return DETECT_VM_CLEARTEXT_NETWORK;
- } else if (mViolation instanceof ContentUriWithoutPermissionViolation) {
- return DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION;
- } else if (mViolation instanceof UntaggedSocketViolation) {
- return DETECT_VM_UNTAGGED_SOCKET;
- } else if (mViolation instanceof NonSdkApiUsedViolation) {
- return DETECT_VM_NON_SDK_API_USAGE;
- }
- throw new IllegalStateException("missing violation bit");
- }
-
@Override
public int hashCode() {
int result = 17;
@@ -2675,11 +2760,11 @@ public final class StrictMode {
}
mBinderStack.add(traceElements);
}
- int rawPolicy = in.readInt();
+ int rawPenaltyMask = in.readInt();
if (unsetGatheringBit) {
- mPolicy = rawPolicy & ~PENALTY_GATHER;
+ mPenaltyMask = rawPenaltyMask & ~PENALTY_GATHER;
} else {
- mPolicy = rawPolicy;
+ mPenaltyMask = rawPenaltyMask;
}
durationMillis = in.readInt();
violationNumThisLoop = in.readInt();
@@ -2705,7 +2790,7 @@ public final class StrictMode {
}
}
int start = dest.dataPosition();
- dest.writeInt(mPolicy);
+ dest.writeInt(mPenaltyMask);
dest.writeInt(durationMillis);
dest.writeInt(violationNumThisLoop);
dest.writeInt(numAnimationsRunning);
@@ -2717,8 +2802,8 @@ public final class StrictMode {
if (Binder.CHECK_PARCEL_SIZE && total > 10 * 1024) {
Slog.d(
TAG,
- "VIO: policy="
- + mPolicy
+ "VIO: penalty="
+ + mPenaltyMask
+ " dur="
+ durationMillis
+ " numLoop="
@@ -2738,7 +2823,7 @@ public final class StrictMode {
/** Dump a ViolationInfo instance to a Printer. */
public void dump(Printer pw, String prefix) {
pw.println(prefix + "stackTrace: " + getStackTrace());
- pw.println(prefix + "policy: " + mPolicy);
+ pw.println(prefix + "penalty: " + mPenaltyMask);
if (durationMillis != -1) {
pw.println(prefix + "durationMillis: " + durationMillis);
}
diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java
index 7d3ba6a3cf26..fb34a524f625 100644
--- a/core/java/android/os/SystemProperties.java
+++ b/core/java/android/os/SystemProperties.java
@@ -96,6 +96,7 @@ public class SystemProperties {
*/
@NonNull
@SystemApi
+ @TestApi
public static String get(@NonNull String key) {
if (TRACK_KEY_ACCESS) onKeyAccess(key);
return native_get(key);
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index 30451c247650..a967b3da339e 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -93,6 +93,8 @@ public final class Trace {
public static final long TRACE_TAG_VIBRATOR = 1L << 23;
/** @hide */
public static final long TRACE_TAG_AIDL = 1L << 24;
+ /** @hide */
+ public static final long TRACE_TAG_NNAPI = 1L << 25;
private static final long TRACE_TAG_NOT_READY = 1L << 63;
private static final int MAX_SECTION_NAME_LEN = 127;
@@ -286,6 +288,19 @@ public final class Trace {
}
/**
+ * Checks whether or not tracing is currently enabled. This is useful to avoid intermediate
+ * string creation for trace sections that require formatting. It is not necessary
+ * to guard all Trace method calls as they internally already check this. However it is
+ * recommended to use this to prevent creating any temporary objects that would then be
+ * passed to those methods to reduce runtime cost when tracing isn't enabled.
+ *
+ * @return true if tracing is currently enabled, false otherwise
+ */
+ public static boolean isEnabled() {
+ return isTagEnabled(TRACE_TAG_APP);
+ }
+
+ /**
* Writes a trace message to indicate that a given section of code has begun. This call must
* be followed by a corresponding call to {@link #endSection()} on the same thread.
*
@@ -317,4 +332,42 @@ public final class Trace {
nativeTraceEnd(TRACE_TAG_APP);
}
}
+
+ /**
+ * Writes a trace message to indicate that a given section of code has
+ * begun. Must be followed by a call to {@link #endAsyncSection(String, int)} with the same
+ * methodName and cookie. Unlike {@link #beginSection(String)} and {@link #endSection()},
+ * asynchronous events do not need to be nested. The name and cookie used to
+ * begin an event must be used to end it.
+ *
+ * @param methodName The method name to appear in the trace.
+ * @param cookie Unique identifier for distinguishing simultaneous events
+ */
+ public static void beginAsyncSection(String methodName, int cookie) {
+ asyncTraceBegin(TRACE_TAG_APP, methodName, cookie);
+ }
+
+ /**
+ * Writes a trace message to indicate that the current method has ended.
+ * Must be called exactly once for each call to {@link #beginAsyncSection(String, int)}
+ * using the same name and cookie.
+ *
+ * @param methodName The method name to appear in the trace.
+ * @param cookie Unique identifier for distinguishing simultaneous events
+ */
+ public static void endAsyncSection(String methodName, int cookie) {
+ asyncTraceEnd(TRACE_TAG_APP, methodName, cookie);
+ }
+
+ /**
+ * Writes trace message to indicate the value of a given counter.
+ *
+ * @param counterName The counter name to appear in the trace.
+ * @param counterValue The counter value.
+ */
+ public static void setCounter(String counterName, int counterValue) {
+ if (isTagEnabled(TRACE_TAG_APP)) {
+ nativeTraceCounter(TRACE_TAG_APP, counterName, counterValue);
+ }
+ }
}
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index 4d4f31de0077..66ebbdbdb915 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -145,6 +145,7 @@ public final class UserHandle implements Parcelable {
* "it's system", because of isolated UIDs. Use {@link #isCore} for that.
* @hide
*/
+ @TestApi
public static boolean isApp(int uid) {
if (uid > 0) {
final int appId = getAppId(uid);
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index b5918519d872..7a214b1bf1bf 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -367,8 +367,12 @@ public class UserManager {
public static final String DISALLOW_REMOVE_MANAGED_PROFILE = "no_remove_managed_profile";
/**
- * Specifies if a user is disallowed from enabling or
- * accessing debugging features. The default value is <code>false</code>.
+ * Specifies if a user is disallowed from enabling or accessing debugging features. When set on
+ * the primary user, disables debugging features altogether, including USB debugging. When set
+ * on a managed profile or a secondary user, blocks debugging for that user only, including
+ * starting activities, making service calls, accessing content providers, sending broadcasts,
+ * installing/uninstalling packages, clearing user data, etc.
+ * The default value is <code>false</code>.
*
* <p>Key for user restrictions.
* <p>Type: Boolean
@@ -2663,6 +2667,12 @@ public class UserManager {
if (isDeviceInDemoMode(mContext)) {
return false;
}
+ // If user disabled this feature, don't show switcher
+ final boolean userSwitcherEnabled = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.USER_SWITCHER_ENABLED, 1) != 0;
+ if (!userSwitcherEnabled) {
+ return false;
+ }
List<UserInfo> users = getUsers(true);
if (users == null) {
return false;
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index ff5502f50655..01d85c6c6c85 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -17,6 +17,7 @@
package android.os;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.content.ContentResolver;
import android.content.Context;
import android.hardware.vibrator.V1_0.EffectStrength;
@@ -24,8 +25,6 @@ import android.hardware.vibrator.V1_2.Effect;
import android.net.Uri;
import android.util.MathUtils;
-import com.android.internal.annotations.VisibleForTesting;
-
import java.util.Arrays;
/**
@@ -55,6 +54,7 @@ public abstract class VibrationEffect implements Parcelable {
* @see #get(int)
* @hide
*/
+ @TestApi
public static final int EFFECT_CLICK = Effect.CLICK;
/**
@@ -63,6 +63,7 @@ public abstract class VibrationEffect implements Parcelable {
* @see #get(int)
* @hide
*/
+ @TestApi
public static final int EFFECT_DOUBLE_CLICK = Effect.DOUBLE_CLICK;
/**
@@ -70,6 +71,7 @@ public abstract class VibrationEffect implements Parcelable {
* @see #get(int)
* @hide
*/
+ @TestApi
public static final int EFFECT_TICK = Effect.TICK;
/**
@@ -77,6 +79,7 @@ public abstract class VibrationEffect implements Parcelable {
* @see #get(int)
* @hide
*/
+ @TestApi
public static final int EFFECT_THUD = Effect.THUD;
/**
@@ -84,6 +87,7 @@ public abstract class VibrationEffect implements Parcelable {
* @see #get(int)
* @hide
*/
+ @TestApi
public static final int EFFECT_POP = Effect.POP;
/**
@@ -91,8 +95,20 @@ public abstract class VibrationEffect implements Parcelable {
* @see #get(int)
* @hide
*/
+ @TestApi
public static final int EFFECT_HEAVY_CLICK = Effect.HEAVY_CLICK;
+ /** {@hide} */
+ @TestApi
+ public static final int EFFECT_STRENGTH_LIGHT = EffectStrength.LIGHT;
+
+ /** {@hide} */
+ @TestApi
+ public static final int EFFECT_STRENGTH_MEDIUM = EffectStrength.MEDIUM;
+
+ /** {@hide} */
+ @TestApi
+ public static final int EFFECT_STRENGTH_STRONG = EffectStrength.STRONG;
/**
* Ringtone patterns. They may correspond with the device's ringtone audio, or may just be a
@@ -101,7 +117,7 @@ public abstract class VibrationEffect implements Parcelable {
* @see #get(Uri, Context)
* @hide
*/
- @VisibleForTesting
+ @TestApi
public static final int[] RINGTONES = {
Effect.RINGTONE_1,
Effect.RINGTONE_2,
@@ -220,6 +236,7 @@ public abstract class VibrationEffect implements Parcelable {
* @return The desired effect.
* @hide
*/
+ @TestApi
public static VibrationEffect get(int effectId) {
return get(effectId, true);
}
@@ -246,6 +263,7 @@ public abstract class VibrationEffect implements Parcelable {
* @return The desired effect.
* @hide
*/
+ @TestApi
public static VibrationEffect get(int effectId, boolean fallback) {
VibrationEffect effect = new Prebaked(effectId, fallback);
effect.validate();
@@ -268,6 +286,7 @@ public abstract class VibrationEffect implements Parcelable {
*
* @hide
*/
+ @TestApi
@Nullable
public static VibrationEffect get(Uri uri, Context context) {
String[] uris = context.getResources().getStringArray(
@@ -305,6 +324,7 @@ public abstract class VibrationEffect implements Parcelable {
*
* @hide
*/
+ @TestApi
public abstract long getDuration();
/**
@@ -313,12 +333,14 @@ public abstract class VibrationEffect implements Parcelable {
* This assumes that the previous value was in the range [0, MAX_AMPLITUDE]
* @hide
*/
+ @TestApi
protected static int scale(int amplitude, float gamma, int maxAmplitude) {
float val = MathUtils.pow(amplitude / (float) MAX_AMPLITUDE, gamma);
return (int) (val * maxAmplitude);
}
/** @hide */
+ @TestApi
public static class OneShot extends VibrationEffect implements Parcelable {
private final long mDuration;
private final int mAmplitude;
@@ -346,11 +368,17 @@ public abstract class VibrationEffect implements Parcelable {
* Scale the amplitude of this effect.
*
* @param gamma the gamma adjustment to apply
- * @param maxAmplitude the new maximum amplitude of the effect
+ * @param maxAmplitude the new maximum amplitude of the effect, must be between 0 and
+ * MAX_AMPLITUDE
+ * @throws IllegalArgumentException if maxAmplitude less than 0 or more than MAX_AMPLITUDE
*
* @return A {@link OneShot} effect with the same timing but scaled amplitude.
*/
- public VibrationEffect scale(float gamma, int maxAmplitude) {
+ public OneShot scale(float gamma, int maxAmplitude) {
+ if (maxAmplitude > MAX_AMPLITUDE || maxAmplitude < 0) {
+ throw new IllegalArgumentException(
+ "Amplitude is negative or greater than MAX_AMPLITUDE");
+ }
int newAmplitude = scale(mAmplitude, gamma, maxAmplitude);
return new OneShot(mDuration, newAmplitude);
}
@@ -433,6 +461,7 @@ public abstract class VibrationEffect implements Parcelable {
}
/** @hide */
+ @TestApi
public static class Waveform extends VibrationEffect implements Parcelable {
private final long[] mTimings;
private final int[] mAmplitudes;
@@ -478,12 +507,18 @@ public abstract class VibrationEffect implements Parcelable {
* Scale the Waveform with the given gamma and new max amplitude.
*
* @param gamma the gamma adjustment to apply
- * @param maxAmplitude the new maximum amplitude of the effect
+ * @param maxAmplitude the new maximum amplitude of the effect, must be between 0 and
+ * MAX_AMPLITUDE
+ * @throws IllegalArgumentException if maxAmplitude less than 0 or more than MAX_AMPLITUDE
*
* @return A {@link Waveform} effect with the same timings and repeat index
* but scaled amplitude.
*/
- public VibrationEffect scale(float gamma, int maxAmplitude) {
+ public Waveform scale(float gamma, int maxAmplitude) {
+ if (maxAmplitude > MAX_AMPLITUDE || maxAmplitude < 0) {
+ throw new IllegalArgumentException(
+ "Amplitude is negative or greater than MAX_AMPLITUDE");
+ }
if (gamma == 1.0f && maxAmplitude == MAX_AMPLITUDE) {
// Just return a copy of the original if there's no scaling to be done.
return new Waveform(mTimings, mAmplitudes, mRepeat);
@@ -614,6 +649,7 @@ public abstract class VibrationEffect implements Parcelable {
}
/** @hide */
+ @TestApi
public static class Prebaked extends VibrationEffect implements Parcelable {
private final int mEffectId;
private final boolean mFallback;
diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java
index 327071906e18..2299ab2a23ff 100644
--- a/core/java/android/os/WorkSource.java
+++ b/core/java/android/os/WorkSource.java
@@ -2,6 +2,7 @@ package android.os;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.Context;
import android.os.WorkSourceProto;
import android.provider.Settings;
@@ -83,6 +84,7 @@ public class WorkSource implements Parcelable {
}
/** @hide */
+ @TestApi
public WorkSource(int uid) {
mNum = 1;
mUids = new int[] { uid, 0 };
@@ -127,16 +129,19 @@ public class WorkSource implements Parcelable {
}
/** @hide */
+ @TestApi
public int size() {
return mNum;
}
/** @hide */
+ @TestApi
public int get(int index) {
return mUids[index];
}
/** @hide */
+ @TestApi
public String getName(int index) {
return mNames != null ? mNames[index] : null;
}
@@ -328,6 +333,7 @@ public class WorkSource implements Parcelable {
* to be aware of internal differences.
*/
@Deprecated
+ @TestApi
public WorkSource[] setReturningDiffs(WorkSource other) {
synchronized (sTmpWorkSource) {
sNewbWork = null;
@@ -379,6 +385,7 @@ public class WorkSource implements Parcelable {
* @deprecated meant for unit testing use only. Will be removed in a future API revision.
*/
@Deprecated
+ @TestApi
public WorkSource addReturningNewbs(WorkSource other) {
synchronized (sTmpWorkSource) {
sNewbWork = null;
@@ -388,6 +395,7 @@ public class WorkSource implements Parcelable {
}
/** @hide */
+ @TestApi
public boolean add(int uid) {
if (mNum <= 0) {
mNames = null;
@@ -407,6 +415,7 @@ public class WorkSource implements Parcelable {
}
/** @hide */
+ @TestApi
public boolean add(int uid, String name) {
if (mNum <= 0) {
insert(0, uid, name);
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index 6994033a963a..021e72f7a082 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -467,6 +467,35 @@ public class ZygoteProcess {
}
/**
+ * Attempt to retrieve the PID of the zygote serving the given abi.
+ */
+ public int getZygotePid(String abi) {
+ try {
+ synchronized (mLock) {
+ ZygoteState state = openZygoteSocketIfNeeded(abi);
+
+ // Each query starts with the argument count (1 in this case)
+ state.writer.write("1");
+ // ... followed by a new-line.
+ state.writer.newLine();
+ // ... followed by our only argument.
+ state.writer.write("--get-pid");
+ state.writer.newLine();
+ state.writer.flush();
+
+ // The response is a length prefixed stream of ASCII bytes.
+ int numBytes = state.inputStream.readInt();
+ byte[] bytes = new byte[numBytes];
+ state.inputStream.readFully(bytes);
+
+ return Integer.parseInt(new String(bytes, StandardCharsets.US_ASCII));
+ }
+ } catch (Exception ex) {
+ throw new RuntimeException("Failure retrieving pid", ex);
+ }
+ }
+
+ /**
* Push hidden API blacklisting exemptions into the zygote process(es).
*
* <p>The list of exemptions will take affect for all new processes forked from the zygote after
diff --git a/core/java/android/os/health/HealthKeys.java b/core/java/android/os/health/HealthKeys.java
index 842def3d256b..5d60411c6889 100644
--- a/core/java/android/os/health/HealthKeys.java
+++ b/core/java/android/os/health/HealthKeys.java
@@ -16,10 +16,8 @@
package android.os.health;
-import android.os.Parcel;
-import android.os.Parcelable;
+import android.annotation.TestApi;
-import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -32,6 +30,7 @@ import java.util.Arrays;
*
* @hide
*/
+@TestApi
public class HealthKeys {
/**
@@ -81,6 +80,7 @@ public class HealthKeys {
*
* @hide
*/
+ @TestApi
public static class Constants {
private final String mDataType;
private final int[][] mKeys = new int[TYPE_COUNT][];
diff --git a/core/java/android/os/health/HealthStats.java b/core/java/android/os/health/HealthStats.java
index 90d89c5ced8c..74ce5157a548 100644
--- a/core/java/android/os/health/HealthStats.java
+++ b/core/java/android/os/health/HealthStats.java
@@ -16,6 +16,7 @@
package android.os.health;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArrayMap;
@@ -126,6 +127,7 @@ public class HealthStats {
*
* @hide
*/
+ @TestApi
public HealthStats(Parcel in) {
int count;
diff --git a/core/java/android/os/health/HealthStatsParceler.java b/core/java/android/os/health/HealthStatsParceler.java
index 28b36940fb2e..d358a2e59099 100644
--- a/core/java/android/os/health/HealthStatsParceler.java
+++ b/core/java/android/os/health/HealthStatsParceler.java
@@ -16,6 +16,7 @@
package android.os.health;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArrayMap;
@@ -35,6 +36,7 @@ import java.util.Map;
* reuse them.
* @hide
*/
+@TestApi
public class HealthStatsParceler implements Parcelable {
private HealthStatsWriter mWriter;
private HealthStats mHealthStats;
diff --git a/core/java/android/os/health/HealthStatsWriter.java b/core/java/android/os/health/HealthStatsWriter.java
index 351836bad7c9..d4d10b056c5c 100644
--- a/core/java/android/os/health/HealthStatsWriter.java
+++ b/core/java/android/os/health/HealthStatsWriter.java
@@ -16,6 +16,7 @@
package android.os.health;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArrayMap;
@@ -31,6 +32,7 @@ import java.util.Map;
*
* @hide
*/
+@TestApi
public class HealthStatsWriter {
private final HealthKeys.Constants mConstants;
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 2d1bb2f25d88..8b8ae1cbbc14 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -71,6 +71,8 @@ import com.android.internal.os.RoSystemProperties;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.Preconditions;
+import dalvik.system.BlockGuard;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
@@ -1131,6 +1133,7 @@ public class StorageManager {
/** {@hide} */
public void mkdirs(File file) {
+ BlockGuard.getVmPolicy().onPathAccess(file.getAbsolutePath());
try {
mStorageManager.mkdirs(mContext.getOpPackageName(), file.getAbsolutePath());
} catch (RemoteException e) {
@@ -1835,7 +1838,6 @@ public class StorageManager {
* @throws IOException when the storage device isn't present, or when it
* doesn't support allocating space, or if the device had
* trouble allocating the requested space.
- * @see #getAllocatableBytes(UUID, int)
* @see #isAllocationSupported(FileDescriptor)
* @see Environment#isExternalStorageEmulated(File)
*/
diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java
index fd5a22a9c551..9880142380c0 100644
--- a/core/java/android/os/storage/StorageVolume.java
+++ b/core/java/android/os/storage/StorageVolume.java
@@ -17,6 +17,7 @@
package android.os.storage;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
@@ -162,6 +163,7 @@ public final class StorageVolume implements Parcelable {
* @return the mount path
* @hide
*/
+ @TestApi
public String getPath() {
return mPath.toString();
}
diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java
index 8d4c3c3d3e68..8c7750242ef3 100644
--- a/core/java/android/os/storage/VolumeInfo.java
+++ b/core/java/android/os/storage/VolumeInfo.java
@@ -312,7 +312,9 @@ public class VolumeInfo implements Parcelable {
* {@link android.Manifest.permission#WRITE_MEDIA_STORAGE}.
*/
public File getInternalPathForUser(int userId) {
- if (type == TYPE_PUBLIC) {
+ if (path == null) {
+ return null;
+ } else if (type == TYPE_PUBLIC) {
// TODO: plumb through cleaner path from vold
return new File(path.replace("/storage/", "/mnt/media_rw/"));
} else {
diff --git a/core/java/android/os/strictmode/CredentialProtectedWhileLockedViolation.java b/core/java/android/os/strictmode/CredentialProtectedWhileLockedViolation.java
new file mode 100644
index 000000000000..12503f650ab5
--- /dev/null
+++ b/core/java/android/os/strictmode/CredentialProtectedWhileLockedViolation.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os.strictmode;
+
+import android.content.Context;
+
+/**
+ * Subclass of {@code Violation} that is used when a process accesses filesystem
+ * paths stored in credential protected storage areas while the user is locked.
+ * <p>
+ * When a user is locked, credential protected storage is unavailable, and files
+ * stored in these locations appear to not exist, which can result in subtle app
+ * bugs if they assume default behaviors or empty states. Instead, apps should
+ * store data needed while a user is locked under device protected storage
+ * areas.
+ *
+ * @see Context#createCredentialProtectedStorageContext()
+ * @see Context#createDeviceProtectedStorageContext()
+ */
+public final class CredentialProtectedWhileLockedViolation extends Violation {
+ /** @hide */
+ public CredentialProtectedWhileLockedViolation(String message) {
+ super(message);
+ }
+}
diff --git a/core/java/android/os/strictmode/ExplicitGcViolation.java b/core/java/android/os/strictmode/ExplicitGcViolation.java
new file mode 100644
index 000000000000..583ed1ab4505
--- /dev/null
+++ b/core/java/android/os/strictmode/ExplicitGcViolation.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.os.strictmode;
+
+import android.annotation.TestApi;
+
+/**
+ * See #{@link android.os.StrictMode.ThreadPolicy.Builder#detectExplicitGc()}.
+ *
+ * @hide
+ */
+@TestApi
+public final class ExplicitGcViolation extends Violation {
+ /** @hide */
+ public ExplicitGcViolation() {
+ super(null);
+ }
+}
diff --git a/core/java/android/os/strictmode/ImplicitDirectBootViolation.java b/core/java/android/os/strictmode/ImplicitDirectBootViolation.java
new file mode 100644
index 000000000000..e52e21234a8c
--- /dev/null
+++ b/core/java/android/os/strictmode/ImplicitDirectBootViolation.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os.strictmode;
+
+import android.content.pm.PackageManager;
+
+/**
+ * Subclass of {@code Violation} that is used when a process implicitly relies
+ * on automatic Direct Boot filtering.
+ *
+ * @see PackageManager#MATCH_DIRECT_BOOT_AUTO
+ */
+public final class ImplicitDirectBootViolation extends Violation {
+ /** @hide */
+ public ImplicitDirectBootViolation() {
+ super("Implicitly relying on automatic Direct Boot filtering; request explicit"
+ + " filtering with PackageManager.MATCH_DIRECT_BOOT flags");
+ }
+}
diff --git a/core/java/android/os/strictmode/UntaggedSocketViolation.java b/core/java/android/os/strictmode/UntaggedSocketViolation.java
index 836a8b9dc633..3b1ef253b2d2 100644
--- a/core/java/android/os/strictmode/UntaggedSocketViolation.java
+++ b/core/java/android/os/strictmode/UntaggedSocketViolation.java
@@ -17,12 +17,8 @@ package android.os.strictmode;
public final class UntaggedSocketViolation extends Violation {
/** @hide */
- public static final String MESSAGE =
- "Untagged socket detected; use"
- + " TrafficStats.setThreadSocketTag() to track all network usage";
-
- /** @hide */
public UntaggedSocketViolation() {
- super(MESSAGE);
+ super("Untagged socket detected; use TrafficStats.setThreadSocketTag() to "
+ + "track all network usage");
}
}
diff --git a/core/java/android/preference/DialogPreference.java b/core/java/android/preference/DialogPreference.java
index 3d57b4db2598..ed29f74ef8b0 100644
--- a/core/java/android/preference/DialogPreference.java
+++ b/core/java/android/preference/DialogPreference.java
@@ -42,7 +42,7 @@ import android.widget.TextView;
* A base class for {@link Preference} objects that are
* dialog-based. These preferences will, when clicked, open a dialog showing the
* actual preference controls.
- *
+ *
* @attr ref android.R.styleable#DialogPreference_dialogTitle
* @attr ref android.R.styleable#DialogPreference_dialogMessage
* @attr ref android.R.styleable#DialogPreference_dialogIcon
@@ -54,7 +54,7 @@ public abstract class DialogPreference extends Preference implements
DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
PreferenceManager.OnActivityDestroyListener {
private AlertDialog.Builder mBuilder;
-
+
private CharSequence mDialogTitle;
private CharSequence mDialogMessage;
private Drawable mDialogIcon;
@@ -68,6 +68,14 @@ public abstract class DialogPreference extends Preference implements
/** Which button was clicked. */
private int mWhichButtonClicked;
+ /** Dismiss the dialog on the UI thread, but not inline with handlers */
+ private final Runnable mDismissRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mDialog.dismiss();
+ }
+ };
+
public DialogPreference(
Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
@@ -103,7 +111,7 @@ public abstract class DialogPreference extends Preference implements
/**
* Sets the title of the dialog. This will be shown on subsequent dialogs.
- *
+ *
* @param dialogTitle The title.
*/
public void setDialogTitle(CharSequence dialogTitle) {
@@ -117,7 +125,7 @@ public abstract class DialogPreference extends Preference implements
public void setDialogTitle(int dialogTitleResId) {
setDialogTitle(getContext().getString(dialogTitleResId));
}
-
+
/**
* Returns the title to be shown on subsequent dialogs.
* @return The title.
@@ -125,7 +133,7 @@ public abstract class DialogPreference extends Preference implements
public CharSequence getDialogTitle() {
return mDialogTitle;
}
-
+
/**
* Sets the message of the dialog. This will be shown on subsequent dialogs.
* <p>
@@ -133,7 +141,7 @@ public abstract class DialogPreference extends Preference implements
* list-based dialogs, for example. If setting a custom View on a dialog via
* {@link #setDialogLayoutResource(int)}, include a text View with ID
* {@link android.R.id#message} and it will be populated with this message.
- *
+ *
* @param dialogMessage The message.
*/
public void setDialogMessage(CharSequence dialogMessage) {
@@ -147,7 +155,7 @@ public abstract class DialogPreference extends Preference implements
public void setDialogMessage(int dialogMessageResId) {
setDialogMessage(getContext().getString(dialogMessageResId));
}
-
+
/**
* Returns the message to be shown on subsequent dialogs.
* @return The message.
@@ -155,26 +163,26 @@ public abstract class DialogPreference extends Preference implements
public CharSequence getDialogMessage() {
return mDialogMessage;
}
-
+
/**
* Sets the icon of the dialog. This will be shown on subsequent dialogs.
- *
+ *
* @param dialogIcon The icon, as a {@link Drawable}.
*/
public void setDialogIcon(Drawable dialogIcon) {
mDialogIcon = dialogIcon;
}
-
+
/**
* Sets the icon (resource ID) of the dialog. This will be shown on
* subsequent dialogs.
- *
+ *
* @param dialogIconRes The icon, as a resource ID.
*/
public void setDialogIcon(@DrawableRes int dialogIconRes) {
mDialogIcon = getContext().getDrawable(dialogIconRes);
}
-
+
/**
* Returns the icon to be shown on subsequent dialogs.
* @return The icon, as a {@link Drawable}.
@@ -182,11 +190,11 @@ public abstract class DialogPreference extends Preference implements
public Drawable getDialogIcon() {
return mDialogIcon;
}
-
+
/**
* Sets the text of the positive button of the dialog. This will be shown on
* subsequent dialogs.
- *
+ *
* @param positiveButtonText The text of the positive button.
*/
public void setPositiveButtonText(CharSequence positiveButtonText) {
@@ -200,27 +208,27 @@ public abstract class DialogPreference extends Preference implements
public void setPositiveButtonText(@StringRes int positiveButtonTextResId) {
setPositiveButtonText(getContext().getString(positiveButtonTextResId));
}
-
+
/**
* Returns the text of the positive button to be shown on subsequent
* dialogs.
- *
+ *
* @return The text of the positive button.
*/
public CharSequence getPositiveButtonText() {
return mPositiveButtonText;
}
-
+
/**
* Sets the text of the negative button of the dialog. This will be shown on
* subsequent dialogs.
- *
+ *
* @param negativeButtonText The text of the negative button.
*/
public void setNegativeButtonText(CharSequence negativeButtonText) {
mNegativeButtonText = negativeButtonText;
}
-
+
/**
* @see #setNegativeButtonText(CharSequence)
* @param negativeButtonTextResId The negative button text as a resource.
@@ -228,38 +236,38 @@ public abstract class DialogPreference extends Preference implements
public void setNegativeButtonText(@StringRes int negativeButtonTextResId) {
setNegativeButtonText(getContext().getString(negativeButtonTextResId));
}
-
+
/**
* Returns the text of the negative button to be shown on subsequent
* dialogs.
- *
+ *
* @return The text of the negative button.
*/
public CharSequence getNegativeButtonText() {
return mNegativeButtonText;
}
-
+
/**
* Sets the layout resource that is inflated as the {@link View} to be shown
* as the content View of subsequent dialogs.
- *
+ *
* @param dialogLayoutResId The layout resource ID to be inflated.
* @see #setDialogMessage(CharSequence)
*/
public void setDialogLayoutResource(int dialogLayoutResId) {
mDialogLayoutResId = dialogLayoutResId;
}
-
+
/**
* Returns the layout resource that is used as the content View for
* subsequent dialogs.
- *
+ *
* @return The layout resource.
*/
public int getDialogLayoutResource() {
return mDialogLayoutResId;
}
-
+
/**
* Prepares the dialog builder to be shown when the preference is clicked.
* Use this to set custom properties on the dialog.
@@ -269,7 +277,7 @@ public abstract class DialogPreference extends Preference implements
*/
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
}
-
+
@Override
protected void onClick() {
if (mDialog != null && mDialog.isShowing()) return;
@@ -281,14 +289,14 @@ public abstract class DialogPreference extends Preference implements
* Shows the dialog associated with this Preference. This is normally initiated
* automatically on clicking on the preference. Call this method if you need to
* show the dialog on some other event.
- *
+ *
* @param state Optional instance state to restore on the dialog
*/
protected void showDialog(Bundle state) {
Context context = getContext();
mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE;
-
+
mBuilder = new AlertDialog.Builder(context)
.setTitle(mDialogTitle)
.setIcon(mDialogIcon)
@@ -302,11 +310,11 @@ public abstract class DialogPreference extends Preference implements
} else {
mBuilder.setMessage(mDialogMessage);
}
-
+
onPrepareDialogBuilder(mBuilder);
-
+
getPreferenceManager().registerOnActivityDestroyListener(this);
-
+
// Create the dialog
final Dialog dialog = mDialog = mBuilder.create();
if (state != null) {
@@ -315,10 +323,29 @@ public abstract class DialogPreference extends Preference implements
if (needInputMethod()) {
requestInputMethod(dialog);
}
+ dialog.setOnShowListener(new DialogInterface.OnShowListener() {
+ @Override
+ public void onShow(DialogInterface dialog) {
+ removeDismissCallbacks();
+ }
+ });
dialog.setOnDismissListener(this);
dialog.show();
}
+ void postDismiss() {
+ removeDismissCallbacks();
+ View decorView = mDialog.getWindow().getDecorView();
+ decorView.post(mDismissRunnable);
+ }
+
+ private void removeDismissCallbacks() {
+ if (mDialog != null && mDialog.getWindow() != null
+ && mDialog.getWindow().getDecorView() != null) {
+ mDialog.getWindow().getDecorView().removeCallbacks(mDismissRunnable);
+ }
+ }
+
/**
* Returns whether the preference needs to display a soft input method when the dialog
* is displayed. Default is false. Subclasses should override this method if they need
@@ -341,7 +368,7 @@ public abstract class DialogPreference extends Preference implements
* Creates the content view for the dialog (if a custom content view is
* required). By default, it inflates the dialog layout resource if it is
* set.
- *
+ *
* @return The content View for the dialog.
* @see #setLayoutResource(int)
*/
@@ -349,48 +376,49 @@ public abstract class DialogPreference extends Preference implements
if (mDialogLayoutResId == 0) {
return null;
}
-
+
LayoutInflater inflater = LayoutInflater.from(mBuilder.getContext());
return inflater.inflate(mDialogLayoutResId, null);
}
-
+
/**
* Binds views in the content View of the dialog to data.
* <p>
* Make sure to call through to the superclass implementation.
- *
+ *
* @param view The content View of the dialog, if it is custom.
*/
@CallSuper
protected void onBindDialogView(View view) {
View dialogMessageView = view.findViewById(com.android.internal.R.id.message);
-
+
if (dialogMessageView != null) {
final CharSequence message = getDialogMessage();
int newVisibility = View.GONE;
-
+
if (!TextUtils.isEmpty(message)) {
if (dialogMessageView instanceof TextView) {
((TextView) dialogMessageView).setText(message);
}
-
+
newVisibility = View.VISIBLE;
}
-
+
if (dialogMessageView.getVisibility() != newVisibility) {
dialogMessageView.setVisibility(newVisibility);
}
}
}
-
+
public void onClick(DialogInterface dialog, int which) {
mWhichButtonClicked = which;
}
-
+
+ @Override
public void onDismiss(DialogInterface dialog) {
-
+ removeDismissCallbacks();
getPreferenceManager().unregisterOnActivityDestroyListener(this);
-
+
mDialog = null;
onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE);
}
@@ -398,7 +426,7 @@ public abstract class DialogPreference extends Preference implements
/**
* Called when the dialog is dismissed and should be used to save data to
* the {@link SharedPreferences}.
- *
+ *
* @param positiveResult Whether the positive button was clicked (true), or
* the negative button was clicked or the dialog was canceled (false).
*/
@@ -407,7 +435,7 @@ public abstract class DialogPreference extends Preference implements
/**
* Gets the dialog that is shown by this preference.
- *
+ *
* @return The dialog, or null if a dialog is not being shown.
*/
public Dialog getDialog() {
@@ -418,11 +446,11 @@ public abstract class DialogPreference extends Preference implements
* {@inheritDoc}
*/
public void onActivityDestroy() {
-
+
if (mDialog == null || !mDialog.isShowing()) {
return;
}
-
+
mDialog.dismiss();
}
@@ -457,7 +485,7 @@ public abstract class DialogPreference extends Preference implements
private static class SavedState extends BaseSavedState {
boolean isDialogShowing;
Bundle dialogBundle;
-
+
public SavedState(Parcel source) {
super(source);
isDialogShowing = source.readInt() == 1;
@@ -486,5 +514,5 @@ public abstract class DialogPreference extends Preference implements
}
};
}
-
+
}
diff --git a/core/java/android/preference/ListPreference.java b/core/java/android/preference/ListPreference.java
index 27003734c2bb..f9323ed90c24 100644
--- a/core/java/android/preference/ListPreference.java
+++ b/core/java/android/preference/ListPreference.java
@@ -32,7 +32,7 @@ import android.util.AttributeSet;
* <p>
* This preference will store a string into the SharedPreferences. This string will be the value
* from the {@link #setEntryValues(CharSequence[])} array.
- *
+ *
* @attr ref android.R.styleable#ListPreference_entries
* @attr ref android.R.styleable#ListPreference_entryValues
*/
@@ -191,7 +191,7 @@ public class ListPreference extends DialogPreference {
/**
* Sets the value to the given index from the entry values.
- *
+ *
* @param index The index of the value to set.
*/
public void setValueIndex(int index) {
@@ -199,30 +199,30 @@ public class ListPreference extends DialogPreference {
setValue(mEntryValues[index].toString());
}
}
-
+
/**
* Returns the value of the key. This should be one of the entries in
* {@link #getEntryValues()}.
- *
+ *
* @return The value of the key.
*/
public String getValue() {
- return mValue;
+ return mValue;
}
-
+
/**
* Returns the entry corresponding to the current value.
- *
+ *
* @return The entry corresponding to the current value, or null.
*/
public CharSequence getEntry() {
int index = getValueIndex();
return index >= 0 && mEntries != null ? mEntries[index] : null;
}
-
+
/**
* Returns the index of the given value (in the entry values array).
- *
+ *
* @param value The value whose index should be returned.
* @return The index of the value, or -1 if not found.
*/
@@ -236,22 +236,22 @@ public class ListPreference extends DialogPreference {
}
return -1;
}
-
+
private int getValueIndex() {
return findIndexOfValue(mValue);
}
-
+
@Override
protected void onPrepareDialogBuilder(Builder builder) {
super.onPrepareDialogBuilder(builder);
-
+
if (mEntries == null || mEntryValues == null) {
throw new IllegalStateException(
"ListPreference requires an entries array and an entryValues array.");
}
mClickedDialogEntryIndex = getValueIndex();
- builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
+ builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mClickedDialogEntryIndex = which;
@@ -261,10 +261,10 @@ public class ListPreference extends DialogPreference {
* click, and dismisses the dialog.
*/
ListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
- dialog.dismiss();
+ postDismiss();
}
});
-
+
/*
* The typical interaction for list-based dialogs is to have
* click-on-an-item dismiss the dialog instead of the user having to
@@ -276,7 +276,7 @@ public class ListPreference extends DialogPreference {
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
-
+
if (positiveResult && mClickedDialogEntryIndex >= 0 && mEntryValues != null) {
String value = mEntryValues[mClickedDialogEntryIndex].toString();
if (callChangeListener(value)) {
@@ -294,7 +294,7 @@ public class ListPreference extends DialogPreference {
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue);
}
-
+
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
@@ -302,7 +302,7 @@ public class ListPreference extends DialogPreference {
// No need to save instance state since it's persistent
return superState;
}
-
+
final SavedState myState = new SavedState(superState);
myState.value = getValue();
return myState;
@@ -315,15 +315,15 @@ public class ListPreference extends DialogPreference {
super.onRestoreInstanceState(state);
return;
}
-
+
SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
setValue(myState.value);
}
-
+
private static class SavedState extends BaseSavedState {
String value;
-
+
public SavedState(Parcel source) {
super(source);
value = source.readString();
@@ -350,5 +350,5 @@ public class ListPreference extends DialogPreference {
}
};
}
-
+
}
diff --git a/core/java/android/preference/PreferenceManager.java b/core/java/android/preference/PreferenceManager.java
index ea32dfd7f919..6095e6f8800c 100644
--- a/core/java/android/preference/PreferenceManager.java
+++ b/core/java/android/preference/PreferenceManager.java
@@ -531,7 +531,6 @@ public class PreferenceManager {
* Returns the name used for storing default shared preferences.
*
* @see #getDefaultSharedPreferences(Context)
- * @see Context#getSharedPreferencesPath(String)
*/
public static String getDefaultSharedPreferencesName(Context context) {
return context.getPackageName() + "_preferences";
diff --git a/core/java/android/print/PrintFileDocumentAdapter.java b/core/java/android/print/PrintFileDocumentAdapter.java
index a5f93050e307..eb4b31510880 100644
--- a/core/java/android/print/PrintFileDocumentAdapter.java
+++ b/core/java/android/print/PrintFileDocumentAdapter.java
@@ -118,7 +118,7 @@ public class PrintFileDocumentAdapter extends PrintDocumentAdapter {
protected Void doInBackground(Void... params) {
try (InputStream in = new FileInputStream(mFile);
OutputStream out = new FileOutputStream(mDestination.getFileDescriptor())) {
- FileUtils.copy(in, out, null, mCancellationSignal);
+ FileUtils.copy(in, out, mCancellationSignal, null, null);
} catch (OperationCanceledException e) {
// Ignored; already handled below
} catch (IOException e) {
diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java
index 85fdd642095c..138477e991e0 100644
--- a/core/java/android/print/PrintJobInfo.java
+++ b/core/java/android/print/PrintJobInfo.java
@@ -587,6 +587,15 @@ public final class PrintJobInfo implements Parcelable {
}
/**
+ * If the print job is actively processed, i.e. the device needs to stay on.
+ *
+ * @hide
+ */
+ public boolean shouldStayAwake() {
+ return mCanceling || mState == STATE_STARTED || mState == STATE_QUEUED;
+ }
+
+ /**
* Gets whether this job has a given advanced (printer specific) print
* option.
*
diff --git a/core/java/android/printservice/recommendation/RecommendationService.java b/core/java/android/printservice/recommendation/RecommendationService.java
index 733629aa3564..968a62585d8e 100644
--- a/core/java/android/printservice/recommendation/RecommendationService.java
+++ b/core/java/android/printservice/recommendation/RecommendationService.java
@@ -119,14 +119,16 @@ public abstract class RecommendationService extends Service {
mCallbacks = null;
break;
case MSG_UPDATE:
- // Note that there might be a connection change in progress. In this case the
- // message is handled as before the change. This is acceptable as the caller of
- // the connection change has not guarantee when the connection change binder
- // transaction is actually processed.
- try {
- mCallbacks.onRecommendationsUpdated((List<RecommendationInfo>) msg.obj);
- } catch (RemoteException | NullPointerException e) {
- Log.e(LOG_TAG, "Could not update recommended services", e);
+ if (mCallbacks != null) {
+ // Note that there might be a connection change in progress. In this case
+ // the message is handled as before the change. This is acceptable as the
+ // caller of the connection change has not guarantee when the connection
+ // change binder transaction is actually processed.
+ try {
+ mCallbacks.onRecommendationsUpdated((List<RecommendationInfo>) msg.obj);
+ } catch (RemoteException | NullPointerException e) {
+ Log.e(LOG_TAG, "Could not update recommended services", e);
+ }
}
break;
}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index f45a3d2194ec..949badd3ad8a 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -20,6 +20,7 @@ import android.accounts.Account;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -5057,6 +5058,7 @@ public final class ContactsContract {
*
* @hide
*/
+ @TestApi
public static final Uri CORP_CONTENT_URI =
Uri.withAppendedPath(AUTHORITY_URI, "raw_contact_entities_corp");
@@ -6064,6 +6066,7 @@ public final class ContactsContract {
*
* @hide
*/
+ @TestApi
public static final Uri ENTERPRISE_CONTENT_URI =
Uri.withAppendedPath(Data.ENTERPRISE_CONTENT_URI, "phones");
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index d96316a8e2d6..f97c64c96a7a 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -100,7 +100,8 @@ public final class DocumentsContract {
public static final String PROVIDER_INTERFACE = "android.content.action.DOCUMENTS_PROVIDER";
/** {@hide} */
- public static final String EXTRA_PACKAGE_NAME = "android.content.extra.PACKAGE_NAME";
+ @Deprecated
+ public static final String EXTRA_PACKAGE_NAME = Intent.EXTRA_PACKAGE_NAME;
/** {@hide} */
public static final String EXTRA_SHOW_ADVANCED = "android.content.extra.SHOW_ADVANCED";
@@ -157,8 +158,6 @@ public final class DocumentsContract {
* <li>When supplying information in {@link DocumentsProvider#queryChildDocuments}, include
* {@link Document#FLAG_SUPPORTS_SETTINGS} in the flags for each document that supports
* settings.
- *
- * @see DocumentsContact#Document#FLAG_SUPPORTS_SETTINGS
*/
public static final String
ACTION_DOCUMENT_SETTINGS = "android.provider.action.DOCUMENT_SETTINGS";
@@ -434,7 +433,7 @@ public final class DocumentsContract {
* Flag indicating that a Web link can be obtained for the document.
*
* @see #COLUMN_FLAGS
- * @see DocumentsContract#createWebLinkIntent(PackageManager, Uri, Bundle)
+ * @see DocumentsProvider#createWebLinkIntent(String, Bundle)
*/
public static final int FLAG_WEB_LINKABLE = 1 << 12;
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 1da6602d6983..4b45e32d2dc5 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -203,7 +203,7 @@ public final class MediaStore {
/**
* The name of the Intent-extra used to control the orientation of a ViewImage or a MovieView.
* This is an int property that overrides the activity's requestedOrientation.
- * @see android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
+ * @see android.content.pm.ActivityInfo#SCREEN_ORIENTATION_UNSPECIFIED
*/
public static final String EXTRA_SCREEN_ORIENTATION = "android.intent.extra.screenOrientation";
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e4c4af225c09..2609abb4aeed 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3767,6 +3767,14 @@ public final class Settings {
public static final Validator VIBRATE_WHEN_RINGING_VALIDATOR = BOOLEAN_VALIDATOR;
/**
+ * When {@code 1}, Telecom enhanced call blocking functionality is enabled. When
+ * {@code 0}, enhanced call blocking functionality is disabled.
+ * @hide
+ */
+ public static final String DEBUG_ENABLE_ENHANCED_CALL_BLOCKING =
+ "debug.enable_enhanced_calling";
+
+ /**
* Whether the audible DTMF tones are played by the dialer when dialing. The value is
* boolean (1 or 0).
*/
@@ -4154,7 +4162,9 @@ public final class Settings {
SHOW_BATTERY_PERCENT,
NOTIFICATION_VIBRATION_INTENSITY,
HAPTIC_FEEDBACK_INTENSITY,
- DISPLAY_COLOR_MODE
+ DISPLAY_COLOR_MODE,
+ ALARM_ALERT,
+ NOTIFICATION_LIGHT_PULSE,
};
/**
@@ -4357,6 +4367,7 @@ public final class Settings {
VALIDATORS.put(WIFI_STATIC_DNS1, WIFI_STATIC_DNS1_VALIDATOR);
VALIDATORS.put(WIFI_STATIC_DNS2, WIFI_STATIC_DNS2_VALIDATOR);
VALIDATORS.put(SHOW_BATTERY_PERCENT, SHOW_BATTERY_PERCENT_VALIDATOR);
+ VALIDATORS.put(NOTIFICATION_LIGHT_PULSE, BOOLEAN_VALIDATOR);
}
/**
@@ -5372,7 +5383,7 @@ public final class Settings {
*
* For more information about how the platform handles {@code ANDROID_ID}
* in Android 8.0 (API level 26) and higher, see <a
- * href="{@docRoot}preview/behavior-changes.html#privacy-all">
+ * href="{@docRoot}about/versions/oreo/android-8.0-changes.html#privacy-all">
* Android 8.0 Behavior Changes</a>.
*
* <p class="note"><strong>Note:</strong> For apps that were installed
@@ -6016,7 +6027,7 @@ public final class Settings {
new SettingsValidators.ComponentNameListValidator(":");
/**
- * Whether the hush gesture has ever been used // TODO: beverlyt
+ * Whether the hush gesture has ever been used
* @hide
*/
public static final String HUSH_GESTURE_USED = "hush_gesture_used";
@@ -6033,6 +6044,15 @@ public final class Settings {
NON_NEGATIVE_INTEGER_VALIDATOR;
/**
+ * Whether the in call notification is enabled to play sound during calls. The value is
+ * boolean (1 or 0).
+ * @hide
+ */
+ public static final String IN_CALL_NOTIFICATION_ENABLED = "in_call_notification_enabled";
+
+ private static final Validator IN_CALL_NOTIFICATION_ENABLED_VALIDATOR = BOOLEAN_VALIDATOR;
+
+ /**
* Uri of the slice that's presented on the keyguard.
* Defaults to a slice with the date and next alarm.
*
@@ -6050,8 +6070,6 @@ public final class Settings {
@Deprecated
public static final String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
- private static final Validator ACCESSIBILITY_SPEAK_PASSWORD_VALIDATOR = BOOLEAN_VALIDATOR;
-
/**
* Whether to draw text with high contrast while in accessibility mode.
*
@@ -6988,20 +7006,16 @@ public final class Settings {
*/
public static final String SELECTED_SPELL_CHECKER = "selected_spell_checker";
- private static final Validator SELECTED_SPELL_CHECKER_VALIDATOR = COMPONENT_NAME_VALIDATOR;
-
/**
- * The {@link ComponentName} string of the selected subtype of the selected spell checker
- * service which is one of the services managed by the text service manager.
+ * {@link android.view.textservice.SpellCheckerSubtype#hashCode()} of the selected subtype
+ * of the selected spell checker service which is one of the services managed by the text
+ * service manager.
*
* @hide
*/
public static final String SELECTED_SPELL_CHECKER_SUBTYPE =
"selected_spell_checker_subtype";
- private static final Validator SELECTED_SPELL_CHECKER_SUBTYPE_VALIDATOR =
- COMPONENT_NAME_VALIDATOR;
-
/**
* Whether spell checker is enabled or not.
*
@@ -7009,8 +7023,6 @@ public final class Settings {
*/
public static final String SPELL_CHECKER_ENABLED = "spell_checker_enabled";
- private static final Validator SPELL_CHECKER_ENABLED_VALIDATOR = BOOLEAN_VALIDATOR;
-
/**
* What happens when the user presses the Power button while in-call
* and the screen is on.<br/>
@@ -7096,6 +7108,8 @@ public final class Settings {
*/
public static final String DOZE_ALWAYS_ON = "doze_always_on";
+ private static final Validator DOZE_ALWAYS_ON_VALIDATOR = BOOLEAN_VALIDATOR;
+
/**
* Whether the device should pulse on pick up gesture.
* @hide
@@ -7127,35 +7141,6 @@ public final class Settings {
public static final String UI_NIGHT_MODE = "ui_night_mode";
/**
- * The current device UI theme mode effect SystemUI and Launcher.<br/>
- * <b>Values:</b><br/>
- * 0 - The mode that theme will controlled by wallpaper color.<br/>
- * 1 - The mode that will always light theme.<br/>
- * 2 - The mode that will always dark theme.<br/>
- *
- * @hide
- */
- public static final String THEME_MODE = "theme_mode";
-
- /**
- * THEME_MODE value for wallpaper mode.
- * @hide
- */
- public static final int THEME_MODE_WALLPAPER = 0;
-
- /**
- * THEME_MODE value for light theme mode.
- * @hide
- */
- public static final int THEME_MODE_LIGHT = 1;
-
- /**
- * THEME_MODE value for dark theme mode.
- * @hide
- */
- public static final int THEME_MODE_DARK = 2;
-
- /**
* Whether screensavers are enabled.
* @hide
*/
@@ -7306,7 +7291,7 @@ public final class Settings {
* see and assist with all of the user's notifications.
*
* @deprecated Use
- * {@link NotificationManager#isNotificationListenerAccessGranted(ComponentName)}.
+ * {@link NotificationManager#isNotificationAssistantAccessGranted(ComponentName)}.
* @hide
*/
@Deprecated
@@ -7322,7 +7307,7 @@ public final class Settings {
*
* @hide
* @deprecated Use
- * {@link NotificationManager#isNotificationAssistantAccessGranted(ComponentName)}.
+ * {@link NotificationManager#isNotificationListenerAccessGranted(ComponentName)}.
*/
@Deprecated
public static final String ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners";
@@ -7446,9 +7431,6 @@ public final class Settings {
*/
public static final String SLEEP_TIMEOUT = "sleep_timeout";
- private static final Validator SLEEP_TIMEOUT_VALIDATOR =
- new SettingsValidators.InclusiveIntegerRangeValidator(-1, Integer.MAX_VALUE);
-
/**
* Controls whether double tap to wake is enabled.
* @hide
@@ -7526,6 +7508,21 @@ public final class Settings {
public static final int CAMERA_LIFT_TRIGGER_ENABLED_DEFAULT = 1;
/**
+ * Whether or not the flashlight (camera torch mode) is available required to turn
+ * on flashlight.
+ *
+ * @hide
+ */
+ public static final String FLASHLIGHT_AVAILABLE = "flashlight_available";
+
+ /**
+ * Whether or not flashlight is enabled.
+ *
+ * @hide
+ */
+ public static final String FLASHLIGHT_ENABLED = "flashlight_enabled";
+
+ /**
* Whether the assist gesture should be enabled.
*
* @hide
@@ -7542,9 +7539,6 @@ public final class Settings {
*/
public static final String ASSIST_GESTURE_SENSITIVITY = "assist_gesture_sensitivity";
- private static final Validator ASSIST_GESTURE_SENSITIVITY_VALIDATOR =
- new SettingsValidators.InclusiveFloatRangeValidator(0.0f, 1.0f);
-
/**
* Whether the assist gesture should silence alerts.
*
@@ -7574,8 +7568,6 @@ public final class Settings {
*/
public static final String ASSIST_GESTURE_SETUP_COMPLETE = "assist_gesture_setup_complete";
- private static final Validator ASSIST_GESTURE_SETUP_COMPLETE_VALIDATOR = BOOLEAN_VALIDATOR;
-
/**
* Control whether Night display is currently activated.
* @hide
@@ -7974,7 +7966,6 @@ public final class Settings {
ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
ACCESSIBILITY_SHORTCUT_ENABLED,
ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN,
- ACCESSIBILITY_SPEAK_PASSWORD,
ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
ACCESSIBILITY_CAPTIONING_PRESET,
ACCESSIBILITY_CAPTIONING_ENABLED,
@@ -7995,14 +7986,10 @@ public final class Settings {
WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, // moved to global
WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, // moved to global
WIFI_NUM_OPEN_NETWORKS_KEPT, // moved to global
- SELECTED_SPELL_CHECKER,
- SELECTED_SPELL_CHECKER_SUBTYPE,
- SPELL_CHECKER_ENABLED,
MOUNT_PLAY_NOTIFICATION_SND,
MOUNT_UMS_AUTOSTART,
MOUNT_UMS_PROMPT,
MOUNT_UMS_NOTIFY_ENABLED,
- SLEEP_TIMEOUT,
DOUBLE_TAP_TO_WAKE,
WAKE_GESTURE_ENABLED,
LONG_PRESS_TIMEOUT,
@@ -8026,13 +8013,12 @@ public final class Settings {
SYSTEM_NAVIGATION_KEYS_ENABLED,
QS_TILES,
DOZE_ENABLED,
+ DOZE_ALWAYS_ON,
DOZE_PULSE_ON_PICK_UP,
DOZE_PULSE_ON_DOUBLE_TAP,
NFC_PAYMENT_DEFAULT_COMPONENT,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
ASSIST_GESTURE_ENABLED,
- ASSIST_GESTURE_SENSITIVITY,
- ASSIST_GESTURE_SETUP_COMPLETE,
ASSIST_GESTURE_SILENCE_ALERTS_ENABLED,
ASSIST_GESTURE_WAKE_ENABLED,
VR_DISPLAY_MODE,
@@ -8047,6 +8033,9 @@ public final class Settings {
VOLUME_HUSH_GESTURE,
MANUAL_RINGER_TOGGLE_COUNT,
HUSH_GESTURE_USED,
+ IN_CALL_NOTIFICATION_ENABLED,
+ LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
+ LOCK_SCREEN_SHOW_NOTIFICATIONS,
WIFI_DISCONNECT_DELAY_DURATION
};
@@ -8091,7 +8080,6 @@ public final class Settings {
ACCESSIBILITY_SHORTCUT_ENABLED_VALIDATOR);
VALIDATORS.put(ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN,
ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN_VALIDATOR);
- VALIDATORS.put(ACCESSIBILITY_SPEAK_PASSWORD, ACCESSIBILITY_SPEAK_PASSWORD_VALIDATOR);
VALIDATORS.put(ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED_VALIDATOR);
VALIDATORS.put(ACCESSIBILITY_CAPTIONING_PRESET,
@@ -8125,15 +8113,10 @@ public final class Settings {
VALIDATORS.put(WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY_VALIDATOR);
VALIDATORS.put(WIFI_NUM_OPEN_NETWORKS_KEPT, WIFI_NUM_OPEN_NETWORKS_KEPT_VALIDATOR);
- VALIDATORS.put(SELECTED_SPELL_CHECKER, SELECTED_SPELL_CHECKER_VALIDATOR);
- VALIDATORS.put(SELECTED_SPELL_CHECKER_SUBTYPE,
- SELECTED_SPELL_CHECKER_SUBTYPE_VALIDATOR);
- VALIDATORS.put(SPELL_CHECKER_ENABLED, SPELL_CHECKER_ENABLED_VALIDATOR);
VALIDATORS.put(MOUNT_PLAY_NOTIFICATION_SND, MOUNT_PLAY_NOTIFICATION_SND_VALIDATOR);
VALIDATORS.put(MOUNT_UMS_AUTOSTART, MOUNT_UMS_AUTOSTART_VALIDATOR);
VALIDATORS.put(MOUNT_UMS_PROMPT, MOUNT_UMS_PROMPT_VALIDATOR);
VALIDATORS.put(MOUNT_UMS_NOTIFY_ENABLED, MOUNT_UMS_NOTIFY_ENABLED_VALIDATOR);
- VALIDATORS.put(SLEEP_TIMEOUT, SLEEP_TIMEOUT_VALIDATOR);
VALIDATORS.put(DOUBLE_TAP_TO_WAKE, DOUBLE_TAP_TO_WAKE_VALIDATOR);
VALIDATORS.put(WAKE_GESTURE_ENABLED, WAKE_GESTURE_ENABLED_VALIDATOR);
VALIDATORS.put(LONG_PRESS_TIMEOUT, LONG_PRESS_TIMEOUT_VALIDATOR);
@@ -8166,14 +8149,13 @@ public final class Settings {
SYSTEM_NAVIGATION_KEYS_ENABLED_VALIDATOR);
VALIDATORS.put(QS_TILES, QS_TILES_VALIDATOR);
VALIDATORS.put(DOZE_ENABLED, DOZE_ENABLED_VALIDATOR);
+ VALIDATORS.put(DOZE_ALWAYS_ON, DOZE_ALWAYS_ON_VALIDATOR);
VALIDATORS.put(DOZE_PULSE_ON_PICK_UP, DOZE_PULSE_ON_PICK_UP_VALIDATOR);
VALIDATORS.put(DOZE_PULSE_ON_DOUBLE_TAP, DOZE_PULSE_ON_DOUBLE_TAP_VALIDATOR);
VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR);
VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR);
VALIDATORS.put(ASSIST_GESTURE_ENABLED, ASSIST_GESTURE_ENABLED_VALIDATOR);
- VALIDATORS.put(ASSIST_GESTURE_SENSITIVITY, ASSIST_GESTURE_SENSITIVITY_VALIDATOR);
- VALIDATORS.put(ASSIST_GESTURE_SETUP_COMPLETE, ASSIST_GESTURE_SETUP_COMPLETE_VALIDATOR);
VALIDATORS.put(ASSIST_GESTURE_SILENCE_ALERTS_ENABLED,
ASSIST_GESTURE_SILENCE_ALERTS_ENABLED_VALIDATOR);
VALIDATORS.put(ASSIST_GESTURE_WAKE_ENABLED, ASSIST_GESTURE_WAKE_ENABLED_VALIDATOR);
@@ -8196,6 +8178,9 @@ public final class Settings {
ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES_VALIDATOR); //legacy restore setting
VALIDATORS.put(HUSH_GESTURE_USED, HUSH_GESTURE_USED_VALIDATOR);
VALIDATORS.put(MANUAL_RINGER_TOGGLE_COUNT, MANUAL_RINGER_TOGGLE_COUNT_VALIDATOR);
+ VALIDATORS.put(IN_CALL_NOTIFICATION_ENABLED, IN_CALL_NOTIFICATION_ENABLED_VALIDATOR);
+ VALIDATORS.put(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(LOCK_SCREEN_SHOW_NOTIFICATIONS, BOOLEAN_VALIDATOR);
VALIDATORS.put(WIFI_DISCONNECT_DELAY_DURATION, WIFI_DISCONNECT_DELAY_DURATION_VALIDATOR);
}
@@ -9023,6 +9008,14 @@ public final class Settings {
"location_background_throttle_package_whitelist";
/**
+ * Maximum staleness allowed for last location when returned to clients with only foreground
+ * location permissions.
+ * @hide
+ */
+ public static final String LOCATION_LAST_LOCATION_MAX_AGE_MILLIS =
+ "location_last_location_max_age_millis";
+
+ /**
* Whether TV will switch to MHL port when a mobile device is plugged in.
* (0 = false, 1 = true)
* @hide
@@ -9423,6 +9416,12 @@ public final class Settings {
public static final String USE_GOOGLE_MAIL = "use_google_mail";
/**
+ * Whether or not switching/creating users is enabled by user.
+ * @hide
+ */
+ public static final String USER_SWITCHER_ENABLED = "user_switcher_enabled";
+
+ /**
* Webview Data reduction proxy key.
* @hide
*/
@@ -9912,6 +9911,39 @@ public final class Settings {
public static final String WIFI_SCORE_PARAMS =
"wifi_score_params";
+ /**
+ * Setting to enable logging WifiIsUnusableEvent in metrics
+ * which gets triggered when wifi becomes unusable.
+ * Disabled by default, and setting it to 1 will enable it.
+ * @hide
+ */
+ public static final String WIFI_IS_UNUSABLE_EVENT_METRICS_ENABLED =
+ "wifi_is_unusable_event_metrics_enabled";
+
+ /**
+ * The minimum number of txBad the framework has to observe
+ * to trigger a wifi data stall.
+ * @hide
+ */
+ public static final String WIFI_DATA_STALL_MIN_TX_BAD =
+ "wifi_data_stall_min_tx_bad";
+
+ /**
+ * The minimum number of txSuccess the framework has to observe
+ * to trigger a wifi data stall when rxSuccess is 0.
+ * @hide
+ */
+ public static final String WIFI_DATA_STALL_MIN_TX_SUCCESS_WITHOUT_RX =
+ "wifi_data_stall_min_tx_success_without_rx";
+
+ /**
+ * Setting to enable logging Wifi LinkSpeedCounts in metrics.
+ * Disabled by default, and setting it to 1 will enable it.
+ * @hide
+ */
+ public static final String WIFI_LINK_SPEED_METRICS_ENABLED =
+ "wifi_link_speed_metrics_enabled";
+
/**
* The maximum number of times we will retry a connection to an access
* point for which we have failed in acquiring an IP address from DHCP.
@@ -10954,6 +10986,8 @@ public final class Settings {
* proc_state_cpu_times_read_delay_ms (long)
* external_stats_collection_rate_limit_ms (long)
* battery_level_collection_delay_ms (long)
+ * max_history_files (int)
+ * max_history_buffer_kb (int)
* </pre>
*
* <p>
@@ -10982,6 +11016,7 @@ public final class Settings {
* @hide
* @see #ADAPTIVE_BATTERY_MANAGEMENT_ENABLED
*/
+ @SystemApi
public static final String APP_STANDBY_ENABLED = "app_standby_enabled";
/**
@@ -11037,6 +11072,15 @@ public final class Settings {
= "user_absent_radios_off_for_small_battery_enabled";
/**
+ * Whether or not to enable the User Absent, Touch Off feature on small battery devices.
+ * Type: int (0 for false, 1 for true)
+ * Default: 0
+ * @hide
+ */
+ public static final String USER_ABSENT_TOUCH_OFF_FOR_SMALL_BATTERY_ENABLED
+ = "user_absent_touch_off_for_small_battery_enabled";
+
+ /**
* Whether or not to turn on Wifi when proxy is disconnected.
* Type: int (0 for false, 1 for true)
* Default: 1
@@ -11053,6 +11097,7 @@ public final class Settings {
*
* <pre>
* enabled (boolean)
+ * disable_home (boolean)
* disable_tilt_to_wake (boolean)
* disable_touch_to_wake (boolean)
* </pre>
@@ -11255,6 +11300,14 @@ public final class Settings {
public static final String EMERGENCY_AFFORDANCE_NEEDED = "emergency_affordance_needed";
/**
+ * Enable faster emergency phone call feature.
+ * The value is a boolean (1 or 0).
+ * @hide
+ */
+ public static final String FASTER_EMERGENCY_PHONE_CALL_ENABLED =
+ "faster_emergency_phone_call_enabled";
+
+ /**
* See RIL_PreferredNetworkType in ril.h
* @hide
*/
@@ -12847,16 +12900,6 @@ public final class Settings {
"zram_enabled";
/**
- * Whether we have enable CPU frequency scaling for this device.
- * For Wear, default is disable.
- *
- * The value is "1" for enable, "0" for disable.
- * @hide
- */
- public static final String CPU_SCALING_ENABLED =
- "cpu_frequency_scaling_enabled";
-
- /**
* Configuration flags for smart replies in notifications.
* This is encoded as a key=value list, separated by commas. Ex:
*
@@ -12943,15 +12986,6 @@ public final class Settings {
"backup_agent_timeout_parameters";
/**
- * Whether we have enabled swapping on this device. For Wear, default is
- * enabled.
- *
- * The value is "1" for enable, "0" for disable.
- * @hide
- */
- public static final String SWAP_ENABLED = "swap_enabled";
-
- /**
* Blacklist of GNSS satellites.
*
* This is a list of integers separated by commas to represent pairs of (constellation,
@@ -12976,6 +13010,21 @@ public final class Settings {
*/
public static final String GNSS_HAL_LOCATION_REQUEST_DURATION_MILLIS =
"gnss_hal_location_request_duration_millis";
+
+ /**
+ * Binder call stats settings.
+ *
+ * The following strings are supported as keys:
+ * <pre>
+ * enabled (boolean)
+ * detailed_tracking (boolean)
+ * upload_data (boolean)
+ * sampling_interval (int)
+ * </pre>
+ *
+ * @hide
+ */
+ public static final String BINDER_CALLS_STATS = "binder_calls_stats";
}
/**
@@ -13180,19 +13229,6 @@ public final class Settings {
}
}
- /**
- * Returns the device ID that we should use when connecting to the mobile gtalk server.
- * This is a string like "android-0x1242", where the hex string is the Android ID obtained
- * from the GoogleLoginService.
- *
- * @param androidId The Android ID for this device.
- * @return The device ID that should be used when connecting to the mobile gtalk server.
- * @hide
- */
- public static String getGTalkDeviceId(long androidId) {
- return "android-" + Long.toHexString(androidId);
- }
-
private static final String[] PM_WRITE_SETTINGS = {
android.Manifest.permission.WRITE_SETTINGS
};
diff --git a/core/java/android/security/net/config/WfaCertificateSource.java b/core/java/android/security/net/config/WfaCertificateSource.java
new file mode 100644
index 000000000000..f212ef8bf447
--- /dev/null
+++ b/core/java/android/security/net/config/WfaCertificateSource.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.net.config;
+
+import java.io.File;
+
+/**
+ * {@link CertificateSource} based on the system WFA CA store.
+ * @hide
+ */
+public final class WfaCertificateSource extends DirectoryCertificateSource {
+ private static class NoPreloadHolder {
+ private static final WfaCertificateSource INSTANCE = new WfaCertificateSource();
+ }
+
+ private WfaCertificateSource() {
+ super(new File(System.getenv("ANDROID_ROOT") + "/etc/security/cacerts_wfa"));
+ }
+
+ public static WfaCertificateSource getInstance() {
+ return NoPreloadHolder.INSTANCE;
+ }
+
+ @Override
+ protected boolean isCertMarkedAsRemoved(String caFile) {
+ return false;
+ }
+}
diff --git a/core/java/android/security/net/config/XmlConfigSource.java b/core/java/android/security/net/config/XmlConfigSource.java
index 02be403ae150..311a8d23b964 100644
--- a/core/java/android/security/net/config/XmlConfigSource.java
+++ b/core/java/android/security/net/config/XmlConfigSource.java
@@ -189,6 +189,8 @@ public class XmlConfigSource implements ConfigSource {
source = SystemCertificateSource.getInstance();
} else if ("user".equals(sourceString)) {
source = UserCertificateSource.getInstance();
+ } else if ("wfa".equals(sourceString)) {
+ source = WfaCertificateSource.getInstance();
} else {
throw new ParserException(parser, "Unknown certificates src. "
+ "Should be one of system|user|@resourceVal");
diff --git a/core/java/android/service/notification/Adjustment.java b/core/java/android/service/notification/Adjustment.java
index 7348cf6848f9..0d94af4bc828 100644
--- a/core/java/android/service/notification/Adjustment.java
+++ b/core/java/android/service/notification/Adjustment.java
@@ -65,6 +65,12 @@ public final class Adjustment implements Parcelable {
public static final String KEY_USER_SENTIMENT = "key_user_sentiment";
/**
+ * Data type: ArrayList of {@link android.app.Notification.Action}.
+ * Used to suggest extra actions for a notification.
+ */
+ public static final String KEY_SMART_ACTIONS = "key_smart_actions";
+
+ /**
* Create a notification adjustment.
*
* @param pkg The package of the notification.
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index a7d70d01b04a..09425a9c5d28 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -1426,6 +1426,7 @@ public abstract class NotificationListenerService extends Service {
private boolean mShowBadge;
private @UserSentiment int mUserSentiment = USER_SENTIMENT_NEUTRAL;
private boolean mHidden;
+ private ArrayList<Notification.Action> mSmartActions;
public Ranking() {}
@@ -1556,6 +1557,13 @@ public abstract class NotificationListenerService extends Service {
}
/**
+ * @hide
+ */
+ public List<Notification.Action> getSmartActions() {
+ return mSmartActions;
+ }
+
+ /**
* Returns whether this notification can be displayed as a badge.
*
* @return true if the notification can be displayed as a badge, false otherwise.
@@ -1583,7 +1591,7 @@ public abstract class NotificationListenerService extends Service {
CharSequence explanation, String overrideGroupKey,
NotificationChannel channel, ArrayList<String> overridePeople,
ArrayList<SnoozeCriterion> snoozeCriteria, boolean showBadge,
- int userSentiment, boolean hidden) {
+ int userSentiment, boolean hidden, ArrayList<Notification.Action> smartActions) {
mKey = key;
mRank = rank;
mIsAmbient = importance < NotificationManager.IMPORTANCE_LOW;
@@ -1599,6 +1607,7 @@ public abstract class NotificationListenerService extends Service {
mShowBadge = showBadge;
mUserSentiment = userSentiment;
mHidden = hidden;
+ mSmartActions = smartActions;
}
/**
@@ -1648,6 +1657,7 @@ public abstract class NotificationListenerService extends Service {
private ArrayMap<String, Boolean> mShowBadge;
private ArrayMap<String, Integer> mUserSentiment;
private ArrayMap<String, Boolean> mHidden;
+ private ArrayMap<String, ArrayList<Notification.Action>> mSmartActions;
private RankingMap(NotificationRankingUpdate rankingUpdate) {
mRankingUpdate = rankingUpdate;
@@ -1676,7 +1686,7 @@ public abstract class NotificationListenerService extends Service {
getVisibilityOverride(key), getSuppressedVisualEffects(key),
getImportance(key), getImportanceExplanation(key), getOverrideGroupKey(key),
getChannel(key), getOverridePeople(key), getSnoozeCriteria(key),
- getShowBadge(key), getUserSentiment(key), getHidden(key));
+ getShowBadge(key), getUserSentiment(key), getHidden(key), getSmartActions(key));
return rank >= 0;
}
@@ -1814,6 +1824,15 @@ public abstract class NotificationListenerService extends Service {
return hidden == null ? false : hidden.booleanValue();
}
+ private ArrayList<Notification.Action> getSmartActions(String key) {
+ synchronized (this) {
+ if (mSmartActions == null) {
+ buildSmartActions();
+ }
+ }
+ return mSmartActions.get(key);
+ }
+
// Locked by 'this'
private void buildRanksLocked() {
String[] orderedKeys = mRankingUpdate.getOrderedKeys();
@@ -1931,6 +1950,15 @@ public abstract class NotificationListenerService extends Service {
}
}
+ // Locked by 'this'
+ private void buildSmartActions() {
+ Bundle smartActions = mRankingUpdate.getSmartActions();
+ mSmartActions = new ArrayMap<>(smartActions.size());
+ for (String key : smartActions.keySet()) {
+ mSmartActions.put(key, smartActions.getParcelableArrayList(key));
+ }
+ }
+
// ----------- Parcelable
@Override
diff --git a/core/java/android/service/notification/NotificationRankingUpdate.java b/core/java/android/service/notification/NotificationRankingUpdate.java
index 00c47ec0ee89..bed221494d4e 100644
--- a/core/java/android/service/notification/NotificationRankingUpdate.java
+++ b/core/java/android/service/notification/NotificationRankingUpdate.java
@@ -37,12 +37,13 @@ public class NotificationRankingUpdate implements Parcelable {
private final Bundle mShowBadge;
private final Bundle mUserSentiment;
private final Bundle mHidden;
+ private final Bundle mSmartActions;
public NotificationRankingUpdate(String[] keys, String[] interceptedKeys,
Bundle visibilityOverrides, Bundle suppressedVisualEffects,
int[] importance, Bundle explanation, Bundle overrideGroupKeys,
Bundle channels, Bundle overridePeople, Bundle snoozeCriteria,
- Bundle showBadge, Bundle userSentiment, Bundle hidden) {
+ Bundle showBadge, Bundle userSentiment, Bundle hidden, Bundle smartActions) {
mKeys = keys;
mInterceptedKeys = interceptedKeys;
mVisibilityOverrides = visibilityOverrides;
@@ -56,6 +57,7 @@ public class NotificationRankingUpdate implements Parcelable {
mShowBadge = showBadge;
mUserSentiment = userSentiment;
mHidden = hidden;
+ mSmartActions = smartActions;
}
public NotificationRankingUpdate(Parcel in) {
@@ -73,6 +75,7 @@ public class NotificationRankingUpdate implements Parcelable {
mShowBadge = in.readBundle();
mUserSentiment = in.readBundle();
mHidden = in.readBundle();
+ mSmartActions = in.readBundle();
}
@Override
@@ -95,6 +98,7 @@ public class NotificationRankingUpdate implements Parcelable {
out.writeBundle(mShowBadge);
out.writeBundle(mUserSentiment);
out.writeBundle(mHidden);
+ out.writeBundle(mSmartActions);
}
public static final Parcelable.Creator<NotificationRankingUpdate> CREATOR
@@ -159,4 +163,8 @@ public class NotificationRankingUpdate implements Parcelable {
public Bundle getHidden() {
return mHidden;
}
+
+ public Bundle getSmartActions() {
+ return mSmartActions;
+ }
}
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 5546e803342b..df88e642a970 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -1007,6 +1007,24 @@ public class ZenModeConfig implements Parcelable {
return true;
}
+ /**
+ * Returns whether the conditionId is a valid ScheduleCondition.
+ * If allowNever is true, this will return true even if the ScheduleCondition never occurs.
+ */
+ public static boolean isValidScheduleConditionId(Uri conditionId, boolean allowNever) {
+ ScheduleInfo info;
+ try {
+ info = tryParseScheduleConditionId(conditionId);
+ } catch (NullPointerException | ArrayIndexOutOfBoundsException e) {
+ return false;
+ }
+
+ if (info == null || (!allowNever && (info.days == null || info.days.length == 0))) {
+ return false;
+ }
+ return true;
+ }
+
public static ScheduleInfo tryParseScheduleConditionId(Uri conditionId) {
final boolean isSchedule = conditionId != null
&& conditionId.getScheme().equals(Condition.SCHEME)
diff --git a/core/java/android/service/restrictions/RestrictionsReceiver.java b/core/java/android/service/restrictions/RestrictionsReceiver.java
index b830cb1f2afa..e8d481a65b31 100644
--- a/core/java/android/service/restrictions/RestrictionsReceiver.java
+++ b/core/java/android/service/restrictions/RestrictionsReceiver.java
@@ -58,7 +58,6 @@ public abstract class RestrictionsReceiver extends BroadcastReceiver {
* @param request the request data bundle containing at a minimum a request id.
*
* @see RestrictionsManager#REQUEST_TYPE_APPROVAL
- * @see RestrictionsManager#REQUEST_TYPE_LOCAL_APPROVAL
* @see RestrictionsManager#REQUEST_KEY_ID
*/
public abstract void onRequestPermission(Context context,
diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java
index cd177c42d6b3..26223f7bc6cd 100644
--- a/core/java/android/service/voice/VoiceInteractionSession.java
+++ b/core/java/android/service/voice/VoiceInteractionSession.java
@@ -109,6 +109,12 @@ public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCall
*/
public static final int SHOW_SOURCE_ACTIVITY = 1<<4;
+ /**
+ * Flag for use with {@link #onShow}: indicates that the voice interaction service was invoked
+ * from a physical button.
+ */
+ public static final int SHOW_SOURCE_PUSH_TO_TALK = 1 << 5;
+
final Context mContext;
final HandlerCaller mHandlerCaller;
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 7f75f0a68660..c48b6d12e948 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -287,7 +287,7 @@ public abstract class WallpaperService extends Service {
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
boolean handled = false;
try {
if (event instanceof MotionEvent
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 01562b328ecc..6f1bd787587b 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -33,7 +33,6 @@ import android.os.Bundle;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
-import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -487,8 +486,9 @@ public class TextToSpeech {
* intent. The possible values for this extra are
* {@link TextToSpeech#SUCCESS} and {@link TextToSpeech#ERROR}.
*
- * @deprecated No longer in use. If client ise interested in information about what
- * changed, is should send ACTION_CHECK_TTS_DATA intent to discover available voices.
+ * @deprecated No longer in use. If client is interested in information about what
+ * changed, it should use the ACTION_CHECK_TTS_DATA
+ * intent to discover available voices.
*/
@Deprecated
public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
diff --git a/core/java/android/text/BoringLayout.java b/core/java/android/text/BoringLayout.java
index ce38ebb9bea7..fc1bfef57227 100644
--- a/core/java/android/text/BoringLayout.java
+++ b/core/java/android/text/BoringLayout.java
@@ -258,7 +258,8 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
*/
TextLine line = TextLine.obtain();
line.set(paint, source, 0, source.length(), Layout.DIR_LEFT_TO_RIGHT,
- Layout.DIRS_ALL_LEFT_TO_RIGHT, false, null);
+ Layout.DIRS_ALL_LEFT_TO_RIGHT, false, null,
+ mEllipsizedStart, mEllipsizedStart + mEllipsizedCount);
mMax = (int) Math.ceil(line.metrics(null));
TextLine.recycle(line);
}
@@ -333,7 +334,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
Spanned sp = (Spanned) text;
Object[] styles = sp.getSpans(0, textLength, ParagraphStyle.class);
if (styles.length > 0) {
- return null; // There are some PargraphStyle spans. Not boring.
+ return null; // There are some ParagraphStyle spans. Not boring.
}
}
@@ -346,7 +347,9 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback
TextLine line = TextLine.obtain();
line.set(paint, text, 0, textLength, Layout.DIR_LEFT_TO_RIGHT,
- Layout.DIRS_ALL_LEFT_TO_RIGHT, false, null);
+ Layout.DIRS_ALL_LEFT_TO_RIGHT, false, null,
+ 0 /* ellipsisStart, 0 since text has not been ellipsized at this point */,
+ 0 /* ellipsisEnd, 0 since text has not been ellipsized at this point */);
fm.width = (int) Math.ceil(line.metrics(fm));
TextLine.recycle(line);
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 09af85db2620..2367d639f764 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -562,7 +562,9 @@ public abstract class Layout {
// XXX: assumes there's nothing additional to be done
canvas.drawText(buf, start, end, x, lbaseline, paint);
} else {
- tl.set(paint, buf, start, end, dir, directions, hasTab, tabStops);
+ tl.set(paint, buf, start, end, dir, directions, hasTab, tabStops,
+ getEllipsisStart(lineNum),
+ getEllipsisStart(lineNum) + getEllipsisCount(lineNum));
if (justify) {
tl.justify(right - left - indentWidth);
}
@@ -1029,8 +1031,10 @@ public abstract class Layout {
*
* @returns true if offset is at the BiDi level transition point and trailing BiDi level is
* higher than previous BiDi level. See above for the detail.
+ * @hide
*/
- private boolean primaryIsTrailingPrevious(int offset) {
+ @VisibleForTesting
+ public boolean primaryIsTrailingPrevious(int offset) {
int line = getLineForOffset(offset);
int lineStart = getLineStart(line);
int lineEnd = getLineEnd(line);
@@ -1084,8 +1088,10 @@ public abstract class Layout {
* #primaryIsTrailingPrevious for all offsets on a line.
* @param line The line giving the offsets we compute the information for
* @return The array of results, indexed from 0, where 0 corresponds to the line start offset
+ * @hide
*/
- private boolean[] primaryIsTrailingPreviousAllLineOffsets(int line) {
+ @VisibleForTesting
+ public boolean[] primaryIsTrailingPreviousAllLineOffsets(int line) {
int lineStart = getLineStart(line);
int lineEnd = getLineEnd(line);
int[] runs = getLineDirections(line).mDirections;
@@ -1180,7 +1186,8 @@ public abstract class Layout {
}
TextLine tl = TextLine.obtain();
- tl.set(mPaint, mText, start, end, dir, directions, hasTab, tabStops);
+ tl.set(mPaint, mText, start, end, dir, directions, hasTab, tabStops,
+ getEllipsisStart(line), getEllipsisStart(line) + getEllipsisCount(line));
float wid = tl.measure(offset - start, trailing, null);
TextLine.recycle(tl);
@@ -1219,7 +1226,8 @@ public abstract class Layout {
}
TextLine tl = TextLine.obtain();
- tl.set(mPaint, mText, start, end, dir, directions, hasTab, tabStops);
+ tl.set(mPaint, mText, start, end, dir, directions, hasTab, tabStops,
+ getEllipsisStart(line), getEllipsisStart(line) + getEllipsisCount(line));
boolean[] trailings = primaryIsTrailingPreviousAllLineOffsets(line);
if (!primary) {
for (int offset = 0; offset < trailings.length; ++offset) {
@@ -1361,7 +1369,8 @@ public abstract class Layout {
final TextPaint paint = mWorkPaint;
paint.set(mPaint);
paint.setHyphenEdit(getHyphen(line));
- tl.set(paint, mText, start, end, dir, directions, hasTabs, tabStops);
+ tl.set(paint, mText, start, end, dir, directions, hasTabs, tabStops,
+ getEllipsisStart(line), getEllipsisStart(line) + getEllipsisCount(line));
if (isJustificationRequired(line)) {
tl.justify(getJustifyWidth(line));
}
@@ -1389,7 +1398,8 @@ public abstract class Layout {
final TextPaint paint = mWorkPaint;
paint.set(mPaint);
paint.setHyphenEdit(getHyphen(line));
- tl.set(paint, mText, start, end, dir, directions, hasTabs, tabStops);
+ tl.set(paint, mText, start, end, dir, directions, hasTabs, tabStops,
+ getEllipsisStart(line), getEllipsisStart(line) + getEllipsisCount(line));
if (isJustificationRequired(line)) {
tl.justify(getJustifyWidth(line));
}
@@ -1474,7 +1484,8 @@ public abstract class Layout {
TextLine tl = TextLine.obtain();
// XXX: we don't care about tabs as we just use TextLine#getOffsetToLeftRightOf here.
tl.set(mPaint, mText, lineStartOffset, lineEndOffset, getParagraphDirection(line), dirs,
- false, null);
+ false, null,
+ getEllipsisStart(line), getEllipsisStart(line) + getEllipsisCount(line));
final HorizontalMeasurementProvider horizontal =
new HorizontalMeasurementProvider(line, primary);
@@ -1728,7 +1739,8 @@ public abstract class Layout {
TextLine tl = TextLine.obtain();
// XXX: we don't care about tabs
- tl.set(mPaint, mText, lineStart, lineEnd, lineDir, directions, false, null);
+ tl.set(mPaint, mText, lineStart, lineEnd, lineDir, directions, false, null,
+ getEllipsisStart(line), getEllipsisStart(line) + getEllipsisCount(line));
caret = lineStart + tl.getOffsetToLeftRightOf(caret - lineStart, toLeft);
TextLine.recycle(tl);
return caret;
@@ -2110,7 +2122,8 @@ public abstract class Layout {
break;
}
}
- tl.set(paint, text, start, end, dir, directions, hasTabs, tabStops);
+ tl.set(paint, text, start, end, dir, directions, hasTabs, tabStops,
+ 0 /* ellipsisStart */, 0 /* ellipsisEnd */);
return margin + Math.abs(tl.metrics(null));
} finally {
TextLine.recycle(tl);
@@ -2123,12 +2136,13 @@ public abstract class Layout {
/**
* @hide
*/
- /* package */ static class TabStops {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public static class TabStops {
private int[] mStops;
private int mNumStops;
private int mIncrement;
- TabStops(int increment, Object[] spans) {
+ public TabStops(int increment, Object[] spans) {
reset(increment, spans);
}
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java
index 369f357d60d8..027ead30c9ae 100644
--- a/core/java/android/text/PrecomputedText.java
+++ b/core/java/android/text/PrecomputedText.java
@@ -437,7 +437,6 @@ public class PrecomputedText implements Spannable {
public boolean canUseMeasuredResult(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
@NonNull TextDirectionHeuristic textDir, @NonNull TextPaint paint,
@Layout.BreakStrategy int strategy, @Layout.HyphenationFrequency int frequency) {
- final TextPaint mtPaint = mParams.getTextPaint();
return mStart == start
&& mEnd == end
&& mParams.isSameTextMetricsInternal(paint, textDir, strategy, frequency);
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index 0899074174a2..4b78aa2332d5 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -124,8 +124,6 @@ public class StaticLayout extends Layout {
b.mText = null;
b.mLeftIndents = null;
b.mRightIndents = null;
- b.mLeftPaddings = null;
- b.mRightPaddings = null;
sPool.release(b);
}
@@ -135,8 +133,6 @@ public class StaticLayout extends Layout {
mPaint = null;
mLeftIndents = null;
mRightIndents = null;
- mLeftPaddings = null;
- mRightPaddings = null;
}
public Builder setText(CharSequence source) {
@@ -364,28 +360,6 @@ public class StaticLayout extends Layout {
}
/**
- * Set available paddings to draw overhanging text on. Arguments are arrays holding the
- * amount of padding available, one per line, measured in pixels. For lines past the last
- * element in the array, the last element repeats.
- *
- * The individual padding amounts should be non-negative. The result of passing negative
- * paddings is undefined.
- *
- * @param leftPaddings array of amounts of available padding for left margin, in pixels
- * @param rightPaddings array of amounts of available padding for right margin, in pixels
- * @return this builder, useful for chaining
- *
- * @hide
- */
- @NonNull
- public Builder setAvailablePaddings(@Nullable int[] leftPaddings,
- @Nullable int[] rightPaddings) {
- mLeftPaddings = leftPaddings;
- mRightPaddings = rightPaddings;
- return this;
- }
-
- /**
* Set paragraph justification mode. The default value is
* {@link Layout#JUSTIFICATION_MODE_NONE}. If the last line is too short for justification,
* the last line will be displayed with the alignment set by {@link #setAlignment}.
@@ -445,8 +419,6 @@ public class StaticLayout extends Layout {
private int mHyphenationFrequency;
@Nullable private int[] mLeftIndents;
@Nullable private int[] mRightIndents;
- @Nullable private int[] mLeftPaddings;
- @Nullable private int[] mRightPaddings;
private int mJustificationMode;
private boolean mAddLastLineLineSpacing;
@@ -596,8 +568,6 @@ public class StaticLayout extends Layout {
mLeftIndents = b.mLeftIndents;
mRightIndents = b.mRightIndents;
- mLeftPaddings = b.mLeftPaddings;
- mRightPaddings = b.mRightPaddings;
setJustificationMode(b.mJustificationMode);
generate(b, b.mIncludePad, b.mIncludePad);
@@ -649,7 +619,7 @@ public class StaticLayout extends Layout {
b.mBreakStrategy, b.mHyphenationFrequency,
// TODO: Support more justification mode, e.g. letter spacing, stretching.
b.mJustificationMode != Layout.JUSTIFICATION_MODE_NONE,
- indents, mLeftPaddings, mRightPaddings);
+ indents);
PrecomputedText.ParagraphInfo[] paragraphInfo = null;
final Spanned spanned = (source instanceof Spanned) ? (Spanned) source : null;
@@ -1325,15 +1295,15 @@ public class StaticLayout extends Layout {
* @hide
*/
public int getHeight(boolean cap) {
- if (cap && mLineCount >= mMaximumVisibleLineCount && mMaxLineHeight == -1 &&
- Log.isLoggable(TAG, Log.WARN)) {
+ if (cap && mLineCount > mMaximumVisibleLineCount && mMaxLineHeight == -1
+ && Log.isLoggable(TAG, Log.WARN)) {
Log.w(TAG, "maxLineHeight should not be -1. "
+ " maxLines:" + mMaximumVisibleLineCount
+ " lineCount:" + mLineCount);
}
- return cap && mLineCount >= mMaximumVisibleLineCount && mMaxLineHeight != -1 ?
- mMaxLineHeight : super.getHeight();
+ return cap && mLineCount > mMaximumVisibleLineCount && mMaxLineHeight != -1
+ ? mMaxLineHeight : super.getHeight();
}
@FastNative
@@ -1341,9 +1311,7 @@ public class StaticLayout extends Layout {
@BreakStrategy int breakStrategy,
@HyphenationFrequency int hyphenationFrequency,
boolean isJustified,
- @Nullable int[] indents,
- @Nullable int[] leftPaddings,
- @Nullable int[] rightPaddings);
+ @Nullable int[] indents);
@CriticalNative
private static native void nFinish(long nativePtr);
@@ -1442,6 +1410,4 @@ public class StaticLayout extends Layout {
@Nullable private int[] mLeftIndents;
@Nullable private int[] mRightIndents;
- @Nullable private int[] mLeftPaddings;
- @Nullable private int[] mRightPaddings;
}
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index 5bfd3e942934..b1a44ae66eb4 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -62,6 +62,11 @@ public class TextLine {
private Spanned mSpanned;
private PrecomputedText mComputed;
+ // The start and end of a potentially existing ellipsis on this text line.
+ // We use them to filter out replacement and metric affecting spans on ellipsized away chars.
+ private int mEllipsisStart;
+ private int mEllipsisEnd;
+
// Additional width of whitespace for justification. This value is per whitespace, thus
// the line width will increase by mAddedWidth x (number of stretchable whitespaces).
private float mAddedWidth;
@@ -146,11 +151,15 @@ public class TextLine {
* @param dir the paragraph direction of this line
* @param directions the directions information of this line
* @param hasTabs true if the line might contain tabs
- * @param tabStops the tabStops. Can be null.
+ * @param tabStops the tabStops. Can be null
+ * @param ellipsisStart the start of the ellipsis relative to the line
+ * @param ellipsisEnd the end of the ellipsis relative to the line. When there
+ * is no ellipsis, this should be equal to ellipsisStart.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public void set(TextPaint paint, CharSequence text, int start, int limit, int dir,
- Directions directions, boolean hasTabs, TabStops tabStops) {
+ Directions directions, boolean hasTabs, TabStops tabStops,
+ int ellipsisStart, int ellipsisEnd) {
mPaint = paint;
mText = text;
mStart = start;
@@ -196,7 +205,8 @@ public class TextLine {
char[] chars = mChars;
for (int i = start, inext; i < limit; i = inext) {
inext = mReplacementSpanSpanSet.getNextTransition(i, limit);
- if (mReplacementSpanSpanSet.hasSpansIntersecting(i, inext)) {
+ if (mReplacementSpanSpanSet.hasSpansIntersecting(i, inext)
+ && (i - start >= ellipsisEnd || inext - start <= ellipsisStart)) {
// transition into a span
chars[i - start] = '\ufffc';
for (int j = i - start + 1, e = inext - start; j < e; ++j) {
@@ -208,6 +218,9 @@ public class TextLine {
}
mTabs = tabStops;
mAddedWidth = 0;
+
+ mEllipsisStart = ellipsisStart != ellipsisEnd ? ellipsisStart : 0;
+ mEllipsisEnd = ellipsisStart != ellipsisEnd ? ellipsisEnd : 0;
}
/**
@@ -313,7 +326,7 @@ public class TextLine {
* @return the signed offset from the leading margin to the requested
* character edge.
*/
- float measure(int offset, boolean trailing, FontMetricsInt fmi) {
+ public float measure(int offset, boolean trailing, FontMetricsInt fmi) {
int target = trailing ? offset - 1 : offset;
if (target < 0) {
return 0;
@@ -391,7 +404,8 @@ public class TextLine {
* @see #measure(int, boolean, FontMetricsInt)
* @return The measure results for all possible offsets
*/
- float[] measureAllOffsets(boolean[] trailing, FontMetricsInt fmi) {
+ @VisibleForTesting
+ public float[] measureAllOffsets(boolean[] trailing, FontMetricsInt fmi) {
float[] measurement = new float[mLen + 1];
int[] target = new int[mLen + 1];
@@ -916,6 +930,9 @@ public class TextLine {
wp.setColor(previousColor);
}
+ drawTextRun(c, wp, start, end, contextStart, contextEnd, runIsRtl,
+ leftX, y + wp.baselineShift);
+
if (numDecorations != 0) {
for (int i = 0; i < numDecorations; i++) {
final DecorationInfo info = decorations.get(i);
@@ -958,8 +975,6 @@ public class TextLine {
}
}
- drawTextRun(c, wp, start, end, contextStart, contextEnd, runIsRtl,
- leftX, y + wp.baselineShift);
}
return runIsRtl ? -totalWidth : totalWidth;
@@ -1154,11 +1169,15 @@ public class TextLine {
for (int j = 0; j < mMetricAffectingSpanSpanSet.numberOfSpans; j++) {
// Both intervals [spanStarts..spanEnds] and [mStart + i..mStart + mlimit] are NOT
// empty by construction. This special case in getSpans() explains the >= & <= tests
- if ((mMetricAffectingSpanSpanSet.spanStarts[j] >= mStart + mlimit) ||
- (mMetricAffectingSpanSpanSet.spanEnds[j] <= mStart + i)) continue;
+ if ((mMetricAffectingSpanSpanSet.spanStarts[j] >= mStart + mlimit)
+ || (mMetricAffectingSpanSpanSet.spanEnds[j] <= mStart + i)) continue;
+
+ boolean insideEllipsis =
+ mStart + mEllipsisStart <= mMetricAffectingSpanSpanSet.spanStarts[j]
+ && mMetricAffectingSpanSpanSet.spanEnds[j] <= mStart + mEllipsisEnd;
final MetricAffectingSpan span = mMetricAffectingSpanSpanSet.spans[j];
if (span instanceof ReplacementSpan) {
- replacement = (ReplacementSpan)span;
+ replacement = !insideEllipsis ? (ReplacementSpan) span : null;
} else {
// We might have a replacement that uses the draw
// state, otherwise measure state would suffice.
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index af0eebfb80d8..dde4c1d2801f 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -351,8 +351,16 @@ public class TextUtils {
}
/**
- * String.split() returns [''] when the string to be split is empty. This returns []. This does
- * not remove any empty strings from the result. For example split("a,", "," ) returns {"a", ""}.
+ *
+ * This method yields the same result as {@code text.split(expression, -1)} except that if
+ * {@code text.isEmpty()} then this method returns an empty array whereas
+ * {@code "".split(expression, -1)} would have returned an array with a single {@code ""}.
+ *
+ * The {@code -1} means that trailing empty Strings are not removed from the result; for
+ * example split("a,", "," ) returns {"a", ""}. Note that whether a leading zero-width match
+ * can result in a leading {@code ""} depends on whether your app
+ * {@link android.content.pm.ApplicationInfo#targetSdkVersion targets an SDK version}
+ * {@code <= 28}; see {@link Pattern#split(CharSequence, int)}.
*
* @param text the string to split
* @param expression the regular expression to match
@@ -369,8 +377,16 @@ public class TextUtils {
}
/**
- * Splits a string on a pattern. String.split() returns [''] when the string to be
- * split is empty. This returns []. This does not remove any empty strings from the result.
+ * Splits a string on a pattern. This method yields the same result as
+ * {@code pattern.split(text, -1)} except that if {@code text.isEmpty()} then this method
+ * returns an empty array whereas {@code pattern.split("", -1)} would have returned an array
+ * with a single {@code ""}.
+ *
+ * The {@code -1} means that trailing empty Strings are not removed from the result;
+ * Note that whether a leading zero-width match can result in a leading {@code ""} depends
+ * on whether your app {@link android.content.pm.ApplicationInfo#targetSdkVersion targets
+ * an SDK version} {@code <= 28}; see {@link Pattern#split(CharSequence, int)}.
+ *
* @param text the string to split
* @param pattern the regular expression to match
* @return an array of strings. The array will be empty if text is empty
@@ -498,7 +514,7 @@ public class TextUtils {
/** {@hide} */
public static int length(@Nullable String s) {
- return isEmpty(s) ? 0 : s.length();
+ return s != null ? s.length() : 0;
}
/**
@@ -676,7 +692,8 @@ public class TextUtils {
* Flatten a CharSequence and whatever styles can be copied across processes
* into the parcel.
*/
- public static void writeToParcel(CharSequence cs, Parcel p, int parcelableFlags) {
+ public static void writeToParcel(@Nullable CharSequence cs, @NonNull Parcel p,
+ int parcelableFlags) {
if (cs instanceof Spanned) {
p.writeInt(0);
p.writeString(cs.toString());
@@ -2074,6 +2091,25 @@ public class TextUtils {
return (T) text.subSequence(0, size);
}
+ /**
+ * Trims the {@code text} to the first {@code size} characters and adds an ellipsis if the
+ * resulting string is shorter than the input. This will result in an output string which is
+ * longer than {@code size} for most inputs.
+ *
+ * @param size length of the result, should be greater than 0
+ *
+ * @hide
+ */
+ @Nullable
+ public static <T extends CharSequence> T trimToLengthWithEllipsis(@Nullable T text,
+ @IntRange(from = 1) int size) {
+ T trimmed = trimToSize(text, size);
+ if (trimmed.length() < text.length()) {
+ trimmed = (T) (trimmed.toString() + "...");
+ }
+ return trimmed;
+ }
+
private static Object sLock = new Object();
private static char[] sTemp = null;
diff --git a/core/java/android/text/method/TransformationMethod.java b/core/java/android/text/method/TransformationMethod.java
index b542109d0beb..8f3b334abbbd 100644
--- a/core/java/android/text/method/TransformationMethod.java
+++ b/core/java/android/text/method/TransformationMethod.java
@@ -32,6 +32,8 @@ public interface TransformationMethod
* Beware that the returned text must be exactly the same length as
* the source text, and that if the source text is Editable, the returned
* text must mirror it dynamically instead of doing a one-time copy.
+ * The method should not return {@code null} unless {@code source}
+ * is {@code null}.
*/
public CharSequence getTransformation(CharSequence source, View view);
diff --git a/core/java/android/text/style/EasyEditSpan.java b/core/java/android/text/style/EasyEditSpan.java
index 9ee0b074459e..305b330663b7 100644
--- a/core/java/android/text/style/EasyEditSpan.java
+++ b/core/java/android/text/style/EasyEditSpan.java
@@ -39,7 +39,6 @@ public class EasyEditSpan implements ParcelableSpan {
*
* @see #TEXT_DELETED
* @see #TEXT_MODIFIED
- * @see #getPendingIntent()
*/
public static final String EXTRA_TEXT_CHANGED_TYPE =
"android.text.style.EXTRA_TEXT_CHANGED_TYPE";
diff --git a/core/java/android/text/style/LocaleSpan.java b/core/java/android/text/style/LocaleSpan.java
index 479ff0e902b2..a3a4bf8c0291 100644
--- a/core/java/android/text/style/LocaleSpan.java
+++ b/core/java/android/text/style/LocaleSpan.java
@@ -97,7 +97,7 @@ public class LocaleSpan extends MetricAffectingSpan implements ParcelableSpan {
* @return The {@link Locale} for this span. If multiple locales are associated with this
* span, only the first locale is returned. {@code null} if no {@link Locale} is specified.
*
- * @see LocaleList#get()
+ * @see LocaleList#get(int)
* @see #getLocales()
*/
@Nullable
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index d72a48d005a8..f9a1a0d36d30 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -1082,7 +1082,7 @@ public class TtsSpan implements ParcelableSpan {
* Sets the {@link #ARG_UNIT} argument.
* @param unit The unit of the measure.
* @return This instance.
- * @see TtsSpan.ARG_UNIT
+ * @see TtsSpan#ARG_UNIT
*/
public MeasureBuilder setUnit(String unit) {
return setStringArgument(TtsSpan.ARG_UNIT, unit);
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index c905f49569d7..08cbbe628eeb 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -19,7 +19,6 @@ package android.text.util;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.UiThread;
import android.content.Context;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
@@ -30,17 +29,13 @@ import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.text.style.URLSpan;
import android.util.Patterns;
-import android.view.textclassifier.TextClassifier;
-import android.view.textclassifier.TextLinks;
-import android.view.textclassifier.TextLinks.TextLinkSpan;
-import android.view.textclassifier.TextLinksParams;
import android.webkit.WebView;
import android.widget.TextView;
import com.android.i18n.phonenumbers.PhoneNumberMatch;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
import com.android.i18n.phonenumbers.PhoneNumberUtil.Leniency;
-import com.android.internal.util.Preconditions;
+import com.android.internal.annotations.GuardedBy;
import libcore.util.EmptyArray;
@@ -52,11 +47,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Future;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -74,6 +64,10 @@ import java.util.regex.Pattern;
* does not have a URL scheme prefix, the supplied scheme will be prepended to
* create <code>http://example.com</code> when the clickable URL link is
* created.
+ *
+ * @see MatchFilter
+ * @see TransformFilter
+ * @see UrlSpanFactory
*/
public class Linkify {
@@ -229,6 +223,44 @@ public class Linkify {
}
/**
+ * Factory class to create {@link URLSpan}s. While adding spans to a {@link Spannable},
+ * {@link Linkify} will call {@link UrlSpanFactory#create(String)} function to create a
+ * {@link URLSpan}.
+ *
+ * @see #addLinks(Spannable, int, UrlSpanFactory)
+ * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter,
+ * UrlSpanFactory)
+ */
+ public static class UrlSpanFactory {
+ private static final Object sInstanceLock = new Object();
+
+ @GuardedBy("sInstanceLock")
+ private static volatile UrlSpanFactory sInstance = null;
+
+ private static synchronized UrlSpanFactory getInstance() {
+ if (sInstance == null) {
+ synchronized (sInstanceLock) {
+ if (sInstance == null) {
+ sInstance = new UrlSpanFactory();
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ /**
+ * Factory function that will called by {@link Linkify} in order to create a
+ * {@link URLSpan}.
+ *
+ * @param url URL found
+ * @return a URLSpan instance
+ */
+ public URLSpan create(final String url) {
+ return new URLSpan(url);
+ }
+ }
+
+ /**
* Scans the text of the provided Spannable and turns all occurrences
* of the link types indicated in the mask into clickable links.
* If the mask is nonzero, it also removes any existing URLSpans
@@ -239,24 +271,55 @@ public class Linkify {
* @param mask Mask to define which kinds of links will be searched.
*
* @return True if at least one link is found and applied.
+ *
+ * @see #addLinks(Spannable, int, UrlSpanFactory)
*/
public static final boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask) {
- return addLinks(text, mask, null);
+ return addLinks(text, mask, null, null);
}
+ /**
+ * Scans the text of the provided Spannable and turns all occurrences
+ * of the link types indicated in the mask into clickable links.
+ * If the mask is nonzero, it also removes any existing URLSpans
+ * attached to the Spannable, to avoid problems if you call it
+ * repeatedly on the same text.
+ *
+ * @param text Spannable whose text is to be marked-up with links
+ * @param mask mask to define which kinds of links will be searched
+ * @param urlSpanFactory factory class used to create {@link URLSpan}s
+ * @return True if at least one link is found and applied.
+ */
+ public static final boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask,
+ @Nullable UrlSpanFactory urlSpanFactory) {
+ return addLinks(text, mask, null, urlSpanFactory);
+ }
+
+ /**
+ * Scans the text of the provided Spannable and turns all occurrences of the link types
+ * indicated in the mask into clickable links. If the mask is nonzero, it also removes any
+ * existing URLSpans attached to the Spannable, to avoid problems if you call it repeatedly
+ * on the same text.
+ *
+ * @param text Spannable whose text is to be marked-up with links
+ * @param mask mask to define which kinds of links will be searched
+ * @param context Context to be used while identifying phone numbers
+ * @param urlSpanFactory factory class used to create {@link URLSpan}s
+ * @return true if at least one link is found and applied.
+ */
private static boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask,
- @Nullable Context context) {
+ @Nullable Context context, @Nullable UrlSpanFactory urlSpanFactory) {
if (mask == 0) {
return false;
}
- URLSpan[] old = text.getSpans(0, text.length(), URLSpan.class);
+ final URLSpan[] old = text.getSpans(0, text.length(), URLSpan.class);
for (int i = old.length - 1; i >= 0; i--) {
text.removeSpan(old[i]);
}
- ArrayList<LinkSpec> links = new ArrayList<LinkSpec>();
+ final ArrayList<LinkSpec> links = new ArrayList<LinkSpec>();
if ((mask & WEB_URLS) != 0) {
gatherLinks(links, text, Patterns.AUTOLINK_WEB_URL,
@@ -285,7 +348,7 @@ public class Linkify {
}
for (LinkSpec link: links) {
- applyLink(link.url, link.start, link.end, text);
+ applyLink(link.url, link.start, link.end, text, urlSpanFactory);
}
return true;
@@ -301,6 +364,8 @@ public class Linkify {
* @param mask Mask to define which kinds of links will be searched.
*
* @return True if at least one link is found and applied.
+ *
+ * @see #addLinks(Spannable, int, UrlSpanFactory)
*/
public static final boolean addLinks(@NonNull TextView text, @LinkifyMask int mask) {
if (mask == 0) {
@@ -310,7 +375,7 @@ public class Linkify {
final Context context = text.getContext();
final CharSequence t = text.getText();
if (t instanceof Spannable) {
- if (addLinks((Spannable) t, mask, context)) {
+ if (addLinks((Spannable) t, mask, context, null)) {
addLinkMovementMethod(text);
return true;
}
@@ -319,7 +384,7 @@ public class Linkify {
} else {
SpannableString s = SpannableString.valueOf(t);
- if (addLinks(s, mask, context)) {
+ if (addLinks(s, mask, context, null)) {
addLinkMovementMethod(text);
text.setText(s);
@@ -414,6 +479,8 @@ public class Linkify {
* @param pattern Regex pattern to be used for finding links
* @param scheme URL scheme string (eg <code>http://</code>) to be
* prepended to the links that do not start with this scheme.
+ * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter,
+ * UrlSpanFactory)
*/
public static final boolean addLinks(@NonNull Spannable text, @NonNull Pattern pattern,
@Nullable String scheme) {
@@ -434,6 +501,8 @@ public class Linkify {
* @param transformFilter Filter to allow the client code to update the link found.
*
* @return True if at least one link is found and applied.
+ * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter,
+ * UrlSpanFactory)
*/
public static final boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
@Nullable String scheme, @Nullable MatchFilter matchFilter,
@@ -457,10 +526,39 @@ public class Linkify {
* @param transformFilter Filter to allow the client code to update the link found.
*
* @return True if at least one link is found and applied.
+ *
+ * @see #addLinks(Spannable, Pattern, String, String[], MatchFilter, TransformFilter,
+ * UrlSpanFactory)
*/
public static final boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
- @Nullable String defaultScheme, @Nullable String[] schemes,
+ @Nullable String defaultScheme, @Nullable String[] schemes,
@Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter) {
+ return addLinks(spannable, pattern, defaultScheme, schemes, matchFilter, transformFilter,
+ null);
+ }
+
+ /**
+ * Applies a regex to a Spannable turning the matches into links.
+ *
+ * @param spannable spannable whose text is to be marked-up with links.
+ * @param pattern regex pattern to be used for finding links.
+ * @param defaultScheme the default scheme to be prepended to links if the link does not
+ * start with one of the <code>schemes</code> given.
+ * @param schemes array of schemes (eg <code>http://</code>) to check if the link found
+ * contains a scheme. Passing a null or empty value means prepend
+ * defaultScheme
+ * to all links.
+ * @param matchFilter the filter that is used to allow the client code additional control
+ * over which pattern matches are to be converted into links.
+ * @param transformFilter filter to allow the client code to update the link found.
+ * @param urlSpanFactory factory class used to create {@link URLSpan}s
+ *
+ * @return True if at least one link is found and applied.
+ */
+ public static final boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
+ @Nullable String defaultScheme, @Nullable String[] schemes,
+ @Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter,
+ @Nullable UrlSpanFactory urlSpanFactory) {
final String[] schemesCopy;
if (defaultScheme == null) defaultScheme = "";
if (schemes == null || schemes.length < 1) {
@@ -489,7 +587,7 @@ public class Linkify {
if (allowed) {
String url = makeUrl(m.group(0), schemesCopy, m, transformFilter);
- applyLink(url, start, end, spannable);
+ applyLink(url, start, end, spannable, urlSpanFactory);
hasMatches = true;
}
}
@@ -497,239 +595,12 @@ public class Linkify {
return hasMatches;
}
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text (to avoid
- * problems if you call it repeatedly on the same text) and sets the movement method for the
- * TextView to LinkMovementMethod.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * @param textView TextView whose text is to be marked-up with links
- * @param params optional parameters to specify how to generate the links
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- @UiThread
- public static Future<Void> addLinksAsync(
- @NonNull TextView textView,
- @Nullable TextLinksParams params) {
- return addLinksAsync(textView, params, null /* executor */, null /* callback */);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text (to avoid
- * problems if you call it repeatedly on the same text) and sets the movement method for the
- * TextView to LinkMovementMethod.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * @param textView TextView whose text is to be marked-up with links
- * @param mask mask to define which kinds of links will be generated
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- @UiThread
- public static Future<Void> addLinksAsync(
- @NonNull TextView textView,
- @LinkifyMask int mask) {
- return addLinksAsync(textView, TextLinksParams.fromLinkMask(mask),
- null /* executor */, null /* callback */);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text (to avoid
- * problems if you call it repeatedly on the same text) and sets the movement method for the
- * TextView to LinkMovementMethod.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * @param textView TextView whose text is to be marked-up with links
- * @param params optional parameters to specify how to generate the links
- * @param executor Executor that runs the background task
- * @param callback Callback that receives the final status of the background task execution
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- @UiThread
- public static Future<Void> addLinksAsync(
- @NonNull TextView textView,
- @Nullable TextLinksParams params,
- @Nullable Executor executor,
- @Nullable Consumer<Integer> callback) {
- Preconditions.checkNotNull(textView);
- final CharSequence text = textView.getText();
- final Spannable spannable = (text instanceof Spannable)
- ? (Spannable) text : SpannableString.valueOf(text);
- final Runnable modifyTextView = () -> {
- addLinkMovementMethod(textView);
- if (spannable != text) {
- textView.setText(spannable);
- }
- };
- return addLinksAsync(spannable, textView.getTextClassifier(),
- params, executor, callback, modifyTextView);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text to avoid
- * problems if you call it repeatedly on the same text.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * <p><strong>Note:</strong> If the text is currently attached to a TextView, this method
- * should be called on the UI thread.
- *
- * @param text Spannable whose text is to be marked-up with links
- * @param classifier the TextClassifier to use to generate the links
- * @param params optional parameters to specify how to generate the links
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- public static Future<Void> addLinksAsync(
- @NonNull Spannable text,
- @NonNull TextClassifier classifier,
- @Nullable TextLinksParams params) {
- return addLinksAsync(text, classifier, params, null /* executor */, null /* callback */);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by the link {@code mask} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text to avoid
- * problems if you call it repeatedly on the same text.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * <p><strong>Note:</strong> If the text is currently attached to a TextView, this method
- * should be called on the UI thread.
- *
- * @param text Spannable whose text is to be marked-up with links
- * @param classifier the TextClassifier to use to generate the links
- * @param mask mask to define which kinds of links will be generated
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- public static Future<Void> addLinksAsync(
- @NonNull Spannable text,
- @NonNull TextClassifier classifier,
- @LinkifyMask int mask) {
- return addLinksAsync(text, classifier, TextLinksParams.fromLinkMask(mask),
- null /* executor */, null /* callback */);
- }
-
- /**
- * Scans the text of the provided TextView and turns all occurrences of the entity types
- * specified by {@code options} into clickable links. If links are found, this method
- * removes any pre-existing {@link TextLinkSpan} attached to the text to avoid
- * problems if you call it repeatedly on the same text.
- *
- * <p><strong>Note:</strong> This method returns immediately but generates the links with
- * the specified classifier on a background thread. The generated links are applied on the
- * calling thread.
- *
- * <p><strong>Note:</strong> If the text is currently attached to a TextView, this method
- * should be called on the UI thread.
- *
- * @param text Spannable whose text is to be marked-up with links
- * @param classifier the TextClassifier to use to generate the links
- * @param params optional parameters to specify how to generate the links
- * @param executor Executor that runs the background task
- * @param callback Callback that receives the final status of the background task execution
- *
- * @return a future that may be used to interrupt or query the background task
- * @hide
- */
- public static Future<Void> addLinksAsync(
- @NonNull Spannable text,
- @NonNull TextClassifier classifier,
- @Nullable TextLinksParams params,
- @Nullable Executor executor,
- @Nullable Consumer<Integer> callback) {
- return addLinksAsync(text, classifier, params, executor, callback,
- null /* modifyTextView */);
- }
-
- private static Future<Void> addLinksAsync(
- @NonNull Spannable text,
- @NonNull TextClassifier classifier,
- @Nullable TextLinksParams params,
- @Nullable Executor executor,
- @Nullable Consumer<Integer> callback,
- @Nullable Runnable modifyTextView) {
- Preconditions.checkNotNull(text);
- Preconditions.checkNotNull(classifier);
-
- // TODO: This is a bug. We shouldnot call getMaxGenerateLinksTextLength() on the UI thread.
- // The input text may exceed the maximum length the text classifier can handle. In such
- // cases, we process the text up to the maximum length.
- final CharSequence truncatedText = text.subSequence(
- 0, Math.min(text.length(), classifier.getMaxGenerateLinksTextLength()));
-
- final TextClassifier.EntityConfig entityConfig = (params == null)
- ? null : params.getEntityConfig();
- final TextLinks.Request request = new TextLinks.Request.Builder(truncatedText)
- .setLegacyFallback(true)
- .setEntityConfig(entityConfig)
- .build();
- final Supplier<TextLinks> supplier = () -> classifier.generateLinks(request);
- final Consumer<TextLinks> consumer = links -> {
- if (links.getLinks().isEmpty()) {
- if (callback != null) {
- callback.accept(TextLinks.STATUS_NO_LINKS_FOUND);
- }
- return;
- }
-
- // Remove spans only for the part of the text we generated links for.
- final TextLinkSpan[] old =
- text.getSpans(0, truncatedText.length(), TextLinkSpan.class);
- for (int i = old.length - 1; i >= 0; i--) {
- text.removeSpan(old[i]);
- }
-
- final @TextLinks.Status int result = params.apply(text, links);
- if (result == TextLinks.STATUS_LINKS_APPLIED) {
- if (modifyTextView != null) {
- modifyTextView.run();
- }
- }
- if (callback != null) {
- callback.accept(result);
- }
- };
- if (executor == null) {
- return CompletableFuture.supplyAsync(supplier).thenAccept(consumer);
- } else {
- return CompletableFuture.supplyAsync(supplier, executor).thenAccept(consumer);
+ private static void applyLink(String url, int start, int end, Spannable text,
+ @Nullable UrlSpanFactory urlSpanFactory) {
+ if (urlSpanFactory == null) {
+ urlSpanFactory = UrlSpanFactory.getInstance();
}
- }
-
- private static final void applyLink(String url, int start, int end, Spannable text) {
- URLSpan span = new URLSpan(url);
-
+ final URLSpan span = urlSpanFactory.create(url);
text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
diff --git a/core/java/android/transition/Scene.java b/core/java/android/transition/Scene.java
index 4267a658c8f9..15ad7deb4b24 100644
--- a/core/java/android/transition/Scene.java
+++ b/core/java/android/transition/Scene.java
@@ -224,8 +224,7 @@ public final class Scene {
* @param action The runnable whose {@link Runnable#run() run()} method will
* be called when this scene is entered
* @see #setExitAction(Runnable)
- * @see Scene#Scene(ViewGroup, int, Context)
- * @see Scene#Scene(ViewGroup, ViewGroup)
+ * @see Scene#Scene(ViewGroup, View)
*/
public void setEnterAction(Runnable action) {
mEnterAction = action;
@@ -245,8 +244,7 @@ public final class Scene {
* if an enter action is set.
*
* @see #setEnterAction(Runnable)
- * @see Scene#Scene(ViewGroup, int, Context)
- * @see Scene#Scene(ViewGroup, ViewGroup)
+ * @see Scene#Scene(ViewGroup, View)
*/
public void setExitAction(Runnable action) {
mExitAction = action;
diff --git a/core/java/android/transition/TransitionManager.java b/core/java/android/transition/TransitionManager.java
index 325ff38e7d40..45134c055ca4 100644
--- a/core/java/android/transition/TransitionManager.java
+++ b/core/java/android/transition/TransitionManager.java
@@ -210,14 +210,16 @@ public class TransitionManager {
private static ArrayMap<ViewGroup, ArrayList<Transition>> getRunningTransitions() {
WeakReference<ArrayMap<ViewGroup, ArrayList<Transition>>> runningTransitions =
sRunningTransitions.get();
- if (runningTransitions == null || runningTransitions.get() == null) {
- ArrayMap<ViewGroup, ArrayList<Transition>> transitions =
- new ArrayMap<ViewGroup, ArrayList<Transition>>();
- runningTransitions = new WeakReference<ArrayMap<ViewGroup, ArrayList<Transition>>>(
- transitions);
- sRunningTransitions.set(runningTransitions);
+ if (runningTransitions != null) {
+ ArrayMap<ViewGroup, ArrayList<Transition>> transitions = runningTransitions.get();
+ if (transitions != null) {
+ return transitions;
+ }
}
- return runningTransitions.get();
+ ArrayMap<ViewGroup, ArrayList<Transition>> transitions = new ArrayMap<>();
+ runningTransitions = new WeakReference<>(transitions);
+ sRunningTransitions.set(runningTransitions);
+ return transitions;
}
private static void sceneChangeRunTransition(final ViewGroup sceneRoot,
diff --git a/core/java/android/transition/TransitionSet.java b/core/java/android/transition/TransitionSet.java
index a41fe64d0be1..589ad574dd9b 100644
--- a/core/java/android/transition/TransitionSet.java
+++ b/core/java/android/transition/TransitionSet.java
@@ -53,11 +53,30 @@ import java.util.ArrayList;
* </pre>
*/
public class TransitionSet extends Transition {
+ /**
+ * Flag indicating the the interpolator changed.
+ */
+ private static final int FLAG_CHANGE_INTERPOLATOR = 0x01;
+ /**
+ * Flag indicating the the propagation changed.
+ */
+ private static final int FLAG_CHANGE_PROPAGATION = 0x02;
+ /**
+ * Flag indicating the the path motion changed.
+ */
+ private static final int FLAG_CHANGE_PATH_MOTION = 0x04;
+ /**
+ * Flag indicating the the epicentera callback changed.
+ */
+ static final int FLAG_CHANGE_EPICENTER = 0x08;
ArrayList<Transition> mTransitions = new ArrayList<Transition>();
private boolean mPlayTogether = true;
int mCurrentListeners;
boolean mStarted = false;
+ // Flags to know whether or not the interpolator, path motion, epicenter, propagation
+ // have changed
+ private int mChangeFlags = 0;
/**
* A flag used to indicate that the child transitions of this set
@@ -132,9 +151,12 @@ public class TransitionSet extends Transition {
* the {@link #getOrdering() ordering} property, determines the
* order in which the transitions are started.
*
- * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the
- * child transition will inherit that duration. Transitions are assumed to have
- * a maximum of one transitionSet parent.</p>
+ * <p>If this transitionSet has a {@link #getDuration() duration},
+ * {@link #getInterpolator() interpolator}, {@link #getPropagation() propagation delay},
+ * {@link #getPathMotion() path motion}, or
+ * {@link #setEpicenterCallback(EpicenterCallback) epicenter callback}
+ * set on it, the child transition will inherit the values that are set.
+ * Transitions are assumed to have a maximum of one transitionSet parent.</p>
*
* @param transition A non-null child transition to be added to this set.
* @return This transitionSet object.
@@ -146,6 +168,18 @@ public class TransitionSet extends Transition {
if (mDuration >= 0) {
transition.setDuration(mDuration);
}
+ if ((mChangeFlags & FLAG_CHANGE_INTERPOLATOR) != 0) {
+ transition.setInterpolator(getInterpolator());
+ }
+ if ((mChangeFlags & FLAG_CHANGE_PROPAGATION) != 0) {
+ transition.setPropagation(getPropagation());
+ }
+ if ((mChangeFlags & FLAG_CHANGE_PATH_MOTION) != 0) {
+ transition.setPathMotion(getPathMotion());
+ }
+ if ((mChangeFlags & FLAG_CHANGE_EPICENTER) != 0) {
+ transition.setEpicenterCallback(getEpicenterCallback());
+ }
}
return this;
}
@@ -201,6 +235,13 @@ public class TransitionSet extends Transition {
@Override
public TransitionSet setInterpolator(TimeInterpolator interpolator) {
+ mChangeFlags |= FLAG_CHANGE_INTERPOLATOR;
+ if (mTransitions != null) {
+ int numTransitions = mTransitions.size();
+ for (int i = 0; i < numTransitions; ++i) {
+ mTransitions.get(i).setInterpolator(interpolator);
+ }
+ }
return (TransitionSet) super.setInterpolator(interpolator);
}
@@ -313,6 +354,7 @@ public class TransitionSet extends Transition {
@Override
public void setPathMotion(PathMotion pathMotion) {
super.setPathMotion(pathMotion);
+ mChangeFlags |= FLAG_CHANGE_PATH_MOTION;
for (int i = 0; i < mTransitions.size(); i++) {
mTransitions.get(i).setPathMotion(pathMotion);
}
@@ -530,6 +572,7 @@ public class TransitionSet extends Transition {
@Override
public void setPropagation(TransitionPropagation propagation) {
super.setPropagation(propagation);
+ mChangeFlags |= FLAG_CHANGE_PROPAGATION;
int numTransitions = mTransitions.size();
for (int i = 0; i < numTransitions; ++i) {
mTransitions.get(i).setPropagation(propagation);
@@ -539,6 +582,7 @@ public class TransitionSet extends Transition {
@Override
public void setEpicenterCallback(EpicenterCallback epicenterCallback) {
super.setEpicenterCallback(epicenterCallback);
+ mChangeFlags |= FLAG_CHANGE_EPICENTER;
int numTransitions = mTransitions.size();
for (int i = 0; i < numTransitions; ++i) {
mTransitions.get(i).setEpicenterCallback(epicenterCallback);
diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java
index c86149907323..c037cd062b82 100644
--- a/core/java/android/util/FeatureFlagUtils.java
+++ b/core/java/android/util/FeatureFlagUtils.java
@@ -33,17 +33,18 @@ public class FeatureFlagUtils {
public static final String FFLAG_PREFIX = "sys.fflag.";
public static final String FFLAG_OVERRIDE_PREFIX = FFLAG_PREFIX + "override.";
+ public static final String PERSIST_PREFIX = "persist." + FFLAG_OVERRIDE_PREFIX;
+ public static final String HEARING_AID_SETTINGS = "settings_bluetooth_hearing_aid";
private static final Map<String, String> DEFAULT_FLAGS;
static {
DEFAULT_FLAGS = new HashMap<>();
DEFAULT_FLAGS.put("settings_battery_display_app_list", "false");
- DEFAULT_FLAGS.put("settings_zone_picker_v2", "true");
- DEFAULT_FLAGS.put("settings_about_phone_v2", "true");
DEFAULT_FLAGS.put("settings_bluetooth_while_driving", "false");
- DEFAULT_FLAGS.put("settings_data_usage_v2", "true");
DEFAULT_FLAGS.put("settings_audio_switcher", "true");
DEFAULT_FLAGS.put("settings_systemui_theme", "true");
+ DEFAULT_FLAGS.put("settings_dynamic_homepage", "false");
+ DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "true");
}
/**
diff --git a/core/java/android/util/Half.java b/core/java/android/util/Half.java
index 84c2e8302e89..5718d994620d 100644
--- a/core/java/android/util/Half.java
+++ b/core/java/android/util/Half.java
@@ -20,8 +20,6 @@ import android.annotation.HalfFloat;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import sun.misc.FloatingDecimal;
-
/**
* <p>The {@code Half} class is a wrapper and a utility class to manipulate half-precision 16-bit
* <a href="https://en.wikipedia.org/wiki/Half-precision_floating-point_format">IEEE 754</a>
@@ -1026,7 +1024,7 @@ public final class Half extends Number implements Comparable<Half> {
* half-precision float value
*/
public static @HalfFloat short parseHalf(@NonNull String s) throws NumberFormatException {
- return toHalf(FloatingDecimal.parseFloat(s));
+ return toHalf(Float.parseFloat(s));
}
/**
diff --git a/core/java/android/util/IntArray.java b/core/java/android/util/IntArray.java
index 3617aa7212dc..5a74ec0e52c0 100644
--- a/core/java/android/util/IntArray.java
+++ b/core/java/android/util/IntArray.java
@@ -18,9 +18,11 @@ package android.util;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
-import java.util.Arrays;
+
import libcore.util.EmptyArray;
+import java.util.Arrays;
+
/**
* Implements a growing array of int primitives.
*
@@ -102,7 +104,7 @@ public class IntArray implements Cloneable {
ensureCapacity(1);
int rightSegment = mSize - index;
mSize++;
- checkBounds(index);
+ ArrayUtils.checkBounds(mSize, index);
if (rightSegment != 0) {
// Move by 1 all values from the right of 'index'
@@ -175,7 +177,7 @@ public class IntArray implements Cloneable {
* Returns the value at the specified position in this array.
*/
public int get(int index) {
- checkBounds(index);
+ ArrayUtils.checkBounds(mSize, index);
return mValues[index];
}
@@ -183,7 +185,7 @@ public class IntArray implements Cloneable {
* Sets the value at the specified position in this array.
*/
public void set(int index, int value) {
- checkBounds(index);
+ ArrayUtils.checkBounds(mSize, index);
mValues[index] = value;
}
@@ -205,7 +207,7 @@ public class IntArray implements Cloneable {
* Removes the value at the specified index from this array.
*/
public void remove(int index) {
- checkBounds(index);
+ ArrayUtils.checkBounds(mSize, index);
System.arraycopy(mValues, index + 1, mValues, index, mSize - index - 1);
mSize--;
}
@@ -223,10 +225,4 @@ public class IntArray implements Cloneable {
public int[] toArray() {
return Arrays.copyOf(mValues, mSize);
}
-
- private void checkBounds(int index) {
- if (index < 0 || mSize <= index) {
- throw new ArrayIndexOutOfBoundsException(mSize, index);
- }
- }
}
diff --git a/core/java/android/util/Log.java b/core/java/android/util/Log.java
index 029986534890..2499afb7e8f3 100644
--- a/core/java/android/util/Log.java
+++ b/core/java/android/util/Log.java
@@ -16,6 +16,9 @@
package android.util;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.DeadSystemException;
import com.android.internal.os.RuntimeInit;
@@ -25,6 +28,8 @@ import com.android.internal.util.LineBreakBufferedWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.net.UnknownHostException;
/**
@@ -57,6 +62,10 @@ import java.net.UnknownHostException;
* significant work and incurring significant overhead.
*/
public final class Log {
+ /** @hide */
+ @IntDef({ASSERT, ERROR, WARN, INFO, DEBUG, VERBOSE})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Level {}
/**
* Priority constant for the println method; use Log.v.
@@ -120,7 +129,7 @@ public final class Log {
* the class or activity where the log call occurs.
* @param msg The message you would like logged.
*/
- public static int v(String tag, String msg) {
+ public static int v(@Nullable String tag, @NonNull String msg) {
return println_native(LOG_ID_MAIN, VERBOSE, tag, msg);
}
@@ -131,7 +140,7 @@ public final class Log {
* @param msg The message you would like logged.
* @param tr An exception to log
*/
- public static int v(String tag, String msg, Throwable tr) {
+ public static int v(@Nullable String tag, @Nullable String msg, @Nullable Throwable tr) {
return printlns(LOG_ID_MAIN, VERBOSE, tag, msg, tr);
}
@@ -141,7 +150,7 @@ public final class Log {
* the class or activity where the log call occurs.
* @param msg The message you would like logged.
*/
- public static int d(String tag, String msg) {
+ public static int d(@Nullable String tag, @NonNull String msg) {
return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
}
@@ -152,7 +161,7 @@ public final class Log {
* @param msg The message you would like logged.
* @param tr An exception to log
*/
- public static int d(String tag, String msg, Throwable tr) {
+ public static int d(@Nullable String tag, @Nullable String msg, @Nullable Throwable tr) {
return printlns(LOG_ID_MAIN, DEBUG, tag, msg, tr);
}
@@ -162,7 +171,7 @@ public final class Log {
* the class or activity where the log call occurs.
* @param msg The message you would like logged.
*/
- public static int i(String tag, String msg) {
+ public static int i(@Nullable String tag, @NonNull String msg) {
return println_native(LOG_ID_MAIN, INFO, tag, msg);
}
@@ -173,7 +182,7 @@ public final class Log {
* @param msg The message you would like logged.
* @param tr An exception to log
*/
- public static int i(String tag, String msg, Throwable tr) {
+ public static int i(@Nullable String tag, @Nullable String msg, @Nullable Throwable tr) {
return printlns(LOG_ID_MAIN, INFO, tag, msg, tr);
}
@@ -183,7 +192,7 @@ public final class Log {
* the class or activity where the log call occurs.
* @param msg The message you would like logged.
*/
- public static int w(String tag, String msg) {
+ public static int w(@Nullable String tag, @NonNull String msg) {
return println_native(LOG_ID_MAIN, WARN, tag, msg);
}
@@ -194,7 +203,7 @@ public final class Log {
* @param msg The message you would like logged.
* @param tr An exception to log
*/
- public static int w(String tag, String msg, Throwable tr) {
+ public static int w(@Nullable String tag, @Nullable String msg, @Nullable Throwable tr) {
return printlns(LOG_ID_MAIN, WARN, tag, msg, tr);
}
@@ -205,9 +214,8 @@ public final class Log {
* INFO will be logged. Before you make any calls to a logging method you should check to see
* if your tag should be logged. You can change the default level by setting a system property:
* 'setprop log.tag.&lt;YOUR_LOG_TAG> &lt;LEVEL>'
- * Where level is either VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT, or SUPPRESS. SUPPRESS will
- * turn off all logging for your tag. You can also create a local.prop file that with the
- * following in it:
+ * Where level is either VERBOSE, DEBUG, INFO, WARN, ERROR, or ASSERT.
+ * You can also create a local.prop file that with the following in it:
* 'log.tag.&lt;YOUR_LOG_TAG>=&lt;LEVEL>'
* and place that in /data/local.prop.
*
@@ -218,15 +226,15 @@ public final class Log {
* for Nougat (7.0) releases (API <= 23) and prior, there is no
* tag limit of concern after this API level.
*/
- public static native boolean isLoggable(String tag, int level);
+ public static native boolean isLoggable(@Nullable String tag, @Level int level);
- /*
+ /**
* Send a {@link #WARN} log message and log the exception.
* @param tag Used to identify the source of a log message. It usually identifies
* the class or activity where the log call occurs.
* @param tr An exception to log
*/
- public static int w(String tag, Throwable tr) {
+ public static int w(@Nullable String tag, @Nullable Throwable tr) {
return printlns(LOG_ID_MAIN, WARN, tag, "", tr);
}
@@ -236,7 +244,7 @@ public final class Log {
* the class or activity where the log call occurs.
* @param msg The message you would like logged.
*/
- public static int e(String tag, String msg) {
+ public static int e(@Nullable String tag, @NonNull String msg) {
return println_native(LOG_ID_MAIN, ERROR, tag, msg);
}
@@ -247,7 +255,7 @@ public final class Log {
* @param msg The message you would like logged.
* @param tr An exception to log
*/
- public static int e(String tag, String msg, Throwable tr) {
+ public static int e(@Nullable String tag, @Nullable String msg, @Nullable Throwable tr) {
return printlns(LOG_ID_MAIN, ERROR, tag, msg, tr);
}
@@ -260,7 +268,7 @@ public final class Log {
* @param tag Used to identify the source of a log message.
* @param msg The message you would like logged.
*/
- public static int wtf(String tag, String msg) {
+ public static int wtf(@Nullable String tag, @Nullable String msg) {
return wtf(LOG_ID_MAIN, tag, msg, null, false, false);
}
@@ -269,7 +277,7 @@ public final class Log {
* call stack.
* @hide
*/
- public static int wtfStack(String tag, String msg) {
+ public static int wtfStack(@Nullable String tag, @Nullable String msg) {
return wtf(LOG_ID_MAIN, tag, msg, null, true, false);
}
@@ -279,7 +287,7 @@ public final class Log {
* @param tag Used to identify the source of a log message.
* @param tr An exception to log.
*/
- public static int wtf(String tag, Throwable tr) {
+ public static int wtf(@Nullable String tag, @NonNull Throwable tr) {
return wtf(LOG_ID_MAIN, tag, tr.getMessage(), tr, false, false);
}
@@ -290,12 +298,12 @@ public final class Log {
* @param msg The message you would like logged.
* @param tr An exception to log. May be null.
*/
- public static int wtf(String tag, String msg, Throwable tr) {
+ public static int wtf(@Nullable String tag, @Nullable String msg, @Nullable Throwable tr) {
return wtf(LOG_ID_MAIN, tag, msg, tr, false, false);
}
- static int wtf(int logId, String tag, String msg, Throwable tr, boolean localStack,
- boolean system) {
+ static int wtf(int logId, @Nullable String tag, @Nullable String msg, @Nullable Throwable tr,
+ boolean localStack, boolean system) {
TerribleFailure what = new TerribleFailure(msg, tr);
// Only mark this as ERROR, do not use ASSERT since that should be
// reserved for cases where the system is guaranteed to abort.
@@ -305,7 +313,7 @@ public final class Log {
return bytes;
}
- static void wtfQuiet(int logId, String tag, String msg, boolean system) {
+ static void wtfQuiet(int logId, @Nullable String tag, @Nullable String msg, boolean system) {
TerribleFailure what = new TerribleFailure(msg, null);
sWtfHandler.onTerribleFailure(tag, what, system);
}
@@ -317,7 +325,8 @@ public final class Log {
*
* @hide
*/
- public static TerribleFailureHandler setWtfHandler(TerribleFailureHandler handler) {
+ @NonNull
+ public static TerribleFailureHandler setWtfHandler(@NonNull TerribleFailureHandler handler) {
if (handler == null) {
throw new NullPointerException("handler == null");
}
@@ -330,7 +339,8 @@ public final class Log {
* Handy function to get a loggable stack trace from a Throwable
* @param tr An exception to log
*/
- public static String getStackTraceString(Throwable tr) {
+ @NonNull
+ public static String getStackTraceString(@Nullable Throwable tr) {
if (tr == null) {
return "";
}
@@ -360,7 +370,7 @@ public final class Log {
* @param msg The message you would like logged.
* @return The number of bytes written.
*/
- public static int println(int priority, String tag, String msg) {
+ public static int println(@Level int priority, @Nullable String tag, @NonNull String msg) {
return println_native(LOG_ID_MAIN, priority, tag, msg);
}
@@ -385,8 +395,8 @@ public final class Log {
* chunks. This is to avoid truncation.
* @hide
*/
- public static int printlns(int bufID, int priority, String tag, String msg,
- Throwable tr) {
+ public static int printlns(int bufID, int priority, @Nullable String tag, @NonNull String msg,
+ @Nullable Throwable tr) {
ImmediateLogWriter logWriter = new ImmediateLogWriter(bufID, priority, tag);
// Acceptable buffer size. Get the native buffer size, subtract two zero terminators,
// and the length of the tag.
diff --git a/core/java/android/util/LongArray.java b/core/java/android/util/LongArray.java
index fa980966802f..5ed1c8c05cba 100644
--- a/core/java/android/util/LongArray.java
+++ b/core/java/android/util/LongArray.java
@@ -106,7 +106,7 @@ public class LongArray implements Cloneable {
ensureCapacity(1);
int rightSegment = mSize - index;
mSize++;
- checkBounds(index);
+ ArrayUtils.checkBounds(mSize, index);
if (rightSegment != 0) {
// Move by 1 all values from the right of 'index'
@@ -166,7 +166,7 @@ public class LongArray implements Cloneable {
* Returns the value at the specified position in this array.
*/
public long get(int index) {
- checkBounds(index);
+ ArrayUtils.checkBounds(mSize, index);
return mValues[index];
}
@@ -174,7 +174,7 @@ public class LongArray implements Cloneable {
* Sets the value at the specified position in this array.
*/
public void set(int index, long value) {
- checkBounds(index);
+ ArrayUtils.checkBounds(mSize, index);
mValues[index] = value;
}
@@ -196,7 +196,7 @@ public class LongArray implements Cloneable {
* Removes the value at the specified index from this array.
*/
public void remove(int index) {
- checkBounds(index);
+ ArrayUtils.checkBounds(mSize, index);
System.arraycopy(mValues, index + 1, mValues, index, mSize - index - 1);
mSize--;
}
@@ -215,12 +215,6 @@ public class LongArray implements Cloneable {
return Arrays.copyOf(mValues, mSize);
}
- private void checkBounds(int index) {
- if (index < 0 || mSize <= index) {
- throw new ArrayIndexOutOfBoundsException(mSize, index);
- }
- }
-
/**
* Test if each element of {@code a} equals corresponding element from {@code b}
*/
diff --git a/core/java/android/util/MathUtils.java b/core/java/android/util/MathUtils.java
index b2e24c357e3c..72865ccdc71a 100644
--- a/core/java/android/util/MathUtils.java
+++ b/core/java/android/util/MathUtils.java
@@ -187,6 +187,21 @@ public final class MathUtils {
}
/**
+ * Perform Hermite interpolation between two values.
+ * Eg:
+ * smoothStep(0, 0.5f, 0.5f) = 1f
+ * smoothStep(0, 0.5f, 0.25f) = 0.5f
+ *
+ * @param start Left edge.
+ * @param end Right edge.
+ * @param x A value between {@code start} and {@code end}.
+ * @return A number between 0 and 1 representing where {@code x} is in the interpolation.
+ */
+ public static float smoothStep(float start, float end, float x) {
+ return constrain((x - start) / (end - start), 0f, 1f);
+ }
+
+ /**
* Returns the sum of the two parameters, or throws an exception if the resulting sum would
* cause an overflow or underflow.
* @throws IllegalArgumentException when overflow or underflow would occur.
diff --git a/core/java/android/util/TimestampedValue.java b/core/java/android/util/TimestampedValue.java
new file mode 100644
index 000000000000..1289e4db0743
--- /dev/null
+++ b/core/java/android/util/TimestampedValue.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.SystemClock;
+
+import java.util.Objects;
+
+/**
+ * A value with an associated reference time. The reference time will typically be provided by the
+ * elapsed realtime clock. The elapsed realtime clock can be obtained using methods like
+ * {@link SystemClock#elapsedRealtime()} or {@link SystemClock#elapsedRealtimeClock()}.
+ * If a suitable clock is used the reference time can be used to identify the age of a value or
+ * ordering between values.
+ *
+ * <p>To read and write a timestamped value from / to a Parcel see
+ * {@link #readFromParcel(Parcel, ClassLoader, Class)} and
+ * {@link #writeToParcel(Parcel, TimestampedValue)}.
+ *
+ * @param <T> the type of the value with an associated timestamp
+ * @hide
+ */
+public final class TimestampedValue<T> {
+ private final long mReferenceTimeMillis;
+ private final T mValue;
+
+ public TimestampedValue(long referenceTimeMillis, T value) {
+ mReferenceTimeMillis = referenceTimeMillis;
+ mValue = value;
+ }
+
+ public long getReferenceTimeMillis() {
+ return mReferenceTimeMillis;
+ }
+
+ public T getValue() {
+ return mValue;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ TimestampedValue<?> that = (TimestampedValue<?>) o;
+ return mReferenceTimeMillis == that.mReferenceTimeMillis
+ && Objects.equals(mValue, that.mValue);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mReferenceTimeMillis, mValue);
+ }
+
+ @Override
+ public String toString() {
+ return "TimestampedValue{"
+ + "mReferenceTimeMillis=" + mReferenceTimeMillis
+ + ", mValue=" + mValue
+ + '}';
+ }
+
+ /**
+ * Read a {@link TimestampedValue} from a parcel that was stored using
+ * {@link #writeToParcel(Parcel, TimestampedValue)}.
+ *
+ * <p>The marshalling/unmarshalling of the value relies upon {@link Parcel#writeValue(Object)}
+ * and {@link Parcel#readValue(ClassLoader)} and so this method can only be used with types
+ * supported by those methods.
+ *
+ * @param in the Parcel to read from
+ * @param classLoader the ClassLoader to pass to {@link Parcel#readValue(ClassLoader)}
+ * @param valueClass the expected type of the value, typically the same as {@code <T>} but can
+ * also be a subclass
+ * @throws RuntimeException if the value read is not compatible with {@code valueClass} or the
+ * object could not be read
+ */
+ @SuppressWarnings("unchecked")
+ @NonNull
+ public static <T> TimestampedValue<T> readFromParcel(
+ @NonNull Parcel in, @Nullable ClassLoader classLoader, Class<? extends T> valueClass) {
+ long referenceTimeMillis = in.readLong();
+ T value = (T) in.readValue(classLoader);
+ // Equivalent to static code: if (!(value.getClass() instanceof {valueClass})) {
+ if (value != null && !valueClass.isAssignableFrom(value.getClass())) {
+ throw new RuntimeException("Value was of type " + value.getClass()
+ + " is not assignable to " + valueClass);
+ }
+ return new TimestampedValue<>(referenceTimeMillis, value);
+ }
+
+ /**
+ * Write a {@link TimestampedValue} to a parcel so that it can be read using
+ * {@link #readFromParcel(Parcel, ClassLoader, Class)}.
+ *
+ * <p>The marshalling/unmarshalling of the value relies upon {@link Parcel#writeValue(Object)}
+ * and {@link Parcel#readValue(ClassLoader)} and so this method can only be used with types
+ * supported by those methods.
+ *
+ * @param dest the Parcel
+ * @param timestampedValue the value
+ * @throws RuntimeException if the value could not be written to the Parcel
+ */
+ public static void writeToParcel(
+ @NonNull Parcel dest, @NonNull TimestampedValue<?> timestampedValue) {
+ dest.writeLong(timestampedValue.mReferenceTimeMillis);
+ dest.writeValue(timestampedValue.mValue);
+ }
+
+ /**
+ * Returns the difference in milliseconds between two instance's reference times.
+ */
+ public static long referenceTimeDifference(
+ @NonNull TimestampedValue<?> one, @NonNull TimestampedValue<?> two) {
+ return one.mReferenceTimeMillis - two.mReferenceTimeMillis;
+ }
+}
diff --git a/core/java/android/util/Xml.java b/core/java/android/util/Xml.java
index 041e8a85aafe..e3b8fec3559e 100644
--- a/core/java/android/util/Xml.java
+++ b/core/java/android/util/Xml.java
@@ -16,27 +16,27 @@
package android.util;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
-import org.apache.harmony.xml.ExpatReader;
-import org.kxml2.io.KXmlParser;
+import libcore.util.XmlObjectFactory;
+
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+
/**
* XML utility methods.
*/
public class Xml {
- /** @hide */ public Xml() {}
+ private Xml() {}
/**
* {@link org.xmlpull.v1.XmlPullParser} "relaxed" feature name.
@@ -52,7 +52,7 @@ public class Xml {
public static void parse(String xml, ContentHandler contentHandler)
throws SAXException {
try {
- XMLReader reader = new ExpatReader();
+ XMLReader reader = XmlObjectFactory.newXMLReader();
reader.setContentHandler(contentHandler);
reader.parse(new InputSource(new StringReader(xml)));
} catch (IOException e) {
@@ -66,7 +66,7 @@ public class Xml {
*/
public static void parse(Reader in, ContentHandler contentHandler)
throws IOException, SAXException {
- XMLReader reader = new ExpatReader();
+ XMLReader reader = XmlObjectFactory.newXMLReader();
reader.setContentHandler(contentHandler);
reader.parse(new InputSource(in));
}
@@ -77,7 +77,7 @@ public class Xml {
*/
public static void parse(InputStream in, Encoding encoding,
ContentHandler contentHandler) throws IOException, SAXException {
- XMLReader reader = new ExpatReader();
+ XMLReader reader = XmlObjectFactory.newXMLReader();
reader.setContentHandler(contentHandler);
InputSource source = new InputSource(in);
source.setEncoding(encoding.expatName);
@@ -89,7 +89,7 @@ public class Xml {
*/
public static XmlPullParser newPullParser() {
try {
- KXmlParser parser = new KXmlParser();
+ XmlPullParser parser = XmlObjectFactory.newXmlPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL, true);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
return parser;
@@ -102,25 +102,7 @@ public class Xml {
* Creates a new xml serializer.
*/
public static XmlSerializer newSerializer() {
- try {
- return XmlSerializerFactory.instance.newSerializer();
- } catch (XmlPullParserException e) {
- throw new AssertionError(e);
- }
- }
-
- /** Factory for xml serializers. Initialized on demand. */
- static class XmlSerializerFactory {
- static final String TYPE
- = "org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer";
- static final XmlPullParserFactory instance;
- static {
- try {
- instance = XmlPullParserFactory.newInstance(TYPE, null);
- } catch (XmlPullParserException e) {
- throw new AssertionError(e);
- }
- }
+ return XmlObjectFactory.newXmlSerializer();
}
/**
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 31cfebcc3ae3..20f806624fd0 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -19,6 +19,7 @@ package android.view;
import static android.Manifest.permission.CONFIGURE_DISPLAY_COLOR_MODE;
import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.app.KeyguardManager;
import android.content.res.CompatibilityInfo;
@@ -753,6 +754,20 @@ public final class Display {
return getRotation();
}
+
+ /**
+ * Returns the {@link DisplayCutout}, or {@code null} if there is none.
+ *
+ * @see DisplayCutout
+ */
+ @Nullable
+ public DisplayCutout getCutout() {
+ synchronized (this) {
+ updateDisplayInfoLocked();
+ return mDisplayInfo.displayCutout;
+ }
+ }
+
/**
* Gets the pixel format of the display.
* @return One of the constants defined in {@link android.graphics.PixelFormat}.
diff --git a/core/java/android/view/DisplayCutout.java b/core/java/android/view/DisplayCutout.java
index 47bda538ae52..496bc9ff5383 100644
--- a/core/java/android/view/DisplayCutout.java
+++ b/core/java/android/view/DisplayCutout.java
@@ -29,6 +29,7 @@ import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
+import android.graphics.Region.Op;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -325,14 +326,9 @@ public final class DisplayCutout {
* @hide
*/
public static DisplayCutout fromBoundingRect(int left, int top, int right, int bottom) {
- Path path = new Path();
- path.reset();
- path.moveTo(left, top);
- path.lineTo(left, bottom);
- path.lineTo(right, bottom);
- path.lineTo(right, top);
- path.close();
- return fromBounds(path);
+ Region r = Region.obtain();
+ r.set(left, top, right, bottom);
+ return fromBounds(r);
}
/**
@@ -340,26 +336,19 @@ public final class DisplayCutout {
*
* @hide
*/
- public static DisplayCutout fromBounds(Path path) {
- RectF clipRect = new RectF();
- path.computeBounds(clipRect, false /* unused */);
- Region clipRegion = Region.obtain();
- clipRegion.set((int) clipRect.left, (int) clipRect.top,
- (int) clipRect.right, (int) clipRect.bottom);
-
- Region bounds = new Region();
- bounds.setPath(path, clipRegion);
- clipRegion.recycle();
- return new DisplayCutout(ZERO_RECT, bounds, false /* copyArguments */);
+ public static DisplayCutout fromBounds(Region region) {
+ return new DisplayCutout(ZERO_RECT, region, false /* copyArguments */);
}
/**
- * Creates the bounding path according to @android:string/config_mainBuiltInDisplayCutout.
+ * Creates the display cutout according to
+ * @android:string/config_mainBuiltInDisplayCutoutRectApproximation, which is the closest
+ * rectangle-base approximation of the cutout.
*
* @hide
*/
- public static DisplayCutout fromResources(Resources res, int displayWidth, int displayHeight) {
- return fromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout),
+ public static DisplayCutout fromResourcesRectApproximation(Resources res, int displayWidth, int displayHeight) {
+ return fromSpec(res.getString(R.string.config_mainBuiltInDisplayCutoutRectApproximation),
displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT);
}
@@ -369,7 +358,8 @@ public final class DisplayCutout {
* @hide
*/
public static Path pathFromResources(Resources res, int displayWidth, int displayHeight) {
- return pathAndDisplayCutoutFromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout),
+ return pathAndDisplayCutoutFromSpec(
+ res.getString(R.string.config_mainBuiltInDisplayCutout),
displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT).first;
}
@@ -417,6 +407,7 @@ public final class DisplayCutout {
}
final Path p;
+ final Region r = Region.obtain();
try {
p = PathParser.createPathFromPathData(spec);
} catch (Throwable e) {
@@ -431,6 +422,8 @@ public final class DisplayCutout {
m.postTranslate(offsetX, 0);
p.transform(m);
+ addToRegion(p, r);
+
if (bottomSpec != null) {
final Path bottomPath;
try {
@@ -443,9 +436,10 @@ public final class DisplayCutout {
m.postTranslate(0, displayHeight);
bottomPath.transform(m);
p.addPath(bottomPath);
+ addToRegion(bottomPath, r);
}
- final Pair<Path, DisplayCutout> result = new Pair<>(p, fromBounds(p));
+ final Pair<Path, DisplayCutout> result = new Pair<>(p, fromBounds(r));
synchronized (CACHE_LOCK) {
sCachedSpec = spec;
sCachedDisplayWidth = displayWidth;
@@ -456,6 +450,14 @@ public final class DisplayCutout {
return result;
}
+ private static void addToRegion(Path p, Region r) {
+ final RectF rectF = new RectF();
+ final Rect rect = new Rect();
+ p.computeBounds(rectF, false /* unused */);
+ rectF.round(rect);
+ r.op(rect, Op.UNION);
+ }
+
private static Region boundingRectsToRegion(List<Rect> rects) {
Region result = Region.obtain();
if (rects != null) {
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index 913e5924c6a6..2421ba458403 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -22,6 +22,7 @@ import static android.view.DisplayInfoProto.LOGICAL_HEIGHT;
import static android.view.DisplayInfoProto.LOGICAL_WIDTH;
import static android.view.DisplayInfoProto.NAME;
+import android.annotation.Nullable;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
@@ -153,6 +154,7 @@ public final class DisplayInfo implements Parcelable {
*
* @hide
*/
+ @Nullable
public DisplayCutout displayCutout;
/**
diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java
index 671532c90bc8..df4d5c415b98 100644
--- a/core/java/android/view/DisplayListCanvas.java
+++ b/core/java/android/view/DisplayListCanvas.java
@@ -180,13 +180,12 @@ public final class DisplayListCanvas extends RecordingCanvas {
///////////////////////////////////////////////////////////////////////////
/**
- * Draws the specified display list onto this canvas. The display list can only
- * be drawn if {@link android.view.RenderNode#isValid()} returns true.
+ * Draws the specified display list onto this canvas.
*
* @param renderNode The RenderNode to draw.
*/
public void drawRenderNode(RenderNode renderNode) {
- nDrawRenderNode(mNativeCanvasWrapper, renderNode.getNativeDisplayList());
+ nDrawRenderNode(mNativeCanvasWrapper, renderNode.mNativeRenderNode);
}
///////////////////////////////////////////////////////////////////////////
diff --git a/core/java/android/view/InputEvent.java b/core/java/android/view/InputEvent.java
index e2ad3ad45c64..c25736495b0e 100644
--- a/core/java/android/view/InputEvent.java
+++ b/core/java/android/view/InputEvent.java
@@ -51,7 +51,7 @@ public abstract class InputEvent implements Parcelable {
* zero indicates that the event didn't come from a physical device
* and maps to the default keymap. The other numbers are arbitrary and
* you shouldn't depend on the values.
- *
+ *
* @return The device id.
* @see InputDevice#getDevice
*/
@@ -59,7 +59,7 @@ public abstract class InputEvent implements Parcelable {
/**
* Gets the device that this event came from.
- *
+ *
* @return The device, or null if unknown.
*/
public final InputDevice getDevice() {
@@ -68,7 +68,7 @@ public abstract class InputEvent implements Parcelable {
/**
* Gets the source of the event.
- *
+ *
* @return The event source or {@link InputDevice#SOURCE_UNKNOWN} if unknown.
* @see InputDevice#getSources
*/
@@ -95,6 +95,19 @@ public abstract class InputEvent implements Parcelable {
}
/**
+ * Gets the display id of the event.
+ * @return The display id associated with the event.
+ * @hide
+ */
+ public abstract int getDisplayId();
+
+ /**
+ * Modifies the display id associated with the event
+ * @param displayId
+ * @hide
+ */
+ public abstract void setDisplayId(int displayId);
+ /**
* Copies the event.
*
* @return A deep copy of the event.
@@ -234,7 +247,7 @@ public abstract class InputEvent implements Parcelable {
throw new IllegalStateException("Unexpected input event type token in parcel.");
}
}
-
+
public InputEvent[] newArray(int size) {
return new InputEvent[size];
}
diff --git a/core/java/android/view/InputEventReceiver.java b/core/java/android/view/InputEventReceiver.java
index be3d9539a6c7..f85fa523833f 100644
--- a/core/java/android/view/InputEventReceiver.java
+++ b/core/java/android/view/InputEventReceiver.java
@@ -112,10 +112,9 @@ public abstract class InputEventReceiver {
* to indicate whether the event was handled. No new input events will be received
* until {@link #finishInputEvent} is called.
*
- * @param displayId The display id on which input event triggered.
* @param event The input event that was received.
*/
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
finishInputEvent(event, false);
}
@@ -182,9 +181,9 @@ public abstract class InputEventReceiver {
// Called from native code.
@SuppressWarnings("unused")
- private void dispatchInputEvent(int seq, InputEvent event, int displayId) {
+ private void dispatchInputEvent(int seq, InputEvent event) {
mSeqMap.put(event.getSequenceNumber(), seq);
- onInputEvent(event, displayId);
+ onInputEvent(event);
}
// Called from native code.
diff --git a/core/java/android/view/KeyCharacterMap.java b/core/java/android/view/KeyCharacterMap.java
index 02202db52fac..b7b56e83a3cb 100644
--- a/core/java/android/view/KeyCharacterMap.java
+++ b/core/java/android/view/KeyCharacterMap.java
@@ -123,7 +123,7 @@ public class KeyCharacterMap implements Parcelable {
/**
* Modifier keys may be chorded with character keys.
*
- * @see {#link #getModifierBehavior()} for more details.
+ * @see #getModifierBehavior()
*/
public static final int MODIFIER_BEHAVIOR_CHORDED = 0;
@@ -131,7 +131,7 @@ public class KeyCharacterMap implements Parcelable {
* Modifier keys may be chorded with character keys or they may toggle
* into latched or locked states when pressed independently.
*
- * @see {#link #getModifierBehavior()} for more details.
+ * @see #getModifierBehavior()
*/
public static final int MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED = 1;
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index a59740563ceb..2c00391e7450 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -16,6 +16,10 @@
package android.view;
+import static android.view.Display.INVALID_DISPLAY;
+
+import android.annotation.NonNull;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.method.MetaKeyKeyListener;
@@ -809,7 +813,12 @@ public class KeyEvent extends InputEvent implements Parcelable {
/** Key code constant: Refresh key. */
public static final int KEYCODE_REFRESH = 285;
- private static final int LAST_KEYCODE = KEYCODE_REFRESH;
+ /**
+ * Integer value of the last KEYCODE. Increases as new keycodes are added to KeyEvent.
+ * @hide
+ */
+ @TestApi
+ public static final int LAST_KEYCODE = KEYCODE_REFRESH;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
@@ -1239,6 +1248,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
private int mDeviceId;
private int mSource;
+ private int mDisplayId;
private int mMetaState;
private int mAction;
private int mKeyCode;
@@ -1466,6 +1476,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
mScanCode = scancode;
mFlags = flags;
mSource = source;
+ mDisplayId = INVALID_DISPLAY;
}
/**
@@ -1490,6 +1501,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
mDeviceId = deviceId;
mFlags = flags;
mSource = InputDevice.SOURCE_KEYBOARD;
+ mDisplayId = INVALID_DISPLAY;
}
/**
@@ -1504,6 +1516,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
mMetaState = origEvent.mMetaState;
mDeviceId = origEvent.mDeviceId;
mSource = origEvent.mSource;
+ mDisplayId = origEvent.mDisplayId;
mScanCode = origEvent.mScanCode;
mFlags = origEvent.mFlags;
mCharacters = origEvent.mCharacters;
@@ -1530,6 +1543,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
mMetaState = origEvent.mMetaState;
mDeviceId = origEvent.mDeviceId;
mSource = origEvent.mSource;
+ mDisplayId = origEvent.mDisplayId;
mScanCode = origEvent.mScanCode;
mFlags = origEvent.mFlags;
mCharacters = origEvent.mCharacters;
@@ -1556,8 +1570,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
* @hide
*/
public static KeyEvent obtain(long downTime, long eventTime, int action,
- int code, int repeat, int metaState,
- int deviceId, int scancode, int flags, int source, String characters) {
+ int code, int repeat, int metaState,
+ int deviceId, int scancode, int flags, int source, int displayId, String characters) {
KeyEvent ev = obtain();
ev.mDownTime = downTime;
ev.mEventTime = eventTime;
@@ -1569,11 +1583,26 @@ public class KeyEvent extends InputEvent implements Parcelable {
ev.mScanCode = scancode;
ev.mFlags = flags;
ev.mSource = source;
+ ev.mDisplayId = displayId;
ev.mCharacters = characters;
return ev;
}
/**
+ * Obtains a (potentially recycled) key event.
+ *
+ * @hide
+ */
+ public static KeyEvent obtain(long downTime, long eventTime, int action,
+ int code, int repeat, int metaState,
+ int deviceId, int scancode, int flags, int source, String characters) {
+ return obtain(downTime, eventTime, action, code, repeat, metaState, deviceId, scancode,
+ flags, source, INVALID_DISPLAY, characters);
+ }
+
+ /**
+
+ /**
* Obtains a (potentially recycled) copy of another key event.
*
* @hide
@@ -1590,6 +1619,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
ev.mScanCode = other.mScanCode;
ev.mFlags = other.mFlags;
ev.mSource = other.mSource;
+ ev.mDisplayId = other.mDisplayId;
ev.mCharacters = other.mCharacters;
return ev;
}
@@ -1676,6 +1706,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
mMetaState = origEvent.mMetaState;
mDeviceId = origEvent.mDeviceId;
mSource = origEvent.mSource;
+ mDisplayId = origEvent.mDisplayId;
mScanCode = origEvent.mScanCode;
mFlags = origEvent.mFlags;
// Don't copy mCharacters, since one way or the other we'll lose it
@@ -1910,6 +1941,18 @@ public class KeyEvent extends InputEvent implements Parcelable {
mSource = source;
}
+ /** @hide */
+ @Override
+ public final int getDisplayId() {
+ return mDisplayId;
+ }
+
+ /** @hide */
+ @Override
+ public final void setDisplayId(int displayId) {
+ mDisplayId = displayId;
+ }
+
/**
* <p>Returns the state of the meta keys.</p>
*
@@ -2845,6 +2888,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
msg.append(", downTime=").append(mDownTime);
msg.append(", deviceId=").append(mDeviceId);
msg.append(", source=0x").append(Integer.toHexString(mSource));
+ msg.append(", displayId=").append(mDisplayId);
msg.append(" }");
return msg.toString();
}
@@ -2857,6 +2901,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
* @return The symbolic name of the specified action.
* @hide
*/
+ @TestApi
public static String actionToString(int action) {
switch (action) {
case ACTION_DOWN:
@@ -2887,25 +2932,34 @@ public class KeyEvent extends InputEvent implements Parcelable {
/**
* Gets a keycode by its symbolic name such as "KEYCODE_A" or an equivalent
- * numeric constant such as "1001".
+ * numeric constant such as "29". For symbolic names,
+ * starting in {@link android.os.Build.VERSION_CODES#Q} the prefix "KEYCODE_" is optional.
*
* @param symbolicName The symbolic name of the keycode.
* @return The keycode or {@link #KEYCODE_UNKNOWN} if not found.
- * @see #keycodeToString(int)
+ * @see #keyCodeToString(int)
*/
- public static int keyCodeFromString(String symbolicName) {
- if (symbolicName.startsWith(LABEL_PREFIX)) {
- symbolicName = symbolicName.substring(LABEL_PREFIX.length());
- int keyCode = nativeKeyCodeFromString(symbolicName);
- if (keyCode > 0) {
+ public static int keyCodeFromString(@NonNull String symbolicName) {
+ try {
+ int keyCode = Integer.parseInt(symbolicName);
+ if (keyCodeIsValid(keyCode)) {
return keyCode;
}
- }
- try {
- return Integer.parseInt(symbolicName, 10);
} catch (NumberFormatException ex) {
- return KEYCODE_UNKNOWN;
}
+
+ if (symbolicName.startsWith(LABEL_PREFIX)) {
+ symbolicName = symbolicName.substring(LABEL_PREFIX.length());
+ }
+ int keyCode = nativeKeyCodeFromString(symbolicName);
+ if (keyCodeIsValid(keyCode)) {
+ return keyCode;
+ }
+ return KEYCODE_UNKNOWN;
+ }
+
+ private static boolean keyCodeIsValid(int keyCode) {
+ return keyCode >= KEYCODE_UNKNOWN && keyCode <= LAST_KEYCODE;
}
/**
@@ -2966,6 +3020,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
private KeyEvent(Parcel in) {
mDeviceId = in.readInt();
mSource = in.readInt();
+ mDisplayId = in.readInt();
mAction = in.readInt();
mKeyCode = in.readInt();
mRepeatCount = in.readInt();
@@ -2982,6 +3037,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
out.writeInt(mDeviceId);
out.writeInt(mSource);
+ out.writeInt(mDisplayId);
out.writeInt(mAction);
out.writeInt(mKeyCode);
out.writeInt(mRepeatCount);
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 1d7c1dedc62e..344806aa4d50 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -16,11 +16,14 @@
package android.view;
+import static android.view.Display.DEFAULT_DISPLAY;
+
import android.annotation.TestApi;
import android.graphics.Matrix;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
+import android.util.Log;
import android.util.SparseArray;
import dalvik.annotation.optimization.CriticalNative;
@@ -172,6 +175,7 @@ import java.util.Objects;
* </p>
*/
public final class MotionEvent extends InputEvent implements Parcelable {
+ private static final String TAG = "MotionEvent";
private static final long NS_PER_MS = 1000000;
private static final String LABEL_PREFIX = "AXIS_";
@@ -1470,7 +1474,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
private MotionEvent mNext;
private static native long nativeInitialize(long nativePtr,
- int deviceId, int source, int action, int flags, int edgeFlags,
+ int deviceId, int source, int displayId, int action, int flags, int edgeFlags,
int metaState, int buttonState,
float xOffset, float yOffset, float xPrecision, float yPrecision,
long downTimeNanos, long eventTimeNanos,
@@ -1514,7 +1518,11 @@ public final class MotionEvent extends InputEvent implements Parcelable {
@CriticalNative
private static native int nativeGetSource(long nativePtr);
@CriticalNative
- private static native int nativeSetSource(long nativePtr, int source);
+ private static native void nativeSetSource(long nativePtr, int source);
+ @CriticalNative
+ private static native int nativeGetDisplayId(long nativePtr);
+ @CriticalNative
+ private static native void nativeSetDisplayId(long nativePtr, int displayId);
@CriticalNative
private static native int nativeGetAction(long nativePtr);
@CriticalNative
@@ -1623,19 +1631,26 @@ public final class MotionEvent extends InputEvent implements Parcelable {
* @param edgeFlags A bitfield indicating which edges, if any, were touched by this
* MotionEvent.
* @param source The source of this event.
+ * @param displayId The display ID associated with this event.
* @param flags The motion event flags.
+ * @hide
*/
static public MotionEvent obtain(long downTime, long eventTime,
int action, int pointerCount, PointerProperties[] pointerProperties,
PointerCoords[] pointerCoords, int metaState, int buttonState,
float xPrecision, float yPrecision, int deviceId,
- int edgeFlags, int source, int flags) {
+ int edgeFlags, int source, int displayId, int flags) {
MotionEvent ev = obtain();
ev.mNativePtr = nativeInitialize(ev.mNativePtr,
- deviceId, source, action, flags, edgeFlags, metaState, buttonState,
+ deviceId, source, displayId, action, flags, edgeFlags, metaState, buttonState,
0, 0, xPrecision, yPrecision,
downTime * NS_PER_MS, eventTime * NS_PER_MS,
pointerCount, pointerProperties, pointerCoords);
+ if (ev.mNativePtr == 0) {
+ Log.e(TAG, "Could not initialize MotionEvent");
+ ev.recycle();
+ return null;
+ }
return ev;
}
@@ -1649,6 +1664,44 @@ public final class MotionEvent extends InputEvent implements Parcelable {
* must be obtained from {@link SystemClock#uptimeMillis()}.
* @param action The kind of action being performed, such as {@link #ACTION_DOWN}.
* @param pointerCount The number of pointers that will be in this event.
+ * @param pointerProperties An array of <em>pointerCount</em> values providing
+ * a {@link PointerProperties} property object for each pointer, which must
+ * include the pointer identifier.
+ * @param pointerCoords An array of <em>pointerCount</em> values providing
+ * a {@link PointerCoords} coordinate object for each pointer.
+ * @param metaState The state of any meta / modifier keys that were in effect when
+ * the event was generated.
+ * @param buttonState The state of buttons that are pressed.
+ * @param xPrecision The precision of the X coordinate being reported.
+ * @param yPrecision The precision of the Y coordinate being reported.
+ * @param deviceId The id for the device that this event came from. An id of
+ * zero indicates that the event didn't come from a physical device; other
+ * numbers are arbitrary and you shouldn't depend on the values.
+ * @param edgeFlags A bitfield indicating which edges, if any, were touched by this
+ * MotionEvent.
+ * @param source The source of this event.
+ * @param flags The motion event flags.
+ */
+ public static MotionEvent obtain(long downTime, long eventTime,
+ int action, int pointerCount, PointerProperties[] pointerProperties,
+ PointerCoords[] pointerCoords, int metaState, int buttonState,
+ float xPrecision, float yPrecision, int deviceId,
+ int edgeFlags, int source, int flags) {
+ return obtain(downTime, eventTime, action, pointerCount, pointerProperties, pointerCoords,
+ metaState, buttonState, xPrecision, yPrecision, deviceId, edgeFlags, source,
+ DEFAULT_DISPLAY, flags);
+ }
+
+ /**
+ * Create a new MotionEvent, filling in all of the basic values that
+ * define the motion.
+ *
+ * @param downTime The time (in ms) when the user originally pressed down to start
+ * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}.
+ * @param eventTime The the time (in ms) when this specific event was generated. This
+ * must be obtained from {@link SystemClock#uptimeMillis()}.
+ * @param action The kind of action being performed, such as {@link #ACTION_DOWN}.
+ * @param pointerCount The number of pointers that will be in this event.
* @param pointerIds An array of <em>pointerCount</em> values providing
* an identifier for each pointer.
* @param pointerCoords An array of <em>pointerCount</em> values providing
@@ -1733,7 +1786,8 @@ public final class MotionEvent extends InputEvent implements Parcelable {
pc[0].size = size;
ev.mNativePtr = nativeInitialize(ev.mNativePtr,
- deviceId, InputDevice.SOURCE_UNKNOWN, action, 0, edgeFlags, metaState, 0,
+ deviceId, InputDevice.SOURCE_UNKNOWN, DEFAULT_DISPLAY,
+ action, 0, edgeFlags, metaState, 0,
0, 0, xPrecision, yPrecision,
downTime * NS_PER_MS, eventTime * NS_PER_MS,
1, pp, pc);
@@ -1888,6 +1942,18 @@ public final class MotionEvent extends InputEvent implements Parcelable {
nativeSetSource(mNativePtr, source);
}
+ /** @hide */
+ @Override
+ public int getDisplayId() {
+ return nativeGetDisplayId(mNativePtr);
+ }
+
+ /** @hide */
+ @Override
+ public void setDisplayId(int displayId) {
+ nativeSetDisplayId(mNativePtr, displayId);
+ }
+
/**
* Return the kind of action being performed.
* Consider using {@link #getActionMasked} and {@link #getActionIndex} to retrieve
@@ -3023,7 +3089,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
/**
* Adds all of the movement samples of the specified event to this one if
* it is compatible. To be compatible, the event must have the same device id,
- * source, action, flags, pointer count, pointer properties.
+ * source, display id, action, flags, pointer count, pointer properties.
*
* Only applies to {@link #ACTION_MOVE} or {@link #ACTION_HOVER_MOVE} events.
*
@@ -3043,6 +3109,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
if (nativeGetDeviceId(mNativePtr) != nativeGetDeviceId(event.mNativePtr)
|| nativeGetSource(mNativePtr) != nativeGetSource(event.mNativePtr)
+ || nativeGetDisplayId(mNativePtr) != nativeGetDisplayId(event.mNativePtr)
|| nativeGetFlags(mNativePtr) != nativeGetFlags(event.mNativePtr)) {
return false;
}
@@ -3128,6 +3195,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
}
ev.mNativePtr = nativeInitialize(ev.mNativePtr,
nativeGetDeviceId(mNativePtr), nativeGetSource(mNativePtr),
+ nativeGetDisplayId(mNativePtr),
nativeGetAction(mNativePtr), nativeGetFlags(mNativePtr),
nativeGetEdgeFlags(mNativePtr), nativeGetMetaState(mNativePtr),
nativeGetButtonState(mNativePtr),
@@ -3172,7 +3240,6 @@ public final class MotionEvent extends InputEvent implements Parcelable {
>> ACTION_POINTER_INDEX_SHIFT;
int newActionPointerIndex = -1;
int newPointerCount = 0;
- int newIdBits = 0;
for (int i = 0; i < oldPointerCount; i++) {
nativeGetPointerProperties(mNativePtr, i, pp[newPointerCount]);
final int idBit = 1 << pp[newPointerCount].id;
@@ -3182,7 +3249,6 @@ public final class MotionEvent extends InputEvent implements Parcelable {
}
map[newPointerCount] = i;
newPointerCount += 1;
- newIdBits |= idBit;
}
}
@@ -3221,6 +3287,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
if (h == 0) {
ev.mNativePtr = nativeInitialize(ev.mNativePtr,
nativeGetDeviceId(mNativePtr), nativeGetSource(mNativePtr),
+ nativeGetDisplayId(mNativePtr),
newAction, nativeGetFlags(mNativePtr),
nativeGetEdgeFlags(mNativePtr), nativeGetMetaState(mNativePtr),
nativeGetButtonState(mNativePtr),
@@ -3266,6 +3333,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
msg.append(", downTime=").append(getDownTime());
msg.append(", deviceId=").append(getDeviceId());
msg.append(", source=0x").append(Integer.toHexString(getSource()));
+ msg.append(", displayId=").append(getDisplayId());
}
msg.append(" }");
return msg.toString();
diff --git a/core/java/android/view/RecordingCanvas.java b/core/java/android/view/RecordingCanvas.java
index f7a41ffa67e5..18cc10f5b2f2 100644
--- a/core/java/android/view/RecordingCanvas.java
+++ b/core/java/android/view/RecordingCanvas.java
@@ -34,6 +34,7 @@ import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.TemporaryBuffer;
import android.text.GraphicsOperations;
+import android.text.MeasuredParagraph;
import android.text.PrecomputedText;
import android.text.SpannableString;
import android.text.SpannedString;
@@ -500,21 +501,31 @@ public class RecordingCanvas extends Canvas {
((GraphicsOperations) text).drawTextRun(this, start, end,
contextStart, contextEnd, x, y, isRtl, paint);
} else {
- int contextLen = contextEnd - contextStart;
- int len = end - start;
- char[] buf = TemporaryBuffer.obtain(contextLen);
- TextUtils.getChars(text, contextStart, contextEnd, buf, 0);
- long measuredTextPtr = 0;
if (text instanceof PrecomputedText) {
- PrecomputedText mt = (PrecomputedText) text;
- int paraIndex = mt.findParaIndex(start);
- if (end <= mt.getParagraphEnd(paraIndex)) {
+ final PrecomputedText pt = (PrecomputedText) text;
+ final int paraIndex = pt.findParaIndex(start);
+ if (end <= pt.getParagraphEnd(paraIndex)) {
+ final int paraStart = pt.getParagraphStart(paraIndex);
+ final MeasuredParagraph mp = pt.getMeasuredParagraph(paraIndex);
// Only support if the target is in the same paragraph.
- measuredTextPtr = mt.getMeasuredParagraph(paraIndex).getNativePtr();
+ nDrawTextRun(mNativeCanvasWrapper,
+ mp.getChars(),
+ start - paraStart,
+ end - start,
+ contextStart - paraStart,
+ contextEnd - contextStart,
+ x, y, isRtl, paint.getNativeInstance(),
+ mp.getNativePtr());
+ return;
}
}
+ int contextLen = contextEnd - contextStart;
+ int len = end - start;
+ char[] buf = TemporaryBuffer.obtain(contextLen);
+ TextUtils.getChars(text, contextStart, contextEnd, buf, 0);
nDrawTextRun(mNativeCanvasWrapper, buf, start - contextStart, len,
- 0, contextLen, x, y, isRtl, paint.getNativeInstance(), measuredTextPtr);
+ 0, contextLen, x, y, isRtl, paint.getNativeInstance(),
+ 0 /* measured paragraph pointer */);
TemporaryBuffer.recycle(buf);
}
}
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index 7c25fac3974e..e0df59f57b31 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -16,6 +16,7 @@
package android.view;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Matrix;
@@ -29,6 +30,9 @@ import dalvik.annotation.optimization.FastNative;
import libcore.util.NativeAllocationRegistry;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* <p>A display list records a series of graphics related operations and can replay
* them later. Display lists are usually built by recording operations on a
@@ -139,7 +143,9 @@ public class RenderNode {
RenderNode.class.getClassLoader(), nGetNativeFinalizer(), 1024);
}
- // Do not access directly unless you are ThreadedRenderer
+ /** Not for general use; use only if you are ThreadedRenderer or DisplayListCanvas.
+ * @hide
+ */
final long mNativeRenderNode;
private final View mOwningView;
@@ -159,15 +165,6 @@ public class RenderNode {
}
/**
- * Immediately destroys the RenderNode
- * Only suitable for testing/benchmarking where waiting for the GC/finalizer
- * is not feasible.
- */
- public void destroy() {
- // TODO: Removed temporarily
- }
-
- /**
* Creates a new RenderNode that can be used to record batches of
* drawing operations, and store / apply render properties when drawn.
*
@@ -219,6 +216,14 @@ public class RenderNode {
}
/**
+ * Same as {@link #start(int, int)} but with the RenderNode's width & height
+ */
+ public DisplayListCanvas start() {
+ return DisplayListCanvas.obtain(this,
+ nGetWidth(mNativeRenderNode), nGetHeight(mNativeRenderNode));
+ }
+
+ /**
* Ends the recording for this display list. A display list cannot be
* replayed if recording is not finished. Calling this method marks
* the display list valid and {@link #isValid()} will return true.
@@ -251,13 +256,6 @@ public class RenderNode {
return nIsValid(mNativeRenderNode);
}
- long getNativeDisplayList() {
- if (!isValid()) {
- throw new IllegalStateException("The display list is not valid.");
- }
- return mNativeRenderNode;
- }
-
///////////////////////////////////////////////////////////////////////////
// Matrix manipulation
///////////////////////////////////////////////////////////////////////////
@@ -455,6 +453,25 @@ public class RenderNode {
return nSetHasOverlappingRendering(mNativeRenderNode, hasOverlappingRendering);
}
+ /** @hide */
+ @IntDef({USAGE_BACKGROUND})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface UsageHint {}
+
+ /** The default usage hint */
+ public static final int USAGE_UNKNOWN = 0;
+
+ /** Usage is background content */
+ public static final int USAGE_BACKGROUND = 1;
+
+ /**
+ * Provides a hint on what this RenderNode's display list content contains. This hint is used
+ * for automatic content transforms to improve accessibility or similar.
+ */
+ public void setUsageHint(@UsageHint int usageHint) {
+ nSetUsageHint(mNativeRenderNode, usageHint);
+ }
+
/**
* Indicates whether the content of this display list overlaps.
*
@@ -463,7 +480,6 @@ public class RenderNode {
* @see #setHasOverlappingRendering(boolean)
*/
public boolean hasOverlappingRendering() {
- //noinspection SimplifiableIfStatement
return nHasOverlappingRendering(mNativeRenderNode);
}
@@ -955,6 +971,8 @@ public class RenderNode {
private static native boolean nSetHasOverlappingRendering(long renderNode,
boolean hasOverlappingRendering);
@CriticalNative
+ private static native void nSetUsageHint(long renderNode, int usageHint);
+ @CriticalNative
private static native boolean nSetElevation(long renderNode, float lift);
@CriticalNative
private static native boolean nSetTranslationX(long renderNode, float translationX);
@@ -1009,4 +1027,8 @@ public class RenderNode {
private static native float nGetPivotX(long renderNode);
@CriticalNative
private static native float nGetPivotY(long renderNode);
+ @CriticalNative
+ private static native int nGetWidth(long renderNode);
+ @CriticalNative
+ private static native int nGetHeight(long renderNode);
}
diff --git a/core/java/android/view/RoundScrollbarRenderer.java b/core/java/android/view/RoundScrollbarRenderer.java
index 134851046ba6..df9e23e427f8 100644
--- a/core/java/android/view/RoundScrollbarRenderer.java
+++ b/core/java/android/view/RoundScrollbarRenderer.java
@@ -31,13 +31,14 @@ class RoundScrollbarRenderer {
private static final int MAX_SCROLLBAR_ANGLE_SWIPE = 16;
private static final int MIN_SCROLLBAR_ANGLE_SWIPE = 6;
private static final float WIDTH_PERCENTAGE = 0.02f;
- private static final int DEFAULT_THUMB_COLOR = 0x4CFFFFFF;
- private static final int DEFAULT_TRACK_COLOR = 0x26FFFFFF;
+ private static final int DEFAULT_THUMB_COLOR = 0xFFE8EAED;
+ private static final int DEFAULT_TRACK_COLOR = 0x4CFFFFFF;
private final Paint mThumbPaint = new Paint();
private final Paint mTrackPaint = new Paint();
private final RectF mRect = new RectF();
private final View mParent;
+ private final int mMaskThickness;
public RoundScrollbarRenderer(View parent) {
// Paints for the round scrollbar.
@@ -52,6 +53,12 @@ class RoundScrollbarRenderer {
mTrackPaint.setStyle(Paint.Style.STROKE);
mParent = parent;
+
+ // Fetch the resource indicating the thickness of CircularDisplayMask, rounding in the same
+ // way WindowManagerService.showCircularMask does. The scroll bar is inset by this amount so
+ // that it doesn't get clipped.
+ mMaskThickness = parent.getContext().getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.circular_display_mask_thickness);
}
public void drawRoundScrollbars(Canvas canvas, float alpha, Rect bounds) {
@@ -82,13 +89,13 @@ class RoundScrollbarRenderer {
startAngle = clamp(startAngle, -SCROLLBAR_ANGLE_RANGE / 2,
SCROLLBAR_ANGLE_RANGE / 2 - sweepAngle);
- // Draw the track and the scroll bar.
+ // Draw the track and the thumb.
+ float inset = thumbWidth / 2 + mMaskThickness;
mRect.set(
- bounds.left - thumbWidth / 2,
- bounds.top,
- bounds.right - thumbWidth / 2,
- bounds.bottom);
-
+ bounds.left + inset,
+ bounds.top + inset,
+ bounds.right - inset,
+ bounds.bottom - inset);
canvas.drawArc(mRect, -SCROLLBAR_ANGLE_RANGE / 2, SCROLLBAR_ANGLE_RANGE, false,
mTrackPaint);
canvas.drawArc(mRect, startAngle, sweepAngle, false, mThumbPaint);
diff --git a/core/java/android/view/SurfaceSession.java b/core/java/android/view/SurfaceSession.java
index b5912bc1e1c8..ee08bf759511 100644
--- a/core/java/android/view/SurfaceSession.java
+++ b/core/java/android/view/SurfaceSession.java
@@ -37,7 +37,12 @@ public final class SurfaceSession {
}
public SurfaceSession(Surface root) {
- mNativeClient = nativeCreateScoped(root.mNativeObject);
+ synchronized (root.mLock) {
+ if (root.mNativeObject == 0) {
+ throw new IllegalStateException("Surface is not initialized or has been released");
+ }
+ mNativeClient = nativeCreateScoped(root.mNativeObject);
+ }
}
/* no user serviceable parts here ... */
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 5b61015e9d42..2f975b68b985 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -793,15 +793,11 @@ public final class ThreadedRenderer {
*/
void draw(View view, AttachInfo attachInfo, DrawCallbacks callbacks,
FrameDrawingCallback frameDrawingCallback) {
- attachInfo.mIgnoreDirtyState = true;
-
final Choreographer choreographer = attachInfo.mViewRootImpl.mChoreographer;
choreographer.mFrameInfo.markDrawStart();
updateRootDisplayList(view, callbacks);
- attachInfo.mIgnoreDirtyState = false;
-
// register animating rendernodes which started animating prior to renderer
// creation, which is typical for animators started prior to first draw
if (attachInfo.mPendingAnimatingRenderNodes != null) {
@@ -854,7 +850,9 @@ public final class ThreadedRenderer {
void buildLayer(RenderNode node) {
- nBuildLayer(mNativeProxy, node.getNativeDisplayList());
+ if (node.isValid()) {
+ nBuildLayer(mNativeProxy, node.mNativeRenderNode);
+ }
}
@@ -916,10 +914,6 @@ public final class ThreadedRenderer {
animator.getAnimatorNativePtr());
}
- public void serializeDisplayListTree() {
- nSerializeDisplayListTree(mNativeProxy);
- }
-
public static int copySurfaceInto(Surface surface, Rect srcRect, Bitmap bitmap) {
if (srcRect == null) {
// Empty rect means entire surface
@@ -936,7 +930,7 @@ public final class ThreadedRenderer {
* not the RenderNode from a View.
**/
public static Bitmap createHardwareBitmap(RenderNode node, int width, int height) {
- return nCreateHardwareBitmap(node.getNativeDisplayList(), width, height);
+ return nCreateHardwareBitmap(node.mNativeRenderNode, width, height);
}
/**
@@ -1223,8 +1217,6 @@ public final class ThreadedRenderer {
private static native void nStopDrawing(long nativeProxy);
private static native void nNotifyFramePending(long nativeProxy);
- private static native void nSerializeDisplayListTree(long nativeProxy);
-
private static native void nDumpProfileInfo(long nativeProxy, FileDescriptor fd,
@DumpFlags int dumpFlags);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 991ba74c0dd0..030b36e1bf60 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -788,6 +788,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
protected static final String VIEW_LOG_TAG = "View";
/**
+ * The logging tag used by this class when logging verbose, autofill-related messages.
+ */
+ // NOTE: We cannot use android.view.autofill.Helper.sVerbose because that variable is not
+ // set if a session is not started.
+ private static final String AUTOFILL_LOG_TAG = "View.Autofill";
+
+ /**
* When set to true, apps will draw debugging information about their layouts.
*
* @hide
@@ -2297,19 +2304,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
static final int PFLAG_DIRTY = 0x00200000;
/**
- * View flag indicating whether this view was invalidated by an opaque
- * invalidate request.
+ * Mask for {@link #PFLAG_DIRTY}.
*
* @hide
*/
- static final int PFLAG_DIRTY_OPAQUE = 0x00400000;
-
- /**
- * Mask for {@link #PFLAG_DIRTY} and {@link #PFLAG_DIRTY_OPAQUE}.
- *
- * @hide
- */
- static final int PFLAG_DIRTY_MASK = 0x00600000;
+ static final int PFLAG_DIRTY_MASK = 0x00200000;
/**
* Indicates whether the background is opaque.
@@ -3429,7 +3428,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see WindowManager.LayoutParams#layoutInDisplayCutoutMode
* @see WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
- * @see WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+ * @see WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
* @see WindowManager.LayoutParams#LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
*/
public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 0x00000400;
@@ -3833,7 +3832,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
name = "DRAWING_CACHE_INVALID", outputIf = false),
@ViewDebug.FlagToString(mask = PFLAG_DRAWN, equals = PFLAG_DRAWN, name = "DRAWN", outputIf = true),
@ViewDebug.FlagToString(mask = PFLAG_DRAWN, equals = PFLAG_DRAWN, name = "NOT_DRAWN", outputIf = false),
- @ViewDebug.FlagToString(mask = PFLAG_DIRTY_MASK, equals = PFLAG_DIRTY_OPAQUE, name = "DIRTY_OPAQUE"),
@ViewDebug.FlagToString(mask = PFLAG_DIRTY_MASK, equals = PFLAG_DIRTY, name = "DIRTY")
}, formatToHexString = true)
@@ -6121,14 +6119,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
x += getScrollX();
y += getScrollY();
- if (isVerticalScrollBarEnabled() && !isVerticalScrollBarHidden()) {
+ final boolean canScrollVertically =
+ computeVerticalScrollRange() > computeVerticalScrollExtent();
+ if (isVerticalScrollBarEnabled() && !isVerticalScrollBarHidden() && canScrollVertically) {
final Rect touchBounds = mScrollCache.mScrollBarTouchBounds;
getVerticalScrollBarBounds(null, touchBounds);
if (touchBounds.contains((int) x, (int) y)) {
return true;
}
}
- if (isHorizontalScrollBarEnabled()) {
+ final boolean canScrollHorizontally =
+ computeHorizontalScrollRange() > computeHorizontalScrollExtent();
+ if (isHorizontalScrollBarEnabled() && canScrollHorizontally) {
final Rect touchBounds = mScrollCache.mScrollBarTouchBounds;
getHorizontalScrollBarBounds(null, touchBounds);
if (touchBounds.contains((int) x, (int) y)) {
@@ -6143,18 +6145,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
private boolean isOnVerticalScrollbarThumb(float x, float y) {
- if (mScrollCache == null) {
+ if (mScrollCache == null || !isVerticalScrollBarEnabled() || isVerticalScrollBarHidden()) {
return false;
}
- if (isVerticalScrollBarEnabled() && !isVerticalScrollBarHidden()) {
+ final int range = computeVerticalScrollRange();
+ final int extent = computeVerticalScrollExtent();
+ if (range > extent) {
x += getScrollX();
y += getScrollY();
final Rect bounds = mScrollCache.mScrollBarBounds;
final Rect touchBounds = mScrollCache.mScrollBarTouchBounds;
getVerticalScrollBarBounds(bounds, touchBounds);
- final int range = computeVerticalScrollRange();
final int offset = computeVerticalScrollOffset();
- final int extent = computeVerticalScrollExtent();
final int thumbLength = ScrollBarUtils.getThumbLength(bounds.height(), bounds.width(),
extent, range);
final int thumbOffset = ScrollBarUtils.getThumbOffset(bounds.height(), thumbLength,
@@ -6170,18 +6172,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
private boolean isOnHorizontalScrollbarThumb(float x, float y) {
- if (mScrollCache == null) {
+ if (mScrollCache == null || !isHorizontalScrollBarEnabled()) {
return false;
}
- if (isHorizontalScrollBarEnabled()) {
+ final int range = computeHorizontalScrollRange();
+ final int extent = computeHorizontalScrollExtent();
+ if (range > extent) {
x += getScrollX();
y += getScrollY();
final Rect bounds = mScrollCache.mScrollBarBounds;
final Rect touchBounds = mScrollCache.mScrollBarTouchBounds;
getHorizontalScrollBarBounds(bounds, touchBounds);
- final int range = computeHorizontalScrollRange();
final int offset = computeHorizontalScrollOffset();
- final int extent = computeHorizontalScrollExtent();
+
final int thumbLength = ScrollBarUtils.getThumbLength(bounds.width(), bounds.height(),
extent, range);
final int thumbOffset = ScrollBarUtils.getThumbOffset(bounds.width(), thumbLength,
@@ -7544,7 +7547,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
if ((event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)
- && !TextUtils.isEmpty(getAccessibilityPaneTitle())) {
+ && isAccessibilityPane()) {
event.getText().add(getAccessibilityPaneTitle());
}
}
@@ -7988,10 +7991,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private void onProvideVirtualStructureCompat(ViewStructure structure, boolean forAutofill) {
final AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
if (provider != null) {
- if (android.view.autofill.Helper.sVerbose && forAutofill) {
- Log.v(VIEW_LOG_TAG, "onProvideVirtualStructureCompat() for " + this);
+ if (forAutofill && Log.isLoggable(AUTOFILL_LOG_TAG, Log.VERBOSE)) {
+ Log.v(AUTOFILL_LOG_TAG, "onProvideVirtualStructureCompat() for " + this);
}
-
final AccessibilityNodeInfo info = createAccessibilityNodeInfo();
structure.setChildCount(1);
final ViewStructure root = structure.newChild(0);
@@ -8229,8 +8231,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
public void setAutofillId(@Nullable AutofillId id) {
// TODO(b/37566627): add unit / CTS test for all possible combinations below
- if (android.view.autofill.Helper.sVerbose) {
- Log.v(VIEW_LOG_TAG, "setAutofill(): from " + mAutofillId + " to " + id);
+ if (Log.isLoggable(AUTOFILL_LOG_TAG, Log.VERBOSE)) {
+ Log.v(AUTOFILL_LOG_TAG, "setAutofill(): from " + mAutofillId + " to " + id);
}
if (isAttachedToWindow()) {
throw new IllegalStateException("Cannot set autofill id when view is attached");
@@ -8433,6 +8435,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
final int parentImportance = ((View) parent).getImportantForAutofill();
if (parentImportance == IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS
|| parentImportance == IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS) {
+ if (Log.isLoggable(AUTOFILL_LOG_TAG, Log.VERBOSE)) {
+ Log.v(AUTOFILL_LOG_TAG, "View (autofillId=" + getAutofillViewId() + ", "
+ + getClass() + ") is not important for autofill because parent "
+ + parent + "'s importance is " + parentImportance);
+ }
return false;
}
parent = parent.getParent();
@@ -11914,6 +11921,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if ((getVisibility() == VISIBLE)
|| (changeType == AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED)) {
final AccessibilityEvent event = AccessibilityEvent.obtain();
+ onInitializeAccessibilityEvent(event);
event.setEventType(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
event.setContentChangeTypes(changeType);
event.setSource(this);
@@ -12956,7 +12964,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
}
}
- if (!TextUtils.isEmpty(getAccessibilityPaneTitle())) {
+ if (isAccessibilityPane()) {
if (isVisible != oldVisible) {
notifyViewAccessibilityStateChangedIfNeeded(isVisible
? AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_APPEARED
@@ -17316,7 +17324,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #computeHorizontalScrollExtent()
* @see #computeHorizontalScrollOffset()
- * @see android.widget.ScrollBarDrawable
*/
protected int computeHorizontalScrollRange() {
return getWidth();
@@ -17337,7 +17344,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #computeHorizontalScrollRange()
* @see #computeHorizontalScrollExtent()
- * @see android.widget.ScrollBarDrawable
*/
protected int computeHorizontalScrollOffset() {
return mScrollX;
@@ -17358,7 +17364,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #computeHorizontalScrollRange()
* @see #computeHorizontalScrollOffset()
- * @see android.widget.ScrollBarDrawable
*/
protected int computeHorizontalScrollExtent() {
return getWidth();
@@ -17377,7 +17382,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #computeVerticalScrollExtent()
* @see #computeVerticalScrollOffset()
- * @see android.widget.ScrollBarDrawable
*/
protected int computeVerticalScrollRange() {
return getHeight();
@@ -17398,7 +17402,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #computeVerticalScrollRange()
* @see #computeVerticalScrollExtent()
- * @see android.widget.ScrollBarDrawable
*/
protected int computeVerticalScrollOffset() {
return mScrollY;
@@ -17419,7 +17422,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #computeVerticalScrollRange()
* @see #computeVerticalScrollOffset()
- * @see android.widget.ScrollBarDrawable
*/
protected int computeVerticalScrollExtent() {
return getHeight();
@@ -17754,7 +17756,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #computeHorizontalScrollRange()
* @see #computeHorizontalScrollExtent()
* @see #computeHorizontalScrollOffset()
- * @see android.widget.ScrollBarDrawable
* @hide
*/
protected void onDrawHorizontalScrollBar(Canvas canvas, Drawable scrollBar,
@@ -17774,7 +17775,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @see #computeVerticalScrollRange()
* @see #computeVerticalScrollExtent()
* @see #computeVerticalScrollOffset()
- * @see android.widget.ScrollBarDrawable
* @hide
*/
protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
@@ -18657,10 +18657,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if ((mPrivateFlags3 & PFLAG3_AUTOFILLID_EXPLICITLY_SET) != 0) {
// Ignore when view already set it through setAutofillId();
- if (android.view.autofill.Helper.sDebug) {
- Log.d(VIEW_LOG_TAG, "onRestoreInstanceState(): not setting autofillId to "
- + baseState.mAutofillViewId + " because view explicitly set it to "
- + mAutofillId);
+ if (Log.isLoggable(AUTOFILL_LOG_TAG, Log.DEBUG)) {
+ Log.d(AUTOFILL_LOG_TAG, "onRestoreInstanceState(): not setting autofillId "
+ + "to " + baseState.mAutofillViewId + " because view explicitly set"
+ + " it to " + mAutofillId);
}
} else {
mAutofillViewId = baseState.mAutofillViewId;
@@ -20179,8 +20179,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@CallSuper
public void draw(Canvas canvas) {
final int privateFlags = mPrivateFlags;
- final boolean dirtyOpaque = (privateFlags & PFLAG_DIRTY_MASK) == PFLAG_DIRTY_OPAQUE &&
- (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState);
mPrivateFlags = (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN;
/*
@@ -20198,9 +20196,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// Step 1, draw the background, if needed
int saveCount;
- if (!dirtyOpaque) {
- drawBackground(canvas);
- }
+ drawBackground(canvas);
// skip step 2 & 5 if possible (common case)
final int viewFlags = mViewFlags;
@@ -20208,7 +20204,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;
if (!verticalEdges && !horizontalEdges) {
// Step 3, draw the content
- if (!dirtyOpaque) onDraw(canvas);
+ onDraw(canvas);
// Step 4, draw the children
dispatchDraw(canvas);
@@ -20322,7 +20318,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
// Step 3, draw the content
- if (!dirtyOpaque) onDraw(canvas);
+ onDraw(canvas);
// Step 4, draw the children
dispatchDraw(canvas);
@@ -20450,6 +20446,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private RenderNode getDrawableRenderNode(Drawable drawable, RenderNode renderNode) {
if (renderNode == null) {
renderNode = RenderNode.create(drawable.getClass().getName(), this);
+ renderNode.setUsageHint(RenderNode.USAGE_BACKGROUND);
}
final Rect bounds = drawable.getBounds();
@@ -24006,6 +24003,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
Log.w(VIEW_LOG_TAG, "startDragAndDrop called on a detached view.");
return false;
}
+ if (!mAttachInfo.mViewRootImpl.mSurface.isValid()) {
+ Log.w(VIEW_LOG_TAG, "startDragAndDrop called with an invalid surface.");
+ return false;
+ }
if (data != null) {
data.prepareToLeaveProcess((flags & View.DRAG_FLAG_GLOBAL) != 0);
@@ -26480,17 +26481,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
long mDrawingTime;
/**
- * Indicates whether or not ignoring the DIRTY_MASK flags.
- */
- boolean mIgnoreDirtyState;
-
- /**
- * This flag tracks when the mIgnoreDirtyState flag is set during draw(),
- * to avoid clearing that flag prematurely.
- */
- boolean mSetIgnoreDirtyState = false;
-
- /**
* Indicates whether the view's window is currently in touch mode.
*/
boolean mInTouchMode;
@@ -27152,7 +27142,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param arguments A {@link Bundle} holding any arguments relevant for this request.
* May be {@code null} if the if the service provided no arguments.
*
- * @see AccessibilityNodeInfo#setExtraAvailableData
+ * @see AccessibilityNodeInfo#setAvailableExtraData(List)
*/
public void addExtraDataToAccessibilityNodeInfo(@NonNull View host,
@NonNull AccessibilityNodeInfo info, @NonNull String extraDataKey,
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 276f50a51e66..e4c595b4f53b 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -531,7 +531,6 @@ public class ViewDebug {
throws IOException {
RenderNode node = RenderNode.create("ViewDebug", null);
profileViewAndChildren(view, node, out, true);
- node.destroy();
}
private static void profileViewAndChildren(View view, RenderNode node, BufferedWriter out,
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index baa38bb2f604..d0539ae30719 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -4652,7 +4652,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
* which is added in order to fade it out in its old location should be removed
* once the animation is complete.</p>
*
- * @param view The view to be added
+ * @param view The view to be added. The view must not have a parent.
* @param index The index at which this view should be drawn, must be >= 0.
* This value is relative to the {@link #getChildAt(int) index} values in the normal
* child list of this container, where any transient view at a particular index will
@@ -4661,9 +4661,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
* @hide
*/
public void addTransientView(View view, int index) {
- if (index < 0) {
+ if (index < 0 || view == null) {
return;
}
+ if (view.mParent != null) {
+ throw new IllegalStateException("The specified view already has a parent "
+ + view.mParent);
+ }
+
if (mTransientIndices == null) {
mTransientIndices = new ArrayList<Integer>();
mTransientViews = new ArrayList<View>();
@@ -4683,7 +4688,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
mTransientViews.add(view);
}
view.mParent = this;
- view.dispatchAttachedToWindow(mAttachInfo, (mViewFlags&VISIBILITY_MASK));
+ if (mAttachInfo != null) {
+ view.dispatchAttachedToWindow(mAttachInfo, (mViewFlags & VISIBILITY_MASK));
+ }
invalidate(true);
}
@@ -4705,7 +4712,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
mTransientViews.remove(i);
mTransientIndices.remove(i);
view.mParent = null;
- view.dispatchDetachedFromWindow();
+ if (view.mAttachInfo != null) {
+ view.dispatchDetachedFromWindow();
+ }
invalidate(true);
return;
}
@@ -5853,11 +5862,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
// Views being animated or transformed are not considered opaque because we may
// be invalidating their old position and need the parent to paint behind them.
Matrix childMatrix = child.getMatrix();
- final boolean isOpaque = child.isOpaque() && !drawAnimation &&
- child.getAnimation() == null && childMatrix.isIdentity();
// Mark the child as dirty, using the appropriate flag
// Make sure we do not set both flags at the same time
- int opaqueFlag = isOpaque ? PFLAG_DIRTY_OPAQUE : PFLAG_DIRTY;
if (child.mLayerType != LAYER_TYPE_NONE) {
mPrivateFlags |= PFLAG_INVALIDATED;
@@ -5911,12 +5917,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
// If the parent is dirty opaque or not dirty, mark it dirty with the opaque
// flag coming from the child that initiated the invalidate
if (view != null) {
- if ((view.mViewFlags & FADING_EDGE_MASK) != 0 &&
- view.getSolidColor() == 0) {
- opaqueFlag = PFLAG_DIRTY;
- }
if ((view.mPrivateFlags & PFLAG_DIRTY_MASK) != PFLAG_DIRTY) {
- view.mPrivateFlags = (view.mPrivateFlags & ~PFLAG_DIRTY_MASK) | opaqueFlag;
+ view.mPrivateFlags = (view.mPrivateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DIRTY;
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 96c48915d011..38f34a114d56 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1304,10 +1304,6 @@ public final class ViewRootImpl implements ViewParent,
private void invalidateRectOnScreen(Rect dirty) {
final Rect localDirty = mDirty;
- if (!localDirty.isEmpty() && !localDirty.contains(dirty)) {
- mAttachInfo.mSetIgnoreDirtyState = true;
- mAttachInfo.mIgnoreDirtyState = true;
- }
// Add the new dirty rect to the current one
localDirty.union(dirty.left, dirty.top, dirty.right, dirty.bottom);
@@ -1350,6 +1346,7 @@ public final class ViewRootImpl implements ViewParent,
renderer.setStopped(mStopped);
}
if (!mStopped) {
+ mNewSurfaceNeeded = true;
scheduleTraversals();
} else {
if (renderer != null) {
@@ -2999,9 +2996,6 @@ public final class ViewRootImpl implements ViewParent,
*/
void outputDisplayList(View view) {
view.mRenderNode.output();
- if (mAttachInfo.mThreadedRenderer != null) {
- mAttachInfo.mThreadedRenderer.serializeDisplayListTree();
- }
}
/**
@@ -3239,7 +3233,6 @@ public final class ViewRootImpl implements ViewParent,
}
if (fullRedrawNeeded) {
- mAttachInfo.mIgnoreDirtyState = true;
dirty.set(0, 0, (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f));
}
@@ -3393,13 +3386,6 @@ public final class ViewRootImpl implements ViewParent,
canvas = mSurface.lockCanvas(dirty);
- // The dirty rectangle can be modified by Surface.lockCanvas()
- //noinspection ConstantConditions
- if (left != dirty.left || top != dirty.top || right != dirty.right
- || bottom != dirty.bottom) {
- attachInfo.mIgnoreDirtyState = true;
- }
-
// TODO: Do this in native
canvas.setDensity(mDensity);
} catch (Surface.OutOfResourcesException e) {
@@ -3445,23 +3431,15 @@ public final class ViewRootImpl implements ViewParent,
", metrics=" + cxt.getResources().getDisplayMetrics() +
", compatibilityInfo=" + cxt.getResources().getCompatibilityInfo());
}
- try {
- canvas.translate(-xoff, -yoff);
- if (mTranslator != null) {
- mTranslator.translateCanvas(canvas);
- }
- canvas.setScreenDensity(scalingRequired ? mNoncompatDensity : 0);
- attachInfo.mSetIgnoreDirtyState = false;
+ canvas.translate(-xoff, -yoff);
+ if (mTranslator != null) {
+ mTranslator.translateCanvas(canvas);
+ }
+ canvas.setScreenDensity(scalingRequired ? mNoncompatDensity : 0);
- mView.draw(canvas);
+ mView.draw(canvas);
- drawAccessibilityFocusedDrawableIfNeeded(canvas);
- } finally {
- if (!attachInfo.mSetIgnoreDirtyState) {
- // Only clear the flag if it was not set during the mView.draw() call
- attachInfo.mIgnoreDirtyState = false;
- }
- }
+ drawAccessibilityFocusedDrawableIfNeeded(canvas);
} finally {
try {
surface.unlockCanvasAndPost(canvas);
@@ -7216,7 +7194,7 @@ public final class ViewRootImpl implements ViewParent,
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
enqueueInputEvent(event, this, 0, true);
}
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 93b3fc25509a..78e42047ee86 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -40,7 +40,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
-import android.os.SystemProperties;
import android.transition.Scene;
import android.transition.Transition;
import android.transition.TransitionManager;
@@ -252,8 +251,6 @@ public abstract class Window {
*/
public static final int ID_ANDROID_CONTENT = com.android.internal.R.id.content;
- private static final String PROPERTY_HARDWARE_UI = "persist.sys.ui.hw";
-
/**
* Flag for letting the theme drive the color of the window caption controls. Use with
* {@link #setDecorCaptionShade(int)}. This is the default value.
@@ -758,8 +755,7 @@ public abstract class Window {
boolean hardwareAccelerated) {
mAppToken = appToken;
mAppName = appName;
- mHardwareAccelerated = hardwareAccelerated
- || SystemProperties.getBoolean(PROPERTY_HARDWARE_UI, false);
+ mHardwareAccelerated = hardwareAccelerated;
if (wm == null) {
wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
}
@@ -1661,7 +1657,7 @@ public abstract class Window {
*
* @return Returns the top-level window decor view.
*/
- public abstract View getDecorView();
+ public abstract @NonNull View getDecorView();
/**
* Retrieve the current decor view, but only if it has already been created;
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index fc34a25cabc9..8c7ac731b3e3 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -486,7 +486,6 @@ public interface WindowManager extends ViewManager {
* @see #TYPE_APPLICATION_PANEL
* @see #TYPE_APPLICATION_MEDIA
* @see #TYPE_APPLICATION_SUB_PANEL
- * @see #TYPE_APPLICATION_ABOVE_SUB_PANEL
* @see #TYPE_APPLICATION_ATTACHED_DIALOG
* @see #TYPE_STATUS_BAR
* @see #TYPE_SEARCH_BAR
@@ -1693,6 +1692,15 @@ public interface WindowManager extends ViewManager {
public static final int PRIVATE_FLAG_IS_SCREEN_DECOR = 0x00400000;
/**
+ * Flag to indicate that the status bar window is now in an explicit expanded state, meaning
+ * that status bar will not be hidden by any window with flag {@link #FLAG_FULLSCREEN} or
+ * {@link View#SYSTEM_UI_FLAG_FULLSCREEN} set.
+ * This can only be set by {@link LayoutParams#TYPE_STATUS_BAR}.
+ * @hide
+ */
+ public static final int PRIVATE_FLAG_STATUS_BAR_EXPANDED = 0x00800000;
+
+ /**
* Control flags that are private to the platform.
* @hide
*/
@@ -1780,7 +1788,11 @@ public interface WindowManager extends ViewManager {
@ViewDebug.FlagToString(
mask = PRIVATE_FLAG_IS_SCREEN_DECOR,
equals = PRIVATE_FLAG_IS_SCREEN_DECOR,
- name = "IS_SCREEN_DECOR")
+ name = "IS_SCREEN_DECOR"),
+ @ViewDebug.FlagToString(
+ mask = PRIVATE_FLAG_STATUS_BAR_EXPANDED,
+ equals = PRIVATE_FLAG_STATUS_BAR_EXPANDED,
+ name = "STATUS_BAR_EXPANDED")
})
@TestApi
public int privateFlags;
diff --git a/core/java/android/view/WindowManagerPolicyConstants.java b/core/java/android/view/WindowManagerPolicyConstants.java
index 23dc9da694a6..260e93890e3e 100644
--- a/core/java/android/view/WindowManagerPolicyConstants.java
+++ b/core/java/android/view/WindowManagerPolicyConstants.java
@@ -16,8 +16,6 @@
package android.view;
-import static android.view.Display.DEFAULT_DISPLAY;
-
/**
* Constants for interfacing with WindowManagerService and WindowManagerPolicyInternal.
* @hide
@@ -81,15 +79,6 @@ public interface WindowManagerPolicyConstants {
* copy() must be made and the copy must be recycled.
**/
void onPointerEvent(MotionEvent motionEvent);
-
- /**
- * @see #onPointerEvent(MotionEvent)
- **/
- default void onPointerEvent(MotionEvent motionEvent, int displayId) {
- if (displayId == DEFAULT_DISPLAY) {
- onPointerEvent(motionEvent);
- }
- }
}
/** Screen turned off because of a device admin */
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index 7946e9e2f63d..a6b8eb3ebf75 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -481,7 +481,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
/**
* Represents the event of scrolling a view. This event type is generally not sent directly.
- * @see View#onScrollChanged(int, int, int, int)
+ * @see android.view.View#onScrollChanged(int, int, int, int)
*/
public static final int TYPE_VIEW_SCROLLED = 0x00001000;
@@ -686,7 +686,9 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
CONTENT_CHANGE_TYPE_SUBTREE,
CONTENT_CHANGE_TYPE_TEXT,
CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION,
- CONTENT_CHANGE_TYPE_PANE_TITLE
+ CONTENT_CHANGE_TYPE_PANE_TITLE,
+ CONTENT_CHANGE_TYPE_PANE_APPEARED,
+ CONTENT_CHANGE_TYPE_PANE_DISAPPEARED
})
public @interface ContentChangeTypes {}
@@ -875,6 +877,8 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
* <li>{@link #CONTENT_CHANGE_TYPE_TEXT}
* <li>{@link #CONTENT_CHANGE_TYPE_PANE_TITLE}
* <li>{@link #CONTENT_CHANGE_TYPE_UNDEFINED}
+ * <li>{@link #CONTENT_CHANGE_TYPE_PANE_APPEARED}
+ * <li>{@link #CONTENT_CHANGE_TYPE_PANE_DISAPPEARED}
* </ul>
*/
@ContentChangeTypes
@@ -888,13 +892,15 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
private static String singleContentChangeTypeToString(int type) {
switch (type) {
- case CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION: {
+ case CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION:
return "CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION";
- }
case CONTENT_CHANGE_TYPE_SUBTREE: return "CONTENT_CHANGE_TYPE_SUBTREE";
case CONTENT_CHANGE_TYPE_TEXT: return "CONTENT_CHANGE_TYPE_TEXT";
case CONTENT_CHANGE_TYPE_PANE_TITLE: return "CONTENT_CHANGE_TYPE_PANE_TITLE";
case CONTENT_CHANGE_TYPE_UNDEFINED: return "CONTENT_CHANGE_TYPE_UNDEFINED";
+ case CONTENT_CHANGE_TYPE_PANE_APPEARED: return "CONTENT_CHANGE_TYPE_PANE_APPEARED";
+ case CONTENT_CHANGE_TYPE_PANE_DISAPPEARED:
+ return "CONTENT_CHANGE_TYPE_PANE_DISAPPEARED";
default: return Integer.toHexString(type);
}
}
@@ -945,6 +951,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
return "WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED";
case WINDOWS_CHANGE_PARENT: return "WINDOWS_CHANGE_PARENT";
case WINDOWS_CHANGE_CHILDREN: return "WINDOWS_CHANGE_CHILDREN";
+ case WINDOWS_CHANGE_PIP: return "WINDOWS_CHANGE_PIP";
default: return Integer.toHexString(type);
}
}
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 6bacdfe052a5..eee3630c2266 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -577,7 +577,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* Integer argument specifying the start index of the requested text location data. Must be
* valid inside the CharSequence returned by {@link #getText()}.
*
- * {@see EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY}
+ * @see #EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
*/
public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX =
"android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
@@ -586,7 +586,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* Integer argument specifying the end index of the requested text location data. Must be
* positive.
*
- * {@see EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY}
+ * @see #EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
*/
public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH =
"android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
@@ -601,22 +601,14 @@ public class AccessibilityNodeInfo implements Parcelable {
private static final int BOOLEAN_PROPERTY_CHECKED = 0x00000002;
- private static final int BOOLEAN_PROPERTY_FOCUSABLE = 0x00000004;
-
private static final int BOOLEAN_PROPERTY_FOCUSED = 0x00000008;
private static final int BOOLEAN_PROPERTY_SELECTED = 0x00000010;
- private static final int BOOLEAN_PROPERTY_CLICKABLE = 0x00000020;
-
- private static final int BOOLEAN_PROPERTY_LONG_CLICKABLE = 0x00000040;
-
private static final int BOOLEAN_PROPERTY_ENABLED = 0x00000080;
private static final int BOOLEAN_PROPERTY_PASSWORD = 0x00000100;
- private static final int BOOLEAN_PROPERTY_SCROLLABLE = 0x00000200;
-
private static final int BOOLEAN_PROPERTY_ACCESSIBILITY_FOCUSED = 0x00000400;
private static final int BOOLEAN_PROPERTY_VISIBLE_TO_USER = 0x00000800;
@@ -631,8 +623,6 @@ public class AccessibilityNodeInfo implements Parcelable {
private static final int BOOLEAN_PROPERTY_CONTENT_INVALID = 0x00010000;
- private static final int BOOLEAN_PROPERTY_CONTEXT_CLICKABLE = 0x00020000;
-
private static final int BOOLEAN_PROPERTY_IMPORTANCE = 0x0040000;
private static final int BOOLEAN_PROPERTY_SCREEN_READER_FOCUSABLE = 0x0080000;
@@ -1168,6 +1158,10 @@ public class AccessibilityNodeInfo implements Parcelable {
mActions.add(action);
}
+ private boolean hasActionWithId(int actionId) {
+ return getActionList().stream().anyMatch(action -> action.getId() == actionId);
+ }
+
/**
* Adds an action that can be performed on the node.
* <p>
@@ -1767,7 +1761,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* @return True if the node is focusable.
*/
public boolean isFocusable() {
- return getBooleanProperty(BOOLEAN_PROPERTY_FOCUSABLE);
+ return hasActionWithId(ACTION_FOCUS);
}
/**
@@ -1781,10 +1775,11 @@ public class AccessibilityNodeInfo implements Parcelable {
* @param focusable True if the node is focusable.
*
* @throws IllegalStateException If called from an AccessibilityService.
+ * @deprecated Use {@link #addAction(AccessibilityAction)}
+ * with {@link AccessibilityAction#ACTION_FOCUS}
*/
- public void setFocusable(boolean focusable) {
- setBooleanProperty(BOOLEAN_PROPERTY_FOCUSABLE, focusable);
- }
+ @Deprecated
+ public void setFocusable(boolean focusable) { }
/**
* Gets whether this node is focused.
@@ -1892,7 +1887,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* @return True if the node is clickable.
*/
public boolean isClickable() {
- return getBooleanProperty(BOOLEAN_PROPERTY_CLICKABLE);
+ return hasActionWithId(ACTION_CLICK);
}
/**
@@ -1906,10 +1901,11 @@ public class AccessibilityNodeInfo implements Parcelable {
* @param clickable True if the node is clickable.
*
* @throws IllegalStateException If called from an AccessibilityService.
+ * @deprecated Use {@link #addAction(AccessibilityAction)}
+ * with {@link AccessibilityAction#ACTION_CLICK}
*/
- public void setClickable(boolean clickable) {
- setBooleanProperty(BOOLEAN_PROPERTY_CLICKABLE, clickable);
- }
+ @Deprecated
+ public void setClickable(boolean clickable) { }
/**
* Gets whether this node is long clickable.
@@ -1917,7 +1913,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* @return True if the node is long clickable.
*/
public boolean isLongClickable() {
- return getBooleanProperty(BOOLEAN_PROPERTY_LONG_CLICKABLE);
+ return hasActionWithId(ACTION_LONG_CLICK);
}
/**
@@ -1931,10 +1927,11 @@ public class AccessibilityNodeInfo implements Parcelable {
* @param longClickable True if the node is long clickable.
*
* @throws IllegalStateException If called from an AccessibilityService.
+ * @deprecated Use {@link #addAction(AccessibilityAction)}
+ * with {@link AccessibilityAction#ACTION_LONG_CLICK}
*/
- public void setLongClickable(boolean longClickable) {
- setBooleanProperty(BOOLEAN_PROPERTY_LONG_CLICKABLE, longClickable);
- }
+ @Deprecated
+ public void setLongClickable(boolean longClickable) { }
/**
* Gets whether this node is enabled.
@@ -1992,7 +1989,13 @@ public class AccessibilityNodeInfo implements Parcelable {
* @return True if the node is scrollable, false otherwise.
*/
public boolean isScrollable() {
- return getBooleanProperty(BOOLEAN_PROPERTY_SCROLLABLE);
+ return hasActionWithId(ACTION_SCROLL_BACKWARD)
+ || hasActionWithId(ACTION_SCROLL_FORWARD)
+ || hasActionWithId(R.id.accessibilityActionScrollToPosition)
+ || hasActionWithId(R.id.accessibilityActionScrollUp)
+ || hasActionWithId(R.id.accessibilityActionScrollDown)
+ || hasActionWithId(R.id.accessibilityActionScrollLeft)
+ || hasActionWithId(R.id.accessibilityActionScrollRight);
}
/**
@@ -2006,9 +2009,11 @@ public class AccessibilityNodeInfo implements Parcelable {
* @param scrollable True if the node is scrollable, false otherwise.
*
* @throws IllegalStateException If called from an AccessibilityService.
+ * @deprecated Use {@link #addAction(AccessibilityAction)}
*/
+ @Deprecated
+
public void setScrollable(boolean scrollable) {
- setBooleanProperty(BOOLEAN_PROPERTY_SCROLLABLE, scrollable);
}
/**
@@ -2199,7 +2204,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* @return True if the node is context clickable.
*/
public boolean isContextClickable() {
- return getBooleanProperty(BOOLEAN_PROPERTY_CONTEXT_CLICKABLE);
+ return hasActionWithId(R.id.accessibilityActionContextClick);
}
/**
@@ -2212,10 +2217,11 @@ public class AccessibilityNodeInfo implements Parcelable {
*
* @param contextClickable True if the node is context clickable.
* @throws IllegalStateException If called from an AccessibilityService.
+ * @deprecated Use {@link #addAction(AccessibilityAction)}
+ * with {@link AccessibilityAction#ACTION_CONTEXT_CLICK}
*/
- public void setContextClickable(boolean contextClickable) {
- setBooleanProperty(BOOLEAN_PROPERTY_CONTEXT_CLICKABLE, contextClickable);
- }
+ @Deprecated
+ public void setContextClickable(boolean contextClickable) { }
/**
* Gets the node's live region mode.
@@ -2309,7 +2315,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* @return If the node can be dismissed.
*/
public boolean isDismissable() {
- return getBooleanProperty(BOOLEAN_PROPERTY_DISMISSABLE);
+ return hasActionWithId(ACTION_DISMISS);
}
/**
@@ -2321,10 +2327,11 @@ public class AccessibilityNodeInfo implements Parcelable {
* </p>
*
* @param dismissable If the node can be dismissed.
+ * @deprecated Use {@link #addAction(AccessibilityAction)}
+ * with {@link AccessibilityAction#ACTION_DISMISS}
*/
- public void setDismissable(boolean dismissable) {
- setBooleanProperty(BOOLEAN_PROPERTY_DISMISSABLE, dismissable);
- }
+ @Deprecated
+ public void setDismissable(boolean dismissable) { }
/**
* Returns whether the node originates from a view considered important for accessibility.
diff --git a/core/java/android/view/accessibility/AccessibilityNodeProvider.java b/core/java/android/view/accessibility/AccessibilityNodeProvider.java
index 73733a04cdce..4b25378755f1 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeProvider.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeProvider.java
@@ -116,7 +116,7 @@ public abstract class AccessibilityNodeProvider {
* the info's {@link AccessibilityNodeInfo#getExtras} method.
* @param arguments A {@link Bundle} holding any arguments relevant for this request.
*
- * @see AccessibilityNodeInfo#setExtraAvailableData
+ * @see AccessibilityNodeInfo#setAvailableExtraData(List)
*/
public void addExtraDataToAccessibilityNodeInfo(
int virtualViewId, AccessibilityNodeInfo info, String extraDataKey, Bundle arguments) {
diff --git a/core/java/android/view/accessibility/AccessibilityRequestPreparer.java b/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
index 25f830a5e55b..4dcb18766347 100644
--- a/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
+++ b/core/java/android/view/accessibility/AccessibilityRequestPreparer.java
@@ -85,8 +85,8 @@ public abstract class AccessibilityRequestPreparer {
* are complete.
*
* @see View#addExtraDataToAccessibilityNodeInfo(AccessibilityNodeInfo, String, Bundle)
- * @see AccessibilityDelegate#addExtraDataToAccessibilityNodeInfo(View, AccessibilityNodeInfo,
- * String, Bundle)
+ * @see View.AccessibilityDelegate#addExtraDataToAccessibilityNodeInfo(
+ * View, AccessibilityNodeInfo, String, Bundle)
* @see AccessibilityNodeProvider#addExtraDataToAccessibilityNodeInfo(
* int, AccessibilityNodeInfo, String, Bundle)
*/
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 7555ffff3e38..41daf9e11370 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -57,6 +57,7 @@ import android.view.accessibility.AccessibilityWindowInfo;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.os.IResultReceiver;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
@@ -72,6 +73,8 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
//TODO: use java.lang.ref.Cleaner once Android supports Java 9
import sun.misc.Cleaner;
@@ -572,10 +575,11 @@ public final class AutofillManager {
final AutofillClient client = getClient();
if (client != null) {
+ final SyncResultReceiver receiver = new SyncResultReceiver();
try {
- final boolean sessionWasRestored = mService.restoreSession(mSessionId,
- client.autofillClientGetActivityToken(),
- mServiceClient.asBinder());
+ mService.restoreSession(mSessionId, client.autofillClientGetActivityToken(),
+ mServiceClient.asBinder(), receiver);
+ final boolean sessionWasRestored = receiver.getIntResult() == 1;
if (!sessionWasRestored) {
Log.w(TAG, "Session " + mSessionId + " could not be restored");
@@ -691,7 +695,9 @@ public final class AutofillManager {
*/
@Nullable public FillEventHistory getFillEventHistory() {
try {
- return mService.getFillEventHistory();
+ final SyncResultReceiver receiver = new SyncResultReceiver();
+ mService.getFillEventHistory(receiver);
+ return receiver.getObjectResult(SyncResultReceiver.TYPE_PARCELABLE);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -1242,8 +1248,10 @@ public final class AutofillManager {
public boolean hasEnabledAutofillServices() {
if (mService == null) return false;
+ final SyncResultReceiver receiver = new SyncResultReceiver();
try {
- return mService.isServiceEnabled(mContext.getUserId(), mContext.getPackageName());
+ mService.isServiceEnabled(mContext.getUserId(), mContext.getPackageName(), receiver);
+ return receiver.getIntResult() == 1;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1257,8 +1265,10 @@ public final class AutofillManager {
public ComponentName getAutofillServiceComponentName() {
if (mService == null) return null;
+ final SyncResultReceiver receiver = new SyncResultReceiver();
try {
- return mService.getAutofillServiceComponentName();
+ mService.getAutofillServiceComponentName(receiver);
+ return receiver.getObjectResult(SyncResultReceiver.TYPE_PARCELABLE);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1281,7 +1291,9 @@ public final class AutofillManager {
*/
@Nullable public String getUserDataId() {
try {
- return mService.getUserDataId();
+ final SyncResultReceiver receiver = new SyncResultReceiver();
+ mService.getUserDataId(receiver);
+ return receiver.getObjectResult(SyncResultReceiver.TYPE_STRING);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -1301,7 +1313,9 @@ public final class AutofillManager {
*/
@Nullable public UserData getUserData() {
try {
- return mService.getUserData();
+ final SyncResultReceiver receiver = new SyncResultReceiver();
+ mService.getUserData(receiver);
+ return receiver.getObjectResult(SyncResultReceiver.TYPE_PARCELABLE);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -1337,8 +1351,10 @@ public final class AutofillManager {
* the user.
*/
public boolean isFieldClassificationEnabled() {
+ final SyncResultReceiver receiver = new SyncResultReceiver();
try {
- return mService.isFieldClassificationEnabled();
+ mService.isFieldClassificationEnabled(receiver);
+ return receiver.getIntResult() == 1;
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return false;
@@ -1358,8 +1374,10 @@ public final class AutofillManager {
*/
@Nullable
public String getDefaultFieldClassificationAlgorithm() {
+ final SyncResultReceiver receiver = new SyncResultReceiver();
try {
- return mService.getDefaultFieldClassificationAlgorithm();
+ mService.getDefaultFieldClassificationAlgorithm(receiver);
+ return receiver.getObjectResult(SyncResultReceiver.TYPE_STRING);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
return null;
@@ -1376,9 +1394,10 @@ public final class AutofillManager {
*/
@NonNull
public List<String> getAvailableFieldClassificationAlgorithms() {
- final String[] algorithms;
+ final SyncResultReceiver receiver = new SyncResultReceiver();
try {
- algorithms = mService.getAvailableFieldClassificationAlgorithms();
+ mService.getAvailableFieldClassificationAlgorithms(receiver);
+ final String[] algorithms = receiver.getObjectResult(SyncResultReceiver.TYPE_STRING);
return algorithms != null ? Arrays.asList(algorithms) : Collections.emptyList();
} catch (RemoteException e) {
e.rethrowFromSystemServer();
@@ -1399,8 +1418,10 @@ public final class AutofillManager {
public boolean isAutofillSupported() {
if (mService == null) return false;
+ final SyncResultReceiver receiver = new SyncResultReceiver();
try {
- return mService.isServiceSupported(mContext.getUserId());
+ mService.isServiceSupported(mContext.getUserId(), receiver);
+ return receiver.getIntResult() == 1;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1435,7 +1456,9 @@ public final class AutofillManager {
// set the EXTRA_AUTHENTICATION_RESULT extra, but it could cause weird results if the
// service set the extra and returned RESULT_CANCELED...
- if (sDebug) Log.d(TAG, "onAuthenticationResult(): d=" + data);
+ if (sDebug) {
+ Log.d(TAG, "onAuthenticationResult(): id= " + authenticationId + ", data=" + data);
+ }
synchronized (mLock) {
if (!isActiveLocked()) {
@@ -1519,10 +1542,12 @@ public final class AutofillManager {
final AutofillClient client = getClient();
if (client == null) return; // NOTE: getClient() already logged it..
- mSessionId = mService.startSession(client.autofillClientGetActivityToken(),
+ final SyncResultReceiver receiver = new SyncResultReceiver();
+ mService.startSession(client.autofillClientGetActivityToken(),
mServiceClient.asBinder(), id, bounds, value, mContext.getUserId(),
mCallback != null, flags, client.autofillClientGetComponentName(),
- isCompatibilityModeEnabledLocked());
+ isCompatibilityModeEnabledLocked(), receiver);
+ mSessionId = receiver.getIntResult();
if (mSessionId != NO_SESSION) {
mState = STATE_ACTIVE;
}
@@ -1582,29 +1607,9 @@ public final class AutofillManager {
Log.v(TAG, "updateSessionLocked(): id=" + id + ", bounds=" + bounds
+ ", value=" + value + ", action=" + action + ", flags=" + flags);
}
- boolean restartIfNecessary = (flags & FLAG_MANUAL_REQUEST) != 0;
-
try {
- if (restartIfNecessary) {
- final AutofillClient client = getClient();
- if (client == null) return; // NOTE: getClient() already logd it..
-
- final int newId = mService.updateOrRestartSession(
- client.autofillClientGetActivityToken(),
- mServiceClient.asBinder(), id, bounds, value, mContext.getUserId(),
- mCallback != null, flags, client.autofillClientGetComponentName(),
- mSessionId, action, isCompatibilityModeEnabledLocked());
- if (newId != mSessionId) {
- if (sDebug) Log.d(TAG, "Session restarted: " + mSessionId + "=>" + newId);
- mSessionId = newId;
- mState = (mSessionId == NO_SESSION) ? STATE_UNKNOWN : STATE_ACTIVE;
- client.autofillClientResetableStateAvailable();
- }
- } else {
- mService.updateSession(mSessionId, id, bounds, value, action, flags,
- mContext.getUserId());
- }
-
+ mService.updateSession(mSessionId, id, bounds, value, action, flags,
+ mContext.getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1620,7 +1625,9 @@ public final class AutofillManager {
mServiceClient = new AutofillManagerClient(this);
try {
final int userId = mContext.getUserId();
- final int flags = mService.addClient(mServiceClient, userId);
+ final SyncResultReceiver receiver = new SyncResultReceiver();
+ mService.addClient(mServiceClient, userId, receiver);
+ final int flags = receiver.getIntResult();
mEnabled = (flags & FLAG_ADD_CLIENT_ENABLED) != 0;
sDebug = (flags & FLAG_ADD_CLIENT_DEBUG) != 0;
sVerbose = (flags & FLAG_ADD_CLIENT_VERBOSE) != 0;
@@ -1738,7 +1745,6 @@ public final class AutofillManager {
return;
}
- AutofillCallback callback = null;
synchronized (mLock) {
if (mSessionId == sessionId) {
AutofillClient client = getClient();
@@ -1823,7 +1829,6 @@ public final class AutofillManager {
for (int i = 0; i < itemCount; i++) {
final AutofillId id = ids.get(i);
final AutofillValue value = values.get(i);
- final int viewId = id.getViewId();
final View view = views[i];
if (view == null) {
// Most likely view has been removed after the initial request was sent to the
@@ -1943,7 +1948,7 @@ public final class AutofillManager {
mFillableIds.add(id);
}
if (sVerbose) {
- Log.v(TAG, "setTrackedViews(): fillableIds=" + fillableIds
+ Log.v(TAG, "setTrackedViews(): fillableIds=" + Arrays.toString(fillableIds)
+ ", mFillableIds" + mFillableIds);
}
}
@@ -2144,6 +2149,7 @@ public final class AutofillManager {
pw.print(pfx); pw.print("hasCallback: "); pw.println(mCallback != null);
pw.print(pfx); pw.print("onInvisibleCalled "); pw.println(mOnInvisibleCalled);
pw.print(pfx); pw.print("last autofilled data: "); pw.println(mLastAutofilledData);
+ pw.print(pfx); pw.print("id of last fill UI shown: "); pw.println(mIdShownFillUi);
pw.print(pfx); pw.print("tracked views: ");
if (mTrackedViews == null) {
pw.println("null");
@@ -2837,4 +2843,104 @@ public final class AutofillManager {
}
}
}
+
+ /**
+ * @hide
+ */
+ public static final class SyncResultReceiver extends IResultReceiver.Stub {
+
+ private static final String EXTRA = "EXTRA";
+
+ /**
+ * How long to block waiting for {@link IResultReceiver} callbacks when calling server.
+ */
+ private static final long BINDER_TIMEOUT_MS = 5000;
+
+ private static final int TYPE_STRING = 0;
+ private static final int TYPE_STRING_ARRAY = 1;
+ private static final int TYPE_PARCELABLE = 2;
+
+ private final CountDownLatch mLatch = new CountDownLatch(1);
+ private int mResult;
+ private Bundle mBundle;
+
+ private void waitResult() {
+ try {
+ if (!mLatch.await(BINDER_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+ throw new IllegalStateException("Not called in " + BINDER_TIMEOUT_MS + "ms");
+ }
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ /**
+ * Gets the result from an operation that returns an {@code int}.
+ */
+ int getIntResult() {
+ waitResult();
+ return mResult;
+ }
+
+ /**
+ * Gets the result from an operation that returns an {@code Object}.
+ *
+ * @param type type of expected object.
+ */
+ @Nullable
+ @SuppressWarnings("unchecked")
+ <T> T getObjectResult(int type) {
+ waitResult();
+ if (mBundle == null) {
+ return null;
+ }
+ switch (type) {
+ case TYPE_STRING:
+ return (T) mBundle.getString(EXTRA);
+ case TYPE_STRING_ARRAY:
+ return (T) mBundle.getString(EXTRA);
+ case TYPE_PARCELABLE:
+ return (T) mBundle.getParcelable(EXTRA);
+ default:
+ throw new IllegalArgumentException("unsupported type: " + type);
+ }
+ }
+
+ @Override
+ public void send(int resultCode, Bundle resultData) {
+ mResult = resultCode;
+ mBundle = resultData;
+ mLatch.countDown();
+ }
+
+ /**
+ * Creates a bundle for a {@code String} value.
+ */
+ @NonNull
+ public static Bundle bundleFor(@Nullable String value) {
+ final Bundle bundle = new Bundle();
+ bundle.putString(EXTRA, value);
+ return bundle;
+ }
+
+ /**
+ * Creates a bundle for a {@code String[]} value.
+ */
+ @NonNull
+ public static Bundle bundleFor(@Nullable String[] value) {
+ final Bundle bundle = new Bundle();
+ bundle.putStringArray(EXTRA, value);
+ return bundle;
+ }
+
+ /**
+ * Creates a bundle for a {@code Parcelable} value.
+ */
+ @NonNull
+ public static Bundle bundleFor(@Nullable Parcelable value) {
+ final Bundle bundle = new Bundle();
+ bundle.putParcelable(EXTRA, value);
+ return bundle;
+ }
+ }
}
diff --git a/core/java/android/view/autofill/AutofillValue.java b/core/java/android/view/autofill/AutofillValue.java
index 8e649de52c97..186a97dd2592 100644
--- a/core/java/android/view/autofill/AutofillValue.java
+++ b/core/java/android/view/autofill/AutofillValue.java
@@ -21,12 +21,15 @@ import static android.view.View.AUTOFILL_TYPE_LIST;
import static android.view.View.AUTOFILL_TYPE_TEXT;
import static android.view.View.AUTOFILL_TYPE_TOGGLE;
import static android.view.autofill.Helper.sDebug;
+import static android.view.autofill.Helper.sVerbose;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.Looper;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
+import android.util.Log;
import android.view.View;
import com.android.internal.util.Preconditions;
@@ -41,6 +44,9 @@ import java.util.Objects;
* {@link View#getAutofillType()}.
*/
public final class AutofillValue implements Parcelable {
+
+ private static final String TAG = "AutofillValue";
+
private final @View.AutofillType int mType;
private final @NonNull Object mValue;
@@ -256,8 +262,15 @@ public final class AutofillValue implements Parcelable {
* Creates a new {@link AutofillValue} to autofill a {@link View} representing a text field.
*
* <p>See {@link View#AUTOFILL_TYPE_TEXT} for more info.
+ *
+ * <p><b>Note:</b> This method is not thread safe and can throw an exception if the
+ * {@code value} is modified by a different thread before it returns.
*/
public static AutofillValue forText(@Nullable CharSequence value) {
+ if (sVerbose && !Looper.getMainLooper().isCurrentThread()) {
+ Log.v(TAG, "forText() not called on main thread: " + Thread.currentThread());
+ }
+
return value == null ? null : new AutofillValue(AUTOFILL_TYPE_TEXT,
TextUtils.trimNoCopySpans(value));
}
diff --git a/core/java/android/view/autofill/IAutoFillManager.aidl b/core/java/android/view/autofill/IAutoFillManager.aidl
index 176df7327b16..26aeba5cfdfa 100644
--- a/core/java/android/view/autofill/IAutoFillManager.aidl
+++ b/core/java/android/view/autofill/IAutoFillManager.aidl
@@ -28,41 +28,39 @@ import android.service.autofill.UserData;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
import android.view.autofill.IAutoFillManagerClient;
+import com.android.internal.os.IResultReceiver;
/**
* Mediator between apps being auto-filled and auto-fill service implementations.
*
* {@hide}
*/
-interface IAutoFillManager {
+oneway interface IAutoFillManager {
// Returns flags: FLAG_ADD_CLIENT_ENABLED | FLAG_ADD_CLIENT_DEBUG | FLAG_ADD_CLIENT_VERBOSE
- int addClient(in IAutoFillManagerClient client, int userId);
+ void addClient(in IAutoFillManagerClient client, int userId, in IResultReceiver result);
void removeClient(in IAutoFillManagerClient client, int userId);
- int startSession(IBinder activityToken, in IBinder appCallback, in AutofillId autoFillId,
- in Rect bounds, in AutofillValue value, int userId, boolean hasCallback, int flags,
- in ComponentName componentName, boolean compatMode);
- FillEventHistory getFillEventHistory();
- boolean restoreSession(int sessionId, in IBinder activityToken, in IBinder appCallback);
+ void startSession(IBinder activityToken, in IBinder appCallback, in AutofillId autoFillId,
+ in Rect bounds, in AutofillValue value, int userId, boolean hasCallback, int flags,
+ in ComponentName componentName, boolean compatMode, in IResultReceiver result);
+ void getFillEventHistory(in IResultReceiver result);
+ void restoreSession(int sessionId, in IBinder activityToken, in IBinder appCallback,
+ in IResultReceiver result);
void updateSession(int sessionId, in AutofillId id, in Rect bounds,
- in AutofillValue value, int action, int flags, int userId);
- int updateOrRestartSession(IBinder activityToken, in IBinder appCallback,
- in AutofillId autoFillId, in Rect bounds, in AutofillValue value, int userId,
- boolean hasCallback, int flags, in ComponentName componentName, int sessionId,
- int action, boolean compatMode);
+ in AutofillValue value, int action, int flags, int userId);
void setAutofillFailure(int sessionId, in List<AutofillId> ids, int userId);
void finishSession(int sessionId, int userId);
void cancelSession(int sessionId, int userId);
void setAuthenticationResult(in Bundle data, int sessionId, int authenticationId, int userId);
void setHasCallback(int sessionId, int userId, boolean hasIt);
void disableOwnedAutofillServices(int userId);
- boolean isServiceSupported(int userId);
- boolean isServiceEnabled(int userId, String packageName);
+ void isServiceSupported(int userId, in IResultReceiver result);
+ void isServiceEnabled(int userId, String packageName, in IResultReceiver result);
void onPendingSaveUi(int operation, IBinder token);
- UserData getUserData();
- String getUserDataId();
+ void getUserData(in IResultReceiver result);
+ void getUserDataId(in IResultReceiver result);
void setUserData(in UserData userData);
- boolean isFieldClassificationEnabled();
- ComponentName getAutofillServiceComponentName();
- String[] getAvailableFieldClassificationAlgorithms();
- String getDefaultFieldClassificationAlgorithm();
+ void isFieldClassificationEnabled(in IResultReceiver result);
+ void getAutofillServiceComponentName(in IResultReceiver result);
+ void getAvailableFieldClassificationAlgorithms(in IResultReceiver result);
+ void getDefaultFieldClassificationAlgorithm(in IResultReceiver result);
}
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index f0f30a0df8ba..372362fe2a58 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -503,6 +503,14 @@ public final class InputMethodInfo implements Parcelable {
/**
* @hide
+ * @return {@code true} if the IME is a trusted system component (e.g. pre-installed)
+ */
+ public boolean isSystem() {
+ return (mService.serviceInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
+ }
+
+ /**
+ * @hide
*/
public boolean isAuxiliaryIme() {
return mIsAuxIme;
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 7e6af49838ce..bb93af5c66de 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -798,10 +798,18 @@ public final class InputMethodManager {
}
/** @hide */
- public void setImeWindowStatus(IBinder imeToken, IBinder startInputToken, int vis,
- int backDisposition) {
+ public void setImeWindowStatus(IBinder imeToken, int vis, int backDisposition) {
try {
- mService.setImeWindowStatus(imeToken, startInputToken, vis, backDisposition);
+ mService.setImeWindowStatus(imeToken, vis, backDisposition);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /** @hide */
+ public void reportStartInput(IBinder imeToken, IBinder startInputToken) {
+ try {
+ mService.reportStartInput(imeToken, startInputToken);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1239,7 +1247,7 @@ public final class InputMethodManager {
}
boolean startInputInner(@InputMethodClient.StartInputReason final int startInputReason,
- IBinder windowGainingFocus, int controlFlags, int softInputMode,
+ @Nullable IBinder windowGainingFocus, int controlFlags, int softInputMode,
int windowFlags) {
final View view;
synchronized (mH) {
@@ -1256,6 +1264,20 @@ public final class InputMethodManager {
}
}
+ if (windowGainingFocus == null) {
+ windowGainingFocus = view.getWindowToken();
+ if (windowGainingFocus == null) {
+ Log.e(TAG, "ABORT input: ServedView must be attached to a Window");
+ return false;
+ }
+ controlFlags |= CONTROL_WINDOW_VIEW_HAS_FOCUS;
+ if (view.onCheckIsTextEditor()) {
+ controlFlags |= CONTROL_WINDOW_IS_TEXT_EDITOR;
+ }
+ softInputMode = view.getViewRootImpl().mWindowAttributes.softInputMode;
+ windowFlags = view.getViewRootImpl().mWindowAttributes.flags;
+ }
+
// Now we need to get an input connection from the served view.
// This is complicated in a couple ways: we can't be holding our lock
// when calling out to the view, and we need to make sure we call into
diff --git a/core/java/android/view/inputmethod/InputMethodManagerInternal.java b/core/java/android/view/inputmethod/InputMethodManagerInternal.java
index e13813e5199b..276fab9f3399 100644
--- a/core/java/android/view/inputmethod/InputMethodManagerInternal.java
+++ b/core/java/android/view/inputmethod/InputMethodManagerInternal.java
@@ -31,11 +31,6 @@ public interface InputMethodManagerInternal {
void setInteractive(boolean interactive);
/**
- * Called by the window manager to let the input method manager rotate the input method.
- */
- void switchInputMethod(boolean forwardDirection);
-
- /**
* Hides the current input method, if visible.
*/
void hideCurrentInputMethod();
diff --git a/core/java/android/view/inputmethod/InputMethodSession.java b/core/java/android/view/inputmethod/InputMethodSession.java
index 74fbbc7e22ad..de15f332d51d 100644
--- a/core/java/android/view/inputmethod/InputMethodSession.java
+++ b/core/java/android/view/inputmethod/InputMethodSession.java
@@ -1,12 +1,12 @@
/*
* Copyright (C) 2007-2008 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
@@ -24,17 +24,17 @@ import android.view.MotionEvent;
/**
* The InputMethodSession interface provides the per-client functionality
* of {@link InputMethod} that is safe to expose to applications.
- *
+ *
* <p>Applications will not normally use this interface themselves, instead
* relying on the standard interaction provided by
* {@link android.widget.TextView} and {@link android.widget.EditText}.
*/
public interface InputMethodSession {
-
+
public interface EventCallback {
void finishedEvent(int seq, boolean handled);
}
-
+
/**
* This method is called when the application would like to stop
* receiving text input.
@@ -44,7 +44,7 @@ public interface InputMethodSession {
/**
* This method is called when the selection or cursor in the current
* target input field has changed.
- *
+ *
* @param oldSelStart The previous text offset of the cursor selection
* start position.
* @param oldSelEnd The previous text offset of the cursor selection
@@ -75,64 +75,63 @@ public interface InputMethodSession {
* This method is called when cursor location of the target input field
* has changed within its window. This is not normally called, but will
* only be reported if requested by the input method.
- *
+ *
* @param newCursor The rectangle of the cursor currently being shown in
* the input field's window coordinates.
*/
public void updateCursor(Rect newCursor);
-
+
/**
* Called by a text editor that performs auto completion, to tell the
* input method about the completions it has available. This can be used
* by the input method to display them to the user to select the text to
* be inserted.
- *
+ *
* @param completions Array of text completions that are available, starting with
* the best. If this array is null, any existing completions will be
* removed.
*/
public void displayCompletions(CompletionInfo[] completions);
-
+
/**
* Called by a text editor to report its new extracted text when its
* contents change. This will only be called if the input method
* calls {@link InputConnection#getExtractedText(ExtractedTextRequest, int)
* InputConnection.getExtractedText()} with the option to report updates.
- *
+ *
* @param token The input method supplied token for identifying its request.
* @param text The new extracted text.
*/
public void updateExtractedText(int token, ExtractedText text);
-
+
/**
* This method is called when a key is pressed. When done with the event,
* the implementation must call back on <var>callback</var> with its
* result.
- *
+ *
* <p>
* If the input method wants to handle this event, return true, otherwise
* return false and the caller (i.e. the application) will handle the event.
- *
+ *
* @param event The key event.
- *
+ *
* @return Whether the input method wants to handle this event.
- *
- * @see #dispatchKeyUp
+ *
* @see android.view.KeyEvent
*/
public void dispatchKeyEvent(int seq, KeyEvent event, EventCallback callback);
/**
* This method is called when there is a track ball event.
- *
+ *
* <p>
* If the input method wants to handle this event, return true, otherwise
* return false and the caller (i.e. the application) will handle the event.
- *
+ *
* @param event The motion event.
- *
+ *
* @return Whether the input method wants to handle this event.
- *
+ *
* @see android.view.MotionEvent
*/
public void dispatchTrackballEvent(int seq, MotionEvent event, EventCallback callback);
@@ -156,14 +155,14 @@ public interface InputMethodSession {
* Process a private command sent from the application to the input method.
* This can be used to provide domain-specific features that are
* only known between certain input methods and their clients.
- *
+ *
* @param action Name of the command to be performed. This <em>must</em>
* be a scoped name, i.e. prefixed with a package name you own, so that
* different developers will not create conflicting commands.
* @param data Any data to include with the command.
*/
public void appPrivateCommand(String action, Bundle data);
-
+
/**
* Toggle the soft input window.
* Applications can toggle the state of the soft input window.
diff --git a/core/java/android/view/textservice/TextServicesManager.java b/core/java/android/view/textservice/TextServicesManager.java
index 21ec42b1d557..6644a85291b7 100644
--- a/core/java/android/view/textservice/TextServicesManager.java
+++ b/core/java/android/view/textservice/TextServicesManager.java
@@ -222,8 +222,7 @@ public final class TextServicesManager {
public SpellCheckerSubtype getCurrentSpellCheckerSubtype(
boolean allowImplicitlySelectedSubtype) {
try {
- // Passing null as a locale until we support multiple enabled spell checker subtypes.
- return mService.getCurrentSpellCheckerSubtype(null, allowImplicitlySelectedSubtype);
+ return mService.getCurrentSpellCheckerSubtype(allowImplicitlySelectedSubtype);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/webkit/WebBackForwardList.java b/core/java/android/webkit/WebBackForwardList.java
index 0c34e3c16ac6..4d3bbe475920 100644
--- a/core/java/android/webkit/WebBackForwardList.java
+++ b/core/java/android/webkit/WebBackForwardList.java
@@ -57,7 +57,8 @@ public abstract class WebBackForwardList implements Cloneable, Serializable {
/**
* Clone the entire object to be used in the UI thread by clients of
* WebView. This creates a copy that should never be modified by any of the
- * webkit package classes.
+ * webkit package classes. On Android 4.4 and later there is no need to use
+ * this, as the object is already a read-only copy of the internal state.
*/
protected abstract WebBackForwardList clone();
}
diff --git a/core/java/android/webkit/WebHistoryItem.java b/core/java/android/webkit/WebHistoryItem.java
index 74db039e015d..b9e704285f84 100644
--- a/core/java/android/webkit/WebHistoryItem.java
+++ b/core/java/android/webkit/WebHistoryItem.java
@@ -23,7 +23,7 @@ import android.graphics.Bitmap;
/**
* A convenience class for accessing fields in an entry in the back/forward list
* of a WebView. Each WebHistoryItem is a snapshot of the requested history
- * item. Each history item may be updated during the load of a page.
+ * item.
* @see WebBackForwardList
*/
public abstract class WebHistoryItem implements Cloneable {
@@ -44,8 +44,6 @@ public abstract class WebHistoryItem implements Cloneable {
* history item. See getTargetUrl() for the url that is the actual target of
* this history item.
* @return The base url of this history item.
- * Note: The VM ensures 32-bit atomic read/write operations so we don't have
- * to synchronize this method.
*/
public abstract String getUrl();
@@ -60,22 +58,20 @@ public abstract class WebHistoryItem implements Cloneable {
/**
* Return the document title of this history item.
* @return The document title of this history item.
- * Note: The VM ensures 32-bit atomic read/write operations so we don't have
- * to synchronize this method.
*/
public abstract String getTitle();
/**
* Return the favicon of this history item or {@code null} if no favicon was found.
* @return A Bitmap containing the favicon for this history item or {@code null}.
- * Note: The VM ensures 32-bit atomic read/write operations so we don't have
- * to synchronize this method.
*/
@Nullable
public abstract Bitmap getFavicon();
/**
- * Clone the history item for use by clients of WebView.
+ * Clone the history item for use by clients of WebView. On Android 4.4 and later
+ * there is no need to use this, as the object is already a read-only copy of the
+ * internal state.
*/
protected abstract WebHistoryItem clone();
}
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index cba11a84e9eb..a08539566a1e 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -987,7 +987,9 @@ public abstract class WebSettings {
* {@link PluginState#OFF}.
*
* @param state a PluginState value
- * @deprecated Plugins will not be supported in future, and should not be used.
+ * @deprecated Plugins are not supported in API level
+ * {@link android.os.Build.VERSION_CODES#KITKAT} or later;
+ * enabling plugins is a no-op.
*/
@Deprecated
public abstract void setPluginState(PluginState state);
@@ -1182,7 +1184,9 @@ public abstract class WebSettings {
*
* @return the plugin state as a {@link PluginState} value
* @see #setPluginState
- * @deprecated Plugins will not be supported in future, and should not be used.
+ * @deprecated Plugins are not supported in API level
+ * {@link android.os.Build.VERSION_CODES#KITKAT} or later;
+ * enabling plugins is a no-op.
*/
@Deprecated
public abstract PluginState getPluginState();
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index d7f1d6e3b2d1..9573f4834288 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -41,7 +41,6 @@ import android.os.Message;
import android.os.RemoteException;
import android.os.StrictMode;
import android.print.PrintDocumentAdapter;
-import android.security.KeyChain;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
@@ -71,280 +70,25 @@ import java.util.List;
import java.util.Map;
/**
- * <p>A View that displays web pages. This class is the basis upon which you
- * can roll your own web browser or simply display some online content within your Activity.
- * It uses the WebKit rendering engine to display
- * web pages and includes methods to navigate forward and backward
- * through a history, zoom in and out, perform text searches and more.
- *
- * <p>Note that, in order for your Activity to access the Internet and load web pages
- * in a WebView, you must add the {@code INTERNET} permissions to your
- * Android Manifest file:
- *
- * <pre>
- * {@code <uses-permission android:name="android.permission.INTERNET" />}
- * </pre>
- *
- * <p>This must be a child of the <a
- * href="{@docRoot}guide/topics/manifest/manifest-element.html">{@code <manifest>}</a>
- * element.
- *
- * <p>For more information, read
- * <a href="{@docRoot}guide/webapps/webview.html">Building Web Apps in WebView</a>.
+ * A View that displays web pages.
*
* <h3>Basic usage</h3>
*
- * <p>By default, a WebView provides no browser-like widgets, does not
- * enable JavaScript and web page errors are ignored. If your goal is only
- * to display some HTML as a part of your UI, this is probably fine;
- * the user won't need to interact with the web page beyond reading
- * it, and the web page won't need to interact with the user. If you
- * actually want a full-blown web browser, then you probably want to
- * invoke the Browser application with a URL Intent rather than show it
- * with a WebView. For example:
- * <pre>
- * Uri uri = Uri.parse("https://www.example.com");
- * Intent intent = new Intent(Intent.ACTION_VIEW, uri);
- * startActivity(intent);
- * </pre>
- * <p>See {@link android.content.Intent} for more information.
- *
- * <p>To provide a WebView in your own Activity, include a {@code <WebView>} in your layout,
- * or set the entire Activity window as a WebView during {@link
- * android.app.Activity#onCreate(Bundle) onCreate()}:
- *
- * <pre class="prettyprint">
- * WebView webview = new WebView(this);
- * setContentView(webview);
- * </pre>
- *
- * <p>Then load the desired web page:
- *
- * <pre>
- * // Simplest usage: note that an exception will NOT be thrown
- * // if there is an error loading this page (see below).
- * webview.loadUrl("https://example.com/");
- *
- * // OR, you can also load from an HTML string:
- * String summary = "&lt;html>&lt;body>You scored &lt;b>192&lt;/b> points.&lt;/body>&lt;/html>";
- * webview.loadData(summary, "text/html", null);
- * // ... although note that there are restrictions on what this HTML can do.
- * // See {@link #loadData(String,String,String)} and {@link
- * #loadDataWithBaseURL(String,String,String,String,String)} for more info.
- * // Also see {@link #loadData(String,String,String)} for information on encoding special
- * // characters.
- * </pre>
- *
- * <p>A WebView has several customization points where you can add your
- * own behavior. These are:
- *
- * <ul>
- * <li>Creating and setting a {@link android.webkit.WebChromeClient} subclass.
- * This class is called when something that might impact a
- * browser UI happens, for instance, progress updates and
- * JavaScript alerts are sent here (see <a
- * href="{@docRoot}guide/developing/debug-tasks.html#DebuggingWebPages">Debugging Tasks</a>).
- * </li>
- * <li>Creating and setting a {@link android.webkit.WebViewClient} subclass.
- * It will be called when things happen that impact the
- * rendering of the content, eg, errors or form submissions. You
- * can also intercept URL loading here (via {@link
- * android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String)
- * shouldOverrideUrlLoading()}).</li>
- * <li>Modifying the {@link android.webkit.WebSettings}, such as
- * enabling JavaScript with {@link android.webkit.WebSettings#setJavaScriptEnabled(boolean)
- * setJavaScriptEnabled()}. </li>
- * <li>Injecting Java objects into the WebView using the
- * {@link android.webkit.WebView#addJavascriptInterface} method. This
- * method allows you to inject Java objects into a page's JavaScript
- * context, so that they can be accessed by JavaScript in the page.</li>
- * </ul>
- *
- * <p>Here's a more complicated example, showing error handling,
- * settings, and progress notification:
- *
- * <pre class="prettyprint">
- * // Let's display the progress in the activity title bar, like the
- * // browser app does.
- * getWindow().requestFeature(Window.FEATURE_PROGRESS);
- *
- * webview.getSettings().setJavaScriptEnabled(true);
- *
- * final Activity activity = this;
- * webview.setWebChromeClient(new WebChromeClient() {
- * public void onProgressChanged(WebView view, int progress) {
- * // Activities and WebViews measure progress with different scales.
- * // The progress meter will automatically disappear when we reach 100%
- * activity.setProgress(progress * 1000);
- * }
- * });
- * webview.setWebViewClient(new WebViewClient() {
- * public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
- * Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
- * }
- * });
- *
- * webview.loadUrl("https://developer.android.com/");
- * </pre>
- *
- * <h3>Zoom</h3>
- *
- * <p>To enable the built-in zoom, set
- * {@link #getSettings() WebSettings}.{@link WebSettings#setBuiltInZoomControls(boolean)}
- * (introduced in API level {@link android.os.Build.VERSION_CODES#CUPCAKE}).
- *
- * <p class="note"><b>Note:</b> Using zoom if either the height or width is set to
- * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} may lead to undefined behavior
- * and should be avoided.
- *
- * <h3>Cookie and window management</h3>
- *
- * <p>For obvious security reasons, your application has its own
- * cache, cookie store etc.&mdash;it does not share the Browser
- * application's data.
- *
- * <p>By default, requests by the HTML to open new windows are
- * ignored. This is {@code true} whether they be opened by JavaScript or by
- * the target attribute on a link. You can customize your
- * {@link WebChromeClient} to provide your own behavior for opening multiple windows,
- * and render them in whatever manner you want.
- *
- * <p>The standard behavior for an Activity is to be destroyed and
- * recreated when the device orientation or any other configuration changes. This will cause
- * the WebView to reload the current page. If you don't want that, you
- * can set your Activity to handle the {@code orientation} and {@code keyboardHidden}
- * changes, and then just leave the WebView alone. It'll automatically
- * re-orient itself as appropriate. Read <a
- * href="{@docRoot}guide/topics/resources/runtime-changes.html">Handling Runtime Changes</a> for
- * more information about how to handle configuration changes during runtime.
- *
- *
- * <h3>Building web pages to support different screen densities</h3>
- *
- * <p>The screen density of a device is based on the screen resolution. A screen with low density
- * has fewer available pixels per inch, where a screen with high density
- * has more &mdash; sometimes significantly more &mdash; pixels per inch. The density of a
- * screen is important because, other things being equal, a UI element (such as a button) whose
- * height and width are defined in terms of screen pixels will appear larger on the lower density
- * screen and smaller on the higher density screen.
- * For simplicity, Android collapses all actual screen densities into three generalized densities:
- * high, medium, and low.
- * <p>By default, WebView scales a web page so that it is drawn at a size that matches the default
- * appearance on a medium density screen. So, it applies 1.5x scaling on a high density screen
- * (because its pixels are smaller) and 0.75x scaling on a low density screen (because its pixels
- * are bigger).
- * Starting with API level {@link android.os.Build.VERSION_CODES#ECLAIR}, WebView supports DOM, CSS,
- * and meta tag features to help you (as a web developer) target screens with different screen
- * densities.
- * <p>Here's a summary of the features you can use to handle different screen densities:
- * <ul>
- * <li>The {@code window.devicePixelRatio} DOM property. The value of this property specifies the
- * default scaling factor used for the current device. For example, if the value of {@code
- * window.devicePixelRatio} is "1.0", then the device is considered a medium density (mdpi) device
- * and default scaling is not applied to the web page; if the value is "1.5", then the device is
- * considered a high density device (hdpi) and the page content is scaled 1.5x; if the
- * value is "0.75", then the device is considered a low density device (ldpi) and the content is
- * scaled 0.75x.</li>
- * <li>The {@code -webkit-device-pixel-ratio} CSS media query. Use this to specify the screen
- * densities for which this style sheet is to be used. The corresponding value should be either
- * "0.75", "1", or "1.5", to indicate that the styles are for devices with low density, medium
- * density, or high density screens, respectively. For example:
- * <pre>
- * &lt;link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="hdpi.css" /&gt;</pre>
- * <p>The {@code hdpi.css} stylesheet is only used for devices with a screen pixel ratio of 1.5,
- * which is the high density pixel ratio.
- * </li>
- * </ul>
- *
- * <h3>HTML5 Video support</h3>
- *
- * <p>In order to support inline HTML5 video in your application you need to have hardware
- * acceleration turned on.
- *
- * <h3>Full screen support</h3>
- *
- * <p>In order to support full screen &mdash; for video or other HTML content &mdash; you need to set a
- * {@link android.webkit.WebChromeClient} and implement both
- * {@link WebChromeClient#onShowCustomView(View, WebChromeClient.CustomViewCallback)}
- * and {@link WebChromeClient#onHideCustomView()}. If the implementation of either of these two methods is
- * missing then the web contents will not be allowed to enter full screen. Optionally you can implement
- * {@link WebChromeClient#getVideoLoadingProgressView()} to customize the View displayed whilst a video
- * is loading.
- *
- * <h3>HTML5 Geolocation API support</h3>
- *
- * <p>For applications targeting Android N and later releases
- * (API level > {@link android.os.Build.VERSION_CODES#M}) the geolocation api is only supported on
- * secure origins such as https. For such applications requests to geolocation api on non-secure
- * origins are automatically denied without invoking the corresponding
- * {@link WebChromeClient#onGeolocationPermissionsShowPrompt(String, GeolocationPermissions.Callback)}
- * method.
- *
- * <h3>Layout size</h3>
- * <p>
- * It is recommended to set the WebView layout height to a fixed value or to
- * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} instead of using
- * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.
- * When using {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}
- * for the height none of the WebView's parents should use a
- * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} layout height since that could result in
- * incorrect sizing of the views.
- *
- * <p>Setting the WebView's height to {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}
- * enables the following behaviors:
- * <ul>
- * <li>The HTML body layout height is set to a fixed value. This means that elements with a height
- * relative to the HTML body may not be sized correctly. </li>
- * <li>For applications targeting {@link android.os.Build.VERSION_CODES#KITKAT} and earlier SDKs the
- * HTML viewport meta tag will be ignored in order to preserve backwards compatibility. </li>
- * </ul>
- *
- * <p>
- * Using a layout width of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} is not
- * supported. If such a width is used the WebView will attempt to use the width of the parent
- * instead.
- *
- * <h3>Metrics</h3>
- *
- * <p>
- * WebView may upload anonymous diagnostic data to Google when the user has consented. This data
- * helps Google improve WebView. Data is collected on a per-app basis for each app which has
- * instantiated a WebView. An individual app can opt out of this feature by putting the following
- * tag in its manifest's {@code <application>} element:
- * <pre>
- * &lt;manifest&gt;
- * &lt;application&gt;
- * ...
- * &lt;meta-data android:name=&quot;android.webkit.WebView.MetricsOptOut&quot;
- * android:value=&quot;true&quot; /&gt;
- * &lt;/application&gt;
- * &lt;/manifest&gt;
- * </pre>
- * <p>
- * Data will only be uploaded for a given app if the user has consented AND the app has not opted
- * out.
*
- * <h3>Safe Browsing</h3>
+ * <p>In most cases, we recommend using a standard web browser, like Chrome, to deliver
+ * content to the user. To learn more about web browsers, read the guide on
+ * <a href="/guide/components/intents-common#Browser">
+ * invoking a browser with an intent</a>.
*
- * <p>
- * With Safe Browsing, WebView will block malicious URLs and present a warning UI to the user to
- * allow them to navigate back safely or proceed to the malicious page.
- * <p>
- * Safe Browsing is enabled by default on devices which support it. If your app needs to disable
- * Safe Browsing for all WebViews, it can do so in the manifest's {@code <application>} element:
- * <p>
- * <pre>
- * &lt;manifest&gt;
- * &lt;application&gt;
- * ...
- * &lt;meta-data android:name=&quot;android.webkit.WebView.EnableSafeBrowsing&quot;
- * android:value=&quot;false&quot; /&gt;
- * &lt;/application&gt;
- * &lt;/manifest&gt;
- * </pre>
+ * <p>WebView objects allow you to display web content as part of your activity layout, but
+ * lack some of the features of fully-developed browsers. A WebView is useful when
+ * you need increased control over the UI and advanced configuration options that will allow
+ * you to embed web pages in a specially-designed environment for your app.
*
- * <p>
- * Otherwise, see {@link WebSettings#setSafeBrowsingEnabled}.
+ * <p>To learn more about WebView and alternatives for serving web content, read the
+ * documentation on
+ * <a href="/guide/webapps/">
+ * Web-based content</a>.
*
*/
// Implementation notes.
@@ -1330,10 +1074,7 @@ public class WebView extends AbsoluteLayout
* <p>
* Note that from {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} the returned picture
* should only be drawn into bitmap-backed Canvas - using any other type of Canvas will involve
- * additional conversion at a cost in memory and performance. Also the
- * {@link android.graphics.Picture#createFromStream} and
- * {@link android.graphics.Picture#writeToStream} methods are not supported on the
- * returned object.
+ * additional conversion at a cost in memory and performance.
*
* @deprecated Use {@link #onDraw} to obtain a bitmap snapshot of the WebView, or
* {@link #saveWebArchive} to save the content to a file.
@@ -1674,9 +1415,8 @@ public class WebView extends AbsoluteLayout
/**
* Clears the client certificate preferences stored in response
* to proceeding/cancelling client cert requests. Note that WebView
- * automatically clears these preferences when it receives a
- * {@link KeyChain#ACTION_STORAGE_CHANGED} intent. The preferences are
- * shared by all the WebViews that are created by the embedder application.
+ * automatically clears these preferences when the system keychain is updated.
+ * The preferences are shared by all the WebViews that are created by the embedder application.
*
* @param onCleared A runnable to be invoked when client certs are cleared.
* The runnable will be called in UI thread.
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 39209be26ba0..a8439f3d4d73 100755
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -6511,7 +6511,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
* @param listener The recycler listener to be notified of views set aside
* in the recycler.
*
- * @see android.widget.AbsListView.RecycleBin
* @see android.widget.AbsListView.RecyclerListener
*/
public void setRecyclerListener(RecyclerListener listener) {
@@ -6697,7 +6696,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
* inside the RecycleBin's scrap heap. This listener is used to free resources
* associated to Views placed in the RecycleBin.
*
- * @see android.widget.AbsListView.RecycleBin
* @see android.widget.AbsListView#setRecyclerListener(android.widget.AbsListView.RecyclerListener)
*/
public static interface RecyclerListener {
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index 6c192563658e..4e77f0bf59b6 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -293,7 +293,7 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
/**
* @return The callback to be invoked with an item in this AdapterView has
- * been clicked, or null id no callback has been set.
+ * been clicked, or null if no callback has been set.
*/
@Nullable
public final OnItemClickListener getOnItemClickListener() {
@@ -365,7 +365,7 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
/**
* @return The callback to be invoked with an item in this AdapterView has
- * been clicked and held, or null id no callback as been set.
+ * been clicked and held, or null if no callback has been set.
*/
public final OnItemLongClickListener getOnItemLongClickListener() {
return mOnItemLongClickListener;
diff --git a/core/java/android/widget/DateTimeView.java b/core/java/android/widget/DateTimeView.java
index 621a745053eb..2b1e900d8ee1 100644
--- a/core/java/android/widget/DateTimeView.java
+++ b/core/java/android/widget/DateTimeView.java
@@ -30,7 +30,6 @@ import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.database.ContentObserver;
-import android.icu.util.Calendar;
import android.os.Handler;
import android.text.format.Time;
import android.util.AttributeSet;
@@ -41,6 +40,7 @@ import com.android.internal.R;
import java.text.DateFormat;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
@@ -301,7 +301,7 @@ public class DateTimeView extends TextView {
*/
private long computeNextMidnight(TimeZone timeZone) {
Calendar c = Calendar.getInstance();
- c.setTimeZone(libcore.icu.DateUtilsBridge.icuTimeZone(timeZone));
+ c.setTimeZone(timeZone);
c.add(Calendar.DAY_OF_MONTH, 1);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
diff --git a/core/java/android/widget/DayPickerPagerAdapter.java b/core/java/android/widget/DayPickerPagerAdapter.java
index 63621e123320..57090a59d9a1 100644
--- a/core/java/android/widget/DayPickerPagerAdapter.java
+++ b/core/java/android/widget/DayPickerPagerAdapter.java
@@ -249,7 +249,8 @@ class DayPickerPagerAdapter extends PagerAdapter {
final int year = getYearForPosition(position);
final int selectedDay;
- if (mSelectedDay != null && mSelectedDay.get(Calendar.MONTH) == month) {
+ if (mSelectedDay != null && mSelectedDay.get(Calendar.MONTH) == month && mSelectedDay.get(
+ Calendar.YEAR) == year) {
selectedDay = mSelectedDay.get(Calendar.DAY_OF_MONTH);
} else {
selectedDay = -1;
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index d07721a3c27a..058736a71b5c 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -4930,6 +4930,7 @@ public class Editor {
protected final void dismissMagnifier() {
if (mMagnifierAnimator != null) {
+ mMagnifierAnimator.mMagnifier.setOnOperationCompleteCallback(null);
mMagnifierAnimator.dismiss();
mRenderCursorRegardlessTiming = false;
resumeBlink();
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index 3aae8497ba1b..4b76c18e3b83 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -473,10 +473,10 @@ public class GridLayout extends ViewGroup {
* @see #getUseDefaultMargins()
* @see #setAlignmentMode(int)
*
- * @see MarginLayoutParams#leftMargin
- * @see MarginLayoutParams#topMargin
- * @see MarginLayoutParams#rightMargin
- * @see MarginLayoutParams#bottomMargin
+ * @see ViewGroup.MarginLayoutParams#leftMargin
+ * @see ViewGroup.MarginLayoutParams#topMargin
+ * @see ViewGroup.MarginLayoutParams#rightMargin
+ * @see ViewGroup.MarginLayoutParams#bottomMargin
*
* @attr ref android.R.styleable#GridLayout_useDefaultMargins
*/
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 13729874d369..51e481d8445b 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -80,7 +80,7 @@ import java.io.IOException;
*
* <p>
* To learn more about Drawables, see: <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.
- * To learn more about working with Bitmaps, see: <a href="{@docRoot}topic/performance/graphics/index.htm">Handling Bitmaps</a>.
+ * To learn more about working with Bitmaps, see: <a href="{@docRoot}topic/performance/graphics/index.html">Handling Bitmaps</a>.
* </p>
*
* @attr ref android.R.styleable#ImageView_adjustViewBounds
@@ -109,9 +109,10 @@ public class ImageView extends View {
private ColorFilter mColorFilter = null;
private boolean mHasColorFilter = false;
private Xfermode mXfermode;
+ private boolean mHasXfermode = false;
private int mAlpha = 255;
+ private boolean mHasAlpha = false;
private final int mViewAlphaScale = 256;
- private boolean mColorMod = false;
private Drawable mDrawable = null;
private BitmapDrawable mRecycleableBitmapDrawable = null;
@@ -1007,7 +1008,9 @@ public class ImageView extends View {
mDrawableWidth = d.getIntrinsicWidth();
mDrawableHeight = d.getIntrinsicHeight();
applyImageTint();
- applyColorMod();
+ applyColorFilter();
+ applyAlpha();
+ applyXfermode();
configureBounds();
} else {
@@ -1462,8 +1465,8 @@ public class ImageView extends View {
public final void setXfermode(Xfermode mode) {
if (mXfermode != mode) {
mXfermode = mode;
- mColorMod = true;
- applyColorMod();
+ mHasXfermode = true;
+ applyXfermode();
invalidate();
}
}
@@ -1490,8 +1493,7 @@ public class ImageView extends View {
if (mColorFilter != cf) {
mColorFilter = cf;
mHasColorFilter = true;
- mColorMod = true;
- applyColorMod();
+ applyColorFilter();
invalidate();
}
}
@@ -1535,22 +1537,29 @@ public class ImageView extends View {
alpha &= 0xFF; // keep it legal
if (mAlpha != alpha) {
mAlpha = alpha;
- mColorMod = true;
- applyColorMod();
+ mHasAlpha = true;
+ applyAlpha();
invalidate();
}
}
- private void applyColorMod() {
- // Only mutate and apply when modifications have occurred. This should
- // not reset the mColorMod flag, since these filters need to be
- // re-applied if the Drawable is changed.
- if (mDrawable != null && mColorMod) {
+ private void applyXfermode() {
+ if (mDrawable != null && mHasXfermode) {
mDrawable = mDrawable.mutate();
- if (mHasColorFilter) {
- mDrawable.setColorFilter(mColorFilter);
- }
mDrawable.setXfermode(mXfermode);
+ }
+ }
+
+ private void applyColorFilter() {
+ if (mDrawable != null && mHasColorFilter) {
+ mDrawable = mDrawable.mutate();
+ mDrawable.setColorFilter(mColorFilter);
+ }
+ }
+
+ private void applyAlpha() {
+ if (mDrawable != null && mHasAlpha) {
+ mDrawable = mDrawable.mutate();
mDrawable.setAlpha(mAlpha * mViewAlphaScale >> 8);
}
}
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 929496f2d237..11054c81f342 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -611,7 +611,6 @@ public final class Magnifier {
mRenderer.destroy();
mSurfaceControl.destroy();
mSurfaceSession.kill();
- mBitmapRenderNode.destroy();
mHandler.removeCallbacks(mMagnifierUpdater);
if (mBitmap != null) {
mBitmap.recycle();
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 4865dab6056a..22c840b3bf7e 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -68,7 +68,7 @@ import android.view.ViewStub;
import android.widget.AdapterView.OnItemClickListener;
import com.android.internal.R;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.internal.util.Preconditions;
import java.lang.annotation.ElementType;
@@ -2155,7 +2155,7 @@ public class RemoteViews implements Parcelable, Filter {
View v = viewsToProcess.pop();
if (v instanceof TextView) {
TextView textView = (TextView) v;
- textView.setText(NotificationColorUtil.clearColorSpans(textView.getText()));
+ textView.setText(ContrastColorUtil.clearColorSpans(textView.getText()));
textView.setTextColor(textColor);
}
if (v instanceof ViewGroup) {
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index 3d4f54624ecf..fc1172e0457a 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -119,8 +119,9 @@ public class SpellChecker implements SpellCheckerSessionListener {
mTextServicesManager = (TextServicesManager) mTextView.getContext().
getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
- if (!mTextServicesManager.isSpellCheckerEnabled()
- || mCurrentLocale == null
+ if (mCurrentLocale == null
+ || mTextView.length() == 0
+ || !mTextServicesManager.isSpellCheckerEnabled()
|| mTextServicesManager.getCurrentSpellCheckerSubtype(true) == null) {
mSpellCheckerSession = null;
} else {
diff --git a/core/java/android/widget/TextInputTimePickerView.java b/core/java/android/widget/TextInputTimePickerView.java
index e0261ad04f58..23f258284efa 100644
--- a/core/java/android/widget/TextInputTimePickerView.java
+++ b/core/java/android/widget/TextInputTimePickerView.java
@@ -20,10 +20,12 @@ import android.content.Context;
import android.os.LocaleList;
import android.text.Editable;
import android.text.InputFilter;
+import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.MathUtils;
import android.view.View;
+import android.view.accessibility.AccessibilityManager;
import com.android.internal.R;
@@ -54,6 +56,7 @@ public class TextInputTimePickerView extends RelativeLayout {
private OnValueTypedListener mListener;
private boolean mErrorShowing;
+ private boolean mTimeSet;
interface OnValueTypedListener {
void onValueChanged(int inputType, int newValue);
@@ -93,7 +96,13 @@ public class TextInputTimePickerView extends RelativeLayout {
@Override
public void afterTextChanged(Editable editable) {
- parseAndSetHourInternal(editable.toString());
+ if (parseAndSetHourInternal(editable.toString()) && editable.length() > 1) {
+ AccessibilityManager am = (AccessibilityManager) context.getSystemService(
+ context.ACCESSIBILITY_SERVICE);
+ if (!am.isEnabled()) {
+ mMinuteEditText.requestFocus();
+ }
+ }
}
});
@@ -148,8 +157,15 @@ public class TextInputTimePickerView extends RelativeLayout {
}
boolean validateInput() {
- final boolean inputValid = parseAndSetHourInternal(mHourEditText.getText().toString())
- && parseAndSetMinuteInternal(mMinuteEditText.getText().toString());
+ final String hourText = TextUtils.isEmpty(mHourEditText.getText())
+ ? mHourEditText.getHint().toString()
+ : mHourEditText.getText().toString();
+ final String minuteText = TextUtils.isEmpty(mMinuteEditText.getText())
+ ? mMinuteEditText.getHint().toString()
+ : mMinuteEditText.getText().toString();
+
+ final boolean inputValid = parseAndSetHourInternal(hourText)
+ && parseAndSetMinuteInternal(minuteText);
setError(!inputValid);
return inputValid;
}
@@ -166,6 +182,14 @@ public class TextInputTimePickerView extends RelativeLayout {
mMinuteLabel.setVisibility(enabled ? View.INVISIBLE : View.VISIBLE);
}
+ private void setTimeSet(boolean timeSet) {
+ mTimeSet = mTimeSet || timeSet;
+ }
+
+ private boolean isTimeSet() {
+ return mTimeSet;
+ }
+
/**
* Computes the display value and updates the text of the view.
* <p>
@@ -188,8 +212,14 @@ public class TextInputTimePickerView extends RelativeLayout {
mAmPmSpinner.setSelection(1);
}
- mHourEditText.setText(String.format(hourFormat, localizedHour));
- mMinuteEditText.setText(String.format(minuteFormat, minute));
+ if (isTimeSet()) {
+ mHourEditText.setText(String.format(hourFormat, localizedHour));
+ mMinuteEditText.setText(String.format(minuteFormat, minute));
+ } else {
+ mHourEditText.setHint(String.format(hourFormat, localizedHour));
+ mMinuteEditText.setHint(String.format(minuteFormat, minute));
+ }
+
if (mErrorShowing) {
validateInput();
@@ -207,6 +237,7 @@ public class TextInputTimePickerView extends RelativeLayout {
return false;
}
mListener.onValueChanged(HOURS, getHourOfDayFromLocalizedHour(hour));
+ setTimeSet(true);
return true;
} catch (NumberFormatException e) {
// Do nothing since we cannot parse the input.
@@ -222,6 +253,7 @@ public class TextInputTimePickerView extends RelativeLayout {
return false;
}
mListener.onValueChanged(MINUTES, minutes);
+ setTimeSet(true);
return true;
} catch (NumberFormatException e) {
// Do nothing since we cannot parse the input.
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index a57d154532eb..ea546969ae4d 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -247,6 +247,7 @@ import java.util.function.Supplier;
* @attr ref android.R.styleable#TextView_textColorHint
* @attr ref android.R.styleable#TextView_textAppearance
* @attr ref android.R.styleable#TextView_textColorLink
+ * @attr ref android.R.styleable#TextView_textFontWeight
* @attr ref android.R.styleable#TextView_textSize
* @attr ref android.R.styleable#TextView_textScaleX
* @attr ref android.R.styleable#TextView_fontFamily
@@ -1508,6 +1509,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
setText(text, bufferType);
+ if (mText == null) {
+ mText = "";
+ }
+ if (mTransformed == null) {
+ mTransformed = "";
+ }
+
if (textIsSetFromXml) {
mTextSetFromXmlOrResourceId = true;
}
@@ -2192,6 +2200,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
+ * @hide
+ */
+ @VisibleForTesting
+ public CharSequence getTransformed() {
+ return mTransformed;
+ }
+
+ /**
* Gets the vertical distance between lines of text, in pixels.
* Note that markup within the text can cause individual lines
* to be taller or shorter than this height, and the layout may
@@ -3279,14 +3295,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
/**
* Updates the top padding of the TextView so that {@code firstBaselineToTopHeight} is
- * equal to the distance between the firt text baseline and the top of this TextView.
+ * the distance between the top of the TextView and first line's baseline.
+ * <p>
+ * <img src="{@docRoot}reference/android/images/text/widget/first_last_baseline.png" />
+ * <figcaption>First and last baseline metrics for a TextView.</figcaption>
+ *
* <strong>Note</strong> that if {@code FontMetrics.top} or {@code FontMetrics.ascent} was
* already greater than {@code firstBaselineToTopHeight}, the top padding is not updated.
+ * Moreover since this function sets the top padding, if the height of the TextView is less than
+ * the sum of top padding, line height and bottom padding, top of the line will be pushed
+ * down and bottom will be clipped.
*
* @param firstBaselineToTopHeight distance between first baseline to top of the container
* in pixels
*
* @see #getFirstBaselineToTopHeight()
+ * @see #setLastBaselineToBottomHeight(int)
* @see #setPadding(int, int, int, int)
* @see #setPaddingRelative(int, int, int, int)
*
@@ -3314,14 +3338,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
/**
* Updates the bottom padding of the TextView so that {@code lastBaselineToBottomHeight} is
- * equal to the distance between the last text baseline and the bottom of this TextView.
+ * the distance between the bottom of the TextView and the last line's baseline.
+ * <p>
+ * <img src="{@docRoot}reference/android/images/text/widget/first_last_baseline.png" />
+ * <figcaption>First and last baseline metrics for a TextView.</figcaption>
+ *
* <strong>Note</strong> that if {@code FontMetrics.bottom} or {@code FontMetrics.descent} was
* already greater than {@code lastBaselineToBottomHeight}, the bottom padding is not updated.
+ * Moreover since this function sets the bottom padding, if the height of the TextView is less
+ * than the sum of top padding, line height and bottom padding, bottom of the text will be
+ * clipped.
*
* @param lastBaselineToBottomHeight distance between last baseline to bottom of the container
* in pixels
*
* @see #getLastBaselineToBottomHeight()
+ * @see #setFirstBaselineToTopHeight(int)
* @see #setPadding(int, int, int, int)
* @see #setPaddingRelative(int, int, int, int)
*
@@ -3419,7 +3451,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
ColorStateList mTextColor = null;
ColorStateList mTextColorHint = null;
ColorStateList mTextColorLink = null;
- int mTextSize = 0;
+ int mTextSize = -1;
String mFontFamily = null;
Typeface mFontTypeface = null;
boolean mFontFamilyExplicit = false;
@@ -3630,7 +3662,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
setHighlightColor(attributes.mTextColorHighlight);
}
- if (attributes.mTextSize != 0) {
+ if (attributes.mTextSize != -1) {
setRawTextSize(attributes.mTextSize, true /* shouldRequestLayout */);
}
@@ -5193,7 +5225,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @param lineHeight the line height in pixels
*
* @see #setLineSpacing(float, float)
- * @see #getLineSpacing()
+ * @see #getLineSpacingExtra()
*
* @attr ref android.R.styleable#TextView_lineHeight
*/
@@ -5555,6 +5587,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* {@link android.text.Editable.Factory} to create final or intermediate
* {@link Editable Editables}.
*
+ * Subclasses overriding this method should ensure that the following post condition holds,
+ * in order to guarantee the safety of the view's measurement and layout operations:
+ * regardless of the input, after calling #setText both {@code mText} and {@code mTransformed}
+ * will be different from {@code null}.
+ *
* @param text text to be displayed
* @param type a {@link android.widget.TextView.BufferType} which defines whether the text is
* stored as a static text, styleable/spannable text, or editable text
@@ -5690,6 +5727,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
} else {
mTransformed = mTransformation.getTransformation(text, this);
}
+ if (mTransformed == null) {
+ // Should not happen if the transformation method follows the non-null postcondition.
+ mTransformed = "";
+ }
final int textLength = text.length();
@@ -6932,7 +6973,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
public boolean hasOverlappingRendering() {
// horizontal fading edge causes SaveLayerAlpha, which doesn't support alpha modulation
return ((getBackground() != null && getBackground().getCurrent() != null)
- || mSpannable != null || hasSelection() || isHorizontalFadingEdgeEnabled());
+ || mSpannable != null || hasSelection() || isHorizontalFadingEdgeEnabled()
+ || mShadowColor != 0);
}
/**
diff --git a/core/java/android/widget/Toolbar.java b/core/java/android/widget/Toolbar.java
index bf3085d6f1d1..79c19029d425 100644
--- a/core/java/android/widget/Toolbar.java
+++ b/core/java/android/widget/Toolbar.java
@@ -1008,6 +1008,98 @@ public class Toolbar extends ViewGroup {
}
/**
+ * Retrieve the currently configured content description for the collapse button view.
+ * This will be used to describe the collapse action to users through mechanisms such
+ * as screen readers or tooltips.
+ *
+ * @return The collapse button's content description
+ *
+ * @attr ref android.R.styleable#Toolbar_collapseContentDescription
+ */
+ @Nullable
+ public CharSequence getCollapseContentDescription() {
+ return mCollapseButtonView != null ? mCollapseButtonView.getContentDescription() : null;
+ }
+
+ /**
+ * Set a content description for the collapse button if one is present. The content description
+ * will be read via screen readers or other accessibility systems to explain the action of the
+ * collapse button.
+ *
+ * @param resId Resource ID of a content description string to set, or 0 to
+ * clear the description
+ *
+ * @attr ref android.R.styleable#Toolbar_collapseContentDescription
+ */
+ public void setCollapseContentDescription(@StringRes int resId) {
+ setCollapseContentDescription(resId != 0 ? getContext().getText(resId) : null);
+ }
+
+ /**
+ * Set a content description for the collapse button if one is present. The content description
+ * will be read via screen readers or other accessibility systems to explain the action of the
+ * navigation button.
+ *
+ * @param description Content description to set, or <code>null</code> to
+ * clear the content description
+ *
+ * @attr ref android.R.styleable#Toolbar_collapseContentDescription
+ */
+ public void setCollapseContentDescription(@Nullable CharSequence description) {
+ if (!TextUtils.isEmpty(description)) {
+ ensureCollapseButtonView();
+ }
+ if (mCollapseButtonView != null) {
+ mCollapseButtonView.setContentDescription(description);
+ }
+ }
+
+ /**
+ * Return the current drawable used as the collapse icon.
+ *
+ * @return The collapse icon drawable
+ *
+ * @attr ref android.R.styleable#Toolbar_collapseIcon
+ */
+ @Nullable
+ public Drawable getCollapseIcon() {
+ return mCollapseButtonView != null ? mCollapseButtonView.getDrawable() : null;
+ }
+
+ /**
+ * Set the icon to use for the toolbar's collapse button.
+ *
+ * <p>The collapse button appears at the start of the toolbar when an action view is present
+ * .</p>
+ *
+ * @param resId Resource ID of a drawable to set
+ *
+ * @attr ref android.R.styleable#Toolbar_collapseIcon
+ */
+ public void setCollapseIcon(@DrawableRes int resId) {
+ setCollapseIcon(getContext().getDrawable(resId));
+ }
+
+ /**
+ * Set the icon to use for the toolbar's collapse button.
+ *
+ * <p>The collapse button appears at the start of the toolbar when an action view is present
+ * .</p>
+ *
+ * @param icon Drawable to set, may be null to use the default icon
+ *
+ * @attr ref android.R.styleable#Toolbar_collapseIcon
+ */
+ public void setCollapseIcon(@Nullable Drawable icon) {
+ if (icon != null) {
+ ensureCollapseButtonView();
+ mCollapseButtonView.setImageDrawable(icon);
+ } else if (mCollapseButtonView != null) {
+ mCollapseButtonView.setImageDrawable(mCollapseIcon);
+ }
+ }
+
+ /**
* Return the Menu shown in the toolbar.
*
* <p>Applications that wish to populate the toolbar's menu can do so from here. To use
diff --git a/core/java/com/android/internal/app/HarmfulAppWarningActivity.java b/core/java/com/android/internal/app/HarmfulAppWarningActivity.java
index 99666264cb22..ce2d229d41b3 100644
--- a/core/java/com/android/internal/app/HarmfulAppWarningActivity.java
+++ b/core/java/com/android/internal/app/HarmfulAppWarningActivity.java
@@ -21,6 +21,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
@@ -82,7 +83,10 @@ public class HarmfulAppWarningActivity extends AlertActivity implements
final View view = getLayoutInflater().inflate(R.layout.harmful_app_warning_dialog,
null /*root*/);
((TextView) view.findViewById(R.id.app_name_text))
- .setText(applicationInfo.loadSafeLabel(getPackageManager()));
+ .setText(applicationInfo.loadSafeLabel(getPackageManager(),
+ PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
+ PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE
+ | PackageItemInfo.SAFE_LABEL_FLAG_TRIM));
((TextView) view.findViewById(R.id.message))
.setText(mHarmfulAppWarning);
return view;
diff --git a/core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java b/core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java
index 4f41875d0deb..7735d84ab751 100644
--- a/core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java
+++ b/core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java
@@ -20,6 +20,7 @@ import com.android.internal.R;
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ApplicationInfo;
@@ -126,7 +127,7 @@ public class HeavyWeightSwitcherActivity extends Activity {
private OnClickListener mSwitchOldListener = new OnClickListener() {
public void onClick(View v) {
try {
- ActivityManager.getService().moveTaskToFront(mCurTask, 0, null);
+ ActivityTaskManager.getService().moveTaskToFront(mCurTask, 0, null);
} catch (RemoteException e) {
}
finish();
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index 0ed972477123..768dddd35a6d 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -33,7 +33,7 @@ interface IAppOpsService {
void stopWatchingMode(IAppOpsCallback callback);
IBinder getToken(IBinder clientToken);
int permissionToOpCode(String permission);
- int noteProxyOperation(int code, String proxyPackageName,
+ int noteProxyOperation(int code, int proxyUid, String proxyPackageName,
int callingUid, String callingPackageName);
// Remaining methods are only used in Java.
diff --git a/core/java/com/android/internal/app/ISoundTriggerService.aidl b/core/java/com/android/internal/app/ISoundTriggerService.aidl
index 93730df7dd47..b8a2dff95c37 100644
--- a/core/java/com/android/internal/app/ISoundTriggerService.aidl
+++ b/core/java/com/android/internal/app/ISoundTriggerService.aidl
@@ -43,15 +43,10 @@ interface ISoundTriggerService {
int loadGenericSoundModel(in SoundTrigger.GenericSoundModel soundModel);
int loadKeyphraseSoundModel(in SoundTrigger.KeyphraseSoundModel soundModel);
- int startRecognitionForIntent(in ParcelUuid soundModelId, in PendingIntent callbackIntent,
- in SoundTrigger.RecognitionConfig config);
-
-
int startRecognitionForService(in ParcelUuid soundModelId, in Bundle params,
in ComponentName callbackIntent,in SoundTrigger.RecognitionConfig config);
- /** For both ...Intent and ...Service based usage */
- int stopRecognitionForIntent(in ParcelUuid soundModelId);
+ int stopRecognitionForService(in ParcelUuid soundModelId);
int unloadSoundModel(in ParcelUuid soundModelId);
diff --git a/core/java/com/android/internal/app/IntentForwarderActivity.java b/core/java/com/android/internal/app/IntentForwarderActivity.java
index 398d08791b5c..abb9321a50a8 100644
--- a/core/java/com/android/internal/app/IntentForwarderActivity.java
+++ b/core/java/com/android/internal/app/IntentForwarderActivity.java
@@ -18,6 +18,7 @@ package com.android.internal.app;
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.ActivityThread;
import android.app.AppGlobals;
import android.app.admin.DevicePolicyManager;
@@ -112,9 +113,9 @@ public class IntentForwarderActivity extends Activity {
int launchedFromUid = -1;
String launchedFromPackage = "?";
try {
- launchedFromUid = ActivityManager.getService().getLaunchedFromUid(
+ launchedFromUid = ActivityTaskManager.getService().getLaunchedFromUid(
getActivityToken());
- launchedFromPackage = ActivityManager.getService().getLaunchedFromPackage(
+ launchedFromPackage = ActivityTaskManager.getService().getLaunchedFromPackage(
getActivityToken());
} catch (RemoteException ignored) {
}
diff --git a/core/java/com/android/internal/app/LocaleStore.java b/core/java/com/android/internal/app/LocaleStore.java
index d24701372453..1d997f5767d3 100644
--- a/core/java/com/android/internal/app/LocaleStore.java
+++ b/core/java/com/android/internal/app/LocaleStore.java
@@ -21,6 +21,7 @@ import android.os.LocaleList;
import android.provider.Settings;
import android.telephony.TelephonyManager;
+import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IllformedLocaleException;
@@ -31,7 +32,7 @@ public class LocaleStore {
private static final HashMap<String, LocaleInfo> sLocaleCache = new HashMap<>();
private static boolean sFullyInitialized = false;
- public static class LocaleInfo {
+ public static class LocaleInfo implements Serializable {
private static final int SUGGESTION_TYPE_NONE = 0;
private static final int SUGGESTION_TYPE_SIM = 1 << 0;
private static final int SUGGESTION_TYPE_CFG = 1 << 1;
diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java
index f6a69d9aeb93..57785443919e 100644
--- a/core/java/com/android/internal/app/PlatLogoActivity.java
+++ b/core/java/com/android/internal/app/PlatLogoActivity.java
@@ -18,6 +18,9 @@ package com.android.internal.app;
import android.animation.TimeAnimator;
import android.app.Activity;
+import android.content.ActivityNotFoundException;
+import android.content.ContentResolver;
+import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
@@ -25,12 +28,15 @@ import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.provider.Settings;
import android.util.Log;
import android.view.MotionEvent;
import android.view.MotionEvent.PointerCoords;
import android.view.View;
import android.widget.FrameLayout;
+import org.json.JSONObject;
+
public class PlatLogoActivity extends Activity {
FrameLayout layout;
TimeAnimator anim;
@@ -87,7 +93,7 @@ public class PlatLogoActivity extends Activity {
darkest = 0;
for (int i=0; i<slots; i++) {
palette[i] = Color.HSVToColor(color);
- color[0] += 360f/slots;
+ color[0] = (color[0] + 360f/slots) % 360f;
if (lum(palette[i]) < lum(palette[darkest])) darkest = i;
}
@@ -178,27 +184,97 @@ public class PlatLogoActivity extends Activity {
bg = new PBackground();
layout.setBackground(bg);
+ final ContentResolver cr = getContentResolver();
+
layout.setOnTouchListener(new View.OnTouchListener() {
+ final String TOUCH_STATS = "touch.stats";
+
final PointerCoords pc0 = new PointerCoords();
final PointerCoords pc1 = new PointerCoords();
+ double pressure_min, pressure_max;
+ int maxPointers;
+ int tapCount;
+
@Override
public boolean onTouch(View v, MotionEvent event) {
+ final float pressure = event.getPressure();
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
+ pressure_min = pressure_max = pressure;
+ // fall through
case MotionEvent.ACTION_MOVE:
- if (event.getPointerCount() > 1) {
+ if (pressure < pressure_min) pressure_min = pressure;
+ if (pressure > pressure_max) pressure_max = pressure;
+ final int pc = event.getPointerCount();
+ if (pc > maxPointers) maxPointers = pc;
+ if (pc > 1) {
event.getPointerCoords(0, pc0);
event.getPointerCoords(1, pc1);
bg.setRadius((float) Math.hypot(pc0.x - pc1.x, pc0.y - pc1.y) / 2f);
}
break;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ try {
+ final String touchDataJson = Settings.System.getString(cr, TOUCH_STATS);
+ final JSONObject touchData = new JSONObject(
+ touchDataJson != null ? touchDataJson : "{}");
+ if (touchData.has("min")) {
+ pressure_min = Math.min(pressure_min, touchData.getDouble("min"));
+ }
+ if (touchData.has("max")) {
+ pressure_max = Math.max(pressure_max, touchData.getDouble("max"));
+ }
+ touchData.put("min", pressure_min);
+ touchData.put("max", pressure_max);
+ Settings.System.putString(cr, TOUCH_STATS, touchData.toString());
+ } catch (Exception e) {
+ Log.e("PlatLogoActivity", "Can't write touch settings", e);
+ }
+
+ if (maxPointers == 1) {
+ tapCount ++;
+ if (tapCount < 7) {
+ bg.randomizePalette();
+ } else {
+ launchNextStage();
+ }
+ } else {
+ tapCount = 0;
+ }
+ maxPointers = 0;
+ break;
}
return true;
}
});
}
+ private void launchNextStage() {
+ final ContentResolver cr = getContentResolver();
+
+ if (Settings.System.getLong(cr, Settings.System.EGG_MODE, 0) == 0) {
+ // For posterity: the moment this user unlocked the easter egg
+ try {
+ Settings.System.putLong(cr,
+ Settings.System.EGG_MODE,
+ System.currentTimeMillis());
+ } catch (RuntimeException e) {
+ Log.e("PlatLogoActivity", "Can't write settings", e);
+ }
+ }
+ try {
+ startActivity(new Intent(Intent.ACTION_MAIN)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_CLEAR_TASK)
+ .addCategory("com.android.internal.category.PLATLOGO"));
+ } catch (ActivityNotFoundException ex) {
+ Log.e("PlatLogoActivity", "No more eggs.");
+ }
+ finish();
+ }
+
@Override
public void onStart() {
super.onStart();
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index ceb06f511108..0a812c68854f 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -21,6 +21,7 @@ import android.annotation.StringRes;
import android.annotation.UiThread;
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.ActivityThread;
import android.app.VoiceInteractor.PickOptionRequest;
import android.app.VoiceInteractor.PickOptionRequest.Option;
@@ -260,7 +261,7 @@ public class ResolverActivity extends Activity {
setProfileSwitchMessageId(intent.getContentUserHint());
try {
- mLaunchedFromUid = ActivityManager.getService().getLaunchedFromUid(
+ mLaunchedFromUid = ActivityTaskManager.getService().getLaunchedFromUid(
getActivityToken());
} catch (RemoteException e) {
mLaunchedFromUid = -1;
@@ -846,7 +847,7 @@ public class ResolverActivity extends Activity {
} catch (RuntimeException e) {
String launchedFromPackage;
try {
- launchedFromPackage = ActivityManager.getService().getLaunchedFromPackage(
+ launchedFromPackage = ActivityTaskManager.getService().getLaunchedFromPackage(
getActivityToken());
} catch (RemoteException e2) {
launchedFromPackage = "??";
diff --git a/core/java/com/android/internal/app/procstats/AssociationState.java b/core/java/com/android/internal/app/procstats/AssociationState.java
new file mode 100644
index 000000000000..e5d6556e1218
--- /dev/null
+++ b/core/java/com/android/internal/app/procstats/AssociationState.java
@@ -0,0 +1,472 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.app.procstats;
+
+
+import android.os.Parcel;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.util.ArrayMap;
+import android.util.Slog;
+import android.util.TimeUtils;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Objects;
+
+public final class AssociationState {
+ private static final String TAG = "ProcessStats";
+ private static final boolean DEBUG = false;
+
+ private final ProcessStats mProcessStats;
+ private final ProcessStats.PackageState mPackageState;
+ private final String mProcessName;
+ private final String mName;
+ private final DurationsTable mDurations;
+
+ public final class SourceState {
+ final SourceKey mKey;
+ int mProcStateSeq = -1;
+ int mProcState = ProcessStats.STATE_NOTHING;
+ boolean mInTrackingList;
+ int mNesting;
+ int mCount;
+ long mStartUptime;
+ long mDuration;
+ long mTrackingUptime;
+ int mActiveCount;
+ long mActiveStartUptime;
+ long mActiveDuration;
+
+ SourceState(SourceKey key) {
+ mKey = key;
+ }
+
+ public AssociationState getAssociationState() {
+ return AssociationState.this;
+ }
+
+ public String getProcessName() {
+ return mKey.mProcess;
+ }
+
+ public int getUid() {
+ return mKey.mUid;
+ }
+
+ public void trackProcState(int procState, int seq, long now) {
+ procState = ProcessState.PROCESS_STATE_TO_STATE[procState];
+ if (seq != mProcStateSeq) {
+ mProcStateSeq = seq;
+ mProcState = procState;
+ } else if (procState < mProcState) {
+ mProcState = procState;
+ }
+ if (procState < ProcessStats.STATE_HOME) {
+ if (!mInTrackingList) {
+ mInTrackingList = true;
+ mTrackingUptime = now;
+ mProcessStats.mTrackingAssociations.add(this);
+ }
+ } else {
+ stopTracking(now);
+ }
+ }
+
+ public void stop() {
+ mNesting--;
+ if (mNesting == 0) {
+ mDuration += SystemClock.uptimeMillis() - mStartUptime;
+ mNumActive--;
+ stopTracking(SystemClock.uptimeMillis());
+ }
+ }
+
+ void startActive(long now) {
+ if (mInTrackingList) {
+ if (mActiveStartUptime == 0) {
+ mActiveStartUptime = now;
+ mActiveCount++;
+ }
+ } else {
+ Slog.wtf(TAG, "startActive while not tracking: " + this);
+ }
+ }
+
+ void stopActive(long now) {
+ if (mActiveStartUptime != 0) {
+ if (!mInTrackingList) {
+ Slog.wtf(TAG, "stopActive while not tracking: " + this);
+ }
+ mActiveDuration += now - mActiveStartUptime;
+ mActiveStartUptime = 0;
+ }
+ }
+
+ void stopTracking(long now) {
+ stopActive(now);
+ if (mInTrackingList) {
+ mInTrackingList = false;
+ // Do a manual search for where to remove, since these objects will typically
+ // be towards the end of the array.
+ final ArrayList<SourceState> list = mProcessStats.mTrackingAssociations;
+ for (int i = list.size() - 1; i >= 0; i--) {
+ if (list.get(i) == this) {
+ list.remove(i);
+ return;
+ }
+ }
+ Slog.wtf(TAG, "Stop tracking didn't find in tracking list: " + this);
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder(64);
+ sb.append("SourceState{").append(Integer.toHexString(System.identityHashCode(this)))
+ .append(" ").append(mKey.mProcess).append("/").append(mKey.mUid);
+ if (mProcState != ProcessStats.STATE_NOTHING) {
+ sb.append(" ").append(DumpUtils.STATE_NAMES[mProcState]).append(" #")
+ .append(mProcStateSeq);
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+ }
+
+ private final static class SourceKey {
+ /**
+ * UID, consider this final. Not final just to avoid a temporary object during lookup.
+ */
+ int mUid;
+
+ /**
+ * Process name, consider this final. Not final just to avoid a temporary object during
+ * lookup.
+ */
+ String mProcess;
+
+ SourceKey(int uid, String process) {
+ mUid = uid;
+ mProcess = process;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof SourceKey)) {
+ return false;
+ }
+ SourceKey s = (SourceKey) o;
+ return s.mUid == mUid && Objects.equals(s.mProcess, mProcess);
+ }
+
+ @Override
+ public int hashCode() {
+ return Integer.hashCode(mUid) ^ (mProcess == null ? 0 : mProcess.hashCode());
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder(64);
+ sb.append("SourceKey{");
+ UserHandle.formatUid(sb, mUid);
+ sb.append(' ');
+ sb.append(mProcess);
+ sb.append('}');
+ return sb.toString();
+ }
+ }
+
+ /**
+ * All known sources for this target component... uid -> process name -> source state.
+ */
+ private final ArrayMap<SourceKey, SourceState> mSources = new ArrayMap<>();
+
+ private final SourceKey mTmpSourceKey = new SourceKey(0, null);
+
+ private ProcessState mProc;
+
+ private int mNumActive;
+
+ public AssociationState(ProcessStats processStats, ProcessStats.PackageState packageState,
+ String name, String processName, ProcessState proc) {
+ mProcessStats = processStats;
+ mPackageState = packageState;
+ mName = name;
+ mProcessName = processName;
+ mDurations = new DurationsTable(processStats.mTableData);
+ mProc = proc;
+ }
+
+ public int getUid() {
+ return mPackageState.mUid;
+ }
+
+ public String getPackage() {
+ return mPackageState.mPackageName;
+ }
+
+ public String getProcessName() {
+ return mProcessName;
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ public ProcessState getProcess() {
+ return mProc;
+ }
+
+ public void setProcess(ProcessState proc) {
+ mProc = proc;
+ }
+
+ public SourceState startSource(int uid, String processName) {
+ mTmpSourceKey.mUid = uid;
+ mTmpSourceKey.mProcess = processName;
+ SourceState src = mSources.get(mTmpSourceKey);
+ if (src == null) {
+ SourceKey key = new SourceKey(uid, processName);
+ src = new SourceState(key);
+ mSources.put(key, src);
+ }
+ src.mNesting++;
+ if (src.mNesting == 1) {
+ src.mCount++;
+ src.mStartUptime = SystemClock.uptimeMillis();
+ mNumActive++;
+ }
+ return src;
+ }
+
+ public void add(AssociationState other) {
+ mDurations.addDurations(other.mDurations);
+ for (int isrc = other.mSources.size() - 1; isrc >= 0; isrc--) {
+ final SourceKey key = other.mSources.keyAt(isrc);
+ final SourceState otherSrc = other.mSources.valueAt(isrc);
+ SourceState mySrc = mSources.get(key);
+ if (mySrc == null) {
+ mySrc = new SourceState(key);
+ mSources.put(key, mySrc);
+ }
+ mySrc.mCount += otherSrc.mCount;
+ mySrc.mDuration += otherSrc.mDuration;
+ mySrc.mActiveCount += otherSrc.mActiveCount;
+ mySrc.mActiveDuration += otherSrc.mActiveDuration;
+ }
+ }
+
+ public boolean isInUse() {
+ return mNumActive > 0;
+ }
+
+ public void resetSafely(long now) {
+ mDurations.resetTable();
+ if (!isInUse()) {
+ mSources.clear();
+ } else {
+ // We have some active sources... clear out everything but those.
+ for (int isrc = mSources.size() - 1; isrc >= 0; isrc--) {
+ SourceState src = mSources.valueAt(isrc);
+ if (src.mNesting > 0) {
+ src.mCount = 1;
+ src.mStartUptime = now;
+ src.mDuration = 0;
+ if (src.mActiveStartUptime > 0) {
+ src.mActiveCount = 1;
+ src.mActiveStartUptime = now;
+ } else {
+ src.mActiveCount = 0;
+ }
+ src.mActiveDuration = 0;
+ } else {
+ mSources.removeAt(isrc);
+ }
+ }
+ }
+ }
+
+ public void writeToParcel(ProcessStats stats, Parcel out, long nowUptime) {
+ mDurations.writeToParcel(out);
+ final int NSRC = mSources.size();
+ out.writeInt(NSRC);
+ for (int isrc = 0; isrc < NSRC; isrc++) {
+ final SourceKey key = mSources.keyAt(isrc);
+ final SourceState src = mSources.valueAt(isrc);
+ out.writeInt(key.mUid);
+ stats.writeCommonString(out, key.mProcess);
+ out.writeInt(src.mCount);
+ out.writeLong(src.mDuration);
+ out.writeInt(src.mActiveCount);
+ out.writeLong(src.mActiveDuration);
+ }
+ }
+
+ /**
+ * Returns non-null if all else fine, else a String that describes the error that
+ * caused it to fail.
+ */
+ public String readFromParcel(ProcessStats stats, Parcel in, int parcelVersion) {
+ if (!mDurations.readFromParcel(in)) {
+ return "Duration table corrupt";
+ }
+ final int NSRC = in.readInt();
+ if (NSRC < 0 || NSRC > 100000) {
+ return "Association with bad src count: " + NSRC;
+ }
+ for (int isrc = 0; isrc < NSRC; isrc++) {
+ final int uid = in.readInt();
+ final String procName = stats.readCommonString(in, parcelVersion);
+ final SourceKey key = new SourceKey(uid, procName);
+ final SourceState src = new SourceState(key);
+ src.mCount = in.readInt();
+ src.mDuration = in.readLong();
+ src.mActiveCount = in.readInt();
+ src.mActiveDuration = in.readLong();
+ mSources.put(key, src);
+ }
+ return null;
+ }
+
+ public void commitStateTime(long nowUptime) {
+ if (isInUse()) {
+ for (int isrc = mSources.size() - 1; isrc >= 0; isrc--) {
+ SourceState src = mSources.valueAt(isrc);
+ if (src.mNesting > 0) {
+ src.mDuration += nowUptime - src.mStartUptime;
+ src.mStartUptime = nowUptime;
+ }
+ if (src.mActiveStartUptime > 0) {
+ src.mActiveDuration += nowUptime - src.mActiveStartUptime;
+ src.mActiveStartUptime = nowUptime;
+ }
+ }
+ }
+ }
+
+ public void dumpStats(PrintWriter pw, String prefix, String prefixInner, String headerPrefix,
+ long now, long totalTime, boolean dumpSummary, boolean dumpAll) {
+ if (dumpAll) {
+ pw.print(prefix);
+ pw.print("mNumActive=");
+ pw.println(mNumActive);
+ }
+ final int NSRC = mSources.size();
+ for (int isrc = 0; isrc < NSRC; isrc++) {
+ final SourceKey key = mSources.keyAt(isrc);
+ final SourceState src = mSources.valueAt(isrc);
+ pw.print(prefixInner);
+ pw.print("<- ");
+ pw.print(key.mProcess);
+ pw.print(" / ");
+ UserHandle.formatUid(pw, key.mUid);
+ pw.println(":");
+ pw.print(prefixInner);
+ pw.print(" Count ");
+ pw.print(src.mCount);
+ long duration = src.mDuration;
+ if (src.mNesting > 0) {
+ duration += now - src.mStartUptime;
+ }
+ if (dumpAll) {
+ pw.print(" / Duration ");
+ TimeUtils.formatDuration(duration, pw);
+ pw.print(" / ");
+ } else {
+ pw.print(" / time ");
+ }
+ DumpUtils.printPercent(pw, (double)duration/(double)totalTime);
+ if (src.mNesting > 0) {
+ pw.print(" (running");
+ if (src.mProcState != ProcessStats.STATE_NOTHING) {
+ pw.print(" / ");
+ pw.print(DumpUtils.STATE_NAMES[src.mProcState]);
+ pw.print(" #");
+ pw.print(src.mProcStateSeq);
+ }
+ pw.print(")");
+ }
+ pw.println();
+ if (src.mActiveCount > 0) {
+ pw.print(prefixInner);
+ pw.print(" Active count ");
+ pw.print(src.mActiveCount);
+ duration = src.mActiveDuration;
+ if (src.mActiveStartUptime > 0) {
+ duration += now - src.mActiveStartUptime;
+ }
+ if (dumpAll) {
+ pw.print(" / Duration ");
+ TimeUtils.formatDuration(duration, pw);
+ pw.print(" / ");
+ } else {
+ pw.print(" / time ");
+ }
+ DumpUtils.printPercent(pw, (double)duration/(double)totalTime);
+ if (src.mActiveStartUptime > 0) {
+ pw.print(" (running)");
+ }
+ pw.println();
+ }
+ }
+ }
+
+ public void dumpTimesCheckin(PrintWriter pw, String pkgName, int uid, long vers,
+ String associationName, long now) {
+ final int NSRC = mSources.size();
+ for (int isrc = 0; isrc < NSRC; isrc++) {
+ final SourceKey key = mSources.keyAt(isrc);
+ final SourceState src = mSources.valueAt(isrc);
+ pw.print("pkgasc");
+ pw.print(",");
+ pw.print(pkgName);
+ pw.print(",");
+ pw.print(uid);
+ pw.print(",");
+ pw.print(vers);
+ pw.print(",");
+ pw.print(associationName);
+ pw.print(",");
+ pw.print(key.mProcess);
+ pw.print(",");
+ pw.print(key.mUid);
+ pw.print(",");
+ pw.print(src.mCount);
+ long duration = src.mDuration;
+ if (src.mNesting > 0) {
+ duration += now - src.mStartUptime;
+ }
+ pw.print(",");
+ pw.print(duration);
+ pw.print(",");
+ pw.print(src.mActiveCount);
+ duration = src.mActiveDuration;
+ if (src.mActiveStartUptime > 0) {
+ duration += now - src.mActiveStartUptime;
+ }
+ pw.print(",");
+ pw.print(duration);
+ pw.println();
+ }
+ }
+
+ public String toString() {
+ return "AssociationState{" + Integer.toHexString(System.identityHashCode(this))
+ + " " + mName + " pkg=" + mPackageState.mPackageName + " proc="
+ + Integer.toHexString(System.identityHashCode(mProc)) + "}";
+ }
+}
diff --git a/core/java/com/android/internal/app/procstats/DumpUtils.java b/core/java/com/android/internal/app/procstats/DumpUtils.java
index e38a844fe8fe..06b6552ca59f 100644
--- a/core/java/com/android/internal/app/procstats/DumpUtils.java
+++ b/core/java/com/android/internal/app/procstats/DumpUtils.java
@@ -362,12 +362,13 @@ public final class DumpUtils {
}
}
- public static void dumpProcessSummaryLocked(PrintWriter pw, String prefix,
+ public static void dumpProcessSummaryLocked(PrintWriter pw, String prefix, String header,
ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates,
long now, long totalTime) {
for (int i=procs.size()-1; i>=0; i--) {
final ProcessState proc = procs.get(i);
- proc.dumpSummary(pw, prefix, screenStates, memStates, procStates, now, totalTime);
+ proc.dumpSummary(pw, prefix, header, screenStates, memStates, procStates, now,
+ totalTime);
}
}
diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java
index 65bd48f99cbd..ad42288c25bb 100644
--- a/core/java/com/android/internal/app/procstats/ProcessState.java
+++ b/core/java/com/android/internal/app/procstats/ProcessState.java
@@ -71,7 +71,7 @@ public final class ProcessState {
private static final boolean DEBUG_PARCEL = false;
// Map from process states to the states we track.
- private static final int[] PROCESS_STATE_TO_STATE = new int[] {
+ static final int[] PROCESS_STATE_TO_STATE = new int[] {
STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT
STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI
STATE_TOP, // ActivityManager.PROCESS_STATE_TOP
@@ -129,7 +129,7 @@ public final class ProcessState {
private final PssTable mPssTable;
private ProcessState mCommonProcess;
- private int mCurState = STATE_NOTHING;
+ private int mCurCombinedState = STATE_NOTHING;
private long mStartTime;
private int mLastPssState = STATE_NOTHING;
@@ -180,7 +180,7 @@ public final class ProcessState {
mPackage = pkg;
mUid = uid;
mVersion = vers;
- mCurState = commonProcess.mCurState;
+ mCurCombinedState = commonProcess.mCurCombinedState;
mStartTime = now;
mDurations = new DurationsTable(commonProcess.mStats.mTableData);
mPssTable = new PssTable(commonProcess.mStats.mTableData);
@@ -324,7 +324,7 @@ public final class ProcessState {
public boolean isInUse() {
return mActive || mNumActiveServices > 0 || mNumStartedServices > 0
- || mCurState != STATE_NOTHING;
+ || mCurCombinedState != STATE_NOTHING;
}
public boolean isActive() {
@@ -333,7 +333,7 @@ public final class ProcessState {
public boolean hasAnyData() {
return !(mDurations.getKeyCount() == 0
- && mCurState == STATE_NOTHING
+ && mCurCombinedState == STATE_NOTHING
&& mPssTable.getKeyCount() == 0);
}
@@ -355,7 +355,7 @@ public final class ProcessState {
}
// First update the common process.
- mCommonProcess.setState(state, now);
+ mCommonProcess.setCombinedState(state, now);
// If the common process is not multi-package, there is nothing else to do.
if (!mCommonProcess.mMultiPackage) {
@@ -364,25 +364,29 @@ public final class ProcessState {
if (pkgList != null) {
for (int ip=pkgList.size()-1; ip>=0; ip--) {
- pullFixedProc(pkgList, ip).setState(state, now);
+ pullFixedProc(pkgList, ip).setCombinedState(state, now);
}
}
}
- public void setState(int state, long now) {
+ public void setCombinedState(int state, long now) {
ensureNotDead();
- if (!mDead && (mCurState != state)) {
+ if (!mDead && (mCurCombinedState != state)) {
//Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state);
commitStateTime(now);
- mCurState = state;
+ mCurCombinedState = state;
}
}
+ public int getCombinedState() {
+ return mCurCombinedState;
+ }
+
public void commitStateTime(long now) {
- if (mCurState != STATE_NOTHING) {
+ if (mCurCombinedState != STATE_NOTHING) {
long dur = now - mStartTime;
if (dur > 0) {
- mDurations.addDuration(mCurState, dur);
+ mDurations.addDuration(mCurCombinedState, dur);
}
}
mStartTime = now;
@@ -430,8 +434,8 @@ public final class ProcessState {
mCommonProcess.incStartedServices(memFactor, now, serviceName);
}
mNumStartedServices++;
- if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) {
- setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now);
+ if (mNumStartedServices == 1 && mCurCombinedState == STATE_NOTHING) {
+ setCombinedState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now);
}
}
@@ -446,8 +450,8 @@ public final class ProcessState {
mCommonProcess.decStartedServices(memFactor, now, serviceName);
}
mNumStartedServices--;
- if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) {
- setState(STATE_NOTHING, now);
+ if (mNumStartedServices == 0 && (mCurCombinedState %STATE_COUNT) == STATE_SERVICE_RESTARTING) {
+ setCombinedState(STATE_NOTHING, now);
} else if (mNumStartedServices < 0) {
Slog.wtfStack(TAG, "Proc started services underrun: pkg="
+ mPackage + " uid=" + mUid + " name=" + mName);
@@ -481,16 +485,16 @@ public final class ProcessState {
break;
}
if (!always) {
- if (mLastPssState == mCurState && SystemClock.uptimeMillis()
+ if (mLastPssState == mCurCombinedState && SystemClock.uptimeMillis()
< (mLastPssTime+(30*1000))) {
return;
}
}
- mLastPssState = mCurState;
+ mLastPssState = mCurCombinedState;
mLastPssTime = SystemClock.uptimeMillis();
- if (mCurState != STATE_NOTHING) {
+ if (mCurCombinedState != STATE_NOTHING) {
// First update the common process.
- mCommonProcess.mPssTable.mergeStats(mCurState, 1, pss, pss, pss, uss, uss, uss,
+ mCommonProcess.mPssTable.mergeStats(mCurCombinedState, 1, pss, pss, pss, uss, uss, uss,
rss, rss, rss);
// If the common process is not multi-package, there is nothing else to do.
@@ -500,7 +504,7 @@ public final class ProcessState {
if (pkgList != null) {
for (int ip=pkgList.size()-1; ip>=0; ip--) {
- pullFixedProc(pkgList, ip).mPssTable.mergeStats(mCurState, 1,
+ pullFixedProc(pkgList, ip).mPssTable.mergeStats(mCurCombinedState, 1,
pss, pss, pss, uss, uss, uss, rss, rss, rss);
}
}
@@ -580,7 +584,7 @@ public final class ProcessState {
ProcessStateHolder holder = pkgList.valueAt(index);
ProcessState proc = holder.state;
if (mDead && proc.mCommonProcess != proc) {
- // Somehow we are contining to use a process state that is dead, because
+ // Somehow we are continuing to use a process state that is dead, because
// it was not being told it was active during the last commit. We can recover
// from this by generating a fresh new state, but this is bad because we
// are losing whatever data we had in the old process state.
@@ -600,17 +604,17 @@ public final class ProcessState {
+ pkgList.keyAt(index) + "/" + proc.mUid
+ " for multi-proc " + proc.mName);
}
- PackageState pkg = vpkg.get(proc.mVersion);
- if (pkg == null) {
+ PackageState expkg = vpkg.get(proc.mVersion);
+ if (expkg == null) {
throw new IllegalStateException("No existing package "
+ pkgList.keyAt(index) + "/" + proc.mUid
+ " for multi-proc " + proc.mName + " version " + proc.mVersion);
}
String savedName = proc.mName;
- proc = pkg.mProcesses.get(proc.mName);
+ proc = expkg.mProcesses.get(proc.mName);
if (proc == null) {
throw new IllegalStateException("Didn't create per-package process "
- + savedName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid);
+ + savedName + " in pkg " + expkg.mPackageName + "/" + expkg.mUid);
}
holder.state = proc;
}
@@ -619,7 +623,7 @@ public final class ProcessState {
public long getDuration(int state, long now) {
long time = mDurations.getValueForId((byte)state);
- if (mCurState == state) {
+ if (mCurCombinedState == state) {
time += now - mStartTime;
}
return time;
@@ -724,7 +728,7 @@ public final class ProcessState {
final int key = mDurations.getKeyAt(i);
final int type = SparseMappingTable.getIdFromKey(key);
long time = mDurations.getValue(key);
- if (mCurState == type) {
+ if (mCurCombinedState == type) {
time += now - mStartTime;
}
final int procState = type % STATE_COUNT;
@@ -769,11 +773,14 @@ public final class ProcessState {
return totalTime;
}
- public void dumpSummary(PrintWriter pw, String prefix,
+ public void dumpSummary(PrintWriter pw, String prefix, String header,
int[] screenStates, int[] memStates, int[] procStates,
long now, long totalTime) {
pw.print(prefix);
pw.print("* ");
+ if (header != null) {
+ pw.print(header);
+ }
pw.print(mName);
pw.print(" / ");
UserHandle.formatUid(pw, mUid);
@@ -824,7 +831,7 @@ public final class ProcessState {
final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
long time = mDurations.getValueForId((byte)bucket);
String running = "";
- if (mCurState == bucket) {
+ if (mCurCombinedState == bucket) {
running = " (running)";
}
if (time != 0) {
@@ -1174,14 +1181,14 @@ public final class ProcessState {
final int key = mDurations.getKeyAt(i);
final int type = SparseMappingTable.getIdFromKey(key);
long time = mDurations.getValue(key);
- if (mCurState == type) {
+ if (mCurCombinedState == type) {
didCurState = true;
time += now - mStartTime;
}
DumpUtils.printProcStateTagAndValue(pw, type, time);
}
- if (!didCurState && mCurState != STATE_NOTHING) {
- DumpUtils.printProcStateTagAndValue(pw, mCurState, now - mStartTime);
+ if (!didCurState && mCurCombinedState != STATE_NOTHING) {
+ DumpUtils.printProcStateTagAndValue(pw, mCurCombinedState, now - mStartTime);
}
}
@@ -1248,14 +1255,14 @@ public final class ProcessState {
final int key = mDurations.getKeyAt(i);
final int type = SparseMappingTable.getIdFromKey(key);
long time = mDurations.getValue(key);
- if (mCurState == type) {
+ if (mCurCombinedState == type) {
didCurState = true;
time += now - mStartTime;
}
durationByState.put(type, time);
}
- if (!didCurState && mCurState != STATE_NOTHING) {
- durationByState.put(mCurState, now - mStartTime);
+ if (!didCurState && mCurCombinedState != STATE_NOTHING) {
+ durationByState.put(mCurCombinedState, now - mStartTime);
}
for (int i=0; i<mPssTable.getKeyCount(); i++) {
diff --git a/core/java/com/android/internal/app/procstats/ProcessStats.java b/core/java/com/android/internal/app/procstats/ProcessStats.java
index d35bdddb3c57..15f140e2ea2d 100644
--- a/core/java/com/android/internal/app/procstats/ProcessStats.java
+++ b/core/java/com/android/internal/app/procstats/ProcessStats.java
@@ -16,6 +16,7 @@
package com.android.internal.app.procstats;
+import android.content.ComponentName;
import android.os.Debug;
import android.os.Parcel;
import android.os.Parcelable;
@@ -157,7 +158,7 @@ public final class ProcessStats implements Parcelable {
};
// Current version of the parcel format.
- private static final int PARCEL_VERSION = 27;
+ private static final int PARCEL_VERSION = 32;
// In-memory Parcel magic number, used to detect attempts to unmarshall bad data
private static final int MAGIC = 0x50535454;
@@ -168,6 +169,8 @@ public final class ProcessStats implements Parcelable {
public final ProcessMap<LongSparseArray<PackageState>> mPackages = new ProcessMap<>();
public final ProcessMap<ProcessState> mProcesses = new ProcessMap<>();
+ public final ArrayList<AssociationState.SourceState> mTrackingAssociations = new ArrayList<>();
+
public final long[] mMemFactorDurations = new long[ADJ_COUNT];
public int mMemFactor = STATE_NOTHING;
public long mStartTime;
@@ -250,6 +253,7 @@ public final class ProcessStats implements Parcelable {
final PackageState otherState = versions.valueAt(iv);
final int NPROCS = otherState.mProcesses.size();
final int NSRVS = otherState.mServices.size();
+ final int NASCS = otherState.mAssociations.size();
for (int iproc=0; iproc<NPROCS; iproc++) {
ProcessState otherProc = otherState.mProcesses.valueAt(iproc);
if (otherProc.getCommonProcess() != otherProc) {
@@ -277,6 +281,14 @@ public final class ProcessStats implements Parcelable {
otherSvc.getProcessName(), otherSvc.getName());
thisSvc.add(otherSvc);
}
+ for (int iasc=0; iasc<NASCS; iasc++) {
+ AssociationState otherAsc = otherState.mAssociations.valueAt(iasc);
+ if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
+ + " association " + otherAsc.getName());
+ AssociationState thisAsc = getAssociationStateLocked(pkgName, uid, vers,
+ otherAsc.getProcessName(), otherAsc.getName());
+ thisAsc.add(otherAsc);
+ }
}
}
}
@@ -478,7 +490,16 @@ public final class ProcessStats implements Parcelable {
pkgState.mServices.removeAt(isvc);
}
}
- if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) {
+ for (int iasc=pkgState.mAssociations.size()-1; iasc>=0; iasc--) {
+ final AssociationState as = pkgState.mAssociations.valueAt(iasc);
+ if (as.isInUse()) {
+ as.resetSafely(now);
+ } else {
+ pkgState.mAssociations.removeAt(iasc);
+ }
+ }
+ if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0
+ && pkgState.mAssociations.size() <= 0) {
vpkgs.removeAt(iv);
}
}
@@ -708,7 +729,7 @@ public final class ProcessStats implements Parcelable {
}
}
- private void writeCommonString(Parcel out, String name) {
+ void writeCommonString(Parcel out, String name) {
Integer index = mCommonStringToIndex.get(name);
if (index != null) {
out.writeInt(index);
@@ -720,7 +741,7 @@ public final class ProcessStats implements Parcelable {
out.writeString(name);
}
- private String readCommonString(Parcel in, int version) {
+ String readCommonString(Parcel in, int version) {
if (version <= 9) {
return in.readString();
}
@@ -791,6 +812,10 @@ public final class ProcessStats implements Parcelable {
for (int isvc=0; isvc<NSRVS; isvc++) {
pkgState.mServices.valueAt(isvc).commitStateTime(now);
}
+ final int NASCS = pkgState.mAssociations.size();
+ for (int iasc=0; iasc<NASCS; iasc++) {
+ pkgState.mAssociations.valueAt(iasc).commitStateTime(now);
+ }
}
}
}
@@ -874,6 +899,14 @@ public final class ProcessStats implements Parcelable {
writeCommonString(out, svc.getProcessName());
svc.writeToParcel(out, now);
}
+ final int NASCS = pkgState.mAssociations.size();
+ out.writeInt(NASCS);
+ for (int iasc=0; iasc<NASCS; iasc++) {
+ writeCommonString(out, pkgState.mAssociations.keyAt(iasc));
+ final AssociationState asc = pkgState.mAssociations.valueAt(iasc);
+ writeCommonString(out, asc.getProcessName());
+ asc.writeToParcel(this, out, now);
+ }
}
}
}
@@ -1078,7 +1111,7 @@ public final class ProcessStats implements Parcelable {
while (NVERS > 0) {
NVERS--;
final long vers = in.readLong();
- PackageState pkgState = new PackageState(pkgName, uid);
+ PackageState pkgState = new PackageState(this, pkgName, uid, vers);
LongSparseArray<PackageState> vpkg = mPackages.get(pkgName, uid);
if (vpkg == null) {
vpkg = new LongSparseArray<>();
@@ -1157,6 +1190,34 @@ public final class ProcessStats implements Parcelable {
+ serviceName + " " + uid + " " + serv);
pkgState.mServices.put(serviceName, serv);
}
+ int NASCS = in.readInt();
+ if (NASCS < 0) {
+ mReadError = "bad package association count: " + NASCS;
+ return;
+ }
+ while (NASCS > 0) {
+ NASCS--;
+ String associationName = readCommonString(in, version);
+ if (associationName == null) {
+ mReadError = "bad package association name";
+ return;
+ }
+ String processName = readCommonString(in, version);
+ AssociationState asc = hadData
+ ? pkgState.mAssociations.get(associationName) : null;
+ if (asc == null) {
+ asc = new AssociationState(this, pkgState, associationName,
+ processName, null);
+ }
+ String errorMsg = asc.readFromParcel(this, in, version);
+ if (errorMsg != null) {
+ mReadError = errorMsg;
+ return;
+ }
+ if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " association: "
+ + associationName + " " + uid + " " + asc);
+ pkgState.mAssociations.put(associationName, asc);
+ }
}
}
}
@@ -1183,33 +1244,38 @@ public final class ProcessStats implements Parcelable {
public PackageState getPackageStateLocked(String packageName, int uid, long vers) {
LongSparseArray<PackageState> vpkg = mPackages.get(packageName, uid);
if (vpkg == null) {
- vpkg = new LongSparseArray<PackageState>();
+ vpkg = new LongSparseArray<>();
mPackages.put(packageName, uid, vpkg);
}
PackageState as = vpkg.get(vers);
if (as != null) {
return as;
}
- as = new PackageState(packageName, uid);
+ as = new PackageState(this, packageName, uid, vers);
vpkg.put(vers, as);
return as;
}
public ProcessState getProcessStateLocked(String packageName, int uid, long vers,
String processName) {
- final PackageState pkgState = getPackageStateLocked(packageName, uid, vers);
+ return getProcessStateLocked(getPackageStateLocked(packageName, uid, vers), processName);
+ }
+
+ public ProcessState getProcessStateLocked(PackageState pkgState, String processName) {
ProcessState ps = pkgState.mProcesses.get(processName);
if (ps != null) {
return ps;
}
- ProcessState commonProc = mProcesses.get(processName, uid);
+ ProcessState commonProc = mProcesses.get(processName, pkgState.mUid);
if (commonProc == null) {
- commonProc = new ProcessState(this, packageName, uid, vers, processName);
- mProcesses.put(processName, uid, commonProc);
+ commonProc = new ProcessState(this, pkgState.mPackageName, pkgState.mUid,
+ pkgState.mVersionCode, processName);
+ mProcesses.put(processName, pkgState.mUid, commonProc);
if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc);
}
if (!commonProc.isMultiPackage()) {
- if (packageName.equals(commonProc.getPackage()) && vers == commonProc.getVersion()) {
+ if (pkgState.mPackageName.equals(commonProc.getPackage())
+ && pkgState.mVersionCode == commonProc.getVersion()) {
// This common process is not in use by multiple packages, and
// is for the calling package, so we can just use it directly.
ps = commonProc;
@@ -1228,7 +1294,7 @@ public final class ProcessStats implements Parcelable {
// First let's make a copy of the current process state and put
// that under the now unique state for its original package name.
final PackageState commonPkgState = getPackageStateLocked(commonProc.getPackage(),
- uid, commonProc.getVersion());
+ pkgState.mUid, commonProc.getVersion());
if (commonPkgState != null) {
ProcessState cloned = commonProc.clone(now);
if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.getPackage()
@@ -1245,18 +1311,31 @@ public final class ProcessStats implements Parcelable {
Slog.d(TAG, "GETPROC leaving proc of " + ss);
}
}
+ // Also update active associations.
+ for (int i=commonPkgState.mAssociations.size()-1; i>=0; i--) {
+ AssociationState as = commonPkgState.mAssociations.valueAt(i);
+ if (as.getProcess() == commonProc) {
+ if (DEBUG) Slog.d(TAG, "GETPROC switching association to cloned: "
+ + as);
+ as.setProcess(cloned);
+ } else if (DEBUG) {
+ Slog.d(TAG, "GETPROC leaving proc of " + as);
+ }
+ }
} else {
Slog.w(TAG, "Cloning proc state: no package state " + commonProc.getPackage()
- + "/" + uid + " for proc " + commonProc.getName());
+ + "/" + pkgState.mUid + " for proc " + commonProc.getName());
}
// And now make a fresh new process state for the new package name.
- ps = new ProcessState(commonProc, packageName, uid, vers, processName, now);
+ ps = new ProcessState(commonProc, pkgState.mPackageName, pkgState.mUid,
+ pkgState.mVersionCode, processName, now);
if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
}
} else {
// The common process is for multiple packages, we need to create a
// separate object for the per-package data.
- ps = new ProcessState(commonProc, packageName, uid, vers, processName,
+ ps = new ProcessState(commonProc, pkgState.mPackageName, pkgState.mUid,
+ pkgState.mVersionCode, processName,
SystemClock.uptimeMillis());
if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps);
}
@@ -1281,6 +1360,52 @@ public final class ProcessStats implements Parcelable {
return ss;
}
+ public AssociationState getAssociationStateLocked(String packageName, int uid, long vers,
+ String processName, String className) {
+ final ProcessStats.PackageState pkgs = getPackageStateLocked(packageName, uid, vers);
+ AssociationState as = pkgs.mAssociations.get(className);
+ if (as != null) {
+ if (DEBUG) Slog.d(TAG, "GETASC: returning existing " + as);
+ return as;
+ }
+ final ProcessState procs = processName != null
+ ? getProcessStateLocked(packageName, uid, vers, processName) : null;
+ as = new AssociationState(this, pkgs, className, processName, procs);
+ pkgs.mAssociations.put(className, as);
+ if (DEBUG) Slog.d(TAG, "GETASC: creating " + as + " in " + procs);
+ return as;
+ }
+
+ public void updateTrackingAssociationsLocked(int curSeq, long now) {
+ final int NUM = mTrackingAssociations.size();
+ for (int i = NUM - 1; i >= 0; i--) {
+ final AssociationState.SourceState act = mTrackingAssociations.get(i);
+ if (act.mProcStateSeq != curSeq) {
+ act.mInTrackingList = false;
+ act.mProcState = STATE_NOTHING;
+ mTrackingAssociations.remove(i);
+ } else {
+ final ProcessState proc = act.getAssociationState().getProcess();
+ if (proc != null) {
+ final int procState = proc.getCombinedState() % STATE_COUNT;
+ if (act.mProcState == procState) {
+ act.startActive(now);
+ } else {
+ act.stopActive(now);
+ if (act.mProcState < procState) {
+ Slog.w(TAG, "Tracking association " + act + " whose proc state "
+ + act.mProcState + " is better than process " + proc
+ + " proc state " + procState);
+ }
+ }
+ } else {
+ Slog.wtf(TAG, "Tracking association without process: " + act
+ + " in " + act.getAssociationState());
+ }
+ }
+ }
+ }
+
public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary,
boolean dumpAll, boolean activeOnly) {
long totalTime = DumpUtils.dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
@@ -1304,6 +1429,7 @@ public final class ProcessStats implements Parcelable {
final PackageState pkgState = vpkgs.valueAt(iv);
final int NPROCS = pkgState.mProcesses.size();
final int NSRVS = pkgState.mServices.size();
+ final int NASCS = pkgState.mAssociations.size();
final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName);
if (!pkgMatch) {
boolean procMatch = false;
@@ -1318,7 +1444,7 @@ public final class ProcessStats implements Parcelable {
continue;
}
}
- if (NPROCS > 0 || NSRVS > 0) {
+ if (NPROCS > 0 || NSRVS > 0 || NASCS > 0) {
if (!printedHeader) {
if (sepNeeded) pw.println();
pw.println("Per-Package Stats:");
@@ -1368,7 +1494,7 @@ public final class ProcessStats implements Parcelable {
}
procs.add(proc);
}
- DumpUtils.dumpProcessSummaryLocked(pw, " ", procs,
+ DumpUtils.dumpProcessSummaryLocked(pw, " ", "Prc ", procs,
ALL_SCREEN_ADJ, ALL_MEM_ADJ, NON_CACHED_PROC_STATES,
now, totalTime);
}
@@ -1378,14 +1504,14 @@ public final class ProcessStats implements Parcelable {
continue;
}
if (activeOnly && !svc.isInUse()) {
- pw.print(" (Not active: ");
+ pw.print(" (Not active service: ");
pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")");
continue;
}
if (dumpAll) {
pw.print(" Service ");
} else {
- pw.print(" * ");
+ pw.print(" * Svc ");
}
pw.print(pkgState.mServices.keyAt(isvc));
pw.println(":");
@@ -1393,6 +1519,27 @@ public final class ProcessStats implements Parcelable {
svc.dumpStats(pw, " ", " ", " ",
now, totalTime, dumpSummary, dumpAll);
}
+ for (int iasc=0; iasc<NASCS; iasc++) {
+ AssociationState asc = pkgState.mAssociations.valueAt(iasc);
+ if (!pkgMatch && !reqPackage.equals(asc.getProcessName())) {
+ continue;
+ }
+ if (activeOnly && !asc.isInUse()) {
+ pw.print(" (Not active association: ");
+ pw.print(pkgState.mAssociations.keyAt(iasc)); pw.println(")");
+ continue;
+ }
+ if (dumpAll) {
+ pw.print(" Association ");
+ } else {
+ pw.print(" * Asc ");
+ }
+ pw.print(pkgState.mAssociations.keyAt(iasc));
+ pw.println(":");
+ pw.print(" Process: "); pw.println(asc.getProcessName());
+ asc.dumpStats(pw, " ", " ", " ",
+ now, totalTime, dumpSummary, dumpAll);
+ }
}
}
}
@@ -1440,17 +1587,77 @@ public final class ProcessStats implements Parcelable {
proc.dumpInternalLocked(pw, " ", dumpAll);
}
}
+
if (dumpAll) {
- pw.println();
+ if (sepNeeded) {
+ pw.println();
+ }
+ sepNeeded = true;
pw.print(" Total procs: "); pw.print(numShownProcs);
pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total");
+ if (mTrackingAssociations.size() > 0) {
+ pw.println();
+ pw.println("Tracking associations:");
+ for (int i = 0; i < mTrackingAssociations.size(); i++) {
+ final AssociationState.SourceState src = mTrackingAssociations.get(i);
+ final AssociationState asc = src.getAssociationState();
+ pw.print(" #");
+ pw.print(i);
+ pw.print(": ");
+ pw.print(asc.getProcessName());
+ pw.print("/");
+ UserHandle.formatUid(pw, asc.getUid());
+ pw.print(" <- ");
+ pw.print(src.getProcessName());
+ pw.print("/");
+ UserHandle.formatUid(pw, src.getUid());
+ pw.println(":");
+ pw.print(" Tracking for: ");
+ TimeUtils.formatDuration(now - src.mTrackingUptime, pw);
+ pw.println();
+ pw.print(" Component: ");
+ pw.print(new ComponentName(asc.getPackage(), asc.getName())
+ .flattenToShortString());
+ pw.println();
+ pw.print(" Proc state: ");
+ if (src.mProcState != ProcessStats.STATE_NOTHING) {
+ pw.print(DumpUtils.STATE_NAMES[src.mProcState]);
+ } else {
+ pw.print("--");
+ }
+ pw.print(" #");
+ pw.println(src.mProcStateSeq);
+ pw.print(" Process: ");
+ pw.println(asc.getProcess());
+ if (src.mActiveCount > 0) {
+ pw.print(" Active count ");
+ pw.print(src.mActiveCount);
+ long duration = src.mActiveDuration;
+ if (src.mActiveStartUptime > 0) {
+ duration += now - src.mActiveStartUptime;
+ }
+ if (dumpAll) {
+ pw.print(" / Duration ");
+ TimeUtils.formatDuration(duration, pw);
+ pw.print(" / ");
+ } else {
+ pw.print(" / time ");
+ }
+ DumpUtils.printPercent(pw, (double)duration/(double)totalTime);
+ if (src.mActiveStartUptime > 0) {
+ pw.print(" (running)");
+ }
+ pw.println();
+ }
+ }
+ }
}
if (sepNeeded) {
pw.println();
}
if (dumpSummary) {
- pw.println("Summary:");
+ pw.println("Process summary:");
dumpSummaryLocked(pw, reqPackage, now, activeOnly);
} else {
dumpTotalsLocked(pw, now);
@@ -1466,13 +1673,15 @@ public final class ProcessStats implements Parcelable {
pw.print(" mRunning="); pw.println(mRunning);
}
- dumpFragmentationLocked(pw);
+ if (reqPackage == null) {
+ dumpFragmentationLocked(pw);
+ }
}
public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) {
long totalTime = DumpUtils.dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
mStartTime, now);
- dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ,
+ dumpFilteredSummaryLocked(pw, null, " ", null, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly);
pw.println();
dumpTotalsLocked(pw, now);
@@ -1607,7 +1816,7 @@ public final class ProcessStats implements Parcelable {
pw.println();
}
- void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix,
+ void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, String prcLabel,
int[] screenStates, int[] memStates, int[] procStates,
int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) {
ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates,
@@ -1617,7 +1826,7 @@ public final class ProcessStats implements Parcelable {
pw.println();
pw.println(header);
}
- DumpUtils.dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates,
+ DumpUtils.dumpProcessSummaryLocked(pw, prefix, prcLabel, procs, screenStates, memStates,
sortProcStates, now, totalTime);
}
}
@@ -1708,6 +1917,7 @@ public final class ProcessStats implements Parcelable {
final PackageState pkgState = vpkgs.valueAt(iv);
final int NPROCS = pkgState.mProcesses.size();
final int NSRVS = pkgState.mServices.size();
+ final int NASCS = pkgState.mAssociations.size();
for (int iproc=0; iproc<NPROCS; iproc++) {
ProcessState proc = pkgState.mProcesses.valueAt(iproc);
proc.dumpPackageProcCheckin(pw, pkgName, uid, vers,
@@ -1719,6 +1929,12 @@ public final class ProcessStats implements Parcelable {
final ServiceState svc = pkgState.mServices.valueAt(isvc);
svc.dumpTimesCheckin(pw, pkgName, uid, vers, serviceName, now);
}
+ for (int iasc=0; iasc<NASCS; iasc++) {
+ final String associationName = DumpUtils.collapseString(pkgName,
+ pkgState.mAssociations.keyAt(iasc));
+ final AssociationState asc = pkgState.mAssociations.valueAt(iasc);
+ asc.dumpTimesCheckin(pw, pkgName, uid, vers, associationName, now);
+ }
}
}
}
@@ -1850,6 +2066,7 @@ public final class ProcessStats implements Parcelable {
final public static class ProcessStateHolder {
public final long appVersion;
public ProcessState state;
+ public PackageState pkg;
public ProcessStateHolder(long _appVersion) {
appVersion = _appVersion;
@@ -1857,16 +2074,35 @@ public final class ProcessStats implements Parcelable {
}
public static final class PackageState {
- public final ArrayMap<String, ProcessState> mProcesses
- = new ArrayMap<String, ProcessState>();
- public final ArrayMap<String, ServiceState> mServices
- = new ArrayMap<String, ServiceState>();
+ public final ProcessStats mProcessStats;
+ public final ArrayMap<String, ProcessState> mProcesses = new ArrayMap<>();
+ public final ArrayMap<String, ServiceState> mServices = new ArrayMap<>();
+ public final ArrayMap<String, AssociationState> mAssociations = new ArrayMap<>();
public final String mPackageName;
public final int mUid;
+ public final long mVersionCode;
- public PackageState(String packageName, int uid) {
+ public PackageState(ProcessStats procStats, String packageName, int uid, long versionCode) {
+ mProcessStats = procStats;
mUid = uid;
mPackageName = packageName;
+ mVersionCode = versionCode;
+ }
+
+ public AssociationState getAssociationStateLocked(ProcessState proc, String className) {
+ AssociationState as = mAssociations.get(className);
+ if (as != null) {
+ if (DEBUG) Slog.d(TAG, "GETASC: returning existing " + as);
+ if (proc != null) {
+ as.setProcess(proc);
+ }
+ return as;
+ }
+ as = new AssociationState(mProcessStats, this, className, proc.getName(),
+ proc);
+ mAssociations.put(className, as);
+ if (DEBUG) Slog.d(TAG, "GETASC: creating " + as + " in " + proc.getName());
+ return as;
}
}
diff --git a/core/java/com/android/internal/app/procstats/ServiceState.java b/core/java/com/android/internal/app/procstats/ServiceState.java
index 650de2ea2b68..04e61e067f53 100644
--- a/core/java/com/android/internal/app/procstats/ServiceState.java
+++ b/core/java/com/android/internal/app/procstats/ServiceState.java
@@ -18,30 +18,13 @@ package com.android.internal.app.procstats;
import android.os.Parcel;
-import android.os.Parcelable;
import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.os.UserHandle;
-import android.text.format.DateFormat;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.DebugUtils;
-import android.util.Log;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.TimeUtils;
-import com.android.internal.app.procstats.ProcessStats;
import static com.android.internal.app.procstats.ProcessStats.STATE_NOTHING;
-import java.io.IOException;
-import java.io.InputStream;
import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Objects;
public final class ServiceState {
private static final String TAG = "ProcessStats";
@@ -51,7 +34,8 @@ public final class ServiceState {
public static final int SERVICE_STARTED = 1;
public static final int SERVICE_BOUND = 2;
public static final int SERVICE_EXEC = 3;
- public static final int SERVICE_COUNT = 4;
+ public static final int SERVICE_FOREGROUND = 4;
+ public static final int SERVICE_COUNT = 5;
private final String mPackage;
private final String mProcessName;
@@ -79,6 +63,10 @@ public final class ServiceState {
private int mExecState = STATE_NOTHING;
private long mExecStartTime;
+ private int mForegroundCount;
+ private int mForegroundState = STATE_NOTHING;
+ private long mForegroundStartTime;
+
public ServiceState(ProcessStats processStats, String pkg, String name,
String processName, ProcessState proc) {
mPackage = pkg;
@@ -121,6 +109,9 @@ public final class ServiceState {
if (mExecState != ProcessStats.STATE_NOTHING) {
setExecuting(true, memFactor, now);
}
+ if (mForegroundState != ProcessStats.STATE_NOTHING) {
+ setForeground(true, memFactor, now);
+ }
}
}
@@ -133,7 +124,8 @@ public final class ServiceState {
// There was already an old owner, reset this object for its
// new owner.
mOwner = newOwner;
- if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) {
+ if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING
+ || mForegroundState != STATE_NOTHING) {
long now = SystemClock.uptimeMillis();
if (mStarted) {
if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
@@ -153,6 +145,12 @@ public final class ServiceState {
+ mPackage + " service=" + mName + " proc=" + mProc);
setExecuting(false, 0, now);
}
+ if (mForegroundState != STATE_NOTHING) {
+ if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner
+ + " from " + mOwner + " while foreground: pkg="
+ + mPackage + " service=" + mName + " proc=" + mProc);
+ setForeground(false, 0, now);
+ }
}
}
}
@@ -161,7 +159,8 @@ public final class ServiceState {
public void clearCurrentOwner(Object owner, boolean silently) {
if (mOwner == owner) {
mProc.decActiveServices(mName);
- if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) {
+ if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING
+ || mForegroundState != STATE_NOTHING) {
long now = SystemClock.uptimeMillis();
if (mStarted) {
if (!silently) {
@@ -187,6 +186,14 @@ public final class ServiceState {
}
setExecuting(false, 0, now);
}
+ if (mForegroundState != STATE_NOTHING) {
+ if (!silently) {
+ Slog.wtfStack(TAG, "Service owner " + owner
+ + " cleared while foreground: pkg=" + mPackage + " service="
+ + mName + " proc=" + mProc);
+ }
+ setForeground(false, 0, now);
+ }
}
mOwner = null;
}
@@ -206,6 +213,7 @@ public final class ServiceState {
mStartedCount += other.mStartedCount;
mBoundCount += other.mBoundCount;
mExecCount += other.mExecCount;
+ mForegroundCount += other.mForegroundCount;
}
public void resetSafely(long now) {
@@ -214,7 +222,9 @@ public final class ServiceState {
mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0;
mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0;
mExecCount = mExecState != STATE_NOTHING ? 1 : 0;
- mRunStartTime = mStartedStartTime = mBoundStartTime = mExecStartTime = now;
+ mForegroundCount = mForegroundState != STATE_NOTHING ? 1 : 0;
+ mRunStartTime = mStartedStartTime = mBoundStartTime = mExecStartTime =
+ mForegroundStartTime = now;
}
public void writeToParcel(Parcel out, long now) {
@@ -223,6 +233,7 @@ public final class ServiceState {
out.writeInt(mStartedCount);
out.writeInt(mBoundCount);
out.writeInt(mExecCount);
+ out.writeInt(mForegroundCount);
}
public boolean readFromParcel(Parcel in) {
@@ -233,6 +244,7 @@ public final class ServiceState {
mStartedCount = in.readInt();
mBoundCount = in.readInt();
mExecCount = in.readInt();
+ mForegroundCount = in.readInt();
return true;
}
@@ -257,11 +269,17 @@ public final class ServiceState {
now - mExecStartTime);
mExecStartTime = now;
}
+ if (mForegroundState != STATE_NOTHING) {
+ mDurations.addDuration(SERVICE_FOREGROUND + (mForegroundState*SERVICE_COUNT),
+ now - mForegroundStartTime);
+ mForegroundStartTime = now;
+ }
}
private void updateRunning(int memFactor, long now) {
final int state = (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING
- || mExecState != STATE_NOTHING) ? memFactor : STATE_NOTHING;
+ || mExecState != STATE_NOTHING || mForegroundState != STATE_NOTHING)
+ ? memFactor : STATE_NOTHING;
if (mRunState != state) {
if (mRunState != STATE_NOTHING) {
mDurations.addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT),
@@ -348,6 +366,24 @@ public final class ServiceState {
}
}
+ public void setForeground(boolean foreground, int memFactor, long now) {
+ if (mOwner == null) {
+ Slog.wtf(TAG, "Foregrounding service " + this + " without owner");
+ }
+ final int state = foreground ? memFactor : STATE_NOTHING;
+ if (mForegroundState != state) {
+ if (mForegroundState != STATE_NOTHING) {
+ mDurations.addDuration(SERVICE_FOREGROUND + (mForegroundState*SERVICE_COUNT),
+ now - mForegroundStartTime);
+ } else if (foreground) {
+ mForegroundCount++;
+ }
+ mForegroundState = state;
+ mForegroundStartTime = now;
+ updateRunning(memFactor, now);
+ }
+ }
+
public long getDuration(int opType, int curState, long startTime, int memFactor,
long now) {
int state = opType + (memFactor*SERVICE_COUNT);
@@ -366,6 +402,9 @@ public final class ServiceState {
dumpStats(pw, prefix, prefixInner, headerPrefix, "Started",
mStartedCount, ServiceState.SERVICE_STARTED, mStartedState,
mStartedStartTime, now, totalTime, !dumpSummary || dumpAll);
+ dumpStats(pw, prefix, prefixInner, headerPrefix, "Foreground",
+ mForegroundCount, ServiceState.SERVICE_FOREGROUND, mForegroundState,
+ mForegroundStartTime, now, totalTime, !dumpSummary || dumpAll);
dumpStats(pw, prefix, prefixInner, headerPrefix, "Bound",
mBoundCount, ServiceState.SERVICE_BOUND, mBoundState,
mBoundStartTime, now, totalTime, !dumpSummary || dumpAll);
@@ -393,11 +432,19 @@ public final class ServiceState {
pw.print(" op count "); pw.print(count); pw.println(":");
dumpTime(pw, prefixInner, serviceType, state, startTime, now);
} else {
- long myTime = dumpTime(null, null, serviceType, state, startTime, now);
+ long myTime = dumpTimeInternal(null, null, serviceType, state, startTime, now,
+ true);
pw.print(prefix); pw.print(headerPrefix); pw.print(header);
pw.print(" count "); pw.print(count);
pw.print(" / time ");
+ boolean isRunning = myTime < 0;
+ if (isRunning) {
+ myTime = -myTime;
+ }
DumpUtils.printPercent(pw, (double)myTime/(double)totalTime);
+ if (isRunning) {
+ pw.print(" (running)");
+ }
pw.println();
}
}
@@ -405,8 +452,14 @@ public final class ServiceState {
public long dumpTime(PrintWriter pw, String prefix,
int serviceType, int curState, long curStartTime, long now) {
+ return dumpTimeInternal(pw, prefix, serviceType, curState, curStartTime, now, false);
+ }
+
+ long dumpTimeInternal(PrintWriter pw, String prefix,
+ int serviceType, int curState, long curStartTime, long now, boolean negativeIfRunning) {
long totalTime = 0;
int printedScreen = -1;
+ boolean isRunning = false;
for (int iscreen=0; iscreen<ProcessStats.ADJ_COUNT; iscreen+=ProcessStats.ADJ_SCREEN_MOD) {
int printedMem = -1;
for (int imem=0; imem<ProcessStats.ADJ_MEM_FACTOR_COUNT; imem++) {
@@ -415,6 +468,7 @@ public final class ServiceState {
String running = "";
if (curState == state && pw != null) {
running = " (running)";
+ isRunning = true;
}
if (time != 0) {
if (pw != null) {
@@ -438,7 +492,7 @@ public final class ServiceState {
TimeUtils.formatDuration(totalTime, pw);
pw.println();
}
- return totalTime;
+ return (isRunning && negativeIfRunning) ? -totalTime : totalTime;
}
public void dumpTimesCheckin(PrintWriter pw, String pkgName, int uid, long vers,
@@ -447,6 +501,9 @@ public final class ServiceState {
ServiceState.SERVICE_RUN, mRunCount, mRunState, mRunStartTime, now);
dumpTimeCheckin(pw, "pkgsvc-start", pkgName, uid, vers, serviceName,
ServiceState.SERVICE_STARTED, mStartedCount, mStartedState, mStartedStartTime, now);
+ dumpTimeCheckin(pw, "pkgsvc-fg", pkgName, uid, vers, serviceName,
+ ServiceState.SERVICE_FOREGROUND, mForegroundCount, mForegroundState,
+ mForegroundStartTime, now);
dumpTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, vers, serviceName,
ServiceState.SERVICE_BOUND, mBoundCount, mBoundState, mBoundStartTime, now);
dumpTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, vers, serviceName,
@@ -497,6 +554,6 @@ public final class ServiceState {
public String toString() {
return "ServiceState{" + Integer.toHexString(System.identityHashCode(this))
+ " " + mName + " pkg=" + mPackage + " proc="
- + Integer.toHexString(System.identityHashCode(this)) + "}";
+ + Integer.toHexString(System.identityHashCode(mProc)) + "}";
}
}
diff --git a/core/java/com/android/internal/app/procstats/SparseMappingTable.java b/core/java/com/android/internal/app/procstats/SparseMappingTable.java
index 91b205479988..6b8703d37f70 100644
--- a/core/java/com/android/internal/app/procstats/SparseMappingTable.java
+++ b/core/java/com/android/internal/app/procstats/SparseMappingTable.java
@@ -175,7 +175,6 @@ public class SparseMappingTable {
* Get the value for the given key and offset from that key.
*
* @param key A key as obtained from getKey or getOrAddKey.
- * @param value The value to set.
*/
public long getValue(int key) {
return getValue(key, 0);
@@ -187,7 +186,6 @@ public class SparseMappingTable {
* @param key A key as obtained from getKey or getOrAddKey.
* @param index The offset from that key. Must be less than the count
* provided to getOrAddKey when the space was allocated.
- * @param value The value to set.
*
* @return the value, or 0 in case of an error
*/
diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java
index b591163e8728..f89a9d990b76 100644
--- a/core/java/com/android/internal/content/FileSystemProvider.java
+++ b/core/java/com/android/internal/content/FileSystemProvider.java
@@ -136,7 +136,7 @@ public abstract class FileSystemProvider extends DocumentsProvider {
return null;
}
- String mimeType = getTypeForFile(file);
+ String mimeType = getDocumentType(documentId);
if (!MetadataReader.isSupportedMimeType(mimeType)) {
return null;
}
@@ -418,7 +418,19 @@ public abstract class FileSystemProvider extends DocumentsProvider {
@Override
public String getDocumentType(String documentId) throws FileNotFoundException {
final File file = getFileForDocId(documentId);
- return getTypeForFile(file);
+ if (file.isDirectory()) {
+ return Document.MIME_TYPE_DIR;
+ } else {
+ final int lastDot = documentId.lastIndexOf('.');
+ if (lastDot >= 0) {
+ final String extension = documentId.substring(lastDot + 1).toLowerCase();
+ final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
+ if (mime != null) {
+ return mime;
+ }
+ }
+ return MIMETYPE_OCTET_STREAM;
+ }
}
@Override
@@ -483,7 +495,7 @@ public abstract class FileSystemProvider extends DocumentsProvider {
}
}
- final String mimeType = getTypeForFile(file);
+ final String mimeType = getDocumentType(docId);
final String displayName = file.getName();
if (mimeType.startsWith("image/")) {
flags |= Document.FLAG_SUPPORTS_THUMBNAIL;
@@ -510,31 +522,10 @@ public abstract class FileSystemProvider extends DocumentsProvider {
return row;
}
- private static String getTypeForFile(File file) {
- if (file.isDirectory()) {
- return Document.MIME_TYPE_DIR;
- } else {
- return getTypeForName(file.getName());
- }
- }
-
protected boolean typeSupportsMetadata(String mimeType) {
return MetadataReader.isSupportedMimeType(mimeType);
}
- private static String getTypeForName(String name) {
- final int lastDot = name.lastIndexOf('.');
- if (lastDot >= 0) {
- final String extension = name.substring(lastDot + 1).toLowerCase();
- final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
- if (mime != null) {
- return mime;
- }
- }
-
- return MIMETYPE_OCTET_STREAM;
- }
-
protected final File getFileForDocId(String docId) throws FileNotFoundException {
return getFileForDocId(docId, false);
}
diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
index 26fb6b6415e4..07bb4533c4e0 100644
--- a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
+++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java
@@ -27,9 +27,11 @@ import android.text.TextUtils;
public class AmbientDisplayConfiguration {
private final Context mContext;
+ private final boolean mAlwaysOnByDefault;
public AmbientDisplayConfiguration(Context context) {
mContext = context;
+ mAlwaysOnByDefault = mContext.getResources().getBoolean(R.bool.config_dozeAlwaysOnEnabled);
}
public boolean enabled(int user) {
@@ -101,8 +103,8 @@ public class AmbientDisplayConfiguration {
}
public boolean alwaysOnEnabled(int user) {
- return boolSettingDefaultOn(Settings.Secure.DOZE_ALWAYS_ON, user) && alwaysOnAvailable()
- && !accessibilityInversionEnabled(user);
+ return boolSetting(Settings.Secure.DOZE_ALWAYS_ON, user, mAlwaysOnByDefault ? 1 : 0)
+ && alwaysOnAvailable() && !accessibilityInversionEnabled(user);
}
public boolean alwaysOnAvailable() {
diff --git a/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java b/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java
index dfc06968c42d..14ac2f6cfe31 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodSubtypeSwitchingController.java
@@ -291,22 +291,8 @@ public class InputMethodSubtypeSwitchingController {
return -1;
}
- /**
- * Provides the basic operation to implement bi-directional IME rotation.
- * @param onlyCurrentIme {@code true} to limit the search space to IME subtypes that belong
- * to {@code imi}.
- * @param imi {@link InputMethodInfo} that will be used in conjunction with {@code subtype}
- * from which we find the adjacent IME subtype.
- * @param subtype {@link InputMethodSubtype} that will be used in conjunction with
- * {@code imi} from which we find the next IME subtype. {@code null} if the input method
- * does not have a subtype.
- * @param forward {@code true} to do forward search the next IME subtype. Specify
- * {@code false} to do backward search.
- * @return The IME subtype found. {@code null} if no IME subtype is found.
- */
- @Nullable
public ImeSubtypeListItem getNextInputMethodLocked(boolean onlyCurrentIme,
- InputMethodInfo imi, @Nullable InputMethodSubtype subtype, boolean forward) {
+ InputMethodInfo imi, InputMethodSubtype subtype) {
if (imi == null) {
return null;
}
@@ -318,9 +304,8 @@ public class InputMethodSubtypeSwitchingController {
return null;
}
final int N = mImeSubtypeList.size();
- for (int i = 1; i < N; ++i) {
- // Start searching the next IME/subtype from +/- 1 indices.
- final int offset = forward ? i : N - i;
+ for (int offset = 1; offset < N; ++offset) {
+ // Start searching the next IME/subtype from the next of the current index.
final int candidateIndex = (currentIndex + offset) % N;
final ImeSubtypeListItem candidate = mImeSubtypeList.get(candidateIndex);
// Skip if searching inside the current IME only, but the candidate is not
@@ -392,22 +377,8 @@ public class InputMethodSubtypeSwitchingController {
mUsageHistoryOfSubtypeListItemIndex[0] = currentItemIndex;
}
- /**
- * Provides the basic operation to implement bi-directional IME rotation.
- * @param onlyCurrentIme {@code true} to limit the search space to IME subtypes that belong
- * to {@code imi}.
- * @param imi {@link InputMethodInfo} that will be used in conjunction with {@code subtype}
- * from which we find the adjacent IME subtype.
- * @param subtype {@link InputMethodSubtype} that will be used in conjunction with
- * {@code imi} from which we find the next IME subtype. {@code null} if the input method
- * does not have a subtype.
- * @param forward {@code true} to do forward search the next IME subtype. Specify
- * {@code false} to do backward search.
- * @return The IME subtype found. {@code null} if no IME subtype is found.
- */
- @Nullable
public ImeSubtypeListItem getNextInputMethodLocked(boolean onlyCurrentIme,
- InputMethodInfo imi, @Nullable InputMethodSubtype subtype, boolean forward) {
+ InputMethodInfo imi, InputMethodSubtype subtype) {
int currentUsageRank = getUsageRank(imi, subtype);
if (currentUsageRank < 0) {
if (DEBUG) {
@@ -417,8 +388,7 @@ public class InputMethodSubtypeSwitchingController {
}
final int N = mUsageHistoryOfSubtypeListItemIndex.length;
for (int i = 1; i < N; i++) {
- final int offset = forward ? i : N - i;
- final int subtypeListItemRank = (currentUsageRank + offset) % N;
+ final int subtypeListItemRank = (currentUsageRank + i) % N;
final int subtypeListItemIndex =
mUsageHistoryOfSubtypeListItemIndex[subtypeListItemRank];
final ImeSubtypeListItem subtypeListItem =
@@ -491,31 +461,17 @@ public class InputMethodSubtypeSwitchingController {
mSwitchingUnawareRotationList = switchingUnawareRotationList;
}
- /**
- * Provides the basic operation to implement bi-directional IME rotation.
- * @param onlyCurrentIme {@code true} to limit the search space to IME subtypes that belong
- * to {@code imi}.
- * @param imi {@link InputMethodInfo} that will be used in conjunction with {@code subtype}
- * from which we find the adjacent IME subtype.
- * @param subtype {@link InputMethodSubtype} that will be used in conjunction with
- * {@code imi} from which we find the next IME subtype. {@code null} if the input method
- * does not have a subtype.
- * @param forward {@code true} to do forward search the next IME subtype. Specify
- * {@code false} to do backward search.
- * @return The IME subtype found. {@code null} if no IME subtype is found.
- */
- @Nullable
public ImeSubtypeListItem getNextInputMethod(boolean onlyCurrentIme, InputMethodInfo imi,
- @Nullable InputMethodSubtype subtype, boolean forward) {
+ InputMethodSubtype subtype) {
if (imi == null) {
return null;
}
if (imi.supportsSwitchingToNextInputMethod()) {
return mSwitchingAwareRotationList.getNextInputMethodLocked(onlyCurrentIme, imi,
- subtype, forward);
+ subtype);
} else {
return mSwitchingUnawareRotationList.getNextInputMethodLocked(onlyCurrentIme, imi,
- subtype, forward);
+ subtype);
}
}
@@ -583,14 +539,14 @@ public class InputMethodSubtypeSwitchingController {
}
public ImeSubtypeListItem getNextInputMethodLocked(boolean onlyCurrentIme, InputMethodInfo imi,
- InputMethodSubtype subtype, boolean forward) {
+ InputMethodSubtype subtype) {
if (mController == null) {
if (DEBUG) {
Log.e(TAG, "mController shouldn't be null.");
}
return null;
}
- return mController.getNextInputMethod(onlyCurrentIme, imi, subtype, forward);
+ return mController.getNextInputMethod(onlyCurrentIme, imi, subtype);
}
public List<ImeSubtypeListItem> getSortedInputMethodAndSubtypeListLocked(
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index 9a082ec21b3d..1e5b5c80f31b 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -34,10 +34,6 @@ import android.os.LocaleList;
import android.os.RemoteException;
import android.provider.Settings;
import android.text.TextUtils;
-import android.text.TextUtils.SimpleStringSplitter;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Log;
import android.util.Pair;
import android.util.Printer;
import android.util.Slog;
@@ -71,7 +67,6 @@ public class InputMethodUtils {
private static final String NOT_A_SUBTYPE_ID_STR = String.valueOf(NOT_A_SUBTYPE_ID);
private static final String TAG_ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE =
"EnabledWhenDefaultIsNotAsciiCapable";
- private static final String TAG_ASCII_CAPABLE = "AsciiCapable";
// The string for enabled input method is saved as follows:
// example: ("ime0;subtype0;subtype1;subtype2:ime1:ime2;subtype0")
@@ -129,16 +124,11 @@ public class InputMethodUtils {
}
// ----------------------------------------------------------------------
- public static boolean isSystemIme(InputMethodInfo inputMethod) {
- return (inputMethod.getServiceInfo().applicationInfo.flags
- & ApplicationInfo.FLAG_SYSTEM) != 0;
- }
-
public static boolean isSystemImeThatHasSubtypeOf(final InputMethodInfo imi,
final Context context, final boolean checkDefaultAttribute,
@Nullable final Locale requiredLocale, final boolean checkCountry,
final String requiredSubtypeMode) {
- if (!isSystemIme(imi)) {
+ if (!imi.isSystem()) {
return false;
}
if (checkDefaultAttribute && !imi.isDefault(context)) {
@@ -182,7 +172,7 @@ public class InputMethodUtils {
private static boolean isSystemAuxilialyImeThatHasAutomaticSubtype(final InputMethodInfo imi,
final Context context, final boolean checkDefaultAttribute) {
- if (!isSystemIme(imi)) {
+ if (!imi.isSystem()) {
return false;
}
if (checkDefaultAttribute && !imi.isDefault(context)) {
@@ -435,12 +425,11 @@ public class InputMethodUtils {
if (imi.isAuxiliaryIme()) {
continue;
}
- if (InputMethodUtils.isSystemIme(imi)
- && containsSubtypeOf(imi, ENGLISH_LOCALE, false /* checkCountry */,
- SUBTYPE_MODE_KEYBOARD)) {
+ if (imi.isSystem() && containsSubtypeOf(
+ imi, ENGLISH_LOCALE, false /* checkCountry */, SUBTYPE_MODE_KEYBOARD)) {
return imi;
}
- if (firstFoundSystemIme < 0 && InputMethodUtils.isSystemIme(imi)) {
+ if (firstFoundSystemIme < 0 && imi.isSystem()) {
firstFoundSystemIme = i;
}
}
@@ -549,7 +538,7 @@ public class InputMethodUtils {
final int numApplicationSubtypes = applicableSubtypes.size();
for (int i = 0; i < numApplicationSubtypes; ++i) {
final InputMethodSubtype subtype = applicableSubtypes.get(i);
- if (subtype.containsExtraValueKey(TAG_ASCII_CAPABLE)) {
+ if (subtype.isAsciiCapable()) {
hasAsciiCapableKeyboard = true;
break;
}
@@ -588,7 +577,7 @@ public class InputMethodUtils {
* Returns the language component of a given locale string.
* TODO: Use {@link Locale#toLanguageTag()} and {@link Locale#forLanguageTag(String)}
*/
- public static String getLanguageFromLocaleString(String locale) {
+ private static String getLanguageFromLocaleString(String locale) {
final int idx = locale.indexOf('_');
if (idx < 0) {
return locale;
@@ -784,58 +773,6 @@ public class InputMethodUtils {
}
/**
- * Parses the setting stored input methods and subtypes string value.
- *
- * @param inputMethodsAndSubtypesString The input method subtypes value stored in settings.
- * @return Map from input method ID to set of input method subtypes IDs.
- */
- @VisibleForTesting
- public static ArrayMap<String, ArraySet<String>> parseInputMethodsAndSubtypesString(
- @Nullable final String inputMethodsAndSubtypesString) {
-
- final ArrayMap<String, ArraySet<String>> imeMap = new ArrayMap<>();
- if (TextUtils.isEmpty(inputMethodsAndSubtypesString)) {
- return imeMap;
- }
-
- final SimpleStringSplitter typeSplitter =
- new SimpleStringSplitter(INPUT_METHOD_SEPARATOR);
- final SimpleStringSplitter subtypeSplitter =
- new SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATOR);
-
- List<Pair<String, ArrayList<String>>> allImeSettings =
- InputMethodSettings.buildInputMethodsAndSubtypeList(inputMethodsAndSubtypesString,
- typeSplitter,
- subtypeSplitter);
- for (Pair<String, ArrayList<String>> ime : allImeSettings) {
- ArraySet<String> subtypes = new ArraySet<>();
- if (ime.second != null) {
- subtypes.addAll(ime.second);
- }
- imeMap.put(ime.first, subtypes);
- }
- return imeMap;
- }
-
- @NonNull
- public static String buildInputMethodsAndSubtypesString(
- @NonNull final ArrayMap<String, ArraySet<String>> map) {
- // we want to use the canonical InputMethodSettings implementation,
- // so we convert data structures first.
- List<Pair<String, ArrayList<String>>> imeMap = new ArrayList<>(4);
- for (ArrayMap.Entry<String, ArraySet<String>> entry : map.entrySet()) {
- final String imeName = entry.getKey();
- final ArraySet<String> subtypeSet = entry.getValue();
- final ArrayList<String> subtypes = new ArrayList<>(2);
- if (subtypeSet != null) {
- subtypes.addAll(subtypeSet);
- }
- imeMap.add(new Pair<>(imeName, subtypes));
- }
- return InputMethodSettings.buildInputMethodsSettingString(imeMap);
- }
-
- /**
* Utility class for putting and getting settings for InputMethod
* TODO: Move all putters and getters of settings to this class.
*/
@@ -872,21 +809,7 @@ public class InputMethodUtils {
}
}
- public static String buildInputMethodsSettingString(
- List<Pair<String, ArrayList<String>>> allImeSettingsMap) {
- final StringBuilder b = new StringBuilder();
- boolean needsSeparator = false;
- for (Pair<String, ArrayList<String>> ime : allImeSettingsMap) {
- if (needsSeparator) {
- b.append(INPUT_METHOD_SEPARATOR);
- }
- buildEnabledInputMethodsSettingString(b, ime);
- needsSeparator = true;
- }
- return b.toString();
- }
-
- public static List<Pair<String, ArrayList<String>>> buildInputMethodsAndSubtypeList(
+ private static List<Pair<String, ArrayList<String>>> buildInputMethodsAndSubtypeList(
String enabledInputMethodsStr,
TextUtils.SimpleStringSplitter inputMethodSplitter,
TextUtils.SimpleStringSplitter subtypeSplitter) {
diff --git a/core/java/com/android/internal/net/NetworkStatsFactory.java b/core/java/com/android/internal/net/NetworkStatsFactory.java
index c4d08c7dc5d6..d1c279918bb4 100644
--- a/core/java/com/android/internal/net/NetworkStatsFactory.java
+++ b/core/java/com/android/internal/net/NetworkStatsFactory.java
@@ -194,7 +194,7 @@ public class NetworkStatsFactory {
reader.finishLine();
}
} catch (NullPointerException|NumberFormatException e) {
- throw new ProtocolException("problem parsing stats", e);
+ throw protocolExceptionWithCause("problem parsing stats", e);
} finally {
IoUtils.closeQuietly(reader);
StrictMode.setThreadPolicy(savedPolicy);
@@ -244,7 +244,7 @@ public class NetworkStatsFactory {
reader.finishLine();
}
} catch (NullPointerException|NumberFormatException e) {
- throw new ProtocolException("problem parsing stats", e);
+ throw protocolExceptionWithCause("problem parsing stats", e);
} finally {
IoUtils.closeQuietly(reader);
StrictMode.setThreadPolicy(savedPolicy);
@@ -341,7 +341,7 @@ public class NetworkStatsFactory {
reader.finishLine();
}
} catch (NullPointerException|NumberFormatException e) {
- throw new ProtocolException("problem parsing idx " + idx, e);
+ throw protocolExceptionWithCause("problem parsing idx " + idx, e);
} finally {
IoUtils.closeQuietly(reader);
StrictMode.setThreadPolicy(savedPolicy);
@@ -378,4 +378,10 @@ public class NetworkStatsFactory {
@VisibleForTesting
public static native int nativeReadNetworkStatsDev(NetworkStats stats);
+
+ private static ProtocolException protocolExceptionWithCause(String message, Throwable cause) {
+ ProtocolException pe = new ProtocolException(message);
+ pe.initCause(cause);
+ return pe;
+ }
}
diff --git a/core/java/com/android/internal/os/BatteryStatsHistory.java b/core/java/com/android/internal/os/BatteryStatsHistory.java
new file mode 100644
index 000000000000..24ad75149ee5
--- /dev/null
+++ b/core/java/com/android/internal/os/BatteryStatsHistory.java
@@ -0,0 +1,455 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import android.os.BatteryStats;
+import android.os.Parcel;
+import android.os.StatFs;
+import android.os.SystemClock;
+import android.util.ArraySet;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ParseUtils;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * BatteryStatsHistory encapsulates battery history files.
+ * Battery history record is appended into buffer {@link #mHistoryBuffer} and backed up into
+ * {@link #mActiveFile}.
+ * When {@link #mHistoryBuffer} size reaches {@link BatteryStatsImpl.Constants#MAX_HISTORY_BUFFER},
+ * current mActiveFile is closed and a new mActiveFile is open.
+ * History files are under directory /data/system/battery-history/.
+ * History files have name battery-history-<num>.bin. The file number <num> starts from zero and
+ * grows sequentially.
+ * The mActiveFile is always the highest numbered history file.
+ * The lowest number file is always the oldest file.
+ * The highest number file is always the newest file.
+ * The file number grows sequentially and we never skip number.
+ * When count of history files exceeds {@link BatteryStatsImpl.Constants#MAX_HISTORY_FILES},
+ * the lowest numbered file is deleted and a new file is open.
+ *
+ * All interfaces in BatteryStatsHistory should only be called by BatteryStatsImpl and protected by
+ * locks on BatteryStatsImpl object.
+ */
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+public class BatteryStatsHistory {
+ private static final boolean DEBUG = false;
+ private static final String TAG = "BatteryStatsHistory";
+ public static final String HISTORY_DIR = "battery-history";
+ public static final String FILE_SUFFIX = ".bin";
+ private static final int MIN_FREE_SPACE = 100 * 1024 * 1024;
+
+ private final BatteryStatsImpl mStats;
+ private final Parcel mHistoryBuffer;
+ private final File mHistoryDir;
+ /**
+ * The active history file that the history buffer is backed up into.
+ */
+ private AtomicFile mActiveFile;
+ /**
+ * A list of history files with incremental indexes.
+ */
+ private final List<Integer> mFileNumbers = new ArrayList<>();
+
+ /**
+ * A list of small history parcels, used when BatteryStatsImpl object is created from
+ * deserialization of a parcel, such as Settings app or checkin file.
+ */
+ private List<Parcel> mHistoryParcels = null;
+
+ /**
+ * When iterating history files, the current file index.
+ */
+ private int mCurrentFileIndex;
+ /**
+ * When iterating history files, the current file parcel.
+ */
+ private Parcel mCurrentParcel;
+ /**
+ * When iterating history file, the current parcel's Parcel.dataSize().
+ */
+ private int mCurrentParcelEnd;
+ /**
+ * When iterating history files, the current record count.
+ */
+ private int mRecordCount = 0;
+ /**
+ * Used when BatteryStatsImpl object is created from deserialization of a parcel,
+ * such as Settings app or checkin file, to iterate over history parcels.
+ */
+ private int mParcelIndex = 0;
+
+ /**
+ * Constructor
+ * @param stats BatteryStatsImpl object.
+ * @param systemDir typically /data/system
+ * @param historyBuffer The in-memory history buffer.
+ */
+ public BatteryStatsHistory(BatteryStatsImpl stats, File systemDir, Parcel historyBuffer) {
+ mStats = stats;
+ mHistoryBuffer = historyBuffer;
+ mHistoryDir = new File(systemDir, HISTORY_DIR);
+ mHistoryDir.mkdirs();
+ if (!mHistoryDir.exists()) {
+ Slog.wtf(TAG, "HistoryDir does not exist:" + mHistoryDir.getPath());
+ }
+
+ final Set<Integer> dedup = new ArraySet<>();
+ // scan directory, fill mFileNumbers and mActiveFile.
+ mHistoryDir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ final int b = name.lastIndexOf(FILE_SUFFIX);
+ if (b <= 0) {
+ return false;
+ }
+ final Integer c =
+ ParseUtils.parseInt(name.substring(0, b), -1);
+ if (c != -1) {
+ dedup.add(c);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
+ if (!dedup.isEmpty()) {
+ mFileNumbers.addAll(dedup);
+ Collections.sort(mFileNumbers);
+ } else {
+ // No file found, default to have file 0.
+ mFileNumbers.add(0);
+ }
+ createActiveFile();
+ }
+
+ /**
+ * Used when BatteryStatsImpl object is created from deserialization of a parcel,
+ * such as Settings app or checkin file.
+ * @param stats BatteryStatsImpl object.
+ * @param historyBuffer the history buffer inside BatteryStatsImpl
+ */
+ public BatteryStatsHistory(BatteryStatsImpl stats, Parcel historyBuffer) {
+ mStats = stats;
+ mHistoryDir = null;
+ mHistoryBuffer = historyBuffer;
+ }
+ /**
+ * The highest numbered history file is active file that mHistoryBuffer is backed up into.
+ * If file does not exists, truncate() creates a empty file.
+ */
+ private void createActiveFile() {
+ final AtomicFile file = getFile(mFileNumbers.get(mFileNumbers.size() - 1));
+ if (DEBUG) {
+ Slog.d(TAG, "activeHistoryFile:" + file.getBaseFile().getPath());
+ }
+ if (!file.exists()) {
+ try {
+ file.truncate();
+ } catch (IOException e) {
+ Slog.e(TAG, "Error creating history file "+ file.getBaseFile().getPath(), e);
+ }
+ }
+ mActiveFile = file;
+ }
+
+ /**
+ * Create history AtomicFile from file number.
+ * @param num file number.
+ * @return AtomicFile object.
+ */
+ private AtomicFile getFile(int num) {
+ return new AtomicFile(
+ new File(mHistoryDir, num + FILE_SUFFIX));
+ }
+
+ /**
+ * When {@link #mHistoryBuffer} reaches {@link BatteryStatsImpl.Constants#MAX_HISTORY_BUFFER},
+ * create next history file.
+ */
+ public void createNextFile() {
+ if (mFileNumbers.isEmpty()) {
+ Slog.wtf(TAG, "mFileNumbers should never be empty");
+ return;
+ }
+ // The last number in mFileNumbers is the highest number. The next file number is highest
+ // number plus one.
+ final int next = mFileNumbers.get(mFileNumbers.size() - 1) + 1;
+ mFileNumbers.add(next);
+ createActiveFile();
+
+ // if free disk space is less than 100MB, delete oldest history file.
+ if (!hasFreeDiskSpace()) {
+ int oldest = mFileNumbers.remove(0);
+ getFile(oldest).delete();
+ }
+
+ // if there are more history files than allowed, delete oldest history files.
+ // MAX_HISTORY_FILES can be updated by GService config at run time.
+ while (mFileNumbers.size() > mStats.mConstants.MAX_HISTORY_FILES) {
+ int oldest = mFileNumbers.get(0);
+ getFile(oldest).delete();
+ mFileNumbers.remove(0);
+ }
+ }
+
+ /**
+ * Delete all existing history files. Active history file start from number 0 again.
+ */
+ public void resetAllFiles() {
+ for (Integer i : mFileNumbers) {
+ getFile(i).delete();
+ }
+ mFileNumbers.clear();
+ mFileNumbers.add(0);
+ createActiveFile();
+ }
+
+ /**
+ * Start iterating history files and history buffer.
+ * @return always return true.
+ */
+ public boolean startIteratingHistory() {
+ mRecordCount = 0;
+ mCurrentFileIndex = 0;
+ mCurrentParcel = null;
+ mCurrentParcelEnd = 0;
+ mParcelIndex = 0;
+ return true;
+ }
+
+ /**
+ * Finish iterating history files and history buffer.
+ */
+ public void finishIteratingHistory() {
+ // setDataPosition so mHistoryBuffer Parcel can be written.
+ mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
+ if (DEBUG) {
+ Slog.d(TAG, "Battery history records iterated: " + mRecordCount);
+ }
+ }
+
+ /**
+ * When iterating history files and history buffer, always start from the lowest numbered
+ * history file, when reached the mActiveFile (highest numbered history file), do not read from
+ * mActiveFile, read from history buffer instead because the buffer has more updated data.
+ * @param out a history item.
+ * @return The parcel that has next record. null if finished all history files and history
+ * buffer
+ */
+ public Parcel getNextParcel(BatteryStats.HistoryItem out) {
+ if (mRecordCount == 0) {
+ // reset out if it is the first record.
+ out.clear();
+ }
+ ++mRecordCount;
+
+ // First iterate through all records in current parcel.
+ if (mCurrentParcel != null)
+ {
+ if (mCurrentParcel.dataPosition() < mCurrentParcelEnd) {
+ // There are more records in current parcel.
+ return mCurrentParcel;
+ } else if (mHistoryBuffer == mCurrentParcel) {
+ // finished iterate through all history files and history buffer.
+ return null;
+ } else if (mHistoryParcels == null
+ || !mHistoryParcels.contains(mCurrentParcel)) {
+ // current parcel is from history file.
+ mCurrentParcel.recycle();
+ }
+ }
+
+ // Try next available history file.
+ // skip the last file because its data is in history buffer.
+ while (mCurrentFileIndex < mFileNumbers.size() - 1) {
+ mCurrentParcel = null;
+ mCurrentParcelEnd = 0;
+ final Parcel p = Parcel.obtain();
+ AtomicFile file = getFile(mFileNumbers.get(mCurrentFileIndex++));
+ if (readFileToParcel(p, file)) {
+ int bufSize = p.readInt();
+ int curPos = p.dataPosition();
+ mCurrentParcelEnd = curPos + bufSize;
+ mCurrentParcel = p;
+ if (curPos < mCurrentParcelEnd) {
+ return mCurrentParcel;
+ }
+ } else {
+ p.recycle();
+ }
+ }
+
+ // mHistoryParcels is created when BatteryStatsImpl object is created from deserialization
+ // of a parcel, such as Settings app or checkin file.
+ if (mHistoryParcels != null) {
+ while (mParcelIndex < mHistoryParcels.size()) {
+ final Parcel p = mHistoryParcels.get(mParcelIndex++);
+ if (!skipHead(p)) {
+ continue;
+ }
+ final int bufSize = p.readInt();
+ final int curPos = p.dataPosition();
+ mCurrentParcelEnd = curPos + bufSize;
+ mCurrentParcel = p;
+ if (curPos < mCurrentParcelEnd) {
+ return mCurrentParcel;
+ }
+ }
+ }
+
+ // finished iterator through history files (except the last one), now history buffer.
+ if (mHistoryBuffer.dataSize() <= 0) {
+ // buffer is empty.
+ return null;
+ }
+ mHistoryBuffer.setDataPosition(0);
+ mCurrentParcel = mHistoryBuffer;
+ mCurrentParcelEnd = mCurrentParcel.dataSize();
+ return mCurrentParcel;
+ }
+
+ /**
+ * Read history file into a parcel.
+ * @param out the Parcel read into.
+ * @param file the File to read from.
+ * @return true if success, false otherwise.
+ */
+ public boolean readFileToParcel(Parcel out, AtomicFile file) {
+ byte[] raw = null;
+ try {
+ final long start = SystemClock.uptimeMillis();
+ raw = file.readFully();
+ if (DEBUG) {
+ Slog.d(TAG, "readFileToParcel:" + file.getBaseFile().getPath()
+ + " duration ms:" + (SystemClock.uptimeMillis() - start));
+ }
+ } catch(Exception e) {
+ Slog.e(TAG, "Error reading file "+ file.getBaseFile().getPath(), e);
+ return false;
+ }
+ out.unmarshall(raw, 0, raw.length);
+ out.setDataPosition(0);
+ return skipHead(out);
+ }
+
+ /**
+ * Skip the header part of history parcel.
+ * @param p history parcel to skip head.
+ * @return true if version match, false if not.
+ */
+ private boolean skipHead(Parcel p) {
+ p.setDataPosition(0);
+ final int version = p.readInt();
+ if (version != mStats.VERSION) {
+ return false;
+ }
+ // skip historyBaseTime field.
+ p.readLong();
+ return true;
+ }
+
+ /**
+ * Read all history files and serialize into a big Parcel. This is to send history files to
+ * Settings app since Settings app can not access /data/system directory.
+ * Checkin file also call this method.
+ * @param out the output parcel
+ */
+ public void writeToParcel(Parcel out) {
+ final long start = SystemClock.uptimeMillis();
+ out.writeInt(mFileNumbers.size() - 1);
+ for(int i = 0; i < mFileNumbers.size() - 1; i++) {
+ AtomicFile file = getFile(mFileNumbers.get(i));
+ byte[] raw = new byte[0];
+ try {
+ raw = file.readFully();
+ } catch(Exception e) {
+ Slog.e(TAG, "Error reading file "+ file.getBaseFile().getPath(), e);
+ }
+ out.writeByteArray(raw);
+ }
+ if (DEBUG) {
+ Slog.d(TAG, "writeToParcel duration ms:" + (SystemClock.uptimeMillis() - start));
+ }
+ }
+
+ /**
+ * This is for Settings app, when Settings app receives big history parcel, it call
+ * this method to parse it into list of parcels.
+ * Checkin file also call this method.
+ * @param in the input parcel.
+ */
+ public void readFromParcel(Parcel in) {
+ final long start = SystemClock.uptimeMillis();
+ mHistoryParcels = new ArrayList<>();
+ final int count = in.readInt();
+ for(int i = 0; i < count; i++) {
+ byte[] temp = in.createByteArray();
+ if (temp.length == 0) {
+ continue;
+ }
+ Parcel p = Parcel.obtain();
+ p.unmarshall(temp, 0, temp.length);
+ p.setDataPosition(0);
+ mHistoryParcels.add(p);
+ }
+ if (DEBUG) {
+ Slog.d(TAG, "readFromParcel duration ms:" + (SystemClock.uptimeMillis() - start));
+ }
+ }
+
+ /**
+ * @return true if there is more than 100MB free disk space left.
+ */
+ private boolean hasFreeDiskSpace() {
+ final StatFs stats = new StatFs(mHistoryDir.getAbsolutePath());
+ return stats.getAvailableBytes() > MIN_FREE_SPACE;
+ }
+
+ public List<Integer> getFilesNumbers() {
+ return mFileNumbers;
+ }
+
+ public AtomicFile getActiveFile() {
+ return mActiveFile;
+ }
+
+ /**
+ * @return the total size of all history files and history buffer.
+ */
+ public int getHistoryUsedSize() {
+ int ret = 0;
+ for(int i = 0; i < mFileNumbers.size() - 1; i++) {
+ ret += getFile(mFileNumbers.get(i)).getBaseFile().length();
+ }
+ ret += mHistoryBuffer.dataSize();
+ if (mHistoryParcels != null) {
+ for(int i = 0; i < mHistoryParcels.size(); i++) {
+ ret += mHistoryParcels.get(i).dataSize();
+ }
+ }
+ return ret;
+ }
+}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 4cc91ec3ae72..9791c7d2b78c 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -90,7 +90,6 @@ import com.android.internal.net.NetworkStatsFactory;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FastXmlSerializer;
-import com.android.internal.util.JournaledFile;
import com.android.internal.util.XmlUtils;
import libcore.util.EmptyArray;
@@ -107,6 +106,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@@ -140,35 +140,18 @@ public class BatteryStatsImpl extends BatteryStats {
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 177 + (USE_OLD_HISTORY ? 1000 : 0);
-
- // Maximum number of items we will record in the history.
- private static final int MAX_HISTORY_ITEMS;
-
- // No, really, THIS is the maximum number of items we will record in the history.
- private static final int MAX_MAX_HISTORY_ITEMS;
+ static final int VERSION = 185 + (USE_OLD_HISTORY ? 1000 : 0);
// The maximum number of names wakelocks we will keep track of
// per uid; once the limit is reached, we batch the remaining wakelocks
// in to one common name.
private static final int MAX_WAKELOCKS_PER_UID;
- static final int MAX_HISTORY_BUFFER; // 256KB
- static final int MAX_MAX_HISTORY_BUFFER; // 320KB
-
static {
if (ActivityManager.isLowRamDeviceStatic()) {
- MAX_HISTORY_ITEMS = 800;
- MAX_MAX_HISTORY_ITEMS = 1200;
MAX_WAKELOCKS_PER_UID = 40;
- MAX_HISTORY_BUFFER = 96*1024; // 96KB
- MAX_MAX_HISTORY_BUFFER = 128*1024; // 128KB
} else {
- MAX_HISTORY_ITEMS = 4000;
- MAX_MAX_HISTORY_ITEMS = 6000;
MAX_WAKELOCKS_PER_UID = 200;
- MAX_HISTORY_BUFFER = 512*1024; // 512KB
- MAX_MAX_HISTORY_BUFFER = 640*1024; // 640KB
}
}
@@ -189,7 +172,7 @@ public class BatteryStatsImpl extends BatteryStats {
protected Clocks mClocks;
- private final JournaledFile mFile;
+ private final AtomicFile mStatsFile;
public final AtomicFile mCheckinFile;
public final AtomicFile mDailyFile;
@@ -663,13 +646,14 @@ public class BatteryStatsImpl extends BatteryStats {
int mNextHistoryTagIdx = 0;
int mNumHistoryTagChars = 0;
int mHistoryBufferLastPos = -1;
- boolean mHistoryOverflow = false;
int mActiveHistoryStates = 0xffffffff;
int mActiveHistoryStates2 = 0xffffffff;
long mLastHistoryElapsedRealtime = 0;
long mTrackRunningHistoryElapsedRealtime = 0;
long mTrackRunningHistoryUptime = 0;
+ final BatteryStatsHistory mBatteryStatsHistory;
+
final HistoryItem mHistoryCur = new HistoryItem();
HistoryItem mHistory;
@@ -963,7 +947,7 @@ public class BatteryStatsImpl extends BatteryStats {
protected PowerProfile mPowerProfile;
@GuardedBy("this")
- private final Constants mConstants;
+ final Constants mConstants;
/*
* Holds a SamplingTimer associated with each Resource Power Manager state and voter,
@@ -1047,9 +1031,10 @@ public class BatteryStatsImpl extends BatteryStats {
public BatteryStatsImpl(Clocks clocks) {
init(clocks);
- mFile = null;
+ mStatsFile = null;
mCheckinFile = null;
mDailyFile = null;
+ mBatteryStatsHistory = null;
mHandler = null;
mPlatformIdleStateCallback = null;
mUserInfoProvider = null;
@@ -1068,7 +1053,7 @@ public class BatteryStatsImpl extends BatteryStats {
// methods are protected not private to be VisibleForTesting
public static class TimeBase {
- protected final ArrayList<TimeBaseObs> mObservers = new ArrayList<>();
+ protected final ArrayList<WeakReference<TimeBaseObs>> mObservers = new ArrayList<>();
protected long mUptime;
protected long mRealtime;
@@ -1112,17 +1097,24 @@ public class BatteryStatsImpl extends BatteryStats {
}
public void add(TimeBaseObs observer) {
- mObservers.add(observer);
+ mObservers.add(new WeakReference<TimeBaseObs>(observer));
}
public void remove(TimeBaseObs observer) {
- if (!mObservers.remove(observer)) {
- Slog.wtf(TAG, "Removed unknown observer: " + observer);
- }
+ if (!mObservers.removeIf(ref -> ref.get() == observer)) {
+ Slog.wtf(TAG, "Removed unknown observer: " + observer);
+ }
}
public boolean hasObserver(TimeBaseObs observer) {
- return mObservers.contains(observer);
+ Iterator<WeakReference<TimeBaseObs>> i = mObservers.iterator();
+ while (i.hasNext()) {
+ TimeBaseObs obs = i.next().get();
+ if (obs == observer) {
+ return true;
+ }
+ }
+ return false;
}
public void init(long uptime, long realtime) {
@@ -1211,9 +1203,11 @@ public class BatteryStatsImpl extends BatteryStats {
mRealtimeStart = realtime;
long batteryUptime = mUnpluggedUptime = getUptime(uptime);
long batteryRealtime = mUnpluggedRealtime = getRealtime(realtime);
-
- for (int i = mObservers.size() - 1; i >= 0; i--) {
- mObservers.get(i).onTimeStarted(realtime, batteryUptime, batteryRealtime);
+ for (WeakReference<TimeBaseObs> ref : mObservers) {
+ TimeBaseObs obs = ref.get();
+ if (obs != null) {
+ obs.onTimeStarted(realtime, batteryUptime, batteryRealtime);
+ }
}
} else {
mPastUptime += uptime - mUptimeStart;
@@ -1221,11 +1215,14 @@ public class BatteryStatsImpl extends BatteryStats {
long batteryUptime = getUptime(uptime);
long batteryRealtime = getRealtime(realtime);
-
- for (int i = mObservers.size() - 1; i >= 0; i--) {
- mObservers.get(i).onTimeStopped(realtime, batteryUptime, batteryRealtime);
+ for (WeakReference<TimeBaseObs> ref : mObservers) {
+ TimeBaseObs obs = ref.get();
+ if (obs != null) {
+ obs.onTimeStopped(realtime, batteryUptime, batteryRealtime);
+ }
}
}
+ mObservers.removeIf(ref -> ref.get() == null);
return true;
}
return false;
@@ -3154,8 +3151,13 @@ public class BatteryStatsImpl extends BatteryStats {
}
private void readHistoryTag(int index, HistoryTag tag) {
- tag.string = mReadHistoryStrings[index];
- tag.uid = mReadHistoryUids[index];
+ if (index < mReadHistoryStrings.length) {
+ tag.string = mReadHistoryStrings[index];
+ tag.uid = mReadHistoryUids[index];
+ } else {
+ tag.string = null;
+ tag.uid = 0;
+ }
tag.poolIdx = index;
}
@@ -3674,6 +3676,13 @@ public class BatteryStatsImpl extends BatteryStats {
mHistoryLastWritten.cmd = HistoryItem.CMD_NULL;
}
+ public void createFakeHistoryEvents(long numEvents) {
+ for(long i = 0; i < numEvents; i++) {
+ noteWifiOnLocked();
+ noteWifiOffLocked();
+ }
+ }
+
void addHistoryBufferLocked(long elapsedRealtimeMs, HistoryItem cur) {
if (!mHaveBatteryLevel || !mRecordingHistory) {
return;
@@ -3736,74 +3745,32 @@ public class BatteryStatsImpl extends BatteryStats {
}
mHistoryLastWritten.setTo(mHistoryLastLastWritten);
}
-
- boolean recordResetDueToOverflow = false;
final int dataSize = mHistoryBuffer.dataSize();
- if (dataSize >= MAX_MAX_HISTORY_BUFFER*3) {
- // Clients can't deal with history buffers this large. This only
- // really happens when the device is on charger and interacted with
- // for long periods of time, like in retail mode. Since the device is
- // most likely charged, when unplugged, stats would have reset anyways.
- // Reset the stats and mark that we overflowed.
- // b/32540341
- resetAllStatsLocked();
-
- // Mark that we want to set *OVERFLOW* event and the RESET:START
- // events.
- recordResetDueToOverflow = true;
-
- } else if (dataSize >= MAX_HISTORY_BUFFER) {
- if (!mHistoryOverflow) {
- mHistoryOverflow = true;
- addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur);
- addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_OVERFLOW, cur);
- return;
- }
- // After overflow, we allow various bit-wise states to settle to 0.
- boolean writeAnyway = false;
- final int curStates = cur.states & HistoryItem.SETTLE_TO_ZERO_STATES
- & mActiveHistoryStates;
- if (mHistoryLastWritten.states != curStates) {
- // mActiveHistoryStates keeps track of which bits in .states are now being
- // forced to 0.
- int old = mActiveHistoryStates;
- mActiveHistoryStates &= curStates | ~HistoryItem.SETTLE_TO_ZERO_STATES;
- writeAnyway |= old != mActiveHistoryStates;
- }
- final int curStates2 = cur.states2 & HistoryItem.SETTLE_TO_ZERO_STATES2
- & mActiveHistoryStates2;
- if (mHistoryLastWritten.states2 != curStates2) {
- // mActiveHistoryStates2 keeps track of which bits in .states2 are now being
- // forced to 0.
- int old = mActiveHistoryStates2;
- mActiveHistoryStates2 &= curStates2 | ~HistoryItem.SETTLE_TO_ZERO_STATES2;
- writeAnyway |= old != mActiveHistoryStates2;
- }
-
- // Once we've reached the maximum number of items, we only
- // record changes to the battery level and the most interesting states.
- // Once we've reached the maximum maximum number of items, we only
- // record changes to the battery level.
- if (!writeAnyway && mHistoryLastWritten.batteryLevel == cur.batteryLevel &&
- (dataSize >= MAX_MAX_HISTORY_BUFFER
- || ((mHistoryLastWritten.states^cur.states)
- & HistoryItem.MOST_INTERESTING_STATES) == 0
- || ((mHistoryLastWritten.states2^cur.states2)
- & HistoryItem.MOST_INTERESTING_STATES2) == 0)) {
- return;
- }
+ if (dataSize >= mConstants.MAX_HISTORY_BUFFER) {
+ //open a new history file.
+ final long start = SystemClock.uptimeMillis();
+ writeHistoryLocked(true);
+ if (DEBUG) {
+ Slog.d(TAG, "addHistoryBufferLocked writeHistoryLocked takes ms:"
+ + (SystemClock.uptimeMillis() - start));
+ }
+ mBatteryStatsHistory.createNextFile();
+ mHistoryBuffer.setDataSize(0);
+ mHistoryBuffer.setDataPosition(0);
+ mHistoryBuffer.setDataCapacity(mConstants.MAX_HISTORY_BUFFER / 2);
+ mHistoryBufferLastPos = -1;
+ final long elapsedRealtime = mClocks.elapsedRealtime();
+ final long uptime = mClocks.uptimeMillis();
+ startRecordingHistory(elapsedRealtime, uptime, false);
addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur);
return;
}
- if (dataSize == 0 || recordResetDueToOverflow) {
+ if (dataSize == 0) {
// The history is currently empty; we need it to start with a time stamp.
cur.currentTime = System.currentTimeMillis();
- if (recordResetDueToOverflow) {
- addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_OVERFLOW, cur);
- }
addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_RESET, cur);
}
addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur);
@@ -3891,26 +3858,6 @@ public class BatteryStatsImpl extends BatteryStats {
mChangedStates = 0;
mChangedStates2 = 0;
-
- if (mNumHistoryItems == MAX_HISTORY_ITEMS
- || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) {
- addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_OVERFLOW, cur);
- }
-
- if (mNumHistoryItems >= MAX_HISTORY_ITEMS) {
- // Once we've reached the maximum number of items, we only
- // record changes to the battery level and the most interesting states.
- // Once we've reached the maximum maximum number of items, we only
- // record changes to the battery level.
- if (mHistoryEnd != null && mHistoryEnd.batteryLevel
- == cur.batteryLevel &&
- (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS
- || ((mHistoryEnd.states^(cur.states&mActiveHistoryStates))
- & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
- return;
- }
- }
-
addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur);
}
@@ -3965,14 +3912,13 @@ public class BatteryStatsImpl extends BatteryStats {
mHistoryBuffer.setDataSize(0);
mHistoryBuffer.setDataPosition(0);
- mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER / 2);
+ mHistoryBuffer.setDataCapacity(mConstants.MAX_HISTORY_BUFFER / 2);
mHistoryLastLastWritten.clear();
mHistoryLastWritten.clear();
mHistoryTagPool.clear();
mNextHistoryTagIdx = 0;
mNumHistoryTagChars = 0;
mHistoryBufferLastPos = -1;
- mHistoryOverflow = false;
mActiveHistoryStates = 0xffffffff;
mActiveHistoryStates2 = 0xffffffff;
}
@@ -4021,7 +3967,9 @@ public class BatteryStatsImpl extends BatteryStats {
try {
IBatteryPropertiesRegistrar registrar = IBatteryPropertiesRegistrar.Stub.asInterface(
ServiceManager.getService("batteryproperties"));
- registrar.scheduleUpdate();
+ if (registrar != null) {
+ registrar.scheduleUpdate();
+ }
} catch (RemoteException e) {
// Ignore.
}
@@ -4029,8 +3977,6 @@ public class BatteryStatsImpl extends BatteryStats {
public void addIsolatedUidLocked(int isolatedUid, int appUid) {
mIsolatedUids.put(isolatedUid, appUid);
- StatsLog.write(StatsLog.ISOLATED_UID_CHANGED, appUid, isolatedUid,
- StatsLog.ISOLATED_UID_CHANGED__EVENT__CREATED);
final Uid u = getUidStatsLocked(appUid);
u.addIsolatedUid(isolatedUid);
}
@@ -4054,9 +4000,6 @@ public class BatteryStatsImpl extends BatteryStats {
*/
@GuardedBy("this")
public void removeIsolatedUidLocked(int isolatedUid) {
- StatsLog.write(
- StatsLog.ISOLATED_UID_CHANGED, mIsolatedUids.get(isolatedUid, -1),
- isolatedUid, StatsLog.ISOLATED_UID_CHANGED__EVENT__REMOVED);
final int idx = mIsolatedUids.indexOfKey(isolatedUid);
if (idx >= 0) {
final int ownerUid = mIsolatedUids.valueAt(idx);
@@ -4263,8 +4206,6 @@ public class BatteryStatsImpl extends BatteryStats {
workSourceName != null ? workSourceName : packageName);
pkg.noteWakeupAlarmLocked(tag);
}
- StatsLog.write_non_chained(StatsLog.WAKEUP_ALARM_OCCURRED, workSource.get(i),
- workSource.getName(i), tag);
}
ArrayList<WorkChain> workChains = workSource.getWorkChains();
@@ -4277,7 +4218,6 @@ public class BatteryStatsImpl extends BatteryStats {
BatteryStatsImpl.Uid.Pkg pkg = getPackageStatsLocked(uid, packageName);
pkg.noteWakeupAlarmLocked(tag);
}
- StatsLog.write(StatsLog.WAKEUP_ALARM_OCCURRED, wc.getUids(), wc.getTags(), tag);
}
}
} else {
@@ -4285,7 +4225,6 @@ public class BatteryStatsImpl extends BatteryStats {
BatteryStatsImpl.Uid.Pkg pkg = getPackageStatsLocked(uid, packageName);
pkg.noteWakeupAlarmLocked(tag);
}
- StatsLog.write_non_chained(StatsLog.WAKEUP_ALARM_OCCURRED, uid, null, tag);
}
}
@@ -4578,10 +4517,6 @@ public class BatteryStatsImpl extends BatteryStats {
}
public void noteLongPartialWakelockStart(String name, String historyName, int uid) {
- StatsLog.write_non_chained(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED,
- uid, null, name, historyName,
- StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__ON);
-
uid = mapUid(uid);
noteLongPartialWakeLockStartInternal(name, historyName, uid);
}
@@ -4592,9 +4527,6 @@ public class BatteryStatsImpl extends BatteryStats {
for (int i = 0; i < N; ++i) {
final int uid = mapUid(workSource.get(i));
noteLongPartialWakeLockStartInternal(name, historyName, uid);
- StatsLog.write_non_chained(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED,
- workSource.get(i), workSource.getName(i), name, historyName,
- StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__ON);
}
final ArrayList<WorkChain> workChains = workSource.getWorkChains();
@@ -4603,10 +4535,6 @@ public class BatteryStatsImpl extends BatteryStats {
final WorkChain workChain = workChains.get(i);
final int uid = workChain.getAttributionUid();
noteLongPartialWakeLockStartInternal(name, historyName, uid);
-
- StatsLog.write(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED,
- workChain.getUids(), workChain.getTags(), name, historyName,
- StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__ON);
}
}
}
@@ -4626,9 +4554,6 @@ public class BatteryStatsImpl extends BatteryStats {
}
public void noteLongPartialWakelockFinish(String name, String historyName, int uid) {
- StatsLog.write_non_chained(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED, uid, null,
- name, historyName, StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__OFF);
-
uid = mapUid(uid);
noteLongPartialWakeLockFinishInternal(name, historyName, uid);
}
@@ -4639,9 +4564,6 @@ public class BatteryStatsImpl extends BatteryStats {
for (int i = 0; i < N; ++i) {
final int uid = mapUid(workSource.get(i));
noteLongPartialWakeLockFinishInternal(name, historyName, uid);
- StatsLog.write_non_chained(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED,
- workSource.get(i), workSource.getName(i), name, historyName,
- StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__OFF);
}
final ArrayList<WorkChain> workChains = workSource.getWorkChains();
@@ -4650,9 +4572,6 @@ public class BatteryStatsImpl extends BatteryStats {
final WorkChain workChain = workChains.get(i);
final int uid = workChain.getAttributionUid();
noteLongPartialWakeLockFinishInternal(name, historyName, uid);
- StatsLog.write(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED,
- workChain.getUids(), workChain.getTags(), name, historyName,
- StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__OFF);
}
}
}
@@ -5072,8 +4991,6 @@ public class BatteryStatsImpl extends BatteryStats {
+ Integer.toHexString(mHistoryCur.states));
addHistoryRecordLocked(elapsedRealtime, uptime);
mMobileRadioPowerState = powerState;
- StatsLog.write_non_chained(StatsLog.MOBILE_RADIO_POWER_STATE_CHANGED, uid, null,
- powerState);
if (active) {
mMobileRadioActiveTimer.startRunningLocked(elapsedRealtime);
mMobileRadioActivePerAppTimer.startRunningLocked(elapsedRealtime);
@@ -5826,8 +5743,6 @@ public class BatteryStatsImpl extends BatteryStats {
+ Integer.toHexString(mHistoryCur.states));
addHistoryRecordLocked(elapsedRealtime, uptime);
mWifiRadioPowerState = powerState;
- StatsLog.write_non_chained(StatsLog.WIFI_RADIO_POWER_STATE_CHANGED, uid, null,
- powerState);
}
}
@@ -10114,11 +10029,13 @@ public class BatteryStatsImpl extends BatteryStats {
UserInfoProvider userInfoProvider) {
init(clocks);
- if (systemDir != null) {
- mFile = new JournaledFile(new File(systemDir, "batterystats.bin"),
- new File(systemDir, "batterystats.bin.tmp"));
+
+ if (systemDir == null) {
+ mStatsFile = null;
+ mBatteryStatsHistory = new BatteryStatsHistory(this, mHistoryBuffer);
} else {
- mFile = null;
+ mStatsFile = new AtomicFile(new File(systemDir, "batterystats.bin"));
+ mBatteryStatsHistory = new BatteryStatsHistory(this, systemDir, mHistoryBuffer);
}
mCheckinFile = new AtomicFile(new File(systemDir, "batterystats-checkin.bin"));
mDailyFile = new AtomicFile(new File(systemDir, "batterystats-daily.xml"));
@@ -10219,13 +10136,14 @@ public class BatteryStatsImpl extends BatteryStats {
public BatteryStatsImpl(Clocks clocks, Parcel p) {
init(clocks);
- mFile = null;
+ mStatsFile = null;
mCheckinFile = null;
mDailyFile = null;
mHandler = null;
mExternalSync = null;
mConstants = new Constants(mHandler);
clearHistoryLocked();
+ mBatteryStatsHistory = new BatteryStatsHistory(this, mHistoryBuffer);
readFromParcel(p);
mPlatformIdleStateCallback = null;
}
@@ -10342,8 +10260,6 @@ public class BatteryStatsImpl extends BatteryStats {
stream = mDailyFile.startWrite();
memStream.writeTo(stream);
stream.flush();
- FileUtils.sync(stream);
- stream.close();
mDailyFile.finishWrite(stream);
com.android.internal.logging.EventLogTags.writeCommitSysConfigFile(
"batterystats-daily",
@@ -10647,21 +10563,16 @@ public class BatteryStatsImpl extends BatteryStats {
}
public int getHistoryTotalSize() {
- return MAX_HISTORY_BUFFER;
+ return mConstants.MAX_HISTORY_BUFFER * mConstants.MAX_HISTORY_FILES;
}
public int getHistoryUsedSize() {
- return mHistoryBuffer.dataSize();
+ return mBatteryStatsHistory.getHistoryUsedSize();
}
@Override
public boolean startIteratingHistoryLocked() {
- if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
- + " pos=" + mHistoryBuffer.dataPosition());
- if (mHistoryBuffer.dataSize() <= 0) {
- return false;
- }
- mHistoryBuffer.setDataPosition(0);
+ mBatteryStatsHistory.startIteratingHistory();
mReadOverflow = false;
mIteratingHistory = true;
mReadHistoryStrings = new String[mHistoryTagPool.size()];
@@ -10701,18 +10612,13 @@ public class BatteryStatsImpl extends BatteryStats {
@Override
public boolean getNextHistoryLocked(HistoryItem out) {
- final int pos = mHistoryBuffer.dataPosition();
- if (pos == 0) {
- out.clear();
- }
- boolean end = pos >= mHistoryBuffer.dataSize();
- if (end) {
+ Parcel p = mBatteryStatsHistory.getNextParcel(out);
+ if (p == null) {
return false;
}
-
final long lastRealtime = out.time;
final long lastWalltime = out.currentTime;
- readHistoryDelta(mHistoryBuffer, out);
+ readHistoryDelta(p, out);
if (out.cmd != HistoryItem.CMD_CURRENT_TIME
&& out.cmd != HistoryItem.CMD_RESET && lastWalltime != 0) {
out.currentTime = lastWalltime + (out.time - lastRealtime);
@@ -10722,9 +10628,10 @@ public class BatteryStatsImpl extends BatteryStats {
@Override
public void finishIteratingHistoryLocked() {
+ mBatteryStatsHistory.finishIteratingHistory();
mIteratingHistory = false;
- mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
mReadHistoryStrings = null;
+ mReadHistoryUids = null;
}
@Override
@@ -10949,6 +10856,8 @@ public class BatteryStatsImpl extends BatteryStats {
initDischarge();
clearHistoryLocked();
+ mBatteryStatsHistory.resetAllFiles();
+
mHandler.sendEmptyMessage(MSG_REPORT_RESET_STATS);
}
@@ -12373,9 +12282,7 @@ public class BatteryStatsImpl extends BatteryStats {
boolean reset = false;
if (!mNoAutoReset && (oldStatus == BatteryManager.BATTERY_STATUS_FULL
|| level >= 90
- || (mDischargeCurrentLevel < 20 && level >= 80)
- || (getHighDischargeAmountSinceCharge() >= 200
- && mHistoryBuffer.dataSize() >= MAX_HISTORY_BUFFER))) {
+ || (mDischargeCurrentLevel < 20 && level >= 80))) {
Slog.i(TAG, "Resetting battery stats: level=" + level + " status=" + oldStatus
+ " dischargeLevel=" + mDischargeCurrentLevel
+ " lowAmount=" + getLowDischargeAmountSinceCharge()
@@ -12397,8 +12304,6 @@ public class BatteryStatsImpl extends BatteryStats {
stream = mCheckinFile.startWrite();
stream.write(parcel.marshall());
stream.flush();
- FileUtils.sync(stream);
- stream.close();
mCheckinFile.finishWrite(stream);
com.android.internal.logging.EventLogTags.writeCommitSysConfigFile(
"batterystats-checkin",
@@ -12486,7 +12391,7 @@ public class BatteryStatsImpl extends BatteryStats {
mModStepMode = 0;
}
if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
- if (mFile != null) {
+ if (mStatsFile != null && mBatteryStatsHistory.getActiveFile() != null) {
writeAsyncLocked();
}
}
@@ -12727,7 +12632,7 @@ public class BatteryStatsImpl extends BatteryStats {
if (mMinLearnedBatteryCapacity == -1) {
mMinLearnedBatteryCapacity = chargeFullUAh;
} else {
- Math.min(mMinLearnedBatteryCapacity, chargeFullUAh);
+ mMinLearnedBatteryCapacity = Math.min(mMinLearnedBatteryCapacity, chargeFullUAh);
}
mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh);
}
@@ -13277,6 +13182,8 @@ public class BatteryStatsImpl extends BatteryStats {
= "external_stats_collection_rate_limit_ms";
public static final String KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS
= "battery_level_collection_delay_ms";
+ public static final String KEY_MAX_HISTORY_FILES = "max_history_files";
+ public static final String KEY_MAX_HISTORY_BUFFER_KB = "max_history_buffer_kb";
private static final boolean DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE = true;
private static final boolean DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME = true;
@@ -13285,6 +13192,10 @@ public class BatteryStatsImpl extends BatteryStats {
private static final long DEFAULT_UID_REMOVE_DELAY_MS = 5L * 60L * 1000L;
private static final long DEFAULT_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS = 600_000;
private static final long DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS = 300_000;
+ private static final int DEFAULT_MAX_HISTORY_FILES = 32;
+ private static final int DEFAULT_MAX_HISTORY_BUFFER_KB = 128; /*Kilo Bytes*/
+ private static final int DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE = 64;
+ private static final int DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB = 64; /*Kilo Bytes*/
public boolean TRACK_CPU_TIMES_BY_PROC_STATE = DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE;
public boolean TRACK_CPU_ACTIVE_CLUSTER_TIME = DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME;
@@ -13295,12 +13206,21 @@ public class BatteryStatsImpl extends BatteryStats {
= DEFAULT_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS;
public long BATTERY_LEVEL_COLLECTION_DELAY_MS
= DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS;
+ public int MAX_HISTORY_FILES;
+ public int MAX_HISTORY_BUFFER; /*Bytes*/
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
public Constants(Handler handler) {
super(handler);
+ if (ActivityManager.isLowRamDeviceStatic()) {
+ MAX_HISTORY_FILES = DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE;
+ MAX_HISTORY_BUFFER = DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB * 1024;
+ } else {
+ MAX_HISTORY_FILES = DEFAULT_MAX_HISTORY_FILES;
+ MAX_HISTORY_BUFFER = DEFAULT_MAX_HISTORY_BUFFER_KB * 1024;
+ }
}
public void startObserving(ContentResolver resolver) {
@@ -13346,6 +13266,16 @@ public class BatteryStatsImpl extends BatteryStats {
BATTERY_LEVEL_COLLECTION_DELAY_MS = mParser.getLong(
KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS,
DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS);
+
+ MAX_HISTORY_FILES = mParser.getInt(KEY_MAX_HISTORY_FILES,
+ ActivityManager.isLowRamDeviceStatic() ?
+ DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE
+ : DEFAULT_MAX_HISTORY_FILES);
+ MAX_HISTORY_BUFFER = mParser.getInt(KEY_MAX_HISTORY_BUFFER_KB,
+ ActivityManager.isLowRamDeviceStatic() ?
+ DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB
+ : DEFAULT_MAX_HISTORY_BUFFER_KB)
+ * 1024;
}
}
@@ -13399,6 +13329,10 @@ public class BatteryStatsImpl extends BatteryStats {
pw.println(EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS);
pw.print(KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS); pw.print("=");
pw.println(BATTERY_LEVEL_COLLECTION_DELAY_MS);
+ pw.print(KEY_MAX_HISTORY_FILES); pw.print("=");
+ pw.println(MAX_HISTORY_FILES);
+ pw.print(KEY_MAX_HISTORY_BUFFER_KB); pw.print("=");
+ pw.println(MAX_HISTORY_BUFFER/1024);
}
}
@@ -13450,20 +13384,22 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
- Parcel mPendingWrite = null;
final ReentrantLock mWriteLock = new ReentrantLock();
public void writeAsyncLocked() {
- writeLocked(false);
+ writeStatsLocked(false);
+ writeHistoryLocked(false);
}
public void writeSyncLocked() {
- writeLocked(true);
+ writeStatsLocked(true);
+ writeHistoryLocked(true);
}
- void writeLocked(boolean sync) {
- if (mFile == null) {
- Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
+ void writeStatsLocked(boolean sync) {
+ if (mStatsFile == null) {
+ Slog.w(TAG,
+ "writeStatsLocked: no file associated with this instance");
return;
}
@@ -13471,52 +13407,71 @@ public class BatteryStatsImpl extends BatteryStats {
return;
}
- Parcel out = Parcel.obtain();
- writeSummaryToParcel(out, true);
+ final Parcel p = Parcel.obtain();
+ final long start = SystemClock.uptimeMillis();
+ writeSummaryToParcel(p, false/*history is in separate file*/);
+ if (DEBUG) {
+ Slog.d(TAG, "writeSummaryToParcel duration ms:"
+ + (SystemClock.uptimeMillis() - start) + " bytes:" + p.dataSize());
+ }
mLastWriteTime = mClocks.elapsedRealtime();
+ writeParcelToFileLocked(p, mStatsFile, sync);
+ }
+
+ void writeHistoryLocked(boolean sync) {
+ if (mBatteryStatsHistory.getActiveFile() == null) {
+ Slog.w(TAG,
+ "writeHistoryLocked: no history file associated with this instance");
+ return;
+ }
+
+ if (mShuttingDown) {
+ return;
+ }
- if (mPendingWrite != null) {
- mPendingWrite.recycle();
+ Parcel p = Parcel.obtain();
+ final long start = SystemClock.uptimeMillis();
+ writeHistoryBuffer(p, true, true);
+ if (DEBUG) {
+ Slog.d(TAG, "writeHistoryBuffer duration ms:"
+ + (SystemClock.uptimeMillis() - start) + " bytes:" + p.dataSize());
}
- mPendingWrite = out;
+ writeParcelToFileLocked(p, mBatteryStatsHistory.getActiveFile(), sync);
+ }
+ void writeParcelToFileLocked(Parcel p, AtomicFile file, boolean sync) {
if (sync) {
- commitPendingDataToDisk();
+ commitPendingDataToDisk(p, file);
} else {
BackgroundThread.getHandler().post(new Runnable() {
@Override public void run() {
- commitPendingDataToDisk();
+ commitPendingDataToDisk(p, file);
}
});
}
}
- public void commitPendingDataToDisk() {
- final Parcel next;
- synchronized (this) {
- next = mPendingWrite;
- mPendingWrite = null;
- if (next == null) {
- return;
- }
- }
-
+ private void commitPendingDataToDisk(Parcel p, AtomicFile file) {
mWriteLock.lock();
+ FileOutputStream fos = null;
try {
final long startTime = SystemClock.uptimeMillis();
- FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
- stream.write(next.marshall());
- stream.flush();
- FileUtils.sync(stream);
- stream.close();
- mFile.commit();
+ fos = file.startWrite();
+ fos.write(p.marshall());
+ fos.flush();
+ file.finishWrite(fos);
+ if (DEBUG) {
+ Slog.d(TAG, "commitPendingDataToDisk file:" + file.getBaseFile().getPath()
+ + " duration ms:" + (SystemClock.uptimeMillis() - startTime)
+ + " bytes:" + p.dataSize());
+ }
com.android.internal.logging.EventLogTags.writeCommitSysConfigFile(
"batterystats", SystemClock.uptimeMillis() - startTime);
} catch (IOException e) {
- Slog.w("BatteryStats", "Error writing battery statistics", e);
- mFile.rollback();
+ Slog.w(TAG, "Error writing battery statistics", e);
+ file.failWrite(fos);
} finally {
- next.recycle();
+ p.recycle();
mWriteLock.unlock();
}
}
@@ -13526,35 +13481,65 @@ public class BatteryStatsImpl extends BatteryStats {
readDailyStatsLocked();
}
- if (mFile == null) {
- Slog.w("BatteryStats", "readLocked: no file associated with this instance");
+ if (mStatsFile == null) {
+ Slog.w(TAG, "readLocked: no file associated with this instance");
+ return;
+ }
+
+ if (mBatteryStatsHistory.getActiveFile() == null) {
+ Slog.w(TAG,
+ "readLocked: no history file associated with this instance");
return;
}
mUidStats.clear();
+ Parcel stats = Parcel.obtain();
try {
- File file = mFile.chooseForRead();
- if (!file.exists()) {
- return;
- }
- FileInputStream stream = new FileInputStream(file);
-
- byte[] raw = BatteryStatsHelper.readFully(stream);
- Parcel in = Parcel.obtain();
- in.unmarshall(raw, 0, raw.length);
- in.setDataPosition(0);
- stream.close();
-
- readSummaryFromParcel(in);
- } catch(Exception e) {
- Slog.e("BatteryStats", "Error reading battery statistics", e);
+ final long start = SystemClock.uptimeMillis();
+ byte[] raw = mStatsFile.readFully();
+ stats.unmarshall(raw, 0, raw.length);
+ stats.setDataPosition(0);
+ readSummaryFromParcel(stats);
+ if (DEBUG) {
+ Slog.d(TAG, "readLocked stats file:" + mStatsFile.getBaseFile().getPath()
+ + " bytes:" + raw.length + " takes ms:" + (SystemClock.uptimeMillis()
+ - start));
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, "Error reading battery statistics", e);
resetAllStatsLocked();
+ } finally {
+ stats.recycle();
+ }
+
+ Parcel history = Parcel.obtain();
+ try {
+ final long start = SystemClock.uptimeMillis();
+ byte[] raw = mBatteryStatsHistory.getActiveFile().readFully();
+ if (raw.length > 0) {
+ history.unmarshall(raw, 0, raw.length);
+ history.setDataPosition(0);
+ readHistoryBuffer(history, true);
+ }
+ if (DEBUG) {
+ Slog.d(TAG, "readLocked history file::"
+ + mBatteryStatsHistory.getActiveFile().getBaseFile().getPath()
+ + " bytes:" + raw.length + " takes ms:" + (SystemClock.uptimeMillis()
+ - start));
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, "Error reading battery history", e);
+ clearHistoryLocked();
+ mBatteryStatsHistory.resetAllFiles();
+ } finally {
+ history.recycle();
}
mEndPlatformVersion = Build.ID;
- if (mHistoryBuffer.dataPosition() > 0) {
+ if (mHistoryBuffer.dataPosition() > 0
+ || mBatteryStatsHistory.getFilesNumbers().size() > 1) {
mRecordingHistory = true;
final long elapsedRealtime = mClocks.elapsedRealtime();
final long uptime = mClocks.uptimeMillis();
@@ -13572,37 +13557,22 @@ public class BatteryStatsImpl extends BatteryStats {
return 0;
}
- void readHistory(Parcel in, boolean andOldHistory) throws ParcelFormatException {
+ void readHistoryBuffer(Parcel in, boolean andOldHistory) throws ParcelFormatException {
+ final int version = in.readInt();
+ if (version != VERSION) {
+ Slog.w("BatteryStats", "readHistoryBuffer: version got " + version
+ + ", expected " + VERSION + "; erasing old stats");
+ return;
+ }
+
final long historyBaseTime = in.readLong();
mHistoryBuffer.setDataSize(0);
mHistoryBuffer.setDataPosition(0);
- mHistoryTagPool.clear();
- mNextHistoryTagIdx = 0;
- mNumHistoryTagChars = 0;
-
- int numTags = in.readInt();
- for (int i=0; i<numTags; i++) {
- int idx = in.readInt();
- String str = in.readString();
- if (str == null) {
- throw new ParcelFormatException("null history tag string");
- }
- int uid = in.readInt();
- HistoryTag tag = new HistoryTag();
- tag.string = str;
- tag.uid = uid;
- tag.poolIdx = idx;
- mHistoryTagPool.put(tag, idx);
- if (idx >= mNextHistoryTagIdx) {
- mNextHistoryTagIdx = idx+1;
- }
- mNumHistoryTagChars += tag.string.length() + 1;
- }
int bufSize = in.readInt();
int curPos = in.dataPosition();
- if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) {
+ if (bufSize >= (mConstants.MAX_HISTORY_BUFFER*100)) {
throw new ParcelFormatException("File corrupt: history data buffer too large " +
bufSize);
} else if ((bufSize&~3) != bufSize) {
@@ -13659,7 +13629,7 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
- void writeHistory(Parcel out, boolean inclData, boolean andOldHistory) {
+ void writeHistoryBuffer(Parcel out, boolean inclData, boolean andOldHistory) {
if (DEBUG_HISTORY) {
StringBuilder sb = new StringBuilder(128);
sb.append("****************** WRITING mHistoryBaseTime: ");
@@ -13668,19 +13638,14 @@ public class BatteryStatsImpl extends BatteryStats {
TimeUtils.formatDuration(mLastHistoryElapsedRealtime, sb);
Slog.i(TAG, sb.toString());
}
+ out.writeInt(VERSION);
out.writeLong(mHistoryBaseTime + mLastHistoryElapsedRealtime);
if (!inclData) {
out.writeInt(0);
out.writeInt(0);
return;
}
- out.writeInt(mHistoryTagPool.size());
- for (HashMap.Entry<HistoryTag, Integer> ent : mHistoryTagPool.entrySet()) {
- HistoryTag tag = ent.getKey();
- out.writeInt(ent.getValue());
- out.writeString(tag.string);
- out.writeInt(tag.uid);
- }
+
out.writeInt(mHistoryBuffer.dataSize());
if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: "
+ mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition());
@@ -13711,7 +13676,34 @@ public class BatteryStatsImpl extends BatteryStats {
return;
}
- readHistory(in, true);
+ boolean inclHistory = in.readBoolean();
+ if (inclHistory) {
+ readHistoryBuffer(in, true);
+ mBatteryStatsHistory.readFromParcel(in);
+ }
+
+ mHistoryTagPool.clear();
+ mNextHistoryTagIdx = 0;
+ mNumHistoryTagChars = 0;
+
+ int numTags = in.readInt();
+ for (int i=0; i<numTags; i++) {
+ int idx = in.readInt();
+ String str = in.readString();
+ if (str == null) {
+ throw new ParcelFormatException("null history tag string");
+ }
+ int uid = in.readInt();
+ HistoryTag tag = new HistoryTag();
+ tag.string = str;
+ tag.uid = uid;
+ tag.poolIdx = idx;
+ mHistoryTagPool.put(tag, idx);
+ if (idx >= mNextHistoryTagIdx) {
+ mNextHistoryTagIdx = idx+1;
+ }
+ mNumHistoryTagChars += tag.string.length() + 1;
+ }
mStartCount = in.readInt();
mUptime = in.readLong();
@@ -14136,7 +14128,7 @@ public class BatteryStatsImpl extends BatteryStats {
String pkgName = in.readString();
Uid.Pkg p = u.getPackageStatsLocked(pkgName);
final int NWA = in.readInt();
- if (NWA > 1000) {
+ if (NWA > 10000) {
throw new ParcelFormatException("File corrupt: too many wakeup alarms " + NWA);
}
p.mWakeupAlarms.clear();
@@ -14147,7 +14139,7 @@ public class BatteryStatsImpl extends BatteryStats {
p.mWakeupAlarms.put(tag, c);
}
NS = in.readInt();
- if (NS > 1000) {
+ if (NS > 10000) {
throw new ParcelFormatException("File corrupt: too many services " + NS);
}
for (int is = 0; is < NS; is++) {
@@ -14179,7 +14171,19 @@ public class BatteryStatsImpl extends BatteryStats {
out.writeInt(VERSION);
- writeHistory(out, inclHistory, true);
+ out.writeBoolean(inclHistory);
+ if (inclHistory) {
+ writeHistoryBuffer(out, true, true);
+ mBatteryStatsHistory.writeToParcel(out);
+ }
+
+ out.writeInt(mHistoryTagPool.size());
+ for (HashMap.Entry<HistoryTag, Integer> ent : mHistoryTagPool.entrySet()) {
+ HistoryTag tag = ent.getKey();
+ out.writeInt(ent.getValue());
+ out.writeString(tag.string);
+ out.writeInt(tag.uid);
+ }
out.writeInt(mStartCount);
out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED));
@@ -14677,7 +14681,8 @@ public class BatteryStatsImpl extends BatteryStats {
throw new ParcelFormatException("Bad magic number: #" + Integer.toHexString(magic));
}
- readHistory(in, false);
+ readHistoryBuffer(in, false);
+ mBatteryStatsHistory.readFromParcel(in);
mStartCount = in.readInt();
mStartClockTime = in.readLong();
@@ -14906,7 +14911,8 @@ public class BatteryStatsImpl extends BatteryStats {
out.writeInt(MAGIC);
- writeHistory(out, true, false);
+ writeHistoryBuffer(out, true, false);
+ mBatteryStatsHistory.writeToParcel(out);
out.writeInt(mStartCount);
out.writeLong(startClockTime);
diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java
index 3315cb15d4b4..f87c081fd04f 100644
--- a/core/java/com/android/internal/os/BinderCallsStats.java
+++ b/core/java/com/android/internal/os/BinderCallsStats.java
@@ -16,10 +16,15 @@
package com.android.internal.os;
+import android.annotation.Nullable;
import android.os.Binder;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.text.format.DateFormat;
import android.util.ArrayMap;
+import android.util.Log;
+import android.util.Pair;
+import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -28,166 +33,337 @@ import com.android.internal.util.Preconditions;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Queue;
+import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.function.ToDoubleFunction;
/**
* Collects statistics about CPU time spent per binder call across multiple dimensions, e.g.
* per thread, uid or call description.
*/
public class BinderCallsStats {
+ public static final boolean ENABLED_DEFAULT = true;
+ public static final boolean DETAILED_TRACKING_DEFAULT = true;
+ public static final int PERIODIC_SAMPLING_INTERVAL_DEFAULT = 10;
+
+ private static final String TAG = "BinderCallsStats";
private static final int CALL_SESSIONS_POOL_SIZE = 100;
+ private static final int PERIODIC_SAMPLING_INTERVAL = 10;
+ private static final int MAX_EXCEPTION_COUNT_SIZE = 50;
+ private static final String EXCEPTION_COUNT_OVERFLOW_NAME = "overflow";
+ private static final CallSession NOT_ENABLED = new CallSession();
private static final BinderCallsStats sInstance = new BinderCallsStats();
- private volatile boolean mDetailedTracking = false;
+ private volatile boolean mEnabled = ENABLED_DEFAULT;
+ private volatile boolean mDetailedTracking = DETAILED_TRACKING_DEFAULT;
+ private volatile int mPeriodicSamplingInterval = PERIODIC_SAMPLING_INTERVAL_DEFAULT;
@GuardedBy("mLock")
private final SparseArray<UidEntry> mUidEntries = new SparseArray<>();
+ @GuardedBy("mLock")
+ private final ArrayMap<String, Integer> mExceptionCounts = new ArrayMap<>();
private final Queue<CallSession> mCallSessionsPool = new ConcurrentLinkedQueue<>();
private final Object mLock = new Object();
private long mStartTime = System.currentTimeMillis();
+ @GuardedBy("mLock")
+ private UidEntry mSampledEntries = new UidEntry(-1);
- private BinderCallsStats() {
- }
-
- @VisibleForTesting
- public BinderCallsStats(boolean detailedTracking) {
- mDetailedTracking = detailedTracking;
+ @VisibleForTesting // Use getInstance() instead.
+ public BinderCallsStats() {
}
public CallSession callStarted(Binder binder, int code) {
- return callStarted(binder.getClass().getName(), code);
+ return callStarted(binder.getClass().getName(), code, binder.getTransactionName(code));
}
- private CallSession callStarted(String className, int code) {
+ private CallSession callStarted(String className, int code, @Nullable String methodName) {
+ if (!mEnabled) {
+ return NOT_ENABLED;
+ }
+
CallSession s = mCallSessionsPool.poll();
if (s == null) {
s = new CallSession();
}
- s.mCallStat.className = className;
- s.mCallStat.msg = code;
- s.mStarted = getThreadTimeMicro();
+ s.callStat.className = className;
+ s.callStat.msg = code;
+ s.callStat.methodName = methodName;
+ s.exceptionThrown = false;
+ s.cpuTimeStarted = -1;
+ s.timeStarted = -1;
+
+ synchronized (mLock) {
+ if (mDetailedTracking) {
+ s.cpuTimeStarted = getThreadTimeMicro();
+ s.timeStarted = getElapsedRealtimeMicro();
+ } else {
+ s.sampledCallStat = mSampledEntries.getOrCreate(s.callStat);
+ if (s.sampledCallStat.callCount % mPeriodicSamplingInterval == 0) {
+ s.cpuTimeStarted = getThreadTimeMicro();
+ s.timeStarted = getElapsedRealtimeMicro();
+ }
+ }
+ }
return s;
}
- public void callEnded(CallSession s) {
+ public void callEnded(CallSession s, int parcelRequestSize, int parcelReplySize) {
Preconditions.checkNotNull(s);
- long duration = mDetailedTracking ? getThreadTimeMicro() - s.mStarted : 1;
- s.mCallingUId = Binder.getCallingUid();
+ if (s == NOT_ENABLED) {
+ return;
+ }
+ processCallEnded(s, parcelRequestSize, parcelReplySize);
+
+ if (mCallSessionsPool.size() < CALL_SESSIONS_POOL_SIZE) {
+ mCallSessionsPool.add(s);
+ }
+ }
+
+ private void processCallEnded(CallSession s, int parcelRequestSize, int parcelReplySize) {
synchronized (mLock) {
- UidEntry uidEntry = mUidEntries.get(s.mCallingUId);
- if (uidEntry == null) {
- uidEntry = new UidEntry(s.mCallingUId);
- mUidEntries.put(s.mCallingUId, uidEntry);
+ if (!mEnabled) {
+ return;
}
+ long duration;
+ long latencyDuration;
if (mDetailedTracking) {
- // Find CallDesc entry and update its total time
- CallStat callStat = uidEntry.mCallStats.get(s.mCallStat);
- // Only create CallStat if it's a new entry, otherwise update existing instance
- if (callStat == null) {
- callStat = new CallStat(s.mCallStat.className, s.mCallStat.msg);
- uidEntry.mCallStats.put(callStat, callStat);
+ duration = getThreadTimeMicro() - s.cpuTimeStarted;
+ latencyDuration = getElapsedRealtimeMicro() - s.timeStarted;
+ } else {
+ CallStat cs = s.sampledCallStat;
+ // Non-negative time signals beginning of the new sampling interval
+ if (s.cpuTimeStarted >= 0) {
+ duration = getThreadTimeMicro() - s.cpuTimeStarted;
+ latencyDuration = getElapsedRealtimeMicro() - s.timeStarted;
+ } else {
+ // callCount is always incremented, but time only once per sampling interval
+ long samplesCount = cs.callCount / mPeriodicSamplingInterval + 1;
+ duration = cs.cpuTimeMicros / samplesCount;
+ latencyDuration = cs.latencyMicros / samplesCount;
}
- callStat.callCount++;
- callStat.time += duration;
}
- uidEntry.time += duration;
+ int callingUid = getCallingUid();
+
+ UidEntry uidEntry = mUidEntries.get(callingUid);
+ if (uidEntry == null) {
+ uidEntry = new UidEntry(callingUid);
+ mUidEntries.put(callingUid, uidEntry);
+ }
+
+ CallStat callStat;
+ if (mDetailedTracking) {
+ // Find CallStat entry and update its total time
+ callStat = uidEntry.getOrCreate(s.callStat);
+ callStat.exceptionCount += s.exceptionThrown ? 1 : 0;
+ callStat.maxRequestSizeBytes =
+ Math.max(callStat.maxRequestSizeBytes, parcelRequestSize);
+ callStat.maxReplySizeBytes =
+ Math.max(callStat.maxReplySizeBytes, parcelReplySize);
+ } else {
+ // update sampled timings in the beginning of each interval
+ callStat = s.sampledCallStat;
+ }
+ callStat.callCount++;
+ callStat.methodName = s.callStat.methodName;
+ if (s.cpuTimeStarted >= 0) {
+ callStat.cpuTimeMicros += duration;
+ callStat.maxCpuTimeMicros = Math.max(callStat.maxCpuTimeMicros, duration);
+ callStat.latencyMicros += latencyDuration;
+ callStat.maxLatencyMicros = Math.max(callStat.maxLatencyMicros, latencyDuration);
+ }
+
+ uidEntry.cpuTimeMicros += duration;
uidEntry.callCount++;
}
- if (mCallSessionsPool.size() < CALL_SESSIONS_POOL_SIZE) {
- mCallSessionsPool.add(s);
+ }
+
+ /**
+ * Called if an exception is thrown while executing the binder transaction.
+ *
+ * <li>BinderCallsStats#callEnded will be called afterwards.
+ * <li>Do not throw an exception in this method, it will swallow the original exception thrown
+ * by the binder transaction.
+ */
+ public void callThrewException(CallSession s, Exception exception) {
+ Preconditions.checkNotNull(s);
+ if (!mEnabled) {
+ return;
+ }
+ s.exceptionThrown = true;
+ try {
+ String className = exception.getClass().getName();
+ synchronized (mLock) {
+ if (mExceptionCounts.size() >= MAX_EXCEPTION_COUNT_SIZE) {
+ className = EXCEPTION_COUNT_OVERFLOW_NAME;
+ }
+ Integer count = mExceptionCounts.get(className);
+ mExceptionCounts.put(className, count == null ? 1 : count + 1);
+ }
+ } catch (RuntimeException e) {
+ // Do not propagate the exception. We do not want to swallow original exception.
+ Log.wtf(TAG, "Unexpected exception while updating mExceptionCounts", e);
}
}
- public void dump(PrintWriter pw) {
- Map<Integer, Long> uidTimeMap = new HashMap<>();
- Map<Integer, Long> uidCallCountMap = new HashMap<>();
+ public ArrayList<ExportedCallStat> getExportedCallStats() {
+ // We do not collect all the data if detailed tracking is off.
+ if (!mDetailedTracking) {
+ return new ArrayList<ExportedCallStat>();
+ }
+
+ ArrayList<ExportedCallStat> resultCallStats = new ArrayList<>();
+ synchronized (mLock) {
+ int uidEntriesSize = mUidEntries.size();
+ for (int entryIdx = 0; entryIdx < uidEntriesSize; entryIdx++){
+ UidEntry entry = mUidEntries.valueAt(entryIdx);
+ for (CallStat stat : entry.getCallStatsList()) {
+ ExportedCallStat exported = new ExportedCallStat();
+ exported.uid = entry.uid;
+ exported.className = stat.className;
+ exported.methodName = stat.methodName == null
+ ? String.valueOf(stat.msg) : stat.methodName;
+ exported.cpuTimeMicros = stat.cpuTimeMicros;
+ exported.maxCpuTimeMicros = stat.maxCpuTimeMicros;
+ exported.latencyMicros = stat.latencyMicros;
+ exported.maxLatencyMicros = stat.maxLatencyMicros;
+ exported.callCount = stat.callCount;
+ exported.maxRequestSizeBytes = stat.maxRequestSizeBytes;
+ exported.maxReplySizeBytes = stat.maxReplySizeBytes;
+ exported.exceptionCount = stat.exceptionCount;
+ resultCallStats.add(exported);
+ }
+ }
+ }
+
+ return resultCallStats;
+ }
+
+ public void dump(PrintWriter pw, Map<Integer,String> appIdToPkgNameMap, boolean verbose) {
+ synchronized (mLock) {
+ dumpLocked(pw, appIdToPkgNameMap, verbose);
+ }
+ }
+
+ private void dumpLocked(PrintWriter pw, Map<Integer,String> appIdToPkgNameMap, boolean verbose) {
+ if (!mEnabled) {
+ pw.println("Binder calls stats disabled.");
+ return;
+ }
+
long totalCallsCount = 0;
- long totalCallsTime = 0;
+ long totalCpuTime = 0;
pw.print("Start time: ");
pw.println(DateFormat.format("yyyy-MM-dd HH:mm:ss", mStartTime));
- int uidEntriesSize = mUidEntries.size();
List<UidEntry> entries = new ArrayList<>();
- synchronized (mLock) {
- for (int i = 0; i < uidEntriesSize; i++) {
- UidEntry e = mUidEntries.valueAt(i);
- entries.add(e);
- totalCallsTime += e.time;
- // Update per-uid totals
- Long totalTimePerUid = uidTimeMap.get(e.uid);
- uidTimeMap.put(e.uid,
- totalTimePerUid == null ? e.time : totalTimePerUid + e.time);
- Long totalCallsPerUid = uidCallCountMap.get(e.uid);
- uidCallCountMap.put(e.uid, totalCallsPerUid == null ? e.callCount
- : totalCallsPerUid + e.callCount);
- totalCallsCount += e.callCount;
- }
+
+ int uidEntriesSize = mUidEntries.size();
+ for (int i = 0; i < uidEntriesSize; i++) {
+ UidEntry e = mUidEntries.valueAt(i);
+ entries.add(e);
+ totalCpuTime += e.cpuTimeMicros;
+ totalCallsCount += e.callCount;
}
+
+ entries.sort(Comparator.<UidEntry>comparingDouble(value -> value.cpuTimeMicros).reversed());
+ String datasetSizeDesc = verbose ? "" : "(top 90% by cpu time) ";
+ StringBuilder sb = new StringBuilder();
if (mDetailedTracking) {
- pw.println("Raw data (uid,call_desc,time):");
- entries.sort((o1, o2) -> {
- if (o1.time < o2.time) {
- return 1;
- } else if (o1.time > o2.time) {
- return -1;
- }
- return 0;
- });
- StringBuilder sb = new StringBuilder();
- for (UidEntry uidEntry : entries) {
- List<CallStat> callStats = new ArrayList<>(uidEntry.mCallStats.keySet());
- callStats.sort((o1, o2) -> {
- if (o1.time < o2.time) {
- return 1;
- } else if (o1.time > o2.time) {
- return -1;
- }
- return 0;
- });
- for (CallStat e : callStats) {
+ pw.println("Per-UID raw data " + datasetSizeDesc
+ + "(package/uid, call_desc, cpu_time_micros, max_cpu_time_micros, "
+ + "latency_time_micros, max_latency_time_micros, exception_count, "
+ + "max_request_size_bytes, max_reply_size_bytes, call_count):");
+ List<UidEntry> topEntries = verbose ? entries
+ : getHighestValues(entries, value -> value.cpuTimeMicros, 0.9);
+ for (UidEntry uidEntry : topEntries) {
+ for (CallStat e : uidEntry.getCallStatsList()) {
sb.setLength(0);
sb.append(" ")
- .append(uidEntry.uid).append(",").append(e).append(',').append(e.time);
+ .append(uidToString(uidEntry.uid, appIdToPkgNameMap))
+ .append(",").append(e)
+ .append(',').append(e.cpuTimeMicros)
+ .append(',').append(e.maxCpuTimeMicros)
+ .append(',').append(e.latencyMicros)
+ .append(',').append(e.maxLatencyMicros)
+ .append(',').append(e.exceptionCount)
+ .append(',').append(e.maxRequestSizeBytes)
+ .append(',').append(e.maxReplySizeBytes)
+ .append(',').append(e.callCount);
pw.println(sb);
}
}
pw.println();
- pw.println("Per UID Summary(UID: time, % of total_time, calls_count):");
- List<Map.Entry<Integer, Long>> uidTotals = new ArrayList<>(uidTimeMap.entrySet());
- uidTotals.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
- for (Map.Entry<Integer, Long> uidTotal : uidTotals) {
- Long callCount = uidCallCountMap.get(uidTotal.getKey());
- pw.println(String.format(" %7d: %11d %3.0f%% %8d",
- uidTotal.getKey(), uidTotal.getValue(),
- 100d * uidTotal.getValue() / totalCallsTime, callCount));
- }
- pw.println();
- pw.println(String.format(" Summary: total_time=%d, "
- + "calls_count=%d, avg_call_time=%.0f",
- totalCallsTime, totalCallsCount,
- (double)totalCallsTime / totalCallsCount));
} else {
- pw.println("Per UID Summary(UID: calls_count, % of total calls_count):");
- List<Map.Entry<Integer, Long>> uidTotals = new ArrayList<>(uidTimeMap.entrySet());
- uidTotals.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
- for (Map.Entry<Integer, Long> uidTotal : uidTotals) {
- Long callCount = uidCallCountMap.get(uidTotal.getKey());
- pw.println(String.format(" %7d: %8d %3.0f%%",
- uidTotal.getKey(), callCount, 100d * uidTotal.getValue() / totalCallsTime));
+ pw.println("Sampled stats " + datasetSizeDesc
+ + "(call_desc, cpu_time, call_count, exception_count):");
+ List<CallStat> sampledStatsList = mSampledEntries.getCallStatsList();
+ // Show all if verbose, otherwise 90th percentile
+ if (!verbose) {
+ sampledStatsList = getHighestValues(sampledStatsList,
+ value -> value.cpuTimeMicros, 0.9);
}
+ for (CallStat e : sampledStatsList) {
+ sb.setLength(0);
+ sb.append(" ").append(e)
+ .append(',').append(e.cpuTimeMicros * mPeriodicSamplingInterval)
+ .append(',').append(e.callCount)
+ .append(',').append(e.exceptionCount);
+ pw.println(sb);
+ }
+ pw.println();
+ }
+ pw.println("Per-UID Summary " + datasetSizeDesc
+ + "(cpu_time, % of total cpu_time, call_count, exception_count, package/uid):");
+ List<UidEntry> summaryEntries = verbose ? entries
+ : getHighestValues(entries, value -> value.cpuTimeMicros, 0.9);
+ for (UidEntry entry : summaryEntries) {
+ String uidStr = uidToString(entry.uid, appIdToPkgNameMap);
+ pw.println(String.format(" %10d %3.0f%% %8d %3d %s",
+ entry.cpuTimeMicros, 100d * entry.cpuTimeMicros / totalCpuTime, entry.callCount,
+ entry.exceptionCount, uidStr));
+ }
+ pw.println();
+ pw.println(String.format(" Summary: total_cpu_time=%d, "
+ + "calls_count=%d, avg_call_cpu_time=%.0f",
+ totalCpuTime, totalCallsCount, (double)totalCpuTime / totalCallsCount));
+ pw.println();
+
+ pw.println("Exceptions thrown (exception_count, class_name):");
+ List<Pair<String, Integer>> exceptionEntries = new ArrayList<>();
+ // We cannot use new ArrayList(Collection) constructor because MapCollections does not
+ // implement toArray method.
+ mExceptionCounts.entrySet().iterator().forEachRemaining(
+ (e) -> exceptionEntries.add(Pair.create(e.getKey(), e.getValue())));
+ exceptionEntries.sort((e1, e2) -> Integer.compare(e2.second, e1.second));
+ for (Pair<String, Integer> entry : exceptionEntries) {
+ pw.println(String.format(" %6d %s", entry.second, entry.first));
}
}
- private long getThreadTimeMicro() {
- // currentThreadTimeMicro is expensive, so we measure cpu time only if detailed tracking is
- // enabled
- return mDetailedTracking ? SystemClock.currentThreadTimeMicro() : 0;
+ private static String uidToString(int uid, Map<Integer, String> pkgNameMap) {
+ int appId = UserHandle.getAppId(uid);
+ String pkgName = pkgNameMap == null ? null : pkgNameMap.get(appId);
+ String uidStr = UserHandle.formatUid(uid);
+ return pkgName == null ? uidStr : pkgName + '/' + uidStr;
+ }
+
+ protected long getThreadTimeMicro() {
+ return SystemClock.currentThreadTimeMicro();
+ }
+
+ protected int getCallingUid() {
+ return Binder.getCallingUid();
+ }
+
+ protected long getElapsedRealtimeMicro() {
+ return SystemClock.elapsedRealtimeNanos() / 1000;
}
public static BinderCallsStats getInstance() {
@@ -195,24 +371,74 @@ public class BinderCallsStats {
}
public void setDetailedTracking(boolean enabled) {
- if (enabled != mDetailedTracking) {
- reset();
- mDetailedTracking = enabled;
+ synchronized (mLock) {
+ if (enabled != mDetailedTracking) {
+ mDetailedTracking = enabled;
+ reset();
+ }
+ }
+ }
+
+ public void setEnabled(boolean enabled) {
+ synchronized (mLock) {
+ if (enabled != mEnabled) {
+ mEnabled = enabled;
+ reset();
+ }
+ }
+ }
+
+ public void setSamplingInterval(int samplingInterval) {
+ synchronized (mLock) {
+ if (samplingInterval != mPeriodicSamplingInterval) {
+ mPeriodicSamplingInterval = samplingInterval;
+ reset();
+ }
}
}
public void reset() {
synchronized (mLock) {
mUidEntries.clear();
+ mExceptionCounts.clear();
+ mSampledEntries.mCallStats.clear();
mStartTime = System.currentTimeMillis();
}
}
- private static class CallStat {
- String className;
- int msg;
- long time;
- long callCount;
+ /**
+ * Aggregated data by uid/class/method to be sent through WestWorld.
+ */
+ public static class ExportedCallStat {
+ public int uid;
+ public String className;
+ public String methodName;
+ public long cpuTimeMicros;
+ public long maxCpuTimeMicros;
+ public long latencyMicros;
+ public long maxLatencyMicros;
+ public long callCount;
+ public long maxRequestSizeBytes;
+ public long maxReplySizeBytes;
+ public long exceptionCount;
+ }
+
+ @VisibleForTesting
+ public static class CallStat {
+ public String className;
+ public int msg;
+ // Method name might be null when we cannot resolve the transaction code. For instance, if
+ // the binder was not generated by AIDL.
+ public @Nullable String methodName;
+ public long cpuTimeMicros;
+ public long maxCpuTimeMicros;
+ public long latencyMicros;
+ public long maxLatencyMicros;
+ public long callCount;
+ // The following fields are only computed if mDetailedTracking is set.
+ public long maxRequestSizeBytes;
+ public long maxReplySizeBytes;
+ public long exceptionCount;
CallStat() {
}
@@ -242,20 +468,24 @@ public class BinderCallsStats {
@Override
public String toString() {
- return className + "/" + msg;
+ return className + "#" + (methodName == null ? msg : methodName);
}
}
public static class CallSession {
- int mCallingUId;
- long mStarted;
- CallStat mCallStat = new CallStat();
+ long cpuTimeStarted;
+ long timeStarted;
+ boolean exceptionThrown;
+ final CallStat callStat = new CallStat();
+ CallStat sampledCallStat;
}
- private static class UidEntry {
+ @VisibleForTesting
+ public static class UidEntry {
int uid;
- long time;
- long callCount;
+ public long cpuTimeMicros;
+ public long callCount;
+ public int exceptionCount;
UidEntry(int uid) {
this.uid = uid;
@@ -264,10 +494,36 @@ public class BinderCallsStats {
// Aggregate time spent per each call name: call_desc -> cpu_time_micros
Map<CallStat, CallStat> mCallStats = new ArrayMap<>();
+ CallStat getOrCreate(CallStat callStat) {
+ CallStat mapCallStat = mCallStats.get(callStat);
+ // Only create CallStat if it's a new entry, otherwise update existing instance
+ if (mapCallStat == null) {
+ mapCallStat = new CallStat(callStat.className, callStat.msg);
+ mCallStats.put(mapCallStat, mapCallStat);
+ }
+ return mapCallStat;
+ }
+
+ /**
+ * Returns list of calls sorted by CPU time
+ */
+ public List<CallStat> getCallStatsList() {
+ List<CallStat> callStats = new ArrayList<>(mCallStats.keySet());
+ callStats.sort((o1, o2) -> {
+ if (o1.cpuTimeMicros < o2.cpuTimeMicros) {
+ return 1;
+ } else if (o1.cpuTimeMicros > o2.cpuTimeMicros) {
+ return -1;
+ }
+ return 0;
+ });
+ return callStats;
+ }
+
@Override
public String toString() {
return "UidEntry{" +
- "time=" + time +
+ "cpuTimeMicros=" + cpuTimeMicros +
", callCount=" + callCount +
", mCallStats=" + mCallStats +
'}';
@@ -289,4 +545,40 @@ public class BinderCallsStats {
}
}
+ @VisibleForTesting
+ public SparseArray<UidEntry> getUidEntries() {
+ return mUidEntries;
+ }
+
+ @VisibleForTesting
+ public UidEntry getSampledEntries() {
+ return mSampledEntries;
+ }
+
+ @VisibleForTesting
+ public ArrayMap<String, Integer> getExceptionCounts() {
+ return mExceptionCounts;
+ }
+
+ @VisibleForTesting
+ public static <T> List<T> getHighestValues(List<T> list, ToDoubleFunction<T> toDouble,
+ double percentile) {
+ List<T> sortedList = new ArrayList<>(list);
+ sortedList.sort(Comparator.comparingDouble(toDouble).reversed());
+ double total = 0;
+ for (T item : list) {
+ total += toDouble.applyAsDouble(item);
+ }
+ List<T> result = new ArrayList<>();
+ double runningSum = 0;
+ for (T item : sortedList) {
+ if (runningSum > percentile * total) {
+ break;
+ }
+ result.add(item);
+ runningSum += toDouble.applyAsDouble(item);
+ }
+ return result;
+ }
+
}
diff --git a/core/java/com/android/internal/os/IDropBoxManagerService.aidl b/core/java/com/android/internal/os/IDropBoxManagerService.aidl
index d16579c03d7a..70844ee4ef11 100644
--- a/core/java/com/android/internal/os/IDropBoxManagerService.aidl
+++ b/core/java/com/android/internal/os/IDropBoxManagerService.aidl
@@ -37,5 +37,5 @@ interface IDropBoxManagerService {
boolean isTagEnabled(String tag);
/** @see DropBoxManager#getNextEntry */
- DropBoxManager.Entry getNextEntry(String tag, long millis);
+ DropBoxManager.Entry getNextEntry(String tag, long millis, String packageName);
}
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index f537e3e2897b..12761b9274e3 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -150,6 +150,11 @@ class ZygoteConnection {
return null;
}
+ if (parsedArgs.pidQuery) {
+ handlePidQuery();
+ return null;
+ }
+
if (parsedArgs.preloadDefault) {
handlePreload();
return null;
@@ -271,6 +276,17 @@ class ZygoteConnection {
}
}
+ private void handlePidQuery() {
+ try {
+ String pidString = String.valueOf(Process.myPid());
+ final byte[] pidStringBytes = pidString.getBytes(StandardCharsets.US_ASCII);
+ mSocketOutStream.writeInt(pidStringBytes.length);
+ mSocketOutStream.write(pidStringBytes);
+ } catch (IOException ioe) {
+ throw new IllegalStateException("Error writing to command socket", ioe);
+ }
+ }
+
/**
* Preloads resources if the zygote is in lazily preload mode. Writes the result of the
* preload operation; {@code 0} when a preload was initiated due to this request and {@code 1}
@@ -469,6 +485,11 @@ class ZygoteConnection {
boolean startChildZygote;
/**
+ * Whether the current arguments constitute a request for the zygote's PID.
+ */
+ boolean pidQuery;
+
+ /**
* Exemptions from API blacklisting. These are sent to the pre-forked zygote at boot time,
* or when they change, via --set-api-blacklist-exemptions.
*/
@@ -622,6 +643,8 @@ class ZygoteConnection {
mountExternal = Zygote.MOUNT_EXTERNAL_WRITE;
} else if (arg.equals("--query-abi-list")) {
abiListQuery = true;
+ } else if (arg.equals("--get-pid")) {
+ pidQuery = true;
} else if (arg.startsWith("--instruction-set=")) {
instructionSet = arg.substring(arg.indexOf('=') + 1);
} else if (arg.startsWith("--app-data-dir=")) {
@@ -656,7 +679,7 @@ class ZygoteConnection {
}
}
- if (abiListQuery) {
+ if (abiListQuery || pidQuery) {
if (args.length - curArg > 0) {
throw new IllegalArgumentException("Unexpected arguments after --query-abi-list.");
}
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 6ad1d72eaec4..469726613513 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -16,6 +16,8 @@
package com.android.internal.policy;
+import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.app.WindowConfiguration;
import android.graphics.Outline;
import android.graphics.drawable.InsetDrawable;
@@ -279,11 +281,16 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
initResizingPaints();
}
- void setBackgroundFallback(int resId) {
- mBackgroundFallback.setDrawable(resId != 0 ? getContext().getDrawable(resId) : null);
+ void setBackgroundFallback(@Nullable Drawable fallbackDrawable) {
+ mBackgroundFallback.setDrawable(fallbackDrawable);
setWillNotDraw(getBackground() == null && !mBackgroundFallback.hasFallback());
}
+ @TestApi
+ public @Nullable Drawable getBackgroundFallback() {
+ return mBackgroundFallback.getDrawable();
+ }
+
@Override
public boolean gatherTransparentRegion(Region region) {
boolean statusOpaque = gatherTransparentRegion(mStatusColorViewState, region);
@@ -942,7 +949,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
mWindow.isTranslucent() || mWindow.isShowingWallpaper());
} else {
mResizingBackgroundDrawable = getResizingBackgroundDrawable(
- getContext(), 0, mWindow.mBackgroundFallbackResource,
+ mWindow.mBackgroundDrawable, mWindow.mBackgroundFallbackDrawable,
mWindow.isTranslucent() || mWindow.isShowingWallpaper());
}
if (mResizingBackgroundDrawable != null) {
@@ -1901,9 +1908,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
private void loadBackgroundDrawablesIfNeeded() {
if (mResizingBackgroundDrawable == null) {
- mResizingBackgroundDrawable = getResizingBackgroundDrawable(getContext(),
- mWindow.mBackgroundResource, mWindow.mBackgroundFallbackResource,
- mWindow.isTranslucent() || mWindow.isShowingWallpaper());
+ mResizingBackgroundDrawable = getResizingBackgroundDrawable(mWindow.mBackgroundDrawable,
+ mWindow.mBackgroundFallbackDrawable, mWindow.isTranslucent()
+ || mWindow.isShowingWallpaper());
if (mResizingBackgroundDrawable == null) {
// We shouldn't really get here as the background fallback should be always
// available since it is defaulted by the system.
@@ -2011,20 +2018,14 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
* Returns the color used to fill areas the app has not rendered content to yet when the
* user is resizing the window of an activity in multi-window mode.
*/
- public static Drawable getResizingBackgroundDrawable(Context context, int backgroundRes,
- int backgroundFallbackRes, boolean windowTranslucent) {
- if (backgroundRes != 0) {
- final Drawable drawable = context.getDrawable(backgroundRes);
- if (drawable != null) {
- return enforceNonTranslucentBackground(drawable, windowTranslucent);
- }
+ public static Drawable getResizingBackgroundDrawable(@Nullable Drawable backgroundDrawable,
+ @Nullable Drawable fallbackDrawable, boolean windowTranslucent) {
+ if (backgroundDrawable != null) {
+ return enforceNonTranslucentBackground(backgroundDrawable, windowTranslucent);
}
- if (backgroundFallbackRes != 0) {
- final Drawable fallbackDrawable = context.getDrawable(backgroundFallbackRes);
- if (fallbackDrawable != null) {
- return enforceNonTranslucentBackground(fallbackDrawable, windowTranslucent);
- }
+ if (fallbackDrawable != null) {
+ return enforceNonTranslucentBackground(fallbackDrawable, windowTranslucent);
}
return new ColorDrawable(Color.BLACK);
}
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index daea9a8eff41..ac7dc8e29b55 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -21,6 +21,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.view.WindowManager.LayoutParams.*;
+import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.SearchManager;
import android.media.session.MediaSessionManager;
@@ -217,10 +218,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
private ProgressBar mHorizontalProgressBar;
- int mBackgroundResource = 0;
- int mBackgroundFallbackResource = 0;
-
- private Drawable mBackgroundDrawable;
+ Drawable mBackgroundDrawable = null;
+ Drawable mBackgroundFallbackDrawable = null;
private boolean mLoadElevation = true;
private float mElevation;
@@ -1471,14 +1470,14 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
@Override
public final void setBackgroundDrawable(Drawable drawable) {
- if (drawable != mBackgroundDrawable || mBackgroundResource != 0) {
- mBackgroundResource = 0;
+ if (drawable != mBackgroundDrawable) {
mBackgroundDrawable = drawable;
if (mDecor != null) {
mDecor.setWindowBackground(drawable);
- }
- if (mBackgroundFallbackResource != 0) {
- mDecor.setBackgroundFallback(drawable != null ? 0 : mBackgroundFallbackResource);
+ if (mBackgroundFallbackDrawable != null) {
+ mDecor.setBackgroundFallback(drawable != null ? null :
+ mBackgroundFallbackDrawable);
+ }
}
}
}
@@ -2066,7 +2065,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
@Override
- public final View getDecorView() {
+ public final @NonNull View getDecorView() {
if (mDecor == null || mForceDecorInstall) {
installDecor();
}
@@ -2510,21 +2509,19 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
// the values are inherited from our container.
if (getContainer() == null) {
if (mBackgroundDrawable == null) {
- if (mBackgroundResource == 0) {
- mBackgroundResource = a.getResourceId(
- R.styleable.Window_windowBackground, 0);
- }
+
if (mFrameResource == 0) {
mFrameResource = a.getResourceId(R.styleable.Window_windowFrame, 0);
}
- mBackgroundFallbackResource = a.getResourceId(
- R.styleable.Window_windowBackgroundFallback, 0);
- if (false) {
- System.out.println("Background: "
- + Integer.toHexString(mBackgroundResource) + " Frame: "
- + Integer.toHexString(mFrameResource));
+
+ if (a.hasValue(R.styleable.Window_windowBackground)) {
+ mBackgroundDrawable = a.getDrawable(R.styleable.Window_windowBackground);
}
}
+ if (a.hasValue(R.styleable.Window_windowBackgroundFallback)) {
+ mBackgroundFallbackDrawable =
+ a.getDrawable(R.styleable.Window_windowBackgroundFallback);
+ }
if (mLoadElevation) {
mElevation = a.getDimension(R.styleable.Window_windowElevation, 0);
}
@@ -2617,13 +2614,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
// Remaining setup -- of background and title -- that only applies
// to top-level windows.
if (getContainer() == null) {
- final Drawable background;
- if (mBackgroundResource != 0) {
- background = getContext().getDrawable(mBackgroundResource);
- } else {
- background = mBackgroundDrawable;
- }
- mDecor.setWindowBackground(background);
+ mDecor.setWindowBackground(mBackgroundDrawable);
final Drawable frame;
if (mFrameResource != 0) {
@@ -2733,8 +2724,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
}
- if (mDecor.getBackground() == null && mBackgroundFallbackResource != 0) {
- mDecor.setBackgroundFallback(mBackgroundFallbackResource);
+ if (mDecor.getBackground() == null && mBackgroundFallbackDrawable != null) {
+ mDecor.setBackgroundFallback(mBackgroundFallbackDrawable);
}
// Only inflate or create a new TransitionManager if the caller hasn't
diff --git a/core/java/com/android/internal/textservice/ITextServicesManager.aidl b/core/java/com/android/internal/textservice/ITextServicesManager.aidl
index c5940ba4dde2..20f2aa06cf1e 100644
--- a/core/java/com/android/internal/textservice/ITextServicesManager.aidl
+++ b/core/java/com/android/internal/textservice/ITextServicesManager.aidl
@@ -30,8 +30,7 @@ import android.view.textservice.SpellCheckerSubtype;
*/
interface ITextServicesManager {
SpellCheckerInfo getCurrentSpellChecker(String locale);
- SpellCheckerSubtype getCurrentSpellCheckerSubtype(
- String locale, boolean allowImplicitlySelectedSubtype);
+ SpellCheckerSubtype getCurrentSpellCheckerSubtype(boolean allowImplicitlySelectedSubtype);
oneway void getSpellCheckerService(String sciId, in String locale,
in ITextServicesSessionListener tsListener,
in ISpellCheckerSessionListener scListener, in Bundle bundle);
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index 621619c5134d..c3d33ca84ee1 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -308,6 +308,23 @@ public class ArrayUtils {
return array;
}
+ @SuppressWarnings("unchecked")
+ public static @NonNull <T> T[] concat(Class<T> kind, @Nullable T[] a, @Nullable T[] b) {
+ final int an = (a != null) ? a.length : 0;
+ final int bn = (b != null) ? b.length : 0;
+ if (an == 0 && bn == 0) {
+ if (kind == String.class) {
+ return (T[]) EmptyArray.STRING;
+ } else if (kind == Object.class) {
+ return (T[]) EmptyArray.OBJECT;
+ }
+ }
+ final T[] res = (T[]) Array.newInstance(kind, an + bn);
+ if (an > 0) System.arraycopy(a, 0, res, 0, an);
+ if (bn > 0) System.arraycopy(b, 0, res, an, bn);
+ return res;
+ }
+
/**
* Adds value to given array if not already present, providing set-like
* behavior.
@@ -626,4 +643,17 @@ public class ArrayUtils {
public static @NonNull String[] defeatNullable(@Nullable String[] val) {
return (val != null) ? val : EmptyArray.STRING;
}
+
+ /**
+ * Throws {@link ArrayIndexOutOfBoundsException} if the index is out of bounds.
+ *
+ * @param len length of the array. Must be non-negative
+ * @param index the index to check
+ * @throws ArrayIndexOutOfBoundsException if the {@code index} is out of bounds of the array
+ */
+ public static void checkBounds(int len, int index) {
+ if (index < 0 || len <= index) {
+ throw new ArrayIndexOutOfBoundsException("length=" + len + "; index=" + index);
+ }
+ }
}
diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/ContrastColorUtil.java
index 318bccf68f57..16ca4fcdbe34 100644
--- a/core/java/com/android/internal/util/NotificationColorUtil.java
+++ b/core/java/com/android/internal/util/ContrastColorUtil.java
@@ -48,13 +48,13 @@ import java.util.WeakHashMap;
*
* @hide
*/
-public class NotificationColorUtil {
+public class ContrastColorUtil {
- private static final String TAG = "NotificationColorUtil";
+ private static final String TAG = "ContrastColorUtil";
private static final boolean DEBUG = false;
private static final Object sLock = new Object();
- private static NotificationColorUtil sInstance;
+ private static ContrastColorUtil sInstance;
private final ImageUtils mImageUtils = new ImageUtils();
private final WeakHashMap<Bitmap, Pair<Boolean, Integer>> mGrayscaleBitmapCache =
@@ -62,16 +62,16 @@ public class NotificationColorUtil {
private final int mGrayscaleIconMaxSize; // @dimen/notification_large_icon_width (64dp)
- public static NotificationColorUtil getInstance(Context context) {
+ public static ContrastColorUtil getInstance(Context context) {
synchronized (sLock) {
if (sInstance == null) {
- sInstance = new NotificationColorUtil(context);
+ sInstance = new ContrastColorUtil(context);
}
return sInstance;
}
}
- private NotificationColorUtil(Context context) {
+ private ContrastColorUtil(Context context) {
mGrayscaleIconMaxSize = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_large_icon_width);
}
@@ -454,9 +454,12 @@ public class NotificationColorUtil {
/**
* Resolves {@param color} to an actual color if it is {@link Notification#COLOR_DEFAULT}
*/
- public static int resolveColor(Context context, int color) {
+ public static int resolveColor(Context context, int color, boolean defaultBackgroundIsDark) {
if (color == Notification.COLOR_DEFAULT) {
- return context.getColor(com.android.internal.R.color.notification_default_color_light);
+ int res = defaultBackgroundIsDark
+ ? com.android.internal.R.color.notification_default_color_dark
+ : com.android.internal.R.color.notification_default_color_light;
+ return context.getColor(res);
}
return color;
}
@@ -470,7 +473,7 @@ public class NotificationColorUtil {
*/
public static int resolveContrastColor(Context context, int notificationColor,
int backgroundColor) {
- return NotificationColorUtil.resolveContrastColor(context, notificationColor,
+ return ContrastColorUtil.resolveContrastColor(context, notificationColor,
backgroundColor, false /* isDark */);
}
@@ -486,10 +489,10 @@ public class NotificationColorUtil {
*/
public static int resolveContrastColor(Context context, int notificationColor,
int backgroundColor, boolean isDark) {
- final int resolvedColor = resolveColor(context, notificationColor);
+ final int resolvedColor = resolveColor(context, notificationColor, isDark);
int color = resolvedColor;
- color = NotificationColorUtil.ensureTextContrast(color, backgroundColor, isDark);
+ color = ContrastColorUtil.ensureTextContrast(color, backgroundColor, isDark);
if (color != resolvedColor) {
if (DEBUG){
@@ -497,7 +500,7 @@ public class NotificationColorUtil {
"Enhanced contrast of notification for %s"
+ " and %s (over background) by changing #%s to %s",
context.getPackageName(),
- NotificationColorUtil.contrastChange(resolvedColor, color, backgroundColor),
+ ContrastColorUtil.contrastChange(resolvedColor, color, backgroundColor),
Integer.toHexString(resolvedColor), Integer.toHexString(color)));
}
}
@@ -520,10 +523,11 @@ public class NotificationColorUtil {
}
public static int resolveAmbientColor(Context context, int notificationColor) {
- final int resolvedColor = resolveColor(context, notificationColor);
+ final int resolvedColor = resolveColor(context, notificationColor,
+ true /* defaultBackgroundIsDark */);
int color = resolvedColor;
- color = NotificationColorUtil.ensureTextContrastOnBlack(color);
+ color = ContrastColorUtil.ensureTextContrastOnBlack(color);
if (color != resolvedColor) {
if (DEBUG){
@@ -531,15 +535,16 @@ public class NotificationColorUtil {
"Ambient contrast of notification for %s is %s (over black)"
+ " by changing #%s to #%s",
context.getPackageName(),
- NotificationColorUtil.contrastChange(resolvedColor, color, Color.BLACK),
+ ContrastColorUtil.contrastChange(resolvedColor, color, Color.BLACK),
Integer.toHexString(resolvedColor), Integer.toHexString(color)));
}
}
return color;
}
- public static int resolvePrimaryColor(Context context, int backgroundColor) {
- boolean useDark = shouldUseDark(backgroundColor);
+ public static int resolvePrimaryColor(Context context, int backgroundColor,
+ boolean defaultBackgroundIsDark) {
+ boolean useDark = shouldUseDark(backgroundColor, defaultBackgroundIsDark);
if (useDark) {
return context.getColor(
com.android.internal.R.color.notification_primary_text_color_light);
@@ -549,8 +554,9 @@ public class NotificationColorUtil {
}
}
- public static int resolveSecondaryColor(Context context, int backgroundColor) {
- boolean useDark = shouldUseDark(backgroundColor);
+ public static int resolveSecondaryColor(Context context, int backgroundColor,
+ boolean defaultBackgroundIsDark) {
+ boolean useDark = shouldUseDark(backgroundColor, defaultBackgroundIsDark);
if (useDark) {
return context.getColor(
com.android.internal.R.color.notification_secondary_text_color_light);
@@ -560,8 +566,9 @@ public class NotificationColorUtil {
}
}
- public static int resolveDefaultColor(Context context, int backgroundColor) {
- boolean useDark = shouldUseDark(backgroundColor);
+ public static int resolveDefaultColor(Context context, int backgroundColor,
+ boolean defaultBackgroundIsDark) {
+ boolean useDark = shouldUseDark(backgroundColor, defaultBackgroundIsDark);
if (useDark) {
return context.getColor(
com.android.internal.R.color.notification_default_color_light);
@@ -591,12 +598,11 @@ public class NotificationColorUtil {
return ColorUtilsFromCompat.LABToColor(result[0], result[1], result[2]);
}
- private static boolean shouldUseDark(int backgroundColor) {
- boolean useDark = backgroundColor == Notification.COLOR_DEFAULT;
- if (!useDark) {
- useDark = ColorUtilsFromCompat.calculateLuminance(backgroundColor) > 0.5;
+ private static boolean shouldUseDark(int backgroundColor, boolean defaultBackgroundIsDark) {
+ if (backgroundColor == Notification.COLOR_DEFAULT) {
+ return !defaultBackgroundIsDark;
}
- return useDark;
+ return ColorUtilsFromCompat.calculateLuminance(backgroundColor) > 0.5;
}
public static double calculateLuminance(int backgroundColor) {
@@ -609,7 +615,7 @@ public class NotificationColorUtil {
}
public static boolean satisfiesTextContrast(int backgroundColor, int foregroundColor) {
- return NotificationColorUtil.calculateContrast(foregroundColor, backgroundColor) >= 4.5;
+ return ContrastColorUtil.calculateContrast(foregroundColor, backgroundColor) >= 4.5;
}
/**
diff --git a/core/java/com/android/internal/util/DumpUtils.java b/core/java/com/android/internal/util/DumpUtils.java
index 7fd83bc6c8b9..f6d80a572c75 100644
--- a/core/java/com/android/internal/util/DumpUtils.java
+++ b/core/java/com/android/internal/util/DumpUtils.java
@@ -34,9 +34,18 @@ import java.util.function.Predicate;
/**
* Helper functions for dumping the state of system services.
* Test:
- atest /android/pi-dev/frameworks/base/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java
+ atest FrameworksCoreTests:DumpUtilsTest
*/
public final class DumpUtils {
+
+ /**
+ * List of component names that should be dumped in the bug report critical section.
+ *
+ * @hide
+ */
+ public static final ComponentName[] CRITICAL_SECTION_COMPONENTS = {
+ new ComponentName("com.android.systemui", "com.android.systemui.SystemUIService")
+ };
private static final String TAG = "DumpUtils";
private static final boolean DEBUG = false;
@@ -213,6 +222,45 @@ public final class DumpUtils {
}
/**
+ * Return whether a package should be dumped in the critical section.
+ */
+ private static boolean isCriticalPackage(@Nullable ComponentName cname) {
+ if (cname == null) {
+ return false;
+ }
+
+ for (int i = 0; i < CRITICAL_SECTION_COMPONENTS.length; i++) {
+ if (cname.equals(CRITICAL_SECTION_COMPONENTS[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Return whether a package name is considered to be part of the platform and in the critical
+ * section.
+ *
+ * @hide
+ */
+ public static boolean isPlatformCriticalPackage(@Nullable ComponentName.WithComponentName wcn) {
+ return (wcn != null) && isPlatformPackage(wcn.getComponentName()) &&
+ isCriticalPackage(wcn.getComponentName());
+ }
+
+ /**
+ * Return whether a package name is considered to be part of the platform but not in the the
+ * critical section.
+ *
+ * @hide
+ */
+ public static boolean isPlatformNonCriticalPackage(
+ @Nullable ComponentName.WithComponentName wcn) {
+ return (wcn != null) && isPlatformPackage(wcn.getComponentName()) &&
+ !isCriticalPackage(wcn.getComponentName());
+ }
+
+ /**
* Used for dumping providers and services. Return a predicate for a given filter string.
* @hide
*/
@@ -238,6 +286,16 @@ public final class DumpUtils {
return DumpUtils::isNonPlatformPackage;
}
+ // Dump all platform-critical?
+ if ("all-platform-critical".equals(filterString)) {
+ return DumpUtils::isPlatformCriticalPackage;
+ }
+
+ // Dump all platform-non-critical?
+ if ("all-platform-non-critical".equals(filterString)) {
+ return DumpUtils::isPlatformNonCriticalPackage;
+ }
+
// Is the filter a component name? If so, do an exact match.
final ComponentName filterCname = ComponentName.unflattenFromString(filterString);
if (filterCname != null) {
diff --git a/core/java/com/android/internal/util/HexDump.java b/core/java/com/android/internal/util/HexDump.java
index 7be95d89dcf9..af004009e1ee 100644
--- a/core/java/com/android/internal/util/HexDump.java
+++ b/core/java/com/android/internal/util/HexDump.java
@@ -16,18 +16,21 @@
package com.android.internal.util;
+import android.annotation.Nullable;
+
public class HexDump
{
private final static char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
private final static char[] HEX_LOWER_CASE_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
- public static String dumpHexString(byte[] array)
- {
+ public static String dumpHexString(@Nullable byte[] array) {
+ if (array == null) return "(null)";
return dumpHexString(array, 0, array.length);
}
- public static String dumpHexString(byte[] array, int offset, int length)
+ public static String dumpHexString(@Nullable byte[] array, int offset, int length)
{
+ if (array == null) return "(null)";
StringBuilder result = new StringBuilder();
byte[] line = new byte[16];
diff --git a/core/java/com/android/internal/util/LatencyTracker.java b/core/java/com/android/internal/util/LatencyTracker.java
index 6c3a58ce3908..989c58ba6060 100644
--- a/core/java/com/android/internal/util/LatencyTracker.java
+++ b/core/java/com/android/internal/util/LatencyTracker.java
@@ -79,6 +79,11 @@ public class LatencyTracker {
*/
public static final int ACTION_ROTATE_SCREEN = 6;
+ /*
+ * Time between we get a face acquired signal until we start with the unlock animation
+ */
+ public static final int ACTION_FACE_WAKE_AND_UNLOCK = 6;
+
private static final String[] NAMES = new String[] {
"expand panel",
"toggle recents",
@@ -86,7 +91,8 @@ public class LatencyTracker {
"check credential",
"check credential unlocked",
"turn on screen",
- "rotate the screen"};
+ "rotate the screen",
+ "face wake-and-unlock" };
private static LatencyTracker sLatencyTracker;
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 9ed1ffba6897..f76eddf7af14 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -74,8 +74,8 @@ interface IInputMethodManager {
void hideMySoftInput(in IBinder token, int flags);
void showMySoftInput(in IBinder token, int flags);
void updateStatusIcon(in IBinder token, String packageName, int iconId);
- void setImeWindowStatus(in IBinder token, in IBinder startInputToken, int vis,
- int backDisposition);
+ void setImeWindowStatus(in IBinder token, int vis, int backDisposition);
+ void reportStartInput(in IBinder token, in IBinder startInputToken);
void registerSuggestionSpansForNotification(in SuggestionSpan[] spans);
boolean notifySuggestionPicked(in SuggestionSpan span, String originalString, int index);
InputMethodSubtype getCurrentInputMethodSubtype();
diff --git a/core/java/com/android/internal/widget/BackgroundFallback.java b/core/java/com/android/internal/widget/BackgroundFallback.java
index 2b05f1ecbc70..a66fa65af257 100644
--- a/core/java/com/android/internal/widget/BackgroundFallback.java
+++ b/core/java/com/android/internal/widget/BackgroundFallback.java
@@ -17,6 +17,7 @@
package com.android.internal.widget;
+import android.annotation.Nullable;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
@@ -35,6 +36,10 @@ public class BackgroundFallback {
mBackgroundFallback = d;
}
+ public @Nullable Drawable getDrawable() {
+ return mBackgroundFallback;
+ }
+
public boolean hasFallback() {
return mBackgroundFallback != null;
}
diff --git a/core/java/com/android/internal/widget/ExploreByTouchHelper.java b/core/java/com/android/internal/widget/ExploreByTouchHelper.java
index 50ad547e6e65..3cb6919819ab 100644
--- a/core/java/com/android/internal/widget/ExploreByTouchHelper.java
+++ b/core/java/com/android/internal/widget/ExploreByTouchHelper.java
@@ -148,7 +148,7 @@ public abstract class ExploreByTouchHelper extends View.AccessibilityDelegate {
updateHoveredVirtualView(virtualViewId);
return (virtualViewId != INVALID_ID);
case MotionEvent.ACTION_HOVER_EXIT:
- if (mFocusedVirtualViewId != INVALID_ID) {
+ if (mHoveredVirtualViewId != INVALID_ID) {
updateHoveredVirtualView(INVALID_ID);
return true;
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index ff8f3c8b7163..e8b4b7dc2655 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -276,6 +276,10 @@ public class LockPatternUtils {
return getDevicePolicyManager().getPasswordMinimumLength(null, userId);
}
+ public int getMaximumPasswordLength(int quality) {
+ return getDevicePolicyManager().getPasswordMaximumLength(quality);
+ }
+
/**
* Gets the device policy password mode. If the mode is non-specific, returns
* MODE_PATTERN which allows the user to choose anything.
@@ -1535,7 +1539,7 @@ public class LockPatternUtils {
* @see StrongAuthTracker#isFingerprintAllowedForUser
*/
public boolean isFingerprintAllowedForUser(int userId) {
- return (getStrongAuthForUser(userId) & ~StrongAuthTracker.ALLOWING_FINGERPRINT) == 0;
+ return (getStrongAuthForUser(userId) & ~StrongAuthTracker.ALLOWING_BIOMETRIC) == 0;
}
public boolean isUserInLockdown(int userId) {
@@ -1740,11 +1744,10 @@ public class LockPatternUtils {
public static final int STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN = 0x20;
/**
- * Strong auth flags that do not prevent fingerprint from being accepted as auth.
- *
- * If any other flags are set, fingerprint is disabled.
+ * Strong auth flags that do not prevent biometric methods from being accepted as auth.
+ * If any other flags are set, biometric authentication is disabled.
*/
- private static final int ALLOWING_FINGERPRINT = STRONG_AUTH_NOT_REQUIRED
+ private static final int ALLOWING_BIOMETRIC = STRONG_AUTH_NOT_REQUIRED
| SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
private final SparseIntArray mStrongAuthRequiredForUser = new SparseIntArray();
@@ -1791,11 +1794,11 @@ public class LockPatternUtils {
}
/**
- * @return true if unlocking with fingerprint alone is allowed for {@param userId} by the
- * current strong authentication requirements.
+ * @return true if unlocking with a biometric method alone is allowed for {@param userId}
+ * by the current strong authentication requirements.
*/
- public boolean isFingerprintAllowedForUser(int userId) {
- return (getStrongAuthForUser(userId) & ~ALLOWING_FINGERPRINT) == 0;
+ public boolean isBiometricAllowedForUser(int userId) {
+ return (getStrongAuthForUser(userId) & ~ALLOWING_BIOMETRIC) == 0;
}
/**
diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java
index e8fc5989354a..9263b579ee02 100644
--- a/core/java/com/android/internal/widget/LockPatternView.java
+++ b/core/java/com/android/internal/widget/LockPatternView.java
@@ -613,7 +613,7 @@ public class LockPatternView extends View {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
mPatternDrawLookup[i][j] = false;
- mLineFadeStart[i+j] = 0;
+ mLineFadeStart[i+j*3] = 0;
}
}
}
diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java
index 0fd610908fd5..0f2e9c52add0 100644
--- a/core/java/com/android/internal/widget/MessagingLayout.java
+++ b/core/java/com/android/internal/widget/MessagingLayout.java
@@ -45,7 +45,7 @@ import android.widget.TextView;
import com.android.internal.R;
import com.android.internal.graphics.ColorUtils;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import java.util.ArrayList;
import java.util.List;
@@ -60,6 +60,13 @@ import java.util.regex.Pattern;
public class MessagingLayout extends FrameLayout {
private static final float COLOR_SHIFT_AMOUNT = 60;
+ /**
+ * Pattren for filter some ingonable characters.
+ * p{Z} for any kind of whitespace or invisible separator.
+ * p{C} for any kind of punctuation character.
+ */
+ private static final Pattern IGNORABLE_CHAR_PATTERN
+ = Pattern.compile("[\\p{C}\\p{Z}]");
private static final Pattern SPECIAL_CHAR_PATTERN
= Pattern.compile ("[!@#$%&*()_+=|<>?{}\\[\\]~-]");
private static final Consumer<MessagingMessage> REMOVE_MESSAGE
@@ -233,7 +240,10 @@ public class MessagingLayout extends FrameLayout {
continue;
}
if (!uniqueNames.containsKey(senderName)) {
- char c = senderName.charAt(0);
+ // Only use visible characters to get uniqueNames
+ String pureSenderName = IGNORABLE_CHAR_PATTERN
+ .matcher(senderName).replaceAll("" /* replacement */);
+ char c = pureSenderName.charAt(0);
if (uniqueCharacters.containsKey(c)) {
// this character was already used, lets make it more unique. We first need to
// resolve the existing character if it exists
@@ -245,7 +255,7 @@ public class MessagingLayout extends FrameLayout {
uniqueNames.put(senderName, findNameSplit((String) senderName));
} else {
uniqueNames.put(senderName, Character.toString(c));
- uniqueCharacters.put(c, senderName);
+ uniqueCharacters.put(c, pureSenderName);
}
}
}
@@ -315,13 +325,13 @@ public class MessagingLayout extends FrameLayout {
}
private int findColor(CharSequence senderName, int layoutColor) {
- double luminance = NotificationColorUtil.calculateLuminance(layoutColor);
+ double luminance = ContrastColorUtil.calculateLuminance(layoutColor);
float shift = Math.abs(senderName.hashCode()) % 5 / 4.0f - 0.5f;
// we need to offset the range if the luminance is too close to the borders
shift += Math.max(COLOR_SHIFT_AMOUNT / 2.0f / 100 - luminance, 0);
shift -= Math.max(COLOR_SHIFT_AMOUNT / 2.0f / 100 - (1.0f - luminance), 0);
- return NotificationColorUtil.getShiftedColor(layoutColor,
+ return ContrastColorUtil.getShiftedColor(layoutColor,
(int) (shift * COLOR_SHIFT_AMOUNT));
}
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
index 5847033feb1e..4ee951aeddaf 100644
--- a/core/java/com/android/internal/widget/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -32,6 +32,7 @@ import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
+import android.view.WindowInsets;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
import android.view.MotionEvent.PointerCoords;
@@ -120,6 +121,7 @@ public class PointerLocationView extends View implements InputDeviceListener,
private final Paint mPathPaint;
private final FontMetricsInt mTextMetrics = new FontMetricsInt();
private int mHeaderBottom;
+ private int mHeaderPaddingTop = 0;
private boolean mCurDown;
private int mCurNumPointers;
private int mMaxNumPointers;
@@ -189,12 +191,22 @@ public class PointerLocationView extends View implements InputDeviceListener,
public void setPrintCoords(boolean state) {
mPrintCoords = state;
}
-
+
+ @Override
+ public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+ if (insets.getDisplayCutout() != null) {
+ mHeaderPaddingTop = insets.getDisplayCutout().getSafeInsetTop();
+ } else {
+ mHeaderPaddingTop = 0;
+ }
+ return super.onApplyWindowInsets(insets);
+ }
+
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mTextPaint.getFontMetricsInt(mTextMetrics);
- mHeaderBottom = -mTextMetrics.ascent+mTextMetrics.descent+2;
+ mHeaderBottom = mHeaderPaddingTop-mTextMetrics.ascent+mTextMetrics.descent+2;
if (false) {
Log.i("foo", "Metrics: ascent=" + mTextMetrics.ascent
+ " descent=" + mTextMetrics.descent
@@ -223,7 +235,7 @@ public class PointerLocationView extends View implements InputDeviceListener,
protected void onDraw(Canvas canvas) {
final int w = getWidth();
final int itemW = w/7;
- final int base = -mTextMetrics.ascent+1;
+ final int base = mHeaderPaddingTop-mTextMetrics.ascent+1;
final int bottom = mHeaderBottom;
final int NP = mPointers.size();
@@ -232,7 +244,7 @@ public class PointerLocationView extends View implements InputDeviceListener,
if (mActivePointerId >= 0) {
final PointerState ps = mPointers.get(mActivePointerId);
- canvas.drawRect(0, 0, itemW-1, bottom,mTextBackgroundPaint);
+ canvas.drawRect(0, mHeaderPaddingTop, itemW-1, bottom,mTextBackgroundPaint);
canvas.drawText(mText.clear()
.append("P: ").append(mCurNumPointers)
.append(" / ").append(mMaxNumPointers)
@@ -240,24 +252,26 @@ public class PointerLocationView extends View implements InputDeviceListener,
final int N = ps.mTraceCount;
if ((mCurDown && ps.mCurDown) || N == 0) {
- canvas.drawRect(itemW, 0, (itemW * 2) - 1, bottom, mTextBackgroundPaint);
+ canvas.drawRect(itemW, mHeaderPaddingTop, (itemW * 2) - 1, bottom,
+ mTextBackgroundPaint);
canvas.drawText(mText.clear()
.append("X: ").append(ps.mCoords.x, 1)
.toString(), 1 + itemW, base, mTextPaint);
- canvas.drawRect(itemW * 2, 0, (itemW * 3) - 1, bottom, mTextBackgroundPaint);
+ canvas.drawRect(itemW * 2, mHeaderPaddingTop, (itemW * 3) - 1, bottom,
+ mTextBackgroundPaint);
canvas.drawText(mText.clear()
.append("Y: ").append(ps.mCoords.y, 1)
.toString(), 1 + itemW * 2, base, mTextPaint);
} else {
float dx = ps.mTraceX[N - 1] - ps.mTraceX[0];
float dy = ps.mTraceY[N - 1] - ps.mTraceY[0];
- canvas.drawRect(itemW, 0, (itemW * 2) - 1, bottom,
+ canvas.drawRect(itemW, mHeaderPaddingTop, (itemW * 2) - 1, bottom,
Math.abs(dx) < mVC.getScaledTouchSlop()
? mTextBackgroundPaint : mTextLevelPaint);
canvas.drawText(mText.clear()
.append("dX: ").append(dx, 1)
.toString(), 1 + itemW, base, mTextPaint);
- canvas.drawRect(itemW * 2, 0, (itemW * 3) - 1, bottom,
+ canvas.drawRect(itemW * 2, mHeaderPaddingTop, (itemW * 3) - 1, bottom,
Math.abs(dy) < mVC.getScaledTouchSlop()
? mTextBackgroundPaint : mTextLevelPaint);
canvas.drawText(mText.clear()
@@ -265,26 +279,29 @@ public class PointerLocationView extends View implements InputDeviceListener,
.toString(), 1 + itemW * 2, base, mTextPaint);
}
- canvas.drawRect(itemW * 3, 0, (itemW * 4) - 1, bottom, mTextBackgroundPaint);
+ canvas.drawRect(itemW * 3, mHeaderPaddingTop, (itemW * 4) - 1, bottom,
+ mTextBackgroundPaint);
canvas.drawText(mText.clear()
.append("Xv: ").append(ps.mXVelocity, 3)
.toString(), 1 + itemW * 3, base, mTextPaint);
- canvas.drawRect(itemW * 4, 0, (itemW * 5) - 1, bottom, mTextBackgroundPaint);
+ canvas.drawRect(itemW * 4, mHeaderPaddingTop, (itemW * 5) - 1, bottom,
+ mTextBackgroundPaint);
canvas.drawText(mText.clear()
.append("Yv: ").append(ps.mYVelocity, 3)
.toString(), 1 + itemW * 4, base, mTextPaint);
- canvas.drawRect(itemW * 5, 0, (itemW * 6) - 1, bottom, mTextBackgroundPaint);
- canvas.drawRect(itemW * 5, 0, (itemW * 5) + (ps.mCoords.pressure * itemW) - 1,
- bottom, mTextLevelPaint);
+ canvas.drawRect(itemW * 5, mHeaderPaddingTop, (itemW * 6) - 1, bottom,
+ mTextBackgroundPaint);
+ canvas.drawRect(itemW * 5, mHeaderPaddingTop,
+ (itemW * 5) + (ps.mCoords.pressure * itemW) - 1, bottom, mTextLevelPaint);
canvas.drawText(mText.clear()
.append("Prs: ").append(ps.mCoords.pressure, 2)
.toString(), 1 + itemW * 5, base, mTextPaint);
- canvas.drawRect(itemW * 6, 0, w, bottom, mTextBackgroundPaint);
- canvas.drawRect(itemW * 6, 0, (itemW * 6) + (ps.mCoords.size * itemW) - 1,
- bottom, mTextLevelPaint);
+ canvas.drawRect(itemW * 6, mHeaderPaddingTop, w, bottom, mTextBackgroundPaint);
+ canvas.drawRect(itemW * 6, mHeaderPaddingTop,
+ (itemW * 6) + (ps.mCoords.size * itemW) - 1, bottom, mTextLevelPaint);
canvas.drawText(mText.clear()
.append("Size: ").append(ps.mCoords.size, 2)
.toString(), 1 + itemW * 6, base, mTextPaint);
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 32f560ff9050..4029b872ab93 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -127,7 +127,6 @@ cc_library_shared {
"android/graphics/Camera.cpp",
"android/graphics/CanvasProperty.cpp",
"android/graphics/ColorFilter.cpp",
- "android/graphics/DrawFilter.cpp",
"android/graphics/FontFamily.cpp",
"android/graphics/FontUtils.cpp",
"android/graphics/CreateJavaOutputStreamAdaptor.cpp",
@@ -144,6 +143,7 @@ cc_library_shared {
"android/graphics/NinePatch.cpp",
"android/graphics/NinePatchPeeker.cpp",
"android/graphics/Paint.cpp",
+ "android/graphics/PaintFilter.cpp",
"android/graphics/Path.cpp",
"android/graphics/PathMeasure.cpp",
"android/graphics/PathEffect.cpp",
@@ -166,6 +166,7 @@ cc_library_shared {
"android_media_JetPlayer.cpp",
"android_media_MediaMetricsJNI.cpp",
"android_media_MicrophoneInfo.cpp",
+ "android_media_midi.cpp",
"android_media_RemoteDisplay.cpp",
"android_media_ToneGenerator.cpp",
"android_hardware_Camera.cpp",
@@ -221,7 +222,6 @@ cc_library_shared {
"external/skia/src/image",
"external/skia/src/images",
"frameworks/base/media/jni",
- "libcore/include",
"system/media/camera/include",
"system/media/private/camera/include",
],
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index f9ca15c13d11..29bee21418b6 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -20,6 +20,7 @@
#include <android_runtime/AndroidRuntime.h>
+#include <android-base/macros.h>
#include <android-base/properties.h>
#include <binder/IBinder.h>
#include <binder/IPCThreadState.h>
@@ -107,6 +108,7 @@ extern int register_android_media_AudioTrack(JNIEnv *env);
extern int register_android_media_MicrophoneInfo(JNIEnv *env);
extern int register_android_media_JetPlayer(JNIEnv *env);
extern int register_android_media_ToneGenerator(JNIEnv *env);
+extern int register_android_media_midi(JNIEnv *env);
namespace android {
extern int register_android_util_SeempLog(JNIEnv* env);
@@ -599,7 +601,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
{
JavaVMInitArgs initArgs;
char propBuf[PROPERTY_VALUE_MAX];
- char stackTraceFileBuf[sizeof("-Xstacktracefile:")-1 + PROPERTY_VALUE_MAX];
char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX];
char heapstartsizeOptsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];
char heapsizeOptsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
@@ -607,6 +608,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
char heapminfreeOptsBuf[sizeof("-XX:HeapMinFree=")-1 + PROPERTY_VALUE_MAX];
char heapmaxfreeOptsBuf[sizeof("-XX:HeapMaxFree=")-1 + PROPERTY_VALUE_MAX];
char usejitOptsBuf[sizeof("-Xusejit:")-1 + PROPERTY_VALUE_MAX];
+ char jitpthreadpriorityOptsBuf[sizeof("-Xjitpthreadpriority:")-1 + PROPERTY_VALUE_MAX];
char jitmaxsizeOptsBuf[sizeof("-Xjitmaxsize:")-1 + PROPERTY_VALUE_MAX];
char jitinitialsizeOptsBuf[sizeof("-Xjitinitialsize:")-1 + PROPERTY_VALUE_MAX];
char jitthresholdOptsBuf[sizeof("-Xjitthreshold:")-1 + PROPERTY_VALUE_MAX];
@@ -681,16 +683,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
executionMode = kEMJitCompiler;
}
- // If dalvik.vm.stack-trace-dir is set, it enables the "new" stack trace
- // dump scheme and a new file is created for each stack dump. If it isn't set,
- // the old scheme is enabled.
- property_get("dalvik.vm.stack-trace-dir", propBuf, "");
- if (strlen(propBuf) > 0) {
- addOption("-Xusetombstonedtraces");
- } else {
- parseRuntimeOption("dalvik.vm.stack-trace-file", stackTraceFileBuf, "-Xstacktracefile:");
- }
-
strcpy(jniOptsBuf, "-Xjniopts:");
if (parseRuntimeOption("dalvik.vm.jniopts", jniOptsBuf, "-Xjniopts:")) {
ALOGI("JNI options: '%s'\n", jniOptsBuf);
@@ -736,6 +728,9 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
parseRuntimeOption("dalvik.vm.jitmaxsize", jitmaxsizeOptsBuf, "-Xjitmaxsize:");
parseRuntimeOption("dalvik.vm.jitinitialsize", jitinitialsizeOptsBuf, "-Xjitinitialsize:");
parseRuntimeOption("dalvik.vm.jitthreshold", jitthresholdOptsBuf, "-Xjitthreshold:");
+ parseRuntimeOption("dalvik.vm.jitpthreadpriority",
+ jitpthreadpriorityOptsBuf,
+ "-Xjitpthreadpriority:");
property_get("dalvik.vm.usejitprofiles", useJitProfilesOptsBuf, "");
if (strcmp(useJitProfilesOptsBuf, "true") == 0) {
addOption("-Xjitsaveprofilinginfo");
@@ -833,12 +828,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
addOption("-Ximage-compiler-option");
addOption("--image-classes=/system/etc/preloaded-classes");
- // If there is a compiled-classes file, push it.
- if (hasFile("/system/etc/compiled-classes")) {
- addOption("-Ximage-compiler-option");
- addOption("--compiled-classes=/system/etc/compiled-classes");
- }
-
// If there is a dirty-image-objects file, push it.
if (hasFile("/system/etc/dirty-image-objects")) {
addOption("-Ximage-compiler-option");
@@ -875,34 +864,18 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
// The runtime will compile a boot image, when necessary, not using installd. Thus, we need to
// pass the instruction-set-features/variant as an image-compiler-option.
- // TODO: Find a better way for the instruction-set.
-#if defined(__arm__)
- constexpr const char* instruction_set = "arm";
-#elif defined(__aarch64__)
- constexpr const char* instruction_set = "arm64";
-#elif defined(__mips__) && !defined(__LP64__)
- constexpr const char* instruction_set = "mips";
-#elif defined(__mips__) && defined(__LP64__)
- constexpr const char* instruction_set = "mips64";
-#elif defined(__i386__)
- constexpr const char* instruction_set = "x86";
-#elif defined(__x86_64__)
- constexpr const char* instruction_set = "x86_64";
-#else
- constexpr const char* instruction_set = "unknown";
-#endif
// Note: it is OK to reuse the buffer, as the values are exactly the same between
// * compiler-option, used for runtime compilation (DexClassLoader)
// * image-compiler-option, used for boot-image compilation on device
// Copy the variant.
- sprintf(dex2oat_isa_variant_key, "dalvik.vm.isa.%s.variant", instruction_set);
+ sprintf(dex2oat_isa_variant_key, "dalvik.vm.isa.%s.variant", ABI_STRING);
parseCompilerOption(dex2oat_isa_variant_key, dex2oat_isa_variant,
"--instruction-set-variant=", "-Ximage-compiler-option");
parseCompilerOption(dex2oat_isa_variant_key, dex2oat_isa_variant,
"--instruction-set-variant=", "-Xcompiler-option");
// Copy the features.
- sprintf(dex2oat_isa_features_key, "dalvik.vm.isa.%s.features", instruction_set);
+ sprintf(dex2oat_isa_features_key, "dalvik.vm.isa.%s.features", ABI_STRING);
parseCompilerOption(dex2oat_isa_features_key, dex2oat_isa_features,
"--instruction-set-features=", "-Ximage-compiler-option");
parseCompilerOption(dex2oat_isa_features_key, dex2oat_isa_features,
@@ -944,10 +917,13 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
}
// Native bridge library. "0" means that native bridge is disabled.
+ //
+ // Note: bridging is only enabled for the zygote. Other runs of
+ // app_process may not have the permissions to mount etc.
property_get("ro.dalvik.vm.native.bridge", propBuf, "");
if (propBuf[0] == '\0') {
ALOGW("ro.dalvik.vm.native.bridge is not expected to be empty");
- } else if (strcmp(propBuf, "0") != 0) {
+ } else if (zygote && strcmp(propBuf, "0") != 0) {
snprintf(nativeBridgeLibrary, sizeof("-XX:NativeBridge=") + PROPERTY_VALUE_MAX,
"-XX:NativeBridge=%s", propBuf);
addOption(nativeBridgeLibrary);
@@ -1476,6 +1452,7 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_media_MicrophoneInfo),
REG_JNI(register_android_media_RemoteDisplay),
REG_JNI(register_android_media_ToneGenerator),
+ REG_JNI(register_android_media_midi),
REG_JNI(register_android_opengl_classes),
REG_JNI(register_android_server_NetworkManagementSocketTagger),
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 5a74a2473b32..e5aea9730b51 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -62,7 +62,7 @@ public:
}
bool valid() {
- return mBitmap;
+ return mBitmap != nullptr;
}
Bitmap& bitmap() {
@@ -205,9 +205,12 @@ jobject createBitmap(JNIEnv* env, Bitmap* bitmap,
// native SkBitmap stays in sync with the Java Bitmap.
assert_premultiplied(bitmap->info(), isPremultiplied);
BitmapWrapper* bitmapWrapper = new BitmapWrapper(bitmap);
+ if (!isMutable) {
+ bitmapWrapper->bitmap().setImmutable();
+ }
jobject obj = env->NewObject(gBitmap_class, gBitmap_constructorMethodID,
reinterpret_cast<jlong>(bitmapWrapper), bitmap->width(), bitmap->height(), density,
- isMutable, isPremultiplied, ninePatchChunk, ninePatchInsets);
+ isPremultiplied, ninePatchChunk, ninePatchInsets);
if (env->ExceptionCheck() != 0) {
ALOGE("*** Uncaught exception returned from Java call!\n");
@@ -848,10 +851,9 @@ static jlong Bitmap_getNativeFinalizer(JNIEnv*, jobject) {
return static_cast<jlong>(reinterpret_cast<uintptr_t>(&Bitmap_destruct));
}
-static jboolean Bitmap_recycle(JNIEnv* env, jobject, jlong bitmapHandle) {
+static void Bitmap_recycle(JNIEnv* env, jobject, jlong bitmapHandle) {
LocalScopedBitmap bitmap(bitmapHandle);
bitmap->freePixels();
- return JNI_TRUE;
}
static void Bitmap_reconfigure(JNIEnv* env, jobject clazz, jlong bitmapHandle,
@@ -1571,6 +1573,20 @@ static void Bitmap_copyColorSpace(JNIEnv* env, jobject, jlong srcBitmapPtr, jlon
dstBitmapHandle->bitmap().setColorSpace(srcBitmapHandle->bitmap().info().refColorSpace());
}
+static jboolean Bitmap_isImmutable(jlong bitmapHandle) {
+ LocalScopedBitmap bitmapHolder(bitmapHandle);
+ if (!bitmapHolder.valid()) return JNI_FALSE;
+
+ return bitmapHolder->bitmap().isImmutable() ? JNI_TRUE : JNI_FALSE;
+}
+
+static void Bitmap_setImmutable(JNIEnv* env, jobject, jlong bitmapHandle) {
+ LocalScopedBitmap bitmapHolder(bitmapHandle);
+ if (!bitmapHolder.valid()) return;
+
+ return bitmapHolder->bitmap().setImmutable();
+}
+
///////////////////////////////////////////////////////////////////////////////
static const JNINativeMethod gBitmapMethods[] = {
@@ -1583,7 +1599,7 @@ static const JNINativeMethod gBitmapMethods[] = {
{ "nativeCopyAshmemConfig", "(JI)Landroid/graphics/Bitmap;",
(void*)Bitmap_copyAshmemConfig },
{ "nativeGetNativeFinalizer", "()J", (void*)Bitmap_getNativeFinalizer },
- { "nativeRecycle", "(J)Z", (void*)Bitmap_recycle },
+ { "nativeRecycle", "(J)V", (void*)Bitmap_recycle },
{ "nativeReconfigure", "(JIIIZ)V", (void*)Bitmap_reconfigure },
{ "nativeCompress", "(JIILjava/io/OutputStream;[B)Z",
(void*)Bitmap_compress },
@@ -1626,13 +1642,18 @@ static const JNINativeMethod gBitmapMethods[] = {
{ "nativeIsSRGBLinear", "(J)Z", (void*)Bitmap_isSRGBLinear},
{ "nativeCopyColorSpace", "(JJ)V",
(void*)Bitmap_copyColorSpace },
+ { "nativeSetImmutable", "(J)V", (void*)Bitmap_setImmutable},
+
+ // ------------ @CriticalNative ----------------
+ { "nativeIsImmutable", "(J)Z", (void*)Bitmap_isImmutable}
+
};
int register_android_graphics_Bitmap(JNIEnv* env)
{
gBitmap_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Bitmap"));
gBitmap_nativePtr = GetFieldIDOrDie(env, gBitmap_class, "mNativePtr", "J");
- gBitmap_constructorMethodID = GetMethodIDOrDie(env, gBitmap_class, "<init>", "(JIIIZZ[BLandroid/graphics/NinePatch$InsetStruct;)V");
+ gBitmap_constructorMethodID = GetMethodIDOrDie(env, gBitmap_class, "<init>", "(JIIIZ[BLandroid/graphics/NinePatch$InsetStruct;)V");
gBitmap_reinitMethodID = GetMethodIDOrDie(env, gBitmap_class, "reinit", "(IIZ)V");
gBitmap_getAllocationByteCountMethodID = GetMethodIDOrDie(env, gBitmap_class, "getAllocationByteCount", "()I");
return android::RegisterMethodsOrDie(env, "android/graphics/Bitmap", gBitmapMethods,
diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp
index c7ad2a47c367..fb571dfea3a2 100644
--- a/core/jni/android/graphics/FontFamily.cpp
+++ b/core/jni/android/graphics/FontFamily.cpp
@@ -44,9 +44,9 @@ namespace android {
struct NativeFamilyBuilder {
NativeFamilyBuilder(uint32_t langId, int variant)
- : langId(langId), variant(static_cast<minikin::FontFamily::Variant>(variant)) {}
+ : langId(langId), variant(static_cast<minikin::FamilyVariant>(variant)) {}
uint32_t langId;
- minikin::FontFamily::Variant variant;
+ minikin::FamilyVariant variant;
std::vector<minikin::Font> fonts;
std::vector<minikin::FontVariation> axes;
};
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 90cc7bb72bfa..5d65aee5db2a 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -15,9 +15,6 @@
#include <cutils/ashmem.h>
#include <hwui/Canvas.h>
-#include <Caches.h>
-#include <TextureCache.h>
-
using namespace android;
void doThrowNPE(JNIEnv* env) {
@@ -358,11 +355,6 @@ void GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap, SkBitmap* outBitmap)
bitmap::toBitmap(env, bitmap).getSkBitmap(outBitmap);
}
-SkPixelRef* GraphicsJNI::refSkPixelRef(JNIEnv* env, jobject jbitmap) {
- android::Bitmap& bitmap = android::bitmap::toBitmap(env, jbitmap);
- bitmap.ref();
- return &bitmap;
-}
SkColorType GraphicsJNI::getNativeBitmapColorType(JNIEnv* env, jobject jconfig) {
ALOG_ASSERT(env);
if (NULL == jconfig) {
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index dcb81fa623f4..7825f1d7708b 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -63,7 +63,6 @@ public:
static android::Canvas* getNativeCanvas(JNIEnv*, jobject canvas);
static void getSkBitmap(JNIEnv*, jobject bitmap, SkBitmap* outBitmap);
- static SkPixelRef* refSkPixelRef(JNIEnv*, jobject bitmap);
static SkRegion* getNativeRegion(JNIEnv*, jobject region);
/*
diff --git a/core/jni/android/graphics/MaskFilter.cpp b/core/jni/android/graphics/MaskFilter.cpp
index 3e3de5aade7f..33d346f5d379 100644
--- a/core/jni/android/graphics/MaskFilter.cpp
+++ b/core/jni/android/graphics/MaskFilter.cpp
@@ -23,7 +23,7 @@ public:
static jlong createBlur(JNIEnv* env, jobject, jfloat radius, jint blurStyle) {
SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(radius);
- SkMaskFilter* filter = SkBlurMaskFilter::Make((SkBlurStyle)blurStyle, sigma).release();
+ SkMaskFilter* filter = SkMaskFilter::MakeBlur((SkBlurStyle)blurStyle, sigma).release();
ThrowIAE_IfNull(env, filter);
return reinterpret_cast<jlong>(filter);
}
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index bd14d45325a7..d391de75aa9a 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -44,6 +44,7 @@
#include <minikin/GraphemeBreak.h>
#include <minikin/LocaleList.h>
#include <minikin/Measurement.h>
+#include <minikin/MinikinPaint.h>
#include <unicode/utf16.h>
#include <cassert>
@@ -93,7 +94,6 @@ namespace PaintGlue {
static_assert(1 << 5 == SkPaint::kFakeBoldText_Flag, "paint_flags_mismatch");
static_assert(1 << 6 == SkPaint::kLinearText_Flag, "paint_flags_mismatch");
static_assert(1 << 7 == SkPaint::kSubpixelText_Flag, "paint_flags_mismatch");
- static_assert(1 << 8 == SkPaint::kDevKernText_Flag, "paint_flags_mismatch");
static_assert(1 << 10 == SkPaint::kEmbeddedBitmapText_Flag, "paint_flags_mismatch");
Paint* obj = new Paint();
@@ -308,7 +308,10 @@ namespace PaintGlue {
static void getTextPath(JNIEnv* env, Paint* paint, const Typeface* typeface, const jchar* text,
jint count, jint bidiFlags, jfloat x, jfloat y, SkPath* path) {
minikin::Layout layout = MinikinUtils::doLayout(
- paint, static_cast<minikin::Bidi>(bidiFlags), typeface, text, 0, count, count,
+ paint, static_cast<minikin::Bidi>(bidiFlags), typeface,
+ text, count, // text buffer
+ 0, count, // draw range
+ 0, count, // context range
nullptr);
size_t nGlyphs = layout.nGlyphs();
uint16_t* glyphs = new uint16_t[nGlyphs];
@@ -351,7 +354,11 @@ namespace PaintGlue {
SkIRect ir;
minikin::Layout layout = MinikinUtils::doLayout(&paint,
- static_cast<minikin::Bidi>(bidiFlags), typeface, text, 0, count, count, nullptr);
+ static_cast<minikin::Bidi>(bidiFlags), typeface,
+ text, count, // text buffer
+ 0, count, // draw range
+ 0, count, // context range
+ nullptr);
minikin::MinikinRect rect;
layout.getBounds(&rect);
r.fLeft = rect.mLeft;
@@ -466,8 +473,11 @@ namespace PaintGlue {
prevCp = cp;
}
minikin::Layout layout = MinikinUtils::doLayout(paint,
- static_cast<minikin::Bidi>(bidiFlags), typeface, str.get(), 0, str.size(),
- str.size(), nullptr);
+ static_cast<minikin::Bidi>(bidiFlags), typeface,
+ str.get(), str.size(), // text buffer
+ 0, str.size(), // draw range
+ 0, str.size(), // context range
+ nullptr);
size_t nGlyphs = countNonSpaceGlyphs(layout);
if (nGlyphs != 1 && nChars > 1) {
// multiple-character input, and was not a ligature
@@ -487,7 +497,10 @@ namespace PaintGlue {
// U+1F1FF (REGIONAL INDICATOR SYMBOL LETTER Z) is \uD83C\uDDFF in UTF16.
static const jchar ZZ_FLAG_STR[] = { 0xD83C, 0xDDFF, 0xD83C, 0xDDFF };
minikin::Layout zzLayout = MinikinUtils::doLayout(paint,
- static_cast<minikin::Bidi>(bidiFlags), typeface, ZZ_FLAG_STR, 0, 4, 4,
+ static_cast<minikin::Bidi>(bidiFlags), typeface,
+ ZZ_FLAG_STR, 4, // text buffer
+ 0, 4, // draw range
+ 0, 4, // context range
nullptr);
if (zzLayout.nGlyphs() != 1 || layoutContainsNotdef(zzLayout)) {
// The font collection doesn't have a glyph for unknown flag. Just return true.
@@ -582,7 +595,7 @@ namespace PaintGlue {
// restore the original settings.
paint->setTextSkewX(saveSkewX);
paint->setFakeBoldText(savefakeBold);
- if (paint->getFamilyVariant() == minikin::FontFamily::Variant::ELEGANT) {
+ if (paint->getFamilyVariant() == minikin::FamilyVariant::ELEGANT) {
SkScalar size = paint->getTextSize();
metrics->fTop = -size * kElegantTop / 2048;
metrics->fBottom = -size * kElegantBottom / 2048;
@@ -881,13 +894,13 @@ namespace PaintGlue {
static jboolean isElegantTextHeight(jlong paintHandle) {
Paint* obj = reinterpret_cast<Paint*>(paintHandle);
- return obj->getFamilyVariant() == minikin::FontFamily::Variant::ELEGANT;
+ return obj->getFamilyVariant() == minikin::FamilyVariant::ELEGANT;
}
static void setElegantTextHeight(jlong paintHandle, jboolean aa) {
Paint* obj = reinterpret_cast<Paint*>(paintHandle);
obj->setFamilyVariant(
- aa ? minikin::FontFamily::Variant::ELEGANT : minikin::FontFamily::Variant::DEFAULT);
+ aa ? minikin::FamilyVariant::ELEGANT : minikin::FamilyVariant::DEFAULT);
}
static jfloat getTextSize(jlong paintHandle) {
diff --git a/core/jni/android/graphics/DrawFilter.cpp b/core/jni/android/graphics/PaintFilter.cpp
index c1dc0dd025b6..182b22b3c917 100644
--- a/core/jni/android/graphics/DrawFilter.cpp
+++ b/core/jni/android/graphics/PaintFilter.cpp
@@ -15,36 +15,43 @@
** limitations under the License.
*/
-// This file was generated from the C++ include file: SkColorFilter.h
-// Any changes made to this file will be discarded by the build.
-// To change this file, either edit the include, or device/tools/gluemaker/main.cpp,
-// or one of the auxilary file specifications in device/tools/gluemaker.
-
#include "jni.h"
#include "GraphicsJNI.h"
#include <android_runtime/AndroidRuntime.h>
#include "core_jni_helpers.h"
-#include "SkDrawFilter.h"
-#include "SkPaintFlagsDrawFilter.h"
+#include "hwui/PaintFilter.h"
#include "SkPaint.h"
namespace android {
-// Custom version of SkPaintFlagsDrawFilter that also calls setFilterQuality.
-class CompatFlagsDrawFilter : public SkPaintFlagsDrawFilter {
+class PaintFlagsFilter : public PaintFilter {
public:
- CompatFlagsDrawFilter(uint32_t clearFlags, uint32_t setFlags,
- SkFilterQuality desiredQuality)
- : SkPaintFlagsDrawFilter(clearFlags, setFlags)
+ PaintFlagsFilter(uint32_t clearFlags, uint32_t setFlags) {
+ fClearFlags = static_cast<uint16_t>(clearFlags & SkPaint::kAllFlags);
+ fSetFlags = static_cast<uint16_t>(setFlags & SkPaint::kAllFlags);
+ }
+ void filter(SkPaint* paint) override {
+ paint->setFlags((paint->getFlags() & ~fClearFlags) | fSetFlags);
+ }
+
+private:
+ uint16_t fClearFlags;
+ uint16_t fSetFlags;
+};
+
+// Custom version of PaintFlagsDrawFilter that also calls setFilterQuality.
+class CompatPaintFlagsFilter : public PaintFlagsFilter {
+public:
+ CompatPaintFlagsFilter(uint32_t clearFlags, uint32_t setFlags, SkFilterQuality desiredQuality)
+ : PaintFlagsFilter(clearFlags, setFlags)
, fDesiredQuality(desiredQuality) {
}
- virtual bool filter(SkPaint* paint, Type type) {
- SkPaintFlagsDrawFilter::filter(paint, type);
+ virtual void filter(SkPaint* paint) {
+ PaintFlagsFilter::filter(paint);
paint->setFilterQuality(fDesiredQuality);
- return true;
}
private:
@@ -61,16 +68,16 @@ static inline bool hadFiltering(jint& flags) {
return result;
}
-class SkDrawFilterGlue {
+class PaintFilterGlue {
public:
static void finalizer(JNIEnv* env, jobject clazz, jlong objHandle) {
- SkDrawFilter* obj = reinterpret_cast<SkDrawFilter*>(objHandle);
+ PaintFilter* obj = reinterpret_cast<PaintFilter*>(objHandle);
SkSafeUnref(obj);
}
- static jlong CreatePaintFlagsDF(JNIEnv* env, jobject clazz,
- jint clearFlags, jint setFlags) {
+ static jlong CreatePaintFlagsFilter(JNIEnv* env, jobject clazz,
+ jint clearFlags, jint setFlags) {
if (clearFlags | setFlags) {
// Mask both groups of flags to remove FILTER_BITMAP_FLAG, which no
// longer has a Skia equivalent flag (instead it corresponds to
@@ -79,16 +86,16 @@ public:
const bool turnFilteringOn = hadFiltering(setFlags);
const bool turnFilteringOff = hadFiltering(clearFlags);
- SkDrawFilter* filter;
+ PaintFilter* filter;
if (turnFilteringOn) {
// Turning filtering on overrides turning it off.
- filter = new CompatFlagsDrawFilter(clearFlags, setFlags,
+ filter = new CompatPaintFlagsFilter(clearFlags, setFlags,
kLow_SkFilterQuality);
} else if (turnFilteringOff) {
- filter = new CompatFlagsDrawFilter(clearFlags, setFlags,
+ filter = new CompatPaintFlagsFilter(clearFlags, setFlags,
kNone_SkFilterQuality);
} else {
- filter = new SkPaintFlagsDrawFilter(clearFlags, setFlags);
+ filter = new PaintFlagsFilter(clearFlags, setFlags);
}
return reinterpret_cast<jlong>(filter);
} else {
@@ -98,11 +105,11 @@ public:
};
static const JNINativeMethod drawfilter_methods[] = {
- {"nativeDestructor", "(J)V", (void*) SkDrawFilterGlue::finalizer}
+ {"nativeDestructor", "(J)V", (void*) PaintFilterGlue::finalizer}
};
static const JNINativeMethod paintflags_methods[] = {
- {"nativeConstructor","(II)J", (void*) SkDrawFilterGlue::CreatePaintFlagsDF}
+ {"nativeConstructor","(II)J", (void*) PaintFilterGlue::CreatePaintFlagsFilter}
};
int register_android_graphics_DrawFilter(JNIEnv* env) {
@@ -110,7 +117,7 @@ int register_android_graphics_DrawFilter(JNIEnv* env) {
NELEM(drawfilter_methods));
result |= RegisterMethodsOrDie(env, "android/graphics/PaintFlagsDrawFilter", paintflags_methods,
NELEM(paintflags_methods));
-
+
return 0;
}
diff --git a/core/jni/android/graphics/Path.cpp b/core/jni/android/graphics/Path.cpp
index 97abd82eaac5..aedb6acb2c04 100644
--- a/core/jni/android/graphics/Path.cpp
+++ b/core/jni/android/graphics/Path.cpp
@@ -28,7 +28,6 @@
#include "SkPathOps.h"
#include "SkGeometry.h" // WARNING: Internal Skia Header
-#include <Caches.h>
#include <vector>
#include <map>
@@ -38,10 +37,6 @@ class SkPathGlue {
public:
static void finalizer(SkPath* obj) {
- // Purge entries from the HWUI path cache if this path's data is unique
- if (obj->unique() && android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().pathCache.removeDeferred(obj);
- }
delete obj;
}
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index 7f90d8ee3e4e..3b024b442060 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -22,11 +22,13 @@
#include <androidfw/ResourceTypes.h>
#include <hwui/Canvas.h>
#include <hwui/Paint.h>
+#include <hwui/PaintFilter.h>
#include <hwui/Typeface.h>
#include <minikin/Layout.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
+#include <nativehelper/ScopedStringChars.h>
#include "Bitmap.h"
-#include "SkDrawFilter.h"
#include "SkGraphics.h"
#include "SkRegion.h"
#include "SkVertices.h"
@@ -487,56 +489,66 @@ static void drawBitmapMesh(JNIEnv* env, jobject, jlong canvasHandle, jobject jbi
colorA.ptr() + colorIndex, paint);
}
-static void drawTextChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray text,
+static void drawTextChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray charArray,
jint index, jint count, jfloat x, jfloat y, jint bidiFlags,
jlong paintHandle) {
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
const Typeface* typeface = paint->getAndroidTypeface();
- jchar* jchars = env->GetCharArrayElements(text, NULL);
- get_canvas(canvasHandle)->drawText(jchars + index, 0, count, count, x, y,
- static_cast<minikin::Bidi>(bidiFlags), *paint, typeface, nullptr);
- env->ReleaseCharArrayElements(text, jchars, JNI_ABORT);
+ ScopedCharArrayRO text(env, charArray);
+ get_canvas(canvasHandle)->drawText(
+ text.get(), text.size(), // text buffer
+ index, count, // draw range
+ 0, text.size(), // context range
+ x, y, // draw position
+ static_cast<minikin::Bidi>(bidiFlags), *paint, typeface, nullptr /* measured text */);
}
-static void drawTextString(JNIEnv* env, jobject, jlong canvasHandle, jstring text,
+static void drawTextString(JNIEnv* env, jobject, jlong canvasHandle, jstring strObj,
jint start, jint end, jfloat x, jfloat y, jint bidiFlags,
jlong paintHandle) {
+ ScopedStringChars text(env, strObj);
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
const Typeface* typeface = paint->getAndroidTypeface();
- const int count = end - start;
- const jchar* jchars = env->GetStringChars(text, NULL);
- get_canvas(canvasHandle)->drawText(jchars + start, 0, count, count, x, y,
- static_cast<minikin::Bidi>(bidiFlags), *paint, typeface, nullptr);
- env->ReleaseStringChars(text, jchars);
-}
+ get_canvas(canvasHandle)->drawText(
+ text.get(), text.size(), // text buffer
+ start, end - start, // draw range
+ 0, text.size(), // context range
+ x, y, // draw position
+ static_cast<minikin::Bidi>(bidiFlags), *paint, typeface, nullptr /* measured text */);
+}
+
+static void drawTextRunChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray charArray,
+ jint index, jint count, jint contextIndex, jint contextCount,
+ jfloat x, jfloat y, jboolean isRtl, jlong paintHandle,
+ jlong mtHandle) {
+ minikin::MeasuredText* mt = reinterpret_cast<minikin::MeasuredText*>(mtHandle);
+ const minikin::Bidi bidiFlags = isRtl ? minikin::Bidi::FORCE_RTL : minikin::Bidi::FORCE_LTR;
-static void drawTextRunChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray text, jint index,
- jint count, jint contextIndex, jint contextCount, jfloat x, jfloat y,
- jboolean isRtl, jlong paintHandle, jlong mtHandle) {
+ ScopedCharArrayRO text(env, charArray);
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
- minikin::MeasuredText* mt = reinterpret_cast<minikin::MeasuredText*>(mtHandle);
const Typeface* typeface = paint->getAndroidTypeface();
-
- const minikin::Bidi bidiFlags = isRtl ? minikin::Bidi::FORCE_RTL : minikin::Bidi::FORCE_LTR;
- jchar* jchars = env->GetCharArrayElements(text, NULL);
- get_canvas(canvasHandle)->drawText(jchars + contextIndex, index - contextIndex, count,
- contextCount, x, y, bidiFlags, *paint, typeface, mt);
- env->ReleaseCharArrayElements(text, jchars, JNI_ABORT);
+ get_canvas(canvasHandle)->drawText(
+ text.get(), text.size(), // text buffer
+ index, count, // draw range
+ contextIndex, contextCount, // context range,
+ x, y, // draw position
+ bidiFlags, *paint, typeface, mt);
}
-static void drawTextRunString(JNIEnv* env, jobject obj, jlong canvasHandle, jstring text,
+static void drawTextRunString(JNIEnv* env, jobject obj, jlong canvasHandle, jstring strObj,
jint start, jint end, jint contextStart, jint contextEnd,
jfloat x, jfloat y, jboolean isRtl, jlong paintHandle) {
+ const minikin::Bidi bidiFlags = isRtl ? minikin::Bidi::FORCE_RTL : minikin::Bidi::FORCE_LTR;
+
+ ScopedStringChars text(env, strObj);
Paint* paint = reinterpret_cast<Paint*>(paintHandle);
const Typeface* typeface = paint->getAndroidTypeface();
-
- const minikin::Bidi bidiFlags = isRtl ? minikin::Bidi::FORCE_RTL : minikin::Bidi::FORCE_LTR;
- jint count = end - start;
- jint contextCount = contextEnd - contextStart;
- const jchar* jchars = env->GetStringChars(text, NULL);
- get_canvas(canvasHandle)->drawText(jchars + contextStart, start - contextStart, count,
- contextCount, x, y, bidiFlags, *paint, typeface, nullptr);
- env->ReleaseStringChars(text, jchars);
+ get_canvas(canvasHandle)->drawText(
+ text.get(), text.size(), // text buffer
+ start, end - start, // draw range
+ contextStart, contextEnd - contextStart, // context range
+ x, y, // draw position
+ bidiFlags, *paint, typeface, nullptr /* measured text */);
}
static void drawTextOnPathChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray text,
@@ -570,8 +582,9 @@ static void drawTextOnPathString(JNIEnv* env, jobject, jlong canvasHandle, jstri
env->ReleaseStringChars(text, jchars);
}
-static void setDrawFilter(jlong canvasHandle, jlong filterHandle) {
- get_canvas(canvasHandle)->setDrawFilter(reinterpret_cast<SkDrawFilter*>(filterHandle));
+static void setPaintFilter(jlong canvasHandle, jlong filterHandle) {
+ PaintFilter* paintFilter = reinterpret_cast<PaintFilter*>(filterHandle);
+ get_canvas(canvasHandle)->setPaintFilter(sk_ref_sp(paintFilter));
}
static void freeCaches(JNIEnv* env, jobject) {
@@ -621,7 +634,7 @@ static const JNINativeMethod gMethods[] = {
{"nQuickReject","(JFFFF)Z", (void*)CanvasJNI::quickRejectRect},
{"nClipRect","(JFFFFI)Z", (void*) CanvasJNI::clipRect},
{"nClipPath","(JJI)Z", (void*) CanvasJNI::clipPath},
- {"nSetDrawFilter", "(JJ)V", (void*) CanvasJNI::setDrawFilter},
+ {"nSetDrawFilter", "(JJ)V", (void*) CanvasJNI::setPaintFilter},
};
// If called from Canvas these are regular JNI
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 04918ba8d0ef..a72363cd4c3e 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -278,8 +278,11 @@ static sp<JNIAudioPortCallback> setJniCallback(JNIEnv* env,
return old;
}
-static int check_AudioSystem_Command(status_t status)
+#define check_AudioSystem_Command(status) _check_AudioSystem_Command(__func__, (status))
+
+static int _check_AudioSystem_Command(const char* caller, status_t status)
{
+ ALOGE_IF(status, "Command failed for %s: %d", caller, status);
switch (status) {
case DEAD_OBJECT:
return kAudioStatusMediaServerDied;
@@ -1291,11 +1294,8 @@ android_media_AudioSystem_createAudioPatch(JNIEnv *env, jobject clazz,
handle = (audio_patch_handle_t)env->GetIntField(jPatchHandle, gAudioHandleFields.mId);
}
- struct audio_patch nPatch;
+ struct audio_patch nPatch = { .id = handle };
- nPatch.id = handle;
- nPatch.num_sources = 0;
- nPatch.num_sinks = 0;
jobject jSource = NULL;
jobject jSink = NULL;
@@ -1581,7 +1581,7 @@ android_media_AudioSystem_setAudioPortConfig(JNIEnv *env, jobject clazz,
if (!env->IsInstanceOf(jAudioPortConfig, gAudioPortConfigClass)) {
return AUDIO_JAVA_BAD_VALUE;
}
- struct audio_port_config nAudioPortConfig;
+ struct audio_port_config nAudioPortConfig = {};
jint jStatus = convertAudioPortConfigToNative(env, &nAudioPortConfig, jAudioPortConfig, true);
if (jStatus != AUDIO_JAVA_SUCCESS) {
return jStatus;
diff --git a/core/jni/android_media_MediaMetricsJNI.h b/core/jni/android_media_MediaMetricsJNI.h
index 16081b4af1cb..b3cb4d293399 100644
--- a/core/jni/android_media_MediaMetricsJNI.h
+++ b/core/jni/android_media_MediaMetricsJNI.h
@@ -17,7 +17,6 @@
#ifndef _ANDROID_MEDIA_MEDIAMETRICSJNI_H_
#define _ANDROID_MEDIA_MEDIAMETRICSJNI_H_
-#include <android_runtime/AndroidRuntime.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <media/MediaAnalyticsItem.h>
diff --git a/core/jni/android_media_midi.cpp b/core/jni/android_media_midi.cpp
new file mode 100644
index 000000000000..b8af3eadfd93
--- /dev/null
+++ b/core/jni/android_media_midi.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "NativeMIDI_JNI"
+
+#include <core_jni_helpers.h>
+
+namespace android { namespace midi {
+// MidiDevice Fields
+static jobject gMidiDeviceClassGlobalRef = nullptr; // A GlobalRef for MidiDevice Class
+jfieldID gFidMidiNativeHandle = nullptr; // MidiDevice.mNativeHandle
+jfieldID gFidMidiDeviceServerBinder = nullptr; // MidiDevice.mDeviceServerBinder
+jfieldID gFidMidiDeviceInfo = nullptr; // MidiDevice.mDeviceInfo
+
+// MidiDeviceInfo Fields
+static jobject gMidiDeviceInfoClassGlobalRef = nullptr; // A GlobalRef for MidiDeviceInfoClass
+jfieldID mFidMidiDeviceId = nullptr; // MidiDeviceInfo.mId
+}}
+
+using namespace android::midi;
+
+int register_android_media_midi(JNIEnv *env) {
+ jclass deviceClass = android::FindClassOrDie(env, "android/media/midi/MidiDevice");
+ gMidiDeviceClassGlobalRef = env->NewGlobalRef(deviceClass);
+
+ // MidiDevice Field IDs
+ gFidMidiNativeHandle = android::GetFieldIDOrDie(env, deviceClass, "mNativeHandle", "J");
+ gFidMidiDeviceServerBinder = android::GetFieldIDOrDie(env, deviceClass,
+ "mDeviceServerBinder", "Landroid/os/IBinder;");
+ gFidMidiDeviceInfo = android::GetFieldIDOrDie(env, deviceClass,
+ "mDeviceInfo", "Landroid/media/midi/MidiDeviceInfo;");
+
+ // MidiDeviceInfo Field IDs
+ jclass deviceInfoClass = android::FindClassOrDie(env, "android/media/midi/MidiDeviceInfo");
+ gMidiDeviceInfoClassGlobalRef = env->NewGlobalRef(deviceInfoClass);
+ mFidMidiDeviceId = android::GetFieldIDOrDie(env, deviceInfoClass, "mId", "I");
+
+ return 0;
+}
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index bf183cc8c0aa..638b3ea71d83 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -934,146 +934,6 @@ jint android_os_Debug_getLocalObjectCount(JNIEnv* env, jobject clazz);
jint android_os_Debug_getProxyObjectCount(JNIEnv* env, jobject clazz);
jint android_os_Debug_getDeathObjectCount(JNIEnv* env, jobject clazz);
-
-/* pulled out of bionic */
-extern "C" void get_malloc_leak_info(uint8_t** info, size_t* overallSize,
- size_t* infoSize, size_t* totalMemory, size_t* backtraceSize);
-extern "C" void free_malloc_leak_info(uint8_t* info);
-#define SIZE_FLAG_ZYGOTE_CHILD (1<<31)
-
-static size_t gNumBacktraceElements;
-
-/*
- * This is a qsort() callback.
- *
- * See dumpNativeHeap() for comments about the data format and sort order.
- */
-static int compareHeapRecords(const void* vrec1, const void* vrec2)
-{
- const size_t* rec1 = (const size_t*) vrec1;
- const size_t* rec2 = (const size_t*) vrec2;
- size_t size1 = *rec1;
- size_t size2 = *rec2;
-
- if (size1 < size2) {
- return 1;
- } else if (size1 > size2) {
- return -1;
- }
-
- uintptr_t* bt1 = (uintptr_t*)(rec1 + 2);
- uintptr_t* bt2 = (uintptr_t*)(rec2 + 2);
- for (size_t idx = 0; idx < gNumBacktraceElements; idx++) {
- uintptr_t addr1 = bt1[idx];
- uintptr_t addr2 = bt2[idx];
- if (addr1 == addr2) {
- if (addr1 == 0)
- break;
- continue;
- }
- if (addr1 < addr2) {
- return -1;
- } else if (addr1 > addr2) {
- return 1;
- }
- }
-
- return 0;
-}
-
-/*
- * The get_malloc_leak_info() call returns an array of structs that
- * look like this:
- *
- * size_t size
- * size_t allocations
- * intptr_t backtrace[32]
- *
- * "size" is the size of the allocation, "backtrace" is a fixed-size
- * array of function pointers, and "allocations" is the number of
- * allocations with the exact same size and backtrace.
- *
- * The entries are sorted by descending total size (i.e. size*allocations)
- * then allocation count. For best results with "diff" we'd like to sort
- * primarily by individual size then stack trace. Since the entries are
- * fixed-size, and we're allowed (by the current implementation) to mangle
- * them, we can do this in place.
- */
-static void dumpNativeHeap(FILE* fp)
-{
- uint8_t* info = NULL;
- size_t overallSize, infoSize, totalMemory, backtraceSize;
-
- get_malloc_leak_info(&info, &overallSize, &infoSize, &totalMemory,
- &backtraceSize);
- if (info == NULL) {
- fprintf(fp, "Native heap dump not available. To enable, run these"
- " commands (requires root):\n");
- fprintf(fp, "# adb shell stop\n");
- fprintf(fp, "# adb shell setprop libc.debug.malloc.options "
- "backtrace\n");
- fprintf(fp, "# adb shell start\n");
- return;
- }
- assert(infoSize != 0);
- assert(overallSize % infoSize == 0);
-
- fprintf(fp, "Android Native Heap Dump v1.0\n\n");
-
- size_t recordCount = overallSize / infoSize;
- fprintf(fp, "Total memory: %zu\n", totalMemory);
- fprintf(fp, "Allocation records: %zd\n", recordCount);
- fprintf(fp, "Backtrace size: %zd\n", backtraceSize);
- fprintf(fp, "\n");
-
- /* re-sort the entries */
- gNumBacktraceElements = backtraceSize;
- qsort(info, recordCount, infoSize, compareHeapRecords);
-
- /* dump the entries to the file */
- const uint8_t* ptr = info;
- for (size_t idx = 0; idx < recordCount; idx++) {
- size_t size = *(size_t*) ptr;
- size_t allocations = *(size_t*) (ptr + sizeof(size_t));
- uintptr_t* backtrace = (uintptr_t*) (ptr + sizeof(size_t) * 2);
-
- fprintf(fp, "z %d sz %8zu num %4zu bt",
- (size & SIZE_FLAG_ZYGOTE_CHILD) != 0,
- size & ~SIZE_FLAG_ZYGOTE_CHILD,
- allocations);
- for (size_t bt = 0; bt < backtraceSize; bt++) {
- if (backtrace[bt] == 0) {
- break;
- } else {
-#ifdef __LP64__
- fprintf(fp, " %016" PRIxPTR, backtrace[bt]);
-#else
- fprintf(fp, " %08" PRIxPTR, backtrace[bt]);
-#endif
- }
- }
- fprintf(fp, "\n");
-
- ptr += infoSize;
- }
-
- free_malloc_leak_info(info);
-
- fprintf(fp, "MAPS\n");
- const char* maps = "/proc/self/maps";
- UniqueFile in = MakeUniqueFile(maps, "re");
- if (in == nullptr) {
- fprintf(fp, "Could not open %s\n", maps);
- return;
- }
- char buf[BUFSIZ];
- while (size_t n = fread(buf, sizeof(char), BUFSIZ, in.get())) {
- fwrite(buf, sizeof(char), n, fp);
- }
-
- fprintf(fp, "END\n");
-}
-
static bool openFile(JNIEnv* env, jobject fileDescriptor, UniqueFile& fp)
{
if (fileDescriptor == NULL) {
@@ -1104,6 +964,9 @@ static bool openFile(JNIEnv* env, jobject fileDescriptor, UniqueFile& fp)
return true;
}
+/* pulled out of bionic */
+extern "C" void write_malloc_leak_info(FILE* fp);
+
/*
* Dump the native heap, writing human-readable output to the specified
* file descriptor.
@@ -1117,7 +980,9 @@ static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject,
}
ALOGD("Native heap dump starting...\n");
- dumpNativeHeap(fp.get());
+ // Formatting of the native heap dump is handled by malloc debug itself.
+ // See https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README.md#backtrace-heap-dump-format
+ write_malloc_leak_info(fp.get());
ALOGD("Native heap dump complete.\n");
}
diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp
index 4ecfd4bdc217..dfa5de6b65c6 100644
--- a/core/jni/android_os_GraphicsEnvironment.cpp
+++ b/core/jni/android_os_GraphicsEnvironment.cpp
@@ -29,7 +29,8 @@ void setDriverPath(JNIEnv* env, jobject clazz, jstring path) {
}
void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) {
- android_namespace_t* appNamespace = android::FindNamespaceByClassLoader(env, classLoader);
+ android::NativeLoaderNamespace* appNamespace = android::FindNativeLoaderNamespaceByClassLoader(
+ env, classLoader);
ScopedUtfChars layerPathsChars(env, layerPaths);
android::GraphicsEnv::getInstance().setLayerPaths(appNamespace, layerPathsChars.c_str());
}
diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp
index 4f4e5da22c8d..f7dab428abe7 100644
--- a/core/jni/android_os_Trace.cpp
+++ b/core/jni/android_os_Trace.cpp
@@ -14,93 +14,80 @@
* limitations under the License.
*/
-#define LOG_TAG "Trace"
-// #define LOG_NDEBUG 0
-
-#include <inttypes.h>
+#include <jni.h>
#include <cutils/trace.h>
-#include <utils/String8.h>
#include <log/log.h>
-
#include <nativehelper/JNIHelp.h>
-#include <nativehelper/ScopedUtfChars.h>
-#include <nativehelper/ScopedStringChars.h>
+
+#include <array>
namespace android {
-static void sanitizeString(String8& utf8Chars) {
- size_t size = utf8Chars.size();
- char* str = utf8Chars.lockBuffer(size);
+inline static void sanitizeString(char* str, size_t size) {
for (size_t i = 0; i < size; i++) {
char c = str[i];
if (c == '\0' || c == '\n' || c == '|') {
str[i] = ' ';
}
}
- utf8Chars.unlockBuffer();
}
-static jlong android_os_Trace_nativeGetEnabledTags(JNIEnv* env, jclass clazz) {
+inline static void getString(JNIEnv* env, jstring jstring, char* outBuffer, jsize maxSize) {
+ jsize size = std::min(env->GetStringLength(jstring), maxSize);
+ env->GetStringUTFRegion(jstring, 0, size, outBuffer);
+ sanitizeString(outBuffer, size);
+ outBuffer[size] = '\0';
+}
+
+template<typename F>
+inline static void withString(JNIEnv* env, jstring jstr, F callback) {
+ std::array<char, 1024> buffer;
+ getString(env, jstr, buffer.data(), buffer.size());
+ callback(buffer.data());
+}
+
+static jlong android_os_Trace_nativeGetEnabledTags(JNIEnv*, jclass) {
return atrace_get_enabled_tags();
}
-static void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass clazz,
+static void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass,
jlong tag, jstring nameStr, jint value) {
- ScopedUtfChars name(env, nameStr);
-
- ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, name.c_str(), value);
- atrace_int(tag, name.c_str(), value);
+ withString(env, nameStr, [tag, value](char* str) {
+ atrace_int(tag, str, value);
+ });
}
-static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass clazz,
+static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass,
jlong tag, jstring nameStr) {
- ScopedStringChars jchars(env, nameStr);
- String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
- sanitizeString(utf8Chars);
-
- ALOGV("%s: %" PRId64 " %s", __FUNCTION__, tag, utf8Chars.string());
- atrace_begin(tag, utf8Chars.string());
+ withString(env, nameStr, [tag](char* str) {
+ atrace_begin(tag, str);
+ });
}
-static void android_os_Trace_nativeTraceEnd(JNIEnv* env, jclass clazz,
- jlong tag) {
-
- ALOGV("%s: %" PRId64, __FUNCTION__, tag);
+static void android_os_Trace_nativeTraceEnd(JNIEnv*, jclass, jlong tag) {
atrace_end(tag);
}
-static void android_os_Trace_nativeAsyncTraceBegin(JNIEnv* env, jclass clazz,
+static void android_os_Trace_nativeAsyncTraceBegin(JNIEnv* env, jclass,
jlong tag, jstring nameStr, jint cookie) {
- ScopedStringChars jchars(env, nameStr);
- String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
- sanitizeString(utf8Chars);
-
- ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, utf8Chars.string(), cookie);
- atrace_async_begin(tag, utf8Chars.string(), cookie);
+ withString(env, nameStr, [tag, cookie](char* str) {
+ atrace_async_begin(tag, str, cookie);
+ });
}
-static void android_os_Trace_nativeAsyncTraceEnd(JNIEnv* env, jclass clazz,
+static void android_os_Trace_nativeAsyncTraceEnd(JNIEnv* env, jclass,
jlong tag, jstring nameStr, jint cookie) {
- ScopedStringChars jchars(env, nameStr);
- String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
- sanitizeString(utf8Chars);
-
- ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, utf8Chars.string(), cookie);
- atrace_async_end(tag, utf8Chars.string(), cookie);
+ withString(env, nameStr, [tag, cookie](char* str) {
+ atrace_async_end(tag, str, cookie);
+ });
}
-static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv* env,
- jclass clazz, jboolean allowed) {
- ALOGV("%s: %d", __FUNCTION__, allowed);
-
+static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv*, jclass, jboolean allowed) {
atrace_set_debuggable(allowed);
}
-static void android_os_Trace_nativeSetTracingEnabled(JNIEnv* env,
- jclass clazz, jboolean enabled) {
- ALOGV("%s: %d", __FUNCTION__, enabled);
-
+static void android_os_Trace_nativeSetTracingEnabled(JNIEnv*, jclass, jboolean enabled) {
atrace_set_tracing_enabled(enabled);
}
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index e8ef349f5b7a..17ab9563d372 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -150,7 +150,7 @@ static jobject android_os_VintfObject_getVndkSnapshots(JNIEnv* env, jclass) {
}
jobject jMap = env->NewObject(gHashMapClazz, gHashMapInit);
for (const auto &vndk : manifest->vendorNdks()) {
- std::string key = vndk.version();
+ const std::string& key = vndk.version();
env->CallObjectMethod(jMap, gHashMapPut,
env->NewStringUTF(key.c_str()), toJavaStringArray(env, vndk.libraries()));
}
diff --git a/core/jni/android_text_MeasuredParagraph.cpp b/core/jni/android_text_MeasuredParagraph.cpp
index 41a81accf72c..9eb6f8d4189a 100644
--- a/core/jni/android_text_MeasuredParagraph.cpp
+++ b/core/jni/android_text_MeasuredParagraph.cpp
@@ -17,7 +17,6 @@
#define LOG_TAG "MeasuredParagraph"
#include "GraphicsJNI.h"
-#include "ScopedIcuLocale.h"
#include "unicode/locid.h"
#include "unicode/brkiter.h"
#include "utils/misc.h"
diff --git a/core/jni/android_text_StaticLayout.cpp b/core/jni/android_text_StaticLayout.cpp
index 682dc8739869..fec5b6995646 100644
--- a/core/jni/android_text_StaticLayout.cpp
+++ b/core/jni/android_text_StaticLayout.cpp
@@ -16,7 +16,6 @@
#define LOG_TAG "StaticLayout"
-#include "ScopedIcuLocale.h"
#include "unicode/locid.h"
#include "unicode/brkiter.h"
#include "utils/misc.h"
@@ -69,15 +68,12 @@ static inline minikin::android::StaticLayoutNative* toNative(jlong ptr) {
// set text and set a number of parameters for creating a layout (width, tabstops, strategy,
// hyphenFrequency)
static jlong nInit(JNIEnv* env, jclass /* unused */,
- jint breakStrategy, jint hyphenationFrequency, jboolean isJustified,
- jintArray indents, jintArray leftPaddings, jintArray rightPaddings) {
+ jint breakStrategy, jint hyphenationFrequency, jboolean isJustified, jintArray indents) {
return reinterpret_cast<jlong>(new minikin::android::StaticLayoutNative(
static_cast<minikin::BreakStrategy>(breakStrategy),
static_cast<minikin::HyphenationFrequency>(hyphenationFrequency),
isJustified,
- jintArrayToFloatVector(env, indents),
- jintArrayToFloatVector(env, leftPaddings),
- jintArrayToFloatVector(env, rightPaddings)));
+ jintArrayToFloatVector(env, indents)));
}
// CriticalNative
@@ -161,8 +157,6 @@ static const JNINativeMethod gMethods[] = {
"I" // hyphenationFrequency
"Z" // isJustified
"[I" // indents
- "[I" // left paddings
- "[I" // right paddings
")J", (void*) nInit},
// Critical Natives
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index c3ba9ba82826..ecad6c027391 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -108,7 +108,6 @@ static struct binderproxy_offsets_t
jclass mClass;
jmethodID mGetInstance;
jmethodID mSendDeathNotice;
- jmethodID mDumpProxyDebugInfo;
// Object state.
jfieldID mNativeData; // Field holds native pointer to BinderProxyNativeData.
@@ -155,9 +154,8 @@ static struct thread_dispatch_offsets_t
static constexpr int32_t PROXY_WARN_INTERVAL = 5000;
static constexpr uint32_t GC_INTERVAL = 1000;
-// Protected by gProxyLock. We warn if this gets too large.
-static int32_t gNumProxies = 0;
-static int32_t gProxiesWarned = 0;
+static std::atomic<uint32_t> gNumProxies(0);
+static std::atomic<uint32_t> gProxiesWarned(0);
// Number of GlobalRefs held by JavaBBinders.
static std::atomic<uint32_t> gNumLocalRefsCreated(0);
@@ -632,12 +630,6 @@ BinderProxyNativeData* getBPNativeData(JNIEnv* env, jobject obj) {
return (BinderProxyNativeData *) env->GetLongField(obj, gBinderProxyOffsets.mNativeData);
}
-static Mutex gProxyLock;
-
-// We may cache a single BinderProxyNativeData node to avoid repeat allocation.
-// All fields are null. Protected by gProxyLock.
-static BinderProxyNativeData *gNativeDataCache;
-
// If the argument is a JavaBBinder, return the Java object that was used to create it.
// Otherwise return a BinderProxy for the IBinder. If a previous call was passed the
// same IBinder, and the original BinderProxy is still alive, return the same BinderProxy.
@@ -652,36 +644,31 @@ jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val)
return object;
}
- // For the rest of the function we will hold this lock, to serialize
- // looking/creation/destruction of Java proxies for native Binder proxies.
- AutoMutex _l(gProxyLock);
+ BinderProxyNativeData* nativeData = new BinderProxyNativeData();
+ nativeData->mOrgue = new DeathRecipientList;
+ nativeData->mObject = val;
- BinderProxyNativeData* nativeData = gNativeDataCache;
- if (nativeData == nullptr) {
- nativeData = new BinderProxyNativeData();
- }
- // gNativeDataCache is now logically empty.
jobject object = env->CallStaticObjectMethod(gBinderProxyOffsets.mClass,
gBinderProxyOffsets.mGetInstance, (jlong) nativeData, (jlong) val.get());
if (env->ExceptionCheck()) {
// In the exception case, getInstance still took ownership of nativeData.
- gNativeDataCache = nullptr;
return NULL;
}
BinderProxyNativeData* actualNativeData = getBPNativeData(env, object);
if (actualNativeData == nativeData) {
- // New BinderProxy; we still have exclusive access.
- nativeData->mOrgue = new DeathRecipientList;
- nativeData->mObject = val;
- gNativeDataCache = nullptr;
- ++gNumProxies;
- if (gNumProxies >= gProxiesWarned + PROXY_WARN_INTERVAL) {
- ALOGW("Unexpectedly many live BinderProxies: %d\n", gNumProxies);
- gProxiesWarned = gNumProxies;
+ // Created a new Proxy
+ uint32_t numProxies = gNumProxies.fetch_add(1, std::memory_order_relaxed);
+ uint32_t numLastWarned = gProxiesWarned.load(std::memory_order_relaxed);
+ if (numProxies >= numLastWarned + PROXY_WARN_INTERVAL) {
+ // Multiple threads can get here, make sure only one of them gets to
+ // update the warn counter.
+ if (gProxiesWarned.compare_exchange_strong(numLastWarned,
+ numLastWarned + PROXY_WARN_INTERVAL, std::memory_order_relaxed)) {
+ ALOGW("Unexpectedly many live BinderProxies: %d\n", numProxies);
+ }
}
} else {
- // nativeData wasn't used. Reuse it the next time.
- gNativeDataCache = nativeData;
+ delete nativeData;
}
return object;
@@ -959,8 +946,7 @@ jint android_os_Debug_getLocalObjectCount(JNIEnv* env, jobject clazz)
jint android_os_Debug_getProxyObjectCount(JNIEnv* env, jobject clazz)
{
- AutoMutex _l(gProxyLock);
- return gNumProxies;
+ return gNumProxies.load();
}
jint android_os_Debug_getDeathObjectCount(JNIEnv* env, jobject clazz)
@@ -1007,18 +993,6 @@ static void android_os_BinderInternal_handleGc(JNIEnv* env, jobject clazz)
static void android_os_BinderInternal_proxyLimitcallback(int uid)
{
JNIEnv *env = AndroidRuntime::getJNIEnv();
- {
- // Calls into BinderProxy must be serialized
- AutoMutex _l(gProxyLock);
- env->CallStaticObjectMethod(gBinderProxyOffsets.mClass,
- gBinderProxyOffsets.mDumpProxyDebugInfo);
- }
- if (env->ExceptionCheck()) {
- ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
- report_exception(env, excep.get(),
- "*** Uncaught exception in dumpProxyDebugInfo");
- }
-
env->CallStaticVoidMethod(gBinderInternalOffsets.mClass,
gBinderInternalOffsets.mProxyLimitCallback,
uid);
@@ -1367,9 +1341,6 @@ static jboolean android_os_BinderProxy_unlinkToDeath(JNIEnv* env, jobject obj,
static void BinderProxy_destroy(void* rawNativeData)
{
- // Don't race with construction/initialization
- AutoMutex _l(gProxyLock);
-
BinderProxyNativeData * nativeData = (BinderProxyNativeData *) rawNativeData;
LOGDEATH("Destroying BinderProxy: binder=%p drl=%p\n",
nativeData->mObject.get(), nativeData->mOrgue.get());
@@ -1408,8 +1379,6 @@ static int int_register_android_os_BinderProxy(JNIEnv* env)
"(JJ)Landroid/os/BinderProxy;");
gBinderProxyOffsets.mSendDeathNotice = GetStaticMethodIDOrDie(env, clazz, "sendDeathNotice",
"(Landroid/os/IBinder$DeathRecipient;)V");
- gBinderProxyOffsets.mDumpProxyDebugInfo = GetStaticMethodIDOrDie(env, clazz, "dumpProxyDebugInfo",
- "()V");
gBinderProxyOffsets.mNativeData = GetFieldIDOrDie(env, clazz, "mNativeData", "J");
clazz = FindClassOrDie(env, "java/lang/Class");
diff --git a/core/jni/android_view_DisplayListCanvas.cpp b/core/jni/android_view_DisplayListCanvas.cpp
index 7956bf4ee222..4fdd2bcd4f39 100644
--- a/core/jni/android_view_DisplayListCanvas.cpp
+++ b/core/jni/android_view_DisplayListCanvas.cpp
@@ -128,18 +128,8 @@ static void android_view_DisplayListCanvas_resetDisplayListCanvas(jlong canvasPt
canvas->resetRecording(width, height, renderNode);
}
-static jint android_view_DisplayListCanvas_getMaxTextureWidth() {
- if (!Caches::hasInstance()) {
- android::uirenderer::renderthread::RenderProxy::staticFence();
- }
- return Caches::getInstance().maxTextureSize;
-}
-
-static jint android_view_DisplayListCanvas_getMaxTextureHeight() {
- if (!Caches::hasInstance()) {
- android::uirenderer::renderthread::RenderProxy::staticFence();
- }
- return Caches::getInstance().maxTextureSize;
+static jint android_view_DisplayListCanvas_getMaxTextureSize() {
+ return android::uirenderer::renderthread::RenderProxy::maxTextureSize();
}
static void android_view_DisplayListCanvas_insertReorderBarrier(jlong canvasPtr,
@@ -205,8 +195,8 @@ static JNINativeMethod gMethods[] = {
// ------------ @CriticalNative --------------
{ "nCreateDisplayListCanvas", "(JII)J", (void*) android_view_DisplayListCanvas_createDisplayListCanvas },
{ "nResetDisplayListCanvas", "(JJII)V", (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },
- { "nGetMaximumTextureWidth", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureWidth },
- { "nGetMaximumTextureHeight", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureHeight },
+ { "nGetMaximumTextureWidth", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize },
+ { "nGetMaximumTextureHeight", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize },
{ "nInsertReorderBarrier", "(JZ)V", (void*) android_view_DisplayListCanvas_insertReorderBarrier },
{ "nFinishRecording", "(J)J", (void*) android_view_DisplayListCanvas_finishRecording },
{ "nDrawRenderNode", "(JJ)V", (void*) android_view_DisplayListCanvas_drawRenderNode },
diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp
index b43bcd741060..47c6259a7d2f 100644
--- a/core/jni/android_view_InputEventReceiver.cpp
+++ b/core/jni/android_view_InputEventReceiver.cpp
@@ -243,9 +243,8 @@ status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env,
bool flag = false;
InputEvent* inputEvent;
- int32_t displayId;
status_t status = mInputConsumer.consume(&mInputEventFactory,
- consumeBatches, frameTime, &seq, &inputEvent, &displayId,
+ consumeBatches, frameTime, &seq, &inputEvent,
&motionEventType, &touchMoveNum, &flag);
if (!receiverObj.get()) {
@@ -342,8 +341,7 @@ status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env,
ALOGD("channel '%s' ~ Dispatching input event.", getInputChannelName().c_str());
}
env->CallVoidMethod(receiverObj.get(),
- gInputEventReceiverClassInfo.dispatchInputEvent, seq, inputEventObj,
- displayId);
+ gInputEventReceiverClassInfo.dispatchInputEvent, seq, inputEventObj);
if (env->ExceptionCheck()) {
ALOGE("Exception dispatching input event.");
skipCallbacks = true;
@@ -450,7 +448,7 @@ int register_android_view_InputEventReceiver(JNIEnv* env) {
gInputEventReceiverClassInfo.dispatchInputEvent = GetMethodIDOrDie(env,
gInputEventReceiverClassInfo.clazz,
- "dispatchInputEvent", "(ILandroid/view/InputEvent;I)V");
+ "dispatchInputEvent", "(ILandroid/view/InputEvent;)V");
gInputEventReceiverClassInfo.dispatchBatchedInputEventPending = GetMethodIDOrDie(env,
gInputEventReceiverClassInfo.clazz, "dispatchBatchedInputEventPending", "()V");
gInputEventReceiverClassInfo.dispatchMotionEventInfo = GetMethodIDOrDie(env,
diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp
index effeed6b2af6..10da89227f51 100644
--- a/core/jni/android_view_InputEventSender.cpp
+++ b/core/jni/android_view_InputEventSender.cpp
@@ -39,8 +39,6 @@ namespace android {
// Log debug messages about the dispatch cycle.
static const bool kDebugDispatchCycle = false;
-// Display id for default(primary) display.
-static const int32_t kDefaultDisplayId = 0;
static struct {
jclass clazz;
@@ -116,8 +114,8 @@ status_t NativeInputEventSender::sendKeyEvent(uint32_t seq, const KeyEvent* even
uint32_t publishedSeq = mNextPublishedSeq++;
status_t status = mInputPublisher.publishKeyEvent(publishedSeq,
- event->getDeviceId(), event->getSource(), event->getAction(), event->getFlags(),
- event->getKeyCode(), event->getScanCode(), event->getMetaState(),
+ event->getDeviceId(), event->getSource(), event->getDisplayId(), event->getAction(),
+ event->getFlags(), event->getKeyCode(), event->getScanCode(), event->getMetaState(),
event->getRepeatCount(), event->getDownTime(), event->getEventTime());
if (status) {
ALOGW("Failed to send key event on channel '%s'. status=%d",
@@ -137,8 +135,7 @@ status_t NativeInputEventSender::sendMotionEvent(uint32_t seq, const MotionEvent
for (size_t i = 0; i <= event->getHistorySize(); i++) {
publishedSeq = mNextPublishedSeq++;
status_t status = mInputPublisher.publishMotionEvent(publishedSeq,
- event->getDeviceId(), event->getSource(),
- kDefaultDisplayId /* TODO(multi-display): propagate display id */,
+ event->getDeviceId(), event->getSource(), event->getDisplayId(),
event->getAction(), event->getActionButton(), event->getFlags(),
event->getEdgeFlags(), event->getMetaState(), event->getButtonState(),
event->getXOffset(), event->getYOffset(),
diff --git a/core/jni/android_view_KeyEvent.cpp b/core/jni/android_view_KeyEvent.cpp
index 8a6e745b60a8..f0107723a43e 100644
--- a/core/jni/android_view_KeyEvent.cpp
+++ b/core/jni/android_view_KeyEvent.cpp
@@ -39,6 +39,7 @@ static struct {
jfieldID mDeviceId;
jfieldID mSource;
+ jfieldID mDisplayId;
jfieldID mMetaState;
jfieldID mAction;
jfieldID mKeyCode;
@@ -65,6 +66,7 @@ jobject android_view_KeyEvent_fromNative(JNIEnv* env, const KeyEvent* event) {
event->getScanCode(),
event->getFlags(),
event->getSource(),
+ event->getDisplayId(),
NULL);
if (env->ExceptionCheck()) {
ALOGE("An exception occurred while obtaining a key event.");
@@ -79,6 +81,7 @@ status_t android_view_KeyEvent_toNative(JNIEnv* env, jobject eventObj,
KeyEvent* event) {
jint deviceId = env->GetIntField(eventObj, gKeyEventClassInfo.mDeviceId);
jint source = env->GetIntField(eventObj, gKeyEventClassInfo.mSource);
+ jint displayId = env->GetIntField(eventObj, gKeyEventClassInfo.mDisplayId);
jint metaState = env->GetIntField(eventObj, gKeyEventClassInfo.mMetaState);
jint action = env->GetIntField(eventObj, gKeyEventClassInfo.mAction);
jint keyCode = env->GetIntField(eventObj, gKeyEventClassInfo.mKeyCode);
@@ -88,7 +91,8 @@ status_t android_view_KeyEvent_toNative(JNIEnv* env, jobject eventObj,
jlong downTime = env->GetLongField(eventObj, gKeyEventClassInfo.mDownTime);
jlong eventTime = env->GetLongField(eventObj, gKeyEventClassInfo.mEventTime);
- event->initialize(deviceId, source, action, flags, keyCode, scanCode, metaState, repeatCount,
+ event->initialize(deviceId, source, displayId, action, flags, keyCode, scanCode, metaState,
+ repeatCount,
milliseconds_to_nanoseconds(downTime),
milliseconds_to_nanoseconds(eventTime));
return OK;
@@ -131,12 +135,14 @@ int register_android_view_KeyEvent(JNIEnv* env) {
gKeyEventClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
gKeyEventClassInfo.obtain = GetStaticMethodIDOrDie(env, gKeyEventClassInfo.clazz,
- "obtain", "(JJIIIIIIIILjava/lang/String;)Landroid/view/KeyEvent;");
+ "obtain", "(JJIIIIIIIIILjava/lang/String;)Landroid/view/KeyEvent;");
gKeyEventClassInfo.recycle = GetMethodIDOrDie(env, gKeyEventClassInfo.clazz,
"recycle", "()V");
gKeyEventClassInfo.mDeviceId = GetFieldIDOrDie(env, gKeyEventClassInfo.clazz, "mDeviceId", "I");
gKeyEventClassInfo.mSource = GetFieldIDOrDie(env, gKeyEventClassInfo.clazz, "mSource", "I");
+ gKeyEventClassInfo.mDisplayId = GetFieldIDOrDie(env, gKeyEventClassInfo.clazz, "mDisplayId",
+ "I");
gKeyEventClassInfo.mMetaState = GetFieldIDOrDie(env, gKeyEventClassInfo.clazz, "mMetaState",
"I");
gKeyEventClassInfo.mAction = GetFieldIDOrDie(env, gKeyEventClassInfo.clazz, "mAction", "I");
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp
index 64bf0dc0ed91..ecf811970a99 100644
--- a/core/jni/android_view_MotionEvent.cpp
+++ b/core/jni/android_view_MotionEvent.cpp
@@ -333,7 +333,7 @@ static void pointerPropertiesFromNative(JNIEnv* env, const PointerProperties* po
static jlong android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz,
jlong nativePtr,
- jint deviceId, jint source, jint action, jint flags, jint edgeFlags,
+ jint deviceId, jint source, jint displayId, jint action, jint flags, jint edgeFlags,
jint metaState, jint buttonState,
jfloat xOffset, jfloat yOffset, jfloat xPrecision, jfloat yPrecision,
jlong downTimeNanos, jlong eventTimeNanos,
@@ -372,8 +372,8 @@ static jlong android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz
env->DeleteLocalRef(pointerCoordsObj);
}
- event->initialize(deviceId, source, action, 0, flags, edgeFlags, metaState, buttonState,
- xOffset, yOffset, xPrecision, yPrecision,
+ event->initialize(deviceId, source, displayId, action, 0, flags, edgeFlags, metaState,
+ buttonState, xOffset, yOffset, xPrecision, yPrecision,
downTimeNanos, eventTimeNanos, pointerCount, pointerProperties, rawPointerCoords);
return reinterpret_cast<jlong>(event);
@@ -598,6 +598,16 @@ static void android_view_MotionEvent_nativeSetSource(jlong nativePtr, jint sourc
event->setSource(source);
}
+static jint android_view_MotionEvent_nativeGetDisplayId(jlong nativePtr) {
+ MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
+ return event->getDisplayId();
+}
+
+static void android_view_MotionEvent_nativeSetDisplayId(jlong nativePtr, jint displayId) {
+ MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
+ return event->setDisplayId(displayId);
+}
+
static jint android_view_MotionEvent_nativeGetAction(jlong nativePtr) {
MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
return event->getAction();
@@ -737,7 +747,7 @@ static void android_view_MotionEvent_nativeTransform(jlong nativePtr, jlong matr
static const JNINativeMethod gMotionEventMethods[] = {
/* name, signature, funcPtr */
{ "nativeInitialize",
- "(JIIIIIIIFFFFJJI[Landroid/view/MotionEvent$PointerProperties;"
+ "(JIIIIIIIIFFFFJJI[Landroid/view/MotionEvent$PointerProperties;"
"[Landroid/view/MotionEvent$PointerCoords;)J",
(void*)android_view_MotionEvent_nativeInitialize },
{ "nativeDispose",
@@ -792,8 +802,14 @@ static const JNINativeMethod gMotionEventMethods[] = {
"(J)I",
(void*)android_view_MotionEvent_nativeGetSource },
{ "nativeSetSource",
- "(JI)I",
+ "(JI)V",
(void*)android_view_MotionEvent_nativeSetSource },
+ { "nativeGetDisplayId",
+ "(J)I",
+ (void*)android_view_MotionEvent_nativeGetDisplayId },
+ { "nativeSetDisplayId",
+ "(JI)V",
+ (void*)android_view_MotionEvent_nativeSetDisplayId },
{ "nativeGetAction",
"(J)I",
(void*)android_view_MotionEvent_nativeGetAction },
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index 37ea8106ecd6..46b19bdf660f 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -222,6 +222,11 @@ static jboolean android_view_RenderNode_setHasOverlappingRendering(jlong renderN
RenderNode::GENERIC);
}
+static void android_view_RenderNode_setUsageHint(jlong renderNodePtr, jint usageHint) {
+ RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
+ renderNode->setUsageHint(static_cast<UsageHint>(usageHint));
+}
+
static jboolean android_view_RenderNode_setElevation(jlong renderNodePtr, float elevation) {
return SET_AND_DIRTY(setElevation, elevation, RenderNode::Z);
}
@@ -431,6 +436,14 @@ static jfloat android_view_RenderNode_getPivotY(jlong renderNodePtr) {
return renderNode->stagingProperties().getPivotY();
}
+static jint android_view_RenderNode_getWidth(jlong renderNodePtr) {
+ return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getWidth();
+}
+
+static jint android_view_RenderNode_getHeight(jlong renderNodePtr) {
+ return reinterpret_cast<RenderNode*>(renderNodePtr)->stagingProperties().getHeight();
+}
+
// ----------------------------------------------------------------------------
// RenderProperties - Animations
// ----------------------------------------------------------------------------
@@ -606,6 +619,7 @@ static const JNINativeMethod gMethods[] = {
{ "nSetAlpha", "(JF)Z", (void*) android_view_RenderNode_setAlpha },
{ "nSetHasOverlappingRendering", "(JZ)Z",
(void*) android_view_RenderNode_setHasOverlappingRendering },
+ { "nSetUsageHint", "(JI)V", (void*) android_view_RenderNode_setUsageHint },
{ "nSetElevation", "(JF)Z", (void*) android_view_RenderNode_setElevation },
{ "nSetTranslationX", "(JF)Z", (void*) android_view_RenderNode_setTranslationX },
{ "nSetTranslationY", "(JF)Z", (void*) android_view_RenderNode_setTranslationY },
@@ -648,6 +662,8 @@ static const JNINativeMethod gMethods[] = {
{ "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX },
{ "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY },
+ { "nGetWidth", "(J)I", (void*) android_view_RenderNode_getWidth },
+ { "nGetHeight", "(J)I", (void*) android_view_RenderNode_getHeight },
};
int register_android_view_RenderNode(JNIEnv* env) {
diff --git a/core/jni/android_view_TextureLayer.cpp b/core/jni/android_view_TextureLayer.cpp
index e14c46f8b1c1..d3a447f1f7dc 100644
--- a/core/jni/android_view_TextureLayer.cpp
+++ b/core/jni/android_view_TextureLayer.cpp
@@ -32,7 +32,6 @@
#include <SkBlendMode.h>
#include <DeferredLayerUpdater.h>
-#include <SkiaShader.h>
#include <Rect.h>
#include <RenderNode.h>
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index ee9a123ab674..497b2894d405 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -863,12 +863,6 @@ static void android_view_ThreadedRenderer_notifyFramePending(JNIEnv* env, jobjec
proxy->notifyFramePending();
}
-static void android_view_ThreadedRenderer_serializeDisplayListTree(JNIEnv* env, jobject clazz,
- jlong proxyPtr) {
- RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
- proxy->serializeDisplayListTree();
-}
-
static void android_view_ThreadedRenderer_dumpProfileInfo(JNIEnv* env, jobject clazz,
jlong proxyPtr, jobject javaFileDescriptor, jint dumpFlags) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -1144,7 +1138,6 @@ static const JNINativeMethod gMethods[] = {
{ "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence },
{ "nStopDrawing", "(J)V", (void*) android_view_ThreadedRenderer_stopDrawing },
{ "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending },
- { "nSerializeDisplayListTree", "(J)V", (void*) android_view_ThreadedRenderer_serializeDisplayListTree },
{ "nDumpProfileInfo", "(JLjava/io/FileDescriptor;I)V", (void*) android_view_ThreadedRenderer_dumpProfileInfo },
{ "setupShadersDiskCache", "(Ljava/lang/String;Ljava/lang/String;)V",
(void*) android_view_ThreadedRenderer_setupShadersDiskCache },
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index b2853c9f1c61..e30a3e7adc0c 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -45,6 +45,7 @@
#include <unistd.h>
#include "android-base/logging.h"
+#include <android-base/properties.h>
#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <cutils/fs.h>
@@ -70,6 +71,7 @@ namespace {
using android::String8;
using android::base::StringPrintf;
using android::base::WriteStringToFile;
+using android::base::GetBoolProperty;
#define CREATE_ERROR(...) StringPrintf("%s:%d: ", __FILE__, __LINE__). \
append(StringPrintf(__VA_ARGS__))
@@ -535,17 +537,209 @@ static bool FillFileDescriptorVector(JNIEnv* env,
return true;
}
+// Utility routine to specialize a zygote child process.
+static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
+ jint runtime_flags, jobjectArray javaRlimits,
+ jlong permittedCapabilities, jlong effectiveCapabilities,
+ jint mount_external, jstring java_se_info, jstring java_se_name,
+ bool is_system_server, bool is_child_zygote, jstring instructionSet,
+ jstring dataDir) {
+ std::string error_msg;
+
+ auto fail_fn = [env, java_se_name, is_system_server](const std::string& msg)
+ __attribute__ ((noreturn)) {
+ const char* se_name_c_str = nullptr;
+ std::unique_ptr<ScopedUtfChars> se_name;
+ if (java_se_name != nullptr) {
+ se_name.reset(new ScopedUtfChars(env, java_se_name));
+ se_name_c_str = se_name->c_str();
+ }
+ if (se_name_c_str == nullptr && is_system_server) {
+ se_name_c_str = "system_server";
+ }
+ const std::string& error_msg = (se_name_c_str == nullptr)
+ ? msg
+ : StringPrintf("(%s) %s", se_name_c_str, msg.c_str());
+ env->FatalError(error_msg.c_str());
+ __builtin_unreachable();
+ };
+
+ // Keep capabilities across UID change, unless we're staying root.
+ if (uid != 0) {
+ if (!EnableKeepCapabilities(&error_msg)) {
+ fail_fn(error_msg);
+ }
+ }
+
+ if (!SetInheritable(permittedCapabilities, &error_msg)) {
+ fail_fn(error_msg);
+ }
+ if (!DropCapabilitiesBoundingSet(&error_msg)) {
+ fail_fn(error_msg);
+ }
+
+ bool use_native_bridge = !is_system_server && (instructionSet != NULL)
+ && android::NativeBridgeAvailable();
+ if (use_native_bridge) {
+ ScopedUtfChars isa_string(env, instructionSet);
+ use_native_bridge = android::NeedsNativeBridge(isa_string.c_str());
+ }
+ if (use_native_bridge && dataDir == NULL) {
+ // dataDir should never be null if we need to use a native bridge.
+ // In general, dataDir will never be null for normal applications. It can only happen in
+ // special cases (for isolated processes which are not associated with any app). These are
+ // launched by the framework and should not be emulated anyway.
+ use_native_bridge = false;
+ ALOGW("Native bridge will not be used because dataDir == NULL.");
+ }
+
+ if (!MountEmulatedStorage(uid, mount_external, use_native_bridge, &error_msg)) {
+ ALOGW("Failed to mount emulated storage: %s (%s)", error_msg.c_str(), strerror(errno));
+ if (errno == ENOTCONN || errno == EROFS) {
+ // When device is actively encrypting, we get ENOTCONN here
+ // since FUSE was mounted before the framework restarted.
+ // When encrypted device is booting, we get EROFS since
+ // FUSE hasn't been created yet by init.
+ // In either case, continue without external storage.
+ } else {
+ fail_fn(error_msg);
+ }
+ }
+
+ // If this zygote isn't root, it won't be able to create a process group,
+ // since the directory is owned by root.
+ if (!is_system_server && getuid() == 0) {
+ int rc = createProcessGroup(uid, getpid());
+ if (rc != 0) {
+ if (rc == -EROFS) {
+ ALOGW("createProcessGroup failed, kernel missing CONFIG_CGROUP_CPUACCT?");
+ } else {
+ ALOGE("createProcessGroup(%d, %d) failed: %s", uid, 0/*pid*/, strerror(-rc));
+ }
+ }
+ }
+
+ if (!SetGids(env, javaGids, &error_msg)) {
+ fail_fn(error_msg);
+ }
+
+ if (!SetRLimits(env, javaRlimits, &error_msg)) {
+ fail_fn(error_msg);
+ }
+
+ if (use_native_bridge) {
+ ScopedUtfChars isa_string(env, instructionSet);
+ ScopedUtfChars data_dir(env, dataDir);
+ android::PreInitializeNativeBridge(data_dir.c_str(), isa_string.c_str());
+ }
+
+ int rc = setresgid(gid, gid, gid);
+ if (rc == -1) {
+ fail_fn(CREATE_ERROR("setresgid(%d) failed: %s", gid, strerror(errno)));
+ }
+
+ // Must be called when the new process still has CAP_SYS_ADMIN, in this case, before changing
+ // uid from 0, which clears capabilities. The other alternative is to call
+ // prctl(PR_SET_NO_NEW_PRIVS, 1) afterward, but that breaks SELinux domain transition (see
+ // b/71859146). As the result, privileged syscalls used below still need to be accessible in
+ // app process.
+ SetUpSeccompFilter(uid);
+
+ rc = setresuid(uid, uid, uid);
+ if (rc == -1) {
+ fail_fn(CREATE_ERROR("setresuid(%d) failed: %s", uid, strerror(errno)));
+ }
+
+ // The "dumpable" flag of a process, which controls core dump generation, is
+ // overwritten by the value in /proc/sys/fs/suid_dumpable when the effective
+ // user or group ID changes. See proc(5) for possible values. In most cases,
+ // the value is 0, so core dumps are disabled for zygote children. However,
+ // when running in a Chrome OS container, the value is already set to 2,
+ // which allows the external crash reporter to collect all core dumps. Since
+ // only system crashes are interested, core dump is disabled for app
+ // processes. This also ensures compliance with CTS.
+ int dumpable = prctl(PR_GET_DUMPABLE);
+ if (dumpable == -1) {
+ ALOGE("prctl(PR_GET_DUMPABLE) failed: %s", strerror(errno));
+ RuntimeAbort(env, __LINE__, "prctl(PR_GET_DUMPABLE) failed");
+ }
+ if (dumpable == 2 && uid >= AID_APP) {
+ if (prctl(PR_SET_DUMPABLE, 0, 0, 0, 0) == -1) {
+ ALOGE("prctl(PR_SET_DUMPABLE, 0) failed: %s", strerror(errno));
+ RuntimeAbort(env, __LINE__, "prctl(PR_SET_DUMPABLE, 0) failed");
+ }
+ }
+
+ if (NeedsNoRandomizeWorkaround()) {
+ // Work around ARM kernel ASLR lossage (http://b/5817320).
+ int old_personality = personality(0xffffffff);
+ int new_personality = personality(old_personality | ADDR_NO_RANDOMIZE);
+ if (new_personality == -1) {
+ ALOGW("personality(%d) failed: %s", new_personality, strerror(errno));
+ }
+ }
+
+ if (!SetCapabilities(permittedCapabilities, effectiveCapabilities, permittedCapabilities,
+ &error_msg)) {
+ fail_fn(error_msg);
+ }
+
+ if (!SetSchedulerPolicy(&error_msg)) {
+ fail_fn(error_msg);
+ }
+
+ const char* se_info_c_str = NULL;
+ ScopedUtfChars* se_info = NULL;
+ if (java_se_info != NULL) {
+ se_info = new ScopedUtfChars(env, java_se_info);
+ se_info_c_str = se_info->c_str();
+ if (se_info_c_str == NULL) {
+ fail_fn("se_info_c_str == NULL");
+ }
+ }
+ const char* se_name_c_str = NULL;
+ ScopedUtfChars* se_name = NULL;
+ if (java_se_name != NULL) {
+ se_name = new ScopedUtfChars(env, java_se_name);
+ se_name_c_str = se_name->c_str();
+ if (se_name_c_str == NULL) {
+ fail_fn("se_name_c_str == NULL");
+ }
+ }
+ rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str);
+ if (rc == -1) {
+ fail_fn(CREATE_ERROR("selinux_android_setcontext(%d, %d, \"%s\", \"%s\") failed", uid,
+ is_system_server, se_info_c_str, se_name_c_str));
+ }
+
+ // Make it easier to debug audit logs by setting the main thread's name to the
+ // nice name rather than "app_process".
+ if (se_name_c_str == NULL && is_system_server) {
+ se_name_c_str = "system_server";
+ }
+ if (se_name_c_str != NULL) {
+ SetThreadName(se_name_c_str);
+ }
+
+ delete se_info;
+ delete se_name;
+
+ // Unset the SIGCHLD handler, but keep ignoring SIGHUP (rationale in SetSignalHandlers).
+ UnsetChldSignalHandler();
+
+ env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, runtime_flags,
+ is_system_server, is_child_zygote, instructionSet);
+ if (env->ExceptionCheck()) {
+ fail_fn("Error calling post fork hooks.");
+ }
+}
+
// Utility routine to fork zygote and specialize the child process.
-static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
- jint runtime_flags, jobjectArray javaRlimits,
- jlong permittedCapabilities, jlong effectiveCapabilities,
- jint mount_external,
- jstring java_se_info, jstring java_se_name,
- bool is_system_server, jintArray fdsToClose,
- jintArray fdsToIgnore, bool is_child_zygote,
- jstring instructionSet, jstring dataDir) {
+static pid_t ForkCommon(JNIEnv* env, jstring java_se_name, bool is_system_server,
+ jintArray fdsToClose, jintArray fdsToIgnore) {
SetSignalHandlers();
+ // Block SIGCHLD prior to fork.
sigset_t sigchld;
sigemptyset(&sigchld);
sigaddset(&sigchld, SIGCHLD);
@@ -602,6 +796,7 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra
pid_t pid = fork();
if (pid == 0) {
+ // The child process.
PreApplicationInit();
// Clean up any descriptors which must be closed immediately
@@ -614,167 +809,11 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra
if (!gOpenFdTable->ReopenOrDetach(&error_msg)) {
fail_fn(error_msg);
}
+ }
- if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) {
- fail_fn(CREATE_ERROR("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)));
- }
-
- // Keep capabilities across UID change, unless we're staying root.
- if (uid != 0) {
- if (!EnableKeepCapabilities(&error_msg)) {
- fail_fn(error_msg);
- }
- }
-
- if (!SetInheritable(permittedCapabilities, &error_msg)) {
- fail_fn(error_msg);
- }
- if (!DropCapabilitiesBoundingSet(&error_msg)) {
- fail_fn(error_msg);
- }
-
- bool use_native_bridge = !is_system_server && (instructionSet != NULL)
- && android::NativeBridgeAvailable();
- if (use_native_bridge) {
- ScopedUtfChars isa_string(env, instructionSet);
- use_native_bridge = android::NeedsNativeBridge(isa_string.c_str());
- }
- if (use_native_bridge && dataDir == NULL) {
- // dataDir should never be null if we need to use a native bridge.
- // In general, dataDir will never be null for normal applications. It can only happen in
- // special cases (for isolated processes which are not associated with any app). These are
- // launched by the framework and should not be emulated anyway.
- use_native_bridge = false;
- ALOGW("Native bridge will not be used because dataDir == NULL.");
- }
-
- if (!MountEmulatedStorage(uid, mount_external, use_native_bridge, &error_msg)) {
- ALOGW("Failed to mount emulated storage: %s (%s)", error_msg.c_str(), strerror(errno));
- if (errno == ENOTCONN || errno == EROFS) {
- // When device is actively encrypting, we get ENOTCONN here
- // since FUSE was mounted before the framework restarted.
- // When encrypted device is booting, we get EROFS since
- // FUSE hasn't been created yet by init.
- // In either case, continue without external storage.
- } else {
- fail_fn(error_msg);
- }
- }
-
- // If this zygote isn't root, it won't be able to create a process group,
- // since the directory is owned by root.
- if (!is_system_server && getuid() == 0) {
- int rc = createProcessGroup(uid, getpid());
- if (rc != 0) {
- if (rc == -EROFS) {
- ALOGW("createProcessGroup failed, kernel missing CONFIG_CGROUP_CPUACCT?");
- } else {
- ALOGE("createProcessGroup(%d, %d) failed: %s", uid, pid, strerror(-rc));
- }
- }
- }
-
- std::string error_msg;
- if (!SetGids(env, javaGids, &error_msg)) {
- fail_fn(error_msg);
- }
-
- if (!SetRLimits(env, javaRlimits, &error_msg)) {
- fail_fn(error_msg);
- }
-
- if (use_native_bridge) {
- ScopedUtfChars isa_string(env, instructionSet);
- ScopedUtfChars data_dir(env, dataDir);
- android::PreInitializeNativeBridge(data_dir.c_str(), isa_string.c_str());
- }
-
- int rc = setresgid(gid, gid, gid);
- if (rc == -1) {
- fail_fn(CREATE_ERROR("setresgid(%d) failed: %s", gid, strerror(errno)));
- }
-
- // Must be called when the new process still has CAP_SYS_ADMIN, in this case, before changing
- // uid from 0, which clears capabilities. The other alternative is to call
- // prctl(PR_SET_NO_NEW_PRIVS, 1) afterward, but that breaks SELinux domain transition (see
- // b/71859146). As the result, privileged syscalls used below still need to be accessible in
- // app process.
- SetUpSeccompFilter(uid);
-
- rc = setresuid(uid, uid, uid);
- if (rc == -1) {
- fail_fn(CREATE_ERROR("setresuid(%d) failed: %s", uid, strerror(errno)));
- }
-
- if (NeedsNoRandomizeWorkaround()) {
- // Work around ARM kernel ASLR lossage (http://b/5817320).
- int old_personality = personality(0xffffffff);
- int new_personality = personality(old_personality | ADDR_NO_RANDOMIZE);
- if (new_personality == -1) {
- ALOGW("personality(%d) failed: %s", new_personality, strerror(errno));
- }
- }
-
- if (!SetCapabilities(permittedCapabilities, effectiveCapabilities, permittedCapabilities,
- &error_msg)) {
- fail_fn(error_msg);
- }
-
- if (!SetSchedulerPolicy(&error_msg)) {
- fail_fn(error_msg);
- }
-
- const char* se_info_c_str = NULL;
- ScopedUtfChars* se_info = NULL;
- if (java_se_info != NULL) {
- se_info = new ScopedUtfChars(env, java_se_info);
- se_info_c_str = se_info->c_str();
- if (se_info_c_str == NULL) {
- fail_fn("se_info_c_str == NULL");
- }
- }
- const char* se_name_c_str = NULL;
- ScopedUtfChars* se_name = NULL;
- if (java_se_name != NULL) {
- se_name = new ScopedUtfChars(env, java_se_name);
- se_name_c_str = se_name->c_str();
- if (se_name_c_str == NULL) {
- fail_fn("se_name_c_str == NULL");
- }
- }
- rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str);
- if (rc == -1) {
- fail_fn(CREATE_ERROR("selinux_android_setcontext(%d, %d, \"%s\", \"%s\") failed", uid,
- is_system_server, se_info_c_str, se_name_c_str));
- }
-
- // Make it easier to debug audit logs by setting the main thread's name to the
- // nice name rather than "app_process".
- if (se_name_c_str == NULL && is_system_server) {
- se_name_c_str = "system_server";
- }
- if (se_name_c_str != NULL) {
- SetThreadName(se_name_c_str);
- }
-
- delete se_info;
- delete se_name;
-
- // Unset the SIGCHLD handler, but keep ignoring SIGHUP (rationale in SetSignalHandlers).
- UnsetChldSignalHandler();
-
- env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, runtime_flags,
- is_system_server, is_child_zygote, instructionSet);
- if (env->ExceptionCheck()) {
- fail_fn("Error calling post fork hooks.");
- }
- } else if (pid > 0) {
- // the parent process
-
- // We blocked SIGCHLD prior to a fork, we unblock it here.
- if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) {
- fail_fn(CREATE_ERROR("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)));
- }
+ // We blocked SIGCHLD prior to a fork, we unblock it here.
+ if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) {
+ fail_fn(CREATE_ERROR("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)));
}
return pid;
}
@@ -861,22 +900,27 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(
// available.
capabilities &= GetEffectiveCapabilityMask(env);
- return ForkAndSpecializeCommon(env, uid, gid, gids, runtime_flags,
- rlimits, capabilities, capabilities, mount_external, se_info,
- se_name, false, fdsToClose, fdsToIgnore, is_child_zygote == JNI_TRUE,
- instructionSet, appDataDir);
+ pid_t pid = ForkCommon(env, se_name, false, fdsToClose, fdsToIgnore);
+ if (pid == 0) {
+ SpecializeCommon(env, uid, gid, gids, runtime_flags, rlimits,
+ capabilities, capabilities,
+ mount_external, se_info, se_name, false,
+ is_child_zygote == JNI_TRUE, instructionSet, appDataDir);
+ }
+ return pid;
}
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
jint runtime_flags, jobjectArray rlimits, jlong permittedCapabilities,
jlong effectiveCapabilities) {
- pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,
- runtime_flags, rlimits,
- permittedCapabilities, effectiveCapabilities,
- MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
- NULL, false, NULL, NULL);
- if (pid > 0) {
+ pid_t pid = ForkCommon(env, NULL, true, NULL, NULL);
+ if (pid == 0) {
+ SpecializeCommon(env, uid, gid, gids, runtime_flags, rlimits,
+ permittedCapabilities, effectiveCapabilities,
+ MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true,
+ false, NULL, NULL);
+ } else if (pid > 0) {
// The zygote process checks whether the child process has died or not.
ALOGI("System server process %d has been created", pid);
gSystemServerPid = pid;
@@ -889,12 +933,16 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer(
RuntimeAbort(env, __LINE__, "System server process has died. Restarting Zygote!");
}
- // Assign system_server to the correct memory cgroup.
- // Not all devices mount /dev/memcg so check for the file first
- // to avoid unnecessarily printing errors and denials in the logs.
- if (!access("/dev/memcg/system/tasks", F_OK) &&
+ bool low_ram_device = GetBoolProperty("ro.config.low_ram", false);
+ bool per_app_memcg = GetBoolProperty("ro.config.per_app_memcg", low_ram_device);
+ if (per_app_memcg) {
+ // Assign system_server to the correct memory cgroup.
+ // Not all devices mount /dev/memcg so check for the file first
+ // to avoid unnecessarily printing errors and denials in the logs.
+ if (!access("/dev/memcg/system/tasks", F_OK) &&
!WriteStringToFile(StringPrintf("%d", pid), "/dev/memcg/system/tasks")) {
- ALOGE("couldn't write %d to /dev/memcg/system/tasks", pid);
+ ALOGE("couldn't write %d to /dev/memcg/system/tasks", pid);
+ }
}
}
return pid;
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index 3aea3a767f46..5f6b6cc49f7e 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -71,6 +71,12 @@ message IncidentProto {
(section).args = "getprop"
];
+ optional string kernel_version = 1002 [
+ (section).type = SECTION_FILE,
+ (section).args = "/proc/version",
+ (privacy).dest = DEST_AUTOMATIC
+ ];
+
// Device Logs
optional android.util.EventLogTagMapProto event_log_tag_map = 1100 [
(section).type = SECTION_FILE,
@@ -162,7 +168,6 @@ message IncidentProto {
optional CpuFreqProto cpu_freq = 2004 [
(section).type = SECTION_FILE,
- (section).device_specific = true,
(section).args = "/sys/devices/system/cpu/cpufreq/all_time_in_state"
];
@@ -173,7 +178,6 @@ message IncidentProto {
optional BatteryTypeProto battery_type = 2006 [
(section).type = SECTION_FILE,
- (section).device_specific = true,
(section).args = "/sys/class/power_supply/bms/battery_type"
];
@@ -184,7 +188,7 @@ message IncidentProto {
];
// System Services
- optional com.android.server.fingerprint.FingerprintServiceDumpProto fingerprint = 3000 [
+ optional com.android.server.biometrics.fingerprint.FingerprintServiceDumpProto fingerprint = 3000 [
(section).type = SECTION_DUMPSYS,
(section).args = "fingerprint --proto --incident"
];
diff --git a/core/proto/android/os/system_properties.proto b/core/proto/android/os/system_properties.proto
index 8bf3772a6a5d..c5f7d0e67f33 100644
--- a/core/proto/android/os/system_properties.proto
+++ b/core/proto/android/os/system_properties.proto
@@ -434,7 +434,7 @@ message SystemPropertiesProto {
optional Product product = 32;
optional int32 property_service_version = 33;
- optional string retaildemo_video_path = 34;
+ reserved 34; // Removed retaildemo_video_path.
optional string revision = 35;
optional int32 sf_lcd_density = 36;
optional bool storage_manager_enabled = 37;
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index 99f303431055..04e5658be5a0 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -600,14 +600,17 @@ message GlobalSettingsProto {
}
optional Ntp ntp = 84;
- // Details about the User Absent, Radios Off feature.
- message UserAbsentRadiosOff {
+ // Details about the User Absent For Small Battery feature.
+ message UserAbsentSmallBattery {
option (android.msg_privacy).dest = DEST_EXPLICIT;
- // Whether or not to enable the User Absent, Radios Off feature on small battery devices.
- optional SettingProto enabled_for_small_battery = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Whether or not to enable the User Absent, Radios Off feature
+ optional SettingProto radios_off_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ // Whether or not to enable the User Absent, Touch Off feature
+ optional SettingProto touch_off_enabled = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
}
- optional UserAbsentRadiosOff user_absent_radios_off = 85;
+ optional UserAbsentSmallBattery user_absent_small_battery = 85;
// Whether to disable the automatic scheduling of system updates.
optional SettingProto ota_disable_automatic_update = 86 [ (android.privacy).dest = DEST_AUTOMATIC ];
diff --git a/core/proto/android/server/face.proto b/core/proto/android/server/face.proto
new file mode 100644
index 000000000000..6ecf3289b588
--- /dev/null
+++ b/core/proto/android/server/face.proto
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package com.android.server.biometrics.face;
+
+import "frameworks/base/libs/incident/proto/android/privacy.proto";
+
+option java_multiple_files = true;
+option java_outer_classname = "FaceServiceProto";
+
+message FaceServiceDumpProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Each log may include multiple user_id for different users.
+ repeated FaceUserStatsProto users = 1;
+}
+
+message FaceUserStatsProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Refer to the UserHandle documentation.
+ optional int32 user_id = 1;
+
+ // The number of faces registered to this user.
+ optional int32 num_faces = 2;
+
+ // Normal face authentications stats (e.g. lockscreen).
+ optional FaceActionStatsProto normal = 3;
+
+ // Crypto authentications (e.g. to unlock password storage, make secure
+ // purchases, etc).
+ optional FaceActionStatsProto crypto = 4;
+}
+
+message FaceActionStatsProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Number of accepted faces.
+ optional int32 accept = 1;
+
+ // Number of rejected faces.
+ optional int32 reject = 2;
+
+ // Total number of acquisitions. Should be >= accept+reject due to poor
+ // image acquisition in some cases (too high, too low, poor gaze, etc.)
+ optional int32 acquire = 3;
+
+ // Total number of lockouts.
+ optional int32 lockout = 4;
+
+ // Total number of permanent lockouts.
+ optional int32 lockout_permanent = 5;
+}
diff --git a/core/proto/android/server/fingerprint.proto b/core/proto/android/server/fingerprint.proto
index 2a7fbc3a7063..c5eb85c5d17b 100644
--- a/core/proto/android/server/fingerprint.proto
+++ b/core/proto/android/server/fingerprint.proto
@@ -15,7 +15,7 @@
*/
syntax = "proto2";
-package com.android.server.fingerprint;
+package com.android.server.biometrics.fingerprint;
import "frameworks/base/libs/incident/proto/android/privacy.proto";
@@ -46,7 +46,7 @@ message FingerprintUserStatsProto {
optional PerformanceStatsProto crypto = 4;
}
-// A com.android.server.fingerprint.FingerpintService.PerformanceStats object.
+// A com.android.server.biometrics.fingerprint.FingerpintService.PerformanceStats object.
message PerformanceStatsProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index 7467d8f2e961..2de53b97312a 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -319,6 +319,8 @@ message WindowStateProto {
optional bool removed = 36;
optional bool is_on_screen = 37;
optional bool is_visible = 38;
+ optional bool pending_forced_seamless_rotation = 39;
+ optional int64 finished_forced_seamless_rotation_frame = 40;
}
message IdentifierProto {
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index c36371004c35..9f58611397f9 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -278,6 +278,8 @@ message UsbUserSettingsManagerProto {
optional int32 user_id = 1;
repeated UsbSettingsDevicePermissionProto device_permissions = 2;
repeated UsbSettingsAccessoryPermissionProto accessory_permissions = 3;
+ repeated UsbDeviceAttachedActivities device_attached_activities = 4;
+ repeated UsbAccessoryAttachedActivities accessory_attached_activities = 5;
}
message UsbSettingsDevicePermissionProto {
@@ -343,3 +345,17 @@ message UsbAccessoryFilterProto {
optional string model = 2;
optional string version = 3;
}
+
+message UsbDeviceAttachedActivities {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional android.content.ComponentNameProto activity = 1;
+ repeated UsbDeviceFilterProto filters = 2;
+}
+
+message UsbAccessoryAttachedActivities {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional android.content.ComponentNameProto activity = 1;
+ repeated UsbAccessoryFilterProto filters = 2;
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 02aebad17ac8..e1493e985650 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -264,6 +264,7 @@
<protected-broadcast android:name="android.intent.action.HEADSET_PLUG" />
<protected-broadcast android:name="android.media.action.HDMI_AUDIO_PLUG" />
+ <protected-broadcast android:name="android.media.action.MICROPHONE_MUTE_CHANGED" />
<protected-broadcast android:name="android.media.AUDIO_BECOMING_NOISY" />
<protected-broadcast android:name="android.media.RINGER_MODE_CHANGED" />
@@ -628,6 +629,8 @@
<protected-broadcast android:name="android.app.action.AFFILIATED_PROFILE_TRANSFER_OWNERSHIP_COMPLETE" />
<protected-broadcast android:name="android.app.action.DATA_SHARING_RESTRICTION_CHANGED" />
<protected-broadcast android:name="android.app.action.STATSD_STARTED" />
+ <protected-broadcast android:name="com.android.server.biometrics.fingerprint.ACTION_LOCKOUT_RESET" />
+ <protected-broadcast android:name="com.android.server.biometrics.face.ACTION_LOCKOUT_RESET" />
<!-- For IdleController -->
<protected-broadcast android:name="android.intent.action.DOCK_IDLE" />
@@ -760,7 +763,7 @@
android:description="@string/permdesc_receiveMms"
android:protectionLevel="dangerous" />
- <!-- Allows an application to read previously received cell broadcast
+ <!-- @TestApi Allows an application to read previously received cell broadcast
messages and to register a content observer to get notifications when
a cell broadcast has been received and added to the database. For
emergency alerts, the database is updated immediately after the
@@ -851,6 +854,9 @@
android:label="@string/permgrouplab_location"
android:description="@string/permgroupdesc_location"
android:request="@string/permgrouprequest_location"
+ android:requestDetail="@string/permgrouprequestdetail_location"
+ android:backgroundRequest="@string/permgroupbackgroundrequest_location"
+ android:backgroundRequestDetail="@string/permgroupbackgroundrequestdetail_location"
android:priority="400" />
<!-- Allows an app to access precise location.
@@ -861,6 +867,7 @@
android:permissionGroup="android.permission-group.LOCATION"
android:label="@string/permlab_accessFineLocation"
android:description="@string/permdesc_accessFineLocation"
+ android:backgroundPermission="android.permission.ACCESS_BACKGROUND_LOCATION"
android:protectionLevel="dangerous|instant" />
<!-- Allows an app to access approximate location.
@@ -871,6 +878,20 @@
android:permissionGroup="android.permission-group.LOCATION"
android:label="@string/permlab_accessCoarseLocation"
android:description="@string/permdesc_accessCoarseLocation"
+ android:backgroundPermission="android.permission.ACCESS_BACKGROUND_LOCATION"
+ android:protectionLevel="dangerous|instant" />
+
+ <!-- Allows an app to access location in the background. If you
+ are requesting this, you should also request {@link #ACCESS_FINE_LOCATION}.
+ Requesting this by itself is not sufficient to give you
+ location access.
+ <p>Protection level: dangerous
+ @hide
+ -->
+ <permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"
+ android:permissionGroup="android.permission-group.LOCATION"
+ android:label="@string/permlab_accessBackgroundLocation"
+ android:description="@string/permdesc_accessBackgroundLocation"
android:protectionLevel="dangerous|instant" />
<!-- ====================================================================== -->
@@ -1354,7 +1375,7 @@
This should only be used by HDMI-CEC service.
-->
<permission android:name="android.permission.HDMI_CEC"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged|vendorPrivileged" />
<!-- @SystemApi Allows an application to use location features in hardware,
such as the geofencing api.
@@ -1735,7 +1756,7 @@
@hide This should only be used by OEM's TvInputService's.
-->
<permission android:name="android.permission.TV_INPUT_HARDWARE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged|vendorPrivileged" />
<!-- @SystemApi Allows to capture a frame of TV input hardware such as
built-in tuners and HDMI-in's.
@@ -2273,7 +2294,8 @@
android:description="@string/permdesc_install_shortcut"
android:protectionLevel="normal"/>
- <!--This permission is no longer supported.
+ <!-- <p class="caution"><strong>Don't use this permission in your app.</strong><br>This
+ permission is no longer supported.
-->
<permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"
android:label="@string/permlab_uninstall_shortcut"
@@ -2450,7 +2472,8 @@
<permission android:name="android.permission.ASEC_RENAME"
android:protectionLevel="signature" />
- <!-- @SystemApi Allows applications to write the apn settings.
+ <!-- @SystemApi Allows applications to write the apn settings and read sensitive fields of
+ an existing apn settings like user and password.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WRITE_APN_SETTINGS"
android:protectionLevel="signature|privileged" />
@@ -3059,6 +3082,15 @@
<permission android:name="android.permission.INSTALL_PACKAGE_UPDATES"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an application to install existing system packages. This is a limited
+ version of {@link android.Manifest.permission#INSTALL_PACKAGES}.
+ <p>Not for use by third-party applications.
+ TODO(b/80204953): remove this permission once we have a long-term solution.
+ @hide
+ -->
+ <permission android:name="com.android.permission.INSTALL_EXISTING_PACKAGES"
+ android:protectionLevel="signature|privileged" />
+
<!-- @SystemApi Allows an application to clear user data.
<p>Not for use by third-party applications
@hide
@@ -3387,7 +3419,7 @@
<permission android:name="android.permission.OBSERVE_APP_USAGE"
android:protectionLevel="signature|privileged" />
- <!-- @hide @SystemApi Allows an application to change the app idle state of an app.
+ <!-- @hide @TestApi @SystemApi Allows an application to change the app idle state of an app.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_APP_IDLE_STATE"
android:protectionLevel="signature|privileged" />
@@ -3613,7 +3645,7 @@
<permission android:name="android.permission.UPDATE_LOCK"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows an application to read the current set of notifications, including
+ <!-- @SystemApi @TestApi Allows an application to read the current set of notifications, including
any metadata and intents attached.
@hide -->
<permission android:name="android.permission.ACCESS_NOTIFICATIONS"
@@ -3651,6 +3683,14 @@
<permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT"
android:protectionLevel="signature" />
+ <!-- Allows managing (adding, removing) facial templates. Reserved for the system. @hide -->
+ <permission android:name="android.permission.MANAGE_FACE"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- Allows an app to reset face authentication attempt counter. Reserved for the system. @hide -->
+ <permission android:name="android.permission.RESET_FACE_LOCKOUT"
+ android:protectionLevel="signature" />
+
<!-- Allows an application to control keyguard. Only allowed for system processes.
@hide -->
<permission android:name="android.permission.CONTROL_KEYGUARD"
@@ -4011,6 +4051,11 @@
<permission android:name="android.permission.DISABLE_HIDDEN_API_CHECKS"
android:protectionLevel="signature" />
+ <!-- Allows an application to read emergency info name.
+ @hide <p>Not for use by third-party applications. -->
+ <permission android:name="com.android.emergency.permission.READ_EMERGENCY_INFO_NAME"
+ android:protectionLevel="signature" />
+
<application android:process="system"
android:persistent="true"
android:hasCode="false"
@@ -4322,21 +4367,6 @@
</intent-filter>
</receiver>
- <receiver android:name="com.android.server.stats.StatsCompanionService$AnomalyAlarmReceiver"
- android:permission="android.permission.STATSCOMPANION"
- android:exported="false">
- </receiver>
-
- <receiver android:name="com.android.server.stats.StatsCompanionService$PullingAlarmReceiver"
- android:permission="android.permission.STATSCOMPANION"
- android:exported="false">
- </receiver>
-
- <receiver android:name="com.android.server.stats.StatsCompanionService$PeriodicAlarmReceiver"
- android:permission="android.permission.STATSCOMPANION"
- android:exported="false">
- </receiver>
-
<service android:name="android.hardware.location.GeofenceHardwareService"
android:permission="android.permission.LOCATION_HARDWARE"
android:exported="false" />
diff --git a/core/res/res/anim/lock_screen_behind_enter_fade_in.xml b/core/res/res/anim/lock_screen_behind_enter_fade_in.xml
index e9475f52d22a..ff95aeae1683 100644
--- a/core/res/res/anim/lock_screen_behind_enter_fade_in.xml
+++ b/core/res/res/anim/lock_screen_behind_enter_fade_in.xml
@@ -16,7 +16,6 @@
-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:background="#ff000000"
android:detachWallpaper="true"
android:shareInterpolator="false"
android:interpolator="@interpolator/linear"
diff --git a/core/res/res/drawable-hdpi/ic_grayedout_printer.png b/core/res/res/drawable-hdpi/ic_grayedout_printer.png
deleted file mode 100644
index 5e54970d6b3f..000000000000
--- a/core/res/res/drawable-hdpi/ic_grayedout_printer.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_grayedout_printer.png b/core/res/res/drawable-mdpi/ic_grayedout_printer.png
deleted file mode 100644
index 5e54970d6b3f..000000000000
--- a/core/res/res/drawable-mdpi/ic_grayedout_printer.png
+++ /dev/null
Binary files differ
diff --git a/core/java/android/os/BatteryProperties.aidl b/core/res/res/drawable-watch/toast_frame.xml
index 31fa7b80181f..60129a2086fd 100644
--- a/core/java/android/os/BatteryProperties.aidl
+++ b/core/res/res/drawable-watch/toast_frame.xml
@@ -1,5 +1,6 @@
-/*
-** Copyright 2013, The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* Copyright 2018, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
@@ -13,7 +14,11 @@
** See the License for the specific language governing permissions and
** limitations under the License.
*/
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <!-- background is material_grey_700 with .9 alpha -->
+ <solid android:color="#E65F6368" />
+ <corners android:radius="24dp" />
+</shape>
-package android.os;
-
-parcelable BatteryProperties;
diff --git a/core/res/res/drawable-xhdpi/ic_grayedout_printer.png b/core/res/res/drawable-xhdpi/ic_grayedout_printer.png
deleted file mode 100644
index 5e54970d6b3f..000000000000
--- a/core/res/res/drawable-xhdpi/ic_grayedout_printer.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/layout-watch/transient_notification.xml b/core/res/res/layout-watch/transient_notification.xml
new file mode 100644
index 000000000000..aeae699eaa7d
--- /dev/null
+++ b/core/res/res/layout-watch/transient_notification.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2018, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingHorizontal="@dimen/screen_percentage_05"
+ android:orientation="vertical">
+ <TextView
+ android:id="@android:id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:minHeight="48dp"
+ android:paddingHorizontal="16dp"
+ android:paddingVertical="8dp"
+ android:gravity="center"
+ android:textAppearance="@style/TextAppearance.Toast"
+ android:background="?android:attr/toastFrameBackground"
+ />
+</LinearLayout> \ No newline at end of file
diff --git a/core/res/res/layout/time_picker_header_material.xml b/core/res/res/layout/time_picker_header_material.xml
index ced17227aa2d..adb2b62f799c 100644
--- a/core/res/res/layout/time_picker_header_material.xml
+++ b/core/res/res/layout/time_picker_header_material.xml
@@ -51,7 +51,7 @@
android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel"
android:importantForAccessibility="no" />
- <!-- The minutes should always be to the left of the separator,
+ <!-- The minutes should always be to the right of the separator,
regardless of the current locale's layout direction. -->
<com.android.internal.widget.NumericTextView
android:id="@+id/minutes"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 41a44bb7ca5f..73db3a1e19c9 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Vliegtuigmodus"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegtuigmodus is AAN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegtuigmodus is AF"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterybespaarder"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterybespaarder is AF"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterybespaarder is AAN"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Instellings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Help"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Stembystand"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Ligging"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"toegang te verkry tot hierdie toestel se ligging"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot hierdie toestel se ligging?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Die program sal net toegang tot die ligging hê terwyl jy die program gebruik."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; altyd toegang tot toestelligging?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Die program sal altyd toegang tot die ligging hê, selfs wanneer jy nie die program gebruik nie."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"by jou kalender in te gaan"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Gee &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot jou kalender?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Hierdie program kan kalendergebeurtenisse op jou foon byvoeg, verwyder of verander. Hierdie program kan boodskappe stuur wat lyk of dit van kalendereienaars af kom of gebeurtenisse verander sonder om hul eienaars in te lig."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Kry toegang tot ekstra liggingverskaffer-bevele"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Gee die program toegang tot ekstra liggingverskaffer-bevele. Dit kan die program dalk toelaat om in te meng met die werking van die GPS of ander liggingbronne."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"verkry toegang tot presiese ligging (GPS- en netwerkgegrond)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Hierdie program kan jou ligging kry op grond van GPS of netwerkhulpbronne soos selfoontorings en Wi-Fi-netwerke. Hierdie liggingdienste moet aangeskakel en op jou foon beskikbaar wees sodat die program hulle kan gebruik. Dit kan batteryverbruik verhoog."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"kry net op die voorgrond toegang tot presiese ligging"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Hierdie program kan jou presiese ligging kry net wanneer dit op die voorgrond is. Hierdie liggingdienste moet aangeskakel wees en op jou foon beskikbaar wees sodat die program hulle kan gebruik. Dit kan veroorsaak dat meer batterykrag gebruik word."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"verkry toegang tot benaderde ligging (netwerkgegrond)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Hierdie program kan jou ligging kry op grond van jou netwerkhulpbronne soos selfoontorings en Wi-Fi-netwerke. Hierdie liggingdienste moet aangeskakel en op jou tablet beskikbaar wees sodat die program hulle kan gebruik."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Hierdie program kan jou ligging kry op grond van jou netwerkhulpbronne soos selfoontorings en Wi-Fi-netwerke. Hierdie liggingdienste moet aangeskakel en op jou TV beskikbaar wees sodat die program hulle kan gebruik."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Hierdie program kan jou ligging kry op grond van jou netwerkhulpbronne soos selfoontorings en Wi-Fi-netwerke. Hierdie liggingdienste moet aangeskakel en op jou foon beskikbaar wees sodat die program hulle kan gebruik."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"kry presiese ligging op die agtergrond"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Hierdie program kan enige tyd terwyl dit op die agtergrond is jou presiese ligging kry. Hierdie liggingdienste moet aangeskakel wees en op jou foon beskikbaar wees sodat die program hulle kan gebruik. Dit kan veroorsaak dat meer batterykrag gebruik word."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"verander jou klankinstellings"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Laat die program toe om globale klankinstellings soos volume en watter luidspreker vir uitvoer gebruik word, te verander."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"neem klank op"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Vingerafdrukikoon"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"bestuur gesigstawinghardeware"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Laat program toe om metodes te benut om gesigtemplate vir gebruik by te voeg en uit te vee."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gebruik gesigstawinghardeware"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Laat die program toe om gesigstawinghardeware vir stawing te gebruik"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kon nie gesig verwerk nie. Probeer weer."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Gesig is te helder. Probeer met minder lig."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Gesig is te donker. Maak ligbron oop."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Beweeg sensor verder weg van gesig af."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Bring sensor nader aan gesig."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Beweeg sensor na bo."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Beweeg sensor na onder."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Beweeg sensor na regs."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Beweeg sensor na links."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Kyk na die sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Geen gesig bespeur nie."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Hou gesig stil voor toestel."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Gesighardeware is nie beskikbaar nie."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Gesiguittelling is bereik. Probeer weer."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Gesig kan nie geberg word nie."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Gesighandeling is gekanselleer."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogings. Probeer later weer."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Te veel pogings. Gesigstawingsensor is gedeaktiveer."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Probeer weer."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Geen gesigte is geregistreer nie."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Hierdie toestel het nie \'n gesigstawingsensor nie"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Gesig <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Gesig-ikoon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lees sinkroniseer-instellings"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Laat die program toe om die sinkroniseringinstellings van \'n rekening te lees. Byvoorbeeld, dit kan bepaal of die People-program met \'n rekening gesinkroniseer is."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"wissel tussen sinkronisasie aan en af"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi het geen internettoegang nie"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tik vir opsies"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Veranderings aan jou warmkolinstellings"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Jou warmkolband het verander."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Hierdie toestel steun nie jou voorkeur vir net 5 GHz nie. Hierdie toestel sal in plaas daarvan die 5 GHz-band gebruik wanneer dit beskikbaar is."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Het oorgeskakel na <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Toestel gebruik <xliff:g id="NEW_NETWORK">%1$s</xliff:g> wanneer <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> geen internettoegang het nie. Heffings kan geld."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Het oorgeskakel van <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Jou administrateur het \'n foutverslag versoek om met die foutsporing van hierdie toestel te help. Programme en data sal dalk gedeel word."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DEEL"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"WEIER"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Verander sleutelbord"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Kies invoermetode"</string>
<string name="show_ime" msgid="2506087537466597099">"Hou dit op die skerm terwyl fisieke sleutelbord aktief is"</string>
<string name="hardware" msgid="194658061510127999">"Wys virtuele sleutelbord"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Stel fisieke sleutelbord op"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 50d44a15f618..400f304cf585 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"የአውሮፕላን ሁነታ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"የአውሮፕላንሁነታ በርቷል"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"የአውሮፕላንሁነታ ጠፍቷል"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"የባትሪ ኃይል ቆጣቢ"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"የባትሪ ኃይል ቆጣቢ ጠፍቷል"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"የባትሪ ኃይል ቆጣቢ በርቷል"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ቅንብሮች"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ደግፍ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"የድምጽ እርዳታ"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"መገኛ አካባቢ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"የዚህን መሣሪያ አካባቢ ይድረሱበት"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; የዚህ መሣሪያ አካባቢን እንዲደርስ ይፈቀድለት?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"መተግበሪያው እርስዎ ሲጠቀሙበት ብቻ ነው የአካባቢው መዳረሻ የሚኖረው።"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ሁልጊዜ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; የዚህ መሣሪያ አካባቢን እንዲደርስ ይፈቀድለት?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"መተግበሪያው ሁልጊዜ የአካባቢው መዳረሽ ይኖረዋል፣ እርስዎ መተግበሪያውን እየተጠቀሙ ባይሆኑም እንኳ።"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ቀን መቁጠሪያ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"የእርስዎን ቀን መቁጠሪያ ይድረሱበት"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ቀን መቁጠሪያዎን እንዲደርስ ይፈቀድለት?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ይህ መተግበሪያ በእርስዎ ስልክ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ተጨማሪ ሥፍራ አቅራቢ ትዕዛዞችን ድረስ።"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"መተግበሪያው ተጨማሪ የአካባቢ አቅራቢ ትእዛዞችን እንዲደርስ ይፈቅድለታል። ይሄ መተግበሪያው በጂፒኤስ ወይም ሌላ የአካባቢ ምንጮች ስራ ላይ ጣልቃ እንዲገባ ሊፈቅድለት ይችላል።"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"ትክክለኛውን አካባቢ መድረስ (በጂፒኤስ እና አውታረ መረብ ላይ የተመሠረተ)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ይህ መተግበሪያ እንደ የሕዋስ ማማዎች እና የWi-Fi አውታረ መረቦች ከመሳሰሉ የአውታረ መረብ ምንጮች ላይ በመመርኮዝ የእርስዎን መገኛ አካባቢ ማግኘት ይችላል። እነዚህ የመገኛ አካባቢ አገልግሎቶች መተግበሪያው መጠቀም እንዲችል ሊበሩ እና በእርስዎ ስልክ ላይ ሊገኙ የሚችሉ መሆን አለባቸው። ይህ የባትሪ ፍጆታን ሊጨምር ይችላል።"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"መዳረሻ ከፊት ለፊት ብቻ ትክክለኛ ነው"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"ይህ መተግበሪያ ከፊት ላይ ሆኖ ሲበራ ብቻ ትክክለኛውን መገኛ አካባቢ ማግኘት ይችላል። እነዚህ የመገኛ አካባቢ አገልግሎቶች መተግበሪያው መጠቀም እንዲችል ሊበሩ እና በእርስዎ ስልክ ላይ ሊገኙ የሚችሉ መሆን አለባቸው።"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ግምታዊ አካባቢን መድረስ (በአውታረ መረብ ላይ የተመሰረተ)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ይህ መተግበሪያ እንደ የሕዋስ ማማዎች እና የWi-Fi አውታረ መረቦች ከመሳሰሉ የአውታረ መረብ ምንጮች ላይ በመመርኮዝ የእርስዎን መገኛ አካባቢ ማግኘት ይችላል። እነዚህ የመገኛ አካባቢ አገልግሎቶች መተግበሪያው መጠቀም እንዲችል ሊበሩ እና በእርስዎ ጡባዊ ላይ ሊገኙ የሚችሉ መሆን አለባቸው።"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ይህ መተግበሪያ እንደ የሕዋስ ማማዎች እና የWi-Fi አውታረ መረቦች ከመሳሰሉ የአውታረ መረብ ምንጮች ላይ በመመርኮዝ የእርስዎን መገኛ አካባቢ ማግኘት ይችላል። እነዚህ የመገኛ አካባቢ አገልግሎቶች እርስዎ መጠቀም እንዲችሉ ሊበሩ እና በእርስዎ ቴሌቪዥን ላይ ሊገኙ የሚችሉ መሆን አለባቸው።"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ይህ መተግበሪያ እንደ የሕዋስ ማማዎች እና የWi-Fi አውታረ መረቦች ከመሳሰሉ የአውታረ መረብ ምንጮች ላይ በመመርኮዝ የእርስዎን መገኛ አካባቢ ማግኘት ይችላል። እነዚህ የመገኛ አካባቢ አገልግሎቶች መተግበሪያው መጠቀም እንዲችል ሊበሩ እና በእርስዎ ስልክ ላይ ሊገኙ የሚችሉ መሆን አለባቸው።"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"በበስተጀርባ ትክክለኛ መገኛ አካባቢ ላይ ድረስ"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"ይህ መተግበሪያ በማናቸውም ጊዜ በበስተጀርባ ሲሆን ብቻ ትክክለኛውን መገኛ አካባቢ ማግኘት ይችላል። እነዚህ የመገኛ አካባቢ አገልግሎቶች መተግበሪያው መጠቀም እንዲችል ሊበሩ እና በእርስዎ ስልክ ላይ ሊገኙ የሚችሉ መሆን አለባቸው።"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"የድምፅ ቅንብሮችን ለውጥ"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"መተግበሪያው አንደ የድምጽ መጠን እና ለውጽአት የትኛውን የድምጽ ማጉያ ጥቅም ላይ እንደዋለ የመሳሰሉ ሁለንተናዊ የድምጽ ቅንብሮችን እንዲያስተካክል ይፈቅድለታል።"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ኦዲዮ ይቅዱ"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"የጣት አሻራ አዶ"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"የማረጋገጫ ሃርድዌር ፊትን ያስተዳድሩ"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"የፊት ማረጋገጫ ሃርድዌር ይጠቀሙ"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"መተግበሪያው የማረጋገጫ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ፊትን መሥራት አልተቻለም። እባክዎ እንደገና ይሞክሩ።"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ፊት ከልክ በላይ ብሩህ ነው። እባክዎ በዝቅተኛ ብርሃን ውስጥ ይሞክሩት።"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ፊት ከልክ በላይ ጨለም ያለ ነው። እባክዎ የብርሃን ምንጩን ይግለጹት።"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"እባክዎ ዳሳሹን ከፊት አሁንም ያርቁት።"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"እባክዎ ዳሳሹን ወደ ፊት ያስጠጉት።"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"እባክዎ ዳሳሽን ከፍ ያድርጉት።"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"እባክዎ ዳሳሽን ዝቅ ያድርጉት።"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"እባክዎ ዳስሽን ወደ ቀኝ ያንቀሳቅሱት።"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"እባክዎ ዳስሽን ወደ ግራ ያንቀሳቅሱት።"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"እባክዎ ዳሳሹ ላይ ይመልከቱ።"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"ምንም መልክ አልተገኘም።"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ፊትዎትን ከመሣሪያው ፊት ለፊት ሳያነቃንቁ ያቆዩት።"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"የፊት ሃርድዌር አይገኝም።"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"የፊት ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"ፊት ሊከማች አይችልም።"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"የፊት ሥርዓተ ክወና ተሰርዟል።"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"በጣም ብዙ ሙከራዎች። የፊት ማረጋገጫ ተሰናክሏል።"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"እንደገና ይሞክሩ።"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"ምንም ፊት አልተመዘገበም።"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ይህ መሣሪያ የፊት ማረጋገጫ ዳሳሽ የለውም"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"ፊት <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"የፊት አዶ"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"የሥምሪያ ቅንብሮች አንብብ"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"መተግበሪያው የአንድ መለያ የማመሳሰል ቅንብሮችን እንዲያነብ ይፈቅድለታል። ለምሳሌ ይህ የሰዎች መተግበሪያ ከመለያ ጋር መመሳሰሉን አለመመሳሰሉን ሊወስን ይችላል።"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ማመሳሰያ በማብራትና በማጥፋት መካከል ቀያይር"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi በይነመረብ መዳረሻ የለውም"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ለአማራጮች መታ ያድርጉ"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"በእርስዎ ሆትስፖት ቅንብሮች ላይ ለውጦች"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"የእርስዎ ሆትስፖት ባንድ ተለውጧል።"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ይህ መሣሪያ የእርስዎን ምርጫ ለ5GHz ብቻ አይደግፍም። በምትኩ፣ ይህ መሣሪያ ሲገኝ 5GHz ባንድ ይጠቀማል።"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"ወደ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ተቀይሯል"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ምንም ዓይነት የበይነመረብ ግንኙነት በማይኖረው ጊዜ መሣሪያዎች <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ን ይጠቀማሉ። ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ።"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"ከ<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ወደ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ተቀይሯል"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"የእርስዎ አስተዳዳሪ ለዚህ መሣሪያ መላ ለመፈለግ የሳንካ ሪፖርት ጠይቀዋል። መተግበሪያዎች እና ውሂብ ሊጋሩ ይችላሉ።"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"አጋራ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"አትቀበል"</string>
- <string name="select_input_method" msgid="8547250819326693584">"ቁልፍ ሰሌዳ ይቀይሩ"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"የግቤት ስልት ምረጥ"</string>
<string name="show_ime" msgid="2506087537466597099">"አካላዊ የቁልፍ ሰሌዳ ገቢር ሆኖ ሳለ በማያ ገጽ ላይ አቆየው"</string>
<string name="hardware" msgid="194658061510127999">"ምናባዊ የቁልፍ ሰሌዳን አሳይ"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"አካላዊ ቁልፍ ሰሌዳን ያዋቅሩ"</string>
@@ -1789,7 +1825,7 @@
<string name="work_mode_turn_on" msgid="2062544985670564875">"አብራ"</string>
<string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ይህ መተግበሪያ ለቆየ የAndroid ስሪት ነው የተገነባው፣ እና በአግባቡ ላይሰራ ይችላል። ዝማኔዎች ካሉ ለመመልከት ይሞክሩ፣ ወይም ደግሞ ገንቢውን ያነጋግሩ።"</string>
<string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"ዝማኔ ካለ አረጋግጥ"</string>
- <string name="new_sms_notification_title" msgid="8442817549127555977">"አዲስ መልእክቶች አለዎት"</string>
+ <string name="new_sms_notification_title" msgid="8442817549127555977">"አዲስ መልዕክቶች አለዎት"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"ለመመልከት የኤስኤምኤስ መተግበሪያ ይክፈቱ"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"አንዳንድ ተግባሮች የተገደቡ ሊሆኑ ይችላሉ"</string>
<string name="user_encrypted_message" msgid="4923292604515744267">"ለመክፈት መታ ያድርጉ"</string>
@@ -1846,7 +1882,7 @@
<string name="etws_primary_default_message_earthquake" msgid="5541962250262769193">"ረጋ ይበሉና በአቅራቢያ ያለ መጠለያ ይፈልጉ።"</string>
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"ወዲያውኑ ከባህር ዳርቻ አካባቢዎች እና የወንዝ ዳርቻ አካባቢዎች ይውጡና እንደ ከፍ ያለ መሬት ያሉ ከአደጋ የተሻለ ደህንነት ወዳቸው ቦታዎች ይሂዱ።"</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"ረጋ ይበሉና በአቅራቢያ ያለ መጠለያ ይፈልጉ።"</string>
- <string name="etws_primary_default_message_test" msgid="2709597093560037455">"የአስቸኳይ አደጋ መልእክቶች ሙከራ"</string>
+ <string name="etws_primary_default_message_test" msgid="2709597093560037455">"የአስቸኳይ አደጋ መልዕክቶች ሙከራ"</string>
<string name="notification_reply_button_accessibility" msgid="3621714652387814344">"ምላሽ ስጥ"</string>
<string name="etws_primary_default_message_others" msgid="6293148756130398971"></string>
<string name="mmcc_authentication_reject" msgid="5767701075994754356">"ሲም ለድምጽ አይፈቀድም"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 70eea9b17c74..14700131ba4e 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -248,9 +248,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"وضع الطائرة"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"وضع الطائرة قيد التشغيل"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"وضع الطائرة متوقف"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"توفير شحن البطارية"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"توفير شحن البطارية غير مفعّل"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"توفير شحن البطارية مفعّل"</string>
<string name="global_action_settings" msgid="1756531602592545966">"الإعدادات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"مساعدة"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"المساعد الصوتي"</string>
@@ -288,6 +285,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"الموقع الجغرافي"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"الوصول إلى موقع هذا الجهاز"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إلى الموقع الجغرافي لهذا الجهاز؟"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"لن يكون بإمكان التطبيق الوصول إلى الموقع الجغرافي إلا عند استخدامك لهذا التطبيق."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"‏هل تريد السماح دائمًا لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إلى الموقع الجغرافي لهذا الجهاز؟"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"سيكون بإمكان التطبيق دائمًا الوصول إلى الموقع الجغرافي، حتى عند عدم استخدامك لهذا التطبيق."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"التقويم"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"الوصول تقويمك"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالدخول إلى التقويم؟"</string>
@@ -414,12 +414,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"يمكن لهذا التطبيق إضافة أحداث تقويم أو إزالتها أو تغييرها على الهاتف. كما يمكنه إرسال رسائل يبدو أنها واردة من مالكي التقويم، ويمكنه كذلك تغيير الأحداث بدون إشعار مالكيها."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"الدخول إلى المزيد من أوامر موفر الموقع"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"‏للسماح للتطبيق بالدخول إلى أوامر إضافية لموفر الموقع. قد يتيح هذا للتطبيق التداخل مع تشغيل تقنية نظام تحديد المواقع العالمي (GPS) أو مصادر الموقع الأخرى."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"‏الوصول إلى الموقع الدقيق (استنادًا إلى نظام تحديد المواقع العالمي \"GPS\" والشبكة)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"‏يمكن لهذا التطبيق معرفة موقعك من خلال نظام تحديد المواقع العالمي (GPS) أو مصادر مواقع الشبكات مثل أبراج الجوّال وشبكات Wi-Fi. ويجب تشغيل خدمات المواقع هذه وأن تكون متاحة على الهاتف حتى يتمكن التطبيق من استخدامها. وقد يؤدي هذا إلى زيادة استهلاك طاقة البطارية."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"الوصول إلى الموقع الجغرافي الدقيق في الواجهة الأمامية فقط"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"لا يمكن لهذا التطبيق معرفة موقعك الجغرافي بالضبط إلا عندما يعمل في الخلفية. ويجب تفعيل خدمات الموقع الجغرافي هذه وأن تكون متاحة على الهاتف حتى يتمكن التطبيق من استخدامها. وقد يؤدي هذا إلى زيادة استهلاك طاقة البطارية."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"الوصول إلى الموقع التقريبي (استنادًا إلى الشبكة)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"‏يمكن لهذا التطبيق معرفة موقعك من خلال مصادر الشبكات مثل أبراج الجوّال وشبكات Wi-Fi. ويجب تشغيل خدمات المواقع هذه وأن تكون متاحة على الجهاز اللوحي حتى يتمكن التطبيق من استخدامها."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"‏يمكن لهذا التطبيق معرفة موقعك من خلال مصادر الشبكات مثل أبراج الجوّال وشبكات Wi-Fi. ويجب تشغيل خدمات المواقع هذه وأن تكون متاحة على جهاز التلفزيون حتى يتمكن التطبيق من استخدامها."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"‏يمكن لهذا التطبيق معرفة موقعك من خلال مصادر الشبكات مثل أبراج الجوّال وشبكات Wi-Fi. ويجب تشغيل خدمات المواقع هذه وأن تكون متاحة على الهاتف حتى يتمكن التطبيق من استخدامها."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"الوصول إلى الموقع الجغرافي الدقيق في الخلفية"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"يمكن لهذا التطبيق معرفة موقعك الجغرافي بالضبط في أي وقت يعمل به في الخلفية. ويجب تفعيل خدمات الموقع الجغرافي هذه وأن تكون متاحة على الهاتف حتى يتمكن التطبيق من استخدامها. وقد يؤدي هذا إلى زيادة استهلاك طاقة البطارية."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"تغيير إعداداتك الصوتية"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"للسماح للتطبيق بتعديل إعدادات الصوت العامة مثل مستوى الصوت وأي السماعات يتم استخدامها للاستماع."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"تسجيل الصوت"</string>
@@ -527,6 +529,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"رمز بصمة الإصبع"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"إدارة أجهزة مصادقة الوجه"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"السماح للتطبيق باستدعاء طرق لإضافة نماذج من الوجوه وحذفها"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"استخدام أجهزة مصادقة الوجه"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"السماح للتطبيق باستخدام أجهزة مصادقة الوجه"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"تعذَّر التعرُّف على الوجه. يُرجى إعادة المحاولة."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"الوجه ساطع جدًا. يُرجى إعادة المحاولة بإضاءة أقل."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"الوجه مظلم جدًا. يُرجى الاستعانة بمصدر إضاءة."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"يُرجى إبعاد جهاز الاستشعار عن الوجه."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"يُرجى تقريب جهاز الاستشعار من الوجه."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"يُرجى تحريك جهاز الاستشعار للأعلى."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"يُرجى تحريك جهاز الاستشعار للأسفل."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"يُرجى تحريك جهاز الاستشعار جهة اليمين."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"يُرجى تحريك جهاز الاستشعار جهة اليسار."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"يُرجى النظر إلى جهاز الاستشعار."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"لم يتم رصد أي وجه."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"يُرجى جعل الوجه ثابتًا أمام الجهاز."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"أجهزة مصادقة الوجه غير متاحة."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"انتهت مهلة التعرُّف على الوجه. أعِد المحاولة."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"يتعذَّر حفظ الوجه."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"تمّ إلغاء عملية مصادقة الوجه."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"تمّ إجراء محاولات كثيرة. أعِد المحاولة لاحقًا."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"تمّ إجراء محاولات كثيرة. ميزة مصادقة الوجه متوقفة."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"يُرجى إعادة المحاولة."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"ليس هناك وجه مسجّل."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"لا يحتوي هذا الجهاز على جهاز استشعار مصادقة الوجه."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"الوجه <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"رمز الوجه"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"قراءة إعدادات المزامنة"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"للسماح للتطبيق بقراءة الإعدادات المتزامنة لحساب ما. على سبيل المثال، يمكن أن يؤدي هذا إلى تحديد ما إذا تمت مزامنة تطبيق \"الأشخاص\" مع حساب ما."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"التبديل بين تشغيل المزامنة وإيقافها"</string>
@@ -1188,7 +1221,7 @@
<string name="android_start_title" product="default" msgid="4536778526365907780">"جارٍ بدء تشغيل الهاتف…"</string>
<string name="android_start_title" product="tablet" msgid="4929837533850340472">"جارٍ بدء تشغيل الجهاز اللوحي…"</string>
<string name="android_start_title" product="device" msgid="7467484093260449437">"جارٍ بدء تشغيل الجهاز…"</string>
- <string name="android_upgrading_fstrim" msgid="8036718871534640010">"جارٍ تحسين السعة التخزينية."</string>
+ <string name="android_upgrading_fstrim" msgid="8036718871534640010">"جارٍ تحسين سعة التخزين."</string>
<string name="android_upgrading_notification_title" product="default" msgid="1511552415039349062">"جارٍ إنهاء تحديث النظام…"</string>
<string name="app_upgrading_toast" msgid="3008139776215597053">"جارٍ ترقية <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"جارٍ تحسين التطبيق <xliff:g id="NUMBER_0">%1$d</xliff:g> من <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
@@ -1263,6 +1296,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"‏شبكة Wi-Fi غير متصلة بالإنترنت"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"انقر للحصول على الخيارات."</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"التغييرات التي طرأت على إعدادات نقطة الاتصال"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"تمّ تغيير نطاق نقطة الاتصال الخاصة بك."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"لا يتوافق هذا الجهاز مع إعدادك المفضّل الخاص باستخدام النطاق 5 غيغاهرتز فقط. وسيستخدم الجهاز بدلاً من ذلك النطاق 5 غيغاهرتز عندما يكون متاحًا."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"تم التبديل إلى <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"يستخدم الجهاز <xliff:g id="NEW_NETWORK">%1$s</xliff:g> عندما لا يتوفر اتصال بالإنترنت في شبكة <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>، ويمكن أن يتم فرض رسوم مقابل ذلك."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"تم التبديل من <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> إلى <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1350,7 +1386,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"طلب المشرف الحصول على تقرير خطأ للمساعدة في تحرِّي مشكلة هذا الجهاز وإصلاحها؛ ويمكن أن تتم مشاركة التطبيقات والبيانات."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"مشاركة"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"رفض"</string>
- <string name="select_input_method" msgid="8547250819326693584">"تغيير لوحة المفاتيح"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"اختيار أسلوب الإدخال"</string>
<string name="show_ime" msgid="2506087537466597099">"استمرار عرضها على الشاشة أثناء نشاط لوحة المفاتيح الفعلية"</string>
<string name="hardware" msgid="194658061510127999">"إظهار لوحة المفاتيح الافتراضية"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"تهيئة لوحة المفاتيح الفعلية"</string>
@@ -1530,7 +1566,7 @@
<string name="action_menu_overflow_description" msgid="2295659037509008453">"المزيد من الخيارات"</string>
<string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s، %2$s"</string>
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s، %2$s، %3$s"</string>
- <string name="storage_internal" msgid="3570990907910199483">"السعة التخزينية المشتركة الداخلية"</string>
+ <string name="storage_internal" msgid="3570990907910199483">"سعة التخزين المشتركة الداخلية"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"‏بطاقة SD"</string>
<string name="storage_sd_card_label" msgid="6347111320774379257">"‏بطاقة SD من <xliff:g id="MANUFACTURER">%s</xliff:g>"</string>
<string name="storage_usb_drive" msgid="6261899683292244209">"‏محرك أقراص USB"</string>
@@ -1951,7 +1987,7 @@
<string name="app_category_news" msgid="7496506240743986873">"الأخبار والمجلات"</string>
<string name="app_category_maps" msgid="5878491404538024367">"الخرائط والتنقل"</string>
<string name="app_category_productivity" msgid="3742083261781538852">"الإنتاجية"</string>
- <string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"السعة التخزينية للجهاز"</string>
+ <string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"سعة التخزين للجهاز"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"‏تصحيح أخطاء USB"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"ساعة"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"دقيقة"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 91515e2b63e7..2f9e4442396f 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"এয়াৰপ্লেইন ম\'ড"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"এয়াৰপ্লেইন ম\'ড অন কৰা আছে"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"এয়াৰপ্লেইন ম\'ড অফ কৰা আছে"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"বেটাৰি সঞ্চয়কাৰী"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"বেটাৰি সঞ্চয়কাৰী অফ হৈ আছে"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"বেটাৰি সঞ্চয়কাৰী অন হৈ আছে"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ছেটিংসমূহ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"সহায়"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"কণ্ঠধ্বনিৰে সহায়"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"অৱস্থান"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"এই ডিভাইচৰ অৱস্থান ব্যৱহাৰ কৰিব পাৰে"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক এই ডিভাইচটোৰ অৱস্থান জানিবলৈ অনুমতি দিবনে?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"আপুনি এই এপ্ ব্য়ৱহাৰ কৰি থাকোঁতে ই সদায় অৱস্থান চাব পাৰে।"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক সদায় এই ডিভাইচৰ অৱস্থান চাবলৈ অনুমতি দিবনে?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"আপুনি এই এপ্ ব্য়ৱহাৰ কৰি থকা নাই যদিও ই সদায় অৱস্থান চাব পাৰে।"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"কেলেণ্ডাৰ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"আপোনাৰ কেলেণ্ডাৰ ব্যৱহাৰ কৰিব পাৰে"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক আপোনাৰ কেলেণ্ডাৰ চাবলৈ অনুমতি দিবনে?"</string>
@@ -291,12 +291,9 @@
<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>
- <!-- no translation found for permgrouplab_calllog (8798646184930388160) -->
- <skip />
- <!-- no translation found for permgroupdesc_calllog (3006237336748283775) -->
- <skip />
- <!-- no translation found for permgrouprequest_calllog (8487355309583773267) -->
- <skip />
+ <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>
@@ -405,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"এই এপে আপোনাৰ ফ\'নৰ কেলেণ্ডাৰত কার্যক্ৰম যোগ দিব, আঁতৰাব বা সলনি কৰিব পাৰে। ই এনে বাৰ্তা পঠিয়াব পাৰে যিবোৰ কেলেণ্ডাৰৰ গৰাকীৰ পৰা অহা যেন লাগে বা ই গৰাকীক নজনোৱাকৈ কাৰ্যক্ৰম সলনি কৰিব পাৰে৷"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"অতিৰিক্ত অৱস্থান দেখুওৱা নির্দেশত প্ৰৱেশ কৰক"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"অৱস্থানৰ অতিৰিক্ত নির্দেশনাসমূহত প্ৰৱেশ কৰিবলৈ এপক অনুমতি দিয়ে। ইয়ে এপটোক জিপিএছ বা অন্য অৱস্থান উৎসসমূহৰ কাৰ্যকলাপত হস্তক্ষেপ কৰাৰ সুযোগ দিব পাৰে।"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"সঠিক অৱস্থান (জিপিএছ আৰু নেটৱর্ক ভিত্তিক) ব্যৱহাৰ কৰিব পাৰে"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"এই এপটোৱে জিপিএছ বা নেটৱর্কৰ উৎসসমূহ যেনে চেল টাৱাৰ আৰু ৱাই-ফাই নেটৱর্ক আদিক ভিত্তি কৰি আপোনাৰ অৱস্থান নিৰ্ণয় কৰিব পাৰে। এই অৱস্থানৰ সেৱাসমূহ অন হৈ থাকিলে আৰু আপোনাৰ ফ\'নটোত উপলব্ধ হ\'লেহে এপটোৱে সেইবোৰ ব্যৱহাৰ কৰিবলৈ সক্ষম হ\'ব। এই কার্যই অধিক বেটাৰি খৰচ কৰিব পাৰে।"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"কেৱল অগ্ৰভূমিত অৱস্থানৰ সঠিক তথ্য় পাওক"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"এই এপটোৱে যেতিয়া ই নেপথ্যত চলি থাকে তেতিয়া আপোনাৰ সঠিক অৱস্থান নিৰ্ণয় কৰিব পাৰে। এপটোৱে ব্যৱহাৰ কৰিব পৰাকৈ এই অৱস্থান সেৱাসমূহ অন হৈ থাকিবই লাগিব আৰু আপোনাৰ ফ\'নত উপলব্ধ হ\'ব লাগিব। ইয়াৰ ফলত বেটাৰিৰ খৰচ বাঢ়িব পাৰে।"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"অনুমানিক অৱস্থান (নেটৱর্ক ভিত্তিক) ব্যৱহাৰ কৰিব পাৰে"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"চেল টাৱাৰ আৰু ৱাই-ফাই নেটৱর্কৰ দৰে নেটৱর্কৰ উৎসসমূহক ভিত্তি কৰি এই এপটোৱে আপোনাৰ অৱস্থান নিৰ্ণয় কৰিব পাৰে। এই অৱস্থানৰ সেৱাসমূহ অন হৈ থাকিলে আৰু আপোনাৰ টেবলেটটোত উপলব্ধ হ\'লেহে এপটোৱে সেইবোৰ ব্যৱহাৰ কৰিবলৈ সক্ষম হ\'ব।"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"চেল টাৱাৰ আৰু ৱাই-ফাই নেটৱর্কৰ দৰে নেটৱর্কৰ উৎসসমূহক ভিত্তি কৰি এই এপটোৱে আপোনাৰ অৱস্থান নিৰ্ণয় কৰিব পাৰে। এই অৱস্থানৰ সেৱাসমূহ অন হৈ থাকিলে আৰু আপোনাৰ টিভিত উপলব্ধ হ\'লেহে এপটোৱে সেইবোৰ ব্যৱহাৰ কৰিবলৈ সক্ষম হ\'ব।"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"এই এপটোৱে ম\'বাইলৰ টাৱাৰ আৰু ৱাই-ফাইৰ নেটৱৰ্ক আদিৰ দৰে নেটৱৰ্কৰ উৎসসমূহক ভিত্তি কৰি আপোনাৰ অৱস্থান চিনাক্ত কৰিব পাৰে। সেই অৱস্থান সেৱাসমূহ আপোনাৰ ফ\'নত সক্ষম অৱস্থাত থাকিলেহে এপটোৱে সেইবোৰ ব্যৱহাৰ কৰিব পাৰিব।"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"নেপথ্যত সঠিক অৱস্থান পাব পাৰে"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"এই এপটোৱে যেতিয়া ই নেপথ্যত চলি থাকে তেতিয়া আপোনাৰ সঠিক অৱস্থান নিৰ্ণয় কৰিব পাৰে। এপটোৱে ব্যৱহাৰ কৰিব পৰাকৈ এই অৱস্থান সেৱাসমূহ অন হৈ থাকিবই লাগিব আৰু আপোনাৰ ফ\'নত উপলব্ধ হ\'ব লাগিব। ইয়াৰ ফলত বেটাৰিৰ খৰচ বাঢ়িব পাৰে।"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"আপোনাৰ অডিঅ\' ছেটিংসমূহ সলনি কৰক"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"এপটোক ভলিউমৰ দৰে গ্ল\'বেল অডিঅ\' ছেটিংসমূহ যাৰ স্পীকাৰক আউটপুটৰ বাবে ব্যৱহাৰ হয় তাক সলনি কৰিবলৈ অনুমতি দিয়ে৷"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"অডিঅ\' ৰেকর্ড কৰক"</string>
@@ -518,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ফিংগাৰপ্ৰিণ্ট আইকন"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ পৰিচালনা কৰক"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"মুখমণ্ডলৰ টেম্প্লেট যোগ কৰাৰ বা মচাৰ পদ্ধতি কামত লগাবলৈ আহ্বান কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্যৱহাৰ কৰক"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ অনুমতি দিয়ে"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"মুখমণ্ডল চিনাক্ত কৰিব পৰা নাই; আকৌ চেষ্টা কৰক।"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"মুখমণ্ডল অত্যন্ত উজ্জ্বল হৈছে। অনুগ্ৰহ কৰি পোহৰ কম থকা ঠাইত চেষ্টা কৰক।"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"মুখমণ্ডল অত্যন্ত আন্ধাৰ হৈছে। অনুগ্ৰহ কৰি পোহৰ থকা ঠাইলৈ যাওক।"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"অনুগ্ৰহ কৰি মুখৰ পৰা ছেন্সৰ অলপ দূৰত ৰাখক।"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"অনুগ্ৰহ কৰি ছেন্সৰটো মুখৰ ওচৰলৈ আনক।"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"অনুগ্ৰহ কৰি ছেন্সৰটো ওপৰলৈ নিয়ক।"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"অনুগ্ৰহ কৰি ছেন্সৰটো তললৈ নিয়ক।"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"অনুগ্ৰহ কৰি ছেন্সৰটো সোঁফাললৈ নিয়ক।"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"অনুগ্ৰহ কৰি ছেন্সৰটো বাওঁফাললৈ নিয়ক।"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"অনুগ্ৰহ কৰি ছেন্সৰটোলৈ চাওক।"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"কোনো মুখমণ্ডল চিনাক্ত কৰিব পৰা নগ’ল।"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ডিভাইচৰ আগত মুখখন স্থিৰ কৰি ৰাখক।"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"মুখমণ্ডলৰ হাৰ্ডৱেৰ উপলব্ধ নহয়।"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"মুখমণ্ডল গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"মুখমণ্ডল সঞ্চয় কৰিব নোৱাৰি।"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"অত্যধিক প্ৰয়াস। মুখমণ্ডলৰ জৰিয়তে সত্যাপন অক্ষম কৰা হ’ল।"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"আকৌ চেষ্টা কৰক।"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"কোনো মুখমণ্ডল যোগ কৰা নহ’ল।"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"এই ডিভাইচটোত মুখমণ্ডল সত্যাপন ছেন্সৰ নাই।"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"মুখমণ্ডল <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"মুখমণ্ডলৰ আইকন"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ছিংকৰ ছেটিংসমূহ পঢ়ক"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"একাউণ্টৰ ছিংক ছেটিংবোৰ পঢ়িবলৈ এপক অনুমতি দিয়ে। যেনে, People এপ কোনো একাউণ্টত ছিংক কৰা হৈছে নে নাই সেয়া নির্ধাৰণ কৰিব পাৰে।"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ছিংকক অন আৰু অফ ট\'গল কৰক"</string>
@@ -1178,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"ৱাই-ফাইত ইন্টাৰনেট নাই"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"অধিক বিকল্পৰ বাবে টিপক"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"আপোনাৰ হটস্পট ছেটিংসমূহত কৰা সালসলনি"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"আপোনাৰ হটস্পটৰ বেণ্ড সলনি কৰা হ’ল।"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"আপোনাৰ কেৱল ৫গিগাহাৰ্টজৰ প্ৰতি অগ্ৰাধিকাৰ এই ডিভাচইচটোৱে সমৰ্থন নকৰে। ইয়াৰ পৰিৱৰ্তে, ডিভাচইচটোৱে যেতিয়া ৫গিগাহাৰ্টজ বেণ্ড উপলব্ধ হ’ব তেতিয়া সেইয়া ব্যৱহাৰ কৰিব।"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>লৈ সলনি কৰা হ\'ল"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"যেতিয়া <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>ত ইণ্টাৰনেট নাথাকে, তেতিয়া ডিভাইচে <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ক ব্যৱহাৰ কৰে। মাচুল প্ৰযোজ্য হ\'ব পাৰে।"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>ৰ পৰা <xliff:g id="NEW_NETWORK">%2$s</xliff:g> লৈ সলনি কৰা হ\'ল"</string>
@@ -1265,7 +1298,8 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"আপোনাৰ প্ৰশাসকে এই ডিভাইচটোৰ সমস্যা সমাধানৰ বাবে বাগ সম্পৰ্কীয় অভিযোগ বিচাৰিছে। এপ্ আৰু ডেটা শ্বেয়াৰ কৰা হ\'ব পাৰে।"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"শ্বেয়াৰ কৰক"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"প্ৰত্যাখ্যান কৰক"</string>
- <string name="select_input_method" msgid="8547250819326693584">"কীব\'ৰ্ড সলনি কৰক"</string>
+ <!-- no translation found for select_input_method (4653387336791222978) -->
+ <skip />
<string name="show_ime" msgid="2506087537466597099">"কায়িক কীব’ৰ্ড সক্ৰিয় হৈ থাকোঁতে ইয়াক স্ক্ৰীণত ৰাখিব"</string>
<string name="hardware" msgid="194658061510127999">"ভাৰ্শ্বুৱল কীব\'ৰ্ড দেখুৱাওক"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"কায়িক কীব’ৰ্ড কনফিগাৰ কৰক"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 164b1fbd565a..7ddd88c20736 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Təyyarə rejimi"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçuş rejimi açıqdır"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Təyyarə rejimi qapalıdır"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batareya qənaəti"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batareya qənaəti DEAKTİVDİR"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batareya qənaəti AKTİVDİR"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Yardım"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Səs Yardımçısı"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Yer"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"cihazın yerini bilmək"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə bu cihazın məkanına daxil olmaq icazəsi verilsin?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Tətbiq yalnız ondan istifadə etiyiniz zaman məkanı əldə edə bilər."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə bu cihazın məkanına daxil olmaq icazəsi verilsin?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Tətbiq hətta ondan istifadə etmədiyiniz zaman belə məkanı əldə edə bilər."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Təqvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"təqvimə daxil olun"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinə təqvimə daxil olmaq icazəsi verilsin?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Bu tətbiq telefonunuzda təqvim tədbirləri əlavə edə, silə və ya dəyişiklik edə bilər. Həmçinin bu tətbiq təqvim sahiblərindən gəlmə ehtimalı olan mesajları göndərə və ya sahiblərinə bildirmədən tədbirlərdə dəyişiklik edə bilər."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"əlavə məkan provayderi əmrlərinə çıxış"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Tətbiqə ekstra məkan provayder əmrlərinə girişə imkan verir. Bu, tətbiqə GPS və ya digər lokal mənbələrlə əməliyyata müdaxiləyə imkan verə bilər."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"dəqiq məkana (GPS və şəbəkə əsasında) giriş"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Bu tətbiq mobil qüllələr və Wi-Fi şəbəkələri kimi şəbəkə mənbələrinin əassında əkanınızı əldə edə bilər. Bu məkan xidmətləri aktiv edilməlidir və telefonda tətbiq tərəfindən istifadə üçün əlçatan olmalıdır. Bu, batareya sərfiyyatını artıra bilər."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"yalnız ön planda dəqiq məkana daxil olun"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Bu tətbiq yalnız ön fonda olduqda dəqiq məkanınızı əldə edə bilər. Tətbiqin bunlardan istifadə etməsi üçün bu məkan xidmətləri aktiv edilməlidir və telefonda əlçatan olmalıdır. Bu, batareya sərfiyyatını artıra bilər."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"təxmini məkana (şəbəkə əsaslı) giriş"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Bu tətbiq mobil qüllələr və Wi-Fi şəbəkələri kimi şəbəkə mənbələrinin əassında əkanınızı əldə edə bilər. Bu məkan xidmətləri aktiv edilməlidir və planşetdə tətbiq tərəfindən istifadə üçün əlçatan olmalıdır."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Bu tətbiq mobil qüllələr və Wi-Fi şəbəkələri kimi şəbəkə mənbələrinin əassında əkanınızı əldə edə bilər. Bu məkan xidmətləri aktiv edilməlidir və TV\'də tətbiq tərəfindən istifadə üçün əlçatan olmalıdır."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Bu tətbiq mobil qüllələr və Wi-Fi şəbəkələri kimi şəbəkə mənbələrinin əassında əkanınızı əldə edə bilər. Bu məkan xidmətləri aktiv edilməlidir və telefonda tətbiq tərəfindən istifadə üçün əlçatan olmalıdır."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"arxa fonda dəqiq məkana daxil olun"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Bu tətbiq istənilən zaman arxa fonda olduqda dəqiq məkanınızı əldə edə bilər. Tətbiqin bunlardan istifadə etməsi üçün bu məkan xidmətləri aktiv edilməlidir və telefonda əlçatan olmalıdır. Bu, batareya sərfiyyatını artıra bilər."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"audio ayarlarınızı dəyişir"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Tətbiqə səs və hansı spikerin çıxış üçün istifadə olunduğu kimi qlobal səs ayarlarını dəyişdirməyə imkan verir."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"səs yaz"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Barmaq izi ikonası"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"üz identifikasiyası proqramını idarə edin"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Proqramdan istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək məqsədilə üsullara müraciət etməyə imkan verir."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"üz identifikasiyası proqramından istifadə edin"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tətbiqin üz identifikasiyası proqramından identifikasiya zamanı istifadə etməsinə icazə verir"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Üz tanınmadı. Yenidən cəhd edin."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Üz çox parlaqdır. Daha zəif işıqda sınayın."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Üz çox tünddür. İşığı ortaya çıxarın."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Sensoru üzdən kənara gətirin."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Sensoru üzə biraz da yaxınlaşdırın."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Sensoru daha yuxarı gətirin."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Sensoru daha aşağı gətirin."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Sensoru sağa gətirin."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Sensoru sola gətirin."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Sensora baxın."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Üz aşkarlanmadı."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Üzü cihazın qarşısında sabit saxlayın."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Üz proqramı əlçatan deyil."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Üz proqramı taymerinin vaxtı bitdi. Yenidən cəhd edin."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Üz bərpa edilmədi."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Üz əməliyyatı ləğv edildi."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Həddindən çox cəhd. Sonraya saxlayın."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Həddindən çox cəhd. Üz identifikasiyası deaktiv edildi."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Yenidən cəhd edin."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Üz qeydə alınmayıb."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Bu cihazda üz identifikasiyası sensoru yoxdur."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Üz <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Üz işarəsi"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx ayarlarını oxu"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tətbiqə hesablar üçün sinxronizasiya nizamlarını oxuma icazəsi verir. Məsələn, bu Şəxslər tətbiqinin sinxronizə olunub-olunmadığını təyin edə bilər."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinxronizasiyaya davam edir və onu söndürür"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi şəbəkəsinin internetə girişi yoxdur"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Seçimlər üçün tıklayın"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot ayarlarınızda dəyişiklik"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot qrupu dəyişdi."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Bu cihaz yalnız 5GHz üçün tərcihinizi dəstəkləmir. Əvəzinə əlçatan olduqda bu cihaz 5GHz qrupundan istifadə edəcək."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> şəbəkə növünə keçirildi"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> şəbəkəsinin internetə girişi olmadıqda, cihaz <xliff:g id="NEW_NETWORK">%1$s</xliff:g> şəbəkəsini istifadə edir. Xidmət haqqı tutula bilər."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> şəbəkəsindən <xliff:g id="NEW_NETWORK">%2$s</xliff:g> şəbəkəsinə keçirildi"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Admin bu cihazda nasazlıqların aşkarlanması üçün baq hesabatı sorğusu göndərdi. Tətbiq və data paylaşıla bilər."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"PAYLAŞIN"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RƏDD EDİN"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Klaviaturanı dəyişin"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Daxiletmə metodunu seçin"</string>
<string name="show_ime" msgid="2506087537466597099">"Fiziki klaviatura aktiv olduğu halda ekranda saxlayın"</string>
<string name="hardware" msgid="194658061510127999">"Virtual klaviaturanı göstərin"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Fiziki klaviaturanı konfiqurasiya edin"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 30cc2850eedf..6338e690081f 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -239,9 +239,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Režim rada u avionu"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim rada u avionu je UKLJUČEN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim rada u avionu je ISKLJUČEN"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Ušteda baterije"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Ušteda baterije je ISKLJUČENA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Ušteda baterije je UKLJUČENA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Podešavanja"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
@@ -279,6 +276,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupi lokaciji ovog uređaja"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupa lokaciji ovog uređaja?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacija će imati pristup lokaciji samo dok koristite aplikaciju."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupa lokaciji ovog uređaja?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacija će uvek imati pristup lokaciji, čak i kada ne koristite aplikaciju."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupi kalendaru"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Želite li da omogućite da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupa kalendaru?"</string>
@@ -405,12 +405,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Ova aplikaciji može da dodaje, uklanja ili menja događaje iz kalendara na telefonu. Ova aplikacija može da šalje poruke koje izgledaju kao da ih šalju vlasnici kalendara ili da menja događaje bez znanja vlasnika."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"pristup dodatnim komandama dobavljača lokacije"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Omogućava aplikaciji da pristupa dodatnim komandama davaoca usluga lokacije. To može da omogući aplikaciji da utiče na rad GPS-a ili drugih izvora lokacije."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"pristup preciznoj lokaciji (utvrđena preko mreže i GPS-a)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Ova aplikacija može da pristupi vašoj lokaciji pomoću GPS-a ili mrežnih izvora lokacija, kao što su mobilni predajnici i Wi-Fi mreže. Ove usluge lokacije moraju da budu uključene i dostupne na telefonu da bi aplikacija mogla da ih koristi. To može da poveća potrošnju baterije."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"pristup preciznoj lokaciji samo u prvom planu"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Ova aplikacija može da odredi vašu tačnu lokaciju samo kada radi u prvom planu. Ove usluge lokacije moraju da budu uključene i dostupne na telefonu da bi aplikacija mogla da ih koristi. To može da poveća potrošnju baterije."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"pristup približnoj lokaciji (utvrđena preko mreže)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Ova aplikacija može da pristupi vašoj lokaciji pomoću izvora mreže, kao što su mobilni predajnici i Wi-Fi mreže. Ove usluge lokacije moraju da budu uključene i dostupne na tabletu da bi aplikacija mogla da ih koristi."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Ova aplikacija može da pristupi vašoj lokaciji pomoću izvora mreže, kao što su mobilni predajnici i Wi-Fi mreže. Ove usluge lokacije moraju da budu uključene i dostupne na TV-u da bi aplikacija mogla da ih koristi."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Ova aplikacija može da pristupi vašoj lokaciji pomoću izvora mreže, kao što su mobilni predajnici i Wi-Fi mreže. Ove usluge lokacije moraju da budu uključene i dostupne na telefonu da bi aplikacija mogla da ih koristi."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"pristup preciznoj lokaciji u pozadini"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Ova aplikacija može da odredi vašu tačnu lokaciju svaki put kada radi u pozadini. Ove usluge lokacije moraju da budu uključene i dostupne na telefonu da bi aplikacija mogla da ih koristi. To može da poveća potrošnju baterije."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"promena audio podešavanja"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Dozvoljava aplikaciji da menja globalna audio podešavanja kao što su jačina zvuka i izbor zvučnika koji se koristi kao izlaz."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"snimanje audio zapisa"</string>
@@ -518,6 +520,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona otiska prsta"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"upravljanje hardv. za potvrdu identiteta pomoću lica"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Dozvoljava da aplikacija aktivira metode za dodavanje i brisanje šablona lica radi korišćenja."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"korišćenje hardv. za potvrdu identiteta pomoću lica"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Dozvoljava da aplikacija koristi hardver za potvrdu identiteta pomoću lica"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Obrada lica nije uspela. Probajte ponovo."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Lice je presvetlo. Probajte sa slabijim osvetljenjem."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Lice je isuviše tamno. Otkrijte izvor svetla."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Udaljite senzor od lica."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Približite senzor licu."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Pomerite senzor naviše."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Pomerite senzor naniže."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Pomerite senzor udesno."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Pomerite senzor ulevo."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Gledajte u senzor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nije otkriveno nijedno lice."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Zadržite lice ispred uređaja bez pomeranja."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Harvder za lice nije dostupan."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Isteklo je vreme za proveru lica. Probajte ponovo."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće sačuvati lice."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Obrada lica je otkazana."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Probajte ponovo kasnije."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Više pokušaja. Potvrda identiteta je onemogućena."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Probajte ponovo."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nije registrovano nijedno lice."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Ovaj uređaj nema senzor za potvrdu identiteta pomoću lica"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikona lica"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"čitanje podešavanja sinhronizacije"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Dozvoljava aplikaciji da čita podešavanja sinhronizacije za nalog. Na primer, ovako može da se utvrdi da li je aplikacija Ljudi sinhronizovana sa nalogom."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"uključivanje i isključivanje sinhronizacije"</string>
@@ -1197,6 +1230,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nema pristup internetu"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Promene podešavanja za hotspot"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Opseg hotspota je promenjen."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava podešavanje samo za 5 GHz. Uređaj će koristiti opseg od 5 GHz kada bude dostupan."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Prešli ste na tip mreže <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Uređaj koristi tip mreže <xliff:g id="NEW_NETWORK">%1$s</xliff:g> kada tip mreže <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nema pristup internetu. Možda će se naplaćivati troškovi."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Prešli ste sa tipa mreže <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na tip mreže <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1284,7 +1320,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administrator je zatražio izveštaj o grešci radi lakšeg rešavanja problema u vezi sa ovim uređajem. Aplikacije i podaci mogu da se dele."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DELI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ODBIJ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Promenite tastaturu"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Izbor metoda unosa"</string>
<string name="show_ime" msgid="2506087537466597099">"Zadrži je na ekranu dok je fizička tastatura aktivna"</string>
<string name="hardware" msgid="194658061510127999">"Prikaži virtuelnu tastaturu"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurišite fizičku tastaturu"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 879c506c3208..b063839cd027 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -220,7 +220,7 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Параметры тэлефона"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Блакіроўка экрана"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Выключыць"</string>
- <string name="global_action_emergency" msgid="7112311161137421166">"SOS-выклік"</string>
+ <string name="global_action_emergency" msgid="7112311161137421166">"Экстранны выклік"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Справаздача пра памылкі"</string>
<string name="global_action_logout" msgid="935179188218826050">"Скончыць сеанс"</string>
<string name="global_action_screenshot" msgid="8329831278085426283">"Здымак экрана"</string>
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Рэжым палёту"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Уключаны рэжым \"У самалёце\""</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Рэжым \"У самалёце\" адключаны"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Эканомія зараду"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Рэжым эканоміі зараду выключаны"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Рэжым эканоміі зараду ўключаны"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Налады"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Дапамога"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Галас. дапамога"</string>
@@ -282,6 +279,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Месцазнаходжанне"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"атрымліваць доступ да месцазнаходжання гэтай прылады"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ да звестак аб месцазнаходжанні гэтай прылады?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Праграма будзе мець доступ да звестак пра месцазнаходжанне, толькі калі яна выкарыстоўваецца."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; мець доступ да месцазнаходжання?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Праграма заўсёды будзе мець доступ да звестак пра месцазнаходжанне, нават калі яна не выкарыстоўваецца."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Каляндар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"атрымліваць доступ да вашага календара"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Дазволіць праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ да вашага календара?"</string>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Гэта праграма можа дадаваць, выдаляць або змяняць падзеі календара на вашым тэлефоне. Гэта праграма можа адпраўляць паведамленні, якія могуць здавацца адпраўленымі ўладальнікамі календара, або змяняць падзеі без апавяшчэння іх уладальнікаў."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"доступ да дадатковых камандаў пастаўшчыка месцазнаходжання"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Дазваляе праграме атрымліваць доступ да дадатковых каманд службаў вызначэння месцазнаходжання. Гэта можа дазволіць праграме ўмешвацца ў функцыянаванне GPS або іншых крыніц даных аб месцазнаходжаннi."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"атрымліваць доступ да дакладнага месцазнаходжання (на аснове GPS і сеткі)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Гэта праграма можа атрымліваць звесткі пра ваша месцазнаходжанне на падставе даных GPS або сеткавых крыніц звестак аб месцазнаходжанні, такіх як вышкі сотавай сувязі і сеткі Wi-Fi. Гэтыя сэрвісы вызначэння месцазнаходжання павінны быць уключаны i даступныя на вашым тэлефоне, каб праграма магла іх выкарыстоўваць. Гэта можа павялічыць спажыванне зараду акумулятара."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"доступ да дакладнага месцазнаходжання толькі ў асноўным рэжыме"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Гэта праграма можа атрымліваць звесткі пра ваша дакладнае месцазнаходжанне толькі ў асноўным рэжыме. Службы геалакацыі павінны быць уключаны і даступныя на вашым тэлефоне, каб праграма магла імі карыстацца. Гэта можа павялічыць спажыванне зараду акумулятара."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"атрымліваць доступ да прыблізнага месцазнаходжання (на аснове даных сеткі)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Гэта праграма можа атрымліваць звесткі пра ваша месцазнаходжанне на падставе даных сеткавых крыніц, такіх як вышкі сотавай сувязі і сеткі Wi-Fi. Гэтыя сэрвісы вызначэння месцазнаходжання павінны быць уключаны i даступныя на вашым планшэце, каб праграма магла іх выкарыстоўваць."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Гэта праграма можа атрымліваць звесткі пра ваша месцазнаходжанне на падставе даных сеткавых крыніц, такіх як вышкі сотавай сувязі і сеткі Wi-Fi. Гэтыя сэрвісы вызначэння месцазнаходжання павінны быць уключаны i даступныя на вашым тэлевізары, каб праграма магла іх выкарыстоўваць."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Гэта праграма можа атрымліваць звесткі пра ваша месцазнаходжанне на падставе даных сеткавых крыніц, такіх як вышкі сотавай сувязі і сеткі Wi-Fi. Гэтыя сэрвісы вызначэння месцазнаходжання павінны быць уключаны i даступныя на вашым тэлефоне, каб праграма магла іх выкарыстоўваць."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"доступ да дакладнага месцазнаходжання ў фонавым рэжыме"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Гэта праграма можа атрымліваць звесткі пра ваша дакладнае месцазнаходжанне ў любы час, калі яна працуе ў фонавым рэжыме. Службы геалакацыі павінны быць уключаны і даступныя на вашым тэлефоне, каб праграма магла імі карыстацца. Гэта можа павялічыць спажыванне зараду акумулятара."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"змяняць налады аудыё"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Дазваляе прыкладанням змяняць глабальныя налады гуку, такія як моц і тое, што дынамік выкарыстоўваецца для выхаду."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"запісваць аўдыё"</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок адбіткаў пальцаў"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"кіраваць абсталяваннем для распазнавання твару"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Праграма зможа дадаваць і выдаляць шаблоны твару."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"карыстацца абсталяваннем для распазнавання твару"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Праграма зможа выкарыстоўваць абсталяванне распазнавання твару для аўтэнтыфікацыі"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Не ўдалося распазнаць твар. Паўтарыце спробу."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Твар занадта светлы. Паспрабуйце зменшыць святло."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Твар занадта цёмны. Павялічце асвятленне."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Перамясціце датчык далей ад твару."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Наблізьце датчык да твару."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Падыміце датчык вышэй."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Апусціце датчык ніжэй."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Перамясціце датчык управа."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Перамясціце датчык улева."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Глядзіце на датчык."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Твар не знойдзены."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Трымайце твар перад прыладай."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Абсталяванне для распазнавання твару недаступнае."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Час чакання твару выйшаў. Паўтарыце спробу."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Не ўдалося захаваць твар."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Распазнаванне твару скасавана."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Занадта шмат спроб. Паўтарыце спробу пазней."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Занадта шмат спроб. Аўтэнтыфікацыя твару адключана"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Паўтарыце спробу."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Твар не зарэгістраваны."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"На гэтай прыладзе адсутнічае датчык аўтэнтыфікацыі твару"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Твар <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Значок твару"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"чытаць параметры сінхранізацыі"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Дазваляе прыкладанням чытаць параметры сінхранізацыі для ўліковага запісу. Напрыклад, яны могуць вызначыць, цi сiнхранiзавана з улiковым запiсам прыкладанне \"Кантакты\"."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"уключэнне ці адключэнне сінхранізацыi"</string>
@@ -741,7 +774,7 @@
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Націсніце \"Меню\", каб разблакаваць, або зрабіце экстраны выклік."</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Націсніце \"Меню\", каб разблакаваць."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Намалюйце камбінацыю разблакоўкі, каб разблакаваць"</string>
- <string name="lockscreen_emergency_call" msgid="5298642613417801888">"SOS-выклік"</string>
+ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Экстранны выклік"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Вярнуцца да выкліку"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Правільна!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Паспрабуйце яшчэ раз"</string>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"У Wi-Fi няма доступу да інтэрнэту"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Дакраніцеся, каб убачыць параметры"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Змяненні ў наладах хот-спота"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Частата хот-спота змянілася."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Прылада не можа працаваць толькі на частаце 5 ГГц. Гэта частата будзе выкарыстоўвацца, калі гэта магчыма."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Выкананы пераход да <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Прылада выкарыстоўвае сетку <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, калі ў сетцы <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> няма доступу да інтэрнэту. Можа спаганяцца плата."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Выкананы пераход з <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> да <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Ваш адміністратар запытаў справаздачу пра памылку для яе ліквідацыі на гэтай прыладзе. Звесткі праграм і даныя могуць быць абагулены."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"АБАГУЛІЦЬ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"АДХІЛІЦЬ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Змяніць клавіятуру"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Выберыце метад уводу"</string>
<string name="show_ime" msgid="2506087537466597099">"Захоўваць яе на экране ў той час, калі фізічная клавіятура актыўная"</string>
<string name="hardware" msgid="194658061510127999">"Паказаць віртуальную клавіятуру"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Наладжванне фізічнай клавіятуры"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 9568a16ef267..d05d78c9d1e5 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Самолетен режим"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Самолетният режим е ВКЛЮЧЕН"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Самолетният режим е ИЗКЛЮЧЕН"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Режим за запазване на батерията"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Режимът за запазване на батерията е ИЗКЛЮЧЕН"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Режимът за запазване на батерията е ВКЛЮЧЕН"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помощ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласова помощ"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Местоположение"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"получи достъп до местоположението на това устройство"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до местоположението на това устройство?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Само когато използвате приложението, то ще има достъп до местоположението."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; достъп до местопол. на у-вото?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Дори когато не използвате приложението, то винаги ще има достъп до местоположението."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"има достъп до календара ви"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Да се разреши ли на &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да осъществява достъп до календара ви?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Това приложение може да добавя, премахва или променя събития в календара на телефона ви. То е в състояние да изпраща съобщения от името на собственици на календари или да променя събития, без да уведомява собствениците."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"достъп до допълнителни команди на доставчика на местоположение"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Разрешава на приложението достъп до допълнителни команди на доставчика на местоположение. Това може да позволи на приложението да смущава работата на GPS или на другите източници на местоположение."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"достъп до точното местоположение (въз основа на GPS и мрежата)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Приложението може да получава данни за местоположението ви въз основа на GPS или съответните мрежови източници, като клетъчни кули и Wi-Fi. Тези услуги за местоположение трябва да са включени и налице на телефона ви, за да могат да се използват от приложението. Това може да увеличи потреблението на батерията."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"достъп до точното местоположение само на преден план"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Приложението може да получава данни за точното ви местоположение само когато работи на преден план. Тези услуги за местоположение трябва да са включени и налице на телефона ви, за да могат да се използват от приложението. Това може да увеличи потреблението на батерията."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"достъп до приблизителното местоположение (въз основа на мрежата)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Приложението може да получава данни за местоположението ви въз основа на мрежови източници, като клетъчни кули и Wi-Fi. Тези услуги за местоположение трябва да са включени и налице на таблета ви, за да могат да се използват от приложението."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Приложението може да получава данни за местоположението ви въз основа на мрежови източници, като клетъчни кули и Wi-Fi. Тези услуги за местоположение трябва да са включени и налице на телевизора ви, за да могат да се използват от приложението."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Приложението може да получава данни за местоположението ви въз основа на мрежови източници, като клетъчни кули и Wi-Fi. Тези услуги за местоположение трябва да са включени и налице на телефона ви, за да могат да се използват от приложението."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"достъп до точното местоположение на заден план"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Приложението може да получава данни за точното ви местоположение по всяко време, когато работи на заден план. Тези услуги за местоположение трябва да са включени и налице на телефона ви, за да могат да се използват от приложението. Това може да увеличи потреблението на батерията."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"промяна на настройките ви за звука"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Разрешава на приложението да променя глобалните настройки за звука, като например силата и това, кой високоговорител се използва за изход."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"записва звук"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона за отпечатък"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"управление на хардуера за удостоверяване с лице"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Разрешава на прил. да извиква методи за добавяне и изтриване на лицеви шаблони за ползване"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"използване на хардуера за удостоверяване с лице"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Разрешава на приложението при необходимост да използва хардуера за удостоверяване с лице"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Лицето не можа да се обработи. Опитайте отново."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Лицето е твърде осветено. Oпитайте на по-тъмно."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Лицето е твърде тъмно. Моля, осветете го по-добре."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Моля, отдалечете сензора от лицето си."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Моля, приближете сензора към лицето си."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Моля, повдигнете сензора."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Моля, преместете сензора надолу."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Моля, преместете сензора надясно."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Моля, преместете сензора наляво."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Моля, гледайте към сензора."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Не е открито лице."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Задръжте лицето си неподвижно пред устройството."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Няма достъп до хардуера за лице."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Времето за изчакване изтече. Опитайте отново."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Лицето не може да бъде съхранено."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Операцията с лице е анулирана."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Твърде много опити. Опитайте отново по-късно."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Твърде много опити. Удост. с лице е деактивирано."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Опитайте отново."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Няма регистрирано лице."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Това устройство няма сензор за удостоверяване с лице"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Икона на лице"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"четене на настройките за синхронизиране"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Разрешава на приложението да чете настройките за синхронизиране на профил. Например това може да определи дали приложението Хора е синхронизирано с даден профил."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"включване и изключване на синхронизирането"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi мрежата няма достъп до интернет"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Докоснете за опции"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Промени в настройките ви за точка за достъп"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Честотната лента на точката ви за достъп е променена."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Това устройство не поддържа предпочитанието ви за използване само на честотната лента от 5 ГХц. Вместо това то ще я ползва, когато е възможно."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Превключи се към <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Устройството използва <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, когато <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> няма достъп до интернет. Възможно е да бъдете таксувани."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Превключи се от <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> към <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Администраторът поиска сигнал за програмна грешка с цел отстраняване на неизправностите на това устройство. Възможно е да бъдат споделени приложения и данни."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"СПОДЕЛЯНЕ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ОТХВЪРЛЯНЕ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Промяна на клавиатурата"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Избор на метод на въвеждане"</string>
<string name="show_ime" msgid="2506087537466597099">"Показване на екрана, докато физическата клавиатура е активна"</string>
<string name="hardware" msgid="194658061510127999">"Показване на вирт. клавиатура"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Конфигуриране на физическата клавиатура"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index c0836130b3ce..949d20617063 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"বিমান মোড"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"বিমান মোড চালু করা আছে"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"বিমান মোড বন্ধ করা আছে"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ব্যাটারি সেভার"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ব্যাটারি সেভার বন্ধ আছে"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ব্যাটারি সেভার চালু আছে"</string>
<string name="global_action_settings" msgid="1756531602592545966">"সেটিংস"</string>
<string name="global_action_assist" msgid="3892832961594295030">"সহযোগিতা"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ভয়েস সহায়তা"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"লোকেশন"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"এই ডিভাইসের লোকেশন অ্যাক্সেস"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে এই ডিভাইসের লোকেশন অ্যাক্সেস করতে দেবেন?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"আপনি এই অ্যাপটি ব্যবহার করার সময়েই সেটি আপনার লোকেশন অ্যাক্সেস করতে পারবে।"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;কে সবসময় এই ডিভাইসের লোকেশন অ্যাক্সেস করতে দেবেন?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"এই অ্যাপটি সবসময় আপনার লোকেশন অ্যাক্সেস করতে পারবে, এমনকি আপনি অ্যাপটি ব্যবহার না করার সময়েও।"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ক্যালেন্ডার"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"আপনার ক্যালেন্ডারে অ্যাক্সেস"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-কে আপনার ক্যালেন্ডারে অ্যাক্সেস দেবেন?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"এই অ্যাপটি আপনার ফোনে ক্যালেন্ডার ইভেন্টগুলি যোগ করতে, সরাতে বা পরিবর্তিত করতে পারে৷ এই অ্যাপটি মেসেজ পাঠাতে পারে যা ক্যালেন্ডারের মাললিকের থেকে এসেছে বলে মনে হয় বা ইভেন্টগুলিকে তাদের মালিকদের না জানিয়েই পরিবর্তিত করতে পারে৷"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"অতিরিক্ত লোকেশন প্রদানকারী কমান্ডগুলি অ্যাক্সেস করে"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"লোকেশনের সাথে সম্পর্কিত তথ্য প্রদানকারীর অতিরিক্ত কম্যান্ডগুলিকে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ এটি অ্যাপ্লিকেশানটিকে GPS অথবা অন্যান্য লোকেশন নির্ণয়ের সাথে সম্পর্কিত উৎসগুলির ক্রিয়াপ্রণালীর নিয়ন্ত্রণকে মঞ্জুর করতে পারে৷"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"সুনির্দিষ্ট লোকেশন (GPS এবং নেটওয়ার্ক-ভিত্তিক) অ্যাক্সেস করুন"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক লোকেশন উৎসগুলি বা GPS এর উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন শনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷ এর জন্য অতিরিক্ত ব্যাটারি খরচ হতে পারে৷"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"শুধুমাত্র অ্যাপটি খোলা থাকলে আপনার যথাযথ লোকেশন অ্যাক্সেস করা"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"এই অ্যাপটি ফোরগ্রাউন্ডে চলতে থাকলে যেকোনও সময়ে আপনার যথাযথ লোকেশন জানতে পারবে। এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং আপনার ফোনে সেগুলি উপলভ্য থাকতে হবে যাতে অ্যাপটি সেগুলি ব্যবহার করতে পারে। এর জন্য অতিরিক্ত ব্যাটারি খরচ হতে পারে।"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"আনুমানিক লোকেশন (নেটওয়ার্ক-ভিত্তিক) অ্যাক্সেস করুন"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন শনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেইজন্য সেগুলিকে আপনার ট্যাবলেটে উপলব্ধ করে রাখতে হবে৷"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্কের উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন শনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার টিভিতে উপলব্ধ করে রাখতে হবে৷"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"মোবাইল টাওয়ার এবং ওয়াই-ফাই নেটওয়ার্কগুলির মত নেটওয়ার্ক উৎসগুলির উপর ভিত্তি করে এই অ্যাপটি আপনার লোকেশন শনাক্ত করতে পারে৷ এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং অ্যাপটি যাতে সেগুলি ব্যবহার করতে পারে সেজন্য সেগুলিকে আপনার ফোনে উপলব্ধ করে রাখতে হবে৷"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"ব্যাকগ্রাউন্ডে চলতে থাকলে আপনার যথাযথ লোকেশন অ্যাক্সেস করা"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"এই অ্যাপটি ব্যাকগ্রাউন্ডে চলতে থাকলে যেকোনও সময়ে আপনার যথাযথ লোকেশন জানতে পারবে। এই লোকেশন পরিষেবাগুলি অবশ্যই চালু রাখতে হবে এবং আপনার ফোনে সেগুলি উপলভ্য থাকতে হবে যাতে অ্যাপটি সেগুলি ব্যবহার করতে পারে। এর জন্য অতিরিক্ত ব্যাটারি খরচ হতে পারে।"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"আপনার অডিও সেটিংস পরিবর্তন করে"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ভলিউম এবং যেখানে স্পিকার আউটপুট হিসাবে ব্যবহৃত হয় সেই সব ক্ষেত্রে গ্লোবাল অডিও সেটিংসের সংশোধন করতে অ্যাপ্লিকেশনটিকে মঞ্জুর করে৷"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"অডিও রেকর্ড"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"আঙ্গুলের ছাপ আইকন"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"ফেস যাচাইকরণ হার্ডওয়্যার পরিচালনা করুন"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ব্যবহার করার জন্য ফেস টেম্পলেট যোগ করা এবং মোছার পদ্ধতি গ্রহণ করতে অ্যাপটিকে অনুমতি দেয়৷"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করুন"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"প্রমাণীকরণের জন্য ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করার অনুমতি অ্যাপটিকে দেয়"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ফেস প্রক্রিয়া করা যায়নি৷ আবার চেষ্টা করুন৷"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ফেসটি খুব উজ্জ্বল লাগছে। কম আলোতে চেষ্টা করুন।"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ফেসটি খুব অন্ধকার লাগছে। বেশি আলোতে চেষ্টা করুন।"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"অনুগ্রহ করে ফেস থেকে সেন্সরটি দূরে সরান।"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"অনুগ্রহ করে ফেসের কাছাকাছি সেন্সরটি আনুন।"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"অনুগ্রহ করে সেন্সরটি উঁচুতে নিয়ে যান।"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"অনুগ্রহ করে সেন্সরটি নিচে নিয়ে যান।"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"অনুগ্রহ করে সেন্সরটি ডান দিকে নিয়ে যান।"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"অনুগ্রহ করে সেন্সরটি বাঁ দিকে নিয়ে যান।"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"অনুগ্রহ করে সেন্সরের দিকে তাকান।"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"কোনও ফেস শনাক্ত করা যায়নি।"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ডিভাইসের সামনে ফেসটি স্থির রাখুন।"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"ফেসের হার্ডওয়্যার উপলভ্য নয়৷"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"ফেসের ছাপ নেওয়ার সময়সীমা শেষ৷ আবার চেষ্টা করুন৷"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"ফেস স্টোর করা যাবে না।"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"ফেস অপারেশন বাতিল করা হয়েছে৷"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"অনেকবার চেষ্টা করা হয়েছে৷ ফেস যাচাইকরণ বন্ধ আছে।"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"আবার চেষ্টা করুন।"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"কোনও ফেস নথিভুক্ত করা হয়নি।"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"এই ডিভাইসে ফেস যাচাইকরণ সেন্সর নেই"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> ফেস"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"ফেস আইকন"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"সিঙ্ক সেটিংস পড়ে"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"অ্যাপ্লিকেশানটিকে একটি অ্যাকাউন্টের জন্য সিঙ্ক সেটিংস পড়ার অনুমতি দেয়৷ উদাহরণস্বরূপ, \'পিপল\' অ্যাপ্লিকেশানটি কোনো অ্যাকাউন্টের সাথে সিঙ্ক করা আছে কিনা তা নির্ধারণ করতে পারে৷"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"সমন্বয় চালু এবং বন্ধ করা টগল করুন"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"ওয়াই-ফাই এ ইন্টারনেট অ্যাক্সেস নেই"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"বিকল্পগুলির জন্য আলতো চাপুন"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"আপনার হটস্পট সেটিংসে পরিবর্তনগুলি"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"আপনার হটস্পট ব্যান্ড পরিবর্তন করা হয়েছে।"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"এই ডিভাইসটি শুধুমাত্র 5GHz এর জন্য আপনার পছন্দ সমর্থন করে না। পরিবর্তে, এই ডিভাইসটি 5GHz ব্যান্ড ব্যবহার করবে।"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> এ পাল্টানো হয়েছে"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> এ ইন্টারনেট অ্যাক্সেস না থাকলে <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ব্যবহার করা হয়৷ ডেটা চার্জ প্রযোজ্য৷"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> থেকে <xliff:g id="NEW_NETWORK">%2$s</xliff:g> এ পাল্টানো হয়েছে"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"আপনার প্রশাসক এই ডিভাইসটির সমস্যা নিবারণে সহায়তা করতে একটি ত্রুটির প্রতিবেদন চেয়েছেন৷ অ্যাপ এবং ডেটা শেয়ার করা হতে পারে৷"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"শেয়ার করুন"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"অস্বীকার করুন"</string>
- <string name="select_input_method" msgid="8547250819326693584">"কীবোর্ড পরিবর্তন করুন"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ইনপুট পদ্ধতি বেছে নিন"</string>
<string name="show_ime" msgid="2506087537466597099">"ফিজিক্যাল কীবোর্ড সক্রিয় থাকার সময় এটিকে স্ক্রীনে রাখুন"</string>
<string name="hardware" msgid="194658061510127999">"ভার্চুয়াল কীবোর্ড দেখুন"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ফিজিক্যাল কীবোর্ড কনফিগার করুন"</string>
@@ -1314,7 +1350,7 @@
<string name="ext_media_status_ejecting" msgid="5463887263101234174">"সরিয়ে ফেলা হচ্ছে..."</string>
<string name="ext_media_status_formatting" msgid="1085079556538644861">"ফরম্যাট করা হচ্ছে..."</string>
<string name="ext_media_status_missing" msgid="5638633895221670766">"ঢোকানো হয় নি"</string>
- <string name="activity_list_empty" msgid="1675388330786841066">"কোনো সমরূপ কার্যকলাপ খুঁজে পাওয়া যায়নি৷"</string>
+ <string name="activity_list_empty" msgid="1675388330786841066">"কোনো সমরূপ অ্যাক্টিভিটি খুঁজে পাওয়া যায়নি৷"</string>
<string name="permlab_route_media_output" msgid="6243022988998972085">"মিডিয়া আউটপুট রুট করুন"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"অ্যাপ্লিকেশানটিকে অন্যান্য বহিরাগত ডিভাইসে মিডিয়া আউটপুট রুট করার অনুমতি দেয়৷"</string>
<string name="permlab_readInstallSessions" msgid="3713753067455750349">"ইনস্টল সেশন পড়ুন"</string>
@@ -1474,7 +1510,7 @@
<string name="sha256_fingerprint" msgid="4391271286477279263">"SHA-256 আঙ্গুলের ছাপ:"</string>
<string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 আঙ্গুলের ছাপ:"</string>
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"সবগুলো দেখুন"</string>
- <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"কার্যকলাপ বেছে নিন"</string>
+ <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"অ্যাক্টিভিটি বেছে নিন"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"এর সাথে শেয়ার করুন"</string>
<string name="sending" msgid="3245653681008218030">"পাঠানো হচ্ছে..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ব্রাউজার লঞ্চ করতে চান?"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 32ab685adf0b..6a88c300922f 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -239,9 +239,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Način rada u avionu"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uključen je način rada u avionu"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Način rada u avionu ugašen"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Ušteda baterije"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Ušteda baterije je ISKLJUČENA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Ušteda baterije je UKLJUČENA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
@@ -279,6 +276,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupa lokaciji ovog uređaja"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristup lokaciji ovog uređaja?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Ova aplikacija će moći pristupiti lokaciji uređaja samo kada je koristite."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Uvijek dozvoliti da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pristupi lokaciji uređaja?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Ova aplikacija će uvijek moći pristupiti lokaciji uređaja, čak i kada je ne koristite."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupa vašem kalendaru"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Dozvoliti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupi vašem kalendaru?"</string>
@@ -405,12 +405,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Ova aplikacija može dodavati, uklanjati ili mijenjati događaje u kalendaru na vašem telefonu. Aplikacija može slati poruke koje mogu izgledati kao da dolazi od vlasnika kalendara ili promijeniti događaje bez obavještenja vlasnika."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"pristup dodatnim informacijama o lokaciji"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Dozvoljava aplikaciji pristup dodatnim naredbama pružatelja lokacija. Ovim se aplikaciji može dozvoliti da ometa rad GPS-a ili drugih izvora lokacija."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"pristup preciznoj lokaciji (utvrđena preko mreže i GPS-a)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Ova aplikacija može odrediti vašu lokaciju na osnovu GPS sistema ili mrežnih izvora za određivanje lokacije kao što su predajnici za mobilnu mrežu i WiFi mreže. Ove usluge za određivanje lokacije moraju biti uključene i omogućene na vašem telefonu kako bi ih aplikacija mogla koristiti. To može uzrokovati veću potrošnju baterije."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"pristup tačnoj lokaciji samo u prvom planu"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Ova aplikacija može odrediti vašu tačnu lokaciju samo kada je u prvom planu. Ove usluge lokacije moraju biti uključene i dostupne na vašem telefonu da ih aplikacija može koristiti. To može dovesti do povećane potrošnje baterije."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"pristup približnoj lokaciji (utvrđena preko mreže)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Ova aplikacija može odrediti vašu lokaciju na osnovu izvora mreže kao što su predajnici za mobilnu mrežu i WiFi mreže. Ove usluge za određivanje lokacije moraju biti uključene i omogućene na vašem tabletu kako bi ih aplikacija mogla koristiti."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Ova aplikacija može odrediti vašu lokaciju na osnovu izvora mreže kao što su predajnici za mobilnu mrežu i WiFi mreže. Ove usluge za određivanje lokacije moraju biti uključene i omogućene na vašem TV-u kako bi ih aplikacija mogla koristiti."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Ova aplikacija može odrediti vašu lokaciju na osnovu izvora mreže kao što su predajnici za mobilnu mrežu i WiFi mreže. Ove usluge za određivanje lokacije moraju biti uključene i omogućene na vašem telefonu kako bi ih aplikacija mogla koristiti."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"pristupi tačnoj lokaciji u pozadini"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Ova aplikacija može odrediti vašu tačnu lokaciju u svakom trenutku kada je u pozadini. Ove usluge za određivanje lokacije moraju biti uključene i dostupne na vašem telefonu da ih aplikacija može koristiti. To može izazvati povećanje potrošnje baterije."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"izmjene postavki zvuka"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Omogućava aplikaciji izmjenu općih postavki zvuka, kao što su jačina zvuka i izbor izlaznog zvučnika."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"snimanje audiozapisa"</string>
@@ -458,7 +460,7 @@
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"prikaz mrežnih veza"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Omogućava aplikaciji pregled informacija o mrežnim vezama, npr. koje mreže postoje i koje su povezane."</string>
<string name="permlab_createNetworkSockets" msgid="7934516631384168107">"ima potpuni pristup mreži"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Omogućava aplikaciji kreiranje spojnih tačaka sa mrežom i korištenje prilagođenih mrežnih protokola. Preglednik i druge aplikacije omogućavaju slanje podataka na internet, tako da ovo odobrenje nije potrebno za vršenje te radnje."</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Omogućava aplikaciji kreiranje spojnih tačaka s mrežom i korištenje prilagođenih mrežnih protokola. Preglednik i druge aplikacije omogućavaju slanje podataka na internet, tako da ovo odobrenje nije potrebno za vršenje te radnje."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"izmjene povezivanja na mrežu"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Dozvoljava aplikaciji izmjenu stanja mrežne povezanosti."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"izmjene podijeljenog povezivanja"</string>
@@ -502,11 +504,11 @@
<string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Prst je uklonjen presporo. Pokušajte ponovo."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nije prepoznat"</string>
+ <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nije prepoznato"</string>
<string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisak prsta je potvrđen"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otisak prsta nije dostupan."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta se ne može pohraniti. Uklonite postojeći otisak prsta."</string>
- <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Pokušajte ponovo."</string>
+ <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vrijeme za prepoznavanje otiska prsta je isteklo. Pokušajte ponovo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja sa otiskom prsta je otkazana."</string>
<string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Korisnik je otkazao radnju s otiskom prsta."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
@@ -518,6 +520,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona za otisak prsta"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"upravljanje hardverom za autentifikaciju licem"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Omogućava aplikaciji da koristi metode za dodavanje i brisanje šablona lica za upotrebu."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"upotreba hardvera za autentifikaciju licem"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Omogućava aplikaciji da za autentifikaciju koristi hardver za autentifikaciju licem"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Obrada lica nije uspjela. Pokušajte ponovo."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Lice je presvijetlo. Pokušajte s manje svjetla."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Lice je pretamno. Pojačajte izvor svjetlosti."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Odmaknite senzor od lica."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Približite senzor licu."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Pomjerite senzor prema gore."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Pomjerite senzor prema dolje."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Pomjerite senzor udesno."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Pomjerite senzor ulijevo."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Gledajte u senzor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nije pronađeno nijedno lice."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mirno držite lice ispred uređaja."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardver za prepoznavanje lica nije dostupan."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Vrijeme za prepoznavanje lica je isteklo. Pokušajte ponovo."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće pohraniti lice."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Prepoznavanje lica je otkazano."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Previše pokušaja. Autentifikacija lica onemogućena."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Pokušajte ponovo."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nije prijavljeno nijedno lice."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Ovaj uređaj nema senzor za autentifikaciju lica"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikona lica"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"čitanje postavki za sinhroniziranje"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Omogućava aplikaciji čitanje postavki sinhroniziranja za račun. Naprimjer, ovim se može utvrditi da li je aplikacija People sinhronizirana sa računom."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"aktiviranje/deaktiviranje sinhroniziranja"</string>
@@ -1199,6 +1232,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"WiFi nema pristup internetu"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Promjene postavki vaše pristupne tačke"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Opseg vaše pristupne tačke je promijenjen."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava vašu postavku za mreže od isključivo 5GHz. Uređaj će koristiti opseg of 5GHz kada je dostupan."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Prebačeno na: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Kada <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nema pristup internetu, uređaj koristi mrežu <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Moguća je naplata usluge."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Prebačeno iz mreže <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> u <xliff:g id="NEW_NETWORK">%2$s</xliff:g> mrežu"</string>
@@ -1223,7 +1259,7 @@
<string name="accept" msgid="1645267259272829559">"Prihvati"</string>
<string name="decline" msgid="2112225451706137894">"Odbijte"</string>
<string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"Pozivnica poslana"</string>
- <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Poziv za povezivanje"</string>
+ <string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"Pozivnica za povezivanje"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"Pošiljalac:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"Prima:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Unesite potrebni PIN:"</string>
@@ -1286,7 +1322,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Vaš administrator je zatražio izvještaj o greškama kako bi pomogao u rješavanju problema ovog uređaja. Moguće je dijeljenje aplikacija i podataka."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"PODIJELI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ODBACI"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Promijeni tastaturu"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Odabir načina unosa"</string>
<string name="show_ime" msgid="2506087537466597099">"Prikaži na ekranu dok je fizička tastatura aktivna"</string>
<string name="hardware" msgid="194658061510127999">"Prikaz virtuelne tastature"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfiguriraj fizičku tastaturu"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 5599b0b2d7c6..207992567413 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -133,8 +133,8 @@
<item msgid="4397097370387921767">"Trucades per Wi-Fi %s"</item>
</string-array>
<string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivat"</string>
- <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferència per a la Wi-Fi"</string>
- <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferència per a dades mòbils"</string>
+ <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferència per la Wi-Fi"</string>
+ <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferència per dades mòbils"</string>
<string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Només Wi-Fi"</string>
<string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no s\'ha desviat"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode d\'avió"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode d\'avió activat"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode d\'avió desactivat"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Estalvi de bateria"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"El mode d\'estalvi de bateria està desactivat"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"El mode d\'estalvi de bateria està activat"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configuració"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistència"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. per veu"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicació"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accedir a la ubicació del dispositiu"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi a la ubicació del dispositiu?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"L\'aplicació només tindrà accés a la ubicació quan l\'estiguis utilitzant."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi sempre a la ubicació del dispositiu?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"L\'aplicació tindrà accés sempre a la ubicació, fins i tot quan no l\'estiguis utilitzant."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendari"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accedir al calendari"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vols permetre que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; accedeixi al calendari?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Aquesta aplicació pot afegir, suprimir i canviar esdeveniments del calendari al telèfon. També pot enviar missatges que sembli que provenen dels propietaris del calendari o canviar esdeveniments sense notificar-los-ho."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accedir a ordres del proveïdor d\'ubicació addicionals"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permet que l\'aplicació accedeixi a ordres addicionals del proveïdor d\'ubicacions; per tant, és possible que l\'aplicació pugui interferir en el funcionament del GPS o d\'altres fonts d\'ubicacions."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"accedir a la ubicació precisa (basada en el GPS i en la xarxa)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Aquesta aplicació pot obtenir la teva ubicació a partir de sistemes GPS i de fonts de xarxa, com ara torres de telefonia mòbil i xarxes Wi-Fi. Aquests serveis d\'ubicació han d\'estar activats i disponibles al telèfon perquè l\'aplicació els pugui utilitzar, i això pot fer que el consum de bateria augmenti."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"accedeix a la ubicació exacta només en primer pla"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Aquesta aplicació pot obtenir la teva ubicació exacta només quan està en primer pla. Aquests serveis d\'ubicació han d\'estar activats i disponibles al telèfon perquè l\'aplicació els pugui utilitzar, i això pot fer que el consum de bateria augmenti."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"accedir a la ubicació aproximada (basada en la xarxa)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Aquesta aplicació pot obtenir la teva ubicació a partir de fonts de xarxa, com ara torres de telefonia mòbil i xarxes Wi-Fi. Aquests serveis d\'ubicació han d\'estar activats i disponibles a la tauleta perquè l\'aplicació els pugui utilitzar."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Aquesta aplicació pot obtenir la teva ubicació a partir de fonts de xarxa, com ara torres de telefonia mòbil i xarxes Wi-Fi. Aquests serveis d\'ubicació han d\'estar activats i disponibles al televisor perquè l\'aplicació els pugui utilitzar."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Aquesta aplicació pot obtenir la teva ubicació a partir de fonts de xarxa, com ara torres de telefonia mòbil i xarxes Wi-Fi. Aquests serveis d\'ubicació han d\'estar activats i disponibles al telèfon perquè l\'aplicació els pugui utilitzar."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"accedeix a la ubicació exacta en segon pla"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Aquesta aplicació pot obtenir la teva ubicació exacta sempre que estigui en segon pla. Aquests serveis d\'ubicació han d\'estar activats i disponibles al telèfon perquè l\'aplicació els pugui utilitzar, i això pot fer que el consum de bateria augmenti."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"canviar la configuració d\'àudio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permet que l\'aplicació modifiqui la configuració d\'àudio general, com ara el volum i l\'altaveu de sortida que es fa servir."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"gravar àudio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona d\'empremta digital"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"gestiona el maquinari d\'autenticació facial"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permet que l\'aplicació afegeixi i suprimeixi plantilles de cares que es puguin fer servir."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilitza el maquinari d\'autenticació facial"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permet que l\'aplicació faci servir maquinari d\'autenticació facial"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Error en processar la cara. Torna-ho a provar."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"La cara brilla massa. Prova amb menys llum."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"La cara és massa fosca. Prova amb més llum."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Allunya el sensor de la cara."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Apropa el sensor a la cara."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Puja el sensor més amunt."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Baixa el sensor més avall."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Mou el sensor cap a la dreta."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Mou el sensor cap a l\'esquerra."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Mira el sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"No s\'ha detectat cap cara."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mantén la cara quieta davant del dispositiu."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Maquinari de reconeixement facial no disponible."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"S\'ha esgotat el temps d\'espera. Torna-ho a provar."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"La cara no es pot desar."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"S\'ha cancel·lat el reconeixement facial."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Massa intents. Torna-ho a provar més tard."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Massa intents. Autenticació facial desactivada."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Torna-ho a provar."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"No s\'ha registrat cap cara."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Aquest dispositiu no té sensor d\'autenticació facial"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Icona facial"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"llegir la configuració de sincronització"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Persones estigui sincronitzada amb un compte."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar o desactivar la sincronització"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"La Wi-Fi no té accés a Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca per veure les opcions"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Canvis en la configuració del punt d\'accés Wi-Fi"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ha canviat la teva banda del punt d\'accés Wi-Fi."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Aquest dispositiu no admet utilitzar exclusivament una banda de 5 GHz. El dispositiu utilitzarà una banda de 5 GHz quan estigui disponible."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Actualment en ús: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"El dispositiu utilitza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> en cas que <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tingui accés a Internet. És possible que s\'hi apliquin càrrecs."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Abans es feia servir la xarxa <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>; ara s\'utilitza <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"L\'administrador ha sol·licitat un informe d\'errors per resoldre els problemes d\'aquest dispositiu. És possible que es comparteixin aplicacions i dades."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"COMPARTEIX"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"REBUTJA"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Canvia el teclat"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Selecciona un mètode d\'introducció"</string>
<string name="show_ime" msgid="2506087537466597099">"Mantén-lo en pantalla mentre el teclat físic està actiu"</string>
<string name="hardware" msgid="194658061510127999">"Mostra el teclat virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configura el teclat físic"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 1bdf49715349..46abc80ca875 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Režim Letadlo"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim Letadlo je ZAPNUTÝ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim Letadlo je VYPNUTÝ"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Spořič baterie"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Spořič baterie je VYPNUTÝ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Spořič baterie je ZAPNUTÝ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Nastavení"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistence"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hlas. asistence"</string>
@@ -282,6 +279,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Poloha"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"přístup k poloze tohoto zařízení"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup k poloze tohoto zařízení?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikace bude mít přístup k poloze, pouze když ji budete používat."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup k poloze tohoto zařízení?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikace bude mít přístup k poloze vždy, i když ji nebudete používat."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendář"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"přístup ke kalendáři"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Povolit aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; přístup ke kalendáři?"</string>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Tato aplikace může přidat, odstranit či změnit události v kalendáři uložené v telefonu. Může také odesílat zprávy, které budou zdánlivě přicházet od vlastníka kalendáře, nebo upravovat události bez vědomí vlastníka."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"přístup k dalším příkazům poskytovatele polohy"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Umožňuje aplikaci přístup k dalším příkazům poskytovatele polohy. To aplikaci umožní zasahovat do fungování systému GPS a dalších zdrojů polohy."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"přístup k přesné poloze (pomocí GPS a sítě)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Tato aplikace může zjistit vaši polohu podle GPS a zdrojů polohy sítě, jako jsou vysílací věže nebo sítě Wi-Fi. Aby tyto služby určování polohy mohla aplikace používat, musí být v telefonu dostupné a musí být zapnuté. Tyto služby mohou způsobit rychlejší vybíjení baterie."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"přístup k přesné poloze jen na popředí"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Tato aplikace může zjistit vaši přesnou polohu, jen když běží na popředí. Aby tyto služby určování polohy mohla aplikace používat, musí být v telefonu dostupné a musí být zapnuté. Tyto služby mohou způsobit rychlejší vybíjení baterie."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"přístup k přibližné poloze (pomocí sítě)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Tato aplikace může zjistit vaši polohu podle zdrojů sítě, jako jsou vysílací věže nebo sítě Wi-Fi. Aby tyto služby určování polohy mohla aplikace používat, musí být v tabletu dostupné a musí být zapnuté."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Tato aplikace může zjistit vaši polohu podle zdrojů sítě, jako jsou vysílací věže nebo sítě Wi-Fi. Aby tyto služby určování polohy mohla aplikace používat, musí být v televizi dostupné a musí být zapnuté."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Tato aplikace může zjistit vaši polohu podle zdrojů sítě, jako jsou vysílací věže nebo sítě Wi-Fi. Aby tyto služby určování polohy mohla aplikace používat, musí být v telefonu dostupné a musí být zapnuté."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"přístup k přesné poloze na pozadí"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Tato aplikace může zjistit vaši přesnou polohu vždy, když běží na pozadí. Aby tyto služby určování polohy mohla aplikace používat, musí být v telefonu dostupné a musí být zapnuté. Tyto služby mohou způsobit rychlejší vybíjení baterie."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"změna nastavení zvuku"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Umožňuje aplikaci změnit globální nastavení zvuku, například hlasitost či reproduktor pro výstup zvuku."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"nahrávání zvuku"</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona otisku prstů"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"správa hardwaru k ověření obličeje"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Umožňuje aplikaci volat metody k přidání a smazání šablon obličeje, které budou použity."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"použití hardwaru k ověření obličeje"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Umožňuje aplikaci provést ověření pomocí hardwaru k ověření obličeje"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Zpracování obličeje se nezdařilo. Zkuste to znovu."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Obličej je moc jasný. Zkuste to v menším světle."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Obličej je moc tmavý. Odkryjte zdroj světla."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Oddalte senzor od obličeje."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Posuňte senzor blíž k obličeji."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Posuňte senzor výš."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Posuňte senzor níž."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Posuňte senzor doprava."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Posuňte senzor doleva."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Podívejte se do senzoru."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nebyl rozpoznán žádný obličej."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Držte obličej nehybně před zařízením."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Není k dispozici hardware ke snímání obličeje."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Limit ověření obličeje vypršel. Zkuste to znovu."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Obličej nelze uložit."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Operace snímání obličeje byla zrušena."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Příliš mnoho pokusů. Zkuste to později."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Příliš mnoho pokusů. Ověření obličeje je zakázáno."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Zkuste to znovu."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Není zaregistrován žádný obličej."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Toto zařízení nemá snímač ověření obličeje"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Obličej <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikona obličeje"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"čtení nastavení synchronizace"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Umožňuje aplikaci číst nastavení synchronizace v účtu. Může například určit, zda je s účtem synchronizována aplikace Lidé."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"vypnutí nebo zapnutí synchronizace"</string>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nemá přístup k internetu"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Klepnutím zobrazíte možnosti"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Změny nastavení hotspotu"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pásmo hotspotu se změnilo."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Toto zařízení nepodporuje vaše nastavení jen 5GHz pásma. Zařízení použije pásmo 5 GHz, jen když bude dostupné."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Přechod na síť <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Když síť <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nebude mít přístup k internetu, zařízení použije síť <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Mohou být účtovány poplatky."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Přechod ze sítě <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na síť <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administrátor si vyžádal zprávu o chybě, aby mohl problém se zařízením odstranit. Aplikace a data mohou být sdílena."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SDÍLET"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ODMÍTNOUT"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Změna klávesnice"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Vybrat metodu zadávání"</string>
<string name="show_ime" msgid="2506087537466597099">"Ponechat na obrazovce, když je aktivní fyzická klávesnice"</string>
<string name="hardware" msgid="194658061510127999">"Zobrazit virtuální klávesnici"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurace fyzické klávesnice"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 4fd57dd72fb3..8c86ac827cb4 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flytilstand"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flytilstand er TIL"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flytilstand er slået FRA"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterisparefunktion"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterisparefunktion er slået FRA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterisparefunktion er slået TIL"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Indstillinger"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Taleassistent"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Placering"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"få adgang til enhedens placering"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til enhedens placering?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Appen har kun adgang til placeringen, når du bruger appen."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Skal &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; altid have adgang til enhedens placering?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Appen har altid adgang til placeringen, også selvom du ikke bruger appen."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"have adgang til din kalender"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vil du give &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; adgang til din kalender?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Denne app kan tilføje, fjerne eller ændre kalenderbegivenheder på din telefon. Denne app kan sende meddelelser, der kan se ud, som om de kommer fra kalenderejere, eller ændre begivenheder uden at give ejeren besked."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"få adgang til yderligere kommandoer for placeringsudbyder"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Tillader, at appen kan få adgang til yderligere kommandoer for placeringsudbydere. Dette kan gøre det muligt for appen at forstyrre GPS-funktionen eller andre placeringskilder."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"få adgang til nøjagtig placering (baseret på GPS og netværk)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Denne app kan bestemme din placering ved hjælp af netværkskilder, som f.eks. mobilmaster og Wi-Fi-netværk. Disse placeringstjenester skal være aktiverede og tilgængelige på din telefon, før appen kan bruge dem. Dette kan øge batteriforbruget."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"få kun adgang til nøjagtig placering i forgrunden"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Denne app kan kun få din nøjagtige placering, når den er i forgrunden. Disse placeringstjenester skal være aktiverede og tilgængelige på din telefon, før appen kan bruge dem. Dette kan øge batteriforbruget."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"få adgang til omtrentlig placering (netværksbaseret)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Denne app kan bestemme din placering ved hjælp af netværkskilder, som f.eks. mobilmaster og Wi-Fi-netværk. Disse placeringstjenester skal være aktiverede og tilgængelige på din tablet, før appen kan bruge dem."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Denne app kan bestemme din placering ved hjælp af netværkskilder, som f.eks. mobilmaster og Wi-Fi-netværk. Disse placeringstjenester skal være aktiverede og tilgængelige på dit fjernsyn, før appen kan bruge dem."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Denne app kan bestemme din placering ved hjælp af netværkskilder, som f.eks. mobilmaster og Wi-Fi-netværk. Disse placeringstjenester skal være aktiverede og tilgængelige på din telefon, før appen kan bruge dem."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"få adgang til nøjagtig placering i baggrunden"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Denne app kan få din nøjagtige placering, når den er i baggrunden. Disse placeringstjenester skal være aktiverede og tilgængelige på din telefon, før appen kan bruge dem. Dette kan øge batteriforbruget."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"skifte dine lydindstillinger"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Tillader, at appen kan ændre globale lydindstillinger, som f.eks. lydstyrke og hvilken højttaler der bruges til output."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"optage lyd"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon for fingeraftryk"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"administrer hardware til ansigtsgenkendelse"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Tillader, at appen kan bruge metoder til at tilføje og slette ansigtsskabeloner."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"brug hardware til ansigtsgenkendelse"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tillader, at appen bruger ansigtsgenkendelseshardware til godkendelse"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Ansigtet kunne ikke behandles. Prøv igen."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Ansigtet er for lyst. Prøv i svagere belysning."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Ansigtet er for mørkt. Ryk tættere på en lyskilde."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Flyt sensoren længere væk fra ansigtet."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Ryk sensoren tættere på ansigtet."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Flyt sensoren højere op."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Flyt sensoren længere ned."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Flyt sensoren til højre."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Flyt sensoren til venstre."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Kig på sensoren."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Der er ikke registreret noget ansigt."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Hold ansigtet stille foran enheden."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardwaren til ansigtsregistrering er ikke klar."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Ansigtsgenkendelse fik timeout. Prøv igen."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Ansigtet kan ikke gemmes."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Ansigtshandlingen blev annulleret."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Du har prøvet for mange gange. Prøv igen senere."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"For mange forsøg – Ansigtsgenkendelse deaktiveret."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Prøv igen."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Der er ikke registreret nogen ansigter."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Denne enhed har ingen sensor til ansigtsgenkendelse"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Ansigt <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ansigt"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"læse indstillinger for synkronisering"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tillader, at appen kan læse synkroniseringsindstillingerne for en konto. Denne tilladelse kan f.eks. fastslå, om appen Personer er synkroniseret med en konto."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"slå synkronisering til og fra"</string>
@@ -587,7 +620,7 @@
<string name="policylab_resetPassword" msgid="4934707632423915395">"Skifte skærmlås"</string>
<string name="policydesc_resetPassword" msgid="1278323891710619128">"Skifter skærmlås"</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"Låse skærmen"</string>
- <string name="policydesc_forceLock" msgid="1141797588403827138">"Kontrollerer, hvordan og hvornår skærmen låses."</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"Administrerer, hvordan og hvornår skærmen låses."</string>
<string name="policylab_wipeData" msgid="3910545446758639713">"Slette alle data"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Slet din tablets data uden varsel ved at gendanne fabriksindstillingerne."</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Slet tv\'ets data uden varsel ved at nulstille til fabrinksindstillingerne."</string>
@@ -719,7 +752,7 @@
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Hjem"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Arbejde"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"Andet"</string>
- <string name="quick_contacts_not_available" msgid="746098007828579688">"Der blev ikke fundet nogen applikation, som kan vise denne kontaktperson."</string>
+ <string name="quick_contacts_not_available" msgid="746098007828579688">"Der blev ikke fundet nogen applikation, som kan vise denne kontakt."</string>
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Angiv pinkode"</string>
<string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Angiv PUK- og pinkode"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK-kode"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-netværket har ikke internetadgang"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tryk for at se valgmuligheder"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Ændringer af dine indstillinger for hotspot"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Dit hotspotbånd er ændret."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Denne enhed understøtter ikke din præference om kun 5 GHz. Denne enhed vil i stedet bruge 5 GHz-båndet, når det er muligt."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Der blev skiftet til <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Enheden benytter <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, når der ikke er internetadgang via <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>. Der opkræves muligvis betaling."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Der blev skiftet fra <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> til <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Din administrator har anmodet om en fejlrapport for bedre at kunne finde og rette fejlen på enheden. Apps og data deles muligvis."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DEL"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"AFVIS"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Skift tastatur"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Vælg inputmetode"</string>
<string name="show_ime" msgid="2506087537466597099">"Behold den på skærmen, mens det fysiske tastatur er aktivt"</string>
<string name="hardware" msgid="194658061510127999">"Vis virtuelt tastatur"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurer fysisk tastatur"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index f4038aefc2c2..8dc0ba481a97 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flugmodus"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flugmodus ist AN."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flugmodus ist AUS."</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Energiesparmodus"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Energiesparmodus ist aus"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Energiesparmodus ist an"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Einstellungen"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistent"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Sprachassistent"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Standort"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"auf den Standort deines Geräts zugreifen"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; erlauben, den Gerätestandort abzurufen?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Die App hat nur Zugriff auf den Gerätestandort, wenn du sie verwendest."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; immer erlauben, den Gerätestandort abzurufen?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Die App hat immer Zugriff auf den Gerätestandort, auch wenn du sie gerade nicht verwendest."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"auf deinen Kalender zugreifen"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; Zugriff auf deinen Kalender erlauben?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Diese App kann Kalendertermine auf deinem Smartphone hinzufügen, entfernen oder ändern. Diese App kann Nachrichten senden, die scheinbar von Kalendereigentümern stammen, oder Termine ohne Benachrichtigung der Eigentümer ändern."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Auf zusätzliche Dienstanbieterbefehle für Standort zugreifen"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Ermöglicht der App, auf zusätzliche Standortanbieterbefehle zuzugreifen. Damit könnte die App die Funktionsweise von GPS oder anderen Standortquellen beeinträchtigen."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"Auf genauen Standort zugreifen (GPS- und netzwerkbasiert)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Diese App kann deinen Standort über GPS oder mithilfe von Netzwerkstandortquellen wie Mobilfunkmasten und WLAN ermitteln. Die App kann diese Standortdienste nur verwenden, wenn sie auf deinem Smartphone aktiviert und verfügbar sind. Hierdurch kann sich der Akkuverbrauch erhöhen."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"Nur bei Ausführung im Vordergrund auf den genauen Standort zugreifen"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Diese App kann deinen genauen Standort nur dann ermitteln, wenn sie im Vordergrund ausgeführt wird. Die App kann diese Standortdienste nur verwenden, wenn sie auf deinem Smartphone aktiviert und verfügbar sind. Hierdurch kann sich der Akkuverbrauch erhöhen."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"Auf den ungefähren Standort zugreifen (netzwerkbasiert)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Diese App kann deinen Standort mithilfe von Netzwerkquellen wie Mobilfunkmasten und WLAN ermitteln. Die App kann diese Standortdienste nur verwenden, wenn sie auf deinem Tablet aktiviert und verfügbar sind."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Diese App kann deinen Standort mithilfe von Netzwerkquellen wie Mobilfunkmasten und WLAN ermitteln. Die App kann diese Standortdienste nur verwenden, wenn sie auf deinem Fernseher aktiviert und verfügbar sind."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Diese App kann deinen Standort mithilfe von Netzwerkquellen wie Mobilfunkmasten und WLAN ermitteln. Die App kann diese Standortdienste nur verwenden, wenn sie auf deinem Smartphone aktiviert und verfügbar sind."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"im Hintergrund auf den genauen Standort zugreifen"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Diese App kann deinen genauen Standort jederzeit im Hintergrund ermitteln. Die App kann diese Standortdienste nur verwenden, wenn sie auf deinem Smartphone aktiviert und verfügbar sind. Hierdurch kann sich der Akkuverbrauch erhöhen."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"Audio-Einstellungen ändern"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Ermöglicht der App, globale Audio-Einstellungen zu ändern, etwa die Lautstärke und den Lautsprecher für die Ausgabe."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"Audio aufnehmen"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerabdruck-Symbol"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"Gesichtserkennungshardware verwalten"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Ermöglicht der App, Methoden zum Hinzufügen oder Entfernen von Gesichtsvorlagen anzuwenden."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"Gesichtserkennungshardware verwenden"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Ermöglicht der App, für die Authentifizierung Gesichtserkennungshardware zu verwenden"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kann Gesicht nicht verarbeiten. Versuch es erneut."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Gesicht zu hell. Bei weniger Licht versuchen."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Gesicht zu dunkel. Bei mehr Licht versuchen."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Sensor weiter weg vom Gesicht halten."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Sensor näher an das Gesicht halten."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Sensor höher halten."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Sensor niedriger halten."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Sensor nach rechts bewegen."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Sensor nach links bewegen."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Blick auf den Sensor richten."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Kein Gesicht erkannt."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Gerät vor das Gesicht halten und nicht bewegen."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware zur Gesichtserkennung nicht verfügbar."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Zeitüberschreitung für Gesicht. Versuch es erneut."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Gesicht kann nicht gespeichert werden."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Gesichtserkennung abgebrochen."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Zu viele Versuche. Versuch es später noch einmal."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Zu viele Versuche. Gesichtserkennung deaktiviert."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Versuch es noch einmal."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Kein Gesicht erfasst."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Dieses Gerät hat keinen Gesichtserkennungssensor"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Gesicht <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Gesichtssymbol"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"Synchronisierungseinstellungen lesen"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ermöglicht der App, die Synchronisierungseinstellungen eines Kontos zu lesen. Beispielsweise kann damit festgestellt werden, ob Kontakte mit einem Konto synchronisiert werden."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Synchronisierung aktivieren oder deaktivieren"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"WLAN hat keinen Internetzugriff"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Für Optionen tippen"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Änderungen an deinen Hotspot-Einstellungen"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Dein Hotspot-Band hat sich geändert."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Dieses Gerät unterstützt die ausschließliche Nutzung von 5 GHz nicht. Es greift aber immer auf das 5-GHz-Band zurück, wenn dieses verfügbar ist."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Zu <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> gewechselt"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Auf dem Gerät werden <xliff:g id="NEW_NETWORK">%1$s</xliff:g> genutzt, wenn über <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> kein Internet verfügbar ist. Eventuell fallen Gebühren an."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Von \"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>\" zu \"<xliff:g id="NEW_NETWORK">%2$s</xliff:g>\" gewechselt"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Dein Administrator hat einen Fehlerbericht zur Fehlerbehebung für dieses Gerät angefordert. Apps und Daten werden unter Umständen geteilt."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"TEILEN"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ABLEHNEN"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Tastatur ändern"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Eingabemethode wählen"</string>
<string name="show_ime" msgid="2506087537466597099">"Auf dem Display einblenden, wenn die physische Tastatur aktiv ist"</string>
<string name="hardware" msgid="194658061510127999">"Virtuelle Tastatur einblenden"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Physische Tastatur konfigurieren"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index a51ff038c272..c6acc9e058ca 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Λειτουργία πτήσης"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Η λειτουργία πτήσης είναι ενεργοποιημένη."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Λειτ. πτήσης είναι ανενεργή"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Εξοικονόμηση μπαταρίας"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Η εξοικονόμηση μπαταρίας είναι ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΗ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Η Εξοικονόμηση μπαταρίας είναι ΕΝΕΡΓΗ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ρυθμίσεις"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Βοήθεια"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Φων.υποβοηθ."</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Τοποθεσία"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"έχει πρόσβαση στην τοποθεσία της συσκευής"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στην τοποθεσία αυτής της συσκευής;"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Η εφαρμογή θα έχει πρόσβαση στην τοποθεσία μόνο κατά τη διάρκεια χρήσης της εφαρμογής."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Να επιτρέπεται πάντα στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στην τοποθεσία αυτής της συσκευής;"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Η εφαρμογή θα έχει πάντα πρόσβαση στην τοποθεσία, ακόμα και όταν δεν χρησιμοποιείτε την εφαρμογή."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Ημερολόγιο"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"έχει πρόσβαση στο ημερολόγιό σας"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Να επιτρέπεται στην εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; να έχει πρόσβαση στο ημερολόγιό σας;"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Αυτή η εφαρμογή μπορεί να προσθέσει, να καταργήσει ή να αλλάξει συμβάντα ημερολογίου στο τηλέφωνό σας. Αυτή η εφαρμογή μπορεί να στέλνει μηνύματα τα οποία μπορεί να φαίνεται ότι προέρχονται από κατόχους ημερολογίου ή να αλλάζει συμβάντα χωρίς να ειδοποιεί τους κατόχους."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"έχει πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Επιτρέπει στην εφαρμογή την πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας. Αυτό μπορεί να δώσει τη δυνατότητα στην εφαρμογή να παρέμβει στη λειτουργία του GPS ή άλλων πηγών τοποθεσίας."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"έχει πρόσβαση στην ακριβή τοποθεσία (με βάση το GPS και το δίκτυο)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Αυτή η εφαρμογή μπορεί να εντοπίσει την τοποθεσία σας βάσει πηγών τοποθεσίας GPS ή δικτύου, όπως κεραίες κινητής τηλεφωνίας και δίκτυα Wi-Fi. Αυτές οι υπηρεσίες τοποθεσίας θα πρέπει να είναι ενεργοποιημένες και διαθέσιμες στο τηλέφωνό σας, προκειμένου να μπορεί να τις χρησιμοποιήσει η εφαρμογή. Με την ενεργοποίηση αυτής της ρύθμισης, μπορεί να αυξηθεί η κατανάλωση μπαταρίας."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"πρόσβαση στην ακριβή τοποθεσία μόνο στο προσκήνιο"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Αυτή η εφαρμογή μπορεί να ανιχνεύσει την ακριβή τοποθεσία σας όταν βρίσκεται στο προσκήνιο. Αυτές οι υπηρεσίες τοποθεσίας θα πρέπει να είναι ενεργοποιημένες και διαθέσιμες στο τηλέφωνό σας, προκειμένου να μπορεί να τις χρησιμοποιήσει η εφαρμογή. Με την ενεργοποίηση αυτής της ρύθμισης, μπορεί να αυξηθεί η κατανάλωση μπαταρίας."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"έχει πρόσβαση στην τοποθεσία κατά προσέγγιση (με βάση το δίκτυο)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Αυτή η εφαρμογή μπορεί να ανιχνεύσει την τοποθεσία σας βάσει πηγών δικτύου, όπως κεραίες κινητής τηλεφωνίας και δίκτυα Wi-Fi. Αυτές οι υπηρεσίες τοποθεσίας θα πρέπει να είναι ενεργοποιημένες και διαθέσιμες στο tablet που χρησιμοποιείτε, προκειμένου να μπορεί να τις χρησιμοποιήσει η εφαρμογή."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Αυτή η εφαρμογή μπορεί να ανιχνεύσει την τοποθεσία σας βάσει πηγών δικτύου, όπως κεραίες κινητής τηλεφωνίας και δίκτυα Wi-Fi. Αυτές οι υπηρεσίες τοποθεσίας θα πρέπει να είναι ενεργοποιημένες και διαθέσιμες στην τηλεόρασή σας, προκειμένου να μπορεί να τις χρησιμοποιήσει η εφαρμογή."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Αυτή η εφαρμογή μπορεί να ανιχνεύσει την τοποθεσία σας βάσει πηγών δικτύου, όπως κεραίες κινητής τηλεφωνίας και δίκτυα Wi-Fi. Αυτές οι υπηρεσίες τοποθεσίας θα πρέπει να είναι ενεργοποιημένες και διαθέσιμες στο τηλέφωνό σας, προκειμένου να μπορεί να τις χρησιμοποιήσει η εφαρμογή."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"πρόσβαση στην ακριβή τοποθεσία στο παρασκήνιο"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Αυτή η εφαρμογή μπορεί να ανιχνεύσει την ακριβή τοποθεσία σας οποτεδήποτε βρίσκεται στο παρασκήνιο. Αυτές οι υπηρεσίες τοποθεσίας θα πρέπει να είναι ενεργοποιημένες και διαθέσιμες στο τηλέφωνό σας, προκειμένου να μπορεί να τις χρησιμοποιήσει η εφαρμογή. Με την ενεργοποίηση αυτής της ρύθμισης, μπορεί να αυξηθεί η κατανάλωση μπαταρίας."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"αλλάζει τις ρυθμίσεις ήχου"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Επιτρέπει στην εφαρμογή την τροποποίηση καθολικών ρυθμίσεων ήχου, όπως η ένταση και ποιο ηχείο χρησιμοποιείται για έξοδο."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"εγγράφει ήχο"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"διαχείριση υλικολογισμ. ελέγχου ταυτότ. προσώπου"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους προσθήκης/διαγραφής προτύπων για χρήση."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"χρήση υλικολογισμικού ελέγχου ταυτότητας προσώπου"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί υλικολογισμικό για έλεγχο ταυτότητας"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Αδυναμία επεξεργασίας προσώπου. Δοκιμάστε ξανά."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Υψηλή φωτεινότητα. Δοκιμάστε χαμηλότερο φωτισμό."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Πολύ σκοτεινό πρόσωπο. Ξεσκεπάστε την πηγή φωτός."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Μετακινήστε τον αισθητήρα πιο μακριά."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Τοποθετήστε τον αισθητήρα πιο κοντά στο πρόσωπο."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Μετακινήστε τον αισθητήρα ψηλότερα."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Μετακινήστε τον αισθητήρα χαμηλότερα."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Μετακινήστε τον αισθητήρα προς τα δεξιά."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Μετακινήστε τον αισθητήρα προς τα αριστερά."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Κοιτάξτε στον αισθητήρα."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Δεν εντοπίστηκε κάποιο πρόσωπο."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Διατηρήστε το πρόσωπο σταθερό μπροστά στη συσκευή."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Το υλικολογισμικό προσώπου δεν είναι διαθέσιμο."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Λήξη χρονικού ορίου προσώπου. Δοκιμάστε ξανά."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Δεν είναι δυνατή η αποθήκευση του προσώπου."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Η ενέργεια προσώπου ακυρώθηκε."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Πολλές προσπάθειες. Αποτυχία ελέγ. ταυτ. προσώπου."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Δοκιμάστε ξανά."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Δεν έχει καταχωριστεί κάποιο πρόσωπο."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Η συσκευή δεν διαθέτει αισθητήρα ελέγχου ταυτότητας προσώπου"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Πρόσωπο <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Εικ. προσ."</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"διαβάζει τις ρυθμίσεις συγχρονισμού"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Επιτρέπει στην εφαρμογή την ανάγνωση των ρυθμίσεων συγχρονισμού για έναν λογαριασμό. Για παράδειγμα, αυτό μπορεί να καθορίσει εάν η εφαρμογή \"Άτομα\" είναι συγχρονισμένη με έναν λογαριασμό."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ενεργοποιεί/απενεργοποιεί τον συγχρονισμό"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Το Wi-Fi δεν έχει πρόσβαση στο διαδίκτυο"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Πατήστε για να δείτε τις επιλογές"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Αλλαγές στις ρυθμίσεις σημείου πρόσβασης Wi-Fi"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Το εύρος σημείου πρόσβασης Wi-Fi άλλαξε."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Αυτή η συσκευή δεν υποστηρίζει την προτίμησή σας για τη ζώνη 5 GHz μόνο. Αντ\' αυτού, αυτή η συσκευή θα χρησιμοποιεί τη ζώνη 5 GHz όταν είναι διαθέσιμη."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Μετάβαση σε δίκτυο <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Η συσκευή χρησιμοποιεί το δίκτυο <xliff:g id="NEW_NETWORK">%1$s</xliff:g> όταν το δίκτυο <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> δεν έχει πρόσβαση στο διαδίκτυο. Μπορεί να ισχύουν χρεώσεις."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Μετάβαση από το δίκτυο <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> στο δίκτυο <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Ο διαχειριστής σας ζήτησε μια αναφορά σφάλματος για να συμβάλει στην αντιμετώπιση του προβλήματος αυτής της συσκευής. Ενδέχεται να γίνει κοινή χρήση των εφαρμογών και των δεδομένων."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ΚΟΙΝΟΠΟΙΗΣΗ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ΑΠΟΡΡΙΨΗ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Αλλαγή πληκτρολογίου"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Επιλογή μεθόδου εισόδου"</string>
<string name="show_ime" msgid="2506087537466597099">"Να παραμένει στην οθόνη όταν είναι ενεργό το φυσικό πληκτρολόγιο"</string>
<string name="hardware" msgid="194658061510127999">"Εμφάνιση εικονικού πληκτρολ."</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Διαμόρφωση φυσικού πληκτρολογίου"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 5045f0268927..f70ba3bef3d9 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Aeroplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver is OFF"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver is ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device’s location?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"This app can add, remove or change calendar events on your phone. This app can send messages that may appear to come from calendar owners or change events without notifying their owners."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"access extra location provider commands"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Allows the app to access extra location provider commands. This may allow the app to interfere with the operation of the GPS or other location sources."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"access precise location (GPS and network-based)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"This app can get your location based on GPS or network location sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"access precise location only in the foreground"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"This app can get your exact location only when it is in the foreground. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"access approximate location (network-based)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"This app can pick up your location based on network sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your tablet for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"This app can pick up your location based on network sources such as mobile towers and Wi-Fi networks. These location services must be turned on and available on your TV for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"This app can get your location based on network sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"access precise location in the background"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"This app can get your exact location any time it is in the background. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"change your audio settings"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Allows the app to modify global audio settings such as volume and which speaker is used for output."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"record audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther away from face."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Keep face steady in front of device."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"This device does not have a face authentication sensor"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Face icon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Switched to <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Device uses <xliff:g id="NEW_NETWORK">%1$s</xliff:g> when <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> has no Internet access. Charges may apply."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Switched from <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> to <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Your admin requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SHARE"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"DECLINE"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Change keyboard"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Choose input method"</string>
<string name="show_ime" msgid="2506087537466597099">"Keep it on screen while physical keyboard is active"</string>
<string name="hardware" msgid="194658061510127999">"Show virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configure physical keyboard"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 06971579bd63..1ab78f153d0d 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Airplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Airplane mode is ON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Airplane mode is OFF"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver is OFF"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver is ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device’s location?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"This app can add, remove or change calendar events on your phone. This app can send messages that may appear to come from calendar owners or change events without notifying their owners."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"access extra location provider commands"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Allows the app to access extra location provider commands. This may allow the app to interfere with the operation of the GPS or other location sources."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"access precise location (GPS and network-based)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"This app can get your location based on GPS or network location sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"access precise location only in the foreground"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"This app can get your exact location only when it is in the foreground. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"access approximate location (network-based)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"This app can pick up your location based on network sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your tablet for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"This app can pick up your location based on network sources such as mobile towers and Wi-Fi networks. These location services must be turned on and available on your TV for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"This app can get your location based on network sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"access precise location in the background"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"This app can get your exact location any time it is in the background. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"change your audio settings"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Allows the app to modify global audio settings such as volume and which speaker is used for output."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"record audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther away from face."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Keep face steady in front of device."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"This device does not have a face authentication sensor"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Face icon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Switched to <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Device uses <xliff:g id="NEW_NETWORK">%1$s</xliff:g> when <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> has no Internet access. Charges may apply."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Switched from <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> to <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Your admin requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SHARE"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"DECLINE"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Change keyboard"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Choose input method"</string>
<string name="show_ime" msgid="2506087537466597099">"Keep it on screen while physical keyboard is active"</string>
<string name="hardware" msgid="194658061510127999">"Show virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configure physical keyboard"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 5045f0268927..f70ba3bef3d9 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Aeroplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver is OFF"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver is ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device’s location?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"This app can add, remove or change calendar events on your phone. This app can send messages that may appear to come from calendar owners or change events without notifying their owners."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"access extra location provider commands"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Allows the app to access extra location provider commands. This may allow the app to interfere with the operation of the GPS or other location sources."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"access precise location (GPS and network-based)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"This app can get your location based on GPS or network location sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"access precise location only in the foreground"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"This app can get your exact location only when it is in the foreground. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"access approximate location (network-based)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"This app can pick up your location based on network sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your tablet for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"This app can pick up your location based on network sources such as mobile towers and Wi-Fi networks. These location services must be turned on and available on your TV for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"This app can get your location based on network sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"access precise location in the background"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"This app can get your exact location any time it is in the background. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"change your audio settings"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Allows the app to modify global audio settings such as volume and which speaker is used for output."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"record audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther away from face."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Keep face steady in front of device."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"This device does not have a face authentication sensor"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Face icon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Switched to <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Device uses <xliff:g id="NEW_NETWORK">%1$s</xliff:g> when <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> has no Internet access. Charges may apply."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Switched from <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> to <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Your admin requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SHARE"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"DECLINE"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Change keyboard"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Choose input method"</string>
<string name="show_ime" msgid="2506087537466597099">"Keep it on screen while physical keyboard is active"</string>
<string name="hardware" msgid="194658061510127999">"Show virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configure physical keyboard"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 5045f0268927..f70ba3bef3d9 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Aeroplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Aeroplane mode is ON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Aeroplane mode is OFF"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver is OFF"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver is ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Location"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"access this device\'s location"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device\'s location?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"The app will only have access to the location while you’re using the app."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Always allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access this device’s location?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"The app will always have access to the location, even when you’re not using the app."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"access your calendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access your calendar?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"This app can add, remove or change calendar events on your phone. This app can send messages that may appear to come from calendar owners or change events without notifying their owners."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"access extra location provider commands"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Allows the app to access extra location provider commands. This may allow the app to interfere with the operation of the GPS or other location sources."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"access precise location (GPS and network-based)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"This app can get your location based on GPS or network location sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"access precise location only in the foreground"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"This app can get your exact location only when it is in the foreground. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"access approximate location (network-based)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"This app can pick up your location based on network sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your tablet for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"This app can pick up your location based on network sources such as mobile towers and Wi-Fi networks. These location services must be turned on and available on your TV for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"This app can get your location based on network sources such as phone masts and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"access precise location in the background"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"This app can get your exact location any time it is in the background. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"change your audio settings"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Allows the app to modify global audio settings such as volume and which speaker is used for output."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"record audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Couldn’t process face. Please try again."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Face is too bright. Please try in lower light."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Face is too dark. Please uncover light source."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Please move sensor farther away from face."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Please bring sensor closer to face."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Please move sensor higher."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Please move sensor lower."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Please move sensor to the right."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Please move sensor to the left."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Please look at the sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"No face detected."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Keep face steady in front of device."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Face hardware not available."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"No face enrolled."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"This device does not have a face authentication sensor"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Face icon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"read sync settings"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"toggle sync on and off"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi has no Internet access"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Changes to your hotspot settings"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Your hotspot band has changed."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"This device doesn’t support your preference for 5 GHz only. Instead, this device will use the 5 GHz band when available."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Switched to <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Device uses <xliff:g id="NEW_NETWORK">%1$s</xliff:g> when <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> has no Internet access. Charges may apply."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Switched from <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> to <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Your admin requested a bug report to help troubleshoot this device. Apps and data may be shared."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SHARE"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"DECLINE"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Change keyboard"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Choose input method"</string>
<string name="show_ime" msgid="2506087537466597099">"Keep it on screen while physical keyboard is active"</string>
<string name="hardware" msgid="194658061510127999">"Show virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configure physical keyboard"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index a20395541a62..a4c861560f65 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎Airplane mode‎‏‎‎‏‎"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‎‎Airplane mode is ON‎‏‎‎‏‎"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎Airplane mode is OFF‎‏‎‎‏‎"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‎Battery saver‎‏‎‎‏‎"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‏‏‎‏‏‎Battery saver is OFF‎‏‎‎‏‎"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‎Battery saver is ON‎‏‎‎‏‎"</string>
<string name="global_action_settings" msgid="1756531602592545966">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎Settings‎‏‎‎‏‎"</string>
<string name="global_action_assist" msgid="3892832961594295030">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎Assist‎‏‎‎‏‎"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎Voice Assist‎‏‎‎‏‎"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎Location‎‏‎‎‏‎"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‏‏‏‎‏‏‏‎‎‏‎access this device\'s location‎‏‎‎‏‎"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‏‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access this device\'s location?‎‏‎‎‏‎"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‎The app will only have access to the location while you’re using the app.‎‏‎‎‏‎"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎Always allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access this device’s location?‎‏‎‎‏‎"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‏‎‏‏‏‎‎The app will always have access to the location, even when you’re not using the app.‎‏‎‎‏‎"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎Calendar‎‏‎‎‏‎"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‎access your calendar‎‏‎‎‏‎"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎Allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access your calendar?‎‏‎‎‏‎"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎This app can add, remove, or change calendar events on your phone. This app can send messages that may appear to come from calendar owners, or change events without notifying their owners.‎‏‎‎‏‎"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎access extra location provider commands‎‏‎‎‏‎"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎Allows the app to access extra location provider commands. This may allow the app to interfere with the operation of the GPS or other location sources.‎‏‎‎‏‎"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎access precise location (GPS and network-based)‎‏‎‎‏‎"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎This app can get your location based on GPS or network location sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption.‎‏‎‎‏‎"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎access precise location only in the foreground‎‏‎‎‏‎"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‏‎‎This app can get your exact location only when it is in the foreground. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption.‎‏‎‎‏‎"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‎‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎access approximate location (network-based)‎‏‎‎‏‎"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‏‎‏‎‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎This app can get your location based on network sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your tablet for the app to be able to use them.‎‏‎‎‏‎"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎‎‏‏‏‏‏‎This app can get your location based on network sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your TV for the app to be able to use them.‎‏‎‎‏‎"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‎This app can get your location based on network sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them.‎‏‎‎‏‎"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎access precise location in the background‎‏‎‎‏‎"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‏‎This app can get your exact location any time it is in the background. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption.‎‏‎‎‏‎"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎change your audio settings‎‏‎‎‏‎"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎Allows the app to modify global audio settings such as volume and which speaker is used for output.‎‏‎‎‏‎"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎record audio‎‏‎‎‏‎"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎Fingerprint icon‎‏‎‎‏‎"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎manage face authentication hardware‎‏‎‎‏‎"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎Allows the app to invoke methods to add and delete facial templates for use.‎‏‎‎‏‎"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎use face authentication hardware‎‏‎‎‏‎"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‎Allows the app to use face authentication hardware for authentication‎‏‎‎‏‎"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎Couldn’t process face. Please try again.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‎‎Face is too bright. Please try in lower light.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎Face is too dark. Please uncover light source.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎Please move sensor farther from face.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎Please bring sensor closer to face.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎Please move sensor higher.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‏‎‏‎‏‎Please move sensor lower.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎Please move sensor to the right.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎Please move sensor to the left.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎Please look at the sensor.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‏‏‏‏‎No face detected.‎‏‎‎‏‎"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‏‎‏‎‎Keep face steady infront of device.‎‏‎‎‏‎"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎Face hardware not available.‎‏‎‎‏‎"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‏‎‎Face time out reached. Try again.‎‏‎‎‏‎"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‎‎‎‎‎‏‎‎Face can’t be stored.‎‏‎‎‏‎"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎Face operation canceled.‎‏‎‎‏‎"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‎Too many attempts. Try again later.‎‏‎‎‏‎"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎‏‎‎‏‎‏‎‎‏‏‎‏‏‏‎‏‎‎Too many attempts. Facial authentication disabled.‎‏‎‎‏‎"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‎‎Try again.‎‏‎‎‏‎"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎No face enrolled.‎‏‎‎‏‎"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎This device does not have a face authentication sensor‎‏‎‎‏‎"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎Face ‎‏‎‎‏‏‎<xliff:g id="FACEID">%d</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‎Face icon‎‏‎‎‏‎"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‏‏‎‎‎read sync settings‎‏‎‎‏‎"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account.‎‏‎‎‏‎"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‎toggle sync on and off‎‏‎‎‏‎"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‎‏‎‎Wi-Fi has no internet access‎‏‎‎‏‎"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎Tap for options‎‏‎‎‏‎"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎Changes to your hotspot settings‎‏‎‎‏‎"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‏‎Your hotspot band has changed.‎‏‎‎‏‎"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎This device doesn’t support your preference for 5GHz only. Instead, this device will use the 5GHz band when available.‎‏‎‎‏‎"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎Switched to ‎‏‎‎‏‏‎<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‎Device uses ‎‏‎‎‏‏‎<xliff:g id="NEW_NETWORK">%1$s</xliff:g>‎‏‎‎‏‏‏‎ when ‎‏‎‎‏‏‎<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>‎‏‎‎‏‏‏‎ has no internet access. Charges may apply.‎‏‎‎‏‎"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎Switched from ‎‏‎‎‏‏‎<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to ‎‏‎‎‏‏‎<xliff:g id="NEW_NETWORK">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎Your admin requested a bug report to help troubleshoot this device. Apps and data may be shared.‎‏‎‎‏‎"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎SHARE‎‏‎‎‏‎"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎DECLINE‎‏‎‎‏‎"</string>
- <string name="select_input_method" msgid="8547250819326693584">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‎‎‎Change keyboard‎‏‎‎‏‎"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‎‏‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎Choose input method‎‏‎‎‏‎"</string>
<string name="show_ime" msgid="2506087537466597099">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎Keep it on screen while physical keyboard is active‎‏‎‎‏‎"</string>
<string name="hardware" msgid="194658061510127999">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‏‏‏‏‏‏‎Show virtual keyboard‎‏‎‎‏‎"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‎‎Configure physical keyboard‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 3e916f72df75..2b7c4bfa6d9d 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"El modo avión está Activado"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"El modo avión está Desactivado"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Ahorro de batería"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Ahorro de batería DESACTIVADO"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Ahorro de batería ACTIVADO"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicación"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder a la ubicación de este dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a la ubicación de este dispositivo?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"La app solo tendrá acceso a la ubicación cuando la uses."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a la ubicación?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"La app siempre tendrá acceso a la ubicación, incluso cuando no la uses."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder al calendario"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tu calendario?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Esta app puede agregar, quitar o cambiar eventos del calendario en tu teléfono. Puede enviar mensajes que parecen proceder de propietarios del calendario o cambiar eventos sin notificarlos."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acceder a comandos adicionales del proveedor del lugar"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite que la aplicación acceda a comandos adicionales del proveedor de ubicación. Esto puede permitirle a la aplicación interferir con el funcionamiento del GPS o de otras fuentes de ubicación."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"acceder a la ubicación precisa (según el GPS y la red)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Esta app puede obtener tu ubicación a través de GPS o servicios de ubicación que usan fuentes de ubicación de red, como torres de telefonía móvil y redes Wi-Fi. Estos servicios de ubicación deben estar activados y disponibles en tu teléfono para que la app pueda usarlos. Al hacerlo, es posible que se consuma más batería."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"acceder a la ubicación exacta solo en primer plano"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Esta app puede obtener tu ubicación exacta solo cuando está en primer plano. Los servicios de ubicación deben estar activados y disponibles en el teléfono para que la app pueda usarlos. Es posible que aumente el consumo de batería."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"acceder a la ubicación aproximada (según la red)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Esta app puede obtener tu ubicación a través de fuentes de red, como torres de telefonía móvil y redes Wi-Fi. Estos servicios de ubicación deben estar activados y disponibles en tu tablet para que la app pueda usarlos."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Esta app puede obtener tu ubicación a través de fuentes de red, telefonía móvil y redes Wi-Fi. Estos servicios de ubicación deben estar activados y disponibles en tu TV para que la app pueda usarlos."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Esta app puede obtener tu ubicación a través de fuentes de red, como torres de celulares y redes Wi-Fi. Estos servicios de ubicación deben estar activados y disponibles en tu teléfono para que la app pueda usarlos."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"acceder a la ubicación exacta en segundo plano"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Esta app puede obtener tu ubicación exacta en cualquier momento mientras esté en segundo plano. Los servicios de ubicación deben estar activados y disponibles en el teléfono para que la app pueda usarlos. Es posible que aumente el consumo de batería."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"cambiar tu configuración de audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite que la aplicación modifique la configuración de audio global, por ejemplo, el volumen y el altavoz de salida."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"grabar audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícono de huella digital"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"administrar el hardware de autenticación facial"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar el hardware de autenticación facial"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que la app use el hardware de autenticación facial para reconocerte"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Error al procesar el rostro. Vuelve a intentarlo."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"El rostro se ve muy claro. Prueba con menos luz."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"El rostro se ve muy oscuro. Prueba con más luz."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Aleja el sensor del rostro."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Acerca el sensor al rostro."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Coloca el sensor más arriba."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Coloca el sensor más abajo."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Mueve el sensor hacia la derecha."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Mueve el sensor hacia la izquierda."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Mira al sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"No se detectó ningún rostro."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mantén el rostro fijo enfrente del dispositivo."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware de reconocimiento facial no disponible"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Se agotó el tiempo. Vuelve a intentarlo."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"No se puede almacenar el rostro."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Se canceló el reconocimiento facial."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autent. facial inhabilitada."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Vuelve a intentarlo."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"No registraste ningún rostro."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Este dispositivo no tiene sensor de autenticación facial"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Rostro <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ícono cara"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Este permiso permite que la aplicación consulte la configuración de sincronización de una cuenta. Esto permite, por ejemplo, determinar si la aplicación Personas está sincronizada con una cuenta."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar y desactivar la sincronización"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"La red Wi-Fi no tiene acceso a Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Presiona para ver opciones"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Cambios en la configuración de tu hotspot"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Cambió la banda de tu hotspot."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Si bien este dispositivo no admite la opción para conectarse exclusivamente a bandas de 5 GHz, las usará cuando estén disponibles."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Se cambió a <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"El dispositivo usa <xliff:g id="NEW_NETWORK">%1$s</xliff:g> cuando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tiene acceso a Internet. Es posible que se apliquen cargos."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Se cambió de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Tu administrador solicitó un informe de errores para solucionar los problemas de este dispositivo. Es posible que se compartan apps y datos."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"COMPARTIR"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RECHAZAR"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Cambiar el teclado"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Selecciona el método de entrada"</string>
<string name="show_ime" msgid="2506087537466597099">"Mantener en la pantalla cuando el teclado físico está activo"</string>
<string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configura el teclado físico"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index ce2afbeb635b..c4b74af171e7 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avión activado. Desactivar"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avión desactivado. Activar"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Ahorro de batería"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Ahorro de batería desactivado"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Ahorro de batería activado"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ajustes"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
@@ -256,7 +253,7 @@
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas de la red"</string>
<string name="notification_channel_network_available" msgid="4531717914138179517">"Red disponible"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"Estado de la VPN"</string>
- <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administración del dispositivo"</string>
+ <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administración de dispositivos"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
<string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demo para tiendas"</string>
<string name="notification_channel_usb" msgid="9006850475328924681">"Conexión USB"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Ubicación"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder a la ubicación de este dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a la ubicación de este dispositivo?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"La aplicación solo podrá acceder a la ubicación cuando estés usando la aplicación."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"¿Permites que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a ubic. del disp.?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"La aplicación siempre podrá acceder a la ubicación, aunque no estés usando la aplicación."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder a tu calendario"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tu calendario?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Esta aplicación puede añadir, quitar o cambiar eventos de calendario almacenados en tu teléfono. También puede enviar mensajes que parecen provenir del propietario del calendario o cambiar eventos sin notificárselo a su propietario."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acceder a comandos de proveedor de ubicación adicional"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite que la aplicación acceda a otros comandos del proveedor de ubicación. De esta forma, la aplicación podrá interferir en el funcionamiento del GPS o de otras fuentes de ubicación."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"acceder a tu ubicación precisa (basada en red y GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Esta aplicación puede obtener tu ubicación a partir del GPS o de fuentes de ubicación de red como las antenas de telefonía móvil y las redes Wi-Fi. Estos servicios de ubicación deben estar activados y disponibles en tu teléfono para que la aplicación pueda usarlos. Esto puede aumentar el consumo de batería."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"acceder a la ubicación exacta solo en primer plano"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Esta aplicación solo puede obtener tu ubicación exacta cuando está en primer plano. Estos servicios de ubicación deben estar activados y disponibles en tu teléfono para que la aplicación pueda utilizarlos. Es posible que aumente el consumo de batería."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"acceder a tu ubicación aproximada (basada en red)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Esta aplicación puede obtener tu ubicación a partir de fuentes de red como las antenas de telefonía móvil y las redes Wi-Fi. Estos servicios de ubicación deben estar activados y disponibles en tu tablet para que la aplicación pueda usarlos."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Esta aplicación puede obtener tu ubicación a partir de fuentes de red como las antenas de telefonía móvil y las redes Wi-Fi. Estos servicios de ubicación deben estar activados y disponibles en tu TV para que la aplicación pueda usarlos."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Esta aplicación puede obtener tu ubicación a partir de fuentes de red como las antenas de telefonía móvil y las redes Wi-Fi. Estos servicios de ubicación deben estar activados y disponibles en tu teléfono para que la aplicación pueda usarlos."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"acceder a la ubicación exacta en segundo plano"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Esta aplicación puede obtener tu ubicación exacta en cualquier momento cuando está en segundo plano. Estos servicios de ubicación deben estar activados y disponibles en tu teléfono para que la aplicación pueda utilizarlos. Es posible que aumente el consumo de batería."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"cambiar la configuración de audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite que la aplicación modifique la configuración de audio global (por ejemplo, el volumen y el altavoz de salida)."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"grabar sonido"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icono de huella digital"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"gestionar el hardware de autenticación facial"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que la app use métodos para añadir y suprimir plantillas de caras para su uso."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar el hardware de autenticación facial"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que la aplicación utilice el hardware de autenticación facial para autenticarte"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"No se ha reconocido la cara. Vuelve a intentarlo."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"La cara se ve muy clara. Inténtalo con menos luz."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"La cara se ve muy oscura. Inténtalo con más luz."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Aleja la cara del sensor."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Acerca la cara al sensor."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Coloca el sensor más arriba."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Coloca el sensor más abajo."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Mueve el sensor hacia la derecha."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Mueve el sensor hacia la izquierda."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Mira al sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"No se ha detectado ninguna cara."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mantén la cara fija enfrente del dispositivo."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware de reconocimiento facial no disponible."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Has sobrepasado el tiempo. Inténtalo de nuevo."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"No se pueden registrar más caras."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Se ha cancelado el reconocimiento facial."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autent. facial inhabilitada."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Inténtalo de nuevo."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"No has registrado ninguna cara."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Este dispositivo no tiene sensor de autenticación facial"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Icono cara"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"leer la configuración de sincronización"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que la aplicación consulte la configuración de sincronización de una cuenta. La aplicación puede utilizar este permiso, por ejemplo, para determinar si la aplicación Contactos está sincronizada con una cuenta."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar y desactivar la sincronización"</string>
@@ -605,7 +638,7 @@
<string name="policylab_disableCamera" msgid="6395301023152297826">"Inhabilitar cámaras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Evitar el uso de las cámaras del dispositivo"</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Inhabilitar algunas funciones del bloqueo de pantalla"</string>
- <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Evita el uso de algunas funciones del bloqueo de pantalla."</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Evitar el uso de algunas funciones del bloqueo de pantalla"</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Móvil"</item>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"La red Wi-Fi no tiene acceso a Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca para ver opciones"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Cambios en los ajustes de tu punto de acceso"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"La banda de tu punto de acceso ha cambiado."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo no admite la opción de conectarse exclusivamente a bandas de 5 GHz, pero las usará cuando estén disponibles."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Se ha cambiado a <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"El dispositivo utiliza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> cuando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tiene acceso a Internet. Es posible que se apliquen cargos."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Se ha cambiado de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"El administrador ha solicitado un informe de errores para solucionar problemas de este dispositivo. Es posible que se compartan las aplicaciones y los datos."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"COMPARTIR"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RECHAZAR"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Cambiar teclado"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Selecciona un método de entrada"</string>
<string name="show_ime" msgid="2506087537466597099">"Mantener en la pantalla mientras el teclado físico está activo"</string>
<string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configura el teclado físico"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index fa256eb65ca6..1e73bf1fa038 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lennurežiim"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lennurežiim on SEES"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lennurežiim on VÄLJAS"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Akusäästja"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Akusäästja on VÄLJA lülitatud"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Akusäästja on SISSE lülitatud"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Seaded"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Abi"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Häälabi"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Asukoht"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pääseda juurde selle seadme asukohale"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs selle seadme asukohale?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Rakendusel on juurdepääs asukohale vaid siis, kui rakendust kasutate."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Kas lubada rak. &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; alati juurdepääs seadme asukohale?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Rakendusel on alati juurdepääs asukohale isegi siis, kui te rakendust ei kasuta."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"juurdepääs kalendrile"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Kas lubada rakendusele &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurdepääs teie kalendrile?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"See rakendus võib teie telefoni kalendrisündmusi lisada, neid eemaldada või muuta. See rakendus võib saata sõnumeid, mis näivad pärinevat kalendri omanikelt, või muuta sündmusi ilma omanikke teavitamata."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"juurdepääs asukohapakkuja lisakäskudele"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Võimaldab rakendusel juurde pääseda asukohapakkuja erikäskudele. See võib lubada rakendusel mõjutada GPS-i või muude asukohaallikate tööd."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"juurdepääs täpsele asukohale (GPS-i ja võrgupõhine)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"See rakendus näeb GPS-i või võrguasukoha allikate (nt mobiilimastid ja WiFi-võrgud) abil teie asukohta. Need asukohateenused peavad olema sisse lülitatud ja teie telefonis saadaval, et rakendus neid kasutada saaks. See võib suurendada akutoite tarbimist."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"juurdepääs täpsele asukohale ainult esiplaanil"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"See rakendus hangib teie täpse asukoha ainult siis, kui see töötab esiplaanil. Need asukohateenused peavad olema sisse lülitatud ja teie telefonis saadaval, et rakendus saaks neid kasutada. See võib suurendada akutoite tarbimist."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"juurdepääs ligikaudsele asukohale (võrgupõhine)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"See rakendus näeb võrguallikate (nt mobiilimastid ja WiFi-võrgud) abil teie asukohta. Need asukohateenused peavad olema sisse lülitatud ja teie tahvelarvutis saadaval, et rakendus neid kasutada saaks."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"See rakendus näeb võrguallikate (nt mobiilimastid ja WiFi-võrgud) abil teie asukohta. Need asukohateenused peavad olema sisse lülitatud ja teie teleris saadaval, et rakendus neid kasutada saaks."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"See rakendus näeb võrguallikate (nt mobiilimastid ja WiFi-võrgud) abil teie asukohta. Need asukohateenused peavad olema sisse lülitatud ja teie telefonis saadaval, et rakendus neid kasutada saaks."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"juurdepääs täpsele asukohale taustal"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"See rakendus hangib teie täpse asukoha alati, kui see töötab taustal. Need asukohateenused peavad olema sisse lülitatud ja teie telefonis saadaval, et rakendus saaks neid kasutada. See võib suurendada akutoite tarbimist."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"muuda heliseadeid"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Võimaldab rakendusel muuta üldiseid heliseadeid, näiteks helitugevust ja seda, millist kõlarit kasutatakse väljundiks."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"salvesta heli"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Sõrmejälje ikoon"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"hallata näo autentimise riistvara"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Lubab rakendusel tühistada meetodid kasutatavate näomallide lisamiseks ja kustutamiseks."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"kasutada näo autentimise riistvara"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Võimaldab rakendusel autentimiseks kasutada näo autentimise riistvara"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nägu ei õnnestunud töödelda. Proovige uuesti."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Nägu on liiga hele. Proovige hämaramas."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Nägu on liiga tume. Kasutage valgusallikat."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Liigutage andur näost kaugemale."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Liigutage andur näole lähemale."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Liigutage andurit kõrgemale."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Liigutage andurit madalamale."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Liigutage andurit paremale."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Liigutage andurit vasakule."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Vaadake andurit."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nägu ei tuvastatud."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Hoidke nägu seadme ees paigal."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Näotuvastuse riistvara pole saadaval."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Näotuvastuse taimeri ajalõpp. Proovige uuesti."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Nägu ei saa salvestada."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Näotuvastuse toiming tühistati."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Liiga palju katseid. Proovige hiljem uuesti."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Liiga palju katseid. Näotuvastus on keelatud."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Proovige uuesti."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nägu pole registreeritud."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Sellel seadmel pole näotuvastuse andurit"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Nägu <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Näoikoon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"loe sünkroonimisseadeid"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Võimaldab rakendusel lugeda konto sünkroonimisseadeid. Näiteks võib see määrata, kas rakendus Inimesed on kontoga sünkroonitud."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"lülitage sünkroonimine sisse ja välja"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"WiFi-võrgul pole juurdepääsu Internetile"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Puudutage valikute nägemiseks"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Muudatused teie leviala seadetes"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Teie leviala riba on muutunud."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"See seade ei toeta teie eelistatud ainult 5 GHz riba. Seade kasutab 5 GHz riba ainult siis, kui see on saadaval."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Lülitati võrgule <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Seade kasutab võrku <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, kui võrgul <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> puudub juurdepääs Internetile. Rakenduda võivad tasud."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Lülitati võrgult <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> võrgule <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administraator taotles veaaruannet, mis aitaks seadmes vigu otsida. Rakendusi ja andmeid võidakse jagada."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"JAGA"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"KEELDU"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Klaviatuuri muutmine"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Valige sisestusmeetod"</string>
<string name="show_ime" msgid="2506087537466597099">"Hoia seda ekraanil, kui füüsiline klaviatuur on aktiivne"</string>
<string name="hardware" msgid="194658061510127999">"Virtuaalse klaviatuuri kuvam."</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Füüsilise klaviatuuri seadistamine"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 916cb10156d6..aa6edaa015a3 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Hegaldi modua"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hegaldi modua AKTIBATUTA dago"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hegaldi modua DESAKTIBATUTA dago"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Bateria-aurrezlea"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"DESAKTIBATUTA dago bateria-aurrezlea"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"AKTIBATUTA dago bateria-aurrezlea"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ezarpenak"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Lagundu"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ahots-laguntza"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Kokapena"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"atzitu gailuaren kokapena"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari gailuaren kokapena atzitzea baimendu nahi diozu?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikazioa erabiltzen ari zarenean soilik atzituko du aplikazioak kokapena."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari gailuaren kokapena beti atzitzea baimendu?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikazioak beti atzituko du kokapena, baita aplikazioa erabiltzen ari ez bazara ere."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Egutegia"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"atzitu egutegia"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioari egutegia atzitzea baimendu nahi diozu?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Telefonoko gertaerak gehitzeko, kentzeko edo aldatzeko aukera du aplikazioak. Gainera, egutegien jabeenak diruditen mezuak bidal ditzake, eta gertaerak alda ditzake jabeei beraiei jakinarazi gabe."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"atzitu kokapen-hornitzaileen komando gehigarriak"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Kokapen-hornitzailearen agindu gehigarriak atzitzea baimentzen die aplikazioei. Horrela, agian aplikazioek GPSaren edo bestelako kokapenaren iturburuen funtzionamenduan eragina izan dezakete."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"atzitu kokapen zehatza (GPS sisteman eta sarean oinarrituta)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Aplikazioak zure kokapenaren berri izan dezake GPS sistema edo sareen iturburuak (adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak) erabilita. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telefonoan, aplikazioak erabil ditzan. Baliteke bateria gehiago erabiltzea."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"lortu kokapen zehatza aurreko planoan bakarrik"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Aplikazioak zure kokapen zehatza lor dezake aurreko planoan funtzionatzen duenean bakarrik. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telefonoan, aplikazioak erabil ditzan. Baliteke bateria gehiago erabiltzea."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"atzitu gutxi gorabeherako kokapena (sarean oinarrituta)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Aplikazioak zure kokapenaren berri izan dezake sareen iturburuak (adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak) erabilita. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu tabletan, aplikazioak erabil ditzan."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Aplikazioak zure kokapenaren berri izan dezake sareen iturburuak (adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak) erabilita. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telebistan, aplikazioak erabil ditzan."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Aplikazioak zure kokapenaren berri izan dezake sareen iturburuak (adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak) erabilita. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telefonoan, aplikazioak erabil ditzan."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"lortu kokapen zehatza atzeko planoan"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Aplikazioak zure kokapen zehatza lor dezake atzeko planoan funtzionatzen duenean. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telefonoan, aplikazioak erabil ditzan. Baliteke bateria gehiago erabiltzea."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"aldatu audio-ezarpenak"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Audio-ezarpen orokorrak aldatzeko baimena ematen dio; besteak beste, bolumena eta irteerarako zer bozgorailu erabiltzen den."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"grabatu audioa"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Hatz-markaren ikonoa"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"kudeatu aurpegi bidez autentifikatzeko hardwarea"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Aurpegi-txantiloiak gehitu eta ezabatzeko metodoei dei egitea baimentzen dio aplikazioari."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"erabili aurpegi bidez autentifikatzeko hardwarea"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aurpegi bidez autentifikatzeko hardwarea erabiltzea baimentzen dio aplikazioari"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Ezin izan da prozesatu aurpegia. Saiatu berriro."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Aurpegiak distira gehiegi du. Murriztu argitasuna."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Aurpegia ilunegi dago. Estalgabetu argi-iturburua."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Urrundu sentsorea aurpegitik."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Hurbildu sentsorea aurpegira."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Eraman sentsorea gora."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Eraman sentsorea behera."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Eraman sentsorea eskuinera."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Eraman sentsorea ezkerrera."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Begiratu sentsoreari."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Ez dugu hauteman aurpegirik."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Egon geldi, aurpegia gailuaren aurrean jarrita."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Aurpegia hautemateko hardwarea ez dago erabilgarri."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Gainditu da aurpegiak prozesatzeko denbora-muga. Saiatu berriro."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Ezin da gorde aurpegia."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Utzi da aurpegiaren bidezko eragiketa."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Saiakera gehiegi egin dituzu. Saiatu berriro geroago."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Saiakera gehiegi egin dituzu. Desgaitu egin da autentifikazioa."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Saiatu berriro."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Ez dago aurpegirik erregistratuta."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Gailu honek ez du aurpegia autentifikatzeko sentsorerik"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> aurpegia"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Aurpegiaren ikonoa"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"irakurri sinkronizazio-ezarpenak"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Kontu baten sinkronizazio-ezarpenak irakurtzeko baimena ematen die aplikazioei. Adibidez, Jendea aplikazioa konturen batekin sinkronizatuta dagoen zehatz dezake."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"aktibatu eta desaktibatu sinkronizazioa"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Ezin da konektatu Internetera Wi-Fi bidez"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Sakatu aukerak ikusteko"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Aldaketak egin dira sare publikoaren ezarpenetan"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Aldatu da sare publikoaren banda."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Gailuak ez du onartzen 5 GHz-ko banda soilik erabiltzeko hobespena. Horren ordez, erabilgarri dagoen bakoitzean erabiliko da 5 GHz-ko banda."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> erabiltzen ari zara orain"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> Internetera konektatzeko gauza ez denean, <xliff:g id="NEW_NETWORK">%1$s</xliff:g> erabiltzen du gailuak. Agian kostuak ordaindu beharko dituzu."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> erabiltzen ari zinen, baina <xliff:g id="NEW_NETWORK">%2$s</xliff:g> erabiltzen ari zara orain"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administratzaileak akatsen txostena eskatu du gailuko arazoa konpontzeko. Baliteke aplikazioak eta datuak partekatzea."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"PARTEKATU"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"BAZTERTU"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Aldatu teklatua"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Aukeratu idazketa-metodoa"</string>
<string name="show_ime" msgid="2506087537466597099">"Erakutsi pantailan teklatu fisikoa aktibo dagoen bitartean"</string>
<string name="hardware" msgid="194658061510127999">"Erakutsi teklatu birtuala"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfiguratu teklatu fisikoa"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 3d9967c10272..5e107ee886b3 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"حالت هواپیما"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"حالت هواپیما روشن است"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"حالت هواپیما خاموش است"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"بهینه‌سازی باتری"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"بهینه‌سازی باتری خاموش است"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"بهینه‌سازی باتری روشن است"</string>
<string name="global_action_settings" msgid="1756531602592545966">"تنظیمات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"دستیار"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"دستیار صوتی"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"مکان"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"دسترسی به موقعیت مکانی این دستگاه"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اجازه داده شود به مکان این دستگاه دسترسی پیدا کند؟"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"این برنامه تنها هنگامی که از آن استفاده می‌کنید، به مکان دسترسی خواهد داشت."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"‏همیشه به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اجازه داده شود به مکان این دستگاه دسترسی داشته باشد؟"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"این برنامه همیشه به مکان دسترسی خواهد داشت، حتی اگر از آن استفاده نکنید."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"تقویم"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"دسترسی به تقویم شما"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"‏به &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اجازه داده شود به تقویم شما دسترسی پیدا کند؟"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"این برنامه می‌تواند در تلفن شما رویدادهای تقویم اضافه کند، آن‌ها را حذف کند یا تغییر دهد. این برنامه می‌تواند پیام‌هایی ارسال کند که گویی از طرف مالکان تقویم هستند یا رویدادها را بدون اطلاع مالکان تغییر دهد."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"دسترسی به فرمان‌های بیشتر ارائه دهنده مکان"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"‏به برنامه اجازه می‌دهد به دستورات ارائه‌دهنده مکان تکمیلی دسترسی داشته باشد. این کار ممکن است به برنامه امکان دهد با کارکرد GPS یا منابع دیگر مکان تداخل داشته باشد."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"‏دسترسی به مکان دقیق (مبتنی بر GPS و شبکه)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"‏این برنامه می‌تواند براساس GPS یا منابع مکان شبکه مانند دکل‌های مخابراتی و شبکه‌های Wi-Fi، مکان شما را تشخیص دهد. این خدمات مکان باید روشن و در تلفن شما دردسترس باشند تا برنامه بتواند از آن‌ها استفاده کند. این کار می‌تواند مصرف باتری را افزایش دهد."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"دسترسی به مکان دقیق فقط در پیش‌زمینه"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"این برنامه فقط زمانی می‌تواند موقعیت مکانی دقیق شما را دریافت کند که در پیش‌زمینه باشد. برای اینکه برنامه بتواند از خدمات مکان استفاده کند، این خدمات باید در تلفنتان روشن و دردسترس باشد. ممکن است با این کار مصرف باتری افزایش یابد."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"دسترسی به مکان تقریبی (مبتنی بر شبکه)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"‏این برنامه می‌تواند براساس منابع شبکه مانند دکل‌های مخابراتی و شبکه‌های Wi-Fi، مکان شما را تشخیص دهد. این خدمات مکان باید روشن و در رایانه لوحی شما دردسترس باشند تا برنامه بتواند از آن‌ها استفاده کند."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"‏این برنامه می‌تواند براساس منابع شبکه مانند دکل‌های مخابراتی و شبکه‌های Wi-Fi، مکان شما را تشخیص دهد. این خدمات مکان باید روشن و در تلویزیون شما دردسترس باشند تا برنامه بتواند از آن‌ها استفاده کند."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"‏این برنامه می‌تواند براساس منابع شبکه مانند دکل‌های مخابراتی و شبکه‌های Wi-Fi، مکان شما را تشخیص دهد. این خدمات مکان باید روشن و در تلفن شما دردسترس باشند تا برنامه بتواند از آن‌ها استفاده کند."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"دسترسی به موقعیت مکانی دقیق در پس‌زمینه"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"هرزمان این برنامه در پس‌زمینه باشد می‌تواند موقعیت مکانی دقیق شما را دریافت کند. برای اینکه برنامه بتواند از خدمات مکان استفاده کند، این خدمات باید در تلفنتان روشن و دردسترس باشد. ممکن است با این کار مصرف باتری افزایش یابد."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"تغییر تنظیمات صوتی"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"به برنامه امکان می‌دهد تنظیمات صوتی کلی مانند میزان صدا و بلندگوی مورد استفاده برای پخش صدا را تغییر دهد."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ضبط صدا"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"نماد اثر انگشت"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"مدیریت سخت‌افزار احراز هویت با چهره"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"به برنامه امکان می‌دهد روش‌هایی را برای افزودن و حذف الگوهای چهره جهت استفاده فرابخواند."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"استفاده از سخت‌افزار احراز هویت با چهره"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"به برنامه امکان می‌دهد از سخت‌افزار احراز هویت با چهره برای احراز هویت استفاده کند"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"چهره پردازش نشد. لطفاً دوباره امتحان کنید."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"چهره خیلی روشن است. لطفاً در نور کمتری دوباره امتحان کنید."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"چهره خیلی تاریک است. لطفاً منبع نور را نپوشانید."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"لطفاً حسگر را از صورتتان دورتر کنید."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"لطفاً حسگر را به صورتتان نزدیک‌تر کنید."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"لطفاً حسگر را بالاتر ببرید."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"لطفاً حسگر را پایین‌تر بیاورید."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"لطفاً حسگر را به راست حرکت دهید."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"لطفاً حسگر را به چپ حرکت دهید."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"لطفاً به حسگر نگاه کنید."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"چهره‌ای شناسایی نشد."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"صورتتان را ثابت در جلوی دستگاه نگه دارید."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"سخت‌افزار چهره دردسترس نیست."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"مهلت زمانی شناسایی چهره تمام شد. دوباره امتحان کنید"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"نمی‌توان چهره را ذخیره کرد."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"عملیات شناسایی چهره لغو شد."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"چندین تلاش ناموفق. احراز هویت با چهره غیرفعال شد."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"دوباره امتحان کنید."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"هیچ چهره‌ای ثبت نشده است."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"این دستگاه حسگر احراز هویت با چهره ندارد."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"چهره <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"نماد چهره"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"خواندن تنظیمات همگام‌سازی"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"به برنامه اجازه می‌دهد تنظیمات را برای یک حساب بخواند. به‌عنوان مثال، این ویژگی می‌تواند تعیین کند آیا حساب «افراد» شما با یک حساب همگام‌سازی شده است."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"تغییر وضعیت همگام‌سازی بین فعال و غیرفعال"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"‏Wi-Fi به اینترنت دسترسی ندارد"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"برای گزینه‌ها ضربه بزنید"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"تغییرات در تنظیمات نقطه اتصال"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"نوار نقطه اتصال شما تغییر کرد."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"این دستگاه از اولویت فقط ۵ گیگاهرتز شما پشتیبانی نمی‌کند. هرزمان نوار ۵ گیگاهرتزی دردسترس باشد این دستگاه از آن استفاده خواهد کرد."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"به <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> تغییر کرد"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"وقتی <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> به اینترنت دسترسی نداشته باشد، دستگاه از <xliff:g id="NEW_NETWORK">%1$s</xliff:g> استفاده می‌کند. ممکن است هزینه‌هایی اعمال شود."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"از <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> به <xliff:g id="NEW_NETWORK">%2$s</xliff:g> تغییر کرد"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"سرپرست سیستم شما برای کمک به عیب‌یابی این دستگاه، گزارش اشکال درخواست کرده است. ممکن است برنامه‌ها و داده‌ها به اشتراک گذاشته شوند."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"اشتراک‌گذاری"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"نپذیرفتن"</string>
- <string name="select_input_method" msgid="8547250819326693584">"تغییر صفحه‌کلید"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"انتخاب روش ورودی"</string>
<string name="show_ime" msgid="2506087537466597099">"وقتی صفحه‌کلید فیزیکی فعال است این ویرایشگر را روی صفحه نگه‌می‌دارد"</string>
<string name="hardware" msgid="194658061510127999">"نمایش صفحه‌کلید مجازی"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"پیکربندی صفحه‌کلید فیزیکی"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 6dfbcadb16b9..36a656b0f3d1 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lentokonetila"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lentokonetila on KÄYTÖSSÄ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lentokonetila on POIS KÄYTÖSTÄ"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Virransäästö"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Virransäästö on POISSA KÄYTÖSTÄ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Virransäästö on KÄYTÖSSÄ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Asetukset"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Auta"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ääniapuri"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Sijainti"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"käyttää laitteen sijaintia"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tämän laitteen sijainnin käyttöoikeuden?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Sovellus saa sijainnin käyttöoikeuden vain jos käytät sovellusta."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tämän laitteen sijainnin käyttöoikeuden?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Sovellus saa sijainnin käyttöoikeuden aina, vaikka et käyttäisi sovellusta."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalenteri"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"käyttää kalenteria"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Saako &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; kalenterisi käyttöoikeuden?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Tämä sovellus voi lisätä, poistaa tai muuttaa puhelimen kalenteritapahtumia. Sovellus voi lähettää viestejä, jotka näyttävät tulevan kalenterin omistajilta, tai muuttaa kalenteritapahtumia ilmoittamatta omistajille."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"käytä lisää sijainnintarjoajakomentoja"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Antaa sovelluksen käyttää ylimääräisiä sijaintipalvelukomentoja. Sovellus saattaa tällöin häiritä GPS:n tai muiden sijaintilähteiden toimintaa."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"käyttää tarkkaa sijaintia (GPS- ja verkkopohjainen)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Tämä sovellus voi määrittää sijaintisi matkapuhelinverkon tukiasemien, Wi-Fi-verkkojen ja muiden verkkolähteiden tai GPS-paikannuksen perusteella. Näiden sijaintipalveluiden tulee olla käytössä ja käytettävissä puhelimellasi, jotta sovellus voi käyttää niitä. Tämä voi lisätä akun kulutusta."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"käyttää tarkkaa sijaintia vain etualalla"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Tämä sovellus saa tarkat sijaintitietosi käyttöönsä vain etualalla. Näiden sijaintipalveluiden tulee olla käytössä ja käytettävissä puhelimellasi, jotta sovellus voi käyttää niitä. Tämä voi lisätä akun kulutusta."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"käyttää likimääräistä sijaintia (verkkopohjainen)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Tämä sovellus voi määrittää sijaintisi matkapuhelinverkon tukiasemien, Wi-Fi-verkkojen ja muiden verkkolähteiden perusteella. Näiden sijaintipalveluiden tulee olla käytössä ja käytettävissä tabletillasi, jotta sovellus voi käyttää niitä."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Tämä sovellus voi määrittää sijaintisi matkapuhelinverkon tukiasemien, Wi-Fi-verkkojen ja muiden verkkolähteiden perusteella. Näiden sijaintipalveluiden tulee olla käytössä ja käytettävissä TV:lläsi, jotta sovellus voi käyttää niitä."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Tämä sovellus voi määrittää sijaintisi matkapuhelinverkon tukiasemien, Wi-Fi-verkkojen ja muiden verkkolähteiden perusteella. Näiden sijaintipalveluiden tulee olla käytössä ja käytettävissä puhelimellasi, jotta sovellus voi käyttää niitä."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"käyttää tarkkaa sijaintia taustalla"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Tämä sovellus saa tarkat sijaintitietosi käyttöönsä taustalla. Näiden sijaintipalveluiden tulee olla käytössä ja käytettävissä puhelimellasi, jotta sovellus voi käyttää niitä. Tämä voi lisätä akun kulutusta."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"muuta ääniasetuksia"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Antaa sovelluksen muokata yleisiä ääniasetuksia, kuten äänenvoimakkuutta ja käytettävää kaiutinta."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"tallentaa ääntä"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Sormenjälkikuvake"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"hallinnoida kasvojentodennuslaitteistoa"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa kasvomalleja."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"käyttää kasvojentodennuslaitteistoa"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Sallii sovelluksen käyttää todennuslaitteistoa todennukseen"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kasvojen käsittely epäonnistui. Yritä uudelleen."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Kasvokuva on liian kirkas. Kokeile hämärää valoa."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Kasvokuva on liian tumma. Älä peitä valonlähdettä."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Siirrä anturia kauemmas kasvoista."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Tuo anturi lähemmäs kasvoja."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Siirrä anturia korkeammalle."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Siirrä anturia alemmas."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Siirrä anturia oikealle."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Siirrä anturia vasemmalle."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Katso anturia."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Kasvoja ei havaittu."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Pidä kasvot paikoillaan laitteen edessä."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Kasvolaitteisto ei ole käytettävissä."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Kasvotoiminto aikakatkaistiin. Yritä uudelleen."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Kasvoja ei voi tallentaa."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Kasvotoiminto peruutettu"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Liikaa yrityksiä. Kasvojentodennus ei käytössä."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Yritä uudelleen."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Kasvoja ei ole otettu käyttöön."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Laitteessa ei ole kasvojentodennusanturia."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Kasvot <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Kasvokuvake"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lue synkronointiasetuksia"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Antaa sovelluksen lukea tilien synkronointiasetuksia. Sovellus voi esimerkiksi määrittää, onko Henkilöt-sovellus synkronoitu tilin kanssa."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ota synkronointi käyttöön tai poista se käytöstä"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi ei ole yhteydessä internetiin"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Näytä vaihtoehdot napauttamalla."</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot-asetustesi muutokset"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot-taajuutesi on muuttunut."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Tämä laite ei tue asetustasi (vain 5 GHz). Sen sijaan laite käyttää 5 GHz:n taajuutta sen ollessa käytettävissä."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> otettiin käyttöön"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="NEW_NETWORK">%1$s</xliff:g> otetaan käyttöön, kun <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ei voi muodostaa yhteyttä internetiin. Veloitukset ovat mahdollisia."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> poistettiin käytöstä ja <xliff:g id="NEW_NETWORK">%2$s</xliff:g> otettiin käyttöön."</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Järjestelmänvalvoja pyysi virheraporttia voidakseen auttaa laitteen vianetsinnässä. Sovelluksia ja tietoja voidaan jakaa."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"JAA"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"HYLKÄÄ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Vaihda näppäimistö"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Valitse syöttötapa"</string>
<string name="show_ime" msgid="2506087537466597099">"Pidä näytöllä, kun fyysinen näppäimistö on aktiivinen."</string>
<string name="hardware" msgid="194658061510127999">"Näytä virtuaalinen näppäimistö"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Määritä fyysinen näppäimistö"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 0ddae2a810b1..eaa2ba005482 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode Avion"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Le mode Avion est activé."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Le mode Avion est désactivé."</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Économie d\'énergie"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"La fonction Économie d\'énergie est désactivée"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"La fonction Économie d\'énergie est activée"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. vocale"</string>
@@ -272,22 +269,25 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string>
- <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à vos contacts?"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à vos contacts?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Localisation"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accéder à la position de cet appareil"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à la position de cet appareil?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"L\'application aura uniquement accès à la position lorsque vous l\'utilisez."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Toujours autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder à la position de cet appareil?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"L\'application aura toujours accès à la position, même lorsque vous ne l\'utilisez pas."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accéder à votre agenda"</string>
- <string name="permgrouprequest_calendar" msgid="289900767793189421">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à votre agenda?"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à votre agenda?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Messagerie texte"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"envoyer et afficher des messages texte"</string>
- <string name="permgrouprequest_sms" msgid="7168124215838204719">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à envoyer et à afficher des messages texte?"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à envoyer et à afficher des messages texte?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Stockage"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accéder aux photos, aux contenus multimédias et aux fichiers sur votre appareil"</string>
<string name="permgrouprequest_storage" msgid="7885942926944299560">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux photos, aux médias et aux fichiers de votre appareil?"</string>
<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 « <xliff:g id="APP_NAME">%1$s</xliff:g> » à enregistrer de l\'audio?"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&amp;gt à enregistrer l\'audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"prendre des photos et filmer des vidéos"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à prendre des photos et à filmer des vidéos?"</string>
@@ -296,7 +296,7 @@
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à vos journaux d\'appels?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faire et gérer des appels téléphoniques"</string>
- <string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à faire et à gérer les appels téléphoniques?"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à faire et à gérer les appels téléphoniques?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs sur vos signes vitaux"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder aux données des capteurs pour vos signes vitaux?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Cette application peut ajouter, supprimer et modifier des événements d\'agenda sur votre téléphone. Elle peut aussi envoyer des messages qui pourraient sembler venir des propriétaires d\'agenda en question ou modifier des événements sans avertir leur propriétaire."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accéder aux commandes de fournisseur de position géographique supplémentaires"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permet à l\'application d\'accéder à des commandes de localisation supplémentaires offertes par le fournisseur. Elle est ainsi susceptible d\'interférer avec le bon fonctionnement du GPS ou de toute autre source de localisation."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"accéder à votre position précise (GPS et réseau)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Cette application peut déterminer votre position à l\'aide du système GPS et de différentes sources de localisation sur le réseau, comme les tours de téléphonie cellulaire et les réseaux Wi-Fi. Ces services de localisation doivent être activés et accessibles sur votre téléviseur pour que l\'application puisse les utiliser. Cela peut entraîner une utilisation accrue de la pile."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"accéder à votre position précise seulement en avant-plan"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Cette application peut obtenir votre position exacte seulement lorsqu\'elle fonctionne en avant-plan. Ces services de localisation doivent être activés et accessibles sur votre téléviseur pour que l\'application puisse les utiliser. Cela peut entraîner une utilisation accrue de la pile."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"accéder à votre position approximative (réseau)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Cette application peut déterminer votre position à l\'aide de différentes sources de localisation sur le réseau, comme les tours de téléphonie cellulaire et les réseaux Wi-Fi. Ces services de localisation doivent être activés et accessibles sur votre tablette pour que l\'application puisse les utiliser."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Cette application peut déterminer votre position à l\'aide de différentes sources de localisation sur le réseau, comme les tours de téléphonie cellulaire et les réseaux Wi-Fi. Ces services de localisation doivent être activés et accessibles sur votre téléviseur pour que l\'application puisse les utiliser."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Cette application peut déterminer votre position à l\'aide de différentes sources de localisation sur le réseau, comme les tours de téléphonie cellulaire et les réseaux Wi-Fi. Ces services de localisation doivent être activés et accessibles sur votre téléphone pour que l\'application puisse les utiliser."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"accéder à votre position précise en arrière-plan"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Cette application peut obtenir votre position exacte à tout moment en arrière-plan. Ces services de localisation doivent être activés et accessibles sur votre téléviseur pour que l\'application puisse les utiliser. Cela peut entraîner une utilisation accrue de la pile."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifier vos paramètres audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permet à l\'application de modifier les paramètres audio généraux, tels que le volume et la sortie audio utilisée."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"enregistrer des fichiers audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icône d\'empreinte digitale"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"gérer le matériel d\'authentification de visage"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utiliser le matériel d\'authentification de visage"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permet à l\'appli d\'utiliser du matériel de reconnaissance du visage pour l\'authentification"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Impossible de traiter le visage. Réessayez."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Visage trop lumineux. Essayez avec moins de lumière."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Visage trop sombre. Essayez avec plus de lumière."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Veuillez éloigner le capteur du visage."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Veuillez rapprocher le capteur du visage."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Veuillez déplacer le capteur plus haut."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Veuillez déplacer le capteur plus bas."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Veuillez déplacer le capteur vers la droite."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Veuillez déplacer le capteur vers la gauche."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Veuillez regarder le capteur."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Aucun visage détecté."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Gardez le visage stable devant l\'appareil."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Matériel de reconnaissance du visage indisponible."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Temps de reconn. visage écoulé. Veuillez réessayer."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Impossible de stocker le visage."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Opération de reconnaissance du visage annulée."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Trop de tentatives. Veuillez réessayer plus tard."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Trop de tentatives. Capt. reconn. visage désactivé."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Réessayez."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Aucun visage inscrit."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Cet appareil ne possède pas de capteur de reconn. du visage"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Visage <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Icône visage"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activer ou désactiver la synchronisation"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Le réseau Wi-Fi ne dispose d\'aucun accès à Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Touchez pour afficher les options"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Modifications apportées à vos paramètres de point d\'accès"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"La bande de votre point d\'accès a changé."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Cet appareil ne prend pas en charge votre préférence pour la bande de 5 GHz seulement. Au lieu de cela, cet appareil utilisera la bande de 5 GHz lorsqu\'elle sera disponible."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Passé au réseau <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"L\'appareil utilise <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quand <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> n\'a pas d\'accès à Internet. Des frais peuvent s\'appliquer."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Passé du réseau <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> au <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Votre administrateur a demandé un rapport de bogue pour l\'aider à dépanner cet appareil. Les applications et les données peuvent être partagées."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"PARTAGER"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"REFUSER"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Changer de clavier"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Sélectionnez le mode de saisie"</string>
<string name="show_ime" msgid="2506087537466597099">"Afficher lorsque le clavier physique est activé"</string>
<string name="hardware" msgid="194658061510127999">"Afficher le clavier virtuel"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configurer le clavier physique"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 7425d7396f85..33053d2f19ff 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode Avion"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Le mode Avion est activé."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Le mode Avion est désactivé."</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Économiseur de batterie"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Économiseur de batterie DÉSACTIVÉ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Économiseur de batterie ACTIVÉ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assistance vocale"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Localisation"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accéder à la position de l\'appareil"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder à la position de cet appareil ?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"L\'application n\'a accès à la position de l\'appareil que lorsqu\'elle est en cours d\'utilisation."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Toujours autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder à la position de l\'appareil ?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"L\'application a toujours accès à la position de l\'appareil, même lorsqu\'elle n\'est pas en cours d\'utilisation."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accéder à votre agenda"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder à votre agenda ?"</string>
@@ -293,7 +293,7 @@
<string name="permgrouprequest_camera" msgid="1299833592069671756">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; de prendre des photos et de filmer des vidéos ?"</string>
<string name="permgrouplab_calllog" msgid="8798646184930388160">"Journaux d\'appels"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"Lire et écrire les journaux d\'appels du téléphone"</string>
- <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Autoriser &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; à accéder aux journaux d\'appels de votre téléphone ?"</string>
+ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; d\'accéder aux journaux d\'appels de votre téléphone ?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"effectuer et gérer des appels téléphoniques"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Permettre à &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; de passer et gérer des appels téléphoniques ?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Cette application peut ajouter, supprimer ou modifier les événements d\'agenda enregistrés sur votre téléphone. Elle peut en outre envoyer des messages qui semblent provenir du propriétaire de l\'agenda, ou modifier des événements sans en informer leur propriétaire."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Accès aux commandes de fournisseur de position géographique supplémentaires"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permet à l\'application d\'accéder à des commandes de localisation supplémentaires offertes par le fournisseur. Elle est ainsi susceptible d\'interférer avec le bon fonctionnement du GPS ou de toute autre source de localisation."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"accéder à votre position précise (GPS et réseau)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Cette application peut obtenir votre position via le GPS ou des sources de positionnement de réseau telles que les antennes-relais et les réseaux Wi-Fi. Ces services de localisation doivent être activés et disponibles sur votre téléphone pour que l\'application puisse les utiliser. Ceci peut réduire l\'autonomie de la batterie."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"accéder à la position exacte au premier plan uniquement"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Cette application peut obtenir votre position exacte uniquement lorsqu\'elle s\'exécute au premier plan. Ces services de localisation doivent être activés et disponibles sur votre téléphone pour que l\'application puisse les utiliser. Ceci peut réduire l\'autonomie de la batterie."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"accéder à votre position approximative (selon le réseau)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Cette application peut obtenir votre position via des sources de réseau telles que les antennes-relais et les réseaux Wi-Fi. Ces services de localisation doivent être activés et disponibles sur votre tablette pour que l\'application puisse les utiliser."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Cette application peut obtenir votre position via des sources de réseau telles que les antennes-relais et les réseaux Wi-Fi. Ces services de localisation doivent être activés et disponibles sur votre téléviseur pour que l\'application puisse les utiliser."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Cette application peut obtenir votre position via des sources de réseau telles que les antennes-relais et les réseaux Wi-Fi. Ces services de localisation doivent être activés et disponibles sur votre téléphone pour que l\'application puisse les utiliser."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"accéder à la position exacte en arrière-plan"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Cette application peut obtenir votre position exacte à tout moment lorsqu\'elle s\'exécute en arrière-plan. Ces services de localisation doivent être activés et disponibles sur votre téléphone pour que l\'application puisse les utiliser. Ceci peut réduire l\'autonomie de la batterie."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifier vos paramètres audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permet à l\'application de modifier les paramètres audio généraux, tels que le volume et la sortie audio utilisée."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"enregistrer des fichiers audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icône d\'empreinte digitale"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"gérer le matériel d\'authentification faciale"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Autorise l\'appli à invoquer des méthodes pour ajouter et supprimer des modèles de visages."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utiliser le matériel d\'authentification faciale"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Autorise l\'appli à utiliser le matériel d\'authentification faciale pour l\'authentification"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Impossible reconnaître visage. Veuillez réessayer."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Visage trop éclairé. Veuillez réduire la lumière."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Visage trop sombre. Veuillez accroître la lumière."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Veuillez éloigner le capteur de votre visage."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Veuillez rapprocher le capteur de votre visage."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Veuillez déplacer le capteur vers le haut."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Veuillez déplacer le capteur vers le bas."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Veuillez déplacer le capteur vers la droite."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Veuillez déplacer le capteur vers la gauche."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Veuillez regarder le capteur."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Aucun visage détecté."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Maintenez votre visage stable devant l\'appareil."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Matériel de reconnaissance faciale indisponible."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Délai de détection du visage expiré. Réessayez."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Impossible de stocker les informations du visage."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Opération de reconnaissance faciale annulée."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Trop de tentatives. Réessayez plus tard."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Trop d\'essais. Authentification faciale désactivée."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Réessayez."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Aucun visage enregistré."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Aucun capteur d\'authentification faciale sur cet appareil"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Visage <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Icône visage"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lire les paramètres de synchronisation"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activer/désactiver la synchronisation"</string>
@@ -605,7 +638,7 @@
<string name="policylab_disableCamera" msgid="6395301023152297826">"Désactiver les appareils photo"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Empêcher l\'utilisation de tous les appareils photos"</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Désact. options du verr. écran"</string>
- <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Empêchez l\'utilisation de certaines fonctionnalités du verrouillage de l\'écran."</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Empêcher l\'utilisation de certaines fonctionnalités du verrouillage de l\'écran."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Domicile"</item>
<item msgid="869923650527136615">"Mobile"</item>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Impossible de se connecter à Internet via le réseau Wi-Fi"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Appuyez ici pour afficher des options."</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Modifications apportées à vos paramètres de point d\'accès"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Votre bande de point d\'accès a été modifiée."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Cet appareil n\'est pas compatible avec votre préférence d\'utilisation de la bande 5 GHz uniquement. Il utilisera la bande 5 GHz lorsqu\'elle sera disponible."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Nouveau réseau : <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"L\'appareil utilise <xliff:g id="NEW_NETWORK">%1$s</xliff:g> lorsque <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> n\'a pas de connexion Internet. Des frais peuvent s\'appliquer."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Ancien réseau : <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>. Nouveau réseau : <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Votre administrateur a demandé un rapport de bug pour l\'aider à résoudre le problème lié à cet appareil. Il est possible que des applications et des données soient partagées."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"PARTAGER"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"REFUSER"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Changer de clavier"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Sélectionnez le mode de saisie"</string>
<string name="show_ime" msgid="2506087537466597099">"Afficher lorsque le clavier physique est activé"</string>
<string name="hardware" msgid="194658061510127999">"Afficher le clavier virtuel"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configurer le clavier physique"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 088ef5158ac9..a5327f633c15 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo avión está activado"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo avión está desactivado"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Aforro de batería"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"A función Aforro de batería está DESACTIVADA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"A función Aforro de batería está ACTIVADA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Localización"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceder á localización deste dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda á localización deste dispositivo?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"A aplicación só terá acceso á localización mentres a esteas utilizando."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Queres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda á localización?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"A aplicación sempre terá acceso á localización, aínda que non a esteas utilizando."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceder ao teu calendario"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Queres permitir que a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda ao teu calendario?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Esta aplicación pode engadir, quitar ou cambiar eventos do calendario almacenados no teu teléfono. Tamén pode enviar mensaxes que parezan dos propietarios do calendario e cambiar eventos sen comunicárllelo aos propietarios."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acceder a comandos adicionais do provedor de localización"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite á aplicación acceder a comandos adicionais de fornecedor de localizacións. É posible que isto provoque que a aplicación interfira co funcionamento do GPS ou doutras fontes da localización."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"acceder á localización precisa (baseada no GPS e na rede)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Esta aplicación pode obter a túa localización a partir do GPS ou de fontes de localización de rede como torres de telecomunicacións e redes wifi. Para que a aplicación poida utilizar os servizos de localización, deben estar activados e dispoñibles no teu teléfono. Ten en conta que con esta acción pode aumentar o consumo de batería."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"acceder á localización exacta só en primeiro plano"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Esta aplicación pode obter a túa localización exacta só cando se atope en primeiro plano. É necesario activar estes servizos de localización e deben estar dispoñibles no teléfono para que a aplicación poida utilizalos. Ademais, poden supoñer un aumento do consumo de batería."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"acceder á localización aproximada (baseada na rede)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Esta aplicación pode obter a túa localización a partir de fontes de rede como torres de telecomunicacións e redes wifi. Para que a aplicación poida utilizar os servizos de localización, deben estar activados e dispoñibles na túa tableta."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Esta aplicación pode obter a túa localización a partir de fontes de rede como torres de telecomunicacións e redes wifi. Para que a aplicación poida utilizar os servizos de localización, deben estar activados e dispoñibles na túa televisión."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Esta aplicación pode obter a túa localización a partir de fontes de rede como torres de telecomunicacións e redes wifi. Para que a aplicación poida utilizar os servizos de localización, deben estar activados e dispoñibles no teu teléfono."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"acceder á localización exacta en segundo plano"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Esta aplicación pode obter a túa localización exacta cando estea en segundo plano. É necesario activar estes servizos de localización e deben estar dispoñibles no teléfono para que a aplicación poida utilizalos. Ademais, poden supoñer un aumento do consumo de batería."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"cambiar a configuración de son"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite á aplicación modificar a configuración de audio global, como o volume e que altofalante se utiliza para a saída."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"gravar audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona de impresión dixital"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"xestionar hardware de autenticación facial"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que a aplicación invoque métodos para engadir e eliminar modelos faciais de uso."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticación facial"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que a aplicación utilice hardware facial para a autenticación"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Non se puido procesar a cara. Téntao de novo."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"A cara vese demasiado brillante. Proba con menos luz."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"A cara vese demasiado escura. Proba con máis luz."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Afasta o sensor da cara."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Achega o sensor á cara."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Sube máis o sensor."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Baixa o sensor."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Move o sensor cara á dereita."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Move o sensor cara á esquerda."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Mira ao sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Non se detectou ningunha cara."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mantén a cara fixa diante do dispositivo."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"O hardware facial non está dispoñible."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Esgotouse o tempo de espera. Téntao de novo."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Non se puido almacenar a cara."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Cancelouse a operación relacionada coa cara"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Téntao de novo máis tarde."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autenticación desactivada."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Téntao de novo."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Non se rexistrou ningunha cara."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Este dispositivo non ten un sensor de autenticación facial"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Icona cara"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler a configuración de sincronización"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite á aplicación ler a configuración de sincronización dunha conta. Por exemplo, esta acción pode determinar se a aplicación Contactos se sincroniza cunha conta."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activar e desactivar a sincronización"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"A wifi non ten acceso a Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca para ver opcións."</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Cambios na configuración da zona wifi"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Modificouse a banda da zona wifi."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo non admite a opción de conectarse só a bandas de 5 GHz, pero usaraas se están dispoñibles."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Cambiouse a: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"O dispositivo utiliza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> cando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> non ten acceso a Internet. Pódense aplicar cargos."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Cambiouse de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"O teu administrador solicitou un informe de erros para axudar a solucionar os problemas deste dispositivo. É posible que se compartan aplicacións e datos."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"COMPARTIR"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ANULAR"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Cambiar teclado"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Escoller método de introdución de texto"</string>
<string name="show_ime" msgid="2506087537466597099">"Móstrase na pantalla mentres o teclado físico estea activo"</string>
<string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configura o teclado físico"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 3a42f3a09fb5..d41a923327df 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"એરપ્લેન મોડ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"એરપ્લેન મોડ ચાલુ છે."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"એરપ્લેન મોડ બંધ છે."</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"બૅટરી સેવર"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"બૅટરી સેવર બંધ છે"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"બૅટરી સેવર ચાલુ છે"</string>
<string name="global_action_settings" msgid="1756531602592545966">"સેટિંગ્સ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"સહાય"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"વૉઇસ સહાય"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"સ્થાન"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"માત્ર જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યાં હોય ત્યારે જ ઍપ સ્થાનને ઍક્સેસ કરી શકશે."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને હંમેશાં આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"તમે ઍપનો ઉપયોગ કરી રહ્યાં ન હોય, તો પણ ઍપ હંમેશાં સ્થાનને ઍક્સેસ કરી શકશે."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"કૅલેન્ડર"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"તમારા કેલેન્ડરને ઍક્સેસ કરવાની"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને તમારા કૅલેન્ડરને ઍક્સેસ કરવાની મંજૂરી આપીએ?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"આ ઍપ્લિકેશન, તમારા ફોન પર કૅલેન્ડર ઇવેન્ટ્સ ઉમેરી, દૂર કરી અથવા બદલી શકે છે. આ ઍપ્લિકેશન, કૅલેન્ડર માલિકો તરફથી આવતાં હોય તેવા લાગતાં સંદેશા મોકલી શકે છે અથવા તેમના માલિકોને સૂચિત કર્યા વિના ઇવેન્ટ્સ બદલી શકે છે."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"વધારાના સ્થાન પ્રદાતા આદેશોને ઍક્સેસ કરો"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"એપ્લિકેશનને વધારાના સ્થાન પ્રદાતા આદેશોને ઍક્સેસ કરવાની મંજૂરી આપે છે. આ એપ્લિકેશનને GPS અથવા અન્ય સ્થાન સ્રોતોના ઓપરેશનમાં દખલ કરવાની મંજૂરી આપી શકે છે."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"નિશ્ચિત સ્થાન ઍક્સેસ કરો (GPS અને નેટવર્ક-આધારિત)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"આ ઍપ્લિકેશન, GPS અથવા સેલ ટાવર્સ અને વાઇ-ફાઇ નેટવર્ક્સ જેવા નેટવર્ક સ્રોતોના આધારે તમારું સ્થાન મેળવી શકે છે. ઍપ્લિકેશન દ્વારા આ સ્થાન સેવાઓનો ઉપયોગ કરવામાં સમર્થ થવા માટે તમારા ફોન પર આ ઉપલબ્ધ અને ચાલુ હોવી આવશ્યક છે. આ બૅટરી વપરાશ વધારી શકે છે."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"ફૉરગ્રાઉન્ડમાં ફક્ત ચોક્કસ સ્થાન ઍક્સેસ કરો"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"આ ઍપ ફક્ત બૅકગ્રાઉન્ડમાં હોય ત્યારે જ તમારું ચોક્કસ સ્થાન મેળવી શકે છે. ઍપ આ સ્થાન સેવાઓનો ઉપયોગ કરી શકે તે માટે તમારા ફોન પર આ સેવાઓ ઉપલબ્ધ અને ચાલુ હોવી આવશ્યક છે. આ બૅટરી વપરાશ વધારી શકે છે."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"અંદાજિત સ્થાન ઍક્સેસ કરો (નેટવર્ક-આધારિત)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"આ ઍપ્લિકેશન, સેલ ટાવર્સ અને વાઇ-ફાઇ નેટવર્ક્સ જેવા નેટવર્ક સ્રોતોના આધારે તમારું સ્થાન મેળવી શકે છે. ઍપ્લિકેશન દ્વારા આ સ્થાન સેવાઓનો ઉપયોગ કરવામાં સમર્થ થવા માટે તમારા ટેબ્લેટ પર આ ઉપલબ્ધ અને ચાલુ હોવી આવશ્યક છે."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"આ ઍપ્લિકેશન, સેલ ટાવર્સ અને વાઇ-ફાઇ નેટવર્ક્સ જેવા નેટવર્ક સ્રોતોના આધારે તમારું સ્થાન મેળવી શકે છે. ઍપ્લિકેશન દ્વારા આ સ્થાન સેવાઓનો ઉપયોગ કરવામાં સમર્થ થવા માટે તમારા ટીવી પર આ ઉપલબ્ધ અને ચાલુ હોવી આવશ્યક છે."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"આ ઍપ્લિકેશન, સેલ ટાવર્સ અને વાઇ-ફાઇ નેટવર્ક્સ જેવા નેટવર્ક સ્રોતોના આધારે તમારું સ્થાન મેળવી શકે છે. ઍપ્લિકેશન દ્વારા આ સ્થાન સેવાઓનો ઉપયોગ કરવામાં સમર્થ થવા માટે તમારા ફોન પર આ ઉપલબ્ધ અને ચાલુ હોવી આવશ્યક છે."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"બૅકગ્રાઉન્ડમાં ચોક્કસ સ્થાન ઍક્સેસ કરો"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"આ ઍપ બૅકગ્રાઉન્ડમાં હોય ત્યારે કોઈપણ સમયે તમારું ચોક્કસ સ્થાન મેળવી શકે છે. ઍપ આ સ્થાન સેવાઓનો ઉપયોગ કરી શકે તે માટે તમારા ફોન પર આ સેવાઓ ઉપલબ્ધ અને ચાલુ હોવી આવશ્યક છે. આ બૅટરી વપરાશ વધારી શકે છે."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"તમારી ઑડિઓ સેટિંગ્સ બદલો"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"એપ્લિકેશનને વૈશ્વિક ઑડિઓ સેટિંગ્સને સંશોધિત કરવાની મંજૂરી આપે છે, જેમ કે વૉલ્યૂમ અને આઉટપુટ માટે કયા સ્પીકરનો ઉપયોગ કરવો."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ઑડિઓ રેકોર્ડ કરવાની"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ફિંગરપ્રિન્ટ આયકન"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"ચહેરા પ્રમાણીકરણના હાર્ડવેરને મેનેજ કરો"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ઍપને ઉપયોગ માટે ચહેરાના નમૂના ઉમેરવા અને ડિલીટ કરવાની પદ્ધતિને રદ કરવાની મંજૂરી આપે છે."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરો"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ઍપને પ્રમાણીકરણ માટે ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ચહેરાની પ્રક્રિયા કરી શકાઈ નથી. ફરી પ્રયાસ કરો."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ચહેરો ખૂબ ચળકે છે. કૃપા કરીને ઓછા પ્રકાશવાળા સ્થાનમાં પ્રયાસ કરો."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ચહેરો ખૂબ શ્યામ છે. કૃપા કરીને પ્રકાશના સૉર્સ ઉઘાડો."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"કૃપા કરીને સેન્સરને ચહેરાથી દૂર ખસેડો."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"કૃપા કરીને સેન્સરને ચહેરાની નજીક ખસેડો."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"કૃપા કરીને સેન્સરને ઉપર ખસેડો."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"કૃપા કરીને સેન્સર નીચે ખસેડો."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"કૃપા કરીને સેન્સરને જમણી બાજુ ખસેડો."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"કૃપા કરીને સેન્સરને ડાબી બાજુ ખસેડો."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"કૃપા કરીને સેન્સરની સામે જુઓ."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"કોઈ ચહેરો મળ્યો નથી."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ઉપકરણની સામે ચહેરો સ્થિર રાખો."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"ચહેરા માટેનું હાર્ડવેર ઉપલબ્ધ નથી."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"ચહેરા માટેનો સમય સમાપ્ત થયો. ફરી પ્રયાસ કરો."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"ચહેરો સંગ્રહિત કરી શકાશે નહીં."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ઘણા બધા પ્રયત્નો. ચહેરાનું પ્રમાણીકરણ બંધ કરવામાં આવ્યું છે."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"ફરી પ્રયાસ કરો."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"કોઈ ચહેરાની નોંધણી કરવામાં આવી નથી."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"આ ઉપકરણમાં ચહેરાના પ્રમાણીકરણ માટે કોઈ સેન્સર નથી"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"ચહેરાનું <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"ચહેરા આઇકન"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"સમન્વયન સેટિંગ્સ વાંચો"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ઍપ્લિકેશનને એકાઉન્ટ માટે સમન્વયન સેટિંગ્સને વાંચવાની મંજૂરી આપે છે. ઉદાહરણ તરીકે, આ એકાઉન્ટ સાથે લોકો ઍપ્લિકેશન સમન્વયિત થઈ છે કે કેમ તે નિર્ધારિત કરી શકે છે."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"સમન્વયન ચાલુ અને બંધ ટોગલ કરો"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"વાઇ-ફાઇને કોઈ ઇન્ટરનેટ ઍક્સેસ નથી"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"વિકલ્પો માટે ટૅપ કરો"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"તમારી હૉટસ્પૉટ સેટિંગને બદલે છે"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"તમારું હૉટસ્પૉટ બેન્ડ બદલાયેલ છે."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"આ ઉપકરણ તમારી ફક્ત 5GHz માટેની પસંદગીને સમર્થન આપતું નથી. તેના બદલે, જ્યારે આ ઉપકરણ જ્યારે 5GHz બેન્ડ ઉપલબ્ધ હશે ત્યારે તેનો ઉપયોગ કરશે."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> પર સ્વિચ કર્યું"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"જ્યારે <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> પાસે કોઈ ઇન્ટરનેટ ઍક્સેસ ન હોય ત્યારે ઉપકરણ <xliff:g id="NEW_NETWORK">%1$s</xliff:g>નો ઉપયોગ કરે છે. શુલ્ક લાગુ થઈ શકે છે."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> પરથી <xliff:g id="NEW_NETWORK">%2$s</xliff:g> પર સ્વિચ કર્યું"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"તમારા વ્યવસ્થાપકે આ ઉપકરણના સમસ્યા નિવારણમાં સહાય માટે બગ રિપોર્ટની વિનંતી કરી છે. ઍપ્લિકેશનો અને ડેટા શેર કરવામાં આવી શકે છે."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"શેર કરો"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"નકારો"</string>
- <string name="select_input_method" msgid="8547250819326693584">"કીબોર્ડ બદલો"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ઇનપુટ પદ્ધતિ પસંદ કરો"</string>
<string name="show_ime" msgid="2506087537466597099">"જ્યારે ભૌતિક કીબોર્ડ સક્રિય હોય ત્યારે તેને સ્ક્રીન પર રાખો"</string>
<string name="hardware" msgid="194658061510127999">"વર્ચ્યુઅલ કીબોર્ડ બતાવો"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ભૌતિક કીબોર્ડ ગોઠવો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index dd15ada4ea3c..8c7a0d368ecf 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाई जहाज मोड"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाई जहाज मोड चालू है"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाई जहाज मोड बंद है"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"बैटरी सेवर"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"बैटरी सेवर बंद है"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"बैटरी सेवर चालू है"</string>
<string name="global_action_settings" msgid="1756531602592545966">"सेटिंग"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहायता"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज़ से डिवाइस का इस्तेमाल"</string>
@@ -275,7 +272,10 @@
<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>
<string name="permgroupdesc_location" msgid="1346617465127855033">"इस डिवाइस की जगह तक पहुंचने दें"</string>
- <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को इस डिवाइस की जगह की जानकारी देखने की अनुमति देना चाहते हैं?"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को इस डिवाइस की \'जगह की जानकारी\' ऐक्सेस करने की अनुमति देना चाहते हैं?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ऐप्लिकेशन, डिवाइस की \'जगह की जानकारी\' सिर्फ़ तभी देख पाएगा जब आप इसका इस्तेमाल कर रहे हों."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को हमेशा डिवाइस की \'जगह की जानकारी\' एक्सेस करने दें?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ऐप्लिकेशन के पास हमेशा डिवाइस की \'जगह की जानकारी\' देखने की मंज़ूरी होगी, तब भी जब आप इसका इस्तेमाल न कर रहे हों."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कैलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"अपने कैलेंडर को ऐक्सेस करने"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपना कैलेंडर देखने की अनुमति देना चाहते हैं?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"यह ऐप्लिकेशन आपके फ़ोन पर मौजूद कैलेंडर इवेंट जोड़, निकाल या बदल सकता है. यह ऐप्लिकेशन ऐसे संदेश भेज सकता है जो कैलेंडर स्वामियों से आए हुए लग सकते हैं या यह स्वामियों को सूचित किए बिना इवेंट में बदलाव कर सकता है."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"कुछ और जगह बताने वाले आदेशों तक पहुंच"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ऐप को कुछ और जगह की जानकारी देने वाले आदेशों की पहुंच पाने देता है. इससे ऐप जीपीएस या जगह की जानकारी देने वाले दूसरे स्रोतों के काम में रोक-टोक कर सकता है."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"सटीक जगह की जानकारी लेने दें (जीपीएस और नेटवर्क-आधारित)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"यह ऐप सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों या जीपीएस के आधार पर आपकी जगह पता कर सकता है. जगह की जानकारी आपके फ़ोन पर चालू और मौजूद होनी चाहिए ताकि ऐप उनका इस्तेमाल कर सके. इससे ज़्यादा बैटरी खर्च हो सकती है."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"ऐप्लिकेशन \'जगह की सटीक जानकारी\' सिर्फ़ सामने खुली होने पर एक्सेस करे"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"यह ऐप्लिकेशन सिर्फ़ तब आपकी \'जगह की सटीक जानकारी\' का इस्तेमाल कर सकता है जब यह स्क्रीन पर दिखाई दे रहा हो. यह ज़रूरी है कि \'जगह की जानकारी\' वाली ये सेवाएं आपके फ़ोन में मौजूद हों और चालू की गई हों ताकि ऐप्लिकेशन उनका इस्तेमाल कर पाए. ऐसा करने से ज़्यादा बैटरी खर्च हो सकती है."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"अनुमानित जगह की पहुंच दें (नेटवर्क-आधारित)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"यह ऐप सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क के स्रोतों के आधार पर आपकी जगह का पता कर सकता है. ये जगह की जानकारी आपके टैबलेट पर चालू और मौजूद होनी चाहिए ताकि ऐप उनका इस्तेमाल कर सके."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"यह ऐप सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क के स्रोतों के आधार पर आपकी जगह का पता कर सकता है. ये जगह की जानकारी आपके टीवी पर चालू और मौजूद होनी चाहिए ताकि ऐप उनका इस्तेमाल कर सके."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"यह ऐप सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क के स्रोतों के आधार पर आपकी जगह का पता कर सकता है. ये जगह की जानकारी आपके फ़ोन पर चालू और मौजूद होनी चाहिए ताकि ऐप उनका इस्तेमाल कर सके."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"बैकग्राउंड में होने पर \'जगह की सटीक जानकारी\' एक्सेस करें"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"यह ऐप्लिकेशन बैकग्राउंड में चलते हुए, किसी भी समय आपकी \'जगह की सटीक जानकारी\' का इस्तेमाल कर सकता है. यह ज़रूरी है कि \'जगह की जानकारी\' वाली ये सेवाएं आपके फ़ोन में मौजूद हों और चालू की गई हों ताकि ऐप्लिकेशन उनका इस्तेमाल कर पाए. ऐसा करने से ज़्यादा बैटरी खर्च हो सकती है."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"अपनी ऑडियो सेटिंग बदलें"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ऐप्स को वैश्विक ऑडियो सेटिंग, जैसे वॉल्‍यूम और कौन-सा स्पीकर आउटपुट के लिए उपयोग किया गया, संशोधित करने देता है."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ऑडियो रिकॉर्ड करने"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फ़िंगरप्रिंट आइकॉन"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"चेहरे की पुष्टि करने वाला हार्डवेयर प्रबंधित करें"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ऐप्लिकेशन को चेहरे के टेम्पलेट इस्तेमाल के तरीके जोड़ने और मिटाने की मंज़ूरी मिलती है."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"चेहरे की पुष्टि करने वाला हार्डवेयर इस्तेमाल करें"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ऐप्लिकेशन को चेहरे की पुष्टि करने वाले हार्डवेयर का इस्तेमाल करने की मंज़ूरी मिलती है"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"चेहरे की पहचान नहीं हो पाई. कृपया फिर कोशिश करें."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"चेहरे पर रोशनी ज़्यादा है. कृपया कम रोशनी में कोशिश करें."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"चेहरे पर रोशनी बहुत कम है. कृपया रोशनी बढ़ाएं."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"कृपया डिवाइस को चेहरे से दूर ले जाएं."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"कृपया डिवाइस को चेहरे के करीब लाएं."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"कृपया डिवाइस को ऊपर करें."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"कृपया डिवाइस को नीचे की ओर ले जाएं."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"कृपया डिवाइस को चेहरे की दाईं ओर ले जाएं."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"कृपया डिवाइस को चेहरे के बाईं ओर ले जाएं."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"कृपया सेंसर की ओर देखें."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"चेहरे की पहचान नहीं हो पाई."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"डिवाइस के सामने चेहरे को स्थिर रखें."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"चेहरे की पहचान करने वाला हार्डवेयर मौजूद नहीं है."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"चेहरे की पहचान का समय खत्म हुआ. फिर से कोशिश करें."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"चेहरा सेव करने की सीमा पूरी हो गई है."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"चेहरा पहचानने की कार्रवाई रद्द की गई."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"कई बार कोशिश की गई. बाद में कोशिश करें."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"कई बार कोशिश की. चेहरा पहचानने की सुविधा बंद हुई."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"फिर से कोशिश करें."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"कोई चेहरा रजिस्टर नहीं किया गया है."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"इस डिवाइस में चेहरे की पहचान करने वाला सेंसर नहीं है"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"चेहरे का आइकॉन"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"समन्वयन सेटिंग पढ़ें"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ऐप्स को किसी खाते की समन्वयन सेटिंग पढ़ने देता है. उदाहरण के लिए, इससे यह निर्धारित किया जा सकता है कि लोग ऐप्स किसी खाते के साथ समन्‍वयित है या नहीं."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"समन्‍वयन बंद या चालू टॉगल करें"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"वाई-फ़ाई के लिए इंटरनेट नहीं मिल रहा है"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पों के लिए टैप करें"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"आपकी हॉटस्पॉट सेटिंग के हिसाब से बदलाव हो गए हैं"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"आपका हॉटस्पॉट बैंड बदल गया है."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"यह डिवाइस सिर्फ़ 5 गीगाहर्ट्ज़ की आपकी पसंद की सेटिंग पर काम नहीं करता, लेकिन जब भी 5 गीगाहर्ट्ज़ बैंड मौजूद होगा, डिवाइस उसका इस्तेमाल करने लगेगा."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> पर ले जाया गया"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> में इंटरनेट की सुविधा नहीं होने पर डिवाइस <xliff:g id="NEW_NETWORK">%1$s</xliff:g> का इस्तेमाल करता है. इसके लिए शुल्क लिया जा सकता है."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> से <xliff:g id="NEW_NETWORK">%2$s</xliff:g> पर ले जाया गया"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"आपके एडमिन ने इस डिवाइस की समस्या को हल करने में सहायता के लिए एक गड़बड़ी की रिपोर्ट का अनुरोध किया है. ऐप्लिकेशन और डेटा शेयर किए जा सकते हैं."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"शेयर करें"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"अस्वीकार करें"</string>
- <string name="select_input_method" msgid="8547250819326693584">"कीबोर्ड बदलें"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"इनपुट पद्धति चुनें"</string>
<string name="show_ime" msgid="2506087537466597099">"सामान्य कीबोर्ड के सक्रिय होने के दौरान इसे स्‍क्रीन पर बनाए रखें"</string>
<string name="hardware" msgid="194658061510127999">"वर्चूअल कीबोर्ड दिखाएं"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"सामान्य कीबोर्ड कॉन्फ़िगर करें"</string>
@@ -1673,7 +1709,7 @@
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंड में पुन: प्रयास करें</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"बाद में फिर से प्रयास करें"</string>
- <string name="immersive_cling_title" msgid="8394201622932303336">"पूरे स्क्रीन पर देखें"</string>
+ <string name="immersive_cling_title" msgid="8394201622932303336">"आप पूरे स्क्रीन पर देख रहे हैं"</string>
<string name="immersive_cling_description" msgid="3482371193207536040">"बाहर निकलने के लिए, ऊपर से नीचे स्वा‍इप करें."</string>
<string name="immersive_cling_positive" msgid="5016839404568297683">"ठीक है"</string>
<string name="done_label" msgid="2093726099505892398">"हो गया"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index d2c51f253d93..3baaf016da46 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -239,9 +239,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Način rada u zrakoplovu"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uključen je način rada u zrakoplovu"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Isključen je način rada u zrakoplovu"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Štednja baterije"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Štednja baterije isključena"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Štednja baterije uključena"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
@@ -279,6 +276,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pristupiti lokaciji ovog uređaja"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa lokaciji ovog uređaja?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacija će imati pristup lokaciji samo dok upotrebljavate aplikaciju."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa lokaciji ovog uređaja?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacija će uvijek imati pristup lokaciji, čak i dok ne upotrebljavate aplikaciju."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pristupati kalendaru"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Želite li dopustiti aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; da pristupa vašem kalendaru?"</string>
@@ -405,12 +405,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Aplikacija može dodavati, uklanjati ili mijenjati kalendarske događaje na telefonu. Može slati poruke koje izgledaju kao da ih je poslao vlasnik kalendara ili mijenjati događaje bez znanja vlasnika."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"pristup dodatnim naredbama davatelja lokacije"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Omogućuje aplikaciji pristup dodatnim naredbama davatelja usluga lokacije. To može omogućiti aplikaciji ometanje rada GPS-a ili drugih izvora lokacije."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"pristupati preciznoj lokaciji (na temelju GPS-a i mreža)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Aplikacija može dohvatiti vašu lokaciju putem GPS-a ili mrežnih izvora lokacije poput baznih stanica i Wi-Fi mreža. Te usluge lokacije moraju biti uključene i dostupne na telefonu da bi ih aplikacija mogla upotrebljavati. To može povećati potrošnju baterije."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"pristupiti preciznoj lokaciji samo u prednjem planu"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Aplikacija može dobiti vašu točnu lokaciju samo kada je u prednjem planu. Te usluge lokacije moraju biti uključene i dostupne na telefonu da bi ih aplikacija mogla upotrebljavati. To može pojačati potrošnju baterije."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"pristupati približnoj lokaciji (na temelju mreža)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Aplikacija može dohvatiti vašu lokaciju putem mrežnih izvora poput baznih stanica i Wi-Fi mreža. Te usluge lokacije moraju biti uključene i dostupne na tabletu da bi ih aplikacija mogla upotrebljavati."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Aplikacija može dohvatiti vašu lokaciju putem mrežnih izvora poput baznih stanica i Wi-Fi mreža. Te usluge lokacije moraju biti uključene i dostupne na televizoru da bi ih aplikacija mogla upotrebljavati."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Aplikacija može dohvatiti vašu lokaciju putem mrežnih izvora poput baznih stanica i Wi-Fi mreža. Te usluge lokacije moraju biti uključene i dostupne na telefonu da bi ih aplikacija mogla upotrebljavati."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"pristupiti preciznoj lokaciji u pozadini"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Aplikacija može dobiti vašu točnu lokaciju svaki put kada je u pozadini. Te usluge lokacije moraju biti uključene i dostupne na telefonu da bi ih aplikacija mogla upotrebljavati. To može pojačati potrošnju baterije."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"promjena postavki zvuka"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Aplikaciji omogućuje izmjenu globalnih postavki zvuka, primjerice glasnoće i zvučnika koji se upotrebljava za izlaz."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"snimanje zvuka"</string>
@@ -518,6 +520,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona otiska prsta"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"upravljati hardverom za autentifikaciju lica"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka lica za upotrebu."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"upotrebljavati hardver za autentifikaciju lica"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aplikaciji omogućuje upotrebu hardvera za autentifikaciju lica radi autentifikacije"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Obrada lica nije uspjela. Pokušajte ponovo."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Lice je presvijetlo. Smanjite osvjetljenje."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Lice je pretamno. Otkrijte izvor svjetlosti."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Odmaknite senzor od lica."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Približite senzor licu."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Podignite senzor."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Spustite senzor."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Pomaknite senzor udesno."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Pomaknite senzor ulijevo."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Gledajte senzor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Lice nije otkriveno."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Držite lice mirno ispred uređaja."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardver za lice nije dostupan."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Isteklo je vrijeme čekanja za lice. Pokušajte opet"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće pohraniti lice."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Otkazana je radnja s licem."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Previše pokušaja. Autentifikacija lica onemogućena"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Pokušajte ponovo."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nije registrirano nijedno lice."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Ovaj uređaj nema senzor za autentifikaciju lica"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikona lica"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"čitanje postavki sinkronizacije"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Aplikaciji omogućuje čitanje postavki sinkronizacije za račun. Time se, primjerice, može utvrditi je li aplikacija Osobe sinkronizirana s računom."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"uključivanje/isključivanje sinkronizacije"</string>
@@ -1197,6 +1230,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nema pristup internetu"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Promjene postavki vaše žarišne točke"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Promijenila se frekvencija vaše žarišne točke."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ovaj uređaj ne podržava vašu postavku za upotrebu samo 5 GHz. Upotrebljavat će frekvenciju od 5 GHz kada je dostupna."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Prelazak na drugu mrežu: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Kada <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nema pristup internetu, na uređaju se upotrebljava <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Moguća je naplata naknade."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Mreža je promijenjena: <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> &gt; <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1284,7 +1320,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administrator je zatražio izvješće o programskoj pogrešci radi lakšeg rješavanja problema na uređaju. Moguće je da će se aplikacije i podaci dijeliti."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DIJELI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ODBIJ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Promjena tipkovnice"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Odabir načina unosa"</string>
<string name="show_ime" msgid="2506087537466597099">"Zadržava se na zaslonu dok je fizička tipkovnica aktivna"</string>
<string name="hardware" msgid="194658061510127999">"Prikaži virtualnu tipkovnicu"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurirajte fizičku tipkovnicu"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 74104b1b92de..106f4970106b 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Repülőgép üzemmód"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Repülőgép üzemmód bekapcsolva"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Repülőgép üzemmód kikapcsolva"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Akkumulátorkímélő mód"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Akkumulátorkímélő mód kikapcsolva"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Akkumulátorkímélő mód bekapcsolva"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Beállítások"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Segítség"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hangsegéd"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Helyadatok"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"hozzáférés az eszköz földrajzi helyéhez"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen az eszköz helyadataihoz?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Az alkalmazás csak akkor férhet hozzá a helyadatokhoz, amikor használja az alkalmazást."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Engedélyezi, hogy a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; hozzáférjen a helyadatokhoz?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Az alkalmazás bármikor hozzáférhet majd a helyadatokhoz, akkor is, amikor nem használja az alkalmazást."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Naptár"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"hozzáférés a naptárhoz"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Engedélyezi a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; számára, hogy hozzáférjen a naptárhoz?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Az alkalmazás hozzáadhatja, eltávolíthatja vagy módosíthatja a telefonon található naptáreseményeket. Az alkalmazás olyan üzeneteket küldhet, amelyekről úgy tűnhet, hogy a naptár tulajdonosaitól származnak, illetve a tulajdonosok értesítése nélkül módosíthat eseményeket."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"további helyszolgáltatói parancsok elérése"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Lehetővé teszi az alkalmazás számára további helyszolgáltatói parancsok elérését. Ezáltal az alkalmazás beavatkozhat a GPS vagy más helyforrások működésébe."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"hozzáférés a pontos (GPS- és hálózatalapú) helyadatokhoz"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Az alkalmazás hozzáférhet a GPS-en vagy hálózati helyforrásokon (például az adótornyokon és a Wi-Fi-hálózatokon) alapuló helyadataihoz. A helyszolgáltatásoknak bekapcsolt és elérhető állapotban kell lenniük a telefonon ahhoz, hogy az alkalmazás használhassa őket. Ez növelheti az akkumulátorhasználatot."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"pontos helyadatokhoz való hozzáférés csak előtérben"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Ez az alkalmazás csak akkor férhet hozzá az eszköz pontos helyadataihoz, amikor az előtérben fut. A helyszolgáltatásoknak bekapcsolt és hozzáférhető állapotban kell lenniük a telefonon ahhoz, hogy az alkalmazás használhassa őket. Ez növelheti az akkumulátorhasználatot."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"hozzáférés a hozzávetőleges (hálózatalapú) helyadatokhoz"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Az alkalmazás hozzáférhet hálózati forrásokon (például az adótornyokon és a Wi-Fi-hálózatokon) alapuló helyadataihoz. A helyszolgáltatásoknak bekapcsolt és elérhető állapotban kell lenniük a táblagépen ahhoz, hogy az alkalmazás használhassa őket."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Az alkalmazás hozzáférhet hálózati forrásokon (például az adótornyokon és a Wi-Fi-hálózatokon) alapuló helyadataihoz. A helyszolgáltatásoknak bekapcsolt és elérhető állapotban kell lenniük a TV-n ahhoz, hogy az alkalmazás használhassa őket."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Az alkalmazás hozzáférhet hálózati forrásokon (például az adótornyokon és a Wi-Fi-hálózatokon) alapuló helyadataihoz. A helyszolgáltatásoknak bekapcsolt és elérhető állapotban kell lenniük a telefonon ahhoz, hogy az alkalmazás használhassa őket."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"pontos helyadatokhoz való hozzáférés a háttérben"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Ez az alkalmazás bármikor hozzáférhet az eszköz pontos helyadataihoz a háttérben. A helyszolgáltatásoknak bekapcsolt és hozzáférhető állapotban kell lenniük a telefonon ahhoz, hogy az alkalmazás használhassa őket. Ez növelheti az akkumulátorhasználatot."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"hangbeállítások módosítása"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Lehetővé teszi az alkalmazás számára az általános hangbeállítások, például a hangerő és a használni kívánt kimeneti hangszóró módosítását."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"hanganyag rögzítése"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ujjlenyomat ikon"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"arcfelismerő hardver kezelése"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Engedélyezi, hogy az alkalmazás arcsablon-hozzáadási és -törlési metódusokat hívjon."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"arcfelismerő hardver használata"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcfelismerő hardvert"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nem sikerült feldolgozni az arcot. Próbálja újra."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Az arc túl világos. Kevesebb fény szükséges."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Az arc túl sötét. Több fény szükséges."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Tartsa az érzékelőt távolabb az arctól."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Tartsa az érzékelőt közelebb az archoz."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Emelje magasabbra az érzékelőt."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Engedje lejjebb az érzékelőt."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Mozdítsa el jobbra az érzékelőt."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Mozdítsa el balra az érzékelőt."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Nézzen az érzékelőbe."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nem észlelhető arc."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Tartsa az eszközt egyenesen az arc előtt."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Az arcfelismerő hardver nem áll rendelkezésre."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Időtúllépés az arcbeolvasásnál. Próbálja újra."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Az arc nem tárolható."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Az arccal kapcsolatos művelet törölve."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Túl sok próbálkozás. Próbálja újra később."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Túl sok próbálkozás. Arcfelismerés letiltva."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Próbálkozzon újra."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nincs regisztrált arc."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Ez az eszköz nem rendelkezik arcfelismerő érzékelővel"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> arc"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Arcikon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"szinkronizálási beállítások olvasása"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lehetővé teszi az alkalmazás számára egy fiók szinkronizálási beállításainak beolvasását. Például ellenőrizheti, hogy a Személyek alkalmazás szinkronizálva van-e egy fiókkal."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"szinkronizálás be-és kikapcsolása"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"A Wi-Fi-hálózaton nincs internetkapcsolat"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Koppintson a beállítások megjelenítéséhez"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"A hotspot beállításainak módosítása"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"A hotspot sávja megváltozott."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ez az eszköz nem támogatja a csak 5 GHz-es sávra vonatkozó beállítást. Az eszköz akkor használ 5 GHz-es sávot, ha a sáv rendelkezésre áll."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Átváltva erre: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="NEW_NETWORK">%1$s</xliff:g> használata, ha nincs internet-hozzáférés <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>-kapcsolaton keresztül. A szolgáltató díjat számíthat fel."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Átváltva <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>-hálózatról erre: <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"A rendszergazda hibajelentést kért, hogy segíthessen az eszközzel kapcsolatos probléma megoldásában. Előfordulhat, hogy a rendszer megosztja az alkalmazásokat és adatokat."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"MEGOSZTÁS"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ELUTASÍTÁS"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Billentyűzet megváltoztatása"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Beviteli mód kiválasztása"</string>
<string name="show_ime" msgid="2506087537466597099">"Maradjon a képernyőn, amíg a billentyűzet aktív"</string>
<string name="hardware" msgid="194658061510127999">"Virtuális billentyűzet"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Állítsa be a fizikai billentyűzetet"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index cb26a1a244f0..60fe2d9b7ea8 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -219,16 +219,16 @@
<string name="global_action_emergency" msgid="7112311161137421166">"Շտապ կանչ"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Վրիպակի զեկույց"</string>
<string name="global_action_logout" msgid="935179188218826050">"Ավարտել աշխատաշրջանը"</string>
- <string name="global_action_screenshot" msgid="8329831278085426283">"Էկրանի պատկեր"</string>
+ <string name="global_action_screenshot" msgid="8329831278085426283">"Սքրինշոթ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Հաղորդել սխալի մասին"</string>
<string name="bugreport_message" msgid="398447048750350456">"Սա տեղեկություններ կհավաքագրի ձեր սարքի առկա կարգավիճակի մասին և կուղարկի այն էլեկտրոնային նամակով: Որոշակի ժամանակ կպահանջվի վրիպակի մասին զեկուցելու պահից սկսած մինչ ուղարկելը: Խնդրում ենք փոքր-ինչ համբերատար լինել:"</string>
<string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Ինտերակտիվ զեկույց"</string>
- <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Հիմնականում օգտագործեք այս տարբերակը: Այն ձեզ թույլ է տալիս հետևել զեկույցի ստեղծման գործընթացին, խնդրի մասին լրացուցիչ տեղեկություններ մուտքագրել և էկրանի պատկերներ կորզել: Կարող է բաց թողնել քիչ օգտագործվող որոշ բաժինները, որոնց ստեղծումը երկար է տևում:"</string>
+ <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Հիմնականում օգտագործեք այս տարբերակը: Այն ձեզ թույլ է տալիս հետևել զեկույցի ստեղծման գործընթացին, խնդրի մասին լրացուցիչ տեղեկություններ մուտքագրել և սքրինշոթներ ստեղծել: Կարող է բաց թողնել քիչ օգտագործվող որոշ բաժիններ, որոնց ստեղծումը երկար է տևում:"</string>
<string name="bugreport_option_full_title" msgid="6354382025840076439">"Ամբողջական զեկույց"</string>
<string name="bugreport_option_full_summary" msgid="7210859858969115745">"Օգտագործեք այս տարբերակը համակարգի միջամտությունը նվազեցնելու համար՝ երբ սարքը չի արձագանքում կամ շատ դանդաղ է աշխատում, կամ երբ ձեզ հարկավոր են զեկույցի բոլոր բաժինները: Թույլ չի տալիս լրացուցիչ տվյալներ մուտքագրել կամ էկրանի լրացուցիչ պատկերներ ստանալ:"</string>
<plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
- <item quantity="one">Վրիպակի զեկույցի համար էկրանի պատկերի լուսանկարումը կատարվելու է <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:</item>
- <item quantity="other">Վրիպակի զեկույցի համար էկրանի պատկերի լուսանկարումը կատարվելու է <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:</item>
+ <item quantity="one">Սքրինշոթը կարվի <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:</item>
+ <item quantity="other">Սքրինշոթը կարվի <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:</item>
</plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Անձայն ռեժիմ"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ձայնը անջատված է"</string>
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Ինքնաթիռի ռեժիմ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Ինքնաթիռի ռեժիմը միացված է"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Ինքնաթիռի ռեժիմը անջատված է"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Մարտկոցի տնտեսում"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Անջատել"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Միացնել"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Կարգավորումներ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Օգնական"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ձայնային օգնութ"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Տեղորոշում"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"տեղորոշել այս սարքը"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Թույլ տա՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին օգտագործել այս սարքի տեղադրության տվյալները:"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Տեղադրության տվյալները հավելվածին հասանելի կլինեն միայն, երբ այն օգտագործելիս լինեք:"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Միշտ թույլ տա՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-ին օգտագործել սարքի տեղադրությունը:"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Տեղադրության տվյալները հավելվածին միշտ հասանելի կլինեն, նույնիսկ եթե այն չեք օգտագործում:"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Օրացույց"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"օգտագործել օրացույցը"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Թույլ տա՞լ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին օգտագործել ձեր օրացույցը:"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Այս հավելվածը կարող է ավելացնել, հեռացնել կամ փոխել օրացույցի միջոցառումները ձեր հեռախոսում: Այս հավելվածը կարող է ուղարկել հաղորդագրություններ օրացույցի սեփականատերերի անունից կամ փոխել միջոցառումները առանց դրանց սեփականատերերին ծանուցելու:"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"օգտագործել տեղադրություն տրամադրող հավելվյալ հրամաններ"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Ծրագրին թույլ է տալիս օգտագործել տեղադրության մասին տվյալների աղբյուրների կառավարման լրացուցիչ հրահանգներ: Սա կարող է ծրագրին թույլ տալ միջամտել GPS-ի կամ տեղադրության մասին տվյալների այլ աղբյուրների գործառույթներին:"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"օգտագործել ճշգրիտ տեղադրությունը (GPS և ցանցային)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Այս հավելվածը կարող է ստանալ ձեր տեղադրության տվյալները GPS-ի միջոցով կամ տեղորոշման ցանցային աղբյուրներից, օրինակ՝ բջջային աշտարակներից և Wi-Fi ցանցերից: Այս տեղորոշման ծառայությունները պետք է միացված և հասանելի լինեն ձեր հեռախոսում, որպեսզի հավելվածը կարողանա օգտագործել դրանք: Դա կարող է արագացնել մարտկոցի լիցքի սպառումը:"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"Տեղադրության ճշգրիտ տվյալների հասանելիություն միայն ֆոնային ռեժիմում"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Հավելվածը կարող է ստանալ ձեր տեղադրության տվյալները ֆոնային ռեժիմում։ Այս տեղորոշման ծառայությունները պետք է միացված և հասանելի լինեն ձեր հեռախոսում, որպեսզի հավելվածը կարողանա օգտագործել դրանք: Սա կարող է արագացնել մարտկոցի լիցքի սպառումը:"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"օգտագործել մոտավոր տեղադրությունը (ցանցային)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Այս հավելվածը կարող է ստանալ ձեր տեղադրության տվյալները ցանցային տարբեր աղբյուրներից, օրինակ՝ բջջային աշտարակներից և Wi-Fi ցանցերից: Այս տեղորոշման ծառայությունները պետք է միացված և հասանելի լինեն ձեր պլանշետում, որպեսզի հավելվածը կարողանա օգտագործել դրանք:"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Այս հավելվածը կարող է ստանալ ձեր տեղադրության տվյալները ցանցային տարբեր աղբյուրներից, օրինակ՝ բջջային աշտարակներից և Wi-Fi ցանցերից: Այս տեղորոշման ծառայությունները պետք է միացված և հասանելի լինեն ձեր հեռուստացույցում, որպեսզի հավելվածը կարողանա օգտագործել դրանք:"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Այս հավելվածը կարող է ստանալ ձեր տեղադրության տվյալները ցանցային տարբեր աղբյուրներից, օրինակ՝ բջջային աշտարակներից և Wi-Fi ցանցերից: Այս տեղորոշման ծառայությունները պետք է միացված և հասանելի լինեն ձեր հեռախոսում, որպեսզի հավելվածը կարողանա օգտագործել դրանք:"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"Ֆոնային ռեժիմում տեղադրության տվյալների հասանելիություն"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Հավելվածը կարող է ստանալ ձեր տեղադրության տվյալները ֆոնային ռեժիմում։ Այս տեղորոշման ծառայությունները պետք է միացված և հասանելի լինեն ձեր հեռախոսում, որպեսզի հավելվածը կարողանա օգտագործել դրանք: Սա կարող է արագացնել մարտկոցի լիցքի սպառումը:"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"փոխել ձեր աուդիո կարգավորումները"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Թույլ է տալիս հավելվածին փոփոխել ձայնանյութի գլոբալ կարգավորումները, ինչպես օրինակ` ձայնը և թե որ խոսափողն է օգտագործված արտածման համար:"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ձայնագրել աուդիո ֆայլ"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Մատնահետքի պատկերակ"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"կառավարել դեմքի ճանաչման սարքը"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Հավելվածին թույլ է տալիս ավելացնել և հեռացնել դեմքի նմուշներ:"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"օգտագործել դեմքի ճանաչման սարքը"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Հավելվածին թույլ է տալիս օգտագործել նույնականացման համար նախատեսված սարքը"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Չհաջողվեց ճանաչել ձեր դեմքը: Նորից փորձեք:"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Դեմքը չափազանց վառ է երևում։ Թուլացրեք լույսը։"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Դեմքը չափազանց մուգ է երևում։ Ուժեղացրեք լույսը։"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Սարքը մի փոքր հեռացրեք դեմքից։"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Սարքը մի փոքր մոտեցրեք դեմքին։"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Սարքը մի փոքր վերև պահեք։"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Սարքը մի փոքր ներքև պահեք։"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Սարքը մի փոքր ձախ պահեք։"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Սարքը մի փոքր ձախ պահեք։"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Նայեք սարքի տեսախցիկին։"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Դեմք չի հայտնաբերվել։"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Պահեք սարքը դեմքի դիմաց։"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Դեմքի ճանաչման սարքն անհասանելի է։"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Ժամանակը սպառվել է: Նորից փորձեք:"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Դեմքը հնարավոր չէ պահել։"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Դեմքի ճանաչումը չեղարկվել է։"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Չափից շատ փորձեր եք կատարել: Փորձեք ավելի ուշ:"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Չափից շատ փորձեր եք կատարել: Դեմքի ճանաչման գործառույթն անջատվել է։"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Նորից փորձեք:"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Գրանցված դեմք չկա։"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Սարքը չունի դեմքի ճանաչման սկաներ"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Դեմք <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Դեմքի պատկերակ"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամեցման կարգավորումները"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Թույլ է տալիս հավելվածին կարդալ համաժամեցման կարգավորումները հաշվի համար: Օրինակ` այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամեցված է հաշվի հետ:"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"համաժամեցումը փոխարկել միացվածի և անջատվածի"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi ցանցում ինտերնետ կապ չկա"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Հպեք՝ ընտրանքները տեսնելու համար"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Փոփոխություններ թեժ կետի կարգավորումներում"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ձեր թեժ կետի հաճախականությունը փոխվել է։"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Սարքը չի կարող աշխատել միայն 5 ԳՀց հաճախականությամբ։ Այդ հաճախականությունը կօգտագործվի հնարավորության դեպքում։"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Անցել է <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ցանցի"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Երբ <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ցանցում ինտերնետ կապ չի լինում, սարքն անցնում է <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ցանցի: Նման դեպքում կարող են վճարներ գանձվել:"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ցանցից անցել է <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ցանցի"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Այս սարքի անսարքությունների վերացման նպատակով ձեր ադմինիստրատորին անհրաժեշտ է վրիպակի հաշվետվություն: Կարող են տրամադրվել տեղեկություններ հավելվածների մասին և այլ տվյալներ։"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ՏՐԱՄԱԴՐԵԼ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ՄԵՐԺԵԼ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Փոխել ստեղնաշարը"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Ընտրեք ներածման եղանակը"</string>
<string name="show_ime" msgid="2506087537466597099">"Պահել էկրանին, երբ ֆիզիկական ստեղնաշարն ակտիվ է"</string>
<string name="hardware" msgid="194658061510127999">"Ցույց տալ վիրտուալ ստեղնաշարը"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Կազմաձևեք ֆիզիկական ստեղնաշարը"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 6368a6c76cf5..05f6ba15099b 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mode pesawat"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mode pesawat AKTIF"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mode pesawat MATI"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Penghemat baterai"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Penghemat baterai NONAKTIF"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Penghemat baterai AKTIF"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Setelan"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Bantuan"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasi"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"mengakses lokasi perangkat ini"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses lokasi perangkat ini?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikasi ini hanya akan memiliki akses ke lokasi saat Anda sedang menggunakan aplikasi."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Selalu izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses lokasi perangkat ini?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikasi ini akan selalu memiliki akses ke lokasi, bahkan saat Anda sedang tidak menggunakan aplikasi."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"mengakses kalender"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Izinkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses kalender?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Aplikasi ini dapat menambahkan, menghapus, atau mengubah acara kalender di ponsel. Aplikasi ini dapat mengirim pesan yang kelihatannya berasal dari pemilik kalender, atau mengubah acara tanpa memberi tahu pemilik."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"akses perintah penyedia lokasi ekstra"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Memungkinkan aplikasi mengakses perintah penyedia lokasi ekstra. Tindakan ini memungkinkan aplikasi mengganggu pengoperasian GPS atau sumber lokasi lain."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"akses lokasi akurat (berbasis jaringan dan GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Aplikasi ini dapat memperoleh lokasi Anda berdasarkan sumber jaringan seperti menara seluler dan jaringan Wi-Fi. Layanan lokasi ini harus diaktifkan dan tersedia di ponsel agar aplikasi dapat menggunakannya. Dapat meningkatkan penggunaan baterai."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"akses lokasi pasti hanya saat di latar depan"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Aplikasi ini bisa mendapatkan lokasi pasti Anda ketika aplikasi berada di latar depan. Fitur layanan lokasi ini harus diaktifkan dan tersedia di ponsel agar dapat digunakan oleh aplikasi. Fitur ini dapat meningkatkan konsumsi baterai."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"akses perkiraan lokasi (berbasis jaringan)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Aplikasi ini dapat memperoleh lokasi Anda berdasarkan sumber jaringan seperti menara seluler dan jaringan Wi-Fi. Layanan lokasi ini harus diaktifkan dan tersedia di tablet agar aplikasi dapat menggunakannya."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Aplikasi ini dapat memperoleh lokasi Anda berdasarkan sumber jaringan seperti menara seluler dan jaringan Wi-Fi. Layanan lokasi ini harus diaktifkan dan tersedia di TV agar aplikasi dapat menggunakannya."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Aplikasi ini dapat memperoleh lokasi Anda berdasarkan sumber jaringan seperti menara seluler dan jaringan Wi-Fi. Layanan lokasi ini harus diaktifkan dan tersedia di ponsel agar aplikasi dapat menggunakannya."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"akses lokasi pasti saat di latar belakang"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Aplikasi ini bisa mendapatkan lokasi pasti Anda kapan pun aplikasi ada di latar belakang. Fitur layanan lokasi ini harus diaktifkan dan tersedia di ponsel agar dapat digunakan oleh aplikasi. Fitur ini dapat meningkatkan konsumsi baterai."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ubah setelan audio Anda"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Memungkinkan aplikasi mengubah setelan audio global, misalnya volume dan pengeras suara mana yang digunakan untuk keluaran."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"rekam audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon sidik jari"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"kelola hardware autentikasi wajah"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Mengizinkan apl memicu metode untuk menambah &amp; menghapus template wajah untuk digunakan."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gunakan hardware autentikasi wajah"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Mengizinkan aplikasi untuk menggunakan hardware autentikasi wajah untuk autentikasi"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Tidak dapat memproses wajah. Harap coba lagi."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Wajah terlalu cerah. Coba dengan cahaya lebih redup."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Wajah terlalu gelap. Buka sumber cahaya."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Jauhkan sensor dari wajah."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Dekatkan sensor ke wajah."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Naikkan sensor."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Turunkan sensor."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Gerakkan sensor ke kanan."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Gerakkan sensor ke kiri."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Lihat sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Tidak ada wajah yang terdeteksi"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Pastikan wajah tetap diam di depan perangkat."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware pemrosesan wajah tidak tersedia."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Waktu tunggu wajah habis. Harap coba lagi."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Wajah tidak dapat disimpan."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Pemrosesan wajah dibatalkan."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percobaan. Coba lagi nanti."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Terlalu sering dicoba. Autentikasi wajah dinonaktifkan."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Coba lagi."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Tidak ada wajah yang didaftarkan."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Perangkat ini tidak memiliki sensor autentikasi wajah"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> wajah"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikon wajah"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"baca setelan sinkron"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Memungkinkan aplikasi membaca setelan sinkronisasi untuk sebuah akun. Misalnya, izin ini dapat menentukan apakah aplikasi Orang disinkronkan dengan sebuah akun."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"nyalakan dan matikan sinkronisasi"</string>
@@ -584,14 +617,14 @@
<string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"Memantau banyaknya sandi salah yang diketikkan saat membuka kunci layar, dan mengunci tablet atau menghapus semua data pengguna ini jika terlalu banyak sandi salah diketikkan."</string>
<string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"Memantau banyaknya sandi salah yang diketikkan saat membuka kunci layar, dan mengunci TV atau menghapus semua data pengguna ini jika terlalu banyak sandi salah diketikkan."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"Memantau banyaknya sandi salah yang diketikkan saat membuka kunci layar, dan mengunci ponsel atau menghapus semua data pengguna ini jika terlalu banyak sandi salah diketikkan."</string>
- <string name="policylab_resetPassword" msgid="4934707632423915395">"Ubah kunci layar"</string>
+ <string name="policylab_resetPassword" msgid="4934707632423915395">"Mengubah kunci layar"</string>
<string name="policydesc_resetPassword" msgid="1278323891710619128">"Mengubah kunci layar."</string>
- <string name="policylab_forceLock" msgid="2274085384704248431">"Kunci layar"</string>
- <string name="policydesc_forceLock" msgid="1141797588403827138">"Kontrol cara dan kapan layar mengunci."</string>
- <string name="policylab_wipeData" msgid="3910545446758639713">"Hapus semua data"</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"Mengunci layar"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"Mengontrol cara dan kapan layar mengunci."</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"Menghapus semua data"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Hapus data tablet tanpa peringatan dengan menyetel ulang data pabrik."</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Menghapus data TV tanpa peringatan dengan mengembalikan ke setelan pabrik."</string>
- <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Hapus data ponsel tanpa peringatan dengan menyetel ulang data pabrik."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Menghapus data ponsel tanpa peringatan dengan melakukan reset ke setelan pabrik."</string>
<string name="policylab_wipeData_secondaryUser" msgid="8362863289455531813">"Menghapus data pengguna"</string>
<string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="6336255514635308054">"Menghapus data pengguna ini di tablet ini tanpa peringatan."</string>
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"Menghapus data pengguna ini di TV ini tanpa peringatan."</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tidak memiliki akses internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap untuk melihat opsi"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Perubahan pada setelan hotspot Anda"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pita hotspot Anda telah berubah."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Perangkat ini tidak mendukung preferensi Anda, yaitu hanya 5GHz. Sebagai gantinya, perangkat ini akan menggunakan pita frekuensi 5GHz jika tersedia."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Dialihkan ke <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Perangkat menggunakan <xliff:g id="NEW_NETWORK">%1$s</xliff:g> jika <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> tidak memiliki akses internet. Tarif mungkin berlaku."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Dialihkan dari <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ke <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Admin meminta laporan bug untuk membantu memecahkan masalah perangkat ini. Aplikasi dan data mungkin dibagikan."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"BAGIKAN"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"TOLAK"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Ubah keyboard"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Pilih metode masukan"</string>
<string name="show_ime" msgid="2506087537466597099">"Pertahankan di layar jika keyboard fisik masih aktif"</string>
<string name="hardware" msgid="194658061510127999">"Tampilkan keyboard virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Mengonfigurasi keyboard fisik"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 280ccd8552e6..a9152021f061 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flugstilling"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"KVEIKT er á flugstillingu"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"SLÖKKT er á flugstillingu"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Rafhlöðusparnaður"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Slökkt er á rafhlöðusparnaði"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Kveikt er á rafhlöðusparnaði"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Stillingar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Aðstoð"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Raddaðstoð"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Staðsetning"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"fá aðgang að staðsetningu þessa tækis"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Viltu veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að staðsetningu þessa tækis?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Forritið hefur aðeins aðgang að staðsetningunni á meðan þú notar forritið."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Viltu alltaf veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að staðsetningu þessa tækis?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Forritið hefur alltaf aðgang að staðsetningunni, jafnvel þegar þú ert ekki að nota forritið."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Dagatal"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"fá aðgang að dagatalinu þínu"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Viltu veita &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aðgang að dagatalinu þínu?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Þetta forrit getur bætt við, fjarlægt eða breytt dagatalsviðburðum í símanum. Þetta forrit getur sent skilaboð sem geta virst koma ffrá eigendum dagatala eða breytt viðburðum án þess að láta eigendurna vita."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"aðgangur að viðbótarskipunum staðsetningarveitu"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Leyfir forriti að fá aðgang að fleiri skipunum staðsetningarveitu. Þetta getur gert forritinu kleift að hafa áhrif á virkni GPS og annars staðsetningarbúnaðar."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"fá aðgang að nákvæmri staðsetningu (frá GPS og símkerfi)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Þetta forrit getur séð staðsetningu þína út frá netkerfum á borð við farsímasenda og Wi-Fi net. Það verður að vera kveikt á slíkri staðsetningarþjónustu og hún þarf að vera aðgengileg símanum til að forritið geti notað hana. Þetta getur aukið rafhlöðunotkun."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"aðgangur að nákvæmri staðsetningu aðeins í forgrunni"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Þetta forrit getur aðeins séð staðsetningu þína þegar það er í forgrunni. Það verður að vera kveikt á þessari staðsetningarþjónustu og hún þarf að vera aðgengileg í símanum til að forritið geti notað hana. Þetta getur aukið rafhlöðunotkun."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"fá aðgang að áætlaðri staðsetningu (frá símkerfi)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Þetta forrit getur séð staðsetningu þína út frá netkerfum á borð við farsímasenda og Wi-Fi net. Það verður að vera kveikt á slíkri staðsetningarþjónustu og hún þarf að vera aðgengileg spjaldtölvunni til að forritið geti notað hana."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Þetta forrit getur séð staðsetningu þína út frá netkerfum á borð við farsímasenda og Wi-Fi net. Það verður að vera kveikt á slíkri staðsetningarþjónustu og hún þarf að vera aðgengileg sjónvarpinu til að forritið geti notað hana."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Þetta forrit getur séð staðsetningu þína út frá netkerfum á borð við farsímasenda og Wi-Fi net. Það verður að vera kveikt á slíkri staðsetningarþjónustu og hún þarf að vera aðgengileg símanum til að forritið geti notað hana."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"aðgangur að nákvæmri staðsetningu í bakgrunni"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Þetta forrit getur séð nákvæma staðsetningu þína hvenær sem það er í bakgrunninum. Það verður að vera kveikt á þessari staðsetningarþjónustu og hún þarf að vera aðgengileg í símanum til að forritið geti notað hana. Þetta getur aukið rafhlöðunotkun."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"breyta hljóðstillingum"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Leyfir forriti að breyta altækum hljóðstillingum, s.s. hljóðstyrk og hvaða hátalari er notaður sem úttak."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"taka upp hljóð"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingrafaratákn"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"stjórna vélbúnaði andlitsgreiningar"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Leyfir forritinu að beita aðferðum til að bæta við og eyða andlitssniðmátum til notkunar."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"nota vélbúnað andlitsgreiningar"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Leyfir forritinu að nota andlitsgreiningarvélbúnað til auðkenningar"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Ekki tókst að vinna úr andlitinu. Reyndu aftur."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Andlitið er of bjart. Prófaðu í minni birtu."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Andlitið er of dökkt. Finndu betri lýsingu."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Færðu skynjarann lengra frá andlitinu."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Færðu skynjarann nær andlitinu."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Færðu skynjarann ofar."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Færðu skynjarann neðar."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Færðu skynjarann til hægri."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Færðu skynjarann til vinstri."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Horfðu á skynjarann."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Ekkert andlit fannst."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Haltu andlitinu kyrru fyrir framan tækið."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Andlitsvélbúnaður ekki til staðar."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Tímamörk runnu út fyrir andlit. Reyndu aftur."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Ekki tókst að geyma andlit."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Hætt við andlitsgreiningu."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Of margar tilraunir. Reyndu aftur síðar."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Of margar tilraunir. Slökkt á andlitsgreiningu."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Reyndu aftur."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Ekkert andlit skráð."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Þetta tæki er ekki með auðkenningarskynjara fyrir andlit"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Andlit <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Andlitstákn"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lesa samstillingar"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Leyfir forriti að lesa kosti samstillingar fyrir reikning. Þetta er til dæmis hægt að nota til að komast að því hvort forritið Fólk er samstillt við reikning."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"kveikja og slökkva á samstillingu"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi er ekki með tengingu við internetið"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ýttu til að sjá valkosti"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Breytingar á stillingum heits reits"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Tíðnisvið heita reitsins hefur breyst."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Þetta tæki styður ekki val þitt fyrir aðeins 5 GHz. Í staðinn mun þetta tæki nota 5 GHz tíðnisvið þegar það er í boði."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Skipt yfir á <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Tækið notar <xliff:g id="NEW_NETWORK">%1$s</xliff:g> þegar <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> er ekki með internetaðgang. Gjöld kunna að eiga við."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Skipt úr <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> yfir í <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Kerfisstjórinn þinn óskaði eftir villutilkynningu til að auðvelda úrræðaleit á þessu tæki. Forritum og gögnum verður hugsanlega deilt."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DEILA"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"HAFNA"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Skipta um lyklaborð"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Veldu innsláttaraðferð"</string>
<string name="show_ime" msgid="2506087537466597099">"Haltu því á skjánum meðan vélbúnaðarlyklaborðið er virkt"</string>
<string name="hardware" msgid="194658061510127999">"Sýna sýndarlyklaborð"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Stilla vélbúnaðarlyklaborð"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 6eab08bc4518..445f3a70d749 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modalità aereo"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modalità aereo attiva"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modalità aereo non attiva"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Risparmio energetico"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Risparmio energetico disattivato"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Risparmio energetico attivo"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Impostazioni"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistenza"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -272,31 +269,34 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Passa a profilo di lavoro"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accedere ai contatti"</string>
- <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai tuoi contatti?"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai tuoi contatti?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Geolocalizzazione"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"accedere alla posizione di questo dispositivo"</string>
- <string name="permgrouprequest_location" msgid="3788275734953323491">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla posizione di questo dispositivo?"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla posizione di questo dispositivo?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"L\'app avrà accesso alla posizione soltanto quando la usi."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vuoi consentire sempre a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla posizione di questo dispositivo?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"L\'app avrà sempre accesso alla posizione, anche quando non la usi."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"accedere al calendario"</string>
- <string name="permgrouprequest_calendar" msgid="289900767793189421">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere al tuo calendario?"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere al tuo calendario?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"inviare e visualizzare SMS"</string>
- <string name="permgrouprequest_sms" msgid="7168124215838204719">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di inviare e visualizzare SMS?"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di inviare e visualizzare SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Archiviazione"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"accedere a foto, contenuti multimediali e file sul dispositivo"</string>
<string name="permgrouprequest_storage" msgid="7885942926944299560">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere a foto, contenuti multimediali e file memorizzati sul dispositivo?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfono"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"registrare audio"</string>
- <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di registrare audio?"</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di registrare audio?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotocamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"scattare foto e registrare video"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di scattare foto e registrare video?"</string>
<string name="permgrouplab_calllog" msgid="8798646184930388160">"Registri chiamate"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"leggere e scrivere il registro chiamate del telefono"</string>
- <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai registri chiamate del tuo telefono?"</string>
+ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai registri chiamate del tuo telefono?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"eseguire e gestire le telefonate"</string>
- <string name="permgrouprequest_phone" msgid="9166979577750581037">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di effettuare e gestire telefonate?"</string>
+ <string name="permgrouprequest_phone" msgid="9166979577750581037">"Consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di effettuare e gestire telefonate?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Sensori per il corpo"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
<string name="permgrouprequest_sensors" msgid="6349806962814556786">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai dati dei sensori relativi ai parametri vitali?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Questa app può aggiungere, rimuovere o modificare eventi di calendario sul telefono. Può inviare messaggi che possono sembrare inviati dai proprietari del calendario o modificare eventi senza notificare i proprietari."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accesso a comandi aggiuntivi provider di geolocalizz."</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Consente all\'app di accedere a ulteriori comandi del fornitore di posizione. Ciò potrebbe consentire all\'app di interferire con il funzionamento del GPS o di altre fonti di geolocalizzazione."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"accesso alla posizione esatta (basata su GPS e rete)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Questa app può accedere alla tua posizione tramite fonti di rete come antenne di telefonia mobile e reti Wi-Fi. Tali servizi di geolocalizzazione devono essere attivati e disponibili sul telefono per consentire all\'app di utilizzarli. Ciò può aumentare il consumo di batteria."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"Accesso alla posizione esatta solo in primo piano"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Questa app può recuperare la tua posizione esatta solo quando è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul telefono affinché l\'app possa usarli. Potrebbe aumentare il consumo della batteria."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"accesso alla posizione approssimativa (basata sulla rete)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Questa app può accedere alla tua posizione tramite fonti di rete come antenne di telefonia mobile e reti Wi-Fi. Tali servizi di geolocalizzazione devono essere attivati e disponibili sul tablet per consentire all\'app di utilizzarli."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Questa app può accedere alla tua posizione tramite fonti di rete come antenne di telefonia mobile e reti Wi-Fi. Tali servizi di geolocalizzazione devono essere attivati e disponibili sulla TV per consentire all\'app di utilizzarli."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Questa app può accedere alla tua posizione tramite fonti di rete come antenne di telefonia mobile e reti Wi-Fi. Tali servizi di geolocalizzazione devono essere attivati e disponibili sul telefono per consentire all\'app di utilizzarli."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"Accesso alla posizione esatta in background"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Questa app può recuperare la tua posizione esatta quando è in background. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul telefono affinché l\'app possa usarli. Potrebbe aumentare il consumo della batteria."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifica impostazioni audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Consente all\'applicazione di modificare le impostazioni audio globali, come il volume e quale altoparlante viene utilizzato per l\'uscita."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"registrare audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona dell\'impronta digitale"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"gestisci l\'hardware per l\'autenticazione dei volti"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilizza l\'hardware per l\'autenticazione dei volti"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Consente all\'app di utilizzare hardware per l\'autenticazione dei volti"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Impossibile elaborare il volto. Riprova."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Volto troppo luminoso. Prova dove c\'è meno luce."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Volto troppo scuro. Non coprire la fonte di luce."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Allontana il sensore dal volto."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Avvicina il sensore al volto."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Sposta il sensore verso l\'alto."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Sposta il sensore verso il basso."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Sposta il sensore verso destra."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Sposta il sensore verso sinistra."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Guarda il sensore."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nessun volto rilevato."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Tieni il volto fermo davanti al dispositivo."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware per il volto non disponibile."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Timeout operazione associata al volto. Riprova."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Il volto non può essere memorizzato."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Operazione associata al volto annullata."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Troppi tentativi. Riprova più tardi."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Troppi tentativi. Autenticazione disattivata."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Riprova."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nessun volto registrato."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Nessun sensore di autenticazione del volto sul dispositivo."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Volto <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Icona volto"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lettura impostazioni di sincronizz."</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Consente all\'applicazione di leggere le impostazioni di sincronizzazione per un account. Ad esempio, questa autorizzazione può determinare se l\'applicazione Persone è sincronizzata con un account."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"attivazione e disattivazione della sincronizzazione"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"La rete Wi-Fi non ha accesso a Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tocca per le opzioni"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Modifiche alle tue impostazioni dell\'hotspot"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"La tua banda di hotspot è cambiata."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Questo dispositivo non supporta la tua preferenza esclusiva per 5 GHz. Utilizzerà invece la banda a 5 GHz solo quando è disponibile."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Passato a <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Il dispositivo utilizza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> non ha accesso a Internet. Potrebbero essere applicati costi."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Passato da <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"L\'amministratore ha richiesto una segnalazione di bug per poter risolvere più facilmente i problemi di questo dispositivo. Potrebbero essere condivisi dati e app."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"CONDIVIDI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RIFIUTO"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Cambia tastiera"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Scegli il metodo di immissione"</string>
<string name="show_ime" msgid="2506087537466597099">"Tieni sullo schermo quando è attiva la tastiera fisica"</string>
<string name="hardware" msgid="194658061510127999">"Mostra tastiera virtuale"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configura la tastiera fisica"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 0dd931839e8e..0c0e0aba193c 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"מצב טיסה"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"מצב טיסה מופעל"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"מצב טיסה כבוי"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"חיסכון בסוללה"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"תכונת החיסכון בסוללה כבויה"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"תכונת החיסכון בסוללה פועלת"</string>
<string name="global_action_settings" msgid="1756531602592545966">"הגדרות"</string>
<string name="global_action_assist" msgid="3892832961594295030">"סיוע"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -282,6 +279,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"מיקום"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"גישה אל מיקום המכשיר הזה"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה למיקום המכשיר?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"לאפליקציה תהיה גישה אל נתוני המיקום רק במהלך השימוש באפליקציה."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"‏תמיד לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה למיקום המכשיר?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"לאפליקציה תמיד תהיה גישה לנתוני המיקום, גם כשהאפליקציה אינה בשימוש."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"יומן"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"גישה אל היומן"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"‏לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; הרשאת גישה ליומן?"</string>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"אפליקציה זו יכולה להוסיף, להסיר ולשנות אירועי יומן בטלפון. האפליקציה יכולה לשנות אירועים בלי להודיע לבעליהם ולשלוח הודעות שעשויות להיראות כאילו נשלחו מבעלי יומנים."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"גישה לפקודות ספק מיקום נוספות"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"‏מאפשרת לאפליקציה לגשת לפקודות נוספות של ספק המיקום. הרשאה זו עשויה לאפשר לאפליקציה לשבש את פעולת ה-GPS או מקורות מיקום אחרים."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"‏גישה אל מיקום מדויק (מבוסס GPS ורשת)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"‏אפליקציה זו יכולה לזהות את המיקום שלך על סמך GPS או מקורות מיקום ברשת, כגון אנטנות סלולריות ורשתות Wi-Fi. שירותי מיקום אלה חייבים להיות מופעלים וזמינים בטלפון שלך כדי שהאפליקציה תוכל להשתמש בהם. ייתכן שהדבר יגביר את צריכת הסוללה."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"קבלת גישה למיקום מדויק בחזית בלבד"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"אפליקציה זו יכולה לזהות את המיקום המדויק שלך רק כאשר היא פועלת בחזית. כדי שהאפליקציה תוכל להשתמש בשירותי המיקום, עליהם להיות מופעלים וזמינים בטלפון. ייתכן שפעולה זו תגביר את צריכת הסוללה."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"גישה אל מיקום משוער (מבוסס רשת)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"‏אפליקציה זו יכולה לזהות את המיקום שלך על סמך מקורות מיקום ברשת, כגון אנטנות סלולריות ורשתות Wi-Fi. שירותי מיקום אלה חייבים להיות מופעלים וזמינים בטאבלט שלך כדי שהאפליקציה תוכל להשתמש בהם."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"‏אפליקציה זו יכולה לזהות את המיקום שלך על סמך מקורות מיקום ברשת, כגון אנטנות סלולריות ורשתות Wi-Fi. שירותי מיקום אלה חייבים להיות מופעלים וזמינים בטלוויזיה שלך כדי שהאפליקציה תוכל להשתמש בהם."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"‏אפליקציה זו יכולה לזהות את המיקום שלך על סמך מקורות מיקום ברשת, כגון אנטנות סלולריות ורשתות Wi-Fi. שירותי מיקום אלה חייבים להיות מופעלים וזמינים בטלפון שלך כדי שהאפליקציה תוכל להשתמש בהם."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"קבלת גישה למיקום מדויק ברקע"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"אפליקציה זו יכולה לזהות את המיקום המדויק שלך בכל זמן שהיא פועלת ברקע. כדי שהאפליקציה תוכל להשתמש בשירותי המיקום, עליהם להיות מופעלים וזמינים בטלפון. ייתכן שפעולה זו תגביר את צריכת הסוללה."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"שנה את הגדרות האודיו שלך"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"מאפשר לאפליקציה לשנות הגדרות אודיו גלובליות כמו עוצמת קול ובחירת הרמקול המשמש לפלט."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"הקלט אודיו"</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"סמל טביעת אצבע"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"ניהול של חומרה של זיהוי פנים לצורך אימות"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"שימוש בחומרה של זיהוי פנים לצורך אימות"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"מאפשרת לאפליקציה להשתמש בחומרה של זיהוי פנים לצורך אימות"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"לא ניתן היה לעבד את הפנים. יש לנסות שוב."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"הפנים בהירים מדי. יש לנסות באור עמום יותר."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"הפנים כהים מדי. יש להוסיף מקור אור."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"יש להרחיק את החיישן מהפנים."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"יש לקרב את החיישן לפנים."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"יש להזיז את החיישן גבוה יותר."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"יש להזיז את החיישן נמוך יותר."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"יש להזיז את החיישן ימינה."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"יש להזיז את החיישן שמאלה."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"יש להסתכל על החיישן."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"לא זוהו פנים."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"יש להחזיק את הפנים באופן יציב מול המכשיר."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"החומרה לזיהוי הפנים לא זמינה."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"חלף הזמן הקצוב לזיהוי הפנים. יש לנסות שוב."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"לא ניתן לשמור את הפנים."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"פעולת הפנים בוטלה."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"יותר מדי ניסיונות. אימות הפנים הושבת."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"יש לנסות שוב."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"לא נרשמו פנים."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"במכשיר זה אין חיישן לאימות פנים"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"פנים <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"סמל הפנים"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"קרא את הגדרות הסינכרון"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"מאפשר לאפליקציה לקרוא את הגדרות הסנכרון של חשבון. לדוגמה, ניתן לגלות כך האם האפליקציה \'אנשים\' מסונכרן עם חשבון כלשהו."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"הפעלת וכיבוי סנכרון"</string>
@@ -1084,7 +1117,7 @@
<string name="capital_on" msgid="1544682755514494298">"מופעל"</string>
<string name="capital_off" msgid="6815870386972805832">"כבוי"</string>
<string name="whichApplication" msgid="4533185947064773386">"השלמת פעולה באמצעות"</string>
- <string name="whichApplicationNamed" msgid="8260158865936942783">"‏השלם את הפעולה באמצעות %1$s"</string>
+ <string name="whichApplicationNamed" msgid="8260158865936942783">"‏להשלמת הפעולה באמצעות %1$s"</string>
<string name="whichApplicationLabel" msgid="7425855495383818784">"השלם פעולה"</string>
<string name="whichViewApplication" msgid="3272778576700572102">"פתח באמצעות"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"‏פתח באמצעות %1$s"</string>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"‏לרשת ה-Wi-Fi אין גישה לאינטרנט"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"הקש לקבלת אפשרויות"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"שינויים להגדרות של הנקודה לשיתוף אינטרנט"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"התדר של הנקודה לשיתוף אינטרנט השתנה."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"‏מכשיר זה לא תומך בהעדפות שלך ל-5GHz בלבד. במקום זאת, מכשיר זה ישתמש בתדר 5GHz כשיהיה זמין."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"מעבר אל <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"המכשיר משתמש ברשת <xliff:g id="NEW_NETWORK">%1$s</xliff:g> כשלרשת <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> אין גישה לאינטרנט. עשויים לחול חיובים."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"עבר מרשת <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> לרשת <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"מנהל המערכת ביקש דוח על באג כדי לסייע בפתרון בעיות במכשיר זה. ייתכן שאפליקציות ונתונים ישותפו."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"שתף"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"לא, אין מצב"</string>
- <string name="select_input_method" msgid="8547250819326693584">"שינוי מקלדת"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"בחר שיטת הזנה"</string>
<string name="show_ime" msgid="2506087537466597099">"להשאיר במסך בזמן שהמקלדת הפיזית פעילה"</string>
<string name="hardware" msgid="194658061510127999">"הצג מקלדת וירטואלית"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"הגדרת מקלדת פיזית"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index efee85f830a7..00d1b5dca4f1 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"機内モード"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"機内モードON"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"機内モードOFF"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"バッテリー セーバー"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"バッテリー セーバー OFF"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"バッテリー セーバー ON"</string>
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"サポート"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"音声アシスト"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"位置情報"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"この端末の位置情報へのアクセス"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"この端末の位置情報へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"このアプリは、使用時のみ、位置情報にアクセスできるようになります。"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"この端末の位置情報へのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に常に許可しますか?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"このアプリは、未使用時も含め、常に位置情報にアクセスできるようになります。"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"カレンダー"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"カレンダーへのアクセス"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"カレンダーへのアクセスを &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可しますか?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"このアプリは、お使いのスマートフォンでカレンダーの予定を追加、削除、変更できます。また、カレンダーの所有者から発信されたかのように表示されるメッセージを送信したり、所有者に通知することなく予定を変更したりできます。"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"位置情報提供者の追加コマンドアクセス"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"位置情報提供元の追加のコマンドにアクセスすることをアプリに許可します。許可すると、アプリがGPSなどの位置情報源の動作を妨害する恐れがあります。"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"正確な位置情報(GPSとネットワーク基地局)へのアクセス"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"このアプリは、ネットワーク位置情報源(携帯基地局や Wi-Fi ネットワークなど)に基づいて、ユーザーの位置情報を取得します。これらの位置情報サービスは ON の状態にして、スマートフォンでアプリがサービスを利用できるようにする必要があります。これにより電池の消費量が増える可能性があります。"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"フォアグラウンドでのみ正確な位置情報にアクセス"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"このアプリは、フォアグラウンド状態でのみユーザーの正確な位置情報を取得できます。この位置情報サービスは ON の状態にして、スマートフォンでアプリがサービスを利用できるようにする必要があります。これにより、電池の消費量が増える可能性があります。"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"おおよその位置情報(ネットワーク基地局)へのアクセス"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"このアプリは、ネットワーク位置情報源(携帯基地局や Wi-Fi ネットワークなど)に基づいて、ユーザーの位置情報を取得します。これらの位置情報サービスは ON の状態にして、タブレットでアプリがサービスを利用できるようにする必要があります。"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"このアプリは、ネットワーク位置情報源(携帯基地局や Wi-Fi ネットワークなど)に基づいて、ユーザーの位置情報を取得します。これらの位置情報サービスは ON の状態にして、テレビでアプリがサービスを利用できるようにする必要があります。"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"このアプリは、ネットワーク位置情報源(携帯基地局や Wi-Fi ネットワークなど)に基づいて、ユーザーの位置情報を取得します。これらの位置情報サービスは ON の状態にして、スマートフォンでアプリがサービスを利用できるようにする必要があります。"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"バックグラウンドで正確な位置情報にアクセス"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"このアプリは、バックグラウンド状態でも常にユーザーの正確な位置情報を取得できます。この位置情報サービスは ON の状態にして、スマートフォンでアプリがサービスを利用できるようにする必要があります。これにより、電池の消費量が増える可能性があります。"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"音声設定の変更"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"音声全般の設定(音量、出力に使用するスピーカーなど)の変更をアプリに許可します。"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"録音"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋アイコン"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"顔認証ハードウェアの管理"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"顔認証ハードウェアの使用"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"顔認証ハードウェアを認証に使用することをアプリに許可します"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"顔を認識できませんでした。もう一度お試しください。"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"顔が明るすぎます。照明を暗くしてみてください。"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"顔が暗すぎます。光源のカバーを外してください。"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"センサーを顔から遠ざけてください。"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"センサーを顔に近づけてください。"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"センサーを上に動かしてください。"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"センサーを下に動かしてください。"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"センサーを右に動かしてください。"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"センサーを左に動かしてください。"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"センサーを見てください。"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"顔を検出できません。"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"端末の前で顔を静止してください。"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"顔認証ハードウェアが使用できません。"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"読み取りのタイムアウトです。もう一度お試しください。"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"顔の情報を保存できません。"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"顔の操作をキャンセルしました。"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"試行回数の上限です。後でもう一度お試しください。"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"試行回数の上限です。顔認証は無効になりました。"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"もう一度お試しください。"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"顔の情報が登録されていません。"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"この端末には顔認証センサーがありません"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"顔 <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"顔アイコン"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"同期設定の読み取り"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"アカウントの同期設定の読み取りをアプリに許可します。たとえば、連絡帳アプリがアカウントと同期しているかどうかをアプリから特定できるようになります。"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"同期のON/OFFの切り替え"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi はインターネットに接続していません"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"タップしてその他のオプションを表示"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"アクセス ポイントの設定の変更"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"アクセス ポイントの帯域幅が変更されました。"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"この端末は 5 GHz のみという設定に対応していません。ただし、5 GHz 周波数帯が利用できるときには利用します。"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"「<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>」に切り替えました"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"端末で「<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>」によるインターネット接続ができない場合に「<xliff:g id="NEW_NETWORK">%1$s</xliff:g>」を使用します。通信料が発生することがあります。"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"「<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>」から「<xliff:g id="NEW_NETWORK">%2$s</xliff:g>」に切り替えました"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"管理者からこの端末のトラブルシューティングに役立てるためバグレポートを共有するようリクエストがありました。アプリやデータが共有される場合があります。"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"共有する"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"共有しない"</string>
- <string name="select_input_method" msgid="8547250819326693584">"キーボードの変更"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"入力方法の選択"</string>
<string name="show_ime" msgid="2506087537466597099">"物理キーボードが有効になっている間は、画面に表示されます"</string>
<string name="hardware" msgid="194658061510127999">"仮想キーボードの表示"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"物理キーボードの設定"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index e6f4839b4b0d..ab65348dfb75 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"თვითმფრინავის რეჟიმი"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"თვითმფრინავის რეჟიმი ჩართულია."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"თვითმფრინავის რეჟიმი გამორთულია."</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ბატარეის დამზოგი"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ბატარეის დამზოგი გამორთულია"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ბატარეის დამზოგი ჩართულია"</string>
<string name="global_action_settings" msgid="1756531602592545966">"პარამეტრები"</string>
<string name="global_action_assist" msgid="3892832961594295030">"დახმარება"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ხმოვანი ასისტ."</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"მდებარეობა"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"მოწყობილობის მდებარეობაზე წვდომა"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; ამ მოწყობილობის მდებარეობაზე წვდომის ნებართვა?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ამ აპს მდებარეობაზე წვდომა მხოლოდ მაშინ ექნება, როცა თქვენ მას გამოიყენებთ."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; ამ მოწყობილობის მდებარეობაზე წვდომის ნებართვა?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ამ აპს ყოველთვის ექნება მდებარეობაზე წვდომა, მაშინაც კი, როცა თქვენ მას არ იყენებთ."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"კალენდარი"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"თქვენს კალენდარზე წვდომა"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"გსურთ, მიანიჭოთ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>-ს&lt;/b&gt; თქვენს კალენდარზე წვდომის ნებართვა?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ამ აპს შეუძლია თქვენს ტელეფონში კალენდრის მოვლენების დამატება, ამოშლა ან შეცვლა. ამ აპს შეუძლია კალენდრების მფლობელების სახელით შეტყობინებების გაგზავნა ან მოვლენების მათი მფლობელების შეტყობინების გარეშე შეცვლა."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"მდებარეობის პროვაიდერის დამატებით ბრძანებებზე წვდომა"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"აპს შეეძლება წვდომა ჰქონდეს მდებარეობის სერვისის დამატებით ბრძანებებზე. შესაძლოა აპმა ეს გამოიყენოს GPS-ისა და მდებარეობის სხვა წყაროების მუშაობის პროცესში ჩარევისთვის."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"ზუსტ მდებარეობაზე წვდომა (GPS-ისა და ქსელის მეშვეობით)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ამ აპს თქვენი მდებარეობის შესახებ ინფორმაციის მიღება GPS-ის ან ქსელის მდებარეობის ისეთი წყაროების მიხედვით შეუძლია, როგორიცაა მობილური კავშირგაბმულობის ანძები და Wi-Fi ქსელები. მდებარეობის აღნიშნული სერვისები თქვენს ტელეფონზე ჩართული და ხელმისაწვდომი უნდა იყოს, რათა აპმა მათი გამოყენება შეძლოს. ამან შეიძლება ბატარეის მოხმარება გაზარდოს."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"ზუსტ მდებარეობაზე წვდომა მხოლოდ წინა პლანზე"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"ამ აპს შეუძლია თქვენი ზუსტი მდებარეობის შესახებ ინფორმაციის მიღება მხოლოდ მაშინ, როცა გაშვებულია წინა პლანზე. თქვენს ტელეფონზე ჩართული და ხელმისაწვდომი უნდა იყოს მდებარეობის სერვისები, აპმა მათი გამოყენება რომ შეძლოს. ამან შეიძლება გაზარდოს ბატარეის მოხმარება."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"მიახლოებით მდებარეობაზე წვდომა (ქსელის მეშვეობით)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ამ აპს თქვენი მდებარეობის შესახებ ინფორმაციის მიღება ისეთი წყაროების მეშვეობით შეუძლია, როგორიცაა მობილური კავშირგაბმულობის ანძები და Wi-Fi ქსელები. მდებარეობის აღნიშნული სერვისები თქვენს ტაბლეტზე ჩართული და ხელმისაწვდომი უნდა იყოს, რათა აპმა მათი გამოყენება შეძლოს."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ამ აპს თქვენი მდებარეობის შესახებ ინფორმაციის მიღება ისეთი წყაროების მეშვეობით შეუძლია, როგორიცაა მობილური კავშირგაბმულობის ანძები და Wi-Fi ქსელები. მდებარეობის აღნიშნული სერვისები თქვენს ტელევიზორზე ჩართული და ხელმისაწვდომი უნდა იყოს, რათა აპმა მათი გამოყენება შეძლოს."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ამ აპს თქვენი მდებარეობის შესახებ ინფორმაციის მიღება ისეთი წყაროების მეშვეობით შეუძლია, როგორიცაა მობილური კავშირგაბმულობის ანძები და Wi-Fi ქსელები. მდებარეობის აღნიშნული სერვისები თქვენს ტელეფონზე ჩართული და ხელმისაწვდომი უნდა იყოს, რათა აპმა მათი გამოყენება შეძლოს."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"ზუსტ მდებარეობაზე წვდომა ფონურ რეჟიმში"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"ამ აპს შეუძლია თქვენი ზუსტი მდებარეობის შესახებ ინფორმაციის მიღება ყოველთვის, როცა გაშვებულია ფონურ რეჟიმში. თქვენს ტელეფონზე ჩართული და ხელმისაწვდომი უნდა იყოს მდებარეობის სერვისები, აპმა მათი გამოყენება რომ შეძლოს. ამან შეიძლება გაზარდოს ბატარეის მოხმარება."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"თქვენი აუდიო პარამეტრების შეცვლა"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"აპს შეეძლება აუდიოს გლობალური პარამეტრების შეცვლა. მაგ.: ხმის სიმაღლე და რომელი დინამიკი გამოიყენება სიგნალის გამოსტანად."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"აუდიოს ჩაწერა"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"თითის ანაბეჭდის ხატულა"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"სახის ამოცნობის აპარატურის მართვა"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"საშუალებას აძლევს აპს, დაამატოს და წაშალოს სახეების შაბლონები."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"სახის ამოცნობის აპარატურის გამოყენება"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"საშუალებას აძლევს აპს, ავტორიზაციისთვის გამოიყენოს სახის ამოცნობის აპარატურა"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"სახე ვერ მუშავდება. გთხოვთ, ცადოთ ხელახლა."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"სახე გადანათებულია. დაუკელით განათებას."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"სახე ჩაბნელებულია. მოუმატეთ განათებას."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"დააშორეთ მოწყობილობის სენსორი სახეს."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"მიუახლოვეთ მოწყობილობის სენსორი სახეს."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"ასწიეთ მოწყობილობის სენსორი ოდნავ ზემოთ."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"ჩასწიეთ მოწყობილობის სენსორი ოდნავ ქვემოთ."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"გასწიეთ მოწყობილობის სენსორი ოდნავ მარჯვნივ."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"გასწიეთ მოწყობილობის სენსორი ოდნავ მარცხნივ."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"შეხედეთ სენსორს."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"სახის ამოცნობა ვერ მოხერხდა."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"მოათავსეთ სახე მოწყობილობის წინ უმოძრაოდ."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"სახის ამოცნობის აპარატურა მიუწვდომელია."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"სახის ამოცნობის დრო ამოიწურა. ცადეთ ხელახლა."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"სახის შენახვა ვერ მოხერხდა."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"სახის ამოცნობა გაუქმდა."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"დაფიქსირდა ბევრი მცდელობა. სახის ამოცნობა გაითიშა."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"ცადეთ ხელახლა."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"სახე რეგისტრირებული არ არის."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ამ მოწყობილობას არ აქვს სახის ამოცნობის სენსორი"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"სახე <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"სახის ხატულა"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"სინქრონიზაციის პარამეტრების წაკითხვა"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"აპს შეეძლება, წაიკითხოს ანგარიშის სინქრონიზაციის პარამეტრები. მაგალითად, მას შეეძლება განსაზღვროს, არის თუ არა People აპი სინქრონიზებული ანგარიშთან."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"სინქრონიზაციის ჩართვა და გამორთვა"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi‑Fi ქსელს ინტერნეტზე წვდომა არ აქვს"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"შეეხეთ ვარიანტების სანახავად"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"თქვენი უსადენო ქსელის პარამეტრების ცვლილება"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"თქვენი უსადენო ქსელის დიაპაზონი შეიცვალა."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ამ მოწყობილობას არ შეუძლია მხოლოდ 5 გჰც სიხშირეზე მუშაობა. აღნიშნული სიხშირის გამოყენება მოხდება მაშინ, როცა ეს შესაძლებელია."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"ახლა გამოიყენება <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"თუ <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ინტერნეტთან კავშირს დაკარგავს, მოწყობილობის მიერ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> იქნება გამოყენებული, რამაც შეიძლება დამატებითი ხარჯები გამოიწვიოს."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"ახლა გამოიყენება <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> (გამოიყენებოდა <xliff:g id="NEW_NETWORK">%2$s</xliff:g>)"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ამ მოწყობილობის პრობლემების აღმოფხვრაში დასახმარებლად, თქვენი ადმინისტრატორი ხარვეზის შესახებ ანგარიშს ითხოვს, რა დროსაც შეიძლება გაზიარდეს აპები და მონაცემები."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"გაზიარება"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"უარყოფა"</string>
- <string name="select_input_method" msgid="8547250819326693584">"კლავიატურის შეცვლა"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"აირჩიეთ შეყვანის მეთოდი"</string>
<string name="show_ime" msgid="2506087537466597099">"აქტიური ფიზიკური კლავიატურისას ეკრანზე შენარჩუნება"</string>
<string name="hardware" msgid="194658061510127999">"ვირტუალური კლავიატურის ჩვენება"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"მოახდინეთ ფიზიკური კლავიატურის კონფიგურაცია"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 5e8eb20f2f6b..3d4749feba0d 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Ұшақ режимі"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Ұшақ режимі ҚОСУЛЫ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Ұшақ режимі ӨШІРУЛІ"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Battery saver"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Battery saver ӨШІРУЛІ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Battery saver ҚОСУЛЫ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Параметрлер"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Көмек"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Дауыс көмекшісі"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Орналасу"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"бұл құрылғының орналасқан жерін көру"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына құрылғының орналасқан жері туралы мәліметтерді пайдалануға рұқсат берілсін бе?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Қолданбаны пайдалану кезінде ғана оған геодеректеріңізді көруге рұқсат етіледі."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" кез келген уақытта құрылғы геодеректерін пайдалансын ба?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Қолданба пайдаланылмаса да, оған геодеректеріңізді көруге рұқсат етіледі."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Күнтізбе"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"күнтізбеге кіру"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасына күнтізбеге кіруге рұқсат берілсін бе?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Бұл қолданба телефондағы күнтізбе оқиғаларын енгізе, өшіре не өзгерте алады. Ол күнтізбе иелерінен келгендей болып көрінетін хабарларды жіберуі немесе иелеріне хабарламай, оқиғаларды өзгертуі мүмкін."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"қосымша аймақ жабдықтаушы пәрмендеріне қол жетімділік"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Қолданбаға орын жеткізушісінің қосымша пәрмендеріне қатынасуға рұқсат береді. Бұл қолданбаға GPS немесе басқа орын көздерінің жұмысына кедергі келтіруге рұқсат беруі мүмкін."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"дәл орынға қатынасу (GPS және желіге негізделген)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Бұл қолданба орналасқан жеріңізді GPS немесе желіні анықтау көздерінің (мысалы, ұялы байланыс мұнаралары мен Wi-Fi желілері) негізінде анықтайды. Қолданба бұл орынды анықтау қызметтерін пайдалана алуы үшін олар қосулы әрі телефонда қолжетімді болуы керек. Батарея көбірек тұтынылуы мүмкін."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"нақты орналасқан жер туралы ақпаратқа тек ашық экранда кіру"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Бұл қолданба нақты орналасқан жеріңіз туралы ақпаратты экранда ашық тұрғанда ғана анықтай алады. Қолданба бұл орынды анықтау қызметтерін пайдалана алуы үшін, олар қосулы әрі телефонда қолжетімді болуы керек. Батарея көбірек тұтынылуы мүмкін."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"шамамен алған орынға қатынасу (желі негізінде)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Бұл қолданба орналасқан жеріңізді ұялы байланыс мұнаралары мен Wi-Fi желілері сияқты желі көздерінің негізінде анықтайды. Қолданба бұл орынды анықтау қызметтерін пайдалана алуы үшін олар қосулы әрі планшетте қолжетімді болуы керек."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Бұл қолданба орналасқан жеріңізді ұялы байланыс мұнаралары мен Wi-Fi желілері сияқты желі көздерінің негізінде анықтайды. Қолданба бұл орынды анықтау қызметтерін пайдалана алуы үшін олар қосулы әрі теледидарда қолжетімді болуы керек."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Бұл қолданба орналасқан жеріңізді ұялы байланыс мұнаралары мен Wi-Fi желілері сияқты желі көздерінің негізінде анықтайды. Қолданба бұл орынды анықтау қызметтерін пайдалана алуы үшін олар қосулы әрі телефонда қолжетімді болуы керек."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"геодеректерге фондық режимде кіру"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Бұл қолданба нақты орналасқан жеріңіз туралы ақпаратты фондық режимде де анықтай алады. Қолданба бұл орынды анықтау қызметтерін пайдалана алуы үшін, олар қосулы әрі телефонда қолжетімді болуы керек. Батарея көбірек тұтынылуы мүмкін."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"аудио параметрлерін өзгерту"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Қолданбаға дыбыс қаттылығы және аудио шығыс үндеткішін таңдау сияқты жаһандық аудио параметрлерін өзгерту мүмкіндігін береді."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"аудио жазу"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Саусақ ізі белгішесі"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"бетті тану жабдығын басқару"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Қолданбаға пайдаланатын бет үлгілерін енгізу және жою әдістерін шақыруға мүмкіндік береді."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"бетті тану жабдығын пайдалану"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Қолданбаға бетті тану жабдығын қолдануға рұқсат етеді"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Бет өңделмеді. Әрекетті қайталаңыз."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Бет тым ашық түсті болып шықты. Жарықты азайтыңыз."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Бет тым күңгірт түсті. Жарық көзін бөгемеңіз."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Датчикті беттен алыстатыңыз."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Датчикті бетке жақындатыңыз."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Датчикті жоғары көтеріңіз."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Датчикті төмен қарай жылжытыңыз."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Датчикті оңға қарай жылжытыңыз."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Датчикті солға қарай жылжытыңыз."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Датчикке қараңыз."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Бет анықталмады."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Құрылғыға бетіңізді қозғалтпай қарап тұрыңыз."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Бетті тану жабдығы қолжетімді емес."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Күту уақыты бітті. Әрекетті қайталаңыз."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Бетті сақтау мүмкін емес."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Бетті танудан бас тартылды."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Тым көп әрекет жасалды. Кейінірек қайталаңыз."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Тым көп әрекет жасалды. Бетті тану функциясы өшірілді."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Қайталап көріңіз."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Ешқандай бет тіркелмеген."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Бұл құрылғыда бетті тану датчигі жоқ"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> беті"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Бет белгішесі"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"синх параметрлерін оқу"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Қолданбаға есептік жазба синхрондау параметрлерін оқу мүмкіндігін береді. Мысалы, бұл арқылы People қолданбасының есептік жазбамен сихрондалғаны анықталуы мүмкін."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"синх қосу және өшіру арасында ауысу"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi желісінде интернет байланысы жоқ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Опциялар үшін түртіңіз"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Хотспот параметрлеріне өзгерістер енгізілді"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Хотспот жолағы өзгертілді."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Бұл құрылғы тек 5 ГГц жиілікте жұмыс істей алмайды. Бұл жиілік мүмкін болған жағдайда ғана қолданылады."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> желісіне ауысты"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Құрылғы <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> желісінде интернетпен байланыс жоғалған жағдайда <xliff:g id="NEW_NETWORK">%1$s</xliff:g> желісін пайдаланады. Деректер ақысы алынуы мүмкін."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> желісінен <xliff:g id="NEW_NETWORK">%2$s</xliff:g> желісіне ауысты"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Әкімші осы құрылғы ақауларын жоюға көмектесу үшін қате туралы есепті сұрады. Қолданбалар мен деректер бөлісілуі мүмкін."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"БӨЛІСУ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ҚАБЫЛДАМАУ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Пернетақтаны өзгерту"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Енгізу әдісін таңдау"</string>
<string name="show_ime" msgid="2506087537466597099">"Физикалық пернетақта белсенді кезде оны экранда ұстау"</string>
<string name="hardware" msgid="194658061510127999">"Виртуалды пернетақтаны көрсету"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Физикалық пернетақтаны конфигурациялау"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 1a9fadcd8bdb..22bd6c3250ef 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ពេល​ជិះ​យន្តហោះ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"បាន​បើក​របៀប​ពេល​ជិះ​យន្ត​ហោះ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បាន​បិទ​របៀបពេលជិះ​យន្តហោះ​"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"កម្មវិធី​សន្សំ​ថ្ម"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"កម្មវិធី​សន្សំ​ថ្ម​បាន​បិទ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"កម្មវិធី​សន្សំថ្មបាន​បើក"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ការ​កំណត់"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ជំនួយ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ជំនួយសម្លេង"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ទីតាំង"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ចូលដំណើរការទីតាំងរបស់ឧបករណ៍នេះ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"អនុញ្ញាតឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ទីតាំងរបស់ឧបករណ៍នេះ?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"កម្មវិធីនេះ​នឹងមាន​សិទ្ធិ​ចូលប្រើ​ទីតាំង នៅពេល​អ្នកប្រើ​កម្មវិធីនេះ​តែ​ប៉ុណ្ណោះ។"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"អនុញ្ញាត​ឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ទីតាំង​របស់ឧបករណ៍​នេះ​ជានិច្ច​មែនទេ?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"កម្មវិធីនេះ​នឹងមាន​សិទ្ធិ​ចូលប្រើ​ទីតាំង​ជានិច្ច ទោះបីជា​នៅពេល​អ្នក​មិនប្រើ​កម្មវិធីនេះ​ក៏​ដោយ។"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ប្រតិទិន"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ចូលប្រើប្រិតិទិនរបស់អ្នក"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"អនុញ្ញាតឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ​ប្រតិទិនរបស់អ្នក?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"កម្មវិធី​នេះ​អាច​បញ្ចូល​ លុប​ ឬ​ប្តូរ​ព្រឹត្តិការណ៍​ប្រតិទិន​នៅលើ​ទូរសព្ទ​របស់​អ្នក​។ កម្មវិធី​នេះ​អាច​ផ្ញើ​សារ​ ដែល​អាច​បង្ហាញ​ថា​សារ​នោះ​ចេញ​មក​ពី​ម្ចាស់​ប្រតិទិន​ ឬ​ផ្លាស់ប្តូរ​ព្រឹត្តិការណ៍​ដោយ​គ្មាន​ការ​ជូន​ដំណឹង​ដល់​ម្ចាស់​របស់​ពួកវា​ទេ​។"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ចូល​ដំណើរការ​ពាក្យ​បញ្ជា​ក្រុមហ៊ុន​ផ្ដល់​ទីតាំង"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ឲ្យ​កម្មវិធី​ចូល​ដំណើរការ​ពាក្យ​បញ្ជា​កម្មវិធី​ផ្ដល់​​ទីតាំង​បន្ថែម។ វា​អាច​អនុញ្ញាត​ឲ្យ​កម្មវិធី​ទាក់ទង​ជា​មួយ​ប្រតិបត្តិការ​ជីភីអេស ឬ​ប្រភព​ទីតាំង​ផ្សេង។"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"ចូលដំណើរការទីតាំងច្បាស់លាស់ (ផ្អែកលើបណ្តាញ និង GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"កម្មវិធី​នេះ​អាច​ទទួល​បាន​ទីតាំង​របស់​អ្នក​ ដោយ​ផ្អែក​លើ​ GPS​ ឬ​ប្រភព​ទីតាំង​បណ្តាញ​ ដូចជា​៖​ អង់តែន​ និង​បណ្តាញ​ Wi-Fi​ ។​ សេវាកម្ម​ទីតាំង​ទាំងនេះ​ត្រូវតែ​បើក​ និង​ត្រូវតែ​មាន​នៅ​លើ​ទូរសព្ទ​របស់​អ្នក ដើម្បី​ឲ្យ​កម្មវិធី​នេះ​អាច​ប្រើ​វា​បាន​។ វា​អាច​ប្រើ​ថាមពល​ច្រើន​ជាងមុន​។"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"ចូល​ប្រើ​ទីតាំង​ជាក់លាក់​តែ​នៅផ្ទៃ​ខាងមុខ​ប៉ុណ្ណោះ"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"កម្មវិធីនេះ​អាចទទួល​បានទីតាំង​ពិតប្រាកដ​របស់អ្នក​តែនៅពេល​វាស្ថិតនៅ​ផ្ទៃខាងមុខប៉ុណ្ណោះ។ សេវាកម្ម​ទីតាំង​ទាំងនេះ​ត្រូវតែ​បើក និងមាន​នៅលើ​ទូរសព្ទ​របស់អ្នក ដើម្បីឱ្យ​កម្មវិធី​នេះអាចប្រើ​ពួកវាបាន។ វាអាចប្រើ​ថាមពល​ច្រើន​ជាងមុន។"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ចូលដំណើរការទីតាំងប្រហាក់ប្រហែល (ផ្អែកលើបណ្តាញ)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"កម្មវិធី​នេះ​អាច​ទទួល​បាន​ទីតាំង​របស់​អ្នក​ ដោយ​ផ្អែក​លើ​ប្រភព​បណ្តាញ​ ដូចជា​៖​ អង់តែន​ និង​បណ្តាញ​ Wi-Fi​ ។​ សេវាកម្ម​ទីតាំង​ទាំងនេះ​ត្រូវតែ​បើក​ និង​ត្រូវតែ​មាន​នៅ​លើ​ថេប្លេត​របស់​អ្នក ដើម្បី​ឲ្យ​កម្មវិធី​នេះ​អាច​ប្រើ​វា​បាន​។"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"កម្មវិធី​នេះ​អាច​ទទួល​បាន​ទីតាំង​របស់​អ្នក​ ដោយ​ផ្អែក​លើ​ប្រភព​បណ្តាញ​ ដូចជា​៖​ អង់តែន​ និង​បណ្តាញ​ Wi-Fi​ ។​ សេវាកម្ម​ទីតាំង​ទាំងនេះ​ត្រូវតែ​បើក​ និង​ត្រូវតែ​មាន​នៅ​លើ​ទូរទស្សន៍​របស់​អ្នក ដើម្បី​ឲ្យ​កម្មវិធី​នេះ​អាច​ប្រើ​វា​បាន​។"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"កម្មវិធី​នេះ​អាច​ទទួល​បាន​ទីតាំង​របស់​អ្នក​ ដោយ​ផ្អែក​លើ​ប្រភព​បណ្តាញ​ ដូចជា​៖​ អង់តែន​ និង​បណ្តាញ​ Wi-Fi​ ។​ សេវាកម្ម​ទីតាំង​ទាំងនេះ​ត្រូវតែ​បើក​ និង​ត្រូវតែ​មាន​នៅ​លើ​ទូរសព្ទ​របស់​អ្នក ដើម្បី​ឲ្យ​កម្មវិធី​នេះ​អាច​ប្រើ​វា​បាន​។"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"ចូលប្រើ​ទីតាំង​ជាក់លាក់​នៅផ្ទៃ​ខាងក្រោយ"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"កម្មវិធីនេះ​អាចទទួល​បានទីតាំង​ពិតប្រាកដ​របស់អ្នក​គ្រប់ពេល​ដែលវា​ស្ថិតនៅ​ផ្ទៃខាងក្រោយ។ សេវាកម្ម​ទីតាំង​ទាំងនេះ​ត្រូវតែ​បើក និងមាន​នៅលើ​ទូរសព្ទ​របស់អ្នក ដើម្បីឱ្យ​កម្មវិធី​នេះអាចប្រើ​ពួកវាបាន។ វាអាចប្រើ​ថាមពល​ច្រើន​ជាងមុន។"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ប្ដូរ​ការ​កំណត់​អូឌីយូ​របស់​អ្នក"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ឲ្យ​កម្មវិធី​កែ​ការ​កំណត់​សំឡេង​សកល ដូច​ជា​កម្រិត​សំឡេង និង​អូប៉ាល័រ​ដែល​បាន​ប្រើ​សម្រាប់​លទ្ធផល។"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ថត​សំឡេង"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"រូបតំណាងស្នាមម្រាមដៃ"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"គ្រប់គ្រង​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃ​មុខ"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"អនុញ្ញាតឱ្យកម្មវិធីប្រើវិធីសាស្ត្រដើម្បី​បញ្ចូល និងលុបទម្រង់​គំរូ​ផ្ទៃមុខសម្រាប់ប្រើប្រាស់។"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ប្រើ​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃ​មុខ"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"អនុញ្ញាត​ឱ្យ​កម្មវិធី​ប្រើ​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃមុខ​សម្រាប់​ការផ្ទៀងផ្ទាត់"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"មិនអាចដំណើរការ​ផ្ទៃមុខបានទេ។ សូមព្យាយាមម្តងទៀត។"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ផ្ទៃ​មុខ​ចាំង​ពេក។ សូម​សាកល្បង​នៅកន្លែងដែលមាន​ពន្លឺ​ទាប​ជាងនេះ។"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ផ្ទៃ​មុខ​ងងឹត​ពេក។ សូមរកកន្លែង​ដែលមាន​ប្រភពពន្លឺ។"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"សូម​ផ្លាស់ទីឧបករណ៍​ចាប់សញ្ញា​ឱ្យ​ឆ្ងាយ​ពី​មុខ​។"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"សូម​ដាក់​ឧបករណ៍​ចាប់សញ្ញា​ឱ្យនៅជិតមុខ​ជាងនេះ។"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"សូម​ផ្លាស់ទី​ឧបករណ៍​ចាប់សញ្ញា​ឱ្យខ្ពស់​ជាងនេះ។"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"សូម​ផ្លាស់ទី​ឧបករណ៍ចាប់សញ្ញា​ឱ្យ​ទាបជាងនេះ។"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"សូម​ផ្លាស់ទី​ឧបករណ៍ចាប់សញ្ញា​ទៅ​ស្ដាំ។"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"សូម​ផ្លាស់ទី​ឧបករណ៍ចាប់សញ្ញា​ទៅឆ្វេង។"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"សូម​មើល​ទៅ​ឧបករណ៍​ចាប់សញ្ញា។"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"រកមិន​ឃើញ​មុខទេ។"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"រក្សាមុខ​របស់អ្នក​ឱ្យ​នឹង​នៅមុខ​ឧបករណ៍​។"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"មិន​អាច​ប្រើ​ផ្នែករឹង​ចាប់ផ្ទៃ​មុខ​បានទេ។"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"ការសម្គាល់​ផ្ទៃមុខ​បាន​អស់ម៉ោង។ សូមព្យាយាមម្ដងទៀត។"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"មិន​អាច​រក្សាទុក​ផ្ទៃ​មុខ​បានទេ។"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"បាន​បោះបង់​ប្រតិបត្តិការចាប់​ផ្ទៃមុខ។"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ព្យាយាមចូលច្រើនពេកហើយ។ បាន​បិទការផ្ទៀងផ្ទាត់​ផ្ទៃ​មុខ។"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"សូមព្យាយាម​ម្ដងទៀត។"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"មិន​អាច​ថត​បញ្ចូលផ្ទៃ​មុខ​បានទេ។"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ឧបករណ៍​នេះ​មិន​មាន​ឧបករណ៍​ផ្ទៀងផ្ទាត់​ផ្ទៃមុខ​នោះទេ"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"ផ្ទៃមុខទី <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"រូប​ផ្ទៃមុខ"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"អាន​ការ​កំណត់​ធ្វើ​សម​កាល​កម្ម"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ឲ្យ​កម្មវិធី​អាន​ការ​កំណត់​ធ្វើ​សម​កាល​កម្ម​សម្រាប់​គណនី។ ឧទាហរណ៍ វា​អាច​កំណត់​ថា​តើ​​​កម្មវិធី​ត្រូវ​បាន​បើក​ជា​មួយ​គណនី​ដែរ​ឬទេ។"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"បិទ/បើក​ការ​ធ្វើ​សម​កាល​កម្ម"</string>
@@ -1177,6 +1210,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi មិនមាន​ការតភ្ជាប់​អ៊ីនធឺណិតទេ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ប៉ះសម្រាប់ជម្រើស"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"ប្ដូរ​ទៅ​ការ​កំណត់​ហតស្ប៉ត​របស់អ្នក"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"រលកសញ្ញាហតស្ប៉តរបស់​អ្នកបាន​ផ្លាស់ប្ដូរ។"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ឧបករណ៍​នេះ​មិន​អាច​ប្រើចំណូល​ចិត្ត​របស់អ្នកសម្រាប់តែ 5GHz ទេ។ ផ្ទុយ​មកវិញ ឧបករណ៍​នេះ​នឹង​ប្រើរលកសញ្ញា​ 5GHz នៅពេល​ដែលអាច​ប្រើបាន។"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"បានប្តូរទៅ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"ឧបករណ៍​ប្រើ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> នៅ​ពេល​ដែល <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> មិនមាន​ការ​តភ្ជាប់​អ៊ីនធឺណិត។ អាច​គិតថ្លៃ​លើការ​ប្រើប្រាស់​ទិន្នន័យ។"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"បានប្តូរពី <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ទៅ <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1264,7 +1300,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"អ្នកគ្រប់គ្រង​របស់អ្នក​បាន​ស្នើសុំ​របាយការណ៍​អំពី​បញ្ហា ដើម្បី​ជួយដោះស្រាយ​បញ្ហា​នៅលើឧបករណ៍​នេះ។ កម្មវិធី និង​ទិន្នន័យអាច​ត្រូវ​បានចែក​រំលែក។"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ចែករំលែក"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"បដិសេធ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"ប្ដូរ​ក្ដារចុច"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ជ្រើស​វិធីសាស្ត្រ​បញ្ចូល"</string>
<string name="show_ime" msgid="2506087537466597099">"ទុកវានៅលើអេក្រង់ខណៈពេលក្តារចុចពិតប្រាកដកំពុងសកម្ម"</string>
<string name="hardware" msgid="194658061510127999">"បង្ហាញក្ដារចុចនិម្មិត"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"កំណត់រចនាសម្ព័ន្ធក្តារចុចពិតប្រាកដ"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index e3e079bf2542..58f8d56be4e2 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ಏರ್‌ಪ್ಲೇನ್ ಮೋಡ್"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ಎರ್‌ಪ್ಲೇನ್ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ಎರ್‌ಪ್ಲೇನ್ ಮೋಡ್ ಆಫ್ ಆಗಿದೆ"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ಬ್ಯಾಟರಿ ಸೇವರ್‌‌"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆಫ್ ಆಗಿದೆ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಆನ್ ಆಗಿದೆ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ಸಹಾಯ ಮಾಡು"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ಧ್ವನಿ ಸಹಾಯಕ"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ಸ್ಥಳ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ನೀವು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸುವಾಗ ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಸ್ಥಳಕ್ಕೆ ಮಾತ್ರ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತದೆ."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ಈ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು ಯಾವಾಗಲೂ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ನೀವು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸದಿರುವಾಗಲೂ ಅಪ್ಲಿಕೇಶನ್ ಯಾವಾಗಲೂ ಸ್ಥಳಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತದೆ."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ಕ್ಯಾಲೆಂಡರ್"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಪ್ರವೇಶಿಸಲು &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಗೆ ಅನುಮತಿಸಬೇಕೇ?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೇರಿಸಬಹುದು, ತೆಗೆದುಹಾಕಬಹುದು ಅಥವಾ ಬದಲಾಯಿಸಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಲೆಂಡರ್‌ನ ಮಾಲೀಕರಿಂದ ಬಂದಿರಬಹುದಾದ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಅಥವಾ ಅವರ ಮಾಲೀಕರಿಗೆ ತಿಳಿಸದಂತೆ ಘಟನೆಗಳು ಬದಲಾಯಿಸುವುದು."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ಹೆಚ್ಚುವರಿ ಸ್ಥಳ ಪೂರೈಕೆದಾರರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ಹೆಚ್ಚಿನ ಸ್ಥಳ ಪೂರೈಕೆದಾರ ಆದೇಶಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು GPS ಅಥವಾ ಇತರ ಸ್ಥಳ ಮೂಲಗಳ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಮಧ್ಯ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅನುಮತಿಸಬಹುದು."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"ನಿಖರ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ (GPS ಮತ್ತು ನೆಟ್‍ವರ್ಕ್-ಆಧಾರಿತ)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಲ್ ಟವರ್‌ಗಳು ಮತ್ತು ವೈ-ಫೈ ನೆಟ್‍‍ವರ್ಕ್‌ನಂತಹ GPS ಅಥವಾ ನೆಟ್‍‍ವರ್ಕ್ ಮೂಲಗಳ ಆಧಾರದ ಮೇಲೆ ಪಡೆಯಬಹುದು. ಈ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿರಬೇಕು ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರಬೇಕು. ಇದು ಬ್ಯಾಟರಿ ಬಳಕೆಯನ್ನು ಹೆಚ್ಚಿಸಬಹುದು."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"ಮುನ್ನೆಲೆಯಲ್ಲಿ ಮಾತ್ರ ನಿಖರವಾದ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಮುಂಭಾಗದಲ್ಲಿರುವಾಗ ಮಾತ್ರ ನಿಮ್ಮ ನಿಖರ ಸ್ಥಳವನ್ನು ಪಡೆಯಬಹುದು. ಈ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿರಬೇಕು ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರಬೇಕು."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ಅಂದಾಜು ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ (ನೆಟ್‌ವರ್ಕ್-ಆಧಾರಿತ)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಲ್ ಟವರ್‌ಗಳು ಮತ್ತು ವೈ-ಫೈ ನೆಟ್‍‍ವರ್ಕ್‌ನಂತಹ ನೆಟ್‍‍ವರ್ಕ್ ಮೂಲಗಳ ಆಧಾರದ ಮೇಲೆ ಪಡೆಯಬಹುದು. ಈ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿರಬೇಕು ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್‌ನಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರಬೇಕು."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಲ್ ಟವರ್‌ಗಳು ಮತ್ತು ವೈ-ಫೈ ನೆಟ್‍‍ವರ್ಕ್‌ನಂತಹ ನೆಟ್‍‍ವರ್ಕ್ ಮೂಲಗಳ ಆಧಾರದ ಮೇಲೆ ಪಡೆಯಬಹುದು. ಈ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿರಬೇಕು ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಟಿವಿಯಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರಬೇಕು."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಲ್ ಟವರ್‌ಗಳು ಮತ್ತು ವೈ-ಫೈ ನೆಟ್‍‍ವರ್ಕ್‌ನಂತಹ ನೆಟ್‍‍ವರ್ಕ್ ಮೂಲಗಳ ಆಧಾರದ ಮೇಲೆ ಪಡೆಯಬಹುದು. ಈ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿರಬೇಕು ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರಬೇಕು."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ನಿಖರ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಹಿನ್ನೆಲೆಯಲ್ಲಿದೆಯಾದರೂ ನಿಮ್ಮ ಸರಿಯಾದ ಸ್ಥಳವನ್ನು ಪಡೆಯಬಹುದು. ಈ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿರಬೇಕು ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರಬೇಕು."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ನಿಮ್ಮ ಆಡಿಯೊ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ವಾಲ್ಯೂಮ್ ರೀತಿಯ ಮತ್ತು ಔಟ್‍‍ಪುಟ್‍‍ಗಾಗಿ ಯಾವ ಸ್ಪೀಕರ್ ಬಳಸಬೇಕು ಎಂಬ ರೀತಿಯ ಜಾಗತಿಕ ಆಡಿಯೊ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ಆಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ಬೆರಳಚ್ಚು ಐಕಾನ್"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್‌ವೇರ್‌ ಅನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ಬಳಕೆಗೆ ಮುಖದ ಟೆಂಪ್ಲೇಟ್‌ಗಳನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಅಳಿಸಲು ವಿಧಾನಗಳನ್ನು ಮನವಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್‌ವೇರ್‌ ಅನ್ನು ಬಳಸಿ"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ಧೃಡೀಕರಣಕ್ಕಾಗಿ ಮುಖದ ಹಾರ್ಡ್‌ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ಮುಖವನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ಮುಖವು ತುಂಬಾ ಪ್ರಕಾಶಮಾನವಾಗಿದೆ. ಕಡಿಮೆ ಲೈಟ್‌ನಲ್ಲಿ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ಮುಖ ತುಂಬಾ ಕಪ್ಪಾಗಿದೆ. ನೇರವಾಗಿ ಬೆಳಕು ಬಿಳುವಂತೆ ಮಾಡಿ."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"ಮುಖದಿಂದ ಸೆನ್ಸರ್ ಅನ್ನು ದೂರ ಸರಿಸಿ."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"ಸೆನ್ಸರ್ ಅನ್ನು ಮುಖದ ಹತ್ತಿರಕ್ಕೆ ತನ್ನಿ."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"ಸೆನ್ಸರ್ ಅನ್ನು ಮೇಲಕ್ಕೆ ಸರಿಸಿ."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"ಸೆನ್ಸರ್ ಅನ್ನು ಕೆಳಕ್ಕೆ ಸರಿಸಿ."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"ಸೆನ್ಸರ್ ಅನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"ಸೆನ್ಸರ್ ಅನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"ಸೆನ್ಸರ್ ಅನ್ನು ನೋಡಿ."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"ಯಾವುದೇ ಮುಖ ಪತ್ತೆಯಾಗಿಲ್ಲ."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ಸಾಧನದ ಮುಂದೆ ಮುಖವನ್ನು ಸ್ಥಿರವಾಗಿ ಇರಿಸಿ."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"ಮುಖದ ಹಾರ್ಡ್‌ವೇರ್‌ ಲಭ್ಯವಿಲ್ಲ."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"ಮುಖ ಸಮಯದ ಅವಧಿಯನ್ನು ತಲುಪಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"ಮುಖವನ್ನು ಸಂಗ್ರಹಿಸಲಾಗುವುದಿಲ್ಲ."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ಹಲವು ಪ್ರಯತ್ನ. ಮುಖದ ದೃಢೀಕರಣ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"ಯಾವುದೇ ಮುಖವನ್ನು ನೋಂದಣಿ ಮಾಡಿಲ್ಲ."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ಈ ಸಾಧನವು ಮುಖ ದೃಢೀಕರಣ ಸೆನ್ಸರ್‌ ಅನ್ನು ಹೊಂದಿಲ್ಲ"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"ಮುಖದ <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"ಮುಖದ ಐಕಾನ್‌"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ರೀಡ್‌ ಮಾಡು"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ಒಂದು ಖಾತೆಯ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್‍‍ಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್‍‍ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯೊಂದಿಗೆ ಜನರ ಅಪ್ಲಿಕೇಶನ್ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಇದು ನಿರ್ಧರಿಸಬಹುದು."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ಸಿಂಕ್ ಆನ್ ಮತ್ತು ಸಿಂಕ್ ಆಫ್ ಟಾಗಲ್ ಮಾಡಿ"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"ವೈ ಫೈ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"ನಿಮ್ಮ ಹಾಟ್‌ಸ್ಪಾಟ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಬದಲಾವಣೆಗಳು"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ನಿಮ್ಮ ಹಾಟ್‌ಸ್ಪಾಟ್‌ ಬ್ಯಾಂಡ್ ಬದಲಾಗಿದೆ."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ಈ ಸಾಧನವು 5GHz ಗೆ ಮಾತ್ರ ನಿಮ್ಮ ಆದ್ಯತೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಬದಲಿಗೆ, ಈ ಸಾಧನವು 5GHz ಬ್ಯಾಂಡ್ ಅನ್ನು ಲಭ್ಯವಿರುವಾಗ ಬಳಸುತ್ತದೆ."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶ ಹೊಂದಿಲ್ಲದಿರುವಾಗ, ಸಾಧನವು <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ಬಳಸುತ್ತದೆ. ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ರಿಂದ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ಈ ಸಾಧನದ ಸಮಸ್ಯೆ ನಿವಾರಿಸುವಲ್ಲಿ ಸಹಾಯ ಮಾಡಲು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಗ್ ವರದಿಯನ್ನು ವಿನಂತಿಸಿದ್ದಾರೆ. ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ನಿರಾಕರಿಸಿ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"ಕೀಬೋರ್ಡ್ ಬದಲಿಸಿ"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ಇನ್‌ಪುಟ್‌‌ ವಿಧಾನವನ್ನು ಆರಿಸಿ"</string>
<string name="show_ime" msgid="2506087537466597099">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಅದನ್ನು ಪರದೆಯ ಮೇಲಿರಿಸಿ"</string>
<string name="hardware" msgid="194658061510127999">"ವರ್ಚ್ಯುಯಲ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index c29273843ae4..076b65fa3d80 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"비행기 모드"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"비행기 모드 사용중"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"비행기 모드 사용중이 아님"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"배터리 세이버"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"배터리 세이버 사용 안함"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"배터리 세이버 사용 중"</string>
<string name="global_action_settings" msgid="1756531602592545966">"설정"</string>
<string name="global_action_assist" msgid="3892832961594295030">"지원"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"음성 지원"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"위치"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"이 기기의 위치정보에 액세스"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 기기 위치에 액세스하도록 허용하시겠습니까?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"앱을 사용할 때만 앱에서 위치에 액세스합니다."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 기기 위치에 액세스하도록 허용하시겠습니까?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"앱을 사용하지 않을 때에도 앱에서 항상 위치에 액세스합니다."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"캘린더"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"캘린더에 액세스"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 내 캘린더에 액세스하도록 허용하시겠습니까?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"앱이 일정을 추가, 삭제, 변경할 수 있도록 허용합니다. 앱이 메시지를 전송하거나 사용자에게 별도 표시 없이 일정을 수정할 수도 있습니다."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"추가 위치 제공업체 명령에 접근"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"앱이 추가 위치 정보 제공 기능의 명령에 접근하도록 허용합니다. 이 경우 앱이 GPS 또는 기타 위치 소스의 작동을 방해할 수 있습니다."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"정확한 위치(GPS 및 네트워크 기반)에 액세스"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"이 앱은 GPS나 기지국 및 Wi-Fi 네트워크와 같은 네트워크 소스를 통해 내 위치를 알 수 있습니다. 앱에서 위치 서비스를 사용하려면 휴대전화에서 위치 서비스가 사용 설정되어 있으며 사용 가능해야 합니다. 이로 인해 배터리 사용량이 늘어날 수 있습니다."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"포그라운드에서만 정확한 위치에 액세스"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"이 앱은 포그라운드에 있을 때만 나의 정확한 위치를 알 수 있습니다. 앱에서 위치 서비스를 사용하려면 휴대전화에서 위치 서비스가 사용 설정되어 있으며 사용할 수 있어야 합니다. 배터리 사용량이 늘어날 수 있습니다."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"대략적인 위치(네트워크 기반)에 액세스"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"이 앱은 기지국 및 Wi-Fi 네트워크와 같은 네트워크 소스를 통해 내 위치를 알 수 있습니다. 앱에서 위치 서비스를 사용하려면 태블릿에서 위치 서비스가 사용 설정되어 있으며 사용 가능해야 합니다."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"이 앱은 기지국 및 Wi-Fi 네트워크와 같은 네트워크 소스를 통해 내 위치를 알 수 있습니다. 앱에서 위치 서비스를 사용하려면 TV에서 위치 서비스가 사용 설정되어 있으며 사용 가능해야 합니다."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"이 앱은 기지국 및 Wi-Fi 네트워크와 같은 네트워크 소스를 통해 내 위치를 알 수 있습니다. 앱에서 위치 서비스를 사용하려면 휴대전화에서 위치 서비스가 사용 설정되어 있으며 사용 가능해야 합니다."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"백그라운드에서 정확한 위치에 액세스"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"이 앱은 백그라운드에서 언제든지 나의 정확한 위치를 알 수 있습니다. 앱에서 위치 서비스를 사용하려면 휴대전화에서 위치 서비스가 사용 설정되어 있으며 사용할 수 있어야 합니다. 배터리 사용량이 늘어날 수 있습니다."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"오디오 설정 변경"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"앱이 음량이나 출력을 위해 사용하는 스피커 등 전체 오디오 설정을 변경할 수 있도록 허용합니다."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"오디오 녹음"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"지문 아이콘"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"얼굴 인증 하드웨어 관리"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"사용할 얼굴 템플릿의 추가 및 삭제 메서드를 앱에서 호출하도록 허용합니다."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"얼굴 인증 하드웨어 사용"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"앱에서 얼굴 인증 하드웨어를 인증에 사용하도록 허용합니다."</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"얼굴을 인식할 수 없습니다. 다시 시도해 주세요."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"얼굴이 너무 밝습니다. 조명을 더 어둡게 해 보세요."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"얼굴이 너무 어둡습니다. 조명을 더 밝게 해 보세요."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"센서를 얼굴에서 더 멀리 떨어뜨려 주세요."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"센서를 얼굴에 더 가까이 대 주세요."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"센서를 위쪽으로 옮겨 주세요."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"센서를 아래쪽으로 옮겨 주세요."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"센서를 오른쪽으로 옮겨 주세요."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"센서를 왼쪽으로 옮겨 주세요."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"센서를 바라보세요."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"얼굴을 감지할 수 없습니다."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"얼굴을 움직이지 말고 기기를 마주 보세요."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"얼굴 인식 하드웨어를 사용할 수 없습니다."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"얼굴 인식 시간이 초과되었습니다. 다시 시도하세요."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"얼굴을 저장할 수 없습니다."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"얼굴 인식 작업이 취소되었습니다."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"시도 횟수가 너무 많아 얼굴 인증이 사용 중지되었습니다."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"다시 시도해 보세요."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"등록된 얼굴이 없습니다."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"이 기기에는 얼굴 인증 센서가 없습니다."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"얼굴 <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"얼굴 아이콘"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"동기화 설정 읽기"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"앱이 계정의 동기화 설정을 읽을 수 있도록 허용합니다. 예를 들어, 계정에서 주소록 앱을 동기화할지 여부를 확인할 수 있습니다."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"동기화 사용 및 사용 중지 전환"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi가 인터넷에 연결되어 있지 않습니다"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"탭하여 옵션 보기"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"핫스팟 설정 변경"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"핫스팟 대역이 변경되었습니다."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"이 기기에서는 5GHz 전용 환경설정이 지원되지 않습니다. 대신 가능할 때만 기기에서 5GHz 대역이 사용됩니다."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>(으)로 전환"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>(으)로 인터넷에 연결할 수 없는 경우 기기에서 <xliff:g id="NEW_NETWORK">%1$s</xliff:g>이(가) 사용됩니다. 요금이 부과될 수 있습니다."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>에서 <xliff:g id="NEW_NETWORK">%2$s</xliff:g>(으)로 전환"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"관리자가 이 기기의 문제해결을 위해 버그 신고를 요청했습니다. 앱과 데이터가 공유될 수 있습니다."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"공유"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"거부"</string>
- <string name="select_input_method" msgid="8547250819326693584">"키보드 변경"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"입력 방법 선택"</string>
<string name="show_ime" msgid="2506087537466597099">"물리적 키보드가 활성 상태인 경우 화면에 켜 둠"</string>
<string name="hardware" msgid="194658061510127999">"가상 키보드 표시"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"물리적 키보드 설정"</string>
@@ -1673,7 +1709,7 @@
<item quantity="one">1초 후에 다시 시도하세요.</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"나중에 다시 시도"</string>
- <string name="immersive_cling_title" msgid="8394201622932303336">"전체 화면 보기 중"</string>
+ <string name="immersive_cling_title" msgid="8394201622932303336">"전체 화면 모드"</string>
<string name="immersive_cling_description" msgid="3482371193207536040">"종료하려면 위에서 아래로 스와이프합니다."</string>
<string name="immersive_cling_positive" msgid="5016839404568297683">"확인"</string>
<string name="done_label" msgid="2093726099505892398">"완료"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index f52eb01f2fbb..a39021fdab8f 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Учак режими"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Учак режими КҮЙҮК"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Учак режими ӨЧҮК"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Батареяны үнөмдөгүч"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Батареяны үнөмдөгүч ӨЧҮК"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Батареяны үнөмдөгүч КҮЙҮК"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Жөндөөлөр"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Жардам"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Үн жардамчысы"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Жайгашкан жер"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"түзмөктүн жайгашкан жерин аныктоого"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосу бул түзмөктүн кайда жүргөнүн көрүп турганга уруксат бересизби?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Сиз бул колдонмону пайдаланып жатканда гана ал жайгашкан жериңизди көрө алат."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна бул түзмөктүн жайгашкан жерин пайдаланууга дайыма уруксат берилсинби?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Сиз бул колдонмону пайдаланбай турганда да ал жайгашкан жериңизди көрүп турат."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Жылнаама"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"жылнаамаңызды пайдалануу"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосуна жылнаамаңызды пайдаланууга уруксат берилсинби?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Бул колдонмо телефонуңузга жылнаама иш-чараларын кошуп, алып салып же өзгөртүшү мүмкүн. Бул колдонмо жылнаама ээсинин атынан билдирүүлөрдү жөнөтүп же ээсине эскертпестен иш-чараларды өзгөртүшү мүмкүн."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"жайгашкан жерди аныктагычтын кошумча буйруктарын пайдалануу"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Колдонмого жайгашкан жерди табуучу кошумча жабдуучулардын буйруктарын колдонуу мүмкүнчүлүгүн берет. Ушуну менен колдонмо GPS\'тин ишине жана башка жайгашкан жерлерди аныктоо кызматтарына кийлигише алат."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"так аныкталган жайгашкан жерге (GPS жана тармактын негизинде) уруксат"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Бул колдонмо GPS же байланыш мунаралары жана Wi-Fi сыяктуу тармактык булактар аркылуу жайгашкан жериңизди аныктай алат. Колдонмо бул кызматтарды пайдаланышы үчүн, аларды күйгүзүп, телефонуңузга туташтырып коюшуңуз керек. Ушуну менен батареянын кубаты көбүрөөк сарпталышы мүмкүн."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"так аныкталган жайгашкан жерге активдүү режимде гана кирүүгө уруксат берүү"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Бул колдонмонун активдүү режимде гана жайгашкан жериңиздин дайындарын алууга мүмкүнчүлүгү бар. Колдонмо бул кызматтарды пайдаланышы үчүн аларды күйгүзүп, телефонуңузга туташтырып коюшуңуз керек. Ушуну менен батареянын кубаты көбүрөөк сарпталышы мүмкүн."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"болжолдуу жайгашкан жерге (тармактын негизинде) уруксат"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Бул колдонмо байланыш мунаралары жана Wi-Fi сыяктуу тармактык булактар аркылуу жайгашкан жериңизди аныктай алат. Колдонмо бул кызматтарды пайдаланышы үчүн, аларды күйгүзүп, планшетиңизге туташтырып коюшуңуз керек."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Бул колдонмо байланыш мунаралары жана Wi-Fi сыяктуу тармактык булактар аркылуу жайгашкан жериңизди аныктай алат. Колдонмо бул кызматтарды пайдаланышы үчүн, аларды күйгүзүп, сыналгыңызга туташтырып коюшуңуз керек."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Бул колдонмо байланыш мунаралары жана Wi-Fi сыяктуу тармактык булактар аркылуу жайгашкан жериңизди аныктай алат. Колдонмо бул кызматтарды пайдаланышы үчүн, аларды күйгүзүп, телефонуңузга туташтырып коюшуңуз керек."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"так аныкталган жайгашкан жерге фондук режимде кирүүгө уруксат берүү"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Бул колдонмо фондук режимде сиздин кайда жүргөнүңүздү көрүп турат. Ал үчүн жайгашкан жерди аныктоо функциясын иштетишиңиз керек. Эскерте кетүүчү нерсе, батареяңыз тез отуруп калышы мүмкүн."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"аудио жөндөөлөрүңүздү өзгөртүңүз"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Колдонмого үн деңгээли жана кайсы динамик аркылуу үн чыгарылышы керек сыяктуу түзмөктүн аудио тууралоолорун өзгөртүүгө уруксат берет."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"аудио жаздыруу"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Манжа изинин сөлөкөтү"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"жүздүн аныктыгын текшерүүчү аппараттык камсыздоону башкаруу"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Колдонмого пайдалануу үчүн жүздүн үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"жүздүн аныктыгын текшерүүчү аппараттык камсыздоону колдонуу"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Колдонмого аныктыгын текшерүү үчүн жүздүн аныктыгын текшерүүчү аппараттык камсыздоону пайдалануу мүмкүндүгүн берет"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Жүзүңүз таанылбай койду. Кайра аракет кылыңыз."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Өтө жарык болуп жатат. Жаракты азайтып көрүңүз."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Өтө караңгы болуп жатат. Жарыкты ачып коюңуз."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Сенсорду бетиңизден алысыраак жылдырыңыз."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Сенсорду бетиңизге жакыныраак жылдырыңыз."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Сенсорду жогору жакка жылдырыңыз."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Сенсорду төмөн жакка жылдырыңыз."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Сенсорду оң жакка жылдырыңыз."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Сенсорду сол жакка жылдырыңыз."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Сенсорду караңыз."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Жүзүңүз табылган жок."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Түзмөктүн алдында жүзүңүздү бир калыпта кармаңыз."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Жүздү аныктоочу аппараттык камсыздоо жеткиликсиз."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Жүздүн аныктыгын текшерүүнү күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Жүздү сактоо мүмкүн эмес."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Жүздүн аныктыгын текшерүү жокко чыгарылды."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Өтө көп жолу аракет жасадыңыз. Кийинчерээк кайра аракет кылыңыз."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Өтө көп жолу аракет жасадыңыз. Жүздүн аныктыгын текшерүү сенсору өчүрүлдү."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Кайра аракет кылыңыз."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Бир да жүз катталган жок."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Бул түзмөктө жүздүн аныктыгын текшерүү сенсору жок"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Жүз <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Жүздүн сүрөтчөсү"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"шайкештирүү жөндөөлөрүн окуу"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Колдонмого эсеп менен синхрондошуу тууралоолорун окуганга уруксат берет. Мисалы, Кишилер колдонмосу эсеп менен синхрондошкондугун аныктай алат."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"синхрондоштурууну өчүрүү/жандыруу"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi тармагы Интернетке туташпай турат"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Параметрлерди ачуу үчүн таптап коюңуз"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Туташуу түйүнүңүздүн жөндөөлөрүнө өзгөртүүлөр киргизилди"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Туташуу түйүнүңүздүн жыштыгы өзгөрдү."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Бул түзмөк 5ГГцти гана колдонуу жөндөөсүн колдоого албайт. Анын ордуна, бул түзмөк 5ГГц жыштыгын ал жеткиликтүү болгондо колдонот."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> тармагына которуштурулду"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> тармагы Интернетке туташпай турганда, түзмөгүңүз <xliff:g id="NEW_NETWORK">%1$s</xliff:g> тармагын колдонот. Акы алынышы мүмкүн."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> дегенден <xliff:g id="NEW_NETWORK">%2$s</xliff:g> тармагына которуштурулду"</string>
@@ -1264,7 +1300,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Бул түзмөктүн бузулууларын аныктап оңдоо үчүн администраторуңуз мүчүлүштүктөр тууралуу маалыматты сурап жатат. Колдонмолор менен дайындар бөлүшүлүшү мүмкүн."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"БӨЛҮШҮҮ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ЧЕТКЕ КАГУУ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Баскычтопту өзгөртүү"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Дайын киргизүү ыкмасын тандаңыз"</string>
<string name="show_ime" msgid="2506087537466597099">"Баскычтоп иштетилгенде экранда көрүнүп турат"</string>
<string name="hardware" msgid="194658061510127999">"Виртуалдык баскычтоп"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Аппараттык баскычтопту конфигурациялоо"</string>
diff --git a/core/res/res/values-land/dimens_package_installer.xml b/core/res/res/values-land/dimens_package_installer.xml
new file mode 100644
index 000000000000..72f4ec22c36f
--- /dev/null
+++ b/core/res/res/values-land/dimens_package_installer.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<!-- Landscape dimensions for the permission grant dialog. -->
+<resources>
+ <!-- 37:20 == 65% width -->
+ <dimen name="permissionGrantDialogWidth">37</dimen>
+</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index c27ffe7ad343..ef2cede2c777 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ໂໝດໃນຍົນ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ເປີດໂໝດຢູ່ໃນຍົນແລ້ວ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ປິດໂໝດໃນຍົນແລ້ວ"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ຕົວປະຢັດແບັດເຕີຣີ"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ຕົວປະຢັດແບັດເຕີຣີປິດຢູ່"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ຕົວປະຢັດແບັດເຕີຣີເປີດຢູ່"</string>
<string name="global_action_settings" msgid="1756531602592545966">"​ການ​ຕັ້ງ​ຄ່າ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ຕົວຊ່ວຍ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ຊ່ວຍ​ເຫຼືອ​ທາງ​ສຽງ"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ສະ​ຖານ​ທີ່"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ເຂົ້າເຖິງຂໍ້ມູນສະຖານທີ່ຂອງອຸປະກອນນີ້"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງສະຖານທີ່ຂອງອຸປະກອນບໍ?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ແອັບຈະມີສິດເຂົ້າເຖິງສະຖານທີ່ໃນເວລາທີ່ທ່ານກຳລັງໃຊ້ແອັບຢູ່ເທົ່ານັ້ນ."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ອະນຸຍາດໃຫ້ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ເຂົ້າເຖິງສະຖານທີ່ຂອງອຸປະກອນນີ້ບໍ?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ແອັບຈະມີສິດເຂົ້າເຖິງສະຖານທີ່ທຸກເທື່ອ ເຖິງແມ່ນໃນເວລາທ່ານບໍ່ໃຊ້ແອັບຢູ່ກໍຕາມ."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ປະຕິທິນ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ເຂົ້າ​ຫາ​ປະ​ຕິ​ທິນ​ຂອງ​ທ່ານ"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"ອະນຸຍາດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ໃຫ້ເຂົ້າເຖິງປະຕິທິນຂອງທ່ານບໍ?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"This app can add, remove, or change calendar events on your phone. This app can send messages that may appear to come from calendar owners, or change events without notifying their owners."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ເຂົ້າເຖິງຄຳສັ່ງຜູ່ໃຫ້ບໍລິການພິກັດສະຖານທີ່"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ອະນຸຍາດ​ໃຫ້​ແອັບຯ​ເຂົ້າເຖິງ​ຄຳສັ່ງ​ເພີ່ມເຕີມ​ຂອງ​ຜູ່​ໃຫ້​ບໍລິການ​ສະຖານທີ່. ນີ້​ອາດ​ຈະ​ເປັນ​ການ​ເຮັດ​ໃຫ້​ແອັບຯ ລົບກວນ​ການ​ເຮັດ​ວຽກ​ຂອງ GPS ຫຼື​ແຫລ່ງ​ຂໍ້ມູນ​ສະຖານທີ່​ອື່ນໆ​ໄດ້."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"ເຂົ້າ​ຫາທີ່ຕັ້ງທີ່ແນ່ນອນ (ອີງໃສ່ GPS ແລະ ເຄືອຂ່າຍ)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"This app can get your location based on GPS or network location sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"ເຂົ້າເຖິງສະຖານທີ່ແນ່ນອນໃນພື້ນໜ້າເທົ່ານັ້ນ"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"ແອັບນີ້ສາມາດຮັບເອົາສະຖານທີ່ແນ່ນອນຂອງທ່ານໄດ້ທຸກເວລາທີ່ມັນຢູ່ໃນພື້ນໜ້າ. ການບໍລິການສະຖານທີ່ເຫຼົ່ານີ້ຕ້ອງເປີດຢູ່ ແລະ ສາມາດໃຊ້ໄດ້ໃນໂທລະສັບຂອງທ່ານເພື່ອໃຫ້ແອັບສາມາດໃຊ້ພວກມັນໄດ້. ນີ້ອາດຈະເຮັດໃຫ້ການໃຊ້ແບັດເຕີຣີເພີ່ມຂຶ້ນ."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ເຂົ້າ​ຫາທີ່ຕັ້ງໂດຍປະມານ (ອີງໃສ່ເຄືອຂ່າຍ)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"This app can get your location based on network sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your tablet for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"This app can get your location based on network sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your TV for the app to be able to use them."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"This app can get your location based on network sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"ເຂົ້າເຖິງສະຖານທີ່ແນ່ນອນໃນພື້ນຫຼັງ"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"ແອັບນີ້ສາມາດຮັບເອົາສະຖານທີ່ແນ່ນອນຂອງທ່ານໄດ້ທຸກເວລາທີ່ມັນຢູ່ໃນພື້ນຫຼັງ. ການບໍລິການສະຖານທີ່ເຫຼົ່ານີ້ຕ້ອງເປີດຢູ່ ແລະ ສາມາດໃຊ້ໄດ້ໃນໂທລະສັບຂອງທ່ານເພື່ອໃຫ້ແອັບສາມາດໃຊ້ພວກມັນໄດ້. ນີ້ອາດຈະເຮັດໃຫ້ການໃຊ້ແບັດເຕີຣີເພີ່ມຂຶ້ນ."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ປ່ຽນການຕັ້ງຄ່າສຽງຂອງທ່ານ"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ອະນຸຍາດໃຫ້ແອັບຯແກ້ໄຂການຕັ້ງຄ່າສຽງສ່ວນກາງ ເຊັ່ນ: ລະດັບສຽງ ແລະລຳໂພງໃດທີ່ຖືກໃຊ້ສົ່ງສຽງອອກ."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ບັນທຶກສຽງ"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ໄອຄອນລາຍນິ້ວມື"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"ຈັດການຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ອະນຸຍາດໃຫ້ແອັບເປີດວິທີການຕ່າງໆເພື່ອເພີ່ມ ແລະ ລຶບແມ່ແບບໃບໜ້າສຳລັບການນຳໃຊ້."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າສຳລັບການກວດສອບຄວາມຖືກຕ້ອງ"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ບໍ່ສາມາດປະມວນຜົນຂໍ້ມູນໃບໜ້າໄດ້. ກະລຸນາລອງອີກຄັ້ງ."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ໃບໜ້າສະຫວ່າງເກີນໄປ. ກະລຸນາລອງໃນບ່ອນທີ່ແສງໜ້ອຍກວ່າ."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ໃບໜ້າມືດເກີນໄປ. ກະລຸນາເປີດແຫຼ່ງກຳເນີດແສງ."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"ກະລຸນາຍ້າຍເຊັນເຊີອອກຫ່າງຈາກໃບໜ້າຕື່ມອີກ."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"ກະລຸນາຍ້າຍເຊັນເຊີເຂົ້າໃກ້ໃບໜ້າຕື່ມອີກ."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"ກະລຸນາຍ້າຍເຊັນເຊີໃຫ້ສູງຂຶ້ນອີກ."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"ກະລຸນາຍ້າຍເຊັນເຊີໃຫ້ຕໍ່າລົງອີກ."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"ກະລຸນາຍ້າຍເຊັນເຊີໄປເບື້ອງຂວາ."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"ກະລຸນາຍ້າຍເຊັນເຊີໄປເບື້ອງຊ້າຍ."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"ກະລຸນາແນມເບິ່ງເຊັນເຊີ."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"ກວດບໍ່ພົບໃບໜ້າ."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ຮັກສາໃບໜ້າໃຫ້ຢູ່ນິ້ງຕໍ່ໜ້າອຸປະກອນ"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"ຮາດແວກວດໃບໜ້າບໍ່ສາມາດໃຊ້ໄດ້."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"ໝົດເວລາກວດໃບໜ້າແລ້ວ. ກະລຸນາລອງອີກຄັ້ງ."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"ບໍ່ສາມາດເກັບຮັກສາໃບໜ້າໄວ້ໄດ້."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ປິດນຳໃຊ້ການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າແລ້ວ."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"ລອງອີກຄັ້ງ."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"ບໍ່ໄດ້ລົງທະບຽນໃບໜ້າໃດ."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ອຸປະກອນນີ້ບໍ່ມີເຊັນເຊີກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"ໃບໜ້າ <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"ໄອຄອນໃບໜ້າ"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ອ່ານການຕັ້ງຄ່າຊິ້ງຂໍ້ມູນ"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນຂອງບັນຊີໄດ້. ຕົວຢ່າງເຊັ່ນ: ມັນຈະສາມາດກວດສອບໄດ້ແອັບຯ People ຖືກຊິ້ງຂໍ້ມູນກັບບັນຊີໃດນຶ່ງແລ້ວຫຼືຍັງ."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ສະລັບການເປີດ ແລະປິດການຊິ້ງຂໍ້ມູນ"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi ບໍ່ມີສັນຍານອິນເຕີເນັດ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ແຕະເພື່ອເບິ່ງຕົວເລືອກ"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"ການປ່ຽນແປງການຕັ້ງຄ່າຮັອດສະປອດຂອງທ່ານ"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ຄື້ນຄວາມຖີ່ຮັອດສະປອດຂອງທ່ານປ່ຽນແປງແລ້ວ."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ອຸປະກອນນີ້ບໍ່ຮອງຮັບການຕັ້ງຄ່າຂອງທ່ານສຳລັບ 5GHz ເທົ່ານັ້ນ. ແຕ່ວ່າອຸປະກອນນີ້ຈະໃຊ້ຄື້ນຄວາມຖີ່ 5GHz ເມື່ອສາມາດໃຊ້ໄດ້."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"ສະຫຼັບໄປໃຊ້ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ແລ້ວ"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"ອຸປະກອນຈະໃຊ້ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ເມື່ອ <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ. ອາດມີການຮຽກເກັບຄ່າບໍລິການ."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"ສະຫຼັບຈາກ <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ໄປໃຊ້ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ແລ້ວ"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ຜູ້ເບິ່ງແຍງລະບົບໄອທີຂອງທ່ານໄດ້ຮ້ອງຂໍເອົາລາຍງານບັນຫາເພື່ອຊ່ວຍແກ້ໄຂບັນຫາໃຫ້ອຸປະກອນນີ້. ອາດຈະມີການແບ່ງປັນແອັບ ແລະ ຂໍ້ມູນນຳ."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ແບ່ງປັນ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ປະຕິເສດ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"​ປ່ຽນ​ແປ້ນ​ພິມ"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ເລືອກຮູບແບບການປ້ອນ"</string>
<string name="show_ime" msgid="2506087537466597099">"ເປີດໃຊ້ໃຫ້ມັນຢູ່ໃນໜ້າຈໍໃນຂະນະທີ່ໃຊ້ແປ້ນພິມພາຍນອກຢູ່"</string>
<string name="hardware" msgid="194658061510127999">"ສະແດງແປ້ນພິມສະເໝືອນ"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ຕັ້ງຄ່າແປ້ນພິມພາຍນອກ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 85173516f821..e72b1a95fe8b 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lėktuvo režimas"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ĮJUNGTAS lėktuvo režimas"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"lėktuvo režimas IŠJUNGTAS"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Akumuliatoriaus tausojimo priemonė"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Akumuliatoriaus tausojimo priemonė IŠJUNGTA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Akumuliatoriaus tausojimo priemonė ĮJUNGTA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Nustatymai"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pagalba"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -282,6 +279,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Vietovė"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"pasiekti įrenginio vietovės informaciją"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Suteikti &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; galimybę pasiekti įrenginio vietovę?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Programa galės pasiekti vietovę, tik kai ją naudosite."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Visada leisti programai &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pasiekti šio įrenginio vietovę?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Programa visada galės pasiekti vietovę, net kai jos nenaudosite."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendorius"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pasiekti kalendorių"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Suteikti &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; galimybę pasiekti kalendorių?"</string>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Ši programa gali pridėti, pašalinti arba pakeisti telefone esančius kalendoriaus įvykius. Ši programa gali siųsti pranešimus, kurie atrodys atsiųsti kalendoriaus savininkų, arba pakeisti įvykius nepranešusi jų savininkams."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"pasiekti papildomas vietos teikimo įrankio komandas"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Programai leidžiama pasiekti papildomas vietovės nustatymo paslaugų teikėjų komandas. Dėl to programa gali trukdyti veikti GPS ar kitiems vietovės nustatymo šaltiniams."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"pasiekti tikslią vietą (nustatytą atsižvelgiant į GPS ir tinklą)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Ši programa gali gauti jūsų vietos informaciją naudodamasi tinklo šaltinių, pvz., mobiliojo ryšio bokštų ir „Wi-Fi“ tinklų, duomenimis. Šios vietovės paslaugos turi būti įjungtos ir pasiekiamos telefone, kad programa galėtų jas naudoti. Tai gali padidinti akumuliatoriaus energijos naudojimą."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"pasiekti tikslią vietovę, tik kai programa veikia priekiniame plane"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Ši programa gali gauti tikslius jūsų vietovės duomenis bet kuriuo metu, kai veikia priekiniame plane. Šios vietovės paslaugos turi būti įjungtos ir pasiekiamos telefone, kad programa galėtų jas naudoti. Tai gali padidinti akumuliatoriaus energijos suvartojimą."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"pasiekti apytikslę vietą (nustatytą atsižvelgiant į tinklą)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Ši programa gali gauti jūsų vietos informaciją naudodamasi tinklo šaltinių, pvz., mobiliojo ryšio bokštų ir „Wi-Fi“ tinklų, duomenimis. Šios vietovės paslaugos turi būti įjungtos ir pasiekiamos planšetiniame kompiuteryje, kad programa galėtų jas naudoti."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Ši programa gali gauti jūsų vietos informaciją naudodamasi tinklo šaltinių, pvz., mobiliojo ryšio bokštų ir „Wi-Fi“ tinklų, duomenimis. Šios vietovės paslaugos turi būti įjungtos ir pasiekiamos TV, kad programa galėtų jas naudoti."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Ši programa gali gauti jūsų vietos informaciją naudodamasi tinklo šaltinių, pvz., mobiliojo ryšio bokštų ir „Wi-Fi“ tinklų, duomenimis. Šios vietovės paslaugos turi būti įjungtos ir pasiekiamos telefone, kad programa galėtų jas naudoti."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"pasiekti tikslią vietovę, kai programa veikia fone"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Ši programa gali gauti tikslius jūsų vietovės duomenis bet kuriuo metu, kai veikia fone. Šios vietovės paslaugos turi būti įjungtos ir pasiekiamos telefone, kad programa galėtų jas naudoti. Tai gali padidinti akumuliatoriaus energijos suvartojimą."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"keisti garso nustatymus"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Leidžiama programai keisti visuotinius garso nustatymus, pvz., garsumą ir tai, kuris garsiakalbis naudojamas išvesčiai."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"įrašyti garsą"</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Kontrolinio kodo piktograma"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"tvarkyti veido autentifikavimo aparatinę įrangą"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Programai leidžiama aktyv. metodus, norint pridėti ir ištrinti naudojamus veidų šablonus."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"naudoti veido autentifikavimo aparatinę įrangą"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Programai leidžiama naudoti veido autentifikavimo aparatinę įrangą tapatybei nustatyti"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nepavyko apdoroti veido. Bandykite dar kartą."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Veidas per šviesus. Band. sumažinti apšvietimą."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Veidas per tamsus. Atidenkite apšvietimo šaltinį."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Patraukite jutiklį toliau nuo veido."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Laikykite jutiklį arčiau veido."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Pakelkite jutiklį aukščiau."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Nuleiskite jutiklį žemiau."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Patraukite jutiklį dešinėn."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Patraukite jutiklį kairėn."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Žiūrėkite į jutiklį."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Neaptikta jokių veidų."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Stabiliai laikykite veidą prieš įrenginį."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Veido atpažinimo aparatinė įranga nepasiekiama."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Baigėsi veido atpaž. skirt. laik. Band. dar kartą."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Nepavyko išsaugoti veido duomenų."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Veido atpažinimo operacija atšaukta."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Per daug bandymų. Vėliau bandykite dar kartą."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Per daug bandymų. Veido autentifik. išjungtas."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Bandykite dar kartą."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Neužregistruota jokių veidų."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Šiame įrenginyje nėra veido autentifikavimo jutiklio"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> veidas"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Veido pkt."</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"skaityti sinchronizavimo nustatymus"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Leidžiama programai skaityti ir sinchronizuoti paskyros nustatymus. Pvz., taip gali būti nustatoma, ar su paskyra sinchronizuota Žmonių programa."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"įjungti arba išjungti sinchronizavimą"</string>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"„Wi‑Fi“ tinkle nėra interneto ryšio"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Palieskite, kad būtų rodomos parinktys."</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Viešosios interneto prieigos taško nustatymų pakeitimai"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Viešosios prieigos taško dažnio juosta pasikeitė."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Šiame įrenginyje nepalaikoma tik 5 GHz nuostata. Vietoj to šiame įrenginyje bus naudojama 5 GHz dažnio juosta, kai bus pasiekiama."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Perjungta į tinklą <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Įrenginyje naudojamas kitas tinklas (<xliff:g id="NEW_NETWORK">%1$s</xliff:g>), kai dabartiniame tinkle (<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>) nėra interneto ryšio. Gali būti taikomi mokesčiai."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Perjungta iš tinklo <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> į tinklą <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Jūsų administratorius pateikė pranešimo apie riktą užklausą, kad galėtų padėti pašalinti triktis šiame įrenginyje. Programos ir duomenys gali būti bendrinami."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"BENDRINTI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ATMESTI"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Klaviatūros keitimas"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Pasirinkite įvesties metodą"</string>
<string name="show_ime" msgid="2506087537466597099">"Palikti ekrane, kol fizinė klaviatūra aktyvi"</string>
<string name="hardware" msgid="194658061510127999">"Rodyti virtualiąją klaviatūrą"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Fizinės klaviatūros konfigūravimas"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 591f320925f8..a5116e4c2229 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -239,9 +239,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Lidojuma režīms"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Lidojuma režīms ir IESLĒGTS."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Lidojuma režīms ir IZSLĒGTS."</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Akumulatora jaudas taupīšanas režīms"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Akumulatora jaudas taupīšanas režīms ir IZSLĒGTS"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Akumulatora jaudas taupīšanas režīms ir IESLĒGTS"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Iestatījumi"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Palīdzība"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Balss palīgs"</string>
@@ -279,6 +276,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Atrašanās vieta"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"piekļūt ierīces atrašanās vietas informācijai"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt šīs ierīces atrašanās vietai?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Lietotne varēs piekļūt atrašanās vietai tikai tad, kad izmantosiet šo lietotni."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vienmēr atļaut &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt atrašanās vietai?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Lietotne vienmēr varēs piekļūt atrašanās vietai, pat ja neizmantosiet šo lietotni."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendārs"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"piekļūt jūsu kalendāram"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vai atļaut lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; piekļūt jūsu kalendāram?"</string>
@@ -405,12 +405,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Šī lietotne var pievienot, noņemt vai mainīt kalendāra pasākumus jūsu tālrunī. Šī lietotne var sūtīt ziņojumus, ko šķietami sūtījuši kalendāru īpašnieki, vai mainīt pasākumus, neinformējot to īpašniekus."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"piekļūt atrašanās vietas nodrošinātāja papildu komandām"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Ļauj lietotnei piekļūt papildu atrašanās vietas noteikšanas nodrošinātāju komandām. Tas var ļaut lietotnei traucēt GPS vai citu atrašanās vietas noteikšanas avotu darbību."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"Piekļūt precīzai atrašanās vietai (izmantojot GPS un tīklu)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Šī lietotne var iegūt jūsu atrašanās vietu, pamatojoties uz GPS vai tīkla atrašanās vietas avotiem, piemēram, mobilo sakaru torņiem un Wi-Fi tīkliem. Šiem atrašanās vietu pakalpojumiem ir jābūt ieslēgtiem un pieejamiem jūsu tālrunī, lai lietotne tos varētu izmantot. Tādējādi var palielināties akumulatora patēriņš."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"piekļuve precīzai atrašanās vietai, tikai darbojoties priekšplānā"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Šī lietotne var iegūt precīzu jūsu atrašanās vietu, tikai darbojoties priekšplānā. Šiem atrašanās vietu pakalpojumiem ir jābūt ieslēgtiem un pieejamiem jūsu tālrunī, lai lietotne varētu tos izmantot. Tādējādi var palielināties akumulatora jaudas patēriņš."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"Piekļūt aptuvenai atrašanās vietai (izmantojot tīklu)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Šī lietotne var iegūt jūsu atrašanās vietu, pamatojoties uz tīkla avotiem, piemēram, mobilo sakaru torņiem un Wi-Fi tīkliem. Šiem atrašanās vietu pakalpojumiem ir jābūt ieslēgtiem un pieejamiem jūsu planšetdatorā, lai lietotne tos varētu izmantot."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Šī lietotne var iegūt jūsu atrašanās vietu, pamatojoties uz tīkla avotiem, piemēram, mobilo sakaru torņiem un Wi-Fi tīkliem. Šiem atrašanās vietu pakalpojumiem ir jābūt ieslēgtiem un pieejamiem jūsu televizorā, lai lietotne tos varētu izmantot."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Šī lietotne var iegūt jūsu atrašanās vietu, pamatojoties uz tīkla avotiem, piemēram, mobilo sakaru torņiem un Wi-Fi tīkliem. Šiem atrašanās vietu pakalpojumiem ir jābūt ieslēgtiem un pieejamiem jūsu tālrunī, lai lietotne tos varētu izmantot."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"Piekļuve precīzai atrašanās vietai, darbojoties fonā"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Šī lietotne var iegūt precīzu jūsu atrašanās vietu jebkurā laikā, darbojoties fonā. Šiem atrašanās vietu pakalpojumiem ir jābūt ieslēgtiem un pieejamiem jūsu tālrunī, lai lietotne varētu tos izmantot. Tādējādi var palielināties akumulatora jaudas patēriņš."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"mainīt audio iestatījumus"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Ļauj lietotnei mainīt globālos audio iestatījumus, piemēram, skaļumu un izejai izmantoto skaļruni."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ierakstīt audio"</string>
@@ -518,6 +520,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Pirksta nospieduma ikona"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"pārvaldīt sejas autentifikācijas aparatūru"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Atļauj lietotnei izsaukt metodes izmantojamo sejas veidņu pievienošanai un dzēšanai."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"izmantot sejas autentifikācijas aparatūru"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Atļauj lietotnei izmantot sejas autentifikācijas aparatūru autentificēšanai"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nevarēja apstrādāt sejas datus. Mēģiniet vēlreiz."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Seja ir pārāk izgaismota. Mēģiniet tumšākā vidē."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Pārāk tumšs sejas attēls. Mēģiniet gaišākā vidē."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Pavirziet sensoru tālāk no sejas."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Pavirziet sensoru tuvāk sejai."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Pavirziet sensoru augstāk."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Pavirziet sensoru zemāk."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Pavirziet sensoru pa labi."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Pavirziet sensoru pa kreisi."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Lūdzu, paskatieties uz sensoru."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nav atrasta neviena seja."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Turiet ierīci vērstu pret nekustīgu seju."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Sejas autentifikācijas aparatūra nav pieejama."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Sejas datu nolasīšanas noildze. Mēģiniet vēlreiz."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Sejas datus nevar saglabāt."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Darbība ar sejas datiem atcelta."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Par daudz mēģinājumu. Sejas atpazīšana atspējota."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Mēģiniet vēlreiz."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nav reģistrēti sejas dati."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Šai ierīcei nav sejas autentifikācijas sensora."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Seja <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Sejas ikona"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lasīt sinhronizācijas iestatījumus"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ļauj lietotnei lasīt konta sinhronizācijas iestatījumus. Piemēram, šādi var noteikt, vai lietotne Personas ir sinhronizēta ar kontu."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ieslēgt un izslēgt sinhronizāciju"</string>
@@ -1197,6 +1230,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tīklā nav piekļuves internetam."</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Pieskarieties, lai skatītu iespējas."</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Izmaiņas tīklāja iestatījumos"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ir mainīts tīklāja joslas platums."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Šajā ierīcē netiek atbalstīta jūsu preference par tikai 5 GHz joslu. 5 GHz josla ierīcē tiks izmantota, kad tā būs pieejama."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Pārslēdzās uz tīklu <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Kad vienā tīklā (<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>) nav piekļuves internetam, ierīcē tiek izmantots cits tīkls (<xliff:g id="NEW_NETWORK">%1$s</xliff:g>). Var tikt piemērota maksa."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Pārslēdzās no tīkla <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> uz tīklu <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1284,7 +1320,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administrators pieprasīja kļūdas pārskatu, lai palīdzētu novērst problēmu šajā ierīcē. Var tikt kopīgotas lietotnes un dati."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"KOPĪGOT"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"NORAIDĪT"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Tastatūras maiņa"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Ievades metodes izvēle"</string>
<string name="show_ime" msgid="2506087537466597099">"Paturēt ekrānā, kamēr ir aktīva fiziskā tastatūra"</string>
<string name="hardware" msgid="194658061510127999">"Virtuālās tastatūras rādīšana"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Fiziskās tastatūras konfigurēšana"</string>
diff --git a/core/res/res/values-mcc334-mnc03/config.xml b/core/res/res/values-mcc334-mnc03/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc334-mnc03/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc334-mnc030/config.xml b/core/res/res/values-mcc334-mnc030/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc334-mnc030/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc704-mnc03/config.xml b/core/res/res/values-mcc704-mnc03/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc704-mnc03/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc706-mnc04/config.xml b/core/res/res/values-mcc706-mnc04/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc706-mnc04/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc712-mnc04/config.xml b/core/res/res/values-mcc712-mnc04/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc712-mnc04/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc716-mnc06/config.xml b/core/res/res/values-mcc716-mnc06/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc716-mnc06/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc716-mnc10/config.xml b/core/res/res/values-mcc716-mnc10/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc716-mnc10/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc716-mnc17/config.xml b/core/res/res/values-mcc716-mnc17/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc716-mnc17/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc722-mnc07/config.xml b/core/res/res/values-mcc722-mnc07/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc722-mnc07/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc732-mnc123/config.xml b/core/res/res/values-mcc732-mnc123/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc732-mnc123/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc740-mnc00/config.xml b/core/res/res/values-mcc740-mnc00/config.xml
new file mode 100644
index 000000000000..c0d2b3598f82
--- /dev/null
+++ b/core/res/res/values-mcc740-mnc00/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Show area update info settings in CellBroadcastReceiver and information in SIM status in Settings app -->
+ <bool name="config_showAreaUpdateInfoSettings">true</bool>
+</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 66d2ef86006e..47f388debc20 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим на работа во авион"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режимот на работа во авион е вклучен"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режимот на работа во авион е исклучен"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Штедач на батерија"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Штедачот на батерија е ИСКЛУЧЕН"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Штедачот на батерија е ВКЛУЧЕН"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Поставки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Асистенција"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помош"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Локација"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"пристапува до локацијата на овој уред"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до локацијата на уредот?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Апликацијата ќе има пристап до локацијата само додека ја користите."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Дозволете &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; секогаш да пристапува до локацијата?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Апликацијата секогаш ќе има пристап до локацијата, дури и кога не ја користите."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"пристапува до календарот"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Дали да се дозволи &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; да пристапува до календарот?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Апликацијава може да додава, отстранува или менува настани во календарот на телефонот. Таа може да испраќа пораки што ќе изгледаат како да се испратени од сопствениците на календарот или да менува настани без да ги извести нивните сопственици."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"пристапи кон наредби на давателот на дополнителна локација"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Овозможува апликацијата да пристапи кон дополнителни наредби на давател на локација. Ова може да овозможи апликацијата да го попечи функционирањето на GPS или други извори на локација."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"пристап до прецизната локација (GPS и врз база на мрежа)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Апликацијава може да ја добие вашата локација од GPS или мрежните извори за локација како што се репетиторите за мобилни мрежи и Wi-Fi мрежите. Овие услуги за локација мора да се вклучени и достапни на телфонот за да може да ги користи апликацијата. Ова може да ја зголеми потрошувачката на батеријата."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"пристап до прецизната локација само во преден план"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Апликацијава може да ја добие вашата точна локација само кога е во преден план. Услугиве според локација мора да се вклучени и достапни на телефонот за да може да ги користи апликацијата. Ова може да го зголеми трошењето на батеријата."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"пристап до приближната локација (врз база на мрежа)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Апликацијава може да ја добие вашата локација од мрежните извори како што се репетиторите за мобилни мрежи и Wi-Fi мрежите. Овие услуги за локација мора да се вклучени и достапни на таблетот за да може да ги користи апликацијата."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Апликацијава може да ја добие вашата локација од мрежните извори како што се репетиторите за мобилни мрежи и Wi-Fi мрежите. Овие услуги за локација мора да се вклучени и достапни на телевизорот за да може да ги користи апликацијата."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Апликацијава може да ја добие вашата локација од мрежните извори како што се репетиторите за мобилни мрежи и Wi-Fi мрежите. Овие услуги за локација мора да се вклучени и достапни на телефонот за да може да ги користи апликацијата."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"пристап до прецизната локација во заднина"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Апликацијава може да ја добие вашата точна локација секогаш кога е во заднина. Услугиве според локација мора да се вклучени и достапни на телефонот за да може да ги користи апликацијата. Ова може да го зголеми трошењето на батеријата."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"менува аудио поставки"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Овозможува апликацијата да ги менува глобалните аудио поставки, како што се јачината на звукот и кој звучник се користи за излез."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"снимај аудио"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона за отпечатоци"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"управува со хардвер за проверка на лице"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Дозволува апликац. да повика начини за додавање и бришење шаблони на лице за користење."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"користи хардвер за проверка на лице"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Дозволува апликацијата да користи хардвер за лице за проверка"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Лицето не можеше да се обработи. Обидете се пак."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Лицето е пресветло. Пробајте на послаба светлина."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Лицето е претемно. Пробајте со поголема светлина."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Оддалечете го сензорот од лицето."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Доближете го сензорот до лицето."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Подигнете го сензорот."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Спуштете го сензорот."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Поместете го сензорот надесно."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Поместете го сензорот налево."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Погледнете во сензорот."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Не е откриено лице."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Држете го лицето стабилно пред уредот."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Хардверот за лице не е достапен."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Истече времето за проверка на лице. Повторен обид."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Лицето не може да се чува."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Операцијата со лице се откажа."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Премногу обиди. Обидете се повторно подоцна."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Премногу обиди. Проверката на лице е оневозможена."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Обидете се повторно."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Нема регистрирано лице."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Уредов нема сензор за проверка на лице"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Икона"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"чита поставки за синхронизација"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Овозможува апликацијата да ги чита поставките за синхронизирање на сметка. На пример, така може да се утврди дали апликацијата „Луѓе“ е синхронизирана со сметка."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"вклучи и исклучи синхронизација"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi нема пристап до интернет"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Допрете за опции"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Промени на поставките за точка на пристап"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Појасот за точка на пристап е променет."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Уредов не ги поддржува вашите поставки за само 5 GHz. Наместо тоа, ќе го користи појасот од 5 GHz кога е достапен."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Префрлено на <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Уредот користи <xliff:g id="NEW_NETWORK">%1$s</xliff:g> кога <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> нема пристап до интернет. Може да се наплатат трошоци."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Префрлено од <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> на <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Вашиот IT-администратор побара извештај за грешки за да ви помогне при отстранувањето грешки на уредов. Апликациите и податоците може да бидат споделени."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"СПОДЕЛИ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ОДБИЈ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Измени тастатура"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Одбери метод на внес"</string>
<string name="show_ime" msgid="2506087537466597099">"Прикажувај го на екранот додека е активна физичката тастатура"</string>
<string name="hardware" msgid="194658061510127999">"Прикажи виртуелна тастатура"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Конфигурирајте физичка тастатура"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 710493483b91..1a3556ccc369 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ഫ്ലൈറ്റ് മോഡ്"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ഫ്ലൈറ്റ് മോഡ് ഓണാണ്"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ഫ്ലൈറ്റ് മോഡ് ഓഫാണ്"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ബാറ്ററി ലാഭിക്കൽ"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ബാറ്ററി സേവർ ഓഫാണ്"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ബാറ്ററി ലാഭിക്കൽ ഓണാണ്"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ക്രമീകരണം"</string>
<string name="global_action_assist" msgid="3892832961594295030">"അസിസ്റ്റ്"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"വോയ്‌സ് സഹായം"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ലൊക്കേഷൻ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"നിങ്ങൾ ഉപയോഗിക്കുമ്പോൾ മാത്രം ആപ്പ് ലൊക്കേഷൻ ആക്‌സസ് ചെയ്യും."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ഈ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; എപ്പോഴും ആപ്പിനെ അനുവദിക്കണോ?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"നിങ്ങൾ ആപ്പ് ഉപയോഗിക്കാത്തപ്പോൾ പോലും, ഏതുസമയത്തും ആപ്പ് ലൊക്കേഷൻ ആക്‌സസ് ചെയ്യും."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"കലണ്ടർ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"നിങ്ങളുടെ കലണ്ടർ ആക്‌സസ്സ് ചെയ്യുക"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"നിങ്ങളുടെ കലണ്ടർ ആക്‌സസ് ചെയ്യാൻ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കണോ?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ഈ ആപ്പിന്, നിങ്ങളുടെ ഫോണിൽ കലണ്ടർ ഇവന്റുകൾ ചേർക്കാനോ നീക്കംചെയ്യാനോ മാറ്റാനോ കഴിയും. കലണ്ടർ ഉടമകളിൽ നിന്നാണ് വരുന്നതെന്ന് തോന്നിപ്പിക്കാവുന്ന സന്ദേശങ്ങൾ അയയ്ക്കാനോ ഉടമകളെ അറിയിക്കാതെ അവരുടെ ഇവന്റുകളെ മാറ്റാനോ ഈ ആപ്പിന് കഴിയും."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ലൊക്കേഷൻ ദാതാവിന്റെ അധിക കമാൻഡുകൾ ആക്‌സസ്സുചെയ്യുക"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ലൊക്കേഷൻ ദാതാവിന്റെ അധിക കമാൻഡുകൾ ആക്‌സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് GPS-ന്റെയോ മറ്റ് ലൊക്കേഷൻ ഉറവിടങ്ങളുടെയോ പ്രവർത്തനത്തിൽ ഇടപെടാൻ അപ്ലിക്കേഷനെ അനുവദിക്കാനിടയുണ്ട്."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"കൃത്യമായ ലൊക്കേഷൻ (GPS - നെറ്റ്‌വർക്ക് അധിഷ്ഠിതം) ആക്സസ് ചെയ്യുക"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"GPS-നെയോ സെൽ ടവറുകളും വൈഫൈ നെറ്റ്‌വർക്കുകളും പോലുള്ള നെറ്റ്‌വർക്ക് ലൊക്കേഷൻ ഉറവിടങ്ങളെയോ അടിസ്ഥാനമാക്കിക്കൊണ്ട് ഈ ആപ്പിന് നിങ്ങളുടെ ലൊക്കേഷൻ അനുമാനിക്കാൻ കഴിയും. നിങ്ങളുടെ ഫോണിൽ ഈ ലൊക്കേഷൻ സേവനങ്ങൾ ഓൺ ചെയ്തിട്ടുണ്ടെങ്കിൽ മാത്രമാണ് ആപ്പിന് അവ ഉപയോഗിക്കാൻ കഴിയുക. ഇത് ബാറ്ററി ഉപയോഗം വർദ്ധിപ്പിച്ചേക്കാം."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"ഫോർഗ്രൗണ്ടിൽ മാത്രം കൃത്യമായ ലൊക്കേഷൻ ആക്‌സസ് ചെയ്യുക"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"ഫോർഗ്രൗണ്ടിൽ ഉള്ളപ്പോൾ മാത്രമേ ഈ ആപ്പിന് നിങ്ങളുടെ കൃത്യമായ ലൊക്കേഷൻ നേടാനാവൂ. ആപ്പിന് ഉപയോഗിക്കാനായി, ഈ ലൊക്കേഷൻ സേവനങ്ങൾ ഓണായിരിക്കുകയും നിങ്ങളുടെ ഫോണിൽ ലഭ്യമാവുകയും വേണം. ഇതിലൂടെ ബാറ്ററി ഉപഭോഗം വർദ്ധിച്ചേക്കാം."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ഏകദേശ ലൊക്കേഷൻ (നെറ്റ്‌വർക്ക് അധിഷ്ഠിതം) ആക്സസ് ചെയ്യുക"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"സെൽ ടവറുകളും വൈഫൈ നെറ്റ്‌വർക്കുകളും പോലുള്ള നെറ്റ്‌വർക്ക് ഉറവിടങ്ങളെ അടിസ്ഥാനമാക്കിക്കൊണ്ട് ഈ ആപ്പിന് നിങ്ങളുടെ ലൊക്കേഷൻ അനുമാനിക്കാൻ കഴിയും. നിങ്ങളുടെ ടാബ്‌ലെറ്റിൽ ഈ ലൊക്കേഷൻ സേവനങ്ങൾ ഓൺ ചെയ്തിട്ടുണ്ടെങ്കിൽ മാത്രമാണ് ആപ്പിന് അവ ഉപയോഗിക്കാൻ കഴിയുക."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"സെൽ ടവറുകളും വൈഫൈ നെറ്റ്‌വർക്കുകളും പോലുള്ള നെറ്റ്‌വർക്ക് ഉറവിടങ്ങളെ അടിസ്ഥാനമാക്കിക്കൊണ്ട് ഈ ആപ്പിന് നിങ്ങളുടെ ലൊക്കേഷൻ അനുമാനിക്കാൻ കഴിയും. നിങ്ങളുടെ ടിവിയിൽ ഈ ലൊക്കേഷൻ സേവനങ്ങൾ ഓൺ ചെയ്തിട്ടുണ്ടെങ്കിൽ മാത്രമാണ് ആപ്പിന് അവ ഉപയോഗിക്കാൻ കഴിയുക."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"സെൽ ടവറുകളും വൈഫൈ നെറ്റ്‌വർക്കുകളും പോലുള്ള നെറ്റ്‌വർക്ക് ഉറവിടങ്ങളെ അടിസ്ഥാനമാക്കിക്കൊണ്ട് ഈ ആപ്പിന് നിങ്ങളുടെ ലൊക്കേഷൻ അനുമാനിക്കാൻ കഴിയും. നിങ്ങളുടെ ഫോണിൽ ഈ ലൊക്കേഷൻ സേവനങ്ങൾ ഓൺ ചെയ്തിട്ടുണ്ടെങ്കിൽ മാത്രമാണ് ആപ്പിന് അവ ഉപയോഗിക്കാൻ കഴിയുക."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"പശ്ചാത്തലത്തിൽ കൃത്യമായ ലൊക്കേഷൻ ആക്‌സസ് ചെയ്യുക"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"ഈ ആപ്പ് പശ്ചാത്തലത്തിൽ ഉള്ളപ്പോൾ എപ്പോൾ വേണമെങ്കിലും ഇതിന് നിങ്ങളുടെ കൃത്യമായ ലൊക്കേഷൻ നേടാനാവും. ആപ്പിന് ഉപയോഗിക്കാനായി, ഈ ലൊക്കേഷൻ സേവനങ്ങൾ ഓണായിരിക്കുകയും നിങ്ങളുടെ ഫോണിൽ ലഭ്യമാവുകയും വേണം. ഇതിലൂടെ ബാറ്ററി ഉപഭോഗം വർദ്ധിച്ചേക്കാം."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"നിങ്ങളുടെ ഓഡിയോ ക്രമീകരണങ്ങൾ മാറ്റുക"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"വോളിയവും ഔട്ട്പുട്ടിനായി ഉപയോഗിച്ച സ്‌പീക്കറും പോലുള്ള ആഗോള ഓഡിയോ ക്രമീകരണങ്ങൾ പരിഷ്‌ക്കരിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുക"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"വിരലടയാള ഐക്കൺ"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ മാനേജ് ചെയ്യുക"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ഉപയോഗിക്കാനായി, മുഖത്തിന്റെ ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ ഉപയോഗിക്കുക"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"പരിശോധിച്ചുറപ്പിക്കലിനായി മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ ഉപയോഗിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"മുഖം പ്രോസസ്സ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"മുഖം വളരെ തെളിച്ചമുള്ളതാണ്. കുറഞ്ഞ വെളിച്ചത്തിൽ ശ്രമിക്കുക."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"മുഖം വളരെ ഇരുണ്ടതാണ്. പ്രകാശ ലഭ്യത ഉറപ്പാക്കി ശ്രമിക്കുക."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"മുഖത്തിനടുത്തുനിന്ന് സെൻസർ അകലേയ്ക്ക് നീക്കുക."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"സെൻസർ മുഖത്തിനടുത്തേയ്ക്ക് കൊണ്ടുവരിക."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"സെൻസർ മുകളിലേക്ക് നീക്കുക."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"സെൻസർ താഴേയ്ക്ക് നീക്കുക."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"സെൻസർ വലത്തേയ്ക്ക് നീക്കുക."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"സെൻസർ ഇടത്തേയ്ക്ക് നീക്കുക."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"സെൻസറിലേക്ക് നോക്കുക."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"മുഖം കണ്ടെത്താനായില്ല."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ഉപകരണത്തിന് മുന്നിൽ മുഖം ഇളകാതെ നേരെ നിറുത്തുക."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"മുഖത്തിന്റെ ഹാർഡ്‌വെയർ ലഭ്യമല്ല."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"മുഖം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"മുഖം സൂക്ഷിക്കാനാവില്ല."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"നിരവധി തവണ ശ്രമിച്ചു. മുഖം തിരിച്ചറിയൽ പ്രവർത്തനരഹിതമാക്കി."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"ഒരു മുഖവും എൻറോൾ ചെയ്‌തിട്ടില്ല."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ഈ ഉപകരണത്തിന് മുഖം തിരിച്ചറിയാനാവുന്ന സെൻസർ ഇല്ല"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"മുഖം <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"മുഖത്തിന്റെ ഐക്കൺ"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യുക"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ഒരു അക്കൗണ്ടിനായി സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉദാഹരണത്തിന്, ആളുകൾ അപ്ലിക്കേഷൻ ഒരു അക്കൗണ്ടിൽ സമന്വയിപ്പിച്ചിട്ടുണ്ടോയെന്നത് നിർണ്ണയിക്കാൻ ഇതിനാകും."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"സമന്വയം ഓണാക്കുക, ഓഫാക്കുക ടോഗിൾചെയ്യുക"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"വൈഫൈയ്ക്ക് ഇന്റർനെറ്റ് ആക്‌സസ് ഇല്ല"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"നിങ്ങളുടെ ഹോട്ട്‌സ്‌പോട്ട് ക്രമീകരണത്തിൽ വരുത്തിയ മാറ്റങ്ങൾ"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"നിങ്ങളുടെ ഹോട്ട്‌സ്‌പോട്ട് ബാൻഡ് മാറി."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"നിങ്ങളുടെ മുൻഗണനയനുസരിച്ചുള്ള, 5GHz മാത്രം എന്നത് ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല. പകരം, 5GHz ബാൻഡ് ലഭ്യമാകുമ്പോൾ അത് ഉപയോഗിക്കും."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> എന്നതിലേക്ക് മാറി"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>-ന് ഇന്റർനെറ്റ് ആക്‌സസ് ഇല്ലാത്തപ്പോൾ ഉപകരണം <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ഉപയോഗിക്കുന്നു. നിരക്കുകൾ ബാധകമായേക്കാം."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> നെറ്റ്‌വർക്കിൽ നിന്ന് <xliff:g id="NEW_NETWORK">%2$s</xliff:g> നെറ്റ്‌വർക്കിലേക്ക് മാറി"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ഈ ഉപകരണത്തിലെ പ്രശ്നം പരിഹരിക്കുന്നതിന് നിങ്ങളുടെ അഡ്‌മിൻ ഒരു ബഗ് റിപ്പോർട്ട് അഭ്യർത്ഥിച്ചു. ആപ്‌സും ഡാറ്റയും പങ്കിടപ്പെട്ടേക്കും."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"പങ്കിടുക"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"നിരസിക്കുക"</string>
- <string name="select_input_method" msgid="8547250819326693584">"കീബോഡ് മാറ്റുക"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ഇൻപുട്ട് രീതി തിരഞ്ഞെടുക്കുക"</string>
<string name="show_ime" msgid="2506087537466597099">"ഫിസിക്കൽ കീബോർഡ് സജീവമായിരിക്കുമ്പോൾ സ്ക്രീനിൽ നിലനിർത്തുക"</string>
<string name="hardware" msgid="194658061510127999">"വെർച്വൽ കീബോർഡ് കാണിക്കുക"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ഫിസിക്കൽ കീബോർഡ് കോൺഫിഗർ ചെയ്യുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 9a6c17438421..2a30fcb044a8 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Нислэгийн горим"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Нислэгийн горим асав"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Нислэгийн горим унтарсан"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Батарей хэмнэгч"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Тэжээл хэмнэгч УНТРААЛТТАЙ байна"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Тэжээл хэмнэгч АСААЛТТАЙ байна"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Тохиргоо"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Туслах"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Дуут туслах"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Байршил"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"энэ төхөөрөмжийн байршилд хандалт хийх"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д энэ төхөөрөмжийн байршилд хандахыг зөвшөөрөх үү?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Та аппыг зөвхөн хэрэглэж байгаа үед апп нь байршилд хандах болно."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д энэ төхөөрөмжийн байршилд хандахыг байнга зөвшөөрөх үү?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Та энэ аппыг хэрэглээгүй байсан ч апп нь байршилд үргэлж хандах болно."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Хуанли"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"Хуанли руу хандах"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д таны календарьт хандахыг зөвшөөрөх үү?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Энэ апп таны утсанд хуанлийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь хуанли эзэмшигчээс зурвас илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"байршил нийлүүлэгчийн нэмэлт тушаалд хандах"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Апп нь байршил нийлүүлэгчийн нэмэлт тушаалд хандах боломжтой. Энэ нь апп-д GPS эсвэл бусад байршлын үйлчилгээний ажиллагаанд нөлөөлөх боломжийг олгоно."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"тодорхой байршилд хандах (GPS, сүлжээнд суурилсан)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Энэ апп GPS, эсвэл үүрэн цамхаг, Wi-Fi сүлжээ зэрэг сүлжээний байршлын эх сурвалжийг ашиглан таны байршлыг мэдэх боломжтой. Эдгээр байршлын үйлчилгээ нь таны утсанд асаалттай байх ёстой ба апп ашиглах боломжтой байх ёстой. Энэ нь батерей зарцуулалтыг нэмэгдүүлнэ."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"нарийвчилсан байршилд зөвхөн нүүр хэсэгт хандах"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Энэ апп нь зөвхөн нүүр хэсэгт байх үедээ л таны байршлыг нарийн тогтоох боломжтой. Апп эдгээр байршлын үйлчилгээг ашиглахын тулд эдгээрийг таны утсан дээр асааж идэвхтэй байлгах шаардлагатай. Энэ нь батарейны хэрэглээг ихэсгэж болзошгүй."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ойролцоох байршилд хандах (сүлжээнд суурилсан)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Энэ апп үүрэн цамхаг, Wi-Fi сүлжээ зэрэг сүлжээний байршлын эх сурвалжийг ашиглан таны байршлыг мэдэх боломжтой. Эдгээр байршлын үйлчилгээ нь таны таблетад асаалттай байх ёстой ба апп ашиглах боломжтой байх ёстой."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Энэ апп үүрэн цамхаг, Wi-Fi сүлжээ зэрэг сүлжээний байршлын эх сурвалжийг ашиглан таны байршлыг мэдэх боломжтой. Эдгээр байршлын үйлчилгээ нь таны ТВ-д асаалттай байх ёстой ба апп ашиглах боломжтой байх ёстой."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Энэ апп үүрэн цамхаг, Wi-Fi сүлжээ зэрэг сүлжээний байршлын эх сурвалжийг ашиглан таны байршлыг мэдэх боломжтой. Эдгээр байршлын үйлчилгээ нь таны утсанд асаалттай байх ёстой ба апп ашиглах боломжтой байх ёстой."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"нарийвчилсан байршилд арын дэвсгэрт хандах"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Энэ апп нь ард ажиллах үедээ таны байршлыг ямар ч үед нарийн тогтоох боломжтой. Апп эдгээр байршлын үйлчилгээг ашиглахын тулд эдгээрийг таны утсан дээр асааж идэвхтэй байлгах шаардлагатай. Энэ нь батарейны хэрэглээг ихэсгэж болзошгүй."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"Аудио тохиргоо солих"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Апп нь дууны хэмжээ, спикерын гаралтад ашиглагдах глобал аудио тохиргоог өөрчлөх боломжтой."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"аудио бичих"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Хурууны хээний дүрс"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"царай танилтын техник хангамжийг удирдах"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Аппад царайны загварыг ашиглахын тулд нэмэх эсвэл устгах аргыг идэвхжүүлэхийг зөвшөөрдөг."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"царай танилтын техник хангамжийг ашиглах"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Аппад царай танилтын техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Царайг таньж чадсангүй. Дахин оролдоно уу."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Царай хэт цайвар байна. Гэрэл багатай газар оролдож үзнэ үү."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Царай хэт бараан байна. Гэрэлтэй газар туршиж үзнэ үү."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Мэдрэгчийг царайнаас холдуулна уу."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Mэдрэгчийг царайтай ойртуулна уу."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Мэдрэгчийг дээшлүүлнэ үү."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Mэдрэгчийг доошлуулна уу."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Мэдрэгчийг баруун тийш болгоно уу."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Мэдрэгчийг зүүн тийш болгоно уу."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Мэдрэгч рүү харна уу."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Царай олдсонгүй."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Царайг төхөөрөмжийн урд талд хөдөлгөөнгүй байлгана уу."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Царайны техник хангамж боломжгүй байна."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Царай таниулах хугацаа дууслаа. Дахин оролдоно уу."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Царайг хадгалах боломжгүй байна."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Царайны үйл ажиллагааг цуцаллаа."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Хэт олон удаа оролдлоо. Царай танилтыг идэвхгүй болголоо."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Дахин оролдоно уу."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Бүртгүүлсэн царай алга."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Энэ төхөөрөмжид царай таних мэдрэгч алга"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Царай <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Царайны дүрс тэмдэг"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"синк тохиргоог унших"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Апп нь бүртгэлийн синк тохиргоог унших боломжтой. Жишээ нь энэ нь Хүмүүс апп бүртгэлтэй синк хийгдсэн эсэхийг тодорхойлох боломжтой."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"синкийг унтрааж асаах тохиргоо"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-д интернет хандалт алга"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Сонголт хийхийн тулд товшино уу"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Таны сүлжээний цэгийн тохиргооны өөрчлөлт"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Таны сүлжээний цэгийн зурвасыг өөрчилсөн."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Энэ төхөөрөмж таны \"зөвхөн 5Гц\" гэсэн давуу сонголтыг дэмждэггүй. Үүний оронд энэ төхөөрөмж 5Гц зурвасыг боломжтой үед нь ашиглах болно."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> руу шилжүүлсэн"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> интернет холболтгүй үед төхөөрөмж <xliff:g id="NEW_NETWORK">%1$s</xliff:g>-г ашигладаг. Төлбөр гарч болзошгүй."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>-с <xliff:g id="NEW_NETWORK">%2$s</xliff:g> руу шилжүүлсэн"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Энэ төхөөрөмжийн асуудлыг шийдвэрлэхийн тулд таны админд алдааны тайлан шаардлагатай. Апп болон өгөгдлийг хуваалцаж болзошгүй."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ХУВААЛЦАХ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ТАТГАЛЗАХ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Гарыг өөрчлөх"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Оруулах аргыг сонгоно уу"</string>
<string name="show_ime" msgid="2506087537466597099">"Бодит гар идэвхтэй үед үүнийг дэлгэцэнд харуулна уу"</string>
<string name="hardware" msgid="194658061510127999">"Хийсвэр гарыг харуулах"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Биет гарыг хэлбэрт оруулах"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index a6c686d8e819..27f64775d2c9 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"विमान मोड"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"विमान मोड चालू आहे"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"विमान मोड बंद आहे"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"बॅटरी बचतकर्ता"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"बॅटरी बचतकर्ता बंद आहे"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"बॅटरी बचतकर्ता सुरू आहे"</string>
<string name="global_action_settings" msgid="1756531602592545966">"सेटिंग्ज"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहाय्यता"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"व्हॉइस सहाय्य"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"या डिव्हाइसच्या स्थानावर प्रवेश"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला या डिव्हाइसचे स्थान अॅक्सेस करू द्यायचे?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"तुम्ही अॅप वापरत असताना, अॅपला फक्त स्थानाचा अॅक्सेस असेल."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"या डिव्हाइसचे स्थान अॅक्सेस करण्याची &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला नेहेमी अनुमती द्यायची का?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"तुम्ही अॅप वापरत नसलात तरीही, अॅपला स्थानाचा नेहेमी अॅक्सेस असेल."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कॅलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"आपल्या कॅलेंडरवर प्रवेश"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला तुमचे कॅलेंडर अॅक्सेस करू द्यायचे?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"हा अॅप आपल्या फोनवर कॅलेंडर इव्हेंट जोडू, काढू किंवा बदलू शकतो. हा अॅप कॅलेंडर मालकांकडून येत आहेत असे वाटणारे मेसेज पाठवू किंवा त्यांच्या मालकांना सूचित केल्याशिवाय इव्हेंट बदलू शकतो."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"अतिरिक्त स्थान प्रदाता आदेश अॅक्सेस करा"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"अ‍ॅपला अतिरिक्त स्‍थान प्रदाता आदेशावर प्रवेश करण्‍याची अनुमती देते. हे कदाचित अ‍ॅपला GPS किंवा इतर स्‍थान स्त्रोत च्या ऑपरेशनमध्‍ये हस्तक्षेप करण्‍याची अनुमती देऊ शकते."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"अचूक स्थानामध्ये (GPS आणि नेटवर्क-आधारित) अॅक्सेस करा"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"हा अॅप सेल टॉवर आणि वाय-फाय नेटवर्क सारख्या GPS किंवा नेटवर्क स्रोतांच्या आधारावर तुमचे स्थान मिळवू शकतो. या स्थान सेवा वापरण्यास सक्षम असण्यासाठी त्या तुमच्या फोनवर चालू केलेल्या आणि उपलब्ध असणे आवश्यक आहे. हे बॅटरी वापर वाढवू शकते."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"फक्त फोरग्राउंडमध्ये अचूकपणे अ‍ॅक्सेस करा"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"हे अ‍ॅप फक्त फोरग्राउंडमध्ये असतानाच तुमचे अचूक स्थान मिळवू शकते. या स्थान सेवा सुरू करणे आणि त्या वापरण्यासाठी अ‍ॅपसाठी तुमच्या फोनवर उपलब्ध करणे आवश्यक आहे, यामुळे बॅटरी वापर वाढू शकतो."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"अंदाजे स्‍थानामध्ये (नेटवर्क-आधारित) अॅक्सेस करा"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"हा अॅप सेल टॉवर आणि वाय-फाय नेटवर्क सारख्या नेटवर्क स्रोतांच्या आधारावर तुमचे स्थान मिळवू शकतो. अॅपला या स्थान सेवा वापरण्यास सक्षम असण्यासाठी तुमच्या टॅब्लेटवर त्या चालू केलेल्या आणि उपलब्ध असणे आवश्यक आहे."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"हा अॅप सेल टॉवर आणि वाय-फाय नेटवर्क सारख्या नेटवर्क स्रोतांच्या आधारावर तुमचे स्थान मिळवू शकतो. अॅपला या स्थान सेवा वापरण्यास सक्षम असण्यासाठी तुमच्या टीव्हीवर त्या चालू केलेल्या आणि उपलब्ध असणे आवश्यक आहे."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"हा अॅप सेल टॉवर आणि वाय-फाय नेटवर्क सारख्या नेटवर्क स्रोतांच्या आधारावर तुमचे स्थान मिळवू शकतो. अॅपला या स्थान सेवा वापरण्यास सक्षम असण्यासाठी तुमच्या फोनवर त्या चालू केलेल्या आणि उपलब्ध असणे आवश्यक आहे."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"बॅकग्राउंडमध्ये अचूक स्थान अ‍ॅक्सेस करा"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"हे अ‍ॅप बॅकग्राउंडमध्ये असताना अचूक स्थान कधीही मिळवू शकते. या स्थान सेवा सुरू करणे आणि त्या वापरण्यासाठी अ‍ॅपसाठी तुमच्या फोनवर उपलब्ध करणे आवश्यक आहे, यामुळे बॅटरी वापर वाढू शकतो."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"आपल्या ऑडिओ सेटिंग्ज बदला"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"व्हॉल्यूम आणि आउटपुटसाठी कोणता स्पीकर वापरला आहे यासारख्या समग्र ऑडिओ सेटिंग्ज सुधारित करण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ऑडिओ रेकॉर्ड"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फिंगरप्रिंट आयकन"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"चेहरा ऑथेंटिकेशन हार्डवेअर व्यवस्थापित करा"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"अॅपला वापरासाठी चेहरा टेम्पलेट जोडण्याच्या आणि हटवण्याच्या पद्धती जारी करू देते."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"चेहरा ऑथेंटिकेशन हार्डवेअर वापरा"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"अॅपला चेहरा ऑथेंटिकेशनसाठी ऑथेंटिकेशन हार्डवेअर वापरू देते"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"चेहऱ्यावर प्रक्रिया झाली नाही. पुन्हा प्रयत्न करा."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"चेहऱ्यावर खूप प्रकाश आहे. कृपया कमी प्रकाशात प्रयत्न करा."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"चेहऱ्यावर खूप अंधार आहे. कृपया प्रकाश स्रोत खुला करा."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"कृपया सेन्सर चेहऱ्यापासून आणखी दूर हलवा."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"कृपया सेन्सर चेहऱ्याच्या आणखी जवळ आणा."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"कृपया सेन्सर आणखी वर हलवा."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"कृपया सेन्सर आणखी खाली हलवा."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"कृपया सेन्सर उजवीकडे हलवा."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"कृपया सेन्सर डावीकडे हलवा."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"कृपया सेन्सरकडे पहा."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"चेहरा आढळला नाही."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"डिव्हाइसच्या समोर चेहरा स्थिर ठेवा."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"चेहरा हार्डवेअर उपलब्ध नाही."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"चेहरा टाइमआउट झाला. पुन्हा प्रयत्न करा."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"चेहरा स्टोअर केला जाऊ शकत नाही."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"चेहरा ऑपरेशन रद्द केले गेले."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"खूप जास्त प्रयत्न केले. नंतर पुन्हा प्रयत्न करा."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"खूप जास्त प्रयत्न केले. चेहरा ऑथेंटिकेशन बंद केले गेले."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"पुन्हा प्रयत्न करा."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"चेहरा नोंदवलेला नाही."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"या डिव्हाइसमध्ये चेहरा ऑथेंटिकेशन सेन्सर नाही"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"चेहरा आयकन"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"सिंक सेटिंग्‍ज वाचा"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"खात्याच्या सिंक सेटिंग्ज वाचण्यासाठी अॅप ला अनुमती देते. उदाहरणार्थ, हे खात्यासह लोकांचा अॅप संकालित केला आहे किंवा नाही हे निर्धारित करू शकते."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"सिंक चालू आणि बंद करा टॉगल करा"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"वाय-फाय ला इंटरनेटचा अॅक्सेस नाही"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"पर्यायांसाठी टॅप करा"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"तुमच्या हॉटस्पॉट सेटिंग्जमधील बदल"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"तुमचा हॉटस्पॉट बँड बदलला आहे."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"हे डिव्हाइस तुमच्या फक्त ५GHz साठी प्राधान्याला सपोर्ट करत नाही. त्याऐवजी, हे डिव्हाइस ५GHz बँड उपलब्ध असताना वापरेल."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> वर स्विच केले"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> कडे इंटरनेटचा अॅक्सेस नसताना डिव्हाइस <xliff:g id="NEW_NETWORK">%1$s</xliff:g> वापरते. शुल्क लागू शकते."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> वरून <xliff:g id="NEW_NETWORK">%2$s</xliff:g> वर स्विच केले"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"आपल्या प्रशासकाने या डिव्हाइसचे समस्या निवारण करण्यात मदत करण्यासाठी दोष अहवालाची विनंती केली. अॅप्स आणि डेटा शेअर केले जाऊ शकतात."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"शेअर करा"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"नकार द्या"</string>
- <string name="select_input_method" msgid="8547250819326693584">"कीबोर्ड बदला"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"इनपुट पद्धत निवडा"</string>
<string name="show_ime" msgid="2506087537466597099">"भौतिक कीबोर्ड सक्रिय असताना त्यास स्क्रीनवर ठेवा"</string>
<string name="hardware" msgid="194658061510127999">"व्हर्च्युअल कीबोर्ड दर्शवा"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"वास्तविक कीबोर्ड कॉन्फिगर करा"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f849e112546c..b2f10c11c262 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mod pesawat"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Mod Pesawat DIHIDUPKAN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Mod Pesawat DIMATIKAN"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Penjimat bateri"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Penjimat bateri DIMATIKAN"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Penjimat Bateri DIHIDUPKAN"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Tetapan"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Bantu"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasi"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"mengakses lokasi peranti ini"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses lokasi peranti ini?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Apl ini hanya dapat mengakses lokasi semasa anda menggunakan apl tersebut."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Sentiasa benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses lokasi peranti ini?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Apl ini akan dapat mengakses lokasi pada sepanjang masa, meskipun apabila anda tidak menggunakan apl tersebut."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"mengakses kalendar"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Benarkan &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mengakses kalendar anda?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Apl ini boleh menambah, mengalih keluar atau mengubah acara kalendar pada telefon anda. Apl ini boleh menghantar mesej yang mungkin kelihatan seperti dihantar oleh pemilik kalendar atau mengubah acara tanpa memaklumi pemilik acara itu."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"akses perintah tambahan pembekal lokasi"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Membenarkan apl mengakses arahan pembekal lokasi tambahan. Ini boleh membenarkan apl untuk campur tangan dengan operasi GPS atau sumber lokasi lain."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"akses lokasi tepat (GPS dan berasaskan rangkaian)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Apl ini boleh mendapatkan lokasi anda berdasarkan sumber rangkaian seperti menara selular dan rangkaian Wi-Fi. Perkhidmatan lokasi ini mesti dihidupkan dan tersedia pada telefon anda untuk membolehkan apl menggunakan perkhidmatan tersebut. Hal ini mungkin meningkatkan penggunaan bateri."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"akses lokasi tepat hanya di latar depan"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Apl ini boleh mendapatkan lokasi tepat anda hanya apabila apl tersebut berada di latar depan. Perkhidmatan lokasi ini mesti dihidupkan dan tersedia pada telefon anda untuk membolehkan apl menggunakan perkhidmatan tersebut. Tindakan ini mungkin meningkatkan penggunaan bateri."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"akses lokasi anggaran (berasaskan rangkaian)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Apl ini boleh mendapatkan lokasi anda berdasarkan sumber rangkaian seperti menara selular dan rangkaian Wi-Fi. Perkhidmatan lokasi ini mesti dihidupkan dan tersedia pada tablet anda untuk membolehkan apl menggunakan perkhidmatan tersebut."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Apl ini boleh mendapatkan lokasi anda berdasarkan sumber rangkaian seperti menara selular dan rangkaian Wi-Fi. Perkhidmatan lokasi ini mesti dihidupkan dan tersedia pada TV anda untuk membolehkan apl menggunakan perkhidmatan tersebut."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Apl ini boleh mendapatkan lokasi anda berdasarkan sumber rangkaian seperti menara selular dan rangkaian Wi-Fi. Perkhidmatan lokasi ini mesti dihidupkan dan tersedia pada telefon anda untuk membolehkan apl menggunakan perkhidmatan tersebut."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"akses lokasi tepat di latar belakang"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Apl ini boleh mendapatkan lokasi tepat anda setiap kali apl tersebut berada di latar belakang. Perkhidmatan lokasi ini mesti dihidupkan dan tersedia pada telefon anda untuk membolehkan apl menggunakan perkhidmatan tersebut. Tindakan ini mungkin meningkatkan penggunaan bateri."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"tukar tetapan audio anda"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Membenarkan apl untuk mengubah suai tetapan audio global seperti kelantangan dan pembesar suara mana digunakan untuk output."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"rakam audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon cap jari"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"urus perkakasan pengesahan wajah"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat wajah untuk digunakan."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gunakan perkakasan pengesahan wajah"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Membenarkan apl menggunakan perkakasan pengesahan wajah untuk pengesahan"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Tidak dapat memproses wajah. Sila cuba lagi."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Wajah terlalu cerah. Cuba dlm cahaya lebih rendah."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Wajah terlalu gelap. Sila buka sumber cahaya."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Sila alihkan penderia lebih jauh dari wajah."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Sila dekatkan penderia ke wajah."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Sila alihkan penderia ke kedudukan lebih tinggi."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Sila alihkan penderia ke kedudukan lebih rendah."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Sila alihkan penderia ke kanan."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Sila alihkan penderia ke kiri."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Sila lihat penderia."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Tiada wajah dikesan."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Pastikan wajah tidak bergerak di hadapan peranti."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Perkakasan wajah tidak tersedia."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Tamat masa wajah dicapai. Cuba lagi."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Wajah tidak dapat disimpan."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Pengendalian wajah dibatalkan."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percubaan. Cuba sebentar lagi."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Terlalu banyak percubaan. Pengesahan wajah dilumpuhkan."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Cuba lagi."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Tiada wajah didaftarkan."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Peranti ini tiada penderia pengesahan wajah"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Wajah <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikon wajah"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"membaca tetapan penyegerakan"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Membenarkan apl membaca tetapan segerak untuk akaun. Sebagai contoh, ini boleh menentukan sama ada apl Orang disegerakkan dengan akaun."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"togol segerak hidup dan mati"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tiada akses Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ketik untuk mendapatkan pilihan"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Perubahan kepada tetapan tempat liputan anda"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Jalur tempat liputan anda telah berubah."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Peranti ini tidak menyokong pilihan anda untuk 5GHz sahaja. Sebaliknya, peranti ini akan menggunakan jalur 5GHz apabila tersedia."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Beralih kepada <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Peranti menggunakan <xliff:g id="NEW_NETWORK">%1$s</xliff:g> apabila <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> tiada akses Internet. Bayaran mungkin dikenakan."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Beralih daripada <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> kepada <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Pentadbir anda meminta laporan pepijat untuk menyelesaikan masalah peranti ini. Apl dan data mungkin dikongsi."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"KONGSI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"TOLAK"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Tukar papan kekunci"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Pilih kaedah input"</string>
<string name="show_ime" msgid="2506087537466597099">"Pastikannya pada skrin, semasa papan kekunci fizikal aktif"</string>
<string name="hardware" msgid="194658061510127999">"Tunjukkan papan kekunci maya"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurasikan papan kekunci fizikal"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 150fe8bf37c3..f311ab372b55 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ဖွင့်ထားသည်"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ပိတ်ထားသည်"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ဘက်ထရီ ချွေတာမှုစနစ်"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ဘက်ထရီချွေတာခြင်းမုဒ်ကို ပိတ်ထားသည်"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ဘက်ထရီချွေတာခြင်းမုဒ်ကို ဖွင့်ထားသည်"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ဆက်တင်များ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"အကူအညီ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"အသံ အကူအညီ"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"တည်နေရာ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ဤစက်ပစ္စည်း၏ တည်နေရာကို ရယူရန်"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား ဤစက်ပစ္စည်း၏တည်နေရာကို သုံးခွင့်ပေးလိုပါသလား။"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"အက်ပ်ကိုအသုံးပြုသည့် အချိန်တွင်သာ ၎င်းကတည်နေရာကို အသုံးပြုခွင့်ရပါမည်။"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား ဤစက်ပစ္စည်း၏တည်နေရာကို အမြဲ အသုံးပြုခွင့်ပေးလိုပါသလား။"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"သင် အက်ပ်ကိုအသုံးပြုမနေသော်လည်း ၎င်းကတည်နေရာကို အမြဲ အသုံးပြုခွင့်ရနေပါမည်။"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ပြက္ခဒိန်"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"သင့်ပြက္ခဒိန်အား ဝင်ရောက်သုံးရန်"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; အား သင်၏ပြက္ခဒိန်ကို သုံးခွင့်ပေးလိုပါသလား။"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ဤအက်ပ်သည် သင့်ဖုန်းပေါ်ရှိ ပြက္ခဒိန်ဖြစ်ရပ်များကို ထည့်ခြင်း၊ ဖယ်ရှားခြင်း သို့မဟုတ် ပြောင်းလဲခြင်းတို့ ပြုလုပ်နိုင်ပါသည်။ ဤအက်ပ်သည် ပြက္ခဒိန်ပိုင်ရှင်များမှ လာခြင်းဖြစ်နိုင်သည့် မက်ဆေ့ဂျ်များကို ပို့နိုင်ပြီး ပိုင်ရှင်များကို အသိမပေးဘဲ ဖြစ်ရပ်များကို ပြောင်းလဲနိုင်ပါသည်။"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"တည်နေရာပံ့ပိုးမှုညွှန်ကြားချက်အပိုအား ဝင်ရောက်ကြည့်ခြင်း"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"အက်ပ်အား တည်နေရာ စီမံပေးရေး ညွှန်ကြားချက် အပိုများကို ရယူခွင့်ပြုသည်။ သို့ဖြစ်၍ အက်ပ်သည် GPS သို့မဟုတ် အခြား တည်နေရာ ရင်းမြစ်ကို သုံးကြသူတို့၏ လုပ်ငန်းများကို ဝင်စွက်ခွင့် ပြုနိုင်သည်။"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"တိကျတဲ့ တည်နေရာ (GPS နှင့် ကွန်ရက် အခြေခံ)ကို ရယူသုံးရန်"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ဤအက်ပ်သည် ဆဲလ်တာဝါများနှင့် Wi-Fi ကွန်ရက်များကဲ့သို့ GPS သို့မဟုတ် ကွန်ရက်တည်နေရာ အရင်းအမြစ်ပေါ် အခြေခံပြီး သင့်တည်နေရာအချက်အလက်ကို ရယူနိုင်ပါသည်။ အက်ပ်က အသုံးပြုနိုင်ရန်အတွက် ဤတည်နေရာ ဝန်ဆောင်မှုများကို ဖွင့်ထားရမည် ဖြစ်ပြီး သင့်ဖုန်းပေါ်တွင် ရရှိနိုင်ရပါမည်။ ၎င်းသည် ဘက်ထရီကို ပိုမိုအသုံးပြုနိုင်ပါသည်။"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"မျက်နှာစာတွင်သာ တည်နေရာအတိအကျ အသုံးပြုခြင်း"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"မျက်နှာစာတွင် ဖွင့်ထားမှသာ ဤအက်ပ်က သင်၏တည်နေရာအတိအကျကို ရယူနိုင်ပါသည်။ သင်၏ဖုန်းတွင် အက်ပ်ကအသုံးပြုရန်အတွက် ဤတည်နေရာဝန်ဆောင်မှုများကို ဖွင့်ထားပြီး အသုံးပြု၍ ရပါမည်။ ၎င်းက ဘက်ထရီ ပိုကုန်နိုင်ပါသည်။"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"အနီးစပ်ဆုံး တည်နေရာ (ကွန်ရက် အခြေခံ)ကို ရယူသုံးရန်"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ဤအက်ပ်သည် ဆဲလ်တာဝါများနှင့် Wi-Fi ကွန်ရက်များကဲ့သို့ ကွန်ရက်အရင်းအမြစ်ပေါ် အခြေခံပြီး သင့်တည်နေရာအချက်အလက်ကို ရယူနိုင်ပါသည်။ အက်ပ်က အသုံးပြုနိုင်ရန်အတွက် ဤတည်နေရာ ဝန်ဆောင်မှုများကို ဖွင့်ထားရမည် ဖြစ်ပြီး သင့်တက်ဘလက်ပေါ်တွင် ရရှိနိုင်ရပါမည်။"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ဤအက်ပ်သည် ဆဲလ်တာဝါများနှင့် Wi-Fi ကွန်ရက်များကဲ့သို့ ကွန်ရက်အရင်းအမြစ်ပေါ် အခြေခံပြီး သင့်တည်နေရာအချက်အလက်ကို ရယူနိုင်ပါသည်။ အက်ပ်က အသုံးပြုနိုင်ရန်အတွက် ဤတည်နေရာ ဝန်ဆောင်မှုများကို ဖွင့်ထားရမည် ဖြစ်ပြီး သင့်တီဗီပေါ်တွင် ရရှိနိုင်ရပါမည်။"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ဤအက်ပ်သည် ဆဲလ်တာဝါများနှင့် Wi-Fi ကွန်ရက်များကဲ့သို့ ကွန်ရက်အရင်းအမြစ်ပေါ် အခြေခံပြီး သင့်တည်နေရာအချက်အလက်ကို ရယူနိုင်ပါသည်။ အက်ပ်က အသုံးပြုနိုင်ရန်အတွက် ဤတည်နေရာ ဝန်ဆောင်မှုများကို ဖွင့်ထားရမည် ဖြစ်ပြီး သင့်ဖုန်းပေါ်တွင် ရရှိနိုင်ရပါမည်။"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"နောက်ခံတွင် တည်နေရာအတိအကျ အသုံးပြုခြင်း"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"နောက်ခံတွင် ဖွင့်ထားသည့်အခါတိုင်း ဤအက်ပ်က သင်၏တည်နေရာအတိအကျကို ရယူနိုင်ပါသည်။ သင်၏ဖုန်းတွင် အက်ပ်ကအသုံးပြုရန်အတွက် ဤတည်နေရာဝန်ဆောင်မှုများကို ဖွင့်ထားပြီး အသုံးပြု၍ ရပါမည်။ ၎င်းက ဘက်ထရီ ပိုကုန်နိုင်ပါသည်။"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"သင့်အသံအပြင်အဆင်အားပြောင်းခြင်း"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"အပလီကေးရှင်းအား အသံအတိုးအကျယ်နှင့် အထွက်ကို မည်သည့်စပီကာကို သုံးရန်စသည်ဖြင့် စက်တစ်ခုလုံးနှင့်ဆိုင်သော အသံဆိုင်ရာ ဆက်တင်များ ပြင်ဆင်ခွင့် ပြုရန်"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"အသံဖမ်းခြင်း"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"လက်ဗွေ အိုင်ကွန်"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို စီမံပါ"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"အသုံးပြုရန်အတွက် မျက်နှာပုံစံထည့်ရန် (သို့) ဖျက်ရန်နည်းလမ်းကို အက်ပ်အား သုံးခွင့်ပြုသည်။"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို သုံးပါ"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"မျက်နှာကို မမှတ်မိပါ။ ထပ်လုပ်ကြည့်ပါ။"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"မျက်နှာအလွန်လင်းနေသည်။ အလင်းလျှော့ပြီး စမ်းကြည့်ပါ။"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"မျက်နှာအလွန်မှောင်နေသည်။ ပြတင်းပေါက်ဖွင့်လိုက်ပါ။"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"အာရုံခံကိရိယာကို မျက်နှာနှင့် ခွာလိုက်ပါ။"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"အာရုံခံကိရိယာကို မျက်နှာအနီး ရွှေ့လိုက်ပါ။"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"အာရုံခံကိရိယာကို ပိုမြင့်အောင်ထားပါ။"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"အာရုံခံကိရိယာကို ပိုနိမ့်အောင်ထားပါ။"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"အာရုံခံကိရိယာကို ညာဘက်သို့ ရွှေ့ပါ။"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"အာရုံခံကိရိယာကို ဘယ်ဘက်သို့ ရွှေ့ပါ။"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"အာရုံခံကိရိယာကို ကြည့်ပါ။"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"မျက်နှာတစ်ခုမျှ မတွေ့ပါ။"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"မျက်နှာကို စက်၏ရှေ့တွင် အဆင်သင့်ထားပါ။"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"မျက်နှာ စက်ပစ္စည်း မရနိုင်ပါ။"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"မျက်နှာ သက်တမ်းကုန်သွားပါပြီ။ ထပ်စမ်းကြည့်ပါ။"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"မျက်နှာကို သိမ်း၍မရပါ။"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"မျက်နှာ ဆောင်ရွက်ခြင်းကို ပယ်ဖျက်လိုက်ပါပြီ။"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ နောက်မှထပ်စမ်းပါ။"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ ပိတ်လိုက်ပါပြီ။"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"ထပ်စမ်းကြည့်ပါ။"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"စာရင်းသွင်းထားသည့် မျက်နှာတစ်ခုမျှ မရှိပါ။"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ဤစက်တွင် မျက်နှာအထောက်အထားစိစစ်ခြင်း အာရုံခံကိရိယာမရှိပါ"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"မျက်နှာ <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"မျက်နှာသင်္ကေတ"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ထပ်တူပြုအဆင်အပြင်အားဖတ်ခြင်း"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"အပလီကေးရှင်းအား အကောင့်တစ်ခုအတွက် ထပ်တူညီအောင် လုပ်ဆောင်မှု ဆက်တင်အား ကြည့်ခွင့် ပြုပါ။ ဥပမာ People အက်ပ်က အကောင့်တစ်ခုနဲ့ ထပ်တူညီအောင် လုပ်ရန် ဆက်သွယ်ထားမှု ရှိမရှိ သိရှိနိုင်ခြင်း"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ထပ်တူညီအောင် လုပ်ခြင်းအား ပြုနိုင်၊ မပြုနိုင် အပြောင်းအလဲလုပ်ခြင်း"</string>
@@ -566,7 +599,7 @@
<string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM လက်မှတ်များကို ရယူသုံးခြင်း"</string>
<string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"အပလီကေးရှင်းတစ်ခုအား စီမံလုပ်ကိုင်ခွင့် DRM လက်မှတ်များ သုံးခွင့် ပြုသည်။ သာမန် အက်ပ်များ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_handoverStatus" msgid="7820353257219300883">"Android ရဲ့ အလင်းတန်းထိုး လွှဲပြောင်းမှု အခြေအနေကို ရယူရန်"</string>
- <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ဒီအပလီကေးရှင်းအား အန်ဒရွိုက်၏ လက်ရှိ အလင်းတန်းထိုး လွှဲပြောင်းမှု အကြောင်း အချက်အလက်ကို ရယူခွင့် ပြုသည်"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ဒီအပလီကေးရှင်းအား Android၏ လက်ရှိ အလင်းတန်းထိုး လွှဲပြောင်းမှု အကြောင်း အချက်အလက်ကို ရယူခွင့် ပြုသည်"</string>
<string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM လက်မှတ်များ ဖယ်ရှားရန်"</string>
<string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"အပလီကေးရှင်းအား DRM လက်မှတ်များကို ဖယ်ရှားခွင့် ပြုသည်။ သာမန် အက်ပ်များ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"စာပို့စာယူ ဆက်သွယ်ရေးဝန်ဆောင်မှုတစ်ခုအား ပူးပေါင်းခွင့်ပြုရန်"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi တွင် အင်တာနက်ချိတ်ဆက်မှု မရှိပါ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"အခြားရွေးချယ်စရာများကိုကြည့်ရန် တို့ပါ"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"သင်၏ဟော့စပေါ့ ဆက်တင်များ ပြောင်းလဲမှု"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"သင်၏ ဟော့စပေါ့လိုင်း ပြောင်းသွားပါပြီ။"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ဤစက်ပစ္စည်းသည် သင်၏ 5GHz သီးသန့်ရွေးချယ်မှုအတွက် ပံ့ပိုးမထားပါ။ ၎င်းအစား ဤစက်ပစ္စည်းသည် ရနိုင်သည့်အခါ 5GHz လိုင်းကို သုံးသွားပါမည်။"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> သို့ ပြောင်းလိုက်ပြီ"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ဖြင့် အင်တာနက် အသုံးမပြုနိုင်သည့်အချိန်တွင် စက်ပစ္စည်းသည် <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ကို သုံးပါသည်။ ဒေတာသုံးစွဲခ ကျသင့်နိုင်ပါသည်။"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> မှ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> သို့ ပြောင်းလိုက်ပြီ"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ဤစက်ပစ္စည်းအတွက် ပြဿနာအဖြေရှာရာတွင် ကူညီရန် သင်၏စီမံခန့်ခွဲသူက ချွတ်ယွင်းချက်အစီရင်ခံစာကို တောင်းဆိုထားသည်။ အက်ပ်များနှင့် ဒေတာကို မျှဝေထားနိုင်ပါသည်။"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"မျှဝေပါ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ငြင်းပယ်ပါ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"ကီးဘုတ် ပြောင်းလဲရန်"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ထည့်သွင်းရေး နည်းကို ရွေးရန်"</string>
<string name="show_ime" msgid="2506087537466597099">"စက်၏ကီးဘုတ်ကိုအသုံးပြုနေစဉ် ၎င်းကိုမျက်နှာပြင်ပေါ်တွင် ထားပါ"</string>
<string name="hardware" msgid="194658061510127999">"ပကတိအသွင်ကီးဘုတ်ပြရန်"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ရုပ်ပိုင်းဆိုင်ရာ အသွင်အပြင်ကို ပြင်ဆင်သတ်မှတ်ပါ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index d76bcfc8a223..a5bd899f35a2 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flymodus"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flymodus er på"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flymodus er av"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterisparing"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterisparing er AV"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterisparing er PÅ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Innstillinger"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hjelp"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Talehjelp"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Posisjon"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"få tilgang til enhetens plassering"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vil du gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til denne enhetens posisjon?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Appen får bare tilgang til posisjonen når du bruker appen."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vil du alltid gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til denne enhetens posisjon?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Appen får alltid tilgang til posisjonen, selv når du ikke bruker appen."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"åpne kalenderen din"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vil du gi &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tilgang til kalenderen din?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Denne appen kan legge til, fjerne eller endre kalenderaktiviteter på telefonen din. Denne appen kan sende meldinger som kan virke som om kommer fra kalendereiere, eller endre aktiviteter uten at eierne blir varslet."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"bruke ekstra posisjonskommandoer"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Appen gis tillatelse til å bruke ekstra kommandoer fra posisjonsleverandører. Dette kan gi appen tillatelse til å påvirke bruken av GPS eller andre posisjonskilder."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"få tilgang til nøyaktig posisjon (GPS- og nettverksbasert)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Denne appen kan få posisjonen din fra GPS eller nettverksplasseringskilder som mobilmaster og Wi-Fi-nettverk. Disse posisjonstjenestene må være slått på og tilgjengelige på telefonen din for at appen skal kunne bruke dem. Dette kan øke batteriforbruket."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"bare tilgang til nøyaktig posisjon i forgrunnen"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Denne appen kan bare få den nøyaktige posisjonen din når den er på i forgrunnen. Disse posisjonstjenestene må være slått på og tilgjengelige på telefonen din for at appen skal kunne bruke dem. Dette kan øke batteriforbruket."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"få tilgang til omtrentlig posisjon (nettverksbasert)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Denne appen kan få posisjonen din fra nettverkskilder som mobilmaster og Wi-Fi-nettverk. Disse posisjonstjenestene må være slått på og tilgjengelige på nettbrettet ditt for at appen skal kunne bruke dem."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Denne appen kan få posisjonen din fra nettverkskilder som mobilmaster og Wi-Fi-nettverk. Disse posisjonstjenestene må være slått på og tilgjengelige på TV-en din for at appen skal kunne bruke dem."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Denne appen kan få posisjonen din fra nettverkskilder som mobilmaster og Wi-Fi-nettverk. Disse posisjonstjenestene må være slått på og tilgjengelige på telefonen din for at appen skal kunne bruke dem."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"tilgang til nøyaktig posisjon i bakgrunnen"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Denne appen kan få den nøyaktige posisjonen din når den er på i bakgrunnen. Disse posisjonstjenestene må være slått på og tilgjengelige på telefonen din for at appen skal kunne bruke dem. Dette kan øke batteriforbruket."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"endre lydinnstillinger"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Lar appen endre globale lydinnstillinger slik som volum og hvilken høyttaler som brukes for lydavspilling."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ta opp lyd"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon for fingeravtrykk"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"administrere maskinvare for ansiktsautentisering"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Lar appen bruke metoder for å legge til og slette ansiktmaler for bruk."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"bruke maskinvare for ansiktsautentisering"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Lar appen bruke maskinvare for ansiktsautentisering til autentisering"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kunne ikke behandle ansiktet. Prøv igjen."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Ansiktet er for lyst. Prøv med svakere lys."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Ansiktet er for mørkt. Bruk en lyskilde."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Flytt sensoren lengre vekk fra ansiktet."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Hold sensoren nærmere ansiktet."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Flytt sensoren opp."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Flytt sensoren ned."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Flytt sensoren til høyre."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Flytt sensoren til venstre."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Se på sensoren."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Ingen ansikter er oppdaget."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Hold ansiktet stødig foran enheten."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Maskinvare for ansikt er ikke tilgjengelig."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Tidsavbrudd for ansikt er nådd. Prøv igjen."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Ansiktet kan ikke lagres."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Ansikt-operasjonen ble avbrutt."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"For mange forsøk. Prøv igjen senere."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"For mange forsøk. Ansiktsautentisering er slått av."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Prøv igjen."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Ingen ansikt er registrert."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Denne enheten har ikke sensor for ansiktsautentisering"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Ansikt <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ansiktikon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lese synkroniseringsinnstillinger"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lar appen lese synkroniseringsinnstillingene for en konto. For eksempel kan den finne ut om Personer-appen er synkronisert med en konto."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"slå synkronisering av og på"</string>
@@ -584,14 +617,14 @@
<string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"Overvåker antallet feil passord som er skrevet inn når skjermen låses opp, og låser nettbrettet eller sletter denne brukerens data når for mange feil passord er skrevet inn."</string>
<string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"Overvåker antallet feil passord som er skrevet inn når skjermen låses opp, og låser TV-en eller sletter denne brukerens data når for mange feil passord er skrevet inn."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"Overvåker antallet feil passord som er skrevet inn når skjermen låses opp, og låser telefonen eller sletter denne brukerens data når for mange feil passord er skrevet inn."</string>
- <string name="policylab_resetPassword" msgid="4934707632423915395">"Endre skjermlåsen"</string>
- <string name="policydesc_resetPassword" msgid="1278323891710619128">"Endre skjermlåsen."</string>
- <string name="policylab_forceLock" msgid="2274085384704248431">"Lås skjermen"</string>
- <string name="policydesc_forceLock" msgid="1141797588403827138">"Kontrollér hvordan og når skjermen låses."</string>
- <string name="policylab_wipeData" msgid="3910545446758639713">"Slett alle data"</string>
+ <string name="policylab_resetPassword" msgid="4934707632423915395">"Endring av skjermlåsen"</string>
+ <string name="policydesc_resetPassword" msgid="1278323891710619128">"Kan endre skjermlåsen."</string>
+ <string name="policylab_forceLock" msgid="2274085384704248431">"Låsing av skjermen"</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"Kan kontrollere hvordan og når skjermen låses."</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"Sletting av alle data"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Tilbakestill nettbrettets data uten advarsel ved å tilbakestille til fabrikkstandard."</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Slett TV-ens data uten advarsel ved å tilbakestille til fabrikkstandard."</string>
- <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Tilbakestill telefonens data uten advarsel, ved å tilbakestille til fabrikkstandard."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Telefonens data kan slettes uten advarsel ved å tilbakestille til fabrikkstandard."</string>
<string name="policylab_wipeData_secondaryUser" msgid="8362863289455531813">"Slett brukerdataene"</string>
<string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="6336255514635308054">"Sletter denne brukerens data på dette nettbrettet uten advarsel."</string>
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"Sletter denne brukerens data på denne TV-en uten advarsel."</string>
@@ -604,7 +637,7 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Krev at lagrede appdata krypteres."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Deaktiver kameraer"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Hindre bruk av alle kameraer på enheten."</string>
- <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Deaktiver enkelte skjermlåsfunksjoner"</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Deaktivering av skjermlåsfunksjoner"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Forhindrer bruk av enkelte skjermlåsfunksjoner."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Hjemmenummer"</item>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi har ikke Internett-tilgang"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Trykk for å få alternativer"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Endres til innstillingene dine for Wi-Fi-soner"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Båndet ditt for Wi-Fi-sone er endret."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Denne enheten støtter ikke innstillingen din for bare 5 GHz. I stedet bruker enheten 5 GHz-båndet når det er tilgjengelig."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Byttet til <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Enheten bruker <xliff:g id="NEW_NETWORK">%1$s</xliff:g> når <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ikke har Internett-tilgang. Avgifter kan påløpe."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Byttet fra <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> til <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administratoren har bedt om en feilrapport for å hjelpe med feilsøkingen på denne enheten. Apper og data kan bli delt."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DEL"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"AVSLÅ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Endre tastatur"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Velg inndatametode"</string>
<string name="show_ime" msgid="2506087537466597099">"Ha den på skjermen mens det fysiske tastaturet er aktivt"</string>
<string name="hardware" msgid="194658061510127999">"Vis det virtuelle tastaturet"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurer et fysisk tastatur"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 3efd224a838e..eac241b499b4 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाइजहाज मोड"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाइजहाज मोड खुला छ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाइजहाज मोड बन्द छ"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ब्याट्री सेभर"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ब्याट्री सेभर निष्क्रिय छ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ब्याट्री सेभर सक्रिय छ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"सेटिङहरू"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहायता दिनुहोस्"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज सहायता"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थानमाथि पहुँच"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई यो यन्त्रको स्थानमाथि पहुँच राख्न दिने हो?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"तपाईं उक्त अनुप्रयोग प्रयोग गरिरहेका बेलामा त्यससँग स्थानमाथिको पहुँच रहने छ।"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई यो यन्त्रको स्थानमाथि पहुँच राख्न दिने हो?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"तपाईं उक्त अनुप्रयोग प्रयोग नगरिरहेका बेलामा पनि त्यससँग स्थानमाथिको पहुँच रहने छ।"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"पात्रो"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईंको पात्रोमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई आफ्नो पात्रोमाथि पहुँच राख्न दिने हो?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"यस अनुप्रयोगले तपाईंको फोनमा पात्रोका कार्यक्रमहरू थप्न, हटाउन वा परिवर्तन गर्न सक्छ। यस अनुप्रयोगले पात्रोका मालिकहरू मार्फत आएको जस्तो लाग्ने सन्देशहरू पठाउन वा तिनीहरूका मालिकहरूलाई सूचित नगरिकन कार्यक्रमहरू परिवर्तन गर्न सक्छ।"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"अधिक स्थान प्रदायक आदेशहरू पहुँच गर्नुहोस्"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"अनुप्रयोगलाई अतिरिक्त स्थान प्रदायक आदेशहरू पहुँच गर्न अनुमति दिन्छ। यो अनुप्रयोगलाई GPS वा अन्य स्थान स्रोतहरूको संचालन साथै हस्तक्षेप गर्न अनुमति दिन सक्छ।"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"सटीक स्थान पहुँच गराउनुहोस् (GPS तथा नेटवर्कमा आधारित)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता GPS वा नेटवर्कको स्थानका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनु पर्छ। यसले ब्याट्रीको खपत बढाउन सक्छ।"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"अग्रभूमिमा मात्र सटीक स्थानमाथि पहुँच राख्नुहोस्"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"यो अनुप्रयोगले अग्रभागमा चलिरहेको अवस्थामा मात्र तपाईंलाई स्थानको सटिक जानकारी दिन सक्छ। यी स्थानसम्बन्धी सेवाहरू अनिवार्य रूपमा सक्रिय गरिएका हुनु पर्छ र अनुप्रयोगले यिनीहरूको प्रयोग गर्न सकोस् भन्नाका खातिर तपाईंको फोनमै उपलब्ध हुन्छन्। यस कार्यले गर्दा ब्याट्री बढी खर्च हुन सक्छ।"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"अनुमानित स्थान पहुँच गराउनुहोस् (नेटवर्कमा आधारित)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको ट्याब्लेटमा उपलब्ध हुनु पर्छ।"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको TV मा उपलब्ध हुनु पर्छ।"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनु पर्छ।"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"पृष्ठभूमिमा सटीक स्थानमाथि पहुँच राख्नुहोस्"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"यो अनुप्रयोगले पृष्ठभूमिमा चलिरहेको अवस्थामा तपाईंलाई जुनसुकै बेला स्थानको सटिक जानकारी दिन सक्छ। यी स्थानसम्बन्धी सेवाहरू अनिवार्य रूपमा सक्रिय गरिएका हुनु पर्छ र अनुप्रयोगले यिनीहरूको प्रयोग गर्न सकोस् भन्नाका खातिर तपाईंको फोनमै उपलब्ध हुन्छन्। यस कार्यले गर्दा ब्याट्री बढी खर्च हुन सक्छ।"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"तपाईँका अडियो सेटिङहरू परिवर्तन गर्नुहोस्"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"अनुप्रयोगलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै आवाजको मात्रा र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"अडियो रेकर्ड गर्नुहोस्"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फिंगरप्रिन्ट आइकन"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"अनुहार प्रमाणिकरण हार्डवेयर व्यवस्थापन गर्नुहोस्"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"अनुप्रयोगलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"अनुहार प्रमाणिकरण हार्डवेयर प्रयोग गर्नुहोस्"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"अनुप्रयोगलाई प्रमाणीकरणका लागि अनुहार प्रमाणीकरण हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"अनुहार प्रशोधन गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"अनुहारमा धेरै उज्यालो छ। कृपया कम प्रकाशमा प्रयास गर्नुहोस्।"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"अनुहार धेरै गाढा छ। कृपया प्रकाशको स्रोतको थप्नुहोस्‌।"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"कृपया अनुहारबाट सेन्सरलाई अलिक टाढा सार्नुहोस्।"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"कृपया अनुहारलाई सेन्सरको नजिक ल्याउनुहोस्।"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"कृपया सेन्सरलाई माथि सार्नुहोस्।"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"कृपया सेन्सरलाई तल सार्नुहोस्।"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"कृपया सेन्सरलाई दायाँतिर सार्नुहोस्।"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"कृपया सेन्सरलाई बायाँतिर सार्नुहोस्।"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"कृपया सेन्सरमा हेर्नुहोस्।"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"अनुहार पत्ता लागेन।"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"यन्त्रको अगाडि अनुहार स्थिर राख्नुहोस्।"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"अनुहार पहिचान गर्ने हार्डवेयर उपलब्ध छैन।"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"अनुहारको समय सकिएको छ। फेरि प्रयास गर्नुहोस्‌।"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"अनुहार भण्डारण गर्न सकिँदैन।"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"अनुहार पहिचान रद्द गरियो।"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्‌।"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"अत्यधिक धेरैपटक गलत प्रयासहरू भए। अनुहार प्रमाणिकरणलाई असक्षम पारियो।"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"फेरि प्रयास गर्नुहोस्।"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"कुनै पनि अनुहार दर्ता गरिएन।"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"यो यन्त्रमा कुनै अनुहार प्रमाणिकरण सेन्सर छैन"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"अनुहार <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"अनुहारको आइकन"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"समीकरण सेटिङहरू पढ्नुहोस्"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"अनुप्रयोगलाई खाताको लागि सिंक सेटिङहरू पढ्न अनुमति दिन्छ। उदाहरणको लागि यसले व्यक्तिहरको अनुप्रयोग खातासँग सिंक भएको नभएको निर्धारण गर्न सक्दछ।"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"टगल सिंक खुला र बन्द"</string>
@@ -1181,6 +1214,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi मार्फत इन्टरनेटमाथि पहुँच राख्न सकिँदैन"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पहरूका लागि ट्याप गर्नुहोस्"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"तपाईंको हटस्पट सेटिङहरूमा परिवर्तन हुन्छ"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"तपाईंको हटस्पट ब्यान्ड परिवर्तन भएको छ।"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"यो यन्त्रले तपाईंको 5GHz मात्रको प्राथमिकतालाई समर्थन गर्दैन। बरु, उपलब्ध भएको खण्डमा यो यन्त्रले 5GHz ब्यान्ड प्रयोग गर्छ।"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> मा बदल्नुहोस्"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> मार्फत इन्टरनेटमाथि पहुँच राख्न नसकेको अवस्थामा यन्त्रले <xliff:g id="NEW_NETWORK">%1$s</xliff:g> प्रयोग गर्दछ। शुल्क लाग्न सक्छ।"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> बाट <xliff:g id="NEW_NETWORK">%2$s</xliff:g> मा परिवर्तन गरियो"</string>
@@ -1268,7 +1304,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"तपाईंका प्रशासकले यस यन्त्रको समस्या निवारण गर्नमा मद्दत गर्नाका लागि एउटा बग रिपोर्टको अनुरोध गर्नुभएको छ। अनुप्रयोगहरू र डेटा आदान प्रदान गर्न पनि सकिन्छ।"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"साझेदारी गर्नुहोस्"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"अस्वीकार गर्नुहोस्"</string>
- <string name="select_input_method" msgid="8547250819326693584">"कुञ्जीपाटी परिवर्तन गर्नुहोस्"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"निवेश विधि छान्नुहोस्"</string>
<string name="show_ime" msgid="2506087537466597099">"वास्तविक किबोर्ड सक्रिय हुँदा यसलाई स्क्रिनमा राख्नुहोस्"</string>
<string name="hardware" msgid="194658061510127999">"भर्चुअल किबोर्ड देखाउनुहोस्"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"फिजिकल किबोर्डलाई कन्फिगर गर्नुहोस्"</string>
diff --git a/core/res/res/values-night/colors.xml b/core/res/res/values-night/colors.xml
new file mode 100644
index 000000000000..688040ba0cc1
--- /dev/null
+++ b/core/res/res/values-night/colors.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+
+ NOTE: You might also want to edit: packages/SystemUI/res/values-night/colors.xml
+ -->
+<resources>
+ <!-- The primary text color if the text is on top of a dark background.
+ This is also affects colorized notifications with dark backgrounds. -->
+ <color name="notification_primary_text_color_dark">#dadada</color>
+
+ <!-- The secondary text color if the text is on top of a dark background. -->
+ <color name="notification_secondary_text_color_dark">#dadada</color>
+
+ <color name="notification_default_color_dark">#dadada</color>
+
+ <!-- The background color of a notification card. -->
+ <color name="notification_material_background_color">@*android:color/material_grey_900</color>
+</resources> \ No newline at end of file
diff --git a/core/res/res/values-night/themes_device_defaults.xml b/core/res/res/values-night/themes_device_defaults.xml
new file mode 100644
index 000000000000..5e3675ac6c3e
--- /dev/null
+++ b/core/res/res/values-night/themes_device_defaults.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+===============================================================
+ PLEASE READ
+===============================================================
+This file contains the themes that are the Device Defaults.
+If you want to edit themes to skin your device, do it here.
+We recommend that you do not edit themes.xml and instead edit
+this file.
+
+Editing this file instead of themes.xml will greatly simplify
+merges for future platform versions and CTS compliance will be
+easier.
+===============================================================
+ PLEASE READ
+===============================================================
+ -->
+<resources>
+
+ <!-- The dark default theme for apps that target API level XX and higher.
+ <p>The DeviceDefault themes are aliases for a specific device’s native look and feel. The
+ DeviceDefault theme family and widget style family offer ways for you to target your app
+ to a device’s native theme with all device customizations intact.</p>
+ <p>For example, when you set your app's {@code targetSdkVersion} to XX or higher, this
+ theme is applied to your application by default. As such, your app might appear with the
+ {@link #Theme_Material Material} styles on one device, but with a different set of styles on
+ another device. This is great if you want your app to fit with the device's native look and
+ feel. If, however, you prefer to keep your UI style the same across all devices, you should
+ apply a specific theme such as {@link #Theme_Material Material} or one of your own design.
+ For more information, read <a
+ href="http://android-developers.blogspot.com/20XX/XX/material-everywhere.html">Material
+ Everywhere</a>.</p>
+ <p>Styles used by the DeviceDefault theme are named using the convention
+ Type.DeviceDefault.Etc (for example, {@code Widget.DeviceDefault.Button} and
+ {@code TextAppearance.DeviceDefault.Widget.PopupMenu.Large}).</p>
+ -->
+ <!-- DeviceDefault theme for a window that should look like the Settings app. -->
+ <style name="Theme.DeviceDefault.Settings" parent="Theme.DeviceDefault"/>
+</resources>
diff --git a/core/res/res/values-night/values.xml b/core/res/res/values-night/values.xml
new file mode 100644
index 000000000000..4eb2ff3b5970
--- /dev/null
+++ b/core/res/res/values-night/values.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <style name="Theme.DeviceDefault.QuickSettings" parent="android:Theme.DeviceDefault">
+ <!-- Color palette -->
+ <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item>
+ <item name="colorSecondary">@color/secondary_device_default_settings</item>
+ <item name="colorAccent">@color/accent_device_default_dark</item>
+ <item name="colorError">@color/error_color_device_default_dark</item>
+ <item name="colorControlNormal">?attr/textColorPrimary</item>
+ <item name="alertDialogTheme">@style/Theme.DeviceDefault.Dialog.Alert</item>
+
+ <!-- QS panel background -->
+ <item name="colorBackgroundFloating">@color/material_grey_900</item>
+
+ <!-- volume background -->
+ <item name="panelColorBackground">@color/material_grey_800</item>
+ </style>
+
+ <style name="TextAppearance.Material.Notification">
+ <item name="textColor">@color/notification_secondary_text_color_dark</item>
+ <item name="textSize">@dimen/notification_text_size</item>
+ </style>
+</resources> \ No newline at end of file
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 80cb7a9ac358..6742d6fe3c2c 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Vliegtuigmodus"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Vliegtuigmodus is AAN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Vliegtuigmodus is UIT"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterijbesparing"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterijbesparing is UIT"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterijbesparing is AAN"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Instellingen"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Helpen"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Spraakassistent"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Locatie"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"de locatie van dit apparaat openen"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot de locatie van dit apparaat?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"De app heeft alleen toegang tot de locatie wanneer je de app gebruikt."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; altijd toegang geven tot de locatie van dit apparaat?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"De app heeft altijd toegang tot de locatie, ook wanneer je de app niet gebruikt."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"toegang krijgen tot je agenda"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot je agenda?"</string>
@@ -287,13 +287,13 @@
<string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot foto\'s, media en bestanden op je apparaat?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Microfoon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"audio opnemen"</string>
- <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; het volgende toestaan: audio opnemen."</string>
+ <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toestaan om audio op te nemen?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"foto\'s maken en video opnemen"</string>
<string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toestaan om foto\'s te maken en video op te nemen?"</string>
<string name="permgrouplab_calllog" msgid="8798646184930388160">"Gesprekkenlijsten"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"gesprekkenlijst lezen en schrijven"</string>
- <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Wil je &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang tot je gesprekkenlijsten geven?"</string>
+ <string name="permgrouprequest_calllog" msgid="8487355309583773267">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot je gesprekkenlijsten?"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefoon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefoneren en oproepen beheren"</string>
<string name="permgrouprequest_phone" msgid="9166979577750581037">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toestaan om telefoongesprekken te starten en te beheren?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Deze app kan agenda-afspraken toevoegen, verwijderen of wijzigen op je telefoon. Deze app kan berichten verzenden die afkomstig lijken te zijn van agenda-eigenaren of afspraken aanpassen zonder dit aan de eigenaar te melden."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"toegang tot extra opdrachten van locatieaanbieder"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Hiermee kan de app toegang krijgen tot extra opdrachten voor de locatieprovider. De app kan hiermee de werking van gps of andere locatiebronnen te verstoren."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"toegang tot precieze locatie (gps- en netwerkgebaseerd)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Deze app kan je locatie ophalen op basis van gps- of netwerklocatiebronnen zoals zendmasten en wifi-netwerken. De app kan alleen gebruikmaken van deze locatieservices als ze zijn ingeschakeld en beschikbaar zijn op je telefoon. Het batterijverbruik kan hierdoor toenemen."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"alleen toegang tot precieze locatie op de voorgrond"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Deze app kan je exacte locatie ophalen wanneer de app op de voorgrond wordt uitgevoerd. De app kan alleen gebruikmaken van deze locatieservices als ze zijn ingeschakeld en beschikbaar zijn op je telefoon. Hierdoor kan het batterijverbruik toenemen."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"toegang tot geschatte locatie (netwerkgebaseerd)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Deze app kan je locatie ophalen op basis van netwerkbronnen zoals zendmasten en wifi-netwerken. De app kan alleen gebruikmaken van deze locatieservices als ze zijn ingeschakeld en beschikbaar zijn op je tablet."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Deze app kan je locatie ophalen op basis van netwerkbronnen zoals zendmasten en wifi-netwerken. De app kan alleen gebruikmaken van deze locatieservices als ze zijn ingeschakeld en beschikbaar zijn op je tv."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Deze app kan je locatie ophalen op basis van netwerkbronnen zoals zendmasten en wifi-netwerken. De app kan alleen gebruikmaken van deze locatieservices als ze zijn ingeschakeld en beschikbaar zijn op je telefoon."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"toegang tot precieze locatie op de achtergrond"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Deze app kan je exacte locatie ophalen wanneer de app op de achtergrond wordt uitgevoerd. De app kan alleen gebruikmaken van deze locatieservices als ze zijn ingeschakeld en beschikbaar zijn op je telefoon. Hierdoor kan het batterijverbruik toenemen."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"je audio-instellingen wijzigen"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Hiermee kan de app algemene audio-instellingen wijzigen zoals het volume en welke luidspreker wordt gebruikt voor de uitvoer."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"audio opnemen"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Vingerafdruk-pictogram"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"hardware voor gezichtsherkenning beheren"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Hiermee kan de app methoden aanroepen om gezichtstemplates toe te voegen en te verwijderen voor gebruik."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"hardware voor gezichtsherkenning gebruiken"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Hiermee kan de app hardware voor gezichtsherkenning gebruiken voor verificatie"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Kan gezicht niet verwerken. Probeer het opnieuw."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Gezicht is te helder. Probeer bij minder licht."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Gezicht is te donker. Laat meer licht toe."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Houd de sensor verder weg van je gezicht."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Houd de sensor dichter bij je gezicht."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Beweeg de sensor omhoog."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Beweeg de sensor omlaag."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Beweeg de sensor naar rechts."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Beweeg de sensor naar links."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Kijk naar de sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Geen gezicht gedetecteerd."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Houd het gezicht stil voor het apparaat."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware voor gezichtsherkenning niet beschikbaar."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Time-out voor gezicht bereikt. Probeer opnieuw."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Gezicht kan niet worden opgeslagen."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Bewerking voor gezichtsherkenning geannuleerd."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogingen. Probeer het later opnieuw."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Te veel pogingen. Gezichtsherkenning inactief."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Probeer het opnieuw."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Geen gezicht geregistreerd."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Dit apparaat heeft geen sensor voor gezichtsherkenning"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Gezicht <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Gezichtspictogram"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"synchronisatie-instellingen lezen"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Hiermee kan de app de synchronisatie-instellingen voor een account lezen. Dit kan bijvoorbeeld bepalen of de app Personen wordt gesynchroniseerd met een account."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"synchronisatie in- en uitschakelen"</string>
@@ -585,13 +618,13 @@
<string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en de tv vergrendelen of alle gegevens van deze gebruiker wissen als te veel onjuiste wachtwoorden worden ingevoerd."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"Bijhouden hoe vaak onjuiste wachtwoorden worden ingevoerd wanneer het scherm wordt ontgrendeld en de telefoon vergrendelen of alle gegevens van deze gebruiker wissen als te veel onjuiste wachtwoorden worden ingevoerd."</string>
<string name="policylab_resetPassword" msgid="4934707632423915395">"De schermvergrendeling wijzigen"</string>
- <string name="policydesc_resetPassword" msgid="1278323891710619128">"De schermvergrendeling wijzigen."</string>
+ <string name="policydesc_resetPassword" msgid="1278323891710619128">"Wijzig de schermvergrendeling."</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"Het scherm vergrendelen"</string>
- <string name="policydesc_forceLock" msgid="1141797588403827138">"Beheren hoe en wanneer het scherm wordt vergrendeld."</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"Beheer hoe en wanneer het scherm wordt vergrendeld."</string>
<string name="policylab_wipeData" msgid="3910545446758639713">"Alle gegevens wissen"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"De gegevens van de tablet zonder waarschuwing wissen door de fabrieksinstellingen te herstellen."</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"De gegevens van de tv zonder waarschuwing wissen door de fabrieksinstellingen te herstellen."</string>
- <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"De gegevens van de telefoon zonder waarschuwing wissen door de fabrieksinstellingen te herstellen."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Wis de gegevens van de telefoon zonder waarschuwing door de fabrieksinstellingen te herstellen."</string>
<string name="policylab_wipeData_secondaryUser" msgid="8362863289455531813">"Gebruikersgegevens wissen"</string>
<string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="6336255514635308054">"De gegevens van deze gebruiker op deze tablet zonder waarschuwing wissen."</string>
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"De gegevens van deze gebruiker op deze tv zonder waarschuwing wissen."</string>
@@ -605,7 +638,7 @@
<string name="policylab_disableCamera" msgid="6395301023152297826">"Camera\'s uitschakelen"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Het gebruik van alle apparaatcamera\'s voorkomen."</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Bepaalde functies voor schermvergrendeling uitschakelen"</string>
- <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Gebruik van bepaalde functies voor schermvergrendeling voorkomen."</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Voorkom het gebruik van bepaalde functies voor schermvergrendeling."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Thuis"</item>
<item msgid="869923650527136615">"Mobiel"</item>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wifi-netwerk heeft geen internettoegang"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tik voor opties"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Wijzigingen in je hotspot-instellingen"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Je hotspot-band is gewijzigd."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Dit apparaat biedt geen ondersteuning voor je voorkeur voor alleen 5 GHz. In plaats daarvan gebruikt dit apparaat de 5-GHz-band wanneer deze beschikbaar is."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Overgeschakeld naar <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Apparaat gebruikt <xliff:g id="NEW_NETWORK">%1$s</xliff:g> wanneer <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> geen internetverbinding heeft. Er kunnen kosten in rekening worden gebracht."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Overgeschakeld van <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> naar <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Je beheerder heeft een bugrapport aangevraagd om problemen met dit apparaat op te lossen. Apps en gegevens kunnen worden gedeeld."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DELEN"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"WEIGEREN"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Toetsenbord wijzigen"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Invoermethode selecteren"</string>
<string name="show_ime" msgid="2506087537466597099">"Dit op het scherm weergeven terwijl het fysieke toetsenbord actief is"</string>
<string name="hardware" msgid="194658061510127999">"Virtueel toetsenbord tonen"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Fysiek toetsenbord configureren"</string>
@@ -1550,7 +1586,7 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt u gevraagd je telefoon te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%3$d</xliff:g> seconden opnieuw."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Verwijderen"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Volume verhogen tot boven het aanbevolen niveau?\n\nAls u langere tijd op hoog volume naar muziek luistert, raakt je gehoor mogelijk beschadigd."</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Volume verhogen tot boven het aanbevolen niveau?\n\nAls je langere tijd op hoog volume naar muziek luistert, raakt je gehoor mogelijk beschadigd."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"Sneltoets voor toegankelijkheid gebruiken?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"Wanneer de snelkoppeling is ingeschakeld, kun je drie seconden op beide volumeknoppen drukken om een toegankelijkheidsfunctie te starten.\n\n Huidige toegankelijkheidsfunctie:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n Je kunt de functie wijzigen in Instellingen &gt; Toegankelijkheid."</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"Sneltoets uitschakelen"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index a9e51f454f77..c86fab8e11e8 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ଏରୋପ୍ଲେନ୍‍ ମୋଡ୍"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ଏରୋପ୍ଲେନ୍‍ ମୋଡ୍ ଅନ୍ ଅଛି"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ଏରୋପ୍ଲେନ୍‍ ମୋଡ୍ ଅଫ୍ ଅଛି"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ବ୍ୟାଟେରୀ ସେଭର୍"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅଫ୍ ଅଛି"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍‌ ଅଛି"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ସେଟିଙ୍ଗ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ସହାୟକ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ଭଏସ୍‌ ସହାୟକ"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ଲୋକେଶନ୍‌"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ଏହି ଡିଭାଇସ୍‌ର ଲୋକେଶନ୍‍ ଆକ୍ସେସ୍‍ କରେ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଏହି ଡିଭାଇସ୍‌ର ଲୋକେଶନ୍‍ ଆକ୍ସେସ୍‍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ଆପଣ ଆପ୍‍ ବ୍ୟବହାର କରୁଥିବା ବେଳେ କେବଳ ଲୋକେସନ୍‍କୁ ଆପ୍‍‍ର ଆକ୍ସେସ୍‍ ରହିବ।"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ସଦାବେଳେ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଏହି ଡିଭାଇସ୍‌ର ଲୋକେସନ୍‍ ଆକ୍ସେସ୍‍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ଆପଣ ଆପ୍‍ ବ୍ୟବହାର କରୁନଥିଲେ ମଧ୍ୟ, ଲୋକେସନ୍‍କୁ ସଦାବେଳେ ଆପ୍‍‍ର ଆକ୍ସେସ୍‍ ରହିବ।"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"କ୍ୟାଲେଣ୍ଡର୍"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର୍‍ ଆକ୍ସେସ୍‍ କରେ"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;କୁ ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର୍‌କୁ ଆକ୍ସେସ୍‍ କରିବା ପାଇଁ ଅନୁମତି ଦେବେ କି?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ଏହି ଆପ୍‍, ଆପଣଙ୍କ ଫୋନ୍‌ରେ କ୍ୟାଲେଣ୍ଡର୍‌ ଇଭେଣ୍ଟଗୁଡ଼ିକୁ ଯୋଡ଼ିପାରେ, ବାହାର କରିପାରେ କିମ୍ବା ବଦଳାଇପାରେ। କ୍ୟାଲେଣ୍ଡର୍‌ ମାଲିକଙ୍କ ପାଖରୁ ଆସିଥିବା ପରି ଜଣା‍ପଡ଼ିବା ମେସେଜ୍‍କୁ ଏହି ଆପ୍‍ ପଠାଇପାରେ କିମ୍ବା ମାଲିକଙ୍କୁ ନଜଣାଇ ଇଭେଣ୍ଟ ବଦଳାଇପାରେ।"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ଅତିରିକ୍ତ ଲୋକେଶନ୍ ପ୍ରଦାନକାରୀ କମାଣ୍ଡକୁ ଆକ୍ସେସ୍‍ କରନ୍ତୁ"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ଅତିରିକ୍ତ ଲୋକେଶନ୍‍ ପ୍ରଦାନକାରୀ କମାଣ୍ଡ ଆକ୍ସେସ୍‌ କରିବା ପାଇଁ ଆପ୍‍କୁ ଅନୁମତି ଦିଏ। GPS କିମ୍ବା ଅନ୍ୟ ଲୋକେଶନ୍‍ ସୋର୍ସଗୁଡିକରେ ଆପ୍‍ଟି ପ୍ରଭାବ ପକାଇପାରେ।"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"ନିର୍ଦ୍ଦିଷ୍ଟ ଲୋକେଶନ୍‍ ଆକ୍ସେସ୍ କରେ (GPS ଏବଂ ନେଟ୍‌ୱର୍କ-ଆଧାରିତ)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ଏହି ଆପ୍‍, GPS କିମ୍ୱା ନେଟ୍‌ୱର୍କ ସୋର୍ସ ଉପରେ ଆଧାର କରି ଆପଣଙ୍କ ଲୋକେଶନ୍‍ ପ୍ରାପ୍ତ କରିପାରେ, ଯେପରିକି ସେଲ୍‍ ଟାୱାର୍‍ ଓ ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ। ଏହି ଲୋକେଶନ୍‌ ସେବା, ଆପଣଙ୍କ ଫୋନ୍‌ରେ ଅନ୍‍ ରହିଥିବା ଓ ଉପଲବ୍ଧ ଥିବା ଦରକାର, ଯେଉଁଥିରୁ ଆପ୍‌ ସେଗୁଡ଼ିକର ବ୍ୟବହାର କରିପାରିବ। ଏହାଦ୍ୱାରା ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ ବଢ଼ିପାରେ।"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"କେବଳ ସମ୍ମୁଖଭାଗରେ ସଠିକ୍‍ ଲୋକେଶନ୍‍ର ଆକ୍ସେସ୍‍ କରନ୍ତୁ"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"ଏହି ଆପ୍‍ ଯେତେବେଳେ ସମ୍ମୁଖଭାଗରେ ଥିବାବେଳେ ଆପଣଙ୍କର ସଠିକ୍‍ ଲୋକେଶନ୍‍ ପ୍ରାପ୍ତ କରିପାରିବ। ଏହି ଲୋକେଶନ୍‍ ସେବାଗୁଡ଼ିକ ନିଶ୍ଚିତରୂପେ ଅନ୍‍ ରହିବା ଦରକାର ଏବଂ ଆପ୍‍ର ବ୍ୟବହାର ପାଇଁ ଫୋନ୍‍ରେ ଉପଲବ୍ଧ ଥିବା ଦରକାର। ଏହା ବ୍ୟାଟେରୀ ଅଧିକା ଖର୍ଚ୍ଚ କରିପାରେ।"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ପାଖାପାଖି ଲୋକେଶନ୍‍ ଆକ୍ସେସ୍‍ କରେ (ନେଟ୍‌ୱର୍କ-ଆଧାରିତ)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ଏହି ଆପ୍‍, ନେଟ୍‌ୱର୍କ ସୋର୍ସ ଉପରେ ଆଧାର କରି ଆପଣଙ୍କ ଲୋକେଶନ୍‍ ପ୍ରାପ୍ତ କରିପାରେ, ଯେପରିକି ସେଲ୍‍ ଟାୱାର୍‍ ଓ ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ। ଏହି ଲୋକେଶନ୍‌ ସେବା, ଆପଣଙ୍କ ଟାବଲେଟ୍‌ରେ ଅନ୍‍ ରହିଥିବା ଓ ଉପଲବ୍ଧ ଥିବା ଦରକାର, ଯେଉଁଥିରୁ ଆପ୍‌ ସେଗୁଡ଼ିକର ବ୍ୟବହାର କରିପାରିବ।"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ଏହି ଆପ୍‍, ନେଟ୍‌ୱର୍କ ସୋର୍ସ ଉପରେ ଆଧାର କରି ଆପଣଙ୍କ ଲୋକେଶନ୍‍ ପ୍ରାପ୍ତ କରିପାରେ, ଯେପରିକି ସେଲ୍‍ ଟାୱାର୍‍ ଓ ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ। ଏହି ଲୋକେଶନ୍‌ ସେବା, ଆପଣଙ୍କ ଟିଭିରେ ଅନ୍‍ ରହିଥିବା ଓ ଉପଲବ୍ଧ ଥିବା ଦରକାର, ଯେଉଁଥିରୁ ଆପ୍‌ ସେଗୁଡ଼ିକର ବ୍ୟବହାର କରିପାରିବ।"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ସେଲ୍‍ ଟାୱାର ଓ ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ ପରି ସୋର୍ସକୁ ଆଧାର କରି ଏହି ଆପ୍‍ ଆପଣଙ୍କ ଲୋକେଶନ୍‍ ପ୍ରାପ୍ତ କରିପାରିବ। ଏହି ଲୋକେଶନ୍‍ ସେବାଗୁଡ଼ିକର ବ୍ୟବହାର କରିବାକୁ ସେଗୁଡ଼ିକ ଅନ୍‍ କରାଯିବା ଏବଂ ଆପଣଙ୍କ ଫୋନ୍‌ରେ ଉପଲବ୍ଧ ଥିବା ଜରୁରୀ"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"ପୃଷ୍ଠପଟରେ ସଠିକ୍‍ ଲୋକେଶନ୍‍ର ଆକ୍ସେସ୍‍"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"ଏହି ଆପ୍‍ ପୃଷ୍ଠପଟରେ ରହିଥିବାବେଳେ ଯେକୌଣସି ସମୟରେ ଆପଣଙ୍କର ଲୋକେଶନ୍‍ ପ୍ରାପ୍ତ କରିପାରିବ। ଏହି ଲୋକେଶନ୍‍ ସେବାଗୁଡ଼ିକ ନିଶ୍ଚିତରୂପେ ଅନ୍‍ ରହିବା ଦରକାର ଏବଂ ଆପ୍‍ର ବ୍ୟବହାର ପାଇଁ ଫୋନ୍‍ରେ ଉପଲବ୍ଧ ଥିବା ଦରକାର। ଏହା ବ୍ୟାଟେରୀ ଅଧିକା ଖର୍ଚ୍ଚ କରିପାରେ।"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ଆପଣଙ୍କ ଅଡିଓ ସେଟିଙ୍ଗକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ଆପ୍‌କୁ ଗ୍ଲୋବାଲ୍ ଅଡିଓ ସେଟିଙ୍ଗ, ଯେପରିକି ଭଲ୍ୟୁମ୍‌କୁ ସଂଶୋଧିତ କରିବାକୁ ଏବଂ ଆଉଟପୁଟ୍ ପାଇଁ ସ୍ପିକର୍‌ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ଅଡିଓ ରେକର୍ଡ କରନ୍ତୁ"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ର ପରିଚାଳନା କରନ୍ତୁ"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ବ୍ୟବହାର ପାଇଁ ଆପ୍‍କୁ ଫେସିଆଲ୍‍ ଟେମ୍ପଲେଟ୍‍ ଯୋଡିବା ଓ ଡିଲିଟ୍‍ ର ପଦ୍ଧତି ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ର ପ୍ରମାଣ ପାଇଁ ଆପ୍‍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ଫେସ୍‍ ଚିହ୍ନଟ ହେଲାନାହିଁ ।ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ଫେସ୍‍ଟି ବହୁତ ଉଜ୍ଵଳ ଦେଖାଯାଉଛି। ଦୟାକରି, କମ ଆଲୋକରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ଫେସ୍‍ଟି ବହୁତ କଳା ଦେଖାଯାଉଛି। ଦୟାକରି ଆଲୋକକୁ ଅନାବୃତ କରନ୍ତୁ।"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"ଦୟାକରି ସେନ୍‍ସର୍‍କୁ ଫେସ୍‍ ପାଖରୁ ଦୂରେଇ ରଖନ୍ତୁ"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"ଦୟାକରି ସେନ୍‍ସର୍‍କୁ ଫେସ୍‍ର ଅତି ନିକଟକୁ ଆଣନ୍ତୁ।"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"ଦୟାକରି ସେନ୍‍ସର୍‍କୁ ଆହୁରି ଉପରକୁ ଘୁଞ୍ଚାନ୍ତୁ।"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"ଦୟାକରି ସେନ୍‍ସର୍‍କୁ ତଳକୁ ଘୁଞ୍ଚାନ୍ତୁ।"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"ଦୟାକରି ସେନ୍‍ସର୍‍କୁ ଦକ୍ଷିଣକୁ ଘୁଞ୍ଚାନ୍ତୁ।"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"ଦୟାକରି ସେନ୍‍ସର୍‍କୁ ବାମକୁ ଘୁଞ୍ଚାନ୍ତୁ।"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"ଦୟାକରି ସେନ୍‍ସର୍‍କୁ ଦେଖନ୍ତୁ"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"କୌଣସି ଫେସ୍‍ ଚିହ୍ନଟ ହେଲା ନାହିଁ"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ଡିଭାଇସ୍‍ର ସାମ୍ନାରେ ଫେସ୍‍ ସିଧା ରଖନ୍ତୁ।"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"ଫେସ୍‍ର ହାର୍ଡୱେୟାର୍‍ ଉପଲବ୍ଧ ନାହିଁ।"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"ଫେସ୍‍ର ସମୟସୀମା ସରିଗଲା। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"ଫେସ୍‍ ମେମୋରୀରେ ଷ୍ଟୋର୍‍ କରାଯାଇପାରିବ ନାହିଁ।"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"ଫେସ୍‍ର ଅପରେଶନ୍‍ କ୍ୟାନ୍ସଲ୍‍ ହୋ‍ଇଗଲା"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ବାରମ୍ବାର ଚେଷ୍ଟା। ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ଅକ୍ଷମ କରାଗଲା।"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"କୌଣସି ଫେସ୍‍ ପଞ୍ଜୀକୃତ ହୋ‍ଇନଥିଲା।"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ଡିଭାଇସ୍‍ର ଗୋଟିଏ ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ସେନ୍‍ସର୍‍ ନାହିଁ"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g>ଙ୍କ ଫେସ୍‍"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"ଫେସ୍ ଆଇକନ୍"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ସିଙ୍କ ସେଟିଙ୍ଗକୁ ପଢ଼ନ୍ତୁ"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ଏକ ଆକାଉଣ୍ଟ ପାଇଁ ସିଙ୍କ ସେଟିଙ୍ଗ ପଢ଼ିବାକୁ ଆପ୍‍ଟିକୁ ଅନୁମତି ଦିଏ। ଉଦାହରଣସ୍ୱରୂପ, ଲୋକଙ୍କ ଆପ୍‍ ଏକ ଆକାଉଣ୍ଟରେ ସିଙ୍କ ହୋଇଛି କି ନାହିଁ ଏହା ଜାଣିପାରେ।"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ସିଙ୍କ ଅନ୍‍ ଓ ଅଫ୍‍ ଟୋଗଲ୍‌ କରନ୍ତୁ"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"ୱାଇ-ଫାଇର କୌଣସି ଇଣ୍ଟରନେଟ୍‍ ଆକ୍ସେସ୍‍ ନାହିଁ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ବିକଳ୍ପ ପାଇଁ ଟାପ୍‍ କରନ୍ତୁ"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"ଆପଣଙ୍କର ହଟ୍‌ସ୍ପଟ୍‍ ସେଟିଙ୍ଗକୁ ବଦଳିଯାଇଛି"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ଆପଣଙ୍କର ହଟ୍‍ସ୍ପଟ୍‌ ପରିବର୍ତ୍ତନ କରାଯାଇଛି"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"କେବଳ 5GHz ପାଇଁ, ଏହି ଡିଭାଇସ୍‍ ଆପଣଙ୍କର ପସନ୍ଦକୁ ସପୋର୍ଟ କରେନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ, ଏହି ଡିଭାଇସ୍‍ 5GHz ବ୍ୟାଣ୍ଡ ବ୍ୟବହାର କରିବ।"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>କୁ ବଦଳାଗଲା"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>ର ଇଣ୍ଟରନେଟ୍‍ ଆକ୍ସେସ୍ ନଥିବାବେଳେ ଡିଭାଇସ୍‍ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ବ୍ୟବହାର କରିଥାଏ। ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ।"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ରୁ <xliff:g id="NEW_NETWORK">%2$s</xliff:g>କୁ ବଦଳାଗଲା"</string>
@@ -1262,7 +1298,8 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ଏହି ଡିଭାଇସ୍‌ର ସମସ୍ୟା ସମାଧାନ କରିବା ପାଇଁ ଆପଣଙ୍କର ଆଡମିନ୍‌ ଏକ ବଗ୍‍ ରିପୋର୍ଟ ମାଗିଛନ୍ତି। ଆପ୍‍ ଓ ଡାଟା ଶେୟର୍‌ କରାଯାଇପାରେ।"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ଶେୟାର୍‌ କରନ୍ତୁ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ପ୍ରତ୍ୟାଖ୍ୟାନ କରନ୍ତୁ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"କୀ’ବୋର୍ଡ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
+ <!-- no translation found for select_input_method (4653387336791222978) -->
+ <skip />
<string name="show_ime" msgid="2506087537466597099">"ଫିଜିକାଲ୍‌ କୀ’ବୋର୍ଡ ସକ୍ରିୟ ଥିବାବେଳେ ଏହାକୁ ସ୍କ୍ରୀନ୍‌ ଉପରେ ରଖନ୍ତୁ"</string>
<string name="hardware" msgid="194658061510127999">"ଭର୍ଚୁଆଲ୍ କୀ’ବୋର୍ଡ ଦେଖାନ୍ତୁ"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ଫିଜିକଲ୍ କୀ\'ବୋର୍ଡ କନଫିଗର୍‍ କରନ୍ତୁ"</string>
@@ -1694,8 +1731,7 @@
<string name="package_updated_device_owner" msgid="1847154566357862089">"ଆପଣଙ୍କ ଆଡମିନ୍‌‌ ଅପଡେଟ୍‍ କରିଛନ୍ତି"</string>
<string name="package_deleted_device_owner" msgid="2307122077550236438">"ଆପଣଙ୍କ ଆଡମିନ୍‌‌ ଡିଲିଟ୍‍ କରିଛନ୍ତି"</string>
<string name="battery_saver_description_with_learn_more" msgid="6323937147992667707">"ବ୍ୟାଟେରୀର କାର୍ଯ୍ୟକାଳକୁ ବଢ଼ାଇବା ପାଇଁ, ବ୍ୟାଟେରୀ ସେଭର୍ କିଛି ଡିଭାଇସ୍‍ ଫିଚର୍‌କୁ ବନ୍ଦ କରିବା ସହ କେତେକ ଆପ୍‌କୁ ଚାଲିବାରୁ ରୋକିଥାଏ। "<annotation id="url">"ଅଧିକ ଜାଣନ୍ତୁ"</annotation></string>
- <!-- no translation found for battery_saver_description (769989536172631582) -->
- <skip />
+ <string name="battery_saver_description" msgid="769989536172631582">"ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ଆୟୁଶ ବଢାଇବାକୁ, ବ୍ୟାଟେରୀ ସେଭର୍‌ କିଛି ଡିଭାଇସ୍ ‌ଫିଚର୍‌ଗୁଡିକୁ ବନ୍ଦ କରେ ଏବଂ ଆପ୍‌ଗୁଡିକୁ ପ୍ରତିବନ୍ଧିତ କରିଥାଏ।"</string>
<string name="data_saver_description" msgid="6015391409098303235">"ଡାଟା ବ୍ୟବହାର କମ୍‍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍‍ ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍‍କୁ ବ୍ଲକ୍‌ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍‍, ଡାଟା ଆକ୍ସେସ୍‍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍‍ ସମୟରେ କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ, ଯେପରି, ଆପଣ ଟାପ୍‍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଯେଉଁ ଇମେଜ୍‍ ଦେଖାଯାଏ ନାହିଁ।"</string>
<string name="data_saver_enable_title" msgid="4674073932722787417">"ଡାଟା ସେଭର୍‌ ଅନ୍ କରିବେ?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"ଅନ୍ କରନ୍ତୁ"</string>
@@ -1874,10 +1910,8 @@
<string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ନିଃଶବ୍ଦ କରିଦିଆଯିବ"</string>
<string name="notification_channel_system_changes" msgid="5072715579030948646">"ସିଷ୍ଟମ୍‌ରେ ପରିବର୍ତ୍ତନ"</string>
<string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string>
- <!-- no translation found for zen_upgrade_notification_visd_title (3288313883409759733) -->
- <skip />
- <!-- no translation found for zen_upgrade_notification_visd_content (5533674060311631165) -->
- <skip />
+ <string name="zen_upgrade_notification_visd_title" msgid="3288313883409759733">"ନୂଆ: \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ମୋଡ୍‌ ଅନ୍‌ ଥିବା ଯୋଗୁଁ ବିଜ୍ଞପ୍ତି ଲୁଚାଇ ଦିଆଯାଉଛି"</string>
+ <string name="zen_upgrade_notification_visd_content" msgid="5533674060311631165">"ଅଧିକ ଜାଣିବାକୁ ଟ୍ୟାପ୍‌ କରନ୍ତୁ ଏବଂ ବଦଳାନ୍ତୁ।"</string>
<string name="zen_upgrade_notification_title" msgid="3799603322910377294">"’ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ’ ବଦଳିଯାଇଛି"</string>
<string name="zen_upgrade_notification_content" msgid="1794994264692424562">"କ’ଣ ଅବରୋଧ ହୋଇଛି ଯାଞ୍ଚ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="notification_app_name_system" msgid="4205032194610042794">"ସିଷ୍ଟମ୍‌"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index d0230d71a539..48c1a38f4cb6 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ਏਅਰਪਲੇਨ ਮੋਡ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ਏਅਰਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੈ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ਏਅਰਪਲੇਨ ਮੋਡ ਬੰਦ ਹੈ"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"ਬੈਟਰੀ ਸੇਵਰ"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਹੈ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ਸੈਟਿੰਗਾਂ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ਸਹਾਇਤਾ ਕਰੋ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ਟਿਕਾਣਾ"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਤ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚੋ"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਐਪ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਹੀ ਐਪ ਕੋਲ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ।"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਹਮੇਸ਼ਾਂ ਇਸ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ਐਪ ਕੋਲ ਹਮੇਸ਼ਾਂ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ, ਭਾਵੇਂ ਤੁਸੀਂ ਐਪ ਦੀ ਵਰਤੋਂ ਨਾ ਕਰ ਰਹੇ ਹੋਵੋ।"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ਕੈਲੰਡਰ"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"ਕੀ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨੀ ਦੇਣੀ ਹੈ?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀ ਹੈ, ਹਟਾ ਸਕਦੀ ਹੈ, ਜਾਂ ਬਦਲ ਸਕਦੀ ਹੈ। ਇਹ ਐਪ ਉਹਨਾਂ ਸੁਨੇਹਿਆਂ ਨੂੰ ਭੇਜ ਸਕਦੀ ਹੈ ਜੋ ਕੈਲੰਡਰ ਮਾਲਕਾਂ ਤੋਂ ਆਉਂਦੇ ਜਾਪ ਸਕਦੇ ਹਨ, ਜਾਂ ਉਹਨਾਂ ਦੇ ਮਾਲਕਾਂ ਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਇਵੈਂਟਾਂ ਨੂੰ ਬਦਲ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ਵਾਧੂ ਟਿਕਾਣਾ ਪ੍ਰਦਾਤਾ ਕਮਾਂਡਾਂ ਤੱਕ ਪਹੁੰਚ"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ਐਪ ਨੂੰ ਵਾਧੂ ਟਿਕਾਣਾ ਪ੍ਰਦਾਤਾ ਕਮਾਂਡਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ GPS ਜਾਂ ਹੋਰ ਟਿਕਾਣਾ ਸਰੋਤਾਂ ਦੇ ਓਪਰੇਸ਼ਨ ਵਿੱਚ ਵਿਘਨ ਪਾਉਣ ਦੀ ਆਗਿਆ ਦੇ ਸਕਦਾ ਹੈ।"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"ਸਟੀਕ ਟਿਕਾਣੇ \'ਤੇ ਪਹੁੰਚ ਕਰੋ (GPS ਅਤੇ ਨੈੱਟਵਰਕ-ਆਧਾਰਿਤ)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ਇਹ ਐਪ GPS ਜਾਂ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਦੁਆਰਾ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ। ਇਸ ਨਾਲ ਬੈਟਰੀ ਦੀ ਖਪਤ ਵਧ ਸਕਦੀ ਹੈ।"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"ਸਿਰਫ਼ ਫੋਰਗ੍ਰਾਊਂਡ ਵਿੱਚ ਸਟੀਕ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"ਇਹ ਐਪ ਫੋਰਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੋਣ \'ਤੇ ਹੀ ਤੁਹਾਡਾ ਸਟੀਕ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਵੱਲੋਂ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ। ਇਸ ਨਾਲ ਬੈਟਰੀ ਦੀ ਖਪਤ ਵਧ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ਅੰਦਾਜ਼ਨ ਟਿਕਾਣੇ \'ਤੇ ਪਹੁੰਚ ਕਰੋ (ਨੈੱਟਵਰਕ-ਆਧਾਰਿਤ)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ਇਹ ਐਪ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਦੁਆਰਾ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ।"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ਇਹ ਐਪ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਵੱਲੋਂ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਟੀਵੀ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ।"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ਇਹ ਐਪ ਨੈੱਟਵਰਕ ਸਰੋਤਾਂ ਜਿਵੇਂ ਕਿ ਸੈੱਲ ਟਾਵਰਾਂ ਅਤੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ \'ਤੇ ਆਧਾਰਿਤ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਵੱਲੋਂ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕੀਤੇ ਜਾਣ ਦੇ ਯੋਗ ਹੋਣ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ।"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਸਟੀਕ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"ਇਹ ਐਪ ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਹੋਣ \'ਤੇ ਕਿਸੇ ਵੇਲੇ ਵੀ ਤੁਹਾਡਾ ਸਟੀਕ ਟਿਕਾਣਾ ਪਤਾ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਵੱਲੋਂ ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇਹ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਫ਼ੋਨ \'ਤੇ ਉਪਲਬਧ ਹੋਣੀਆਂ ਅਤੇ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਣੀਆਂ ਲਾਜ਼ਮੀ ਹਨ। ਇਸ ਨਾਲ ਬੈਟਰੀ ਦੀ ਖਪਤ ਵਧ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ਆਪਣੀਆਂ ਆਡੀਓ ਸੈਟਿੰਗਾਂ ਬਦਲੋ"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ਐਪ ਨੂੰ ਗਲੋਬਲ ਆਡੀਓ ਸੈਟਿੰਗਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜਿਵੇਂ ਅਵਾਜ਼ ਅਤੇ ਆਊਟਪੁਟ ਲਈ ਕਿਹੜਾ ਸਪੀਕਰ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ।"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">" ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਚਿਹਰਾ ਟੈਮਪਲੇਟ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦਿੰਦੀ ਹੈ।"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਨਹੀਂ ਹੋਈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ਚਿਹਰਾ ਬਹੁਤ ਚਮਕਦਾਰ ਹੈ। ਘੱਟ ਰੋਸ਼ਨੀ ਵਿੱਚ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ਚਿਹਰਾ ਹਨੇਰੇ ਵਿੱਚ ਹੈ। ਚਾਨਣ ਕਰੋ।"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"ਚਿਹਰੇ ਨੂੰ ਸੈਂਸਰ ਤੋਂ ਦੂਰ ਲਿਜਾਓ।"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"ਚਿਹਰੇ ਨੂੰ ਸੈਂਸਰ ਦੇ ਨੇੜੇ ਲਿਆਓ।"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"ਸੈਂਸਰ ਨੂੰ ਉੱਪਰ ਕਰੋ।"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"ਸੈਂਸਰ ਨੂੰ ਥੱਲੇ ਕਰੋ।"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"ਸੈਂਸਰ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ।"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"ਸੈਂਸਰ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ।"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"ਕਿਰਪਾ ਕਰਕੇ ਸੈਂਸਰ ਵੱਲ ਦੇਖੋ।"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"ਕੋਈ ਚਿਹਰਾ ਨਹੀਂ ਦਿਸਿਆ।"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ਚਿਹਰੇ ਨੂੰ ਡੀਵਾਈਸ ਦੇ ਸਾਹਮਣੇ ਸਥਿਰ ਰੱਖੋ।"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"ਚਿਹਰਾ ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"ਚਿਹਰਾ ਪਛਾਣਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"ਚਿਹਰੇ ਦੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਬੰਦ ਹੈ।"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"ਕੋਈ ਚਿਹਰਾ ਜਾਣਕਾਰੀ ਦਰਜ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਕੋਈ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਸੈਂਸਰ ਨਹੀਂ ਹੈ"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"ਚਿਹਰਾ <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"ਚਿਹਰਾ ਪ੍ਰਤੀਕ"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹੋ"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ਐਪ ਨੂੰ ਕਿਸੇ ਖਾਤੇ ਲਈ ਸਮਕਾਲੀਕਰਨ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਹ ਪਤਾ ਕਰ ਸਕਦਾ ਹੈ ਕਿ People ਐਪ ਦਾ ਕਿਸੇ ਖਾਤੇ ਨਾਲ ਸਮਕਾਲੀਕਿਰਤ ਕੀਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਹੀਂ।"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਅਤੇ ਬੰਦ ਨੂੰ ਟੌਗਲ ਕਰੋ"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"ਵਾਈ-ਫਾਈ ਦੀ ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"ਤੁਹਾਡੀਆਂ ਹੌਟਸਪੌਟ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬਦਲਾਅ"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ਤੁਹਾਡਾ ਹੌਟਸਪੌਟ ਬੈਂਡ ਬਦਲ ਗਿਆ ਹੈ।"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ਇਹ ਡੀਵਾਈਸ ਸਿਰਫ਼ 5GHz ਦੀ ਤੁਹਾਡੀ ਤਰਜੀਹ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਇਸਦੀ ਬਜਾਏ, ਇਹ ਡੀਵਾਈਸ ਉਪਲਬਧ ਹੋਣ \'ਤੇ 5GHz ਬੈਂਡ ਵਰਤੇਗਾ।"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"ਬਦਲਕੇ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ਲਿਆਂਦਾ ਗਿਆ"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ਦੀ ਇੰਟਰਨੈੱਟ \'ਤੇ ਪਹੁੰਚ ਨਾ ਹੋਣ \'ਤੇ ਡੀਵਾਈਸ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ।"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ਤੋਂ ਬਦਲਕੇ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> \'ਤੇ ਕੀਤਾ ਗਿਆ"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਇਸ ਡੀਵਾਈਸ ਦੀ ਸਮੱਸਿਆ ਨੂੰ ਠੀਕ ਕਰਨ ਵਿੱਚ ਮਦਦ ਲਈ ਬੱਗ ਰਿਪੋਰਟ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ਸਾਂਝਾ ਕਰੋ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"ਕੀ-ਬੋਰਡ ਬਦਲੋ"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ਇਨਪੁਟ ਵਿਧੀ ਚੁਣੋ"</string>
<string name="show_ime" msgid="2506087537466597099">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ ਸਰਗਰਮ ਹੋਣ ਦੌਰਾਨ ਇਸ ਨੂੰ ਸਕ੍ਰੀਨ \'ਤੇ ਬਣਾਈ ਰੱਖੋ"</string>
<string name="hardware" msgid="194658061510127999">"ਆਭਾਸੀ ਕੀ-ਬੋਰਡ ਦਿਖਾਓ"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ ਦੀ ਰੂਪ-ਰੇਖਾ ਬਦਲੋ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index f32749d009c5..188e3e46b5e1 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Tryb samolotowy"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Tryb samolotowy jest włączony"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Tryb samolotowy jest wyłączony"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Oszczędzanie baterii"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Oszczędzanie baterii WYŁ."</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Oszczędzanie baterii WŁ."</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ustawienia"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoc"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asystent głosowy"</string>
@@ -282,6 +279,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokalizacja"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"dostęp do informacji o lokalizacji tego urządzenia"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Zezwolić aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do lokalizacji urządzenia?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacja będzie mieć dostęp do lokalizacji tylko wtedy, gdy jest używana."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Zawsze zezwalać aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> na dostęp do lokalizacji urządzenia?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacja będzie zawsze mieć dostęp do lokalizacji, nawet wtedy, gdy nie jest używana."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendarz"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"dostęp do kalendarza"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Zezwolić aplikacji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na dostęp do kalendarza?"</string>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Ta aplikacja może dodawać, usuwać i zmieniać wydarzenia z kalendarza na telefonie. Ta aplikacja może wysyłać wiadomości wyglądające jak utworzone przez właścicieli kalendarza lub zmieniać wydarzenia bez wiedzy ich właścicieli."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"dostęp do dodatkowych poleceń dostawcy informacji o lokalizacji"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Pozwala aplikacji na dostęp do dodatkowych poleceń dostawcy informacji o lokalizacji. Aplikacje z tym uprawnieniem mogą wpływać na działanie GPS-a lub innych źródeł lokalizacji."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"dostęp do dokładnej lokalizacji (na podstawie GPS-a i sieci)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Ta aplikacja może określać Twoją lokalizację na podstawie GPS-a lub sieciowych źródeł lokalizacji, takich jak stacje bazowe i sieci Wi-Fi. Te usługi lokalizacyjne muszą być włączone i dostępne na telefonie, by aplikacja mogła z nich korzystać. Może to zwiększyć zużycie baterii."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"dostęp do dokładnej lokalizacji tylko na pierwszym planie"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Ta aplikacja może określić Twoją dokładną lokalizację tylko wtedy, gdy działa na pierwszym planie. Te usługi lokalizacyjne muszą być włączone i dostępne na telefonie, by aplikacja mogła z nich korzystać. Może to zwiększyć zużycie baterii."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"dostęp do przybliżonej lokalizacji (na podstawie sieci)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Ta aplikacja może określać Twoją lokalizację na podstawie źródeł sieciowych, takich jak stacje bazowe i sieci Wi-Fi. Te usługi lokalizacyjne muszą być włączone i dostępne na tablecie, by aplikacja mogła z nich korzystać."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Ta aplikacja może określać Twoją lokalizację na podstawie źródeł sieciowych, takich jak stacje bazowe i sieci Wi-Fi. Te usługi lokalizacyjne muszą być włączone i dostępne na telewizorze, by aplikacja mogła z nich korzystać."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Ta aplikacja może określać Twoją lokalizację na podstawie źródeł sieciowych, takich jak stacje bazowe i sieci Wi-Fi. Te usługi lokalizacyjne muszą być włączone i dostępne na telefonie, by aplikacja mogła z nich korzystać."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"dostęp do dokładnej lokalizacji w tle"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Ta aplikacja może określić Twoją dokładną lokalizację w dowolnym momencie, działając w tle. Te usługi lokalizacyjne muszą być włączone i dostępne na telefonie, by aplikacja mogła z nich korzystać. Może to zwiększyć zużycie baterii."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"zmienianie ustawień audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Pozwala aplikacji na modyfikowanie globalnych ustawień dźwięku, takich jak głośność oraz urządzenie wyjściowe."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"nagrywanie dźwięku"</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odcisku palca"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"zarządzanie sprzętem do uwierzytelniania za pomocą twarzy"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Zezwala na aktywowanie przez aplikację metody dodawania i usuwania szablonów twarzy."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"używanie sprzętu do uwierzytelniania za pomocą twarzy"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Zezwala na używanie przez aplikację sprzętu do analizy twarzy na potrzeby uwierzytelniania"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Nie można przeanalizować twarzy. Spróbuj ponownie."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Zbyt jasna twarz. Spróbuj w ciemniejszym miejscu."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Zbyt ciemna twarz. Spróbuj w jaśniejszym miejscu."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Oddal czujnik od twarzy."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Przybliż czujnik do twarzy."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Przesuń czujnik wyżej."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Przesuń czujnik niżej."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Przesuń czujnik w prawo."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Przesuń czujnik w lewo."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Spójrz na czujnik."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nie wykryto twarzy."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Nie ruszaj twarzą, patrząc na urządzenie."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Czujnik twarzy nie jest dostępny."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Upłynął limit czasu analizy twarzy. Spróbuj ponownie."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Nie można zapisać informacji o twarzy."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Analiza twarzy została anulowana."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Zbyt wiele prób. Spróbuj ponownie później."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Zbyt wiele prób. Wyłączono uwierzytelnianie za pomocą twarzy."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Spróbuj ponownie."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nie zarejestrowano twarzy."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"To urządzenie nie jest wyposażone w czujnik twarzy"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Twarz <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikona twarzy"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"czytanie ustawień synchronizacji"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Zezwala aplikacji na odczyt ustawień synchronizacji konta. Pozwala to na przykład określić, czy aplikacja Ludzie jest zsynchronizowana z kontem."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"włączanie i wyłączanie synchronizacji"</string>
@@ -610,7 +643,7 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Wymaganie szyfrowania przechowywanych danych aplikacji"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Wyłącz aparaty"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Zapobieganie używaniu wszystkich aparatów w urządzeniu"</string>
- <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Wył. niektórych funkcji bl. ekr."</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Wył. funkcji blokady ekranu"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Zapobieganie użyciu niektórych funkcji blokady ekranu."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Dom"</item>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Sieć Wi-Fi nie ma dostępu do internetu"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Kliknij, by wyświetlić opcje"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Zmieniono ustawienia hotspotu"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Zmieniono pasmo hotspotu."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"To urządzenie nie może korzystać tylko z częstotliwości 5 GHz. Będzie korzystać z tego pasma, jeśli będzie ono dostępne."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Zmieniono na połączenie typu <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Urządzenie korzysta z połączenia typu <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, gdy <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nie dostępu do internetu. Mogą zostać naliczone opłaty."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Przełączono z połączenia typu <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na <xliff:g id="NEW_NETWORK">%2$s</xliff:g>."</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administrator poprosił o raport o błędzie, by szybciej rozwiązać problemy na tym urządzeniu. Raport może zawierać informacje o aplikacjach i inne dane."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"UDOSTĘPNIJ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ODRZUĆ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Zmień klawiaturę"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Wybierz metodę wprowadzania"</string>
<string name="show_ime" msgid="2506087537466597099">"Pozostaw na ekranie, gdy aktywna jest klawiatura fizyczna"</string>
<string name="hardware" msgid="194658061510127999">"Pokaż klawiaturę wirtualną"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Skonfiguruj klawiaturę fizyczną"</string>
@@ -1450,7 +1486,7 @@
<string name="add_account_button_label" msgid="3611982894853435874">"Dodaj konto"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Zwiększ"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Zmniejsz"</string>
- <string name="number_picker_increment_scroll_mode" msgid="5259126567490114216">"<xliff:g id="VALUE">%s</xliff:g> dotknij i przytrzymaj."</string>
+ <string name="number_picker_increment_scroll_mode" msgid="5259126567490114216">"<xliff:g id="VALUE">%s</xliff:g> naciśnij i przytrzymaj."</string>
<string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Przesuń w górę, by zwiększyć, i w dół, by zmniejszyć."</string>
<string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Zmień minutę na późniejszą"</string>
<string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Zmień minutę na wcześniejszą"</string>
@@ -1477,7 +1513,7 @@
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Nie udało się uruchomić aplikacji <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Udostępnij przez:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Udostępnij przez <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
- <string name="content_description_sliding_handle" msgid="415975056159262248">"Uchwyt przesuwny. Dotknij i przytrzymaj."</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"Uchwyt przesuwny. Naciśnij i przytrzymaj."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Przesuń, aby odblokować."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Przejdź do strony głównej"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Przejdź wyżej"</string>
diff --git a/core/res/res/values-port/dimens_package_installer.xml b/core/res/res/values-port/dimens_package_installer.xml
new file mode 100644
index 000000000000..67cafe752409
--- /dev/null
+++ b/core/res/res/values-port/dimens_package_installer.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<!-- portrait dimensions for the permission grant dialog. -->
+<resources>
+ <!-- 380:20 == 95% width -->
+ <dimen name="permissionGrantDialogWidth">380</dimen>
+</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 4b399ea785c7..6c0391c0276b 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avião"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avião ATIVADO"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avião DESATIVADO"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Economia de bateria"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"A Economia de bateria está DESATIVADA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"A Economia de bateria está ATIVADA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configurações"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ajuda de voz"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Local"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acesse o local do dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse a localização deste dispositivo?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"O app só terá acesso ao local enquanto estiver sendo usado."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Sempre permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse o local deste disp.?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"O app sempre terá acesso ao local, mesmo quando não estiver sendo usado."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acesse sua agenda"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse sua agenda?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Este app pode adicionar, remover ou alterar eventos da agenda no seu smartphone. Ele também pode enviar mensagens que aparentem ser de autoria do proprietário da agenda ou alterar eventos sem notificar o proprietário."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acessar comandos extras do provedor de localização"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite que o app acesse comandos do provedor não relacionados à localização. Isso pode permitir que o app interfira no funcionamento do GPS ou de outras fontes de localização."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"acessar localização precisa (GPS e com base na rede)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Este app pode ver seu local com base no GPS ou nas fontes de localização da rede, como torres de celular e redes Wi-Fi. Esses serviços de localização precisam estar ativados e disponíveis no seu smartphone para que o app possa usá-los. Isso pode aumentar o consumo de bateria."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"acessar localização precisa apenas em primeiro plano"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Este app pode ver sua localização exata a qualquer momento apenas quando está em primeiro plano. Esses serviços de localização precisam estar ativados e disponíveis no seu smartphone para que o app possa usá-los. Isso pode aumentar o consumo de bateria."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"acessar localização aproximada (com base na rede)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Este app pode ver seu local com base nas fontes de rede, como torres de celular e redes Wi-Fi. Esses serviços de localização precisam estar ativados e disponíveis no seu tablet para que o app possa usá-los."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Este app pode ver seu local com base nas fontes de rede, como torres de celular e redes Wi-Fi. Esses serviços de localização precisam estar ativados e disponíveis na sua TV para que o app possa usá-los."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Este app pode ver seu local com base nas fontes de rede, como torres de celular e redes Wi-Fi. Esses serviços de localização precisam estar ativados e disponíveis no seu smartphone para que o app possa usá-los."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"acessar localização precisa em segundo plano"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Este app pode ver sua localização exata a qualquer momento quando está em segundo plano. Esses serviços de localização precisam estar ativados e disponíveis no seu smartphone para que o app possa usá-los. Isso pode aumentar o consumo de bateria."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"alterar as suas configurações de áudio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite que o app modifique configurações de áudio globais como volume e alto-falantes de saída."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"gravar áudio"</string>
@@ -433,9 +435,9 @@
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"impedir modo de inatividade do tablet"</string>
<string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"impedir a suspensão da TV"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"impedir modo de inatividade do telefone"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Permite que o app impeça o tablet de entrar no modo de inatividade."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Permite que o app impeça a suspensão do tablet."</string>
<string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"Permite que o app impeça a suspensão da TV."</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Permite que o app impeça o telefone de entrar no modo de inatividade."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Permite que o app impeça a suspensão do telefone."</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"transmitir infravermelhos"</string>
<string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"Permite que o app use o transmissor infravermelho do tablet."</string>
<string name="permdesc_transmitIr" product="tv" msgid="3926790828514867101">"Permite que o app use o transmissor de infravermelho da TV."</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"gerenciar hardware de autenticação facial"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticação facial"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que o app use o hardware de autenticação facial para autenticação"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Falha ao processar o rosto. Tente novamente."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Rosto muito iluminado. Tente com menos iluminação."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Rosto muito escuro. Acrescente uma fonte de luz."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Afaste o sensor do rosto."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Aproxime o sensor do rosto."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Mova o sensor para cima."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Mova o sensor para baixo."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Mova o sensor para a direita."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Mova o sensor para a esquerda."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Olhe para o sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nenhum rosto detectado."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mantenha o rosto parado na frente do dispositivo."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware de rosto não disponível."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Tempo máx. p/ captura facial atingido. Tente novamente."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar um rosto."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Excesso de tentativas. Autenticação facial desat."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nenhum rosto registrado."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Este dispositivo não tem um sensor de autenticação facial"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ícone facial"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar sincronização"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"O Wi‑Fi não tem acesso à Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para ver opções"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Mudanças nas suas configurações de ponto de acesso"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Sua banda de ponto de acesso foi alterada."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo não é compatível com sua preferência apenas por 5 GHz. Em vez disso, o dispositivo usará a banda de 5 GHz quando ela estiver disponível."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Alternado para <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"O dispositivo usa <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> não tem acesso à Internet. Esse serviço pode ser cobrado."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Alternado de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> para <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Seu administrador solicitou um relatório do bug para ajudar a resolver problemas deste dispositivo. É possível que apps e dados sejam compartilhados."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"COMPARTILHAR"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RECUSAR"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Alterar teclado"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Selecione o método de entrada"</string>
<string name="show_ime" msgid="2506087537466597099">"Manter na tela enquanto o teclado físico estiver ativo"</string>
<string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configurar teclado físico"</string>
@@ -1395,7 +1431,7 @@
<string name="gpsVerifYes" msgid="2346566072867213563">"Sim"</string>
<string name="gpsVerifNo" msgid="1146564937346454865">"Não"</string>
<string name="sync_too_many_deletes" msgid="5296321850662746890">"Limite de exclusão excedido"</string>
- <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens excluídos para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que você deseja fazer?"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens excluídos para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que você quer fazer?"</string>
<string name="sync_really_delete" msgid="2572600103122596243">"Excluir os itens"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"Desfazer as exclusões"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"Não fazer nada por enquanto"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 62e202a46b9b..597be1214786 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo de avião"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"O modo de voo está ativado"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"O modo de voo está desativado"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Poupança de bateria"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Poupança de bateria DeSATIVADA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Poupança de bateria ATIVADA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Definições"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. de voz"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Localização"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"aceder à localização do seu dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda à localização deste dispositivo?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"A aplicação tem acesso à localização apenas quando a estiver a utilizar."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda sempre à localização deste dispositivo?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"A aplicação terá sempre acesso à localização, mesmo quando não está a utilizá-la."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendário"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"aceder ao calendário"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Pretende permitir que a aplicação &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda ao calendário?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Esta aplicação pode adicionar, remover ou alterar eventos do calendário no seu telemóvel. Esta aplicação pode enviar mensagens que parecem vir de proprietários do calendário ou alterar eventos sem notificar os respetivos proprietários."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"aceder a comandos adicionais do fornecedor de localização"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite que a aplicação aceda a comandos adicionais do fornecedor de localização. Esta opção pode permitir que a aplicação interfira com o funcionamento do GPS ou de outras fontes de localização."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"aceder à localização exata (baseada no GPS e na rede)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Esta aplicação pode obter a sua localização com base em fontes de localização da rede e de GPS, tais como torres de redes móveis e redes Wi-Fi. É necessário que estes serviços de localização estejam ativados e disponíveis no seu telemóvel para que a aplicação os possa utilizar. Esta ação pode aumentar o consumo da bateria."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"apenas aceder à localização exata em primeiro plano"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Esta aplicação apenas pode obter a sua localização exata quando estiver em primeiro plano. É necessário que estes Serviços de localização estejam ativados e disponíveis no seu telemóvel para que a aplicação os possa utilizar. Esta ação pode aumentar o consumo da bateria."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"aceder à localização aproximada (baseada na rede)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Esta aplicação pode obter a sua localização com base em fontes de rede, tais como torres de redes móveis e redes Wi-Fi. É necessário que estes serviços de localização estejam ativados e disponíveis no seu tablet para que a aplicação os possa utilizar."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Esta aplicação pode obter a sua localização com base em fontes de rede, tais como torres de redes móveis e redes Wi-Fi. É necessário que estes serviços de localização estejam ativados e disponíveis na sua TV para que a aplicação os possa utilizar."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Esta aplicação pode obter a sua localização com base em fontes de rede, tais como torres de redes móveis e redes Wi-Fi. É necessário que estes serviços de localização estejam ativados e disponíveis no seu telemóvel para que a aplicação os possa utilizar."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"aceder à localização exata em segundo plano"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Esta aplicação pode obter a sua localização exata sempre que estiver em segundo plano. É necessário que estes Serviços de localização estejam ativados e disponíveis no seu telemóvel para que a aplicação os possa utilizar. Esta ação pode aumentar o consumo da bateria."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"alterar as suas definições de áudio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite que a aplicação modifique definições de áudio globais, tais como o volume e qual o altifalante utilizado para a saída de som."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"gravar áudio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"gerir hardware de autenticação facial"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite à aplicação invocar métodos para adicionar e eliminar modelos faciais para uso."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilizar hardware de autenticação facial"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que a aplicação utilize hardware de autenticação facial para autenticação."</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Não foi possível processar o rosto. Tente de novo."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Rosto demasiado claro. Experimente com menos luz."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Rosto demasiado escuro. Destape a fonte de luz."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Afaste o sensor do rosto."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Aproxime o sensor do rosto."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Mova o sensor para cima."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Mova o sensor para baixo."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Mova o sensor para a direita."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Mova o sensor para a esquerda."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Olhe para o sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nenhum rosto detetado."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mantenha o rosto parado em frente ao dispositivo."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"O hardware de rosto não está disponível."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Limite de tempo de rosto atingido. Tente novamente."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar o rosto."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Operação de rosto cancelada."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Demasiadas tentativas. Tente novamente mais tarde."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiadas tentativas. Autenticação facial desativada."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nenhum rosto inscrito."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Este dispositivo não tem sensor de autenticação facial."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ícone de rosto"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler definições de sincronização"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que a aplicação leia as definições de sincronização de uma conta. Por exemplo, pode determinar se a aplicação Pessoas está sincronizada com uma conta."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar a sincronização"</string>
@@ -585,13 +618,13 @@
<string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"Monitorizar o número de palavras-passe incorretas introduzidas ao desbloquear o ecrã e bloquear a TV ou apagar todos os dados deste utilizador se forem introduzidas demasiadas palavras-passe incorretas."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"Monitorizar o número de palavras-passe incorretas introduzidas ao desbloquear o ecrã e bloquear o telemóvel ou apagar todos os dados deste utilizador se forem introduzidas demasiadas palavras-passe incorretas."</string>
<string name="policylab_resetPassword" msgid="4934707632423915395">"Alterar o bloqueio de ecrã"</string>
- <string name="policydesc_resetPassword" msgid="1278323891710619128">"Alterar o bloqueio de ecrã."</string>
+ <string name="policydesc_resetPassword" msgid="1278323891710619128">"Altera o bloqueio de ecrã."</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"Bloquear o ecrã"</string>
- <string name="policydesc_forceLock" msgid="1141797588403827138">"Controlar como e quando ocorre o bloqueio do ecrã."</string>
+ <string name="policydesc_forceLock" msgid="1141797588403827138">"Controla como e quando ocorre o bloqueio do ecrã."</string>
<string name="policylab_wipeData" msgid="3910545446758639713">"Apagar todos os dados"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Apagar os dados do tablet sem avisar através de uma reposição de dados de fábrica."</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Apagar os dados da TV sem aviso prévio ao executar uma reposição de dados de fábrica."</string>
- <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Apagar os dados do telemóvel sem avisar através de uma reposição de dados de fábrica."</string>
+ <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Apaga os dados do telemóvel sem avisar ao efetuar uma reposição de dados de fábrica."</string>
<string name="policylab_wipeData_secondaryUser" msgid="8362863289455531813">"Apagar os dados do utilizador"</string>
<string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="6336255514635308054">"Apagar os dados deste utilizador neste tablet sem aviso."</string>
<string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2086473496848351810">"Apagar os dados deste utilizador nesta TV sem aviso."</string>
@@ -605,7 +638,7 @@
<string name="policylab_disableCamera" msgid="6395301023152297826">"Desativar câmaras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Evitar a utilização de todas as câmaras do dispositivo."</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Desat. funcionalid. bloq. ecrã"</string>
- <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Impeça a utilização de algumas funcionalidades de bloqueio de ecrã."</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Impede a utilização de algumas funcionalidades de bloqueio de ecrã."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Casa"</item>
<item msgid="869923650527136615">"Móvel"</item>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"O Wi-Fi não tem acesso à Internet."</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para obter mais opções"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Alterações às definições de zona Wi-Fi"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"A banda da sua zona Wi-Fi foi alterada."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo não suporta a sua preferência apenas para 5 GHz. Em alternativa, este dispositivo vai utilizar a banda de 5 GHz quando estiver disponível."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Mudou para <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"O dispositivo utiliza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> não tem acesso à Internet. Podem aplicar-se custos."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Mudou de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> para <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"O seu gestor solicitou um relatório de erro para ajudar na resolução de problemas deste dispositivo. As aplicações e os dados podem ser partilhados."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"PARTILHAR"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RECUSAR"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Alterar teclado"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Escolher o método de entrada"</string>
<string name="show_ime" msgid="2506087537466597099">"Manter no ecrã enquanto o teclado físico estiver ativo"</string>
<string name="hardware" msgid="194658061510127999">"Mostrar o teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configurar teclado físico"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 4b399ea785c7..6c0391c0276b 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avião"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avião ATIVADO"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avião DESATIVADO"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Economia de bateria"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"A Economia de bateria está DESATIVADA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"A Economia de bateria está ATIVADA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Configurações"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ajuda de voz"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Local"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acesse o local do dispositivo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse a localização deste dispositivo?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"O app só terá acesso ao local enquanto estiver sendo usado."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Sempre permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse o local deste disp.?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"O app sempre terá acesso ao local, mesmo quando não estiver sendo usado."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acesse sua agenda"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acesse sua agenda?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Este app pode adicionar, remover ou alterar eventos da agenda no seu smartphone. Ele também pode enviar mensagens que aparentem ser de autoria do proprietário da agenda ou alterar eventos sem notificar o proprietário."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acessar comandos extras do provedor de localização"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite que o app acesse comandos do provedor não relacionados à localização. Isso pode permitir que o app interfira no funcionamento do GPS ou de outras fontes de localização."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"acessar localização precisa (GPS e com base na rede)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Este app pode ver seu local com base no GPS ou nas fontes de localização da rede, como torres de celular e redes Wi-Fi. Esses serviços de localização precisam estar ativados e disponíveis no seu smartphone para que o app possa usá-los. Isso pode aumentar o consumo de bateria."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"acessar localização precisa apenas em primeiro plano"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Este app pode ver sua localização exata a qualquer momento apenas quando está em primeiro plano. Esses serviços de localização precisam estar ativados e disponíveis no seu smartphone para que o app possa usá-los. Isso pode aumentar o consumo de bateria."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"acessar localização aproximada (com base na rede)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Este app pode ver seu local com base nas fontes de rede, como torres de celular e redes Wi-Fi. Esses serviços de localização precisam estar ativados e disponíveis no seu tablet para que o app possa usá-los."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Este app pode ver seu local com base nas fontes de rede, como torres de celular e redes Wi-Fi. Esses serviços de localização precisam estar ativados e disponíveis na sua TV para que o app possa usá-los."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Este app pode ver seu local com base nas fontes de rede, como torres de celular e redes Wi-Fi. Esses serviços de localização precisam estar ativados e disponíveis no seu smartphone para que o app possa usá-los."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"acessar localização precisa em segundo plano"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Este app pode ver sua localização exata a qualquer momento quando está em segundo plano. Esses serviços de localização precisam estar ativados e disponíveis no seu smartphone para que o app possa usá-los. Isso pode aumentar o consumo de bateria."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"alterar as suas configurações de áudio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite que o app modifique configurações de áudio globais como volume e alto-falantes de saída."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"gravar áudio"</string>
@@ -433,9 +435,9 @@
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"impedir modo de inatividade do tablet"</string>
<string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"impedir a suspensão da TV"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"impedir modo de inatividade do telefone"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Permite que o app impeça o tablet de entrar no modo de inatividade."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Permite que o app impeça a suspensão do tablet."</string>
<string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"Permite que o app impeça a suspensão da TV."</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Permite que o app impeça o telefone de entrar no modo de inatividade."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Permite que o app impeça a suspensão do telefone."</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"transmitir infravermelhos"</string>
<string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"Permite que o app use o transmissor infravermelho do tablet."</string>
<string name="permdesc_transmitIr" product="tv" msgid="3926790828514867101">"Permite que o app use o transmissor de infravermelho da TV."</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"gerenciar hardware de autenticação facial"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticação facial"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que o app use o hardware de autenticação facial para autenticação"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Falha ao processar o rosto. Tente novamente."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Rosto muito iluminado. Tente com menos iluminação."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Rosto muito escuro. Acrescente uma fonte de luz."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Afaste o sensor do rosto."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Aproxime o sensor do rosto."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Mova o sensor para cima."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Mova o sensor para baixo."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Mova o sensor para a direita."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Mova o sensor para a esquerda."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Olhe para o sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nenhum rosto detectado."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mantenha o rosto parado na frente do dispositivo."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware de rosto não disponível."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Tempo máx. p/ captura facial atingido. Tente novamente."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar um rosto."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Excesso de tentativas. Autenticação facial desat."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nenhum rosto registrado."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Este dispositivo não tem um sensor de autenticação facial"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ícone facial"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar sincronização"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"O Wi‑Fi não tem acesso à Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para ver opções"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Mudanças nas suas configurações de ponto de acesso"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Sua banda de ponto de acesso foi alterada."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Este dispositivo não é compatível com sua preferência apenas por 5 GHz. Em vez disso, o dispositivo usará a banda de 5 GHz quando ela estiver disponível."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Alternado para <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"O dispositivo usa <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> não tem acesso à Internet. Esse serviço pode ser cobrado."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Alternado de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> para <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Seu administrador solicitou um relatório do bug para ajudar a resolver problemas deste dispositivo. É possível que apps e dados sejam compartilhados."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"COMPARTILHAR"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RECUSAR"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Alterar teclado"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Selecione o método de entrada"</string>
<string name="show_ime" msgid="2506087537466597099">"Manter na tela enquanto o teclado físico estiver ativo"</string>
<string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configurar teclado físico"</string>
@@ -1395,7 +1431,7 @@
<string name="gpsVerifYes" msgid="2346566072867213563">"Sim"</string>
<string name="gpsVerifNo" msgid="1146564937346454865">"Não"</string>
<string name="sync_too_many_deletes" msgid="5296321850662746890">"Limite de exclusão excedido"</string>
- <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens excluídos para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que você deseja fazer?"</string>
+ <string name="sync_too_many_deletes_desc" msgid="496551671008694245">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens excluídos para <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que você quer fazer?"</string>
<string name="sync_really_delete" msgid="2572600103122596243">"Excluir os itens"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"Desfazer as exclusões"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"Não fazer nada por enquanto"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index b54b11cd2d95..05aed4448feb 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -239,9 +239,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Mod Avion"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modul Avion este ACTIVAT"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modul avion este DEZACTIVAT"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Economisirea energiei"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Economisirea bateriei este dezactivată"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Economisirea bateriei este activată"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Setări"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistență"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistent vocal"</string>
@@ -279,6 +276,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Locație"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"acceseze locația acestui dispozitiv"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze locația acestui dispozitiv?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplicația va avea acces la locație doar atunci când o folosiți."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze locația dispozitivului?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplicația va avea în permanență acces la locație, chiar și atunci când nu o folosiți."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"acceseze calendarul"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Permiteți &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să vă acceseze calendarul?"</string>
@@ -405,12 +405,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Această aplicație poate să adauge, să elimine sau să modifice evenimente din calendarul de pe telefon. Această aplicație poate să trimită mesaje care par trimise de proprietarii calendarului sau să modifice evenimentele fără notificarea acestora."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accesare comenzi suplimentare ale furnizorului locației"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite aplicației să acceseze comenzi suplimentare pentru furnizorul locației. Aplicația ar putea să utilizeze această permisiune pentru a influența operațiile GPS sau ale altor surse de locații."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"să acceseze locația exactă (bazată pe GPS și pe rețea)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Această aplicație vă poate obține locația cu ajutorul sistemului GPS sau al surselor de localizare ale rețelei, cum ar fi turnurile de telefonie mobilă și rețelele Wi-Fi. Aceste servicii de localizare trebuie să fie activate și disponibile pe telefon pentru ca aplicația să le poată folosi. Acest lucru ar putea accelera descărcarea bateriei."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"să acceseze locația exactă în prim-plan"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Aplicația vă poate obține locația exactă numai când rulează în prim-plan. Serviciile de localizare trebuie să fie activate și disponibile pe telefon pentru ca aplicația să le poată folosi. Acest lucru poate accelera descărcarea bateriei."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"să acceseze locația aproximativă (bazată pe rețea)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Această aplicație vă poate obține locația cu ajutorul surselor rețelei, cum ar fi turnurile de telefonie mobilă și rețelele Wi-Fi. Aceste servicii de localizare trebuie să fie activate și disponibile pe tabletă pentru ca aplicația să le poată folosi."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Această aplicație vă poate obține locația cu ajutorul surselor rețelei, cum ar fi turnurile de telefonie mobilă și rețelele Wi-Fi. Aceste servicii de localizare trebuie să fie activate și disponibile pe televizor pentru ca aplicația să le poată folosi."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Această aplicație vă poate obține locația cu ajutorul surselor rețelei, cum ar fi turnurile de telefonie mobilă și rețelele Wi-Fi. Aceste servicii de localizare trebuie să fie activate și disponibile pe telefon pentru ca aplicația să le poată folosi."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"să acceseze locația exactă în fundal"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Aplicația vă poate obține locația exactă ori de câte ori rulează în fundal. Serviciile de localizare trebuie să fie activate și disponibile pe telefon pentru ca aplicația să le poată folosi. Acest lucru poate accelera descărcarea bateriei."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modificare setări audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite aplicației să modifice setările audio globale, cum ar fi volumul și difuzorul care este utilizat pentru ieșire."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"înregistreze sunet"</string>
@@ -518,6 +520,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Pictograma amprentă"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"să gestioneze hardware-ul de autentificare facială"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite aplicației să invoce metode pentru a adăuga și a șterge șabloane faciale pentru utilizare."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"să folosească hardware de autentificare facială"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite aplicației să folosească hardware de autentificare facială pentru autentificare"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Chipul nu a putut fi procesat. Încercați din nou."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Chip prea luminat. Încercați cu mai puțină lumină."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Chip prea întunecat. Măriți sursa de lumină."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Deplasați senzorul mai departe de chip."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Aduceți senzorul mai aproape de chip."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Deplasați senzorul mai sus."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Deplasați senzorul mai jos."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Deplasați senzorul spre dreapta."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Deplasați senzorul spre stânga."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Priviți spre senzor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nu s-a detectat niciun chip."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Țineți chipul nemișcat în fața dispozitivului."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardware-ul pentru chip nu este disponibil."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Timpul pentru reunoaștere facială a expirat. Încercați din nou."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Chipul nu poate fi stocat."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Operațiunea privind chipul a fost anulată."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Prea multe încercări. Reîncercați mai târziu."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Prea multe încercări. Autentificarea facială este dezactivată."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Încercați din nou."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nu au fost înregistrate chipuri."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Dispozitivul nu are un senzor de autentificare a chipului"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Chip <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Pictograma chip"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"citire setări sincronizare"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite aplicației să citească setările de sincronizare ale unui cont. De exemplu, cu această permisiune aplicația poate determina dacă aplicația Persoane este sincronizată cu un anumit cont."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"activează/dezactivează sincronizarea"</string>
@@ -1197,6 +1230,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Rețeaua Wi-Fi nu are acces la internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Atingeți pentru opțiuni"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Modificări aduse setărilor pentru hotspot"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"S-a schimbat banda de frecvență a hotspotului."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Dispozitivul nu acceptă doar preferința pentru 5 GHz. Dispozitivul va folosi banda de 5 GHz când este disponibilă."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"S-a comutat la <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Dispozitivul folosește <xliff:g id="NEW_NETWORK">%1$s</xliff:g> când <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nu are acces la internet. Se pot aplica taxe."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"S-a comutat de la <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> la <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1284,7 +1320,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administratorul dvs. a solicitat un raport de eroare pentru a remedia problemele acestui dispozitiv. Este posibil să se permită accesul la date și aplicații."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"TRIMITEȚI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"REFUZAȚI"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Schimbați tastatura"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Alegeți metoda de introducere de text"</string>
<string name="show_ime" msgid="2506087537466597099">"Se păstrează pe ecran cât timp este activată tastatura fizică"</string>
<string name="hardware" msgid="194658061510127999">"Afișați tastatura virtuală"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configurați tastatura fizică"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 687a54231d17..63a8574bd0ea 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим полета"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Выключить"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Включить"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Режим энергосбережения"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Выключить"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Включить"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помощник"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Аудиоподсказки"</string>
@@ -278,22 +275,25 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Переключиться на рабочий профиль"</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="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>
<string name="permgroupdesc_location" msgid="1346617465127855033">"доступ к данным о местоположении устройства"</string>
- <string name="permgrouprequest_location" msgid="3788275734953323491">"Разрешить приложению &lt;b&gt;\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"&lt;/b&gt; доступ к данным о местоположении устройства?"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к данным о местоположении устройства?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Доступ будет открыт, только когда вы пользуетесь приложением."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Всегда разрешать приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к геоданным устройства?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Доступ будет открыт, даже когда вы не пользуетесь приложением."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календарь"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"доступ к календарю"</string>
- <string name="permgrouprequest_calendar" msgid="289900767793189421">"Разрешить приложению &lt;b&gt;\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"&lt;/b&gt; доступ к календарю?"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ к календарю?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"отправлять и просматривать SMS-сообщения"</string>
- <string name="permgrouprequest_sms" msgid="7168124215838204719">"Разрешить приложению &lt;b&gt;\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"&lt;/b&gt; отправлять и просматривать SMS?"</string>
+ <string name="permgrouprequest_sms" msgid="7168124215838204719">"Разрешить приложению &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; отправлять и просматривать SMS?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Хранилище"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"доступ к фото, мультимедиа и файлам на вашем устройстве"</string>
<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_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>
@@ -302,7 +302,7 @@
<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="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="416037179223226722">"Нательные датчики"</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>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Приложение может добавлять, удалять или изменять мероприятия в календаре на телефоне. Оно также может отправлять сообщения от имени владельцев календаря, а также изменять мероприятия без ведома владельца."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Доступ к дополнительным командам управления источниками геоданных"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Доступ к дополнительным командам управления источниками геоданных и вмешательство в работу системы GPS или других источников геоданных."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"Доступ к точному местоположению (по координатам сети и спутникам GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Приложение может получать сведения о вашем местоположении от GPS-датчика или сетевых источников, таких как вышки сотовой связи и точки доступа Wi-Fi. Необходимо включить соответствующие параметры на телефоне и разрешить приложению использовать геоданные. Может увеличиться расход заряда батареи."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"Доступ к точному местоположению только в фоновом режиме"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Приложение может получать сведения о вашем точном местоположении только в фоновом режиме. Для этого необходимо включить соответствующие параметры на телефоне и разрешить использовать геоданные. Может увеличиться расход заряда батареи."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"Доступ к примерному местоположению (по координатам сети)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Приложение может получать сведения о вашем местоположении от сетевых источников, таких как вышки сотовой связи и точки доступа Wi-Fi. Необходимо включить соответствующие параметры на планшете и разрешить приложению использовать геоданные."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Приложение может получать сведения о вашем местоположении от сетевых источников, таких как вышки сотовой связи и точки доступа Wi-Fi. Необходимо включить соответствующие параметры на телевизоре и разрешить приложению использовать геоданные."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Приложение может получать сведения о вашем местоположении от сетевых источников, таких как вышки сотовой связи и точки доступа Wi-Fi. Необходимо включить соответствующие параметры на телефоне и разрешить приложению использовать геоданные."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"Доступ к геоданным в фоновом режиме"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Приложение может получать сведения о вашем точном местоположении в фоновом режиме. Для этого необходимо включить соответствующие параметры на телефоне и разрешить использовать геоданные. Может увеличиться расход заряда батареи."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"Изменение настроек аудио"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Приложение сможет изменять системные настройки звука, например уровень громкости и активный динамик."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"Запись аудио"</string>
@@ -475,16 +477,16 @@
<string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Получение пакетов, отправляемых на все устройства в сети Wi-Fi, а не только на телевизор. При этом используется больше электроэнергии, чем в обычном режиме."</string>
<string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Приложение сможет получать пакеты, отправленные всем устройствам в сети Wi-Fi (не только вашему телефону) в многоадресной рассылке. При этом расходуется больше энергии, чем в одноадресном режиме."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Доступ к настройкам Bluetooth"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Приложение сможет настраивать параметры локального планшетного ПК с поддержкой Bluetooth, а также обнаруживать удаленные устройства и выполнять сопряжение с ними."</string>
- <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"Изменение параметров Bluetooth на телевизоре, обнаружение устройств и подключение к ним."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Приложение сможет настраивать параметры локального телефона с поддержкой Bluetooth, а также обнаруживать удаленные устройства и выполнять сопряжение с ними."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Приложение сможет настраивать параметры локального планшетного ПК с поддержкой Bluetooth, а также обнаруживать удаленные устройства и устанавливать соединение с ними."</string>
+ <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"Изменение параметров Bluetooth на телевизоре, обнаружение устройств и установление соединения с ними."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Приложение сможет настраивать параметры локального телефона с поддержкой Bluetooth, а также обнаруживать удаленные устройства и устанавливать соединение с ними."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"подключать/отключать сеть WiMAX"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Приложение сможет определять, активирован ли WiMAX, а также получать информацию о подключенных сетях WiMAX."</string>
<string name="permlab_changeWimaxState" msgid="340465839241528618">"Изменение статуса WiMAX"</string>
<string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Приложение сможет подключать устройство к сетям WiMAX и отключать его от них."</string>
<string name="permdesc_changeWimaxState" product="tv" msgid="6022307083934827718">"Подключение телевизора к сетям WiMAX и его отключение от них."</string>
<string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Приложение сможет подключать устройство к сетям WiMAX и отключать его от них."</string>
- <string name="permlab_bluetooth" msgid="6127769336339276828">"Установление связи с устройствами Bluetooth"</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"Установление соединения с устройствами Bluetooth"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Приложение сможет просматривать конфигурацию Bluetooth на планшетном ПК, а также запрашивать и подтверждать соединение с другими устройствами."</string>
<string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Доступ к настройкам Bluetooth на телевизоре, установка соединений с сопряженными устройствами и принятие запросов на подключение."</string>
<string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Приложение сможет просматривать конфигурацию Bluetooth на телефоне, а также запрашивать и подтверждать соединение с другими устройствами."</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок отпечатка пальца"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"Управлять оборудованием для распознавания лиц"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Приложение сможет добавлять и удалять шаблоны лиц."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"Использовать оборудование для распознавания лиц"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Приложение сможет использовать распознающее оборудование для аутентификации."</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Не удалось распознать лицо. Повторите попытку."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Лицо слишком яркое. Притушите свет."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Лицо слишком темное. Сделайте свет ярче."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Уберите устройство дальше от лица"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Поднесите устройство ближе к лицу"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Поднимите устройство выше"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Опустите устройство ниже"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Сдвиньте устройство правее"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Сдвиньте устройство левее"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Посмотрите в камеру устройства"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Лица не обнаружены"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Расположите лицо напротив устройства"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Оборудование для распознавания лица недоступно"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Превышено время ожидания. Повторите попытку."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Невозможно сохранить распознанное лицо"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Распознавание отменено"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Слишком много попыток. Повторите позже."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Слишком много попыток. Сканер отключен."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Попробуйте ещё раз"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Нет зарегистрированных лиц"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"На этом устройстве нет сканера для распознавания лица"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Лицо <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Значок лица"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"Просмотр настроек синхронизации"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Приложение сможет просматривать настройки синхронизации аккаунта, например определять, включена ли синхронизация для приложения \"Контакты\"."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"Включение/выключение синхронизации"</string>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Сеть Wi-Fi не подключена к Интернету"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Нажмите, чтобы показать варианты."</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Изменения в настройках точки доступа"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Частота точки доступа изменена."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Устройство не может работать только на частоте 5 ГГц. Эта частота будет использоваться, когда это возможно."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Новое подключение: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Устройство использует <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, если подключение к сети <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> недоступно. Может взиматься плата за передачу данных."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Устройство отключено от сети <xliff:g id="NEW_NETWORK">%2$s</xliff:g> и теперь использует <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>"</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Администратор запросил отчет об ошибке, чтобы устранить проблему. Он может получить доступ к приложениям и данным."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ПРЕДОСТАВИТЬ ДОСТУП"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ОТКЛОНИТЬ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Выбор раскладки"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Выберите способ ввода"</string>
<string name="show_ime" msgid="2506087537466597099">"Показывать на экране, когда физическая клавиатура включена"</string>
<string name="hardware" msgid="194658061510127999">"Виртуальная клавиатура"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Настройка физической клавиатуры"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index dc3acbc82664..a3e3ea0c3735 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"අහස්යානා ආකාරය"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"අහස්යානා ආකාරය සක්‍රීයයි."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"අහස්යානා අකාරය අක්‍රියයි"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"බැටරි සුරැකුම"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"බැටරි සුරැකුම ක්‍රියාවිරහිතයි"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"බැටරි සුරැකුම ක්‍රියාත්මකයි"</string>
<string name="global_action_settings" msgid="1756531602592545966">"සැකසීම්"</string>
<string name="global_action_assist" msgid="3892832961594295030">"සහාය දීම"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"හඬ සහායක"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ස්ථානය"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"මෙම උපාංගයේ ස්ථානයට ප්‍රවේශ කරන්න"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත මෙම උපාංගයේ ස්ථානය ලබා ගැනීමට ඉඩ දෙන්නද?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"ඔබ යෙදුම භාවිතා විට පමණක් යෙදුමට ස්ථානයට ප්‍රවේශය ඇත."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත මෙම උපාංගයේ ස්ථානය ලබා ගැනීමට සැම විට ඉඩ දෙන්නද?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ඔබ යෙදුම භාවිතා නොකරන විට පවා යෙදුමට සැම විටම ස්ථානයට ප්‍රවේශය ඇත."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"දින දර්ශනය"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ඔබේ දින දර්ශනයට පිවිසෙන්න"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;b&gt; වෙත ඔබගේ දින දර්ශනය ප්‍රවේශ කිරීමට ඉඩ දෙන්නද?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"මෙම යෙදුමට ඔබේ දුරකථනය මත දින දර්ශන සිදුවීම් එක් කිරීමට, ඉවත් කිරීමට, හෝ වෙනස් කිරීමට හැකිය. මෙම යෙදුමට දින දර්ශන හිමිකරුවන් වෙතින් වන ඒවා ලෙස දිස් විය හැකි පණිවිඩ එවීමට, හෝ සිදුවීම්වල හිමිකරුවන්ට දැනුම් දීමෙන් තොරව ඒවා වෙනස් කිරීමට හැකිය."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"අමතර ස්ථාන සැපයුම්කරු විධාන වෙත ප්‍රවේශ වීම"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"ස්ථානය සපයන අමතර අණ වලට ප්‍රවේශය කිරීමට යෙදුමට අවසර දෙන්න. GPS ක්‍රියාවන් හෝ වෙනත් ස්ථාන මූලාශ්‍ර සමඟ මැදිහත් වීමට මෙයින් යෙදුමට ඉඩ ලැබේ."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"නිවැරදි ස්ථානයට (GPS සහ ජාලය පදනම් කරගත්) පිවිසීම"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"මෙම යෙදුමට GPS හෝ ජංගම දුරකථන කුළුණු සහ Wi-Fi ජාල වැනි ජාල ස්ථාන මූලාශ්‍ර පදනම්ව ඔබගේ ස්ථානය ලබා ගත හැකිය. යෙදුමට ඒවා භාවිත කිරීමට හැකි වීමට මෙම ස්ථාන සේවා ක්‍රියාත්මක කර සහ ඔබේ දුරකථනය මත ලබා ගත හැකිව තිබිය යුතුය. මෙය බැටරි පාරිභෝජනය වැඩි කළ හැකිය."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"පෙරබිම තුළ පමණක් නිශ්චිත ස්ථානය වෙත පිවිසෙන්න"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"මෙම යෙදුම පෙරබිම තුළ ඇති විට පමණක් එයට ඔබේ නිශ්චිත ස්ථානය ලබා ගත හැකිය. යෙදුමට ඒවා භාවිත කිරීමට හැකි වීමට මෙම ස්ථාන සේවා ක්‍රියාත්මක කර සහ ඔබේ දුරකථනය මත ලබා ගත හැකිව තිබිය යුතුය. මෙය බැටරි පරිභෝජනය වැඩි කළ හැකිය."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ආසන්නතම ස්ථානයට (ජාලය-පාදක වූ) පිවිසීම"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"මෙම යෙදුමට ජංගම දුරකථන කුළුණු සහ Wi-Fi ජාල වැනි ජාල මූලාශ්‍ර පදනම්ව ඔබගේ ස්ථානය ලබා ගත හැකිය. යෙදුමට ඒවා භාවිත කිරීමට හැකි වීමට මෙම ස්ථාන සේවා ක්‍රියාත්මක කර සහ ඔබේ ටැබ්ලට් පරිගණකය මත ලබා ගත හැකිව තිබිය යුතුය."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"මෙම යෙදුමට ජංගම දුරකථන කුළුණු සහ Wi-Fi ජාල වැනි ජාල මූලාශ්‍ර පදනම්ව ඔබගේ ස්ථානය ලබා ගත හැකිය. යෙදුමට ඒවා භාවිත කිරීමට හැකි වීමට මෙම ස්ථාන සේවා ක්‍රියාත්මක කර සහ ඔබේ TV මත ලබා ගත හැකිව තිබිය යුතුය."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"මෙම යෙදුමට ජංගම දුරකථන කුළුණු සහ Wi-Fi ජාල වැනි ජාල මූලාශ්‍ර පදනම්ව ඔබගේ ස්ථානය ලබා ගත හැකිය. යෙදුමට ඒවා භාවිත කිරීමට හැකි වීමට මෙම ස්ථාන සේවා ක්‍රියාත්මක කර සහ ඔබේ දුරකථනය මත ලබා ගත හැකිව තිබිය යුතුය."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"පසුබිම තුළ නිශ්චිත ස්ථානය වෙත පිවිසෙන්න"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"මෙම යෙදුම පසුබිම තුළ ඇති ඕනෑම අවස්ථාවක එයට ඔබේ නිශ්චිත ස්ථානය ලබා ගත හැකිය. යෙදුමට ඒවා භාවිත කිරීමට හැකි වීමට මෙම ස්ථාන සේවා ක්‍රියාත්මක කර සහ ඔබේ දුරකථනය මත ලබා ගත හැකිව තිබිය යුතුය. මෙය බැටරි පරිභෝජනය වැඩි කළ හැකිය."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ඔබගේ ශ්‍රව්‍ය සැකසීම් වෙනස් කරන්න"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ශබ්දය ආදී ගෝලීය ශබ්ද සැකසීම් වෙනස් කිරීමට සහ ප්‍රතිදානය සඳහා භාවිත කරන්නේ කුමන නාදකය දැයි තේරීමට යෙදුමට අවසර දෙන්න."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ශබ්ද පටිගත කරන්න"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ඇඟිලි සලකුණු නිරූපකය"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"මුහුණු සත්‍යාපක දෘඪාංග කළමනාකරණය කරන්න"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"මුහුණු අච්චු එකතු කිරීමට සහ ඉවත් කිරීමට අදාළ ක්‍රම භාවිතය සඳහා මෙම යෙදුමට ඉඩ දෙයි."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"මුහුණු සත්‍යාපක දෘඪාංග භාවිතා කරන්න"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"සත්‍යාපනය සඳහා සත්‍යාපක දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"මුහුණ සැකසීමට නොහැකි විය. කරුණාකර නැවත උත්සාහ කර."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"මුහුණ දීප්තිමත් වැඩිය. කරුණාකර අඩු ආලෝකය උත්සාහ කරන්න."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"මුහුණ අඳුරු වැඩිය. කරුණාර ආලෝක ප්‍රභවය නිරාවරණය කරන්න."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"කරුණාකර සංවේදකය මුහුණෙන් වඩා ඈත් කරන්න."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"කරුණාකර සංවේදකය මුහුණ සමීපයට ගෙන එන්න."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"කරුණාකර සංවේදකය ඉහළට ගෙන යන්න."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"කරුණාකර සංවේදකය පහළට ගෙන යන්න."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"කරුණාකර සංවේදකය දකුණට ගෙන යන්න."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"කරුණාකර සංවේදකය වමට ගෙන යන්න."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"කරුණාකර සංවේදකය දෙස බලන්න."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"මුහුණ අනාවරණය කර නොගන්නා ලදී."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"උපාංගය ඉදිරියේ මුහුණ ස්ථාවරව තබන්න."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"මුහුණු දෘඪාංගය ලද නොහැකිය."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"මුහුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"මුහුණ ගබඩා කළ නොහැක."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"මුහුණු මෙහෙයුම අවලංගු කරන ලදී."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"උත්සාහයන් ඉතා වැඩි ගණනකි. පසුව නැවත උත්සාහ කරන්න."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"උත්සාහයන් ඉතා වැඩි ගණනකි. මුහුණු සත්‍යාපනය අබල කරන ලදී."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"නැවත උත්සාහ කරන්න."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"මුහුණක් ඇතුළත් කර නොමැත."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"මෙම උපාංගයේ මුහුණු සත්‍යාපක සංවේදකයක් නොමැත"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"මුහුණු <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"මුහුණ නිරූපකය"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"සමමුහුර්ත සැකසීම් කියවන්න"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ගිණුම සඳහා සමමුහුර්ත සැකසීම් කියවීමට යෙදුමට අවසර දෙන්න. උදාහරණයක් ලෙස, ගිණුමක් සමඟ පුද්ගල යෙදුම සමමුහුර්ත දැයි මෙයට හඳුනා ගත හැක."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"සමමුහුර්ත කිරීම සක්‍රිය කරන්න සහ අක්‍රිය කරන්න"</string>
@@ -1177,6 +1210,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi සඳහා අන්තර්ජාල ප්‍රවේශය නැත"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"විකල්ප සඳහා තට්ටු කරන්න"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"ඔබගේ හොට්ස්පොට් සැකසීම්වලට වෙනස් කිරීම්"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ඔබගේ හොට්ස්පොට් කලාපය වෙනස් වී ඇත."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"මෙම උපාංගය 5GHz සඳහා ඔබේ මනාපවලට සහාය නොදක්වයි. ඒ වෙනුවට, මෙම උපාංගය ලබා ගත හැකි විට 5GHz කලාපය භාවිතා කරනු ඇත."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> වෙත මාරු විය"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"උපාංගය <xliff:g id="NEW_NETWORK">%1$s</xliff:g> <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> සඳහා අන්තර්ජාල ප්‍රවේශය නැති විට භාවිත කරයි. ගාස්තු අදාළ විය හැකිය."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> සිට <xliff:g id="NEW_NETWORK">%2$s</xliff:g> වෙත මාරු විය"</string>
@@ -1264,7 +1300,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"මෙම උපාංගය දෝෂාවේක්ෂණය සඳහා උදවු කිරීමට ඔබේ පරිපාලක දෝෂ වාර්තාවක් ඉල්ලා ඇත. යෙදුම් සහ දත්ත බෙදා ගත හැකිය."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"බෙදා ගන්න"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ප්‍රතික්ෂේප කරන්න"</string>
- <string name="select_input_method" msgid="8547250819326693584">"යතුරු පුවරු වෙනස් කිරීම"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ආදාන ක්‍රමයක් තෝරන්න"</string>
<string name="show_ime" msgid="2506087537466597099">"භෞතික යතුරු පුවරුව සක්‍රිය අතරතුර එය තිරය මත තබා ගන්න"</string>
<string name="hardware" msgid="194658061510127999">"අතථ්‍ය යතුරු පුවරුව පෙන්වන්න"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"භෞතික යතුරු පුවරුව වින්‍යාස කරන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 1fce815dbec8..51ddff6f3c25 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Režim v lietadle"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Režim v lietadle je ZAPNUTÝ"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Režim v lietadle je VYPNUTÝ"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Šetrič batérie"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Šetrič batérie je VYPNUTÝ"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Šetrič batérie je ZAPNUTÝ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Nastavenia"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomôcť"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hlasový asistent"</string>
@@ -282,6 +279,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Poloha"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"prístup k polohe tohto zariadenia"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup k polohe tohto zariadenia?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikácia bude mať prístup k polohe iba vtedy, keď ju budete používať."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Chcete vždy povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup k polohe tohto zariadenia?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikácia bude mať vždy prístup k polohe, aj keď ju nebudete používať."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendár"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"prístup ku kalendáru"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Povoliť aplikácii &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; prístup ku kalendáru?"</string>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Táto aplikácia môže pridávať, odstraňovať alebo meniť udalosti kalendára vo vašom telefóne. Táto aplikácia môže odosielať správy od vlastníkov kalendára alebo meniť udalosti bez upozornenia ich vlastníkov."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"prístup k ďalším príkazom poskytovateľa polohy"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Umožňuje aplikácii pristupovať k ďalším príkazom poskytovateľa informácií o polohe. Aplikácii to môže umožniť zasahovať do činnosti systému GPS alebo iných zdrojov informácií o polohe."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"prístup k presnej polohe (pomocou GPS a siete)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Táto aplikácia môže získať údaje o vašej polohe na základe systému GPS alebo sieťových zdrojov, ako sú mobilné veže a siete Wi‑Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na telefóne. Môže to viesť k zvýšeniu spotreby batérie."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"prístup k presnej polohe iba v popredí"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Táto aplikácia dokáže získať vašu presnú polohu iba vtedy, keď je spustená v popredí. Na to, aby mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii v telefóne. Môže to zvýšiť spotebu batérie."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"prístup k približnej polohe (pomocou siete)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi‑Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na tablete."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi‑Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na televízore."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Táto aplikácia môže získať údaje o vašej polohe na základe sieťových zdrojov, ako sú mobilné veže a siete Wi‑Fi. Na to, aby aplikácia mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii na telefóne."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"prístup k presnej polohe na pozadí"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Táto aplikácia dokáže kedykoľvek získať vašu presnú polohu, keď je spustená na pozadí. Na to, aby mohla používať služby určovania polohy, musia byť tieto služby zapnuté a k dispozícii v telefóne. Môže to zvýšiť spotebu batérie."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"meniť nastavenia zvuku"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Umožňuje aplikácii upraviť globálne nastavenia zvuku, ako je hlasitosť, alebo určiť, z ktorého reproduktora bude zvuk vychádzať."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"nahrávať zvuk"</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odtlačku prsta"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"správa hardvéru na overenie tváre"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Umožňuje aplikácii vyvolať metódy, ktoré pridávajú a odstraňujú šablóny tvárí."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"používanie hardvéru na overenie tváre"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Umožňuje aplikácii používať na overenie totožnosti hardvér na overenie tváre"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Tvár sa nepodarilo spracovať. Skúste to znova."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Tvár je príliš svetlá. Skúste to pri nižšom osvetlení."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Tvár je príliš tmavá. Zvýšte osvetlenie."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Oddiaľte senzor od tváre."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Priblížte senzor k tvári."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Pohnite senzor vyššie."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Pohnite senzor nižšie."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Pohnite senzor doprava."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Pohnite senzor doľava."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Pozerajte sa na senzor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nebola rozpoznaná žiadna tvár."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Udržte tvár nehybne oproti zariadeniu."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hardvér na snímanie tváre nie je k dispozícii"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Limit rozpoznania tváre vypršal. Skúste to znova."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Tvár sa nedá uchovať."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Operácia týkajúca sa tváre bola zrušená"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Príliš veľa pokusov. Skúste to znova neskôr."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Príliš veľa pokusov. Overenie tváre je zakázané."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Skúste to znova."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nemáte zaregistrovanú žiadnu tvár."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Toto zariadenie nemá senzor na overenie tváre."</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Tvár <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikona tváre"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"čítať nastavenia synchronizácie"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Umožňuje aplikácii čítať nastavenia synchronizácie v účte. Môže napríklad určiť, či je s účtom synchronizovaná aplikácia Ľudia."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"zapnúť alebo vypnúť synchronizáciu"</string>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Sieť Wi‑Fi nemá prístup k internetu"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Klepnutím získate možnosti"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Zmeny nastavení hotspotu"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pásmo vášho hotspotu sa zmenilo."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Toto zariadenie nepodporuje vašu predvoľbu používať iba 5 GHz. Namiesto toho bude pásmo 5 GHz používať vtedy, keď bude k dispozícii."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Prepnuté na sieť: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Keď <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nemá prístup k internetu, zariadenie používa <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Môžu sa účtovať poplatky."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Prepnuté zo siete <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na sieť <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Správca vyžiadal hlásenie chyby, aby mohol vyriešiť problém na tomto zariadení. Aplikácie a dáta môžu byť zdieľané."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ZDIEĽAŤ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ODMIETNUŤ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Zmeniť klávesnicu"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Zvoliť metódu vstupu"</string>
<string name="show_ime" msgid="2506087537466597099">"Ponechať na obrazovke, keď je aktívna fyzická klávesnica"</string>
<string name="hardware" msgid="194658061510127999">"Zobraziť virtuálnu klávesnicu"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurácia fyzickej klávesnice"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 3e66c4c483ef..3e035bfbba3f 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Način za letalo"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Način za letalo je VKLOPLJEN"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Način za letalo je IZKLOPLJEN"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Varčevanje z energijo akumulatorja"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Varčevanje z energijo akumulatorja je izklopljeno"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Varčevanje z energijo akumulatorja je vklopljeno"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Nastavitve"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoč"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glas. pomočnik"</string>
@@ -282,6 +279,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokacija"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"dostop do lokacije te naprave"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti dostop do lokacije te naprave?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacija bo imela dostop do lokacije samo, ko aplikacijo uporabljate."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; vedno dovoliti dostop do lokacije te naprave?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacija bo vedno imela dostop do lokacije, tudi ko aplikacije ne uporabljate."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Koledar"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"dostop do koledarja"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Želite aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; omogočiti dostop do koledarja?"</string>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Ta aplikacija lahko dodaja, odstranjuje in spreminja dogodke v koledarju, ki so shranjeni v telefonu. Ta aplikacija lahko pošilja sporočila, ki bodo morda videti, kot da prihajajo od lastnikov koledarjev, ali spreminja dogodke brez vednosti lastnikov."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"dostopanje do ukazov ponudnika dodatnih lokacij"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Aplikaciji omogoča dostop do dodatnih ukazov ponudnika lokacij. S tem lahko aplikacija moti delovanje sistema GPS ali drugih virov lokacije."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"dostop do natančne lokacije (na podlagi podatkov GPS in omrežja)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Ta aplikacija lahko pridobi vašo lokacijo na podlagi sistema GPS ali omrežnih lokacijskih virov, kot so bazne postaje in omrežja Wi-Fi. Če želite aplikaciji omogočiti uporabo teh lokacijskih storitev, morajo biti te vklopljene in na voljo v telefonu. Poraba energije akumulatorja bo morda večja."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"dostop do točne lokacije samo, ko deluje v ospredju"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Ta aplikacija lahko pridobi vašo točno lokacijo samo, ko deluje v ospredju. Če želite aplikaciji omogočiti uporabo teh lokacijskih storitev, morajo biti te vklopljene in na voljo v telefonu. Poraba energije akumulatorja bo morda večja."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"dostop do približne lokacije (na podlagi podatkov omrežja)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Ta aplikacija lahko pridobi vašo lokacijo na podlagi omrežnih virov, kot so bazne postaje in omrežja Wi-Fi. Če želite aplikaciji omogočiti uporabo teh lokacijskih storitev, morajo biti te vklopljene in na voljo v tabličnem računalniku."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Ta aplikacija lahko pridobi vašo lokacijo na podlagi omrežnih virov, kot so bazne postaje in omrežja Wi-Fi. Če želite aplikaciji omogočiti uporabo teh lokacijskih storitev, morajo biti te vklopljene in na voljo v televizorju."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Ta aplikacija lahko pridobi vašo lokacijo na podlagi omrežnih virov, kot so bazne postaje in omrežja Wi-Fi. Če želite aplikaciji omogočiti uporabo teh lokacijskih storitev, morajo biti te vklopljene in na voljo v telefonu."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"dostop do točne lokacije, ko deluje v ozadju"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Ta aplikacija lahko pridobi vašo točno lokacijo, ko deluje v ozadju. Če želite aplikaciji omogočiti uporabo teh lokacijskih storitev, morajo biti te vklopljene in na voljo v telefonu. Poraba energije akumulatorja bo morda večja."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"spreminjanje nastavitev zvoka"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Aplikaciji omogoča spreminjanje splošnih zvočnih nastavitev, na primer glasnost in kateri zvočnik se uporablja."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"snemanje zvoka"</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona prstnih odtisov"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"upravljanje strojne opreme za preverjanje pristnosti obraza"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog z obrazi za uporabo."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"uporaba strojne opreme za preverjanje pristnosti obraza"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aplikaciji omogoča uporabo strojne opreme za preverjanje pristnosti obraza"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Obraza ni bilo mogoče obdelati. Poskusite znova."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Obraz je presvetel. Poskusite pri manj svetlobe."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Obraz je pretemen. Odkrijte vir svetlobe."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Tipalo premaknite dlje od obraza."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Tipalo premaknite bliže obrazu."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Tipalo premaknite višje."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Tipalo premaknite nižje."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Tipalo premaknite v desno."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Tipalo premaknite v levo."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Poglejte v tipalo."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Ni zaznanih obrazov."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Obraz naj bo pri miru in pred napravo."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Strojna oprema za prepoznavo obraza ni na voljo."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Dosežena časovna omejitev za obraz. Poskusite znova."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Obraza ni mogoče shraniti."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Dejanje z obrazom je bilo preklicano."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Preveč poskusov. Poskusite znova pozneje."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Preveč poskusov. Preverjanje pristnosti obraza je onemogočeno."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Poskusite znova."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Ni prijavljenih obrazov."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Ta naprava nima tipala za preverjanje pristnosti obraza"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Obraz <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikona obraza"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"branje nastavitev sinhronizacije"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Aplikaciji omogoča branje nastavitev sinhronizacije za račun. S tem lahko aplikacija na primer ugotovi, ali je aplikacija Ljudje sinhronizirana z računom."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"vklop in izklop sinhronizacije"</string>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Omrežje Wi-Fi nima dostopa do interneta"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dotaknite se za možnosti"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Spremembe nastavitev dostopne točke"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Pas dostopne točke je spremenjen."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Ta naprava ne podpira prednostne nastavitve samo za 5-GHz pas. Namesto tega bo ta naprava uporabljala 5-GHz pas, ko bo na voljo."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Preklopljeno na omrežje vrste <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Naprava uporabi omrežje vrste <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, ko omrežje vrste <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nima dostopa do interneta. Prenos podatkov se lahko zaračuna."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Preklopljeno z omrežja vrste <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na omrežje vrste <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Skrbnik je zahteval poročilo o napakah za pomoč pri odpravljanju napak v tej napravi. Aplikacije in podatki bodo morda dani v skupno rabo."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SKUPNA RABA"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"NE SPREJMEM"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Sprememba tipkovnice"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Izberite način vnosa"</string>
<string name="show_ime" msgid="2506087537466597099">"Ohrani na zaslonu, dokler je aktivna fizična tipkovnica"</string>
<string name="hardware" msgid="194658061510127999">"Pokaži navidezno tipkovnico"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfiguriranje fizične tipkovnice"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 15f7fd232981..bb42da41e15e 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"modaliteti i aeroplanit"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modaliteti i aeroplanit është i AKTIVIZUAR"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modaliteti i aeroplanit është i ÇAKTIVIZUAR"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Kursyesi i baterisë"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"\"Kursyesi i baterisë\" është JOAKTIV."</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"\"Kursyesi i baterisë\" është AKTIV"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Cilësimet"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Ndihma"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ndihma zanore"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Vendndodhja"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"qaset te vendndodhja e kësaj pajisjeje"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të ketë qasje te vendndodhja e kësaj pajisjeje?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Aplikacioni do të ketë qasje te vendndodhja vetëm kur po e përdor aplikacionin."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Të lejohet gjithmonë që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të ketë qasje te vendndodhja?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Aplikacioni do të ketë gjithmonë qasje te vendndodhja, edhe kur nuk po e përdor aplikacionin."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendari"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"qasje te kalendari yt"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Të lejohet që &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; të ketë qasje te kalendari yt?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Ky aplikacion mund të shtojë, të heqë ose të ndryshojë ngjarjet e kalendarit në telefonin tënd. Ky aplikacion mund të dërgojë mesazhe që mund të duket se vijnë nga zotëruesit e kalendarit ose të ndryshojë ngjarjet pa i njoftuar zotëruesit e tyre."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"qasje në komandat shtesë të ofruesit të vendndodhjes"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Lejon aplikacionin të ketë qasje në komandat shtesë të ofruesit për vendndodhjen. Kjo mund ta lejojë aplikacionin të ndërhyjë në operacionin e GPS-së apo të burimeve të tjera për vendndodhjen."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"qasu te vendndodhja e përpiktë (në bazë të GPS-së dhe rrjetit)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Ky aplikacion mund të marrë vendndodhjen tënde bazuar në burimet e rrjetit si antenat e operatorëve celulare dhe rrjetet Wi-Fi. Këto shërbime të vendndodhjes duhet të jenë të aktivizuara dhe në dispozicion në telefonin tënd që aplikacioni të mund t\'i përdorë. Kjo mund të rritë konsumin e baterisë."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"qasu në vendndodhjen e saktë vetëm në plan të parë"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Ky aplikacion mund të marrë vendndodhjen tënde të saktë në çdo kohë kur është në plan të parë. Këto shërbime të vendndodhjes duhet të jenë të aktivizuara dhe në dispozicion në telefonin tënd që aplikacioni të mund t\'i përdorë. Kjo gjë mund të rritë konsumin e baterisë."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"qasu te vendndodhja e përafërt (bazuar në rrjet)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Ky aplikacion mund të marrë vendndodhjen tënde bazuar në burimet e rrjetit si antenat e operatorëve celulare dhe rrjetet Wi-Fi. Këto shërbime të vendndodhjes duhet të jenë të aktivizuara dhe në dispozicion në tabletin tënd që aplikacioni të mund t\'i përdorë."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Ky aplikacion mund të marrë vendndodhjen tënde bazuar në burimet e rrjetit si antenat e operatorëve celulare dhe rrjetet Wi-Fi. Këto shërbime të vendndodhjes duhet të jenë të aktivizuara dhe në dispozicion në televizorin tënd që aplikacioni të mund t\'i përdorë."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Ky aplikacion mund të marrë vendndodhjen tënde bazuar në burimet e rrjetit si antenat e operatorëve celulare dhe rrjetet Wi-Fi. Këto shërbime të vendndodhjes duhet të jenë të aktivizuara dhe në dispozicion në telefonin tënd që aplikacioni të mund t\'i përdorë."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"qasu në vendndodhjen e saktë në sfond"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Ky aplikacion mund të marrë vendndodhjen tënde të saktë në çdo kohë kur është në sfond. Këto shërbime të vendndodhjes duhet të jenë të aktivizuara dhe në dispozicion në telefonin tënd që aplikacioni të mund t\'i përdorë. Kjo gjë mund të rritë konsumin e baterisë."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ndrysho cilësimet e audios"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Lejon aplikacionin të modifikojë cilësimet globale të audios siç është volumi dhe se cili altoparlant përdoret për daljen."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"regjistro audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona e gjurmës së gishtit"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"menaxho harduerin për vërtetimin e fytyrës"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Lejon aplikacionin të aktivizojë mënyra për shtim e fshirje të shablloneve të përdorura."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"përdor harduerin për vërtetimin e fytyrës"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Lejon aplikacionin të përdorë harduer vërtetimi të fytyrës për procesin e vërtetimit"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Fytyra nuk mund të përpunohej. Provo sërish."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Fytyra ka shumë ndriçim. Provo me më pak ndriçim."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Fytyra shumë e errët. Zbulo burimin e dritës."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Lëvize sensorin pak më larg fytyrës."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Sille sensorin më pranë fytyrës."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Lëvize sensorin më lart."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Lëvize sensorin më poshtë."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Lëvize sensorin djathtas."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Lëvize sensorin majtas."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Shiko nga sensori"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Nuk u diktua fytyrë"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Mbaje fytyrën pa lëvizur përpara pajisjes."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Nuk ka harduer për fytyrën."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Mbaroi afati për fytyrën. Provo sërish."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Fytyra nuk mund të ruhet."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Veprimi me fytyrën u anulua."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Shumë përpjekje. Provo sërish më vonë."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Shumë përpjekje. Vërtetimi për fytyrën joaktiv."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Provo sërish."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Nuk ka fytyrë të regjistruar."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Kjo pajisje nuk ka sensor vërtetimi për fytyrën"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Fytyra <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ikona e fytyrës"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lexo cilësimet e sinkronizimit"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Lejon aplikacionin të lexojë cilësimet e sinkronizimit për një llogari. Për shembull, kjo mund të përcaktojë nëse aplikacioni \"Kontaktet\" është i sinkronizuar me një llogari."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ndiz ose fik sinkronizimin"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi nuk ka qasje në internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Trokit për opsionet"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Ndryshimet në cilësimet e zonës së qasjes për internet"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Brezi yt i zonës së qasjes për internet ka ndryshuar."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Kjo pajisje nuk e mbështet preferencën për vetëm 5 GHz. Përkundrazi, pajisja do të përdorë brezin 5 GHz nëse ka."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Kaloi te <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Pajisja përdor <xliff:g id="NEW_NETWORK">%1$s</xliff:g> kur <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nuk ka qasje në internet. Mund të zbatohen tarifa."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Kaloi nga <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> te <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administratori kërkoi një raport të defekteve në kod për të ndihmuar me zgjidhjen e problemeve. Aplikacioni dhe të dhënat mund të ndahen."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SHPËRNDAJ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"REFUZO"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Ndërro tastierë"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Zgjidh metodën e hyrjes"</string>
<string name="show_ime" msgid="2506087537466597099">"Mbaje në ekran ndërsa tastiera fizike është aktive"</string>
<string name="hardware" msgid="194658061510127999">"Shfaq tastierën virtuale"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfiguro tastierën fizike"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 698a617bf066..fa1dc59cce67 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -239,9 +239,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим рада у авиону"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим рада у авиону је УКЉУЧЕН"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим рада у авиону је ИСКЉУЧЕН"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Уштеда батерије"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Уштеда батерије је ИСКЉУЧЕНА"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Уштеда батерије је УКЉУЧЕНА"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Подешавања"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помоћ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помоћ"</string>
@@ -279,6 +276,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Локација"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"приступи локацији овог уређаја"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; приступа локацији овог уређаја?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Апликација ће имати приступ локацији само док користите апликацију."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; приступа локацији овог уређаја?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Апликација ће увек имати приступ локацији, чак и када не користите апликацију."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"приступи календару"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Желите ли да омогућите да &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; приступа календару?"</string>
@@ -405,12 +405,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Ова апликацији може да додаје, уклања или мења догађаје из календара на телефону. Ова апликација може да шаље поруке које изгледају као да их шаљу власници календара или да мења догађаје без знања власника."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"приступ додатним командама добављача локације"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Омогућава апликацији да приступа додатним командама даваоца услуга локације. То може да омогући апликацији да утиче на рад GPS-а или других извора локације."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"приступ прецизној локацији (утврђена преко мреже и GPS-а)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Ова апликација може да приступи вашој локацији помоћу GPS-а или мрежних извора локација, као што су мобилни предајници и Wi-Fi мреже. Ове услуге локације морају да буду укључене и доступне на телефону да би апликација могла да их користи. То може да повећа потрошњу батерије."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"приступ прецизној локацији само у првом плану"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Ова апликација може да одреди вашу тачну локацију само када ради у првом плану. Ове услуге локације морају да буду укључене и доступне на телефону да би апликација могла да их користи. То може да повећа потрошњу батерије."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"приступ приближној локацији (утврђена преко мреже)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Ова апликација може да приступи вашој локацији помоћу извора мреже, као што су мобилни предајници и Wi-Fi мреже. Ове услуге локације морају да буду укључене и доступне на таблету да би апликација могла да их користи."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Ова апликација може да приступи вашој локацији помоћу извора мреже, као што су мобилни предајници и Wi-Fi мреже. Ове услуге локације морају да буду укључене и доступне на ТВ-у да би апликација могла да их користи."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Ова апликација може да приступи вашој локацији помоћу извора мреже, као што су мобилни предајници и Wi-Fi мреже. Ове услуге локације морају да буду укључене и доступне на телефону да би апликација могла да их користи."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"приступ прецизној локацији у позадини"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Ова апликација може да одреди вашу тачну локацију сваки пут када ради у позадини. Ове услуге локације морају да буду укључене и доступне на телефону да би апликација могла да их користи. То може да повећа потрошњу батерије."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"промена аудио подешавања"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Дозвољава апликацији да мења глобална аудио подешавања као што су јачина звука и избор звучника који се користи као излаз."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"снимање аудио записа"</string>
@@ -518,6 +520,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона отиска прста"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"управљање хардв. за потврду идентитета помоћу лица"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Дозвољава да апликација активира методе за додавање и брисање шаблона лица ради коришћења."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"коришћење хардв. за потврду идентитета помоћу лица"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Дозвољава да апликација користи хардвер за потврду идентитета помоћу лица"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Обрада лица није успела. Пробајте поново."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Лице је пресветло. Пробајте са слабијим осветљењем."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Лице је исувише тамно. Откријте извор светла."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Удаљите сензор од лица."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Приближите сензор лицу."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Померите сензор навише."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Померите сензор наниже."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Померите сензор удесно."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Померите сензор улево."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Гледајте у сензор."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Није откривено ниједно лице."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Задржите лице испред уређаја без померања."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Харвдер за лице није доступан."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Истекло је време за проверу лица. Пробајте поново."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Није могуће сачувати лице."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Обрада лица је отказана."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Превише покушаја. Пробајте поново касније."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Више покушаја. Потврда идентитета је онемогућена."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Пробајте поново."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Није регистровано ниједно лице."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Овај уређај нема сензор за потврду идентитета помоћу лица"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Икона лица"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"читање подешавања синхронизације"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Дозвољава апликацији да чита подешавања синхронизације за налог. На пример, овако може да се утврди да ли је апликација Људи синхронизована са налогом."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"укључивање и искључивање синхронизације"</string>
@@ -1197,6 +1230,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi нема приступ интернету"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Додирните за опције"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Промене подешавања за хотспот"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Опсег хотспота је промењен."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Овај уређај не подржава подешавање само за 5 GHz. Уређај ће користити опсег од 5 GHz када буде доступан."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Прешли сте на тип мреже <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Уређај користи тип мреже <xliff:g id="NEW_NETWORK">%1$s</xliff:g> када тип мреже <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> нема приступ интернету. Можда ће се наплаћивати трошкови."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Прешли сте са типа мреже <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> на тип мреже <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1284,7 +1320,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Администратор је затражио извештај о грешци ради лакшег решавања проблема у вези са овим уређајем. Апликације и подаци могу да се деле."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ДЕЛИ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ОДБИЈ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Промените тастатуру"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Избор метода уноса"</string>
<string name="show_ime" msgid="2506087537466597099">"Задржи је на екрану док је физичка тастатура активна"</string>
<string name="hardware" msgid="194658061510127999">"Прикажи виртуелну тастатуру"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Конфигуришите физичку тастатуру"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index a35b7a01779e..7b9005c50563 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flygplansläge"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flygplansläge är AKTIVERAT"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flygplansläge är INAKTIVERAT"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Batterisparläge"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Batterisparläget har inaktiverats"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Batterisparläget har aktiverats"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Inställningar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hjälp"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -272,19 +269,22 @@
<string name="managed_profile_label" msgid="8947929265267690522">"Byt till jobbprofilen"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"få tillgång till dina kontakter"</string>
- <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomstbehörighet till dina kontakter?"</string>
+ <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till dina kontakter?"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Plats"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"komma åt enhetens platsuppgifter"</string>
- <string name="permgrouprequest_location" msgid="3788275734953323491">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomstbehörighet till enhetens plats?"</string>
+ <string name="permgrouprequest_location" msgid="3788275734953323491">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till enhetens plats?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Appen har endast åtkomst till platsen när du använder den."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till enhetens plats?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Appen har alltid åtkomst till platsen, även om du inte använder den."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"få tillgång till din kalender"</string>
- <string name="permgrouprequest_calendar" msgid="289900767793189421">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomstbehörighet till din kalender?"</string>
+ <string name="permgrouprequest_calendar" msgid="289900767793189421">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till din kalender?"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Sms"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"skicka och visa sms"</string>
<string name="permgrouprequest_sms" msgid="7168124215838204719">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; behörighet att skicka och visa sms?"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Lagring"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"få åtkomst till foton, media och filer på din enhet"</string>
- <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomstbehörighet till foton, mediafiler och andra filer på enheten?"</string>
+ <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till foton, mediefiler och andra filer på enheten?"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"spela in ljud"</string>
<string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; behörighet att spela in ljud?"</string>
@@ -299,7 +299,7 @@
<string name="permgrouprequest_phone" msgid="9166979577750581037">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; behörighet att ringa och hantera telefonsamtal?"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kroppssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få åtkomst till sensordata om dina vitalparametrar"</string>
- <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomstbehörighet till sensordata om vitalparametrar?"</string>
+ <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vill du ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till sensordata om vitalparametrar?"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Hämta fönsterinnehåll"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Granska innehållet i ett fönster som du interagerar med."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Aktivera Explore by touch"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Appen kan lägga till, ta bort eller ändra kalenderhändelser på mobilen. Appen kan skicka meddelanden som ser ut att komma från kalenderns ägare eller ändra uppgifter utan ägarens vetskap."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"få åtkomst till extra kommandon för platsleverantör"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Tillåter att appen får åtkomst till extra kommandon för platsleverantör. Detta kan innebära att appen tillåts störa funktionen för GPS eller andra platskällor."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"få åtkomst till din exakta position (GPS- och nätverksbaserad)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Appen kan få information om din plats från GPS eller platskällor i nätverket, som mobilmaster och Wi-Fi-nätverk. De platstjänsterna måste ha aktiverats och finnas på mobilen om appen ska kunna använda dem. Detta kan leda till ökad batteriförbrukning."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"endast åtkomst till exakt plats i förgrunden"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Den här appen kan endast få information om din exakta plats när den körs i förgrunden. Platstjänsterna måste ha aktiverats och finnas på mobilen om appen ska kunna använda dem. Detta kan leda till ökad batteriförbrukning."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"få åtkomst till din ungefärliga position (nätverksbaserad)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Appen kan få information om din plats från källor i nätverket, som mobilmaster och Wi-Fi-nätverk. De platstjänsterna måste ha aktiverats och finnas på surfplattan om appen ska kunna använda dem."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Appen kan få information om din plats från källor i nätverket, som mobilmaster och Wi-Fi-nätverk. De platstjänsterna måste ha aktiverats och fungera på TV:n om appen ska kunna använda dem."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Appen kan få information om din plats från källor i nätverket, som mobilmaster och Wi-Fi-nätverk. De platstjänsterna måste ha aktiverats och finnas på mobilen om appen ska kunna använda dem."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"åtkomst till exakt plats i bakgrunden"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Den här appen kan när som helst få information om din exakta plats när den körs i bakgrunden. Platstjänsterna måste ha aktiverats och finnas på mobilen om appen ska kunna använda dem. Detta kan leda till ökad batteriförbrukning."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ändra dina ljudinställningar"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Tillåter att appen ändrar globala ljudinställningar som volym och vilken högtalarutgång som används."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"spela in ljud"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon för fingeravtryck"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"hantera maskinvara för ansiktsautentisering"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Tillåter att appen anropar metoder för att lägga till och radera ansiktsmallar."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"använda maskinvara för ansiktsautentisering"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tillåter att appen använder maskinvara för ansiktsigenkänning vid autentisering"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Det gick inte att läsa av ansiktet. Försök igen."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Ansiktet är för ljust. Testa i svagare belysning."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Ansiktet är för mörkt. Testa i starkare belysning."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Flytta sensorn längre ifrån ansiktet."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Ha sensorn närmare ansiktet."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Flytta sensorn uppåt."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Flytta sensorn nedåt."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Flytta sensorn åt höger."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Flytta sensorn åt vänster."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Titta på sensorn."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Inget ansikte hittades."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Håll ansiktet stilla framför enheten."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Maskinvara för ansiktsigenkänning saknas."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Tidsgränsen för ansikte har nåtts. Försök igen."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Det gick inte att lagra ansiktet."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Ansiktsåtgärden har avbrutits."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Du har gjort för många försök. Försök igen senare."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"För många försök. Ansiktsautentisering inaktiverad"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Försök igen."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Inget ansikte har registrerats."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Enheten har ingen sensor för ansiktsautentisering"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Ansikte <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Ansikte"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"läsa synkroniseringsinställningar"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Tillåter att appen läser synkroniseringsinställningarna för ett konto. Detta kan användas till exempel för att avgöra om appen Personer är synkroniserad med ett konto."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"aktivera/inaktivera synkronisering"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi-nätverket är inte anslutet till internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tryck för alternativ"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Ändringar i inställningarna för surfzon"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Frekvensbandet för surfzonen har ändrats."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Den här enheten har inte stöd för inställningen för att endast använda 5 GHz. I stället används 5 GHz när det är möjligt."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Byte av nätverk till <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="NEW_NETWORK">%1$s</xliff:g> används på enheten när det inte finns internetåtkomst via <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>. Avgifter kan tillkomma."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Byte av nätverk från <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> till <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administratören har bett om en felrapport som hjälp vid felsökningen av enheten. Appar och data kan komma att delas."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"DELA"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"AVVISA"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Byt tangentbord"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Välj inmatningsmetod"</string>
<string name="show_ime" msgid="2506087537466597099">"Ha kvar det på skärmen när det fysiska tangentbordet används"</string>
<string name="hardware" msgid="194658061510127999">"Visa virtuellt tangentbord"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Konfigurera fysiskt tangentbord"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 2669e2236c9c..9d8790dc0212 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -71,10 +71,10 @@
<string name="RuacMmi" msgid="7827887459138308886">"Ukataaji wa simu zinazokera zisizohitajika"</string>
<string name="CndMmi" msgid="3116446237081575808">"Kuonyeshwa kwa nambari inayopiga"</string>
<string name="DndMmi" msgid="1265478932418334331">"Usinisumbue"</string>
- <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Chaguo msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Imezuiliwa"</string>
- <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguo msingi za kitambulisho cha mpigaji simu huwa kuzuiwa. Simu ifuatayo: Haijazuiliwa"</string>
- <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Chaguo msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo:Imezuiliwa"</string>
- <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Chaguo msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Haijazuiliwa"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Chaguomsingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Imezuiliwa"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguomsingi za kitambulisho cha mpigaji simu huwa kuzuiwa. Simu ifuatayo: Haijazuiliwa"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"Chaguomsingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo:Imezuiliwa"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"Chaguomsingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Haijazuiliwa"</string>
<string name="serviceNotProvisioned" msgid="8614830180508686666">"Huduma haitathminiwi."</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"Hauwezi kubadilisha mpangilio wa kitambulisho cha anayepiga."</string>
<string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Hakuna huduma ya data kwa vifaa vya mkononi"</string>
@@ -234,9 +234,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Hali ya ndegeni"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Hali ya ndegeni IMEWASHWA"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Hali ya ndegeni IMEZIMWA"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Kiokoa betri"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Kiokoa betri KIMEZIMWA"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Kiokoa betri KIMEWASHWA"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Mipangilio"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Mapendekezo"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Usaidizi wa Sauti"</string>
@@ -274,6 +271,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Mahali"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"itambue mahali kifaa hiki kilipo"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; itambue mahali kifaa kilipo?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Programu itafikia tu data ya mahali ulipo unaipotumia."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Ungependa kuruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie data ya mahali kifaa hiki kilipo kila wakati?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Programu itaweza kufikia data ya mahali kifaa kilipo hata wakati huitumii."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"ifikie kalenda yako"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie kalenda yako?"</string>
@@ -400,12 +400,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Programu hii inaweza kuongeza, kuondoa au kubadilisha matukio kwenye simu yako. Pogramu hii inaweza kutuma ujumbe unaoonekana kuwa umetoka kwa wamiliki wa kalenda au kurekebisha matukio bila kuwataarifu wamiliki."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"fikia amri za ziada za mtoa huduma ya mahali"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Ruhusu programu kufikia amri za ziada za mtoa huduma za mahali. Hii huenda ikaruhusu programu ikatize matumizi ya GPS au vyanzo vingine vya eneo."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"fikia mahali halisi (inategemea mtandao na GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Programu hii inaweza kupata eneo lako kulingana na vyanzo vya eneo vya GPS au mtandao kama vile minara ya simu na mitandao ya Wi-Fi. Huduma hizi za mahali lazima ziwashwe na zipatikane kwenye simu yako ili programu iweze kuzitumia.Hii huenda ikaongeza matumizi ya betri."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"kufikia mahali mahususi ikiwa tu programu imefunguliwa kwenye skrini"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Programu hii inaweza kupata mahali halisi ikiwa tu umeifungua kwenye skrini. Ni lazima uwashe huduma hizi za mahali na zipatikane kwenye simu yako ili programu iweze kuzitumia. Hatua hii inaweza kuongeza utumiaji wa betri."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"fikia mahali karibu na hapo (inategemea mtandao)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Programu hii inaweza kupata eneo lako kulingana na vyanzo vya mtandao kama vile minara ya simu na mitandao ya Wi-Fi. Huduma hizi za mahali lazima ziwashwe na zipatikane kwenye kompyuta yako kibao ili programu iweze kuzitumia."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Programu hii inaweza kupata eneo lako kulingana na vyanzo vya mtandao kama vile minara ya simu na mitandao ya Wi-Fi. Huduma hizi za mahali lazima ziwashwe na zipatikane kwenye runinga yako ili programu iweze kuzitumia."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Programu hii inaweza kupata eneo lako kulingana na vyanzo vya mtandao kama vile minara ya simu na mitandao ya Wi-Fi. Huduma hizi za mahali lazima ziwashwe na zipatikane kwenye simu yako ili programu iweze kuzitumia."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"kufikia mahali halisi ikiwa inatumika chinichini"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Programu hii inaweza kupata mahali halisi ulipo wakati wowote ikiwa inatumika chinichini. Ni lazima uwashe huduma hizi za mahali na zipatikane kwenye simu yako ili programu iweze kuzitumia. Hatua hii inaweza kuongeza utumiaji wa betri."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"badilisha mipangilio yako ya sauti"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Inaruhusu programu kurekebisha mipangilio ya sauti kila mahali kama vile sauti na ni kipaza sauti kipi ambacho kinatumika kwa kutoa."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"kurekodi sauti"</string>
@@ -513,6 +515,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Aikoni ya kitambulisho"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"dhibiti maunzi ya kuthibitisha uso"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Huruhusu programu iombe njia za kuongeza na kufuta violezo vya uso vitakavyotumiwa."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"tumia maunzi ya kuthibistiha uso"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Huruhusu programu ithibitishe uso kwa kutumia maunzi ya kuthibitisha"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Imeshindwa kuchakata uso. Tafadhali jaribu tena."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Uso unang\'aa sana. Tafadhalia punguza mwangaza."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Uso hauna mwangaza wa kutosha. Tafadhali ongeza mwangaza."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Tafadhali sogeza kitambuzi mbali na uso."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Tafadhali sogeza kitambuzi karibu na uso."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Tafadhali sogeza kitambuzi juu."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Tafadhali sogeza kitambuzi chini."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Tafadhali sogeza kitambuzi kulia."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Tafadhali sogeza kitambuzi kushoto."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Tafadhali angalia kitambuzi."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Haikutambua uso wowote"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Weka uso wima mbele ya kifaa."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Maunzi ya uso hayapatikani."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Muda wa kutambua uso umeisha. Jaribu tena."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Huwezi kuhifadhi uso."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Utendaji wa kitambulisho umeghairiwa."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Umejaribu mara nyingi mno. Jaribu tena baadaye."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Umejaribu mara nyingi mno. Kitambuzi cha uso kimezimwa."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Jaribu tena."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Hujasajili uso wowote."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Kifaa hiki hakina kitambuzi kinachothibitisha uso"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Uso wa <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Aikoni ya uso"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"kusoma mipangilio ya usawazishaji"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Inaruhusu programu kusoma mipangilio ya upatanishi wa akaunti. Kwa mfano, huku kunaweza kuamua kama programu ya Watu imepatanishwa na akaunti."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"kuwasha na kuzima usawazishaji"</string>
@@ -770,9 +803,9 @@
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Umejaribu kufungua kompyuta kibao kwa njia isiyo sahihi mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukijaribu tena mara <xliff:g id="NUMBER_1">%2$d</xliff:g> bila mafanikio, kompyuta ndogo itarejeshwa kwenye mipangilio iliyotoka nayo kiwandani na data yote iliyomo itafutwa."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"Umekosea majaribio ya kufungua runinga mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukikosea majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> zaidi, runinga itarejeshwa katika hali iliyotoka nayo kiwandani na data yote ya watumiaji itafutwa."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Umejaribu kufungua simu kwa njia isiyo sahihi mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukijaribu tena mara <xliff:g id="NUMBER_1">%2$d</xliff:g> bila mafanikio, simu itarejeshwa kwenye mipangilio iliyotoka nayo kiwandani na data yote iliyomo itafutwa."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Umejaribu kufungua kompyuta ndogo kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Kompyuta ndogo haitaweza kuwekwa upya kwa kiwanda chaguo msingi."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Umejaribu kufungua kompyuta ndogo kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Kompyuta ndogo haitaweza kuwekwa upya kwa kiwanda chaguomsingi."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"Umekosea majaribio ya kufungua runinga mara <xliff:g id="NUMBER">%d</xliff:g>. Sasa runinga itarejeshwa katika mipangilio iliyotoka nayo kiwandani."</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Umejaribu kufungua kompyuta ndogo kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Kompyuta ndogo haitaweza kuwekwa upya kwa kiwanda chaguo msingi."</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Umejaribu kufungua kompyuta ndogo kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Kompyuta ndogo haitaweza kuwekwa upya kwa kiwanda chaguomsingi."</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Jaribu tena kwa sekunde <xliff:g id="NUMBER">%d</xliff:g>."</string>
<string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Umesahau mchoro?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Fungua akaunti"</string>
@@ -1062,9 +1095,9 @@
<string name="whichImageCaptureApplication" msgid="3680261417470652882">"Piga picha ukitumia"</string>
<string name="whichImageCaptureApplicationNamed" msgid="8619384150737825003">"Piga picha ukitumia %1$s"</string>
<string name="whichImageCaptureApplicationLabel" msgid="6390303445371527066">"Piga picha"</string>
- <string name="alwaysUse" msgid="4583018368000610438">"Tumia kama chaguo msingi la kitendo hiki."</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"Tumia kama chaguomsingi la kitendo hiki."</string>
<string name="use_a_different_app" msgid="8134926230585710243">"Tumia programu tofauti"</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Futa chaguo msingi katika mipangilio ya Mfumo &gt; Apps &gt; iliyopakuliwa."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Futa chaguomsingi katika mipangilio ya Mfumo &gt; Apps &gt; iliyopakuliwa."</string>
<string name="chooseActivity" msgid="7486876147751803333">"Chagua kitendo"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"Chagua programu ya kifaa cha USB"</string>
<string name="noApplications" msgid="2991814273936504689">"Hakuna programu zinazoweza kufanya tendo hili."</string>
@@ -1139,8 +1172,8 @@
<string name="volume_icon_description_incall" msgid="8890073218154543397">"Sauti ya simu"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"Sauti ya faili"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"Sauti ya arifa"</string>
- <string name="ringtone_default" msgid="3789758980357696936">"Mlio chaguo msingi"</string>
- <string name="ringtone_default_with_actual" msgid="1767304850491060581">"Chaguo msingi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"Mlio chaguomsingi"</string>
+ <string name="ringtone_default_with_actual" msgid="1767304850491060581">"Chaguomsingi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="7937634392408977062">"Hamna"</string>
<string name="ringtone_picker_title" msgid="3515143939175119094">"Toni za mlio"</string>
<string name="ringtone_picker_title_alarm" msgid="6473325356070549702">"Sauti za kengele"</string>
@@ -1173,6 +1206,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi haina muunganisho wa intaneti"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Gusa ili upate chaguo"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Mabadiliko kwenye mipangilio ya mtandao pepe"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Bendi ya mtandao pepe wako imebadilika."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Kifaa hiki hakitumii mapendeleo yako ya GHz 5 pekee. Badala yake, kifaa hiki kitatumia bendi ya GHz 5 itakapopatikana."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Sasa inatumia <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Kifaa hutumia <xliff:g id="NEW_NETWORK">%1$s</xliff:g> wakati <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> haina intaneti. Huenda ukalipishwa."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Imebadilisha mtandao kutoka <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na sasa inatumia <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1260,7 +1296,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Msimamizi wako ameomba ripoti ya hitilafu ili kusaidia katika utatuzi wa hitilafu kwenye kifaa hiki. Huenda tukashiriki programu na data."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"SHIRIKI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"KATAA"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Badilisha kibodi"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Chagua njia ya ingizo"</string>
<string name="show_ime" msgid="2506087537466597099">"Ionyeshe kwenye skrini wakati kibodi halisi inatumika"</string>
<string name="hardware" msgid="194658061510127999">"Onyesha kibodi pepe"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Sanidi kibodi halisi"</string>
@@ -1537,12 +1573,12 @@
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Umeingiza nenosiri lako kwa makosa mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Umeingiza nenosiri lako kwa makosa mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Umechora ruwaza yako ya kufunga kwa makosa mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Umejaribu kufungua kompyuta ndogo kwa njia isiyo sahihi mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> zaidi yasiyofaulu, kompyuta ndogo itarejeshwa katika mfumo chaguo msingi ilivyotoka kiwandani data yote ya mtumiaji itapotea."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Umejaribu kufungua kompyuta ndogo kwa njia isiyo sahihi mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> zaidi yasiyofaulu, kompyuta ndogo itarejeshwa katika mfumo chaguomsingi ilivyotoka kiwandani data yote ya mtumiaji itapotea."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"Umekosea majaribio ya kufungua runinga mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukikosea majaribio mengine <xliff:g id="NUMBER_1">%2$d</xliff:g>, runinga itarejeshwa katika hali iliyotoka nayo kiwandani na data yote ya watumiaji itafutwa."</string>
- <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Umejaribu kufungua simu kwa njia isiyo sahihi mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> zaidi yasiyofaulu, simu itarejeshwa katika mfumo chaguo msingi ilivyotoka kiwandani na data yote ya mtumiaji itapotea."</string>
- <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Umejaribu kufungua kompyuta ndogo kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Sasa kompyuta ndogo itarejeshwa katika mfumo chaguo msingi ilivyotoka kiwandani."</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Umejaribu kufungua simu kwa njia isiyo sahihi mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> zaidi yasiyofaulu, simu itarejeshwa katika mfumo chaguomsingi ilivyotoka kiwandani na data yote ya mtumiaji itapotea."</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Umejaribu kufungua kompyuta ndogo kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Sasa kompyuta ndogo itarejeshwa katika mfumo chaguomsingi ilivyotoka kiwandani."</string>
<string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"Umekosea majaribio ya kufungua runinga mara <xliff:g id="NUMBER">%d</xliff:g>. Sasa runinga itarejeshwa katika hali iliyotoka nayo kiwandani."</string>
- <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Umejaribu kufungua simu kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Sasa simu itarejeshwa katika mfumo chaguo msingi ilivyotoka kiwandani."</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Umejaribu kufungua simu kwa njia isiyo sahihi mara <xliff:g id="NUMBER">%d</xliff:g>. Sasa simu itarejeshwa katika mfumo chaguomsingi ilivyotoka kiwandani."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Umekosea katika kuweka mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> bila kufaulu, utaombwa kufungua kompyuta yako ndogo kwa kutumia akaunti yako ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string>
<string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Umekosea kuchora mchoro wa kufungua mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukikosea majaribio mengine <xliff:g id="NUMBER_1">%2$d</xliff:g>, utaombwa ufungue runinga yako ukitumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Umekosea kuchora mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> yasiyofaulu, utaombwa kufungua simu yako kwa kutumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 2dcfd98444bb..0edf58cada67 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"விமானப் பயன்முறை"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"விமானப் பயன்முறை இயக்கத்தில் உள்ளது"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"விமானப் பயன்முறை முடக்கத்தில் உள்ளது"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"பேட்டரி சேமிப்பான்"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"பேட்டரி சேமிப்பான் ஆஃப் செய்யப்பட்டுள்ளது"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டுள்ளது"</string>
<string name="global_action_settings" msgid="1756531602592545966">"அமைப்பு"</string>
<string name="global_action_assist" msgid="3892832961594295030">"உதவி"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"குரல் உதவி"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"இருப்பிடம்"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"இந்தச் சாதனத்தின் இருப்பிடத்தை அறிந்து கொள்ள"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"இந்தச் சாதனத்தின் இருப்பிடத்தை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"இந்த ஆப்ஸைப் பயன்படுத்தும் சமயத்தில் மட்டுமே, இது உங்கள் இருப்பிடத்தை அணுகும்."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"இதன் இருப்பிடத்தை எப்போதுமே &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; அணுக அனுமதிக்கவா?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"இந்த ஆப்ஸைப் பயன்படுத்தாத சமயங்களில் கூட, இது உங்கள் இருப்பிடத்தை அணுகும்."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"கேலெண்டர்"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"கேலெண்டரை அணுகலாம்"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"கேலெண்டரை அணுகுவதற்கு &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; பயன்பாட்டை அனுமதிக்கவா?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"இந்தப் பயன்பாடு உங்கள் மொபைலில் கேலெண்டர் நிகழ்வுகளைச் சேர்க்கலாம், அகற்றலாம் அல்லது மாற்றலாம். இந்தப் பயன்பாடு கேலெண்டர் உரிமையாளர்கள் அனுப்பியது போல் தோன்றும் செய்திகளை அனுப்பலாம் அல்லது உரிமையாளர்களிடம் தெரிவிக்காமலே கேலெண்டரில் நிகழ்வுகளை மாற்றலாம்."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"கூடுதல் இட வழங்குநரின் கட்டளைகளின் அணுகல்"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"கூடுதல் இட வழங்குநர் கட்டளைகளை அணுகப் பயன்பாட்டை அனுமதிக்கிறது. இது, GPS அல்லது பிற இருப்பிட மூலங்களின் செயல்பாட்டை இடைமறிக்க பயன்பாட்டை அனுமதிக்கலாம்."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"துல்லியமான இருப்பிடத்தை அணுகுதல் (GPS மற்றும் நெட்வொர்க் அடிப்படையில்)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"இந்தப் பயன்பாடு GPS அல்லது நெட்வொர்க் மூலங்களின் (செல் கோபுரங்கள், வைஃபை நெட்வொர்க்குகள் போன்றவை) அடிப்படையில் உங்கள் இருப்பிடத்தைப் பெறலாம். பயன்பாடு பயன்படுத்தும் வகையில், உங்கள் மொபைலில் இந்த இருப்பிடச் சேவைகள் இயக்கப்பட்டு, கிடைக்கும்படி இருக்க வேண்டும். இதனால் பேட்டரி அதிகம் பயன்படுத்தப்படலாம்."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"முன்புலத்தில் இயங்கும்போது மட்டும் துல்லியமான இருப்பிடத்தைக் கண்டறிதல்"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"இந்த ஆப்ஸ் முன்புலத்தில் இயங்கும்போது மட்டுமே நீங்கள் இருக்கும் இடத்தைத் துல்லியமாகக் கண்டறியும். உங்கள் மொபைலில், இருப்பிடச் சேவைகளை ஆப்ஸ் பயன்படுத்துவதற்கு வசதியாக, அவை ஆன் செய்யப்பட்டிருக்க வேண்டும். இதனால் பேட்டரி அதிகம் பயன்படுத்தப்படலாம்."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"தோராயமான இருப்பிடத்தை அணுகுதல் (நெட்வொர்க் அடிப்படையில்)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"இந்தப் பயன்பாடு நெட்வொர்க் மூலங்களின் (செல் கோபுரங்கள், வைஃபை நெட்வொர்க்குகள் போன்றவை) அடிப்படையில் உங்கள் இருப்பிடத்தைப் பெறலாம். பயன்பாடு பயன்படுத்தும் வகையில், உங்கள் டேப்லெட்டில் இந்த இருப்பிடச் சேவைகள் இயக்கப்பட்டு, கிடைக்கும்படி இருக்க வேண்டும்."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"இந்தப் பயன்பாடு நெட்வொர்க் மூலங்களின் (செல் கோபுரங்கள், வைஃபை நெட்வொர்க்குகள் போன்றவை) அடிப்படையில் உங்கள் இருப்பிடத்தைப் பெறலாம். பயன்பாடு பயன்படுத்தும் வகையில், உங்கள் டிவியில் இந்த இருப்பிடச் சேவைகள் இயக்கப்பட்டு, கிடைக்கும்படி இருக்க வேண்டும்."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"இந்தப் பயன்பாடு நெட்வொர்க் மூலங்களின் (செல் கோபுரங்கள், வைஃபை நெட்வொர்க்குகள் போன்றவை) அடிப்படையில் உங்கள் இருப்பிடத்தைப் பெறலாம். பயன்பாடு பயன்படுத்தும் வகையில், உங்கள் மொபைலில் இந்த இருப்பிடச் சேவைகள் இயக்கப்பட்டு, கிடைக்கும்படி இருக்க வேண்டும்."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"பின்புலத்தில் இயங்கும்போது துல்லியமான இடத்தைக் கண்டறிதல்"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"இந்த ஆப்ஸ் பின்புலத்தில் இயங்கும்போது நீங்கள் இருக்கும் இடத்தைத் துல்லியமாகக் கண்டறியும். உங்கள் மொபைலில், இருப்பிடச் சேவைகளை ஆப்ஸ் பயன்படுத்துவதற்கு வசதியாக, அவை ஆன் செய்யப்பட்டிருக்க வேண்டும். இதனால் பேட்டரி அதிகம் பயன்படுத்தப்படலாம்."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"எனது ஆடியோ அமைப்புகளை மாற்றுதல்"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ஒலியளவு மற்றும் வெளியீட்டிற்கு ஸ்பீக்கர்கள் பயன்படுத்தப்படுவது போன்ற ஒட்டுமொத்த ஆடியோ அமைப்புகளைக் கட்டுப்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ஆடியோவைப் பதிவுசெய்தல்"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"கைரேகை ஐகான்"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"முக அங்கீகாரத்திற்கான வன்பொருளை நிர்வகித்தல்"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"உபயோகிப்பதற்காக முக டெம்ப்ளேட்டுகளை சேர்க்கும்/நீக்கும் முறைகளை இயக்க, ஆப்ஸை அனுமதிக்கும்."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"முக அங்கீகாரத்திற்கான வன்பொருளைப் பயன்படுத்துதல்"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"அடையாளம் காண்பதற்கு, முக அங்கீகார வன்பொருளைப் பயன்படுத்த ஆப்ஸை அனுமதிக்கிறது"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"அடையாளம் காண முடியவில்லை. மீண்டும் முயலவும்."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"முகம் பிரகாசமாக உள்ளது. குறைந்த ஒளியில் முயலவும்."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"முகம் தெரியவில்லை, வெளிச்சமான இடத்தில் முயலவும்."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"சென்சாரை முகத்திலிருந்து சற்று தொலைவில் நகர்த்துக."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"சென்சாரை முகத்திற்கு அருகில் கொண்டு வரவும்."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"சென்சாரை மேலே உயர்த்தவும்."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"சென்சாரைக் கீழே நகர்த்தவும்."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"சென்சாரை வலது புறமாக நகர்த்தவும்."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"சென்சாரை இடது புறமாக நகர்த்தவும்."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"சென்சாரைப் பார்க்கவும்."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"முகம் தெரியவில்லை."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"சாதனத்தின் முன், முகத்தை அசையாமல் காண்பிக்கவும்."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"முக அங்கீகாரத்திற்கான வன்பொருள் இல்லை."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"முகப் பதிவிற்கான நேரம் முடிந்தது. மீண்டும் முயல்க."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"முகத்தைச் சேமிக்க இயலாது."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"பலமுறை தோல்வி. முக அங்கீகாரம் முடக்கப்பட்டது."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"மீண்டும் முயலவும்."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"முகம் எதுவும் பதிவு செய்யப்படவில்லை."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"இந்தச் சாதனத்தில், முக அங்கீகாரத்திற்கான சென்சார் இல்லை"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"முகம் <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"முக ஐகான்"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ஒத்திசைவு அமைப்புகளைப் படித்தல்"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"கணக்கிற்கான ஒத்திசைவு அமைப்புகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது. எடுத்துக்காட்டாக, பீப்பிள் பயன்பாடு கணக்குடன் ஒத்திசைக்கப்பட்டுள்ளதா என்பதை இது தீர்மானிக்கலாம்."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ஒத்திசைவை இயக்குவதையும், முடக்குவதையும் மாற்றுதல்"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"வைஃபையில் இண்டர்நெட் அணுகல் இல்லை"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"விருப்பங்களுக்கு, தட்டவும்"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"உங்கள் ஹாட்ஸ்பாட் அமைப்புகளில் செய்யப்பட்டுள்ள மாற்றங்கள்"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"உங்கள் ஹாட்ஸ்பாட்டின் அலைவரிசை மாறிவிட்டது."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"இந்தச் சாதனத்தில், ’5GHz மட்டும்’ எனும் முன்னுரிமைத் தேர்வு ஆதரிக்கப்படவில்லை. எனினும் 5GHz அலைவரிசை கிடைக்கும்போது, சாதனம் அதைப் பயன்படுத்திக்கொள்ளும்."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>க்கு மாற்றப்பட்டது"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> நெட்வொர்க்கில் இண்டர்நெட் அணுகல் இல்லாததால், சாதனமானது <xliff:g id="NEW_NETWORK">%1$s</xliff:g> நெட்வொர்க்கைப் பயன்படுத்துகிறது. கட்டணங்கள் விதிக்கப்படலாம்."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> இலிருந்து <xliff:g id="NEW_NETWORK">%2$s</xliff:g>க்கு மாற்றப்பட்டது"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"இந்தச் சாதனத்தின் பிழைகாண்பதற்கு உதவ, உங்கள் நிர்வாகி பிழை அறிக்கையைக் கேட்டுள்ளார். பயன்பாடுகளும் தரவும் பகிரப்படலாம்."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"பகிர்"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"வேண்டாம்"</string>
- <string name="select_input_method" msgid="8547250819326693584">"விசைப்பலகையை மாற்று"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"உள்ளீட்டு முறையைத் தேர்வுசெய்க"</string>
<string name="show_ime" msgid="2506087537466597099">"கைமுறை விசைப்பலகை இயக்கத்தில் இருக்கும் போது IMEஐ திரையில் வைத்திரு"</string>
<string name="hardware" msgid="194658061510127999">"விர்ச்சுவல் விசைப்பலகையை காட்டு"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"கைமுறை விசைப்பலகையை உள்ளமைக்கவும்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 72d82b765f5e..98b737f44348 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ఎయిర్‌ప్లేన్ మోడ్"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ఎయిర్‌ప్లేన్ మోడ్ ఆన్‌లో ఉంది"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ఎయిర్‌ప్లేన్ మోడ్ ఆఫ్‌లో ఉంది"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"బ్యాటరీ సేవర్"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"బ్యాటరీ సేవర్ ఆఫ్‌లో ఉంది"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"బ్యాటరీ సేవర్ ఆన్‌లో ఉంది"</string>
<string name="global_action_settings" msgid="1756531602592545966">"సెట్టింగ్‌లు"</string>
<string name="global_action_assist" msgid="3892832961594295030">"సహాయం"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"వాయిస్ అసిస్టెంట్"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"స్థానం"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"మీరు యాప్‌ని ఉపయోగిస్తున్నప్పుడు మాత్రమే యాప్ స్థానానికి యాక్సెస్ కలిగి ఉంటుంది."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని ఎల్లప్పుడూ అనుమతించాలా?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"ఈ యాప్ ఎల్లప్పుడూ స్థానానికి యాక్సెస్ కలిగి ఉంటుంది, మీరు యాప్‌ని ఉపయోగించనప్పుడు కూడా."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"క్యాలెండర్"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"మీ క్యాలెండర్‌ను యాక్సెస్ చేయడానికి"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"మీ క్యాలెండర్‌ని యాక్సెస్ చేయడానికి &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ని అనుమతించాలా?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"ఈ యాప్ మీ ఫోన్‌లో క్యాలెండర్ ఈవెంట్‌లను జోడించగలదు, తీసివేయగలదు లేదా మార్చగలదు. ఈ యాప్ క్యాలెండర్ యజమానుల నుండి వచ్చినట్లుగా సందేశాలను పంపగలదు లేదా ఈవెంట్‌లను వాటి యజమానులకు తెలియకుండానే మార్చగలదు."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"అదనపు స్థాన ప్రదాత ఆదేశాలను యాక్సెస్ చేయడం"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"అదనపు స్థాన ప్రదాత ఆదేశాలను యాక్సెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఇది GPS లేదా ఇతర స్థాన మూలాల నిర్వహణలో యాప్‌ ప్రమేయం ఉండేలా అనుమతించవచ్చు."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"ఖచ్చితమైన స్థానాన్ని (GPS మరియు నెట్‌వర్క్-ఆధారితం) యాక్సెస్ చేయడం"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"ఈ యాప్‌ GPS ఆధారంగా లేదా సెల్ టవర్‌లు, Wi-Fi నెట్‌వర్క్‌ల వంటి నెట్‌వర్క్ స్థాన మూలాధారాల ఆధారంగా మీ స్థానాన్ని తెలుసుకోగలదు. యాప్‌ ఉపయోగించడానికి మీ ఫోన్‌లో ఈ స్థాన సేవలను తప్పనిసరిగా ఆన్ చేయాలి మరియు అందుబాటులో ఉండాలి. ఇది బ్యాటరీ వినియోగాన్ని పెంచవచ్చు."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"స్క్రీన్‌పై ఉన్నప్పుడు మాత్రమే ఖచ్చితమైన స్థానాన్ని యాక్సెస్ చేయండి"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"ఈ యాప్ స్క్రీన్‌పై ఉన్నప్పుడు మాత్రమే అది మీ ఖచ్చితమైన స్థానాన్ని తెలుసుకోగలదు. యాప్‌ ఉపయోగించడానికి మీ ఫోన్‌లో ఈ స్థాన సేవలను తప్పనిసరిగా ఆన్ చేయాలి మరియు అందుబాటులో ఉండాలి. ఇది బ్యాటరీ వినియోగాన్ని పెంచవచ్చు."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"ఇంచుమించు స్థానాన్ని (నెట్‌వర్క్-ఆధారితం) యాక్సెస్ చేయడం"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"ఈ యాప్‌ సెల్ టవర్‌లు మరియు Wi-Fi నెట్‌వర్క్‌ల వంటి నెట్‌వర్క్ మూలాధారాల ఆధారంగా మీ స్థానాన్ని తెలుసుకోగలదు. యాప్‌ ఉపయోగించడానికి మీ టాబ్లెట్‌లో ఈ స్థాన సేవలను తప్పనిసరిగా ఆన్ చేయాలి మరియు అందుబాటులో ఉండాలి."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"ఈ యాప్‌ సెల్ టవర్‌లు మరియు Wi-Fi నెట్‌వర్క్‌ల వంటి నెట్‌వర్క్ మూలాధారాల ఆధారంగా మీ స్థానాన్ని తెలుసుకోగలదు. యాప్‌ ఉపయోగించడానికి మీ టీవీలో ఈ స్థాన సేవలను తప్పనిసరిగా ఆన్ చేయాలి మరియు అందుబాటులో ఉండాలి."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"ఈ యాప్‌ సెల్ టవర్‌లు మరియు Wi-Fi నెట్‌వర్క్‌ల వంటి నెట్‌వర్క్ మూలాధారాల ఆధారంగా మీ స్థానాన్ని తెలుసుకోగలదు. యాప్‌ ఉపయోగించడానికి మీ ఫోన్‌లో ఈ స్థాన సేవలను తప్పనిసరిగా ఆన్ చేయాలి మరియు అందుబాటులో ఉండాలి."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"నేపథ్యంలో ఖచ్చితమైన స్థానాన్ని యాక్సెస్ చేయి"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"ఈ యాప్ నేపథ్యంలో ఉన్నప్పుడు ఎప్పుడైనా అది మీ ఖచ్చితమైన స్థానాన్ని తెలుసుకోగలదు. యాప్‌ ఉపయోగించడానికి మీ ఫోన్‌లో ఈ స్థాన సేవలను తప్పనిసరిగా ఆన్ చేయాలి మరియు అందుబాటులో ఉండాలి. ఇది బ్యాటరీ వినియోగాన్ని పెంచవచ్చు."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"మీ ఆడియో సెట్టింగ్‌లను మార్చడం"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"వాల్యూమ్ మరియు అవుట్‌పుట్ కోసం ఉపయోగించాల్సిన స్పీకర్ వంటి సార్వజనీన ఆడియో సెట్టింగ్‌లను సవరించడానికి యాప్‌ను అనుమతిస్తుంది."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ఆడియోను రికార్డ్ చేయడం"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"వేలిముద్ర చిహ్నం"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"ముఖ ప్రమాణీకరణ హార్డ్‌వేర్‌ను నిర్వహించండి"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"వినియోగం కోసం ముఖ టెంప్లేట్‌లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్‌ను అనుమతిస్తుంది."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ముఖ ప్రమాణీకరణ హార్డ్‌వేర్‌ను వాడండి"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ప్రమాణీకరణ కోసం ముఖ ప్రామాణీకరణ హార్డ్‌వేర్‌ను ఉపయోగించడానికి యాప్‌ని అనుమతిస్తుంది"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ముఖాన్ని ప్రాసెస్ చేయడం సాధ్యపడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ముఖం చాలా ప్రకాశవంతంగా ఉంటుంది. దయచేసి తక్కువ కాంతిలో ప్రయత్నించండి."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ముఖం చాలా చీకటిగా ఉంది. దయచేసి కాంతి మూలాన్ని వెతకండి."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"దయచేసి ముఖం నుండి దూరంగా సెన్సార్‌ను జరపండి."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"దయచేసి సెన్సార్‌ను ముఖానికి మరింత దగ్గరగా తీసుకురండి."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"దయచేసి సెన్సార్‌ను ఎక్కువకు జరపండి."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"దయచేసి సెన్సార్‌ను తక్కువకు జరపండి."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"దయచేసి సెన్సార్‌ను కుడికి జరపండి."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"దయచేసి సెన్సార్‌ను ఎడమవైపుకు జరపండి."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"దయచేసి సెన్సార్‌ను చూడండి."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"ఎలాంటి ముఖం గుర్తించబడలేదు."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"పరికరానికి నేరుగా ముఖాన్ని స్థిరంగా ఉంచండి."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"ముఖ హార్డ్‌వేర్ అందుబాటులో లేదు."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"ముఖ గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"ముఖం నిల్వ చేయబడదు."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"ముఖ కార్యకలాపం రద్దయింది."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. ముఖ ప్రమాణీకరణ నిలిపివేయబడింది."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"మళ్లీ ప్రయత్నించండి."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"ముఖం నమోదు చేయబడలేదు."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"ఈ పరికరంలో ముఖ ప్రామాణీకరణ సెన్సార్ లేదు"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"ముఖ <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"ముఖ చిహ్నం"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"సమకాలీకరణ సెట్టింగ్‌లను చదవడం"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"ఖాతా యొక్క సమకాలీకరణ సెట్టింగ్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది. ఉదాహరణకు, వ్యక్తుల యాప్‌ ఖాతాతో సమకాలీకరించబడాలా లేదా అనే విషయాన్ని ఇది నిశ్చయించవచ్చు."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"సమకాలీకరణను ఆన్ మరియు ఆఫ్‌కు టోగుల్ చేయడం"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fiకి ఇంటర్నెట్ యాక్సెస్ లేదు"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ఎంపికల కోసం నొక్కండి"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"మీ హాట్‌స్పాట్ సెట్టింగ్‌లకు మార్పులు"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"మీ హాట్‌స్పాట్ బ్యాండ్ మార్చబడింది."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"ఈ పరికరం 5GHz కోసం మాత్రమే మీ ప్రాధాన్యతకు మద్దతు ఇవ్వదు. బదులుగా, ఈ పరికరం అందుబాటులో ఉన్నప్పుడు 5GHz బ్యాండ్‌ను ఉపయోగిస్తుంది."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>కి మార్చబడింది"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"పరికరం <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>కి ఇంటర్నెట్ యాక్సెస్ లేనప్పుడు <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ని ఉపయోగిస్తుంది. ఛార్జీలు వర్తించవచ్చు."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> నుండి <xliff:g id="NEW_NETWORK">%2$s</xliff:g>కి మార్చబడింది"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ నివేదికను అభ్యర్థించారు. అనువర్తనాలు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"భాగస్వామ్యం చేయి"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"తిరస్కరిస్తున్నాను"</string>
- <string name="select_input_method" msgid="8547250819326693584">"కీబోర్డ్‌ను మార్చు"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ఇన్‌పుట్ పద్ధతిని ఎంచుకోండి"</string>
<string name="show_ime" msgid="2506087537466597099">"దీన్ని భౌతిక కీబోర్డ్ సక్రియంగా ఉన్నప్పుడు స్క్రీన్‌పై ఉంచుతుంది"</string>
<string name="hardware" msgid="194658061510127999">"వర్చువల్ కీబోర్డ్‌ను చూపు"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"భౌతిక కీబోర్డుని కాన్ఫిగర్ చేయండి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 46f1646332e3..89c2e44182c4 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"โหมดใช้งานบนเครื่องบิน"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"เปิดโหมดใช้งานบนเครื่องบิน"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"โหมดใช้งานบนเครื่องบินปิดทำงานอยู่"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"โหมดประหยัดแบตเตอรี่"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"ปิดโหมดประหยัดแบตเตอรี่อยู่"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"เปิดโหมดประหยัดแบตเตอรี่อยู่"</string>
<string name="global_action_settings" msgid="1756531602592545966">"การตั้งค่า"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ผู้ช่วย"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ตัวช่วยเสียง"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"ตำแหน่ง"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"เข้าถึงตำแหน่งของอุปกรณ์นี้"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงตำแหน่งของอุปกรณ์นี้ไหม"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"แอปจะมีสิทธิ์เข้าถึงตำแหน่งได้ในขณะที่คุณกำลังใช้แอปเท่านั้น"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงตำแหน่งของอุปกรณ์นี้ทุกครั้งไหม"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"แอปจะมีสิทธิ์เข้าถึงตำแหน่งเสมอแม้ว่าคุณจะไม่ได้ใช้แอป"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ปฏิทิน"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"เข้าถึงปฏิทิน"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึงปฏิทินไหม"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"แอปนี้สามารถเพิ่ม นำออก หรือเปลี่ยนกิจกรรมในปฏิทินบนโทรศัพท์ของคุณ แอปนี้สามารถส่งข้อความที่ดูเหมือนว่ามาจากเจ้าของปฏิทิน หรือเปลี่ยนแปลงกิจกรรมโดยไม่แจ้งให้เจ้าของทราบ"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"เข้าถึงคำสั่งของโปรแกรมแจ้งตำแหน่งพิเศษ"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"อนุญาตให้แอปเข้าถึงคำสั่งของผู้ให้บริการตำแหน่งเพิ่มเติม ซึ่งอาจทำให้แอปสามารถแทรกแซงการทำงานของ GPS หรือต้นทางของตำแหน่งอื่นๆ ได้"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"เข้าถึงตำแหน่งที่แม่นยำ (อิงจาก GPS และเครือข่าย)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"แอปนี้สามารถรับตำแหน่งของคุณโดยอิงจากแหล่งข้อมูลเครือข่าย เช่น เสาสัญญาณมือถือและเครือข่าย Wi-Fi แอปจะใช้บริการตำแหน่งเหล่านี้ได้ต่อเมื่อคุณเปิดบริการและบริการพร้อมใช้งานในโทรศัพท์ของคุณ การเปิดบริการนี้อาจเพิ่มการใช้แบตเตอรี่"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"เข้าถึงตำแหน่งที่แม่นยำเมื่ออยู่เบื้องหน้าเท่านั้น"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"แอปนี้รับตำแหน่งที่แม่นยำของคุณได้เมื่อทำงานอยู่เบื้องหน้าเท่านั้น แอปจะใช้บริการตำแหน่งเหล่านี้ได้ต่อเมื่อคุณเปิดบริการและบริการพร้อมใช้งานในโทรศัพท์ของคุณ ซึ่งอาจทำให้มีการใช้แบตเตอรี่มากขึ้น"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"เข้าถึงตำแหน่งโดยประมาณ (อิงจากเครือข่าย)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"แอปนี้สามารถรับตำแหน่งของคุณโดยอิงจากแหล่งข้อมูลเครือข่าย เช่น เสาสัญญาณมือถือและเครือข่าย Wi-Fi แอปจะใช้บริการตำแหน่งเหล่านี้ได้ต่อเมื่อคุณเปิดบริการและบริการพร้อมใช้งานในแท็บเล็ตของคุณ"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"แอปนี้สามารถรับตำแหน่งของคุณโดยอิงจากแหล่งข้อมูลเครือข่าย เช่น เสาสัญญาณมือถือและเครือข่าย Wi-Fi แอปจะใช้บริการตำแหน่งเหล่านี้ได้ต่อเมื่อคุณเปิดบริการและบริการพร้อมใช้งานในทีวีของคุณ"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"แอปนี้สามารถรับตำแหน่งของคุณโดยอิงจากแหล่งข้อมูลเครือข่าย เช่น เสาสัญญาณมือถือและเครือข่าย Wi-Fi แอปจะใช้บริการตำแหน่งเหล่านี้ได้ต่อเมื่อคุณเปิดบริการและบริการพร้อมใช้งานในโทรศัพท์ของคุณ"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"เข้าถึงตำแหน่งที่แม่นยำเมื่ออยู่เบื้องหลัง"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"แอปนี้รับตำแหน่งที่แม่นยำของคุณได้ทุกเมื่อที่ทำงานอยู่เบื้องหลัง แอปจะใช้บริการตำแหน่งเหล่านี้ได้ต่อเมื่อคุณเปิดบริการและบริการพร้อมใช้งานในโทรศัพท์ของคุณ ซึ่งอาจทำให้มีการใช้แบตเตอรี่มากขึ้น"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"เปลี่ยนการตั้งค่าเสียงของคุณ"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"อนุญาตให้แอปพลิเคชันปรับเปลี่ยนการตั้งค่าเสียงทั้งหมดได้ เช่น ระดับเสียงและลำโพงที่จะใช้งาน"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"บันทึกเสียง"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ไอคอนลายนิ้วมือ"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"จัดการฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"อนุญาตให้แอปเรียกใช้วิธีเพิ่มและลบเทมเพลตใบหน้าสำหรับการใช้งาน"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"อนุญาตให้แอปใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้าเพื่อตรวจสอบสิทธิ์"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"ประมวลผลใบหน้าไม่ได้ โปรดลองอีกครั้ง"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"ใบหน้าสว่างเกินไป โปรดลดแสง"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"ใบหน้ามืดเกินไป โปรดเปิดแหล่งกำเนิดแสง"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"โปรดขยับเซ็นเซอร์ให้ห่างจากใบหน้ามากขึ้น"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"โปรดขยับเซ็นเซอร์ให้ใกล้ใบหน้ามากขึ้น"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"โปรดขยับเซ็นเซอร์ให้สูงขึ้น"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"โปรดขยับเซ็นเซอร์ให้ต่ำลง"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"โปรดขยับเซ็นเซอร์ไปทางขวา"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"โปรดขยับเซ็นเซอร์ไปทางซ้าย"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"โปรดมองที่เซ็นเซอร์"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"ไม่พบใบหน้า"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"ให้ใบหน้าอยู่นิ่งๆ หน้าอุปกรณ์"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"ฮาร์ดแวร์รู้จำใบหน้าไม่พร้อมใช้งาน"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"หมดเวลาใช้ใบหน้าแล้ว โปรดลองอีกครั้ง"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"จัดเก็บข้อมูลใบหน้าไม่ได้"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"ยกเลิกการดำเนินการกับใบหน้าแล้ว"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ดำเนินการหลายครั้งเกินไป ปิดใช้การตรวจสอบสิทธิ์ด้วยใบหน้าแล้ว"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"ลองอีกครั้ง"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"ไม่ได้ลงทะเบียนใบหน้าไว้"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"อุปกรณ์นี้ไม่มีเซ็นเซอร์ตรวจสอบสิทธิ์ด้วยใบหน้า"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"ใบหน้า <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"ไอคอนใบหน้า"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"อ่านการตั้งค่าการซิงค์แล้ว"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"อนุญาตให้แอปพลิเคชันอ่านการตั้งค่าการซิงค์ของบัญชี ตัวอย่างเช่น การอนุญาตนี้สามารถระบุได้ว่าแอปพลิเคชัน People ซิงค์กับบัญชีหรือไม่"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"สลับระหว่างเปิดและปิดการซิงค์"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi เชื่อมต่ออินเทอร์เน็ตไม่ได้"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"แตะเพื่อดูตัวเลือก"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"มีการเปลี่ยนแปลงการตั้งค่าฮอตสปอต"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"ย่านความถี่ฮอตสปอตมีการเปลี่ยนแปลง"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"อุปกรณ์นี้ไม่รองรับค่ากำหนดของคุณเฉพาะสำหรับ 5 GHz เท่านั้น และจะใช้ย่านความถี่ 5 GHz แทน เมื่อใช้ได้"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"เปลี่ยนเป็น <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"อุปกรณ์จะใช้ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> เมื่อ <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> เข้าถึงอินเทอร์เน็ตไม่ได้ โดยอาจมีค่าบริการ"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"เปลี่ยนจาก <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> เป็น <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1252,7 +1288,7 @@
<string name="usb_notification_message" msgid="3370903770828407960">"แตะเพื่อดูตัวเลือกเพิ่มเติม"</string>
<string name="usb_power_notification_message" msgid="4647527153291917218">"กำลังชาร์จอุปกรณ์ที่เชื่อมต่อ แตะเพื่อดูตัวเลือกเพิ่มเติม"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ตรวจพบอุปกรณ์เสริมสำหรับเสียงแบบแอนะล็อก"</string>
- <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"อุปกรณ์ที่พ่วงไม่สามารถใช้งานร่วมกับโทรศัพท์นี้ แตะเพื่อเรียนรู้เพิ่มเติม"</string>
+ <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"อุปกรณ์ที่พ่วงไม่สามารถใช้งานร่วมกับโทรศัพท์นี้ แตะเพื่อดูข้อมูลเพิ่มเติม"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อการแก้ไขข้อบกพร่องผ่าน USB แล้ว"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"แตะเพื่อปิดการแก้ไขข้อบกพร่อง USB"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"เลือกเพื่อปิดใช้งานการแก้ไขข้อบกพร่อง USB"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"ผู้ดูแลระบบของคุณขอรายงานข้อบกพร่องเพื่อช่วยในการแก้ปัญหาอุปกรณ์นี้ อาจมีการแชร์แอปและข้อมูล"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"แชร์"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ปฏิเสธ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"เปลี่ยนแป้นพิมพ์"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"เลือกวิธีการป้อนข้อมูล"</string>
<string name="show_ime" msgid="2506087537466597099">"เปิดทิ้งไว้บนหน้าจอในระหว่างใช้งานแป้นพิมพ์จริง"</string>
<string name="hardware" msgid="194658061510127999">"แสดงแป้นพิมพ์เสมือน"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"กำหนดค่าแป้นพิมพ์จริง"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 7559187ab732..445330935792 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Airplane mode"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Naka-ON ang airplane mode"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Naka-OFF ang airplane mode"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Pangtipid sa baterya"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"NAKA-OFF ang Pangtipid sa baterya"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"NAKA-ON ang Pangtipid sa baterya"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Mga Setting"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Tulong"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Lokasyon"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"i-access ang lokasyon ng device na ito"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang lokasyon ng device na ito?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Maa-access lang ng app ang lokasyon habang ginagamit mo ang app."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Laging payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang lokasyon?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Palaging maa-access ng app ang lokasyon, kahit na hindi mo ginagamit ang app."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendaryo"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"i-access ang iyong kalendaryo"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Payagan ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; na i-access ang iyong kalendaryo?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Makakapagdagdag, makakapag-alis o makakapagbago ang app na ito ng mga event sa kalendaryo sa iyong telepono. Magagawa ng app na ito na magpadala ng mga mensahe na maaaring mukhang mula sa mga may-ari ng kalendaryo o magbago ng mga event nang hindi inaabisuhan ang mga may-ari nito."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"i-access ang mga dagdag na command ng provider ng lokasyon"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Nagbibigay-daan sa app na mag-access ng mga karagdagang command ng provider ng lokasyon. Maaari nitong bigyang-daan ang app na gambalain ang pagpapatakbo ng GPS o ng iba pang mga pinagmulan ng lokasyon."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"i-access ang tumpak na lokasyon (batay sa GPS at network)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Makukuha ng app na ito ang iyong lokasyon batay sa GPS o mga pinagmulan ng lokasyon ng network gaya ng mga cell tower at Wi-Fi network. Ang mga serbisyo ng lokasyon na ito ay dapat naka-on at available sa iyong telepono para sa app upang magamit ang mga ito. Maaaring tumaas ang pagkonsumo sa baterya dahil dito."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"i-access lang ang tumpak na lokasyon sa foreground"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Makukuha lang ng app na ito ang iyong eksaktong lokasyon kapag nasa foreground ito. Ang mga serbisyo ng lokasyon na ito ay dapat naka-on at available sa iyong telepono para magamit ng app ang mga ito. Maaaring lumakas ang pagkonsumo ng baterya dahil dito."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"i-access ang tinatantyang lokasyon (batay sa network)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Makukuha ng app na ito ang iyong lokasyon batay sa mga pinagmulan ng network gaya ng mga cell tower at Wi-Fi network. Ang mga serbisyo ng lokasyon na ito ay dapat naka-on at available sa iyong tablet para sa app upang magamit ang mga ito."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Makukuha ng app na ito ang iyong lokasyon batay sa mga pinagmulan ng network gaya ng mga cell tower at Wi-Fi network. Ang mga serbisyo ng lokasyon na ito ay dapat naka-on at available sa iyong TV para sa app upang magamit ang mga ito."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Makukuha ng app na ito ang iyong lokasyon batay sa mga pinagmulan ng network gaya ng mga cell tower at Wi-Fi network. Ang mga serbisyo ng lokasyon na ito ay dapat naka-on at available sa iyong telepono para sa app upang magamit ang mga ito."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"i-access ang tumpak na lokasyon sa background"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Makukuha ng app na ito ang iyong eksaktong lokasyon anumang oras na nasa background ito. Ang mga serbisyo ng lokasyon na ito ay dapat naka-on at available sa iyong telepono para magamit ng app ang mga ito. Maaaring lumakas ang pagkonsumo ng baterya dahil dito."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"baguhin ang mga setting ng iyong audio"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Pinapayagan ang app na baguhin ang mga pandaigdigang setting ng audio gaya ng volume at kung aling speaker ang ginagamit para sa output."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"mag-record ng audio"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icon ng fingerprint"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"pamahalaan ang hardware sa authentication ng mukha"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Pumapayag na mag-invoke ang app ng paraang magdagdag at mag-delete ng template ng mukha."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gumamit ng hardware sa pag-authenticate ng mukha"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Pumapayag na gumamit ng face authentication hardware ang app para sa pag-authenticate"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Hindi maiproseso ang mukha. Pakisubukang muli."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Masyadong maliwanag. Pakisubukan sa mas madilim."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Masyadong madilim. Huwag takpan ang ilaw."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Pakilayo sa mukha ang sensor."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Pakilapit sa mukha ang sensor."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Pakitaas ang sensor."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Pakibaba ang sensor."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Pakiusog pakanan ang sensor."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Pakiusog pakaliwa ang sensor."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Tumingin sa sensor."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Walang natukoy na mukha."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Panatilihin sa harap ng device ang mukha."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Hindi available ang hardware para sa mukha."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Nag-time out ang mukha. Subukang muli."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Hindi ma-store ang mukha."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Nakansela ang operation kaugnay ng mukha."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Masyadong maraming pagsubok. Subukang muli mamaya."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Sobrang pagsubok. Bawal na: facial authentication."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Subukang muli."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Walang naka-enroll na mukha."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Walang sensor ng pag-authenticate ng mukha ang device na ito"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Mukha <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Face icon"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"basahin ang mga setting ng sync"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Pinapayagan ang app na basahin ang mga setting ng pag-sync para sa isang account. Halimbawa, matutukoy nito kung naka-sync ang app na Mga Tao sa isang account."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"I-toggle on at off ang pag-sync"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Walang access sa internet ang Wi-Fi"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"I-tap para sa mga opsyon"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Mga pagbabago sa mga setting ng iyong hotspot"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Nagbago ang band ng iyong hotspot."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Hindi sinusuportahan ng device na ito ang kagustuhan mong gumamit lang ng 5GHz. Sa halip, gagamitin ng device na ito ang 5GHz na band kapag available."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Lumipat sa <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Ginagamit ng device ang <xliff:g id="NEW_NETWORK">%1$s</xliff:g> kapag walang access sa internet ang <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>. Maaaring may mga malapat na singilin."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Lumipat sa <xliff:g id="NEW_NETWORK">%2$s</xliff:g> mula sa <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Humiling ang iyong admin ng isang ulat ng bug upang makatulong sa pag-troubleshoot sa device na ito. Maaaring ibahagi ang mga app at data."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"IBAHAGI"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"TANGGIHAN"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Baguhin ang keyboard"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Pumili ng pamamaraan ng pag-input"</string>
<string name="show_ime" msgid="2506087537466597099">"Panatilihin ito sa screen habang aktibo ang pisikal na keyboard"</string>
<string name="hardware" msgid="194658061510127999">"Ipakita ang virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"I-configure ang pisikal na keyboard"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 044473362a04..a71bc4a29325 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Uçak modu"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Uçak modu AÇIK"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Uçak modu KAPALI"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Pil tasarrufu"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Pil tasarrufu KAPALI"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Pil tasarrufu AÇIK"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Sesli Yardım"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Konum"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"bu cihazın konumuna erişme"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının bu cihazın konumuna erişmesine izin verilsin mi?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Bu uygulama konum bilgisine yalnızca kullanıldığı sırada erişebilecektir."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının bu cihazın konumuna erişmesine her zaman izin verilsin mi?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Bu uygulama, kullanılmadığında bile konum bilgisine her zaman erişebilecektir."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Takvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"takviminize erişme"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının takviminize erişmesine izin verilsin mi?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Bu uygulama, telefonunuza takvim etkinlikleri ekleyebilir, mevcut etkinlikleri kaldırabilir ve değiştirebilir. Bu uygulama, takvim sahiplerinden gelmiş gibi görünen iletiler gönderebilir veya takvim sahiplerinin bilgisi olmadan etkinlikleri değiştirebilir."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ek konum sağlayıcı komutlarına eriş"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Uygulamanın, ekstra konum sağlayıcı komutlarına erişmesine izin verir. Bu izin, uygulamanın GPS veya diğer konum kaynaklarının çalışmasını kesmesine olanak sağlayabilir."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"konum bilgilerine hassas olarak erişme (GPS ve ağ tabanlı)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Bu uygulama baz istasyonu ve kablosuz ağ gibi ağ kaynaklarını kullanarak konumunuzu belirleyebilir. Uygulamanın bu hizmetleri kullanabilmesi için telefonunuzda bu konum hizmetleri açık ve kullanılabilir olmalıdır. Bu hizmet pil tüketimini artırabilir."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"yalnızca ön planda kesin konuma erişme"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Bu uygulama yalnızca ön plandayken kesin konumunuzu alabilir. Uygulamanın bu hizmetleri kullanabilmesi için telefonunuzda bu konum hizmetleri açık ve kullanılabilir olmalıdır. Bu, pil tüketimini artırabilir."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"konum bilgilerine yaklaşık olarak erişme (ağ tabanlı)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Bu uygulama baz istasyonu ve kablosuz ağ gibi ağ kaynaklarını kullanarak konumunuzu belirleyebilir. Uygulamanın bu hizmetleri kullanabilmesi için tabletinizde bu konum hizmetleri açık ve kullanılabilir olmalıdır."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Bu uygulama baz istasyonu ve kablosuz ağ gibi ağ kaynaklarını kullanarak konumunuzu belirleyebilir. Uygulamanın bu hizmetleri kullanabilmesi için TV\'nizde bu konum hizmetleri açık ve kullanılabilir olmalıdır."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Bu uygulama baz istasyonu ve kablosuz ağ gibi ağ kaynaklarını kullanarak konumunuzu belirleyebilir. Uygulamanın bu hizmetleri kullanabilmesi için telefonunuzda bu konum hizmetleri açık ve kullanılabilir olmalıdır."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"arka planda kesin konuma erişme"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Bu uygulama arka plandayken istediği zaman kesin konumunuzu alabilir. Uygulamanın bu hizmetleri kullanabilmesi için telefonunuzda bu konum hizmetleri açık ve kullanılabilir olmalıdır. Bu, pil tüketimini artırabilir."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"ses ayarlarınızı değiştirin"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Uygulamaya ses düzeyi ve ses çıkışı için kullanılan hoparlör gibi genel ses ayarlarını değiştirme izni verir."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ses kaydet"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Parmak izi simgesi"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"yüz kimlik doğrulaması donanımını yönetme"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Uygulamanın, kullanılacak yüz şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"yüz kimlik doğrulaması donanımını kullanma"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Uygulamanın yüz kimlik doğrulaması donanımı kullanmasına izin verir"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Yüz işlenemedi. Lütfen tekrar deneyin."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Yüzünüz çok parlak. Lütfen ışığı kısmayı deneyin."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Yüzünüz çok karanlık. Lütfen ışığı artırın."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Lütfen sensörü yüzünüzden biraz uzaklaştırın."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Lütfen sensörü yüzünüze yaklaştırın."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Lütfen sensörü daha yukarı kaldırın."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Lütfen sensörü daha aşağı indirin."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Lütfen sensörü sağa kaydırın."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Lütfen sensörü sola kaydırın."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Lütfen sensöre bakın."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Yüz algılanmadı."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Yüzünüzü cihazın önünde sabit bir şekilde tutun."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Yüz donanımı kullanılamıyor."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Yüz için zaman aşımı oluştu. Tekrar deneyin."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Yüz kaydedilemiyor."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Yüz işlemi iptal edildi."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Çok fazla deneme yapıldı. Yüz kimlik doğrulaması devre dışı bırakıldı."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Tekrar deneyin."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Herhangi bir yüz kaydedilmedi."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Bu cihazda yüz kimlik doğrulaması sensörü yok"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Yüz <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Yüz simgesi"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"senk. ayarlarını okuma"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Uygulamaya bir hesaba ait senkronizasyon ayarlarını okuma izni verir. Örneğin, bu izne sahip bir uygulama Kişiler uygulamasının bir hesapla senkronize olup olmadığını belirleyebilir."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"senkronizasyonu açma/kapatma"</string>
@@ -605,7 +638,7 @@
<string name="policylab_disableCamera" msgid="6395301023152297826">"Kameraları devre dışı bırak"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Tüm cihaz kameralarının kullanımını engelleme."</string>
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Ekran kilidinin bazı özelliklerini devre dışı bırakma"</string>
- <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Ekran kilidinin bazı özelliklerinin kullanılmasını önleyin."</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Ekran kilidinin bazı özelliklerinin kullanılmasını önleme."</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Ev"</item>
<item msgid="869923650527136615">"Mobil"</item>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Kablosuz bağlantının internet erişimi yok"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Seçenekler için dokunun"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot ayarlarınız değişti"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot bandı değişti."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Bu cihaz yalnızca 5 GHz bandının kullanılmasına yönelik tercihinizi desteklemiyor. Bunun yerine, bu cihaz 5 GHz bandını mevcut olduğunda kullanacak."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ağına geçildi"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ağının internet erişimi olmadığında cihaz <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ağını kullanır. Bunun için ödeme alınabilir."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ağından <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ağına geçildi"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Yöneticiniz, bu cihazda sorun gidermeye yardımcı olması için bir hata raporu istedi. Uygulamalar ve veriler paylaşılabilir."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"PAYLAŞ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"REDDET"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Klavyeyi değiştir"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Giriş yöntemini seçin"</string>
<string name="show_ime" msgid="2506087537466597099">"Fiziksel klavye etkin durumdayken ekranda tut"</string>
<string name="hardware" msgid="194658061510127999">"Sanal klavyeyi göster"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Fiziksel klavyeyi yapılandırın"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 4fdcb1a62475..64761341c1c0 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -242,9 +242,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Режим польоту"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Режим польоту ВВІМК."</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Режим польоту ВИМК."</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Режим енергозбереження"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Режим економії заряду акумулятора ВИМКНЕНО"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Режим економії заряду акумулятора ВВІМКНЕНО"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Налаштування"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Підказки"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Голос. підказки"</string>
@@ -282,6 +279,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Геодані"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"доступ до геоданих пристрою"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Надати додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ до геоданих пристрою?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Додаток матиме доступ до геоданих, лише коли ви ним користуєтеся."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Завжди надавати додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ до геоданих цього пристрою?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Додаток матиме доступ до геоданих, навіть коли ви ним не користуєтеся."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"отримувати доступ до календаря"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Надати додатку &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; доступ до календаря?"</string>
@@ -408,12 +408,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Цей додаток може додавати, вилучати та змінювати події календаря на вашому телефоні. Він також може надсилати повідомлення від імені власників календаря або редагувати події без відома власників."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"отр. дост. до додат. команд пров. місцезн."</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Додаток отримуватиме доступ до додаткових команд постачальника геоданих. Можливе втручання додатка в роботу GPS чи інших джерел геоданих."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"отримувати дані про точне місцезнаходження (на основі GPS і мережі)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Цей додаток може отримувати дані про ваше місцезнаходження на основі даних GPS або джерел мережі, як-от антен мобільного зв’язку та мереж Wi-Fi. Щоб додаток міг користуватися цими службами локації, вони мають бути доступними й увімкненими на вашому телефоні. Це може пришвидшити розряджання акумулятора."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"отримувати доступ до даних про точне місцезнаходження лише в активному режимі"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Цей додаток може отримувати дані про ваше точне місцезнаходження лише в активному режимі. Щоб додаток користувався службами локації, вони мають бути наявні й увімкнені на вашому телефоні. Через це може швидше розряджатись акумулятор."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"отримувати дані про приблизне місцезнаходження (на основі мережі)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Цей додаток може отримувати дані про ваше місцезнаходження на основі джерел мережі, як-от антен мобільного зв’язку та мереж Wi-Fi. Щоб додаток міг користуватися цими службами локації, вони мають бути доступними й увімкненими на вашому планшеті."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Цей додаток може отримувати дані про ваше місцезнаходження на основі джерел мережі, як-от антен мобільного зв’язку та мереж Wi-Fi. Щоб додаток міг користуватися цими службами локації, вони мають бути доступними й увімкненими на вашому телевізорі."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Цей додаток може отримувати дані про ваше місцезнаходження на основі джерел мережі, як-от антен мобільного зв’язку та мереж Wi-Fi. Щоб додаток міг користуватися цими службами локації, вони мають бути доступними й увімкненими на вашому телефоні."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"отримувати доступ до даних про точне місцезнаходження у фоновому режимі"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Цей додаток може будь-коли отримувати дані про ваше точне місцезнаходження у фоновому режимі. Щоб додаток користувався службами локації, вони мають бути наявні й увімкнені на вашому телефоні. Через це може швидше розряджатись акумулятор."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"змінювати налаштув-ня звуку"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Дозволяє програмі змінювати загальні налаштування звуку, як-от гучність і динамік, який використовується для виводу сигналу."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"запис-ти аудіо"</string>
@@ -521,6 +523,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок відбитка пальця"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"керувати обладнанням для автентифікації облич"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Додаток може активувати способи додавання й видалення шаблонів облич."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"застосовувати обладнання для автентифікації облич"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Додаток може застосовувати обладнання для автентифікації облич"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Не вдалося розпізнати обличчя. Повторіть спробу."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Обличчя засвітле. Спробуйте знизити яскравість."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Обличчя затемне. Не заступайте джерело світла."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Перемістіть сканер далі від обличчя."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Перемістіть сканер ближче до обличчя."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Перемістіть сканер вище."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Перемістіть сканер нижче."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Перемістіть сканер праворуч."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Перемістіть сканер ліворуч."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Дивіться на сканер."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Обличчя не виявлено."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Тримайте обличчя нерухомо перед пристроєм."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Обладнання для сканування облич недоступне."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Час очікування обличчя минув. Повторіть спробу."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Не вдається зберегти обличчя."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Дію з обличчям скасовано."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Забагато спроб. Повторіть пізніше."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Забагато спроб. Автентифікацію обличчя вимкнено."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Повторіть спробу."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Немає зареєстрованих облич."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"На цьому пристрої немає сканера для автентифікації облич"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Обличчя <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Значок обличчя"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"читати налаштування синхронізації"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Дозволяє програмі читати налаштування синхронізації для облікового запису, наприклад, визначати, чи програма Люди синхронізується з обліковим записом."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"вмикати й вимикати синхронізацію"</string>
@@ -1219,6 +1252,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Мережа Wi-Fi не має доступу до Інтернету"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Торкніться, щоб відкрити опції"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Зміни в налаштуваннях точки доступу"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Діапазон точки доступу змінено."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"На цьому пристрої не підтримується налаштування лише 5 ГГц. Замість цього буде використовуватися діапазон 5 ГГц, якщо доступно."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Пристрій перейшов на мережу <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Коли мережа <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> не має доступу до Інтернету, використовується <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Може стягуватися плата."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Пристрій перейшов з мережі <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> на мережу <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1306,7 +1342,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Ваш адміністратор просить надіслати повідомлення про помилку, щоб вирішити проблему з пристроєм. Він може отримати доступ до ваших додатків і даних."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"ПОДІЛИТИСЯ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ВІДХИЛИТИ"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Змінити клавіатуру"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Вибрати метод введення"</string>
<string name="show_ime" msgid="2506087537466597099">"Утримуйте на екрані, коли активна фізична клавіатура"</string>
<string name="hardware" msgid="194658061510127999">"Показати віртуальну клавіатуру"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Налаштуйте фізичну клавіатуру"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 6674caa752f8..2ed0e6c8bdee 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ہوائی جہاز وضع"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ہوائی جہاز وضع آن ہے"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ہوائی جہاز وضع آف ہے"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"بیٹری سیور"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"بیٹری سیور آف ہے"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"بیٹری سیور آن ہے"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ترتیبات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"اسسٹ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"مقام"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"اس آلہ کے مقام تک رسائی حاصل کریں"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو اس آلہ کے مقام تک رسائی کی اجازت دیں؟"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"جب آپ ایپ استعمال کریں گے تبھی ایپ کو مقام تک رسائی حاصل ہوگی۔"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"‏‎&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;‎ کو ہمیشہ اس آلہ کے مقام تک رسائی کرنے کی اجازت دیں؟"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"اگرچہ آپ ایپ استعمال نہ کر رہے ہوں تب بھی ایپ کو ہمیشہ مقام تک رسائی حاصل ہوگی۔"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"کیلنڈر"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"اپنے کیلنڈر تک رسائی حاصل کریں"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو آپ کے کیلنڈر تک رسائی کی اجازت دیں؟"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"یہ اپپ آپ کے فون پر کیلنڈر ایونٹس کو شامل، ہٹا یا ترمیم کر سکتی ہے۔ یہ ایپ وہ پیغامات بھیج سکتی ہے جو کیلنڈر کے مالکان کی جانب سے آنے والے معلوم ہو سکتے ہیں یا ان مالکان کو اطلاع دیے بغیر ایونٹس تبدیل کر سکتی ہے۔"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"اضافی مقام فراہم کنندہ کی کمانڈز تک رسائی حاصل کریں"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"‏ایپ کو اضافی مقام فراہم کنندہ کی کمانڈز تک رسائی حاصل کرنے کی اجازت دیتی ہے۔ یہ ایپ کو GPS یا دوسرے مقام کے مآخذ کے عمل کے ساتھ مداخلت کرنے کی اجازت دے سکتی ہے۔"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"‏قطعی مقام تک رسائی حاصل کریں (GPS اور نیٹ ورک پر مبنی)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"‏GPS یا نیٹ ورک مقام کے مآخذات جیسے کہ سیل ٹاورز اور Wi-Fi نیٹ ورکس کی بنیاد پر یہ ایپ آپ کا مقام حاصل کر سکتی ہے۔ ایپ کو ان مقام کی سروسز کو استعمال کرنے کیلئے ان کا آن ہونا اور آپ کے فون پر دستیاب ہونا ضروری ہے۔ اس سے بیٹری کے استعمال میں اضافہ ہوسکتا ہے۔"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"صرف پیش منظر میں درست مقام تک رسائی حاصل کریں"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"یہ ایپ جب پس منظر میں ہوتی ہے تبھی یہ آپ کا صحیح مقام حاصل کر سکتی ہے۔ ایپ کو ان مقام کی سروسز کو استعمال کر سکنے کیلئے ان کا آن ہونا اور آپ کے فون پر دستیاب ہونا ضروری ہے۔"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"تخمینی مقام تک رسائی حاصل کریں (نیٹ ورک پر مبنی)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"‏نیٹ ورک مآخذات جیسے کہ سیل ٹاورز اور Wi-Fi نیٹ ورکس کی بنیاد پر یہ ایپ آپ کا مقام حاصل کر سکتی ہے۔ ایپ کو ان مقام کی سروسز کو استعمال کرنے کیلئے ان کا آن ہونا اور آپ کے ٹیبلیٹ پر دستیاب ہونا ضروری ہے۔"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"‏نیٹ ورک مآخذات جیسے کہ سیل ٹاورز اور Wi-Fi نیٹ ورکس کی بنیاد پر یہ ایپ آپ کا مقام حاصل کر سکتی ہے۔ ایپ کو ان مقام کی سروسز کو استعمال کرنے کیلئے ان کا آن ہونا اور آپ کے TV پر دستیاب ہونا ضروری ہے۔"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"‏نیٹ ورک مآخذات جیسے کہ سیل ٹاورز اور Wi-Fi نیٹ ورکس کی بنیاد پر یہ ایپ آپ کا مقام حاصل کر سکتی ہے۔ ایپ کو ان مقام کی سروسز کو استعمال کرنے کیلئے ان کا آن ہونا اور آپ کے فون پر دستیاب ہونا ضروری ہے۔"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"پس منظر میں درست مقام تک رسائی حاصل کریں"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"یہ ایپ جب بھی پس منظر میں ہو آپ کا صحیح مقام حاصل کر سکتی ہے۔ ایپ کو ان مقام کی سروسز کو استعمال کر سکنے کیلئے ان کا آن ہونا اور آپ کے فون پر دستیاب ہونا ضروری ہے۔"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"اپنے آڈیو کی ترتیبات کو تبدیل کریں"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"ایپ کو مجموعی آڈیو ترتیبات جیسے والیوم اور آؤٹ پٹ کیلئے جو اسپیکر استعمال ہوتا ہے اس میں ترمیم کرنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"آڈیو ریکارڈ کریں"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"فنگر پرنٹ آئیکن"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"چہرے کی توثیق کے ہارڈویئر کا نظم کریں"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"ایپ کو چہرے کی تمثیلات شامل اور حذف کرنے کے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"چہرے کی توثیق کا ہارڈویئر استعمال کریں"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ایپ کو توثیق کیلئے چہرے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتا ہے"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"چہرے پر کارروائی نہیں ہو سکی۔ دوبارہ کوشش کریں۔"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"چہرے پر بہت زیادہ روشنی ہے۔ براہ کرم کم روشنی میں کوشش کریں۔"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"چہرے پر روشنی بہت کم ہے۔ براہ کرم روشنی بڑھائیں۔"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"براہ کرم سینسر کو چہرے سے تھوڑا دور رکھیں۔"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"براہ کرم سینسر کو چہرے سے تھوڑا قریب رکھیں۔"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"براہ کرم سینسر کو تھوڑا اوپر کریں۔"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"براہ کرم سینسر کو تھوڑا نیچے کریں۔"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"براہ کرم سینسر کو دائیں طرف کریں۔"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"براہ کرم سینسر کو بائیں طرف کریں۔"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"براہ کرم سینسر کی طرف دیکھیں۔"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"کسی چہرے کا پتہ نہیں چلا۔"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"آلہ کے سامنے چہرہ سیدھا رکھیں۔"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"چہرے کا ہارڈویئر دستیاب نہیں ہے۔"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"چہرہ پہچانے کی میعاد ختم ہو گئی۔ دوبارہ کوشش کریں۔"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"چہرے کو اسٹور نہیں کیا جا سکتا۔"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"کافی زیادہ کوششیں کی گئیں۔ چہرے کی توثیق منسوخ ہو گئی۔"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"دوبارہ کوشش کریں۔"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"کوئی بھی چہرہ مندرج نہیں ہے۔"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"اس آلہ میں چہرے کی تصدیق کرنے والا سینسر نہیں ہے۔"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"چہرہ <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"چہرے کا آئیکن"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"مطابقت پذیری کی ترتیبات پڑھیں"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"‏ایپ کو کسی اکاؤنٹ کیلئے مطابقت پذیری کی ترتیبات پڑھنے کی اجازت دیتا ہے۔ مثلا، یہ تعین کرسکتا ہے کہ آیا People ایپ کسی اکاؤنٹ کے ساتھ مطابقت پذیر ہے۔"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"مطابقت پذیری آن اور آف ٹوگل کریں"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"‏Wi-Fi کو انٹرنیٹ تک رسائی نہیں ہے"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"اختیارات کیلئے تھپتھپائیں"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"اپنے ہاٹ اسپاٹ کی ترتیبات میں تبدیلیاں"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"آپ کا ہاٹ اسپات بینڈ تبدیل ہو گیا۔"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"‏یہ آلہ صرف 5GHz کے لئے آپ کی ترجیح کا تعاون نہیں کرے گا۔ بلکہ 5GHz بینڈ کے دستیاب ہونے پر اس کا استعمال کرے گا۔"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> پر سوئچ ہو گیا"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"جب <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> کو انٹرنیٹ تک رسائی نہیں ہوتی ہے تو آلہ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> کا استعمال کرتا ہے۔ چارجز لاگو ہو سکتے ہیں۔"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> سے <xliff:g id="NEW_NETWORK">%2$s</xliff:g> پر سوئچ ہو گیا"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"‏آپ کے IT منتظم نے اس آلے کا مسئلہ حل کرنے میں مدد کیلئے ایک بگ رپورٹ کی درخواست کی ہے۔ ایپس اور ڈیٹا کا اشتراک ہو سکتا ہے۔"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"اشتراک کریں"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"مسترد کریں"</string>
- <string name="select_input_method" msgid="8547250819326693584">"کی بورڈ تبدیل کریں"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"ان پٹ کا طریقہ منتخب کریں"</string>
<string name="show_ime" msgid="2506087537466597099">"‏جب فزیکل کی بورڈ فعال ہو تو IME کو اسکرین پر رکھیں"</string>
<string name="hardware" msgid="194658061510127999">"ورچوئل کی بورڈ دکھائیں"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"فزیکل کی بورڈ کنفیگر کریں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index a3b5d5dd6c8f..577e6b9b564b 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Parvoz rejimi"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Parvoz usuli yoqilgan"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Parvoz rejimi o‘chirilgan"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Quvvat tejash rejimi"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Quvvat tejash rejimi YOQILMAGAN"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Quvvat tejash rejimi YONIQ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Sozlamalar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Yordam"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ovozli yordam"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Joylashuv"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"shu qurilmaning joylashuvi haqidagi axborotga kirish"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun bu qurilmaning joylashuvi haqidagi axborotdan foydalanishiga ruxsat berilsinmi?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Bu ilovadan foydalanilayotdangina u joylashuv axborotidan foydalana oladi."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun bu qurilmaning joylashuvi haqidagi axborotdan foydalanishiga ruxsat berilsinmi?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Bu ilovadan foydalanilmaganda ham u doim joylashuv axborotidan foydalana oladi."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Taqvim"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"taqvimingizga kirish"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun taqvimingizga ruxsat berilsinmi?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Bu ilova telefonga taqvim tadbirlarini qo‘shishi, olib tashlashi yoki o‘zgartirishi mumkin. Bu ilova taqvim egalari nomidan ko‘rinadigan SMS yuborishi yoki egalarini ogohlantirmasdan tadbirlarni o‘zgartirishi mumkin."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"qo‘shimcha manzillarga kirish buyruqlari"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Ilovaga qo‘shimcha joylashuv xizmati buyruqlaridan foydalanishga ruxsat beradi. Uning yordamida ilova GPS yoki boshqa joylashuv ma’lumoti manbalarining ishlashiga xalaqit qilishi mumkin."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"aniq joylashuv ma’lumotiga kirish (GPS va tarmoq asosida)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Bu ilova Wi-Fi va uyali tarmoq antennalari kabi tarmoq manbalari yoki GPS asosida joylashuvingiz axborotini olishi mumkin. Ilova ushbu joylashuv xizmatlaridan foydalana olishi uchun ular telefonda yoniq bo‘lishi va ishlashi kerak."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"aniq joylashuv axborotini olishga faqat old fonda ruxsat"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Bu ilova faqat fon rejimida aniq joylashuv axborotingizdan foydalanishi mumkin. Ilova ushbu joylashuv xizmatlaridan foydalana olishi uchun ular telefoningizda yoniq turishi va ishlashi kerak. Bunda batareya sarfi oshishi mumkin."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"taxminiy joylashuv (tarmoq asosida) ma’lumotlaridan foydalanishga ruxsat"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Bu ilova Wi-Fi va uyali tarmoq antennalari kabi tarmoq manbalari asosida joylashuvingiz axborotini olishi mumkin. Ilova ushbu joylashuv xizmatlaridan foydalana olishi uchun ular planshetda yoniq bo‘lishi va ishlashi kerak."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Bu ilova Wi-Fi va uyali tarmoq antennalari kabi tarmoq manbalari asosida joylashuvingiz axborotini olishi mumkin. Ilova ushbu joylashuv xizmatlaridan foydalana olishi uchun ular televizorda yoniq bo‘lishi va ishlashi kerak."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Bu ilova Wi-Fi va uyali tarmoq antennalari kabi tarmoq manbalari asosida joylashuvingiz axborotini olishi mumkin. Ilova ushbu joylashuv xizmatlaridan foydalana olishi uchun ular telefoningizda yoniq bo‘lishi va ishlashi kerak."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"fonda joylashuv axborotini olishga ruxsat"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Bu ilova fon rejimida aniq joylashuv axborotingizdan foydalanishi mumkin. Ilova ushbu joylashuv xizmatlaridan foydalana olishi uchun ular telefoningizda yoniq turishi va ishlashi kerak. Bunda batareya sarfi oshishi mumkin."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"audio sozlamalaringizni o‘zgartirish"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Ilovalarga tovush va ovoz chiqarish uchun foydalaniladigan karnay kabi global audio sozlamalarini o‘zgartirish uchun ruxsat beradi."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ovoz yozib olish"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Barmoq izi belgisi"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"yuzni aniqlash qurilmasini boshqarish"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Ilova foydalanish uchun yuz namunalarini qo‘shish va o‘chirish usullarini tatbiq qilishi mumkin."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"yuzni aniqlash qurilmasidan foydalanish"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Haqiqiylikni tekshirish uchun skanerdan foydalanish imkonini beradi"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Yuz aniqlanmadi. Qaytadan urining."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Yuz juda yorqin. Yorug‘likni kamaytiring."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Yuz juda xira. Yorug‘likni oshiring."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Qurilmani yuzingizdan uzoqroq tuting."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Qurilmani yuzga yaqin tuting."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Qurilmani teparoq ko‘taring."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Qurilmani pastroq tushiring."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Qurilmani o‘ngroq suring."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Qurilmani chaproq suring."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Qurilma kamerasiga qarang."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Yuz aniqlanmadi."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Yuzingizni qurilmaga qarating."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Yuzni aniqlash uchun qurilma mavjud emas."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Yuzni aniqlash vaqti tugadi. Qaytadan urining."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Aniqlangan yuz saqlanmadi."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Yuzni aniqlash bekor qilindi."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Juda ko‘p urinildi. Keyinroq qaytadan urining."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Juda ko‘p urinildi. Skaner faolsizlantirildi."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Qaytadan urining."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Hech qanday yuz qayd qilinmagan."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Bu qurilmada yuzni aniqlash uchun skaner mavjud emas"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Yuz <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Yuz belgisi"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"sinx-sh sozlamalarini o‘qish"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ilovaga hisobning sinxronlash sozlamalarini o‘qish uchun ruxsat beradi. Masalan, bu \"Odamlar\" ilovasi hisob bilan sinxronlangan yoki aksini aniqlay oladi."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"sinx.ni yoqish/o‘chirish"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi tarmoqda internet aloqasi yo‘q"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Variantlarni ko‘rsatish uchun bosing"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Hotspot sozlamalari o‘zgartirildi"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Hotspot chastotasi o‘zgartirildi."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Qurilma faqat 5 GGs chastotada ishlay olmaydi. Bu chastotadan imkoniyatga qarab foydalaniladi."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> tarmog‘iga ulanildi"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Agar <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> tarmoqda internet uzilsa, qurilma <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ga ulanadi. Sarflangan trafik uchun haq olinishi mumkin."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> tarmog‘idan <xliff:g id="NEW_NETWORK">%2$s</xliff:g> tarmog‘iga o‘tildi"</string>
@@ -1263,7 +1299,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Administratoringiz bu qurilma nosozliklarini tuzatish uchun xatoliklar hisobotini so‘ramoqda. Ilova va ma’lumotlardan foydalanilishi mumkin."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"BAHAM KO‘RISH"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"RAD ETISH"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Klaviaturani o‘zgartirish"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Matn kiritish usulini tanlang"</string>
<string name="show_ime" msgid="2506087537466597099">"Tashqi klaviaturadan foydalanilayotganda buni ekranda saqlab turish"</string>
<string name="hardware" msgid="194658061510127999">"Virtual klaviatura ko‘rsatilsin"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Tashqi klaviaturani sozlash"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 11adcc672c18..7b603fbeea82 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Chế độ trên máy bay"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Chế độ trên máy bay BẬT"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Chế độ trên máy bay TẮT"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Trình tiết kiệm pin"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Trình tiết kiệm pin đang TẮT"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Trình tiết kiệm pin đang BẬT"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Cài đặt"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hỗ trợ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Trợ lý thoại"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Vị trí"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"truy cập vị trí của thiết bị này"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào vị trí của thiết bị này?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Ứng dụng sẽ chỉ có quyền truy cập vào vị trí khi bạn sử dụng."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Luôn cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vị trí thiết bị?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Ứng dụng sẽ luôn có quyền truy cập vào vị trí, ngay cả khi bạn không sử dụng."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Lịch"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"truy cập lịch của bạn"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Cho phép &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; truy cập vào lịch của bạn?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Ứng dụng này có thể thêm, xóa hoặc thay đổi sự kiện lịch trên điện thoại của bạn. Ứng dụng này có thể gửi các tin nhắn trông có vẻ như được gửi từ các chủ sở hữu lịch hoặc thay đổi sự kiện mà không thông báo cho chủ sở hữu."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"truy cập vào các lệnh của nhà cung cấp vị trí bổ sung"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Cho phép ứng dụng truy cập vào các lệnh của nhà cung cấp vị trí bổ sung. Điều này có thể cho phép ứng dụng can thiệp vào hoạt động của Hệ thống định vị toàn cầu (GPS) hoặc các nguồn vị trí khác."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"truy cập vị trí chính xác (dựa vào mạng và GPS)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Ứng dụng này có thể nhận thông tin vị trí của bạn dựa trên GPS hoặc các nguồn vị trí mạng như tháp phát sóng di động và mạng Wi-Fi. Các dịch vụ vị trí này phải được bật và khả dụng trên điện thoại của bạn để ứng dụng có thể sử dụng chúng. Điều này có thể làm tăng mức tiêu thụ pin."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"chỉ truy cập vị trí chính xác trong nền trước"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Bất cứ khi nào chạy trong nền trước, ứng dụng này có thể nhận thông tin vị trí chính xác của bạn. Để ứng dụng có thể sử các dụng dịch vụ vị trí, điện thoại của bạn phải có các dịch vụ này và dịch vụ ở trạng thái bật. Hoạt động này có thể tăng mức tiêu thụ pin."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"truy cập vị trí gần đúng (dựa vào mạng)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Ứng dụng này có thể nhận thông tin vị trí của bạn dựa trên các nguồn mạng như tháp phát sóng di động và mạng Wi-Fi. Các dịch vụ vị trí này phải được bật và khả dụng trên máy tính bảng của bạn để ứng dụng có thể sử dụng chúng."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Ứng dụng này có thể nhận thông tin vị trí của bạn dựa trên các nguồn mạng như tháp phát sóng di động và mạng Wi-Fi. Các dịch vụ vị trí này phải được bật và khả dụng trên TV của bạn để ứng dụng có thể sử dụng chúng."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Ứng dụng này có thể nhận thông tin vị trí của bạn dựa trên các nguồn mạng như tháp phát sóng di động và mạng Wi-Fi. Các dịch vụ vị trí này phải được bật và khả dụng trên điện thoại của bạn để ứng dụng có thể sử dụng chúng."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"truy cập vị trí chính xác trong nền"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Bất cứ khi nào chạy trong nền, ứng dụng này có thể nhận thông tin vị trí chính xác của bạn. Để ứng dụng có thể sử dụng các dịch vụ vị trí, điện thoại của bạn phải có các dịch vụ này và dịch vụ ở trạng thái bật. Hoạt động này có thể tăng mức tiêu thụ pin."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"thay đổi cài đặt âm thanh của bạn"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Cho phép ứng dụng sửa đổi cài đặt âm thanh chung chẳng hạn như âm lượng và loa nào được sử dụng cho thiết bị ra."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ghi âm"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Biểu tượng vân tay"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"quản lý phần cứng xác thực khuôn mặt"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Cho phép ứng dụng gọi ra các phương pháp để thêm và xóa mẫu khuôn mặt sử dụng."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"sử dụng phần cứng xác thực khuôn mặt"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Cho phép ứng dụng sử dụng phần cứng xác thực khuôn mặt để tiến hành xác thực"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Không thể xử lý khuôn mặt. Vui lòng thử lại."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Khuôn mặt quá sáng. Hãy thử dưới ánh sáng yếu hơn."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Khuôn mặt quá tối. Hãy tìm nguồn sáng tốt hơn."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Hãy đưa cảm biến ra xa khuôn mặt hơn."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Hãy đưa cảm biến lại gần khuôn mặt hơn."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Hãy đưa cảm biến lên cao hơn."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Hãy đưa cảm biến xuống thấp hơn."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Hãy đưa cảm biến sang bên phải."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Hay đưa cảm biến sang bên trái."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Hãy nhìn vào cảm biến."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Không phát hiện được khuôn mặt nào."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Hãy giữ yên khuôn mặt trước thiết bị."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Không truy cập được phần cứng nhận dạng khuôn mặt."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Đã hết thời gian chờ khuôn mặt. Hãy thử lại."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Không thể lưu khuôn mặt."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Đã hủy thao tác dùng khuôn mặt."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Bạn đã thử quá nhiều lần. Hãy thử lại sau."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Đã thử quá nhiều lần. Đã tắt xác thực khuôn mặt."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Hãy thử lại."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Bạn chưa đăng ký khuôn mặt."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Thiết bị này không có cảm biến xác thực khuôn mặt"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Khuôn mặt <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Biểu tượng khuôn mặt"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"đọc cài đặt đồng bộ hóa"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Cho phép ứng dụng đọc cài đặt đồng bộ hóa cho tài khoản. Ví dụ: việc này có thể xác định liệu ứng dụng Mọi người đã được đồng bộ hóa với tài khoản chưa."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"chuyển đổi bật và tắt đồng bộ hóa"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi không có quyền truy cập Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Nhấn để biết tùy chọn"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Những thay đổi trong mục cài đặt điểm phát sóng của bạn"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Bằng tần của điểm phát sóng đã thay đổi."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Thiết bị này không hỗ trợ tùy chọn chỉ sử dụng băng tần 5 GHz. Thay vào đó, thiết bị này sẽ sử dụng băng tần 5 GHz khi có thể."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Đã chuyển sang <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Thiết bị sử dụng <xliff:g id="NEW_NETWORK">%1$s</xliff:g> khi <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> không có quyền truy cập Internet. Bạn có thể phải trả phí."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Đã chuyển từ <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> sang <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Quản trị viên của bạn đã yêu cầu báo cáo lỗi để giúp khắc phục sự cố thiết bị này. Bạn có thể chia sẻ ứng dụng và dữ liệu."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"CHIA SẺ"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"TỪ CHỐI"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Thay đổi bàn phím"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Chọn phương thức nhập"</string>
<string name="show_ime" msgid="2506087537466597099">"Hiển thị bàn phím ảo trên màn hình trong khi bàn phím thực đang hoạt động"</string>
<string name="hardware" msgid="194658061510127999">"Hiển thị bàn phím ảo"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Định cấu hình bàn phím thực"</string>
diff --git a/core/res/res/values-w210dp-round-watch/styles.xml b/core/res/res/values-w210dp-round-watch/styles.xml
new file mode 100644
index 000000000000..f10374c67cb3
--- /dev/null
+++ b/core/res/res/values-w210dp-round-watch/styles.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <style name="TextAppearance.Toast">
+ <item name="fontFamily">roboto</item>
+ <item name="textSize">15sp</item>
+ </style>
+</resources> \ No newline at end of file
diff --git a/core/res/res/values-watch/config.xml b/core/res/res/values-watch/config.xml
index e12f04af773b..8e824791ef15 100644
--- a/core/res/res/values-watch/config.xml
+++ b/core/res/res/values-watch/config.xml
@@ -68,4 +68,7 @@
<bool name="config_supportsMultiWindow">true</bool>
<bool name="config_supportsMultiDisplay">true</bool>
<bool name="config_supportsSplitScreenMultiWindow">false</bool>
+
+ <!-- Default Gravity setting for the system Toast view. Equivalent to: Gravity.CENTER -->
+ <integer name="config_toastDefaultGravity">0x00000011</integer>
</resources>
diff --git a/core/res/res/values-watch/dimens.xml b/core/res/res/values-watch/dimens.xml
index 4c8b39ca92a7..5472316487fb 100644
--- a/core/res/res/values-watch/dimens.xml
+++ b/core/res/res/values-watch/dimens.xml
@@ -18,4 +18,6 @@
<dimen name="alert_dialog_title_height">0dp</dimen>
<!-- Dialog button bar height, not used in watch due to dynamically sized button bar -->
<dimen name="alert_dialog_button_bar_height">0dp</dimen>
+
+ <dimen name="toast_y_offset">0dip</dimen>
</resources>
diff --git a/core/res/res/values-watch/styles.xml b/core/res/res/values-watch/styles.xml
new file mode 100644
index 000000000000..3172f735f3fc
--- /dev/null
+++ b/core/res/res/values-watch/styles.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <style name="TextAppearance.Toast">
+ <item name="fontFamily">sans-serif-regular</item>
+ <item name="textSize">13sp</item>
+ </style>
+</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 1fc9610e47a0..8a55d016c74e 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飞行模式"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"已开启飞行模式"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"未开启飞行模式"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"省电模式"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"省电模式已关闭"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"省电模式已开启"</string>
<string name="global_action_settings" msgid="1756531602592545966">"设置"</string>
<string name="global_action_assist" msgid="3892832961594295030">"助手应用"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"语音助理"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"位置信息"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"获取此设备的位置信息"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;获取此设备的位置信息吗?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"只有当您使用该应用时,该应用才有权获取位置信息。"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"一律允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;获取此设备的位置信息吗?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"即使您并未使用该应用,该应用也将始终有权获取位置信息。"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日历"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"访问您的日历"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"允许&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;访问您的日历吗?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"此应用可在手机上添加、移除或更改日历活动。此应用可能会以日历所有者的身份发送消息,或在不通知所有者的情况下更改活动。"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"获取额外的位置信息提供程序命令"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"允许该应用使用其他的位置信息提供程序命令。此权限使该应用可以干扰GPS或其他位置信息源的运作。"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"访问确切位置信息(以 GPS 和网络为依据)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"此应用可根据 GPS 或网络来源(例如基站和 WLAN 网络)获取您的位置信息。您的手机必须支持并开启这些位置信息服务,此应用才能使用这些服务。这可能会增加耗电量。"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"只能在前台获取精确的位置信息"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"此应用只有在前台运行时才能获取您的精确位置信息。您的手机必须支持并开启这些位置信息服务,此应用才能使用这些服务。这可能会增加耗电量。"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"访问大致位置信息(以网络为依据)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"此应用可根据网络来源(例如基站和 WLAN 网络)获取您的位置信息。您的平板电脑必须支持并开启这些位置信息服务,此应用才能使用这些服务。"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"此应用可根据网络来源(例如基站和 WLAN 网络)获取您的位置信息。您的电视必须支持并开启这些位置信息服务,此应用才能使用这些服务。"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"此应用可根据网络来源(例如基站和 WLAN 网络)获取您的位置信息。您的手机必须支持并开启这些位置信息服务,此应用才能使用这些服务。"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"在后台获取精确的位置信息"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"此应用在后台运行时可随时获取您的精确位置信息。您的手机必须支持并开启这些位置信息服务,此应用才能使用这些服务。这可能会增加耗电量。"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"更改您的音频设置"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"允许该应用修改全局音频设置,例如音量和用于输出的扬声器。"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"录音"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指纹图标"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"管理人脸身份验证硬件"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"允许该应用调用方法来添加和删除可用的人脸模板。"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用人脸身份验证硬件"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允许该应用使用人脸身份验证硬件进行身份验证"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"无法识别此面孔,请重试。"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"面部太亮,请在光线适中的环境下重试。"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"面部太暗,请不要挡住光线。"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"请将传感器移到距离面孔较远处。"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"请将传感器靠近面孔。"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"请上移传感器。"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"请下移传感器。"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"请右移传感器。"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"请左移传感器。"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"请目视传感器。"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"未检测到任何面孔。"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"请将面孔保持在设备前不动。"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"无法使用面孔识别硬件"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"面孔处理操作超时,请重试。"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"无法存储面孔。"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"面孔处理操作已取消。"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"尝试次数过多,请稍后重试。"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"尝试次数过多,系统已停用人脸身份验证功能。"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"请重试。"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"未注册任何面孔。"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"此设备没有人脸身份验证传感器"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"面孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"面孔图标"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"读取同步设置"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允许该应用读取某个帐号的同步设置。例如,此权限可确定“联系人”应用是否与某个帐号同步。"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"启用和停用同步"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"此 WLAN 网络无法访问互联网"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"点按即可查看相关选项"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"您的热点设置已变更"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"您的热点频段已变更。"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"此设备不支持您的偏好设置(仅限 5GHz),而且会在 5GHz 频段可用时使用该频段。"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"已切换至<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"设备会在<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>无法访问互联网时使用<xliff:g id="NEW_NETWORK">%1$s</xliff:g>(可能需要支付相应的费用)。"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"已从<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>切换至<xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"您的管理员希望获取错误报告,以便排查此设备的问题。报告可能会透露您设备上的应用和数据。"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"分享"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"拒绝"</string>
- <string name="select_input_method" msgid="8547250819326693584">"更改键盘"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"选择输入法"</string>
<string name="show_ime" msgid="2506087537466597099">"开启后,连接到实体键盘时,它会一直显示在屏幕上"</string>
<string name="hardware" msgid="194658061510127999">"显示虚拟键盘"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"配置实体键盘"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 9f3e7c293a5b..18fc2c9603fd 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飛行模式"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飛航模式為 [開啟]"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飛行模式為 [關閉]"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"省電模式"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"省電模式已關閉"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"省電模式已開啟"</string>
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"小幫手"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"語音助手"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"位置資訊"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"存取此裝置的位置"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取此裝置的位置資訊嗎?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"只有在您使用此應用程式時,應用程式才能存取位置資訊。"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"要一律允許「&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;」存取此裝置的位置資訊嗎?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"即使您沒有使用此應用程式,應用程式亦一直能夠存取位置資訊。"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日曆"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"存取您的日曆"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取您的日曆嗎?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"此應用程式可以加入、移除或變更您的手機中的日曆活動。此應用程式可以傳送看似來自日曆擁有者的訊息,或變更活動而不通知其擁有者。"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"接收額外的位置提供者指令"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"允許應用程式存取額外的位置提供者指令。這項設定可能會使應用程式干擾 GPS 或其他位置來源的運作。"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"存取精確位置 (根據 GPS 和網絡)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"此應用程式可以根據 GPS 或網絡位置來源 (例如手機訊號塔和 Wi-Fi 網絡) 取得您的位置。您的手機必須支援並啟用這些位置資訊服務,應用程式方可使用這項功能。這可能會增加耗電量。"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"只在前景存取精確位置"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"此應用程式只可在前台運行時獲取您的確實位置資訊。您的手機必須支援並啟用這些位置資訊服務,應用程式方可使用這項功能,但這樣做可能會增加耗電量。"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"存取約略位置 (根據網絡)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"此應用程式可以根據您的網絡來源 (例如手機訊號塔和 Wi-Fi 網絡) 取得您的位置。您的平板電腦必須支援並啟用這些位置資訊服務,應用程式方可使用這項功能。"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"此應用程式可以根據您的網絡來源 (例如手機訊號塔和 Wi-Fi 網絡) 取得您的位置。您的電視必須支援並啟用這些位置資訊服務,應用程式方可使用這項功能。"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"此應用程式可以根據您的網絡來源 (例如手機訊號塔和 Wi-Fi 網絡) 取得您的位置。您的手機必須支援並啟用這些位置資訊服務,應用程式方可使用這項功能。"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"在背景中存取精確位置"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"此應用程式可在背景運行時隨時獲取您的確實位置資訊。您的手機必須支援並啟用這些位置資訊服務,應用程式方可使用這項功能,但這樣做可能會增加耗電量。"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"更改音效設定"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"允許應用程式修改全域音頻設定,例如音量和用於輸出的喇叭。"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"錄製音效"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋圖示"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"管理臉孔驗證硬件"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"允許應用程式調用方法,以加入和刪除可用的臉孔範本。"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用臉孔驗證硬件"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允許應用程式使用臉孔驗證硬件來驗證"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"無法識別臉孔,請再試一次。"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"臉孔太光亮,請在較暗的光線下嘗試。"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"臉孔太暗,請尋找更佳光源。"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"請將感應器移離臉孔。"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"請將感應器靠近臉孔。"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"請將感應器向上移。"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"請將感應器向下移。"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"請將感應器向右移。"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"請將感應器向左移。"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"請看著感應器。"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"未偵測到任何臉孔。"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"請在裝置前保持臉孔不動。"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"無法使用臉孔識別硬件。"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"臉孔操作已逾時,請再試一次。"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"無法儲存臉孔。"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"臉孔操作已取消。"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"嘗試次數過多,臉孔驗證已停用。"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"請再試一次。"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"未註冊任何臉孔。"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"此裝置沒有臉孔驗證感應器"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"臉孔圖示"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允許應用程式讀取帳戶的同步設定,例如確定「通訊錄」應用程式是否和某個帳戶保持同步。"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"開啟和關閉同步功能"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi 並未連接互聯網"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"輕按即可查看選項"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"您的熱點設定變更"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"您的熱點頻段已變更。"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"此裝置不支援只限 5 GHz 的偏好設定,但會在 5 GHz 頻段可用時採用。"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"已切換至<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"裝置會在 <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> 無法連線至互聯網時使用<xliff:g id="NEW_NETWORK">%1$s</xliff:g> (可能需要支付相關費用)。"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"已從<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>切換至<xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"您的管理員要求您提供錯誤報告,以協助解決此裝置的問題。報告可能包含應用程式和相關資料。"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"分享"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"拒絕"</string>
- <string name="select_input_method" msgid="8547250819326693584">"變更鍵盤"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"選擇輸入法"</string>
<string name="show_ime" msgid="2506087537466597099">"在實體鍵盤處於連接狀態時保持顯示"</string>
<string name="hardware" msgid="194658061510127999">"顯示虛擬鍵盤"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"設定實體鍵盤"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index e732817e0d8e..d130fba07502 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"飛航模式"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"飛航模式為 [開啟]"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"飛航模式為 [關閉]"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"節約耗電量"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"節約耗電量模式已關閉"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"節約耗電量模式已開啟"</string>
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"協助"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"語音小幫手"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"位置"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"存取這台裝置的位置資訊"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取這個裝置的位置資訊嗎?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"該應用程式只有在你使用時,才能存取位置資訊。"</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"要一律允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取這個裝置的位置資訊嗎?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"該應用程式即使在你未使用時,也隨時可以存取位置資訊。"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日曆"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"存取你的日曆"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的日曆嗎?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"這個應用程式可在手機上新增、移除或變更日曆活動。提醒你,這個應用程式可能會以日曆擁有者的名義傳送訊息,或是在不通知日曆擁有者的情況下變更活動內容。"</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"接收額外的位置提供者指令"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"允許應用程式存取額外位置資訊提供者指令。這項設定可能會造成應用程式干擾 GPS 或其他位置資訊來源的運作。"</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"存取精確位置 (以 GPS 和網路為依據)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"這個應用程式可根據 GPS 或網路位置來源 (例如基地台和 Wi-Fi 網路) 取得你的位置資訊。你必須在手機上開啟這類定位服務,才能讓這個應用程式取得位置資訊。不過這可能會增加耗電量。"</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"僅可在前景中取得精確位置"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"這個應用程式只能在前景中取得你的確切位置。你必須在手機上開啟這些定位服務,才能讓這個應用程式取得確切位置。請注意,這麼做可能會增加耗電量。"</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"存取概略位置 (以網路為依據)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"這個應用程式可根據網路來源 (例如基地台和 Wi-Fi 網路) 取得你的位置資訊。你必須在平板電腦上開啟這類定位服務,才能讓這個應用程式取得位置資訊。"</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"這個應用程式可根據網路來源 (例如基地台和 Wi-Fi 網路) 取得你的位置資訊。你必須在電視上開啟這類定位服務,才能讓這個應用程式取得位置資訊。"</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"這個應用程式可根據網路來源 (例如基地台和 Wi-Fi 網路) 取得你的位置資訊。你必須在手機上開啟這類定位服務,才能讓這個應用程式取得位置資訊。"</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"在背景中取得精確位置"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"這個應用程式可在背景中隨時取得你的確切位置。你必須在手機上開啟這些定位服務,才能讓這個應用程式取得確切位置。請注意,這麼做可能會增加耗電量。"</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"變更音訊設定"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"允許應用程式修改全域音訊設定,例如音量和用來輸出的喇叭。"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"錄製音訊"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋圖示"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"管理臉孔驗證硬體"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"允許應用程式呼叫方法來新增及移除可用的臉孔範本。"</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用臉孔驗證硬體"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允許應用程式使用臉孔驗證硬體進行驗證"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"無法識別臉孔,請再試一次。"</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"臉孔過亮。請移至光線適中的場所,然後再試一次。"</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"臉孔過暗。請增添光源,然後再試一次。"</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"請將感應器移到距離臉孔較遠處。"</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"請將感應器靠近臉孔。"</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"請將感應器往上移動。"</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"請將感應器往下移動。"</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"請將感應器往右移動。"</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"請將感應器往左移動。"</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"請直視感應器。"</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"未偵測到任何臉孔。"</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"請將臉孔保持在裝置前方。"</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"無法使用臉部辨識硬體。"</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"臉孔處理作業逾時,請再試一次。"</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"無法儲存臉孔。"</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"臉孔處理作業已取消。"</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"嘗試次數過多,臉孔驗證功能已停用。"</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"請再試一次。"</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"未登錄任何臉孔。"</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"這個裝置沒有臉孔驗證感應器"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"臉孔圖示"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"讀取同步處理設定"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"允許應用程式讀取帳戶的同步處理設定,例如判斷「使用者」應用程式是否和某個帳戶進行同步處理。"</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"開啟及關閉同步功能"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"Wi-Fi 沒有網際網路連線"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"輕觸即可查看選項"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"無線基地台設定變更"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"你的無線基地台頻帶已變更。"</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"這個裝置不支援你的偏好設定 (僅限 5GHz),而是會在 5GHz 可用時使用該頻帶。"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"已切換至<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"裝置會在無法連上「<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>」時切換至「<xliff:g id="NEW_NETWORK">%1$s</xliff:g>」(可能需要支付相關費用)。"</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"已從 <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> 切換至<xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"你的管理員要求你提供錯誤報告,以便排解這個裝置發生的問題。報告可能會揭露裝置中的應用程式和相關資料。"</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"分享"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"拒絕"</string>
- <string name="select_input_method" msgid="8547250819326693584">"變更鍵盤"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"選擇輸入法"</string>
<string name="show_ime" msgid="2506087537466597099">"連接實體鍵盤時保持顯示"</string>
<string name="hardware" msgid="194658061510127999">"顯示虛擬鍵盤"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"設定實體鍵盤"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 44b96f4a58cf..fed482486191 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -236,9 +236,6 @@
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Imodi yendiza"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Imodi yendiza IVULIWE"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Imodi yendiza IVALIWE"</string>
- <string name="global_action_toggle_battery_saver" msgid="708515500418994208">"Isilondolozi sebhethri"</string>
- <string name="global_action_battery_saver_on_status" msgid="484059130698197787">"Iseva yebhethri SIVALIWE"</string>
- <string name="global_action_battery_saver_off_status" msgid="75550964969478405">"Isilondolozi sebhethri SIVULIWE"</string>
<string name="global_action_settings" msgid="1756531602592545966">"Izilungiselelo"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Siza"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Isisekeli sezwi"</string>
@@ -276,6 +273,9 @@
<string name="permgrouplab_location" msgid="7275582855722310164">"Indawo"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"finyelela kundawo yale divayisi"</string>
<string name="permgrouprequest_location" msgid="3788275734953323491">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi ingene kundawo yale divayisi?"</string>
+ <string name="permgrouprequestdetail_location" msgid="1113400215566814664">"Uhlelo lokusebenza luzoba nokufinyelela kundawo kuphela uma usebenzisa uhlelo lokusebenza."</string>
+ <string name="permgroupbackgroundrequest_location" msgid="8461841153030844390">"Hlala uvumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi ifinyelele indawo yale divayisi?"</string>
+ <string name="permgroupbackgroundrequestdetail_location" msgid="1715668276378108654">"Uhlelo lokusebenza luzohlala lunokufinyelela kundawo, nanoma ungasebenzisi uhlelo lokusebenza."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Ikhalenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"finyelela kukhalenda yakho"</string>
<string name="permgrouprequest_calendar" msgid="289900767793189421">"Vumela i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ukuthi ifinyelele kukhalenda yakho?"</string>
@@ -402,12 +402,14 @@
<string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Lolu hlelo lokusebenza lungangeza, lisuse, noma lishintshe imicimbi yekhalenda efonini yakho. Lolu hlelo lokusebenza lingathumela imilayezo engabonakala ivela kusuka kubanikazi bekhalenda, noma lishintshe imicimbi ngaphandle kokwazisa abanikazi."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"finyelela kweminye imiyalo yokunikeza indawo"</string>
<string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Ivumela uhlelo lokusebenza ukufinyelela imiyalo eyengeziwe yabahlinzeki bendawo. Lokhu kungase kuvumele uhlelo lokusebenza ukuthi liphazamisane nomsebenzi we-GPS noma eminye imithombo yendawo."</string>
- <string name="permlab_accessFineLocation" msgid="251034415460950944">"finyelela indawo enembile (i-GPS nesuselwa kunethiwekhi)"</string>
- <string name="permdesc_accessFineLocation" msgid="5821994817969957884">"Lolu hlelo lokusebenza lungathola indawo yakho ngokususelwe ku-GPS noma imithombo yenethiwekhi njengamathawa eseli namanethiwekhi e-Wi-Fi. Lawa masevisi endawo kufanele avulwe futhi atholakale efonini yakho ukuze uhlelo lokusebenza lukwazi ukuwasebenzisa. Lokhu kungakhulisa ukusetshenziswa kwebhethri."</string>
+ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"finyelela indawo eqondile kuphela phambili"</string>
+ <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Lolu hlelo lokusebenza lungakutholela indawo eqondile kuphela uma liphambili. Lawa masevisi endawo kufanele avulwe futhi atholakale efonini yakho ukuze uhlelo lokusebenza lukwazi ukuwasebenzisa. Lokhu kungakhulisa ukusebenza kwebhethri."</string>
<string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"finyelela kundawo elinganiselwe (esuselwa kunethiwekhi)"</string>
<string name="permdesc_accessCoarseLocation" product="tablet" msgid="3373266766487862426">"Lolu hlelo lokusebenza lungathola indawo yakho ngokususelwe kumithombo yenethiwekhi njengamathawa eseli namanethiwekhi e-Wi-Fi. Lawa masevisi endawo kufanele avulwe futhi atholakale kuthebhulethi yakho ukuze uhlelo lokusebenza lukwazi ukuwasebenzisa."</string>
<string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"Lolu hlelo lokusebenza lingathola indawo yakho ngokususelwe kumithombo yenethiwekhi njengamathawa eseli namanethiwekhi e-Wi-Fi. Lawa masevisi endawo kufanele avulwe futhi atholakale ku-TV yakho ukuze uhlelo lokusebenza lukwazi ukuwasebenzisa."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"Lolu hlelo lokusebenza lungathola indawo yakho ngokususelwe kumithombo yenethiwekhi njengamathawa eseli kanye namanethiwekhi e-Wi-Fi. Lawa masevisi endawo kufanele avulwe futhi atholakale efonini yakho ukuze uhlelo lokusebenza likwazi ukuwasebenzisa."</string>
+ <string name="permlab_accessBackgroundLocation" msgid="5742466381902568536">"finyelela indawo eqondile emuva"</string>
+ <string name="permdesc_accessBackgroundLocation" msgid="6371533283380774135">"Lolu hlelo lokusebenza lungakutholela indawo eqondile noma kunini lusemuva. Lawa masevisi endawo kufanele avulwe futhi atholakale efonini yakho ukuze uhlelo lokusebenza lukwazi ukuwasebenzisa. Lokhu kungakhulisa ukusebenza kwebhethri."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"shintsha izilungiselelo zakho zomsindo"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Ivumela uhlelo lokusebenza ukushintsha izilungiselelo zomsindo we-global njengevolomu nokuthi isiphi isipika esisetshenziselwa okukhiphayo."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"qopha umsindo"</string>
@@ -515,6 +517,37 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Isithonjana sezigxivizo zeminwe"</string>
+ <string name="permlab_manageFace" msgid="2137540986007309781">"phatha izingxenyekazi zekhompuyutha zokufakazela ubuqiniso zobuso"</string>
+ <string name="permdesc_manageFace" msgid="8919637120670185330">"Ivumela uhlelo lokusebenza ukuthi luhoxise izindlela zokungeza nokususa amathempulethi obuso azosetshenziswa."</string>
+ <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"sebenzisa izingxenyekazi zekhompuyutha zokufakazela ubuqiniso kobuso"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Ivumela uhlelo lokusebenza ukuthi lusebenzise ukufakazela ubuqiniso bobuso bezingxenyekazi ukuze kufakazelwe ubuqiniso"</string>
+ <string name="face_acquired_insufficient" msgid="5901287247766106330">"Ayikwazanga ukucubungula ubuso. Sicela uzame futhi."</string>
+ <string name="face_acquired_too_bright" msgid="610606792381297174">"Ubuso bukhanya kakhulu. Sicela uzame ekukhanyeni okuncane."</string>
+ <string name="face_acquired_too_dark" msgid="7229162716976778371">"Ubuso bumnyama kakhulu. Sicela uvule umthombo wokukhanya."</string>
+ <string name="face_acquired_too_close" msgid="1980310037427755293">"Sicela uhambise inzwa kude kunobuso."</string>
+ <string name="face_acquired_too_far" msgid="4494571381828850007">"Sicela ulethe inzwa eduze kobuso."</string>
+ <string name="face_acquired_too_high" msgid="228411096134808372">"Sicela uhambise inzwa phezulu."</string>
+ <string name="face_acquired_too_low" msgid="4539774649296349109">"Sicela uhambise inzwa ngezansi."</string>
+ <string name="face_acquired_too_right" msgid="1650292067226118760">"Sicela uhambise inzwa ngakwesokudla."</string>
+ <string name="face_acquired_too_left" msgid="2712489669456176505">"Sicela uhambise inzwa ngakwesokunxele."</string>
+ <string name="face_acquired_poor_gaze" msgid="8344973502980415859">"Sicela ubheke kunzwa."</string>
+ <string name="face_acquired_not_detected" msgid="5707782294589511391">"Abukho ubuso obutholiwe."</string>
+ <string name="face_acquired_not_steady" msgid="3722829465011040042">"Gcina ubuso bumile ngaphambi kwedivayisi."</string>
+ <string-array name="face_acquired_vendor">
+ </string-array>
+ <string name="face_error_hw_not_available" msgid="6255891785768984615">"Izingxenyekazi zekhompuyutha zobuso azitholakali."</string>
+ <string name="face_error_timeout" msgid="4014326147867150054">"Kufinyelelwe kusikhathi sokuvala sobuso. Zama futhi."</string>
+ <string name="face_error_no_space" msgid="8224993703466381314">"Ubuso abukwazi ukugcinwa."</string>
+ <string name="face_error_canceled" msgid="283945501061931023">"Umsebenzi wobuso ukhanselwe."</string>
+ <string name="face_error_lockout" msgid="3407426963155388504">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string>
+ <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Imizamo eminingi kakhulu. Ukufakazela ubuqiniso kobuso kukhutshaziwe."</string>
+ <string name="face_error_unable_to_process" msgid="238761109287767270">"Zama futhi."</string>
+ <string name="face_error_not_enrolled" msgid="9166792142679691323">"Abukho ubuso obubhalisiwe."</string>
+ <string name="face_error_hw_not_present" msgid="4737289254517095671">"Le divayisi ayinayo inzwa yokufakazela ubuqiniso yobuso"</string>
+ <string name="face_name_template" msgid="7004562145809595384">"Ubuso be-<xliff:g id="FACEID">%d</xliff:g>"</string>
+ <string-array name="face_error_vendor">
+ </string-array>
+ <string name="face_icon_content_description" msgid="4024817159806482191">"Isithonjana sobuso"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"funda izilungiselelo zokuvumelanisa"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Ivumela uhlelo lokusebenza ukufunda izilungiselelo zokuvumelanisa ze-akhawunti. Isibonelo, lokhu kungacacisa ukuthi noma ngabe uhlelo lokusebenza le-People livumelanisiwe ne-akhawunti."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"shintsha phakathi kokuvula kanye nokucisha ukuvumelanisa"</string>
@@ -1175,6 +1208,9 @@
<skip />
<string name="wifi_no_internet" msgid="8938267198124654938">"I-Wi-Fi ayinakho ukufinyelela kwe-inthanethi"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Thepha ukuze uthole izinketho"</string>
+ <string name="wifi_softap_config_change" msgid="8475911871165857607">"Ushintsho kuzilungiselelo zakho ze-hotspot"</string>
+ <string name="wifi_softap_config_change_summary" msgid="7601233252456548891">"Ibhendi yakho ye-hotspot ishintshile."</string>
+ <string name="wifi_softap_config_change_detailed" msgid="8022936822860678033">"Le divayisi ayisekeli okuncamelayo kwe-5GHz kuphela. Kunalokho, le divayisi izosebenzisa ibhendi ye-5GHz uma itholakala."</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Kushintshelwe ku-<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
<string name="network_switch_metered_detail" msgid="775163331794506615">"Idivayisi isebenzisa i-<xliff:g id="NEW_NETWORK">%1$s</xliff:g> uma i-<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> inganakho ukufinyelela kwe-inthanethi. Kungasebenza izindleko."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Kushintshelewe kusuka ku-<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> kuya ku-<xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
@@ -1262,7 +1298,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"Umlawuli wakho ucele umbiko wesiphazamisi ukuze kusizwe ukuxazulula inkinga yale divayisi. Izinhlelo zokusebenza nedatha ingabiwa."</string>
<string name="share_remote_bugreport_action" msgid="6249476773913384948">"YABELANA"</string>
<string name="decline_remote_bugreport_action" msgid="6230987241608770062">"YENQABA"</string>
- <string name="select_input_method" msgid="8547250819326693584">"Shintsha ikhibhodi"</string>
+ <string name="select_input_method" msgid="4653387336791222978">"Khetha indlela yokufaka"</string>
<string name="show_ime" msgid="2506087537466597099">"Yigcine kusikrini ngenkathi kusebenza ikhibhodi ephathekayo"</string>
<string name="hardware" msgid="194658061510127999">"Bonisa ikhibhodi ebonakalayo"</string>
<string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Lungisa ikhibhodi yoqobo"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 21c10ce89c1a..44eea30cf09f 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -339,13 +339,13 @@
then in code manually set your window's background to
null so it will not be drawn.
</ul> -->
- <attr name="windowBackground" format="reference" />
+ <attr name="windowBackground" format="reference|color" />
<!-- Drawable to draw selectively within the inset areas when the windowBackground
has been set to null. This protects against seeing visual garbage in the
surface when the app has not drawn any content into this area. One example is
when the user is resizing a window of an activity that has
{@link android.R.attr#resizeableActivity} set for multi-window mode. -->
- <attr name="windowBackgroundFallback" format="reference" />
+ <attr name="windowBackgroundFallback" format="reference|color" />
<!-- Drawable to use as a frame around the window. -->
<attr name="windowFrame" format="reference" />
<!-- Flag indicating whether there should be no title on this window. -->
@@ -1477,7 +1477,7 @@
used for, typically, account ID or password input. It is expected that IMEs
normally are able to input ASCII even without being told so (such IMEs
already respect this flag in a sense), but there could be some cases they
- aren't when, for instance, only non-ASCII input languagaes like Arabic,
+ aren't when, for instance, only non-ASCII input languages like Arabic,
Greek, Hebrew, Russian are enabled in the IME. Applications need to be
aware that the flag is not a guarantee, and not all IMEs will respect it.
However, it is strongly recommended for IME authors to respect this flag
@@ -3161,7 +3161,7 @@
enabled by a ViewGroup for all its children in specific situations (for
instance during a scrolling.) This property lets you persist the cache
in memory after its initial usage. Persisting the cache consumes more
- memory but may prevent frequent garbage collection is the cache is created
+ memory but may prevent frequent garbage collection if the cache is created
over and over again. By default the persistence is set to scrolling.
Deprecated: The view drawing cache was largely made obsolete with the introduction of
hardware-accelerated rendering in API 11. -->
@@ -3419,10 +3419,16 @@
constructor or 0. Arrays.hashCode(new Object[] {locale, mode, extraValue,
isAuxiliary, overridesImplicitlyEnabledSubtype}) will be used instead. -->
<attr name="subtypeId" format="integer"/>
- <!-- Set to true if this subtype is ASCII capable. If the subtype is ASCII
+ <!-- Set to {@code true} if this subtype is ASCII capable. If the subtype is ASCII
capable, it should guarantee that the user can input ASCII characters with
this subtype. This is important because many password fields only allow
- ASCII-characters. -->
+ ASCII-characters.
+
+ <p>Note: In order to avoid some known system issues on
+ {@link android.os.Build.VERSION_CODES#P} and prior OSes, you may want to include
+ {@code "AsciiCapable"} in
+ {@link android.R.styleable#InputMethod_Subtype_imeSubtypeExtraValue} when you specify
+ {@code true} to this attribute.-->
<attr name="isAsciiCapable" format="boolean" />
<!-- The BCP-47 Language Tag of the subtype. This replaces
{@link android.R.styleable#InputMethod_Subtype_imeSubtypeLocale}. -->
@@ -5728,17 +5734,13 @@
<!-- When a tint color is set, specifies its Porter-Duff blending mode. The
default value is src_in, which treats the drawable as an alpha mask. -->
<attr name="tintMode" />
- <!-- Left optical inset.
- @hide Until optical insets are fully supported. -->
+ <!-- Left optical inset. -->
<attr name="opticalInsetLeft" />
- <!-- Top optical inset.
- @hide Until optical insets are fully supported. -->
+ <!-- Top optical inset. -->
<attr name="opticalInsetTop" />
- <!-- Right optical inset.
- @hide Until optical insets are fully supported. -->
+ <!-- Right optical inset. -->
<attr name="opticalInsetRight" />
- <!-- Bottom optical inset.
- @hide Until optical insets are fully supported. -->
+ <!-- Bottom optical inset. -->
<attr name="opticalInsetBottom" />
</declare-styleable>
@@ -6237,17 +6239,13 @@
<!-- The opacity of the whole vector drawable, as a value between 0
(completely transparent) and 1 (completely opaque). -->
<attr name="alpha" />
- <!-- Left optical inset.
- @hide Until optical insets are fully supported. -->
+ <!-- Left optical inset. -->
<attr name="opticalInsetLeft" format="dimension" />
- <!-- Top optical inset.
- @hide Until optical insets are fully supported. -->
+ <!-- Top optical inset. -->
<attr name="opticalInsetTop" format="dimension" />
- <!-- Right optical inset.
- @hide Until optical insets are fully supported. -->
+ <!-- Right optical inset. -->
<attr name="opticalInsetRight" format="dimension" />
- <!-- Bottom optical inset.
- @hide Until optical insets are fully supported. -->
+ <!-- Bottom optical inset. -->
<attr name="opticalInsetBottom" format="dimension" />
</declare-styleable>
@@ -8856,7 +8854,7 @@
<attr name="fontWeight" format="integer" />
<!-- The index of the font in the ttc (TrueType Collection) font file. If the font file
referenced is not in the ttc format, this attribute needs not be specified.
- {@see android.graphics.Typeface#Builder.setTtcIndex(int)}.
+ {@link android.graphics.Typeface.Builder#setTtcIndex(int)}.
The default value is 0. More details about the TrueType Collection font format can be found
here: https://en.wikipedia.org/wiki/TrueType#TrueType_Collection. -->
<attr name="ttcIndex" format="integer" />
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index c4fa190b228d..4c96c1bf38a7 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -1580,6 +1580,7 @@
<attr name="banner" />
<attr name="logo" />
<attr name="permissionGroup" />
+ <attr name="backgroundPermission" />
<attr name="description" />
<attr name="request" />
<attr name="protectionLevel" />
@@ -1610,6 +1611,9 @@
<attr name="logo" />
<attr name="description" />
<attr name="request" />
+ <attr name="requestDetail" />
+ <attr name="backgroundRequest" />
+ <attr name="backgroundRequestDetail" />
<attr name="permissionGroupFlags" />
<attr name="priority" />
</declare-styleable>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index d300b5eeae54..ef6eafd036bf 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -42,13 +42,13 @@
<item><xliff:g id="id">@string/status_bar_phone_evdo_signal</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_phone_signal</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_secure</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_bluetooth</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_managed_profile</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_cast</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_vpn</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_bluetooth</xliff:g></item>
+ <item><xliff:g id="id">@string/status_bar_location</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_mute</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_volume</xliff:g></item>
- <item><xliff:g id="id">@string/status_bar_location</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_zen</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_ethernet</xliff:g></item>
<item><xliff:g id="id">@string/status_bar_wifi</xliff:g></item>
@@ -491,13 +491,21 @@
Note also: the order of this is important. The first upstream type
for which a satisfying network exists is used.
- -->
+ -->
<integer-array translatable="false" name="config_tether_upstream_types">
<item>1</item>
<item>7</item>
<item>0</item>
</integer-array>
+ <!-- When true, the tethering upstream network follows the current default
+ Internet network (except when the current default network is mobile,
+ in which case a DUN network will be used if required).
+
+ When true, overrides the config_tether_upstream_types setting above.
+ -->
+ <bool translatable="false" name="config_tether_upstream_automatic">true</bool>
+
<!-- If the DUN connection for this CDMA device supports more than just DUN -->
<!-- traffic you should list them here. -->
<!-- If this device is not CDMA this is ignored. If this list is empty on -->
@@ -575,12 +583,14 @@
<integer translatable="false" name="config_wifi_framework_min_rx_rate_for_staying_on_network">16</integer>
<!-- Integer parameters of the wifi to cellular handover feature
wifi should not stick to bad networks -->
- <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz">-82</integer>
- <integer translatable="false" name="config_wifi_framework_wifi_score_entry_rssi_threshold_5GHz">-82</integer>
+ <!-- Integer threshold for low network score, should be somewhat less than the entry threshhold -->
+ <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz">-80</integer>
+ <!-- Integer threshold, do not connect to APs with RSSI lower than the entry threshold -->
+ <integer translatable="false" name="config_wifi_framework_wifi_score_entry_rssi_threshold_5GHz">-77</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_low_rssi_threshold_5GHz">-70</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_good_rssi_threshold_5GHz">-57</integer>
- <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz">-85</integer>
- <integer translatable="false" name="config_wifi_framework_wifi_score_entry_rssi_threshold_24GHz">-85</integer>
+ <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz">-83</integer>
+ <integer translatable="false" name="config_wifi_framework_wifi_score_entry_rssi_threshold_24GHz">-80</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_low_rssi_threshold_24GHz">-73</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_good_rssi_threshold_24GHz">-60</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_bad_link_speed_24">6</integer>
@@ -659,9 +669,27 @@
<!-- Boolean indicating that wifi only link configuratios that have exact same credentials (i.e PSK) -->
<bool translatable="false" name="config_wifi_only_link_same_credential_configurations">true</bool>
- <!-- Boolean indicating whether framework needs to set the tx power limit for meeting SAR requirements
- during voice calls -->
- <bool translatable="false" name="config_wifi_framework_enable_voice_call_sar_tx_power_limit">false</bool>
+ <!-- Boolean indicating whether framework needs to set the tx power limit for meeting SAR requirements -->
+ <bool translatable="false" name="config_wifi_framework_enable_sar_tx_power_limit">false</bool>
+
+ <!-- Boolean indicating whether framework needs to use body proximity to set the tx power limit
+ for meeting SAR requirements -->
+ <bool translatable="false" name="config_wifi_framework_enable_body_proximity_sar_tx_power_limit">false</bool>
+
+ <!-- String for the sensor type for body/head proximity for SAR -->
+ <string translatable="false" name="config_wifi_sar_sensor_type"></string>
+
+ <!-- Integer indicating event id by sar sensor for free space -->
+ <integer translatable="false" name="config_wifi_framework_sar_free_space_event_id">1</integer>
+
+ <!-- Integer indicating event id by sar sensor for near hand -->
+ <integer translatable="false" name="config_wifi_framework_sar_near_hand_event_id">2</integer>
+
+ <!-- Integer indicating event id by sar sensor for near head -->
+ <integer translatable="false" name="config_wifi_framework_sar_near_head_event_id">3</integer>
+
+ <!-- Integer indicating event id by sar sensor for near body -->
+ <integer translatable="false" name="config_wifi_framework_sar_near_body_event_id">4</integer>
<!-- Wifi driver supports batched scan -->
<bool translatable="false" name="config_wifi_batched_scan_supported">false</bool>
@@ -2088,6 +2116,10 @@
states. -->
<bool name="config_dozeAlwaysOnDisplayAvailable">false</bool>
+ <!-- Control whether the always on display mode is enabled by default. This value will be used
+ during initialization when the setting is still null. -->
+ <bool name="config_dozeAlwaysOnEnabled">true</bool>
+
<!-- Whether the display blanks itself when transitioning from a doze to a non-doze state -->
<bool name="config_displayBlanksAfterDoze">false</bool>
@@ -2575,6 +2607,7 @@
"silent" = silent mode
"users" = list of users
"restart" = restart device
+ "emergency" = Launch emergency dialer
"lockdown" = Lock down device until the user authenticates
"logout" = Logout the current user
-->
@@ -2585,6 +2618,7 @@
<item>logout</item>
<item>bugreport</item>
<item>screenshot</item>
+ <item>emergency</item>
</string-array>
<!-- Number of milliseconds to hold a wake lock to ensure that drawing is fully
@@ -2887,6 +2921,9 @@
<!-- Keyguard component -->
<string name="config_keyguardComponent" translatable="false">com.android.systemui/com.android.systemui.keyguard.KeyguardService</string>
+ <!-- Limit for the number of face templates per user -->
+ <integer name="config_faceMaxTemplatesPerUser">1</integer>
+
<!-- For performance and storage reasons, limit the number of fingerprints per user -->
<integer name="config_fingerprintMaxTemplatesPerUser">5</integer>
@@ -2937,6 +2974,14 @@
-->
<string translatable="false" name="config_mainBuiltInDisplayCutout"></string>
+ <!-- Like config_mainBuiltInDisplayCutout, but this path is used to report the
+ one single bounding rect per device edge to the app via
+ {@link DisplayCutout#getBoundingRect}. Note that this path should try to match the visual
+ appearance of the cutout as much as possible, and may be smaller than
+ config_mainBuiltInDisplayCutout
+ -->
+ <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@string/config_mainBuiltInDisplayCutout</string>
+
<!-- Whether the display cutout region of the main built-in display should be forced to
black in software (to avoid aliasing or emulate a cutout that is not physically existent).
-->
@@ -3143,6 +3188,9 @@
<!-- True if camera app should be pinned via Pinner Service -->
<bool name="config_pinnerCameraApp">false</bool>
+ <!-- True if home app should be pinned via Pinner Service -->
+ <bool name="config_pinnerHomeApp">false</bool>
+
<!-- Number of days preloaded file cache should be preserved on a device before it can be
deleted -->
<integer name="config_keepPreloadsMinDays">7</integer>
@@ -3345,6 +3393,9 @@
<!-- URI for in call notification sound -->
<string translatable="false" name="config_inCallNotificationSound">/system/media/audio/ui/InCallNotification.ogg</string>
+ <!-- Default number of notifications from the same app before they are automatically grouped by the OS -->
+ <integer translatable="false" name="config_autoGroupAtCount">4</integer>
+
<!-- The OEM specified sensor type for the lift trigger to launch the camera app. -->
<integer name="config_cameraLiftTriggerSensorType">-1</integer>
<!-- The OEM specified sensor string type for the gesture to launch camera app, this value
@@ -3372,7 +3423,7 @@
<string-array translatable="false" name="config_batteryPackageTypeService"/>
<!-- Flag indicating whether or not to enable night mode detection. -->
- <bool name="config_enableNightMode">false</bool>
+ <bool name="config_enableNightMode">true</bool>
<!-- Flag indicating that the actions buttons for a notification should be tinted with by the
color supplied by the Notification.Builder if present. -->
@@ -3462,6 +3513,16 @@
<!-- Whether or not swipe up gesture's opt-in setting is available on this device -->
<bool name="config_swipe_up_gesture_setting_available">false</bool>
+ <!-- Applications which are disabled unless matching a particular sku -->
+ <string-array name="config_disableApksUnlessMatchedSku_apk_list" translatable="false" />
+ <string-array name="config_disableApkUnlessMatchedSku_skus_list" translatable="false" />
+
+ <!-- Whether or not we should show the option to show battery percentage -->
+ <bool name="config_battery_percentage_setting_available">true</bool>
+
+ <!-- Whether or not battery saver should be "sticky" when manually enabled. -->
+ <bool name="config_batterySaverStickyBehaviourDisabled">false</bool>
+
<!-- List of names that represent dual SoftAp interfaces. -->
<string-array translatable="false" name="config_wifi_dual_sap_interfaces">
</string-array>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 997575fc4743..618997159c80 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2903,6 +2903,10 @@
<eat-comment />
<public-group type="attr" first-id="0x01010587">
+ <public name="opticalInsetLeft" />
+ <public name="opticalInsetTop" />
+ <public name="opticalInsetRight" />
+ <public name="opticalInsetBottom" />
</public-group>
<public-group type="style" first-id="0x010302e2">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 3c5159c89bf6..8847ec86c2f5 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -147,19 +147,19 @@
<!-- Displayed to tell the user that they cannot change the caller ID setting. -->
<string name="CLIRPermanent">You can\'t change the caller ID setting.</string>
- <!-- Notification title to tell the user that data service is blocked by access control. -->
+ <!-- Notification title to tell the user that data service is blocked by access control. [CHAR LIMIT=NOTIF_TITLE] -->
<string name="RestrictedOnDataTitle">No mobile data service</string>
- <!-- Notification title to tell the user that emergency calling is blocked by access control. -->
+ <!-- Notification title to tell the user that emergency calling is blocked by access control. [CHAR LIMIT=NOTIF_TITLE] -->
<string name="RestrictedOnEmergencyTitle">Emergency calling unavailable</string>
- <!-- Notification title to tell the user that normal service is blocked by access control. -->
+ <!-- Notification title to tell the user that normal service is blocked by access control. [CHAR LIMIT=NOTIF_TITLE] -->
<string name="RestrictedOnNormalTitle">No voice service</string>
- <!-- Notification title to tell the user that all emergency and normal voice services are blocked by access control. -->
+ <!-- Notification title to tell the user that all emergency and normal voice services are blocked by access control. [CHAR LIMIT=NOTIF_TITLE] -->
<string name="RestrictedOnAllVoiceTitle">No voice service or emergency calling</string>
- <!-- Notification content to tell the user that voice/data/emergency service is blocked by access control. -->
+ <!-- Notification content to tell the user that voice/data/emergency service is blocked by access control. [CHAR LIMIT=NOTIF_BODY] -->
<string name="RestrictedStateContent">Temporarily turned off by your carrier</string>
- <!-- Notification content to tell the user that voice/data/emergency service is blocked by access control when multiple SIMs are active. -->
+ <!-- Notification content to tell the user that voice/data/emergency service is blocked by access control when multiple SIMs are active. [CHAR LIMIT=NOTIF_BODY] -->
<string name="RestrictedStateContentMsimTemplate">Temporarily turned off by your carrier for SIM <xliff:g id="simNumber" example="1">%d</xliff:g></string>
<!-- Displayed to tell the user that they should switch their network preference. -->
@@ -321,18 +321,18 @@
<!-- Sync notifications --> <skip />
<!-- A notification is shown when there is a sync error. This is the text that will scroll through the notification bar (will be seen by the user as he uses another application). -->
<string name="contentServiceSync">Sync</string>
- <!-- A notification is shown when there is a sync error. This is the title of the notification. It will be seen in the pull-down notification tray. -->
+ <!-- A notification is shown when there is a sync error. This is the title of the notification. It will be seen in the pull-down notification tray. [CHAR LIMIT=NOTIF_TITLE] -->
<string name="contentServiceSyncNotificationTitle">Can\'t sync</string>
- <!-- A notification is shown when there is a sync error. This is the message of the notification. It describes the error, in this case is there were too many deletes. The argument is the type of content, for example Gmail or Calendar. It will be seen in the pull-down notification tray. -->
+ <!-- A notification is shown when there is a sync error. This is the message of the notification. It describes the error, in this case is there were too many deletes. The argument is the type of content, for example Gmail or Calendar. It will be seen in the pull-down notification tray. [CHAR LIMIT=NOTIF_BODY] -->
<string name="contentServiceTooManyDeletesNotificationDesc">Attempted to delete too many <xliff:g id="content_type">%s</xliff:g>.</string>
- <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. -->
+ <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. [CHAR LIMIT=TOAST] -->
<string name="low_memory" product="tablet">Tablet storage is full. Delete some files to free space.</string>
- <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. -->
+ <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. [CHAR LIMIT=TOAST] -->
<string name="low_memory" product="watch">Watch storage is full. Delete some files to free space.</string>
- <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. -->
+ <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. [CHAR LIMIT=TOAST] -->
<string name="low_memory" product="tv">TV storage is full. Delete some files to free space.</string>
- <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. -->
+ <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. [CHAR LIMIT=TOAST] -->
<string name="low_memory" product="default">Phone storage is full. Delete some files to free space.</string>
<!-- SSL CA cert notification --> <skip />
@@ -539,15 +539,6 @@
<!-- status message in phone options dialog for when airplane mode is off -->
<string name="global_actions_airplane_mode_off_status">Airplane mode is OFF</string>
- <!-- label for item that enables battery saver in phone options dialog -->
- <string name="global_action_toggle_battery_saver">Battery saver</string>
-
- <!-- status message in phone options dialog for when battery saver is enabled -->
- <string name="global_action_battery_saver_on_status">Battery saver is OFF</string>
-
- <!-- status message in phone options dialog for when battery saver is disabled -->
- <string name="global_action_battery_saver_off_status">Battery saver is ON</string>
-
<!-- label for item that launches settings in phone options dialog [CHAR LIMIT=15]-->
<string name="global_action_settings">Settings</string>
@@ -671,7 +662,7 @@
<string name="permgrouplab_contacts">Contacts</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_contacts">access your contacts</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_contacts">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access your contacts?</string>
@@ -679,15 +670,22 @@
<string name="permgrouplab_location">Location</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_location">access this device\'s location</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_location">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access this device\'s location?</string>
+ <!-- Subtitle of the message shown to the user when the apps requests permission to use the location only while app is in foreground [CHAR LIMIT=150]-->
+ <string name="permgrouprequestdetail_location">The app will only have access to the location while you\u2019re using the app.</string>
+ <!-- Message shown to the user when the apps requests permission to use the location while app is in foreground and background. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
+ <string name="permgroupbackgroundrequest_location">Always allow
+ &lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access this device\u2019s location?</string>
+ <!-- Subtitle of the message shown to the user when the apps requests permission to use the location while app is in foreground and background [CHAR LIMIT=150] -->
+ <string name="permgroupbackgroundrequestdetail_location">The app will always have access to the location, even when you\u2019re not using the app.</string>
<!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgrouplab_calendar">Calendar</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_calendar">access your calendar</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_calendar">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access your calendar?</string>
@@ -695,7 +693,7 @@
<string name="permgrouplab_sms">SMS</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_sms">send and view SMS messages</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_sms">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to send and view SMS messages?</string>
@@ -703,7 +701,7 @@
<string name="permgrouplab_storage">Storage</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_storage">access photos, media, and files on your device</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_storage">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access photos, media, and files on your device?</string>
@@ -711,7 +709,7 @@
<string name="permgrouplab_microphone">Microphone</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_microphone">record audio</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_microphone">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to record audio?</string>
@@ -719,7 +717,7 @@
<string name="permgrouplab_camera">Camera</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_camera">take pictures and record video</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_camera">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to take pictures and record video?</string>
@@ -727,7 +725,7 @@
<string name="permgrouplab_calllog">Call logs</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_calllog">read and write phone call log</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_calllog">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access your phone call logs?</string>
@@ -735,7 +733,7 @@
<string name="permgrouplab_phone">Phone</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_phone">make and manage phone calls</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_phone">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to make and manage phone calls?</string>
@@ -743,7 +741,7 @@
<string name="permgrouplab_sensors">Body Sensors</string>
<!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permgroupdesc_sensors">access sensor data about your vital signs</string>
- <!-- Message shown to the user when the apps requests permission from this group -->
+ <!-- Message shown to the user when the apps requests permission from this group. If ever possible this should stay below 80 characters (assuming the parameters takes 20 characters). Don't abbreviate until the message reaches 120 characters though. [CHAR LIMIT=120] -->
<string name="permgrouprequest_sensors">Allow
&lt;b><xliff:g id="app_name" example="Gmail">%1$s</xliff:g>&lt;/b> to access sensor data about your vital signs?</string>
@@ -1082,10 +1080,9 @@
with the operation of the GPS or other location sources.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permlab_accessFineLocation">access precise location (GPS and
- network-based)</string>
+ <string name="permlab_accessFineLocation">access precise location only in the foreground</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permdesc_accessFineLocation">This app can get your location based on GPS or network location sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption.</string>
+ <string name="permdesc_accessFineLocation">This app can get your exact location only when it is in the foreground. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_accessCoarseLocation">access approximate location
@@ -1097,7 +1094,12 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_accessCoarseLocation" product="default">This app can get your location based on network sources such as cell towers and Wi-Fi networks. These location services must be turned on and available on your phone for the app to be able to use them.</string>
- <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_accessBackgroundLocation">access precise location in the background</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_accessBackgroundLocation">This app can get your exact location any time it is in the background. These location services must be turned on and available on your phone for the app to be able to use them. This may increase battery consumption.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_modifyAudioSettings">change your audio settings</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_modifyAudioSettings">Allows the app to modify global audio settings such as volume and which speaker is used for output.</string>
@@ -1397,6 +1399,72 @@
<!-- Content description which should be used for the fingerprint icon. -->
<string name="fingerprint_icon_content_description">Fingerprint icon</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=50] -->
+ <string name="permlab_manageFace">manage face authentication hardware</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=90] -->
+ <string name="permdesc_manageFace">Allows the app to invoke methods to add and delete facial templates for use.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=50] -->
+ <string name="permlab_useFaceAuthentication">use face authentication hardware</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=90] -->
+ <string name="permdesc_useFaceAuthentication">Allows the app to use face authentication hardware for authentication</string>
+
+ <!-- Message shown during face acquisition when the face cannot be recognized [CHAR LIMIT=50] -->
+ <string name="face_acquired_insufficient">Couldn\u2019t process face. Please try again.</string>
+ <!-- Message shown during face acquisition when the image is too bright [CHAR LIMIT=50] -->
+ <string name="face_acquired_too_bright">Face is too bright. Please try in lower light.</string>
+ <!-- Message shown during face acquisition when the image is too dark [CHAR LIMIT=50] -->
+ <string name="face_acquired_too_dark">Face is too dark. Please uncover light source.</string>
+ <!-- Message shown during face acquisition when the user is too close to sensor [CHAR LIMIT=50] -->
+ <string name="face_acquired_too_close">Please move sensor farther from face.</string>
+ <!-- Message shown during face acquisition when the user is too far from sensor [CHAR LIMIT=50] -->
+ <string name="face_acquired_too_far">Please bring sensor closer to face.</string>
+ <!-- Message shown during face acquisition when the user is too high relatively to sensor [CHAR LIMIT=50] -->
+ <string name="face_acquired_too_high">Please move sensor higher.</string>
+ <!-- Message shown during face acquisition when the user is too low relatively to sensor [CHAR LIMIT=50] -->
+ <string name="face_acquired_too_low">Please move sensor lower.</string>
+ <!-- Message shown during face acquisition when the user is too right relatively to sensor [CHAR LIMIT=50] -->
+ <string name="face_acquired_too_right">Please move sensor to the right.</string>
+ <!-- Message shown during face acquisition when the user is too left relatively to sensor [CHAR LIMIT=50] -->
+ <string name="face_acquired_too_left">Please move sensor to the left.</string>
+ <!-- Message shown during face acquisition when the user is not front facing the sensor [CHAR LIMIT=50] -->
+ <string name="face_acquired_poor_gaze">Please look at the sensor.</string>
+ <!-- Message shown during face acquisition when the user is not detected [CHAR LIMIT=50] -->
+ <string name="face_acquired_not_detected">No face detected.</string>
+ <!-- Message shown during face acquisition when the face is not kept steady infront of device [CHAR LIMIT=50] -->
+ <string name="face_acquired_not_steady">Keep face steady infront of device.</string>
+ <!-- Array containing custom messages shown during face acquisition from vendor. Vendor is expected to add and translate these strings -->
+ <string-array name="face_acquired_vendor">
+ </string-array>
+
+ <!-- Error message shown when the face hardware can't be accessed. [CHAR LIMIT=50] -->
+ <string name="face_error_hw_not_available">Face hardware not available.</string>
+ <!-- Error message shown when the face hardware timer has expired and the user needs to restart the operation. [CHAR LIMIT=50] -->
+ <string name="face_error_timeout">Face time out reached. Try again.</string>
+ <!-- Error message shown when the face hardware has run out of room for storing faces. [CHAR LIMIT=50] -->
+ <string name="face_error_no_space">Face can\u2019t be stored.</string>
+ <!-- Generic error message shown when the face operation (e.g. enrollment or authentication) is canceled. Generally not shown to the user. [CHAR LIMIT=50] -->
+ <string name="face_error_canceled">Face operation canceled.</string>
+ <!-- Generic error message shown when the face operation fails because too many attempts have been made. [CHAR LIMIT=50] -->
+ <string name="face_error_lockout">Too many attempts. Try again later.</string>
+ <!-- Generic error message shown when the face operation fails because strong authentication is required. [CHAR LIMIT=50] -->
+ <string name="face_error_lockout_permanent">Too many attempts. Facial authentication disabled.</string>
+ <!-- Generic error message shown when the face hardware can't recognize the face. [CHAR LIMIT=50] -->
+ <string name="face_error_unable_to_process">Try again.</string>
+ <!-- Generic error message shown when the user has no enrolled face. [CHAR LIMIT=50] -->
+ <string name="face_error_not_enrolled">No face enrolled.</string>
+ <!-- Generic error message shown when the app requests face authentication on a device without a sensor. [CHAR LIMIT=60] -->
+ <string name="face_error_hw_not_present">This device does not have a face authentication sensor</string>
+
+ <!-- Template to be used to name enrolled faces by default. [CHAR LIMIT=10] -->
+ <string name="face_name_template">Face <xliff:g id="faceId" example="1">%d</xliff:g></string>
+
+ <!-- Array containing custom error messages from vendor. Vendor is expected to add and translate these strings -->
+ <string-array name="face_error_vendor">
+ </string-array>
+
+ <!-- Content description which should be used for the face icon. [CHAR LIMIT=10] -->
+ <string name="face_icon_content_description">Face icon</string>
+
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_readSyncSettings">read sync settings</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -3169,6 +3237,21 @@
<!-- A notification is shown when the user connects to a Wi-Fi network and the system detects that that network has no Internet access. This is the notification's message. -->
<string name="wifi_no_internet_detailed">Tap for options</string>
+ <!-- A notification is shown when the user's softap config has been changed due to underlying
+ hardware restrictions. This is the notifications's title.
+ [CHAR_LIMIT=NONE] -->
+ <string name="wifi_softap_config_change">Changes to your hotspot settings</string>
+
+ <!-- A notification is shown when the user's softap config has been changed due to underlying
+ hardware restrictions. This is the notification's summary message.
+ [CHAR_LIMIT=NONE] -->
+ <string name="wifi_softap_config_change_summary">Your hotspot band has changed.</string>
+
+ <!-- A notification is shown when the user's softap config has been changed due to underlying
+ hardware restrictions. This is the notification's full message.
+ [CHAR_LIMIT=NONE] -->
+ <string name="wifi_softap_config_change_detailed">This device doesn\u2019t support your preference for 5GHz only. Instead, this device will use the 5GHz band when available.</string>
+
<!-- A notification might be shown if the device switches to another network type (e.g., mobile data) because it detects that the network it was using (e.g., Wi-Fi) has lost Internet connectivity. This is the notification's title. %1$s is the network type that the device switched to, e.g., cellular data. It is one of the strings in the network_switch_type_name array. -->
<string name="network_switch_metered">Switched to <xliff:g id="network_type">%1$s</xliff:g></string>
@@ -3362,7 +3445,7 @@
<string name="locale_replacement">""</string>
<!-- Title of the pop-up dialog in which the user switches keyboard, also known as input method. -->
- <string name="select_input_method">Change keyboard</string>
+ <string name="select_input_method">Choose input method</string>
<!-- Summary text of a toggle switch to enable/disable use of the IME while a physical
keyboard is connected -->
<string name="show_ime">Keep it on screen while physical keyboard is active</string>
diff --git a/core/res/res/values/styles_package_installer.xml b/core/res/res/values/styles_package_installer.xml
new file mode 100644
index 000000000000..8bfcc8dcde76
--- /dev/null
+++ b/core/res/res/values/styles_package_installer.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<!-- styles for the permission grant dialog. -->
+<resources>
+ <style name="PermissionGrantDialog">
+ <item name="background">?attr/windowBackground</item>
+ <item name="elevation">?attr/windowElevation</item>
+ <item name="layout_weight">@dimen/permissionGrantDialogWidth</item>
+ </style>
+
+ <style name="PermissionGrantTitleIcon">
+ <item name="layout_width">36dp</item>
+ <item name="layout_height">36dp</item>
+ <item name="tint">?attr/colorAccent</item>
+ <item name="scaleType">fitCenter</item>
+ </style>
+
+ <style name="PermissionGrantTitleMessage"
+ parent="@style/TextAppearance.DeviceDefault">
+ <item name="paddingStart">22dp</item>
+ <item name="textSize">20sp</item>
+ <item name="textColor">?attr/textColorPrimary</item>
+ </style>
+
+ <style name="PermissionGrantIndex"
+ parent="@style/TextAppearance.DeviceDefault">
+ <item name="paddingEnd">12dp</item>
+ <item name="singleLine">true</item>
+ <item name="textColor">?attr/textColorSecondary</item>
+ </style>
+
+ <style name="PermissionGrantDescription">
+ <item name="layout_marginTop">20dp</item>
+ <item name="layout_marginStart">24dp</item>
+ <item name="layout_marginBottom">16dp</item>
+ <item name="layout_marginEnd">24dp</item>
+ </style>
+
+ <style name="PermissionGrantContent">
+ <item name="layout_marginStart">16dp</item>
+ <item name="layout_marginEnd">24dp</item>
+ </style>
+
+ <style name="PermissionGrantRadioGroup">
+ <item name="layout_marginStart">8dp</item>
+ <item name="layout_marginTop">-4dp</item>
+ </style>
+
+ <style name="PermissionGrantRadioButton"
+ parent="@style/Widget.DeviceDefault.CompoundButton.RadioButton">
+ <item name="paddingStart">16dp</item>
+ <item name="paddingTop">8dp</item>
+ <item name="paddingBottom">8dp</item>
+ <item name="textSize">16sp</item>
+ </style>
+
+ <style name="PermissionGrantDetailMessage"
+ parent="@style/TextAppearance.DeviceDefault">
+ <item name="layout_marginStart">8dp</item>
+ <item name="layout_marginBottom">4dp</item>
+ <item name="textColor">?attr/textColorPrimary</item>
+ <item name="textSize">16sp</item>
+ </style>
+
+ <style name="PermissionGrantDetailMessageSpace">
+ <item name="layout_height">8dp</item>
+ </style>
+
+ <style name="PermissionGrantCheckbox"
+ parent="@style/Widget.DeviceDefault.CompoundButton.CheckBox">
+ <item name="paddingStart">16dp</item>
+ <item name="textColor">?attr/textColorSecondary</item>
+ <item name="buttonTint">?attr/textColorSecondary</item>
+ <item name="textSize">16sp</item>
+ </style>
+
+ <style name="PermissionGrantButtonBar">
+ <item name="layout_marginStart">24dp</item>
+ <item name="layout_marginEnd">16dp</item>
+ <item name="layout_marginBottom">4dp</item>
+ </style>
+</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index c2eda9d1f993..4fcd7d44a9e2 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -336,7 +336,13 @@
<java-symbol type="bool" name="config_wifi_framework_enable_associated_network_selection" />
<java-symbol type="bool" name="config_wifi_framework_use_single_radio_chain_scan_results_network_selection" />
<java-symbol type="bool" name="config_wifi_only_link_same_credential_configurations" />
- <java-symbol type="bool" name="config_wifi_framework_enable_voice_call_sar_tx_power_limit" />
+ <java-symbol type="bool" name="config_wifi_framework_enable_sar_tx_power_limit" />
+ <java-symbol type="bool" name="config_wifi_framework_enable_body_proximity_sar_tx_power_limit" />
+ <java-symbol type="string" name="config_wifi_sar_sensor_type" />
+ <java-symbol type="integer" name="config_wifi_framework_sar_free_space_event_id" />
+ <java-symbol type="integer" name="config_wifi_framework_sar_near_hand_event_id" />
+ <java-symbol type="integer" name="config_wifi_framework_sar_near_head_event_id" />
+ <java-symbol type="integer" name="config_wifi_framework_sar_near_body_event_id" />
<java-symbol type="bool" name="config_wifi_enable_disconnection_debounce" />
<java-symbol type="bool" name="config_wifi_revert_country_code_on_cellular_loss" />
<java-symbol type="bool" name="config_wifi_enable_wifi_firmware_debugging" />
@@ -1055,6 +1061,9 @@
<java-symbol type="string" name="network_switch_type_name_unknown" />
<java-symbol type="string" name="wifi_no_internet" />
<java-symbol type="string" name="wifi_no_internet_detailed" />
+ <java-symbol type="string" name="wifi_softap_config_change" />
+ <java-symbol type="string" name="wifi_softap_config_change_summary" />
+ <java-symbol type="string" name="wifi_softap_config_change_detailed" />
<java-symbol type="string" name="wifi_connect_alert_title" />
<java-symbol type="string" name="wifi_connect_alert_message" />
<java-symbol type="string" name="wifi_connect_default_application" />
@@ -1330,7 +1339,6 @@
<java-symbol type="drawable" name="ic_text_dot" />
<java-symbol type="drawable" name="ic_print" />
<java-symbol type="drawable" name="ic_print_error" />
- <java-symbol type="drawable" name="ic_grayedout_printer" />
<java-symbol type="drawable" name="jog_dial_arrow_long_left_green" />
<java-symbol type="drawable" name="jog_dial_arrow_long_right_red" />
<java-symbol type="drawable" name="jog_dial_arrow_short_left_and_right" />
@@ -1767,9 +1775,6 @@
<java-symbol type="string" name="global_action_silent_mode_off_status" />
<java-symbol type="string" name="global_action_silent_mode_on_status" />
<java-symbol type="string" name="global_action_toggle_silent_mode" />
- <java-symbol type="string" name="global_action_battery_saver_off_status" />
- <java-symbol type="string" name="global_action_battery_saver_on_status" />
- <java-symbol type="string" name="global_action_toggle_battery_saver" />
<java-symbol type="string" name="global_action_lockdown" />
<java-symbol type="string" name="global_action_voice_assist" />
<java-symbol type="string" name="global_action_assist" />
@@ -1822,6 +1827,7 @@
<java-symbol type="array" name="config_tether_bluetooth_regexs" />
<java-symbol type="array" name="config_tether_dhcp_range" />
<java-symbol type="array" name="config_tether_upstream_types" />
+ <java-symbol type="bool" name="config_tether_upstream_automatic" />
<java-symbol type="array" name="config_tether_apndata" />
<java-symbol type="array" name="config_tether_usb_regexs" />
<java-symbol type="array" name="config_tether_wifi_regexs" />
@@ -2195,6 +2201,7 @@
<java-symbol type="string" name="ext_media_move_failure_message" />
<java-symbol type="style" name="Animation.RecentApplications" />
<java-symbol type="integer" name="dock_enter_exit_duration" />
+ <java-symbol type="bool" name="config_battery_percentage_setting_available" />
<!-- ImfTest -->
<java-symbol type="layout" name="auto_complete_list" />
@@ -2414,6 +2421,34 @@
<java-symbol type="integer" name="config_fingerprintMaxTemplatesPerUser"/>
<java-symbol type="bool" name="config_fingerprintSupportsGestures"/>
+ <!-- Face authentication messages -->
+ <java-symbol type="string" name="face_error_unable_to_process" />
+ <java-symbol type="string" name="face_error_hw_not_available" />
+ <java-symbol type="string" name="face_error_no_space" />
+ <java-symbol type="string" name="face_error_timeout" />
+ <java-symbol type="array" name="face_error_vendor" />
+ <java-symbol type="string" name="face_error_canceled" />
+ <java-symbol type="string" name="face_error_lockout" />
+ <java-symbol type="string" name="face_error_lockout_permanent" />
+ <java-symbol type="string" name="face_error_not_enrolled" />
+ <java-symbol type="string" name="face_error_hw_not_present" />
+ <java-symbol type="string" name="face_acquired_insufficient" />
+ <java-symbol type="string" name="face_acquired_too_bright" />
+ <java-symbol type="string" name="face_acquired_too_dark" />
+ <java-symbol type="string" name="face_acquired_too_close" />
+ <java-symbol type="string" name="face_acquired_too_far" />
+ <java-symbol type="string" name="face_acquired_too_high" />
+ <java-symbol type="string" name="face_acquired_too_low" />
+ <java-symbol type="string" name="face_acquired_too_right" />
+ <java-symbol type="string" name="face_acquired_too_left" />
+ <java-symbol type="string" name="face_acquired_poor_gaze" />
+ <java-symbol type="string" name="face_acquired_not_detected" />
+ <java-symbol type="array" name="face_acquired_vendor" />
+ <java-symbol type="string" name="face_name_template" />
+
+ <!-- Face config -->
+ <java-symbol type="integer" name="config_faceMaxTemplatesPerUser" />
+
<!-- From various Material changes -->
<java-symbol type="attr" name="titleTextAppearance" />
<java-symbol type="attr" name="subtitleTextAppearance" />
@@ -2889,6 +2924,7 @@
<!-- Pinner Service -->
<java-symbol type="array" name="config_defaultPinnerServiceFiles" />
<java-symbol type="bool" name="config_pinnerCameraApp" />
+ <java-symbol type="bool" name="config_pinnerHomeApp" />
<java-symbol type="string" name="config_doubleTouchGestureEnableFile" />
@@ -3232,7 +3268,9 @@
<java-symbol type="bool" name="config_handleVolumeKeysInWindowManager" />
<java-symbol type="dimen" name="config_inCallNotificationVolume" />
<java-symbol type="string" name="config_inCallNotificationSound" />
+ <java-symbol type="integer" name="config_autoGroupAtCount" />
<java-symbol type="bool" name="config_dozeAlwaysOnDisplayAvailable" />
+ <java-symbol type="bool" name="config_dozeAlwaysOnEnabled" />
<java-symbol type="bool" name="config_displayBlanksAfterDoze" />
<java-symbol type="bool" name="config_displayBrightnessBucketsInDoze" />
<java-symbol type="integer" name="config_storageManagerDaystoRetainDefault" />
@@ -3328,6 +3366,7 @@
<java-symbol type="string" name="global_action_logout" />
<java-symbol type="string" name="config_mainBuiltInDisplayCutout" />
+ <java-symbol type="string" name="config_mainBuiltInDisplayCutoutRectApproximation" />
<java-symbol type="drawable" name="messaging_user" />
<java-symbol type="bool" name="config_fillMainBuiltInDisplayCutout" />
<java-symbol type="drawable" name="ic_logout" />
@@ -3369,6 +3408,7 @@
<java-symbol type="string" name="notification_app_name_settings" />
<java-symbol type="integer" name="config_lowBatteryAutoTriggerDefaultLevel" />
+ <java-symbol type="bool" name="config_batterySaverStickyBehaviourDisabled" />
<!-- For car devices -->
<java-symbol type="string" name="car_loading_profile" />
@@ -3390,6 +3430,12 @@
<java-symbol type="string" name="battery_saver_description_with_learn_more" />
<java-symbol type="bool" name="config_primarycard" />
+
+ <java-symbol type="attr" name="opticalInsetLeft" />
+ <java-symbol type="attr" name="opticalInsetTop" />
+ <java-symbol type="attr" name="opticalInsetRight" />
+ <java-symbol type="attr" name="opticalInsetBottom" />
+
<java-symbol type="drawable" name="ic_lock_lockdown" />
<java-symbol type="drawable" name="ic_arrow_forward" />
<java-symbol type="drawable" name="ic_permission" />
@@ -3400,4 +3446,7 @@
<java-symbol type="integer" name="config_defaultHapticFeedbackIntensity" />
<java-symbol type="integer" name="config_defaultNotificationVibrationIntensity" />
+
+ <java-symbol type="array" name="config_disableApksUnlessMatchedSku_apk_list" />
+ <java-symbol type="array" name="config_disableApkUnlessMatchedSku_skus_list" />
</resources>
diff --git a/core/res/res/values/themes_package_installer.xml b/core/res/res/values/themes_package_installer.xml
new file mode 100644
index 000000000000..a6341dc664ab
--- /dev/null
+++ b/core/res/res/values/themes_package_installer.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<!-- themes for the permission grant dialog. -->
+<resources>
+ <style name="Theme.DeviceDefault.Light.Panel.PermissionGrantApp"
+ parent="@style/Theme.DeviceDefault.Light.Panel">
+ <item name="windowIsFloating">false</item>
+ <item name="windowTranslucentStatus">true</item>
+ <item name="backgroundDimEnabled">true</item>
+ <item name="windowAnimationStyle">@style/Animation.Material.Dialog</item>
+ </style>
+
+ <style name="Theme.DeviceDefault.Light.Dialog.PermissionGrant"
+ parent="@style/Theme.DeviceDefault.Light.Dialog">
+ <item name="titleTextStyle">@style/PermissionGrantTitleMessage</item>
+ <item name="radioButtonStyle">@style/PermissionGrantRadioButton</item>
+ <item name="checkboxStyle">@style/PermissionGrantCheckbox</item>
+ <item name="buttonBarStyle">@style/PermissionGrantButtonBar</item>
+ </style>
+</resources>
diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml
index f5b350b053d4..fb78b3b0533a 100644
--- a/core/res/res/xml/sms_short_codes.xml
+++ b/core/res/res/xml/sms_short_codes.xml
@@ -34,7 +34,7 @@
http://smscoin.net/software/engine/WordPress/Paid+SMS-registration/ -->
<!-- Arab Emirates -->
- <shortcode country="ae" free="3214|1017" />
+ <shortcode country="ae" pattern="\\d{1,5}" free="3214|1017" />
<!-- Albania: 5 digits, known short codes listed -->
<shortcode country="al" pattern="\\d{5}" premium="15191|55[56]00" />
@@ -61,7 +61,7 @@
<shortcode country="bh" pattern="\\d{1,5}" free="81181" />
<!-- Brazil: 1-5 digits (standard system default, not country specific) -->
- <shortcode country="br" pattern="\\d{1,5}" free="6000[012]\\d|876|5500|9963" />
+ <shortcode country="br" pattern="\\d{1,5}" free="6000[012]\\d|876|5500|9963|4141|8000" />
<!-- Belarus: 4 digits -->
<shortcode country="by" pattern="\\d{4}" premium="3336|4161|444[4689]|501[34]|7781" />
@@ -73,14 +73,14 @@
<shortcode country="ch" pattern="[2-9]\\d{2,4}" premium="543|83111|30118" free="98765" />
<!-- Chile: 4-5 digits (not confirmed), known premium codes listed -->
- <shortcode country="cl" pattern="\\d{4,5}" free="9963" />
+ <shortcode country="cl" pattern="\\d{4,5}" free="9963|9240" />
<!-- China: premium shortcodes start with "1066", free shortcodes start with "1065":
http://clients.txtnation.com/entries/197192-china-premium-sms-short-code-requirements -->
<shortcode country="cn" premium="1066.*" free="1065.*" />
<!-- Colombia: 1-6 digits (not confirmed) -->
- <shortcode country="co" pattern="\\d{1,6}" free="890350" />
+ <shortcode country="co" pattern="\\d{1,6}" free="890350|908160" />
<!-- Cyprus: 4-6 digits (not confirmed), known premium codes listed, plus EU -->
<shortcode country="cy" pattern="\\d{4,6}" premium="7510" free="116\\d{3}" />
@@ -104,7 +104,7 @@
<shortcode country="es" premium="[23][57]\\d{3}|280\\d{2}|[79]9[57]\\d{3}" free="116\\d{3}|22791|222145|22189" />
<!-- Finland: 5-6 digits, premium 0600, 0700: http://en.wikipedia.org/wiki/Telephone_numbers_in_Finland -->
- <shortcode country="fi" pattern="\\d{5,6}" premium="0600.*|0700.*|171(?:59|63)" free="116\\d{3}|14789" />
+ <shortcode country="fi" pattern="\\d{5,6}" premium="0600.*|0700.*|171(?:59|63)" free="116\\d{3}|14789|17110" />
<!-- France: 5 digits, free: 3xxxx, premium [4-8]xxxx, plus EU:
http://clients.txtnation.com/entries/161972-france-premium-sms-short-code-requirements,
@@ -126,7 +126,7 @@
<shortcode country="gr" pattern="\\d{5}" premium="54\\d{3}|19[0-5]\\d{2}" free="116\\d{3}|12115" />
<!-- Croatia -->
- <shortcode country="hr" free="13062" />
+ <shortcode country="hr" pattern="\\d{1,5}" free="13062" />
<!-- Hungary: 4 or 10 digits starting with 1 or 0, plus EU:
http://clients.txtnation.com/entries/209633-hungary-premium-sms-short-code-regulations -->
@@ -136,7 +136,7 @@
<shortcode country="in" pattern="\\d{1,5}" free="59336|53969" />
<!-- Indonesia: 1-5 digits (standard system default, not country specific) -->
- <shortcode country="id" pattern="\\d{1,5}" free="99477|6006|46645" />
+ <shortcode country="id" pattern="\\d{1,5}" free="99477|6006|46645|363" />
<!-- Ireland: 5 digits, 5xxxx (50xxx=free, 5[12]xxx=standard), plus EU:
http://www.comreg.ie/_fileupload/publications/ComReg1117.pdf -->
@@ -150,7 +150,7 @@
<shortcode country="it" pattern="\\d{5}" premium="4\\d{4}" free="116\\d{3}|4112503" standard="43\\d{3}" />
<!-- Japan: 8083 used by SOFTBANK_DCB_2 -->
- <shortcode country="jp" free="8083" />
+ <shortcode country="jp" pattern="\\d{1,5}" free="8083" />
<!-- Kenya: 5 digits, known premium codes listed -->
<shortcode country="ke" pattern="\\d{5}" free="21725" />
@@ -165,10 +165,10 @@
<shortcode country="kz" pattern="\\d{4}" premium="335[02]|4161|444[469]|77[2359]0|8444|919[3-5]|968[2-5]" />
<!-- Kuwait: 1-5 digits (standard system default, not country specific) -->
- <shortcode country="kw" pattern="\\d{1,5}" free="1378|50420|94006" />
+ <shortcode country="kw" pattern="\\d{1,5}" free="1378|50420|94006|55991" />
<!-- Lithuania: 3-5 digits, known premium codes listed, plus EU -->
- <shortcode country="lt" pattern="\\d{3,5}" premium="13[89]1|1394|16[34]5" free="116\\d{3}|1399" />
+ <shortcode country="lt" pattern="\\d{3,5}" premium="13[89]1|1394|16[34]5" free="116\\d{3}|1399|1324" />
<!-- Luxembourg: 5 digits, 6xxxx, plus EU:
http://www.luxgsm.lu/assets/files/filepage/file_1253803400.pdf -->
@@ -190,7 +190,7 @@
<shortcode country="nl" pattern="\\d{4}" premium="4466|5040" free="116\\d{3}|2223|6225|2223" />
<!-- Norway: 4-5 digits (not confirmed), known premium codes listed -->
- <shortcode country="no" pattern="\\d{4,5}" premium="2201|222[67]" />
+ <shortcode country="no" pattern="\\d{4,5}" premium="2201|222[67]" free="2171" />
<!-- New Zealand: 3-4 digits, known premium codes listed -->
<shortcode country="nz" pattern="\\d{3,4}" premium="3903|8995|4679" free="3067|3068|4053" />
@@ -199,10 +199,10 @@
<shortcode country="pe" pattern="\\d{4,5}" free="9963" />
<!-- Philippines -->
- <shortcode country="ph" free="2147|5495|5496" />
+ <shortcode country="ph" pattern="\\d{1,5}" free="2147|5495|5496" />
<!-- Pakistan -->
- <shortcode country="pk" free="2057" />
+ <shortcode country="pk" pattern="\\d{1,5}" free="2057" />
<!-- Poland: 4-5 digits (not confirmed), known premium codes listed, plus EU -->
<shortcode country="pl" pattern="\\d{4,5}" premium="74240|79(?:10|866)|92525" free="116\\d{3}|8012|80921" />
@@ -224,7 +224,7 @@
<shortcode country="ru" pattern="\\d{4}" premium="1(?:1[56]1|899)|2(?:09[57]|322|47[46]|880|990)|3[589]33|4161|44(?:4[3-9]|81)|77(?:33|81)|8424" free="6954|8501" standard="2037|2044"/>
<!-- Saudi Arabia -->
- <shortcode country="sa" free="8145" />
+ <shortcode country="sa" pattern="\\d{1,5}" free="8145" />
<!-- Sweden: 5 digits (72xxx), plus EU: http://www.viatel.se/en/premium-sms/ -->
<shortcode country="se" premium="72\\d{3}" free="116\\d{3}" />
@@ -240,13 +240,13 @@
<shortcode country="sk" premium="\\d{4}" free="116\\d{3}|8000" />
<!-- Thailand: 4186001 used by AIS_TH_DCB -->
- <shortcode country="th" free="4186001" />
+ <shortcode country="th" pattern="\\d{1,5}" premium="4\\d{6}" free="4186001" />
<!-- Tajikistan: 4 digits, known premium codes listed -->
<shortcode country="tj" pattern="\\d{4}" premium="11[3-7]1|4161|4333|444[689]" />
<!-- Turkey -->
- <shortcode country="tr" free="7529|5528|6493" />
+ <shortcode country="tr" pattern="\\d{1,5}" free="7529|5528|6493" />
<!-- Ukraine: 4 digits, known premium codes listed -->
<shortcode country="ua" pattern="\\d{4}" premium="444[3-9]|70[579]4|7540" />
diff --git a/media/tests/NativeMidiDemo/jni/Android.mk b/core/tests/HdmiCec/Android.mk
index 69a64bd0218b..450068b18dcb 100644
--- a/media/tests/NativeMidiDemo/jni/Android.mk
+++ b/core/tests/HdmiCec/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2016 The Android Open Source Project
+# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -13,23 +13,18 @@
# limitations under the License.
LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_MODULE := libnativemidi_jni
-LOCAL_SRC_FILES := \
- nativemidi-jni.cpp \
- messagequeue.cpp
-
-LOCAL_CFLAGS += -Wall -Wextra -Werror -O0
+include $(CLEAR_VARS)
-LOCAL_C_INCLUDES += \
- frameworks/base/media/native
+# Include all test java files
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_CXX_STL := libc++_static
+LOCAL_MODULE_TAGS := tests
+LOCAL_PACKAGE_NAME := HdmiCecTests
-LOCAL_SHARED_LIBRARIES := libOpenSLES libmidi
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_CERTIFICATE := platform
+LOCAL_COMPATIBILITY_SUITE := device-tests
-include $(BUILD_SHARED_LIBRARY)
+include $(BUILD_PACKAGE)
diff --git a/core/tests/HdmiCec/AndroidManifest.xml b/core/tests/HdmiCec/AndroidManifest.xml
new file mode 100644
index 000000000000..80129d0d9fba
--- /dev/null
+++ b/core/tests/HdmiCec/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.test.example.helloworld"
+ android:sharedUserId="android.uid.system" >
+ <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="android.test.example.helloworld"
+ android:label="Hello World Test"/>
+</manifest>
diff --git a/core/tests/HdmiCec/AndroidTest.xml b/core/tests/HdmiCec/AndroidTest.xml
new file mode 100644
index 000000000000..5af30fbd92ed
--- /dev/null
+++ b/core/tests/HdmiCec/AndroidTest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs sample instrumentation test.">
+ <option name="test-suite-tag" value="apct"/>
+ <option name="test-suite-tag" value="apct-instrumentation"/>
+ <target_preparer class="com.android.tradefed.targetprep.TestFilePushSetup"/>
+ <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-file-name" value="HelloWorldTests.apk"/>
+ </target_preparer>
+ <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"/>
+ <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"/>
+ <option name="test-suite-tag" value="apct"/>
+ <option name="test-tag" value="SampleInstrumentationTest"/>
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+ <option name="package" value="android.test.example.helloworld"/>
+ <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+ </test>
+</configuration>
diff --git a/core/tests/HdmiCec/HelloWorldTests_HalloWelt.config b/core/tests/HdmiCec/HelloWorldTests_HalloWelt.config
new file mode 100644
index 000000000000..902699beafe1
--- /dev/null
+++ b/core/tests/HdmiCec/HelloWorldTests_HalloWelt.config
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="Runs only the HalloWelt test.">
+ <target_preparer class="com.android.tradefed.targetprep.TestFilePushSetup" />
+ <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-file-name" value="HelloWorldTests.apk" />
+ </target_preparer>
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-tag" value="SampleInstrumentationTest" />
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="android.test.example.helloworld" />
+ <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+ <option name="class" value="android.test.example.helloworld.HelloWorldTest" />
+ <option name="method" value="testHalloWelt" />
+ </test>
+</configuration>
diff --git a/core/tests/HdmiCec/OWNERS b/core/tests/HdmiCec/OWNERS
new file mode 100644
index 000000000000..cc016f1cb565
--- /dev/null
+++ b/core/tests/HdmiCec/OWNERS
@@ -0,0 +1,3 @@
+amyjojo@google.com
+nchalko@google.com
+shubang@google.com \ No newline at end of file
diff --git a/core/tests/HdmiCec/src/android/test/example/helloworld/HelloWorldTest.java b/core/tests/HdmiCec/src/android/test/example/helloworld/HelloWorldTest.java
new file mode 100644
index 000000000000..09321adfa2cb
--- /dev/null
+++ b/core/tests/HdmiCec/src/android/test/example/helloworld/HelloWorldTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.test.example.helloworld;
+
+import android.support.test.filters.SmallTest;
+import android.util.Log;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class HelloWorldTest {
+ private static final String TAG = HelloWorldTest.class.getSimpleName();
+
+ @BeforeClass
+ public static void beforeClass() {
+ Log.d(TAG, "beforeClass()");
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ Log.d(TAG, "afterClass()");
+ }
+
+ @Before
+ public void before() {
+ Log.d(TAG, "before()");
+ }
+
+ @After
+ public void after() {
+ Log.d(TAG, "after()");
+ }
+
+ @Test
+ @SmallTest
+ public void testHelloWorld() {
+ Log.d(TAG, "testHelloWorld()");
+ Assert.assertNotEquals("Hello", "world");
+ }
+
+ @Test
+ @SmallTest
+ public void testHalloWelt() {
+ Log.d(TAG, "testHalloWelt()");
+ Assert.assertNotEquals("Hallo", "Welt");
+ }
+}
diff --git a/core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java b/core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java
index 5989da7af655..c70fc3cce43c 100644
--- a/core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java
+++ b/core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java
@@ -54,7 +54,7 @@ public class FileUtilsBenchmark {
for (int i = 0; i < reps; i++) {
try (FileInputStream in = new FileInputStream(mSrc);
FileOutputStream out = new FileOutputStream(mDest)) {
- copyInternalUserspace(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE);
+ copyInternalUserspace(in.getFD(), out.getFD(), Long.MAX_VALUE, null, null, null);
}
}
}
@@ -63,7 +63,7 @@ public class FileUtilsBenchmark {
for (int i = 0; i < reps; i++) {
try (FileInputStream in = new FileInputStream(mSrc);
FileOutputStream out = new FileOutputStream(mDest)) {
- copyInternalSendfile(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE);
+ copyInternalSendfile(in.getFD(), out.getFD(), Long.MAX_VALUE, null, null, null);
}
}
}
@@ -72,7 +72,7 @@ public class FileUtilsBenchmark {
for (int i = 0; i < reps; i++) {
try (MemoryPipe in = MemoryPipe.createSource(mData);
FileOutputStream out = new FileOutputStream(mDest)) {
- copyInternalUserspace(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE);
+ copyInternalUserspace(in.getFD(), out.getFD(), Long.MAX_VALUE, null, null, null);
}
}
}
@@ -81,7 +81,7 @@ public class FileUtilsBenchmark {
for (int i = 0; i < reps; i++) {
try (MemoryPipe in = MemoryPipe.createSource(mData);
FileOutputStream out = new FileOutputStream(mDest)) {
- copyInternalSplice(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE);
+ copyInternalSplice(in.getFD(), out.getFD(), Long.MAX_VALUE, null, null, null);
}
}
}
@@ -90,7 +90,7 @@ public class FileUtilsBenchmark {
for (int i = 0; i < reps; i++) {
try (FileInputStream in = new FileInputStream(mSrc);
MemoryPipe out = MemoryPipe.createSink(mData)) {
- copyInternalUserspace(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE);
+ copyInternalUserspace(in.getFD(), out.getFD(), Long.MAX_VALUE, null, null, null);
}
}
}
@@ -99,7 +99,7 @@ public class FileUtilsBenchmark {
for (int i = 0; i < reps; i++) {
try (FileInputStream in = new FileInputStream(mSrc);
MemoryPipe out = MemoryPipe.createSink(mData)) {
- copyInternalSplice(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE);
+ copyInternalSplice(in.getFD(), out.getFD(), Long.MAX_VALUE, null, null, null);
}
}
}
diff --git a/core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java b/core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java
index ada03666b7ba..b906d84adf52 100644
--- a/core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java
+++ b/core/tests/bluetoothtests/src/android/bluetooth/BluetoothTestUtils.java
@@ -446,7 +446,10 @@ public class BluetoothTestUtils extends Assert {
final IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
mContext.registerReceiver(receiver, filter);
- assertTrue(adapter.enable());
+ // Note: for Wear Local Edition builds, which have Permission Review Mode enabled to
+ // obey China CMIIT, BluetoothAdapter may not startup immediately on methods enable/disable.
+ // So no assertion applied here.
+ adapter.enable();
boolean success = false;
try {
success = completionSemaphore.tryAcquire(ENABLE_DISABLE_TIMEOUT, TimeUnit.MILLISECONDS);
@@ -489,7 +492,10 @@ public class BluetoothTestUtils extends Assert {
final IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
mContext.registerReceiver(receiver, filter);
- assertTrue(adapter.disable());
+ // Note: for Wear Local Edition builds, which have Permission Review Mode enabled to
+ // obey China CMIIT, BluetoothAdapter may not startup immediately on methods enable/disable.
+ // So no assertion applied here.
+ adapter.disable();
boolean success = false;
try {
success = completionSemaphore.tryAcquire(ENABLE_DISABLE_TIMEOUT, TimeUnit.MILLISECONDS);
diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk
index 2d25c7811b40..e0d53933b33b 100644
--- a/core/tests/coretests/Android.mk
+++ b/core/tests/coretests/Android.mk
@@ -65,6 +65,13 @@ LOCAL_CERTIFICATE := platform
FrameworkCoreTests_intermediates := $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/test_apks/res
LOCAL_RESOURCE_DIR := $(FrameworkCoreTests_intermediates) $(LOCAL_PATH)/res
+# Disable AAPT2 because the hacks below depend on the AAPT rules implementation
+LOCAL_USE_AAPT2 := false
+# When AAPT2 is enabled it will need --warn-manifest-validation to fix:
+# frameworks/base/core/tests/coretests/AndroidManifest.xml:26: error: unknown element <meta-data> found.
+# TODO(b/79755007): Remove when AAPT2 recognizes the manifest elements.
+# LOCAL_AAPT_FLAGS += --warn-manifest-validation
+
include $(BUILD_PACKAGE)
# Rules to copy all the test apks to the intermediate raw resource directory
FrameworkCoreTests_all_apks_res := $(addprefix $(FrameworkCoreTests_intermediates)/raw/, \
diff --git a/core/tests/coretests/apks/install_jni_lib/Android.bp b/core/tests/coretests/apks/install_jni_lib/Android.bp
new file mode 100644
index 000000000000..c1a6bd0b3d21
--- /dev/null
+++ b/core/tests/coretests/apks/install_jni_lib/Android.bp
@@ -0,0 +1,26 @@
+// Copyright (C) 2012 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.
+
+cc_test_library {
+ name: "libframeworks_coretests_jni",
+
+ srcs: ["com_android_frameworks_coretests_JNITest.cpp"],
+
+ sdk_version: "16",
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+}
diff --git a/core/tests/coretests/apks/install_jni_lib/Android.mk b/core/tests/coretests/apks/install_jni_lib/Android.mk
deleted file mode 100644
index d7b38e844b5e..000000000000
--- a/core/tests/coretests/apks/install_jni_lib/Android.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2012 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- com_android_frameworks_coretests_JNITest.cpp
-
-LOCAL_SDK_VERSION := 16
-
-LOCAL_CFLAGS += -Wall -Werror
-
-LOCAL_MODULE := libframeworks_coretests_jni
-
-# this does not prevent build system
-# from installing library to /system/lib
-LOCAL_MODULE_TAGS := tests
-
-# .. we want to avoid that... so we put it somewhere
-# bionic linker cant find it without outside help (nativetests):
-LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
-LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/core/tests/coretests/apks/install_multi_package/Android.mk b/core/tests/coretests/apks/install_multi_package/Android.mk
index 2813dad2339a..97275931be4b 100644
--- a/core/tests/coretests/apks/install_multi_package/Android.mk
+++ b/core/tests/coretests/apks/install_multi_package/Android.mk
@@ -7,6 +7,12 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := install_multi_package
+LOCAL_USE_AAPT2 := true
+# Disable AAPT2 manifest checks to fix:
+# frameworks/base/core/tests/coretests/apks/install_multi_package/AndroidManifest.xml:46: error: unexpected element <package> found in <manifest>.
+# TODO(b/79755007): Remove when AAPT2 recognizes the manifest elements.
+LOCAL_AAPT_FLAGS += --warn-manifest-validation
+
include $(FrameworkCoreTests_BUILD_PACKAGE)
#include $(BUILD_PACKAGE)
diff --git a/core/tests/coretests/apks/install_verifier_bad/Android.mk b/core/tests/coretests/apks/install_verifier_bad/Android.mk
index a6f9d5bac701..679327c9b0df 100644
--- a/core/tests/coretests/apks/install_verifier_bad/Android.mk
+++ b/core/tests/coretests/apks/install_verifier_bad/Android.mk
@@ -5,4 +5,10 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := install_verifier_bad
+LOCAL_USE_AAPT2 := true
+# Disable AAPT2 manifest checks to fix:
+# frameworks/base/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml:19: error: unexpected element <package-verifier> found in <manifest>.
+# TODO(b/79755007): Remove when AAPT2 recognizes the manifest elements.
+LOCAL_AAPT_FLAGS += --warn-manifest-validation
+
include $(FrameworkCoreTests_BUILD_PACKAGE)
diff --git a/core/tests/coretests/apks/install_verifier_good/Android.mk b/core/tests/coretests/apks/install_verifier_good/Android.mk
index 6f2d44f61114..7d621b32900b 100644
--- a/core/tests/coretests/apks/install_verifier_good/Android.mk
+++ b/core/tests/coretests/apks/install_verifier_good/Android.mk
@@ -5,4 +5,10 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := install_verifier_good
+LOCAL_USE_AAPT2 := true
+# Disable AAPT2 manifest checks to fix:
+# frameworks/base/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml:19: error: unexpected element <package-verifier> found in <manifest>.
+# TODO(b/79755007): Remove when AAPT2 recognizes the manifest elements.
+LOCAL_AAPT_FLAGS += --warn-manifest-validation
+
include $(FrameworkCoreTests_BUILD_PACKAGE)
diff --git a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf
index 1bad6fe75090..36ed024d10a3 100644
--- a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf
+++ b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx
index 0cf0f7914931..feefed384c49 100644
--- a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx
+++ b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx
@@ -144,6 +144,8 @@
<map code="0x0056" name="5em" /> <!-- V -->
<map code="0x0058" name="10em" /> <!-- X -->
<map code="0x005f" name="0em" /> <!-- _ -->
+ <map code="0x05D0" name="1em" /> <!-- HEBREW LETTER ALEF -->
+ <map code="0x05D1" name="5em" /> <!-- HEBREW LETTER BET -->
<map code="0xfffd" name="7em" /> <!-- REPLACEMENT CHAR -->
<map code="0x10331" name="10em" />
</cmap_format_12>
diff --git a/core/tests/coretests/res/values/styles.xml b/core/tests/coretests/res/values/styles.xml
index bcde4c1de137..dbc46265a96f 100644
--- a/core/tests/coretests/res/values/styles.xml
+++ b/core/tests/coretests/res/values/styles.xml
@@ -31,4 +31,12 @@
<style name="LayoutInDisplayCutoutModeNever">
<item name="android:windowLayoutInDisplayCutoutMode">never</item>
</style>
+ <style name="WindowBackgroundColorLiteral">
+ <item name="android:windowBackground">#00FF00</item>
+ </style>
+ <style name="WindowBackgroundFallbackColorLiteral">
+ <item name="android:windowBackground">@null</item>
+ <item name="android:colorBackground">@null</item>
+ <item name="android:windowBackgroundFallback">#0000FF</item>
+ </style>
</resources>
diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java
index 9ab7544618ab..e1cb911eaf72 100644
--- a/core/tests/coretests/src/android/app/NotificationTest.java
+++ b/core/tests/coretests/src/android/app/NotificationTest.java
@@ -16,7 +16,7 @@
package android.app;
-import static com.android.internal.util.NotificationColorUtil.satisfiesTextContrast;
+import static com.android.internal.util.ContrastColorUtil.satisfiesTextContrast;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java
index fe58116002f2..3d114f4b7c6c 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java
@@ -47,6 +47,7 @@ import android.os.Parcelable;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.util.ArrayMap;
import org.junit.Before;
import org.junit.Test;
@@ -56,6 +57,7 @@ import org.mockito.InOrder;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
/** Test {@link TransactionExecutor} logic. */
@@ -232,6 +234,44 @@ public class TransactionExecutorTests {
}
@Test
+ public void testDoNotLaunchDestroyedActivity() {
+ final Map<IBinder, ClientTransactionItem> activitiesToBeDestroyed = new ArrayMap<>();
+ when(mTransactionHandler.getActivitiesToBeDestroyed()).thenReturn(activitiesToBeDestroyed);
+ // Assume launch transaction is still in queue, so there is no client record.
+ when(mTransactionHandler.getActivityClient(any())).thenReturn(null);
+
+ // An incoming destroy transaction enters binder thread (preExecute).
+ final IBinder token = mock(IBinder.class);
+ final ClientTransaction destroyTransaction = ClientTransaction.obtain(null /* client */,
+ token /* activityToken */);
+ destroyTransaction.setLifecycleStateRequest(
+ DestroyActivityItem.obtain(false /* finished */, 0 /* configChanges */));
+ destroyTransaction.preExecute(mTransactionHandler);
+ // The activity should be added to to-be-destroyed container.
+ assertEquals(1, mTransactionHandler.getActivitiesToBeDestroyed().size());
+
+ // A previous queued launch transaction runs on main thread (execute).
+ final ClientTransaction launchTransaction = ClientTransaction.obtain(null /* client */,
+ token /* activityToken */);
+ final LaunchActivityItem launchItem = spy(LaunchActivityItem.obtain(
+ null /* intent */, 0 /* ident */, null /* info */, null /* curConfig */,
+ null, /* overrideConfig */ null /* compatInfo */, null /* referrer */ ,
+ null /* voiceInteractor */, 0 /* procState */, null /* state */,
+ null /* persistentState */, null /* pendingResults */,
+ null /* pendingNewIntents */, false /* isForward */, null /* profilerInfo */));
+ launchTransaction.addCallback(launchItem);
+ mExecutor.execute(launchTransaction);
+
+ // The launch transaction should not be executed because its token is in the
+ // to-be-destroyed container.
+ verify(launchItem, times(0)).execute(any(), any(), any());
+
+ // After the destroy transaction has been executed, the token should be removed.
+ mExecutor.execute(destroyTransaction);
+ assertEquals(0, mTransactionHandler.getActivitiesToBeDestroyed().size());
+ }
+
+ @Test
public void testActivityResultRequiredStateResolution() {
PostExecItem postExecItem = new PostExecItem(ON_RESUME);
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
index 0906435db912..2801f32430ef 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
@@ -47,6 +47,7 @@ import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.PersistableBundle;
+import android.os.RemoteCallback;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
@@ -609,7 +610,7 @@ public class TransactionParcelTests {
@Override
public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String path,
- ParcelFileDescriptor fd) {
+ ParcelFileDescriptor fd, RemoteCallback finishCallback) {
}
@Override
diff --git a/core/tests/coretests/src/android/net/UriMatcherTest.java b/core/tests/coretests/src/android/content/UriMatcherTest.java
index dd46fa38d50e..f3b9e76f3bcb 100644
--- a/core/tests/coretests/src/android/net/UriMatcherTest.java
+++ b/core/tests/coretests/src/android/content/UriMatcherTest.java
@@ -14,14 +14,17 @@
* limitations under the License.
*/
-package android.net;
+package android.content;
-import android.content.UriMatcher;
import android.net.Uri;
import android.test.suitebuilder.annotation.SmallTest;
import junit.framework.TestCase;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+
+
public class UriMatcherTest extends TestCase {
static final int ROOT = 0;
@@ -103,6 +106,59 @@ public class UriMatcherTest extends TestCase {
checkAll(matcher);
}
+ /**
+ * Tests that different {@link UriMatcher}s for {@code "#"} use the same
+ * instance of the String {@code "#"}.
+ */
+ @SmallTest
+ public void testTextCreatesNoDuplicateStrings() throws Exception {
+ // Change the visibility of fields so that they can be tested without
+ // making it non-private.
+ Field textField = UriMatcher.class.getDeclaredField("mText");
+ textField.setAccessible(true);
+
+ UriMatcher matcher = new UriMatcher(ROOT);
+ matcher.addURI("authority", "people/#", PEOPLE_ID);
+ matcher.addURI("authority", "calls/#", CALLS_ID);
+
+ UriMatcher authorityChild = getOnlyChild(matcher);
+ ArrayList<UriMatcher> mChildren = getChildren(authorityChild);
+ UriMatcher peopleChild = mChildren.get(0);
+ UriMatcher callsChild = mChildren.get(1);
+ assertEquals("people", textField.get(peopleChild));
+ assertEquals("calls", textField.get(callsChild));
+ UriMatcher peopleSharp = getOnlyChild(peopleChild);
+ UriMatcher callsSharp = getOnlyChild(callsChild);
+ assertTrue("There should be only one instance of String `#` but `"
+ + textField.get(peopleSharp) + "` is not `"
+ + textField.get(callsSharp) + "`",
+ textField.get(peopleSharp) == textField.get(callsSharp));
+ }
+
+ /**
+ * Returns {@link UriMatcher#mChildren}.
+ */
+ private ArrayList<UriMatcher> getChildren(UriMatcher matcher)
+ throws IllegalAccessException, NoSuchFieldException {
+ // Change the visibility of fields so that they can be tested without
+ // making it non-private.
+ Field childrenField = UriMatcher.class.getDeclaredField("mChildren");
+ childrenField.setAccessible(true);
+ return (ArrayList<UriMatcher>) childrenField.get(matcher);
+
+ }
+
+ /**
+ * Returns the only element of {@link UriMatcher#mChildren}.
+ */
+ private UriMatcher getOnlyChild(UriMatcher matcher)
+ throws IllegalAccessException, NoSuchFieldException {
+ ArrayList<UriMatcher> children = getChildren(matcher);
+ assertEquals("There should be one child for " + matcher,
+ 1, children.size());
+ return children.get(0);
+ }
+
private void checkAll(UriMatcher matcher) {
check("content://asdf", UriMatcher.NO_MATCH, matcher);
check("content://people", PEOPLE, matcher);
diff --git a/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java b/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java
new file mode 100644
index 000000000000..655efb5239eb
--- /dev/null
+++ b/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2007 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.graphics.drawable;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Xfermode;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DrawableWrapperTest {
+
+ static class MyWrapper extends DrawableWrapper {
+ MyWrapper(Drawable dr) {
+ super(dr);
+ }
+ }
+
+ /**
+ * Test {@link Drawable#setXfermode(Xfermode)} which is marked
+ * with the hide annotation
+ */
+ @Test
+ public void testSetXfermode() {
+ CacheXfermodeDrawable xferModeDrawable = new CacheXfermodeDrawable();
+ DrawableWrapper wrapper = new MyWrapper(xferModeDrawable);
+ PorterDuffXfermode mode = new PorterDuffXfermode(Mode.MULTIPLY);
+ wrapper.setXfermode(mode);
+ assertSame(xferModeDrawable, wrapper.getDrawable());
+ assertEquals(mode, xferModeDrawable.mXferMode);
+ }
+
+ private static class CacheXfermodeDrawable extends Drawable {
+
+ private Xfermode mXferMode = null;
+
+ @Override
+ public void draw(Canvas canvas) {
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter colorFilter) {
+ }
+
+ @Override
+ public int getOpacity() {
+ return 0;
+ }
+
+ @Override
+ public void setXfermode(Xfermode mode) {
+ mXferMode = mode;
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java b/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java
index f520b0e49d91..c6758ce1950d 100644
--- a/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java
+++ b/core/tests/coretests/src/android/net/NetworkPolicyManagerTest.java
@@ -80,7 +80,7 @@ public class NetworkPolicyManagerTest {
uidPoliciesToStringTest(POLICY_REJECT_METERED_BACKGROUND,
"1 (REJECT_METERED_BACKGROUND)");
uidPoliciesToStringTest(POLICY_ALLOW_METERED_BACKGROUND,
- "4 (ALLOW_BACKGROUND_BATTERY_SAVE)");
+ "4 (ALLOW_METERED_BACKGROUND)");
}
private void uidPoliciesToStringTest(int policyRules, String... expectedOptions) {
diff --git a/core/tests/coretests/src/android/net/SSLTest.java b/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java
index 45d28aef7974..5cbf02a79083 100644
--- a/core/tests/coretests/src/android/net/SSLTest.java
+++ b/core/tests/coretests/src/android/net/SSLCertificateSocketFactoryTest.java
@@ -16,39 +16,19 @@
package android.net;
-import android.test.suitebuilder.annotation.Suppress;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-import java.util.Arrays;
-import junit.framework.TestCase;
-
-public class SSLTest extends TestCase {
- //This test relies on network resources.
- @Suppress
- public void testCertificate() throws Exception {
- // test www.fortify.net/sslcheck.html
- Socket ssl = SSLCertificateSocketFactory.getDefault().createSocket("www.fortify.net",443);
- assertNotNull(ssl);
-
- OutputStream out = ssl.getOutputStream();
- assertNotNull(out);
-
- InputStream in = ssl.getInputStream();
- assertNotNull(in);
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
- String get = "GET /sslcheck.html HTTP/1.1\r\nHost: 68.178.217.222\r\n\r\n";
+import android.support.test.runner.AndroidJUnit4;
- // System.out.println("going for write...");
- out.write(get.getBytes());
+import org.junit.Test;
+import org.junit.runner.RunWith;
- byte[] b = new byte[1024];
- // System.out.println("going for read...");
- int ret = in.read(b);
-
- // System.out.println(new String(b));
- }
+import java.util.Arrays;
+@RunWith(AndroidJUnit4.class)
+public class SSLCertificateSocketFactoryTest {
+ @Test
public void testStringsToLengthPrefixedBytes() {
byte[] expected = {
6, 's', 'p', 'd', 'y', '/', '2',
@@ -59,6 +39,7 @@ public class SSLTest extends TestCase {
new byte[] { 'h', 't', 't', 'p', '/', '1', '.', '1' })));
}
+ @Test
public void testStringsToLengthPrefixedBytesEmptyArray() {
try {
SSLCertificateSocketFactory.toLengthPrefixedList();
@@ -67,6 +48,7 @@ public class SSLTest extends TestCase {
}
}
+ @Test
public void testStringsToLengthPrefixedBytesEmptyByteArray() {
try {
SSLCertificateSocketFactory.toLengthPrefixedList(new byte[0]);
@@ -75,6 +57,7 @@ public class SSLTest extends TestCase {
}
}
+ @Test
public void testStringsToLengthPrefixedBytesOversizedInput() {
try {
SSLCertificateSocketFactory.toLengthPrefixedList(new byte[256]);
diff --git a/core/tests/coretests/src/android/net/SntpClientTest.java b/core/tests/coretests/src/android/net/SntpClientTest.java
index 63d4080f6475..d72738c6e32c 100644
--- a/core/tests/coretests/src/android/net/SntpClientTest.java
+++ b/core/tests/coretests/src/android/net/SntpClientTest.java
@@ -16,11 +16,19 @@
package android.net;
-import android.content.Context;
-import android.test.AndroidTestCase;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+
import libcore.util.HexEncoding;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
@@ -28,8 +36,8 @@ import java.net.InetAddress;
import java.net.SocketException;
import java.util.Arrays;
-
-public class SntpClientTest extends AndroidTestCase {
+@RunWith(AndroidJUnit4.class)
+public class SntpClientTest {
private static final String TAG = "SntpClientTest";
private static final int ORIGINATE_TIME_OFFSET = 24;
@@ -58,18 +66,19 @@ public class SntpClientTest extends AndroidTestCase {
"d9ca945194bd3fff" +
"d9ca945194bd4001";
- private final SntpTestServer mServer = new SntpTestServer();
- private final SntpClient mClient = new SntpClient();
-
+ private SntpTestServer mServer;
+ private SntpClient mClient;
private Network mNetwork;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- ConnectivityManager mCM = getContext().getSystemService(ConnectivityManager.class);
- mNetwork = mCM.getActiveNetwork();
+ @Before
+ public void setUp() throws Exception {
+ // NETID_UNSET allows the test to run, with a loopback server, even w/o external networking
+ mNetwork = new Network(ConnectivityManager.NETID_UNSET);
+ mServer = new SntpTestServer();
+ mClient = new SntpClient();
}
+ @Test
public void testBasicWorkingSntpClientQuery() throws Exception {
mServer.setServerReply(HexEncoding.decode(WORKING_VERSION4.toCharArray(), false));
assertTrue(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500, mNetwork));
@@ -77,10 +86,12 @@ public class SntpClientTest extends AndroidTestCase {
assertEquals(1, mServer.numRepliesSent());
}
+ @Test
public void testDnsResolutionFailure() throws Exception {
assertFalse(mClient.requestTime("ntp.server.doesnotexist.example", 5000, mNetwork));
}
+ @Test
public void testTimeoutFailure() throws Exception {
mServer.clearServerReply();
assertFalse(mClient.requestTime(mServer.getAddress(), mServer.getPort(), 500, mNetwork));
@@ -88,6 +99,7 @@ public class SntpClientTest extends AndroidTestCase {
assertEquals(0, mServer.numRepliesSent());
}
+ @Test
public void testIgnoreLeapNoSync() throws Exception {
final byte[] reply = HexEncoding.decode(WORKING_VERSION4.toCharArray(), false);
reply[0] |= (byte) 0xc0;
@@ -97,6 +109,7 @@ public class SntpClientTest extends AndroidTestCase {
assertEquals(1, mServer.numRepliesSent());
}
+ @Test
public void testAcceptOnlyServerAndBroadcastModes() throws Exception {
final byte[] reply = HexEncoding.decode(WORKING_VERSION4.toCharArray(), false);
for (int i = 0; i <= 7; i++) {
@@ -120,6 +133,7 @@ public class SntpClientTest extends AndroidTestCase {
}
}
+ @Test
public void testAcceptableStrataOnly() throws Exception {
final int STRATUM_MIN = 1;
final int STRATUM_MAX = 15;
@@ -141,6 +155,7 @@ public class SntpClientTest extends AndroidTestCase {
}
}
+ @Test
public void testZeroTransmitTime() throws Exception {
final byte[] reply = HexEncoding.decode(WORKING_VERSION4.toCharArray(), false);
Arrays.fill(reply, TRANSMIT_TIME_OFFSET, TRANSMIT_TIME_OFFSET + 8, (byte) 0x00);
diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java
index 0bc3a2d879ab..9c9f11b76ab4 100644
--- a/core/tests/coretests/src/android/os/FileUtilsTest.java
+++ b/core/tests/coretests/src/android/os/FileUtilsTest.java
@@ -193,7 +193,7 @@ public class FileUtilsTest {
try (MemoryPipe in = MemoryPipe.createSource(source);
FileOutputStream out = new FileOutputStream(dest)) {
- FileUtils.copy(in.getFD(), out.getFD(), null, null, size);
+ FileUtils.copy(in.getFD(), out.getFD(), size, null, null, null);
}
actual = readFile(dest);
diff --git a/core/tests/coretests/src/android/os/ParcelNullabilityTest.java b/core/tests/coretests/src/android/os/ParcelNullabilityTest.java
new file mode 100644
index 000000000000..516dc0ab135c
--- /dev/null
+++ b/core/tests/coretests/src/android/os/ParcelNullabilityTest.java
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.ArrayMap;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public final class ParcelNullabilityTest {
+ @Test
+ public void nullByteArray() {
+ Parcel p = Parcel.obtain();
+ p.writeByteArray(null);
+
+ assertNull(throughBytes(p).createByteArray());
+ }
+
+ @Test
+ public void nullBlob() {
+ Parcel p = Parcel.obtain();
+ p.writeBlob(null);
+
+ assertNull(throughBytes(p).readBlob());
+ }
+
+ @Test
+ public void nullString() {
+ Parcel p = Parcel.obtain();
+ p.writeString(null);
+
+ assertNull(throughBytes(p).readString());
+ }
+
+ @Test
+ public void nullCharSequence() {
+ Parcel p = Parcel.obtain();
+ p.writeCharSequence(null);
+
+ assertNull(throughBytes(p).readCharSequence());
+ }
+
+ @Test
+ public void nullStrongBinder() {
+ Parcel p = Parcel.obtain();
+ p.writeStrongBinder(null);
+
+ assertNull(throughBytes(p).readStrongBinder());
+ }
+
+ @Test
+ public void nullStringInterface() {
+ Parcel p = Parcel.obtain();
+ p.writeStrongInterface(null);
+
+ assertNull(throughBytes(p).readStrongBinder());
+ }
+
+ @Test
+ public void nullFileDescriptor() {
+ Parcel p = Parcel.obtain();
+ try {
+ p.writeFileDescriptor(null);
+ fail();
+ } catch (RuntimeException expected) {
+ }
+ }
+
+ @Test
+ public void nullRawFileDescriptor() {
+ Parcel p = Parcel.obtain();
+ try {
+ p.writeRawFileDescriptor(null);
+ fail();
+ } catch (RuntimeException expected) {
+ }
+ }
+
+ @Test
+ public void nullRawFileDescriptorArray() {
+ Parcel p = Parcel.obtain();
+ p.writeRawFileDescriptorArray(null);
+
+ assertNull(throughBytes(p).createRawFileDescriptorArray());
+ }
+
+ @Test
+ public void nullMap() {
+ Parcel p = Parcel.obtain();
+ p.writeMap(null);
+
+ Map<Object, Object> map = new HashMap<>();
+ throughBytes(p).readMap(map, null);
+ assertTrue(map.isEmpty());
+ }
+
+ @Test
+ public void nullArrayMap() {
+ Parcel p = Parcel.obtain();
+ p.writeArrayMap(null);
+
+ ArrayMap<Object, Object> map = new ArrayMap<>();
+ throughBytes(p).readArrayMap(map, null);
+ assertTrue(map.isEmpty());
+ }
+
+ @Test
+ public void nullArraySet() {
+ Parcel p = Parcel.obtain();
+ p.writeArraySet(null);
+
+ assertNull(throughBytes(p).readArraySet(null));
+ }
+
+ @Test
+ public void nullBundle() {
+ Parcel p = Parcel.obtain();
+ p.writeBundle(null);
+
+ assertNull(throughBytes(p).readBundle());
+ }
+
+ @Test
+ public void nullPersistableBundle() {
+ Parcel p = Parcel.obtain();
+ p.writePersistableBundle(null);
+
+ assertNull(throughBytes(p).readPersistableBundle());
+ }
+
+ @Test
+ public void nullSize() {
+ Parcel p = Parcel.obtain();
+ try {
+ p.writeSize(null);
+ fail();
+ } catch (RuntimeException expected) {
+ }
+ }
+
+ @Test
+ public void nullSizeF() {
+ Parcel p = Parcel.obtain();
+ try {
+ p.writeSizeF(null);
+ fail();
+ } catch (RuntimeException expected) {
+ }
+ }
+
+ @Test
+ public void nullList() {
+ Parcel p = Parcel.obtain();
+ p.writeList(null);
+
+ List<Object> map = new ArrayList<>();
+ throughBytes(p).readList(map, null);
+ assertTrue(map.isEmpty());
+ }
+
+ @Test
+ public void nullArray() {
+ Parcel p = Parcel.obtain();
+ p.writeArray(null);
+
+ assertNull(throughBytes(p).readArray(null));
+ }
+
+ @Test
+ public void nullSparseArray() {
+ Parcel p = Parcel.obtain();
+ p.writeSparseArray(null);
+
+ assertNull(throughBytes(p).readSparseArray(null));
+ }
+
+ @Test
+ public void nullSparseBooleanArray() {
+ Parcel p = Parcel.obtain();
+ p.writeSparseBooleanArray(null);
+
+ assertNull(throughBytes(p).readSparseBooleanArray());
+ }
+
+ @Test
+ public void nullSparseIntArray() {
+ Parcel p = Parcel.obtain();
+ p.writeSparseIntArray(null);
+
+ assertNull(throughBytes(p).readSparseIntArray());
+ }
+
+ @Test
+ public void nullBooleanArray() {
+ Parcel p = Parcel.obtain();
+ p.writeBooleanArray(null);
+
+ assertNull(throughBytes(p).createBooleanArray());
+ }
+
+ @Test
+ public void nullCharArray() {
+ Parcel p = Parcel.obtain();
+ p.writeCharArray(null);
+
+ assertNull(throughBytes(p).createCharArray());
+ }
+
+ @Test
+ public void nullIntArray() {
+ Parcel p = Parcel.obtain();
+ p.writeIntArray(null);
+
+ assertNull(throughBytes(p).createIntArray());
+ }
+
+ @Test
+ public void nullLongArray() {
+ Parcel p = Parcel.obtain();
+ p.writeLongArray(null);
+
+ assertNull(throughBytes(p).createLongArray());
+ }
+
+ @Test
+ public void nullFloatArray() {
+ Parcel p = Parcel.obtain();
+ p.writeFloatArray(null);
+
+ assertNull(throughBytes(p).createFloatArray());
+ }
+
+ @Test
+ public void nullDoubleArray() {
+ Parcel p = Parcel.obtain();
+ p.writeDoubleArray(null);
+
+ assertNull(throughBytes(p).createDoubleArray());
+ }
+
+ @Test
+ public void nullStringArray() {
+ Parcel p = Parcel.obtain();
+ p.writeStringArray(null);
+
+ assertNull(throughBytes(p).createStringArray());
+ }
+
+ @Test
+ public void nullCharSequenceArray() {
+ Parcel p = Parcel.obtain();
+ p.writeCharSequenceArray(null);
+
+ assertNull(throughBytes(p).readCharSequenceArray());
+ }
+
+ @Test
+ public void nullCharSequenceList() {
+ Parcel p = Parcel.obtain();
+ p.writeCharSequenceList(null);
+
+ assertNull(throughBytes(p).readCharSequenceList());
+ }
+
+ @Test
+ public void nullBinderArray() {
+ Parcel p = Parcel.obtain();
+ p.writeBinderArray(null);
+
+ assertNull(throughBytes(p).createBinderArray());
+ }
+
+ @Test
+ public void nullTypedList() {
+ Parcel p = Parcel.obtain();
+ p.writeTypedList(null);
+
+ assertNull(throughBytes(p).createTypedArrayList(null));
+ }
+
+ @Test
+ public void nullStringList() {
+ Parcel p = Parcel.obtain();
+ p.writeStringList(null);
+
+ assertNull(throughBytes(p).createStringArrayList());
+ }
+
+ @Test
+ public void nullBinderList() {
+ Parcel p = Parcel.obtain();
+ p.writeBinderList(null);
+
+ assertNull(throughBytes(p).createBinderArrayList());
+ }
+
+ @Test
+ public void nullParcelableList() {
+ Parcel p = Parcel.obtain();
+ p.writeParcelableList(null, 0);
+
+ List<Object> list = new ArrayList<>();
+ throughBytes(p).readParcelableList(null, null);
+ assertTrue(list.isEmpty());
+ }
+
+ @Test
+ public void nullTypedArray() {
+ Parcel p = Parcel.obtain();
+ p.writeTypedArray(null, 0);
+
+ assertNull(throughBytes(p).createTypedArray(null));
+ }
+
+ @Test
+ public void nullTypedObject() {
+ Parcel p = Parcel.obtain();
+ p.writeTypedObject(null, 0);
+
+ assertNull(throughBytes(p).readTypedObject(null));
+ }
+
+ @Test
+ public void nullValue() {
+ Parcel p = Parcel.obtain();
+ p.writeValue(null);
+
+ assertNull(throughBytes(p).readValue(null));
+ }
+
+ @Test
+ public void nullParcelable() {
+ Parcel p = Parcel.obtain();
+ p.writeParcelable(null, 0);
+
+ assertNull(throughBytes(p).readParcelable(null));
+ }
+
+ @Test
+ public void nullSerializable() {
+ Parcel p = Parcel.obtain();
+ p.writeSerializable(null);
+
+ assertNull(throughBytes(p).readSerializable());
+ }
+
+ @Test
+ public void nullException() {
+ Parcel p = Parcel.obtain();
+ try {
+ p.writeException(null);
+ fail();
+ } catch (RuntimeException expected) {
+ }
+ }
+
+ private static Parcel throughBytes(Parcel p) {
+ byte[] bytes = p.marshall();
+ p = Parcel.obtain();
+ p.unmarshall(bytes, 0, bytes.length);
+ p.setDataPosition(0);
+ return p;
+ }
+}
diff --git a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java
new file mode 100644
index 000000000000..c8bc35c976a2
--- /dev/null
+++ b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.system.Os;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+public class RedactingFileDescriptorTest {
+ private Context mContext;
+ private File mFile;
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getContext();
+ mFile = File.createTempFile("redacting", "dat");
+ try (FileOutputStream out = new FileOutputStream(mFile)) {
+ final byte[] buf = new byte[1_000_000];
+ Arrays.fill(buf, (byte) 64);
+ out.write(buf);
+ }
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ mFile.delete();
+ }
+
+ @Test
+ public void testSingleByte() throws Exception {
+ final FileDescriptor fd = RedactingFileDescriptor
+ .open(mContext, mFile, new long[] { 10, 11 }).getFileDescriptor();
+
+ final byte[] buf = new byte[1_000];
+ assertEquals(buf.length, Os.read(fd, buf, 0, buf.length));
+ for (int i = 0; i < buf.length; i++) {
+ if (i == 10) {
+ assertEquals(0, buf[i]);
+ } else {
+ assertEquals(64, buf[i]);
+ }
+ }
+ }
+
+ @Test
+ public void testRanges() throws Exception {
+ final FileDescriptor fd = RedactingFileDescriptor
+ .open(mContext, mFile, new long[] { 100, 200, 300, 400 }).getFileDescriptor();
+
+ final byte[] buf = new byte[10];
+ assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 90));
+ assertArrayEquals(new byte[] { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 }, buf);
+
+ assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 95));
+ assertArrayEquals(new byte[] { 64, 64, 64, 64, 64, 0, 0, 0, 0, 0 }, buf);
+
+ assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 100));
+ assertArrayEquals(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, buf);
+
+ assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 195));
+ assertArrayEquals(new byte[] { 0, 0, 0, 0, 0, 64, 64, 64, 64, 64 }, buf);
+
+ assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 395));
+ assertArrayEquals(new byte[] { 0, 0, 0, 0, 0, 64, 64, 64, 64, 64 }, buf);
+ }
+
+ @Test
+ public void testEntireFile() throws Exception {
+ final FileDescriptor fd = RedactingFileDescriptor
+ .open(mContext, mFile, new long[] { 0, 5_000_000 }).getFileDescriptor();
+
+ try (FileInputStream in = new FileInputStream(fd)) {
+ int val;
+ while ((val = in.read()) != -1) {
+ assertEquals(0, val);
+ }
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/os/VibrationEffectTest.java b/core/tests/coretests/src/android/os/VibrationEffectTest.java
index c7fdf0fa7d32..ea778fd6710a 100644
--- a/core/tests/coretests/src/android/os/VibrationEffectTest.java
+++ b/core/tests/coretests/src/android/os/VibrationEffectTest.java
@@ -19,6 +19,8 @@ package android.os;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -40,6 +42,19 @@ public class VibrationEffectTest {
private static final String RINGTONE_URI_3 = "content://test/system/ringtone_3";
private static final String UNKNOWN_URI = "content://test/system/other_audio";
+ private static final long TEST_TIMING = 100;
+ private static final int TEST_AMPLITUDE = 100;
+ private static final long[] TEST_TIMINGS = new long[] { 100, 100, 200 };
+ private static final int[] TEST_AMPLITUDES =
+ new int[] { 255, 0, VibrationEffect.DEFAULT_AMPLITUDE };
+
+ private static final VibrationEffect TEST_ONE_SHOT =
+ VibrationEffect.createOneShot(TEST_TIMING, TEST_AMPLITUDE);
+ private static final VibrationEffect DEFAULT_ONE_SHOT =
+ VibrationEffect.createOneShot(TEST_TIMING, VibrationEffect.DEFAULT_AMPLITUDE);
+ private static final VibrationEffect TEST_WAVEFORM =
+ VibrationEffect.createWaveform(TEST_TIMINGS, TEST_AMPLITUDES, -1);
+
@Test
public void getRingtones_noPrebakedRingtones() {
Resources r = mockRingtoneResources(new String[0]);
@@ -66,6 +81,81 @@ public class VibrationEffectTest {
assertEquals(expectedEffect, effect);
}
+ @Test
+ public void testScaleOneShot() {
+ VibrationEffect.OneShot initial = (VibrationEffect.OneShot) TEST_ONE_SHOT;
+ VibrationEffect.OneShot halved = initial.scale(1, 128);
+ assertEquals(50, halved.getAmplitude());
+ VibrationEffect.OneShot scaledUp = initial.scale(0.5f, 255);
+ assertTrue(scaledUp.getAmplitude() > initial.getAmplitude());
+ VibrationEffect.OneShot restored2 = scaledUp.scale(2, 255);
+ assertEquals(100, restored2.getAmplitude(), 2); // May differ a bit due to rounding
+ VibrationEffect.OneShot scaledDown = initial.scale(2, 255);
+ assertTrue(scaledDown.getAmplitude() < initial.getAmplitude());
+ VibrationEffect.OneShot restored3 = scaledDown.scale(0.5f, 255);
+ assertEquals(100, restored3.getAmplitude(), 2); // May differ a bit due to rounding
+ }
+
+ @Test
+ public void testScaleOneShotFailsWhenMaxAmplitudeAboveThreshold() {
+ try {
+ ((VibrationEffect.OneShot) TEST_ONE_SHOT).scale(1.1f, 1000);
+ fail("Max amplitude above threshold, should throw IllegalArgumentException");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ @Test
+ public void testResolveOneShot() {
+ VibrationEffect.OneShot initial = (VibrationEffect.OneShot) DEFAULT_ONE_SHOT;
+ VibrationEffect.OneShot resolved = initial.resolve(239);
+ assertEquals(239, resolved.getAmplitude());
+ }
+
+ @Test
+ public void testResolveOneShotFailsWhenMaxAmplitudeAboveThreshold() {
+ try {
+ ((VibrationEffect.OneShot) TEST_ONE_SHOT).resolve(1000);
+ fail("Max amplitude above threshold, should throw IllegalArgumentException");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ @Test
+ public void testScaleWaveform() {
+ VibrationEffect.Waveform scaled =
+ ((VibrationEffect.Waveform) TEST_WAVEFORM).scale(1.1f, 200);
+ assertEquals(200, scaled.getAmplitudes()[0]);
+ assertEquals(0, scaled.getAmplitudes()[1]);
+ }
+
+ @Test
+ public void testScaleWaveformFailsWhenMaxAmplitudeAboveThreshold() {
+ try {
+ ((VibrationEffect.Waveform) TEST_WAVEFORM).scale(1.1f, 1000);
+ fail("Max amplitude above threshold, should throw IllegalArgumentException");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ @Test
+ public void testResolveWaveform() {
+ VibrationEffect.Waveform resolved =
+ ((VibrationEffect.Waveform) TEST_WAVEFORM).resolve(239);
+ assertEquals(255, resolved.getAmplitudes()[0]);
+ assertEquals(0, resolved.getAmplitudes()[1]);
+ assertEquals(239, resolved.getAmplitudes()[2]);
+ }
+
+ @Test
+ public void testResolveWaveformFailsWhenMaxAmplitudeAboveThreshold() {
+ try {
+ ((VibrationEffect.Waveform) TEST_WAVEFORM).resolve(1000);
+ fail("Max amplitude above threshold, should throw IllegalArgumentException");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
private Resources mockRingtoneResources() {
return mockRingtoneResources(new String[] {
diff --git a/core/tests/coretests/src/android/provider/DocumentsProviderTest.java b/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
index 09cbbff9077f..1465d0a98394 100644
--- a/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
+++ b/core/tests/coretests/src/android/provider/DocumentsProviderTest.java
@@ -24,7 +24,6 @@ import android.support.test.filters.SmallTest;
import android.test.ProviderTestCase2;
import java.util.Arrays;
-import java.util.List;
/**
* Unit tests for {@link DocumentsProvider}.
@@ -84,7 +83,10 @@ public class DocumentsProviderTest extends ProviderTestCase2<TestDocumentsProvid
final Uri docUri = buildTreeDocumentUri(
TestDocumentsProvider.AUTHORITY, PARENT_DOCUMENT_ID, DOCUMENT_ID);
- assertNull(DocumentsContract.findDocumentPath(mResolver, docUri));
+ try {
+ DocumentsContract.findDocumentPath(mResolver, docUri);
+ fail("Expected a SecurityException to be throw");
+ } catch (SecurityException expected) { }
}
public void testFindDocumentPath_treeUri_erasesNonNullRootId() throws Exception {
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index fc00f1b93955..60e512cb2c1c 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -57,7 +57,6 @@ public class SettingsBackupTest {
private static final Set<String> BACKUP_BLACKLISTED_SYSTEM_SETTINGS =
newHashSet(
Settings.System.ADVANCED_SETTINGS, // candidate for backup?
- Settings.System.ALARM_ALERT, // backup candidate?
Settings.System.ALARM_ALERT_CACHE, // internal cache
Settings.System.APPEND_FOR_LAST_AUDIBLE, // suffix deprecated since API 2
Settings.System.EGG_MODE, // I am the lolrus
@@ -67,9 +66,9 @@ public class SettingsBackupTest {
Settings.System.LOCKSCREEN_DISABLED, // ?
Settings.System.MEDIA_BUTTON_RECEIVER, // candidate for backup?
Settings.System.MUTE_STREAMS_AFFECTED, // candidate for backup?
- Settings.System.NOTIFICATION_LIGHT_PULSE, // candidate for backup?
Settings.System.NOTIFICATION_SOUND_CACHE, // internal cache
Settings.System.POINTER_LOCATION, // backup candidate?
+ Settings.System.DEBUG_ENABLE_ENHANCED_CALL_BLOCKING, // used for testing only
Settings.System.RINGTONE_CACHE, // internal cache
Settings.System.SCREEN_BRIGHTNESS, // removed in P
Settings.System.SETUP_WIZARD_HAS_RUN, // Only used by SuW
@@ -124,6 +123,7 @@ public class SettingsBackupTest {
Settings.Global.BATTERY_DISCHARGE_THRESHOLD,
Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS,
Settings.Global.BATTERY_STATS_CONSTANTS,
+ Settings.Global.BINDER_CALLS_STATS,
Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE,
Settings.Global.BLE_SCAN_LOW_POWER_WINDOW_MS,
Settings.Global.BLE_SCAN_LOW_POWER_INTERVAL_MS,
@@ -176,7 +176,6 @@ public class SettingsBackupTest {
Settings.Global.CONNECTIVITY_SAMPLING_INTERVAL_IN_SECONDS,
Settings.Global.CONTACT_METADATA_SYNC_ENABLED,
Settings.Global.CONTACTS_DATABASE_WAL_ENABLED,
- Settings.Global.CPU_SCALING_ENABLED,
Settings.Global.DATA_ACTIVITY_TIMEOUT_MOBILE,
Settings.Global.DATA_ACTIVITY_TIMEOUT_WIFI,
Settings.Global.DATABASE_CREATION_BUILDID,
@@ -237,6 +236,7 @@ public class SettingsBackupTest {
Settings.Global.EUICC_SUPPORTED_COUNTRIES,
Settings.Global.EUICC_FACTORY_RESET_TIMEOUT_MILLIS,
Settings.Global.FANCY_IME_ANIMATIONS,
+ Settings.Global.FASTER_EMERGENCY_PHONE_CALL_ENABLED,
Settings.Global.FORCE_ALLOW_ON_EXTERNAL,
Settings.Global.FORCED_APP_STANDBY_ENABLED,
Settings.Global.FORCED_APP_STANDBY_FOR_SMALL_BATTERY_ENABLED,
@@ -272,6 +272,7 @@ public class SettingsBackupTest {
Settings.Global.LOCATION_BACKGROUND_THROTTLE_INTERVAL_MS,
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PROXIMITY_ALERT_INTERVAL_MS,
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST,
+ Settings.Global.LOCATION_LAST_LOCATION_MAX_AGE_MILLIS,
Settings.Global.LOCATION_GLOBAL_KILL_SWITCH,
Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED,
Settings.Global.LOCK_SOUND,
@@ -341,7 +342,6 @@ public class SettingsBackupTest {
Settings.Global.NTP_SERVER,
Settings.Global.NTP_TIMEOUT,
Settings.Global.OTA_DISABLE_AUTOMATIC_UPDATE,
- Settings.Global.USER_ABSENT_RADIOS_OFF_FOR_SMALL_BATTERY_ENABLED,
Settings.Global.OVERLAY_DISPLAY_DEVICES,
Settings.Global.PAC_CHANGE_DELAY,
Settings.Global.PACKAGE_VERIFIER_DEFAULT_RESPONSE,
@@ -403,7 +403,6 @@ public class SettingsBackupTest {
Settings.Global.SQLITE_COMPATIBILITY_WAL_FLAGS,
Settings.Global.STORAGE_BENCHMARK_INTERVAL,
Settings.Global.STORAGE_SETTINGS_CLOBBER_THRESHOLD,
- Settings.Global.SWAP_ENABLED,
Settings.Global.SYNC_MANAGER_CONSTANTS,
Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS,
Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
@@ -436,6 +435,8 @@ public class SettingsBackupTest {
Settings.Global.UNGAZE_SLEEP_ENABLED,
Settings.Global.UNLOCK_SOUND,
Settings.Global.USE_GOOGLE_MAIL,
+ Settings.Global.USER_ABSENT_RADIOS_OFF_FOR_SMALL_BATTERY_ENABLED,
+ Settings.Global.USER_ABSENT_TOUCH_OFF_FOR_SMALL_BATTERY_ENABLED,
Settings.Global.VT_IMS_ENABLED,
Settings.Global.WAIT_FOR_DEBUGGER,
Settings.Global.ENABLE_GPU_DEBUG_LAYERS,
@@ -444,6 +445,7 @@ public class SettingsBackupTest {
Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING,
Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT,
Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS,
+ Settings.Global.USER_SWITCHER_ENABLED,
Settings.Global.NETWORK_ACCESS_TIMEOUT_MS,
Settings.Global.WARNING_TEMPERATURE,
Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY,
@@ -458,6 +460,8 @@ public class SettingsBackupTest {
Settings.Global.WIFI_BOUNCE_DELAY_OVERRIDE_MS,
Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
Settings.Global.WIFI_COUNTRY_CODE,
+ Settings.Global.WIFI_DATA_STALL_MIN_TX_BAD,
+ Settings.Global.WIFI_DATA_STALL_MIN_TX_SUCCESS_WITHOUT_RX,
Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN,
Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON,
Settings.Global.WIFI_DISPLAY_ON,
@@ -467,6 +471,8 @@ public class SettingsBackupTest {
Settings.Global.WIFI_FRAMEWORK_SCAN_INTERVAL_MS,
Settings.Global.WIFI_FREQUENCY_BAND,
Settings.Global.WIFI_IDLE_MS,
+ Settings.Global.WIFI_IS_UNUSABLE_EVENT_METRICS_ENABLED,
+ Settings.Global.WIFI_LINK_SPEED_METRICS_ENABLED,
Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT,
Settings.Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS,
Settings.Global.WIFI_NETWORK_SHOW_RSSI,
@@ -500,6 +506,7 @@ public class SettingsBackupTest {
private static final Set<String> BACKUP_BLACKLISTED_SECURE_SETTINGS =
newHashSet(
Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE,
+ Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, // Deprecated since O.
Settings.Secure.ALLOWED_GEOLOCATION_ORIGINS,
Settings.Secure.ALWAYS_ON_VPN_APP,
Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN,
@@ -507,6 +514,8 @@ public class SettingsBackupTest {
Settings.Secure.ANR_SHOW_BACKGROUND,
Settings.Secure.ASSISTANT,
Settings.Secure.ASSIST_DISCLOSURE_ENABLED,
+ Settings.Secure.ASSIST_GESTURE_SENSITIVITY,
+ Settings.Secure.ASSIST_GESTURE_SETUP_COMPLETE,
Settings.Secure.ASSIST_SCREENSHOT_ENABLED,
Settings.Secure.ASSIST_STRUCTURE_ENABLED,
Settings.Secure.AUTOFILL_FEATURE_FIELD_CLASSIFICATION,
@@ -535,7 +544,6 @@ public class SettingsBackupTest {
Settings.Secure.DISABLED_PRINT_SERVICES,
Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS,
Settings.Secure.DISPLAY_DENSITY_FORCED,
- Settings.Secure.DOZE_ALWAYS_ON,
Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION,
Settings.Secure.ENABLED_INPUT_METHODS, // Intentionally removed in P
@@ -551,10 +559,8 @@ public class SettingsBackupTest {
Settings.Secure.LAST_SETUP_SHOWN,
Settings.Secure.LOCATION_CHANGER,
Settings.Secure.LOCATION_MODE,
- Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, // Candidate?
Settings.Secure.LOCK_SCREEN_ALLOW_REMOTE_INPUT, // Candidate?
Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT,
- Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, // Candidate?
Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH,
Settings.Secure.MULTI_PRESS_TIMEOUT,
@@ -588,12 +594,15 @@ public class SettingsBackupTest {
Settings.Secure.SEARCH_THREAD_KEEPALIVE_SECONDS,
Settings.Secure.SEARCH_WEB_RESULTS_OVERRIDE_LIMIT,
Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE,
+ Settings.Secure.SELECTED_SPELL_CHECKER, // Intentionally removed in Q
+ Settings.Secure.SELECTED_SPELL_CHECKER_SUBTYPE, // Intentionally removed in Q
Settings.Secure.SETTINGS_CLASSNAME,
Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING, // candidate?
Settings.Secure.SHOW_ROTATION_SUGGESTIONS,
Settings.Secure.SKIP_FIRST_USE_HINTS, // candidate?
+ Settings.Secure.SLEEP_TIMEOUT,
Settings.Secure.SMS_DEFAULT_APPLICATION,
- Settings.Secure.THEME_MODE,
+ Settings.Secure.SPELL_CHECKER_ENABLED, // Intentionally removed in Q
Settings.Secure.TRUST_AGENTS_INITIALIZED,
Settings.Secure.TV_INPUT_CUSTOM_LABELS,
Settings.Secure.TV_INPUT_HIDDEN_INPUTS,
@@ -616,7 +625,9 @@ public class SettingsBackupTest {
Settings.Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT,
Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED,
Settings.Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION,
- Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE);
+ Settings.Secure.PACKAGES_TO_CLEAR_DATA_BEFORE_FULL_RESTORE,
+ Settings.Secure.FLASHLIGHT_AVAILABLE,
+ Settings.Secure.FLASHLIGHT_ENABLED);
@Test
public void systemSettingsBackedUpOrBlacklisted() {
diff --git a/core/tests/coretests/src/android/text/LayoutTest.java b/core/tests/coretests/src/android/text/LayoutTest.java
index 2448b0b58f9c..97937a45825e 100644
--- a/core/tests/coretests/src/android/text/LayoutTest.java
+++ b/core/tests/coretests/src/android/text/LayoutTest.java
@@ -16,6 +16,7 @@
package android.text;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
@@ -688,5 +689,59 @@ public class LayoutTest {
return mDrawCommands;
}
}
+
+ private static final String LTR = "a";
+ private static final String RTL = "\u05D0"; // HEBREW LETTER ALEF
+ private static final String LTR_SP = "\uD801\uDCB0"; // OSAGE CAPITAL LETTER A
+ private static final String RTL_SP = "\uD83A\uDD00"; // ADLAM CAPITAL LETTER ALIF
+
+ private static final String LRI = "\u2066"; // LEFT-TO-RIGHT ISOLATE
+ private static final String RLI = "\u2067"; // RIGHT-TO-LEFT ISOLATE
+ private static final String PDI = "\u2069"; // POP DIRECTIONAL ISOLATE
+
+ private static void assertPrimaryIsTrailingPrevious(String input, boolean[] expected) {
+ assertEquals(input.length() + 1, expected.length);
+
+ boolean[] actual = new boolean[expected.length];
+ TextPaint paint = new TextPaint();
+ paint.setTextSize(16.0f);
+ Layout layout = StaticLayout.Builder.obtain(
+ input, 0, input.length(), paint, Integer.MAX_VALUE).build();
+ for (int i = 0; i <= input.length(); ++i) {
+ actual[i] = layout.primaryIsTrailingPrevious(i);
+ }
+ assertArrayEquals(expected, actual);
+ assertArrayEquals(actual, layout.primaryIsTrailingPreviousAllLineOffsets(0));
+ }
+
+ @Test
+ public void testPrimaryIsTrailingPrevious() {
+ assertPrimaryIsTrailingPrevious(
+ LTR + " " + LTR + LTR + " " + LTR + LTR + LTR,
+ new boolean[]{false, false, false, false, false, false, false, false, false});
+ assertPrimaryIsTrailingPrevious(
+ RTL + " " + RTL + RTL + " " + RTL + RTL + RTL,
+ new boolean[]{false, false, false, false, false, false, false, false, false});
+ assertPrimaryIsTrailingPrevious(
+ LTR + RTL + LTR + RTL + LTR,
+ new boolean[]{false, true, false, true, false, false});
+ assertPrimaryIsTrailingPrevious(
+ RTL + LTR + RTL + LTR + RTL,
+ new boolean[]{false, true, false, true, false, false});
+ assertPrimaryIsTrailingPrevious(
+ RTL_SP + LTR_SP + RTL_SP + LTR_SP + RTL_SP,
+ new boolean[]{
+ false, false, true, false, false, false, true, false, false, false, false});
+ assertPrimaryIsTrailingPrevious(
+ LTR_SP + RTL_SP + LTR_SP + RTL_SP + LTR_SP,
+ new boolean[]{
+ false, false, true, false, false, false, true, false, false, false, false});
+ assertPrimaryIsTrailingPrevious(
+ LTR + RLI + LTR + RTL + PDI + LTR,
+ new boolean[]{false, false, true, false, false, false, false});
+ assertPrimaryIsTrailingPrevious(
+ RTL + LRI + RTL + LTR + PDI + RTL,
+ new boolean[]{false, false, true, false, false, false, false});
+ }
}
diff --git a/core/tests/coretests/src/android/text/TextLineTest.java b/core/tests/coretests/src/android/text/TextLineTest.java
index d9c09c8b03bf..61f976a7308d 100644
--- a/core/tests/coretests/src/android/text/TextLineTest.java
+++ b/core/tests/coretests/src/android/text/TextLineTest.java
@@ -16,17 +16,28 @@
package android.text;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Typeface;
import android.platform.test.annotations.Presubmit;
+import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.filters.Suppress;
import android.support.test.runner.AndroidJUnit4;
+import android.text.Layout.TabStops;
+import android.text.style.ReplacementSpan;
+import android.text.style.TabStopSpan;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Arrays;
+
@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -35,7 +46,8 @@ public class TextLineTest {
final TextPaint paint = new TextPaint();
final TextLine tl = TextLine.obtain();
tl.set(paint, line, 0, line.length(), Layout.DIR_LEFT_TO_RIGHT,
- Layout.DIRS_ALL_LEFT_TO_RIGHT, false /* hasTabs */, null /* tabStops */);
+ Layout.DIRS_ALL_LEFT_TO_RIGHT, false /* hasTabs */, null /* tabStops */,
+ 0, 0 /* no ellipsis */);
final float originalWidth = tl.metrics(null);
final float expandedWidth = 2 * originalWidth;
@@ -66,4 +78,243 @@ public class TextLineTest {
final char combining_acute = '\u0301';
assertFalse(stretchesToFullWidth("combining" + nbsp + combining_acute + "acute"));
}
+
+ // The test font has following coverage and width.
+ // U+0020: 10em
+ // U+002E (.): 10em
+ // U+0043 (C): 100em
+ // U+0049 (I): 1em
+ // U+004C (L): 50em
+ // U+0056 (V): 5em
+ // U+0058 (X): 10em
+ // U+005F (_): 0em
+ // U+05D0 : 1em // HEBREW LETTER ALEF
+ // U+05D1 : 5em // HEBREW LETTER BET
+ // U+FFFD (invalid surrogate will be replaced to this): 7em
+ // U+10331 (\uD800\uDF31): 10em
+ private static final Typeface TYPEFACE = Typeface.createFromAsset(
+ InstrumentationRegistry.getInstrumentation().getTargetContext().getAssets(),
+ "fonts/StaticLayoutLineBreakingTestFont.ttf");
+
+ private TextLine getTextLine(String str, TextPaint paint, TabStops tabStops) {
+ Layout layout =
+ StaticLayout.Builder.obtain(str, 0, str.length(), paint, Integer.MAX_VALUE)
+ .build();
+ TextLine tl = TextLine.obtain();
+ tl.set(paint, str, 0, str.length(),
+ TextDirectionHeuristics.FIRSTSTRONG_LTR.isRtl(str, 0, str.length()) ? -1 : 1,
+ layout.getLineDirections(0), tabStops != null, tabStops,
+ 0, 0 /* no ellipsis */);
+ return tl;
+ }
+
+ private TextLine getTextLine(String str, TextPaint paint) {
+ return getTextLine(str, paint, null);
+ }
+
+ private void assertMeasurements(final TextLine tl, final int length, boolean trailing,
+ final float[] expected) {
+ for (int offset = 0; offset <= length; ++offset) {
+ assertEquals(expected[offset], tl.measure(offset, trailing, null), 0.0f);
+ }
+
+ final boolean[] trailings = new boolean[length + 1];
+ Arrays.fill(trailings, trailing);
+ final float[] allMeasurements = tl.measureAllOffsets(trailings, null);
+ assertArrayEquals(expected, allMeasurements, 0.0f);
+ }
+
+ @Test
+ public void testMeasure_LTR() {
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("IIIIIV", paint);
+ assertMeasurements(tl, 6, false,
+ new float[]{0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 100.0f});
+ assertMeasurements(tl, 6, true,
+ new float[]{0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 100.0f});
+ }
+
+ @Test
+ public void testMeasure_RTL() {
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("\u05D0\u05D0\u05D0\u05D0\u05D0\u05D1", paint);
+ assertMeasurements(tl, 6, false,
+ new float[]{0.0f, -10.0f, -20.0f, -30.0f, -40.0f, -50.0f, -100.0f});
+ assertMeasurements(tl, 6, true,
+ new float[]{0.0f, -10.0f, -20.0f, -30.0f, -40.0f, -50.0f, -100.0f});
+ }
+
+ @Test
+ public void testMeasure_BiDi() {
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("II\u05D0\u05D0II", paint);
+ assertMeasurements(tl, 6, false,
+ new float[]{0.0f, 10.0f, 40.0f, 30.0f, 40.0f, 50.0f, 60.0f});
+ assertMeasurements(tl, 6, true,
+ new float[]{0.0f, 10.0f, 20.0f, 30.0f, 20.0f, 50.0f, 60.0f});
+ }
+
+ private static final String LRI = "\u2066"; // LEFT-TO-RIGHT ISOLATE
+ private static final String RLI = "\u2067"; // RIGHT-TO-LEFT ISOLATE
+ private static final String PDI = "\u2069"; // POP DIRECTIONAL ISOLATE
+
+ @Test
+ public void testMeasure_BiDi2() {
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("I" + RLI + "I\u05D0\u05D0" + PDI + "I", paint);
+ assertMeasurements(tl, 7, false,
+ new float[]{0.0f, 10.0f, 30.0f, 30.0f, 20.0f, 40.0f, 40.0f, 50.0f});
+ assertMeasurements(tl, 7, true,
+ new float[]{0.0f, 10.0f, 10.0f, 40.0f, 20.0f, 10.0f, 40.0f, 50.0f});
+ }
+
+ @Test
+ public void testMeasure_BiDi3() {
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("\u05D0" + LRI + "\u05D0II" + PDI + "\u05D0", paint);
+ assertMeasurements(tl, 7, false,
+ new float[]{0.0f, -10.0f, -30.0f, -30.0f, -20.0f, -40.0f, -40.0f, -50.0f});
+ assertMeasurements(tl, 7, true,
+ new float[]{0.0f, -10.0f, -10.0f, -40.0f, -20.0f, -10.0f, -40.0f, -50.0f});
+ }
+
+ @Test
+ public void testMeasure_Tab_LTR() {
+ final Object[] spans = { new TabStopSpan.Standard(100) };
+ final TabStops stops = new TabStops(100, spans);
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("II\tII", paint, stops);
+ assertMeasurements(tl, 5, false,
+ new float[]{0.0f, 10.0f, 20.0f, 100.0f, 110.0f, 120.0f});
+ assertMeasurements(tl, 5, true,
+ new float[]{0.0f, 10.0f, 20.0f, 100.0f, 110.0f, 120.0f});
+ }
+
+ @Test
+ public void testMeasure_Tab_RTL() {
+ final Object[] spans = { new TabStopSpan.Standard(100) };
+ final TabStops stops = new TabStops(100, spans);
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("\u05D0\u05D0\t\u05D0\u05D0", paint, stops);
+ assertMeasurements(tl, 5, false,
+ new float[]{0.0f, -10.0f, -20.0f, -100.0f, -110.0f, -120.0f});
+ assertMeasurements(tl, 5, true,
+ new float[]{0.0f, -10.0f, -20.0f, -100.0f, -110.0f, -120.0f});
+ }
+
+ @Test
+ public void testMeasure_Tab_BiDi() {
+ final Object[] spans = { new TabStopSpan.Standard(100) };
+ final TabStops stops = new TabStops(100, spans);
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("I\u05D0\tI\u05D0", paint, stops);
+ assertMeasurements(tl, 5, false,
+ new float[]{0.0f, 20.0f, 20.0f, 100.0f, 120.0f, 120.0f});
+ assertMeasurements(tl, 5, true,
+ new float[]{0.0f, 10.0f, 10.0f, 100.0f, 110.0f, 110.0f});
+ }
+
+ @Test
+ public void testMeasure_Tab_BiDi2() {
+ final Object[] spans = { new TabStopSpan.Standard(100) };
+ final TabStops stops = new TabStops(100, spans);
+ final TextPaint paint = new TextPaint();
+ paint.setTypeface(TYPEFACE);
+ paint.setTextSize(10.0f); // make 1em = 10px
+
+ TextLine tl = getTextLine("\u05D0I\t\u05D0I", paint, stops);
+ assertMeasurements(tl, 5, false,
+ new float[]{0.0f, -20.0f, -20.0f, -100.0f, -120.0f, -120.0f});
+ assertMeasurements(tl, 5, true,
+ new float[]{0.0f, -10.0f, -10.0f, -100.0f, -110.0f, -110.0f});
+ }
+
+ @Test
+ public void testHandleRun_ellipsizedReplacementSpan_isSkipped() {
+ final Spannable text = new SpannableStringBuilder("This is a... text");
+
+ // Setup a replacement span that the measurement should not interact with.
+ final TestReplacementSpan span = new TestReplacementSpan();
+ text.setSpan(span, 9, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+ final TextLine tl = TextLine.obtain();
+ tl.set(new TextPaint(), text, 0, text.length(), 1, Layout.DIRS_ALL_LEFT_TO_RIGHT,
+ false /* hasTabs */, null /* tabStops */, 9, 12);
+ tl.measure(text.length(), false /* trailing */, null /* fmi */);
+
+ assertFalse(span.mIsUsed);
+ }
+
+ @Test
+ public void testHandleRun_notEllipsizedReplacementSpan_isNotSkipped() {
+ final Spannable text = new SpannableStringBuilder("This is a... text");
+
+ // Setup a replacement span that the measurement should not interact with.
+ final TestReplacementSpan span = new TestReplacementSpan();
+ text.setSpan(span, 1, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+ final TextLine tl = TextLine.obtain();
+ tl.set(new TextPaint(), text, 0, text.length(), 1, Layout.DIRS_ALL_LEFT_TO_RIGHT,
+ false /* hasTabs */, null /* tabStops */, 9, 12);
+ tl.measure(text.length(), false /* trailing */, null /* fmi */);
+
+ assertTrue(span.mIsUsed);
+ }
+
+ @Test
+ public void testHandleRun_halfEllipsizedReplacementSpan_isNotSkipped() {
+ final Spannable text = new SpannableStringBuilder("This is a... text");
+
+ // Setup a replacement span that the measurement should not interact with.
+ final TestReplacementSpan span = new TestReplacementSpan();
+ text.setSpan(span, 7, 11, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+ final TextLine tl = TextLine.obtain();
+ tl.set(new TextPaint(), text, 0, text.length(), 1, Layout.DIRS_ALL_LEFT_TO_RIGHT,
+ false /* hasTabs */, null /* tabStops */, 9, 12);
+ tl.measure(text.length(), false /* trailing */, null /* fmi */);
+ assertTrue(span.mIsUsed);
+ }
+
+ private static class TestReplacementSpan extends ReplacementSpan {
+ boolean mIsUsed;
+
+ @Override
+ public int getSize(Paint paint, CharSequence text, int start, int end,
+ Paint.FontMetricsInt fm) {
+ mIsUsed = true;
+ return 0;
+ }
+
+ @Override
+ public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top,
+ int y,
+ int bottom, Paint paint) {
+ mIsUsed = true;
+ }
+ }
}
diff --git a/core/tests/coretests/src/android/text/TextUtilsTest.java b/core/tests/coretests/src/android/text/TextUtilsTest.java
index e70b8412ac65..72290bf10f9d 100644
--- a/core/tests/coretests/src/android/text/TextUtilsTest.java
+++ b/core/tests/coretests/src/android/text/TextUtilsTest.java
@@ -777,4 +777,19 @@ public class TextUtilsTest {
public void testTrimToSizeThrowsExceptionForZeroSize() {
TextUtils.trimToSize("abc", 0);
}
+
+ @Test
+ public void length() {
+ assertEquals(0, TextUtils.length(null));
+ assertEquals(0, TextUtils.length(""));
+ assertEquals(2, TextUtils.length(" "));
+ assertEquals(6, TextUtils.length("Hello!"));
+ }
+
+ @Test
+ public void testTrimToLengthWithEllipsis() {
+ assertEquals("ABC...", TextUtils.trimToLengthWithEllipsis("ABCDEF", 3));
+ assertEquals("ABC", TextUtils.trimToLengthWithEllipsis("ABC", 3));
+ assertEquals("", TextUtils.trimToLengthWithEllipsis("", 3));
+ }
}
diff --git a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
index 15dbbc8de150..c98e6460c189 100644
--- a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
+++ b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
@@ -20,6 +20,7 @@ import android.platform.test.annotations.Presubmit;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.Suppress;
import android.text.InputType;
import android.util.KeyUtils;
import android.view.KeyEvent;
@@ -238,6 +239,7 @@ public class ForwardDeleteTest {
}
@Test
+ @Suppress
public void testEmojiModifier() {
EditorState state = new EditorState();
@@ -267,6 +269,7 @@ public class ForwardDeleteTest {
}
@Test
+ @Suppress
public void testMixedEdgeCases() {
EditorState state = new EditorState();
diff --git a/core/tests/coretests/src/android/text/util/LinkifyTest.java b/core/tests/coretests/src/android/text/util/LinkifyTest.java
index 2fe7db439a64..be3a0be079bf 100644
--- a/core/tests/coretests/src/android/text/util/LinkifyTest.java
+++ b/core/tests/coretests/src/android/text/util/LinkifyTest.java
@@ -31,11 +31,6 @@ import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.util.Patterns;
-import android.view.textclassifier.SystemTextClassifier;
-import android.view.textclassifier.TextClassificationConstants;
-import android.view.textclassifier.TextClassifier;
-import android.view.textclassifier.TextClassifierImpl;
-import android.view.textclassifier.TextLinks.TextLinkSpan;
import android.widget.TextView;
import org.junit.After;
@@ -43,11 +38,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
import java.util.Locale;
-import java.util.Set;
/**
* LinkifyTest tests {@link Linkify}.
@@ -158,55 +149,4 @@ public class LinkifyTest {
assertEquals("android.com should be linkified", 1, spans.length);
assertEquals("https://android.com", spans[0].getURL());
}
-
- @Test
- public void testAddLinksAsync_useLegacyIfSmartDisabled_localTextClassifier()
- throws Exception {
- final TextClassificationConstants settings =
- TextClassificationConstants.loadFromString("smart_linkify_enabled=false");
- final TextClassifier classifier = new TextClassifierImpl(mContext, settings);
- testAddLinksAsync_useLegacyIfSmartDisabled(classifier);
- }
-
- @Test
- public void testAddLinksAsync_useLegacyIfSmartDisabled_systemTextClassifier()
- throws Exception {
- final TextClassificationConstants settings =
- TextClassificationConstants.loadFromString("smart_linkify_enabled=false");
- final TextClassifier classifier = new SystemTextClassifier(mContext, settings);
- testAddLinksAsync_useLegacyIfSmartDisabled(classifier);
- }
-
- private void testAddLinksAsync_useLegacyIfSmartDisabled(TextClassifier classifier)
- throws Exception {
- final int linkMask = Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS | Linkify.WEB_URLS;
- final String string = "example@android.com\n"
- + "(415) 555-1212\n"
- + "http://android.com\n"
- + "100 Android Rd California";
- final Spannable expected = new SpannableString(string);
- final Spannable actual = new SpannableString(string);
-
- Linkify.addLinks(expected, linkMask); // legacy.
- Linkify.addLinksAsync(actual, classifier, linkMask).get();
-
- final URLSpan[] expectedSpans = expected.getSpans(0, expected.length(), URLSpan.class);
- final TextLinkSpan[] actualSpans = actual.getSpans(0, actual.length(), TextLinkSpan.class);
- assertEquals(expectedSpans.length, actualSpans.length);
- final Set<List> expectedLinkSpec = new HashSet<>();
- final Set<List> actualLinkSpec = new HashSet<>();
- for (int i = 0; i < expectedSpans.length; i++) {
- final URLSpan expectedSpan = expectedSpans[i];
- final TextLinkSpan actualSpan = actualSpans[i];
- expectedLinkSpec.add(Arrays.asList(
- expected.getSpanStart(expectedSpan),
- expected.getSpanEnd(expectedSpan),
- expectedSpan.getURL()));
- actualLinkSpec.add(Arrays.asList(
- actual.getSpanStart(actualSpan),
- actual.getSpanEnd(actualSpan),
- actualSpan.getUrl()));
- }
- assertEquals(expectedLinkSpec, actualLinkSpec);
- }
}
diff --git a/core/tests/coretests/src/android/util/LogNullabilityTest.java b/core/tests/coretests/src/android/util/LogNullabilityTest.java
new file mode 100644
index 000000000000..3f4776d8b4fc
--- /dev/null
+++ b/core/tests/coretests/src/android/util/LogNullabilityTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public final class LogNullabilityTest {
+ @Test
+ public void nullTag() {
+ Log.v(null, "");
+ Log.d(null, "");
+ Log.i(null, "");
+ Log.w(null, "");
+ Log.e(null, "");
+ Log.wtf(null, "");
+ Log.wtfStack(null, "");
+ Log.println(Log.INFO, null, "");
+
+ // Implicit assertions of not crashing.
+ }
+
+ @Test
+ public void nullTagWithThrowable() {
+ Log.v(null, "", new Throwable());
+ Log.d(null, "", new Throwable());
+ Log.i(null, "", new Throwable());
+ Log.w(null, "", new Throwable());
+ Log.e(null, "", new Throwable());
+ Log.wtf(null, "", new Throwable());
+ Log.printlns(Log.LOG_ID_MAIN, Log.INFO, null, "", new Throwable());
+
+ // Implicit assertions of not crashing.
+ }
+
+ @Test
+ public void nullMessage() {
+ try {
+ Log.v("", null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ try {
+ Log.d("", null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ try {
+ Log.i("", null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ try {
+ // Explicit cast needed because there's a weird (String, Throwable) overload.
+ Log.w("", (String) null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ try {
+ Log.e("", null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+
+ Log.wtf("", (String) null);
+ Log.wtfStack("", (String) null);
+
+ // Implicit assertion of not crashing.
+
+ try {
+ Log.println(Log.INFO, "", null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ @Test
+ public void nullMessageWithThrowable() {
+ Log.v("", null, new Throwable());
+ Log.d("", null, new Throwable());
+ Log.i("", null, new Throwable());
+ Log.w("", null, new Throwable());
+ Log.e("", null, new Throwable());
+ Log.wtf("", null, new Throwable());
+
+ // Implicit assertions of not crashing.
+
+ try {
+ Log.printlns(Log.LOG_ID_MAIN, Log.INFO, "", null, new Throwable());
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ @Test
+ public void nullThrowable() {
+ Log.v("", "", null);
+ Log.d("", "", null);
+ Log.i("", "", null);
+ Log.w("", "", null);
+ Log.e("", "", null);
+ Log.wtf("", "", null);
+
+ // Warning has its own (String, Throwable) overload.
+ Log.w("", (Throwable) null);
+
+ Log.printlns(Log.LOG_ID_MAIN, Log.INFO, "", "", null);
+
+ // Implicit assertions of not crashing.
+
+ // WTF has its own (String, Throwable) overload with different behavior.
+ try {
+ Log.wtf("", (Throwable) null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ @Test
+ public void nullMessageWithNullThrowable() {
+ Log.v("", null, null);
+ Log.d("", null, null);
+ Log.i("", null, null);
+ Log.w("", null, null);
+ Log.e("", null, null);
+ Log.wtf("", null, null);
+
+ // Implicit assertions of not crashing.
+
+ try {
+ Log.printlns(Log.LOG_ID_MAIN, Log.INFO, "", null, null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ @Test
+ public void nullTagIsLoggable() {
+ Log.isLoggable(null, Log.INFO);
+
+ // Implicit assertion of not crashing.
+ }
+
+ @Test
+ public void nullGetStackTraceString() {
+ assertNotNull(Log.getStackTraceString(null));
+ }
+}
diff --git a/core/tests/coretests/src/android/util/TimestampedValueTest.java b/core/tests/coretests/src/android/util/TimestampedValueTest.java
new file mode 100644
index 000000000000..03b4abd9b7a3
--- /dev/null
+++ b/core/tests/coretests/src/android/util/TimestampedValueTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
+
+import android.os.Parcel;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class TimestampedValueTest {
+
+ @Test
+ public void testEqualsAndHashcode() {
+ TimestampedValue<String> one1000one = new TimestampedValue<>(1000, "one");
+ assertEqualsAndHashCode(one1000one, one1000one);
+
+ TimestampedValue<String> one1000two = new TimestampedValue<>(1000, "one");
+ assertEqualsAndHashCode(one1000one, one1000two);
+
+ TimestampedValue<String> two1000 = new TimestampedValue<>(1000, "two");
+ assertNotEquals(one1000one, two1000);
+
+ TimestampedValue<String> one2000 = new TimestampedValue<>(2000, "one");
+ assertNotEquals(one1000one, one2000);
+ }
+
+ private static void assertEqualsAndHashCode(Object one, Object two) {
+ assertEquals(one, two);
+ assertEquals(one.hashCode(), two.hashCode());
+ }
+
+ @Test
+ public void testParceling() {
+ TimestampedValue<String> stringValue = new TimestampedValue<>(1000, "Hello");
+ Parcel parcel = Parcel.obtain();
+ try {
+ TimestampedValue.writeToParcel(parcel, stringValue);
+
+ parcel.setDataPosition(0);
+
+ TimestampedValue<String> stringValueCopy =
+ TimestampedValue.readFromParcel(parcel, null /* classLoader */, String.class);
+ assertEquals(stringValue, stringValueCopy);
+ } finally {
+ parcel.recycle();
+ }
+ }
+
+ @Test
+ public void testParceling_valueClassOk() {
+ TimestampedValue<String> stringValue = new TimestampedValue<>(1000, "Hello");
+ Parcel parcel = Parcel.obtain();
+ try {
+ TimestampedValue.writeToParcel(parcel, stringValue);
+
+ parcel.setDataPosition(0);
+
+ TimestampedValue<Object> stringValueCopy =
+ TimestampedValue.readFromParcel(parcel, null /* classLoader */, Object.class);
+ assertEquals(stringValue, stringValueCopy);
+ } finally {
+ parcel.recycle();
+ }
+ }
+
+ @Test
+ public void testParceling_valueClassIncompatible() {
+ TimestampedValue<String> stringValue = new TimestampedValue<>(1000, "Hello");
+ Parcel parcel = Parcel.obtain();
+ try {
+ TimestampedValue.writeToParcel(parcel, stringValue);
+
+ parcel.setDataPosition(0);
+
+ TimestampedValue.readFromParcel(parcel, null /* classLoader */, Double.class);
+ fail();
+ } catch (RuntimeException expected) {
+ } finally {
+ parcel.recycle();
+ }
+ }
+
+ @Test
+ public void testParceling_nullValue() {
+ TimestampedValue<String> nullValue = new TimestampedValue<>(1000, null);
+ Parcel parcel = Parcel.obtain();
+ try {
+ TimestampedValue.writeToParcel(parcel, nullValue);
+
+ parcel.setDataPosition(0);
+
+ TimestampedValue<Object> nullValueCopy =
+ TimestampedValue.readFromParcel(parcel, null /* classLoader */, String.class);
+ assertEquals(nullValue, nullValueCopy);
+ } finally {
+ parcel.recycle();
+ }
+ }
+
+ @Test
+ public void testReferenceTimeDifference() {
+ TimestampedValue<Long> value1 = new TimestampedValue<>(1000, 123L);
+ assertEquals(0, TimestampedValue.referenceTimeDifference(value1, value1));
+
+ TimestampedValue<Long> value2 = new TimestampedValue<>(1, 321L);
+ assertEquals(999, TimestampedValue.referenceTimeDifference(value1, value2));
+ assertEquals(-999, TimestampedValue.referenceTimeDifference(value2, value1));
+ }
+}
diff --git a/core/tests/coretests/src/android/view/KeyEventTest.java b/core/tests/coretests/src/android/view/KeyEventTest.java
new file mode 100644
index 000000000000..b9d95e542f11
--- /dev/null
+++ b/core/tests/coretests/src/android/view/KeyEventTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static android.view.Display.INVALID_DISPLAY;
+
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class KeyEventTest {
+
+ private static final int DOWN_TIME = 50;
+ private static final long EVENT_TIME = 100;
+ private static final int ACTION = KeyEvent.ACTION_DOWN;
+ private static final int KEYCODE = KeyEvent.KEYCODE_0;
+ private static final int REPEAT = 0;
+ private static final int METASTATE = 0;
+ private static final int DEVICE_ID = 0;
+ private static final int SCAN_CODE = 0;
+ private static final int FLAGS = 0;
+ private static final int SOURCE = InputDevice.SOURCE_KEYBOARD;
+ private static final String CHARACTERS = null;
+
+ @Test
+ public void testObtain() {
+ KeyEvent keyEvent = KeyEvent.obtain(DOWN_TIME, EVENT_TIME, ACTION, KEYCODE, REPEAT,
+ METASTATE, DEVICE_ID, SCAN_CODE, FLAGS, SOURCE, CHARACTERS);
+ assertEquals(DOWN_TIME, keyEvent.getDownTime());
+ assertEquals(EVENT_TIME, keyEvent.getEventTime());
+ assertEquals(ACTION, keyEvent.getAction());
+ assertEquals(KEYCODE, keyEvent.getKeyCode());
+ assertEquals(REPEAT, keyEvent.getRepeatCount());
+ assertEquals(METASTATE, keyEvent.getMetaState());
+ assertEquals(DEVICE_ID, keyEvent.getDeviceId());
+ assertEquals(SCAN_CODE, keyEvent.getScanCode());
+ assertEquals(FLAGS, keyEvent.getFlags());
+ assertEquals(SOURCE, keyEvent.getSource());
+ assertEquals(INVALID_DISPLAY, keyEvent.getDisplayId());
+ assertEquals(CHARACTERS, keyEvent.getCharacters());
+ }
+
+ @Test
+ public void testObtainFromKeyEvent() {
+ KeyEvent keyEvent = KeyEvent.obtain(DOWN_TIME, EVENT_TIME, ACTION, KEYCODE, REPEAT,
+ METASTATE, DEVICE_ID, SCAN_CODE, FLAGS, SOURCE, CHARACTERS);
+ KeyEvent keyEvent2 = KeyEvent.obtain(keyEvent);
+ assertEquals(keyEvent.getDownTime(), keyEvent2.getDownTime());
+ assertEquals(keyEvent.getEventTime(), keyEvent2.getEventTime());
+ assertEquals(keyEvent.getAction(), keyEvent2.getAction());
+ assertEquals(keyEvent.getKeyCode(), keyEvent2.getKeyCode());
+ assertEquals(keyEvent.getRepeatCount(), keyEvent2.getRepeatCount());
+ assertEquals(keyEvent.getMetaState(), keyEvent2.getMetaState());
+ assertEquals(keyEvent.getDeviceId(), keyEvent2.getDeviceId());
+ assertEquals(keyEvent.getScanCode(), keyEvent2.getScanCode());
+ assertEquals(keyEvent.getFlags(), keyEvent2.getFlags());
+ assertEquals(keyEvent.getSource(), keyEvent2.getSource());
+ assertEquals(keyEvent.getDisplayId(), keyEvent2.getDisplayId());
+ assertEquals(keyEvent.getCharacters(), keyEvent2.getCharacters());
+ }
+
+ @Test
+ public void testObtainWithDisplayId() {
+ final int displayId = 5;
+ KeyEvent keyEvent = KeyEvent.obtain(DOWN_TIME, EVENT_TIME, ACTION, KEYCODE, REPEAT,
+ METASTATE, DEVICE_ID, SCAN_CODE, FLAGS, SOURCE, displayId, CHARACTERS);
+ assertEquals(DOWN_TIME, keyEvent.getDownTime());
+ assertEquals(EVENT_TIME, keyEvent.getEventTime());
+ assertEquals(ACTION, keyEvent.getAction());
+ assertEquals(KEYCODE, keyEvent.getKeyCode());
+ assertEquals(REPEAT, keyEvent.getRepeatCount());
+ assertEquals(METASTATE, keyEvent.getMetaState());
+ assertEquals(DEVICE_ID, keyEvent.getDeviceId());
+ assertEquals(SCAN_CODE, keyEvent.getScanCode());
+ assertEquals(FLAGS, keyEvent.getFlags());
+ assertEquals(SOURCE, keyEvent.getSource());
+ assertEquals(displayId, keyEvent.getDisplayId());
+ assertEquals(CHARACTERS, keyEvent.getCharacters());
+ }
+}
diff --git a/core/tests/coretests/src/android/view/MotionEventTest.java b/core/tests/coretests/src/android/view/MotionEventTest.java
new file mode 100644
index 000000000000..1a480c77ada0
--- /dev/null
+++ b/core/tests/coretests/src/android/view/MotionEventTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static android.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.TOOL_TYPE_FINGER;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.MotionEvent.PointerCoords;
+import android.view.MotionEvent.PointerProperties;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class MotionEventTest {
+
+ @Test
+ public void testObtainWithDisplayId() {
+ final int pointerCount = 1;
+ PointerProperties[] properties = new PointerProperties[pointerCount];
+ final PointerCoords[] coords = new PointerCoords[pointerCount];
+ for (int i = 0; i < pointerCount; i++) {
+ final PointerCoords c = new PointerCoords();
+ c.x = i * 10;
+ c.y = i * 20;
+ coords[i] = c;
+ final PointerProperties p = new PointerProperties();
+ p.id = i;
+ p.toolType = TOOL_TYPE_FINGER;
+ properties[i] = p;
+ }
+
+ int displayId = 2;
+ MotionEvent motionEvent = MotionEvent.obtain(0, 0, ACTION_DOWN,
+ pointerCount, properties, coords,
+ 0, 0, 0, 0, 0, 0, InputDevice.SOURCE_TOUCHSCREEN, displayId, 0);
+ assertEquals(displayId, motionEvent.getDisplayId());
+
+ displayId = 5;
+ motionEvent.setDisplayId(displayId);
+ assertEquals(displayId, motionEvent.getDisplayId());
+ motionEvent.recycle();
+
+ // If invalid PointerProperties object is passed to obtain,
+ // there should not be a native crash, and instead it should just return null
+ properties[0] = null;
+ motionEvent = MotionEvent.obtain(0, 0, ACTION_DOWN,
+ pointerCount, properties, coords,
+ 0, 0, 0, 0, 0, 0, InputDevice.SOURCE_TOUCHSCREEN, displayId, 0);
+ assertNull(motionEvent);
+ }
+}
diff --git a/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java b/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java
new file mode 100644
index 000000000000..93ad41f08b06
--- /dev/null
+++ b/core/tests/coretests/src/android/view/ViewGroupTransientViewTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.fail;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.widget.FrameLayout;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class ViewGroupTransientViewTest {
+
+ @Rule
+ public ActivityTestRule<Activity> mActivityRule = new ActivityTestRule<>(Activity.class);
+
+ private FrameLayout mBasePanel;
+ private ViewGroup mTestViewGroup;
+ private TestView mTestView;
+
+ @Before
+ public void setUp() {
+ final Activity activity = mActivityRule.getActivity();
+ mBasePanel = new FrameLayout(activity);
+ mTestViewGroup = new FrameLayout(activity);
+ mTestView = new TestView(activity);
+ activity.runOnUiThread(() -> activity.setContentView(mBasePanel));
+ }
+
+ @UiThreadTest
+ @Test
+ public void addAndRemove_inNonAttachedViewGroup_shouldNotAttachAndDetach() {
+ mTestViewGroup.addTransientView(mTestView, 0);
+ assertEquals(0, mTestView.mAttachedCount);
+
+ mTestViewGroup.removeTransientView(mTestView);
+ assertEquals(0, mTestView.mDetachedCount);
+ }
+
+ @UiThreadTest
+ @Test
+ public void addAndRemove_inAttachedViewGroup_shouldAttachAndDetachOnce() {
+ mBasePanel.addView(mTestViewGroup);
+ mTestViewGroup.addTransientView(mTestView, 0);
+ assertEquals(mTestView, mTestViewGroup.getTransientView(0));
+ assertEquals(1, mTestViewGroup.getTransientViewCount());
+ assertEquals(1, mTestView.mAttachedCount);
+
+ mBasePanel.removeView(mTestViewGroup);
+ mTestViewGroup.removeTransientView(mTestView);
+ assertEquals(null, mTestViewGroup.getTransientView(0));
+ assertEquals(0, mTestViewGroup.getTransientViewCount());
+ assertEquals(1, mTestView.mDetachedCount);
+ }
+
+ @UiThreadTest
+ @Test
+ public void addRemoveAdd_noException() {
+ mBasePanel.addView(mTestViewGroup);
+ mTestViewGroup.addTransientView(mTestView, 1);
+ mTestViewGroup.removeTransientView(mTestView);
+ mTestViewGroup.addTransientView(mTestView, 2);
+ }
+
+ @UiThreadTest
+ @Test
+ public void reAddBeforeRemove_shouldThrowException() {
+ mTestViewGroup.addView(mTestView);
+
+ try {
+ mTestViewGroup.addTransientView(mTestView, 0);
+ fail("Not allow to add as transient view before removing it");
+ } catch (IllegalStateException e) {
+ // Expected
+ }
+
+ mTestViewGroup.removeView(mTestView);
+ mTestViewGroup.addTransientView(mTestView, 0);
+ try {
+ mTestViewGroup.addTransientView(mTestView, 1);
+ fail("Not allow to add the same transient view again");
+ } catch (IllegalStateException e) {
+ // Expected
+ }
+ }
+
+ @Test
+ public void drawTransientView() throws Exception {
+ // For view can be drawn if keyguard is active.
+ mActivityRule.getActivity().setShowWhenLocked(true);
+
+ final CountDownLatch latch = new CountDownLatch(1);
+ mTestView.mOnDraw = () -> latch.countDown();
+
+ mActivityRule.getActivity().runOnUiThread(() -> {
+ mBasePanel.addView(mTestViewGroup);
+ mTestViewGroup.addTransientView(mTestView, 0);
+ });
+
+ if (!latch.await(3, TimeUnit.SECONDS)) {
+ fail("Transient view does not draw");
+ }
+ }
+
+ private static class TestView extends View {
+ int mAttachedCount;
+ int mDetachedCount;
+ Runnable mOnDraw;
+
+ TestView(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mAttachedCount++;
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mDetachedCount++;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mOnDraw != null) {
+ mOnDraw.run();
+ mOnDraw = null;
+ }
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/view/ViewInvalidateTest.java b/core/tests/coretests/src/android/view/ViewInvalidateTest.java
index 9de7d9c6b375..115504b50adf 100644
--- a/core/tests/coretests/src/android/view/ViewInvalidateTest.java
+++ b/core/tests/coretests/src/android/view/ViewInvalidateTest.java
@@ -49,7 +49,6 @@ public class ViewInvalidateTest {
public ActivityTestRule<Activity> mActivityRule = new ActivityTestRule<>(Activity.class);
private static final int INVAL_TEST_FLAG_MASK = View.PFLAG_DIRTY
- | View.PFLAG_DIRTY_OPAQUE
| View.PFLAG_DRAWN
| View.PFLAG_DRAWING_CACHE_VALID
| View.PFLAG_INVALIDATED
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
index 6414c204cb3a..7fa6ce4d35ee 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
@@ -16,6 +16,8 @@
package android.view.accessibility;
+import static junit.framework.Assert.assertEquals;
+
import static org.hamcrest.Matchers.emptyCollectionOf;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasItem;
@@ -33,6 +35,8 @@ import com.android.internal.util.CollectionUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import java.util.ArrayList;
@LargeTest
@@ -41,13 +45,19 @@ public class AccessibilityNodeInfoTest {
// The number of fields tested in the corresponding CTS AccessibilityNodeInfoTest:
// See fullyPopulateAccessibilityNodeInfo, assertEqualsAccessibilityNodeInfo,
// and assertAccessibilityNodeInfoCleared in that class.
- private static final int NUM_MARSHALLED_PROPERTIES = 35;
+ private static final int NUM_MARSHALLED_PROPERTIES = 33;
/**
* The number of properties that are purposely not marshalled
* mOriginalText - Used when resolving clickable spans; intentionally not parceled
+ * mSealed - Unparceling sets the sealed bit
+ * mConnectionId - Set after unparceling. Actually is parceled, but probably shouldn't be.
*/
- private static final int NUM_NONMARSHALLED_PROPERTIES = 1;
+ private static final int NUM_NONMARSHALLED_PROPERTIES = 3;
+
+ // The number of flags held in boolean properties. Their values should also be double-checked
+ // in the methods above.
+ private static final int NUM_BOOLEAN_PROPERTIES = 22;
@Test
public void testStandardActions_serializationFlagIsValid() {
@@ -130,4 +140,19 @@ public class AccessibilityNodeInfoTest {
AccessibilityEventTest.assertNoNewNonStaticFieldsAdded(AccessibilityNodeInfo.class,
NUM_MARSHALLED_PROPERTIES + NUM_NONMARSHALLED_PROPERTIES);
}
+
+ @Test
+ public void updateCtsToTestNewBooleanProperties() {
+ int booleanPropertiesCount = 0;
+
+ for (Field field : AccessibilityNodeInfo.class.getDeclaredFields()) {
+ if (((field.getModifiers() & Modifier.STATIC) != 0)
+ && (field.getName().contains("BOOLEAN_PROPERTY"))) {
+ booleanPropertiesCount++;
+ }
+ }
+
+ assertEquals("New boolean properties. Make sure you're testing them in CTS",
+ NUM_BOOLEAN_PROPERTIES, booleanPropertiesCount);
+ }
}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
index c8a53cc86347..e891fc9d6134 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
@@ -244,16 +244,16 @@ public class TextClassificationManagerTest {
@Test
public void testGenerateLinks_exclude() {
if (isTextClassifierDisabled()) return;
- String text = "The number is +12122537077. See you tonight!";
+ String text = "You want apple@banana.com. See you tonight!";
List<String> hints = Collections.EMPTY_LIST;
List<String> included = Collections.EMPTY_LIST;
- List<String> excluded = Arrays.asList(TextClassifier.TYPE_PHONE);
+ List<String> excluded = Arrays.asList(TextClassifier.TYPE_EMAIL);
TextLinks.Request request = new TextLinks.Request.Builder(text)
.setEntityConfig(TextClassifier.EntityConfig.create(hints, included, excluded))
.setDefaultLocales(LOCALES)
.build();
assertThat(mClassifier.generateLinks(request),
- not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE)));
+ not(isTextLinksContaining(text, "apple@banana.com", TextClassifier.TYPE_EMAIL)));
}
@Test
@@ -273,16 +273,16 @@ public class TextClassificationManagerTest {
@Test
public void testGenerateLinks_exclude_override() {
if (isTextClassifierDisabled()) return;
- String text = "The number is +12122537077. See you tonight!";
+ String text = "You want apple@banana.com. See you tonight!";
List<String> hints = Collections.EMPTY_LIST;
- List<String> included = Arrays.asList(TextClassifier.TYPE_PHONE);
- List<String> excluded = Arrays.asList(TextClassifier.TYPE_PHONE);
+ List<String> included = Arrays.asList(TextClassifier.TYPE_EMAIL);
+ List<String> excluded = Arrays.asList(TextClassifier.TYPE_EMAIL);
TextLinks.Request request = new TextLinks.Request.Builder(text)
.setEntityConfig(TextClassifier.EntityConfig.create(hints, included, excluded))
.setDefaultLocales(LOCALES)
.build();
assertThat(mClassifier.generateLinks(request),
- not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE)));
+ not(isTextLinksContaining(text, "apple@banana.com", TextClassifier.TYPE_EMAIL)));
}
@Test
diff --git a/core/tests/coretests/src/android/widget/DateTimeViewTest.java b/core/tests/coretests/src/android/widget/DateTimeViewTest.java
index fbf0d36bac09..40a6b7a43f53 100644
--- a/core/tests/coretests/src/android/widget/DateTimeViewTest.java
+++ b/core/tests/coretests/src/android/widget/DateTimeViewTest.java
@@ -31,11 +31,25 @@ public class DateTimeViewTest {
@UiThreadTest
@Test
public void additionalOnDetachedFromWindow_noException() {
- final DateTimeView dateTimeView = new DateTimeView(InstrumentationRegistry.getContext());
- dateTimeView.onAttachedToWindow();
- dateTimeView.onAttachedToWindow();
+ final TestDateTimeView dateTimeView = new TestDateTimeView();
+ dateTimeView.attachedToWindow();
+ dateTimeView.detachedFromWindow();
// Even there is an additional detach (abnormal), DateTimeView should not unregister
// receiver again that raises "java.lang.IllegalArgumentException: Receiver not registered".
- dateTimeView.onDetachedFromWindow();
+ dateTimeView.detachedFromWindow();
+ }
+
+ private static class TestDateTimeView extends DateTimeView {
+ TestDateTimeView() {
+ super(InstrumentationRegistry.getContext());
+ }
+
+ void attachedToWindow() {
+ super.onAttachedToWindow();
+ }
+
+ void detachedFromWindow() {
+ super.onDetachedFromWindow();
+ }
}
}
diff --git a/core/tests/coretests/src/android/widget/TextViewTest.java b/core/tests/coretests/src/android/widget/TextViewTest.java
index 4f1efbfed5f7..1c5610b1bc7d 100644
--- a/core/tests/coretests/src/android/widget/TextViewTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewTest.java
@@ -23,6 +23,7 @@ import static junit.framework.Assert.assertTrue;
import android.app.Activity;
import android.app.Instrumentation;
+import android.content.Context;
import android.content.Intent;
import android.graphics.Paint;
import android.platform.test.annotations.Presubmit;
@@ -44,6 +45,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.lang.reflect.Field;
import java.util.Locale;
/**
@@ -320,6 +322,15 @@ public class TextViewTest {
assertTrue(mTextView.useDynamicLayout());
}
+ @Test
+ @UiThreadTest
+ public void testConstructor_doesNotLeaveTextNull() {
+ mTextView = new NullSetTextTextView(mActivity);
+ // Check that mText and mTransformed are empty string instead of null.
+ assertEquals("", mTextView.getText().toString());
+ assertEquals("", mTextView.getTransformed().toString());
+ }
+
private String createLongText() {
int size = 600 * 1000;
final StringBuilder builder = new StringBuilder(size);
@@ -328,4 +339,26 @@ public class TextViewTest {
}
return builder.toString();
}
+
+ private class NullSetTextTextView extends TextView {
+ NullSetTextTextView(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void setText(CharSequence text, BufferType type) {
+ // #setText will be called from the TextView constructor. Here we reproduce
+ // the situation when the method sets mText and mTransformed to null.
+ try {
+ final Field textField = TextView.class.getDeclaredField("mText");
+ textField.setAccessible(true);
+ textField.set(this, null);
+ final Field transformedField = TextView.class.getDeclaredField("mTransformed");
+ transformedField.setAccessible(true);
+ transformedField.set(this, null);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ // Empty.
+ }
+ }
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java
index 13d6749cbc2c..8a83518705f8 100644
--- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java
+++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodSubtypeSwitchingControllerTest.java
@@ -31,6 +31,7 @@ import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
import com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ControllerImpl;
import com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem;
+import com.android.internal.inputmethod.InputMethodUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -78,7 +79,7 @@ public class InputMethodSubtypeSwitchingControllerTest {
ri.serviceInfo = si;
List<InputMethodSubtype> subtypes = null;
if (subtypeLocales != null) {
- subtypes = new ArrayList<>();
+ subtypes = new ArrayList<InputMethodSubtype>();
for (String subtypeLocale : subtypeLocales) {
subtypes.add(createDummySubtype(subtypeLocale));
}
@@ -128,7 +129,7 @@ public class InputMethodSubtypeSwitchingControllerTest {
}
private static List<ImeSubtypeListItem> createEnabledImeSubtypes() {
- final List<ImeSubtypeListItem> items = new ArrayList<>();
+ final List<ImeSubtypeListItem> items = new ArrayList<ImeSubtypeListItem>();
addDummyImeSubtypeListItems(items, "LatinIme", "LatinIme", Arrays.asList("en_US", "fr"),
true /* supportsSwitchingToNextInputMethod*/);
addDummyImeSubtypeListItems(items, "switchUnawareLatinIme", "switchUnawareLatinIme",
@@ -144,7 +145,7 @@ public class InputMethodSubtypeSwitchingControllerTest {
}
private static List<ImeSubtypeListItem> createDisabledImeSubtypes() {
- final List<ImeSubtypeListItem> items = new ArrayList<>();
+ final List<ImeSubtypeListItem> items = new ArrayList<ImeSubtypeListItem>();
addDummyImeSubtypeListItems(items,
"UnknownIme", "UnknownIme",
Arrays.asList("en_US", "hi"),
@@ -160,18 +161,15 @@ public class InputMethodSubtypeSwitchingControllerTest {
}
private void assertNextInputMethod(final ControllerImpl controller,
- final boolean onlyCurrentIme, final ImeSubtypeListItem currentItem,
- final ImeSubtypeListItem nextItem, final ImeSubtypeListItem prevItem) {
+ final boolean onlyCurrentIme,
+ final ImeSubtypeListItem currentItem, final ImeSubtypeListItem nextItem) {
InputMethodSubtype subtype = null;
if (currentItem.mSubtypeName != null) {
subtype = createDummySubtype(currentItem.mSubtypeName.toString());
}
final ImeSubtypeListItem nextIme = controller.getNextInputMethod(onlyCurrentIme,
- currentItem.mImi, subtype, true /* forward */);
+ currentItem.mImi, subtype);
assertEquals(nextItem, nextIme);
- final ImeSubtypeListItem prevIme = controller.getNextInputMethod(onlyCurrentIme,
- currentItem.mImi, subtype, false /* forward */);
- assertEquals(prevItem, prevIme);
}
private void assertRotationOrder(final ControllerImpl controller,
@@ -180,13 +178,11 @@ public class InputMethodSubtypeSwitchingControllerTest {
final int N = expectedRotationOrderOfImeSubtypeList.length;
for (int i = 0; i < N; i++) {
final int currentIndex = i;
- final int prevIndex = (currentIndex + N - 1) % N;
final int nextIndex = (currentIndex + 1) % N;
final ImeSubtypeListItem currentItem =
expectedRotationOrderOfImeSubtypeList[currentIndex];
final ImeSubtypeListItem nextItem = expectedRotationOrderOfImeSubtypeList[nextIndex];
- final ImeSubtypeListItem prevItem = expectedRotationOrderOfImeSubtypeList[prevIndex];
- assertNextInputMethod(controller, onlyCurrentIme, currentItem, nextItem, prevItem);
+ assertNextInputMethod(controller, onlyCurrentIme, currentItem, nextItem);
}
}
@@ -234,29 +230,29 @@ public class InputMethodSubtypeSwitchingControllerTest {
assertRotationOrder(controller, true /* onlyCurrentIme */,
switchingUnawarelatinIme_en_UK, switchingUnawarelatinIme_hi);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- subtypeUnawareIme, null, null);
+ subtypeUnawareIme, null);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- japaneseIme_ja_JP, null, null);
+ japaneseIme_ja_JP, null);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- switchUnawareJapaneseIme_ja_JP, null, null);
+ switchUnawareJapaneseIme_ja_JP, null);
// Make sure that disabled IMEs are not accepted.
assertNextInputMethod(controller, false /* onlyCurrentIme */,
- disabledIme_en_US, null, null);
+ disabledIme_en_US, null);
assertNextInputMethod(controller, false /* onlyCurrentIme */,
- disabledIme_hi, null, null);
+ disabledIme_hi, null);
assertNextInputMethod(controller, false /* onlyCurrentIme */,
- disabledSwitchingUnawareIme, null, null);
+ disabledSwitchingUnawareIme, null);
assertNextInputMethod(controller, false /* onlyCurrentIme */,
- disabledSubtypeUnawareIme, null, null);
+ disabledSubtypeUnawareIme, null);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- disabledIme_en_US, null, null);
+ disabledIme_en_US, null);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- disabledIme_hi, null, null);
+ disabledIme_hi, null);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- disabledSwitchingUnawareIme, null, null);
+ disabledSwitchingUnawareIme, null);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- disabledSubtypeUnawareIme, null, null);
+ disabledSubtypeUnawareIme, null);
}
@Test
@@ -290,7 +286,7 @@ public class InputMethodSubtypeSwitchingControllerTest {
japaneseIme_ja_JP, latinIme_fr, latinIme_en_US);
// Check onlyCurrentIme == true.
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- japaneseIme_ja_JP, null, null);
+ japaneseIme_ja_JP, null);
assertRotationOrder(controller, true /* onlyCurrentIme */,
latinIme_fr, latinIme_en_US);
assertRotationOrder(controller, true /* onlyCurrentIme */,
@@ -314,9 +310,9 @@ public class InputMethodSubtypeSwitchingControllerTest {
assertRotationOrder(controller, true /* onlyCurrentIme */,
switchingUnawarelatinIme_en_UK, switchingUnawarelatinIme_hi);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- subtypeUnawareIme, null, null);
+ subtypeUnawareIme, null);
assertNextInputMethod(controller, true /* onlyCurrentIme */,
- switchUnawareJapaneseIme_ja_JP, null, null);
+ switchUnawareJapaneseIme_ja_JP, null);
// Rotation order should be preserved when created with the same subtype list.
final List<ImeSubtypeListItem> sameEnabledItems = createEnabledImeSubtypes();
@@ -342,7 +338,7 @@ public class InputMethodSubtypeSwitchingControllerTest {
@Test
public void testImeSubtypeListItem() throws Exception {
- final List<ImeSubtypeListItem> items = new ArrayList<>();
+ final List<ImeSubtypeListItem> items = new ArrayList<ImeSubtypeListItem>();
addDummyImeSubtypeListItems(items, "LatinIme", "LatinIme",
Arrays.asList("en_US", "fr", "en", "en_uk", "enn", "e", "EN_US"),
true /* supportsSwitchingToNextInputMethod*/);
diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
index 1fd24e3f237e..3064afaeaab1 100644
--- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
@@ -40,8 +40,6 @@ import android.os.Parcel;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.util.ArrayMap;
-import android.util.ArraySet;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
@@ -87,7 +85,6 @@ public class InputMethodUtilsTest {
private static final String SUBTYPE_MODE_HANDWRITING = "handwriting";
private static final String SUBTYPE_MODE_ANY = null;
private static final String EXTRA_VALUE_PAIR_SEPARATOR = ",";
- private static final String EXTRA_VALUE_ASCII_CAPABLE = "AsciiCapable";
private static final String EXTRA_VALUE_ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE =
"EnabledWhenDefaultIsNotAsciiCapable";
@@ -910,13 +907,6 @@ public class InputMethodUtilsTest {
subtypeExtraValue.append(EXTRA_VALUE_ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE);
}
- // TODO: Remove following code. InputMethodSubtype#isAsciiCapable() has been publicly
- // available since API level 19 (KitKat). We no longer need to rely on extra value.
- if (isAsciiCapable) {
- subtypeExtraValue.append(EXTRA_VALUE_PAIR_SEPARATOR);
- subtypeExtraValue.append(EXTRA_VALUE_ASCII_CAPABLE);
- }
-
return new InputMethodSubtypeBuilder()
.setSubtypeNameResId(0)
.setSubtypeIconResId(0)
@@ -1192,248 +1182,6 @@ public class InputMethodUtilsTest {
}
@Test
- public void testParseInputMethodsAndSubtypesString() {
- // Trivial cases.
- {
- assertTrue(InputMethodUtils.parseInputMethodsAndSubtypesString("").isEmpty());
- assertTrue(InputMethodUtils.parseInputMethodsAndSubtypesString(null).isEmpty());
- }
-
- // No subtype cases.
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString("ime0");
- assertEquals(1, r.size());
- assertTrue(r.containsKey("ime0"));
- assertTrue(r.get("ime0").isEmpty());
- }
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString("ime0:ime1");
- assertEquals(2, r.size());
- assertTrue(r.containsKey("ime0"));
- assertTrue(r.get("ime0").isEmpty());
- assertTrue(r.containsKey("ime1"));
- assertTrue(r.get("ime1").isEmpty());
- }
-
- // Input metho IDs and their subtypes.
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString("ime0;subtype0");
- assertEquals(1, r.size());
- assertTrue(r.containsKey("ime0"));
- ArraySet<String> subtypes = r.get("ime0");
- assertEquals(1, subtypes.size());
- assertTrue(subtypes.contains("subtype0"));
- }
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString("ime0;subtype0;subtype0");
- assertEquals(1, r.size());
- assertTrue(r.containsKey("ime0"));
- ArraySet<String> subtypes = r.get("ime0");
- assertEquals(1, subtypes.size());
- assertTrue(subtypes.contains("subtype0"));
- }
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString("ime0;subtype0;subtype1");
- assertEquals(1, r.size());
- assertTrue(r.containsKey("ime0"));
- ArraySet<String> subtypes = r.get("ime0");
- assertEquals(2, subtypes.size());
- assertTrue(subtypes.contains("subtype0"));
- assertTrue(subtypes.contains("subtype1"));
- }
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString(
- "ime0;subtype0:ime1;subtype1");
- assertEquals(2, r.size());
- assertTrue(r.containsKey("ime0"));
- assertTrue(r.containsKey("ime1"));
- ArraySet<String> subtypes0 = r.get("ime0");
- assertEquals(1, subtypes0.size());
- assertTrue(subtypes0.contains("subtype0"));
-
- ArraySet<String> subtypes1 = r.get("ime1");
- assertEquals(1, subtypes1.size());
- assertTrue(subtypes1.contains("subtype1"));
- }
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString(
- "ime0;subtype0;subtype1:ime1;subtype2");
- assertEquals(2, r.size());
- assertTrue(r.containsKey("ime0"));
- assertTrue(r.containsKey("ime1"));
- ArraySet<String> subtypes0 = r.get("ime0");
- assertEquals(2, subtypes0.size());
- assertTrue(subtypes0.contains("subtype0"));
- assertTrue(subtypes0.contains("subtype1"));
-
- ArraySet<String> subtypes1 = r.get("ime1");
- assertEquals(1, subtypes1.size());
- assertTrue(subtypes1.contains("subtype2"));
- }
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString(
- "ime0;subtype0;subtype1:ime1;subtype1;subtype2");
- assertEquals(2, r.size());
- assertTrue(r.containsKey("ime0"));
- assertTrue(r.containsKey("ime1"));
- ArraySet<String> subtypes0 = r.get("ime0");
- assertEquals(2, subtypes0.size());
- assertTrue(subtypes0.contains("subtype0"));
- assertTrue(subtypes0.contains("subtype1"));
-
- ArraySet<String> subtypes1 = r.get("ime1");
- assertEquals(2, subtypes1.size());
- assertTrue(subtypes0.contains("subtype1"));
- assertTrue(subtypes1.contains("subtype2"));
- }
- {
- ArrayMap<String, ArraySet<String>> r =
- InputMethodUtils.parseInputMethodsAndSubtypesString(
- "ime0;subtype0;subtype1:ime1;subtype1;subtype2:ime2");
- assertEquals(3, r.size());
- assertTrue(r.containsKey("ime0"));
- assertTrue(r.containsKey("ime1"));
- assertTrue(r.containsKey("ime2"));
- ArraySet<String> subtypes0 = r.get("ime0");
- assertEquals(2, subtypes0.size());
- assertTrue(subtypes0.contains("subtype0"));
- assertTrue(subtypes0.contains("subtype1"));
-
- ArraySet<String> subtypes1 = r.get("ime1");
- assertEquals(2, subtypes1.size());
- assertTrue(subtypes0.contains("subtype1"));
- assertTrue(subtypes1.contains("subtype2"));
-
- ArraySet<String> subtypes2 = r.get("ime2");
- assertTrue(subtypes2.isEmpty());
- }
- }
-
- @Test
- public void testbuildInputMethodsAndSubtypesString() {
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- assertEquals("", InputMethodUtils.buildInputMethodsAndSubtypesString(map));
- }
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- map.put("ime0", new ArraySet<>());
- assertEquals("ime0", InputMethodUtils.buildInputMethodsAndSubtypesString(map));
- }
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- ArraySet<String> subtypes1 = new ArraySet<>();
- subtypes1.add("subtype0");
- map.put("ime0", subtypes1);
- assertEquals("ime0;subtype0", InputMethodUtils.buildInputMethodsAndSubtypesString(map));
- }
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- ArraySet<String> subtypes1 = new ArraySet<>();
- subtypes1.add("subtype0");
- subtypes1.add("subtype1");
- map.put("ime0", subtypes1);
-
- // We do not expect what order will be used to concatenate items in
- // InputMethodUtils.buildInputMethodsAndSubtypesString() hence enumerate all possible
- // permutations here.
- ArraySet<String> validSequences = new ArraySet<>();
- validSequences.add("ime0;subtype0;subtype1");
- validSequences.add("ime0;subtype1;subtype0");
- assertTrue(validSequences.contains(
- InputMethodUtils.buildInputMethodsAndSubtypesString(map)));
- }
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- map.put("ime0", new ArraySet<>());
- map.put("ime1", new ArraySet<>());
-
- ArraySet<String> validSequences = new ArraySet<>();
- validSequences.add("ime0:ime1");
- validSequences.add("ime1:ime0");
- assertTrue(validSequences.contains(
- InputMethodUtils.buildInputMethodsAndSubtypesString(map)));
- }
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- ArraySet<String> subtypes1 = new ArraySet<>();
- subtypes1.add("subtype0");
- map.put("ime0", subtypes1);
- map.put("ime1", new ArraySet<>());
-
- ArraySet<String> validSequences = new ArraySet<>();
- validSequences.add("ime0;subtype0:ime1");
- validSequences.add("ime1;ime0;subtype0");
- assertTrue(validSequences.contains(
- InputMethodUtils.buildInputMethodsAndSubtypesString(map)));
- }
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- ArraySet<String> subtypes1 = new ArraySet<>();
- subtypes1.add("subtype0");
- subtypes1.add("subtype1");
- map.put("ime0", subtypes1);
- map.put("ime1", new ArraySet<>());
-
- ArraySet<String> validSequences = new ArraySet<>();
- validSequences.add("ime0;subtype0;subtype1:ime1");
- validSequences.add("ime0;subtype1;subtype0:ime1");
- validSequences.add("ime1:ime0;subtype0;subtype1");
- validSequences.add("ime1:ime0;subtype1;subtype0");
- assertTrue(validSequences.contains(
- InputMethodUtils.buildInputMethodsAndSubtypesString(map)));
- }
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- ArraySet<String> subtypes1 = new ArraySet<>();
- subtypes1.add("subtype0");
- map.put("ime0", subtypes1);
-
- ArraySet<String> subtypes2 = new ArraySet<>();
- subtypes2.add("subtype1");
- map.put("ime1", subtypes2);
-
- ArraySet<String> validSequences = new ArraySet<>();
- validSequences.add("ime0;subtype0:ime1;subtype1");
- validSequences.add("ime1;subtype1:ime0;subtype0");
- assertTrue(validSequences.contains(
- InputMethodUtils.buildInputMethodsAndSubtypesString(map)));
- }
- {
- ArrayMap<String, ArraySet<String>> map = new ArrayMap<>();
- ArraySet<String> subtypes1 = new ArraySet<>();
- subtypes1.add("subtype0");
- subtypes1.add("subtype1");
- map.put("ime0", subtypes1);
-
- ArraySet<String> subtypes2 = new ArraySet<>();
- subtypes2.add("subtype2");
- subtypes2.add("subtype3");
- map.put("ime1", subtypes2);
-
- ArraySet<String> validSequences = new ArraySet<>();
- validSequences.add("ime0;subtype0;subtype1:ime1;subtype2;subtype3");
- validSequences.add("ime0;subtype1;subtype0:ime1;subtype2;subtype3");
- validSequences.add("ime0;subtype0;subtype1:ime1;subtype3;subtype2");
- validSequences.add("ime0;subtype1;subtype0:ime1;subtype3;subtype2");
- validSequences.add("ime1;subtype2;subtype3:ime0;subtype0;subtype1");
- validSequences.add("ime2;subtype3;subtype2:ime0;subtype0;subtype1");
- validSequences.add("ime3;subtype2;subtype3:ime0;subtype1;subtype0");
- validSequences.add("ime4;subtype3;subtype2:ime0;subtype1;subtype0");
- assertTrue(validSequences.contains(
- InputMethodUtils.buildInputMethodsAndSubtypesString(map)));
- }
- }
-
- @Test
public void testConstructLocaleFromString() throws Exception {
assertEquals(new Locale("en"), InputMethodUtils.constructLocaleFromString("en"));
assertEquals(new Locale("en", "US"), InputMethodUtils.constructLocaleFromString("en_US"));
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java
new file mode 100644
index 000000000000..10a318920646
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsHistoryTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.os;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Test BatteryStatsHistory.
+ */
+@RunWith(AndroidJUnit4.class)
+public class BatteryStatsHistoryTest {
+ private static final int MAX_HISTORY_FILES = 32;
+ private final BatteryStatsImpl mBatteryStatsImpl = new MockBatteryStatsImpl();
+ private final Parcel mHistoryBuffer = Parcel.obtain();
+ private File mSystemDir;
+ private File mHistoryDir;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ Context context = InstrumentationRegistry.getContext();
+ mSystemDir = context.getDataDir();
+ mHistoryDir = new File(mSystemDir, BatteryStatsHistory.HISTORY_DIR);
+ mHistoryDir.delete();
+ }
+
+ @Test
+ public void testConstruct() {
+ BatteryStatsHistory history =
+ new BatteryStatsHistory(mBatteryStatsImpl, mSystemDir, mHistoryBuffer);
+ verifyFileNumbers(history, Arrays.asList(0));
+ verifyActiveFile(history, "0.bin");
+ }
+
+ @Test
+ public void testCreateNextFile() {
+ BatteryStatsHistory history =
+ new BatteryStatsHistory(mBatteryStatsImpl, mSystemDir, mHistoryBuffer);
+
+ List<Integer> fileList = new ArrayList<>();
+ fileList.add(0);
+
+ // create file 1 to 31.
+ for (int i = 1; i < MAX_HISTORY_FILES; i++) {
+ fileList.add(i);
+ history.createNextFile();
+ verifyFileNumbers(history, fileList);
+ verifyActiveFile(history, i + ".bin");
+ }
+
+ // create file 32
+ history.createNextFile();
+ fileList.add(32);
+ fileList.remove(0);
+ // verify file 0 is deleted.
+ verifyFileDeleted("0.bin");
+ verifyFileNumbers(history, fileList);
+ verifyActiveFile(history, "32.bin");
+
+ // create file 33
+ history.createNextFile();
+ // verify file 1 is deleted
+ fileList.add(33);
+ fileList.remove(0);
+ verifyFileDeleted("1.bin");
+ verifyFileNumbers(history, fileList);
+ verifyActiveFile(history, "33.bin");
+
+ assertEquals(0, history.getHistoryUsedSize());
+
+ // create a new BatteryStatsHistory object, it will pick up existing history files.
+ BatteryStatsHistory history2 =
+ new BatteryStatsHistory(mBatteryStatsImpl, mSystemDir, mHistoryBuffer);
+ // verify construct can pick up all files from file system.
+ verifyFileNumbers(history2, fileList);
+ verifyActiveFile(history2, "33.bin");
+
+ history2.resetAllFiles();
+ // verify all existing files are deleted.
+ for (int i = 2; i < 33; ++i) {
+ verifyFileDeleted(i + ".bin");
+ }
+
+ // verify file 0 is created
+ verifyFileNumbers(history2, Arrays.asList(0));
+ verifyActiveFile(history2, "0.bin");
+
+ // create file 1.
+ history2.createNextFile();
+ verifyFileNumbers(history2, Arrays.asList(0, 1));
+ verifyActiveFile(history2, "1.bin");
+ }
+
+ private void verifyActiveFile(BatteryStatsHistory history, String file) {
+ final File expectedFile = new File(mHistoryDir, file);
+ assertEquals(expectedFile.getPath(), history.getActiveFile().getBaseFile().getPath());
+ assertTrue(expectedFile.exists());
+ }
+
+ private void verifyFileNumbers(BatteryStatsHistory history, List<Integer> fileList) {
+ assertEquals(fileList.size(), history.getFilesNumbers().size());
+ for (int i = 0; i < fileList.size(); i++) {
+ assertEquals(fileList.get(i), history.getFilesNumbers().get(i));
+ final File expectedFile =
+ new File(mHistoryDir, fileList.get(i) + ".bin");
+ assertTrue(expectedFile.exists());
+ }
+ }
+
+ private void verifyFileDeleted(String file) {
+ assertFalse(new File(mHistoryDir, file).exists());
+ }
+} \ No newline at end of file
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index 94492bad28a2..b798042f4761 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -26,6 +26,7 @@ import org.junit.runners.Suite;
BatteryStatsDualTimerTest.class,
BatteryStatsDurationTimerTest.class,
BatteryStatsHelperTest.class,
+ BatteryStatsHistoryTest.class,
BatteryStatsImplTest.class,
BatteryStatsNoteTest.class,
BatteryStatsSamplingTimerTest.class,
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
new file mode 100644
index 000000000000..d46c1543e0f0
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java
@@ -0,0 +1,406 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.internal.os;
+
+import android.os.Binder;
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.ArrayMap;
+import android.util.SparseArray;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+@Presubmit
+public class BinderCallsStatsTest {
+ private static final int TEST_UID = 1;
+ private static final int REQUEST_SIZE = 2;
+ private static final int REPLY_SIZE = 3;
+
+ @Test
+ public void testDetailedOff() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(false);
+
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ SparseArray<BinderCallsStats.UidEntry> uidEntries = bcs.getUidEntries();
+ assertEquals(1, uidEntries.size());
+ BinderCallsStats.UidEntry uidEntry = uidEntries.get(TEST_UID);
+ Assert.assertNotNull(uidEntry);
+ assertEquals(1, uidEntry.callCount);
+ assertEquals(10, uidEntry.cpuTimeMicros);
+ assertEquals("Detailed tracking off - no entries should be returned",
+ 0, uidEntry.getCallStatsList().size());
+
+ BinderCallsStats.UidEntry sampledEntries = bcs.getSampledEntries();
+ List<BinderCallsStats.CallStat> sampledCallStatsList = sampledEntries.getCallStatsList();
+ assertEquals(1, sampledCallStatsList.size());
+
+
+ assertEquals(1, sampledCallStatsList.get(0).callCount);
+ assertEquals(10, sampledCallStatsList.get(0).cpuTimeMicros);
+ assertEquals(binder.getClass().getName(), sampledCallStatsList.get(0).className);
+ assertEquals(1, sampledCallStatsList.get(0).msg);
+
+ callSession = bcs.callStarted(binder, 1);
+ bcs.time += 20;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ uidEntry = bcs.getUidEntries().get(TEST_UID);
+ assertEquals(2, uidEntry.callCount);
+ // When sampling is enabled, cpu time is only measured for the first transaction in the
+ // sampling interval, for others an average duration of previous transactions is used as
+ // approximation
+ assertEquals(20, uidEntry.cpuTimeMicros);
+ sampledCallStatsList = sampledEntries.getCallStatsList();
+ assertEquals(1, sampledCallStatsList.size());
+
+ callSession = bcs.callStarted(binder, 2);
+ bcs.time += 50;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+ uidEntry = bcs.getUidEntries().get(TEST_UID);
+ assertEquals(3, uidEntry.callCount);
+
+ // This is the first transaction of a new type, so the real CPU time will be measured
+ assertEquals(70, uidEntry.cpuTimeMicros);
+ sampledCallStatsList = sampledEntries.getCallStatsList();
+ assertEquals(2, sampledCallStatsList.size());
+ }
+
+ @Test
+ public void testDetailedOn() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(true);
+
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ SparseArray<BinderCallsStats.UidEntry> uidEntries = bcs.getUidEntries();
+ assertEquals(1, uidEntries.size());
+ BinderCallsStats.UidEntry uidEntry = uidEntries.get(TEST_UID);
+ Assert.assertNotNull(uidEntry);
+ assertEquals(1, uidEntry.callCount);
+ assertEquals(10, uidEntry.cpuTimeMicros);
+ assertEquals(1, uidEntry.getCallStatsList().size());
+
+ BinderCallsStats.UidEntry sampledEntries = bcs.getSampledEntries();
+ assertEquals("Sampling is not used when detailed tracking on",
+ 0, bcs.getSampledEntries().getCallStatsList().size());
+
+ List<BinderCallsStats.CallStat> callStatsList = uidEntry.getCallStatsList();
+ assertEquals(1, callStatsList.get(0).callCount);
+ assertEquals(10, callStatsList.get(0).cpuTimeMicros);
+ assertEquals(binder.getClass().getName(), callStatsList.get(0).className);
+ assertEquals(1, callStatsList.get(0).msg);
+
+ callSession = bcs.callStarted(binder, 1);
+ bcs.time += 20;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ uidEntry = bcs.getUidEntries().get(TEST_UID);
+ assertEquals(2, uidEntry.callCount);
+ assertEquals(30, uidEntry.cpuTimeMicros);
+ callStatsList = uidEntry.getCallStatsList();
+ assertEquals(1, callStatsList.size());
+
+ callSession = bcs.callStarted(binder, 2);
+ bcs.time += 50;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+ uidEntry = bcs.getUidEntries().get(TEST_UID);
+ assertEquals(3, uidEntry.callCount);
+
+ // This is the first transaction of a new type, so the real CPU time will be measured
+ assertEquals(80, uidEntry.cpuTimeMicros);
+ callStatsList = uidEntry.getCallStatsList();
+ assertEquals(2, callStatsList.size());
+ }
+
+ @Test
+ public void testDisabled() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setEnabled(false);
+
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ SparseArray<BinderCallsStats.UidEntry> uidEntries = bcs.getUidEntries();
+ assertEquals(0, uidEntries.size());
+ }
+
+ @Test
+ public void testDisableInBetweenCall() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setEnabled(true);
+
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.setEnabled(false);
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ SparseArray<BinderCallsStats.UidEntry> uidEntries = bcs.getUidEntries();
+ assertEquals(0, uidEntries.size());
+ }
+
+ @Test
+ public void testEnableInBetweenCall() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setEnabled(false);
+
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.setEnabled(true);
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ SparseArray<BinderCallsStats.UidEntry> uidEntries = bcs.getUidEntries();
+ assertEquals(0, uidEntries.size());
+ }
+
+ @Test
+ public void testSampling() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(false);
+ bcs.setSamplingInterval(2);
+
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ callSession = bcs.callStarted(binder, 1);
+ bcs.time += 1000; // shoud be ignored.
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ callSession = bcs.callStarted(binder, 1);
+ bcs.time += 50;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ SparseArray<BinderCallsStats.UidEntry> uidEntries = bcs.getUidEntries();
+ assertEquals(1, uidEntries.size());
+ BinderCallsStats.UidEntry uidEntry = uidEntries.get(TEST_UID);
+ Assert.assertNotNull(uidEntry);
+ assertEquals(3, uidEntry.callCount);
+ assertEquals(70, uidEntry.cpuTimeMicros);
+ assertEquals("Detailed tracking off - no entries should be returned",
+ 0, uidEntry.getCallStatsList().size());
+
+ BinderCallsStats.UidEntry sampledEntries = bcs.getSampledEntries();
+ List<BinderCallsStats.CallStat> sampledCallStatsList = sampledEntries.getCallStatsList();
+ assertEquals(1, sampledCallStatsList.size());
+ }
+
+ @Test
+ public void testTransactionCodeResolved() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(true);
+ Binder binder = new Binder() {
+ @Override
+ public String getTransactionName(int code) {
+ return "resolved";
+ }
+ };
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ List<BinderCallsStats.CallStat> callStatsList =
+ bcs.getUidEntries().get(TEST_UID).getCallStatsList();
+ assertEquals(1, callStatsList.get(0).msg);
+ assertEquals("resolved", callStatsList.get(0).methodName);
+ }
+
+ @Test
+ public void testParcelSize() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(true);
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ List<BinderCallsStats.CallStat> callStatsList =
+ bcs.getUidEntries().get(TEST_UID).getCallStatsList();
+
+ assertEquals(REQUEST_SIZE, callStatsList.get(0).maxRequestSizeBytes);
+ assertEquals(REPLY_SIZE, callStatsList.get(0).maxReplySizeBytes);
+ }
+
+ @Test
+ public void testMaxCpu() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(true);
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 50;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ List<BinderCallsStats.CallStat> callStatsList =
+ bcs.getUidEntries().get(TEST_UID).getCallStatsList();
+
+ assertEquals(50, callStatsList.get(0).maxCpuTimeMicros);
+ }
+
+ @Test
+ public void testMaxLatency() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(true);
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.elapsedTime += 5;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ callSession = bcs.callStarted(binder, 1);
+ bcs.elapsedTime += 1;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ List<BinderCallsStats.CallStat> callStatsList =
+ bcs.getUidEntries().get(TEST_UID).getCallStatsList();
+
+ assertEquals(5, callStatsList.get(0).maxLatencyMicros);
+ }
+
+ @Test
+ public void testGetHighestValues() {
+ List<Integer> list = Arrays.asList(1, 2, 3, 4);
+ List<Integer> highestValues = BinderCallsStats
+ .getHighestValues(list, value -> value, 0.8);
+ assertEquals(Arrays.asList(4, 3, 2), highestValues);
+ }
+
+ @Test
+ public void testExceptionCount() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(true);
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.callThrewException(callSession, new IllegalStateException());
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ callSession = bcs.callStarted(binder, 1);
+ bcs.callThrewException(callSession, new IllegalStateException());
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ callSession = bcs.callStarted(binder, 1);
+ bcs.callThrewException(callSession, new RuntimeException());
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ ArrayMap<String, Integer> expected = new ArrayMap<>();
+ expected.put("java.lang.IllegalStateException", 2);
+ expected.put("java.lang.RuntimeException", 1);
+ assertEquals(expected, bcs.getExceptionCounts());
+ }
+
+ @Test
+ public void testDumpDoesNotThrowException() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(true);
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.callThrewException(callSession, new IllegalStateException());
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ PrintWriter pw = new PrintWriter(new StringWriter());
+ bcs.dump(pw, new HashMap<>(), true);
+ }
+
+ @Test
+ public void testGetExportedStatsWhenDetailedTrackingDisabled() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(false);
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ assertEquals(0, bcs.getExportedCallStats().size());
+ }
+
+ @Test
+ public void testGetExportedStatsWhenDetailedTrackingEnabled() {
+ TestBinderCallsStats bcs = new TestBinderCallsStats();
+ bcs.setDetailedTracking(true);
+ Binder binder = new Binder();
+ BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
+ bcs.time += 10;
+ bcs.elapsedTime += 20;
+ bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);
+
+ assertEquals(1, bcs.getExportedCallStats().size());
+ BinderCallsStats.ExportedCallStat stat = bcs.getExportedCallStats().get(0);
+ assertEquals(TEST_UID, stat.uid);
+ assertEquals("android.os.Binder", stat.className);
+ assertEquals("1", stat.methodName);
+ assertEquals(10, stat.cpuTimeMicros);
+ assertEquals(10, stat.maxCpuTimeMicros);
+ assertEquals(20, stat.latencyMicros);
+ assertEquals(20, stat.maxLatencyMicros);
+ assertEquals(1, stat.callCount);
+ assertEquals(REQUEST_SIZE, stat.maxRequestSizeBytes);
+ assertEquals(REPLY_SIZE, stat.maxReplySizeBytes);
+ assertEquals(0, stat.exceptionCount);
+ }
+
+ static class TestBinderCallsStats extends BinderCallsStats {
+ int callingUid = TEST_UID;
+ long time = 1234;
+ long elapsedTime = 0;
+
+ TestBinderCallsStats() {
+ }
+
+ @Override
+ protected long getThreadTimeMicro() {
+ return time;
+ }
+
+ @Override
+ protected long getElapsedRealtimeMicro() {
+ return elapsedTime;
+ }
+
+ @Override
+ protected int getCallingUid() {
+ return callingUid;
+ }
+ }
+
+}
diff --git a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
index 518cadd7d8e2..d4b8566b0345 100644
--- a/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
+++ b/core/tests/coretests/src/com/android/internal/policy/PhoneWindowTest.java
@@ -24,6 +24,9 @@ import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
import android.platform.test.annotations.Presubmit;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
@@ -89,6 +92,50 @@ public final class PhoneWindowTest {
is(LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER));
}
+ @Test
+ public void testWindowBackground_colorLiteral() {
+ createPhoneWindowWithTheme(R.style.WindowBackgroundColorLiteral);
+ installDecor();
+
+ Drawable backgroundDrawable = mPhoneWindow.getDecorView().getBackground();
+ assertThat(backgroundDrawable instanceof ColorDrawable, is(true));
+
+ ColorDrawable colorDrawable = (ColorDrawable) backgroundDrawable;
+ assertThat(colorDrawable.getColor(), is(Color.GREEN));
+ }
+
+ @Test
+ public void testWindowBackgroundFallback_colorLiteral() {
+ createPhoneWindowWithTheme(R.style.WindowBackgroundFallbackColorLiteral);
+ installDecor();
+
+ DecorView decorView = (DecorView) mPhoneWindow.getDecorView();
+ Drawable fallbackDrawable = decorView.getBackgroundFallback();
+
+ assertThat(fallbackDrawable instanceof ColorDrawable, is(true));
+
+ ColorDrawable colorDrawable = (ColorDrawable) fallbackDrawable;
+ assertThat(colorDrawable.getColor(), is(Color.BLUE));
+ }
+
+ @Test
+ public void testWindowBackgroundFallbackWithExplicitBackgroundSet_colorLiteral() {
+ createPhoneWindowWithTheme(R.style.WindowBackgroundFallbackColorLiteral);
+ // set background before decorView is created
+ mPhoneWindow.setBackgroundDrawable(new ColorDrawable(Color.CYAN));
+ installDecor();
+ // clear background so that fallback is used
+ mPhoneWindow.setBackgroundDrawable(null);
+
+ DecorView decorView = (DecorView) mPhoneWindow.getDecorView();
+ Drawable fallbackDrawable = decorView.getBackgroundFallback();
+
+ assertThat(fallbackDrawable instanceof ColorDrawable, is(true));
+
+ ColorDrawable colorDrawable = (ColorDrawable) fallbackDrawable;
+ assertThat(colorDrawable.getColor(), is(Color.BLUE));
+ }
+
private void createPhoneWindowWithTheme(int theme) {
mPhoneWindow = new PhoneWindow(new ContextThemeWrapper(mContext, theme));
}
diff --git a/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java
index 45b19bccff88..a44b86074ee2 100644
--- a/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/DumpUtilsTest.java
@@ -15,8 +15,11 @@
*/
package com.android.internal.util;
+import static com.android.internal.util.DumpUtils.CRITICAL_SECTION_COMPONENTS;
import static com.android.internal.util.DumpUtils.filterRecord;
import static com.android.internal.util.DumpUtils.isNonPlatformPackage;
+import static com.android.internal.util.DumpUtils.isPlatformCriticalPackage;
+import static com.android.internal.util.DumpUtils.isPlatformNonCriticalPackage;
import static com.android.internal.util.DumpUtils.isPlatformPackage;
import android.content.ComponentName;
@@ -25,7 +28,7 @@ import junit.framework.TestCase;
/**
* Run with:
- atest /android/pi-dev/frameworks/base/core/tests/coretests/src/com/android/internal/util/DumpTest.java
+ atest FrameworksCoreTests:DumpUtilsTest
*/
public class DumpUtilsTest extends TestCase {
@@ -89,6 +92,32 @@ public class DumpUtilsTest extends TestCase {
assertTrue(isNonPlatformPackage(wcn("com.google.def/abc")));
}
+ public void testIsPlatformCriticalPackage() {
+ for (final ComponentName componentName : CRITICAL_SECTION_COMPONENTS) {
+ assertTrue(isPlatformCriticalPackage(() -> componentName));
+ assertTrue(isPlatformPackage(componentName));
+ }
+ assertFalse(isPlatformCriticalPackage(wcn("com.google.p/abc")));
+ assertFalse(isPlatformCriticalPackage(wcn("com.android.def/abc")));
+ assertFalse(isPlatformCriticalPackage(wcn("com.android.abc")));
+ assertFalse(isPlatformCriticalPackage(wcn("com.android")));
+ assertFalse(isPlatformCriticalPackage(wcn(null)));
+ assertFalse(isPlatformCriticalPackage(null));
+ }
+
+ public void testIsPlatformNonCriticalPackage() {
+ for (final ComponentName componentName : CRITICAL_SECTION_COMPONENTS) {
+ assertFalse(isPlatformNonCriticalPackage(() -> componentName));
+ }
+ assertTrue(isPlatformNonCriticalPackage(wcn("android/abc")));
+ assertTrue(isPlatformNonCriticalPackage(wcn("android.abc/abc")));
+ assertTrue(isPlatformNonCriticalPackage(wcn("com.android.def/abc")));
+
+ assertFalse(isPlatformNonCriticalPackage(wcn("com.google.def/abc")));
+ assertFalse(isPlatformNonCriticalPackage(wcn(null)));
+ assertFalse(isPlatformNonCriticalPackage(null));
+ }
+
public void testFilterRecord() {
assertFalse(filterRecord(null).test(wcn("com.google.p/abc")));
assertFalse(filterRecord(null).test(wcn("com.android.p/abc")));
@@ -105,6 +134,19 @@ public class DumpUtilsTest extends TestCase {
assertFalse(filterRecord("all-non-platform").test(wcn("com.android.p/abc")));
assertFalse(filterRecord("all-non-platform").test(wcn(null)));
+ for (final ComponentName componentName : CRITICAL_SECTION_COMPONENTS) {
+ assertTrue(filterRecord("all-platform-critical").test((() -> componentName)));
+ assertFalse(filterRecord("all-platform-non-critical").test((() -> componentName)));
+ assertTrue(filterRecord("all-platform").test((() -> componentName)));
+ }
+ assertFalse(filterRecord("all-platform-critical").test(wcn("com.google.p/abc")));
+ assertFalse(filterRecord("all-platform-critical").test(wcn("com.android.p/abc")));
+ assertFalse(filterRecord("all-platform-critical").test(wcn(null)));
+
+ assertTrue(filterRecord("all-platform-non-critical").test(wcn("com.android.p/abc")));
+ assertFalse(filterRecord("all-platform-non-critical").test(wcn("com.google.p/abc")));
+ assertFalse(filterRecord("all-platform-non-critical").test(wcn(null)));
+
// Partial string match.
assertTrue(filterRecord("abc").test(wcn("com.google.p/.abc")));
assertFalse(filterRecord("abc").test(wcn("com.google.p/.def")));
diff --git a/core/tests/coretests/src/com/android/internal/util/HexDumpTest.java b/core/tests/coretests/src/com/android/internal/util/HexDumpTest.java
index 951e87a99da3..359bd5e93dae 100644
--- a/core/tests/coretests/src/com/android/internal/util/HexDumpTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/HexDumpTest.java
@@ -25,4 +25,7 @@ public final class HexDumpTest extends TestCase {
assertEquals("ABCDEF", HexDump.toHexString(
new byte[] { (byte) 0xab, (byte) 0xcd, (byte) 0xef }, true));
}
+ public void testNullArray() {
+ assertEquals("(null)", HexDump.toHexString(null));
+ }
}
diff --git a/core/tests/hosttests/test-apps/SharedUid/32/Android.mk b/core/tests/hosttests/test-apps/SharedUid/32/Android.mk
index e141bbe9ae92..7b44f9e0fea1 100644
--- a/core/tests/hosttests/test-apps/SharedUid/32/Android.mk
+++ b/core/tests/hosttests/test-apps/SharedUid/32/Android.mk
@@ -36,8 +36,3 @@ LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
-
-# ============================================================
-
-# Also build all of the sub-targets under this one: the shared library.
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp b/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp
new file mode 100644
index 000000000000..6db0ba5f7387
--- /dev/null
+++ b/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp
@@ -0,0 +1,38 @@
+//
+// Copyright (C) 2008 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.
+//
+
+// This makefile supplies the rules for building a library of JNI code for
+// use by our example of how to bundle a shared library with an APK.
+
+cc_test_library {
+
+ // This is the target being built.
+ name: "libpmtest32",
+ compile_multilib: "32",
+
+ // All of the source files that we will compile.
+ srcs: ["native.cpp"],
+
+ shared_libs: ["liblog"],
+
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Werror",
+ ],
+
+ sdk_version: "current",
+}
diff --git a/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.mk b/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.mk
deleted file mode 100644
index 9b9e8113f234..000000000000
--- a/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.mk
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Copyright (C) 2008 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.
-#
-
-# This makefile supplies the rules for building a library of JNI code for
-# use by our example of how to bundle a shared library with an APK.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# This is the target being built.
-LOCAL_MODULE:= libpmtest32
-LOCAL_MULTILIB := 32
-LOCAL_MODULE_TAGS := tests
-
-# All of the source files that we will compile.
-LOCAL_SRC_FILES:= \
- native.cpp
-
-LOCAL_LDLIBS := -llog
-
-LOCAL_CFLAGS += -Wall -Wextra -Werror
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/core/tests/hosttests/test-apps/SharedUid/64/Android.mk b/core/tests/hosttests/test-apps/SharedUid/64/Android.mk
index 4f24f33c232f..cc088c1a65cb 100644
--- a/core/tests/hosttests/test-apps/SharedUid/64/Android.mk
+++ b/core/tests/hosttests/test-apps/SharedUid/64/Android.mk
@@ -36,8 +36,3 @@ LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
-
-# ============================================================
-
-# Also build all of the sub-targets under this one: the shared library.
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp b/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp
new file mode 100644
index 000000000000..582f2a7abfb4
--- /dev/null
+++ b/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp
@@ -0,0 +1,37 @@
+//
+// Copyright (C) 2008 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.
+//
+
+// This Android.bp supplies the rules for building a library of JNI code for
+// use by our example of how to bundle a shared library with an APK.
+
+cc_test_library {
+ // This is the target being built.
+ name: "libpmtest64",
+ compile_multilib: "64",
+
+ // All of the source files that we will compile.
+ srcs: ["native.cpp"],
+
+ shared_libs: ["liblog"],
+
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Werror",
+ ],
+
+ sdk_version: "current",
+}
diff --git a/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.mk b/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.mk
deleted file mode 100644
index 600a5d148740..000000000000
--- a/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# Copyright (C) 2008 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.
-#
-
-# This makefile supplies the rules for building a library of JNI code for
-# use by our example of how to bundle a shared library with an APK.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# This is the target being built.
-LOCAL_MODULE:= libpmtest64
-LOCAL_MULTILIB := 64
-LOCAL_MODULE_TAGS := tests
-
-
-# All of the source files that we will compile.
-LOCAL_SRC_FILES:= \
- native.cpp
-
-LOCAL_LDLIBS := -llog
-
-LOCAL_CFLAGS += -Wall -Wextra -Werror
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/core/tests/hosttests/test-apps/SharedUid/dual/Android.mk b/core/tests/hosttests/test-apps/SharedUid/dual/Android.mk
index 60af2b94867e..5bcd078b1914 100644
--- a/core/tests/hosttests/test-apps/SharedUid/dual/Android.mk
+++ b/core/tests/hosttests/test-apps/SharedUid/dual/Android.mk
@@ -56,8 +56,3 @@ LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
-
-# ============================================================
-
-# Also build all of the sub-targets under this one: the shared library.
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp b/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp
new file mode 100644
index 000000000000..3e043afee7ec
--- /dev/null
+++ b/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp
@@ -0,0 +1,39 @@
+//
+// Copyright (C) 2008 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.
+//
+
+// This Android.bp supplies the rules for building a library of JNI code for
+// use by our example of how to bundle a shared library with an APK.
+
+cc_test_library {
+
+ // This is the target being built.
+ name: "libpmtestdual",
+ compile_multilib: "both",
+ gtest: false,
+
+ // All of the source files that we will compile.
+ srcs: ["native.cpp"],
+
+ shared_libs: ["liblog"],
+
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Werror",
+ ],
+
+ sdk_version: "current",
+}
diff --git a/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.mk b/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.mk
deleted file mode 100644
index 8e9ac6b5de95..000000000000
--- a/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.mk
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Copyright (C) 2008 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.
-#
-
-# This makefile supplies the rules for building a library of JNI code for
-# use by our example of how to bundle a shared library with an APK.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# This is the target being built.
-LOCAL_MODULE:= libpmtestdual
-LOCAL_MULTILIB := both
-LOCAL_MODULE_TAGS := tests
-
-# All of the source files that we will compile.
-LOCAL_SRC_FILES:= \
- native.cpp
-
-LOCAL_LDLIBS = -llog
-
-LOCAL_CFLAGS += -Wall -Wextra -Werror
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java b/core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java
index 433d4d214b97..6464ad3e9709 100644
--- a/core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java
+++ b/core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java
@@ -16,9 +16,8 @@
package com.android.internal.util;
-import android.test.MoreAsserts;
+import static org.junit.Assert.assertArrayEquals;
-import java.util.Arrays;
import junit.framework.TestCase;
/**
@@ -92,29 +91,29 @@ public class ArrayUtilsTest extends TestCase {
}
public void testAppendInt() throws Exception {
- MoreAsserts.assertEquals(new int[] { 1 },
+ assertArrayEquals(new int[] { 1 },
ArrayUtils.appendInt(null, 1));
- MoreAsserts.assertEquals(new int[] { 1 },
+ assertArrayEquals(new int[] { 1 },
ArrayUtils.appendInt(new int[] { }, 1));
- MoreAsserts.assertEquals(new int[] { 1, 2 },
+ assertArrayEquals(new int[] { 1, 2 },
ArrayUtils.appendInt(new int[] { 1 }, 2));
- MoreAsserts.assertEquals(new int[] { 1, 2 },
+ assertArrayEquals(new int[] { 1, 2 },
ArrayUtils.appendInt(new int[] { 1, 2 }, 1));
}
public void testRemoveInt() throws Exception {
assertNull(ArrayUtils.removeInt(null, 1));
- MoreAsserts.assertEquals(new int[] { },
+ assertArrayEquals(new int[] { },
ArrayUtils.removeInt(new int[] { }, 1));
- MoreAsserts.assertEquals(new int[] { 1, 2, 3, },
+ assertArrayEquals(new int[] { 1, 2, 3, },
ArrayUtils.removeInt(new int[] { 1, 2, 3}, 4));
- MoreAsserts.assertEquals(new int[] { 2, 3, },
+ assertArrayEquals(new int[] { 2, 3, },
ArrayUtils.removeInt(new int[] { 1, 2, 3}, 1));
- MoreAsserts.assertEquals(new int[] { 1, 3, },
+ assertArrayEquals(new int[] { 1, 3, },
ArrayUtils.removeInt(new int[] { 1, 2, 3}, 2));
- MoreAsserts.assertEquals(new int[] { 1, 2, },
+ assertArrayEquals(new int[] { 1, 2, },
ArrayUtils.removeInt(new int[] { 1, 2, 3}, 3));
- MoreAsserts.assertEquals(new int[] { 2, 3, 1 },
+ assertArrayEquals(new int[] { 2, 3, 1 },
ArrayUtils.removeInt(new int[] { 1, 2, 3, 1 }, 1));
}
@@ -129,30 +128,51 @@ public class ArrayUtilsTest extends TestCase {
}
public void testAppendLong() throws Exception {
- MoreAsserts.assertEquals(new long[] { 1 },
+ assertArrayEquals(new long[] { 1 },
ArrayUtils.appendLong(null, 1));
- MoreAsserts.assertEquals(new long[] { 1 },
+ assertArrayEquals(new long[] { 1 },
ArrayUtils.appendLong(new long[] { }, 1));
- MoreAsserts.assertEquals(new long[] { 1, 2 },
+ assertArrayEquals(new long[] { 1, 2 },
ArrayUtils.appendLong(new long[] { 1 }, 2));
- MoreAsserts.assertEquals(new long[] { 1, 2 },
+ assertArrayEquals(new long[] { 1, 2 },
ArrayUtils.appendLong(new long[] { 1, 2 }, 1));
}
public void testRemoveLong() throws Exception {
assertNull(ArrayUtils.removeLong(null, 1));
- MoreAsserts.assertEquals(new long[] { },
+ assertArrayEquals(new long[] { },
ArrayUtils.removeLong(new long[] { }, 1));
- MoreAsserts.assertEquals(new long[] { 1, 2, 3, },
+ assertArrayEquals(new long[] { 1, 2, 3, },
ArrayUtils.removeLong(new long[] { 1, 2, 3}, 4));
- MoreAsserts.assertEquals(new long[] { 2, 3, },
+ assertArrayEquals(new long[] { 2, 3, },
ArrayUtils.removeLong(new long[] { 1, 2, 3}, 1));
- MoreAsserts.assertEquals(new long[] { 1, 3, },
+ assertArrayEquals(new long[] { 1, 3, },
ArrayUtils.removeLong(new long[] { 1, 2, 3}, 2));
- MoreAsserts.assertEquals(new long[] { 1, 2, },
+ assertArrayEquals(new long[] { 1, 2, },
ArrayUtils.removeLong(new long[] { 1, 2, 3}, 3));
- MoreAsserts.assertEquals(new long[] { 2, 3, 1 },
+ assertArrayEquals(new long[] { 2, 3, 1 },
ArrayUtils.removeLong(new long[] { 1, 2, 3, 1 }, 1));
}
+ public void testConcatEmpty() throws Exception {
+ assertArrayEquals(new Long[] {},
+ ArrayUtils.concat(Long.class, null, null));
+ assertArrayEquals(new Long[] {},
+ ArrayUtils.concat(Long.class, new Long[] {}, null));
+ assertArrayEquals(new Long[] {},
+ ArrayUtils.concat(Long.class, null, new Long[] {}));
+ assertArrayEquals(new Long[] {},
+ ArrayUtils.concat(Long.class, new Long[] {}, new Long[] {}));
+ }
+
+ public void testConcat() throws Exception {
+ assertArrayEquals(new Long[] { 1L },
+ ArrayUtils.concat(Long.class, new Long[] { 1L }, new Long[] {}));
+ assertArrayEquals(new Long[] { 1L },
+ ArrayUtils.concat(Long.class, new Long[] {}, new Long[] { 1L }));
+ assertArrayEquals(new Long[] { 1L, 2L },
+ ArrayUtils.concat(Long.class, new Long[] { 1L }, new Long[] { 2L }));
+ assertArrayEquals(new Long[] { 1L, 2L, 3L, 4L },
+ ArrayUtils.concat(Long.class, new Long[] { 1L, 2L }, new Long[] { 3L, 4L }));
+ }
}
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index ab90e1b702d5..b3f05dc9fc98 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -187,10 +187,6 @@
file="/system/framework/android.test.mock.jar" />
<library name="android.test.runner"
file="/system/framework/android.test.runner.jar" />
- <library name="javax.obex"
- file="/system/framework/javax.obex.jar" />
- <library name="org.apache.http.legacy"
- file="/system/framework/org.apache.http.legacy.boot.jar" />
<!-- These are the standard packages that are white-listed to always have internet
access while in power save mode, even if they aren't in the foreground. -->
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 82b6a22d2740..434af14ff44f 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -330,6 +330,7 @@ applications that come with the platform
<permission name="android.permission.START_TASKS_FROM_RECENTS" />
<permission name="android.permission.STOP_APP_SWITCHES"/>
<permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
+ <permission name="android.permission.SUSPEND_APPS" />
<permission name="android.permission.UPDATE_APP_OPS_STATS"/>
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index 72d9bce687ab..be9347ab6771 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -131,26 +131,30 @@
<font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font>
</family>
<family lang="und-Armn">
- <font weight="400" style="normal">NotoSansArmenian-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font>
- <font weight="400" style="normal" fallbackFor="serif">NotoSerifArmenian-Regular.ttf</font>
- <font weight="700" style="normal" fallbackFor="serif">NotoSerifArmenian-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansArmenian-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansArmenian-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansArmenian-Bold.otf</font>
+ <font weight="400" style="normal" fallbackFor="serif">NotoSerifArmenian-Regular.otf</font>
+ <font weight="700" style="normal" fallbackFor="serif">NotoSerifArmenian-Bold.otf</font>
</family>
<family lang="und-Geor und-Geok">
- <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansGeorgian-Bold.ttf</font>
- <font weight="400" style="normal" fallbackFor="serif">NotoSerifGeorgian-Regular.ttf</font>
- <font weight="700" style="normal" fallbackFor="serif">NotoSerifGeorgian-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansGeorgian-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansGeorgian-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansGeorgian-Bold.otf</font>
+ <font weight="400" style="normal" fallbackFor="serif">NotoSerifGeorgian-Regular.otf</font>
+ <font weight="700" style="normal" fallbackFor="serif">NotoSerifGeorgian-Bold.otf</font>
</family>
<family lang="und-Deva" variant="elegant">
- <font weight="400" style="normal">NotoSansDevanagari-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansDevanagari-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansDevanagari-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansDevanagari-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansDevanagari-Bold.otf</font>
<font weight="400" style="normal" fallbackFor="serif">NotoSerifDevanagari-Regular.ttf</font>
<font weight="700" style="normal" fallbackFor="serif">NotoSerifDevanagari-Bold.ttf</font>
</family>
<family lang="und-Deva" variant="compact">
- <font weight="400" style="normal">NotoSansDevanagariUI-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansDevanagariUI-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansDevanagariUI-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansDevanagariUI-Bold.otf</font>
</family>
<!-- All scripts of India should come after Devanagari, due to shared
@@ -177,34 +181,40 @@
<font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font>
</family>
<family lang="und-Taml" variant="elegant">
- <font weight="400" style="normal">NotoSansTamil-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansTamil-Bold.ttf</font>
- <font weight="400" style="normal" fallbackFor="serif">NotoSerifTamil-Regular.ttf</font>
- <font weight="700" style="normal" fallbackFor="serif">NotoSerifTamil-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansTamil-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansTamil-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansTamil-Bold.otf</font>
+ <font weight="400" style="normal" fallbackFor="serif">NotoSerifTamil-Regular.otf</font>
+ <font weight="700" style="normal" fallbackFor="serif">NotoSerifTamil-Bold.otf</font>
</family>
<family lang="und-Taml" variant="compact">
- <font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansTamilUI-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansTamilUI-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansTamilUI-Bold.otf</font>
</family>
<family lang="und-Mlym" variant="elegant">
- <font weight="400" style="normal">NotoSansMalayalam-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansMalayalam-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansMalayalam-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansMalayalam-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansMalayalam-Bold.otf</font>
<font weight="400" style="normal" fallbackFor="serif">NotoSerifMalayalam-Regular.ttf</font>
<font weight="700" style="normal" fallbackFor="serif">NotoSerifMalayalam-Bold.ttf</font>
</family>
<family lang="und-Mlym" variant="compact">
- <font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansMalayalamUI-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansMalayalamUI-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansMalayalamUI-Bold.otf</font>
</family>
<family lang="und-Beng" variant="elegant">
- <font weight="400" style="normal">NotoSansBengali-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansBengali-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansBengali-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansBengali-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansBengali-Bold.otf</font>
<font weight="400" style="normal" fallbackFor="serif">NotoSerifBengali-Regular.ttf</font>
<font weight="700" style="normal" fallbackFor="serif">NotoSerifBengali-Bold.ttf</font>
</family>
<family lang="und-Beng" variant="compact">
- <font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansBengaliUI-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansBengaliUI-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansBengaliUI-Bold.otf</font>
</family>
<family lang="und-Telu" variant="elegant">
<font weight="400" style="normal">NotoSansTelugu-Regular.ttf</font>
@@ -236,13 +246,15 @@
</family>
<family lang="und-Sinh" variant="elegant">
- <font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansSinhala-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansSinhala-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansSinhala-Bold.otf</font>
<font weight="400" style="normal" fallbackFor="serif">NotoSerifSinhala-Regular.otf</font>
<font weight="700" style="normal" fallbackFor="serif">NotoSerifSinhala-Bold.otf</font>
</family>
<family lang="und-Sinh" variant="compact">
<font weight="400" style="normal">NotoSansSinhalaUI-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansSinhalaUI-Medium.otf</font>
<font weight="700" style="normal">NotoSansSinhalaUI-Bold.otf</font>
</family>
<family lang="und-Khmr" variant="elegant">
@@ -300,14 +312,16 @@
<font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font>
</family>
<family lang="und-Mymr" variant="elegant">
- <font weight="400" style="normal">NotoSansMyanmar-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansMyanmar-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansMyanmar-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansMyanmar-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansMyanmar-Bold.otf</font>
<font weight="400" style="normal" fallbackFor="serif">NotoSerifMyanmar-Regular.otf</font>
<font weight="700" style="normal" fallbackFor="serif">NotoSerifMyanmar-Bold.otf</font>
</family>
<family lang="und-Mymr" variant="compact">
- <font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font>
- <font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font>
+ <font weight="400" style="normal">NotoSansMyanmarUI-Regular.otf</font>
+ <font weight="500" style="normal">NotoSansMyanmarUI-Medium.otf</font>
+ <font weight="700" style="normal">NotoSansMyanmarUI-Bold.otf</font>
</family>
<family lang="und-Thaa">
<font weight="400" style="normal">NotoSansThaana-Regular.ttf</font>
diff --git a/data/sounds/AllAudio.mk b/data/sounds/AllAudio.mk
index edfd3800600c..bb8add1187e7 100644
--- a/data/sounds/AllAudio.mk
+++ b/data/sounds/AllAudio.mk
@@ -232,4 +232,10 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/WirelessChargingStarted.ogg:system/media/audio/ui/WirelessChargingStarted.ogg \
$(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
-
+ $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:system/media/audio/ui/ChargingStarted.ogg \
+ $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:system/media/audio/ui/InCallNotification.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCFailure.ogg:system/media/audio/ui/NFCFailure.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCInitiated.ogg:system/media/audio/ui/NFCInitiated.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCSuccess.ogg:system/media/audio/ui/NFCSuccess.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCTransferComplete.ogg:system/media/audio/ui/NFCTransferComplete.ogg \
+ $(LOCAL_PATH)/effects/ogg/NFCTransferInitiated.ogg:system/media/audio/ui/NFCTransferInitiated.ogg \
diff --git a/data/sounds/AudioPackage10.mk b/data/sounds/AudioPackage10.mk
index c5222afcc2f7..72aa7fe1c38a 100644
--- a/data/sounds/AudioPackage10.mk
+++ b/data/sounds/AudioPackage10.mk
@@ -32,6 +32,8 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/Lock_48k.ogg:system/media/audio/ui/Lock.ogg \
$(LOCAL_PATH)/effects/ogg/Unlock_48k.ogg:system/media/audio/ui/Unlock.ogg \
$(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:system/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:system/media/audio/ui/ChargingStarted.ogg \
+ $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:system/media/audio/ui/InCallNotification.ogg \
$(LOCAL_PATH)/effects/material/ogg/WirelessChargingStarted_48k.ogg:system/media/audio/ui/WirelessChargingStarted.ogg \
$(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
$(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
diff --git a/data/sounds/AudioPackage11.mk b/data/sounds/AudioPackage11.mk
index 43c83b99b11f..665ce521690e 100644
--- a/data/sounds/AudioPackage11.mk
+++ b/data/sounds/AudioPackage11.mk
@@ -32,6 +32,8 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/Lock_48k.ogg:system/media/audio/ui/Lock.ogg \
$(LOCAL_PATH)/effects/ogg/Unlock_48k.ogg:system/media/audio/ui/Unlock.ogg \
$(LOCAL_PATH)/effects/ogg/Trusted_48k.ogg:system/media/audio/ui/Trusted.ogg \
+ $(LOCAL_PATH)/effects/ogg/ChargingStarted.ogg:system/media/audio/ui/ChargingStarted.ogg \.
+ $(LOCAL_PATH)/effects/ogg/InCallNotification.ogg:system/media/audio/ui/InCallNotification.ogg \
$(LOCAL_PATH)/effects/material/ogg/WirelessChargingStarted_48k.ogg:system/media/audio/ui/WirelessChargingStarted.ogg \
$(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
$(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \
diff --git a/data/sounds/AudioPackage12.mk b/data/sounds/AudioPackage12.mk
index cd4d35b4d3fc..44a8f9e34cd3 100644
--- a/data/sounds/AudioPackage12.mk
+++ b/data/sounds/AudioPackage12.mk
@@ -12,7 +12,7 @@ ALARM_FILES := Argon Carbon Helium Krypton Neon Oxygen Osmium Platinum
NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Titan Tethys
RINGTONE_FILES := Callisto Dione Ganymede Luna Oberon Phobos Sedna Titania Triton Umbriel
EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
- camera_focus Dock Undock Lock Unlock Trusted
+ camera_focus Dock Undock Lock Unlock Trusted ChargingStarted InCallNotification
MATERIAL_EFFECT_FILES := camera_click VideoRecord LowBattery WirelessChargingStarted VideoStop
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
diff --git a/data/sounds/AudioPackage12_48.mk b/data/sounds/AudioPackage12_48.mk
index 80758f495035..09fab041505e 100644
--- a/data/sounds/AudioPackage12_48.mk
+++ b/data/sounds/AudioPackage12_48.mk
@@ -12,7 +12,7 @@ ALARM_FILES := Argon Carbon Helium Krypton Neon Oxygen Osmium Platinum
NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Titan Tethys
RINGTONE_FILES := Callisto Dione Ganymede Luna Oberon Phobos Sedna Titania Triton Umbriel
EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
- Lock Unlock Trusted
+ Lock Unlock Trusted ChargingStarted InCallNotification
MATERIAL_EFFECT_FILES := camera_click VideoRecord LowBattery WirelessChargingStarted VideoStop
# Alarms not yet available in 48 kHz
diff --git a/data/sounds/AudioPackage13.mk b/data/sounds/AudioPackage13.mk
index d33a4aff22b8..de4ee047986d 100644
--- a/data/sounds/AudioPackage13.mk
+++ b/data/sounds/AudioPackage13.mk
@@ -13,7 +13,7 @@ NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Tit
RINGTONE_FILES := Atria Callisto Dione Ganymede Luna Oberon Phobos Pyxis Sedna Titania Triton \
Umbriel
EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
- camera_focus Dock Undock Lock Unlock Trusted
+ camera_focus Dock Undock Lock Unlock Trusted ChargingStarted InCallNotification
MATERIAL_EFFECT_FILES := camera_click VideoRecord WirelessChargingStarted LowBattery VideoStop
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
diff --git a/data/sounds/AudioPackage13_48.mk b/data/sounds/AudioPackage13_48.mk
index 9c320ae8855e..889d58172290 100644
--- a/data/sounds/AudioPackage13_48.mk
+++ b/data/sounds/AudioPackage13_48.mk
@@ -13,7 +13,7 @@ NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Tit
RINGTONE_FILES := Atria Callisto Dione Ganymede Luna Oberon Phobos Pyxis Sedna Titania Triton \
Umbriel
EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
- Lock Unlock Trusted
+ Lock Unlock Trusted ChargingStarted InCallNotification
MATERIAL_EFFECT_FILES := camera_click VideoRecord WirelessChargingStarted LowBattery VideoStop
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
diff --git a/data/sounds/AudioPackage14.mk b/data/sounds/AudioPackage14.mk
new file mode 100644
index 000000000000..c903a2b0eb97
--- /dev/null
+++ b/data/sounds/AudioPackage14.mk
@@ -0,0 +1,32 @@
+#
+# Audio Package 14 - P
+#
+# Include this file in a product makefile to include these audio files
+#
+#
+
+LOCAL_PATH := frameworks/base/data/sounds
+
+# Simple files that do not require renaming
+ALARM_FILES := Argon Carbon Helium Krypton Neon Oxygen Osmium Platinum Timer
+NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Titan Tethys
+RINGTONE_FILES := Atria Callisto Dione Ganymede Luna Oberon Phobos Pyxis Sedna Titania Triton \
+ Umbriel
+EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
+ camera_focus Dock Undock Lock Unlock Trusted ChargingStarted InCallNotification \
+ NFCFailure NFCInitiated NFCSuccess NFCTransferComplete NFCTransferInitiated
+MATERIAL_EFFECT_FILES := camera_click VideoRecord WirelessChargingStarted LowBattery VideoStop
+
+PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
+ $(LOCAL_PATH)/alarms/material/ogg/$(fn).ogg:system/media/audio/alarms/$(fn).ogg)
+
+PRODUCT_COPY_FILES += $(foreach fn,$(NOTIFICATION_FILES),\
+ $(LOCAL_PATH)/notifications/material/ogg/$(fn).ogg:system/media/audio/notifications/$(fn).ogg)
+
+PRODUCT_COPY_FILES += $(foreach fn,$(RINGTONE_FILES),\
+ $(LOCAL_PATH)/ringtones/material/ogg/$(fn).ogg:system/media/audio/ringtones/$(fn).ogg)
+
+PRODUCT_COPY_FILES += $(foreach fn,$(EFFECT_FILES),\
+ $(LOCAL_PATH)/effects/ogg/$(fn).ogg:system/media/audio/ui/$(fn).ogg)
+PRODUCT_COPY_FILES += $(foreach fn,$(MATERIAL_EFFECT_FILES),\
+ $(LOCAL_PATH)/effects/material/ogg/$(fn).ogg:system/media/audio/ui/$(fn).ogg)
diff --git a/data/sounds/README.txt b/data/sounds/README.txt
index 193fd7179f5f..db20319f6bfc 100644
--- a/data/sounds/README.txt
+++ b/data/sounds/README.txt
@@ -31,3 +31,13 @@ Video recording
./effects/ogg/VideoStop_48k.ogg
unused
+NFC
+---
+
+./effects/ogg/NFCFailure.ogg
+./effects/ogg/NFCInitiated.ogg
+./effects/ogg/NFCSuccess.ogg
+./effects/ogg/NFCTransferComplete.ogg
+./effects/ogg/NFCTransferInitiated.ogg
+
+referenced in AudioPackage14.mk (= AudioPackage13.mk + NFC sounds).
diff --git a/data/sounds/effects/ChargingStarted.ogg b/data/sounds/effects/ChargingStarted.ogg
new file mode 100644
index 000000000000..f09e273ea5ac
--- /dev/null
+++ b/data/sounds/effects/ChargingStarted.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/ChargingStarted.ogg b/data/sounds/effects/ogg/ChargingStarted.ogg
new file mode 100644
index 000000000000..f09e273ea5ac
--- /dev/null
+++ b/data/sounds/effects/ogg/ChargingStarted.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/ChargingStarted_48k.ogg b/data/sounds/effects/ogg/ChargingStarted_48k.ogg
new file mode 100644
index 000000000000..f09e273ea5ac
--- /dev/null
+++ b/data/sounds/effects/ogg/ChargingStarted_48k.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/InCallNotification_48k.ogg b/data/sounds/effects/ogg/InCallNotification_48k.ogg
new file mode 100644
index 000000000000..4481ccb25614
--- /dev/null
+++ b/data/sounds/effects/ogg/InCallNotification_48k.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/NFCFailure.ogg b/data/sounds/effects/ogg/NFCFailure.ogg
new file mode 100644
index 000000000000..e9ee6624b16c
--- /dev/null
+++ b/data/sounds/effects/ogg/NFCFailure.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/NFCInitiated.ogg b/data/sounds/effects/ogg/NFCInitiated.ogg
new file mode 100644
index 000000000000..a86319faaac7
--- /dev/null
+++ b/data/sounds/effects/ogg/NFCInitiated.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/NFCSuccess.ogg b/data/sounds/effects/ogg/NFCSuccess.ogg
new file mode 100644
index 000000000000..39dfd1f9d863
--- /dev/null
+++ b/data/sounds/effects/ogg/NFCSuccess.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/NFCTransferComplete.ogg b/data/sounds/effects/ogg/NFCTransferComplete.ogg
new file mode 100644
index 000000000000..f00cd9876eff
--- /dev/null
+++ b/data/sounds/effects/ogg/NFCTransferComplete.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/NFCTransferInitiated.ogg b/data/sounds/effects/ogg/NFCTransferInitiated.ogg
new file mode 100644
index 000000000000..7be1bcbe6375
--- /dev/null
+++ b/data/sounds/effects/ogg/NFCTransferInitiated.ogg
Binary files differ
diff --git a/docs/html/reference/images/text/widget/first_last_baseline.png b/docs/html/reference/images/text/widget/first_last_baseline.png
new file mode 100644
index 000000000000..ee3bd1f9712d
--- /dev/null
+++ b/docs/html/reference/images/text/widget/first_last_baseline.png
Binary files differ
diff --git a/drm/java/android/drm/DrmOutputStream.java b/drm/java/android/drm/DrmOutputStream.java
index ba1c56fbec8c..9c238348846e 100644
--- a/drm/java/android/drm/DrmOutputStream.java
+++ b/drm/java/android/drm/DrmOutputStream.java
@@ -27,13 +27,13 @@ import android.util.Log;
import libcore.io.IoBridge;
import libcore.io.Streams;
+import libcore.util.ArrayUtils;
import java.io.FileDescriptor;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.UnknownServiceException;
-import java.util.Arrays;
/**
* Stream that applies a {@link DrmManagerClient} transformation to data before
@@ -91,7 +91,7 @@ public class DrmOutputStream extends OutputStream {
@Override
public void write(byte[] buffer, int offset, int count) throws IOException {
- Arrays.checkOffsetAndCount(buffer.length, offset, count);
+ ArrayUtils.throwsIfOutOfBounds(buffer.length, offset, count);
final byte[] exactBuffer;
if (count == buffer.length) {
diff --git a/drm/jni/Android.bp b/drm/jni/Android.bp
new file mode 100644
index 000000000000..1e33f0ea5094
--- /dev/null
+++ b/drm/jni/Android.bp
@@ -0,0 +1,38 @@
+//
+// Copyright (C) 2010 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.
+//
+
+cc_library_shared {
+ name: "libdrmframework_jni",
+
+ srcs: ["android_drm_DrmManagerClient.cpp"],
+
+ shared_libs: [
+ "libdrmframework",
+ "liblog",
+ "libutils",
+ "libandroid_runtime",
+ "libnativehelper",
+ "libbinder",
+ "libdl",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/drm/jni/Android.mk b/drm/jni/Android.mk
deleted file mode 100644
index d0797a9849cd..000000000000
--- a/drm/jni/Android.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Copyright (C) 2010 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.
-#
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- android_drm_DrmManagerClient.cpp
-
-LOCAL_MODULE:= libdrmframework_jni
-
-LOCAL_SHARED_LIBRARIES := \
- libdrmframework \
- liblog \
- libutils \
- libandroid_runtime \
- libnativehelper \
- libbinder \
- libdl
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_C_INCLUDES += \
- $(JNI_H_INCLUDE) \
- $(TOP)/frameworks/av/drm/libdrmframework/include \
- $(TOP)/frameworks/av/drm/libdrmframework/plugins/common/include \
- $(TOP)/frameworks/av/include \
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index 71ee6c2b4421..97130f166eb2 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -22,6 +22,7 @@ import android.annotation.Nullable;
import android.annotation.Size;
import android.graphics.Canvas.VertexMode;
import android.text.GraphicsOperations;
+import android.text.MeasuredParagraph;
import android.text.PrecomputedText;
import android.text.SpannableString;
import android.text.SpannedString;
@@ -486,21 +487,31 @@ public abstract class BaseCanvas {
((GraphicsOperations) text).drawTextRun(this, start, end,
contextStart, contextEnd, x, y, isRtl, paint);
} else {
+ if (text instanceof PrecomputedText) {
+ final PrecomputedText pt = (PrecomputedText) text;
+ final int paraIndex = pt.findParaIndex(start);
+ if (end <= pt.getParagraphEnd(paraIndex)) {
+ final int paraStart = pt.getParagraphStart(paraIndex);
+ final MeasuredParagraph mp = pt.getMeasuredParagraph(paraIndex);
+ // Only support the text in the same paragraph.
+ nDrawTextRun(mNativeCanvasWrapper,
+ mp.getChars(),
+ start - paraStart,
+ end - start,
+ contextStart - paraStart,
+ contextEnd - contextStart,
+ x, y, isRtl, paint.getNativeInstance(),
+ mp.getNativePtr());
+ return;
+ }
+ }
int contextLen = contextEnd - contextStart;
int len = end - start;
char[] buf = TemporaryBuffer.obtain(contextLen);
TextUtils.getChars(text, contextStart, contextEnd, buf, 0);
- long measuredTextPtr = 0;
- if (text instanceof PrecomputedText) {
- PrecomputedText mt = (PrecomputedText) text;
- int paraIndex = mt.findParaIndex(start);
- if (end <= mt.getParagraphEnd(paraIndex)) {
- // Only suppor the text in the same paragraph.
- measuredTextPtr = mt.getMeasuredParagraph(paraIndex).getNativePtr();
- }
- }
nDrawTextRun(mNativeCanvasWrapper, buf, start - contextStart, len,
- 0, contextLen, x, y, isRtl, paint.getNativeInstance(), measuredTextPtr);
+ 0, contextLen, x, y, isRtl, paint.getNativeInstance(),
+ 0 /* measured paragraph pointer */);
TemporaryBuffer.recycle(buf);
}
}
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 95a0c56905c0..c6f841505e03 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -33,6 +33,8 @@ import android.view.DisplayListCanvas;
import android.view.RenderNode;
import android.view.ThreadedRenderer;
+import dalvik.annotation.optimization.CriticalNative;
+
import libcore.util.NativeAllocationRegistry;
import java.io.OutputStream;
@@ -59,8 +61,6 @@ public final class Bitmap implements Parcelable {
// Convenience for JNI access
private final long mNativePtr;
- private final boolean mIsMutable;
-
/**
* Represents whether the Bitmap's content is requested to be pre-multiplied.
* Note that isPremultiplied() does not directly return this value, because
@@ -117,8 +117,7 @@ public final class Bitmap implements Parcelable {
* int (pointer).
*/
// called from JNI
- Bitmap(long nativeBitmap, int width, int height, int density,
- boolean isMutable, boolean requestPremultiplied,
+ Bitmap(long nativeBitmap, int width, int height, int density, boolean requestPremultiplied,
byte[] ninePatchChunk, NinePatch.InsetStruct ninePatchInsets) {
if (nativeBitmap == 0) {
throw new RuntimeException("internal error: native bitmap is 0");
@@ -126,7 +125,6 @@ public final class Bitmap implements Parcelable {
mWidth = width;
mHeight = height;
- mIsMutable = isMutable;
mRequestPremultiplied = requestPremultiplied;
mNinePatchChunk = ninePatchChunk;
@@ -346,14 +344,9 @@ public final class Bitmap implements Parcelable {
* there are no more references to this bitmap.
*/
public void recycle() {
- if (!mRecycled && mNativePtr != 0) {
- if (nativeRecycle(mNativePtr)) {
- // return value indicates whether native pixel object was actually recycled.
- // false indicates that it is still in use at the native level and these
- // objects should not be collected now. They will be collected later when the
- // Bitmap itself is collected.
- mNinePatchChunk = null;
- }
+ if (!mRecycled) {
+ nativeRecycle(mNativePtr);
+ mNinePatchChunk = null;
mRecycled = true;
}
}
@@ -742,7 +735,7 @@ public final class Bitmap implements Parcelable {
}
/**
- * Returns an immutable bitmap from the source bitmap. The new bitmap may
+ * Returns a bitmap from the source bitmap. The new bitmap may
* be the same object as source, or a copy may have been made. It is
* initialized with the same density and color space as the original bitmap.
*/
@@ -751,7 +744,7 @@ public final class Bitmap implements Parcelable {
}
/**
- * Returns an immutable bitmap from the specified subset of the source
+ * Returns a bitmap from the specified subset of the source
* bitmap. The new bitmap may be the same object as source, or a copy may
* have been made. It is initialized with the same density and color space
* as the original bitmap.
@@ -771,7 +764,7 @@ public final class Bitmap implements Parcelable {
}
/**
- * Returns an immutable bitmap from subset of the source bitmap,
+ * Returns a bitmap from subset of the source bitmap,
* transformed by the optional matrix. The new bitmap may be the
* same object as source, or a copy may have been made. It is
* initialized with the same density and color space as the original
@@ -781,6 +774,12 @@ public final class Bitmap implements Parcelable {
* same as the source bitmap itself, then the source bitmap is
* returned and no new bitmap is created.
*
+ * The returned bitmap will always be mutable except in the following scenarios:
+ * (1) In situations where the source bitmap is returned and the source bitmap is immutable
+ *
+ * (2) The source bitmap is a hardware bitmap. That is {@link #getConfig()} is equivalent to
+ * {@link Config#HARDWARE}
+ *
* @param source The bitmap we are subsetting
* @param x The x coordinate of the first pixel in source
* @param y The y coordinate of the first pixel in source
@@ -1218,11 +1217,9 @@ public final class Bitmap implements Parcelable {
* scaled to match if necessary.
* @param height The height of the bitmap to create. The picture's height will be
* scaled to match if necessary.
- * @param config The {@link Config} of the created bitmap. If this is null then
- * the bitmap will be {@link Config#HARDWARE}.
+ * @param config The {@link Config} of the created bitmap.
*
- * @return An immutable bitmap with a HARDWARE config whose contents are created
- * from the recorded drawing commands in the Picture source.
+ * @return An immutable bitmap with a configuration specified by the config parameter
*/
public static @NonNull Bitmap createBitmap(@NonNull Picture source, int width, int height,
@NonNull Config config) {
@@ -1261,7 +1258,7 @@ public final class Bitmap implements Parcelable {
}
canvas.drawPicture(source);
canvas.setBitmap(null);
- bitmap.makeImmutable();
+ bitmap.setImmutable();
return bitmap;
}
}
@@ -1352,13 +1349,22 @@ public final class Bitmap implements Parcelable {
* Returns true if the bitmap is marked as mutable (i.e.&nbsp;can be drawn into)
*/
public final boolean isMutable() {
- return mIsMutable;
+ return !nativeIsImmutable(mNativePtr);
}
- /** @hide */
- public final void makeImmutable() {
- // todo mIsMutable = false;
- // todo nMakeImmutable();
+ /**
+ * Marks the Bitmap as immutable. Further modifications to this Bitmap are disallowed.
+ * After this method is called, this Bitmap cannot be made mutable again and subsequent calls
+ * to {@link #reconfigure(int, int, Config)}, {@link #setPixel(int, int, int)},
+ * {@link #setPixels(int[], int, int, int, int, int, int)} and {@link #eraseColor(int)} will
+ * fail and throw an IllegalStateException.
+ *
+ * @hide
+ */
+ public void setImmutable() {
+ if (isMutable()) {
+ nativeSetImmutable(mNativePtr);
+ }
}
/**
@@ -1924,7 +1930,7 @@ public final class Bitmap implements Parcelable {
public void writeToParcel(Parcel p, int flags) {
checkRecycled("Can't parcel a recycled bitmap");
noteHardwareBitmapSlowCall();
- if (!nativeWriteToParcel(mNativePtr, mIsMutable, mDensity, p)) {
+ if (!nativeWriteToParcel(mNativePtr, isMutable(), mDensity, p)) {
throw new RuntimeException("native writeToParcel failed");
}
}
@@ -2042,7 +2048,7 @@ public final class Bitmap implements Parcelable {
private static native Bitmap nativeCopyAshmem(long nativeSrcBitmap);
private static native Bitmap nativeCopyAshmemConfig(long nativeSrcBitmap, int nativeConfig);
private static native long nativeGetNativeFinalizer();
- private static native boolean nativeRecycle(long nativeBitmap);
+ private static native void nativeRecycle(long nativeBitmap);
private static native void nativeReconfigure(long nativeBitmap, int width, int height,
int config, boolean isPremultiplied);
@@ -2097,4 +2103,11 @@ public final class Bitmap implements Parcelable {
private static native boolean nativeIsSRGB(long nativePtr);
private static native boolean nativeIsSRGBLinear(long nativePtr);
private static native void nativeCopyColorSpace(long srcBitmap, long dstBitmap);
+
+ private static native void nativeSetImmutable(long nativePtr);
+
+ // ---------------- @CriticalNative -------------------
+
+ @CriticalNative
+ private static native boolean nativeIsImmutable(long nativePtr);
}
diff --git a/graphics/java/android/graphics/ColorSpace.java b/graphics/java/android/graphics/ColorSpace.java
index 5814df5b5cc0..8414d6a6b866 100644
--- a/graphics/java/android/graphics/ColorSpace.java
+++ b/graphics/java/android/graphics/ColorSpace.java
@@ -239,7 +239,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Opto-electronic transfer function (OETF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{sRGB} = \begin{cases} 12.92 \times C_{linear} & C_{linear} \lt 0.0031308 \\
+ * C_{sRGB} = \begin{cases} 12.92 \times C_{linear} & C_{linear} \lt 0.0031308 \\\
* 1.055 \times C_{linear}^{\frac{1}{2.4}} - 0.055 & C_{linear} \ge 0.0031308 \end{cases}
* \end{equation}\)
* </td>
@@ -247,7 +247,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Electro-optical transfer function (EOTF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{linear} = \begin{cases}\frac{C_{sRGB}}{12.92} & C_{sRGB} \lt 0.04045 \\
+ * C_{linear} = \begin{cases}\frac{C_{sRGB}}{12.92} & C_{sRGB} \lt 0.04045 \\\
* \left( \frac{C_{sRGB} + 0.055}{1.055} \right) ^{2.4} & C_{sRGB} \ge 0.04045 \end{cases}
* \end{equation}\)
* </td>
@@ -302,7 +302,7 @@ public abstract class ColorSpace {
* <td>Opto-electronic transfer function (OETF)</td>
* <td colspan="4">\(\begin{equation}
* C_{scRGB} = \begin{cases} sign(C_{linear}) 12.92 \times \left| C_{linear} \right| &
- * \left| C_{linear} \right| \lt 0.0031308 \\
+ * \left| C_{linear} \right| \lt 0.0031308 \\\
* sign(C_{linear}) 1.055 \times \left| C_{linear} \right| ^{\frac{1}{2.4}} - 0.055 &
* \left| C_{linear} \right| \ge 0.0031308 \end{cases}
* \end{equation}\)
@@ -312,7 +312,7 @@ public abstract class ColorSpace {
* <td>Electro-optical transfer function (EOTF)</td>
* <td colspan="4">\(\begin{equation}
* C_{linear} = \begin{cases}sign(C_{scRGB}) \frac{\left| C_{scRGB} \right|}{12.92} &
- * \left| C_{scRGB} \right| \lt 0.04045 \\
+ * \left| C_{scRGB} \right| \lt 0.04045 \\\
* sign(C_{scRGB}) \left( \frac{\left| C_{scRGB} \right| + 0.055}{1.055} \right) ^{2.4} &
* \left| C_{scRGB} \right| \ge 0.04045 \end{cases}
* \end{equation}\)
@@ -367,7 +367,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Opto-electronic transfer function (OETF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{BT709} = \begin{cases} 4.5 \times C_{linear} & C_{linear} \lt 0.018 \\
+ * C_{BT709} = \begin{cases} 4.5 \times C_{linear} & C_{linear} \lt 0.018 \\\
* 1.099 \times C_{linear}^{\frac{1}{2.2}} - 0.099 & C_{linear} \ge 0.018 \end{cases}
* \end{equation}\)
* </td>
@@ -375,7 +375,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Electro-optical transfer function (EOTF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{linear} = \begin{cases}\frac{C_{BT709}}{4.5} & C_{BT709} \lt 0.081 \\
+ * C_{linear} = \begin{cases}\frac{C_{BT709}}{4.5} & C_{BT709} \lt 0.081 \\\
* \left( \frac{C_{BT709} + 0.099}{1.099} \right) ^{2.2} & C_{BT709} \ge 0.081 \end{cases}
* \end{equation}\)
* </td>
@@ -402,7 +402,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Opto-electronic transfer function (OETF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{BT2020} = \begin{cases} 4.5 \times C_{linear} & C_{linear} \lt 0.0181 \\
+ * C_{BT2020} = \begin{cases} 4.5 \times C_{linear} & C_{linear} \lt 0.0181 \\\
* 1.0993 \times C_{linear}^{\frac{1}{2.2}} - 0.0993 & C_{linear} \ge 0.0181 \end{cases}
* \end{equation}\)
* </td>
@@ -410,7 +410,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Electro-optical transfer function (EOTF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{linear} = \begin{cases}\frac{C_{BT2020}}{4.5} & C_{BT2020} \lt 0.08145 \\
+ * C_{linear} = \begin{cases}\frac{C_{BT2020}}{4.5} & C_{BT2020} \lt 0.08145 \\\
* \left( \frac{C_{BT2020} + 0.0993}{1.0993} \right) ^{2.2} & C_{BT2020} \ge 0.08145 \end{cases}
* \end{equation}\)
* </td>
@@ -464,7 +464,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Opto-electronic transfer function (OETF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{DisplayP3} = \begin{cases} 12.92 \times C_{linear} & C_{linear} \lt 0.0030186 \\
+ * C_{DisplayP3} = \begin{cases} 12.92 \times C_{linear} & C_{linear} \lt 0.0030186 \\\
* 1.055 \times C_{linear}^{\frac{1}{2.4}} - 0.055 & C_{linear} \ge 0.0030186 \end{cases}
* \end{equation}\)
* </td>
@@ -472,7 +472,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Electro-optical transfer function (EOTF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{linear} = \begin{cases}\frac{C_{DisplayP3}}{12.92} & C_{sRGB} \lt 0.039 \\
+ * C_{linear} = \begin{cases}\frac{C_{DisplayP3}}{12.92} & C_{sRGB} \lt 0.039 \\\
* \left( \frac{C_{DisplayP3} + 0.055}{1.055} \right) ^{2.4} & C_{sRGB} \ge 0.039 \end{cases}
* \end{equation}\)
* </td>
@@ -499,7 +499,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Opto-electronic transfer function (OETF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{BT709} = \begin{cases} 4.5 \times C_{linear} & C_{linear} \lt 0.018 \\
+ * C_{BT709} = \begin{cases} 4.5 \times C_{linear} & C_{linear} \lt 0.018 \\\
* 1.099 \times C_{linear}^{\frac{1}{2.2}} - 0.099 & C_{linear} \ge 0.018 \end{cases}
* \end{equation}\)
* </td>
@@ -507,7 +507,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Electro-optical transfer function (EOTF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{linear} = \begin{cases}\frac{C_{BT709}}{4.5} & C_{BT709} \lt 0.081 \\
+ * C_{linear} = \begin{cases}\frac{C_{BT709}}{4.5} & C_{BT709} \lt 0.081 \\\
* \left( \frac{C_{BT709} + 0.099}{1.099} \right) ^{2.2} & C_{BT709} \ge 0.081 \end{cases}
* \end{equation}\)
* </td>
@@ -534,7 +534,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Opto-electronic transfer function (OETF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{BT709} = \begin{cases} 4.5 \times C_{linear} & C_{linear} \lt 0.018 \\
+ * C_{BT709} = \begin{cases} 4.5 \times C_{linear} & C_{linear} \lt 0.018 \\\
* 1.099 \times C_{linear}^{\frac{1}{2.2}} - 0.099 & C_{linear} \ge 0.018 \end{cases}
* \end{equation}\)
* </td>
@@ -542,7 +542,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Electro-optical transfer function (EOTF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{linear} = \begin{cases}\frac{C_{BT709}}{4.5} & C_{BT709} \lt 0.081 \\
+ * C_{linear} = \begin{cases}\frac{C_{BT709}}{4.5} & C_{BT709} \lt 0.081 \\\
* \left( \frac{C_{BT709} + 0.099}{1.099} \right) ^{2.2} & C_{BT709} \ge 0.081 \end{cases}
* \end{equation}\)
* </td>
@@ -596,7 +596,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Opto-electronic transfer function (OETF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{ROMM} = \begin{cases} 16 \times C_{linear} & C_{linear} \lt 0.001953 \\
+ * C_{ROMM} = \begin{cases} 16 \times C_{linear} & C_{linear} \lt 0.001953 \\\
* C_{linear}^{\frac{1}{1.8}} & C_{linear} \ge 0.001953 \end{cases}
* \end{equation}\)
* </td>
@@ -604,7 +604,7 @@ public abstract class ColorSpace {
* <tr>
* <td>Electro-optical transfer function (EOTF)</td>
* <td colspan="4">\(\begin{equation}
- * C_{linear} = \begin{cases}\frac{C_{ROMM}}{16} & C_{ROMM} \lt 0.031248 \\
+ * C_{linear} = \begin{cases}\frac{C_{ROMM}}{16} & C_{ROMM} \lt 0.031248 \\\
* C_{ROMM}^{1.8} & C_{ROMM} \ge 0.031248 \end{cases}
* \end{equation}\)
* </td>
@@ -759,12 +759,12 @@ public abstract class ColorSpace {
*
* $$\begin{align*}
* \left[ \begin{array}{c} L_1\\ M_1\\ S_1 \end{array} \right] &=
- * A \left[ \begin{array}{c} W1_X\\ W1_Y\\ W1_Z \end{array} \right] \\
+ * A \left[ \begin{array}{c} W1_X\\ W1_Y\\ W1_Z \end{array} \right] \\\
* \left[ \begin{array}{c} L_2\\ M_2\\ S_2 \end{array} \right] &=
- * A \left[ \begin{array}{c} W2_X\\ W2_Y\\ W2_Z \end{array} \right] \\
- * D &= \left[ \begin{matrix} \frac{L_2}{L_1} & 0 & 0 \\
- * 0 & \frac{M_2}{M_1} & 0 \\
- * 0 & 0 & \frac{S_2}{S_1} \end{matrix} \right] \\
+ * A \left[ \begin{array}{c} W2_X\\ W2_Y\\ W2_Z \end{array} \right] \\\
+ * D &= \left[ \begin{matrix} \frac{L_2}{L_1} & 0 & 0 \\\
+ * 0 & \frac{M_2}{M_1} & 0 \\\
+ * 0 & 0 & \frac{S_2}{S_1} \end{matrix} \right] \\\
* T &= A^{-1}.D.A
* \end{align*}$$
*
@@ -2028,7 +2028,7 @@ public abstract class ColorSpace {
* <p>The EOTF is of the form:</p>
*
* \(\begin{equation}
- * Y = \begin{cases}c X + f & X \lt d \\
+ * Y = \begin{cases}c X + f & X \lt d \\\
* \left( a X + b \right) ^{g} + e & X \ge d \end{cases}
* \end{equation}\)
*
@@ -2066,7 +2066,7 @@ public abstract class ColorSpace {
* <p>The EOTF is of the form:</p>
*
* \(\begin{equation}
- * Y = \begin{cases}c X & X \lt d \\
+ * Y = \begin{cases}c X & X \lt d \\\
* \left( a X + b \right) ^{g} & X \ge d \end{cases}
* \end{equation}\)
*
diff --git a/graphics/java/android/graphics/Insets.java b/graphics/java/android/graphics/Insets.java
index 156f9903a632..5a78530852c7 100644
--- a/graphics/java/android/graphics/Insets.java
+++ b/graphics/java/android/graphics/Insets.java
@@ -23,7 +23,6 @@ package android.graphics;
* <p>
* Insets are immutable so may be treated as values.
*
- * @hide
*/
public class Insets {
public static final Insets NONE = new Insets(0, 0, 0, 0);
diff --git a/graphics/java/android/graphics/Path.java b/graphics/java/android/graphics/Path.java
index cd0862cd13fe..1652f6459f0d 100644
--- a/graphics/java/android/graphics/Path.java
+++ b/graphics/java/android/graphics/Path.java
@@ -66,7 +66,7 @@ public class Path {
*
* @param src The path to copy from when initializing the new path
*/
- public Path(Path src) {
+ public Path(@Nullable Path src) {
long valNative = 0;
if (src != null) {
valNative = src.mNativePath;
@@ -168,7 +168,7 @@ public class Path {
* @see Op
* @see #op(Path, Path, android.graphics.Path.Op)
*/
- public boolean op(Path path, Op op) {
+ public boolean op(@NonNull Path path, @NonNull Op op) {
return op(this, path, op);
}
@@ -186,7 +186,7 @@ public class Path {
* @see Op
* @see #op(Path, android.graphics.Path.Op)
*/
- public boolean op(Path path1, Path path2, Op op) {
+ public boolean op(@NonNull Path path1, @NonNull Path path2, @NonNull Op op) {
if (nOp(path1.mNativePath, path2.mNativePath, op.ordinal(), this.mNativePath)) {
isSimplePath = false;
rects = null;
@@ -255,6 +255,7 @@ public class Path {
*
* @return the path's fill type
*/
+ @NonNull
public FillType getFillType() {
return sFillTypeArray[nGetFillType(mNativePath)];
}
@@ -264,7 +265,7 @@ public class Path {
*
* @param ft The new fill type for this path
*/
- public void setFillType(FillType ft) {
+ public void setFillType(@NonNull FillType ft) {
nSetFillType(mNativePath, ft.nativeInt);
}
@@ -318,7 +319,7 @@ public class Path {
* @param exact This parameter is no longer used.
*/
@SuppressWarnings({"UnusedDeclaration"})
- public void computeBounds(RectF bounds, boolean exact) {
+ public void computeBounds(@NonNull RectF bounds, boolean exact) {
nComputeBounds(mNativePath, bounds);
}
@@ -461,7 +462,7 @@ public class Path {
* mod 360.
* @param forceMoveTo If true, always begin a new contour with the arc
*/
- public void arcTo(RectF oval, float startAngle, float sweepAngle,
+ public void arcTo(@NonNull RectF oval, float startAngle, float sweepAngle,
boolean forceMoveTo) {
arcTo(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle, forceMoveTo);
}
@@ -477,7 +478,7 @@ public class Path {
* @param startAngle Starting angle (in degrees) where the arc begins
* @param sweepAngle Sweep angle (in degrees) measured clockwise
*/
- public void arcTo(RectF oval, float startAngle, float sweepAngle) {
+ public void arcTo(@NonNull RectF oval, float startAngle, float sweepAngle) {
arcTo(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle, false);
}
@@ -542,7 +543,7 @@ public class Path {
* @param rect The rectangle to add as a closed contour to the path
* @param dir The direction to wind the rectangle's contour
*/
- public void addRect(RectF rect, Direction dir) {
+ public void addRect(@NonNull RectF rect, @NonNull Direction dir) {
addRect(rect.left, rect.top, rect.right, rect.bottom, dir);
}
@@ -555,7 +556,7 @@ public class Path {
* @param bottom The bottom of a rectangle to add to the path
* @param dir The direction to wind the rectangle's contour
*/
- public void addRect(float left, float top, float right, float bottom, Direction dir) {
+ public void addRect(float left, float top, float right, float bottom, @NonNull Direction dir) {
detectSimplePath(left, top, right, bottom, dir);
nAddRect(mNativePath, left, top, right, bottom, dir.nativeInt);
}
@@ -566,7 +567,7 @@ public class Path {
* @param oval The bounds of the oval to add as a closed contour to the path
* @param dir The direction to wind the oval's contour
*/
- public void addOval(RectF oval, Direction dir) {
+ public void addOval(@NonNull RectF oval, @NonNull Direction dir) {
addOval(oval.left, oval.top, oval.right, oval.bottom, dir);
}
@@ -575,7 +576,7 @@ public class Path {
*
* @param dir The direction to wind the oval's contour
*/
- public void addOval(float left, float top, float right, float bottom, Direction dir) {
+ public void addOval(float left, float top, float right, float bottom, @NonNull Direction dir) {
isSimplePath = false;
nAddOval(mNativePath, left, top, right, bottom, dir.nativeInt);
}
@@ -588,7 +589,7 @@ public class Path {
* @param radius The radius of a circle to add to the path
* @param dir The direction to wind the circle's contour
*/
- public void addCircle(float x, float y, float radius, Direction dir) {
+ public void addCircle(float x, float y, float radius, @NonNull Direction dir) {
isSimplePath = false;
nAddCircle(mNativePath, x, y, radius, dir.nativeInt);
}
@@ -600,7 +601,7 @@ public class Path {
* @param startAngle Starting angle (in degrees) where the arc begins
* @param sweepAngle Sweep angle (in degrees) measured clockwise
*/
- public void addArc(RectF oval, float startAngle, float sweepAngle) {
+ public void addArc(@NonNull RectF oval, float startAngle, float sweepAngle) {
addArc(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle);
}
@@ -624,7 +625,7 @@ public class Path {
* @param ry The y-radius of the rounded corners on the round-rectangle
* @param dir The direction to wind the round-rectangle's contour
*/
- public void addRoundRect(RectF rect, float rx, float ry, Direction dir) {
+ public void addRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Direction dir) {
addRoundRect(rect.left, rect.top, rect.right, rect.bottom, rx, ry, dir);
}
@@ -636,7 +637,7 @@ public class Path {
* @param dir The direction to wind the round-rectangle's contour
*/
public void addRoundRect(float left, float top, float right, float bottom, float rx, float ry,
- Direction dir) {
+ @NonNull Direction dir) {
isSimplePath = false;
nAddRoundRect(mNativePath, left, top, right, bottom, rx, ry, dir.nativeInt);
}
@@ -650,7 +651,7 @@ public class Path {
* @param radii Array of 8 values, 4 pairs of [X,Y] radii
* @param dir The direction to wind the round-rectangle's contour
*/
- public void addRoundRect(RectF rect, float[] radii, Direction dir) {
+ public void addRoundRect(@NonNull RectF rect, @NonNull float[] radii, @NonNull Direction dir) {
if (rect == null) {
throw new NullPointerException("need rect parameter");
}
@@ -665,8 +666,8 @@ public class Path {
* @param radii Array of 8 values, 4 pairs of [X,Y] radii
* @param dir The direction to wind the round-rectangle's contour
*/
- public void addRoundRect(float left, float top, float right, float bottom, float[] radii,
- Direction dir) {
+ public void addRoundRect(float left, float top, float right, float bottom,
+ @NonNull float[] radii, @NonNull Direction dir) {
if (radii.length < 8) {
throw new ArrayIndexOutOfBoundsException("radii[] needs 8 values");
}
@@ -680,7 +681,7 @@ public class Path {
* @param src The path to add as a new contour
* @param dx The amount to translate the path in X as it is added
*/
- public void addPath(Path src, float dx, float dy) {
+ public void addPath(@NonNull Path src, float dx, float dy) {
isSimplePath = false;
nAddPath(mNativePath, src.mNativePath, dx, dy);
}
@@ -690,7 +691,7 @@ public class Path {
*
* @param src The path that is appended to the current path
*/
- public void addPath(Path src) {
+ public void addPath(@NonNull Path src) {
isSimplePath = false;
nAddPath(mNativePath, src.mNativePath);
}
@@ -700,7 +701,7 @@ public class Path {
*
* @param src The path to add as a new contour
*/
- public void addPath(Path src, Matrix matrix) {
+ public void addPath(@NonNull Path src, @NonNull Matrix matrix) {
if (!src.isSimplePath) isSimplePath = false;
nAddPath(mNativePath, src.mNativePath, matrix.native_instance);
}
@@ -760,7 +761,7 @@ public class Path {
* @param dst The transformed path is written here. If dst is null,
* then the the original path is modified
*/
- public void transform(Matrix matrix, Path dst) {
+ public void transform(@NonNull Matrix matrix, @Nullable Path dst) {
long dstNative = 0;
if (dst != null) {
dst.isSimplePath = false;
@@ -774,7 +775,7 @@ public class Path {
*
* @param matrix The matrix to apply to the path
*/
- public void transform(Matrix matrix) {
+ public void transform(@NonNull Matrix matrix) {
isSimplePath = false;
nTransform(mNativePath, matrix.native_instance);
}
diff --git a/graphics/java/android/graphics/Picture.java b/graphics/java/android/graphics/Picture.java
index ac386979ff5b..f2d0227645a9 100644
--- a/graphics/java/android/graphics/Picture.java
+++ b/graphics/java/android/graphics/Picture.java
@@ -163,6 +163,7 @@ public class Picture {
* properly and are highly discouraged.
*
* @see #writeToStream(java.io.OutputStream)
+ * @removed
* @deprecated The recommended alternative is to not use writeToStream and
* instead draw the picture into a Bitmap from which you can persist it as
* raw or compressed pixels.
@@ -179,6 +180,7 @@ public class Picture {
* there is no guarantee that the Picture can be successfully reconstructed.
*
* @see #createFromStream(java.io.InputStream)
+ * @removed
* @deprecated The recommended alternative is to draw the picture into a
* Bitmap from which you can persist it as raw or compressed pixels.
*/
diff --git a/graphics/java/android/graphics/PorterDuffColorFilter.java b/graphics/java/android/graphics/PorterDuffColorFilter.java
index 01d5825dd1e0..88a63223ea40 100644
--- a/graphics/java/android/graphics/PorterDuffColorFilter.java
+++ b/graphics/java/android/graphics/PorterDuffColorFilter.java
@@ -35,8 +35,6 @@ public class PorterDuffColorFilter extends ColorFilter {
* @param mode The porter-duff mode that is applied
*
* @see Color
- * @see #setColor(int)
- * @see #setMode(android.graphics.PorterDuff.Mode)
*/
public PorterDuffColorFilter(@ColorInt int color, @NonNull PorterDuff.Mode mode) {
mColor = color;
@@ -48,7 +46,6 @@ public class PorterDuffColorFilter extends ColorFilter {
* is applied.
*
* @see Color
- * @see #setColor(int)
*
* @hide
*/
@@ -58,30 +55,10 @@ public class PorterDuffColorFilter extends ColorFilter {
}
/**
- * Specifies the color to tint the source pixels with when this color
- * filter is applied.
- *
- * @param color An ARGB {@link Color color}
- *
- * @see Color
- * @see #getColor()
- * @see #getMode()
- *
- * @hide
- */
- public void setColor(@ColorInt int color) {
- if (mColor != color) {
- mColor = color;
- discardNativeInstance();
- }
- }
-
- /**
* Returns the Porter-Duff mode used to composite this color filter's
* color with the source pixel when this filter is applied.
*
* @see PorterDuff
- * @see #setMode(android.graphics.PorterDuff.Mode)
*
* @hide
*/
@@ -89,24 +66,6 @@ public class PorterDuffColorFilter extends ColorFilter {
return mMode;
}
- /**
- * Specifies the Porter-Duff mode to use when compositing this color
- * filter's color with the source pixel at draw time.
- *
- * @see PorterDuff
- * @see #getMode()
- * @see #getColor()
- *
- * @hide
- */
- public void setMode(@NonNull PorterDuff.Mode mode) {
- if (mode == null) {
- throw new IllegalArgumentException("mode must be non-null");
- }
- mMode = mode;
- discardNativeInstance();
- }
-
@Override
long createNativeInstance() {
return native_CreatePorterDuffFilter(mColor, mMode.nativeInt);
diff --git a/graphics/java/android/graphics/Rect.java b/graphics/java/android/graphics/Rect.java
index 3843cb91154c..56a6820f4749 100644
--- a/graphics/java/android/graphics/Rect.java
+++ b/graphics/java/android/graphics/Rect.java
@@ -17,12 +17,13 @@
package android.graphics;
import android.annotation.CheckResult;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
-
import android.text.TextUtils;
import android.util.proto.ProtoOutputStream;
+
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -89,7 +90,7 @@ public final class Rect implements Parcelable {
* @param r The rectangle whose coordinates are copied into the new
* rectangle.
*/
- public Rect(Rect r) {
+ public Rect(@Nullable Rect r) {
if (r == null) {
left = top = right = bottom = 0;
} else {
@@ -140,6 +141,7 @@ public final class Rect implements Parcelable {
/**
* Return a string representation of the rectangle in a compact form.
*/
+ @NonNull
public String toShortString() {
return toShortString(new StringBuilder(32));
}
@@ -148,7 +150,8 @@ public final class Rect implements Parcelable {
* Return a string representation of the rectangle in a compact form.
* @hide
*/
- public String toShortString(StringBuilder sb) {
+ @NonNull
+ public String toShortString(@NonNull StringBuilder sb) {
sb.setLength(0);
sb.append('['); sb.append(left); sb.append(',');
sb.append(top); sb.append("]["); sb.append(right);
@@ -164,6 +167,7 @@ public final class Rect implements Parcelable {
*
* @return Returns a new String of the form "left top right bottom"
*/
+ @NonNull
public String flattenToString() {
StringBuilder sb = new StringBuilder(32);
// WARNING: Do not change the format of this string, it must be
@@ -182,7 +186,8 @@ public final class Rect implements Parcelable {
* Returns a Rect from a string of the form returned by {@link #flattenToString},
* or null if the string is not of that form.
*/
- public static Rect unflattenFromString(String str) {
+ @Nullable
+ public static Rect unflattenFromString(@Nullable String str) {
if (TextUtils.isEmpty(str)) {
return null;
}
@@ -201,7 +206,7 @@ public final class Rect implements Parcelable {
* Print short representation to given writer.
* @hide
*/
- public void printShortString(PrintWriter pw) {
+ public void printShortString(@NonNull PrintWriter pw) {
pw.print('['); pw.print(left); pw.print(',');
pw.print(top); pw.print("]["); pw.print(right);
pw.print(','); pw.print(bottom); pw.print(']');
@@ -215,7 +220,7 @@ public final class Rect implements Parcelable {
* @param fieldId Field Id of the Rect as defined in the parent message
* @hide
*/
- public void writeToProto(ProtoOutputStream protoOutputStream, long fieldId) {
+ public void writeToProto(@NonNull ProtoOutputStream protoOutputStream, long fieldId) {
final long token = protoOutputStream.start(fieldId);
protoOutputStream.write(RectProto.LEFT, left);
protoOutputStream.write(RectProto.TOP, top);
@@ -309,7 +314,7 @@ public final class Rect implements Parcelable {
* @param src The rectangle whose coordinates are copied into this
* rectangle.
*/
- public void set(Rect src) {
+ public void set(@NonNull Rect src) {
this.left = src.left;
this.top = src.top;
this.right = src.right;
@@ -366,7 +371,7 @@ public final class Rect implements Parcelable {
* @hide
* @param insets The rectangle specifying the insets on all side.
*/
- public void inset(Rect insets) {
+ public void inset(@NonNull Rect insets) {
left += insets.left;
top += insets.top;
right -= insets.right;
@@ -432,7 +437,7 @@ public final class Rect implements Parcelable {
* @return true iff the specified rectangle r is inside or equal to this
* rectangle
*/
- public boolean contains(Rect r) {
+ public boolean contains(@NonNull Rect r) {
// check for empty first
return this.left < this.right && this.top < this.bottom
// now check for containment
@@ -481,7 +486,7 @@ public final class Rect implements Parcelable {
* return false and do not change this rectangle.
*/
@CheckResult
- public boolean intersect(Rect r) {
+ public boolean intersect(@NonNull Rect r) {
return intersect(r.left, r.top, r.right, r.bottom);
}
@@ -491,7 +496,7 @@ public final class Rect implements Parcelable {
* @see #inset(int, int, int, int) but without checking if the rects overlap.
* @hide
*/
- public void intersectUnchecked(Rect other) {
+ public void intersectUnchecked(@NonNull Rect other) {
left = Math.max(left, other.left);
top = Math.max(top, other.top);
right = Math.min(right, other.right);
@@ -511,7 +516,7 @@ public final class Rect implements Parcelable {
* false and do not change this rectangle.
*/
@CheckResult
- public boolean setIntersect(Rect a, Rect b) {
+ public boolean setIntersect(@NonNull Rect a, @NonNull Rect b) {
if (a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom) {
left = Math.max(a.left, b.left);
top = Math.max(a.top, b.top);
@@ -550,7 +555,7 @@ public final class Rect implements Parcelable {
* @return true iff the two specified rectangles intersect. In no event are
* either of the rectangles modified.
*/
- public static boolean intersects(Rect a, Rect b) {
+ public static boolean intersects(@NonNull Rect a, @NonNull Rect b) {
return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;
}
@@ -587,7 +592,7 @@ public final class Rect implements Parcelable {
*
* @param r The rectangle being unioned with this rectangle
*/
- public void union(Rect r) {
+ public void union(@NonNull Rect r) {
union(r.left, r.top, r.right, r.bottom);
}
@@ -634,6 +639,7 @@ public final class Rect implements Parcelable {
/**
* Parcelable interface methods
*/
+ @Override
public int describeContents() {
return 0;
}
@@ -643,6 +649,7 @@ public final class Rect implements Parcelable {
* a parcel, use readFromParcel()
* @param out The parcel to write the rectangle's coordinates into
*/
+ @Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(left);
out.writeInt(top);
@@ -654,6 +661,7 @@ public final class Rect implements Parcelable {
/**
* Return a new rectangle from the data in the specified parcel.
*/
+ @Override
public Rect createFromParcel(Parcel in) {
Rect r = new Rect();
r.readFromParcel(in);
@@ -663,6 +671,7 @@ public final class Rect implements Parcelable {
/**
* Return an array of rectangles of the specified size.
*/
+ @Override
public Rect[] newArray(int size) {
return new Rect[size];
}
@@ -674,7 +683,7 @@ public final class Rect implements Parcelable {
*
* @param in The parcel to read the rectangle's coordinates from
*/
- public void readFromParcel(Parcel in) {
+ public void readFromParcel(@NonNull Parcel in) {
left = in.readInt();
top = in.readInt();
right = in.readInt();
diff --git a/graphics/java/android/graphics/RectF.java b/graphics/java/android/graphics/RectF.java
index b49054550956..d6447ac237ab 100644
--- a/graphics/java/android/graphics/RectF.java
+++ b/graphics/java/android/graphics/RectF.java
@@ -16,12 +16,15 @@
package android.graphics;
-import java.io.PrintWriter;
-
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
+
import com.android.internal.util.FastMath;
+import java.io.PrintWriter;
+
/**
* RectF holds four float coordinates for a rectangle. The rectangle is
* represented by the coordinates of its 4 edges (left, top, right bottom).
@@ -64,7 +67,7 @@ public class RectF implements Parcelable {
* @param r The rectangle whose coordinates are copied into the new
* rectangle.
*/
- public RectF(RectF r) {
+ public RectF(@Nullable RectF r) {
if (r == null) {
left = top = right = bottom = 0.0f;
} else {
@@ -75,7 +78,7 @@ public class RectF implements Parcelable {
}
}
- public RectF(Rect r) {
+ public RectF(@Nullable Rect r) {
if (r == null) {
left = top = right = bottom = 0.0f;
} else {
@@ -104,6 +107,7 @@ public class RectF implements Parcelable {
return result;
}
+ @Override
public String toString() {
return "RectF(" + left + ", " + top + ", "
+ right + ", " + bottom + ")";
@@ -112,6 +116,7 @@ public class RectF implements Parcelable {
/**
* Return a string representation of the rectangle in a compact form.
*/
+ @NonNull
public String toShortString() {
return toShortString(new StringBuilder(32));
}
@@ -120,7 +125,8 @@ public class RectF implements Parcelable {
* Return a string representation of the rectangle in a compact form.
* @hide
*/
- public String toShortString(StringBuilder sb) {
+ @NonNull
+ public String toShortString(@NonNull StringBuilder sb) {
sb.setLength(0);
sb.append('['); sb.append(left); sb.append(',');
sb.append(top); sb.append("]["); sb.append(right);
@@ -132,7 +138,7 @@ public class RectF implements Parcelable {
* Print short representation to given writer.
* @hide
*/
- public void printShortString(PrintWriter pw) {
+ public void printShortString(@NonNull PrintWriter pw) {
pw.print('['); pw.print(left); pw.print(',');
pw.print(top); pw.print("]["); pw.print(right);
pw.print(','); pw.print(bottom); pw.print(']');
@@ -207,7 +213,7 @@ public class RectF implements Parcelable {
* @param src The rectangle whose coordinates are copied into this
* rectangle.
*/
- public void set(RectF src) {
+ public void set(@NonNull RectF src) {
this.left = src.left;
this.top = src.top;
this.right = src.right;
@@ -220,7 +226,7 @@ public class RectF implements Parcelable {
* @param src The rectangle whose coordinates are copied into this
* rectangle.
*/
- public void set(Rect src) {
+ public void set(@NonNull Rect src) {
this.left = src.left;
this.top = src.top;
this.right = src.right;
@@ -315,7 +321,7 @@ public class RectF implements Parcelable {
* @return true iff the specified rectangle r is inside or equal to this
* rectangle
*/
- public boolean contains(RectF r) {
+ public boolean contains(@NonNull RectF r) {
// check for empty first
return this.left < this.right && this.top < this.bottom
// now check for containment
@@ -372,7 +378,7 @@ public class RectF implements Parcelable {
* (and this rectangle is then set to that intersection) else
* return false and do not change this rectangle.
*/
- public boolean intersect(RectF r) {
+ public boolean intersect(@NonNull RectF r) {
return intersect(r.left, r.top, r.right, r.bottom);
}
@@ -388,7 +394,7 @@ public class RectF implements Parcelable {
* this rectangle to that intersection. If they do not, return
* false and do not change this rectangle.
*/
- public boolean setIntersect(RectF a, RectF b) {
+ public boolean setIntersect(@NonNull RectF a, @NonNull RectF b) {
if (a.left < b.right && b.left < a.right
&& a.top < b.bottom && b.top < a.bottom) {
left = Math.max(a.left, b.left);
@@ -430,7 +436,7 @@ public class RectF implements Parcelable {
* @return true iff the two specified rectangles intersect. In no event are
* either of the rectangles modified.
*/
- public static boolean intersects(RectF a, RectF b) {
+ public static boolean intersects(@NonNull RectF a, @NonNull RectF b) {
return a.left < b.right && b.left < a.right
&& a.top < b.bottom && b.top < a.bottom;
}
@@ -439,7 +445,7 @@ public class RectF implements Parcelable {
* Set the dst integer Rect by rounding this rectangle's coordinates
* to their nearest integer values.
*/
- public void round(Rect dst) {
+ public void round(@NonNull Rect dst) {
dst.set(FastMath.round(left), FastMath.round(top),
FastMath.round(right), FastMath.round(bottom));
}
@@ -448,7 +454,7 @@ public class RectF implements Parcelable {
* Set the dst integer Rect by rounding "out" this rectangle, choosing the
* floor of top and left, and the ceiling of right and bottom.
*/
- public void roundOut(Rect dst) {
+ public void roundOut(@NonNull Rect dst) {
dst.set((int) Math.floor(left), (int) Math.floor(top),
(int) Math.ceil(right), (int) Math.ceil(bottom));
}
@@ -490,7 +496,7 @@ public class RectF implements Parcelable {
*
* @param r The rectangle being unioned with this rectangle
*/
- public void union(RectF r) {
+ public void union(@NonNull RectF r) {
union(r.left, r.top, r.right, r.bottom);
}
@@ -537,6 +543,7 @@ public class RectF implements Parcelable {
/**
* Parcelable interface methods
*/
+ @Override
public int describeContents() {
return 0;
}
@@ -546,6 +553,7 @@ public class RectF implements Parcelable {
* a parcel, use readFromParcel()
* @param out The parcel to write the rectangle's coordinates into
*/
+ @Override
public void writeToParcel(Parcel out, int flags) {
out.writeFloat(left);
out.writeFloat(top);
@@ -557,6 +565,7 @@ public class RectF implements Parcelable {
/**
* Return a new rectangle from the data in the specified parcel.
*/
+ @Override
public RectF createFromParcel(Parcel in) {
RectF r = new RectF();
r.readFromParcel(in);
@@ -566,6 +575,7 @@ public class RectF implements Parcelable {
/**
* Return an array of rectangles of the specified size.
*/
+ @Override
public RectF[] newArray(int size) {
return new RectF[size];
}
@@ -577,7 +587,7 @@ public class RectF implements Parcelable {
*
* @param in The parcel to read the rectangle's coordinates from
*/
- public void readFromParcel(Parcel in) {
+ public void readFromParcel(@NonNull Parcel in) {
left = in.readFloat();
top = in.readFloat();
right = in.readFloat();
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
index e397ed90c2e2..8e9862c39af0 100644
--- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
@@ -516,7 +516,6 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 {
mAnimatedVectorState.mVectorDrawable.getOutline(outline);
}
- /** @hide */
@Override
public Insets getOpticalInsets() {
return mAnimatedVectorState.mVectorDrawable.getOpticalInsets();
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index 44b783bb6e63..99bed60afbfe 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -23,7 +23,6 @@ import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
@@ -627,9 +626,6 @@ public class BitmapDrawable extends Drawable {
mDstRectAndInsetsDirty = false;
}
- /**
- * @hide
- */
@Override
public Insets getOpticalInsets() {
updateDstRectAndInsetsIfDirty();
diff --git a/graphics/java/android/graphics/drawable/ColorDrawable.java b/graphics/java/android/graphics/drawable/ColorDrawable.java
index 9ae747de2f82..a601d6d6feba 100644
--- a/graphics/java/android/graphics/drawable/ColorDrawable.java
+++ b/graphics/java/android/graphics/drawable/ColorDrawable.java
@@ -21,12 +21,18 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.content.pm.ActivityInfo.Config;
-import android.graphics.*;
-import android.graphics.PorterDuff.Mode;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Outline;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.Xfermode;
import android.util.AttributeSet;
import android.view.ViewDebug;
@@ -180,6 +186,17 @@ public class ColorDrawable extends Drawable {
mPaint.setColorFilter(colorFilter);
}
+ /**
+ * Returns the color filter applied to this color configured by
+ * {@link #setColorFilter(ColorFilter)}
+ *
+ * @see android.graphics.drawable.Drawable#getColorFilter()
+ */
+ @Override
+ public @Nullable ColorFilter getColorFilter() {
+ return mPaint.getColorFilter();
+ }
+
@Override
public void setTintList(ColorStateList tint) {
mColorState.mTint = tint;
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 8af2fd8bbb5e..986d0c1c1da7 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -16,11 +16,6 @@
package android.graphics.drawable;
-import com.android.internal.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.annotation.AttrRes;
import android.annotation.ColorInt;
import android.annotation.IntRange;
@@ -57,6 +52,11 @@ import android.util.TypedValue;
import android.util.Xml;
import android.view.View;
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -1088,7 +1088,6 @@ public abstract class Drawable {
* Return in insets the layout insets suggested by this Drawable for use with alignment
* operations during layout.
*
- * @hide
*/
public @NonNull Insets getOpticalInsets() {
return Insets.NONE;
@@ -1516,12 +1515,11 @@ public abstract class Drawable {
}
final int color = tint.getColorForState(getState(), Color.TRANSPARENT);
- if (tintFilter == null) {
+ if (tintFilter == null || tintFilter.getColor() != color
+ || tintFilter.getMode() != tintMode) {
return new PorterDuffColorFilter(color, tintMode);
}
- tintFilter.setColor(color);
- tintFilter.setMode(tintMode);
return tintFilter;
}
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index aa4cd9cba4a7..e7b383a2f9c8 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -120,9 +120,6 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
return result;
}
- /**
- * @hide
- */
@Override
public Insets getOpticalInsets() {
if (mCurrDrawable != null) {
diff --git a/graphics/java/android/graphics/drawable/DrawableWrapper.java b/graphics/java/android/graphics/drawable/DrawableWrapper.java
index b71f3ef594a9..a907ca5928f5 100644
--- a/graphics/java/android/graphics/drawable/DrawableWrapper.java
+++ b/graphics/java/android/graphics/drawable/DrawableWrapper.java
@@ -16,11 +16,6 @@
package android.graphics.drawable;
-import com.android.internal.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.ActivityInfo.Config;
@@ -35,10 +30,16 @@ import android.graphics.Outline;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.Rect;
+import android.graphics.Xfermode;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
/**
@@ -78,6 +79,16 @@ public abstract class DrawableWrapper extends Drawable implements Drawable.Callb
}
/**
+ * @hide
+ */
+ @Override
+ public void setXfermode(Xfermode mode) {
+ if (mDrawable != null) {
+ mDrawable.setXfermode(mode);
+ }
+ }
+
+ /**
* Sets the wrapped drawable.
*
* @param dr the wrapped drawable
@@ -240,7 +251,6 @@ public abstract class DrawableWrapper extends Drawable implements Drawable.Callb
return mDrawable != null && mDrawable.getPadding(padding);
}
- /** @hide */
@Override
public Insets getOpticalInsets() {
return mDrawable != null ? mDrawable.getOpticalInsets() : Insets.NONE;
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index dfdddb2a599a..5629389aaa42 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -392,6 +392,7 @@ public class GradientDrawable extends Drawable {
e = new DashPathEffect(new float[] { dashWidth, dashGap }, 0);
}
mStrokePaint.setPathEffect(e);
+ mGradientIsDirty = true;
invalidateSelf();
}
@@ -930,16 +931,15 @@ public class GradientDrawable extends Drawable {
* @see #getColor
*/
public void setColor(@Nullable ColorStateList colorStateList) {
- mGradientState.setSolidColors(colorStateList);
- final int color;
if (colorStateList == null) {
- color = Color.TRANSPARENT;
+ setColor(Color.TRANSPARENT);
} else {
final int[] stateSet = getState();
- color = colorStateList.getColorForState(stateSet, 0);
+ final int color = colorStateList.getColorForState(stateSet, 0);
+ mGradientState.setSolidColors(colorStateList);
+ mFillPaint.setColor(color);
+ invalidateSelf();
}
- mFillPaint.setColor(color);
- invalidateSelf();
}
/**
@@ -1698,7 +1698,6 @@ public class GradientDrawable extends Drawable {
return mGradientState.mHeight;
}
- /** @hide */
@Override
public Insets getOpticalInsets() {
return mGradientState.mOpticalInsets;
diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java
index 443aa4931ee3..ade42949cdaf 100644
--- a/graphics/java/android/graphics/drawable/InsetDrawable.java
+++ b/graphics/java/android/graphics/drawable/InsetDrawable.java
@@ -16,11 +16,6 @@
package android.graphics.drawable;
-import com.android.internal.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.res.Resources;
@@ -35,6 +30,11 @@ import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import java.io.IOException;
/**
@@ -240,7 +240,6 @@ public class InsetDrawable extends DrawableWrapper {
| mTmpInsetRect.top | mTmpInsetRect.bottom) != 0;
}
- /** @hide */
@Override
public Insets getOpticalInsets() {
final Insets contentInsets = super.getOpticalInsets();
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index 5ff49aba88ae..7f23cea6a806 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -299,9 +299,6 @@ public class NinePatchDrawable extends Drawable {
super.getOutline(outline);
}
- /**
- * @hide
- */
@Override
public Insets getOpticalInsets() {
final Insets opticalInsets = mOpticalInsets;
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index 0da61c29bd8d..266a6ac87d53 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -888,7 +888,10 @@ public class RippleDrawable extends LayerDrawable {
// The ripple timing depends on the paint's alpha value, so we need
// to push just the alpha channel into the paint and let the filter
// handle the full-alpha color.
- mMaskColorFilter.setColor(color | 0xFF000000);
+ int maskColor = color | 0xFF000000;
+ if (mMaskColorFilter.getColor() != maskColor) {
+ mMaskColorFilter = new PorterDuffColorFilter(maskColor, mMaskColorFilter.getMode());
+ }
p.setColor(color & 0xFF000000);
p.setColorFilter(mMaskColorFilter);
p.setShader(mMaskShader);
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index 34da928bb6f1..7bfb4c38d6c8 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -594,12 +594,12 @@ public class ShapeDrawable extends Drawable {
@Override
public Drawable newDrawable() {
- return new ShapeDrawable(this, null);
+ return new ShapeDrawable(new ShapeState(this), null);
}
@Override
public Drawable newDrawable(Resources res) {
- return new ShapeDrawable(this, res);
+ return new ShapeDrawable(new ShapeState(this), res);
}
@Override
diff --git a/graphics/java/android/graphics/drawable/StateListDrawable.java b/graphics/java/android/graphics/drawable/StateListDrawable.java
index c98f1608c665..67c341287095 100644
--- a/graphics/java/android/graphics/drawable/StateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/StateListDrawable.java
@@ -16,6 +16,14 @@
package android.graphics.drawable;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.res.Resources;
+import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.util.StateSet;
+
import com.android.internal.R;
import org.xmlpull.v1.XmlPullParser;
@@ -24,14 +32,6 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.Arrays;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.content.res.Resources.Theme;
-import android.util.AttributeSet;
-import android.util.StateSet;
-
/**
* Lets you assign a number of graphic images to a single Drawable and swap out the visible item by a string
* ID value.
@@ -73,9 +73,11 @@ public class StateListDrawable extends DrawableContainer {
/**
* Add a new image/string ID to the set of images.
*
- * @param stateSet - An array of resource Ids to associate with the image.
+ * @param stateSet An array of resource Ids to associate with the image.
* Switch to this image by calling setState().
- * @param drawable -The image to show.
+ * @param drawable The image to show. Note this must be a unique Drawable that is not shared
+ * between any other View or Drawable otherwise the results are
+ * undefined and can lead to unexpected rendering behavior
*/
public void addState(int[] stateSet, Drawable drawable) {
if (drawable != null) {
@@ -235,7 +237,6 @@ public class StateListDrawable extends DrawableContainer {
* Gets the number of states contained in this drawable.
*
* @return The number of states contained in this drawable.
- * @hide pending API council
* @see #getStateSet(int)
* @see #getStateDrawable(int)
*/
@@ -248,7 +249,6 @@ public class StateListDrawable extends DrawableContainer {
*
* @param index The index of the state set.
* @return The state set at the index.
- * @hide pending API council
* @see #getStateCount()
* @see #getStateDrawable(int)
*/
@@ -261,7 +261,6 @@ public class StateListDrawable extends DrawableContainer {
*
* @param index The index of the drawable.
* @return The drawable at the index.
- * @hide pending API council
* @see #getStateCount()
* @see #getStateSet(int)
*/
@@ -274,7 +273,6 @@ public class StateListDrawable extends DrawableContainer {
*
* @param stateSet the state set to look up
* @return the index of the provided state set, or -1 if not found
- * @hide pending API council
* @see #getStateDrawable(int)
* @see #getStateSet(int)
*/
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index c71585f32155..b5bd97f74d84 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -46,6 +46,9 @@ import android.util.Xml;
import com.android.internal.R;
import com.android.internal.util.VirtualRefBasePtr;
+import dalvik.annotation.optimization.FastNative;
+import dalvik.system.VMRuntime;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -56,9 +59,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.Stack;
-import dalvik.annotation.optimization.FastNative;
-import dalvik.system.VMRuntime;
-
/**
* This lets you create a drawable based on an XML vector graphic.
* <p/>
@@ -543,7 +543,6 @@ public class VectorDrawable extends Drawable {
return mDpiScaledHeight;
}
- /** @hide */
@Override
public Insets getOpticalInsets() {
if (mDpiScaledDirty) {
diff --git a/graphics/java/android/graphics/drawable/shapes/ArcShape.java b/graphics/java/android/graphics/drawable/shapes/ArcShape.java
index 85ba0a9e9f6f..90d07bce2617 100644
--- a/graphics/java/android/graphics/drawable/shapes/ArcShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/ArcShape.java
@@ -20,6 +20,8 @@ import android.graphics.Canvas;
import android.graphics.Outline;
import android.graphics.Paint;
+import java.util.Objects;
+
/**
* Creates an arc shape. The arc shape starts at a specified angle and sweeps
* clockwise, drawing slices of pie.
@@ -74,5 +76,26 @@ public class ArcShape extends RectShape {
public ArcShape clone() throws CloneNotSupportedException {
return (ArcShape) super.clone();
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ if (!super.equals(o)) {
+ return false;
+ }
+ ArcShape arcShape = (ArcShape) o;
+ return Float.compare(arcShape.mStartAngle, mStartAngle) == 0
+ && Float.compare(arcShape.mSweepAngle, mSweepAngle) == 0;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mStartAngle, mSweepAngle);
+ }
}
diff --git a/graphics/java/android/graphics/drawable/shapes/PathShape.java b/graphics/java/android/graphics/drawable/shapes/PathShape.java
index ce5552b7a1bb..393fdee87bb8 100644
--- a/graphics/java/android/graphics/drawable/shapes/PathShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/PathShape.java
@@ -21,6 +21,8 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
+import java.util.Objects;
+
/**
* Creates geometric paths, utilizing the {@link android.graphics.Path} class.
* <p>
@@ -74,5 +76,30 @@ public class PathShape extends Shape {
shape.mPath = new Path(mPath);
return shape;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ if (!super.equals(o)) {
+ return false;
+ }
+ PathShape pathShape = (PathShape) o;
+ return Float.compare(pathShape.mStdWidth, mStdWidth) == 0
+ && Float.compare(pathShape.mStdHeight, mStdHeight) == 0
+ && Float.compare(pathShape.mScaleX, mScaleX) == 0
+ && Float.compare(pathShape.mScaleY, mScaleY) == 0
+ // Path does not have equals implementation but incase it gains one, use it here
+ && Objects.equals(mPath, pathShape.mPath);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mStdWidth, mStdHeight, mPath, mScaleX, mScaleY);
+ }
}
diff --git a/graphics/java/android/graphics/drawable/shapes/RectShape.java b/graphics/java/android/graphics/drawable/shapes/RectShape.java
index e339a212a794..1bbd1d7236d9 100644
--- a/graphics/java/android/graphics/drawable/shapes/RectShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/RectShape.java
@@ -21,6 +21,8 @@ import android.graphics.Outline;
import android.graphics.Paint;
import android.graphics.RectF;
+import java.util.Objects;
+
/**
* Defines a rectangle shape.
* <p>
@@ -63,4 +65,24 @@ public class RectShape extends Shape {
shape.mRect = new RectF(mRect);
return shape;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ if (!super.equals(o)) {
+ return false;
+ }
+ RectShape rectShape = (RectShape) o;
+ return Objects.equals(mRect, rectShape.mRect);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mRect);
+ }
}
diff --git a/graphics/java/android/graphics/drawable/shapes/RoundRectShape.java b/graphics/java/android/graphics/drawable/shapes/RoundRectShape.java
index f5cbb24a53ef..475e0bb70f2b 100644
--- a/graphics/java/android/graphics/drawable/shapes/RoundRectShape.java
+++ b/graphics/java/android/graphics/drawable/shapes/RoundRectShape.java
@@ -23,6 +23,9 @@ import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
+import java.util.Arrays;
+import java.util.Objects;
+
/**
* Creates a rounded-corner rectangle. Optionally, an inset (rounded) rectangle
* can be included (to make a sort of "O" shape).
@@ -137,4 +140,31 @@ public class RoundRectShape extends RectShape {
shape.mPath = new Path(mPath);
return shape;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ if (!super.equals(o)) {
+ return false;
+ }
+ RoundRectShape that = (RoundRectShape) o;
+ return Arrays.equals(mOuterRadii, that.mOuterRadii)
+ && Objects.equals(mInset, that.mInset)
+ && Arrays.equals(mInnerRadii, that.mInnerRadii)
+ && Objects.equals(mInnerRect, that.mInnerRect)
+ && Objects.equals(mPath, that.mPath);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = Objects.hash(super.hashCode(), mInset, mInnerRect, mPath);
+ result = 31 * result + Arrays.hashCode(mOuterRadii);
+ result = 31 * result + Arrays.hashCode(mInnerRadii);
+ return result;
+ }
}
diff --git a/graphics/java/android/graphics/drawable/shapes/Shape.java b/graphics/java/android/graphics/drawable/shapes/Shape.java
index 30b28f3c2242..3b044ec631a2 100644
--- a/graphics/java/android/graphics/drawable/shapes/Shape.java
+++ b/graphics/java/android/graphics/drawable/shapes/Shape.java
@@ -21,6 +21,8 @@ import android.graphics.Canvas;
import android.graphics.Outline;
import android.graphics.Paint;
+import java.util.Objects;
+
/**
* Defines a generic graphical "shape."
* <p>
@@ -115,4 +117,22 @@ public abstract class Shape implements Cloneable {
public Shape clone() throws CloneNotSupportedException {
return (Shape) super.clone();
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Shape shape = (Shape) o;
+ return Float.compare(shape.mWidth, mWidth) == 0
+ && Float.compare(shape.mHeight, mHeight) == 0;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mWidth, mHeight);
+ }
}
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index 030fa60abfd3..78dbb6ae0df3 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -283,10 +283,16 @@ public final class KeyChain {
public static final int KEY_GEN_NO_KEYSTORE_PROVIDER = 5;
/**
+ * StrongBox unavailable when calling {@link #generateKeyPair}
+ * @hide
+ */
+ public static final int KEY_GEN_STRONGBOX_UNAVAILABLE = 6;
+
+ /**
* General failure while calling {@link #generateKeyPair}
* @hide
*/
- public static final int KEY_GEN_FAILURE = 6;
+ public static final int KEY_GEN_FAILURE = 7;
/**
* Successful call to {@link #attestKey}
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index fe05c13c999b..850230943458 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -190,22 +190,33 @@ public class KeyStore {
}
public byte[] get(String key, int uid) {
+ return get(key, uid, false);
+ }
+
+ public byte[] get(String key) {
+ return get(key, UID_SELF);
+ }
+
+ public byte[] get(String key, int uid, boolean suppressKeyNotFoundWarning) {
try {
key = key != null ? key : "";
return mBinder.get(key, uid);
} catch (RemoteException e) {
- Log.w(TAG, "Cannot connect to keystore", e);
+ Log.w(TAG, "Cannot connect to keystore", e);
return null;
} catch (android.os.ServiceSpecificException e) {
- Log.w(TAG, "KeyStore exception", e);
+ if (!suppressKeyNotFoundWarning || e.errorCode != KEY_NOT_FOUND) {
+ Log.w(TAG, "KeyStore exception", e);
+ }
return null;
}
}
- public byte[] get(String key) {
- return get(key, UID_SELF);
+ public byte[] get(String key, boolean suppressKeyNotFoundWarning) {
+ return get(key, UID_SELF, suppressKeyNotFoundWarning);
}
+
public boolean put(String key, byte[] value, int uid, int flags) {
return insert(key, value, uid, flags) == NO_ERROR;
}
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
index 2b5a37bd84e2..4c007cb70ba2 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
@@ -811,7 +811,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi {
}
int errorCode = mKeyStore.importWrappedKey(
- Credentials.USER_SECRET_KEY + alias,
+ Credentials.USER_PRIVATE_KEY + alias,
entry.getWrappedKeyBytes(),
Credentials.USER_PRIVATE_KEY + entry.getWrappingKeyAlias(),
maskingKey,
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index b2e0f675f5f9..89d370f830fa 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -268,6 +268,11 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu
private final boolean mIsStrongBoxBacked;
private final boolean mUserConfirmationRequired;
private final boolean mUnlockedDeviceRequired;
+ /*
+ * ***NOTE***: All new fields MUST also be added to the following:
+ * ParcelableKeyGenParameterSpec class.
+ * The KeyGenParameterSpec.Builder constructor that takes a KeyGenParameterSpec
+ */
/**
* @hide should be built with Builder
@@ -791,6 +796,9 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu
mUniqueIdIncluded = sourceSpec.isUniqueIdIncluded();
mUserAuthenticationValidWhileOnBody = sourceSpec.isUserAuthenticationValidWhileOnBody();
mInvalidatedByBiometricEnrollment = sourceSpec.isInvalidatedByBiometricEnrollment();
+ mIsStrongBoxBacked = sourceSpec.isStrongBoxBacked();
+ mUserConfirmationRequired = sourceSpec.isUserConfirmationRequired();
+ mUnlockedDeviceRequired = sourceSpec.isUnlockedDeviceRequired();
}
/**
@@ -1132,7 +1140,7 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu
* <p>This authorization applies only to secret key and private key operations. Public key
* operations are not restricted.
*
- * @see {@link android.security.ConfirmationPrompter ConfirmationPrompter} class for
+ * See {@link android.security.ConfirmationPrompt} class for
* more details about user confirmations.
*/
@NonNull
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index 081042b4d7fc..3357fdf46e20 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -806,7 +806,7 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs {
* <p>This authorization applies only to secret key and private key operations. Public key
* operations are not restricted.
*
- * @see {@link android.security.ConfirmationPrompter ConfirmationPrompter} class for
+ * See {@link android.security.ConfirmationPrompt} class for
* more details about user confirmations.
*/
@NonNull
diff --git a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
index 911bbf8c4eb5..8231dc984579 100644
--- a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
@@ -97,11 +97,14 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable {
out.writeBoolean(mSpec.isRandomizedEncryptionRequired());
out.writeBoolean(mSpec.isUserAuthenticationRequired());
out.writeInt(mSpec.getUserAuthenticationValidityDurationSeconds());
+ out.writeBoolean(mSpec.isUserPresenceRequired());
out.writeByteArray(mSpec.getAttestationChallenge());
out.writeBoolean(mSpec.isUniqueIdIncluded());
out.writeBoolean(mSpec.isUserAuthenticationValidWhileOnBody());
out.writeBoolean(mSpec.isInvalidatedByBiometricEnrollment());
- out.writeBoolean(mSpec.isUserPresenceRequired());
+ out.writeBoolean(mSpec.isStrongBoxBacked());
+ out.writeBoolean(mSpec.isUserConfirmationRequired());
+ out.writeBoolean(mSpec.isUnlockedDeviceRequired());
}
private static Date readDateOrNull(Parcel in) {
@@ -114,19 +117,12 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable {
}
private ParcelableKeyGenParameterSpec(Parcel in) {
- String keystoreAlias = in.readString();
- int purposes = in.readInt();
- KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
- keystoreAlias, purposes);
- builder.setUid(in.readInt());
- // KeySize is -1 by default, if the KeyGenParameterSpec previously parcelled had the default
- // value, do not set it as this will cause setKeySize to throw.
- int keySize = in.readInt();
- if (keySize >= 0) {
- builder.setKeySize(keySize);
- }
+ final String keystoreAlias = in.readString();
+ final int purposes = in.readInt();
+ final int uid = in.readInt();
+ final int keySize = in.readInt();
- int keySpecType = in.readInt();
+ final int keySpecType = in.readInt();
AlgorithmParameterSpec algorithmSpec = null;
if (keySpecType == ALGORITHM_PARAMETER_SPEC_NONE) {
algorithmSpec = null;
@@ -141,32 +137,60 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable {
throw new IllegalArgumentException(
String.format("Unknown algorithm parameter spec: %d", keySpecType));
}
- if (algorithmSpec != null) {
- builder.setAlgorithmParameterSpec(algorithmSpec);
- }
- builder.setCertificateSubject(new X500Principal(in.createByteArray()));
- builder.setCertificateSerialNumber(new BigInteger(in.createByteArray()));
- builder.setCertificateNotBefore(new Date(in.readLong()));
- builder.setCertificateNotAfter(new Date(in.readLong()));
- builder.setKeyValidityStart(readDateOrNull(in));
- builder.setKeyValidityForOriginationEnd(readDateOrNull(in));
- builder.setKeyValidityForConsumptionEnd(readDateOrNull(in));
- String[] digests = in.createStringArray();
- if (digests != null) {
- builder.setDigests(digests);
- }
- builder.setEncryptionPaddings(in.createStringArray());
- builder.setSignaturePaddings(in.createStringArray());
- builder.setBlockModes(in.createStringArray());
- builder.setRandomizedEncryptionRequired(in.readBoolean());
- builder.setUserAuthenticationRequired(in.readBoolean());
- builder.setUserAuthenticationValidityDurationSeconds(in.readInt());
- builder.setAttestationChallenge(in.createByteArray());
- builder.setUniqueIdIncluded(in.readBoolean());
- builder.setUserAuthenticationValidWhileOnBody(in.readBoolean());
- builder.setInvalidatedByBiometricEnrollment(in.readBoolean());
- builder.setUserPresenceRequired(in.readBoolean());
- mSpec = builder.build();
+
+ final X500Principal certificateSubject = new X500Principal(in.createByteArray());
+ final BigInteger certificateSerialNumber = new BigInteger(in.createByteArray());
+ final Date certificateNotBefore = new Date(in.readLong());
+ final Date certificateNotAfter = new Date(in.readLong());
+ final Date keyValidityStartDate = readDateOrNull(in);
+ final Date keyValidityForOriginationEnd = readDateOrNull(in);
+ final Date keyValidityForConsumptionEnd = readDateOrNull(in);
+ final String[] digests = in.createStringArray();
+ final String[] encryptionPaddings = in.createStringArray();
+ final String[] signaturePaddings = in.createStringArray();
+ final String[] blockModes = in.createStringArray();
+ final boolean randomizedEncryptionRequired = in.readBoolean();
+ final boolean userAuthenticationRequired = in.readBoolean();
+ final int userAuthenticationValidityDurationSeconds = in.readInt();
+ final boolean userPresenceRequired = in.readBoolean();
+ final byte[] attestationChallenge = in.createByteArray();
+ final boolean uniqueIdIncluded = in.readBoolean();
+ final boolean userAuthenticationValidWhileOnBody = in.readBoolean();
+ final boolean invalidatedByBiometricEnrollment = in.readBoolean();
+ final boolean isStrongBoxBacked = in.readBoolean();
+ final boolean userConfirmationRequired = in.readBoolean();
+ final boolean unlockedDeviceRequired = in.readBoolean();
+ // The KeyGenParameterSpec is intentionally not constructed using a Builder here:
+ // The intention is for this class to break if new parameters are added to the
+ // KeyGenParameterSpec constructor (whereas using a builder would silently drop them).
+ mSpec = new KeyGenParameterSpec(
+ keystoreAlias,
+ uid,
+ keySize,
+ algorithmSpec,
+ certificateSubject,
+ certificateSerialNumber,
+ certificateNotBefore,
+ certificateNotAfter,
+ keyValidityStartDate,
+ keyValidityForOriginationEnd,
+ keyValidityForConsumptionEnd,
+ purposes,
+ digests,
+ encryptionPaddings,
+ signaturePaddings,
+ blockModes,
+ randomizedEncryptionRequired,
+ userAuthenticationRequired,
+ userAuthenticationValidityDurationSeconds,
+ userPresenceRequired,
+ attestationChallenge,
+ uniqueIdIncluded,
+ userAuthenticationValidWhileOnBody,
+ invalidatedByBiometricEnrollment,
+ isStrongBoxBacked,
+ userConfirmationRequired,
+ unlockedDeviceRequired);
}
public static final Creator<ParcelableKeyGenParameterSpec> CREATOR = new Creator<ParcelableKeyGenParameterSpec>() {
diff --git a/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java b/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
index 254b6be77ea8..32f8ec44d11f 100644
--- a/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
+++ b/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java
@@ -77,6 +77,9 @@ public final class ParcelableKeyGenParameterSpecTest {
.setUniqueIdIncluded(true)
.setUserAuthenticationValidWhileOnBody(true)
.setInvalidatedByBiometricEnrollment(true)
+ .setIsStrongBoxBacked(true)
+ .setUserConfirmationRequired(true)
+ .setUnlockedDeviceRequired(true)
.build();
}
@@ -105,6 +108,9 @@ public final class ParcelableKeyGenParameterSpecTest {
assertThat(spec.isUniqueIdIncluded(), is(true));
assertThat(spec.isUserAuthenticationValidWhileOnBody(), is(true));
assertThat(spec.isInvalidatedByBiometricEnrollment(), is(true));
+ assertThat(spec.isStrongBoxBacked(), is(true));
+ assertThat(spec.isUserConfirmationRequired(), is(true));
+ assertThat(spec.isUnlockedDeviceRequired(), is(true));
}
private Parcel parcelForReading(ParcelableKeyGenParameterSpec spec) {
diff --git a/libs/androidfw/Android.bp b/libs/androidfw/Android.bp
index 70d52164ff74..e39926beee41 100644
--- a/libs/androidfw/Android.bp
+++ b/libs/androidfw/Android.bp
@@ -57,6 +57,7 @@ cc_library {
"ZipUtils.cpp",
],
export_include_dirs: ["include"],
+ export_shared_lib_headers: ["libz"],
target: {
android: {
srcs: [
diff --git a/libs/androidfw/include/androidfw/StringPiece.h b/libs/androidfw/include/androidfw/StringPiece.h
index 99b424568a1f..a33865f4d34f 100644
--- a/libs/androidfw/include/androidfw/StringPiece.h
+++ b/libs/androidfw/include/androidfw/StringPiece.h
@@ -32,6 +32,14 @@ namespace android {
// WARNING: When creating from std::basic_string<>, moving the original
// std::basic_string<> will invalidate the data held in a BasicStringPiece<>.
// BasicStringPiece<> should only be used transitively.
+//
+// NOTE: When creating an std::pair<StringPiece, T> using std::make_pair(),
+// passing an std::string will first copy the string, then create a StringPiece
+// on the copy, which is then immediately destroyed.
+// Instead, create a StringPiece explicitly:
+//
+// std::string my_string = "foo";
+// std::make_pair<StringPiece, T>(StringPiece(my_string), ...);
template <typename TChar>
class BasicStringPiece {
public:
diff --git a/libs/androidfw/tests/data/appaslib/build b/libs/androidfw/tests/data/appaslib/build
index baaf70075feb..fb86b451af06 100755
--- a/libs/androidfw/tests/data/appaslib/build
+++ b/libs/androidfw/tests/data/appaslib/build
@@ -17,7 +17,7 @@
set -e
-PATH_TO_FRAMEWORK_RES=$(gettop)/prebuilts/sdk/current/android.jar
+PATH_TO_FRAMEWORK_RES=$(gettop)/prebuilts/sdk/current/public/android.jar
aapt package -M AndroidManifest.xml -S res -I $PATH_TO_FRAMEWORK_RES -F appaslib.apk -f
aapt package -M AndroidManifest.xml -S res -I $PATH_TO_FRAMEWORK_RES -F appaslib_lib.apk -f --shared-lib
diff --git a/libs/androidfw/tests/data/basic/build b/libs/androidfw/tests/data/basic/build
index 5682ed4d3041..c0b22d804558 100755
--- a/libs/androidfw/tests/data/basic/build
+++ b/libs/androidfw/tests/data/basic/build
@@ -17,7 +17,7 @@
set -e
-PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/android.jar
+PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar
aapt2 compile --dir res -o compiled.flata
aapt2 link \
diff --git a/libs/androidfw/tests/data/feature/build b/libs/androidfw/tests/data/feature/build
index aa2f7169345c..e55efd49d041 100755
--- a/libs/androidfw/tests/data/feature/build
+++ b/libs/androidfw/tests/data/feature/build
@@ -17,7 +17,7 @@
set -e
-PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/android.jar
+PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar
aapt2 compile --dir res -o compiled.flata
aapt2 link -o feature.apk \
diff --git a/libs/androidfw/tests/data/libclient/build b/libs/androidfw/tests/data/libclient/build
index 08310e3c6eb8..ac6947241759 100755
--- a/libs/androidfw/tests/data/libclient/build
+++ b/libs/androidfw/tests/data/libclient/build
@@ -17,7 +17,7 @@
set -e
-PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/android.jar
+PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar
PATH_TO_LIB_ONE=../lib_one/lib_one.apk
PATH_TO_LIB_TWO=../lib_two/lib_two.apk
diff --git a/libs/androidfw/tests/data/sparse/build b/libs/androidfw/tests/data/sparse/build
index 305593f01875..bfc0befdec85 100755
--- a/libs/androidfw/tests/data/sparse/build
+++ b/libs/androidfw/tests/data/sparse/build
@@ -17,7 +17,7 @@
set -e
-PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/android.jar
+PATH_TO_FRAMEWORK_RES=${ANDROID_BUILD_TOP}/prebuilts/sdk/current/public/android.jar
aapt2 compile --dir res -o compiled.flata
aapt2 link --manifest AndroidManifest.xml -I $PATH_TO_FRAMEWORK_RES -o sparse.apk --enable-sparse-encoding compiled.flata
diff --git a/libs/common_time/Android.mk b/libs/common_time/Android.mk
deleted file mode 100644
index 636f05752ee4..000000000000
--- a/libs/common_time/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-#
-# common_time_service
-#
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- common_clock_service.cpp \
- common_time_config_service.cpp \
- common_time_server.cpp \
- common_time_server_api.cpp \
- common_time_server_packets.cpp \
- clock_recovery.cpp \
- common_clock.cpp \
- main.cpp \
- utils.cpp \
- LinearTransform.cpp
-
-# Uncomment to enable vesbose logging and debug service.
-#TIME_SERVICE_DEBUG=true
-ifeq ($(TIME_SERVICE_DEBUG), true)
-LOCAL_SRC_FILES += diag_thread.cpp
-LOCAL_CFLAGS += -DTIME_SERVICE_DEBUG
-endif
-
-LOCAL_SHARED_LIBRARIES := \
- libbinder \
- libcommon_time_client \
- libutils \
- liblog
-
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE := common_time
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_EXECUTABLE)
diff --git a/libs/common_time/LinearTransform.cpp b/libs/common_time/LinearTransform.cpp
deleted file mode 100644
index 67308550fa4b..000000000000
--- a/libs/common_time/LinearTransform.cpp
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define __STDC_LIMIT_MACROS
-
-#include "LinearTransform.h"
-#include <assert.h>
-
-
-// disable sanitize as these functions may intentionally overflow (see comments below).
-// the ifdef can be removed when host builds use clang.
-#if defined(__clang__)
-#define ATTRIBUTE_NO_SANITIZE_INTEGER __attribute__((no_sanitize("integer")))
-#else
-#define ATTRIBUTE_NO_SANITIZE_INTEGER
-#endif
-
-namespace android {
-
-// sanitize failure with T = int32_t and x = 0x80000000
-template<class T>
-ATTRIBUTE_NO_SANITIZE_INTEGER
-static inline T ABS(T x) { return (x < 0) ? -x : x; }
-
-// Static math methods involving linear transformations
-// remote sanitize failure on overflow case.
-ATTRIBUTE_NO_SANITIZE_INTEGER
-static bool scale_u64_to_u64(
- uint64_t val,
- uint32_t N,
- uint32_t D,
- uint64_t* res,
- bool round_up_not_down) {
- uint64_t tmp1, tmp2;
- uint32_t r;
-
- assert(res);
- assert(D);
-
- // Let U32(X) denote a uint32_t containing the upper 32 bits of a 64 bit
- // integer X.
- // Let L32(X) denote a uint32_t containing the lower 32 bits of a 64 bit
- // integer X.
- // Let X[A, B] with A <= B denote bits A through B of the integer X.
- // Let (A | B) denote the concatination of two 32 bit ints, A and B.
- // IOW X = (A | B) => U32(X) == A && L32(X) == B
- //
- // compute M = val * N (a 96 bit int)
- // ---------------------------------
- // tmp2 = U32(val) * N (a 64 bit int)
- // tmp1 = L32(val) * N (a 64 bit int)
- // which means
- // M = val * N = (tmp2 << 32) + tmp1
- tmp2 = (val >> 32) * N;
- tmp1 = (val & UINT32_MAX) * N;
-
- // compute M[32, 95]
- // tmp2 = tmp2 + U32(tmp1)
- // = (U32(val) * N) + U32(L32(val) * N)
- // = M[32, 95]
- tmp2 += tmp1 >> 32;
-
- // if M[64, 95] >= D, then M/D has bits > 63 set and we have
- // an overflow.
- if ((tmp2 >> 32) >= D) {
- *res = UINT64_MAX;
- return false;
- }
-
- // Divide. Going in we know
- // tmp2 = M[32, 95]
- // U32(tmp2) < D
- r = tmp2 % D;
- tmp2 /= D;
-
- // At this point
- // tmp1 = L32(val) * N
- // tmp2 = M[32, 95] / D
- // = (M / D)[32, 95]
- // r = M[32, 95] % D
- // U32(tmp2) = 0
- //
- // compute tmp1 = (r | M[0, 31])
- tmp1 = (tmp1 & UINT32_MAX) | ((uint64_t)r << 32);
-
- // Divide again. Keep the remainder around in order to round properly.
- r = tmp1 % D;
- tmp1 /= D;
-
- // At this point
- // tmp2 = (M / D)[32, 95]
- // tmp1 = (M / D)[ 0, 31]
- // r = M % D
- // U32(tmp1) = 0
- // U32(tmp2) = 0
-
- // Pack the result and deal with the round-up case (As well as the
- // remote possiblility over overflow in such a case).
- *res = (tmp2 << 32) | tmp1;
- if (r && round_up_not_down) {
- ++(*res);
- if (!(*res)) {
- *res = UINT64_MAX;
- return false;
- }
- }
-
- return true;
-}
-
-// at least one known sanitize failure (see comment below)
-ATTRIBUTE_NO_SANITIZE_INTEGER
-static bool linear_transform_s64_to_s64(
- int64_t val,
- int64_t basis1,
- int32_t N,
- uint32_t D,
- bool invert_frac,
- int64_t basis2,
- int64_t* out) {
- uint64_t scaled, res;
- uint64_t abs_val;
- bool is_neg;
-
- if (!out)
- return false;
-
- // Compute abs(val - basis_64). Keep track of whether or not this delta
- // will be negative after the scale opertaion.
- if (val < basis1) {
- is_neg = true;
- abs_val = basis1 - val;
- } else {
- is_neg = false;
- abs_val = val - basis1;
- }
-
- if (N < 0)
- is_neg = !is_neg;
-
- if (!scale_u64_to_u64(abs_val,
- invert_frac ? D : ABS(N),
- invert_frac ? ABS(N) : D,
- &scaled,
- is_neg))
- return false; // overflow/undeflow
-
- // if scaled is >= 0x8000<etc>, then we are going to overflow or
- // underflow unless ABS(basis2) is large enough to pull us back into the
- // non-overflow/underflow region.
- if (scaled & INT64_MIN) {
- if (is_neg && (basis2 < 0))
- return false; // certain underflow
-
- if (!is_neg && (basis2 >= 0))
- return false; // certain overflow
-
- if (ABS(basis2) <= static_cast<int64_t>(scaled & INT64_MAX))
- return false; // not enough
-
- // Looks like we are OK
- *out = (is_neg ? (-scaled) : scaled) + basis2;
- } else {
- // Scaled fits within signed bounds, so we just need to check for
- // over/underflow for two signed integers. Basically, if both scaled
- // and basis2 have the same sign bit, and the result has a different
- // sign bit, then we have under/overflow. An easy way to compute this
- // is
- // (scaled_signbit XNOR basis_signbit) &&
- // (scaled_signbit XOR res_signbit)
- // ==
- // (scaled_signbit XOR basis_signbit XOR 1) &&
- // (scaled_signbit XOR res_signbit)
-
- if (is_neg)
- scaled = -scaled; // known sanitize failure
- res = scaled + basis2;
-
- if ((scaled ^ basis2 ^ INT64_MIN) & (scaled ^ res) & INT64_MIN)
- return false;
-
- *out = res;
- }
-
- return true;
-}
-
-bool LinearTransform::doForwardTransform(int64_t a_in, int64_t* b_out) const {
- if (0 == a_to_b_denom)
- return false;
-
- return linear_transform_s64_to_s64(a_in,
- a_zero,
- a_to_b_numer,
- a_to_b_denom,
- false,
- b_zero,
- b_out);
-}
-
-bool LinearTransform::doReverseTransform(int64_t b_in, int64_t* a_out) const {
- if (0 == a_to_b_numer)
- return false;
-
- return linear_transform_s64_to_s64(b_in,
- b_zero,
- a_to_b_numer,
- a_to_b_denom,
- true,
- a_zero,
- a_out);
-}
-
-template <class T> void LinearTransform::reduce(T* N, T* D) {
- T a, b;
- if (!N || !D || !(*D)) {
- assert(false);
- return;
- }
-
- a = *N;
- b = *D;
-
- if (a == 0) {
- *D = 1;
- return;
- }
-
- // This implements Euclid's method to find GCD.
- if (a < b) {
- T tmp = a;
- a = b;
- b = tmp;
- }
-
- while (1) {
- // a is now the greater of the two.
- const T remainder = a % b;
- if (remainder == 0) {
- *N /= b;
- *D /= b;
- return;
- }
- // by swapping remainder and b, we are guaranteeing that a is
- // still the greater of the two upon entrance to the loop.
- a = b;
- b = remainder;
- }
-};
-
-template void LinearTransform::reduce<uint64_t>(uint64_t* N, uint64_t* D);
-template void LinearTransform::reduce<uint32_t>(uint32_t* N, uint32_t* D);
-
-// sanitize failure if *N = 0x80000000
-ATTRIBUTE_NO_SANITIZE_INTEGER
-void LinearTransform::reduce(int32_t* N, uint32_t* D) {
- if (N && D && *D) {
- if (*N < 0) {
- *N = -(*N);
- reduce(reinterpret_cast<uint32_t*>(N), D);
- *N = -(*N);
- } else {
- reduce(reinterpret_cast<uint32_t*>(N), D);
- }
- }
-}
-
-} // namespace android
diff --git a/libs/common_time/LinearTransform.h b/libs/common_time/LinearTransform.h
deleted file mode 100644
index bf6ab8e78eb8..000000000000
--- a/libs/common_time/LinearTransform.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef _LINEAR_TRANSFORM_H
-#define _LINEAR_TRANSFORM_H
-
-#include <stdint.h>
-
-namespace android {
-
-// LinearTransform defines a structure which hold the definition of a
-// transformation from single dimensional coordinate system A into coordinate
-// system B (and back again). Values in A and in B are 64 bit, the linear
-// scale factor is expressed as a rational number using two 32 bit values.
-//
-// Specifically, let
-// f(a) = b
-// F(b) = f^-1(b) = a
-// then
-//
-// f(a) = (((a - a_zero) * a_to_b_numer) / a_to_b_denom) + b_zero;
-//
-// and
-//
-// F(b) = (((b - b_zero) * a_to_b_denom) / a_to_b_numer) + a_zero;
-//
-struct LinearTransform {
- int64_t a_zero;
- int64_t b_zero;
- int32_t a_to_b_numer;
- uint32_t a_to_b_denom;
-
- // Transform from A->B
- // Returns true on success, or false in the case of a singularity or an
- // overflow.
- bool doForwardTransform(int64_t a_in, int64_t* b_out) const;
-
- // Transform from B->A
- // Returns true on success, or false in the case of a singularity or an
- // overflow.
- bool doReverseTransform(int64_t b_in, int64_t* a_out) const;
-
- // Helpers which will reduce the fraction N/D using Euclid's method.
- template <class T> static void reduce(T* N, T* D);
- static void reduce(int32_t* N, uint32_t* D);
-};
-
-
-}
-
-#endif // _LINEAR_TRANSFORM_H
diff --git a/libs/common_time/clock_recovery.cpp b/libs/common_time/clock_recovery.cpp
deleted file mode 100644
index 392caa0ca16f..000000000000
--- a/libs/common_time/clock_recovery.cpp
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/*
- * A service that exchanges time synchronization information between
- * a master that defines a timeline and clients that follow the timeline.
- */
-
-#define __STDC_LIMIT_MACROS
-#define LOG_TAG "common_time"
-#include <utils/Log.h>
-#include <inttypes.h>
-#include <stdint.h>
-
-#include <common_time/local_clock.h>
-#include <assert.h>
-
-#include "clock_recovery.h"
-#include "common_clock.h"
-#ifdef TIME_SERVICE_DEBUG
-#include "diag_thread.h"
-#endif
-
-// Define log macro so we can make LOGV into LOGE when we are exclusively
-// debugging this code.
-#ifdef TIME_SERVICE_DEBUG
-#define LOG_TS ALOGE
-#else
-#define LOG_TS ALOGV
-#endif
-
-namespace android {
-
-ClockRecoveryLoop::ClockRecoveryLoop(LocalClock* local_clock,
- CommonClock* common_clock) {
- assert(NULL != local_clock);
- assert(NULL != common_clock);
-
- local_clock_ = local_clock;
- common_clock_ = common_clock;
-
- local_clock_can_slew_ = local_clock_->initCheck() &&
- (local_clock_->setLocalSlew(0) == OK);
- tgt_correction_ = 0;
- cur_correction_ = 0;
-
- // Precompute the max rate at which we are allowed to change the VCXO
- // control.
- uint64_t N = 0x10000ull * 1000ull;
- uint64_t D = local_clock_->getLocalFreq() * kMinFullRangeSlewChange_mSec;
- LinearTransform::reduce(&N, &D);
- while ((N > INT32_MAX) || (D > UINT32_MAX)) {
- N >>= 1;
- D >>= 1;
- LinearTransform::reduce(&N, &D);
- }
- time_to_cur_slew_.a_to_b_numer = static_cast<int32_t>(N);
- time_to_cur_slew_.a_to_b_denom = static_cast<uint32_t>(D);
-
- reset(true, true);
-
-#ifdef TIME_SERVICE_DEBUG
- diag_thread_ = new DiagThread(common_clock_, local_clock_);
- if (diag_thread_ != NULL) {
- status_t res = diag_thread_->startWorkThread();
- if (res != OK)
- ALOGW("Failed to start A@H clock recovery diagnostic thread.");
- } else
- ALOGW("Failed to allocate diagnostic thread.");
-#endif
-}
-
-ClockRecoveryLoop::~ClockRecoveryLoop() {
-#ifdef TIME_SERVICE_DEBUG
- diag_thread_->stopWorkThread();
-#endif
-}
-
-// Constants.
-const float ClockRecoveryLoop::dT = 1.0;
-const float ClockRecoveryLoop::Kc = 1.0f;
-const float ClockRecoveryLoop::Ti = 15.0f;
-const float ClockRecoveryLoop::Tf = 0.05;
-const float ClockRecoveryLoop::bias_Fc = 0.01;
-const float ClockRecoveryLoop::bias_RC = (dT / (2 * 3.14159f * bias_Fc));
-const float ClockRecoveryLoop::bias_Alpha = (dT / (bias_RC + dT));
-const int64_t ClockRecoveryLoop::panic_thresh_ = 50000;
-const int64_t ClockRecoveryLoop::control_thresh_ = 10000;
-const float ClockRecoveryLoop::COmin = -100.0f;
-const float ClockRecoveryLoop::COmax = 100.0f;
-const uint32_t ClockRecoveryLoop::kMinFullRangeSlewChange_mSec = 300;
-const int ClockRecoveryLoop::kSlewChangeStepPeriod_mSec = 10;
-
-
-void ClockRecoveryLoop::reset(bool position, bool frequency) {
- Mutex::Autolock lock(&lock_);
- reset_l(position, frequency);
-}
-
-uint32_t ClockRecoveryLoop::findMinRTTNdx(DisciplineDataPoint* data,
- uint32_t count) {
- uint32_t min_rtt = 0;
- for (uint32_t i = 1; i < count; ++i)
- if (data[min_rtt].rtt > data[i].rtt)
- min_rtt = i;
-
- return min_rtt;
-}
-
-bool ClockRecoveryLoop::pushDisciplineEvent(int64_t local_time,
- int64_t nominal_common_time,
- int64_t rtt) {
- Mutex::Autolock lock(&lock_);
-
- int64_t local_common_time = 0;
- common_clock_->localToCommon(local_time, &local_common_time);
- int64_t raw_delta = nominal_common_time - local_common_time;
-
-#ifdef TIME_SERVICE_DEBUG
- ALOGE("local=%lld, common=%lld, delta=%lld, rtt=%lld\n",
- local_common_time, nominal_common_time,
- raw_delta, rtt);
-#endif
-
- // If we have not defined a basis for common time, then we need to use these
- // initial points to do so. In order to avoid significant initial error
- // from a particularly bad startup data point, we collect the first N data
- // points and choose the best of them before moving on.
- if (!common_clock_->isValid()) {
- if (startup_filter_wr_ < kStartupFilterSize) {
- DisciplineDataPoint& d = startup_filter_data_[startup_filter_wr_];
- d.local_time = local_time;
- d.nominal_common_time = nominal_common_time;
- d.rtt = rtt;
- startup_filter_wr_++;
- }
-
- if (startup_filter_wr_ == kStartupFilterSize) {
- uint32_t min_rtt = findMinRTTNdx(startup_filter_data_,
- kStartupFilterSize);
-
- common_clock_->setBasis(
- startup_filter_data_[min_rtt].local_time,
- startup_filter_data_[min_rtt].nominal_common_time);
- }
-
- return true;
- }
-
- int64_t observed_common;
- int64_t delta;
- float delta_f, dCO;
- int32_t tgt_correction;
-
- if (OK != common_clock_->localToCommon(local_time, &observed_common)) {
- // Since we just checked to make certain that this conversion was valid,
- // and no one else in the system should be messing with it, if this
- // conversion is suddenly invalid, it is a good reason to panic.
- ALOGE("Failed to convert local time to common time in %s:%d",
- __PRETTY_FUNCTION__, __LINE__);
- return false;
- }
-
- // Implement a filter which should match NTP filtering behavior when a
- // client is associated with only one peer of lower stratum. Basically,
- // always use the best of the N last data points, where best is defined as
- // lowest round trip time. NTP uses an N of 8; we use a value of 6.
- //
- // TODO(johngro) : experiment with other filter strategies. The goal here
- // is to mitigate the effects of high RTT data points which typically have
- // large asymmetries in the TX/RX legs. Downside of the existing NTP
- // approach (particularly because of the PID controller we are using to
- // produce the control signal from the filtered data) are that the rate at
- // which discipline events are actually acted upon becomes irregular and can
- // become drawn out (the time between actionable event can go way up). If
- // the system receives a strong high quality data point, the proportional
- // component of the controller can produce a strong correction which is left
- // in place for too long causing overshoot. In addition, the integral
- // component of the system currently is an approximation based on the
- // assumption of a more or less homogeneous sampling of the error. Its
- // unclear what the effect of undermining this assumption would be right
- // now.
-
- // Two ideas which come to mind immediately would be to...
- // 1) Keep a history of more data points (32 or so) and ignore data points
- // whose RTT is more than a certain number of standard deviations outside
- // of the norm.
- // 2) Eliminate the PID controller portion of this system entirely.
- // Instead, move to a system which uses a very wide filter (128 data
- // points or more) with a sum-of-least-squares line fitting approach to
- // tracking the long term drift. This would take the place of the I
- // component in the current PID controller. Also use a much more narrow
- // outlier-rejector filter (as described in #1) to drive a short term
- // correction factor similar to the P component of the PID controller.
- assert(filter_wr_ < kFilterSize);
- filter_data_[filter_wr_].local_time = local_time;
- filter_data_[filter_wr_].observed_common_time = observed_common;
- filter_data_[filter_wr_].nominal_common_time = nominal_common_time;
- filter_data_[filter_wr_].rtt = rtt;
- filter_data_[filter_wr_].point_used = false;
- uint32_t current_point = filter_wr_;
- filter_wr_ = (filter_wr_ + 1) % kFilterSize;
- if (!filter_wr_)
- filter_full_ = true;
-
- uint32_t scan_end = filter_full_ ? kFilterSize : filter_wr_;
- uint32_t min_rtt = findMinRTTNdx(filter_data_, scan_end);
- // We only use packets with low RTTs for control. If the packet RTT
- // is less than the panic threshold, we can probably eat the jitter with the
- // control loop. Otherwise, take the packet only if it better than all
- // of the packets we have in the history. That way we try to track
- // something, even if it is noisy.
- if (current_point == min_rtt || rtt < control_thresh_) {
- delta_f = delta = nominal_common_time - observed_common;
-
- last_error_est_valid_ = true;
- last_error_est_usec_ = delta;
-
- // Compute the error then clamp to the panic threshold. If we ever
- // exceed this amt of error, its time to panic and reset the system.
- // Given that the error in the measurement of the error could be as
- // high as the RTT of the data point, we don't actually panic until
- // the implied error (delta) is greater than the absolute panic
- // threashold plus the RTT. IOW - we don't panic until we are
- // absoluely sure that our best case sync is worse than the absolute
- // panic threshold.
- int64_t effective_panic_thresh = panic_thresh_ + rtt;
- if ((delta > effective_panic_thresh) ||
- (delta < -effective_panic_thresh)) {
- // PANIC!!!
- reset_l(false, true);
- return false;
- }
-
- } else {
- // We do not have a good packet to look at, but we also do not want to
- // free-run the clock at some crazy slew rate. So we guess the
- // trajectory of the clock based on the last controller output and the
- // estimated bias of our clock against the master.
- // The net effect of this is that CO == CObias after some extended
- // period of no feedback.
- delta_f = last_delta_f_ - dT*(CO - CObias);
- delta = delta_f;
- }
-
- // Velocity form PI control equation.
- dCO = Kc * (1.0f + dT/Ti) * delta_f - Kc * last_delta_f_;
- CO += dCO * Tf; // Filter CO by applying gain <1 here.
-
- // Save error terms for later.
- last_delta_f_ = delta_f;
-
- // Clamp CO to +/- 100ppm.
- if (CO < COmin)
- CO = COmin;
- else if (CO > COmax)
- CO = COmax;
-
- // Update the controller bias.
- CObias = bias_Alpha * CO + (1.0f - bias_Alpha) * lastCObias;
- lastCObias = CObias;
-
- // Convert PPM to 16-bit int range. Add some guard band (-0.01) so we
- // don't get fp weirdness.
- tgt_correction = CO * 327.66;
-
- // If there was a change in the amt of correction to use, update the
- // system.
- setTargetCorrection_l(tgt_correction);
-
- LOG_TS("clock_loop %" PRId64 " %f %f %f %d\n", raw_delta, delta_f, CO, CObias, tgt_correction);
-
-#ifdef TIME_SERVICE_DEBUG
- diag_thread_->pushDisciplineEvent(
- local_time,
- observed_common,
- nominal_common_time,
- tgt_correction,
- rtt);
-#endif
-
- return true;
-}
-
-int32_t ClockRecoveryLoop::getLastErrorEstimate() {
- Mutex::Autolock lock(&lock_);
-
- if (last_error_est_valid_)
- return last_error_est_usec_;
- else
- return ICommonClock::kErrorEstimateUnknown;
-}
-
-void ClockRecoveryLoop::reset_l(bool position, bool frequency) {
- assert(NULL != common_clock_);
-
- if (position) {
- common_clock_->resetBasis();
- startup_filter_wr_ = 0;
- }
-
- if (frequency) {
- last_error_est_valid_ = false;
- last_error_est_usec_ = 0;
- last_delta_f_ = 0.0;
- CO = 0.0f;
- lastCObias = CObias = 0.0f;
- setTargetCorrection_l(0);
- applySlew_l();
- }
-
- filter_wr_ = 0;
- filter_full_ = false;
-}
-
-void ClockRecoveryLoop::setTargetCorrection_l(int32_t tgt) {
- // When we make a change to the slew rate, we need to be careful to not
- // change it too quickly as it can anger some HDMI sinks out there, notably
- // some Sony panels from the 2010-2011 timeframe. From experimenting with
- // some of these sinks, it seems like swinging from one end of the range to
- // another in less that 190mSec or so can start to cause trouble. Adding in
- // a hefty margin, we limit the system to a full range sweep in no less than
- // 300mSec.
- if (tgt_correction_ != tgt) {
- int64_t now = local_clock_->getLocalTime();
-
- tgt_correction_ = tgt;
-
- // Set up the transformation to figure out what the slew should be at
- // any given point in time in the future.
- time_to_cur_slew_.a_zero = now;
- time_to_cur_slew_.b_zero = cur_correction_;
-
- // Make sure the sign of the slope is headed in the proper direction.
- bool needs_increase = (cur_correction_ < tgt_correction_);
- bool is_increasing = (time_to_cur_slew_.a_to_b_numer > 0);
- if (( needs_increase && !is_increasing) ||
- (!needs_increase && is_increasing)) {
- time_to_cur_slew_.a_to_b_numer = -time_to_cur_slew_.a_to_b_numer;
- }
-
- // Finally, figure out when the change will be finished and start the
- // slew operation.
- time_to_cur_slew_.doReverseTransform(tgt_correction_,
- &slew_change_end_time_);
-
- applySlew_l();
- }
-}
-
-bool ClockRecoveryLoop::applySlew_l() {
- bool ret = true;
-
- // If cur == tgt, there is no ongoing sleq rate change and we are already
- // finished.
- if (cur_correction_ == tgt_correction_)
- goto bailout;
-
- if (local_clock_can_slew_) {
- int64_t now = local_clock_->getLocalTime();
- int64_t tmp;
-
- if (now >= slew_change_end_time_) {
- cur_correction_ = tgt_correction_;
- next_slew_change_timeout_.setTimeout(-1);
- } else {
- time_to_cur_slew_.doForwardTransform(now, &tmp);
-
- if (tmp > INT16_MAX)
- cur_correction_ = INT16_MAX;
- else if (tmp < INT16_MIN)
- cur_correction_ = INT16_MIN;
- else
- cur_correction_ = static_cast<int16_t>(tmp);
-
- next_slew_change_timeout_.setTimeout(kSlewChangeStepPeriod_mSec);
- ret = false;
- }
-
- local_clock_->setLocalSlew(cur_correction_);
- } else {
- // Since we are not actually changing the rate of a HW clock, we don't
- // need to worry to much about changing the slew rate so fast that we
- // anger any downstream HDMI devices.
- cur_correction_ = tgt_correction_;
- next_slew_change_timeout_.setTimeout(-1);
-
- // The SW clock recovery implemented by the common clock class expects
- // values expressed in PPM. CO is in ppm.
- common_clock_->setSlew(local_clock_->getLocalTime(), CO);
- }
-
-bailout:
- return ret;
-}
-
-int ClockRecoveryLoop::applyRateLimitedSlew() {
- Mutex::Autolock lock(&lock_);
-
- int ret = next_slew_change_timeout_.msecTillTimeout();
- if (!ret) {
- if (applySlew_l())
- next_slew_change_timeout_.setTimeout(-1);
- ret = next_slew_change_timeout_.msecTillTimeout();
- }
-
- return ret;
-}
-
-} // namespace android
diff --git a/libs/common_time/clock_recovery.h b/libs/common_time/clock_recovery.h
deleted file mode 100644
index 8066a3968b59..000000000000
--- a/libs/common_time/clock_recovery.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef __CLOCK_RECOVERY_H__
-#define __CLOCK_RECOVERY_H__
-
-#include <stdint.h>
-#include <common_time/ICommonClock.h>
-#include <utils/threads.h>
-
-#include "LinearTransform.h"
-
-#ifdef TIME_SERVICE_DEBUG
-#include "diag_thread.h"
-#endif
-
-#include "utils.h"
-
-namespace android {
-
-class CommonClock;
-class LocalClock;
-
-class ClockRecoveryLoop {
- public:
- ClockRecoveryLoop(LocalClock* local_clock, CommonClock* common_clock);
- ~ClockRecoveryLoop();
-
- void reset(bool position, bool frequency);
- bool pushDisciplineEvent(int64_t local_time,
- int64_t nominal_common_time,
- int64_t data_point_rtt);
- int32_t getLastErrorEstimate();
-
- // Applies the next step in any ongoing slew change operation. Returns a
- // timeout suitable for use with poll/select indicating the number of mSec
- // until the next change should be applied.
- int applyRateLimitedSlew();
-
- private:
-
- // Tuned using the "Good Gain" method.
- // See:
- // http://techteach.no/publications/books/dynamics_and_control/tuning_pid_controller.pdf
-
- // Controller period (1Hz for now).
- static const float dT;
-
- // Controller gain, positive and unitless. Larger values converge faster,
- // but can cause instability.
- static const float Kc;
-
- // Integral reset time. Smaller values cause loop to track faster, but can
- // also cause instability.
- static const float Ti;
-
- // Controller output filter time constant. Range (0-1). Smaller values make
- // output smoother, but slow convergence.
- static const float Tf;
-
- // Low-pass filter for bias tracker.
- static const float bias_Fc; // HZ
- static const float bias_RC; // Computed in constructor.
- static const float bias_Alpha; // Computed inconstructor.
-
- // The maximum allowed error (as indicated by a pushDisciplineEvent) before
- // we panic.
- static const int64_t panic_thresh_;
-
- // The maximum allowed error rtt time for packets to be used for control
- // feedback, unless the packet is the best in recent memory.
- static const int64_t control_thresh_;
-
- typedef struct {
- int64_t local_time;
- int64_t observed_common_time;
- int64_t nominal_common_time;
- int64_t rtt;
- bool point_used;
- } DisciplineDataPoint;
-
- static uint32_t findMinRTTNdx(DisciplineDataPoint* data, uint32_t count);
-
- void reset_l(bool position, bool frequency);
- void setTargetCorrection_l(int32_t tgt);
- bool applySlew_l();
-
- // The local clock HW abstraction we use as the basis for common time.
- LocalClock* local_clock_;
- bool local_clock_can_slew_;
-
- // The common clock we end up controlling along with the lock used to
- // serialize operations.
- CommonClock* common_clock_;
- Mutex lock_;
-
- // parameters maintained while running and reset during a reset
- // of the frequency correction.
- bool last_error_est_valid_;
- int32_t last_error_est_usec_;
- float last_delta_f_;
- int32_t tgt_correction_;
- int32_t cur_correction_;
- LinearTransform time_to_cur_slew_;
- int64_t slew_change_end_time_;
- Timeout next_slew_change_timeout_;
-
- // Contoller Output.
- float CO;
-
- // Bias tracking for trajectory estimation.
- float CObias;
- float lastCObias;
-
- // Controller output bounds. The controller will not try to
- // slew faster that +/-100ppm offset from center per interation.
- static const float COmin;
- static const float COmax;
-
- // State kept for filtering the discipline data.
- static const uint32_t kFilterSize = 16;
- DisciplineDataPoint filter_data_[kFilterSize];
- uint32_t filter_wr_;
- bool filter_full_;
-
- static const uint32_t kStartupFilterSize = 4;
- DisciplineDataPoint startup_filter_data_[kStartupFilterSize];
- uint32_t startup_filter_wr_;
-
- // Minimum number of milliseconds over which we allow a full range change
- // (from rail to rail) of the VCXO control signal. This is the rate
- // limiting factor which keeps us from changing the clock rate so fast that
- // we get in trouble with certain HDMI sinks.
- static const uint32_t kMinFullRangeSlewChange_mSec;
-
- // How much time (in msec) to wait
- static const int kSlewChangeStepPeriod_mSec;
-
-#ifdef TIME_SERVICE_DEBUG
- sp<DiagThread> diag_thread_;
-#endif
-};
-
-} // namespace android
-
-#endif // __CLOCK_RECOVERY_H__
diff --git a/libs/common_time/common_clock.cpp b/libs/common_time/common_clock.cpp
deleted file mode 100644
index aed52f177c80..000000000000
--- a/libs/common_time/common_clock.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define __STDC_LIMIT_MACROS
-
-#define LOG_TAG "common_time"
-#include <utils/Log.h>
-
-#include <inttypes.h>
-#include <stdint.h>
-
-#include <utils/Errors.h>
-
-#include "common_clock.h"
-
-namespace android {
-
-CommonClock::CommonClock() {
- cur_slew_ = 0;
- cur_trans_valid_ = false;
-
- cur_trans_.a_zero = 0;
- cur_trans_.b_zero = 0;
- cur_trans_.a_to_b_numer = local_to_common_freq_numer_ = 1;
- cur_trans_.a_to_b_denom = local_to_common_freq_denom_ = 1;
- duration_trans_ = cur_trans_;
-}
-
-bool CommonClock::init(uint64_t local_freq) {
- Mutex::Autolock lock(&lock_);
-
- if (!local_freq)
- return false;
-
- uint64_t numer = kCommonFreq;
- uint64_t denom = local_freq;
-
- LinearTransform::reduce(&numer, &denom);
- if ((numer > UINT32_MAX) || (denom > UINT32_MAX)) {
- ALOGE("Overflow in CommonClock::init while trying to reduce %" PRIu64 "/%" PRIu64,
- kCommonFreq, local_freq);
- return false;
- }
-
- cur_trans_.a_to_b_numer = local_to_common_freq_numer_ =
- static_cast<uint32_t>(numer);
- cur_trans_.a_to_b_denom = local_to_common_freq_denom_ =
- static_cast<uint32_t>(denom);
- duration_trans_ = cur_trans_;
-
- return true;
-}
-
-status_t CommonClock::localToCommon(int64_t local, int64_t *common_out) const {
- Mutex::Autolock lock(&lock_);
-
- if (!cur_trans_valid_)
- return INVALID_OPERATION;
-
- if (!cur_trans_.doForwardTransform(local, common_out))
- return INVALID_OPERATION;
-
- return OK;
-}
-
-status_t CommonClock::commonToLocal(int64_t common, int64_t *local_out) const {
- Mutex::Autolock lock(&lock_);
-
- if (!cur_trans_valid_)
- return INVALID_OPERATION;
-
- if (!cur_trans_.doReverseTransform(common, local_out))
- return INVALID_OPERATION;
-
- return OK;
-}
-
-int64_t CommonClock::localDurationToCommonDuration(int64_t localDur) const {
- int64_t ret;
- duration_trans_.doForwardTransform(localDur, &ret);
- return ret;
-}
-
-void CommonClock::setBasis(int64_t local, int64_t common) {
- Mutex::Autolock lock(&lock_);
-
- cur_trans_.a_zero = local;
- cur_trans_.b_zero = common;
- cur_trans_valid_ = true;
-}
-
-void CommonClock::resetBasis() {
- Mutex::Autolock lock(&lock_);
-
- cur_trans_.a_zero = 0;
- cur_trans_.b_zero = 0;
- cur_trans_valid_ = false;
-}
-
-status_t CommonClock::setSlew(int64_t change_time, int32_t ppm) {
- Mutex::Autolock lock(&lock_);
-
- int64_t new_local_basis;
- int64_t new_common_basis;
-
- if (cur_trans_valid_) {
- new_local_basis = change_time;
- if (!cur_trans_.doForwardTransform(change_time, &new_common_basis)) {
- ALOGE("Overflow when attempting to set slew rate to %d", ppm);
- return INVALID_OPERATION;
- }
- } else {
- new_local_basis = 0;
- new_common_basis = 0;
- }
-
- cur_slew_ = ppm;
- uint32_t n1 = local_to_common_freq_numer_;
- uint32_t n2 = 1000000 + cur_slew_;
-
- uint32_t d1 = local_to_common_freq_denom_;
- uint32_t d2 = 1000000;
-
- // n1/d1 has already been reduced, no need to do so here.
- LinearTransform::reduce(&n1, &d2);
- LinearTransform::reduce(&n2, &d1);
- LinearTransform::reduce(&n2, &d2);
-
- cur_trans_.a_zero = new_local_basis;
- cur_trans_.b_zero = new_common_basis;
- cur_trans_.a_to_b_numer = n1 * n2;
- cur_trans_.a_to_b_denom = d1 * d2;
-
- return OK;
-}
-
-} // namespace android
diff --git a/libs/common_time/common_clock.h b/libs/common_time/common_clock.h
deleted file mode 100644
index 5e4e5f51b446..000000000000
--- a/libs/common_time/common_clock.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef __COMMON_CLOCK_H__
-#define __COMMON_CLOCK_H__
-
-#include <stdint.h>
-
-#include <utils/Errors.h>
-#include <utils/threads.h>
-
-#include "LinearTransform.h"
-
-namespace android {
-
-class CommonClock {
- public:
- CommonClock();
-
- bool init(uint64_t local_freq);
-
- status_t localToCommon(int64_t local, int64_t *common_out) const;
- status_t commonToLocal(int64_t common, int64_t *local_out) const;
- int64_t localDurationToCommonDuration(int64_t localDur) const;
- uint64_t getCommonFreq() const { return kCommonFreq; }
- bool isValid() const { return cur_trans_valid_; }
- status_t setSlew(int64_t change_time, int32_t ppm);
- void setBasis(int64_t local, int64_t common);
- void resetBasis();
- private:
- mutable Mutex lock_;
-
- int32_t cur_slew_;
- uint32_t local_to_common_freq_numer_;
- uint32_t local_to_common_freq_denom_;
-
- LinearTransform duration_trans_;
- LinearTransform cur_trans_;
- bool cur_trans_valid_;
-
- static const uint64_t kCommonFreq = 1000000ull;
-};
-
-} // namespace android
-#endif // __COMMON_CLOCK_H__
diff --git a/libs/common_time/common_clock_service.cpp b/libs/common_time/common_clock_service.cpp
deleted file mode 100644
index 592ab1dceab8..000000000000
--- a/libs/common_time/common_clock_service.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#include <common_time/local_clock.h>
-#include <utils/String8.h>
-
-#include "common_clock_service.h"
-#include "common_clock.h"
-#include "common_time_server.h"
-
-namespace android {
-
-sp<CommonClockService> CommonClockService::instantiate(
- CommonTimeServer& timeServer) {
- sp<CommonClockService> tcc = new CommonClockService(timeServer);
- if (tcc == NULL)
- return NULL;
-
- defaultServiceManager()->addService(ICommonClock::kServiceName, tcc);
- return tcc;
-}
-
-status_t CommonClockService::dump(int fd, const Vector<String16>& args) {
- Mutex::Autolock lock(mRegistrationLock);
- return mTimeServer.dumpClockInterface(fd, args, mListeners.size());
-}
-
-status_t CommonClockService::isCommonTimeValid(bool* valid,
- uint32_t* timelineID) {
- return mTimeServer.isCommonTimeValid(valid, timelineID);
-}
-
-status_t CommonClockService::commonTimeToLocalTime(int64_t commonTime,
- int64_t* localTime) {
- return mTimeServer.getCommonClock().commonToLocal(commonTime, localTime);
-}
-
-status_t CommonClockService::localTimeToCommonTime(int64_t localTime,
- int64_t* commonTime) {
- return mTimeServer.getCommonClock().localToCommon(localTime, commonTime);
-}
-
-status_t CommonClockService::getCommonTime(int64_t* commonTime) {
- return localTimeToCommonTime(mTimeServer.getLocalClock().getLocalTime(), commonTime);
-}
-
-status_t CommonClockService::getCommonFreq(uint64_t* freq) {
- *freq = mTimeServer.getCommonClock().getCommonFreq();
- return OK;
-}
-
-status_t CommonClockService::getLocalTime(int64_t* localTime) {
- *localTime = mTimeServer.getLocalClock().getLocalTime();
- return OK;
-}
-
-status_t CommonClockService::getLocalFreq(uint64_t* freq) {
- *freq = mTimeServer.getLocalClock().getLocalFreq();
- return OK;
-}
-
-status_t CommonClockService::getEstimatedError(int32_t* estimate) {
- *estimate = mTimeServer.getEstimatedError();
- return OK;
-}
-
-status_t CommonClockService::getTimelineID(uint64_t* id) {
- *id = mTimeServer.getTimelineID();
- return OK;
-}
-
-status_t CommonClockService::getState(State* state) {
- *state = mTimeServer.getState();
- return OK;
-}
-
-status_t CommonClockService::getMasterAddr(struct sockaddr_storage* addr) {
- return mTimeServer.getMasterAddr(addr);
-}
-
-status_t CommonClockService::registerListener(
- const sp<ICommonClockListener>& listener) {
- Mutex::Autolock lock(mRegistrationLock);
-
- { // scoping for autolock pattern
- Mutex::Autolock lock(mCallbackLock);
- // check whether this is a duplicate
- for (size_t i = 0; i < mListeners.size(); i++) {
- if (IInterface::asBinder(mListeners[i]) == IInterface::asBinder(listener))
- return ALREADY_EXISTS;
- }
- }
-
- mListeners.add(listener);
- mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
- return IInterface::asBinder(listener)->linkToDeath(this);
-}
-
-status_t CommonClockService::unregisterListener(
- const sp<ICommonClockListener>& listener) {
- Mutex::Autolock lock(mRegistrationLock);
- status_t ret_val = NAME_NOT_FOUND;
-
- { // scoping for autolock pattern
- Mutex::Autolock lock(mCallbackLock);
- for (size_t i = 0; i < mListeners.size(); i++) {
- if (IInterface::asBinder(mListeners[i]) == IInterface::asBinder(listener)) {
- IInterface::asBinder(mListeners[i])->unlinkToDeath(this);
- mListeners.removeAt(i);
- ret_val = OK;
- break;
- }
- }
- }
-
- mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
- return ret_val;
-}
-
-void CommonClockService::binderDied(const wp<IBinder>& who) {
- Mutex::Autolock lock(mRegistrationLock);
-
- { // scoping for autolock pattern
- Mutex::Autolock lock(mCallbackLock);
- for (size_t i = 0; i < mListeners.size(); i++) {
- if (IInterface::asBinder(mListeners[i]) == who) {
- mListeners.removeAt(i);
- break;
- }
- }
- }
-
- mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
-}
-
-void CommonClockService::notifyOnTimelineChanged(uint64_t timelineID) {
- Mutex::Autolock lock(mCallbackLock);
-
- for (size_t i = 0; i < mListeners.size(); i++) {
- mListeners[i]->onTimelineChanged(timelineID);
- }
-}
-
-}; // namespace android
diff --git a/libs/common_time/common_clock_service.h b/libs/common_time/common_clock_service.h
deleted file mode 100644
index aea507ec0f30..000000000000
--- a/libs/common_time/common_clock_service.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_COMMON_CLOCK_SERVICE_H
-#define ANDROID_COMMON_CLOCK_SERVICE_H
-
-#include <sys/socket.h>
-#include <common_time/ICommonClock.h>
-
-namespace android {
-
-class CommonTimeServer;
-
-class CommonClockService : public BnCommonClock,
- public android::IBinder::DeathRecipient {
- public:
- static sp<CommonClockService> instantiate(CommonTimeServer& timeServer);
-
- virtual status_t dump(int fd, const Vector<String16>& args);
-
- virtual status_t isCommonTimeValid(bool* valid, uint32_t *timelineID);
- virtual status_t commonTimeToLocalTime(int64_t common_time,
- int64_t* local_time);
- virtual status_t localTimeToCommonTime(int64_t local_time,
- int64_t* common_time);
- virtual status_t getCommonTime(int64_t* common_time);
- virtual status_t getCommonFreq(uint64_t* freq);
- virtual status_t getLocalTime(int64_t* local_time);
- virtual status_t getLocalFreq(uint64_t* freq);
- virtual status_t getEstimatedError(int32_t* estimate);
- virtual status_t getTimelineID(uint64_t* id);
- virtual status_t getState(ICommonClock::State* state);
- virtual status_t getMasterAddr(struct sockaddr_storage* addr);
-
- virtual status_t registerListener(
- const sp<ICommonClockListener>& listener);
- virtual status_t unregisterListener(
- const sp<ICommonClockListener>& listener);
-
- void notifyOnTimelineChanged(uint64_t timelineID);
-
- private:
- explicit CommonClockService(CommonTimeServer& timeServer)
- : mTimeServer(timeServer) { };
-
- virtual void binderDied(const wp<IBinder>& who);
-
- CommonTimeServer& mTimeServer;
-
- // locks used to synchronize access to the list of registered listeners.
- // The callback lock is held whenever the list is used to perform callbacks
- // or while the list is being modified. The registration lock used to
- // serialize access across registerListener, unregisterListener, and
- // binderDied.
- //
- // The reason for two locks is that registerListener, unregisterListener,
- // and binderDied each call into the core service and obtain the core
- // service thread lock when they call reevaluateAutoDisableState. The core
- // service thread obtains the main thread lock whenever its thread is
- // running, and sometimes needs to call notifyOnTimelineChanged which then
- // obtains the callback lock. If callers of registration functions were
- // holding the callback lock when they called into the core service, we
- // would have a classic A/B, B/A ordering deadlock. To avoid this, the
- // registration functions hold the registration lock for the duration of
- // their call, but hold the callback lock only while they mutate the list.
- // This way, the list's size cannot change (because of the registration
- // lock) during the call into reevaluateAutoDisableState, but the core work
- // thread can still safely call notifyOnTimelineChanged while holding the
- // main thread lock.
- Mutex mCallbackLock;
- Mutex mRegistrationLock;
-
- Vector<sp<ICommonClockListener> > mListeners;
-};
-
-}; // namespace android
-
-#endif // ANDROID_COMMON_CLOCK_SERVICE_H
diff --git a/libs/common_time/common_time_config_service.cpp b/libs/common_time/common_time_config_service.cpp
deleted file mode 100644
index 958561818423..000000000000
--- a/libs/common_time/common_time_config_service.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#include <utils/String8.h>
-
-#include "common_time_config_service.h"
-#include "common_time_server.h"
-
-namespace android {
-
-sp<CommonTimeConfigService> CommonTimeConfigService::instantiate(
- CommonTimeServer& timeServer) {
- sp<CommonTimeConfigService> ctcs = new CommonTimeConfigService(timeServer);
- if (ctcs == NULL)
- return NULL;
-
- defaultServiceManager()->addService(ICommonTimeConfig::kServiceName, ctcs);
- return ctcs;
-}
-
-status_t CommonTimeConfigService::dump(int fd, const Vector<String16>& args) {
- return mTimeServer.dumpConfigInterface(fd, args);
-}
-
-status_t CommonTimeConfigService::getMasterElectionPriority(uint8_t *priority) {
- return mTimeServer.getMasterElectionPriority(priority);
-}
-
-status_t CommonTimeConfigService::setMasterElectionPriority(uint8_t priority) {
- return mTimeServer.setMasterElectionPriority(priority);
-}
-
-status_t CommonTimeConfigService::getMasterElectionEndpoint(
- struct sockaddr_storage *addr) {
- return mTimeServer.getMasterElectionEndpoint(addr);
-}
-
-status_t CommonTimeConfigService::setMasterElectionEndpoint(
- const struct sockaddr_storage *addr) {
- return mTimeServer.setMasterElectionEndpoint(addr);
-}
-
-status_t CommonTimeConfigService::getMasterElectionGroupId(uint64_t *id) {
- return mTimeServer.getMasterElectionGroupId(id);
-}
-
-status_t CommonTimeConfigService::setMasterElectionGroupId(uint64_t id) {
- return mTimeServer.setMasterElectionGroupId(id);
-}
-
-status_t CommonTimeConfigService::getInterfaceBinding(String16& ifaceName) {
- String8 tmp;
- status_t ret = mTimeServer.getInterfaceBinding(tmp);
- ifaceName = String16(tmp);
- return ret;
-}
-
-status_t CommonTimeConfigService::setInterfaceBinding(const String16& ifaceName) {
- String8 tmp(ifaceName);
- return mTimeServer.setInterfaceBinding(tmp);
-}
-
-status_t CommonTimeConfigService::getMasterAnnounceInterval(int *interval) {
- return mTimeServer.getMasterAnnounceInterval(interval);
-}
-
-status_t CommonTimeConfigService::setMasterAnnounceInterval(int interval) {
- return mTimeServer.setMasterAnnounceInterval(interval);
-}
-
-status_t CommonTimeConfigService::getClientSyncInterval(int *interval) {
- return mTimeServer.getClientSyncInterval(interval);
-}
-
-status_t CommonTimeConfigService::setClientSyncInterval(int interval) {
- return mTimeServer.setClientSyncInterval(interval);
-}
-
-status_t CommonTimeConfigService::getPanicThreshold(int *threshold) {
- return mTimeServer.getPanicThreshold(threshold);
-}
-
-status_t CommonTimeConfigService::setPanicThreshold(int threshold) {
- return mTimeServer.setPanicThreshold(threshold);
-}
-
-status_t CommonTimeConfigService::getAutoDisable(bool *autoDisable) {
- return mTimeServer.getAutoDisable(autoDisable);
-}
-
-status_t CommonTimeConfigService::setAutoDisable(bool autoDisable) {
- return mTimeServer.setAutoDisable(autoDisable);
-}
-
-status_t CommonTimeConfigService::forceNetworklessMasterMode() {
- return mTimeServer.forceNetworklessMasterMode();
-}
-
-}; // namespace android
diff --git a/libs/common_time/common_time_config_service.h b/libs/common_time/common_time_config_service.h
deleted file mode 100644
index 23abb1a9e47e..000000000000
--- a/libs/common_time/common_time_config_service.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_COMMON_TIME_CONFIG_SERVICE_H
-#define ANDROID_COMMON_TIME_CONFIG_SERVICE_H
-
-#include <sys/socket.h>
-#include <common_time/ICommonTimeConfig.h>
-
-namespace android {
-
-class String16;
-class CommonTimeServer;
-
-class CommonTimeConfigService : public BnCommonTimeConfig {
- public:
- static sp<CommonTimeConfigService> instantiate(CommonTimeServer& timeServer);
-
- virtual status_t dump(int fd, const Vector<String16>& args);
-
- virtual status_t getMasterElectionPriority(uint8_t *priority);
- virtual status_t setMasterElectionPriority(uint8_t priority);
- virtual status_t getMasterElectionEndpoint(struct sockaddr_storage *addr);
- virtual status_t setMasterElectionEndpoint(const struct sockaddr_storage *addr);
- virtual status_t getMasterElectionGroupId(uint64_t *id);
- virtual status_t setMasterElectionGroupId(uint64_t id);
- virtual status_t getInterfaceBinding(String16& ifaceName);
- virtual status_t setInterfaceBinding(const String16& ifaceName);
- virtual status_t getMasterAnnounceInterval(int *interval);
- virtual status_t setMasterAnnounceInterval(int interval);
- virtual status_t getClientSyncInterval(int *interval);
- virtual status_t setClientSyncInterval(int interval);
- virtual status_t getPanicThreshold(int *threshold);
- virtual status_t setPanicThreshold(int threshold);
- virtual status_t getAutoDisable(bool *autoDisable);
- virtual status_t setAutoDisable(bool autoDisable);
- virtual status_t forceNetworklessMasterMode();
-
- private:
- explicit CommonTimeConfigService(CommonTimeServer& timeServer)
- : mTimeServer(timeServer) { }
- CommonTimeServer& mTimeServer;
-
-};
-
-}; // namespace android
-
-#endif // ANDROID_COMMON_TIME_CONFIG_SERVICE_H
diff --git a/libs/common_time/common_time_server.cpp b/libs/common_time/common_time_server.cpp
deleted file mode 100644
index b1495effbc81..000000000000
--- a/libs/common_time/common_time_server.cpp
+++ /dev/null
@@ -1,1507 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/*
- * A service that exchanges time synchronization information between
- * a master that defines a timeline and clients that follow the timeline.
- */
-
-#define LOG_TAG "common_time"
-#include <utils/Log.h>
-
-#include <arpa/inet.h>
-#include <assert.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <linux/if_ether.h>
-#include <net/if.h>
-#include <net/if_arp.h>
-#include <netinet/ip.h>
-#include <poll.h>
-#include <stdio.h>
-#include <sys/eventfd.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <common_time/local_clock.h>
-#include <binder/IPCThreadState.h>
-#include <binder/ProcessState.h>
-#include <utils/Timers.h>
-
-#include "common_clock_service.h"
-#include "common_time_config_service.h"
-#include "common_time_server.h"
-#include "common_time_server_packets.h"
-#include "clock_recovery.h"
-#include "common_clock.h"
-
-#define MAX_INT ((int)0x7FFFFFFF)
-
-namespace android {
-
-const char* CommonTimeServer::kDefaultMasterElectionAddr = "255.255.255.255";
-const uint16_t CommonTimeServer::kDefaultMasterElectionPort = 8886;
-const uint64_t CommonTimeServer::kDefaultSyncGroupID = 1;
-const uint8_t CommonTimeServer::kDefaultMasterPriority = 1;
-const uint32_t CommonTimeServer::kDefaultMasterAnnounceIntervalMs = 10000;
-const uint32_t CommonTimeServer::kDefaultSyncRequestIntervalMs = 1000;
-const uint32_t CommonTimeServer::kDefaultPanicThresholdUsec = 50000;
-const bool CommonTimeServer::kDefaultAutoDisable = true;
-const int CommonTimeServer::kSetupRetryTimeoutMs = 30000;
-const int64_t CommonTimeServer::kNoGoodDataPanicThresholdUsec = 600000000ll;
-const uint32_t CommonTimeServer::kRTTDiscardPanicThreshMultiplier = 5;
-
-// timeout value representing an infinite timeout
-const int CommonTimeServer::kInfiniteTimeout = -1;
-
-/*** Initial state constants ***/
-
-// number of WhoIsMaster attempts sent before giving up
-const int CommonTimeServer::kInitial_NumWhoIsMasterRetries = 6;
-
-// timeout used when waiting for a response to a WhoIsMaster request
-const int CommonTimeServer::kInitial_WhoIsMasterTimeoutMs = 500;
-
-/*** Client state constants ***/
-
-// number of sync requests that can fail before a client assumes its master
-// is dead
-const int CommonTimeServer::kClient_NumSyncRequestRetries = 10;
-
-/*** Master state constants ***/
-
-/*** Ronin state constants ***/
-
-// number of WhoIsMaster attempts sent before declaring ourselves master
-const int CommonTimeServer::kRonin_NumWhoIsMasterRetries = 20;
-
-// timeout used when waiting for a response to a WhoIsMaster request
-const int CommonTimeServer::kRonin_WhoIsMasterTimeoutMs = 500;
-
-/*** WaitForElection state constants ***/
-
-// how long do we wait for an announcement from a master before
-// trying another election?
-const int CommonTimeServer::kWaitForElection_TimeoutMs = 12500;
-
-CommonTimeServer::CommonTimeServer()
- : Thread(false)
- , mState(ICommonClock::STATE_INITIAL)
- , mClockRecovery(&mLocalClock, &mCommonClock)
- , mSocket(-1)
- , mLastPacketRxLocalTime(0)
- , mTimelineID(ICommonClock::kInvalidTimelineID)
- , mClockSynced(false)
- , mCommonClockHasClients(false)
- , mStateChangeLog("Recent State Change Events", 30)
- , mElectionLog("Recent Master Election Traffic", 30)
- , mBadPktLog("Recent Bad Packet RX Info", 8)
- , mInitial_WhoIsMasterRequestTimeouts(0)
- , mClient_MasterDeviceID(0)
- , mClient_MasterDevicePriority(0)
- , mRonin_WhoIsMasterRequestTimeouts(0) {
- // zero out sync stats
- resetSyncStats();
-
- // Setup the master election endpoint to use the default.
- struct sockaddr_in* meep =
- reinterpret_cast<struct sockaddr_in*>(&mMasterElectionEP);
- memset(&mMasterElectionEP, 0, sizeof(mMasterElectionEP));
- inet_aton(kDefaultMasterElectionAddr, &meep->sin_addr);
- meep->sin_family = AF_INET;
- meep->sin_port = htons(kDefaultMasterElectionPort);
-
- // Zero out the master endpoint.
- memset(&mMasterEP, 0, sizeof(mMasterEP));
- mMasterEPValid = false;
- mBindIfaceValid = false;
- setForceLowPriority(false);
-
- // Set all remaining configuration parameters to their defaults.
- mDeviceID = 0;
- mSyncGroupID = kDefaultSyncGroupID;
- mMasterPriority = kDefaultMasterPriority;
- mMasterAnnounceIntervalMs = kDefaultMasterAnnounceIntervalMs;
- mSyncRequestIntervalMs = kDefaultSyncRequestIntervalMs;
- mPanicThresholdUsec = kDefaultPanicThresholdUsec;
- mAutoDisable = kDefaultAutoDisable;
-
- // Create the eventfd we will use to signal our thread to wake up when
- // needed.
- mWakeupThreadFD = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
-
- // seed the random number generator (used to generated timeline IDs)
- srand48(static_cast<unsigned int>(systemTime()));
-}
-
-CommonTimeServer::~CommonTimeServer() {
- shutdownThread();
-
- // No need to grab the lock here. We are in the destructor; if the the user
- // has a thread in any of the APIs while the destructor is being called,
- // there is a threading problem a the application level we cannot reasonably
- // do anything about.
- cleanupSocket_l();
-
- if (mWakeupThreadFD >= 0) {
- close(mWakeupThreadFD);
- mWakeupThreadFD = -1;
- }
-}
-
-bool CommonTimeServer::startServices() {
- // start the ICommonClock service
- mICommonClock = CommonClockService::instantiate(*this);
- if (mICommonClock == NULL)
- return false;
-
- // start the ICommonTimeConfig service
- mICommonTimeConfig = CommonTimeConfigService::instantiate(*this);
- if (mICommonTimeConfig == NULL)
- return false;
-
- return true;
-}
-
-bool CommonTimeServer::threadLoop() {
- // Register our service interfaces.
- if (!startServices())
- return false;
-
- // Hold the lock while we are in the main thread loop. It will release the
- // lock when it blocks, and hold the lock at all other times.
- mLock.lock();
- runStateMachine_l();
- mLock.unlock();
-
- IPCThreadState::self()->stopProcess();
- return false;
-}
-
-bool CommonTimeServer::runStateMachine_l() {
- if (!mLocalClock.initCheck())
- return false;
-
- if (!mCommonClock.init(mLocalClock.getLocalFreq()))
- return false;
-
- // Enter the initial state.
- becomeInitial("startup");
-
- // run the state machine
- while (!exitPending()) {
- struct pollfd pfds[2];
- int rc, timeout;
- int eventCnt = 0;
- int64_t wakeupTime;
- uint32_t t1, t2;
- bool needHandleTimeout = false;
-
- // We are always interested in our wakeup FD.
- pfds[eventCnt].fd = mWakeupThreadFD;
- pfds[eventCnt].events = POLLIN;
- pfds[eventCnt].revents = 0;
- eventCnt++;
-
- // If we have a valid socket, then we are interested in what it has to
- // say as well.
- if (mSocket >= 0) {
- pfds[eventCnt].fd = mSocket;
- pfds[eventCnt].events = POLLIN;
- pfds[eventCnt].revents = 0;
- eventCnt++;
- }
-
- t1 = static_cast<uint32_t>(mCurTimeout.msecTillTimeout());
- t2 = static_cast<uint32_t>(mClockRecovery.applyRateLimitedSlew());
- timeout = static_cast<int>(t1 < t2 ? t1 : t2);
-
- // Note, we were holding mLock when this function was called. We
- // release it only while we are blocking and hold it at all other times.
- mLock.unlock();
- rc = poll(pfds, eventCnt, timeout);
- wakeupTime = mLocalClock.getLocalTime();
- mLock.lock();
-
- // Is it time to shutdown? If so, don't hesitate... just do it.
- if (exitPending())
- break;
-
- // Did the poll fail? This should never happen and is fatal if it does.
- if (rc < 0) {
- ALOGE("%s:%d poll failed", __PRETTY_FUNCTION__, __LINE__);
- return false;
- }
-
- if (rc == 0) {
- needHandleTimeout = !mCurTimeout.msecTillTimeout();
- if (needHandleTimeout)
- mCurTimeout.setTimeout(kInfiniteTimeout);
- }
-
- // Were we woken up on purpose? If so, clear the eventfd with a read.
- if (pfds[0].revents)
- clearPendingWakeupEvents_l();
-
- // Is out bind address dirty? If so, clean up our socket (if any).
- // Alternatively, do we have an active socket but should be auto
- // disabled? If so, release the socket and enter the proper sync state.
- bool droppedSocket = false;
- if (mBindIfaceDirty || ((mSocket >= 0) && shouldAutoDisable())) {
- cleanupSocket_l();
- mBindIfaceDirty = false;
- droppedSocket = true;
- }
-
- // Do we not have a socket but should have one? If so, try to set one
- // up.
- if ((mSocket < 0) && mBindIfaceValid && !shouldAutoDisable()) {
- if (setupSocket_l()) {
- // Success! We are now joining a new network (either coming
- // from no network, or coming from a potentially different
- // network). Force our priority to be lower so that we defer to
- // any other masters which may already be on the network we are
- // joining. Later, when we enter either the client or the
- // master state, we will clear this flag and go back to our
- // normal election priority.
- setForceLowPriority(true);
- switch (mState) {
- // If we were in initial (whether we had a immediately
- // before this network or not) we want to simply reset the
- // system and start again. Forcing a transition from
- // INITIAL to INITIAL should do the job.
- case CommonClockService::STATE_INITIAL:
- becomeInitial("bound interface");
- break;
-
- // If we were in the master state, then either we were the
- // master in a no-network situation, or we were the master
- // of a different network and have moved to a new interface.
- // In either case, immediately transition to Ronin at low
- // priority. If there is no one in the network we just
- // joined, we will become master soon enough. If there is,
- // we want to be certain to defer master status to the
- // existing timeline currently running on the network.
- //
- case CommonClockService::STATE_MASTER:
- becomeRonin("leaving networkless mode");
- break;
-
- // If we were in any other state (CLIENT, RONIN, or
- // WAIT_FOR_ELECTION) then we must be moving from one
- // network to another. We have lost our old master;
- // transition to RONIN in an attempt to find a new master.
- // If there are none out there, we will just assume
- // responsibility for the timeline we used to be a client
- // of.
- default:
- becomeRonin("bound interface");
- break;
- }
- } else {
- // That's odd... we failed to set up our socket. This could be
- // due to some transient network change which will work itself
- // out shortly; schedule a retry attempt in the near future.
- mCurTimeout.setTimeout(kSetupRetryTimeoutMs);
- }
-
- // One way or the other, we don't have any data to process at this
- // point (since we just tried to bulid a new socket). Loop back
- // around and wait for the next thing to do.
- continue;
- } else if (droppedSocket) {
- // We just lost our socket, and for whatever reason (either no
- // config, or auto disable engaged) we are not supposed to rebuild
- // one at this time. We are not going to rebuild our socket until
- // something about our config/auto-disabled status changes, so we
- // are basically in network-less mode. If we are already in either
- // INITIAL or MASTER, just stay there until something changes. If
- // we are in any other state (CLIENT, RONIN or WAIT_FOR_ELECTION),
- // then transition to either INITIAL or MASTER depending on whether
- // or not our timeline is valid.
- mStateChangeLog.log(ANDROID_LOG_INFO, LOG_TAG,
- "Entering networkless mode interface is %s, "
- "shouldAutoDisable = %s",
- mBindIfaceValid ? "valid" : "invalid",
- shouldAutoDisable() ? "true" : "false");
- if ((mState != ICommonClock::STATE_INITIAL) &&
- (mState != ICommonClock::STATE_MASTER)) {
- if (mTimelineID == ICommonClock::kInvalidTimelineID)
- becomeInitial("network-less mode");
- else
- becomeMaster("network-less mode");
- }
-
- continue;
- }
-
- // Time to handle the timeouts?
- if (needHandleTimeout) {
- if (!handleTimeout())
- ALOGE("handleTimeout failed");
- continue;
- }
-
- // Does our socket have data for us (assuming we still have one, we
- // may have RXed a packet at the same time as a config change telling us
- // to shut our socket down)? If so, process its data.
- if ((mSocket >= 0) && (eventCnt > 1) && (pfds[1].revents)) {
- mLastPacketRxLocalTime = wakeupTime;
- if (!handlePacket())
- ALOGE("handlePacket failed");
- }
- }
-
- cleanupSocket_l();
- return true;
-}
-
-void CommonTimeServer::clearPendingWakeupEvents_l() {
- int64_t tmp;
- read(mWakeupThreadFD, &tmp, sizeof(tmp));
-}
-
-void CommonTimeServer::wakeupThread_l() {
- int64_t tmp = 1;
- write(mWakeupThreadFD, &tmp, sizeof(tmp));
-}
-
-void CommonTimeServer::cleanupSocket_l() {
- if (mSocket >= 0) {
- close(mSocket);
- mSocket = -1;
- }
-}
-
-void CommonTimeServer::shutdownThread() {
- // Flag the work thread for shutdown.
- this->requestExit();
-
- // Signal the thread in case its sleeping.
- mLock.lock();
- wakeupThread_l();
- mLock.unlock();
-
- // Wait for the thread to exit.
- this->join();
-}
-
-bool CommonTimeServer::setupSocket_l() {
- int rc;
- bool ret_val = false;
- struct sockaddr_in* ipv4_addr = NULL;
- char masterElectionEPStr[64];
- const int one = 1;
-
- // This should never be needed, but if we happened to have an old socket
- // lying around, be sure to not leak it before proceeding.
- cleanupSocket_l();
-
- // If we don't have a valid endpoint to bind to, then how did we get here in
- // the first place? Regardless, we know that we are going to fail to bind,
- // so don't even try.
- if (!mBindIfaceValid)
- return false;
-
- sockaddrToString(mMasterElectionEP, true, masterElectionEPStr,
- sizeof(masterElectionEPStr));
- mStateChangeLog.log(ANDROID_LOG_INFO, LOG_TAG,
- "Building socket :: bind = %s master election = %s",
- mBindIface.string(), masterElectionEPStr);
-
- // TODO: add proper support for IPv6. Right now, we block IPv6 addresses at
- // the configuration interface level.
- if (AF_INET != mMasterElectionEP.ss_family) {
- mStateChangeLog.log(ANDROID_LOG_WARN, LOG_TAG,
- "TODO: add proper IPv6 support");
- goto bailout;
- }
-
- // open a UDP socket for the timeline serivce
- mSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (mSocket < 0) {
- mStateChangeLog.log(ANDROID_LOG_ERROR, LOG_TAG,
- "Failed to create socket (errno = %d)", errno);
- goto bailout;
- }
-
- // Bind to the selected interface using Linux's spiffy SO_BINDTODEVICE.
- struct ifreq ifr;
- memset(&ifr, 0, sizeof(ifr));
- snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", mBindIface.string());
- ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = 0;
- rc = setsockopt(mSocket, SOL_SOCKET, SO_BINDTODEVICE,
- (void *)&ifr, sizeof(ifr));
- if (rc) {
- mStateChangeLog.log(ANDROID_LOG_ERROR, LOG_TAG,
- "Failed to bind socket at to interface %s "
- "(errno = %d)", ifr.ifr_name, errno);
- goto bailout;
- }
-
- // Bind our socket to INADDR_ANY and the master election port. The
- // interface binding we made using SO_BINDTODEVICE should limit us to
- // traffic only on the interface we are interested in. We need to bind to
- // INADDR_ANY and the specific master election port in order to be able to
- // receive both unicast traffic and master election multicast traffic with
- // just a single socket.
- struct sockaddr_in bindAddr;
- ipv4_addr = reinterpret_cast<struct sockaddr_in*>(&mMasterElectionEP);
- memcpy(&bindAddr, ipv4_addr, sizeof(bindAddr));
- bindAddr.sin_addr.s_addr = INADDR_ANY;
- rc = bind(mSocket,
- reinterpret_cast<const sockaddr *>(&bindAddr),
- sizeof(bindAddr));
- if (rc) {
- mStateChangeLog.log(ANDROID_LOG_ERROR, LOG_TAG,
- "Failed to bind socket to port %hu (errno = %d)",
- ntohs(bindAddr.sin_port), errno);
- goto bailout;
- }
-
- if (0xE0000000 == (ntohl(ipv4_addr->sin_addr.s_addr) & 0xF0000000)) {
- // If our master election endpoint is a multicast address, be sure to join
- // the multicast group.
- struct ip_mreq mreq;
- mreq.imr_multiaddr = ipv4_addr->sin_addr;
- mreq.imr_interface.s_addr = htonl(INADDR_ANY);
- rc = setsockopt(mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
- &mreq, sizeof(mreq));
- if (rc == -1) {
- ALOGE("Failed to join multicast group at %s. (errno = %d)",
- masterElectionEPStr, errno);
- goto bailout;
- }
-
- // disable loopback of multicast packets
- const int zero = 0;
- rc = setsockopt(mSocket, IPPROTO_IP, IP_MULTICAST_LOOP,
- &zero, sizeof(zero));
- if (rc == -1) {
- mStateChangeLog.log(ANDROID_LOG_ERROR, LOG_TAG,
- "Failed to disable multicast loopback "
- "(errno = %d)", errno);
- goto bailout;
- }
- } else
- if (ntohl(ipv4_addr->sin_addr.s_addr) == 0xFFFFFFFF) {
- // If the master election address is the broadcast address, then enable
- // the broadcast socket option
- rc = setsockopt(mSocket, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one));
- if (rc == -1) {
- mStateChangeLog.log(ANDROID_LOG_ERROR, LOG_TAG,
- "Failed to enable broadcast (errno = %d)",
- errno);
- goto bailout;
- }
- } else {
- // If the master election address is neither broadcast, nor multicast,
- // then we are misconfigured. The config API layer should prevent this
- // from ever happening.
- goto bailout;
- }
-
- // Set the TTL of sent packets to 1. (Time protocol sync should never leave
- // the local subnet)
- rc = setsockopt(mSocket, IPPROTO_IP, IP_TTL, &one, sizeof(one));
- if (rc == -1) {
- mStateChangeLog.log(ANDROID_LOG_ERROR, LOG_TAG,
- "Failed to set TTL to %d (errno = %d)", one, errno);
- goto bailout;
- }
-
- // get the device's unique ID
- if (!assignDeviceID())
- goto bailout;
-
- ret_val = true;
-
-bailout:
- if (!ret_val)
- cleanupSocket_l();
- return ret_val;
-}
-
-// generate a unique device ID that can be used for arbitration
-bool CommonTimeServer::assignDeviceID() {
- if (!mBindIfaceValid)
- return false;
-
- struct ifreq ifr;
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_addr.sa_family = AF_INET;
- strlcpy(ifr.ifr_name, mBindIface.string(), IFNAMSIZ);
-
- int rc = ioctl(mSocket, SIOCGIFHWADDR, &ifr);
- if (rc) {
- ALOGE("%s:%d ioctl failed", __PRETTY_FUNCTION__, __LINE__);
- return false;
- }
-
- if (ifr.ifr_addr.sa_family != ARPHRD_ETHER) {
- ALOGE("%s:%d got non-Ethernet address", __PRETTY_FUNCTION__, __LINE__);
- return false;
- }
-
- mDeviceID = 0;
- for (int i = 0; i < ETH_ALEN; i++) {
- mDeviceID = (mDeviceID << 8) | ifr.ifr_hwaddr.sa_data[i];
- }
-
- return true;
-}
-
-// generate a new timeline ID
-void CommonTimeServer::assignTimelineID() {
- do {
- mTimelineID = (static_cast<uint64_t>(lrand48()) << 32)
- | static_cast<uint64_t>(lrand48());
- } while (mTimelineID == ICommonClock::kInvalidTimelineID);
-}
-
-// Select a preference between the device IDs of two potential masters.
-// Returns true if the first ID wins, or false if the second ID wins.
-bool CommonTimeServer::arbitrateMaster(
- uint64_t deviceID1, uint8_t devicePrio1,
- uint64_t deviceID2, uint8_t devicePrio2) {
- return ((devicePrio1 > devicePrio2) ||
- ((devicePrio1 == devicePrio2) && (deviceID1 > deviceID2)));
-}
-
-static void hexDumpToString(const uint8_t* src, size_t src_len,
- char* dst, size_t dst_len) {
- size_t offset = 0;
- size_t i;
-
- for (i = 0; (i < src_len) && (offset < dst_len); ++i) {
- int res;
- if (0 == (i % 16)) {
- res = snprintf(dst + offset, dst_len - offset, "\n%04zx :", i);
- if (res < 0)
- break;
- offset += res;
- if (offset >= dst_len)
- break;
- }
-
- res = snprintf(dst + offset, dst_len - offset, " %02x", src[i]);
- if (res < 0)
- break;
- offset += res;
- }
-
- dst[dst_len - 1] = 0;
-}
-
-bool CommonTimeServer::handlePacket() {
- uint8_t buf[256];
- struct sockaddr_storage srcAddr;
- socklen_t srcAddrLen = sizeof(srcAddr);
-
- ssize_t recvBytes = recvfrom(
- mSocket, buf, sizeof(buf), 0,
- reinterpret_cast<sockaddr *>(&srcAddr), &srcAddrLen);
-
- if (recvBytes < 0) {
- mBadPktLog.log(ANDROID_LOG_ERROR, LOG_TAG, "recvfrom failed (%s)",
- strerror(errno));
- return false;
- }
-
- UniversalTimeServicePacket pkt;
- if (pkt.deserializePacket(buf, recvBytes, mSyncGroupID) < 0) {
- char hex[256];
- char srcEPStr[64];
-
- hexDumpToString(buf, static_cast<size_t>(recvBytes), hex, sizeof(hex));
- sockaddrToString(srcAddr, true, srcEPStr, sizeof(srcEPStr));
-
- mBadPktLog.log("Failed to parse %d byte packet from %s.%s",
- recvBytes, srcEPStr, hex);
- return false;
- }
-
- bool result;
- switch (pkt.packetType) {
- case TIME_PACKET_WHO_IS_MASTER_REQUEST:
- result = handleWhoIsMasterRequest(&pkt.p.who_is_master_request,
- srcAddr);
- break;
-
- case TIME_PACKET_WHO_IS_MASTER_RESPONSE:
- result = handleWhoIsMasterResponse(&pkt.p.who_is_master_response,
- srcAddr);
- break;
-
- case TIME_PACKET_SYNC_REQUEST:
- result = handleSyncRequest(&pkt.p.sync_request, srcAddr);
- break;
-
- case TIME_PACKET_SYNC_RESPONSE:
- result = handleSyncResponse(&pkt.p.sync_response, srcAddr);
- break;
-
- case TIME_PACKET_MASTER_ANNOUNCEMENT:
- result = handleMasterAnnouncement(&pkt.p.master_announcement,
- srcAddr);
- break;
-
- default: {
- char srcEPStr[64];
- sockaddrToString(srcAddr, true, srcEPStr, sizeof(srcEPStr));
-
- mBadPktLog.log(ANDROID_LOG_WARN, LOG_TAG,
- "unknown packet type (%d) from %s",
- pkt.packetType, srcEPStr);
-
- result = false;
- } break;
- }
-
- return result;
-}
-
-bool CommonTimeServer::handleTimeout() {
- // If we have no socket, then this must be a timeout to retry socket setup.
- if (mSocket < 0)
- return true;
-
- switch (mState) {
- case ICommonClock::STATE_INITIAL:
- return handleTimeoutInitial();
- case ICommonClock::STATE_CLIENT:
- return handleTimeoutClient();
- case ICommonClock::STATE_MASTER:
- return handleTimeoutMaster();
- case ICommonClock::STATE_RONIN:
- return handleTimeoutRonin();
- case ICommonClock::STATE_WAIT_FOR_ELECTION:
- return handleTimeoutWaitForElection();
- }
-
- return false;
-}
-
-bool CommonTimeServer::handleTimeoutInitial() {
- if (++mInitial_WhoIsMasterRequestTimeouts ==
- kInitial_NumWhoIsMasterRetries) {
- // none of our attempts to discover a master succeeded, so make
- // this device the master
- return becomeMaster("initial timeout");
- } else {
- // retry the WhoIsMaster request
- return sendWhoIsMasterRequest();
- }
-}
-
-bool CommonTimeServer::handleTimeoutClient() {
- if (shouldPanicNotGettingGoodData())
- return becomeInitial("timeout panic, no good data");
-
- if (mClient_SyncRequestPending) {
- mClient_SyncRequestPending = false;
-
- if (++mClient_SyncRequestTimeouts < kClient_NumSyncRequestRetries) {
- // a sync request has timed out, so retry
- return sendSyncRequest();
- } else {
- // The master has failed to respond to a sync request for too many
- // times in a row. Assume the master is dead and start electing
- // a new master.
- return becomeRonin("master not responding");
- }
- } else {
- // initiate the next sync request
- return sendSyncRequest();
- }
-}
-
-bool CommonTimeServer::handleTimeoutMaster() {
- // send another announcement from the master
- return sendMasterAnnouncement();
-}
-
-bool CommonTimeServer::handleTimeoutRonin() {
- if (++mRonin_WhoIsMasterRequestTimeouts == kRonin_NumWhoIsMasterRetries) {
- // no other master is out there, so we won the election
- return becomeMaster("no better masters detected");
- } else {
- return sendWhoIsMasterRequest();
- }
-}
-
-bool CommonTimeServer::handleTimeoutWaitForElection() {
- return becomeRonin("timeout waiting for election conclusion");
-}
-
-bool CommonTimeServer::handleWhoIsMasterRequest(
- const WhoIsMasterRequestPacket* request,
- const sockaddr_storage& srcAddr) {
- // Skip our own messages which come back via broadcast loopback.
- if (request->senderDeviceID == mDeviceID)
- return true;
-
- char srcEPStr[64];
- sockaddrToString(srcAddr, true, srcEPStr, sizeof(srcEPStr));
- mElectionLog.log("RXed WhoIs master request while in state %s. "
- "src %s reqTID %016llx ourTID %016llx",
- stateToString(mState), srcEPStr,
- request->timelineID, mTimelineID);
-
- if (mState == ICommonClock::STATE_MASTER) {
- // is this request related to this master's timeline?
- if (request->timelineID != ICommonClock::kInvalidTimelineID &&
- request->timelineID != mTimelineID)
- return true;
-
- WhoIsMasterResponsePacket pkt;
- pkt.initHeader(mTimelineID, mSyncGroupID);
- pkt.deviceID = mDeviceID;
- pkt.devicePriority = effectivePriority();
-
- mElectionLog.log("TXing WhoIs master resp to %s while in state %s. "
- "ourTID %016llx ourGID %016llx ourDID %016llx "
- "ourPrio %u",
- srcEPStr, stateToString(mState),
- mTimelineID, mSyncGroupID,
- pkt.deviceID, pkt.devicePriority);
-
- uint8_t buf[256];
- ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
- if (bufSz < 0)
- return false;
-
- ssize_t sendBytes = sendto(
- mSocket, buf, bufSz, 0,
- reinterpret_cast<const sockaddr *>(&srcAddr),
- sizeof(srcAddr));
- if (sendBytes == -1) {
- ALOGE("%s:%d sendto failed", __PRETTY_FUNCTION__, __LINE__);
- return false;
- }
- } else if (mState == ICommonClock::STATE_RONIN) {
- // if we hear a WhoIsMaster request from another device following
- // the same timeline and that device wins arbitration, then we will stop
- // trying to elect ourselves master and will instead wait for an
- // announcement from the election winner
- if (request->timelineID != mTimelineID)
- return true;
-
- if (arbitrateMaster(request->senderDeviceID,
- request->senderDevicePriority,
- mDeviceID,
- effectivePriority()))
- return becomeWaitForElection("would lose election");
-
- return true;
- } else if (mState == ICommonClock::STATE_INITIAL) {
- // If a group of devices booted simultaneously (e.g. after a power
- // outage) and all of them are in the initial state and there is no
- // master, then each device may time out and declare itself master at
- // the same time. To avoid this, listen for
- // WhoIsMaster(InvalidTimeline) requests from peers. If we would lose
- // arbitration against that peer, reset our timeout count so that the
- // peer has a chance to become master before we time out.
- if (request->timelineID == ICommonClock::kInvalidTimelineID &&
- arbitrateMaster(request->senderDeviceID,
- request->senderDevicePriority,
- mDeviceID,
- effectivePriority())) {
- mInitial_WhoIsMasterRequestTimeouts = 0;
- }
- }
-
- return true;
-}
-
-bool CommonTimeServer::handleWhoIsMasterResponse(
- const WhoIsMasterResponsePacket* response,
- const sockaddr_storage& srcAddr) {
- // Skip our own messages which come back via broadcast loopback.
- if (response->deviceID == mDeviceID)
- return true;
-
- char srcEPStr[64];
- sockaddrToString(srcAddr, true, srcEPStr, sizeof(srcEPStr));
- mElectionLog.log("RXed WhoIs master response while in state %s. "
- "src %s respTID %016llx respDID %016llx respPrio %u "
- "ourTID %016llx",
- stateToString(mState), srcEPStr,
- response->timelineID,
- response->deviceID,
- static_cast<uint32_t>(response->devicePriority),
- mTimelineID);
-
- if (mState == ICommonClock::STATE_INITIAL || mState == ICommonClock::STATE_RONIN) {
- return becomeClient(srcAddr,
- response->deviceID,
- response->devicePriority,
- response->timelineID,
- "heard whois response");
- } else if (mState == ICommonClock::STATE_CLIENT) {
- // if we get multiple responses because there are multiple devices
- // who believe that they are master, then follow the master that
- // wins arbitration
- if (arbitrateMaster(response->deviceID,
- response->devicePriority,
- mClient_MasterDeviceID,
- mClient_MasterDevicePriority)) {
- return becomeClient(srcAddr,
- response->deviceID,
- response->devicePriority,
- response->timelineID,
- "heard whois response");
- }
- }
-
- return true;
-}
-
-bool CommonTimeServer::handleSyncRequest(const SyncRequestPacket* request,
- const sockaddr_storage& srcAddr) {
- SyncResponsePacket pkt;
- pkt.initHeader(mTimelineID, mSyncGroupID);
-
- if ((mState == ICommonClock::STATE_MASTER) &&
- (mTimelineID == request->timelineID)) {
- int64_t rxLocalTime = mLastPacketRxLocalTime;
- int64_t rxCommonTime;
-
- // If we are master on an actual network and have actual clients, then
- // we are no longer low priority.
- setForceLowPriority(false);
-
- if (OK != mCommonClock.localToCommon(rxLocalTime, &rxCommonTime)) {
- return false;
- }
-
- int64_t txLocalTime = mLocalClock.getLocalTime();;
- int64_t txCommonTime;
- if (OK != mCommonClock.localToCommon(txLocalTime, &txCommonTime)) {
- return false;
- }
-
- pkt.nak = 0;
- pkt.clientTxLocalTime = request->clientTxLocalTime;
- pkt.masterRxCommonTime = rxCommonTime;
- pkt.masterTxCommonTime = txCommonTime;
- } else {
- pkt.nak = 1;
- pkt.clientTxLocalTime = 0;
- pkt.masterRxCommonTime = 0;
- pkt.masterTxCommonTime = 0;
- }
-
- uint8_t buf[256];
- ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
- if (bufSz < 0)
- return false;
-
- ssize_t sendBytes = sendto(
- mSocket, &buf, bufSz, 0,
- reinterpret_cast<const sockaddr *>(&srcAddr),
- sizeof(srcAddr));
- if (sendBytes == -1) {
- ALOGE("%s:%d sendto failed", __PRETTY_FUNCTION__, __LINE__);
- return false;
- }
-
- return true;
-}
-
-bool CommonTimeServer::handleSyncResponse(
- const SyncResponsePacket* response,
- const sockaddr_storage& srcAddr) {
- if (mState != ICommonClock::STATE_CLIENT)
- return true;
-
- assert(mMasterEPValid);
- if (!sockaddrMatch(srcAddr, mMasterEP, true)) {
- char srcEP[64], expectedEP[64];
- sockaddrToString(srcAddr, true, srcEP, sizeof(srcEP));
- sockaddrToString(mMasterEP, true, expectedEP, sizeof(expectedEP));
- ALOGI("Dropping sync response from unexpected address."
- " Expected %s Got %s", expectedEP, srcEP);
- return true;
- }
-
- if (response->nak) {
- // if our master is no longer accepting requests, then we need to find
- // a new master
- return becomeRonin("master NAK'ed");
- }
-
- mClient_SyncRequestPending = 0;
- mClient_SyncRequestTimeouts = 0;
- mClient_PacketRTTLog.logRX(response->clientTxLocalTime,
- mLastPacketRxLocalTime);
-
- bool result;
- if (!(mClient_SyncRespsRXedFromCurMaster++)) {
- // the first request/response exchange between a client and a master
- // may take unusually long due to ARP, so discard it.
- result = true;
- } else {
- int64_t clientTxLocalTime = response->clientTxLocalTime;
- int64_t clientRxLocalTime = mLastPacketRxLocalTime;
- int64_t masterTxCommonTime = response->masterTxCommonTime;
- int64_t masterRxCommonTime = response->masterRxCommonTime;
-
- int64_t rtt = (clientRxLocalTime - clientTxLocalTime);
- int64_t avgLocal = (clientTxLocalTime + clientRxLocalTime) >> 1;
- int64_t avgCommon = (masterTxCommonTime + masterRxCommonTime) >> 1;
-
- // if the RTT of the packet is significantly larger than the panic
- // threshold, we should simply discard it. Its better to do nothing
- // than to take cues from a packet like that.
- int64_t rttCommon = mCommonClock.localDurationToCommonDuration(rtt);
- if (rttCommon > (static_cast<int64_t>(mPanicThresholdUsec) *
- kRTTDiscardPanicThreshMultiplier)) {
- ALOGV("Dropping sync response with RTT of %" PRId64 " uSec", rttCommon);
- mClient_ExpiredSyncRespsRXedFromCurMaster++;
- if (shouldPanicNotGettingGoodData())
- return becomeInitial("RX panic, no good data");
- return true;
- } else {
- result = mClockRecovery.pushDisciplineEvent(avgLocal, avgCommon, rttCommon);
- mClient_LastGoodSyncRX = clientRxLocalTime;
-
- if (result) {
- // indicate to listeners that we've synced to the common timeline
- notifyClockSync();
- } else {
- ALOGE("Panic! Observed clock sync error is too high to tolerate,"
- " resetting state machine and starting over.");
- notifyClockSyncLoss();
- return becomeInitial("panic");
- }
- }
- }
-
- mCurTimeout.setTimeout(mSyncRequestIntervalMs);
- return result;
-}
-
-bool CommonTimeServer::handleMasterAnnouncement(
- const MasterAnnouncementPacket* packet,
- const sockaddr_storage& srcAddr) {
- uint64_t newDeviceID = packet->deviceID;
- uint8_t newDevicePrio = packet->devicePriority;
- uint64_t newTimelineID = packet->timelineID;
-
- // Skip our own messages which come back via broadcast loopback.
- if (newDeviceID == mDeviceID)
- return true;
-
- char srcEPStr[64];
- sockaddrToString(srcAddr, true, srcEPStr, sizeof(srcEPStr));
- mElectionLog.log("RXed master announcement while in state %s. "
- "src %s srcDevID %lld srcPrio %u srcTID %016llx",
- stateToString(mState), srcEPStr,
- newDeviceID, static_cast<uint32_t>(newDevicePrio),
- newTimelineID);
-
- if (mState == ICommonClock::STATE_INITIAL ||
- mState == ICommonClock::STATE_RONIN ||
- mState == ICommonClock::STATE_WAIT_FOR_ELECTION) {
- // if we aren't currently following a master, then start following
- // this new master
- return becomeClient(srcAddr,
- newDeviceID,
- newDevicePrio,
- newTimelineID,
- "heard master announcement");
- } else if (mState == ICommonClock::STATE_CLIENT) {
- // if the new master wins arbitration against our current master,
- // then become a client of the new master
- if (arbitrateMaster(newDeviceID,
- newDevicePrio,
- mClient_MasterDeviceID,
- mClient_MasterDevicePriority))
- return becomeClient(srcAddr,
- newDeviceID,
- newDevicePrio,
- newTimelineID,
- "heard master announcement");
- } else if (mState == ICommonClock::STATE_MASTER) {
- // two masters are competing - if the new one wins arbitration, then
- // cease acting as master
- if (arbitrateMaster(newDeviceID, newDevicePrio,
- mDeviceID, effectivePriority()))
- return becomeClient(srcAddr, newDeviceID,
- newDevicePrio, newTimelineID,
- "heard master announcement");
- }
-
- return true;
-}
-
-bool CommonTimeServer::sendWhoIsMasterRequest() {
- assert(mState == ICommonClock::STATE_INITIAL || mState == ICommonClock::STATE_RONIN);
-
- // If we have no socket, then we must be in the unconfigured initial state.
- // Don't report any errors, just don't try to send the initial who-is-master
- // query. Eventually, our network will either become configured, or we will
- // be forced into network-less master mode by higher level code.
- if (mSocket < 0) {
- assert(mState == ICommonClock::STATE_INITIAL);
- return true;
- }
-
- bool ret = false;
- WhoIsMasterRequestPacket pkt;
- pkt.initHeader(mSyncGroupID);
- pkt.senderDeviceID = mDeviceID;
- pkt.senderDevicePriority = effectivePriority();
-
- uint8_t buf[256];
- ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
- if (bufSz >= 0) {
- char dstEPStr[64];
- sockaddrToString(mMasterElectionEP, true, dstEPStr, sizeof(dstEPStr));
- mElectionLog.log("TXing WhoIs master request to %s while in state %s. "
- "ourTID %016llx ourGID %016llx ourDID %016llx "
- "ourPrio %u",
- dstEPStr, stateToString(mState),
- mTimelineID, mSyncGroupID,
- pkt.senderDeviceID, pkt.senderDevicePriority);
-
- ssize_t sendBytes = sendto(
- mSocket, buf, bufSz, 0,
- reinterpret_cast<const sockaddr *>(&mMasterElectionEP),
- sizeof(mMasterElectionEP));
- if (sendBytes < 0)
- ALOGE("WhoIsMaster sendto failed (errno %d)", errno);
- ret = true;
- }
-
- if (mState == ICommonClock::STATE_INITIAL) {
- mCurTimeout.setTimeout(kInitial_WhoIsMasterTimeoutMs);
- } else {
- mCurTimeout.setTimeout(kRonin_WhoIsMasterTimeoutMs);
- }
-
- return ret;
-}
-
-bool CommonTimeServer::sendSyncRequest() {
- // If we are sending sync requests, then we must be in the client state and
- // we must have a socket (when we have no network, we are only supposed to
- // be in INITIAL or MASTER)
- assert(mState == ICommonClock::STATE_CLIENT);
- assert(mSocket >= 0);
-
- bool ret = false;
- SyncRequestPacket pkt;
- pkt.initHeader(mTimelineID, mSyncGroupID);
- pkt.clientTxLocalTime = mLocalClock.getLocalTime();
-
- if (!mClient_FirstSyncTX)
- mClient_FirstSyncTX = pkt.clientTxLocalTime;
-
- mClient_PacketRTTLog.logTX(pkt.clientTxLocalTime);
-
- uint8_t buf[256];
- ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
- if (bufSz >= 0) {
- ssize_t sendBytes = sendto(
- mSocket, buf, bufSz, 0,
- reinterpret_cast<const sockaddr *>(&mMasterEP),
- sizeof(mMasterEP));
- if (sendBytes < 0)
- ALOGE("SyncRequest sendto failed (errno %d)", errno);
- ret = true;
- }
-
- mClient_SyncsSentToCurMaster++;
- mCurTimeout.setTimeout(mSyncRequestIntervalMs);
- mClient_SyncRequestPending = true;
-
- return ret;
-}
-
-bool CommonTimeServer::sendMasterAnnouncement() {
- bool ret = false;
- assert(mState == ICommonClock::STATE_MASTER);
-
- // If we are being asked to send a master announcement, but we have no
- // socket, we must be in network-less master mode. Don't bother to send the
- // announcement, and don't bother to schedule a timeout. When the network
- // comes up, the work thread will get poked and start the process of
- // figuring out who the current master should be.
- if (mSocket < 0) {
- mCurTimeout.setTimeout(kInfiniteTimeout);
- return true;
- }
-
- MasterAnnouncementPacket pkt;
- pkt.initHeader(mTimelineID, mSyncGroupID);
- pkt.deviceID = mDeviceID;
- pkt.devicePriority = effectivePriority();
-
- uint8_t buf[256];
- ssize_t bufSz = pkt.serializePacket(buf, sizeof(buf));
- if (bufSz >= 0) {
- char dstEPStr[64];
- sockaddrToString(mMasterElectionEP, true, dstEPStr, sizeof(dstEPStr));
- mElectionLog.log("TXing Master announcement to %s while in state %s. "
- "ourTID %016llx ourGID %016llx ourDID %016llx "
- "ourPrio %u",
- dstEPStr, stateToString(mState),
- mTimelineID, mSyncGroupID,
- pkt.deviceID, pkt.devicePriority);
-
- ssize_t sendBytes = sendto(
- mSocket, buf, bufSz, 0,
- reinterpret_cast<const sockaddr *>(&mMasterElectionEP),
- sizeof(mMasterElectionEP));
- if (sendBytes < 0)
- ALOGE("MasterAnnouncement sendto failed (errno %d)", errno);
- ret = true;
- }
-
- mCurTimeout.setTimeout(mMasterAnnounceIntervalMs);
- return ret;
-}
-
-bool CommonTimeServer::becomeClient(const sockaddr_storage& masterEP,
- uint64_t masterDeviceID,
- uint8_t masterDevicePriority,
- uint64_t timelineID,
- const char* cause) {
- char newEPStr[64], oldEPStr[64];
- sockaddrToString(masterEP, true, newEPStr, sizeof(newEPStr));
- sockaddrToString(mMasterEP, mMasterEPValid, oldEPStr, sizeof(oldEPStr));
-
- mStateChangeLog.log(ANDROID_LOG_INFO, LOG_TAG,
- "%s --> CLIENT (%s) :%s"
- " OldMaster: %02x-%014llx::%016llx::%s"
- " NewMaster: %02x-%014llx::%016llx::%s",
- stateToString(mState), cause,
- (mTimelineID != timelineID) ? " (new timeline)" : "",
- mClient_MasterDevicePriority, mClient_MasterDeviceID,
- mTimelineID, oldEPStr,
- masterDevicePriority, masterDeviceID,
- timelineID, newEPStr);
-
- if (mTimelineID != timelineID) {
- // start following a new timeline
- mTimelineID = timelineID;
- mClockRecovery.reset(true, true);
- notifyClockSyncLoss();
- } else {
- // start following a new master on the existing timeline
- mClockRecovery.reset(false, true);
- }
-
- mMasterEP = masterEP;
- mMasterEPValid = true;
-
- // If we are on a real network as a client of a real master, then we should
- // no longer force low priority. If our master disappears, we should have
- // the high priority bit set during the election to replace the master
- // because this group was a real group and not a singleton created in
- // networkless mode.
- setForceLowPriority(false);
-
- mClient_MasterDeviceID = masterDeviceID;
- mClient_MasterDevicePriority = masterDevicePriority;
- resetSyncStats();
-
- setState(ICommonClock::STATE_CLIENT);
-
- // add some jitter to when the various clients send their requests
- // in order to reduce the likelihood that a group of clients overload
- // the master after receiving a master announcement
- usleep((lrand48() % 100) * 1000);
-
- return sendSyncRequest();
-}
-
-bool CommonTimeServer::becomeMaster(const char* cause) {
- uint64_t oldTimelineID = mTimelineID;
- if (mTimelineID == ICommonClock::kInvalidTimelineID) {
- // this device has not been following any existing timeline,
- // so it will create a new timeline and declare itself master
- assert(!mCommonClock.isValid());
-
- // set the common time basis
- mCommonClock.setBasis(mLocalClock.getLocalTime(), 0);
-
- // assign an arbitrary timeline iD
- assignTimelineID();
-
- // notify listeners that we've created a common timeline
- notifyClockSync();
- }
-
- mStateChangeLog.log(ANDROID_LOG_INFO, LOG_TAG,
- "%s --> MASTER (%s) : %s timeline %016llx",
- stateToString(mState), cause,
- (oldTimelineID == mTimelineID) ? "taking ownership of"
- : "creating new",
- mTimelineID);
-
- memset(&mMasterEP, 0, sizeof(mMasterEP));
- mMasterEPValid = false;
- mClient_MasterDevicePriority = effectivePriority();
- mClient_MasterDeviceID = mDeviceID;
- mClockRecovery.reset(false, true);
- resetSyncStats();
-
- setState(ICommonClock::STATE_MASTER);
- return sendMasterAnnouncement();
-}
-
-bool CommonTimeServer::becomeRonin(const char* cause) {
- // If we were the client of a given timeline, but had never received even a
- // single time sync packet, then we transition back to Initial instead of
- // Ronin. If we transition to Ronin and end up becoming the new Master, we
- // will be unable to service requests for other clients because we never
- // actually knew what time it was. By going to initial, we ensure that
- // other clients who know what time it is, but would lose master arbitration
- // in the Ronin case, will step up and become the proper new master of the
- // old timeline.
-
- char oldEPStr[64];
- sockaddrToString(mMasterEP, mMasterEPValid, oldEPStr, sizeof(oldEPStr));
- memset(&mMasterEP, 0, sizeof(mMasterEP));
- mMasterEPValid = false;
-
- if (mCommonClock.isValid()) {
- mStateChangeLog.log(ANDROID_LOG_INFO, LOG_TAG,
- "%s --> RONIN (%s) : lost track of previously valid timeline "
- "%02x-%014llx::%016llx::%s (%d TXed %d RXed %d RXExpired)",
- stateToString(mState), cause,
- mClient_MasterDevicePriority, mClient_MasterDeviceID,
- mTimelineID, oldEPStr,
- mClient_SyncsSentToCurMaster,
- mClient_SyncRespsRXedFromCurMaster,
- mClient_ExpiredSyncRespsRXedFromCurMaster);
-
- mRonin_WhoIsMasterRequestTimeouts = 0;
- setState(ICommonClock::STATE_RONIN);
- return sendWhoIsMasterRequest();
- } else {
- mStateChangeLog.log(ANDROID_LOG_INFO, LOG_TAG,
- "%s --> INITIAL (%s) : never synced timeline "
- "%02x-%014llx::%016llx::%s (%d TXed %d RXed %d RXExpired)",
- stateToString(mState), cause,
- mClient_MasterDevicePriority, mClient_MasterDeviceID,
- mTimelineID, oldEPStr,
- mClient_SyncsSentToCurMaster,
- mClient_SyncRespsRXedFromCurMaster,
- mClient_ExpiredSyncRespsRXedFromCurMaster);
-
- return becomeInitial("ronin, no timeline");
- }
-}
-
-bool CommonTimeServer::becomeWaitForElection(const char* cause) {
- mStateChangeLog.log(ANDROID_LOG_INFO, LOG_TAG,
- "%s --> WAIT_FOR_ELECTION (%s) : dropping out of election,"
- " waiting %d mSec for completion.",
- stateToString(mState), cause, kWaitForElection_TimeoutMs);
-
- setState(ICommonClock::STATE_WAIT_FOR_ELECTION);
- mCurTimeout.setTimeout(kWaitForElection_TimeoutMs);
- return true;
-}
-
-bool CommonTimeServer::becomeInitial(const char* cause) {
- mStateChangeLog.log(ANDROID_LOG_INFO, LOG_TAG,
- "Entering INITIAL (%s), total reset.",
- cause);
-
- setState(ICommonClock::STATE_INITIAL);
-
- // reset clock recovery
- mClockRecovery.reset(true, true);
-
- // reset internal state bookkeeping.
- mCurTimeout.setTimeout(kInfiniteTimeout);
- memset(&mMasterEP, 0, sizeof(mMasterEP));
- mMasterEPValid = false;
- mLastPacketRxLocalTime = 0;
- mTimelineID = ICommonClock::kInvalidTimelineID;
- mClockSynced = false;
- mInitial_WhoIsMasterRequestTimeouts = 0;
- mClient_MasterDeviceID = 0;
- mClient_MasterDevicePriority = 0;
- mRonin_WhoIsMasterRequestTimeouts = 0;
- resetSyncStats();
-
- // send the first request to discover the master
- return sendWhoIsMasterRequest();
-}
-
-void CommonTimeServer::notifyClockSync() {
- if (!mClockSynced) {
- mClockSynced = true;
- mICommonClock->notifyOnTimelineChanged(mTimelineID);
- }
-}
-
-void CommonTimeServer::notifyClockSyncLoss() {
- if (mClockSynced) {
- mClockSynced = false;
- mICommonClock->notifyOnTimelineChanged(
- ICommonClock::kInvalidTimelineID);
- }
-}
-
-void CommonTimeServer::setState(ICommonClock::State s) {
- mState = s;
-}
-
-const char* CommonTimeServer::stateToString(ICommonClock::State s) {
- switch(s) {
- case ICommonClock::STATE_INITIAL:
- return "INITIAL";
- case ICommonClock::STATE_CLIENT:
- return "CLIENT";
- case ICommonClock::STATE_MASTER:
- return "MASTER";
- case ICommonClock::STATE_RONIN:
- return "RONIN";
- case ICommonClock::STATE_WAIT_FOR_ELECTION:
- return "WAIT_FOR_ELECTION";
- default:
- return "unknown";
- }
-}
-
-void CommonTimeServer::sockaddrToString(const sockaddr_storage& addr,
- bool addrValid,
- char* buf, size_t bufLen) {
- if (!bufLen || !buf)
- return;
-
- if (addrValid) {
- switch (addr.ss_family) {
- case AF_INET: {
- const struct sockaddr_in* sa =
- reinterpret_cast<const struct sockaddr_in*>(&addr);
- unsigned long a = ntohl(sa->sin_addr.s_addr);
- uint16_t p = ntohs(sa->sin_port);
- snprintf(buf, bufLen, "%lu.%lu.%lu.%lu:%hu",
- ((a >> 24) & 0xFF), ((a >> 16) & 0xFF),
- ((a >> 8) & 0xFF), (a & 0xFF), p);
- } break;
-
- case AF_INET6: {
- const struct sockaddr_in6* sa =
- reinterpret_cast<const struct sockaddr_in6*>(&addr);
- const uint8_t* a = sa->sin6_addr.s6_addr;
- uint16_t p = ntohs(sa->sin6_port);
- snprintf(buf, bufLen,
- "%02X%02X:%02X%02X:%02X%02X:%02X%02X:"
- "%02X%02X:%02X%02X:%02X%02X:%02X%02X port %hd",
- a[0], a[1], a[ 2], a[ 3], a[ 4], a[ 5], a[ 6], a[ 7],
- a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15],
- p);
- } break;
-
- default:
- snprintf(buf, bufLen,
- "<unknown sockaddr family %d>", addr.ss_family);
- break;
- }
- } else {
- snprintf(buf, bufLen, "<none>");
- }
-
- buf[bufLen - 1] = 0;
-}
-
-bool CommonTimeServer::sockaddrMatch(const sockaddr_storage& a1,
- const sockaddr_storage& a2,
- bool matchAddressOnly) {
- if (a1.ss_family != a2.ss_family)
- return false;
-
- switch (a1.ss_family) {
- case AF_INET: {
- const struct sockaddr_in* sa1 =
- reinterpret_cast<const struct sockaddr_in*>(&a1);
- const struct sockaddr_in* sa2 =
- reinterpret_cast<const struct sockaddr_in*>(&a2);
-
- if (sa1->sin_addr.s_addr != sa2->sin_addr.s_addr)
- return false;
-
- return (matchAddressOnly || (sa1->sin_port == sa2->sin_port));
- } break;
-
- case AF_INET6: {
- const struct sockaddr_in6* sa1 =
- reinterpret_cast<const struct sockaddr_in6*>(&a1);
- const struct sockaddr_in6* sa2 =
- reinterpret_cast<const struct sockaddr_in6*>(&a2);
-
- if (memcmp(&sa1->sin6_addr, &sa2->sin6_addr, sizeof(sa2->sin6_addr)))
- return false;
-
- return (matchAddressOnly || (sa1->sin6_port == sa2->sin6_port));
- } break;
-
- // Huh? We don't deal in non-IPv[46] addresses. Not sure how we got
- // here, but we don't know how to comapre these addresses and simply
- // default to a no-match decision.
- default: return false;
- }
-}
-
-bool CommonTimeServer::shouldPanicNotGettingGoodData() {
- if (mClient_FirstSyncTX) {
- int64_t now = mLocalClock.getLocalTime();
- int64_t delta = now - (mClient_LastGoodSyncRX
- ? mClient_LastGoodSyncRX
- : mClient_FirstSyncTX);
- int64_t deltaUsec = mCommonClock.localDurationToCommonDuration(delta);
-
- if (deltaUsec >= kNoGoodDataPanicThresholdUsec)
- return true;
- }
-
- return false;
-}
-
-void CommonTimeServer::PacketRTTLog::logTX(int64_t txTime) {
- txTimes[wrPtr] = txTime;
- rxTimes[wrPtr] = 0;
- wrPtr = (wrPtr + 1) % RTT_LOG_SIZE;
- if (!wrPtr)
- logFull = true;
-}
-
-void CommonTimeServer::PacketRTTLog::logRX(int64_t txTime, int64_t rxTime) {
- if (!logFull && !wrPtr)
- return;
-
- uint32_t i = logFull ? wrPtr : 0;
- do {
- if (txTimes[i] == txTime) {
- rxTimes[i] = rxTime;
- break;
- }
- i = (i + 1) % RTT_LOG_SIZE;
- } while (i != wrPtr);
-}
-
-} // namespace android
diff --git a/libs/common_time/common_time_server.h b/libs/common_time/common_time_server.h
deleted file mode 100644
index 6e1805086978..000000000000
--- a/libs/common_time/common_time_server.h
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_COMMON_TIME_SERVER_H
-#define ANDROID_COMMON_TIME_SERVER_H
-
-#include <arpa/inet.h>
-#include <stdint.h>
-#include <sys/socket.h>
-
-#include <common_time/ICommonClock.h>
-#include <common_time/local_clock.h>
-#include <utils/String8.h>
-
-#include "clock_recovery.h"
-#include "common_clock.h"
-#include "common_time_server_packets.h"
-#include "utils.h"
-
-#define RTT_LOG_SIZE 30
-
-namespace android {
-
-class CommonClockService;
-class CommonTimeConfigService;
-
-/***** time service implementation *****/
-
-class CommonTimeServer : public Thread {
- public:
- CommonTimeServer();
- ~CommonTimeServer();
-
- bool startServices();
-
- // Common Clock API methods
- CommonClock& getCommonClock() { return mCommonClock; }
- LocalClock& getLocalClock() { return mLocalClock; }
- uint64_t getTimelineID();
- int32_t getEstimatedError();
- ICommonClock::State getState();
- status_t getMasterAddr(struct sockaddr_storage* addr);
- status_t isCommonTimeValid(bool* valid, uint32_t* timelineID);
-
- // Config API methods
- status_t getMasterElectionPriority(uint8_t *priority);
- status_t setMasterElectionPriority(uint8_t priority);
- status_t getMasterElectionEndpoint(struct sockaddr_storage *addr);
- status_t setMasterElectionEndpoint(const struct sockaddr_storage *addr);
- status_t getMasterElectionGroupId(uint64_t *id);
- status_t setMasterElectionGroupId(uint64_t id);
- status_t getInterfaceBinding(String8& ifaceName);
- status_t setInterfaceBinding(const String8& ifaceName);
- status_t getMasterAnnounceInterval(int *interval);
- status_t setMasterAnnounceInterval(int interval);
- status_t getClientSyncInterval(int *interval);
- status_t setClientSyncInterval(int interval);
- status_t getPanicThreshold(int *threshold);
- status_t setPanicThreshold(int threshold);
- status_t getAutoDisable(bool *autoDisable);
- status_t setAutoDisable(bool autoDisable);
- status_t forceNetworklessMasterMode();
-
- // Method used by the CommonClockService to notify the core service about
- // changes in the number of active common clock clients.
- void reevaluateAutoDisableState(bool commonClockHasClients);
-
- status_t dumpClockInterface(int fd, const Vector<String16>& args,
- size_t activeClients);
- status_t dumpConfigInterface(int fd, const Vector<String16>& args);
-
- private:
- class PacketRTTLog {
- public:
- PacketRTTLog() {
- resetLog();
- }
-
- void resetLog() {
- wrPtr = 0;
- logFull = 0;
- }
-
- void logTX(int64_t txTime);
- void logRX(int64_t txTime, int64_t rxTime);
- void dumpLog(int fd, const CommonClock& cclk);
-
- private:
- uint32_t wrPtr;
- bool logFull;
- int64_t txTimes[RTT_LOG_SIZE];
- int64_t rxTimes[RTT_LOG_SIZE];
- };
-
- bool threadLoop();
-
- bool runStateMachine_l();
- bool setupSocket_l();
-
- void assignTimelineID();
- bool assignDeviceID();
-
- static bool arbitrateMaster(uint64_t deviceID1, uint8_t devicePrio1,
- uint64_t deviceID2, uint8_t devicePrio2);
-
- bool handlePacket();
- bool handleWhoIsMasterRequest (const WhoIsMasterRequestPacket* request,
- const sockaddr_storage& srcAddr);
- bool handleWhoIsMasterResponse(const WhoIsMasterResponsePacket* response,
- const sockaddr_storage& srcAddr);
- bool handleSyncRequest (const SyncRequestPacket* request,
- const sockaddr_storage& srcAddr);
- bool handleSyncResponse (const SyncResponsePacket* response,
- const sockaddr_storage& srcAddr);
- bool handleMasterAnnouncement (const MasterAnnouncementPacket* packet,
- const sockaddr_storage& srcAddr);
-
- bool handleTimeout();
- bool handleTimeoutInitial();
- bool handleTimeoutClient();
- bool handleTimeoutMaster();
- bool handleTimeoutRonin();
- bool handleTimeoutWaitForElection();
-
- bool sendWhoIsMasterRequest();
- bool sendSyncRequest();
- bool sendMasterAnnouncement();
-
- bool becomeClient(const sockaddr_storage& masterAddr,
- uint64_t masterDeviceID,
- uint8_t masterDevicePriority,
- uint64_t timelineID,
- const char* cause);
- bool becomeMaster(const char* cause);
- bool becomeRonin(const char* cause);
- bool becomeWaitForElection(const char* cause);
- bool becomeInitial(const char* cause);
-
- void notifyClockSync();
- void notifyClockSyncLoss();
-
- ICommonClock::State mState;
- void setState(ICommonClock::State s);
-
- void clearPendingWakeupEvents_l();
- void wakeupThread_l();
- void cleanupSocket_l();
- void shutdownThread();
-
- inline uint8_t effectivePriority() const {
- return (mMasterPriority & 0x7F) |
- (mForceLowPriority ? 0x00 : 0x80);
- }
-
- inline bool shouldAutoDisable() const {
- return (mAutoDisable && !mCommonClockHasClients);
- }
-
- inline void resetSyncStats() {
- mClient_SyncRequestPending = false;
- mClient_SyncRequestTimeouts = 0;
- mClient_SyncsSentToCurMaster = 0;
- mClient_SyncRespsRXedFromCurMaster = 0;
- mClient_ExpiredSyncRespsRXedFromCurMaster = 0;
- mClient_FirstSyncTX = 0;
- mClient_LastGoodSyncRX = 0;
- mClient_PacketRTTLog.resetLog();
- }
-
- bool shouldPanicNotGettingGoodData();
-
- // Helper to keep track of the state machine's current timeout
- Timeout mCurTimeout;
-
- // common clock, local clock abstraction, and clock recovery loop
- CommonClock mCommonClock;
- LocalClock mLocalClock;
- ClockRecoveryLoop mClockRecovery;
-
- // implementation of ICommonClock
- sp<CommonClockService> mICommonClock;
-
- // implementation of ICommonTimeConfig
- sp<CommonTimeConfigService> mICommonTimeConfig;
-
- // UDP socket for the time sync protocol
- int mSocket;
-
- // eventfd used to wakeup the work thread in response to configuration
- // changes.
- int mWakeupThreadFD;
-
- // timestamp captured when a packet is received
- int64_t mLastPacketRxLocalTime;
-
- // ID of the timeline that this device is following
- uint64_t mTimelineID;
-
- // flag for whether the clock has been synced to a timeline
- bool mClockSynced;
-
- // flag used to indicate that clients should be considered to be lower
- // priority than all of their peers during elections. This flag is set and
- // cleared by the state machine. It is set when the client joins a new
- // network. If the client had been a master in the old network (or an
- // isolated master with no network connectivity) it should defer to any
- // masters which may already be on the network. It will be cleared whenever
- // the state machine transitions to the master state.
- bool mForceLowPriority;
- inline void setForceLowPriority(bool val) {
- mForceLowPriority = val;
- if (mState == ICommonClock::STATE_MASTER)
- mClient_MasterDevicePriority = effectivePriority();
- }
-
- // Lock to synchronize access to internal state and configuration.
- Mutex mLock;
-
- // Flag updated by the common clock service to indicate that it does or does
- // not currently have registered clients. When the the auto disable flag is
- // cleared on the common time service, the service will participate in
- // network synchronization whenever it has a valid network interface to bind
- // to. When the auto disable flag is set on the common time service, it
- // will only participate in network synchronization when it has both a valid
- // interface AND currently active common clock clients.
- bool mCommonClockHasClients;
-
- // Internal logs used for dumpsys.
- LogRing mStateChangeLog;
- LogRing mElectionLog;
- LogRing mBadPktLog;
-
- // Configuration info
- struct sockaddr_storage mMasterElectionEP; // Endpoint over which we conduct master election
- String8 mBindIface; // Endpoint for the service to bind to.
- bool mBindIfaceValid; // whether or not the bind Iface is valid.
- bool mBindIfaceDirty; // whether or not the bind Iface is valid.
- struct sockaddr_storage mMasterEP; // Endpoint of our current master (if any)
- bool mMasterEPValid;
- uint64_t mDeviceID; // unique ID of this device
- uint64_t mSyncGroupID; // synchronization group ID of this device.
- uint8_t mMasterPriority; // Priority of this device in master election.
- uint32_t mMasterAnnounceIntervalMs;
- uint32_t mSyncRequestIntervalMs;
- uint32_t mPanicThresholdUsec;
- bool mAutoDisable;
-
- // Config defaults.
- static const char* kDefaultMasterElectionAddr;
- static const uint16_t kDefaultMasterElectionPort;
- static const uint64_t kDefaultSyncGroupID;
- static const uint8_t kDefaultMasterPriority;
- static const uint32_t kDefaultMasterAnnounceIntervalMs;
- static const uint32_t kDefaultSyncRequestIntervalMs;
- static const uint32_t kDefaultPanicThresholdUsec;
- static const bool kDefaultAutoDisable;
-
- // Priority mask and shift fields.
- static const uint64_t kDeviceIDMask;
- static const uint8_t kDevicePriorityMask;
- static const uint8_t kDevicePriorityHiLowBit;
- static const uint32_t kDevicePriorityShift;
-
- // Unconfgurable constants
- static const int kSetupRetryTimeoutMs;
- static const int64_t kNoGoodDataPanicThresholdUsec;
- static const uint32_t kRTTDiscardPanicThreshMultiplier;
-
- /*** status while in the Initial state ***/
- int mInitial_WhoIsMasterRequestTimeouts;
- static const int kInitial_NumWhoIsMasterRetries;
- static const int kInitial_WhoIsMasterTimeoutMs;
-
- /*** status while in the Client state ***/
- uint64_t mClient_MasterDeviceID;
- uint8_t mClient_MasterDevicePriority;
- bool mClient_SyncRequestPending;
- int mClient_SyncRequestTimeouts;
- uint32_t mClient_SyncsSentToCurMaster;
- uint32_t mClient_SyncRespsRXedFromCurMaster;
- uint32_t mClient_ExpiredSyncRespsRXedFromCurMaster;
- int64_t mClient_FirstSyncTX;
- int64_t mClient_LastGoodSyncRX;
- PacketRTTLog mClient_PacketRTTLog;
- static const int kClient_NumSyncRequestRetries;
-
-
- /*** status while in the Master state ***/
- static const uint32_t kDefaultMaster_AnnouncementIntervalMs;
-
- /*** status while in the Ronin state ***/
- int mRonin_WhoIsMasterRequestTimeouts;
- static const int kRonin_NumWhoIsMasterRetries;
- static const int kRonin_WhoIsMasterTimeoutMs;
-
- /*** status while in the WaitForElection state ***/
- static const int kWaitForElection_TimeoutMs;
-
- static const int kInfiniteTimeout;
-
- static const char* stateToString(ICommonClock::State s);
- static void sockaddrToString(const sockaddr_storage& addr, bool addrValid,
- char* buf, size_t bufLen);
- static bool sockaddrMatch(const sockaddr_storage& a1,
- const sockaddr_storage& a2,
- bool matchAddressOnly);
-};
-
-} // namespace android
-
-#endif // ANDROID_COMMON_TIME_SERVER_H
diff --git a/libs/common_time/common_time_server_api.cpp b/libs/common_time/common_time_server_api.cpp
deleted file mode 100644
index 60e65677b2f9..000000000000
--- a/libs/common_time/common_time_server_api.cpp
+++ /dev/null
@@ -1,440 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/*
- * A service that exchanges time synchronization information between
- * a master that defines a timeline and clients that follow the timeline.
- */
-
-#define LOG_TAG "common_time"
-#include <utils/Log.h>
-
-#include <binder/IServiceManager.h>
-#include <binder/IPCThreadState.h>
-
-#include "common_time_server.h"
-
-#include <inttypes.h>
-
-namespace android {
-
-//
-// Clock API
-//
-uint64_t CommonTimeServer::getTimelineID() {
- AutoMutex _lock(&mLock);
- return mTimelineID;
-}
-
-ICommonClock::State CommonTimeServer::getState() {
- AutoMutex _lock(&mLock);
- return mState;
-}
-
-status_t CommonTimeServer::getMasterAddr(struct sockaddr_storage* addr) {
- AutoMutex _lock(&mLock);
- if (mMasterEPValid) {
- memcpy(addr, &mMasterEP, sizeof(*addr));
- return OK;
- }
-
- return UNKNOWN_ERROR;
-}
-
-int32_t CommonTimeServer::getEstimatedError() {
- AutoMutex _lock(&mLock);
-
- if (ICommonClock::STATE_MASTER == mState)
- return 0;
-
- if (!mClockSynced)
- return ICommonClock::kErrorEstimateUnknown;
-
- return mClockRecovery.getLastErrorEstimate();
-}
-
-status_t CommonTimeServer::isCommonTimeValid(bool* valid,
- uint32_t* timelineID) {
- AutoMutex _lock(&mLock);
- *valid = mCommonClock.isValid();
- *timelineID = mTimelineID;
- return OK;
-}
-
-//
-// Config API
-//
-status_t CommonTimeServer::getMasterElectionPriority(uint8_t *priority) {
- AutoMutex _lock(&mLock);
- *priority = mMasterPriority;
- return OK;
-}
-
-status_t CommonTimeServer::setMasterElectionPriority(uint8_t priority) {
- AutoMutex _lock(&mLock);
-
- if (priority > 0x7F)
- return BAD_VALUE;
-
- mMasterPriority = priority;
- return OK;
-}
-
-status_t CommonTimeServer::getMasterElectionEndpoint(
- struct sockaddr_storage *addr) {
- AutoMutex _lock(&mLock);
- memcpy(addr, &mMasterElectionEP, sizeof(*addr));
- return OK;
-}
-
-status_t CommonTimeServer::setMasterElectionEndpoint(
- const struct sockaddr_storage *addr) {
- AutoMutex _lock(&mLock);
-
- if (!addr)
- return BAD_VALUE;
-
- // TODO: add proper support for IPv6
- if (addr->ss_family != AF_INET)
- return BAD_VALUE;
-
- // Only multicast and broadcast endpoints with explicit ports are allowed.
- uint16_t ipv4Port = ntohs(
- reinterpret_cast<const struct sockaddr_in*>(addr)->sin_port);
- if (!ipv4Port)
- return BAD_VALUE;
-
- uint32_t ipv4Addr = ntohl(
- reinterpret_cast<const struct sockaddr_in*>(addr)->sin_addr.s_addr);
- if ((ipv4Addr != 0xFFFFFFFF) && (0xE0000000 != (ipv4Addr & 0xF0000000)))
- return BAD_VALUE;
-
- memcpy(&mMasterElectionEP, addr, sizeof(mMasterElectionEP));
-
- // Force a rebind in order to change election enpoints.
- mBindIfaceDirty = true;
- wakeupThread_l();
- return OK;
-}
-
-status_t CommonTimeServer::getMasterElectionGroupId(uint64_t *id) {
- AutoMutex _lock(&mLock);
- *id = mSyncGroupID;
- return OK;
-}
-
-status_t CommonTimeServer::setMasterElectionGroupId(uint64_t id) {
- AutoMutex _lock(&mLock);
- mSyncGroupID = id;
- return OK;
-}
-
-status_t CommonTimeServer::getInterfaceBinding(String8& ifaceName) {
- AutoMutex _lock(&mLock);
- if (!mBindIfaceValid)
- return INVALID_OPERATION;
- ifaceName = mBindIface;
- return OK;
-}
-
-status_t CommonTimeServer::setInterfaceBinding(const String8& ifaceName) {
- AutoMutex _lock(&mLock);
-
- mBindIfaceDirty = true;
- if (ifaceName.size()) {
- mBindIfaceValid = true;
- mBindIface = ifaceName;
- } else {
- mBindIfaceValid = false;
- mBindIface.clear();
- }
-
- wakeupThread_l();
- return OK;
-}
-
-status_t CommonTimeServer::getMasterAnnounceInterval(int *interval) {
- AutoMutex _lock(&mLock);
- *interval = mMasterAnnounceIntervalMs;
- return OK;
-}
-
-status_t CommonTimeServer::setMasterAnnounceInterval(int interval) {
- AutoMutex _lock(&mLock);
-
- if (interval > (6 *3600000)) // Max interval is once every 6 hrs
- return BAD_VALUE;
-
- if (interval < 500) // Min interval is once per 0.5 seconds
- return BAD_VALUE;
-
- mMasterAnnounceIntervalMs = interval;
- if (ICommonClock::STATE_MASTER == mState) {
- int pendingTimeout = mCurTimeout.msecTillTimeout();
- if ((kInfiniteTimeout == pendingTimeout) ||
- (pendingTimeout > interval)) {
- mCurTimeout.setTimeout(mMasterAnnounceIntervalMs);
- wakeupThread_l();
- }
- }
-
- return OK;
-}
-
-status_t CommonTimeServer::getClientSyncInterval(int *interval) {
- AutoMutex _lock(&mLock);
- *interval = mSyncRequestIntervalMs;
- return OK;
-}
-
-status_t CommonTimeServer::setClientSyncInterval(int interval) {
- AutoMutex _lock(&mLock);
-
- if (interval > (3600000)) // Max interval is once every 60 min
- return BAD_VALUE;
-
- if (interval < 250) // Min interval is once per 0.25 seconds
- return BAD_VALUE;
-
- mSyncRequestIntervalMs = interval;
- if (ICommonClock::STATE_CLIENT == mState) {
- int pendingTimeout = mCurTimeout.msecTillTimeout();
- if ((kInfiniteTimeout == pendingTimeout) ||
- (pendingTimeout > interval)) {
- mCurTimeout.setTimeout(mSyncRequestIntervalMs);
- wakeupThread_l();
- }
- }
-
- return OK;
-}
-
-status_t CommonTimeServer::getPanicThreshold(int *threshold) {
- AutoMutex _lock(&mLock);
- *threshold = mPanicThresholdUsec;
- return OK;
-}
-
-status_t CommonTimeServer::setPanicThreshold(int threshold) {
- AutoMutex _lock(&mLock);
-
- if (threshold < 1000) // Min threshold is 1mSec
- return BAD_VALUE;
-
- mPanicThresholdUsec = threshold;
- return OK;
-}
-
-status_t CommonTimeServer::getAutoDisable(bool *autoDisable) {
- AutoMutex _lock(&mLock);
- *autoDisable = mAutoDisable;
- return OK;
-}
-
-status_t CommonTimeServer::setAutoDisable(bool autoDisable) {
- AutoMutex _lock(&mLock);
- mAutoDisable = autoDisable;
- wakeupThread_l();
- return OK;
-}
-
-status_t CommonTimeServer::forceNetworklessMasterMode() {
- AutoMutex _lock(&mLock);
-
- // Can't force networkless master mode if we are currently bound to a
- // network.
- if (mSocket >= 0)
- return INVALID_OPERATION;
-
- becomeMaster("force networkless");
-
- return OK;
-}
-
-void CommonTimeServer::reevaluateAutoDisableState(bool commonClockHasClients) {
- AutoMutex _lock(&mLock);
- bool needWakeup = (mAutoDisable && mMasterEPValid &&
- (commonClockHasClients != mCommonClockHasClients));
-
- mCommonClockHasClients = commonClockHasClients;
-
- if (needWakeup) {
- ALOGI("Waking up service, auto-disable is engaged and service now has%s"
- " clients", mCommonClockHasClients ? "" : " no");
- wakeupThread_l();
- }
-}
-
-#define dump_printf(a, b...) do { \
- int res; \
- res = snprintf(buffer, sizeof(buffer), a, b); \
- buffer[sizeof(buffer) - 1] = 0; \
- if (res > 0) \
- write(fd, buffer, res); \
-} while (0)
-#define checked_percentage(a, b) ((0 == (b)) ? 0.0f : ((100.0f * (a)) / (b)))
-
-status_t CommonTimeServer::dumpClockInterface(int fd,
- const Vector<String16>& /* args */,
- size_t activeClients) {
- AutoMutex _lock(&mLock);
- const size_t SIZE = 256;
- char buffer[SIZE];
-
- if (checkCallingPermission(String16("android.permission.DUMP")) == false) {
- snprintf(buffer, SIZE, "Permission Denial: "
- "can't dump CommonClockService from pid=%d, uid=%d\n",
- IPCThreadState::self()->getCallingPid(),
- IPCThreadState::self()->getCallingUid());
- write(fd, buffer, strlen(buffer));
- } else {
- int64_t commonTime;
- int64_t localTime;
- bool synced;
- char maStr[64];
-
- localTime = mLocalClock.getLocalTime();
- synced = (OK == mCommonClock.localToCommon(localTime, &commonTime));
- sockaddrToString(mMasterEP, mMasterEPValid, maStr, sizeof(maStr));
-
- dump_printf("Common Clock Service Status\nLocal time : %" PRId64 "\n",
- localTime);
-
- if (synced)
- dump_printf("Common time : %" PRId64 "\n", commonTime);
- else
- dump_printf("Common time : %s\n", "not synced");
-
- dump_printf("Timeline ID : %016" PRIu64 "\n", mTimelineID);
- dump_printf("State : %s\n", stateToString(mState));
- dump_printf("Master Addr : %s\n", maStr);
-
-
- if (synced) {
- int32_t est = (ICommonClock::STATE_MASTER != mState)
- ? mClockRecovery.getLastErrorEstimate()
- : 0;
- dump_printf("Error Est. : %.3f msec\n",
- static_cast<float>(est) / 1000.0);
- } else {
- dump_printf("Error Est. : %s\n", "unknown");
- }
-
- dump_printf("Syncs TXes : %u\n", mClient_SyncsSentToCurMaster);
- dump_printf("Syncs RXes : %u (%.2f%%)\n",
- mClient_SyncRespsRXedFromCurMaster,
- checked_percentage(
- mClient_SyncRespsRXedFromCurMaster,
- mClient_SyncsSentToCurMaster));
- dump_printf("RXs Expired : %u (%.2f%%)\n",
- mClient_ExpiredSyncRespsRXedFromCurMaster,
- checked_percentage(
- mClient_ExpiredSyncRespsRXedFromCurMaster,
- mClient_SyncsSentToCurMaster));
-
- if (!mClient_LastGoodSyncRX) {
- dump_printf("Last Good RX : %s\n", "unknown");
- } else {
- int64_t localDelta, usecDelta;
- localDelta = localTime - mClient_LastGoodSyncRX;
- usecDelta = mCommonClock.localDurationToCommonDuration(localDelta);
- dump_printf("Last Good RX : %" PRId64 " uSec ago\n", usecDelta);
- }
-
- dump_printf("Active Clients : %zu\n", activeClients);
- mClient_PacketRTTLog.dumpLog(fd, mCommonClock);
- mStateChangeLog.dumpLog(fd);
- mElectionLog.dumpLog(fd);
- mBadPktLog.dumpLog(fd);
- }
-
- return NO_ERROR;
-}
-
-status_t CommonTimeServer::dumpConfigInterface(int fd,
- const Vector<String16>& /* args */) {
- AutoMutex _lock(&mLock);
- const size_t SIZE = 256;
- char buffer[SIZE];
-
- if (checkCallingPermission(String16("android.permission.DUMP")) == false) {
- snprintf(buffer, SIZE, "Permission Denial: "
- "can't dump CommonTimeConfigService from pid=%d, uid=%d\n",
- IPCThreadState::self()->getCallingPid(),
- IPCThreadState::self()->getCallingUid());
- write(fd, buffer, strlen(buffer));
- } else {
- char meStr[64];
-
- sockaddrToString(mMasterElectionEP, true, meStr, sizeof(meStr));
-
- dump_printf("Common Time Config Service Status\n"
- "Bound Interface : %s\n",
- mBindIfaceValid ? mBindIface.string() : "<unbound>");
- dump_printf("Master Election Endpoint : %s\n", meStr);
- dump_printf("Master Election Group ID : %016" PRIu64 "\n", mSyncGroupID);
- dump_printf("Master Announce Interval : %d mSec\n",
- mMasterAnnounceIntervalMs);
- dump_printf("Client Sync Interval : %d mSec\n",
- mSyncRequestIntervalMs);
- dump_printf("Panic Threshold : %d uSec\n",
- mPanicThresholdUsec);
- dump_printf("Base ME Prio : 0x%02x\n",
- static_cast<uint32_t>(mMasterPriority));
- dump_printf("Effective ME Prio : 0x%02x\n",
- static_cast<uint32_t>(effectivePriority()));
- dump_printf("Auto Disable Allowed : %s\n",
- mAutoDisable ? "yes" : "no");
- dump_printf("Auto Disable Engaged : %s\n",
- shouldAutoDisable() ? "yes" : "no");
- }
-
- return NO_ERROR;
-}
-
-void CommonTimeServer::PacketRTTLog::dumpLog(int fd, const CommonClock& cclk) {
- const size_t SIZE = 256;
- char buffer[SIZE];
- uint32_t avail = !logFull ? wrPtr : RTT_LOG_SIZE;
-
- if (!avail)
- return;
-
- dump_printf("\nPacket Log (%d entries)\n", avail);
-
- uint32_t ndx = 0;
- uint32_t i = logFull ? wrPtr : 0;
- do {
- if (rxTimes[i]) {
- int64_t delta = rxTimes[i] - txTimes[i];
- int64_t deltaUsec = cclk.localDurationToCommonDuration(delta);
- dump_printf("pkt[%2d] : localTX %12" PRId64 " localRX %12" PRId64 " "
- "(%.3f msec RTT)\n",
- ndx, txTimes[i], rxTimes[i],
- static_cast<float>(deltaUsec) / 1000.0);
- } else {
- dump_printf("pkt[%2d] : localTX %12" PRId64 " localRX never\n",
- ndx, txTimes[i]);
- }
- i = (i + 1) % RTT_LOG_SIZE;
- ndx++;
- } while (i != wrPtr);
-}
-
-#undef dump_printf
-#undef checked_percentage
-
-} // namespace android
diff --git a/libs/common_time/common_time_server_packets.cpp b/libs/common_time/common_time_server_packets.cpp
deleted file mode 100644
index c7c893d34499..000000000000
--- a/libs/common_time/common_time_server_packets.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/*
- * A service that exchanges time synchronization information between
- * a master that defines a timeline and clients that follow the timeline.
- */
-
-#define LOG_TAG "common_time"
-#include <utils/Log.h>
-
-#include <arpa/inet.h>
-#include <stdint.h>
-
-#include "common_time_server_packets.h"
-
-namespace android {
-
-const uint32_t TimeServicePacketHeader::kMagic =
- (static_cast<uint32_t>('c') << 24) |
- (static_cast<uint32_t>('c') << 16) |
- (static_cast<uint32_t>('l') << 8) |
- static_cast<uint32_t>('k');
-
-const uint16_t TimeServicePacketHeader::kCurVersion = 1;
-
-#define SERIALIZE_FIELD(field_name, type, converter) \
- do { \
- if ((offset + sizeof(field_name)) > length) \
- return -1; \
- *((type*)(data + offset)) = converter(field_name); \
- offset += sizeof(field_name); \
- } while (0)
-#define SERIALIZE_INT16(field_name) SERIALIZE_FIELD(field_name, int16_t, htons)
-#define SERIALIZE_INT32(field_name) SERIALIZE_FIELD(field_name, int32_t, htonl)
-#define SERIALIZE_INT64(field_name) SERIALIZE_FIELD(field_name, int64_t, htonq)
-
-#define DESERIALIZE_FIELD(field_name, type, converter) \
- do { \
- if ((offset + sizeof(field_name)) > length) \
- return -1; \
- (field_name) = converter(*((type*)(data + offset))); \
- offset += sizeof(field_name); \
- } while (0)
-#define DESERIALIZE_INT16(field_name) DESERIALIZE_FIELD(field_name, int16_t, ntohs)
-#define DESERIALIZE_INT32(field_name) DESERIALIZE_FIELD(field_name, int32_t, ntohl)
-#define DESERIALIZE_INT64(field_name) DESERIALIZE_FIELD(field_name, int64_t, ntohq)
-
-#define kDevicePriorityShift 56
-#define kDeviceIDMask ((static_cast<uint64_t>(1) << kDevicePriorityShift) - 1)
-
-inline uint64_t packDeviceID(uint64_t devID, uint8_t prio) {
- return (devID & kDeviceIDMask) |
- (static_cast<uint64_t>(prio) << kDevicePriorityShift);
-}
-
-inline uint64_t unpackDeviceID(uint64_t packed) {
- return (packed & kDeviceIDMask);
-}
-
-inline uint8_t unpackDevicePriority(uint64_t packed) {
- return static_cast<uint8_t>(packed >> kDevicePriorityShift);
-}
-
-ssize_t TimeServicePacketHeader::serializeHeader(uint8_t* data,
- uint32_t length) {
- ssize_t offset = 0;
- int16_t pktType = static_cast<int16_t>(packetType);
- SERIALIZE_INT32(magic);
- SERIALIZE_INT16(version);
- SERIALIZE_INT16(pktType);
- SERIALIZE_INT64(timelineID);
- SERIALIZE_INT64(syncGroupID);
- return offset;
-}
-
-ssize_t TimeServicePacketHeader::deserializeHeader(const uint8_t* data,
- uint32_t length) {
- ssize_t offset = 0;
- int16_t tmp;
- DESERIALIZE_INT32(magic);
- DESERIALIZE_INT16(version);
- DESERIALIZE_INT16(tmp);
- DESERIALIZE_INT64(timelineID);
- DESERIALIZE_INT64(syncGroupID);
- packetType = static_cast<TimeServicePacketType>(tmp);
- return offset;
-}
-
-ssize_t TimeServicePacketHeader::serializePacket(uint8_t* data,
- uint32_t length) {
- ssize_t ret, tmp;
-
- ret = serializeHeader(data, length);
- if (ret < 0)
- return ret;
-
- data += ret;
- length -= ret;
-
- switch (packetType) {
- case TIME_PACKET_WHO_IS_MASTER_REQUEST:
- tmp =((WhoIsMasterRequestPacket*)(this))->serializePacket(data,
- length);
- break;
- case TIME_PACKET_WHO_IS_MASTER_RESPONSE:
- tmp =((WhoIsMasterResponsePacket*)(this))->serializePacket(data,
- length);
- break;
- case TIME_PACKET_SYNC_REQUEST:
- tmp =((SyncRequestPacket*)(this))->serializePacket(data, length);
- break;
- case TIME_PACKET_SYNC_RESPONSE:
- tmp =((SyncResponsePacket*)(this))->serializePacket(data, length);
- break;
- case TIME_PACKET_MASTER_ANNOUNCEMENT:
- tmp =((MasterAnnouncementPacket*)(this))->serializePacket(data,
- length);
- break;
- default:
- return -1;
- }
-
- if (tmp < 0)
- return tmp;
-
- return ret + tmp;
-}
-
-ssize_t UniversalTimeServicePacket::deserializePacket(
- const uint8_t* data,
- uint32_t length,
- uint64_t expectedSyncGroupID) {
- ssize_t ret;
- TimeServicePacketHeader* header;
- if (length < 8)
- return -1;
-
- packetType = ntohs(*((uint16_t*)(data + 6)));
- switch (packetType) {
- case TIME_PACKET_WHO_IS_MASTER_REQUEST:
- ret = p.who_is_master_request.deserializePacket(data, length);
- header = &p.who_is_master_request;
- break;
- case TIME_PACKET_WHO_IS_MASTER_RESPONSE:
- ret = p.who_is_master_response.deserializePacket(data, length);
- header = &p.who_is_master_response;
- break;
- case TIME_PACKET_SYNC_REQUEST:
- ret = p.sync_request.deserializePacket(data, length);
- header = &p.sync_request;
- break;
- case TIME_PACKET_SYNC_RESPONSE:
- ret = p.sync_response.deserializePacket(data, length);
- header = &p.sync_response;
- break;
- case TIME_PACKET_MASTER_ANNOUNCEMENT:
- ret = p.master_announcement.deserializePacket(data, length);
- header = &p.master_announcement;
- break;
- default:
- return -1;
- }
-
- if ((ret >= 0) && !header->checkPacket(expectedSyncGroupID))
- ret = -1;
-
- return ret;
-}
-
-ssize_t WhoIsMasterRequestPacket::serializePacket(uint8_t* data,
- uint32_t length) {
- ssize_t offset = serializeHeader(data, length);
- if (offset > 0) {
- uint64_t packed = packDeviceID(senderDeviceID, senderDevicePriority);
- SERIALIZE_INT64(packed);
- }
- return offset;
-}
-
-ssize_t WhoIsMasterRequestPacket::deserializePacket(const uint8_t* data,
- uint32_t length) {
- ssize_t offset = deserializeHeader(data, length);
- if (offset > 0) {
- uint64_t packed;
- DESERIALIZE_INT64(packed);
- senderDeviceID = unpackDeviceID(packed);
- senderDevicePriority = unpackDevicePriority(packed);
- }
- return offset;
-}
-
-ssize_t WhoIsMasterResponsePacket::serializePacket(uint8_t* data,
- uint32_t length) {
- ssize_t offset = serializeHeader(data, length);
- if (offset > 0) {
- uint64_t packed = packDeviceID(deviceID, devicePriority);
- SERIALIZE_INT64(packed);
- }
- return offset;
-}
-
-ssize_t WhoIsMasterResponsePacket::deserializePacket(const uint8_t* data,
- uint32_t length) {
- ssize_t offset = deserializeHeader(data, length);
- if (offset > 0) {
- uint64_t packed;
- DESERIALIZE_INT64(packed);
- deviceID = unpackDeviceID(packed);
- devicePriority = unpackDevicePriority(packed);
- }
- return offset;
-}
-
-ssize_t SyncRequestPacket::serializePacket(uint8_t* data,
- uint32_t length) {
- ssize_t offset = serializeHeader(data, length);
- if (offset > 0) {
- SERIALIZE_INT64(clientTxLocalTime);
- }
- return offset;
-}
-
-ssize_t SyncRequestPacket::deserializePacket(const uint8_t* data,
- uint32_t length) {
- ssize_t offset = deserializeHeader(data, length);
- if (offset > 0) {
- DESERIALIZE_INT64(clientTxLocalTime);
- }
- return offset;
-}
-
-ssize_t SyncResponsePacket::serializePacket(uint8_t* data,
- uint32_t length) {
- ssize_t offset = serializeHeader(data, length);
- if (offset > 0) {
- SERIALIZE_INT64(clientTxLocalTime);
- SERIALIZE_INT64(masterRxCommonTime);
- SERIALIZE_INT64(masterTxCommonTime);
- SERIALIZE_INT32(nak);
- }
- return offset;
-}
-
-ssize_t SyncResponsePacket::deserializePacket(const uint8_t* data,
- uint32_t length) {
- ssize_t offset = deserializeHeader(data, length);
- if (offset > 0) {
- DESERIALIZE_INT64(clientTxLocalTime);
- DESERIALIZE_INT64(masterRxCommonTime);
- DESERIALIZE_INT64(masterTxCommonTime);
- DESERIALIZE_INT32(nak);
- }
- return offset;
-}
-
-ssize_t MasterAnnouncementPacket::serializePacket(uint8_t* data,
- uint32_t length) {
- ssize_t offset = serializeHeader(data, length);
- if (offset > 0) {
- uint64_t packed = packDeviceID(deviceID, devicePriority);
- SERIALIZE_INT64(packed);
- }
- return offset;
-}
-
-ssize_t MasterAnnouncementPacket::deserializePacket(const uint8_t* data,
- uint32_t length) {
- ssize_t offset = deserializeHeader(data, length);
- if (offset > 0) {
- uint64_t packed;
- DESERIALIZE_INT64(packed);
- deviceID = unpackDeviceID(packed);
- devicePriority = unpackDevicePriority(packed);
- }
- return offset;
-}
-
-} // namespace android
-
diff --git a/libs/common_time/common_time_server_packets.h b/libs/common_time/common_time_server_packets.h
deleted file mode 100644
index 57ba8a256308..000000000000
--- a/libs/common_time/common_time_server_packets.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_COMMON_TIME_SERVER_PACKETS_H
-#define ANDROID_COMMON_TIME_SERVER_PACKETS_H
-
-#include <stdint.h>
-#include <common_time/ICommonClock.h>
-
-namespace android {
-
-/***** time sync protocol packets *****/
-
-enum TimeServicePacketType {
- TIME_PACKET_WHO_IS_MASTER_REQUEST = 1,
- TIME_PACKET_WHO_IS_MASTER_RESPONSE,
- TIME_PACKET_SYNC_REQUEST,
- TIME_PACKET_SYNC_RESPONSE,
- TIME_PACKET_MASTER_ANNOUNCEMENT,
-};
-
-class TimeServicePacketHeader {
- public:
- friend class UniversalTimeServicePacket;
- // magic number identifying the protocol
- uint32_t magic;
-
- // protocol version of the packet
- uint16_t version;
-
- // type of the packet
- TimeServicePacketType packetType;
-
- // the timeline ID
- uint64_t timelineID;
-
- // synchronization group this packet belongs to (used to operate multiple
- // synchronization domains which all use the same master election endpoint)
- uint64_t syncGroupID;
-
- ssize_t serializePacket(uint8_t* data, uint32_t length);
-
- protected:
- void initHeader(TimeServicePacketType type,
- const uint64_t tlID,
- const uint64_t groupID) {
- magic = kMagic;
- version = kCurVersion;
- packetType = type;
- timelineID = tlID;
- syncGroupID = groupID;
- }
-
- bool checkPacket(uint64_t expectedSyncGroupID) const {
- return ((magic == kMagic) &&
- (version == kCurVersion) &&
- (!expectedSyncGroupID || (syncGroupID == expectedSyncGroupID)));
- }
-
- ssize_t serializeHeader(uint8_t* data, uint32_t length);
- ssize_t deserializeHeader(const uint8_t* data, uint32_t length);
-
- private:
- static const uint32_t kMagic;
- static const uint16_t kCurVersion;
-};
-
-// packet querying for a suitable master
-class WhoIsMasterRequestPacket : public TimeServicePacketHeader {
- public:
- uint64_t senderDeviceID;
- uint8_t senderDevicePriority;
-
- void initHeader(const uint64_t groupID) {
- TimeServicePacketHeader::initHeader(TIME_PACKET_WHO_IS_MASTER_REQUEST,
- ICommonClock::kInvalidTimelineID,
- groupID);
- }
-
- ssize_t serializePacket(uint8_t* data, uint32_t length);
- ssize_t deserializePacket(const uint8_t* data, uint32_t length);
-};
-
-// response to a WhoIsMaster request
-class WhoIsMasterResponsePacket : public TimeServicePacketHeader {
- public:
- uint64_t deviceID;
- uint8_t devicePriority;
-
- void initHeader(const uint64_t tlID, const uint64_t groupID) {
- TimeServicePacketHeader::initHeader(TIME_PACKET_WHO_IS_MASTER_RESPONSE,
- tlID, groupID);
- }
-
- ssize_t serializePacket(uint8_t* data, uint32_t length);
- ssize_t deserializePacket(const uint8_t* data, uint32_t length);
-};
-
-// packet sent by a client requesting correspondence between local
-// and common time
-class SyncRequestPacket : public TimeServicePacketHeader {
- public:
- // local time when this request was transmitted
- int64_t clientTxLocalTime;
-
- void initHeader(const uint64_t tlID, const uint64_t groupID) {
- TimeServicePacketHeader::initHeader(TIME_PACKET_SYNC_REQUEST,
- tlID, groupID);
- }
-
- ssize_t serializePacket(uint8_t* data, uint32_t length);
- ssize_t deserializePacket(const uint8_t* data, uint32_t length);
-};
-
-// response to a sync request sent by the master
-class SyncResponsePacket : public TimeServicePacketHeader {
- public:
- // local time when this request was transmitted by the client
- int64_t clientTxLocalTime;
-
- // common time when the master received the request
- int64_t masterRxCommonTime;
-
- // common time when the master transmitted the response
- int64_t masterTxCommonTime;
-
- // flag that is set if the recipient of the sync request is not acting
- // as a master for the requested timeline
- uint32_t nak;
-
- void initHeader(const uint64_t tlID, const uint64_t groupID) {
- TimeServicePacketHeader::initHeader(TIME_PACKET_SYNC_RESPONSE,
- tlID, groupID);
- }
-
- ssize_t serializePacket(uint8_t* data, uint32_t length);
- ssize_t deserializePacket(const uint8_t* data, uint32_t length);
-};
-
-// announcement of the master's presence
-class MasterAnnouncementPacket : public TimeServicePacketHeader {
- public:
- // the master's device ID
- uint64_t deviceID;
- uint8_t devicePriority;
-
- void initHeader(const uint64_t tlID, const uint64_t groupID) {
- TimeServicePacketHeader::initHeader(TIME_PACKET_MASTER_ANNOUNCEMENT,
- tlID, groupID);
- }
-
- ssize_t serializePacket(uint8_t* data, uint32_t length);
- ssize_t deserializePacket(const uint8_t* data, uint32_t length);
-};
-
-class UniversalTimeServicePacket {
- public:
- uint16_t packetType;
- union {
- WhoIsMasterRequestPacket who_is_master_request;
- WhoIsMasterResponsePacket who_is_master_response;
- SyncRequestPacket sync_request;
- SyncResponsePacket sync_response;
- MasterAnnouncementPacket master_announcement;
- } p;
-
- ssize_t deserializePacket(const uint8_t* data,
- uint32_t length,
- uint64_t expectedSyncGroupID);
-};
-
-}; // namespace android
-
-#endif // ANDROID_COMMON_TIME_SERVER_PACKETS_H
-
-
diff --git a/libs/common_time/diag_thread.cpp b/libs/common_time/diag_thread.cpp
deleted file mode 100644
index 4cb955131099..000000000000
--- a/libs/common_time/diag_thread.cpp
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "common_time"
-#include <utils/Log.h>
-
-#include <fcntl.h>
-#include <linux/in.h>
-#include <linux/tcp.h>
-#include <poll.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <utils/Errors.h>
-#include <utils/misc.h>
-
-#include <common_time/local_clock.h>
-
-#include "common_clock.h"
-#include "diag_thread.h"
-
-#define kMaxEvents 16
-#define kListenPort 9876
-
-static bool setNonblocking(int fd) {
- int flags = fcntl(fd, F_GETFL);
- if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0) {
- ALOGE("Failed to set socket (%d) to non-blocking mode (errno %d)",
- fd, errno);
- return false;
- }
-
- return true;
-}
-
-static bool setNodelay(int fd) {
- int tmp = 1;
- if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &tmp, sizeof(tmp)) < 0) {
- ALOGE("Failed to set socket (%d) to no-delay mode (errno %d)",
- fd, errno);
- return false;
- }
-
- return true;
-}
-
-namespace android {
-
-DiagThread::DiagThread(CommonClock* common_clock, LocalClock* local_clock) {
- common_clock_ = common_clock;
- local_clock_ = local_clock;
- listen_fd_ = -1;
- data_fd_ = -1;
- kernel_logID_basis_known_ = false;
- discipline_log_ID_ = 0;
-}
-
-DiagThread::~DiagThread() {
-}
-
-status_t DiagThread::startWorkThread() {
- status_t res;
- stopWorkThread();
- res = run("Diag");
-
- if (res != OK)
- ALOGE("Failed to start work thread (res = %d)", res);
-
- return res;
-}
-
-void DiagThread::stopWorkThread() {
- status_t res;
- res = requestExitAndWait(); // block until thread exit.
- if (res != OK)
- ALOGE("Failed to stop work thread (res = %d)", res);
-}
-
-bool DiagThread::openListenSocket() {
- bool ret = false;
- int flags;
- cleanupListenSocket();
-
- if ((listen_fd_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- ALOGE("Socket failed.");
- goto bailout;
- }
-
- // Set non-blocking operation
- if (!setNonblocking(listen_fd_))
- goto bailout;
-
- struct sockaddr_in addr;
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = INADDR_ANY;
- addr.sin_port = htons(kListenPort);
-
- if (bind(listen_fd_, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
- ALOGE("Bind failed.");
- goto bailout;
- }
-
- if (listen(listen_fd_, 1) < 0) {
- ALOGE("Listen failed.");
- goto bailout;
- }
-
- ret = true;
-bailout:
- if (!ret)
- cleanupListenSocket();
-
- return ret;
-}
-
-void DiagThread::cleanupListenSocket() {
- if (listen_fd_ >= 0) {
- int res;
-
- struct linger l;
- l.l_onoff = 1;
- l.l_linger = 0;
-
- setsockopt(listen_fd_, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
- shutdown(listen_fd_, SHUT_RDWR);
- close(listen_fd_);
- listen_fd_ = -1;
- }
-}
-
-void DiagThread::cleanupDataSocket() {
- if (data_fd_ >= 0) {
- int res;
-
- struct linger l;
- l.l_onoff = 1;
- l.l_linger = 0;
-
- setsockopt(data_fd_, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
- shutdown(data_fd_, SHUT_RDWR);
- close(data_fd_);
- data_fd_ = -1;
- }
-}
-
-void DiagThread::resetLogIDs() {
- // Drain and discard all of the events from the kernel
- struct local_time_debug_event events[kMaxEvents];
- while(local_clock_->getDebugLog(events, kMaxEvents) > 0)
- ;
-
- {
- Mutex::Autolock lock(&discipline_log_lock_);
- discipline_log_.clear();
- discipline_log_ID_ = 0;
- }
-
- kernel_logID_basis_known_ = false;
-}
-
-void DiagThread::pushDisciplineEvent(int64_t observed_local_time,
- int64_t observed_common_time,
- int64_t nominal_common_time,
- int32_t total_correction,
- int32_t rtt) {
- Mutex::Autolock lock(&discipline_log_lock_);
-
- DisciplineEventRecord evt;
-
- evt.event_id = discipline_log_ID_++;
-
- evt.action_local_time = local_clock_->getLocalTime();
- common_clock_->localToCommon(evt.action_local_time,
- &evt.action_common_time);
-
- evt.observed_local_time = observed_local_time;
- evt.observed_common_time = observed_common_time;
- evt.nominal_common_time = nominal_common_time;
- evt.total_correction = total_correction;
- evt.rtt = rtt;
-
- discipline_log_.push_back(evt);
- while (discipline_log_.size() > kMaxDisciplineLogSize)
- discipline_log_.erase(discipline_log_.begin());
-}
-
-bool DiagThread::threadLoop() {
- struct pollfd poll_fds[1];
-
- if (!openListenSocket()) {
- ALOGE("Failed to open listen socket");
- goto bailout;
- }
-
- while (!exitPending()) {
- memset(&poll_fds, 0, sizeof(poll_fds));
-
- if (data_fd_ < 0) {
- poll_fds[0].fd = listen_fd_;
- poll_fds[0].events = POLLIN;
- } else {
- poll_fds[0].fd = data_fd_;
- poll_fds[0].events = POLLRDHUP | POLLIN;
- }
-
- int poll_res = poll(poll_fds, NELEM(poll_fds), 50);
- if (poll_res < 0) {
- ALOGE("Fatal error (%d,%d) while waiting on events",
- poll_res, errno);
- goto bailout;
- }
-
- if (exitPending())
- break;
-
- if (poll_fds[0].revents) {
- if (poll_fds[0].fd == listen_fd_) {
- data_fd_ = accept(listen_fd_, NULL, NULL);
-
- if (data_fd_ < 0) {
- ALOGW("Failed accept on socket %d with err %d",
- listen_fd_, errno);
- } else {
- if (!setNonblocking(data_fd_))
- cleanupDataSocket();
- if (!setNodelay(data_fd_))
- cleanupDataSocket();
- }
- } else
- if (poll_fds[0].fd == data_fd_) {
- if (poll_fds[0].revents & POLLRDHUP) {
- // Connection hung up; time to clean up.
- cleanupDataSocket();
- } else
- if (poll_fds[0].revents & POLLIN) {
- uint8_t cmd;
- if (read(data_fd_, &cmd, sizeof(cmd)) > 0) {
- switch(cmd) {
- case 'r':
- case 'R':
- resetLogIDs();
- break;
- }
- }
- }
- }
- }
-
- struct local_time_debug_event events[kMaxEvents];
- int amt = local_clock_->getDebugLog(events, kMaxEvents);
-
- if (amt > 0) {
- for (int i = 0; i < amt; i++) {
- struct local_time_debug_event& e = events[i];
-
- if (!kernel_logID_basis_known_) {
- kernel_logID_basis_ = e.local_timesync_event_id;
- kernel_logID_basis_known_ = true;
- }
-
- char buf[1024];
- int64_t common_time;
- status_t res = common_clock_->localToCommon(e.local_time,
- &common_time);
- snprintf(buf, sizeof(buf), "E,%lld,%lld,%lld,%d\n",
- e.local_timesync_event_id - kernel_logID_basis_,
- e.local_time,
- common_time,
- (OK == res) ? 1 : 0);
- buf[sizeof(buf) - 1] = 0;
-
- if (data_fd_ >= 0)
- write(data_fd_, buf, strlen(buf));
- }
- }
-
- { // scope for autolock pattern
- Mutex::Autolock lock(&discipline_log_lock_);
-
- while (discipline_log_.size() > 0) {
- char buf[1024];
- DisciplineEventRecord& e = *discipline_log_.begin();
- snprintf(buf, sizeof(buf),
- "D,%lld,%lld,%lld,%lld,%lld,%lld,%d,%d\n",
- e.event_id,
- e.action_local_time,
- e.action_common_time,
- e.observed_local_time,
- e.observed_common_time,
- e.nominal_common_time,
- e.total_correction,
- e.rtt);
- buf[sizeof(buf) - 1] = 0;
-
- if (data_fd_ >= 0)
- write(data_fd_, buf, strlen(buf));
-
- discipline_log_.erase(discipline_log_.begin());
- }
- }
- }
-
-bailout:
- cleanupDataSocket();
- cleanupListenSocket();
- return false;
-}
-
-} // namespace android
diff --git a/libs/common_time/diag_thread.h b/libs/common_time/diag_thread.h
deleted file mode 100644
index c630e0d9b525..000000000000
--- a/libs/common_time/diag_thread.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef __DIAG_THREAD_H__
-#define __DIAG_THREAD_H__
-
-#include <utils/List.h>
-#include <utils/threads.h>
-
-namespace android {
-
-class CommonClock;
-class LocalClock;
-
-class DiagThread : public Thread {
- public:
- DiagThread(CommonClock* common_clock, LocalClock* local_clock);
- ~DiagThread();
-
- status_t startWorkThread();
- void stopWorkThread();
- virtual bool threadLoop();
-
- void pushDisciplineEvent(int64_t observed_local_time,
- int64_t observed_common_time,
- int64_t nominal_common_time,
- int32_t total_correction,
- int32_t rtt);
-
- private:
- typedef struct {
- int64_t event_id;
- int64_t action_local_time;
- int64_t action_common_time;
- int64_t observed_local_time;
- int64_t observed_common_time;
- int64_t nominal_common_time;
- int32_t total_correction;
- int32_t rtt;
- } DisciplineEventRecord;
-
- bool openListenSocket();
- void cleanupListenSocket();
- void cleanupDataSocket();
- void resetLogIDs();
-
- CommonClock* common_clock_;
- LocalClock* local_clock_;
- int listen_fd_;
- int data_fd_;
-
- int64_t kernel_logID_basis_;
- bool kernel_logID_basis_known_;
-
- static const size_t kMaxDisciplineLogSize = 16;
- Mutex discipline_log_lock_;
- List<DisciplineEventRecord> discipline_log_;
- int64_t discipline_log_ID_;
-};
-
-} // namespace android
-
-#endif //__ DIAG_THREAD_H__
diff --git a/libs/common_time/main.cpp b/libs/common_time/main.cpp
deleted file mode 100644
index ac52c851daa3..000000000000
--- a/libs/common_time/main.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/*
- * A service that exchanges time synchronization information between
- * a master that defines a timeline and clients that follow the timeline.
- */
-
-#define LOG_TAG "common_time"
-#include <utils/Log.h>
-
-#include <binder/IPCThreadState.h>
-#include <binder/ProcessState.h>
-
-#include "common_time_server.h"
-
-int main() {
- using namespace android;
-
- sp<CommonTimeServer> service = new CommonTimeServer();
- if (service == NULL)
- return 1;
-
- ProcessState::self()->startThreadPool();
- service->run("CommonTimeServer", ANDROID_PRIORITY_NORMAL);
-
- IPCThreadState::self()->joinThreadPool();
- return 0;
-}
-
diff --git a/libs/common_time/utils.cpp b/libs/common_time/utils.cpp
deleted file mode 100644
index ddcdfe7f211b..000000000000
--- a/libs/common_time/utils.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "common_time"
-#include <utils/Log.h>
-
-#include "utils.h"
-
-namespace android {
-
-void Timeout::setTimeout(int msec) {
- if (msec < 0) {
- mSystemEndTime = 0;
- return;
- }
-
- mSystemEndTime = systemTime() + (static_cast<nsecs_t>(msec) * 1000000);
-}
-
-int Timeout::msecTillTimeout(nsecs_t nowTime) {
- if (!mSystemEndTime) {
- return -1;
- }
-
- if (mSystemEndTime < nowTime) {
- return 0;
- }
-
- nsecs_t delta = mSystemEndTime - nowTime;
- delta += 999999;
- delta /= 1000000;
- if (delta > 0x7FFFFFFF) {
- return 0x7FFFFFFF;
- }
-
- return static_cast<int>(delta);
-}
-
-LogRing::LogRing(const char* header, size_t entries)
- : mSize(entries)
- , mWr(0)
- , mIsFull(false)
- , mHeader(header) {
- mRingBuffer = new Entry[mSize];
- if (NULL == mRingBuffer)
- ALOGE("Failed to allocate log ring with %zu entries.", mSize);
-}
-
-LogRing::~LogRing() {
- if (NULL != mRingBuffer)
- delete[] mRingBuffer;
-}
-
-void LogRing::log(int prio, const char* tag, const char* fmt, ...) {
- va_list argp;
- va_start(argp, fmt);
- internalLog(prio, tag, fmt, argp);
- va_end(argp);
-}
-
-void LogRing::log(const char* fmt, ...) {
- va_list argp;
- va_start(argp, fmt);
- internalLog(0, NULL, fmt, argp);
- va_end(argp);
-}
-
-void LogRing::internalLog(int prio,
- const char* tag,
- const char* fmt,
- va_list argp) {
- if (NULL != mRingBuffer) {
- Mutex::Autolock lock(&mLock);
- String8 s(String8::formatV(fmt, argp));
- Entry* last = NULL;
-
- if (mIsFull || mWr)
- last = &(mRingBuffer[(mWr + mSize - 1) % mSize]);
-
-
- if ((NULL != last) && !last->s.compare(s)) {
- gettimeofday(&(last->last_ts), NULL);
- ++last->count;
- } else {
- gettimeofday(&mRingBuffer[mWr].first_ts, NULL);
- mRingBuffer[mWr].last_ts = mRingBuffer[mWr].first_ts;
- mRingBuffer[mWr].count = 1;
- mRingBuffer[mWr].s.setTo(s);
-
- mWr = (mWr + 1) % mSize;
- if (!mWr)
- mIsFull = true;
- }
- }
-
- if (NULL != tag)
- LOG_PRI_VA(prio, tag, fmt, argp);
-}
-
-void LogRing::dumpLog(int fd) {
- if (NULL == mRingBuffer)
- return;
-
- Mutex::Autolock lock(&mLock);
-
- if (!mWr && !mIsFull)
- return;
-
- char buf[1024];
- int res;
- size_t start = mIsFull ? mWr : 0;
- size_t count = mIsFull ? mSize : mWr;
- static const char* kTimeFmt = "%a %b %d %Y %H:%M:%S";
-
- res = snprintf(buf, sizeof(buf), "\n%s\n", mHeader);
- if (res > 0)
- write(fd, buf, res);
-
- for (size_t i = 0; i < count; ++i) {
- struct tm t;
- char timebuf[64];
- char repbuf[96];
- size_t ndx = (start + i) % mSize;
-
- if (1 != mRingBuffer[ndx].count) {
- localtime_r(&mRingBuffer[ndx].last_ts.tv_sec, &t);
- strftime(timebuf, sizeof(timebuf), kTimeFmt, &t);
- snprintf(repbuf, sizeof(repbuf),
- " (repeated %d times, last was %s.%03ld)",
- mRingBuffer[ndx].count,
- timebuf,
- mRingBuffer[ndx].last_ts.tv_usec / 1000);
- repbuf[sizeof(repbuf) - 1] = 0;
- } else {
- repbuf[0] = 0;
- }
-
- localtime_r(&mRingBuffer[ndx].first_ts.tv_sec, &t);
- strftime(timebuf, sizeof(timebuf), kTimeFmt, &t);
- res = snprintf(buf, sizeof(buf), "[%2zu] %s.%03ld :: %s%s\n",
- i, timebuf,
- mRingBuffer[ndx].first_ts.tv_usec / 1000,
- mRingBuffer[ndx].s.string(),
- repbuf);
-
- if (res > 0)
- write(fd, buf, res);
- }
-}
-
-} // namespace android
diff --git a/libs/common_time/utils.h b/libs/common_time/utils.h
deleted file mode 100644
index c28cf0ac33d7..000000000000
--- a/libs/common_time/utils.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef __UTILS_H__
-#define __UTILS_H__
-
-#include <stdint.h>
-#include <unistd.h>
-
-#include <utils/String8.h>
-#include <utils/threads.h>
-#include <utils/Timers.h>
-
-namespace android {
-
-class Timeout {
- public:
- Timeout() : mSystemEndTime(0) { }
-
- // Set a timeout which should occur msec milliseconds from now.
- // Negative values will cancel any current timeout;
- void setTimeout(int msec);
-
- // Return the number of milliseconds until the timeout occurs, or -1 if
- // no timeout is scheduled.
- int msecTillTimeout(nsecs_t nowTime);
- int msecTillTimeout() { return msecTillTimeout(systemTime()); }
-
- private:
- // The systemTime() at which the timeout will be complete, or 0 if no
- // timeout is currently scheduled.
- nsecs_t mSystemEndTime;
-};
-
-class LogRing {
- public:
- LogRing(const char* header, size_t entries);
- ~LogRing();
-
- // Send a log message to logcat as well as storing it in the ring buffer.
- void log(int prio, const char* tag, const char* fmt, ...);
-
- // Add a log message the ring buffer, do not send the message to logcat.
- void log(const char* fmt, ...);
-
- // Dump the log to an fd (dumpsys style)
- void dumpLog(int fd);
-
- private:
- class Entry {
- public:
- uint32_t count;
- struct timeval first_ts;
- struct timeval last_ts;
- String8 s;
- };
-
- Mutex mLock;
- Entry* mRingBuffer;
- size_t mSize;
- size_t mWr;
- bool mIsFull;
- const char* mHeader;
-
- void internalLog(int prio, const char* tag, const char* fmt, va_list va);
-};
-
-} // namespace android
-
-#endif // __UTILS_H__
diff --git a/libs/hwui/AmbientShadow.cpp b/libs/hwui/AmbientShadow.cpp
deleted file mode 100644
index aa96698c1e53..000000000000
--- a/libs/hwui/AmbientShadow.cpp
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-/**
- * Extra vertices for the corner for smoother corner.
- * Only for outer vertices.
- * Note that we use such extra memory to avoid an extra loop.
- */
-// For half circle, we could add EXTRA_VERTEX_PER_PI vertices.
-// Set to 1 if we don't want to have any.
-#define EXTRA_CORNER_VERTEX_PER_PI 12
-
-// For the whole polygon, the sum of all the deltas b/t normals is 2 * M_PI,
-// therefore, the maximum number of extra vertices will be twice bigger.
-#define MAX_EXTRA_CORNER_VERTEX_NUMBER (2 * EXTRA_CORNER_VERTEX_PER_PI)
-
-// For each RADIANS_DIVISOR, we would allocate one more vertex b/t the normals.
-#define CORNER_RADIANS_DIVISOR (M_PI / EXTRA_CORNER_VERTEX_PER_PI)
-
-/**
- * Extra vertices for the Edge for interpolation artifacts.
- * Same value for both inner and outer vertices.
- */
-#define EXTRA_EDGE_VERTEX_PER_PI 50
-
-#define MAX_EXTRA_EDGE_VERTEX_NUMBER (2 * EXTRA_EDGE_VERTEX_PER_PI)
-
-#define EDGE_RADIANS_DIVISOR (M_PI / EXTRA_EDGE_VERTEX_PER_PI)
-
-/**
- * Other constants:
- */
-#define OUTER_ALPHA (0.0f)
-
-// Once the alpha difference is greater than this threshold, we will allocate extra
-// edge vertices.
-// If this is set to negative value, then all the edge will be tessellated.
-#define ALPHA_THRESHOLD (0.1f / 255.0f)
-
-#include "AmbientShadow.h"
-
-#include "ShadowTessellator.h"
-#include "Vertex.h"
-#include "VertexBuffer.h"
-
-#include <utils/Log.h>
-#include <algorithm>
-
-namespace android {
-namespace uirenderer {
-
-/**
- * Local utility functions.
- */
-inline Vector2 getNormalFromVertices(const Vector3* vertices, int current, int next) {
- // Convert from Vector3 to Vector2 first.
- Vector2 currentVertex = {vertices[current].x, vertices[current].y};
- Vector2 nextVertex = {vertices[next].x, vertices[next].y};
-
- return ShadowTessellator::calculateNormal(currentVertex, nextVertex);
-}
-
-// The input z value will be converted to be non-negative inside.
-// The output must be ranged from 0 to 1.
-inline float getAlphaFromFactoredZ(float factoredZ) {
- return 1.0 / (1 + std::max(factoredZ, 0.0f));
-}
-
-inline int getEdgeExtraAndUpdateSpike(Vector2* currentSpike, const Vector3& secondVertex,
- const Vector3& centroid) {
- Vector2 secondSpike = {secondVertex.x - centroid.x, secondVertex.y - centroid.y};
- secondSpike.normalize();
-
- int result = ShadowTessellator::getExtraVertexNumber(secondSpike, *currentSpike,
- EDGE_RADIANS_DIVISOR);
- *currentSpike = secondSpike;
- return result;
-}
-
-// Given the caster's vertex count, compute all the buffers size depending on
-// whether or not the caster is opaque.
-inline void computeBufferSize(int* totalVertexCount, int* totalIndexCount, int* totalUmbraCount,
- int casterVertexCount, bool isCasterOpaque) {
- // Compute the size of the vertex buffer.
- int outerVertexCount =
- casterVertexCount * 2 + MAX_EXTRA_CORNER_VERTEX_NUMBER + MAX_EXTRA_EDGE_VERTEX_NUMBER;
- int innerVertexCount = casterVertexCount + MAX_EXTRA_EDGE_VERTEX_NUMBER;
- *totalVertexCount = outerVertexCount + innerVertexCount;
-
- // Compute the size of the index buffer.
- *totalIndexCount = 2 * outerVertexCount + 2;
-
- // Compute the size of the umber buffer.
- // For translucent object, keep track of the umbra(inner) vertex in order to draw
- // inside. We only need to store the index information.
- *totalUmbraCount = 0;
- if (!isCasterOpaque) {
- // Add the centroid if occluder is translucent.
- (*totalVertexCount)++;
- *totalIndexCount += 2 * innerVertexCount + 1;
- *totalUmbraCount = innerVertexCount;
- }
-}
-
-inline bool needsExtraForEdge(float firstAlpha, float secondAlpha) {
- return fabsf(firstAlpha - secondAlpha) > ALPHA_THRESHOLD;
-}
-
-/**
- * Calculate the shadows as a triangle strips while alpha value as the
- * shadow values.
- *
- * @param isCasterOpaque Whether the caster is opaque.
- * @param vertices The shadow caster's polygon, which is represented in a Vector3
- * array.
- * @param vertexCount The length of caster's polygon in terms of number of
- * vertices.
- * @param centroid3d The centroid of the shadow caster.
- * @param heightFactor The factor showing the higher the object, the lighter the
- * shadow.
- * @param geomFactor The factor scaling the geometry expansion along the normal.
- *
- * @param shadowVertexBuffer Return an floating point array of (x, y, a)
- * triangle strips mode.
- *
- * An simple illustration:
- * For now let's mark the outer vertex as Pi, the inner as Vi, the centroid as C.
- *
- * First project the occluder to the Z=0 surface.
- * Then we got all the inner vertices. And we compute the normal for each edge.
- * According to the normal, we generate outer vertices. E.g: We generate P1 / P4
- * as extra corner vertices to make the corner looks round and smoother.
- *
- * Due to the fact that the alpha is not linear interpolated along the inner
- * edge, when the alpha is different, we may add extra vertices such as P2.1, P2.2,
- * V0.1, V0.2 to avoid the visual artifacts.
- *
- * (P3)
- * (P2) (P2.1) (P2.2) | ' (P4)
- * (P1)' | | | | '
- * ' | | | | '
- * (P0) ------------------------------------------------(P5)
- * | (V0) (V0.1) (V0.2) |(V1)
- * | |
- * | |
- * | (C) |
- * | |
- * | |
- * | |
- * | |
- * (V3)-----------------------------------(V2)
- */
-void AmbientShadow::createAmbientShadow(bool isCasterOpaque, const Vector3* casterVertices,
- int casterVertexCount, const Vector3& centroid3d,
- float heightFactor, float geomFactor,
- VertexBuffer& shadowVertexBuffer) {
- shadowVertexBuffer.setMeshFeatureFlags(VertexBuffer::kAlpha | VertexBuffer::kIndices);
-
- // In order to computer the outer vertices in one loop, we need pre-compute
- // the normal by the vertex (n - 1) to vertex 0, and the spike and alpha value
- // for vertex 0.
- Vector2 previousNormal = getNormalFromVertices(casterVertices, casterVertexCount - 1, 0);
- Vector2 currentSpike = {casterVertices[0].x - centroid3d.x, casterVertices[0].y - centroid3d.y};
- currentSpike.normalize();
- float currentAlpha = getAlphaFromFactoredZ(casterVertices[0].z * heightFactor);
-
- // Preparing all the output data.
- int totalVertexCount, totalIndexCount, totalUmbraCount;
- computeBufferSize(&totalVertexCount, &totalIndexCount, &totalUmbraCount, casterVertexCount,
- isCasterOpaque);
- AlphaVertex* shadowVertices = shadowVertexBuffer.alloc<AlphaVertex>(totalVertexCount);
- int vertexBufferIndex = 0;
- uint16_t* indexBuffer = shadowVertexBuffer.allocIndices<uint16_t>(totalIndexCount);
- int indexBufferIndex = 0;
- uint16_t umbraVertices[totalUmbraCount];
- int umbraIndex = 0;
-
- for (int i = 0; i < casterVertexCount; i++) {
- // Corner: first figure out the extra vertices we need for the corner.
- const Vector3& innerVertex = casterVertices[i];
- Vector2 currentNormal =
- getNormalFromVertices(casterVertices, i, (i + 1) % casterVertexCount);
-
- int extraVerticesNumber = ShadowTessellator::getExtraVertexNumber(
- currentNormal, previousNormal, CORNER_RADIANS_DIVISOR);
-
- float expansionDist = innerVertex.z * heightFactor * geomFactor;
- const int cornerSlicesNumber = extraVerticesNumber + 1; // Minimal as 1.
-#if DEBUG_SHADOW
- ALOGD("cornerSlicesNumber is %d", cornerSlicesNumber);
-#endif
-
- // Corner: fill the corner Vertex Buffer(VB) and Index Buffer(IB).
- // We fill the inner vertex first, such that we can fill the index buffer
- // inside the loop.
- int currentInnerVertexIndex = vertexBufferIndex;
- if (!isCasterOpaque) {
- umbraVertices[umbraIndex++] = vertexBufferIndex;
- }
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], casterVertices[i].x,
- casterVertices[i].y, currentAlpha);
-
- const Vector3& innerStart = casterVertices[i];
-
- // outerStart is the first outer vertex for this inner vertex.
- // outerLast is the last outer vertex for this inner vertex.
- Vector2 outerStart = {0, 0};
- Vector2 outerLast = {0, 0};
- // This will create vertices from [0, cornerSlicesNumber] inclusively,
- // which means minimally 2 vertices even without the extra ones.
- for (int j = 0; j <= cornerSlicesNumber; j++) {
- Vector2 averageNormal = previousNormal * (cornerSlicesNumber - j) + currentNormal * j;
- averageNormal /= cornerSlicesNumber;
- averageNormal.normalize();
- Vector2 outerVertex;
- outerVertex.x = innerVertex.x + averageNormal.x * expansionDist;
- outerVertex.y = innerVertex.y + averageNormal.y * expansionDist;
-
- indexBuffer[indexBufferIndex++] = vertexBufferIndex;
- indexBuffer[indexBufferIndex++] = currentInnerVertexIndex;
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], outerVertex.x, outerVertex.y,
- OUTER_ALPHA);
-
- if (j == 0) {
- outerStart = outerVertex;
- } else if (j == cornerSlicesNumber) {
- outerLast = outerVertex;
- }
- }
- previousNormal = currentNormal;
-
- // Edge: first figure out the extra vertices needed for the edge.
- const Vector3& innerNext = casterVertices[(i + 1) % casterVertexCount];
- float nextAlpha = getAlphaFromFactoredZ(innerNext.z * heightFactor);
- if (needsExtraForEdge(currentAlpha, nextAlpha)) {
- // TODO: See if we can / should cache this outer vertex across the loop.
- Vector2 outerNext;
- float expansionDist = innerNext.z * heightFactor * geomFactor;
- outerNext.x = innerNext.x + currentNormal.x * expansionDist;
- outerNext.y = innerNext.y + currentNormal.y * expansionDist;
-
- // Compute the angle and see how many extra points we need.
- int extraVerticesNumber =
- getEdgeExtraAndUpdateSpike(&currentSpike, innerNext, centroid3d);
-#if DEBUG_SHADOW
- ALOGD("extraVerticesNumber %d for edge %d", extraVerticesNumber, i);
-#endif
- // Edge: fill the edge's VB and IB.
- // This will create vertices pair from [1, extraVerticesNumber - 1].
- // If there is no extra vertices created here, the edge will be drawn
- // as just 2 triangles.
- for (int k = 1; k < extraVerticesNumber; k++) {
- int startWeight = extraVerticesNumber - k;
- Vector2 currentOuter =
- (outerLast * startWeight + outerNext * k) / extraVerticesNumber;
- indexBuffer[indexBufferIndex++] = vertexBufferIndex;
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], currentOuter.x,
- currentOuter.y, OUTER_ALPHA);
-
- if (!isCasterOpaque) {
- umbraVertices[umbraIndex++] = vertexBufferIndex;
- }
- Vector3 currentInner =
- (innerStart * startWeight + innerNext * k) / extraVerticesNumber;
- indexBuffer[indexBufferIndex++] = vertexBufferIndex;
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], currentInner.x,
- currentInner.y,
- getAlphaFromFactoredZ(currentInner.z * heightFactor));
- }
- }
- currentAlpha = nextAlpha;
- }
-
- indexBuffer[indexBufferIndex++] = 1;
- indexBuffer[indexBufferIndex++] = 0;
-
- if (!isCasterOpaque) {
- // Add the centroid as the last one in the vertex buffer.
- float centroidOpacity = getAlphaFromFactoredZ(centroid3d.z * heightFactor);
- int centroidIndex = vertexBufferIndex;
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], centroid3d.x, centroid3d.y,
- centroidOpacity);
-
- for (int i = 0; i < umbraIndex; i++) {
- // Note that umbraVertices[0] is always 0.
- // So the start and the end of the umbra are using the "0".
- // And penumbra ended with 0, so a degenerated triangle is formed b/t
- // the umbra and penumbra.
- indexBuffer[indexBufferIndex++] = umbraVertices[i];
- indexBuffer[indexBufferIndex++] = centroidIndex;
- }
- indexBuffer[indexBufferIndex++] = 0;
- }
-
- // At the end, update the real index and vertex buffer size.
- shadowVertexBuffer.updateVertexCount(vertexBufferIndex);
- shadowVertexBuffer.updateIndexCount(indexBufferIndex);
- shadowVertexBuffer.computeBounds<AlphaVertex>();
-
- ShadowTessellator::checkOverflow(vertexBufferIndex, totalVertexCount, "Ambient Vertex Buffer");
- ShadowTessellator::checkOverflow(indexBufferIndex, totalIndexCount, "Ambient Index Buffer");
- ShadowTessellator::checkOverflow(umbraIndex, totalUmbraCount, "Ambient Umbra Buffer");
-
-#if DEBUG_SHADOW
- for (int i = 0; i < vertexBufferIndex; i++) {
- ALOGD("vertexBuffer i %d, (%f, %f %f)", i, shadowVertices[i].x, shadowVertices[i].y,
- shadowVertices[i].alpha);
- }
- for (int i = 0; i < indexBufferIndex; i++) {
- ALOGD("indexBuffer i %d, indexBuffer[i] %d", i, indexBuffer[i]);
- }
-#endif
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/AmbientShadow.h b/libs/hwui/AmbientShadow.h
deleted file mode 100644
index cb1d915f2540..000000000000
--- a/libs/hwui/AmbientShadow.h
+++ /dev/null
@@ -1,42 +0,0 @@
-
-/*
- * Copyright (C) 2013 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.
- */
-
-#ifndef ANDROID_HWUI_AMBIENT_SHADOW_H
-#define ANDROID_HWUI_AMBIENT_SHADOW_H
-
-#include "Debug.h"
-#include "Vector.h"
-
-namespace android {
-namespace uirenderer {
-
-class VertexBuffer;
-
-/**
- * AmbientShadow is used to calculate the ambient shadow value around a polygon.
- */
-class AmbientShadow {
-public:
- static void createAmbientShadow(bool isCasterOpaque, const Vector3* poly, int polyLength,
- const Vector3& centroid3d, float heightFactor, float geomFactor,
- VertexBuffer& shadowVertexBuffer);
-}; // AmbientShadow
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_AMBIENT_SHADOW_H
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index cb260b5b4b91..59760ab0a20f 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -48,6 +48,11 @@ cc_defaults {
device_uses_hwc2: {
cflags: ["-DUSE_HWC2"],
},
+ eng: {
+ lto: {
+ never: true,
+ },
+ },
},
}
@@ -76,7 +81,6 @@ cc_defaults {
cc_defaults {
name: "hwui_bugreport_font_cache_usage",
- srcs: ["font/FontCacheHistoryTracker.cpp"],
cflags: ["-DBUGREPORT_FONT_CACHE_USAGE"],
}
@@ -153,8 +157,6 @@ cc_defaults {
"hwui/AnimatedImageDrawable.cpp",
"hwui/AnimatedImageThread.cpp",
"hwui/Bitmap.cpp",
- "font/CacheTexture.cpp",
- "font/Font.cpp",
"hwui/Canvas.cpp",
"hwui/MinikinSkia.cpp",
"hwui/MinikinUtils.cpp",
@@ -174,17 +176,11 @@ cc_defaults {
"pipeline/skia/SkiaRecordingCanvas.cpp",
"pipeline/skia/SkiaVulkanPipeline.cpp",
"pipeline/skia/VectorDrawableAtlas.cpp",
- "renderstate/Blend.cpp",
- "renderstate/MeshState.cpp",
- "renderstate/OffscreenBufferPool.cpp",
"renderstate/PixelBufferState.cpp",
"renderstate/RenderState.cpp",
- "renderstate/Scissor.cpp",
- "renderstate/Stencil.cpp",
"renderstate/TextureState.cpp",
"renderthread/CacheManager.cpp",
"renderthread/CanvasContext.cpp",
- "renderthread/OpenGLPipeline.cpp",
"renderthread/DrawFrameTask.cpp",
"renderthread/EglManager.cpp",
"renderthread/VulkanManager.cpp",
@@ -202,73 +198,44 @@ cc_defaults {
"utils/StringUtils.cpp",
"utils/TestWindowContext.cpp",
"utils/VectorDrawableUtils.cpp",
- "AmbientShadow.cpp",
"AnimationContext.cpp",
"Animator.cpp",
"AnimatorManager.cpp",
- "BakedOpDispatcher.cpp",
- "BakedOpRenderer.cpp",
- "BakedOpState.cpp",
"Caches.cpp",
"CanvasState.cpp",
+ "CanvasTransform.cpp",
"ClipArea.cpp",
"DamageAccumulator.cpp",
"DeferredLayerUpdater.cpp",
"DeviceInfo.cpp",
- "DisplayList.cpp",
- "Extensions.cpp",
- "FboCache.cpp",
- "FontRenderer.cpp",
- "FrameBuilder.cpp",
"FrameInfo.cpp",
"FrameInfoVisualizer.cpp",
- "GammaFontRenderer.cpp",
"GlLayer.cpp",
- "GlopBuilder.cpp",
"GpuMemoryTracker.cpp",
- "GradientCache.cpp",
- "Image.cpp",
+ "HardwareBitmapUploader.cpp",
"Interpolator.cpp",
"JankTracker.cpp",
"Layer.cpp",
- "LayerBuilder.cpp",
"LayerUpdateQueue.cpp",
"Matrix.cpp",
- "OpDumper.cpp",
- "OpenGLReadback.cpp",
- "Patch.cpp",
- "PatchCache.cpp",
- "PathCache.cpp",
+ "EglReadback.cpp",
"PathParser.cpp",
- "PathTessellator.cpp",
"PixelBuffer.cpp",
"ProfileData.cpp",
"ProfileDataContainer.cpp",
- "ProfileRenderer.cpp",
- "Program.cpp",
- "ProgramCache.cpp",
"Properties.cpp",
"PropertyValuesAnimatorSet.cpp",
"PropertyValuesHolder.cpp",
- "RecordingCanvas.cpp",
- "RenderBufferCache.cpp",
"RenderNode.cpp",
"RenderProperties.cpp",
"ResourceCache.cpp",
- "ShadowTessellator.cpp",
"SkiaCanvas.cpp",
"SkiaCanvasProxy.cpp",
- "SkiaShader.cpp",
"Snapshot.cpp",
- "SpotShadow.cpp",
- "TessellationCache.cpp",
- "TextDropShadowCache.cpp",
"Texture.cpp",
- "TextureCache.cpp",
"VectorDrawable.cpp",
"VkLayer.cpp",
"protos/graphicsstats.proto",
- "protos/hwui.proto",
],
proto: {
@@ -343,33 +310,20 @@ cc_test {
srcs: [
"tests/unit/main.cpp",
- "tests/unit/BakedOpDispatcherTests.cpp",
- "tests/unit/BakedOpRendererTests.cpp",
- "tests/unit/BakedOpStateTests.cpp",
"tests/unit/CacheManagerTests.cpp",
"tests/unit/CanvasContextTests.cpp",
"tests/unit/CanvasStateTests.cpp",
"tests/unit/ClipAreaTests.cpp",
"tests/unit/DamageAccumulatorTests.cpp",
"tests/unit/DeferredLayerUpdaterTests.cpp",
- "tests/unit/DeviceInfoTests.cpp",
"tests/unit/FatVectorTests.cpp",
- "tests/unit/FontRendererTests.cpp",
- "tests/unit/FrameBuilderTests.cpp",
- "tests/unit/GlopBuilderTests.cpp",
"tests/unit/GpuMemoryTrackerTests.cpp",
- "tests/unit/GradientCacheTests.cpp",
"tests/unit/GraphicsStatsServiceTests.cpp",
"tests/unit/LayerUpdateQueueTests.cpp",
- "tests/unit/LeakCheckTests.cpp",
"tests/unit/LinearAllocatorTests.cpp",
"tests/unit/MatrixTests.cpp",
- "tests/unit/MeshStateTests.cpp",
- "tests/unit/OffscreenBufferPoolTests.cpp",
- "tests/unit/OpDumperTests.cpp",
"tests/unit/PathInterpolatorTests.cpp",
"tests/unit/RenderNodeDrawableTests.cpp",
- "tests/unit/RecordingCanvasTests.cpp",
"tests/unit/RenderNodeTests.cpp",
"tests/unit/RenderPropertiesTests.cpp",
"tests/unit/ShaderCacheTests.cpp",
@@ -381,8 +335,6 @@ cc_test {
"tests/unit/SnapshotTests.cpp",
"tests/unit/StringUtilsTests.cpp",
"tests/unit/TestUtilsTests.cpp",
- "tests/unit/TextDropShadowCacheTests.cpp",
- "tests/unit/TextureCacheTests.cpp",
"tests/unit/ThreadBaseTests.cpp",
"tests/unit/TypefaceTests.cpp",
"tests/unit/VectorDrawableTests.cpp",
@@ -431,12 +383,9 @@ cc_benchmark {
srcs: [
"tests/microbench/main.cpp",
"tests/microbench/DisplayListCanvasBench.cpp",
- "tests/microbench/FontBench.cpp",
- "tests/microbench/FrameBuilderBench.cpp",
"tests/microbench/LinearAllocatorBench.cpp",
"tests/microbench/PathParserBench.cpp",
"tests/microbench/RenderNodeBench.cpp",
- "tests/microbench/ShadowBench.cpp",
"tests/microbench/TaskManagerBench.cpp",
],
}
diff --git a/libs/hwui/Animator.h b/libs/hwui/Animator.h
index 42f4cf8828bd..ed7b6eb1cf4a 100644
--- a/libs/hwui/Animator.h
+++ b/libs/hwui/Animator.h
@@ -16,6 +16,8 @@
#ifndef ANIMATOR_H
#define ANIMATOR_H
+#include "CanvasProperty.h"
+
#include <cutils/compiler.h>
#include <utils/RefBase.h>
#include <utils/StrongPointer.h>
@@ -31,8 +33,6 @@ namespace uirenderer {
class AnimationContext;
class BaseRenderNodeAnimator;
-class CanvasPropertyPrimitive;
-class CanvasPropertyPaint;
class Interpolator;
class RenderNode;
class RenderProperties;
diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp
deleted file mode 100644
index f78cb418c5cd..000000000000
--- a/libs/hwui/BakedOpDispatcher.cpp
+++ /dev/null
@@ -1,879 +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.
- */
-
-#include "BakedOpDispatcher.h"
-
-#include "BakedOpRenderer.h"
-#include "Caches.h"
-#include "DeferredLayerUpdater.h"
-#include "Glop.h"
-#include "GlopBuilder.h"
-#include "Patch.h"
-#include "PathTessellator.h"
-#include "VertexBuffer.h"
-#include "renderstate/OffscreenBufferPool.h"
-#include "renderstate/RenderState.h"
-#include "utils/GLUtils.h"
-
-#include <SkPaintDefaults.h>
-#include <SkPathOps.h>
-#include <math.h>
-#include <algorithm>
-
-namespace android {
-namespace uirenderer {
-
-static void storeTexturedRect(TextureVertex* vertices, const Rect& bounds) {
- vertices[0] = {bounds.left, bounds.top, 0, 0};
- vertices[1] = {bounds.right, bounds.top, 1, 0};
- vertices[2] = {bounds.left, bounds.bottom, 0, 1};
- vertices[3] = {bounds.right, bounds.bottom, 1, 1};
-}
-
-void BakedOpDispatcher::onMergedBitmapOps(BakedOpRenderer& renderer,
- const MergedBakedOpList& opList) {
- const BakedOpState& firstState = *(opList.states[0]);
- Bitmap* bitmap = (static_cast<const BitmapOp*>(opList.states[0]->op))->bitmap;
-
- Texture* texture = renderer.caches().textureCache.get(bitmap);
- if (!texture) return;
- const AutoTexture autoCleanup(texture);
-
- TextureVertex vertices[opList.count * 4];
- for (size_t i = 0; i < opList.count; i++) {
- const BakedOpState& state = *(opList.states[i]);
- TextureVertex* rectVerts = &vertices[i * 4];
-
- // calculate unclipped bounds, since they'll determine texture coordinates
- Rect opBounds = state.op->unmappedBounds;
- state.computedState.transform.mapRect(opBounds);
- if (CC_LIKELY(state.computedState.transform.isPureTranslate())) {
- // pure translate, so snap (same behavior as onBitmapOp)
- opBounds.snapToPixelBoundaries();
- }
- storeTexturedRect(rectVerts, opBounds);
- renderer.dirtyRenderTarget(opBounds);
- }
-
- const int textureFillFlags = (bitmap->colorType() == kAlpha_8_SkColorType)
- ? TextureFillFlags::IsAlphaMaskTexture
- : TextureFillFlags::None;
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(firstState.roundRectClipState)
- .setMeshTexturedIndexedQuads(vertices, opList.count * 6)
- .setFillTexturePaint(*texture, textureFillFlags, firstState.op->paint, firstState.alpha)
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewIdentityEmptyBounds()
- .build();
- ClipRect renderTargetClip(opList.clip);
- const ClipBase* clip = opList.clipSideFlags ? &renderTargetClip : nullptr;
- renderer.renderGlop(nullptr, clip, glop);
-}
-
-void BakedOpDispatcher::onMergedPatchOps(BakedOpRenderer& renderer,
- const MergedBakedOpList& opList) {
- const PatchOp& firstOp = *(static_cast<const PatchOp*>(opList.states[0]->op));
- const BakedOpState& firstState = *(opList.states[0]);
-
- // Batches will usually contain a small number of items so it's
- // worth performing a first iteration to count the exact number
- // of vertices we need in the new mesh
- uint32_t totalVertices = 0;
-
- for (size_t i = 0; i < opList.count; i++) {
- const PatchOp& op = *(static_cast<const PatchOp*>(opList.states[i]->op));
-
- // TODO: cache mesh lookups
- const Patch* opMesh = renderer.caches().patchCache.get(
- op.bitmap->width(), op.bitmap->height(), op.unmappedBounds.getWidth(),
- op.unmappedBounds.getHeight(), op.patch);
- totalVertices += opMesh->verticesCount;
- }
-
- const bool dirtyRenderTarget = renderer.offscreenRenderTarget();
-
- uint32_t indexCount = 0;
-
- TextureVertex vertices[totalVertices];
- TextureVertex* vertex = &vertices[0];
- // Create a mesh that contains the transformed vertices for all the
- // 9-patch objects that are part of the batch. Note that onDefer()
- // enforces ops drawn by this function to have a pure translate or
- // identity matrix
- for (size_t i = 0; i < opList.count; i++) {
- const PatchOp& op = *(static_cast<const PatchOp*>(opList.states[i]->op));
- const BakedOpState& state = *opList.states[i];
-
- // TODO: cache mesh lookups
- const Patch* opMesh = renderer.caches().patchCache.get(
- op.bitmap->width(), op.bitmap->height(), op.unmappedBounds.getWidth(),
- op.unmappedBounds.getHeight(), op.patch);
-
- uint32_t vertexCount = opMesh->verticesCount;
- if (vertexCount == 0) continue;
-
- // We use the bounds to know where to translate our vertices
- // Using patchOp->state.mBounds wouldn't work because these
- // bounds are clipped
- const float tx = floorf(state.computedState.transform.getTranslateX() +
- op.unmappedBounds.left + 0.5f);
- const float ty = floorf(state.computedState.transform.getTranslateY() +
- op.unmappedBounds.top + 0.5f);
-
- // Copy & transform all the vertices for the current operation
- TextureVertex* opVertices = opMesh->vertices.get();
- for (uint32_t j = 0; j < vertexCount; j++, opVertices++) {
- TextureVertex::set(vertex++, opVertices->x + tx, opVertices->y + ty, opVertices->u,
- opVertices->v);
- }
-
- // Dirty the current layer if possible. When the 9-patch does not
- // contain empty quads we can take a shortcut and simply set the
- // dirty rect to the object's bounds.
- if (dirtyRenderTarget) {
- if (!opMesh->hasEmptyQuads) {
- renderer.dirtyRenderTarget(Rect(tx, ty, tx + op.unmappedBounds.getWidth(),
- ty + op.unmappedBounds.getHeight()));
- } else {
- const size_t count = opMesh->quads.size();
- for (size_t i = 0; i < count; i++) {
- const Rect& quadBounds = opMesh->quads[i];
- const float x = tx + quadBounds.left;
- const float y = ty + quadBounds.top;
- renderer.dirtyRenderTarget(
- Rect(x, y, x + quadBounds.getWidth(), y + quadBounds.getHeight()));
- }
- }
- }
-
- indexCount += opMesh->indexCount;
- }
-
- Texture* texture = renderer.caches().textureCache.get(firstOp.bitmap);
- if (!texture) return;
- const AutoTexture autoCleanup(texture);
-
- // 9 patches are built for stretching - always filter
- int textureFillFlags = TextureFillFlags::ForceFilter;
- if (firstOp.bitmap->colorType() == kAlpha_8_SkColorType) {
- textureFillFlags |= TextureFillFlags::IsAlphaMaskTexture;
- }
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(firstState.roundRectClipState)
- .setMeshTexturedIndexedQuads(vertices, indexCount)
- .setFillTexturePaint(*texture, textureFillFlags, firstOp.paint, firstState.alpha)
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewIdentityEmptyBounds()
- .build();
- ClipRect renderTargetClip(opList.clip);
- const ClipBase* clip = opList.clipSideFlags ? &renderTargetClip : nullptr;
- renderer.renderGlop(nullptr, clip, glop);
-}
-
-static void renderTextShadow(BakedOpRenderer& renderer, const TextOp& op,
- const BakedOpState& textOpState) {
- if (CC_LIKELY(!PaintUtils::hasTextShadow(op.paint))) return;
-
- FontRenderer& fontRenderer = renderer.caches().fontRenderer.getFontRenderer();
- fontRenderer.setFont(op.paint, SkMatrix::I());
- renderer.caches().textureState().activateTexture(0);
-
- PaintUtils::TextShadow textShadow;
- if (!PaintUtils::getTextShadow(op.paint, &textShadow)) {
- LOG_ALWAYS_FATAL("failed to query shadow attributes");
- }
-
- renderer.caches().dropShadowCache.setFontRenderer(fontRenderer);
- ShadowTexture* texture = renderer.caches().dropShadowCache.get(
- op.paint, op.glyphs, op.glyphCount, textShadow.radius, op.positions);
- // If the drop shadow exceeds the max texture size or couldn't be
- // allocated, skip drawing
- if (!texture) return;
- const AutoTexture autoCleanup(texture);
-
- const float sx = op.x - texture->left + textShadow.dx;
- const float sy = op.y - texture->top + textShadow.dy;
-
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(textOpState.roundRectClipState)
- .setMeshTexturedUnitQuad(nullptr)
- .setFillShadowTexturePaint(*texture, textShadow.color, *op.paint, textOpState.alpha)
- .setTransform(textOpState.computedState.transform, TransformFlags::None)
- .setModelViewMapUnitToRect(Rect(sx, sy, sx + texture->width(), sy + texture->height()))
- .build();
-
- // Compute damage bounds and clip (since may differ from those in textOpState).
- // Bounds should be same as text op, but with dx/dy offset and radius outset
- // applied in local space.
- auto& transform = textOpState.computedState.transform;
- Rect shadowBounds = op.unmappedBounds; // STROKE
- const bool expandForStroke = op.paint->getStyle() != SkPaint::kFill_Style;
- if (expandForStroke) {
- shadowBounds.outset(op.paint->getStrokeWidth() * 0.5f);
- }
- shadowBounds.translate(textShadow.dx, textShadow.dy);
- shadowBounds.outset(textShadow.radius, textShadow.radius);
- transform.mapRect(shadowBounds);
- if (CC_UNLIKELY(expandForStroke &&
- (!transform.isPureTranslate() || op.paint->getStrokeWidth() < 1.0f))) {
- shadowBounds.outset(0.5f);
- }
-
- auto clipState = textOpState.computedState.clipState;
- if (clipState->mode != ClipMode::Rectangle || !clipState->rect.contains(shadowBounds)) {
- // need clip, so pass it and clip bounds
- shadowBounds.doIntersect(clipState->rect);
- } else {
- // don't need clip, ignore
- clipState = nullptr;
- }
-
- renderer.renderGlop(&shadowBounds, clipState, glop);
-}
-
-enum class TextRenderType { Defer, Flush };
-
-static void renderText(BakedOpRenderer& renderer, const TextOp& op, const BakedOpState& state,
- const ClipBase* renderClip, TextRenderType renderType) {
- FontRenderer& fontRenderer = renderer.caches().fontRenderer.getFontRenderer();
- float x = op.x;
- float y = op.y;
- const Matrix4& transform = state.computedState.transform;
- const bool pureTranslate = transform.isPureTranslate();
- if (CC_LIKELY(pureTranslate)) {
- x = floorf(x + transform.getTranslateX() + 0.5f);
- y = floorf(y + transform.getTranslateY() + 0.5f);
- fontRenderer.setFont(op.paint, SkMatrix::I());
- fontRenderer.setTextureFiltering(false);
- } else if (CC_UNLIKELY(transform.isPerspective())) {
- fontRenderer.setFont(op.paint, SkMatrix::I());
- fontRenderer.setTextureFiltering(true);
- } else {
- // We only pass a partial transform to the font renderer. That partial
- // matrix defines how glyphs are rasterized. Typically we want glyphs
- // to be rasterized at their final size on screen, which means the partial
- // matrix needs to take the scale factor into account.
- // When a partial matrix is used to transform glyphs during rasterization,
- // the mesh is generated with the inverse transform (in the case of scale,
- // the mesh is generated at 1.0 / scale for instance.) This allows us to
- // apply the full transform matrix at draw time in the vertex shader.
- // Applying the full matrix in the shader is the easiest way to handle
- // rotation and perspective and allows us to always generated quads in the
- // font renderer which greatly simplifies the code, clipping in particular.
- float sx, sy;
- transform.decomposeScale(sx, sy);
- fontRenderer.setFont(op.paint, SkMatrix::MakeScale(roundf(std::max(1.0f, sx)),
- roundf(std::max(1.0f, sy))));
- fontRenderer.setTextureFiltering(true);
- }
- Rect layerBounds(FLT_MAX / 2.0f, FLT_MAX / 2.0f, FLT_MIN / 2.0f, FLT_MIN / 2.0f);
-
- int alpha = PaintUtils::getAlphaDirect(op.paint) * state.alpha;
- SkBlendMode mode = PaintUtils::getBlendModeDirect(op.paint);
- TextDrawFunctor functor(&renderer, &state, renderClip, x, y, pureTranslate, alpha, mode,
- op.paint);
-
- bool forceFinish = (renderType == TextRenderType::Flush);
- bool mustDirtyRenderTarget = renderer.offscreenRenderTarget();
- const Rect* localOpClip = pureTranslate ? &state.computedState.clipRect() : nullptr;
- fontRenderer.renderPosText(op.paint, localOpClip, op.glyphs, op.glyphCount, x, y, op.positions,
- mustDirtyRenderTarget ? &layerBounds : nullptr, &functor,
- forceFinish);
-
- if (mustDirtyRenderTarget) {
- if (!pureTranslate) {
- transform.mapRect(layerBounds);
- }
- renderer.dirtyRenderTarget(layerBounds);
- }
-}
-
-void BakedOpDispatcher::onMergedTextOps(BakedOpRenderer& renderer,
- const MergedBakedOpList& opList) {
- for (size_t i = 0; i < opList.count; i++) {
- const BakedOpState& state = *(opList.states[i]);
- const TextOp& op = *(static_cast<const TextOp*>(state.op));
- renderTextShadow(renderer, op, state);
- }
-
- ClipRect renderTargetClip(opList.clip);
- const ClipBase* clip = opList.clipSideFlags ? &renderTargetClip : nullptr;
- for (size_t i = 0; i < opList.count; i++) {
- const BakedOpState& state = *(opList.states[i]);
- const TextOp& op = *(static_cast<const TextOp*>(state.op));
- TextRenderType renderType =
- (i + 1 == opList.count) ? TextRenderType::Flush : TextRenderType::Defer;
- renderText(renderer, op, state, clip, renderType);
- }
-}
-
-namespace VertexBufferRenderFlags {
-enum {
- Offset = 0x1,
- ShadowInterp = 0x2,
-};
-}
-
-static void renderVertexBuffer(BakedOpRenderer& renderer, const BakedOpState& state,
- const VertexBuffer& vertexBuffer, float translateX, float translateY,
- const SkPaint& paint, int vertexBufferRenderFlags) {
- if (CC_LIKELY(vertexBuffer.getVertexCount())) {
- bool shadowInterp = vertexBufferRenderFlags & VertexBufferRenderFlags::ShadowInterp;
- const int transformFlags = vertexBufferRenderFlags & VertexBufferRenderFlags::Offset
- ? TransformFlags::OffsetByFudgeFactor
- : 0;
-
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshVertexBuffer(vertexBuffer)
- .setFillPaint(paint, state.alpha, shadowInterp)
- .setTransform(state.computedState.transform, transformFlags)
- .setModelViewOffsetRect(translateX, translateY, vertexBuffer.getBounds())
- .build();
- renderer.renderGlop(state, glop);
- }
-}
-
-static void renderConvexPath(BakedOpRenderer& renderer, const BakedOpState& state,
- const SkPath& path, const SkPaint& paint) {
- VertexBuffer vertexBuffer;
- // TODO: try clipping large paths to viewport
- PathTessellator::tessellatePath(path, &paint, state.computedState.transform, vertexBuffer);
- renderVertexBuffer(renderer, state, vertexBuffer, 0.0f, 0.0f, paint, 0);
-}
-
-static void renderPathTexture(BakedOpRenderer& renderer, const BakedOpState& state, float xOffset,
- float yOffset, PathTexture& texture, const SkPaint& paint) {
- Rect dest(texture.width(), texture.height());
- dest.translate(xOffset + texture.left - texture.offset, yOffset + texture.top - texture.offset);
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshTexturedUnitQuad(nullptr)
- .setFillPathTexturePaint(texture, paint, state.alpha)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewMapUnitToRect(dest)
- .build();
- renderer.renderGlop(state, glop);
-}
-
-SkRect getBoundsOfFill(const RecordedOp& op) {
- SkRect bounds = op.unmappedBounds.toSkRect();
- if (op.paint->getStyle() == SkPaint::kStrokeAndFill_Style) {
- float outsetDistance = op.paint->getStrokeWidth() / 2;
- bounds.outset(outsetDistance, outsetDistance);
- }
- return bounds;
-}
-
-void BakedOpDispatcher::onArcOp(BakedOpRenderer& renderer, const ArcOp& op,
- const BakedOpState& state) {
- // TODO: support fills (accounting for concavity if useCenter && sweepAngle > 180)
- if (op.paint->getStyle() != SkPaint::kStroke_Style || op.paint->getPathEffect() != nullptr ||
- op.useCenter) {
- PathTexture* texture = renderer.caches().pathCache.getArc(
- op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.startAngle,
- op.sweepAngle, op.useCenter, op.paint);
- const AutoTexture holder(texture);
- if (CC_LIKELY(holder.texture)) {
- renderPathTexture(renderer, state, op.unmappedBounds.left, op.unmappedBounds.top,
- *texture, *(op.paint));
- }
- } else {
- SkRect rect = getBoundsOfFill(op);
- SkPath path;
- if (op.useCenter) {
- path.moveTo(rect.centerX(), rect.centerY());
- }
- path.arcTo(rect, op.startAngle, op.sweepAngle, !op.useCenter);
- if (op.useCenter) {
- path.close();
- }
- renderConvexPath(renderer, state, path, *(op.paint));
- }
-}
-
-void BakedOpDispatcher::onBitmapOp(BakedOpRenderer& renderer, const BitmapOp& op,
- const BakedOpState& state) {
- Texture* texture = renderer.getTexture(op.bitmap);
- if (!texture) return;
- const AutoTexture autoCleanup(texture);
-
- const int textureFillFlags = (op.bitmap->colorType() == kAlpha_8_SkColorType)
- ? TextureFillFlags::IsAlphaMaskTexture
- : TextureFillFlags::None;
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshTexturedUnitQuad(texture->uvMapper)
- .setFillTexturePaint(*texture, textureFillFlags, op.paint, state.alpha)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewMapUnitToRectSnap(Rect(texture->width(), texture->height()))
- .build();
- renderer.renderGlop(state, glop);
-}
-
-void BakedOpDispatcher::onBitmapMeshOp(BakedOpRenderer& renderer, const BitmapMeshOp& op,
- const BakedOpState& state) {
- Texture* texture = renderer.caches().textureCache.get(op.bitmap);
- if (!texture) {
- return;
- }
- const AutoTexture autoCleanup(texture);
-
- const uint32_t elementCount = op.meshWidth * op.meshHeight * 6;
-
- std::unique_ptr<ColorTextureVertex[]> mesh(new ColorTextureVertex[elementCount]);
- ColorTextureVertex* vertex = &mesh[0];
-
- const int* colors = op.colors;
- std::unique_ptr<int[]> tempColors;
- if (!colors) {
- uint32_t colorsCount = (op.meshWidth + 1) * (op.meshHeight + 1);
- tempColors.reset(new int[colorsCount]);
- memset(tempColors.get(), 0xff, colorsCount * sizeof(int));
- colors = tempColors.get();
- }
-
- for (int32_t y = 0; y < op.meshHeight; y++) {
- for (int32_t x = 0; x < op.meshWidth; x++) {
- uint32_t i = (y * (op.meshWidth + 1) + x) * 2;
-
- float u1 = float(x) / op.meshWidth;
- float u2 = float(x + 1) / op.meshWidth;
- float v1 = float(y) / op.meshHeight;
- float v2 = float(y + 1) / op.meshHeight;
-
- int ax = i + (op.meshWidth + 1) * 2;
- int ay = ax + 1;
- int bx = i;
- int by = bx + 1;
- int cx = i + 2;
- int cy = cx + 1;
- int dx = i + (op.meshWidth + 1) * 2 + 2;
- int dy = dx + 1;
-
- const float* vertices = op.vertices;
- ColorTextureVertex::set(vertex++, vertices[dx], vertices[dy], u2, v2, colors[dx / 2]);
- ColorTextureVertex::set(vertex++, vertices[ax], vertices[ay], u1, v2, colors[ax / 2]);
- ColorTextureVertex::set(vertex++, vertices[bx], vertices[by], u1, v1, colors[bx / 2]);
-
- ColorTextureVertex::set(vertex++, vertices[dx], vertices[dy], u2, v2, colors[dx / 2]);
- ColorTextureVertex::set(vertex++, vertices[bx], vertices[by], u1, v1, colors[bx / 2]);
- ColorTextureVertex::set(vertex++, vertices[cx], vertices[cy], u2, v1, colors[cx / 2]);
- }
- }
-
- /*
- * TODO: handle alpha_8 textures correctly by applying paint color, but *not*
- * shader in that case to mimic the behavior in SkiaCanvas::drawBitmapMesh.
- */
- const int textureFillFlags = TextureFillFlags::None;
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshColoredTexturedMesh(mesh.get(), elementCount)
- .setFillTexturePaint(*texture, textureFillFlags, op.paint, state.alpha)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewOffsetRect(0, 0, op.unmappedBounds)
- .build();
- renderer.renderGlop(state, glop);
-}
-
-void BakedOpDispatcher::onBitmapRectOp(BakedOpRenderer& renderer, const BitmapRectOp& op,
- const BakedOpState& state) {
- Texture* texture = renderer.getTexture(op.bitmap);
- if (!texture) return;
- const AutoTexture autoCleanup(texture);
-
- Rect uv(std::max(0.0f, op.src.left / texture->width()),
- std::max(0.0f, op.src.top / texture->height()),
- std::min(1.0f, op.src.right / texture->width()),
- std::min(1.0f, op.src.bottom / texture->height()));
-
- const int textureFillFlags = (op.bitmap->colorType() == kAlpha_8_SkColorType)
- ? TextureFillFlags::IsAlphaMaskTexture
- : TextureFillFlags::None;
- const bool tryToSnap = MathUtils::areEqual(op.src.getWidth(), op.unmappedBounds.getWidth()) &&
- MathUtils::areEqual(op.src.getHeight(), op.unmappedBounds.getHeight());
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshTexturedUvQuad(texture->uvMapper, uv)
- .setFillTexturePaint(*texture, textureFillFlags, op.paint, state.alpha)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewMapUnitToRectOptionalSnap(tryToSnap, op.unmappedBounds)
- .build();
- renderer.renderGlop(state, glop);
-}
-
-void BakedOpDispatcher::onColorOp(BakedOpRenderer& renderer, const ColorOp& op,
- const BakedOpState& state) {
- SkPaint paint;
- paint.setColor(op.color);
- paint.setBlendMode(op.mode);
-
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshUnitQuad()
- .setFillPaint(paint, state.alpha)
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewMapUnitToRect(state.computedState.clipState->rect)
- .build();
- renderer.renderGlop(state, glop);
-}
-
-void BakedOpDispatcher::onFunctorOp(BakedOpRenderer& renderer, const FunctorOp& op,
- const BakedOpState& state) {
- renderer.renderFunctor(op, state);
-}
-
-void BakedOpDispatcher::onLinesOp(BakedOpRenderer& renderer, const LinesOp& op,
- const BakedOpState& state) {
- VertexBuffer buffer;
- PathTessellator::tessellateLines(op.points, op.floatCount, op.paint,
- state.computedState.transform, buffer);
- int displayFlags = op.paint->isAntiAlias() ? 0 : VertexBufferRenderFlags::Offset;
- renderVertexBuffer(renderer, state, buffer, 0, 0, *(op.paint), displayFlags);
-}
-
-void BakedOpDispatcher::onOvalOp(BakedOpRenderer& renderer, const OvalOp& op,
- const BakedOpState& state) {
- if (op.paint->getPathEffect() != nullptr) {
- PathTexture* texture = renderer.caches().pathCache.getOval(
- op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.paint);
- const AutoTexture holder(texture);
- if (CC_LIKELY(holder.texture)) {
- renderPathTexture(renderer, state, op.unmappedBounds.left, op.unmappedBounds.top,
- *texture, *(op.paint));
- }
- } else {
- SkPath path;
- SkRect rect = getBoundsOfFill(op);
- path.addOval(rect);
-
- if (state.computedState.localProjectionPathMask != nullptr) {
- // Mask the ripple path by the local space projection mask in local space.
- // Note that this can create CCW paths.
- Op(path, *state.computedState.localProjectionPathMask, kIntersect_SkPathOp, &path);
- }
- renderConvexPath(renderer, state, path, *(op.paint));
- }
-}
-
-void BakedOpDispatcher::onPatchOp(BakedOpRenderer& renderer, const PatchOp& op,
- const BakedOpState& state) {
- // 9 patches are built for stretching - always filter
- int textureFillFlags = TextureFillFlags::ForceFilter;
- if (op.bitmap->colorType() == kAlpha_8_SkColorType) {
- textureFillFlags |= TextureFillFlags::IsAlphaMaskTexture;
- }
-
- // TODO: avoid redoing the below work each frame:
- const Patch* mesh = renderer.caches().patchCache.get(op.bitmap->width(), op.bitmap->height(),
- op.unmappedBounds.getWidth(),
- op.unmappedBounds.getHeight(), op.patch);
-
- Texture* texture = renderer.caches().textureCache.get(op.bitmap);
- if (CC_LIKELY(texture)) {
- const AutoTexture autoCleanup(texture);
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshPatchQuads(*mesh)
- .setFillTexturePaint(*texture, textureFillFlags, op.paint, state.alpha)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewOffsetRectSnap(
- op.unmappedBounds.left, op.unmappedBounds.top,
- Rect(op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight()))
- .build();
- renderer.renderGlop(state, glop);
- }
-}
-
-void BakedOpDispatcher::onPathOp(BakedOpRenderer& renderer, const PathOp& op,
- const BakedOpState& state) {
- PathTexture* texture = renderer.caches().pathCache.get(op.path, op.paint);
- const AutoTexture holder(texture);
- if (CC_LIKELY(holder.texture)) {
- // Unlike other callers to renderPathTexture, no offsets are used because PathOp doesn't
- // have any translate built in, other than what's in the SkPath itself
- renderPathTexture(renderer, state, 0, 0, *texture, *(op.paint));
- }
-}
-
-void BakedOpDispatcher::onPointsOp(BakedOpRenderer& renderer, const PointsOp& op,
- const BakedOpState& state) {
- VertexBuffer buffer;
- PathTessellator::tessellatePoints(op.points, op.floatCount, op.paint,
- state.computedState.transform, buffer);
- int displayFlags = op.paint->isAntiAlias() ? 0 : VertexBufferRenderFlags::Offset;
- renderVertexBuffer(renderer, state, buffer, 0, 0, *(op.paint), displayFlags);
-}
-
-// See SkPaintDefaults.h
-#define SkPaintDefaults_MiterLimit SkIntToScalar(4)
-
-void BakedOpDispatcher::onRectOp(BakedOpRenderer& renderer, const RectOp& op,
- const BakedOpState& state) {
- if (op.paint->getStyle() != SkPaint::kFill_Style) {
- // only fill + default miter is supported by drawConvexPath, since others must handle joins
- static_assert(SkPaintDefaults_MiterLimit == 4.0f, "Miter limit has changed");
- if (CC_UNLIKELY(op.paint->getPathEffect() != nullptr ||
- op.paint->getStrokeJoin() != SkPaint::kMiter_Join ||
- op.paint->getStrokeMiter() != SkPaintDefaults_MiterLimit)) {
- PathTexture* texture = renderer.caches().pathCache.getRect(
- op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.paint);
- const AutoTexture holder(texture);
- if (CC_LIKELY(holder.texture)) {
- renderPathTexture(renderer, state, op.unmappedBounds.left, op.unmappedBounds.top,
- *texture, *(op.paint));
- }
- } else {
- SkPath path;
- path.addRect(getBoundsOfFill(op));
- renderConvexPath(renderer, state, path, *(op.paint));
- }
- } else {
- if (op.paint->isAntiAlias() && !state.computedState.transform.isSimple()) {
- SkPath path;
- path.addRect(op.unmappedBounds.toSkRect());
- renderConvexPath(renderer, state, path, *(op.paint));
- } else {
- // render simple unit quad, no tessellation required
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshUnitQuad()
- .setFillPaint(*op.paint, state.alpha)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewMapUnitToRect(op.unmappedBounds)
- .build();
- renderer.renderGlop(state, glop);
- }
- }
-}
-
-void BakedOpDispatcher::onRoundRectOp(BakedOpRenderer& renderer, const RoundRectOp& op,
- const BakedOpState& state) {
- if (op.paint->getPathEffect() != nullptr) {
- PathTexture* texture = renderer.caches().pathCache.getRoundRect(
- op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight(), op.rx, op.ry,
- op.paint);
- const AutoTexture holder(texture);
- if (CC_LIKELY(holder.texture)) {
- renderPathTexture(renderer, state, op.unmappedBounds.left, op.unmappedBounds.top,
- *texture, *(op.paint));
- }
- } else {
- const VertexBuffer* buffer = renderer.caches().tessellationCache.getRoundRect(
- state.computedState.transform, *(op.paint), op.unmappedBounds.getWidth(),
- op.unmappedBounds.getHeight(), op.rx, op.ry);
- renderVertexBuffer(renderer, state, *buffer, op.unmappedBounds.left, op.unmappedBounds.top,
- *(op.paint), 0);
- }
-}
-
-static void renderShadow(BakedOpRenderer& renderer, const BakedOpState& state, float casterAlpha,
- const VertexBuffer* ambientShadowVertexBuffer,
- const VertexBuffer* spotShadowVertexBuffer) {
- SkPaint paint;
- paint.setAntiAlias(true); // want to use AlphaVertex
-
- // The caller has made sure casterAlpha > 0.
- uint8_t ambientShadowAlpha = renderer.getLightInfo().ambientShadowAlpha;
- if (CC_UNLIKELY(Properties::overrideAmbientShadowStrength >= 0)) {
- ambientShadowAlpha = Properties::overrideAmbientShadowStrength;
- }
- if (ambientShadowVertexBuffer && ambientShadowAlpha > 0) {
- paint.setAlpha((uint8_t)(casterAlpha * ambientShadowAlpha));
- renderVertexBuffer(renderer, state, *ambientShadowVertexBuffer, 0, 0, paint,
- VertexBufferRenderFlags::ShadowInterp);
- }
-
- uint8_t spotShadowAlpha = renderer.getLightInfo().spotShadowAlpha;
- if (CC_UNLIKELY(Properties::overrideSpotShadowStrength >= 0)) {
- spotShadowAlpha = Properties::overrideSpotShadowStrength;
- }
- if (spotShadowVertexBuffer && spotShadowAlpha > 0) {
- paint.setAlpha((uint8_t)(casterAlpha * spotShadowAlpha));
- renderVertexBuffer(renderer, state, *spotShadowVertexBuffer, 0, 0, paint,
- VertexBufferRenderFlags::ShadowInterp);
- }
-}
-
-void BakedOpDispatcher::onShadowOp(BakedOpRenderer& renderer, const ShadowOp& op,
- const BakedOpState& state) {
- TessellationCache::vertexBuffer_pair_t buffers = op.shadowTask->getResult();
- renderShadow(renderer, state, op.casterAlpha, buffers.first, buffers.second);
-}
-
-void BakedOpDispatcher::onSimpleRectsOp(BakedOpRenderer& renderer, const SimpleRectsOp& op,
- const BakedOpState& state) {
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshIndexedQuads(&op.vertices[0], op.vertexCount / 4)
- .setFillPaint(*op.paint, state.alpha)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewOffsetRect(0, 0, op.unmappedBounds)
- .build();
- renderer.renderGlop(state, glop);
-}
-
-void BakedOpDispatcher::onTextOp(BakedOpRenderer& renderer, const TextOp& op,
- const BakedOpState& state) {
- renderTextShadow(renderer, op, state);
- renderText(renderer, op, state, state.computedState.getClipIfNeeded(), TextRenderType::Flush);
-}
-
-void BakedOpDispatcher::onTextOnPathOp(BakedOpRenderer& renderer, const TextOnPathOp& op,
- const BakedOpState& state) {
- // Note: can't trust clipSideFlags since we record with unmappedBounds == clip.
- // TODO: respect clipSideFlags, once we record with bounds
- auto renderTargetClip = state.computedState.clipState;
-
- FontRenderer& fontRenderer = renderer.caches().fontRenderer.getFontRenderer();
- fontRenderer.setFont(op.paint, SkMatrix::I());
- fontRenderer.setTextureFiltering(true);
-
- Rect layerBounds(FLT_MAX / 2.0f, FLT_MAX / 2.0f, FLT_MIN / 2.0f, FLT_MIN / 2.0f);
-
- int alpha = PaintUtils::getAlphaDirect(op.paint) * state.alpha;
- SkBlendMode mode = PaintUtils::getBlendModeDirect(op.paint);
- TextDrawFunctor functor(&renderer, &state, renderTargetClip, 0.0f, 0.0f, false, alpha, mode,
- op.paint);
-
- bool mustDirtyRenderTarget = renderer.offscreenRenderTarget();
- const Rect localSpaceClip = state.computedState.computeLocalSpaceClip();
- if (fontRenderer.renderTextOnPath(op.paint, &localSpaceClip, op.glyphs, op.glyphCount, op.path,
- op.hOffset, op.vOffset,
- mustDirtyRenderTarget ? &layerBounds : nullptr, &functor)) {
- if (mustDirtyRenderTarget) {
- // manually dirty render target, since TextDrawFunctor won't
- state.computedState.transform.mapRect(layerBounds);
- renderer.dirtyRenderTarget(layerBounds);
- }
- }
-}
-
-void BakedOpDispatcher::onTextureLayerOp(BakedOpRenderer& renderer, const TextureLayerOp& op,
- const BakedOpState& state) {
- GlLayer* layer = static_cast<GlLayer*>(op.layerHandle->backingLayer());
- if (!layer) {
- return;
- }
- const bool tryToSnap = layer->getForceFilter();
- float alpha = (layer->getAlpha() / 255.0f) * state.alpha;
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshTexturedUvQuad(nullptr, Rect(0, 1, 1, 0)) // TODO: simplify with VBO
- .setFillTextureLayer(*(layer), alpha)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewMapUnitToRectOptionalSnap(tryToSnap,
- Rect(layer->getWidth(), layer->getHeight()))
- .build();
- renderer.renderGlop(state, glop);
-}
-
-void renderRectForLayer(BakedOpRenderer& renderer, const LayerOp& op, const BakedOpState& state,
- int color, SkBlendMode mode, SkColorFilter* colorFilter) {
- SkPaint paint;
- paint.setColor(color);
- paint.setBlendMode(mode);
- paint.setColorFilter(sk_ref_sp(colorFilter));
- RectOp rectOp(op.unmappedBounds, op.localMatrix, op.localClip, &paint);
- BakedOpDispatcher::onRectOp(renderer, rectOp, state);
-}
-
-void BakedOpDispatcher::onLayerOp(BakedOpRenderer& renderer, const LayerOp& op,
- const BakedOpState& state) {
- // Note that we don't use op->paint in this function - it's never set on a LayerOp
- OffscreenBuffer* buffer = *op.layerHandle;
-
- if (CC_UNLIKELY(!buffer)) return;
-
- float layerAlpha = op.alpha * state.alpha;
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshTexturedIndexedVbo(buffer->vbo, buffer->elementCount)
- .setFillLayer(buffer->texture, op.colorFilter, layerAlpha, op.mode,
- Blend::ModeOrderSwap::NoSwap)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewOffsetRectSnap(
- op.unmappedBounds.left, op.unmappedBounds.top,
- Rect(op.unmappedBounds.getWidth(), op.unmappedBounds.getHeight()))
- .build();
- renderer.renderGlop(state, glop);
-
- if (!buffer->hasRenderedSinceRepaint) {
- buffer->hasRenderedSinceRepaint = true;
- if (CC_UNLIKELY(Properties::debugLayersUpdates)) {
- // render debug layer highlight
- renderRectForLayer(renderer, op, state, 0x7f00ff00, SkBlendMode::kSrcOver, nullptr);
- } else if (CC_UNLIKELY(Properties::debugOverdraw)) {
- // render transparent to increment overdraw for repaint area
- renderRectForLayer(renderer, op, state, SK_ColorTRANSPARENT, SkBlendMode::kSrcOver,
- nullptr);
- }
- }
-}
-
-void BakedOpDispatcher::onCopyToLayerOp(BakedOpRenderer& renderer, const CopyToLayerOp& op,
- const BakedOpState& state) {
- LOG_ALWAYS_FATAL_IF(*(op.layerHandle) != nullptr, "layer already exists!");
- *(op.layerHandle) = renderer.copyToLayer(state.computedState.clippedBounds);
- LOG_ALWAYS_FATAL_IF(*op.layerHandle == nullptr, "layer copy failed");
-}
-
-void BakedOpDispatcher::onCopyFromLayerOp(BakedOpRenderer& renderer, const CopyFromLayerOp& op,
- const BakedOpState& state) {
- LOG_ALWAYS_FATAL_IF(*op.layerHandle == nullptr, "no layer to draw underneath!");
- if (!state.computedState.clippedBounds.isEmpty()) {
- if (op.paint && op.paint->getAlpha() < 255) {
- SkPaint layerPaint;
- layerPaint.setAlpha(op.paint->getAlpha());
- layerPaint.setBlendMode(SkBlendMode::kDstIn);
- layerPaint.setColorFilter(sk_ref_sp(op.paint->getColorFilter()));
- RectOp rectOp(state.computedState.clippedBounds, Matrix4::identity(), nullptr,
- &layerPaint);
- BakedOpDispatcher::onRectOp(renderer, rectOp, state);
- }
-
- OffscreenBuffer& layer = **(op.layerHandle);
- auto mode = PaintUtils::getBlendModeDirect(op.paint);
- Glop glop;
- GlopBuilder(renderer.renderState(), renderer.caches(), &glop)
- .setRoundRectClipState(state.roundRectClipState)
- .setMeshTexturedUvQuad(nullptr, layer.getTextureCoordinates())
- .setFillLayer(layer.texture, nullptr, 1.0f, mode, Blend::ModeOrderSwap::Swap)
- .setTransform(state.computedState.transform, TransformFlags::None)
- .setModelViewMapUnitToRect(state.computedState.clippedBounds)
- .build();
- renderer.renderGlop(state, glop);
- }
- renderer.renderState().layerPool().putOrDelete(*op.layerHandle);
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/BakedOpDispatcher.h b/libs/hwui/BakedOpDispatcher.h
deleted file mode 100644
index e3708685afc9..000000000000
--- a/libs/hwui/BakedOpDispatcher.h
+++ /dev/null
@@ -1,52 +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.
- */
-
-#ifndef ANDROID_HWUI_BAKED_OP_DISPATCHER_H
-#define ANDROID_HWUI_BAKED_OP_DISPATCHER_H
-
-#include "BakedOpState.h"
-#include "RecordedOp.h"
-
-namespace android {
-namespace uirenderer {
-
-/**
- * Provides all "onBitmapOp(...)" style static methods for every op type, which convert the
- * RecordedOps and their state to Glops, and renders them with the provided BakedOpRenderer.
- *
- * onXXXOp methods must either render directly with the renderer, or call a static renderYYY
- * method to render content. There should never be draw content rejection in BakedOpDispatcher -
- * it must happen at a higher level (except in error-ish cases, like texture-too-big).
- */
-class BakedOpDispatcher {
-public:
-// Declares all "onMergedBitmapOps(...)" style methods for mergeable op types
-#define X(Type) \
- static void onMerged##Type##s(BakedOpRenderer& renderer, const MergedBakedOpList& opList);
- MAP_MERGEABLE_OPS(X)
-#undef X
-
-// Declares all "onBitmapOp(...)" style methods for every op type
-#define X(Type) \
- static void on##Type(BakedOpRenderer& renderer, const Type& op, const BakedOpState& state);
- MAP_RENDERABLE_OPS(X)
-#undef X
-};
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_BAKED_OP_DISPATCHER_H
diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp
deleted file mode 100644
index 6b64b94d291e..000000000000
--- a/libs/hwui/BakedOpRenderer.cpp
+++ /dev/null
@@ -1,383 +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.
- */
-
-#include "BakedOpRenderer.h"
-
-#include "Caches.h"
-#include "Glop.h"
-#include "GlopBuilder.h"
-#include "VertexBuffer.h"
-#include "renderstate/OffscreenBufferPool.h"
-#include "renderstate/RenderState.h"
-#include "utils/GLUtils.h"
-
-#include <algorithm>
-
-namespace android {
-namespace uirenderer {
-
-OffscreenBuffer* BakedOpRenderer::startTemporaryLayer(uint32_t width, uint32_t height) {
- LOG_ALWAYS_FATAL_IF(mRenderTarget.offscreenBuffer, "already has layer...");
-
- OffscreenBuffer* buffer =
- mRenderState.layerPool().get(mRenderState, width, height, mWideColorGamut);
- startRepaintLayer(buffer, Rect(width, height));
- return buffer;
-}
-
-void BakedOpRenderer::recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) {
- mRenderState.layerPool().putOrDelete(offscreenBuffer);
-}
-
-void BakedOpRenderer::startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) {
- LOG_ALWAYS_FATAL_IF(mRenderTarget.offscreenBuffer, "already has layer...");
-
- // subtract repaintRect from region, since it will be regenerated
- if (repaintRect.contains(0, 0, offscreenBuffer->viewportWidth,
- offscreenBuffer->viewportHeight)) {
- // repaint full layer, so throw away entire region
- offscreenBuffer->region.clear();
- } else {
- offscreenBuffer->region.subtractSelf(android::Rect(repaintRect.left, repaintRect.top,
- repaintRect.right, repaintRect.bottom));
- }
-
- mRenderTarget.offscreenBuffer = offscreenBuffer;
- mRenderTarget.offscreenBuffer->hasRenderedSinceRepaint = false;
-
- // create and bind framebuffer
- mRenderTarget.frameBufferId = mRenderState.createFramebuffer();
- mRenderState.bindFramebuffer(mRenderTarget.frameBufferId);
-
- // attach the texture to the FBO
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
- offscreenBuffer->texture.id(), 0);
- GL_CHECKPOINT(LOW);
-
- int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
- LOG_ALWAYS_FATAL_IF(status != GL_FRAMEBUFFER_COMPLETE,
- "framebuffer incomplete, status %d, textureId %d, size %dx%d", status,
- offscreenBuffer->texture.id(), offscreenBuffer->texture.width(),
- offscreenBuffer->texture.height());
-
- // Change the viewport & ortho projection
- setViewport(offscreenBuffer->viewportWidth, offscreenBuffer->viewportHeight);
-
- clearColorBuffer(repaintRect);
-}
-
-void BakedOpRenderer::endLayer() {
- if (mRenderTarget.stencil) {
- // if stencil was used for clipping, detach it and return it to pool
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
- GL_CHECKPOINT(MODERATE);
- mCaches.renderBufferCache.put(mRenderTarget.stencil);
- mRenderTarget.stencil = nullptr;
- }
- mRenderTarget.lastStencilClip = nullptr;
-
- mRenderTarget.offscreenBuffer->updateMeshFromRegion();
- mRenderTarget.offscreenBuffer = nullptr; // It's in drawLayerOp's hands now.
-
- // Detach the texture from the FBO
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
- GL_CHECKPOINT(LOW);
- mRenderState.deleteFramebuffer(mRenderTarget.frameBufferId);
- mRenderTarget.frameBufferId = 0;
-}
-
-OffscreenBuffer* BakedOpRenderer::copyToLayer(const Rect& area) {
- const uint32_t width = area.getWidth();
- const uint32_t height = area.getHeight();
- OffscreenBuffer* buffer =
- mRenderState.layerPool().get(mRenderState, width, height, mWideColorGamut);
- if (!area.isEmpty() && width != 0 && height != 0) {
- mCaches.textureState().activateTexture(0);
- mCaches.textureState().bindTexture(buffer->texture.id());
-
- glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, area.left,
- mRenderTarget.viewportHeight - area.bottom, width, height);
- }
- return buffer;
-}
-
-void BakedOpRenderer::startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) {
- LOG_ALWAYS_FATAL_IF(mRenderTarget.frameBufferId != 0, "primary framebufferId must be 0");
- mRenderState.bindFramebuffer(0);
- setViewport(width, height);
-
- if (!mOpaque) {
- clearColorBuffer(repaintRect);
- }
-
- mRenderState.debugOverdraw(true, true);
-}
-
-void BakedOpRenderer::endFrame(const Rect& repaintRect) {
- if (CC_UNLIKELY(Properties::debugOverdraw)) {
- ClipRect overdrawClip(repaintRect);
- Rect viewportRect(mRenderTarget.viewportWidth, mRenderTarget.viewportHeight);
- // overdraw visualization
- for (int i = 1; i <= 4; i++) {
- if (i < 4) {
- // nth level of overdraw tests for n+1 draws per pixel
- mRenderState.stencil().enableDebugTest(i + 1, false);
- } else {
- // 4th level tests for 4 or higher draws per pixel
- mRenderState.stencil().enableDebugTest(4, true);
- }
-
- SkPaint paint;
- paint.setColor(mCaches.getOverdrawColor(i));
- Glop glop;
- GlopBuilder(mRenderState, mCaches, &glop)
- .setRoundRectClipState(nullptr)
- .setMeshUnitQuad()
- .setFillPaint(paint, 1.0f)
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewMapUnitToRect(viewportRect)
- .build();
- renderGlop(nullptr, &overdrawClip, glop);
- }
- mRenderState.stencil().disable();
- }
-
- // Note: we leave FBO 0 renderable here, for post-frame-content decoration
-}
-
-void BakedOpRenderer::setViewport(uint32_t width, uint32_t height) {
- mRenderTarget.viewportWidth = width;
- mRenderTarget.viewportHeight = height;
- mRenderTarget.orthoMatrix.loadOrtho(width, height);
-
- mRenderState.setViewport(width, height);
- mRenderState.blend().syncEnabled();
-}
-
-void BakedOpRenderer::clearColorBuffer(const Rect& rect) {
- if (rect.contains(Rect(mRenderTarget.viewportWidth, mRenderTarget.viewportHeight))) {
- // Full viewport is being cleared - disable scissor
- mRenderState.scissor().setEnabled(false);
- } else {
- // Requested rect is subset of viewport - scissor to it to avoid over-clearing
- mRenderState.scissor().setEnabled(true);
- mRenderState.scissor().set(rect.left, mRenderTarget.viewportHeight - rect.bottom,
- rect.getWidth(), rect.getHeight());
- }
- glClear(GL_COLOR_BUFFER_BIT);
- if (!mRenderTarget.frameBufferId) mHasDrawn = true;
-}
-
-Texture* BakedOpRenderer::getTexture(Bitmap* bitmap) {
- return mCaches.textureCache.get(bitmap);
-}
-
-void BakedOpRenderer::drawRects(const float* rects, int count, const SkPaint* paint) {
- std::vector<Vertex> vertices;
- vertices.reserve(count);
- Vertex* vertex = vertices.data();
-
- for (int index = 0; index < count; index += 4) {
- float l = rects[index + 0];
- float t = rects[index + 1];
- float r = rects[index + 2];
- float b = rects[index + 3];
-
- Vertex::set(vertex++, l, t);
- Vertex::set(vertex++, r, t);
- Vertex::set(vertex++, l, b);
- Vertex::set(vertex++, r, b);
- }
-
- LOG_ALWAYS_FATAL_IF(mRenderTarget.frameBufferId != 0, "decoration only supported for FBO 0");
- // TODO: Currently assume full FBO damage, due to FrameInfoVisualizer::unionDirty.
- // Should should scissor/set mHasDrawn safely.
- mRenderState.scissor().setEnabled(false);
- Glop glop;
- GlopBuilder(mRenderState, mCaches, &glop)
- .setRoundRectClipState(nullptr)
- .setMeshIndexedQuads(vertices.data(), count / 4)
- .setFillPaint(*paint, 1.0f)
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewIdentityEmptyBounds()
- .build();
- mRenderState.render(glop, mRenderTarget.orthoMatrix, false);
- mHasDrawn = true;
-}
-
-// clears and re-fills stencil with provided rendertarget space quads,
-// and then put stencil into test mode
-void BakedOpRenderer::setupStencilQuads(std::vector<Vertex>& quadVertices, int incrementThreshold) {
- mRenderState.stencil().enableWrite(incrementThreshold);
- mRenderState.stencil().clear();
- Glop glop;
- GlopBuilder(mRenderState, mCaches, &glop)
- .setRoundRectClipState(nullptr)
- .setMeshIndexedQuads(quadVertices.data(), quadVertices.size() / 4)
- .setFillBlack()
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewIdentityEmptyBounds()
- .build();
- mRenderState.render(glop, mRenderTarget.orthoMatrix, false);
- mRenderState.stencil().enableTest(incrementThreshold);
-}
-
-void BakedOpRenderer::setupStencilRectList(const ClipBase* clip) {
- LOG_ALWAYS_FATAL_IF(clip->mode != ClipMode::RectangleList,
- "can't rectlist clip without rectlist");
- auto&& rectList = reinterpret_cast<const ClipRectList*>(clip)->rectList;
- int quadCount = rectList.getTransformedRectanglesCount();
- std::vector<Vertex> rectangleVertices;
- rectangleVertices.reserve(quadCount * 4);
- for (int i = 0; i < quadCount; i++) {
- const TransformedRectangle& tr(rectList.getTransformedRectangle(i));
- const Matrix4& transform = tr.getTransform();
- Rect bounds = tr.getBounds();
- if (transform.rectToRect()) {
- // If rectToRect, can simply map bounds before storing verts
- transform.mapRect(bounds);
- bounds.doIntersect(clip->rect);
- if (bounds.isEmpty()) {
- continue; // will be outside of scissor, skip
- }
- }
-
- rectangleVertices.push_back(Vertex{bounds.left, bounds.top});
- rectangleVertices.push_back(Vertex{bounds.right, bounds.top});
- rectangleVertices.push_back(Vertex{bounds.left, bounds.bottom});
- rectangleVertices.push_back(Vertex{bounds.right, bounds.bottom});
-
- if (!transform.rectToRect()) {
- // If not rectToRect, must map each point individually
- for (auto cur = rectangleVertices.end() - 4; cur < rectangleVertices.end(); cur++) {
- transform.mapPoint(cur->x, cur->y);
- }
- }
- }
- setupStencilQuads(rectangleVertices, rectList.getTransformedRectanglesCount());
-}
-
-void BakedOpRenderer::setupStencilRegion(const ClipBase* clip) {
- LOG_ALWAYS_FATAL_IF(clip->mode != ClipMode::Region, "can't region clip without region");
- auto&& region = reinterpret_cast<const ClipRegion*>(clip)->region;
-
- std::vector<Vertex> regionVertices;
- SkRegion::Cliperator it(region, clip->rect.toSkIRect());
- while (!it.done()) {
- const SkIRect& r = it.rect();
- regionVertices.push_back(Vertex{(float)r.fLeft, (float)r.fTop});
- regionVertices.push_back(Vertex{(float)r.fRight, (float)r.fTop});
- regionVertices.push_back(Vertex{(float)r.fLeft, (float)r.fBottom});
- regionVertices.push_back(Vertex{(float)r.fRight, (float)r.fBottom});
- it.next();
- }
- setupStencilQuads(regionVertices, 0);
-}
-
-void BakedOpRenderer::prepareRender(const Rect* dirtyBounds, const ClipBase* clip) {
- // Prepare scissor (done before stencil, to simplify filling stencil)
- mRenderState.scissor().setEnabled(clip != nullptr);
- if (clip) {
- mRenderState.scissor().set(mRenderTarget.viewportHeight, clip->rect);
- }
-
- // If stencil may be used for clipping, enable it, fill it, or disable it as appropriate
- if (CC_LIKELY(!Properties::debugOverdraw)) {
- // only modify stencil mode and content when it's not used for overdraw visualization
- if (CC_UNLIKELY(clip && clip->mode != ClipMode::Rectangle)) {
- // NOTE: this pointer check is only safe for non-rect clips,
- // since rect clips may be created on the stack
- if (mRenderTarget.lastStencilClip != clip) {
- // Stencil needed, but current stencil isn't up to date
- mRenderTarget.lastStencilClip = clip;
-
- if (mRenderTarget.frameBufferId != 0 && !mRenderTarget.stencil) {
- OffscreenBuffer* layer = mRenderTarget.offscreenBuffer;
- mRenderTarget.stencil = mCaches.renderBufferCache.get(
- Stencil::getLayerStencilFormat(), layer->texture.width(),
- layer->texture.height());
- // stencil is bound + allocated - associate it with current FBO
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, mRenderTarget.stencil->getName());
- }
-
- if (clip->mode == ClipMode::RectangleList) {
- setupStencilRectList(clip);
- } else {
- setupStencilRegion(clip);
- }
- } else {
- // stencil is up to date - just need to ensure it's enabled (since an unclipped
- // or scissor-only clipped op may have been drawn, disabling the stencil)
- int incrementThreshold = 0;
- if (CC_LIKELY(clip->mode == ClipMode::RectangleList)) {
- auto&& rectList = reinterpret_cast<const ClipRectList*>(clip)->rectList;
- incrementThreshold = rectList.getTransformedRectanglesCount();
- }
- mRenderState.stencil().enableTest(incrementThreshold);
- }
- } else {
- // either scissor or no clip, so disable stencil test
- mRenderState.stencil().disable();
- }
- }
-
- if (dirtyBounds) {
- // dirty offscreenbuffer if present
- dirtyRenderTarget(*dirtyBounds);
- }
-}
-
-void BakedOpRenderer::renderGlopImpl(const Rect* dirtyBounds, const ClipBase* clip,
- const Glop& glop) {
- prepareRender(dirtyBounds, clip);
- // Disable blending if this is the first draw to the main framebuffer, in case app has defined
- // transparency where it doesn't make sense - as first draw in opaque window. Note that we only
- // apply this improvement when the blend mode is SRC_OVER - other modes (e.g. CLEAR) can be
- // valid draws that affect other content (e.g. draw CLEAR, then draw DST_OVER)
- bool overrideDisableBlending = !mHasDrawn && mOpaque && !mRenderTarget.frameBufferId &&
- glop.blend.src == GL_ONE &&
- glop.blend.dst == GL_ONE_MINUS_SRC_ALPHA;
- mRenderState.render(glop, mRenderTarget.orthoMatrix, overrideDisableBlending);
- if (!mRenderTarget.frameBufferId) mHasDrawn = true;
-}
-
-void BakedOpRenderer::renderFunctor(const FunctorOp& op, const BakedOpState& state) {
- prepareRender(&state.computedState.clippedBounds, state.computedState.getClipIfNeeded());
-
- DrawGlInfo info;
- auto&& clip = state.computedState.clipRect();
- info.clipLeft = clip.left;
- info.clipTop = clip.top;
- info.clipRight = clip.right;
- info.clipBottom = clip.bottom;
- info.isLayer = offscreenRenderTarget();
- info.width = mRenderTarget.viewportWidth;
- info.height = mRenderTarget.viewportHeight;
- state.computedState.transform.copyTo(&info.transform[0]);
-
- mRenderState.invokeFunctor(op.functor, DrawGlInfo::kModeDraw, &info);
- if (!mRenderTarget.frameBufferId) mHasDrawn = true;
-}
-
-void BakedOpRenderer::dirtyRenderTarget(const Rect& uiDirty) {
- if (mRenderTarget.offscreenBuffer) {
- mRenderTarget.offscreenBuffer->dirty(uiDirty);
- }
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/BakedOpRenderer.h b/libs/hwui/BakedOpRenderer.h
deleted file mode 100644
index 7c0590d7ab48..000000000000
--- a/libs/hwui/BakedOpRenderer.h
+++ /dev/null
@@ -1,149 +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.
- */
-
-#pragma once
-
-#include "BakedOpState.h"
-#include "Matrix.h"
-#include "utils/Macros.h"
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-struct Glop;
-class Layer;
-class RenderState;
-struct ClipBase;
-
-/**
- * Main rendering manager for a collection of work - one frame + any contained FBOs.
- *
- * Manages frame and FBO lifecycle, binding the GL framebuffer as appropriate. This is the only
- * place where FBOs are bound, created, and destroyed.
- *
- * All rendering operations will be sent by the Dispatcher, a collection of static methods,
- * which has intentionally limited access to the renderer functionality.
- */
-class BakedOpRenderer {
-public:
- typedef void (*GlopReceiver)(BakedOpRenderer&, const Rect*, const ClipBase*, const Glop&);
- /**
- * Position agnostic shadow lighting info. Used with all shadow ops in scene.
- */
- struct LightInfo {
- LightInfo() : LightInfo(0, 0) {}
- LightInfo(uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha)
- : ambientShadowAlpha(ambientShadowAlpha), spotShadowAlpha(spotShadowAlpha) {}
- uint8_t ambientShadowAlpha;
- uint8_t spotShadowAlpha;
- };
-
- BakedOpRenderer(Caches& caches, RenderState& renderState, bool opaque, bool wideColorGamut,
- const LightInfo& lightInfo)
- : mGlopReceiver(DefaultGlopReceiver)
- , mRenderState(renderState)
- , mCaches(caches)
- , mOpaque(opaque)
- , mWideColorGamut(wideColorGamut)
- , mLightInfo(lightInfo) {}
-
- RenderState& renderState() { return mRenderState; }
- Caches& caches() { return mCaches; }
-
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect);
- void endFrame(const Rect& repaintRect);
- WARN_UNUSED_RESULT OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height);
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer);
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect);
- void endLayer();
- WARN_UNUSED_RESULT OffscreenBuffer* copyToLayer(const Rect& area);
-
- Texture* getTexture(Bitmap* bitmap);
- const LightInfo& getLightInfo() const { return mLightInfo; }
-
- void renderGlop(const BakedOpState& state, const Glop& glop) {
- renderGlop(&state.computedState.clippedBounds, state.computedState.getClipIfNeeded(), glop);
- }
- void renderFunctor(const FunctorOp& op, const BakedOpState& state);
-
- void renderGlop(const Rect* dirtyBounds, const ClipBase* clip, const Glop& glop) {
- mGlopReceiver(*this, dirtyBounds, clip, glop);
- }
- bool offscreenRenderTarget() { return mRenderTarget.offscreenBuffer != nullptr; }
- void dirtyRenderTarget(const Rect& dirtyRect);
- bool didDraw() const { return mHasDrawn; }
-
- uint32_t getViewportWidth() const { return mRenderTarget.viewportWidth; }
- uint32_t getViewportHeight() const { return mRenderTarget.viewportHeight; }
-
- // simple draw methods, to be used for end frame decoration
- void drawRect(float left, float top, float right, float bottom, const SkPaint* paint) {
- float ltrb[4] = {left, top, right, bottom};
- drawRects(ltrb, 4, paint);
- }
- void drawRects(const float* rects, int count, const SkPaint* paint);
-
-protected:
- GlopReceiver mGlopReceiver;
-
-private:
- static void DefaultGlopReceiver(BakedOpRenderer& renderer, const Rect* dirtyBounds,
- const ClipBase* clip, const Glop& glop) {
- renderer.renderGlopImpl(dirtyBounds, clip, glop);
- }
- void renderGlopImpl(const Rect* dirtyBounds, const ClipBase* clip, const Glop& glop);
- void setViewport(uint32_t width, uint32_t height);
- void clearColorBuffer(const Rect& clearRect);
- void prepareRender(const Rect* dirtyBounds, const ClipBase* clip);
- void setupStencilRectList(const ClipBase* clip);
- void setupStencilRegion(const ClipBase* clip);
- void setupStencilQuads(std::vector<Vertex>& quadVertices, int incrementThreshold);
-
- RenderState& mRenderState;
- Caches& mCaches;
- bool mOpaque;
- bool mWideColorGamut;
- bool mHasDrawn = false;
-
- // render target state - setup by start/end layer/frame
- // only valid to use in between start/end pairs.
- struct {
- // If not drawing to a layer: fbo = 0, offscreenBuffer = null,
- // Otherwise these refer to currently painting layer's state
- GLuint frameBufferId = 0;
- OffscreenBuffer* offscreenBuffer = nullptr;
-
- // Used when drawing to a layer and using stencil clipping. otherwise null.
- RenderBuffer* stencil = nullptr;
-
- // value representing the ClipRectList* or ClipRegion* currently stored in
- // the stencil of the current render target
- const ClipBase* lastStencilClip = nullptr;
-
- // Size of renderable region in current render target - for layers, may not match actual
- // bounds of FBO texture. offscreenBuffer->texture has this information.
- uint32_t viewportWidth = 0;
- uint32_t viewportHeight = 0;
-
- Matrix4 orthoMatrix;
- } mRenderTarget;
-
- const LightInfo mLightInfo;
-};
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/BakedOpState.cpp b/libs/hwui/BakedOpState.cpp
deleted file mode 100644
index 63edf77279e3..000000000000
--- a/libs/hwui/BakedOpState.cpp
+++ /dev/null
@@ -1,173 +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.
- */
-
-#include "BakedOpState.h"
-
-#include "ClipArea.h"
-
-namespace android {
-namespace uirenderer {
-
-static int computeClipSideFlags(const Rect& clip, const Rect& bounds) {
- int clipSideFlags = 0;
- if (clip.left > bounds.left) clipSideFlags |= OpClipSideFlags::Left;
- if (clip.top > bounds.top) clipSideFlags |= OpClipSideFlags::Top;
- if (clip.right < bounds.right) clipSideFlags |= OpClipSideFlags::Right;
- if (clip.bottom < bounds.bottom) clipSideFlags |= OpClipSideFlags::Bottom;
- return clipSideFlags;
-}
-
-ResolvedRenderState::ResolvedRenderState(LinearAllocator& allocator, Snapshot& snapshot,
- const RecordedOp& recordedOp, bool expandForStroke,
- bool expandForPathTexture) {
- // resolvedMatrix = parentMatrix * localMatrix
- transform.loadMultiply(*snapshot.transform, recordedOp.localMatrix);
-
- // resolvedClippedBounds = intersect(resolvedMatrix * opBounds, resolvedClipRect)
- clippedBounds = recordedOp.unmappedBounds;
- if (CC_UNLIKELY(expandForStroke)) {
- // account for non-hairline stroke
- clippedBounds.outset(recordedOp.paint->getStrokeWidth() * 0.5f);
- } else if (CC_UNLIKELY(expandForPathTexture)) {
- clippedBounds.outset(1);
- }
- transform.mapRect(clippedBounds);
- if (CC_UNLIKELY(expandForStroke &&
- (!transform.isPureTranslate() || recordedOp.paint->getStrokeWidth() < 1.0f))) {
- // account for hairline stroke when stroke may be < 1 scaled pixel
- // Non translate || strokeWidth < 1 is conservative, but will cover all cases
- clippedBounds.outset(0.5f);
- }
-
- // resolvedClipRect = intersect(parentMatrix * localClip, parentClip)
- clipState = snapshot.serializeIntersectedClip(allocator, recordedOp.localClip,
- *(snapshot.transform));
- LOG_ALWAYS_FATAL_IF(!clipState, "must clip!");
-
- const Rect& clipRect = clipState->rect;
- if (CC_UNLIKELY(clipRect.isEmpty() || !clippedBounds.intersects(clipRect))) {
- // Rejected based on either empty clip, or bounds not intersecting with clip
-
- // Note: we could rewind the clipState object in situations where the clipRect is empty,
- // but *only* if the caching logic within ClipArea was aware of the rewind.
- clipState = nullptr;
- clippedBounds.setEmpty();
- } else {
- // Not rejected! compute true clippedBounds, clipSideFlags, and path mask
- clipSideFlags = computeClipSideFlags(clipRect, clippedBounds);
- clippedBounds.doIntersect(clipRect);
-
- if (CC_UNLIKELY(snapshot.projectionPathMask)) {
- // map projection path mask from render target space into op space,
- // so intersection with op geometry is possible
- Matrix4 inverseTransform;
- inverseTransform.loadInverse(transform);
- SkMatrix skInverseTransform;
- inverseTransform.copyTo(skInverseTransform);
-
- auto localMask = allocator.create<SkPath>();
- snapshot.projectionPathMask->transform(skInverseTransform, localMask);
- localProjectionPathMask = localMask;
- }
- }
-}
-
-ResolvedRenderState::ResolvedRenderState(LinearAllocator& allocator, Snapshot& snapshot,
- const Matrix4& localTransform, const ClipBase* localClip) {
- transform.loadMultiply(*snapshot.transform, localTransform);
- clipState = snapshot.serializeIntersectedClip(allocator, localClip, *(snapshot.transform));
- clippedBounds = clipState->rect;
- clipSideFlags = OpClipSideFlags::Full;
- localProjectionPathMask = nullptr;
-}
-
-ResolvedRenderState::ResolvedRenderState(LinearAllocator& allocator, Snapshot& snapshot)
- : transform(*snapshot.transform)
- , clipState(snapshot.mutateClipArea().serializeClip(allocator))
- , clippedBounds(clipState->rect)
- , clipSideFlags(OpClipSideFlags::Full)
- , localProjectionPathMask(nullptr) {}
-
-ResolvedRenderState::ResolvedRenderState(const ClipRect* clipRect, const Rect& dstRect)
- : transform(Matrix4::identity())
- , clipState(clipRect)
- , clippedBounds(dstRect)
- , clipSideFlags(computeClipSideFlags(clipRect->rect, dstRect))
- , localProjectionPathMask(nullptr) {
- clippedBounds.doIntersect(clipRect->rect);
-}
-
-BakedOpState* BakedOpState::tryConstruct(LinearAllocator& allocator, Snapshot& snapshot,
- const RecordedOp& recordedOp) {
- if (CC_UNLIKELY(snapshot.getRenderTargetClip().isEmpty())) return nullptr;
- BakedOpState* bakedState =
- allocator.create_trivial<BakedOpState>(allocator, snapshot, recordedOp, false, false);
- if (bakedState->computedState.clippedBounds.isEmpty()) {
- // bounds are empty, so op is rejected
- allocator.rewindIfLastAlloc(bakedState);
- return nullptr;
- }
- return bakedState;
-}
-
-BakedOpState* BakedOpState::tryConstructUnbounded(LinearAllocator& allocator, Snapshot& snapshot,
- const RecordedOp& recordedOp) {
- if (CC_UNLIKELY(snapshot.getRenderTargetClip().isEmpty())) return nullptr;
- return allocator.create_trivial<BakedOpState>(allocator, snapshot, recordedOp);
-}
-
-BakedOpState* BakedOpState::tryStrokeableOpConstruct(LinearAllocator& allocator, Snapshot& snapshot,
- const RecordedOp& recordedOp,
- StrokeBehavior strokeBehavior,
- bool expandForPathTexture) {
- if (CC_UNLIKELY(snapshot.getRenderTargetClip().isEmpty())) return nullptr;
- bool expandForStroke =
- (strokeBehavior == StrokeBehavior::Forced ||
- (recordedOp.paint && recordedOp.paint->getStyle() != SkPaint::kFill_Style));
-
- BakedOpState* bakedState = allocator.create_trivial<BakedOpState>(
- allocator, snapshot, recordedOp, expandForStroke, expandForPathTexture);
- if (bakedState->computedState.clippedBounds.isEmpty()) {
- // bounds are empty, so op is rejected
- // NOTE: this won't succeed if a clip was allocated
- allocator.rewindIfLastAlloc(bakedState);
- return nullptr;
- }
- return bakedState;
-}
-
-BakedOpState* BakedOpState::tryShadowOpConstruct(LinearAllocator& allocator, Snapshot& snapshot,
- const ShadowOp* shadowOpPtr) {
- if (CC_UNLIKELY(snapshot.getRenderTargetClip().isEmpty())) return nullptr;
-
- // clip isn't empty, so construct the op
- return allocator.create_trivial<BakedOpState>(allocator, snapshot, shadowOpPtr);
-}
-
-BakedOpState* BakedOpState::directConstruct(LinearAllocator& allocator, const ClipRect* clip,
- const Rect& dstRect, const RecordedOp& recordedOp) {
- return allocator.create_trivial<BakedOpState>(clip, dstRect, recordedOp);
-}
-
-void BakedOpState::setupOpacity(const SkPaint* paint) {
- computedState.opaqueOverClippedBounds = computedState.transform.isSimple() &&
- computedState.clipState->mode == ClipMode::Rectangle &&
- MathUtils::areEqual(alpha, 1.0f) &&
- !roundRectClipState && PaintUtils::isOpaquePaint(paint);
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/BakedOpState.h b/libs/hwui/BakedOpState.h
deleted file mode 100644
index c74475516cdc..000000000000
--- a/libs/hwui/BakedOpState.h
+++ /dev/null
@@ -1,171 +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.
- */
-
-#ifndef ANDROID_HWUI_BAKED_OP_STATE_H
-#define ANDROID_HWUI_BAKED_OP_STATE_H
-
-#include "Matrix.h"
-#include "RecordedOp.h"
-#include "Rect.h"
-#include "Snapshot.h"
-
-namespace android {
-namespace uirenderer {
-
-namespace OpClipSideFlags {
-enum {
- None = 0x0,
- Left = 0x1,
- Top = 0x2,
- Right = 0x4,
- Bottom = 0x8,
- Full = 0xF,
- // ConservativeFull = 0x1F needed?
-};
-}
-
-/**
- * Holds a list of BakedOpStates of ops that can be drawn together
- */
-struct MergedBakedOpList {
- const BakedOpState* const* states;
- size_t count;
- int clipSideFlags;
- Rect clip;
-};
-
-/**
- * Holds the resolved clip, transform, and bounds of a recordedOp, when replayed with a snapshot
- */
-class ResolvedRenderState {
-public:
- ResolvedRenderState(LinearAllocator& allocator, Snapshot& snapshot,
- const RecordedOp& recordedOp, bool expandForStroke,
- bool expandForPathTexture);
-
- // Constructor for unbounded ops *with* transform/clip
- ResolvedRenderState(LinearAllocator& allocator, Snapshot& snapshot,
- const Matrix4& localTransform, const ClipBase* localClip);
-
- // Constructor for unbounded ops without transform/clip (namely shadows)
- ResolvedRenderState(LinearAllocator& allocator, Snapshot& snapshot);
-
- // Constructor for primitive ops provided clip, and no transform
- ResolvedRenderState(const ClipRect* viewportRect, const Rect& dstRect);
-
- Rect computeLocalSpaceClip() const {
- Matrix4 inverse;
- inverse.loadInverse(transform);
-
- Rect outClip(clipRect());
- inverse.mapRect(outClip);
- return outClip;
- }
-
- const Rect& clipRect() const { return clipState->rect; }
-
- bool requiresClip() const {
- return clipSideFlags != OpClipSideFlags::None ||
- CC_UNLIKELY(clipState->mode != ClipMode::Rectangle);
- }
-
- // returns the clip if it's needed to draw the operation, otherwise nullptr
- const ClipBase* getClipIfNeeded() const { return requiresClip() ? clipState : nullptr; }
-
- Matrix4 transform;
- const ClipBase* clipState = nullptr;
- Rect clippedBounds;
- int clipSideFlags = 0;
- const SkPath* localProjectionPathMask = nullptr;
- bool opaqueOverClippedBounds = false;
-};
-
-/**
- * Self-contained op wrapper, containing all resolved state required to draw the op.
- *
- * Stashed pointers within all point to longer lived objects, with no ownership implied.
- */
-class BakedOpState {
-public:
- static BakedOpState* tryConstruct(LinearAllocator& allocator, Snapshot& snapshot,
- const RecordedOp& recordedOp);
-
- static BakedOpState* tryConstructUnbounded(LinearAllocator& allocator, Snapshot& snapshot,
- const RecordedOp& recordedOp);
-
- enum class StrokeBehavior {
- // stroking is forced, regardless of style on paint (such as for lines)
- Forced,
- // stroking is defined by style on paint
- StyleDefined,
- };
-
- static BakedOpState* tryStrokeableOpConstruct(LinearAllocator& allocator, Snapshot& snapshot,
- const RecordedOp& recordedOp,
- StrokeBehavior strokeBehavior,
- bool expandForPathTexture);
-
- static BakedOpState* tryShadowOpConstruct(LinearAllocator& allocator, Snapshot& snapshot,
- const ShadowOp* shadowOpPtr);
-
- static BakedOpState* directConstruct(LinearAllocator& allocator, const ClipRect* clip,
- const Rect& dstRect, const RecordedOp& recordedOp);
-
- // Set opaqueOverClippedBounds. If this method isn't called, the op is assumed translucent.
- void setupOpacity(const SkPaint* paint);
-
- // computed state:
- ResolvedRenderState computedState;
-
- // simple state (straight pointer/value storage):
- const float alpha;
- const RoundRectClipState* roundRectClipState;
- const RecordedOp* op;
-
-private:
- friend class LinearAllocator;
-
- BakedOpState(LinearAllocator& allocator, Snapshot& snapshot, const RecordedOp& recordedOp,
- bool expandForStroke, bool expandForPathTexture)
- : computedState(allocator, snapshot, recordedOp, expandForStroke, expandForPathTexture)
- , alpha(snapshot.alpha)
- , roundRectClipState(snapshot.roundRectClipState)
- , op(&recordedOp) {}
-
- // TODO: fix this brittleness
- BakedOpState(LinearAllocator& allocator, Snapshot& snapshot, const RecordedOp& recordedOp)
- : computedState(allocator, snapshot, recordedOp.localMatrix, recordedOp.localClip)
- , alpha(snapshot.alpha)
- , roundRectClipState(snapshot.roundRectClipState)
- , op(&recordedOp) {}
-
- BakedOpState(LinearAllocator& allocator, Snapshot& snapshot, const ShadowOp* shadowOpPtr)
- : computedState(allocator, snapshot)
- , alpha(snapshot.alpha)
- , roundRectClipState(snapshot.roundRectClipState)
- , op(shadowOpPtr) {}
-
- BakedOpState(const ClipRect* clipRect, const Rect& dstRect, const RecordedOp& recordedOp)
- : computedState(clipRect, dstRect)
- , alpha(1.0f)
- , roundRectClipState(nullptr)
- , op(&recordedOp) {}
-};
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_BAKED_OP_STATE_H
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 3c774a3313d2..254144448859 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -16,14 +16,9 @@
#include "Caches.h"
-#include "GammaFontRenderer.h"
#include "GlLayer.h"
#include "Properties.h"
-#include "ShadowTessellator.h"
#include "renderstate/RenderState.h"
-#ifdef BUGREPORT_FONT_CACHE_USAGE
-#include "font/FontCacheHistoryTracker.h"
-#endif
#include "utils/GLUtils.h"
#include <cutils/properties.h>
@@ -49,17 +44,10 @@ Caches* Caches::sInstance = nullptr;
// Constructors/destructor
///////////////////////////////////////////////////////////////////////////////
-Caches::Caches(RenderState& renderState)
- : gradientCache(extensions())
- , patchCache(renderState)
- , programCache(extensions())
- , mRenderState(&renderState)
- , mInitialized(false) {
+Caches::Caches(RenderState& renderState) : mInitialized(false) {
INIT_LOGD("Creating OpenGL renderer caches");
init();
- initConstraints();
initStaticProperties();
- initExtensions();
}
bool Caches::init() {
@@ -68,7 +56,6 @@ bool Caches::init() {
ATRACE_NAME("Caches::init");
mRegionMesh = nullptr;
- mProgram = nullptr;
mInitialized = true;
@@ -79,23 +66,6 @@ bool Caches::init() {
return true;
}
-void Caches::initExtensions() {
- if (extensions().hasDebugMarker()) {
- eventMark = glInsertEventMarkerEXT;
-
- startMark = glPushGroupMarkerEXT;
- endMark = glPopGroupMarkerEXT;
- } else {
- eventMark = eventMarkNull;
- startMark = startMarkNull;
- endMark = endMarkNull;
- }
-}
-
-void Caches::initConstraints() {
- maxTextureSize = DeviceInfo::get()->maxTextureSize();
-}
-
void Caches::initStaticProperties() {
// OpenGL ES 3.0+ specific features
gpuPixelBuffersEnabled = extensions().hasPixelBufferObjects() &&
@@ -106,13 +76,6 @@ void Caches::terminate() {
if (!mInitialized) return;
mRegionMesh.reset(nullptr);
- fboCache.clear();
-
- programCache.clear();
- mProgram = nullptr;
-
- patchCache.clear();
-
clearGarbage();
delete mPixelBufferState;
@@ -122,130 +85,13 @@ void Caches::terminate() {
mInitialized = false;
}
-void Caches::setProgram(const ProgramDescription& description) {
- setProgram(programCache.get(description));
-}
-
-void Caches::setProgram(Program* program) {
- if (!program || !program->isInUse()) {
- if (mProgram) {
- mProgram->remove();
- }
- if (program) {
- program->use();
- }
- mProgram = program;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Debug
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t Caches::getOverdrawColor(uint32_t amount) const {
- static uint32_t sOverdrawColors[2][4] = {{0x2f0000ff, 0x2f00ff00, 0x3fff0000, 0x7fff0000},
- {0x2f0000ff, 0x4fffff00, 0x5fff8ad8, 0x7fff0000}};
- if (amount < 1) amount = 1;
- if (amount > 4) amount = 4;
-
- int overdrawColorIndex = static_cast<int>(Properties::overdrawColorSet);
- return sOverdrawColors[overdrawColorIndex][amount - 1];
-}
-
-void Caches::dumpMemoryUsage() {
- String8 stringLog;
- dumpMemoryUsage(stringLog);
- ALOGD("%s", stringLog.string());
-}
-
-void Caches::dumpMemoryUsage(String8& log) {
- uint32_t total = 0;
- log.appendFormat("Current memory usage / total memory usage (bytes):\n");
- log.appendFormat(" TextureCache %8d / %8d\n", textureCache.getSize(),
- textureCache.getMaxSize());
- if (mRenderState) {
- int memused = 0;
- for (std::set<Layer*>::iterator it = mRenderState->mActiveLayers.begin();
- it != mRenderState->mActiveLayers.end(); it++) {
- const Layer* layer = *it;
- LOG_ALWAYS_FATAL_IF(layer->getApi() != Layer::Api::OpenGL);
- const GlLayer* glLayer = static_cast<const GlLayer*>(layer);
- log.appendFormat(" GlLayer size %dx%d; texid=%u refs=%d\n", layer->getWidth(),
- layer->getHeight(), glLayer->getTextureId(), layer->getStrongCount());
- memused += layer->getWidth() * layer->getHeight() * 4;
- }
- log.appendFormat(" Layers total %8d (numLayers = %zu)\n", memused,
- mRenderState->mActiveLayers.size());
- total += memused;
- }
- log.appendFormat(" RenderBufferCache %8d / %8d\n", renderBufferCache.getSize(),
- renderBufferCache.getMaxSize());
- log.appendFormat(" GradientCache %8d / %8d\n", gradientCache.getSize(),
- gradientCache.getMaxSize());
- log.appendFormat(" PathCache %8d / %8d\n", pathCache.getSize(),
- pathCache.getMaxSize());
- log.appendFormat(" TessellationCache %8d / %8d\n", tessellationCache.getSize(),
- tessellationCache.getMaxSize());
- log.appendFormat(" TextDropShadowCache %8d / %8d\n", dropShadowCache.getSize(),
- dropShadowCache.getMaxSize());
- log.appendFormat(" PatchCache %8d / %8d\n", patchCache.getSize(),
- patchCache.getMaxSize());
-
- fontRenderer.dumpMemoryUsage(log);
-
- log.appendFormat("Other:\n");
- log.appendFormat(" FboCache %8d / %8d\n", fboCache.getSize(),
- fboCache.getMaxSize());
-
- total += textureCache.getSize();
- total += renderBufferCache.getSize();
- total += gradientCache.getSize();
- total += pathCache.getSize();
- total += tessellationCache.getSize();
- total += dropShadowCache.getSize();
- total += patchCache.getSize();
- total += fontRenderer.getSize();
-
- log.appendFormat("Total memory usage:\n");
- log.appendFormat(" %d bytes, %.2f MB\n", total, total / 1024.0f / 1024.0f);
-
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- fontRenderer.getFontRenderer().historyTracker().dump(log);
-#endif
-}
-
///////////////////////////////////////////////////////////////////////////////
// Memory management
///////////////////////////////////////////////////////////////////////////////
-void Caches::clearGarbage() {
- pathCache.clearGarbage();
- patchCache.clearGarbage();
-}
+void Caches::clearGarbage() {}
void Caches::flush(FlushMode mode) {
- FLUSH_LOGD("Flushing caches (mode %d)", mode);
-
- switch (mode) {
- case FlushMode::Full:
- textureCache.clear();
- patchCache.clear();
- dropShadowCache.clear();
- gradientCache.clear();
- fontRenderer.clear();
- fboCache.clear();
- // fall through
- case FlushMode::Moderate:
- fontRenderer.flush();
- textureCache.flush();
- pathCache.clear();
- tessellationCache.clear();
- // fall through
- case FlushMode::Layers:
- renderBufferCache.clear();
- break;
- }
-
clearGarbage();
glFinish();
// Errors during cleanup should be considered non-fatal, dump them and
@@ -253,22 +99,5 @@ void Caches::flush(FlushMode mode) {
GLUtils::dumpGLErrors();
}
-///////////////////////////////////////////////////////////////////////////////
-// Regions
-///////////////////////////////////////////////////////////////////////////////
-
-TextureVertex* Caches::getRegionMesh() {
- // Create the mesh, 2 triangles and 4 vertices per rectangle in the region
- if (!mRegionMesh) {
- mRegionMesh.reset(new TextureVertex[kMaxNumberOfQuads * 4]);
- }
-
- return mRegionMesh.get();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Temporary Properties
-///////////////////////////////////////////////////////////////////////////////
-
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 97328324df04..642f9dc50eb1 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -18,17 +18,7 @@
#include "DeviceInfo.h"
#include "Extensions.h"
-#include "FboCache.h"
-#include "GammaFontRenderer.h"
-#include "GradientCache.h"
-#include "PatchCache.h"
-#include "PathCache.h"
-#include "ProgramCache.h"
-#include "RenderBufferCache.h"
#include "ResourceCache.h"
-#include "TessellationCache.h"
-#include "TextDropShadowCache.h"
-#include "TextureCache.h"
#include "renderstate/PixelBufferState.h"
#include "renderstate/TextureState.h"
#include "thread/TaskManager.h"
@@ -100,30 +90,12 @@ public:
void terminate();
/**
- * Returns a non-premultiplied ARGB color for the specified
- * amount of overdraw (1 for 1x, 2 for 2x, etc.)
- */
- uint32_t getOverdrawColor(uint32_t amount) const;
-
- /**
* Call this on each frame to ensure that garbage is deleted from
* GPU memory.
*/
void clearGarbage();
/**
- * Can be used to delete a layer from a non EGL thread.
- */
- void deleteLayerDeferred(Layer* layer);
-
- /**
- * Returns the mesh used to draw regions. Calling this method will
- * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
- * indices for the region mesh.
- */
- TextureVertex* getRegionMesh();
-
- /**
* Returns the GL RGBA internal format to use for the current device
* If the device supports linear blending and needSRGB is true,
* this function returns GL_SRGB8_ALPHA8, otherwise it returns GL_RGBA
@@ -132,68 +104,30 @@ public:
return extensions().hasLinearBlending() && needSRGB ? GL_SRGB8_ALPHA8 : GL_RGBA;
}
- /**
- * Displays the memory usage of each cache and the total sum.
- */
- void dumpMemoryUsage();
- void dumpMemoryUsage(String8& log);
-
- // Misc
- GLint maxTextureSize;
-
public:
- TextureCache textureCache;
- RenderBufferCache renderBufferCache;
- GradientCache gradientCache;
- PatchCache patchCache;
- PathCache pathCache;
- ProgramCache programCache;
- TessellationCache tessellationCache;
- TextDropShadowCache dropShadowCache;
- FboCache fboCache;
-
- GammaFontRenderer fontRenderer;
-
TaskManager tasks;
bool gpuPixelBuffersEnabled;
- // Debug methods
- PFNGLINSERTEVENTMARKEREXTPROC eventMark;
- PFNGLPUSHGROUPMARKEREXTPROC startMark;
- PFNGLPOPGROUPMARKEREXTPROC endMark;
-
- void setProgram(const ProgramDescription& description);
- void setProgram(Program* program);
-
const Extensions& extensions() const { return DeviceInfo::get()->extensions(); }
- Program& program() { return *mProgram; }
PixelBufferState& pixelBufferState() { return *mPixelBufferState; }
TextureState& textureState() { return *mTextureState; }
private:
- void initExtensions();
- void initConstraints();
void initStaticProperties();
static void eventMarkNull(GLsizei length, const GLchar* marker) {}
static void startMarkNull(GLsizei length, const GLchar* marker) {}
static void endMarkNull() {}
- RenderState* mRenderState;
-
// Used to render layers
std::unique_ptr<TextureVertex[]> mRegionMesh;
- mutable Mutex mGarbageLock;
- std::vector<Layer*> mLayerGarbage;
-
bool mInitialized;
// TODO: move below to RenderState
PixelBufferState* mPixelBufferState = nullptr;
TextureState* mTextureState = nullptr;
- Program* mProgram = nullptr; // note: object owned by ProgramCache
}; // class Caches
diff --git a/libs/hwui/CanvasTransform.cpp b/libs/hwui/CanvasTransform.cpp
new file mode 100644
index 000000000000..bac7a4d17a49
--- /dev/null
+++ b/libs/hwui/CanvasTransform.cpp
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "CanvasTransform.h"
+#include "Properties.h"
+
+#include <SkColorFilter.h>
+#include <SkPaint.h>
+#include <log/log.h>
+
+namespace android::uirenderer {
+
+static SkColor makeLight(SkColor color) {
+ SkScalar hsv[3];
+ SkColorToHSV(color, hsv);
+ if (hsv[1] > .2f) return color;
+ // hsv[1] *= .85f;
+ // hsv[2] = std::min(1.0f, std::max(hsv[2], 1 - hsv[2]) * 1.3f);
+ hsv[2] = std::max(hsv[2], 1.1f - hsv[2]);
+ return SkHSVToColor(SkColorGetA(color), hsv);
+}
+
+static SkColor makeDark(SkColor color) {
+ SkScalar hsv[3];
+ SkColorToHSV(color, hsv);
+ if (hsv[1] > .2f) return color;
+ // hsv[1] *= .85f;
+ // hsv[2] = std::max(0.0f, std::min(hsv[2], 1 - hsv[2]) * .7f);
+ hsv[2] = std::min(hsv[2], 1.1f - hsv[2]);
+ return SkHSVToColor(SkColorGetA(color), hsv);
+}
+
+static SkColor transformColor(ColorTransform transform, SkColor color) {
+ switch (transform) {
+ case ColorTransform::Light:
+ return makeLight(color);
+ case ColorTransform::Dark:
+ return makeDark(color);
+ default:
+ return color;
+ }
+}
+
+static void applyColorTransform(ColorTransform transform, SkPaint& paint) {
+ if (transform == ColorTransform::None) return;
+
+ SkColor newColor = transformColor(transform, paint.getColor());
+ paint.setColor(newColor);
+
+ if (paint.getColorFilter()) {
+ SkBlendMode mode;
+ SkColor color;
+ // TODO: LRU this or something to avoid spamming new color mode filters
+ if (paint.getColorFilter()->asColorMode(&color, &mode)) {
+ color = transformColor(transform, color);
+ paint.setColorFilter(SkColorFilter::MakeModeFilter(color, mode));
+ }
+ }
+}
+
+class ColorFilterCanvas : public SkPaintFilterCanvas {
+public:
+ ColorFilterCanvas(ColorTransform transform, SkCanvas* canvas)
+ : SkPaintFilterCanvas(canvas), mTransform(transform) {}
+
+ bool onFilter(SkTCopyOnFirstWrite<SkPaint>* paint, Type type) const override {
+ if (*paint) {
+ applyColorTransform(mTransform, *(paint->writable()));
+ }
+ return true;
+ }
+
+private:
+ ColorTransform mTransform;
+};
+
+std::unique_ptr<SkCanvas> makeTransformCanvas(SkCanvas* inCanvas, ColorTransform transform) {
+ switch (transform) {
+ case ColorTransform::Light:
+ return std::make_unique<ColorFilterCanvas>(ColorTransform::Light, inCanvas);
+ case ColorTransform::Dark:
+ return std::make_unique<ColorFilterCanvas>(ColorTransform::Dark, inCanvas);
+ default:
+ return nullptr;
+ }
+}
+
+std::unique_ptr<SkCanvas> makeTransformCanvas(SkCanvas* inCanvas, UsageHint usageHint) {
+ if (Properties::forceDarkMode) {
+ switch (usageHint) {
+ case UsageHint::Unknown:
+ return makeTransformCanvas(inCanvas, ColorTransform::Light);
+ case UsageHint::Background:
+ return makeTransformCanvas(inCanvas, ColorTransform::Dark);
+ }
+ }
+ return nullptr;
+}
+
+}; // namespace android::uirenderer \ No newline at end of file
diff --git a/libs/hwui/CanvasTransform.h b/libs/hwui/CanvasTransform.h
new file mode 100644
index 000000000000..f71fdfaf3fba
--- /dev/null
+++ b/libs/hwui/CanvasTransform.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <SkCanvas.h>
+#include <SkPaintFilterCanvas.h>
+
+#include <memory>
+
+namespace android::uirenderer {
+
+enum class UsageHint {
+ Unknown = 0,
+ Background = 1,
+};
+
+enum class ColorTransform {
+ None,
+ Light,
+ Dark,
+};
+
+std::unique_ptr<SkCanvas> makeTransformCanvas(SkCanvas* inCanvas, ColorTransform transform);
+std::unique_ptr<SkCanvas> makeTransformCanvas(SkCanvas* inCanvas, UsageHint usageHint);
+
+} // namespace android::uirenderer; \ No newline at end of file
diff --git a/libs/hwui/DeviceInfo.cpp b/libs/hwui/DeviceInfo.cpp
index 40cc73a82846..10fcee88a995 100644
--- a/libs/hwui/DeviceInfo.cpp
+++ b/libs/hwui/DeviceInfo.cpp
@@ -31,7 +31,7 @@
namespace android {
namespace uirenderer {
-static constexpr android::DisplayInfo sDummyDisplay {
+static constexpr android::DisplayInfo sDummyDisplay{
1080, // w
1920, // h
320.0, // xdpi
diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp
deleted file mode 100644
index aa87aea8b374..000000000000
--- a/libs/hwui/DisplayList.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include <SkCanvas.h>
-#include <algorithm>
-
-#include <utils/Trace.h>
-
-#include "DamageAccumulator.h"
-#include "Debug.h"
-#include "DisplayList.h"
-#include "OpDumper.h"
-#include "RecordedOp.h"
-#include "RenderNode.h"
-#include "VectorDrawable.h"
-#include "renderthread/CanvasContext.h"
-
-namespace android {
-namespace uirenderer {
-
-DisplayList::DisplayList()
- : projectionReceiveIndex(-1)
- , stdAllocator(allocator)
- , chunks(stdAllocator)
- , ops(stdAllocator)
- , children(stdAllocator)
- , bitmapResources(stdAllocator)
- , pathResources(stdAllocator)
- , patchResources(stdAllocator)
- , paints(stdAllocator)
- , regions(stdAllocator)
- , referenceHolders(stdAllocator)
- , functors(stdAllocator)
- , vectorDrawables(stdAllocator) {}
-
-DisplayList::~DisplayList() {
- cleanupResources();
-}
-
-void DisplayList::cleanupResources() {
- if (CC_UNLIKELY(patchResources.size())) {
- ResourceCache& resourceCache = ResourceCache::getInstance();
- resourceCache.lock();
-
- for (size_t i = 0; i < patchResources.size(); i++) {
- resourceCache.decrementRefcountLocked(patchResources[i]);
- }
-
- resourceCache.unlock();
- }
-
- for (size_t i = 0; i < pathResources.size(); i++) {
- const SkPath* path = pathResources[i];
- if (path->unique() && Caches::hasInstance()) {
- Caches::getInstance().pathCache.removeDeferred(path);
- }
- delete path;
- }
-
- for (auto& iter : functors) {
- if (iter.listener) {
- iter.listener->onGlFunctorReleased(iter.functor);
- }
- }
-
- patchResources.clear();
- pathResources.clear();
- paints.clear();
- regions.clear();
-}
-
-size_t DisplayList::addChild(NodeOpType* op) {
- referenceHolders.push_back(op->renderNode);
- size_t index = children.size();
- children.push_back(op);
- return index;
-}
-
-void DisplayList::syncContents() {
- for (auto& iter : functors) {
- (*iter.functor)(DrawGlInfo::kModeSync, nullptr);
- }
- for (auto& vectorDrawable : vectorDrawables) {
- vectorDrawable->syncProperties();
- }
-}
-
-void DisplayList::updateChildren(std::function<void(RenderNode*)> updateFn) {
- for (auto&& child : children) {
- updateFn(child->renderNode);
- }
-}
-
-bool DisplayList::prepareListAndChildren(
- TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer,
- std::function<void(RenderNode*, TreeObserver&, TreeInfo&, bool)> childFn) {
- info.prepareTextures = info.canvasContext.pinImages(bitmapResources);
-
- for (auto&& op : children) {
- RenderNode* childNode = op->renderNode;
- info.damageAccumulator->pushTransform(&op->localMatrix);
- bool childFunctorsNeedLayer =
- functorsNeedLayer; // TODO! || op->mRecordedWithPotentialStencilClip;
- childFn(childNode, observer, info, childFunctorsNeedLayer);
- info.damageAccumulator->popTransform();
- }
-
- bool isDirty = false;
- for (auto& vectorDrawable : vectorDrawables) {
- // If any vector drawable in the display list needs update, damage the node.
- if (vectorDrawable->isDirty()) {
- isDirty = true;
- }
- vectorDrawable->setPropertyChangeWillBeConsumed(true);
- }
- return isDirty;
-}
-
-void DisplayList::output(std::ostream& output, uint32_t level) {
- for (auto&& op : getOps()) {
- OpDumper::dump(*op, output, level + 1);
- if (op->opId == RecordedOpId::RenderNodeOp) {
- auto rnOp = reinterpret_cast<const RenderNodeOp*>(op);
- rnOp->renderNode->output(output, level + 1);
- } else {
- output << std::endl;
- }
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/DisplayList.h b/libs/hwui/DisplayList.h
index 0cfc3b701aff..a952cc23e1ef 100644
--- a/libs/hwui/DisplayList.h
+++ b/libs/hwui/DisplayList.h
@@ -16,148 +16,20 @@
#pragma once
-#include <SkCamera.h>
-#include <SkDrawable.h>
-#include <SkMatrix.h>
-
-#include <private/hwui/DrawGlInfo.h>
-
-#include <utils/KeyedVector.h>
-#include <utils/LinearAllocator.h>
-#include <utils/RefBase.h>
-#include <utils/SortedVector.h>
-#include <utils/String8.h>
-
-#include <cutils/compiler.h>
-
-#include <androidfw/ResourceTypes.h>
-
-#include "CanvasProperty.h"
-#include "Debug.h"
-#include "GlFunctorLifecycleListener.h"
-#include "Matrix.h"
-#include "RenderProperties.h"
-#include "TreeInfo.h"
-#include "hwui/Bitmap.h"
-
-#include <vector>
-
-class SkBitmap;
-class SkPaint;
-class SkPath;
-class SkRegion;
+#include "pipeline/skia/SkiaDisplayList.h"
namespace android {
namespace uirenderer {
-class Rect;
-class Layer;
-
-struct RecordedOp;
-struct RenderNodeOp;
-
-typedef RecordedOp BaseOpType;
-typedef RenderNodeOp NodeOpType;
-
namespace VectorDrawable {
class Tree;
};
typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot;
-struct FunctorContainer {
- Functor* functor;
- GlFunctorLifecycleListener* listener;
-};
-
/**
* Data structure that holds the list of commands used in display list stream
*/
-class DisplayList {
- friend class RecordingCanvas;
-
-public:
- struct Chunk {
- // range of included ops in DisplayList::ops()
- size_t beginOpIndex;
- size_t endOpIndex;
-
- // range of included children in DisplayList::children()
- size_t beginChildIndex;
- size_t endChildIndex;
-
- // whether children with non-zero Z in the chunk should be reordered
- bool reorderChildren;
-
- // clip at the beginning of a reorder section, applied to reordered children
- const ClipBase* reorderClip;
- };
-
- DisplayList();
- virtual ~DisplayList();
-
- // index of DisplayListOp restore, after which projected descendants should be drawn
- int projectionReceiveIndex;
-
- const LsaVector<Chunk>& getChunks() const { return chunks; }
- const LsaVector<BaseOpType*>& getOps() const { return ops; }
-
- const LsaVector<NodeOpType*>& getChildren() const { return children; }
-
- const LsaVector<sk_sp<Bitmap>>& getBitmapResources() const { return bitmapResources; }
-
- size_t addChild(NodeOpType* childOp);
-
- void ref(VirtualLightRefBase* prop) { referenceHolders.push_back(prop); }
-
- size_t getUsedSize() { return allocator.usedSize(); }
-
- virtual bool isEmpty() const { return ops.empty(); }
- virtual bool hasFunctor() const { return !functors.empty(); }
- virtual bool hasVectorDrawables() const { return !vectorDrawables.empty(); }
- virtual bool isSkiaDL() const { return false; }
- virtual bool reuseDisplayList(RenderNode* node, renderthread::CanvasContext* context) {
- return false;
- }
-
- virtual void syncContents();
- virtual void updateChildren(std::function<void(RenderNode*)> updateFn);
- virtual bool prepareListAndChildren(
- TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer,
- std::function<void(RenderNode*, TreeObserver&, TreeInfo&, bool)> childFn);
-
- virtual void output(std::ostream& output, uint32_t level);
-
-protected:
- // allocator into which all ops and LsaVector arrays allocated
- LinearAllocator allocator;
- LinearStdAllocator<void*> stdAllocator;
-
-private:
- LsaVector<Chunk> chunks;
- LsaVector<BaseOpType*> ops;
-
- // list of Ops referring to RenderNode children for quick, non-drawing traversal
- LsaVector<NodeOpType*> children;
-
- // Resources - Skia objects + 9 patches referred to by this DisplayList
- LsaVector<sk_sp<Bitmap>> bitmapResources;
- LsaVector<const SkPath*> pathResources;
- LsaVector<const Res_png_9patch*> patchResources;
- LsaVector<std::unique_ptr<const SkPaint>> paints;
- LsaVector<std::unique_ptr<const SkRegion>> regions;
- LsaVector<sp<VirtualLightRefBase>> referenceHolders;
-
- // List of functors
- LsaVector<FunctorContainer> functors;
-
- // List of VectorDrawables that need to be notified of pushStaging. Note that this list gets
- // nothing
- // but a callback during sync DisplayList, unlike the list of functors defined above, which
- // gets special treatment exclusive for webview.
- LsaVector<VectorDrawableRoot*> vectorDrawables;
-
- void cleanupResources();
-};
+using DisplayList = skiapipeline::SkiaDisplayList;
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/EglReadback.cpp b/libs/hwui/EglReadback.cpp
new file mode 100644
index 000000000000..65becf88b930
--- /dev/null
+++ b/libs/hwui/EglReadback.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+#include "EglReadback.h"
+
+#include "renderthread/EglManager.h"
+
+#include <gui/Surface.h>
+#include <ui/Fence.h>
+#include <ui/GraphicBuffer.h>
+
+namespace android {
+namespace uirenderer {
+
+CopyResult EglReadback::copySurfaceInto(Surface& surface, const Rect& srcRect, SkBitmap* bitmap) {
+ ATRACE_CALL();
+ // Setup the source
+ sp<GraphicBuffer> sourceBuffer;
+ sp<Fence> sourceFence;
+ Matrix4 texTransform;
+ status_t err = surface.getLastQueuedBuffer(&sourceBuffer, &sourceFence, texTransform.data);
+ texTransform.invalidateType();
+ if (err != NO_ERROR) {
+ ALOGW("Failed to get last queued buffer, error = %d", err);
+ return CopyResult::UnknownError;
+ }
+ if (!sourceBuffer.get()) {
+ ALOGW("Surface doesn't have any previously queued frames, nothing to readback from");
+ return CopyResult::SourceEmpty;
+ }
+ if (sourceBuffer->getUsage() & GRALLOC_USAGE_PROTECTED) {
+ ALOGW("Surface is protected, unable to copy from it");
+ return CopyResult::SourceInvalid;
+ }
+ err = sourceFence->wait(500 /* ms */);
+ if (err != NO_ERROR) {
+ ALOGE("Timeout (500ms) exceeded waiting for buffer fence, abandoning readback attempt");
+ return CopyResult::Timeout;
+ }
+
+ return copyGraphicBufferInto(sourceBuffer.get(), texTransform, srcRect, bitmap);
+}
+
+CopyResult EglReadback::copyGraphicBufferInto(GraphicBuffer* graphicBuffer, Matrix4& texTransform,
+ const Rect& srcRect, SkBitmap* bitmap) {
+ mRenderThread.requireGlContext();
+ // TODO: Can't use Image helper since it forces GL_TEXTURE_2D usage via
+ // GL_OES_EGL_image, which doesn't work since we need samplerExternalOES
+ // to be able to properly sample from the buffer.
+
+ // Create the EGLImage object that maps the GraphicBuffer
+ EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ EGLClientBuffer clientBuffer = (EGLClientBuffer)graphicBuffer->getNativeBuffer();
+ EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
+
+ EGLImageKHR sourceImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
+ clientBuffer, attrs);
+
+ if (sourceImage == EGL_NO_IMAGE_KHR) {
+ ALOGW("eglCreateImageKHR failed (%#x)", eglGetError());
+ return CopyResult::UnknownError;
+ }
+
+ uint32_t width = graphicBuffer->getWidth();
+ uint32_t height = graphicBuffer->getHeight();
+ CopyResult copyResult =
+ copyImageInto(sourceImage, texTransform, width, height, srcRect, bitmap);
+
+ eglDestroyImageKHR(display, sourceImage);
+ return copyResult;
+}
+
+CopyResult EglReadback::copyGraphicBufferInto(GraphicBuffer* graphicBuffer, SkBitmap* bitmap) {
+ Rect srcRect;
+ Matrix4 transform;
+ transform.loadScale(1, -1, 1);
+ transform.translate(0, -1);
+ return copyGraphicBufferInto(graphicBuffer, transform, srcRect, bitmap);
+}
+
+} // namespace uirenderer
+} // namespace android
diff --git a/libs/hwui/OpenGLReadback.h b/libs/hwui/EglReadback.h
index ca40738b4901..e723169ad795 100644
--- a/libs/hwui/OpenGLReadback.h
+++ b/libs/hwui/EglReadback.h
@@ -18,16 +18,15 @@
#include "Readback.h"
+#include "Matrix.h"
+
#include <EGL/egl.h>
#include <EGL/eglext.h>
namespace android {
namespace uirenderer {
-class Matrix4;
-class GlLayer;
-
-class OpenGLReadback : public Readback {
+class EglReadback : public Readback {
public:
virtual CopyResult copySurfaceInto(Surface& surface, const Rect& srcRect,
SkBitmap* bitmap) override;
@@ -35,8 +34,8 @@ public:
SkBitmap* bitmap) override;
protected:
- explicit OpenGLReadback(renderthread::RenderThread& thread) : Readback(thread) {}
- virtual ~OpenGLReadback() {}
+ explicit EglReadback(renderthread::RenderThread& thread) : Readback(thread) {}
+ virtual ~EglReadback() {}
virtual CopyResult copyImageInto(EGLImageKHR eglImage, const Matrix4& imgTransform,
int imgWidth, int imgHeight, const Rect& srcRect,
@@ -47,21 +46,5 @@ private:
const Rect& srcRect, SkBitmap* bitmap);
};
-class OpenGLReadbackImpl : public OpenGLReadback {
-public:
- OpenGLReadbackImpl(renderthread::RenderThread& thread) : OpenGLReadback(thread) {}
-
- /**
- * Copies the layer's contents into the provided bitmap.
- */
- static bool copyLayerInto(renderthread::RenderThread& renderThread, GlLayer& layer,
- SkBitmap* bitmap);
-
-protected:
- virtual CopyResult copyImageInto(EGLImageKHR eglImage, const Matrix4& imgTransform,
- int imgWidth, int imgHeight, const Rect& srcRect,
- SkBitmap* bitmap) override;
-};
-
} // namespace uirenderer
} // namespace android
diff --git a/libs/hwui/Extensions.cpp b/libs/hwui/Extensions.cpp
deleted file mode 100644
index 530e82e65a28..000000000000
--- a/libs/hwui/Extensions.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include "Extensions.h"
-
-#include "Debug.h"
-#include "Properties.h"
-#include "utils/StringUtils.h"
-
-#include <cutils/compiler.h>
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include <utils/Log.h>
-
-namespace android {
-namespace uirenderer {
-
-Extensions::Extensions() {
- if (Properties::isSkiaEnabled()) {
- return;
- }
- const char* version = (const char*)glGetString(GL_VERSION);
-
- // Section 6.1.5 of the OpenGL ES specification indicates the GL version
- // string strictly follows this format:
- //
- // OpenGL<space>ES<space><version number><space><vendor-specific information>
- //
- // In addition section 6.1.5 describes the version number thusly:
- //
- // "The version number is either of the form major number.minor number or
- // major number.minor number.release number, where the numbers all have one
- // or more digits. The release number and vendor specific information are
- // optional."
-
- if (sscanf(version, "OpenGL ES %d.%d", &mVersionMajor, &mVersionMinor) != 2) {
- // If we cannot parse the version number, assume OpenGL ES 2.0
- mVersionMajor = 2;
- mVersionMinor = 0;
- }
-
- auto extensions = StringUtils::split((const char*)glGetString(GL_EXTENSIONS));
- mHasNPot = extensions.has("GL_OES_texture_npot");
- mHasFramebufferFetch = extensions.has("GL_NV_shader_framebuffer_fetch");
- mHasDiscardFramebuffer = extensions.has("GL_EXT_discard_framebuffer");
- mHasDebugMarker = extensions.has("GL_EXT_debug_marker");
- mHas1BitStencil = extensions.has("GL_OES_stencil1");
- mHas4BitStencil = extensions.has("GL_OES_stencil4");
- mHasUnpackSubImage = extensions.has("GL_EXT_unpack_subimage");
- mHasRenderableFloatTexture = extensions.has("GL_OES_texture_half_float");
-
- mHasSRGB = mVersionMajor >= 3 || extensions.has("GL_EXT_sRGB");
- mHasSRGBWriteControl = extensions.has("GL_EXT_sRGB_write_control");
-
-#ifdef ANDROID_ENABLE_LINEAR_BLENDING
- // If linear blending is enabled, the device must have (ES3.0 or EXT_sRGB)
- // and EXT_sRGB_write_control
- LOG_ALWAYS_FATAL_IF(!mHasSRGB, "Linear blending requires ES 3.0 or EXT_sRGB");
- LOG_ALWAYS_FATAL_IF(!mHasSRGBWriteControl, "Linear blending requires EXT_sRGB_write_control");
-
- mHasLinearBlending = true;
-#else
- mHasLinearBlending = false;
-#endif
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/Extensions.h b/libs/hwui/Extensions.h
index 214ee0bbeefd..e90f40c1c979 100644
--- a/libs/hwui/Extensions.h
+++ b/libs/hwui/Extensions.h
@@ -26,43 +26,31 @@ namespace uirenderer {
class Extensions {
public:
- Extensions();
-
- inline bool hasNPot() const { return mHasNPot; }
- inline bool hasFramebufferFetch() const { return mHasFramebufferFetch; }
- inline bool hasDiscardFramebuffer() const { return mHasDiscardFramebuffer; }
- inline bool hasDebugMarker() const { return mHasDebugMarker; }
- inline bool has1BitStencil() const { return mHas1BitStencil; }
- inline bool has4BitStencil() const { return mHas4BitStencil; }
- inline bool hasUnpackRowLength() const { return mVersionMajor >= 3 || mHasUnpackSubImage; }
+ Extensions() {}
+
+ inline bool hasNPot() const { return false; }
+ inline bool hasFramebufferFetch() const { return false; }
+ inline bool hasDiscardFramebuffer() const { return false; }
+ inline bool hasDebugMarker() const { return false; }
+ inline bool has1BitStencil() const { return false; }
+ inline bool has4BitStencil() const { return false; }
+ inline bool hasUnpackRowLength() const { return mVersionMajor >= 3; }
inline bool hasPixelBufferObjects() const { return mVersionMajor >= 3; }
inline bool hasOcclusionQueries() const { return mVersionMajor >= 3; }
inline bool hasFloatTextures() const { return mVersionMajor >= 3; }
inline bool hasRenderableFloatTextures() const {
- return (mVersionMajor >= 3 && mVersionMinor >= 2) || mHasRenderableFloatTexture;
+ return (mVersionMajor >= 3 && mVersionMinor >= 2);
}
- inline bool hasSRGB() const { return mHasSRGB; }
- inline bool hasSRGBWriteControl() const { return hasSRGB() && mHasSRGBWriteControl; }
- inline bool hasLinearBlending() const { return hasSRGB() && mHasLinearBlending; }
+ inline bool hasSRGB() const { return false; }
+ inline bool hasSRGBWriteControl() const { return hasSRGB() && false; }
+ inline bool hasLinearBlending() const { return hasSRGB() && false; }
inline int getMajorGlVersion() const { return mVersionMajor; }
inline int getMinorGlVersion() const { return mVersionMinor; }
private:
- bool mHasNPot;
- bool mHasFramebufferFetch;
- bool mHasDiscardFramebuffer;
- bool mHasDebugMarker;
- bool mHas1BitStencil;
- bool mHas4BitStencil;
- bool mHasUnpackSubImage;
- bool mHasSRGB;
- bool mHasSRGBWriteControl;
- bool mHasLinearBlending;
- bool mHasRenderableFloatTexture;
-
- int mVersionMajor;
- int mVersionMinor;
+ int mVersionMajor = 2;
+ int mVersionMinor = 0;
}; // class Extensions
}; // namespace uirenderer
diff --git a/libs/hwui/FboCache.cpp b/libs/hwui/FboCache.cpp
deleted file mode 100644
index 88302cc52c2b..000000000000
--- a/libs/hwui/FboCache.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <stdlib.h>
-
-#include "Debug.h"
-#include "FboCache.h"
-#include "Properties.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Constructors/destructor
-///////////////////////////////////////////////////////////////////////////////
-
-FboCache::FboCache() : mMaxSize(0) {}
-
-FboCache::~FboCache() {
- clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Size management
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t FboCache::getSize() {
- return mCache.size();
-}
-
-uint32_t FboCache::getMaxSize() {
- return mMaxSize;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Caching
-///////////////////////////////////////////////////////////////////////////////
-
-void FboCache::clear() {
- for (size_t i = 0; i < mCache.size(); i++) {
- const GLuint fbo = mCache.itemAt(i);
- glDeleteFramebuffers(1, &fbo);
- }
- mCache.clear();
-}
-
-GLuint FboCache::get() {
- GLuint fbo;
- if (mCache.size() > 0) {
- fbo = mCache.itemAt(mCache.size() - 1);
- mCache.removeAt(mCache.size() - 1);
- } else {
- glGenFramebuffers(1, &fbo);
- }
- return fbo;
-}
-
-bool FboCache::put(GLuint fbo) {
- if (mCache.size() < mMaxSize) {
- mCache.add(fbo);
- return true;
- }
-
- glDeleteFramebuffers(1, &fbo);
- return false;
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/FboCache.h b/libs/hwui/FboCache.h
deleted file mode 100644
index 5e8bb0c7a7a7..000000000000
--- a/libs/hwui/FboCache.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_FBO_CACHE_H
-#define ANDROID_HWUI_FBO_CACHE_H
-
-#include <GLES2/gl2.h>
-
-#include <utils/SortedVector.h>
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache
-///////////////////////////////////////////////////////////////////////////////
-
-class FboCache {
-public:
- FboCache();
- ~FboCache();
-
- /**
- * Returns an FBO from the cache. If no FBO is available, a new one
- * is created. If creating a new FBO fails, 0 is returned.
- *
- * When an FBO is obtained from the cache, it is removed and the
- * total number of FBOs available in the cache decreases.
- *
- * @return The name of the FBO, or 0 if no FBO can be obtained.
- */
- GLuint get();
-
- /**
- * Adds the specified FBO to the cache.
- *
- * @param fbo The FBO to add to the cache.
- *
- * @return True if the FBO was added, false otherwise.
- */
- bool put(GLuint fbo);
-
- /**
- * Clears the cache. This causes all FBOs to be deleted.
- */
- void clear();
-
- /**
- * Returns the current size of the cache.
- */
- uint32_t getSize();
-
- /**
- * Returns the maximum number of FBOs that the cache can hold.
- */
- uint32_t getMaxSize();
-
-private:
- SortedVector<GLuint> mCache;
- uint32_t mMaxSize;
-}; // class FboCache
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_FBO_CACHE_H
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp
deleted file mode 100644
index bbcedb15335d..000000000000
--- a/libs/hwui/FontRenderer.cpp
+++ /dev/null
@@ -1,802 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include "FontRenderer.h"
-
-#include "BakedOpDispatcher.h"
-#include "BakedOpRenderer.h"
-#include "BakedOpState.h"
-#include "Caches.h"
-#include "Debug.h"
-#include "Extensions.h"
-#include "Glop.h"
-#include "GlopBuilder.h"
-#include "PixelBuffer.h"
-#include "Rect.h"
-#include "font/Font.h"
-#include "renderstate/RenderState.h"
-#include "utils/Blur.h"
-#include "utils/Timing.h"
-
-#include <RenderScript.h>
-#include <SkGlyph.h>
-#include <SkUtils.h>
-#include <utils/Log.h>
-#include <algorithm>
-
-namespace android {
-namespace uirenderer {
-
-// blur inputs smaller than this constant will bypass renderscript
-#define RS_MIN_INPUT_CUTOFF 10000
-
-///////////////////////////////////////////////////////////////////////////////
-// TextSetupFunctor
-///////////////////////////////////////////////////////////////////////////////
-
-void TextDrawFunctor::draw(CacheTexture& texture, bool linearFiltering) {
- int textureFillFlags = TextureFillFlags::None;
- if (texture.getFormat() == GL_ALPHA) {
- textureFillFlags |= TextureFillFlags::IsAlphaMaskTexture;
- }
- if (linearFiltering) {
- textureFillFlags |= TextureFillFlags::ForceFilter;
- }
- int transformFlags =
- pureTranslate ? TransformFlags::MeshIgnoresCanvasTransform : TransformFlags::None;
-#ifdef ANDROID_ENABLE_LINEAR_BLENDING
- bool gammaCorrection = true;
-#else
- bool gammaCorrection = false;
-#endif
- Glop glop;
- GlopBuilder(renderer->renderState(), renderer->caches(), &glop)
- .setRoundRectClipState(bakedState->roundRectClipState)
- .setMeshTexturedIndexedQuads(texture.mesh(), texture.meshElementCount())
- .setFillTexturePaint(texture.getTexture(), textureFillFlags, paint, bakedState->alpha)
- .setGammaCorrection(gammaCorrection)
- .setTransform(bakedState->computedState.transform, transformFlags)
- .setModelViewIdentityEmptyBounds()
- .build();
- // Note: don't pass dirty bounds here, so user must manage passing dirty bounds to renderer
- renderer->renderGlop(nullptr, clip, glop);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// FontRenderer
-///////////////////////////////////////////////////////////////////////////////
-
-static bool sLogFontRendererCreate = true;
-
-FontRenderer::FontRenderer(const uint8_t* gammaTable)
- : mGammaTable(gammaTable)
- , mCurrentFont(nullptr)
- , mActiveFonts(LruCache<Font::FontDescription, Font*>::kUnlimitedCapacity)
- , mCurrentCacheTexture(nullptr)
- , mUploadTexture(false)
- , mFunctor(nullptr)
- , mClip(nullptr)
- , mBounds(nullptr)
- , mDrawn(false)
- , mInitialized(false)
- , mLinearFiltering(false) {
- if (sLogFontRendererCreate) {
- INIT_LOGD("Creating FontRenderer");
- }
-
- auto deviceInfo = DeviceInfo::get();
- auto displayInfo = deviceInfo->displayInfo();
- int maxTextureSize = deviceInfo->maxTextureSize();
-
- // Adjust cache size based on Pixel's desnsity.
- constexpr float PIXEL_DENSITY = 2.6;
- const float densityRatio = displayInfo.density / PIXEL_DENSITY;
-
- // TODO: Most devices are hardcoded with this configuration, does it need to be dynamic?
- mSmallCacheWidth =
- OffscreenBuffer::computeIdealDimension(std::min(1024, maxTextureSize) * densityRatio);
- mSmallCacheHeight =
- OffscreenBuffer::computeIdealDimension(std::min(1024, maxTextureSize) * densityRatio);
- mLargeCacheWidth =
- OffscreenBuffer::computeIdealDimension(std::min(2048, maxTextureSize) * densityRatio);
- mLargeCacheHeight =
- OffscreenBuffer::computeIdealDimension(std::min(1024, maxTextureSize) * densityRatio);
-
- if (sLogFontRendererCreate) {
- INIT_LOGD(" Text cache sizes, in pixels: %i x %i, %i x %i, %i x %i, %i x %i",
- mSmallCacheWidth, mSmallCacheHeight, mLargeCacheWidth, mLargeCacheHeight >> 1,
- mLargeCacheWidth, mLargeCacheHeight >> 1, mLargeCacheWidth, mLargeCacheHeight);
- }
-
- sLogFontRendererCreate = false;
-}
-
-void clearCacheTextures(std::vector<CacheTexture*>& cacheTextures) {
- for (uint32_t i = 0; i < cacheTextures.size(); i++) {
- delete cacheTextures[i];
- }
- cacheTextures.clear();
-}
-
-FontRenderer::~FontRenderer() {
- clearCacheTextures(mACacheTextures);
- clearCacheTextures(mRGBACacheTextures);
-
- LruCache<Font::FontDescription, Font*>::Iterator it(mActiveFonts);
- while (it.next()) {
- delete it.value();
- }
- mActiveFonts.clear();
-}
-
-void FontRenderer::flushAllAndInvalidate() {
- issueDrawCommand();
-
- LruCache<Font::FontDescription, Font*>::Iterator it(mActiveFonts);
- while (it.next()) {
- it.value()->invalidateTextureCache();
- }
-
- for (uint32_t i = 0; i < mACacheTextures.size(); i++) {
- mACacheTextures[i]->init();
-
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- mHistoryTracker.glyphsCleared(mACacheTextures[i]);
-#endif
- }
-
- for (uint32_t i = 0; i < mRGBACacheTextures.size(); i++) {
- mRGBACacheTextures[i]->init();
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- mHistoryTracker.glyphsCleared(mRGBACacheTextures[i]);
-#endif
- }
-
- mDrawn = false;
-}
-
-void FontRenderer::flushLargeCaches(std::vector<CacheTexture*>& cacheTextures) {
- // Start from 1; don't deallocate smallest/default texture
- for (uint32_t i = 1; i < cacheTextures.size(); i++) {
- CacheTexture* cacheTexture = cacheTextures[i];
- if (cacheTexture->getPixelBuffer()) {
- cacheTexture->init();
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- mHistoryTracker.glyphsCleared(cacheTexture);
-#endif
- LruCache<Font::FontDescription, Font*>::Iterator it(mActiveFonts);
- while (it.next()) {
- it.value()->invalidateTextureCache(cacheTexture);
- }
- cacheTexture->releasePixelBuffer();
- }
- }
-}
-
-void FontRenderer::flushLargeCaches() {
- flushLargeCaches(mACacheTextures);
- flushLargeCaches(mRGBACacheTextures);
-}
-
-CacheTexture* FontRenderer::cacheBitmapInTexture(std::vector<CacheTexture*>& cacheTextures,
- const SkGlyph& glyph, uint32_t* startX,
- uint32_t* startY) {
- for (uint32_t i = 0; i < cacheTextures.size(); i++) {
- if (cacheTextures[i]->fitBitmap(glyph, startX, startY)) {
- return cacheTextures[i];
- }
- }
- // Could not fit glyph into current cache textures
- return nullptr;
-}
-
-void FontRenderer::cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph,
- uint32_t* retOriginX, uint32_t* retOriginY, bool precaching) {
- checkInit();
-
- // If the glyph bitmap is empty let's assum the glyph is valid
- // so we can avoid doing extra work later on
- if (glyph.fWidth == 0 || glyph.fHeight == 0) {
- cachedGlyph->mIsValid = true;
- cachedGlyph->mCacheTexture = nullptr;
- return;
- }
-
- cachedGlyph->mIsValid = false;
-
- // choose an appropriate cache texture list for this glyph format
- SkMask::Format format = static_cast<SkMask::Format>(glyph.fMaskFormat);
- std::vector<CacheTexture*>* cacheTextures = nullptr;
- switch (format) {
- case SkMask::kA8_Format:
- case SkMask::kBW_Format:
- cacheTextures = &mACacheTextures;
- break;
- case SkMask::kARGB32_Format:
- cacheTextures = &mRGBACacheTextures;
- break;
- default:
-#if DEBUG_FONT_RENDERER
- ALOGD("getCacheTexturesForFormat: unknown SkMask format %x", format);
-#endif
- return;
- }
-
- // If the glyph is too tall, don't cache it
- if (glyph.fHeight + TEXTURE_BORDER_SIZE * 2 >
- (*cacheTextures)[cacheTextures->size() - 1]->getHeight()) {
- ALOGE("Font size too large to fit in cache. width, height = %i, %i", (int)glyph.fWidth,
- (int)glyph.fHeight);
- return;
- }
-
- // Now copy the bitmap into the cache texture
- uint32_t startX = 0;
- uint32_t startY = 0;
-
- CacheTexture* cacheTexture = cacheBitmapInTexture(*cacheTextures, glyph, &startX, &startY);
-
- if (!cacheTexture) {
- if (!precaching) {
- // If the new glyph didn't fit and we are not just trying to precache it,
- // clear out the cache and try again
- flushAllAndInvalidate();
- cacheTexture = cacheBitmapInTexture(*cacheTextures, glyph, &startX, &startY);
- }
-
- if (!cacheTexture) {
- // either the glyph didn't fit or we're precaching and will cache it when we draw
- return;
- }
- }
-
- cachedGlyph->mCacheTexture = cacheTexture;
-
- *retOriginX = startX;
- *retOriginY = startY;
-
- uint32_t endX = startX + glyph.fWidth;
- uint32_t endY = startY + glyph.fHeight;
-
- uint32_t cacheWidth = cacheTexture->getWidth();
-
- if (!cacheTexture->getPixelBuffer()) {
- Caches::getInstance().textureState().activateTexture(0);
- // Large-glyph texture memory is allocated only as needed
- cacheTexture->allocatePixelBuffer();
- }
- if (!cacheTexture->mesh()) {
- cacheTexture->allocateMesh();
- }
-
- uint8_t* cacheBuffer = cacheTexture->getPixelBuffer()->map();
- uint8_t* bitmapBuffer = (uint8_t*)glyph.fImage;
- int srcStride = glyph.rowBytes();
-
- // Copy the glyph image, taking the mask format into account
- switch (format) {
- case SkMask::kA8_Format: {
- uint32_t row =
- (startY - TEXTURE_BORDER_SIZE) * cacheWidth + startX - TEXTURE_BORDER_SIZE;
- // write leading border line
- memset(&cacheBuffer[row], 0, glyph.fWidth + 2 * TEXTURE_BORDER_SIZE);
- // write glyph data
- if (mGammaTable) {
- for (uint32_t cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY += srcStride) {
- row = cacheY * cacheWidth;
- cacheBuffer[row + startX - TEXTURE_BORDER_SIZE] = 0;
- for (uint32_t cacheX = startX, bX = 0; cacheX < endX; cacheX++, bX++) {
- uint8_t tempCol = bitmapBuffer[bY + bX];
- cacheBuffer[row + cacheX] = mGammaTable[tempCol];
- }
- cacheBuffer[row + endX + TEXTURE_BORDER_SIZE - 1] = 0;
- }
- } else {
- for (uint32_t cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY += srcStride) {
- row = cacheY * cacheWidth;
- memcpy(&cacheBuffer[row + startX], &bitmapBuffer[bY], glyph.fWidth);
- cacheBuffer[row + startX - TEXTURE_BORDER_SIZE] = 0;
- cacheBuffer[row + endX + TEXTURE_BORDER_SIZE - 1] = 0;
- }
- }
- // write trailing border line
- row = (endY + TEXTURE_BORDER_SIZE - 1) * cacheWidth + startX - TEXTURE_BORDER_SIZE;
- memset(&cacheBuffer[row], 0, glyph.fWidth + 2 * TEXTURE_BORDER_SIZE);
- break;
- }
- case SkMask::kARGB32_Format: {
- // prep data lengths
- const size_t formatSize = PixelBuffer::formatSize(GL_RGBA);
- const size_t borderSize = formatSize * TEXTURE_BORDER_SIZE;
- size_t rowSize = formatSize * glyph.fWidth;
- // prep advances
- size_t dstStride = formatSize * cacheWidth;
- // prep indices
- // - we actually start one row early, and then increment before first copy
- uint8_t* src = &bitmapBuffer[0 - srcStride];
- uint8_t* dst = &cacheBuffer[cacheTexture->getOffset(startX, startY - 1)];
- uint8_t* dstEnd = &cacheBuffer[cacheTexture->getOffset(startX, endY - 1)];
- uint8_t* dstL = dst - borderSize;
- uint8_t* dstR = dst + rowSize;
- // write leading border line
- memset(dstL, 0, rowSize + 2 * borderSize);
- // write glyph data
- while (dst < dstEnd) {
- memset(dstL += dstStride, 0, borderSize); // leading border column
- memcpy(dst += dstStride, src += srcStride, rowSize); // glyph data
- memset(dstR += dstStride, 0, borderSize); // trailing border column
- }
- // write trailing border line
- memset(dstL += dstStride, 0, rowSize + 2 * borderSize);
- break;
- }
- case SkMask::kBW_Format: {
- uint32_t cacheX = 0, cacheY = 0;
- uint32_t row =
- (startY - TEXTURE_BORDER_SIZE) * cacheWidth + startX - TEXTURE_BORDER_SIZE;
- static const uint8_t COLORS[2] = {0, 255};
- // write leading border line
- memset(&cacheBuffer[row], 0, glyph.fWidth + 2 * TEXTURE_BORDER_SIZE);
- // write glyph data
- for (cacheY = startY; cacheY < endY; cacheY++) {
- cacheX = startX;
- int rowBytes = srcStride;
- uint8_t* buffer = bitmapBuffer;
-
- row = cacheY * cacheWidth;
- cacheBuffer[row + startX - TEXTURE_BORDER_SIZE] = 0;
- while (--rowBytes >= 0) {
- uint8_t b = *buffer++;
- for (int8_t mask = 7; mask >= 0 && cacheX < endX; mask--) {
- cacheBuffer[cacheY * cacheWidth + cacheX++] = COLORS[(b >> mask) & 0x1];
- }
- }
- cacheBuffer[row + endX + TEXTURE_BORDER_SIZE - 1] = 0;
-
- bitmapBuffer += srcStride;
- }
- // write trailing border line
- row = (endY + TEXTURE_BORDER_SIZE - 1) * cacheWidth + startX - TEXTURE_BORDER_SIZE;
- memset(&cacheBuffer[row], 0, glyph.fWidth + 2 * TEXTURE_BORDER_SIZE);
- break;
- }
- default:
- ALOGW("Unknown glyph format: 0x%x", format);
- break;
- }
-
- cachedGlyph->mIsValid = true;
-
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- mHistoryTracker.glyphUploaded(cacheTexture, startX, startY, glyph.fWidth, glyph.fHeight);
-#endif
-}
-
-CacheTexture* FontRenderer::createCacheTexture(int width, int height, GLenum format,
- bool allocate) {
- CacheTexture* cacheTexture = new CacheTexture(width, height, format, kMaxNumberOfQuads);
-
- if (allocate) {
- Caches::getInstance().textureState().activateTexture(0);
- cacheTexture->allocatePixelBuffer();
- cacheTexture->allocateMesh();
- }
-
- return cacheTexture;
-}
-
-void FontRenderer::initTextTexture() {
- clearCacheTextures(mACacheTextures);
- clearCacheTextures(mRGBACacheTextures);
-
- mUploadTexture = false;
- mACacheTextures.push_back(
- createCacheTexture(mSmallCacheWidth, mSmallCacheHeight, GL_ALPHA, true));
- mACacheTextures.push_back(
- createCacheTexture(mLargeCacheWidth, mLargeCacheHeight >> 1, GL_ALPHA, false));
- mACacheTextures.push_back(
- createCacheTexture(mLargeCacheWidth, mLargeCacheHeight >> 1, GL_ALPHA, false));
- mACacheTextures.push_back(
- createCacheTexture(mLargeCacheWidth, mLargeCacheHeight, GL_ALPHA, false));
- mRGBACacheTextures.push_back(
- createCacheTexture(mSmallCacheWidth, mSmallCacheHeight, GL_RGBA, false));
- mRGBACacheTextures.push_back(
- createCacheTexture(mLargeCacheWidth, mLargeCacheHeight >> 1, GL_RGBA, false));
- mCurrentCacheTexture = mACacheTextures[0];
-}
-
-// We don't want to allocate anything unless we actually draw text
-void FontRenderer::checkInit() {
- if (mInitialized) {
- return;
- }
-
- initTextTexture();
-
- mInitialized = true;
-}
-
-void checkTextureUpdateForCache(Caches& caches, std::vector<CacheTexture*>& cacheTextures,
- bool& resetPixelStore, GLuint& lastTextureId) {
- for (uint32_t i = 0; i < cacheTextures.size(); i++) {
- CacheTexture* cacheTexture = cacheTextures[i];
- if (cacheTexture->isDirty() && cacheTexture->getPixelBuffer()) {
- if (cacheTexture->getTextureId() != lastTextureId) {
- lastTextureId = cacheTexture->getTextureId();
- caches.textureState().activateTexture(0);
- caches.textureState().bindTexture(lastTextureId);
- }
-
- if (cacheTexture->upload()) {
- resetPixelStore = true;
- }
- }
- }
-}
-
-void FontRenderer::checkTextureUpdate() {
- if (!mUploadTexture) {
- return;
- }
-
- Caches& caches = Caches::getInstance();
- GLuint lastTextureId = 0;
-
- bool resetPixelStore = false;
-
- // Iterate over all the cache textures and see which ones need to be updated
- checkTextureUpdateForCache(caches, mACacheTextures, resetPixelStore, lastTextureId);
- checkTextureUpdateForCache(caches, mRGBACacheTextures, resetPixelStore, lastTextureId);
-
- // Unbind any PBO we might have used to update textures
- caches.pixelBufferState().unbind();
-
- // Reset to default unpack row length to avoid affecting texture
- // uploads in other parts of the renderer
- if (resetPixelStore) {
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
- }
-
- mUploadTexture = false;
-}
-
-void FontRenderer::issueDrawCommand(std::vector<CacheTexture*>& cacheTextures) {
- if (!mFunctor) return;
-
- bool first = true;
- for (uint32_t i = 0; i < cacheTextures.size(); i++) {
- CacheTexture* texture = cacheTextures[i];
- if (texture->canDraw()) {
- if (first) {
- checkTextureUpdate();
- first = false;
- mDrawn = true;
- }
-
- mFunctor->draw(*texture, mLinearFiltering);
-
- texture->resetMesh();
- }
- }
-}
-
-void FontRenderer::issueDrawCommand() {
- issueDrawCommand(mACacheTextures);
- issueDrawCommand(mRGBACacheTextures);
-}
-
-void FontRenderer::appendMeshQuadNoClip(float x1, float y1, float u1, float v1, float x2, float y2,
- float u2, float v2, float x3, float y3, float u3, float v3,
- float x4, float y4, float u4, float v4,
- CacheTexture* texture) {
- if (texture != mCurrentCacheTexture) {
- // Now use the new texture id
- mCurrentCacheTexture = texture;
- }
-
- mCurrentCacheTexture->addQuad(x1, y1, u1, v1, x2, y2, u2, v2, x3, y3, u3, v3, x4, y4, u4, v4);
-}
-
-void FontRenderer::appendMeshQuad(float x1, float y1, float u1, float v1, float x2, float y2,
- float u2, float v2, float x3, float y3, float u3, float v3,
- float x4, float y4, float u4, float v4, CacheTexture* texture) {
- if (mClip && (x1 > mClip->right || y1 < mClip->top || x2 < mClip->left || y4 > mClip->bottom)) {
- return;
- }
-
- appendMeshQuadNoClip(x1, y1, u1, v1, x2, y2, u2, v2, x3, y3, u3, v3, x4, y4, u4, v4, texture);
-
- if (mBounds) {
- mBounds->left = std::min(mBounds->left, x1);
- mBounds->top = std::min(mBounds->top, y3);
- mBounds->right = std::max(mBounds->right, x3);
- mBounds->bottom = std::max(mBounds->bottom, y1);
- }
-
- if (mCurrentCacheTexture->endOfMesh()) {
- issueDrawCommand();
- }
-}
-
-void FontRenderer::appendRotatedMeshQuad(float x1, float y1, float u1, float v1, float x2, float y2,
- float u2, float v2, float x3, float y3, float u3, float v3,
- float x4, float y4, float u4, float v4,
- CacheTexture* texture) {
- appendMeshQuadNoClip(x1, y1, u1, v1, x2, y2, u2, v2, x3, y3, u3, v3, x4, y4, u4, v4, texture);
-
- if (mBounds) {
- mBounds->left = std::min(mBounds->left, std::min(x1, std::min(x2, std::min(x3, x4))));
- mBounds->top = std::min(mBounds->top, std::min(y1, std::min(y2, std::min(y3, y4))));
- mBounds->right = std::max(mBounds->right, std::max(x1, std::max(x2, std::max(x3, x4))));
- mBounds->bottom = std::max(mBounds->bottom, std::max(y1, std::max(y2, std::max(y3, y4))));
- }
-
- if (mCurrentCacheTexture->endOfMesh()) {
- issueDrawCommand();
- }
-}
-
-void FontRenderer::setFont(const SkPaint* paint, const SkMatrix& matrix) {
- mCurrentFont = Font::create(this, paint, matrix);
-}
-
-FontRenderer::DropShadow FontRenderer::renderDropShadow(const SkPaint* paint, const glyph_t* glyphs,
- int numGlyphs, float radius,
- const float* positions) {
- checkInit();
-
- DropShadow image;
- image.width = 0;
- image.height = 0;
- image.image = nullptr;
- image.penX = 0;
- image.penY = 0;
-
- if (!mCurrentFont) {
- return image;
- }
-
- mDrawn = false;
- mClip = nullptr;
- mBounds = nullptr;
-
- Rect bounds;
- mCurrentFont->measure(paint, glyphs, numGlyphs, &bounds, positions);
-
- uint32_t intRadius = Blur::convertRadiusToInt(radius);
- uint32_t paddedWidth = (uint32_t)(bounds.right - bounds.left) + 2 * intRadius;
- uint32_t paddedHeight = (uint32_t)(bounds.top - bounds.bottom) + 2 * intRadius;
-
- uint32_t maxSize = Caches::getInstance().maxTextureSize;
- if (paddedWidth > maxSize || paddedHeight > maxSize) {
- return image;
- }
-
- // Align buffers for renderscript usage
- if (paddedWidth & (RS_CPU_ALLOCATION_ALIGNMENT - 1)) {
- paddedWidth += RS_CPU_ALLOCATION_ALIGNMENT - paddedWidth % RS_CPU_ALLOCATION_ALIGNMENT;
- }
- int size = paddedWidth * paddedHeight;
- uint8_t* dataBuffer = (uint8_t*)memalign(RS_CPU_ALLOCATION_ALIGNMENT, size);
-
- memset(dataBuffer, 0, size);
-
- int penX = intRadius - bounds.left;
- int penY = intRadius - bounds.bottom;
-
- if ((bounds.right > bounds.left) && (bounds.top > bounds.bottom)) {
- // text has non-whitespace, so draw and blur to create the shadow
- // NOTE: bounds.isEmpty() can't be used here, since vertical coordinates are inverted
- // TODO: don't draw pure whitespace in the first place, and avoid needing this check
- mCurrentFont->render(paint, glyphs, numGlyphs, penX, penY, Font::BITMAP, dataBuffer,
- paddedWidth, paddedHeight, nullptr, positions);
-
- // Unbind any PBO we might have used
- Caches::getInstance().pixelBufferState().unbind();
-
- blurImage(&dataBuffer, paddedWidth, paddedHeight, radius);
- }
-
- image.width = paddedWidth;
- image.height = paddedHeight;
- image.image = dataBuffer;
- image.penX = penX;
- image.penY = penY;
-
- return image;
-}
-
-void FontRenderer::initRender(const Rect* clip, Rect* bounds, TextDrawFunctor* functor) {
- checkInit();
-
- mDrawn = false;
- mBounds = bounds;
- mFunctor = functor;
- mClip = clip;
-}
-
-void FontRenderer::finishRender() {
- mBounds = nullptr;
- mClip = nullptr;
-
- issueDrawCommand();
-}
-
-void FontRenderer::precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs,
- const SkMatrix& matrix) {
- Font* font = Font::create(this, paint, matrix);
- font->precache(paint, glyphs, numGlyphs);
-}
-
-void FontRenderer::endPrecaching() {
- checkTextureUpdate();
-}
-
-bool FontRenderer::renderPosText(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
- int numGlyphs, int x, int y, const float* positions, Rect* bounds,
- TextDrawFunctor* functor, bool forceFinish) {
- if (!mCurrentFont) {
- ALOGE("No font set");
- return false;
- }
-
- initRender(clip, bounds, functor);
- mCurrentFont->render(paint, glyphs, numGlyphs, x, y, positions);
-
- if (forceFinish) {
- finishRender();
- }
-
- return mDrawn;
-}
-
-bool FontRenderer::renderTextOnPath(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
- int numGlyphs, const SkPath* path, float hOffset, float vOffset,
- Rect* bounds, TextDrawFunctor* functor) {
- if (!mCurrentFont) {
- ALOGE("No font set");
- return false;
- }
-
- initRender(clip, bounds, functor);
- mCurrentFont->render(paint, glyphs, numGlyphs, path, hOffset, vOffset);
- finishRender();
-
- return mDrawn;
-}
-
-void FontRenderer::blurImage(uint8_t** image, int32_t width, int32_t height, float radius) {
- uint32_t intRadius = Blur::convertRadiusToInt(radius);
- if (width * height * intRadius >= RS_MIN_INPUT_CUTOFF && radius <= 25.0f) {
- uint8_t* outImage = (uint8_t*)memalign(RS_CPU_ALLOCATION_ALIGNMENT, width * height);
-
- if (mRs == nullptr) {
- mRs = new RSC::RS();
- // a null path is OK because there are no custom kernels used
- // hence nothing gets cached by RS
- if (!mRs->init("", RSC::RS_INIT_LOW_LATENCY | RSC::RS_INIT_SYNCHRONOUS)) {
- mRs.clear();
- ALOGE("blur RS failed to init");
- } else {
- mRsElement = RSC::Element::A_8(mRs);
- mRsScript = RSC::ScriptIntrinsicBlur::create(mRs, mRsElement);
- }
- }
- if (mRs != nullptr) {
- RSC::sp<const RSC::Type> t = RSC::Type::create(mRs, mRsElement, width, height, 0);
- RSC::sp<RSC::Allocation> ain = RSC::Allocation::createTyped(
- mRs, t, RS_ALLOCATION_MIPMAP_NONE,
- RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED, *image);
- RSC::sp<RSC::Allocation> aout = RSC::Allocation::createTyped(
- mRs, t, RS_ALLOCATION_MIPMAP_NONE,
- RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED, outImage);
-
- mRsScript->setRadius(radius);
- mRsScript->setInput(ain);
- mRsScript->forEach(aout);
-
- // replace the original image's pointer, avoiding a copy back to the original buffer
- free(*image);
- *image = outImage;
-
- return;
- }
- }
-
- std::unique_ptr<float[]> gaussian(new float[2 * intRadius + 1]);
- Blur::generateGaussianWeights(gaussian.get(), radius);
-
- std::unique_ptr<uint8_t[]> scratch(new uint8_t[width * height]);
- Blur::horizontal(gaussian.get(), intRadius, *image, scratch.get(), width, height);
- Blur::vertical(gaussian.get(), intRadius, scratch.get(), *image, width, height);
-}
-
-static uint32_t calculateCacheSize(const std::vector<CacheTexture*>& cacheTextures) {
- uint32_t size = 0;
- for (uint32_t i = 0; i < cacheTextures.size(); i++) {
- CacheTexture* cacheTexture = cacheTextures[i];
- if (cacheTexture && cacheTexture->getPixelBuffer()) {
- size += cacheTexture->getPixelBuffer()->getSize();
- }
- }
- return size;
-}
-
-static uint32_t calculateFreeCacheSize(const std::vector<CacheTexture*>& cacheTextures) {
- uint32_t size = 0;
- for (uint32_t i = 0; i < cacheTextures.size(); i++) {
- CacheTexture* cacheTexture = cacheTextures[i];
- if (cacheTexture && cacheTexture->getPixelBuffer()) {
- size += cacheTexture->calculateFreeMemory();
- }
- }
- return size;
-}
-
-const std::vector<CacheTexture*>& FontRenderer::cacheTexturesForFormat(GLenum format) const {
- switch (format) {
- case GL_ALPHA: {
- return mACacheTextures;
- }
- case GL_RGBA: {
- return mRGBACacheTextures;
- }
- default: {
- LOG_ALWAYS_FATAL("Unsupported format: %d", format);
- // Impossible to hit this, but the compiler doesn't know that
- return *(new std::vector<CacheTexture*>());
- }
- }
-}
-
-static void dumpTextures(String8& log, const char* tag,
- const std::vector<CacheTexture*>& cacheTextures) {
- for (uint32_t i = 0; i < cacheTextures.size(); i++) {
- CacheTexture* cacheTexture = cacheTextures[i];
- if (cacheTexture && cacheTexture->getPixelBuffer()) {
- uint32_t free = cacheTexture->calculateFreeMemory();
- uint32_t total = cacheTexture->getPixelBuffer()->getSize();
- log.appendFormat(" %-4s texture %d %8d / %8d\n", tag, i, total - free, total);
- }
- }
-}
-
-void FontRenderer::dumpMemoryUsage(String8& log) const {
- const uint32_t sizeA8 = getCacheSize(GL_ALPHA);
- const uint32_t usedA8 = sizeA8 - getFreeCacheSize(GL_ALPHA);
- const uint32_t sizeRGBA = getCacheSize(GL_RGBA);
- const uint32_t usedRGBA = sizeRGBA - getFreeCacheSize(GL_RGBA);
- log.appendFormat(" FontRenderer A8 %8d / %8d\n", usedA8, sizeA8);
- dumpTextures(log, "A8", cacheTexturesForFormat(GL_ALPHA));
- log.appendFormat(" FontRenderer RGBA %8d / %8d\n", usedRGBA, sizeRGBA);
- dumpTextures(log, "RGBA", cacheTexturesForFormat(GL_RGBA));
- log.appendFormat(" FontRenderer total %8d / %8d\n", usedA8 + usedRGBA, sizeA8 + sizeRGBA);
-}
-
-uint32_t FontRenderer::getCacheSize(GLenum format) const {
- return calculateCacheSize(cacheTexturesForFormat(format));
-}
-
-uint32_t FontRenderer::getFreeCacheSize(GLenum format) const {
- return calculateFreeCacheSize(cacheTexturesForFormat(format));
-}
-
-uint32_t FontRenderer::getSize() const {
- return getCacheSize(GL_ALPHA) + getCacheSize(GL_RGBA);
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h
deleted file mode 100644
index 6b9dec4719cb..000000000000
--- a/libs/hwui/FontRenderer.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "font/CacheTexture.h"
-#include "font/CachedGlyphInfo.h"
-#include "font/Font.h"
-#include "font/FontUtil.h"
-#ifdef BUGREPORT_FONT_CACHE_USAGE
-#include "font/FontCacheHistoryTracker.h"
-#endif
-
-#include <utils/LruCache.h>
-#include <utils/String8.h>
-#include <utils/StrongPointer.h>
-
-#include <SkPaint.h>
-
-#include <GLES2/gl2.h>
-
-#include <vector>
-
-#include "RenderScript.h"
-namespace RSC {
-class Element;
-class RS;
-class ScriptIntrinsicBlur;
-class sp;
-}
-
-namespace android {
-namespace uirenderer {
-
-class BakedOpState;
-class BakedOpRenderer;
-struct ClipBase;
-
-class TextDrawFunctor {
-public:
- TextDrawFunctor(BakedOpRenderer* renderer, const BakedOpState* bakedState, const ClipBase* clip,
- float x, float y, bool pureTranslate, int alpha, SkBlendMode mode,
- const SkPaint* paint)
- : renderer(renderer)
- , bakedState(bakedState)
- , clip(clip)
- , x(x)
- , y(y)
- , pureTranslate(pureTranslate)
- , alpha(alpha)
- , mode(mode)
- , paint(paint) {}
-
- void draw(CacheTexture& texture, bool linearFiltering);
-
- BakedOpRenderer* renderer;
- const BakedOpState* bakedState;
- const ClipBase* clip;
- float x;
- float y;
- bool pureTranslate;
- int alpha;
- SkBlendMode mode;
- const SkPaint* paint;
-};
-
-class FontRenderer {
-public:
- explicit FontRenderer(const uint8_t* gammaTable);
- ~FontRenderer();
-
- void flushLargeCaches(std::vector<CacheTexture*>& cacheTextures);
- void flushLargeCaches();
-
- void setFont(const SkPaint* paint, const SkMatrix& matrix);
-
- void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs,
- const SkMatrix& matrix);
- void endPrecaching();
-
- bool renderPosText(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs, int numGlyphs,
- int x, int y, const float* positions, Rect* outBounds,
- TextDrawFunctor* functor, bool forceFinish = true);
-
- bool renderTextOnPath(const SkPaint* paint, const Rect* clip, const glyph_t* glyphs,
- int numGlyphs, const SkPath* path, float hOffset, float vOffset,
- Rect* outBounds, TextDrawFunctor* functor);
-
- struct DropShadow {
- uint32_t width;
- uint32_t height;
- uint8_t* image;
- int32_t penX;
- int32_t penY;
- };
-
- // After renderDropShadow returns, the called owns the memory in DropShadow.image
- // and is responsible for releasing it when it's done with it
- DropShadow renderDropShadow(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs,
- float radius, const float* positions);
-
- void setTextureFiltering(bool linearFiltering) { mLinearFiltering = linearFiltering; }
-
- uint32_t getSize() const;
- void dumpMemoryUsage(String8& log) const;
-
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- FontCacheHistoryTracker& historyTracker() { return mHistoryTracker; }
-#endif
-
-private:
- friend class Font;
-
- const uint8_t* mGammaTable;
-
- void allocateTextureMemory(CacheTexture* cacheTexture);
- void deallocateTextureMemory(CacheTexture* cacheTexture);
- void initTextTexture();
- CacheTexture* createCacheTexture(int width, int height, GLenum format, bool allocate);
- void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph, uint32_t* retOriginX,
- uint32_t* retOriginY, bool precaching);
- CacheTexture* cacheBitmapInTexture(std::vector<CacheTexture*>& cacheTextures,
- const SkGlyph& glyph, uint32_t* startX, uint32_t* startY);
-
- void flushAllAndInvalidate();
-
- void checkInit();
- void initRender(const Rect* clip, Rect* bounds, TextDrawFunctor* functor);
- void finishRender();
-
- void issueDrawCommand(std::vector<CacheTexture*>& cacheTextures);
- void issueDrawCommand();
- void appendMeshQuadNoClip(float x1, float y1, float u1, float v1, float x2, float y2, float u2,
- float v2, float x3, float y3, float u3, float v3, float x4, float y4,
- float u4, float v4, CacheTexture* texture);
- void appendMeshQuad(float x1, float y1, float u1, float v1, float x2, float y2, float u2,
- float v2, float x3, float y3, float u3, float v3, float x4, float y4,
- float u4, float v4, CacheTexture* texture);
- void appendRotatedMeshQuad(float x1, float y1, float u1, float v1, float x2, float y2, float u2,
- float v2, float x3, float y3, float u3, float v3, float x4, float y4,
- float u4, float v4, CacheTexture* texture);
-
- void checkTextureUpdate();
-
- void setTextureDirty() { mUploadTexture = true; }
-
- const std::vector<CacheTexture*>& cacheTexturesForFormat(GLenum format) const;
- uint32_t getCacheSize(GLenum format) const;
- uint32_t getFreeCacheSize(GLenum format) const;
-
- uint32_t mSmallCacheWidth;
- uint32_t mSmallCacheHeight;
- uint32_t mLargeCacheWidth;
- uint32_t mLargeCacheHeight;
-
- std::vector<CacheTexture*> mACacheTextures;
- std::vector<CacheTexture*> mRGBACacheTextures;
-
- Font* mCurrentFont;
- LruCache<Font::FontDescription, Font*> mActiveFonts;
-
- CacheTexture* mCurrentCacheTexture;
-
- bool mUploadTexture;
-
- TextDrawFunctor* mFunctor;
- const Rect* mClip;
- Rect* mBounds;
- bool mDrawn;
-
- bool mInitialized;
-
- bool mLinearFiltering;
-
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- FontCacheHistoryTracker mHistoryTracker;
-#endif
-
- // RS constructs
- RSC::sp<RSC::RS> mRs;
- RSC::sp<const RSC::Element> mRsElement;
- RSC::sp<RSC::ScriptIntrinsicBlur> mRsScript;
-
- static void computeGaussianWeights(float* weights, int32_t radius);
- static void horizontalBlur(float* weights, int32_t radius, const uint8_t* source, uint8_t* dest,
- int32_t width, int32_t height);
- static void verticalBlur(float* weights, int32_t radius, const uint8_t* source, uint8_t* dest,
- int32_t width, int32_t height);
-
- // the input image handle may have its pointer replaced (to avoid copies)
- void blurImage(uint8_t** image, int32_t width, int32_t height, float radius);
-};
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp
deleted file mode 100644
index ced37ede0746..000000000000
--- a/libs/hwui/FrameBuilder.cpp
+++ /dev/null
@@ -1,976 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "FrameBuilder.h"
-
-#include "DeferredLayerUpdater.h"
-#include "LayerUpdateQueue.h"
-#include "RenderNode.h"
-#include "VectorDrawable.h"
-#include "hwui/Canvas.h"
-#include "renderstate/OffscreenBufferPool.h"
-#include "utils/FatVector.h"
-#include "utils/PaintUtils.h"
-#include "utils/TraceUtils.h"
-
-#include <SkPathOps.h>
-#include <utils/TypeHelpers.h>
-
-namespace android {
-namespace uirenderer {
-
-FrameBuilder::FrameBuilder(const SkRect& clip, uint32_t viewportWidth, uint32_t viewportHeight,
- const LightGeometry& lightGeometry, Caches& caches)
- : mStdAllocator(mAllocator)
- , mLayerBuilders(mStdAllocator)
- , mLayerStack(mStdAllocator)
- , mCanvasState(*this)
- , mCaches(caches)
- , mLightRadius(lightGeometry.radius)
- , mDrawFbo0(true) {
- // Prepare to defer Fbo0
- auto fbo0 = mAllocator.create<LayerBuilder>(viewportWidth, viewportHeight, Rect(clip));
- mLayerBuilders.push_back(fbo0);
- mLayerStack.push_back(0);
- mCanvasState.initializeSaveStack(viewportWidth, viewportHeight, clip.fLeft, clip.fTop,
- clip.fRight, clip.fBottom, lightGeometry.center);
-}
-
-FrameBuilder::FrameBuilder(const LayerUpdateQueue& layers, const LightGeometry& lightGeometry,
- Caches& caches)
- : mStdAllocator(mAllocator)
- , mLayerBuilders(mStdAllocator)
- , mLayerStack(mStdAllocator)
- , mCanvasState(*this)
- , mCaches(caches)
- , mLightRadius(lightGeometry.radius)
- , mDrawFbo0(false) {
- // TODO: remove, with each layer on its own save stack
-
- // Prepare to defer Fbo0 (which will be empty)
- auto fbo0 = mAllocator.create<LayerBuilder>(1, 1, Rect(1, 1));
- mLayerBuilders.push_back(fbo0);
- mLayerStack.push_back(0);
- mCanvasState.initializeSaveStack(1, 1, 0, 0, 1, 1, lightGeometry.center);
-
- deferLayers(layers);
-}
-
-void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) {
- // Render all layers to be updated, in order. Defer in reverse order, so that they'll be
- // updated in the order they're passed in (mLayerBuilders are issued to Renderer in reverse)
- for (int i = layers.entries().size() - 1; i >= 0; i--) {
- RenderNode* layerNode = layers.entries()[i].renderNode.get();
- // only schedule repaint if node still on layer - possible it may have been
- // removed during a dropped frame, but layers may still remain scheduled so
- // as not to lose info on what portion is damaged
- OffscreenBuffer* layer = layerNode->getLayer();
- if (CC_LIKELY(layer)) {
- ATRACE_FORMAT("Optimize HW Layer DisplayList %s %ux%u", layerNode->getName(),
- layerNode->getWidth(), layerNode->getHeight());
-
- Rect layerDamage = layers.entries()[i].damage;
- // TODO: ensure layer damage can't be larger than layer
- layerDamage.doIntersect(0, 0, layer->viewportWidth, layer->viewportHeight);
- layerNode->computeOrdering();
-
- // map current light center into RenderNode's coordinate space
- Vector3 lightCenter = mCanvasState.currentSnapshot()->getRelativeLightCenter();
- layer->inverseTransformInWindow.mapPoint3d(lightCenter);
-
- saveForLayer(layerNode->getWidth(), layerNode->getHeight(), 0, 0, layerDamage,
- lightCenter, nullptr, layerNode);
-
- if (layerNode->getDisplayList()) {
- deferNodeOps(*layerNode);
- }
- restoreForLayer();
- }
- }
-}
-
-void FrameBuilder::deferRenderNode(RenderNode& renderNode) {
- renderNode.computeOrdering();
-
- mCanvasState.save(SaveFlags::MatrixClip);
- deferNodePropsAndOps(renderNode);
- mCanvasState.restore();
-}
-
-void FrameBuilder::deferRenderNode(float tx, float ty, Rect clipRect, RenderNode& renderNode) {
- renderNode.computeOrdering();
-
- mCanvasState.save(SaveFlags::MatrixClip);
- mCanvasState.translate(tx, ty);
- mCanvasState.clipRect(clipRect.left, clipRect.top, clipRect.right, clipRect.bottom,
- SkClipOp::kIntersect);
- deferNodePropsAndOps(renderNode);
- mCanvasState.restore();
-}
-
-static Rect nodeBounds(RenderNode& node) {
- auto& props = node.properties();
- return Rect(props.getLeft(), props.getTop(), props.getRight(), props.getBottom());
-}
-
-void FrameBuilder::deferRenderNodeScene(const std::vector<sp<RenderNode> >& nodes,
- const Rect& contentDrawBounds) {
- if (nodes.size() < 1) return;
- if (nodes.size() == 1) {
- if (!nodes[0]->nothingToDraw()) {
- deferRenderNode(*nodes[0]);
- }
- return;
- }
- // It there are multiple render nodes, they are laid out as follows:
- // #0 - backdrop (content + caption)
- // #1 - content (local bounds are at (0,0), will be translated and clipped to backdrop)
- // #2 - additional overlay nodes
- // Usually the backdrop cannot be seen since it will be entirely covered by the content. While
- // resizing however it might become partially visible. The following render loop will crop the
- // backdrop against the content and draw the remaining part of it. It will then draw the content
- // cropped to the backdrop (since that indicates a shrinking of the window).
- //
- // Additional nodes will be drawn on top with no particular clipping semantics.
-
- // Usually the contents bounds should be mContentDrawBounds - however - we will
- // move it towards the fixed edge to give it a more stable appearance (for the moment).
- // If there is no content bounds we ignore the layering as stated above and start with 2.
-
- // Backdrop bounds in render target space
- const Rect backdrop = nodeBounds(*nodes[0]);
-
- // Bounds that content will fill in render target space (note content node bounds may be bigger)
- Rect content(contentDrawBounds.getWidth(), contentDrawBounds.getHeight());
- content.translate(backdrop.left, backdrop.top);
- if (!content.contains(backdrop) && !nodes[0]->nothingToDraw()) {
- // Content doesn't entirely overlap backdrop, so fill around content (right/bottom)
-
- // Note: in the future, if content doesn't snap to backdrop's left/top, this may need to
- // also fill left/top. Currently, both 2up and freeform position content at the top/left of
- // the backdrop, so this isn't necessary.
- if (content.right < backdrop.right) {
- // draw backdrop to right side of content
- deferRenderNode(0, 0,
- Rect(content.right, backdrop.top, backdrop.right, backdrop.bottom),
- *nodes[0]);
- }
- if (content.bottom < backdrop.bottom) {
- // draw backdrop to bottom of content
- // Note: bottom fill uses content left/right, to avoid overdrawing left/right fill
- deferRenderNode(0, 0,
- Rect(content.left, content.bottom, content.right, backdrop.bottom),
- *nodes[0]);
- }
- }
-
- if (!nodes[1]->nothingToDraw()) {
- if (!backdrop.isEmpty()) {
- // content node translation to catch up with backdrop
- float dx = contentDrawBounds.left - backdrop.left;
- float dy = contentDrawBounds.top - backdrop.top;
-
- Rect contentLocalClip = backdrop;
- contentLocalClip.translate(dx, dy);
- deferRenderNode(-dx, -dy, contentLocalClip, *nodes[1]);
- } else {
- deferRenderNode(*nodes[1]);
- }
- }
-
- // remaining overlay nodes, simply defer
- for (size_t index = 2; index < nodes.size(); index++) {
- if (!nodes[index]->nothingToDraw()) {
- deferRenderNode(*nodes[index]);
- }
- }
-}
-
-void FrameBuilder::onViewportInitialized() {}
-
-void FrameBuilder::onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {}
-
-void FrameBuilder::deferNodePropsAndOps(RenderNode& node) {
- const RenderProperties& properties = node.properties();
- const Outline& outline = properties.getOutline();
- if (properties.getAlpha() <= 0 || (outline.getShouldClip() && outline.isEmpty()) ||
- properties.getScaleX() == 0 || properties.getScaleY() == 0) {
- return; // rejected
- }
-
- if (properties.getLeft() != 0 || properties.getTop() != 0) {
- mCanvasState.translate(properties.getLeft(), properties.getTop());
- }
- if (properties.getStaticMatrix()) {
- mCanvasState.concatMatrix(*properties.getStaticMatrix());
- } else if (properties.getAnimationMatrix()) {
- mCanvasState.concatMatrix(*properties.getAnimationMatrix());
- }
- if (properties.hasTransformMatrix()) {
- if (properties.isTransformTranslateOnly()) {
- mCanvasState.translate(properties.getTranslationX(), properties.getTranslationY());
- } else {
- mCanvasState.concatMatrix(*properties.getTransformMatrix());
- }
- }
-
- const int width = properties.getWidth();
- const int height = properties.getHeight();
-
- Rect saveLayerBounds; // will be set to non-empty if saveLayer needed
- const bool isLayer = properties.effectiveLayerType() != LayerType::None;
- int clipFlags = properties.getClippingFlags();
- if (properties.getAlpha() < 1) {
- if (isLayer) {
- clipFlags &= ~CLIP_TO_BOUNDS; // bounds clipping done by layer
- }
- if (CC_LIKELY(isLayer || !properties.getHasOverlappingRendering())) {
- // simply scale rendering content's alpha
- mCanvasState.scaleAlpha(properties.getAlpha());
- } else {
- // schedule saveLayer by initializing saveLayerBounds
- saveLayerBounds.set(0, 0, width, height);
- if (clipFlags) {
- properties.getClippingRectForFlags(clipFlags, &saveLayerBounds);
- clipFlags = 0; // all clipping done by savelayer
- }
- }
-
- if (CC_UNLIKELY(ATRACE_ENABLED() && properties.promotedToLayer())) {
- // pretend alpha always causes savelayer to warn about
- // performance problem affecting old versions
- ATRACE_FORMAT("%s alpha caused saveLayer %dx%d", node.getName(), width, height);
- }
- }
- if (clipFlags) {
- Rect clipRect;
- properties.getClippingRectForFlags(clipFlags, &clipRect);
- mCanvasState.clipRect(clipRect.left, clipRect.top, clipRect.right, clipRect.bottom,
- SkClipOp::kIntersect);
- }
-
- if (properties.getRevealClip().willClip()) {
- Rect bounds;
- properties.getRevealClip().getBounds(&bounds);
- mCanvasState.setClippingRoundRect(mAllocator, bounds,
- properties.getRevealClip().getRadius());
- } else if (properties.getOutline().willClip()) {
- mCanvasState.setClippingOutline(mAllocator, &(properties.getOutline()));
- }
-
- bool quickRejected = mCanvasState.currentSnapshot()->getRenderTargetClip().isEmpty() ||
- (properties.getClipToBounds() &&
- mCanvasState.quickRejectConservative(0, 0, width, height));
- if (!quickRejected) {
- // not rejected, so defer render as either Layer, or direct (possibly wrapped in saveLayer)
- if (node.getLayer()) {
- // HW layer
- LayerOp* drawLayerOp = mAllocator.create_trivial<LayerOp>(node);
- BakedOpState* bakedOpState = tryBakeOpState(*drawLayerOp);
- if (bakedOpState) {
- // Node's layer already deferred, schedule it to render into parent layer
- currentLayer().deferUnmergeableOp(mAllocator, bakedOpState, OpBatchType::Bitmap);
- }
- } else if (CC_UNLIKELY(!saveLayerBounds.isEmpty())) {
- // draw DisplayList contents within temporary, since persisted layer could not be used.
- // (temp layers are clipped to viewport, since they don't persist offscreen content)
- SkPaint saveLayerPaint;
- saveLayerPaint.setAlpha(properties.getAlpha());
- deferBeginLayerOp(*mAllocator.create_trivial<BeginLayerOp>(
- saveLayerBounds, Matrix4::identity(),
- nullptr, // no record-time clip - need only respect defer-time one
- &saveLayerPaint));
- deferNodeOps(node);
- deferEndLayerOp(*mAllocator.create_trivial<EndLayerOp>());
- } else {
- deferNodeOps(node);
- }
- }
-}
-
-typedef key_value_pair_t<float, const RenderNodeOp*> ZRenderNodeOpPair;
-
-template <typename V>
-static void buildZSortedChildList(V* zTranslatedNodes, const DisplayList& displayList,
- const DisplayList::Chunk& chunk) {
- if (chunk.beginChildIndex == chunk.endChildIndex) return;
-
- for (size_t i = chunk.beginChildIndex; i < chunk.endChildIndex; i++) {
- RenderNodeOp* childOp = displayList.getChildren()[i];
- RenderNode* child = childOp->renderNode;
- float childZ = child->properties().getZ();
-
- if (!MathUtils::isZero(childZ) && chunk.reorderChildren) {
- zTranslatedNodes->push_back(ZRenderNodeOpPair(childZ, childOp));
- childOp->skipInOrderDraw = true;
- } else if (!child->properties().getProjectBackwards()) {
- // regular, in order drawing DisplayList
- childOp->skipInOrderDraw = false;
- }
- }
-
- // Z sort any 3d children (stable-ness makes z compare fall back to standard drawing order)
- std::stable_sort(zTranslatedNodes->begin(), zTranslatedNodes->end());
-}
-
-template <typename V>
-static size_t findNonNegativeIndex(const V& zTranslatedNodes) {
- for (size_t i = 0; i < zTranslatedNodes.size(); i++) {
- if (zTranslatedNodes[i].key >= 0.0f) return i;
- }
- return zTranslatedNodes.size();
-}
-
-template <typename V>
-void FrameBuilder::defer3dChildren(const ClipBase* reorderClip, ChildrenSelectMode mode,
- const V& zTranslatedNodes) {
- const int size = zTranslatedNodes.size();
- if (size == 0 || (mode == ChildrenSelectMode::Negative && zTranslatedNodes[0].key > 0.0f) ||
- (mode == ChildrenSelectMode::Positive && zTranslatedNodes[size - 1].key < 0.0f)) {
- // no 3d children to draw
- return;
- }
-
- /**
- * Draw shadows and (potential) casters mostly in order, but allow the shadows of casters
- * with very similar Z heights to draw together.
- *
- * This way, if Views A & B have the same Z height and are both casting shadows, the shadows are
- * underneath both, and neither's shadow is drawn on top of the other.
- */
- const size_t nonNegativeIndex = findNonNegativeIndex(zTranslatedNodes);
- size_t drawIndex, shadowIndex, endIndex;
- if (mode == ChildrenSelectMode::Negative) {
- drawIndex = 0;
- endIndex = nonNegativeIndex;
- shadowIndex = endIndex; // draw no shadows
- } else {
- drawIndex = nonNegativeIndex;
- endIndex = size;
- shadowIndex = drawIndex; // potentially draw shadow for each pos Z child
- }
-
- float lastCasterZ = 0.0f;
- while (shadowIndex < endIndex || drawIndex < endIndex) {
- if (shadowIndex < endIndex) {
- const RenderNodeOp* casterNodeOp = zTranslatedNodes[shadowIndex].value;
- const float casterZ = zTranslatedNodes[shadowIndex].key;
- // attempt to render the shadow if the caster about to be drawn is its caster,
- // OR if its caster's Z value is similar to the previous potential caster
- if (shadowIndex == drawIndex || casterZ - lastCasterZ < 0.1f) {
- deferShadow(reorderClip, *casterNodeOp);
-
- lastCasterZ = casterZ; // must do this even if current caster not casting a shadow
- shadowIndex++;
- continue;
- }
- }
-
- const RenderNodeOp* childOp = zTranslatedNodes[drawIndex].value;
- deferRenderNodeOpImpl(*childOp);
- drawIndex++;
- }
-}
-
-void FrameBuilder::deferShadow(const ClipBase* reorderClip, const RenderNodeOp& casterNodeOp) {
- auto& node = *casterNodeOp.renderNode;
- auto& properties = node.properties();
-
- if (properties.getAlpha() <= 0.0f || properties.getOutline().getAlpha() <= 0.0f ||
- !properties.getOutline().getPath() || properties.getScaleX() == 0 ||
- properties.getScaleY() == 0) {
- // no shadow to draw
- return;
- }
-
- const SkPath* casterOutlinePath = properties.getOutline().getPath();
- const SkPath* revealClipPath = properties.getRevealClip().getPath();
- if (revealClipPath && revealClipPath->isEmpty()) return;
-
- float casterAlpha = properties.getAlpha() * properties.getOutline().getAlpha();
-
- // holds temporary SkPath to store the result of intersections
- SkPath* frameAllocatedPath = nullptr;
- const SkPath* casterPath = casterOutlinePath;
-
- // intersect the shadow-casting path with the reveal, if present
- if (revealClipPath) {
- frameAllocatedPath = createFrameAllocatedPath();
-
- Op(*casterPath, *revealClipPath, kIntersect_SkPathOp, frameAllocatedPath);
- casterPath = frameAllocatedPath;
- }
-
- // intersect the shadow-casting path with the clipBounds, if present
- if (properties.getClippingFlags() & CLIP_TO_CLIP_BOUNDS) {
- if (!frameAllocatedPath) {
- frameAllocatedPath = createFrameAllocatedPath();
- }
- Rect clipBounds;
- properties.getClippingRectForFlags(CLIP_TO_CLIP_BOUNDS, &clipBounds);
- SkPath clipBoundsPath;
- clipBoundsPath.addRect(clipBounds.left, clipBounds.top, clipBounds.right,
- clipBounds.bottom);
-
- Op(*casterPath, clipBoundsPath, kIntersect_SkPathOp, frameAllocatedPath);
- casterPath = frameAllocatedPath;
- }
-
- // apply reorder clip to shadow, so it respects clip at beginning of reorderable chunk
- int restoreTo = mCanvasState.save(SaveFlags::MatrixClip);
- mCanvasState.writableSnapshot()->applyClip(reorderClip,
- *mCanvasState.currentSnapshot()->transform);
- if (CC_LIKELY(!mCanvasState.getRenderTargetClipBounds().isEmpty())) {
- Matrix4 shadowMatrixXY(casterNodeOp.localMatrix);
- Matrix4 shadowMatrixZ(casterNodeOp.localMatrix);
- node.applyViewPropertyTransforms(shadowMatrixXY, false);
- node.applyViewPropertyTransforms(shadowMatrixZ, true);
-
- sp<TessellationCache::ShadowTask> task = mCaches.tessellationCache.getShadowTask(
- mCanvasState.currentTransform(), mCanvasState.getLocalClipBounds(),
- casterAlpha >= 1.0f, casterPath, &shadowMatrixXY, &shadowMatrixZ,
- mCanvasState.currentSnapshot()->getRelativeLightCenter(), mLightRadius);
- ShadowOp* shadowOp = mAllocator.create<ShadowOp>(task, casterAlpha);
- BakedOpState* bakedOpState = BakedOpState::tryShadowOpConstruct(
- mAllocator, *mCanvasState.writableSnapshot(), shadowOp);
- if (CC_LIKELY(bakedOpState)) {
- currentLayer().deferUnmergeableOp(mAllocator, bakedOpState, OpBatchType::Shadow);
- }
- }
- mCanvasState.restoreToCount(restoreTo);
-}
-
-void FrameBuilder::deferProjectedChildren(const RenderNode& renderNode) {
- int count = mCanvasState.save(SaveFlags::MatrixClip);
- const SkPath* projectionReceiverOutline = renderNode.properties().getOutline().getPath();
-
- SkPath transformedMaskPath; // on stack, since BakedOpState makes a deep copy
- if (projectionReceiverOutline) {
- // transform the mask for this projector into render target space
- // TODO: consider combining both transforms by stashing transform instead of applying
- SkMatrix skCurrentTransform;
- mCanvasState.currentTransform()->copyTo(skCurrentTransform);
- projectionReceiverOutline->transform(skCurrentTransform, &transformedMaskPath);
- mCanvasState.setProjectionPathMask(&transformedMaskPath);
- }
-
- for (size_t i = 0; i < renderNode.mProjectedNodes.size(); i++) {
- RenderNodeOp* childOp = renderNode.mProjectedNodes[i];
- RenderNode& childNode = *childOp->renderNode;
-
- // Draw child if it has content, but ignore state in childOp - matrix already applied to
- // transformFromCompositingAncestor, and record-time clip is ignored when projecting
- if (!childNode.nothingToDraw()) {
- int restoreTo = mCanvasState.save(SaveFlags::MatrixClip);
-
- // Apply transform between ancestor and projected descendant
- mCanvasState.concatMatrix(childOp->transformFromCompositingAncestor);
-
- deferNodePropsAndOps(childNode);
-
- mCanvasState.restoreToCount(restoreTo);
- }
- }
- mCanvasState.restoreToCount(count);
-}
-
-/**
- * Used to define a list of lambdas referencing private FrameBuilder::onXX::defer() methods.
- *
- * This allows opIds embedded in the RecordedOps to be used for dispatching to these lambdas.
- * E.g. a BitmapOp op then would be dispatched to FrameBuilder::onBitmapOp(const BitmapOp&)
- */
-#define OP_RECEIVER(Type) \
- [](FrameBuilder& frameBuilder, const RecordedOp& op) { \
- frameBuilder.defer##Type(static_cast<const Type&>(op)); \
- },
-void FrameBuilder::deferNodeOps(const RenderNode& renderNode) {
- typedef void (*OpDispatcher)(FrameBuilder & frameBuilder, const RecordedOp& op);
- static OpDispatcher receivers[] = BUILD_DEFERRABLE_OP_LUT(OP_RECEIVER);
-
- // can't be null, since DL=null node rejection happens before deferNodePropsAndOps
- const DisplayList& displayList = *(renderNode.getDisplayList());
- for (auto& chunk : displayList.getChunks()) {
- FatVector<ZRenderNodeOpPair, 16> zTranslatedNodes;
- buildZSortedChildList(&zTranslatedNodes, displayList, chunk);
-
- defer3dChildren(chunk.reorderClip, ChildrenSelectMode::Negative, zTranslatedNodes);
- for (size_t opIndex = chunk.beginOpIndex; opIndex < chunk.endOpIndex; opIndex++) {
- const RecordedOp* op = displayList.getOps()[opIndex];
- receivers[op->opId](*this, *op);
-
- if (CC_UNLIKELY(!renderNode.mProjectedNodes.empty() &&
- displayList.projectionReceiveIndex >= 0 &&
- static_cast<int>(opIndex) == displayList.projectionReceiveIndex)) {
- deferProjectedChildren(renderNode);
- }
- }
- defer3dChildren(chunk.reorderClip, ChildrenSelectMode::Positive, zTranslatedNodes);
- }
-}
-
-void FrameBuilder::deferRenderNodeOpImpl(const RenderNodeOp& op) {
- if (op.renderNode->nothingToDraw()) return;
- int count = mCanvasState.save(SaveFlags::MatrixClip);
-
- // apply state from RecordedOp (clip first, since op's clip is transformed by current matrix)
- mCanvasState.writableSnapshot()->applyClip(op.localClip,
- *mCanvasState.currentSnapshot()->transform);
- mCanvasState.concatMatrix(op.localMatrix);
-
- // then apply state from node properties, and defer ops
- deferNodePropsAndOps(*op.renderNode);
-
- mCanvasState.restoreToCount(count);
-}
-
-void FrameBuilder::deferRenderNodeOp(const RenderNodeOp& op) {
- if (!op.skipInOrderDraw) {
- deferRenderNodeOpImpl(op);
- }
-}
-
-/**
- * Defers an unmergeable, strokeable op, accounting correctly
- * for paint's style on the bounds being computed.
- */
-BakedOpState* FrameBuilder::deferStrokeableOp(const RecordedOp& op, batchid_t batchId,
- BakedOpState::StrokeBehavior strokeBehavior,
- bool expandForPathTexture) {
- // Note: here we account for stroke when baking the op
- BakedOpState* bakedState = BakedOpState::tryStrokeableOpConstruct(
- mAllocator, *mCanvasState.writableSnapshot(), op, strokeBehavior, expandForPathTexture);
- if (!bakedState) return nullptr; // quick rejected
-
- if (op.opId == RecordedOpId::RectOp && op.paint->getStyle() != SkPaint::kStroke_Style) {
- bakedState->setupOpacity(op.paint);
- }
-
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, batchId);
- return bakedState;
-}
-
-/**
- * Returns batch id for tessellatable shapes, based on paint. Checks to see if path effect/AA will
- * be used, since they trigger significantly different rendering paths.
- *
- * Note: not used for lines/points, since they don't currently support path effects.
- */
-static batchid_t tessBatchId(const RecordedOp& op) {
- const SkPaint& paint = *(op.paint);
- return paint.getPathEffect()
- ? OpBatchType::AlphaMaskTexture
- : (paint.isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices);
-}
-
-void FrameBuilder::deferArcOp(const ArcOp& op) {
- // Pass true below since arcs have a tendency to draw outside their expected bounds within
- // their path textures. Passing true makes it more likely that we'll scissor, instead of
- // corrupting the frame by drawing outside of clip bounds.
- deferStrokeableOp(op, tessBatchId(op), BakedOpState::StrokeBehavior::StyleDefined, true);
-}
-
-static bool hasMergeableClip(const BakedOpState& state) {
- return !state.computedState.clipState ||
- state.computedState.clipState->mode == ClipMode::Rectangle;
-}
-
-void FrameBuilder::deferBitmapOp(const BitmapOp& op) {
- BakedOpState* bakedState = tryBakeOpState(op);
- if (!bakedState) return; // quick rejected
-
- if (op.bitmap->isOpaque()) {
- bakedState->setupOpacity(op.paint);
- }
-
- // Don't merge non-simply transformed or neg scale ops, SET_TEXTURE doesn't handle rotation
- // Don't merge A8 bitmaps - the paint's color isn't compared by mergeId, or in
- // MergingDrawBatch::canMergeWith()
- if (bakedState->computedState.transform.isSimple() &&
- bakedState->computedState.transform.positiveScale() &&
- PaintUtils::getBlendModeDirect(op.paint) == SkBlendMode::kSrcOver &&
- op.bitmap->colorType() != kAlpha_8_SkColorType && hasMergeableClip(*bakedState)) {
- mergeid_t mergeId = reinterpret_cast<mergeid_t>(op.bitmap->getGenerationID());
- currentLayer().deferMergeableOp(mAllocator, bakedState, OpBatchType::Bitmap, mergeId);
- } else {
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::Bitmap);
- }
-}
-
-void FrameBuilder::deferBitmapMeshOp(const BitmapMeshOp& op) {
- BakedOpState* bakedState = tryBakeOpState(op);
- if (!bakedState) return; // quick rejected
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::Bitmap);
-}
-
-void FrameBuilder::deferBitmapRectOp(const BitmapRectOp& op) {
- BakedOpState* bakedState = tryBakeOpState(op);
- if (!bakedState) return; // quick rejected
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::Bitmap);
-}
-
-void FrameBuilder::deferVectorDrawableOp(const VectorDrawableOp& op) {
- Bitmap& bitmap = op.vectorDrawable->getBitmapUpdateIfDirty();
- SkPaint* paint = op.vectorDrawable->getPaint();
- const BitmapRectOp* resolvedOp = mAllocator.create_trivial<BitmapRectOp>(
- op.unmappedBounds, op.localMatrix, op.localClip, paint, &bitmap,
- Rect(bitmap.width(), bitmap.height()));
- deferBitmapRectOp(*resolvedOp);
-}
-
-void FrameBuilder::deferCirclePropsOp(const CirclePropsOp& op) {
- // allocate a temporary oval op (with mAllocator, so it persists until render), so the
- // renderer doesn't have to handle the RoundRectPropsOp type, and so state baking is simple.
- float x = *(op.x);
- float y = *(op.y);
- float radius = *(op.radius);
- Rect unmappedBounds(x - radius, y - radius, x + radius, y + radius);
- const OvalOp* resolvedOp = mAllocator.create_trivial<OvalOp>(unmappedBounds, op.localMatrix,
- op.localClip, op.paint);
- deferOvalOp(*resolvedOp);
-}
-
-void FrameBuilder::deferColorOp(const ColorOp& op) {
- BakedOpState* bakedState = tryBakeUnboundedOpState(op);
- if (!bakedState) return; // quick rejected
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::Vertices);
-}
-
-void FrameBuilder::deferFunctorOp(const FunctorOp& op) {
- BakedOpState* bakedState = tryBakeUnboundedOpState(op);
- if (!bakedState) return; // quick rejected
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::Functor);
-}
-
-void FrameBuilder::deferLinesOp(const LinesOp& op) {
- batchid_t batch = op.paint->isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices;
- deferStrokeableOp(op, batch, BakedOpState::StrokeBehavior::Forced);
-}
-
-void FrameBuilder::deferOvalOp(const OvalOp& op) {
- deferStrokeableOp(op, tessBatchId(op));
-}
-
-void FrameBuilder::deferPatchOp(const PatchOp& op) {
- BakedOpState* bakedState = tryBakeOpState(op);
- if (!bakedState) return; // quick rejected
-
- if (bakedState->computedState.transform.isPureTranslate() &&
- PaintUtils::getBlendModeDirect(op.paint) == SkBlendMode::kSrcOver &&
- hasMergeableClip(*bakedState)) {
- mergeid_t mergeId = reinterpret_cast<mergeid_t>(op.bitmap->getGenerationID());
-
- // Only use the MergedPatch batchId when merged, so Bitmap+Patch don't try to merge together
- currentLayer().deferMergeableOp(mAllocator, bakedState, OpBatchType::MergedPatch, mergeId);
- } else {
- // Use Bitmap batchId since Bitmap+Patch use same shader
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::Bitmap);
- }
-}
-
-void FrameBuilder::deferPathOp(const PathOp& op) {
- auto state = deferStrokeableOp(op, OpBatchType::AlphaMaskTexture);
- if (CC_LIKELY(state)) {
- mCaches.pathCache.precache(op.path, op.paint);
- }
-}
-
-void FrameBuilder::deferPointsOp(const PointsOp& op) {
- batchid_t batch = op.paint->isAntiAlias() ? OpBatchType::AlphaVertices : OpBatchType::Vertices;
- deferStrokeableOp(op, batch, BakedOpState::StrokeBehavior::Forced);
-}
-
-void FrameBuilder::deferRectOp(const RectOp& op) {
- deferStrokeableOp(op, tessBatchId(op));
-}
-
-void FrameBuilder::deferRoundRectOp(const RoundRectOp& op) {
- auto state = deferStrokeableOp(op, tessBatchId(op));
- if (CC_LIKELY(state && !op.paint->getPathEffect())) {
- // TODO: consider storing tessellation task in BakedOpState
- mCaches.tessellationCache.precacheRoundRect(state->computedState.transform, *(op.paint),
- op.unmappedBounds.getWidth(),
- op.unmappedBounds.getHeight(), op.rx, op.ry);
- }
-}
-
-void FrameBuilder::deferRoundRectPropsOp(const RoundRectPropsOp& op) {
- // allocate a temporary round rect op (with mAllocator, so it persists until render), so the
- // renderer doesn't have to handle the RoundRectPropsOp type, and so state baking is simple.
- const RoundRectOp* resolvedOp = mAllocator.create_trivial<RoundRectOp>(
- Rect(*(op.left), *(op.top), *(op.right), *(op.bottom)), op.localMatrix, op.localClip,
- op.paint, *op.rx, *op.ry);
- deferRoundRectOp(*resolvedOp);
-}
-
-void FrameBuilder::deferSimpleRectsOp(const SimpleRectsOp& op) {
- BakedOpState* bakedState = tryBakeOpState(op);
- if (!bakedState) return; // quick rejected
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::Vertices);
-}
-
-static batchid_t textBatchId(const SkPaint& paint) {
- // TODO: better handling of shader (since we won't care about color then)
- return paint.getColor() == SK_ColorBLACK ? OpBatchType::Text : OpBatchType::ColorText;
-}
-
-void FrameBuilder::deferTextOp(const TextOp& op) {
- BakedOpState* bakedState = BakedOpState::tryStrokeableOpConstruct(
- mAllocator, *mCanvasState.writableSnapshot(), op,
- BakedOpState::StrokeBehavior::StyleDefined, false);
- if (!bakedState) return; // quick rejected
-
- batchid_t batchId = textBatchId(*(op.paint));
- if (bakedState->computedState.transform.isPureTranslate() &&
- PaintUtils::getBlendModeDirect(op.paint) == SkBlendMode::kSrcOver &&
- hasMergeableClip(*bakedState)) {
- mergeid_t mergeId = reinterpret_cast<mergeid_t>(op.paint->getColor());
- currentLayer().deferMergeableOp(mAllocator, bakedState, batchId, mergeId);
- } else {
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, batchId);
- }
-
- FontRenderer& fontRenderer = mCaches.fontRenderer.getFontRenderer();
- auto& totalTransform = bakedState->computedState.transform;
- if (totalTransform.isPureTranslate() || totalTransform.isPerspective()) {
- fontRenderer.precache(op.paint, op.glyphs, op.glyphCount, SkMatrix::I());
- } else {
- // Partial transform case, see BakedOpDispatcher::renderTextOp
- float sx, sy;
- totalTransform.decomposeScale(sx, sy);
- fontRenderer.precache(
- op.paint, op.glyphs, op.glyphCount,
- SkMatrix::MakeScale(roundf(std::max(1.0f, sx)), roundf(std::max(1.0f, sy))));
- }
-}
-
-void FrameBuilder::deferTextOnPathOp(const TextOnPathOp& op) {
- BakedOpState* bakedState = tryBakeUnboundedOpState(op);
- if (!bakedState) return; // quick rejected
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, textBatchId(*(op.paint)));
-
- mCaches.fontRenderer.getFontRenderer().precache(op.paint, op.glyphs, op.glyphCount,
- SkMatrix::I());
-}
-
-void FrameBuilder::deferTextureLayerOp(const TextureLayerOp& op) {
- GlLayer* layer = static_cast<GlLayer*>(op.layerHandle->backingLayer());
- if (CC_UNLIKELY(!layer || !layer->isRenderable())) return;
-
- const TextureLayerOp* textureLayerOp = &op;
- // Now safe to access transform (which was potentially unready at record time)
- if (!layer->getTransform().isIdentity()) {
- // non-identity transform present, so 'inject it' into op by copying + replacing matrix
- Matrix4 combinedMatrix(op.localMatrix);
- combinedMatrix.multiply(layer->getTransform());
- textureLayerOp = mAllocator.create<TextureLayerOp>(op, combinedMatrix);
- }
- BakedOpState* bakedState = tryBakeOpState(*textureLayerOp);
-
- if (!bakedState) return; // quick rejected
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::TextureLayer);
-}
-
-void FrameBuilder::saveForLayer(uint32_t layerWidth, uint32_t layerHeight, float contentTranslateX,
- float contentTranslateY, const Rect& repaintRect,
- const Vector3& lightCenter, const BeginLayerOp* beginLayerOp,
- RenderNode* renderNode) {
- mCanvasState.save(SaveFlags::MatrixClip);
- mCanvasState.writableSnapshot()->initializeViewport(layerWidth, layerHeight);
- mCanvasState.writableSnapshot()->roundRectClipState = nullptr;
- mCanvasState.writableSnapshot()->setRelativeLightCenter(lightCenter);
- mCanvasState.writableSnapshot()->transform->loadTranslate(contentTranslateX, contentTranslateY,
- 0);
- mCanvasState.writableSnapshot()->setClip(repaintRect.left, repaintRect.top, repaintRect.right,
- repaintRect.bottom);
-
- // create a new layer repaint, and push its index on the stack
- mLayerStack.push_back(mLayerBuilders.size());
- auto newFbo = mAllocator.create<LayerBuilder>(layerWidth, layerHeight, repaintRect,
- beginLayerOp, renderNode);
- mLayerBuilders.push_back(newFbo);
-}
-
-void FrameBuilder::restoreForLayer() {
- // restore canvas, and pop finished layer off of the stack
- mCanvasState.restore();
- mLayerStack.pop_back();
-}
-
-// TODO: defer time rejection (when bounds become empty) + tests
-// Option - just skip layers with no bounds at playback + defer?
-void FrameBuilder::deferBeginLayerOp(const BeginLayerOp& op) {
- uint32_t layerWidth = (uint32_t)op.unmappedBounds.getWidth();
- uint32_t layerHeight = (uint32_t)op.unmappedBounds.getHeight();
-
- auto previous = mCanvasState.currentSnapshot();
- Vector3 lightCenter = previous->getRelativeLightCenter();
-
- // Combine all transforms used to present saveLayer content:
- // parent content transform * canvas transform * bounds offset
- Matrix4 contentTransform(*(previous->transform));
- contentTransform.multiply(op.localMatrix);
- contentTransform.translate(op.unmappedBounds.left, op.unmappedBounds.top);
-
- Matrix4 inverseContentTransform;
- inverseContentTransform.loadInverse(contentTransform);
-
- // map the light center into layer-relative space
- inverseContentTransform.mapPoint3d(lightCenter);
-
- // Clip bounds of temporary layer to parent's clip rect, so:
- Rect saveLayerBounds(layerWidth, layerHeight);
- // 1) transform Rect(width, height) into parent's space
- // note: left/top offsets put in contentTransform above
- contentTransform.mapRect(saveLayerBounds);
- // 2) intersect with parent's clip
- saveLayerBounds.doIntersect(previous->getRenderTargetClip());
- // 3) and transform back
- inverseContentTransform.mapRect(saveLayerBounds);
- saveLayerBounds.doIntersect(Rect(layerWidth, layerHeight));
- saveLayerBounds.roundOut();
-
- // if bounds are reduced, will clip the layer's area by reducing required bounds...
- layerWidth = saveLayerBounds.getWidth();
- layerHeight = saveLayerBounds.getHeight();
- // ...and shifting drawing content to account for left/top side clipping
- float contentTranslateX = -saveLayerBounds.left;
- float contentTranslateY = -saveLayerBounds.top;
-
- saveForLayer(layerWidth, layerHeight, contentTranslateX, contentTranslateY,
- Rect(layerWidth, layerHeight), lightCenter, &op, nullptr);
-}
-
-void FrameBuilder::deferEndLayerOp(const EndLayerOp& /* ignored */) {
- const BeginLayerOp& beginLayerOp = *currentLayer().beginLayerOp;
- int finishedLayerIndex = mLayerStack.back();
-
- restoreForLayer();
-
- // saveLayer will clip & translate the draw contents, so we need
- // to translate the drawLayer by how much the contents was translated
- // TODO: Unify this with beginLayerOp so we don't have to calculate this
- // twice
- uint32_t layerWidth = (uint32_t)beginLayerOp.unmappedBounds.getWidth();
- uint32_t layerHeight = (uint32_t)beginLayerOp.unmappedBounds.getHeight();
-
- auto previous = mCanvasState.currentSnapshot();
- Vector3 lightCenter = previous->getRelativeLightCenter();
-
- // Combine all transforms used to present saveLayer content:
- // parent content transform * canvas transform * bounds offset
- Matrix4 contentTransform(*(previous->transform));
- contentTransform.multiply(beginLayerOp.localMatrix);
- contentTransform.translate(beginLayerOp.unmappedBounds.left, beginLayerOp.unmappedBounds.top);
-
- Matrix4 inverseContentTransform;
- inverseContentTransform.loadInverse(contentTransform);
-
- // map the light center into layer-relative space
- inverseContentTransform.mapPoint3d(lightCenter);
-
- // Clip bounds of temporary layer to parent's clip rect, so:
- Rect saveLayerBounds(layerWidth, layerHeight);
- // 1) transform Rect(width, height) into parent's space
- // note: left/top offsets put in contentTransform above
- contentTransform.mapRect(saveLayerBounds);
- // 2) intersect with parent's clip
- saveLayerBounds.doIntersect(previous->getRenderTargetClip());
- // 3) and transform back
- inverseContentTransform.mapRect(saveLayerBounds);
- saveLayerBounds.doIntersect(Rect(layerWidth, layerHeight));
- saveLayerBounds.roundOut();
-
- Matrix4 localMatrix(beginLayerOp.localMatrix);
- localMatrix.translate(saveLayerBounds.left, saveLayerBounds.top);
-
- // record the draw operation into the previous layer's list of draw commands
- // uses state from the associated beginLayerOp, since it has all the state needed for drawing
- LayerOp* drawLayerOp = mAllocator.create_trivial<LayerOp>(
- beginLayerOp.unmappedBounds, localMatrix, beginLayerOp.localClip, beginLayerOp.paint,
- &(mLayerBuilders[finishedLayerIndex]->offscreenBuffer));
- BakedOpState* bakedOpState = tryBakeOpState(*drawLayerOp);
-
- if (bakedOpState) {
- // Layer will be drawn into parent layer (which is now current, since we popped mLayerStack)
- currentLayer().deferUnmergeableOp(mAllocator, bakedOpState, OpBatchType::Bitmap);
- } else {
- // Layer won't be drawn - delete its drawing batches to prevent it from doing any work
- // TODO: need to prevent any render work from being done
- // - create layerop earlier for reject purposes?
- mLayerBuilders[finishedLayerIndex]->clear();
- return;
- }
-}
-
-void FrameBuilder::deferBeginUnclippedLayerOp(const BeginUnclippedLayerOp& op) {
- Matrix4 boundsTransform(*(mCanvasState.currentSnapshot()->transform));
- boundsTransform.multiply(op.localMatrix);
-
- Rect dstRect(op.unmappedBounds);
- boundsTransform.mapRect(dstRect);
- dstRect.roundOut();
- dstRect.doIntersect(mCanvasState.currentSnapshot()->getRenderTargetClip());
-
- if (dstRect.isEmpty()) {
- // Unclipped layer rejected - push a null op, so next EndUnclippedLayerOp is ignored
- currentLayer().activeUnclippedSaveLayers.push_back(nullptr);
- } else {
- // Allocate a holding position for the layer object (copyTo will produce, copyFrom will
- // consume)
- OffscreenBuffer** layerHandle = mAllocator.create<OffscreenBuffer*>(nullptr);
-
- /**
- * First, defer an operation to copy out the content from the rendertarget into a layer.
- */
- auto copyToOp = mAllocator.create_trivial<CopyToLayerOp>(op, layerHandle);
- BakedOpState* bakedState = BakedOpState::directConstruct(
- mAllocator, &(currentLayer().repaintClip), dstRect, *copyToOp);
- currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::CopyToLayer);
-
- /**
- * Defer a clear rect, so that clears from multiple unclipped layers can be drawn
- * both 1) simultaneously, and 2) as long after the copyToLayer executes as possible
- */
- currentLayer().deferLayerClear(dstRect);
-
- /**
- * And stash an operation to copy that layer back under the rendertarget until
- * a balanced EndUnclippedLayerOp is seen
- */
- auto copyFromOp = mAllocator.create_trivial<CopyFromLayerOp>(op, layerHandle);
- bakedState = BakedOpState::directConstruct(mAllocator, &(currentLayer().repaintClip),
- dstRect, *copyFromOp);
- currentLayer().activeUnclippedSaveLayers.push_back(bakedState);
- }
-}
-
-void FrameBuilder::deferEndUnclippedLayerOp(const EndUnclippedLayerOp& /* ignored */) {
- LOG_ALWAYS_FATAL_IF(currentLayer().activeUnclippedSaveLayers.empty(), "no layer to end!");
-
- BakedOpState* copyFromLayerOp = currentLayer().activeUnclippedSaveLayers.back();
- currentLayer().activeUnclippedSaveLayers.pop_back();
- if (copyFromLayerOp) {
- currentLayer().deferUnmergeableOp(mAllocator, copyFromLayerOp, OpBatchType::CopyFromLayer);
- }
-}
-
-void FrameBuilder::finishDefer() {
- mCaches.fontRenderer.endPrecaching();
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/FrameBuilder.h b/libs/hwui/FrameBuilder.h
deleted file mode 100644
index 974daf8a17bb..000000000000
--- a/libs/hwui/FrameBuilder.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "BakedOpState.h"
-#include "CanvasState.h"
-#include "DisplayList.h"
-#include "LayerBuilder.h"
-#include "RecordedOp.h"
-#include "utils/GLUtils.h"
-
-#include <unordered_map>
-#include <vector>
-
-struct SkRect;
-
-namespace android {
-namespace uirenderer {
-
-class BakedOpState;
-class LayerUpdateQueue;
-class OffscreenBuffer;
-class Rect;
-
-/**
- * Processes, optimizes, and stores rendering commands from RenderNodes and
- * LayerUpdateQueue, building content needed to render a frame.
- *
- * Resolves final drawing state for each operation (including clip, alpha and matrix), and then
- * reorder and merge each op as it is resolved for drawing efficiency. Each layer of content (either
- * from the LayerUpdateQueue, or temporary layers created by saveLayer operations in the
- * draw stream) will create different reorder contexts, each in its own LayerBuilder.
- *
- * Then the prepared or 'baked' drawing commands can be issued by calling the templated
- * replayBakedOps() function, which will dispatch them (including any created merged op collections)
- * to a Dispatcher and Renderer. See BakedOpDispatcher for how these baked drawing operations are
- * resolved into Glops and rendered via BakedOpRenderer.
- *
- * This class is also the authoritative source for traversing RenderNodes, both for standard op
- * traversal within a DisplayList, and for out of order RenderNode traversal for Z and projection.
- */
-class FrameBuilder : public CanvasStateClient {
-public:
- struct LightGeometry {
- Vector3 center;
- float radius;
- };
-
- FrameBuilder(const SkRect& clip, uint32_t viewportWidth, uint32_t viewportHeight,
- const LightGeometry& lightGeometry, Caches& caches);
-
- FrameBuilder(const LayerUpdateQueue& layerUpdateQueue, const LightGeometry& lightGeometry,
- Caches& caches);
-
- void deferLayers(const LayerUpdateQueue& layers);
-
- void deferRenderNode(RenderNode& renderNode);
-
- void deferRenderNode(float tx, float ty, Rect clipRect, RenderNode& renderNode);
-
- void deferRenderNodeScene(const std::vector<sp<RenderNode> >& nodes,
- const Rect& contentDrawBounds);
-
- virtual ~FrameBuilder() {}
-
- /**
- * replayBakedOps() is templated based on what class will receive ops being replayed.
- *
- * It constructs a lookup array of lambdas, which allows a recorded BakeOpState to use
- * state->op->opId to lookup a receiver that will be called when the op is replayed.
- */
- template <typename StaticDispatcher, typename Renderer>
- void replayBakedOps(Renderer& renderer) {
- std::vector<OffscreenBuffer*> temporaryLayers;
- finishDefer();
-/**
- * Defines a LUT of lambdas which allow a recorded BakedOpState to use state->op->opId to
- * dispatch the op via a method on a static dispatcher when the op is replayed.
- *
- * For example a BitmapOp would resolve, via the lambda lookup, to calling:
- *
- * StaticDispatcher::onBitmapOp(Renderer& renderer, const BitmapOp& op, const BakedOpState& state);
- */
-#define X(Type) \
- [](void* renderer, const BakedOpState& state) { \
- StaticDispatcher::on##Type(*(static_cast<Renderer*>(renderer)), \
- static_cast<const Type&>(*(state.op)), state); \
- },
- static BakedOpReceiver unmergedReceivers[] = BUILD_RENDERABLE_OP_LUT(X);
-#undef X
-
-/**
- * Defines a LUT of lambdas which allow merged arrays of BakedOpState* to be passed to a
- * static dispatcher when the group of merged ops is replayed.
- */
-#define X(Type) \
- [](void* renderer, const MergedBakedOpList& opList) { \
- StaticDispatcher::onMerged##Type##s(*(static_cast<Renderer*>(renderer)), opList); \
- },
- static MergedOpReceiver mergedReceivers[] = BUILD_MERGEABLE_OP_LUT(X);
-#undef X
-
- // Relay through layers in reverse order, since layers
- // later in the list will be drawn by earlier ones
- for (int i = mLayerBuilders.size() - 1; i >= 1; i--) {
- GL_CHECKPOINT(MODERATE);
- LayerBuilder& layer = *(mLayerBuilders[i]);
- if (layer.renderNode) {
- // cached HW layer - can't skip layer if empty
- renderer.startRepaintLayer(layer.offscreenBuffer, layer.repaintRect);
- GL_CHECKPOINT(MODERATE);
- layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
- GL_CHECKPOINT(MODERATE);
- renderer.endLayer();
- } else if (!layer.empty()) {
- // save layer - skip entire layer if empty (in which case, LayerOp has null layer).
- layer.offscreenBuffer = renderer.startTemporaryLayer(layer.width, layer.height);
- temporaryLayers.push_back(layer.offscreenBuffer);
- GL_CHECKPOINT(MODERATE);
- layer.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
- GL_CHECKPOINT(MODERATE);
- renderer.endLayer();
- }
- }
-
- GL_CHECKPOINT(MODERATE);
- if (CC_LIKELY(mDrawFbo0)) {
- const LayerBuilder& fbo0 = *(mLayerBuilders[0]);
- renderer.startFrame(fbo0.width, fbo0.height, fbo0.repaintRect);
- GL_CHECKPOINT(MODERATE);
- fbo0.replayBakedOpsImpl((void*)&renderer, unmergedReceivers, mergedReceivers);
- GL_CHECKPOINT(MODERATE);
- renderer.endFrame(fbo0.repaintRect);
- }
-
- for (auto& temporaryLayer : temporaryLayers) {
- renderer.recycleTemporaryLayer(temporaryLayer);
- }
- }
-
- void dump() const {
- for (auto&& layer : mLayerBuilders) {
- layer->dump();
- }
- }
-
- ///////////////////////////////////////////////////////////////////
- /// CanvasStateClient interface
- ///////////////////////////////////////////////////////////////////
- virtual void onViewportInitialized() override;
- virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override;
- virtual GLuint getTargetFbo() const override { return 0; }
-
-private:
- void finishDefer();
- enum class ChildrenSelectMode { Negative, Positive };
- void saveForLayer(uint32_t layerWidth, uint32_t layerHeight, float contentTranslateX,
- float contentTranslateY, const Rect& repaintRect, const Vector3& lightCenter,
- const BeginLayerOp* beginLayerOp, RenderNode* renderNode);
- void restoreForLayer();
-
- LayerBuilder& currentLayer() { return *(mLayerBuilders[mLayerStack.back()]); }
-
- BakedOpState* tryBakeOpState(const RecordedOp& recordedOp) {
- return BakedOpState::tryConstruct(mAllocator, *mCanvasState.writableSnapshot(), recordedOp);
- }
- BakedOpState* tryBakeUnboundedOpState(const RecordedOp& recordedOp) {
- return BakedOpState::tryConstructUnbounded(mAllocator, *mCanvasState.writableSnapshot(),
- recordedOp);
- }
-
- // should always be surrounded by a save/restore pair, and not called if DisplayList is null
- void deferNodePropsAndOps(RenderNode& node);
-
- template <typename V>
- void defer3dChildren(const ClipBase* reorderClip, ChildrenSelectMode mode,
- const V& zTranslatedNodes);
-
- void deferShadow(const ClipBase* reorderClip, const RenderNodeOp& casterOp);
-
- void deferProjectedChildren(const RenderNode& renderNode);
-
- void deferNodeOps(const RenderNode& renderNode);
-
- void deferRenderNodeOpImpl(const RenderNodeOp& op);
-
- void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers);
-
- SkPath* createFrameAllocatedPath() { return mAllocator.create<SkPath>(); }
-
- BakedOpState* deferStrokeableOp(const RecordedOp& op, batchid_t batchId,
- BakedOpState::StrokeBehavior strokeBehavior =
- BakedOpState::StrokeBehavior::StyleDefined,
- bool expandForPathTexture = false);
-
-/**
- * Declares all FrameBuilder::deferXXXXOp() methods for every RecordedOp type.
- *
- * These private methods are called from within deferImpl to defer each individual op
- * type differently.
- */
-#define X(Type) void defer##Type(const Type& op);
- MAP_DEFERRABLE_OPS(X)
-#undef X
-
- // contains single-frame objects, such as BakedOpStates, LayerBuilders, Batches
- LinearAllocator mAllocator;
- LinearStdAllocator<void*> mStdAllocator;
-
- // List of every deferred layer's render state. Replayed in reverse order to render a frame.
- LsaVector<LayerBuilder*> mLayerBuilders;
-
- /*
- * Stack of indices within mLayerBuilders representing currently active layers. If drawing
- * layerA within a layerB, will contain, in order:
- * - 0 (representing FBO 0, always present)
- * - layerB's index
- * - layerA's index
- *
- * Note that this doesn't vector doesn't always map onto all values of mLayerBuilders. When a
- * layer is finished deferring, it will still be represented in mLayerBuilders, but it's index
- * won't be in mLayerStack. This is because it can be replayed, but can't have any more drawing
- * ops added to it.
- */
- LsaVector<size_t> mLayerStack;
-
- CanvasState mCanvasState;
-
- Caches& mCaches;
-
- float mLightRadius;
-
- const bool mDrawFbo0;
-};
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/FrameInfoVisualizer.cpp b/libs/hwui/FrameInfoVisualizer.cpp
index 5aea04d94cbe..236a6b667f3b 100644
--- a/libs/hwui/FrameInfoVisualizer.cpp
+++ b/libs/hwui/FrameInfoVisualizer.cpp
@@ -15,7 +15,6 @@
*/
#include "FrameInfoVisualizer.h"
-#include "BakedOpRenderer.h"
#include "IProfileRenderer.h"
#include "utils/Color.h"
diff --git a/libs/hwui/GammaFontRenderer.cpp b/libs/hwui/GammaFontRenderer.cpp
deleted file mode 100644
index 88fb16234388..000000000000
--- a/libs/hwui/GammaFontRenderer.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include "GammaFontRenderer.h"
-#include "Debug.h"
-#include "Properties.h"
-
-namespace android {
-namespace uirenderer {
-
-GammaFontRenderer::GammaFontRenderer() {
- INIT_LOGD("Creating lookup gamma font renderer");
-
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
- // Compute the gamma tables
- const float gamma = 1.0f / Properties::textGamma;
- for (uint32_t i = 0; i <= 255; i++) {
- mGammaTable[i] = uint8_t((float)::floor(pow(i / 255.0f, gamma) * 255.0f + 0.5f));
- }
-#endif
-}
-
-void GammaFontRenderer::endPrecaching() {
- if (mRenderer) {
- mRenderer->endPrecaching();
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/GammaFontRenderer.h b/libs/hwui/GammaFontRenderer.h
deleted file mode 100644
index e9002442c64f..000000000000
--- a/libs/hwui/GammaFontRenderer.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_GAMMA_FONT_RENDERER_H
-#define ANDROID_HWUI_GAMMA_FONT_RENDERER_H
-
-#include "FontRenderer.h"
-
-namespace android {
-namespace uirenderer {
-
-class GammaFontRenderer {
-public:
- GammaFontRenderer();
-
- void clear() { mRenderer.reset(nullptr); }
-
- void flush() {
- if (mRenderer) {
- mRenderer->flushLargeCaches();
- }
- }
-
- FontRenderer& getFontRenderer() {
- if (!mRenderer) {
- const uint8_t* table = nullptr;
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
- table = &mGammaTable[0];
-#endif
- mRenderer.reset(new FontRenderer(table));
- }
- return *mRenderer;
- }
-
- void dumpMemoryUsage(String8& log) const {
- if (mRenderer) {
- mRenderer->dumpMemoryUsage(log);
- } else {
- log.appendFormat("FontRenderer doesn't exist.\n");
- }
- }
-
- uint32_t getSize() const { return mRenderer ? mRenderer->getSize() : 0; }
-
- void endPrecaching();
-
-private:
- std::unique_ptr<FontRenderer> mRenderer;
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
- uint8_t mGammaTable[256];
-#endif
-};
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_GAMMA_FONT_RENDERER_H
diff --git a/libs/hwui/GlLayer.cpp b/libs/hwui/GlLayer.cpp
index 42ae29d76898..432bb8526465 100644
--- a/libs/hwui/GlLayer.cpp
+++ b/libs/hwui/GlLayer.cpp
@@ -19,14 +19,6 @@
#include "Caches.h"
#include "RenderNode.h"
#include "renderstate/RenderState.h"
-#include "utils/TraceUtils.h"
-
-#include <utils/Log.h>
-
-#define ATRACE_LAYER_WORK(label) \
- ATRACE_FORMAT("%s HW Layer DisplayList %s %ux%u", label, \
- (renderNode.get() != NULL) ? renderNode->getName() : "", getWidth(), \
- getHeight())
namespace android {
namespace uirenderer {
diff --git a/libs/hwui/GlLayer.h b/libs/hwui/GlLayer.h
index 28749a0d125c..9f70fdae6790 100644
--- a/libs/hwui/GlLayer.h
+++ b/libs/hwui/GlLayer.h
@@ -50,12 +50,8 @@ public:
inline GLuint getTextureId() const { return texture.id(); }
- inline Texture& getTexture() { return texture; }
-
inline GLenum getRenderTarget() const { return texture.target(); }
- inline bool isRenderable() const { return texture.target() != GL_NONE; }
-
void setRenderTarget(GLenum renderTarget);
void generateTexture();
diff --git a/libs/hwui/Glop.h b/libs/hwui/Glop.h
deleted file mode 100644
index c68d51604bea..000000000000
--- a/libs/hwui/Glop.h
+++ /dev/null
@@ -1,179 +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.
- */
-
-#pragma once
-
-#include "FloatColor.h"
-#include "Matrix.h"
-#include "Program.h"
-#include "Rect.h"
-#include "SkiaShader.h"
-#include "utils/Macros.h"
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-namespace android {
-namespace uirenderer {
-
-class Program;
-class RoundRectClipState;
-class Texture;
-
-/*
- * Enumerates optional vertex attributes
- *
- * Position is always enabled by MeshState, these other attributes
- * are enabled/disabled dynamically based on mesh content.
- */
-
-namespace VertexAttribFlags {
-enum {
- // Mesh is pure x,y vertex pairs
- None = 0,
- // Mesh has texture coordinates embedded. Note that texture can exist without this flag
- // being set, if coordinates passed to sampler are determined another way.
- TextureCoord = 1 << 0,
- // Mesh has color embedded (to export to varying)
- Color = 1 << 1,
- // Mesh has alpha embedded (to export to varying)
- Alpha = 1 << 2,
-};
-};
-
-/*
- * Enumerates transform features
- */
-namespace TransformFlags {
-enum {
- None = 0,
-
- // offset the eventual drawing matrix by a tiny amount to
- // disambiguate sampling patterns with non-AA rendering
- OffsetByFudgeFactor = 1 << 0,
-
- // Canvas transform isn't applied to the mesh at draw time,
- // since it's already built in.
- MeshIgnoresCanvasTransform = 1 << 1, // TODO: remove for HWUI_NEW_OPS
-};
-};
-
-/**
- * Structure containing all data required to issue an OpenGL draw
- *
- * Includes all of the mesh, fill, and GL state required to perform
- * the operation. Pieces of data are either directly copied into the
- * structure, or stored as a pointer or GL object reference to data
- * managed.
- *
- * Eventually, a Glop should be able to be drawn multiple times from
- * a single construction, up until GL context destruction. Currently,
- * vertex/index/Texture/RoundRectClipState pointers prevent this from
- * being safe.
- */
-struct Glop {
- PREVENT_COPY_AND_ASSIGN(Glop);
-
-public:
- Glop() {}
- struct Mesh {
- GLuint primitiveMode; // GL_TRIANGLES and GL_TRIANGLE_STRIP supported
-
- // buffer object and void* are mutually exclusive.
- // Only GL_UNSIGNED_SHORT supported.
- struct Indices {
- GLuint bufferObject;
- const void* indices;
- } indices;
-
- // buffer object and void*s are mutually exclusive.
- // TODO: enforce mutual exclusion with restricted setters and/or unions
- struct Vertices {
- GLuint bufferObject;
- int attribFlags;
- const void* position;
- const void* texCoord;
- const void* color;
- GLsizei stride;
- } vertices;
-
- int elementCount;
- int vertexCount; // only used for meshes (for glDrawRangeElements)
- TextureVertex mappedVertices[4];
- } mesh;
-
- struct Fill {
- Program* program;
-
- struct TextureData {
- Texture* texture;
- GLenum filter;
- GLenum clamp;
- Matrix4* textureTransform;
- } texture;
-
- bool colorEnabled;
- FloatColor color;
-
- ProgramDescription::ColorFilterMode filterMode;
- union Filter {
- struct Matrix {
- float matrix[16];
- float vector[4];
- } matrix;
- FloatColor color;
- } filter;
-
- SkiaShaderData skiaShaderData;
- } fill;
-
- struct Transform {
- // modelView transform, accounting for delta between mesh transform and content of the mesh
- // often represents x/y offsets within command, or scaling for mesh unit size
- Matrix4 modelView;
-
- // Canvas transform of Glop - not necessarily applied to geometry (see flags)
- Matrix4 canvas;
- int transformFlags;
-
- const Matrix4& meshTransform() const {
- return (transformFlags & TransformFlags::MeshIgnoresCanvasTransform)
- ? Matrix4::identity()
- : canvas;
- }
- } transform;
-
- const RoundRectClipState* roundRectClipState = nullptr;
-
- /**
- * Blending to be used by this draw - both GL_NONE if blending is disabled.
- *
- * Defined by fill step, but can be force-enabled by presence of kAlpha_Attrib
- */
- struct Blend {
- GLenum src;
- GLenum dst;
- } blend;
-
- /**
- * Additional render state to enumerate:
- * - scissor + (bits for whether each of LTRB needed?)
- * - stencil mode (draw into, mask, count, etc)
- */
-};
-
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/GlopBuilder.cpp b/libs/hwui/GlopBuilder.cpp
deleted file mode 100644
index 2f107a004731..000000000000
--- a/libs/hwui/GlopBuilder.cpp
+++ /dev/null
@@ -1,691 +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.
- */
-#include "GlopBuilder.h"
-
-#include "Caches.h"
-#include "GlLayer.h"
-#include "Glop.h"
-#include "Layer.h"
-#include "Matrix.h"
-#include "Patch.h"
-#include "PathCache.h"
-#include "SkiaShader.h"
-#include "Texture.h"
-#include "VertexBuffer.h"
-#include "renderstate/MeshState.h"
-#include "renderstate/RenderState.h"
-#include "utils/PaintUtils.h"
-
-#include <GLES2/gl2.h>
-#include <SkPaint.h>
-
-#define DEBUG_GLOP_BUILDER 0
-
-#if DEBUG_GLOP_BUILDER
-
-#define TRIGGER_STAGE(stageFlag) \
- LOG_ALWAYS_FATAL_IF((stageFlag)&mStageFlags, "Stage %d cannot be run twice", (stageFlag)); \
- mStageFlags = static_cast<StageFlags>(mStageFlags | (stageFlag))
-
-#define REQUIRE_STAGES(requiredFlags) \
- LOG_ALWAYS_FATAL_IF((mStageFlags & (requiredFlags)) != (requiredFlags), \
- "not prepared for current stage")
-
-#else
-
-#define TRIGGER_STAGE(stageFlag) ((void)0)
-#define REQUIRE_STAGES(requiredFlags) ((void)0)
-
-#endif
-
-namespace android {
-namespace uirenderer {
-
-static void setUnitQuadTextureCoords(Rect uvs, TextureVertex* quadVertex) {
- quadVertex[0] = {0, 0, uvs.left, uvs.top};
- quadVertex[1] = {1, 0, uvs.right, uvs.top};
- quadVertex[2] = {0, 1, uvs.left, uvs.bottom};
- quadVertex[3] = {1, 1, uvs.right, uvs.bottom};
-}
-
-GlopBuilder::GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop)
- : mRenderState(renderState), mCaches(caches), mShader(nullptr), mOutGlop(outGlop) {
- mStageFlags = kInitialStage;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Mesh
-////////////////////////////////////////////////////////////////////////////////
-
-GlopBuilder& GlopBuilder::setMeshTexturedIndexedVbo(GLuint vbo, GLsizei elementCount) {
- TRIGGER_STAGE(kMeshStage);
-
- mOutGlop->mesh.primitiveMode = GL_TRIANGLES;
- mOutGlop->mesh.indices = {mRenderState.meshState().getQuadListIBO(), nullptr};
- mOutGlop->mesh.vertices = {vbo, VertexAttribFlags::TextureCoord,
- nullptr, (const void*)kMeshTextureOffset,
- nullptr, kTextureVertexStride};
- mOutGlop->mesh.elementCount = elementCount;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setMeshUnitQuad() {
- TRIGGER_STAGE(kMeshStage);
-
- mOutGlop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
- mOutGlop->mesh.indices = {0, nullptr};
- mOutGlop->mesh.vertices = {mRenderState.meshState().getUnitQuadVBO(),
- VertexAttribFlags::None,
- nullptr,
- nullptr,
- nullptr,
- kTextureVertexStride};
- mOutGlop->mesh.elementCount = 4;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setMeshTexturedUnitQuad(const UvMapper* uvMapper) {
- if (uvMapper) {
- // can't use unit quad VBO, so build UV vertices manually
- return setMeshTexturedUvQuad(uvMapper, Rect(1, 1));
- }
-
- TRIGGER_STAGE(kMeshStage);
-
- mOutGlop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
- mOutGlop->mesh.indices = {0, nullptr};
- mOutGlop->mesh.vertices = {mRenderState.meshState().getUnitQuadVBO(),
- VertexAttribFlags::TextureCoord,
- nullptr,
- (const void*)kMeshTextureOffset,
- nullptr,
- kTextureVertexStride};
- mOutGlop->mesh.elementCount = 4;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setMeshTexturedUvQuad(const UvMapper* uvMapper, Rect uvs) {
- TRIGGER_STAGE(kMeshStage);
-
- if (CC_UNLIKELY(uvMapper)) {
- uvMapper->map(uvs);
- }
- setUnitQuadTextureCoords(uvs, &mOutGlop->mesh.mappedVertices[0]);
-
- const TextureVertex* textureVertex = mOutGlop->mesh.mappedVertices;
- mOutGlop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
- mOutGlop->mesh.indices = {0, nullptr};
- mOutGlop->mesh.vertices = {0,
- VertexAttribFlags::TextureCoord,
- &textureVertex[0].x,
- &textureVertex[0].u,
- nullptr,
- kTextureVertexStride};
- mOutGlop->mesh.elementCount = 4;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setMeshIndexedQuads(Vertex* vertexData, int quadCount) {
- TRIGGER_STAGE(kMeshStage);
-
- mOutGlop->mesh.primitiveMode = GL_TRIANGLES;
- mOutGlop->mesh.indices = {mRenderState.meshState().getQuadListIBO(), nullptr};
- mOutGlop->mesh.vertices = {
- 0, VertexAttribFlags::None, vertexData, nullptr, nullptr, kVertexStride};
- mOutGlop->mesh.elementCount = 6 * quadCount;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setMeshTexturedIndexedQuads(TextureVertex* vertexData, int elementCount) {
- TRIGGER_STAGE(kMeshStage);
-
- mOutGlop->mesh.primitiveMode = GL_TRIANGLES;
- mOutGlop->mesh.indices = {mRenderState.meshState().getQuadListIBO(), nullptr};
- mOutGlop->mesh.vertices = {0,
- VertexAttribFlags::TextureCoord,
- &vertexData[0].x,
- &vertexData[0].u,
- nullptr,
- kTextureVertexStride};
- mOutGlop->mesh.elementCount = elementCount;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setMeshColoredTexturedMesh(ColorTextureVertex* vertexData,
- int elementCount) {
- TRIGGER_STAGE(kMeshStage);
-
- mOutGlop->mesh.primitiveMode = GL_TRIANGLES;
- mOutGlop->mesh.indices = {0, nullptr};
- mOutGlop->mesh.vertices = {0,
- VertexAttribFlags::TextureCoord | VertexAttribFlags::Color,
- &vertexData[0].x,
- &vertexData[0].u,
- &vertexData[0].r,
- kColorTextureVertexStride};
- mOutGlop->mesh.elementCount = elementCount;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setMeshVertexBuffer(const VertexBuffer& vertexBuffer) {
- TRIGGER_STAGE(kMeshStage);
-
- const VertexBuffer::MeshFeatureFlags flags = vertexBuffer.getMeshFeatureFlags();
-
- bool alphaVertex = flags & VertexBuffer::kAlpha;
- bool indices = flags & VertexBuffer::kIndices;
-
- mOutGlop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
- mOutGlop->mesh.indices = {0, vertexBuffer.getIndices()};
- mOutGlop->mesh.vertices = {0,
- alphaVertex ? VertexAttribFlags::Alpha : VertexAttribFlags::None,
- vertexBuffer.getBuffer(),
- nullptr,
- nullptr,
- alphaVertex ? kAlphaVertexStride : kVertexStride};
- mOutGlop->mesh.elementCount =
- indices ? vertexBuffer.getIndexCount() : vertexBuffer.getVertexCount();
- mOutGlop->mesh.vertexCount = vertexBuffer.getVertexCount(); // used for glDrawRangeElements()
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setMeshPatchQuads(const Patch& patch) {
- TRIGGER_STAGE(kMeshStage);
-
- mOutGlop->mesh.primitiveMode = GL_TRIANGLES;
- mOutGlop->mesh.indices = {mRenderState.meshState().getQuadListIBO(), nullptr};
- mOutGlop->mesh.vertices = {mCaches.patchCache.getMeshBuffer(),
- VertexAttribFlags::TextureCoord,
- (void*)patch.positionOffset,
- (void*)patch.textureOffset,
- nullptr,
- kTextureVertexStride};
- mOutGlop->mesh.elementCount = patch.indexCount;
- return *this;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Fill
-////////////////////////////////////////////////////////////////////////////////
-
-void GlopBuilder::setFill(int color, float alphaScale, SkBlendMode mode,
- Blend::ModeOrderSwap modeUsage, const SkShader* shader,
- const SkColorFilter* colorFilter) {
- if (mode != SkBlendMode::kClear) {
- if (!shader) {
- FloatColor c;
- c.set(color);
- c.r *= alphaScale;
- c.g *= alphaScale;
- c.b *= alphaScale;
- c.a *= alphaScale;
- mOutGlop->fill.color = c;
- } else {
- float alpha = (SkColorGetA(color) / 255.0f) * alphaScale;
- mOutGlop->fill.color = {1, 1, 1, alpha};
- }
- } else {
- mOutGlop->fill.color = {0, 0, 0, 1};
- }
-
- mOutGlop->blend = {GL_ZERO, GL_ZERO};
- if (mOutGlop->fill.color.a < 1.0f ||
- (mOutGlop->mesh.vertices.attribFlags & VertexAttribFlags::Alpha) ||
- (mOutGlop->fill.texture.texture && mOutGlop->fill.texture.texture->blend) ||
- mOutGlop->roundRectClipState || PaintUtils::isBlendedShader(shader) ||
- PaintUtils::isBlendedColorFilter(colorFilter) || mode != SkBlendMode::kSrcOver) {
- if (CC_LIKELY(mode <= SkBlendMode::kScreen)) {
- Blend::getFactors(mode, modeUsage, &mOutGlop->blend.src, &mOutGlop->blend.dst);
- } else {
- // These blend modes are not supported by OpenGL directly and have
- // to be implemented using shaders. Since the shader will perform
- // the blending, don't enable GL blending off here
- // If the blend mode cannot be implemented using shaders, fall
- // back to the default SrcOver blend mode instead
- if (CC_UNLIKELY(mCaches.extensions().hasFramebufferFetch())) {
- mDescription.framebufferMode = mode;
- mDescription.swapSrcDst = (modeUsage == Blend::ModeOrderSwap::Swap);
- // blending in shader, don't enable
- } else {
- // unsupported
- Blend::getFactors(SkBlendMode::kSrcOver, modeUsage, &mOutGlop->blend.src,
- &mOutGlop->blend.dst);
- }
- }
- }
- mShader = shader; // shader resolved in ::build()
-
- if (colorFilter) {
- SkColor color;
- SkBlendMode bmode;
- SkScalar srcColorMatrix[20];
- if (colorFilter->asColorMode(&color, &bmode)) {
- mOutGlop->fill.filterMode = mDescription.colorOp =
- ProgramDescription::ColorFilterMode::Blend;
- mDescription.colorMode = bmode;
- mOutGlop->fill.filter.color.set(color);
- } else if (colorFilter->asColorMatrix(srcColorMatrix)) {
- mOutGlop->fill.filterMode = mDescription.colorOp =
- ProgramDescription::ColorFilterMode::Matrix;
-
- float* colorMatrix = mOutGlop->fill.filter.matrix.matrix;
- memcpy(colorMatrix, srcColorMatrix, 4 * sizeof(float));
- memcpy(&colorMatrix[4], &srcColorMatrix[5], 4 * sizeof(float));
- memcpy(&colorMatrix[8], &srcColorMatrix[10], 4 * sizeof(float));
- memcpy(&colorMatrix[12], &srcColorMatrix[15], 4 * sizeof(float));
-
- // Skia uses the range [0..255] for the addition vector, but we need
- // the [0..1] range to apply the vector in GLSL
- float* colorVector = mOutGlop->fill.filter.matrix.vector;
- colorVector[0] = EOCF(srcColorMatrix[4] / 255.0f);
- colorVector[1] = EOCF(srcColorMatrix[9] / 255.0f);
- colorVector[2] = EOCF(srcColorMatrix[14] / 255.0f);
- colorVector[3] = srcColorMatrix[19] / 255.0f; // alpha is linear
- } else {
- ALOGE("unsupported ColorFilter type: %s", colorFilter->getTypeName());
- LOG_ALWAYS_FATAL("unsupported ColorFilter");
- }
- } else {
- mOutGlop->fill.filterMode = ProgramDescription::ColorFilterMode::None;
- }
-}
-
-GlopBuilder& GlopBuilder::setFillTexturePaint(Texture& texture, const int textureFillFlags,
- const SkPaint* paint, float alphaScale) {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- GLenum filter = (textureFillFlags & TextureFillFlags::ForceFilter)
- ? GL_LINEAR
- : PaintUtils::getFilter(paint);
- mOutGlop->fill.texture = {&texture, filter, GL_CLAMP_TO_EDGE, nullptr};
-
- if (paint) {
- int color = paint->getColor();
- SkShader* shader = paint->getShader();
-
- if (!(textureFillFlags & TextureFillFlags::IsAlphaMaskTexture)) {
- // Texture defines color, so disable shaders, and reset all non-alpha color channels
- color |= 0x00FFFFFF;
- shader = nullptr;
- }
- setFill(color, alphaScale, paint->getBlendMode(), Blend::ModeOrderSwap::NoSwap, shader,
- paint->getColorFilter());
- } else {
- mOutGlop->fill.color = {alphaScale, alphaScale, alphaScale, alphaScale};
-
- if (alphaScale < 1.0f || (mOutGlop->mesh.vertices.attribFlags & VertexAttribFlags::Alpha) ||
- texture.blend || mOutGlop->roundRectClipState) {
- Blend::getFactors(SkBlendMode::kSrcOver, Blend::ModeOrderSwap::NoSwap,
- &mOutGlop->blend.src, &mOutGlop->blend.dst);
- } else {
- mOutGlop->blend = {GL_ZERO, GL_ZERO};
- }
- }
-
- if (textureFillFlags & TextureFillFlags::IsAlphaMaskTexture) {
- mDescription.modulate = mOutGlop->fill.color.isNotBlack();
- mDescription.hasAlpha8Texture = true;
- } else {
- mDescription.modulate = mOutGlop->fill.color.a < 1.0f;
- }
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setFillPaint(const SkPaint& paint, float alphaScale, bool shadowInterp) {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- if (CC_LIKELY(!shadowInterp)) {
- mOutGlop->fill.texture = {nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr};
- } else {
- mOutGlop->fill.texture = {mCaches.textureState().getShadowLutTexture(), GL_INVALID_ENUM,
- GL_INVALID_ENUM, nullptr};
- }
-
- setFill(paint.getColor(), alphaScale, paint.getBlendMode(), Blend::ModeOrderSwap::NoSwap,
- paint.getShader(), paint.getColorFilter());
- mDescription.useShadowAlphaInterp = shadowInterp;
- mDescription.modulate = mOutGlop->fill.color.a < 1.0f;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setFillPathTexturePaint(PathTexture& texture, const SkPaint& paint,
- float alphaScale) {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- // specify invalid filter/clamp, since these are always static for PathTextures
- mOutGlop->fill.texture = {&texture, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr};
-
- setFill(paint.getColor(), alphaScale, paint.getBlendMode(), Blend::ModeOrderSwap::NoSwap,
- paint.getShader(), paint.getColorFilter());
-
- mDescription.hasAlpha8Texture = true;
- mDescription.modulate = mOutGlop->fill.color.isNotBlack();
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setFillShadowTexturePaint(ShadowTexture& texture, int shadowColor,
- const SkPaint& paint, float alphaScale) {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- // specify invalid filter/clamp, since these are always static for ShadowTextures
- mOutGlop->fill.texture = {&texture, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr};
-
- const int ALPHA_BITMASK = SK_ColorBLACK;
- const int COLOR_BITMASK = ~ALPHA_BITMASK;
- if ((shadowColor & ALPHA_BITMASK) == ALPHA_BITMASK) {
- // shadow color is fully opaque: override its alpha with that of paint
- shadowColor &= paint.getColor() | COLOR_BITMASK;
- }
-
- setFill(shadowColor, alphaScale, paint.getBlendMode(), Blend::ModeOrderSwap::NoSwap,
- paint.getShader(), paint.getColorFilter());
-
- mDescription.hasAlpha8Texture = true;
- mDescription.modulate = mOutGlop->fill.color.isNotBlack();
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setFillBlack() {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- mOutGlop->fill.texture = {nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr};
- setFill(SK_ColorBLACK, 1.0f, SkBlendMode::kSrcOver, Blend::ModeOrderSwap::NoSwap, nullptr,
- nullptr);
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setFillClear() {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- mOutGlop->fill.texture = {nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr};
- setFill(SK_ColorBLACK, 1.0f, SkBlendMode::kClear, Blend::ModeOrderSwap::NoSwap, nullptr,
- nullptr);
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setFillLayer(Texture& texture, const SkColorFilter* colorFilter,
- float alpha, SkBlendMode mode,
- Blend::ModeOrderSwap modeUsage) {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- mOutGlop->fill.texture = {&texture, GL_LINEAR, GL_CLAMP_TO_EDGE, nullptr};
-
- setFill(SK_ColorWHITE, alpha, mode, modeUsage, nullptr, colorFilter);
-
- mDescription.modulate = mOutGlop->fill.color.a < 1.0f;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setFillTextureLayer(GlLayer& layer, float alpha) {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- mOutGlop->fill.texture = {&(layer.getTexture()), GL_LINEAR, GL_CLAMP_TO_EDGE,
- &layer.getTexTransform()};
-
- setFill(SK_ColorWHITE, alpha, layer.getMode(), Blend::ModeOrderSwap::NoSwap, nullptr,
- layer.getColorFilter());
-
- mDescription.modulate = mOutGlop->fill.color.a < 1.0f;
- mDescription.hasTextureTransform = true;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setFillExternalTexture(Texture& texture, Matrix4& textureTransform,
- bool requiresFilter) {
- TRIGGER_STAGE(kFillStage);
- REQUIRE_STAGES(kMeshStage | kRoundRectClipStage);
-
- GLenum filter = requiresFilter ? GL_LINEAR : GL_NEAREST;
- mOutGlop->fill.texture = {&texture, filter, GL_CLAMP_TO_EDGE, &textureTransform};
-
- setFill(SK_ColorWHITE, 1.0f, SkBlendMode::kSrc, Blend::ModeOrderSwap::NoSwap, nullptr, nullptr);
-
- mDescription.modulate = mOutGlop->fill.color.a < 1.0f;
- mDescription.hasTextureTransform = true;
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setGammaCorrection(bool enabled) {
- REQUIRE_STAGES(kFillStage);
-
- mDescription.hasGammaCorrection = enabled;
- return *this;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Transform
-////////////////////////////////////////////////////////////////////////////////
-
-GlopBuilder& GlopBuilder::setTransform(const Matrix4& canvas, const int transformFlags) {
- TRIGGER_STAGE(kTransformStage);
-
- mOutGlop->transform.canvas = canvas;
- mOutGlop->transform.transformFlags = transformFlags;
- return *this;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// ModelView
-////////////////////////////////////////////////////////////////////////////////
-
-GlopBuilder& GlopBuilder::setModelViewMapUnitToRect(const Rect destination) {
- TRIGGER_STAGE(kModelViewStage);
-
- mOutGlop->transform.modelView.loadTranslate(destination.left, destination.top, 0.0f);
- mOutGlop->transform.modelView.scale(destination.getWidth(), destination.getHeight(), 1.0f);
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setModelViewMapUnitToRectSnap(const Rect destination) {
- TRIGGER_STAGE(kModelViewStage);
- REQUIRE_STAGES(kTransformStage | kFillStage);
-
- float left = destination.left;
- float top = destination.top;
-
- const Matrix4& meshTransform = mOutGlop->transform.meshTransform();
- if (CC_LIKELY(meshTransform.isPureTranslate())) {
- // snap by adjusting the model view matrix
- const float translateX = meshTransform.getTranslateX();
- const float translateY = meshTransform.getTranslateY();
-
- left = (int)floorf(left + translateX + 0.5f) - translateX;
- top = (int)floorf(top + translateY + 0.5f) - translateY;
- mOutGlop->fill.texture.filter = GL_NEAREST;
- }
-
- mOutGlop->transform.modelView.loadTranslate(left, top, 0.0f);
- mOutGlop->transform.modelView.scale(destination.getWidth(), destination.getHeight(), 1.0f);
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setModelViewOffsetRect(float offsetX, float offsetY, const Rect source) {
- TRIGGER_STAGE(kModelViewStage);
-
- mOutGlop->transform.modelView.loadTranslate(offsetX, offsetY, 0.0f);
- return *this;
-}
-
-GlopBuilder& GlopBuilder::setModelViewOffsetRectSnap(float offsetX, float offsetY,
- const Rect source) {
- TRIGGER_STAGE(kModelViewStage);
- REQUIRE_STAGES(kTransformStage | kFillStage);
-
- const Matrix4& meshTransform = mOutGlop->transform.meshTransform();
- if (CC_LIKELY(meshTransform.isPureTranslate())) {
- // snap by adjusting the model view matrix
- const float translateX = meshTransform.getTranslateX();
- const float translateY = meshTransform.getTranslateY();
-
- offsetX = (int)floorf(offsetX + translateX + source.left + 0.5f) - translateX - source.left;
- offsetY = (int)floorf(offsetY + translateY + source.top + 0.5f) - translateY - source.top;
- mOutGlop->fill.texture.filter = GL_NEAREST;
- }
-
- mOutGlop->transform.modelView.loadTranslate(offsetX, offsetY, 0.0f);
- return *this;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// RoundRectClip
-////////////////////////////////////////////////////////////////////////////////
-
-GlopBuilder& GlopBuilder::setRoundRectClipState(const RoundRectClipState* roundRectClipState) {
- TRIGGER_STAGE(kRoundRectClipStage);
-
- mOutGlop->roundRectClipState = roundRectClipState;
- mDescription.hasRoundRectClip = roundRectClipState != nullptr;
- return *this;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Build
-////////////////////////////////////////////////////////////////////////////////
-
-void verify(const ProgramDescription& description, const Glop& glop) {
- if (glop.fill.texture.texture != nullptr) {
- LOG_ALWAYS_FATAL_IF(
- ((description.hasTexture && description.hasExternalTexture) ||
- (!description.hasTexture && !description.hasExternalTexture &&
- !description.useShadowAlphaInterp) ||
- ((glop.mesh.vertices.attribFlags & VertexAttribFlags::TextureCoord) == 0 &&
- !description.useShadowAlphaInterp)),
- "Texture %p, hT%d, hET %d, attribFlags %x", glop.fill.texture.texture,
- description.hasTexture, description.hasExternalTexture,
- glop.mesh.vertices.attribFlags);
- } else {
- LOG_ALWAYS_FATAL_IF(
- (description.hasTexture || description.hasExternalTexture ||
- ((glop.mesh.vertices.attribFlags & VertexAttribFlags::TextureCoord) != 0)),
- "No texture, hT%d, hET %d, attribFlags %x", description.hasTexture,
- description.hasExternalTexture, glop.mesh.vertices.attribFlags);
- }
-
- if ((glop.mesh.vertices.attribFlags & VertexAttribFlags::Alpha) &&
- glop.mesh.vertices.bufferObject) {
- LOG_ALWAYS_FATAL("VBO and alpha attributes are not currently compatible");
- }
-
- if (description.hasTextureTransform != (glop.fill.texture.textureTransform != nullptr)) {
- LOG_ALWAYS_FATAL("Texture transform incorrectly specified");
- }
-}
-
-void GlopBuilder::build() {
- REQUIRE_STAGES(kAllStages);
- if (mOutGlop->mesh.vertices.attribFlags & VertexAttribFlags::TextureCoord) {
- Texture* texture = mOutGlop->fill.texture.texture;
- if (texture->target() == GL_TEXTURE_2D) {
- mDescription.hasTexture = true;
- } else {
- mDescription.hasExternalTexture = true;
- }
- mDescription.hasLinearTexture = texture->isLinear();
- mDescription.hasColorSpaceConversion = texture->hasColorSpaceConversion();
- mDescription.transferFunction = texture->getTransferFunctionType();
- mDescription.hasTranslucentConversion = texture->blend;
- }
-
- mDescription.hasColors = mOutGlop->mesh.vertices.attribFlags & VertexAttribFlags::Color;
- mDescription.hasVertexAlpha = mOutGlop->mesh.vertices.attribFlags & VertexAttribFlags::Alpha;
-
- // Enable debug highlight when what we're about to draw is tested against
- // the stencil buffer and if stencil highlight debugging is on
- mDescription.hasDebugHighlight =
- !Properties::debugOverdraw &&
- Properties::debugStencilClip == StencilClipDebug::ShowHighlight &&
- mRenderState.stencil().isTestEnabled();
-
- // serialize shader info into ShaderData
- GLuint textureUnit = mOutGlop->fill.texture.texture ? 1 : 0;
-
- if (CC_LIKELY(!mShader)) {
- mOutGlop->fill.skiaShaderData.skiaShaderType = kNone_SkiaShaderType;
- } else {
- Matrix4 shaderMatrix;
- if (mOutGlop->transform.transformFlags & TransformFlags::MeshIgnoresCanvasTransform) {
- // canvas level transform was built into the modelView and geometry,
- // so the shader matrix must reverse this
- shaderMatrix.loadInverse(mOutGlop->transform.canvas);
- shaderMatrix.multiply(mOutGlop->transform.modelView);
- } else {
- shaderMatrix = mOutGlop->transform.modelView;
- }
- SkiaShader::store(mCaches, *mShader, shaderMatrix, &textureUnit, &mDescription,
- &(mOutGlop->fill.skiaShaderData));
- }
-
- // duplicates ProgramCache's definition of color uniform presence
- const bool singleColor = !mDescription.hasTexture && !mDescription.hasExternalTexture &&
- !mDescription.hasGradient && !mDescription.hasBitmap;
- mOutGlop->fill.colorEnabled = mDescription.modulate || singleColor;
-
- verify(mDescription, *mOutGlop);
-
- // Final step: populate program and map bounds into render target space
- mOutGlop->fill.program = mCaches.programCache.get(mDescription);
-}
-
-void GlopBuilder::dump(const Glop& glop) {
- ALOGD("Glop Mesh");
- const Glop::Mesh& mesh = glop.mesh;
- ALOGD(" primitive mode: %d", mesh.primitiveMode);
- ALOGD(" indices: buffer obj %x, indices %p", mesh.indices.bufferObject,
- mesh.indices.indices);
-
- const Glop::Mesh::Vertices& vertices = glop.mesh.vertices;
- ALOGD(" vertices: buffer obj %x, flags %x, pos %p, tex %p, clr %p, stride %d",
- vertices.bufferObject, vertices.attribFlags, vertices.position, vertices.texCoord,
- vertices.color, vertices.stride);
- ALOGD(" element count: %d", mesh.elementCount);
-
- ALOGD("Glop Fill");
- const Glop::Fill& fill = glop.fill;
- ALOGD(" program %p", fill.program);
- if (fill.texture.texture) {
- ALOGD(" texture %p, target %d, filter %d, clamp %d", fill.texture.texture,
- fill.texture.texture->target(), fill.texture.filter, fill.texture.clamp);
- if (fill.texture.textureTransform) {
- fill.texture.textureTransform->dump("texture transform");
- }
- }
- ALOGD_IF(fill.colorEnabled, " color (argb) %.2f %.2f %.2f %.2f", fill.color.a, fill.color.r,
- fill.color.g, fill.color.b);
- ALOGD_IF(fill.filterMode != ProgramDescription::ColorFilterMode::None, " filterMode %d",
- (int)fill.filterMode);
- ALOGD_IF(fill.skiaShaderData.skiaShaderType, " shader type %d",
- fill.skiaShaderData.skiaShaderType);
-
- ALOGD("Glop transform");
- glop.transform.modelView.dump(" model view");
- glop.transform.canvas.dump(" canvas");
- ALOGD_IF(glop.transform.transformFlags, " transformFlags 0x%x", glop.transform.transformFlags);
-
- ALOGD_IF(glop.roundRectClipState, "Glop RRCS %p", glop.roundRectClipState);
-
- ALOGD("Glop blend %d %d", glop.blend.src, glop.blend.dst);
-}
-
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/GlopBuilder.h b/libs/hwui/GlopBuilder.h
deleted file mode 100644
index dac38223b877..000000000000
--- a/libs/hwui/GlopBuilder.h
+++ /dev/null
@@ -1,142 +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.
- */
-
-#pragma once
-
-#include "Glop.h"
-#include "Program.h"
-#include "renderstate/Blend.h"
-#include "utils/Macros.h"
-
-class SkPaint;
-class SkShader;
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-class GlLayer;
-class Matrix4;
-class Patch;
-class RenderState;
-class Texture;
-class UvMapper;
-class VertexBuffer;
-struct PathTexture;
-struct ShadowTexture;
-
-namespace TextureFillFlags {
-enum {
- None = 0,
- IsAlphaMaskTexture = 1 << 0,
- ForceFilter = 1 << 1,
-};
-}
-
-class GlopBuilder {
- PREVENT_COPY_AND_ASSIGN(GlopBuilder);
-
-public:
- GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop);
-
- GlopBuilder& setMeshTexturedIndexedVbo(GLuint vbo, GLsizei elementCount);
- GlopBuilder& setMeshUnitQuad();
- GlopBuilder& setMeshTexturedUnitQuad(const UvMapper* uvMapper);
- GlopBuilder& setMeshTexturedUvQuad(const UvMapper* uvMapper, const Rect uvs);
- GlopBuilder& setMeshVertexBuffer(const VertexBuffer& vertexBuffer);
- GlopBuilder& setMeshIndexedQuads(Vertex* vertexData, int quadCount);
- GlopBuilder& setMeshColoredTexturedMesh(ColorTextureVertex* vertexData,
- int elementCount); // TODO: use indexed quads
- GlopBuilder& setMeshTexturedIndexedQuads(TextureVertex* vertexData,
- int elementCount); // TODO: take quadCount
- GlopBuilder& setMeshPatchQuads(const Patch& patch);
-
- GlopBuilder& setFillPaint(const SkPaint& paint, float alphaScale,
- bool shadowInterp = false); // TODO: avoid boolean with default
- GlopBuilder& setFillTexturePaint(Texture& texture, const int textureFillFlags,
- const SkPaint* paint, float alphaScale);
- GlopBuilder& setFillPathTexturePaint(PathTexture& texture, const SkPaint& paint,
- float alphaScale);
- GlopBuilder& setFillShadowTexturePaint(ShadowTexture& texture, int shadowColor,
- const SkPaint& paint, float alphaScale);
- GlopBuilder& setFillBlack();
- GlopBuilder& setFillClear();
- GlopBuilder& setFillLayer(Texture& texture, const SkColorFilter* colorFilter, float alpha,
- SkBlendMode mode, Blend::ModeOrderSwap modeUsage);
- GlopBuilder& setFillTextureLayer(GlLayer& layer, float alpha);
- // TODO: setFillLayer normally forces its own wrap & filter mode,
- // which isn't always correct.
- GlopBuilder& setFillExternalTexture(Texture& texture, Matrix4& textureTransform,
- bool requiresFilter);
-
- GlopBuilder& setTransform(const Matrix4& canvas, const int transformFlags);
-
- GlopBuilder& setModelViewMapUnitToRect(const Rect destination);
- GlopBuilder& setModelViewMapUnitToRectSnap(const Rect destination);
- GlopBuilder& setModelViewMapUnitToRectOptionalSnap(bool snap, const Rect& destination) {
- if (snap) {
- return setModelViewMapUnitToRectSnap(destination);
- } else {
- return setModelViewMapUnitToRect(destination);
- }
- }
- GlopBuilder& setModelViewOffsetRect(float offsetX, float offsetY, const Rect source);
- GlopBuilder& setModelViewOffsetRectSnap(float offsetX, float offsetY, const Rect source);
- GlopBuilder& setModelViewOffsetRectOptionalSnap(bool snap, float offsetX, float offsetY,
- const Rect& source) {
- if (snap) {
- return setModelViewOffsetRectSnap(offsetX, offsetY, source);
- } else {
- return setModelViewOffsetRect(offsetX, offsetY, source);
- }
- }
- GlopBuilder& setModelViewIdentityEmptyBounds() {
- // pass empty rect since not needed for damage / snap
- return setModelViewOffsetRect(0, 0, Rect());
- }
-
- GlopBuilder& setRoundRectClipState(const RoundRectClipState* roundRectClipState);
-
- GlopBuilder& setGammaCorrection(bool enabled);
-
- void build();
-
- static void dump(const Glop& glop);
-
-private:
- void setFill(int color, float alphaScale, SkBlendMode mode, Blend::ModeOrderSwap modeUsage,
- const SkShader* shader, const SkColorFilter* colorFilter);
-
- enum StageFlags {
- kInitialStage = 0,
- kMeshStage = 1 << 0,
- kTransformStage = 1 << 1,
- kModelViewStage = 1 << 2,
- kFillStage = 1 << 3,
- kRoundRectClipStage = 1 << 4,
- kAllStages =
- kMeshStage | kFillStage | kTransformStage | kModelViewStage | kRoundRectClipStage,
- } mStageFlags;
-
- ProgramDescription mDescription;
- RenderState& mRenderState;
- Caches& mCaches;
- const SkShader* mShader;
- Glop* mOutGlop;
-};
-
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/GradientCache.cpp b/libs/hwui/GradientCache.cpp
deleted file mode 100644
index 21e3c730cbec..000000000000
--- a/libs/hwui/GradientCache.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <utils/JenkinsHash.h>
-
-#include "Caches.h"
-#include "Debug.h"
-#include "DeviceInfo.h"
-#include "GradientCache.h"
-#include "Properties.h"
-
-#include <cutils/properties.h>
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Functions
-///////////////////////////////////////////////////////////////////////////////
-
-template <typename T>
-static inline T min(T a, T b) {
- return a < b ? a : b;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache entry
-///////////////////////////////////////////////////////////////////////////////
-
-hash_t GradientCacheEntry::hash() const {
- uint32_t hash = JenkinsHashMix(0, count);
- for (uint32_t i = 0; i < count; i++) {
- hash = JenkinsHashMix(hash, android::hash_type(colors[i]));
- hash = JenkinsHashMix(hash, android::hash_type(positions[i]));
- }
- return JenkinsHashWhiten(hash);
-}
-
-int GradientCacheEntry::compare(const GradientCacheEntry& lhs, const GradientCacheEntry& rhs) {
- int deltaInt = int(lhs.count) - int(rhs.count);
- if (deltaInt != 0) return deltaInt;
-
- deltaInt = memcmp(lhs.colors.get(), rhs.colors.get(), lhs.count * sizeof(uint32_t));
- if (deltaInt != 0) return deltaInt;
-
- return memcmp(lhs.positions.get(), rhs.positions.get(), lhs.count * sizeof(float));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Constructors/destructor
-///////////////////////////////////////////////////////////////////////////////
-
-GradientCache::GradientCache(const Extensions& extensions)
- : mCache(LruCache<GradientCacheEntry, Texture*>::kUnlimitedCapacity)
- , mSize(0)
- , mMaxSize(MB(1))
- , mUseFloatTexture(extensions.hasFloatTextures())
- , mHasNpot(extensions.hasNPot())
- , mHasLinearBlending(extensions.hasLinearBlending()) {
- mMaxTextureSize = DeviceInfo::get()->maxTextureSize();
-
- mCache.setOnEntryRemovedListener(this);
-}
-
-GradientCache::~GradientCache() {
- mCache.clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Size management
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t GradientCache::getSize() {
- return mSize;
-}
-
-uint32_t GradientCache::getMaxSize() {
- return mMaxSize;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Callbacks
-///////////////////////////////////////////////////////////////////////////////
-
-void GradientCache::operator()(GradientCacheEntry&, Texture*& texture) {
- if (texture) {
- mSize -= texture->objectSize();
- texture->deleteTexture();
- delete texture;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Caching
-///////////////////////////////////////////////////////////////////////////////
-
-Texture* GradientCache::get(uint32_t* colors, float* positions, int count) {
- GradientCacheEntry gradient(colors, positions, count);
- Texture* texture = mCache.get(gradient);
-
- if (!texture) {
- texture = addLinearGradient(gradient, colors, positions, count);
- }
-
- return texture;
-}
-
-void GradientCache::clear() {
- mCache.clear();
-}
-
-void GradientCache::getGradientInfo(const uint32_t* colors, const int count, GradientInfo& info) {
- uint32_t width = 256 * (count - 1);
-
- // If the npot extension is not supported we cannot use non-clamp
- // wrap modes. We therefore find the nearest largest power of 2
- // unless width is already a power of 2
- if (!mHasNpot && (width & (width - 1)) != 0) {
- width = 1 << (32 - __builtin_clz(width));
- }
-
- bool hasAlpha = false;
- for (int i = 0; i < count; i++) {
- if (((colors[i] >> 24) & 0xff) < 255) {
- hasAlpha = true;
- break;
- }
- }
-
- info.width = min(width, uint32_t(mMaxTextureSize));
- info.hasAlpha = hasAlpha;
-}
-
-Texture* GradientCache::addLinearGradient(GradientCacheEntry& gradient, uint32_t* colors,
- float* positions, int count) {
- GradientInfo info;
- getGradientInfo(colors, count, info);
-
- Texture* texture = new Texture(Caches::getInstance());
- texture->blend = info.hasAlpha;
- texture->generation = 1;
-
- // Assume the cache is always big enough
- const uint32_t size = info.width * 2 * bytesPerPixel();
- while (getSize() + size > mMaxSize) {
- LOG_ALWAYS_FATAL_IF(!mCache.removeOldest(),
- "Ran out of things to remove from the cache? getSize() = %" PRIu32
- ", size = %" PRIu32 ", mMaxSize = %" PRIu32 ", width = %" PRIu32,
- getSize(), size, mMaxSize, info.width);
- }
-
- generateTexture(colors, positions, info.width, 2, texture);
-
- mSize += size;
- LOG_ALWAYS_FATAL_IF((int)size != texture->objectSize(),
- "size != texture->objectSize(), size %" PRIu32
- ", objectSize %d"
- " width = %" PRIu32 " bytesPerPixel() = %zu",
- size, texture->objectSize(), info.width, bytesPerPixel());
- mCache.put(gradient, texture);
-
- return texture;
-}
-
-size_t GradientCache::bytesPerPixel() const {
- // We use 4 channels (RGBA)
- return 4 * (mUseFloatTexture ? /* fp16 */ 2 : sizeof(uint8_t));
-}
-
-size_t GradientCache::sourceBytesPerPixel() const {
- // We use 4 channels (RGBA) and upload from floats (not half floats)
- return 4 * (mUseFloatTexture ? sizeof(float) : sizeof(uint8_t));
-}
-
-void GradientCache::mixBytes(const FloatColor& start, const FloatColor& end, float amount,
- uint8_t*& dst) const {
- float oppAmount = 1.0f - amount;
- float a = start.a * oppAmount + end.a * amount;
- *dst++ = uint8_t(OECF(start.r * oppAmount + end.r * amount) * 255.0f);
- *dst++ = uint8_t(OECF(start.g * oppAmount + end.g * amount) * 255.0f);
- *dst++ = uint8_t(OECF(start.b * oppAmount + end.b * amount) * 255.0f);
- *dst++ = uint8_t(a * 255.0f);
-}
-
-void GradientCache::mixFloats(const FloatColor& start, const FloatColor& end, float amount,
- uint8_t*& dst) const {
- float oppAmount = 1.0f - amount;
- float a = start.a * oppAmount + end.a * amount;
- float* d = (float*)dst;
-#ifdef ANDROID_ENABLE_LINEAR_BLENDING
- // We want to stay linear
- *d++ = (start.r * oppAmount + end.r * amount);
- *d++ = (start.g * oppAmount + end.g * amount);
- *d++ = (start.b * oppAmount + end.b * amount);
-#else
- *d++ = OECF(start.r * oppAmount + end.r * amount);
- *d++ = OECF(start.g * oppAmount + end.g * amount);
- *d++ = OECF(start.b * oppAmount + end.b * amount);
-#endif
- *d++ = a;
- dst += 4 * sizeof(float);
-}
-
-void GradientCache::generateTexture(uint32_t* colors, float* positions, const uint32_t width,
- const uint32_t height, Texture* texture) {
- const GLsizei rowBytes = width * sourceBytesPerPixel();
- uint8_t pixels[rowBytes * height];
-
- static ChannelMixer gMixers[] = {
- // colors are stored gamma-encoded
- &android::uirenderer::GradientCache::mixBytes,
- // colors are stored in linear (linear blending on)
- // or gamma-encoded (linear blending off)
- &android::uirenderer::GradientCache::mixFloats,
- };
- ChannelMixer mix = gMixers[mUseFloatTexture];
-
- FloatColor start;
- start.set(colors[0]);
-
- FloatColor end;
- end.set(colors[1]);
-
- int currentPos = 1;
- float startPos = positions[0];
- float distance = positions[1] - startPos;
-
- uint8_t* dst = pixels;
- for (uint32_t x = 0; x < width; x++) {
- float pos = x / float(width - 1);
- if (pos > positions[currentPos]) {
- start = end;
- startPos = positions[currentPos];
-
- currentPos++;
-
- end.set(colors[currentPos]);
- distance = positions[currentPos] - startPos;
- }
-
- float amount = (pos - startPos) / distance;
- (this->*mix)(start, end, amount, dst);
- }
-
- memcpy(pixels + rowBytes, pixels, rowBytes);
-
- if (mUseFloatTexture) {
- texture->upload(GL_RGBA16F, width, height, GL_RGBA, GL_FLOAT, pixels);
- } else {
- GLint internalFormat = mHasLinearBlending ? GL_SRGB8_ALPHA8 : GL_RGBA;
- texture->upload(internalFormat, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
- }
-
- texture->setFilter(GL_LINEAR);
- texture->setWrap(GL_CLAMP_TO_EDGE);
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/GradientCache.h b/libs/hwui/GradientCache.h
deleted file mode 100644
index ff426cd3425b..000000000000
--- a/libs/hwui/GradientCache.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_GRADIENT_CACHE_H
-#define ANDROID_HWUI_GRADIENT_CACHE_H
-
-#include <memory>
-
-#include <GLES3/gl3.h>
-
-#include <SkShader.h>
-
-#include <utils/LruCache.h>
-#include <utils/Mutex.h>
-
-#include "FloatColor.h"
-
-namespace android {
-namespace uirenderer {
-
-class Texture;
-
-struct GradientCacheEntry {
- GradientCacheEntry() {
- count = 0;
- colors = nullptr;
- positions = nullptr;
- }
-
- GradientCacheEntry(uint32_t* colors, float* positions, uint32_t count) {
- copy(colors, positions, count);
- }
-
- GradientCacheEntry(const GradientCacheEntry& entry) {
- copy(entry.colors.get(), entry.positions.get(), entry.count);
- }
-
- GradientCacheEntry& operator=(const GradientCacheEntry& entry) {
- if (this != &entry) {
- copy(entry.colors.get(), entry.positions.get(), entry.count);
- }
-
- return *this;
- }
-
- hash_t hash() const;
-
- static int compare(const GradientCacheEntry& lhs, const GradientCacheEntry& rhs);
-
- bool operator==(const GradientCacheEntry& other) const { return compare(*this, other) == 0; }
-
- bool operator!=(const GradientCacheEntry& other) const { return compare(*this, other) != 0; }
-
- std::unique_ptr<uint32_t[]> colors;
- std::unique_ptr<float[]> positions;
- uint32_t count;
-
-private:
- void copy(uint32_t* colors, float* positions, uint32_t count) {
- this->count = count;
- this->colors.reset(new uint32_t[count]);
- this->positions.reset(new float[count]);
-
- memcpy(this->colors.get(), colors, count * sizeof(uint32_t));
- memcpy(this->positions.get(), positions, count * sizeof(float));
- }
-
-}; // GradientCacheEntry
-
-// Caching support
-
-inline int strictly_order_type(const GradientCacheEntry& lhs, const GradientCacheEntry& rhs) {
- return GradientCacheEntry::compare(lhs, rhs) < 0;
-}
-
-inline int compare_type(const GradientCacheEntry& lhs, const GradientCacheEntry& rhs) {
- return GradientCacheEntry::compare(lhs, rhs);
-}
-
-inline hash_t hash_type(const GradientCacheEntry& entry) {
- return entry.hash();
-}
-
-/**
- * A simple LRU gradient cache. The cache has a maximum size expressed in bytes.
- * Any texture added to the cache causing the cache to grow beyond the maximum
- * allowed size will also cause the oldest texture to be kicked out.
- */
-class GradientCache : public OnEntryRemoved<GradientCacheEntry, Texture*> {
-public:
- explicit GradientCache(const Extensions& extensions);
- ~GradientCache();
-
- /**
- * Used as a callback when an entry is removed from the cache.
- * Do not invoke directly.
- */
- void operator()(GradientCacheEntry& shader, Texture*& texture) override;
-
- /**
- * Returns the texture associated with the specified shader.
- */
- Texture* get(uint32_t* colors, float* positions, int count);
-
- /**
- * Clears the cache. This causes all textures to be deleted.
- */
- void clear();
-
- /**
- * Returns the maximum size of the cache in bytes.
- */
- uint32_t getMaxSize();
- /**
- * Returns the current size of the cache in bytes.
- */
- uint32_t getSize();
-
-private:
- /**
- * Adds a new linear gradient to the cache. The generated texture is
- * returned.
- */
- Texture* addLinearGradient(GradientCacheEntry& gradient, uint32_t* colors, float* positions,
- int count);
-
- void generateTexture(uint32_t* colors, float* positions, const uint32_t width,
- const uint32_t height, Texture* texture);
-
- struct GradientInfo {
- uint32_t width;
- bool hasAlpha;
- };
-
- void getGradientInfo(const uint32_t* colors, const int count, GradientInfo& info);
-
- size_t bytesPerPixel() const;
- size_t sourceBytesPerPixel() const;
-
- typedef void (GradientCache::*ChannelMixer)(const FloatColor& start, const FloatColor& end,
- float amount, uint8_t*& dst) const;
-
- void mixBytes(const FloatColor& start, const FloatColor& end, float amount,
- uint8_t*& dst) const;
- void mixFloats(const FloatColor& start, const FloatColor& end, float amount,
- uint8_t*& dst) const;
-
- LruCache<GradientCacheEntry, Texture*> mCache;
-
- uint32_t mSize;
- const uint32_t mMaxSize;
-
- GLint mMaxTextureSize;
- bool mUseFloatTexture;
- bool mHasNpot;
- bool mHasLinearBlending;
-
- mutable Mutex mLock;
-}; // class GradientCache
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_GRADIENT_CACHE_H
diff --git a/libs/hwui/HardwareBitmapUploader.cpp b/libs/hwui/HardwareBitmapUploader.cpp
new file mode 100644
index 000000000000..6408ce6c04f4
--- /dev/null
+++ b/libs/hwui/HardwareBitmapUploader.cpp
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "HardwareBitmapUploader.h"
+
+#include "hwui/Bitmap.h"
+#include "renderthread/EglManager.h"
+#include "thread/ThreadBase.h"
+#include "utils/TimeUtils.h"
+
+#include <EGL/eglext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+#include <GLES3/gl3.h>
+#include <SkCanvas.h>
+#include <utils/GLUtils.h>
+#include <utils/Trace.h>
+#include <utils/TraceUtils.h>
+#include <thread>
+
+namespace android::uirenderer {
+
+static std::mutex sLock{};
+static ThreadBase* sUploadThread = nullptr;
+static renderthread::EglManager sEglManager;
+static int sPendingUploads = 0;
+static nsecs_t sLastUpload = 0;
+
+static bool shouldTimeOutLocked() {
+ nsecs_t durationSince = systemTime() - sLastUpload;
+ return durationSince > 2000_ms;
+}
+
+static void checkIdleTimeout() {
+ std::lock_guard{sLock};
+ if (sPendingUploads == 0 && shouldTimeOutLocked()) {
+ sEglManager.destroy();
+ } else {
+ sUploadThread->queue().postDelayed(5000_ms, checkIdleTimeout);
+ }
+}
+
+static void beginUpload() {
+ std::lock_guard{sLock};
+ sPendingUploads++;
+
+ if (!sUploadThread) {
+ sUploadThread = new ThreadBase{};
+ }
+
+ if (!sUploadThread->isRunning()) {
+ sUploadThread->start("GrallocUploadThread");
+ }
+
+ if (!sEglManager.hasEglContext()) {
+ sUploadThread->queue().runSync([]() {
+ sEglManager.initialize();
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ });
+ sUploadThread->queue().postDelayed(5000_ms, checkIdleTimeout);
+ }
+}
+
+static void endUpload() {
+ std::lock_guard{sLock};
+ sPendingUploads--;
+ sLastUpload = systemTime();
+}
+
+static EGLDisplay getUploadEglDisplay() {
+ std::lock_guard{sLock};
+ LOG_ALWAYS_FATAL_IF(!sEglManager.hasEglContext(), "Forgot to begin an upload?");
+ return sEglManager.eglDisplay();
+}
+
+static bool hasFP16Support() {
+ static std::once_flag sOnce;
+ static bool hasFP16Support = false;
+
+ // Gralloc shouldn't let us create a USAGE_HW_TEXTURE if GLES is unable to consume it, so
+ // we don't need to double-check the GLES version/extension.
+ std::call_once(sOnce, []() {
+ sp<GraphicBuffer> buffer = new GraphicBuffer(1, 1, PIXEL_FORMAT_RGBA_FP16,
+ GraphicBuffer::USAGE_HW_TEXTURE |
+ GraphicBuffer::USAGE_SW_WRITE_NEVER |
+ GraphicBuffer::USAGE_SW_READ_NEVER,
+ "tempFp16Buffer");
+ status_t error = buffer->initCheck();
+ hasFP16Support = !error;
+ });
+
+ return hasFP16Support;
+}
+
+#define FENCE_TIMEOUT 2000000000
+
+class AutoEglImage {
+public:
+ AutoEglImage(EGLDisplay display, EGLClientBuffer clientBuffer) : mDisplay(display) {
+ EGLint imageAttrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
+ image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer,
+ imageAttrs);
+ }
+
+ ~AutoEglImage() {
+ if (image != EGL_NO_IMAGE_KHR) {
+ eglDestroyImageKHR(mDisplay, image);
+ }
+ }
+
+ EGLImageKHR image = EGL_NO_IMAGE_KHR;
+
+private:
+ EGLDisplay mDisplay = EGL_NO_DISPLAY;
+};
+
+class AutoSkiaGlTexture {
+public:
+ AutoSkiaGlTexture() {
+ glGenTextures(1, &mTexture);
+ glBindTexture(GL_TEXTURE_2D, mTexture);
+ }
+
+ ~AutoSkiaGlTexture() { glDeleteTextures(1, &mTexture); }
+
+private:
+ GLuint mTexture = 0;
+};
+
+struct FormatInfo {
+ PixelFormat pixelFormat;
+ GLint format, type;
+ bool isSupported = false;
+ bool valid = true;
+};
+
+static FormatInfo determineFormat(const SkBitmap& skBitmap) {
+ FormatInfo formatInfo;
+ // TODO: add support for linear blending (when ANDROID_ENABLE_LINEAR_BLENDING is defined)
+ switch (skBitmap.info().colorType()) {
+ case kRGBA_8888_SkColorType:
+ formatInfo.isSupported = true;
+ // ARGB_4444 is upconverted to RGBA_8888
+ case kARGB_4444_SkColorType:
+ formatInfo.pixelFormat = PIXEL_FORMAT_RGBA_8888;
+ formatInfo.format = GL_RGBA;
+ formatInfo.type = GL_UNSIGNED_BYTE;
+ break;
+ case kRGBA_F16_SkColorType:
+ formatInfo.isSupported = hasFP16Support();
+ if (formatInfo.isSupported) {
+ formatInfo.type = GL_HALF_FLOAT;
+ formatInfo.pixelFormat = PIXEL_FORMAT_RGBA_FP16;
+ } else {
+ formatInfo.type = GL_UNSIGNED_BYTE;
+ formatInfo.pixelFormat = PIXEL_FORMAT_RGBA_8888;
+ }
+ formatInfo.format = GL_RGBA;
+ break;
+ case kRGB_565_SkColorType:
+ formatInfo.isSupported = true;
+ formatInfo.pixelFormat = PIXEL_FORMAT_RGB_565;
+ formatInfo.format = GL_RGB;
+ formatInfo.type = GL_UNSIGNED_SHORT_5_6_5;
+ break;
+ case kGray_8_SkColorType:
+ formatInfo.isSupported = true;
+ formatInfo.pixelFormat = PIXEL_FORMAT_RGBA_8888;
+ formatInfo.format = GL_LUMINANCE;
+ formatInfo.type = GL_UNSIGNED_BYTE;
+ break;
+ default:
+ ALOGW("unable to create hardware bitmap of colortype: %d", skBitmap.info().colorType());
+ formatInfo.valid = false;
+ }
+ return formatInfo;
+}
+
+static SkBitmap makeHwCompatible(const FormatInfo& format, const SkBitmap& source) {
+ if (format.isSupported) {
+ return source;
+ } else {
+ SkBitmap bitmap;
+ const SkImageInfo& info = source.info();
+ bitmap.allocPixels(
+ SkImageInfo::MakeN32(info.width(), info.height(), info.alphaType(), nullptr));
+ bitmap.eraseColor(0);
+ if (info.colorType() == kRGBA_F16_SkColorType) {
+ // Drawing RGBA_F16 onto ARGB_8888 is not supported
+ source.readPixels(bitmap.info().makeColorSpace(SkColorSpace::MakeSRGB()),
+ bitmap.getPixels(), bitmap.rowBytes(), 0, 0);
+ } else {
+ SkCanvas canvas(bitmap);
+ canvas.drawBitmap(source, 0.0f, 0.0f, nullptr);
+ }
+ return bitmap;
+ }
+}
+
+class ScopedUploadRequest {
+public:
+ ScopedUploadRequest() { beginUpload(); }
+ ~ScopedUploadRequest() { endUpload(); }
+};
+
+sk_sp<Bitmap> HardwareBitmapUploader::allocateHardwareBitmap(const SkBitmap& sourceBitmap) {
+ ATRACE_CALL();
+
+ FormatInfo format = determineFormat(sourceBitmap);
+ if (!format.valid) {
+ return nullptr;
+ }
+
+ ScopedUploadRequest _uploadRequest{};
+
+ SkBitmap bitmap = makeHwCompatible(format, sourceBitmap);
+ sp<GraphicBuffer> buffer = new GraphicBuffer(
+ static_cast<uint32_t>(bitmap.width()), static_cast<uint32_t>(bitmap.height()),
+ format.pixelFormat,
+ GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_SW_WRITE_NEVER |
+ GraphicBuffer::USAGE_SW_READ_NEVER,
+ std::string("Bitmap::allocateSkiaHardwareBitmap pid [") + std::to_string(getpid()) +
+ "]");
+
+ status_t error = buffer->initCheck();
+ if (error < 0) {
+ ALOGW("createGraphicBuffer() failed in GraphicBuffer.create()");
+ return nullptr;
+ }
+
+ EGLDisplay display = getUploadEglDisplay();
+
+ LOG_ALWAYS_FATAL_IF(display == EGL_NO_DISPLAY, "Failed to get EGL_DEFAULT_DISPLAY! err=%s",
+ uirenderer::renderthread::EglManager::eglErrorString());
+ // We use an EGLImage to access the content of the GraphicBuffer
+ // The EGL image is later bound to a 2D texture
+ EGLClientBuffer clientBuffer = (EGLClientBuffer)buffer->getNativeBuffer();
+ AutoEglImage autoImage(display, clientBuffer);
+ if (autoImage.image == EGL_NO_IMAGE_KHR) {
+ ALOGW("Could not create EGL image, err =%s",
+ uirenderer::renderthread::EglManager::eglErrorString());
+ return nullptr;
+ }
+
+ {
+ ATRACE_FORMAT("CPU -> gralloc transfer (%dx%d)", bitmap.width(), bitmap.height());
+ EGLSyncKHR fence = sUploadThread->queue().runSync([&]() -> EGLSyncKHR {
+ AutoSkiaGlTexture glTexture;
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, autoImage.image);
+ GL_CHECKPOINT(MODERATE);
+
+ // glTexSubImage2D is synchronous in sense that it memcpy() from pointer that we
+ // provide.
+ // But asynchronous in sense that driver may upload texture onto hardware buffer when we
+ // first
+ // use it in drawing
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap.width(), bitmap.height(), format.format,
+ format.type, bitmap.getPixels());
+ GL_CHECKPOINT(MODERATE);
+
+ EGLSyncKHR uploadFence =
+ eglCreateSyncKHR(eglGetCurrentDisplay(), EGL_SYNC_FENCE_KHR, NULL);
+ LOG_ALWAYS_FATAL_IF(uploadFence == EGL_NO_SYNC_KHR, "Could not create sync fence %#x",
+ eglGetError());
+ glFlush();
+ return uploadFence;
+ });
+
+ EGLint waitStatus = eglClientWaitSyncKHR(display, fence, 0, FENCE_TIMEOUT);
+ LOG_ALWAYS_FATAL_IF(waitStatus != EGL_CONDITION_SATISFIED_KHR,
+ "Failed to wait for the fence %#x", eglGetError());
+
+ eglDestroySyncKHR(display, fence);
+ }
+
+ return sk_sp<Bitmap>(new Bitmap(buffer.get(), bitmap.info()));
+}
+
+}; // namespace android::uirenderer
diff --git a/media/tests/NativeMidiDemo/jni/messagequeue.h b/libs/hwui/HardwareBitmapUploader.h
index 20aa9e805d12..c0113d81fefb 100644
--- a/media/tests/NativeMidiDemo/jni/messagequeue.h
+++ b/libs/hwui/HardwareBitmapUploader.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -12,19 +12,17 @@
* 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.
- *
*/
-#ifndef NATIVEMIDIDEMO_MESSAGEQUEUE_H
-#define NATIVEMIDIDEMO_MESSAGEQUEUE_H
-
-#include <jni.h>
+#pragma once
-namespace nativemididemo {
+#include <hwui/Bitmap.h>
-void writeMessage(const char* message);
-jobjectArray getRecentMessagesForJava(JNIEnv* env, jobject thiz);
+namespace android::uirenderer {
-} // namespace nativemididemo
+class HardwareBitmapUploader {
+public:
+ static sk_sp<Bitmap> allocateHardwareBitmap(const SkBitmap& sourceBitmap);
+};
-#endif // NATIVEMIDIDEMO_MESSAGEQUEUE_H
+}; // namespace android::uirenderer
diff --git a/libs/hwui/Image.cpp b/libs/hwui/Image.cpp
deleted file mode 100644
index d30796d01479..000000000000
--- a/libs/hwui/Image.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include <utils/Log.h>
-
-#include "Caches.h"
-#include "Image.h"
-
-namespace android {
-namespace uirenderer {
-
-Image::Image(sp<GraphicBuffer> buffer) {
- // Create the EGLImage object that maps the GraphicBuffer
- EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- EGLClientBuffer clientBuffer = (EGLClientBuffer)buffer->getNativeBuffer();
- EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
-
- mImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer,
- attrs);
-
- if (mImage == EGL_NO_IMAGE_KHR) {
- ALOGW("Error creating image (%#x)", eglGetError());
- mTexture = 0;
- } else {
- // Create a 2D texture to sample from the EGLImage
- glGenTextures(1, &mTexture);
- Caches::getInstance().textureState().bindTexture(mTexture);
- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage);
-
- GLenum status = GL_NO_ERROR;
- while ((status = glGetError()) != GL_NO_ERROR) {
- ALOGW("Error creating image (%#x)", status);
- }
- }
-}
-
-Image::~Image() {
- if (mImage != EGL_NO_IMAGE_KHR) {
- eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), mImage);
- mImage = EGL_NO_IMAGE_KHR;
-
- Caches::getInstance().textureState().deleteTexture(mTexture);
- mTexture = 0;
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/Image.h b/libs/hwui/Image.h
deleted file mode 100644
index 989b6ff3648d..000000000000
--- a/libs/hwui/Image.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#ifndef ANDROID_HWUI_IMAGE_H
-#define ANDROID_HWUI_IMAGE_H
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include <ui/GraphicBuffer.h>
-
-namespace android {
-namespace uirenderer {
-
-/**
- * A simple wrapper that creates an EGLImage and a texture for a GraphicBuffer.
- */
-class Image {
-public:
- /**
- * Creates a new image from the specified graphic buffer. If the image
- * cannot be created, getTexture() will return 0 and getImage() will
- * return EGL_NO_IMAGE_KHR.
- */
- explicit Image(sp<GraphicBuffer> buffer);
- ~Image();
-
- /**
- * Returns the name of the GL texture that can be used to sample
- * from this image.
- */
- GLuint getTexture() const { return mTexture; }
-
- /**
- * Returns the name of the EGL image represented by this object.
- */
- EGLImageKHR getImage() const { return mImage; }
-
-private:
- GLuint mTexture;
- EGLImageKHR mImage;
-}; // class Image
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_IMAGE_H
diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h
index 89bcddcc96d0..31878ac23642 100644
--- a/libs/hwui/Layer.h
+++ b/libs/hwui/Layer.h
@@ -19,9 +19,9 @@
#include <GpuMemoryTracker.h>
#include <utils/RefBase.h>
+#include <SkBlendMode.h>
#include <SkColorFilter.h>
#include <SkColorSpace.h>
-#include <SkBlendMode.h>
#include <SkPaint.h>
#include "Matrix.h"
@@ -95,8 +95,7 @@ public:
void postDecStrong();
protected:
- Layer(RenderState& renderState, Api api, sk_sp<SkColorFilter>, int alpha,
- SkBlendMode mode);
+ Layer(RenderState& renderState, Api api, sk_sp<SkColorFilter>, int alpha, SkBlendMode mode);
RenderState& mRenderState;
diff --git a/libs/hwui/LayerBuilder.cpp b/libs/hwui/LayerBuilder.cpp
deleted file mode 100644
index 15ede4ca148a..000000000000
--- a/libs/hwui/LayerBuilder.cpp
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "LayerBuilder.h"
-
-#include "BakedOpState.h"
-#include "RenderNode.h"
-#include "utils/PaintUtils.h"
-#include "utils/TraceUtils.h"
-
-#include <utils/TypeHelpers.h>
-
-namespace android {
-namespace uirenderer {
-
-class BatchBase {
-public:
- BatchBase(batchid_t batchId, BakedOpState* op, bool merging)
- : mBatchId(batchId), mMerging(merging) {
- mBounds = op->computedState.clippedBounds;
- mOps.push_back(op);
- }
-
- bool intersects(const Rect& rect) const {
- if (!rect.intersects(mBounds)) return false;
-
- for (const BakedOpState* op : mOps) {
- if (rect.intersects(op->computedState.clippedBounds)) {
- return true;
- }
- }
- return false;
- }
-
- batchid_t getBatchId() const { return mBatchId; }
- bool isMerging() const { return mMerging; }
-
- const std::vector<BakedOpState*>& getOps() const { return mOps; }
-
- void dump() const {
- ALOGD(" Batch %p, id %d, merging %d, count %d, bounds " RECT_STRING, this, mBatchId,
- mMerging, (int)mOps.size(), RECT_ARGS(mBounds));
- }
-
-protected:
- batchid_t mBatchId;
- Rect mBounds;
- std::vector<BakedOpState*> mOps;
- bool mMerging;
-};
-
-class OpBatch : public BatchBase {
-public:
- OpBatch(batchid_t batchId, BakedOpState* op) : BatchBase(batchId, op, false) {}
-
- void batchOp(BakedOpState* op) {
- mBounds.unionWith(op->computedState.clippedBounds);
- mOps.push_back(op);
- }
-};
-
-class MergingOpBatch : public BatchBase {
-public:
- MergingOpBatch(batchid_t batchId, BakedOpState* op)
- : BatchBase(batchId, op, true), mClipSideFlags(op->computedState.clipSideFlags) {}
-
- /*
- * Helper for determining if a new op can merge with a MergingDrawBatch based on their bounds
- * and clip side flags. Positive bounds delta means new bounds fit in old.
- */
- static inline bool checkSide(const int currentFlags, const int newFlags, const int side,
- float boundsDelta) {
- bool currentClipExists = currentFlags & side;
- bool newClipExists = newFlags & side;
-
- // if current is clipped, we must be able to fit new bounds in current
- if (boundsDelta > 0 && currentClipExists) return false;
-
- // if new is clipped, we must be able to fit current bounds in new
- if (boundsDelta < 0 && newClipExists) return false;
-
- return true;
- }
-
- static bool paintIsDefault(const SkPaint& paint) {
- return paint.getAlpha() == 255 && paint.getColorFilter() == nullptr &&
- paint.getShader() == nullptr;
- }
-
- static bool paintsAreEquivalent(const SkPaint& a, const SkPaint& b) {
- // Note: don't check color, since all currently mergeable ops can merge across colors
- return a.getAlpha() == b.getAlpha() && a.getColorFilter() == b.getColorFilter() &&
- a.getShader() == b.getShader();
- }
-
- /*
- * Checks if a (mergeable) op can be merged into this batch
- *
- * If true, the op's multiDraw must be guaranteed to handle both ops simultaneously, so it is
- * important to consider all paint attributes used in the draw calls in deciding both a) if an
- * op tries to merge at all, and b) if the op can merge with another set of ops
- *
- * False positives can lead to information from the paints of subsequent merged operations being
- * dropped, so we make simplifying qualifications on the ops that can merge, per op type.
- */
- bool canMergeWith(BakedOpState* op) const {
- bool isTextBatch =
- getBatchId() == OpBatchType::Text || getBatchId() == OpBatchType::ColorText;
-
- // Overlapping other operations is only allowed for text without shadow. For other ops,
- // multiDraw isn't guaranteed to overdraw correctly
- if (!isTextBatch || PaintUtils::hasTextShadow(op->op->paint)) {
- if (intersects(op->computedState.clippedBounds)) return false;
- }
-
- const BakedOpState* lhs = op;
- const BakedOpState* rhs = mOps[0];
-
- if (!MathUtils::areEqual(lhs->alpha, rhs->alpha)) return false;
-
- // Identical round rect clip state means both ops will clip in the same way, or not at all.
- // As the state objects are const, we can compare their pointers to determine mergeability
- if (lhs->roundRectClipState != rhs->roundRectClipState) return false;
-
- // Local masks prevent merge, since they're potentially in different coordinate spaces
- if (lhs->computedState.localProjectionPathMask ||
- rhs->computedState.localProjectionPathMask)
- return false;
-
- /* Clipping compatibility check
- *
- * Exploits the fact that if a op or batch is clipped on a side, its bounds will equal its
- * clip for that side.
- */
- const int currentFlags = mClipSideFlags;
- const int newFlags = op->computedState.clipSideFlags;
- if (currentFlags != OpClipSideFlags::None || newFlags != OpClipSideFlags::None) {
- const Rect& opBounds = op->computedState.clippedBounds;
- float boundsDelta = mBounds.left - opBounds.left;
- if (!checkSide(currentFlags, newFlags, OpClipSideFlags::Left, boundsDelta))
- return false;
- boundsDelta = mBounds.top - opBounds.top;
- if (!checkSide(currentFlags, newFlags, OpClipSideFlags::Top, boundsDelta)) return false;
-
- // right and bottom delta calculation reversed to account for direction
- boundsDelta = opBounds.right - mBounds.right;
- if (!checkSide(currentFlags, newFlags, OpClipSideFlags::Right, boundsDelta))
- return false;
- boundsDelta = opBounds.bottom - mBounds.bottom;
- if (!checkSide(currentFlags, newFlags, OpClipSideFlags::Bottom, boundsDelta))
- return false;
- }
-
- const SkPaint* newPaint = op->op->paint;
- const SkPaint* oldPaint = mOps[0]->op->paint;
-
- if (newPaint == oldPaint) {
- // if paints are equal, then modifiers + paint attribs don't need to be compared
- return true;
- } else if (newPaint && !oldPaint) {
- return paintIsDefault(*newPaint);
- } else if (!newPaint && oldPaint) {
- return paintIsDefault(*oldPaint);
- }
- return paintsAreEquivalent(*newPaint, *oldPaint);
- }
-
- void mergeOp(BakedOpState* op) {
- mBounds.unionWith(op->computedState.clippedBounds);
- mOps.push_back(op);
-
- // Because a new op must have passed canMergeWith(), we know it's passed the clipping compat
- // check, and doesn't extend past a side of the clip that's in use by the merged batch.
- // Therefore it's safe to simply always merge flags, and use the bounds as the clip rect.
- mClipSideFlags |= op->computedState.clipSideFlags;
- }
-
- int getClipSideFlags() const { return mClipSideFlags; }
- const Rect& getClipRect() const { return mBounds; }
-
-private:
- int mClipSideFlags;
-};
-
-LayerBuilder::LayerBuilder(uint32_t width, uint32_t height, const Rect& repaintRect,
- const BeginLayerOp* beginLayerOp, RenderNode* renderNode)
- : width(width)
- , height(height)
- , repaintRect(repaintRect)
- , repaintClip(repaintRect)
- , offscreenBuffer(renderNode ? renderNode->getLayer() : nullptr)
- , beginLayerOp(beginLayerOp)
- , renderNode(renderNode) {}
-
-// iterate back toward target to see if anything drawn since should overlap the new op
-// if no target, merging ops still iterate to find similar batch to insert after
-void LayerBuilder::locateInsertIndex(int batchId, const Rect& clippedBounds,
- BatchBase** targetBatch, size_t* insertBatchIndex) const {
- for (int i = mBatches.size() - 1; i >= 0; i--) {
- BatchBase* overBatch = mBatches[i];
-
- if (overBatch == *targetBatch) break;
-
- // TODO: also consider shader shared between batch types
- if (batchId == overBatch->getBatchId()) {
- *insertBatchIndex = i + 1;
- if (!*targetBatch) break; // found insert position, quit
- }
-
- if (overBatch->intersects(clippedBounds)) {
- // NOTE: it may be possible to optimize for special cases where two operations
- // of the same batch/paint could swap order, such as with a non-mergeable
- // (clipped) and a mergeable text operation
- *targetBatch = nullptr;
- break;
- }
- }
-}
-
-void LayerBuilder::deferLayerClear(const Rect& rect) {
- mClearRects.push_back(rect);
-}
-
-void LayerBuilder::onDeferOp(LinearAllocator& allocator, const BakedOpState* bakedState) {
- if (bakedState->op->opId != RecordedOpId::CopyToLayerOp) {
- // First non-CopyToLayer, so stop stashing up layer clears for unclipped save layers,
- // and issue them together in one draw.
- flushLayerClears(allocator);
-
- if (CC_UNLIKELY(activeUnclippedSaveLayers.empty() &&
- bakedState->computedState.opaqueOverClippedBounds &&
- bakedState->computedState.clippedBounds.contains(repaintRect) &&
- !Properties::debugOverdraw)) {
- // discard all deferred drawing ops, since new one will occlude them
- clear();
- }
- }
-}
-
-void LayerBuilder::flushLayerClears(LinearAllocator& allocator) {
- if (CC_UNLIKELY(!mClearRects.empty())) {
- const int vertCount = mClearRects.size() * 4;
- // put the verts in the frame allocator, since
- // 1) SimpleRectsOps needs verts, not rects
- // 2) even if mClearRects stored verts, std::vectors will move their contents
- Vertex* const verts = (Vertex*)allocator.create_trivial_array<Vertex>(vertCount);
-
- Vertex* currentVert = verts;
- Rect bounds = mClearRects[0];
- for (auto&& rect : mClearRects) {
- bounds.unionWith(rect);
- Vertex::set(currentVert++, rect.left, rect.top);
- Vertex::set(currentVert++, rect.right, rect.top);
- Vertex::set(currentVert++, rect.left, rect.bottom);
- Vertex::set(currentVert++, rect.right, rect.bottom);
- }
- mClearRects.clear(); // discard rects before drawing so this method isn't reentrant
-
- // One or more unclipped saveLayers have been enqueued, with deferred clears.
- // Flush all of these clears with a single draw
- SkPaint* paint = allocator.create<SkPaint>();
- paint->setBlendMode(SkBlendMode::kClear);
- SimpleRectsOp* op = allocator.create_trivial<SimpleRectsOp>(
- bounds, Matrix4::identity(), nullptr, paint, verts, vertCount);
- BakedOpState* bakedState =
- BakedOpState::directConstruct(allocator, &repaintClip, bounds, *op);
- deferUnmergeableOp(allocator, bakedState, OpBatchType::Vertices);
- }
-}
-
-void LayerBuilder::deferUnmergeableOp(LinearAllocator& allocator, BakedOpState* op,
- batchid_t batchId) {
- onDeferOp(allocator, op);
- OpBatch* targetBatch = mBatchLookup[batchId];
-
- size_t insertBatchIndex = mBatches.size();
- if (targetBatch) {
- locateInsertIndex(batchId, op->computedState.clippedBounds, (BatchBase**)(&targetBatch),
- &insertBatchIndex);
- }
-
- if (targetBatch) {
- targetBatch->batchOp(op);
- } else {
- // new non-merging batch
- targetBatch = allocator.create<OpBatch>(batchId, op);
- mBatchLookup[batchId] = targetBatch;
- mBatches.insert(mBatches.begin() + insertBatchIndex, targetBatch);
- }
-}
-
-void LayerBuilder::deferMergeableOp(LinearAllocator& allocator, BakedOpState* op, batchid_t batchId,
- mergeid_t mergeId) {
- onDeferOp(allocator, op);
- MergingOpBatch* targetBatch = nullptr;
-
- // Try to merge with any existing batch with same mergeId
- auto getResult = mMergingBatchLookup[batchId].find(mergeId);
- if (getResult != mMergingBatchLookup[batchId].end()) {
- targetBatch = getResult->second;
- if (!targetBatch->canMergeWith(op)) {
- targetBatch = nullptr;
- }
- }
-
- size_t insertBatchIndex = mBatches.size();
- locateInsertIndex(batchId, op->computedState.clippedBounds, (BatchBase**)(&targetBatch),
- &insertBatchIndex);
-
- if (targetBatch) {
- targetBatch->mergeOp(op);
- } else {
- // new merging batch
- targetBatch = allocator.create<MergingOpBatch>(batchId, op);
- mMergingBatchLookup[batchId].insert(std::make_pair(mergeId, targetBatch));
-
- mBatches.insert(mBatches.begin() + insertBatchIndex, targetBatch);
- }
-}
-
-void LayerBuilder::replayBakedOpsImpl(void* arg, BakedOpReceiver* unmergedReceivers,
- MergedOpReceiver* mergedReceivers) const {
- if (renderNode) {
- ATRACE_FORMAT_BEGIN("Issue HW Layer DisplayList %s %ux%u", renderNode->getName(), width,
- height);
- } else {
- ATRACE_BEGIN("flush drawing commands");
- }
-
- for (const BatchBase* batch : mBatches) {
- size_t size = batch->getOps().size();
- if (size > 1 && batch->isMerging()) {
- int opId = batch->getOps()[0]->op->opId;
- const MergingOpBatch* mergingBatch = static_cast<const MergingOpBatch*>(batch);
- MergedBakedOpList data = {batch->getOps().data(), size,
- mergingBatch->getClipSideFlags(),
- mergingBatch->getClipRect()};
- mergedReceivers[opId](arg, data);
- } else {
- for (const BakedOpState* op : batch->getOps()) {
- unmergedReceivers[op->op->opId](arg, *op);
- }
- }
- }
- ATRACE_END();
-}
-
-void LayerBuilder::clear() {
- mBatches.clear();
- for (int i = 0; i < OpBatchType::Count; i++) {
- mBatchLookup[i] = nullptr;
- mMergingBatchLookup[i].clear();
- }
-}
-
-void LayerBuilder::dump() const {
- ALOGD("LayerBuilder %p, %ux%u buffer %p, blo %p, rn %p (%s)", this, width, height,
- offscreenBuffer, beginLayerOp, renderNode, renderNode ? renderNode->getName() : "-");
- for (const BatchBase* batch : mBatches) {
- batch->dump();
- }
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/LayerBuilder.h b/libs/hwui/LayerBuilder.h
deleted file mode 100644
index c799d48f7821..000000000000
--- a/libs/hwui/LayerBuilder.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "ClipArea.h"
-#include "Rect.h"
-#include "utils/Macros.h"
-
-#include <unordered_map>
-#include <vector>
-
-struct SkRect;
-
-namespace android {
-namespace uirenderer {
-
-class BakedOpState;
-struct BeginLayerOp;
-class BatchBase;
-class LinearAllocator;
-struct MergedBakedOpList;
-class MergingOpBatch;
-class OffscreenBuffer;
-class OpBatch;
-class RenderNode;
-
-typedef int batchid_t;
-typedef const void* mergeid_t;
-
-namespace OpBatchType {
-enum {
- Bitmap,
- MergedPatch,
- AlphaVertices,
- Vertices,
- AlphaMaskTexture,
- Text,
- ColorText,
- Shadow,
- TextureLayer,
- Functor,
- CopyToLayer,
- CopyFromLayer,
-
- Count // must be last
-};
-}
-
-typedef void (*BakedOpReceiver)(void*, const BakedOpState&);
-typedef void (*MergedOpReceiver)(void*, const MergedBakedOpList& opList);
-
-/**
- * Stores the deferred render operations and state used to compute ordering
- * for a single FBO/layer.
- */
-class LayerBuilder {
- // Prevent copy/assign because users may stash pointer to offscreenBuffer and viewportClip
- PREVENT_COPY_AND_ASSIGN(LayerBuilder);
-
-public:
- // Create LayerBuilder for Fbo0
- LayerBuilder(uint32_t width, uint32_t height, const Rect& repaintRect)
- : LayerBuilder(width, height, repaintRect, nullptr, nullptr){};
-
- // Create LayerBuilder for an offscreen layer, where beginLayerOp is present for a
- // saveLayer, renderNode is present for a HW layer.
- LayerBuilder(uint32_t width, uint32_t height, const Rect& repaintRect,
- const BeginLayerOp* beginLayerOp, RenderNode* renderNode);
-
- // iterate back toward target to see if anything drawn since should overlap the new op
- // if no target, merging ops still iterate to find similar batch to insert after
- void locateInsertIndex(int batchId, const Rect& clippedBounds, BatchBase** targetBatch,
- size_t* insertBatchIndex) const;
-
- void deferUnmergeableOp(LinearAllocator& allocator, BakedOpState* op, batchid_t batchId);
-
- // insertion point of a new batch, will hopefully be immediately after similar batch
- // (generally, should be similar shader)
- void deferMergeableOp(LinearAllocator& allocator, BakedOpState* op, batchid_t batchId,
- mergeid_t mergeId);
-
- void replayBakedOpsImpl(void* arg, BakedOpReceiver* receivers, MergedOpReceiver*) const;
-
- void deferLayerClear(const Rect& dstRect);
-
- bool empty() const { return mBatches.empty(); }
-
- void clear();
-
- void dump() const;
-
- const uint32_t width;
- const uint32_t height;
- const Rect repaintRect;
- const ClipRect repaintClip;
- OffscreenBuffer* offscreenBuffer;
- const BeginLayerOp* beginLayerOp;
- const RenderNode* renderNode;
-
- // list of deferred CopyFromLayer ops, to be deferred upon encountering EndUnclippedLayerOps
- std::vector<BakedOpState*> activeUnclippedSaveLayers;
-
-private:
- void onDeferOp(LinearAllocator& allocator, const BakedOpState* bakedState);
- void flushLayerClears(LinearAllocator& allocator);
-
- std::vector<BatchBase*> mBatches;
-
- /**
- * Maps the mergeid_t returned by an op's getMergeId() to the most recently seen
- * MergingDrawBatch of that id. These ids are unique per draw type and guaranteed to not
- * collide, which avoids the need to resolve mergeid collisions.
- */
- std::unordered_map<mergeid_t, MergingOpBatch*> mMergingBatchLookup[OpBatchType::Count];
-
- // Maps batch ids to the most recent *non-merging* batch of that id
- OpBatch* mBatchLookup[OpBatchType::Count] = {nullptr};
-
- std::vector<Rect> mClearRects;
-};
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/OpDumper.h b/libs/hwui/Lighting.h
index edbe381fcc72..d972c2181aea 100644
--- a/libs/hwui/OpDumper.h
+++ b/libs/hwui/Lighting.h
@@ -16,17 +16,22 @@
#pragma once
-#include <ostream>
+#include "Vector.h"
namespace android {
namespace uirenderer {
-struct RecordedOp;
+struct LightGeometry {
+ Vector3 center;
+ float radius;
+};
-class OpDumper {
-public:
- static void dump(const RecordedOp& op, std::ostream& output, int level = 0);
- static const char* opName(const RecordedOp& op);
+struct LightInfo {
+ LightInfo() : LightInfo(0, 0) {}
+ LightInfo(uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha)
+ : ambientShadowAlpha(ambientShadowAlpha), spotShadowAlpha(spotShadowAlpha) {}
+ uint8_t ambientShadowAlpha;
+ uint8_t spotShadowAlpha;
};
}; // namespace uirenderer
diff --git a/libs/hwui/NinePatchUtils.h b/libs/hwui/NinePatchUtils.h
index db9509fff378..082e95fb1440 100644
--- a/libs/hwui/NinePatchUtils.h
+++ b/libs/hwui/NinePatchUtils.h
@@ -53,9 +53,8 @@ static inline int NumDistinctRects(const SkCanvas::Lattice& lattice) {
return xRects * yRects;
}
-static inline void SetLatticeFlags(SkCanvas::Lattice* lattice,
- SkCanvas::Lattice::RectType* flags, int numFlags, const Res_png_9patch& chunk,
- SkColor* colors) {
+static inline void SetLatticeFlags(SkCanvas::Lattice* lattice, SkCanvas::Lattice::RectType* flags,
+ int numFlags, const Res_png_9patch& chunk, SkColor* colors) {
lattice->fRectTypes = flags;
lattice->fColors = colors;
sk_bzero(flags, numFlags * sizeof(SkCanvas::Lattice::RectType));
diff --git a/libs/hwui/OpDumper.cpp b/libs/hwui/OpDumper.cpp
deleted file mode 100644
index 5d2ccc77e82f..000000000000
--- a/libs/hwui/OpDumper.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "OpDumper.h"
-
-#include "ClipArea.h"
-#include "RecordedOp.h"
-
-namespace android {
-namespace uirenderer {
-
-#define STRINGIFY(n) #n,
-static const char* sOpNameLut[] = BUILD_FULL_OP_LUT(STRINGIFY);
-
-void OpDumper::dump(const RecordedOp& op, std::ostream& output, int level) {
- for (int i = 0; i < level; i++) {
- output << " ";
- }
-
- Rect localBounds(op.unmappedBounds);
- op.localMatrix.mapRect(localBounds);
- output << sOpNameLut[op.opId] << " " << localBounds;
-
- if (op.localClip &&
- (!op.localClip->rect.contains(localBounds) || op.localClip->intersectWithRoot)) {
- output << std::fixed << std::setprecision(0) << " clip=" << op.localClip->rect
- << " mode=" << (int)op.localClip->mode;
-
- if (op.localClip->intersectWithRoot) {
- output << " iwr";
- }
- }
-}
-
-const char* OpDumper::opName(const RecordedOp& op) {
- return sOpNameLut[op.opId];
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/OpenGLReadback.cpp b/libs/hwui/OpenGLReadback.cpp
deleted file mode 100644
index 11432d629650..000000000000
--- a/libs/hwui/OpenGLReadback.cpp
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "OpenGLReadback.h"
-
-#include "Caches.h"
-#include "GlLayer.h"
-#include "GlopBuilder.h"
-#include "Image.h"
-#include "renderstate/RenderState.h"
-#include "renderthread/EglManager.h"
-#include "utils/GLUtils.h"
-
-#include <GLES2/gl2.h>
-#include <gui/Surface.h>
-#include <ui/Fence.h>
-#include <ui/GraphicBuffer.h>
-
-namespace android {
-namespace uirenderer {
-
-CopyResult OpenGLReadback::copySurfaceInto(Surface& surface, const Rect& srcRect,
- SkBitmap* bitmap) {
- ATRACE_CALL();
- // Setup the source
- sp<GraphicBuffer> sourceBuffer;
- sp<Fence> sourceFence;
- Matrix4 texTransform;
- status_t err = surface.getLastQueuedBuffer(&sourceBuffer, &sourceFence, texTransform.data);
- texTransform.invalidateType();
- if (err != NO_ERROR) {
- ALOGW("Failed to get last queued buffer, error = %d", err);
- return CopyResult::UnknownError;
- }
- if (!sourceBuffer.get()) {
- ALOGW("Surface doesn't have any previously queued frames, nothing to readback from");
- return CopyResult::SourceEmpty;
- }
- if (sourceBuffer->getUsage() & GRALLOC_USAGE_PROTECTED) {
- ALOGW("Surface is protected, unable to copy from it");
- return CopyResult::SourceInvalid;
- }
- err = sourceFence->wait(500 /* ms */);
- if (err != NO_ERROR) {
- ALOGE("Timeout (500ms) exceeded waiting for buffer fence, abandoning readback attempt");
- return CopyResult::Timeout;
- }
-
- return copyGraphicBufferInto(sourceBuffer.get(), texTransform, srcRect, bitmap);
-}
-
-CopyResult OpenGLReadback::copyGraphicBufferInto(GraphicBuffer* graphicBuffer,
- Matrix4& texTransform, const Rect& srcRect,
- SkBitmap* bitmap) {
- mRenderThread.eglManager().initialize();
- // TODO: Can't use Image helper since it forces GL_TEXTURE_2D usage via
- // GL_OES_EGL_image, which doesn't work since we need samplerExternalOES
- // to be able to properly sample from the buffer.
-
- // Create the EGLImage object that maps the GraphicBuffer
- EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- EGLClientBuffer clientBuffer = (EGLClientBuffer)graphicBuffer->getNativeBuffer();
- EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
-
- EGLImageKHR sourceImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
- clientBuffer, attrs);
-
- if (sourceImage == EGL_NO_IMAGE_KHR) {
- ALOGW("eglCreateImageKHR failed (%#x)", eglGetError());
- return CopyResult::UnknownError;
- }
-
- uint32_t width = graphicBuffer->getWidth();
- uint32_t height = graphicBuffer->getHeight();
- CopyResult copyResult =
- copyImageInto(sourceImage, texTransform, width, height, srcRect, bitmap);
-
- // All we're flushing & finishing is the deletion of the texture since
- // copyImageInto already did a major flush & finish as an implicit
- // part of glReadPixels, so this shouldn't pose any major stalls.
- glFinish();
- eglDestroyImageKHR(display, sourceImage);
- return copyResult;
-}
-
-CopyResult OpenGLReadback::copyGraphicBufferInto(GraphicBuffer* graphicBuffer, SkBitmap* bitmap) {
- Rect srcRect;
- Matrix4 transform;
- transform.loadScale(1, -1, 1);
- transform.translate(0, -1);
- return copyGraphicBufferInto(graphicBuffer, transform, srcRect, bitmap);
-}
-
-static float sFlipVInit[16] = {
- 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
-};
-
-static const Matrix4 sFlipV(sFlipVInit);
-
-////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////
-
-inline CopyResult copyTextureInto(Caches& caches, RenderState& renderState, Texture& sourceTexture,
- const Matrix4& texTransform, const Rect& srcRect,
- SkBitmap* bitmap) {
- int destWidth = bitmap->width();
- int destHeight = bitmap->height();
- if (destWidth > caches.maxTextureSize || destHeight > caches.maxTextureSize) {
- ALOGW("Can't copy surface into bitmap, %dx%d exceeds max texture size %d", destWidth,
- destHeight, caches.maxTextureSize);
- return CopyResult::DestinationInvalid;
- }
-
- if (bitmap->colorType() == kRGBA_F16_SkColorType &&
- !caches.extensions().hasRenderableFloatTextures()) {
- ALOGW("Can't copy surface into bitmap, RGBA_F16 config is not supported");
- return CopyResult::DestinationInvalid;
- }
-
- GLuint fbo = renderState.createFramebuffer();
- if (!fbo) {
- ALOGW("Could not obtain an FBO");
- return CopyResult::UnknownError;
- }
-
- GLuint texture;
-
- GLenum format;
- GLenum internalFormat;
- GLenum type;
-
- switch (bitmap->colorType()) {
- case kAlpha_8_SkColorType:
- format = GL_ALPHA;
- internalFormat = GL_ALPHA;
- type = GL_UNSIGNED_BYTE;
- break;
- case kRGB_565_SkColorType:
- format = GL_RGB;
- internalFormat = GL_RGB;
- type = GL_UNSIGNED_SHORT_5_6_5;
- break;
- case kARGB_4444_SkColorType:
- format = GL_RGBA;
- internalFormat = GL_RGBA;
- type = GL_UNSIGNED_SHORT_4_4_4_4;
- break;
- case kRGBA_F16_SkColorType:
- format = GL_RGBA;
- internalFormat = GL_RGBA16F;
- type = GL_HALF_FLOAT;
- break;
- case kN32_SkColorType:
- default:
- format = GL_RGBA;
- internalFormat = GL_RGBA;
- type = GL_UNSIGNED_BYTE;
- break;
- }
-
- renderState.bindFramebuffer(fbo);
-
- // TODO: Use layerPool or something to get this maybe? But since we
- // need explicit format control we can't currently.
-
- // Setup the rendertarget
- glGenTextures(1, &texture);
- caches.textureState().activateTexture(0);
- caches.textureState().bindTexture(texture);
- glPixelStorei(GL_PACK_ALIGNMENT, bitmap->bytesPerPixel());
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, destWidth, destHeight, 0, format, type, nullptr);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
-
- {
- bool requiresFilter;
- // Draw & readback
- renderState.setViewport(destWidth, destHeight);
- renderState.scissor().setEnabled(false);
- renderState.blend().syncEnabled();
- renderState.stencil().disable();
-
- Matrix4 croppedTexTransform(texTransform);
- if (!srcRect.isEmpty()) {
- // We flipV to convert to 0,0 top-left for the srcRect
- // coordinates then flip back to 0,0 bottom-left for
- // GLES coordinates.
- croppedTexTransform.multiply(sFlipV);
- croppedTexTransform.translate(srcRect.left / sourceTexture.width(),
- srcRect.top / sourceTexture.height(), 0);
- croppedTexTransform.scale(srcRect.getWidth() / sourceTexture.width(),
- srcRect.getHeight() / sourceTexture.height(), 1);
- croppedTexTransform.multiply(sFlipV);
- requiresFilter = srcRect.getWidth() != (float)destWidth ||
- srcRect.getHeight() != (float)destHeight;
- } else {
- requiresFilter = sourceTexture.width() != (uint32_t)destWidth ||
- sourceTexture.height() != (uint32_t)destHeight;
- }
- Glop glop;
- GlopBuilder(renderState, caches, &glop)
- .setRoundRectClipState(nullptr)
- .setMeshTexturedUnitQuad(nullptr)
- .setFillExternalTexture(sourceTexture, croppedTexTransform, requiresFilter)
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewMapUnitToRect(Rect(destWidth, destHeight))
- .build();
- Matrix4 ortho;
- ortho.loadOrtho(destWidth, destHeight);
- renderState.render(glop, ortho, false);
-
- // TODO: We should convert to linear space when the target is RGBA16F
- glReadPixels(0, 0, bitmap->width(), bitmap->height(), format, type, bitmap->getPixels());
- bitmap->notifyPixelsChanged();
- }
-
- // Cleanup
- caches.textureState().deleteTexture(texture);
- renderState.deleteFramebuffer(fbo);
-
- GL_CHECKPOINT(MODERATE);
-
- return CopyResult::Success;
-}
-
-CopyResult OpenGLReadbackImpl::copyImageInto(EGLImageKHR eglImage, const Matrix4& imgTransform,
- int imgWidth, int imgHeight, const Rect& srcRect,
- SkBitmap* bitmap) {
- // If this is a 90 or 270 degree rotation we need to swap width/height
- // This is a fuzzy way of checking that.
- if (imgTransform[Matrix4::kSkewX] >= 0.5f || imgTransform[Matrix4::kSkewX] <= -0.5f) {
- std::swap(imgWidth, imgHeight);
- }
-
- Caches& caches = Caches::getInstance();
- GLuint sourceTexId;
- // Create a 2D texture to sample from the EGLImage
- glGenTextures(1, &sourceTexId);
- caches.textureState().bindTexture(GL_TEXTURE_EXTERNAL_OES, sourceTexId);
- glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, eglImage);
-
- GLenum status = GL_NO_ERROR;
- while ((status = glGetError()) != GL_NO_ERROR) {
- ALOGW("glEGLImageTargetTexture2DOES failed (%#x)", status);
- return CopyResult::UnknownError;
- }
-
- Texture sourceTexture(caches);
- sourceTexture.wrap(sourceTexId, imgWidth, imgHeight, 0, 0 /* total lie */,
- GL_TEXTURE_EXTERNAL_OES);
-
- CopyResult copyResult = copyTextureInto(caches, mRenderThread.renderState(), sourceTexture,
- imgTransform, srcRect, bitmap);
- sourceTexture.deleteTexture();
- return copyResult;
-}
-
-bool OpenGLReadbackImpl::copyLayerInto(renderthread::RenderThread& renderThread, GlLayer& layer,
- SkBitmap* bitmap) {
- if (!layer.isRenderable()) {
- // layer has never been updated by DeferredLayerUpdater, abort copy
- return false;
- }
-
- return CopyResult::Success == copyTextureInto(Caches::getInstance(), renderThread.renderState(),
- layer.getTexture(), layer.getTexTransform(),
- Rect(), bitmap);
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/Outline.h b/libs/hwui/Outline.h
index 4ddacc8a922d..f1c38031980e 100644
--- a/libs/hwui/Outline.h
+++ b/libs/hwui/Outline.h
@@ -42,9 +42,8 @@ public:
mBounds.set(left, top, right, bottom);
mRadius = radius;
-
// Reuse memory if previous outline was the same shape (rect or round rect).
- if ( mPath.countVerbs() > 10) {
+ if (mPath.countVerbs() > 10) {
mPath.reset();
} else {
mPath.rewind();
diff --git a/libs/hwui/Patch.cpp b/libs/hwui/Patch.cpp
deleted file mode 100644
index c243dad01f04..000000000000
--- a/libs/hwui/Patch.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include "Patch.h"
-
-#include "Caches.h"
-#include "Properties.h"
-#include "UvMapper.h"
-#include "utils/MathUtils.h"
-
-#include <utils/Log.h>
-#include <algorithm>
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Vertices management
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t Patch::getSize() const {
- return verticesCount * sizeof(TextureVertex);
-}
-
-Patch::Patch(const float bitmapWidth, const float bitmapHeight, float width, float height,
- const UvMapper& mapper, const Res_png_9patch* patch)
- : mColors(patch->getColors()) {
- int8_t emptyQuads = 0;
- const int8_t numColors = patch->numColors;
- if (uint8_t(numColors) < sizeof(uint32_t) * 4) {
- for (int8_t i = 0; i < numColors; i++) {
- if (mColors[i] == 0x0) {
- emptyQuads++;
- }
- }
- }
-
- hasEmptyQuads = emptyQuads > 0;
-
- uint32_t xCount = patch->numXDivs;
- uint32_t yCount = patch->numYDivs;
-
- uint32_t maxVertices = ((xCount + 1) * (yCount + 1) - emptyQuads) * 4;
- if (maxVertices == 0) return;
-
- vertices.reset(new TextureVertex[maxVertices]);
- TextureVertex* vertex = vertices.get();
-
- const int32_t* xDivs = patch->getXDivs();
- const int32_t* yDivs = patch->getYDivs();
-
- const uint32_t xStretchCount = (xCount + 1) >> 1;
- const uint32_t yStretchCount = (yCount + 1) >> 1;
-
- float stretchX = 0.0f;
- float stretchY = 0.0f;
-
- float rescaleX = 1.0f;
- float rescaleY = 1.0f;
-
- if (xStretchCount > 0) {
- uint32_t stretchSize = 0;
- for (uint32_t i = 1; i < xCount; i += 2) {
- stretchSize += xDivs[i] - xDivs[i - 1];
- }
- const float xStretchTex = stretchSize;
- const float fixed = bitmapWidth - stretchSize;
- const float xStretch = std::max(width - fixed, 0.0f);
- stretchX = xStretch / xStretchTex;
- rescaleX = fixed == 0.0f ? 0.0f : std::min(std::max(width, 0.0f) / fixed, 1.0f);
- }
-
- if (yStretchCount > 0) {
- uint32_t stretchSize = 0;
- for (uint32_t i = 1; i < yCount; i += 2) {
- stretchSize += yDivs[i] - yDivs[i - 1];
- }
- const float yStretchTex = stretchSize;
- const float fixed = bitmapHeight - stretchSize;
- const float yStretch = std::max(height - fixed, 0.0f);
- stretchY = yStretch / yStretchTex;
- rescaleY = fixed == 0.0f ? 0.0f : std::min(std::max(height, 0.0f) / fixed, 1.0f);
- }
-
- uint32_t quadCount = 0;
-
- float previousStepY = 0.0f;
-
- float y1 = 0.0f;
- float y2 = 0.0f;
- float v1 = 0.0f;
-
- mUvMapper = mapper;
-
- for (uint32_t i = 0; i < yCount; i++) {
- float stepY = yDivs[i];
- const float segment = stepY - previousStepY;
-
- if (i & 1) {
- y2 = y1 + floorf(segment * stretchY + 0.5f);
- } else {
- y2 = y1 + segment * rescaleY;
- }
-
- float vOffset = y1 == y2 ? 0.0f : 0.5 - (0.5 * segment / (y2 - y1));
- float v2 = std::max(0.0f, stepY - vOffset) / bitmapHeight;
- v1 += vOffset / bitmapHeight;
-
- if (stepY > 0.0f) {
- generateRow(xDivs, xCount, vertex, y1, y2, v1, v2, stretchX, rescaleX, width,
- bitmapWidth, quadCount);
- }
-
- y1 = y2;
- v1 = stepY / bitmapHeight;
-
- previousStepY = stepY;
- }
-
- if (previousStepY != bitmapHeight) {
- y2 = height;
- generateRow(xDivs, xCount, vertex, y1, y2, v1, 1.0f, stretchX, rescaleX, width, bitmapWidth,
- quadCount);
- }
-
- if (verticesCount != maxVertices) {
- std::unique_ptr<TextureVertex[]> reducedVertices(new TextureVertex[verticesCount]);
- memcpy(reducedVertices.get(), vertices.get(), verticesCount * sizeof(TextureVertex));
- vertices = std::move(reducedVertices);
- }
-}
-
-void Patch::generateRow(const int32_t* xDivs, uint32_t xCount, TextureVertex*& vertex, float y1,
- float y2, float v1, float v2, float stretchX, float rescaleX, float width,
- float bitmapWidth, uint32_t& quadCount) {
- float previousStepX = 0.0f;
-
- float x1 = 0.0f;
- float x2 = 0.0f;
- float u1 = 0.0f;
-
- // Generate the row quad by quad
- for (uint32_t i = 0; i < xCount; i++) {
- float stepX = xDivs[i];
- const float segment = stepX - previousStepX;
-
- if (i & 1) {
- x2 = x1 + floorf(segment * stretchX + 0.5f);
- } else {
- x2 = x1 + segment * rescaleX;
- }
-
- float uOffset = x1 == x2 ? 0.0f : 0.5 - (0.5 * segment / (x2 - x1));
- float u2 = std::max(0.0f, stepX - uOffset) / bitmapWidth;
- u1 += uOffset / bitmapWidth;
-
- if (stepX > 0.0f) {
- generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount);
- }
-
- x1 = x2;
- u1 = stepX / bitmapWidth;
-
- previousStepX = stepX;
- }
-
- if (previousStepX != bitmapWidth) {
- x2 = width;
- generateQuad(vertex, x1, y1, x2, y2, u1, v1, 1.0f, v2, quadCount);
- }
-}
-
-void Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2, float u1,
- float v1, float u2, float v2, uint32_t& quadCount) {
- const uint32_t oldQuadCount = quadCount;
- quadCount++;
-
- x1 = std::max(x1, 0.0f);
- x2 = std::max(x2, 0.0f);
- y1 = std::max(y1, 0.0f);
- y2 = std::max(y2, 0.0f);
-
- // Skip degenerate and transparent (empty) quads
- if ((mColors[oldQuadCount] == 0) || x1 >= x2 || y1 >= y2) {
-#if DEBUG_PATCHES_EMPTY_VERTICES
- PATCH_LOGD(" quad %d (empty)", oldQuadCount);
- PATCH_LOGD(" left, top = %.2f, %.2f\t\tu1, v1 = %.8f, %.8f", x1, y1, u1, v1);
- PATCH_LOGD(" right, bottom = %.2f, %.2f\t\tu2, v2 = %.8f, %.8f", x2, y2, u2, v2);
-#endif
- return;
- }
-
- // Record all non empty quads
- if (hasEmptyQuads) {
- quads.emplace_back(x1, y1, x2, y2);
- }
-
- mUvMapper.map(u1, v1, u2, v2);
-
- TextureVertex::set(vertex++, x1, y1, u1, v1);
- TextureVertex::set(vertex++, x2, y1, u2, v1);
- TextureVertex::set(vertex++, x1, y2, u1, v2);
- TextureVertex::set(vertex++, x2, y2, u2, v2);
-
- verticesCount += 4;
- indexCount += 6;
-
-#if DEBUG_PATCHES_VERTICES
- PATCH_LOGD(" quad %d", oldQuadCount);
- PATCH_LOGD(" left, top = %.2f, %.2f\t\tu1, v1 = %.8f, %.8f", x1, y1, u1, v1);
- PATCH_LOGD(" right, bottom = %.2f, %.2f\t\tu2, v2 = %.8f, %.8f", x2, y2, u2, v2);
-#endif
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/Patch.h b/libs/hwui/Patch.h
deleted file mode 100644
index a659ed227bec..000000000000
--- a/libs/hwui/Patch.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_PATCH_H
-#define ANDROID_HWUI_PATCH_H
-
-#include <sys/types.h>
-
-#include <GLES2/gl2.h>
-
-#include <androidfw/ResourceTypes.h>
-
-#include "Rect.h"
-#include "UvMapper.h"
-
-#include <vector>
-
-namespace android {
-namespace uirenderer {
-
-struct TextureVertex;
-
-///////////////////////////////////////////////////////////////////////////////
-// 9-patch structures
-///////////////////////////////////////////////////////////////////////////////
-
-class Patch {
-public:
- Patch(const float bitmapWidth, const float bitmapHeight, float width, float height,
- const UvMapper& mapper, const Res_png_9patch* patch);
-
- /**
- * Returns the size of this patch's mesh in bytes.
- */
- uint32_t getSize() const;
-
- std::unique_ptr<TextureVertex[]> vertices;
- uint32_t verticesCount = 0;
- uint32_t indexCount = 0;
- bool hasEmptyQuads = false;
- std::vector<Rect> quads;
-
- GLintptr positionOffset = 0;
- GLintptr textureOffset = 0;
-
-private:
- void generateRow(const int32_t* xDivs, uint32_t xCount, TextureVertex*& vertex, float y1,
- float y2, float v1, float v2, float stretchX, float rescaleX, float width,
- float bitmapWidth, uint32_t& quadCount);
- void generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2, float u1,
- float v1, float u2, float v2, uint32_t& quadCount);
-
- const uint32_t* mColors;
- UvMapper mUvMapper;
-}; // struct Patch
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_PATCH_H
diff --git a/libs/hwui/PatchCache.cpp b/libs/hwui/PatchCache.cpp
deleted file mode 100644
index 673d73c5475d..000000000000
--- a/libs/hwui/PatchCache.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <utils/JenkinsHash.h>
-#include <utils/Log.h>
-
-#include "Caches.h"
-#include "Patch.h"
-#include "PatchCache.h"
-#include "Properties.h"
-#include "renderstate/RenderState.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Constructors/destructor
-///////////////////////////////////////////////////////////////////////////////
-
-PatchCache::PatchCache(RenderState& renderState)
- : mRenderState(renderState)
- , mMaxSize(KB(128))
- , mSize(0)
- , mCache(LruCache<PatchDescription, Patch*>::kUnlimitedCapacity)
- , mMeshBuffer(0)
- , mFreeBlocks(nullptr) {}
-
-PatchCache::~PatchCache() {
- clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Caching
-///////////////////////////////////////////////////////////////////////////////
-
-hash_t PatchCache::PatchDescription::hash() const {
- uint32_t hash = JenkinsHashMix(0, android::hash_type(mPatch));
- hash = JenkinsHashMix(hash, mBitmapWidth);
- hash = JenkinsHashMix(hash, mBitmapHeight);
- hash = JenkinsHashMix(hash, mPixelWidth);
- hash = JenkinsHashMix(hash, mPixelHeight);
- return JenkinsHashWhiten(hash);
-}
-
-int PatchCache::PatchDescription::compare(const PatchCache::PatchDescription& lhs,
- const PatchCache::PatchDescription& rhs) {
- return memcmp(&lhs, &rhs, sizeof(PatchDescription));
-}
-
-void PatchCache::clear() {
- clearCache();
-
- if (mMeshBuffer) {
- mRenderState.meshState().deleteMeshBuffer(mMeshBuffer);
- mMeshBuffer = 0;
- mSize = 0;
- }
-}
-
-void PatchCache::clearCache() {
- LruCache<PatchDescription, Patch*>::Iterator i(mCache);
- while (i.next()) {
- delete i.value();
- }
- mCache.clear();
-
- BufferBlock* block = mFreeBlocks;
- while (block) {
- BufferBlock* next = block->next;
- delete block;
- block = next;
- }
- mFreeBlocks = nullptr;
-}
-
-void PatchCache::remove(Vector<patch_pair_t>& patchesToRemove, Res_png_9patch* patch) {
- LruCache<PatchDescription, Patch*>::Iterator i(mCache);
- while (i.next()) {
- const PatchDescription& key = i.key();
- if (key.getPatch() == patch) {
- patchesToRemove.push(patch_pair_t(&key, i.value()));
- }
- }
-}
-
-void PatchCache::removeDeferred(Res_png_9patch* patch) {
- Mutex::Autolock _l(mLock);
-
- // Assert that patch is not already garbage
- size_t count = mGarbage.size();
- for (size_t i = 0; i < count; i++) {
- if (patch == mGarbage[i]) {
- patch = nullptr;
- break;
- }
- }
- LOG_ALWAYS_FATAL_IF(patch == nullptr);
-
- mGarbage.push(patch);
-}
-
-void PatchCache::clearGarbage() {
- Vector<patch_pair_t> patchesToRemove;
-
- { // scope for the mutex
- Mutex::Autolock _l(mLock);
- size_t count = mGarbage.size();
- for (size_t i = 0; i < count; i++) {
- Res_png_9patch* patch = mGarbage[i];
- remove(patchesToRemove, patch);
- // A Res_png_9patch is actually an array of byte that's larger
- // than sizeof(Res_png_9patch). It must be freed as an array.
- delete[](int8_t*) patch;
- }
- mGarbage.clear();
- }
-
- // TODO: We could sort patchesToRemove by offset to merge
- // adjacent free blocks
- for (size_t i = 0; i < patchesToRemove.size(); i++) {
- const patch_pair_t& pair = patchesToRemove[i];
-
- // Release the patch and mark the space in the free list
- Patch* patch = pair.getSecond();
- BufferBlock* block = new BufferBlock(patch->positionOffset, patch->getSize());
- block->next = mFreeBlocks;
- mFreeBlocks = block;
-
- mSize -= patch->getSize();
-
- mCache.remove(*pair.getFirst());
- delete patch;
- }
-
-#if DEBUG_PATCHES
- if (patchesToRemove.size() > 0) {
- dumpFreeBlocks("Removed garbage");
- }
-#endif
-}
-
-void PatchCache::createVertexBuffer() {
- mRenderState.meshState().genOrUpdateMeshBuffer(&mMeshBuffer, mMaxSize, nullptr,
- GL_DYNAMIC_DRAW);
- mSize = 0;
- mFreeBlocks = new BufferBlock(0, mMaxSize);
-}
-
-/**
- * Sets the mesh's offsets and copies its associated vertices into
- * the mesh buffer (VBO).
- */
-void PatchCache::setupMesh(Patch* newMesh) {
- // This call ensures the VBO exists and that it is bound
- if (!mMeshBuffer) {
- createVertexBuffer();
- }
-
- // If we're running out of space, let's clear the entire cache
- uint32_t size = newMesh->getSize();
- if (mSize + size > mMaxSize) {
- clearCache();
- createVertexBuffer();
- }
-
- // Find a block where we can fit the mesh
- BufferBlock* previous = nullptr;
- BufferBlock* block = mFreeBlocks;
- while (block) {
- // The mesh fits
- if (block->size >= size) {
- break;
- }
- previous = block;
- block = block->next;
- }
-
- // We have enough space left in the buffer, but it's
- // too fragmented, let's clear the cache
- if (!block) {
- clearCache();
- createVertexBuffer();
- previous = nullptr;
- block = mFreeBlocks;
- }
-
- // Copy the 9patch mesh in the VBO
- newMesh->positionOffset = (GLintptr)(block->offset);
- newMesh->textureOffset = newMesh->positionOffset + kMeshTextureOffset;
-
- mRenderState.meshState().updateMeshBufferSubData(mMeshBuffer, newMesh->positionOffset, size,
- newMesh->vertices.get());
-
- // Remove the block since we've used it entirely
- if (block->size == size) {
- if (previous) {
- previous->next = block->next;
- } else {
- mFreeBlocks = block->next;
- }
- delete block;
- } else {
- // Resize the block now that it's occupied
- block->offset += size;
- block->size -= size;
- }
-
- mSize += size;
-}
-
-static const UvMapper sIdentity;
-
-const Patch* PatchCache::get(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
- const float pixelWidth, const float pixelHeight,
- const Res_png_9patch* patch) {
- const PatchDescription description(bitmapWidth, bitmapHeight, pixelWidth, pixelHeight, patch);
- const Patch* mesh = mCache.get(description);
-
- if (!mesh) {
- Patch* newMesh =
- new Patch(bitmapWidth, bitmapHeight, pixelWidth, pixelHeight, sIdentity, patch);
-
- if (newMesh->vertices) {
- setupMesh(newMesh);
- }
-
-#if DEBUG_PATCHES
- dumpFreeBlocks("Adding patch");
-#endif
-
- mCache.put(description, newMesh);
- return newMesh;
- }
-
- return mesh;
-}
-
-#if DEBUG_PATCHES
-void PatchCache::dumpFreeBlocks(const char* prefix) {
- String8 dump;
- BufferBlock* block = mFreeBlocks;
- while (block) {
- dump.appendFormat("->(%d, %d)", block->positionOffset, block->size);
- block = block->next;
- }
- ALOGD("%s: Free blocks%s", prefix, dump.string());
-}
-#endif
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/PatchCache.h b/libs/hwui/PatchCache.h
deleted file mode 100644
index 273c3f56f2cd..000000000000
--- a/libs/hwui/PatchCache.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <GLES2/gl2.h>
-
-#include <utils/LruCache.h>
-
-#include <androidfw/ResourceTypes.h>
-
-#include "Debug.h"
-#include "utils/Pair.h"
-
-namespace android {
-namespace uirenderer {
-
-class Patch;
-
-///////////////////////////////////////////////////////////////////////////////
-// Defines
-///////////////////////////////////////////////////////////////////////////////
-
-// Debug
-#if DEBUG_PATCHES
-#define PATCH_LOGD(...) ALOGD(__VA_ARGS__)
-#else
-#define PATCH_LOGD(...)
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache
-///////////////////////////////////////////////////////////////////////////////
-
-class Caches;
-class RenderState;
-
-class PatchCache {
-public:
- explicit PatchCache(RenderState& renderState);
- ~PatchCache();
-
- const Patch* get(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
- const float pixelWidth, const float pixelHeight, const Res_png_9patch* patch);
- void clear();
-
- uint32_t getSize() const { return mSize; }
-
- uint32_t getMaxSize() const { return mMaxSize; }
-
- GLuint getMeshBuffer() const { return mMeshBuffer; }
-
- /**
- * Removes the entries associated with the specified 9-patch. This is meant
- * to be called from threads that are not the EGL context thread (GC thread
- * on the VM side for instance.)
- */
- void removeDeferred(Res_png_9patch* patch);
-
- /**
- * Process deferred removals.
- */
- void clearGarbage();
-
-private:
- struct PatchDescription {
- PatchDescription()
- : mPatch(nullptr)
- , mBitmapWidth(0)
- , mBitmapHeight(0)
- , mPixelWidth(0)
- , mPixelHeight(0) {}
-
- PatchDescription(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
- const float pixelWidth, const float pixelHeight,
- const Res_png_9patch* patch)
- : mPatch(patch)
- , mBitmapWidth(bitmapWidth)
- , mBitmapHeight(bitmapHeight)
- , mPixelWidth(pixelWidth)
- , mPixelHeight(pixelHeight) {}
-
- hash_t hash() const;
-
- const Res_png_9patch* getPatch() const { return mPatch; }
-
- static int compare(const PatchDescription& lhs, const PatchDescription& rhs);
-
- bool operator==(const PatchDescription& other) const { return compare(*this, other) == 0; }
-
- bool operator!=(const PatchDescription& other) const { return compare(*this, other) != 0; }
-
- friend inline int strictly_order_type(const PatchDescription& lhs,
- const PatchDescription& rhs) {
- return PatchDescription::compare(lhs, rhs) < 0;
- }
-
- friend inline int compare_type(const PatchDescription& lhs, const PatchDescription& rhs) {
- return PatchDescription::compare(lhs, rhs);
- }
-
- friend inline hash_t hash_type(const PatchDescription& entry) { return entry.hash(); }
-
- private:
- const Res_png_9patch* mPatch;
- uint32_t mBitmapWidth;
- uint32_t mBitmapHeight;
- float mPixelWidth;
- float mPixelHeight;
-
- }; // struct PatchDescription
-
- /**
- * A buffer block represents an empty range in the mesh buffer
- * that can be used to store vertices.
- *
- * The patch cache maintains a linked-list of buffer blocks
- * to track available regions of memory in the VBO.
- */
- struct BufferBlock {
- BufferBlock(uint32_t offset, uint32_t size) : offset(offset), size(size), next(nullptr) {}
-
- uint32_t offset;
- uint32_t size;
-
- BufferBlock* next;
- }; // struct BufferBlock
-
- typedef Pair<const PatchDescription*, Patch*> patch_pair_t;
-
- void clearCache();
- void createVertexBuffer();
-
- void setupMesh(Patch* newMesh);
-
- void remove(Vector<patch_pair_t>& patchesToRemove, Res_png_9patch* patch);
-
-#if DEBUG_PATCHES
- void dumpFreeBlocks(const char* prefix);
-#endif
-
- RenderState& mRenderState;
- const uint32_t mMaxSize;
- uint32_t mSize;
-
- LruCache<PatchDescription, Patch*> mCache;
-
- GLuint mMeshBuffer;
- // First available free block inside the mesh buffer
- BufferBlock* mFreeBlocks;
-
- // Garbage tracking, required to handle GC events on the VM side
- Vector<Res_png_9patch*> mGarbage;
- mutable Mutex mLock;
-}; // class PatchCache
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp
deleted file mode 100644
index e67c5bddd354..000000000000
--- a/libs/hwui/PathCache.cpp
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include <SkBitmap.h>
-#include <SkCanvas.h>
-#include <SkColor.h>
-#include <SkColorFilter.h>
-#include <SkMaskFilter.h>
-#include <SkPaint.h>
-#include <SkPath.h>
-#include <SkPathEffect.h>
-#include <SkRect.h>
-
-#include <utils/JenkinsHash.h>
-#include <utils/Trace.h>
-
-#include "Caches.h"
-#include "PathCache.h"
-
-#include "thread/Signal.h"
-#include "thread/TaskProcessor.h"
-
-#include <cutils/properties.h>
-
-namespace android {
-namespace uirenderer {
-
-static constexpr size_t PATH_CACHE_COUNT_LIMIT = 256;
-
-template <class T>
-static bool compareWidthHeight(const T& lhs, const T& rhs) {
- return (lhs.mWidth == rhs.mWidth) && (lhs.mHeight == rhs.mHeight);
-}
-
-static bool compareRoundRects(const PathDescription::Shape::RoundRect& lhs,
- const PathDescription::Shape::RoundRect& rhs) {
- return compareWidthHeight(lhs, rhs) && lhs.mRx == rhs.mRx && lhs.mRy == rhs.mRy;
-}
-
-static bool compareArcs(const PathDescription::Shape::Arc& lhs,
- const PathDescription::Shape::Arc& rhs) {
- return compareWidthHeight(lhs, rhs) && lhs.mStartAngle == rhs.mStartAngle &&
- lhs.mSweepAngle == rhs.mSweepAngle && lhs.mUseCenter == rhs.mUseCenter;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache entries
-///////////////////////////////////////////////////////////////////////////////
-
-PathDescription::PathDescription()
- : type(ShapeType::None)
- , join(SkPaint::kDefault_Join)
- , cap(SkPaint::kDefault_Cap)
- , style(SkPaint::kFill_Style)
- , miter(4.0f)
- , strokeWidth(1.0f)
- , pathEffect(nullptr) {
- // Shape bits should be set to zeroes, because they are used for hash calculation.
- memset(&shape, 0, sizeof(Shape));
-}
-
-PathDescription::PathDescription(ShapeType type, const SkPaint* paint)
- : type(type)
- , join(paint->getStrokeJoin())
- , cap(paint->getStrokeCap())
- , style(paint->getStyle())
- , miter(paint->getStrokeMiter())
- , strokeWidth(paint->getStrokeWidth())
- , pathEffect(paint->getPathEffect()) {
- // Shape bits should be set to zeroes, because they are used for hash calculation.
- memset(&shape, 0, sizeof(Shape));
-}
-
-hash_t PathDescription::hash() const {
- uint32_t hash = JenkinsHashMix(0, static_cast<int>(type));
- hash = JenkinsHashMix(hash, join);
- hash = JenkinsHashMix(hash, cap);
- hash = JenkinsHashMix(hash, style);
- hash = JenkinsHashMix(hash, android::hash_type(miter));
- hash = JenkinsHashMix(hash, android::hash_type(strokeWidth));
- hash = JenkinsHashMix(hash, android::hash_type(pathEffect));
- hash = JenkinsHashMixBytes(hash, (uint8_t*)&shape, sizeof(Shape));
- return JenkinsHashWhiten(hash);
-}
-
-bool PathDescription::operator==(const PathDescription& rhs) const {
- if (type != rhs.type) return false;
- if (join != rhs.join) return false;
- if (cap != rhs.cap) return false;
- if (style != rhs.style) return false;
- if (miter != rhs.miter) return false;
- if (strokeWidth != rhs.strokeWidth) return false;
- if (pathEffect != rhs.pathEffect) return false;
- switch (type) {
- case ShapeType::None:
- return 0;
- case ShapeType::Rect:
- return compareWidthHeight(shape.rect, rhs.shape.rect);
- case ShapeType::RoundRect:
- return compareRoundRects(shape.roundRect, rhs.shape.roundRect);
- case ShapeType::Circle:
- return shape.circle.mRadius == rhs.shape.circle.mRadius;
- case ShapeType::Oval:
- return compareWidthHeight(shape.oval, rhs.shape.oval);
- case ShapeType::Arc:
- return compareArcs(shape.arc, rhs.shape.arc);
- case ShapeType::Path:
- return shape.path.mGenerationID == rhs.shape.path.mGenerationID;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Utilities
-///////////////////////////////////////////////////////////////////////////////
-
-static void computePathBounds(const SkPath* path, const SkPaint* paint, PathTexture* texture,
- uint32_t& width, uint32_t& height) {
- const SkRect& bounds = path->getBounds();
- const float pathWidth = std::max(bounds.width(), 1.0f);
- const float pathHeight = std::max(bounds.height(), 1.0f);
-
- texture->left = floorf(bounds.fLeft);
- texture->top = floorf(bounds.fTop);
-
- texture->offset = (int)floorf(std::max(paint->getStrokeWidth(), 1.0f) * 1.5f + 0.5f);
-
- width = uint32_t(pathWidth + texture->offset * 2.0 + 0.5);
- height = uint32_t(pathHeight + texture->offset * 2.0 + 0.5);
-}
-
-static void initPaint(SkPaint& paint) {
- // Make sure the paint is opaque, color, alpha, filter, etc.
- // will be applied later when compositing the alpha8 texture
- paint.setColor(SK_ColorBLACK);
- paint.setAlpha(255);
- paint.setColorFilter(nullptr);
- paint.setMaskFilter(nullptr);
- paint.setShader(nullptr);
- paint.setBlendMode(SkBlendMode::kSrc);
-}
-
-static sk_sp<Bitmap> drawPath(const SkPath* path, const SkPaint* paint, PathTexture* texture,
- uint32_t maxTextureSize) {
- uint32_t width, height;
- computePathBounds(path, paint, texture, width, height);
- if (width > maxTextureSize || height > maxTextureSize) {
- ALOGW("Shape too large to be rendered into a texture (%dx%d, max=%dx%d)", width, height,
- maxTextureSize, maxTextureSize);
- return nullptr;
- }
-
- sk_sp<Bitmap> bitmap = Bitmap::allocateHeapBitmap(SkImageInfo::MakeA8(width, height));
- SkPaint pathPaint(*paint);
- initPaint(pathPaint);
-
- SkBitmap skBitmap;
- bitmap->getSkBitmap(&skBitmap);
- skBitmap.eraseColor(0);
- SkCanvas canvas(skBitmap);
- canvas.translate(-texture->left + texture->offset, -texture->top + texture->offset);
- canvas.drawPath(*path, pathPaint);
- return bitmap;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache constructor/destructor
-///////////////////////////////////////////////////////////////////////////////
-
-PathCache::PathCache()
- : mCache(LruCache<PathDescription, PathTexture*>::kUnlimitedCapacity)
- , mSize(0)
- , mMaxSize(DeviceInfo::multiplyByResolution(4)) {
- mCache.setOnEntryRemovedListener(this);
- mMaxTextureSize = DeviceInfo::get()->maxTextureSize();
- mDebugEnabled = Properties::debugLevel & kDebugCaches;
-}
-
-PathCache::~PathCache() {
- mCache.clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Size management
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t PathCache::getSize() {
- return mSize;
-}
-
-uint32_t PathCache::getMaxSize() {
- return mMaxSize;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Callbacks
-///////////////////////////////////////////////////////////////////////////////
-
-void PathCache::operator()(PathDescription& entry, PathTexture*& texture) {
- removeTexture(texture);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Caching
-///////////////////////////////////////////////////////////////////////////////
-
-void PathCache::removeTexture(PathTexture* texture) {
- if (texture) {
- const uint32_t size = texture->width() * texture->height();
-
- // If there is a pending task we must wait for it to return
- // before attempting our cleanup
- const sp<PathTask>& task = texture->task();
- if (task != nullptr) {
- task->getResult();
- texture->clearTask();
- } else {
- // If there is a pending task, the path was not added
- // to the cache and the size wasn't increased
- if (size > mSize) {
- ALOGE("Removing path texture of size %d will leave "
- "the cache in an inconsistent state",
- size);
- }
- mSize -= size;
- }
-
- PATH_LOGD("PathCache::delete name, size, mSize = %d, %d, %d", texture->id, size, mSize);
- if (mDebugEnabled) {
- ALOGD("Shape deleted, size = %d", size);
- }
-
- texture->deleteTexture();
- delete texture;
- }
-}
-
-void PathCache::purgeCache(uint32_t width, uint32_t height) {
- const uint32_t size = width * height;
- // Don't even try to cache a bitmap that's bigger than the cache
- if (size < mMaxSize) {
- while (mSize + size > mMaxSize) {
- mCache.removeOldest();
- }
- }
-}
-
-void PathCache::trim() {
- while (mSize > mMaxSize || mCache.size() > PATH_CACHE_COUNT_LIMIT) {
- LOG_ALWAYS_FATAL_IF(!mCache.size(),
- "Inconsistent mSize! Ran out of items to remove!"
- " mSize = %u, mMaxSize = %u",
- mSize, mMaxSize);
- mCache.removeOldest();
- }
-}
-
-PathTexture* PathCache::addTexture(const PathDescription& entry, const SkPath* path,
- const SkPaint* paint) {
- ATRACE_NAME("Generate Path Texture");
-
- PathTexture* texture = new PathTexture(Caches::getInstance(), path->getGenerationID());
- sk_sp<Bitmap> bitmap(drawPath(path, paint, texture, mMaxTextureSize));
- if (!bitmap) {
- delete texture;
- return nullptr;
- }
-
- purgeCache(bitmap->width(), bitmap->height());
- generateTexture(entry, *bitmap, texture);
- return texture;
-}
-
-void PathCache::generateTexture(const PathDescription& entry, Bitmap& bitmap, PathTexture* texture,
- bool addToCache) {
- generateTexture(bitmap, texture);
-
- // Note here that we upload to a texture even if it's bigger than mMaxSize.
- // Such an entry in mCache will only be temporary, since it will be evicted
- // immediately on trim, or on any other Path entering the cache.
- uint32_t size = texture->width() * texture->height();
- mSize += size;
- PATH_LOGD("PathCache::get/create: name, size, mSize = %d, %d, %d", texture->id, size, mSize);
- if (mDebugEnabled) {
- ALOGD("Shape created, size = %d", size);
- }
- if (addToCache) {
- mCache.put(entry, texture);
- }
-}
-
-void PathCache::clear() {
- mCache.clear();
-}
-
-void PathCache::generateTexture(Bitmap& bitmap, Texture* texture) {
- ATRACE_NAME("Upload Path Texture");
- texture->upload(bitmap);
- texture->setFilter(GL_LINEAR);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Path precaching
-///////////////////////////////////////////////////////////////////////////////
-
-PathCache::PathProcessor::PathProcessor(Caches& caches)
- : TaskProcessor<sk_sp<Bitmap> >(&caches.tasks), mMaxTextureSize(caches.maxTextureSize) {}
-
-void PathCache::PathProcessor::onProcess(const sp<Task<sk_sp<Bitmap> > >& task) {
- PathTask* t = static_cast<PathTask*>(task.get());
- ATRACE_NAME("pathPrecache");
-
- t->setResult(drawPath(&t->path, &t->paint, t->texture, mMaxTextureSize));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Paths
-///////////////////////////////////////////////////////////////////////////////
-
-void PathCache::removeDeferred(const SkPath* path) {
- Mutex::Autolock l(mLock);
- mGarbage.push_back(path->getGenerationID());
-}
-
-void PathCache::clearGarbage() {
- Vector<PathDescription> pathsToRemove;
-
- { // scope for the mutex
- Mutex::Autolock l(mLock);
- for (const uint32_t generationID : mGarbage) {
- LruCache<PathDescription, PathTexture*>::Iterator iter(mCache);
- while (iter.next()) {
- const PathDescription& key = iter.key();
- if (key.type == ShapeType::Path && key.shape.path.mGenerationID == generationID) {
- pathsToRemove.push(key);
- }
- }
- }
- mGarbage.clear();
- }
-
- for (size_t i = 0; i < pathsToRemove.size(); i++) {
- mCache.remove(pathsToRemove.itemAt(i));
- }
-}
-
-PathTexture* PathCache::get(const SkPath* path, const SkPaint* paint) {
- PathDescription entry(ShapeType::Path, paint);
- entry.shape.path.mGenerationID = path->getGenerationID();
-
- PathTexture* texture = mCache.get(entry);
-
- if (!texture) {
- texture = addTexture(entry, path, paint);
- } else {
- // A bitmap is attached to the texture, this means we need to
- // upload it as a GL texture
- const sp<PathTask>& task = texture->task();
- if (task != nullptr) {
- // But we must first wait for the worker thread to be done
- // producing the bitmap, so let's wait
- sk_sp<Bitmap> bitmap = task->getResult();
- if (bitmap) {
- generateTexture(entry, *bitmap, texture, false);
- texture->clearTask();
- } else {
- texture->clearTask();
- texture = nullptr;
- mCache.remove(entry);
- }
- }
- }
-
- return texture;
-}
-
-void PathCache::remove(const SkPath* path, const SkPaint* paint) {
- PathDescription entry(ShapeType::Path, paint);
- entry.shape.path.mGenerationID = path->getGenerationID();
- mCache.remove(entry);
-}
-
-void PathCache::precache(const SkPath* path, const SkPaint* paint) {
- if (!Caches::getInstance().tasks.canRunTasks()) {
- return;
- }
-
- PathDescription entry(ShapeType::Path, paint);
- entry.shape.path.mGenerationID = path->getGenerationID();
-
- PathTexture* texture = mCache.get(entry);
-
- bool generate = false;
- if (!texture) {
- generate = true;
- }
-
- if (generate) {
- // It is important to specify the generation ID so we do not
- // attempt to precache the same path several times
- texture = new PathTexture(Caches::getInstance(), path->getGenerationID());
- sp<PathTask> task = new PathTask(path, paint, texture);
- texture->setTask(task);
-
- // During the precaching phase we insert path texture objects into
- // the cache that do not point to any GL texture. They are instead
- // treated as a task for the precaching worker thread. This is why
- // we do not check the cache limit when inserting these objects.
- // The conversion into GL texture will happen in get(), when a client
- // asks for a path texture. This is also when the cache limit will
- // be enforced.
- mCache.put(entry, texture);
-
- if (mProcessor == nullptr) {
- mProcessor = new PathProcessor(Caches::getInstance());
- }
- mProcessor->add(task);
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Rounded rects
-///////////////////////////////////////////////////////////////////////////////
-
-PathTexture* PathCache::getRoundRect(float width, float height, float rx, float ry,
- const SkPaint* paint) {
- PathDescription entry(ShapeType::RoundRect, paint);
- entry.shape.roundRect.mWidth = width;
- entry.shape.roundRect.mHeight = height;
- entry.shape.roundRect.mRx = rx;
- entry.shape.roundRect.mRy = ry;
-
- PathTexture* texture = get(entry);
-
- if (!texture) {
- SkPath path;
- SkRect r;
- r.set(0.0f, 0.0f, width, height);
- path.addRoundRect(r, rx, ry, SkPath::kCW_Direction);
-
- texture = addTexture(entry, &path, paint);
- }
-
- return texture;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Circles
-///////////////////////////////////////////////////////////////////////////////
-
-PathTexture* PathCache::getCircle(float radius, const SkPaint* paint) {
- PathDescription entry(ShapeType::Circle, paint);
- entry.shape.circle.mRadius = radius;
-
- PathTexture* texture = get(entry);
-
- if (!texture) {
- SkPath path;
- path.addCircle(radius, radius, radius, SkPath::kCW_Direction);
-
- texture = addTexture(entry, &path, paint);
- }
-
- return texture;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Ovals
-///////////////////////////////////////////////////////////////////////////////
-
-PathTexture* PathCache::getOval(float width, float height, const SkPaint* paint) {
- PathDescription entry(ShapeType::Oval, paint);
- entry.shape.oval.mWidth = width;
- entry.shape.oval.mHeight = height;
-
- PathTexture* texture = get(entry);
-
- if (!texture) {
- SkPath path;
- SkRect r;
- r.set(0.0f, 0.0f, width, height);
- path.addOval(r, SkPath::kCW_Direction);
-
- texture = addTexture(entry, &path, paint);
- }
-
- return texture;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Rects
-///////////////////////////////////////////////////////////////////////////////
-
-PathTexture* PathCache::getRect(float width, float height, const SkPaint* paint) {
- PathDescription entry(ShapeType::Rect, paint);
- entry.shape.rect.mWidth = width;
- entry.shape.rect.mHeight = height;
-
- PathTexture* texture = get(entry);
-
- if (!texture) {
- SkPath path;
- SkRect r;
- r.set(0.0f, 0.0f, width, height);
- path.addRect(r, SkPath::kCW_Direction);
-
- texture = addTexture(entry, &path, paint);
- }
-
- return texture;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Arcs
-///////////////////////////////////////////////////////////////////////////////
-
-PathTexture* PathCache::getArc(float width, float height, float startAngle, float sweepAngle,
- bool useCenter, const SkPaint* paint) {
- PathDescription entry(ShapeType::Arc, paint);
- entry.shape.arc.mWidth = width;
- entry.shape.arc.mHeight = height;
- entry.shape.arc.mStartAngle = startAngle;
- entry.shape.arc.mSweepAngle = sweepAngle;
- entry.shape.arc.mUseCenter = useCenter;
-
- PathTexture* texture = get(entry);
-
- if (!texture) {
- SkPath path;
- SkRect r;
- r.set(0.0f, 0.0f, width, height);
- if (useCenter) {
- path.moveTo(r.centerX(), r.centerY());
- }
- path.arcTo(r, startAngle, sweepAngle, !useCenter);
- if (useCenter) {
- path.close();
- }
-
- texture = addTexture(entry, &path, paint);
- }
-
- return texture;
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/PathCache.h b/libs/hwui/PathCache.h
deleted file mode 100644
index 28c8bbb8ca6e..000000000000
--- a/libs/hwui/PathCache.h
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#ifndef ANDROID_HWUI_PATH_CACHE_H
-#define ANDROID_HWUI_PATH_CACHE_H
-
-#include "Debug.h"
-#include "Texture.h"
-#include "hwui/Bitmap.h"
-#include "thread/Task.h"
-#include "thread/TaskProcessor.h"
-#include "utils/Macros.h"
-#include "utils/Pair.h"
-
-#include <GLES2/gl2.h>
-#include <SkPaint.h>
-#include <SkPath.h>
-#include <utils/LruCache.h>
-#include <utils/Mutex.h>
-
-#include <vector>
-
-class SkCanvas;
-class SkPaint;
-struct SkRect;
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-///////////////////////////////////////////////////////////////////////////////
-// Defines
-///////////////////////////////////////////////////////////////////////////////
-
-// Debug
-#if DEBUG_PATHS
-#define PATH_LOGD(...) ALOGD(__VA_ARGS__)
-#else
-#define PATH_LOGD(...)
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// Classes
-///////////////////////////////////////////////////////////////////////////////
-
-struct PathTexture;
-class PathTask : public Task<sk_sp<Bitmap>> {
-public:
- PathTask(const SkPath* path, const SkPaint* paint, PathTexture* texture)
- : path(*path), paint(*paint), texture(texture) {}
-
- // copied, since input path not guaranteed to survive for duration of task
- const SkPath path;
-
- // copied, since input paint may not be immutable
- const SkPaint paint;
- PathTexture* texture;
-};
-
-/**
- * Alpha texture used to represent a path.
- */
-struct PathTexture : public Texture {
- PathTexture(Caches& caches, int generation) : Texture(caches) { this->generation = generation; }
-
- ~PathTexture() { clearTask(); }
-
- /**
- * Left coordinate of the path bounds.
- */
- float left = 0;
- /**
- * Top coordinate of the path bounds.
- */
- float top = 0;
- /**
- * Offset to draw the path at the correct origin.
- */
- float offset = 0;
-
- sp<PathTask> task() const { return mTask; }
-
- void setTask(const sp<PathTask>& task) { mTask = task; }
-
- void clearTask() {
- if (mTask != nullptr) {
- mTask.clear();
- }
- }
-
-private:
- sp<PathTask> mTask;
-}; // struct PathTexture
-
-enum class ShapeType { None, Rect, RoundRect, Circle, Oval, Arc, Path };
-
-struct PathDescription {
- HASHABLE_TYPE(PathDescription);
- ShapeType type;
- SkPaint::Join join;
- SkPaint::Cap cap;
- SkPaint::Style style;
- float miter;
- float strokeWidth;
- SkPathEffect* pathEffect;
- union Shape {
- struct Path {
- uint32_t mGenerationID;
- } path;
- struct RoundRect {
- float mWidth;
- float mHeight;
- float mRx;
- float mRy;
- } roundRect;
- struct Circle {
- float mRadius;
- } circle;
- struct Oval {
- float mWidth;
- float mHeight;
- } oval;
- struct Rect {
- float mWidth;
- float mHeight;
- } rect;
- struct Arc {
- float mWidth;
- float mHeight;
- float mStartAngle;
- float mSweepAngle;
- bool mUseCenter;
- } arc;
- } shape;
-
- PathDescription();
- PathDescription(ShapeType shapeType, const SkPaint* paint);
-};
-
-/**
- * A simple LRU shape cache. The cache has a maximum size expressed in bytes.
- * Any texture added to the cache causing the cache to grow beyond the maximum
- * allowed size will also cause the oldest texture to be kicked out.
- */
-class PathCache : public OnEntryRemoved<PathDescription, PathTexture*> {
-public:
- PathCache();
- ~PathCache();
-
- /**
- * Used as a callback when an entry is removed from the cache.
- * Do not invoke directly.
- */
- void operator()(PathDescription& path, PathTexture*& texture) override;
-
- /**
- * Clears the cache. This causes all textures to be deleted.
- */
- void clear();
-
- /**
- * Returns the maximum size of the cache in bytes.
- */
- uint32_t getMaxSize();
- /**
- * Returns the current size of the cache in bytes.
- */
- uint32_t getSize();
-
- PathTexture* getRoundRect(float width, float height, float rx, float ry, const SkPaint* paint);
- PathTexture* getCircle(float radius, const SkPaint* paint);
- PathTexture* getOval(float width, float height, const SkPaint* paint);
- PathTexture* getRect(float width, float height, const SkPaint* paint);
- PathTexture* getArc(float width, float height, float startAngle, float sweepAngle,
- bool useCenter, const SkPaint* paint);
- PathTexture* get(const SkPath* path, const SkPaint* paint);
- void remove(const SkPath* path, const SkPaint* paint);
-
- /**
- * Removes the specified path. This is meant to be called from threads
- * that are not the EGL context thread.
- */
- ANDROID_API void removeDeferred(const SkPath* path);
- /**
- * Process deferred removals.
- */
- void clearGarbage();
- /**
- * Trims the contents of the cache, removing items until it's under its
- * specified limit.
- *
- * Trimming is used for caches that support pre-caching from a worker
- * thread. During pre-caching the maximum limit of the cache can be
- * exceeded for the duration of the frame. It is therefore required to
- * trim the cache at the end of the frame to keep the total amount of
- * memory used under control.
- */
- void trim();
-
- /**
- * Precaches the specified path using background threads.
- */
- void precache(const SkPath* path, const SkPaint* paint);
-
-private:
- PathTexture* addTexture(const PathDescription& entry, const SkPath* path, const SkPaint* paint);
-
- /**
- * Generates the texture from a bitmap into the specified texture structure.
- */
- void generateTexture(Bitmap& bitmap, Texture* texture);
- void generateTexture(const PathDescription& entry, Bitmap& bitmap, PathTexture* texture,
- bool addToCache = true);
-
- PathTexture* get(const PathDescription& entry) { return mCache.get(entry); }
-
- /**
- * Ensures there is enough space in the cache for a texture of the specified
- * dimensions.
- */
- void purgeCache(uint32_t width, uint32_t height);
-
- void removeTexture(PathTexture* texture);
-
- void init();
-
- class PathProcessor : public TaskProcessor<sk_sp<Bitmap>> {
- public:
- explicit PathProcessor(Caches& caches);
- ~PathProcessor() {}
-
- virtual void onProcess(const sp<Task<sk_sp<Bitmap>>>& task) override;
-
- private:
- uint32_t mMaxTextureSize;
- };
-
- LruCache<PathDescription, PathTexture*> mCache;
- uint32_t mSize;
- const uint32_t mMaxSize;
- GLuint mMaxTextureSize;
-
- bool mDebugEnabled;
-
- sp<PathProcessor> mProcessor;
-
- std::vector<uint32_t> mGarbage;
- mutable Mutex mLock;
-}; // class PathCache
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_PATH_CACHE_H
diff --git a/libs/hwui/PathParser.cpp b/libs/hwui/PathParser.cpp
index 47fcca92bcca..ad599e9ec316 100644
--- a/libs/hwui/PathParser.cpp
+++ b/libs/hwui/PathParser.cpp
@@ -210,9 +210,8 @@ void PathParser::validateVerbAndPoints(char verb, size_t points, PathParser::Par
if (numberOfPointsExpected > 0) {
result->failureMessage += "a multiple of ";
}
- result->failureMessage += std::to_string(numberOfPointsExpected)
- + " floats. However, " + std::to_string(points)
- + " float(s) are found. ";
+ result->failureMessage += std::to_string(numberOfPointsExpected) + " floats. However, " +
+ std::to_string(points) + " float(s) are found. ";
}
void PathParser::getPathDataFromAsciiString(PathData* data, ParseResult* result,
@@ -242,8 +241,8 @@ void PathParser::getPathDataFromAsciiString(PathData* data, ParseResult* result,
validateVerbAndPoints(pathStr[start], points.size(), result);
if (result->failureOccurred) {
// If either verb or points is not valid, return immediately.
- result->failureMessage += "Failure occurred at position " +
- std::to_string(start) + " of path: " + pathStr;
+ result->failureMessage += "Failure occurred at position " + std::to_string(start) +
+ " of path: " + pathStr;
return;
}
data->verbs.push_back(pathStr[start]);
@@ -257,8 +256,8 @@ void PathParser::getPathDataFromAsciiString(PathData* data, ParseResult* result,
validateVerbAndPoints(pathStr[start], 0, result);
if (result->failureOccurred) {
// If either verb or points is not valid, return immediately.
- result->failureMessage += "Failure occurred at position " +
- std::to_string(start) + " of path: " + pathStr;
+ result->failureMessage += "Failure occurred at position " + std::to_string(start) +
+ " of path: " + pathStr;
return;
}
data->verbs.push_back(pathStr[start]);
diff --git a/libs/hwui/PathTessellator.cpp b/libs/hwui/PathTessellator.cpp
deleted file mode 100644
index 973b1d14b77e..000000000000
--- a/libs/hwui/PathTessellator.cpp
+++ /dev/null
@@ -1,1069 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_NDEBUG 1
-
-#define VERTEX_DEBUG 0
-
-#if VERTEX_DEBUG
-#define DEBUG_DUMP_ALPHA_BUFFER() \
- for (unsigned int i = 0; i < vertexBuffer.getSize(); i++) { \
- ALOGD("point %d at %f %f, alpha %f", i, buffer[i].x, buffer[i].y, buffer[i].alpha); \
- }
-#define DEBUG_DUMP_BUFFER() \
- for (unsigned int i = 0; i < vertexBuffer.getSize(); i++) { \
- ALOGD("point %d at %f %f", i, buffer[i].x, buffer[i].y); \
- }
-#else
-#define DEBUG_DUMP_ALPHA_BUFFER()
-#define DEBUG_DUMP_BUFFER()
-#endif
-
-#include "PathTessellator.h"
-
-#include "Matrix.h"
-#include "Vector.h"
-#include "Vertex.h"
-#include "utils/MathUtils.h"
-
-#include <algorithm>
-
-#include <SkGeometry.h> // WARNING: Internal Skia Header
-#include <SkPaint.h>
-#include <SkPath.h>
-#include <SkPoint.h>
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <sys/types.h>
-
-#include <utils/Log.h>
-#include <utils/Trace.h>
-
-namespace android {
-namespace uirenderer {
-
-#define OUTLINE_REFINE_THRESHOLD 0.5f
-#define ROUND_CAP_THRESH 0.25f
-#define PI 3.1415926535897932f
-#define MAX_DEPTH 15
-
-/**
- * Extracts the x and y scale from the transform as positive values, and clamps them
- */
-void PathTessellator::extractTessellationScales(const Matrix4& transform, float* scaleX,
- float* scaleY) {
- if (CC_LIKELY(transform.isPureTranslate())) {
- *scaleX = 1.0f;
- *scaleY = 1.0f;
- } else {
- float m00 = transform.data[Matrix4::kScaleX];
- float m01 = transform.data[Matrix4::kSkewY];
- float m10 = transform.data[Matrix4::kSkewX];
- float m11 = transform.data[Matrix4::kScaleY];
- *scaleX = MathUtils::clampTessellationScale(sqrt(m00 * m00 + m01 * m01));
- *scaleY = MathUtils::clampTessellationScale(sqrt(m10 * m10 + m11 * m11));
- }
-}
-
-/**
- * Produces a pseudo-normal for a vertex, given the normals of the two incoming lines. If the offset
- * from each vertex in a perimeter is calculated, the resultant lines connecting the offset vertices
- * will be offset by 1.0
- *
- * Note that we can't add and normalize the two vectors, that would result in a rectangle having an
- * offset of (sqrt(2)/2, sqrt(2)/2) at each corner, instead of (1, 1)
- *
- * NOTE: assumes angles between normals 90 degrees or less
- */
-inline static Vector2 totalOffsetFromNormals(const Vector2& normalA, const Vector2& normalB) {
- return (normalA + normalB) / (1 + fabs(normalA.dot(normalB)));
-}
-
-/**
- * Structure used for storing useful information about the SkPaint and scale used for tessellating
- */
-struct PaintInfo {
-public:
- PaintInfo(const SkPaint* paint, const mat4& transform)
- : style(paint->getStyle())
- , cap(paint->getStrokeCap())
- , isAA(paint->isAntiAlias())
- , halfStrokeWidth(paint->getStrokeWidth() * 0.5f)
- , maxAlpha(1.0f) {
- // compute inverse scales
- if (CC_LIKELY(transform.isPureTranslate())) {
- inverseScaleX = 1.0f;
- inverseScaleY = 1.0f;
- } else {
- float scaleX, scaleY;
- PathTessellator::extractTessellationScales(transform, &scaleX, &scaleY);
- inverseScaleX = 1.0f / scaleX;
- inverseScaleY = 1.0f / scaleY;
- }
-
- if (isAA && halfStrokeWidth != 0 && inverseScaleX == inverseScaleY &&
- 2 * halfStrokeWidth < inverseScaleX) {
- // AA, with non-hairline stroke, width < 1 pixel. Scale alpha and treat as hairline.
- maxAlpha *= (2 * halfStrokeWidth) / inverseScaleX;
- halfStrokeWidth = 0.0f;
- }
- }
-
- SkPaint::Style style;
- SkPaint::Cap cap;
- bool isAA;
- float inverseScaleX;
- float inverseScaleY;
- float halfStrokeWidth;
- float maxAlpha;
-
- inline void scaleOffsetForStrokeWidth(Vector2& offset) const {
- if (halfStrokeWidth == 0.0f) {
- // hairline - compensate for scale
- offset.x *= 0.5f * inverseScaleX;
- offset.y *= 0.5f * inverseScaleY;
- } else {
- offset *= halfStrokeWidth;
- }
- }
-
- /**
- * NOTE: the input will not always be a normal, especially for sharp edges - it should be the
- * result of totalOffsetFromNormals (see documentation there)
- */
- inline Vector2 deriveAAOffset(const Vector2& offset) const {
- return (Vector2){offset.x * 0.5f * inverseScaleX, offset.y * 0.5f * inverseScaleY};
- }
-
- /**
- * Returns the number of cap divisions beyond the minimum 2 (kButt_Cap/kSquareCap will return 0)
- * Should only be used when stroking and drawing caps
- */
- inline int capExtraDivisions() const {
- if (cap == SkPaint::kRound_Cap) {
- // always use 2 points for hairline
- if (halfStrokeWidth == 0.0f) return 2;
-
- float threshold = std::min(inverseScaleX, inverseScaleY) * ROUND_CAP_THRESH;
- return MathUtils::divisionsNeededToApproximateArc(halfStrokeWidth, PI, threshold);
- }
- return 0;
- }
-
- /**
- * Outset the bounds of point data (for line endpoints or points) to account for stroke
- * geometry.
- *
- * bounds are in pre-scaled space.
- */
- void expandBoundsForStroke(Rect* bounds) const {
- if (halfStrokeWidth == 0) {
- // hairline, outset by (0.5f + fudge factor) in post-scaling space
- bounds->outset(fabs(inverseScaleX) * (0.5f + Vertex::GeometryFudgeFactor()),
- fabs(inverseScaleY) * (0.5f + Vertex::GeometryFudgeFactor()));
- } else {
- // non hairline, outset by half stroke width pre-scaled, and fudge factor post scaled
- bounds->outset(halfStrokeWidth + fabs(inverseScaleX) * Vertex::GeometryFudgeFactor(),
- halfStrokeWidth + fabs(inverseScaleY) * Vertex::GeometryFudgeFactor());
- }
- }
-};
-
-void getFillVerticesFromPerimeter(const std::vector<Vertex>& perimeter,
- VertexBuffer& vertexBuffer) {
- Vertex* buffer = vertexBuffer.alloc<Vertex>(perimeter.size());
-
- int currentIndex = 0;
- // zig zag between all previous points on the inside of the hull to create a
- // triangle strip that fills the hull
- int srcAindex = 0;
- int srcBindex = perimeter.size() - 1;
- while (srcAindex <= srcBindex) {
- buffer[currentIndex++] = perimeter[srcAindex];
- if (srcAindex == srcBindex) break;
- buffer[currentIndex++] = perimeter[srcBindex];
- srcAindex++;
- srcBindex--;
- }
-}
-
-/*
- * Fills a vertexBuffer with non-alpha vertices, zig-zagging at each perimeter point to create a
- * tri-strip as wide as the stroke.
- *
- * Uses an additional 2 vertices at the end to wrap around, closing the tri-strip
- * (for a total of perimeter.size() * 2 + 2 vertices)
- */
-void getStrokeVerticesFromPerimeter(const PaintInfo& paintInfo,
- const std::vector<Vertex>& perimeter,
- VertexBuffer& vertexBuffer) {
- Vertex* buffer = vertexBuffer.alloc<Vertex>(perimeter.size() * 2 + 2);
-
- int currentIndex = 0;
- const Vertex* last = &(perimeter[perimeter.size() - 1]);
- const Vertex* current = &(perimeter[0]);
- Vector2 lastNormal = {current->y - last->y, last->x - current->x};
- lastNormal.normalize();
- for (unsigned int i = 0; i < perimeter.size(); i++) {
- const Vertex* next = &(perimeter[i + 1 >= perimeter.size() ? 0 : i + 1]);
- Vector2 nextNormal = {next->y - current->y, current->x - next->x};
- nextNormal.normalize();
-
- Vector2 totalOffset = totalOffsetFromNormals(lastNormal, nextNormal);
- paintInfo.scaleOffsetForStrokeWidth(totalOffset);
-
- Vertex::set(&buffer[currentIndex++], current->x + totalOffset.x,
- current->y + totalOffset.y);
-
- Vertex::set(&buffer[currentIndex++], current->x - totalOffset.x,
- current->y - totalOffset.y);
-
- current = next;
- lastNormal = nextNormal;
- }
-
- // wrap around to beginning
- buffer[currentIndex++] = buffer[0];
- buffer[currentIndex++] = buffer[1];
-
- DEBUG_DUMP_BUFFER();
-}
-
-static inline void storeBeginEnd(const PaintInfo& paintInfo, const Vertex& center,
- const Vector2& normal, Vertex* buffer, int& currentIndex,
- bool begin) {
- Vector2 strokeOffset = normal;
- paintInfo.scaleOffsetForStrokeWidth(strokeOffset);
-
- Vector2 referencePoint = {center.x, center.y};
- if (paintInfo.cap == SkPaint::kSquare_Cap) {
- Vector2 rotated = {-strokeOffset.y, strokeOffset.x};
- referencePoint += rotated * (begin ? -1 : 1);
- }
-
- Vertex::set(&buffer[currentIndex++], referencePoint + strokeOffset);
- Vertex::set(&buffer[currentIndex++], referencePoint - strokeOffset);
-}
-
-/**
- * Fills a vertexBuffer with non-alpha vertices similar to getStrokeVerticesFromPerimeter, except:
- *
- * 1 - Doesn't need to wrap around, since the input vertices are unclosed
- *
- * 2 - can zig-zag across 'extra' vertices at either end, to create round caps
- */
-void getStrokeVerticesFromUnclosedVertices(const PaintInfo& paintInfo,
- const std::vector<Vertex>& vertices,
- VertexBuffer& vertexBuffer) {
- const int extra = paintInfo.capExtraDivisions();
- const int allocSize = (vertices.size() + extra) * 2;
- Vertex* buffer = vertexBuffer.alloc<Vertex>(allocSize);
-
- const int lastIndex = vertices.size() - 1;
- if (extra > 0) {
- // tessellate both round caps
- float beginTheta = atan2(-(vertices[0].x - vertices[1].x), vertices[0].y - vertices[1].y);
- float endTheta = atan2(-(vertices[lastIndex].x - vertices[lastIndex - 1].x),
- vertices[lastIndex].y - vertices[lastIndex - 1].y);
- const float dTheta = PI / (extra + 1);
-
- int capOffset;
- for (int i = 0; i < extra; i++) {
- if (i < extra / 2) {
- capOffset = extra - 2 * i - 1;
- } else {
- capOffset = 2 * i - extra;
- }
-
- beginTheta += dTheta;
- Vector2 beginRadialOffset = {cosf(beginTheta), sinf(beginTheta)};
- paintInfo.scaleOffsetForStrokeWidth(beginRadialOffset);
- Vertex::set(&buffer[capOffset], vertices[0].x + beginRadialOffset.x,
- vertices[0].y + beginRadialOffset.y);
-
- endTheta += dTheta;
- Vector2 endRadialOffset = {cosf(endTheta), sinf(endTheta)};
- paintInfo.scaleOffsetForStrokeWidth(endRadialOffset);
- Vertex::set(&buffer[allocSize - 1 - capOffset],
- vertices[lastIndex].x + endRadialOffset.x,
- vertices[lastIndex].y + endRadialOffset.y);
- }
- }
-
- int currentIndex = extra;
- const Vertex* last = &(vertices[0]);
- const Vertex* current = &(vertices[1]);
- Vector2 lastNormal = {current->y - last->y, last->x - current->x};
- lastNormal.normalize();
-
- storeBeginEnd(paintInfo, vertices[0], lastNormal, buffer, currentIndex, true);
-
- for (unsigned int i = 1; i < vertices.size() - 1; i++) {
- const Vertex* next = &(vertices[i + 1]);
- Vector2 nextNormal = {next->y - current->y, current->x - next->x};
- nextNormal.normalize();
-
- Vector2 strokeOffset = totalOffsetFromNormals(lastNormal, nextNormal);
- paintInfo.scaleOffsetForStrokeWidth(strokeOffset);
-
- Vector2 center = {current->x, current->y};
- Vertex::set(&buffer[currentIndex++], center + strokeOffset);
- Vertex::set(&buffer[currentIndex++], center - strokeOffset);
-
- current = next;
- lastNormal = nextNormal;
- }
-
- storeBeginEnd(paintInfo, vertices[lastIndex], lastNormal, buffer, currentIndex, false);
-
- DEBUG_DUMP_BUFFER();
-}
-
-/**
- * Populates a vertexBuffer with AlphaVertices to create an anti-aliased fill shape tessellation
- *
- * 1 - create the AA perimeter of unit width, by zig-zagging at each point around the perimeter of
- * the shape (using 2 * perimeter.size() vertices)
- *
- * 2 - wrap around to the beginning to complete the perimeter (2 vertices)
- *
- * 3 - zig zag back and forth inside the shape to fill it (using perimeter.size() vertices)
- */
-void getFillVerticesFromPerimeterAA(const PaintInfo& paintInfo,
- const std::vector<Vertex>& perimeter,
- VertexBuffer& vertexBuffer, float maxAlpha = 1.0f) {
- AlphaVertex* buffer = vertexBuffer.alloc<AlphaVertex>(perimeter.size() * 3 + 2);
-
- // generate alpha points - fill Alpha vertex gaps in between each point with
- // alpha 0 vertex, offset by a scaled normal.
- int currentIndex = 0;
- const Vertex* last = &(perimeter[perimeter.size() - 1]);
- const Vertex* current = &(perimeter[0]);
- Vector2 lastNormal = {current->y - last->y, last->x - current->x};
- lastNormal.normalize();
- for (unsigned int i = 0; i < perimeter.size(); i++) {
- const Vertex* next = &(perimeter[i + 1 >= perimeter.size() ? 0 : i + 1]);
- Vector2 nextNormal = {next->y - current->y, current->x - next->x};
- nextNormal.normalize();
-
- // AA point offset from original point is that point's normal, such that each side is offset
- // by .5 pixels
- Vector2 totalOffset =
- paintInfo.deriveAAOffset(totalOffsetFromNormals(lastNormal, nextNormal));
-
- AlphaVertex::set(&buffer[currentIndex++], current->x + totalOffset.x,
- current->y + totalOffset.y, 0.0f);
- AlphaVertex::set(&buffer[currentIndex++], current->x - totalOffset.x,
- current->y - totalOffset.y, maxAlpha);
-
- current = next;
- lastNormal = nextNormal;
- }
-
- // wrap around to beginning
- buffer[currentIndex++] = buffer[0];
- buffer[currentIndex++] = buffer[1];
-
- // zig zag between all previous points on the inside of the hull to create a
- // triangle strip that fills the hull, repeating the first inner point to
- // create degenerate tris to start inside path
- int srcAindex = 0;
- int srcBindex = perimeter.size() - 1;
- while (srcAindex <= srcBindex) {
- buffer[currentIndex++] = buffer[srcAindex * 2 + 1];
- if (srcAindex == srcBindex) break;
- buffer[currentIndex++] = buffer[srcBindex * 2 + 1];
- srcAindex++;
- srcBindex--;
- }
-
- DEBUG_DUMP_BUFFER();
-}
-
-/**
- * Stores geometry for a single, AA-perimeter (potentially rounded) cap
- *
- * For explanation of constants and general methodoloyg, see comments for
- * getStrokeVerticesFromUnclosedVerticesAA() below.
- */
-inline static void storeCapAA(const PaintInfo& paintInfo, const std::vector<Vertex>& vertices,
- AlphaVertex* buffer, bool isFirst, Vector2 normal, int offset) {
- const int extra = paintInfo.capExtraDivisions();
- const int extraOffset = (extra + 1) / 2;
- const int capIndex =
- isFirst ? 2 * offset + 6 + 2 * (extra + extraOffset) : offset + 2 + 2 * extraOffset;
- if (isFirst) normal *= -1;
-
- // TODO: this normal should be scaled by radialScale if extra != 0, see totalOffsetFromNormals()
- Vector2 AAOffset = paintInfo.deriveAAOffset(normal);
-
- Vector2 strokeOffset = normal;
- paintInfo.scaleOffsetForStrokeWidth(strokeOffset);
- Vector2 outerOffset = strokeOffset + AAOffset;
- Vector2 innerOffset = strokeOffset - AAOffset;
-
- Vector2 capAAOffset = {0, 0};
- if (paintInfo.cap != SkPaint::kRound_Cap) {
- // if the cap is square or butt, the inside primary cap vertices will be inset in two
- // directions - both normal to the stroke, and parallel to it.
- capAAOffset = (Vector2){-AAOffset.y, AAOffset.x};
- }
-
- // determine referencePoint, the center point for the 4 primary cap vertices
- const Vertex& point = isFirst ? vertices.front() : vertices.back();
- Vector2 referencePoint = {point.x, point.y};
- if (paintInfo.cap == SkPaint::kSquare_Cap) {
- // To account for square cap, move the primary cap vertices (that create the AA edge) by the
- // stroke offset vector (rotated to be parallel to the stroke)
- Vector2 rotated = {-strokeOffset.y, strokeOffset.x};
- referencePoint += rotated;
- }
-
- AlphaVertex::set(&buffer[capIndex + 0], referencePoint.x + outerOffset.x + capAAOffset.x,
- referencePoint.y + outerOffset.y + capAAOffset.y, 0.0f);
- AlphaVertex::set(&buffer[capIndex + 1], referencePoint.x + innerOffset.x - capAAOffset.x,
- referencePoint.y + innerOffset.y - capAAOffset.y, paintInfo.maxAlpha);
-
- bool isRound = paintInfo.cap == SkPaint::kRound_Cap;
-
- const int postCapIndex = (isRound && isFirst) ? (2 * extraOffset - 2) : capIndex + (2 * extra);
- AlphaVertex::set(&buffer[postCapIndex + 2], referencePoint.x - outerOffset.x + capAAOffset.x,
- referencePoint.y - outerOffset.y + capAAOffset.y, 0.0f);
- AlphaVertex::set(&buffer[postCapIndex + 3], referencePoint.x - innerOffset.x - capAAOffset.x,
- referencePoint.y - innerOffset.y - capAAOffset.y, paintInfo.maxAlpha);
-
- if (isRound) {
- const float dTheta = PI / (extra + 1);
- const float radialScale = 2.0f / (1 + cos(dTheta));
- float theta = atan2(normal.y, normal.x);
- int capPerimIndex = capIndex + 2;
-
- for (int i = 0; i < extra; i++) {
- theta += dTheta;
-
- Vector2 radialOffset = {cosf(theta), sinf(theta)};
-
- // scale to compensate for pinching at sharp angles, see totalOffsetFromNormals()
- radialOffset *= radialScale;
-
- AAOffset = paintInfo.deriveAAOffset(radialOffset);
- paintInfo.scaleOffsetForStrokeWidth(radialOffset);
- AlphaVertex::set(&buffer[capPerimIndex++],
- referencePoint.x + radialOffset.x + AAOffset.x,
- referencePoint.y + radialOffset.y + AAOffset.y, 0.0f);
- AlphaVertex::set(&buffer[capPerimIndex++],
- referencePoint.x + radialOffset.x - AAOffset.x,
- referencePoint.y + radialOffset.y - AAOffset.y, paintInfo.maxAlpha);
-
- if (isFirst && i == extra - extraOffset) {
- // copy most recent two points to first two points
- buffer[0] = buffer[capPerimIndex - 2];
- buffer[1] = buffer[capPerimIndex - 1];
-
- capPerimIndex = 2; // start writing the rest of the round cap at index 2
- }
- }
-
- if (isFirst) {
- const int startCapFillIndex = capIndex + 2 * (extra - extraOffset) + 4;
- int capFillIndex = startCapFillIndex;
- for (int i = 0; i < extra + 2; i += 2) {
- buffer[capFillIndex++] = buffer[1 + i];
- // TODO: to support odd numbers of divisions, break here on the last iteration
- buffer[capFillIndex++] = buffer[startCapFillIndex - 3 - i];
- }
- } else {
- int capFillIndex = 6 * vertices.size() + 2 + 6 * extra - (extra + 2);
- for (int i = 0; i < extra + 2; i += 2) {
- buffer[capFillIndex++] = buffer[capIndex + 1 + i];
- // TODO: to support odd numbers of divisions, break here on the last iteration
- buffer[capFillIndex++] = buffer[capIndex + 3 + 2 * extra - i];
- }
- }
- return;
- }
- if (isFirst) {
- buffer[0] = buffer[postCapIndex + 2];
- buffer[1] = buffer[postCapIndex + 3];
- buffer[postCapIndex + 4] = buffer[1]; // degenerate tris (the only two!)
- buffer[postCapIndex + 5] = buffer[postCapIndex + 1];
- } else {
- buffer[6 * vertices.size()] = buffer[postCapIndex + 1];
- buffer[6 * vertices.size() + 1] = buffer[postCapIndex + 3];
- }
-}
-
-/*
-the geometry for an aa, capped stroke consists of the following:
-
- # vertices | function
-----------------------------------------------------------------------
-a) 2 | Start AA perimeter
-b) 2, 2 * roundDivOff | First half of begin cap's perimeter
- |
- 2 * middlePts | 'Outer' or 'Top' AA perimeter half (between caps)
- |
-a) 4 | End cap's
-b) 2, 2 * roundDivs, 2 | AA perimeter
- |
- 2 * middlePts | 'Inner' or 'bottom' AA perimeter half
- |
-a) 6 | Begin cap's perimeter
-b) 2, 2*(rD - rDO + 1), | Last half of begin cap's perimeter
- roundDivs, 2 |
- |
- 2 * middlePts | Stroke's full opacity center strip
- |
-a) 2 | end stroke
-b) 2, roundDivs | (and end cap fill, for round)
-
-Notes:
-* rows starting with 'a)' denote the Butt or Square cap vertex use, 'b)' denote Round
-
-* 'middlePts' is (number of points in the unclosed input vertex list, minus 2) times two
-
-* 'roundDivs' or 'rD' is the number of extra vertices (beyond the minimum of 2) that define the
- round cap's shape, and is at least two. This will increase with cap size to sufficiently
- define the cap's level of tessellation.
-
-* 'roundDivOffset' or 'rDO' is the point about halfway along the start cap's round perimeter, where
- the stream of vertices for the AA perimeter starts. By starting and ending the perimeter at
- this offset, the fill of the stroke is drawn from this point with minimal extra vertices.
-
-This means the outer perimeter starts at:
- outerIndex = (2) OR (2 + 2 * roundDivOff)
-the inner perimeter (since it is filled in reverse) starts at:
- innerIndex = outerIndex + (4 * middlePts) + ((4) OR (4 + 2 * roundDivs)) - 1
-the stroke starts at:
- strokeIndex = innerIndex + 1 + ((6) OR (6 + 3 * roundDivs - 2 * roundDivOffset))
-
-The total needed allocated space is either:
- 2 + 4 + 6 + 2 + 3 * (2 * middlePts) = 14 + 6 * middlePts = 2 + 6 * pts
-or, for rounded caps:
- (2 + 2 * rDO) + (4 + 2 * rD) + (2 * (rD - rDO + 1)
- + roundDivs + 4) + (2 + roundDivs) + 3 * (2 * middlePts)
- = 14 + 6 * middlePts + 6 * roundDivs
- = 2 + 6 * pts + 6 * roundDivs
- */
-void getStrokeVerticesFromUnclosedVerticesAA(const PaintInfo& paintInfo,
- const std::vector<Vertex>& vertices,
- VertexBuffer& vertexBuffer) {
- const int extra = paintInfo.capExtraDivisions();
- const int allocSize = 6 * vertices.size() + 2 + 6 * extra;
-
- AlphaVertex* buffer = vertexBuffer.alloc<AlphaVertex>(allocSize);
-
- const int extraOffset = (extra + 1) / 2;
- int offset = 2 * (vertices.size() - 2);
- // there is no outer/inner here, using them for consistency with below approach
- int currentAAOuterIndex = 2 + 2 * extraOffset;
- int currentAAInnerIndex = currentAAOuterIndex + (2 * offset) + 3 + (2 * extra);
- int currentStrokeIndex = currentAAInnerIndex + 7 + (3 * extra - 2 * extraOffset);
-
- const Vertex* last = &(vertices[0]);
- const Vertex* current = &(vertices[1]);
- Vector2 lastNormal = {current->y - last->y, last->x - current->x};
- lastNormal.normalize();
-
- // TODO: use normal from bezier traversal for cap, instead of from vertices
- storeCapAA(paintInfo, vertices, buffer, true, lastNormal, offset);
-
- for (unsigned int i = 1; i < vertices.size() - 1; i++) {
- const Vertex* next = &(vertices[i + 1]);
- Vector2 nextNormal = {next->y - current->y, current->x - next->x};
- nextNormal.normalize();
-
- Vector2 totalOffset = totalOffsetFromNormals(lastNormal, nextNormal);
- Vector2 AAOffset = paintInfo.deriveAAOffset(totalOffset);
-
- Vector2 innerOffset = totalOffset;
- paintInfo.scaleOffsetForStrokeWidth(innerOffset);
- Vector2 outerOffset = innerOffset + AAOffset;
- innerOffset -= AAOffset;
-
- AlphaVertex::set(&buffer[currentAAOuterIndex++], current->x + outerOffset.x,
- current->y + outerOffset.y, 0.0f);
- AlphaVertex::set(&buffer[currentAAOuterIndex++], current->x + innerOffset.x,
- current->y + innerOffset.y, paintInfo.maxAlpha);
-
- AlphaVertex::set(&buffer[currentStrokeIndex++], current->x + innerOffset.x,
- current->y + innerOffset.y, paintInfo.maxAlpha);
- AlphaVertex::set(&buffer[currentStrokeIndex++], current->x - innerOffset.x,
- current->y - innerOffset.y, paintInfo.maxAlpha);
-
- AlphaVertex::set(&buffer[currentAAInnerIndex--], current->x - innerOffset.x,
- current->y - innerOffset.y, paintInfo.maxAlpha);
- AlphaVertex::set(&buffer[currentAAInnerIndex--], current->x - outerOffset.x,
- current->y - outerOffset.y, 0.0f);
-
- current = next;
- lastNormal = nextNormal;
- }
-
- // TODO: use normal from bezier traversal for cap, instead of from vertices
- storeCapAA(paintInfo, vertices, buffer, false, lastNormal, offset);
-
- DEBUG_DUMP_ALPHA_BUFFER();
-}
-
-void getStrokeVerticesFromPerimeterAA(const PaintInfo& paintInfo,
- const std::vector<Vertex>& perimeter,
- VertexBuffer& vertexBuffer) {
- AlphaVertex* buffer = vertexBuffer.alloc<AlphaVertex>(6 * perimeter.size() + 8);
-
- int offset = 2 * perimeter.size() + 3;
- int currentAAOuterIndex = 0;
- int currentStrokeIndex = offset;
- int currentAAInnerIndex = offset * 2;
-
- const Vertex* last = &(perimeter[perimeter.size() - 1]);
- const Vertex* current = &(perimeter[0]);
- Vector2 lastNormal = {current->y - last->y, last->x - current->x};
- lastNormal.normalize();
- for (unsigned int i = 0; i < perimeter.size(); i++) {
- const Vertex* next = &(perimeter[i + 1 >= perimeter.size() ? 0 : i + 1]);
- Vector2 nextNormal = {next->y - current->y, current->x - next->x};
- nextNormal.normalize();
-
- Vector2 totalOffset = totalOffsetFromNormals(lastNormal, nextNormal);
- Vector2 AAOffset = paintInfo.deriveAAOffset(totalOffset);
-
- Vector2 innerOffset = totalOffset;
- paintInfo.scaleOffsetForStrokeWidth(innerOffset);
- Vector2 outerOffset = innerOffset + AAOffset;
- innerOffset -= AAOffset;
-
- AlphaVertex::set(&buffer[currentAAOuterIndex++], current->x + outerOffset.x,
- current->y + outerOffset.y, 0.0f);
- AlphaVertex::set(&buffer[currentAAOuterIndex++], current->x + innerOffset.x,
- current->y + innerOffset.y, paintInfo.maxAlpha);
-
- AlphaVertex::set(&buffer[currentStrokeIndex++], current->x + innerOffset.x,
- current->y + innerOffset.y, paintInfo.maxAlpha);
- AlphaVertex::set(&buffer[currentStrokeIndex++], current->x - innerOffset.x,
- current->y - innerOffset.y, paintInfo.maxAlpha);
-
- AlphaVertex::set(&buffer[currentAAInnerIndex++], current->x - innerOffset.x,
- current->y - innerOffset.y, paintInfo.maxAlpha);
- AlphaVertex::set(&buffer[currentAAInnerIndex++], current->x - outerOffset.x,
- current->y - outerOffset.y, 0.0f);
-
- current = next;
- lastNormal = nextNormal;
- }
-
- // wrap each strip around to beginning, creating degenerate tris to bridge strips
- buffer[currentAAOuterIndex++] = buffer[0];
- buffer[currentAAOuterIndex++] = buffer[1];
- buffer[currentAAOuterIndex++] = buffer[1];
-
- buffer[currentStrokeIndex++] = buffer[offset];
- buffer[currentStrokeIndex++] = buffer[offset + 1];
- buffer[currentStrokeIndex++] = buffer[offset + 1];
-
- buffer[currentAAInnerIndex++] = buffer[2 * offset];
- buffer[currentAAInnerIndex++] = buffer[2 * offset + 1];
- // don't need to create last degenerate tri
-
- DEBUG_DUMP_ALPHA_BUFFER();
-}
-
-void PathTessellator::tessellatePath(const SkPath& path, const SkPaint* paint,
- const mat4& transform, VertexBuffer& vertexBuffer) {
- ATRACE_CALL();
-
- const PaintInfo paintInfo(paint, transform);
-
- std::vector<Vertex> tempVertices;
- float threshInvScaleX = paintInfo.inverseScaleX;
- float threshInvScaleY = paintInfo.inverseScaleY;
- if (paintInfo.style == SkPaint::kStroke_Style) {
- // alter the bezier recursion threshold values we calculate in order to compensate for
- // expansion done after the path vertices are found
- SkRect bounds = path.getBounds();
- if (!bounds.isEmpty()) {
- threshInvScaleX *= bounds.width() / (bounds.width() + paint->getStrokeWidth());
- threshInvScaleY *= bounds.height() / (bounds.height() + paint->getStrokeWidth());
- }
- }
-
- // force close if we're filling the path, since fill path expects closed perimeter.
- bool forceClose = paintInfo.style != SkPaint::kStroke_Style;
- PathApproximationInfo approximationInfo(threshInvScaleX, threshInvScaleY,
- OUTLINE_REFINE_THRESHOLD);
- bool wasClosed =
- approximatePathOutlineVertices(path, forceClose, approximationInfo, tempVertices);
-
- if (!tempVertices.size()) {
- // path was empty, return without allocating vertex buffer
- return;
- }
-
-#if VERTEX_DEBUG
- for (unsigned int i = 0; i < tempVertices.size(); i++) {
- ALOGD("orig path: point at %f %f", tempVertices[i].x, tempVertices[i].y);
- }
-#endif
-
- if (paintInfo.style == SkPaint::kStroke_Style) {
- if (!paintInfo.isAA) {
- if (wasClosed) {
- getStrokeVerticesFromPerimeter(paintInfo, tempVertices, vertexBuffer);
- } else {
- getStrokeVerticesFromUnclosedVertices(paintInfo, tempVertices, vertexBuffer);
- }
-
- } else {
- if (wasClosed) {
- getStrokeVerticesFromPerimeterAA(paintInfo, tempVertices, vertexBuffer);
- } else {
- getStrokeVerticesFromUnclosedVerticesAA(paintInfo, tempVertices, vertexBuffer);
- }
- }
- } else {
- // For kStrokeAndFill style, the path should be adjusted externally.
- // It will be treated as a fill here.
- if (!paintInfo.isAA) {
- getFillVerticesFromPerimeter(tempVertices, vertexBuffer);
- } else {
- getFillVerticesFromPerimeterAA(paintInfo, tempVertices, vertexBuffer);
- }
- }
-
- Rect bounds(path.getBounds());
- paintInfo.expandBoundsForStroke(&bounds);
- vertexBuffer.setBounds(bounds);
- vertexBuffer.setMeshFeatureFlags(paintInfo.isAA ? VertexBuffer::kAlpha : VertexBuffer::kNone);
-}
-
-template <class TYPE>
-static void instanceVertices(VertexBuffer& srcBuffer, VertexBuffer& dstBuffer, const float* points,
- int count, Rect& bounds) {
- bounds.set(points[0], points[1], points[0], points[1]);
-
- int numPoints = count / 2;
- int verticesPerPoint = srcBuffer.getVertexCount();
- dstBuffer.alloc<TYPE>(numPoints * verticesPerPoint + (numPoints - 1) * 2);
-
- for (int i = 0; i < count; i += 2) {
- bounds.expandToCover(points[i + 0], points[i + 1]);
- dstBuffer.copyInto<TYPE>(srcBuffer, points[i + 0], points[i + 1]);
- }
- dstBuffer.createDegenerateSeparators<TYPE>(verticesPerPoint);
-}
-
-void PathTessellator::tessellatePoints(const float* points, int count, const SkPaint* paint,
- const mat4& transform, VertexBuffer& vertexBuffer) {
- const PaintInfo paintInfo(paint, transform);
-
- // determine point shape
- SkPath path;
- float radius = paintInfo.halfStrokeWidth;
- if (radius == 0.0f) radius = 0.5f;
-
- if (paintInfo.cap == SkPaint::kRound_Cap) {
- path.addCircle(0, 0, radius);
- } else {
- path.addRect(-radius, -radius, radius, radius);
- }
-
- // calculate outline
- std::vector<Vertex> outlineVertices;
- PathApproximationInfo approximationInfo(paintInfo.inverseScaleX, paintInfo.inverseScaleY,
- OUTLINE_REFINE_THRESHOLD);
- approximatePathOutlineVertices(path, true, approximationInfo, outlineVertices);
-
- if (!outlineVertices.size()) return;
-
- Rect bounds;
- // tessellate, then duplicate outline across points
- VertexBuffer tempBuffer;
- if (!paintInfo.isAA) {
- getFillVerticesFromPerimeter(outlineVertices, tempBuffer);
- instanceVertices<Vertex>(tempBuffer, vertexBuffer, points, count, bounds);
- } else {
- // note: pass maxAlpha directly, since we want fill to be alpha modulated
- getFillVerticesFromPerimeterAA(paintInfo, outlineVertices, tempBuffer, paintInfo.maxAlpha);
- instanceVertices<AlphaVertex>(tempBuffer, vertexBuffer, points, count, bounds);
- }
-
- // expand bounds from vertex coords to pixel data
- paintInfo.expandBoundsForStroke(&bounds);
- vertexBuffer.setBounds(bounds);
- vertexBuffer.setMeshFeatureFlags(paintInfo.isAA ? VertexBuffer::kAlpha : VertexBuffer::kNone);
-}
-
-void PathTessellator::tessellateLines(const float* points, int count, const SkPaint* paint,
- const mat4& transform, VertexBuffer& vertexBuffer) {
- ATRACE_CALL();
- const PaintInfo paintInfo(paint, transform);
-
- const int extra = paintInfo.capExtraDivisions();
- int numLines = count / 4;
- int lineAllocSize;
- // pre-allocate space for lines in the buffer, and degenerate tris in between
- if (paintInfo.isAA) {
- lineAllocSize = 6 * (2) + 2 + 6 * extra;
- vertexBuffer.alloc<AlphaVertex>(numLines * lineAllocSize + (numLines - 1) * 2);
- } else {
- lineAllocSize = 2 * ((2) + extra);
- vertexBuffer.alloc<Vertex>(numLines * lineAllocSize + (numLines - 1) * 2);
- }
-
- std::vector<Vertex> tempVertices(2);
- Vertex* tempVerticesData = &tempVertices.front();
- Rect bounds;
- bounds.set(points[0], points[1], points[0], points[1]);
- for (int i = 0; i < count; i += 4) {
- Vertex::set(&(tempVerticesData[0]), points[i + 0], points[i + 1]);
- Vertex::set(&(tempVerticesData[1]), points[i + 2], points[i + 3]);
-
- if (paintInfo.isAA) {
- getStrokeVerticesFromUnclosedVerticesAA(paintInfo, tempVertices, vertexBuffer);
- } else {
- getStrokeVerticesFromUnclosedVertices(paintInfo, tempVertices, vertexBuffer);
- }
-
- // calculate bounds
- bounds.expandToCover(tempVerticesData[0].x, tempVerticesData[0].y);
- bounds.expandToCover(tempVerticesData[1].x, tempVerticesData[1].y);
- }
-
- // since multiple objects tessellated into buffer, separate them with degen tris
- if (paintInfo.isAA) {
- vertexBuffer.createDegenerateSeparators<AlphaVertex>(lineAllocSize);
- } else {
- vertexBuffer.createDegenerateSeparators<Vertex>(lineAllocSize);
- }
-
- // expand bounds from vertex coords to pixel data
- paintInfo.expandBoundsForStroke(&bounds);
- vertexBuffer.setBounds(bounds);
- vertexBuffer.setMeshFeatureFlags(paintInfo.isAA ? VertexBuffer::kAlpha : VertexBuffer::kNone);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Simple path line approximation
-///////////////////////////////////////////////////////////////////////////////
-
-bool PathTessellator::approximatePathOutlineVertices(const SkPath& path, float threshold,
- std::vector<Vertex>& outputVertices) {
- PathApproximationInfo approximationInfo(1.0f, 1.0f, threshold);
- return approximatePathOutlineVertices(path, true, approximationInfo, outputVertices);
-}
-
-class ClockwiseEnforcer {
-public:
- void addPoint(const SkPoint& point) {
- double x = point.x();
- double y = point.y();
-
- if (initialized) {
- sum += (x + lastX) * (y - lastY);
- } else {
- initialized = true;
- }
-
- lastX = x;
- lastY = y;
- }
- void reverseVectorIfNotClockwise(std::vector<Vertex>& vertices) {
- if (sum < 0) {
- // negative sum implies CounterClockwise
- const int size = vertices.size();
- for (int i = 0; i < size / 2; i++) {
- Vertex tmp = vertices[i];
- int k = size - 1 - i;
- vertices[i] = vertices[k];
- vertices[k] = tmp;
- }
- }
- }
-
-private:
- bool initialized = false;
- double lastX = 0;
- double lastY = 0;
- double sum = 0;
-};
-
-bool PathTessellator::approximatePathOutlineVertices(const SkPath& path, bool forceClose,
- const PathApproximationInfo& approximationInfo,
- std::vector<Vertex>& outputVertices) {
- ATRACE_CALL();
-
- // TODO: to support joins other than sharp miter, join vertices should be labelled in the
- // perimeter, or resolved into more vertices. Reconsider forceClose-ing in that case.
- SkPath::Iter iter(path, forceClose);
- SkPoint pts[4];
- SkPath::Verb v;
- ClockwiseEnforcer clockwiseEnforcer;
- while (SkPath::kDone_Verb != (v = iter.next(pts))) {
- switch (v) {
- case SkPath::kMove_Verb:
- outputVertices.push_back(Vertex{pts[0].x(), pts[0].y()});
- ALOGV("Move to pos %f %f", pts[0].x(), pts[0].y());
- clockwiseEnforcer.addPoint(pts[0]);
- break;
- case SkPath::kClose_Verb:
- ALOGV("Close at pos %f %f", pts[0].x(), pts[0].y());
- clockwiseEnforcer.addPoint(pts[0]);
- break;
- case SkPath::kLine_Verb:
- ALOGV("kLine_Verb %f %f -> %f %f", pts[0].x(), pts[0].y(), pts[1].x(), pts[1].y());
- outputVertices.push_back(Vertex{pts[1].x(), pts[1].y()});
- clockwiseEnforcer.addPoint(pts[1]);
- break;
- case SkPath::kQuad_Verb:
- ALOGV("kQuad_Verb");
- recursiveQuadraticBezierVertices(pts[0].x(), pts[0].y(), pts[2].x(), pts[2].y(),
- pts[1].x(), pts[1].y(), approximationInfo,
- outputVertices);
- clockwiseEnforcer.addPoint(pts[1]);
- clockwiseEnforcer.addPoint(pts[2]);
- break;
- case SkPath::kCubic_Verb:
- ALOGV("kCubic_Verb");
- recursiveCubicBezierVertices(pts[0].x(), pts[0].y(), pts[1].x(), pts[1].y(),
- pts[3].x(), pts[3].y(), pts[2].x(), pts[2].y(),
- approximationInfo, outputVertices);
- clockwiseEnforcer.addPoint(pts[1]);
- clockwiseEnforcer.addPoint(pts[2]);
- clockwiseEnforcer.addPoint(pts[3]);
- break;
- case SkPath::kConic_Verb: {
- ALOGV("kConic_Verb");
- SkAutoConicToQuads converter;
- const SkPoint* quads = converter.computeQuads(
- pts, iter.conicWeight(), approximationInfo.thresholdForConicQuads);
- for (int i = 0; i < converter.countQuads(); ++i) {
- const int offset = 2 * i;
- recursiveQuadraticBezierVertices(quads[offset].x(), quads[offset].y(),
- quads[offset + 2].x(), quads[offset + 2].y(),
- quads[offset + 1].x(), quads[offset + 1].y(),
- approximationInfo, outputVertices);
- }
- clockwiseEnforcer.addPoint(pts[1]);
- clockwiseEnforcer.addPoint(pts[2]);
- break;
- }
- default:
- static_assert(SkPath::kMove_Verb == 0 && SkPath::kLine_Verb == 1 &&
- SkPath::kQuad_Verb == 2 && SkPath::kConic_Verb == 3 &&
- SkPath::kCubic_Verb == 4 && SkPath::kClose_Verb == 5 &&
- SkPath::kDone_Verb == 6,
- "Path enum changed, new types may have been added");
- break;
- }
- }
-
- bool wasClosed = false;
- int size = outputVertices.size();
- if (size >= 2 && outputVertices[0].x == outputVertices[size - 1].x &&
- outputVertices[0].y == outputVertices[size - 1].y) {
- outputVertices.pop_back();
- wasClosed = true;
- }
-
- // ensure output vector is clockwise
- clockwiseEnforcer.reverseVectorIfNotClockwise(outputVertices);
- return wasClosed;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Bezier approximation
-//
-// All the inputs and outputs here are in path coordinates.
-// We convert the error threshold from screen coordinates into path coordinates.
-///////////////////////////////////////////////////////////////////////////////
-
-// Get a threshold in path coordinates, by scaling the thresholdSquared from screen coordinates.
-// TODO: Document the math behind this algorithm.
-static inline float getThreshold(const PathApproximationInfo& info, float dx, float dy) {
- // multiplying by sqrInvScaleY/X equivalent to multiplying in dimensional scale factors
- float scale = (dx * dx * info.sqrInvScaleY + dy * dy * info.sqrInvScaleX);
- return info.thresholdSquared * scale;
-}
-
-void PathTessellator::recursiveCubicBezierVertices(float p1x, float p1y, float c1x, float c1y,
- float p2x, float p2y, float c2x, float c2y,
- const PathApproximationInfo& approximationInfo,
- std::vector<Vertex>& outputVertices, int depth) {
- float dx = p2x - p1x;
- float dy = p2y - p1y;
- float d1 = fabs((c1x - p2x) * dy - (c1y - p2y) * dx);
- float d2 = fabs((c2x - p2x) * dy - (c2y - p2y) * dx);
- float d = d1 + d2;
-
- if (depth >= MAX_DEPTH || d * d <= getThreshold(approximationInfo, dx, dy)) {
- // below thresh, draw line by adding endpoint
- outputVertices.push_back(Vertex{p2x, p2y});
- } else {
- float p1c1x = (p1x + c1x) * 0.5f;
- float p1c1y = (p1y + c1y) * 0.5f;
- float p2c2x = (p2x + c2x) * 0.5f;
- float p2c2y = (p2y + c2y) * 0.5f;
-
- float c1c2x = (c1x + c2x) * 0.5f;
- float c1c2y = (c1y + c2y) * 0.5f;
-
- float p1c1c2x = (p1c1x + c1c2x) * 0.5f;
- float p1c1c2y = (p1c1y + c1c2y) * 0.5f;
-
- float p2c1c2x = (p2c2x + c1c2x) * 0.5f;
- float p2c1c2y = (p2c2y + c1c2y) * 0.5f;
-
- float mx = (p1c1c2x + p2c1c2x) * 0.5f;
- float my = (p1c1c2y + p2c1c2y) * 0.5f;
-
- recursiveCubicBezierVertices(p1x, p1y, p1c1x, p1c1y, mx, my, p1c1c2x, p1c1c2y,
- approximationInfo, outputVertices, depth + 1);
- recursiveCubicBezierVertices(mx, my, p2c1c2x, p2c1c2y, p2x, p2y, p2c2x, p2c2y,
- approximationInfo, outputVertices, depth + 1);
- }
-}
-
-void PathTessellator::recursiveQuadraticBezierVertices(
- float ax, float ay, float bx, float by, float cx, float cy,
- const PathApproximationInfo& approximationInfo, std::vector<Vertex>& outputVertices,
- int depth) {
- float dx = bx - ax;
- float dy = by - ay;
- // d is the cross product of vector (B-A) and (C-B).
- float d = (cx - bx) * dy - (cy - by) * dx;
-
- if (depth >= MAX_DEPTH || d * d <= getThreshold(approximationInfo, dx, dy)) {
- // below thresh, draw line by adding endpoint
- outputVertices.push_back(Vertex{bx, by});
- } else {
- float acx = (ax + cx) * 0.5f;
- float bcx = (bx + cx) * 0.5f;
- float acy = (ay + cy) * 0.5f;
- float bcy = (by + cy) * 0.5f;
-
- // midpoint
- float mx = (acx + bcx) * 0.5f;
- float my = (acy + bcy) * 0.5f;
-
- recursiveQuadraticBezierVertices(ax, ay, mx, my, acx, acy, approximationInfo,
- outputVertices, depth + 1);
- recursiveQuadraticBezierVertices(mx, my, bx, by, bcx, bcy, approximationInfo,
- outputVertices, depth + 1);
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/PathTessellator.h b/libs/hwui/PathTessellator.h
deleted file mode 100644
index ed268324b341..000000000000
--- a/libs/hwui/PathTessellator.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_HWUI_PATH_TESSELLATOR_H
-#define ANDROID_HWUI_PATH_TESSELLATOR_H
-
-#include "Matrix.h"
-#include "Rect.h"
-#include "Vertex.h"
-#include "VertexBuffer.h"
-
-#include <algorithm>
-#include <vector>
-
-class SkPath;
-class SkPaint;
-
-namespace android {
-namespace uirenderer {
-
-/**
- * Structure used for threshold values in outline path tessellation.
- *
- * TODO: PaintInfo should store one of this object, and initialized all values in constructor
- * depending on its type (point, line or path).
- */
-struct PathApproximationInfo {
- PathApproximationInfo(float invScaleX, float invScaleY, float pixelThreshold)
- : thresholdSquared(pixelThreshold * pixelThreshold)
- , sqrInvScaleX(invScaleX * invScaleX)
- , sqrInvScaleY(invScaleY * invScaleY)
- , thresholdForConicQuads(pixelThreshold * std::min(invScaleX, invScaleY) / 2.0f){};
-
- const float thresholdSquared;
- const float sqrInvScaleX;
- const float sqrInvScaleY;
- const float thresholdForConicQuads;
-};
-
-class PathTessellator {
-public:
- /**
- * Populates scaleX and scaleY with the 'tessellation scale' of the transform - the effective X
- * and Y scales that tessellation will take into account when generating the 1.0 pixel thick
- * ramp.
- *
- * Two instances of the same shape (size, paint, etc.) will only generate the same vertices if
- * their tessellation scales are equal.
- */
- static void extractTessellationScales(const Matrix4& transform, float* scaleX, float* scaleY);
-
- /**
- * Populates a VertexBuffer with a tessellated approximation of the input convex path, as a
- * single
- * triangle strip. Note: joins are not currently supported.
- *
- * @param path The path to be approximated
- * @param paint The paint the path will be drawn with, indicating AA, painting style
- * (stroke vs fill), stroke width, stroke cap & join style, etc.
- * @param transform The transform the path is to be drawn with, used to drive stretch-aware path
- * vertex approximation, and correct AA ramp offsetting.
- * @param vertexBuffer The output buffer
- */
- static void tessellatePath(const SkPath& path, const SkPaint* paint, const mat4& transform,
- VertexBuffer& vertexBuffer);
-
- /**
- * Populates a VertexBuffer with a tessellated approximation of points as a single triangle
- * strip (with degenerate tris separating), respecting the shape defined by the paint cap.
- *
- * @param points The center vertices of the points to be drawn
- * @param count The number of floats making up the point vertices
- * @param paint The paint the points will be drawn with indicating AA, stroke width & cap
- * @param transform The transform the points will be drawn with, used to drive stretch-aware
- * path
- * vertex approximation, and correct AA ramp offsetting
- * @param vertexBuffer The output buffer
- */
- static void tessellatePoints(const float* points, int count, const SkPaint* paint,
- const mat4& transform, VertexBuffer& vertexBuffer);
-
- /**
- * Populates a VertexBuffer with a tessellated approximation of lines as a single triangle
- * strip (with degenerate tris separating).
- *
- * @param points Pairs of endpoints defining the lines to be drawn
- * @param count The number of floats making up the line vertices
- * @param paint The paint the lines will be drawn with indicating AA, stroke width & cap
- * @param transform The transform the points will be drawn with, used to drive stretch-aware
- * path
- * vertex approximation, and correct AA ramp offsetting
- * @param vertexBuffer The output buffer
- */
- static void tessellateLines(const float* points, int count, const SkPaint* paint,
- const mat4& transform, VertexBuffer& vertexBuffer);
-
- /**
- * Approximates a convex outline into a clockwise Vector of 2d vertices.
- *
- * @param path The outline to be approximated
- * @param threshold The threshold of acceptable error (in pixels) when approximating
- * @param outputVertices An empty Vector which will be populated with the output
- */
- static bool approximatePathOutlineVertices(const SkPath& path, float threshold,
- std::vector<Vertex>& outputVertices);
-
-private:
- static bool approximatePathOutlineVertices(const SkPath& path, bool forceClose,
- const PathApproximationInfo& approximationInfo,
- std::vector<Vertex>& outputVertices);
-
- /*
- endpoints a & b,
- control c
- */
- static void recursiveQuadraticBezierVertices(float ax, float ay, float bx, float by, float cx,
- float cy,
- const PathApproximationInfo& approximationInfo,
- std::vector<Vertex>& outputVertices,
- int depth = 0);
-
- /*
- endpoints p1, p2
- control c1, c2
- */
- static void recursiveCubicBezierVertices(float p1x, float p1y, float c1x, float c1y, float p2x,
- float p2y, float c2x, float c2y,
- const PathApproximationInfo& approximationInfo,
- std::vector<Vertex>& outputVertices, int depth = 0);
-};
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_PATH_TESSELLATOR_H
diff --git a/libs/hwui/ProfileData.cpp b/libs/hwui/ProfileData.cpp
index 16966619aace..70ca4e3e8074 100644
--- a/libs/hwui/ProfileData.cpp
+++ b/libs/hwui/ProfileData.cpp
@@ -104,8 +104,8 @@ void ProfileData::dump(int fd) const {
dprintf(fd, "\nStats since: %" PRIu64 "ns", mStatStartTime);
dprintf(fd, "\nTotal frames rendered: %u", mTotalFrameCount);
dprintf(fd, "\nJanky frames: %u (%.2f%%)", mJankFrameCount,
- mTotalFrameCount == 0 ? 0.0f :
- (float)mJankFrameCount / (float)mTotalFrameCount * 100.0f);
+ mTotalFrameCount == 0 ? 0.0f
+ : (float)mJankFrameCount / (float)mTotalFrameCount * 100.0f);
dprintf(fd, "\n50th percentile: %ums", findPercentile(50));
dprintf(fd, "\n90th percentile: %ums", findPercentile(90));
dprintf(fd, "\n95th percentile: %ums", findPercentile(95));
diff --git a/libs/hwui/ProfileRenderer.cpp b/libs/hwui/ProfileRenderer.cpp
deleted file mode 100644
index 8a00ffa54c58..000000000000
--- a/libs/hwui/ProfileRenderer.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "ProfileRenderer.h"
-
-namespace android {
-namespace uirenderer {
-
-void ProfileRenderer::drawRect(float left, float top, float right, float bottom,
- const SkPaint& paint) {
- mRenderer.drawRect(left, top, right, bottom, &paint);
-}
-
-void ProfileRenderer::drawRects(const float* rects, int count, const SkPaint& paint) {
- mRenderer.drawRects(rects, count, &paint);
-}
-
-uint32_t ProfileRenderer::getViewportWidth() {
- return mRenderer.getViewportWidth();
-}
-
-uint32_t ProfileRenderer::getViewportHeight() {
- return mRenderer.getViewportHeight();
-}
-
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/ProfileRenderer.h b/libs/hwui/ProfileRenderer.h
deleted file mode 100644
index 5c8bb2529fb4..000000000000
--- a/libs/hwui/ProfileRenderer.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "IProfileRenderer.h"
-
-#include "BakedOpRenderer.h"
-
-namespace android {
-namespace uirenderer {
-
-class ProfileRenderer : public IProfileRenderer {
-public:
- ProfileRenderer(BakedOpRenderer& renderer) : mRenderer(renderer) {}
-
- void drawRect(float left, float top, float right, float bottom, const SkPaint& paint) override;
- void drawRects(const float* rects, int count, const SkPaint& paint) override;
- uint32_t getViewportWidth() override;
- uint32_t getViewportHeight() override;
-
- virtual ~ProfileRenderer() {}
-
-private:
- BakedOpRenderer& mRenderer;
-};
-
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/Program.cpp b/libs/hwui/Program.cpp
deleted file mode 100644
index 052798b9cea9..000000000000
--- a/libs/hwui/Program.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <utils/Trace.h>
-
-#include "Program.h"
-#include "Vertex.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Base program
-///////////////////////////////////////////////////////////////////////////////
-
-Program::Program(const ProgramDescription& description, const char* vertex, const char* fragment) {
- mInitialized = false;
- mHasColorUniform = false;
- mHasSampler = false;
- mUse = false;
-
- // No need to cache compiled shaders, rely instead on Android's
- // persistent shaders cache
- mVertexShader = buildShader(vertex, GL_VERTEX_SHADER);
- if (mVertexShader) {
- mFragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER);
- if (mFragmentShader) {
- mProgramId = glCreateProgram();
-
- glAttachShader(mProgramId, mVertexShader);
- glAttachShader(mProgramId, mFragmentShader);
-
- bindAttrib("position", kBindingPosition);
- if (description.hasTexture || description.hasExternalTexture) {
- texCoords = bindAttrib("texCoords", kBindingTexCoords);
- } else {
- texCoords = -1;
- }
-
- ATRACE_BEGIN("linkProgram");
- glLinkProgram(mProgramId);
- ATRACE_END();
-
- GLint status;
- glGetProgramiv(mProgramId, GL_LINK_STATUS, &status);
- if (status != GL_TRUE) {
- GLint infoLen = 0;
- glGetProgramiv(mProgramId, GL_INFO_LOG_LENGTH, &infoLen);
- if (infoLen > 1) {
- GLchar log[infoLen];
- glGetProgramInfoLog(mProgramId, infoLen, nullptr, &log[0]);
- ALOGE("%s", log);
- }
- LOG_ALWAYS_FATAL("Error while linking shaders");
- } else {
- mInitialized = true;
- }
- } else {
- glDeleteShader(mVertexShader);
- }
- }
-
- if (mInitialized) {
- transform = addUniform("transform");
- projection = addUniform("projection");
- }
-}
-
-Program::~Program() {
- if (mInitialized) {
- // This would ideally happen after linking the program
- // but Tegra drivers, especially when perfhud is enabled,
- // sometimes crash if we do so
- glDetachShader(mProgramId, mVertexShader);
- glDetachShader(mProgramId, mFragmentShader);
-
- glDeleteShader(mVertexShader);
- glDeleteShader(mFragmentShader);
-
- glDeleteProgram(mProgramId);
- }
-}
-
-int Program::addAttrib(const char* name) {
- int slot = glGetAttribLocation(mProgramId, name);
- mAttributes.add(name, slot);
- return slot;
-}
-
-int Program::bindAttrib(const char* name, ShaderBindings bindingSlot) {
- glBindAttribLocation(mProgramId, bindingSlot, name);
- mAttributes.add(name, bindingSlot);
- return bindingSlot;
-}
-
-int Program::getAttrib(const char* name) {
- ssize_t index = mAttributes.indexOfKey(name);
- if (index >= 0) {
- return mAttributes.valueAt(index);
- }
- return addAttrib(name);
-}
-
-int Program::addUniform(const char* name) {
- int slot = glGetUniformLocation(mProgramId, name);
- mUniforms.add(name, slot);
- return slot;
-}
-
-int Program::getUniform(const char* name) {
- ssize_t index = mUniforms.indexOfKey(name);
- if (index >= 0) {
- return mUniforms.valueAt(index);
- }
- return addUniform(name);
-}
-
-GLuint Program::buildShader(const char* source, GLenum type) {
- ATRACE_NAME("Build GL Shader");
-
- GLuint shader = glCreateShader(type);
- glShaderSource(shader, 1, &source, nullptr);
- glCompileShader(shader);
-
- GLint status;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
- if (status != GL_TRUE) {
- ALOGE("Error while compiling this shader:\n===\n%s\n===", source);
- // Some drivers return wrong values for GL_INFO_LOG_LENGTH
- // use a fixed size instead
- GLchar log[512];
- glGetShaderInfoLog(shader, sizeof(log), nullptr, &log[0]);
- LOG_ALWAYS_FATAL("Shader info log: %s", log);
- return 0;
- }
-
- return shader;
-}
-
-void Program::set(const mat4& projectionMatrix, const mat4& modelViewMatrix,
- const mat4& transformMatrix, bool offset) {
- if (projectionMatrix != mProjection || offset != mOffset) {
- if (CC_LIKELY(!offset)) {
- glUniformMatrix4fv(projection, 1, GL_FALSE, &projectionMatrix.data[0]);
- } else {
- mat4 p(projectionMatrix);
- // offset screenspace xy by an amount that compensates for typical precision
- // issues in GPU hardware that tends to paint hor/vert lines in pixels shifted
- // up and to the left.
- // This offset value is based on an assumption that some hardware may use as
- // little as 12.4 precision, so we offset by slightly more than 1/16.
- p.translate(Vertex::GeometryFudgeFactor(), Vertex::GeometryFudgeFactor());
- glUniformMatrix4fv(projection, 1, GL_FALSE, &p.data[0]);
- }
- mProjection = projectionMatrix;
- mOffset = offset;
- }
-
- mat4 t(transformMatrix);
- t.multiply(modelViewMatrix);
- glUniformMatrix4fv(transform, 1, GL_FALSE, &t.data[0]);
-}
-
-void Program::setColor(FloatColor color) {
- if (!mHasColorUniform) {
- mColorUniform = getUniform("color");
- mHasColorUniform = true;
- }
- glUniform4f(mColorUniform, color.r, color.g, color.b, color.a);
-}
-
-void Program::use() {
- glUseProgram(mProgramId);
- if (texCoords >= 0 && !mHasSampler) {
- glUniform1i(getUniform("baseSampler"), 0);
- mHasSampler = true;
- }
- mUse = true;
-}
-
-void Program::remove() {
- mUse = false;
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/Program.h b/libs/hwui/Program.h
deleted file mode 100644
index dcc2bd410ebd..000000000000
--- a/libs/hwui/Program.h
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_PROGRAM_H
-#define ANDROID_HWUI_PROGRAM_H
-
-#include <utils/KeyedVector.h>
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include <SkBlendMode.h>
-
-#include "Debug.h"
-#include "FloatColor.h"
-#include "Matrix.h"
-#include "Properties.h"
-#include "utils/Color.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Defines
-///////////////////////////////////////////////////////////////////////////////
-
-// Debug
-#if DEBUG_PROGRAMS
-#define PROGRAM_LOGD(...) ALOGD(__VA_ARGS__)
-#else
-#define PROGRAM_LOGD(...)
-#endif
-
-#define COLOR_COMPONENT_THRESHOLD 1.0f
-#define COLOR_COMPONENT_INV_THRESHOLD 0.0f
-
-#define PROGRAM_KEY_TEXTURE 0x01
-#define PROGRAM_KEY_A8_TEXTURE 0x02
-#define PROGRAM_KEY_BITMAP 0x04
-#define PROGRAM_KEY_GRADIENT 0x08
-#define PROGRAM_KEY_BITMAP_FIRST 0x10
-#define PROGRAM_KEY_COLOR_MATRIX 0x20
-#define PROGRAM_KEY_COLOR_BLEND 0x40
-#define PROGRAM_KEY_BITMAP_NPOT 0x80
-#define PROGRAM_KEY_BITMAP_EXTERNAL 0x100
-
-#define PROGRAM_KEY_BITMAP_WRAPS_MASK 0x600
-#define PROGRAM_KEY_BITMAP_WRAPT_MASK 0x1800
-
-#define PROGRAM_KEY_SWAP_SRC_DST_SHIFT 13
-
-// Encode the xfermodes on 6 bits
-#define PROGRAM_MAX_XFERMODE 0x1f
-#define PROGRAM_XFERMODE_SHADER_SHIFT 26
-#define PROGRAM_XFERMODE_COLOR_OP_SHIFT 20
-#define PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT 14
-
-#define PROGRAM_BITMAP_WRAPS_SHIFT 9
-#define PROGRAM_BITMAP_WRAPT_SHIFT 11
-
-#define PROGRAM_GRADIENT_TYPE_SHIFT 33 // 2 bits for gradient type
-#define PROGRAM_MODULATE_SHIFT 35
-
-#define PROGRAM_HAS_VERTEX_ALPHA_SHIFT 36
-#define PROGRAM_USE_SHADOW_ALPHA_INTERP_SHIFT 37
-
-#define PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT 38
-#define PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT 39
-
-#define PROGRAM_IS_SIMPLE_GRADIENT 40
-
-#define PROGRAM_HAS_COLORS 41
-
-#define PROGRAM_HAS_DEBUG_HIGHLIGHT 42
-#define PROGRAM_HAS_ROUND_RECT_CLIP 43
-
-#define PROGRAM_HAS_GAMMA_CORRECTION 44
-#define PROGRAM_HAS_LINEAR_TEXTURE 45
-
-#define PROGRAM_HAS_COLOR_SPACE_CONVERSION 46
-#define PROGRAM_TRANSFER_FUNCTION 47 // 2 bits for transfer function
-#define PROGRAM_HAS_TRANSLUCENT_CONVERSION 49
-
-///////////////////////////////////////////////////////////////////////////////
-// Types
-///////////////////////////////////////////////////////////////////////////////
-
-typedef uint64_t programid;
-
-///////////////////////////////////////////////////////////////////////////////
-// Program description
-///////////////////////////////////////////////////////////////////////////////
-
-/**
- * Describe the features required for a given program. The features
- * determine the generation of both the vertex and fragment shaders.
- * A ProgramDescription must be used in conjunction with a ProgramCache.
- */
-struct ProgramDescription {
- enum class ColorFilterMode : int8_t { None = 0, Matrix, Blend };
-
- enum Gradient : int8_t { kGradientLinear = 0, kGradientCircular, kGradientSweep };
-
- ProgramDescription() { reset(); }
-
- // Texturing
- bool hasTexture;
- bool hasAlpha8Texture;
- bool hasExternalTexture;
- bool hasTextureTransform;
-
- // Color attribute
- bool hasColors;
-
- // Modulate, this should only be set when setColor() return true
- bool modulate;
-
- // Shaders
- bool hasBitmap;
- bool isShaderBitmapExternal;
- bool useShaderBasedWrap;
-
- bool hasVertexAlpha;
- bool useShadowAlphaInterp;
-
- bool hasGradient;
- Gradient gradientType;
- bool isSimpleGradient;
-
- SkBlendMode shadersMode;
-
- bool isBitmapFirst;
- GLenum bitmapWrapS;
- GLenum bitmapWrapT;
-
- // Color operations
- ColorFilterMode colorOp;
- SkBlendMode colorMode;
-
- // Framebuffer blending (requires Extensions.hasFramebufferFetch())
- // Ignored for all values < SkBlendMode::kPlus
- SkBlendMode framebufferMode;
- bool swapSrcDst;
-
- bool hasDebugHighlight;
- bool hasRoundRectClip;
-
- // Extra gamma correction used for text
- bool hasGammaCorrection;
- // Set when sampling an image in linear space
- bool hasLinearTexture;
-
- bool hasColorSpaceConversion;
- TransferFunctionType transferFunction;
- // Indicates whether the bitmap to convert between color spaces is translucent
- bool hasTranslucentConversion;
-
- /**
- * Resets this description. All fields are reset back to the default
- * values they hold after building a new instance.
- */
- void reset() {
- hasTexture = false;
- hasAlpha8Texture = false;
- hasExternalTexture = false;
- hasTextureTransform = false;
-
- hasColors = false;
-
- hasVertexAlpha = false;
- useShadowAlphaInterp = false;
-
- modulate = false;
-
- hasBitmap = false;
- isShaderBitmapExternal = false;
- useShaderBasedWrap = false;
-
- hasGradient = false;
- gradientType = kGradientLinear;
- isSimpleGradient = false;
-
- shadersMode = SkBlendMode::kClear;
-
- isBitmapFirst = false;
- bitmapWrapS = GL_CLAMP_TO_EDGE;
- bitmapWrapT = GL_CLAMP_TO_EDGE;
-
- colorOp = ColorFilterMode::None;
- colorMode = SkBlendMode::kClear;
-
- framebufferMode = SkBlendMode::kClear;
- swapSrcDst = false;
-
- hasDebugHighlight = false;
- hasRoundRectClip = false;
-
- hasGammaCorrection = false;
- hasLinearTexture = false;
-
- hasColorSpaceConversion = false;
- transferFunction = TransferFunctionType::None;
- hasTranslucentConversion = false;
- }
-
- /**
- * Indicates, for a given color, whether color modulation is required in
- * the fragment shader. When this method returns true, the program should
- * be provided with a modulation color.
- */
- bool setColorModulate(const float a) {
- modulate = a < COLOR_COMPONENT_THRESHOLD;
- return modulate;
- }
-
- /**
- * Indicates, for a given color, whether color modulation is required in
- * the fragment shader. When this method returns true, the program should
- * be provided with a modulation color.
- */
- bool setAlpha8ColorModulate(const float r, const float g, const float b, const float a) {
- modulate = a < COLOR_COMPONENT_THRESHOLD || r > COLOR_COMPONENT_INV_THRESHOLD ||
- g > COLOR_COMPONENT_INV_THRESHOLD || b > COLOR_COMPONENT_INV_THRESHOLD;
- return modulate;
- }
-
- /**
- * Computes the unique key identifying this program.
- */
- programid key() const {
- programid key = 0;
- if (hasTexture) key |= PROGRAM_KEY_TEXTURE;
- if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE;
- if (hasBitmap) {
- key |= PROGRAM_KEY_BITMAP;
- if (useShaderBasedWrap) {
- key |= PROGRAM_KEY_BITMAP_NPOT;
- key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT;
- key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT;
- }
- if (isShaderBitmapExternal) {
- key |= PROGRAM_KEY_BITMAP_EXTERNAL;
- }
- }
- if (hasGradient) key |= PROGRAM_KEY_GRADIENT;
- key |= programid(gradientType) << PROGRAM_GRADIENT_TYPE_SHIFT;
- if (isBitmapFirst) key |= PROGRAM_KEY_BITMAP_FIRST;
- if (hasBitmap && hasGradient) {
- key |= ((int)shadersMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_SHADER_SHIFT;
- }
- switch (colorOp) {
- case ColorFilterMode::Matrix:
- key |= PROGRAM_KEY_COLOR_MATRIX;
- break;
- case ColorFilterMode::Blend:
- key |= PROGRAM_KEY_COLOR_BLEND;
- key |= ((int)colorMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_COLOR_OP_SHIFT;
- break;
- case ColorFilterMode::None:
- break;
- }
- key |= ((int)framebufferMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT;
- key |= programid(swapSrcDst) << PROGRAM_KEY_SWAP_SRC_DST_SHIFT;
- key |= programid(modulate) << PROGRAM_MODULATE_SHIFT;
- key |= programid(hasVertexAlpha) << PROGRAM_HAS_VERTEX_ALPHA_SHIFT;
- key |= programid(useShadowAlphaInterp) << PROGRAM_USE_SHADOW_ALPHA_INTERP_SHIFT;
- key |= programid(hasExternalTexture) << PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT;
- key |= programid(hasTextureTransform) << PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT;
- key |= programid(isSimpleGradient) << PROGRAM_IS_SIMPLE_GRADIENT;
- key |= programid(hasColors) << PROGRAM_HAS_COLORS;
- key |= programid(hasDebugHighlight) << PROGRAM_HAS_DEBUG_HIGHLIGHT;
- key |= programid(hasRoundRectClip) << PROGRAM_HAS_ROUND_RECT_CLIP;
- key |= programid(hasGammaCorrection) << PROGRAM_HAS_GAMMA_CORRECTION;
- key |= programid(hasLinearTexture) << PROGRAM_HAS_LINEAR_TEXTURE;
- key |= programid(hasColorSpaceConversion) << PROGRAM_HAS_COLOR_SPACE_CONVERSION;
- key |= programid(transferFunction) << PROGRAM_TRANSFER_FUNCTION;
- key |= programid(hasTranslucentConversion) << PROGRAM_HAS_TRANSLUCENT_CONVERSION;
- return key;
- }
-
- /**
- * Logs the specified message followed by the key identifying this program.
- */
- void log(const char* message) const {
-#if DEBUG_PROGRAMS
- programid k = key();
- PROGRAM_LOGD("%s (key = 0x%.8x%.8x)", message, uint32_t(k >> 32), uint32_t(k & 0xffffffff));
-#endif
- }
-
-private:
- static inline uint32_t getEnumForWrap(GLenum wrap) {
- switch (wrap) {
- case GL_CLAMP_TO_EDGE:
- return 0;
- case GL_REPEAT:
- return 1;
- case GL_MIRRORED_REPEAT:
- return 2;
- }
- return 0;
- }
-
-}; // struct ProgramDescription
-
-/**
- * A program holds a vertex and a fragment shader. It offers several utility
- * methods to query attributes and uniforms.
- */
-class Program {
-public:
- enum ShaderBindings { kBindingPosition, kBindingTexCoords };
-
- /**
- * Creates a new program with the specified vertex and fragment
- * shaders sources.
- */
- Program(const ProgramDescription& description, const char* vertex, const char* fragment);
- virtual ~Program();
-
- /**
- * Binds this program to the GL context.
- */
- virtual void use();
-
- /**
- * Marks this program as unused. This will not unbind
- * the program from the GL context.
- */
- virtual void remove();
-
- /**
- * Returns the OpenGL name of the specified attribute.
- */
- int getAttrib(const char* name);
-
- /**
- * Returns the OpenGL name of the specified uniform.
- */
- int getUniform(const char* name);
-
- /**
- * Indicates whether this program is currently in use with
- * the GL context.
- */
- inline bool isInUse() const { return mUse; }
-
- /**
- * Indicates whether this program was correctly compiled and linked.
- */
- inline bool isInitialized() const { return mInitialized; }
-
- /**
- * Binds the program with the specified projection, modelView and
- * transform matrices.
- */
- void set(const mat4& projectionMatrix, const mat4& modelViewMatrix, const mat4& transformMatrix,
- bool offset = false);
-
- /**
- * Sets the color associated with this shader.
- */
- void setColor(FloatColor color);
-
- /**
- * Name of the texCoords attribute if it exists (kBindingTexCoords), -1 otherwise.
- */
- int texCoords;
-
- /**
- * Name of the transform uniform.
- */
- int transform;
-
- /**
- * Name of the projection uniform.
- */
- int projection;
-
-protected:
- /**
- * Adds an attribute with the specified name.
- *
- * @return The OpenGL name of the attribute.
- */
- int addAttrib(const char* name);
-
- /**
- * Binds the specified attribute name to the specified slot.
- */
- int bindAttrib(const char* name, ShaderBindings bindingSlot);
-
- /**
- * Adds a uniform with the specified name.
- *
- * @return The OpenGL name of the uniform.
- */
- int addUniform(const char* name);
-
-private:
- /**
- * Compiles the specified shader of the specified type.
- *
- * @return The name of the compiled shader.
- */
- GLuint buildShader(const char* source, GLenum type);
-
- // Name of the OpenGL program and shaders
- GLuint mProgramId;
- GLuint mVertexShader;
- GLuint mFragmentShader;
-
- // Keeps track of attributes and uniforms slots
- KeyedVector<const char*, int> mAttributes;
- KeyedVector<const char*, int> mUniforms;
-
- bool mUse;
- bool mInitialized;
-
- // Uniforms caching
- bool mHasColorUniform;
- int mColorUniform;
-
- bool mHasSampler;
-
- mat4 mProjection;
- bool mOffset;
-}; // class Program
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_PROGRAM_H
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp
deleted file mode 100644
index 1164ebfdf1e5..000000000000
--- a/libs/hwui/ProgramCache.cpp
+++ /dev/null
@@ -1,865 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <utils/String8.h>
-
-#include "Caches.h"
-#include "ProgramCache.h"
-#include "Properties.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Defines
-///////////////////////////////////////////////////////////////////////////////
-
-#define MODULATE_OP_NO_MODULATE 0
-#define MODULATE_OP_MODULATE 1
-#define MODULATE_OP_MODULATE_A8 2
-
-#define STR(x) STR1(x)
-#define STR1(x) #x
-
-///////////////////////////////////////////////////////////////////////////////
-// Vertex shaders snippets
-///////////////////////////////////////////////////////////////////////////////
-
-const char* gVS_Header_Start =
- "#version 100\n"
- "attribute vec4 position;\n";
-const char* gVS_Header_Attributes_TexCoords = "attribute vec2 texCoords;\n";
-const char* gVS_Header_Attributes_Colors = "attribute vec4 colors;\n";
-const char* gVS_Header_Attributes_VertexAlphaParameters = "attribute float vtxAlpha;\n";
-const char* gVS_Header_Uniforms_TextureTransform = "uniform mat4 mainTextureTransform;\n";
-const char* gVS_Header_Uniforms =
- "uniform mat4 projection;\n"
- "uniform mat4 transform;\n";
-const char* gVS_Header_Uniforms_HasGradient = "uniform mat4 screenSpace;\n";
-const char* gVS_Header_Uniforms_HasBitmap =
- "uniform mat4 textureTransform;\n"
- "uniform mediump vec2 textureDimension;\n";
-const char* gVS_Header_Uniforms_HasRoundRectClip =
- "uniform mat4 roundRectInvTransform;\n"
- "uniform mediump vec4 roundRectInnerRectLTWH;\n"
- "uniform mediump float roundRectRadius;\n";
-const char* gVS_Header_Varyings_HasTexture = "varying vec2 outTexCoords;\n";
-const char* gVS_Header_Varyings_HasColors = "varying vec4 outColors;\n";
-const char* gVS_Header_Varyings_HasVertexAlpha = "varying float alpha;\n";
-const char* gVS_Header_Varyings_HasBitmap = "varying highp vec2 outBitmapTexCoords;\n";
-const char* gVS_Header_Varyings_HasGradient[6] = {
- // Linear
- "varying highp vec2 linear;\n", "varying float linear;\n",
-
- // Circular
- "varying highp vec2 circular;\n", "varying highp vec2 circular;\n",
-
- // Sweep
- "varying highp vec2 sweep;\n", "varying highp vec2 sweep;\n",
-};
-const char* gVS_Header_Varyings_HasRoundRectClip = "varying mediump vec2 roundRectPos;\n";
-const char* gVS_Main = "\nvoid main(void) {\n";
-const char* gVS_Main_OutTexCoords = " outTexCoords = texCoords;\n";
-const char* gVS_Main_OutColors = " outColors = colors;\n";
-const char* gVS_Main_OutTransformedTexCoords =
- " outTexCoords = (mainTextureTransform * vec4(texCoords, 0.0, 1.0)).xy;\n";
-const char* gVS_Main_OutGradient[6] = {
- // Linear
- " linear = vec2((screenSpace * position).x, 0.5);\n",
- " linear = (screenSpace * position).x;\n",
-
- // Circular
- " circular = (screenSpace * position).xy;\n",
- " circular = (screenSpace * position).xy;\n",
-
- // Sweep
- " sweep = (screenSpace * position).xy;\n", " sweep = (screenSpace * position).xy;\n"};
-const char* gVS_Main_OutBitmapTexCoords =
- " outBitmapTexCoords = (textureTransform * position).xy * textureDimension;\n";
-const char* gVS_Main_Position =
- " vec4 transformedPosition = projection * transform * position;\n"
- " gl_Position = transformedPosition;\n";
-
-const char* gVS_Main_VertexAlpha = " alpha = vtxAlpha;\n";
-
-const char* gVS_Main_HasRoundRectClip =
- " roundRectPos = ((roundRectInvTransform * transformedPosition).xy / roundRectRadius) - "
- "roundRectInnerRectLTWH.xy;\n";
-const char* gVS_Footer = "}\n\n";
-
-///////////////////////////////////////////////////////////////////////////////
-// Fragment shaders snippets
-///////////////////////////////////////////////////////////////////////////////
-
-const char* gFS_Header_Start = "#version 100\n";
-const char* gFS_Header_Extension_FramebufferFetch =
- "#extension GL_NV_shader_framebuffer_fetch : enable\n\n";
-const char* gFS_Header_Extension_ExternalTexture =
- "#extension GL_OES_EGL_image_external : require\n\n";
-const char* gFS_Header = "precision mediump float;\n\n";
-const char* gFS_Uniforms_Color = "uniform vec4 color;\n";
-const char* gFS_Uniforms_TextureSampler = "uniform sampler2D baseSampler;\n";
-const char* gFS_Uniforms_ExternalTextureSampler = "uniform samplerExternalOES baseSampler;\n";
-const char* gFS_Uniforms_GradientSampler[2] = {
- "uniform vec2 screenSize;\n"
- "uniform sampler2D gradientSampler;\n",
-
- "uniform vec2 screenSize;\n"
- "uniform vec4 startColor;\n"
- "uniform vec4 endColor;\n"};
-const char* gFS_Uniforms_BitmapSampler = "uniform sampler2D bitmapSampler;\n";
-const char* gFS_Uniforms_BitmapExternalSampler = "uniform samplerExternalOES bitmapSampler;\n";
-const char* gFS_Uniforms_ColorOp[3] = {
- // None
- "",
- // Matrix
- "uniform mat4 colorMatrix;\n"
- "uniform vec4 colorMatrixVector;\n",
- // PorterDuff
- "uniform vec4 colorBlend;\n"};
-
-const char* gFS_Uniforms_HasRoundRectClip =
- "uniform mediump vec4 roundRectInnerRectLTWH;\n"
- "uniform mediump float roundRectRadius;\n";
-
-const char* gFS_Uniforms_ColorSpaceConversion =
- // TODO: Should we use a 3D LUT to combine the matrix and transfer functions?
- // 32x32x32 fp16 LUTs (for scRGB output) are large and heavy to generate...
- "uniform mat3 colorSpaceMatrix;\n";
-
-const char* gFS_Uniforms_TransferFunction[4] = {
- // In this order: g, a, b, c, d, e, f
- // See ColorSpace::TransferParameters
- // We'll use hardware sRGB conversion as much as possible
- "", "uniform float transferFunction[7];\n", "uniform float transferFunction[5];\n",
- "uniform float transferFunctionGamma;\n"};
-
-const char* gFS_OETF[2] = {
- R"__SHADER__(
- vec4 OETF(const vec4 linear) {
- return linear;
- }
- )__SHADER__",
- // We expect linear data to be scRGB so we mirror the gamma function
- R"__SHADER__(
- vec4 OETF(const vec4 linear) {
- return vec4(sign(linear.rgb) * OETF_sRGB(abs(linear.rgb)), linear.a);
- }
- )__SHADER__"};
-
-const char* gFS_ColorConvert[3] = {
- // Just OETF
- R"__SHADER__(
- vec4 colorConvert(const vec4 color) {
- return OETF(color);
- }
- )__SHADER__",
- // Full color conversion for opaque bitmaps
- R"__SHADER__(
- vec4 colorConvert(const vec4 color) {
- return OETF(vec4(colorSpaceMatrix * EOTF_Parametric(color.rgb), color.a));
- }
- )__SHADER__",
- // Full color conversion for translucent bitmaps
- // Note: 0.5/256=0.0019
- R"__SHADER__(
- vec4 colorConvert(in vec4 color) {
- color.rgb /= color.a + 0.0019;
- color = OETF(vec4(colorSpaceMatrix * EOTF_Parametric(color.rgb), color.a));
- color.rgb *= color.a + 0.0019;
- return color;
- }
- )__SHADER__",
-};
-
-const char* gFS_sRGB_TransferFunctions = R"__SHADER__(
- float OETF_sRGB(const float linear) {
- // IEC 61966-2-1:1999
- return linear <= 0.0031308 ? linear * 12.92 : (pow(linear, 1.0 / 2.4) * 1.055) - 0.055;
- }
-
- vec3 OETF_sRGB(const vec3 linear) {
- return vec3(OETF_sRGB(linear.r), OETF_sRGB(linear.g), OETF_sRGB(linear.b));
- }
-
- float EOTF_sRGB(float srgb) {
- // IEC 61966-2-1:1999
- return srgb <= 0.04045 ? srgb / 12.92 : pow((srgb + 0.055) / 1.055, 2.4);
- }
-)__SHADER__";
-
-const char* gFS_TransferFunction[4] = {
- // Conversion done by the texture unit (sRGB)
- R"__SHADER__(
- vec3 EOTF_Parametric(const vec3 x) {
- return x;
- }
- )__SHADER__",
- // Full transfer function
- // TODO: We should probably use a 1D LUT (256x1 with texelFetch() since input is 8 bit)
- // TODO: That would cause 3 dependent texture fetches. Is it worth it?
- R"__SHADER__(
- float EOTF_Parametric(float x) {
- return x <= transferFunction[4]
- ? transferFunction[3] * x + transferFunction[6]
- : pow(transferFunction[1] * x + transferFunction[2], transferFunction[0])
- + transferFunction[5];
- }
-
- vec3 EOTF_Parametric(const vec3 x) {
- return vec3(EOTF_Parametric(x.r), EOTF_Parametric(x.g), EOTF_Parametric(x.b));
- }
- )__SHADER__",
- // Limited transfer function, e = f = 0.0
- R"__SHADER__(
- float EOTF_Parametric(float x) {
- return x <= transferFunction[4]
- ? transferFunction[3] * x
- : pow(transferFunction[1] * x + transferFunction[2], transferFunction[0]);
- }
-
- vec3 EOTF_Parametric(const vec3 x) {
- return vec3(EOTF_Parametric(x.r), EOTF_Parametric(x.g), EOTF_Parametric(x.b));
- }
- )__SHADER__",
- // Gamma transfer function, e = f = 0.0
- R"__SHADER__(
- vec3 EOTF_Parametric(const vec3 x) {
- return vec3(pow(x.r, transferFunctionGamma),
- pow(x.g, transferFunctionGamma),
- pow(x.b, transferFunctionGamma));
- }
- )__SHADER__"};
-
-// Dithering must be done in the quantization space
-// When we are writing to an sRGB framebuffer, we must do the following:
-// EOTF(OETF(color) + dither)
-// The dithering pattern is generated with a triangle noise generator in the range [-1.0,1.0]
-// TODO: Handle linear fp16 render targets
-const char* gFS_GradientFunctions = R"__SHADER__(
- float triangleNoise(const highp vec2 n) {
- highp vec2 p = fract(n * vec2(5.3987, 5.4421));
- p += dot(p.yx, p.xy + vec2(21.5351, 14.3137));
- highp float xy = p.x * p.y;
- return fract(xy * 95.4307) + fract(xy * 75.04961) - 1.0;
- }
-)__SHADER__";
-
-const char* gFS_GradientPreamble[2] = {
- // Linear framebuffer
- R"__SHADER__(
- vec4 dither(const vec4 color) {
- return color + (triangleNoise(gl_FragCoord.xy * screenSize.xy) / 255.0);
- }
- )__SHADER__",
- // sRGB framebuffer
- R"__SHADER__(
- vec4 dither(const vec4 color) {
- vec3 dithered = sqrt(color.rgb) + (triangleNoise(gl_FragCoord.xy * screenSize.xy) / 255.0);
- return vec4(dithered * dithered, color.a);
- }
- )__SHADER__",
-};
-
-// Uses luminance coefficients from Rec.709 to choose the appropriate gamma
-// The gamma() function assumes that bright text will be displayed on a dark
-// background and that dark text will be displayed on bright background
-// The gamma coefficient is chosen to thicken or thin the text accordingly
-// The dot product used to compute the luminance could be approximated with
-// a simple max(color.r, color.g, color.b)
-const char* gFS_Gamma_Preamble = R"__SHADER__(
- #define GAMMA (%.2f)
- #define GAMMA_INV (%.2f)
-
- float gamma(float a, const vec3 color) {
- float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
- return pow(a, luminance < 0.5 ? GAMMA_INV : GAMMA);
- }
-)__SHADER__";
-
-const char* gFS_Main =
- "\nvoid main(void) {\n"
- " vec4 fragColor;\n";
-
-const char* gFS_Main_AddDither = " fragColor = dither(fragColor);\n";
-
-// General case
-const char* gFS_Main_FetchColor = " fragColor = color;\n";
-const char* gFS_Main_ModulateColor = " fragColor *= color.a;\n";
-const char* gFS_Main_ApplyVertexAlphaLinearInterp = " fragColor *= alpha;\n";
-const char* gFS_Main_ApplyVertexAlphaShadowInterp =
- // map alpha through shadow alpha sampler
- " fragColor *= texture2D(baseSampler, vec2(alpha, 0.5)).a;\n";
-const char* gFS_Main_FetchTexture[2] = {
- // Don't modulate
- " fragColor = colorConvert(texture2D(baseSampler, outTexCoords));\n",
- // Modulate
- " fragColor = color * colorConvert(texture2D(baseSampler, outTexCoords));\n"};
-const char* gFS_Main_FetchA8Texture[4] = {
- // Don't modulate
- " fragColor = texture2D(baseSampler, outTexCoords);\n",
- " fragColor = texture2D(baseSampler, outTexCoords);\n",
- // Modulate
- " fragColor = color * texture2D(baseSampler, outTexCoords).a;\n",
- " fragColor = color * gamma(texture2D(baseSampler, outTexCoords).a, color.rgb);\n",
-};
-const char* gFS_Main_FetchGradient[6] = {
- // Linear
- " vec4 gradientColor = texture2D(gradientSampler, linear);\n",
-
- " vec4 gradientColor = mix(startColor, endColor, clamp(linear, 0.0, 1.0));\n",
-
- // Circular
- " vec4 gradientColor = texture2D(gradientSampler, vec2(length(circular), 0.5));\n",
-
- " vec4 gradientColor = mix(startColor, endColor, clamp(length(circular), 0.0, 1.0));\n",
-
- // Sweep
- " highp float index = atan(sweep.y, sweep.x) * 0.15915494309; // inv(2 * PI)\n"
- " vec4 gradientColor = texture2D(gradientSampler, vec2(index - floor(index), 0.5));\n",
-
- " highp float index = atan(sweep.y, sweep.x) * 0.15915494309; // inv(2 * PI)\n"
- " vec4 gradientColor = mix(startColor, endColor, clamp(index - floor(index), 0.0, "
- "1.0));\n"};
-const char* gFS_Main_FetchBitmap =
- " vec4 bitmapColor = colorConvert(texture2D(bitmapSampler, outBitmapTexCoords));\n";
-const char* gFS_Main_FetchBitmapNpot =
- " vec4 bitmapColor = colorConvert(texture2D(bitmapSampler, "
- "wrap(outBitmapTexCoords)));\n";
-const char* gFS_Main_BlendShadersBG = " fragColor = blendShaders(gradientColor, bitmapColor)";
-const char* gFS_Main_BlendShadersGB = " fragColor = blendShaders(bitmapColor, gradientColor)";
-const char* gFS_Main_BlendShaders_Modulate[6] = {
- // Don't modulate
- ";\n", ";\n",
- // Modulate
- " * color.a;\n", " * color.a;\n",
- // Modulate with alpha 8 texture
- " * texture2D(baseSampler, outTexCoords).a;\n",
- " * gamma(texture2D(baseSampler, outTexCoords).a, color.rgb);\n",
-};
-const char* gFS_Main_GradientShader_Modulate[6] = {
- // Don't modulate
- " fragColor = gradientColor;\n", " fragColor = gradientColor;\n",
- // Modulate
- " fragColor = gradientColor * color.a;\n", " fragColor = gradientColor * color.a;\n",
- // Modulate with alpha 8 texture
- " fragColor = gradientColor * texture2D(baseSampler, outTexCoords).a;\n",
- " fragColor = gradientColor * gamma(texture2D(baseSampler, outTexCoords).a, "
- "gradientColor.rgb);\n",
-};
-const char* gFS_Main_BitmapShader_Modulate[6] = {
- // Don't modulate
- " fragColor = bitmapColor;\n", " fragColor = bitmapColor;\n",
- // Modulate
- " fragColor = bitmapColor * color.a;\n", " fragColor = bitmapColor * color.a;\n",
- // Modulate with alpha 8 texture
- " fragColor = bitmapColor * texture2D(baseSampler, outTexCoords).a;\n",
- " fragColor = bitmapColor * gamma(texture2D(baseSampler, outTexCoords).a, "
- "bitmapColor.rgb);\n",
-};
-const char* gFS_Main_FragColor = " gl_FragColor = fragColor;\n";
-const char* gFS_Main_FragColor_HasColors = " gl_FragColor *= outColors;\n";
-const char* gFS_Main_FragColor_Blend =
- " gl_FragColor = blendFramebuffer(fragColor, gl_LastFragColor);\n";
-const char* gFS_Main_FragColor_Blend_Swap =
- " gl_FragColor = blendFramebuffer(gl_LastFragColor, fragColor);\n";
-const char* gFS_Main_ApplyColorOp[3] = {
- // None
- "",
- // Matrix
- " fragColor.rgb /= (fragColor.a + 0.0019);\n" // un-premultiply
- " fragColor *= colorMatrix;\n"
- " fragColor += colorMatrixVector;\n"
- " fragColor.rgb *= (fragColor.a + 0.0019);\n", // re-premultiply
- // PorterDuff
- " fragColor = blendColors(colorBlend, fragColor);\n"};
-
-// Note: LTWH (left top width height) -> xyzw
-// roundRectPos is now divided by roundRectRadius in vertex shader
-// after we also subtract roundRectInnerRectLTWH.xy from roundRectPos
-const char* gFS_Main_FragColor_HasRoundRectClip =
- " mediump vec2 fragToLT = -roundRectPos;\n"
- " mediump vec2 fragFromRB = roundRectPos - roundRectInnerRectLTWH.zw;\n"
-
- // since distance is divided by radius, it's in [0;1] so precision is not an issue
- // this also lets us clamp(0.0, 1.0) instead of max() which is cheaper on GPUs
- " mediump vec2 dist = clamp(max(fragToLT, fragFromRB), 0.0, 1.0);\n"
- " mediump float linearDist = clamp(roundRectRadius - (length(dist) * roundRectRadius), "
- "0.0, 1.0);\n"
- " gl_FragColor *= linearDist;\n";
-
-const char* gFS_Main_DebugHighlight = " gl_FragColor.rgb = vec3(0.0, gl_FragColor.a, 0.0);\n";
-const char* gFS_Footer = "}\n\n";
-
-///////////////////////////////////////////////////////////////////////////////
-// PorterDuff snippets
-///////////////////////////////////////////////////////////////////////////////
-
-const char* gBlendOps[18] = {
- // Clear
- "return vec4(0.0, 0.0, 0.0, 0.0);\n",
- // Src
- "return src;\n",
- // Dst
- "return dst;\n",
- // SrcOver
- "return src + dst * (1.0 - src.a);\n",
- // DstOver
- "return dst + src * (1.0 - dst.a);\n",
- // SrcIn
- "return src * dst.a;\n",
- // DstIn
- "return dst * src.a;\n",
- // SrcOut
- "return src * (1.0 - dst.a);\n",
- // DstOut
- "return dst * (1.0 - src.a);\n",
- // SrcAtop
- "return vec4(src.rgb * dst.a + (1.0 - src.a) * dst.rgb, dst.a);\n",
- // DstAtop
- "return vec4(dst.rgb * src.a + (1.0 - dst.a) * src.rgb, src.a);\n",
- // Xor
- "return vec4(src.rgb * (1.0 - dst.a) + (1.0 - src.a) * dst.rgb, "
- "src.a + dst.a - 2.0 * src.a * dst.a);\n",
- // Plus
- "return min(src + dst, 1.0);\n",
- // Modulate
- "return src * dst;\n",
- // Screen
- "return src + dst - src * dst;\n",
- // Overlay
- "return clamp(vec4(mix("
- "2.0 * src.rgb * dst.rgb + src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a), "
- "src.a * dst.a - 2.0 * (dst.a - dst.rgb) * (src.a - src.rgb) + src.rgb * (1.0 - dst.a) + "
- "dst.rgb * (1.0 - src.a), "
- "step(dst.a, 2.0 * dst.rgb)), "
- "src.a + dst.a - src.a * dst.a), 0.0, 1.0);\n",
- // Darken
- "return vec4(src.rgb * (1.0 - dst.a) + (1.0 - src.a) * dst.rgb + "
- "min(src.rgb * dst.a, dst.rgb * src.a), src.a + dst.a - src.a * dst.a);\n",
- // Lighten
- "return vec4(src.rgb * (1.0 - dst.a) + (1.0 - src.a) * dst.rgb + "
- "max(src.rgb * dst.a, dst.rgb * src.a), src.a + dst.a - src.a * dst.a);\n",
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Constructors/destructors
-///////////////////////////////////////////////////////////////////////////////
-
-ProgramCache::ProgramCache(const Extensions& extensions)
- : mHasES3(extensions.getMajorGlVersion() >= 3)
- , mHasLinearBlending(extensions.hasLinearBlending()) {}
-
-ProgramCache::~ProgramCache() {
- clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache management
-///////////////////////////////////////////////////////////////////////////////
-
-void ProgramCache::clear() {
- PROGRAM_LOGD("Clearing program cache");
- mCache.clear();
-}
-
-Program* ProgramCache::get(const ProgramDescription& description) {
- programid key = description.key();
- if (key == (PROGRAM_KEY_TEXTURE | PROGRAM_KEY_A8_TEXTURE)) {
- // program for A8, unmodulated, texture w/o shader (black text/path textures) is equivalent
- // to standard texture program (bitmaps, patches). Consider them equivalent.
- key = PROGRAM_KEY_TEXTURE;
- }
-
- auto iter = mCache.find(key);
- Program* program = nullptr;
- if (iter == mCache.end()) {
- description.log("Could not find program");
- program = generateProgram(description, key);
- mCache[key] = std::unique_ptr<Program>(program);
- } else {
- program = iter->second.get();
- }
- return program;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Program generation
-///////////////////////////////////////////////////////////////////////////////
-
-Program* ProgramCache::generateProgram(const ProgramDescription& description, programid key) {
- String8 vertexShader = generateVertexShader(description);
- String8 fragmentShader = generateFragmentShader(description);
-
- return new Program(description, vertexShader.string(), fragmentShader.string());
-}
-
-static inline size_t gradientIndex(const ProgramDescription& description) {
- return description.gradientType * 2 + description.isSimpleGradient;
-}
-
-String8 ProgramCache::generateVertexShader(const ProgramDescription& description) {
- // Add attributes
- String8 shader(gVS_Header_Start);
- if (description.hasTexture || description.hasExternalTexture) {
- shader.append(gVS_Header_Attributes_TexCoords);
- }
- if (description.hasVertexAlpha) {
- shader.append(gVS_Header_Attributes_VertexAlphaParameters);
- }
- if (description.hasColors) {
- shader.append(gVS_Header_Attributes_Colors);
- }
- // Uniforms
- shader.append(gVS_Header_Uniforms);
- if (description.hasTextureTransform) {
- shader.append(gVS_Header_Uniforms_TextureTransform);
- }
- if (description.hasGradient) {
- shader.append(gVS_Header_Uniforms_HasGradient);
- }
- if (description.hasBitmap) {
- shader.append(gVS_Header_Uniforms_HasBitmap);
- }
- if (description.hasRoundRectClip) {
- shader.append(gVS_Header_Uniforms_HasRoundRectClip);
- }
- // Varyings
- if (description.hasTexture || description.hasExternalTexture) {
- shader.append(gVS_Header_Varyings_HasTexture);
- }
- if (description.hasVertexAlpha) {
- shader.append(gVS_Header_Varyings_HasVertexAlpha);
- }
- if (description.hasColors) {
- shader.append(gVS_Header_Varyings_HasColors);
- }
- if (description.hasGradient) {
- shader.append(gVS_Header_Varyings_HasGradient[gradientIndex(description)]);
- }
- if (description.hasBitmap) {
- shader.append(gVS_Header_Varyings_HasBitmap);
- }
- if (description.hasRoundRectClip) {
- shader.append(gVS_Header_Varyings_HasRoundRectClip);
- }
-
- // Begin the shader
- shader.append(gVS_Main);
- {
- if (description.hasTextureTransform) {
- shader.append(gVS_Main_OutTransformedTexCoords);
- } else if (description.hasTexture || description.hasExternalTexture) {
- shader.append(gVS_Main_OutTexCoords);
- }
- if (description.hasVertexAlpha) {
- shader.append(gVS_Main_VertexAlpha);
- }
- if (description.hasColors) {
- shader.append(gVS_Main_OutColors);
- }
- if (description.hasBitmap) {
- shader.append(gVS_Main_OutBitmapTexCoords);
- }
- // Output transformed position
- shader.append(gVS_Main_Position);
- if (description.hasGradient) {
- shader.append(gVS_Main_OutGradient[gradientIndex(description)]);
- }
- if (description.hasRoundRectClip) {
- shader.append(gVS_Main_HasRoundRectClip);
- }
- }
- // End the shader
- shader.append(gVS_Footer);
-
- PROGRAM_LOGD("*** Generated vertex shader:\n\n%s", shader.string());
-
- return shader;
-}
-
-static bool shaderOp(const ProgramDescription& description, String8& shader, const int modulateOp,
- const char** snippets) {
- int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp;
- op = op * 2 + description.hasGammaCorrection;
- shader.append(snippets[op]);
- return description.hasAlpha8Texture;
-}
-
-String8 ProgramCache::generateFragmentShader(const ProgramDescription& description) {
- String8 shader(gFS_Header_Start);
-
- const bool blendFramebuffer = description.framebufferMode >= SkBlendMode::kPlus;
- if (blendFramebuffer) {
- shader.append(gFS_Header_Extension_FramebufferFetch);
- }
- if (description.hasExternalTexture ||
- (description.hasBitmap && description.isShaderBitmapExternal)) {
- shader.append(gFS_Header_Extension_ExternalTexture);
- }
-
- shader.append(gFS_Header);
-
- // Varyings
- if (description.hasTexture || description.hasExternalTexture) {
- shader.append(gVS_Header_Varyings_HasTexture);
- }
- if (description.hasVertexAlpha) {
- shader.append(gVS_Header_Varyings_HasVertexAlpha);
- }
- if (description.hasColors) {
- shader.append(gVS_Header_Varyings_HasColors);
- }
- if (description.hasGradient) {
- shader.append(gVS_Header_Varyings_HasGradient[gradientIndex(description)]);
- }
- if (description.hasBitmap) {
- shader.append(gVS_Header_Varyings_HasBitmap);
- }
- if (description.hasRoundRectClip) {
- shader.append(gVS_Header_Varyings_HasRoundRectClip);
- }
-
- // Uniforms
- int modulateOp = MODULATE_OP_NO_MODULATE;
- const bool singleColor = !description.hasTexture && !description.hasExternalTexture &&
- !description.hasGradient && !description.hasBitmap;
-
- if (description.modulate || singleColor) {
- shader.append(gFS_Uniforms_Color);
- if (!singleColor) modulateOp = MODULATE_OP_MODULATE;
- }
- if (description.hasTexture || description.useShadowAlphaInterp) {
- shader.append(gFS_Uniforms_TextureSampler);
- } else if (description.hasExternalTexture) {
- shader.append(gFS_Uniforms_ExternalTextureSampler);
- }
- if (description.hasGradient) {
- shader.append(gFS_Uniforms_GradientSampler[description.isSimpleGradient]);
- }
- if (description.hasRoundRectClip) {
- shader.append(gFS_Uniforms_HasRoundRectClip);
- }
-
- if (description.hasGammaCorrection) {
- shader.appendFormat(gFS_Gamma_Preamble, Properties::textGamma,
- 1.0f / Properties::textGamma);
- }
-
- if (description.hasBitmap) {
- if (description.isShaderBitmapExternal) {
- shader.append(gFS_Uniforms_BitmapExternalSampler);
- } else {
- shader.append(gFS_Uniforms_BitmapSampler);
- }
- }
- shader.append(gFS_Uniforms_ColorOp[static_cast<int>(description.colorOp)]);
-
- if (description.hasColorSpaceConversion) {
- shader.append(gFS_Uniforms_ColorSpaceConversion);
- }
- shader.append(gFS_Uniforms_TransferFunction[static_cast<int>(description.transferFunction)]);
-
- // Generate required functions
- if (description.hasGradient && description.hasBitmap) {
- generateBlend(shader, "blendShaders", description.shadersMode);
- }
- if (description.colorOp == ProgramDescription::ColorFilterMode::Blend) {
- generateBlend(shader, "blendColors", description.colorMode);
- }
- if (blendFramebuffer) {
- generateBlend(shader, "blendFramebuffer", description.framebufferMode);
- }
- if (description.useShaderBasedWrap) {
- generateTextureWrap(shader, description.bitmapWrapS, description.bitmapWrapT);
- }
- if (description.hasGradient || description.hasLinearTexture ||
- description.hasColorSpaceConversion) {
- shader.append(gFS_sRGB_TransferFunctions);
- }
- if (description.hasBitmap || ((description.hasTexture || description.hasExternalTexture) &&
- !description.hasAlpha8Texture)) {
- shader.append(gFS_TransferFunction[static_cast<int>(description.transferFunction)]);
- shader.append(
- gFS_OETF[(description.hasLinearTexture || description.hasColorSpaceConversion) &&
- !mHasLinearBlending]);
- shader.append(gFS_ColorConvert[description.hasColorSpaceConversion
- ? 1 + description.hasTranslucentConversion
- : 0]);
- }
- if (description.hasGradient) {
- shader.append(gFS_GradientFunctions);
- shader.append(gFS_GradientPreamble[mHasLinearBlending]);
- }
-
- // Begin the shader
- shader.append(gFS_Main);
- {
- // Stores the result in fragColor directly
- if (description.hasTexture || description.hasExternalTexture) {
- if (description.hasAlpha8Texture) {
- if (!description.hasGradient && !description.hasBitmap) {
- shader.append(gFS_Main_FetchA8Texture[modulateOp * 2 +
- description.hasGammaCorrection]);
- }
- } else {
- shader.append(gFS_Main_FetchTexture[modulateOp]);
- }
- } else {
- if (!description.hasGradient && !description.hasBitmap) {
- shader.append(gFS_Main_FetchColor);
- }
- }
- if (description.hasGradient) {
- shader.append(gFS_Main_FetchGradient[gradientIndex(description)]);
- }
- if (description.hasBitmap) {
- if (!description.useShaderBasedWrap) {
- shader.append(gFS_Main_FetchBitmap);
- } else {
- shader.append(gFS_Main_FetchBitmapNpot);
- }
- }
- bool applyModulate = false;
- // Case when we have two shaders set
- if (description.hasGradient && description.hasBitmap) {
- if (description.isBitmapFirst) {
- shader.append(gFS_Main_BlendShadersBG);
- } else {
- shader.append(gFS_Main_BlendShadersGB);
- }
- applyModulate =
- shaderOp(description, shader, modulateOp, gFS_Main_BlendShaders_Modulate);
- } else {
- if (description.hasGradient) {
- applyModulate =
- shaderOp(description, shader, modulateOp, gFS_Main_GradientShader_Modulate);
- } else if (description.hasBitmap) {
- applyModulate =
- shaderOp(description, shader, modulateOp, gFS_Main_BitmapShader_Modulate);
- }
- }
-
- if (description.modulate && applyModulate) {
- shader.append(gFS_Main_ModulateColor);
- }
-
- // Apply the color op if needed
- shader.append(gFS_Main_ApplyColorOp[static_cast<int>(description.colorOp)]);
-
- if (description.hasVertexAlpha) {
- if (description.useShadowAlphaInterp) {
- shader.append(gFS_Main_ApplyVertexAlphaShadowInterp);
- } else {
- shader.append(gFS_Main_ApplyVertexAlphaLinearInterp);
- }
- }
-
- if (description.hasGradient) {
- shader.append(gFS_Main_AddDither);
- }
-
- // Output the fragment
- if (!blendFramebuffer) {
- shader.append(gFS_Main_FragColor);
- } else {
- shader.append(!description.swapSrcDst ? gFS_Main_FragColor_Blend
- : gFS_Main_FragColor_Blend_Swap);
- }
- if (description.hasColors) {
- shader.append(gFS_Main_FragColor_HasColors);
- }
- if (description.hasRoundRectClip) {
- shader.append(gFS_Main_FragColor_HasRoundRectClip);
- }
- if (description.hasDebugHighlight) {
- shader.append(gFS_Main_DebugHighlight);
- }
- }
- // End the shader
- shader.append(gFS_Footer);
-
-#if DEBUG_PROGRAMS
- PROGRAM_LOGD("*** Generated fragment shader:\n\n");
- printLongString(shader);
-#endif
-
- return shader;
-}
-
-void ProgramCache::generateBlend(String8& shader, const char* name, SkBlendMode mode) {
- shader.append("\nvec4 ");
- shader.append(name);
- shader.append("(vec4 src, vec4 dst) {\n");
- shader.append(" ");
- shader.append(gBlendOps[(int)mode]);
- shader.append("}\n");
-}
-
-void ProgramCache::generateTextureWrap(String8& shader, GLenum wrapS, GLenum wrapT) {
- shader.append("\nhighp vec2 wrap(highp vec2 texCoords) {\n");
- if (wrapS == GL_MIRRORED_REPEAT) {
- shader.append(" highp float xMod2 = mod(texCoords.x, 2.0);\n");
- shader.append(" if (xMod2 > 1.0) xMod2 = 2.0 - xMod2;\n");
- }
- if (wrapT == GL_MIRRORED_REPEAT) {
- shader.append(" highp float yMod2 = mod(texCoords.y, 2.0);\n");
- shader.append(" if (yMod2 > 1.0) yMod2 = 2.0 - yMod2;\n");
- }
- shader.append(" return vec2(");
- switch (wrapS) {
- case GL_CLAMP_TO_EDGE:
- shader.append("texCoords.x");
- break;
- case GL_REPEAT:
- shader.append("mod(texCoords.x, 1.0)");
- break;
- case GL_MIRRORED_REPEAT:
- shader.append("xMod2");
- break;
- }
- shader.append(", ");
- switch (wrapT) {
- case GL_CLAMP_TO_EDGE:
- shader.append("texCoords.y");
- break;
- case GL_REPEAT:
- shader.append("mod(texCoords.y, 1.0)");
- break;
- case GL_MIRRORED_REPEAT:
- shader.append("yMod2");
- break;
- }
- shader.append(");\n");
- shader.append("}\n");
-}
-
-void ProgramCache::printLongString(const String8& shader) const {
- ssize_t index = 0;
- ssize_t lastIndex = 0;
- const char* str = shader.string();
- while ((index = shader.find("\n", index)) > -1) {
- String8 line(str, index - lastIndex);
- if (line.length() == 0) line.append("\n");
- ALOGD("%s", line.string());
- index++;
- str += (index - lastIndex);
- lastIndex = index;
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/ProgramCache.h b/libs/hwui/ProgramCache.h
deleted file mode 100644
index 488a4994ba95..000000000000
--- a/libs/hwui/ProgramCache.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_PROGRAM_CACHE_H
-#define ANDROID_HWUI_PROGRAM_CACHE_H
-
-#include <utils/KeyedVector.h>
-#include <utils/Log.h>
-#include <utils/String8.h>
-#include <map>
-
-#include <GLES2/gl2.h>
-
-#include "Debug.h"
-#include "Program.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache
-///////////////////////////////////////////////////////////////////////////////
-
-/**
- * Generates and caches program. Programs are generated based on
- * ProgramDescriptions.
- */
-class ProgramCache {
-public:
- explicit ProgramCache(const Extensions& extensions);
- ~ProgramCache();
-
- Program* get(const ProgramDescription& description);
-
- void clear();
-
-private:
- Program* generateProgram(const ProgramDescription& description, programid key);
- String8 generateVertexShader(const ProgramDescription& description);
- String8 generateFragmentShader(const ProgramDescription& description);
- void generateBlend(String8& shader, const char* name, SkBlendMode mode);
- void generateTextureWrap(String8& shader, GLenum wrapS, GLenum wrapT);
-
- void printLongString(const String8& shader) const;
-
- std::map<programid, std::unique_ptr<Program>> mCache;
-
- const bool mHasES3;
- const bool mHasLinearBlending;
-}; // class ProgramCache
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_PROGRAM_CACHE_H
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index 0a6c45beedf9..17bec1934490 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -17,6 +17,7 @@
#include "Properties.h"
#include "Debug.h"
#include "DeviceInfo.h"
+#include "SkTraceEventCommon.h"
#include <algorithm>
#include <cstdlib>
@@ -59,6 +60,7 @@ bool Properties::forceDrawFrame = false;
bool Properties::filterOutTestOverhead = false;
bool Properties::disableVsync = false;
bool Properties::skpCaptureEnabled = false;
+bool Properties::forceDarkMode = false;
bool Properties::enableRTAnimations = true;
bool Properties::runningInEmulator = false;
@@ -140,8 +142,13 @@ bool Properties::load() {
skpCaptureEnabled = debuggingEnabled && property_get_bool(PROPERTY_CAPTURE_SKP_ENABLED, false);
+ SkAndroidFrameworkTraceUtil::setEnableTracing(
+ property_get_bool(PROPERTY_SKIA_ATRACE_ENABLED, false));
+
runningInEmulator = property_get_bool(PROPERTY_QEMU_KERNEL, false);
+ forceDarkMode = property_get_bool(PROPERTY_FORCE_DARK, false);
+
return (prevDebugLayersUpdates != debugLayersUpdates) || (prevDebugOverdraw != debugOverdraw) ||
(prevDebugStencilClip != debugStencilClip);
}
@@ -191,15 +198,12 @@ RenderPipelineType Properties::getRenderPipelineType() {
}
char prop[PROPERTY_VALUE_MAX];
property_get(PROPERTY_RENDERER, prop, "skiagl");
- if (!strcmp(prop, "skiagl")) {
- ALOGD("Skia GL Pipeline");
- sRenderPipelineType = RenderPipelineType::SkiaGL;
- } else if (!strcmp(prop, "skiavk")) {
+ if (!strcmp(prop, "skiavk")) {
ALOGD("Skia Vulkan Pipeline");
sRenderPipelineType = RenderPipelineType::SkiaVulkan;
- } else { //"opengl"
- ALOGD("HWUI GL Pipeline");
- sRenderPipelineType = RenderPipelineType::OpenGL;
+ } else { //"skiagl"
+ ALOGD("Skia GL Pipeline");
+ sRenderPipelineType = RenderPipelineType::SkiaGL;
}
return sRenderPipelineType;
}
@@ -216,10 +220,5 @@ void Properties::overrideRenderPipelineType(RenderPipelineType type) {
sRenderPipelineType = type;
}
-bool Properties::isSkiaEnabled() {
- auto renderType = getRenderPipelineType();
- return RenderPipelineType::SkiaGL == renderType || RenderPipelineType::SkiaVulkan == renderType;
-}
-
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 764c50259540..ea017a72cd74 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -171,6 +171,11 @@ enum DebugLevel {
#define PROPERTY_CAPTURE_SKP_ENABLED "debug.hwui.capture_skp_enabled"
/**
+ * Allows to record Skia drawing commands with systrace.
+ */
+#define PROPERTY_SKIA_ATRACE_ENABLED "debug.hwui.skia_atrace_enabled"
+
+/**
* Defines how many frames in a sequence to capture.
*/
#define PROPERTY_CAPTURE_SKP_FRAMES "debug.hwui.capture_skp_frames"
@@ -185,6 +190,8 @@ enum DebugLevel {
*/
#define PROPERTY_QEMU_KERNEL "ro.kernel.qemu"
+#define PROPERTY_FORCE_DARK "debug.hwui.force_dark"
+
///////////////////////////////////////////////////////////////////////////////
// Misc
///////////////////////////////////////////////////////////////////////////////
@@ -200,7 +207,7 @@ enum class OverdrawColorSet { Default = 0, Deuteranomaly };
enum class StencilClipDebug { Hide, ShowHighlight, ShowRegion };
-enum class RenderPipelineType { OpenGL = 0, SkiaGL, SkiaVulkan, NotInitialized = 128 };
+enum class RenderPipelineType { SkiaGL, SkiaVulkan, NotInitialized = 128 };
/**
* Renderthread-only singleton which manages several static rendering properties. Most of these
@@ -240,7 +247,6 @@ public:
static ProfileType getProfileType();
ANDROID_API static RenderPipelineType getRenderPipelineType();
- static bool isSkiaEnabled();
ANDROID_API static bool enableHighContrastText;
@@ -259,6 +265,7 @@ public:
static bool disableVsync;
static bool skpCaptureEnabled;
+ static bool forceDarkMode;
// For experimentation b/68769804
ANDROID_API static bool enableRTAnimations;
diff --git a/libs/hwui/RecordedOp.h b/libs/hwui/RecordedOp.h
deleted file mode 100644
index 2d0185aaa9e2..000000000000
--- a/libs/hwui/RecordedOp.h
+++ /dev/null
@@ -1,500 +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.
- */
-
-#pragma once
-
-#include "GlLayer.h"
-#include "Matrix.h"
-#include "Rect.h"
-#include "RenderNode.h"
-#include "TessellationCache.h"
-#include "Vector.h"
-#include "font/FontUtil.h"
-#include "utils/LinearAllocator.h"
-#include "utils/PaintUtils.h"
-
-#include <androidfw/ResourceTypes.h>
-
-class SkBitmap;
-class SkPaint;
-
-namespace android {
-namespace uirenderer {
-
-struct ClipBase;
-class OffscreenBuffer;
-class RenderNode;
-class DeferredLayerUpdater;
-
-struct Vertex;
-
-namespace VectorDrawable {
-class Tree;
-}
-
-/**
- * Authoritative op list, used for generating the op ID enum, ID based LUTS, and
- * the functions to which they dispatch. Parameter macros are executed for each op,
- * in order, based on the op's type.
- *
- * There are 4 types of op, which defines dispatch/LUT capability:
- *
- * | DisplayList | Render | Merge |
- * -------------|-------------|-------------|-------------|
- * PRE RENDER | Yes | | |
- * RENDER ONLY | | Yes | |
- * UNMERGEABLE | Yes | Yes | |
- * MERGEABLE | Yes | Yes | Yes |
- *
- * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This
- * may be because they need to be transformed into other op types (e.g. CirclePropsOp),
- * be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they
- * modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps).
- *
- * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly
- * constructed from other commands/RenderNode properties. They cannot be merged.
- *
- * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not
- * support merged rendering.
- *
- * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged
- * under certain circumstances.
- */
-#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, \
- MERGEABLE_OP_FN) \
- PRE_RENDER_OP_FN(RenderNodeOp) \
- PRE_RENDER_OP_FN(CirclePropsOp) \
- PRE_RENDER_OP_FN(RoundRectPropsOp) \
- PRE_RENDER_OP_FN(BeginLayerOp) \
- PRE_RENDER_OP_FN(EndLayerOp) \
- PRE_RENDER_OP_FN(BeginUnclippedLayerOp) \
- PRE_RENDER_OP_FN(EndUnclippedLayerOp) \
- PRE_RENDER_OP_FN(VectorDrawableOp) \
- \
- RENDER_ONLY_OP_FN(ShadowOp) \
- RENDER_ONLY_OP_FN(LayerOp) \
- RENDER_ONLY_OP_FN(CopyToLayerOp) \
- RENDER_ONLY_OP_FN(CopyFromLayerOp) \
- \
- UNMERGEABLE_OP_FN(ArcOp) \
- UNMERGEABLE_OP_FN(BitmapMeshOp) \
- UNMERGEABLE_OP_FN(BitmapRectOp) \
- UNMERGEABLE_OP_FN(ColorOp) \
- UNMERGEABLE_OP_FN(FunctorOp) \
- UNMERGEABLE_OP_FN(LinesOp) \
- UNMERGEABLE_OP_FN(OvalOp) \
- UNMERGEABLE_OP_FN(PathOp) \
- UNMERGEABLE_OP_FN(PointsOp) \
- UNMERGEABLE_OP_FN(RectOp) \
- UNMERGEABLE_OP_FN(RoundRectOp) \
- UNMERGEABLE_OP_FN(SimpleRectsOp) \
- UNMERGEABLE_OP_FN(TextOnPathOp) \
- UNMERGEABLE_OP_FN(TextureLayerOp) \
- \
- MERGEABLE_OP_FN(BitmapOp) \
- MERGEABLE_OP_FN(PatchOp) \
- MERGEABLE_OP_FN(TextOp)
-
-/**
- * LUT generators, which will insert nullptr for unsupported ops
- */
-#define NULLPTR_OP_FN(Type) nullptr,
-
-#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \
- { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) }
-
-#define BUILD_MERGEABLE_OP_LUT(OP_FN) \
- { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) }
-
-#define BUILD_RENDERABLE_OP_LUT(OP_FN) \
- { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) }
-
-#define BUILD_FULL_OP_LUT(OP_FN) \
- { MAP_OPS_BASED_ON_TYPE(OP_FN, OP_FN, OP_FN, OP_FN) }
-
-/**
- * Op mapping functions, which skip unsupported ops.
- *
- * Note: Do not use for LUTS, since these do not preserve ID order.
- */
-#define NULL_OP_FN(Type)
-
-#define MAP_DEFERRABLE_OPS(OP_FN) MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN)
-
-#define MAP_MERGEABLE_OPS(OP_FN) MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN)
-
-#define MAP_RENDERABLE_OPS(OP_FN) MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, OP_FN, OP_FN, OP_FN)
-
-// Generate OpId enum
-#define IDENTITY_FN(Type) Type,
-namespace RecordedOpId {
-enum {
- MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN) Count,
-};
-}
-static_assert(RecordedOpId::RenderNodeOp == 0, "First index must be zero for LUTs to work");
-
-#define BASE_PARAMS \
- const Rect &unmappedBounds, const Matrix4 &localMatrix, const ClipBase *localClip, \
- const SkPaint *paint
-#define BASE_PARAMS_PAINTLESS \
- const Rect &unmappedBounds, const Matrix4 &localMatrix, const ClipBase *localClip
-#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint)
-#define SUPER_PAINTLESS(Type) \
- RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr)
-
-struct RecordedOp {
- /* ID from RecordedOpId - generally used for jumping into function tables */
- const int opId;
-
- /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */
- const Rect unmappedBounds;
-
- /* transform in recording space (vs DisplayList origin) */
- const Matrix4 localMatrix;
-
- /* clip in recording space - nullptr if not clipped */
- const ClipBase* localClip;
-
- /* optional paint, stored in base object to simplify merging logic */
- const SkPaint* paint;
-
-protected:
- RecordedOp(unsigned int opId, BASE_PARAMS)
- : opId(opId)
- , unmappedBounds(unmappedBounds)
- , localMatrix(localMatrix)
- , localClip(localClip)
- , paint(paint) {}
-};
-
-struct RenderNodeOp : RecordedOp {
- RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
- : SUPER_PAINTLESS(RenderNodeOp), renderNode(renderNode) {}
- RenderNode* renderNode; // not const, since drawing modifies it
-
- /**
- * Holds the transformation between the projection surface ViewGroup and this RenderNode
- * drawing instance. Represents any translations / transformations done within the drawing of
- * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this
- * DisplayList draw instance.
- *
- * Note: doesn't include transformation within the RenderNode, or its properties.
- */
- Matrix4 transformFromCompositingAncestor;
- bool skipInOrderDraw = false;
-};
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Standard Ops
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-struct ArcOp : RecordedOp {
- ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter)
- : SUPER(ArcOp), startAngle(startAngle), sweepAngle(sweepAngle), useCenter(useCenter) {}
- const float startAngle;
- const float sweepAngle;
- const bool useCenter;
-};
-
-struct BitmapOp : RecordedOp {
- BitmapOp(BASE_PARAMS, Bitmap* bitmap) : SUPER(BitmapOp), bitmap(bitmap) {}
- Bitmap* bitmap;
-};
-
-struct BitmapMeshOp : RecordedOp {
- BitmapMeshOp(BASE_PARAMS, Bitmap* bitmap, int meshWidth, int meshHeight, const float* vertices,
- const int* colors)
- : SUPER(BitmapMeshOp)
- , bitmap(bitmap)
- , meshWidth(meshWidth)
- , meshHeight(meshHeight)
- , vertices(vertices)
- , colors(colors) {}
- Bitmap* bitmap;
- const int meshWidth;
- const int meshHeight;
- const float* vertices;
- const int* colors;
-};
-
-struct BitmapRectOp : RecordedOp {
- BitmapRectOp(BASE_PARAMS, Bitmap* bitmap, const Rect& src)
- : SUPER(BitmapRectOp), bitmap(bitmap), src(src) {}
- Bitmap* bitmap;
- const Rect src;
-};
-
-struct CirclePropsOp : RecordedOp {
- CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
- float* x, float* y, float* radius)
- : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint)
- , x(x)
- , y(y)
- , radius(radius) {}
- const float* x;
- const float* y;
- const float* radius;
-};
-
-struct ColorOp : RecordedOp {
- // Note: unbounded op that will fillclip, so no bounds/matrix needed
- ColorOp(const ClipBase* localClip, int color, SkBlendMode mode)
- : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr)
- , color(color)
- , mode(mode) {}
- const int color;
- const SkBlendMode mode;
-};
-
-struct FunctorOp : RecordedOp {
- // Note: undefined record-time bounds, since this op fills the clip
- // TODO: explicitly define bounds
- FunctorOp(const Matrix4& localMatrix, const ClipBase* localClip, Functor* functor)
- : RecordedOp(RecordedOpId::FunctorOp, Rect(), localMatrix, localClip, nullptr)
- , functor(functor) {}
- Functor* functor;
-};
-
-struct LinesOp : RecordedOp {
- LinesOp(BASE_PARAMS, const float* points, const int floatCount)
- : SUPER(LinesOp), points(points), floatCount(floatCount) {}
- const float* points;
- const int floatCount;
-};
-
-struct OvalOp : RecordedOp {
- OvalOp(BASE_PARAMS) : SUPER(OvalOp) {}
-};
-
-struct PatchOp : RecordedOp {
- PatchOp(BASE_PARAMS, Bitmap* bitmap, const Res_png_9patch* patch)
- : SUPER(PatchOp), bitmap(bitmap), patch(patch) {}
- Bitmap* bitmap;
- const Res_png_9patch* patch;
-};
-
-struct PathOp : RecordedOp {
- PathOp(BASE_PARAMS, const SkPath* path) : SUPER(PathOp), path(path) {}
- const SkPath* path;
-};
-
-struct PointsOp : RecordedOp {
- PointsOp(BASE_PARAMS, const float* points, const int floatCount)
- : SUPER(PointsOp), points(points), floatCount(floatCount) {}
- const float* points;
- const int floatCount;
-};
-
-struct RectOp : RecordedOp {
- RectOp(BASE_PARAMS) : SUPER(RectOp) {}
-};
-
-struct RoundRectOp : RecordedOp {
- RoundRectOp(BASE_PARAMS, float rx, float ry) : SUPER(RoundRectOp), rx(rx), ry(ry) {}
- const float rx;
- const float ry;
-};
-
-struct RoundRectPropsOp : RecordedOp {
- RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
- float* left, float* top, float* right, float* bottom, float* rx, float* ry)
- : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint)
- , left(left)
- , top(top)
- , right(right)
- , bottom(bottom)
- , rx(rx)
- , ry(ry) {}
- const float* left;
- const float* top;
- const float* right;
- const float* bottom;
- const float* rx;
- const float* ry;
-};
-
-struct VectorDrawableOp : RecordedOp {
- VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS)
- : SUPER_PAINTLESS(VectorDrawableOp), vectorDrawable(tree) {}
- VectorDrawable::Tree* vectorDrawable;
-};
-
-/**
- * Real-time, dynamic-lit shadow.
- *
- * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time,
- * and are resolved dynamically, and transform isn't needed.
- *
- * State construction handles these properties specially, ignoring matrix/bounds.
- */
-struct ShadowOp : RecordedOp {
- ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha)
- : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr)
- , shadowTask(shadowTask)
- , casterAlpha(casterAlpha){};
- sp<TessellationCache::ShadowTask> shadowTask;
- const float casterAlpha;
-};
-
-struct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?)
- SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
- : SUPER(SimpleRectsOp), vertices(vertices), vertexCount(vertexCount) {}
- Vertex* vertices;
- const size_t vertexCount;
-};
-
-struct TextOp : RecordedOp {
- TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, float x,
- float y)
- : SUPER(TextOp)
- , glyphs(glyphs)
- , positions(positions)
- , glyphCount(glyphCount)
- , x(x)
- , y(y) {}
- const glyph_t* glyphs;
- const float* positions;
- const int glyphCount;
- const float x;
- const float y;
-};
-
-struct TextOnPathOp : RecordedOp {
- // TODO: explicitly define bounds
- TextOnPathOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
- const glyph_t* glyphs, int glyphCount, const SkPath* path, float hOffset,
- float vOffset)
- : RecordedOp(RecordedOpId::TextOnPathOp, Rect(), localMatrix, localClip, paint)
- , glyphs(glyphs)
- , glyphCount(glyphCount)
- , path(path)
- , hOffset(hOffset)
- , vOffset(vOffset) {}
- const glyph_t* glyphs;
- const int glyphCount;
-
- const SkPath* path;
- const float hOffset;
- const float vOffset;
-};
-
-struct TextureLayerOp : RecordedOp {
- TextureLayerOp(BASE_PARAMS_PAINTLESS, DeferredLayerUpdater* layer)
- : SUPER_PAINTLESS(TextureLayerOp), layerHandle(layer) {}
-
- // Copy an existing TextureLayerOp, replacing the underlying matrix
- TextureLayerOp(const TextureLayerOp& op, const Matrix4& replacementMatrix)
- : RecordedOp(RecordedOpId::TextureLayerOp, op.unmappedBounds, replacementMatrix,
- op.localClip, op.paint)
- , layerHandle(op.layerHandle) {}
- DeferredLayerUpdater* layerHandle;
-};
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// Layers
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * Stateful operation! denotes the creation of an off-screen layer,
- * and that commands following will render into it.
- */
-struct BeginLayerOp : RecordedOp {
- BeginLayerOp(BASE_PARAMS) : SUPER(BeginLayerOp) {}
-};
-
-/**
- * Stateful operation! Denotes end of off-screen layer, and that
- * commands since last BeginLayerOp should be drawn into parent FBO.
- *
- * State in this op is empty, it just serves to signal that a layer has been finished.
- */
-struct EndLayerOp : RecordedOp {
- EndLayerOp()
- : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {}
-};
-
-struct BeginUnclippedLayerOp : RecordedOp {
- BeginUnclippedLayerOp(BASE_PARAMS) : SUPER(BeginUnclippedLayerOp) {}
-};
-
-struct EndUnclippedLayerOp : RecordedOp {
- EndUnclippedLayerOp()
- : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr,
- nullptr) {}
-};
-
-struct CopyToLayerOp : RecordedOp {
- CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle)
- : RecordedOp(RecordedOpId::CopyToLayerOp, op.unmappedBounds, op.localMatrix,
- nullptr, // clip intentionally ignored
- op.paint)
- , layerHandle(layerHandle) {}
-
- // Records a handle to the Layer object, since the Layer itself won't be
- // constructed until after this operation is constructed.
- OffscreenBuffer** layerHandle;
-};
-
-// draw the parameter layer underneath
-struct CopyFromLayerOp : RecordedOp {
- CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle)
- : RecordedOp(RecordedOpId::CopyFromLayerOp, op.unmappedBounds, op.localMatrix,
- nullptr, // clip intentionally ignored
- op.paint)
- , layerHandle(layerHandle) {}
-
- // Records a handle to the Layer object, since the Layer itself won't be
- // constructed until after this operation is constructed.
- OffscreenBuffer** layerHandle;
-};
-
-/**
- * Draws an OffscreenBuffer.
- *
- * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated,
- * when creating/tracking a SkPaint* during defer isn't worth the bother.
- */
-struct LayerOp : RecordedOp {
- // Records a one-use (saveLayer) layer for drawing.
- LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle)
- : SUPER_PAINTLESS(LayerOp)
- , layerHandle(layerHandle)
- , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f)
- , mode(PaintUtils::getBlendModeDirect(paint))
- , colorFilter(paint ? paint->getColorFilter() : nullptr) {}
-
- explicit LayerOp(RenderNode& node)
- : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()),
- Matrix4::identity(), nullptr, nullptr)
- , layerHandle(node.getLayerHandle())
- , alpha(node.properties().layerProperties().alpha() / 255.0f)
- , mode(node.properties().layerProperties().xferMode())
- , colorFilter(node.properties().layerProperties().colorFilter()) {}
-
- // Records a handle to the Layer object, since the Layer itself won't be
- // constructed until after this operation is constructed.
- OffscreenBuffer** layerHandle;
- const float alpha;
- const SkBlendMode mode;
-
- // pointer to object owned by either LayerProperties, or a recorded Paint object in a
- // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used.
- SkColorFilter* colorFilter;
-};
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp
deleted file mode 100644
index e1df1e7725b5..000000000000
--- a/libs/hwui/RecordingCanvas.cpp
+++ /dev/null
@@ -1,631 +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.
- */
-
-#include "RecordingCanvas.h"
-
-#include "DeferredLayerUpdater.h"
-#include "RecordedOp.h"
-#include "RenderNode.h"
-#include "VectorDrawable.h"
-#include "hwui/MinikinUtils.h"
-
-namespace android {
-namespace uirenderer {
-
-RecordingCanvas::RecordingCanvas(size_t width, size_t height)
- : mState(*this), mResourceCache(ResourceCache::getInstance()) {
- resetRecording(width, height);
-}
-
-RecordingCanvas::~RecordingCanvas() {
- LOG_ALWAYS_FATAL_IF(mDisplayList, "Destroyed a RecordingCanvas during a record!");
-}
-
-void RecordingCanvas::resetRecording(int width, int height, RenderNode* node) {
- LOG_ALWAYS_FATAL_IF(mDisplayList, "prepareDirty called a second time during a recording!");
- mDisplayList = new DisplayList();
-
- mState.initializeRecordingSaveStack(width, height);
-
- mDeferredBarrierType = DeferredBarrierType::InOrder;
-}
-
-DisplayList* RecordingCanvas::finishRecording() {
- restoreToCount(1);
- mPaintMap.clear();
- mRegionMap.clear();
- mPathMap.clear();
- DisplayList* displayList = mDisplayList;
- mDisplayList = nullptr;
- mSkiaCanvasProxy.reset(nullptr);
- return displayList;
-}
-
-void RecordingCanvas::insertReorderBarrier(bool enableReorder) {
- if (enableReorder) {
- mDeferredBarrierType = DeferredBarrierType::OutOfOrder;
- mDeferredBarrierClip = getRecordedClip();
- } else {
- mDeferredBarrierType = DeferredBarrierType::InOrder;
- mDeferredBarrierClip = nullptr;
- }
-}
-
-SkCanvas* RecordingCanvas::asSkCanvas() {
- LOG_ALWAYS_FATAL_IF(!mDisplayList, "attempting to get an SkCanvas when we are not recording!");
- if (!mSkiaCanvasProxy) {
- mSkiaCanvasProxy.reset(new SkiaCanvasProxy(this));
- }
-
- // SkCanvas instances default to identity transform, but should inherit
- // the state of this Canvas; if this code was in the SkiaCanvasProxy
- // constructor, we couldn't cache mSkiaCanvasProxy.
- SkMatrix parentTransform;
- getMatrix(&parentTransform);
- mSkiaCanvasProxy.get()->setMatrix(parentTransform);
-
- return mSkiaCanvasProxy.get();
-}
-
-// ----------------------------------------------------------------------------
-// CanvasStateClient implementation
-// ----------------------------------------------------------------------------
-
-void RecordingCanvas::onViewportInitialized() {}
-
-void RecordingCanvas::onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {
- if (removed.flags & Snapshot::kFlagIsFboLayer) {
- addOp(alloc().create_trivial<EndLayerOp>());
- } else if (removed.flags & Snapshot::kFlagIsLayer) {
- addOp(alloc().create_trivial<EndUnclippedLayerOp>());
- }
-}
-
-// ----------------------------------------------------------------------------
-// android/graphics/Canvas state operations
-// ----------------------------------------------------------------------------
-// Save (layer)
-int RecordingCanvas::save(SaveFlags::Flags flags) {
- return mState.save((int)flags);
-}
-
-void RecordingCanvas::RecordingCanvas::restore() {
- mState.restore();
-}
-
-void RecordingCanvas::restoreToCount(int saveCount) {
- mState.restoreToCount(saveCount);
-}
-
-int RecordingCanvas::saveLayer(float left, float top, float right, float bottom,
- const SkPaint* paint, SaveFlags::Flags flags) {
- // force matrix/clip isolation for layer
- flags |= SaveFlags::MatrixClip;
- bool clippedLayer = flags & SaveFlags::ClipToLayer;
-
- const Snapshot& previous = *mState.currentSnapshot();
-
- // initialize the snapshot as though it almost represents an FBO layer so deferred draw
- // operations will be able to store and restore the current clip and transform info, and
- // quick rejection will be correct (for display lists)
-
- Rect unmappedBounds(left, top, right, bottom);
- unmappedBounds.roundOut();
-
- // determine clipped bounds relative to previous viewport.
- Rect visibleBounds = unmappedBounds;
- previous.transform->mapRect(visibleBounds);
-
- if (CC_UNLIKELY(!clippedLayer && previous.transform->rectToRect() &&
- visibleBounds.contains(previous.getRenderTargetClip()))) {
- // unlikely case where an unclipped savelayer is recorded with a clip it can use,
- // as none of its unaffected/unclipped area is visible
- clippedLayer = true;
- flags |= SaveFlags::ClipToLayer;
- }
-
- visibleBounds.doIntersect(previous.getRenderTargetClip());
- visibleBounds.snapToPixelBoundaries();
- visibleBounds.doIntersect(Rect(previous.getViewportWidth(), previous.getViewportHeight()));
-
- // Map visible bounds back to layer space, and intersect with parameter bounds
- Rect layerBounds = visibleBounds;
- if (CC_LIKELY(!layerBounds.isEmpty())) {
- // if non-empty, can safely map by the inverse transform
- Matrix4 inverse;
- inverse.loadInverse(*previous.transform);
- inverse.mapRect(layerBounds);
- layerBounds.doIntersect(unmappedBounds);
- }
-
- int saveValue = mState.save((int)flags);
- Snapshot& snapshot = *mState.writableSnapshot();
-
- // layerBounds is in original bounds space, but clipped by current recording clip
- if (!layerBounds.isEmpty() && !unmappedBounds.isEmpty()) {
- if (CC_LIKELY(clippedLayer)) {
- auto previousClip = getRecordedClip(); // capture before new snapshot clip has changed
- if (addOp(alloc().create_trivial<BeginLayerOp>(
- unmappedBounds,
- *previous.transform, // transform to *draw* with
- previousClip, // clip to *draw* with
- refPaint(paint))) >= 0) {
- snapshot.flags |= Snapshot::kFlagIsLayer | Snapshot::kFlagIsFboLayer;
- snapshot.initializeViewport(unmappedBounds.getWidth(), unmappedBounds.getHeight());
- snapshot.transform->loadTranslate(-unmappedBounds.left, -unmappedBounds.top, 0.0f);
-
- Rect clip = layerBounds;
- clip.translate(-unmappedBounds.left, -unmappedBounds.top);
- snapshot.resetClip(clip.left, clip.top, clip.right, clip.bottom);
- snapshot.roundRectClipState = nullptr;
- return saveValue;
- }
- } else {
- if (addOp(alloc().create_trivial<BeginUnclippedLayerOp>(
- unmappedBounds, *mState.currentSnapshot()->transform, getRecordedClip(),
- refPaint(paint))) >= 0) {
- snapshot.flags |= Snapshot::kFlagIsLayer;
- return saveValue;
- }
- }
- }
-
- // Layer not needed, so skip recording it...
- if (CC_LIKELY(clippedLayer)) {
- // ... and set empty clip to reject inner content, if possible
- snapshot.resetClip(0, 0, 0, 0);
- }
- return saveValue;
-}
-
-// Matrix
-void RecordingCanvas::rotate(float degrees) {
- if (degrees == 0) return;
-
- mState.rotate(degrees);
-}
-
-void RecordingCanvas::scale(float sx, float sy) {
- if (sx == 1 && sy == 1) return;
-
- mState.scale(sx, sy);
-}
-
-void RecordingCanvas::skew(float sx, float sy) {
- mState.skew(sx, sy);
-}
-
-void RecordingCanvas::translate(float dx, float dy) {
- if (dx == 0 && dy == 0) return;
-
- mState.translate(dx, dy, 0);
-}
-
-// Clip
-bool RecordingCanvas::getClipBounds(SkRect* outRect) const {
- *outRect = mState.getLocalClipBounds().toSkRect();
- return !(outRect->isEmpty());
-}
-bool RecordingCanvas::quickRejectRect(float left, float top, float right, float bottom) const {
- return mState.quickRejectConservative(left, top, right, bottom);
-}
-bool RecordingCanvas::quickRejectPath(const SkPath& path) const {
- SkRect bounds = path.getBounds();
- return mState.quickRejectConservative(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
-}
-bool RecordingCanvas::clipRect(float left, float top, float right, float bottom, SkClipOp op) {
- return mState.clipRect(left, top, right, bottom, op);
-}
-bool RecordingCanvas::clipPath(const SkPath* path, SkClipOp op) {
- return mState.clipPath(path, op);
-}
-
-// ----------------------------------------------------------------------------
-// android/graphics/Canvas draw operations
-// ----------------------------------------------------------------------------
-void RecordingCanvas::drawColor(int color, SkBlendMode mode) {
- addOp(alloc().create_trivial<ColorOp>(getRecordedClip(), color, mode));
-}
-
-void RecordingCanvas::drawPaint(const SkPaint& paint) {
- SkRect bounds;
- if (getClipBounds(&bounds)) {
- drawRect(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, paint);
- }
-}
-
-static Rect calcBoundsOfPoints(const float* points, int floatCount) {
- Rect unmappedBounds(points[0], points[1], points[0], points[1]);
- for (int i = 2; i < floatCount; i += 2) {
- unmappedBounds.expandToCover(points[i], points[i + 1]);
- }
- return unmappedBounds;
-}
-
-// Geometry
-void RecordingCanvas::drawPoints(const float* points, int floatCount, const SkPaint& paint) {
- if (CC_UNLIKELY(floatCount < 2 || paint.nothingToDraw())) return;
- floatCount &= ~0x1; // round down to nearest two
-
- addOp(alloc().create_trivial<PointsOp>(
- calcBoundsOfPoints(points, floatCount), *mState.currentSnapshot()->transform,
- getRecordedClip(), refPaint(&paint), refBuffer<float>(points, floatCount), floatCount));
-}
-
-void RecordingCanvas::drawLines(const float* points, int floatCount, const SkPaint& paint) {
- if (CC_UNLIKELY(floatCount < 4 || paint.nothingToDraw())) return;
- floatCount &= ~0x3; // round down to nearest four
-
- addOp(alloc().create_trivial<LinesOp>(
- calcBoundsOfPoints(points, floatCount), *mState.currentSnapshot()->transform,
- getRecordedClip(), refPaint(&paint), refBuffer<float>(points, floatCount), floatCount));
-}
-
-void RecordingCanvas::drawRect(float left, float top, float right, float bottom,
- const SkPaint& paint) {
- if (CC_UNLIKELY(paint.nothingToDraw())) return;
-
- addOp(alloc().create_trivial<RectOp>(Rect(left, top, right, bottom),
- *(mState.currentSnapshot()->transform), getRecordedClip(),
- refPaint(&paint)));
-}
-
-void RecordingCanvas::drawSimpleRects(const float* rects, int vertexCount, const SkPaint* paint) {
- if (rects == nullptr) return;
-
- Vertex* rectData = (Vertex*)mDisplayList->allocator.create_trivial_array<Vertex>(vertexCount);
- Vertex* vertex = rectData;
-
- float left = FLT_MAX;
- float top = FLT_MAX;
- float right = FLT_MIN;
- float bottom = FLT_MIN;
- for (int index = 0; index < vertexCount; index += 4) {
- float l = rects[index + 0];
- float t = rects[index + 1];
- float r = rects[index + 2];
- float b = rects[index + 3];
-
- Vertex::set(vertex++, l, t);
- Vertex::set(vertex++, r, t);
- Vertex::set(vertex++, l, b);
- Vertex::set(vertex++, r, b);
-
- left = std::min(left, l);
- top = std::min(top, t);
- right = std::max(right, r);
- bottom = std::max(bottom, b);
- }
- addOp(alloc().create_trivial<SimpleRectsOp>(
- Rect(left, top, right, bottom), *(mState.currentSnapshot()->transform),
- getRecordedClip(), refPaint(paint), rectData, vertexCount));
-}
-
-void RecordingCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) {
- if (CC_UNLIKELY(paint.nothingToDraw())) return;
-
- if (paint.getStyle() == SkPaint::kFill_Style &&
- (!paint.isAntiAlias() || mState.currentTransform()->isSimple())) {
- int count = 0;
- Vector<float> rects;
- SkRegion::Iterator it(region);
- while (!it.done()) {
- const SkIRect& r = it.rect();
- rects.push(r.fLeft);
- rects.push(r.fTop);
- rects.push(r.fRight);
- rects.push(r.fBottom);
- count += 4;
- it.next();
- }
- drawSimpleRects(rects.array(), count, &paint);
- } else {
- SkRegion::Iterator it(region);
- while (!it.done()) {
- const SkIRect& r = it.rect();
- drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint);
- it.next();
- }
- }
-}
-
-void RecordingCanvas::drawRoundRect(float left, float top, float right, float bottom, float rx,
- float ry, const SkPaint& paint) {
- if (CC_UNLIKELY(paint.nothingToDraw())) return;
-
- if (CC_LIKELY(MathUtils::isPositive(rx) || MathUtils::isPositive(ry))) {
- addOp(alloc().create_trivial<RoundRectOp>(Rect(left, top, right, bottom),
- *(mState.currentSnapshot()->transform),
- getRecordedClip(), refPaint(&paint), rx, ry));
- } else {
- drawRect(left, top, right, bottom, paint);
- }
-}
-
-void RecordingCanvas::drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top,
- CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom,
- CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry,
- CanvasPropertyPaint* paint) {
- mDisplayList->ref(left);
- mDisplayList->ref(top);
- mDisplayList->ref(right);
- mDisplayList->ref(bottom);
- mDisplayList->ref(rx);
- mDisplayList->ref(ry);
- mDisplayList->ref(paint);
- refBitmapsInShader(paint->value.getShader());
- addOp(alloc().create_trivial<RoundRectPropsOp>(
- *(mState.currentSnapshot()->transform), getRecordedClip(), &paint->value, &left->value,
- &top->value, &right->value, &bottom->value, &rx->value, &ry->value));
-}
-
-void RecordingCanvas::drawCircle(float x, float y, float radius, const SkPaint& paint) {
- // TODO: move to Canvas.h
- if (CC_UNLIKELY(radius <= 0 || paint.nothingToDraw())) return;
-
- drawOval(x - radius, y - radius, x + radius, y + radius, paint);
-}
-
-void RecordingCanvas::drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y,
- CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint) {
- mDisplayList->ref(x);
- mDisplayList->ref(y);
- mDisplayList->ref(radius);
- mDisplayList->ref(paint);
- refBitmapsInShader(paint->value.getShader());
- addOp(alloc().create_trivial<CirclePropsOp>(*(mState.currentSnapshot()->transform),
- getRecordedClip(), &paint->value, &x->value,
- &y->value, &radius->value));
-}
-
-void RecordingCanvas::drawOval(float left, float top, float right, float bottom,
- const SkPaint& paint) {
- if (CC_UNLIKELY(paint.nothingToDraw())) return;
-
- addOp(alloc().create_trivial<OvalOp>(Rect(left, top, right, bottom),
- *(mState.currentSnapshot()->transform), getRecordedClip(),
- refPaint(&paint)));
-}
-
-void RecordingCanvas::drawArc(float left, float top, float right, float bottom, float startAngle,
- float sweepAngle, bool useCenter, const SkPaint& paint) {
- if (CC_UNLIKELY(paint.nothingToDraw())) return;
-
- if (fabs(sweepAngle) >= 360.0f) {
- drawOval(left, top, right, bottom, paint);
- } else {
- addOp(alloc().create_trivial<ArcOp>(
- Rect(left, top, right, bottom), *(mState.currentSnapshot()->transform),
- getRecordedClip(), refPaint(&paint), startAngle, sweepAngle, useCenter));
- }
-}
-
-void RecordingCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
- if (CC_UNLIKELY(paint.nothingToDraw())) return;
-
- addOp(alloc().create_trivial<PathOp>(Rect(path.getBounds()),
- *(mState.currentSnapshot()->transform), getRecordedClip(),
- refPaint(&paint), refPath(&path)));
-}
-
-void RecordingCanvas::drawVectorDrawable(VectorDrawableRoot* tree) {
- mDisplayList->ref(tree);
- mDisplayList->vectorDrawables.push_back(tree);
- addOp(alloc().create_trivial<VectorDrawableOp>(
- tree, Rect(tree->stagingProperties()->getBounds()),
- *(mState.currentSnapshot()->transform), getRecordedClip()));
-}
-
-// Bitmap-based
-void RecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) {
- save(SaveFlags::Matrix);
- translate(left, top);
- drawBitmap(bitmap, paint);
- restore();
-}
-
-void RecordingCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const SkPaint* paint) {
- if (matrix.isIdentity()) {
- drawBitmap(bitmap, paint);
- } else if (!(matrix.getType() & ~(SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask)) &&
- MathUtils::isPositive(matrix.getScaleX()) &&
- MathUtils::isPositive(matrix.getScaleY())) {
- // SkMatrix::isScaleTranslate() not available in L
- SkRect src;
- SkRect dst;
- bitmap.getBounds(&src);
- matrix.mapRect(&dst, src);
- drawBitmap(bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom, dst.fLeft, dst.fTop,
- dst.fRight, dst.fBottom, paint);
- } else {
- save(SaveFlags::Matrix);
- concat(matrix);
- drawBitmap(bitmap, paint);
- restore();
- }
-}
-
-void RecordingCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float srcRight,
- float srcBottom, float dstLeft, float dstTop, float dstRight,
- float dstBottom, const SkPaint* paint) {
- if (srcLeft == 0 && srcTop == 0 && srcRight == bitmap.width() && srcBottom == bitmap.height() &&
- (srcBottom - srcTop == dstBottom - dstTop) && (srcRight - srcLeft == dstRight - dstLeft)) {
- // transform simple rect to rect drawing case into position bitmap ops, since they merge
- save(SaveFlags::Matrix);
- translate(dstLeft, dstTop);
- drawBitmap(bitmap, paint);
- restore();
- } else {
- addOp(alloc().create_trivial<BitmapRectOp>(
- Rect(dstLeft, dstTop, dstRight, dstBottom), *(mState.currentSnapshot()->transform),
- getRecordedClip(), refPaint(paint), refBitmap(bitmap),
- Rect(srcLeft, srcTop, srcRight, srcBottom)));
- }
-}
-
-void RecordingCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight,
- const float* vertices, const int* colors,
- const SkPaint* paint) {
- int vertexCount = (meshWidth + 1) * (meshHeight + 1);
- addOp(alloc().create_trivial<BitmapMeshOp>(
- calcBoundsOfPoints(vertices, vertexCount * 2), *(mState.currentSnapshot()->transform),
- getRecordedClip(), refPaint(paint), refBitmap(bitmap), meshWidth, meshHeight,
- refBuffer<float>(vertices, vertexCount * 2), // 2 floats per vertex
- refBuffer<int>(colors, vertexCount))); // 1 color per vertex
-}
-
-void RecordingCanvas::drawNinePatch(Bitmap& bitmap, const android::Res_png_9patch& patch,
- float dstLeft, float dstTop, float dstRight, float dstBottom,
- const SkPaint* paint) {
- addOp(alloc().create_trivial<PatchOp>(Rect(dstLeft, dstTop, dstRight, dstBottom),
- *(mState.currentSnapshot()->transform), getRecordedClip(),
- refPaint(paint), refBitmap(bitmap), refPatch(&patch)));
-}
-
-double RecordingCanvas::drawAnimatedImage(AnimatedImageDrawable*) {
- // Unimplemented
- return 0;
-}
-
-// Text
-void RecordingCanvas::drawGlyphs(ReadGlyphFunc glyphFunc, int glyphCount, const SkPaint& paint,
- float x, float y, float boundsLeft, float boundsTop,
- float boundsRight, float boundsBottom, float totalAdvance) {
- if (glyphCount <= 0 || paint.nothingToDraw()) return;
- uint16_t* glyphs = (glyph_t*)alloc().alloc<glyph_t>(glyphCount * sizeof(glyph_t));
- float* positions = (float*)alloc().alloc<float>(2 * glyphCount * sizeof(float));
- glyphFunc(glyphs, positions);
-
- // TODO: either must account for text shadow in bounds, or record separate ops for text shadows
- addOp(alloc().create_trivial<TextOp>(Rect(boundsLeft, boundsTop, boundsRight, boundsBottom),
- *(mState.currentSnapshot()->transform), getRecordedClip(),
- refPaint(&paint), glyphs, positions, glyphCount, x, y));
- drawTextDecorations(x, y, totalAdvance, paint);
-}
-
-void RecordingCanvas::drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset,
- const SkPaint& paint, const SkPath& path, size_t start,
- size_t end) {
- uint16_t glyphs[1];
- for (size_t i = start; i < end; i++) {
- glyphs[0] = layout.getGlyphId(i);
- float x = hOffset + layout.getX(i);
- float y = vOffset + layout.getY(i);
- if (paint.nothingToDraw()) return;
- const uint16_t* tempGlyphs = refBuffer<glyph_t>(glyphs, 1);
- addOp(alloc().create_trivial<TextOnPathOp>(*(mState.currentSnapshot()->transform),
- getRecordedClip(), refPaint(&paint), tempGlyphs,
- 1, refPath(&path), x, y));
- }
-}
-
-void RecordingCanvas::drawBitmap(Bitmap& bitmap, const SkPaint* paint) {
- addOp(alloc().create_trivial<BitmapOp>(Rect(bitmap.width(), bitmap.height()),
- *(mState.currentSnapshot()->transform),
- getRecordedClip(), refPaint(paint), refBitmap(bitmap)));
-}
-
-void RecordingCanvas::drawRenderNode(RenderNode* renderNode) {
- auto&& stagingProps = renderNode->stagingProperties();
- RenderNodeOp* op = alloc().create_trivial<RenderNodeOp>(
- Rect(stagingProps.getWidth(), stagingProps.getHeight()),
- *(mState.currentSnapshot()->transform), getRecordedClip(), renderNode);
- int opIndex = addOp(op);
- if (CC_LIKELY(opIndex >= 0)) {
- int childIndex = mDisplayList->addChild(op);
-
- // update the chunk's child indices
- DisplayList::Chunk& chunk = mDisplayList->chunks.back();
- chunk.endChildIndex = childIndex + 1;
-
- if (renderNode->stagingProperties().isProjectionReceiver()) {
- // use staging property, since recording on UI thread
- mDisplayList->projectionReceiveIndex = opIndex;
- }
- }
-}
-
-void RecordingCanvas::drawLayer(DeferredLayerUpdater* layerHandle) {
- // We ref the DeferredLayerUpdater due to its thread-safe ref-counting semantics.
- mDisplayList->ref(layerHandle);
-
- LOG_ALWAYS_FATAL_IF(layerHandle->getBackingLayerApi() != Layer::Api::OpenGL);
- // Note that the backing layer has *not* yet been updated, so don't trust
- // its width, height, transform, etc...!
- addOp(alloc().create_trivial<TextureLayerOp>(
- Rect(layerHandle->getWidth(), layerHandle->getHeight()),
- *(mState.currentSnapshot()->transform), getRecordedClip(), layerHandle));
-}
-
-void RecordingCanvas::callDrawGLFunction(Functor* functor, GlFunctorLifecycleListener* listener) {
- mDisplayList->functors.push_back({functor, listener});
- mDisplayList->ref(listener);
- addOp(alloc().create_trivial<FunctorOp>(*(mState.currentSnapshot()->transform),
- getRecordedClip(), functor));
-}
-
-int RecordingCanvas::addOp(RecordedOp* op) {
- // skip op with empty clip
- if (op->localClip && op->localClip->rect.isEmpty()) {
- // NOTE: this rejection happens after op construction/content ref-ing, so content ref'd
- // and held by renderthread isn't affected by clip rejection.
- // Could rewind alloc here if desired, but callers would have to not touch op afterwards.
- return -1;
- }
-
- int insertIndex = mDisplayList->ops.size();
- mDisplayList->ops.push_back(op);
- if (mDeferredBarrierType != DeferredBarrierType::None) {
- // op is first in new chunk
- mDisplayList->chunks.emplace_back();
- DisplayList::Chunk& newChunk = mDisplayList->chunks.back();
- newChunk.beginOpIndex = insertIndex;
- newChunk.endOpIndex = insertIndex + 1;
- newChunk.reorderChildren = (mDeferredBarrierType == DeferredBarrierType::OutOfOrder);
- newChunk.reorderClip = mDeferredBarrierClip;
-
- int nextChildIndex = mDisplayList->children.size();
- newChunk.beginChildIndex = newChunk.endChildIndex = nextChildIndex;
- mDeferredBarrierType = DeferredBarrierType::None;
- } else {
- // standard case - append to existing chunk
- mDisplayList->chunks.back().endOpIndex = insertIndex + 1;
- }
- return insertIndex;
-}
-
-void RecordingCanvas::refBitmapsInShader(const SkShader* shader) {
- if (!shader) return;
-
- // If this paint has an SkShader that has an SkBitmap add
- // it to the bitmap pile
- SkBitmap bitmap;
- SkShader::TileMode xy[2];
- if (shader->isABitmap(&bitmap, nullptr, xy)) {
- Bitmap* hwuiBitmap = static_cast<Bitmap*>(bitmap.pixelRef());
- refBitmap(*hwuiBitmap);
- return;
- }
- SkShader::ComposeRec rec;
- if (shader->asACompose(&rec)) {
- refBitmapsInShader(rec.fShaderA);
- refBitmapsInShader(rec.fShaderB);
- return;
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h
deleted file mode 100644
index e663402a80f3..000000000000
--- a/libs/hwui/RecordingCanvas.h
+++ /dev/null
@@ -1,320 +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.
- */
-
-#ifndef ANDROID_HWUI_RECORDING_CANVAS_H
-#define ANDROID_HWUI_RECORDING_CANVAS_H
-
-#include "CanvasState.h"
-#include "DisplayList.h"
-#include "ResourceCache.h"
-#include "SkiaCanvasProxy.h"
-#include "Snapshot.h"
-#include "hwui/Bitmap.h"
-#include "hwui/Canvas.h"
-#include "utils/LinearAllocator.h"
-#include "utils/Macros.h"
-
-#include <SkDrawFilter.h>
-#include <SkPaint.h>
-#include <SkTLazy.h>
-
-#include <vector>
-
-namespace android {
-namespace uirenderer {
-
-struct ClipBase;
-class DeferredLayerUpdater;
-struct RecordedOp;
-
-class ANDROID_API RecordingCanvas : public Canvas, public CanvasStateClient {
- enum class DeferredBarrierType {
- None,
- InOrder,
- OutOfOrder,
- };
-
-public:
- RecordingCanvas(size_t width, size_t height);
- virtual ~RecordingCanvas();
-
- virtual void resetRecording(int width, int height, RenderNode* node = nullptr) override;
- virtual WARN_UNUSED_RESULT DisplayList* finishRecording() override;
- // ----------------------------------------------------------------------------
- // MISC HWUI OPERATIONS - TODO: CATEGORIZE
- // ----------------------------------------------------------------------------
- virtual void insertReorderBarrier(bool enableReorder) override;
-
- virtual void drawLayer(DeferredLayerUpdater* layerHandle) override;
- virtual void drawRenderNode(RenderNode* renderNode) override;
- virtual void callDrawGLFunction(Functor* functor,
- GlFunctorLifecycleListener* listener) override;
-
- // ----------------------------------------------------------------------------
- // CanvasStateClient interface
- // ----------------------------------------------------------------------------
- virtual void onViewportInitialized() override;
- virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override;
- virtual GLuint getTargetFbo() const override { return -1; }
-
- // ----------------------------------------------------------------------------
- // HWUI Canvas draw operations
- // ----------------------------------------------------------------------------
-
- virtual void drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top,
- CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom,
- CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry,
- CanvasPropertyPaint* paint) override;
- virtual void drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y,
- CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint) override;
-
- // ----------------------------------------------------------------------------
- // android/graphics/Canvas interface
- // ----------------------------------------------------------------------------
- virtual SkCanvas* asSkCanvas() override;
-
- virtual void setBitmap(const SkBitmap& bitmap) override {
- LOG_ALWAYS_FATAL("RecordingCanvas is not backed by a bitmap.");
- }
-
- virtual bool isOpaque() override { return false; }
- virtual int width() override { return mState.getWidth(); }
- virtual int height() override { return mState.getHeight(); }
-
- // ----------------------------------------------------------------------------
- // android/graphics/Canvas state operations
- // ----------------------------------------------------------------------------
- // Save (layer)
- virtual int getSaveCount() const override { return mState.getSaveCount(); }
- virtual int save(SaveFlags::Flags flags) override;
- virtual void restore() override;
- virtual void restoreToCount(int saveCount) override;
-
- virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint,
- SaveFlags::Flags flags) override;
- virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha,
- SaveFlags::Flags flags) override {
- SkPaint paint;
- paint.setAlpha(alpha);
- return saveLayer(left, top, right, bottom, &paint, flags);
- }
-
- // Matrix
- virtual void getMatrix(SkMatrix* outMatrix) const override { mState.getMatrix(outMatrix); }
- virtual void setMatrix(const SkMatrix& matrix) override { mState.setMatrix(matrix); }
-
- virtual void concat(const SkMatrix& matrix) override { mState.concatMatrix(matrix); }
- virtual void rotate(float degrees) override;
- virtual void scale(float sx, float sy) override;
- virtual void skew(float sx, float sy) override;
- virtual void translate(float dx, float dy) override;
-
- // Clip
- virtual bool getClipBounds(SkRect* outRect) const override;
- virtual bool quickRejectRect(float left, float top, float right, float bottom) const override;
- virtual bool quickRejectPath(const SkPath& path) const override;
-
- virtual bool clipRect(float left, float top, float right, float bottom, SkClipOp op) override;
- virtual bool clipPath(const SkPath* path, SkClipOp op) override;
-
- // Misc
- virtual SkDrawFilter* getDrawFilter() override { return mDrawFilter.get(); }
- virtual void setDrawFilter(SkDrawFilter* filter) override {
- mDrawFilter.reset(SkSafeRef(filter));
- }
-
- // ----------------------------------------------------------------------------
- // android/graphics/Canvas draw operations
- // ----------------------------------------------------------------------------
- virtual void drawColor(int color, SkBlendMode mode) override;
- virtual void drawPaint(const SkPaint& paint) override;
-
- // Geometry
- virtual void drawPoint(float x, float y, const SkPaint& paint) override {
- float points[2] = {x, y};
- drawPoints(points, 2, paint);
- }
- virtual void drawPoints(const float* points, int floatCount, const SkPaint& paint) override;
- virtual void drawLine(float startX, float startY, float stopX, float stopY,
- const SkPaint& paint) override {
- float points[4] = {startX, startY, stopX, stopY};
- drawLines(points, 4, paint);
- }
- virtual void drawLines(const float* points, int floatCount, const SkPaint& paint) override;
- virtual void drawRect(float left, float top, float right, float bottom,
- const SkPaint& paint) override;
- virtual void drawRegion(const SkRegion& region, const SkPaint& paint) override;
- virtual void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry,
- const SkPaint& paint) override;
- virtual void drawCircle(float x, float y, float radius, const SkPaint& paint) override;
- virtual void drawOval(float left, float top, float right, float bottom,
- const SkPaint& paint) override;
- virtual void drawArc(float left, float top, float right, float bottom, float startAngle,
- float sweepAngle, bool useCenter, const SkPaint& paint) override;
- virtual void drawPath(const SkPath& path, const SkPaint& paint) override;
- virtual void drawVertices(const SkVertices*, SkBlendMode, const SkPaint& paint)
- override { /* RecordingCanvas does not support drawVertices(); ignore */
- }
-
- virtual void drawVectorDrawable(VectorDrawableRoot* tree) override;
-
- // Bitmap-based
- virtual void drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) override;
- virtual void drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const SkPaint* paint) override;
- virtual void drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float srcRight,
- float srcBottom, float dstLeft, float dstTop, float dstRight,
- float dstBottom, const SkPaint* paint) override;
- virtual void drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight,
- const float* vertices, const int* colors,
- const SkPaint* paint) override;
- virtual void drawNinePatch(Bitmap& bitmap, const android::Res_png_9patch& chunk, float dstLeft,
- float dstTop, float dstRight, float dstBottom,
- const SkPaint* paint) override;
- virtual double drawAnimatedImage(AnimatedImageDrawable*) override;
-
- // Text
- virtual bool drawTextAbsolutePos() const override { return false; }
-
-protected:
- virtual void drawGlyphs(ReadGlyphFunc glyphFunc, int count, const SkPaint& paint, float x,
- float y, float boundsLeft, float boundsTop, float boundsRight,
- float boundsBottom, float totalAdvance) override;
- virtual void drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset,
- const SkPaint& paint, const SkPath& path, size_t start,
- size_t end) override;
-
-private:
- const ClipBase* getRecordedClip() {
- return mState.writableSnapshot()->mutateClipArea().serializeClip(alloc());
- }
-
- void drawBitmap(Bitmap& bitmap, const SkPaint* paint);
- void drawSimpleRects(const float* rects, int vertexCount, const SkPaint* paint);
-
- int addOp(RecordedOp* op);
- // ----------------------------------------------------------------------------
- // lazy object copy
- // ----------------------------------------------------------------------------
- LinearAllocator& alloc() { return mDisplayList->allocator; }
-
- void refBitmapsInShader(const SkShader* shader);
-
- template <class T>
- inline const T* refBuffer(const T* srcBuffer, int32_t count) {
- if (!srcBuffer) return nullptr;
-
- T* dstBuffer = (T*)mDisplayList->allocator.alloc<T>(count * sizeof(T));
- memcpy(dstBuffer, srcBuffer, count * sizeof(T));
- return dstBuffer;
- }
-
- inline const SkPath* refPath(const SkPath* path) {
- if (!path) return nullptr;
-
- // The points/verbs within the path are refcounted so this copy operation
- // is inexpensive and maintains the generationID of the original path.
- const SkPath* cachedPath = new SkPath(*path);
- mDisplayList->pathResources.push_back(cachedPath);
- return cachedPath;
- }
-
- /**
- * Returns a RenderThread-safe, const copy of the SkPaint parameter passed in
- * (with deduping based on paint hash / equality check)
- */
- inline const SkPaint* refPaint(const SkPaint* paint) {
- if (!paint) return nullptr;
-
- // If there is a draw filter apply it here and store the modified paint
- // so that we don't need to modify the paint every time we access it.
- SkTLazy<SkPaint> filteredPaint;
- if (mDrawFilter.get()) {
- filteredPaint.set(*paint);
- mDrawFilter->filter(filteredPaint.get(), SkDrawFilter::kPaint_Type);
- paint = filteredPaint.get();
- }
-
- // compute the hash key for the paint and check the cache.
- const uint32_t key = paint->getHash();
- const SkPaint* cachedPaint = mPaintMap.valueFor(key);
- // In the unlikely event that 2 unique paints have the same hash we do a
- // object equality check to ensure we don't erroneously dedup them.
- if (cachedPaint == nullptr || *cachedPaint != *paint) {
- cachedPaint = new SkPaint(*paint);
- mDisplayList->paints.emplace_back(cachedPaint);
- // replaceValueFor() performs an add if the entry doesn't exist
- mPaintMap.replaceValueFor(key, cachedPaint);
- refBitmapsInShader(cachedPaint->getShader());
- }
-
- return cachedPaint;
- }
-
- inline const SkRegion* refRegion(const SkRegion* region) {
- if (!region) {
- return region;
- }
-
- const SkRegion* cachedRegion = mRegionMap.valueFor(region);
- // TODO: Add generation ID to SkRegion
- if (cachedRegion == nullptr) {
- std::unique_ptr<const SkRegion> copy(new SkRegion(*region));
- cachedRegion = copy.get();
- mDisplayList->regions.push_back(std::move(copy));
-
- // replaceValueFor() performs an add if the entry doesn't exist
- mRegionMap.replaceValueFor(region, cachedRegion);
- }
-
- return cachedRegion;
- }
-
- inline Bitmap* refBitmap(Bitmap& bitmap) {
- // Note that this assumes the bitmap is immutable. There are cases this won't handle
- // correctly, such as creating the bitmap from scratch, drawing with it, changing its
- // contents, and drawing again. The only fix would be to always copy it the first time,
- // which doesn't seem worth the extra cycles for this unlikely case.
-
- // this is required because sk_sp's ctor adopts the pointer,
- // but does not increment the refcount,
- bitmap.ref();
- mDisplayList->bitmapResources.emplace_back(&bitmap);
- return &bitmap;
- }
-
- inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) {
- mDisplayList->patchResources.push_back(patch);
- mResourceCache.incrementRefcount(patch);
- return patch;
- }
-
- DefaultKeyedVector<uint32_t, const SkPaint*> mPaintMap;
- DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap;
- DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap;
-
- CanvasState mState;
- std::unique_ptr<SkiaCanvasProxy> mSkiaCanvasProxy;
- ResourceCache& mResourceCache;
- DeferredBarrierType mDeferredBarrierType = DeferredBarrierType::None;
- const ClipBase* mDeferredBarrierClip = nullptr;
- DisplayList* mDisplayList = nullptr;
- sk_sp<SkDrawFilter> mDrawFilter;
-}; // class RecordingCanvas
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_RECORDING_CANVAS_H
diff --git a/libs/hwui/RenderBuffer.h b/libs/hwui/RenderBuffer.h
deleted file mode 100644
index 191a66a6d741..000000000000
--- a/libs/hwui/RenderBuffer.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#ifndef ANDROID_HWUI_RENDER_BUFFER_H
-#define ANDROID_HWUI_RENDER_BUFFER_H
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-namespace android {
-namespace uirenderer {
-
-/**
- * Represents an OpenGL render buffer. Render buffers are attached
- * to layers to perform stencil work.
- */
-struct RenderBuffer {
- /**
- * Creates a new render buffer in the specified format and dimensions.
- * The format must be one of the formats allowed by glRenderbufferStorage().
- */
- RenderBuffer(GLenum format, uint32_t width, uint32_t height)
- : mFormat(format), mWidth(width), mHeight(height), mAllocated(false) {
- glGenRenderbuffers(1, &mName);
- }
-
- ~RenderBuffer() {
- if (mName) {
- glDeleteRenderbuffers(1, &mName);
- }
- }
-
- /**
- * Returns the GL name of this render buffer.
- */
- GLuint getName() const { return mName; }
-
- /**
- * Returns the format of this render buffer.
- */
- GLenum getFormat() const { return mFormat; }
-
- /**
- * Binds this render buffer to the current GL context.
- */
- void bind() const { glBindRenderbuffer(GL_RENDERBUFFER, mName); }
-
- /**
- * Indicates whether this render buffer has allocated its
- * storage. See allocate() and resize().
- */
- bool isAllocated() const { return mAllocated; }
-
- /**
- * Allocates this render buffer's storage if needed.
- * This method doesn't do anything if isAllocated() returns true.
- */
- void allocate() {
- if (!mAllocated) {
- glRenderbufferStorage(GL_RENDERBUFFER, mFormat, mWidth, mHeight);
- mAllocated = true;
- }
- }
-
- /**
- * Resizes this render buffer. If the buffer was previously allocated,
- * the storage is re-allocated wit the new specified dimensions. If the
- * buffer wasn't previously allocated, the buffer remains unallocated.
- */
- void resize(uint32_t width, uint32_t height) {
- if (isAllocated() && (width != mWidth || height != mHeight)) {
- glRenderbufferStorage(GL_RENDERBUFFER, mFormat, width, height);
- }
-
- mWidth = width;
- mHeight = height;
- }
-
- /**
- * Returns the width of the render buffer in pixels.
- */
- uint32_t getWidth() const { return mWidth; }
-
- /**
- * Returns the height of the render buffer in pixels.
- */
- uint32_t getHeight() const { return mHeight; }
-
- /**
- * Returns the size of this render buffer in bytes.
- */
- uint32_t getSize() const {
- // Round to the nearest byte
- return (uint32_t)((mWidth * mHeight * formatSize(mFormat)) / 8.0f + 0.5f);
- }
-
- /**
- * Returns the number of bits per component in the specified format.
- * The format must be one of the formats allowed by glRenderbufferStorage().
- */
- static uint32_t formatSize(GLenum format) {
- switch (format) {
- case GL_STENCIL_INDEX8:
- return 8;
- case GL_STENCIL_INDEX1_OES:
- return 1;
- case GL_STENCIL_INDEX4_OES:
- return 4;
- case GL_DEPTH_COMPONENT16:
- case GL_RGBA4:
- case GL_RGB565:
- case GL_RGB5_A1:
- return 16;
- }
- return 0;
- }
-
- /**
- * Indicates whether the specified format represents a stencil buffer.
- */
- static bool isStencilBuffer(GLenum format) {
- switch (format) {
- case GL_STENCIL_INDEX8:
- case GL_STENCIL_INDEX1_OES:
- case GL_STENCIL_INDEX4_OES:
- return true;
- }
- return false;
- }
-
- /**
- * Returns the name of the specified render buffer format.
- */
- static const char* formatName(GLenum format) {
- switch (format) {
- case GL_STENCIL_INDEX8:
- return "STENCIL_8";
- case GL_STENCIL_INDEX1_OES:
- return "STENCIL_1";
- case GL_STENCIL_INDEX4_OES:
- return "STENCIL_4";
- case GL_DEPTH_COMPONENT16:
- return "DEPTH_16";
- case GL_RGBA4:
- return "RGBA_4444";
- case GL_RGB565:
- return "RGB_565";
- case GL_RGB5_A1:
- return "RGBA_5551";
- }
- return "Unknown";
- }
-
-private:
- GLenum mFormat;
-
- uint32_t mWidth;
- uint32_t mHeight;
-
- bool mAllocated;
-
- GLuint mName;
-}; // struct RenderBuffer
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_RENDER_BUFFER_H
diff --git a/libs/hwui/RenderBufferCache.cpp b/libs/hwui/RenderBufferCache.cpp
deleted file mode 100644
index 98010d8da1bd..000000000000
--- a/libs/hwui/RenderBufferCache.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include "RenderBufferCache.h"
-#include "Debug.h"
-#include "DeviceInfo.h"
-#include "Properties.h"
-
-#include <utils/Log.h>
-
-#include <cstdlib>
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Defines
-///////////////////////////////////////////////////////////////////////////////
-
-// Debug
-#if DEBUG_RENDER_BUFFERS
-#define RENDER_BUFFER_LOGD(...) ALOGD(__VA_ARGS__)
-#else
-#define RENDER_BUFFER_LOGD(...)
-#endif
-
-static uint32_t calculateRboCacheSize() {
- // TODO: Do we need to use extensions().has4BitStencil() here?
- // The tuning guide recommends it, but all real devices are configured
- // with a larger cache than necessary by 4x, so keep the 2x for now regardless
- return DeviceInfo::multiplyByResolution(2);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Constructors/destructor
-///////////////////////////////////////////////////////////////////////////////
-
-RenderBufferCache::RenderBufferCache() : mSize(0), mMaxSize(calculateRboCacheSize()) {}
-
-RenderBufferCache::~RenderBufferCache() {
- clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Size management
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t RenderBufferCache::getSize() {
- return mSize;
-}
-
-uint32_t RenderBufferCache::getMaxSize() {
- return mMaxSize;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Caching
-///////////////////////////////////////////////////////////////////////////////
-
-int RenderBufferCache::RenderBufferEntry::compare(const RenderBufferCache::RenderBufferEntry& lhs,
- const RenderBufferCache::RenderBufferEntry& rhs) {
- int deltaInt = int(lhs.mWidth) - int(rhs.mWidth);
- if (deltaInt != 0) return deltaInt;
-
- deltaInt = int(lhs.mHeight) - int(rhs.mHeight);
- if (deltaInt != 0) return deltaInt;
-
- return int(lhs.mFormat) - int(rhs.mFormat);
-}
-
-void RenderBufferCache::deleteBuffer(RenderBuffer* buffer) {
- if (buffer) {
- RENDER_BUFFER_LOGD("Deleted %s render buffer (%dx%d)",
- RenderBuffer::formatName(buffer->getFormat()), buffer->getWidth(),
- buffer->getHeight());
-
- mSize -= buffer->getSize();
- delete buffer;
- }
-}
-
-void RenderBufferCache::clear() {
- for (auto entry : mCache) {
- deleteBuffer(entry.mBuffer);
- }
- mCache.clear();
-}
-
-RenderBuffer* RenderBufferCache::get(GLenum format, const uint32_t width, const uint32_t height) {
- RenderBuffer* buffer = nullptr;
-
- RenderBufferEntry entry(format, width, height);
- auto iter = mCache.find(entry);
-
- if (iter != mCache.end()) {
- entry = *iter;
- mCache.erase(iter);
-
- buffer = entry.mBuffer;
- mSize -= buffer->getSize();
-
- RENDER_BUFFER_LOGD("Found %s render buffer (%dx%d)", RenderBuffer::formatName(format),
- width, height);
- } else {
- buffer = new RenderBuffer(format, width, height);
-
- RENDER_BUFFER_LOGD("Created new %s render buffer (%dx%d)", RenderBuffer::formatName(format),
- width, height);
- }
-
- buffer->bind();
- buffer->allocate();
-
- return buffer;
-}
-
-bool RenderBufferCache::put(RenderBuffer* buffer) {
- if (!buffer) return false;
-
- const uint32_t size = buffer->getSize();
- if (size < mMaxSize) {
- while (mSize + size > mMaxSize) {
- RenderBuffer* victim = mCache.begin()->mBuffer;
- deleteBuffer(victim);
- mCache.erase(mCache.begin());
- }
-
- RenderBufferEntry entry(buffer);
-
- mCache.insert(entry);
- mSize += size;
-
- RENDER_BUFFER_LOGD("Added %s render buffer (%dx%d)",
- RenderBuffer::formatName(buffer->getFormat()), buffer->getWidth(),
- buffer->getHeight());
-
- return true;
- } else {
- RENDER_BUFFER_LOGD("Deleted %s render buffer (%dx%d) Size=%d, MaxSize=%d",
- RenderBuffer::formatName(buffer->getFormat()), buffer->getWidth(),
- buffer->getHeight(), size, mMaxSize);
- delete buffer;
- }
- return false;
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/RenderBufferCache.h b/libs/hwui/RenderBufferCache.h
deleted file mode 100644
index c936a5283965..000000000000
--- a/libs/hwui/RenderBufferCache.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#ifndef ANDROID_HWUI_RENDER_BUFFER_CACHE_H
-#define ANDROID_HWUI_RENDER_BUFFER_CACHE_H
-
-#include <GLES2/gl2.h>
-
-#include "RenderBuffer.h"
-
-#include <set>
-
-namespace android {
-namespace uirenderer {
-
-class RenderBufferCache {
-public:
- RenderBufferCache();
- ~RenderBufferCache();
-
- /**
- * Returns a buffer with the exact specified dimensions. If no suitable
- * buffer can be found, a new one is created and returned. If creating a
- * new buffer fails, NULL is returned.
- *
- * When a buffer is obtained from the cache, it is removed and the total
- * size of the cache goes down.
- *
- * The returned buffer is always allocated and bound
- * (see RenderBuffer::isAllocated()).
- *
- * @param format The desired render buffer format
- * @param width The desired width of the buffer
- * @param height The desired height of the buffer
- */
- RenderBuffer* get(GLenum format, const uint32_t width, const uint32_t height);
-
- /**
- * Adds the buffer to the cache. The buffer will not be added if there is
- * not enough space available. Adding a buffer can cause other buffer to
- * be removed from the cache.
- *
- * @param buffer The render buffer to add to the cache
- *
- * @return True if the buffer was added, false otherwise.
- */
- bool put(RenderBuffer* buffer);
- /**
- * Clears the cache. This causes all layers to be deleted.
- */
- void clear();
-
- /**
- * Returns the maximum size of the cache in bytes.
- */
- uint32_t getMaxSize();
- /**
- * Returns the current size of the cache in bytes.
- */
- uint32_t getSize();
-
-private:
- struct RenderBufferEntry {
- RenderBufferEntry() : mBuffer(nullptr), mWidth(0), mHeight(0) {}
-
- RenderBufferEntry(GLenum format, const uint32_t width, const uint32_t height)
- : mBuffer(nullptr), mFormat(format), mWidth(width), mHeight(height) {}
-
- explicit RenderBufferEntry(RenderBuffer* buffer)
- : mBuffer(buffer)
- , mFormat(buffer->getFormat())
- , mWidth(buffer->getWidth())
- , mHeight(buffer->getHeight()) {}
-
- static int compare(const RenderBufferEntry& lhs, const RenderBufferEntry& rhs);
-
- bool operator==(const RenderBufferEntry& other) const { return compare(*this, other) == 0; }
-
- bool operator!=(const RenderBufferEntry& other) const { return compare(*this, other) != 0; }
-
- bool operator<(const RenderBufferEntry& other) const {
- return RenderBufferEntry::compare(*this, other) < 0;
- }
-
- RenderBuffer* mBuffer;
- GLenum mFormat;
- uint32_t mWidth;
- uint32_t mHeight;
- }; // struct RenderBufferEntry
-
- void deleteBuffer(RenderBuffer* buffer);
-
- std::multiset<RenderBufferEntry> mCache;
-
- uint32_t mSize;
- uint32_t mMaxSize;
-}; // class RenderBufferCache
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_RENDER_BUFFER_CACHE_H
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index d93a7578cfd7..a2e1f6041b62 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -16,10 +16,8 @@
#include "RenderNode.h"
-#include "BakedOpRenderer.h"
#include "DamageAccumulator.h"
#include "Debug.h"
-#include "RecordedOp.h"
#include "TreeInfo.h"
#include "VectorDrawable.h"
#include "renderstate/RenderState.h"
@@ -29,9 +27,6 @@
#include "utils/StringUtils.h"
#include "utils/TraceUtils.h"
-#include "protos/ProtoHelpers.h"
-#include "protos/hwui.pb.h"
-
#include <SkPathOps.h>
#include <algorithm>
#include <sstream>
@@ -101,77 +96,6 @@ void RenderNode::output(std::ostream& output, uint32_t level) {
output << std::endl;
}
-void RenderNode::copyTo(proto::RenderNode* pnode) {
- pnode->set_id(static_cast<uint64_t>(reinterpret_cast<uintptr_t>(this)));
- pnode->set_name(mName.string(), mName.length());
-
- proto::RenderProperties* pprops = pnode->mutable_properties();
- pprops->set_left(properties().getLeft());
- pprops->set_top(properties().getTop());
- pprops->set_right(properties().getRight());
- pprops->set_bottom(properties().getBottom());
- pprops->set_clip_flags(properties().getClippingFlags());
- pprops->set_alpha(properties().getAlpha());
- pprops->set_translation_x(properties().getTranslationX());
- pprops->set_translation_y(properties().getTranslationY());
- pprops->set_translation_z(properties().getTranslationZ());
- pprops->set_elevation(properties().getElevation());
- pprops->set_rotation(properties().getRotation());
- pprops->set_rotation_x(properties().getRotationX());
- pprops->set_rotation_y(properties().getRotationY());
- pprops->set_scale_x(properties().getScaleX());
- pprops->set_scale_y(properties().getScaleY());
- pprops->set_pivot_x(properties().getPivotX());
- pprops->set_pivot_y(properties().getPivotY());
- pprops->set_has_overlapping_rendering(properties().getHasOverlappingRendering());
- pprops->set_pivot_explicitly_set(properties().isPivotExplicitlySet());
- pprops->set_project_backwards(properties().getProjectBackwards());
- pprops->set_projection_receiver(properties().isProjectionReceiver());
- set(pprops->mutable_clip_bounds(), properties().getClipBounds());
-
- const Outline& outline = properties().getOutline();
- if (outline.getType() != Outline::Type::None) {
- proto::Outline* poutline = pprops->mutable_outline();
- poutline->clear_path();
- if (outline.getType() == Outline::Type::Empty) {
- poutline->set_type(proto::Outline_Type_Empty);
- } else if (outline.getType() == Outline::Type::ConvexPath) {
- poutline->set_type(proto::Outline_Type_ConvexPath);
- if (const SkPath* path = outline.getPath()) {
- set(poutline->mutable_path(), *path);
- }
- } else if (outline.getType() == Outline::Type::RoundRect) {
- poutline->set_type(proto::Outline_Type_RoundRect);
- } else {
- ALOGW("Uknown outline type! %d", static_cast<int>(outline.getType()));
- poutline->set_type(proto::Outline_Type_None);
- }
- poutline->set_should_clip(outline.getShouldClip());
- poutline->set_alpha(outline.getAlpha());
- poutline->set_radius(outline.getRadius());
- set(poutline->mutable_bounds(), outline.getBounds());
- } else {
- pprops->clear_outline();
- }
-
- const RevealClip& revealClip = properties().getRevealClip();
- if (revealClip.willClip()) {
- proto::RevealClip* prevealClip = pprops->mutable_reveal_clip();
- prevealClip->set_x(revealClip.getX());
- prevealClip->set_y(revealClip.getY());
- prevealClip->set_radius(revealClip.getRadius());
- } else {
- pprops->clear_reveal_clip();
- }
-
- pnode->clear_children();
- if (mDisplayList) {
- for (auto&& child : mDisplayList->getChildren()) {
- child->renderNode->copyTo(pnode->add_children());
- }
- }
-}
-
int RenderNode::getDebugSize() {
int size = sizeof(RenderNode);
if (mStagingDisplayList) {
@@ -188,11 +112,7 @@ void RenderNode::prepareTree(TreeInfo& info) {
LOG_ALWAYS_FATAL_IF(!info.damageAccumulator, "DamageAccumulator missing");
MarkAndSweepRemoved observer(&info);
- // The OpenGL renderer reserves the stencil buffer for overdraw debugging. Functors
- // will need to be drawn in a layer.
- bool functorsNeedLayer = Properties::debugOverdraw && !Properties::isSkiaEnabled();
-
- prepareTreeImpl(observer, info, functorsNeedLayer);
+ prepareTreeImpl(observer, info, false);
}
void RenderNode::addAnimator(const sp<BaseRenderNodeAnimator>& animator) {
@@ -459,78 +379,6 @@ void RenderNode::applyViewPropertyTransforms(mat4& matrix, bool true3dTransform)
}
}
-/**
- * Organizes the DisplayList hierarchy to prepare for background projection reordering.
- *
- * This should be called before a call to defer() or drawDisplayList()
- *
- * Each DisplayList that serves as a 3d root builds its list of composited children,
- * which are flagged to not draw in the standard draw loop.
- */
-void RenderNode::computeOrdering() {
- ATRACE_CALL();
- mProjectedNodes.clear();
-
- // TODO: create temporary DDLOp and call computeOrderingImpl on top DisplayList so that
- // transform properties are applied correctly to top level children
- if (mDisplayList == nullptr) return;
- for (unsigned int i = 0; i < mDisplayList->getChildren().size(); i++) {
- RenderNodeOp* childOp = mDisplayList->getChildren()[i];
- childOp->renderNode->computeOrderingImpl(childOp, &mProjectedNodes, &mat4::identity());
- }
-}
-
-void RenderNode::computeOrderingImpl(
- RenderNodeOp* opState, std::vector<RenderNodeOp*>* compositedChildrenOfProjectionSurface,
- const mat4* transformFromProjectionSurface) {
- mProjectedNodes.clear();
- if (mDisplayList == nullptr || mDisplayList->isEmpty()) return;
-
- // TODO: should avoid this calculation in most cases
- // TODO: just calculate single matrix, down to all leaf composited elements
- Matrix4 localTransformFromProjectionSurface(*transformFromProjectionSurface);
- localTransformFromProjectionSurface.multiply(opState->localMatrix);
-
- if (properties().getProjectBackwards()) {
- // composited projectee, flag for out of order draw, save matrix, and store in proj surface
- opState->skipInOrderDraw = true;
- opState->transformFromCompositingAncestor = localTransformFromProjectionSurface;
- compositedChildrenOfProjectionSurface->push_back(opState);
- } else {
- // standard in order draw
- opState->skipInOrderDraw = false;
- }
-
- if (mDisplayList->getChildren().size() > 0) {
- const bool isProjectionReceiver = mDisplayList->projectionReceiveIndex >= 0;
- bool haveAppliedPropertiesToProjection = false;
- for (unsigned int i = 0; i < mDisplayList->getChildren().size(); i++) {
- RenderNodeOp* childOp = mDisplayList->getChildren()[i];
- RenderNode* child = childOp->renderNode;
-
- std::vector<RenderNodeOp*>* projectionChildren = nullptr;
- const mat4* projectionTransform = nullptr;
- if (isProjectionReceiver && !child->properties().getProjectBackwards()) {
- // if receiving projections, collect projecting descendant
-
- // Note that if a direct descendant is projecting backwards, we pass its
- // grandparent projection collection, since it shouldn't project onto its
- // parent, where it will already be drawing.
- projectionChildren = &mProjectedNodes;
- projectionTransform = &mat4::identity();
- } else {
- if (!haveAppliedPropertiesToProjection) {
- applyViewPropertyTransforms(localTransformFromProjectionSurface);
- haveAppliedPropertiesToProjection = true;
- }
- projectionChildren = compositedChildrenOfProjectionSurface;
- projectionTransform = &localTransformFromProjectionSurface;
- }
- child->computeOrderingImpl(childOp, projectionChildren, projectionTransform);
- }
- }
-}
-
const SkPath* RenderNode::getClippedOutline(const SkRect& clipRect) const {
const SkPath* outlinePath = properties().getOutline().getPath();
const uint32_t outlineID = outlinePath->getGenerationID();
diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h
index 1469a156e2d8..8393288d2ffd 100644
--- a/libs/hwui/RenderNode.h
+++ b/libs/hwui/RenderNode.h
@@ -28,6 +28,7 @@
#include <androidfw/ResourceTypes.h>
#include "AnimatorManager.h"
+#include "CanvasTransform.h"
#include "Debug.h"
#include "DisplayList.h"
#include "Matrix.h"
@@ -48,9 +49,6 @@ namespace android {
namespace uirenderer {
class CanvasState;
-class DisplayListOp;
-class FrameBuilder;
-class OffscreenBuffer;
class Rect;
class SkiaShader;
struct RenderNodeOp;
@@ -76,7 +74,6 @@ class RenderNode;
*/
class RenderNode : public VirtualLightRefBase {
friend class TestUtils; // allow TestUtils to access syncDisplayList / syncProperties
- friend class FrameBuilder;
public:
enum DirtyPropertyMask {
@@ -104,11 +101,8 @@ public:
ANDROID_API void setStagingDisplayList(DisplayList* newData);
- void computeOrdering();
-
ANDROID_API void output();
ANDROID_API int getDebugSize();
- void copyTo(proto::RenderNode* node);
bool isRenderable() const { return mDisplayList && !mDisplayList->isEmpty(); }
@@ -178,9 +172,6 @@ public:
}
const DisplayList* getDisplayList() const { return mDisplayList; }
- OffscreenBuffer* getLayer() const { return mLayer; }
- OffscreenBuffer** getLayerHandle() { return &mLayer; } // ugh...
- void setLayer(OffscreenBuffer* layer) { mLayer = layer; }
// Note: The position callbacks are relying on the listener using
// the frameNumber to appropriately batch/synchronize these transactions.
@@ -218,6 +209,14 @@ public:
void output(std::ostream& output, uint32_t level);
+ void setUsageHint(UsageHint usageHint) {
+ mUsageHint = usageHint;
+ }
+
+ UsageHint usageHint() const {
+ return mUsageHint;
+ }
+
private:
void computeOrderingImpl(RenderNodeOp* opState,
std::vector<RenderNodeOp*>* compositedChildrenOfProjectionSurface,
@@ -256,10 +255,6 @@ private:
friend class AnimatorManager;
AnimatorManager mAnimatorManager;
- // Owned by RT. Lifecycle is managed by prepareTree(), with the exception
- // being in ~RenderNode() which may happen on any thread.
- OffscreenBuffer* mLayer = nullptr;
-
/**
* Draw time state - these properties are only set and used during rendering
*/
@@ -277,6 +272,8 @@ private:
sp<PositionListener> mPositionListener;
+ UsageHint mUsageHint = UsageHint::Unknown;
+
// METHODS & FIELDS ONLY USED BY THE SKIA RENDERER
public:
/**
@@ -298,7 +295,7 @@ public:
* Returns true if an offscreen layer from any renderPipeline is attached
* to this node.
*/
- bool hasLayer() const { return mLayer || mSkiaLayer.get(); }
+ bool hasLayer() const { return mSkiaLayer.get(); }
/**
* Used by the RenderPipeline to attach an offscreen surface to the RenderNode.
diff --git a/libs/hwui/RenderProperties.cpp b/libs/hwui/RenderProperties.cpp
index e49574462e9e..ff9cf45cdc73 100644
--- a/libs/hwui/RenderProperties.cpp
+++ b/libs/hwui/RenderProperties.cpp
@@ -44,8 +44,8 @@ void LayerProperties::reset() {
}
bool LayerProperties::setColorFilter(SkColorFilter* filter) {
- if (mColorFilter == filter) return false;
- SkRefCnt_SafeAssign(mColorFilter, filter);
+ if (mColorFilter.get() == filter) return false;
+ mColorFilter = sk_ref_sp(filter);
return true;
}
@@ -62,7 +62,7 @@ LayerProperties& LayerProperties::operator=(const LayerProperties& other) {
setOpaque(other.opaque());
setAlpha(other.alpha());
setXferMode(other.xferMode());
- setColorFilter(other.colorFilter());
+ setColorFilter(other.getColorFilter());
return *this;
}
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 6470d4c16130..0766e3b7ed28 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -89,9 +89,7 @@ public:
SkBlendMode xferMode() const { return mMode; }
- bool setColorFilter(SkColorFilter* filter);
-
- SkColorFilter* colorFilter() const { return mColorFilter; }
+ SkColorFilter* getColorFilter() const { return mColorFilter.get(); }
// Sets alpha, xfermode, and colorfilter from an SkPaint
// paint may be NULL, in which case defaults will be set
@@ -105,6 +103,7 @@ private:
LayerProperties();
~LayerProperties();
void reset();
+ bool setColorFilter(SkColorFilter* filter);
// Private since external users should go through properties().effectiveLayerType()
LayerType type() const { return mType; }
@@ -116,7 +115,7 @@ private:
bool mOpaque;
uint8_t mAlpha;
SkBlendMode mMode;
- SkColorFilter* mColorFilter = nullptr;
+ sk_sp<SkColorFilter> mColorFilter;
};
/*
@@ -328,9 +327,7 @@ public:
bool isPivotExplicitlySet() const { return mPrimitiveFields.mPivotExplicitlySet; }
- bool resetPivot() {
- return RP_SET_AND_DIRTY(mPrimitiveFields.mPivotExplicitlySet, false);
- }
+ bool resetPivot() { return RP_SET_AND_DIRTY(mPrimitiveFields.mPivotExplicitlySet, false); }
bool setCameraDistance(float distance) {
if (distance != getCameraDistance()) {
@@ -510,17 +507,13 @@ public:
getOutline().getAlpha() != 0.0f;
}
- SkColor getSpotShadowColor() const {
- return mPrimitiveFields.mSpotShadowColor;
- }
+ SkColor getSpotShadowColor() const { return mPrimitiveFields.mSpotShadowColor; }
bool setSpotShadowColor(SkColor shadowColor) {
return RP_SET(mPrimitiveFields.mSpotShadowColor, shadowColor);
}
- SkColor getAmbientShadowColor() const {
- return mPrimitiveFields.mAmbientShadowColor;
- }
+ SkColor getAmbientShadowColor() const { return mPrimitiveFields.mAmbientShadowColor; }
bool setAmbientShadowColor(SkColor shadowColor) {
return RP_SET(mPrimitiveFields.mAmbientShadowColor, shadowColor);
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp
index d60b99469368..464a58d0c0f8 100644
--- a/libs/hwui/ResourceCache.cpp
+++ b/libs/hwui/ResourceCache.cpp
@@ -113,7 +113,7 @@ void ResourceCache::destructorLocked(Res_png_9patch* resource) {
if (ref == nullptr) {
// If we're not tracking this resource, just delete it
if (Caches::hasInstance()) {
- Caches::getInstance().patchCache.removeDeferred(resource);
+ // DEAD CODE
} else {
// A Res_png_9patch is actually an array of byte that's larger
// than sizeof(Res_png_9patch). It must be freed as an array.
@@ -136,7 +136,7 @@ void ResourceCache::deleteResourceReferenceLocked(const void* resource, Resource
switch (ref->resourceType) {
case kNinePatch: {
if (Caches::hasInstance()) {
- Caches::getInstance().patchCache.removeDeferred((Res_png_9patch*)resource);
+ // DEAD CODE
} else {
// A Res_png_9patch is actually an array of byte that's larger
// than sizeof(Res_png_9patch). It must be freed as an array.
diff --git a/libs/hwui/ShadowTessellator.cpp b/libs/hwui/ShadowTessellator.cpp
deleted file mode 100644
index d0155ee473f7..000000000000
--- a/libs/hwui/ShadowTessellator.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include <math.h>
-#include <utils/Log.h>
-#include <utils/MathUtils.h>
-#include <utils/Trace.h>
-
-#include "AmbientShadow.h"
-#include "Properties.h"
-#include "ShadowTessellator.h"
-#include "SpotShadow.h"
-#include "Vector.h"
-
-namespace android {
-namespace uirenderer {
-
-void ShadowTessellator::tessellateAmbientShadow(bool isCasterOpaque, const Vector3* casterPolygon,
- int casterVertexCount, const Vector3& centroid3d,
- const Rect& casterBounds, const Rect& localClip,
- float maxZ, VertexBuffer& shadowVertexBuffer) {
- ATRACE_CALL();
-
- // A bunch of parameters to tweak the shadow.
- // TODO: Allow some of these changable by debug settings or APIs.
- float heightFactor = 1.0f / 128;
- const float geomFactor = 64;
-
- if (CC_UNLIKELY(Properties::overrideAmbientRatio > 0.0f)) {
- heightFactor *= Properties::overrideAmbientRatio;
- }
-
- Rect ambientShadowBounds(casterBounds);
- ambientShadowBounds.outset(maxZ * geomFactor * heightFactor);
-
- if (!localClip.intersects(ambientShadowBounds)) {
-#if DEBUG_SHADOW
- ALOGD("Ambient shadow is out of clip rect!");
-#endif
- return;
- }
-
- AmbientShadow::createAmbientShadow(isCasterOpaque, casterPolygon, casterVertexCount, centroid3d,
- heightFactor, geomFactor, shadowVertexBuffer);
-}
-
-void ShadowTessellator::tessellateSpotShadow(bool isCasterOpaque, const Vector3* casterPolygon,
- int casterVertexCount, const Vector3& casterCentroid,
- const mat4& receiverTransform,
- const Vector3& lightCenter, int lightRadius,
- const Rect& casterBounds, const Rect& localClip,
- VertexBuffer& shadowVertexBuffer) {
- ATRACE_CALL();
-
- Vector3 adjustedLightCenter(lightCenter);
- if (CC_UNLIKELY(Properties::overrideLightPosY > 0)) {
- adjustedLightCenter.y = -Properties::overrideLightPosY; // negated since this shifts up
- }
- if (CC_UNLIKELY(Properties::overrideLightPosZ > 0)) {
- adjustedLightCenter.z = Properties::overrideLightPosZ;
- }
-
-#if DEBUG_SHADOW
- ALOGD("light center %f %f %f %d", adjustedLightCenter.x, adjustedLightCenter.y,
- adjustedLightCenter.z, lightRadius);
-#endif
- if (isnan(adjustedLightCenter.x) || isnan(adjustedLightCenter.y) ||
- isnan(adjustedLightCenter.z)) {
- return;
- }
-
- // light position (because it's in local space) needs to compensate for receiver transform
- // TODO: should apply to light orientation, not just position
- Matrix4 reverseReceiverTransform;
- reverseReceiverTransform.loadInverse(receiverTransform);
- reverseReceiverTransform.mapPoint3d(adjustedLightCenter);
-
- if (CC_UNLIKELY(Properties::overrideLightRadius > 0)) {
- lightRadius = Properties::overrideLightRadius;
- }
-
- // Now light and caster are both in local space, we will check whether
- // the shadow is within the clip area.
- Rect lightRect = Rect(adjustedLightCenter.x - lightRadius, adjustedLightCenter.y - lightRadius,
- adjustedLightCenter.x + lightRadius, adjustedLightCenter.y + lightRadius);
- lightRect.unionWith(localClip);
- if (!lightRect.intersects(casterBounds)) {
-#if DEBUG_SHADOW
- ALOGD("Spot shadow is out of clip rect!");
-#endif
- return;
- }
-
- SpotShadow::createSpotShadow(isCasterOpaque, adjustedLightCenter, lightRadius, casterPolygon,
- casterVertexCount, casterCentroid, shadowVertexBuffer);
-
-#if DEBUG_SHADOW
- if (shadowVertexBuffer.getVertexCount() <= 0) {
- ALOGD("Spot shadow generation failed %d", shadowVertexBuffer.getVertexCount());
- }
-#endif
-}
-
-/**
- * Calculate the centroid of a 2d polygon.
- *
- * @param poly The polygon, which is represented in a Vector2 array.
- * @param polyLength The length of the polygon in terms of number of vertices.
- * @return the centroid of the polygon.
- */
-Vector2 ShadowTessellator::centroid2d(const Vector2* poly, int polyLength) {
- double sumx = 0;
- double sumy = 0;
- int p1 = polyLength - 1;
- double area = 0;
- for (int p2 = 0; p2 < polyLength; p2++) {
- double x1 = poly[p1].x;
- double y1 = poly[p1].y;
- double x2 = poly[p2].x;
- double y2 = poly[p2].y;
- double a = (x1 * y2 - x2 * y1);
- sumx += (x1 + x2) * a;
- sumy += (y1 + y2) * a;
- area += a;
- p1 = p2;
- }
-
- Vector2 centroid = poly[0];
- if (area != 0) {
- centroid = (Vector2){static_cast<float>(sumx / (3 * area)),
- static_cast<float>(sumy / (3 * area))};
- } else {
- ALOGW("Area is 0 while computing centroid!");
- }
- return centroid;
-}
-
-// Make sure p1 -> p2 is going CW around the poly.
-Vector2 ShadowTessellator::calculateNormal(const Vector2& p1, const Vector2& p2) {
- Vector2 result = p2 - p1;
- if (result.x != 0 || result.y != 0) {
- result.normalize();
- // Calculate the normal , which is CCW 90 rotate to the delta.
- float tempy = result.y;
- result.y = result.x;
- result.x = -tempy;
- }
- return result;
-}
-
-int ShadowTessellator::getExtraVertexNumber(const Vector2& vector1, const Vector2& vector2,
- float divisor) {
- // When there is no distance difference, there is no need for extra vertices.
- if (vector1.lengthSquared() == 0 || vector2.lengthSquared() == 0) {
- return 0;
- }
- // The formula is :
- // extraNumber = floor(acos(dot(n1, n2)) / (M_PI / EXTRA_VERTEX_PER_PI))
- // The value ranges for each step are:
- // dot( ) --- [-1, 1]
- // acos( ) --- [0, M_PI]
- // floor(...) --- [0, EXTRA_VERTEX_PER_PI]
- float dotProduct = vector1.dot(vector2);
- // make sure that dotProduct value is in acsof input range [-1, 1]
- dotProduct = MathUtils::clamp(dotProduct, -1.0f, 1.0f);
- // TODO: Use look up table for the dotProduct to extraVerticesNumber
- // computation, if needed.
- float angle = acosf(dotProduct);
- return (int)floor(angle / divisor);
-}
-
-void ShadowTessellator::checkOverflow(int used, int total, const char* bufferName) {
- LOG_ALWAYS_FATAL_IF(used > total, "Error: %s overflow!!! used %d, total %d", bufferName, used,
- total);
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/ShadowTessellator.h b/libs/hwui/ShadowTessellator.h
deleted file mode 100644
index 79f46f9e9a06..000000000000
--- a/libs/hwui/ShadowTessellator.h
+++ /dev/null
@@ -1,94 +0,0 @@
-
-/*
- * Copyright (C) 2013 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.
- */
-
-#ifndef ANDROID_HWUI_SHADOW_TESSELLATOR_H
-#define ANDROID_HWUI_SHADOW_TESSELLATOR_H
-
-#include <SkPath.h>
-
-#include "Debug.h"
-#include "Matrix.h"
-
-namespace android {
-namespace uirenderer {
-
-class VertexBuffer;
-
-// All SHADOW_* are used to define all the geometry property of shadows.
-// Use a simplified example to illustrate the geometry setup here.
-// Assuming we use 6 rays and only 1 layer, Then we will have 2 hexagons, which
-// are 0 to 5 and 6 to 11. The area between them will be the penumbra area, and
-// the area inside the 2nd hexagon is the umbra.
-// Ambient shadow is using only 1 layer for opaque caster, otherwise, spot
-// shadow and ambient shadow are using 2 layers.
-// Triange strip indices for penumbra area: (0, 6, 1, 7, 2, 8, 3, 9, 4, 10, 5, 11, 0, 6)
-// 0
-//
-// 5 6 1
-// 11 7
-//
-// 10 8
-// 4 9 2
-//
-// 3
-
-// The total number of rays starting from the centroid of shadow area, in order
-// to generate the shadow geometry.
-#define SHADOW_RAY_COUNT 128
-
-// The total number of all the vertices representing the shadow.
-// For the case we only have 1 layer, then we will just fill only 2/3 of it.
-#define SHADOW_VERTEX_COUNT (3 * SHADOW_RAY_COUNT)
-
-// The total number of indices used for drawing the shadow geometry as triangle strips.
-// Depending on the mode we are drawing, we can have 1 layer or 2 layers.
-// Therefore, we only build the longer index buffer.
-#define TWO_POLY_RING_SHADOW_INDEX_COUNT (4 * (SHADOW_RAY_COUNT + 1))
-#define ONE_POLY_RING_SHADOW_INDEX_COUNT (2 * (SHADOW_RAY_COUNT + 1))
-
-#define MAX_SHADOW_INDEX_COUNT TWO_POLY_RING_SHADOW_INDEX_COUNT
-
-#define SHADOW_MIN_CASTER_Z 0.001f
-
-#define MINIMAL_DELTA_THETA (M_PI / 180 / 1000)
-
-class ShadowTessellator {
-public:
- static void tessellateAmbientShadow(bool isCasterOpaque, const Vector3* casterPolygon,
- int casterVertexCount, const Vector3& centroid3d,
- const Rect& casterBounds, const Rect& localClip, float maxZ,
- VertexBuffer& shadowVertexBuffer);
-
- static void tessellateSpotShadow(bool isCasterOpaque, const Vector3* casterPolygon,
- int casterVertexCount, const Vector3& casterCentroid,
- const mat4& receiverTransform, const Vector3& lightCenter,
- int lightRadius, const Rect& casterBounds,
- const Rect& localClip, VertexBuffer& shadowVertexBuffer);
-
- static Vector2 centroid2d(const Vector2* poly, int polyLength);
-
- static Vector2 calculateNormal(const Vector2& p1, const Vector2& p2);
-
- static int getExtraVertexNumber(const Vector2& vector1, const Vector2& vector2, float divisor);
-
- static void checkOverflow(int used, int total, const char* bufferName);
-}; // ShadowTessellator
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_SHADOW_TESSELLATOR_H
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 40b811d813fd..17f1a3b4db3c 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -21,6 +21,7 @@
#include "VectorDrawable.h"
#include "hwui/Bitmap.h"
#include "hwui/MinikinUtils.h"
+#include "hwui/PaintFilter.h"
#include "pipeline/skia/AnimatedDrawables.h"
#include <SkAnimatedImage.h>
@@ -28,7 +29,6 @@
#include <SkColorFilter.h>
#include <SkColorSpaceXformCanvas.h>
#include <SkDeque.h>
-#include <SkDrawFilter.h>
#include <SkDrawable.h>
#include <SkGraphics.h>
#include <SkImage.h>
@@ -40,6 +40,8 @@
#include <SkTextBlob.h>
#include <memory>
+#include <optional>
+#include <utility>
namespace android {
@@ -62,13 +64,7 @@ SkiaCanvas::SkiaCanvas(const SkBitmap& bitmap) {
mCanvasOwned =
std::unique_ptr<SkCanvas>(new SkCanvas(bitmap, SkCanvas::ColorBehavior::kLegacy));
if (cs.get() == nullptr || cs->isSRGB()) {
- if (!uirenderer::Properties::isSkiaEnabled()) {
- mCanvasWrapper =
- SkCreateColorSpaceXformCanvas(mCanvasOwned.get(), SkColorSpace::MakeSRGB());
- mCanvas = mCanvasWrapper.get();
- } else {
- mCanvas = mCanvasOwned.get();
- }
+ mCanvas = mCanvasOwned.get();
} else {
/** The wrapper is needed if we are drawing into a non-sRGB destination, since
* we need to transform all colors (not just bitmaps via filters) into the
@@ -101,8 +97,6 @@ void SkiaCanvas::setBitmap(const SkBitmap& bitmap) {
std::unique_ptr<SkCanvas> newCanvasWrapper;
if (cs.get() != nullptr && !cs->isSRGB()) {
newCanvasWrapper = SkCreateColorSpaceXformCanvas(newCanvas.get(), std::move(cs));
- } else if (!uirenderer::Properties::isSkiaEnabled()) {
- newCanvasWrapper = SkCreateColorSpaceXformCanvas(newCanvas.get(), SkColorSpace::MakeSRGB());
}
// deletes the previously owned canvas (if any)
@@ -219,7 +213,7 @@ public:
Clip(const SkRRect& rrect, SkClipOp op, const SkMatrix& m)
: mType(Type::RRect), mOp(op), mMatrix(m), mRRect(rrect) {}
Clip(const SkPath& path, SkClipOp op, const SkMatrix& m)
- : mType(Type::Path), mOp(op), mMatrix(m), mPath(&path) {}
+ : mType(Type::Path), mOp(op), mMatrix(m), mPath(std::in_place, path) {}
void apply(SkCanvas* canvas) const {
canvas->setMatrix(mMatrix);
@@ -231,7 +225,7 @@ public:
canvas->clipRRect(mRRect, mOp);
break;
case Type::Path:
- canvas->clipPath(*mPath.get(), mOp);
+ canvas->clipPath(mPath.value(), mOp);
break;
}
}
@@ -248,7 +242,7 @@ private:
SkMatrix mMatrix;
// These are logically a union (tracked separately due to non-POD path).
- SkTLazy<SkPath> mPath;
+ std::optional<SkPath> mPath;
SkRRect mRRect;
};
@@ -408,12 +402,12 @@ bool SkiaCanvas::clipPath(const SkPath* path, SkClipOp op) {
// Canvas state operations: Filters
// ----------------------------------------------------------------------------
-SkDrawFilter* SkiaCanvas::getDrawFilter() {
- return mCanvas->getDrawFilter();
+PaintFilter* SkiaCanvas::getPaintFilter() {
+ return mPaintFilter.get();
}
-void SkiaCanvas::setDrawFilter(SkDrawFilter* drawFilter) {
- mCanvas->setDrawFilter(drawFilter);
+void SkiaCanvas::setPaintFilter(sk_sp<PaintFilter> paintFilter) {
+ mPaintFilter = std::move(paintFilter);
}
// ----------------------------------------------------------------------------
@@ -447,8 +441,15 @@ void SkiaCanvas::drawColor(int color, SkBlendMode mode) {
mCanvas->drawColor(color, mode);
}
+SkiaCanvas::PaintCoW&& SkiaCanvas::filterPaint(PaintCoW&& paint) const {
+ if (mPaintFilter) {
+ mPaintFilter->filter(&paint.writeable());
+ }
+ return std::move(paint);
+}
+
void SkiaCanvas::drawPaint(const SkPaint& paint) {
- mCanvas->drawPaint(paint);
+ mCanvas->drawPaint(*filterPaint(paint));
}
// ----------------------------------------------------------------------------
@@ -465,53 +466,53 @@ void SkiaCanvas::drawPoints(const float* points, int count, const SkPaint& paint
pts[i].set(points[0], points[1]);
points += 2;
}
- mCanvas->drawPoints(mode, count, pts.get(), paint);
+ mCanvas->drawPoints(mode, count, pts.get(), *filterPaint(paint));
}
void SkiaCanvas::drawPoint(float x, float y, const SkPaint& paint) {
- mCanvas->drawPoint(x, y, paint);
+ mCanvas->drawPoint(x, y, *filterPaint(paint));
}
void SkiaCanvas::drawPoints(const float* points, int count, const SkPaint& paint) {
- this->drawPoints(points, count, paint, SkCanvas::kPoints_PointMode);
+ this->drawPoints(points, count, *filterPaint(paint), SkCanvas::kPoints_PointMode);
}
void SkiaCanvas::drawLine(float startX, float startY, float stopX, float stopY,
const SkPaint& paint) {
- mCanvas->drawLine(startX, startY, stopX, stopY, paint);
+ mCanvas->drawLine(startX, startY, stopX, stopY, *filterPaint(paint));
}
void SkiaCanvas::drawLines(const float* points, int count, const SkPaint& paint) {
if (CC_UNLIKELY(count < 4 || paint.nothingToDraw())) return;
- this->drawPoints(points, count, paint, SkCanvas::kLines_PointMode);
+ this->drawPoints(points, count, *filterPaint(paint), SkCanvas::kLines_PointMode);
}
void SkiaCanvas::drawRect(float left, float top, float right, float bottom, const SkPaint& paint) {
if (CC_UNLIKELY(paint.nothingToDraw())) return;
- mCanvas->drawRect({left, top, right, bottom}, paint);
+ mCanvas->drawRect({left, top, right, bottom}, *filterPaint(paint));
}
void SkiaCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) {
if (CC_UNLIKELY(paint.nothingToDraw())) return;
- mCanvas->drawRegion(region, paint);
+ mCanvas->drawRegion(region, *filterPaint(paint));
}
void SkiaCanvas::drawRoundRect(float left, float top, float right, float bottom, float rx, float ry,
const SkPaint& paint) {
if (CC_UNLIKELY(paint.nothingToDraw())) return;
SkRect rect = SkRect::MakeLTRB(left, top, right, bottom);
- mCanvas->drawRoundRect(rect, rx, ry, paint);
+ mCanvas->drawRoundRect(rect, rx, ry, *filterPaint(paint));
}
void SkiaCanvas::drawCircle(float x, float y, float radius, const SkPaint& paint) {
if (CC_UNLIKELY(radius <= 0 || paint.nothingToDraw())) return;
- mCanvas->drawCircle(x, y, radius, paint);
+ mCanvas->drawCircle(x, y, radius, *filterPaint(paint));
}
void SkiaCanvas::drawOval(float left, float top, float right, float bottom, const SkPaint& paint) {
if (CC_UNLIKELY(paint.nothingToDraw())) return;
SkRect oval = SkRect::MakeLTRB(left, top, right, bottom);
- mCanvas->drawOval(oval, paint);
+ mCanvas->drawOval(oval, *filterPaint(paint));
}
void SkiaCanvas::drawArc(float left, float top, float right, float bottom, float startAngle,
@@ -519,9 +520,9 @@ void SkiaCanvas::drawArc(float left, float top, float right, float bottom, float
if (CC_UNLIKELY(paint.nothingToDraw())) return;
SkRect arc = SkRect::MakeLTRB(left, top, right, bottom);
if (fabs(sweepAngle) >= 360.0f) {
- mCanvas->drawOval(arc, paint);
+ mCanvas->drawOval(arc, *filterPaint(paint));
} else {
- mCanvas->drawArc(arc, startAngle, sweepAngle, useCenter, paint);
+ mCanvas->drawArc(arc, startAngle, sweepAngle, useCenter, *filterPaint(paint));
}
}
@@ -530,19 +531,19 @@ void SkiaCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
if (CC_UNLIKELY(path.isEmpty() && (!path.isInverseFillType()))) {
return;
}
- mCanvas->drawPath(path, paint);
+ mCanvas->drawPath(path, *filterPaint(paint));
}
void SkiaCanvas::drawVertices(const SkVertices* vertices, SkBlendMode mode, const SkPaint& paint) {
- mCanvas->drawVertices(vertices, mode, paint);
+ mCanvas->drawVertices(vertices, mode, *filterPaint(paint));
}
// ----------------------------------------------------------------------------
// Canvas draw operations: Bitmaps
// ----------------------------------------------------------------------------
-const SkPaint* SkiaCanvas::addFilter(const SkPaint* origPaint, SkPaint* tmpPaint,
- sk_sp<SkColorFilter> colorSpaceFilter) {
+SkiaCanvas::PaintCoW&& SkiaCanvas::filterBitmap(PaintCoW&& paint,
+ sk_sp<SkColorFilter> colorSpaceFilter) const {
/* We don't apply the colorSpace filter if this canvas is already wrapped with
* a SkColorSpaceXformCanvas since it already takes care of converting the
* contents of the bitmap into the appropriate colorspace. The mCanvasWrapper
@@ -550,39 +551,31 @@ const SkPaint* SkiaCanvas::addFilter(const SkPaint* origPaint, SkPaint* tmpPaint
* to have a non-sRGB colorspace.
*/
if (!mCanvasWrapper && colorSpaceFilter) {
- if (origPaint) {
- *tmpPaint = *origPaint;
- }
-
- if (tmpPaint->getColorFilter()) {
- tmpPaint->setColorFilter(
- SkColorFilter::MakeComposeFilter(tmpPaint->refColorFilter(), colorSpaceFilter));
- LOG_ALWAYS_FATAL_IF(!tmpPaint->getColorFilter());
+ SkPaint& tmpPaint = paint.writeable();
+ if (tmpPaint.getColorFilter()) {
+ tmpPaint.setColorFilter(SkColorFilter::MakeComposeFilter(tmpPaint.refColorFilter(),
+ std::move(colorSpaceFilter)));
+ LOG_ALWAYS_FATAL_IF(!tmpPaint.getColorFilter());
} else {
- tmpPaint->setColorFilter(colorSpaceFilter);
+ tmpPaint.setColorFilter(std::move(colorSpaceFilter));
}
-
- return tmpPaint;
- } else {
- return origPaint;
}
+ return filterPaint(std::move(paint));
}
void SkiaCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) {
- SkPaint tmpPaint;
sk_sp<SkColorFilter> colorFilter;
sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
- mCanvas->drawImage(image, left, top, addFilter(paint, &tmpPaint, colorFilter));
+ mCanvas->drawImage(image, left, top, filterBitmap(paint, std::move(colorFilter)));
}
void SkiaCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const SkPaint* paint) {
SkAutoCanvasRestore acr(mCanvas, true);
mCanvas->concat(matrix);
- SkPaint tmpPaint;
sk_sp<SkColorFilter> colorFilter;
sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
- mCanvas->drawImage(image, 0, 0, addFilter(paint, &tmpPaint, colorFilter));
+ mCanvas->drawImage(image, 0, 0, filterBitmap(paint, std::move(colorFilter)));
}
void SkiaCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float srcRight,
@@ -591,10 +584,9 @@ void SkiaCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float s
SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom);
SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
- SkPaint tmpPaint;
sk_sp<SkColorFilter> colorFilter;
sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
- mCanvas->drawImageRect(image, srcRect, dstRect, addFilter(paint, &tmpPaint, colorFilter),
+ mCanvas->drawImageRect(image, srcRect, dstRect, filterBitmap(paint, std::move(colorFilter)),
SkCanvas::kFast_SrcRectConstraint);
}
@@ -673,21 +665,20 @@ void SkiaCanvas::drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight,
#endif
// cons-up a shader for the bitmap
- SkPaint tmpPaint;
- if (paint) {
- tmpPaint = *paint;
- }
+ PaintCoW paintCoW(paint);
+ SkPaint& tmpPaint = paintCoW.writeable();
sk_sp<SkColorFilter> colorFilter;
sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
sk_sp<SkShader> shader =
image->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
if (colorFilter) {
- shader = shader->makeWithColorFilter(colorFilter);
+ shader = shader->makeWithColorFilter(std::move(colorFilter));
}
- tmpPaint.setShader(shader);
+ tmpPaint.setShader(std::move(shader));
- mCanvas->drawVertices(builder.detach(), SkBlendMode::kModulate, tmpPaint);
+ mCanvas->drawVertices(builder.detach(), SkBlendMode::kModulate,
+ *filterPaint(std::move(paintCoW)));
}
void SkiaCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& chunk, float dstLeft,
@@ -714,10 +705,10 @@ void SkiaCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& chunk, floa
lattice.fBounds = nullptr;
SkRect dst = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
- SkPaint tmpPaint;
sk_sp<SkColorFilter> colorFilter;
sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
- mCanvas->drawImageLattice(image.get(), lattice, dst, addFilter(paint, &tmpPaint, colorFilter));
+ mCanvas->drawImageLattice(image.get(), lattice, dst,
+ filterBitmap(paint, std::move(colorFilter)));
}
double SkiaCanvas::drawAnimatedImage(AnimatedImageDrawable* imgDrawable) {
@@ -740,12 +731,15 @@ void SkiaCanvas::drawGlyphs(ReadGlyphFunc glyphFunc, int count, const SkPaint& p
// glyphs centered or right-aligned; the offset above takes
// care of all alignment.
SkPaint paintCopy(paint);
+ if (mPaintFilter) {
+ mPaintFilter->filter(&paintCopy);
+ }
paintCopy.setTextAlign(SkPaint::kLeft_Align);
SkASSERT(paintCopy.getTextEncoding() == SkPaint::kGlyphID_TextEncoding);
// Stroke with a hairline is drawn on HW with a fill style for compatibility with Android O and
// older.
- if (!mCanvasOwned && sApiLevel <= 27 && paintCopy.getStrokeWidth() <= 0
- && paintCopy.getStyle() == SkPaint::kStroke_Style) {
+ if (!mCanvasOwned && sApiLevel <= 27 && paintCopy.getStrokeWidth() <= 0 &&
+ paintCopy.getStyle() == SkPaint::kStroke_Style) {
paintCopy.setStyle(SkPaint::kFill_Style);
}
@@ -768,6 +762,9 @@ void SkiaCanvas::drawLayoutOnPath(const minikin::Layout& layout, float hOffset,
// glyphs centered or right-aligned; the offsets take care of
// that portion of the alignment.
SkPaint paintCopy(paint);
+ if (mPaintFilter) {
+ mPaintFilter->filter(&paintCopy);
+ }
paintCopy.setTextAlign(SkPaint::kLeft_Align);
SkASSERT(paintCopy.getTextEncoding() == SkPaint::kGlyphID_TextEncoding);
diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h
index 3efc22a03cdf..24b7ec6d5c7b 100644
--- a/libs/hwui/SkiaCanvas.h
+++ b/libs/hwui/SkiaCanvas.h
@@ -22,7 +22,9 @@
#include "hwui/Canvas.h"
#include <SkCanvas.h>
-#include <SkTLazy.h>
+
+#include <cassert>
+#include <optional>
namespace android {
@@ -87,8 +89,8 @@ public:
virtual bool clipRect(float left, float top, float right, float bottom, SkClipOp op) override;
virtual bool clipPath(const SkPath* path, SkClipOp op) override;
- virtual SkDrawFilter* getDrawFilter() override;
- virtual void setDrawFilter(SkDrawFilter* drawFilter) override;
+ virtual PaintFilter* getPaintFilter() override;
+ virtual void setPaintFilter(sk_sp<PaintFilter> paintFilter) override;
virtual SkCanvasState* captureCanvasState() const override;
@@ -158,6 +160,46 @@ protected:
const SkPaint& paint, const SkPath& path, size_t start,
size_t end) override;
+ /** This class acts as a copy on write SkPaint.
+ *
+ * Initially this will be the SkPaint passed to the contructor.
+ * The first time writable() is called this will become a copy of the
+ * initial SkPaint (or a default SkPaint if nullptr).
+ */
+ struct PaintCoW {
+ PaintCoW(const SkPaint& that) : mPtr(&that) {}
+ PaintCoW(const SkPaint* ptr) : mPtr(ptr) {}
+ PaintCoW(const PaintCoW&) = delete;
+ PaintCoW(PaintCoW&&) = delete;
+ PaintCoW& operator=(const PaintCoW&) = delete;
+ PaintCoW& operator=(PaintCoW&&) = delete;
+ SkPaint& writeable() {
+ if (!mStorage) {
+ if (!mPtr) {
+ mStorage.emplace();
+ } else {
+ mStorage.emplace(*mPtr);
+ }
+ mPtr = &*mStorage;
+ }
+ return *mStorage;
+ }
+ operator const SkPaint*() const { return mPtr; }
+ const SkPaint* operator->() const { assert(mPtr); return mPtr; }
+ const SkPaint& operator*() const { assert(mPtr); return *mPtr; }
+ explicit operator bool() { return mPtr != nullptr; }
+ private:
+ const SkPaint* mPtr;
+ std::optional<SkPaint> mStorage;
+ };
+
+ /** Filters the paint using the current paint filter.
+ *
+ * @param paint the paint to filter. Will be initialized with the default
+ * SkPaint before filtering if filtering is required.
+ */
+ PaintCoW&& filterPaint(PaintCoW&& paint) const;
+
private:
struct SaveRec {
int saveCount;
@@ -174,8 +216,15 @@ private:
void drawPoints(const float* points, int count, const SkPaint& paint, SkCanvas::PointMode mode);
- const SkPaint* addFilter(const SkPaint* origPaint, SkPaint* tmpPaint,
- sk_sp<SkColorFilter> colorSpaceFilter);
+ /** Filters the paint for bitmap drawing.
+ *
+ * After filtering the paint for bitmap drawing,
+ * also calls filterPaint on the paint.
+ *
+ * @param paint the paint to filter. Will be initialized with the default
+ * SkPaint before filtering if filtering is required.
+ */
+ PaintCoW&& filterBitmap(PaintCoW&& paint, sk_sp<SkColorFilter> colorSpaceFilter) const;
class Clip;
@@ -185,6 +234,7 @@ private:
// unless it is the same as mCanvasOwned.get()
std::unique_ptr<SkDeque> mSaveStack; // lazily allocated, tracks partial saves.
std::vector<Clip> mClipStack; // tracks persistent clips.
+ sk_sp<PaintFilter> mPaintFilter;
};
} // namespace android
diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp
deleted file mode 100644
index df746554f306..000000000000
--- a/libs/hwui/SkiaShader.cpp
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include "SkiaShader.h"
-
-#include "Caches.h"
-#include "Extensions.h"
-#include "Matrix.h"
-#include "Texture.h"
-#include "hwui/Bitmap.h"
-
-#include <SkMatrix.h>
-#include <utils/Log.h>
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Support
-///////////////////////////////////////////////////////////////////////////////
-
-static constexpr GLenum gTileModes[] = {
- GL_CLAMP_TO_EDGE, // == SkShader::kClamp_TileMode
- GL_REPEAT, // == SkShader::kRepeat_Mode
- GL_MIRRORED_REPEAT // == SkShader::kMirror_TileMode
-};
-
-static_assert(gTileModes[SkShader::kClamp_TileMode] == GL_CLAMP_TO_EDGE,
- "SkShader TileModes have changed");
-static_assert(gTileModes[SkShader::kRepeat_TileMode] == GL_REPEAT,
- "SkShader TileModes have changed");
-static_assert(gTileModes[SkShader::kMirror_TileMode] == GL_MIRRORED_REPEAT,
- "SkShader TileModes have changed");
-
-/**
- * This function does not work for n == 0.
- */
-static inline bool isPowerOfTwo(unsigned int n) {
- return !(n & (n - 1));
-}
-
-static inline void bindUniformColor(int slot, FloatColor color) {
- glUniform4fv(slot, 1, reinterpret_cast<const float*>(&color));
-}
-
-static inline void bindTexture(Caches* caches, Texture* texture, GLenum wrapS, GLenum wrapT) {
- caches->textureState().bindTexture(texture->target(), texture->id());
- texture->setWrapST(wrapS, wrapT);
-}
-
-/**
- * Compute the matrix to transform to screen space.
- * @param screenSpace Output param for the computed matrix.
- * @param unitMatrix The unit matrix for gradient shaders, as returned by SkShader::asAGradient,
- * or identity.
- * @param localMatrix Local matrix, as returned by SkShader::getLocalMatrix().
- * @param modelViewMatrix Model view matrix, as supplied by the OpenGLRenderer.
- */
-static void computeScreenSpaceMatrix(mat4& screenSpace, const SkMatrix& unitMatrix,
- const SkMatrix& localMatrix, const mat4& modelViewMatrix) {
- mat4 shaderMatrix;
- // uses implicit construction
- shaderMatrix.loadInverse(localMatrix);
- // again, uses implicit construction
- screenSpace.loadMultiply(unitMatrix, shaderMatrix);
- screenSpace.multiply(modelViewMatrix);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Gradient shader matrix helpers
-///////////////////////////////////////////////////////////////////////////////
-
-static void toLinearUnitMatrix(const SkPoint pts[2], SkMatrix* matrix) {
- SkVector vec = pts[1] - pts[0];
- const float mag = vec.length();
- const float inv = mag ? 1.0f / mag : 0;
-
- vec.scale(inv);
- matrix->setSinCos(-vec.fY, vec.fX, pts[0].fX, pts[0].fY);
- matrix->postTranslate(-pts[0].fX, -pts[0].fY);
- matrix->postScale(inv, inv);
-}
-
-static void toCircularUnitMatrix(const float x, const float y, const float radius,
- SkMatrix* matrix) {
- const float inv = 1.0f / radius;
- matrix->setTranslate(-x, -y);
- matrix->postScale(inv, inv);
-}
-
-static void toSweepUnitMatrix(const float x, const float y, SkMatrix* matrix) {
- matrix->setTranslate(-x, -y);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Common gradient code
-///////////////////////////////////////////////////////////////////////////////
-
-static bool isSimpleGradient(const SkShader::GradientInfo& gradInfo) {
- return gradInfo.fColorCount == 2 && gradInfo.fTileMode == SkShader::kClamp_TileMode;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Store / apply
-///////////////////////////////////////////////////////////////////////////////
-
-bool tryStoreGradient(Caches& caches, const SkShader& shader, const Matrix4 modelViewMatrix,
- GLuint* textureUnit, ProgramDescription* description,
- SkiaShaderData::GradientShaderData* outData) {
- SkShader::GradientInfo gradInfo;
- gradInfo.fColorCount = 0;
- gradInfo.fColors = nullptr;
- gradInfo.fColorOffsets = nullptr;
-
- SkMatrix unitMatrix;
- switch (shader.asAGradient(&gradInfo)) {
- case SkShader::kLinear_GradientType:
- description->gradientType = ProgramDescription::kGradientLinear;
-
- toLinearUnitMatrix(gradInfo.fPoint, &unitMatrix);
- break;
- case SkShader::kRadial_GradientType:
- description->gradientType = ProgramDescription::kGradientCircular;
-
- toCircularUnitMatrix(gradInfo.fPoint[0].fX, gradInfo.fPoint[0].fY, gradInfo.fRadius[0],
- &unitMatrix);
- break;
- case SkShader::kSweep_GradientType:
- description->gradientType = ProgramDescription::kGradientSweep;
-
- toSweepUnitMatrix(gradInfo.fPoint[0].fX, gradInfo.fPoint[0].fY, &unitMatrix);
- break;
- default:
- // Do nothing. This shader is unsupported.
- return false;
- }
- description->hasGradient = true;
- description->isSimpleGradient = isSimpleGradient(gradInfo);
-
- computeScreenSpaceMatrix(outData->screenSpace, unitMatrix, shader.getLocalMatrix(),
- modelViewMatrix);
-
- // re-query shader to get full color / offset data
- std::unique_ptr<SkColor[]> colorStorage(new SkColor[gradInfo.fColorCount]);
- std::unique_ptr<SkScalar[]> colorOffsets(new SkScalar[gradInfo.fColorCount]);
- gradInfo.fColors = &colorStorage[0];
- gradInfo.fColorOffsets = &colorOffsets[0];
- shader.asAGradient(&gradInfo);
-
- if (CC_UNLIKELY(!description->isSimpleGradient)) {
- outData->gradientSampler = (*textureUnit)++;
-
-#ifndef SK_SCALAR_IS_FLOAT
-#error Need to convert gradInfo.fColorOffsets to float!
-#endif
- outData->gradientTexture = caches.gradientCache.get(
- gradInfo.fColors, gradInfo.fColorOffsets, gradInfo.fColorCount);
- outData->wrapST = gTileModes[gradInfo.fTileMode];
- } else {
- outData->gradientSampler = 0;
- outData->gradientTexture = nullptr;
-
- outData->startColor.set(gradInfo.fColors[0]);
- outData->endColor.set(gradInfo.fColors[1]);
- }
-
- return true;
-}
-
-void applyGradient(Caches& caches, const SkiaShaderData::GradientShaderData& data,
- const GLsizei width, const GLsizei height) {
- if (CC_UNLIKELY(data.gradientTexture)) {
- caches.textureState().activateTexture(data.gradientSampler);
- bindTexture(&caches, data.gradientTexture, data.wrapST, data.wrapST);
- glUniform1i(caches.program().getUniform("gradientSampler"), data.gradientSampler);
- } else {
- bindUniformColor(caches.program().getUniform("startColor"), data.startColor);
- bindUniformColor(caches.program().getUniform("endColor"), data.endColor);
- }
-
- glUniform2f(caches.program().getUniform("screenSize"), 1.0f / width, 1.0f / height);
- glUniformMatrix4fv(caches.program().getUniform("screenSpace"), 1, GL_FALSE,
- &data.screenSpace.data[0]);
-}
-
-bool tryStoreBitmap(Caches& caches, const SkShader& shader, const Matrix4& modelViewMatrix,
- GLuint* textureUnit, ProgramDescription* description,
- SkiaShaderData::BitmapShaderData* outData) {
- SkBitmap bitmap;
- SkShader::TileMode xy[2];
- if (!shader.isABitmap(&bitmap, nullptr, xy)) {
- return false;
- }
-
- // TODO: create hwui-owned BitmapShader.
- Bitmap* hwuiBitmap = static_cast<Bitmap*>(bitmap.pixelRef());
- outData->bitmapTexture = caches.textureCache.get(hwuiBitmap);
- if (!outData->bitmapTexture) return false;
-
- outData->bitmapSampler = (*textureUnit)++;
-
- const float width = outData->bitmapTexture->width();
- const float height = outData->bitmapTexture->height();
-
- Texture* texture = outData->bitmapTexture;
-
- description->hasBitmap = true;
- description->hasLinearTexture = texture->isLinear();
- description->hasColorSpaceConversion = texture->hasColorSpaceConversion();
- description->transferFunction = texture->getTransferFunctionType();
- description->hasTranslucentConversion = texture->blend;
- description->isShaderBitmapExternal = hwuiBitmap->isHardware();
- // gralloc doesn't support non-clamp modes
- if (hwuiBitmap->isHardware() ||
- (!caches.extensions().hasNPot() && (!isPowerOfTwo(width) || !isPowerOfTwo(height)) &&
- (xy[0] != SkShader::kClamp_TileMode || xy[1] != SkShader::kClamp_TileMode))) {
- // need non-clamp mode, but it's not supported for this draw,
- // so enable custom shader logic to mimic
- description->useShaderBasedWrap = true;
- description->bitmapWrapS = gTileModes[xy[0]];
- description->bitmapWrapT = gTileModes[xy[1]];
-
- outData->wrapS = GL_CLAMP_TO_EDGE;
- outData->wrapT = GL_CLAMP_TO_EDGE;
- } else {
- outData->wrapS = gTileModes[xy[0]];
- outData->wrapT = gTileModes[xy[1]];
- }
-
- computeScreenSpaceMatrix(outData->textureTransform, SkMatrix::I(), shader.getLocalMatrix(),
- modelViewMatrix);
- outData->textureDimension[0] = 1.0f / width;
- outData->textureDimension[1] = 1.0f / height;
-
- return true;
-}
-
-void applyBitmap(Caches& caches, const SkiaShaderData::BitmapShaderData& data) {
- caches.textureState().activateTexture(data.bitmapSampler);
- bindTexture(&caches, data.bitmapTexture, data.wrapS, data.wrapT);
- data.bitmapTexture->setFilter(GL_LINEAR);
-
- glUniform1i(caches.program().getUniform("bitmapSampler"), data.bitmapSampler);
- glUniformMatrix4fv(caches.program().getUniform("textureTransform"), 1, GL_FALSE,
- &data.textureTransform.data[0]);
- glUniform2fv(caches.program().getUniform("textureDimension"), 1, &data.textureDimension[0]);
-}
-
-SkiaShaderType getComposeSubType(const SkShader& shader) {
- // First check for a gradient shader.
- switch (shader.asAGradient(nullptr)) {
- case SkShader::kNone_GradientType:
- // Not a gradient shader. Fall through to check for other types.
- break;
- case SkShader::kLinear_GradientType:
- case SkShader::kRadial_GradientType:
- case SkShader::kSweep_GradientType:
- return kGradient_SkiaShaderType;
- default:
- // This is a Skia gradient that has no SkiaShader equivalent. Return None to skip.
- return kNone_SkiaShaderType;
- }
-
- // The shader is not a gradient. Check for a bitmap shader.
- if (shader.isABitmap()) {
- return kBitmap_SkiaShaderType;
- }
- return kNone_SkiaShaderType;
-}
-
-void storeCompose(Caches& caches, const SkShader& bitmapShader, const SkShader& gradientShader,
- const Matrix4& modelViewMatrix, GLuint* textureUnit,
- ProgramDescription* description, SkiaShaderData* outData) {
- LOG_ALWAYS_FATAL_IF(!tryStoreBitmap(caches, bitmapShader, modelViewMatrix, textureUnit,
- description, &outData->bitmapData),
- "failed storing bitmap shader data");
- LOG_ALWAYS_FATAL_IF(!tryStoreGradient(caches, gradientShader, modelViewMatrix, textureUnit,
- description, &outData->gradientData),
- "failing storing gradient shader data");
-}
-
-bool tryStoreCompose(Caches& caches, const SkShader& shader, const Matrix4& modelViewMatrix,
- GLuint* textureUnit, ProgramDescription* description,
- SkiaShaderData* outData) {
- SkShader::ComposeRec rec;
- if (!shader.asACompose(&rec)) return false;
-
- const SkiaShaderType shaderAType = getComposeSubType(*rec.fShaderA);
- const SkiaShaderType shaderBType = getComposeSubType(*rec.fShaderB);
-
- // check that type enum values are the 2 flags that compose the kCompose value
- if ((shaderAType & shaderBType) != 0) return false;
- if ((shaderAType | shaderBType) != kCompose_SkiaShaderType) return false;
-
- mat4 transform;
- computeScreenSpaceMatrix(transform, SkMatrix::I(), shader.getLocalMatrix(), modelViewMatrix);
- if (shaderAType == kBitmap_SkiaShaderType) {
- description->isBitmapFirst = true;
- storeCompose(caches, *rec.fShaderA, *rec.fShaderB, transform, textureUnit, description,
- outData);
- } else {
- description->isBitmapFirst = false;
- storeCompose(caches, *rec.fShaderB, *rec.fShaderA, transform, textureUnit, description,
- outData);
- }
- description->shadersMode = rec.fBlendMode;
- return true;
-}
-
-void SkiaShader::store(Caches& caches, const SkShader& shader, const Matrix4& modelViewMatrix,
- GLuint* textureUnit, ProgramDescription* description,
- SkiaShaderData* outData) {
- if (tryStoreGradient(caches, shader, modelViewMatrix, textureUnit, description,
- &outData->gradientData)) {
- outData->skiaShaderType = kGradient_SkiaShaderType;
- return;
- }
-
- if (tryStoreBitmap(caches, shader, modelViewMatrix, textureUnit, description,
- &outData->bitmapData)) {
- outData->skiaShaderType = kBitmap_SkiaShaderType;
- return;
- }
-
- if (tryStoreCompose(caches, shader, modelViewMatrix, textureUnit, description, outData)) {
- outData->skiaShaderType = kCompose_SkiaShaderType;
- return;
- }
-
- // Unknown/unsupported type, so explicitly ignore shader
- outData->skiaShaderType = kNone_SkiaShaderType;
-}
-
-void SkiaShader::apply(Caches& caches, const SkiaShaderData& data, const GLsizei width,
- const GLsizei height) {
- if (!data.skiaShaderType) return;
-
- if (data.skiaShaderType & kGradient_SkiaShaderType) {
- applyGradient(caches, data.gradientData, width, height);
- }
- if (data.skiaShaderType & kBitmap_SkiaShaderType) {
- applyBitmap(caches, data.bitmapData);
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/SkiaShader.h b/libs/hwui/SkiaShader.h
deleted file mode 100644
index e8e92bdc1d76..000000000000
--- a/libs/hwui/SkiaShader.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_SKIA_SHADER_H
-#define ANDROID_HWUI_SKIA_SHADER_H
-
-#include "FloatColor.h"
-#include "Matrix.h"
-
-#include <GLES2/gl2.h>
-#include <SkShader.h>
-#include <cutils/compiler.h>
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-class Extensions;
-class Texture;
-struct ProgramDescription;
-
-/**
- * Type of Skia shader in use.
- *
- * Note that kBitmap | kGradient = kCompose, since Compose implies
- * both its component types are in use simultaneously. No other
- * composition of multiple types is supported.
- */
-enum SkiaShaderType {
- kNone_SkiaShaderType = 0,
- kBitmap_SkiaShaderType = 1,
- kGradient_SkiaShaderType = 2,
- kCompose_SkiaShaderType = kBitmap_SkiaShaderType | kGradient_SkiaShaderType,
-};
-
-struct SkiaShaderData {
- SkiaShaderType skiaShaderType;
- struct BitmapShaderData {
- Texture* bitmapTexture;
- GLuint bitmapSampler;
- GLenum wrapS;
- GLenum wrapT;
-
- Matrix4 textureTransform;
- float textureDimension[2];
- } bitmapData;
- struct GradientShaderData {
- Matrix4 screenSpace;
-
- // simple gradient
- FloatColor startColor;
- FloatColor endColor;
-
- // complex gradient
- Texture* gradientTexture;
- GLuint gradientSampler;
- GLenum wrapST;
- } gradientData;
-};
-
-class SkiaShader {
-public:
- static void store(Caches& caches, const SkShader& shader, const Matrix4& modelViewMatrix,
- GLuint* textureUnit, ProgramDescription* description,
- SkiaShaderData* outData);
- static void apply(Caches& caches, const SkiaShaderData& data, const GLsizei width,
- const GLsizei height);
-};
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_SKIA_SHADER_H
diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp
deleted file mode 100644
index e371ac8da1e5..000000000000
--- a/libs/hwui/SpotShadow.cpp
+++ /dev/null
@@ -1,1120 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-// The highest z value can't be higher than (CASTER_Z_CAP_RATIO * light.z)
-#define CASTER_Z_CAP_RATIO 0.95f
-
-// When there is no umbra, then just fake the umbra using
-// centroid * (1 - FAKE_UMBRA_SIZE_RATIO) + outline * FAKE_UMBRA_SIZE_RATIO
-#define FAKE_UMBRA_SIZE_RATIO 0.05f
-
-// When the polygon is about 90 vertices, the penumbra + umbra can reach 270 rays.
-// That is consider pretty fine tessllated polygon so far.
-// This is just to prevent using too much some memory when edge slicing is not
-// needed any more.
-#define FINE_TESSELLATED_POLYGON_RAY_NUMBER 270
-/**
- * Extra vertices for the corner for smoother corner.
- * Only for outer loop.
- * Note that we use such extra memory to avoid an extra loop.
- */
-// For half circle, we could add EXTRA_VERTEX_PER_PI vertices.
-// Set to 1 if we don't want to have any.
-#define SPOT_EXTRA_CORNER_VERTEX_PER_PI 18
-
-// For the whole polygon, the sum of all the deltas b/t normals is 2 * M_PI,
-// therefore, the maximum number of extra vertices will be twice bigger.
-#define SPOT_MAX_EXTRA_CORNER_VERTEX_NUMBER (2 * SPOT_EXTRA_CORNER_VERTEX_PER_PI)
-
-// For each RADIANS_DIVISOR, we would allocate one more vertex b/t the normals.
-#define SPOT_CORNER_RADIANS_DIVISOR (M_PI / SPOT_EXTRA_CORNER_VERTEX_PER_PI)
-
-#define PENUMBRA_ALPHA 0.0f
-#define UMBRA_ALPHA 1.0f
-
-#include "SpotShadow.h"
-
-#include "ShadowTessellator.h"
-#include "Vertex.h"
-#include "VertexBuffer.h"
-#include "utils/MathUtils.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <utils/Log.h>
-#include <algorithm>
-
-// TODO: After we settle down the new algorithm, we can remove the old one and
-// its utility functions.
-// Right now, we still need to keep it for comparison purpose and future expansion.
-namespace android {
-namespace uirenderer {
-
-static const float EPSILON = 1e-7;
-
-/**
- * For each polygon's vertex, the light center will project it to the receiver
- * as one of the outline vertex.
- * For each outline vertex, we need to store the position and normal.
- * Normal here is defined against the edge by the current vertex and the next vertex.
- */
-struct OutlineData {
- Vector2 position;
- Vector2 normal;
- float radius;
-};
-
-/**
- * For each vertex, we need to keep track of its angle, whether it is penumbra or
- * umbra, and its corresponding vertex index.
- */
-struct SpotShadow::VertexAngleData {
- // The angle to the vertex from the centroid.
- float mAngle;
- // True is the vertex comes from penumbra, otherwise it comes from umbra.
- bool mIsPenumbra;
- // The index of the vertex described by this data.
- int mVertexIndex;
- void set(float angle, bool isPenumbra, int index) {
- mAngle = angle;
- mIsPenumbra = isPenumbra;
- mVertexIndex = index;
- }
-};
-
-/**
- * Calculate the angle between and x and a y coordinate.
- * The atan2 range from -PI to PI.
- */
-static float angle(const Vector2& point, const Vector2& center) {
- return atan2(point.y - center.y, point.x - center.x);
-}
-
-/**
- * Calculate the intersection of a ray with the line segment defined by two points.
- *
- * Returns a negative value in error conditions.
-
- * @param rayOrigin The start of the ray
- * @param dx The x vector of the ray
- * @param dy The y vector of the ray
- * @param p1 The first point defining the line segment
- * @param p2 The second point defining the line segment
- * @return The distance along the ray if it intersects with the line segment, negative if otherwise
- */
-static float rayIntersectPoints(const Vector2& rayOrigin, float dx, float dy, const Vector2& p1,
- const Vector2& p2) {
- // The math below is derived from solving this formula, basically the
- // intersection point should stay on both the ray and the edge of (p1, p2).
- // solve([p1x+t*(p2x-p1x)=dx*t2+px,p1y+t*(p2y-p1y)=dy*t2+py],[t,t2]);
-
- float divisor = (dx * (p1.y - p2.y) + dy * p2.x - dy * p1.x);
- if (divisor == 0) return -1.0f; // error, invalid divisor
-
-#if DEBUG_SHADOW
- float interpVal = (dx * (p1.y - rayOrigin.y) + dy * rayOrigin.x - dy * p1.x) / divisor;
- if (interpVal < 0 || interpVal > 1) {
- ALOGW("rayIntersectPoints is hitting outside the segment %f", interpVal);
- }
-#endif
-
- float distance = (p1.x * (rayOrigin.y - p2.y) + p2.x * (p1.y - rayOrigin.y) +
- rayOrigin.x * (p2.y - p1.y)) /
- divisor;
-
- return distance; // may be negative in error cases
-}
-
-/**
- * Sort points by their X coordinates
- *
- * @param points the points as a Vector2 array.
- * @param pointsLength the number of vertices of the polygon.
- */
-void SpotShadow::xsort(Vector2* points, int pointsLength) {
- auto cmp = [](const Vector2& a, const Vector2& b) -> bool { return a.x < b.x; };
- std::sort(points, points + pointsLength, cmp);
-}
-
-/**
- * compute the convex hull of a collection of Points
- *
- * @param points the points as a Vector2 array.
- * @param pointsLength the number of vertices of the polygon.
- * @param retPoly pre allocated array of floats to put the vertices
- * @return the number of points in the polygon 0 if no intersection
- */
-int SpotShadow::hull(Vector2* points, int pointsLength, Vector2* retPoly) {
- xsort(points, pointsLength);
- int n = pointsLength;
- Vector2 lUpper[n];
- lUpper[0] = points[0];
- lUpper[1] = points[1];
-
- int lUpperSize = 2;
-
- for (int i = 2; i < n; i++) {
- lUpper[lUpperSize] = points[i];
- lUpperSize++;
-
- while (lUpperSize > 2 &&
- !ccw(lUpper[lUpperSize - 3].x, lUpper[lUpperSize - 3].y, lUpper[lUpperSize - 2].x,
- lUpper[lUpperSize - 2].y, lUpper[lUpperSize - 1].x, lUpper[lUpperSize - 1].y)) {
- // Remove the middle point of the three last
- lUpper[lUpperSize - 2].x = lUpper[lUpperSize - 1].x;
- lUpper[lUpperSize - 2].y = lUpper[lUpperSize - 1].y;
- lUpperSize--;
- }
- }
-
- Vector2 lLower[n];
- lLower[0] = points[n - 1];
- lLower[1] = points[n - 2];
-
- int lLowerSize = 2;
-
- for (int i = n - 3; i >= 0; i--) {
- lLower[lLowerSize] = points[i];
- lLowerSize++;
-
- while (lLowerSize > 2 &&
- !ccw(lLower[lLowerSize - 3].x, lLower[lLowerSize - 3].y, lLower[lLowerSize - 2].x,
- lLower[lLowerSize - 2].y, lLower[lLowerSize - 1].x, lLower[lLowerSize - 1].y)) {
- // Remove the middle point of the three last
- lLower[lLowerSize - 2] = lLower[lLowerSize - 1];
- lLowerSize--;
- }
- }
-
- // output points in CW ordering
- const int total = lUpperSize + lLowerSize - 2;
- int outIndex = total - 1;
- for (int i = 0; i < lUpperSize; i++) {
- retPoly[outIndex] = lUpper[i];
- outIndex--;
- }
-
- for (int i = 1; i < lLowerSize - 1; i++) {
- retPoly[outIndex] = lLower[i];
- outIndex--;
- }
- // TODO: Add test harness which verify that all the points are inside the hull.
- return total;
-}
-
-/**
- * Test whether the 3 points form a counter clockwise turn.
- *
- * @return true if a right hand turn
- */
-bool SpotShadow::ccw(float ax, float ay, float bx, float by, float cx, float cy) {
- return (bx - ax) * (cy - ay) - (by - ay) * (cx - ax) > EPSILON;
-}
-
-/**
- * Sort points about a center point
- *
- * @param poly The in and out polyogon as a Vector2 array.
- * @param polyLength The number of vertices of the polygon.
- * @param center the center ctr[0] = x , ctr[1] = y to sort around.
- */
-void SpotShadow::sort(Vector2* poly, int polyLength, const Vector2& center) {
- quicksortCirc(poly, 0, polyLength - 1, center);
-}
-
-/**
- * Swap points pointed to by i and j
- */
-void SpotShadow::swap(Vector2* points, int i, int j) {
- Vector2 temp = points[i];
- points[i] = points[j];
- points[j] = temp;
-}
-
-/**
- * quick sort implementation about the center.
- */
-void SpotShadow::quicksortCirc(Vector2* points, int low, int high, const Vector2& center) {
- int i = low, j = high;
- int p = low + (high - low) / 2;
- float pivot = angle(points[p], center);
- while (i <= j) {
- while (angle(points[i], center) > pivot) {
- i++;
- }
- while (angle(points[j], center) < pivot) {
- j--;
- }
-
- if (i <= j) {
- swap(points, i, j);
- i++;
- j--;
- }
- }
- if (low < j) quicksortCirc(points, low, j, center);
- if (i < high) quicksortCirc(points, i, high, center);
-}
-
-/**
- * Test whether a point is inside the polygon.
- *
- * @param testPoint the point to test
- * @param poly the polygon
- * @return true if the testPoint is inside the poly.
- */
-bool SpotShadow::testPointInsidePolygon(const Vector2 testPoint, const Vector2* poly, int len) {
- bool c = false;
- float testx = testPoint.x;
- float testy = testPoint.y;
- for (int i = 0, j = len - 1; i < len; j = i++) {
- float startX = poly[j].x;
- float startY = poly[j].y;
- float endX = poly[i].x;
- float endY = poly[i].y;
-
- if (((endY > testy) != (startY > testy)) &&
- (testx < (startX - endX) * (testy - endY) / (startY - endY) + endX)) {
- c = !c;
- }
- }
- return c;
-}
-
-/**
- * Reverse the polygon
- *
- * @param polygon the polygon as a Vector2 array
- * @param len the number of points of the polygon
- */
-void SpotShadow::reverse(Vector2* polygon, int len) {
- int n = len / 2;
- for (int i = 0; i < n; i++) {
- Vector2 tmp = polygon[i];
- int k = len - 1 - i;
- polygon[i] = polygon[k];
- polygon[k] = tmp;
- }
-}
-
-/**
- * Compute a horizontal circular polygon about point (x , y , height) of radius
- * (size)
- *
- * @param points number of the points of the output polygon.
- * @param lightCenter the center of the light.
- * @param size the light size.
- * @param ret result polygon.
- */
-void SpotShadow::computeLightPolygon(int points, const Vector3& lightCenter, float size,
- Vector3* ret) {
- // TODO: Caching all the sin / cos values and store them in a look up table.
- for (int i = 0; i < points; i++) {
- float angle = 2 * i * M_PI / points;
- ret[i].x = cosf(angle) * size + lightCenter.x;
- ret[i].y = sinf(angle) * size + lightCenter.y;
- ret[i].z = lightCenter.z;
- }
-}
-
-/**
- * From light center, project one vertex to the z=0 surface and get the outline.
- *
- * @param outline The result which is the outline position.
- * @param lightCenter The center of light.
- * @param polyVertex The input polygon's vertex.
- *
- * @return float The ratio of (polygon.z / light.z - polygon.z)
- */
-float SpotShadow::projectCasterToOutline(Vector2& outline, const Vector3& lightCenter,
- const Vector3& polyVertex) {
- float lightToPolyZ = lightCenter.z - polyVertex.z;
- float ratioZ = CASTER_Z_CAP_RATIO;
- if (lightToPolyZ != 0) {
- // If any caster's vertex is almost above the light, we just keep it as 95%
- // of the height of the light.
- ratioZ = MathUtils::clamp(polyVertex.z / lightToPolyZ, 0.0f, CASTER_Z_CAP_RATIO);
- }
-
- outline.x = polyVertex.x - ratioZ * (lightCenter.x - polyVertex.x);
- outline.y = polyVertex.y - ratioZ * (lightCenter.y - polyVertex.y);
- return ratioZ;
-}
-
-/**
- * Generate the shadow spot light of shape lightPoly and a object poly
- *
- * @param isCasterOpaque whether the caster is opaque
- * @param lightCenter the center of the light
- * @param lightSize the radius of the light
- * @param poly x,y,z vertexes of a convex polygon that occludes the light source
- * @param polyLength number of vertexes of the occluding polygon
- * @param shadowTriangleStrip return an (x,y,alpha) triangle strip representing the shadow. Return
- * empty strip if error.
- */
-void SpotShadow::createSpotShadow(bool isCasterOpaque, const Vector3& lightCenter, float lightSize,
- const Vector3* poly, int polyLength, const Vector3& polyCentroid,
- VertexBuffer& shadowTriangleStrip) {
- if (CC_UNLIKELY(lightCenter.z <= 0)) {
- ALOGW("Relative Light Z is not positive. No spot shadow!");
- return;
- }
- if (CC_UNLIKELY(polyLength < 3)) {
-#if DEBUG_SHADOW
- ALOGW("Invalid polygon length. No spot shadow!");
-#endif
- return;
- }
- OutlineData outlineData[polyLength];
- Vector2 outlineCentroid;
- // Calculate the projected outline for each polygon's vertices from the light center.
- //
- // O Light
- // /
- // /
- // . Polygon vertex
- // /
- // /
- // O Outline vertices
- //
- // Ratio = (Poly - Outline) / (Light - Poly)
- // Outline.x = Poly.x - Ratio * (Light.x - Poly.x)
- // Outline's radius / Light's radius = Ratio
-
- // Compute the last outline vertex to make sure we can get the normal and outline
- // in one single loop.
- projectCasterToOutline(outlineData[polyLength - 1].position, lightCenter, poly[polyLength - 1]);
-
- // Take the outline's polygon, calculate the normal for each outline edge.
- int currentNormalIndex = polyLength - 1;
- int nextNormalIndex = 0;
-
- for (int i = 0; i < polyLength; i++) {
- float ratioZ = projectCasterToOutline(outlineData[i].position, lightCenter, poly[i]);
- outlineData[i].radius = ratioZ * lightSize;
-
- outlineData[currentNormalIndex].normal = ShadowTessellator::calculateNormal(
- outlineData[currentNormalIndex].position, outlineData[nextNormalIndex].position);
- currentNormalIndex = (currentNormalIndex + 1) % polyLength;
- nextNormalIndex++;
- }
-
- projectCasterToOutline(outlineCentroid, lightCenter, polyCentroid);
-
- int penumbraIndex = 0;
- // Then each polygon's vertex produce at minmal 2 penumbra vertices.
- // Since the size can be dynamic here, we keep track of the size and update
- // the real size at the end.
- int allocatedPenumbraLength = 2 * polyLength + SPOT_MAX_EXTRA_CORNER_VERTEX_NUMBER;
- Vector2 penumbra[allocatedPenumbraLength];
- int totalExtraCornerSliceNumber = 0;
-
- Vector2 umbra[polyLength];
-
- // When centroid is covered by all circles from outline, then we consider
- // the umbra is invalid, and we will tune down the shadow strength.
- bool hasValidUmbra = true;
- // We need the minimal of RaitoVI to decrease the spot shadow strength accordingly.
- float minRaitoVI = FLT_MAX;
-
- for (int i = 0; i < polyLength; i++) {
- // Generate all the penumbra's vertices only using the (outline vertex + normal * radius)
- // There is no guarantee that the penumbra is still convex, but for
- // each outline vertex, it will connect to all its corresponding penumbra vertices as
- // triangle fans. And for neighber penumbra vertex, it will be a trapezoid.
- //
- // Penumbra Vertices marked as Pi
- // Outline Vertices marked as Vi
- // (P3)
- // (P2) | ' (P4)
- // (P1)' | | '
- // ' | | '
- // (P0) ------------------------------------------------(P5)
- // | (V0) |(V1)
- // | |
- // | |
- // | |
- // | |
- // | |
- // | |
- // | |
- // | |
- // (V3)-----------------------------------(V2)
- int preNormalIndex = (i + polyLength - 1) % polyLength;
-
- const Vector2& previousNormal = outlineData[preNormalIndex].normal;
- const Vector2& currentNormal = outlineData[i].normal;
-
- // Depending on how roundness we want for each corner, we can subdivide
- // further here and/or introduce some heuristic to decide how much the
- // subdivision should be.
- int currentExtraSliceNumber = ShadowTessellator::getExtraVertexNumber(
- previousNormal, currentNormal, SPOT_CORNER_RADIANS_DIVISOR);
-
- int currentCornerSliceNumber = 1 + currentExtraSliceNumber;
- totalExtraCornerSliceNumber += currentExtraSliceNumber;
-#if DEBUG_SHADOW
- ALOGD("currentExtraSliceNumber should be %d", currentExtraSliceNumber);
- ALOGD("currentCornerSliceNumber should be %d", currentCornerSliceNumber);
- ALOGD("totalCornerSliceNumber is %d", totalExtraCornerSliceNumber);
-#endif
- if (CC_UNLIKELY(totalExtraCornerSliceNumber > SPOT_MAX_EXTRA_CORNER_VERTEX_NUMBER)) {
- currentCornerSliceNumber = 1;
- }
- for (int k = 0; k <= currentCornerSliceNumber; k++) {
- Vector2 avgNormal =
- (previousNormal * (currentCornerSliceNumber - k) + currentNormal * k) /
- currentCornerSliceNumber;
- avgNormal.normalize();
- penumbra[penumbraIndex++] = outlineData[i].position + avgNormal * outlineData[i].radius;
- }
-
- // Compute the umbra by the intersection from the outline's centroid!
- //
- // (V) ------------------------------------
- // | ' |
- // | ' |
- // | ' (I) |
- // | ' |
- // | ' (C) |
- // | |
- // | |
- // | |
- // | |
- // ------------------------------------
- //
- // Connect a line b/t the outline vertex (V) and the centroid (C), it will
- // intersect with the outline vertex's circle at point (I).
- // Now, ratioVI = VI / VC, ratioIC = IC / VC
- // Then the intersetion point can be computed as Ixy = Vxy * ratioIC + Cxy * ratioVI;
- //
- // When all of the outline circles cover the the outline centroid, (like I is
- // on the other side of C), there is no real umbra any more, so we just fake
- // a small area around the centroid as the umbra, and tune down the spot
- // shadow's umbra strength to simulate the effect the whole shadow will
- // become lighter in this case.
- // The ratio can be simulated by using the inverse of maximum of ratioVI for
- // all (V).
- float distOutline = (outlineData[i].position - outlineCentroid).length();
- if (CC_UNLIKELY(distOutline == 0)) {
- // If the outline has 0 area, then there is no spot shadow anyway.
- ALOGW("Outline has 0 area, no spot shadow!");
- return;
- }
-
- float ratioVI = outlineData[i].radius / distOutline;
- minRaitoVI = std::min(minRaitoVI, ratioVI);
- if (ratioVI >= (1 - FAKE_UMBRA_SIZE_RATIO)) {
- ratioVI = (1 - FAKE_UMBRA_SIZE_RATIO);
- }
- // When we know we don't have valid umbra, don't bother to compute the
- // values below. But we can't skip the loop yet since we want to know the
- // maximum ratio.
- float ratioIC = 1 - ratioVI;
- umbra[i] = outlineData[i].position * ratioIC + outlineCentroid * ratioVI;
- }
-
- hasValidUmbra = (minRaitoVI <= 1.0);
- float shadowStrengthScale = 1.0;
- if (!hasValidUmbra) {
-#if DEBUG_SHADOW
- ALOGW("The object is too close to the light or too small, no real umbra!");
-#endif
- for (int i = 0; i < polyLength; i++) {
- umbra[i] = outlineData[i].position * FAKE_UMBRA_SIZE_RATIO +
- outlineCentroid * (1 - FAKE_UMBRA_SIZE_RATIO);
- }
- shadowStrengthScale = 1.0 / minRaitoVI;
- }
-
- int penumbraLength = penumbraIndex;
- int umbraLength = polyLength;
-
-#if DEBUG_SHADOW
- ALOGD("penumbraLength is %d , allocatedPenumbraLength %d", penumbraLength,
- allocatedPenumbraLength);
- dumpPolygon(poly, polyLength, "input poly");
- dumpPolygon(penumbra, penumbraLength, "penumbra");
- dumpPolygon(umbra, umbraLength, "umbra");
- ALOGD("hasValidUmbra is %d and shadowStrengthScale is %f", hasValidUmbra, shadowStrengthScale);
-#endif
-
- // The penumbra and umbra needs to be in convex shape to keep consistency
- // and quality.
- // Since we are still shooting rays to penumbra, it needs to be convex.
- // Umbra can be represented as a fan from the centroid, but visually umbra
- // looks nicer when it is convex.
- Vector2 finalUmbra[umbraLength];
- Vector2 finalPenumbra[penumbraLength];
- int finalUmbraLength = hull(umbra, umbraLength, finalUmbra);
- int finalPenumbraLength = hull(penumbra, penumbraLength, finalPenumbra);
-
- generateTriangleStrip(isCasterOpaque, shadowStrengthScale, finalPenumbra, finalPenumbraLength,
- finalUmbra, finalUmbraLength, poly, polyLength, shadowTriangleStrip,
- outlineCentroid);
-}
-
-/**
- * This is only for experimental purpose.
- * After intersections are calculated, we could smooth the polygon if needed.
- * So far, we don't think it is more appealing yet.
- *
- * @param level The level of smoothness.
- * @param rays The total number of rays.
- * @param rayDist (In and Out) The distance for each ray.
- *
- */
-void SpotShadow::smoothPolygon(int level, int rays, float* rayDist) {
- for (int k = 0; k < level; k++) {
- for (int i = 0; i < rays; i++) {
- float p1 = rayDist[(rays - 1 + i) % rays];
- float p2 = rayDist[i];
- float p3 = rayDist[(i + 1) % rays];
- rayDist[i] = (p1 + p2 * 2 + p3) / 4;
- }
- }
-}
-
-// Index pair is meant for storing the tessellation information for the penumbra
-// area. One index must come from exterior tangent of the circles, the other one
-// must come from the interior tangent of the circles.
-struct IndexPair {
- int outerIndex;
- int innerIndex;
-};
-
-// For one penumbra vertex, find the cloest umbra vertex and return its index.
-inline int getClosestUmbraIndex(const Vector2& pivot, const Vector2* polygon, int polygonLength) {
- float minLengthSquared = FLT_MAX;
- int resultIndex = -1;
- bool hasDecreased = false;
- // Starting with some negative offset, assuming both umbra and penumbra are starting
- // at the same angle, this can help to find the result faster.
- // Normally, loop 3 times, we can find the closest point.
- int offset = polygonLength - 2;
- for (int i = 0; i < polygonLength; i++) {
- int currentIndex = (i + offset) % polygonLength;
- float currentLengthSquared = (pivot - polygon[currentIndex]).lengthSquared();
- if (currentLengthSquared < minLengthSquared) {
- if (minLengthSquared != FLT_MAX) {
- hasDecreased = true;
- }
- minLengthSquared = currentLengthSquared;
- resultIndex = currentIndex;
- } else if (currentLengthSquared > minLengthSquared && hasDecreased) {
- // Early break b/c we have found the closet one and now the length
- // is increasing again.
- break;
- }
- }
- if (resultIndex == -1) {
- ALOGE("resultIndex is -1, the polygon must be invalid!");
- resultIndex = 0;
- }
- return resultIndex;
-}
-
-// Allow some epsilon here since the later ray intersection did allow for some small
-// floating point error, when the intersection point is slightly outside the segment.
-inline bool sameDirections(bool isPositiveCross, float a, float b) {
- if (isPositiveCross) {
- return a >= -EPSILON && b >= -EPSILON;
- } else {
- return a <= EPSILON && b <= EPSILON;
- }
-}
-
-// Find the right polygon edge to shoot the ray at.
-inline int findPolyIndex(bool isPositiveCross, int startPolyIndex, const Vector2& umbraDir,
- const Vector2* polyToCentroid, int polyLength) {
- // Make sure we loop with a bound.
- for (int i = 0; i < polyLength; i++) {
- int currentIndex = (i + startPolyIndex) % polyLength;
- const Vector2& currentToCentroid = polyToCentroid[currentIndex];
- const Vector2& nextToCentroid = polyToCentroid[(currentIndex + 1) % polyLength];
-
- float currentCrossUmbra = currentToCentroid.cross(umbraDir);
- float umbraCrossNext = umbraDir.cross(nextToCentroid);
- if (sameDirections(isPositiveCross, currentCrossUmbra, umbraCrossNext)) {
-#if DEBUG_SHADOW
- ALOGD("findPolyIndex loop %d times , index %d", i, currentIndex);
-#endif
- return currentIndex;
- }
- }
- LOG_ALWAYS_FATAL("Can't find the right polygon's edge from startPolyIndex %d", startPolyIndex);
- return -1;
-}
-
-// Generate the index pair for penumbra / umbra vertices, and more penumbra vertices
-// if needed.
-inline void genNewPenumbraAndPairWithUmbra(const Vector2* penumbra, int penumbraLength,
- const Vector2* umbra, int umbraLength,
- Vector2* newPenumbra, int& newPenumbraIndex,
- IndexPair* verticesPair, int& verticesPairIndex) {
- // In order to keep everything in just one loop, we need to pre-compute the
- // closest umbra vertex for the last penumbra vertex.
- int previousClosestUmbraIndex =
- getClosestUmbraIndex(penumbra[penumbraLength - 1], umbra, umbraLength);
- for (int i = 0; i < penumbraLength; i++) {
- const Vector2& currentPenumbraVertex = penumbra[i];
- // For current penumbra vertex, starting from previousClosestUmbraIndex,
- // then check the next one until the distance increase.
- // The last one before the increase is the umbra vertex we need to pair with.
- float currentLengthSquared =
- (currentPenumbraVertex - umbra[previousClosestUmbraIndex]).lengthSquared();
- int currentClosestUmbraIndex = previousClosestUmbraIndex;
- int indexDelta = 0;
- for (int j = 1; j < umbraLength; j++) {
- int newUmbraIndex = (previousClosestUmbraIndex + j) % umbraLength;
- float newLengthSquared = (currentPenumbraVertex - umbra[newUmbraIndex]).lengthSquared();
- if (newLengthSquared > currentLengthSquared) {
- // currentClosestUmbraIndex is the umbra vertex's index which has
- // currently found smallest distance, so we can simply break here.
- break;
- } else {
- currentLengthSquared = newLengthSquared;
- indexDelta++;
- currentClosestUmbraIndex = newUmbraIndex;
- }
- }
-
- if (indexDelta > 1) {
- // For those umbra don't have penumbra, generate new penumbra vertices by
- // interpolation.
- //
- // Assuming Pi for penumbra vertices, and Ui for umbra vertices.
- // In the case like below P1 paired with U1 and P2 paired with U5.
- // U2 to U4 are unpaired umbra vertices.
- //
- // P1 P2
- // | |
- // U1 U2 U3 U4 U5
- //
- // We will need to generate 3 more penumbra vertices P1.1, P1.2, P1.3
- // to pair with U2 to U4.
- //
- // P1 P1.1 P1.2 P1.3 P2
- // | | | | |
- // U1 U2 U3 U4 U5
- //
- // That distance ratio b/t Ui to U1 and Ui to U5 decides its paired penumbra
- // vertex's location.
- int newPenumbraNumber = indexDelta - 1;
-
- float accumulatedDeltaLength[indexDelta];
- float totalDeltaLength = 0;
-
- // To save time, cache the previous umbra vertex info outside the loop
- // and update each loop.
- Vector2 previousClosestUmbra = umbra[previousClosestUmbraIndex];
- Vector2 skippedUmbra;
- // Use umbra data to precompute the length b/t unpaired umbra vertices,
- // and its ratio against the total length.
- for (int k = 0; k < indexDelta; k++) {
- int skippedUmbraIndex = (previousClosestUmbraIndex + k + 1) % umbraLength;
- skippedUmbra = umbra[skippedUmbraIndex];
- float currentDeltaLength = (skippedUmbra - previousClosestUmbra).length();
-
- totalDeltaLength += currentDeltaLength;
- accumulatedDeltaLength[k] = totalDeltaLength;
-
- previousClosestUmbra = skippedUmbra;
- }
-
- const Vector2& previousPenumbra = penumbra[(i + penumbraLength - 1) % penumbraLength];
- // Then for each unpaired umbra vertex, create a new penumbra by the ratio,
- // and pair them togehter.
- for (int k = 0; k < newPenumbraNumber; k++) {
- float weightForCurrentPenumbra = 1.0f;
- if (totalDeltaLength != 0.0f) {
- weightForCurrentPenumbra = accumulatedDeltaLength[k] / totalDeltaLength;
- }
- float weightForPreviousPenumbra = 1.0f - weightForCurrentPenumbra;
-
- Vector2 interpolatedPenumbra = currentPenumbraVertex * weightForCurrentPenumbra +
- previousPenumbra * weightForPreviousPenumbra;
-
- int skippedUmbraIndex = (previousClosestUmbraIndex + k + 1) % umbraLength;
- verticesPair[verticesPairIndex].outerIndex = newPenumbraIndex;
- verticesPair[verticesPairIndex].innerIndex = skippedUmbraIndex;
- verticesPairIndex++;
- newPenumbra[newPenumbraIndex++] = interpolatedPenumbra;
- }
- }
- verticesPair[verticesPairIndex].outerIndex = newPenumbraIndex;
- verticesPair[verticesPairIndex].innerIndex = currentClosestUmbraIndex;
- verticesPairIndex++;
- newPenumbra[newPenumbraIndex++] = currentPenumbraVertex;
-
- previousClosestUmbraIndex = currentClosestUmbraIndex;
- }
-}
-
-// Precompute all the polygon's vector, return true if the reference cross product is positive.
-inline bool genPolyToCentroid(const Vector2* poly2d, int polyLength, const Vector2& centroid,
- Vector2* polyToCentroid) {
- for (int j = 0; j < polyLength; j++) {
- polyToCentroid[j] = poly2d[j] - centroid;
- // Normalize these vectors such that we can use epsilon comparison after
- // computing their cross products with another normalized vector.
- polyToCentroid[j].normalize();
- }
- float refCrossProduct = 0;
- for (int j = 0; j < polyLength; j++) {
- refCrossProduct = polyToCentroid[j].cross(polyToCentroid[(j + 1) % polyLength]);
- if (refCrossProduct != 0) {
- break;
- }
- }
-
- return refCrossProduct > 0;
-}
-
-// For one umbra vertex, shoot an ray from centroid to it.
-// If the ray hit the polygon first, then return the intersection point as the
-// closer vertex.
-inline Vector2 getCloserVertex(const Vector2& umbraVertex, const Vector2& centroid,
- const Vector2* poly2d, int polyLength, const Vector2* polyToCentroid,
- bool isPositiveCross, int& previousPolyIndex) {
- Vector2 umbraToCentroid = umbraVertex - centroid;
- float distanceToUmbra = umbraToCentroid.length();
- umbraToCentroid = umbraToCentroid / distanceToUmbra;
-
- // previousPolyIndex is updated for each item such that we can minimize the
- // looping inside findPolyIndex();
- previousPolyIndex = findPolyIndex(isPositiveCross, previousPolyIndex, umbraToCentroid,
- polyToCentroid, polyLength);
-
- float dx = umbraToCentroid.x;
- float dy = umbraToCentroid.y;
- float distanceToIntersectPoly =
- rayIntersectPoints(centroid, dx, dy, poly2d[previousPolyIndex],
- poly2d[(previousPolyIndex + 1) % polyLength]);
- if (distanceToIntersectPoly < 0) {
- distanceToIntersectPoly = 0;
- }
-
- // Pick the closer one as the occluded area vertex.
- Vector2 closerVertex;
- if (distanceToIntersectPoly < distanceToUmbra) {
- closerVertex.x = centroid.x + dx * distanceToIntersectPoly;
- closerVertex.y = centroid.y + dy * distanceToIntersectPoly;
- } else {
- closerVertex = umbraVertex;
- }
-
- return closerVertex;
-}
-
-/**
- * Generate a triangle strip given two convex polygon
-**/
-void SpotShadow::generateTriangleStrip(bool isCasterOpaque, float shadowStrengthScale,
- Vector2* penumbra, int penumbraLength, Vector2* umbra,
- int umbraLength, const Vector3* poly, int polyLength,
- VertexBuffer& shadowTriangleStrip, const Vector2& centroid) {
- bool hasOccludedUmbraArea = false;
- Vector2 poly2d[polyLength];
-
- if (isCasterOpaque) {
- for (int i = 0; i < polyLength; i++) {
- poly2d[i].x = poly[i].x;
- poly2d[i].y = poly[i].y;
- }
- // Make sure the centroid is inside the umbra, otherwise, fall back to the
- // approach as if there is no occluded umbra area.
- if (testPointInsidePolygon(centroid, poly2d, polyLength)) {
- hasOccludedUmbraArea = true;
- }
- }
-
- // For each penumbra vertex, find its corresponding closest umbra vertex index.
- //
- // Penumbra Vertices marked as Pi
- // Umbra Vertices marked as Ui
- // (P3)
- // (P2) | ' (P4)
- // (P1)' | | '
- // ' | | '
- // (P0) ------------------------------------------------(P5)
- // | (U0) |(U1)
- // | |
- // | |(U2) (P5.1)
- // | |
- // | |
- // | |
- // | |
- // | |
- // | |
- // (U4)-----------------------------------(U3) (P6)
- //
- // At least, like P0, P1, P2, they will find the matching umbra as U0.
- // If we jump over some umbra vertex without matching penumbra vertex, then
- // we will generate some new penumbra vertex by interpolation. Like P6 is
- // matching U3, but U2 is not matched with any penumbra vertex.
- // So interpolate P5.1 out and match U2.
- // In this way, every umbra vertex will have a matching penumbra vertex.
- //
- // The total pair number can be as high as umbraLength + penumbraLength.
- const int maxNewPenumbraLength = umbraLength + penumbraLength;
- IndexPair verticesPair[maxNewPenumbraLength];
- int verticesPairIndex = 0;
-
- // Cache all the existing penumbra vertices and newly interpolated vertices into a
- // a new array.
- Vector2 newPenumbra[maxNewPenumbraLength];
- int newPenumbraIndex = 0;
-
- // For each penumbra vertex, find its closet umbra vertex by comparing the
- // neighbor umbra vertices.
- genNewPenumbraAndPairWithUmbra(penumbra, penumbraLength, umbra, umbraLength, newPenumbra,
- newPenumbraIndex, verticesPair, verticesPairIndex);
- ShadowTessellator::checkOverflow(verticesPairIndex, maxNewPenumbraLength, "Spot pair");
- ShadowTessellator::checkOverflow(newPenumbraIndex, maxNewPenumbraLength, "Spot new penumbra");
-#if DEBUG_SHADOW
- for (int i = 0; i < umbraLength; i++) {
- ALOGD("umbra i %d, [%f, %f]", i, umbra[i].x, umbra[i].y);
- }
- for (int i = 0; i < newPenumbraIndex; i++) {
- ALOGD("new penumbra i %d, [%f, %f]", i, newPenumbra[i].x, newPenumbra[i].y);
- }
- for (int i = 0; i < verticesPairIndex; i++) {
- ALOGD("index i %d, [%d, %d]", i, verticesPair[i].outerIndex, verticesPair[i].innerIndex);
- }
-#endif
-
- // For the size of vertex buffer, we need 3 rings, one has newPenumbraSize,
- // one has umbraLength, the last one has at most umbraLength.
- //
- // For the size of index buffer, the umbra area needs (2 * umbraLength + 2).
- // The penumbra one can vary a bit, but it is bounded by (2 * verticesPairIndex + 2).
- // And 2 more for jumping between penumbra to umbra.
- const int newPenumbraLength = newPenumbraIndex;
- const int totalVertexCount = newPenumbraLength + umbraLength * 2;
- const int totalIndexCount = 2 * umbraLength + 2 * verticesPairIndex + 6;
- AlphaVertex* shadowVertices = shadowTriangleStrip.alloc<AlphaVertex>(totalVertexCount);
- uint16_t* indexBuffer = shadowTriangleStrip.allocIndices<uint16_t>(totalIndexCount);
- int vertexBufferIndex = 0;
- int indexBufferIndex = 0;
-
- // Fill the IB and VB for the penumbra area.
- for (int i = 0; i < newPenumbraLength; i++) {
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], newPenumbra[i].x, newPenumbra[i].y,
- PENUMBRA_ALPHA);
- }
- // Since the umbra can be a faked one when the occluder is too high, the umbra should be lighter
- // in this case.
- float scaledUmbraAlpha = UMBRA_ALPHA * shadowStrengthScale;
-
- for (int i = 0; i < umbraLength; i++) {
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], umbra[i].x, umbra[i].y,
- scaledUmbraAlpha);
- }
-
- for (int i = 0; i < verticesPairIndex; i++) {
- indexBuffer[indexBufferIndex++] = verticesPair[i].outerIndex;
- // All umbra index need to be offseted by newPenumbraSize.
- indexBuffer[indexBufferIndex++] = verticesPair[i].innerIndex + newPenumbraLength;
- }
- indexBuffer[indexBufferIndex++] = verticesPair[0].outerIndex;
- indexBuffer[indexBufferIndex++] = verticesPair[0].innerIndex + newPenumbraLength;
-
- // Now fill the IB and VB for the umbra area.
- // First duplicated the index from previous strip and the first one for the
- // degenerated triangles.
- indexBuffer[indexBufferIndex] = indexBuffer[indexBufferIndex - 1];
- indexBufferIndex++;
- indexBuffer[indexBufferIndex++] = newPenumbraLength + 0;
- // Save the first VB index for umbra area in order to close the loop.
- int savedStartIndex = vertexBufferIndex;
-
- if (hasOccludedUmbraArea) {
- // Precompute all the polygon's vector, and the reference cross product,
- // in order to find the right polygon edge for the ray to intersect.
- Vector2 polyToCentroid[polyLength];
- bool isPositiveCross = genPolyToCentroid(poly2d, polyLength, centroid, polyToCentroid);
-
- // Because both the umbra and polygon are going in the same direction,
- // we can save the previous polygon index to make sure we have less polygon
- // vertex to compute for each ray.
- int previousPolyIndex = 0;
- for (int i = 0; i < umbraLength; i++) {
- // Shoot a ray from centroid to each umbra vertices and pick the one with
- // shorter distance to the centroid, b/t the umbra vertex or the intersection point.
- Vector2 closerVertex =
- getCloserVertex(umbra[i], centroid, poly2d, polyLength, polyToCentroid,
- isPositiveCross, previousPolyIndex);
-
- // We already stored the umbra vertices, just need to add the occlued umbra's ones.
- indexBuffer[indexBufferIndex++] = newPenumbraLength + i;
- indexBuffer[indexBufferIndex++] = vertexBufferIndex;
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], closerVertex.x, closerVertex.y,
- scaledUmbraAlpha);
- }
- } else {
- // If there is no occluded umbra at all, then draw the triangle fan
- // starting from the centroid to all umbra vertices.
- int lastCentroidIndex = vertexBufferIndex;
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], centroid.x, centroid.y,
- scaledUmbraAlpha);
- for (int i = 0; i < umbraLength; i++) {
- indexBuffer[indexBufferIndex++] = newPenumbraLength + i;
- indexBuffer[indexBufferIndex++] = lastCentroidIndex;
- }
- }
- // Closing the umbra area triangle's loop here.
- indexBuffer[indexBufferIndex++] = newPenumbraLength;
- indexBuffer[indexBufferIndex++] = savedStartIndex;
-
- // At the end, update the real index and vertex buffer size.
- shadowTriangleStrip.updateVertexCount(vertexBufferIndex);
- shadowTriangleStrip.updateIndexCount(indexBufferIndex);
- ShadowTessellator::checkOverflow(vertexBufferIndex, totalVertexCount, "Spot Vertex Buffer");
- ShadowTessellator::checkOverflow(indexBufferIndex, totalIndexCount, "Spot Index Buffer");
-
- shadowTriangleStrip.setMeshFeatureFlags(VertexBuffer::kAlpha | VertexBuffer::kIndices);
- shadowTriangleStrip.computeBounds<AlphaVertex>();
-}
-
-#if DEBUG_SHADOW
-
-#define TEST_POINT_NUMBER 128
-/**
- * Calculate the bounds for generating random test points.
- */
-void SpotShadow::updateBound(const Vector2 inVector, Vector2& lowerBound, Vector2& upperBound) {
- if (inVector.x < lowerBound.x) {
- lowerBound.x = inVector.x;
- }
-
- if (inVector.y < lowerBound.y) {
- lowerBound.y = inVector.y;
- }
-
- if (inVector.x > upperBound.x) {
- upperBound.x = inVector.x;
- }
-
- if (inVector.y > upperBound.y) {
- upperBound.y = inVector.y;
- }
-}
-
-/**
- * For debug purpose, when things go wrong, dump the whole polygon data.
- */
-void SpotShadow::dumpPolygon(const Vector2* poly, int polyLength, const char* polyName) {
- for (int i = 0; i < polyLength; i++) {
- ALOGD("polygon %s i %d x %f y %f", polyName, i, poly[i].x, poly[i].y);
- }
-}
-
-/**
- * For debug purpose, when things go wrong, dump the whole polygon data.
- */
-void SpotShadow::dumpPolygon(const Vector3* poly, int polyLength, const char* polyName) {
- for (int i = 0; i < polyLength; i++) {
- ALOGD("polygon %s i %d x %f y %f z %f", polyName, i, poly[i].x, poly[i].y, poly[i].z);
- }
-}
-
-/**
- * Test whether the polygon is convex.
- */
-bool SpotShadow::testConvex(const Vector2* polygon, int polygonLength, const char* name) {
- bool isConvex = true;
- for (int i = 0; i < polygonLength; i++) {
- Vector2 start = polygon[i];
- Vector2 middle = polygon[(i + 1) % polygonLength];
- Vector2 end = polygon[(i + 2) % polygonLength];
-
- float delta = (float(middle.x) - start.x) * (float(end.y) - start.y) -
- (float(middle.y) - start.y) * (float(end.x) - start.x);
- bool isCCWOrCoLinear = (delta >= EPSILON);
-
- if (isCCWOrCoLinear) {
- ALOGW("(Error Type 2): polygon (%s) is not a convex b/c start (x %f, y %f),"
- "middle (x %f, y %f) and end (x %f, y %f) , delta is %f !!!",
- name, start.x, start.y, middle.x, middle.y, end.x, end.y, delta);
- isConvex = false;
- break;
- }
- }
- return isConvex;
-}
-
-/**
- * Test whether or not the polygon (intersection) is within the 2 input polygons.
- * Using Marte Carlo method, we generate a random point, and if it is inside the
- * intersection, then it must be inside both source polygons.
- */
-void SpotShadow::testIntersection(const Vector2* poly1, int poly1Length, const Vector2* poly2,
- int poly2Length, const Vector2* intersection,
- int intersectionLength) {
- // Find the min and max of x and y.
- Vector2 lowerBound = {FLT_MAX, FLT_MAX};
- Vector2 upperBound = {-FLT_MAX, -FLT_MAX};
- for (int i = 0; i < poly1Length; i++) {
- updateBound(poly1[i], lowerBound, upperBound);
- }
- for (int i = 0; i < poly2Length; i++) {
- updateBound(poly2[i], lowerBound, upperBound);
- }
-
- bool dumpPoly = false;
- for (int k = 0; k < TEST_POINT_NUMBER; k++) {
- // Generate a random point between minX, minY and maxX, maxY.
- float randomX = rand() / float(RAND_MAX);
- float randomY = rand() / float(RAND_MAX);
-
- Vector2 testPoint;
- testPoint.x = lowerBound.x + randomX * (upperBound.x - lowerBound.x);
- testPoint.y = lowerBound.y + randomY * (upperBound.y - lowerBound.y);
-
- // If the random point is in both poly 1 and 2, then it must be intersection.
- if (testPointInsidePolygon(testPoint, intersection, intersectionLength)) {
- if (!testPointInsidePolygon(testPoint, poly1, poly1Length)) {
- dumpPoly = true;
- ALOGW("(Error Type 1): one point (%f, %f) in the intersection is"
- " not in the poly1",
- testPoint.x, testPoint.y);
- }
-
- if (!testPointInsidePolygon(testPoint, poly2, poly2Length)) {
- dumpPoly = true;
- ALOGW("(Error Type 1): one point (%f, %f) in the intersection is"
- " not in the poly2",
- testPoint.x, testPoint.y);
- }
- }
- }
-
- if (dumpPoly) {
- dumpPolygon(intersection, intersectionLength, "intersection");
- for (int i = 1; i < intersectionLength; i++) {
- Vector2 delta = intersection[i] - intersection[i - 1];
- ALOGD("Intersetion i, %d Vs i-1 is delta %f", i, delta.lengthSquared());
- }
-
- dumpPolygon(poly1, poly1Length, "poly 1");
- dumpPolygon(poly2, poly2Length, "poly 2");
- }
-}
-#endif
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/SpotShadow.h b/libs/hwui/SpotShadow.h
deleted file mode 100644
index 8476be70318b..000000000000
--- a/libs/hwui/SpotShadow.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-#ifndef ANDROID_HWUI_SPOT_SHADOW_H
-#define ANDROID_HWUI_SPOT_SHADOW_H
-
-#include "Debug.h"
-#include "Vector.h"
-
-namespace android {
-namespace uirenderer {
-
-class VertexBuffer;
-
-class SpotShadow {
-public:
- static void createSpotShadow(bool isCasterOpaque, const Vector3& lightCenter, float lightSize,
- const Vector3* poly, int polyLength, const Vector3& polyCentroid,
- VertexBuffer& retstrips);
-
-private:
- struct VertexAngleData;
-
- static float projectCasterToOutline(Vector2& outline, const Vector3& lightCenter,
- const Vector3& polyVertex);
-
- static void computeLightPolygon(int points, const Vector3& lightCenter, float size,
- Vector3* ret);
-
- static void smoothPolygon(int level, int rays, float* rayDist);
- static float rayIntersectPoly(const Vector2* poly, int polyLength, const Vector2& point,
- float dx, float dy);
-
- static void xsort(Vector2* points, int pointsLength);
- static int hull(Vector2* points, int pointsLength, Vector2* retPoly);
- static bool ccw(float ax, float ay, float bx, float by, float cx, float cy);
- static void sort(Vector2* poly, int polyLength, const Vector2& center);
-
- static void swap(Vector2* points, int i, int j);
- static void quicksortCirc(Vector2* points, int low, int high, const Vector2& center);
- static void quicksortX(Vector2* points, int low, int high);
-
- static bool testPointInsidePolygon(const Vector2 testPoint, const Vector2* poly, int len);
- static void reverse(Vector2* polygon, int len);
-
- static void generateTriangleStrip(bool isCasterOpaque, float shadowStrengthScale,
- Vector2* penumbra, int penumbraLength, Vector2* umbra,
- int umbraLength, const Vector3* poly, int polyLength,
- VertexBuffer& retstrips, const Vector2& centroid);
-
-#if DEBUG_SHADOW
- static bool testConvex(const Vector2* polygon, int polygonLength, const char* name);
- static void testIntersection(const Vector2* poly1, int poly1Length, const Vector2* poly2,
- int poly2Length, const Vector2* intersection,
- int intersectionLength);
- static void updateBound(const Vector2 inVector, Vector2& lowerBound, Vector2& upperBound);
- static void dumpPolygon(const Vector2* poly, int polyLength, const char* polyName);
- static void dumpPolygon(const Vector3* poly, int polyLength, const char* polyName);
-#endif
-
-}; // SpotShadow
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_SPOT_SHADOW_H
diff --git a/libs/hwui/TessellationCache.cpp b/libs/hwui/TessellationCache.cpp
deleted file mode 100644
index c7d93da718e7..000000000000
--- a/libs/hwui/TessellationCache.cpp
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-#include <utils/JenkinsHash.h>
-#include <utils/Trace.h>
-
-#include "Caches.h"
-#include "PathTessellator.h"
-#include "ShadowTessellator.h"
-#include "TessellationCache.h"
-
-#include "thread/Signal.h"
-#include "thread/Task.h"
-#include "thread/TaskProcessor.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache entries
-///////////////////////////////////////////////////////////////////////////////
-
-TessellationCache::Description::Description()
- : type(Type::None)
- , scaleX(1.0f)
- , scaleY(1.0f)
- , aa(false)
- , cap(SkPaint::kDefault_Cap)
- , style(SkPaint::kFill_Style)
- , strokeWidth(1.0f) {
- // Shape bits should be set to zeroes, because they are used for hash calculation.
- memset(&shape, 0, sizeof(Shape));
-}
-
-TessellationCache::Description::Description(Type type, const Matrix4& transform,
- const SkPaint& paint)
- : type(type)
- , aa(paint.isAntiAlias())
- , cap(paint.getStrokeCap())
- , style(paint.getStyle())
- , strokeWidth(paint.getStrokeWidth()) {
- PathTessellator::extractTessellationScales(transform, &scaleX, &scaleY);
- // Shape bits should be set to zeroes, because they are used for hash calculation.
- memset(&shape, 0, sizeof(Shape));
-}
-
-bool TessellationCache::Description::operator==(const TessellationCache::Description& rhs) const {
- if (type != rhs.type) return false;
- if (scaleX != rhs.scaleX) return false;
- if (scaleY != rhs.scaleY) return false;
- if (aa != rhs.aa) return false;
- if (cap != rhs.cap) return false;
- if (style != rhs.style) return false;
- if (strokeWidth != rhs.strokeWidth) return false;
- if (type == Type::None) return true;
- const Shape::RoundRect& lRect = shape.roundRect;
- const Shape::RoundRect& rRect = rhs.shape.roundRect;
-
- if (lRect.width != rRect.width) return false;
- if (lRect.height != rRect.height) return false;
- if (lRect.rx != rRect.rx) return false;
- return lRect.ry == rRect.ry;
-}
-
-hash_t TessellationCache::Description::hash() const {
- uint32_t hash = JenkinsHashMix(0, static_cast<int>(type));
- hash = JenkinsHashMix(hash, aa);
- hash = JenkinsHashMix(hash, cap);
- hash = JenkinsHashMix(hash, style);
- hash = JenkinsHashMix(hash, android::hash_type(strokeWidth));
- hash = JenkinsHashMix(hash, android::hash_type(scaleX));
- hash = JenkinsHashMix(hash, android::hash_type(scaleY));
- hash = JenkinsHashMixBytes(hash, (uint8_t*)&shape, sizeof(Shape));
- return JenkinsHashWhiten(hash);
-}
-
-void TessellationCache::Description::setupMatrixAndPaint(Matrix4* matrix, SkPaint* paint) const {
- matrix->loadScale(scaleX, scaleY, 1.0f);
- paint->setAntiAlias(aa);
- paint->setStrokeCap(cap);
- paint->setStyle(style);
- paint->setStrokeWidth(strokeWidth);
-}
-
-TessellationCache::ShadowDescription::ShadowDescription() : nodeKey(nullptr) {
- memset(&matrixData, 0, sizeof(matrixData));
-}
-
-TessellationCache::ShadowDescription::ShadowDescription(const SkPath* nodeKey,
- const Matrix4* drawTransform)
- : nodeKey(nodeKey) {
- memcpy(&matrixData, drawTransform->data, sizeof(matrixData));
-}
-
-bool TessellationCache::ShadowDescription::operator==(
- const TessellationCache::ShadowDescription& rhs) const {
- return nodeKey == rhs.nodeKey && memcmp(&matrixData, &rhs.matrixData, sizeof(matrixData)) == 0;
-}
-
-hash_t TessellationCache::ShadowDescription::hash() const {
- uint32_t hash = JenkinsHashMixBytes(0, (uint8_t*)&nodeKey, sizeof(const void*));
- hash = JenkinsHashMixBytes(hash, (uint8_t*)&matrixData, sizeof(matrixData));
- return JenkinsHashWhiten(hash);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// General purpose tessellation task processing
-///////////////////////////////////////////////////////////////////////////////
-
-class TessellationCache::TessellationTask : public Task<VertexBuffer*> {
-public:
- TessellationTask(Tessellator tessellator, const Description& description)
- : tessellator(tessellator), description(description) {}
-
- ~TessellationTask() {}
-
- Tessellator tessellator;
- Description description;
-};
-
-class TessellationCache::TessellationProcessor : public TaskProcessor<VertexBuffer*> {
-public:
- explicit TessellationProcessor(Caches& caches) : TaskProcessor<VertexBuffer*>(&caches.tasks) {}
- ~TessellationProcessor() {}
-
- virtual void onProcess(const sp<Task<VertexBuffer*> >& task) override {
- TessellationTask* t = static_cast<TessellationTask*>(task.get());
- ATRACE_NAME("shape tessellation");
- VertexBuffer* buffer = t->tessellator(t->description);
- t->setResult(buffer);
- }
-};
-
-class TessellationCache::Buffer {
-public:
- explicit Buffer(const sp<Task<VertexBuffer*> >& task) : mTask(task), mBuffer(nullptr) {}
-
- ~Buffer() {
- mTask.clear();
- delete mBuffer;
- }
-
- unsigned int getSize() {
- blockOnPrecache();
- return mBuffer->getSize();
- }
-
- const VertexBuffer* getVertexBuffer() {
- blockOnPrecache();
- return mBuffer;
- }
-
-private:
- void blockOnPrecache() {
- if (mTask != nullptr) {
- mBuffer = mTask->getResult();
- LOG_ALWAYS_FATAL_IF(mBuffer == nullptr, "Failed to precache");
- mTask.clear();
- }
- }
- sp<Task<VertexBuffer*> > mTask;
- VertexBuffer* mBuffer;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Shadow tessellation task processing
-///////////////////////////////////////////////////////////////////////////////
-
-static void mapPointFakeZ(Vector3& point, const mat4* transformXY, const mat4* transformZ) {
- // map z coordinate with true 3d matrix
- point.z = transformZ->mapZ(point);
-
- // map x,y coordinates with draw/Skia matrix
- transformXY->mapPoint(point.x, point.y);
-}
-
-static void reverseVertexArray(Vertex* polygon, int len) {
- int n = len / 2;
- for (int i = 0; i < n; i++) {
- Vertex tmp = polygon[i];
- int k = len - 1 - i;
- polygon[i] = polygon[k];
- polygon[k] = tmp;
- }
-}
-
-void tessellateShadows(const Matrix4* drawTransform, const Rect* localClip, bool isCasterOpaque,
- const SkPath* casterPerimeter, const Matrix4* casterTransformXY,
- const Matrix4* casterTransformZ, const Vector3& lightCenter,
- float lightRadius, VertexBuffer& ambientBuffer, VertexBuffer& spotBuffer) {
- // tessellate caster outline into a 2d polygon
- std::vector<Vertex> casterVertices2d;
- const float casterRefinementThreshold = 2.0f;
- PathTessellator::approximatePathOutlineVertices(*casterPerimeter, casterRefinementThreshold,
- casterVertices2d);
-
- // Shadow requires CCW for now. TODO: remove potential double-reverse
- reverseVertexArray(&casterVertices2d.front(), casterVertices2d.size());
-
- if (casterVertices2d.size() == 0) return;
-
- // map 2d caster poly into 3d
- const int casterVertexCount = casterVertices2d.size();
- Vector3 casterPolygon[casterVertexCount];
- float minZ = FLT_MAX;
- float maxZ = -FLT_MAX;
- for (int i = 0; i < casterVertexCount; i++) {
- const Vertex& point2d = casterVertices2d[i];
- casterPolygon[i] = (Vector3){point2d.x, point2d.y, 0};
- mapPointFakeZ(casterPolygon[i], casterTransformXY, casterTransformZ);
- minZ = std::min(minZ, casterPolygon[i].z);
- maxZ = std::max(maxZ, casterPolygon[i].z);
- }
-
- // map the centroid of the caster into 3d
- Vector2 centroid = ShadowTessellator::centroid2d(
- reinterpret_cast<const Vector2*>(&casterVertices2d.front()), casterVertexCount);
- Vector3 centroid3d = {centroid.x, centroid.y, 0};
- mapPointFakeZ(centroid3d, casterTransformXY, casterTransformZ);
-
- // if the caster intersects the z=0 plane, lift it in Z so it doesn't
- if (minZ < SHADOW_MIN_CASTER_Z) {
- float casterLift = SHADOW_MIN_CASTER_Z - minZ;
- for (int i = 0; i < casterVertexCount; i++) {
- casterPolygon[i].z += casterLift;
- }
- centroid3d.z += casterLift;
- }
-
- // Check whether we want to draw the shadow at all by checking the caster's bounds against clip.
- // We only have ortho projection, so we can just ignore the Z in caster for
- // simple rejection calculation.
- Rect casterBounds(casterPerimeter->getBounds());
- casterTransformXY->mapRect(casterBounds);
-
- // actual tessellation of both shadows
- ShadowTessellator::tessellateAmbientShadow(isCasterOpaque, casterPolygon, casterVertexCount,
- centroid3d, casterBounds, *localClip, maxZ,
- ambientBuffer);
-
- ShadowTessellator::tessellateSpotShadow(isCasterOpaque, casterPolygon, casterVertexCount,
- centroid3d, *drawTransform, lightCenter, lightRadius,
- casterBounds, *localClip, spotBuffer);
-}
-
-class ShadowProcessor : public TaskProcessor<TessellationCache::vertexBuffer_pair_t> {
-public:
- explicit ShadowProcessor(Caches& caches)
- : TaskProcessor<TessellationCache::vertexBuffer_pair_t>(&caches.tasks) {}
- ~ShadowProcessor() {}
-
- virtual void onProcess(const sp<Task<TessellationCache::vertexBuffer_pair_t> >& task) override {
- TessellationCache::ShadowTask* t = static_cast<TessellationCache::ShadowTask*>(task.get());
- ATRACE_NAME("shadow tessellation");
-
- tessellateShadows(&t->drawTransform, &t->localClip, t->opaque, &t->casterPerimeter,
- &t->transformXY, &t->transformZ, t->lightCenter, t->lightRadius,
- t->ambientBuffer, t->spotBuffer);
-
- t->setResult(TessellationCache::vertexBuffer_pair_t(&t->ambientBuffer, &t->spotBuffer));
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache constructor/destructor
-///////////////////////////////////////////////////////////////////////////////
-
-TessellationCache::TessellationCache()
- : mMaxSize(MB(1))
- , mCache(LruCache<Description, Buffer*>::kUnlimitedCapacity)
- , mShadowCache(
- LruCache<ShadowDescription, Task<vertexBuffer_pair_t*>*>::kUnlimitedCapacity) {
- mCache.setOnEntryRemovedListener(&mBufferRemovedListener);
- mShadowCache.setOnEntryRemovedListener(&mBufferPairRemovedListener);
- mDebugEnabled = Properties::debugLevel & kDebugCaches;
-}
-
-TessellationCache::~TessellationCache() {
- mCache.clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Size management
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t TessellationCache::getSize() {
- LruCache<Description, Buffer*>::Iterator iter(mCache);
- uint32_t size = 0;
- while (iter.next()) {
- size += iter.value()->getSize();
- }
- return size;
-}
-
-uint32_t TessellationCache::getMaxSize() {
- return mMaxSize;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Caching
-///////////////////////////////////////////////////////////////////////////////
-
-void TessellationCache::trim() {
- uint32_t size = getSize();
- while (size > mMaxSize) {
- size -= mCache.peekOldestValue()->getSize();
- mCache.removeOldest();
- }
- mShadowCache.clear();
-}
-
-void TessellationCache::clear() {
- mCache.clear();
- mShadowCache.clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Callbacks
-///////////////////////////////////////////////////////////////////////////////
-
-void TessellationCache::BufferRemovedListener::operator()(Description& description,
- Buffer*& buffer) {
- delete buffer;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Shadows
-///////////////////////////////////////////////////////////////////////////////
-
-void TessellationCache::precacheShadows(const Matrix4* drawTransform, const Rect& localClip,
- bool opaque, const SkPath* casterPerimeter,
- const Matrix4* transformXY, const Matrix4* transformZ,
- const Vector3& lightCenter, float lightRadius) {
- ShadowDescription key(casterPerimeter, drawTransform);
-
- if (mShadowCache.get(key)) return;
- sp<ShadowTask> task = new ShadowTask(drawTransform, localClip, opaque, casterPerimeter,
- transformXY, transformZ, lightCenter, lightRadius);
- if (mShadowProcessor == nullptr) {
- mShadowProcessor = new ShadowProcessor(Caches::getInstance());
- }
- mShadowProcessor->add(task);
- task->incStrong(nullptr); // not using sp<>s, so manually ref while in the cache
- mShadowCache.put(key, task.get());
-}
-
-sp<TessellationCache::ShadowTask> TessellationCache::getShadowTask(
- const Matrix4* drawTransform, const Rect& localClip, bool opaque,
- const SkPath* casterPerimeter, const Matrix4* transformXY, const Matrix4* transformZ,
- const Vector3& lightCenter, float lightRadius) {
- ShadowDescription key(casterPerimeter, drawTransform);
- ShadowTask* task = static_cast<ShadowTask*>(mShadowCache.get(key));
- if (!task) {
- precacheShadows(drawTransform, localClip, opaque, casterPerimeter, transformXY, transformZ,
- lightCenter, lightRadius);
- task = static_cast<ShadowTask*>(mShadowCache.get(key));
- }
- LOG_ALWAYS_FATAL_IF(task == nullptr, "shadow not precached");
- return task;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Tessellation precaching
-///////////////////////////////////////////////////////////////////////////////
-
-TessellationCache::Buffer* TessellationCache::getOrCreateBuffer(const Description& entry,
- Tessellator tessellator) {
- Buffer* buffer = mCache.get(entry);
- if (!buffer) {
- // not cached, enqueue a task to fill the buffer
- sp<TessellationTask> task = new TessellationTask(tessellator, entry);
- buffer = new Buffer(task);
-
- if (mProcessor == nullptr) {
- mProcessor = new TessellationProcessor(Caches::getInstance());
- }
- mProcessor->add(task);
- bool inserted = mCache.put(entry, buffer);
- // Note to the static analyzer that this insert should always succeed.
- LOG_ALWAYS_FATAL_IF(!inserted, "buffers shouldn't spontaneously appear in the cache");
- }
- return buffer;
-}
-
-static VertexBuffer* tessellatePath(const TessellationCache::Description& description,
- const SkPath& path) {
- Matrix4 matrix;
- SkPaint paint;
- description.setupMatrixAndPaint(&matrix, &paint);
- VertexBuffer* buffer = new VertexBuffer();
- PathTessellator::tessellatePath(path, &paint, matrix, *buffer);
- return buffer;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// RoundRect
-///////////////////////////////////////////////////////////////////////////////
-
-static VertexBuffer* tessellateRoundRect(const TessellationCache::Description& description) {
- SkRect rect =
- SkRect::MakeWH(description.shape.roundRect.width, description.shape.roundRect.height);
- float rx = description.shape.roundRect.rx;
- float ry = description.shape.roundRect.ry;
- if (description.style == SkPaint::kStrokeAndFill_Style) {
- float outset = description.strokeWidth / 2;
- rect.outset(outset, outset);
- rx += outset;
- ry += outset;
- }
- SkPath path;
- path.addRoundRect(rect, rx, ry);
- return tessellatePath(description, path);
-}
-
-TessellationCache::Buffer* TessellationCache::getRoundRectBuffer(const Matrix4& transform,
- const SkPaint& paint, float width,
- float height, float rx, float ry) {
- Description entry(Description::Type::RoundRect, transform, paint);
- entry.shape.roundRect.width = width;
- entry.shape.roundRect.height = height;
- entry.shape.roundRect.rx = rx;
- entry.shape.roundRect.ry = ry;
- return getOrCreateBuffer(entry, &tessellateRoundRect);
-}
-const VertexBuffer* TessellationCache::getRoundRect(const Matrix4& transform, const SkPaint& paint,
- float width, float height, float rx, float ry) {
- return getRoundRectBuffer(transform, paint, width, height, rx, ry)->getVertexBuffer();
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/TessellationCache.h b/libs/hwui/TessellationCache.h
deleted file mode 100644
index a0f0ed4653e0..000000000000
--- a/libs/hwui/TessellationCache.h
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "Debug.h"
-#include "Matrix.h"
-#include "Rect.h"
-#include "Vector.h"
-#include "VertexBuffer.h"
-#include "thread/TaskProcessor.h"
-#include "utils/Macros.h"
-#include "utils/Pair.h"
-
-#include <SkPaint.h>
-#include <SkPath.h>
-
-#include <utils/LruCache.h>
-#include <utils/Mutex.h>
-#include <utils/StrongPointer.h>
-
-class SkBitmap;
-class SkCanvas;
-struct SkRect;
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-class VertexBuffer;
-
-///////////////////////////////////////////////////////////////////////////////
-// Classes
-///////////////////////////////////////////////////////////////////////////////
-
-class TessellationCache {
-public:
- typedef Pair<VertexBuffer*, VertexBuffer*> vertexBuffer_pair_t;
-
- struct Description {
- HASHABLE_TYPE(Description);
- enum class Type {
- None,
- RoundRect,
- };
-
- Type type;
- float scaleX;
- float scaleY;
- bool aa;
- SkPaint::Cap cap;
- SkPaint::Style style;
- float strokeWidth;
- union Shape {
- struct RoundRect {
- float width;
- float height;
- float rx;
- float ry;
- } roundRect;
- } shape;
-
- Description();
- Description(Type type, const Matrix4& transform, const SkPaint& paint);
- void setupMatrixAndPaint(Matrix4* matrix, SkPaint* paint) const;
- };
-
- struct ShadowDescription {
- HASHABLE_TYPE(ShadowDescription);
- const SkPath* nodeKey;
- float matrixData[16];
-
- ShadowDescription();
- ShadowDescription(const SkPath* nodeKey, const Matrix4* drawTransform);
- };
-
- class ShadowTask : public Task<vertexBuffer_pair_t> {
- public:
- ShadowTask(const Matrix4* drawTransform, const Rect& localClip, bool opaque,
- const SkPath* casterPerimeter, const Matrix4* transformXY,
- const Matrix4* transformZ, const Vector3& lightCenter, float lightRadius)
- : drawTransform(*drawTransform)
- , localClip(localClip)
- , opaque(opaque)
- , casterPerimeter(*casterPerimeter)
- , transformXY(*transformXY)
- , transformZ(*transformZ)
- , lightCenter(lightCenter)
- , lightRadius(lightRadius) {}
-
- /* Note - we deep copy all task parameters, because *even though* pointers into Allocator
- * controlled objects (like the SkPath and Matrix4s) should be safe for the entire frame,
- * certain Allocators are destroyed before trim() is called to flush incomplete tasks.
- *
- * These deep copies could be avoided, long term, by canceling or flushing outstanding
- * tasks before tearing down single-frame LinearAllocators.
- */
- const Matrix4 drawTransform;
- const Rect localClip;
- bool opaque;
- const SkPath casterPerimeter;
- const Matrix4 transformXY;
- const Matrix4 transformZ;
- const Vector3 lightCenter;
- const float lightRadius;
- VertexBuffer ambientBuffer;
- VertexBuffer spotBuffer;
- };
-
- TessellationCache();
- ~TessellationCache();
-
- /**
- * Clears the cache. This causes all TessellationBuffers to be deleted.
- */
- void clear();
- /**
- * Returns the maximum size of the cache in bytes.
- */
- uint32_t getMaxSize();
- /**
- * Returns the current size of the cache in bytes.
- */
- uint32_t getSize();
-
- /**
- * Trims the contents of the cache, removing items until it's under its
- * specified limit.
- *
- * Trimming is used for caches that support pre-caching from a worker
- * thread. During pre-caching the maximum limit of the cache can be
- * exceeded for the duration of the frame. It is therefore required to
- * trim the cache at the end of the frame to keep the total amount of
- * memory used under control.
- *
- * Also removes transient Shadow VertexBuffers, which aren't cached between frames.
- */
- void trim();
-
- // TODO: precache/get for Oval, Lines, Points, etc.
-
- void precacheRoundRect(const Matrix4& transform, const SkPaint& paint, float width,
- float height, float rx, float ry) {
- getRoundRectBuffer(transform, paint, width, height, rx, ry);
- }
- const VertexBuffer* getRoundRect(const Matrix4& transform, const SkPaint& paint, float width,
- float height, float rx, float ry);
-
- sp<ShadowTask> getShadowTask(const Matrix4* drawTransform, const Rect& localClip, bool opaque,
- const SkPath* casterPerimeter, const Matrix4* transformXY,
- const Matrix4* transformZ, const Vector3& lightCenter,
- float lightRadius);
-
-private:
- class Buffer;
- class TessellationTask;
- class TessellationProcessor;
-
- typedef VertexBuffer* (*Tessellator)(const Description&);
-
- void precacheShadows(const Matrix4* drawTransform, const Rect& localClip, bool opaque,
- const SkPath* casterPerimeter, const Matrix4* transformXY,
- const Matrix4* transformZ, const Vector3& lightCenter, float lightRadius);
-
- Buffer* getRectBuffer(const Matrix4& transform, const SkPaint& paint, float width,
- float height);
- Buffer* getRoundRectBuffer(const Matrix4& transform, const SkPaint& paint, float width,
- float height, float rx, float ry);
-
- Buffer* getOrCreateBuffer(const Description& entry, Tessellator tessellator);
-
- const uint32_t mMaxSize;
-
- bool mDebugEnabled;
-
- mutable Mutex mLock;
-
- ///////////////////////////////////////////////////////////////////////////////
- // General tessellation caching
- ///////////////////////////////////////////////////////////////////////////////
- sp<TaskProcessor<VertexBuffer*> > mProcessor;
- LruCache<Description, Buffer*> mCache;
- class BufferRemovedListener : public OnEntryRemoved<Description, Buffer*> {
- void operator()(Description& description, Buffer*& buffer) override;
- };
- BufferRemovedListener mBufferRemovedListener;
-
- ///////////////////////////////////////////////////////////////////////////////
- // Shadow tessellation caching
- ///////////////////////////////////////////////////////////////////////////////
- sp<TaskProcessor<vertexBuffer_pair_t> > mShadowProcessor;
-
- // holds a pointer, and implicit strong ref to each shadow task of the frame
- LruCache<ShadowDescription, Task<vertexBuffer_pair_t>*> mShadowCache;
- class BufferPairRemovedListener
- : public OnEntryRemoved<ShadowDescription, Task<vertexBuffer_pair_t>*> {
- void operator()(ShadowDescription& description,
- Task<vertexBuffer_pair_t>*& bufferPairTask) override {
- bufferPairTask->decStrong(nullptr);
- }
- };
- BufferPairRemovedListener mBufferPairRemovedListener;
-
-}; // class TessellationCache
-
-void tessellateShadows(const Matrix4* drawTransform, const Rect* localClip, bool isCasterOpaque,
- const SkPath* casterPerimeter, const Matrix4* casterTransformXY,
- const Matrix4* casterTransformZ, const Vector3& lightCenter,
- float lightRadius, VertexBuffer& ambientBuffer, VertexBuffer& spotBuffer);
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/TextDropShadowCache.cpp b/libs/hwui/TextDropShadowCache.cpp
deleted file mode 100644
index c892ceb3e14d..000000000000
--- a/libs/hwui/TextDropShadowCache.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <utils/JenkinsHash.h>
-
-#include "Caches.h"
-#include "Debug.h"
-#include "FontRenderer.h"
-#include "Properties.h"
-#include "TextDropShadowCache.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Cache support
-///////////////////////////////////////////////////////////////////////////////
-
-hash_t ShadowText::hash() const {
- uint32_t hash = JenkinsHashMix(0, glyphCount);
- hash = JenkinsHashMix(hash, android::hash_type(radius));
- hash = JenkinsHashMix(hash, android::hash_type(textSize));
- hash = JenkinsHashMix(hash, android::hash_type(typeface));
- hash = JenkinsHashMix(hash, flags);
- hash = JenkinsHashMix(hash, android::hash_type(italicStyle));
- hash = JenkinsHashMix(hash, android::hash_type(scaleX));
- if (glyphs) {
- hash = JenkinsHashMixShorts(hash, reinterpret_cast<const uint16_t*>(glyphs), glyphCount);
- }
- if (positions) {
- for (uint32_t i = 0; i < glyphCount * 2; i++) {
- hash = JenkinsHashMix(hash, android::hash_type(positions[i]));
- }
- }
- return JenkinsHashWhiten(hash);
-}
-
-int ShadowText::compare(const ShadowText& lhs, const ShadowText& rhs) {
- int deltaInt = int(lhs.glyphCount) - int(rhs.glyphCount);
- if (deltaInt != 0) return deltaInt;
-
- deltaInt = lhs.flags - rhs.flags;
- if (deltaInt != 0) return deltaInt;
-
- if (lhs.radius < rhs.radius) return -1;
- if (lhs.radius > rhs.radius) return +1;
-
- if (lhs.typeface < rhs.typeface) return -1;
- if (lhs.typeface > rhs.typeface) return +1;
-
- if (lhs.textSize < rhs.textSize) return -1;
- if (lhs.textSize > rhs.textSize) return +1;
-
- if (lhs.italicStyle < rhs.italicStyle) return -1;
- if (lhs.italicStyle > rhs.italicStyle) return +1;
-
- if (lhs.scaleX < rhs.scaleX) return -1;
- if (lhs.scaleX > rhs.scaleX) return +1;
-
- if (lhs.glyphs != rhs.glyphs) {
- if (!lhs.glyphs) return -1;
- if (!rhs.glyphs) return +1;
-
- deltaInt = memcmp(lhs.glyphs, rhs.glyphs, lhs.glyphCount * sizeof(glyph_t));
- if (deltaInt != 0) return deltaInt;
- }
-
- if (lhs.positions != rhs.positions) {
- if (!lhs.positions) return -1;
- if (!rhs.positions) return +1;
-
- return memcmp(lhs.positions, rhs.positions, lhs.glyphCount * sizeof(float) * 2);
- }
-
- return 0;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Constructors/destructor
-///////////////////////////////////////////////////////////////////////////////
-
-TextDropShadowCache::TextDropShadowCache()
- : TextDropShadowCache(DeviceInfo::multiplyByResolution(2)) {}
-
-TextDropShadowCache::TextDropShadowCache(uint32_t maxByteSize)
- : mCache(LruCache<ShadowText, ShadowTexture*>::kUnlimitedCapacity)
- , mSize(0)
- , mMaxSize(maxByteSize) {
- mCache.setOnEntryRemovedListener(this);
- mDebugEnabled = Properties::debugLevel & kDebugMoreCaches;
-}
-
-TextDropShadowCache::~TextDropShadowCache() {
- mCache.clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Size management
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t TextDropShadowCache::getSize() {
- return mSize;
-}
-
-uint32_t TextDropShadowCache::getMaxSize() {
- return mMaxSize;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Callbacks
-///////////////////////////////////////////////////////////////////////////////
-
-void TextDropShadowCache::operator()(ShadowText&, ShadowTexture*& texture) {
- if (texture) {
- mSize -= texture->objectSize();
-
- if (mDebugEnabled) {
- ALOGD("Shadow texture deleted, size = %d", texture->bitmapSize);
- }
-
- texture->deleteTexture();
- delete texture;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Caching
-///////////////////////////////////////////////////////////////////////////////
-
-void TextDropShadowCache::clear() {
- mCache.clear();
-}
-
-ShadowTexture* TextDropShadowCache::get(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs,
- float radius, const float* positions) {
- ShadowText entry(paint, radius, numGlyphs, glyphs, positions);
- ShadowTexture* texture = mCache.get(entry);
-
- if (!texture) {
- SkPaint paintCopy(*paint);
- paintCopy.setTextAlign(SkPaint::kLeft_Align);
- FontRenderer::DropShadow shadow =
- mRenderer->renderDropShadow(&paintCopy, glyphs, numGlyphs, radius, positions);
-
- if (!shadow.image) {
- return nullptr;
- }
-
- Caches& caches = Caches::getInstance();
-
- texture = new ShadowTexture(caches);
- texture->left = shadow.penX;
- texture->top = shadow.penY;
- texture->generation = 0;
- texture->blend = true;
-
- const uint32_t size = shadow.width * shadow.height;
-
- // Don't even try to cache a bitmap that's bigger than the cache
- if (size < mMaxSize) {
- while (mSize + size > mMaxSize) {
- LOG_ALWAYS_FATAL_IF(!mCache.removeOldest(),
- "Failed to remove oldest from cache. mSize = %" PRIu32
- ", mCache.size() = %zu",
- mSize, mCache.size());
- }
- }
-
- // Textures are Alpha8
- texture->upload(GL_ALPHA, shadow.width, shadow.height, GL_ALPHA, GL_UNSIGNED_BYTE,
- shadow.image);
- texture->setFilter(GL_LINEAR);
- texture->setWrap(GL_CLAMP_TO_EDGE);
-
- if (size < mMaxSize) {
- if (mDebugEnabled) {
- ALOGD("Shadow texture created, size = %d", texture->bitmapSize);
- }
-
- entry.copyTextLocally();
-
- mSize += texture->objectSize();
- mCache.put(entry, texture);
- } else {
- texture->cleanup = true;
- }
-
- // Cleanup shadow
- free(shadow.image);
- }
-
- return texture;
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/TextDropShadowCache.h b/libs/hwui/TextDropShadowCache.h
deleted file mode 100644
index 86a012970f17..000000000000
--- a/libs/hwui/TextDropShadowCache.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_TEXT_DROP_SHADOW_CACHE_H
-#define ANDROID_HWUI_TEXT_DROP_SHADOW_CACHE_H
-
-#include <GLES2/gl2.h>
-
-#include <SkPaint.h>
-
-#include <utils/LruCache.h>
-#include <utils/String16.h>
-
-#include "Texture.h"
-#include "font/Font.h"
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-class FontRenderer;
-
-struct ShadowText {
- ShadowText()
- : glyphCount(0)
- , radius(0.0f)
- , textSize(0.0f)
- , typeface(nullptr)
- , flags(0)
- , italicStyle(0.0f)
- , scaleX(0)
- , glyphs(nullptr)
- , positions(nullptr) {}
-
- // len is the number of bytes in text
- ShadowText(const SkPaint* paint, float radius, uint32_t glyphCount, const glyph_t* srcGlyphs,
- const float* positions)
- : glyphCount(glyphCount)
- , radius(radius)
- , textSize(paint->getTextSize())
- , typeface(paint->getTypeface())
- , flags(paint->isFakeBoldText() ? Font::kFakeBold : 0)
- , italicStyle(paint->getTextSkewX())
- , scaleX(paint->getTextScaleX())
- , glyphs(srcGlyphs)
- , positions(positions) {}
-
- ~ShadowText() {}
-
- hash_t hash() const;
-
- static int compare(const ShadowText& lhs, const ShadowText& rhs);
-
- bool operator==(const ShadowText& other) const { return compare(*this, other) == 0; }
-
- bool operator!=(const ShadowText& other) const { return compare(*this, other) != 0; }
-
- void copyTextLocally() {
- str.setTo(reinterpret_cast<const char16_t*>(glyphs), glyphCount);
- glyphs = reinterpret_cast<const glyph_t*>(str.string());
- if (positions != nullptr) {
- positionsCopy.clear();
- positionsCopy.appendArray(positions, glyphCount * 2);
- positions = positionsCopy.array();
- }
- }
-
- uint32_t glyphCount;
- float radius;
- float textSize;
- SkTypeface* typeface;
- uint32_t flags;
- float italicStyle;
- float scaleX;
- const glyph_t* glyphs;
- const float* positions;
-
- // Not directly used to compute the cache key
- String16 str;
- Vector<float> positionsCopy;
-
-}; // struct ShadowText
-
-// Caching support
-
-inline int strictly_order_type(const ShadowText& lhs, const ShadowText& rhs) {
- return ShadowText::compare(lhs, rhs) < 0;
-}
-
-inline int compare_type(const ShadowText& lhs, const ShadowText& rhs) {
- return ShadowText::compare(lhs, rhs);
-}
-
-inline hash_t hash_type(const ShadowText& entry) {
- return entry.hash();
-}
-
-/**
- * Alpha texture used to represent a shadow.
- */
-struct ShadowTexture : public Texture {
- explicit ShadowTexture(Caches& caches) : Texture(caches) {}
-
- float left;
- float top;
-}; // struct ShadowTexture
-
-class TextDropShadowCache : public OnEntryRemoved<ShadowText, ShadowTexture*> {
-public:
- TextDropShadowCache();
- explicit TextDropShadowCache(uint32_t maxByteSize);
- ~TextDropShadowCache();
-
- /**
- * Used as a callback when an entry is removed from the cache.
- * Do not invoke directly.
- */
- void operator()(ShadowText& text, ShadowTexture*& texture) override;
-
- ShadowTexture* get(const SkPaint* paint, const glyph_t* text, int numGlyphs, float radius,
- const float* positions);
-
- /**
- * Clears the cache. This causes all textures to be deleted.
- */
- void clear();
-
- void setFontRenderer(FontRenderer& fontRenderer) { mRenderer = &fontRenderer; }
-
- /**
- * Returns the maximum size of the cache in bytes.
- */
- uint32_t getMaxSize();
- /**
- * Returns the current size of the cache in bytes.
- */
- uint32_t getSize();
-
-private:
- LruCache<ShadowText, ShadowTexture*> mCache;
-
- uint32_t mSize;
- const uint32_t mMaxSize;
- FontRenderer* mRenderer = nullptr;
- bool mDebugEnabled;
-}; // class TextDropShadowCache
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_TEXT_DROP_SHADOW_CACHE_H
diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp
deleted file mode 100644
index 9d365fb29ebe..000000000000
--- a/libs/hwui/TextureCache.cpp
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <GLES2/gl2.h>
-
-#include <utils/Mutex.h>
-
-#include "Caches.h"
-#include "DeviceInfo.h"
-#include "Properties.h"
-#include "Texture.h"
-#include "TextureCache.h"
-#include "hwui/Bitmap.h"
-#include "utils/TraceUtils.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Constructors/destructor
-///////////////////////////////////////////////////////////////////////////////
-
-TextureCache::TextureCache()
- : mCache(LruCache<uint32_t, Texture*>::kUnlimitedCapacity)
- , mSize(0)
- , mMaxSize(DeviceInfo::multiplyByResolution(4 * 6)) // 6 screen-sized RGBA_8888 bitmaps
- , mFlushRate(.4f) {
- mCache.setOnEntryRemovedListener(this);
- mMaxTextureSize = DeviceInfo::get()->maxTextureSize();
- mDebugEnabled = Properties::debugLevel & kDebugCaches;
-}
-
-TextureCache::~TextureCache() {
- this->clear();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Size management
-///////////////////////////////////////////////////////////////////////////////
-
-uint32_t TextureCache::getSize() {
- return mSize;
-}
-
-uint32_t TextureCache::getMaxSize() {
- return mMaxSize;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Callbacks
-///////////////////////////////////////////////////////////////////////////////
-
-void TextureCache::operator()(uint32_t&, Texture*& texture) {
- // This will be called already locked
- if (texture) {
- mSize -= texture->bitmapSize;
- TEXTURE_LOGD("TextureCache::callback: name, removed size, mSize = %d, %d, %d", texture->id,
- texture->bitmapSize, mSize);
- if (mDebugEnabled) {
- ALOGD("Texture deleted, size = %d", texture->bitmapSize);
- }
- texture->deleteTexture();
- delete texture;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Caching
-///////////////////////////////////////////////////////////////////////////////
-
-void TextureCache::resetMarkInUse(void* ownerToken) {
- LruCache<uint32_t, Texture*>::Iterator iter(mCache);
- while (iter.next()) {
- if (iter.value()->isInUse == ownerToken) {
- iter.value()->isInUse = nullptr;
- }
- }
-}
-
-bool TextureCache::canMakeTextureFromBitmap(Bitmap* bitmap) {
- if (bitmap->width() > mMaxTextureSize || bitmap->height() > mMaxTextureSize) {
- ALOGW("Bitmap too large to be uploaded into a texture (%dx%d, max=%dx%d)", bitmap->width(),
- bitmap->height(), mMaxTextureSize, mMaxTextureSize);
- return false;
- }
- return true;
-}
-
-Texture* TextureCache::createTexture(Bitmap* bitmap) {
- Texture* texture = new Texture(Caches::getInstance());
- texture->bitmapSize = bitmap->rowBytes() * bitmap->height();
- texture->generation = bitmap->getGenerationID();
- texture->upload(*bitmap);
- return texture;
-}
-
-// Returns a prepared Texture* that either is already in the cache or can fit
-// in the cache (and is thus added to the cache)
-Texture* TextureCache::getCachedTexture(Bitmap* bitmap) {
- if (bitmap->isHardware()) {
- auto textureIterator = mHardwareTextures.find(bitmap->getStableID());
- if (textureIterator == mHardwareTextures.end()) {
- Texture* texture = createTexture(bitmap);
- mHardwareTextures.insert(
- std::make_pair(bitmap->getStableID(), std::unique_ptr<Texture>(texture)));
- if (mDebugEnabled) {
- ALOGD("Texture created for hw bitmap size = %d", texture->bitmapSize);
- }
- return texture;
- }
- return textureIterator->second.get();
- }
-
- Texture* texture = mCache.get(bitmap->getStableID());
-
- if (!texture) {
- if (!canMakeTextureFromBitmap(bitmap)) {
- return nullptr;
- }
-
- const uint32_t size = bitmap->rowBytes() * bitmap->height();
- bool canCache = size < mMaxSize;
- // Don't even try to cache a bitmap that's bigger than the cache
- while (canCache && mSize + size > mMaxSize) {
- Texture* oldest = mCache.peekOldestValue();
- if (oldest && !oldest->isInUse) {
- mCache.removeOldest();
- } else {
- canCache = false;
- }
- }
-
- if (canCache) {
- texture = createTexture(bitmap);
- mSize += size;
- TEXTURE_LOGD("TextureCache::get: create texture(%p): name, size, mSize = %d, %d, %d",
- bitmap, texture->id, size, mSize);
- if (mDebugEnabled) {
- ALOGD("Texture created, size = %d", size);
- }
- mCache.put(bitmap->getStableID(), texture);
- }
- } else if (!texture->isInUse && bitmap->getGenerationID() != texture->generation) {
- // Texture was in the cache but is dirty, re-upload
- // TODO: Re-adjust the cache size if the bitmap's dimensions have changed
- texture->upload(*bitmap);
- texture->generation = bitmap->getGenerationID();
- }
-
- return texture;
-}
-
-bool TextureCache::prefetchAndMarkInUse(void* ownerToken, Bitmap* bitmap) {
- Texture* texture = getCachedTexture(bitmap);
- if (texture) {
- texture->isInUse = ownerToken;
- }
- return texture;
-}
-
-bool TextureCache::prefetch(Bitmap* bitmap) {
- return getCachedTexture(bitmap);
-}
-
-Texture* TextureCache::get(Bitmap* bitmap) {
- Texture* texture = getCachedTexture(bitmap);
-
- if (!texture) {
- if (!canMakeTextureFromBitmap(bitmap)) {
- return nullptr;
- }
- texture = createTexture(bitmap);
- texture->cleanup = true;
- }
-
- return texture;
-}
-
-bool TextureCache::destroyTexture(uint32_t pixelRefStableID) {
- auto hardwareIter = mHardwareTextures.find(pixelRefStableID);
- if (hardwareIter != mHardwareTextures.end()) {
- hardwareIter->second->deleteTexture();
- mHardwareTextures.erase(hardwareIter);
- return true;
- }
- return mCache.remove(pixelRefStableID);
-}
-
-void TextureCache::clear() {
- mCache.clear();
- for (auto& iter : mHardwareTextures) {
- iter.second->deleteTexture();
- }
- mHardwareTextures.clear();
- TEXTURE_LOGD("TextureCache:clear(), mSize = %d", mSize);
-}
-
-void TextureCache::flush() {
- if (mFlushRate >= 1.0f || mCache.size() == 0) return;
- if (mFlushRate <= 0.0f) {
- clear();
- return;
- }
-
- uint32_t targetSize = uint32_t(mSize * mFlushRate);
- TEXTURE_LOGD("TextureCache::flush: target size: %d", targetSize);
-
- while (mSize > targetSize) {
- mCache.removeOldest();
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h
deleted file mode 100644
index 19e7bea99669..000000000000
--- a/libs/hwui/TextureCache.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#ifndef ANDROID_HWUI_TEXTURE_CACHE_H
-#define ANDROID_HWUI_TEXTURE_CACHE_H
-
-#include <SkBitmap.h>
-
-#include <cutils/compiler.h>
-
-#include <utils/LruCache.h>
-#include <utils/Mutex.h>
-
-#include "Debug.h"
-
-#include <unordered_map>
-#include <vector>
-
-namespace android {
-
-class Bitmap;
-
-namespace uirenderer {
-
-class Texture;
-
-///////////////////////////////////////////////////////////////////////////////
-// Defines
-///////////////////////////////////////////////////////////////////////////////
-
-// Debug
-#if DEBUG_TEXTURES
-#define TEXTURE_LOGD(...) ALOGD(__VA_ARGS__)
-#else
-#define TEXTURE_LOGD(...)
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// Classes
-///////////////////////////////////////////////////////////////////////////////
-
-/**
- * A simple LRU texture cache. The cache has a maximum size expressed in bytes.
- * Any texture added to the cache causing the cache to grow beyond the maximum
- * allowed size will also cause the oldest texture to be kicked out.
- */
-class TextureCache : public OnEntryRemoved<uint32_t, Texture*> {
-public:
- TextureCache();
- ~TextureCache();
-
- /**
- * Used as a callback when an entry is removed from the cache.
- * Do not invoke directly.
- */
- void operator()(uint32_t&, Texture*& texture) override;
-
- /**
- * Resets all Textures to not be marked as in use
- */
- void resetMarkInUse(void* ownerToken);
-
- /**
- * Attempts to precache the SkBitmap. Returns true if a Texture was successfully
- * acquired for the bitmap, false otherwise. If a Texture was acquired it is
- * marked as in use.
- */
- bool prefetchAndMarkInUse(void* ownerToken, Bitmap* bitmap);
-
- /**
- * Attempts to precache the SkBitmap. Returns true if a Texture was successfully
- * acquired for the bitmap, false otherwise. Does not mark the Texture
- * as in use and won't update currently in-use Textures.
- */
- bool prefetch(Bitmap* bitmap);
-
- /**
- * Returns the texture associated with the specified bitmap from within the cache.
- * If the texture cannot be found in the cache, a new texture is generated.
- */
- Texture* get(Bitmap* bitmap);
-
- /**
- * Removes the texture associated with the specified pixelRef. Must be called from RenderThread
- * Returns true if a texture was destroyed, false if no texture with that id was found
- */
- bool destroyTexture(uint32_t pixelRefStableID);
-
- /**
- * Clears the cache. This causes all textures to be deleted.
- */
- void clear();
-
- /**
- * Returns the maximum size of the cache in bytes.
- */
- uint32_t getMaxSize();
- /**
- * Returns the current size of the cache in bytes.
- */
- uint32_t getSize();
-
- /**
- * Partially flushes the cache. The amount of memory freed by a flush
- * is defined by the flush rate.
- */
- void flush();
-
-private:
- bool canMakeTextureFromBitmap(Bitmap* bitmap);
-
- Texture* getCachedTexture(Bitmap* bitmap);
- Texture* createTexture(Bitmap* bitmap);
-
- LruCache<uint32_t, Texture*> mCache;
-
- uint32_t mSize;
- const uint32_t mMaxSize;
- GLint mMaxTextureSize;
-
- const float mFlushRate;
-
- bool mDebugEnabled;
-
- std::unordered_map<uint32_t, std::unique_ptr<Texture>> mHardwareTextures;
-}; // class TextureCache
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_TEXTURE_CACHE_H
diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp
index 18358e25fd5b..402fbadfec22 100644
--- a/libs/hwui/VectorDrawable.cpp
+++ b/libs/hwui/VectorDrawable.cpp
@@ -558,8 +558,8 @@ void Tree::draw(SkCanvas* canvas, const SkRect& bounds) {
SkRect src;
sk_sp<SkSurface> vdSurface = mCache.getSurface(&src);
if (vdSurface) {
- canvas->drawImageRect(vdSurface->makeImageSnapshot().get(), src,
- bounds, getPaint(), SkCanvas::kFast_SrcRectConstraint);
+ canvas->drawImageRect(vdSurface->makeImageSnapshot().get(), src, bounds, getPaint(),
+ SkCanvas::kFast_SrcRectConstraint);
} else {
// Handle the case when VectorDrawableAtlas has been destroyed, because of memory pressure.
// We render the VD into a temporary standalone buffer and mark the frame as dirty. Next
@@ -570,8 +570,8 @@ void Tree::draw(SkCanvas* canvas, const SkRect& bounds) {
int scaledWidth = SkScalarCeilToInt(mProperties.getScaledWidth());
int scaledHeight = SkScalarCeilToInt(mProperties.getScaledHeight());
- canvas->drawBitmapRect(skiaBitmap, SkRect::MakeWH(scaledWidth, scaledHeight),
- bounds, getPaint(), SkCanvas::kFast_SrcRectConstraint);
+ canvas->drawBitmapRect(skiaBitmap, SkRect::MakeWH(scaledWidth, scaledHeight), bounds,
+ getPaint(), SkCanvas::kFast_SrcRectConstraint);
mCache.clear();
markDirty();
}
diff --git a/libs/hwui/VectorDrawable.h b/libs/hwui/VectorDrawable.h
index da52a9503377..af0ae05a74b3 100644
--- a/libs/hwui/VectorDrawable.h
+++ b/libs/hwui/VectorDrawable.h
@@ -59,12 +59,6 @@ namespace VectorDrawable {
onPropertyChanged(); \
retVal; \
})
-#define UPDATE_SKPROP(field, value) \
- ({ \
- bool retVal = ((field) != (value)); \
- if ((field) != (value)) SkRefCnt_SafeAssign((field), (value)); \
- retVal; \
- })
/* A VectorDrawable is composed of a tree of nodes.
* Each node can be a group node, or a path.
@@ -223,29 +217,28 @@ public:
int fillType = 0; /* non-zero or kWinding_FillType in Skia */
};
explicit FullPathProperties(Node* mNode) : Properties(mNode), mTrimDirty(false) {}
- ~FullPathProperties() {
- SkSafeUnref(fillGradient);
- SkSafeUnref(strokeGradient);
- }
+ ~FullPathProperties() {}
void syncProperties(const FullPathProperties& prop) {
mPrimitiveFields = prop.mPrimitiveFields;
mTrimDirty = true;
- UPDATE_SKPROP(fillGradient, prop.fillGradient);
- UPDATE_SKPROP(strokeGradient, prop.strokeGradient);
+ fillGradient = prop.fillGradient;
+ strokeGradient = prop.strokeGradient;
onPropertyChanged();
}
void setFillGradient(SkShader* gradient) {
- if (UPDATE_SKPROP(fillGradient, gradient)) {
+ if (fillGradient.get() != gradient) {
+ fillGradient = sk_ref_sp(gradient);
onPropertyChanged();
}
}
void setStrokeGradient(SkShader* gradient) {
- if (UPDATE_SKPROP(strokeGradient, gradient)) {
+ if (strokeGradient.get() != gradient) {
+ strokeGradient = sk_ref_sp(gradient);
onPropertyChanged();
}
}
- SkShader* getFillGradient() const { return fillGradient; }
- SkShader* getStrokeGradient() const { return strokeGradient; }
+ SkShader* getFillGradient() const { return fillGradient.get(); }
+ SkShader* getStrokeGradient() const { return strokeGradient.get(); }
float getStrokeWidth() const { return mPrimitiveFields.strokeWidth; }
void setStrokeWidth(float strokeWidth) {
VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(strokeWidth, strokeWidth);
@@ -325,8 +318,8 @@ public:
count,
};
PrimitiveFields mPrimitiveFields;
- SkShader* fillGradient = nullptr;
- SkShader* strokeGradient = nullptr;
+ sk_sp<SkShader> fillGradient;
+ sk_sp<SkShader> strokeGradient;
};
// Called from UI thread
@@ -550,8 +543,7 @@ public:
SkRect bounds;
int scaledWidth = 0;
int scaledHeight = 0;
- SkColorFilter* colorFilter = nullptr;
- ~NonAnimatableProperties() { SkSafeUnref(colorFilter); }
+ sk_sp<SkColorFilter> colorFilter;
} mNonAnimatableProperties;
bool mNonAnimatablePropertiesDirty = true;
@@ -561,8 +553,7 @@ public:
void syncNonAnimatableProperties(const TreeProperties& prop) {
// Copy over the data that can only be changed in UI thread
if (mNonAnimatableProperties.colorFilter != prop.mNonAnimatableProperties.colorFilter) {
- SkRefCnt_SafeAssign(mNonAnimatableProperties.colorFilter,
- prop.mNonAnimatableProperties.colorFilter);
+ mNonAnimatableProperties.colorFilter = prop.mNonAnimatableProperties.colorFilter;
}
mNonAnimatableProperties = prop.mNonAnimatableProperties;
}
@@ -599,12 +590,13 @@ public:
}
}
void setColorFilter(SkColorFilter* filter) {
- if (UPDATE_SKPROP(mNonAnimatableProperties.colorFilter, filter)) {
+ if (mNonAnimatableProperties.colorFilter.get() != filter) {
+ mNonAnimatableProperties.colorFilter = sk_ref_sp(filter);
mNonAnimatablePropertiesDirty = true;
mTree->onPropertyChanged(this);
}
}
- SkColorFilter* getColorFilter() const { return mNonAnimatableProperties.colorFilter; }
+ SkColorFilter* getColorFilter() const { return mNonAnimatableProperties.colorFilter.get(); }
float getViewportWidth() const { return mNonAnimatableProperties.viewportWidth; }
float getViewportHeight() const { return mNonAnimatableProperties.viewportHeight; }
@@ -718,6 +710,8 @@ private:
} // namespace VectorDrawable
typedef VectorDrawable::Path::Data PathData;
+typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot;
+
} // namespace uirenderer
} // namespace android
diff --git a/libs/hwui/Vertex.h b/libs/hwui/Vertex.h
index 186d0a88a33e..a6aae55b2ee8 100644
--- a/libs/hwui/Vertex.h
+++ b/libs/hwui/Vertex.h
@@ -74,46 +74,6 @@ struct TextureVertex {
REQUIRE_COMPATIBLE_LAYOUT(TextureVertex);
-/**
- * Simple structure to describe a vertex with a position, texture UV and an
- * sRGB color with alpha. The color is stored pre-multiplied in linear space.
- */
-struct ColorTextureVertex {
- float x, y;
- float u, v;
- float r, g, b, a; // pre-multiplied linear
-
- static inline void set(ColorTextureVertex* vertex, float x, float y, float u, float v,
- uint32_t color) {
- FloatColor c;
- c.set(color);
- *vertex = {x, y, u, v, c.r, c.g, c.b, c.a};
- }
-}; // struct ColorTextureVertex
-
-REQUIRE_COMPATIBLE_LAYOUT(ColorTextureVertex);
-
-/**
- * Simple structure to describe a vertex with a position and an alpha value.
- */
-struct AlphaVertex {
- float x, y;
- float alpha;
-
- static inline void set(AlphaVertex* vertex, float x, float y, float alpha) {
- *vertex = {x, y, alpha};
- }
-
- static inline void copyWithOffset(AlphaVertex* vertex, const AlphaVertex& src, float x,
- float y) {
- AlphaVertex::set(vertex, src.x + x, src.y + y, src.alpha);
- }
-
- static inline void setColor(AlphaVertex* vertex, float alpha) { vertex[0].alpha = alpha; }
-}; // struct AlphaVertex
-
-REQUIRE_COMPATIBLE_LAYOUT(AlphaVertex);
-
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp
deleted file mode 100644
index 5dd8bb8119e9..000000000000
--- a/libs/hwui/font/CacheTexture.cpp
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#include <SkGlyph.h>
-
-#include "../Caches.h"
-#include "../Debug.h"
-#include "../Extensions.h"
-#include "../PixelBuffer.h"
-#include "CacheTexture.h"
-#include "FontUtil.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// CacheBlock
-///////////////////////////////////////////////////////////////////////////////
-
-/**
- * Insert new block into existing linked list of blocks. Blocks are sorted in increasing-width
- * order, except for the final block (the remainder space at the right, since we fill from the
- * left).
- */
-CacheBlock* CacheBlock::insertBlock(CacheBlock* head, CacheBlock* newBlock) {
-#if DEBUG_FONT_RENDERER
- ALOGD("insertBlock: this, x, y, w, h = %p, %d, %d, %d, %d", newBlock, newBlock->mX,
- newBlock->mY, newBlock->mWidth, newBlock->mHeight);
-#endif
-
- CacheBlock* currBlock = head;
- CacheBlock* prevBlock = nullptr;
-
- while (currBlock && currBlock->mY != TEXTURE_BORDER_SIZE) {
- if (newBlock->mWidth < currBlock->mWidth) {
- newBlock->mNext = currBlock;
- newBlock->mPrev = prevBlock;
- currBlock->mPrev = newBlock;
-
- if (prevBlock) {
- prevBlock->mNext = newBlock;
- return head;
- } else {
- return newBlock;
- }
- }
-
- prevBlock = currBlock;
- currBlock = currBlock->mNext;
- }
-
- // new block larger than all others - insert at end (but before the remainder space, if there)
- newBlock->mNext = currBlock;
- newBlock->mPrev = prevBlock;
-
- if (currBlock) {
- currBlock->mPrev = newBlock;
- }
-
- if (prevBlock) {
- prevBlock->mNext = newBlock;
- return head;
- } else {
- return newBlock;
- }
-}
-
-CacheBlock* CacheBlock::removeBlock(CacheBlock* head, CacheBlock* blockToRemove) {
-#if DEBUG_FONT_RENDERER
- ALOGD("removeBlock: this, x, y, w, h = %p, %d, %d, %d, %d", blockToRemove, blockToRemove->mX,
- blockToRemove->mY, blockToRemove->mWidth, blockToRemove->mHeight);
-#endif
-
- CacheBlock* newHead = head;
- CacheBlock* nextBlock = blockToRemove->mNext;
- CacheBlock* prevBlock = blockToRemove->mPrev;
-
- if (prevBlock) {
- // If this doesn't hold, we have a use-after-free below.
- LOG_ALWAYS_FATAL_IF(head == blockToRemove,
- "removeBlock: head should not have a previous block");
- prevBlock->mNext = nextBlock;
- } else {
- newHead = nextBlock;
- }
-
- if (nextBlock) {
- nextBlock->mPrev = prevBlock;
- }
-
- delete blockToRemove;
-
- return newHead;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CacheTexture
-///////////////////////////////////////////////////////////////////////////////
-
-CacheTexture::CacheTexture(uint16_t width, uint16_t height, GLenum format, uint32_t maxQuadCount)
- : mTexture(Caches::getInstance())
- , mWidth(width)
- , mHeight(height)
- , mFormat(format)
- , mMaxQuadCount(maxQuadCount)
- , mCaches(Caches::getInstance()) {
- mTexture.blend = true;
-
- mCacheBlocks =
- new CacheBlock(TEXTURE_BORDER_SIZE, TEXTURE_BORDER_SIZE,
- getWidth() - TEXTURE_BORDER_SIZE, getHeight() - TEXTURE_BORDER_SIZE);
-
- // OpenGL ES 3.0+ lets us specify the row length for unpack operations such
- // as glTexSubImage2D(). This allows us to upload a sub-rectangle of a texture.
- // With OpenGL ES 2.0 we have to upload entire stripes instead.
- mHasUnpackRowLength = mCaches.extensions().hasUnpackRowLength();
-}
-
-CacheTexture::~CacheTexture() {
- releaseMesh();
- releasePixelBuffer();
- reset();
-}
-
-void CacheTexture::reset() {
- // Delete existing cache blocks
- while (mCacheBlocks != nullptr) {
- CacheBlock* tmpBlock = mCacheBlocks;
- mCacheBlocks = mCacheBlocks->mNext;
- delete tmpBlock;
- }
- mNumGlyphs = 0;
- mCurrentQuad = 0;
-}
-
-void CacheTexture::init() {
- // reset, then create a new remainder space to start again
- reset();
- mCacheBlocks =
- new CacheBlock(TEXTURE_BORDER_SIZE, TEXTURE_BORDER_SIZE,
- getWidth() - TEXTURE_BORDER_SIZE, getHeight() - TEXTURE_BORDER_SIZE);
-}
-
-void CacheTexture::releaseMesh() {
- delete[] mMesh;
-}
-
-void CacheTexture::releasePixelBuffer() {
- if (mPixelBuffer) {
- delete mPixelBuffer;
- mPixelBuffer = nullptr;
- }
- mTexture.deleteTexture();
- mDirty = false;
- mCurrentQuad = 0;
-}
-
-void CacheTexture::setLinearFiltering(bool linearFiltering) {
- mTexture.setFilter(linearFiltering ? GL_LINEAR : GL_NEAREST);
-}
-
-void CacheTexture::allocateMesh() {
- if (!mMesh) {
- mMesh = new TextureVertex[mMaxQuadCount * 4];
- }
-}
-
-void CacheTexture::allocatePixelBuffer() {
- if (!mPixelBuffer) {
- mPixelBuffer = PixelBuffer::create(mFormat, getWidth(), getHeight());
- }
-
- GLint internalFormat = mFormat;
- if (mFormat == GL_RGBA) {
- internalFormat = mCaches.rgbaInternalFormat();
- }
-
- mTexture.resize(mWidth, mHeight, internalFormat, mFormat);
- mTexture.setFilter(getLinearFiltering() ? GL_LINEAR : GL_NEAREST);
- mTexture.setWrap(GL_CLAMP_TO_EDGE);
-}
-
-bool CacheTexture::upload() {
- const Rect& dirtyRect = mDirtyRect;
-
- // align the x direction to 32 and y direction to 4 for better performance
- uint32_t x = (((uint32_t)dirtyRect.left) & (~0x1F));
- uint32_t y = (((uint32_t)dirtyRect.top) & (~0x3));
- uint32_t r = ((((uint32_t)dirtyRect.right) + 0x1F) & (~0x1F)) - x;
- uint32_t b = ((((uint32_t)dirtyRect.bottom) + 0x3) & (~0x3)) - y;
- uint32_t width = (r > getWidth() ? getWidth() : r);
- uint32_t height = (b > getHeight() ? getHeight() : b);
-
- // The unpack row length only needs to be specified when a new
- // texture is bound
- if (mHasUnpackRowLength) {
- glPixelStorei(GL_UNPACK_ROW_LENGTH, getWidth());
- } else {
- x = 0;
- width = getWidth();
- }
-
- mPixelBuffer->upload(x, y, width, height);
- setDirty(false);
-
- return mHasUnpackRowLength;
-}
-
-void CacheTexture::setDirty(bool dirty) {
- mDirty = dirty;
- if (!dirty) {
- mDirtyRect.setEmpty();
- }
-}
-
-bool CacheTexture::fitBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_t* retOriginY) {
- switch (glyph.fMaskFormat) {
- case SkMask::kA8_Format:
- case SkMask::kBW_Format:
- if (mFormat != GL_ALPHA) {
-#if DEBUG_FONT_RENDERER
- ALOGD("fitBitmap: texture format %x is inappropriate for monochromatic glyphs",
- mFormat);
-#endif
- return false;
- }
- break;
- case SkMask::kARGB32_Format:
- if (mFormat != GL_RGBA) {
-#if DEBUG_FONT_RENDERER
- ALOGD("fitBitmap: texture format %x is inappropriate for colour glyphs", mFormat);
-#endif
- return false;
- }
- break;
- default:
-#if DEBUG_FONT_RENDERER
- ALOGD("fitBitmap: unknown glyph format %x encountered", glyph.fMaskFormat);
-#endif
- return false;
- }
-
- if (glyph.fHeight + TEXTURE_BORDER_SIZE * 2 > getHeight()) {
- return false;
- }
-
- uint16_t glyphW = glyph.fWidth + TEXTURE_BORDER_SIZE;
- uint16_t glyphH = glyph.fHeight + TEXTURE_BORDER_SIZE;
-
- // roundedUpW equals glyphW to the next multiple of CACHE_BLOCK_ROUNDING_SIZE.
- // This columns for glyphs that are close but not necessarily exactly the same size. It trades
- // off the loss of a few pixels for some glyphs against the ability to store more glyphs
- // of varying sizes in one block.
- uint16_t roundedUpW = (glyphW + CACHE_BLOCK_ROUNDING_SIZE - 1) & -CACHE_BLOCK_ROUNDING_SIZE;
-
- CacheBlock* cacheBlock = mCacheBlocks;
- while (cacheBlock) {
- // Store glyph in this block iff: it fits the block's remaining space and:
- // it's the remainder space (mY == 0) or there's only enough height for this one glyph
- // or it's within ROUNDING_SIZE of the block width
- if (roundedUpW <= cacheBlock->mWidth && glyphH <= cacheBlock->mHeight &&
- (cacheBlock->mY == TEXTURE_BORDER_SIZE ||
- (cacheBlock->mWidth - roundedUpW < CACHE_BLOCK_ROUNDING_SIZE))) {
- if (cacheBlock->mHeight - glyphH < glyphH) {
- // Only enough space for this glyph - don't bother rounding up the width
- roundedUpW = glyphW;
- }
-
- *retOriginX = cacheBlock->mX;
- *retOriginY = cacheBlock->mY;
-
- // If this is the remainder space, create a new cache block for this column. Otherwise,
- // adjust the info about this column.
- if (cacheBlock->mY == TEXTURE_BORDER_SIZE) {
- uint16_t oldX = cacheBlock->mX;
- // Adjust remainder space dimensions
- cacheBlock->mWidth -= roundedUpW;
- cacheBlock->mX += roundedUpW;
-
- if (getHeight() - glyphH >= glyphH) {
- // There's enough height left over to create a new CacheBlock
- CacheBlock* newBlock =
- new CacheBlock(oldX, glyphH + TEXTURE_BORDER_SIZE, roundedUpW,
- getHeight() - glyphH - TEXTURE_BORDER_SIZE);
-#if DEBUG_FONT_RENDERER
- ALOGD("fitBitmap: Created new block: this, x, y, w, h = %p, %d, %d, %d, %d",
- newBlock, newBlock->mX, newBlock->mY, newBlock->mWidth,
- newBlock->mHeight);
-#endif
- mCacheBlocks = CacheBlock::insertBlock(mCacheBlocks, newBlock);
- }
- } else {
- // Insert into current column and adjust column dimensions
- cacheBlock->mY += glyphH;
- cacheBlock->mHeight -= glyphH;
-#if DEBUG_FONT_RENDERER
- ALOGD("fitBitmap: Added to existing block: this, x, y, w, h = %p, %d, %d, %d, %d",
- cacheBlock, cacheBlock->mX, cacheBlock->mY, cacheBlock->mWidth,
- cacheBlock->mHeight);
-#endif
- }
-
- if (cacheBlock->mHeight < std::min(glyphH, glyphW)) {
- // If remaining space in this block is too small to be useful, remove it
- mCacheBlocks = CacheBlock::removeBlock(mCacheBlocks, cacheBlock);
- }
-
- mDirty = true;
- const Rect r(*retOriginX - TEXTURE_BORDER_SIZE, *retOriginY - TEXTURE_BORDER_SIZE,
- *retOriginX + glyphW, *retOriginY + glyphH);
- mDirtyRect.unionWith(r);
- mNumGlyphs++;
-
-#if DEBUG_FONT_RENDERER
- ALOGD("fitBitmap: current block list:");
- mCacheBlocks->output();
-#endif
-
- return true;
- }
- cacheBlock = cacheBlock->mNext;
- }
-#if DEBUG_FONT_RENDERER
- ALOGD("fitBitmap: returning false for glyph of size %d, %d", glyphW, glyphH);
-#endif
- return false;
-}
-
-uint32_t CacheTexture::calculateFreeMemory() const {
- CacheBlock* cacheBlock = mCacheBlocks;
- uint32_t free = 0;
- // currently only two formats are supported: GL_ALPHA or GL_RGBA;
- uint32_t bpp = mFormat == GL_RGBA ? 4 : 1;
- while (cacheBlock) {
- free += bpp * cacheBlock->mWidth * cacheBlock->mHeight;
- cacheBlock = cacheBlock->mNext;
- }
- return free;
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/font/CacheTexture.h b/libs/hwui/font/CacheTexture.h
deleted file mode 100644
index 654378eeb47e..000000000000
--- a/libs/hwui/font/CacheTexture.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_HWUI_CACHE_TEXTURE_H
-#define ANDROID_HWUI_CACHE_TEXTURE_H
-
-#include "PixelBuffer.h"
-#include "Rect.h"
-#include "Texture.h"
-#include "Vertex.h"
-
-#include <GLES3/gl3.h>
-#include <SkGlyph.h>
-#include <utils/Log.h>
-
-namespace android {
-namespace uirenderer {
-
-class Caches;
-
-/**
- * CacheBlock is a node in a linked list of current free space areas in a CacheTexture.
- * Using CacheBlocks enables us to pack the cache from top to bottom as well as left to right.
- * When we add a glyph to the cache, we see if it fits within one of the existing columns that
- * have already been started (this is the case if the glyph fits vertically as well as
- * horizontally, and if its width is sufficiently close to the column width to avoid
- * sub-optimal packing of small glyphs into wide columns). If there is no column in which the
- * glyph fits, we check the final node, which is the remaining space in the cache, creating
- * a new column as appropriate.
- *
- * As columns fill up, we remove their CacheBlock from the list to avoid having to check
- * small blocks in the future.
- */
-struct CacheBlock {
- uint16_t mX;
- uint16_t mY;
- uint16_t mWidth;
- uint16_t mHeight;
- CacheBlock* mNext;
- CacheBlock* mPrev;
-
- CacheBlock(uint16_t x, uint16_t y, uint16_t width, uint16_t height)
- : mX(x), mY(y), mWidth(width), mHeight(height), mNext(nullptr), mPrev(nullptr) {}
-
- static CacheBlock* insertBlock(CacheBlock* head, CacheBlock* newBlock);
- static CacheBlock* removeBlock(CacheBlock* head, CacheBlock* blockToRemove);
-
- void output() {
- CacheBlock* currBlock = this;
- while (currBlock) {
- ALOGD("Block: this, x, y, w, h = %p, %d, %d, %d, %d", currBlock, currBlock->mX,
- currBlock->mY, currBlock->mWidth, currBlock->mHeight);
- currBlock = currBlock->mNext;
- }
- }
-};
-
-class CacheTexture {
-public:
- CacheTexture(uint16_t width, uint16_t height, GLenum format, uint32_t maxQuadCount);
- ~CacheTexture();
-
- void reset();
- void init();
-
- void releaseMesh();
- void releasePixelBuffer();
-
- void allocatePixelBuffer();
- void allocateMesh();
-
- // Returns true if glPixelStorei(GL_UNPACK_ROW_LENGTH) must be reset
- // This method will also call setDirty(false)
- bool upload();
-
- bool fitBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_t* retOriginY);
-
- inline uint16_t getWidth() const { return mWidth; }
-
- inline uint16_t getHeight() const { return mHeight; }
-
- inline GLenum getFormat() const { return mFormat; }
-
- inline uint32_t getOffset(uint16_t x, uint16_t y) const {
- return (y * getWidth() + x) * PixelBuffer::formatSize(mFormat);
- }
-
- inline const Rect* getDirtyRect() const { return &mDirtyRect; }
-
- inline PixelBuffer* getPixelBuffer() const { return mPixelBuffer; }
-
- Texture& getTexture() {
- allocatePixelBuffer();
- return mTexture;
- }
-
- GLuint getTextureId() {
- allocatePixelBuffer();
- return mTexture.id();
- }
-
- inline bool isDirty() const { return mDirty; }
-
- inline bool getLinearFiltering() const { return mLinearFiltering; }
-
- /**
- * This method assumes that the proper texture unit is active.
- */
- void setLinearFiltering(bool linearFiltering);
-
- inline uint16_t getGlyphCount() const { return mNumGlyphs; }
-
- TextureVertex* mesh() const { return mMesh; }
-
- uint32_t meshElementCount() const { return mCurrentQuad * 6; }
-
- uint16_t* indices() const { return (uint16_t*)nullptr; }
-
- void resetMesh() { mCurrentQuad = 0; }
-
- inline void addQuad(float x1, float y1, float u1, float v1, float x2, float y2, float u2,
- float v2, float x3, float y3, float u3, float v3, float x4, float y4,
- float u4, float v4) {
- TextureVertex* mesh = mMesh + mCurrentQuad * 4;
- TextureVertex::set(mesh++, x2, y2, u2, v2);
- TextureVertex::set(mesh++, x3, y3, u3, v3);
- TextureVertex::set(mesh++, x1, y1, u1, v1);
- TextureVertex::set(mesh++, x4, y4, u4, v4);
- mCurrentQuad++;
- }
-
- bool canDraw() const { return mCurrentQuad > 0; }
-
- bool endOfMesh() const { return mCurrentQuad == mMaxQuadCount; }
-
- uint32_t calculateFreeMemory() const;
-
-private:
- void setDirty(bool dirty);
-
- PixelBuffer* mPixelBuffer = nullptr;
- Texture mTexture;
- uint32_t mWidth, mHeight;
- GLenum mFormat;
- bool mLinearFiltering = false;
- bool mDirty = false;
- uint16_t mNumGlyphs = 0;
- TextureVertex* mMesh = nullptr;
- uint32_t mCurrentQuad = 0;
- uint32_t mMaxQuadCount;
- Caches& mCaches;
- CacheBlock* mCacheBlocks;
- bool mHasUnpackRowLength;
- Rect mDirtyRect;
-};
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_CACHE_TEXTURE_H
diff --git a/libs/hwui/font/CachedGlyphInfo.h b/libs/hwui/font/CachedGlyphInfo.h
deleted file mode 100644
index 93bb823db512..000000000000
--- a/libs/hwui/font/CachedGlyphInfo.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_HWUI_CACHED_GLYPH_INFO_H
-#define ANDROID_HWUI_CACHED_GLYPH_INFO_H
-
-namespace android {
-namespace uirenderer {
-
-class CacheTexture;
-
-struct CachedGlyphInfo {
- // Has the cache been invalidated?
- bool mIsValid;
- // Location of the cached glyph in the bitmap
- // in case we need to resize the texture or
- // render to bitmap
- uint32_t mStartX;
- uint32_t mStartY;
- uint32_t mBitmapWidth;
- uint32_t mBitmapHeight;
- // Also cache texture coords for the quad
- float mBitmapMinU;
- float mBitmapMinV;
- float mBitmapMaxU;
- float mBitmapMaxV;
- // Minimize how much we call freetype
- uint32_t mGlyphIndex;
- float mAdvanceX;
- float mAdvanceY;
- // Values below contain a glyph's origin in the bitmap
- int32_t mBitmapLeft;
- int32_t mBitmapTop;
- // Auto-kerning; represents a 2.6 fixed-point value with range [-1, 1].
- int8_t mLsbDelta;
- int8_t mRsbDelta;
- CacheTexture* mCacheTexture;
-};
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_CACHED_GLYPH_INFO_H
diff --git a/libs/hwui/font/Font.cpp b/libs/hwui/font/Font.cpp
deleted file mode 100644
index 41a24a809e89..000000000000
--- a/libs/hwui/font/Font.cpp
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#include <cutils/compiler.h>
-
-#include <utils/JenkinsHash.h>
-#include <utils/Trace.h>
-
-#include <SkGlyph.h>
-#include <SkGlyphCache.h>
-#include <SkSurfaceProps.h>
-#include <SkUtils.h>
-
-#include "../Debug.h"
-#include "../FontRenderer.h"
-#include "../PixelBuffer.h"
-#include "../Properties.h"
-#include "Font.h"
-#include "FontUtil.h"
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Font
-///////////////////////////////////////////////////////////////////////////////
-
-Font::Font(FontRenderer* state, const Font::FontDescription& desc)
- : mState(state), mDescription(desc) {}
-
-Font::FontDescription::FontDescription(const SkPaint* paint, const SkMatrix& rasterMatrix)
- : mLookupTransform(rasterMatrix) {
- mFontId = SkTypeface::UniqueID(paint->getTypeface());
- mFontSize = paint->getTextSize();
- mFlags = 0;
- if (paint->isFakeBoldText()) {
- mFlags |= Font::kFakeBold;
- }
- mItalicStyle = paint->getTextSkewX();
- mScaleX = paint->getTextScaleX();
- mStyle = paint->getStyle();
- mStrokeWidth = paint->getStrokeWidth();
- mAntiAliasing = paint->isAntiAlias();
- mHinting = paint->getHinting();
- if (!mLookupTransform.invert(&mInverseLookupTransform)) {
- ALOGW("Could not query the inverse lookup transform for this font");
- }
-}
-
-Font::~Font() {
- for (uint32_t i = 0; i < mCachedGlyphs.size(); i++) {
- delete mCachedGlyphs.valueAt(i);
- }
-}
-
-hash_t Font::FontDescription::hash() const {
- uint32_t hash = JenkinsHashMix(0, mFontId);
- hash = JenkinsHashMix(hash, android::hash_type(mFontSize));
- hash = JenkinsHashMix(hash, android::hash_type(mFlags));
- hash = JenkinsHashMix(hash, android::hash_type(mItalicStyle));
- hash = JenkinsHashMix(hash, android::hash_type(mScaleX));
- hash = JenkinsHashMix(hash, android::hash_type(mStyle));
- hash = JenkinsHashMix(hash, android::hash_type(mStrokeWidth));
- hash = JenkinsHashMix(hash, int(mAntiAliasing));
- hash = JenkinsHashMix(hash, android::hash_type(mHinting));
- hash = JenkinsHashMix(hash, android::hash_type(mLookupTransform[SkMatrix::kMScaleX]));
- hash = JenkinsHashMix(hash, android::hash_type(mLookupTransform[SkMatrix::kMScaleY]));
- return JenkinsHashWhiten(hash);
-}
-
-int Font::FontDescription::compare(const Font::FontDescription& lhs,
- const Font::FontDescription& rhs) {
- int deltaInt = int(lhs.mFontId) - int(rhs.mFontId);
- if (deltaInt != 0) return deltaInt;
-
- if (lhs.mFontSize < rhs.mFontSize) return -1;
- if (lhs.mFontSize > rhs.mFontSize) return +1;
-
- if (lhs.mItalicStyle < rhs.mItalicStyle) return -1;
- if (lhs.mItalicStyle > rhs.mItalicStyle) return +1;
-
- deltaInt = int(lhs.mFlags) - int(rhs.mFlags);
- if (deltaInt != 0) return deltaInt;
-
- if (lhs.mScaleX < rhs.mScaleX) return -1;
- if (lhs.mScaleX > rhs.mScaleX) return +1;
-
- deltaInt = int(lhs.mStyle) - int(rhs.mStyle);
- if (deltaInt != 0) return deltaInt;
-
- if (lhs.mStrokeWidth < rhs.mStrokeWidth) return -1;
- if (lhs.mStrokeWidth > rhs.mStrokeWidth) return +1;
-
- deltaInt = int(lhs.mAntiAliasing) - int(rhs.mAntiAliasing);
- if (deltaInt != 0) return deltaInt;
-
- deltaInt = int(lhs.mHinting) - int(rhs.mHinting);
- if (deltaInt != 0) return deltaInt;
-
- if (lhs.mLookupTransform[SkMatrix::kMScaleX] < rhs.mLookupTransform[SkMatrix::kMScaleX])
- return -1;
- if (lhs.mLookupTransform[SkMatrix::kMScaleX] > rhs.mLookupTransform[SkMatrix::kMScaleX])
- return +1;
-
- if (lhs.mLookupTransform[SkMatrix::kMScaleY] < rhs.mLookupTransform[SkMatrix::kMScaleY])
- return -1;
- if (lhs.mLookupTransform[SkMatrix::kMScaleY] > rhs.mLookupTransform[SkMatrix::kMScaleY])
- return +1;
-
- return 0;
-}
-
-void Font::invalidateTextureCache(CacheTexture* cacheTexture) {
- for (uint32_t i = 0; i < mCachedGlyphs.size(); i++) {
- CachedGlyphInfo* cachedGlyph = mCachedGlyphs.valueAt(i);
- if (!cacheTexture || cachedGlyph->mCacheTexture == cacheTexture) {
- cachedGlyph->mIsValid = false;
- }
- }
-}
-
-void Font::measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y, uint8_t* bitmap,
- uint32_t bitmapW, uint32_t bitmapH, Rect* bounds, const float* pos) {
- int width = (int)glyph->mBitmapWidth;
- int height = (int)glyph->mBitmapHeight;
-
- int nPenX = x + glyph->mBitmapLeft;
- int nPenY = y + glyph->mBitmapTop;
-
- if (bounds->bottom > nPenY) {
- bounds->bottom = nPenY;
- }
- if (bounds->left > nPenX) {
- bounds->left = nPenX;
- }
- if (bounds->right < nPenX + width) {
- bounds->right = nPenX + width;
- }
- if (bounds->top < nPenY + height) {
- bounds->top = nPenY + height;
- }
-}
-
-void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, uint8_t* bitmap, uint32_t bitmapW,
- uint32_t bitmapH, Rect* bounds, const float* pos) {
- float width = (float)glyph->mBitmapWidth;
- float height = (float)glyph->mBitmapHeight;
-
- float nPenX = x + glyph->mBitmapLeft;
- float nPenY = y + glyph->mBitmapTop + height;
-
- float u1 = glyph->mBitmapMinU;
- float u2 = glyph->mBitmapMaxU;
- float v1 = glyph->mBitmapMinV;
- float v2 = glyph->mBitmapMaxV;
-
- mState->appendMeshQuad(nPenX, nPenY, u1, v2, nPenX + width, nPenY, u2, v2, nPenX + width,
- nPenY - height, u2, v1, nPenX, nPenY - height, u1, v1,
- glyph->mCacheTexture);
-}
-
-void Font::drawCachedGlyphTransformed(CachedGlyphInfo* glyph, int x, int y, uint8_t* bitmap,
- uint32_t bitmapW, uint32_t bitmapH, Rect* bounds,
- const float* pos) {
- float width = (float)glyph->mBitmapWidth;
- float height = (float)glyph->mBitmapHeight;
-
- SkPoint p[4];
- p[0].iset(glyph->mBitmapLeft, glyph->mBitmapTop + height);
- p[1].iset(glyph->mBitmapLeft + width, glyph->mBitmapTop + height);
- p[2].iset(glyph->mBitmapLeft + width, glyph->mBitmapTop);
- p[3].iset(glyph->mBitmapLeft, glyph->mBitmapTop);
-
- mDescription.mInverseLookupTransform.mapPoints(p, 4);
-
- p[0].offset(x, y);
- p[1].offset(x, y);
- p[2].offset(x, y);
- p[3].offset(x, y);
-
- float u1 = glyph->mBitmapMinU;
- float u2 = glyph->mBitmapMaxU;
- float v1 = glyph->mBitmapMinV;
- float v2 = glyph->mBitmapMaxV;
-
- mState->appendRotatedMeshQuad(p[0].x(), p[0].y(), u1, v2, p[1].x(), p[1].y(), u2, v2, p[2].x(),
- p[2].y(), u2, v1, p[3].x(), p[3].y(), u1, v1,
- glyph->mCacheTexture);
-}
-
-void Font::drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y, uint8_t* bitmap,
- uint32_t bitmapWidth, uint32_t bitmapHeight, Rect* bounds,
- const float* pos) {
- int dstX = x + glyph->mBitmapLeft;
- int dstY = y + glyph->mBitmapTop;
-
- CacheTexture* cacheTexture = glyph->mCacheTexture;
- PixelBuffer* pixelBuffer = cacheTexture->getPixelBuffer();
-
- uint32_t formatSize = PixelBuffer::formatSize(pixelBuffer->getFormat());
- uint32_t alpha_channel_offset = PixelBuffer::formatAlphaOffset(pixelBuffer->getFormat());
- uint32_t cacheWidth = cacheTexture->getWidth();
- uint32_t srcStride = formatSize * cacheWidth;
- uint32_t startY = glyph->mStartY * srcStride;
- uint32_t endY = startY + (glyph->mBitmapHeight * srcStride);
-
- const uint8_t* cacheBuffer = pixelBuffer->map();
-
- for (uint32_t cacheY = startY, bitmapY = dstY * bitmapWidth; cacheY < endY;
- cacheY += srcStride, bitmapY += bitmapWidth) {
- for (uint32_t i = 0; i < glyph->mBitmapWidth; ++i) {
- uint8_t* dst = &(bitmap[bitmapY + dstX + i]);
- const uint8_t& src =
- cacheBuffer[cacheY + (glyph->mStartX + i) * formatSize + alpha_channel_offset];
- // Add alpha values to a max of 255, full opacity. This is done to handle
- // fonts/strings where glyphs overlap.
- *dst = std::min(*dst + src, 255);
- }
- }
-}
-
-void Font::drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset,
- SkPathMeasure& measure, SkPoint* position, SkVector* tangent) {
- const float halfWidth = glyph->mBitmapWidth * 0.5f;
- const float height = glyph->mBitmapHeight;
-
- vOffset += glyph->mBitmapTop + height;
-
- SkPoint destination[4];
- bool ok = measure.getPosTan(x + hOffset + glyph->mBitmapLeft + halfWidth, position, tangent);
- if (!ok) {
- ALOGW("The path for drawTextOnPath is empty or null");
- }
-
- // Move along the tangent and offset by the normal
- destination[0].set(-tangent->fX * halfWidth - tangent->fY * vOffset,
- -tangent->fY * halfWidth + tangent->fX * vOffset);
- destination[1].set(tangent->fX * halfWidth - tangent->fY * vOffset,
- tangent->fY * halfWidth + tangent->fX * vOffset);
- destination[2].set(destination[1].fX + tangent->fY * height,
- destination[1].fY - tangent->fX * height);
- destination[3].set(destination[0].fX + tangent->fY * height,
- destination[0].fY - tangent->fX * height);
-
- const float u1 = glyph->mBitmapMinU;
- const float u2 = glyph->mBitmapMaxU;
- const float v1 = glyph->mBitmapMinV;
- const float v2 = glyph->mBitmapMaxV;
-
- mState->appendRotatedMeshQuad(
- position->x() + destination[0].x(), position->y() + destination[0].y(), u1, v2,
- position->x() + destination[1].x(), position->y() + destination[1].y(), u2, v2,
- position->x() + destination[2].x(), position->y() + destination[2].y(), u2, v1,
- position->x() + destination[3].x(), position->y() + destination[3].y(), u1, v1,
- glyph->mCacheTexture);
-}
-
-CachedGlyphInfo* Font::getCachedGlyph(const SkPaint* paint, glyph_t textUnit, bool precaching) {
- CachedGlyphInfo* cachedGlyph = mCachedGlyphs.valueFor(textUnit);
- if (cachedGlyph) {
- // Is the glyph still in texture cache?
- if (!cachedGlyph->mIsValid) {
- SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry);
- SkAutoGlyphCacheNoGamma autoCache(*paint, &surfaceProps,
- &mDescription.mLookupTransform);
- const SkGlyph& skiaGlyph = GET_METRICS(autoCache.getCache(), textUnit);
- updateGlyphCache(paint, skiaGlyph, autoCache.getCache(), cachedGlyph, precaching);
- }
- } else {
- cachedGlyph = cacheGlyph(paint, textUnit, precaching);
- }
-
- return cachedGlyph;
-}
-
-void Font::render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, int x, int y,
- const float* positions) {
- render(paint, glyphs, numGlyphs, x, y, FRAMEBUFFER, nullptr, 0, 0, nullptr, positions);
-}
-
-void Font::render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkPath* path,
- float hOffset, float vOffset) {
- if (numGlyphs == 0 || glyphs == nullptr) {
- return;
- }
-
- int glyphsCount = 0;
- int prevRsbDelta = 0;
-
- float penX = 0.0f;
-
- SkPoint position;
- SkVector tangent;
-
- SkPathMeasure measure(*path, false);
- float pathLength = SkScalarToFloat(measure.getLength());
-
- if (paint->getTextAlign() != SkPaint::kLeft_Align) {
- float textWidth = SkScalarToFloat(paint->measureText(glyphs, numGlyphs * 2));
- float pathOffset = pathLength;
- if (paint->getTextAlign() == SkPaint::kCenter_Align) {
- textWidth *= 0.5f;
- pathOffset *= 0.5f;
- }
- penX += pathOffset - textWidth;
- }
-
- while (glyphsCount < numGlyphs && penX < pathLength) {
- glyph_t glyph = *(glyphs++);
-
- if (IS_END_OF_STRING(glyph)) {
- break;
- }
-
- CachedGlyphInfo* cachedGlyph = getCachedGlyph(paint, glyph);
- penX += AUTO_KERN(prevRsbDelta, cachedGlyph->mLsbDelta);
- prevRsbDelta = cachedGlyph->mRsbDelta;
-
- if (cachedGlyph->mIsValid && cachedGlyph->mCacheTexture) {
- drawCachedGlyph(cachedGlyph, penX, hOffset, vOffset, measure, &position, &tangent);
- }
-
- penX += cachedGlyph->mAdvanceX;
-
- glyphsCount++;
- }
-}
-
-void Font::measure(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, Rect* bounds,
- const float* positions) {
- if (bounds == nullptr) {
- ALOGE("No return rectangle provided to measure text");
- return;
- }
- bounds->set(1e6, -1e6, -1e6, 1e6);
- render(paint, glyphs, numGlyphs, 0, 0, MEASURE, nullptr, 0, 0, bounds, positions);
-}
-
-void Font::precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs) {
- if (numGlyphs == 0 || glyphs == nullptr) {
- return;
- }
-
- int glyphsCount = 0;
- while (glyphsCount < numGlyphs) {
- glyph_t glyph = *(glyphs++);
-
- // Reached the end of the string
- if (IS_END_OF_STRING(glyph)) {
- break;
- }
-
- getCachedGlyph(paint, glyph, true);
- glyphsCount++;
- }
-}
-
-void Font::render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, int x, int y,
- RenderMode mode, uint8_t* bitmap, uint32_t bitmapW, uint32_t bitmapH,
- Rect* bounds, const float* positions) {
- if (numGlyphs == 0 || glyphs == nullptr) {
- return;
- }
-
- static RenderGlyph gRenderGlyph[] = {&android::uirenderer::Font::drawCachedGlyph,
- &android::uirenderer::Font::drawCachedGlyphTransformed,
- &android::uirenderer::Font::drawCachedGlyphBitmap,
- &android::uirenderer::Font::drawCachedGlyphBitmap,
- &android::uirenderer::Font::measureCachedGlyph,
- &android::uirenderer::Font::measureCachedGlyph};
- RenderGlyph render = gRenderGlyph[(mode << 1) + !mIdentityTransform];
-
- int glyphsCount = 0;
-
- while (glyphsCount < numGlyphs) {
- glyph_t glyph = *(glyphs++);
-
- // Reached the end of the string
- if (IS_END_OF_STRING(glyph)) {
- break;
- }
-
- CachedGlyphInfo* cachedGlyph = getCachedGlyph(paint, glyph);
-
- // If it's still not valid, we couldn't cache it, so we shouldn't
- // draw garbage; also skip empty glyphs (spaces)
- if (cachedGlyph->mIsValid && cachedGlyph->mCacheTexture) {
- int penX = x + (int)roundf(positions[(glyphsCount << 1)]);
- int penY = y + (int)roundf(positions[(glyphsCount << 1) + 1]);
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- mState->historyTracker().glyphRendered(cachedGlyph, penX, penY);
-#endif
- (*this.*render)(cachedGlyph, penX, penY, bitmap, bitmapW, bitmapH, bounds, positions);
- } else {
-#ifdef BUGREPORT_FONT_CACHE_USAGE
- mState->historyTracker().glyphRendered(cachedGlyph, -1, -1);
-#endif
- }
-
- glyphsCount++;
- }
-}
-
-void Font::updateGlyphCache(const SkPaint* paint, const SkGlyph& skiaGlyph,
- SkGlyphCache* skiaGlyphCache, CachedGlyphInfo* glyph, bool precaching) {
- glyph->mAdvanceX = skiaGlyph.fAdvanceX;
- glyph->mAdvanceY = skiaGlyph.fAdvanceY;
- glyph->mBitmapLeft = skiaGlyph.fLeft;
- glyph->mBitmapTop = skiaGlyph.fTop;
- glyph->mLsbDelta = skiaGlyph.fLsbDelta;
- glyph->mRsbDelta = skiaGlyph.fRsbDelta;
-
- uint32_t startX = 0;
- uint32_t startY = 0;
-
- // Get the bitmap for the glyph
- if (!skiaGlyph.fImage) {
- skiaGlyphCache->findImage(skiaGlyph);
- }
- mState->cacheBitmap(skiaGlyph, glyph, &startX, &startY, precaching);
-
- if (!glyph->mIsValid) {
- return;
- }
-
- uint32_t endX = startX + skiaGlyph.fWidth;
- uint32_t endY = startY + skiaGlyph.fHeight;
-
- glyph->mStartX = startX;
- glyph->mStartY = startY;
- glyph->mBitmapWidth = skiaGlyph.fWidth;
- glyph->mBitmapHeight = skiaGlyph.fHeight;
-
- bool empty = skiaGlyph.fWidth == 0 || skiaGlyph.fHeight == 0;
- if (!empty) {
- uint32_t cacheWidth = glyph->mCacheTexture->getWidth();
- uint32_t cacheHeight = glyph->mCacheTexture->getHeight();
-
- glyph->mBitmapMinU = startX / (float)cacheWidth;
- glyph->mBitmapMinV = startY / (float)cacheHeight;
- glyph->mBitmapMaxU = endX / (float)cacheWidth;
- glyph->mBitmapMaxV = endY / (float)cacheHeight;
-
- mState->setTextureDirty();
- }
-}
-
-CachedGlyphInfo* Font::cacheGlyph(const SkPaint* paint, glyph_t glyph, bool precaching) {
- CachedGlyphInfo* newGlyph = new CachedGlyphInfo();
- mCachedGlyphs.add(glyph, newGlyph);
-
- SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry);
- SkAutoGlyphCacheNoGamma autoCache(*paint, &surfaceProps, &mDescription.mLookupTransform);
- const SkGlyph& skiaGlyph = GET_METRICS(autoCache.getCache(), glyph);
- newGlyph->mIsValid = false;
- newGlyph->mGlyphIndex = skiaGlyph.fID;
-
- updateGlyphCache(paint, skiaGlyph, autoCache.getCache(), newGlyph, precaching);
-
- return newGlyph;
-}
-
-Font* Font::create(FontRenderer* state, const SkPaint* paint, const SkMatrix& matrix) {
- FontDescription description(paint, matrix);
- Font* font = state->mActiveFonts.get(description);
-
- if (!font) {
- font = new Font(state, description);
- state->mActiveFonts.put(description, font);
- }
- font->mIdentityTransform = matrix.isIdentity();
-
- return font;
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/font/Font.h b/libs/hwui/font/Font.h
deleted file mode 100644
index 85221bc069f1..000000000000
--- a/libs/hwui/font/Font.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_HWUI_FONT_H
-#define ANDROID_HWUI_FONT_H
-
-#include <vector>
-
-#include <utils/KeyedVector.h>
-
-#include <SkPaint.h>
-#include <SkPathMeasure.h>
-#include <SkScalar.h>
-#include <SkTypeface.h>
-
-#include "../Matrix.h"
-#include "../Rect.h"
-#include "FontUtil.h"
-
-class SkGlyphCache;
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Font
-///////////////////////////////////////////////////////////////////////////////
-
-struct CachedGlyphInfo;
-class CacheTexture;
-class FontRenderer;
-
-/**
- * Represents a font, defined by a Skia font id and a font size. A font is used
- * to generate glyphs and cache them in the FontState.
- */
-class Font {
-public:
- enum Style { kFakeBold = 1 };
-
- struct FontDescription {
- FontDescription(const SkPaint* paint, const SkMatrix& matrix);
-
- static int compare(const FontDescription& lhs, const FontDescription& rhs);
-
- hash_t hash() const;
-
- bool operator==(const FontDescription& other) const { return compare(*this, other) == 0; }
-
- bool operator!=(const FontDescription& other) const { return compare(*this, other) != 0; }
-
- SkFontID mFontId;
- float mFontSize;
- int mFlags;
- float mItalicStyle;
- float mScaleX;
- uint8_t mStyle;
- float mStrokeWidth;
- bool mAntiAliasing;
- uint8_t mHinting;
- SkMatrix mLookupTransform;
- SkMatrix mInverseLookupTransform;
- };
-
- ~Font();
-
- void render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, int x, int y,
- const float* positions);
-
- void render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, const SkPath* path,
- float hOffset, float vOffset);
-
- const Font::FontDescription& getDescription() const { return mDescription; }
-
- /**
- * Creates a new font associated with the specified font state.
- */
- static Font* create(FontRenderer* state, const SkPaint* paint, const SkMatrix& matrix);
-
-private:
- friend class FontRenderer;
-
- Font(FontRenderer* state, const Font::FontDescription& desc);
-
- typedef void (Font::*RenderGlyph)(CachedGlyphInfo*, int, int, uint8_t*, uint32_t, uint32_t,
- Rect*, const float*);
-
- enum RenderMode {
- FRAMEBUFFER,
- BITMAP,
- MEASURE,
- };
-
- void precache(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs);
-
- void render(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, int x, int y,
- RenderMode mode, uint8_t* bitmap, uint32_t bitmapW, uint32_t bitmapH, Rect* bounds,
- const float* positions);
-
- void measure(const SkPaint* paint, const glyph_t* glyphs, int numGlyphs, Rect* bounds,
- const float* positions);
-
- void invalidateTextureCache(CacheTexture* cacheTexture = nullptr);
-
- CachedGlyphInfo* cacheGlyph(const SkPaint* paint, glyph_t glyph, bool precaching);
- void updateGlyphCache(const SkPaint* paint, const SkGlyph& skiaGlyph,
- SkGlyphCache* skiaGlyphCache, CachedGlyphInfo* glyph, bool precaching);
-
- void measureCachedGlyph(CachedGlyphInfo* glyph, int x, int y, uint8_t* bitmap, uint32_t bitmapW,
- uint32_t bitmapH, Rect* bounds, const float* pos);
- void drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, uint8_t* bitmap, uint32_t bitmapW,
- uint32_t bitmapH, Rect* bounds, const float* pos);
- void drawCachedGlyphTransformed(CachedGlyphInfo* glyph, int x, int y, uint8_t* bitmap,
- uint32_t bitmapW, uint32_t bitmapH, Rect* bounds,
- const float* pos);
- void drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y, uint8_t* bitmap,
- uint32_t bitmapW, uint32_t bitmapH, Rect* bounds, const float* pos);
- void drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset,
- SkPathMeasure& measure, SkPoint* position, SkVector* tangent);
-
- CachedGlyphInfo* getCachedGlyph(const SkPaint* paint, glyph_t textUnit,
- bool precaching = false);
-
- FontRenderer* mState;
- FontDescription mDescription;
-
- // Cache of glyphs
- DefaultKeyedVector<glyph_t, CachedGlyphInfo*> mCachedGlyphs;
-
- bool mIdentityTransform;
-};
-
-inline int strictly_order_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) {
- return Font::FontDescription::compare(lhs, rhs) < 0;
-}
-
-inline int compare_type(const Font::FontDescription& lhs, const Font::FontDescription& rhs) {
- return Font::FontDescription::compare(lhs, rhs);
-}
-
-inline hash_t hash_type(const Font::FontDescription& entry) {
- return entry.hash();
-}
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_FONT_H
diff --git a/libs/hwui/font/FontCacheHistoryTracker.cpp b/libs/hwui/font/FontCacheHistoryTracker.cpp
deleted file mode 100644
index 5b61c494524a..000000000000
--- a/libs/hwui/font/FontCacheHistoryTracker.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "FontCacheHistoryTracker.h"
-
-#include "CacheTexture.h"
-#include "CachedGlyphInfo.h"
-
-namespace android {
-namespace uirenderer {
-
-void FontCacheHistoryTracker::dumpCachedGlyph(String8& log, const CachedGlyph& glyph) {
- log.appendFormat("glyph (texture %p, position: (%d, %d), size: %dx%d, gen: %d)", glyph.texture,
- glyph.startX, glyph.startY, glyph.bitmapW, glyph.bitmapH, glyph.generation);
-}
-
-void FontCacheHistoryTracker::dumpRenderEntry(String8& log, const RenderEntry& entry) {
- if (entry.penX == -1 && entry.penY == -1) {
- log.appendFormat(" glyph skipped in gen: %d\n", entry.glyph.generation);
- } else {
- log.appendFormat(" rendered ");
- dumpCachedGlyph(log, entry.glyph);
- log.appendFormat(" at (%d, %d)\n", entry.penX, entry.penY);
- }
-}
-
-void FontCacheHistoryTracker::dumpUploadEntry(String8& log, const CachedGlyph& glyph) {
- if (glyph.bitmapW == 0 && glyph.bitmapH == 0) {
- log.appendFormat(" cleared cachetexture %p in gen %d\n", glyph.texture,
- glyph.generation);
- } else {
- log.appendFormat(" uploaded ");
- dumpCachedGlyph(log, glyph);
- log.appendFormat("\n");
- }
-}
-
-void FontCacheHistoryTracker::dump(String8& log) const {
- log.appendFormat("FontCacheHistory: \n");
- log.appendFormat(" Upload history: \n");
- for (size_t i = 0; i < mUploadHistory.size(); i++) {
- dumpUploadEntry(log, mUploadHistory[i]);
- }
- log.appendFormat(" Render history: \n");
- for (size_t i = 0; i < mRenderHistory.size(); i++) {
- dumpRenderEntry(log, mRenderHistory[i]);
- }
-}
-
-void FontCacheHistoryTracker::glyphRendered(CachedGlyphInfo* glyphInfo, int penX, int penY) {
- RenderEntry& entry = mRenderHistory.next();
- entry.glyph.generation = generation;
- entry.glyph.texture = glyphInfo->mCacheTexture;
- entry.glyph.startX = glyphInfo->mStartX;
- entry.glyph.startY = glyphInfo->mStartY;
- entry.glyph.bitmapW = glyphInfo->mBitmapWidth;
- entry.glyph.bitmapH = glyphInfo->mBitmapHeight;
- entry.penX = penX;
- entry.penY = penY;
-}
-
-void FontCacheHistoryTracker::glyphUploaded(CacheTexture* texture, uint32_t x, uint32_t y,
- uint16_t glyphW, uint16_t glyphH) {
- CachedGlyph& glyph = mUploadHistory.next();
- glyph.generation = generation;
- glyph.texture = texture;
- glyph.startX = x;
- glyph.startY = y;
- glyph.bitmapW = glyphW;
- glyph.bitmapH = glyphH;
-}
-
-void FontCacheHistoryTracker::glyphsCleared(CacheTexture* texture) {
- CachedGlyph& glyph = mUploadHistory.next();
- glyph.generation = generation;
- glyph.texture = texture;
- glyph.startX = 0;
- glyph.startY = 0;
- glyph.bitmapW = 0;
- glyph.bitmapH = 0;
-}
-
-void FontCacheHistoryTracker::frameCompleted() {
- generation++;
-}
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/font/FontCacheHistoryTracker.h b/libs/hwui/font/FontCacheHistoryTracker.h
deleted file mode 100644
index 4b9ceccc09c9..000000000000
--- a/libs/hwui/font/FontCacheHistoryTracker.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-#include "../utils/RingBuffer.h"
-
-#include <utils/String8.h>
-
-namespace android {
-namespace uirenderer {
-
-class CacheTexture;
-struct CachedGlyphInfo;
-
-// Tracks glyph uploads and recent rendered/skipped glyphs, so it can give an idea
-// what a missing character is: skipped glyph, wrong coordinates in cache texture etc.
-class FontCacheHistoryTracker {
-public:
- void glyphRendered(CachedGlyphInfo*, int penX, int penY);
- void glyphUploaded(CacheTexture*, uint32_t x, uint32_t y, uint16_t glyphW, uint16_t glyphH);
- void glyphsCleared(CacheTexture*);
- void frameCompleted();
-
- void dump(String8& log) const;
-
-private:
- struct CachedGlyph {
- void* texture;
- uint16_t generation;
- uint16_t startX;
- uint16_t startY;
- uint16_t bitmapW;
- uint16_t bitmapH;
- };
-
- struct RenderEntry {
- CachedGlyph glyph;
- int penX;
- int penY;
- };
-
- static void dumpCachedGlyph(String8& log, const CachedGlyph& glyph);
- static void dumpRenderEntry(String8& log, const RenderEntry& entry);
- static void dumpUploadEntry(String8& log, const CachedGlyph& glyph);
-
- RingBuffer<RenderEntry, 300> mRenderHistory;
- RingBuffer<CachedGlyph, 120> mUploadHistory;
- uint16_t generation = 0;
-};
-
-}; // namespace uirenderer
-}; // namespace android \ No newline at end of file
diff --git a/libs/hwui/font/FontUtil.h b/libs/hwui/font/FontUtil.h
deleted file mode 100644
index 596e153db6a9..000000000000
--- a/libs/hwui/font/FontUtil.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_HWUI_FONT_UTIL_H
-#define ANDROID_HWUI_FONT_UTIL_H
-
-#include <SkUtils.h>
-
-#include "Properties.h"
-
-///////////////////////////////////////////////////////////////////////////////
-// Defines
-///////////////////////////////////////////////////////////////////////////////
-
-#ifdef TEXTURE_BORDER_SIZE
-#if TEXTURE_BORDER_SIZE != 1
-#error TEXTURE_BORDER_SIZE other than 1 is not currently supported
-#endif
-#else
-#define TEXTURE_BORDER_SIZE 1
-#endif
-
-#define CACHE_BLOCK_ROUNDING_SIZE 4
-
-typedef uint16_t glyph_t;
-#define GET_METRICS(cache, glyph) cache->getGlyphIDMetrics(glyph)
-#define IS_END_OF_STRING(glyph) false
-
-// prev, next are assumed to be signed x.6 fixed-point numbers with range
-// [-1, 1]. Result is an integral float.
-#define AUTO_KERN(prev, next) static_cast<float>(((next) - (prev) + 32) >> 6)
-
-#endif // ANDROID_HWUI_FONT_UTIL_H
diff --git a/libs/hwui/hwui/AnimatedImageDrawable.h b/libs/hwui/hwui/AnimatedImageDrawable.h
index 115c45ae4bcb..8a44b8b399c6 100644
--- a/libs/hwui/hwui/AnimatedImageDrawable.h
+++ b/libs/hwui/hwui/AnimatedImageDrawable.h
@@ -106,9 +106,7 @@ public:
Snapshot decodeNextFrame();
Snapshot reset();
- size_t byteSize() const {
- return sizeof(this) + mBytesUsed;
- }
+ size_t byteSize() const { return sizeof(this) + mBytesUsed; }
protected:
virtual void onDraw(SkCanvas* canvas) override;
diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp
index 263d249d20e9..a401b3f96ef2 100644
--- a/libs/hwui/hwui/Bitmap.cpp
+++ b/libs/hwui/hwui/Bitmap.cpp
@@ -16,9 +16,8 @@
#include "Bitmap.h"
#include "Caches.h"
-#include "renderthread/EglManager.h"
+#include "HardwareBitmapUploader.h"
#include "renderthread/RenderProxy.h"
-#include "renderthread/RenderThread.h"
#include "utils/Color.h"
#include <sys/mman.h>
@@ -34,17 +33,16 @@
#include <SkImagePriv.h>
#include <SkToSRGBColorFilter.h>
+#include <limits>
+
namespace android {
+// returns true if rowBytes * height can be represented by a positive int32_t value
+// and places that value in size.
static bool computeAllocationSize(size_t rowBytes, int height, size_t* size) {
- int32_t rowBytes32 = SkToS32(rowBytes);
- int64_t bigSize = (int64_t)height * rowBytes32;
- if (rowBytes32 < 0 || !sk_64_isS32(bigSize)) {
- return false; // allocation will be too large
- }
-
- *size = sk_64_asS32(bigSize);
- return true;
+ return 0 <= height && height <= std::numeric_limits<size_t>::max() &&
+ !__builtin_mul_overflow(rowBytes, (size_t)height, size) &&
+ *size <= std::numeric_limits<int32_t>::max();
}
typedef sk_sp<Bitmap> (*AllocPixelRef)(size_t allocSize, const SkImageInfo& info, size_t rowBytes);
@@ -85,7 +83,7 @@ static sk_sp<Bitmap> allocateHeapBitmap(size_t size, const SkImageInfo& info, si
}
sk_sp<Bitmap> Bitmap::allocateHardwareBitmap(SkBitmap& bitmap) {
- return uirenderer::renderthread::RenderProxy::allocateHardwareBitmap(bitmap);
+ return uirenderer::HardwareBitmapUploader::allocateHardwareBitmap(bitmap);
}
sk_sp<Bitmap> Bitmap::allocateHeapBitmap(SkBitmap* bitmap) {
@@ -205,10 +203,8 @@ Bitmap::Bitmap(GraphicBuffer* buffer, const SkImageInfo& info)
mPixelStorage.hardware.buffer = buffer;
buffer->incStrong(buffer);
setImmutable(); // HW bitmaps are always immutable
- if (uirenderer::Properties::isSkiaEnabled()) {
- mImage = SkImage::MakeFromAHardwareBuffer(reinterpret_cast<AHardwareBuffer*>(buffer),
- mInfo.alphaType(), mInfo.refColorSpace());
- }
+ mImage = SkImage::MakeFromAHardwareBuffer(reinterpret_cast<AHardwareBuffer*>(buffer),
+ mInfo.alphaType(), mInfo.refColorSpace());
}
Bitmap::~Bitmap() {
@@ -288,13 +284,8 @@ void Bitmap::setAlphaType(SkAlphaType alphaType) {
void Bitmap::getSkBitmap(SkBitmap* outBitmap) {
outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
if (isHardware()) {
- if (uirenderer::Properties::isSkiaEnabled()) {
- outBitmap->allocPixels(SkImageInfo::Make(info().width(), info().height(),
- info().colorType(), info().alphaType(),
- nullptr));
- } else {
- outBitmap->allocPixels(info());
- }
+ outBitmap->allocPixels(SkImageInfo::Make(info().width(), info().height(),
+ info().colorType(), info().alphaType(), nullptr));
uirenderer::renderthread::RenderProxy::copyGraphicBufferInto(graphicBuffer(), outBitmap);
if (mInfo.colorSpace()) {
sk_sp<SkPixelRef> pixelRef = sk_ref_sp(outBitmap->pixelRef());
@@ -322,7 +313,7 @@ GraphicBuffer* Bitmap::graphicBuffer() {
sk_sp<SkImage> Bitmap::makeImage(sk_sp<SkColorFilter>* outputColorFilter) {
sk_sp<SkImage> image = mImage;
if (!image) {
- SkASSERT(!(isHardware() && uirenderer::Properties::isSkiaEnabled()));
+ SkASSERT(!isHardware());
SkBitmap skiaBitmap;
skiaBitmap.setInfo(info(), rowBytes());
skiaBitmap.setPixelRef(sk_ref_sp(this), 0, 0);
@@ -332,8 +323,7 @@ sk_sp<SkImage> Bitmap::makeImage(sk_sp<SkColorFilter>* outputColorFilter) {
// TODO: refactor Bitmap to not derive from SkPixelRef, which would allow caching here.
image = SkMakeImageFromRasterBitmap(skiaBitmap, kNever_SkCopyPixelsMode);
}
- if (uirenderer::Properties::isSkiaEnabled() && image->colorSpace() != nullptr &&
- !image->colorSpace()->isSRGB()) {
+ if (image->colorSpace() != nullptr && !image->colorSpace()->isSRGB()) {
*outputColorFilter = SkToSRGBColorFilter::Make(image->refColorSpace());
}
return image;
diff --git a/libs/hwui/hwui/Bitmap.h b/libs/hwui/hwui/Bitmap.h
index 4f06656e8e6d..dbd445682bde 100644
--- a/libs/hwui/hwui/Bitmap.h
+++ b/libs/hwui/hwui/Bitmap.h
@@ -65,9 +65,7 @@ public:
Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info, size_t rowBytes);
Bitmap(GraphicBuffer* buffer, const SkImageInfo& info);
- int rowBytesAsPixels() const {
- return rowBytes() >> mInfo.shiftPerPixel();
- }
+ int rowBytesAsPixels() const { return rowBytes() >> mInfo.shiftPerPixel(); }
void reconfigure(const SkImageInfo& info, size_t rowBytes);
void reconfigure(const SkImageInfo& info);
diff --git a/libs/hwui/hwui/Canvas.cpp b/libs/hwui/hwui/Canvas.cpp
index 20543df85068..af7f013e27b1 100644
--- a/libs/hwui/hwui/Canvas.cpp
+++ b/libs/hwui/hwui/Canvas.cpp
@@ -19,20 +19,16 @@
#include "MinikinUtils.h"
#include "Paint.h"
#include "Properties.h"
-#include "RecordingCanvas.h"
#include "RenderNode.h"
#include "Typeface.h"
#include "pipeline/skia/SkiaRecordingCanvas.h"
-#include <SkDrawFilter.h>
+#include "hwui/PaintFilter.h"
namespace android {
Canvas* Canvas::create_recording_canvas(int width, int height, uirenderer::RenderNode* renderNode) {
- if (uirenderer::Properties::isSkiaEnabled()) {
- return new uirenderer::skiapipeline::SkiaRecordingCanvas(renderNode, width, height);
- }
- return new uirenderer::RecordingCanvas(width, height);
+ return new uirenderer::skiapipeline::SkiaRecordingCanvas(renderNode, width, height);
}
static inline void drawStroke(SkScalar left, SkScalar right, SkScalar top, SkScalar thickness,
@@ -44,10 +40,10 @@ static inline void drawStroke(SkScalar left, SkScalar right, SkScalar top, SkSca
void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint& paint) {
uint32_t flags;
- SkDrawFilter* drawFilter = getDrawFilter();
- if (drawFilter) {
+ PaintFilter* paintFilter = getPaintFilter();
+ if (paintFilter) {
SkPaint paintCopy(paint);
- drawFilter->filter(&paintCopy, SkDrawFilter::kText_Type);
+ paintFilter->filter(&paintCopy);
flags = paintCopy.getFlags();
} else {
flags = paint.getFlags();
@@ -156,15 +152,14 @@ private:
float totalAdvance;
};
-void Canvas::drawText(const uint16_t* text, int start, int count, int contextCount, float x,
- float y, minikin::Bidi bidiFlags, const Paint& origPaint,
- const Typeface* typeface, minikin::MeasuredText* mt) {
+void Canvas::drawText(const uint16_t* text, int textSize, int start, int count, int contextStart,
+ int contextCount, float x, float y, minikin::Bidi bidiFlags,
+ const Paint& origPaint, const Typeface* typeface, minikin::MeasuredText* mt) {
// minikin may modify the original paint
Paint paint(origPaint);
- minikin::Layout layout =
- MinikinUtils::doLayout(&paint, bidiFlags, typeface, text, start, count, contextCount,
- mt);
+ minikin::Layout layout = MinikinUtils::doLayout(&paint, bidiFlags, typeface, text, textSize,
+ start, count, contextStart, contextCount, mt);
x += MinikinUtils::xOffsetForTextAlign(&paint, layout);
@@ -212,7 +207,10 @@ void Canvas::drawTextOnPath(const uint16_t* text, int count, minikin::Bidi bidiF
const Typeface* typeface) {
Paint paintCopy(paint);
minikin::Layout layout =
- MinikinUtils::doLayout(&paintCopy, bidiFlags, typeface, text, 0, count, count, nullptr);
+ MinikinUtils::doLayout(&paintCopy, bidiFlags, typeface, text, count, // text buffer
+ 0, count, // draw range
+ 0, count, // context range
+ nullptr);
hOffset += MinikinUtils::hOffsetForTextAlign(&paintCopy, layout, path);
// Set align to left for drawing, as we don't want individual
diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h
index f341cf96120d..5d380a68631f 100644
--- a/libs/hwui/hwui/Canvas.h
+++ b/libs/hwui/hwui/Canvas.h
@@ -39,13 +39,22 @@ enum class Bidi : uint8_t;
}
namespace android {
+class PaintFilter;
namespace uirenderer {
class CanvasPropertyPaint;
class CanvasPropertyPrimitive;
class DeferredLayerUpdater;
-class DisplayList;
class RenderNode;
+
+namespace skiapipeline {
+class SkiaDisplayList;
+}
+
+/**
+ * Data structure that holds the list of commands used in display list stream
+ */
+using DisplayList = skiapipeline::SkiaDisplayList;
}
namespace SaveFlags {
@@ -205,8 +214,8 @@ public:
virtual bool clipPath(const SkPath* path, SkClipOp op) = 0;
// filters
- virtual SkDrawFilter* getDrawFilter() = 0;
- virtual void setDrawFilter(SkDrawFilter* drawFilter) = 0;
+ virtual PaintFilter* getPaintFilter() = 0;
+ virtual void setPaintFilter(sk_sp<PaintFilter> paintFilter) = 0;
// WebView only
virtual SkCanvasState* captureCanvasState() const { return nullptr; }
@@ -268,9 +277,9 @@ public:
* Converts utf16 text to glyphs, calculating position and boundary,
* and delegating the final draw to virtual drawGlyphs method.
*/
- void drawText(const uint16_t* text, int start, int count, int contextCount, float x, float y,
- minikin::Bidi bidiFlags, const Paint& origPaint, const Typeface* typeface,
- minikin::MeasuredText* mt);
+ void drawText(const uint16_t* text, int textSize, int start, int count, int contextStart,
+ int contextCount, float x, float y, minikin::Bidi bidiFlags,
+ const Paint& origPaint, const Typeface* typeface, minikin::MeasuredText* mt);
void drawTextOnPath(const uint16_t* text, int count, minikin::Bidi bidiFlags,
const SkPath& path, float hOffset, float vOffset, const Paint& paint,
diff --git a/libs/hwui/hwui/MinikinSkia.cpp b/libs/hwui/hwui/MinikinSkia.cpp
index 5d33860bab6b..0022c931c45e 100644
--- a/libs/hwui/hwui/MinikinSkia.cpp
+++ b/libs/hwui/hwui/MinikinSkia.cpp
@@ -22,6 +22,11 @@
#include <SkTypeface.h>
#include <log/log.h>
+#include <minikin/Font.h>
+#include <minikin/MinikinExtent.h>
+#include <minikin/MinikinPaint.h>
+#include <minikin/MinikinRect.h>
+
namespace android {
MinikinFontSkia::MinikinFontSkia(sk_sp<SkTypeface> typeface, const void* fontData, size_t fontSize,
@@ -81,7 +86,6 @@ void MinikinFontSkia::GetFontExtent(minikin::MinikinExtent* extent,
skPaint.getFontMetrics(&metrics);
extent->ascent = metrics.fAscent;
extent->descent = metrics.fDescent;
- extent->line_gap = metrics.fLeading;
}
SkTypeface* MinikinFontSkia::GetSkTypeface() const {
@@ -136,9 +140,8 @@ uint32_t MinikinFontSkia::packPaintFlags(const SkPaint* paint) {
SkPaint::Hinting hinting = paint->getHinting();
// select only flags that might affect text layout
flags &= (SkPaint::kAntiAlias_Flag | SkPaint::kFakeBoldText_Flag | SkPaint::kLinearText_Flag |
- SkPaint::kSubpixelText_Flag | SkPaint::kDevKernText_Flag |
- SkPaint::kEmbeddedBitmapText_Flag | SkPaint::kAutoHinting_Flag |
- SkPaint::kVerticalText_Flag);
+ SkPaint::kSubpixelText_Flag | SkPaint::kEmbeddedBitmapText_Flag |
+ SkPaint::kAutoHinting_Flag | SkPaint::kVerticalText_Flag);
flags |= (hinting << 16);
return flags;
}
diff --git a/libs/hwui/hwui/MinikinUtils.cpp b/libs/hwui/hwui/MinikinUtils.cpp
index 5b69bb78101f..ba240feb4f41 100644
--- a/libs/hwui/hwui/MinikinUtils.cpp
+++ b/libs/hwui/hwui/MinikinUtils.cpp
@@ -48,23 +48,25 @@ minikin::MinikinPaint MinikinUtils::prepareMinikinPaint(const Paint* paint,
}
minikin::Layout MinikinUtils::doLayout(const Paint* paint, minikin::Bidi bidiFlags,
- const Typeface* typeface, const uint16_t* buf, size_t start,
- size_t count, size_t bufSize, minikin::MeasuredText* mt) {
+ const Typeface* typeface, const uint16_t* buf,
+ size_t bufSize, size_t start, size_t count,
+ size_t contextStart, size_t contextCount,
+ minikin::MeasuredText* mt) {
minikin::MinikinPaint minikinPaint = prepareMinikinPaint(paint, typeface);
- minikin::Layout layout;
const minikin::U16StringPiece textBuf(buf, bufSize);
const minikin::Range range(start, start + count);
+ const minikin::Range contextRange(contextStart, contextStart + contextCount);
const minikin::HyphenEdit hyphenEdit = static_cast<minikin::HyphenEdit>(paint->getHyphenEdit());
const minikin::StartHyphenEdit startHyphen = minikin::startHyphenEdit(hyphenEdit);
const minikin::EndHyphenEdit endHyphen = minikin::endHyphenEdit(hyphenEdit);
if (mt == nullptr) {
- layout.doLayout(textBuf,range, bidiFlags, minikinPaint, startHyphen, endHyphen);
+ return minikin::Layout(textBuf.substr(contextRange), range - contextStart, bidiFlags,
+ minikinPaint, startHyphen, endHyphen);
} else {
- mt->buildLayout(textBuf, range, minikinPaint, bidiFlags, startHyphen, endHyphen, &layout);
+ return mt->buildLayout(textBuf, range, contextRange, minikinPaint, startHyphen, endHyphen);
}
- return layout;
}
float MinikinUtils::measureText(const Paint* paint, minikin::Bidi bidiFlags,
@@ -78,8 +80,7 @@ float MinikinUtils::measureText(const Paint* paint, minikin::Bidi bidiFlags,
const minikin::EndHyphenEdit endHyphen = minikin::endHyphenEdit(hyphenEdit);
return minikin::Layout::measureText(textBuf, range, bidiFlags, minikinPaint, startHyphen,
- endHyphen, advances, nullptr /* extent */,
- nullptr /* layout pieces */);
+ endHyphen, advances);
}
bool MinikinUtils::hasVariationSelector(const Typeface* typeface, uint32_t codepoint, uint32_t vs) {
diff --git a/libs/hwui/hwui/MinikinUtils.h b/libs/hwui/hwui/MinikinUtils.h
index 77dfbb21f7b5..d27d54454ea0 100644
--- a/libs/hwui/hwui/MinikinUtils.h
+++ b/libs/hwui/hwui/MinikinUtils.h
@@ -25,11 +25,11 @@
#define _ANDROID_GRAPHICS_MINIKIN_UTILS_H_
#include <cutils/compiler.h>
+#include <log/log.h>
#include <minikin/Layout.h>
#include "MinikinSkia.h"
#include "Paint.h"
#include "Typeface.h"
-#include <log/log.h>
namespace minikin {
class MeasuredText;
@@ -44,7 +44,8 @@ public:
ANDROID_API static minikin::Layout doLayout(const Paint* paint, minikin::Bidi bidiFlags,
const Typeface* typeface, const uint16_t* buf,
- size_t start, size_t count, size_t bufSize,
+ size_t bufSize, size_t start, size_t count,
+ size_t contextStart, size_t contextCount,
minikin::MeasuredText* mt);
ANDROID_API static float measureText(const Paint* paint, minikin::Bidi bidiFlags,
diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h
index 002f75906c35..31d3c0d00b36 100644
--- a/libs/hwui/hwui/Paint.h
+++ b/libs/hwui/hwui/Paint.h
@@ -25,6 +25,7 @@
#include <string>
#include <minikin/FontFamily.h>
+#include <minikin/FamilyVariant.h>
namespace android {
@@ -73,9 +74,9 @@ public:
uint32_t getMinikinLocaleListId() const { return mMinikinLocaleListId; }
- void setFamilyVariant(minikin::FontFamily::Variant variant) { mFamilyVariant = variant; }
+ void setFamilyVariant(minikin::FamilyVariant variant) { mFamilyVariant = variant; }
- minikin::FontFamily::Variant getFamilyVariant() const { return mFamilyVariant; }
+ minikin::FamilyVariant getFamilyVariant() const { return mFamilyVariant; }
void setHyphenEdit(uint32_t hyphen) { mHyphenEdit = hyphen; }
@@ -90,7 +91,7 @@ private:
float mWordSpacing = 0;
std::string mFontFeatureSettings;
uint32_t mMinikinLocaleListId;
- minikin::FontFamily::Variant mFamilyVariant;
+ minikin::FamilyVariant mFamilyVariant;
uint32_t mHyphenEdit = 0;
// The native Typeface object has the same lifetime of the Java Typeface
// object. The Java Paint object holds a strong reference to the Java Typeface
diff --git a/libs/hwui/hwui/PaintFilter.h b/libs/hwui/hwui/PaintFilter.h
new file mode 100644
index 000000000000..bf5627eac229
--- /dev/null
+++ b/libs/hwui/hwui/PaintFilter.h
@@ -0,0 +1,19 @@
+#ifndef ANDROID_GRAPHICS_PAINT_FILTER_H_
+#define ANDROID_GRAPHICS_PAINT_FILTER_H_
+
+class SkPaint;
+
+namespace android {
+
+class PaintFilter : public SkRefCnt {
+public:
+ /**
+ * Called with the paint that will be used to draw.
+ * The implementation may modify the paint as they wish.
+ */
+ virtual void filter(SkPaint*) = 0;
+};
+
+} // namespace android
+
+#endif
diff --git a/libs/hwui/hwui/PaintImpl.cpp b/libs/hwui/hwui/PaintImpl.cpp
index ae9c475d09d4..29cc890682f0 100644
--- a/libs/hwui/hwui/PaintImpl.cpp
+++ b/libs/hwui/hwui/PaintImpl.cpp
@@ -24,7 +24,7 @@ Paint::Paint()
, mWordSpacing(0)
, mFontFeatureSettings()
, mMinikinLocaleListId(0)
- , mFamilyVariant(minikin::FontFamily::Variant::DEFAULT) {}
+ , mFamilyVariant(minikin::FamilyVariant::DEFAULT) {}
Paint::Paint(const Paint& paint)
: SkPaint(paint)
@@ -42,7 +42,7 @@ Paint::Paint(const SkPaint& paint)
, mWordSpacing(0)
, mFontFeatureSettings()
, mMinikinLocaleListId(0)
- , mFamilyVariant(minikin::FontFamily::Variant::DEFAULT) {}
+ , mFamilyVariant(minikin::FamilyVariant::DEFAULT) {}
Paint::~Paint() {}
diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp
index dca9ef5559a6..d9856336e8bd 100644
--- a/libs/hwui/hwui/Typeface.cpp
+++ b/libs/hwui/hwui/Typeface.cpp
@@ -132,8 +132,10 @@ Typeface* Typeface::createFromFamilies(std::vector<std::shared_ptr<minikin::Font
bool italicFromFont;
const minikin::FontStyle defaultStyle;
- const minikin::MinikinFont* mf = families.empty() ? nullptr
- : families[0]->getClosestMatch(defaultStyle).font->typeface().get();
+ const minikin::MinikinFont* mf =
+ families.empty()
+ ? nullptr
+ : families[0]->getClosestMatch(defaultStyle).font->typeface().get();
if (mf != nullptr) {
SkTypeface* skTypeface = reinterpret_cast<const MinikinFontSkia*>(mf)->GetSkTypeface();
const SkFontStyle& style = skTypeface->fontStyle();
diff --git a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp
index 3684bc1e6a1f..b0fec7a70699 100644
--- a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp
+++ b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp
@@ -18,6 +18,7 @@
#include <GrContext.h>
#include <private/hwui/DrawGlInfo.h>
#include "GlFunctorLifecycleListener.h"
+#include "Properties.h"
#include "RenderNode.h"
#include "SkAndroidFrameworkUtils.h"
#include "SkClipStack.h"
@@ -25,7 +26,6 @@
#include "GrBackendSurface.h"
#include "GrRenderTarget.h"
#include "GrRenderTargetContext.h"
-#include "GrGLTypes.h"
namespace android {
namespace uirenderer {
@@ -63,15 +63,13 @@ static bool GetFboDetails(SkCanvas* canvas, GLuint* outFboID, SkISize* outFboSiz
return false;
}
- GrBackendRenderTarget backendTarget = renderTarget->getBackendRenderTarget();
- const GrGLFramebufferInfo* fboInfo = backendTarget.getGLFramebufferInfo();
-
- if (!fboInfo) {
+ GrGLFramebufferInfo fboInfo;
+ if (!renderTarget->getBackendRenderTarget().getGLFramebufferInfo(&fboInfo)) {
ALOGW("Unable to extract renderTarget info from canvas; aborting GLFunctor draw");
return false;
}
- *outFboID = fboInfo->fFBOID;
+ *outFboID = fboInfo.fFBOID;
*outFboSize = SkISize::Make(renderTargetContext->width(), renderTargetContext->height());
return true;
}
@@ -109,14 +107,15 @@ void GLFunctorDrawable::onDraw(SkCanvas* canvas) {
surfaceInfo);
tmpSurface->getCanvas()->clear(SK_ColorTRANSPARENT);
- GrBackendObject backendObject;
- if (!tmpSurface->getRenderTargetHandle(&backendObject, SkSurface::kFlushWrite_BackendHandleAccess)) {
+ GrGLFramebufferInfo fboInfo;
+ if (!tmpSurface->getBackendRenderTarget(SkSurface::kFlushWrite_BackendHandleAccess)
+ .getGLFramebufferInfo(&fboInfo)) {
ALOGW("Unable to extract renderTarget info from offscreen canvas; aborting GLFunctor");
return;
}
fboSize = SkISize::Make(surfaceInfo.width(), surfaceInfo.height());
- fboID = (GLuint)backendObject;
+ fboID = fboInfo.fFBOID;
// update the matrix and clip that we pass to the WebView to match the coordinates of
// the offscreen layer
diff --git a/libs/hwui/pipeline/skia/GLFunctorDrawable.h b/libs/hwui/pipeline/skia/GLFunctorDrawable.h
index af57d7d33c2c..d9e65c95444e 100644
--- a/libs/hwui/pipeline/skia/GLFunctorDrawable.h
+++ b/libs/hwui/pipeline/skia/GLFunctorDrawable.h
@@ -16,6 +16,8 @@
#pragma once
+#include "GlFunctorLifecycleListener.h"
+
#include <SkCanvas.h>
#include <SkDrawable.h>
@@ -25,8 +27,6 @@
namespace android {
namespace uirenderer {
-class GlFunctorLifecycleListener;
-
namespace skiapipeline {
/**
diff --git a/libs/hwui/pipeline/skia/LayerDrawable.cpp b/libs/hwui/pipeline/skia/LayerDrawable.cpp
index 4f16ddb9881b..c41f6a6f0ee6 100644
--- a/libs/hwui/pipeline/skia/LayerDrawable.cpp
+++ b/libs/hwui/pipeline/skia/LayerDrawable.cpp
@@ -59,7 +59,7 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer
externalTexture.fFormat = GL_RGBA8;
GrBackendTexture backendTexture(layerWidth, layerHeight, GrMipMapped::kNo, externalTexture);
layerImage = SkImage::MakeFromTexture(context, backendTexture, kTopLeft_GrSurfaceOrigin,
- kPremul_SkAlphaType, nullptr);
+ kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr);
} else {
SkASSERT(layer->getApi() == Layer::Api::Vulkan);
VkLayer* vkLayer = static_cast<VkLayer*>(layer);
@@ -82,7 +82,14 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer
textureMatrix = textureMatrixInv;
}
- SkMatrix matrix = SkMatrix::Concat(layerTransform, textureMatrix);
+ SkMatrix matrix;
+ if (dstRect) {
+ // Destination rectangle is set only when we are trying to read back the content
+ // of the layer. In this case we don't want to apply layer transform.
+ matrix = textureMatrix;
+ } else {
+ matrix = SkMatrix::Concat(layerTransform, textureMatrix);
+ }
SkPaint paint;
paint.setAlpha(layer->getAlpha());
@@ -114,7 +121,7 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer
}
}
- return layerImage;
+ return layerImage != nullptr;
}
}; // namespace skiapipeline
diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
index 6c04d7862979..85fdc103b1e3 100644
--- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
+++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
@@ -25,6 +25,19 @@ namespace android {
namespace uirenderer {
namespace skiapipeline {
+RenderNodeDrawable::RenderNodeDrawable(RenderNode* node, SkCanvas* canvas, bool composeLayer,
+ bool inReorderingSection)
+ : mRenderNode(node)
+ , mRecordedTransform(canvas->getTotalMatrix())
+ , mComposeLayer(composeLayer)
+ , mInReorderingSection(inReorderingSection) {}
+
+RenderNodeDrawable::~RenderNodeDrawable() {
+ // Just here to move the destructor into the cpp file where we can access RenderNode.
+
+ // TODO: Detangle the header nightmare.
+}
+
void RenderNodeDrawable::drawBackwardsProjectedNodes(SkCanvas* canvas,
const SkiaDisplayList& displayList,
int nestLevel) {
@@ -115,7 +128,6 @@ void RenderNodeDrawable::forceDraw(SkCanvas* canvas) {
return;
}
- SkASSERT(renderNode->getDisplayList()->isSkiaDL());
SkiaDisplayList* displayList = (SkiaDisplayList*)renderNode->getDisplayList();
SkAutoCanvasRestore acr(canvas, true);
@@ -130,7 +142,7 @@ void RenderNodeDrawable::forceDraw(SkCanvas* canvas) {
LOG_ALWAYS_FATAL_IF(!mProjectedDisplayList->mProjectedOutline);
const bool shouldClip = mProjectedDisplayList->mProjectedOutline->getPath();
SkAutoCanvasRestore acr2(canvas, shouldClip);
- canvas->setMatrix(mProjectedDisplayList->mProjectedReceiverParentMatrix);
+ canvas->setMatrix(mProjectedDisplayList->mParentMatrix);
if (shouldClip) {
clipOutline(*mProjectedDisplayList->mProjectedOutline, canvas, nullptr);
}
@@ -144,10 +156,10 @@ static bool layerNeedsPaint(const LayerProperties& properties, float alphaMultip
SkPaint* paint) {
paint->setFilterQuality(kLow_SkFilterQuality);
if (alphaMultiplier < 1.0f || properties.alpha() < 255 ||
- properties.xferMode() != SkBlendMode::kSrcOver || properties.colorFilter() != nullptr) {
+ properties.xferMode() != SkBlendMode::kSrcOver || properties.getColorFilter() != nullptr) {
paint->setAlpha(properties.alpha() * alphaMultiplier);
paint->setBlendMode(properties.xferMode());
- paint->setColorFilter(sk_ref_sp(properties.colorFilter()));
+ paint->setColorFilter(sk_ref_sp(properties.getColorFilter()));
return true;
}
return false;
@@ -188,9 +200,7 @@ void RenderNodeDrawable::drawContent(SkCanvas* canvas) const {
setViewProperties(properties, canvas, &alphaMultiplier);
}
SkiaDisplayList* displayList = (SkiaDisplayList*)mRenderNode->getDisplayList();
- if (displayList->containsProjectionReceiver()) {
- displayList->mProjectedReceiverParentMatrix = canvas->getTotalMatrix();
- }
+ displayList->mParentMatrix = canvas->getTotalMatrix();
// TODO should we let the bound of the drawable do this for us?
const SkRect bounds = SkRect::MakeWH(properties.getWidth(), properties.getHeight());
diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.h b/libs/hwui/pipeline/skia/RenderNodeDrawable.h
index ef21cd8a29b5..6594bd22c0b1 100644
--- a/libs/hwui/pipeline/skia/RenderNodeDrawable.h
+++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.h
@@ -47,11 +47,9 @@ public:
* layer into the canvas.
*/
explicit RenderNodeDrawable(RenderNode* node, SkCanvas* canvas, bool composeLayer = true,
- bool inReorderingSection = false)
- : mRenderNode(node)
- , mRecordedTransform(canvas->getTotalMatrix())
- , mComposeLayer(composeLayer)
- , mInReorderingSection(inReorderingSection) {}
+ bool inReorderingSection = false);
+
+ ~RenderNodeDrawable();
/**
* Draws into the canvas this render node and its children. If the node is marked as a
diff --git a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp
index 25c51f2716e6..dba97fe5ef9f 100644
--- a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp
+++ b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp
@@ -19,10 +19,7 @@
#include "SkiaDisplayList.h"
#include "SkiaPipeline.h"
-#include <SkBlurMask.h>
-#include <SkBlurMaskFilter.h>
#include <SkPathOps.h>
-#include <SkRRectsGaussianEdgeMaskFilter.h>
#include <SkShadowUtils.h>
namespace android {
@@ -58,6 +55,11 @@ void StartReorderBarrierDrawable::onDraw(SkCanvas* canvas) {
if (casterZ >= -NON_ZERO_EPSILON) { // draw only children with negative Z
return;
}
+ SkAutoCanvasRestore acr(canvas, true);
+ // Since we're drawing out of recording order, the child's matrix needs to be applied to the
+ // canvas. In in-order drawing, the canvas already has the child's matrix applied.
+ canvas->setMatrix(mDisplayList->mParentMatrix);
+ canvas->concat(childNode->getRecordedMatrix());
childNode->forceDraw(canvas);
drawIndex++;
}
@@ -105,6 +107,11 @@ void EndReorderBarrierDrawable::onDraw(SkCanvas* canvas) {
RenderNodeDrawable* childNode = zChildren[drawIndex];
SkASSERT(childNode);
+ SkAutoCanvasRestore acr(canvas, true);
+ // Since we're drawing out of recording order, the child's matrix needs to be applied to the
+ // canvas. In in-order drawing, the canvas already has the child's matrix applied.
+ canvas->setMatrix(mStartBarrier->mDisplayList->mParentMatrix);
+ canvas->concat(childNode->getRecordedMatrix());
childNode->forceDraw(canvas);
drawIndex++;
@@ -156,10 +163,15 @@ void EndReorderBarrierDrawable::drawShadow(SkCanvas* canvas, RenderNodeDrawable*
}
SkAutoCanvasRestore acr(canvas, true);
+ // Since we're drawing out of recording order, the child's matrix needs to be applied to the
+ // canvas. In in-order drawing, the canvas already has the child's matrix applied.
+ canvas->setMatrix(mStartBarrier->mDisplayList->mParentMatrix);
SkMatrix shadowMatrix;
- mat4 hwuiMatrix;
+ mat4 hwuiMatrix(caster->getRecordedMatrix());
// TODO we don't pass the optional boolean to treat it as a 4x4 matrix
+ // applyViewPropertyTransforms gets the same matrix, which render nodes apply with
+ // RenderNodeDrawable::setViewProperties as a part if their draw.
caster->getRenderNode()->applyViewPropertyTransforms(hwuiMatrix);
hwuiMatrix.copyTo(shadowMatrix);
canvas->concat(shadowMatrix);
diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.h b/libs/hwui/pipeline/skia/SkiaDisplayList.h
index 818ec114a5b3..6eff5895a620 100644
--- a/libs/hwui/pipeline/skia/SkiaDisplayList.h
+++ b/libs/hwui/pipeline/skia/SkiaDisplayList.h
@@ -16,10 +16,11 @@
#pragma once
-#include "DisplayList.h"
#include "hwui/AnimatedImageDrawable.h"
#include "GLFunctorDrawable.h"
#include "RenderNodeDrawable.h"
+#include "TreeInfo.h"
+#include "utils/LinearAllocator.h"
#include <SkLiteDL.h>
#include <SkLiteRecorder.h>
@@ -28,8 +29,17 @@
namespace android {
namespace uirenderer {
+namespace renderthread {
+class CanvasContext;
+}
+
class Outline;
+namespace VectorDrawable {
+class Tree;
+};
+typedef uirenderer::VectorDrawable::Tree VectorDrawableRoot;
+
namespace skiapipeline {
/**
@@ -38,10 +48,14 @@ namespace skiapipeline {
* runtime. The downside of this inheritance is that we pay for the overhead
* of the parent class construction/destruction without any real benefit.
*/
-class SkiaDisplayList : public DisplayList {
+class SkiaDisplayList {
public:
- SkiaDisplayList() { SkASSERT(projectionReceiveIndex == -1); }
- virtual ~SkiaDisplayList() {
+ // index of DisplayListOp restore, after which projected descendants should be drawn
+ int projectionReceiveIndex = -1;
+
+ size_t getUsedSize() { return allocator.usedSize(); }
+
+ ~SkiaDisplayList() {
/* Given that we are using a LinearStdAllocator to store some of the
* SkDrawable contents we must ensure that any other object that is
* holding a reference to those drawables is destroyed prior to their
@@ -68,29 +82,27 @@ public:
return allocator.create<T>(std::forward<Params>(params)...);
}
- bool isSkiaDL() const override { return true; }
-
/**
* Returns true if the DisplayList does not have any recorded content
*/
- bool isEmpty() const override { return mDisplayList.empty(); }
+ bool isEmpty() const { return mDisplayList.empty(); }
/**
* Returns true if this list directly contains a GLFunctor drawing command.
*/
- bool hasFunctor() const override { return !mChildFunctors.empty(); }
+ bool hasFunctor() const { return !mChildFunctors.empty(); }
/**
* Returns true if this list directly contains a VectorDrawable drawing command.
*/
- bool hasVectorDrawables() const override { return !mVectorDrawables.empty(); }
+ bool hasVectorDrawables() const { return !mVectorDrawables.empty(); }
/**
* Attempts to reset and reuse this DisplayList.
*
* @return true if the displayList will be reused and therefore should not be deleted
*/
- bool reuseDisplayList(RenderNode* node, renderthread::CanvasContext* context) override;
+ bool reuseDisplayList(RenderNode* node, renderthread::CanvasContext* context);
/**
* ONLY to be called by RenderNode::syncDisplayList so that we can notify any
@@ -99,7 +111,7 @@ public:
* NOTE: This function can be folded into RenderNode when we no longer need
* to subclass from DisplayList
*/
- void syncContents() override;
+ void syncContents();
/**
* ONLY to be called by RenderNode::prepareTree in order to prepare this
@@ -116,12 +128,12 @@ public:
bool prepareListAndChildren(
TreeObserver& observer, TreeInfo& info, bool functorsNeedLayer,
- std::function<void(RenderNode*, TreeObserver&, TreeInfo&, bool)> childFn) override;
+ std::function<void(RenderNode*, TreeObserver&, TreeInfo&, bool)> childFn);
/**
* Calls the provided function once for each child of this DisplayList
*/
- void updateChildren(std::function<void(RenderNode*)> updateFn) override;
+ void updateChildren(std::function<void(RenderNode*)> updateFn);
/**
* Returns true if there is a child render node that is a projection receiver.
@@ -134,7 +146,9 @@ public:
void draw(SkCanvas* canvas) { mDisplayList.draw(canvas); }
- void output(std::ostream& output, uint32_t level) override;
+ void output(std::ostream& output, uint32_t level);
+
+ LinearAllocator allocator;
/**
* We use std::deque here because (1) we need to iterate through these
@@ -159,12 +173,12 @@ public:
// node is drawn.
const Outline* mProjectedOutline = nullptr;
- // mProjectedReceiverParentMatrix is valid when render node tree is traversed during the draw
- // pass. Render nodes that have a child receiver node, will store their matrix in
- // mProjectedReceiverParentMatrix. Child receiver node will set the matrix and then clip with
- // the
- // outline of their parent.
- SkMatrix mProjectedReceiverParentMatrix;
+ // mParentMatrix is set and valid when render node tree is traversed during the draw
+ // pass. Render nodes, which draw in a order different than recording order (e.g. nodes with a
+ // child receiver node or Z elevation), can use mParentMatrix to calculate the final transform
+ // without replaying the matrix transform OPs from the display list.
+ // Child receiver node will set the matrix and then clip with the outline of their parent.
+ SkMatrix mParentMatrix;
};
}; // namespace skiapipeline
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index 270527d551a9..78f5a71dee3b 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -25,11 +25,12 @@
#include "renderstate/RenderState.h"
#include "renderthread/EglManager.h"
#include "renderthread/Frame.h"
+#include "utils/GLUtils.h"
#include "utils/TraceUtils.h"
#include <GrBackendSurface.h>
-#include <SkImageInfo.h>
#include <SkBlendMode.h>
+#include <SkImageInfo.h>
#include <cutils/properties.h>
#include <strings.h>
@@ -60,28 +61,33 @@ Frame SkiaOpenGLPipeline::getFrame() {
}
bool SkiaOpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
- const FrameBuilder::LightGeometry& lightGeometry,
+ const LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, const Rect& contentDrawBounds,
- bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo,
+ bool opaque, bool wideColorGamut, const LightInfo& lightInfo,
const std::vector<sp<RenderNode>>& renderNodes,
FrameInfoVisualizer* profiler) {
mEglManager.damageFrame(frame, dirty);
+ SkColorType colorType;
// setup surface for fbo0
GrGLFramebufferInfo fboInfo;
fboInfo.fFBOID = 0;
- GrPixelConfig pixelConfig =
- wideColorGamut ? kRGBA_half_GrPixelConfig : kRGBA_8888_GrPixelConfig;
+ if (wideColorGamut) {
+ fboInfo.fFormat = GL_RGBA16F;
+ colorType = kRGBA_F16_SkColorType;
+ } else {
+ fboInfo.fFormat = GL_RGBA8;
+ colorType = kN32_SkColorType;
+ }
- GrBackendRenderTarget backendRT(frame.width(), frame.height(), 0, STENCIL_BUFFER_SIZE,
- pixelConfig, fboInfo);
+ GrBackendRenderTarget backendRT(frame.width(), frame.height(), 0, STENCIL_BUFFER_SIZE, fboInfo);
SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
SkASSERT(mRenderThread.getGrContext() != nullptr);
sk_sp<SkSurface> surface(SkSurface::MakeFromBackendRenderTarget(
- mRenderThread.getGrContext(), backendRT, kBottomLeft_GrSurfaceOrigin, nullptr, &props));
+ mRenderThread.getGrContext(), backendRT, kBottomLeft_GrSurfaceOrigin, colorType,
+ nullptr, &props));
SkiaPipeline::updateLighting(lightGeometry, lightInfo);
renderFrame(*layerUpdateQueue, dirty, renderNodes, opaque, wideColorGamut, contentDrawBounds,
@@ -144,8 +150,8 @@ bool SkiaOpenGLPipeline::copyLayerInto(DeferredLayerUpdater* deferredLayer, SkBi
if (!tmpSurface.get()) {
surfaceInfo = surfaceInfo.makeColorType(SkColorType::kN32_SkColorType);
- tmpSurface = SkSurface::MakeRenderTarget(mRenderThread.getGrContext(),
- SkBudgeted::kYes, surfaceInfo);
+ tmpSurface = SkSurface::MakeRenderTarget(mRenderThread.getGrContext(), SkBudgeted::kYes,
+ surfaceInfo);
if (!tmpSurface.get()) {
ALOGW("Unable to readback GPU contents into the provided bitmap");
return false;
@@ -165,11 +171,10 @@ bool SkiaOpenGLPipeline::copyLayerInto(DeferredLayerUpdater* deferredLayer, SkBi
// if we fail to readback from the GPU directly (e.g. 565) then we attempt to read into 8888
// and then draw that into the destination format before giving up.
SkBitmap tmpBitmap;
- SkImageInfo bitmapInfo = SkImageInfo::MakeN32(bitmap->width(), bitmap->height(),
- bitmap->alphaType());
+ SkImageInfo bitmapInfo =
+ SkImageInfo::MakeN32(bitmap->width(), bitmap->height(), bitmap->alphaType());
if (tmpBitmap.tryAllocPixels(bitmapInfo) &&
- tmpImage->readPixels(bitmapInfo, tmpBitmap.getPixels(),
- tmpBitmap.rowBytes(), 0, 0)) {
+ tmpImage->readPixels(bitmapInfo, tmpBitmap.getPixels(), tmpBitmap.rowBytes(), 0, 0)) {
SkCanvas canvas(*bitmap);
SkPaint paint;
paint.setBlendMode(SkBlendMode::kSrc);
@@ -183,7 +188,8 @@ bool SkiaOpenGLPipeline::copyLayerInto(DeferredLayerUpdater* deferredLayer, SkBi
}
static Layer* createLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
- sk_sp<SkColorFilter> colorFilter, int alpha, SkBlendMode mode, bool blend) {
+ sk_sp<SkColorFilter> colorFilter, int alpha, SkBlendMode mode,
+ bool blend) {
GlLayer* layer =
new GlLayer(renderState, layerWidth, layerHeight, colorFilter, alpha, mode, blend);
layer->generateTexture();
@@ -191,7 +197,7 @@ static Layer* createLayer(RenderState& renderState, uint32_t layerWidth, uint32_
}
DeferredLayerUpdater* SkiaOpenGLPipeline::createTextureLayer() {
- mEglManager.initialize();
+ mRenderThread.requireGlContext();
return new DeferredLayerUpdater(mRenderThread.renderState(), createLayer, Layer::Api::OpenGL);
}
@@ -209,6 +215,7 @@ bool SkiaOpenGLPipeline::setSurface(Surface* surface, SwapBehavior swapBehavior,
}
if (surface) {
+ mRenderThread.requireGlContext();
const bool wideColorGamut = colorMode == ColorMode::WideColorGamut;
mEglSurface = mEglManager.createSurface(surface, wideColorGamut);
}
@@ -244,203 +251,6 @@ void SkiaOpenGLPipeline::invokeFunctor(const RenderThread& thread, Functor* func
}
}
-#define FENCE_TIMEOUT 2000000000
-
-class AutoEglFence {
-public:
- AutoEglFence(EGLDisplay display) : mDisplay(display) {
- fence = eglCreateSyncKHR(mDisplay, EGL_SYNC_FENCE_KHR, NULL);
- }
-
- ~AutoEglFence() {
- if (fence != EGL_NO_SYNC_KHR) {
- eglDestroySyncKHR(mDisplay, fence);
- }
- }
-
- EGLSyncKHR fence = EGL_NO_SYNC_KHR;
-
-private:
- EGLDisplay mDisplay = EGL_NO_DISPLAY;
-};
-
-class AutoEglImage {
-public:
- AutoEglImage(EGLDisplay display, EGLClientBuffer clientBuffer) : mDisplay(display) {
- EGLint imageAttrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
- image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer,
- imageAttrs);
- }
-
- ~AutoEglImage() {
- if (image != EGL_NO_IMAGE_KHR) {
- eglDestroyImageKHR(mDisplay, image);
- }
- }
-
- EGLImageKHR image = EGL_NO_IMAGE_KHR;
-
-private:
- EGLDisplay mDisplay = EGL_NO_DISPLAY;
-};
-
-class AutoSkiaGlTexture {
-public:
- AutoSkiaGlTexture() {
- glGenTextures(1, &mTexture);
- glBindTexture(GL_TEXTURE_2D, mTexture);
- }
-
- ~AutoSkiaGlTexture() { glDeleteTextures(1, &mTexture); }
-
-private:
- GLuint mTexture = 0;
-};
-
-static bool isFP16Supported(const sk_sp<GrContext>& grContext) {
- static std::once_flag sOnceFlag;
- static bool supported = false;
-
- std::call_once(sOnceFlag, [](const sk_sp<GrContext>& grContext) {
- if (!grContext->caps()->isConfigTexturable(kRGBA_half_GrPixelConfig)) {
- supported = false;
- return;
- }
-
- sp<GraphicBuffer> buffer = new GraphicBuffer(1, 1, PIXEL_FORMAT_RGBA_FP16,
- GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_SW_WRITE_NEVER |
- GraphicBuffer::USAGE_SW_READ_NEVER, "tempFp16Buffer");
- status_t error = buffer->initCheck();
- supported = !error;
- }, grContext);
-
- return supported;
-}
-
-sk_sp<Bitmap> SkiaOpenGLPipeline::allocateHardwareBitmap(renderthread::RenderThread& renderThread,
- SkBitmap& skBitmap) {
- renderThread.eglManager().initialize();
-
- sk_sp<GrContext> grContext = sk_ref_sp(renderThread.getGrContext());
- const SkImageInfo& info = skBitmap.info();
- PixelFormat pixelFormat;
- GLint format, type;
- bool isSupported = false;
-
- // TODO: add support for linear blending (when ANDROID_ENABLE_LINEAR_BLENDING is defined)
- switch (info.colorType()) {
- case kRGBA_8888_SkColorType:
- isSupported = true;
- // ARGB_4444 is upconverted to RGBA_8888
- case kARGB_4444_SkColorType:
- pixelFormat = PIXEL_FORMAT_RGBA_8888;
- format = GL_RGBA;
- type = GL_UNSIGNED_BYTE;
- break;
- case kRGBA_F16_SkColorType:
- isSupported = isFP16Supported(grContext);
- if (isSupported) {
- type = GL_HALF_FLOAT;
- pixelFormat = PIXEL_FORMAT_RGBA_FP16;
- } else {
- type = GL_UNSIGNED_BYTE;
- pixelFormat = PIXEL_FORMAT_RGBA_8888;
- }
- format = GL_RGBA;
- break;
- case kRGB_565_SkColorType:
- isSupported = true;
- pixelFormat = PIXEL_FORMAT_RGB_565;
- format = GL_RGB;
- type = GL_UNSIGNED_SHORT_5_6_5;
- break;
- case kGray_8_SkColorType:
- isSupported = true;
- pixelFormat = PIXEL_FORMAT_RGBA_8888;
- format = GL_LUMINANCE;
- type = GL_UNSIGNED_BYTE;
- break;
- default:
- ALOGW("unable to create hardware bitmap of colortype: %d", info.colorType());
- return nullptr;
- }
-
- SkBitmap bitmap;
- if (isSupported) {
- bitmap = skBitmap;
- } else {
- bitmap.allocPixels(
- SkImageInfo::MakeN32(info.width(), info.height(), info.alphaType(), nullptr));
- bitmap.eraseColor(0);
- if (info.colorType() == kRGBA_F16_SkColorType) {
- // Drawing RGBA_F16 onto ARGB_8888 is not supported
- skBitmap.readPixels(bitmap.info().makeColorSpace(SkColorSpace::MakeSRGB()),
- bitmap.getPixels(), bitmap.rowBytes(), 0, 0);
- } else {
- SkCanvas canvas(bitmap);
- canvas.drawBitmap(skBitmap, 0.0f, 0.0f, nullptr);
- }
- }
-
- sp<GraphicBuffer> buffer = new GraphicBuffer(
- info.width(), info.height(), pixelFormat,
- GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_SW_WRITE_NEVER |
- GraphicBuffer::USAGE_SW_READ_NEVER,
- std::string("Bitmap::allocateSkiaHardwareBitmap pid [") + std::to_string(getpid()) +
- "]");
-
- status_t error = buffer->initCheck();
- if (error < 0) {
- ALOGW("createGraphicBuffer() failed in GraphicBuffer.create()");
- return nullptr;
- }
-
- // upload the bitmap into a texture
- EGLDisplay display = eglGetCurrentDisplay();
- LOG_ALWAYS_FATAL_IF(display == EGL_NO_DISPLAY, "Failed to get EGL_DEFAULT_DISPLAY! err=%s",
- uirenderer::renderthread::EglManager::eglErrorString());
- // We use an EGLImage to access the content of the GraphicBuffer
- // The EGL image is later bound to a 2D texture
- EGLClientBuffer clientBuffer = (EGLClientBuffer)buffer->getNativeBuffer();
- AutoEglImage autoImage(display, clientBuffer);
- if (autoImage.image == EGL_NO_IMAGE_KHR) {
- ALOGW("Could not create EGL image, err =%s",
- uirenderer::renderthread::EglManager::eglErrorString());
- return nullptr;
- }
- AutoSkiaGlTexture glTexture;
- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, autoImage.image);
- GL_CHECKPOINT(MODERATE);
-
- // glTexSubImage2D is synchronous in sense that it memcpy() from pointer that we provide.
- // But asynchronous in sense that driver may upload texture onto hardware buffer when we first
- // use it in drawing
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, info.width(), info.height(), format, type,
- bitmap.getPixels());
- GL_CHECKPOINT(MODERATE);
-
- // The fence is used to wait for the texture upload to finish
- // properly. We cannot rely on glFlush() and glFinish() as
- // some drivers completely ignore these API calls
- AutoEglFence autoFence(display);
- if (autoFence.fence == EGL_NO_SYNC_KHR) {
- LOG_ALWAYS_FATAL("Could not create sync fence %#x", eglGetError());
- return nullptr;
- }
- // The flag EGL_SYNC_FLUSH_COMMANDS_BIT_KHR will trigger a
- // pipeline flush (similar to what a glFlush() would do.)
- EGLint waitStatus = eglClientWaitSyncKHR(display, autoFence.fence,
- EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, FENCE_TIMEOUT);
- if (waitStatus != EGL_CONDITION_SATISFIED_KHR) {
- LOG_ALWAYS_FATAL("Failed to wait for the fence %#x", eglGetError());
- return nullptr;
- }
-
- grContext->resetContext(kTextureBinding_GrGLBackendState);
-
- return sk_sp<Bitmap>(new Bitmap(buffer.get(), bitmap.info()));
-}
-
} /* namespace skiapipeline */
} /* namespace uirenderer */
} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h
index 5e013b6697a7..2e2e1522b717 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h
@@ -33,9 +33,9 @@ public:
renderthread::MakeCurrentResult makeCurrent() override;
renderthread::Frame getFrame() override;
bool draw(const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
- const FrameBuilder::LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
+ const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
const Rect& contentDrawBounds, bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo,
+ const LightInfo& lightInfo,
const std::vector<sp<RenderNode> >& renderNodes,
FrameInfoVisualizer* profiler) override;
bool swapBuffers(const renderthread::Frame& frame, bool drew, const SkRect& screenDirty,
@@ -49,8 +49,6 @@ public:
bool isContextReady() override;
static void invokeFunctor(const renderthread::RenderThread& thread, Functor* functor);
- static sk_sp<Bitmap> allocateHardwareBitmap(renderthread::RenderThread& thread,
- SkBitmap& skBitmap);
private:
renderthread::EglManager& mEglManager;
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp
index 107890e57a19..f2f5056bb195 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp
@@ -26,6 +26,7 @@
#include "DeviceInfo.h"
#include "Matrix.h"
#include "Properties.h"
+#include "utils/MathUtils.h"
using namespace android::uirenderer::renderthread;
@@ -50,32 +51,31 @@ CopyResult SkiaOpenGLReadback::copyImageInto(EGLImageKHR eglImage, const Matrix4
grContext->resetContext();
}
+ if (bitmap->colorType() == kRGBA_F16_SkColorType &&
+ !grContext->colorTypeSupportedAsSurface(bitmap->colorType())) {
+ ALOGW("Can't copy surface into bitmap, RGBA_F16 config is not supported");
+ return CopyResult::DestinationInvalid;
+ }
+
GrGLTextureInfo externalTexture;
externalTexture.fTarget = GL_TEXTURE_EXTERNAL_OES;
externalTexture.fID = sourceTexId;
-
- GrPixelConfig pixelConfig;
switch (bitmap->colorType()) {
case kRGBA_F16_SkColorType:
- pixelConfig = kRGBA_half_GrPixelConfig;
+ externalTexture.fFormat = GL_RGBA16F;
break;
case kN32_SkColorType:
default:
- pixelConfig = kRGBA_8888_GrPixelConfig;
+ externalTexture.fFormat = GL_RGBA8;
break;
}
- if (pixelConfig == kRGBA_half_GrPixelConfig &&
- !grContext->caps()->isConfigRenderable(kRGBA_half_GrPixelConfig, false)) {
- ALOGW("Can't copy surface into bitmap, RGBA_F16 config is not supported");
- return CopyResult::DestinationInvalid;
- }
-
- GrBackendTexture backendTexture(imgWidth, imgHeight, pixelConfig, externalTexture);
+ GrBackendTexture backendTexture(imgWidth, imgHeight, GrMipMapped::kNo, externalTexture);
CopyResult copyResult = CopyResult::UnknownError;
sk_sp<SkImage> image(SkImage::MakeFromAdoptedTexture(grContext.get(), backendTexture,
- kTopLeft_GrSurfaceOrigin));
+ kTopLeft_GrSurfaceOrigin,
+ bitmap->colorType()));
if (image) {
int displayedWidth = imgWidth, displayedHeight = imgHeight;
// If this is a 90 or 270 degree rotation we need to swap width/height to get the device
@@ -116,9 +116,9 @@ CopyResult SkiaOpenGLReadback::copyImageInto(EGLImageKHR eglImage, const Matrix4
paint.setBlendMode(SkBlendMode::kSrc);
// Apply a filter, which is matching OpenGL pipeline readback behaviour. Filter usage
// is codified by tests using golden images like DecodeAccuracyTest.
- if (skiaSrcRect.width() != bitmap->width() ||
- skiaSrcRect.height() != bitmap->height()) {
- // TODO: apply filter always, but check if tests will be fine
+ bool disableFilter = MathUtils::areEqual(skiaSrcRect.width(), skiaDestRect.width())
+ && MathUtils::areEqual(skiaSrcRect.height(), skiaDestRect.height());
+ if (!disableFilter) {
paint.setFilterQuality(kLow_SkFilterQuality);
}
scaledSurface->getCanvas()->concat(textureMatrix);
@@ -137,6 +137,8 @@ CopyResult SkiaOpenGLReadback::copyImageInto(EGLImageKHR eglImage, const Matrix4
// make sure that we have deleted the texture (in the SkImage) before we
// destroy the EGLImage that it was created from
image.reset();
+ glFinish();
+
return copyResult;
}
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.h b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.h
index cc9fb3b0a5e0..1ce4773e7d67 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.h
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.h
@@ -16,15 +16,15 @@
#pragma once
-#include "OpenGLReadback.h"
+#include "EglReadback.h"
namespace android {
namespace uirenderer {
namespace skiapipeline {
-class SkiaOpenGLReadback : public OpenGLReadback {
+class SkiaOpenGLReadback : public EglReadback {
public:
- SkiaOpenGLReadback(renderthread::RenderThread& thread) : OpenGLReadback(thread) {}
+ SkiaOpenGLReadback(renderthread::RenderThread& thread) : EglReadback(thread) {}
protected:
virtual CopyResult copyImageInto(EGLImageKHR eglImage, const Matrix4& imgTransform,
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index d66cba12ad99..988981d65775 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -81,9 +81,9 @@ void SkiaPipeline::onPrepareTree() {
mVectorDrawables.clear();
}
-void SkiaPipeline::renderLayers(const FrameBuilder::LightGeometry& lightGeometry,
+void SkiaPipeline::renderLayers(const LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, bool opaque,
- bool wideColorGamut, const BakedOpRenderer::LightInfo& lightInfo) {
+ bool wideColorGamut, const LightInfo& lightInfo) {
updateLighting(lightGeometry, lightInfo);
ATRACE_NAME("draw layers");
renderVectorDrawableCache();
@@ -103,7 +103,6 @@ void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque,
// as not to lose info on what portion is damaged
if (CC_LIKELY(layerNode->getLayerSurface() != nullptr)) {
SkASSERT(layerNode->getLayerSurface());
- SkASSERT(layerNode->getDisplayList()->isSkiaDL());
SkiaDisplayList* displayList = (SkiaDisplayList*)layerNode->getDisplayList();
if (!displayList || displayList->isEmpty()) {
SkDEBUGF(("%p drawLayers(%s) : missing drawable", layerNode, layerNode->getName()));
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h
index 38ad9c09a8aa..8c9c80381b84 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.h
@@ -17,7 +17,7 @@
#pragma once
#include <SkSurface.h>
-#include "FrameBuilder.h"
+#include "Lighting.h"
#include "hwui/AnimatedImageDrawable.h"
#include "renderthread/CanvasContext.h"
#include "renderthread/IRenderPipeline.h"
@@ -42,9 +42,9 @@ public:
void unpinImages() override;
void onPrepareTree() override;
- void renderLayers(const FrameBuilder::LightGeometry& lightGeometry,
+ void renderLayers(const LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo) override;
+ const LightInfo& lightInfo) override;
bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
bool wideColorGamut, ErrorHandler* errorHandler) override;
@@ -97,8 +97,8 @@ public:
return mLightCenter;
}
- static void updateLighting(const FrameBuilder::LightGeometry& lightGeometry,
- const BakedOpRenderer::LightInfo& lightInfo) {
+ static void updateLighting(const LightGeometry& lightGeometry,
+ const LightInfo& lightInfo) {
mLightRadius = lightGeometry.radius;
mAmbientShadowAlpha = lightInfo.ambientShadowAlpha;
mSpotShadowAlpha = lightInfo.spotShadowAlpha;
diff --git a/libs/hwui/pipeline/skia/SkiaProfileRenderer.h b/libs/hwui/pipeline/skia/SkiaProfileRenderer.h
index 5ae7d6b0b607..daa4c1839693 100644
--- a/libs/hwui/pipeline/skia/SkiaProfileRenderer.h
+++ b/libs/hwui/pipeline/skia/SkiaProfileRenderer.h
@@ -16,7 +16,7 @@
#include "IProfileRenderer.h"
-#include "BakedOpRenderer.h"
+#include "SkCanvas.h"
namespace android {
namespace uirenderer {
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index f0da660f17b0..46e39aa58c6f 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -17,6 +17,7 @@
#include "SkiaRecordingCanvas.h"
#include <SkImagePriv.h>
+#include "CanvasTransform.h"
#include "Layer.h"
#include "LayerDrawable.h"
#include "NinePatchUtils.h"
@@ -44,13 +45,21 @@ void SkiaRecordingCanvas::initDisplayList(uirenderer::RenderNode* renderNode, in
}
mDisplayList->attachRecorder(&mRecorder, SkIRect::MakeWH(width, height));
- SkiaCanvas::reset(&mRecorder);
+ SkCanvas* canvas = &mRecorder;
+ if (renderNode) {
+ mWrappedCanvas = makeTransformCanvas(&mRecorder, renderNode->usageHint());
+ if (mWrappedCanvas) {
+ canvas = mWrappedCanvas.get();
+ }
+ }
+ SkiaCanvas::reset(canvas);
}
uirenderer::DisplayList* SkiaRecordingCanvas::finishRecording() {
// close any existing chunks if necessary
insertReorderBarrier(false);
mRecorder.restoreToCount(1);
+ mWrappedCanvas = nullptr;
return mDisplayList.release();
}
@@ -148,12 +157,45 @@ void SkiaRecordingCanvas::drawVectorDrawable(VectorDrawableRoot* tree) {
// Recording Canvas draw operations: Bitmaps
// ----------------------------------------------------------------------------
+SkiaCanvas::PaintCoW&& SkiaRecordingCanvas::filterBitmap(PaintCoW&& paint,
+ sk_sp<SkColorFilter> colorSpaceFilter) {
+ bool fixBlending = false;
+ bool fixAA = false;
+ if (paint) {
+ // kClear blend mode is drawn as kDstOut on HW for compatibility with Android O and
+ // older.
+ fixBlending = sApiLevel <= 27 && paint->getBlendMode() == SkBlendMode::kClear;
+ fixAA = paint->isAntiAlias();
+ }
+
+ if (fixBlending || fixAA || colorSpaceFilter) {
+ SkPaint& tmpPaint = paint.writeable();
+
+ if (fixBlending) {
+ tmpPaint.setBlendMode(SkBlendMode::kDstOut);
+ }
+
+ if (colorSpaceFilter) {
+ if (tmpPaint.getColorFilter()) {
+ tmpPaint.setColorFilter(SkColorFilter::MakeComposeFilter(
+ tmpPaint.refColorFilter(), std::move(colorSpaceFilter)));
+ } else {
+ tmpPaint.setColorFilter(std::move(colorSpaceFilter));
+ }
+ LOG_ALWAYS_FATAL_IF(!tmpPaint.getColorFilter());
+ }
+
+ // disabling AA on bitmap draws matches legacy HWUI behavior
+ tmpPaint.setAntiAlias(false);
+ }
+
+ return filterPaint(std::move(paint));
+}
void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) {
- SkPaint tmpPaint;
sk_sp<SkColorFilter> colorFilter;
sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
- mRecorder.drawImage(image, left, top, bitmapPaint(paint, &tmpPaint, colorFilter));
+ mRecorder.drawImage(image, left, top, filterBitmap(paint, std::move(colorFilter)));
// if image->unique() is true, then mRecorder.drawImage failed for some reason. It also means
// it is not safe to store a raw SkImage pointer, because the image object will be destroyed
// when this function ends.
@@ -166,10 +208,9 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, con
SkAutoCanvasRestore acr(&mRecorder, true);
concat(matrix);
- SkPaint tmpPaint;
sk_sp<SkColorFilter> colorFilter;
sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
- mRecorder.drawImage(image, 0, 0, bitmapPaint(paint, &tmpPaint, colorFilter));
+ mRecorder.drawImage(image, 0, 0, filterBitmap(paint, std::move(colorFilter)));
if (!bitmap.isImmutable() && image.get() && !image->unique()) {
mDisplayList->mMutableImages.push_back(image.get());
}
@@ -181,10 +222,9 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop
SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom);
SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
- SkPaint tmpPaint;
sk_sp<SkColorFilter> colorFilter;
sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
- mRecorder.drawImageRect(image, srcRect, dstRect, bitmapPaint(paint, &tmpPaint, colorFilter),
+ mRecorder.drawImageRect(image, srcRect, dstRect, filterBitmap(paint, std::move(colorFilter)),
SkCanvas::kFast_SrcRectConstraint);
if (!bitmap.isImmutable() && image.get() && !image->unique() && !srcRect.isEmpty() &&
!dstRect.isEmpty()) {
@@ -216,23 +256,16 @@ void SkiaRecordingCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& ch
lattice.fBounds = nullptr;
SkRect dst = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
- SkPaint tmpPaint;
- sk_sp<SkColorFilter> colorFilter;
- sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
- const SkPaint* filteredPaint = bitmapPaint(paint, &tmpPaint, colorFilter);
+ PaintCoW filteredPaint(paint);
// Besides kNone, the other three SkFilterQualities are treated the same. And Android's
// Java API only supports kLow and kNone anyway.
if (!filteredPaint || filteredPaint->getFilterQuality() == kNone_SkFilterQuality) {
- if (filteredPaint != &tmpPaint) {
- if (paint) {
- tmpPaint = *paint;
- }
- filteredPaint = &tmpPaint;
- }
- tmpPaint.setFilterQuality(kLow_SkFilterQuality);
+ filteredPaint.writeable().setFilterQuality(kLow_SkFilterQuality);
}
-
- mRecorder.drawImageLattice(image.get(), lattice, dst, filteredPaint);
+ sk_sp<SkColorFilter> colorFilter;
+ sk_sp<SkImage> image = bitmap.makeImage(&colorFilter);
+ mRecorder.drawImageLattice(image.get(), lattice, dst,
+ filterBitmap(std::move(filteredPaint), std::move(colorFilter)));
if (!bitmap.isImmutable() && image.get() && !image->unique() && !dst.isEmpty()) {
mDisplayList->mMutableImages.push_back(image.get());
}
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
index 93807a5476e6..50d84d6cf101 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
@@ -78,6 +78,7 @@ public:
private:
SkLiteRecorder mRecorder;
std::unique_ptr<SkiaDisplayList> mDisplayList;
+ std::unique_ptr<SkCanvas> mWrappedCanvas;
StartReorderBarrierDrawable* mCurrentBarrier;
/**
@@ -89,44 +90,7 @@ private:
*/
void initDisplayList(uirenderer::RenderNode* renderNode, int width, int height);
- inline static const SkPaint* bitmapPaint(const SkPaint* origPaint, SkPaint* tmpPaint,
- sk_sp<SkColorFilter> colorSpaceFilter) {
- bool fixBlending = false;
- bool fixAA = false;
- if (origPaint) {
- // kClear blend mode is drawn as kDstOut on HW for compatibility with Android O and
- // older.
- fixBlending = sApiLevel <= 27 && origPaint->getBlendMode() == SkBlendMode::kClear;
- fixAA = origPaint->isAntiAlias();
- }
-
- if (fixBlending || fixAA || colorSpaceFilter) {
- if (origPaint) {
- *tmpPaint = *origPaint;
- }
-
- if (fixBlending) {
- tmpPaint->setBlendMode(SkBlendMode::kDstOut);
- }
-
- if (colorSpaceFilter) {
- if (tmpPaint->getColorFilter()) {
- tmpPaint->setColorFilter(SkColorFilter::MakeComposeFilter(
- tmpPaint->refColorFilter(), colorSpaceFilter));
- } else {
- tmpPaint->setColorFilter(colorSpaceFilter);
- }
- LOG_ALWAYS_FATAL_IF(!tmpPaint->getColorFilter());
- }
-
- // disabling AA on bitmap draws matches legacy HWUI behavior
- tmpPaint->setAntiAlias(false);
- return tmpPaint;
- } else {
- return origPaint;
- }
- }
-
+ PaintCoW&& filterBitmap(PaintCoW&& paint, sk_sp<SkColorFilter> colorSpaceFilter);
};
}; // namespace skiapipeline
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index 5825060f902a..b2519fe59891 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -62,10 +62,10 @@ Frame SkiaVulkanPipeline::getFrame() {
}
bool SkiaVulkanPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
- const FrameBuilder::LightGeometry& lightGeometry,
+ const LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, const Rect& contentDrawBounds,
bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo,
+ const LightInfo& lightInfo,
const std::vector<sp<RenderNode>>& renderNodes,
FrameInfoVisualizer* profiler) {
sk_sp<SkSurface> backBuffer = mVkSurface->getBackBufferSurface();
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
index 03b4c79f2beb..7806b42e03dc 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h
@@ -31,9 +31,9 @@ public:
renderthread::MakeCurrentResult makeCurrent() override;
renderthread::Frame getFrame() override;
bool draw(const renderthread::Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
- const FrameBuilder::LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
+ const LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
const Rect& contentDrawBounds, bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo,
+ const LightInfo& lightInfo,
const std::vector<sp<RenderNode> >& renderNodes,
FrameInfoVisualizer* profiler) override;
bool swapBuffers(const renderthread::Frame& frame, bool drew, const SkRect& screenDirty,
diff --git a/libs/hwui/protos/ProtoHelpers.h b/libs/hwui/protos/ProtoHelpers.h
deleted file mode 100644
index 833c77f2b8cb..000000000000
--- a/libs/hwui/protos/ProtoHelpers.h
+++ /dev/null
@@ -1,41 +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.
- */
-#ifndef PROTOHELPERS_H
-#define PROTOHELPERS_H
-
-#include "Rect.h"
-#include "protos/hwui.pb.h"
-
-namespace android {
-namespace uirenderer {
-
-void set(proto::RectF* dest, const Rect& src) {
- dest->set_left(src.left);
- dest->set_top(src.top);
- dest->set_right(src.right);
- dest->set_bottom(src.bottom);
-}
-
-void set(std::string* dest, const SkPath& src) {
- size_t size = src.writeToMemory(nullptr);
- dest->resize(size);
- src.writeToMemory(&*dest->begin());
-}
-
-} // namespace uirenderer
-} // namespace android
-
-#endif // PROTOHELPERS_H
diff --git a/libs/hwui/protos/hwui.proto b/libs/hwui/protos/hwui.proto
deleted file mode 100644
index dcff80a24974..000000000000
--- a/libs/hwui/protos/hwui.proto
+++ /dev/null
@@ -1,99 +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.
- */
-
-syntax = "proto2";
-
-package android.uirenderer.proto;
-
-option optimize_for = LITE_RUNTIME;
-
-message RenderNode {
- required uint64 id = 1;
- required string name = 2;
- required RenderProperties properties = 3;
- optional DisplayList display_list = 4;
- repeated RenderNode children = 5;
-};
-
-message RenderProperties {
- required int32 left = 1;
- required int32 right = 2;
- required int32 top = 3;
- required int32 bottom = 4;
- required int32 clip_flags = 5;
- required float alpha = 6;
- required float translation_x = 7;
- required float translation_y = 8;
- required float translation_z = 9;
- required float elevation = 10;
- required float rotation = 11;
- required float rotation_x = 12;
- required float rotation_y = 13;
- required float scale_x = 14;
- required float scale_y = 15;
- required float pivot_x = 16;
- required float pivot_y = 17;
- required bool has_overlapping_rendering = 18;
- required bool pivot_explicitly_set = 19;
- required bool project_backwards = 20;
- required bool projection_receiver = 21;
- required RectF clip_bounds = 22;
- optional Outline outline = 23;
- optional RevealClip reveal_clip = 24;
-};
-
-message RectF {
- required float left = 1;
- required float right = 2;
- required float top = 3;
- required float bottom = 4;
-}
-
-message Outline {
- required bool should_clip = 1;
- enum Type {
- None = 0;
- Empty = 1;
- ConvexPath = 2;
- RoundRect = 3;
- }
- required Type type = 2;
- required RectF bounds = 3;
- required float radius = 4;
- required float alpha = 5;
- optional bytes path = 6;
-}
-
-message RevealClip {
- required float x = 1;
- required float y = 2;
- required float radius = 3;
-}
-
-message DisplayList {
- optional int32 projection_receive_index = 1;
- repeated DrawOp draw_ops = 2;
-}
-
-message DrawOp {
- oneof drawop {
- DrawOp_RenderNode render_node = 1;
- }
-}
-
-message DrawOp_RenderNode {
- optional RenderNode node = 1;
-}
diff --git a/libs/hwui/renderstate/Blend.cpp b/libs/hwui/renderstate/Blend.cpp
deleted file mode 100644
index 5bef01c0ec3c..000000000000
--- a/libs/hwui/renderstate/Blend.cpp
+++ /dev/null
@@ -1,140 +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.
- */
-#include <renderstate/Blend.h>
-#include "Program.h"
-
-#include "ShadowTessellator.h"
-
-namespace android {
-namespace uirenderer {
-
-/**
- * Structure mapping Skia xfermodes to OpenGL blending factors.
- */
-struct Blender {
- SkBlendMode mode;
- GLenum src;
- GLenum dst;
-};
-
-// assumptions made by lookup tables in either this file or ProgramCache
-static_assert(0 == static_cast<int>(SkBlendMode::kClear), "SkBlendMode enums have changed");
-static_assert(1 == static_cast<int>(SkBlendMode::kSrc), "SkBlendMode enums have changed");
-static_assert(2 == static_cast<int>(SkBlendMode::kDst), "SkBlendMode enums have changed");
-static_assert(3 == static_cast<int>(SkBlendMode::kSrcOver), "SkBlendMode enums have changed");
-static_assert(4 == static_cast<int>(SkBlendMode::kDstOver), "SkBlendMode enums have changed");
-static_assert(5 == static_cast<int>(SkBlendMode::kSrcIn), "SkBlendMode enums have changed");
-static_assert(6 == static_cast<int>(SkBlendMode::kDstIn), "SkBlendMode enums have changed");
-static_assert(7 == static_cast<int>(SkBlendMode::kSrcOut), "SkBlendMode enums have changed");
-static_assert(8 == static_cast<int>(SkBlendMode::kDstOut), "SkBlendMode enums have changed");
-static_assert(9 == static_cast<int>(SkBlendMode::kSrcATop), "SkBlendMode enums have changed");
-static_assert(10 == static_cast<int>(SkBlendMode::kDstATop), "SkBlendMode enums have changed");
-static_assert(11 == static_cast<int>(SkBlendMode::kXor), "SkBlendMode enums have changed");
-static_assert(12 == static_cast<int>(SkBlendMode::kPlus), "SkBlendMode enums have changed");
-static_assert(13 == static_cast<int>(SkBlendMode::kModulate), "SkBlendMode enums have changed");
-static_assert(14 == static_cast<int>(SkBlendMode::kScreen), "SkBlendMode enums have changed");
-static_assert(15 == static_cast<int>(SkBlendMode::kOverlay), "SkBlendMode enums have changed");
-static_assert(16 == static_cast<int>(SkBlendMode::kDarken), "SkBlendMode enums have changed");
-static_assert(17 == static_cast<int>(SkBlendMode::kLighten), "SkBlendMode enums have changed");
-
-// In this array, the index of each Blender equals the value of the first
-// entry. For instance, gBlends[1] == gBlends[SkBlendMode::kSrc]
-const Blender kBlends[] = {{SkBlendMode::kClear, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kSrc, GL_ONE, GL_ZERO},
- {SkBlendMode::kDst, GL_ZERO, GL_ONE},
- {SkBlendMode::kSrcOver, GL_ONE, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kDstOver, GL_ONE_MINUS_DST_ALPHA, GL_ONE},
- {SkBlendMode::kSrcIn, GL_DST_ALPHA, GL_ZERO},
- {SkBlendMode::kDstIn, GL_ZERO, GL_SRC_ALPHA},
- {SkBlendMode::kSrcOut, GL_ONE_MINUS_DST_ALPHA, GL_ZERO},
- {SkBlendMode::kDstOut, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kSrcATop, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kDstATop, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA},
- {SkBlendMode::kXor, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kPlus, GL_ONE, GL_ONE},
- {SkBlendMode::kModulate, GL_ZERO, GL_SRC_COLOR},
- {SkBlendMode::kScreen, GL_ONE, GL_ONE_MINUS_SRC_COLOR}};
-
-// This array contains the swapped version of each SkBlendMode. For instance
-// this array's SrcOver blending mode is actually DstOver. You can refer to
-// createLayer() for more information on the purpose of this array.
-const Blender kBlendsSwap[] = {{SkBlendMode::kClear, GL_ONE_MINUS_DST_ALPHA, GL_ZERO},
- {SkBlendMode::kSrc, GL_ZERO, GL_ONE},
- {SkBlendMode::kDst, GL_ONE, GL_ZERO},
- {SkBlendMode::kSrcOver, GL_ONE_MINUS_DST_ALPHA, GL_ONE},
- {SkBlendMode::kDstOver, GL_ONE, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kSrcIn, GL_ZERO, GL_SRC_ALPHA},
- {SkBlendMode::kDstIn, GL_DST_ALPHA, GL_ZERO},
- {SkBlendMode::kSrcOut, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kDstOut, GL_ONE_MINUS_DST_ALPHA, GL_ZERO},
- {SkBlendMode::kSrcATop, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA},
- {SkBlendMode::kDstATop, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kXor, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA},
- {SkBlendMode::kPlus, GL_ONE, GL_ONE},
- {SkBlendMode::kModulate, GL_DST_COLOR, GL_ZERO},
- {SkBlendMode::kScreen, GL_ONE_MINUS_DST_COLOR, GL_ONE}};
-
-Blend::Blend() : mEnabled(false), mSrcMode(GL_ZERO), mDstMode(GL_ZERO) {
- // gl blending off by default
-}
-
-void Blend::invalidate() {
- syncEnabled();
- mSrcMode = mDstMode = GL_ZERO;
-}
-
-void Blend::syncEnabled() {
- if (mEnabled) {
- glEnable(GL_BLEND);
- } else {
- glDisable(GL_BLEND);
- }
-}
-
-void Blend::getFactors(SkBlendMode mode, ModeOrderSwap modeUsage, GLenum* outSrc, GLenum* outDst) {
- int index = static_cast<int>(mode);
- *outSrc = (modeUsage == ModeOrderSwap::Swap) ? kBlendsSwap[index].src : kBlends[index].src;
- *outDst = (modeUsage == ModeOrderSwap::Swap) ? kBlendsSwap[index].dst : kBlends[index].dst;
-}
-
-void Blend::setFactors(GLenum srcMode, GLenum dstMode) {
- if ((srcMode == GL_ZERO || srcMode == GL_ONE) && dstMode == GL_ZERO) {
- // disable blending
- if (mEnabled) {
- glDisable(GL_BLEND);
- mEnabled = false;
- }
- } else {
- // enable blending
- if (!mEnabled) {
- glEnable(GL_BLEND);
- mEnabled = true;
- }
-
- if (srcMode != mSrcMode || dstMode != mDstMode) {
- glBlendFunc(srcMode, dstMode);
- mSrcMode = srcMode;
- mDstMode = dstMode;
- }
- }
-}
-
-void Blend::dump() {
- ALOGD("Blend: enabled %d, func src %d, dst %d", mEnabled, mSrcMode, mDstMode);
-}
-
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/renderstate/Blend.h b/libs/hwui/renderstate/Blend.h
deleted file mode 100644
index 7e559bace3f2..000000000000
--- a/libs/hwui/renderstate/Blend.h
+++ /dev/null
@@ -1,63 +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.
- */
-#ifndef RENDERSTATE_BLEND_H
-#define RENDERSTATE_BLEND_H
-
-#include "Vertex.h"
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#include <SkBlendMode.h>
-#include <memory>
-
-namespace android {
-namespace uirenderer {
-
-class Blend {
- friend class RenderState;
-
-public:
- // dictates whether to swap src/dst
- enum class ModeOrderSwap {
- NoSwap,
- Swap,
- };
- void syncEnabled();
-
- static void getFactors(SkBlendMode mode, ModeOrderSwap modeUsage, GLenum* outSrc,
- GLenum* outDst);
- void setFactors(GLenum src, GLenum dst);
-
- bool getEnabled() { return mEnabled; }
- void getFactors(GLenum* src, GLenum* dst) {
- *src = mSrcMode;
- *dst = mDstMode;
- }
-
- void dump();
-
-private:
- Blend();
- void invalidate();
- bool mEnabled;
- GLenum mSrcMode;
- GLenum mDstMode;
-};
-
-} /* namespace uirenderer */
-} /* namespace android */
-
-#endif // RENDERSTATE_BLEND_H
diff --git a/libs/hwui/renderstate/MeshState.cpp b/libs/hwui/renderstate/MeshState.cpp
deleted file mode 100644
index 4f6c49e67b99..000000000000
--- a/libs/hwui/renderstate/MeshState.cpp
+++ /dev/null
@@ -1,179 +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.
- */
-#include "renderstate/MeshState.h"
-
-#include "Program.h"
-
-namespace android {
-namespace uirenderer {
-
-MeshState::MeshState()
- : mCurrentIndicesBuffer(0)
- , mCurrentPixelBuffer(0)
- , mCurrentPositionPointer(this)
- , mCurrentPositionStride(0)
- , mCurrentTexCoordsPointer(this)
- , mCurrentTexCoordsStride(0)
- , mTexCoordsArrayEnabled(false)
- , mQuadListIndices(0) {
- glGenBuffers(1, &mUnitQuadBuffer);
- glBindBuffer(GL_ARRAY_BUFFER, mUnitQuadBuffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(kUnitQuadVertices), kUnitQuadVertices, GL_STATIC_DRAW);
- mCurrentBuffer = mUnitQuadBuffer;
-
- uint16_t regionIndices[kMaxNumberOfQuads * 6];
- for (uint32_t i = 0; i < kMaxNumberOfQuads; i++) {
- uint16_t quad = i * 4;
- int index = i * 6;
- regionIndices[index] = quad; // top-left
- regionIndices[index + 1] = quad + 1; // top-right
- regionIndices[index + 2] = quad + 2; // bottom-left
- regionIndices[index + 3] = quad + 2; // bottom-left
- regionIndices[index + 4] = quad + 1; // top-right
- regionIndices[index + 5] = quad + 3; // bottom-right
- }
- glGenBuffers(1, &mQuadListIndices);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mQuadListIndices);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(regionIndices), regionIndices, GL_STATIC_DRAW);
- mCurrentIndicesBuffer = mQuadListIndices;
-
- // position attribute always enabled
- glEnableVertexAttribArray(Program::kBindingPosition);
-}
-
-MeshState::~MeshState() {
- glDeleteBuffers(1, &mUnitQuadBuffer);
- mCurrentBuffer = 0;
-
- glDeleteBuffers(1, &mQuadListIndices);
- mQuadListIndices = 0;
-}
-
-void MeshState::dump() {
- ALOGD("MeshState VBOs: unitQuad %d, current %d", mUnitQuadBuffer, mCurrentBuffer);
- ALOGD("MeshState IBOs: quadList %d, current %d", mQuadListIndices, mCurrentIndicesBuffer);
- ALOGD("MeshState vertices: vertex data %p, stride %d", mCurrentPositionPointer,
- mCurrentPositionStride);
- ALOGD("MeshState texCoord: data %p, stride %d", mCurrentTexCoordsPointer,
- mCurrentTexCoordsStride);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Buffer Objects
-///////////////////////////////////////////////////////////////////////////////
-
-void MeshState::bindMeshBuffer(GLuint buffer) {
- if (mCurrentBuffer != buffer) {
- glBindBuffer(GL_ARRAY_BUFFER, buffer);
- mCurrentBuffer = buffer;
-
- // buffer has changed, so invalidate cached vertex pos/texcoord pointers
- resetVertexPointers();
- }
-}
-
-void MeshState::unbindMeshBuffer() {
- return bindMeshBuffer(0);
-}
-
-void MeshState::genOrUpdateMeshBuffer(GLuint* buffer, GLsizeiptr size, const void* data,
- GLenum usage) {
- if (!*buffer) {
- glGenBuffers(1, buffer);
- }
- bindMeshBuffer(*buffer);
- glBufferData(GL_ARRAY_BUFFER, size, data, usage);
-}
-
-void MeshState::updateMeshBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size,
- const void* data) {
- bindMeshBuffer(buffer);
- glBufferSubData(GL_ARRAY_BUFFER, offset, size, data);
-}
-
-void MeshState::deleteMeshBuffer(GLuint buffer) {
- if (buffer == mCurrentBuffer) {
- // GL defines that deleting the currently bound VBO rebinds to 0 (no VBO).
- // Reflect this in our cached value.
- mCurrentBuffer = 0;
- }
- glDeleteBuffers(1, &buffer);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Vertices
-///////////////////////////////////////////////////////////////////////////////
-
-void MeshState::bindPositionVertexPointer(const GLvoid* vertices, GLsizei stride) {
- // update pos coords if !current vbo, since vertices may point into mutable memory (e.g. stack)
- if (mCurrentBuffer == 0 || vertices != mCurrentPositionPointer ||
- stride != mCurrentPositionStride) {
- glVertexAttribPointer(Program::kBindingPosition, 2, GL_FLOAT, GL_FALSE, stride, vertices);
- mCurrentPositionPointer = vertices;
- mCurrentPositionStride = stride;
- }
-}
-
-void MeshState::bindTexCoordsVertexPointer(const GLvoid* vertices, GLsizei stride) {
- // update tex coords if !current vbo, since vertices may point into mutable memory (e.g. stack)
- if (mCurrentBuffer == 0 || vertices != mCurrentTexCoordsPointer ||
- stride != mCurrentTexCoordsStride) {
- glVertexAttribPointer(Program::kBindingTexCoords, 2, GL_FLOAT, GL_FALSE, stride, vertices);
- mCurrentTexCoordsPointer = vertices;
- mCurrentTexCoordsStride = stride;
- }
-}
-
-void MeshState::resetVertexPointers() {
- mCurrentPositionPointer = this;
- mCurrentTexCoordsPointer = this;
-}
-
-void MeshState::enableTexCoordsVertexArray() {
- if (!mTexCoordsArrayEnabled) {
- glEnableVertexAttribArray(Program::kBindingTexCoords);
- mCurrentTexCoordsPointer = this;
- mTexCoordsArrayEnabled = true;
- }
-}
-
-void MeshState::disableTexCoordsVertexArray() {
- if (mTexCoordsArrayEnabled) {
- glDisableVertexAttribArray(Program::kBindingTexCoords);
- mTexCoordsArrayEnabled = false;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Indices
-///////////////////////////////////////////////////////////////////////////////
-
-void MeshState::bindIndicesBuffer(const GLuint buffer) {
- if (mCurrentIndicesBuffer != buffer) {
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
- mCurrentIndicesBuffer = buffer;
- }
-}
-
-void MeshState::unbindIndicesBuffer() {
- if (mCurrentIndicesBuffer) {
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- mCurrentIndicesBuffer = 0;
- }
-}
-
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/renderstate/MeshState.h b/libs/hwui/renderstate/MeshState.h
deleted file mode 100644
index 95faf1ebfb02..000000000000
--- a/libs/hwui/renderstate/MeshState.h
+++ /dev/null
@@ -1,133 +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.
- */
-#ifndef RENDERSTATE_MESHSTATE_H
-#define RENDERSTATE_MESHSTATE_H
-
-#include "Vertex.h"
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#include <memory>
-
-namespace android {
-namespace uirenderer {
-
-class Program;
-
-// Maximum number of quads that pre-allocated meshes can draw
-const uint32_t kMaxNumberOfQuads = 2048;
-
-// This array is never used directly but used as a memcpy source in the
-// OpenGLRenderer constructor
-const TextureVertex kUnitQuadVertices[] = {
- {0, 0, 0, 0}, {1, 0, 1, 0}, {0, 1, 0, 1}, {1, 1, 1, 1},
-};
-
-const GLsizei kVertexStride = sizeof(Vertex);
-const GLsizei kAlphaVertexStride = sizeof(AlphaVertex);
-const GLsizei kTextureVertexStride = sizeof(TextureVertex);
-const GLsizei kColorTextureVertexStride = sizeof(ColorTextureVertex);
-
-const GLsizei kMeshTextureOffset = 2 * sizeof(float);
-const GLsizei kVertexAlphaOffset = 2 * sizeof(float);
-const GLsizei kVertexAAWidthOffset = 2 * sizeof(float);
-const GLsizei kVertexAALengthOffset = 3 * sizeof(float);
-const GLsizei kUnitQuadCount = 4;
-
-class MeshState {
-private:
- friend class RenderState;
-
-public:
- ~MeshState();
- void dump();
- ///////////////////////////////////////////////////////////////////////////////
- // Buffer objects
- ///////////////////////////////////////////////////////////////////////////////
-
- /**
- * Binds the specified VBO if needed. If buffer == 0, binds default simple textured quad.
- */
- void bindMeshBuffer(GLuint buffer);
-
- /**
- * Unbinds the current VBO if active.
- */
- void unbindMeshBuffer();
-
- void genOrUpdateMeshBuffer(GLuint* buffer, GLsizeiptr size, const void* data, GLenum usage);
- void updateMeshBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);
- void deleteMeshBuffer(GLuint);
-
- ///////////////////////////////////////////////////////////////////////////////
- // Vertices
- ///////////////////////////////////////////////////////////////////////////////
- /**
- * Binds an attrib to the specified float vertex pointer.
- * Assumes a stride of gTextureVertexStride and a size of 2.
- */
- void bindPositionVertexPointer(const GLvoid* vertices, GLsizei stride = kTextureVertexStride);
-
- /**
- * Binds an attrib to the specified float vertex pointer.
- * Assumes a stride of gTextureVertexStride and a size of 2.
- */
- void bindTexCoordsVertexPointer(const GLvoid* vertices, GLsizei stride = kTextureVertexStride);
-
- /**
- * Resets the vertex pointers.
- */
- void resetVertexPointers();
-
- void enableTexCoordsVertexArray();
- void disableTexCoordsVertexArray();
-
- ///////////////////////////////////////////////////////////////////////////////
- // Indices
- ///////////////////////////////////////////////////////////////////////////////
- void bindIndicesBuffer(const GLuint buffer);
- void unbindIndicesBuffer();
-
- ///////////////////////////////////////////////////////////////////////////////
- // Getters - for use in Glop building
- ///////////////////////////////////////////////////////////////////////////////
- GLuint getUnitQuadVBO() { return mUnitQuadBuffer; }
- GLuint getQuadListIBO() { return mQuadListIndices; }
-
-private:
- MeshState();
-
- GLuint mUnitQuadBuffer;
-
- GLuint mCurrentBuffer;
- GLuint mCurrentIndicesBuffer;
- GLuint mCurrentPixelBuffer;
-
- const void* mCurrentPositionPointer;
- GLsizei mCurrentPositionStride;
- const void* mCurrentTexCoordsPointer;
- GLsizei mCurrentTexCoordsStride;
-
- bool mTexCoordsArrayEnabled;
-
- // Global index buffer
- GLuint mQuadListIndices;
-};
-
-} /* namespace uirenderer */
-} /* namespace android */
-
-#endif // RENDERSTATE_MESHSTATE_H
diff --git a/libs/hwui/renderstate/OffscreenBufferPool.cpp b/libs/hwui/renderstate/OffscreenBufferPool.cpp
deleted file mode 100644
index a0f5cb9d4e09..000000000000
--- a/libs/hwui/renderstate/OffscreenBufferPool.cpp
+++ /dev/null
@@ -1,217 +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.
- */
-
-#include "OffscreenBufferPool.h"
-
-#include "Caches.h"
-#include "renderstate/RenderState.h"
-#include "utils/FatVector.h"
-#include "utils/TraceUtils.h"
-
-#include <utils/Color.h>
-#include <utils/Log.h>
-
-#include <GLES2/gl2.h>
-
-namespace android {
-namespace uirenderer {
-
-////////////////////////////////////////////////////////////////////////////////
-// OffscreenBuffer
-////////////////////////////////////////////////////////////////////////////////
-
-OffscreenBuffer::OffscreenBuffer(RenderState& renderState, Caches& caches, uint32_t viewportWidth,
- uint32_t viewportHeight, bool wideColorGamut)
- : GpuMemoryTracker(GpuObjectType::OffscreenBuffer)
- , renderState(renderState)
- , viewportWidth(viewportWidth)
- , viewportHeight(viewportHeight)
- , texture(caches)
- , wideColorGamut(wideColorGamut) {
- uint32_t width = computeIdealDimension(viewportWidth);
- uint32_t height = computeIdealDimension(viewportHeight);
- ATRACE_FORMAT("Allocate %ux%u HW Layer", width, height);
- caches.textureState().activateTexture(0);
- texture.resize(width, height, wideColorGamut ? GL_RGBA16F : caches.rgbaInternalFormat(),
- GL_RGBA);
- texture.blend = true;
- texture.setWrap(GL_CLAMP_TO_EDGE);
- // not setting filter on texture, since it's set when drawing, based on transform
-}
-
-Rect OffscreenBuffer::getTextureCoordinates() {
- const float texX = 1.0f / static_cast<float>(texture.width());
- const float texY = 1.0f / static_cast<float>(texture.height());
- return Rect(0, viewportHeight * texY, viewportWidth * texX, 0);
-}
-
-void OffscreenBuffer::dirty(Rect dirtyArea) {
- dirtyArea.doIntersect(0, 0, viewportWidth, viewportHeight);
- if (!dirtyArea.isEmpty()) {
- region.orSelf(
- android::Rect(dirtyArea.left, dirtyArea.top, dirtyArea.right, dirtyArea.bottom));
- }
-}
-
-void OffscreenBuffer::updateMeshFromRegion() {
- // avoid T-junctions as they cause artifacts in between the resultant
- // geometry when complex transforms occur.
- // TODO: generate the safeRegion only if necessary based on drawing transform
- Region safeRegion = Region::createTJunctionFreeRegion(region);
-
- size_t count;
- const android::Rect* rects = safeRegion.getArray(&count);
-
- const float texX = 1.0f / float(texture.width());
- const float texY = 1.0f / float(texture.height());
-
- FatVector<TextureVertex, 64> meshVector(count *
- 4); // uses heap if more than 64 vertices needed
- TextureVertex* mesh = &meshVector[0];
- for (size_t i = 0; i < count; i++) {
- const android::Rect* r = &rects[i];
-
- const float u1 = r->left * texX;
- const float v1 = (viewportHeight - r->top) * texY;
- const float u2 = r->right * texX;
- const float v2 = (viewportHeight - r->bottom) * texY;
-
- TextureVertex::set(mesh++, r->left, r->top, u1, v1);
- TextureVertex::set(mesh++, r->right, r->top, u2, v1);
- TextureVertex::set(mesh++, r->left, r->bottom, u1, v2);
- TextureVertex::set(mesh++, r->right, r->bottom, u2, v2);
- }
- elementCount = count * 6;
- renderState.meshState().genOrUpdateMeshBuffer(
- &vbo, sizeof(TextureVertex) * count * 4, &meshVector[0],
- GL_DYNAMIC_DRAW); // TODO: GL_STATIC_DRAW if savelayer
-}
-
-uint32_t OffscreenBuffer::computeIdealDimension(uint32_t dimension) {
- return uint32_t(ceilf(dimension / float(LAYER_SIZE)) * LAYER_SIZE);
-}
-
-OffscreenBuffer::~OffscreenBuffer() {
- ATRACE_FORMAT("Destroy %ux%u HW Layer", texture.width(), texture.height());
- texture.deleteTexture();
- renderState.meshState().deleteMeshBuffer(vbo);
- elementCount = 0;
- vbo = 0;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// OffscreenBufferPool
-///////////////////////////////////////////////////////////////////////////////
-
-OffscreenBufferPool::OffscreenBufferPool()
- // 4 screen-sized RGBA_8888 textures
- : mMaxSize(DeviceInfo::multiplyByResolution(4 * 4)) {}
-
-OffscreenBufferPool::~OffscreenBufferPool() {
- clear(); // TODO: unique_ptr?
-}
-
-int OffscreenBufferPool::Entry::compare(const Entry& lhs, const Entry& rhs) {
- int deltaInt = int(lhs.width) - int(rhs.width);
- if (deltaInt != 0) return deltaInt;
-
- deltaInt = int(lhs.height) - int(rhs.height);
- if (deltaInt != 0) return deltaInt;
-
- return int(lhs.wideColorGamut) - int(rhs.wideColorGamut);
-}
-
-void OffscreenBufferPool::clear() {
- for (auto& entry : mPool) {
- delete entry.layer;
- }
- mPool.clear();
- mSize = 0;
-}
-
-OffscreenBuffer* OffscreenBufferPool::get(RenderState& renderState, const uint32_t width,
- const uint32_t height, bool wideColorGamut) {
- OffscreenBuffer* layer = nullptr;
-
- Entry entry(width, height, wideColorGamut);
- auto iter = mPool.find(entry);
-
- if (iter != mPool.end()) {
- entry = *iter;
- mPool.erase(iter);
-
- layer = entry.layer;
- layer->viewportWidth = width;
- layer->viewportHeight = height;
- mSize -= layer->getSizeInBytes();
- } else {
- layer = new OffscreenBuffer(renderState, Caches::getInstance(), width, height,
- wideColorGamut);
- }
-
- return layer;
-}
-
-OffscreenBuffer* OffscreenBufferPool::resize(OffscreenBuffer* layer, const uint32_t width,
- const uint32_t height) {
- RenderState& renderState = layer->renderState;
- if (layer->texture.width() == OffscreenBuffer::computeIdealDimension(width) &&
- layer->texture.height() == OffscreenBuffer::computeIdealDimension(height)) {
- // resize in place
- layer->viewportWidth = width;
- layer->viewportHeight = height;
-
- // entire area will be repainted (and may be smaller) so clear usage region
- layer->region.clear();
- return layer;
- }
- bool wideColorGamut = layer->wideColorGamut;
- putOrDelete(layer);
- return get(renderState, width, height, wideColorGamut);
-}
-
-void OffscreenBufferPool::dump() {
- for (auto entry : mPool) {
- ALOGD(" Layer size %dx%d", entry.width, entry.height);
- }
-}
-
-void OffscreenBufferPool::putOrDelete(OffscreenBuffer* layer) {
- const uint32_t size = layer->getSizeInBytes();
- // Don't even try to cache a layer that's bigger than the cache
- if (size < mMaxSize) {
- // TODO: Use an LRU
- while (mSize + size > mMaxSize) {
- OffscreenBuffer* victim = mPool.begin()->layer;
- mSize -= victim->getSizeInBytes();
- delete victim;
- mPool.erase(mPool.begin());
- }
-
- // clear region, since it's no longer valid
- layer->region.clear();
-
- Entry entry(layer);
-
- mPool.insert(entry);
- mSize += size;
- } else {
- delete layer;
- }
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/renderstate/OffscreenBufferPool.h b/libs/hwui/renderstate/OffscreenBufferPool.h
deleted file mode 100644
index 08ae052da391..000000000000
--- a/libs/hwui/renderstate/OffscreenBufferPool.h
+++ /dev/null
@@ -1,162 +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.
- */
-
-#ifndef ANDROID_HWUI_OFFSCREEN_BUFFER_POOL_H
-#define ANDROID_HWUI_OFFSCREEN_BUFFER_POOL_H
-
-#include <GpuMemoryTracker.h>
-#include <ui/Region.h>
-#include "Caches.h"
-#include "Texture.h"
-#include "utils/Macros.h"
-
-#include <set>
-
-namespace android {
-namespace uirenderer {
-
-class RenderState;
-
-/**
- * Lightweight alternative to Layer. Owns the persistent state of an offscreen render target, and
- * encompasses enough information to draw it back on screen (minus paint properties, which are held
- * by LayerOp).
- *
- * Has two distinct sizes - viewportWidth/viewportHeight describe content area,
- * texture.width/.height are actual allocated texture size. Texture will tend to be larger than the
- * viewport bounds, since textures are always allocated with width / height as a multiple of 64, for
- * the purpose of improving reuse.
- */
-class OffscreenBuffer : GpuMemoryTracker {
-public:
- OffscreenBuffer(RenderState& renderState, Caches& caches, uint32_t viewportWidth,
- uint32_t viewportHeight, bool wideColorGamut = false);
- ~OffscreenBuffer();
-
- Rect getTextureCoordinates();
-
- void dirty(Rect dirtyArea);
-
- // must be called prior to rendering, to construct/update vertex buffer
- void updateMeshFromRegion();
-
- // Set by RenderNode for HW layers, TODO for clipped saveLayers
- void setWindowTransform(const Matrix4& transform) {
- inverseTransformInWindow.loadInverse(transform);
- }
-
- static uint32_t computeIdealDimension(uint32_t dimension);
-
- uint32_t getSizeInBytes() { return texture.objectSize(); }
-
- RenderState& renderState;
-
- uint32_t viewportWidth;
- uint32_t viewportHeight;
- Texture texture;
-
- bool wideColorGamut = false;
-
- // Portion of layer that has been drawn to. Used to minimize drawing area when
- // drawing back to screen / parent FBO.
- Region region;
-
- Matrix4 inverseTransformInWindow;
-
- // vbo / size of mesh
- GLsizei elementCount = 0;
- GLuint vbo = 0;
-
- bool hasRenderedSinceRepaint;
-};
-
-/**
- * Pool of OffscreenBuffers allocated, but not currently in use.
- */
-class OffscreenBufferPool {
-public:
- OffscreenBufferPool();
- ~OffscreenBufferPool();
-
- WARN_UNUSED_RESULT OffscreenBuffer* get(RenderState& renderState, const uint32_t width,
- const uint32_t height, bool wideColorGamut = false);
-
- WARN_UNUSED_RESULT OffscreenBuffer* resize(OffscreenBuffer* layer, const uint32_t width,
- const uint32_t height);
-
- void putOrDelete(OffscreenBuffer* layer);
-
- /**
- * Clears the pool. This causes all layers to be deleted.
- */
- void clear();
-
- /**
- * Returns the maximum size of the pool in bytes.
- */
- uint32_t getMaxSize() { return mMaxSize; }
-
- /**
- * Returns the current size of the pool in bytes.
- */
- uint32_t getSize() { return mSize; }
-
- size_t getCount() { return mPool.size(); }
-
- /**
- * Prints out the content of the pool.
- */
- void dump();
-
-private:
- struct Entry {
- Entry() {}
-
- Entry(const uint32_t layerWidth, const uint32_t layerHeight, bool wideColorGamut)
- : width(OffscreenBuffer::computeIdealDimension(layerWidth))
- , height(OffscreenBuffer::computeIdealDimension(layerHeight))
- , wideColorGamut(wideColorGamut) {}
-
- explicit Entry(OffscreenBuffer* layer)
- : layer(layer)
- , width(layer->texture.width())
- , height(layer->texture.height())
- , wideColorGamut(layer->wideColorGamut) {}
-
- static int compare(const Entry& lhs, const Entry& rhs);
-
- bool operator==(const Entry& other) const { return compare(*this, other) == 0; }
-
- bool operator!=(const Entry& other) const { return compare(*this, other) != 0; }
-
- bool operator<(const Entry& other) const { return Entry::compare(*this, other) < 0; }
-
- OffscreenBuffer* layer = nullptr;
- uint32_t width = 0;
- uint32_t height = 0;
- bool wideColorGamut = false;
- }; // struct Entry
-
- std::multiset<Entry> mPool;
-
- uint32_t mSize = 0;
- uint32_t mMaxSize;
-}; // class OffscreenBufferCache
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_OFFSCREEN_BUFFER_POOL_H
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index 5e33353c3ac6..3be84f588a20 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -18,6 +18,7 @@
#include "DeferredLayerUpdater.h"
#include "GlLayer.h"
#include "VkLayer.h"
+#include "Snapshot.h"
#include "renderthread/CanvasContext.h"
#include "renderthread/EglManager.h"
@@ -36,25 +37,11 @@ RenderState::RenderState(renderthread::RenderThread& thread)
}
RenderState::~RenderState() {
- LOG_ALWAYS_FATAL_IF(mBlend || mMeshState || mScissor || mStencil,
- "State object lifecycle not managed correctly");
}
void RenderState::onGLContextCreated() {
- LOG_ALWAYS_FATAL_IF(mBlend || mMeshState || mScissor || mStencil,
- "State object lifecycle not managed correctly");
GpuMemoryTracker::onGpuContextCreated();
- mBlend = new Blend();
- mMeshState = new MeshState();
- mScissor = new Scissor();
- mStencil = new Stencil();
-
- // Deferred because creation needs GL context for texture limits
- if (!mLayerPool) {
- mLayerPool = new OffscreenBufferPool();
- }
-
// This is delayed because the first access of Caches makes GL calls
if (!mCaches) {
mCaches = &Caches::createInstance(*this);
@@ -69,29 +56,16 @@ static void layerLostGlContext(Layer* layer) {
}
void RenderState::onGLContextDestroyed() {
- mLayerPool->clear();
-
// TODO: reset all cached state in state objects
std::for_each(mActiveLayers.begin(), mActiveLayers.end(), layerLostGlContext);
mCaches->terminate();
- delete mBlend;
- mBlend = nullptr;
- delete mMeshState;
- mMeshState = nullptr;
- delete mScissor;
- mScissor = nullptr;
- delete mStencil;
- mStencil = nullptr;
-
destroyLayersInUpdater();
GpuMemoryTracker::onGpuContextDestroyed();
}
void RenderState::onVkContextCreated() {
- LOG_ALWAYS_FATAL_IF(mBlend || mMeshState || mScissor || mStencil,
- "State object lifecycle not managed correctly");
GpuMemoryTracker::onGpuContextCreated();
}
@@ -112,23 +86,11 @@ GrContext* RenderState::getGrContext() const {
}
void RenderState::flush(Caches::FlushMode mode) {
- switch (mode) {
- case Caches::FlushMode::Full:
- // fall through
- case Caches::FlushMode::Moderate:
- // fall through
- case Caches::FlushMode::Layers:
- if (mLayerPool) mLayerPool->clear();
- break;
- }
if (mCaches) mCaches->flush(mode);
}
void RenderState::onBitmapDestroyed(uint32_t pixelRefId) {
- if (mCaches && mCaches->textureCache.destroyTexture(pixelRefId)) {
- glFlush();
- GL_CHECKPOINT(MODERATE);
- }
+ // DEAD CODE
}
void RenderState::setViewport(GLsizei width, GLsizei height) {
@@ -177,12 +139,7 @@ void RenderState::invokeFunctor(Functor* functor, DrawGlInfo::Mode mode, DrawGlI
}
void RenderState::interruptForFunctorInvoke() {
- mCaches->setProgram(nullptr);
mCaches->textureState().resetActiveTexture();
- meshState().unbindMeshBuffer();
- meshState().unbindIndicesBuffer();
- meshState().resetVertexPointers();
- meshState().disableTexCoordsVertexArray();
debugOverdraw(false, false);
// TODO: We need a way to know whether the functor is sRGB aware (b/32072673)
if (mCaches->extensions().hasLinearBlending() && mCaches->extensions().hasSRGBWriteControl()) {
@@ -201,25 +158,12 @@ void RenderState::resumeFromFunctorInvoke() {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- scissor().invalidate();
- blend().invalidate();
-
mCaches->textureState().activateTexture(0);
mCaches->textureState().resetBoundTextures();
}
void RenderState::debugOverdraw(bool enable, bool clear) {
- if (Properties::debugOverdraw && mFramebuffer == 0) {
- if (clear) {
- scissor().setEnabled(false);
- stencil().clear();
- }
- if (enable) {
- stencil().enableDebugWrite();
- } else {
- stencil().disable();
- }
- }
+ // DEAD CODE
}
static void destroyLayerInUpdater(DeferredLayerUpdater* layerUpdater) {
@@ -242,229 +186,8 @@ void RenderState::postDecStrong(VirtualLightRefBase* object) {
// Render
///////////////////////////////////////////////////////////////////////////////
-void RenderState::render(const Glop& glop, const Matrix4& orthoMatrix,
- bool overrideDisableBlending) {
- const Glop::Mesh& mesh = glop.mesh;
- const Glop::Mesh::Vertices& vertices = mesh.vertices;
- const Glop::Mesh::Indices& indices = mesh.indices;
- const Glop::Fill& fill = glop.fill;
-
- GL_CHECKPOINT(MODERATE);
-
- // ---------------------------------------------
- // ---------- Program + uniform setup ----------
- // ---------------------------------------------
- mCaches->setProgram(fill.program);
-
- if (fill.colorEnabled) {
- fill.program->setColor(fill.color);
- }
-
- fill.program->set(orthoMatrix, glop.transform.modelView, glop.transform.meshTransform(),
- glop.transform.transformFlags & TransformFlags::OffsetByFudgeFactor);
-
- // Color filter uniforms
- if (fill.filterMode == ProgramDescription::ColorFilterMode::Blend) {
- const FloatColor& color = fill.filter.color;
- glUniform4f(mCaches->program().getUniform("colorBlend"), color.r, color.g, color.b,
- color.a);
- } else if (fill.filterMode == ProgramDescription::ColorFilterMode::Matrix) {
- glUniformMatrix4fv(mCaches->program().getUniform("colorMatrix"), 1, GL_FALSE,
- fill.filter.matrix.matrix);
- glUniform4fv(mCaches->program().getUniform("colorMatrixVector"), 1,
- fill.filter.matrix.vector);
- }
-
- // Round rect clipping uniforms
- if (glop.roundRectClipState) {
- // TODO: avoid query, and cache values (or RRCS ptr) in program
- const RoundRectClipState* state = glop.roundRectClipState;
- const Rect& innerRect = state->innerRect;
-
- // add half pixel to round out integer rect space to cover pixel centers
- float roundedOutRadius = state->radius + 0.5f;
-
- // Divide by the radius to simplify the calculations in the fragment shader
- // roundRectPos is also passed from vertex shader relative to top/left & radius
- glUniform4f(fill.program->getUniform("roundRectInnerRectLTWH"),
- innerRect.left / roundedOutRadius, innerRect.top / roundedOutRadius,
- (innerRect.right - innerRect.left) / roundedOutRadius,
- (innerRect.bottom - innerRect.top) / roundedOutRadius);
-
- glUniformMatrix4fv(fill.program->getUniform("roundRectInvTransform"), 1, GL_FALSE,
- &state->matrix.data[0]);
-
- glUniform1f(fill.program->getUniform("roundRectRadius"), roundedOutRadius);
- }
-
- GL_CHECKPOINT(MODERATE);
-
- // --------------------------------
- // ---------- Mesh setup ----------
- // --------------------------------
- // vertices
- meshState().bindMeshBuffer(vertices.bufferObject);
- meshState().bindPositionVertexPointer(vertices.position, vertices.stride);
-
- // indices
- meshState().bindIndicesBuffer(indices.bufferObject);
-
- // texture
- if (fill.texture.texture != nullptr) {
- const Glop::Fill::TextureData& texture = fill.texture;
- // texture always takes slot 0, shader samplers increment from there
- mCaches->textureState().activateTexture(0);
-
- mCaches->textureState().bindTexture(texture.texture->target(), texture.texture->id());
- if (texture.clamp != GL_INVALID_ENUM) {
- texture.texture->setWrap(texture.clamp, false, false);
- }
- if (texture.filter != GL_INVALID_ENUM) {
- texture.texture->setFilter(texture.filter, false, false);
- }
-
- if (texture.textureTransform) {
- glUniformMatrix4fv(fill.program->getUniform("mainTextureTransform"), 1, GL_FALSE,
- &texture.textureTransform->data[0]);
- }
- }
-
- // vertex attributes (tex coord, color, alpha)
- if (vertices.attribFlags & VertexAttribFlags::TextureCoord) {
- meshState().enableTexCoordsVertexArray();
- meshState().bindTexCoordsVertexPointer(vertices.texCoord, vertices.stride);
- } else {
- meshState().disableTexCoordsVertexArray();
- }
- int colorLocation = -1;
- if (vertices.attribFlags & VertexAttribFlags::Color) {
- colorLocation = fill.program->getAttrib("colors");
- glEnableVertexAttribArray(colorLocation);
- glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, vertices.stride,
- vertices.color);
- }
- int alphaLocation = -1;
- if (vertices.attribFlags & VertexAttribFlags::Alpha) {
- // NOTE: alpha vertex position is computed assuming no VBO
- const void* alphaCoords = ((const GLbyte*)vertices.position) + kVertexAlphaOffset;
- alphaLocation = fill.program->getAttrib("vtxAlpha");
- glEnableVertexAttribArray(alphaLocation);
- glVertexAttribPointer(alphaLocation, 1, GL_FLOAT, GL_FALSE, vertices.stride, alphaCoords);
- }
- // Shader uniforms
- SkiaShader::apply(*mCaches, fill.skiaShaderData, mViewportWidth, mViewportHeight);
-
- GL_CHECKPOINT(MODERATE);
- Texture* texture = (fill.skiaShaderData.skiaShaderType & kBitmap_SkiaShaderType)
- ? fill.skiaShaderData.bitmapData.bitmapTexture
- : nullptr;
- const AutoTexture autoCleanup(texture);
-
- // If we have a shader and a base texture, the base texture is assumed to be an alpha mask
- // which means the color space conversion applies to the shader's bitmap
- Texture* colorSpaceTexture = texture != nullptr ? texture : fill.texture.texture;
- if (colorSpaceTexture != nullptr) {
- if (colorSpaceTexture->hasColorSpaceConversion()) {
- const ColorSpaceConnector* connector = colorSpaceTexture->getColorSpaceConnector();
- glUniformMatrix3fv(fill.program->getUniform("colorSpaceMatrix"), 1, GL_FALSE,
- connector->getTransform().asArray());
- }
-
- TransferFunctionType transferFunction = colorSpaceTexture->getTransferFunctionType();
- if (transferFunction != TransferFunctionType::None) {
- const ColorSpaceConnector* connector = colorSpaceTexture->getColorSpaceConnector();
- const ColorSpace& source = connector->getSource();
-
- switch (transferFunction) {
- case TransferFunctionType::None:
- break;
- case TransferFunctionType::Full:
- glUniform1fv(fill.program->getUniform("transferFunction"), 7,
- reinterpret_cast<const float*>(&source.getTransferParameters().g));
- break;
- case TransferFunctionType::Limited:
- glUniform1fv(fill.program->getUniform("transferFunction"), 5,
- reinterpret_cast<const float*>(&source.getTransferParameters().g));
- break;
- case TransferFunctionType::Gamma:
- glUniform1f(fill.program->getUniform("transferFunctionGamma"),
- source.getTransferParameters().g);
- break;
- }
- }
- }
-
- // ------------------------------------
- // ---------- GL state setup ----------
- // ------------------------------------
- if (CC_UNLIKELY(overrideDisableBlending)) {
- blend().setFactors(GL_ZERO, GL_ZERO);
- } else {
- blend().setFactors(glop.blend.src, glop.blend.dst);
- }
-
- GL_CHECKPOINT(MODERATE);
-
- // ------------------------------------
- // ---------- Actual drawing ----------
- // ------------------------------------
- if (indices.bufferObject == meshState().getQuadListIBO()) {
- // Since the indexed quad list is of limited length, we loop over
- // the glDrawXXX method while updating the vertex pointer
- GLsizei elementsCount = mesh.elementCount;
- const GLbyte* vertexData = static_cast<const GLbyte*>(vertices.position);
- while (elementsCount > 0) {
- GLsizei drawCount = std::min(elementsCount, (GLsizei)kMaxNumberOfQuads * 6);
- GLsizei vertexCount = (drawCount / 6) * 4;
- meshState().bindPositionVertexPointer(vertexData, vertices.stride);
- if (vertices.attribFlags & VertexAttribFlags::TextureCoord) {
- meshState().bindTexCoordsVertexPointer(vertexData + kMeshTextureOffset,
- vertices.stride);
- }
-
- if (mCaches->extensions().getMajorGlVersion() >= 3) {
- glDrawRangeElements(mesh.primitiveMode, 0, vertexCount - 1, drawCount,
- GL_UNSIGNED_SHORT, nullptr);
- } else {
- glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr);
- }
- elementsCount -= drawCount;
- vertexData += vertexCount * vertices.stride;
- }
- } else if (indices.bufferObject || indices.indices) {
- if (mCaches->extensions().getMajorGlVersion() >= 3) {
- // use glDrawRangeElements to reduce CPU overhead (otherwise the driver has to determine
- // the min/max index values)
- glDrawRangeElements(mesh.primitiveMode, 0, mesh.vertexCount - 1, mesh.elementCount,
- GL_UNSIGNED_SHORT, indices.indices);
- } else {
- glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT,
- indices.indices);
- }
- } else {
- glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount);
- }
-
- GL_CHECKPOINT(MODERATE);
-
- // -----------------------------------
- // ---------- Mesh teardown ----------
- // -----------------------------------
- if (vertices.attribFlags & VertexAttribFlags::Alpha) {
- glDisableVertexAttribArray(alphaLocation);
- }
- if (vertices.attribFlags & VertexAttribFlags::Color) {
- glDisableVertexAttribArray(colorLocation);
- }
-
- GL_CHECKPOINT(MODERATE);
-}
-
void RenderState::dump() {
- blend().dump();
- meshState().dump();
- scissor().dump();
- stencil().dump();
+ // DEAD CODE
}
} /* namespace uirenderer */
diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h
index e033cf2c5046..97785a46dcd7 100644
--- a/libs/hwui/renderstate/RenderState.h
+++ b/libs/hwui/renderstate/RenderState.h
@@ -17,13 +17,7 @@
#define RENDERSTATE_H
#include "Caches.h"
-#include "Glop.h"
-#include "renderstate/Blend.h"
-#include "renderstate/MeshState.h"
-#include "renderstate/OffscreenBufferPool.h"
#include "renderstate/PixelBufferState.h"
-#include "renderstate/Scissor.h"
-#include "renderstate/Stencil.h"
#include "utils/Macros.h"
#include <GLES2/gl2.h>
@@ -103,15 +97,6 @@ public:
// more thinking...
void postDecStrong(VirtualLightRefBase* object);
- void render(const Glop& glop, const Matrix4& orthoMatrix, bool overrideDisableBlending);
-
- Blend& blend() { return *mBlend; }
- MeshState& meshState() { return *mMeshState; }
- Scissor& scissor() { return *mScissor; }
- Stencil& stencil() { return *mStencil; }
-
- OffscreenBufferPool& layerPool() { return *mLayerPool; }
-
GrContext* getGrContext() const;
void dump();
@@ -127,13 +112,6 @@ private:
renderthread::RenderThread& mRenderThread;
Caches* mCaches = nullptr;
- Blend* mBlend = nullptr;
- MeshState* mMeshState = nullptr;
- Scissor* mScissor = nullptr;
- Stencil* mStencil = nullptr;
-
- OffscreenBufferPool* mLayerPool = nullptr;
-
std::set<Layer*> mActiveLayers;
std::set<DeferredLayerUpdater*> mActiveLayerUpdaters;
std::set<renderthread::CanvasContext*> mRegisteredContexts;
diff --git a/libs/hwui/renderstate/Scissor.cpp b/libs/hwui/renderstate/Scissor.cpp
deleted file mode 100644
index e37ed029542b..000000000000
--- a/libs/hwui/renderstate/Scissor.cpp
+++ /dev/null
@@ -1,103 +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.
- */
-#include "renderstate/Scissor.h"
-
-#include "Rect.h"
-
-#include <utils/Log.h>
-
-namespace android {
-namespace uirenderer {
-
-Scissor::Scissor()
- : mEnabled(false), mScissorX(0), mScissorY(0), mScissorWidth(0), mScissorHeight(0) {}
-
-bool Scissor::setEnabled(bool enabled) {
- if (mEnabled != enabled) {
- if (enabled) {
- glEnable(GL_SCISSOR_TEST);
- } else {
- glDisable(GL_SCISSOR_TEST);
- }
- mEnabled = enabled;
- return true;
- }
- return false;
-}
-
-bool Scissor::set(GLint x, GLint y, GLint width, GLint height) {
- if (mEnabled &&
- (x != mScissorX || y != mScissorY || width != mScissorWidth || height != mScissorHeight)) {
- if (x < 0) {
- width += x;
- x = 0;
- }
- if (y < 0) {
- height += y;
- y = 0;
- }
- if (width < 0) {
- width = 0;
- }
- if (height < 0) {
- height = 0;
- }
- glScissor(x, y, width, height);
-
- mScissorX = x;
- mScissorY = y;
- mScissorWidth = width;
- mScissorHeight = height;
-
- return true;
- }
- return false;
-}
-
-void Scissor::set(int viewportHeight, const Rect& clip) {
- // transform to Y-flipped GL space, and prevent negatives
- GLint x = std::max(0, (int)clip.left);
- GLint y = std::max(0, viewportHeight - (int)clip.bottom);
- GLint width = std::max(0, ((int)clip.right) - x);
- GLint height = std::max(0, (viewportHeight - (int)clip.top) - y);
-
- if (x != mScissorX || y != mScissorY || width != mScissorWidth || height != mScissorHeight) {
- glScissor(x, y, width, height);
-
- mScissorX = x;
- mScissorY = y;
- mScissorWidth = width;
- mScissorHeight = height;
- }
-}
-
-void Scissor::reset() {
- mScissorX = mScissorY = mScissorWidth = mScissorHeight = 0;
-}
-
-void Scissor::invalidate() {
- mEnabled = glIsEnabled(GL_SCISSOR_TEST);
- setEnabled(true);
- reset();
-}
-
-void Scissor::dump() {
- ALOGD("Scissor: enabled %d, %d %d %d %d", mEnabled, mScissorX, mScissorY, mScissorWidth,
- mScissorHeight);
-}
-
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/renderstate/Scissor.h b/libs/hwui/renderstate/Scissor.h
deleted file mode 100644
index 2b04f4e1384a..000000000000
--- a/libs/hwui/renderstate/Scissor.h
+++ /dev/null
@@ -1,51 +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.
- */
-#ifndef RENDERSTATE_SCISSOR_H
-#define RENDERSTATE_SCISSOR_H
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-namespace android {
-namespace uirenderer {
-
-class Rect;
-
-class Scissor {
- friend class RenderState;
-
-public:
- bool setEnabled(bool enabled);
- bool set(GLint x, GLint y, GLint width, GLint height);
- void set(int viewportHeight, const Rect& clip);
- void reset();
- bool isEnabled() { return mEnabled; }
- void dump();
-
-private:
- Scissor();
- void invalidate();
- bool mEnabled;
- GLint mScissorX;
- GLint mScissorY;
- GLint mScissorWidth;
- GLint mScissorHeight;
-};
-
-} /* namespace uirenderer */
-} /* namespace android */
-
-#endif // RENDERSTATE_SCISSOR_H
diff --git a/libs/hwui/renderstate/Stencil.cpp b/libs/hwui/renderstate/Stencil.cpp
deleted file mode 100644
index dc465fc7a6f8..000000000000
--- a/libs/hwui/renderstate/Stencil.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#include "renderstate/Stencil.h"
-
-#include "Caches.h"
-#include "Debug.h"
-#include "Extensions.h"
-#include "Properties.h"
-
-#include <GLES2/gl2ext.h>
-
-namespace android {
-namespace uirenderer {
-
-#if DEBUG_STENCIL
-#define STENCIL_WRITE_VALUE 0xff
-#define STENCIL_MASK_VALUE 0xff
-#else
-#define STENCIL_WRITE_VALUE 0x1
-#define STENCIL_MASK_VALUE 0x1
-#endif
-
-uint8_t Stencil::getStencilSize() {
- return STENCIL_BUFFER_SIZE;
-}
-
-/**
- * This method will return either GL_STENCIL_INDEX4_OES if supported,
- * GL_STENCIL_INDEX8 if not.
- *
- * Layers can't use a single bit stencil because multi-rect ClipArea needs a high enough
- * stencil resolution to represent the summation of multiple intersecting rect geometries.
- */
-GLenum Stencil::getLayerStencilFormat() {
-#if !DEBUG_STENCIL
- const Extensions& extensions = DeviceInfo::get()->extensions();
- if (extensions.has4BitStencil()) {
- return GL_STENCIL_INDEX4_OES;
- }
-#endif
- return GL_STENCIL_INDEX8;
-}
-
-void Stencil::clear() {
- glStencilMask(0xff);
- glClearStencil(0);
- glClear(GL_STENCIL_BUFFER_BIT);
-
- if (mState == StencilState::Test) {
- // reset to test state, with immutable stencil
- glStencilMask(0);
- }
-}
-
-void Stencil::enableTest(int incrementThreshold) {
- if (mState != StencilState::Test) {
- enable();
- if (incrementThreshold > 0) {
- glStencilFunc(GL_EQUAL, incrementThreshold, 0xff);
- } else {
- glStencilFunc(GL_EQUAL, STENCIL_WRITE_VALUE, STENCIL_MASK_VALUE);
- }
- // We only want to test, let's keep everything
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- glStencilMask(0);
- mState = StencilState::Test;
- }
-}
-
-void Stencil::enableWrite(int incrementThreshold) {
- if (mState != StencilState::Write) {
- enable();
- if (incrementThreshold > 0) {
- glStencilFunc(GL_ALWAYS, 1, 0xff);
- // The test always passes so the first two values are meaningless
- glStencilOp(GL_INCR, GL_INCR, GL_INCR);
- } else {
- glStencilFunc(GL_ALWAYS, STENCIL_WRITE_VALUE, STENCIL_MASK_VALUE);
- // The test always passes so the first two values are meaningless
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
- }
- glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
- glStencilMask(0xff);
- mState = StencilState::Write;
- }
-}
-
-void Stencil::enableDebugTest(GLint value, bool greater) {
- enable();
- glStencilFunc(greater ? GL_LESS : GL_EQUAL, value, 0xffffffff);
- // We only want to test, let's keep everything
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- mState = StencilState::Test;
- glStencilMask(0);
-}
-
-void Stencil::enableDebugWrite() {
- enable();
- glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff);
- // The test always passes so the first two values are meaningless
- glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- mState = StencilState::Write;
- glStencilMask(0xff);
-}
-
-void Stencil::enable() {
- if (mState == StencilState::Disabled) {
- glEnable(GL_STENCIL_TEST);
- }
-}
-
-void Stencil::disable() {
- if (mState != StencilState::Disabled) {
- glDisable(GL_STENCIL_TEST);
- mState = StencilState::Disabled;
- }
-}
-
-void Stencil::dump() {
- ALOGD("Stencil: state %d", mState);
-}
-
-}; // namespace uirenderer
-}; // namespace android
diff --git a/libs/hwui/renderstate/Stencil.h b/libs/hwui/renderstate/Stencil.h
deleted file mode 100644
index 95f372344ee4..000000000000
--- a/libs/hwui/renderstate/Stencil.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#ifndef ANDROID_HWUI_STENCIL_H
-#define ANDROID_HWUI_STENCIL_H
-
-#include <GLES2/gl2.h>
-
-#include <cutils/compiler.h>
-
-namespace android {
-namespace uirenderer {
-
-///////////////////////////////////////////////////////////////////////////////
-// Stencil buffer management
-///////////////////////////////////////////////////////////////////////////////
-
-class ANDROID_API Stencil {
-public:
- /**
- * Returns the desired size for the stencil buffer. If the returned value
- * is 0, then no stencil buffer is required.
- */
- ANDROID_API static uint8_t getStencilSize();
-
- static GLenum getLayerStencilFormat();
-
- /**
- * Clears the stencil buffer.
- */
- void clear();
-
- /**
- * Enables stencil test. When the stencil test is enabled the stencil buffer is not written
- * into. An increment threshold of zero causes the stencil to use a constant reference value
- * and GL_EQUAL for the test. A non-zero increment threshold causes the stencil to use that
- * value as the reference value and GL_EQUAL for the test.
- */
- void enableTest(int incrementThreshold);
-
- /**
- * Enables stencil write. When stencil write is enabled, the stencil
- * test always succeeds and the value 0x1 is written in the stencil
- * buffer for each fragment. An increment threshold of zero causes the stencil to use a constant
- * reference value and GL_EQUAL for the test. A non-zero increment threshold causes the stencil
- * to use that value as the reference value and GL_EQUAL for the test.
- */
- void enableWrite(int incrementThreshold);
-
- /**
- * The test passes only when equal to the specified value.
- */
- void enableDebugTest(GLint value, bool greater = false);
-
- /**
- * Used for debugging. The stencil test always passes and increments.
- */
- void enableDebugWrite();
-
- /**
- * Disables stencil test and write.
- */
- void disable();
-
- /**
- * Indicates whether either test or write is enabled.
- */
- bool isEnabled() { return mState != StencilState::Disabled; }
-
- /**
- * Indicates whether testing only is enabled.
- */
- bool isTestEnabled() { return mState == StencilState::Test; }
-
- bool isWriteEnabled() { return mState == StencilState::Write; }
-
- void dump();
-
-private:
- enum class StencilState { Disabled, Test, Write };
-
- void enable();
- StencilState mState = StencilState::Disabled;
-
-}; // class Stencil
-
-}; // namespace uirenderer
-}; // namespace android
-
-#endif // ANDROID_HWUI_STENCIL_H
diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp
index f510a2055309..bec80b1e6011 100644
--- a/libs/hwui/renderthread/CacheManager.cpp
+++ b/libs/hwui/renderthread/CacheManager.cpp
@@ -50,9 +50,7 @@ CacheManager::CacheManager(const DisplayInfo& display) : mMaxSurfaceArea(display
mVectorDrawableAtlas = new skiapipeline::VectorDrawableAtlas(
mMaxSurfaceArea / 2,
skiapipeline::VectorDrawableAtlas::StorageMode::disallowSharedSurface);
- if (Properties::isSkiaEnabled()) {
- skiapipeline::ShaderCache::get().initShaderDiskCache();
- }
+ skiapipeline::ShaderCache::get().initShaderDiskCache();
}
void CacheManager::reset(sk_sp<GrContext> context) {
@@ -136,6 +134,7 @@ void CacheManager::configureContext(GrContextOptions* contextOptions) {
}
contextOptions->fPersistentCache = &skiapipeline::ShaderCache::get();
+ contextOptions->fGpuPathRenderers &= ~GpuPathRenderers::kCoverageCounting;
}
void CacheManager::trimMemory(TrimMemoryMode mode) {
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index aed0620166dd..5d7252304bf2 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -22,22 +22,18 @@
#include "EglManager.h"
#include "Frame.h"
#include "LayerUpdateQueue.h"
-#include "OpenGLPipeline.h"
#include "Properties.h"
#include "RenderThread.h"
#include "hwui/Canvas.h"
#include "pipeline/skia/SkiaOpenGLPipeline.h"
#include "pipeline/skia/SkiaPipeline.h"
#include "pipeline/skia/SkiaVulkanPipeline.h"
-#include "protos/hwui.pb.h"
#include "renderstate/RenderState.h"
-#include "renderstate/Stencil.h"
#include "utils/GLUtils.h"
#include "utils/TimeUtils.h"
#include "../Properties.h"
#include <cutils/properties.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
#include <private/hwui/DrawGlInfo.h>
#include <strings.h>
@@ -51,8 +47,6 @@
#define TRIM_MEMORY_COMPLETE 80
#define TRIM_MEMORY_UI_HIDDEN 20
-#define ENABLE_RENDERNODE_SERIALIZATION false
-
#define LOG_FRAMETIME_MMA 0
#if LOG_FRAMETIME_MMA
@@ -70,9 +64,6 @@ CanvasContext* CanvasContext::create(RenderThread& thread, bool translucent,
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL:
- return new CanvasContext(thread, translucent, rootRenderNode, contextFactory,
- std::make_unique<OpenGLPipeline>(thread));
case RenderPipelineType::SkiaGL:
return new CanvasContext(thread, translucent, rootRenderNode, contextFactory,
std::make_unique<skiapipeline::SkiaOpenGLPipeline>(thread));
@@ -87,28 +78,13 @@ CanvasContext* CanvasContext::create(RenderThread& thread, bool translucent,
}
void CanvasContext::destroyLayer(RenderNode* node) {
- auto renderType = Properties::getRenderPipelineType();
- switch (renderType) {
- case RenderPipelineType::OpenGL:
- OpenGLPipeline::destroyLayer(node);
- break;
- case RenderPipelineType::SkiaGL:
- case RenderPipelineType::SkiaVulkan:
- skiapipeline::SkiaPipeline::destroyLayer(node);
- break;
- default:
- LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType);
- break;
- }
+ skiapipeline::SkiaPipeline::destroyLayer(node);
}
void CanvasContext::invokeFunctor(const RenderThread& thread, Functor* functor) {
ATRACE_CALL();
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL:
- OpenGLPipeline::invokeFunctor(thread, functor);
- break;
case RenderPipelineType::SkiaGL:
skiapipeline::SkiaOpenGLPipeline::invokeFunctor(thread, functor);
break;
@@ -122,19 +98,7 @@ void CanvasContext::invokeFunctor(const RenderThread& thread, Functor* functor)
}
void CanvasContext::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
- auto renderType = Properties::getRenderPipelineType();
- switch (renderType) {
- case RenderPipelineType::OpenGL:
- OpenGLPipeline::prepareToDraw(thread, bitmap);
- break;
- case RenderPipelineType::SkiaGL:
- case RenderPipelineType::SkiaVulkan:
- skiapipeline::SkiaPipeline::prepareToDraw(thread, bitmap);
- break;
- default:
- LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType);
- break;
- }
+ skiapipeline::SkiaPipeline::prepareToDraw(thread, bitmap);
}
CanvasContext::CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode,
@@ -290,7 +254,7 @@ bool CanvasContext::isSwapChainStuffed() {
// If there's a multi-frameInterval gap we effectively already dropped a frame,
// so consider the queue healthy.
- if (swapA.swapCompletedTime - swapB.swapCompletedTime > frameInterval * 3) {
+ if (std::abs(swapA.swapCompletedTime - swapB.swapCompletedTime) > frameInterval * 3) {
return false;
}
@@ -622,37 +586,15 @@ void CanvasContext::destroyHardwareResources() {
}
void CanvasContext::trimMemory(RenderThread& thread, int level) {
- auto renderType = Properties::getRenderPipelineType();
- switch (renderType) {
- case RenderPipelineType::OpenGL: {
- // No context means nothing to free
- if (!thread.eglManager().hasEglContext()) return;
- ATRACE_CALL();
- if (level >= TRIM_MEMORY_COMPLETE) {
- thread.renderState().flush(Caches::FlushMode::Full);
- thread.eglManager().destroy();
- } else if (level >= TRIM_MEMORY_UI_HIDDEN) {
- thread.renderState().flush(Caches::FlushMode::Moderate);
- }
- break;
- }
- case RenderPipelineType::SkiaGL:
- case RenderPipelineType::SkiaVulkan: {
- // No context means nothing to free
- if (!thread.getGrContext()) return;
- ATRACE_CALL();
- if (level >= TRIM_MEMORY_COMPLETE) {
- thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::Complete);
- thread.eglManager().destroy();
- thread.vulkanManager().destroy();
- } else if (level >= TRIM_MEMORY_UI_HIDDEN) {
- thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::UiHidden);
- }
- break;
- }
- default:
- LOG_ALWAYS_FATAL("canvas context type %d not supported", (int32_t)renderType);
- break;
+ ATRACE_CALL();
+ if (!thread.getGrContext()) return;
+ ATRACE_CALL();
+ if (level >= TRIM_MEMORY_COMPLETE) {
+ thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::Complete);
+ thread.destroyGlContext();
+ thread.vulkanManager().destroy();
+ } else if (level >= TRIM_MEMORY_UI_HIDDEN) {
+ thread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::UiHidden);
}
}
@@ -673,39 +615,6 @@ void CanvasContext::setName(const std::string&& name) {
mJankTracker.setDescription(JankTrackerType::Window, std::move(name));
}
-void CanvasContext::serializeDisplayListTree() {
-#if ENABLE_RENDERNODE_SERIALIZATION
- using namespace google::protobuf::io;
- char package[128];
- // Check whether tracing is enabled for this process.
- FILE* file = fopen("/proc/self/cmdline", "r");
- if (file) {
- if (!fgets(package, 128, file)) {
- ALOGE("Error reading cmdline: %s (%d)", strerror(errno), errno);
- fclose(file);
- return;
- }
- fclose(file);
- } else {
- ALOGE("Error opening /proc/self/cmdline: %s (%d)", strerror(errno), errno);
- return;
- }
- char path[1024];
- snprintf(path, 1024, "/data/data/%s/cache/rendertree_dump", package);
- int fd = open(path, O_CREAT | O_WRONLY, S_IRWXU | S_IRGRP | S_IROTH);
- if (fd == -1) {
- ALOGD("Failed to open '%s'", path);
- return;
- }
- proto::RenderNode tree;
- // TODO: Streaming writes?
- mRootRenderNode->copyTo(&tree);
- std::string data = tree.SerializeAsString();
- write(fd, data.c_str(), data.length());
- close(fd);
-#endif
-}
-
void CanvasContext::waitOnFences() {
if (mFrameFences.size()) {
ATRACE_CALL();
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 1c4e02d7df70..8ca54af13baa 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -16,10 +16,8 @@
#pragma once
-#include "BakedOpDispatcher.h"
-#include "BakedOpRenderer.h"
#include "DamageAccumulator.h"
-#include "FrameBuilder.h"
+#include "Lighting.h"
#include "FrameInfo.h"
#include "FrameInfoVisualizer.h"
#include "FrameMetricsReporter.h"
@@ -155,8 +153,6 @@ public:
void setName(const std::string&& name);
- void serializeDisplayListTree();
-
void addRenderNode(RenderNode* node, bool placeFront);
void removeRenderNode(RenderNode* node);
@@ -240,8 +236,8 @@ private:
bool mOpaque;
bool mWideColorGamut = false;
- BakedOpRenderer::LightInfo mLightInfo;
- FrameBuilder::LightGeometry mLightGeometry = {{0, 0, 0}, 0};
+ LightInfo mLightInfo;
+ LightGeometry mLightGeometry = {{0, 0, 0}, 0};
bool mHaveNewSurface = false;
DamageAccumulator mDamageAccumulator;
diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h
index 2c46762fee5c..696cfaef3cd7 100644
--- a/libs/hwui/renderthread/DrawFrameTask.h
+++ b/libs/hwui/renderthread/DrawFrameTask.h
@@ -32,7 +32,6 @@ namespace android {
namespace uirenderer {
class DeferredLayerUpdater;
-class DisplayList;
class RenderNode;
namespace renderthread {
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 6e239e357cf6..cd21822df5b1 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -16,27 +16,19 @@
#include "EglManager.h"
-#include <string>
-
#include <cutils/properties.h>
#include <log/log.h>
+#include <utils/Trace.h>
#include "utils/StringUtils.h"
-#include "Caches.h"
#include "DeviceInfo.h"
#include "Frame.h"
#include "Properties.h"
-#include "RenderThread.h"
-#include "Texture.h"
-#include "renderstate/RenderState.h"
#include <EGL/eglext.h>
-#include <GrContextOptions.h>
-#include <gl/GrGLInterface.h>
-#ifdef HWUI_GLES_WRAP_ENABLED
-#include "debug/GlesDriver.h"
-#endif
+#include <string>
+#include <vector>
#define GLES_VERSION 2
@@ -83,17 +75,21 @@ static struct {
bool glColorSpace = false;
bool scRGB = false;
bool contextPriority = false;
+ bool surfacelessContext = false;
} EglExtensions;
-EglManager::EglManager(RenderThread& thread)
- : mRenderThread(thread)
- , mEglDisplay(EGL_NO_DISPLAY)
+EglManager::EglManager()
+ : mEglDisplay(EGL_NO_DISPLAY)
, mEglConfig(nullptr)
, mEglConfigWideGamut(nullptr)
, mEglContext(EGL_NO_CONTEXT)
, mPBufferSurface(EGL_NO_SURFACE)
, mCurrentSurface(EGL_NO_SURFACE) {}
+EglManager::~EglManager() {
+ destroy();
+}
+
void EglManager::initialize() {
if (hasEglContext()) return;
@@ -126,26 +122,8 @@ void EglManager::initialize() {
loadConfigs();
createContext();
createPBufferSurface();
- makeCurrent(mPBufferSurface);
+ makeCurrent(mPBufferSurface, nullptr, /* force */ true);
DeviceInfo::initialize();
- mRenderThread.renderState().onGLContextCreated();
-
- if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) {
-#ifdef HWUI_GLES_WRAP_ENABLED
- debug::GlesDriver* driver = debug::GlesDriver::get();
- sk_sp<const GrGLInterface> glInterface(driver->getSkiaInterface());
-#else
- sk_sp<const GrGLInterface> glInterface(GrGLCreateNativeInterface());
-#endif
- LOG_ALWAYS_FATAL_IF(!glInterface.get());
-
- GrContextOptions options;
- options.fDisableDistanceFieldPaths = true;
- mRenderThread.cacheManager().configureContext(&options);
- sk_sp<GrContext> grContext(GrContext::MakeGL(std::move(glInterface), options));
- LOG_ALWAYS_FATAL_IF(!grContext.get());
- mRenderThread.setGrContext(grContext);
- }
}
void EglManager::initExtensions() {
@@ -170,6 +148,7 @@ void EglManager::initExtensions() {
EglExtensions.scRGB = extensions.has("EGL_EXT_gl_colorspace_scrgb");
#endif
EglExtensions.contextPriority = extensions.has("EGL_IMG_context_priority");
+ EglExtensions.surfacelessContext = extensions.has("EGL_KHR_surfaceless_context");
}
bool EglManager::hasEglContext() {
@@ -195,7 +174,7 @@ void EglManager::loadConfigs() {
EGL_CONFIG_CAVEAT,
EGL_NONE,
EGL_STENCIL_SIZE,
- Stencil::getStencilSize(),
+ STENCIL_BUFFER_SIZE,
EGL_SURFACE_TYPE,
EGL_WINDOW_BIT | swapBehavior,
EGL_NONE};
@@ -232,7 +211,7 @@ void EglManager::loadConfigs() {
EGL_DEPTH_SIZE,
0,
EGL_STENCIL_SIZE,
- Stencil::getStencilSize(),
+ STENCIL_BUFFER_SIZE,
EGL_SURFACE_TYPE,
EGL_WINDOW_BIT | swapBehavior,
EGL_NONE};
@@ -269,14 +248,14 @@ void EglManager::createPBufferSurface() {
LOG_ALWAYS_FATAL_IF(mEglDisplay == EGL_NO_DISPLAY,
"usePBufferSurface() called on uninitialized GlobalContext!");
- if (mPBufferSurface == EGL_NO_SURFACE) {
+ if (mPBufferSurface == EGL_NO_SURFACE && !EglExtensions.surfacelessContext) {
EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE};
mPBufferSurface = eglCreatePbufferSurface(mEglDisplay, mEglConfig, attribs);
}
}
EGLSurface EglManager::createSurface(EGLNativeWindowType window, bool wideColorGamut) {
- initialize();
+ LOG_ALWAYS_FATAL_IF(!hasEglContext(), "Not initialized");
wideColorGamut = wideColorGamut && EglExtensions.glColorSpace && EglExtensions.scRGB &&
EglExtensions.pixelFormatFloat && EglExtensions.noConfigContext;
@@ -350,10 +329,10 @@ void EglManager::destroySurface(EGLSurface surface) {
void EglManager::destroy() {
if (mEglDisplay == EGL_NO_DISPLAY) return;
- mRenderThread.setGrContext(nullptr);
- mRenderThread.renderState().onGLContextDestroyed();
eglDestroyContext(mEglDisplay, mEglContext);
- eglDestroySurface(mEglDisplay, mPBufferSurface);
+ if (mPBufferSurface != EGL_NO_SURFACE) {
+ eglDestroySurface(mEglDisplay, mPBufferSurface);
+ }
eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglTerminate(mEglDisplay);
eglReleaseThread();
@@ -364,8 +343,8 @@ void EglManager::destroy() {
mCurrentSurface = EGL_NO_SURFACE;
}
-bool EglManager::makeCurrent(EGLSurface surface, EGLint* errOut) {
- if (isCurrent(surface)) return false;
+bool EglManager::makeCurrent(EGLSurface surface, EGLint* errOut, bool force) {
+ if (!force && isCurrent(surface)) return false;
if (surface == EGL_NO_SURFACE) {
// Ensure we always have a valid surface & context
diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h
index ef9effbf9953..8e8bb8b68a1c 100644
--- a/libs/hwui/renderthread/EglManager.h
+++ b/libs/hwui/renderthread/EglManager.h
@@ -33,8 +33,12 @@ class RenderThread;
// and EGLConfig, which are re-used by CanvasContext
class EglManager {
public:
+ explicit EglManager();
+
+ ~EglManager();
+
static const char* eglErrorString();
- // Returns true on success, false on failure
+
void initialize();
bool hasEglContext();
@@ -46,7 +50,7 @@ public:
bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; }
// Returns true if the current surface changed, false if it was already current
- bool makeCurrent(EGLSurface surface, EGLint* errOut = nullptr);
+ bool makeCurrent(EGLSurface surface, EGLint* errOut = nullptr, bool force = false);
Frame beginFrame(EGLSurface surface);
void damageFrame(const Frame& frame, const SkRect& dirty);
// If this returns true it is mandatory that swapBuffers is called
@@ -60,11 +64,9 @@ public:
void fence();
+ EGLDisplay eglDisplay() const { return mEglDisplay; }
+
private:
- friend class RenderThread;
- explicit EglManager(RenderThread& thread);
- // EglContext is never destroyed, method is purposely not implemented
- ~EglManager();
void initExtensions();
void createPBufferSurface();
@@ -72,8 +74,6 @@ private:
void createContext();
EGLint queryBufferAge(EGLSurface surface);
- RenderThread& mRenderThread;
-
EGLDisplay mEglDisplay;
EGLConfig mEglConfig;
EGLConfig mEglConfigWideGamut;
diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h
index b1de49733c09..b94a7588a507 100644
--- a/libs/hwui/renderthread/IRenderPipeline.h
+++ b/libs/hwui/renderthread/IRenderPipeline.h
@@ -17,7 +17,10 @@
#pragma once
#include "FrameInfoVisualizer.h"
+#include "LayerUpdateQueue.h"
#include "SwapBehavior.h"
+#include "hwui/Bitmap.h"
+#include "thread/TaskManager.h"
#include <SkRect.h>
#include <utils/RefBase.h>
@@ -50,9 +53,9 @@ public:
virtual MakeCurrentResult makeCurrent() = 0;
virtual Frame getFrame() = 0;
virtual bool draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
- const FrameBuilder::LightGeometry& lightGeometry,
+ const LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, const Rect& contentDrawBounds,
- bool opaque, bool wideColorGamut, const BakedOpRenderer::LightInfo& lightInfo,
+ bool opaque, bool wideColorGamut, const LightInfo& lightInfo,
const std::vector<sp<RenderNode>>& renderNodes,
FrameInfoVisualizer* profiler) = 0;
virtual bool swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty,
@@ -64,9 +67,9 @@ public:
virtual bool isSurfaceReady() = 0;
virtual bool isContextReady() = 0;
virtual void onDestroyHardwareResources() = 0;
- virtual void renderLayers(const FrameBuilder::LightGeometry& lightGeometry,
+ virtual void renderLayers(const LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo) = 0;
+ const LightInfo& lightInfo) = 0;
virtual TaskManager* getTaskManager() = 0;
virtual bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
bool wideColorGamut, ErrorHandler* errorHandler) = 0;
diff --git a/libs/hwui/renderthread/OpenGLPipeline.cpp b/libs/hwui/renderthread/OpenGLPipeline.cpp
deleted file mode 100644
index f96001ebdd57..000000000000
--- a/libs/hwui/renderthread/OpenGLPipeline.cpp
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "OpenGLPipeline.h"
-
-#include "DeferredLayerUpdater.h"
-#include "EglManager.h"
-#include "Frame.h"
-#include "GlLayer.h"
-#include "OpenGLReadback.h"
-#include "ProfileRenderer.h"
-#include "renderstate/RenderState.h"
-#include "TreeInfo.h"
-
-#include <cutils/properties.h>
-#include <strings.h>
-
-namespace android {
-namespace uirenderer {
-namespace renderthread {
-
-OpenGLPipeline::OpenGLPipeline(RenderThread& thread)
- : mEglManager(thread.eglManager()), mRenderThread(thread) {}
-
-MakeCurrentResult OpenGLPipeline::makeCurrent() {
- // TODO: Figure out why this workaround is needed, see b/13913604
- // In the meantime this matches the behavior of GLRenderer, so it is not a regression
- EGLint error = 0;
- bool haveNewSurface = mEglManager.makeCurrent(mEglSurface, &error);
-
- Caches::getInstance().textureCache.resetMarkInUse(this);
- if (!haveNewSurface) {
- return MakeCurrentResult::AlreadyCurrent;
- }
- return error ? MakeCurrentResult::Failed : MakeCurrentResult::Succeeded;
-}
-
-Frame OpenGLPipeline::getFrame() {
- LOG_ALWAYS_FATAL_IF(mEglSurface == EGL_NO_SURFACE,
- "drawRenderNode called on a context with no surface!");
- return mEglManager.beginFrame(mEglSurface);
-}
-
-bool OpenGLPipeline::draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
- const FrameBuilder::LightGeometry& lightGeometry,
- LayerUpdateQueue* layerUpdateQueue, const Rect& contentDrawBounds,
- bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo,
- const std::vector<sp<RenderNode>>& renderNodes,
- FrameInfoVisualizer* profiler) {
- mEglManager.damageFrame(frame, dirty);
-
- bool drew = false;
-
- auto& caches = Caches::getInstance();
- FrameBuilder frameBuilder(dirty, frame.width(), frame.height(), lightGeometry, caches);
-
- frameBuilder.deferLayers(*layerUpdateQueue);
- layerUpdateQueue->clear();
-
- frameBuilder.deferRenderNodeScene(renderNodes, contentDrawBounds);
-
- BakedOpRenderer renderer(caches, mRenderThread.renderState(), opaque, wideColorGamut,
- lightInfo);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
- ProfileRenderer profileRenderer(renderer);
- profiler->draw(profileRenderer);
- drew = renderer.didDraw();
-
- // post frame cleanup
- caches.clearGarbage();
- caches.pathCache.trim();
- caches.tessellationCache.trim();
-
-#if DEBUG_MEMORY_USAGE
- caches.dumpMemoryUsage();
-#else
- if (CC_UNLIKELY(Properties::debugLevel & kDebugMemory)) {
- caches.dumpMemoryUsage();
- }
-#endif
-
- return drew;
-}
-
-bool OpenGLPipeline::swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty,
- FrameInfo* currentFrameInfo, bool* requireSwap) {
- GL_CHECKPOINT(LOW);
-
- // Even if we decided to cancel the frame, from the perspective of jank
- // metrics the frame was swapped at this point
- currentFrameInfo->markSwapBuffers();
-
- *requireSwap = drew || mEglManager.damageRequiresSwap();
-
- if (*requireSwap && (CC_UNLIKELY(!mEglManager.swapBuffers(frame, screenDirty)))) {
- return false;
- }
-
- return *requireSwap;
-}
-
-bool OpenGLPipeline::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) {
- ATRACE_CALL();
- // acquire most recent buffer for drawing
- layer->updateTexImage();
- layer->apply();
- return OpenGLReadbackImpl::copyLayerInto(mRenderThread,
- static_cast<GlLayer&>(*layer->backingLayer()), bitmap);
-}
-
-static Layer* createLayer(RenderState& renderState, uint32_t layerWidth, uint32_t layerHeight,
- sk_sp<SkColorFilter> colorFilter, int alpha, SkBlendMode mode,
- bool blend) {
- GlLayer* layer =
- new GlLayer(renderState, layerWidth, layerHeight, colorFilter, alpha, mode, blend);
- Caches::getInstance().textureState().activateTexture(0);
- layer->generateTexture();
- return layer;
-}
-
-DeferredLayerUpdater* OpenGLPipeline::createTextureLayer() {
- mEglManager.initialize();
- return new DeferredLayerUpdater(mRenderThread.renderState(), createLayer, Layer::Api::OpenGL);
-}
-
-void OpenGLPipeline::onStop() {
- if (mEglManager.isCurrent(mEglSurface)) {
- mEglManager.makeCurrent(EGL_NO_SURFACE);
- }
-}
-
-bool OpenGLPipeline::setSurface(Surface* surface, SwapBehavior swapBehavior, ColorMode colorMode) {
- if (mEglSurface != EGL_NO_SURFACE) {
- mEglManager.destroySurface(mEglSurface);
- mEglSurface = EGL_NO_SURFACE;
- }
-
- if (surface) {
- const bool wideColorGamut = colorMode == ColorMode::WideColorGamut;
- mEglSurface = mEglManager.createSurface(surface, wideColorGamut);
- }
-
- if (mEglSurface != EGL_NO_SURFACE) {
- const bool preserveBuffer = (swapBehavior != SwapBehavior::kSwap_discardBuffer);
- mBufferPreserved = mEglManager.setPreserveBuffer(mEglSurface, preserveBuffer);
- return true;
- }
-
- return false;
-}
-
-bool OpenGLPipeline::isSurfaceReady() {
- return CC_UNLIKELY(mEglSurface != EGL_NO_SURFACE);
-}
-
-bool OpenGLPipeline::isContextReady() {
- return CC_LIKELY(mEglManager.hasEglContext());
-}
-
-void OpenGLPipeline::onDestroyHardwareResources() {
- Caches& caches = Caches::getInstance();
- // Make sure to release all the textures we were owning as there won't
- // be another draw
- caches.textureCache.resetMarkInUse(this);
- mRenderThread.renderState().flush(Caches::FlushMode::Layers);
-}
-
-void OpenGLPipeline::renderLayers(const FrameBuilder::LightGeometry& lightGeometry,
- LayerUpdateQueue* layerUpdateQueue, bool opaque,
- bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo) {
- static const std::vector<sp<RenderNode>> emptyNodeList;
- auto& caches = Caches::getInstance();
- FrameBuilder frameBuilder(*layerUpdateQueue, lightGeometry, caches);
- layerUpdateQueue->clear();
- // TODO: Handle wide color gamut contexts
- BakedOpRenderer renderer(caches, mRenderThread.renderState(), opaque, wideColorGamut,
- lightInfo);
- LOG_ALWAYS_FATAL_IF(renderer.didDraw(), "shouldn't draw in buildlayer case");
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
-}
-
-TaskManager* OpenGLPipeline::getTaskManager() {
- return &Caches::getInstance().tasks;
-}
-
-static bool layerMatchesWH(OffscreenBuffer* layer, int width, int height) {
- return layer->viewportWidth == (uint32_t)width && layer->viewportHeight == (uint32_t)height;
-}
-
-bool OpenGLPipeline::createOrUpdateLayer(RenderNode* node,
- const DamageAccumulator& damageAccumulator,
- bool wideColorGamut,
- ErrorHandler* errorHandler) {
- RenderState& renderState = mRenderThread.renderState();
- OffscreenBufferPool& layerPool = renderState.layerPool();
- bool transformUpdateNeeded = false;
- if (node->getLayer() == nullptr) {
- node->setLayer(
- layerPool.get(renderState, node->getWidth(), node->getHeight(), wideColorGamut));
- transformUpdateNeeded = true;
- } else if (!layerMatchesWH(node->getLayer(), node->getWidth(), node->getHeight())) {
- // TODO: remove now irrelevant, currently enqueued damage (respecting damage ordering)
- // Or, ideally, maintain damage between frames on node/layer so ordering is always correct
- if (node->properties().fitsOnLayer()) {
- node->setLayer(layerPool.resize(node->getLayer(), node->getWidth(), node->getHeight()));
- } else {
- destroyLayer(node);
- }
- transformUpdateNeeded = true;
- }
-
- if (transformUpdateNeeded && node->getLayer()) {
- // update the transform in window of the layer to reset its origin wrt light source position
- Matrix4 windowTransform;
- damageAccumulator.computeCurrentTransform(&windowTransform);
- node->getLayer()->setWindowTransform(windowTransform);
- }
-
- if (!node->hasLayer()) {
- Caches::getInstance().dumpMemoryUsage();
- if (errorHandler) {
- std::ostringstream err;
- err << "Unable to create layer for " << node->getName();
- const int maxTextureSize = Caches::getInstance().maxTextureSize;
- if (node->getWidth() > maxTextureSize || node->getHeight() > maxTextureSize) {
- err << ", size " << node->getWidth() << "x" << node->getHeight()
- << " exceeds max size " << maxTextureSize;
- } else {
- err << ", see logcat for more info";
- }
- errorHandler->onError(err.str());
- }
- }
-
- return transformUpdateNeeded;
-}
-
-bool OpenGLPipeline::pinImages(LsaVector<sk_sp<Bitmap>>& images) {
- TextureCache& cache = Caches::getInstance().textureCache;
- bool prefetchSucceeded = true;
- for (auto& bitmapResource : images) {
- prefetchSucceeded &= cache.prefetchAndMarkInUse(this, bitmapResource.get());
- }
- return prefetchSucceeded;
-}
-
-void OpenGLPipeline::unpinImages() {
- Caches::getInstance().textureCache.resetMarkInUse(this);
-}
-
-void OpenGLPipeline::destroyLayer(RenderNode* node) {
- if (OffscreenBuffer* layer = node->getLayer()) {
- layer->renderState.layerPool().putOrDelete(layer);
- node->setLayer(nullptr);
- }
-}
-
-void OpenGLPipeline::prepareToDraw(const RenderThread& thread, Bitmap* bitmap) {
- if (Caches::hasInstance() && thread.eglManager().hasEglContext()) {
- ATRACE_NAME("Bitmap#prepareToDraw task");
- Caches::getInstance().textureCache.prefetch(bitmap);
- }
-}
-
-void OpenGLPipeline::invokeFunctor(const RenderThread& thread, Functor* functor) {
- DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext;
- if (thread.eglManager().hasEglContext()) {
- mode = DrawGlInfo::kModeProcess;
- }
- thread.renderState().invokeFunctor(functor, mode, nullptr);
-}
-
-#define FENCE_TIMEOUT 2000000000
-
-class AutoEglFence {
-public:
- AutoEglFence(EGLDisplay display) : mDisplay(display) {
- fence = eglCreateSyncKHR(mDisplay, EGL_SYNC_FENCE_KHR, NULL);
- }
-
- ~AutoEglFence() {
- if (fence != EGL_NO_SYNC_KHR) {
- eglDestroySyncKHR(mDisplay, fence);
- }
- }
-
- EGLSyncKHR fence = EGL_NO_SYNC_KHR;
-
-private:
- EGLDisplay mDisplay = EGL_NO_DISPLAY;
-};
-
-class AutoEglImage {
-public:
- AutoEglImage(EGLDisplay display, EGLClientBuffer clientBuffer) : mDisplay(display) {
- EGLint imageAttrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
- image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer,
- imageAttrs);
- }
-
- ~AutoEglImage() {
- if (image != EGL_NO_IMAGE_KHR) {
- eglDestroyImageKHR(mDisplay, image);
- }
- }
-
- EGLImageKHR image = EGL_NO_IMAGE_KHR;
-
-private:
- EGLDisplay mDisplay = EGL_NO_DISPLAY;
-};
-
-class AutoGlTexture {
-public:
- AutoGlTexture(uirenderer::Caches& caches) : mCaches(caches) {
- glGenTextures(1, &mTexture);
- caches.textureState().bindTexture(mTexture);
- }
-
- ~AutoGlTexture() { mCaches.textureState().deleteTexture(mTexture); }
-
-private:
- uirenderer::Caches& mCaches;
- GLuint mTexture = 0;
-};
-
-static bool uploadBitmapToGraphicBuffer(uirenderer::Caches& caches, SkBitmap& bitmap,
- GraphicBuffer& buffer, GLint format, GLint type) {
- EGLDisplay display = eglGetCurrentDisplay();
- LOG_ALWAYS_FATAL_IF(display == EGL_NO_DISPLAY, "Failed to get EGL_DEFAULT_DISPLAY! err=%s",
- uirenderer::renderthread::EglManager::eglErrorString());
- // We use an EGLImage to access the content of the GraphicBuffer
- // The EGL image is later bound to a 2D texture
- EGLClientBuffer clientBuffer = (EGLClientBuffer)buffer.getNativeBuffer();
- AutoEglImage autoImage(display, clientBuffer);
- if (autoImage.image == EGL_NO_IMAGE_KHR) {
- ALOGW("Could not create EGL image, err =%s",
- uirenderer::renderthread::EglManager::eglErrorString());
- return false;
- }
- AutoGlTexture glTexture(caches);
- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, autoImage.image);
-
- GL_CHECKPOINT(MODERATE);
-
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap.width(), bitmap.height(), format, type,
- bitmap.getPixels());
-
- GL_CHECKPOINT(MODERATE);
-
- // The fence is used to wait for the texture upload to finish
- // properly. We cannot rely on glFlush() and glFinish() as
- // some drivers completely ignore these API calls
- AutoEglFence autoFence(display);
- if (autoFence.fence == EGL_NO_SYNC_KHR) {
- LOG_ALWAYS_FATAL("Could not create sync fence %#x", eglGetError());
- return false;
- }
- // The flag EGL_SYNC_FLUSH_COMMANDS_BIT_KHR will trigger a
- // pipeline flush (similar to what a glFlush() would do.)
- EGLint waitStatus = eglClientWaitSyncKHR(display, autoFence.fence,
- EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, FENCE_TIMEOUT);
- if (waitStatus != EGL_CONDITION_SATISFIED_KHR) {
- LOG_ALWAYS_FATAL("Failed to wait for the fence %#x", eglGetError());
- return false;
- }
- return true;
-}
-
-// TODO: handle SRGB sanely
-static PixelFormat internalFormatToPixelFormat(GLint internalFormat) {
- switch (internalFormat) {
- case GL_LUMINANCE:
- return PIXEL_FORMAT_RGBA_8888;
- case GL_SRGB8_ALPHA8:
- return PIXEL_FORMAT_RGBA_8888;
- case GL_RGBA:
- return PIXEL_FORMAT_RGBA_8888;
- case GL_RGB:
- return PIXEL_FORMAT_RGB_565;
- case GL_RGBA16F:
- return PIXEL_FORMAT_RGBA_FP16;
- default:
- LOG_ALWAYS_FATAL("Unsupported bitmap colorType: %d", internalFormat);
- return PIXEL_FORMAT_UNKNOWN;
- }
-}
-
-sk_sp<Bitmap> OpenGLPipeline::allocateHardwareBitmap(RenderThread& renderThread,
- SkBitmap& skBitmap) {
- renderThread.eglManager().initialize();
- uirenderer::Caches& caches = uirenderer::Caches::getInstance();
-
- const SkImageInfo& info = skBitmap.info();
- if (info.colorType() == kUnknown_SkColorType || info.colorType() == kAlpha_8_SkColorType) {
- ALOGW("unable to create hardware bitmap of colortype: %d", info.colorType());
- return nullptr;
- }
-
- bool needSRGB = uirenderer::transferFunctionCloseToSRGB(skBitmap.info().colorSpace());
- bool hasLinearBlending = caches.extensions().hasLinearBlending();
- GLint format, type, internalFormat;
- uirenderer::Texture::colorTypeToGlFormatAndType(caches, skBitmap.colorType(),
- needSRGB && hasLinearBlending, &internalFormat,
- &format, &type);
-
- PixelFormat pixelFormat = internalFormatToPixelFormat(internalFormat);
- sp<GraphicBuffer> buffer = new GraphicBuffer(
- info.width(), info.height(), pixelFormat,
- GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_SW_WRITE_NEVER |
- GraphicBuffer::USAGE_SW_READ_NEVER,
- std::string("Bitmap::allocateHardwareBitmap pid [") + std::to_string(getpid()) + "]");
-
- status_t error = buffer->initCheck();
- if (error < 0) {
- ALOGW("createGraphicBuffer() failed in GraphicBuffer.create()");
- return nullptr;
- }
-
- SkBitmap bitmap;
- if (CC_UNLIKELY(
- uirenderer::Texture::hasUnsupportedColorType(skBitmap.info(), hasLinearBlending))) {
- sk_sp<SkColorSpace> sRGB = SkColorSpace::MakeSRGB();
- bitmap = uirenderer::Texture::uploadToN32(skBitmap, hasLinearBlending, std::move(sRGB));
- } else {
- bitmap = skBitmap;
- }
-
- if (!uploadBitmapToGraphicBuffer(caches, bitmap, *buffer, format, type)) {
- return nullptr;
- }
- return sk_sp<Bitmap>(new Bitmap(buffer.get(), bitmap.info()));
-}
-
-} /* namespace renderthread */
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/renderthread/OpenGLPipeline.h b/libs/hwui/renderthread/OpenGLPipeline.h
deleted file mode 100644
index 9859e931fd85..000000000000
--- a/libs/hwui/renderthread/OpenGLPipeline.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "BakedOpDispatcher.h"
-#include "BakedOpRenderer.h"
-#include "CanvasContext.h"
-#include "FrameBuilder.h"
-#include "IRenderPipeline.h"
-
-namespace android {
-namespace uirenderer {
-namespace renderthread {
-
-class OpenGLPipeline : public IRenderPipeline {
-public:
- OpenGLPipeline(RenderThread& thread);
- virtual ~OpenGLPipeline() {}
-
- MakeCurrentResult makeCurrent() override;
- Frame getFrame() override;
- bool draw(const Frame& frame, const SkRect& screenDirty, const SkRect& dirty,
- const FrameBuilder::LightGeometry& lightGeometry, LayerUpdateQueue* layerUpdateQueue,
- const Rect& contentDrawBounds, bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo,
- const std::vector<sp<RenderNode>>& renderNodes,
- FrameInfoVisualizer* profiler) override;
- bool swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty,
- FrameInfo* currentFrameInfo, bool* requireSwap) override;
- bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) override;
- DeferredLayerUpdater* createTextureLayer() override;
- bool setSurface(Surface* window, SwapBehavior swapBehavior, ColorMode colorMode) override;
- void onStop() override;
- bool isSurfaceReady() override;
- bool isContextReady() override;
- void onDestroyHardwareResources() override;
- void renderLayers(const FrameBuilder::LightGeometry& lightGeometry,
- LayerUpdateQueue* layerUpdateQueue, bool opaque, bool wideColorGamut,
- const BakedOpRenderer::LightInfo& lightInfo) override;
- TaskManager* getTaskManager() override;
- bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
- bool wideColorGamut, ErrorHandler* errorHandler) override;
- bool pinImages(std::vector<SkImage*>& mutableImages) override { return false; }
- bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override;
- void unpinImages() override;
- void onPrepareTree() override {}
- static void destroyLayer(RenderNode* node);
- static void prepareToDraw(const RenderThread& thread, Bitmap* bitmap);
- static void invokeFunctor(const RenderThread& thread, Functor* functor);
- static sk_sp<Bitmap> allocateHardwareBitmap(RenderThread& thread, SkBitmap& skBitmap);
-
-private:
- EglManager& mEglManager;
- EGLSurface mEglSurface = EGL_NO_SURFACE;
- bool mBufferPreserved = false;
- RenderThread& mRenderThread;
-};
-
-} /* namespace renderthread */
-} /* namespace uirenderer */
-} /* namespace android */
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index 59048be768e9..6eca8d2f346f 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -21,6 +21,7 @@
#include "Properties.h"
#include "Readback.h"
#include "Rect.h"
+#include "pipeline/skia/SkiaOpenGLPipeline.h"
#include "pipeline/skia/VectorDrawableAtlas.h"
#include "renderstate/RenderState.h"
#include "renderthread/CanvasContext.h"
@@ -65,10 +66,7 @@ void RenderProxy::setSwapBehavior(SwapBehavior swapBehavior) {
bool RenderProxy::loadSystemProperties() {
return mRenderThread.queue().runSync([this]() -> bool {
- bool needsRedraw = false;
- if (Caches::hasInstance()) {
- needsRedraw = Properties::load();
- }
+ bool needsRedraw = Properties::load();
if (mContext->profiler().consumeProperties()) {
needsRedraw = true;
}
@@ -195,8 +193,11 @@ void RenderProxy::fence() {
mRenderThread.queue().runSync([]() {});
}
-void RenderProxy::staticFence() {
- RenderThread::getInstance().queue().runSync([]() {});
+int RenderProxy::maxTextureSize() {
+ static int maxTextureSize = RenderThread::getInstance().queue().runSync([]() {
+ return DeviceInfo::get()->maxTextureSize();
+ });
+ return maxTextureSize;
}
void RenderProxy::stopDrawing() {
@@ -278,10 +279,6 @@ void RenderProxy::setFrameCompleteCallback(std::function<void(int64_t)>&& callba
mDrawFrameTask.setFrameCompleteCallback(std::move(callback));
}
-void RenderProxy::serializeDisplayListTree() {
- mRenderThread.queue().post([=]() { mContext->serializeDisplayListTree(); });
-}
-
void RenderProxy::addFrameMetricsObserver(FrameMetricsObserver* observerPtr) {
mRenderThread.queue().post([ this, observer = sp{observerPtr} ]() {
mContext->addFrameMetricsObserver(observer.get());
@@ -329,14 +326,9 @@ void RenderProxy::prepareToDraw(Bitmap& bitmap) {
}
}
-sk_sp<Bitmap> RenderProxy::allocateHardwareBitmap(SkBitmap& bitmap) {
- auto& thread = RenderThread::getInstance();
- return thread.queue().runSync([&]() -> auto { return thread.allocateHardwareBitmap(bitmap); });
-}
-
int RenderProxy::copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap) {
RenderThread& thread = RenderThread::getInstance();
- if (Properties::isSkiaEnabled() && gettid() == thread.getTid()) {
+ if (gettid() == thread.getTid()) {
// TODO: fix everything that hits this. We should never be triggering a readback ourselves.
return (int)thread.readback().copyGraphicBufferInto(buffer, bitmap);
} else {
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index ad534f0d96b5..5668484673fb 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -95,7 +95,7 @@ public:
ANDROID_API static void overrideProperty(const char* name, const char* value);
ANDROID_API void fence();
- ANDROID_API static void staticFence();
+ ANDROID_API static int maxTextureSize();
ANDROID_API void stopDrawing();
ANDROID_API void notifyFramePending();
@@ -109,8 +109,6 @@ public:
ANDROID_API static void setProcessStatsBuffer(int fd);
ANDROID_API int getRenderThreadTid();
- ANDROID_API void serializeDisplayListTree();
-
ANDROID_API void addRenderNode(RenderNode* node, bool placeFront);
ANDROID_API void removeRenderNode(RenderNode* node);
ANDROID_API void drawRenderNode(RenderNode* node);
@@ -126,8 +124,6 @@ public:
int bottom, SkBitmap* bitmap);
ANDROID_API static void prepareToDraw(Bitmap& bitmap);
- static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap);
-
static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap);
static void onBitmapDestroyed(uint32_t pixelRefId);
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index 6a2a025da121..3eaf43b65f69 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -19,19 +19,24 @@
#include "CanvasContext.h"
#include "DeviceInfo.h"
#include "EglManager.h"
-#include "OpenGLReadback.h"
#include "RenderProxy.h"
#include "VulkanManager.h"
#include "hwui/Bitmap.h"
#include "pipeline/skia/SkiaOpenGLPipeline.h"
#include "pipeline/skia/SkiaOpenGLReadback.h"
-#include "pipeline/skia/SkiaVulkanReadback.h"
#include "pipeline/skia/SkiaVulkanPipeline.h"
+#include "pipeline/skia/SkiaVulkanReadback.h"
#include "renderstate/RenderState.h"
-#include "renderthread/OpenGLPipeline.h"
#include "utils/FatVector.h"
#include "utils/TimeUtils.h"
+#ifdef HWUI_GLES_WRAP_ENABLED
+#include "debug/GlesDriver.h"
+#endif
+
+#include <GrContextOptions.h>
+#include <gl/GrGLInterface.h>
+
#include <gui/DisplayEventReceiver.h>
#include <sys/resource.h>
#include <utils/Condition.h>
@@ -93,14 +98,11 @@ public:
DummyVsyncSource(RenderThread* renderThread) : mRenderThread(renderThread) {}
virtual void requestNextVsync() override {
- mRenderThread->queue().postDelayed(16_ms, [this]() {
- mRenderThread->drainDisplayEventQueue();
- });
+ mRenderThread->queue().postDelayed(16_ms,
+ [this]() { mRenderThread->drainDisplayEventQueue(); });
}
- virtual nsecs_t latestVsyncEvent() override {
- return systemTime(CLOCK_MONOTONIC);
- }
+ virtual nsecs_t latestVsyncEvent() override { return systemTime(CLOCK_MONOTONIC); }
private:
RenderThread* mRenderThread;
@@ -147,13 +149,13 @@ void RenderThread::initializeDisplayEventReceiver() {
auto receiver = std::make_unique<DisplayEventReceiver>();
status_t status = receiver->initCheck();
LOG_ALWAYS_FATAL_IF(status != NO_ERROR,
- "Initialization of DisplayEventReceiver "
- "failed with status: %d",
- status);
+ "Initialization of DisplayEventReceiver "
+ "failed with status: %d",
+ status);
// Register the FD
mLooper->addFd(receiver->getFd(), 0, Looper::EVENT_INPUT,
- RenderThread::displayEventReceiverCallback, this);
+ RenderThread::displayEventReceiverCallback, this);
mVsyncSource = new DisplayEventReceiverWrapper(std::move(receiver));
} else {
mVsyncSource = new DummyVsyncSource(this);
@@ -165,12 +167,43 @@ void RenderThread::initThreadLocals() {
nsecs_t frameIntervalNanos = static_cast<nsecs_t>(1000000000 / mDisplayInfo.fps);
mTimeLord.setFrameInterval(frameIntervalNanos);
initializeDisplayEventReceiver();
- mEglManager = new EglManager(*this);
+ mEglManager = new EglManager();
mRenderState = new RenderState(*this);
mVkManager = new VulkanManager(*this);
mCacheManager = new CacheManager(mDisplayInfo);
}
+void RenderThread::requireGlContext() {
+ if (mEglManager->hasEglContext()) {
+ return;
+ }
+ mEglManager->initialize();
+ renderState().onGLContextCreated();
+
+#ifdef HWUI_GLES_WRAP_ENABLED
+ debug::GlesDriver* driver = debug::GlesDriver::get();
+ sk_sp<const GrGLInterface> glInterface(driver->getSkiaInterface());
+#else
+ sk_sp<const GrGLInterface> glInterface(GrGLCreateNativeInterface());
+#endif
+ LOG_ALWAYS_FATAL_IF(!glInterface.get());
+
+ GrContextOptions options;
+ options.fDisableDistanceFieldPaths = true;
+ cacheManager().configureContext(&options);
+ sk_sp<GrContext> grContext(GrContext::MakeGL(std::move(glInterface), options));
+ LOG_ALWAYS_FATAL_IF(!grContext.get());
+ setGrContext(grContext);
+}
+
+void RenderThread::destroyGlContext() {
+ if (mEglManager->hasEglContext()) {
+ setGrContext(nullptr);
+ renderState().onGLContextDestroyed();
+ mEglManager->destroy();
+ }
+}
+
void RenderThread::dumpGraphicsMemory(int fd) {
globalProfileData()->dump(fd);
@@ -178,16 +211,6 @@ void RenderThread::dumpGraphicsMemory(int fd) {
String8 pipeline;
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL: {
- if (Caches::hasInstance()) {
- cachesOutput.appendFormat("Caches:\n");
- Caches::getInstance().dumpMemoryUsage(cachesOutput);
- } else {
- cachesOutput.appendFormat("No caches instance.");
- }
- pipeline.appendFormat("FrameBuilder");
- break;
- }
case RenderPipelineType::SkiaGL: {
mCacheManager->dumpMemoryUsage(cachesOutput, mRenderState);
pipeline.appendFormat("Skia (OpenGL)");
@@ -211,9 +234,6 @@ Readback& RenderThread::readback() {
if (!mReadback) {
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL:
- mReadback = new OpenGLReadbackImpl(*this);
- break;
case RenderPipelineType::SkiaGL:
mReadback = new skiapipeline::SkiaOpenGLReadback(*this);
break;
@@ -347,10 +367,6 @@ void RenderThread::pushBackFrameCallback(IFrameCallback* callback) {
sk_sp<Bitmap> RenderThread::allocateHardwareBitmap(SkBitmap& skBitmap) {
auto renderType = Properties::getRenderPipelineType();
switch (renderType) {
- case RenderPipelineType::OpenGL:
- return OpenGLPipeline::allocateHardwareBitmap(*this, skBitmap);
- case RenderPipelineType::SkiaGL:
- return skiapipeline::SkiaOpenGLPipeline::allocateHardwareBitmap(*this, skBitmap);
case RenderPipelineType::SkiaVulkan:
return skiapipeline::SkiaVulkanPipeline::allocateHardwareBitmap(*this, skBitmap);
default:
diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h
index 689f518bad1b..4a1fd9ee3d47 100644
--- a/libs/hwui/renderthread/RenderThread.h
+++ b/libs/hwui/renderthread/RenderThread.h
@@ -103,6 +103,9 @@ public:
sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& skBitmap);
void dumpGraphicsMemory(int fd);
+ void requireGlContext();
+ void destroyGlContext();
+
/**
* isCurrent provides a way to query, if the caller is running on
* the render thread.
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 21c91a26745b..a19edae26cb3 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -31,44 +31,242 @@ namespace android {
namespace uirenderer {
namespace renderthread {
-#define GET_PROC(F) m##F = (PFN_vk##F)vkGetInstanceProcAddr(instance, "vk" #F)
-#define GET_DEV_PROC(F) m##F = (PFN_vk##F)vkGetDeviceProcAddr(device, "vk" #F)
+#define GET_PROC(F) m##F = (PFN_vk##F)vkGetInstanceProcAddr(VK_NULL_HANDLE, "vk" #F)
+#define GET_INST_PROC(F) m##F = (PFN_vk##F)vkGetInstanceProcAddr(mInstance, "vk" #F)
+#define GET_DEV_PROC(F) m##F = (PFN_vk##F)vkGetDeviceProcAddr(mDevice, "vk" #F)
VulkanManager::VulkanManager(RenderThread& thread) : mRenderThread(thread) {}
void VulkanManager::destroy() {
- if (!hasVkContext()) return;
-
mRenderThread.renderState().onVkContextDestroyed();
mRenderThread.setGrContext(nullptr);
if (VK_NULL_HANDLE != mCommandPool) {
- mDestroyCommandPool(mBackendContext->fDevice, mCommandPool, nullptr);
+ mDestroyCommandPool(mDevice, mCommandPool, nullptr);
mCommandPool = VK_NULL_HANDLE;
}
- mBackendContext.reset();
+
+ if (mDevice != VK_NULL_HANDLE) {
+ mDeviceWaitIdle(mDevice);
+ mDestroyDevice(mDevice, nullptr);
+ }
+
+ if (mInstance != VK_NULL_HANDLE) {
+ mDestroyInstance(mInstance, nullptr);
+ }
+
+ mGraphicsQueue = VK_NULL_HANDLE;
+ mPresentQueue = VK_NULL_HANDLE;
+ mDevice = VK_NULL_HANDLE;
+ mPhysicalDevice = VK_NULL_HANDLE;
+ mInstance = VK_NULL_HANDLE;
}
-void VulkanManager::initialize() {
- if (hasVkContext()) {
- return;
+bool VulkanManager::setupDevice(VkPhysicalDeviceFeatures& deviceFeatures) {
+ VkResult err;
+
+ constexpr VkApplicationInfo app_info = {
+ VK_STRUCTURE_TYPE_APPLICATION_INFO, // sType
+ nullptr, // pNext
+ "android framework", // pApplicationName
+ 0, // applicationVersion
+ "android framework", // pEngineName
+ 0, // engineVerison
+ VK_MAKE_VERSION(1, 0, 0), // apiVersion
+ };
+
+ std::vector<const char*> instanceExtensions;
+ {
+ GET_PROC(EnumerateInstanceExtensionProperties);
+
+ uint32_t extensionCount = 0;
+ err = mEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
+ if (VK_SUCCESS != err) {
+ return false;
+ }
+ std::unique_ptr<VkExtensionProperties[]> extensions(
+ new VkExtensionProperties[extensionCount]);
+ err = mEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.get());
+ if (VK_SUCCESS != err) {
+ return false;
+ }
+ bool hasKHRSurfaceExtension = false;
+ bool hasKHRAndroidSurfaceExtension = false;
+ for (uint32_t i = 0; i < extensionCount; ++i) {
+ instanceExtensions.push_back(extensions[i].extensionName);
+ if (!strcmp(extensions[i].extensionName, VK_KHR_SURFACE_EXTENSION_NAME)) {
+ hasKHRSurfaceExtension = true;
+ }
+ if (!strcmp(extensions[i].extensionName,VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)) {
+ hasKHRAndroidSurfaceExtension = true;
+ }
+ }
+ if (!hasKHRSurfaceExtension || !hasKHRAndroidSurfaceExtension) {
+ this->destroy();
+ return false;
+ }
+ }
+
+ const VkInstanceCreateInfo instance_create = {
+ VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType
+ nullptr, // pNext
+ 0, // flags
+ &app_info, // pApplicationInfo
+ 0, // enabledLayerNameCount
+ nullptr, // ppEnabledLayerNames
+ (uint32_t) instanceExtensions.size(), // enabledExtensionNameCount
+ instanceExtensions.data(), // ppEnabledExtensionNames
+ };
+
+ GET_PROC(CreateInstance);
+ err = mCreateInstance(&instance_create, nullptr, &mInstance);
+ if (err < 0) {
+ this->destroy();
+ return false;
+ }
+
+ GET_INST_PROC(DestroyInstance);
+ GET_INST_PROC(EnumeratePhysicalDevices);
+ GET_INST_PROC(GetPhysicalDeviceQueueFamilyProperties);
+ GET_INST_PROC(GetPhysicalDeviceFeatures);
+ GET_INST_PROC(CreateDevice);
+ GET_INST_PROC(EnumerateDeviceExtensionProperties);
+ GET_INST_PROC(CreateAndroidSurfaceKHR);
+ GET_INST_PROC(DestroySurfaceKHR);
+ GET_INST_PROC(GetPhysicalDeviceSurfaceSupportKHR);
+ GET_INST_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
+ GET_INST_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
+ GET_INST_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
+
+ uint32_t gpuCount;
+ err = mEnumeratePhysicalDevices(mInstance, &gpuCount, nullptr);
+ if (err) {
+ this->destroy();
+ return false;
+ }
+ if (!gpuCount) {
+ this->destroy();
+ return false;
+ }
+ // Just returning the first physical device instead of getting the whole array. Since there
+ // should only be one device on android.
+ gpuCount = 1;
+ err = mEnumeratePhysicalDevices(mInstance, &gpuCount, &mPhysicalDevice);
+ // VK_INCOMPLETE is returned when the count we provide is less than the total device count.
+ if (err && VK_INCOMPLETE != err) {
+ this->destroy();
+ return false;
+ }
+
+ // query to get the initial queue props size
+ uint32_t queueCount;
+ mGetPhysicalDeviceQueueFamilyProperties(mPhysicalDevice, &queueCount, nullptr);
+ if (!queueCount) {
+ this->destroy();
+ return false;
+ }
+
+ // now get the actual queue props
+ std::unique_ptr<VkQueueFamilyProperties[]> queueProps(new VkQueueFamilyProperties[queueCount]);
+ mGetPhysicalDeviceQueueFamilyProperties(mPhysicalDevice, &queueCount, queueProps.get());
+
+ // iterate to find the graphics queue
+ mGraphicsQueueIndex = queueCount;
+ for (uint32_t i = 0; i < queueCount; i++) {
+ if (queueProps[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
+ mGraphicsQueueIndex = i;
+ break;
+ }
+ }
+ if (mGraphicsQueueIndex == queueCount) {
+ this->destroy();
+ return false;
}
- auto canPresent = [](VkInstance, VkPhysicalDevice, uint32_t) { return true; };
+ // All physical devices and queue families on Android must be capable of
+ // presentation with any native window. So just use the first one.
+ mPresentQueueIndex = 0;
- mBackendContext.reset(GrVkBackendContext::Create(vkGetInstanceProcAddr, vkGetDeviceProcAddr,
- &mPresentQueueIndex, canPresent));
- LOG_ALWAYS_FATAL_IF(!mBackendContext.get());
+ std::vector<const char*> deviceExtensions;
+ {
+ uint32_t extensionCount = 0;
+ err = mEnumerateDeviceExtensionProperties(mPhysicalDevice, nullptr, &extensionCount,
+ nullptr);
+ if (VK_SUCCESS != err) {
+ this->destroy();
+ return false;
+ }
+ std::unique_ptr<VkExtensionProperties[]> extensions(
+ new VkExtensionProperties[extensionCount]);
+ err = mEnumerateDeviceExtensionProperties(mPhysicalDevice, nullptr, &extensionCount,
+ extensions.get());
+ if (VK_SUCCESS != err) {
+ this->destroy();
+ return false;
+ }
+ bool hasKHRSwapchainExtension = false;
+ for (uint32_t i = 0; i < extensionCount; ++i) {
+ deviceExtensions.push_back(extensions[i].extensionName);
+ if (!strcmp(extensions[i].extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
+ hasKHRSwapchainExtension = true;
+ }
+ }
+ if (!hasKHRSwapchainExtension) {
+ this->destroy();
+ return false;
+ }
+ }
- // Get all the addresses of needed vulkan functions
- VkInstance instance = mBackendContext->fInstance;
- VkDevice device = mBackendContext->fDevice;
- GET_PROC(CreateAndroidSurfaceKHR);
- GET_PROC(DestroySurfaceKHR);
- GET_PROC(GetPhysicalDeviceSurfaceSupportKHR);
- GET_PROC(GetPhysicalDeviceSurfaceCapabilitiesKHR);
- GET_PROC(GetPhysicalDeviceSurfaceFormatsKHR);
- GET_PROC(GetPhysicalDeviceSurfacePresentModesKHR);
+ // query to get the physical device properties
+ mGetPhysicalDeviceFeatures(mPhysicalDevice, &deviceFeatures);
+ // this looks like it would slow things down,
+ // and we can't depend on it on all platforms
+ deviceFeatures.robustBufferAccess = VK_FALSE;
+
+ float queuePriorities[1] = { 0.0 };
+
+ const VkDeviceQueueCreateInfo queueInfo[2] = {
+ {
+ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
+ nullptr, // pNext
+ 0, // VkDeviceQueueCreateFlags
+ mGraphicsQueueIndex, // queueFamilyIndex
+ 1, // queueCount
+ queuePriorities, // pQueuePriorities
+ },
+ {
+ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType
+ nullptr, // pNext
+ 0, // VkDeviceQueueCreateFlags
+ mPresentQueueIndex, // queueFamilyIndex
+ 1, // queueCount
+ queuePriorities, // pQueuePriorities
+ }
+ };
+ uint32_t queueInfoCount = (mPresentQueueIndex != mGraphicsQueueIndex) ? 2 : 1;
+
+ const VkDeviceCreateInfo deviceInfo = {
+ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType
+ nullptr, // pNext
+ 0, // VkDeviceCreateFlags
+ queueInfoCount, // queueCreateInfoCount
+ queueInfo, // pQueueCreateInfos
+ 0, // layerCount
+ nullptr, // ppEnabledLayerNames
+ (uint32_t) deviceExtensions.size(), // extensionCount
+ deviceExtensions.data(), // ppEnabledExtensionNames
+ &deviceFeatures // ppEnabledFeatures
+ };
+
+ err = mCreateDevice(mPhysicalDevice, &deviceInfo, nullptr, &mDevice);
+ if (err) {
+ this->destroy();
+ return false;
+ }
+
+ GET_DEV_PROC(GetDeviceQueue);
+ GET_DEV_PROC(DeviceWaitIdle);
+ GET_DEV_PROC(DestroyDevice);
GET_DEV_PROC(CreateSwapchainKHR);
GET_DEV_PROC(DestroySwapchainKHR);
GET_DEV_PROC(GetSwapchainImagesKHR);
@@ -93,28 +291,77 @@ void VulkanManager::initialize() {
GET_DEV_PROC(WaitForFences);
GET_DEV_PROC(ResetFences);
+ return true;
+}
+
+void VulkanManager::initialize() {
+ if (mDevice != VK_NULL_HANDLE) {
+ return;
+ }
+
+ std::vector<const char*> instanceExtensions;
+ std::vector<const char*> deviceExtensions;
+ VkPhysicalDeviceFeatures deviceFeatures;
+ LOG_ALWAYS_FATAL_IF(!this->setupDevice(deviceFeatures));
+
+ mGetDeviceQueue(mDevice, mGraphicsQueueIndex, 0, &mGraphicsQueue);
+
+ uint32_t extensionFlags = kKHR_surface_GrVkExtensionFlag |
+ kKHR_android_surface_GrVkExtensionFlag |
+ kKHR_swapchain_GrVkExtensionFlag;
+
+ uint32_t featureFlags = 0;
+ if (deviceFeatures.geometryShader) {
+ featureFlags |= kGeometryShader_GrVkFeatureFlag;
+ }
+ if (deviceFeatures.dualSrcBlend) {
+ featureFlags |= kDualSrcBlend_GrVkFeatureFlag;
+ }
+ if (deviceFeatures.sampleRateShading) {
+ featureFlags |= kSampleRateShading_GrVkFeatureFlag;
+ }
+
+ auto getProc = [] (const char* proc_name, VkInstance instance, VkDevice device) {
+ if (device != VK_NULL_HANDLE) {
+ return vkGetDeviceProcAddr(device, proc_name);
+ }
+ return vkGetInstanceProcAddr(instance, proc_name);
+ };
+
+ GrVkBackendContext backendContext;
+ backendContext.fInstance = mInstance;
+ backendContext.fPhysicalDevice = mPhysicalDevice;
+ backendContext.fDevice = mDevice;
+ backendContext.fQueue = mGraphicsQueue;
+ backendContext.fGraphicsQueueIndex = mGraphicsQueueIndex;
+ backendContext.fMinAPIVersion = VK_MAKE_VERSION(1, 0, 0);
+ backendContext.fExtensions = extensionFlags;
+ backendContext.fFeatures = featureFlags;
+ backendContext.fGetProc = std::move(getProc);
+ backendContext.fOwnsInstanceAndDevice = false;
+
// create the command pool for the command buffers
if (VK_NULL_HANDLE == mCommandPool) {
VkCommandPoolCreateInfo commandPoolInfo;
memset(&commandPoolInfo, 0, sizeof(VkCommandPoolCreateInfo));
commandPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
// this needs to be on the render queue
- commandPoolInfo.queueFamilyIndex = mBackendContext->fGraphicsQueueIndex;
+ commandPoolInfo.queueFamilyIndex = mGraphicsQueueIndex;
commandPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
- SkDEBUGCODE(VkResult res =) mCreateCommandPool(mBackendContext->fDevice, &commandPoolInfo,
- nullptr, &mCommandPool);
+ SkDEBUGCODE(VkResult res =) mCreateCommandPool(mDevice, &commandPoolInfo, nullptr,
+ &mCommandPool);
SkASSERT(VK_SUCCESS == res);
}
- mGetDeviceQueue(mBackendContext->fDevice, mPresentQueueIndex, 0, &mPresentQueue);
+ mGetDeviceQueue(mDevice, mPresentQueueIndex, 0, &mPresentQueue);
GrContextOptions options;
options.fDisableDistanceFieldPaths = true;
mRenderThread.cacheManager().configureContext(&options);
- sk_sp<GrContext> grContext(GrContext::MakeVulkan(mBackendContext, options));
+ sk_sp<GrContext> grContext(GrContext::MakeVulkan(backendContext, options));
LOG_ALWAYS_FATAL_IF(!grContext.get());
mRenderThread.setGrContext(grContext);
- DeviceInfo::initialize(mRenderThread.getGrContext()->caps()->maxRenderTargetSize());
+ DeviceInfo::initialize(mRenderThread.getGrContext()->maxRenderTargetSize());
if (Properties::enablePartialUpdates && Properties::useBufferAge) {
mSwapBehavior = SwapBehavior::BufferAge;
@@ -138,8 +385,7 @@ VulkanSurface::BackbufferInfo* VulkanManager::getAvailableBackbuffer(VulkanSurfa
// Before we reuse a backbuffer, make sure its fences have all signaled so that we can safely
// reuse its commands buffers.
- VkResult res =
- mWaitForFences(mBackendContext->fDevice, 2, backbuffer->mUsageFences, true, UINT64_MAX);
+ VkResult res = mWaitForFences(mDevice, 2, backbuffer->mUsageFences, true, UINT64_MAX);
if (res != VK_SUCCESS) {
return nullptr;
}
@@ -153,12 +399,12 @@ SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface* surface) {
VkResult res;
- res = mResetFences(mBackendContext->fDevice, 2, backbuffer->mUsageFences);
+ res = mResetFences(mDevice, 2, backbuffer->mUsageFences);
SkASSERT(VK_SUCCESS == res);
// The acquire will signal the attached mAcquireSemaphore. We use this to know the image has
// finished presenting and that it is safe to begin sending new commands to the returned image.
- res = mAcquireNextImageKHR(mBackendContext->fDevice, surface->mSwapchain, UINT64_MAX,
+ res = mAcquireNextImageKHR(mDevice, surface->mSwapchain, UINT64_MAX,
backbuffer->mAcquireSemaphore, VK_NULL_HANDLE,
&backbuffer->mImageIndex);
@@ -173,11 +419,11 @@ SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface* surface) {
return nullptr;
}
backbuffer = getAvailableBackbuffer(surface);
- res = mResetFences(mBackendContext->fDevice, 2, backbuffer->mUsageFences);
+ res = mResetFences(mDevice, 2, backbuffer->mUsageFences);
SkASSERT(VK_SUCCESS == res);
// acquire the image
- res = mAcquireNextImageKHR(mBackendContext->fDevice, surface->mSwapchain, UINT64_MAX,
+ res = mAcquireNextImageKHR(mDevice, surface->mSwapchain, UINT64_MAX,
backbuffer->mAcquireSemaphore, VK_NULL_HANDLE,
&backbuffer->mImageIndex);
@@ -205,7 +451,7 @@ SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface* surface) {
layout, // oldLayout
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout
mPresentQueueIndex, // srcQueueFamilyIndex
- mBackendContext->fGraphicsQueueIndex, // dstQueueFamilyIndex
+ mGraphicsQueueIndex, // dstQueueFamilyIndex
surface->mImages[backbuffer->mImageIndex], // image
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1} // subresourceRange
};
@@ -236,14 +482,17 @@ SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface* surface) {
submitInfo.signalSemaphoreCount = 0;
// Attach first fence to submission here so we can track when the command buffer finishes.
- mQueueSubmit(mBackendContext->fQueue, 1, &submitInfo, backbuffer->mUsageFences[0]);
+ mQueueSubmit(mGraphicsQueue, 1, &submitInfo, backbuffer->mUsageFences[0]);
// We need to notify Skia that we changed the layout of the wrapped VkImage
- GrVkImageInfo* imageInfo;
sk_sp<SkSurface> skSurface = surface->mImageInfos[backbuffer->mImageIndex].mSurface;
- skSurface->getRenderTargetHandle((GrBackendObject*)&imageInfo,
- SkSurface::kFlushRead_BackendHandleAccess);
- imageInfo->updateImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ GrBackendRenderTarget backendRT = skSurface->getBackendRenderTarget(
+ SkSurface::kFlushRead_BackendHandleAccess);
+ if (!backendRT.isValid()) {
+ SkASSERT(backendRT.isValid());
+ return nullptr;
+ }
+ backendRT.setVkImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
surface->mBackbuffer = std::move(skSurface);
return surface->mBackbuffer.get();
@@ -252,17 +501,14 @@ SkSurface* VulkanManager::getBackbufferSurface(VulkanSurface* surface) {
void VulkanManager::destroyBuffers(VulkanSurface* surface) {
if (surface->mBackbuffers) {
for (uint32_t i = 0; i < surface->mImageCount + 1; ++i) {
- mWaitForFences(mBackendContext->fDevice, 2, surface->mBackbuffers[i].mUsageFences, true,
- UINT64_MAX);
+ mWaitForFences(mDevice, 2, surface->mBackbuffers[i].mUsageFences, true, UINT64_MAX);
surface->mBackbuffers[i].mImageIndex = -1;
- mDestroySemaphore(mBackendContext->fDevice, surface->mBackbuffers[i].mAcquireSemaphore,
- nullptr);
- mDestroySemaphore(mBackendContext->fDevice, surface->mBackbuffers[i].mRenderSemaphore,
- nullptr);
- mFreeCommandBuffers(mBackendContext->fDevice, mCommandPool, 2,
- surface->mBackbuffers[i].mTransitionCmdBuffers);
- mDestroyFence(mBackendContext->fDevice, surface->mBackbuffers[i].mUsageFences[0], 0);
- mDestroyFence(mBackendContext->fDevice, surface->mBackbuffers[i].mUsageFences[1], 0);
+ mDestroySemaphore(mDevice, surface->mBackbuffers[i].mAcquireSemaphore, nullptr);
+ mDestroySemaphore(mDevice, surface->mBackbuffers[i].mRenderSemaphore, nullptr);
+ mFreeCommandBuffers(mDevice, mCommandPool, 2,
+ surface->mBackbuffers[i].mTransitionCmdBuffers);
+ mDestroyFence(mDevice, surface->mBackbuffers[i].mUsageFences[0], 0);
+ mDestroyFence(mDevice, surface->mBackbuffers[i].mUsageFences[1], 0);
}
}
@@ -279,29 +525,27 @@ void VulkanManager::destroySurface(VulkanSurface* surface) {
if (VK_NULL_HANDLE != mPresentQueue) {
mQueueWaitIdle(mPresentQueue);
}
- mDeviceWaitIdle(mBackendContext->fDevice);
+ mDeviceWaitIdle(mDevice);
destroyBuffers(surface);
if (VK_NULL_HANDLE != surface->mSwapchain) {
- mDestroySwapchainKHR(mBackendContext->fDevice, surface->mSwapchain, nullptr);
+ mDestroySwapchainKHR(mDevice, surface->mSwapchain, nullptr);
surface->mSwapchain = VK_NULL_HANDLE;
}
if (VK_NULL_HANDLE != surface->mVkSurface) {
- mDestroySurfaceKHR(mBackendContext->fInstance, surface->mVkSurface, nullptr);
+ mDestroySurfaceKHR(mInstance, surface->mVkSurface, nullptr);
surface->mVkSurface = VK_NULL_HANDLE;
}
delete surface;
}
void VulkanManager::createBuffers(VulkanSurface* surface, VkFormat format, VkExtent2D extent) {
- mGetSwapchainImagesKHR(mBackendContext->fDevice, surface->mSwapchain, &surface->mImageCount,
- nullptr);
+ mGetSwapchainImagesKHR(mDevice, surface->mSwapchain, &surface->mImageCount, nullptr);
SkASSERT(surface->mImageCount);
surface->mImages = new VkImage[surface->mImageCount];
- mGetSwapchainImagesKHR(mBackendContext->fDevice, surface->mSwapchain, &surface->mImageCount,
- surface->mImages);
+ mGetSwapchainImagesKHR(mDevice, surface->mSwapchain, &surface->mImageCount, surface->mImages);
SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
@@ -320,7 +564,8 @@ void VulkanManager::createBuffers(VulkanSurface* surface, VkFormat format, VkExt
VulkanSurface::ImageInfo& imageInfo = surface->mImageInfos[i];
imageInfo.mSurface = SkSurface::MakeFromBackendRenderTarget(
- mRenderThread.getGrContext(), backendRT, kTopLeft_GrSurfaceOrigin, nullptr, &props);
+ mRenderThread.getGrContext(), backendRT, kTopLeft_GrSurfaceOrigin,
+ kRGBA_8888_SkColorType, nullptr, &props);
}
SkASSERT(mCommandPool != VK_NULL_HANDLE);
@@ -350,15 +595,15 @@ void VulkanManager::createBuffers(VulkanSurface* surface, VkFormat format, VkExt
for (uint32_t i = 0; i < surface->mImageCount + 1; ++i) {
SkDEBUGCODE(VkResult res);
surface->mBackbuffers[i].mImageIndex = -1;
- SkDEBUGCODE(res =) mCreateSemaphore(mBackendContext->fDevice, &semaphoreInfo, nullptr,
+ SkDEBUGCODE(res =) mCreateSemaphore(mDevice, &semaphoreInfo, nullptr,
&surface->mBackbuffers[i].mAcquireSemaphore);
- SkDEBUGCODE(res =) mCreateSemaphore(mBackendContext->fDevice, &semaphoreInfo, nullptr,
+ SkDEBUGCODE(res =) mCreateSemaphore(mDevice, &semaphoreInfo, nullptr,
&surface->mBackbuffers[i].mRenderSemaphore);
- SkDEBUGCODE(res =) mAllocateCommandBuffers(mBackendContext->fDevice, &commandBuffersInfo,
+ SkDEBUGCODE(res =) mAllocateCommandBuffers(mDevice, &commandBuffersInfo,
surface->mBackbuffers[i].mTransitionCmdBuffers);
- SkDEBUGCODE(res =) mCreateFence(mBackendContext->fDevice, &fenceInfo, nullptr,
+ SkDEBUGCODE(res =) mCreateFence(mDevice, &fenceInfo, nullptr,
&surface->mBackbuffers[i].mUsageFences[0]);
- SkDEBUGCODE(res =) mCreateFence(mBackendContext->fDevice, &fenceInfo, nullptr,
+ SkDEBUGCODE(res =) mCreateFence(mDevice, &fenceInfo, nullptr,
&surface->mBackbuffers[i].mUsageFences[1]);
SkASSERT(VK_SUCCESS == res);
}
@@ -368,35 +613,35 @@ void VulkanManager::createBuffers(VulkanSurface* surface, VkFormat format, VkExt
bool VulkanManager::createSwapchain(VulkanSurface* surface) {
// check for capabilities
VkSurfaceCapabilitiesKHR caps;
- VkResult res = mGetPhysicalDeviceSurfaceCapabilitiesKHR(mBackendContext->fPhysicalDevice,
+ VkResult res = mGetPhysicalDeviceSurfaceCapabilitiesKHR(mPhysicalDevice,
surface->mVkSurface, &caps);
if (VK_SUCCESS != res) {
return false;
}
uint32_t surfaceFormatCount;
- res = mGetPhysicalDeviceSurfaceFormatsKHR(mBackendContext->fPhysicalDevice, surface->mVkSurface,
+ res = mGetPhysicalDeviceSurfaceFormatsKHR(mPhysicalDevice, surface->mVkSurface,
&surfaceFormatCount, nullptr);
if (VK_SUCCESS != res) {
return false;
}
FatVector<VkSurfaceFormatKHR, 4> surfaceFormats(surfaceFormatCount);
- res = mGetPhysicalDeviceSurfaceFormatsKHR(mBackendContext->fPhysicalDevice, surface->mVkSurface,
+ res = mGetPhysicalDeviceSurfaceFormatsKHR(mPhysicalDevice, surface->mVkSurface,
&surfaceFormatCount, surfaceFormats.data());
if (VK_SUCCESS != res) {
return false;
}
uint32_t presentModeCount;
- res = mGetPhysicalDeviceSurfacePresentModesKHR(mBackendContext->fPhysicalDevice,
+ res = mGetPhysicalDeviceSurfacePresentModesKHR(mPhysicalDevice,
surface->mVkSurface, &presentModeCount, nullptr);
if (VK_SUCCESS != res) {
return false;
}
FatVector<VkPresentModeKHR, VK_PRESENT_MODE_RANGE_SIZE_KHR> presentModes(presentModeCount);
- res = mGetPhysicalDeviceSurfacePresentModesKHR(mBackendContext->fPhysicalDevice,
+ res = mGetPhysicalDeviceSurfacePresentModesKHR(mPhysicalDevice,
surface->mVkSurface, &presentModeCount,
presentModes.data());
if (VK_SUCCESS != res) {
@@ -478,8 +723,8 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
swapchainCreateInfo.imageArrayLayers = 1;
swapchainCreateInfo.imageUsage = usageFlags;
- uint32_t queueFamilies[] = {mBackendContext->fGraphicsQueueIndex, mPresentQueueIndex};
- if (mBackendContext->fGraphicsQueueIndex != mPresentQueueIndex) {
+ uint32_t queueFamilies[] = {mGraphicsQueueIndex, mPresentQueueIndex};
+ if (mGraphicsQueueIndex != mPresentQueueIndex) {
swapchainCreateInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
swapchainCreateInfo.queueFamilyIndexCount = 2;
swapchainCreateInfo.pQueueFamilyIndices = queueFamilies;
@@ -495,19 +740,18 @@ bool VulkanManager::createSwapchain(VulkanSurface* surface) {
swapchainCreateInfo.clipped = true;
swapchainCreateInfo.oldSwapchain = surface->mSwapchain;
- res = mCreateSwapchainKHR(mBackendContext->fDevice, &swapchainCreateInfo, nullptr,
- &surface->mSwapchain);
+ res = mCreateSwapchainKHR(mDevice, &swapchainCreateInfo, nullptr, &surface->mSwapchain);
if (VK_SUCCESS != res) {
return false;
}
// destroy the old swapchain
if (swapchainCreateInfo.oldSwapchain != VK_NULL_HANDLE) {
- mDeviceWaitIdle(mBackendContext->fDevice);
+ mDeviceWaitIdle(mDevice);
destroyBuffers(surface);
- mDestroySwapchainKHR(mBackendContext->fDevice, swapchainCreateInfo.oldSwapchain, nullptr);
+ mDestroySwapchainKHR(mDevice, swapchainCreateInfo.oldSwapchain, nullptr);
}
createBuffers(surface, surfaceFormat, extent);
@@ -531,20 +775,18 @@ VulkanSurface* VulkanManager::createSurface(ANativeWindow* window) {
surfaceCreateInfo.flags = 0;
surfaceCreateInfo.window = window;
- VkResult res = mCreateAndroidSurfaceKHR(mBackendContext->fInstance, &surfaceCreateInfo, nullptr,
- &surface->mVkSurface);
+ VkResult res = mCreateAndroidSurfaceKHR(mInstance, &surfaceCreateInfo, nullptr,
+ &surface->mVkSurface);
if (VK_SUCCESS != res) {
delete surface;
return nullptr;
}
SkDEBUGCODE(VkBool32 supported; res = mGetPhysicalDeviceSurfaceSupportKHR(
- mBackendContext->fPhysicalDevice, mPresentQueueIndex,
- surface->mVkSurface, &supported);
- // All physical devices and queue families on Android must be capable of
- // presentation with any
- // native window.
- SkASSERT(VK_SUCCESS == res && supported););
+ mPhysicalDevice, mPresentQueueIndex, surface->mVkSurface, &supported);
+ // All physical devices and queue families on Android must be capable of
+ // presentation with any native window.
+ SkASSERT(VK_SUCCESS == res && supported););
if (!createSwapchain(surface)) {
destroySurface(surface);
@@ -601,22 +843,27 @@ static VkAccessFlags layoutToSrcAccessMask(const VkImageLayout layout) {
void VulkanManager::swapBuffers(VulkanSurface* surface) {
if (CC_UNLIKELY(Properties::waitForGpuCompletion)) {
ATRACE_NAME("Finishing GPU work");
- mDeviceWaitIdle(mBackendContext->fDevice);
+ mDeviceWaitIdle(mDevice);
}
SkASSERT(surface->mBackbuffers);
VulkanSurface::BackbufferInfo* backbuffer =
surface->mBackbuffers + surface->mCurrentBackbufferIndex;
- GrVkImageInfo* imageInfo;
+
SkSurface* skSurface = surface->mImageInfos[backbuffer->mImageIndex].mSurface.get();
- skSurface->getRenderTargetHandle((GrBackendObject*)&imageInfo,
- SkSurface::kFlushRead_BackendHandleAccess);
+ GrBackendRenderTarget backendRT = skSurface->getBackendRenderTarget(
+ SkSurface::kFlushRead_BackendHandleAccess);
+ SkASSERT(backendRT.isValid());
+
+ GrVkImageInfo imageInfo;
+ SkAssertResult(backendRT.getVkImageInfo(&imageInfo));
+
// Check to make sure we never change the actually wrapped image
- SkASSERT(imageInfo->fImage == surface->mImages[backbuffer->mImageIndex]);
+ SkASSERT(imageInfo.fImage == surface->mImages[backbuffer->mImageIndex]);
// We need to transition the image to VK_IMAGE_LAYOUT_PRESENT_SRC_KHR and make sure that all
// previous work is complete for before presenting. So we first add the necessary barrier here.
- VkImageLayout layout = imageInfo->fImageLayout;
+ VkImageLayout layout = imageInfo.fImageLayout;
VkPipelineStageFlags srcStageMask = layoutToPipelineStageFlags(layout);
VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
VkAccessFlags srcAccessMask = layoutToSrcAccessMask(layout);
@@ -629,7 +876,7 @@ void VulkanManager::swapBuffers(VulkanSurface* surface) {
dstAccessMask, // inputMask
layout, // oldLayout
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, // newLayout
- mBackendContext->fGraphicsQueueIndex, // srcQueueFamilyIndex
+ mGraphicsQueueIndex, // srcQueueFamilyIndex
mPresentQueueIndex, // dstQueueFamilyIndex
surface->mImages[backbuffer->mImageIndex], // image
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1} // subresourceRange
@@ -661,7 +908,7 @@ void VulkanManager::swapBuffers(VulkanSurface* surface) {
submitInfo.pSignalSemaphores = &backbuffer->mRenderSemaphore;
// Attach second fence to submission here so we can track when the command buffer finishes.
- mQueueSubmit(mBackendContext->fQueue, 1, &submitInfo, backbuffer->mUsageFences[1]);
+ mQueueSubmit(mGraphicsQueue, 1, &submitInfo, backbuffer->mUsageFences[1]);
// Submit present operation to present queue. We use a semaphore here to make sure all rendering
// to the image is complete and that the layout has been change to present on the graphics
diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h
index c319c9ec209f..9a72706e44dd 100644
--- a/libs/hwui/renderthread/VulkanManager.h
+++ b/libs/hwui/renderthread/VulkanManager.h
@@ -79,7 +79,7 @@ public:
void initialize();
// Quick check to see if the VulkanManager has been initialized.
- bool hasVkContext() { return mBackendContext.get() != nullptr; }
+ bool hasVkContext() { return mDevice != VK_NULL_HANDLE; }
// Given a window this creates a new VkSurfaceKHR and VkSwapchain and stores them inside a new
// VulkanSurface object which is returned.
@@ -111,6 +111,10 @@ private:
explicit VulkanManager(RenderThread& thread);
~VulkanManager() { destroy(); }
+ // Sets up the VkInstance and VkDevice objects. Also fills out the passed in
+ // VkPhysicalDeviceFeatures struct.
+ bool setupDevice(VkPhysicalDeviceFeatures& deviceFeatures);
+
void destroyBuffers(VulkanSurface* surface);
bool createSwapchain(VulkanSurface* surface);
@@ -148,7 +152,21 @@ private:
VkPtr<PFN_vkQueuePresentKHR> mQueuePresentKHR;
VkPtr<PFN_vkCreateSharedSwapchainsKHR> mCreateSharedSwapchainsKHR;
- // Additional vulkan functions
+ // Instance Functions
+ VkPtr<PFN_vkEnumerateInstanceExtensionProperties> mEnumerateInstanceExtensionProperties;
+ VkPtr<PFN_vkCreateInstance> mCreateInstance;
+
+ VkPtr<PFN_vkDestroyInstance> mDestroyInstance;
+ VkPtr<PFN_vkEnumeratePhysicalDevices> mEnumeratePhysicalDevices;
+ VkPtr<PFN_vkGetPhysicalDeviceQueueFamilyProperties> mGetPhysicalDeviceQueueFamilyProperties;
+ VkPtr<PFN_vkGetPhysicalDeviceFeatures> mGetPhysicalDeviceFeatures;
+ VkPtr<PFN_vkCreateDevice> mCreateDevice;
+ VkPtr<PFN_vkEnumerateDeviceExtensionProperties> mEnumerateDeviceExtensionProperties;
+
+ // Device Functions
+ VkPtr<PFN_vkGetDeviceQueue> mGetDeviceQueue;
+ VkPtr<PFN_vkDeviceWaitIdle> mDeviceWaitIdle;
+ VkPtr<PFN_vkDestroyDevice> mDestroyDevice;
VkPtr<PFN_vkCreateCommandPool> mCreateCommandPool;
VkPtr<PFN_vkDestroyCommandPool> mDestroyCommandPool;
VkPtr<PFN_vkAllocateCommandBuffers> mAllocateCommandBuffers;
@@ -158,10 +176,8 @@ private:
VkPtr<PFN_vkEndCommandBuffer> mEndCommandBuffer;
VkPtr<PFN_vkCmdPipelineBarrier> mCmdPipelineBarrier;
- VkPtr<PFN_vkGetDeviceQueue> mGetDeviceQueue;
VkPtr<PFN_vkQueueSubmit> mQueueSubmit;
VkPtr<PFN_vkQueueWaitIdle> mQueueWaitIdle;
- VkPtr<PFN_vkDeviceWaitIdle> mDeviceWaitIdle;
VkPtr<PFN_vkCreateSemaphore> mCreateSemaphore;
VkPtr<PFN_vkDestroySemaphore> mDestroySemaphore;
@@ -172,7 +188,12 @@ private:
RenderThread& mRenderThread;
- sk_sp<const GrVkBackendContext> mBackendContext;
+ VkInstance mInstance = VK_NULL_HANDLE;
+ VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE;
+ VkDevice mDevice = VK_NULL_HANDLE;
+
+ uint32_t mGraphicsQueueIndex;
+ VkQueue mGraphicsQueue = VK_NULL_HANDLE;
uint32_t mPresentQueueIndex;
VkQueue mPresentQueue = VK_NULL_HANDLE;
VkCommandPool mCommandPool = VK_NULL_HANDLE;
diff --git a/libs/hwui/service/GraphicsStatsService.cpp b/libs/hwui/service/GraphicsStatsService.cpp
index 7f8cb2d1f577..3d50d2d7e59c 100644
--- a/libs/hwui/service/GraphicsStatsService.cpp
+++ b/libs/hwui/service/GraphicsStatsService.cpp
@@ -127,7 +127,7 @@ bool GraphicsStatsService::parseFromFile(const std::string& path,
return false;
}
void* addr = mmap(nullptr, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
- if (!addr) {
+ if (addr == MAP_FAILED) {
int err = errno;
// The file not existing is normal for addToDump(), so only log if
// we get an unexpected error
diff --git a/libs/hwui/tests/common/TestUtils.cpp b/libs/hwui/tests/common/TestUtils.cpp
index 02ac97e0ed5c..69586345319e 100644
--- a/libs/hwui/tests/common/TestUtils.cpp
+++ b/libs/hwui/tests/common/TestUtils.cpp
@@ -19,16 +19,15 @@
#include "DeferredLayerUpdater.h"
#include "hwui/Paint.h"
-#include <SkClipStack.h>
#include <minikin/Layout.h>
#include <pipeline/skia/SkiaOpenGLPipeline.h>
#include <pipeline/skia/SkiaVulkanPipeline.h>
#include <renderthread/EglManager.h>
-#include <renderthread/OpenGLPipeline.h>
#include <renderthread/VulkanManager.h>
#include <utils/Unicode.h>
-#include <SkGlyphCache.h>
+#include "SkColorData.h"
+#include "SkUnPreMultiply.h"
namespace android {
namespace uirenderer {
@@ -53,9 +52,7 @@ SkColor TestUtils::interpolateColor(float fraction, SkColor start, SkColor end)
sp<DeferredLayerUpdater> TestUtils::createTextureLayerUpdater(
renderthread::RenderThread& renderThread) {
android::uirenderer::renderthread::IRenderPipeline* pipeline;
- if (Properties::getRenderPipelineType() == RenderPipelineType::OpenGL) {
- pipeline = new renderthread::OpenGLPipeline(renderThread);
- } else if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) {
+ if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) {
pipeline = new skiapipeline::SkiaOpenGLPipeline(renderThread);
} else {
pipeline = new skiapipeline::SkiaVulkanPipeline(renderThread);
@@ -83,48 +80,17 @@ sp<DeferredLayerUpdater> TestUtils::createTextureLayerUpdater(
return layerUpdater;
}
-void TestUtils::layoutTextUnscaled(const SkPaint& paint, const char* text,
- std::vector<glyph_t>* outGlyphs,
- std::vector<float>* outPositions, float* outTotalAdvance,
- Rect* outBounds) {
- Rect bounds;
- float totalAdvance = 0;
- SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry);
- SkAutoGlyphCacheNoGamma autoCache(paint, &surfaceProps, &SkMatrix::I());
- while (*text != '\0') {
- size_t nextIndex = 0;
- int32_t unichar = utf32_from_utf8_at(text, 4, 0, &nextIndex);
- text += nextIndex;
-
- glyph_t glyph = autoCache.getCache()->unicharToGlyph(unichar);
- autoCache.getCache()->unicharToGlyph(unichar);
-
- // push glyph and its relative position
- outGlyphs->push_back(glyph);
- outPositions->push_back(totalAdvance);
- outPositions->push_back(0);
-
- // compute bounds
- SkGlyph skGlyph = autoCache.getCache()->getUnicharMetrics(unichar);
- Rect glyphBounds(skGlyph.fWidth, skGlyph.fHeight);
- glyphBounds.translate(totalAdvance + skGlyph.fLeft, skGlyph.fTop);
- bounds.unionWith(glyphBounds);
-
- // advance next character
- SkScalar skWidth;
- paint.getTextWidths(&glyph, sizeof(glyph), &skWidth, NULL);
- totalAdvance += skWidth;
- }
- *outBounds = bounds;
- *outTotalAdvance = totalAdvance;
-}
-
void TestUtils::drawUtf8ToCanvas(Canvas* canvas, const char* text, const SkPaint& paint, float x,
float y) {
auto utf16 = asciiToUtf16(text);
+ uint32_t length = strlen(text);
SkPaint glyphPaint(paint);
glyphPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- canvas->drawText(utf16.get(), 0, strlen(text), strlen(text), x, y, minikin::Bidi::LTR,
+ canvas->drawText(
+ utf16.get(), length, // text buffer
+ 0, length, // draw range
+ 0, length, // context range
+ x, y, minikin::Bidi::LTR,
glyphPaint, nullptr, nullptr /* measured text */);
}
@@ -143,7 +109,7 @@ void TestUtils::TestTask::run() {
if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) {
renderThread.vulkanManager().initialize();
} else {
- renderThread.eglManager().initialize();
+ renderThread.requireGlContext();
}
rtCallback(renderThread);
@@ -152,7 +118,7 @@ void TestUtils::TestTask::run() {
renderThread.vulkanManager().destroy();
} else {
renderThread.renderState().flush(Caches::FlushMode::Full);
- renderThread.eglManager().destroy();
+ renderThread.destroyGlContext();
}
}
diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h
index 2752ae9a8036..743f8093bfa8 100644
--- a/libs/hwui/tests/common/TestUtils.h
+++ b/libs/hwui/tests/common/TestUtils.h
@@ -18,6 +18,7 @@
#include <DeviceInfo.h>
#include <DisplayList.h>
+#include <GlLayer.h>
#include <Matrix.h>
#include <Properties.h>
#include <Rect.h>
@@ -28,9 +29,6 @@
#include <renderstate/RenderState.h>
#include <renderthread/RenderThread.h>
-#include <RecordedOp.h>
-#include <RecordingCanvas.h>
-
#include <memory>
namespace android {
@@ -60,18 +58,6 @@ namespace uirenderer {
Properties::overrideRenderPipelineType(oldType); \
};
-/**
- * Like gtests' TEST, but only runs with the OpenGL RenderPipelineType
- */
-#define OPENGL_PIPELINE_TEST(test_case_name, test_name) \
- class test_case_name##_##test_name##_HwuiTest { \
- public: \
- static void doTheThing(); \
- }; \
- INNER_PIPELINE_TEST(test_case_name, test_name, OpenGL, \
- test_case_name##_##test_name##_HwuiTest::doTheThing()) \
- void test_case_name##_##test_name##_HwuiTest::doTheThing()
-
#define INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, pipeline) \
INNER_PIPELINE_TEST(test_case_name, test_name, pipeline, \
TestUtils::runOnRenderThread( \
@@ -86,7 +72,6 @@ namespace uirenderer {
public: \
static void doTheThing(renderthread::RenderThread& renderThread); \
}; \
- INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, OpenGL); \
INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaGL); \
/* Temporarily disabling Vulkan until we can figure out a way to stub out the driver */ \
/* INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, SkiaVulkan); */ \
@@ -94,18 +79,6 @@ namespace uirenderer {
renderthread::RenderThread& renderThread)
/**
- * Like RENDERTHREAD_TEST, but only runs with the OpenGL RenderPipelineType
- */
-#define RENDERTHREAD_OPENGL_PIPELINE_TEST(test_case_name, test_name) \
- class test_case_name##_##test_name##_RenderThreadTest { \
- public: \
- static void doTheThing(renderthread::RenderThread& renderThread); \
- }; \
- INNER_PIPELINE_RENDERTHREAD_TEST(test_case_name, test_name, OpenGL); \
- void test_case_name##_##test_name##_RenderThreadTest::doTheThing( \
- renderthread::RenderThread& renderThread)
-
-/**
* Like RENDERTHREAD_TEST, but only runs with the Skia RenderPipelineTypes
*/
#define RENDERTHREAD_SKIA_PIPELINE_TEST(test_case_name, test_name) \
@@ -325,11 +298,6 @@ public:
static SkColor interpolateColor(float fraction, SkColor start, SkColor end);
- static void layoutTextUnscaled(const SkPaint& paint, const char* text,
- std::vector<glyph_t>* outGlyphs,
- std::vector<float>* outPositions, float* outTotalAdvance,
- Rect* outBounds);
-
static void drawUtf8ToCanvas(Canvas* canvas, const char* text, const SkPaint& paint, float x,
float y);
@@ -365,16 +333,10 @@ private:
}
auto displayList = node->getDisplayList();
if (displayList) {
- if (displayList->isSkiaDL()) {
- for (auto&& childDr : static_cast<skiapipeline::SkiaDisplayList*>(
- const_cast<DisplayList*>(displayList))
- ->mChildNodes) {
- syncHierarchyPropertiesAndDisplayListImpl(childDr.getRenderNode());
- }
- } else {
- for (auto&& childOp : displayList->getChildren()) {
- syncHierarchyPropertiesAndDisplayListImpl(childOp->renderNode);
- }
+ for (auto&& childDr : static_cast<skiapipeline::SkiaDisplayList*>(
+ const_cast<DisplayList*>(displayList))
+ ->mChildNodes) {
+ syncHierarchyPropertiesAndDisplayListImpl(childDr.getRenderNode());
}
}
}
diff --git a/libs/hwui/tests/common/scenes/TestSceneBase.h b/libs/hwui/tests/common/scenes/TestSceneBase.h
index 792312a6a7a4..6f76a502ae3e 100644
--- a/libs/hwui/tests/common/scenes/TestSceneBase.h
+++ b/libs/hwui/tests/common/scenes/TestSceneBase.h
@@ -16,7 +16,7 @@
#pragma once
-#include "RecordingCanvas.h"
+#include "hwui/Canvas.h"
#include "RenderNode.h"
#include "tests/common/TestContext.h"
#include "tests/common/TestScene.h"
diff --git a/libs/hwui/tests/macrobench/main.cpp b/libs/hwui/tests/macrobench/main.cpp
index 0a9a74eccfc9..e3c97ce686d9 100644
--- a/libs/hwui/tests/macrobench/main.cpp
+++ b/libs/hwui/tests/macrobench/main.cpp
@@ -19,7 +19,6 @@
#include "Properties.h"
#include "hwui/Typeface.h"
-#include "protos/hwui.pb.h"
#include <benchmark/benchmark.h>
#include <getopt.h>
@@ -67,7 +66,7 @@ OPTIONS:
--onscreen Render tests on device screen. By default tests
are offscreen rendered
--benchmark_format Set output format. Possible values are tabular, json, csv
- --renderer=TYPE Sets the render pipeline to use. May be opengl, skiagl, or skiavk
+ --renderer=TYPE Sets the render pipeline to use. May be skiagl or skiavk
)");
}
@@ -137,8 +136,6 @@ static bool setBenchmarkFormat(const char* format) {
gBenchmarkReporter.reset(new benchmark::ConsoleReporter());
} else if (!strcmp(format, "json")) {
gBenchmarkReporter.reset(new benchmark::JSONReporter());
- } else if (!strcmp(format, "csv")) {
- gBenchmarkReporter.reset(new benchmark::CSVReporter());
} else {
fprintf(stderr, "Unknown format '%s'", format);
return false;
@@ -147,9 +144,7 @@ static bool setBenchmarkFormat(const char* format) {
}
static bool setRenderer(const char* renderer) {
- if (!strcmp(renderer, "opengl")) {
- Properties::overrideRenderPipelineType(RenderPipelineType::OpenGL);
- } else if (!strcmp(renderer, "skiagl")) {
+ if (!strcmp(renderer, "skiagl")) {
Properties::overrideRenderPipelineType(RenderPipelineType::SkiaGL);
} else if (!strcmp(renderer, "skiavk")) {
Properties::overrideRenderPipelineType(RenderPipelineType::SkiaVulkan);
diff --git a/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp b/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp
index 0aaf7731c927..9388c2062736 100644
--- a/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp
+++ b/libs/hwui/tests/microbench/DisplayListCanvasBench.cpp
@@ -16,8 +16,10 @@
#include <benchmark/benchmark.h>
+#include "CanvasState.h"
#include "DisplayList.h"
-#include "RecordingCanvas.h"
+#include "hwui/Canvas.h"
+#include "pipeline/skia/SkiaDisplayList.h"
#include "tests/common/TestUtils.h"
using namespace android;
@@ -25,7 +27,7 @@ using namespace android::uirenderer;
void BM_DisplayList_alloc(benchmark::State& benchState) {
while (benchState.KeepRunning()) {
- auto displayList = new DisplayList();
+ auto displayList = new skiapipeline::SkiaDisplayList();
benchmark::DoNotOptimize(displayList);
delete displayList;
}
@@ -34,7 +36,7 @@ BENCHMARK(BM_DisplayList_alloc);
void BM_DisplayList_alloc_theoretical(benchmark::State& benchState) {
while (benchState.KeepRunning()) {
- auto displayList = new char[sizeof(DisplayList)];
+ auto displayList = new char[sizeof(skiapipeline::SkiaDisplayList)];
benchmark::DoNotOptimize(displayList);
delete[] displayList;
}
diff --git a/libs/hwui/tests/microbench/FontBench.cpp b/libs/hwui/tests/microbench/FontBench.cpp
deleted file mode 100644
index 4e9b540a5c3d..000000000000
--- a/libs/hwui/tests/microbench/FontBench.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <benchmark/benchmark.h>
-
-#include "GammaFontRenderer.h"
-#include "tests/common/TestUtils.h"
-
-#include <SkPaint.h>
-
-using namespace android;
-using namespace android::uirenderer;
-
-void BM_FontRenderer_precache_cachehits(benchmark::State& state) {
- TestUtils::runOnRenderThread([&state](renderthread::RenderThread& thread) {
- SkPaint paint;
- paint.setTextSize(20);
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- GammaFontRenderer gammaFontRenderer;
- FontRenderer& fontRenderer = gammaFontRenderer.getFontRenderer();
- fontRenderer.setFont(&paint, SkMatrix::I());
-
- std::vector<glyph_t> glyphs;
- std::vector<float> positions;
- float totalAdvance;
- uirenderer::Rect bounds;
- TestUtils::layoutTextUnscaled(paint, "This is a test", &glyphs, &positions, &totalAdvance,
- &bounds);
-
- fontRenderer.precache(&paint, glyphs.data(), glyphs.size(), SkMatrix::I());
-
- while (state.KeepRunning()) {
- fontRenderer.precache(&paint, glyphs.data(), glyphs.size(), SkMatrix::I());
- }
- });
-}
-BENCHMARK(BM_FontRenderer_precache_cachehits);
diff --git a/libs/hwui/tests/microbench/FrameBuilderBench.cpp b/libs/hwui/tests/microbench/FrameBuilderBench.cpp
deleted file mode 100644
index b6217665d743..000000000000
--- a/libs/hwui/tests/microbench/FrameBuilderBench.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <benchmark/benchmark.h>
-
-#include "BakedOpDispatcher.h"
-#include "BakedOpRenderer.h"
-#include "BakedOpState.h"
-#include "FrameBuilder.h"
-#include "LayerUpdateQueue.h"
-#include "RecordedOp.h"
-#include "RecordingCanvas.h"
-#include "Vector.h"
-#include "tests/common/TestContext.h"
-#include "tests/common/TestScene.h"
-#include "tests/common/TestUtils.h"
-
-#include <vector>
-
-using namespace android;
-using namespace android::uirenderer;
-using namespace android::uirenderer::renderthread;
-using namespace android::uirenderer::test;
-
-const FrameBuilder::LightGeometry sLightGeometry = {{100, 100, 100}, 50};
-const BakedOpRenderer::LightInfo sLightInfo = {128, 128};
-
-static sp<RenderNode> createTestNode() {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(10, 10));
- SkPaint paint;
-
- // Alternate between drawing rects and bitmaps, with bitmaps overlapping rects.
- // Rects don't overlap bitmaps, so bitmaps should be brought to front as a group.
- canvas.save(SaveFlags::MatrixClip);
- for (int i = 0; i < 30; i++) {
- canvas.translate(0, 10);
- canvas.drawRect(0, 0, 10, 10, paint);
- canvas.drawBitmap(*bitmap, 5, 0, nullptr);
- }
- canvas.restore();
- });
- TestUtils::syncHierarchyPropertiesAndDisplayList(node);
- return node;
-}
-
-void BM_FrameBuilder_defer(benchmark::State& state) {
- TestUtils::runOnRenderThread([&state](RenderThread& thread) {
- auto node = createTestNode();
- while (state.KeepRunning()) {
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 200), 100, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*node);
- benchmark::DoNotOptimize(&frameBuilder);
- }
- });
-}
-BENCHMARK(BM_FrameBuilder_defer);
-
-void BM_FrameBuilder_deferAndRender(benchmark::State& state) {
- TestUtils::runOnRenderThread([&state](RenderThread& thread) {
- auto node = createTestNode();
-
- RenderState& renderState = thread.renderState();
- Caches& caches = Caches::getInstance();
-
- while (state.KeepRunning()) {
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 200), 100, 200, sLightGeometry, caches);
- frameBuilder.deferRenderNode(*node);
-
- BakedOpRenderer renderer(caches, renderState, true, false, sLightInfo);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
- benchmark::DoNotOptimize(&renderer);
- }
- });
-}
-BENCHMARK(BM_FrameBuilder_deferAndRender);
-
-static sp<RenderNode> getSyncedSceneNode(const char* sceneName) {
- gDisplay = getBuiltInDisplay(); // switch to real display if present
-
- TestContext testContext;
- TestScene::Options opts;
- std::unique_ptr<TestScene> scene(TestScene::testMap()[sceneName].createScene(opts));
-
- sp<RenderNode> rootNode = TestUtils::createNode<RecordingCanvas>(
- 0, 0, gDisplay.w, gDisplay.h,
- [&scene](RenderProperties& props, RecordingCanvas& canvas) {
- scene->createContent(gDisplay.w, gDisplay.h, canvas);
- });
-
- TestUtils::syncHierarchyPropertiesAndDisplayList(rootNode);
- return rootNode;
-}
-
-static auto SCENES = {
- "listview",
-};
-
-void BM_FrameBuilder_defer_scene(benchmark::State& state) {
- TestUtils::runOnRenderThread([&state](RenderThread& thread) {
- const char* sceneName = *(SCENES.begin() + state.range(0));
- state.SetLabel(sceneName);
- auto node = getSyncedSceneNode(sceneName);
- while (state.KeepRunning()) {
- FrameBuilder frameBuilder(SkRect::MakeWH(gDisplay.w, gDisplay.h), gDisplay.w,
- gDisplay.h, sLightGeometry, Caches::getInstance());
- frameBuilder.deferRenderNode(*node);
- benchmark::DoNotOptimize(&frameBuilder);
- }
- });
-}
-BENCHMARK(BM_FrameBuilder_defer_scene)->DenseRange(0, SCENES.size() - 1);
-
-void BM_FrameBuilder_deferAndRender_scene(benchmark::State& state) {
- TestUtils::runOnRenderThread([&state](RenderThread& thread) {
- const char* sceneName = *(SCENES.begin() + state.range(0));
- state.SetLabel(sceneName);
- auto node = getSyncedSceneNode(sceneName);
-
- RenderState& renderState = thread.renderState();
- Caches& caches = Caches::getInstance();
-
- while (state.KeepRunning()) {
- FrameBuilder frameBuilder(SkRect::MakeWH(gDisplay.w, gDisplay.h), gDisplay.w,
- gDisplay.h, sLightGeometry, Caches::getInstance());
- frameBuilder.deferRenderNode(*node);
-
- BakedOpRenderer renderer(caches, renderState, true, false, sLightInfo);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
- benchmark::DoNotOptimize(&renderer);
- }
- });
-}
-BENCHMARK(BM_FrameBuilder_deferAndRender_scene)->DenseRange(0, SCENES.size() - 1);
diff --git a/libs/hwui/tests/microbench/ShadowBench.cpp b/libs/hwui/tests/microbench/ShadowBench.cpp
deleted file mode 100644
index 12da7837e2e9..000000000000
--- a/libs/hwui/tests/microbench/ShadowBench.cpp
+++ /dev/null
@@ -1,101 +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.
- */
-
-#include <benchmark/benchmark.h>
-
-#include "Matrix.h"
-#include "Rect.h"
-#include "TessellationCache.h"
-#include "Vector.h"
-#include "VertexBuffer.h"
-
-#include <SkPath.h>
-
-#include <memory>
-
-using namespace android;
-using namespace android::uirenderer;
-
-struct ShadowTestData {
- Matrix4 drawTransform;
- Rect localClip;
- Matrix4 casterTransformXY;
- Matrix4 casterTransformZ;
- Vector3 lightCenter;
- float lightRadius;
-};
-
-void createShadowTestData(ShadowTestData* out) {
- static float SAMPLE_DRAW_TRANSFORM[] = {
- 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
- };
- static float SAMPLE_CASTERXY[] = {
- 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 32, 32, 0, 1,
- };
- static float SAMPLE_CASTERZ[] = {
- 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 32, 32, 32, 1,
- };
- static Rect SAMPLE_CLIP(0, 0, 1536, 2048);
- static Vector3 SAMPLE_LIGHT_CENTER{768, -400, 1600};
- static float SAMPLE_LIGHT_RADIUS = 1600;
-
- out->drawTransform.load(SAMPLE_DRAW_TRANSFORM);
- out->localClip = SAMPLE_CLIP;
- out->casterTransformXY.load(SAMPLE_CASTERXY);
- out->casterTransformZ.load(SAMPLE_CASTERZ);
- out->lightCenter = SAMPLE_LIGHT_CENTER;
- out->lightRadius = SAMPLE_LIGHT_RADIUS;
-}
-
-static inline void tessellateShadows(ShadowTestData& testData, bool opaque, const SkPath& shape,
- VertexBuffer* ambient, VertexBuffer* spot) {
- tessellateShadows(&testData.drawTransform, &testData.localClip, opaque, &shape,
- &testData.casterTransformXY, &testData.casterTransformZ, testData.lightCenter,
- testData.lightRadius, *ambient, *spot);
-}
-
-void BM_TessellateShadows_roundrect_opaque(benchmark::State& state) {
- ShadowTestData shadowData;
- createShadowTestData(&shadowData);
- SkPath path;
- path.addRoundRect(SkRect::MakeWH(100, 100), 5, 5);
-
- while (state.KeepRunning()) {
- VertexBuffer ambient;
- VertexBuffer spot;
- tessellateShadows(shadowData, true, path, &ambient, &spot);
- benchmark::DoNotOptimize(&ambient);
- benchmark::DoNotOptimize(&spot);
- }
-}
-BENCHMARK(BM_TessellateShadows_roundrect_opaque);
-
-void BM_TessellateShadows_roundrect_translucent(benchmark::State& state) {
- ShadowTestData shadowData;
- createShadowTestData(&shadowData);
- SkPath path;
- path.reset();
- path.addRoundRect(SkRect::MakeLTRB(0, 0, 100, 100), 5, 5);
-
- while (state.KeepRunning()) {
- std::unique_ptr<VertexBuffer> ambient(new VertexBuffer);
- std::unique_ptr<VertexBuffer> spot(new VertexBuffer);
- tessellateShadows(shadowData, false, path, ambient.get(), spot.get());
- benchmark::DoNotOptimize(ambient.get());
- benchmark::DoNotOptimize(spot.get());
- }
-}
-BENCHMARK(BM_TessellateShadows_roundrect_translucent);
diff --git a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp b/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp
deleted file mode 100644
index 09f0b06ded39..000000000000
--- a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include <BakedOpDispatcher.h>
-#include <BakedOpRenderer.h>
-#include <FrameBuilder.h>
-#include <LayerUpdateQueue.h>
-#include <RecordedOp.h>
-#include <hwui/Paint.h>
-#include <tests/common/TestUtils.h>
-#include <utils/Color.h>
-
-#include <SkBlurDrawLooper.h>
-#include <SkDashPathEffect.h>
-#include <SkPath.h>
-
-using namespace android::uirenderer;
-
-static BakedOpRenderer::LightInfo sLightInfo;
-const FrameBuilder::LightGeometry sLightGeometry = {{100, 100, 100}, 50};
-
-class ValidatingBakedOpRenderer : public BakedOpRenderer {
-public:
- ValidatingBakedOpRenderer(RenderState& renderState,
- std::function<void(const Glop& glop)> validator)
- : BakedOpRenderer(Caches::getInstance(), renderState, true, false, sLightInfo)
- , mValidator(validator) {
- mGlopReceiver = ValidatingGlopReceiver;
- }
-
-private:
- static void ValidatingGlopReceiver(BakedOpRenderer& renderer, const Rect* dirtyBounds,
- const ClipBase* clip, const Glop& glop) {
- auto vbor = reinterpret_cast<ValidatingBakedOpRenderer*>(&renderer);
- vbor->mValidator(glop);
- }
- std::function<void(const Glop& glop)> mValidator;
-};
-
-typedef void (*TestBakedOpReceiver)(BakedOpRenderer&, const BakedOpState&);
-
-static void testUnmergedGlopDispatch(renderthread::RenderThread& renderThread, RecordedOp* op,
- std::function<void(const Glop& glop)> glopVerifier,
- int expectedGlopCount = 1) {
- // Create op, and wrap with basic state.
- LinearAllocator allocator;
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 100));
- auto state = BakedOpState::tryConstruct(allocator, *snapshot, *op);
- ASSERT_NE(nullptr, state);
-
- int glopCount = 0;
- auto glopReceiver = [&glopVerifier, &glopCount, &expectedGlopCount](const Glop& glop) {
- ASSERT_LE(glopCount++, expectedGlopCount) << expectedGlopCount << "glop(s) expected";
- glopVerifier(glop);
- };
- ValidatingBakedOpRenderer renderer(renderThread.renderState(), glopReceiver);
-
-// Dispatch based on op type created, similar to Frame/LayerBuilder dispatch behavior
-#define X(Type) \
- [](BakedOpRenderer& renderer, const BakedOpState& state) { \
- BakedOpDispatcher::on##Type(renderer, static_cast<const Type&>(*(state.op)), state); \
- },
- static TestBakedOpReceiver unmergedReceivers[] = BUILD_RENDERABLE_OP_LUT(X);
-#undef X
- unmergedReceivers[op->opId](renderer, *state);
- ASSERT_EQ(expectedGlopCount, glopCount) << "Exactly " << expectedGlopCount
- << "Glop(s) expected";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, pathTexture_positionOvalArc) {
- SkPaint strokePaint;
- strokePaint.setStyle(SkPaint::kStroke_Style);
- strokePaint.setStrokeWidth(4);
-
- float intervals[] = {1.0f, 1.0f};
- strokePaint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 0));
-
- auto textureGlopVerifier = [](const Glop& glop) {
- // validate glop produced by renderPathTexture (so texture, unit quad)
- auto texture = glop.fill.texture.texture;
- ASSERT_NE(nullptr, texture);
- float expectedOffset = floor(4 * 1.5f + 0.5f);
- EXPECT_EQ(expectedOffset, reinterpret_cast<PathTexture*>(texture)->offset)
- << "Should see conservative offset from PathCache::computeBounds";
- Rect expectedBounds(10, 15, 20, 25);
- expectedBounds.outset(expectedOffset);
-
- Matrix4 expectedModelView;
- expectedModelView.loadTranslate(10 - expectedOffset, 15 - expectedOffset, 0);
- expectedModelView.scale(10 + 2 * expectedOffset, 10 + 2 * expectedOffset, 1);
- EXPECT_EQ(expectedModelView, glop.transform.modelView)
- << "X and Y offsets, and scale both applied to model view";
- };
-
- // Arc and Oval will render functionally the same glop, differing only in texture content
- ArcOp arcOp(Rect(10, 15, 20, 25), Matrix4::identity(), nullptr, &strokePaint, 0, 270, true);
- testUnmergedGlopDispatch(renderThread, &arcOp, textureGlopVerifier);
-
- OvalOp ovalOp(Rect(10, 15, 20, 25), Matrix4::identity(), nullptr, &strokePaint);
- testUnmergedGlopDispatch(renderThread, &ovalOp, textureGlopVerifier);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, onLayerOp_bufferless) {
- SkPaint layerPaint;
- layerPaint.setAlpha(128);
- OffscreenBuffer* buffer = nullptr; // no providing a buffer, should hit rect fallback case
- LayerOp op(Rect(10, 10), Matrix4::identity(), nullptr, &layerPaint, &buffer);
- testUnmergedGlopDispatch(renderThread, &op,
- [](const Glop& glop) { ADD_FAILURE() << "Nothing should happen"; }, 0);
-}
-
-static int getGlopTransformFlags(renderthread::RenderThread& renderThread, RecordedOp* op) {
- int result = 0;
- testUnmergedGlopDispatch(renderThread, op, [&result](const Glop& glop) {
- result = glop.transform.transformFlags;
- });
- return result;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, offsetFlags) {
- Rect bounds(10, 15, 20, 25);
- SkPaint paint;
- SkPaint aaPaint;
- aaPaint.setAntiAlias(true);
-
- RoundRectOp roundRectOp(bounds, Matrix4::identity(), nullptr, &paint, 0, 270);
- EXPECT_EQ(TransformFlags::None, getGlopTransformFlags(renderThread, &roundRectOp))
- << "Expect no offset for round rect op.";
-
- const float points[4] = {0.5, 0.5, 1.0, 1.0};
- PointsOp antiAliasedPointsOp(bounds, Matrix4::identity(), nullptr, &aaPaint, points, 4);
- EXPECT_EQ(TransformFlags::None, getGlopTransformFlags(renderThread, &antiAliasedPointsOp))
- << "Expect no offset for AA points.";
- PointsOp pointsOp(bounds, Matrix4::identity(), nullptr, &paint, points, 4);
- EXPECT_EQ(TransformFlags::OffsetByFudgeFactor, getGlopTransformFlags(renderThread, &pointsOp))
- << "Expect an offset for non-AA points.";
-
- LinesOp antiAliasedLinesOp(bounds, Matrix4::identity(), nullptr, &aaPaint, points, 4);
- EXPECT_EQ(TransformFlags::None, getGlopTransformFlags(renderThread, &antiAliasedLinesOp))
- << "Expect no offset for AA lines.";
- LinesOp linesOp(bounds, Matrix4::identity(), nullptr, &paint, points, 4);
- EXPECT_EQ(TransformFlags::OffsetByFudgeFactor, getGlopTransformFlags(renderThread, &linesOp))
- << "Expect an offset for non-AA lines.";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, renderTextWithShadow) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
-
- android::Paint shadowPaint;
- shadowPaint.setColor(SK_ColorRED);
-
- SkScalar sigma = Blur::convertRadiusToSigma(5);
- shadowPaint.setLooper(SkBlurDrawLooper::Make(SK_ColorWHITE, sigma, 3, 3));
-
- TestUtils::drawUtf8ToCanvas(&canvas, "A", shadowPaint, 25, 25);
- TestUtils::drawUtf8ToCanvas(&canvas, "B", shadowPaint, 50, 50);
- });
-
- int glopCount = 0;
- auto glopReceiver = [&glopCount](const Glop& glop) {
- if (glopCount < 2) {
- // two white shadows
- EXPECT_EQ(FloatColor({1, 1, 1, 1}), glop.fill.color);
- } else {
- // two text draws merged into one, drawn after both shadows
- EXPECT_EQ(FloatColor({1, 0, 0, 1}), glop.fill.color);
- }
- glopCount++;
- };
-
- ValidatingBakedOpRenderer renderer(renderThread.renderState(), glopReceiver);
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
- ASSERT_EQ(3, glopCount) << "Exactly three glops expected";
-}
-
-static void validateLayerDraw(renderthread::RenderThread& renderThread,
- std::function<void(const Glop& glop)> validator) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
-
- // provide different blend mode, so decoration draws contrast
- props.mutateLayerProperties().setXferMode(SkBlendMode::kSrc);
- canvas.drawColor(Color::Black, SkBlendMode::kSrcOver);
- });
- OffscreenBuffer** layerHandle = node->getLayerHandle();
-
- auto syncedNode = TestUtils::getSyncedNode(node);
-
- // create RenderNode's layer here in same way prepareTree would
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- *layerHandle = &layer;
- {
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(node.get(), Rect(0, 0, 100, 100));
-
- ValidatingBakedOpRenderer renderer(renderThread.renderState(), validator);
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
- }
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-static FloatColor makeFloatColor(uint32_t color) {
- FloatColor c;
- c.set(color);
- return c;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, layerUpdateProperties) {
- for (bool debugOverdraw : {false, true}) {
- for (bool debugLayersUpdates : {false, true}) {
- ScopedProperty<bool> ovdProp(Properties::debugOverdraw, debugOverdraw);
- ScopedProperty<bool> lupProp(Properties::debugLayersUpdates, debugLayersUpdates);
-
- int glopCount = 0;
- validateLayerDraw(renderThread, [&glopCount, &debugLayersUpdates](const Glop& glop) {
- if (glopCount == 0) {
- // 0 - Black layer fill
- EXPECT_TRUE(glop.fill.colorEnabled);
- EXPECT_EQ(makeFloatColor(Color::Black), glop.fill.color);
- } else if (glopCount == 1) {
- // 1 - Uncolored (textured) layer draw
- EXPECT_FALSE(glop.fill.colorEnabled);
- } else if (glopCount == 2) {
- // 2 - layer overlay, if present
- EXPECT_TRUE(glop.fill.colorEnabled);
- // blend srcover, different from that of layer
- EXPECT_EQ(GLenum(GL_ONE), glop.blend.src);
- EXPECT_EQ(GLenum(GL_ONE_MINUS_SRC_ALPHA), glop.blend.dst);
- EXPECT_EQ(makeFloatColor(debugLayersUpdates ? 0x7f00ff00 : 0), glop.fill.color)
- << "Should be transparent green if debugLayersUpdates";
- } else if (glopCount < 7) {
- // 3 - 6 - overdraw indicator overlays, if present
- EXPECT_TRUE(glop.fill.colorEnabled);
- uint32_t expectedColor = Caches::getInstance().getOverdrawColor(glopCount - 2);
- ASSERT_EQ(makeFloatColor(expectedColor), glop.fill.color);
- } else {
- ADD_FAILURE() << "Too many glops observed";
- }
- glopCount++;
- });
- int expectedCount = 2;
- if (debugLayersUpdates || debugOverdraw) expectedCount++;
- if (debugOverdraw) expectedCount += 4;
- EXPECT_EQ(expectedCount, glopCount);
- }
- }
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpDispatcher, pathTextureSnapping) {
- Rect bounds(10, 15, 20, 25);
- SkPaint paint;
- SkPath path;
- path.addRect(SkRect::MakeXYWH(1.5, 3.8, 100, 90));
- PathOp op(bounds, Matrix4::identity(), nullptr, &paint, &path);
- testUnmergedGlopDispatch(renderThread, &op, [](const Glop& glop) {
- auto texture = glop.fill.texture.texture;
- ASSERT_NE(nullptr, texture);
- EXPECT_EQ(1, reinterpret_cast<PathTexture*>(texture)->left);
- EXPECT_EQ(3, reinterpret_cast<PathTexture*>(texture)->top);
- });
-}
diff --git a/libs/hwui/tests/unit/BakedOpRendererTests.cpp b/libs/hwui/tests/unit/BakedOpRendererTests.cpp
deleted file mode 100644
index 1a3ec39a00d0..000000000000
--- a/libs/hwui/tests/unit/BakedOpRendererTests.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include <BakedOpRenderer.h>
-#include <GlopBuilder.h>
-#include <tests/common/TestUtils.h>
-
-using namespace android::uirenderer;
-
-const BakedOpRenderer::LightInfo sLightInfo = {128, 128};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, startRepaintLayer_clear) {
- BakedOpRenderer renderer(Caches::getInstance(), renderThread.renderState(), true, false,
- sLightInfo);
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 200u, 200u);
-
- layer.dirty(Rect(200, 200));
- {
- renderer.startRepaintLayer(&layer, Rect(200, 200));
- EXPECT_TRUE(layer.region.isEmpty()) << "Repaint full layer should clear region";
- renderer.endLayer();
- }
-
- layer.dirty(Rect(200, 200));
- {
- renderer.startRepaintLayer(&layer, Rect(100, 200)); // repainting left side
- EXPECT_TRUE(layer.region.isRect());
- // ALOGD("bounds %d %d %d %d", RECT_ARGS(layer.region.getBounds()));
- EXPECT_EQ(android::Rect(100, 0, 200, 200), layer.region.getBounds())
- << "Left side being repainted, so right side should be clear";
- renderer.endLayer();
- }
-
- // right side is now only dirty portion
- {
- renderer.startRepaintLayer(&layer, Rect(100, 0, 200, 200)); // repainting right side
- EXPECT_TRUE(layer.region.isEmpty())
- << "Now right side being repainted, so region should be entirely clear";
- renderer.endLayer();
- }
-}
-
-static void drawFirstOp(RenderState& renderState, int color, SkBlendMode mode) {
- BakedOpRenderer renderer(Caches::getInstance(), renderState, true, false, sLightInfo);
-
- renderer.startFrame(100, 100, Rect(100, 100));
- SkPaint paint;
- paint.setColor(color);
- paint.setBlendMode(mode);
-
- Rect dest(0, 0, 100, 100);
- Glop glop;
- GlopBuilder(renderState, Caches::getInstance(), &glop)
- .setRoundRectClipState(nullptr)
- .setMeshUnitQuad()
- .setFillPaint(paint, 1.0f)
- .setTransform(Matrix4::identity(), TransformFlags::None)
- .setModelViewMapUnitToRectSnap(dest)
- .build();
- renderer.renderGlop(nullptr, nullptr, glop);
- renderer.endFrame(Rect(100, 100));
-}
-
-static void verifyBlend(RenderState& renderState, GLenum expectedSrc, GLenum expectedDst) {
- EXPECT_TRUE(renderState.blend().getEnabled());
- GLenum src;
- GLenum dst;
- renderState.blend().getFactors(&src, &dst);
- EXPECT_EQ(expectedSrc, src);
- EXPECT_EQ(expectedDst, dst);
-}
-
-static void verifyBlendDisabled(RenderState& renderState) {
- EXPECT_FALSE(renderState.blend().getEnabled());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_clear) {
- // initialize blend state to nonsense value
- renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE);
-
- drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kClear);
- verifyBlend(renderThread.renderState(), GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(BakedOpRenderer, firstDrawBlend_srcover) {
- // initialize blend state to nonsense value
- renderThread.renderState().blend().setFactors(GL_ONE, GL_ONE);
-
- drawFirstOp(renderThread.renderState(), 0xfeff0000, SkBlendMode::kSrcOver);
- verifyBlendDisabled(renderThread.renderState());
-}
diff --git a/libs/hwui/tests/unit/BakedOpStateTests.cpp b/libs/hwui/tests/unit/BakedOpStateTests.cpp
deleted file mode 100644
index 6f8e24917767..000000000000
--- a/libs/hwui/tests/unit/BakedOpStateTests.cpp
+++ /dev/null
@@ -1,266 +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.
- */
-
-#include <gtest/gtest.h>
-
-#include <BakedOpState.h>
-#include <ClipArea.h>
-#include <RecordedOp.h>
-#include <tests/common/TestUtils.h>
-
-namespace android {
-namespace uirenderer {
-
-TEST(ResolvedRenderState, construct) {
- LinearAllocator allocator;
- Matrix4 translate10x20;
- translate10x20.loadTranslate(10, 20, 0);
-
- SkPaint paint;
- ClipRect clip(Rect(100, 200));
- RectOp recordedOp(Rect(30, 40, 100, 200), translate10x20, &clip, &paint);
- {
- // recorded with transform, no parent transform
- auto parentSnapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200));
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, false, false);
- EXPECT_MATRIX_APPROX_EQ(state.transform, translate10x20);
- EXPECT_EQ(Rect(100, 200), state.clipRect());
- EXPECT_EQ(Rect(40, 60, 100, 200), state.clippedBounds); // translated and also clipped
- EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags);
- }
- {
- // recorded with transform and parent transform
- auto parentSnapshot = TestUtils::makeSnapshot(translate10x20, Rect(100, 200));
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, false, false);
-
- Matrix4 expectedTranslate;
- expectedTranslate.loadTranslate(20, 40, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedTranslate, state.transform);
-
- // intersection of parent & transformed child clip
- EXPECT_EQ(Rect(10, 20, 100, 200), state.clipRect());
-
- // translated and also clipped
- EXPECT_EQ(Rect(50, 80, 100, 200), state.clippedBounds);
- EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags);
- }
-}
-
-TEST(ResolvedRenderState, computeLocalSpaceClip) {
- LinearAllocator allocator;
- Matrix4 translate10x20;
- translate10x20.loadTranslate(10, 20, 0);
-
- SkPaint paint;
- ClipRect clip(Rect(100, 200));
- RectOp recordedOp(Rect(1000, 1000), translate10x20, &clip, &paint);
- {
- // recorded with transform, no parent transform
- auto parentSnapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200));
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, false, false);
- EXPECT_EQ(Rect(-10, -20, 90, 180), state.computeLocalSpaceClip())
- << "Local clip rect should be 100x200, offset by -10,-20";
- }
- {
- // recorded with transform + parent transform
- auto parentSnapshot = TestUtils::makeSnapshot(translate10x20, Rect(100, 200));
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, false, false);
- EXPECT_EQ(Rect(-10, -20, 80, 160), state.computeLocalSpaceClip())
- << "Local clip rect should be 90x190, offset by -10,-20";
- }
-}
-
-const float HAIRLINE = 0.0f;
-
-// Note: bounds will be conservative, but not precise for non-hairline
-// - use approx bounds checks for these
-const float SEMI_HAIRLINE = 0.3f;
-
-struct StrokeTestCase {
- float scale;
- float strokeWidth;
- const std::function<void(const ResolvedRenderState&)> validator;
-};
-
-const static StrokeTestCase sStrokeTestCases[] = {
- {1, HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_EQ(Rect(49.5f, 49.5f, 150.5f, 150.5f), state.clippedBounds);
- }},
- {1, SEMI_HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(49.5f, 49.5f, 150.5f, 150.5f));
- EXPECT_TRUE(Rect(49, 49, 151, 151).contains(state.clippedBounds));
- }},
- {1, 20,
- [](const ResolvedRenderState& state) {
- EXPECT_EQ(Rect(40, 40, 160, 160), state.clippedBounds);
- }},
-
- // 3x3 scale:
- {3, HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_EQ(Rect(149.5f, 149.5f, 200, 200), state.clippedBounds);
- EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom, state.clipSideFlags);
- }},
- {3, SEMI_HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(149.5f, 149.5f, 200, 200));
- EXPECT_TRUE(Rect(149, 149, 200, 200).contains(state.clippedBounds));
- }},
- {3, 20,
- [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(120, 120, 200, 200));
- EXPECT_TRUE(Rect(119, 119, 200, 200).contains(state.clippedBounds));
- }},
-
- // 0.5f x 0.5f scale
- {0.5f, HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_EQ(Rect(24.5f, 24.5f, 75.5f, 75.5f), state.clippedBounds);
- }},
- {0.5f, SEMI_HAIRLINE,
- [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(24.5f, 24.5f, 75.5f, 75.5f));
- EXPECT_TRUE(Rect(24, 24, 76, 76).contains(state.clippedBounds));
- }},
- {0.5f, 20, [](const ResolvedRenderState& state) {
- EXPECT_TRUE(state.clippedBounds.contains(19.5f, 19.5f, 80.5f, 80.5f));
- EXPECT_TRUE(Rect(19, 19, 81, 81).contains(state.clippedBounds));
- }}};
-
-TEST(ResolvedRenderState, construct_expandForStroke) {
- LinearAllocator allocator;
- // Loop over table of test cases and verify different combinations of stroke width and transform
- for (auto&& testCase : sStrokeTestCases) {
- SkPaint strokedPaint;
- strokedPaint.setAntiAlias(true);
- strokedPaint.setStyle(SkPaint::kStroke_Style);
- strokedPaint.setStrokeWidth(testCase.strokeWidth);
-
- ClipRect clip(Rect(200, 200));
- RectOp recordedOp(Rect(50, 50, 150, 150), Matrix4::identity(), &clip, &strokedPaint);
-
- Matrix4 snapshotMatrix;
- snapshotMatrix.loadScale(testCase.scale, testCase.scale, 1);
- auto parentSnapshot = TestUtils::makeSnapshot(snapshotMatrix, Rect(200, 200));
-
- ResolvedRenderState state(allocator, *parentSnapshot, recordedOp, true, false);
- testCase.validator(state);
- }
-}
-
-TEST(BakedOpState, tryConstruct) {
- Matrix4 translate100x0;
- translate100x0.loadTranslate(100, 0, 0);
-
- SkPaint paint;
- ClipRect clip(Rect(100, 200));
-
- LinearAllocator allocator;
- RectOp successOp(Rect(30, 40, 100, 200), Matrix4::identity(), &clip, &paint);
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(100, 200));
- EXPECT_NE(nullptr, BakedOpState::tryConstruct(allocator, *snapshot, successOp))
- << "successOp NOT rejected by clip, so should be constructed";
- size_t successAllocSize = allocator.usedSize();
- EXPECT_LE(64u, successAllocSize) << "relatively large alloc for non-rejected op";
-
- RectOp rejectOp(Rect(30, 40, 100, 200), translate100x0, &clip, &paint);
- EXPECT_EQ(nullptr, BakedOpState::tryConstruct(allocator, *snapshot, rejectOp))
- << "rejectOp rejected by clip, so should not be constructed";
-
- // NOTE: this relies on the clip having already been serialized by the op above
- EXPECT_EQ(successAllocSize, allocator.usedSize()) << "no extra allocation used for rejected op";
-}
-
-TEST(BakedOpState, tryShadowOpConstruct) {
- Matrix4 translate10x20;
- translate10x20.loadTranslate(10, 20, 0);
-
- LinearAllocator allocator;
- {
- auto snapshot = TestUtils::makeSnapshot(translate10x20, Rect()); // Note: empty clip
- BakedOpState* bakedState =
- BakedOpState::tryShadowOpConstruct(allocator, *snapshot, (ShadowOp*)0x1234);
-
- EXPECT_EQ(nullptr, bakedState) << "op should be rejected by clip, so not constructed";
- EXPECT_EQ(0u, allocator.usedSize()) << "no serialization, even for clip,"
- "since op is quick rejected based on snapshot clip";
- }
- {
- auto snapshot = TestUtils::makeSnapshot(translate10x20, Rect(100, 200));
- BakedOpState* bakedState =
- BakedOpState::tryShadowOpConstruct(allocator, *snapshot, (ShadowOp*)0x1234);
-
- ASSERT_NE(nullptr, bakedState) << "NOT rejected by clip, so op should be constructed";
- EXPECT_LE(64u, allocator.usedSize()) << "relatively large alloc for non-rejected op";
-
- EXPECT_MATRIX_APPROX_EQ(translate10x20, bakedState->computedState.transform);
- EXPECT_EQ(Rect(100, 200), bakedState->computedState.clippedBounds);
- }
-}
-
-TEST(BakedOpState, tryStrokeableOpConstruct) {
- LinearAllocator allocator;
- {
- // check regular rejection
- SkPaint paint;
- paint.setStyle(SkPaint::kStrokeAndFill_Style);
- paint.setStrokeWidth(0.0f);
- ClipRect clip(Rect(100, 200));
- RectOp rejectOp(Rect(100, 200), Matrix4::identity(), &clip, &paint);
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect()); // Note: empty clip
- auto bakedState = BakedOpState::tryStrokeableOpConstruct(
- allocator, *snapshot, rejectOp, BakedOpState::StrokeBehavior::StyleDefined, false);
-
- EXPECT_EQ(nullptr, bakedState);
- EXPECT_GT(8u,
- allocator.usedSize()); // no significant allocation space used for rejected op
- }
- {
- // check simple unscaled expansion
- SkPaint paint;
- paint.setStyle(SkPaint::kStrokeAndFill_Style);
- paint.setStrokeWidth(10.0f);
- ClipRect clip(Rect(200, 200));
- RectOp rejectOp(Rect(50, 50, 150, 150), Matrix4::identity(), &clip, &paint);
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(200, 200));
- auto bakedState = BakedOpState::tryStrokeableOpConstruct(
- allocator, *snapshot, rejectOp, BakedOpState::StrokeBehavior::StyleDefined, false);
-
- ASSERT_NE(nullptr, bakedState);
- EXPECT_EQ(Rect(45, 45, 155, 155), bakedState->computedState.clippedBounds);
- EXPECT_EQ(0, bakedState->computedState.clipSideFlags);
- }
- {
- // check simple unscaled expansion, and fill style with stroke forced
- SkPaint paint;
- paint.setStyle(SkPaint::kFill_Style);
- paint.setStrokeWidth(10.0f);
- ClipRect clip(Rect(200, 200));
- RectOp rejectOp(Rect(50, 50, 150, 150), Matrix4::identity(), &clip, &paint);
- auto snapshot = TestUtils::makeSnapshot(Matrix4::identity(), Rect(200, 200));
- auto bakedState = BakedOpState::tryStrokeableOpConstruct(
- allocator, *snapshot, rejectOp, BakedOpState::StrokeBehavior::Forced, false);
-
- ASSERT_NE(nullptr, bakedState);
- EXPECT_EQ(Rect(45, 45, 155, 155), bakedState->computedState.clippedBounds);
- EXPECT_EQ(0, bakedState->computedState.clipSideFlags);
- }
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/tests/unit/FontRendererTests.cpp b/libs/hwui/tests/unit/FontRendererTests.cpp
deleted file mode 100644
index c78f131ce2ce..000000000000
--- a/libs/hwui/tests/unit/FontRendererTests.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include "GammaFontRenderer.h"
-#include "tests/common/TestUtils.h"
-
-using namespace android::uirenderer;
-
-static bool isZero(uint8_t* data, int size) {
- for (int i = 0; i < size; i++) {
- if (data[i]) return false;
- }
- return true;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FontRenderer, renderDropShadow) {
- SkPaint paint;
- paint.setTextSize(10);
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- GammaFontRenderer gammaFontRenderer;
- FontRenderer& fontRenderer = gammaFontRenderer.getFontRenderer();
- fontRenderer.setFont(&paint, SkMatrix::I());
-
- std::vector<glyph_t> glyphs;
- std::vector<float> positions;
- float totalAdvance;
- Rect bounds;
- TestUtils::layoutTextUnscaled(paint, "This is a test", &glyphs, &positions, &totalAdvance,
- &bounds);
-
- for (int radius : {28, 20, 2}) {
- auto result = fontRenderer.renderDropShadow(&paint, glyphs.data(), glyphs.size(), radius,
- positions.data());
- ASSERT_NE(nullptr, result.image);
- EXPECT_FALSE(isZero(result.image, result.width * result.height));
- EXPECT_LE(bounds.getWidth() + radius * 2, (int)result.width);
- EXPECT_LE(bounds.getHeight() + radius * 2, (int)result.height);
- delete result.image;
- }
-}
diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp
deleted file mode 100644
index 4eb77514f4ae..000000000000
--- a/libs/hwui/tests/unit/FrameBuilderTests.cpp
+++ /dev/null
@@ -1,2705 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include <BakedOpState.h>
-#include <DeferredLayerUpdater.h>
-#include <FrameBuilder.h>
-#include <GlLayer.h>
-#include <LayerUpdateQueue.h>
-#include <RecordedOp.h>
-#include <RecordingCanvas.h>
-#include <tests/common/TestUtils.h>
-
-#include <unordered_map>
-
-namespace android {
-namespace uirenderer {
-
-const FrameBuilder::LightGeometry sLightGeometry = {{100, 100, 100}, 50};
-
-/**
- * Virtual class implemented by each test to redirect static operation / state transitions to
- * virtual methods.
- *
- * Virtual dispatch allows for default behaviors to be specified (very common case in below tests),
- * and allows Renderer vs Dispatching behavior to be merged.
- *
- * onXXXOp methods fail by default - tests should override ops they expect
- * startRepaintLayer fails by default - tests should override if expected
- * startFrame/endFrame do nothing by default - tests should override to intercept
- */
-class TestRendererBase {
-public:
- virtual ~TestRendererBase() {}
- virtual OffscreenBuffer* startTemporaryLayer(uint32_t, uint32_t) {
- ADD_FAILURE() << "Temporary layers not expected in this test";
- return nullptr;
- }
- virtual void recycleTemporaryLayer(OffscreenBuffer*) {
- ADD_FAILURE() << "Temporary layers not expected in this test";
- }
- virtual void startRepaintLayer(OffscreenBuffer*, const Rect& repaintRect) {
- ADD_FAILURE() << "Layer repaint not expected in this test";
- }
- virtual void endLayer() { ADD_FAILURE() << "Layer updates not expected in this test"; }
- virtual void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) {}
- virtual void endFrame(const Rect& repaintRect) {}
-
-// define virtual defaults for single draw methods
-#define X(Type) \
- virtual void on##Type(const Type&, const BakedOpState&) { \
- ADD_FAILURE() << #Type " not expected in this test"; \
- }
- MAP_RENDERABLE_OPS(X)
-#undef X
-
-// define virtual defaults for merged draw methods
-#define X(Type) \
- virtual void onMerged##Type##s(const MergedBakedOpList& opList) { \
- ADD_FAILURE() << "Merged " #Type "s not expected in this test"; \
- }
- MAP_MERGEABLE_OPS(X)
-#undef X
-
- int getIndex() { return mIndex; }
-
-protected:
- int mIndex = 0;
-};
-
-/**
- * Dispatches all static methods to similar formed methods on renderer, which fail by default but
- * are overridden by subclasses per test.
- */
-class TestDispatcher {
-public:
-// define single op methods, which redirect to TestRendererBase
-#define X(Type) \
- static void on##Type(TestRendererBase& renderer, const Type& op, const BakedOpState& state) { \
- renderer.on##Type(op, state); \
- }
- MAP_RENDERABLE_OPS(X);
-#undef X
-
-// define merged op methods, which redirect to TestRendererBase
-#define X(Type) \
- static void onMerged##Type##s(TestRendererBase& renderer, const MergedBakedOpList& opList) { \
- renderer.onMerged##Type##s(opList); \
- }
- MAP_MERGEABLE_OPS(X);
-#undef X
-};
-
-class FailRenderer : public TestRendererBase {};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, simple) {
- class SimpleTestRenderer : public TestRendererBase {
- public:
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(100u, width);
- EXPECT_EQ(200u, height);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- }
- void onBitmapOp(const BitmapOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(3, mIndex++); }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(25, 25));
- canvas.drawRect(0, 0, 100, 200, SkPaint());
- canvas.drawBitmap(*bitmap, 10, 10, nullptr);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 200), 100, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SimpleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex()); // 2 ops + start + end
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, simpleStroke) {
- class SimpleStrokeTestRenderer : public TestRendererBase {
- public:
- void onPointsOp(const PointsOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- // even though initial bounds are empty...
- EXPECT_TRUE(op.unmappedBounds.isEmpty())
- << "initial bounds should be empty, since they're unstroked";
- EXPECT_EQ(Rect(45, 45, 55, 55), state.computedState.clippedBounds)
- << "final bounds should account for stroke";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint strokedPaint;
- strokedPaint.setStrokeWidth(10);
- canvas.drawPoint(50, 50, strokedPaint);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 200), 100, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SimpleStrokeTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, arcStrokeClip) {
- class ArcStrokeClipTestRenderer : public TestRendererBase {
- public:
- void onArcOp(const ArcOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(25, 25, 175, 175), op.unmappedBounds);
- EXPECT_EQ(Rect(25, 25, 175, 175), state.computedState.clippedBounds);
- EXPECT_EQ(OpClipSideFlags::Full, state.computedState.clipSideFlags)
- << "Arc op clipped conservatively, since path texture may be expanded";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.clipRect(25, 25, 175, 175, SkClipOp::kIntersect);
- SkPaint aaPaint;
- aaPaint.setAntiAlias(true);
- canvas.drawArc(25, 25, 175, 175, 40, 180, true, aaPaint);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- ArcStrokeClipTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, simpleRejection) {
- auto node = TestUtils::createNode<RecordingCanvas>(0, 0, 200, 200, [](RenderProperties& props,
- RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(200, 200, 400, 400, SkClipOp::kIntersect); // intersection should be empty
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.restore();
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- FailRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, simpleBatching) {
- const int LOOPS = 5;
- class SimpleBatchingTestRenderer : public TestRendererBase {
- public:
- void onBitmapOp(const BitmapOp& op, const BakedOpState& state) override {
- EXPECT_TRUE(mIndex++ >= LOOPS) << "Bitmaps should be above all rects";
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_TRUE(mIndex++ < LOOPS) << "Rects should be below all bitmaps";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
-
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(
- 10, 10,
- kAlpha_8_SkColorType)); // Disable merging by using alpha 8 bitmap
-
- // Alternate between drawing rects and bitmaps, with bitmaps overlapping rects.
- // Rects don't overlap bitmaps, so bitmaps should be brought to front as a group.
- canvas.save(SaveFlags::MatrixClip);
- for (int i = 0; i < LOOPS; i++) {
- canvas.translate(0, 10);
- canvas.drawRect(0, 0, 10, 10, SkPaint());
- canvas.drawBitmap(*bitmap, 5, 0, nullptr);
- }
- canvas.restore();
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SimpleBatchingTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2 * LOOPS, renderer.getIndex()) << "Expect number of ops = 2 * loop count";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, deferRenderNode_translateClip) {
- class DeferRenderNodeTranslateClipTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(5, 10, 55, 60), state.computedState.clippedBounds);
- EXPECT_EQ(OpClipSideFlags::Right | OpClipSideFlags::Bottom,
- state.computedState.clipSideFlags);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(5, 10, Rect(50, 50), // translate + clip node
- *TestUtils::getSyncedNode(node));
-
- DeferRenderNodeTranslateClipTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, deferRenderNodeScene) {
- class DeferRenderNodeSceneTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- const Rect& clippedBounds = state.computedState.clippedBounds;
- Matrix4 expected;
- switch (mIndex++) {
- case 0:
- // background - left side
- EXPECT_EQ(Rect(600, 100, 700, 500), clippedBounds);
- expected.loadTranslate(100, 100, 0);
- break;
- case 1:
- // background - top side
- EXPECT_EQ(Rect(100, 400, 600, 500), clippedBounds);
- expected.loadTranslate(100, 100, 0);
- break;
- case 2:
- // content
- EXPECT_EQ(Rect(100, 100, 700, 500), clippedBounds);
- expected.loadTranslate(-50, -50, 0);
- break;
- case 3:
- // overlay
- EXPECT_EQ(Rect(0, 0, 800, 200), clippedBounds);
- break;
- default:
- ADD_FAILURE() << "Too many rects observed";
- }
- EXPECT_EQ(expected, state.computedState.transform);
- }
- };
-
- std::vector<sp<RenderNode>> nodes;
- SkPaint transparentPaint;
- transparentPaint.setAlpha(128);
-
- // backdrop
- nodes.push_back(TestUtils::createNode<RecordingCanvas>(
- 100, 100, 700, 500, // 600x400
- [&transparentPaint](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 600, 400, transparentPaint);
- }));
-
- // content
- Rect contentDrawBounds(150, 150, 650, 450); // 500x300
- nodes.push_back(TestUtils::createNode<RecordingCanvas>(
- 0, 0, 800, 600, [&transparentPaint](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 800, 600, transparentPaint);
- }));
-
- // overlay
- nodes.push_back(TestUtils::createNode<RecordingCanvas>(
- 0, 0, 800, 600, [&transparentPaint](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 800, 200, transparentPaint);
- }));
-
- for (auto& node : nodes) {
- TestUtils::syncHierarchyPropertiesAndDisplayList(node);
- }
-
- {
- FrameBuilder frameBuilder(SkRect::MakeWH(800, 600), 800, 600, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNodeScene(nodes, contentDrawBounds);
-
- DeferRenderNodeSceneTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
- }
-
- for (auto& node : nodes) {
- EXPECT_TRUE(node->isValid());
- EXPECT_FALSE(node->nothingToDraw());
- node->setStagingDisplayList(nullptr);
- EXPECT_FALSE(node->isValid());
- EXPECT_FALSE(node->nothingToDraw());
- node->destroyHardwareResources();
- EXPECT_TRUE(node->nothingToDraw());
- EXPECT_FALSE(node->isValid());
- }
-
- {
- // Validate no crashes if any nodes are missing DisplayLists
- FrameBuilder frameBuilder(SkRect::MakeWH(800, 600), 800, 600, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNodeScene(nodes, contentDrawBounds);
-
- FailRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- }
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, empty_noFbo0) {
- class EmptyNoFbo0TestRenderer : public TestRendererBase {
- public:
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- ADD_FAILURE() << "Primary frame draw not expected in this test";
- }
- void endFrame(const Rect& repaintRect) override {
- ADD_FAILURE() << "Primary frame draw not expected in this test";
- }
- };
-
- // Use layer update constructor, so no work is enqueued for Fbo0
- LayerUpdateQueue emptyLayerUpdateQueue;
- FrameBuilder frameBuilder(emptyLayerUpdateQueue, sLightGeometry, Caches::getInstance());
- EmptyNoFbo0TestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, empty_withFbo0) {
- class EmptyWithFbo0TestRenderer : public TestRendererBase {
- public:
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(1, mIndex++); }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) {
- // no drawn content
- });
-
- // Draw, but pass node without draw content, so no work is done for primary frame
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- EmptyWithFbo0TestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex()) << "No drawing content produced,"
- " but fbo0 update lifecycle should still be observed";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, avoidOverdraw_rects) {
- class AvoidOverdrawRectsTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(mIndex++, 0) << "Should be one rect";
- EXPECT_EQ(Rect(10, 10, 190, 190), op.unmappedBounds)
- << "Last rect should occlude others.";
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.drawRect(10, 10, 190, 190, SkPaint());
- });
-
- // Damage (and therefore clip) is same as last draw, subset of renderable area.
- // This means last op occludes other contents, and they'll be rejected to avoid overdraw.
- FrameBuilder frameBuilder(SkRect::MakeLTRB(10, 10, 190, 190), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- EXPECT_EQ(3u, node->getDisplayList()->getOps().size())
- << "Recording must not have rejected ops, in order for this test to be valid";
-
- AvoidOverdrawRectsTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex()) << "Expect exactly one op";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, avoidOverdraw_bitmaps) {
- static sk_sp<Bitmap> opaqueBitmap(
- TestUtils::createBitmap(50, 50, SkColorType::kRGB_565_SkColorType));
- static sk_sp<Bitmap> transpBitmap(
- TestUtils::createBitmap(50, 50, SkColorType::kAlpha_8_SkColorType));
- class AvoidOverdrawBitmapsTestRenderer : public TestRendererBase {
- public:
- void onBitmapOp(const BitmapOp& op, const BakedOpState& state) override {
- switch (mIndex++) {
- case 0:
- EXPECT_EQ(opaqueBitmap.get(), op.bitmap);
- break;
- case 1:
- EXPECT_EQ(transpBitmap.get(), op.bitmap);
- break;
- default:
- ADD_FAILURE() << "Only two ops expected.";
- }
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 50, 50, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 50, 50, SkPaint());
- canvas.drawRect(0, 0, 50, 50, SkPaint());
- canvas.drawBitmap(*transpBitmap, 0, 0, nullptr);
-
- // only the below draws should remain, since they're
- canvas.drawBitmap(*opaqueBitmap, 0, 0, nullptr);
- canvas.drawBitmap(*transpBitmap, 0, 0, nullptr);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(50, 50), 50, 50, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- EXPECT_EQ(5u, node->getDisplayList()->getOps().size())
- << "Recording must not have rejected ops, in order for this test to be valid";
-
- AvoidOverdrawBitmapsTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex()) << "Expect exactly two ops";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, clippedMerging) {
- class ClippedMergingTestRenderer : public TestRendererBase {
- public:
- void onMergedBitmapOps(const MergedBakedOpList& opList) override {
- EXPECT_EQ(0, mIndex);
- mIndex += opList.count;
- EXPECT_EQ(4u, opList.count);
- EXPECT_EQ(Rect(10, 10, 90, 90), opList.clip);
- EXPECT_EQ(OpClipSideFlags::Left | OpClipSideFlags::Top | OpClipSideFlags::Right,
- opList.clipSideFlags);
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(20, 20));
-
- // left side clipped (to inset left half)
- canvas.clipRect(10, 0, 50, 100, SkClipOp::kReplace_deprecated);
- canvas.drawBitmap(*bitmap, 0, 40, nullptr);
-
- // top side clipped (to inset top half)
- canvas.clipRect(0, 10, 100, 50, SkClipOp::kReplace_deprecated);
- canvas.drawBitmap(*bitmap, 40, 0, nullptr);
-
- // right side clipped (to inset right half)
- canvas.clipRect(50, 0, 90, 100, SkClipOp::kReplace_deprecated);
- canvas.drawBitmap(*bitmap, 80, 40, nullptr);
-
- // bottom not clipped, just abutting (inset bottom half)
- canvas.clipRect(0, 50, 100, 90, SkClipOp::kReplace_deprecated);
- canvas.drawBitmap(*bitmap, 40, 70, nullptr);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- ClippedMergingTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, regionClipStopsMerge) {
- class RegionClipStopsMergeTestRenderer : public TestRendererBase {
- public:
- void onTextOp(const TextOp& op, const BakedOpState& state) override { mIndex++; }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPath path;
- path.addCircle(200, 200, 200, SkPath::kCW_Direction);
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipPath(&path, SkClipOp::kIntersect);
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(50);
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 100);
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 200);
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- RegionClipStopsMergeTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textMerging) {
- class TextMergingTestRenderer : public TestRendererBase {
- public:
- void onMergedTextOps(const MergedBakedOpList& opList) override {
- EXPECT_EQ(0, mIndex);
- mIndex += opList.count;
- EXPECT_EQ(2u, opList.count);
- EXPECT_EQ(OpClipSideFlags::Top, opList.clipSideFlags);
- EXPECT_EQ(OpClipSideFlags::Top, opList.states[0]->computedState.clipSideFlags);
- EXPECT_EQ(OpClipSideFlags::None, opList.states[1]->computedState.clipSideFlags);
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(0, 0, 400, 400, [](RenderProperties& props,
- RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(50);
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 0); // will be top clipped
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 100); // not clipped
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- TextMergingTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex()) << "Expect 2 ops";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textStrikethrough) {
- const int LOOPS = 5;
- class TextStrikethroughTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_TRUE(mIndex++ >= LOOPS) << "Strikethrough rects should be above all text";
- }
- void onMergedTextOps(const MergedBakedOpList& opList) override {
- EXPECT_EQ(0, mIndex);
- mIndex += opList.count;
- EXPECT_EQ(5u, opList.count);
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 2000, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint textPaint;
- textPaint.setAntiAlias(true);
- textPaint.setTextSize(20);
- textPaint.setFlags(textPaint.getFlags() | SkPaint::kStrikeThruText_ReserveFlag);
- for (int i = 0; i < LOOPS; i++) {
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", textPaint, 10, 100 * (i + 1));
- }
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 2000), 200, 2000, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- TextStrikethroughTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2 * LOOPS, renderer.getIndex()) << "Expect number of ops = 2 * loop count";
-}
-
-static auto styles = {SkPaint::kFill_Style, SkPaint::kStroke_Style, SkPaint::kStrokeAndFill_Style};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textStyle) {
- class TextStyleTestRenderer : public TestRendererBase {
- public:
- void onMergedTextOps(const MergedBakedOpList& opList) override {
- ASSERT_EQ(0, mIndex);
- ASSERT_EQ(3u, opList.count);
- mIndex += opList.count;
-
- int index = 0;
- for (auto style : styles) {
- auto state = opList.states[index++];
- ASSERT_EQ(style, state->op->paint->getStyle())
- << "Remainder of validation relies upon stable merged order";
- ASSERT_EQ(0, state->computedState.clipSideFlags)
- << "Clipped bounds validation requires unclipped ops";
- }
-
- Rect fill = opList.states[0]->computedState.clippedBounds;
- Rect stroke = opList.states[1]->computedState.clippedBounds;
- EXPECT_EQ(stroke, opList.states[2]->computedState.clippedBounds)
- << "Stroke+Fill should be same as stroke";
-
- EXPECT_TRUE(stroke.contains(fill));
- EXPECT_FALSE(fill.contains(stroke));
-
- // outset by half the stroke width
- Rect outsetFill(fill);
- outsetFill.outset(5);
- EXPECT_EQ(stroke, outsetFill);
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(50);
- paint.setStrokeWidth(10);
-
- // draw 3 copies of the same text overlapping, each with a different style.
- // They'll get merged, but with
- for (auto style : styles) {
- paint.setStyle(style);
- TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 100);
- }
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
- TextStyleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex()) << "Expect 3 ops";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textureLayer_clipLocalMatrix) {
- class TextureLayerClipLocalMatrixTestRenderer : public TestRendererBase {
- public:
- void onTextureLayerOp(const TextureLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clipRect());
- EXPECT_EQ(Rect(50, 50, 105, 105), state.computedState.clippedBounds);
-
- Matrix4 expected;
- expected.loadTranslate(5, 5, 0);
- EXPECT_MATRIX_APPROX_EQ(expected, state.computedState.transform);
- }
- };
-
- auto layerUpdater =
- TestUtils::createTextureLayerUpdater(renderThread, 100, 100, SkMatrix::MakeTrans(5, 5));
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [&layerUpdater](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(50, 50, 150, 150, SkClipOp::kIntersect);
- canvas.drawLayer(layerUpdater.get());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- TextureLayerClipLocalMatrixTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textureLayer_combineMatrices) {
- class TextureLayerCombineMatricesTestRenderer : public TestRendererBase {
- public:
- void onTextureLayerOp(const TextureLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
-
- Matrix4 expected;
- expected.loadTranslate(35, 45, 0);
- EXPECT_MATRIX_APPROX_EQ(expected, state.computedState.transform);
- }
- };
-
- auto layerUpdater =
- TestUtils::createTextureLayerUpdater(renderThread, 100, 100, SkMatrix::MakeTrans(5, 5));
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [&layerUpdater](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(30, 40);
- canvas.drawLayer(layerUpdater.get());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- TextureLayerCombineMatricesTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, textureLayer_reject) {
- auto layerUpdater =
- TestUtils::createTextureLayerUpdater(renderThread, 100, 100, SkMatrix::MakeTrans(5, 5));
- EXPECT_EQ(Layer::Api::OpenGL, layerUpdater->backingLayer()->getApi());
-
- GlLayer* glLayer = static_cast<GlLayer*>(layerUpdater->backingLayer());
- glLayer->setRenderTarget(GL_NONE); // Should be rejected
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [&layerUpdater](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.drawLayer(layerUpdater.get());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- FailRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, functor_reject) {
- class FunctorTestRenderer : public TestRendererBase {
- public:
- void onFunctorOp(const FunctorOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- }
- };
- Functor noopFunctor;
-
- // 1 million pixel tall view, scrolled down 80%
- auto scrolledFunctorView = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 1000000, [&noopFunctor](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.translate(0, -800000);
- canvas.callDrawGLFunction(&noopFunctor, nullptr);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(scrolledFunctorView));
-
- FunctorTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex()) << "Functor should not be rejected";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, deferColorOp_unbounded) {
- class ColorTestRenderer : public TestRendererBase {
- public:
- void onColorOp(const ColorOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(200, 200), state.computedState.clippedBounds)
- << "Color op should be expanded to bounds of surrounding";
- }
- };
-
- auto unclippedColorView = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 10, 10, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setClipToBounds(false);
- canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(unclippedColorView));
-
- ColorTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex()) << "ColorOp should not be rejected";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderNode) {
- class RenderNodeTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- switch (mIndex++) {
- case 0:
- EXPECT_EQ(Rect(200, 200), state.computedState.clippedBounds);
- EXPECT_EQ(SK_ColorDKGRAY, op.paint->getColor());
- break;
- case 1:
- EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clippedBounds);
- EXPECT_EQ(SK_ColorWHITE, op.paint->getColor());
- break;
- default:
- ADD_FAILURE();
- }
- }
- };
-
- auto child = TestUtils::createNode<RecordingCanvas>(
- 10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
-
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [&child](RenderProperties& props, RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorDKGRAY);
- canvas.drawRect(0, 0, 200, 200, paint);
-
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(40, 40);
- canvas.drawRenderNode(child.get());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- RenderNodeTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, clipped) {
- class ClippedTestRenderer : public TestRendererBase {
- public:
- void onBitmapOp(const BitmapOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(10, 20, 30, 40), state.computedState.clippedBounds);
- EXPECT_EQ(Rect(10, 20, 30, 40), state.computedState.clipRect());
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(200, 200));
- canvas.drawBitmap(*bitmap, 0, 0, nullptr);
- });
-
- // clip to small area, should see in receiver
- FrameBuilder frameBuilder(SkRect::MakeLTRB(10, 20, 30, 40), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- ClippedTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayer_simple) {
- class SaveLayerSimpleTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(180u, width);
- EXPECT_EQ(180u, height);
- return nullptr;
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), op.unmappedBounds);
- EXPECT_EQ(Rect(180, 180), state.computedState.clippedBounds);
- EXPECT_EQ(Rect(180, 180), state.computedState.clipRect());
-
- Matrix4 expectedTransform;
- expectedTransform.loadTranslate(-10, -10, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedTransform, state.computedState.transform);
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds);
- EXPECT_EQ(Rect(200, 200), state.computedState.clipRect());
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(4, mIndex++);
- EXPECT_EQ(nullptr, offscreenBuffer);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10, 10, 190, 190, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(10, 10, 190, 190, SkPaint());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerSimpleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(5, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayer_nested) {
- /* saveLayer1 { rect1, saveLayer2 { rect2 } } will play back as:
- * - startTemporaryLayer2, rect2 endLayer2
- * - startTemporaryLayer1, rect1, drawLayer2, endLayer1
- * - startFrame, layerOp1, endFrame
- */
- class SaveLayerNestedTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) override {
- const int index = mIndex++;
- if (index == 0) {
- EXPECT_EQ(400u, width);
- EXPECT_EQ(400u, height);
- return (OffscreenBuffer*)0x400;
- } else if (index == 3) {
- EXPECT_EQ(800u, width);
- EXPECT_EQ(800u, height);
- return (OffscreenBuffer*)0x800;
- } else {
- ADD_FAILURE();
- }
- return (OffscreenBuffer*)nullptr;
- }
- void endLayer() override {
- int index = mIndex++;
- EXPECT_TRUE(index == 2 || index == 6);
- }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(7, mIndex++);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(9, mIndex++); }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- const int index = mIndex++;
- if (index == 1) {
- EXPECT_EQ(Rect(400, 400), op.unmappedBounds); // inner rect
- } else if (index == 4) {
- EXPECT_EQ(Rect(800, 800), op.unmappedBounds); // outer rect
- } else {
- ADD_FAILURE();
- }
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- const int index = mIndex++;
- if (index == 5) {
- EXPECT_EQ((OffscreenBuffer*)0x400, *op.layerHandle);
- EXPECT_EQ(Rect(400, 400), op.unmappedBounds); // inner layer
- } else if (index == 8) {
- EXPECT_EQ((OffscreenBuffer*)0x800, *op.layerHandle);
- EXPECT_EQ(Rect(800, 800), op.unmappedBounds); // outer layer
- } else {
- ADD_FAILURE();
- }
- }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- const int index = mIndex++;
- // order isn't important, but we need to see both
- if (index == 10) {
- EXPECT_EQ((OffscreenBuffer*)0x400, offscreenBuffer);
- } else if (index == 11) {
- EXPECT_EQ((OffscreenBuffer*)0x800, offscreenBuffer);
- } else {
- ADD_FAILURE();
- }
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 800, 800, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(0, 0, 800, 800, 128, SaveFlags::ClipToLayer);
- {
- canvas.drawRect(0, 0, 800, 800, SkPaint());
- canvas.saveLayerAlpha(0, 0, 400, 400, 128, SaveFlags::ClipToLayer);
- { canvas.drawRect(0, 0, 400, 400, SkPaint()); }
- canvas.restore();
- }
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(800, 800), 800, 800, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerNestedTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(12, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayer_contentRejection) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(200, 200, 400, 400, SkClipOp::kIntersect);
- canvas.saveLayerAlpha(200, 200, 400, 400, 128, SaveFlags::ClipToLayer);
-
- // draw within save layer may still be recorded, but shouldn't be drawn
- canvas.drawRect(200, 200, 400, 400, SkPaint());
-
- canvas.restore();
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- FailRenderer renderer;
- // should see no ops, even within the layer, since the layer should be rejected
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_simple) {
- class SaveLayerUnclippedSimpleTestRenderer : public TestRendererBase {
- public:
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds);
- EXPECT_CLIP_RECT(Rect(200, 200), state.computedState.clipState);
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- ASSERT_NE(nullptr, op.paint);
- ASSERT_EQ(SkBlendMode::kClear, PaintUtils::getBlendModeDirect(op.paint));
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- EXPECT_EQ(Rect(200, 200), op.unmappedBounds);
- EXPECT_EQ(Rect(200, 200), state.computedState.clippedBounds);
- EXPECT_EQ(Rect(200, 200), state.computedState.clipRect());
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds);
- EXPECT_CLIP_RECT(Rect(200, 200), state.computedState.clipState);
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0));
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedSimpleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_round) {
- class SaveLayerUnclippedRoundTestRenderer : public TestRendererBase {
- public:
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds)
- << "Bounds rect should round out";
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {}
- void onRectOp(const RectOp& op, const BakedOpState& state) override {}
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- EXPECT_EQ(Rect(10, 10, 190, 190), state.computedState.clippedBounds)
- << "Bounds rect should round out";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(0, 0, 200, 200, [](RenderProperties& props,
- RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10.95f, 10.5f, 189.75f, 189.25f, // values should all round out
- 128, (SaveFlags::Flags)(0));
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedRoundTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_mergedClears) {
- class SaveLayerUnclippedMergedClearsTestRenderer : public TestRendererBase {
- public:
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_GT(4, index);
- EXPECT_EQ(5, op.unmappedBounds.getWidth());
- EXPECT_EQ(5, op.unmappedBounds.getHeight());
- if (index == 0) {
- EXPECT_EQ(Rect(10, 10), state.computedState.clippedBounds);
- } else if (index == 1) {
- EXPECT_EQ(Rect(190, 0, 200, 10), state.computedState.clippedBounds);
- } else if (index == 2) {
- EXPECT_EQ(Rect(0, 190, 10, 200), state.computedState.clippedBounds);
- } else if (index == 3) {
- EXPECT_EQ(Rect(190, 190, 200, 200), state.computedState.clippedBounds);
- }
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- ASSERT_EQ(op.vertexCount, 16u);
- for (size_t i = 0; i < op.vertexCount; i++) {
- auto v = op.vertices[i];
- EXPECT_TRUE(v.x == 0 || v.x == 10 || v.x == 190 || v.x == 200);
- EXPECT_TRUE(v.y == 0 || v.y == 10 || v.y == 190 || v.y == 200);
- }
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(5, mIndex++);
- }
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- EXPECT_LT(5, mIndex++);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
-
- int restoreTo = canvas.save(SaveFlags::MatrixClip);
- canvas.scale(2, 2);
- canvas.saveLayerAlpha(0, 0, 5, 5, 128, SaveFlags::MatrixClip);
- canvas.saveLayerAlpha(95, 0, 100, 5, 128, SaveFlags::MatrixClip);
- canvas.saveLayerAlpha(0, 95, 5, 100, 128, SaveFlags::MatrixClip);
- canvas.saveLayerAlpha(95, 95, 100, 100, 128, SaveFlags::MatrixClip);
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.restoreToCount(restoreTo);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedMergedClearsTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(10, renderer.getIndex())
- << "Expect 4 copyTos, 4 copyFroms, 1 clear SimpleRects, and 1 rect.";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_clearClip) {
- class SaveLayerUnclippedClearClipTestRenderer : public TestRendererBase {
- public:
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- ASSERT_NE(nullptr, op.paint);
- EXPECT_EQ(SkBlendMode::kClear, PaintUtils::getBlendModeDirect(op.paint));
- EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clippedBounds)
- << "Expect dirty rect as clip";
- ASSERT_NE(nullptr, state.computedState.clipState);
- EXPECT_EQ(Rect(50, 50, 150, 150), state.computedState.clipState->rect);
- EXPECT_EQ(ClipMode::Rectangle, state.computedState.clipState->mode);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- }
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- // save smaller than clip, so we get unclipped behavior
- canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0));
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- });
-
- // draw with partial screen dirty, and assert we see that rect later
- FrameBuilder frameBuilder(SkRect::MakeLTRB(50, 50, 150, 150), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedClearClipTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_reject) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- // unclipped savelayer + rect both in area that won't intersect with dirty
- canvas.saveLayerAlpha(100, 100, 200, 200, 128, (SaveFlags::Flags)(0));
- canvas.drawRect(100, 100, 200, 200, SkPaint());
- canvas.restore();
- });
-
- // draw with partial screen dirty that doesn't intersect with savelayer
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- FailRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-}
-
-/* saveLayerUnclipped { saveLayer { saveLayerUnclipped { rect } } } will play back as:
- * - startTemporaryLayer, onCopyToLayer, onSimpleRects, onRect, onCopyFromLayer, endLayer
- * - startFrame, onCopyToLayer, onSimpleRects, drawLayer, onCopyFromLayer, endframe
- */
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, saveLayerUnclipped_complex) {
- class SaveLayerUnclippedComplexTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) {
- EXPECT_EQ(0, mIndex++); // savelayer first
- return (OffscreenBuffer*)0xabcd;
- }
- void onCopyToLayerOp(const CopyToLayerOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 1 || index == 7);
- }
- void onSimpleRectsOp(const SimpleRectsOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 2 || index == 8);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- Matrix4 expected;
- expected.loadTranslate(-100, -100, 0);
- EXPECT_EQ(Rect(100, 100, 200, 200), state.computedState.clippedBounds);
- EXPECT_MATRIX_APPROX_EQ(expected, state.computedState.transform);
- }
- void onCopyFromLayerOp(const CopyFromLayerOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 4 || index == 10);
- }
- void endLayer() override { EXPECT_EQ(5, mIndex++); }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(6, mIndex++);
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(9, mIndex++);
- EXPECT_EQ((OffscreenBuffer*)0xabcd, *op.layerHandle);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(11, mIndex++); }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(12, mIndex++);
- EXPECT_EQ((OffscreenBuffer*)0xabcd, offscreenBuffer);
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 600, 600, // 500x500 triggers clipping
- [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(0, 0, 500, 500, 128, (SaveFlags::Flags)0); // unclipped
- canvas.saveLayerAlpha(100, 100, 400, 400, 128, SaveFlags::ClipToLayer); // clipped
- canvas.saveLayerAlpha(200, 200, 300, 300, 128, (SaveFlags::Flags)0); // unclipped
- canvas.drawRect(200, 200, 300, 300, SkPaint());
- canvas.restore();
- canvas.restore();
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(600, 600), 600, 600, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- SaveLayerUnclippedComplexTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(13, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, hwLayer_simple) {
- class HwLayerSimpleTestRenderer : public TestRendererBase {
- public:
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(100u, offscreenBuffer->viewportWidth);
- EXPECT_EQ(100u, offscreenBuffer->viewportHeight);
- EXPECT_EQ(Rect(25, 25, 75, 75), repaintRect);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
-
- EXPECT_TRUE(state.computedState.transform.isIdentity())
- << "Transform should be reset within layer";
-
- EXPECT_EQ(Rect(25, 25, 75, 75), state.computedState.clipRect())
- << "Damage rect should be used to clip layer content";
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(3, mIndex++);
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(5, mIndex++); }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
- OffscreenBuffer** layerHandle = node->getLayerHandle();
-
- // create RenderNode's layer here in same way prepareTree would
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- *layerHandle = &layer;
-
- auto syncedNode = TestUtils::getSyncedNode(node);
-
- // only enqueue partial damage
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(node.get(), Rect(25, 25, 75, 75));
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
-
- HwLayerSimpleTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(6, renderer.getIndex());
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, hwLayer_complex) {
- /* parentLayer { greyRect, saveLayer { childLayer { whiteRect } } } will play back as:
- * - startRepaintLayer(child), rect(grey), endLayer
- * - startTemporaryLayer, drawLayer(child), endLayer
- * - startRepaintLayer(parent), rect(white), drawLayer(saveLayer), endLayer
- * - startFrame, drawLayer(parent), endLayerb
- */
- class HwLayerComplexTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) {
- EXPECT_EQ(3, mIndex++); // savelayer first
- return (OffscreenBuffer*)0xabcd;
- }
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- int index = mIndex++;
- if (index == 0) {
- // starting inner layer
- EXPECT_EQ(100u, offscreenBuffer->viewportWidth);
- EXPECT_EQ(100u, offscreenBuffer->viewportHeight);
- } else if (index == 6) {
- // starting outer layer
- EXPECT_EQ(200u, offscreenBuffer->viewportWidth);
- EXPECT_EQ(200u, offscreenBuffer->viewportHeight);
- } else {
- ADD_FAILURE();
- }
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- if (index == 1) {
- // inner layer's rect (white)
- EXPECT_EQ(SK_ColorWHITE, op.paint->getColor());
- } else if (index == 7) {
- // outer layer's rect (grey)
- EXPECT_EQ(SK_ColorDKGRAY, op.paint->getColor());
- } else {
- ADD_FAILURE();
- }
- }
- void endLayer() override {
- int index = mIndex++;
- EXPECT_TRUE(index == 2 || index == 5 || index == 9);
- }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- EXPECT_EQ(10, mIndex++);
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- OffscreenBuffer* layer = *op.layerHandle;
- int index = mIndex++;
- if (index == 4) {
- EXPECT_EQ(100u, layer->viewportWidth);
- EXPECT_EQ(100u, layer->viewportHeight);
- } else if (index == 8) {
- EXPECT_EQ((OffscreenBuffer*)0xabcd, *op.layerHandle);
- } else if (index == 11) {
- EXPECT_EQ(200u, layer->viewportWidth);
- EXPECT_EQ(200u, layer->viewportHeight);
- } else {
- ADD_FAILURE();
- }
- }
- void endFrame(const Rect& repaintRect) override { EXPECT_EQ(12, mIndex++); }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(13, mIndex++);
- }
- };
-
- auto child = TestUtils::createNode<RecordingCanvas>(
- 50, 50, 150, 150, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
- OffscreenBuffer childLayer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- *(child->getLayerHandle()) = &childLayer;
-
- RenderNode* childPtr = child.get();
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [childPtr](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- SkPaint paint;
- paint.setColor(SK_ColorDKGRAY);
- canvas.drawRect(0, 0, 200, 200, paint);
-
- canvas.saveLayerAlpha(50, 50, 150, 150, 128, SaveFlags::ClipToLayer);
- canvas.drawRenderNode(childPtr);
- canvas.restore();
- });
- OffscreenBuffer parentLayer(renderThread.renderState(), Caches::getInstance(), 200, 200);
- *(parent->getLayerHandle()) = &parentLayer;
-
- auto syncedNode = TestUtils::getSyncedNode(parent);
-
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(child.get(), Rect(100, 100));
- layerUpdateQueue.enqueueLayerWithDamage(parent.get(), Rect(200, 200));
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
-
- HwLayerComplexTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(14, renderer.getIndex());
-
- // clean up layer pointers, so we can safely destruct RenderNodes
- *(child->getLayerHandle()) = nullptr;
- *(parent->getLayerHandle()) = nullptr;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, buildLayer) {
- class BuildLayerTestRenderer : public TestRendererBase {
- public:
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(100u, offscreenBuffer->viewportWidth);
- EXPECT_EQ(100u, offscreenBuffer->viewportHeight);
- EXPECT_EQ(Rect(25, 25, 75, 75), repaintRect);
- }
- void onColorOp(const ColorOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
-
- EXPECT_TRUE(state.computedState.transform.isIdentity())
- << "Transform should be reset within layer";
-
- EXPECT_EQ(Rect(25, 25, 75, 75), state.computedState.clipRect())
- << "Damage rect should be used to clip layer content";
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void startFrame(uint32_t width, uint32_t height, const Rect& repaintRect) override {
- ADD_FAILURE() << "Primary frame draw not expected in this test";
- }
- void endFrame(const Rect& repaintRect) override {
- ADD_FAILURE() << "Primary frame draw not expected in this test";
- }
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 10, 10, 110, 110, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
- });
- OffscreenBuffer** layerHandle = node->getLayerHandle();
-
- // create RenderNode's layer here in same way prepareTree would
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- *layerHandle = &layer;
-
- TestUtils::syncHierarchyPropertiesAndDisplayList(node);
-
- // only enqueue partial damage
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(node.get(), Rect(25, 25, 75, 75));
-
- // Draw, but pass empty node list, so no work is done for primary frame
- FrameBuilder frameBuilder(layerUpdateQueue, sLightGeometry, Caches::getInstance());
- BuildLayerTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-namespace {
-
-static void drawOrderedRect(Canvas* canvas, uint8_t expectedDrawOrder) {
- SkPaint paint;
- // order put in blue channel, transparent so overlapped content doesn't get rejected
- paint.setColor(SkColorSetARGB(1, 0, 0, expectedDrawOrder));
- canvas->drawRect(0, 0, 100, 100, paint);
-}
-static void drawOrderedNode(Canvas* canvas, uint8_t expectedDrawOrder, float z) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [expectedDrawOrder](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedRect(&canvas, expectedDrawOrder);
- });
- node->mutateStagingProperties().setTranslationZ(z);
- node->setPropertyFieldsDirty(RenderNode::TRANSLATION_Z);
- canvas->drawRenderNode(node.get()); // canvas takes reference/sole ownership
-}
-
-static void drawOrderedNode(
- Canvas* canvas, uint8_t expectedDrawOrder,
- std::function<void(RenderProperties& props, RecordingCanvas& canvas)> setup) {
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100,
- [expectedDrawOrder, setup](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedRect(&canvas, expectedDrawOrder);
- if (setup) {
- setup(props, canvas);
- }
- });
- canvas->drawRenderNode(node.get()); // canvas takes reference/sole ownership
-}
-
-class ZReorderTestRenderer : public TestRendererBase {
-public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- int expectedOrder = SkColorGetB(op.paint->getColor()); // extract order from blue channel
- EXPECT_EQ(expectedOrder, mIndex++) << "An op was drawn out of order";
- }
-};
-
-} // end anonymous namespace
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, zReorder) {
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.insertReorderBarrier(true);
- canvas.insertReorderBarrier(false);
- drawOrderedNode(&canvas, 0,
- 10.0f); // in reorder=false at this point, so played inorder
- drawOrderedRect(&canvas, 1);
- canvas.insertReorderBarrier(true);
- drawOrderedNode(&canvas, 6, 2.0f);
- drawOrderedRect(&canvas, 3);
- drawOrderedNode(&canvas, 4, 0.0f);
- drawOrderedRect(&canvas, 5);
- drawOrderedNode(&canvas, 2, -2.0f);
- drawOrderedNode(&canvas, 7, 2.0f);
- canvas.insertReorderBarrier(false);
- drawOrderedRect(&canvas, 8);
- drawOrderedNode(&canvas, 9,
- -10.0f); // in reorder=false at this point, so played inorder
- canvas.insertReorderBarrier(true); // reorder a node ahead of drawrect op
- drawOrderedRect(&canvas, 11);
- drawOrderedNode(&canvas, 10, -1.0f);
- canvas.insertReorderBarrier(false);
- canvas.insertReorderBarrier(true); // test with two empty reorder sections
- canvas.insertReorderBarrier(true);
- canvas.insertReorderBarrier(false);
- drawOrderedRect(&canvas, 12);
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(13, renderer.getIndex());
-};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorder) {
- static const int scrollX = 5;
- static const int scrollY = 10;
- class ProjectionReorderTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- const int index = mIndex++;
-
- Matrix4 expectedMatrix;
- switch (index) {
- case 0:
- EXPECT_EQ(Rect(100, 100), op.unmappedBounds);
- EXPECT_EQ(SK_ColorWHITE, op.paint->getColor());
- expectedMatrix.loadIdentity();
- EXPECT_EQ(nullptr, state.computedState.localProjectionPathMask);
- break;
- case 1:
- EXPECT_EQ(Rect(-10, -10, 60, 60), op.unmappedBounds);
- EXPECT_EQ(SK_ColorDKGRAY, op.paint->getColor());
- expectedMatrix.loadTranslate(50 - scrollX, 50 - scrollY, 0);
- ASSERT_NE(nullptr, state.computedState.localProjectionPathMask);
- EXPECT_EQ(Rect(-35, -30, 45, 50),
- Rect(state.computedState.localProjectionPathMask->getBounds()));
- break;
- case 2:
- EXPECT_EQ(Rect(100, 50), op.unmappedBounds);
- EXPECT_EQ(SK_ColorBLUE, op.paint->getColor());
- expectedMatrix.loadTranslate(-scrollX, 50 - scrollY, 0);
- EXPECT_EQ(nullptr, state.computedState.localProjectionPathMask);
- break;
- default:
- ADD_FAILURE();
- }
- EXPECT_EQ(expectedMatrix, state.computedState.transform);
- }
- };
-
- /**
- * Construct a tree of nodes, where the root (A) has a receiver background (B), and a child (C)
- * with a projecting child (P) of its own. P would normally draw between B and C's "background"
- * draw, but because it is projected backwards, it's drawn in between B and C.
- *
- * The parent is scrolled by scrollX/scrollY, but this does not affect the background
- * (which isn't affected by scroll).
- */
- auto receiverBackground = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectionReceiver(true);
- // scroll doesn't apply to background, so undone via translationX/Y
- // NOTE: translationX/Y only! no other transform properties may be set for a proj
- // receiver!
- properties.setTranslationX(scrollX);
- properties.setTranslationY(scrollY);
-
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
- auto projectingRipple = TestUtils::createNode<RecordingCanvas>(
- 50, 0, 100, 50, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectBackwards(true);
- properties.setClipToBounds(false);
- SkPaint paint;
- paint.setColor(SK_ColorDKGRAY);
- canvas.drawRect(-10, -10, 60, 60, paint);
- });
- auto child = TestUtils::createNode<RecordingCanvas>(
- 0, 50, 100, 100,
- [&projectingRipple](RenderProperties& properties, RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorBLUE);
- canvas.drawRect(0, 0, 100, 50, paint);
- canvas.drawRenderNode(projectingRipple.get());
- });
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100,
- [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) {
- // Set a rect outline for the projecting ripple to be masked against.
- properties.mutableOutline().setRoundRect(10, 10, 90, 90, 5, 1.0f);
-
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(-scrollX,
- -scrollY); // Apply scroll (note: bg undoes this internally)
- canvas.drawRenderNode(receiverBackground.get());
- canvas.drawRenderNode(child.get());
- canvas.restore();
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ProjectionReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionHwLayer) {
- static const int scrollX = 5;
- static const int scrollY = 10;
- class ProjectionHwLayerTestRenderer : public TestRendererBase {
- public:
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- }
- void onArcOp(const ArcOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask);
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask);
- }
- void onOvalOp(const OvalOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- ASSERT_NE(nullptr, state.computedState.localProjectionPathMask);
- Matrix4 expected;
- expected.loadTranslate(100 - scrollX, 100 - scrollY, 0);
- EXPECT_EQ(expected, state.computedState.transform);
- EXPECT_EQ(Rect(-85, -80, 295, 300),
- Rect(state.computedState.localProjectionPathMask->getBounds()));
- }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(5, mIndex++);
- ASSERT_EQ(nullptr, state.computedState.localProjectionPathMask);
- }
- };
- auto receiverBackground = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectionReceiver(true);
- // scroll doesn't apply to background, so undone via translationX/Y
- // NOTE: translationX/Y only! no other transform properties may be set for a proj
- // receiver!
- properties.setTranslationX(scrollX);
- properties.setTranslationY(scrollY);
-
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- });
- auto projectingRipple = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectBackwards(true);
- properties.setClipToBounds(false);
- canvas.drawOval(100, 100, 300, 300, SkPaint()); // drawn mostly out of layer bounds
- });
- auto child = TestUtils::createNode<RecordingCanvas>(
- 100, 100, 300, 300,
- [&projectingRipple](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.mutateLayerProperties().setType(LayerType::RenderLayer);
- canvas.drawRenderNode(projectingRipple.get());
- canvas.drawArc(0, 0, 200, 200, 0.0f, 280.0f, true, SkPaint());
- });
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400,
- [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) {
- // Set a rect outline for the projecting ripple to be masked against.
- properties.mutableOutline().setRoundRect(10, 10, 390, 390, 0, 1.0f);
- canvas.translate(-scrollX,
- -scrollY); // Apply scroll (note: bg undoes this internally)
- canvas.drawRenderNode(receiverBackground.get());
- canvas.drawRenderNode(child.get());
- });
-
- OffscreenBuffer** layerHandle = child->getLayerHandle();
-
- // create RenderNode's layer here in same way prepareTree would, setting windowTransform
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 200, 200);
- Matrix4 windowTransform;
- windowTransform.loadTranslate(100, 100, 0); // total transform of layer's origin
- layer.setWindowTransform(windowTransform);
- *layerHandle = &layer;
-
- auto syncedNode = TestUtils::getSyncedNode(parent);
-
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(child.get(), Rect(200, 200));
-
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
-
- ProjectionHwLayerTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(6, renderer.getIndex());
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionChildScroll) {
- static const int scrollX = 500000;
- static const int scrollY = 0;
- class ProjectionChildScrollTestRenderer : public TestRendererBase {
- public:
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- void onOvalOp(const OvalOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- ASSERT_NE(nullptr, state.computedState.clipState);
- ASSERT_EQ(ClipMode::Rectangle, state.computedState.clipState->mode);
- ASSERT_EQ(Rect(400, 400), state.computedState.clipState->rect);
- EXPECT_TRUE(state.computedState.transform.isIdentity());
- }
- };
- auto receiverBackground = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400, [](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setProjectionReceiver(true);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- });
- auto projectingRipple = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& properties, RecordingCanvas& canvas) {
- // scroll doesn't apply to background, so undone via translationX/Y
- // NOTE: translationX/Y only! no other transform properties may be set for a proj
- // receiver!
- properties.setTranslationX(scrollX);
- properties.setTranslationY(scrollY);
- properties.setProjectBackwards(true);
- properties.setClipToBounds(false);
- canvas.drawOval(0, 0, 200, 200, SkPaint());
- });
- auto child = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400,
- [&projectingRipple](RenderProperties& properties, RecordingCanvas& canvas) {
- // Record time clip will be ignored by projectee
- canvas.clipRect(100, 100, 300, 300, SkClipOp::kIntersect);
-
- canvas.translate(-scrollX,
- -scrollY); // Apply scroll (note: bg undoes this internally)
- canvas.drawRenderNode(projectingRipple.get());
- });
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 400, 400,
- [&receiverBackground, &child](RenderProperties& properties, RecordingCanvas& canvas) {
- canvas.drawRenderNode(receiverBackground.get());
- canvas.drawRenderNode(child.get());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ProjectionChildScrollTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-// creates a 100x100 shadow casting node with provided translationZ
-static sp<RenderNode> createWhiteRectShadowCaster(float translationZ) {
- return TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [translationZ](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setTranslationZ(translationZ);
- properties.mutableOutline().setRoundRect(0, 0, 100, 100, 0.0f, 1.0f);
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadow) {
- class ShadowTestRenderer : public TestRendererBase {
- public:
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_FLOAT_EQ(1.0f, op.casterAlpha);
- EXPECT_TRUE(op.shadowTask->casterPerimeter.isRect(nullptr));
- EXPECT_MATRIX_APPROX_EQ(Matrix4::identity(), op.shadowTask->transformXY);
-
- Matrix4 expectedZ;
- expectedZ.loadTranslate(0, 0, 5);
- EXPECT_MATRIX_APPROX_EQ(expectedZ, op.shadowTask->transformZ);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- }
- };
-
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.insertReorderBarrier(true);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ShadowTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadowSaveLayer) {
- class ShadowSaveLayerTestRenderer : public TestRendererBase {
- public:
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) override {
- EXPECT_EQ(0, mIndex++);
- return nullptr;
- }
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- EXPECT_FLOAT_EQ(50, op.shadowTask->lightCenter.x);
- EXPECT_FLOAT_EQ(40, op.shadowTask->lightCenter.y);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- }
- void endLayer() override { EXPECT_EQ(3, mIndex++); }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(5, mIndex++);
- }
- };
-
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- // save/restore outside of reorderBarrier, so they don't get moved out of place
- canvas.translate(20, 10);
- int count = canvas.saveLayerAlpha(30, 50, 130, 150, 128, SaveFlags::ClipToLayer);
- canvas.insertReorderBarrier(true);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- canvas.insertReorderBarrier(false);
- canvas.restoreToCount(count);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200,
- (FrameBuilder::LightGeometry){{100, 100, 100}, 50},
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ShadowSaveLayerTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(6, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadowHwLayer) {
- class ShadowHwLayerTestRenderer : public TestRendererBase {
- public:
- void startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) override {
- EXPECT_EQ(0, mIndex++);
- }
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- EXPECT_FLOAT_EQ(50, op.shadowTask->lightCenter.x);
- EXPECT_FLOAT_EQ(40, op.shadowTask->lightCenter.y);
- EXPECT_FLOAT_EQ(30, op.shadowTask->lightRadius);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(2, mIndex++);
- }
- void endLayer() override { EXPECT_EQ(3, mIndex++); }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(4, mIndex++);
- }
- };
-
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 50, 60, 150, 160, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.mutateLayerProperties().setType(LayerType::RenderLayer);
- canvas.insertReorderBarrier(true);
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(20, 10);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- canvas.restore();
- });
- OffscreenBuffer** layerHandle = parent->getLayerHandle();
-
- // create RenderNode's layer here in same way prepareTree would, setting windowTransform
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 100, 100);
- Matrix4 windowTransform;
- windowTransform.loadTranslate(50, 60, 0); // total transform of layer's origin
- layer.setWindowTransform(windowTransform);
- *layerHandle = &layer;
-
- auto syncedNode = TestUtils::getSyncedNode(parent);
- LayerUpdateQueue layerUpdateQueue; // Note: enqueue damage post-sync, so bounds are valid
- layerUpdateQueue.enqueueLayerWithDamage(parent.get(), Rect(100, 100));
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200,
- (FrameBuilder::LightGeometry){{100, 100, 100}, 30},
- Caches::getInstance());
- frameBuilder.deferLayers(layerUpdateQueue);
- frameBuilder.deferRenderNode(*syncedNode);
-
- ShadowHwLayerTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(5, renderer.getIndex());
-
- // clean up layer pointer, so we can safely destruct RenderNode
- *layerHandle = nullptr;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadowLayering) {
- class ShadowLayeringTestRenderer : public TestRendererBase {
- public:
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 0 || index == 1);
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- int index = mIndex++;
- EXPECT_TRUE(index == 2 || index == 3);
- }
- };
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 200, 200, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.insertReorderBarrier(true);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0001f).get());
- });
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200,
- (FrameBuilder::LightGeometry){{100, 100, 100}, 50},
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ShadowLayeringTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, shadowClipping) {
- class ShadowClippingTestRenderer : public TestRendererBase {
- public:
- void onShadowOp(const ShadowOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_EQ(Rect(25, 25, 75, 75), state.computedState.clipState->rect)
- << "Shadow must respect pre-barrier canvas clip value.";
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
- }
- };
- auto parent = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- // Apply a clip before the reorder barrier/shadow casting child is drawn.
- // This clip must be applied to the shadow cast by the child.
- canvas.clipRect(25, 25, 75, 75, SkClipOp::kIntersect);
- canvas.insertReorderBarrier(true);
- canvas.drawRenderNode(createWhiteRectShadowCaster(5.0f).get());
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100,
- (FrameBuilder::LightGeometry){{100, 100, 100}, 50},
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(parent));
-
- ShadowClippingTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-static void testProperty(
- std::function<void(RenderProperties&)> propSetupCallback,
- std::function<void(const RectOp&, const BakedOpState&)> opValidateCallback) {
- class PropertyTestRenderer : public TestRendererBase {
- public:
- explicit PropertyTestRenderer(
- std::function<void(const RectOp&, const BakedOpState&)> callback)
- : mCallback(callback) {}
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(mIndex++, 0);
- mCallback(op, state);
- }
- std::function<void(const RectOp&, const BakedOpState&)> mCallback;
- };
-
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [propSetupCallback](RenderProperties& props, RecordingCanvas& canvas) {
- propSetupCallback(props);
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- PropertyTestRenderer renderer(opValidateCallback);
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex()) << "Should have seen one op";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropOverlappingRenderingAlpha) {
- testProperty(
- [](RenderProperties& properties) {
- properties.setAlpha(0.5f);
- properties.setHasOverlappingRendering(false);
- },
- [](const RectOp& op, const BakedOpState& state) {
- EXPECT_EQ(0.5f, state.alpha) << "Alpha should be applied directly to op";
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropClipping) {
- testProperty(
- [](RenderProperties& properties) {
- properties.setClipToBounds(true);
- properties.setClipBounds(Rect(10, 20, 300, 400));
- },
- [](const RectOp& op, const BakedOpState& state) {
- EXPECT_EQ(Rect(10, 20, 100, 100), state.computedState.clippedBounds)
- << "Clip rect should be intersection of node bounds and clip bounds";
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropRevealClip) {
- testProperty(
- [](RenderProperties& properties) {
- properties.mutableRevealClip().set(true, 50, 50, 25);
- },
- [](const RectOp& op, const BakedOpState& state) {
- ASSERT_NE(nullptr, state.roundRectClipState);
- EXPECT_TRUE(state.roundRectClipState->highPriority);
- EXPECT_EQ(25, state.roundRectClipState->radius);
- EXPECT_EQ(Rect(50, 50, 50, 50), state.roundRectClipState->innerRect);
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropOutlineClip) {
- testProperty(
- [](RenderProperties& properties) {
- properties.mutableOutline().setShouldClip(true);
- properties.mutableOutline().setRoundRect(10, 20, 30, 40, 5.0f, 0.5f);
- },
- [](const RectOp& op, const BakedOpState& state) {
- ASSERT_NE(nullptr, state.roundRectClipState);
- EXPECT_FALSE(state.roundRectClipState->highPriority);
- EXPECT_EQ(5, state.roundRectClipState->radius);
- EXPECT_EQ(Rect(15, 25, 25, 35), state.roundRectClipState->innerRect);
- });
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropTransform) {
- testProperty(
- [](RenderProperties& properties) {
- properties.setLeftTopRightBottom(10, 10, 110, 110);
-
- SkMatrix staticMatrix = SkMatrix::MakeScale(1.2f, 1.2f);
- properties.setStaticMatrix(&staticMatrix);
-
- // ignored, since static overrides animation
- SkMatrix animationMatrix = SkMatrix::MakeTrans(15, 15);
- properties.setAnimationMatrix(&animationMatrix);
-
- properties.setTranslationX(10);
- properties.setTranslationY(20);
- properties.setScaleX(0.5f);
- properties.setScaleY(0.7f);
- },
- [](const RectOp& op, const BakedOpState& state) {
- Matrix4 matrix;
- matrix.loadTranslate(10, 10, 0); // left, top
- matrix.scale(1.2f, 1.2f, 1); // static matrix
- // ignore animation matrix, since static overrides it
-
- // translation xy
- matrix.translate(10, 20);
-
- // scale xy (from default pivot - center)
- matrix.translate(50, 50);
- matrix.scale(0.5f, 0.7f, 1);
- matrix.translate(-50, -50);
- EXPECT_MATRIX_APPROX_EQ(matrix, state.computedState.transform)
- << "Op draw matrix must match expected combination of transformation "
- "properties";
- });
-}
-
-struct SaveLayerAlphaData {
- uint32_t layerWidth = 0;
- uint32_t layerHeight = 0;
- Rect rectClippedBounds;
- Matrix4 rectMatrix;
- Matrix4 drawLayerMatrix;
-};
-/**
- * Constructs a view to hit the temporary layer alpha property implementation:
- * a) 0 < alpha < 1
- * b) too big for layer (larger than maxTextureSize)
- * c) overlapping rendering content
- * returning observed data about layer size and content clip/transform.
- *
- * Used to validate clipping behavior of temporary layer, where requested layer size is reduced
- * (for efficiency, and to fit in layer size constraints) based on parent clip.
- */
-void testSaveLayerAlphaClip(SaveLayerAlphaData* outObservedData,
- std::function<void(RenderProperties&)> propSetupCallback) {
- class SaveLayerAlphaClipTestRenderer : public TestRendererBase {
- public:
- explicit SaveLayerAlphaClipTestRenderer(SaveLayerAlphaData* outData) : mOutData(outData) {}
-
- OffscreenBuffer* startTemporaryLayer(uint32_t width, uint32_t height) override {
- EXPECT_EQ(0, mIndex++);
- mOutData->layerWidth = width;
- mOutData->layerHeight = height;
- return nullptr;
- }
- void onRectOp(const RectOp& op, const BakedOpState& state) override {
- EXPECT_EQ(1, mIndex++);
-
- mOutData->rectClippedBounds = state.computedState.clippedBounds;
- mOutData->rectMatrix = state.computedState.transform;
- }
- void endLayer() override { EXPECT_EQ(2, mIndex++); }
- void onLayerOp(const LayerOp& op, const BakedOpState& state) override {
- EXPECT_EQ(3, mIndex++);
- mOutData->drawLayerMatrix = state.computedState.transform;
- }
- void recycleTemporaryLayer(OffscreenBuffer* offscreenBuffer) override {
- EXPECT_EQ(4, mIndex++);
- }
-
- private:
- SaveLayerAlphaData* mOutData;
- };
-
- ASSERT_GT(10000, DeviceInfo::get()->maxTextureSize())
- << "Node must be bigger than max texture size to exercise saveLayer codepath";
- auto node = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 10000, 10000,
- [&propSetupCallback](RenderProperties& properties, RecordingCanvas& canvas) {
- properties.setHasOverlappingRendering(true);
- properties.setAlpha(0.5f); // force saveLayer, since too big for HW layer
- // apply other properties
- propSetupCallback(properties);
-
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 10000, 10000, paint);
- });
- auto syncedNode = TestUtils::getSyncedNode(node); // sync before querying height
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*syncedNode);
-
- SaveLayerAlphaClipTestRenderer renderer(outObservedData);
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
-
- // assert, since output won't be valid if we haven't seen a save layer triggered
- ASSERT_EQ(5, renderer.getIndex()) << "Test must trigger saveLayer alpha behavior.";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropSaveLayerAlphaClipBig) {
- SaveLayerAlphaData observedData;
- testSaveLayerAlphaClip(&observedData, [](RenderProperties& properties) {
- properties.setTranslationX(10); // offset rendering content
- properties.setTranslationY(-2000); // offset rendering content
- });
- EXPECT_EQ(190u, observedData.layerWidth);
- EXPECT_EQ(200u, observedData.layerHeight);
- EXPECT_EQ(Rect(190, 200), observedData.rectClippedBounds)
- << "expect content to be clipped to screen area";
- Matrix4 expected;
- expected.loadTranslate(0, -2000, 0);
- EXPECT_MATRIX_APPROX_EQ(expected, observedData.rectMatrix)
- << "expect content to be translated as part of being clipped";
- expected.loadTranslate(10, 0, 0);
- EXPECT_MATRIX_APPROX_EQ(expected, observedData.drawLayerMatrix)
- << "expect drawLayer to be translated as part of being clipped";
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropSaveLayerAlphaRotate) {
- SaveLayerAlphaData observedData;
- testSaveLayerAlphaClip(&observedData, [](RenderProperties& properties) {
- // Translate and rotate the view so that the only visible part is the top left corner of
- // the view. It will form an isosceles right triangle with a long side length of 200 at the
- // bottom of the viewport.
- properties.setTranslationX(100);
- properties.setTranslationY(100);
- properties.setPivotX(0);
- properties.setPivotY(0);
- properties.setRotation(45);
- });
- // ceil(sqrt(2) / 2 * 200) = 142
- EXPECT_EQ(142u, observedData.layerWidth);
- EXPECT_EQ(142u, observedData.layerHeight);
- EXPECT_EQ(Rect(142, 142), observedData.rectClippedBounds);
- EXPECT_MATRIX_APPROX_EQ(Matrix4::identity(), observedData.rectMatrix);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, renderPropSaveLayerAlphaScale) {
- SaveLayerAlphaData observedData;
- testSaveLayerAlphaClip(&observedData, [](RenderProperties& properties) {
- properties.setPivotX(0);
- properties.setPivotY(0);
- properties.setScaleX(2);
- properties.setScaleY(0.5f);
- });
- EXPECT_EQ(100u, observedData.layerWidth);
- EXPECT_EQ(400u, observedData.layerHeight);
- EXPECT_EQ(Rect(100, 400), observedData.rectClippedBounds);
- EXPECT_MATRIX_APPROX_EQ(Matrix4::identity(), observedData.rectMatrix);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, clip_replace) {
- class ClipReplaceTestRenderer : public TestRendererBase {
- public:
- void onColorOp(const ColorOp& op, const BakedOpState& state) override {
- EXPECT_EQ(0, mIndex++);
- EXPECT_TRUE(op.localClip->intersectWithRoot);
- EXPECT_EQ(Rect(20, 10, 30, 40), state.computedState.clipState->rect)
- << "Expect resolved clip to be intersection of viewport clip and clip op";
- }
- };
- auto node = TestUtils::createNode<RecordingCanvas>(
- 20, 20, 30, 30, [](RenderProperties& props, RecordingCanvas& canvas) {
- canvas.clipRect(0, -20, 10, 30, SkClipOp::kReplace_deprecated);
- canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
- });
-
- FrameBuilder frameBuilder(SkRect::MakeLTRB(10, 10, 40, 40), 50, 50, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
-
- ClipReplaceTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(1, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedInMiddle) {
- /* R is backward projected on B
- A
- / \
- B C
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectLast) {
- /* R is backward projected on E
- A
- / | \
- / | \
- B C E
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, nullptr); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 3, [](RenderProperties& props,
- RecordingCanvas& canvas) { // drawn as 2
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- drawOrderedNode(&canvas, 2, [](RenderProperties& props,
- RecordingCanvas& canvas) { // drawn as 3
- props.setProjectionReceiver(true);
- }); // nodeE
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderNoReceivable) {
- /* R is backward projected without receiver
- A
- / \
- B C
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, nullptr); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 255,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- // not having a projection receiver is an undefined behavior
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderParentReceivable) {
- /* R is backward projected on C
- A
- / \
- B C
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, nullptr); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectionReceiver(true);
- drawOrderedNode(&canvas, 2,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderSameNodeReceivable) {
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, nullptr); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 255,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- // having a node that is projected on itself is an
- // undefined/unexpected behavior
- props.setProjectionReceiver(true);
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(2, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedSibling) {
- // TODO: this test together with the next "projectionReorderProjectedSibling2" likely expose a
- // bug in HWUI. First test draws R, while the second test does not draw R for a nearly identical
- // tree setup. The correct behaviour is to not draw R, because the receiver cannot be a sibling
- /* R is backward projected on B. R is not expected to be drawn (see Sibling2 outcome below),
- but for some reason it is drawn.
- A
- /|\
- / | \
- B C R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2,
- [](RenderProperties& props, RecordingCanvas& canvas) {}); // nodeC
- drawOrderedNode(&canvas, 1, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderProjectedSibling2) {
- /* R is set to project on B, but R is not drawn because projecting on a sibling is not allowed.
- A
- |
- G
- /|\
- / | \
- B C R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, [](RenderProperties& props,
- RecordingCanvas& canvas) { // G
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) { // B
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2,
- [](RenderProperties& props, RecordingCanvas& canvas) { // C
- }); // nodeC
- drawOrderedNode(&canvas, 255,
- [](RenderProperties& props, RecordingCanvas& canvas) { // R
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeG
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderGrandparentReceivable) {
- /* R is backward projected on B
- A
- |
- B
- |
- C
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0, [](RenderProperties& props, RecordingCanvas& canvas) {
- props.setProjectionReceiver(true);
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 2, [](RenderProperties& props,
- RecordingCanvas& canvas) {
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeB
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(3, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivables) {
- /* B and G are receivables, R is backward projected
- A
- / \
- B C
- / \
- G R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0,
- [](RenderProperties& props, RecordingCanvas& canvas) { // B
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2, [](RenderProperties& props,
- RecordingCanvas& canvas) { // C
- drawOrderedNode(&canvas, 3,
- [](RenderProperties& props, RecordingCanvas& canvas) { // G
- props.setProjectionReceiver(true);
- }); // nodeG
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) { // R
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivablesLikelyScenario) {
- /* B and G are receivables, G is backward projected
- A
- / \
- B C
- / \
- G R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0,
- [](RenderProperties& props, RecordingCanvas& canvas) { // B
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 2, [](RenderProperties& props,
- RecordingCanvas& canvas) { // C
- drawOrderedNode(&canvas, 1,
- [](RenderProperties& props, RecordingCanvas& canvas) { // G
- props.setProjectionReceiver(true);
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeG
- drawOrderedNode(&canvas, 3,
- [](RenderProperties& props, RecordingCanvas& canvas) { // R
- }); // nodeR
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(4, renderer.getIndex());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(FrameBuilder, projectionReorderTwoReceivablesDeeper) {
- /* B and G are receivables, R is backward projected
- A
- / \
- B C
- / \
- G D
- |
- R
- */
- auto nodeA = TestUtils::createNode<RecordingCanvas>(
- 0, 0, 100, 100, [](RenderProperties& props, RecordingCanvas& canvas) {
- drawOrderedNode(&canvas, 0,
- [](RenderProperties& props, RecordingCanvas& canvas) { // B
- props.setProjectionReceiver(true);
- }); // nodeB
- drawOrderedNode(&canvas, 1, [](RenderProperties& props,
- RecordingCanvas& canvas) { // C
- drawOrderedNode(&canvas, 2,
- [](RenderProperties& props, RecordingCanvas& canvas) { // G
- props.setProjectionReceiver(true);
- }); // nodeG
- drawOrderedNode(
- &canvas, 4, [](RenderProperties& props, RecordingCanvas& canvas) { // D
- drawOrderedNode(&canvas, 3, [](RenderProperties& props,
- RecordingCanvas& canvas) { // R
- props.setProjectBackwards(true);
- props.setClipToBounds(false);
- }); // nodeR
- }); // nodeD
- }); // nodeC
- }); // nodeA
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometry,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(nodeA));
-
- ZReorderTestRenderer renderer;
- frameBuilder.replayBakedOps<TestDispatcher>(renderer);
- EXPECT_EQ(5, renderer.getIndex());
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/tests/unit/GlopBuilderTests.cpp b/libs/hwui/tests/unit/GlopBuilderTests.cpp
deleted file mode 100644
index c8bfc99fac92..000000000000
--- a/libs/hwui/tests/unit/GlopBuilderTests.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include "Glop.h"
-#include "GlopBuilder.h"
-#include "Rect.h"
-#include "tests/common/TestUtils.h"
-#include "utils/Color.h"
-
-#include <SkPaint.h>
-
-using namespace android::uirenderer;
-
-static void expectFillEq(Glop::Fill& expectedFill, Glop::Fill& builtFill) {
- EXPECT_EQ(expectedFill.colorEnabled, builtFill.colorEnabled);
- if (expectedFill.colorEnabled) EXPECT_EQ(expectedFill.color, builtFill.color);
-
- EXPECT_EQ(expectedFill.filterMode, builtFill.filterMode);
- if (expectedFill.filterMode == ProgramDescription::ColorFilterMode::Blend) {
- EXPECT_EQ(expectedFill.filter.color, builtFill.filter.color);
- } else if (expectedFill.filterMode == ProgramDescription::ColorFilterMode::Matrix) {
- Glop::Fill::Filter::Matrix& expectedMatrix = expectedFill.filter.matrix;
- Glop::Fill::Filter::Matrix& builtMatrix = expectedFill.filter.matrix;
- EXPECT_TRUE(std::memcmp(expectedMatrix.matrix, builtMatrix.matrix,
- sizeof(Glop::Fill::Filter::Matrix::matrix)));
- EXPECT_TRUE(std::memcmp(expectedMatrix.vector, builtMatrix.vector,
- sizeof(Glop::Fill::Filter::Matrix::vector)));
- }
- EXPECT_EQ(expectedFill.skiaShaderData.skiaShaderType, builtFill.skiaShaderData.skiaShaderType);
- EXPECT_EQ(expectedFill.texture.clamp, builtFill.texture.clamp);
- EXPECT_EQ(expectedFill.texture.filter, builtFill.texture.filter);
- EXPECT_TRUE((expectedFill.texture.texture && builtFill.texture.texture) ||
- (!expectedFill.texture.texture && !builtFill.texture.texture));
- if (expectedFill.texture.texture) {
- EXPECT_EQ(expectedFill.texture.texture->target(), builtFill.texture.texture->target());
- }
- EXPECT_EQ(expectedFill.texture.textureTransform, builtFill.texture.textureTransform);
-}
-
-static void expectBlendEq(Glop::Blend& expectedBlend, Glop::Blend& builtBlend) {
- EXPECT_EQ(expectedBlend.src, builtBlend.src);
- EXPECT_EQ(expectedBlend.dst, builtBlend.dst);
-}
-
-static void expectMeshEq(Glop::Mesh& expectedMesh, Glop::Mesh& builtMesh) {
- EXPECT_EQ(expectedMesh.elementCount, builtMesh.elementCount);
- EXPECT_EQ(expectedMesh.primitiveMode, builtMesh.primitiveMode);
- EXPECT_EQ(expectedMesh.indices.indices, builtMesh.indices.indices);
- EXPECT_EQ(expectedMesh.indices.bufferObject, builtMesh.indices.bufferObject);
- EXPECT_EQ(expectedMesh.vertices.attribFlags, builtMesh.vertices.attribFlags);
- EXPECT_EQ(expectedMesh.vertices.bufferObject, builtMesh.vertices.bufferObject);
- EXPECT_EQ(expectedMesh.vertices.color, builtMesh.vertices.color);
- EXPECT_EQ(expectedMesh.vertices.position, builtMesh.vertices.position);
- EXPECT_EQ(expectedMesh.vertices.stride, builtMesh.vertices.stride);
- EXPECT_EQ(expectedMesh.vertices.texCoord, builtMesh.vertices.texCoord);
-
- if (builtMesh.vertices.position) {
- for (int i = 0; i < 4; i++) {
- TextureVertex& expectedVertex = expectedMesh.mappedVertices[i];
- TextureVertex& builtVertex = builtMesh.mappedVertices[i];
- EXPECT_EQ(expectedVertex.u, builtVertex.u);
- EXPECT_EQ(expectedVertex.v, builtVertex.v);
- EXPECT_EQ(expectedVertex.x, builtVertex.x);
- EXPECT_EQ(expectedVertex.y, builtVertex.y);
- }
- }
-}
-
-static void expectTransformEq(Glop::Transform& expectedTransform, Glop::Transform& builtTransform) {
- EXPECT_EQ(expectedTransform.canvas, builtTransform.canvas);
- EXPECT_EQ(expectedTransform.modelView, builtTransform.modelView);
- EXPECT_EQ(expectedTransform.transformFlags, expectedTransform.transformFlags);
-}
-
-static void expectGlopEq(Glop& expectedGlop, Glop& builtGlop) {
- expectBlendEq(expectedGlop.blend, builtGlop.blend);
- expectFillEq(expectedGlop.fill, builtGlop.fill);
- expectMeshEq(expectedGlop.mesh, builtGlop.mesh);
- expectTransformEq(expectedGlop.transform, builtGlop.transform);
-}
-
-static std::unique_ptr<Glop> blackUnitQuadGlop(RenderState& renderState) {
- std::unique_ptr<Glop> glop(new Glop());
- glop->blend = {GL_ZERO, GL_ZERO};
- glop->mesh.elementCount = 4;
- glop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
- glop->mesh.indices.indices = nullptr;
- glop->mesh.indices.bufferObject = GL_ZERO;
- glop->mesh.vertices = {renderState.meshState().getUnitQuadVBO(),
- VertexAttribFlags::None,
- nullptr,
- nullptr,
- nullptr,
- kTextureVertexStride};
- glop->transform.modelView.loadIdentity();
- glop->fill.colorEnabled = true;
- glop->fill.color.set(Color::Black);
- glop->fill.skiaShaderData.skiaShaderType = kNone_SkiaShaderType;
- glop->fill.filterMode = ProgramDescription::ColorFilterMode::None;
- glop->fill.texture = {nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr};
- return glop;
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(GlopBuilder, rectSnapTest) {
- RenderState& renderState = renderThread.renderState();
- Caches& caches = Caches::getInstance();
- SkPaint paint;
- Rect dest(1, 1, 100, 100);
- Matrix4 simpleTranslate;
- simpleTranslate.loadTranslate(0.7, 0.7, 0);
- Glop glop;
- GlopBuilder(renderState, caches, &glop)
- .setRoundRectClipState(nullptr)
- .setMeshUnitQuad()
- .setFillPaint(paint, 1.0f)
- .setTransform(simpleTranslate, TransformFlags::None)
- .setModelViewMapUnitToRectSnap(dest)
- .build();
-
- std::unique_ptr<Glop> goldenGlop(blackUnitQuadGlop(renderState));
- // Rect(1,1,100,100) is the set destination,
- // so unit quad should be translated by (1,1) and scaled by (99, 99)
- // Tricky part: because translate (0.7, 0.7) and snapping were set in glopBuilder,
- // unit quad also should be translate by additional (0.3, 0.3) to snap to exact pixels.
- goldenGlop->transform.modelView.loadTranslate(1.3, 1.3, 0);
- goldenGlop->transform.modelView.scale(99, 99, 1);
- goldenGlop->transform.canvas = simpleTranslate;
- goldenGlop->fill.texture.filter = GL_NEAREST;
- expectGlopEq(*goldenGlop, glop);
-}
diff --git a/libs/hwui/tests/unit/GpuMemoryTrackerTests.cpp b/libs/hwui/tests/unit/GpuMemoryTrackerTests.cpp
index 9bfb08292be2..08b967964c59 100644
--- a/libs/hwui/tests/unit/GpuMemoryTrackerTests.cpp
+++ b/libs/hwui/tests/unit/GpuMemoryTrackerTests.cpp
@@ -39,7 +39,7 @@ public:
// current thread can spoof being a GPU thread
static void destroyEglContext() {
if (TestUtils::isRenderThreadRunning()) {
- TestUtils::runOnRenderThread([](RenderThread& thread) { thread.eglManager().destroy(); });
+ TestUtils::runOnRenderThread([](RenderThread& thread) { thread.destroyGlContext(); });
}
}
diff --git a/libs/hwui/tests/unit/GradientCacheTests.cpp b/libs/hwui/tests/unit/GradientCacheTests.cpp
deleted file mode 100644
index 6710c71c386f..000000000000
--- a/libs/hwui/tests/unit/GradientCacheTests.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include "Extensions.h"
-#include "GradientCache.h"
-#include "tests/common/TestUtils.h"
-
-using namespace android;
-using namespace android::uirenderer;
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(GradientCache, addRemove) {
- Extensions extensions;
- GradientCache cache(extensions);
- ASSERT_LT(1000u, cache.getMaxSize()) << "Expect non-trivial size";
-
- SkColor colors[] = {0xFF00FF00, 0xFFFF0000, 0xFF0000FF};
- float positions[] = {1, 2, 3};
- Texture* texture = cache.get(colors, positions, 3);
- ASSERT_TRUE(texture);
- ASSERT_FALSE(texture->cleanup);
- ASSERT_EQ((uint32_t)texture->objectSize(), cache.getSize());
- ASSERT_TRUE(cache.getSize());
- cache.clear();
- ASSERT_EQ(cache.getSize(), 0u);
-}
diff --git a/libs/hwui/tests/unit/LeakCheckTests.cpp b/libs/hwui/tests/unit/LeakCheckTests.cpp
deleted file mode 100644
index 20ec0848212f..000000000000
--- a/libs/hwui/tests/unit/LeakCheckTests.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include "BakedOpDispatcher.h"
-#include "BakedOpRenderer.h"
-#include "FrameBuilder.h"
-#include "LayerUpdateQueue.h"
-#include "RecordingCanvas.h"
-#include "tests/common/TestUtils.h"
-
-#include <gtest/gtest.h>
-
-using namespace android;
-using namespace android::uirenderer;
-
-const FrameBuilder::LightGeometry sLightGeometery = {{100, 100, 100}, 50};
-const BakedOpRenderer::LightInfo sLightInfo = {128, 128};
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(LeakCheck, saveLayer_overdrawRejection) {
- auto node = TestUtils::createNode(0, 0, 100, 100, [](RenderProperties& props, Canvas& canvas) {
- canvas.saveLayerAlpha(0, 0, 100, 100, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.restore();
-
- // opaque draw, rejects saveLayer beneath
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- });
- RenderState& renderState = renderThread.renderState();
- Caches& caches = Caches::getInstance();
-
- FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100, sLightGeometery,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
- BakedOpRenderer renderer(caches, renderState, true, false, sLightInfo);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(LeakCheck, saveLayerUnclipped_simple) {
- auto node = TestUtils::createNode(0, 0, 200, 200, [](RenderProperties& props, Canvas& canvas) {
- canvas.saveLayerAlpha(10, 10, 190, 190, 128, (SaveFlags::Flags)(0));
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- });
- RenderState& renderState = renderThread.renderState();
- Caches& caches = Caches::getInstance();
-
- FrameBuilder frameBuilder(SkRect::MakeWH(200, 200), 200, 200, sLightGeometery,
- Caches::getInstance());
- frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node));
- BakedOpRenderer renderer(caches, renderState, true, false, sLightInfo);
- frameBuilder.replayBakedOps<BakedOpDispatcher>(renderer);
-}
diff --git a/libs/hwui/tests/unit/MeshStateTests.cpp b/libs/hwui/tests/unit/MeshStateTests.cpp
deleted file mode 100644
index 1573fd30d5cb..000000000000
--- a/libs/hwui/tests/unit/MeshStateTests.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <debug/MockGlesDriver.h>
-#include <debug/ScopedReplaceDriver.h>
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-#include <renderstate/MeshState.h>
-#include <tests/common/TestUtils.h>
-
-using namespace android::uirenderer;
-using namespace testing;
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(MeshState, genOrUpdate) {
- debug::ScopedReplaceDriver<debug::MockGlesDriver> driverRef;
- auto& mockGlDriver = driverRef.get();
- EXPECT_CALL(mockGlDriver, glGenBuffers_(_, _)).WillOnce(SetArgPointee<1>(35));
- EXPECT_CALL(mockGlDriver, glBindBuffer_(_, 35));
- EXPECT_CALL(mockGlDriver, glBufferData_(_, _, _, _));
-
- GLuint buffer = 0;
- renderThread.renderState().meshState().genOrUpdateMeshBuffer(&buffer, 10, nullptr,
- GL_DYNAMIC_DRAW);
-}
diff --git a/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp b/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
deleted file mode 100644
index 0d4736757629..000000000000
--- a/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
+++ /dev/null
@@ -1,244 +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.
- */
-
-#include <Rect.h>
-#include <gtest/gtest.h>
-#include <renderstate/OffscreenBufferPool.h>
-
-#include <tests/common/TestUtils.h>
-
-using namespace android::uirenderer;
-
-TEST(OffscreenBuffer, computeIdealDimension) {
- EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(1));
- EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(31));
- EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(33));
- EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(64));
- EXPECT_EQ(1024u, OffscreenBuffer::computeIdealDimension(1000));
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBuffer, construct) {
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 49u, 149u);
- EXPECT_EQ(49u, layer.viewportWidth);
- EXPECT_EQ(149u, layer.viewportHeight);
-
- EXPECT_EQ(64u, layer.texture.width());
- EXPECT_EQ(192u, layer.texture.height());
-
- EXPECT_EQ(64u * 192u * 4u, layer.getSizeInBytes());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBuffer, constructWideColorGamut) {
- OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 49u, 149u, true);
- EXPECT_EQ(49u, layer.viewportWidth);
- EXPECT_EQ(149u, layer.viewportHeight);
-
- EXPECT_EQ(64u, layer.texture.width());
- EXPECT_EQ(192u, layer.texture.height());
-
- EXPECT_TRUE(layer.wideColorGamut);
-
- EXPECT_EQ(64u * 192u * 8u, layer.getSizeInBytes());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBuffer, getTextureCoordinates) {
- OffscreenBuffer layerAligned(renderThread.renderState(), Caches::getInstance(), 256u, 256u);
- EXPECT_EQ(Rect(0, 1, 1, 0), layerAligned.getTextureCoordinates());
-
- OffscreenBuffer layerUnaligned(renderThread.renderState(), Caches::getInstance(), 200u, 225u);
- EXPECT_EQ(Rect(0, 225.0f / 256.0f, 200.0f / 256.0f, 0), layerUnaligned.getTextureCoordinates());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBuffer, dirty) {
- OffscreenBuffer buffer(renderThread.renderState(), Caches::getInstance(), 256u, 256u);
- buffer.dirty(Rect(-100, -100, 100, 100));
- EXPECT_EQ(android::Rect(100, 100), buffer.region.getBounds());
-}
-
-RENDERTHREAD_TEST(OffscreenBufferPool, construct) {
- OffscreenBufferPool pool;
- EXPECT_EQ(0u, pool.getCount()) << "pool must be created empty";
- EXPECT_EQ(0u, pool.getSize()) << "pool must be created empty";
- // TODO: Does this really make sense as a test?
- EXPECT_EQ(DeviceInfo::multiplyByResolution(4 * 4), pool.getMaxSize());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, getPutClear) {
- OffscreenBufferPool pool;
-
- auto layer = pool.get(renderThread.renderState(), 100u, 200u);
- EXPECT_EQ(100u, layer->viewportWidth);
- EXPECT_EQ(200u, layer->viewportHeight);
-
- ASSERT_LT(layer->getSizeInBytes(), pool.getMaxSize());
-
- pool.putOrDelete(layer);
- ASSERT_EQ(layer->getSizeInBytes(), pool.getSize());
-
- auto layer2 = pool.get(renderThread.renderState(), 102u, 202u);
- EXPECT_EQ(layer, layer2) << "layer should be recycled";
- ASSERT_EQ(0u, pool.getSize()) << "pool should have been emptied by removing only layer";
-
- pool.putOrDelete(layer);
- EXPECT_EQ(1u, pool.getCount());
- pool.clear();
- EXPECT_EQ(0u, pool.getSize());
- EXPECT_EQ(0u, pool.getCount());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, getPutClearWideColorGamut) {
- OffscreenBufferPool pool;
-
- auto layer = pool.get(renderThread.renderState(), 100u, 200u, true);
- EXPECT_EQ(100u, layer->viewportWidth);
- EXPECT_EQ(200u, layer->viewportHeight);
- EXPECT_TRUE(layer->wideColorGamut);
-
- ASSERT_LT(layer->getSizeInBytes(), pool.getMaxSize());
-
- pool.putOrDelete(layer);
- ASSERT_EQ(layer->getSizeInBytes(), pool.getSize());
-
- auto layer2 = pool.get(renderThread.renderState(), 102u, 202u, true);
- EXPECT_EQ(layer, layer2) << "layer should be recycled";
- ASSERT_EQ(0u, pool.getSize()) << "pool should have been emptied by removing only layer";
-
- pool.putOrDelete(layer2);
- EXPECT_EQ(1u, pool.getCount());
- pool.clear();
- EXPECT_EQ(0u, pool.getSize());
- EXPECT_EQ(0u, pool.getCount());
-
- // add non wide gamut layer
- auto layer3 = pool.get(renderThread.renderState(), 100u, 200u);
- EXPECT_FALSE(layer3->wideColorGamut);
- pool.putOrDelete(layer3);
- EXPECT_EQ(1u, pool.getCount());
-
- auto layer4 = pool.get(renderThread.renderState(), 100u, 200u, true);
- EXPECT_TRUE(layer4->wideColorGamut);
- EXPECT_EQ(1u, pool.getCount());
- ASSERT_NE(layer3, layer4);
-
- pool.putOrDelete(layer4);
-
- pool.clear();
- EXPECT_EQ(0u, pool.getSize());
- EXPECT_EQ(0u, pool.getCount());
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, resize) {
- OffscreenBufferPool pool;
-
- auto layer = pool.get(renderThread.renderState(), 64u, 64u);
- layer->dirty(Rect(64, 64));
-
- // resize in place
- ASSERT_EQ(layer, pool.resize(layer, 60u, 55u));
- EXPECT_TRUE(layer->region.isEmpty()) << "In place resize should clear usage region";
- EXPECT_EQ(60u, layer->viewportWidth);
- EXPECT_EQ(55u, layer->viewportHeight);
- EXPECT_EQ(64u, layer->texture.width());
- EXPECT_EQ(64u, layer->texture.height());
-
- // resized to use different object in pool
- auto layer2 = pool.get(renderThread.renderState(), 128u, 128u);
- layer2->dirty(Rect(128, 128));
- EXPECT_FALSE(layer2->region.isEmpty());
- pool.putOrDelete(layer2);
- ASSERT_EQ(1u, pool.getCount());
-
- ASSERT_EQ(layer2, pool.resize(layer, 120u, 125u));
- EXPECT_TRUE(layer2->region.isEmpty()) << "Swap resize should clear usage region";
- EXPECT_EQ(120u, layer2->viewportWidth);
- EXPECT_EQ(125u, layer2->viewportHeight);
- EXPECT_EQ(128u, layer2->texture.width());
- EXPECT_EQ(128u, layer2->texture.height());
-
- // original allocation now only thing in pool
- EXPECT_EQ(1u, pool.getCount());
- EXPECT_EQ(layer->getSizeInBytes(), pool.getSize());
-
- pool.putOrDelete(layer2);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, resizeWideColorGamut) {
- OffscreenBufferPool pool;
-
- auto layer = pool.get(renderThread.renderState(), 64u, 64u, true);
-
- // resize in place
- ASSERT_EQ(layer, pool.resize(layer, 60u, 55u));
- EXPECT_EQ(60u, layer->viewportWidth);
- EXPECT_EQ(55u, layer->viewportHeight);
- EXPECT_EQ(64u, layer->texture.width());
- EXPECT_EQ(64u, layer->texture.height());
-
- EXPECT_TRUE(layer->wideColorGamut);
- EXPECT_EQ(64u * 64u * 8u, layer->getSizeInBytes());
-
- // resized to use different object in pool
- auto layer2 = pool.get(renderThread.renderState(), 128u, 128u, true);
- pool.putOrDelete(layer2);
- ASSERT_EQ(1u, pool.getCount());
-
- // add a non-wide gamut layer
- auto layer3 = pool.get(renderThread.renderState(), 128u, 128u);
- pool.putOrDelete(layer3);
- ASSERT_EQ(2u, pool.getCount());
-
- ASSERT_EQ(layer2, pool.resize(layer, 120u, 125u));
- EXPECT_EQ(120u, layer2->viewportWidth);
- EXPECT_EQ(125u, layer2->viewportHeight);
- EXPECT_EQ(128u, layer2->texture.width());
- EXPECT_EQ(128u, layer2->texture.height());
-
- EXPECT_TRUE(layer2->wideColorGamut);
- EXPECT_EQ(128u * 128u * 8u, layer2->getSizeInBytes());
-
- pool.putOrDelete(layer2);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, putAndDestroy) {
- OffscreenBufferPool pool;
- // layer too big to return to the pool
- // Note: this relies on the fact that the pool won't reject based on max texture size
- auto hugeLayer = pool.get(renderThread.renderState(), pool.getMaxSize() / 64, 64);
- EXPECT_GT(hugeLayer->getSizeInBytes(), pool.getMaxSize());
- pool.putOrDelete(hugeLayer);
- EXPECT_EQ(0u, pool.getCount()); // failed to put (so was destroyed instead)
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(OffscreenBufferPool, clear) {
- EXPECT_EQ(0, GpuMemoryTracker::getInstanceCount(GpuObjectType::OffscreenBuffer));
- OffscreenBufferPool pool;
-
- // Create many buffers, with several at each size
- std::vector<OffscreenBuffer*> buffers;
- for (int size = 32; size <= 128; size += 32) {
- for (int i = 0; i < 10; i++) {
- buffers.push_back(pool.get(renderThread.renderState(), size, size));
- }
- }
- EXPECT_EQ(0u, pool.getCount()) << "Expect nothing inside";
- for (auto& buffer : buffers) pool.putOrDelete(buffer);
- EXPECT_EQ(40u, pool.getCount()) << "Expect all items added";
- EXPECT_EQ(40, GpuMemoryTracker::getInstanceCount(GpuObjectType::OffscreenBuffer));
- pool.clear();
- EXPECT_EQ(0u, pool.getCount()) << "Expect all items cleared";
-
- EXPECT_EQ(0, GpuMemoryTracker::getInstanceCount(GpuObjectType::OffscreenBuffer));
-}
diff --git a/libs/hwui/tests/unit/OpDumperTests.cpp b/libs/hwui/tests/unit/OpDumperTests.cpp
deleted file mode 100644
index ef30e872a7bd..000000000000
--- a/libs/hwui/tests/unit/OpDumperTests.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include "OpDumper.h"
-#include "tests/common/TestUtils.h"
-
-using namespace android;
-using namespace android::uirenderer;
-
-TEST(OpDumper, dump) {
- SkPaint paint;
- RectOp op(uirenderer::Rect(100, 100), Matrix4::identity(), nullptr, &paint);
-
- std::stringstream stream;
- OpDumper::dump(op, stream);
- EXPECT_STREQ("RectOp [100 x 100]", stream.str().c_str());
-
- stream.str("");
- OpDumper::dump(op, stream, 2);
- EXPECT_STREQ(" RectOp [100 x 100]", stream.str().c_str());
-
- ClipRect clipRect(uirenderer::Rect(50, 50));
- op.localClip = &clipRect;
-
- stream.str("");
- OpDumper::dump(op, stream, 2);
- EXPECT_STREQ(" RectOp [100 x 100] clip=[50 x 50] mode=0", stream.str().c_str());
-}
diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp
deleted file mode 100644
index 8a9e34f81c6d..000000000000
--- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp
+++ /dev/null
@@ -1,847 +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.
- */
-
-#include <gtest/gtest.h>
-
-#include <DeferredLayerUpdater.h>
-#include <RecordedOp.h>
-#include <RecordingCanvas.h>
-#include <hwui/Paint.h>
-#include <minikin/Layout.h>
-#include <tests/common/TestUtils.h>
-#include <utils/Color.h>
-
-#include <SkGradientShader.h>
-#include <SkImagePriv.h>
-#include <SkShader.h>
-
-namespace android {
-namespace uirenderer {
-
-static void playbackOps(const DisplayList& displayList,
- std::function<void(const RecordedOp&)> opReceiver) {
- for (auto& chunk : displayList.getChunks()) {
- for (size_t opIndex = chunk.beginOpIndex; opIndex < chunk.endOpIndex; opIndex++) {
- RecordedOp* op = displayList.getOps()[opIndex];
- opReceiver(*op);
- }
- }
-}
-
-static void validateSingleOp(std::unique_ptr<DisplayList>& dl,
- std::function<void(const RecordedOp& op)> opValidator) {
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- opValidator(*(dl->getOps()[0]));
-}
-
-// The RecordingCanvas is only ever used by the OpenGL RenderPipeline and never when Skia is in use.
-// Thus, even though many of these test are not directly dependent on the current RenderPipeline, we
-// set them all to be OPENGL_PIPELINE_TESTs in case the underlying code in RecordingCanvas ever
-// changes to require the use of the OPENGL_PIPELINE. Currently the textureLayer test is the only
-// test that requires being an OPENGL_PIPELINE_TEST.
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, emptyPlayback) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.restore();
- });
- playbackOps(*dl, [](const RecordedOp& op) { ADD_FAILURE(); });
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, clipRect) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(0, 0, 100, 100, SkClipOp::kIntersect);
- canvas.drawRect(0, 0, 50, 50, SkPaint());
- canvas.drawRect(50, 50, 100, 100, SkPaint());
- canvas.restore();
- });
-
- ASSERT_EQ(2u, dl->getOps().size()) << "Must be exactly two ops";
- EXPECT_CLIP_RECT(Rect(100, 100), dl->getOps()[0]->localClip);
- EXPECT_CLIP_RECT(Rect(100, 100), dl->getOps()[1]->localClip);
- EXPECT_EQ(dl->getOps()[0]->localClip, dl->getOps()[1]->localClip)
- << "Clip should be serialized once";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, emptyClipRect) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(0, 0, 100, 100, SkClipOp::kIntersect);
- canvas.clipRect(100, 100, 200, 200, SkClipOp::kIntersect);
- canvas.drawRect(0, 0, 50, 50, SkPaint()); // rejected at record time
- canvas.restore();
- });
- ASSERT_EQ(0u, dl->getOps().size()) << "Must be zero ops. Rect should be rejected.";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, emptyPaintRejection) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- SkPaint emptyPaint;
- emptyPaint.setColor(Color::Transparent);
-
- float points[] = {0, 0, 200, 200};
- canvas.drawPoints(points, 4, emptyPaint);
- canvas.drawLines(points, 4, emptyPaint);
- canvas.drawRect(0, 0, 200, 200, emptyPaint);
- canvas.drawRegion(SkRegion(SkIRect::MakeWH(200, 200)), emptyPaint);
- canvas.drawRoundRect(0, 0, 200, 200, 10, 10, emptyPaint);
- canvas.drawCircle(100, 100, 100, emptyPaint);
- canvas.drawOval(0, 0, 200, 200, emptyPaint);
- canvas.drawArc(0, 0, 200, 200, 0, 360, true, emptyPaint);
- SkPath path;
- path.addRect(0, 0, 200, 200);
- canvas.drawPath(path, emptyPaint);
- });
- EXPECT_EQ(0u, dl->getOps().size()) << "Op should be rejected";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawArc) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.drawArc(0, 0, 200, 200, 0, 180, true, SkPaint());
- canvas.drawArc(0, 0, 100, 100, 0, 360, true, SkPaint());
- });
-
- auto&& ops = dl->getOps();
- ASSERT_EQ(2u, ops.size()) << "Must be exactly two ops";
- EXPECT_EQ(RecordedOpId::ArcOp, ops[0]->opId);
- EXPECT_EQ(Rect(200, 200), ops[0]->unmappedBounds);
-
- EXPECT_EQ(RecordedOpId::OvalOp, ops[1]->opId) << "Circular arcs should be converted to ovals";
- EXPECT_EQ(Rect(100, 100), ops[1]->unmappedBounds);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawLines) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setStrokeWidth(
- 20); // doesn't affect recorded bounds - would be resolved at bake time
- float points[] = {0, 0, 20, 10, 30, 40, 90}; // NB: only 1 valid line
- canvas.drawLines(&points[0], 7, paint);
- });
-
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- auto op = dl->getOps()[0];
- ASSERT_EQ(RecordedOpId::LinesOp, op->opId);
- EXPECT_EQ(4, ((LinesOp*)op)->floatCount)
- << "float count must be rounded down to closest multiple of 4";
- EXPECT_EQ(Rect(20, 10), op->unmappedBounds)
- << "unmapped bounds must be size of line, and not outset for stroke width";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawRect) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 100, 200, [](RecordingCanvas& canvas) { canvas.drawRect(10, 20, 90, 180, SkPaint()); });
-
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- auto op = *(dl->getOps()[0]);
- ASSERT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_EQ(Rect(10, 20, 90, 180), op.unmappedBounds);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawRoundRect) {
- // Round case - stays rounded
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- canvas.drawRoundRect(0, 0, 100, 100, 10, 10, SkPaint());
- });
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- ASSERT_EQ(RecordedOpId::RoundRectOp, dl->getOps()[0]->opId);
-
- // Non-rounded case - turned into drawRect
- dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- canvas.drawRoundRect(0, 0, 100, 100, 0, -1, SkPaint());
- });
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- ASSERT_EQ(RecordedOpId::RectOp, dl->getOps()[0]->opId)
- << "Non-rounded rects should be converted";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawGlyphs) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- });
-
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- count++;
- ASSERT_EQ(RecordedOpId::TextOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- EXPECT_TRUE(op.unmappedBounds.contains(25, 15, 50, 25))
- << "Op expected to be 25+ pixels wide, 10+ pixels tall";
- });
- ASSERT_EQ(1, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawGlyphs_strikeThruAndUnderline) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- for (int i = 0; i < 2; i++) {
- for (int j = 0; j < 2; j++) {
- uint32_t flags = paint.getFlags();
- if (i != 0) {
- flags |= SkPaint::kUnderlineText_ReserveFlag;
- } else {
- flags &= ~SkPaint::kUnderlineText_ReserveFlag;
- }
- if (j != 0) {
- flags |= SkPaint::kStrikeThruText_ReserveFlag;
- } else {
- flags &= ~SkPaint::kStrikeThruText_ReserveFlag;
- }
- paint.setFlags(flags);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- }
- }
- });
-
- auto ops = dl->getOps();
- ASSERT_EQ(8u, ops.size());
-
- int index = 0;
- EXPECT_EQ(RecordedOpId::TextOp, ops[index++]->opId); // no underline or strikethrough
-
- EXPECT_EQ(RecordedOpId::TextOp, ops[index++]->opId);
- EXPECT_EQ(RecordedOpId::RectOp, ops[index++]->opId); // strikethrough only
-
- EXPECT_EQ(RecordedOpId::TextOp, ops[index++]->opId);
- EXPECT_EQ(RecordedOpId::RectOp, ops[index++]->opId); // underline only
-
- EXPECT_EQ(RecordedOpId::TextOp, ops[index++]->opId);
- EXPECT_EQ(RecordedOpId::RectOp, ops[index++]->opId); // underline
- EXPECT_EQ(RecordedOpId::RectOp, ops[index++]->opId); // strikethrough
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawGlyphs_forceAlignLeft) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- paint.setTextAlign(SkPaint::kLeft_Align);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- paint.setTextAlign(SkPaint::kCenter_Align);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- paint.setTextAlign(SkPaint::kRight_Align);
- TestUtils::drawUtf8ToCanvas(&canvas, "test text", paint, 25, 25);
- });
-
- int count = 0;
- float lastX = FLT_MAX;
- playbackOps(*dl, [&count, &lastX](const RecordedOp& op) {
- count++;
- ASSERT_EQ(RecordedOpId::TextOp, op.opId);
- EXPECT_EQ(SkPaint::kLeft_Align, op.paint->getTextAlign())
- << "recorded drawText commands must force kLeft_Align on their paint";
-
- // verify TestUtils alignment offsetting (TODO: move asserts to Canvas base class)
- EXPECT_GT(lastX, ((const TextOp&)op).x)
- << "x coordinate should reduce across each of the draw commands, from alignment";
- lastX = ((const TextOp&)op).x;
- });
- ASSERT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawColor) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.drawColor(Color::Black, SkBlendMode::kSrcOver);
- });
-
- ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
- auto op = *(dl->getOps()[0]);
- EXPECT_EQ(RecordedOpId::ColorOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.unmappedBounds.isEmpty()) << "Expect undefined recorded bounds";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, backgroundAndImage) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(25, 25));
- SkPaint paint;
- paint.setColor(SK_ColorBLUE);
-
- canvas.save(SaveFlags::MatrixClip);
- {
- // a background!
- canvas.save(SaveFlags::MatrixClip);
- canvas.drawRect(0, 0, 100, 200, paint);
- canvas.restore();
- }
- {
- // an image!
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(25, 25);
- canvas.scale(2, 2);
- canvas.drawBitmap(*bitmap, 0, 0, nullptr);
- canvas.restore();
- }
- canvas.restore();
- });
-
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count == 0) {
- ASSERT_EQ(RecordedOpId::RectOp, op.opId);
- ASSERT_NE(nullptr, op.paint);
- EXPECT_EQ(SK_ColorBLUE, op.paint->getColor());
- EXPECT_EQ(Rect(100, 200), op.unmappedBounds);
- EXPECT_EQ(nullptr, op.localClip);
-
- Matrix4 expectedMatrix;
- expectedMatrix.loadIdentity();
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- } else {
- ASSERT_EQ(RecordedOpId::BitmapOp, op.opId);
- EXPECT_EQ(nullptr, op.paint);
- EXPECT_EQ(Rect(25, 25), op.unmappedBounds);
- EXPECT_EQ(nullptr, op.localClip);
-
- Matrix4 expectedMatrix;
- expectedMatrix.loadTranslate(25, 25, 0);
- expectedMatrix.scale(2, 2, 1);
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- }
- count++;
- });
- ASSERT_EQ(2, count);
-}
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(RecordingCanvas, textureLayer) {
- auto layerUpdater =
- TestUtils::createTextureLayerUpdater(renderThread, 100, 100, SkMatrix::MakeTrans(5, 5));
-
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200,
- [&layerUpdater](RecordingCanvas& canvas) { canvas.drawLayer(layerUpdater.get()); });
-
- validateSingleOp(dl, [](const RecordedOp& op) {
- ASSERT_EQ(RecordedOpId::TextureLayerOp, op.opId);
- ASSERT_TRUE(op.localMatrix.isIdentity()) << "Op must not apply matrix at record time.";
- });
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_simple) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10, 20, 190, 180, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(10, 20, 190, 180, SkPaint());
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- Matrix4 expectedMatrix;
- switch (count++) {
- case 0:
- EXPECT_EQ(RecordedOpId::BeginLayerOp, op.opId);
- EXPECT_EQ(Rect(10, 20, 190, 180), op.unmappedBounds);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- break;
- case 1:
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_CLIP_RECT(Rect(180, 160), op.localClip);
- EXPECT_EQ(Rect(10, 20, 190, 180), op.unmappedBounds);
- expectedMatrix.loadTranslate(-10, -20, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- break;
- case 2:
- EXPECT_EQ(RecordedOpId::EndLayerOp, op.opId);
- // Don't bother asserting recording state data - it's not used
- break;
- default:
- ADD_FAILURE();
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_rounding) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10.25f, 10.75f, 89.25f, 89.75f, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(20, 20, 80, 80, SkPaint());
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- Matrix4 expectedMatrix;
- switch (count++) {
- case 0:
- EXPECT_EQ(RecordedOpId::BeginLayerOp, op.opId);
- EXPECT_EQ(Rect(10, 10, 90, 90), op.unmappedBounds) << "Expect bounds rounded out";
- break;
- case 1:
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- expectedMatrix.loadTranslate(-10, -10, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix) << "Expect rounded offset";
- break;
- case 2:
- EXPECT_EQ(RecordedOpId::EndLayerOp, op.opId);
- // Don't bother asserting recording state data - it's not used
- break;
- default:
- ADD_FAILURE();
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_missingRestore) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(0, 0, 200, 200, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- // Note: restore omitted, shouldn't result in unmatched save
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 2) {
- EXPECT_EQ(RecordedOpId::EndLayerOp, op.opId);
- }
- });
- EXPECT_EQ(3, count) << "Missing a restore shouldn't result in an unmatched saveLayer";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_simpleUnclipped) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.saveLayerAlpha(10, 20, 190, 180, 128, (SaveFlags::Flags)0); // unclipped
- canvas.drawRect(10, 20, 190, 180, SkPaint());
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- switch (count++) {
- case 0:
- EXPECT_EQ(RecordedOpId::BeginUnclippedLayerOp, op.opId);
- EXPECT_EQ(Rect(10, 20, 190, 180), op.unmappedBounds);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- break;
- case 1:
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_EQ(Rect(10, 20, 190, 180), op.unmappedBounds);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- break;
- case 2:
- EXPECT_EQ(RecordedOpId::EndUnclippedLayerOp, op.opId);
- // Don't bother asserting recording state data - it's not used
- break;
- default:
- ADD_FAILURE();
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_addClipFlag) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(10, 20, 190, 180, SkClipOp::kIntersect);
- canvas.saveLayerAlpha(10, 20, 190, 180, 128, (SaveFlags::Flags)0); // unclipped
- canvas.drawRect(10, 20, 190, 180, SkPaint());
- canvas.restore();
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 0) {
- EXPECT_EQ(RecordedOpId::BeginLayerOp, op.opId)
- << "Clip + unclipped saveLayer should result in a clipped layer";
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_viewportCrop) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- // shouldn't matter, since saveLayer will clip to its bounds
- canvas.clipRect(-1000, -1000, 1000, 1000, SkClipOp::kReplace_deprecated);
-
- canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 1) {
- Matrix4 expectedMatrix;
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_CLIP_RECT(Rect(100, 100), op.localClip) // Recorded clip rect should be
- // intersection of viewport and saveLayer bounds, in layer space;
- EXPECT_EQ(Rect(400, 400), op.unmappedBounds);
- expectedMatrix.loadTranslate(-100, -100, 0);
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_rotateUnclipped) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(100, 100);
- canvas.rotate(45);
- canvas.translate(-50, -50);
-
- canvas.saveLayerAlpha(0, 0, 100, 100, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.restore();
-
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 1) {
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
- EXPECT_CLIP_RECT(Rect(100, 100), op.localClip);
- EXPECT_EQ(Rect(100, 100), op.unmappedBounds);
- EXPECT_MATRIX_APPROX_EQ(Matrix4::identity(), op.localMatrix)
- << "Recorded op shouldn't see any canvas transform before the saveLayer";
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_rotateClipped) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(100, 100);
- canvas.rotate(45);
- canvas.translate(-200, -200);
-
- // area of saveLayer will be clipped to parent viewport, so we ask for 400x400...
- canvas.saveLayerAlpha(0, 0, 400, 400, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.restore();
-
- canvas.restore();
- });
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- if (count++ == 1) {
- Matrix4 expectedMatrix;
- EXPECT_EQ(RecordedOpId::RectOp, op.opId);
-
- // ...and get about 58.6, 58.6, 341.4 341.4, because the bounds are clipped by
- // the parent 200x200 viewport, but prior to rotation
- ASSERT_NE(nullptr, op.localClip);
- ASSERT_EQ(ClipMode::Rectangle, op.localClip->mode);
- // NOTE: this check relies on saveLayer altering the clip post-viewport init. This
- // causes the clip to be recorded by contained draw commands, though it's not necessary
- // since the same clip will be computed at draw time. If such a change is made, this
- // check could be done at record time by querying the clip, or the clip could be altered
- // slightly so that it is serialized.
- EXPECT_EQ(Rect(59, 59, 341, 341), op.localClip->rect);
- EXPECT_EQ(Rect(400, 400), op.unmappedBounds);
- expectedMatrix.loadIdentity();
- EXPECT_MATRIX_APPROX_EQ(expectedMatrix, op.localMatrix);
- }
- });
- EXPECT_EQ(3, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, saveLayer_rejectBegin) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.translate(0, -20); // avoid identity case
- // empty clip rect should force layer + contents to be rejected
- canvas.clipRect(0, -20, 200, -20, SkClipOp::kIntersect);
- canvas.saveLayerAlpha(0, 0, 200, 200, 128, SaveFlags::ClipToLayer);
- canvas.drawRect(0, 0, 200, 200, SkPaint());
- canvas.restore();
- canvas.restore();
- });
-
- ASSERT_EQ(0u, dl->getOps().size()) << "Begin/Rect/End should all be rejected.";
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawRenderNode_rejection) {
- auto child =
- TestUtils::createNode(50, 50, 150, 150, [](RenderProperties& props, Canvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
-
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200, [&child](RecordingCanvas& canvas) {
- canvas.clipRect(0, 0, 0, 0, SkClipOp::kIntersect); // empty clip, reject node
- canvas.drawRenderNode(child.get()); // shouldn't crash when rejecting node...
- });
- ASSERT_TRUE(dl->isEmpty());
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawRenderNode_projection) {
- sp<RenderNode> background =
- TestUtils::createNode(50, 50, 150, 150, [](RenderProperties& props, Canvas& canvas) {
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
- });
- {
- background->mutateStagingProperties().setProjectionReceiver(false);
-
- // NO RECEIVER PRESENT
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200, [&background](RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.drawRenderNode(background.get());
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- });
- EXPECT_EQ(-1, dl->projectionReceiveIndex)
- << "no projection receiver should have been observed";
- }
- {
- background->mutateStagingProperties().setProjectionReceiver(true);
-
- // RECEIVER PRESENT
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200, [&background](RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- canvas.drawRenderNode(background.get());
- canvas.drawRect(0, 0, 100, 100, SkPaint());
- });
-
- ASSERT_EQ(3u, dl->getOps().size()) << "Must be three ops";
- auto op = dl->getOps()[1];
- EXPECT_EQ(RecordedOpId::RenderNodeOp, op->opId);
- EXPECT_EQ(1, dl->projectionReceiveIndex) << "correct projection receiver not identified";
-
- // verify the behavior works even though projection receiver hasn't been sync'd yet
- EXPECT_TRUE(background->stagingProperties().isProjectionReceiver());
- EXPECT_FALSE(background->properties().isProjectionReceiver());
- }
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, firstClipWillReplace) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- // since no explicit clip set on canvas, this should be the one observed on op:
- canvas.clipRect(-100, -100, 300, 300, SkClipOp::kIntersect);
-
- SkPaint paint;
- paint.setColor(SK_ColorWHITE);
- canvas.drawRect(0, 0, 100, 100, paint);
-
- canvas.restore();
- });
- ASSERT_EQ(1u, dl->getOps().size()) << "Must have one op";
- // first clip must be preserved, even if it extends beyond canvas bounds
- EXPECT_CLIP_RECT(Rect(-100, -100, 300, 300), dl->getOps()[0]->localClip);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, replaceClipIntersectWithRoot) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 100, [](RecordingCanvas& canvas) {
- canvas.save(SaveFlags::MatrixClip);
- canvas.clipRect(-10, -10, 110, 110, SkClipOp::kReplace_deprecated);
- canvas.drawColor(SK_ColorWHITE, SkBlendMode::kSrcOver);
- canvas.restore();
- });
- ASSERT_EQ(1u, dl->getOps().size()) << "Must have one op";
- // first clip must be preserved, even if it extends beyond canvas bounds
- EXPECT_CLIP_RECT(Rect(-10, -10, 110, 110), dl->getOps()[0]->localClip);
- EXPECT_TRUE(dl->getOps()[0]->localClip->intersectWithRoot);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, insertReorderBarrier) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.insertReorderBarrier(true);
- canvas.insertReorderBarrier(false);
- canvas.insertReorderBarrier(false);
- canvas.insertReorderBarrier(true);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- canvas.insertReorderBarrier(false);
- });
-
- auto chunks = dl->getChunks();
- EXPECT_EQ(0u, chunks[0].beginOpIndex);
- EXPECT_EQ(1u, chunks[0].endOpIndex);
- EXPECT_FALSE(chunks[0].reorderChildren);
-
- EXPECT_EQ(1u, chunks[1].beginOpIndex);
- EXPECT_EQ(2u, chunks[1].endOpIndex);
- EXPECT_TRUE(chunks[1].reorderChildren);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, insertReorderBarrier_clip) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- // first chunk: no recorded clip
- canvas.insertReorderBarrier(true);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
-
- // second chunk: no recorded clip, since inorder region
- canvas.clipRect(0, 0, 200, 200, SkClipOp::kIntersect);
- canvas.insertReorderBarrier(false);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
-
- // third chunk: recorded clip
- canvas.insertReorderBarrier(true);
- canvas.drawRect(0, 0, 400, 400, SkPaint());
- });
-
- auto chunks = dl->getChunks();
- ASSERT_EQ(3u, chunks.size());
-
- EXPECT_TRUE(chunks[0].reorderChildren);
- EXPECT_EQ(nullptr, chunks[0].reorderClip);
-
- EXPECT_FALSE(chunks[1].reorderChildren);
- EXPECT_EQ(nullptr, chunks[1].reorderClip);
-
- EXPECT_TRUE(chunks[2].reorderChildren);
- ASSERT_NE(nullptr, chunks[2].reorderClip);
- EXPECT_EQ(Rect(200, 200), chunks[2].reorderClip->rect);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, refPaint) {
- SkPaint paint;
-
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 200, 200, [&paint](RecordingCanvas& canvas) {
- paint.setColor(SK_ColorBLUE);
- // first two should use same paint
- canvas.drawRect(0, 0, 200, 10, paint);
- SkPaint paintCopy(paint);
- canvas.drawRect(0, 10, 200, 20, paintCopy);
-
- // only here do we use different paint ptr
- paint.setColor(SK_ColorRED);
- canvas.drawRect(0, 20, 200, 30, paint);
- });
- auto ops = dl->getOps();
- ASSERT_EQ(3u, ops.size());
-
- // first two are the same
- EXPECT_NE(nullptr, ops[0]->paint);
- EXPECT_NE(&paint, ops[0]->paint);
- EXPECT_EQ(ops[0]->paint, ops[1]->paint);
-
- // last is different, but still copied / non-null
- EXPECT_NE(nullptr, ops[2]->paint);
- EXPECT_NE(ops[0]->paint, ops[2]->paint);
- EXPECT_NE(&paint, ops[2]->paint);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, refBitmap) {
- sk_sp<Bitmap> bitmap(TestUtils::createBitmap(100, 100));
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 100, 100,
- [&bitmap](RecordingCanvas& canvas) { canvas.drawBitmap(*bitmap, 0, 0, nullptr); });
- auto& bitmaps = dl->getBitmapResources();
- EXPECT_EQ(1u, bitmaps.size());
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, refBitmapInShader_bitmapShader) {
- sk_sp<Bitmap> bitmap = TestUtils::createBitmap(100, 100);
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 100, 100, [&bitmap](RecordingCanvas& canvas) {
- SkPaint paint;
- SkBitmap skBitmap;
- bitmap->getSkBitmap(&skBitmap);
- sk_sp<SkImage> image =
- SkMakeImageFromRasterBitmap(skBitmap, kNever_SkCopyPixelsMode);
- sk_sp<SkShader> shader =
- image->makeShader(SkShader::TileMode::kClamp_TileMode,
- SkShader::TileMode::kClamp_TileMode, nullptr);
- paint.setShader(std::move(shader));
- canvas.drawRoundRect(0, 0, 100, 100, 20.0f, 20.0f, paint);
- });
- auto& bitmaps = dl->getBitmapResources();
- EXPECT_EQ(1u, bitmaps.size());
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, refBitmapInShader_composeShader) {
- sk_sp<Bitmap> bitmap = TestUtils::createBitmap(100, 100);
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(
- 100, 100, [&bitmap](RecordingCanvas& canvas) {
- SkPaint paint;
- SkBitmap skBitmap;
- bitmap->getSkBitmap(&skBitmap);
- sk_sp<SkImage> image =
- SkMakeImageFromRasterBitmap(skBitmap, kNever_SkCopyPixelsMode);
- sk_sp<SkShader> shader1 =
- image->makeShader(SkShader::TileMode::kClamp_TileMode,
- SkShader::TileMode::kClamp_TileMode, nullptr);
-
- SkPoint center;
- center.set(50, 50);
- SkColor colors[2];
- colors[0] = Color::Black;
- colors[1] = Color::White;
- sk_sp<SkShader> shader2 = SkGradientShader::MakeRadial(
- center, 50, colors, nullptr, 2, SkShader::TileMode::kRepeat_TileMode);
-
- sk_sp<SkShader> composeShader = SkShader::MakeComposeShader(
- std::move(shader1), std::move(shader2), SkBlendMode::kMultiply);
- paint.setShader(std::move(composeShader));
- canvas.drawRoundRect(0, 0, 100, 100, 20.0f, 20.0f, paint);
- });
- auto& bitmaps = dl->getBitmapResources();
- EXPECT_EQ(1u, bitmaps.size());
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawText) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- Paint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- TestUtils::drawUtf8ToCanvas(&canvas, "HELLO", paint, 25, 25);
- });
-
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- count++;
- ASSERT_EQ(RecordedOpId::TextOp, op.opId);
- EXPECT_EQ(nullptr, op.localClip);
- EXPECT_TRUE(op.localMatrix.isIdentity());
- EXPECT_TRUE(op.unmappedBounds.getHeight() >= 10);
- EXPECT_TRUE(op.unmappedBounds.getWidth() >= 25);
- });
- ASSERT_EQ(1, count);
-}
-
-OPENGL_PIPELINE_TEST(RecordingCanvas, drawTextInHighContrast) {
- Properties::enableHighContrastText = true;
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- Paint paint;
- paint.setColor(SK_ColorWHITE);
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- TestUtils::drawUtf8ToCanvas(&canvas, "HELLO", paint, 25, 25);
- });
- Properties::enableHighContrastText = false;
-
- int count = 0;
- playbackOps(*dl, [&count](const RecordedOp& op) {
- ASSERT_EQ(RecordedOpId::TextOp, op.opId);
- if (count++ == 0) {
- EXPECT_EQ(SK_ColorBLACK, op.paint->getColor());
- EXPECT_EQ(SkPaint::kStrokeAndFill_Style, op.paint->getStyle());
- } else {
- EXPECT_EQ(SK_ColorWHITE, op.paint->getColor());
- EXPECT_EQ(SkPaint::kFill_Style, op.paint->getStyle());
- }
-
- });
- ASSERT_EQ(2, count);
-}
-
-} // namespace uirenderer
-} // namespace android
diff --git a/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp b/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp
index 15c0ab1ad8d2..eb67e6cf33b6 100644
--- a/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp
+++ b/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp
@@ -1094,7 +1094,7 @@ TEST(ReorderBarrierDrawable, testShadowMatrix) {
class ShadowTestCanvas : public SkCanvas {
public:
ShadowTestCanvas(int width, int height) : SkCanvas(width, height) {}
- int getIndex() { return mDrawCounter; }
+ int getDrawCounter() { return mDrawCounter; }
virtual void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) override {
// expect to draw 2 RenderNodeDrawable, 1 StartReorderBarrierDrawable,
@@ -1109,17 +1109,36 @@ TEST(ReorderBarrierDrawable, testShadowMatrix) {
EXPECT_EQ(dy, TRANSLATE_Y);
}
+ virtual void didSetMatrix(const SkMatrix& matrix) override {
+ mDrawCounter++;
+ // First invocation is EndReorderBarrierDrawable::drawShadow to apply shadow matrix.
+ // Second invocation is preparing the matrix for an elevated RenderNodeDrawable.
+ EXPECT_TRUE(matrix.isIdentity());
+ EXPECT_TRUE(getTotalMatrix().isIdentity());
+ }
+
virtual void didConcat(const SkMatrix& matrix) override {
- // This function is invoked by EndReorderBarrierDrawable::drawShadow to apply shadow
- // matrix.
mDrawCounter++;
- EXPECT_EQ(SkMatrix::MakeTrans(CASTER_X, CASTER_Y), matrix);
- EXPECT_EQ(SkMatrix::MakeTrans(CASTER_X + TRANSLATE_X, CASTER_Y + TRANSLATE_Y),
- getTotalMatrix());
+ if (mFirstDidConcat) {
+ // First invocation is EndReorderBarrierDrawable::drawShadow to apply shadow matrix.
+ mFirstDidConcat = false;
+ EXPECT_EQ(SkMatrix::MakeTrans(CASTER_X + TRANSLATE_X, CASTER_Y + TRANSLATE_Y),
+ matrix);
+ EXPECT_EQ(SkMatrix::MakeTrans(CASTER_X + TRANSLATE_X, CASTER_Y + TRANSLATE_Y),
+ getTotalMatrix());
+ } else {
+ // Second invocation is preparing the matrix for an elevated RenderNodeDrawable.
+ EXPECT_EQ(SkMatrix::MakeTrans(TRANSLATE_X, TRANSLATE_Y),
+ matrix);
+ EXPECT_EQ(SkMatrix::MakeTrans(TRANSLATE_X, TRANSLATE_Y),
+ getTotalMatrix());
+ }
}
protected:
int mDrawCounter = 0;
+ private:
+ bool mFirstDidConcat = true;
};
auto parent = TestUtils::createSkiaNode(
@@ -1143,7 +1162,7 @@ TEST(ReorderBarrierDrawable, testShadowMatrix) {
ShadowTestCanvas canvas(CANVAS_WIDTH, CANVAS_HEIGHT);
RenderNodeDrawable drawable(parent.get(), &canvas, false);
canvas.drawDrawable(&drawable);
- EXPECT_EQ(6, canvas.getIndex());
+ EXPECT_EQ(9, canvas.getDrawCounter());
}
// Draw a vector drawable twice but with different bounds and verify correct bounds are used.
diff --git a/libs/hwui/tests/unit/SkiaCanvasTests.cpp b/libs/hwui/tests/unit/SkiaCanvasTests.cpp
index 1d7dc3d06ee4..634ceffe0741 100644
--- a/libs/hwui/tests/unit/SkiaCanvasTests.cpp
+++ b/libs/hwui/tests/unit/SkiaCanvasTests.cpp
@@ -16,7 +16,6 @@
#include "tests/common/TestUtils.h"
-#include <RecordingCanvas.h>
#include <SkBlurDrawLooper.h>
#include <SkCanvasStateUtils.h>
#include <SkPicture.h>
@@ -26,41 +25,6 @@
using namespace android;
using namespace android::uirenderer;
-/**
- * Verify that we get the same culling bounds for text for (1) drawing glyphs
- * directly to a Canvas or (2) going through a SkPicture as an intermediate step.
- */
-OPENGL_PIPELINE_TEST(SkiaCanvasProxy, drawGlyphsViaPicture) {
- auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
- // setup test variables
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextSize(20);
- static const char* text = "testing text bounds";
-
- // draw text directly into Recording canvas
- TestUtils::drawUtf8ToCanvas(&canvas, text, paint, 25, 25);
-
- // record the same text draw into a SkPicture and replay it into a Recording canvas
- SkPictureRecorder recorder;
- SkCanvas* skCanvas = recorder.beginRecording(200, 200, NULL, 0);
- std::unique_ptr<Canvas> pictCanvas(Canvas::create_canvas(skCanvas));
- TestUtils::drawUtf8ToCanvas(pictCanvas.get(), text, paint, 25, 25);
- sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
-
- canvas.asSkCanvas()->drawPicture(picture);
- });
-
- // verify that the text bounds and matrices match
- ASSERT_EQ(2U, dl->getOps().size());
- auto directOp = dl->getOps()[0];
- auto pictureOp = dl->getOps()[1];
- ASSERT_EQ(RecordedOpId::TextOp, directOp->opId);
- EXPECT_EQ(directOp->opId, pictureOp->opId);
- EXPECT_EQ(directOp->unmappedBounds, pictureOp->unmappedBounds);
- EXPECT_EQ(directOp->localMatrix, pictureOp->localMatrix);
-}
-
TEST(SkiaCanvas, drawShadowLayer) {
auto surface = SkSurface::MakeRasterN32Premul(10, 10);
SkiaCanvas canvas(surface->getCanvas());
diff --git a/libs/hwui/tests/unit/SkiaPipelineTests.cpp b/libs/hwui/tests/unit/SkiaPipelineTests.cpp
index 42a92fcc7d89..26b6000a91e6 100644
--- a/libs/hwui/tests/unit/SkiaPipelineTests.cpp
+++ b/libs/hwui/tests/unit/SkiaPipelineTests.cpp
@@ -167,10 +167,10 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, renderLayer) {
ASSERT_EQ(layerUpdateQueue.entries().size(), 2UL);
bool opaque = true;
- FrameBuilder::LightGeometry lightGeometry;
+ LightGeometry lightGeometry;
lightGeometry.radius = 1.0f;
lightGeometry.center = {0.0f, 0.0f, 0.0f};
- BakedOpRenderer::LightInfo lightInfo;
+ LightInfo lightInfo;
auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
pipeline->renderLayers(lightGeometry, &layerUpdateQueue, opaque, false, lightInfo);
ASSERT_EQ(TestUtils::getColor(surfaceLayer1, 0, 0), SK_ColorRED);
diff --git a/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp b/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp
deleted file mode 100644
index 92d05e44c6ca..000000000000
--- a/libs/hwui/tests/unit/TextDropShadowCacheTests.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#include <gtest/gtest.h>
-
-#include "GammaFontRenderer.h"
-#include "TextDropShadowCache.h"
-#include "tests/common/TestUtils.h"
-#include "utils/Blur.h"
-
-#include <SkPaint.h>
-
-using namespace android;
-using namespace android::uirenderer;
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(TextDropShadowCache, addRemove) {
- SkPaint paint;
- paint.setTextSize(20);
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-
- GammaFontRenderer gammaFontRenderer;
- FontRenderer& fontRenderer = gammaFontRenderer.getFontRenderer();
- fontRenderer.setFont(&paint, SkMatrix::I());
- TextDropShadowCache cache(MB(5));
- cache.setFontRenderer(fontRenderer);
-
- std::vector<glyph_t> glyphs;
- std::vector<float> positions;
- float totalAdvance;
- uirenderer::Rect bounds;
- TestUtils::layoutTextUnscaled(paint, "This is a test", &glyphs, &positions, &totalAdvance,
- &bounds);
- EXPECT_TRUE(bounds.contains(5, -10, 100, 0)) << "Expect input to be nontrivially sized";
-
- ShadowTexture* texture = cache.get(&paint, glyphs.data(), glyphs.size(), 10, positions.data());
-
- ASSERT_TRUE(texture);
- ASSERT_FALSE(texture->cleanup);
- ASSERT_EQ((uint32_t)texture->objectSize(), cache.getSize());
- ASSERT_TRUE(cache.getSize());
- cache.clear();
- ASSERT_EQ(cache.getSize(), 0u);
-}
diff --git a/libs/hwui/tests/unit/TextureCacheTests.cpp b/libs/hwui/tests/unit/TextureCacheTests.cpp
deleted file mode 100644
index ab740dd8330e..000000000000
--- a/libs/hwui/tests/unit/TextureCacheTests.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#include <gtest/gtest.h>
-
-#include "Extensions.h"
-#include "TextureCache.h"
-#include "tests/common/TestUtils.h"
-
-using namespace android;
-using namespace android::uirenderer;
-
-RENDERTHREAD_OPENGL_PIPELINE_TEST(TextureCache, clear) {
- TextureCache cache;
- ASSERT_EQ(cache.getSize(), 0u);
- // it is not 0, because FontRenderer allocates one texture
- int initialCount = GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture);
- SkBitmap skBitmap;
- SkImageInfo info = SkImageInfo::Make(100, 100, kN32_SkColorType, kPremul_SkAlphaType);
- skBitmap.setInfo(info);
- sk_sp<Bitmap> hwBitmap(renderThread.allocateHardwareBitmap(skBitmap));
- cache.get(hwBitmap.get());
- ASSERT_EQ(GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture), initialCount + 1);
- cache.clear();
- ASSERT_EQ(GpuMemoryTracker::getInstanceCount(GpuObjectType::Texture), initialCount);
-}
diff --git a/libs/hwui/thread/ThreadBase.h b/libs/hwui/thread/ThreadBase.h
index 8068121f64cf..f9de8a5037e5 100644
--- a/libs/hwui/thread/ThreadBase.h
+++ b/libs/hwui/thread/ThreadBase.h
@@ -47,6 +47,8 @@ public:
void join() { Thread::join(); }
+ bool isRunning() const { return Thread::isRunning(); }
+
protected:
void waitForWork() {
nsecs_t nextWakeup;
diff --git a/libs/hwui/utils/PaintUtils.h b/libs/hwui/utils/PaintUtils.h
index 233adae1df24..f8e8a0a18284 100644
--- a/libs/hwui/utils/PaintUtils.h
+++ b/libs/hwui/utils/PaintUtils.h
@@ -20,6 +20,7 @@
#include <SkColorFilter.h>
#include <SkDrawLooper.h>
+#include <SkPaint.h>
#include <SkShader.h>
namespace android {
diff --git a/libs/hwui/utils/TestWindowContext.cpp b/libs/hwui/utils/TestWindowContext.cpp
index 700d3b3cf000..8ac6e1f2d39a 100644
--- a/libs/hwui/utils/TestWindowContext.cpp
+++ b/libs/hwui/utils/TestWindowContext.cpp
@@ -17,7 +17,6 @@
#include "AnimationContext.h"
#include "IContextFactory.h"
-#include "RecordingCanvas.h"
#include "RenderNode.h"
#include "SkTypes.h"
#include "gui/BufferQueue.h"
@@ -25,6 +24,7 @@
#include "gui/IGraphicBufferConsumer.h"
#include "gui/IGraphicBufferProducer.h"
#include "gui/Surface.h"
+#include "hwui/Canvas.h"
#include "renderthread/RenderProxy.h"
#include <cutils/memory.h>
@@ -81,7 +81,7 @@ public:
android::uirenderer::Vector3 lightVector{lightX, -200.0f, 800.0f};
mProxy->setup(800.0f, 255 * 0.075f, 255 * 0.15f);
mProxy->setLightCenter(lightVector);
- mCanvas.reset(new android::uirenderer::RecordingCanvas(mSize.width(), mSize.height()));
+ mCanvas.reset(Canvas::create_recording_canvas(mSize.width(), mSize.height(), mRootNode.get()));
}
SkCanvas* prepareToDraw() {
@@ -155,7 +155,7 @@ public:
private:
std::unique_ptr<android::uirenderer::RenderNode> mRootNode;
std::unique_ptr<android::uirenderer::renderthread::RenderProxy> mProxy;
- std::unique_ptr<android::uirenderer::RecordingCanvas> mCanvas;
+ std::unique_ptr<android::Canvas> mCanvas;
android::sp<android::IGraphicBufferProducer> mProducer;
android::sp<android::IGraphicBufferConsumer> mConsumer;
android::sp<android::CpuConsumer> mCpuConsumer;
diff --git a/libs/incident/proto/android/section.proto b/libs/incident/proto/android/section.proto
index 45f3c91850e7..5afe22a3095f 100644
--- a/libs/incident/proto/android/section.proto
+++ b/libs/incident/proto/android/section.proto
@@ -51,10 +51,9 @@ enum SectionType {
message SectionFlags {
optional SectionType type = 1 [default = SECTION_NONE];
optional string args = 2;
- optional bool device_specific = 3 [default = false];
// If true, then the section will only be generated for userdebug and eng
// builds.
- optional bool userdebug_and_eng_only = 4 [default = false];
+ optional bool userdebug_and_eng_only = 3 [default = false];
}
extend google.protobuf.FieldOptions {
diff --git a/libs/protoutil/Android.bp b/libs/protoutil/Android.bp
index 7ad83ca79695..44bc97adb946 100644
--- a/libs/protoutil/Android.bp
+++ b/libs/protoutil/Android.bp
@@ -12,9 +12,8 @@
// 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.
-
-cc_library {
- name: "libprotoutil",
+cc_defaults {
+ name: "libprotoutil_defaults",
cflags: [
"-Wall",
@@ -30,27 +29,39 @@ cc_library {
"src/protobuf.cpp",
],
- export_include_dirs: ["include"],
-
shared_libs: [
+ "libbase",
"libcutils",
"liblog",
],
}
+cc_library {
+ name: "libprotoutil",
+
+ defaults: ["libprotoutil_defaults"],
+
+ export_include_dirs: ["include"],
+}
+
cc_test {
name: "libprotoutil_test",
- srcs: [
- "tests/EncodedBuffer_test.cpp",
- ],
+ defaults: ["libprotoutil_defaults"],
+
+ local_include_dirs: ["include"],
+
+ srcs: ["tests/*"],
shared_libs: [
- "libcutils",
- "libprotoutil",
+ "libprotobuf-cpp-full",
],
static_libs: [
"libgmock",
],
+
+ proto: {
+ type: "full",
+ }
}
diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h
index e17f48b98037..ad765592eb55 100644
--- a/libs/protoutil/include/android/util/ProtoOutputStream.h
+++ b/libs/protoutil/include/android/util/ProtoOutputStream.h
@@ -17,10 +17,11 @@
#ifndef ANDROID_UTIL_PROTOOUTPUT_STREAM_H
#define ANDROID_UTIL_PROTOOUTPUT_STREAM_H
-#include <android/util/EncodedBuffer.h>
-
+#include <cstdint>
#include <string>
+#include <android/util/EncodedBuffer.h>
+
namespace android {
namespace util {
@@ -104,7 +105,7 @@ public:
/**
* Starts a sub-message write session.
* Returns a token of this write session.
- * Must call end(token) when finish write this sub-message.
+ * Must call end(token) exactly once when finish write this sub-message.
*/
uint64_t start(uint64_t fieldId);
void end(uint64_t token);
@@ -143,16 +144,16 @@ private:
inline void writeDoubleImpl(uint32_t id, double val);
inline void writeFloatImpl(uint32_t id, float val);
- inline void writeInt64Impl(uint32_t id, long long val);
- inline void writeInt32Impl(uint32_t id, int val);
+ inline void writeInt64Impl(uint32_t id, int64_t val);
+ inline void writeInt32Impl(uint32_t id, int32_t val);
inline void writeUint64Impl(uint32_t id, uint64_t val);
inline void writeUint32Impl(uint32_t id, uint32_t val);
inline void writeFixed64Impl(uint32_t id, uint64_t val);
inline void writeFixed32Impl(uint32_t id, uint32_t val);
- inline void writeSFixed64Impl(uint32_t id, long long val);
- inline void writeSFixed32Impl(uint32_t id, int val);
- inline void writeZigzagInt64Impl(uint32_t id, long long val);
- inline void writeZigzagInt32Impl(uint32_t id, int val);
+ inline void writeSFixed64Impl(uint32_t id, int64_t val);
+ inline void writeSFixed32Impl(uint32_t id, int32_t val);
+ inline void writeZigzagInt64Impl(uint32_t id, int64_t val);
+ inline void writeZigzagInt32Impl(uint32_t id, int32_t val);
inline void writeEnumImpl(uint32_t id, int val);
inline void writeBoolImpl(uint32_t id, bool val);
inline void writeUtf8StringImpl(uint32_t id, const char* val, size_t size);
@@ -161,6 +162,9 @@ private:
bool compact();
size_t editEncodedSize(size_t rawSize);
bool compactSize(size_t rawSize);
+
+ template<typename T>
+ bool internalWrite(uint64_t fieldId, T val, const char* typeName);
};
}
diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp
index 22b9709ef066..ff3fad6055e1 100644
--- a/libs/protoutil/src/ProtoOutputStream.cpp
+++ b/libs/protoutil/src/ProtoOutputStream.cpp
@@ -15,8 +15,10 @@
*/
#define LOG_TAG "libprotoutil"
-#include <inttypes.h>
+#include <cinttypes>
+#include <type_traits>
+#include <android-base/file.h>
#include <android/util/protobuf.h>
#include <android/util/ProtoOutputStream.h>
#include <cutils/log.h>
@@ -50,112 +52,73 @@ ProtoOutputStream::clear()
mExpectedObjectToken = UINT64_C(-1);
}
+template<typename T>
bool
-ProtoOutputStream::write(uint64_t fieldId, double val)
+ProtoOutputStream::internalWrite(uint64_t fieldId, T val, const char* typeName)
{
if (mCompact) return false;
const uint32_t id = (uint32_t)fieldId;
switch (fieldId & FIELD_TYPE_MASK) {
case FIELD_TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break;
case FIELD_TYPE_FLOAT: writeFloatImpl(id, (float)val); break;
- case FIELD_TYPE_INT64: writeInt64Impl(id, (long long)val); break;
+ case FIELD_TYPE_INT64: writeInt64Impl(id, (int64_t)val); break;
case FIELD_TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break;
- case FIELD_TYPE_INT32: writeInt32Impl(id, (int)val); break;
+ case FIELD_TYPE_INT32: writeInt32Impl(id, (int32_t)val); break;
case FIELD_TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break;
case FIELD_TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break;
case FIELD_TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break;
- case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break;
- case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break;
- case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break;
- case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break;
+ case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int32_t)val); break;
+ case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (int64_t)val); break;
+ case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int32_t)val); break;
+ case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (int64_t)val); break;
+ case FIELD_TYPE_ENUM:
+ if (std::is_integral<T>::value) {
+ writeEnumImpl(id, (int)val);
+ } else {
+ goto unsupported;
+ }
+ break;
+ case FIELD_TYPE_BOOL:
+ if (std::is_integral<T>::value) {
+ writeBoolImpl(id, val != 0);
+ } else {
+ goto unsupported;
+ }
+ break;
default:
- ALOGW("Field type %d is not supported when writing double val.",
- (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT));
- return false;
+ goto unsupported;
}
return true;
+
+unsupported:
+ ALOGW("Field type %" PRIu64 " is not supported when writing %s val.",
+ (fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT, typeName);
+ return false;
+}
+
+bool
+ProtoOutputStream::write(uint64_t fieldId, double val)
+{
+ return internalWrite(fieldId, val, "double");
}
+
bool
ProtoOutputStream::write(uint64_t fieldId, float val)
{
- if (mCompact) return false;
- const uint32_t id = (uint32_t)fieldId;
- switch (fieldId & FIELD_TYPE_MASK) {
- case FIELD_TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break;
- case FIELD_TYPE_FLOAT: writeFloatImpl(id, (float)val); break;
- case FIELD_TYPE_INT64: writeInt64Impl(id, (long long)val); break;
- case FIELD_TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break;
- case FIELD_TYPE_INT32: writeInt32Impl(id, (int)val); break;
- case FIELD_TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break;
- case FIELD_TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break;
- case FIELD_TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break;
- case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break;
- case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break;
- case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break;
- case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break;
- default:
- ALOGW("Field type %d is not supported when writing float val.",
- (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT));
- return false;
- }
- return true;
+ return internalWrite(fieldId, val, "float");
}
bool
ProtoOutputStream::write(uint64_t fieldId, int val)
{
- if (mCompact) return false;
- const uint32_t id = (uint32_t)fieldId;
- switch (fieldId & FIELD_TYPE_MASK) {
- case FIELD_TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break;
- case FIELD_TYPE_FLOAT: writeFloatImpl(id, (float)val); break;
- case FIELD_TYPE_INT64: writeInt64Impl(id, (long long)val); break;
- case FIELD_TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break;
- case FIELD_TYPE_INT32: writeInt32Impl(id, (int)val); break;
- case FIELD_TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break;
- case FIELD_TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break;
- case FIELD_TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break;
- case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break;
- case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break;
- case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break;
- case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break;
- case FIELD_TYPE_ENUM: writeEnumImpl(id, (int)val); break;
- case FIELD_TYPE_BOOL: writeBoolImpl(id, val != 0); break;
- default:
- ALOGW("Field type %d is not supported when writing int val.",
- (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT));
- return false;
- }
- return true;
+ return internalWrite(fieldId, val, "int");
}
bool
ProtoOutputStream::write(uint64_t fieldId, long long val)
{
- if (mCompact) return false;
- const uint32_t id = (uint32_t)fieldId;
- switch (fieldId & FIELD_TYPE_MASK) {
- case FIELD_TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break;
- case FIELD_TYPE_FLOAT: writeFloatImpl(id, (float)val); break;
- case FIELD_TYPE_INT64: writeInt64Impl(id, (long long)val); break;
- case FIELD_TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break;
- case FIELD_TYPE_INT32: writeInt32Impl(id, (int)val); break;
- case FIELD_TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break;
- case FIELD_TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break;
- case FIELD_TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break;
- case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break;
- case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break;
- case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break;
- case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break;
- case FIELD_TYPE_ENUM: writeEnumImpl(id, (int)val); break;
- case FIELD_TYPE_BOOL: writeBoolImpl(id, val != 0); break;
- default:
- ALOGW("Field type %d is not supported when writing long long val.",
- (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT));
- return false;
- }
- return true;
+ return internalWrite(fieldId, val, "long long");
}
bool
@@ -168,8 +131,8 @@ ProtoOutputStream::write(uint64_t fieldId, bool val)
writeBoolImpl(id, val);
return true;
default:
- ALOGW("Field type %d is not supported when writing bool val.",
- (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT));
+ ALOGW("Field type %" PRIu64 " is not supported when writing bool val.",
+ (fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT);
return false;
}
}
@@ -184,8 +147,8 @@ ProtoOutputStream::write(uint64_t fieldId, std::string val)
writeUtf8StringImpl(id, val.c_str(), val.size());
return true;
default:
- ALOGW("Field type %d is not supported when writing string val.",
- (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT));
+ ALOGW("Field type %" PRIu64 " is not supported when writing string val.",
+ (fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT);
return false;
}
}
@@ -205,8 +168,8 @@ ProtoOutputStream::write(uint64_t fieldId, const char* val, size_t size)
writeMessageBytesImpl(id, val, size);
return true;
default:
- ALOGW("Field type %d is not supported when writing char[] val.",
- (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT));
+ ALOGW("Field type %" PRIu64 " is not supported when writing char[] val.",
+ (fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT);
return false;
}
}
@@ -281,12 +244,14 @@ ProtoOutputStream::end(uint64_t token)
{
if (token != mExpectedObjectToken) {
ALOGE("Unexpected token: 0x%" PRIx64 ", should be 0x%" PRIx64, token, mExpectedObjectToken);
+ mDepth = UINT32_C(-1); // make depth invalid
return;
}
uint32_t depth = getDepthFromToken(token);
if (depth != (mDepth & 0x01ff)) {
ALOGE("Unexpected depth: %" PRIu32 ", should be %" PRIu32, depth, mDepth);
+ mDepth = UINT32_C(-1); // make depth invalid
return;
}
mDepth--;
@@ -319,7 +284,7 @@ bool
ProtoOutputStream::compact() {
if (mCompact) return true;
if (mDepth != 0) {
- ALOGE("Can't compact when depth(%" PRIu32 ") is not zero. Missing calls to end.", mDepth);
+ ALOGE("Can't compact when depth(%" PRIu32 ") is not zero. Missing or extra calls to end.", mDepth);
return false;
}
// record the size of the original buffer.
@@ -462,24 +427,11 @@ ProtoOutputStream::size()
{
if (!compact()) {
ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
- // TODO: handle this error
+ return 0;
}
return mBuffer.size();
}
-static bool write_all(int fd, uint8_t const* buf, size_t size)
-{
- while (size > 0) {
- ssize_t amt = ::write(fd, buf, size);
- if (amt < 0) {
- return false;
- }
- size -= amt;
- buf += amt;
- }
- return true;
-}
-
bool
ProtoOutputStream::flush(int fd)
{
@@ -488,7 +440,7 @@ ProtoOutputStream::flush(int fd)
EncodedBuffer::iterator it = mBuffer.begin();
while (it.readBuffer() != NULL) {
- if (!write_all(fd, it.readBuffer(), it.currentToRead())) return false;
+ if (!android::base::WriteFully(fd, it.readBuffer(), it.currentToRead())) return false;
it.rp()->move(it.currentToRead());
}
return true;
@@ -499,7 +451,7 @@ ProtoOutputStream::data()
{
if (!compact()) {
ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
- // TODO: handle this error
+ mBuffer.clear();
}
return mBuffer.begin();
}
@@ -554,17 +506,17 @@ ProtoOutputStream::writeFloatImpl(uint32_t id, float val)
}
inline void
-ProtoOutputStream::writeInt64Impl(uint32_t id, long long val)
+ProtoOutputStream::writeInt64Impl(uint32_t id, int64_t val)
{
mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint64((uint64_t)val);
+ mBuffer.writeRawVarint64(val);
}
inline void
-ProtoOutputStream::writeInt32Impl(uint32_t id, int val)
+ProtoOutputStream::writeInt32Impl(uint32_t id, int32_t val)
{
mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
- mBuffer.writeRawVarint32((uint32_t)val);
+ mBuffer.writeRawVarint32(val);
}
inline void
@@ -596,28 +548,28 @@ ProtoOutputStream::writeFixed32Impl(uint32_t id, uint32_t val)
}
inline void
-ProtoOutputStream::writeSFixed64Impl(uint32_t id, long long val)
+ProtoOutputStream::writeSFixed64Impl(uint32_t id, int64_t val)
{
mBuffer.writeHeader(id, WIRE_TYPE_FIXED64);
- mBuffer.writeRawFixed64((uint64_t)val);
+ mBuffer.writeRawFixed64(val);
}
inline void
-ProtoOutputStream::writeSFixed32Impl(uint32_t id, int val)
+ProtoOutputStream::writeSFixed32Impl(uint32_t id, int32_t val)
{
mBuffer.writeHeader(id, WIRE_TYPE_FIXED32);
- mBuffer.writeRawFixed32((uint32_t)val);
+ mBuffer.writeRawFixed32(val);
}
inline void
-ProtoOutputStream::writeZigzagInt64Impl(uint32_t id, long long val)
+ProtoOutputStream::writeZigzagInt64Impl(uint32_t id, int64_t val)
{
mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
mBuffer.writeRawVarint64((val << 1) ^ (val >> 63));
}
inline void
-ProtoOutputStream::writeZigzagInt32Impl(uint32_t id, int val)
+ProtoOutputStream::writeZigzagInt32Impl(uint32_t id, int32_t val)
{
mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
mBuffer.writeRawVarint32((val << 1) ^ (val >> 31));
diff --git a/libs/protoutil/tests/EncodedBuffer_test.cpp b/libs/protoutil/tests/EncodedBuffer_test.cpp
index 615ab4ab29ed..964fc8ec9ee0 100644
--- a/libs/protoutil/tests/EncodedBuffer_test.cpp
+++ b/libs/protoutil/tests/EncodedBuffer_test.cpp
@@ -17,9 +17,138 @@
using namespace android::util;
+constexpr size_t TEST_CHUNK_SIZE = 16UL;
+constexpr size_t TEST_CHUNK_HALF_SIZE = TEST_CHUNK_SIZE / 2;
+constexpr size_t TEST_CHUNK_3X_SIZE = 3 * TEST_CHUNK_SIZE;
+
+static void expectPointer(EncodedBuffer::Pointer* p, size_t pos) {
+ EXPECT_EQ(p->pos(), pos);
+ EXPECT_EQ(p->index(), pos / TEST_CHUNK_SIZE);
+ EXPECT_EQ(p->offset(), pos % TEST_CHUNK_SIZE);
+}
+
+TEST(EncodedBufferTest, WriteSimple) {
+ EncodedBuffer buffer(TEST_CHUNK_SIZE);
+ EXPECT_EQ(buffer.size(), 0UL);
+ expectPointer(buffer.wp(), 0);
+ EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_SIZE);
+ for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
+ buffer.writeRawByte(50 + i);
+ }
+ EXPECT_EQ(buffer.size(), TEST_CHUNK_HALF_SIZE);
+ expectPointer(buffer.wp(), TEST_CHUNK_HALF_SIZE);
+ EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_HALF_SIZE);
+ for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
+ buffer.writeRawByte(80 + i);
+ }
+ EXPECT_EQ(buffer.size(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
+ expectPointer(buffer.wp(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE);
+ EXPECT_EQ(buffer.currentToWrite(), TEST_CHUNK_HALF_SIZE);
+
+ // verifies the buffer's data
+ expectPointer(buffer.ep(), 0);
+ for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) {
+ EXPECT_EQ(buffer.readRawByte(), 50 + i);
+ }
+ for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) {
+ EXPECT_EQ(buffer.readRawByte(), 80 + i);
+ }
+
+ // clears the buffer
+ buffer.clear();
+ EXPECT_EQ(buffer.size(), 0UL);
+ expectPointer(buffer.wp(), 0);
+}
+
+TEST(EncodedBufferTest, WriteVarint) {
+ EncodedBuffer buffer(TEST_CHUNK_SIZE);
+ size_t expected_buffer_size = 0;
+ EXPECT_EQ(buffer.writeRawVarint32(13), 1);
+ expected_buffer_size += 1;
+ EXPECT_EQ(buffer.size(), expected_buffer_size);
+ EXPECT_EQ(buffer.writeRawVarint32(UINT32_C(-1)), 5);
+ expected_buffer_size += 5;
+ EXPECT_EQ(buffer.size(), expected_buffer_size);
+
+ EXPECT_EQ(buffer.writeRawVarint64(200), 2);
+ expected_buffer_size += 2;
+ EXPECT_EQ(buffer.size(), expected_buffer_size);
+ EXPECT_EQ(buffer.writeRawVarint64(UINT64_C(-1)), 10);
+ expected_buffer_size += 10;
+ EXPECT_EQ(buffer.size(), expected_buffer_size);
+
+ buffer.writeRawFixed32(UINT32_C(-1));
+ expected_buffer_size += 4;
+ EXPECT_EQ(buffer.size(), expected_buffer_size);
+ buffer.writeRawFixed64(UINT64_C(-1));
+ expected_buffer_size += 8;
+ EXPECT_EQ(buffer.size(), expected_buffer_size);
+
+ EXPECT_EQ(buffer.writeHeader(32, 2), 2);
+ expected_buffer_size += 2;
+ EXPECT_EQ(buffer.size(), expected_buffer_size);
+
+ // verify data are correctly written to the buffer.
+ expectPointer(buffer.ep(), 0);
+ EXPECT_EQ(buffer.readRawVarint(), UINT32_C(13));
+ EXPECT_EQ(buffer.readRawVarint(), UINT32_C(-1));
+ EXPECT_EQ(buffer.readRawVarint(), UINT64_C(200));
+ EXPECT_EQ(buffer.readRawVarint(), UINT64_C(-1));
+ EXPECT_EQ(buffer.readRawFixed32(), UINT32_C(-1));
+ EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(-1));
+ EXPECT_EQ(buffer.readRawVarint(), UINT64_C((32 << 3) + 2));
+ expectPointer(buffer.ep(), expected_buffer_size);
+}
+
+TEST(EncodedBufferTest, Edit) {
+ EncodedBuffer buffer(TEST_CHUNK_SIZE);
+ buffer.writeRawFixed64(0xdeadbeefdeadbeef);
+ EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0xdeadbeefdeadbeef));
+
+ buffer.editRawFixed32(4, 0x12345678);
+ // fixed 64 is little endian order.
+ buffer.ep()->rewind(); // rewind ep for readRawFixed64 from 0
+ EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0x12345678deadbeef));
+
+ buffer.wp()->rewind();
+ expectPointer(buffer.wp(), 0);
+ buffer.copy(4, 3);
+ buffer.ep()->rewind(); // rewind ep for readRawFixed64 from 0
+ EXPECT_EQ(buffer.readRawFixed64(), UINT64_C(0x12345678de345678));
+}
+
+TEST(EncodedBufferTest, ReadSimple) {
+ EncodedBuffer buffer(TEST_CHUNK_SIZE);
+ for (size_t i = 0; i < TEST_CHUNK_3X_SIZE; i++) {
+ buffer.writeRawByte(i);
+ }
+ auto iter = buffer.begin();
+ EXPECT_EQ(iter.size(), TEST_CHUNK_3X_SIZE);
+ EXPECT_EQ(iter.bytesRead(), 0);
+
+ expectPointer(iter.rp(), 0);
+ while (iter.readBuffer() != NULL) {
+ iter.rp()->move(iter.currentToRead());
+ }
+ EXPECT_EQ(iter.bytesRead(), TEST_CHUNK_3X_SIZE);
+ expectPointer(iter.rp(), TEST_CHUNK_3X_SIZE);
+
+ iter.rp()->rewind();
+ expectPointer(iter.rp(), 0);
+ uint8_t val = 0;
+ while (iter.hasNext()) {
+ EXPECT_EQ(iter.next(), val);
+ val++;
+ }
+ EXPECT_EQ(iter.bytesRead(), TEST_CHUNK_3X_SIZE);
+ expectPointer(iter.rp(), TEST_CHUNK_3X_SIZE);
+}
+
TEST(EncodedBufferTest, ReadVarint) {
EncodedBuffer buffer;
uint64_t val = UINT64_C(1522865904593);
- buffer.writeRawVarint64(val);
- EXPECT_EQ(val, buffer.begin().readRawVarint());
+ size_t len = buffer.writeRawVarint64(val);
+ auto iter = buffer.begin();
+ EXPECT_EQ(iter.size(), len);
+ EXPECT_EQ(iter.readRawVarint(), val);
}
diff --git a/libs/protoutil/tests/ProtoOutputStream_test.cpp b/libs/protoutil/tests/ProtoOutputStream_test.cpp
new file mode 100644
index 000000000000..27ee13d4dfe1
--- /dev/null
+++ b/libs/protoutil/tests/ProtoOutputStream_test.cpp
@@ -0,0 +1,228 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <android-base/file.h>
+#include <android-base/test_utils.h>
+#include <android/util/protobuf.h>
+#include <android/util/ProtoOutputStream.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "frameworks/base/libs/protoutil/tests/test.pb.h"
+
+using namespace android::base;
+using namespace android::util;
+using ::testing::StrEq;
+
+static std::string flushToString(ProtoOutputStream* proto) {
+ TemporaryFile tf;
+ std::string content;
+
+ EXPECT_NE(tf.fd, -1);
+ EXPECT_TRUE(proto->flush(tf.fd));
+ EXPECT_TRUE(ReadFileToString(tf.path, &content));
+ return content;
+}
+
+static std::string iterateToString(ProtoOutputStream* proto) {
+ std::string content;
+ content.reserve(proto->size());
+ auto iter = proto->data();
+ while (iter.hasNext()) {
+ content.push_back(iter.next());
+ }
+ return content;
+}
+
+TEST(ProtoOutputStreamTest, Primitives) {
+ std::string s = "hello";
+ const char b[5] = { 'a', 'p', 'p', 'l', 'e' };
+
+ ProtoOutputStream proto;
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | PrimitiveProto::kValInt32FieldNumber, 123));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT64 | PrimitiveProto::kValInt64FieldNumber, -1LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FLOAT | PrimitiveProto::kValFloatFieldNumber, -23.5f));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_DOUBLE | PrimitiveProto::kValDoubleFieldNumber, 324.5));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_UINT32 | PrimitiveProto::kValUint32FieldNumber, 3424));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_UINT64 | PrimitiveProto::kValUint64FieldNumber, 57LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED32 | PrimitiveProto::kValFixed32FieldNumber, -20));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED64 | PrimitiveProto::kValFixed64FieldNumber, -37LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BOOL | PrimitiveProto::kValBoolFieldNumber, true));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | PrimitiveProto::kValStringFieldNumber, s));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | PrimitiveProto::kValBytesFieldNumber, b, 5));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED32 | PrimitiveProto::kValSfixed32FieldNumber, 63));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED64 | PrimitiveProto::kValSfixed64FieldNumber, -54));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SINT32 | PrimitiveProto::kValSint32FieldNumber, -533));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_SINT64 | PrimitiveProto::kValSint64FieldNumber, -61224762453LL));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_ENUM | PrimitiveProto::kValEnumFieldNumber, 2));
+
+ PrimitiveProto primitives;
+ ASSERT_TRUE(primitives.ParseFromString(flushToString(&proto)));
+ EXPECT_EQ(primitives.val_int32(), 123);
+ EXPECT_EQ(primitives.val_int64(), -1);
+ EXPECT_EQ(primitives.val_float(), -23.5f);
+ EXPECT_EQ(primitives.val_double(), 324.5f);
+ EXPECT_EQ(primitives.val_uint32(), 3424);
+ EXPECT_EQ(primitives.val_uint64(), 57);
+ EXPECT_EQ(primitives.val_fixed32(), -20);
+ EXPECT_EQ(primitives.val_fixed64(), -37);
+ EXPECT_EQ(primitives.val_bool(), true);
+ EXPECT_THAT(primitives.val_string(), StrEq(s.c_str()));
+ EXPECT_THAT(primitives.val_bytes(), StrEq("apple"));
+ EXPECT_EQ(primitives.val_sfixed32(), 63);
+ EXPECT_EQ(primitives.val_sfixed64(), -54);
+ EXPECT_EQ(primitives.val_sint32(), -533);
+ EXPECT_EQ(primitives.val_sint64(), -61224762453LL);
+ EXPECT_EQ(primitives.val_enum(), PrimitiveProto_Count_TWO);
+}
+
+TEST(ProtoOutputStreamTest, Complex) {
+ std::string name1 = "cat";
+ std::string name2 = "dog";
+ const char data1[6] = { 'f', 'u', 'n', 'n', 'y', '!' };
+ const char data2[4] = { 'f', 'o', 'o', 'd' };
+
+ ProtoOutputStream proto;
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 23));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 101));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, -72));
+ uint64_t token1 = proto.start(FIELD_TYPE_MESSAGE | ComplexProto::kLogsFieldNumber);
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::Log::kIdFieldNumber, 12));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | ComplexProto::Log::kNameFieldNumber, name1));
+ // specify the length to test the write(id, bytes, length) function.
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | ComplexProto::Log::kDataFieldNumber, data1, 5));
+ proto.end(token1);
+ uint64_t token2 = proto.start(FIELD_TYPE_MESSAGE | ComplexProto::kLogsFieldNumber);
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::Log::kIdFieldNumber, 98));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | ComplexProto::Log::kNameFieldNumber, name2));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | ComplexProto::Log::kDataFieldNumber, data2, 4));
+ proto.end(token2);
+
+ ComplexProto complex;
+ ASSERT_TRUE(complex.ParseFromString(iterateToString(&proto)));
+ EXPECT_EQ(complex.ints_size(), 3);
+ EXPECT_EQ(complex.ints(0), 23);
+ EXPECT_EQ(complex.ints(1), 101);
+ EXPECT_EQ(complex.ints(2), -72);
+ EXPECT_EQ(complex.logs_size(), 2);
+ ComplexProto::Log log1 = complex.logs(0);
+ EXPECT_EQ(log1.id(), 12);
+ EXPECT_THAT(log1.name(), StrEq(name1.c_str()));
+ EXPECT_THAT(log1.data(), StrEq("funny")); // should not contain '!'
+ ComplexProto::Log log2 = complex.logs(1);
+ EXPECT_EQ(log2.id(), 98);
+ EXPECT_THAT(log2.name(), StrEq(name2.c_str()));
+ EXPECT_THAT(log2.data(), StrEq("food"));
+}
+
+TEST(ProtoOutputStreamTest, Reusability) {
+ ProtoOutputStream proto;
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 32));
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 15));
+ EXPECT_EQ(proto.bytesWritten(), 4);
+ EXPECT_EQ(proto.size(), 4);
+ // Can't write to proto after compact
+ EXPECT_FALSE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 94));
+
+ ComplexProto beforeClear;
+ ASSERT_TRUE(beforeClear.ParseFromString(flushToString(&proto)));
+ EXPECT_EQ(beforeClear.ints_size(), 2);
+ EXPECT_EQ(beforeClear.ints(0), 32);
+ EXPECT_EQ(beforeClear.ints(1), 15);
+
+ proto.clear();
+ EXPECT_EQ(proto.bytesWritten(), 0);
+ EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | ComplexProto::kIntsFieldNumber, 1076));
+
+ ComplexProto afterClear;
+ ASSERT_TRUE(afterClear.ParseFromString(flushToString(&proto)));
+ EXPECT_EQ(afterClear.ints_size(), 1);
+ EXPECT_EQ(afterClear.ints(0), 1076);
+}
+
+TEST(ProtoOutputStreamTest, AdvancedEncoding) {
+ ProtoOutputStream proto;
+ proto.writeRawVarint((ComplexProto::kIntsFieldNumber << FIELD_ID_SHIFT) + WIRE_TYPE_VARINT);
+ proto.writeRawVarint(UINT64_C(-123809234));
+ proto.writeLengthDelimitedHeader(ComplexProto::kLogsFieldNumber, 8);
+ proto.writeRawByte((ComplexProto::Log::kDataFieldNumber << FIELD_ID_SHIFT) + WIRE_TYPE_LENGTH_DELIMITED);
+ proto.writeRawByte(6);
+ proto.writeRawByte('b');
+ proto.writeRawByte('a');
+ proto.writeRawByte('n');
+ proto.writeRawByte('a');
+ proto.writeRawByte('n');
+ proto.writeRawByte('a');
+ uint64_t token = proto.start(FIELD_TYPE_MESSAGE | ComplexProto::kLogsFieldNumber);
+ proto.write(FIELD_TYPE_INT32 | ComplexProto::Log::kIdFieldNumber, 14);
+ proto.end(token);
+
+ ComplexProto complex;
+ ASSERT_TRUE(complex.ParseFromString(flushToString(&proto)));
+ EXPECT_EQ(complex.ints_size(), 1);
+ EXPECT_EQ(complex.ints(0), UINT64_C(-123809234));
+ EXPECT_EQ(complex.logs_size(), 2);
+ ComplexProto::Log log1 = complex.logs(0);
+ EXPECT_FALSE(log1.has_id());
+ EXPECT_FALSE(log1.has_name());
+ EXPECT_THAT(log1.data(), StrEq("banana"));
+ ComplexProto::Log log2 = complex.logs(1);
+ EXPECT_EQ(log2.id(), 14);
+ EXPECT_FALSE(log2.has_name());
+ EXPECT_FALSE(log2.has_data());
+}
+
+TEST(ProtoOutputStreamTest, InvalidTypes) {
+ ProtoOutputStream proto;
+ EXPECT_FALSE(proto.write(FIELD_TYPE_UNKNOWN | PrimitiveProto::kValInt32FieldNumber, 790));
+ EXPECT_FALSE(proto.write(FIELD_TYPE_ENUM | PrimitiveProto::kValEnumFieldNumber, 234.34));
+ EXPECT_FALSE(proto.write(FIELD_TYPE_BOOL | PrimitiveProto::kValBoolFieldNumber, 18.73f));
+ EXPECT_EQ(proto.size(), 0);
+}
+
+TEST(ProtoOutputStreamTest, NoEndCalled) {
+ ProtoOutputStream proto;
+ proto.start(FIELD_TYPE_MESSAGE | ComplexProto::kLogsFieldNumber);
+ proto.write(FIELD_TYPE_INT32 | ComplexProto::Log::kIdFieldNumber, 53);
+ // no proto.end called
+ EXPECT_NE(proto.bytesWritten(), 0);
+ EXPECT_EQ(proto.size(), 0);
+ EXPECT_EQ(proto.data().size(), 0);
+ EXPECT_FALSE(proto.flush(STDOUT_FILENO));
+}
+
+
+TEST(ProtoOutputStreamTest, TwoEndCalled) {
+ ProtoOutputStream proto;
+ uint64_t token = proto.start(FIELD_TYPE_MESSAGE | ComplexProto::kLogsFieldNumber);
+ proto.write(FIELD_TYPE_INT32 | ComplexProto::Log::kIdFieldNumber, 53);
+ proto.end(token);
+ proto.end(token);
+ EXPECT_NE(proto.bytesWritten(), 0);
+ EXPECT_EQ(proto.size(), 0);
+ EXPECT_EQ(proto.data().size(), 0);
+ EXPECT_FALSE(proto.flush(STDOUT_FILENO));
+}
+
+TEST(ProtoOutputStreamTest, NoStartCalled) {
+ ProtoOutputStream proto;
+ uint64_t wrongToken = UINT64_C(324536345);
+ // no proto.start called
+ proto.write(FIELD_TYPE_INT32 | ComplexProto::Log::kIdFieldNumber, 53);
+ proto.end(wrongToken);
+ EXPECT_NE(proto.bytesWritten(), 0);
+ EXPECT_EQ(proto.size(), 0);
+ EXPECT_EQ(proto.data().size(), 0);
+ EXPECT_FALSE(proto.flush(STDOUT_FILENO));
+}
diff --git a/libs/protoutil/tests/protobuf_test.cpp b/libs/protoutil/tests/protobuf_test.cpp
new file mode 100644
index 000000000000..5ca3e6477c01
--- /dev/null
+++ b/libs/protoutil/tests/protobuf_test.cpp
@@ -0,0 +1,51 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#include <android/util/protobuf.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace android::util;
+
+TEST(ProtobufTest, All) {
+ EXPECT_EQ(read_wire_type(UINT32_C(17)), 1);
+ EXPECT_EQ(read_field_id(UINT32_C(17)), 2);
+ EXPECT_EQ(get_varint_size(UINT64_C(234134)), 3);
+ EXPECT_EQ(get_varint_size(UINT64_C(-1)), 10);
+
+ constexpr uint8_t UNSET_BYTE = 0xAB;
+
+ uint8_t buf[11];
+ memset(buf, UNSET_BYTE, sizeof(buf));
+ EXPECT_EQ(write_raw_varint(buf, UINT64_C(150)) - buf, 2);
+ EXPECT_EQ(buf[0], 0x96);
+ EXPECT_EQ(buf[1], 0x01);
+ EXPECT_EQ(buf[2], UNSET_BYTE);
+
+ memset(buf, UNSET_BYTE, sizeof(buf));
+ EXPECT_EQ(write_raw_varint(buf, UINT64_C(-2)) - buf, 10);
+ EXPECT_EQ(buf[0], 0xfe);
+ for (int i = 1; i < 9; i++) {
+ EXPECT_EQ(buf[i], 0xff);
+ }
+ EXPECT_EQ(buf[9], 0x01);
+ EXPECT_EQ(buf[10], UNSET_BYTE);
+
+ uint8_t header[20];
+ memset(header, UNSET_BYTE, sizeof(header));
+ EXPECT_EQ(write_length_delimited_tag_header(header, 3, 150) - header, 3);
+ EXPECT_EQ(header[0], 26);
+ EXPECT_EQ(header[1], 0x96);
+ EXPECT_EQ(header[2], 0x01);
+ EXPECT_EQ(header[3], UNSET_BYTE);
+} \ No newline at end of file
diff --git a/libs/protoutil/tests/test.proto b/libs/protoutil/tests/test.proto
new file mode 100644
index 000000000000..52c55f39f326
--- /dev/null
+++ b/libs/protoutil/tests/test.proto
@@ -0,0 +1,42 @@
+// This proto file is only used for testing purpose.
+syntax = "proto2";
+
+package android.util;
+
+message PrimitiveProto {
+
+ optional int32 val_int32 = 1;
+ optional int64 val_int64 = 2;
+ optional float val_float = 3;
+ optional double val_double = 4;
+ optional uint32 val_uint32 = 5;
+ optional uint64 val_uint64 = 6;
+ optional fixed32 val_fixed32 = 7;
+ optional fixed64 val_fixed64 = 8;
+ optional bool val_bool = 9;
+ optional string val_string = 10;
+ optional bytes val_bytes = 11;
+ optional sfixed32 val_sfixed32 = 12;
+ optional sfixed64 val_sfixed64 = 13;
+ optional sint32 val_sint32 = 14;
+ optional sint64 val_sint64 = 15;
+
+ enum Count {
+ ZERO = 0;
+ ONE = 1;
+ TWO = 2;
+ };
+ optional Count val_enum = 16;
+}
+
+message ComplexProto {
+
+ repeated int32 ints = 1;
+
+ message Log {
+ optional int32 id = 1;
+ optional string name = 2;
+ optional bytes data = 3;
+ }
+ repeated Log logs = 2;
+}
diff --git a/libs/services/src/os/DropBoxManager.cpp b/libs/services/src/os/DropBoxManager.cpp
index c2907a66fb99..8282518f75c6 100644
--- a/libs/services/src/os/DropBoxManager.cpp
+++ b/libs/services/src/os/DropBoxManager.cpp
@@ -236,7 +236,7 @@ DropBoxManager::getNextEntry(const String16& tag, long msec, Entry* entry)
if (service == NULL) {
return Status::fromExceptionCode(Status::EX_NULL_POINTER, "can't find dropbox service");
}
- return service->getNextEntry(tag, msec, entry);
+ return service->getNextEntry(tag, msec, android::String16("android"), entry);
}
}} // namespace android::os
diff --git a/libs/usb/Android.bp b/libs/usb/Android.bp
index b8f29043e597..027a7488f723 100644
--- a/libs/usb/Android.bp
+++ b/libs/usb/Android.bp
@@ -1 +1,23 @@
+//
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+java_sdk_library {
+ name: "com.android.future.usb.accessory",
+ srcs: ["src/**/*.java"],
+ api_packages: ["com.android.future.usb"],
+}
+
subdirs = ["tests/*"]
diff --git a/libs/usb/api/current.txt b/libs/usb/api/current.txt
new file mode 100644
index 000000000000..8488db5b0f86
--- /dev/null
+++ b/libs/usb/api/current.txt
@@ -0,0 +1,25 @@
+package com.android.future.usb {
+
+ public class UsbAccessory {
+ method public java.lang.String getDescription();
+ method public java.lang.String getManufacturer();
+ method public java.lang.String getModel();
+ method public java.lang.String getSerial();
+ method public java.lang.String getUri();
+ method public java.lang.String getVersion();
+ }
+
+ public class UsbManager {
+ method public static com.android.future.usb.UsbAccessory getAccessory(android.content.Intent);
+ method public com.android.future.usb.UsbAccessory[] getAccessoryList();
+ method public static com.android.future.usb.UsbManager getInstance(android.content.Context);
+ method public boolean hasPermission(com.android.future.usb.UsbAccessory);
+ method public android.os.ParcelFileDescriptor openAccessory(com.android.future.usb.UsbAccessory);
+ method public void requestPermission(com.android.future.usb.UsbAccessory, android.app.PendingIntent);
+ field public static final java.lang.String ACTION_USB_ACCESSORY_ATTACHED = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
+ field public static final java.lang.String ACTION_USB_ACCESSORY_DETACHED = "android.hardware.usb.action.USB_ACCESSORY_DETACHED";
+ field public static final java.lang.String EXTRA_PERMISSION_GRANTED = "permission";
+ }
+
+}
+
diff --git a/libs/usb/api/removed.txt b/libs/usb/api/removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/libs/usb/api/removed.txt
diff --git a/libs/usb/api/system-current.txt b/libs/usb/api/system-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/libs/usb/api/system-current.txt
diff --git a/libs/usb/api/system-removed.txt b/libs/usb/api/system-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/libs/usb/api/system-removed.txt
diff --git a/libs/usb/api/test-current.txt b/libs/usb/api/test-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/libs/usb/api/test-current.txt
diff --git a/libs/usb/api/test-removed.txt b/libs/usb/api/test-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/libs/usb/api/test-removed.txt
diff --git a/libs/usb/tests/AccessoryChat/Android.mk b/libs/usb/tests/AccessoryChat/Android.mk
index ecb455a90e29..cfe2da1eb471 100644
--- a/libs/usb/tests/AccessoryChat/Android.mk
+++ b/libs/usb/tests/AccessoryChat/Android.mk
@@ -23,4 +23,6 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := AccessoryChat
+LOCAL_PRIVATE_PLATFORM_APIS := true
+
include $(BUILD_PACKAGE)
diff --git a/location/java/android/location/GnssStatus.java b/location/java/android/location/GnssStatus.java
index 5563ccee9296..60c7748a8dbf 100644
--- a/location/java/android/location/GnssStatus.java
+++ b/location/java/android/location/GnssStatus.java
@@ -104,7 +104,10 @@ public final class GnssStatus {
final int mSvCount;
final float[] mCarrierFrequencies;
- GnssStatus(int svCount, int[] svidWithFlags, float[] cn0s, float[] elevations,
+ /**
+ * @hide
+ */
+ public GnssStatus(int svCount, int[] svidWithFlags, float[] cn0s, float[] elevations,
float[] azimuths, float[] carrierFrequencies) {
mSvCount = svCount;
mSvidWithFlags = svidWithFlags;
diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java
index c9d2f7f8bfd4..684cafa14005 100644
--- a/location/java/android/location/Location.java
+++ b/location/java/android/location/Location.java
@@ -17,6 +17,7 @@
package android.location;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -999,6 +1000,7 @@ public class Location implements Parcelable {
* @see #isComplete
* @hide
*/
+ @TestApi
@SystemApi
public void makeComplete() {
if (mProvider == null) mProvider = "?";
@@ -1031,6 +1033,9 @@ public class Location implements Parcelable {
/**
* Sets the extra information associated with this fix to the
* given Bundle.
+ *
+ * <p>Note this stores a copy of the given extras, so any changes to extras after calling this
+ * method won't be reflected in the location bundle.
*/
public void setExtras(Bundle extras) {
mExtras = (extras == null) ? null : new Bundle(extras);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index fd5ed5005916..aaee084a67a1 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -22,7 +22,6 @@ import static android.Manifest.permission.LOCATION_HARDWARE;
import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
import android.Manifest;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
@@ -42,16 +41,11 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.ArraySet;
import android.util.Log;
import com.android.internal.location.ProviderProperties;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
-import java.util.Set;
/**
* This class provides access to the system location services. These
@@ -331,7 +325,7 @@ public class LocationManager {
Message msg = Message.obtain();
msg.what = TYPE_LOCATION_CHANGED;
msg.obj = location;
- mListenerHandler.sendMessage(msg);
+ sendCallbackMessage(msg);
}
@Override
@@ -345,7 +339,7 @@ public class LocationManager {
b.putBundle("extras", extras);
}
msg.obj = b;
- mListenerHandler.sendMessage(msg);
+ sendCallbackMessage(msg);
}
@Override
@@ -353,7 +347,7 @@ public class LocationManager {
Message msg = Message.obtain();
msg.what = TYPE_PROVIDER_ENABLED;
msg.obj = provider;
- mListenerHandler.sendMessage(msg);
+ sendCallbackMessage(msg);
}
@Override
@@ -361,7 +355,13 @@ public class LocationManager {
Message msg = Message.obtain();
msg.what = TYPE_PROVIDER_DISABLED;
msg.obj = provider;
- mListenerHandler.sendMessage(msg);
+ sendCallbackMessage(msg);
+ }
+
+ private void sendCallbackMessage(Message msg) {
+ if (!mListenerHandler.sendMessage(msg)) {
+ locationCallbackFinished();
+ }
}
private void _handleMessage(Message msg) {
@@ -384,6 +384,10 @@ public class LocationManager {
mListener.onProviderDisabled((String) msg.obj);
break;
}
+ locationCallbackFinished();
+ }
+
+ private void locationCallbackFinished() {
try {
mService.locationCallbackFinished(this);
} catch (RemoteException e) {
diff --git a/location/lib/Android.bp b/location/lib/Android.bp
new file mode 100644
index 000000000000..447195d6d532
--- /dev/null
+++ b/location/lib/Android.bp
@@ -0,0 +1,21 @@
+//
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+java_sdk_library {
+ name: "com.android.location.provider",
+ srcs: ["java/**/*.java"],
+ api_packages: ["com.android.location.provider"],
+}
diff --git a/location/lib/Android.mk b/location/lib/Android.mk
deleted file mode 100644
index 6642134ec32b..000000000000
--- a/location/lib/Android.mk
+++ /dev/null
@@ -1,66 +0,0 @@
-#
-# Copyright (C) 2010 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.
-#
-LOCAL_PATH := $(call my-dir)
-
-# the library
-# ============================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE:= com.android.location.provider
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-include $(BUILD_JAVA_LIBRARY)
-
-
-# ==== com.google.location.xml lib def ========================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := com.android.location.provider.xml
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE_CLASS := ETC
-
-# This will install the file in /system/etc/permissions
-#
-LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
-# ==== Stub library ===========================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.android.location.provider-stubs-gen
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_SRC_FILES := $(call all-java-files-under,java)
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/com.android.location.provider.stubs_intermediates/src
-LOCAL_DROIDDOC_OPTIONS:= \
- -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \
- -stubpackages com.android.location.provider \
- -nodocs
-LOCAL_UNINSTALLABLE_MODULE := true
-include $(BUILD_DROIDDOC)
-com_android_nfc_extras_gen_stamp := $(full_target)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.android.location.provider.stubs
-LOCAL_SOURCE_FILES_ALL_GENERATED := true
-LOCAL_SDK_VERSION := current
-LOCAL_ADDITIONAL_DEPENDENCIES := $(com_android_nfc_extras_gen_stamp)
-com_android_nfc_extras_gen_stamp :=
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/location/lib/api/current.txt b/location/lib/api/current.txt
new file mode 100644
index 000000000000..1e69f162fb07
--- /dev/null
+++ b/location/lib/api/current.txt
@@ -0,0 +1,47 @@
+package com.android.location.provider {
+
+ public abstract deprecated class FusedProvider {
+ ctor public FusedProvider();
+ method public android.os.IBinder getBinder();
+ }
+
+ public abstract class LocationProviderBase {
+ ctor public LocationProviderBase(java.lang.String, com.android.location.provider.ProviderPropertiesUnbundled);
+ method public android.os.IBinder getBinder();
+ method public abstract void onDisable();
+ method public void onDump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+ method public abstract void onEnable();
+ method public abstract int onGetStatus(android.os.Bundle);
+ method public abstract long onGetStatusUpdateTime();
+ method public boolean onSendExtraCommand(java.lang.String, android.os.Bundle);
+ method public abstract void onSetRequest(com.android.location.provider.ProviderRequestUnbundled, android.os.WorkSource);
+ method public final void reportLocation(android.location.Location);
+ field public static final java.lang.String EXTRA_NO_GPS_LOCATION = "noGPSLocation";
+ field public static final java.lang.String FUSED_PROVIDER = "fused";
+ }
+
+ public final class LocationRequestUnbundled {
+ method public long getFastestInterval();
+ method public long getInterval();
+ method public int getQuality();
+ method public float getSmallestDisplacement();
+ field public static final int ACCURACY_BLOCK = 102; // 0x66
+ field public static final int ACCURACY_CITY = 104; // 0x68
+ field public static final int ACCURACY_FINE = 100; // 0x64
+ field public static final int POWER_HIGH = 203; // 0xcb
+ field public static final int POWER_LOW = 201; // 0xc9
+ field public static final int POWER_NONE = 200; // 0xc8
+ }
+
+ public final class ProviderPropertiesUnbundled {
+ method public static com.android.location.provider.ProviderPropertiesUnbundled create(boolean, boolean, boolean, boolean, boolean, boolean, boolean, int, int);
+ }
+
+ public final class ProviderRequestUnbundled {
+ method public long getInterval();
+ method public java.util.List<com.android.location.provider.LocationRequestUnbundled> getLocationRequests();
+ method public boolean getReportLocation();
+ }
+
+}
+
diff --git a/location/lib/api/removed.txt b/location/lib/api/removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/location/lib/api/removed.txt
diff --git a/location/lib/api/system-current.txt b/location/lib/api/system-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/location/lib/api/system-current.txt
diff --git a/location/lib/api/system-removed.txt b/location/lib/api/system-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/location/lib/api/system-removed.txt
diff --git a/location/lib/api/test-current.txt b/location/lib/api/test-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/location/lib/api/test-current.txt
diff --git a/location/lib/api/test-removed.txt b/location/lib/api/test-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/location/lib/api/test-removed.txt
diff --git a/lowpan/tests/Android.mk b/lowpan/tests/Android.mk
index 6fd47c65cdab..67727a7b1baa 100644
--- a/lowpan/tests/Android.mk
+++ b/lowpan/tests/Android.mk
@@ -34,10 +34,6 @@ local_java_files := $(filter %.java,$(LOCAL_SRC_FILES))
# This only works if the class name matches the file name and the directory structure
# matches the package.
local_classes := $(subst /,.,$(patsubst src/%.java,%,$(local_java_files)))
-# Utility variables to allow replacing a space with a comma
-comma:= ,
-empty:=
-space:= $(empty) $(empty)
# Convert class name list to jacoco exclude list
# This appends a * to all classes and replace the space separators with commas.
# These patterns will match all classes in this module and their inner classes.
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 27a4a3c79234..ca5627e27382 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -794,6 +794,11 @@ public class AudioManager {
* <p>
* This method should only be used by applications that replace the platform-wide
* management of audio settings or the main telephony application.
+ * <p>This method has no effect if the device implements a fixed volume policy
+ * as indicated by {@link #isVolumeFixed()}.
+ * <p>From N onward, ringer mode adjustments that would toggle Do Not Disturb are not allowed
+ * unless the app has been granted Do Not Disturb Access.
+ * See {@link NotificationManager#isNotificationPolicyAccessGranted()}.
*
* @param streamType The stream type to adjust. One of {@link #STREAM_VOICE_CALL},
* {@link #STREAM_SYSTEM}, {@link #STREAM_RING}, {@link #STREAM_MUSIC},
@@ -804,6 +809,8 @@ public class AudioManager {
* @param flags One or more flags.
* @see #adjustVolume(int, int)
* @see #setStreamVolume(int, int, int)
+ * @throws SecurityException if the adjustment triggers a Do Not Disturb change
+ * and the caller is not granted notification policy access.
*/
public void adjustStreamVolume(int streamType, int direction, int flags) {
final IAudioService service = getService();
@@ -1121,6 +1128,8 @@ public class AudioManager {
* @see #getStreamMaxVolume(int)
* @see #getStreamVolume(int)
* @see #isVolumeFixed()
+ * @throws SecurityException if the volume change triggers a Do Not Disturb change
+ * and the caller is not granted notification policy access.
*/
public void setStreamVolume(int streamType, int index, int flags) {
final IAudioService service = getService();
@@ -1229,6 +1238,7 @@ public class AudioManager {
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
public void forceVolumeControlStream(int streamType) {
final IAudioService service = getService();
try {
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 2cb58d043fc0..62d3dead6abe 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -412,7 +412,7 @@ public final class MediaCodecInfo {
* Use this format with {@link Image}. This format corresponds to
* {@link android.graphics.ImageFormat#FLEX_RGB_888}, and can represent
* {@link #COLOR_Format24bitBGR888} and {@link #COLOR_Format24bitRGB888} formats.
- * @see Image#getFormat.
+ * @see Image#getFormat()
*/
public static final int COLOR_FormatRGBFlexible = 0x7F36B888;
@@ -425,7 +425,7 @@ public final class MediaCodecInfo {
* {@link #COLOR_Format32bitBGRA8888}, {@link #COLOR_Format32bitABGR8888} and
* {@link #COLOR_Format32bitARGB8888} formats.
*
- * @see Image#getFormat
+ * @see Image#getFormat()
*/
public static final int COLOR_FormatRGBAFlexible = 0x7F36A888;
diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java
index 3cb4cbe99a4b..2e4786579d97 100644
--- a/media/java/android/media/MediaCodecList.java
+++ b/media/java/android/media/MediaCodecList.java
@@ -201,7 +201,7 @@ final public class MediaCodecList {
* <code class=prettyprint>format.setString(MediaFormat.KEY_FRAME_RATE, null)</code>
* to clear any existing frame rate setting in the format.
*
- * @see MediaCodecList.CodecCapabilities.isFormatSupported for format keys
+ * @see MediaCodecInfo.CodecCapabilities#isFormatSupported(MediaFormat) for format keys
* considered per android versions when evaluating suitable codecs.
*
* @param format A decoder media format with optional feature directives.
@@ -225,7 +225,7 @@ final public class MediaCodecList {
* <code class=prettyprint>format.setString(MediaFormat.KEY_FRAME_RATE, null)</code>
* to clear any existing frame rate setting in the format.
*
- * @see MediaCodecList.CodecCapabilities.isFormatSupported for format keys
+ * @see MediaCodecInfo.CodecCapabilities#isFormatSupported(MediaFormat) for format keys
* considered per android versions when evaluating suitable codecs.
*
* @param format An encoder media format with optional feature directives.
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index deda63ba9111..a38b22384a56 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -143,7 +143,7 @@ public final class MediaFormat {
* MIME type for HEIF still image data encoded in HEVC.
*
* To decode such an image, {@link MediaCodec} decoder for
- * {@ #MIMETYPE_VIDEO_HEVC} shall be used. The client needs to form
+ * {@link #MIMETYPE_VIDEO_HEVC} shall be used. The client needs to form
* the correct {@link #MediaFormat} based on additional information in
* the track format, and send it to {@link MediaCodec#configure}.
*
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index ada91be9ca4d..d532e526f2fb 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -2510,10 +2510,10 @@ public class MediaPlayer extends PlayerBase
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mTrackType);
+ dest.writeString(mFormat.getString(MediaFormat.KEY_MIME));
dest.writeString(getLanguage());
if (mTrackType == MEDIA_TRACK_TYPE_SUBTITLE) {
- dest.writeString(mFormat.getString(MediaFormat.KEY_MIME));
dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_AUTOSELECT));
dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_DEFAULT));
dest.writeInt(mFormat.getInteger(MediaFormat.KEY_IS_FORCED_SUBTITLE));
diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java
index dcc872c16e15..61c412dac185 100644
--- a/media/java/android/media/MediaPlayer2.java
+++ b/media/java/android/media/MediaPlayer2.java
@@ -116,9 +116,9 @@ import java.util.concurrent.Executor;
* these circumstances. Sometimes, due to programming errors, invoking a playback
* control operation in an invalid state may also occur. Under all these
* error conditions, the internal player engine invokes a user supplied
- * MediaPlayer2EventCallback.onError() method if an MediaPlayer2EventCallback has been
+ * EventCallback.onError() method if an EventCallback has been
* registered beforehand via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}.
+ * {@link #setEventCallback(Executor, EventCallback)}.
* <ul>
* <li>It is important to note that once an error occurs, the
* MediaPlayer2 object enters the <em>Error</em> state (except as noted
@@ -159,9 +159,9 @@ import java.util.concurrent.Executor;
* player engine continues working on the rest of preparation work
* until the preparation work completes. When the preparation completes,
* the internal player engine then calls a user supplied callback method,
- * onInfo() of the MediaPlayer2EventCallback interface with {@link #MEDIA_INFO_PREPARED},
- * if an MediaPlayer2EventCallback is registered beforehand via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}.</li>
+ * onInfo() of the EventCallback interface with {@link #MEDIA_INFO_PREPARED},
+ * if an EventCallback is registered beforehand via
+ * {@link #setEventCallback(Executor, EventCallback)}.</li>
* <li>It is important to note that
* the <em>Preparing</em> state is a transient state, and the behavior
* of calling any method with side effect while a MediaPlayer2 object is
@@ -180,10 +180,10 @@ import java.util.concurrent.Executor;
* whether the MediaPlayer2 object is in the <em>Started</em> state.
* <ul>
* <li>While in the <em>Started</em> state, the internal player engine calls
- * a user supplied callback method MediaPlayer2EventCallback.onInfo() with
- * {@link #MEDIA_INFO_BUFFERING_UPDATE} if an MediaPlayer2EventCallback has been
+ * a user supplied callback method EventCallback.onInfo() with
+ * {@link #MEDIA_INFO_BUFFERING_UPDATE} if an EventCallback has been
* registered beforehand via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}.
+ * {@link #setEventCallback(Executor, EventCallback)}.
* This callback allows applications to keep track of the buffering status
* while streaming audio/video.</li>
* <li>Calling {@link #play()} has not effect
@@ -215,10 +215,10 @@ import java.util.concurrent.Executor;
* call returns right away, the actual seek operation may take a while to
* finish, especially for audio/video being streamed. When the actual
* seek operation completes, the internal player engine calls a user
- * supplied MediaPlayer2EventCallback.onCallCompleted() with
+ * supplied EventCallback.onCallCompleted() with
* {@link #CALL_COMPLETED_SEEK_TO}
- * if an MediaPlayer2EventCallback has been registered beforehand via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}.</li>
+ * if an EventCallback has been registered beforehand via
+ * {@link #setEventCallback(Executor, EventCallback)}.</li>
* <li>Please
* note that {@link #seekTo(long, int)} can also be called in the other states,
* such as <em>Prepared</em>, <em>Paused</em> and <em>PlaybackCompleted
@@ -238,9 +238,9 @@ import java.util.concurrent.Executor;
* the MediaPlayer2 object shall remain in the <em>Started</em> state.</li>
* <li>If the looping mode was set to <var>false
* </var>, the player engine calls a user supplied callback method,
- * MediaPlayer2EventCallback.onCompletion(), if an MediaPlayer2EventCallback is
+ * EventCallback.onCompletion(), if an EventCallback is
* registered beforehand via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}.
+ * {@link #setEventCallback(Executor, EventCallback)}.
* The invoke of the callback signals that the object is now in the <em>
* PlaybackCompleted</em> state.</li>
* <li>While in the <em>PlaybackCompleted</em>
@@ -387,7 +387,7 @@ import java.util.concurrent.Executor;
* <td>{} </p></td>
* <td>This method can be called in any state and calling it does not change
* the object state. </p></td></tr>
- * <tr><td>setMediaPlayer2EventCallback </p></td>
+ * <tr><td>setEventCallback </p></td>
* <td>any </p></td>
* <td>{} </p></td>
* <td>This method can be called in any state and calling it does not change
@@ -445,7 +445,7 @@ import java.util.concurrent.Executor;
* possible runtime errors during playback or streaming. Registration for
* these events is done by properly setting the appropriate listeners (via calls
* to
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)},
+ * {@link #setEventCallback(Executor, EventCallback)},
* {@link #setDrmEventCallback(Executor, DrmEventCallback)}).
* In order to receive the respective callback
* associated with these listeners, applications are required to create
@@ -453,8 +453,8 @@ import java.util.concurrent.Executor;
* thread by default has a Looper running).
*
*/
-public abstract class MediaPlayer2 extends MediaPlayerBase
- implements SubtitleController.Listener
+public abstract class MediaPlayer2 implements SubtitleController.Listener
+ , AutoCloseable
, AudioRouting {
/**
* Create a MediaPlayer2 object.
@@ -514,6 +514,12 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
public MediaPlayer2() { }
/**
+ * Returns a {@link MediaPlayerBase} implementation which runs based on
+ * this MediaPlayer2 instance.
+ */
+ public abstract MediaPlayerBase getMediaPlayerBase();
+
+ /**
* Releases the resources held by this {@code MediaPlayer2} object.
*
* It is considered good practice to call this method when you're
@@ -549,7 +555,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
*
*/
// This is an asynchronous call.
- @Override
public abstract void play();
/**
@@ -560,21 +565,18 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
*
*/
// This is an asynchronous call.
- @Override
public abstract void prepare();
/**
* Pauses playback. Call play() to resume.
*/
// This is an asynchronous call.
- @Override
public abstract void pause();
/**
* Tries to play next data source if applicable.
*/
// This is an asynchronous call.
- @Override
public abstract void skipToNext();
/**
@@ -584,7 +586,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param msec the offset in milliseconds from the start to seek to
*/
// This is an asynchronous call.
- @Override
public void seekTo(long msec) {
seekTo(msec, SEEK_PREVIOUS_SYNC /* mode */);
}
@@ -594,7 +595,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
*
* @return the current position in milliseconds
*/
- @Override
public abstract long getCurrentPosition();
/**
@@ -603,7 +603,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @return the duration in milliseconds, if no duration is available
* (for example, if streaming live content), -1 is returned.
*/
- @Override
public abstract long getDuration();
/**
@@ -615,25 +614,60 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
*
* @return the current buffered media source position in milliseconds
*/
- @Override
public abstract long getBufferedPosition();
/**
- * Gets the current player state.
- *
- * @return the current player state.
+ * MediaPlayer2 has not been prepared or just has been reset.
+ * In this state, MediaPlayer2 doesn't fetch data.
+ * @hide
*/
- @Override
- public abstract @PlayerState int getPlayerState();
+ public static final int PLAYER_STATE_IDLE = 1001;
/**
- * Gets the current buffering state of the player.
- * During buffering, see {@link #getBufferedPosition()} for the quantifying the amount already
- * buffered.
- * @return the buffering state, one of the following:
+ * MediaPlayer2 has been just prepared.
+ * In this state, MediaPlayer2 just fetches data from media source,
+ * but doesn't actively render data.
+ * @hide
*/
- @Override
- public abstract @BuffState int getBufferingState();
+ public static final int PLAYER_STATE_PREPARED = 1002;
+
+ /**
+ * MediaPlayer2 is paused.
+ * In this state, MediaPlayer2 doesn't actively render data.
+ * @hide
+ */
+ public static final int PLAYER_STATE_PAUSED = 1003;
+
+ /**
+ * MediaPlayer2 is actively playing back data.
+ * @hide
+ */
+ public static final int PLAYER_STATE_PLAYING = 1004;
+
+ /**
+ * MediaPlayer2 has hit some fatal error and cannot continue playback.
+ * @hide
+ */
+ public static final int PLAYER_STATE_ERROR = 1005;
+
+ /**
+ * @hide
+ */
+ @IntDef(flag = false, prefix = "MEDIAPLAYER2_STATE", value = {
+ PLAYER_STATE_IDLE,
+ PLAYER_STATE_PREPARED,
+ PLAYER_STATE_PAUSED,
+ PLAYER_STATE_PLAYING,
+ PLAYER_STATE_ERROR })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface MediaPlayer2State {}
+
+ /**
+ * Gets the current player state.
+ *
+ * @return the current player state.
+ */
+ public abstract @MediaPlayer2State int getState();
/**
* Sets the audio attributes for this MediaPlayer2.
@@ -643,14 +677,12 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param attributes a non-null set of audio attributes
*/
// This is an asynchronous call.
- @Override
public abstract void setAudioAttributes(@NonNull AudioAttributes attributes);
/**
* Gets the audio attributes for this MediaPlayer2.
* @return attributes a set of audio attributes
*/
- @Override
public abstract @Nullable AudioAttributes getAudioAttributes();
/**
@@ -659,7 +691,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param dsd the descriptor of data source you want to play
*/
// This is an asynchronous call.
- @Override
public abstract void setDataSource(@NonNull DataSourceDesc dsd);
/**
@@ -669,7 +700,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param dsd the descriptor of data source you want to play after current one
*/
// This is an asynchronous call.
- @Override
public abstract void setNextDataSource(@NonNull DataSourceDesc dsd);
/**
@@ -678,7 +708,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param dsds the list of data sources you want to play after current one
*/
// This is an asynchronous call.
- @Override
public abstract void setNextDataSources(@NonNull List<DataSourceDesc> dsds);
/**
@@ -686,7 +715,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
*
* @return the current DataSourceDesc
*/
- @Override
public abstract @NonNull DataSourceDesc getCurrentDataSource();
/**
@@ -694,44 +722,9 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param loop true if the current data source is meant to loop.
*/
// This is an asynchronous call.
- @Override
public abstract void loopCurrent(boolean loop);
/**
- * Sets the playback speed.
- * A value of 1.0f is the default playback value.
- * A negative value indicates reverse playback, check {@link #isReversePlaybackSupported()}
- * before using negative values.<br>
- * After changing the playback speed, it is recommended to query the actual speed supported
- * by the player, see {@link #getPlaybackSpeed()}.
- * @param speed the desired playback speed
- */
- // This is an asynchronous call.
- @Override
- public abstract void setPlaybackSpeed(float speed);
-
- /**
- * Returns the actual playback speed to be used by the player when playing.
- * Note that it may differ from the speed set in {@link #setPlaybackSpeed(float)}.
- * @return the actual playback speed
- */
- @Override
- public float getPlaybackSpeed() {
- return 1.0f;
- }
-
- /**
- * Indicates whether reverse playback is supported.
- * Reverse playback is indicated by negative playback speeds, see
- * {@link #setPlaybackSpeed(float)}.
- * @return true if reverse playback is supported.
- */
- @Override
- public boolean isReversePlaybackSupported() {
- return false;
- }
-
- /**
* Sets the volume of the audio of the media to play, expressed as a linear multiplier
* on the audio samples.
* Note that this volume is specific to the player, and is separate from stream volume
@@ -741,7 +734,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param volume a value between 0.0f and {@link #getMaxPlayerVolume()}.
*/
// This is an asynchronous call.
- @Override
public abstract void setPlayerVolume(float volume);
/**
@@ -749,36 +741,16 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* Note that it does not take into account the associated stream volume.
* @return the player volume.
*/
- @Override
public abstract float getPlayerVolume();
/**
* @return the maximum volume that can be used in {@link #setPlayerVolume(float)}.
*/
- @Override
public float getMaxPlayerVolume() {
return 1.0f;
}
/**
- * Adds a callback to be notified of events for this player.
- * @param e the {@link Executor} to be used for the events.
- * @param cb the callback to receive the events.
- */
- // This is a synchronous call.
- @Override
- public abstract void registerPlayerEventCallback(@NonNull Executor e,
- @NonNull PlayerEventCallback cb);
-
- /**
- * Removes a previously registered callback for player events
- * @param cb the callback to remove
- */
- // This is a synchronous call.
- @Override
- public abstract void unregisterPlayerEventCallback(@NonNull PlayerEventCallback cb);
-
- /**
* Create a request parcel which can be routed to the native media
* player using {@link #invoke(Parcel, Parcel)}. The Parcel
* returned has the proper InterfaceToken set. The caller should
@@ -812,10 +784,10 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
/**
* Insert a task in the command queue to help the client to identify whether a batch
* of commands has been finished. When this command is processed, a notification
- * {@code MediaPlayer2EventCallback.onCommandLabelReached} will be fired with the
+ * {@code EventCallback.onCommandLabelReached} will be fired with the
* given {@code label}.
*
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCommandLabelReached
+ * @see android.media.MediaPlayer2.EventCallback#onCommandLabelReached
*
* @param label An application specific Object used to help to identify the completeness
* of a batch of commands.
@@ -911,15 +883,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
// This is a synchronous call.
public abstract void clearPendingCommands();
- /**
- * Stops playback after playback has been started or paused.
- *
- * @throws IllegalStateException if the internal player engine has not been
- * initialized.
- * @hide
- */
- public void stop() { }
-
//--------------------------------------------------------------------------
// Explicit Routing
//--------------------
@@ -973,7 +936,8 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
*/
// This is a synchronous call.
@Override
- public abstract void removeOnRoutingChangedListener(AudioRouting.OnRoutingChangedListener listener);
+ public abstract void removeOnRoutingChangedListener(
+ AudioRouting.OnRoutingChangedListener listener);
/**
* Set the low-level power management behavior for this MediaPlayer2.
@@ -1010,9 +974,9 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
*
* @return the width of the video, or 0 if there is no video,
* no display surface was set, or the width has not been determined
- * yet. The {@code MediaPlayer2EventCallback} can be registered via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)} to provide a
- * notification {@code MediaPlayer2EventCallback.onVideoSizeChanged} when the width
+ * yet. The {@code EventCallback} can be registered via
+ * {@link #setEventCallback(Executor, EventCallback)} to provide a
+ * notification {@code EventCallback.onVideoSizeChanged} when the width
* is available.
*/
public abstract int getVideoWidth();
@@ -1022,9 +986,10 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
*
* @return the height of the video, or 0 if there is no video,
* no display surface was set, or the height has not been determined
- * yet. The {@code MediaPlayer2EventCallback} can be registered via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)} to provide a
- * notification {@code MediaPlayer2EventCallback.onVideoSizeChanged} when the height is available.
+ * yet. The {@code EventCallback} can be registered via
+ * {@link #setEventCallback(Executor, EventCallback)} to provide a
+ * notification {@code EventCallback.onVideoSizeChanged} when the height is
+ * available.
*/
public abstract int getVideoHeight();
@@ -1051,60 +1016,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
public abstract boolean isPlaying();
/**
- * MediaPlayer2 has not been prepared or just has been reset.
- * In this state, MediaPlayer2 doesn't fetch data.
- * @hide
- */
- public static final int MEDIAPLAYER2_STATE_IDLE = 1;
-
- /**
- * MediaPlayer2 has been just prepared.
- * In this state, MediaPlayer2 just fetches data from media source,
- * but doesn't actively render data.
- * @hide
- */
- public static final int MEDIAPLAYER2_STATE_PREPARED = 2;
-
- /**
- * MediaPlayer2 is paused.
- * In this state, MediaPlayer2 doesn't actively render data.
- * @hide
- */
- public static final int MEDIAPLAYER2_STATE_PAUSED = 3;
-
- /**
- * MediaPlayer2 is actively playing back data.
- * @hide
- */
- public static final int MEDIAPLAYER2_STATE_PLAYING = 4;
-
- /**
- * MediaPlayer2 has hit some fatal error and cannot continue playback.
- * @hide
- */
- public static final int MEDIAPLAYER2_STATE_ERROR = 5;
-
- /**
- * @hide
- */
- @IntDef(flag = false, prefix = "MEDIAPLAYER2_STATE", value = {
- MEDIAPLAYER2_STATE_IDLE,
- MEDIAPLAYER2_STATE_PREPARED,
- MEDIAPLAYER2_STATE_PAUSED,
- MEDIAPLAYER2_STATE_PLAYING,
- MEDIAPLAYER2_STATE_ERROR })
- @Retention(RetentionPolicy.SOURCE)
- public @interface MediaPlayer2State {}
-
- /**
- * Gets the current MediaPlayer2 state.
- *
- * @return the current MediaPlayer2 state.
- * @hide
- */
- public abstract @MediaPlayer2State int getMediaPlayer2State();
-
- /**
* Gets the current buffering management params used by the source component.
* Calling it only after {@code setDataSource} has been called.
* Each type of data source might have different set of default params.
@@ -1383,7 +1294,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* data source and calling prepare().
*/
// This is a synchronous call.
- @Override
public abstract void reset();
/**
@@ -1706,7 +1616,7 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* Interface definition for callbacks to be invoked when the player has the corresponding
* events.
*/
- public abstract static class MediaPlayer2EventCallback {
+ public abstract static class EventCallback {
/**
* Called to indicate the video size
*
@@ -1718,7 +1628,8 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param width the width of the video
* @param height the height of the video
*/
- public void onVideoSizeChanged(MediaPlayer2 mp, DataSourceDesc dsd, int width, int height) { }
+ public void onVideoSizeChanged(
+ MediaPlayer2 mp, DataSourceDesc dsd, int width, int height) { }
/**
* Called to indicate an avaliable timed text
@@ -1794,7 +1705,7 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* @param dsd the DataSourceDesc of this data source
* @param timestamp the new media clock.
*/
- public void onMediaTimeChanged(
+ public void onMediaTimeDiscontinuity(
MediaPlayer2 mp, DataSourceDesc dsd, MediaTimestamp timestamp) { }
/**
@@ -1805,58 +1716,48 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* {@link #notifyWhenCommandLabelReached(Object)}.
*/
public void onCommandLabelReached(MediaPlayer2 mp, @NonNull Object label) { }
+
+ /**
+ * Called when when a player subtitle track has new subtitle data available.
+ * @param mp the player that reports the new subtitle data
+ * @param dsd the DataSourceDesc of this data source
+ * @param data the subtitle data
+ */
+ public void onSubtitleData(
+ MediaPlayer2 mp, DataSourceDesc dsd, @NonNull SubtitleData data) { }
}
/**
* Sets the callback to be invoked when the media source is ready for playback.
*
- * @param eventCallback the callback that will be run
* @param executor the executor through which the callback should be invoked
+ * @param eventCallback the callback that will be run
*/
// This is a synchronous call.
- public abstract void setMediaPlayer2EventCallback(@NonNull @CallbackExecutor Executor executor,
- @NonNull MediaPlayer2EventCallback eventCallback);
-
- /**
- * Clears the {@link MediaPlayer2EventCallback}.
- */
- // This is a synchronous call.
- public abstract void clearMediaPlayer2EventCallback();
-
- /**
- * Interface definition of a callback to be invoked when a
- * track has data available.
- *
- * @hide
- */
- public interface OnSubtitleDataListener
- {
- public void onSubtitleData(MediaPlayer2 mp, SubtitleData data);
- }
+ public abstract void registerEventCallback(@NonNull @CallbackExecutor Executor executor,
+ @NonNull EventCallback eventCallback);
/**
- * Register a callback to be invoked when a track has data available.
- *
- * @param listener the callback that will be run
+ * Unregisters the {@link EventCallback}.
*
- * @hide
+ * @param eventCallback the callback to be unregistered
*/
// This is a synchronous call.
- public void setOnSubtitleDataListener(OnSubtitleDataListener listener) { }
+ public abstract void unregisterEventCallback(EventCallback eventCallback);
/* Do not change these values without updating their counterparts
* in include/media/mediaplayer2.h!
*/
/** Unspecified media player error.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onError
+ * @see android.media.MediaPlayer2.EventCallback#onError
*/
public static final int MEDIA_ERROR_UNKNOWN = 1;
/** The video is streamed and its container is not valid for progressive
* playback i.e the video's index (e.g moov atom) is not at the start of the
* file.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onError
+ * @see android.media.MediaPlayer2.EventCallback#onError
*/
public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;
@@ -1872,7 +1773,7 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
/** Unspecified low-level system error. This value originated from UNKNOWN_ERROR in
* system/core/include/utils/Errors.h
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onError
+ * @see android.media.MediaPlayer2.EventCallback#onError
* @hide
*/
public static final int MEDIA_ERROR_SYSTEM = -2147483648;
@@ -1896,62 +1797,62 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* in include/media/mediaplayer2.h!
*/
/** Unspecified media player info.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_UNKNOWN = 1;
/** The player switched to this datas source because it is the
* next-to-be-played in the playlist.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_STARTED_AS_NEXT = 2;
/** The player just pushed the very first video frame for rendering.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3;
/** The player just rendered the very first audio sample.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_AUDIO_RENDERING_START = 4;
/** The player just completed the playback of this data source.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_PLAYBACK_COMPLETE = 5;
/** The player just completed the playback of the full playlist.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_PLAYLIST_END = 6;
/** The player just prepared a data source.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_PREPARED = 100;
/** The video is too complex for the decoder: it can't decode frames fast
* enough. Possibly only the audio plays fine at this stage.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;
/** MediaPlayer2 is temporarily pausing playback internally in order to
* buffer more data.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_BUFFERING_START = 701;
/** MediaPlayer2 is resuming playback after filling buffers.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_BUFFERING_END = 702;
/** Estimated network bandwidth information (kbps) is available; currently this event fires
* simultaneously as {@link #MEDIA_INFO_BUFFERING_START} and {@link #MEDIA_INFO_BUFFERING_END}
* when playing network files.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
* @hide
*/
public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703;
@@ -1963,26 +1864,26 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
* has already been played indicates that the next 30 percent of the
* content to play has been buffered.
*
- * The {@code extra} parameter in {@code MediaPlayer2EventCallback.onInfo} is the
+ * The {@code extra} parameter in {@code EventCallback.onInfo} is the
* percentage (0-100) of the content that has been buffered or played thus far.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_BUFFERING_UPDATE = 704;
/** Bad interleaving means that a media has been improperly interleaved or
* not interleaved at all, e.g has all the video samples first then all the
* audio ones. Video is playing but a lot of disk seeks may be happening.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_BAD_INTERLEAVING = 800;
/** The media cannot be seeked (e.g live stream)
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_NOT_SEEKABLE = 801;
/** A new set of metadata is available.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_METADATA_UPDATE = 802;
@@ -1994,30 +1895,30 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
/** Informs that audio is not playing. Note that playback of the video
* is not interrupted.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_AUDIO_NOT_PLAYING = 804;
/** Informs that video is not playing. Note that playback of the audio
* is not interrupted.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_VIDEO_NOT_PLAYING = 805;
/** Failed to handle timed text track properly.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*
* {@hide}
*/
public static final int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
/** Subtitle track was not supported by the media framework.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;
/** Reading the subtitle track takes too long.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onInfo
+ * @see android.media.MediaPlayer2.EventCallback#onInfo
*/
public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;
@@ -2052,129 +1953,124 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
//--------------------------------------------------------------------------
/** The player just completed a call {@link #attachAuxEffect}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_ATTACH_AUX_EFFECT = 1;
/** The player just completed a call {@link #deselectTrack}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_DESELECT_TRACK = 2;
/** The player just completed a call {@link #loopCurrent}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_LOOP_CURRENT = 3;
/** The player just completed a call {@link #pause}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_PAUSE = 4;
/** The player just completed a call {@link #play}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_PLAY = 5;
/** The player just completed a call {@link #prepare}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_PREPARE = 6;
/** The player just completed a call {@link #releaseDrm}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_RELEASE_DRM = 12;
/** The player just completed a call {@link #restoreDrmKeys}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_RESTORE_DRM_KEYS = 13;
/** The player just completed a call {@link #seekTo}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SEEK_TO = 14;
/** The player just completed a call {@link #selectTrack}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SELECT_TRACK = 15;
/** The player just completed a call {@link #setAudioAttributes}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_AUDIO_ATTRIBUTES = 16;
/** The player just completed a call {@link #setAudioSessionId}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_AUDIO_SESSION_ID = 17;
/** The player just completed a call {@link #setAuxEffectSendLevel}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL = 18;
/** The player just completed a call {@link #setDataSource}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_DATA_SOURCE = 19;
/** The player just completed a call {@link #setNextDataSource}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCE = 22;
/** The player just completed a call {@link #setNextDataSources}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCES = 23;
/** The player just completed a call {@link #setPlaybackParams}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_PLAYBACK_PARAMS = 24;
- /** The player just completed a call {@link #setPlaybackSpeed}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
- */
- public static final int CALL_COMPLETED_SET_PLAYBACK_SPEED = 25;
-
/** The player just completed a call {@link #setPlayerVolume}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_PLAYER_VOLUME = 26;
/** The player just completed a call {@link #setSurface}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_SURFACE = 27;
/** The player just completed a call {@link #setSyncParams}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SET_SYNC_PARAMS = 28;
/** The player just completed a call {@link #skipToNext}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_COMPLETED_SKIP_TO_NEXT = 29;
/** The player just completed a call {@link #setBufferingParams}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
* @hide
*/
public static final int CALL_COMPLETED_SET_BUFFERING_PARAMS = 1001;
/** The player just completed a call {@code setVideoScalingMode}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
* @hide
*/
public static final int CALL_COMPLETED_SET_VIDEO_SCALING_MODE = 1002;
/** The player just completed a call {@code notifyWhenCommandLabelReached}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCommandLabelReached
+ * @see android.media.MediaPlayer2.EventCallback#onCommandLabelReached
* @hide
*/
public static final int CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED = 1003;
@@ -2200,7 +2096,6 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
CALL_COMPLETED_SET_NEXT_DATA_SOURCE,
CALL_COMPLETED_SET_NEXT_DATA_SOURCES,
CALL_COMPLETED_SET_PLAYBACK_PARAMS,
- CALL_COMPLETED_SET_PLAYBACK_SPEED,
CALL_COMPLETED_SET_PLAYER_VOLUME,
CALL_COMPLETED_SET_SURFACE,
CALL_COMPLETED_SET_SYNC_PARAMS,
@@ -2213,40 +2108,46 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
public @interface CallCompleted {}
/** Status code represents that call is completed without an error.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_NO_ERROR = 0;
/** Status code represents that call is ended with an unknown error.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_ERROR_UNKNOWN = Integer.MIN_VALUE;
/** Status code represents that the player is not in valid state for the operation.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_INVALID_OPERATION = 1;
/** Status code represents that the argument is illegal.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_BAD_VALUE = 2;
/** Status code represents that the operation is not allowed.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_PERMISSION_DENIED = 3;
/** Status code represents a file or network related operation error.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
public static final int CALL_STATUS_ERROR_IO = 4;
+ /** Status code represents that the call has been skipped. For example, a {@link #seekTo}
+ * request may be skipped if it is followed by another {@link #seekTo} request.
+ * @see EventCallback#onCallCompleted
+ */
+ public static final int CALL_STATUS_SKIPPED = 5;
+
/** Status code represents that DRM operation is called before preparing a DRM scheme through
* {@link #prepareDrm}.
- * @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted
+ * @see android.media.MediaPlayer2.EventCallback#onCallCompleted
*/
- public static final int CALL_STATUS_NO_DRM_SCHEME = 5;
+ public static final int CALL_STATUS_NO_DRM_SCHEME = 6;
/**
* @hide
@@ -2258,6 +2159,7 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
CALL_STATUS_BAD_VALUE,
CALL_STATUS_PERMISSION_DENIED,
CALL_STATUS_ERROR_IO,
+ CALL_STATUS_SKIPPED,
CALL_STATUS_NO_DRM_SCHEME})
@Retention(RetentionPolicy.SOURCE)
public @interface CallStatus {}
diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java
index 56423fda0404..dccfd7a87ba7 100644
--- a/media/java/android/media/MediaPlayer2Impl.java
+++ b/media/java/android/media/MediaPlayer2Impl.java
@@ -97,7 +97,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
private long mNativeSurfaceTexture; // accessed by native methods
private int mListenerContext; // accessed by native methods
private SurfaceHolder mSurfaceHolder;
- private EventHandler mEventHandler;
private PowerManager.WakeLock mWakeLock = null;
private boolean mScreenOnWhilePlaying;
private boolean mStayAwake;
@@ -135,7 +134,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
//--- guarded by |mDrmLock| end
private HandlerThread mHandlerThread;
- private final Handler mTaskHandler;
+ private final TaskHandler mTaskHandler;
private final Object mTaskLock = new Object();
@GuardedBy("mTaskLock")
private final List<Task> mPendingTasks = new LinkedList<>();
@@ -149,19 +148,10 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* result in an exception.</p>
*/
public MediaPlayer2Impl() {
- Looper looper;
- if ((looper = Looper.myLooper()) != null) {
- mEventHandler = new EventHandler(this, looper);
- } else if ((looper = Looper.getMainLooper()) != null) {
- mEventHandler = new EventHandler(this, looper);
- } else {
- mEventHandler = null;
- }
-
mHandlerThread = new HandlerThread("MediaPlayer2TaskThread");
mHandlerThread.start();
- looper = mHandlerThread.getLooper();
- mTaskHandler = new Handler(looper);
+ Looper looper = mHandlerThread.getLooper();
+ mTaskHandler = new TaskHandler(this, looper);
mTimeProvider = new TimeProvider(this);
mOpenSubtitleSources = new Vector<InputStream>();
@@ -173,6 +163,11 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
native_setup(new WeakReference<MediaPlayer2Impl>(this));
}
+ @Override
+ public MediaPlayerBase getMediaPlayerBase() {
+ return null;
+ }
+
/**
* Releases the resources held by this {@code MediaPlayer2} object.
*
@@ -208,8 +203,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* playback will continue from where it was paused. If playback had
* been stopped, or never started before, playback will start at the
* beginning.
- *
- * @throws IllegalStateException if it is called in an invalid state
*/
@Override
public void play() {
@@ -231,8 +224,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* call prepare(). For streams, you should call prepare(),
* which returns immediately, rather than blocking until enough data has been
* buffered.
- *
- * @throws IllegalStateException if it is called in an invalid state
*/
@Override
public void prepare() {
@@ -248,9 +239,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
/**
* Pauses playback. Call play() to resume.
- *
- * @throws IllegalStateException if the internal player engine has not been
- * initialized.
*/
@Override
public void pause() {
@@ -313,39 +301,11 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
@Override
- public @PlayerState int getPlayerState() {
- int mediaplayer2State = getMediaPlayer2State();
- int playerState;
- switch (mediaplayer2State) {
- case MEDIAPLAYER2_STATE_IDLE:
- playerState = PLAYER_STATE_IDLE;
- break;
- case MEDIAPLAYER2_STATE_PREPARED:
- case MEDIAPLAYER2_STATE_PAUSED:
- playerState = PLAYER_STATE_PAUSED;
- break;
- case MEDIAPLAYER2_STATE_PLAYING:
- playerState = PLAYER_STATE_PLAYING;
- break;
- case MEDIAPLAYER2_STATE_ERROR:
- default:
- playerState = PLAYER_STATE_ERROR;
- break;
- }
-
- return playerState;
+ public @MediaPlayer2State int getState() {
+ return native_getState();
}
- /**
- * Gets the current buffering state of the player.
- * During buffering, see {@link #getBufferedPosition()} for the quantifying the amount already
- * buffered.
- */
- @Override
- public @BuffState int getBufferingState() {
- // TODO: use cached state or call native function.
- return BUFFERING_STATE_UNKNOWN;
- }
+ private native int native_getState();
/**
* Sets the audio attributes for this MediaPlayer2.
@@ -384,23 +344,22 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* Sets the data source as described by a DataSourceDesc.
*
* @param dsd the descriptor of data source you want to play
- * @throws IllegalStateException if it is called in an invalid state
- * @throws NullPointerException if dsd is null
*/
@Override
public void setDataSource(@NonNull DataSourceDesc dsd) {
addTask(new Task(CALL_COMPLETED_SET_DATA_SOURCE, false) {
@Override
- void process() {
- Preconditions.checkNotNull(dsd, "the DataSourceDesc cannot be null");
- // TODO: setDataSource could update exist data source
+ void process() throws IOException {
+ Preconditions.checkArgument(dsd != null, "the DataSourceDesc cannot be null");
+ int state = getState();
+ if (state != PLAYER_STATE_ERROR && state != PLAYER_STATE_IDLE) {
+ throw new IllegalStateException("called in wrong state " + state);
+ }
+
synchronized (mSrcLock) {
mCurrentDSD = dsd;
mCurrentSrcId = mSrcIdGenerator++;
- try {
- handleDataSource(true /* isCurrent */, dsd, mCurrentSrcId);
- } catch (IOException e) {
- }
+ handleDataSource(true /* isCurrent */, dsd, mCurrentSrcId);
}
}
});
@@ -419,7 +378,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
addTask(new Task(CALL_COMPLETED_SET_NEXT_DATA_SOURCE, false) {
@Override
void process() {
- Preconditions.checkNotNull(dsd, "the DataSourceDesc cannot be null");
+ Preconditions.checkArgument(dsd != null, "the DataSourceDesc cannot be null");
synchronized (mSrcLock) {
mNextDSDs = new ArrayList<DataSourceDesc>(1);
mNextDSDs.add(dsd);
@@ -427,8 +386,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
mNextSourceState = NEXT_SOURCE_STATE_INIT;
mNextSourcePlayPending = false;
}
- int state = getMediaPlayer2State();
- if (state != MEDIAPLAYER2_STATE_IDLE) {
+ int state = getState();
+ if (state != PLAYER_STATE_IDLE) {
synchronized (mSrcLock) {
prepareNextDataSource_l();
}
@@ -465,8 +424,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
mNextSourceState = NEXT_SOURCE_STATE_INIT;
mNextSourcePlayPending = false;
}
- int state = getMediaPlayer2State();
- if (state != MEDIAPLAYER2_STATE_IDLE) {
+ int state = getState();
+ if (state != PLAYER_STATE_IDLE) {
synchronized (mSrcLock) {
prepareNextDataSource_l();
}
@@ -500,46 +459,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
private native void setLooping(boolean looping);
/**
- * Sets the playback speed.
- * A value of 1.0f is the default playback value.
- * A negative value indicates reverse playback, check {@link #isReversePlaybackSupported()}
- * before using negative values.<br>
- * After changing the playback speed, it is recommended to query the actual speed supported
- * by the player, see {@link #getPlaybackSpeed()}.
- * @param speed the desired playback speed
- */
- @Override
- public void setPlaybackSpeed(float speed) {
- addTask(new Task(CALL_COMPLETED_SET_PLAYBACK_SPEED, false) {
- @Override
- void process() {
- _setPlaybackParams(getPlaybackParams().setSpeed(speed));
- }
- });
- }
-
- /**
- * Returns the actual playback speed to be used by the player when playing.
- * Note that it may differ from the speed set in {@link #setPlaybackSpeed(float)}.
- * @return the actual playback speed
- */
- @Override
- public float getPlaybackSpeed() {
- return getPlaybackParams().getSpeed();
- }
-
- /**
- * Indicates whether reverse playback is supported.
- * Reverse playback is indicated by negative playback speeds, see
- * {@link #setPlaybackSpeed(float)}.
- * @return true if reverse playback is supported.
- */
- @Override
- public boolean isReversePlaybackSupported() {
- return false;
- }
-
- /**
* Sets the volume of the audio of the media to play, expressed as a linear multiplier
* on the audio samples.
* Note that this volume is specific to the player, and is separate from stream volume
@@ -579,25 +498,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
return 1.0f;
}
- /**
- * Adds a callback to be notified of events for this player.
- * @param e the {@link Executor} to be used for the events.
- * @param cb the callback to receive the events.
- */
- @Override
- public void registerPlayerEventCallback(@NonNull Executor e,
- @NonNull PlayerEventCallback cb) {
- }
-
- /**
- * Removes a previously registered callback for player events
- * @param cb the callback to remove
- */
- @Override
- public void unregisterPlayerEventCallback(@NonNull PlayerEventCallback cb) {
- }
-
-
private static final int NEXT_SOURCE_STATE_ERROR = -1;
private static final int NEXT_SOURCE_STATE_INIT = 0;
private static final int NEXT_SOURCE_STATE_PREPARING = 1;
@@ -666,7 +566,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
@Override
void process() {
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onCommandLabelReached(
MediaPlayer2Impl.this, label));
}
@@ -1016,13 +916,13 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
mNextSourceState = NEXT_SOURCE_STATE_PREPARING;
handleDataSource(false /* isCurrent */, mNextDSDs.get(0), mNextSrcId);
} catch (Exception e) {
- Message msg2 = mEventHandler.obtainMessage(
+ Message msg2 = mTaskHandler.obtainMessage(
MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, MEDIA_ERROR_UNSUPPORTED, null);
final long nextSrcId = mNextSrcId;
- mEventHandler.post(new Runnable() {
+ mTaskHandler.post(new Runnable() {
@Override
public void run() {
- mEventHandler.handleMessage(msg2, nextSrcId);
+ mTaskHandler.handleMessage(msg2, nextSrcId);
}
});
}
@@ -1049,12 +949,12 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
try {
nativePlayNextDataSource(srcId);
} catch (Exception e) {
- Message msg2 = mEventHandler.obtainMessage(
+ Message msg2 = mTaskHandler.obtainMessage(
MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, MEDIA_ERROR_UNSUPPORTED, null);
- mEventHandler.post(new Runnable() {
+ mTaskHandler.post(new Runnable() {
@Override
public void run() {
- mEventHandler.handleMessage(msg2, srcId);
+ mTaskHandler.handleMessage(msg2, srcId);
}
});
}
@@ -1080,20 +980,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
private native int _getAudioStreamType() throws IllegalStateException;
- /**
- * Stops playback after playback has been started or paused.
- *
- * @throws IllegalStateException if the internal player engine has not been
- * initialized.
- * #hide
- */
- @Override
- public void stop() {
- stayAwake(false);
- _stop();
- }
-
- private native void _stop() throws IllegalStateException;
//--------------------------------------------------------------------------
// Explicit Routing
@@ -1191,7 +1077,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
enableNativeRoutingCallbacksLocked(true);
mRoutingChangeListeners.put(
listener, new NativeRoutingEventHandlerDelegate(this, listener,
- handler != null ? handler : mEventHandler));
+ handler != null ? handler : mTaskHandler));
}
}
}
@@ -1305,9 +1191,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
*
* @return the width of the video, or 0 if there is no video,
* no display surface was set, or the width has not been determined
- * yet. The {@code MediaPlayer2EventCallback} can be registered via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)} to provide a
- * notification {@code MediaPlayer2EventCallback.onVideoSizeChanged} when the width
+ * yet. The {@code EventCallback} can be registered via
+ * {@link #setEventCallback(Executor, EventCallback)} to provide a
+ * notification {@code EventCallback.onVideoSizeChanged} when the width
* is available.
*/
@Override
@@ -1318,9 +1204,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
*
* @return the height of the video, or 0 if there is no video,
* no display surface was set, or the height has not been determined
- * yet. The {@code MediaPlayer2EventCallback} can be registered via
- * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)} to provide a
- * notification {@code MediaPlayer2EventCallback.onVideoSizeChanged} when the height
+ * yet. The {@code EventCallback} can be registered via
+ * {@link #setEventCallback(Executor, EventCallback)} to provide a
+ * notification {@code EventCallback.onVideoSizeChanged} when the height
* is available.
*/
@Override
@@ -1355,13 +1241,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
@Override
public native boolean isPlaying();
- @Override
- public @MediaPlayer2State int getMediaPlayer2State() {
- return native_getMediaPlayer2State();
- }
-
- private native int native_getMediaPlayer2State();
-
/**
* Gets the current buffering management params used by the source component.
* Calling it only after {@code setDataSource} has been called.
@@ -1395,7 +1274,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
addTask(new Task(CALL_COMPLETED_SET_BUFFERING_PARAMS, false) {
@Override
void process() {
- Preconditions.checkNotNull(params, "the BufferingParams cannot be null");
+ Preconditions.checkArgument(params != null, "the BufferingParams cannot be null");
_setBufferingParams(params);
}
});
@@ -1459,7 +1338,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
addTask(new Task(CALL_COMPLETED_SET_PLAYBACK_PARAMS, false) {
@Override
void process() {
- Preconditions.checkNotNull(params, "the PlaybackParams cannot be null");
+ Preconditions.checkArgument(params != null, "the PlaybackParams cannot be null");
_setPlaybackParams(params);
}
});
@@ -1492,7 +1371,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
addTask(new Task(CALL_COMPLETED_SET_SYNC_PARAMS, false) {
@Override
void process() {
- Preconditions.checkNotNull(params, "the SyncParams cannot be null");
+ Preconditions.checkArgument(params != null, "the SyncParams cannot be null");
_setSyncParams(params);
}
});
@@ -1722,8 +1601,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
stayAwake(false);
_reset();
// make sure none of the listeners get called anymore
- if (mEventHandler != null) {
- mEventHandler.removeCallbacksAndMessages(null);
+ if (mTaskHandler != null) {
+ mTaskHandler.removeCallbacksAndMessages(null);
}
synchronized (mIndexTrackPairs) {
@@ -2148,9 +2027,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
private int mSelectedSubtitleTrackIndex = -1;
private Vector<InputStream> mOpenSubtitleSources;
- private OnSubtitleDataListener mSubtitleDataListener = new OnSubtitleDataListener() {
+ private EventCallback mSubtitleDataCallback = new EventCallback() {
@Override
- public void onSubtitleData(MediaPlayer2 mp, SubtitleData data) {
+ public void onSubtitleData(MediaPlayer2 mp, DataSourceDesc dsd, SubtitleData data) {
int index = data.getTrackIndex();
synchronized (mIndexTrackPairs) {
for (Pair<Integer, SubtitleTrack> p : mIndexTrackPairs) {
@@ -2174,7 +2053,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
mSelectedSubtitleTrackIndex = -1;
}
- setOnSubtitleDataListener(null);
+ unregisterEventCallback(mSubtitleDataCallback);
if (track == null) {
return;
}
@@ -2194,7 +2073,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
selectOrDeselectInbandTrack(mSelectedSubtitleTrackIndex, true);
} catch (IllegalStateException e) {
}
- setOnSubtitleDataListener(mSubtitleDataListener);
+ final Executor executor = (runnable) -> mTaskHandler.post(runnable);
+ registerEventCallback(executor, mSubtitleDataCallback);
}
// no need to select out-of-band tracks
}
@@ -2256,9 +2136,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
public void run() {
int res = addTrack();
- if (mEventHandler != null) {
- Message m = mEventHandler.obtainMessage(MEDIA_INFO, res, 0, null);
- mEventHandler.sendMessage(m);
+ if (mTaskHandler != null) {
+ Message m = mTaskHandler.obtainMessage(MEDIA_INFO, res, 0, null);
+ mTaskHandler.sendMessage(m);
}
thread.getLooper().quitSafely();
}
@@ -2446,7 +2326,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
if (!mSubtitleController.hasRendererFor(fFormat)) {
// test and add not atomic
Context context = ActivityThread.currentApplication();
- mSubtitleController.registerRenderer(new SRTRenderer(context, mEventHandler));
+ mSubtitleController.registerRenderer(new SRTRenderer(context, mTaskHandler));
}
final SubtitleTrack track = mSubtitleController.addTrack(fFormat);
synchronized (mIndexTrackPairs) {
@@ -2499,9 +2379,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
public void run() {
int res = addTrack();
- if (mEventHandler != null) {
- Message m = mEventHandler.obtainMessage(MEDIA_INFO, res, 0, null);
- mEventHandler.sendMessage(m);
+ if (mTaskHandler != null) {
+ Message m = mTaskHandler.obtainMessage(MEDIA_INFO, res, 0, null);
+ mTaskHandler.sendMessage(m);
}
thread.getLooper().quitSafely();
}
@@ -2717,7 +2597,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
mTimeProvider.close();
mTimeProvider = null;
}
- mOnSubtitleDataListener = null;
// Modular DRM clean up
mOnDrmConfigHelper = null;
@@ -2764,10 +2643,10 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
return mTimeProvider;
}
- private class EventHandler extends Handler {
+ private class TaskHandler extends Handler {
private MediaPlayer2Impl mMediaPlayer;
- public EventHandler(MediaPlayer2Impl mp, Looper looper) {
+ public TaskHandler(MediaPlayer2Impl mp, Looper looper) {
super(looper);
mMediaPlayer = mp;
}
@@ -2820,7 +2699,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
if (dsd != null) {
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onInfo(
mMediaPlayer, dsd, MEDIA_INFO_PREPARED, 0));
}
@@ -2882,7 +2761,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onInfo(
mMediaPlayer, dsd, MEDIA_INFO_PLAYBACK_COMPLETE, 0));
}
@@ -2916,7 +2795,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
synchronized (mEventCbLock) {
if (srcId == mCurrentSrcId) {
mBufferedPercentageCurrent.set(percent);
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onInfo(
mMediaPlayer, mCurrentDSD, MEDIA_INFO_BUFFERING_UPDATE,
percent));
@@ -2924,7 +2803,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
} else if (srcId == mNextSrcId && !mNextDSDs.isEmpty()) {
mBufferedPercentageNext.set(percent);
DataSourceDesc nextDSD = mNextDSDs.get(0);
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onInfo(
mMediaPlayer, nextDSD, MEDIA_INFO_BUFFERING_UPDATE,
percent));
@@ -2962,7 +2841,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
final int width = msg.arg1;
final int height = msg.arg2;
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onVideoSizeChanged(
mMediaPlayer, mCurrentDSD, width, height));
}
@@ -2974,7 +2853,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
{
Log.e(TAG, "Error (" + msg.arg1 + "," + msg.arg2 + ")");
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onError(
mMediaPlayer, mCurrentDSD, what, extra));
cb.first.execute(() -> cb.second.onInfo(
@@ -3027,7 +2906,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onInfo(
mMediaPlayer, mCurrentDSD, what, extra));
}
@@ -3057,8 +2936,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
- cb.first.execute(() -> cb.second.onTimedText(mMediaPlayer, mCurrentDSD, text));
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
+ cb.first.execute(() -> cb.second.onTimedText(
+ mMediaPlayer, mCurrentDSD, text));
}
}
return;
@@ -3066,15 +2946,16 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
case MEDIA_SUBTITLE_DATA:
{
- OnSubtitleDataListener onSubtitleDataListener = mOnSubtitleDataListener;
- if (onSubtitleDataListener == null) {
- return;
- }
if (msg.obj instanceof Parcel) {
Parcel parcel = (Parcel) msg.obj;
SubtitleData data = new SubtitleData(parcel);
parcel.recycle();
- onSubtitleDataListener.onSubtitleData(mMediaPlayer, data);
+ synchronized (mEventCbLock) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
+ cb.first.execute(() -> cb.second.onSubtitleData(
+ mMediaPlayer, mCurrentDSD, data));
+ }
+ }
}
return;
}
@@ -3091,7 +2972,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onTimedMetaDataAvailable(
mMediaPlayer, mCurrentDSD, data));
}
@@ -3127,7 +3008,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
/*
* Called from native code when an interesting event happens. This method
- * just uses the EventHandler system to post the event back to the main app thread.
+ * just uses the TaskHandler system to post the event back to the main app thread.
* We use a weak reference to the original MediaPlayer2 object so that the native
* code is safe from the object disappearing from underneath it. (This is
* the cookie passed to native_setup().)
@@ -3156,7 +3037,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
case MEDIA_DRM_INFO:
// We need to derive mDrmInfoImpl before prepare() returns so processing it here
- // before the notification is sent to EventHandler below. EventHandler runs in the
+ // before the notification is sent to TaskHandler below. TaskHandler runs in the
// notification looper so its handleMessage might process the event after prepare()
// has returned.
Log.v(TAG, "postEventFromNative MEDIA_DRM_INFO");
@@ -3183,21 +3064,21 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
- if (mp.mEventHandler != null) {
- Message m = mp.mEventHandler.obtainMessage(what, arg1, arg2, obj);
+ if (mp.mTaskHandler != null) {
+ Message m = mp.mTaskHandler.obtainMessage(what, arg1, arg2, obj);
- mp.mEventHandler.post(new Runnable() {
+ mp.mTaskHandler.post(new Runnable() {
@Override
public void run() {
- mp.mEventHandler.handleMessage(m, srcId);
+ mp.mTaskHandler.handleMessage(m, srcId);
}
});
}
}
private final Object mEventCbLock = new Object();
- private ArrayList<Pair<Executor, MediaPlayer2EventCallback> > mEventCallbackRecords
- = new ArrayList<Pair<Executor, MediaPlayer2EventCallback> >();
+ private ArrayList<Pair<Executor, EventCallback> > mEventCallbackRecords
+ = new ArrayList<Pair<Executor, EventCallback> >();
/**
* Register a callback to be invoked when the media source is ready
@@ -3207,14 +3088,14 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @param executor the executor through which the callback should be invoked
*/
@Override
- public void setMediaPlayer2EventCallback(@NonNull @CallbackExecutor Executor executor,
- @NonNull MediaPlayer2EventCallback eventCallback) {
+ public void registerEventCallback(@NonNull @CallbackExecutor Executor executor,
+ @NonNull EventCallback eventCallback) {
if (eventCallback == null) {
- throw new IllegalArgumentException("Illegal null MediaPlayer2EventCallback");
+ throw new IllegalArgumentException("Illegal null EventCallback");
}
if (executor == null) {
throw new IllegalArgumentException(
- "Illegal null Executor for the MediaPlayer2EventCallback");
+ "Illegal null Executor for the EventCallback");
}
synchronized (mEventCbLock) {
mEventCallbackRecords.add(new Pair(executor, eventCallback));
@@ -3222,30 +3103,19 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
/**
- * Clears the {@link MediaPlayer2EventCallback}.
+ * Clears the {@link EventCallback}.
*/
@Override
- public void clearMediaPlayer2EventCallback() {
+ public void unregisterEventCallback(EventCallback eventCallback) {
synchronized (mEventCbLock) {
- mEventCallbackRecords.clear();
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
+ if (cb.second == eventCallback) {
+ mEventCallbackRecords.remove(cb);
+ }
+ }
}
}
- /**
- * Register a callback to be invoked when a track has data available.
- *
- * @param listener the callback that will be run
- *
- * @hide
- */
- @Override
- public void setOnSubtitleDataListener(OnSubtitleDataListener listener) {
- mOnSubtitleDataListener = listener;
- }
-
- private OnSubtitleDataListener mOnSubtitleDataListener;
-
-
// Modular DRM begin
/**
@@ -3281,11 +3151,11 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
public void setDrmEventCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull DrmEventCallback eventCallback) {
if (eventCallback == null) {
- throw new IllegalArgumentException("Illegal null MediaPlayer2EventCallback");
+ throw new IllegalArgumentException("Illegal null EventCallback");
}
if (executor == null) {
throw new IllegalArgumentException(
- "Illegal null Executor for the MediaPlayer2EventCallback");
+ "Illegal null Executor for the EventCallback");
}
synchronized (mDrmEventCbLock) {
mDrmEventCallbackRecords.add(new Pair(executor, eventCallback));
@@ -4749,7 +4619,12 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
public void run() {
int status = CALL_STATUS_NO_ERROR;
try {
- process();
+ if (mMediaCallType != CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED
+ && getState() == PLAYER_STATE_ERROR) {
+ status = CALL_STATUS_INVALID_OPERATION;
+ } else {
+ process();
+ }
} catch (IllegalStateException e) {
status = CALL_STATUS_INVALID_OPERATION;
} catch (IllegalArgumentException e) {
@@ -4760,6 +4635,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
status = CALL_STATUS_ERROR_IO;
} catch (NoDrmSchemeException e) {
status = CALL_STATUS_NO_DRM_SCHEME;
+ } catch (CommandSkippedException e) {
+ status = CALL_STATUS_SKIPPED;
} catch (Exception e) {
status = CALL_STATUS_ERROR_UNKNOWN;
}
@@ -4786,11 +4663,17 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
return;
}
synchronized (mEventCbLock) {
- for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
+ for (Pair<Executor, EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onCallCompleted(
MediaPlayer2Impl.this, mDSD, mMediaCallType, status));
}
}
}
};
+
+ private final class CommandSkippedException extends RuntimeException {
+ public CommandSkippedException(String detailMessage) {
+ super(detailMessage);
+ }
+ };
}
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 70ab8632a889..d5afd9ad9608 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -610,7 +610,9 @@ public class MediaRouter {
&& mSelectedRoute != mBluetoothA2dpRoute)) {
return;
}
- Log.v(TAG, "onRestoreRoute() : route=" + mSelectedRoute);
+ if (DEBUG) {
+ Log.d(TAG, "onRestoreRoute() : route=" + mSelectedRoute);
+ }
mSelectedRoute.select();
}
});
@@ -965,19 +967,6 @@ public class MediaRouter {
&& (route == btRoute || route == sStatic.mDefaultAudioVideo)) {
try {
sStatic.mAudioService.setBluetoothA2dpOn(route == btRoute);
- // TODO: Remove the following logging when no longer needed.
- if (route != btRoute) {
- StackTraceElement[] callStack = Thread.currentThread().getStackTrace();
- StringBuffer sb = new StringBuffer();
- // callStack[3] is the caller of this method.
- for (int i = 3; i < callStack.length; i++) {
- StackTraceElement caller = callStack[i];
- sb.append(caller.getClassName() + "." + caller.getMethodName()
- + ":" + caller.getLineNumber()).append(" ");
- }
- Log.w(TAG, "Default route is selected while a BT route is available: pkgName="
- + sStatic.mPackageName + ", callers=" + sb.toString());
- }
} catch (RemoteException e) {
Log.e(TAG, "Error changing Bluetooth A2DP state", e);
}
@@ -1064,7 +1053,9 @@ public class MediaRouter {
}
static void addRouteStatic(RouteInfo info) {
- Log.v(TAG, "Adding route: " + info);
+ if (DEBUG) {
+ Log.d(TAG, "Adding route: " + info);
+ }
final RouteCategory cat = info.getCategory();
if (!sStatic.mCategories.contains(cat)) {
sStatic.mCategories.add(cat);
@@ -1119,7 +1110,9 @@ public class MediaRouter {
}
static void removeRouteStatic(RouteInfo info) {
- Log.v(TAG, "Removing route: " + info);
+ if (DEBUG) {
+ Log.d(TAG, "Removing route: " + info);
+ }
if (sStatic.mRoutes.remove(info)) {
final RouteCategory removingCat = info.getCategory();
final int count = sStatic.mRoutes.size();
diff --git a/media/java/android/media/MediaTimestamp.java b/media/java/android/media/MediaTimestamp.java
index dd43b4e001b0..e079a8e3a22b 100644
--- a/media/java/android/media/MediaTimestamp.java
+++ b/media/java/android/media/MediaTimestamp.java
@@ -51,8 +51,18 @@ public final class MediaTimestamp
/**
* Get the {@link java.lang.System#nanoTime system time} corresponding to the media time
* in nanoseconds.
+ * @deprecated use {@link #getAnchorSystemNanoTime} instead.
*/
+ @Deprecated
public long getAnchorSytemNanoTime() {
+ return getAnchorSystemNanoTime();
+ }
+
+ /**
+ * Get the {@link java.lang.System#nanoTime system time} corresponding to the media time
+ * in nanoseconds.
+ */
+ public long getAnchorSystemNanoTime() {
return nanoTime;
}
diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java
index fefa1ede849e..0dddaf56ed4c 100644
--- a/media/java/android/media/RingtoneManager.java
+++ b/media/java/android/media/RingtoneManager.java
@@ -952,7 +952,8 @@ public class RingtoneManager {
// Find a filename. Throws FileNotFoundException if none can be found.
final File outFile = Utils.getUniqueExternalFile(mContext, subdirectory,
- Utils.getFileDisplayNameFromUri(mContext, fileUri), mimeType);
+ FileUtils.buildValidFatFilename(Utils.getFileDisplayNameFromUri(mContext, fileUri)),
+ mimeType);
// Copy contents to external ringtone storage. Throws IOException if the copy fails.
try (final InputStream input = mContext.getContentResolver().openInputStream(fileUri);
diff --git a/media/java/android/media/SyncParams.java b/media/java/android/media/SyncParams.java
index 9f6bfe14bd61..5d1575aa44bf 100644
--- a/media/java/android/media/SyncParams.java
+++ b/media/java/android/media/SyncParams.java
@@ -86,7 +86,7 @@ public final class SyncParams {
/**
* Use audio track for sync source. This requires audio data and an audio track.
*
- * @see AudioTrack#getTimeStamp
+ * @see android.media.AudioTrack#getTimestamp(android.media.AudioTimestamp)
*/
public static final int SYNC_SOURCE_AUDIO = 2;
@@ -137,9 +137,6 @@ public final class SyncParams {
* This will make audio play faster or slower as required by the sync source
* without changing its pitch, as long as it is supported for the playback
* rate.
- *
- * @see MediaSync#PLAYBACK_RATE_AUDIO_MODE_STRETCH
- * @see MediaPlayer#PLAYBACK_RATE_AUDIO_MODE_STRETCH
*/
public static final int AUDIO_ADJUST_MODE_STRETCH = 1;
@@ -149,9 +146,6 @@ public final class SyncParams {
* This will make audio play faster or slower as required by the sync source
* by changing its pitch (making it lower to play slower, and higher to play
* faster.)
- *
- * @see MediaSync#PLAYBACK_RATE_AUDIO_MODE_RESAMPLE
- * @see MediaPlayer#PLAYBACK_RATE_AUDIO_MODE_RESAMPLE
*/
public static final int AUDIO_ADJUST_MODE_RESAMPLE = 2;
diff --git a/media/java/android/media/TimedMetaData.java b/media/java/android/media/TimedMetaData.java
index 0ab52d7322c2..03c877013ead 100644
--- a/media/java/android/media/TimedMetaData.java
+++ b/media/java/android/media/TimedMetaData.java
@@ -26,7 +26,7 @@ import android.os.Parcel;
* <li> raw uninterpreted byte-array extracted directly from the container. </li>
* </ul>
*
- * @see MediaPlayer#setOnTimedMetaDataAvailableListener(android.media.MediaPlayer.OnTimedMetaDataListener)
+ * @see MediaPlayer#setOnTimedMetaDataAvailableListener(android.media.MediaPlayer.OnTimedMetaDataAvailableListener)
*/
public final class TimedMetaData {
private static final String TAG = "TimedMetaData";
diff --git a/media/java/android/media/midi/MidiDevice.java b/media/java/android/media/midi/MidiDevice.java
index a99573692664..6096355ddb05 100644
--- a/media/java/android/media/midi/MidiDevice.java
+++ b/media/java/android/media/midi/MidiDevice.java
@@ -37,30 +37,17 @@ import java.util.HashSet;
* Instances of this class are created by {@link MidiManager#openDevice}.
*/
public final class MidiDevice implements Closeable {
- static {
- System.loadLibrary("media_jni");
- }
-
private static final String TAG = "MidiDevice";
- private final MidiDeviceInfo mDeviceInfo;
+ private final MidiDeviceInfo mDeviceInfo; // accessed from native code
private final IMidiDeviceServer mDeviceServer;
+ private final IBinder mDeviceServerBinder; // accessed from native code
private final IMidiManager mMidiManager;
private final IBinder mClientToken;
private final IBinder mDeviceToken;
- private boolean mIsDeviceClosed;
+ private boolean mIsDeviceClosed; // accessed from native code
- // Native API Helpers
- /**
- * Keep a static list of MidiDevice objects that are mirrorToNative()'d so they
- * don't get inadvertantly garbage collected.
- */
- private static HashSet<MidiDevice> mMirroredDevices = new HashSet<MidiDevice>();
-
- /**
- * If this device is mirrorToNatived(), this is the native device handler.
- */
- private long mNativeHandle;
+ private long mNativeHandle; // accessed from native code
private final CloseGuard mGuard = CloseGuard.get();
@@ -118,6 +105,7 @@ public final class MidiDevice implements Closeable {
IMidiManager midiManager, IBinder clientToken, IBinder deviceToken) {
mDeviceInfo = deviceInfo;
mDeviceServer = server;
+ mDeviceServerBinder = mDeviceServer.asBinder();
mMidiManager = midiManager;
mClientToken = clientToken;
mDeviceToken = deviceToken;
@@ -230,50 +218,15 @@ public final class MidiDevice implements Closeable {
}
}
- /**
- * Makes Midi Device available to the Native API
- * @hide
- */
- public long mirrorToNative() throws IOException {
- if (mIsDeviceClosed || mNativeHandle != 0) {
- return 0;
- }
-
- mNativeHandle = native_mirrorToNative(mDeviceServer.asBinder(), mDeviceInfo.getId());
- if (mNativeHandle == 0) {
- throw new IOException("Failed mirroring to native");
- }
-
- synchronized (mMirroredDevices) {
- mMirroredDevices.add(this);
- }
- return mNativeHandle;
- }
-
- /**
- * Makes Midi Device no longer available to the Native API
- * @hide
- */
- public void removeFromNative() {
- if (mNativeHandle == 0) {
- return;
- }
-
- synchronized (mGuard) {
- native_removeFromNative(mNativeHandle);
- mNativeHandle = 0;
- }
-
- synchronized (mMirroredDevices) {
- mMirroredDevices.remove(this);
- }
- }
-
@Override
public void close() throws IOException {
synchronized (mGuard) {
- if (!mIsDeviceClosed) {
- removeFromNative();
+ // What if there is a native reference to this?
+ if (mNativeHandle != 0) {
+ Log.w(TAG, "MidiDevice#close() called while there is an outstanding native client 0x"
+ + Long.toHexString(mNativeHandle));
+ }
+ if (!mIsDeviceClosed && mNativeHandle == 0) {
mGuard.close();
mIsDeviceClosed = true;
try {
@@ -302,7 +255,4 @@ public final class MidiDevice implements Closeable {
public String toString() {
return ("MidiDevice: " + mDeviceInfo.toString());
}
-
- private native long native_mirrorToNative(IBinder deviceServerBinder, int id);
- private native void native_removeFromNative(long deviceHandle);
}
diff --git a/media/java/android/media/midi/MidiDeviceInfo.java b/media/java/android/media/midi/MidiDeviceInfo.java
index 5fd9006db97c..ab8af2a87092 100644
--- a/media/java/android/media/midi/MidiDeviceInfo.java
+++ b/media/java/android/media/midi/MidiDeviceInfo.java
@@ -190,7 +190,7 @@ public final class MidiDeviceInfo implements Parcelable {
}
private final int mType; // USB or virtual
- private final int mId; // unique ID generated by MidiService
+ private final int mId; // unique ID generated by MidiService. Accessed from native code.
private final int mInputPortCount;
private final int mOutputPortCount;
private final String[] mInputPortNames;
diff --git a/media/java/android/media/soundtrigger/SoundTriggerManager.java b/media/java/android/media/soundtrigger/SoundTriggerManager.java
index c9ec7526fd6a..107ce8ed6d04 100644
--- a/media/java/android/media/soundtrigger/SoundTriggerManager.java
+++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java
@@ -262,25 +262,6 @@ public final class SoundTriggerManager {
}
/**
- * Starts recognition on the given model id. All events from the model will be sent to the
- * PendingIntent.
- * @hide
- */
- @RequiresPermission(android.Manifest.permission.MANAGE_SOUND_TRIGGER)
- public int startRecognition(UUID soundModelId, PendingIntent callbackIntent,
- RecognitionConfig config) {
- if (soundModelId == null || callbackIntent == null || config == null) {
- return STATUS_ERROR;
- }
- try {
- return mSoundTriggerService.startRecognitionForIntent(new ParcelUuid(soundModelId),
- callbackIntent, config);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Starts recognition for the given model id. All events from the model will be sent to the
* service.
*
@@ -324,7 +305,7 @@ public final class SoundTriggerManager {
return STATUS_ERROR;
}
try {
- return mSoundTriggerService.stopRecognitionForIntent(new ParcelUuid(soundModelId));
+ return mSoundTriggerService.stopRecognitionForService(new ParcelUuid(soundModelId));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java
index df87e0f28cd9..07cfbda7ac2b 100644
--- a/media/java/android/media/tv/ITvInputSessionWrapper.java
+++ b/media/java/android/media/tv/ITvInputSessionWrapper.java
@@ -367,7 +367,7 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
if (mTvInputSessionImpl == null) {
// The session has been finished.
finishInputEvent(event, false);
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 3bbc2c4e2304..21c58b377e94 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -1098,6 +1098,17 @@ public final class TvContract {
* @see #COLUMN_REVIEW_RATING_STYLE
*/
String COLUMN_REVIEW_RATING = "review_rating";
+
+ /**
+ * The series ID of this TV program for episodic TV shows.
+ *
+ * <p>This is used to indicate the series ID. Programs in the same series share a series ID.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: TEXT
+ */
+ String COLUMN_SERIES_ID = "series_id";
}
/**
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index 143182f83ace..ec2d9bab5107 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -888,6 +888,8 @@ public final class TvInputManager {
if (token != null) {
session = new Session(token, channel, mService, mUserId, seq,
mSessionCallbackRecordMap);
+ } else {
+ mSessionCallbackRecordMap.delete(seq);
}
record.postSessionCreated(session);
}
@@ -2487,7 +2489,7 @@ public final class TvInputManager {
}
}
synchronized (mSessionCallbackRecordMap) {
- mSessionCallbackRecordMap.remove(mSeq);
+ mSessionCallbackRecordMap.delete(mSeq);
}
}
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 95c3c41c96d5..6d90575871c2 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -25,7 +25,6 @@ cc_library_shared {
"android_mtp_MtpDatabase.cpp",
"android_mtp_MtpDevice.cpp",
"android_mtp_MtpServer.cpp",
- "midi/android_media_midi_MidiDevice.cpp",
],
shared_libs: [
@@ -39,7 +38,6 @@ cc_library_shared {
"libmedia_omx",
"libmediametrics",
"libmediadrm",
- "libmidi",
"libhwui",
"libui",
"liblog",
@@ -92,9 +90,7 @@ cc_library_shared {
srcs: [
"android_media_Media2HTTPConnection.cpp",
"android_media_Media2HTTPService.cpp",
- "android_media_MediaCrypto.cpp",
"android_media_Media2DataSource.cpp",
- "android_media_MediaDrm.cpp",
"android_media_MediaPlayer2.cpp",
"android_media_SyncParams.cpp",
],
@@ -102,19 +98,25 @@ cc_library_shared {
shared_libs: [
"android.hardware.cas@1.0", // for CasManager. VNDK???
"android.hardware.cas.native@1.0", // CasManager. VNDK???
- "libandroid", // NDK
"libandroid_runtime", // ???
"libaudioclient", // for use of AudioTrack, AudioSystem. to be removed
- "liblog", // NDK
+ "libbinder",
"libdrmframework", // for FileSource, MediaHTTP
"libgui", // for VideoFrameScheduler
"libhidlallocatorutils",
"libhidlbase", // VNDK???
- "libmediandk", // NDK
"libpowermanager", // for JWakeLock. to be removed
"libutils", // Have to use shared lib to make libandroid_runtime behave correctly.
// Otherwise, AndroidRuntime::getJNIEnv() will return NULL.
+
+ // NDK or NDK-compliant
+ "libandroid",
+ "libmediandk",
+ "libnativehelper_compat_libc++",
+ "liblog",
+ "libz",
+
"libmedia",
"libmedia_omx",
"libstagefright",
@@ -126,7 +128,6 @@ cc_library_shared {
static_libs: [
"libbacktrace",
"libbase",
- "libbinder",
"libc_malloc_debug_backtrace",
"libcrypto",
"libcutils",
@@ -139,7 +140,6 @@ cc_library_shared {
"libmediametrics",
"libmediaplayer2",
"libmediautils",
- "libnativehelper",
"libnetd_client",
"libstagefright_esds",
"libstagefright_foundation",
@@ -152,7 +152,6 @@ cc_library_shared {
"libstagefright_timedtext",
"libunwindstack",
"libutilscallstack",
- "libz",
"libziparchive",
],
@@ -174,7 +173,7 @@ cc_library_shared {
"-Wunreachable-code",
],
- ldflags: ["-Wl,--exclude-libs=ALL"],
+ ldflags: ["-Wl,--exclude-libs=ALL,-error-limit=0"],
}
subdirs = [
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index c36858ad3d8e..a45aa90f5f19 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -612,8 +612,12 @@ static jint ImageReader_imageSetup(JNIEnv* env, jobject thiz, jobject image) {
Image_setBufferItem(env, image, buffer);
env->SetLongField(image, gSurfaceImageClassInfo.mTimestamp,
static_cast<jlong>(buffer->mTimestamp));
+ auto transform = buffer->mTransform;
+ if (buffer->mTransformToDisplayInverse) {
+ transform |= NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
+ }
env->SetIntField(image, gSurfaceImageClassInfo.mTransform,
- static_cast<jint>(buffer->mTransform));
+ static_cast<jint>(transform));
env->SetIntField(image, gSurfaceImageClassInfo.mScalingMode,
static_cast<jint>(buffer->mScalingMode));
diff --git a/media/jni/android_media_Media2DataSource.cpp b/media/jni/android_media_Media2DataSource.cpp
index bc3f6bd80cd8..b3434e9ab8ea 100644
--- a/media/jni/android_media_Media2DataSource.cpp
+++ b/media/jni/android_media_Media2DataSource.cpp
@@ -20,12 +20,12 @@
#include "android_media_Media2DataSource.h"
-#include "android_runtime/AndroidRuntime.h"
-#include "android_runtime/Log.h"
+#include "log/log.h"
#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include <drm/drm_framework_common.h>
+#include <mediaplayer2/JavaVMHelper.h>
#include <media/stagefright/foundation/ADebug.h>
#include <nativehelper/ScopedLocalRef.h>
@@ -56,7 +56,7 @@ JMedia2DataSource::JMedia2DataSource(JNIEnv* env, jobject source)
}
JMedia2DataSource::~JMedia2DataSource() {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
env->DeleteGlobalRef(mMedia2DataSourceObj);
env->DeleteGlobalRef(mByteArrayObj);
}
@@ -75,12 +75,12 @@ ssize_t JMedia2DataSource::readAt(off64_t offset, void *data, size_t size) {
size = kBufferSize;
}
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
jint numread = env->CallIntMethod(mMedia2DataSourceObj, mReadAtMethod,
(jlong)offset, mByteArrayObj, (jint)0, (jint)size);
if (env->ExceptionCheck()) {
ALOGW("An exception occurred in readAt()");
- LOGW_EX(env);
+ jniLogException(env, ANDROID_LOG_WARN, LOG_TAG);
env->ExceptionClear();
mJavaObjStatus = UNKNOWN_ERROR;
return -1;
@@ -117,11 +117,11 @@ status_t JMedia2DataSource::getSize(off64_t* size) {
return OK;
}
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
*size = env->CallLongMethod(mMedia2DataSourceObj, mGetSizeMethod);
if (env->ExceptionCheck()) {
ALOGW("An exception occurred in getSize()");
- LOGW_EX(env);
+ jniLogException(env, ANDROID_LOG_WARN, LOG_TAG);
env->ExceptionClear();
// After returning an error, size shouldn't be used by callers.
*size = UNKNOWN_ERROR;
@@ -142,7 +142,7 @@ status_t JMedia2DataSource::getSize(off64_t* size) {
void JMedia2DataSource::close() {
Mutex::Autolock lock(mLock);
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
env->CallVoidMethod(mMedia2DataSourceObj, mCloseMethod);
// The closed state is effectively the same as an error state.
mJavaObjStatus = UNKNOWN_ERROR;
diff --git a/media/jni/android_media_Media2HTTPConnection.cpp b/media/jni/android_media_Media2HTTPConnection.cpp
index 60176e3d238e..d02ee06dba49 100644
--- a/media/jni/android_media_Media2HTTPConnection.cpp
+++ b/media/jni/android_media_Media2HTTPConnection.cpp
@@ -18,14 +18,14 @@
#define LOG_TAG "Media2HTTPConnection-JNI"
#include <utils/Log.h>
+#include <mediaplayer2/JavaVMHelper.h>
#include <media/stagefright/foundation/ADebug.h>
#include <nativehelper/ScopedLocalRef.h>
#include "android_media_Media2HTTPConnection.h"
#include "android_util_Binder.h"
-#include "android_runtime/AndroidRuntime.h"
-#include "android_runtime/Log.h"
+#include "log/log.h"
#include "jni.h"
#include <nativehelper/JNIHelp.h>
@@ -84,7 +84,7 @@ JMedia2HTTPConnection::JMedia2HTTPConnection(JNIEnv *env, jobject thiz) {
}
JMedia2HTTPConnection::~JMedia2HTTPConnection() {
- JNIEnv *env = AndroidRuntime::getJNIEnv();
+ JNIEnv *env = JavaVMHelper::getJNIEnv();
env->DeleteGlobalRef(mMedia2HTTPConnectionObj);
env->DeleteGlobalRef(mByteArrayObj);
}
@@ -101,7 +101,7 @@ bool JMedia2HTTPConnection::connect(
}
}
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
jstring juri = env->NewStringUTF(uri);
jstring jheaders = env->NewStringUTF(tmp.string());
@@ -115,12 +115,12 @@ bool JMedia2HTTPConnection::connect(
}
void JMedia2HTTPConnection::disconnect() {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
env->CallVoidMethod(mMedia2HTTPConnectionObj, mDisconnectMethod);
}
ssize_t JMedia2HTTPConnection::readAt(off64_t offset, void *data, size_t size) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
if (size > kBufferSize) {
size = kBufferSize;
@@ -141,12 +141,12 @@ ssize_t JMedia2HTTPConnection::readAt(off64_t offset, void *data, size_t size) {
}
off64_t JMedia2HTTPConnection::getSize() {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
return (off64_t)(env->CallLongMethod(mMedia2HTTPConnectionObj, mGetSizeMethod));
}
status_t JMedia2HTTPConnection::getMIMEType(String8 *mimeType) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
jstring jmime = (jstring)env->CallObjectMethod(mMedia2HTTPConnectionObj, mGetMIMETypeMethod);
jboolean flag = env->ExceptionCheck();
if (flag) {
@@ -165,7 +165,7 @@ status_t JMedia2HTTPConnection::getMIMEType(String8 *mimeType) {
}
status_t JMedia2HTTPConnection::getUri(String8 *uri) {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
jstring juri = (jstring)env->CallObjectMethod(mMedia2HTTPConnectionObj, mGetUriMethod);
jboolean flag = env->ExceptionCheck();
if (flag) {
diff --git a/media/jni/android_media_Media2HTTPService.cpp b/media/jni/android_media_Media2HTTPService.cpp
index 382f099b7932..1c63889e2939 100644
--- a/media/jni/android_media_Media2HTTPService.cpp
+++ b/media/jni/android_media_Media2HTTPService.cpp
@@ -21,11 +21,11 @@
#include "android_media_Media2HTTPConnection.h"
#include "android_media_Media2HTTPService.h"
-#include "android_runtime/AndroidRuntime.h"
-#include "android_runtime/Log.h"
+#include "log/log.h"
#include "jni.h"
#include <nativehelper/JNIHelp.h>
+#include <mediaplayer2/JavaVMHelper.h>
#include <media/stagefright/foundation/ADebug.h>
#include <nativehelper/ScopedLocalRef.h>
@@ -46,12 +46,12 @@ JMedia2HTTPService::JMedia2HTTPService(JNIEnv *env, jobject thiz) {
}
JMedia2HTTPService::~JMedia2HTTPService() {
- JNIEnv *env = AndroidRuntime::getJNIEnv();
+ JNIEnv *env = JavaVMHelper::getJNIEnv();
env->DeleteGlobalRef(mMedia2HTTPServiceObj);
}
sp<MediaHTTPConnection> JMedia2HTTPService::makeHTTPConnection() {
- JNIEnv* env = AndroidRuntime::getJNIEnv();
+ JNIEnv* env = JavaVMHelper::getJNIEnv();
jobject media2HTTPConnectionObj =
env->CallObjectMethod(mMedia2HTTPServiceObj, mMakeHTTPConnectionMethod);
diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp
index 6546cf024ac8..426598727c89 100644
--- a/media/jni/android_media_MediaPlayer2.cpp
+++ b/media/jni/android_media_MediaPlayer2.cpp
@@ -29,6 +29,7 @@
#include <media/stagefright/Utils.h>
#include <media/stagefright/foundation/ByteUtils.h> // for FOURCC definition
#include <mediaplayer2/JAudioTrack.h>
+#include <mediaplayer2/JavaVMHelper.h>
#include <mediaplayer2/mediaplayer2.h>
#include <stdio.h>
#include <assert.h>
@@ -39,7 +40,7 @@
#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include "android/native_window_jni.h"
-#include "android_runtime/Log.h"
+#include "log/log.h"
#include "utils/Errors.h" // for status_t
#include "utils/KeyedVector.h"
#include "utils/String8.h"
@@ -184,14 +185,14 @@ JNIMediaPlayer2Listener::JNIMediaPlayer2Listener(JNIEnv* env, jobject thiz, jobj
JNIMediaPlayer2Listener::~JNIMediaPlayer2Listener()
{
// remove global references
- JNIEnv *env = AndroidRuntime::getJNIEnv();
+ JNIEnv *env = JavaVMHelper::getJNIEnv();
env->DeleteGlobalRef(mObject);
env->DeleteGlobalRef(mClass);
}
void JNIMediaPlayer2Listener::notify(int64_t srcId, int msg, int ext1, int ext2, const Parcel *obj)
{
- JNIEnv *env = AndroidRuntime::getJNIEnv();
+ JNIEnv *env = JavaVMHelper::getJNIEnv();
if (obj && obj->dataSize() > 0) {
jobject jParcel = createJavaParcelObject(env);
if (jParcel != NULL) {
@@ -207,7 +208,7 @@ void JNIMediaPlayer2Listener::notify(int64_t srcId, int msg, int ext1, int ext2,
}
if (env->ExceptionCheck()) {
ALOGW("An exception occurred while notifying an event.");
- LOGW_EX(env);
+ jniLogException(env, ANDROID_LOG_WARN, LOG_TAG);
env->ExceptionClear();
}
}
@@ -568,18 +569,6 @@ android_media_MediaPlayer2_start(JNIEnv *env, jobject thiz)
}
static void
-android_media_MediaPlayer2_stop(JNIEnv *env, jobject thiz)
-{
- ALOGV("stop");
- sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
- if (mp == NULL ) {
- jniThrowException(env, "java/lang/IllegalStateException", NULL);
- return;
- }
- process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
-}
-
-static void
android_media_MediaPlayer2_pause(JNIEnv *env, jobject thiz)
{
ALOGV("pause");
@@ -786,13 +775,13 @@ android_media_MediaPlayer2_notifyAt(JNIEnv *env, jobject thiz, jlong mediaTimeUs
}
static jint
-android_media_MediaPlayer2_getMediaPlayer2State(JNIEnv *env, jobject thiz)
+android_media_MediaPlayer2_getState(JNIEnv *env, jobject thiz)
{
sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
if (mp == NULL) {
return MEDIAPLAYER2_STATE_IDLE;
}
- return (jint)mp->getMediaPlayer2State();
+ return (jint)mp->getState();
}
static jint
@@ -1501,8 +1490,7 @@ static const JNINativeMethod gMethods[] = {
{"_setBufferingParams", "(Landroid/media/BufferingParams;)V", (void *)android_media_MediaPlayer2_setBufferingParams},
{"_prepare", "()V", (void *)android_media_MediaPlayer2_prepare},
{"_start", "()V", (void *)android_media_MediaPlayer2_start},
- {"_stop", "()V", (void *)android_media_MediaPlayer2_stop},
- {"native_getMediaPlayer2State", "()I", (void *)android_media_MediaPlayer2_getMediaPlayer2State},
+ {"native_getState", "()I", (void *)android_media_MediaPlayer2_getState},
{"getVideoWidth", "()I", (void *)android_media_MediaPlayer2_getVideoWidth},
{"getVideoHeight", "()I", (void *)android_media_MediaPlayer2_getVideoHeight},
{"native_getMetrics", "()Landroid/os/PersistableBundle;", (void *)android_media_MediaPlayer2_native_getMetrics},
@@ -1552,8 +1540,7 @@ static const JNINativeMethod gMethods[] = {
// This function only registers the native methods
static int register_android_media_MediaPlayer2Impl(JNIEnv *env)
{
- return AndroidRuntime::registerNativeMethods(env,
- "android/media/MediaPlayer2Impl", gMethods, NELEM(gMethods));
+ return jniRegisterNativeMethods(env, "android/media/MediaPlayer2Impl", gMethods, NELEM(gMethods));
}
jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
@@ -1572,6 +1559,8 @@ jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
goto bail;
}
+ JavaVMHelper::setJavaVM(vm);
+
/* success -- return valid version number */
result = JNI_VERSION_1_4;
diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp
index 48ddf9a95861..51b080a334d6 100644
--- a/media/jni/audioeffect/android_media_AudioEffect.cpp
+++ b/media/jni/audioeffect/android_media_AudioEffect.cpp
@@ -110,16 +110,16 @@ static void effectCallback(int event, void* user, void *info) {
effect_callback_cookie *callbackInfo = (effect_callback_cookie *)user;
JNIEnv *env = AndroidRuntime::getJNIEnv();
- ALOGV("effectCallback: callbackInfo %p, audioEffect_ref %p audioEffect_class %p",
- callbackInfo,
- callbackInfo->audioEffect_ref,
- callbackInfo->audioEffect_class);
-
if (!user || !env) {
ALOGW("effectCallback error user %p, env %p", user, env);
return;
}
+ ALOGV("effectCallback: callbackInfo %p, audioEffect_ref %p audioEffect_class %p",
+ callbackInfo,
+ callbackInfo->audioEffect_ref,
+ callbackInfo->audioEffect_class);
+
switch (event) {
case AudioEffect::EVENT_CONTROL_STATUS_CHANGED:
if (info == 0) {
diff --git a/media/jni/midi/android_media_midi_MidiDevice.cpp b/media/jni/midi/android_media_midi_MidiDevice.cpp
deleted file mode 100644
index 5b35453c32d0..000000000000
--- a/media/jni/midi/android_media_midi_MidiDevice.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "Midi-JNI"
-
-#include <android_util_Binder.h>
-#include <jni.h>
-#include <midi_internal.h>
-#include <utils/Log.h>
-
-using namespace android;
-using namespace android::media::midi;
-
-extern "C" jlong Java_android_media_midi_MidiDevice_native_1mirrorToNative(
- JNIEnv *env, jobject, jobject midiDeviceServer, jint id)
-{
- // ALOGI("native_mirrorToNative(%p)...", midiDeviceServer);
- sp<IBinder> serverBinder = ibinderForJavaObject(env, midiDeviceServer);
- if (serverBinder.get() == NULL) {
- ALOGE("Could not obtain IBinder from passed jobject");
- return -EINVAL;
- }
-
- AMIDI_Device* devicePtr = new AMIDI_Device;
- devicePtr->server = new BpMidiDeviceServer(serverBinder);
- devicePtr->deviceId = id;
-
- return (jlong)devicePtr;
-}
-
-extern "C" void Java_android_media_midi_MidiDevice_native_removeFromNative(
- JNIEnv *, jobject , jlong nativeToken)
-{
- AMIDI_Device* devicePtr = (AMIDI_Device*)nativeToken;
- delete devicePtr;
-}
diff --git a/media/lib/signer/Android.bp b/media/lib/signer/Android.bp
new file mode 100644
index 000000000000..3b2578754087
--- /dev/null
+++ b/media/lib/signer/Android.bp
@@ -0,0 +1,21 @@
+//
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+java_sdk_library {
+ name: "com.android.mediadrm.signer",
+ srcs: ["java/**/*.java"],
+ api_packages: ["com.android.mediadrm.signer"],
+}
diff --git a/media/lib/signer/Android.mk b/media/lib/signer/Android.mk
deleted file mode 100644
index 54aa9688be67..000000000000
--- a/media/lib/signer/Android.mk
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-# Copyright (C) 2013 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.
-#
-LOCAL_PATH := $(call my-dir)
-
-# the mediadrm signer library
-# ============================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE:= com.android.mediadrm.signer
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-java-files-under, java)
-
-include $(BUILD_JAVA_LIBRARY)
-
-
-# ==== com.android.mediadrm.signer.xml lib def ========================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := com.android.mediadrm.signer.xml
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE_CLASS := ETC
-
-# This will install the file in /system/etc/permissions
-#
-LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.android.mediadrm.signer.stubs-gen
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_SRC_FILES := $(call all-java-files-under,java)
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/com.android.mediadrm.signer.stubs_intermediates/src
-LOCAL_DROIDDOC_OPTIONS:= \
- -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \
- -stubpackages com.android.mediadrm.signer \
- -nodocs
-LOCAL_UNINSTALLABLE_MODULE := true
-include $(BUILD_DROIDDOC)
-com_android_mediadrm_signer_gen_stamp := $(full_target)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.android.mediadrm.signer.stubs
-LOCAL_SDK_VERSION := current
-LOCAL_SOURCE_FILES_ALL_GENERATED := true
-LOCAL_ADDITIONAL_DEPENDENCIES := $(com_android_mediadrm_signer_gen_stamp)
-com_android_mediadrm_signer_gen_stamp :=
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/media/lib/signer/api/current.txt b/media/lib/signer/api/current.txt
new file mode 100644
index 000000000000..4aa912d66cb4
--- /dev/null
+++ b/media/lib/signer/api/current.txt
@@ -0,0 +1,21 @@
+package com.android.mediadrm.signer {
+
+ public final class MediaDrmSigner {
+ method public static com.android.mediadrm.signer.MediaDrmSigner.CertificateRequest getCertificateRequest(android.media.MediaDrm, int, java.lang.String);
+ method public static com.android.mediadrm.signer.MediaDrmSigner.Certificate provideCertificateResponse(android.media.MediaDrm, byte[]) throws android.media.DeniedByServerException;
+ method public static byte[] signRSA(android.media.MediaDrm, byte[], java.lang.String, byte[], byte[]);
+ field public static final int CERTIFICATE_TYPE_X509 = 1; // 0x1
+ }
+
+ public static final class MediaDrmSigner.Certificate {
+ method public byte[] getContent();
+ method public byte[] getWrappedPrivateKey();
+ }
+
+ public static final class MediaDrmSigner.CertificateRequest {
+ method public byte[] getData();
+ method public java.lang.String getDefaultUrl();
+ }
+
+}
+
diff --git a/media/lib/signer/api/removed.txt b/media/lib/signer/api/removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/signer/api/removed.txt
diff --git a/media/lib/signer/api/system-current.txt b/media/lib/signer/api/system-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/signer/api/system-current.txt
diff --git a/media/lib/signer/api/system-removed.txt b/media/lib/signer/api/system-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/signer/api/system-removed.txt
diff --git a/media/lib/signer/api/test-current.txt b/media/lib/signer/api/test-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/signer/api/test-current.txt
diff --git a/media/lib/signer/api/test-removed.txt b/media/lib/signer/api/test-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/signer/api/test-removed.txt
diff --git a/media/lib/tvremote/Android.bp b/media/lib/tvremote/Android.bp
new file mode 100644
index 000000000000..5f101a3141c8
--- /dev/null
+++ b/media/lib/tvremote/Android.bp
@@ -0,0 +1,24 @@
+//
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+java_sdk_library {
+ name: "com.android.media.tv.remoteprovider",
+ srcs: ["java/**/*.java"],
+ api_packages: ["com.android.media.tv.remoteprovider"],
+ dex_preopt: {
+ enabled: false,
+ }
+}
diff --git a/media/lib/tvremote/Android.mk b/media/lib/tvremote/Android.mk
deleted file mode 100644
index 1ffdd6241f6e..000000000000
--- a/media/lib/tvremote/Android.mk
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Copyright (C) 2016 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.
-#
-LOCAL_PATH := $(call my-dir)
-
-# the tvremoteprovider library
-# ============================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE:= com.android.media.tv.remoteprovider
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-java-files-under, java)
-
-LOCAL_DEX_PREOPT := false
-
-include $(BUILD_JAVA_LIBRARY)
-
-
-# ==== com.android.media.tvremote.xml lib def ========================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := com.android.media.tv.remoteprovider.xml
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE_CLASS := ETC
-
-# This will install the file in /system/etc/permissions
-#
-LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
-
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-
-include $(BUILD_PREBUILT)
diff --git a/media/lib/tvremote/api/current.txt b/media/lib/tvremote/api/current.txt
new file mode 100644
index 000000000000..eea9e9c9c19c
--- /dev/null
+++ b/media/lib/tvremote/api/current.txt
@@ -0,0 +1,21 @@
+package com.android.media.tv.remoteprovider {
+
+ public abstract class TvRemoteProvider {
+ ctor public TvRemoteProvider(android.content.Context);
+ method public void clearInputBridge(android.os.IBinder) throws java.lang.RuntimeException;
+ method public void closeInputBridge(android.os.IBinder) throws java.lang.RuntimeException;
+ method public android.os.IBinder getBinder();
+ method public final android.content.Context getContext();
+ method public void onInputBridgeConnected(android.os.IBinder);
+ method public void openRemoteInputBridge(android.os.IBinder, java.lang.String, int, int, int) throws java.lang.RuntimeException;
+ method public void sendKeyDown(android.os.IBinder, int) throws java.lang.RuntimeException;
+ method public void sendKeyUp(android.os.IBinder, int) throws java.lang.RuntimeException;
+ method public void sendPointerDown(android.os.IBinder, int, int, int) throws java.lang.RuntimeException;
+ method public void sendPointerSync(android.os.IBinder) throws java.lang.RuntimeException;
+ method public void sendPointerUp(android.os.IBinder, int) throws java.lang.RuntimeException;
+ method public void sendTimestamp(android.os.IBinder, long) throws java.lang.RuntimeException;
+ field public static final java.lang.String SERVICE_INTERFACE = "com.android.media.tv.remoteprovider.TvRemoteProvider";
+ }
+
+}
+
diff --git a/media/lib/tvremote/api/removed.txt b/media/lib/tvremote/api/removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/tvremote/api/removed.txt
diff --git a/media/lib/tvremote/api/system-current.txt b/media/lib/tvremote/api/system-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/tvremote/api/system-current.txt
diff --git a/media/lib/tvremote/api/system-removed.txt b/media/lib/tvremote/api/system-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/tvremote/api/system-removed.txt
diff --git a/media/lib/tvremote/api/test-current.txt b/media/lib/tvremote/api/test-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/tvremote/api/test-current.txt
diff --git a/media/lib/tvremote/api/test-removed.txt b/media/lib/tvremote/api/test-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/media/lib/tvremote/api/test-removed.txt
diff --git a/media/mca/filterfw/Android.bp b/media/mca/filterfw/Android.bp
new file mode 100644
index 000000000000..71899cf1653f
--- /dev/null
+++ b/media/mca/filterfw/Android.bp
@@ -0,0 +1,73 @@
+// Copyright (C) 2011 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.
+//
+
+cc_library_shared {
+ name: "libfilterfw",
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+ whole_static_libs: [
+ "libfilterfw_jni",
+ "libfilterfw_native",
+ ],
+
+ shared_libs: [
+ "libGLESv2",
+ "libEGL",
+ "libgui",
+ "libdl",
+ "libcutils",
+ "libutils",
+ "liblog",
+ "libandroid",
+ "libjnigraphics",
+ "libmedia",
+ ],
+}
+
+cc_library_static {
+ name: "libfilterfw_jni",
+
+ srcs: [
+ "jni/jni_init.cpp",
+ "jni/jni_gl_environment.cpp",
+ "jni/jni_gl_frame.cpp",
+ "jni/jni_native_buffer.cpp",
+ "jni/jni_native_frame.cpp",
+ "jni/jni_native_program.cpp",
+ "jni/jni_shader_program.cpp",
+ "jni/jni_util.cpp",
+ "jni/jni_vertex_frame.cpp",
+ ],
+
+ local_include_dirs: ["native"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ "-Wno-unused-parameter",
+ ],
+
+ shared_libs: [
+ "libmedia",
+ "libgui",
+ "libandroid",
+ ],
+}
diff --git a/media/mca/filterfw/Android.mk b/media/mca/filterfw/Android.mk
deleted file mode 100644
index 37f1e13f7827..000000000000
--- a/media/mca/filterfw/Android.mk
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (C) 2011 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.
-#
-
-#####################
-# Build native sublibraries
-
-include $(all-subdir-makefiles)
-
-#####################
-# Build main libfilterfw
-
-include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_MODULE := libfilterfw
-
-LOCAL_CFLAGS := -Wall -Werror
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_WHOLE_STATIC_LIBRARIES := libfilterfw_jni \
- libfilterfw_native
-
-LOCAL_SHARED_LIBRARIES := \
- libGLESv2 \
- libEGL \
- libgui \
- libdl \
- libcutils \
- libutils \
- liblog \
- libandroid \
- libjnigraphics \
- libmedia
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/mca/filterfw/jni/Android.mk b/media/mca/filterfw/jni/Android.mk
deleted file mode 100644
index 9842e701fbc9..000000000000
--- a/media/mca/filterfw/jni/Android.mk
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (C) 2011 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.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-#####################
-# Build module libfilterfw_jni
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE = libfilterfw_jni
-
-LOCAL_SRC_FILES = jni_init.cpp \
- jni_gl_environment.cpp \
- jni_gl_frame.cpp \
- jni_native_buffer.cpp \
- jni_native_frame.cpp \
- jni_native_program.cpp \
- jni_shader_program.cpp \
- jni_util.cpp \
- jni_vertex_frame.cpp
-
-# Need FilterFW lib
-include $(LOCAL_PATH)/../native/libfilterfw.mk
-
-# Also need the JNI headers.
-LOCAL_C_INCLUDES += \
- $(JNI_H_INCLUDE) \
- $(LOCAL_PATH)/..
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code -Wno-unused-parameter
-
-LOCAL_SHARED_LIBRARIES := libmedia libgui libandroid
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/media/mca/filterfw/native/Android.bp b/media/mca/filterfw/native/Android.bp
new file mode 100644
index 000000000000..7a8a6a18664e
--- /dev/null
+++ b/media/mca/filterfw/native/Android.bp
@@ -0,0 +1,43 @@
+// Copyright (C) 2011 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.
+//
+
+//####################
+// Build module libfilterfw_static
+
+cc_library_static {
+ name: "libfilterfw_native",
+
+ srcs: [
+ "core/geometry.cpp",
+ "core/gl_env.cpp",
+ "core/gl_frame.cpp",
+ "core/native_frame.cpp",
+ "core/native_program.cpp",
+ "core/shader_program.cpp",
+ "core/vertex_frame.cpp",
+ "core/value.cpp",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+
+ static_libs: ["libarect"],
+
+ shared_libs: ["libgui"],
+}
diff --git a/media/mca/filterfw/native/Android.mk b/media/mca/filterfw/native/Android.mk
deleted file mode 100644
index feaefcbad6c5..000000000000
--- a/media/mca/filterfw/native/Android.mk
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright (C) 2011 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.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-#####################
-# Build module libfilterfw_static
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE := libfilterfw_native
-
-LOCAL_SRC_FILES += core/geometry.cpp \
- core/gl_env.cpp \
- core/gl_frame.cpp \
- core/native_frame.cpp \
- core/native_program.cpp \
- core/shader_program.cpp \
- core/vertex_frame.cpp \
- core/value.cpp
-
-# add local includes
-include $(LOCAL_PATH)/libfilterfw.mk
-
-# gcc should always be placed at the end.
-LOCAL_EXPORT_LDLIBS := -llog -lgcc
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-LOCAL_STATIC_LIBRARIES := \
- libarect \
-
-LOCAL_SHARED_LIBRARIES += \
- libgui \
-
-# TODO: Build a shared library as well?
-include $(BUILD_STATIC_LIBRARY)
-
diff --git a/media/mca/filterfw/native/libfilterfw.mk b/media/mca/filterfw/native/libfilterfw.mk
deleted file mode 100644
index 69227ce24c4d..000000000000
--- a/media/mca/filterfw/native/libfilterfw.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright (C) 2011 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.
-#
-
-# Add include paths for native code.
-FFW_PATH := $(call my-dir)
-
-# Uncomment the requirements below, once we need them:
-
-# Neven FaceDetect SDK
-#LOCAL_C_INCLUDES += external/neven/FaceRecEm/common/src/b_FDSDK \
-# external/neven/FaceRecEm/common/src \
-# external/neven/Embedded/common/conf \
-# external/neven/Embedded/common/src \
-# external/neven/unix/src
-
-# Finally, add this directory
-LOCAL_C_INCLUDES += $(FFW_PATH)
-
diff --git a/media/mca/filterpacks/Android.bp b/media/mca/filterpacks/Android.bp
new file mode 100644
index 000000000000..34fb27dd1663
--- /dev/null
+++ b/media/mca/filterpacks/Android.bp
@@ -0,0 +1,58 @@
+// Copyright (C) 2011 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.
+//
+
+cc_library_static {
+ name: "libfilterpack_base",
+ srcs: [
+ "native/base/geometry.cpp",
+ "native/base/time_util.cpp",
+ ],
+
+ cflags: [
+ "-DANDROID",
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
+
+cc_library_shared {
+ name: "libfilterpack_imageproc",
+
+ srcs: [
+ "native/imageproc/brightness.c",
+ "native/imageproc/contrast.c",
+ "native/imageproc/invert.c",
+ "native/imageproc/to_rgba.c",
+ ],
+
+ shared_libs: [
+ "liblog",
+ "libutils",
+ "libfilterfw",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+
+ // Bug: http://b/29823425 Disable constant-conversion warning triggered in
+ // native/imageproc/to_rgba.c
+ "-Wno-constant-conversion",
+ ],
+}
diff --git a/media/mca/filterpacks/Android.mk b/media/mca/filterpacks/Android.mk
deleted file mode 100644
index d89b1e976389..000000000000
--- a/media/mca/filterpacks/Android.mk
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (C) 2011 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.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-##
-# base
-##
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE := libfilterpack_base
-LOCAL_SRC_FILES := native/base/geometry.cpp \
- native/base/time_util.cpp
-
-LOCAL_CFLAGS := -DANDROID
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_STATIC_LIBRARY)
-
-##
-# filterpack_imageproc
-##
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE := libfilterpack_imageproc
-
-LOCAL_SRC_FILES += native/imageproc/brightness.c \
- native/imageproc/contrast.c \
- native/imageproc/invert.c \
- native/imageproc/to_rgba.c
-
-LOCAL_SHARED_LIBRARIES := liblog libutils libfilterfw
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-# Bug: http://b/29823425 Disable constant-conversion warning triggered in
-# native/imageproc/to_rgba.c
-LOCAL_CFLAGS += -Wno-constant-conversion
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/media/native/midi/Android.bp b/media/native/midi/Android.bp
index 11f0deabbcd5..d069bd2f6284 100644
--- a/media/native/midi/Android.bp
+++ b/media/native/midi/Android.bp
@@ -13,7 +13,7 @@
// limitations under the License.
cc_library_shared {
- name: "libmidi",
+ name: "libamidi",
srcs: [
"midi.cpp",
@@ -22,13 +22,13 @@ cc_library_shared {
aidl: {
include_dirs: ["frameworks/base/media/java"],
- export_aidl_headers: true,
+ export_aidl_headers: false,
},
cflags: [
"-Wall",
"-Werror",
- "-O0",
+ "-fvisibility=hidden",
],
shared_libs: [
@@ -36,7 +36,28 @@ cc_library_shared {
"libbinder",
"libutils",
"libmedia",
+ "libmediandk",
+ "libandroid_runtime",
],
- export_include_dirs: ["."],
+ export_include_dirs: ["include"],
+}
+
+ndk_headers {
+ name: "amidi",
+
+ from: "include",
+
+ to: "amidi",
+
+ srcs: ["include/midi.h"],
+ license: "include/NOTICE",
+}
+
+ndk_library {
+ name: "libamidi",
+
+ symbol_file: "libamidi.map.txt",
+
+ first_version: "29",
}
diff --git a/media/native/midi/include/NOTICE b/media/native/midi/include/NOTICE
new file mode 100644
index 000000000000..e72ff94a8401
--- /dev/null
+++ b/media/native/midi/include/NOTICE
@@ -0,0 +1,13 @@
+Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/media/native/midi/include/midi.h b/media/native/midi/include/midi.h
new file mode 100644
index 000000000000..755d09fc4ff2
--- /dev/null
+++ b/media/native/midi/include/midi.h
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_MEDIA_MIDI_H_
+#define ANDROID_MEDIA_MIDI_H_
+
+#include <stdarg.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <jni.h>
+
+#include <media/NdkMediaError.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct AMidiDevice AMidiDevice;
+typedef struct AMidiInputPort AMidiInputPort;
+typedef struct AMidiOutputPort AMidiOutputPort;
+
+#define AMIDI_API __attribute__((visibility("default")))
+
+/*
+ * Message Op Codes. Used to parse MIDI data packets
+ */
+enum {
+ AMIDI_OPCODE_DATA = 1, /* The MIDI packet contains normal MIDI data */
+ AMIDI_OPCODE_FLUSH = 2, /* The MIDI packet contains just a MIDI FLUSH command. */
+ /* Forces the send of any pending MIDI data. */
+};
+
+/*
+ * Type IDs for various MIDI devices.
+ */
+enum {
+ AMIDI_DEVICE_TYPE_USB = 1, /* A MIDI device connected to the Android USB port */
+ AMIDI_DEVICE_TYPE_VIRTUAL = 2, /* A software object implementing MidiDeviceService */
+ AMIDI_DEVICE_TYPE_BLUETOOTH = 3 /* A MIDI device connected via BlueTooth */
+};
+
+/*
+ * Device API
+ */
+/**
+ * Connects a native Midi Device object to the associated Java MidiDevice object. Use this
+ * AMidiDevice to access the rest of the native MIDI API. Use AMidiDevice_release() to
+ * disconnect from the Java object when not being used any more.
+ *
+ * @param env Points to the Java Environment.
+ * @param midiDeviceObj The Java MidiDevice Object.
+ * @param outDevicePtrPtr Points to the pointer to receive the AMidiDevice
+ *
+ * @return AMEDIA_OK on success, or a negative error value:
+ * @see AMEDIA_ERROR_INVALID_OBJECT {@link AMEDIA_ERROR_INVALID_OBJECT} - the midiDeviceObj
+ * is null or already connected to a native AMidiDevice
+ * @see AMEDIA_ERROR_UNKNOWN {@link AMEDIA_ERROR_UNKNOWN} - an unknown error occurred.
+ */
+media_status_t AMIDI_API AMidiDevice_fromJava(
+ JNIEnv *env, jobject midiDeviceObj, AMidiDevice **outDevicePtrPtr) __INTRODUCED_IN(29);
+
+/**
+ * Disconnects the native Midi Device Object from the associated Java MidiDevice object.
+ *
+ * @param midiDevice Points to the native AMIDI_MidiDevice.
+ *
+ * @return AMEDIA_OK on success,
+ * or a negative error value:
+ * @see AMEDIA_ERROR_INVALID_PARAMETER {@link AMEDIA_ERROR_INVALID_PARAMETER}
+ * - the device parameter is NULL.
+ * @see AMEDIA_ERROR_INVALID_OBJECT {@link AMEDIA_ERROR_INVALID_OBJECT}
+ * - the device is not consistent with the associated Java MidiDevice.
+ * @see AMEDIA_ERROR_INVALID_OBJECT {@link AMEDIA_ERROR_INVALID_OBJECT}
+ * - the JNI interface initialization to the associated java MidiDevice failed.
+ * @see AMEDIA_ERROR_UNKNOWN {@link AMEDIA_ERROR_UNKNOWN} - couldn't retrieve the device info.
+ */
+media_status_t AMIDI_API AMidiDevice_release(const AMidiDevice *midiDevice) __INTRODUCED_IN(29);
+
+/**
+ * Gets the MIDI device type.
+ *
+ * @param device Specifies the MIDI device.
+ *
+ * @return The identifier of the MIDI device type:
+ * AMIDI_DEVICE_TYPE_USB
+ * AMIDI_DEVICE_TYPE_VIRTUAL
+ * AMIDI_DEVICE_TYPE_BLUETOOTH
+ * or a negative error value:
+ * @see AMEDIA_ERROR_INVALID_PARAMETER {@link AMEDIA_ERROR_INVALID_PARAMETER} - the device
+ * parameter is NULL.
+ * @see AMEDIA_ERROR_UNKNOWN {@link AMEDIA_ERROR_UNKNOWN} - Unknown error.
+ */
+int32_t AMIDI_API AMidiDevice_getType(const AMidiDevice *device) __INTRODUCED_IN(29);
+
+/**
+ * Gets the number of input (sending) ports available on the specified MIDI device.
+ *
+ * @param device Specifies the MIDI device.
+ *
+ * @return If successful, returns the number of MIDI input (sending) ports available on the
+ * device. If an error occurs, returns a negative value indicating the error:
+ * @see AMEDIA_ERROR_INVALID_PARAMETER {@link AMEDIA_ERROR_INVALID_PARAMETER} - the device
+ * parameter is NULL.
+ * @see AMEDIA_ERROR_UNKNOWN {@link AMEDIA_ERROR_UNKNOWN} - couldn't retrieve the device info.
+ */
+ssize_t AMIDI_API AMidiDevice_getNumInputPorts(const AMidiDevice *device) __INTRODUCED_IN(29);
+
+/**
+ * Gets the number of output (receiving) ports available on the specified MIDI device.
+ *
+ * @param device Specifies the MIDI device.
+ *
+ * @return If successful, returns the number of MIDI output (receiving) ports available on the
+ * device. If an error occurs, returns a negative value indicating the error:
+ * @see AMEDIA_ERROR_INVALID_PARAMETER {@link AMEDIA_ERROR_INVALID_PARAMETER} - the device
+ * parameter is NULL.
+ * @see AMEDIA_ERROR_UNKNOWN {@link AMEDIA_ERROR_UNKNOWN}- couldn't retrieve the device info.
+ */
+ssize_t AMIDI_API AMidiDevice_getNumOutputPorts(const AMidiDevice *device) __INTRODUCED_IN(29);
+
+/*
+ * API for receiving data from the Output port of a device.
+ */
+/**
+ * Opens the output port so that the client can receive data from it. The port remains open and
+ * valid until AMidiOutputPort_close() is called for the returned AMidiOutputPort.
+ *
+ * @param device Specifies the MIDI device.
+ * @param portNumber Specifies the zero-based port index on the device to open. This value ranges
+ * between 0 and one less than the number of output ports reported by the
+ * AMidiDevice_getNumOutputPorts function.
+ * @param outOutputPortPtr Receives the native API port identifier of the opened port.
+ *
+ * @return AMEDIA_OK, or a negative error code:
+ * @see AMEDIA_ERROR_UNKNOWN {@link AMEDIA_ERROR_UNKNOWN} - Unknown Error.
+ */
+media_status_t AMIDI_API AMidiOutputPort_open(const AMidiDevice *device, int32_t portNumber,
+ AMidiOutputPort **outOutputPortPtr) __INTRODUCED_IN(29);
+
+/**
+ * Closes the output port.
+ *
+ * @param outputPort The native API port identifier of the port.
+ */
+void AMIDI_API AMidiOutputPort_close(const AMidiOutputPort *outputPort) __INTRODUCED_IN(29);
+
+/**
+ * Receives the next pending MIDI message. To retrieve all pending messages, the client should
+ * repeatedly call this method until it returns 0.
+ *
+ * Note that this is a non-blocking call. If there are no Midi messages are available, the function
+ * returns 0 immediately (for 0 messages received).
+ *
+ * @param outputPort Identifies the port to receive messages from.
+ * @param opcodePtr Receives the message Op Code.
+ * @param buffer Points to the buffer to receive the message data bytes.
+ * @param maxBytes Specifies the size of the buffer pointed to by the buffer parameter.
+ * @param numBytesReceivedPtr On exit, receives the actual number of bytes stored in buffer.
+ * @param outTimestampPtr If non-NULL, receives the timestamp associated with the message.
+ * (the current value of the running Java Virtual Machine's high-resolution time source,
+ * in nanoseconds)
+ * @return the number of messages received (either 0 or 1), or a negative error code:
+ * @see AMEDIA_ERROR_UNKNOWN {@link AMEDIA_ERROR_UNKNOWN} - Unknown Error.
+ */
+ssize_t AMIDI_API AMidiOutputPort_receive(const AMidiOutputPort *outputPort, int32_t *opcodePtr,
+ uint8_t *buffer, size_t maxBytes, size_t* numBytesReceivedPtr, int64_t *outTimestampPtr) __INTRODUCED_IN(29);
+
+/*
+ * API for sending data to the Input port of a device.
+ */
+/**
+ * Opens the input port so that the client can send data to it. The port remains open and
+ * valid until AMidiInputPort_close() is called for the returned AMidiInputPort.
+ *
+ * @param device Specifies the MIDI device.
+ * @param portNumber Specifies the zero-based port index on the device to open. This value ranges
+ * between 0 and one less than the number of input ports reported by the
+ * AMidiDevice_getNumInputPorts() function..
+ * @param outInputPortPtr Receives the native API port identifier of the opened port.
+ *
+ * @return AMEDIA_OK, or a negative error code:
+ * @see AMEDIA_ERROR_UNKNOWN {@link AMEDIA_ERROR_UNKNOWN} - Unknown Error.
+ */
+media_status_t AMIDI_API AMidiInputPort_open(const AMidiDevice *device, int32_t portNumber,
+ AMidiInputPort **outInputPortPtr) __INTRODUCED_IN(29);
+
+/**
+ * Sends data to the specified input port.
+ *
+ * @param inputPort The identifier of the port to send data to.
+ * @param buffer Points to the array of bytes containing the data to send.
+ * @param numBytes Specifies the number of bytes to write.
+ *
+ * @return The number of bytes sent, which could be less than specified or a negative error code:
+ * @see AMEDIA_ERROR_INVALID_PARAMETER {@link AMEDIA_ERROR_INVALID_PARAMETER} The specified port
+ * was NULL, the specified buffer was NULL.
+ */
+ssize_t AMIDI_API AMidiInputPort_send(const AMidiInputPort *inputPort, const uint8_t *buffer,
+ size_t numBytes) __INTRODUCED_IN(29);
+
+/**
+ * Sends data to the specified input port with a timestamp.
+ *
+ * @param inputPort The identifier of the port to send data to.
+ * @param buffer Points to the array of bytes containing the data to send.
+ * @param numBytes Specifies the number of bytes to write.
+ * @param timestamp The CLOCK_MONOTONIC time in nanoseconds to associate with the sent data.
+ *
+ * @return The number of bytes sent, which could be less than specified or a negative error code:
+ * @see AMEDIA_ERROR_INVALID_PARAMETER {@link AMEDIA_ERROR_INVALID_PARAMETER} The specified port
+ * was NULL, the specified buffer was NULL.
+ */
+ssize_t AMIDI_API AMidiInputPort_sendWithTimestamp(const AMidiInputPort *inputPort,
+ const uint8_t *buffer, size_t numBytes, int64_t timestamp) __INTRODUCED_IN(29);
+
+/**
+ * Sends a message with a 'MIDI flush command code' to the specified port. This should cause
+ * a receiver to discard any pending MIDI data it may have accumulated and not processed.
+ *
+ * @param inputPort The identifier of the port to send the flush command to.
+ *
+ * @returns @see AMEDIA_OK {@link AMEDIA_OK} if successful, otherwise a negative error code:
+ * @see AMEDIA_ERROR_INVALID_PARAMETER {@link AMEDIA_ERROR_INVALID_PARAMETER} The specified port
+ * was NULL
+ * @see AMEDIA_ERROR_UNSUPPORTED {@link AMEDIA_ERROR_UNSUPPORTED} The FLUSH command couldn't
+ * be sent.
+ */
+media_status_t AMIDI_API AMidiInputPort_sendFlush(const AMidiInputPort *inputPort) __INTRODUCED_IN(29);
+
+/**
+ * Closes the input port.
+ *
+ * @param inputPort Identifies the input (sending) port to close.
+ */
+void AMIDI_API AMidiInputPort_close(const AMidiInputPort *inputPort) __INTRODUCED_IN(29);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ANDROID_MEDIA_MIDI_H_ */
diff --git a/media/native/midi/libamidi.map.txt b/media/native/midi/libamidi.map.txt
new file mode 100644
index 000000000000..62627f8c5ef7
--- /dev/null
+++ b/media/native/midi/libamidi.map.txt
@@ -0,0 +1,18 @@
+LIBAMIDI {
+ global:
+ AMidiDevice_fromJava;
+ AMidiDevice_release;
+ AMidiDevice_getType;
+ AMidiDevice_getNumInputPorts;
+ AMidiDevice_getNumOutputPorts;
+ AMidiOutputPort_open;
+ AMidiOutputPort_close;
+ AMidiOutputPort_receive;
+ AMidiInputPort_open;
+ AMidiInputPort_send;
+ AMidiInputPort_sendWithTimestamp;
+ AMidiInputPort_sendFlush;
+ AMidiInputPort_close;
+ local:
+ *;
+};
diff --git a/media/native/midi/midi.cpp b/media/native/midi/midi.cpp
index 17b92da3325e..78ca0ab2486e 100644
--- a/media/native/midi/midi.cpp
+++ b/media/native/midi/midi.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,15 +20,19 @@
#include <unistd.h>
#include <binder/Binder.h>
-#include <utils/Errors.h>
+#include <android_util_Binder.h>
#include <utils/Log.h>
+#include <core_jni_helpers.h>
+
#include "android/media/midi/BpMidiDeviceServer.h"
#include "media/MidiDeviceInfo.h"
-#include "midi.h"
+#include "include/midi.h"
#include "midi_internal.h"
+using namespace android::media::midi;
+
using android::IBinder;
using android::BBinder;
using android::OK;
@@ -36,23 +40,26 @@ using android::sp;
using android::status_t;
using android::base::unique_fd;
using android::binder::Status;
-using android::media::midi::MidiDeviceInfo;
struct AMIDI_Port {
- std::atomic_int state;
- AMIDI_Device *device;
- sp<IBinder> binderToken;
- unique_fd ufd;
+ std::atomic_int state; // One of the port status constants below.
+ const AMidiDevice *device; // Points to the AMidiDevice associated with the port.
+ sp<IBinder> binderToken;// The Binder token associated with the port.
+ unique_fd ufd; // The unique file descriptor associated with the port.
};
-#define SIZE_MIDIRECEIVEBUFFER AMIDI_BUFFER_SIZE
-
+/*
+ * Port Status Constants
+ */
enum {
MIDI_PORT_STATE_CLOSED = 0,
MIDI_PORT_STATE_OPEN_IDLE,
MIDI_PORT_STATE_OPEN_ACTIVE
};
+/*
+ * Port Type Constants
+ */
enum {
PORTTYPE_OUTPUT = 0,
PORTTYPE_INPUT = 1
@@ -76,32 +83,170 @@ enum {
* boundaries, and delivers messages in the order that they were sent.
* So 'read()' always returns a whole message.
*/
+#define AMIDI_PACKET_SIZE 1024
+#define AMIDI_PACKET_OVERHEAD 9
+#define AMIDI_BUFFER_SIZE (AMIDI_PACKET_SIZE - AMIDI_PACKET_OVERHEAD)
+
+// JNI IDs (see android_media_midi.cpp)
+namespace android { namespace midi {
+// MidiDevice Fields
+extern jfieldID gFidMidiNativeHandle; // MidiDevice.mNativeHandle
+extern jfieldID gFidMidiDeviceServerBinder; // MidiDevice.mDeviceServerBinder
+extern jfieldID gFidMidiDeviceInfo; // MidiDevice.mDeviceInfo
+
+// MidiDeviceInfo Fields
+extern jfieldID mFidMidiDeviceId; // MidiDeviceInfo.mId
+}}
+using namespace android::midi;
+
+static std::mutex openMutex; // Ensure that the device can be connected just once to 1 thread
+
+//// Handy debugging function.
+//static void AMIDI_logBuffer(const uint8_t *data, size_t numBytes) {
+// for (size_t index = 0; index < numBytes; index++) {
+// ALOGI(" data @%zu [0x%X]", index, data[index]);
+// }
+//}
/*
* Device Functions
*/
-status_t AMIDI_getDeviceInfo(AMIDI_Device *device, AMIDI_DeviceInfo *deviceInfoPtr) {
+/**
+ * Retrieves information for the native MIDI device.
+ *
+ * device The Native API token for the device. This value is obtained from the
+ * AMidiDevice_fromJava().
+ * outDeviceInfoPtr Receives the associated device info.
+ *
+ * Returns AMEDIA_OK or a negative error code.
+ * - AMEDIA_ERROR_INVALID_PARAMETER
+ * AMEDIA_ERROR_UNKNOWN
+ */
+static media_status_t AMIDI_API AMIDI_getDeviceInfo(const AMidiDevice *device,
+ AMidiDeviceInfo *outDeviceInfoPtr) {
+ if (device == nullptr) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
+ }
+
MidiDeviceInfo deviceInfo;
Status txResult = device->server->getDeviceInfo(&deviceInfo);
if (!txResult.isOk()) {
ALOGE("AMIDI_getDeviceInfo transaction error: %d", txResult.transactionError());
- return txResult.transactionError();
+ return AMEDIA_ERROR_UNKNOWN;
+ }
+
+ outDeviceInfoPtr->type = deviceInfo.getType();
+ outDeviceInfoPtr->inputPortCount = deviceInfo.getInputPortNames().size();
+ outDeviceInfoPtr->outputPortCount = deviceInfo.getOutputPortNames().size();
+
+ return AMEDIA_OK;
+}
+
+media_status_t AMIDI_API AMidiDevice_fromJava(JNIEnv *env, jobject j_midiDeviceObj,
+ AMidiDevice** devicePtrPtr)
+{
+ if (j_midiDeviceObj == nullptr) {
+ ALOGE("AMidiDevice_fromJava() invalid MidiDevice object.");
+ return AMEDIA_ERROR_INVALID_OBJECT;
+ }
+
+ {
+ std::lock_guard<std::mutex> guard(openMutex);
+
+ long handle = env->GetLongField(j_midiDeviceObj, gFidMidiNativeHandle);
+ if (handle != 0) {
+ // Already opened by someone.
+ return AMEDIA_ERROR_INVALID_OBJECT;
+ }
+
+ jobject serverBinderObj = env->GetObjectField(j_midiDeviceObj, gFidMidiDeviceServerBinder);
+ sp<IBinder> serverBinder = android::ibinderForJavaObject(env, serverBinderObj);
+ if (serverBinder.get() == nullptr) {
+ ALOGE("AMidiDevice_fromJava couldn't connect to native MIDI server.");
+ return AMEDIA_ERROR_UNKNOWN;
+ }
+
+ // don't check allocation failures, just abort..
+ AMidiDevice* devicePtr = new AMidiDevice;
+ devicePtr->server = new BpMidiDeviceServer(serverBinder);
+ jobject midiDeviceInfoObj = env->GetObjectField(j_midiDeviceObj, gFidMidiDeviceInfo);
+ devicePtr->deviceId = env->GetIntField(midiDeviceInfoObj, mFidMidiDeviceId);
+
+ // Synchronize with the associated Java MidiDevice.
+ env->SetLongField(j_midiDeviceObj, gFidMidiNativeHandle, (long)devicePtr);
+ env->GetJavaVM(&devicePtr->javaVM);
+ devicePtr->midiDeviceObj = env->NewGlobalRef(j_midiDeviceObj);
+
+ if (AMIDI_getDeviceInfo(devicePtr, &devicePtr->deviceInfo) != AMEDIA_OK) {
+ // This is weird, but maybe not fatal?
+ ALOGE("AMidiDevice_fromJava couldn't retrieve attributes of native device.");
+ }
+
+ *devicePtrPtr = devicePtr;
+ }
+
+ return AMEDIA_OK;
+}
+
+media_status_t AMIDI_API AMidiDevice_release(const AMidiDevice *device)
+{
+ if (device == nullptr || device->midiDeviceObj == nullptr) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
+ }
+
+ JNIEnv* env;
+ jint err = device->javaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
+ LOG_ALWAYS_FATAL_IF(err != JNI_OK, "AMidiDevice_release Error accessing JNIEnv err:%d", err);
+
+ // Synchronize with the associated Java MidiDevice.
+ {
+ std::lock_guard<std::mutex> guard(openMutex);
+ long handle = env->GetLongField(device->midiDeviceObj, gFidMidiNativeHandle);
+ if (handle == 0) {
+ // Not opened as native.
+ ALOGE("AMidiDevice_release() device not opened in native client.");
+ return AMEDIA_ERROR_INVALID_OBJECT;
+ }
+
+ env->SetLongField(device->midiDeviceObj, gFidMidiNativeHandle, 0L);
}
+ env->DeleteGlobalRef(device->midiDeviceObj);
- deviceInfoPtr->type = deviceInfo.getType();
- deviceInfoPtr->uid = deviceInfo.getUid();
- deviceInfoPtr->isPrivate = deviceInfo.isPrivate();
- deviceInfoPtr->inputPortCount = deviceInfo.getInputPortNames().size();
- deviceInfoPtr->outputPortCount = deviceInfo.getOutputPortNames().size();
+ delete device;
- return OK;
+ return AMEDIA_OK;
+}
+
+int32_t AMIDI_API AMidiDevice_getType(const AMidiDevice *device) {
+ if (device == nullptr) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
+ }
+ return device->deviceInfo.type;
+}
+
+ssize_t AMIDI_API AMidiDevice_getNumInputPorts(const AMidiDevice *device) {
+ if (device == nullptr) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
+ }
+ return device->deviceInfo.inputPortCount;
+}
+
+ssize_t AMIDI_API AMidiDevice_getNumOutputPorts(const AMidiDevice *device) {
+ if (device == nullptr) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
+ }
+ return device->deviceInfo.outputPortCount;
}
/*
* Port Helpers
*/
-static status_t AMIDI_openPort(AMIDI_Device *device, int portNumber, int type,
+static media_status_t AMIDI_openPort(const AMidiDevice *device, int32_t portNumber, int type,
AMIDI_Port **portPtr) {
+ if (device == nullptr) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
+ }
+
sp<BBinder> portToken(new BBinder());
unique_fd ufd;
Status txResult = type == PORTTYPE_OUTPUT
@@ -109,10 +254,10 @@ static status_t AMIDI_openPort(AMIDI_Device *device, int portNumber, int type,
: device->server->openInputPort(portToken, portNumber, &ufd);
if (!txResult.isOk()) {
ALOGE("AMIDI_openPort transaction error: %d", txResult.transactionError());
- return txResult.transactionError();
+ return AMEDIA_ERROR_UNKNOWN;
}
- AMIDI_Port* port = new AMIDI_Port;
+ AMIDI_Port *port = new AMIDI_Port;
port->state = MIDI_PORT_STATE_OPEN_IDLE;
port->device = device;
port->binderToken = portToken;
@@ -120,155 +265,178 @@ static status_t AMIDI_openPort(AMIDI_Device *device, int portNumber, int type,
*portPtr = port;
- return OK;
+ return AMEDIA_OK;
}
-static status_t AMIDI_closePort(AMIDI_Port *port) {
+static void AMIDI_closePort(AMIDI_Port *port) {
+ if (port == nullptr) {
+ return;
+ }
+
int portState = MIDI_PORT_STATE_OPEN_IDLE;
while (!port->state.compare_exchange_weak(portState, MIDI_PORT_STATE_CLOSED)) {
if (portState == MIDI_PORT_STATE_CLOSED) {
- return -EINVAL; // Already closed
+ return; // Already closed
}
}
Status txResult = port->device->server->closePort(port->binderToken);
if (!txResult.isOk()) {
- return txResult.transactionError();
+ ALOGE("Transaction error closing MIDI port:%d", txResult.transactionError());
}
delete port;
-
- return OK;
}
/*
* Output (receiving) API
*/
-status_t AMIDI_openOutputPort(AMIDI_Device *device, int portNumber,
- AMIDI_OutputPort **outputPortPtr) {
- return AMIDI_openPort(device, portNumber, PORTTYPE_OUTPUT, (AMIDI_Port**)outputPortPtr);
+media_status_t AMIDI_API AMidiOutputPort_open(const AMidiDevice *device, int32_t portNumber,
+ AMidiOutputPort **outOutputPortPtr) {
+ return AMIDI_openPort(device, portNumber, PORTTYPE_OUTPUT, (AMIDI_Port**)outOutputPortPtr);
}
-ssize_t AMIDI_receive(AMIDI_OutputPort *outputPort, AMIDI_Message *messages, ssize_t maxMessages) {
- AMIDI_Port *port = (AMIDI_Port*)outputPort;
- int portState = MIDI_PORT_STATE_OPEN_IDLE;
- if (!port->state.compare_exchange_strong(portState, MIDI_PORT_STATE_OPEN_ACTIVE)) {
- // The port has been closed.
- return -EPIPE;
+/*
+ * A little RAII (https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization)
+ * class to ensure that the port state is correct irrespective of errors.
+ */
+class MidiReceiver {
+public:
+ MidiReceiver(AMIDI_Port *port) : mPort(port) {}
+
+ ~MidiReceiver() {
+ // flag the port state to idle
+ mPort->state.store(MIDI_PORT_STATE_OPEN_IDLE);
}
- status_t result = OK;
- ssize_t messagesRead = 0;
- while (messagesRead < maxMessages) {
- struct pollfd checkFds[1] = { { port->ufd, POLLIN, 0 } };
- int pollResult = poll(checkFds, 1, 0);
- if (pollResult < 1) {
- result = android::INVALID_OPERATION;
- break;
+ ssize_t receive(int32_t *opcodePtr, uint8_t *buffer, size_t maxBytes,
+ size_t *numBytesReceivedPtr, int64_t *timestampPtr) {
+ int portState = MIDI_PORT_STATE_OPEN_IDLE;
+ // check to see if the port is idle, then set to active
+ if (!mPort->state.compare_exchange_strong(portState, MIDI_PORT_STATE_OPEN_ACTIVE)) {
+ // The port not idle or has been closed.
+ return AMEDIA_ERROR_UNKNOWN;
}
- AMIDI_Message *message = &messages[messagesRead];
- uint8_t readBuffer[AMIDI_PACKET_SIZE];
- memset(readBuffer, 0, sizeof(readBuffer));
- ssize_t readCount = read(port->ufd, readBuffer, sizeof(readBuffer));
- if (readCount == EINTR) {
- continue;
+ struct pollfd checkFds[1] = { { mPort->ufd, POLLIN, 0 } };
+ if (poll(checkFds, 1, 0) < 1) {
+ // Nothing there
+ return 0;
}
- if (readCount < 1) {
- result = android::NOT_ENOUGH_DATA;
- break;
+
+ uint8_t readBuffer[AMIDI_PACKET_SIZE];
+ ssize_t readCount = read(mPort->ufd, readBuffer, sizeof(readBuffer));
+ if (readCount == EINTR || readCount < 1) {
+ return AMEDIA_ERROR_UNKNOWN;
}
- // set Packet Format definition at the top of this file.
- size_t dataSize = 0;
- message->opcode = readBuffer[0];
- message->timestamp = 0;
- if (message->opcode == AMIDI_OPCODE_DATA && readCount >= AMIDI_PACKET_OVERHEAD) {
- dataSize = readCount - AMIDI_PACKET_OVERHEAD;
- if (dataSize) {
- memcpy(message->buffer, readBuffer + 1, dataSize);
+ // see Packet Format definition at the top of this file.
+ size_t numMessageBytes = 0;
+ *opcodePtr = readBuffer[0];
+ if (*opcodePtr == AMIDI_OPCODE_DATA && readCount >= AMIDI_PACKET_OVERHEAD) {
+ numMessageBytes = readCount - AMIDI_PACKET_OVERHEAD;
+ numMessageBytes = std::min(maxBytes, numMessageBytes);
+ memcpy(buffer, readBuffer + 1, numMessageBytes);
+ if (timestampPtr != nullptr) {
+ *timestampPtr = *(uint64_t*)(readBuffer + readCount - sizeof(uint64_t));
}
- message->timestamp = *(uint64_t*)(readBuffer + readCount - sizeof(uint64_t));
}
- message->len = dataSize;
- ++messagesRead;
+ *numBytesReceivedPtr = numMessageBytes;
+ return 1;
}
- port->state.store(MIDI_PORT_STATE_OPEN_IDLE);
+private:
+ AMIDI_Port *mPort;
+};
+
+ssize_t AMIDI_API AMidiOutputPort_receive(const AMidiOutputPort *outputPort, int32_t *opcodePtr,
+ uint8_t *buffer, size_t maxBytes, size_t* numBytesReceivedPtr, int64_t *timestampPtr) {
+
+ if (outputPort == nullptr || buffer == nullptr) {
+ return -EINVAL;
+ }
- return result == OK ? messagesRead : result;
+ return MidiReceiver((AMIDI_Port*)outputPort).receive(opcodePtr, buffer, maxBytes,
+ numBytesReceivedPtr, timestampPtr);
}
-status_t AMIDI_closeOutputPort(AMIDI_OutputPort *outputPort) {
- return AMIDI_closePort((AMIDI_Port*)outputPort);
+void AMIDI_API AMidiOutputPort_close(const AMidiOutputPort *outputPort) {
+ AMIDI_closePort((AMIDI_Port*)outputPort);
}
/*
* Input (sending) API
*/
-status_t AMIDI_openInputPort(AMIDI_Device *device, int portNumber, AMIDI_InputPort **inputPortPtr) {
- return AMIDI_openPort(device, portNumber, PORTTYPE_INPUT, (AMIDI_Port**)inputPortPtr);
+media_status_t AMIDI_API AMidiInputPort_open(const AMidiDevice *device, int32_t portNumber,
+ AMidiInputPort **outInputPortPtr) {
+ return AMIDI_openPort(device, portNumber, PORTTYPE_INPUT, (AMIDI_Port**)outInputPortPtr);
}
-status_t AMIDI_closeInputPort(AMIDI_InputPort *inputPort) {
- return AMIDI_closePort((AMIDI_Port*)inputPort);
-}
-
-ssize_t AMIDI_getMaxMessageSizeInBytes(AMIDI_InputPort */*inputPort*/) {
- return SIZE_MIDIRECEIVEBUFFER;
+void AMIDI_API AMidiInputPort_close(const AMidiInputPort *inputPort) {
+ AMIDI_closePort((AMIDI_Port*)inputPort);
}
static ssize_t AMIDI_makeSendBuffer(
- uint8_t *buffer, uint8_t *data, ssize_t numBytes,uint64_t timestamp) {
+ uint8_t *buffer, const uint8_t *data, size_t numBytes, uint64_t timestamp) {
+ // Error checking will happen in the caller since this isn't an API function.
buffer[0] = AMIDI_OPCODE_DATA;
memcpy(buffer + 1, data, numBytes);
memcpy(buffer + 1 + numBytes, &timestamp, sizeof(timestamp));
return numBytes + AMIDI_PACKET_OVERHEAD;
}
-// Handy debugging function.
-//static void AMIDI_logBuffer(uint8_t *data, size_t numBytes) {
-// for (size_t index = 0; index < numBytes; index++) {
-// ALOGI(" data @%zu [0x%X]", index, data[index]);
-// }
-//}
-
-ssize_t AMIDI_send(AMIDI_InputPort *inputPort, uint8_t *buffer, ssize_t numBytes) {
- return AMIDI_sendWithTimestamp(inputPort, buffer, numBytes, 0);
+ssize_t AMIDI_API AMidiInputPort_send(const AMidiInputPort *inputPort, const uint8_t *buffer,
+ size_t numBytes) {
+ return AMidiInputPort_sendWithTimestamp(inputPort, buffer, numBytes, 0);
}
-ssize_t AMIDI_sendWithTimestamp(AMIDI_InputPort *inputPort, uint8_t *data,
- ssize_t numBytes, int64_t timestamp) {
-
- if (numBytes > SIZE_MIDIRECEIVEBUFFER) {
- return android::BAD_VALUE;
+ssize_t AMIDI_API AMidiInputPort_sendWithTimestamp(const AMidiInputPort *inputPort,
+ const uint8_t *data, size_t numBytes, int64_t timestamp) {
+ if (inputPort == nullptr || data == nullptr) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
}
// AMIDI_logBuffer(data, numBytes);
- uint8_t writeBuffer[SIZE_MIDIRECEIVEBUFFER + AMIDI_PACKET_OVERHEAD];
- ssize_t numTransferBytes = AMIDI_makeSendBuffer(writeBuffer, data, numBytes, timestamp);
- ssize_t numWritten = write(((AMIDI_Port*)inputPort)->ufd, writeBuffer, numTransferBytes);
+ uint8_t writeBuffer[AMIDI_BUFFER_SIZE + AMIDI_PACKET_OVERHEAD];
+ size_t numSent = 0;
+ while (numSent < numBytes) {
+ size_t blockSize = AMIDI_BUFFER_SIZE;
+ blockSize = std::min(blockSize, numBytes - numSent);
+
+ ssize_t numTransferBytes =
+ AMIDI_makeSendBuffer(writeBuffer, data + numSent, blockSize, timestamp);
+ ssize_t numWritten = write(((AMIDI_Port*)inputPort)->ufd, writeBuffer, numTransferBytes);
+ if (numWritten < 0) {
+ break; // error so bail out.
+ }
+ if (numWritten < numTransferBytes) {
+ ALOGE("AMidiInputPort_sendWithTimestamp Couldn't write MIDI data buffer."
+ " requested:%zu, written%zu",numTransferBytes, numWritten);
+ break; // bail
+ }
- if (numWritten < numTransferBytes) {
- ALOGE("AMIDI_sendWithTimestamp Couldn't write MIDI data buffer. requested:%zu, written%zu",
- numTransferBytes, numWritten);
+ numSent += numWritten - AMIDI_PACKET_OVERHEAD;
}
- return numWritten - AMIDI_PACKET_OVERHEAD;
+ return numSent;
}
-status_t AMIDI_flush(AMIDI_InputPort *inputPort) {
+media_status_t AMIDI_API AMidiInputPort_sendFlush(const AMidiInputPort *inputPort) {
+ if (inputPort == nullptr) {
+ return AMEDIA_ERROR_INVALID_PARAMETER;
+ }
+
uint8_t opCode = AMIDI_OPCODE_FLUSH;
ssize_t numTransferBytes = 1;
ssize_t numWritten = write(((AMIDI_Port*)inputPort)->ufd, &opCode, numTransferBytes);
if (numWritten < numTransferBytes) {
- ALOGE("AMIDI_flush Couldn't write MIDI flush. requested:%zu, written%zu",
+ ALOGE("AMidiInputPort_flush Couldn't write MIDI flush. requested:%zd, written:%zd",
numTransferBytes, numWritten);
- return android::INVALID_OPERATION;
+ return AMEDIA_ERROR_UNSUPPORTED;
}
- return OK;
+ return AMEDIA_OK;
}
diff --git a/media/native/midi/midi.h b/media/native/midi/midi.h
deleted file mode 100644
index 9332b44dddd2..000000000000
--- a/media/native/midi/midi.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#ifndef ANDROID_MEDIA_MIDI_H_
-#define ANDROID_MEDIA_MIDI_H_
-
-#include <stdarg.h>
-#include <stdint.h>
-#include <sys/types.h>
-
-#include <utils/Errors.h>
-
-using android::status_t;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct AMIDI_Device;
-struct AMIDI_InputPort;
-struct AMIDI_OutputPort;
-
-#define AMIDI_INVALID_HANDLE NULL
-
-enum {
- AMIDI_OPCODE_DATA = 1,
- AMIDI_OPCODE_FLUSH = 2,
- AMIDI_PACKET_SIZE = 1024, /* !!! Currently MidiPortImpl.MAX_PACKET_SIZE !!! */
- AMIDI_PACKET_OVERHEAD = 9,
- AMIDI_BUFFER_SIZE = AMIDI_PACKET_SIZE - AMIDI_PACKET_OVERHEAD
- /* !!! TBD, currently MidiPortImpl.MAX_PACKET_DATA_SIZE !!! */
-};
-
-typedef struct {
- uint32_t opcode;
- uint8_t buffer[AMIDI_BUFFER_SIZE];
- size_t len;
- int64_t timestamp;
-} AMIDI_Message;
-
-enum {
- AMIDI_DEVICE_TYPE_USB = 1,
- AMIDI_DEVICE_TYPE_VIRTUAL = 2,
- AMIDI_DEVICE_TYPE_BLUETOOTH = 3
-};
-
-typedef struct {
- int32_t type;
- int32_t uid;
- int32_t isPrivate;
- int32_t inputPortCount;
- int32_t outputPortCount;
-} AMIDI_DeviceInfo;
-
-/*
- * Device API
- */
-/*
- * Retrieves information for the native MIDI device.
- *
- * device The Native API token for the device.
- * deviceInfoPtr Receives the associated device info.
- *
- * Returns OK or a (negative) error code.
- */
-status_t AMIDI_getDeviceInfo(AMIDI_Device *device, AMIDI_DeviceInfo *deviceInfoPtr);
-
-/*
- * API for receiving data from the Output port of a device.
- */
-/*
- * Opens the output port.
- *
- * device Identifies the device.
- * portNumber Specifies the zero-based port index on the device to open.
- * outputPortPtr Receives the native API port identifier of the opened port.
- *
- * Returns OK, or a (negative) error code.
- */
-status_t AMIDI_openOutputPort(AMIDI_Device *device, int portNumber,
- AMIDI_OutputPort **outputPortPtr);
-
-/*
- * Receives any pending MIDI messages (up to the specified maximum number of messages).
- *
- * outputPort Identifies the port to receive messages from.
- * messages Points to an array (size maxMessages) to receive the MIDI messages.
- * maxMessages The number of messages allocated in the messages array.
- *
- * Returns the number of messages received, or a (negative) error code.
- */
-ssize_t AMIDI_receive(AMIDI_OutputPort *outputPort, AMIDI_Message *messages, ssize_t maxMessages);
-
-/*
- * Closes the output port.
- *
- * outputPort The native API port identifier of the port.
- *
- * Returns OK, or a (negative) error code.
- */
-status_t AMIDI_closeOutputPort(AMIDI_OutputPort *outputPort);
-
-/*
- * API for sending data to the Input port of a device.
- */
-/*
- * Opens the input port.
- *
- * device Identifies the device.
- * portNumber Specifies the zero-based port index on the device to open.
- * inputPortPtr Receives the native API port identifier of the opened port.
- *
- * Returns OK, or a (negative) error code.
- */
-status_t AMIDI_openInputPort(AMIDI_Device *device, int portNumber, AMIDI_InputPort **inputPortPtr);
-
-/*
- * Returns the maximum number of bytes that can be received in a single MIDI message.
- */
-ssize_t AMIDI_getMaxMessageSizeInBytes(AMIDI_InputPort *inputPort);
-
-/*
- * Sends data to the specified input port.
- *
- * inputPort The native API identifier of the port to send data to.
- * buffer Points to the array of bytes containing the data to send.
- * numBytes Specifies the number of bytes to write.
- *
- * Returns The number of bytes sent or a (negative) error code.
- */
-ssize_t AMIDI_send(AMIDI_InputPort *inputPort, uint8_t *buffer, ssize_t numBytes);
-
-/*
- * Sends data to the specified input port with a timestamp.
- *
- * inputPort The native API identifier of the port to send data to.
- * buffer Points to the array of bytes containing the data to send.
- * numBytes Specifies the number of bytes to write.
- * timestamp The time stamp to associate with the sent data.
- *
- * Returns The number of bytes sent or a (negative) error code.
- */
-ssize_t AMIDI_sendWithTimestamp(AMIDI_InputPort *inputPort, uint8_t *buffer,
- ssize_t numBytes, int64_t timestamp);
-
-/*
- * Sends a message with a 'MIDI flush command code' to the specified port.
- *
- * inputPort The native API identifier of the port to send the flush message to.
- *
- * Returns OK, or a (negative) error code.
- */
-status_t AMIDI_flush(AMIDI_InputPort *inputPort);
-
-/*
- * Closes the input port.
- *
- * inputPort The native API port identifier of the port.
- *
- *
- * Returns OK, or a (negative) error code.
- */
-status_t AMIDI_closeInputPort(AMIDI_InputPort *inputPort);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ANDROID_MEDIA_MIDI_H_ */
diff --git a/media/native/midi/midi_internal.h b/media/native/midi/midi_internal.h
index fd4770e05d6c..cb3ecce13533 100644
--- a/media/native/midi/midi_internal.h
+++ b/media/native/midi/midi_internal.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,11 +17,25 @@
#ifndef ANDROID_MEDIA_MIDI_INTERNAL_H_
#define ANDROID_MEDIA_MIDI_INTERNAL_H_
+#include <jni.h>
+
#include "android/media/midi/BpMidiDeviceServer.h"
-struct AMIDI_Device {
- android::sp<android::media::midi::BpMidiDeviceServer> server;
- int32_t deviceId;
+typedef struct {
+ int32_t type; /* one of AMIDI_DEVICE_TYPE_* constants */
+ int32_t inputPortCount; /* number of input (send) ports associated with the device */
+ int32_t outputPortCount; /* number of output (received) ports associated with the device */
+} AMidiDeviceInfo;
+
+struct AMidiDevice {
+ android::sp<android::media::midi::BpMidiDeviceServer>
+ server; /* The Binder interface to the MIDI server (from the Java MidiDevice) */
+ int32_t deviceId; /* The integer id of the device assigned in the Java API */
+ JavaVM* javaVM; /* The Java VM (so we can obtain the JNIEnv in the
+ AMidiDevice_close function) */
+ jobject midiDeviceObj; /* NewGlobalRef() reference to the Java MidiDevice associated with
+ this native AMidiDevice. */
+ AMidiDeviceInfo deviceInfo; /* Attributes of the device. */
};
#endif // ANDROID_MEDIA_MIDI_INTERNAL_H_
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java
index b2be46430831..5ab50925a268 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/helpers/CameraTestUtils.java
@@ -43,6 +43,8 @@ import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.hardware.camera2.params.InputConfiguration;
import android.hardware.camera2.params.MeteringRectangle;
+import android.hardware.camera2.params.OutputConfiguration;
+import android.hardware.camera2.params.SessionConfiguration;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.location.Location;
import android.location.LocationManager;
@@ -75,6 +77,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Executor;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
@@ -694,6 +697,38 @@ public class CameraTestUtils extends Assert {
}
/**
+ * Configure a new camera session with output surfaces and initial session parameters.
+ *
+ * @param camera The CameraDevice to be configured.
+ * @param outputSurfaces The surface list that used for camera output.
+ * @param listener The callback CameraDevice will notify when session is available.
+ * @param handler The handler used to notify callbacks.
+ * @param initialRequest Initial request settings to use as session parameters.
+ */
+ public static CameraCaptureSession configureCameraSessionWithParameters(CameraDevice camera,
+ List<Surface> outputSurfaces, BlockingSessionCallback listener,
+ Handler handler, CaptureRequest initialRequest) throws CameraAccessException {
+ List<OutputConfiguration> outConfigurations = new ArrayList<>(outputSurfaces.size());
+ for (Surface surface : outputSurfaces) {
+ outConfigurations.add(new OutputConfiguration(surface));
+ }
+ SessionConfiguration sessionConfig = new SessionConfiguration(
+ SessionConfiguration.SESSION_REGULAR, outConfigurations,
+ new HandlerExecutor(handler), listener);
+ sessionConfig.setSessionParameters(initialRequest);
+ camera.createCaptureSession(sessionConfig);
+
+ CameraCaptureSession session = listener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+ assertFalse("Camera session should not be a reprocessable session",
+ session.isReprocessable());
+ assertFalse("Capture session type must be regular",
+ CameraConstrainedHighSpeedCaptureSession.class.isAssignableFrom(
+ session.getClass()));
+
+ return session;
+ }
+
+ /**
* Configure a new camera session with output surfaces and type.
*
* @param camera The CameraDevice to be configured.
@@ -1334,6 +1369,20 @@ public class CameraTestUtils extends Assert {
}
}
+ public static class HandlerExecutor implements Executor {
+ private final Handler mHandler;
+
+ public HandlerExecutor(Handler handler) {
+ assertNotNull("handler must be valid", handler);
+ mHandler = handler;
+ }
+
+ @Override
+ public void execute(Runnable runCmd) {
+ mHandler.post(runCmd);
+ }
+ }
+
/**
* Provide a mock for {@link CameraDevice.StateCallback}.
*
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/Camera2RecordingTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/Camera2RecordingTest.java
index ddb05f017cc8..8f27fefca0d0 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/Camera2RecordingTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/Camera2RecordingTest.java
@@ -58,6 +58,7 @@ import static com.android.mediaframeworktest.helpers.CameraTestUtils.SIZE_BOUND_
import static com.android.mediaframeworktest.helpers.CameraTestUtils.SimpleCaptureCallback;
import static com.android.mediaframeworktest.helpers.CameraTestUtils.SimpleImageReaderListener;
import static com.android.mediaframeworktest.helpers.CameraTestUtils.configureCameraSession;
+import static com.android.mediaframeworktest.helpers.CameraTestUtils.configureCameraSessionWithParameters;
import static com.android.mediaframeworktest.helpers.CameraTestUtils.getSupportedVideoSizes;
import static com.android.mediaframeworktest.helpers.CameraTestUtils.getValueNotNull;
@@ -872,7 +873,6 @@ public class Camera2RecordingTest extends Camera2SurfaceViewTestCase {
outputSurfaces.add(mReaderSurface);
}
mSessionListener = new BlockingSessionCallback();
- mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
CaptureRequest.Builder recordingRequestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
@@ -885,7 +885,10 @@ public class Camera2RecordingTest extends Camera2SurfaceViewTestCase {
}
recordingRequestBuilder.addTarget(mRecordingSurface);
recordingRequestBuilder.addTarget(mPreviewSurface);
- mSession.setRepeatingRequest(recordingRequestBuilder.build(), listener, mHandler);
+ CaptureRequest recordingRequest = recordingRequestBuilder.build();
+ mSession = configureCameraSessionWithParameters(mCamera, outputSurfaces, mSessionListener,
+ mHandler, recordingRequest);
+ mSession.setRepeatingRequest(recordingRequest, listener, mHandler);
if (useMediaRecorder) {
mMediaRecorder.start();
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ImageReaderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ImageReaderTest.java
index f6cd9901cd39..2cb5704f5c2d 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ImageReaderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ImageReaderTest.java
@@ -41,6 +41,7 @@ public class ImageReaderTest extends AndroidTestCase {
private Image mImage3;
@Override
+ @SuppressWarnings("CheckReturnValue")
protected void setUp() throws Exception {
super.setUp();
diff --git a/media/tests/NativeMidiDemo/AndroidManifest.xml b/media/tests/NativeMidiDemo/AndroidManifest.xml
deleted file mode 100644
index 322873f11895..000000000000
--- a/media/tests/NativeMidiDemo/AndroidManifest.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.android.nativemididemo"
- android:versionCode="1"
- android:versionName="1.0">
- <application
- android:allowBackup="false"
- android:fullBackupContent="false"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name">
- <uses-feature android:name="android.software.midi" android:required="true"/>
- <activity android:name=".NativeMidi"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/NativeMidi.java b/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/NativeMidi.java
deleted file mode 100644
index b0ca0bb74548..000000000000
--- a/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/NativeMidi.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright (C) 2016 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.example.android.nativemididemo;
-
-import android.app.Activity;
-import android.content.Context;
-import android.media.midi.MidiDevice;
-import android.media.midi.MidiDeviceInfo;
-import android.media.midi.MidiManager;
-import android.media.midi.MidiOutputPort;
-import android.media.midi.MidiReceiver;
-import android.media.AudioManager;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.RadioButton;
-import android.widget.RadioGroup;
-import android.widget.TextView;
-
-import java.io.IOException;
-
-public class NativeMidi extends Activity
-{
- private TextView mCallbackStatusTextView;
- private TextView mJavaMidiStatusTextView;
- private TextView mMessagesTextView;
- private RadioGroup mMidiDevicesRadioGroup;
- private Handler mTimerHandler = new Handler();
- private boolean mAudioWorks;
- private final int mMinFramesPerBuffer = 32; // See {min|max}PlaySamples in nativemidi-jni.cpp
- private final int mMaxFramesPerBuffer = 1000;
- private int mFramesPerBuffer;
-
- private TouchableScrollView mMessagesContainer;
- private MidiManager mMidiManager;
- private MidiOutputPortSelector mActivePortSelector;
-
- private Runnable mTimerRunnable = new Runnable() {
- private long mLastTime;
- private long mLastPlaybackCounter;
- private int mLastCallbackRate;
- private long mLastUntouchedTime;
-
- @Override
- public void run() {
- final long checkIntervalMs = 1000;
- long currentTime = System.currentTimeMillis();
- long currentPlaybackCounter = getPlaybackCounter();
- if (currentTime - mLastTime >= checkIntervalMs) {
- int callbackRate = Math.round(
- (float)(currentPlaybackCounter - mLastPlaybackCounter) /
- ((float)(currentTime - mLastTime) / (float)1000));
- if (mLastCallbackRate != callbackRate) {
- mCallbackStatusTextView.setText(
- "CB: " + callbackRate + " Hz");
- mLastCallbackRate = callbackRate;
- }
- mLastTime = currentTime;
- mLastPlaybackCounter = currentPlaybackCounter;
- }
-
- String[] newMessages = getRecentMessages();
- if (newMessages != null) {
- for (String message : newMessages) {
- mMessagesTextView.append(message);
- mMessagesTextView.append("\n");
- }
- if (!mMessagesContainer.isTouched) {
- if (mLastUntouchedTime == 0) mLastUntouchedTime = currentTime;
- if (currentTime - mLastUntouchedTime > 3000) {
- mMessagesContainer.fullScroll(View.FOCUS_DOWN);
- }
- } else {
- mLastUntouchedTime = 0;
- }
- }
-
- mTimerHandler.postDelayed(this, checkIntervalMs / 4);
- }
- };
-
- private void addMessage(final String message) {
- mTimerHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mMessagesTextView.append(message);
- }
- }, 0);
- }
-
- private class MidiOutputPortSelector implements View.OnClickListener {
- private final MidiDeviceInfo mDeviceInfo;
- private final int mPortNumber;
- private MidiDevice mDevice;
- private MidiOutputPort mOutputPort;
-
- MidiOutputPortSelector() {
- mDeviceInfo = null;
- mPortNumber = -1;
- }
-
- MidiOutputPortSelector(MidiDeviceInfo info, int portNumber) {
- mDeviceInfo = info;
- mPortNumber = portNumber;
- }
-
- MidiDeviceInfo getDeviceInfo() { return mDeviceInfo; }
-
- @Override
- public void onClick(View v) {
- if (mActivePortSelector != null) {
- mActivePortSelector.close();
- mActivePortSelector = null;
- }
- if (mDeviceInfo == null) {
- mActivePortSelector = this;
- return;
- }
- mMidiManager.openDevice(mDeviceInfo, new MidiManager.OnDeviceOpenedListener() {
- @Override
- public void onDeviceOpened(MidiDevice device) {
- if (device == null) {
- addMessage("! Failed to open MIDI device !\n");
- } else {
- mDevice = device;
- try {
- mDevice.mirrorToNative();
- startReadingMidi(mDevice.getInfo().getId(), mPortNumber);
- } catch (IOException e) {
- addMessage("! Failed to mirror to native !\n" + e.getMessage() + "\n");
- }
-
- mActivePortSelector = MidiOutputPortSelector.this;
-
- mOutputPort = device.openOutputPort(mPortNumber);
- mOutputPort.connect(mMidiReceiver);
- }
- }
- }, null);
- }
-
- void closePortOnly() {
- stopReadingMidi();
- }
-
- void close() {
- closePortOnly();
- try {
- if (mOutputPort != null) {
- mOutputPort.close();
- }
- } catch (IOException e) {
- mMessagesTextView.append("! Port close error: " + e + "\n");
- } finally {
- mOutputPort = null;
- }
- try {
- if (mDevice != null) {
- mDevice.close();
- }
- } catch (IOException e) {
- mMessagesTextView.append("! Device close error: " + e + "\n");
- } finally {
- mDevice = null;
- }
- }
- }
-
- private MidiManager.DeviceCallback mMidiDeviceCallback = new MidiManager.DeviceCallback() {
- @Override
- public void onDeviceAdded(MidiDeviceInfo info) {
- Bundle deviceProps = info.getProperties();
- String deviceName = deviceProps.getString(MidiDeviceInfo.PROPERTY_NAME);
- if (deviceName == null) {
- deviceName = deviceProps.getString(MidiDeviceInfo.PROPERTY_MANUFACTURER);
- }
-
- for (MidiDeviceInfo.PortInfo port : info.getPorts()) {
- if (port.getType() != MidiDeviceInfo.PortInfo.TYPE_OUTPUT) continue;
- String portName = port.getName();
- int portNumber = port.getPortNumber();
- if (portName.length() == 0) portName = "[" + portNumber + "]";
- portName += "@" + deviceName;
- RadioButton outputDevice = new RadioButton(NativeMidi.this);
- outputDevice.setText(portName);
- outputDevice.setTag(info);
- outputDevice.setOnClickListener(new MidiOutputPortSelector(info, portNumber));
- mMidiDevicesRadioGroup.addView(outputDevice);
- }
-
- NativeMidi.this.updateKeepScreenOn();
- }
-
- @Override
- public void onDeviceRemoved(MidiDeviceInfo info) {
- if (mActivePortSelector != null && info.equals(mActivePortSelector.getDeviceInfo())) {
- mActivePortSelector.close();
- mActivePortSelector = null;
- }
- int removeButtonStart = -1, removeButtonCount = 0;
- final int buttonCount = mMidiDevicesRadioGroup.getChildCount();
- boolean checked = false;
- for (int i = 0; i < buttonCount; ++i) {
- RadioButton button = (RadioButton) mMidiDevicesRadioGroup.getChildAt(i);
- if (!info.equals(button.getTag())) continue;
- if (removeButtonStart == -1) removeButtonStart = i;
- ++removeButtonCount;
- if (button.isChecked()) checked = true;
- }
- if (removeButtonStart != -1) {
- mMidiDevicesRadioGroup.removeViews(removeButtonStart, removeButtonCount);
- if (checked) {
- mMidiDevicesRadioGroup.check(R.id.device_none);
- }
- }
-
- NativeMidi.this.updateKeepScreenOn();
- }
- };
-
- private class JavaMidiReceiver extends MidiReceiver implements Runnable {
- @Override
- public void onSend(byte[] data, int offset,
- int count, long timestamp) throws IOException {
- mTimerHandler.removeCallbacks(this);
- mTimerHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mJavaMidiStatusTextView.setText("Java: MSG");
- }
- }, 0);
- mTimerHandler.postDelayed(this, 100);
- }
-
- @Override
- public void run() {
- mJavaMidiStatusTextView.setText("Java: ---");
- }
- }
-
- private JavaMidiReceiver mMidiReceiver = new JavaMidiReceiver();
-
- private void updateKeepScreenOn() {
- if (mMidiDevicesRadioGroup.getChildCount() > 1) {
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- } else {
- getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- }
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- mCallbackStatusTextView = findViewById(R.id.callback_status);
- mJavaMidiStatusTextView = findViewById(R.id.java_midi_status);
- mMessagesTextView = findViewById(R.id.messages);
- mMessagesContainer = findViewById(R.id.messages_scroll);
- mMidiDevicesRadioGroup = findViewById(R.id.devices);
- RadioButton deviceNone = findViewById(R.id.device_none);
- deviceNone.setOnClickListener(new MidiOutputPortSelector());
-
- AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
- String sampleRate = am.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
- if (sampleRate == null) sampleRate = "48000";
- String framesPerBuffer = am.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
- if (framesPerBuffer == null) framesPerBuffer = Integer.toString(mMaxFramesPerBuffer);
- mFramesPerBuffer = Integer.parseInt(framesPerBuffer);
- String audioInitResult = initAudio(Integer.parseInt(sampleRate), mFramesPerBuffer);
- mMessagesTextView.append("Open SL ES init: " + audioInitResult + "\n");
-
- if (audioInitResult.startsWith("Success")) {
- mAudioWorks = true;
- mTimerHandler.postDelayed(mTimerRunnable, 0);
- mTimerHandler.postDelayed(mMidiReceiver, 0);
- }
-
- mMidiManager = (MidiManager) getSystemService(Context.MIDI_SERVICE);
- mMidiManager.registerDeviceCallback(mMidiDeviceCallback, new Handler());
- for (MidiDeviceInfo info : mMidiManager.getDevices()) {
- mMidiDeviceCallback.onDeviceAdded(info);
- }
- }
-
- @Override
- public void onPause() {
- super.onPause();
- if (mAudioWorks) {
- mTimerHandler.removeCallbacks(mTimerRunnable);
- pauseAudio();
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (mAudioWorks) {
- mTimerHandler.postDelayed(mTimerRunnable, 0);
- resumeAudio();
- }
- }
-
- @Override
- protected void onDestroy() {
- if (mActivePortSelector != null) {
- mActivePortSelector.close();
- mActivePortSelector = null;
- }
- shutdownAudio();
- super.onDestroy();
- }
-
- public void onClearMessages(View v) {
- mMessagesTextView.setText("");
- }
-
- public void onClosePort(View v) {
- if (mActivePortSelector != null) {
- mActivePortSelector.closePortOnly();
- }
- }
-
- private native String initAudio(int sampleRate, int playSamples);
- private native void pauseAudio();
- private native void resumeAudio();
- private native void shutdownAudio();
-
- private native long getPlaybackCounter();
- private native String[] getRecentMessages();
-
- private native void startReadingMidi(int deviceId, int portNumber);
- private native void stopReadingMidi();
-
- static {
- System.loadLibrary("nativemidi_jni");
- }
-}
diff --git a/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/TouchableScrollView.java b/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/TouchableScrollView.java
deleted file mode 100644
index 645aafa88507..000000000000
--- a/media/tests/NativeMidiDemo/java/com/example/android/nativemididemo/TouchableScrollView.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.example.android.nativemididemo;
-
-import android.content.Context;
-import android.view.MotionEvent;
-import android.util.AttributeSet;
-import android.widget.ScrollView;
-
-public class TouchableScrollView extends ScrollView {
- public boolean isTouched;
-
- public TouchableScrollView(Context context) {
- super(context);
- }
-
- public TouchableScrollView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- isTouched = true;
- break;
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_UP:
- isTouched = false;
- break;
- }
- return super.onTouchEvent(event);
- }
-}
diff --git a/media/tests/NativeMidiDemo/jni/messagequeue.cpp b/media/tests/NativeMidiDemo/jni/messagequeue.cpp
deleted file mode 100644
index ffaef38bed8c..000000000000
--- a/media/tests/NativeMidiDemo/jni/messagequeue.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- *
- */
-
-#include <atomic>
-#include <stdio.h>
-#include <string.h>
-
-#include "messagequeue.h"
-
-namespace nativemididemo {
-
-static const int messageBufferSize = 64 * 1024;
-static char messageBuffer[messageBufferSize];
-static std::atomic_ullong messagesLastWritePosition;
-
-void writeMessage(const char* message)
-{
- static unsigned long long lastWritePos = 0;
- size_t messageLen = strlen(message);
- if (messageLen == 0) return;
-
- messageLen += 1; // Also count in the null terminator.
- char buffer[1024];
- if (messageLen >= messageBufferSize) {
- snprintf(buffer, sizeof(buffer), "!!! Message too long: %zu bytes !!!", messageLen);
- message = buffer;
- messageLen = strlen(message);
- }
-
- size_t wrappedWritePos = lastWritePos % messageBufferSize;
- if (wrappedWritePos + messageLen >= messageBufferSize) {
- size_t tailLen = messageBufferSize - wrappedWritePos;
- memset(messageBuffer + wrappedWritePos, 0, tailLen);
- lastWritePos += tailLen;
- wrappedWritePos = 0;
- }
-
- memcpy(messageBuffer + wrappedWritePos, message, messageLen);
- lastWritePos += messageLen;
- messagesLastWritePosition.store(lastWritePos);
-}
-
-static char messageBufferCopy[messageBufferSize];
-
-jobjectArray getRecentMessagesForJava(JNIEnv* env, jobject)
-{
- static unsigned long long lastReadPos = 0;
- const char* overrunMessage = "";
- size_t messagesCount = 0;
- jobjectArray result = NULL;
-
- // First we copy the portion of the message buffer into messageBufferCopy. If after finishing
- // the copy we notice that the writer has mutated the portion of the buffer that we were
- // copying, we report an overrun. Afterwards we can safely read messages from the copy.
- memset(messageBufferCopy, 0, sizeof(messageBufferCopy));
- unsigned long long lastWritePos = messagesLastWritePosition.load();
- if (lastWritePos - lastReadPos > messageBufferSize) {
- overrunMessage = "!!! Message buffer overrun !!!";
- messagesCount = 1;
- lastReadPos = lastWritePos;
- goto create_array;
- }
- if (lastWritePos == lastReadPos) return result;
- if (lastWritePos / messageBufferSize == lastReadPos / messageBufferSize) {
- size_t wrappedReadPos = lastReadPos % messageBufferSize;
- memcpy(messageBufferCopy + wrappedReadPos,
- messageBuffer + wrappedReadPos,
- lastWritePos % messageBufferSize - wrappedReadPos);
- } else {
- size_t wrappedReadPos = lastReadPos % messageBufferSize;
- memcpy(messageBufferCopy, messageBuffer, lastWritePos % messageBufferSize);
- memcpy(messageBufferCopy + wrappedReadPos,
- messageBuffer + wrappedReadPos,
- messageBufferSize - wrappedReadPos);
- }
- {
- unsigned long long newLastWritePos = messagesLastWritePosition.load();
- if (newLastWritePos - lastReadPos > messageBufferSize) {
- overrunMessage = "!!! Message buffer overrun !!!";
- messagesCount = 1;
- lastReadPos = lastWritePos = newLastWritePos;
- goto create_array;
- }
- }
- // Otherwise we ignore newLastWritePos, since we only have a copy of the buffer
- // up to lastWritePos.
-
- for (unsigned long long readPos = lastReadPos; readPos < lastWritePos; ) {
- size_t messageLen = strlen(messageBufferCopy + (readPos % messageBufferSize));
- if (messageLen != 0) {
- readPos += messageLen + 1;
- messagesCount++;
- } else {
- // Skip to the beginning of the buffer.
- readPos = (readPos / messageBufferSize + 1) * messageBufferSize;
- }
- }
- if (messagesCount == 0) {
- lastReadPos = lastWritePos;
- return result;
- }
-
-create_array:
- result = env->NewObjectArray(
- messagesCount, env->FindClass("java/lang/String"), env->NewStringUTF(overrunMessage));
- if (lastWritePos == lastReadPos) return result;
-
- jsize arrayIndex = 0;
- while (lastReadPos < lastWritePos) {
- size_t wrappedReadPos = lastReadPos % messageBufferSize;
- if (messageBufferCopy[wrappedReadPos] != '\0') {
- jstring message = env->NewStringUTF(messageBufferCopy + wrappedReadPos);
- env->SetObjectArrayElement(result, arrayIndex++, message);
- lastReadPos += env->GetStringLength(message) + 1;
- env->DeleteLocalRef(message);
- } else {
- // Skip to the beginning of the buffer.
- lastReadPos = (lastReadPos / messageBufferSize + 1) * messageBufferSize;
- }
- }
- return result;
-}
-
-} // namespace nativemididemo
diff --git a/media/tests/NativeMidiDemo/jni/nativemidi-jni.cpp b/media/tests/NativeMidiDemo/jni/nativemidi-jni.cpp
deleted file mode 100644
index 0110b75b7ba4..000000000000
--- a/media/tests/NativeMidiDemo/jni/nativemidi-jni.cpp
+++ /dev/null
@@ -1,286 +0,0 @@
-#include <atomic>
-#include <inttypes.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <jni.h>
-
-#include <midi/midi.h>
-#include <SLES/OpenSLES.h>
-#include <SLES/OpenSLES_Android.h>
-
-#include "messagequeue.h"
-
-extern "C" {
-JNIEXPORT jstring JNICALL Java_com_example_android_nativemididemo_NativeMidi_initAudio(
- JNIEnv* env, jobject thiz, jint sampleRate, jint playSamples);
-JNIEXPORT void JNICALL Java_com_example_android_nativemididemo_NativeMidi_pauseAudio(
- JNIEnv* env, jobject thiz);
-JNIEXPORT void JNICALL Java_com_example_android_nativemididemo_NativeMidi_resumeAudio(
- JNIEnv* env, jobject thiz);
-JNIEXPORT void JNICALL Java_com_example_android_nativemididemo_NativeMidi_shutdownAudio(
- JNIEnv* env, jobject thiz);
-JNIEXPORT jlong JNICALL Java_com_example_android_nativemididemo_NativeMidi_getPlaybackCounter(
- JNIEnv* env, jobject thiz);
-JNIEXPORT jobjectArray JNICALL Java_com_example_android_nativemididemo_NativeMidi_getRecentMessages(
- JNIEnv* env, jobject thiz);
-JNIEXPORT void JNICALL Java_com_example_android_nativemididemo_NativeMidi_startReadingMidi(
- JNIEnv* env, jobject thiz, jint deviceId, jint portNumber);
-JNIEXPORT void JNICALL Java_com_example_android_nativemididemo_NativeMidi_stopReadingMidi(
- JNIEnv* env, jobject thiz);
-}
-
-static const char* errStrings[] = {
- "SL_RESULT_SUCCESS", // 0
- "SL_RESULT_PRECONDITIONS_VIOLATED", // 1
- "SL_RESULT_PARAMETER_INVALID", // 2
- "SL_RESULT_MEMORY_FAILURE", // 3
- "SL_RESULT_RESOURCE_ERROR", // 4
- "SL_RESULT_RESOURCE_LOST", // 5
- "SL_RESULT_IO_ERROR", // 6
- "SL_RESULT_BUFFER_INSUFFICIENT", // 7
- "SL_RESULT_CONTENT_CORRUPTED", // 8
- "SL_RESULT_CONTENT_UNSUPPORTED", // 9
- "SL_RESULT_CONTENT_NOT_FOUND", // 10
- "SL_RESULT_PERMISSION_DENIED", // 11
- "SL_RESULT_FEATURE_UNSUPPORTED", // 12
- "SL_RESULT_INTERNAL_ERROR", // 13
- "SL_RESULT_UNKNOWN_ERROR", // 14
- "SL_RESULT_OPERATION_ABORTED", // 15
- "SL_RESULT_CONTROL_LOST" }; // 16
-static const char* getSLErrStr(int code) {
- return errStrings[code];
-}
-
-static SLObjectItf engineObject;
-static SLEngineItf engineEngine;
-static SLObjectItf outputMixObject;
-static SLObjectItf playerObject;
-static SLPlayItf playerPlay;
-static SLAndroidSimpleBufferQueueItf playerBufferQueue;
-
-static const int minPlaySamples = 32;
-static const int maxPlaySamples = 1000;
-static std::atomic_int playSamples(maxPlaySamples);
-static short playBuffer[maxPlaySamples];
-
-static std::atomic_ullong sharedCounter;
-
-static AMIDI_Device* midiDevice = AMIDI_INVALID_HANDLE;
-static std::atomic<AMIDI_OutputPort*> midiOutputPort(AMIDI_INVALID_HANDLE);
-
-static int setPlaySamples(int newPlaySamples)
-{
- if (newPlaySamples < minPlaySamples) newPlaySamples = minPlaySamples;
- if (newPlaySamples > maxPlaySamples) newPlaySamples = maxPlaySamples;
- playSamples.store(newPlaySamples);
- return newPlaySamples;
-}
-
-// Amount of messages we are ready to handle during one callback cycle.
-static const size_t MAX_INCOMING_MIDI_MESSAGES = 20;
-// Static allocation to save time in the callback.
-static AMIDI_Message incomingMidiMessages[MAX_INCOMING_MIDI_MESSAGES];
-
-static void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void */*context*/)
-{
- sharedCounter++;
-
- AMIDI_OutputPort* outputPort = midiOutputPort.load();
- if (outputPort != AMIDI_INVALID_HANDLE) {
- char midiDumpBuffer[1024];
- ssize_t midiReceived = AMIDI_receive(
- outputPort, incomingMidiMessages, MAX_INCOMING_MIDI_MESSAGES);
- if (midiReceived >= 0) {
- for (ssize_t i = 0; i < midiReceived; ++i) {
- AMIDI_Message* msg = &incomingMidiMessages[i];
- if (msg->opcode == AMIDI_OPCODE_DATA) {
- memset(midiDumpBuffer, 0, sizeof(midiDumpBuffer));
- int pos = snprintf(midiDumpBuffer, sizeof(midiDumpBuffer),
- "%" PRIx64 " ", msg->timestamp);
- for (uint8_t *b = msg->buffer, *e = b + msg->len; b < e; ++b) {
- pos += snprintf(midiDumpBuffer + pos, sizeof(midiDumpBuffer) - pos,
- "%02x ", *b);
- }
- nativemididemo::writeMessage(midiDumpBuffer);
- } else if (msg->opcode == AMIDI_OPCODE_FLUSH) {
- nativemididemo::writeMessage("MIDI flush");
- }
- }
- } else {
- snprintf(midiDumpBuffer, sizeof(midiDumpBuffer),
- "! MIDI Receive error: %s !", strerror(-midiReceived));
- nativemididemo::writeMessage(midiDumpBuffer);
- }
- }
-
- size_t usedBufferSize = playSamples.load() * sizeof(playBuffer[0]);
- if (usedBufferSize > sizeof(playBuffer)) {
- usedBufferSize = sizeof(playBuffer);
- }
- (*bq)->Enqueue(bq, playBuffer, usedBufferSize);
-}
-
-jstring Java_com_example_android_nativemididemo_NativeMidi_initAudio(
- JNIEnv* env, jobject, jint sampleRate, jint playSamples) {
- const char* stage;
- SLresult result;
- char printBuffer[1024];
-
- playSamples = setPlaySamples(playSamples);
-
- result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
- if (SL_RESULT_SUCCESS != result) { stage = "slCreateEngine"; goto handle_error; }
-
- result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
- if (SL_RESULT_SUCCESS != result) { stage = "realize Engine object"; goto handle_error; }
-
- result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
- if (SL_RESULT_SUCCESS != result) { stage = "get Engine interface"; goto handle_error; }
-
- result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL);
- if (SL_RESULT_SUCCESS != result) { stage = "CreateOutputMix"; goto handle_error; }
-
- result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
- if (SL_RESULT_SUCCESS != result) { stage = "realize OutputMix object"; goto handle_error; }
-
- {
- SLDataFormat_PCM format_pcm = { SL_DATAFORMAT_PCM, 1, (SLuint32)sampleRate * 1000,
- SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
- SL_SPEAKER_FRONT_LEFT, SL_BYTEORDER_LITTLEENDIAN };
- SLDataLocator_AndroidSimpleBufferQueue loc_bufq =
- { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 1 };
- SLDataSource audioSrc = { &loc_bufq, &format_pcm };
- SLDataLocator_OutputMix loc_outmix = { SL_DATALOCATOR_OUTPUTMIX, outputMixObject };
- SLDataSink audioSnk = { &loc_outmix, NULL };
- const SLInterfaceID ids[1] = { SL_IID_BUFFERQUEUE };
- const SLboolean req[1] = { SL_BOOLEAN_TRUE };
- result = (*engineEngine)->CreateAudioPlayer(
- engineEngine, &playerObject, &audioSrc, &audioSnk, 1, ids, req);
- if (SL_RESULT_SUCCESS != result) { stage = "CreateAudioPlayer"; goto handle_error; }
-
- result = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE);
- if (SL_RESULT_SUCCESS != result) { stage = "realize Player object"; goto handle_error; }
- }
-
- result = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay);
- if (SL_RESULT_SUCCESS != result) { stage = "get Play interface"; goto handle_error; }
-
- result = (*playerObject)->GetInterface(playerObject, SL_IID_BUFFERQUEUE, &playerBufferQueue);
- if (SL_RESULT_SUCCESS != result) { stage = "get BufferQueue interface"; goto handle_error; }
-
- result = (*playerBufferQueue)->RegisterCallback(playerBufferQueue, bqPlayerCallback, NULL);
- if (SL_RESULT_SUCCESS != result) { stage = "register BufferQueue callback"; goto handle_error; }
-
- result = (*playerBufferQueue)->Enqueue(playerBufferQueue, playBuffer, sizeof(playBuffer));
- if (SL_RESULT_SUCCESS != result) {
- stage = "enqueue into PlayerBufferQueue"; goto handle_error; }
-
- result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING);
- if (SL_RESULT_SUCCESS != result) {
- stage = "SetPlayState(SL_PLAYSTATE_PLAYING)"; goto handle_error; }
-
- snprintf(printBuffer, sizeof(printBuffer),
- "Success, sample rate %d, buffer samples %d", sampleRate, playSamples);
- return env->NewStringUTF(printBuffer);
-
-handle_error:
- snprintf(printBuffer, sizeof(printBuffer), "Error at %s: %s", stage, getSLErrStr(result));
- return env->NewStringUTF(printBuffer);
-}
-
-void Java_com_example_android_nativemididemo_NativeMidi_pauseAudio(
- JNIEnv*, jobject) {
- if (playerPlay != NULL) {
- (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PAUSED);
- }
-}
-
-void Java_com_example_android_nativemididemo_NativeMidi_resumeAudio(
- JNIEnv*, jobject) {
- if (playerBufferQueue != NULL && playerPlay != NULL) {
- (*playerBufferQueue)->Enqueue(playerBufferQueue, playBuffer, sizeof(playBuffer));
- (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING);
- }
-}
-
-void Java_com_example_android_nativemididemo_NativeMidi_shutdownAudio(
- JNIEnv*, jobject) {
- if (playerObject != NULL) {
- (*playerObject)->Destroy(playerObject);
- playerObject = NULL;
- playerPlay = NULL;
- playerBufferQueue = NULL;
- }
-
- if (outputMixObject != NULL) {
- (*outputMixObject)->Destroy(outputMixObject);
- outputMixObject = NULL;
- }
-
- if (engineObject != NULL) {
- (*engineObject)->Destroy(engineObject);
- engineObject = NULL;
- engineEngine = NULL;
- }
-}
-
-jlong Java_com_example_android_nativemididemo_NativeMidi_getPlaybackCounter(JNIEnv*, jobject) {
- return sharedCounter.load();
-}
-
-jobjectArray Java_com_example_android_nativemididemo_NativeMidi_getRecentMessages(
- JNIEnv* env, jobject thiz) {
- return nativemididemo::getRecentMessagesForJava(env, thiz);
-}
-
-void Java_com_example_android_nativemididemo_NativeMidi_startReadingMidi(
- JNIEnv*, jobject, jlong deviceHandle, jint portNumber) {
- char buffer[1024];
-
- midiDevice = (AMIDI_Device*)deviceHandle;
-// int result = AMIDI_getDeviceById(deviceId, &midiDevice);
-// if (result == 0) {
-// snprintf(buffer, sizeof(buffer), "Obtained device token for uid %d: token %d", deviceId, midiDevice);
-// } else {
-// snprintf(buffer, sizeof(buffer), "Could not obtain device token for uid %d: %d", deviceId, result);
-// }
- nativemididemo::writeMessage(buffer);
-// if (result) return;
-
- AMIDI_DeviceInfo deviceInfo;
- int result = AMIDI_getDeviceInfo(midiDevice, &deviceInfo);
- if (result == 0) {
- snprintf(buffer, sizeof(buffer), "Device info: uid %d, type %d, priv %d, ports %d I / %d O",
- deviceInfo.uid, deviceInfo.type, deviceInfo.isPrivate,
- (int)deviceInfo.inputPortCount, (int)deviceInfo.outputPortCount);
- } else {
- snprintf(buffer, sizeof(buffer), "Could not obtain device info %d", result);
- }
- nativemididemo::writeMessage(buffer);
- if (result) return;
-
- AMIDI_OutputPort* outputPort;
- result = AMIDI_openOutputPort(midiDevice, portNumber, &outputPort);
- if (result == 0) {
- snprintf(buffer, sizeof(buffer), "Opened port %d: token %p", portNumber, outputPort);
- midiOutputPort.store(outputPort);
- } else {
- snprintf(buffer, sizeof(buffer), "Could not open port %p: %d", midiDevice, result);
- }
- nativemididemo::writeMessage(buffer);
-}
-
-void Java_com_example_android_nativemididemo_NativeMidi_stopReadingMidi(
- JNIEnv*, jobject) {
- AMIDI_OutputPort* outputPort = midiOutputPort.exchange(AMIDI_INVALID_HANDLE);
- if (outputPort == AMIDI_INVALID_HANDLE) return;
- int result = AMIDI_closeOutputPort(outputPort);
- char buffer[1024];
- if (result == 0) {
- snprintf(buffer, sizeof(buffer), "Closed port by token %p", outputPort);
- } else {
- snprintf(buffer, sizeof(buffer), "Could not close port by token %p: %d", outputPort, result);
- }
- nativemididemo::writeMessage(buffer);
-}
diff --git a/media/tests/NativeMidiDemo/res/layout/main.xml b/media/tests/NativeMidiDemo/res/layout/main.xml
deleted file mode 100644
index 465d471a2de7..000000000000
--- a/media/tests/NativeMidiDemo/res/layout/main.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <TextView
- android:id="@+id/callback_status"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="13sp"
- android:typeface="monospace"
- />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="13sp"
- android:typeface="monospace"
- android:text=" | "
- />
- <TextView
- android:id="@+id/java_midi_status"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="13sp"
- android:typeface="monospace"
- />
- <TextView
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:textSize="13sp"
- android:typeface="monospace"
- android:text=" "
- />
- </LinearLayout>
- <HorizontalScrollView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingTop="6sp"
- android:paddingBottom="6sp"
- >
- <RadioGroup
- android:id="@+id/devices"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:checkedButton="@+id/device_none"
- >
- <RadioButton
- android:id="@+id/device_none"
- android:text="None"
- />
- </RadioGroup>
- </HorizontalScrollView>
- <com.example.android.nativemididemo.TouchableScrollView android:id="@+id/messages_scroll"
- android:layout_width="match_parent"
- android:layout_height="0px"
- android:layout_weight="1"
- >
- <TextView android:id="@+id/messages"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="13sp"
- android:typeface="monospace"
- />
- </com.example.android.nativemididemo.TouchableScrollView>
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <Button android:id="@+id/clear_messages"
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/clear_messages"
- android:onClick="onClearMessages"
- />
- <Button android:id="@+id/close_port"
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/close_port"
- android:onClick="onClosePort"
- />
- </LinearLayout>
-</LinearLayout>
diff --git a/media/tests/NativeMidiDemo/res/mipmap-hdpi/ic_launcher.png b/media/tests/NativeMidiDemo/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bcccec6..000000000000
--- a/media/tests/NativeMidiDemo/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/media/tests/NativeMidiDemo/res/mipmap-mdpi/ic_launcher.png b/media/tests/NativeMidiDemo/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0cbd379..000000000000
--- a/media/tests/NativeMidiDemo/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/media/tests/NativeMidiDemo/res/mipmap-xhdpi/ic_launcher.png b/media/tests/NativeMidiDemo/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0e7b91..000000000000
--- a/media/tests/NativeMidiDemo/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/media/tests/NativeMidiDemo/res/mipmap-xxhdpi/ic_launcher.png b/media/tests/NativeMidiDemo/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72cdd748..000000000000
--- a/media/tests/NativeMidiDemo/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/media/tests/NativeMidiDemo/res/values/strings.xml b/media/tests/NativeMidiDemo/res/values/strings.xml
deleted file mode 100644
index 5b69b52a5836..000000000000
--- a/media/tests/NativeMidiDemo/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <string name="app_name">NativeMidiDemo</string>
- <string name="clear_messages">Clear Messages</string>
- <string name="close_port">Close Port</string>
-</resources>
diff --git a/media/tests/audiotests/Android.bp b/media/tests/audiotests/Android.bp
new file mode 100644
index 000000000000..8ef7694132de
--- /dev/null
+++ b/media/tests/audiotests/Android.bp
@@ -0,0 +1,24 @@
+cc_test {
+ name: "shared_mem_test",
+ gtest: false,
+
+ srcs: ["shared_mem_test.cpp"],
+
+ shared_libs: [
+ "liblog",
+ "libcutils",
+ "libutils",
+ "libbinder",
+ "libhardware_legacy",
+ "libmedia",
+ "libaudioclient",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-error=deprecated-declarations",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/media/tests/audiotests/Android.mk b/media/tests/audiotests/Android.mk
deleted file mode 100644
index 01e42bd2e107..000000000000
--- a/media/tests/audiotests/Android.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE:= shared_mem_test
-
-LOCAL_SRC_FILES := \
- shared_mem_test.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libc \
- liblog \
- libcutils \
- libutils \
- libbinder \
- libhardware_legacy \
- libmedia \
- libaudioclient \
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_CFLAGS += -Wall -Werror -Wno-error=deprecated-declarations -Wunused -Wunreachable-code
-
-include $(BUILD_EXECUTABLE)
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index d6dcd723e721..ac5ded60bf6b 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -152,7 +152,6 @@ LIBANDROID {
AHardwareBuffer_unlock; # introduced=26
ANativeWindow_acquire;
ANativeWindow_fromSurface;
- ANativeWindow_fromSurfaceTexture; # introduced-arm=13 introduced-mips=13 introduced-x86=13
ANativeWindow_toSurface; # introduced=26
ANativeWindow_getFormat;
ANativeWindow_getHeight;
diff --git a/native/graphics/jni/Android.bp b/native/graphics/jni/Android.bp
index 0704e3545b62..942614815c3d 100644
--- a/native/graphics/jni/Android.bp
+++ b/native/graphics/jni/Android.bp
@@ -33,6 +33,7 @@ cc_library_shared {
arch: {
arm: {
// TODO: This is to work around b/24465209. Remove after root cause is fixed
+ pack_relocations: false,
ldflags: ["-Wl,--hash-style=both"],
},
},
diff --git a/native/webview/OWNERS b/native/webview/OWNERS
index 00e540a46ab2..580bb0fe8273 100644
--- a/native/webview/OWNERS
+++ b/native/webview/OWNERS
@@ -1,3 +1,4 @@
+boliu@google.com
changwan@google.com
tobiasjs@google.com
torne@google.com
diff --git a/native/webview/loader/Android.bp b/native/webview/loader/Android.bp
new file mode 100644
index 000000000000..0ba256facb6d
--- /dev/null
+++ b/native/webview/loader/Android.bp
@@ -0,0 +1,32 @@
+//
+// Copyright (C) 2017 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.
+
+// This package provides the system interfaces required to load WebView.
+
+// Loader library which handles address space reservation and relro sharing.
+// Does NOT link any native chromium code.
+cc_library_shared {
+ name: "libwebviewchromium_loader",
+
+ srcs: ["loader.cpp"],
+
+ cflags: ["-Werror"],
+
+ shared_libs: [
+ "libdl",
+ "liblog",
+ "libnativeloader",
+ ],
+}
diff --git a/native/webview/loader/Android.mk b/native/webview/loader/Android.mk
deleted file mode 100644
index e8a7d9743cb9..000000000000
--- a/native/webview/loader/Android.mk
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# Copyright (C) 2017 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.
-
-# This package provides the system interfaces required to load WebView.
-
-LOCAL_PATH := $(call my-dir)
-
-# Loader library which handles address space reservation and relro sharing.
-# Does NOT link any native chromium code.
-include $(CLEAR_VARS)
-
-LOCAL_MODULE:= libwebviewchromium_loader
-
-LOCAL_SRC_FILES := \
- loader.cpp \
-
-LOCAL_CFLAGS := \
- -Werror \
-
-LOCAL_SHARED_LIBRARIES += \
- libdl \
- liblog \
- libnativeloader \
-
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_SHARED_LIBRARY)
-
diff --git a/native/webview/plat_support/draw_gl_functor.cpp b/native/webview/plat_support/draw_gl_functor.cpp
index d54f558b9866..7cb49da483de 100644
--- a/native/webview/plat_support/draw_gl_functor.cpp
+++ b/native/webview/plat_support/draw_gl_functor.cpp
@@ -21,7 +21,6 @@
#include "draw_gl.h"
-#include <Properties.h>
#include <errno.h>
#include <jni.h>
#include <private/hwui/DrawGlInfo.h>
@@ -54,13 +53,7 @@ class DrawGLFunctor : public Functor {
}
AwDrawGLInfo aw_info;
- // TODO(boliu): Remove property check once OpenGL fallback is removed.
- auto render_pipeline_type =
- android::uirenderer::Properties::getRenderPipelineType();
- aw_info.version = (render_pipeline_type ==
- android::uirenderer::RenderPipelineType::OpenGL)
- ? 2
- : kAwDrawGLInfoVersion;
+ aw_info.version = kAwDrawGLInfoVersion;
switch (what) {
case DrawGlInfo::kModeDraw: {
aw_info.mode = AwDrawGLInfo::kModeDraw;
diff --git a/nfc-extras/Android.bp b/nfc-extras/Android.bp
new file mode 100644
index 000000000000..cbacd48b080e
--- /dev/null
+++ b/nfc-extras/Android.bp
@@ -0,0 +1,21 @@
+//
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+java_sdk_library {
+ name: "com.android.nfc_extras",
+ srcs: ["java/**/*.java"],
+ api_packages: ["com.android.nfc_extras"],
+}
diff --git a/nfc-extras/Android.mk b/nfc-extras/Android.mk
deleted file mode 100644
index 03de00cc5d41..000000000000
--- a/nfc-extras/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.android.nfc_extras
-LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := $(call all-java-files-under,java)
-include $(BUILD_JAVA_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.android.nfc_extras-stubs-gen
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_SRC_FILES := $(call all-java-files-under,java)
-# This is to reference SdkConstant annotation; not part of this lib.
-LOCAL_DROIDDOC_SOURCE_PATH := frameworks/base/core/java/android/annotation
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/com.android.nfc_extras.stubs_intermediates/src
-LOCAL_DROIDDOC_OPTIONS:= \
- -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \
- -stubpackages com.android.nfc_extras \
- -nodocs
-LOCAL_UNINSTALLABLE_MODULE := true
-include $(BUILD_DROIDDOC)
-com_android_nfc_extras_gen_stamp := $(full_target)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.android.nfc_extras.stubs
-# This is to reference SdkConstant annotation; not part of this lib.
-LOCAL_SRC_FILES := ../core/java/android/annotation/SdkConstant.java
-LOCAL_SDK_VERSION := current
-LOCAL_ADDITIONAL_DEPENDENCIES := $(com_android_nfc_extras_gen_stamp)
-com_android_nfc_extras_gen_stamp :=
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/nfc-extras/api/current.txt b/nfc-extras/api/current.txt
new file mode 100644
index 000000000000..066b7b58267e
--- /dev/null
+++ b/nfc-extras/api/current.txt
@@ -0,0 +1,60 @@
+package com.android.nfc_extras {
+
+ public class EeAlreadyOpenException extends com.android.nfc_extras.EeIOException {
+ ctor public EeAlreadyOpenException();
+ ctor public EeAlreadyOpenException(java.lang.String);
+ }
+
+ public class EeExternalFieldException extends com.android.nfc_extras.EeIOException {
+ ctor public EeExternalFieldException();
+ ctor public EeExternalFieldException(java.lang.String);
+ }
+
+ public class EeIOException extends java.io.IOException {
+ ctor public EeIOException();
+ ctor public EeIOException(java.lang.String);
+ }
+
+ public class EeInitializationException extends com.android.nfc_extras.EeIOException {
+ ctor public EeInitializationException();
+ ctor public EeInitializationException(java.lang.String);
+ }
+
+ public class EeListenModeException extends com.android.nfc_extras.EeIOException {
+ ctor public EeListenModeException();
+ ctor public EeListenModeException(java.lang.String);
+ }
+
+ public class EeNfcDisabledException extends com.android.nfc_extras.EeIOException {
+ ctor public EeNfcDisabledException();
+ ctor public EeNfcDisabledException(java.lang.String);
+ }
+
+ public final class NfcAdapterExtras {
+ method public void authenticate(byte[]);
+ method public static com.android.nfc_extras.NfcAdapterExtras get(android.nfc.NfcAdapter);
+ method public com.android.nfc_extras.NfcAdapterExtras.CardEmulationRoute getCardEmulationRoute();
+ method public java.lang.String getDriverName();
+ method public com.android.nfc_extras.NfcExecutionEnvironment getEmbeddedExecutionEnvironment();
+ method public void setCardEmulationRoute(com.android.nfc_extras.NfcAdapterExtras.CardEmulationRoute);
+ field public static final java.lang.String ACTION_RF_FIELD_OFF_DETECTED = "com.android.nfc_extras.action.RF_FIELD_OFF_DETECTED";
+ field public static final java.lang.String ACTION_RF_FIELD_ON_DETECTED = "com.android.nfc_extras.action.RF_FIELD_ON_DETECTED";
+ }
+
+ public static final class NfcAdapterExtras.CardEmulationRoute {
+ ctor public NfcAdapterExtras.CardEmulationRoute(int, com.android.nfc_extras.NfcExecutionEnvironment);
+ field public static final int ROUTE_OFF = 1; // 0x1
+ field public static final int ROUTE_ON_WHEN_SCREEN_ON = 2; // 0x2
+ field public final com.android.nfc_extras.NfcExecutionEnvironment nfcEe;
+ field public final int route;
+ }
+
+ public class NfcExecutionEnvironment {
+ method public void close() throws java.io.IOException;
+ method public void open() throws com.android.nfc_extras.EeIOException;
+ method public byte[] transceive(byte[]) throws java.io.IOException;
+ field public static final java.lang.String ACTION_AID_SELECTED = "com.android.nfc_extras.action.AID_SELECTED";
+ }
+
+}
+
diff --git a/nfc-extras/api/removed.txt b/nfc-extras/api/removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/nfc-extras/api/removed.txt
diff --git a/nfc-extras/api/system-current.txt b/nfc-extras/api/system-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/nfc-extras/api/system-current.txt
diff --git a/nfc-extras/api/system-removed.txt b/nfc-extras/api/system-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/nfc-extras/api/system-removed.txt
diff --git a/nfc-extras/api/test-current.txt b/nfc-extras/api/test-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/nfc-extras/api/test-current.txt
diff --git a/nfc-extras/api/test-removed.txt b/nfc-extras/api/test-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/nfc-extras/api/test-removed.txt
diff --git a/obex/Android.bp b/obex/Android.bp
new file mode 100644
index 000000000000..6558eb36d001
--- /dev/null
+++ b/obex/Android.bp
@@ -0,0 +1,21 @@
+//
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+java_sdk_library {
+ name: "javax.obex",
+ srcs: ["javax/**/*.java"],
+ api_packages: ["javax.obex"],
+}
diff --git a/obex/Android.mk b/obex/Android.mk
deleted file mode 100644
index e7c1fd34dd74..000000000000
--- a/obex/Android.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_MODULE:= javax.obex
-
-include $(BUILD_JAVA_LIBRARY)
-
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_MODULE:= javax.obexstatic
-
-include $(BUILD_STATIC_JAVA_LIBRARY) \ No newline at end of file
diff --git a/packages/CtsShim/build/jni/Android.mk b/obex/CleanSpec.mk
index 968fc0bb8203..c104234e4fd9 100644
--- a/packages/CtsShim/build/jni/Android.mk
+++ b/obex/CleanSpec.mk
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2017 The Android Open Source Project
+# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -14,14 +14,5 @@
# limitations under the License.
#
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libshim_jni
-
-LOCAL_SRC_FILES := Shim.c
-
-LOCAL_SDK_VERSION := 24
-
-include $(BUILD_SHARED_LIBRARY)
+# runtime lib is renamed from javax.obex.jar to javax.obex.impl.jar
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/javax.obex.jar)
diff --git a/obex/api/current.txt b/obex/api/current.txt
new file mode 100644
index 000000000000..1cd562feff8d
--- /dev/null
+++ b/obex/api/current.txt
@@ -0,0 +1,12 @@
+package javax.obex {
+
+ public class ObexPacket {
+ method public static javax.obex.ObexPacket read(java.io.InputStream) throws java.io.IOException;
+ method public static javax.obex.ObexPacket read(int, java.io.InputStream) throws java.io.IOException;
+ field public int mHeaderId;
+ field public int mLength;
+ field public byte[] mPayload;
+ }
+
+}
+
diff --git a/obex/api/removed.txt b/obex/api/removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/obex/api/removed.txt
diff --git a/obex/api/system-current.txt b/obex/api/system-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/obex/api/system-current.txt
diff --git a/obex/api/system-removed.txt b/obex/api/system-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/obex/api/system-removed.txt
diff --git a/obex/api/test-current.txt b/obex/api/test-current.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/obex/api/test-current.txt
diff --git a/obex/api/test-removed.txt b/obex/api/test-removed.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/obex/api/test-removed.txt
diff --git a/packages/BackupRestoreConfirmation/res/values-pt-rBR/strings.xml b/packages/BackupRestoreConfirmation/res/values-pt-rBR/strings.xml
index baa4867ec433..d7c56b856e07 100644
--- a/packages/BackupRestoreConfirmation/res/values-pt-rBR/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-pt-rBR/strings.xml
@@ -28,7 +28,7 @@
<string name="device_encryption_restore_text" msgid="1570864916855208992">"Insira sua senha de criptografia do dispositivo abaixo."</string>
<string name="device_encryption_backup_text" msgid="5866590762672844664">"Insira sua senha de criptografia do dispositivo abaixo. Ela também será usada para criptografar o arquivo de backup."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Digite uma senha para usar para criptografar os dados de backup por completo. Se isso for deixado em branco, sua senha atual de backup será usada:"</string>
- <string name="backup_enc_password_optional" msgid="1350137345907579306">"Se você deseja criptografar os dados de backup por completo, digite uma senha abaixo:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Se você quer criptografar os dados de backup por completo, digite uma senha abaixo:"</string>
<string name="backup_enc_password_required" msgid="7889652203371654149">"Como seu dispositivo está criptografado, é necessário criptografar seu backup. Insira uma senha abaixo:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Se os dados restaurados forem criptografada, digite a senha abaixo:"</string>
<string name="toast_backup_started" msgid="550354281452756121">"Iniciando backup..."</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-pt/strings.xml b/packages/BackupRestoreConfirmation/res/values-pt/strings.xml
index baa4867ec433..d7c56b856e07 100644
--- a/packages/BackupRestoreConfirmation/res/values-pt/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-pt/strings.xml
@@ -28,7 +28,7 @@
<string name="device_encryption_restore_text" msgid="1570864916855208992">"Insira sua senha de criptografia do dispositivo abaixo."</string>
<string name="device_encryption_backup_text" msgid="5866590762672844664">"Insira sua senha de criptografia do dispositivo abaixo. Ela também será usada para criptografar o arquivo de backup."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Digite uma senha para usar para criptografar os dados de backup por completo. Se isso for deixado em branco, sua senha atual de backup será usada:"</string>
- <string name="backup_enc_password_optional" msgid="1350137345907579306">"Se você deseja criptografar os dados de backup por completo, digite uma senha abaixo:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Se você quer criptografar os dados de backup por completo, digite uma senha abaixo:"</string>
<string name="backup_enc_password_required" msgid="7889652203371654149">"Como seu dispositivo está criptografado, é necessário criptografar seu backup. Insira uma senha abaixo:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Se os dados restaurados forem criptografada, digite a senha abaixo:"</string>
<string name="toast_backup_started" msgid="550354281452756121">"Iniciando backup..."</string>
diff --git a/packages/CaptivePortalLogin/Android.mk b/packages/CaptivePortalLogin/Android.mk
index 8a96b1693dc1..3ea334011041 100644
--- a/packages/CaptivePortalLogin/Android.mk
+++ b/packages/CaptivePortalLogin/Android.mk
@@ -2,7 +2,9 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 services.net
+LOCAL_USE_AAPT2 := true
+LOCAL_STATIC_ANDROID_LIBRARIES := androidx.legacy_legacy-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES := services.net
LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/packages/CaptivePortalLogin/AndroidManifest.xml b/packages/CaptivePortalLogin/AndroidManifest.xml
index 72e37ed4756e..9ecaa03d6e53 100644
--- a/packages/CaptivePortalLogin/AndroidManifest.xml
+++ b/packages/CaptivePortalLogin/AndroidManifest.xml
@@ -22,8 +22,8 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
- <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
<uses-permission android:name="android.permission.NETWORK_BYPASS_PRIVATE_DNS" />
+ <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
<application android:label="@string/app_name"
android:usesCleartextTraffic="true">
diff --git a/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml b/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml
index c292323b60c4..f095d4e15b01 100644
--- a/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml
+++ b/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml
@@ -27,7 +27,7 @@
android:layout_height="wrap_content" />
</FrameLayout>
- <android.support.v4.widget.SwipeRefreshLayout
+ <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -37,7 +37,7 @@
android:layout_height="match_parent"
android:layout_alignParentBottom="false"
android:layout_alignParentRight="false" />
- </android.support.v4.widget.SwipeRefreshLayout>
+ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>
</FrameLayout>
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index 3630005416be..9f89d3cf14b9 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -39,7 +39,7 @@ import android.net.wifi.WifiInfo;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
-import android.support.v4.widget.SwipeRefreshLayout;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
diff --git a/packages/CarSystemUI/Android.mk b/packages/CarSystemUI/Android.mk
new file mode 100644
index 000000000000..0d40b7f22c5b
--- /dev/null
+++ b/packages/CarSystemUI/Android.mk
@@ -0,0 +1,86 @@
+# LOCAL_PATH is not the current directory of this file.
+# If you need the local path, use CAR_SYSUI_PATH.
+# This tweak ensures that the resource overlay that is device-specific still works
+# which requires that LOCAL_PATH match the original path (which must be frameworks/base/packages/SystemUI).
+#
+# For clarity, we also define SYSTEM_UI_AOSP_PATH to frameworks/base/packages/SystemUI and refer to that
+SYSTEM_UI_AOSP_PATH := frameworks/base/packages/SystemUI
+SYSTEM_UI_CAR_PATH := frameworks/base/packages/CarSystemUI
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_USE_AAPT2 := true
+
+LOCAL_MODULE_TAGS := optional
+
+# The same as SYSTEM_UI_AOSP_PATH but based on the value of LOCAL_PATH which is
+# frameworks/base/packages/CarSystemUI.
+RELATIVE_SYSTEM_UI_AOSP_PATH := ../../../../$(SYSTEM_UI_AOSP_PATH)
+
+
+LOCAL_SRC_FILES := \
+ $(call all-java-files-under, src) \
+ $(call all-Iaidl-files-under, src) \
+ $(call all-java-files-under, $(RELATIVE_SYSTEM_UI_AOSP_PATH)/src) \
+ $(call all-Iaidl-files-under, $(RELATIVE_SYSTEM_UI_AOSP_PATH)/src)
+
+LOCAL_STATIC_ANDROID_LIBRARIES := \
+ SystemUIPluginLib \
+ SystemUISharedLib \
+ androidx.car_car \
+ androidx.legacy_legacy-support-v4 \
+ androidx.recyclerview_recyclerview \
+ androidx.preference_preference \
+ androidx.appcompat_appcompat \
+ androidx.mediarouter_mediarouter \
+ androidx.palette_palette \
+ androidx.legacy_legacy-preference-v14 \
+ androidx.leanback_leanback \
+ androidx.slice_slice-core \
+ androidx.slice_slice-view \
+ androidx.slice_slice-builders \
+ androidx.arch.core_core-runtime \
+ androidx.lifecycle_lifecycle-extensions \
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ SystemUI-tags \
+ SystemUI-proto
+
+LOCAL_JAVA_LIBRARIES := telephony-common \
+ android.car
+
+LOCAL_FULL_LIBS_MANIFEST_FILES := $(SYSTEM_UI_AOSP_PATH)/AndroidManifest.xml
+LOCAL_MANIFEST_FILE := AndroidManifest.xml
+
+LOCAL_MODULE_OWNER := google
+LOCAL_PACKAGE_NAME := CarSystemUI
+LOCAL_PRIVATE_PLATFORM_APIS := true
+LOCAL_CERTIFICATE := platform
+LOCAL_PRIVILEGED_MODULE := true
+
+LOCAL_PROGUARD_FLAG_FILES := $(RELATIVE_SYSTEM_UI_AOSP_PATH)/proguard.flags \
+ proguard.flags
+
+LOCAL_RESOURCE_DIR := \
+ $(LOCAL_PATH)/res \
+ $(SYSTEM_UI_AOSP_PATH)/res-keyguard \
+ $(SYSTEM_UI_AOSP_PATH)/res
+
+ifneq ($(INCREMENTAL_BUILDS),)
+ LOCAL_PROGUARD_ENABLED := disabled
+ LOCAL_JACK_ENABLED := incremental
+endif
+
+LOCAL_DX_FLAGS := --multi-dex
+LOCAL_JACK_FLAGS := --multi-dex native
+
+include frameworks/base/packages/SettingsLib/common.mk
+
+LOCAL_OVERRIDES_PACKAGES := SystemUI
+
+LOCAL_AAPT_FLAGS := --extra-packages com.android.keyguard
+
+include $(BUILD_PACKAGE)
+
+include $(call all-makefiles-under, $(SYSTEM_UI_CAR_PATH))
diff --git a/packages/CarSystemUI/AndroidManifest.xml b/packages/CarSystemUI/AndroidManifest.xml
new file mode 100644
index 000000000000..4e8a3a3885a7
--- /dev/null
+++ b/packages/CarSystemUI/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ package="com.android.systemui"
+ android:sharedUserId="android.uid.systemui"
+ coreApp="true">
+
+
+</manifest>
diff --git a/packages/CarSystemUI/proguard.flags b/packages/CarSystemUI/proguard.flags
new file mode 100644
index 000000000000..ceb037cdb70f
--- /dev/null
+++ b/packages/CarSystemUI/proguard.flags
@@ -0,0 +1 @@
+-keep class com.android.systemui.CarSystemUIFactory
diff --git a/packages/CarSystemUI/res/drawable/car_ic_apps.xml b/packages/CarSystemUI/res/drawable/car_ic_apps.xml
new file mode 100644
index 000000000000..13b543b2ee60
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_apps.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="33dp"
+ android:height="33dp"
+ android:viewportHeight="33.0"
+ android:viewportWidth="33.0">
+ <path
+ android:fillColor="@color/car_nav_icon_fill_color"
+ android:fillType="evenOdd"
+ android:pathData="M1,20L12,20C12.55,20 13,20.45 13,21L13,32C13,32.55 12.55,33 12,33L1,33C0.45,33 0,32.55 0,32L0,21C0,20.45 0.45,20 1,20ZM21,20L32,20C32.55,20 33,20.45 33,21L33,32C33,32.55 32.55,33 32,33L21,33C20.45,33 20,32.55 20,32L20,21C20,20.45 20.45,20 21,20ZM1,0L12,0C12.55,0 13,0.45 13,1L13,12C13,12.55 12.55,13 12,13L1,13C0.45,13 0,12.55 0,12L0,1C0,0.45 0.45,0 1,0ZM21,0L32,0C32.55,0 33,0.45 33,1L33,12C33,12.55 32.55,13 32,13L21,13C20.45,13 20,12.55 20,12L20,1C20,0.45 20.45,0 21,0Z"
+ android:strokeColor="@color/car_nav_icon_fill_color"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_apps_black.xml b/packages/CarSystemUI/res/drawable/car_ic_apps_black.xml
new file mode 100644
index 000000000000..498d36621766
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_apps_black.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="33dp"
+ android:height="33dp"
+ android:viewportHeight="33.0"
+ android:viewportWidth="33.0">
+ <path
+ android:fillColor="#FF000000"
+ android:fillType="evenOdd"
+ android:pathData="M1,20L12,20C12.55,20 13,20.45 13,21L13,32C13,32.55 12.55,33 12,33L1,33C0.45,33 0,32.55 0,32L0,21C0,20.45 0.45,20 1,20ZM21,20L32,20C32.55,20 33,20.45 33,21L33,32C33,32.55 32.55,33 32,33L21,33C20.45,33 20,32.55 20,32L20,21C20,20.45 20.45,20 21,20ZM1,0L12,0C12.55,0 13,0.45 13,1L13,12C13,12.55 12.55,13 12,13L1,13C0.45,13 0,12.55 0,12L0,1C0,0.45 0.45,0 1,0ZM21,0L32,0C32.55,0 33,0.45 33,1L33,12C33,12.55 32.55,13 32,13L21,13C20.45,13 20,12.55 20,12L20,1C20,0.45 20.45,0 21,0Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_apps_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_apps_selected.xml
new file mode 100644
index 000000000000..250bfe8668fb
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_apps_selected.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/car_ic_selection_bg" android:gravity="center"/>
+ <item android:drawable="@drawable/car_ic_apps_black" android:gravity="center"/>
+</layer-list>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_music.xml b/packages/CarSystemUI/res/drawable/car_ic_music.xml
new file mode 100644
index 000000000000..8c1549470a0e
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_music.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="34dp"
+ android:height="39dp"
+ android:viewportHeight="39.0"
+ android:viewportWidth="34.0">
+ <path
+ android:fillColor="@color/car_nav_icon_fill_color"
+ android:fillType="evenOdd"
+ android:pathData="M23,25L31,23L31,9L12,12L12,38C12,38.45 11.45,39 11,39L1,39C0.55,39 0.01,38.87 0,38.3C0,38.3 0,35.87 0,31C0,30.42 0.62,30.08 1,30L9,28L9,4.85C9,4.36 9.36,3.94 9.84,3.87L32.84,0.19C33.39,0.1 33.9,0.47 33.99,1.01C34,1.07 34,1.12 34,1.17L34,33.06C34,33.51 33.45,34 33,34L23,34C22.55,34 22,33.51 22,33.06L22,26C22,25.61 22.16,25.18 23,25Z"
+ android:strokeColor="@color/car_nav_icon_fill_color"
+ android:strokeWidth="1"/>
+ <path
+ android:fillColor="@color/car_nav_icon_fill_color"
+ android:fillType="evenOdd"
+ android:pathData="M23.57,26.48L23.57,32.42L32.42,32.42L32.42,24.27L23.57,26.48ZM32.42,7.18L32.42,1.85L10.57,5.34L10.57,10.63L32.42,7.18ZM10.42,29.27L9.38,29.53L1.58,31.48C1.58,34.35 1.58,34.45 1.57,36.48C1.58,36.89 1.58,37.2 1.58,37.43L10.42,37.43L10.42,29.27Z"
+ android:strokeColor="@color/car_nav_icon_fill_color"
+ android:strokeWidth="3.15"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_music_black.xml b/packages/CarSystemUI/res/drawable/car_ic_music_black.xml
new file mode 100644
index 000000000000..64287a549314
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_music_black.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="34dp"
+ android:height="39dp"
+ android:viewportHeight="39.0"
+ android:viewportWidth="34.0">
+ <path
+ android:fillColor="#FF000000"
+ android:fillType="evenOdd"
+ android:pathData="M23,25L31,23L31,9L12,12L12,38C12,38.45 11.45,39 11,39L1,39C0.55,39 0.01,38.87 0,38.3C0,38.3 0,35.87 0,31C0,30.42 0.62,30.08 1,30L9,28L9,4.85C9,4.36 9.36,3.94 9.84,3.87L32.84,0.19C33.39,0.1 33.9,0.47 33.99,1.01C34,1.07 34,1.12 34,1.17L34,33.06C34,33.51 33.45,34 33,34L23,34C22.55,34 22,33.51 22,33.06L22,26C22,25.61 22.16,25.18 23,25Z"
+ android:strokeColor="#FF000000"
+ android:strokeWidth="1"/>
+ <path
+ android:fillColor="#FF000000"
+ android:fillType="evenOdd"
+ android:pathData="M23.57,26.48L23.57,32.42L32.42,32.42L32.42,24.27L23.57,26.48ZM32.42,7.18L32.42,1.85L10.57,5.34L10.57,10.63L32.42,7.18ZM10.42,29.27L9.38,29.53L1.58,31.48C1.58,34.35 1.58,34.45 1.57,36.48C1.58,36.89 1.58,37.2 1.58,37.43L10.42,37.43L10.42,29.27Z"
+ android:strokeColor="#FF000000"
+ android:strokeWidth="3.15"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_music_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_music_selected.xml
new file mode 100644
index 000000000000..9703a8c57174
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_music_selected.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/car_ic_selection_bg" android:gravity="center"/>
+ <item android:drawable="@drawable/car_ic_music_black" android:gravity="center"/>
+</layer-list>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_navigation.xml b/packages/CarSystemUI/res/drawable/car_ic_navigation.xml
new file mode 100644
index 000000000000..58667beb98d9
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_navigation.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="37dp"
+ android:viewportHeight="37.0"
+ android:viewportWidth="32.0">
+ <path
+ android:fillColor="@color/car_nav_icon_fill_color"
+ android:fillType="evenOdd"
+ android:pathData="M16.62,0.61L31.33,35.21C31.55,35.72 31.31,36.3 30.8,36.52C30.48,36.66 30.12,36.62 29.83,36.42L15.7,26.44L1.58,36.42C1.13,36.73 0.5,36.63 0.18,36.18C-0.02,35.89 -0.06,35.53 0.08,35.21L14.78,0.61C15,0.1 15.59,-0.14 16.1,0.08C16.33,0.18 16.52,0.37 16.62,0.61Z"
+ android:strokeColor="@color/car_nav_icon_fill_color"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_navigation_black.xml b/packages/CarSystemUI/res/drawable/car_ic_navigation_black.xml
new file mode 100644
index 000000000000..145d4c912ff0
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_navigation_black.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="37dp"
+ android:viewportHeight="37.0"
+ android:viewportWidth="32.0">
+ <path
+ android:fillColor="#FF000000"
+ android:fillType="evenOdd"
+ android:pathData="M16.62,0.61L31.33,35.21C31.55,35.72 31.31,36.3 30.8,36.52C30.48,36.66 30.12,36.62 29.83,36.42L15.7,26.44L1.58,36.42C1.13,36.73 0.5,36.63 0.18,36.18C-0.02,35.89 -0.06,35.53 0.08,35.21L14.78,0.61C15,0.1 15.59,-0.14 16.1,0.08C16.33,0.18 16.52,0.37 16.62,0.61Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_navigation_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_navigation_selected.xml
new file mode 100644
index 000000000000..f0174db25312
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_navigation_selected.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/car_ic_selection_bg" android:gravity="center"/>
+ <item android:drawable="@drawable/car_ic_navigation_black" android:gravity="center"/>
+</layer-list> \ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_notification.xml b/packages/CarSystemUI/res/drawable/car_ic_notification.xml
new file mode 100644
index 000000000000..f96b05038edb
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_notification.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="38dp"
+ android:viewportHeight="38.0"
+ android:viewportWidth="32.0">
+ <path
+ android:fillColor="@color/car_nav_icon_fill_color"
+ android:fillType="evenOdd"
+ android:pathData="M20.62,3.98C25.51,5.85 28.98,10.61 28.98,16.18L28.98,24.95L32,24.95L32,31.22L0,31.22L0,24.95L3.02,24.95L3.02,16.18C3.02,10.61 6.49,5.85 11.38,3.98C11.72,1.73 13.66,0 16,0C18.34,0 20.28,1.73 20.62,3.98ZM11.33,33.3L20.67,33.3C20.67,35.9 18.58,38 16,38C13.42,38 11.33,35.9 11.33,33.3Z"
+ android:strokeColor="@color/car_nav_icon_fill_color"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_notification_black.xml b/packages/CarSystemUI/res/drawable/car_ic_notification_black.xml
new file mode 100644
index 000000000000..5f8df8829b40
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_notification_black.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="38dp"
+ android:viewportHeight="38.0"
+ android:viewportWidth="32.0">
+ <path
+ android:fillColor="#000000"
+ android:fillType="evenOdd"
+ android:pathData="M20.62,3.98C25.51,5.85 28.98,10.61 28.98,16.18L28.98,24.95L32,24.95L32,31.22L0,31.22L0,24.95L3.02,24.95L3.02,16.18C3.02,10.61 6.49,5.85 11.38,3.98C11.72,1.73 13.66,0 16,0C18.34,0 20.28,1.73 20.62,3.98ZM11.33,33.3L20.67,33.3C20.67,35.9 18.58,38 16,38C13.42,38 11.33,35.9 11.33,33.3Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_notification_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_notification_selected.xml
new file mode 100644
index 000000000000..02eec9351208
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_notification_selected.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/car_ic_selection_bg" android:gravity="center"/>
+ <item android:drawable="@drawable/car_ic_notification_black" android:gravity="center"/>
+</layer-list> \ No newline at end of file
diff --git a/packages/CarSystemUI/res/drawable/car_ic_overview.xml b/packages/CarSystemUI/res/drawable/car_ic_overview.xml
new file mode 100644
index 000000000000..590109a0735e
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_overview.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="39dp"
+ android:height="40dp"
+ android:viewportHeight="40.0"
+ android:viewportWidth="39.0">
+ <path
+ android:fillColor="@color/car_nav_icon_fill_color"
+ android:fillType="evenOdd"
+ android:pathData="M33.4,22.74L33.4,37.74C33.4,38.84 32.51,39.74 31.4,39.74L24.4,39.74L24.4,24.74L14.4,24.74L14.4,39.74L7.4,39.74C6.3,39.74 5.4,38.84 5.4,37.74L5.4,22.74L0.5,22.74C0.22,22.74 0,22.51 0,22.24C0,22.12 0.04,22 0.12,21.91L19.03,0.17C19.21,-0.04 19.52,-0.06 19.73,0.12C19.75,0.14 19.76,0.15 19.78,0.17L38.68,21.91C38.86,22.12 38.84,22.43 38.63,22.62C38.54,22.69 38.43,22.74 38.31,22.74L33.4,22.74Z"
+ android:strokeColor="@color/car_nav_icon_fill_color"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_overview_black.xml b/packages/CarSystemUI/res/drawable/car_ic_overview_black.xml
new file mode 100644
index 000000000000..48cff978ec79
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_overview_black.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="39dp"
+ android:height="40dp"
+ android:viewportHeight="40.0"
+ android:viewportWidth="39.0">
+ <path
+ android:fillColor="#FF000000"
+ android:fillType="evenOdd"
+ android:pathData="M33.4,22.74L33.4,37.74C33.4,38.84 32.51,39.74 31.4,39.74L24.4,39.74L24.4,24.74L14.4,24.74L14.4,39.74L7.4,39.74C6.3,39.74 5.4,38.84 5.4,37.74L5.4,22.74L0.5,22.74C0.22,22.74 0,22.51 0,22.24C0,22.12 0.04,22 0.12,21.91L19.03,0.17C19.21,-0.04 19.52,-0.06 19.73,0.12C19.75,0.14 19.76,0.15 19.78,0.17L38.68,21.91C38.86,22.12 38.84,22.43 38.63,22.62C38.54,22.69 38.43,22.74 38.31,22.74L33.4,22.74Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_overview_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_overview_selected.xml
new file mode 100644
index 000000000000..18ebf0c6a4f8
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_overview_selected.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/car_ic_selection_bg" android:gravity="center"/>
+ <item android:drawable="@drawable/car_ic_overview_black" android:gravity="center"/>
+</layer-list>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_phone.xml b/packages/CarSystemUI/res/drawable/car_ic_phone.xml
new file mode 100644
index 000000000000..70916703f882
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_phone.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="40dp"
+ android:height="40dp"
+ android:viewportHeight="40.0"
+ android:viewportWidth="40.0">
+ <path
+ android:fillColor="@color/car_nav_icon_fill_color"
+ android:fillType="nonZero"
+ android:pathData="M21.31,35.75L21.3,35.76L3.46,17.92L0.03,6.25C-0.16,5.32 0.53,3.88 1.41,3.51C6.36,1.25 8.88,0.1 8.95,0.08C10.02,-0.23 11.39,0.39 11.7,1.45L13.76,10.37C13.97,11.1 13.62,11.91 13.07,12.43L8.24,17.25L22.31,31.32L27.13,26.49C27.65,25.94 28.47,25.6 29.19,25.81L38.11,27.87C39.18,28.17 39.79,29.55 39.49,30.61C39.46,30.69 38.32,33.2 36.05,38.16C35.68,39.04 34.25,39.73 33.31,39.53L21.65,36.1C21.51,35.96 21.4,35.84 21.31,35.75Z"
+ android:strokeColor="@color/car_nav_icon_fill_color"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_phone_black.xml b/packages/CarSystemUI/res/drawable/car_ic_phone_black.xml
new file mode 100644
index 000000000000..087eebb2bd0a
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_phone_black.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="40dp"
+ android:height="40dp"
+ android:viewportHeight="40.0"
+ android:viewportWidth="40.0">
+ <path
+ android:fillColor="#FF000000"
+ android:fillType="nonZero"
+ android:pathData="M21.31,35.75L21.3,35.76L3.46,17.92L0.03,6.25C-0.16,5.32 0.53,3.88 1.41,3.51C6.36,1.25 8.88,0.1 8.95,0.08C10.02,-0.23 11.39,0.39 11.7,1.45L13.76,10.37C13.97,11.1 13.62,11.91 13.07,12.43L8.24,17.25L22.31,31.32L27.13,26.49C27.65,25.94 28.47,25.6 29.19,25.81L38.11,27.87C39.18,28.17 39.79,29.55 39.49,30.61C39.46,30.69 38.32,33.2 36.05,38.16C35.68,39.04 34.25,39.73 33.31,39.53L21.65,36.1C21.51,35.96 21.4,35.84 21.31,35.75Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_phone_selected.xml b/packages/CarSystemUI/res/drawable/car_ic_phone_selected.xml
new file mode 100644
index 000000000000..197eac0204e5
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_phone_selected.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/car_ic_selection_bg" android:gravity="center"/>
+ <item android:drawable="@drawable/car_ic_phone_black" android:gravity="center"/>
+</layer-list>
diff --git a/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml b/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml
new file mode 100644
index 000000000000..781beaf96264
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_ic_selection_bg.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="70dp"
+ android:height="70dp"
+ android:viewportHeight="70.0"
+ android:viewportWidth="70.0">
+ <path
+ android:fillColor="@color/car_accent"
+ android:fillType="evenOdd"
+ android:pathData="M4,0L66,0A4,4 0,0 1,70 4L70,66A4,4 0,0 1,66 70L4,70A4,4 0,0 1,0 66L0,4A4,4 0,0 1,4 0z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml b/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml
new file mode 100644
index 000000000000..1a9b8a521d78
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/car_seekbar_thumb.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <padding
+ android:bottom="@dimen/car_padding_1"
+ android:left="@dimen/car_padding_1"
+ android:right="@dimen/car_padding_1"
+ android:top="@dimen/car_padding_1"/>
+ <solid android:color="@android:color/black"/>
+ </shape>
+ </item>
+ <item>
+ <shape android:shape="oval">
+ <solid android:color="@color/car_accent"/>
+ <size
+ android:width="@dimen/car_seekbar_thumb_size"
+ android:height="@dimen/car_seekbar_thumb_size"/>
+ </shape>
+ </item>
+</layer-list>
diff --git a/packages/CarSystemUI/res/drawable/ic_mic_white.xml b/packages/CarSystemUI/res/drawable/ic_mic_white.xml
new file mode 100644
index 000000000000..f5a91b5ded32
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/ic_mic_white.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+ <path
+ android:pathData="M24,28c3.31,0 5.98,-2.69 5.98,-6L30,10c0,-3.32 -2.68,-6 -6,-6 -3.31,0 -6,2.68 -6,6v12c0,3.31 2.69,6 6,6zM34.6,22c0,6 -5.07,10.2 -10.6,10.2 -5.52,0 -10.6,-4.2 -10.6,-10.2L10,22c0,6.83 5.44,12.47 12,13.44L22,42h4v-6.56c6.56,-0.97 12,-6.61 12,-13.44h-3.4z"
+ android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/CarSystemUI/res/drawable/nav_button_background.xml b/packages/CarSystemUI/res/drawable/nav_button_background.xml
new file mode 100644
index 000000000000..376347cdf4a9
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/nav_button_background.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/nav_bar_ripple_background_color">
+ <item android:id="@android:id/mask">
+ <shape android:shape="rectangle">
+ <solid android:color="?android:colorAccent"/>
+ <corners android:radius="6dp"/>
+ </shape>
+ </item>
+</ripple>
diff --git a/packages/CarSystemUI/res/drawable/notification_material_bg.xml b/packages/CarSystemUI/res/drawable/notification_material_bg.xml
new file mode 100644
index 000000000000..03746c8bfe4d
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/notification_material_bg.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/notification_ripple_untinted_color">
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/notification_material_background_color"/>
+ <corners
+ android:radius="@dimen/notification_shadow_radius"/>
+ </shape>
+ </item>
+</ripple>
diff --git a/packages/CarSystemUI/res/drawable/notification_material_bg_dim.xml b/packages/CarSystemUI/res/drawable/notification_material_bg_dim.xml
new file mode 100644
index 000000000000..03746c8bfe4d
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/notification_material_bg_dim.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/notification_ripple_untinted_color">
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/notification_material_background_color"/>
+ <corners
+ android:radius="@dimen/notification_shadow_radius"/>
+ </shape>
+ </item>
+</ripple>
diff --git a/packages/CarSystemUI/res/drawable/volume_dialog_background.xml b/packages/CarSystemUI/res/drawable/volume_dialog_background.xml
new file mode 100644
index 000000000000..fa3ca8f27fc9
--- /dev/null
+++ b/packages/CarSystemUI/res/drawable/volume_dialog_background.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="?android:attr/colorBackgroundFloating"/>
+ <padding
+ android:bottom="5dp"
+ android:left="5dp"
+ android:right="5dp"
+ android:top="5dp"/>
+ <corners android:bottomLeftRadius="20dp"
+ android:bottomRightRadius="20dp"/>
+</shape>
diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_navigation_bar.xml
new file mode 100644
index 000000000000..b67ce15f80b0
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/car_navigation_bar.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<com.android.systemui.statusbar.car.CarNavigationBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@android:color/black"
+ android:orientation="vertical">
+ <LinearLayout
+ android:id="@id/nav_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingStart="20dp"
+ android:paddingEnd="20dp"
+ android:gravity="center">
+
+ <com.android.systemui.statusbar.car.CarFacetButton
+ android:id="@+id/home"
+ style="@style/NavigationBarButton"
+ systemui:componentNames="com.android.car.carlauncher/.CarLauncher"
+ systemui:icon="@drawable/car_ic_overview"
+ systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
+ systemui:longIntent="intent:#Intent;action=com.google.android.demandspace.START;end"
+ systemui:selectedIcon="@drawable/car_ic_overview_selected"
+ systemui:useMoreIcon="false"
+ />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <com.android.systemui.statusbar.car.CarFacetButton
+ android:id="@+id/maps_nav"
+ style="@style/NavigationBarButton"
+ systemui:categories="android.intent.category.APP_MAPS"
+ systemui:icon="@drawable/car_ic_navigation"
+ systemui:intent="intent:#Intent;component=com.android.car.carlauncher/.CarLauncher;category=android.intent.category.APP_MAPS;launchFlags=0x24000000;end"
+ systemui:selectedIcon="@drawable/car_ic_navigation_selected"
+ systemui:useMoreIcon="false"
+ />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <com.android.systemui.statusbar.car.CarFacetButton
+ android:id="@+id/music_nav"
+ style="@style/NavigationBarButton"
+ systemui:icon="@drawable/car_ic_music"
+ systemui:intent="intent:#Intent;component=com.android.car.media/.MediaActivity;launchFlags=0x14000000;end"
+ systemui:packages="com.android.car.media"
+ systemui:selectedIcon="@drawable/car_ic_music_selected"
+ systemui:useMoreIcon="false"
+ />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <com.android.systemui.statusbar.car.CarFacetButton
+ android:id="@+id/phone_nav"
+ style="@style/NavigationBarButton"
+ systemui:componentNames="com.android.car.dialer/.TelecomActivity"
+ systemui:icon="@drawable/car_ic_phone"
+ systemui:intent="intent:#Intent;component=com.android.car.dialer/.TelecomActivity;launchFlags=0x14000000;end"
+ systemui:selectedIcon="@drawable/car_ic_phone_selected"
+ systemui:useMoreIcon="false"
+ />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <com.android.systemui.statusbar.car.CarFacetButton
+ android:id="@+id/grid_nav"
+ style="@style/NavigationBarButton"
+ systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
+ systemui:icon="@drawable/car_ic_apps"
+ systemui:intent="intent:#Intent;component=com.android.car.carlauncher/.AppGridActivity;launchFlags=0x24000000;end"
+ systemui:selectedIcon="@drawable/car_ic_apps_selected"
+ systemui:useMoreIcon="false"
+ />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <com.android.systemui.statusbar.car.CarFacetButton
+ android:id="@+id/note"
+ style="@style/NavigationBarButton"
+ systemui:icon="@drawable/car_ic_notification"
+ systemui:intent="intent:#Intent;component=com.android.car.notification/.CarNotificationCenterActivity;launchFlags=0x14000000;end"
+ systemui:packages="com.android.car.notification"
+ systemui:selectedIcon="@drawable/car_ic_notification_selected"
+ systemui:useMoreIcon="false"
+ />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <com.android.systemui.statusbar.car.CarFacetButton
+ android:id="@+id/assist"
+ style="@style/NavigationBarButton"
+ systemui:icon="@drawable/ic_mic_white"
+ systemui:intent="intent:#Intent;action=com.google.android.demandspace.START;end"
+ systemui:useMoreIcon="false"
+ />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/lock_screen_nav_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingStart="@dimen/car_keyline_1"
+ android:paddingEnd="@dimen/car_keyline_1"
+ android:gravity="center"
+ android:visibility="gone">
+ </LinearLayout>
+
+</com.android.systemui.statusbar.car.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml b/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml
new file mode 100644
index 000000000000..46e60db0ba4b
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/car_navigation_bar_unprovisioned.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<com.android.systemui.statusbar.car.CarNavigationBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@android:color/black"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/nav_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingStart="@dimen/car_padding_5"
+ android:paddingEnd="@dimen/car_padding_5">
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/home"
+ android:layout_width="@dimen/car_touch_target_size"
+ android:layout_height="match_parent"
+ android:background="?android:attr/selectableItemBackground"
+ android:src="@drawable/car_ic_overview"
+ systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
+ />
+ </LinearLayout>
+</com.android.systemui.statusbar.car.CarNavigationBarView>
+
diff --git a/packages/CarSystemUI/res/layout/car_status_bar_header.xml b/packages/CarSystemUI/res/layout/car_status_bar_header.xml
new file mode 100644
index 000000000000..e4460721890c
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/car_status_bar_header.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<!-- Extends LinearLayout -->
+<com.android.systemui.qs.car.CarStatusBarHeader
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/header"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/status_bar_height">
+
+ <include layout="@layout/car_top_navigation_bar"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ />
+</com.android.systemui.qs.car.CarStatusBarHeader>
diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
new file mode 100644
index 000000000000..55d50a0545fe
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<com.android.systemui.statusbar.car.CarNavigationBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/car_top_bar"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@android:color/black"
+ android:orientation="vertical">
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1">
+
+ <FrameLayout
+ android:id="@+id/left_hvac_container"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentStart="true"
+ >
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/hvacleft"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@null"
+ systemui:broadcast="true"
+ systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
+ />
+
+ <com.android.systemui.statusbar.hvac.AnimatedTemperatureView
+ android:id="@+id/lefttext"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingStart="@dimen/car_padding_4"
+ android:paddingEnd="16dp"
+ android:gravity="center_vertical|start"
+ android:minEms="4"
+ android:textAppearance="@style/TextAppearance.Car.Status"
+ systemui:hvacAreaId="1"
+ systemui:hvacMaxText="@string/hvac_max_text"
+ systemui:hvacMaxValue="@dimen/hvac_max_value"
+ systemui:hvacMinText="@string/hvac_min_text"
+ systemui:hvacMinValue="@dimen/hvac_min_value"
+ systemui:hvacPivotOffset="60dp"
+ systemui:hvacPropertyId="358614275"
+ systemui:hvacTempFormat="%.0f\u00B0"
+ />
+ </FrameLayout>
+
+ <FrameLayout
+ android:id="@+id/clock_container"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_centerInParent="true"
+ >
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/qs"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@null"
+ systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivity;launchFlags=0x14008000;end"
+ />
+ <com.android.systemui.statusbar.policy.Clock
+ android:id="@+id/clock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:elevation="5dp"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.StatusBar.Clock"
+ />
+ </FrameLayout>
+
+ <LinearLayout
+ android:id="@+id/system_icon_area"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:layout_toEndOf="@+id/clock_container"
+ android:paddingStart="@dimen/car_padding_1"
+ android:gravity="center_vertical"
+ android:orientation="horizontal"
+ >
+
+ <include
+ layout="@layout/system_icons"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingStart="4dp"
+ android:gravity="center_vertical"
+ />
+ </LinearLayout>
+
+ <FrameLayout
+ android:id="@+id/right_hvac_container"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentEnd="true"
+ >
+
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/hvacright"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@null"
+ systemui:broadcast="true"
+ systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
+ />
+
+ <com.android.systemui.statusbar.hvac.AnimatedTemperatureView
+ android:id="@+id/righttext"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingStart="16dp"
+ android:paddingEnd="@dimen/car_padding_4"
+ android:gravity="center_vertical|end"
+ android:minEms="4"
+ android:textAppearance="@style/TextAppearance.Car.Status"
+ systemui:hvacAreaId="4"
+ systemui:hvacMaxText="@string/hvac_max_text"
+ systemui:hvacMaxValue="@dimen/hvac_max_value"
+ systemui:hvacMinText="@string/hvac_min_text"
+ systemui:hvacMinValue="@dimen/hvac_min_value"
+ systemui:hvacPivotOffset="60dp"
+ systemui:hvacPropertyId="358614275"
+ systemui:hvacTempFormat="%.0f\u00B0"
+ />
+ </FrameLayout>
+ </RelativeLayout>
+
+</com.android.systemui.statusbar.car.CarNavigationBarView>
diff --git a/packages/CarSystemUI/res/layout/car_volume_dialog.xml b/packages/CarSystemUI/res/layout/car_volume_dialog.xml
new file mode 100644
index 000000000000..c98740e42701
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/car_volume_dialog.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<androidx.car.widget.PagedListView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/volume_list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@android:color/black"
+ android:minWidth="@dimen/volume_dialog_panel_width"
+ android:theme="@style/Theme.Car.DialogListView"
+ app:dividerEndMargin="@dimen/car_keyline_1"
+ app:dividerStartMargin="@dimen/car_keyline_1"
+ app:gutter="none"
+ app:scrollBarEnabled="false"
+ app:showPagedListViewDivider="true"/>
diff --git a/packages/CarSystemUI/res/layout/status_bar_wifi_group.xml b/packages/CarSystemUI/res/layout/status_bar_wifi_group.xml
new file mode 100644
index 000000000000..2793e562a574
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/status_bar_wifi_group.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<com.android.systemui.statusbar.StatusBarWifiView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/wifi_combo"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical">
+
+ <com.android.keyguard.AlphaOptimizedLinearLayout
+ android:id="@+id/wifi_group"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:paddingStart="2dp"
+ android:gravity="center_vertical"
+ >
+ <FrameLayout
+ android:id="@+id/inout_container"
+ android:layout_width="wrap_content"
+ android:layout_height="17dp"
+ android:gravity="center_vertical">
+ <ImageView
+ android:id="@+id/wifi_in"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingEnd="2dp"
+ android:src="@drawable/ic_activity_down"
+ android:visibility="gone"
+ />
+ <ImageView
+ android:id="@+id/wifi_out"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingEnd="2dp"
+ android:src="@drawable/ic_activity_up"
+ android:visibility="gone"
+ />
+ </FrameLayout>
+ <FrameLayout
+ android:id="@+id/wifi_combo"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical">
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:id="@+id/wifi_signal"
+ android:layout_width="@dimen/status_bar_icon_size"
+ android:layout_height="@dimen/status_bar_icon_size"
+ android:theme="?attr/lightIconTheme"/>
+ </FrameLayout>
+
+ <View
+ android:id="@+id/wifi_signal_spacer"
+ android:layout_width="@dimen/status_bar_wifi_signal_spacer_width"
+ android:layout_height="4dp"
+ android:visibility="gone"/>
+
+ <ViewStub
+ android:id="@+id/connected_device_signals_stub"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout="@layout/connected_device_signal"/>
+
+ <View
+ android:id="@+id/wifi_airplane_spacer"
+ android:layout_width="@dimen/status_bar_airplane_spacer_width"
+ android:layout_height="4dp"
+ android:visibility="gone"
+ />
+ </com.android.keyguard.AlphaOptimizedLinearLayout>
+</com.android.systemui.statusbar.StatusBarWifiView>
diff --git a/packages/CarSystemUI/res/layout/super_status_bar.xml b/packages/CarSystemUI/res/layout/super_status_bar.xml
new file mode 100644
index 000000000000..0594dce2ba22
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/super_status_bar.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- This is the combined status bar / notification panel window. -->
+<com.android.systemui.statusbar.phone.StatusBarWindowView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:sysui="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <com.android.systemui.statusbar.BackDropView
+ android:id="@+id/backdrop"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ sysui:ignoreRightInset="true"
+ >
+ <ImageView android:id="@+id/backdrop_back"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"/>
+ <ImageView android:id="@+id/backdrop_front"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"
+ android:visibility="invisible"/>
+ </com.android.systemui.statusbar.BackDropView>
+
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_behind"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ sysui:ignoreRightInset="true"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/status_bar_height"
+ android:orientation="vertical"
+ >
+ <FrameLayout
+ android:id="@+id/status_bar_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ />
+
+ <include layout="@layout/car_top_navigation_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ />
+ </LinearLayout>
+
+ <include layout="@layout/brightness_mirror"/>
+
+ <ViewStub android:id="@+id/fullscreen_user_switcher_stub"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/car_fullscreen_user_switcher"/>
+
+ <include layout="@layout/status_bar_expanded"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="invisible"/>
+
+ <com.android.systemui.statusbar.ScrimView
+ android:id="@+id/scrim_in_front"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no"
+ sysui:ignoreRightInset="true"
+ />
+
+</com.android.systemui.statusbar.phone.StatusBarWindowView>
diff --git a/packages/CarSystemUI/res/layout/system_icons.xml b/packages/CarSystemUI/res/layout/system_icons.xml
new file mode 100644
index 000000000000..a7dd65eab550
--- /dev/null
+++ b/packages/CarSystemUI/res/layout/system_icons.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/system_icons"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical">
+
+ <com.android.systemui.statusbar.phone.StatusIconContainer
+ android:id="@+id/statusIcons"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:paddingEnd="4dp"
+ android:gravity="center_vertical"
+ android:orientation="horizontal"
+ />
+
+ <com.android.systemui.BatteryMeterView
+ android:id="@+id/battery"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ />
+</LinearLayout> \ No newline at end of file
diff --git a/packages/CarSystemUI/res/values-night/colors.xml b/packages/CarSystemUI/res/values-night/colors.xml
new file mode 100644
index 000000000000..dad94a894603
--- /dev/null
+++ b/packages/CarSystemUI/res/values-night/colors.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+ <color name="car_accent">#356FE5</color>
+ <color name="status_bar_background_color">#ff000000</color>
+ <color name="system_bar_background_opaque">#ff0c1013</color>
+
+ <!-- The color of the ripples on the untinted notifications -->
+ <color name="notification_ripple_untinted_color">@color/ripple_material_dark</color>
+</resources>
diff --git a/packages/CarSystemUI/res/values/attrs.xml b/packages/CarSystemUI/res/values/attrs.xml
new file mode 100644
index 000000000000..617873865289
--- /dev/null
+++ b/packages/CarSystemUI/res/values/attrs.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+
+ <!-- Custom attributes to configure hvac values -->
+ <declare-styleable name="AnimatedTemperatureView">
+ <attr name="hvacAreaId" format="integer"/>
+ <attr name="hvacPropertyId" format="integer"/>
+ <attr name="hvacTempFormat" format="string"/>
+ <!-- how far away the animations should center around -->
+ <attr name="hvacPivotOffset" format="dimension"/>
+ <attr name="hvacMinValue" format="float"/>
+ <attr name="hvacMaxValue" format="float"/>
+ <attr name="hvacMinText" format="string|reference"/>
+ <attr name="hvacMaxText" format="string|reference"/>
+ <attr name="android:gravity"/>
+ <attr name="android:minEms"/>
+ <attr name="android:textAppearance"/>
+ </declare-styleable>
+</resources>
diff --git a/packages/CarSystemUI/res/values/colors.xml b/packages/CarSystemUI/res/values/colors.xml
new file mode 100644
index 000000000000..e9ddbaf42b8c
--- /dev/null
+++ b/packages/CarSystemUI/res/values/colors.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+ <color name="nav_bar_ripple_background_color">#40ffffff</color>
+ <color name="car_accent">#356FE5</color>
+ <!-- colors for user switcher -->
+ <color name="car_user_switcher_background_color">#000000</color>
+ <color name="car_user_switcher_name_text_color">@color/car_title2_light</color>
+ <color name="car_user_switcher_add_user_background_color">#131313</color>
+ <color name="car_nav_icon_fill_color">@color/car_grey_50</color>
+ <!-- colors for seekbar -->
+ <color name="car_seekbar_track_background">#131315</color>
+ <color name="car_seekbar_track_secondary_progress">@color/car_accent</color>
+ <!-- colors for volume dialog tint -->
+ <color name="car_volume_dialog_tint">@color/car_tint_light</color>
+
+ <!-- System ui can't depend on car libs so redefine. -->
+ <color name="car_grey_50">#fffafafa</color>
+
+ <color name="docked_divider_background">@color/car_grey_50</color>
+ <color name="system_bar_background_opaque">#ff172026</color>
+
+ <color name="status_bar_background_color">#33000000</color>
+ <drawable name="system_bar_background">@color/status_bar_background_color</drawable>
+
+ <!-- The scrim color for the background of the notifications shade. -->
+ <color name="scrim_behind_color">#172026</color>
+
+ <!-- The color of the dividing line between grouped notifications. -->
+ <color name="notification_divider_color">@*android:color/notification_action_list</color>
+
+ <!-- The color of the ripples on the untinted notifications -->
+ <color name="notification_ripple_untinted_color">@color/ripple_material_light</color>
+
+ <color name="car_teal_700">#ff00796b</color>
+ <color name="car_grey_300">#ffe0e0e0</color>
+ <color name="car_grey_900">#ff212121</color>
+
+ <color name="keyguard_button_text_color">@android:color/black</color>
+</resources>
diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml
new file mode 100644
index 000000000000..452d61df5322
--- /dev/null
+++ b/packages/CarSystemUI/res/values/config.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources>
+ <string name="config_statusBarComponent" translatable="false">
+ com.android.systemui.statusbar.car.CarStatusBar
+ </string>
+ <string name="config_systemUIFactoryComponent" translatable="false">
+ com.android.systemui.CarSystemUIFactory
+ </string>
+ <bool name="config_enableFullscreenUserSwitcher">true</bool>
+
+ <!-- configure which system ui bars should be displayed -->
+ <bool name="config_enableLeftNavigationBar">false</bool>
+ <bool name="config_enableRightNavigationBar">false</bool>
+ <bool name="config_enableBottomNavigationBar">true</bool>
+
+</resources>
diff --git a/packages/CarSystemUI/res/values/dimens.xml b/packages/CarSystemUI/res/values/dimens.xml
new file mode 100644
index 000000000000..3829aa3685b6
--- /dev/null
+++ b/packages/CarSystemUI/res/values/dimens.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources>
+ <!--
+ Note: status bar height and navigation bar heights are defined
+ in frameworks/base/core package and thus will have no effect if
+ set here. See car_product overlay for car specific defaults-->
+
+ <dimen name="status_bar_icon_drawing_size_dark">36dp</dimen>
+ <dimen name="status_bar_icon_drawing_size">36dp</dimen>
+ <dimen name="car_qs_header_system_icons_area_height">96dp</dimen>
+ <!-- The amount by which to scale up the status bar icons. -->
+ <item name="status_bar_icon_scale_factor" format="float" type="dimen">1.75</item>
+
+ <dimen name="car_primary_icon_size">36dp</dimen>
+
+ <!-- dimensions for the car user switcher -->
+ <dimen name="car_user_switcher_name_text_size">@dimen/car_title2_size</dimen>
+ <dimen name="car_user_switcher_vertical_spacing_between_users">124dp</dimen>
+
+ <!--These values represent MIN and MAX for hvac-->
+ <item name="hvac_min_value" format="float" type="dimen">0</item>
+ <item name="hvac_max_value" format="float" type="dimen">126</item>
+
+ <!-- Largest size an avatar might need to be drawn in the user picker, status bar, or
+ quick settings header -->
+ <dimen name="max_avatar_size">128dp</dimen>
+
+ <!-- Standard image button size for volume dialog buttons -->
+ <dimen name="volume_button_size">84dp</dimen>
+ <!-- The maximum width allowed for the volume dialog. For auto, we allow this to span a good
+ deal of the screen. This value accounts for the side margins. -->
+ <dimen name="volume_dialog_panel_width">1920dp</dimen>
+ <dimen name="volume_dialog_side_margin">@dimen/side_margin</dimen>
+
+ <dimen name="volume_dialog_elevation">6dp</dimen>
+
+ <dimen name="volume_dialog_row_margin_end">@dimen/car_keyline_3</dimen>
+
+ <dimen name="volume_dialog_row_padding_end">0dp</dimen>
+
+ <dimen name="line_item_height">128dp</dimen>
+ <dimen name="volume_icon_size">96dp</dimen>
+ <dimen name="side_margin">148dp</dimen>
+ <dimen name="car_keyline_1">24dp</dimen>
+ <dimen name="car_keyline_2">96dp</dimen>
+ <dimen name="car_keyline_3">128dp</dimen>
+</resources>
diff --git a/packages/CarSystemUI/res/values/integers.xml b/packages/CarSystemUI/res/values/integers.xml
new file mode 100644
index 000000000000..8b87c740425f
--- /dev/null
+++ b/packages/CarSystemUI/res/values/integers.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) 2018, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <integer name="user_fullscreen_switcher_num_col">2</integer>
+</resources>
diff --git a/packages/CarSystemUI/res/values/strings.xml b/packages/CarSystemUI/res/values/strings.xml
new file mode 100644
index 000000000000..0368e61978fd
--- /dev/null
+++ b/packages/CarSystemUI/res/values/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (c) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<resources>
+ <!-- String to represent lowest setting of an HVAC system [CHAR LIMIT=5]-->
+ <string name="hvac_min_text">Min</string>
+ <!-- String to represent largest setting of an HVAC system [CHAR LIMIT=5]-->
+ <string name="hvac_max_text">Max</string>
+</resources>
diff --git a/packages/CarSystemUI/res/values/styles.xml b/packages/CarSystemUI/res/values/styles.xml
new file mode 100644
index 000000000000..22a699c3c776
--- /dev/null
+++ b/packages/CarSystemUI/res/values/styles.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The style for the volume icons in the volume dialog. This style makes the icon scale to
+ fit its container since auto wants the icon to be larger. The padding is added to make it
+ so the icon does not press along the edges of the dialog. -->
+ <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless">
+ <item name="android:background">@drawable/btn_borderless_rect</item>
+ <item name="android:scaleType">fitCenter</item>
+ <item name="android:padding">22dp</item>
+ </style>
+
+ <style name="TextAppearance.StatusBar.Clock"
+ parent="@*android:style/TextAppearance.StatusBar.Icon">
+ <item name="android:textSize">42sp</item>
+ <item name="android:fontFamily">sans-serif-regular</item>
+ <item name="android:textColor">@color/car_grey_50</item>
+ </style>
+
+ <style name="TextAppearance.Car.Status">
+ <item name="android:textSize">@dimen/car_body2_size</item>
+ <item name="android:textColor">@color/car_grey_50</item>
+ </style>
+
+ <style name="CarNavigationBarButtonTheme">
+ <item name="android:colorControlHighlight">@color/nav_bar_ripple_background_color</item>
+ </style>
+
+ <style name="Theme.Car.DialogListView" parent="@style/Theme.Car.NoActionBar">
+ <item name="listItemBackgroundColor">@android:color/black</item>
+ </style>
+
+ <style name="NavigationBarButton">
+ <item name="android:layout_height">96dp</item>
+ <item name="android:layout_width">96dp</item>
+ <item name="android:background">@drawable/nav_button_background</item>
+ </style>
+
+</resources>
diff --git a/packages/CarSystemUI/res/xml/car_volume_items.xml b/packages/CarSystemUI/res/xml/car_volume_items.xml
new file mode 100644
index 000000000000..8715946aac26
--- /dev/null
+++ b/packages/CarSystemUI/res/xml/car_volume_items.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!--
+ Defines all possible items on car volume settings UI, keyed by usage.
+-->
+<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
+ <item car:usage="unknown"
+ car:icon="@drawable/car_ic_music"/>
+ <item car:usage="media"
+ car:icon="@drawable/car_ic_music"/>
+ <item car:usage="voice_communication"
+ car:icon="@*android:drawable/ic_audio_ring_notif"/>
+ <item car:usage="voice_communication_signalling"
+ car:icon="@*android:drawable/ic_audio_ring_notif"/>
+ <item car:usage="alarm"
+ car:icon="@drawable/ic_volume_alarm"/>
+ <item car:usage="notification"
+ car:icon="@drawable/car_ic_notification"/>
+ <item car:usage="notification_ringtone"
+ car:icon="@drawable/car_ic_notification"/>
+ <item car:usage="notification_communication_request"
+ car:icon="@drawable/car_ic_notification"/>
+ <item car:usage="notification_communication_instant"
+ car:icon="@drawable/car_ic_notification"/>
+ <item car:usage="notification_communication_delayed"
+ car:icon="@drawable/car_ic_notification"/>
+ <item car:usage="notification_event"
+ car:icon="@drawable/car_ic_notification"/>
+ <item car:usage="assistance_accessibility"
+ car:icon="@drawable/car_ic_notification"/>
+ <item car:usage="assistance_navigation_guidance"
+ car:icon="@drawable/car_ic_navigation"/>
+ <item car:usage="assistance_sonification"
+ car:icon="@drawable/car_ic_notification"/>
+ <item car:usage="game"
+ car:icon="@drawable/car_ic_music"/>
+ <item car:usage="assistant"
+ car:icon="@drawable/car_ic_music"/>
+</carVolumeItems>
+
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java
new file mode 100644
index 000000000000..1d39f72b12dc
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui;
+
+import android.content.Context;
+import android.util.ArrayMap;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.Dependency.DependencyProvider;
+import com.android.systemui.car.CarNotificationEntryManager;
+import com.android.systemui.statusbar.NotificationEntryManager;
+import com.android.systemui.statusbar.car.CarFacetButtonController;
+import com.android.systemui.statusbar.car.CarStatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.car.hvac.HvacController;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+
+/**
+ * Class factory to provide car specific SystemUI components.
+ */
+public class CarSystemUIFactory extends SystemUIFactory {
+
+ public StatusBarKeyguardViewManager createStatusBarKeyguardViewManager(Context context,
+ ViewMediatorCallback viewMediatorCallback, LockPatternUtils lockPatternUtils) {
+ return new CarStatusBarKeyguardViewManager(context, viewMediatorCallback, lockPatternUtils);
+ }
+
+ @Override
+ public void injectDependencies(ArrayMap<Object, DependencyProvider> providers,
+ Context context) {
+ super.injectDependencies(providers, context);
+ providers.put(NotificationEntryManager.class,
+ () -> new CarNotificationEntryManager(context));
+ providers.put(CarFacetButtonController.class, () -> new CarFacetButtonController(context));
+ providers.put(HvacController.class, () -> new HvacController(context));
+ }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java
new file mode 100644
index 000000000000..27d31064955d
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/AnimatedTemperatureView.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (c) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.hvac;
+
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
+import com.android.systemui.statusbar.car.hvac.TemperatureView;
+import com.android.systemui.statusbar.car.hvac.HvacController;
+import android.util.AttributeSet;
+import android.util.Property;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextSwitcher;
+import android.widget.TextView;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.R;
+
+/**
+ * Simple text display of HVAC properties, It is designed to show mTemperature and is configured in
+ * the XML.
+ * XML properties:
+ * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385)
+ * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+ * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol)
+ * hvacOrientaion = Example: left
+ * <p>
+ * Note: It registers itself with {@link HvacController}
+ */
+public class AnimatedTemperatureView extends FrameLayout implements TemperatureView {
+
+ private static final float TEMPERATURE_EQUIVALENT_DELTA = .01f;
+ private static final Property<ColorDrawable, Integer> COLOR_PROPERTY =
+ new Property<ColorDrawable, Integer>(Integer.class, "color") {
+
+ @Override
+ public Integer get(ColorDrawable object) {
+ return object.getColor();
+ }
+
+ @Override
+ public void set(ColorDrawable object, Integer value) {
+ object.setColor(value);
+ }
+ };
+
+ static boolean isHorizontal(int gravity) {
+ return Gravity.isHorizontal(gravity)
+ && (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) != Gravity.CENTER_HORIZONTAL;
+ }
+
+ @SuppressLint("RtlHardcoded")
+ static boolean isLeft(int gravity, int layoutDirection) {
+ return Gravity
+ .getAbsoluteGravity(gravity & Gravity.HORIZONTAL_GRAVITY_MASK, layoutDirection)
+ == Gravity.LEFT;
+ }
+
+ static boolean isVertical(int gravity) {
+ return Gravity.isVertical(gravity)
+ && (gravity & Gravity.VERTICAL_GRAVITY_MASK) != Gravity.CENTER_VERTICAL;
+ }
+
+ static boolean isTop(int gravity) {
+ return (gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.TOP;
+ }
+
+ private final int mAreaId;
+ private final int mPropertyId;
+ private final int mPivotOffset;
+ private final int mGravity;
+ private final int mTextAppearanceRes;
+ private final int mMinEms;
+ private final Rect mPaddingRect;
+ private final float mMinValue;
+ private final float mMaxValue;
+
+ private final ColorDrawable mBackgroundColor;
+
+ private final TemperatureColorStore mColorStore = new TemperatureColorStore();
+ private final TemperatureBackgroundAnimator mBackgroundAnimator;
+ private final TemperatureTextAnimator mTextAnimator;
+
+ public AnimatedTemperatureView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ TypedArray typedArray = context.obtainStyledAttributes(attrs,
+ R.styleable.AnimatedTemperatureView);
+ mAreaId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacAreaId, -1);
+ mPropertyId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacPropertyId, -1);
+ mPivotOffset =
+ typedArray.getDimensionPixelOffset(
+ R.styleable.AnimatedTemperatureView_hvacPivotOffset, 0);
+ mGravity = typedArray.getInt(R.styleable.AnimatedTemperatureView_android_gravity,
+ Gravity.START);
+ mTextAppearanceRes =
+ typedArray.getResourceId(R.styleable.AnimatedTemperatureView_android_textAppearance,
+ 0);
+ mMinEms = typedArray.getInteger(R.styleable.AnimatedTemperatureView_android_minEms, 0);
+ mMinValue = typedArray.getFloat(R.styleable.AnimatedTemperatureView_hvacMinValue,
+ Float.NaN);
+ mMaxValue = typedArray.getFloat(R.styleable.AnimatedTemperatureView_hvacMaxValue,
+ Float.NaN);
+
+
+ mPaddingRect =
+ new Rect(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom());
+ setPadding(0, 0, 0, 0);
+
+ setClipChildren(false);
+ setClipToPadding(false);
+
+ // init Views
+ TextSwitcher textSwitcher = new TextSwitcher(context);
+ textSwitcher.setFactory(this::generateTextView);
+ ImageView background = new ImageView(context);
+ mBackgroundColor = new ColorDrawable(Color.TRANSPARENT);
+ background.setImageDrawable(mBackgroundColor);
+ background.setVisibility(View.GONE);
+
+ mBackgroundAnimator = new TemperatureBackgroundAnimator(this, background);
+
+
+ String format = typedArray.getString(R.styleable.AnimatedTemperatureView_hvacTempFormat);
+ format = (format == null) ? "%.1f\u00B0" : format;
+ CharSequence minText = typedArray.getString(
+ R.styleable.AnimatedTemperatureView_hvacMinText);
+ CharSequence maxText = typedArray.getString(
+ R.styleable.AnimatedTemperatureView_hvacMaxText);
+ mTextAnimator = new TemperatureTextAnimator(this, textSwitcher, format, mPivotOffset,
+ minText, maxText);
+
+ addView(background, ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT);
+ addView(textSwitcher, ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT);
+
+ typedArray.recycle();
+
+ // register with controller
+ HvacController hvacController = Dependency.get(HvacController.class);
+ hvacController.addHvacTextView(this);
+ }
+
+ private TextView generateTextView() {
+ TextView textView = new TextView(getContext());
+ textView.setTextAppearance(mTextAppearanceRes);
+ textView.setAllCaps(true);
+ textView.setMinEms(mMinEms);
+ textView.setGravity(mGravity);
+ textView.setPadding(mPaddingRect.left, mPaddingRect.top, mPaddingRect.right,
+ mPaddingRect.bottom);
+ textView.getViewTreeObserver()
+ .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ if (isHorizontal(mGravity)) {
+ if (isLeft(mGravity, getLayoutDirection())) {
+ textView.setPivotX(-mPivotOffset);
+ } else {
+ textView.setPivotX(textView.getWidth() + mPivotOffset);
+ }
+ }
+ textView.getViewTreeObserver().removeOnPreDrawListener(this);
+ return false;
+ }
+ });
+ textView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
+
+ return textView;
+ }
+
+ /**
+ * Formats the float for display
+ *
+ * @param temp - The current temp or NaN
+ */
+ @Override
+ public void setTemp(float temp) {
+ mTextAnimator.setTemp(temp);
+ if (Float.isNaN(temp)) {
+ mBackgroundAnimator.hideCircle();
+ return;
+ }
+ int color;
+ if (isMinValue(temp)) {
+ color = mColorStore.getMinColor();
+ } else if (isMaxValue(temp)) {
+ color = mColorStore.getMaxColor();
+ } else {
+ color = mColorStore.getColorForTemperature(temp);
+ }
+ if (mBackgroundAnimator.isOpen()) {
+ ObjectAnimator colorAnimator =
+ ObjectAnimator.ofInt(mBackgroundColor, COLOR_PROPERTY, color);
+ colorAnimator.setEvaluator((fraction, startValue, endValue) -> mColorStore
+ .lerpColor(fraction, (int) startValue, (int) endValue));
+ colorAnimator.start();
+ } else {
+ mBackgroundColor.setColor(color);
+ }
+
+ mBackgroundAnimator.animateOpen();
+ }
+
+ boolean isMinValue(float temp) {
+ return !Float.isNaN(mMinValue) && isApproxEqual(temp, mMinValue);
+ }
+
+ boolean isMaxValue(float temp) {
+ return !Float.isNaN(mMaxValue) && isApproxEqual(temp, mMaxValue);
+ }
+
+ private boolean isApproxEqual(float left, float right) {
+ return Math.abs(left - right) <= TEMPERATURE_EQUIVALENT_DELTA;
+ }
+
+ int getGravity() {
+ return mGravity;
+ }
+
+ int getPivotOffset() {
+ return mPivotOffset;
+ }
+
+ Rect getPaddingRect() {
+ return mPaddingRect;
+ }
+
+ /**
+ * @return propertiyId Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (358614275)
+ */
+ @Override
+ public int getPropertyId() {
+ return mPropertyId;
+ }
+
+ /**
+ * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1)
+ */
+ @Override
+ public int getAreaId() {
+ return mAreaId;
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mBackgroundAnimator.stopAnimations();
+ }
+
+}
+
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java
new file mode 100644
index 000000000000..0bc94b500387
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureBackgroundAnimator.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright (c) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.hvac;
+
+import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isHorizontal;
+import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isLeft;
+import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isTop;
+import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isVertical;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.annotation.IntDef;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewAnimationUtils;
+import android.view.animation.AnticipateInterpolator;
+import android.widget.ImageView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controls circular reveal animation of temperature background
+ */
+class TemperatureBackgroundAnimator {
+
+ private static final AnticipateInterpolator ANTICIPATE_INTERPOLATOR =
+ new AnticipateInterpolator();
+ private static final float MAX_OPACITY = .6f;
+
+ private final View mAnimatedView;
+
+ private int mPivotX;
+ private int mPivotY;
+ private int mGoneRadius;
+ private int mOvershootRadius;
+ private int mRestingRadius;
+ private int mBumpRadius;
+
+ @CircleState
+ private int mCircleState;
+
+ private Animator mCircularReveal;
+ private boolean mAnimationsReady;
+
+ @IntDef({CircleState.GONE, CircleState.ENTERING, CircleState.OVERSHOT, CircleState.RESTING,
+ CircleState.RESTED, CircleState.BUMPING, CircleState.BUMPED, CircleState.EXITING})
+ private @interface CircleState {
+ int GONE = 0;
+ int ENTERING = 1;
+ int OVERSHOT = 2;
+ int RESTING = 3;
+ int RESTED = 4;
+ int BUMPING = 5;
+ int BUMPED = 6;
+ int EXITING = 7;
+ }
+
+ TemperatureBackgroundAnimator(
+ AnimatedTemperatureView parent,
+ ImageView animatedView) {
+ mAnimatedView = animatedView;
+ mAnimatedView.setAlpha(0);
+
+ parent.addOnLayoutChangeListener(
+ (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
+ setupAnimations(parent.getGravity(), parent.getPivotOffset(),
+ parent.getPaddingRect(), parent.getWidth(), parent.getHeight()));
+ }
+
+ private void setupAnimations(int gravity, int pivotOffset, Rect paddingRect,
+ int width, int height) {
+ int padding;
+ if (isHorizontal(gravity)) {
+ mGoneRadius = pivotOffset;
+ if (isLeft(gravity, mAnimatedView.getLayoutDirection())) {
+ mPivotX = -pivotOffset;
+ padding = paddingRect.right;
+ } else {
+ mPivotX = width + pivotOffset;
+ padding = paddingRect.left;
+ }
+ mPivotY = height / 2;
+ mOvershootRadius = pivotOffset + width;
+ } else if (isVertical(gravity)) {
+ mGoneRadius = pivotOffset;
+ if (isTop(gravity)) {
+ mPivotY = -pivotOffset;
+ padding = paddingRect.bottom;
+ } else {
+ mPivotY = height + pivotOffset;
+ padding = paddingRect.top;
+ }
+ mPivotX = width / 2;
+ mOvershootRadius = pivotOffset + height;
+ } else {
+ mPivotX = width / 2;
+ mPivotY = height / 2;
+ mGoneRadius = 0;
+ if (width > height) {
+ mOvershootRadius = height;
+ padding = Math.max(paddingRect.top, paddingRect.bottom);
+ } else {
+ mOvershootRadius = width;
+ padding = Math.max(paddingRect.left, paddingRect.right);
+ }
+ }
+ mRestingRadius = mOvershootRadius - padding;
+ mBumpRadius = mOvershootRadius - padding / 3;
+ mAnimationsReady = true;
+ }
+
+ boolean isOpen() {
+ return mCircleState != CircleState.GONE;
+ }
+
+ void animateOpen() {
+ if (!mAnimationsReady || mCircleState == CircleState.ENTERING) {
+ return;
+ }
+
+ AnimatorSet set = new AnimatorSet();
+ List<Animator> animators = new ArrayList<>();
+ switch (mCircleState) {
+ case CircleState.ENTERING:
+ throw new AssertionError("Should not be able to reach this statement");
+ case CircleState.GONE: {
+ Animator startCircle = createEnterAnimator();
+ markState(startCircle, CircleState.ENTERING);
+ animators.add(startCircle);
+ Animator holdOvershoot = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mOvershootRadius,
+ mOvershootRadius);
+ holdOvershoot.setDuration(50);
+ markState(holdOvershoot, CircleState.OVERSHOT);
+ animators.add(holdOvershoot);
+ Animator rest = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mOvershootRadius,
+ mRestingRadius);
+ markState(rest, CircleState.RESTING);
+ animators.add(rest);
+ Animator holdRest = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mRestingRadius,
+ mRestingRadius);
+ markState(holdRest, CircleState.RESTED);
+ holdRest.setDuration(1000);
+ animators.add(holdRest);
+ Animator exit = createExitAnimator(mRestingRadius);
+ markState(exit, CircleState.EXITING);
+ animators.add(exit);
+ }
+ break;
+ case CircleState.RESTED:
+ case CircleState.RESTING:
+ case CircleState.EXITING:
+ case CircleState.OVERSHOT:
+ int startRadius =
+ mCircleState == CircleState.OVERSHOT ? mOvershootRadius : mRestingRadius;
+ Animator bump = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, startRadius,
+ mBumpRadius);
+ bump.setDuration(50);
+ markState(bump, CircleState.BUMPING);
+ animators.add(bump);
+ // fallthrough intentional
+ case CircleState.BUMPED:
+ case CircleState.BUMPING:
+ Animator holdBump = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mBumpRadius,
+ mBumpRadius);
+ holdBump.setDuration(100);
+ markState(holdBump, CircleState.BUMPED);
+ animators.add(holdBump);
+ Animator rest = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mBumpRadius,
+ mRestingRadius);
+ markState(rest, CircleState.RESTING);
+ animators.add(rest);
+ Animator holdRest = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mRestingRadius,
+ mRestingRadius);
+ holdRest.setDuration(1000);
+ markState(holdRest, CircleState.RESTED);
+ animators.add(holdRest);
+ Animator exit = createExitAnimator(mRestingRadius);
+ markState(exit, CircleState.EXITING);
+ animators.add(exit);
+ break;
+ }
+ set.playSequentially(animators);
+ set.addListener(new AnimatorListenerAdapter() {
+ private boolean mCanceled = false;
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ if (mCircularReveal != null) {
+ mCircularReveal.cancel();
+ }
+ mCircularReveal = animation;
+ mAnimatedView.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ mCanceled = true;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (mCanceled) {
+ return;
+ }
+ mCircularReveal = null;
+ mCircleState = CircleState.GONE;
+ mAnimatedView.setVisibility(View.GONE);
+ }
+ });
+
+ set.start();
+ }
+
+ private Animator createEnterAnimator() {
+ AnimatorSet animatorSet = new AnimatorSet();
+ Animator circularReveal = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, mGoneRadius,
+ mOvershootRadius);
+ Animator fade = ObjectAnimator.ofFloat(mAnimatedView, View.ALPHA, MAX_OPACITY);
+ animatorSet.playTogether(circularReveal, fade);
+ return animatorSet;
+ }
+
+ private Animator createExitAnimator(int startRadius) {
+ AnimatorSet animatorSet = new AnimatorSet();
+ Animator circularHide = ViewAnimationUtils
+ .createCircularReveal(mAnimatedView, mPivotX, mPivotY, startRadius,
+ (mGoneRadius + startRadius) / 2);
+ circularHide.setInterpolator(ANTICIPATE_INTERPOLATOR);
+ Animator fade = ObjectAnimator.ofFloat(mAnimatedView, View.ALPHA, 0);
+ fade.setStartDelay(50);
+ animatorSet.playTogether(circularHide, fade);
+ return animatorSet;
+ }
+
+ void hideCircle() {
+ if (!mAnimationsReady || mCircleState == CircleState.GONE
+ || mCircleState == CircleState.EXITING) {
+ return;
+ }
+
+ int startRadius;
+ switch (mCircleState) {
+ // Unreachable, but here to exhaust switch cases
+ //noinspection ConstantConditions
+ case CircleState.EXITING:
+ //noinspection ConstantConditions
+ case CircleState.GONE:
+ throw new AssertionError("Should not be able to reach this statement");
+ case CircleState.BUMPED:
+ case CircleState.BUMPING:
+ startRadius = mBumpRadius;
+ break;
+ case CircleState.OVERSHOT:
+ startRadius = mOvershootRadius;
+ break;
+ case CircleState.ENTERING:
+ case CircleState.RESTED:
+ case CircleState.RESTING:
+ startRadius = mRestingRadius;
+ break;
+ default:
+ throw new IllegalStateException("Unknown CircleState: " + mCircleState);
+ }
+
+ Animator hideAnimation = createExitAnimator(startRadius);
+ if (startRadius == mRestingRadius) {
+ hideAnimation.setInterpolator(ANTICIPATE_INTERPOLATOR);
+ }
+ hideAnimation.addListener(new AnimatorListenerAdapter() {
+ private boolean mCanceled = false;
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mCircleState = CircleState.EXITING;
+ if (mCircularReveal != null) {
+ mCircularReveal.cancel();
+ }
+ mCircularReveal = animation;
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ mCanceled = true;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (mCanceled) {
+ return;
+ }
+ mCircularReveal = null;
+ mCircleState = CircleState.GONE;
+ mAnimatedView.setVisibility(View.GONE);
+ }
+ });
+ hideAnimation.start();
+ }
+
+ void stopAnimations() {
+ if (mCircularReveal != null) {
+ mCircularReveal.end();
+ }
+ }
+
+ private void markState(Animator animator, @CircleState int startState) {
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mCircleState = startState;
+ }
+ });
+ }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureColorStore.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureColorStore.java
new file mode 100644
index 000000000000..a40ffaf850c5
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureColorStore.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.hvac;
+
+import android.graphics.Color;
+
+/**
+ * Contains the logic for mapping colors to temperatures
+ */
+class TemperatureColorStore {
+
+ private static class TemperatureColorValue {
+ final float mTemperature;
+ final int mColor;
+
+ private TemperatureColorValue(float temperature, int color) {
+ this.mTemperature = temperature;
+ this.mColor = color;
+ }
+
+ float getTemperature() {
+ return mTemperature;
+ }
+
+ int getColor() {
+ return mColor;
+ }
+ }
+
+ private static TemperatureColorValue tempToColor(float temperature, int color) {
+ return new TemperatureColorValue(temperature, color);
+ }
+
+ private static final int COLOR_COLDEST = 0xFF406DFF;
+ private static final int COLOR_COLD = 0xFF4094FF;
+ private static final int COLOR_NEUTRAL = 0xFFF4F4F4;
+ private static final int COLOR_WARM = 0xFFFF550F;
+ private static final int COLOR_WARMEST = 0xFFFF0000;
+ // must be sorted by temperature
+ private static final TemperatureColorValue[] sTemperatureColorValues =
+ {
+ // Celsius
+ tempToColor(19, COLOR_COLDEST),
+ tempToColor(21, COLOR_COLD),
+ tempToColor(23, COLOR_NEUTRAL),
+ tempToColor(25, COLOR_WARM),
+ tempToColor(27, COLOR_WARMEST),
+
+ // Switch over
+ tempToColor(45, COLOR_WARMEST),
+ tempToColor(45.00001f, COLOR_COLDEST),
+
+ // Farenheight
+ tempToColor(66, COLOR_COLDEST),
+ tempToColor(70, COLOR_COLD),
+ tempToColor(74, COLOR_NEUTRAL),
+ tempToColor(76, COLOR_WARM),
+ tempToColor(80, COLOR_WARMEST)
+ };
+
+ private static final int COLOR_UNSET = Color.BLACK;
+
+ private final float[] mTempHsv1 = new float[3];
+ private final float[] mTempHsv2 = new float[3];
+ private final float[] mTempHsv3 = new float[3];
+
+ int getMinColor() {
+ return COLOR_COLDEST;
+ }
+
+ int getMaxColor() {
+ return COLOR_WARMEST;
+ }
+
+ int getColorForTemperature(float temperature) {
+ if (Float.isNaN(temperature)) {
+ return COLOR_UNSET;
+ }
+ TemperatureColorValue bottomValue = sTemperatureColorValues[0];
+ if (temperature <= bottomValue.getTemperature()) {
+ return bottomValue.getColor();
+ }
+ TemperatureColorValue topValue =
+ sTemperatureColorValues[sTemperatureColorValues.length - 1];
+ if (temperature >= topValue.getTemperature()) {
+ return topValue.getColor();
+ }
+
+ int index = binarySearch(temperature);
+ if (index >= 0) {
+ return sTemperatureColorValues[index].getColor();
+ }
+
+ index = -index - 1; // move to the insertion point
+
+ TemperatureColorValue startValue = sTemperatureColorValues[index - 1];
+ TemperatureColorValue endValue = sTemperatureColorValues[index];
+ float fraction = (temperature - startValue.getTemperature()) / (endValue.getTemperature()
+ - startValue.getTemperature());
+ return lerpColor(fraction, startValue.getColor(), endValue.getColor());
+ }
+
+ int lerpColor(float fraction, int startColor, int endColor) {
+ float[] startHsv = mTempHsv1;
+ Color.colorToHSV(startColor, startHsv);
+ float[] endHsv = mTempHsv2;
+ Color.colorToHSV(endColor, endHsv);
+
+ // If a target color is white/gray, it should use the same hue as the other target
+ if (startHsv[1] == 0) {
+ startHsv[0] = endHsv[0];
+ }
+ if (endHsv[1] == 0) {
+ endHsv[0] = startHsv[0];
+ }
+
+ float[] outColor = mTempHsv3;
+ outColor[0] = hueLerp(fraction, startHsv[0], endHsv[0]);
+ outColor[1] = lerp(fraction, startHsv[1], endHsv[1]);
+ outColor[2] = lerp(fraction, startHsv[2], endHsv[2]);
+
+ return Color.HSVToColor(outColor);
+ }
+
+ private float hueLerp(float fraction, float start, float end) {
+ // If in flat part of curve, no interpolation necessary
+ if (start == end) {
+ return start;
+ }
+
+ // If the hues are more than 180 degrees apart, go the other way around the color wheel
+ // by moving the smaller value above 360
+ if (Math.abs(start - end) > 180f) {
+ if (start < end) {
+ start += 360f;
+ } else {
+ end += 360f;
+ }
+ }
+ // Lerp and ensure the final output is within [0, 360)
+ return lerp(fraction, start, end) % 360f;
+
+ }
+
+ private float lerp(float fraction, float start, float end) {
+ // If in flat part of curve, no interpolation necessary
+ if (start == end) {
+ return start;
+ }
+
+ // If outside bounds, use boundary value
+ if (fraction >= 1) {
+ return end;
+ }
+ if (fraction <= 0) {
+ return start;
+ }
+
+ return (end - start) * fraction + start;
+ }
+
+ private int binarySearch(float temperature) {
+ int low = 0;
+ int high = sTemperatureColorValues.length;
+
+ while (low <= high) {
+ int mid = (low + high) >>> 1;
+ float midVal = sTemperatureColorValues[mid].getTemperature();
+
+ if (midVal < temperature) {
+ low = mid + 1; // Neither val is NaN, thisVal is smaller
+ } else if (midVal > temperature) {
+ high = mid - 1; // Neither val is NaN, thisVal is larger
+ } else {
+ int midBits = Float.floatToIntBits(midVal);
+ int keyBits = Float.floatToIntBits(temperature);
+ if (midBits == keyBits) { // Values are equal
+ return mid; // Key found
+ } else if (midBits < keyBits) { // (-0.0, 0.0) or (!NaN, NaN)
+ low = mid + 1;
+ } else { /* (0.0, -0.0) or (NaN, !NaN)*/
+ high = mid - 1;
+ }
+ }
+ }
+ return -(low + 1); // key not found.
+ }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureTextAnimator.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureTextAnimator.java
new file mode 100644
index 000000000000..8ee5ef6badc3
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/hvac/TemperatureTextAnimator.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.hvac;
+
+import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isHorizontal;
+import static com.android.systemui.statusbar.hvac.AnimatedTemperatureView.isLeft;
+
+import android.annotation.NonNull;
+import android.view.animation.AccelerateDecelerateInterpolator;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.RotateAnimation;
+import android.view.animation.TranslateAnimation;
+import android.widget.TextSwitcher;
+
+/**
+ * Controls animating TemperatureView's text
+ */
+class TemperatureTextAnimator {
+
+ private static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
+ new DecelerateInterpolator();
+ private static final AccelerateDecelerateInterpolator ACCELERATE_DECELERATE_INTERPOLATOR =
+ new AccelerateDecelerateInterpolator();
+
+ private static final int ROTATION_DEGREES = 15;
+ private static final int DURATION_MILLIS = 200;
+
+ private AnimatedTemperatureView mParent;
+ private final TextSwitcher mTextSwitcher;
+ private final String mTempFormat;
+ private final int mPivotOffset;
+ private final CharSequence mMinText;
+ private final CharSequence mMaxText;
+
+ private Animation mTextInAnimationUp;
+ private Animation mTextOutAnimationUp;
+ private Animation mTextInAnimationDown;
+ private Animation mTextOutAnimationDown;
+ private Animation mTextFadeInAnimation;
+ private Animation mTextFadeOutAnimation;
+
+ private float mLastTemp = Float.NaN;
+
+ TemperatureTextAnimator(AnimatedTemperatureView parent, TextSwitcher textSwitcher,
+ String tempFormat, int pivotOffset,
+ CharSequence minText, CharSequence maxText) {
+ mParent = parent;
+ mTextSwitcher = textSwitcher;
+ mTempFormat = tempFormat;
+ mPivotOffset = pivotOffset;
+ mMinText = minText;
+ mMaxText = maxText;
+
+ mParent.addOnLayoutChangeListener(
+ (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
+ setupAnimations(mParent.getGravity()));
+ }
+
+ void setTemp(float temp) {
+ if (Float.isNaN(temp)) {
+ mTextSwitcher.setInAnimation(mTextFadeInAnimation);
+ mTextSwitcher.setOutAnimation(mTextFadeOutAnimation);
+ mTextSwitcher.setText("--");
+ mLastTemp = temp;
+ return;
+ }
+ boolean isMinValue = mParent.isMinValue(temp);
+ boolean isMaxValue = mParent.isMaxValue(temp);
+ if (Float.isNaN(mLastTemp)) {
+ mTextSwitcher.setInAnimation(mTextFadeInAnimation);
+ mTextSwitcher.setOutAnimation(mTextFadeOutAnimation);
+ } else if (!isMinValue && (isMaxValue || temp > mLastTemp)) {
+ mTextSwitcher.setInAnimation(mTextInAnimationUp);
+ mTextSwitcher.setOutAnimation(mTextOutAnimationUp);
+ } else {
+ mTextSwitcher.setInAnimation(mTextInAnimationDown);
+ mTextSwitcher.setOutAnimation(mTextOutAnimationDown);
+ }
+ CharSequence text;
+ if (isMinValue) {
+ text = mMinText;
+ } else if (isMaxValue) {
+ text = mMaxText;
+ } else {
+ text = String.format(mTempFormat, temp);
+ }
+ mTextSwitcher.setText(text);
+ mLastTemp = temp;
+ }
+
+ private void setupAnimations(int gravity) {
+ mTextFadeInAnimation = createFadeAnimation(true);
+ mTextFadeOutAnimation = createFadeAnimation(false);
+ if (!isHorizontal(gravity)) {
+ mTextInAnimationUp = createTranslateFadeAnimation(true, true);
+ mTextOutAnimationUp = createTranslateFadeAnimation(false, true);
+ mTextInAnimationDown = createTranslateFadeAnimation(true, false);
+ mTextOutAnimationDown = createTranslateFadeAnimation(false, false);
+ } else {
+ boolean isLeft = isLeft(gravity, mTextSwitcher.getLayoutDirection());
+ mTextInAnimationUp = createRotateFadeAnimation(true, isLeft, true);
+ mTextOutAnimationUp = createRotateFadeAnimation(false, isLeft, true);
+ mTextInAnimationDown = createRotateFadeAnimation(true, isLeft, false);
+ mTextOutAnimationDown = createRotateFadeAnimation(false, isLeft, false);
+ }
+ }
+
+ @NonNull
+ private Animation createFadeAnimation(boolean in) {
+ AnimationSet set = new AnimationSet(true);
+ AlphaAnimation alphaAnimation = new AlphaAnimation(in ? 0 : 1, in ? 1 : 0);
+ alphaAnimation.setDuration(DURATION_MILLIS);
+ set.addAnimation(new RotateAnimation(0, 0)); // Undo any previous rotation
+ set.addAnimation(alphaAnimation);
+ return set;
+ }
+
+ @NonNull
+ private Animation createTranslateFadeAnimation(boolean in, boolean up) {
+ AnimationSet set = new AnimationSet(true);
+ set.setInterpolator(ACCELERATE_DECELERATE_INTERPOLATOR);
+ set.setDuration(DURATION_MILLIS);
+ int fromYDelta = in ? (up ? 1 : -1) : 0;
+ int toYDelta = in ? 0 : (up ? -1 : 1);
+ set.addAnimation(
+ new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0,
+ Animation.RELATIVE_TO_SELF, fromYDelta, Animation.RELATIVE_TO_SELF,
+ toYDelta));
+ set.addAnimation(new AlphaAnimation(in ? 0 : 1, in ? 1 : 0));
+ return set;
+ }
+
+ @NonNull
+ private Animation createRotateFadeAnimation(boolean in, boolean isLeft, boolean up) {
+ AnimationSet set = new AnimationSet(true);
+ set.setInterpolator(DECELERATE_INTERPOLATOR);
+ set.setDuration(DURATION_MILLIS);
+
+ float degrees = isLeft == up ? -ROTATION_DEGREES : ROTATION_DEGREES;
+ int pivotX = isLeft ? -mPivotOffset : mParent.getWidth() + mPivotOffset;
+ set.addAnimation(
+ new RotateAnimation(in ? -degrees : 0f, in ? 0f : degrees, Animation.ABSOLUTE,
+ pivotX, Animation.ABSOLUTE, 0f));
+ set.addAnimation(new AlphaAnimation(in ? 0 : 1, in ? 1 : 0));
+ return set;
+ }
+}
diff --git a/packages/CtsShim/build/Android.mk b/packages/CtsShim/build/Android.mk
index ec14d50b371d..e645adc60b7c 100644
--- a/packages/CtsShim/build/Android.mk
+++ b/packages/CtsShim/build/Android.mk
@@ -66,6 +66,12 @@ LOCAL_FULL_MANIFEST_FILE := $(gen)
LOCAL_MULTILIB := both
LOCAL_JNI_SHARED_LIBRARIES := libshim_jni
+LOCAL_USE_AAPT2 := true
+# Disable AAPT2 manifest checks to fix:
+# out/target/common/obj/APPS/CtsShimPriv_intermediates/AndroidManifest.xml:25: error: unexpected element <restrict-update> found in <manifest>.
+# TODO(b/79755007): Remove when AAPT2 recognizes the manifest elements.
+LOCAL_AAPT_FLAGS += --warn-manifest-validation
+
include $(BUILD_PACKAGE)
###########################################################
@@ -106,6 +112,12 @@ LOCAL_PACKAGE_NAME := CtsShim
LOCAL_MANIFEST_FILE := shim/AndroidManifest.xml
+LOCAL_USE_AAPT2 := true
+# Disable AAPT2 manifest checks to fix:
+# frameworks/base/packages/CtsShim/build/shim/AndroidManifest.xml:25: error: unexpected element <restrict-update> found in <manifest>.
+# TODO(b/79755007): Remove when AAPT2 recognizes the manifest elements.
+LOCAL_AAPT_FLAGS += --warn-manifest-validation
+
include $(BUILD_PACKAGE)
###########################################################
diff --git a/packages/CtsShim/build/jni/Android.bp b/packages/CtsShim/build/jni/Android.bp
new file mode 100644
index 000000000000..ea15b43416b4
--- /dev/null
+++ b/packages/CtsShim/build/jni/Android.bp
@@ -0,0 +1,21 @@
+//
+// Copyright (C) 2017 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.
+//
+
+cc_library_shared {
+ name: "libshim_jni",
+ srcs: ["Shim.c"],
+ sdk_version: "24",
+}
diff --git a/packages/DefaultContainerService/Android.mk b/packages/DefaultContainerService/Android.mk
index 01c8768d349a..10c35c07ccf9 100644
--- a/packages/DefaultContainerService/Android.mk
+++ b/packages/DefaultContainerService/Android.mk
@@ -15,5 +15,3 @@ LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PACKAGE)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/packages/DefaultContainerService/jni/Android.bp b/packages/DefaultContainerService/jni/Android.bp
new file mode 100644
index 000000000000..7d7b09599dfe
--- /dev/null
+++ b/packages/DefaultContainerService/jni/Android.bp
@@ -0,0 +1,36 @@
+//
+// Copyright (C) 2010 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.
+//
+
+cc_library_shared {
+ name: "libdefcontainer_jni",
+
+ srcs: ["com_android_defcontainer_MeasurementUtils.cpp"],
+
+ shared_libs: [
+ "libnativehelper",
+ "libutils",
+ "liblog",
+ ],
+
+ static_libs: ["libdiskusage"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/packages/EasterEgg/Android.bp b/packages/EasterEgg/Android.bp
new file mode 100644
index 000000000000..43ed810b5674
--- /dev/null
+++ b/packages/EasterEgg/Android.bp
@@ -0,0 +1,33 @@
+//
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+android_app {
+ // the build system in pi-dev can't quite handle R.java in kt
+ // so we will have a mix of java and kotlin files
+ srcs: ["src/**/*.java", "src/**/*.kt"],
+
+ resource_dirs: ["res"],
+
+ name: "EasterEgg",
+
+ certificate: "platform",
+
+ sdk_version: "current",
+
+ optimize: {
+ enabled: false,
+ }
+}
diff --git a/packages/EasterEgg/Android.mk b/packages/EasterEgg/Android.mk
deleted file mode 100644
index 605a75d16977..000000000000
--- a/packages/EasterEgg/Android.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- jsr305
-
-LOCAL_STATIC_ANDROID_LIBRARIES := \
- android-support-v4 \
- android-support-v13 \
- android-support-dynamic-animation \
- android-support-v7-recyclerview \
- android-support-v7-preference \
- android-support-v7-appcompat \
- android-support-v14-preference
-
-LOCAL_USE_AAPT2 := true
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PACKAGE_NAME := EasterEgg
-LOCAL_PRIVATE_PLATFORM_APIS := true
-LOCAL_CERTIFICATE := platform
-
-include $(BUILD_PACKAGE)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/packages/EasterEgg/AndroidManifest.xml b/packages/EasterEgg/AndroidManifest.xml
index 172490dc9178..c7dd40d7afdb 100644
--- a/packages/EasterEgg/AndroidManifest.xml
+++ b/packages/EasterEgg/AndroidManifest.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-Copyright (C) 2016 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
+ 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
@@ -15,85 +15,28 @@ Copyright (C) 2016 The Android Open Source Project
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.egg"
- android:versionCode="1"
- android:versionName="1.0">
+ package="com.android.egg"
+ android:versionCode="1"
+ android:versionName="1.0">
- <uses-sdk android:minSdkVersion="26" />
+ <uses-sdk android:minSdkVersion="28" />
- <uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <application
+ android:icon="@drawable/icon"
+ android:label="@string/app_name">
- <application android:label="@string/app_name" android:icon="@drawable/icon">
-
- <activity android:name=".octo.Ocquarium"
- android:theme="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="com.android.internal.category.PLATLOGO" />
- </intent-filter>
- </activity>
-
- <!-- Android N lives on inside Android O... -->
-
- <!-- Long press the QS tile to get here -->
- <activity android:name=".neko.NekoLand"
- android:theme="@android:style/Theme.Material.NoActionBar"
- android:label="@string/app_name">
+ <activity
+ android:name=".paint.PaintActivity"
+ android:configChanges="orientation|keyboardHidden|screenSize|uiMode"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme">
<intent-filter>
- <action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
<action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <!-- This is where the magic happens -->
- <service
- android:name=".neko.NekoService"
- android:enabled="true"
- android:permission="android.permission.BIND_JOB_SERVICE"
- android:exported="true" >
- </service>
-
- <!-- Used to show over lock screen -->
- <activity android:name=".neko.NekoLockedActivity"
- android:excludeFromRecents="true"
- android:theme="@android:style/Theme.Material.Light.Dialog.NoActionBar"
- android:showOnLockScreen="true" />
-
- <!-- Used to enable easter egg -->
- <activity android:name=".neko.NekoActivationActivity"
- android:excludeFromRecents="true"
- android:theme="@android:style/Theme.NoDisplay"
- >
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEFAULT" />
+ <!--<category android:name="android.intent.category.LAUNCHER" />-->
+ <category android:name="com.android.internal.category.PLATLOGO" />
</intent-filter>
</activity>
-
- <!-- The quick settings tile, disabled by default -->
- <service
- android:name=".neko.NekoTile"
- android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
- android:icon="@drawable/stat_icon"
- android:enabled="false"
- android:label="@string/default_tile_name">
- <intent-filter>
- <action android:name="android.service.quicksettings.action.QS_TILE" />
- </intent-filter>
- </service>
-
- <!-- FileProvider for sending pictures -->
- <provider
- android:name="android.support.v4.content.FileProvider"
- android:authorities="com.android.egg.fileprovider"
- android:grantUriPermissions="true"
- android:exported="false">
- <meta-data
- android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/filepaths" />
- </provider>
</application>
+
</manifest>
diff --git a/packages/EasterEgg/res/drawable/leg1.xml b/packages/EasterEgg/res/color-night/toolbar_icon_color.xml
index d72c746b6232..c0a81520f849 100644
--- a/packages/EasterEgg/res/drawable/leg1.xml
+++ b/packages/EasterEgg/res/color-night/toolbar_icon_color.xml
@@ -1,7 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
-Copyright (C) 2016 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
+ 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
@@ -13,10 +14,7 @@ Copyright (C) 2016 The Android Open Source Project
See the License for the specific language governing permissions and
limitations under the License.
-->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="leg1" android:fillColor="#FF000000" android:pathData="M9,37h5v6h-5z"/>
-</vector>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="#FFFF3333" android:state_selected="true" />
+ <item android:color="#FFFFFFFF" />
+</selector> \ No newline at end of file
diff --git a/packages/EasterEgg/res/values/dimens.xml b/packages/EasterEgg/res/color/toolbar_icon_color.xml
index e9dcebd27f7b..d3247e406a91 100644
--- a/packages/EasterEgg/res/values/dimens.xml
+++ b/packages/EasterEgg/res/color/toolbar_icon_color.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-Copyright (C) 2016 The Android Open Source Project
+Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,6 +14,7 @@ Copyright (C) 2016 The Android Open Source Project
See the License for the specific language governing permissions and
limitations under the License.
-->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <dimen name="neko_display_size">64dp</dimen>
-</resources>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="#FFCC0000" android:state_selected="true" />
+ <item android:color="#FF000000" />
+</selector> \ No newline at end of file
diff --git a/packages/EasterEgg/res/drawable/belly.xml b/packages/EasterEgg/res/drawable/belly.xml
deleted file mode 100644
index 8b0e9afac463..000000000000
--- a/packages/EasterEgg/res/drawable/belly.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="belly" android:fillColor="#FF000000" android:pathData="M20.5,25c-3.6,0 -6.5,2.9 -6.5,6.5V38h13v-6.5C27,27.9 24.1,25 20.5,25z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/body.xml b/packages/EasterEgg/res/drawable/body.xml
deleted file mode 100644
index 86087209eff5..000000000000
--- a/packages/EasterEgg/res/drawable/body.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="body" android:fillColor="#FF000000" android:pathData="M9,20h30v18h-30z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/cap.xml b/packages/EasterEgg/res/drawable/cap.xml
deleted file mode 100644
index d8b4cc58a261..000000000000
--- a/packages/EasterEgg/res/drawable/cap.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="cap" android:fillColor="#FF000000" android:pathData="M27.2,3.8c-1,-0.2 -2.1,-0.3 -3.2,-0.3s-2.1,0.1 -3.2,0.3c0.2,1.3 1.5,2.2 3.2,2.2C25.6,6.1 26.9,5.1 27.2,3.8z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/collar.xml b/packages/EasterEgg/res/drawable/collar.xml
deleted file mode 100644
index 5e4d0fd4f886..000000000000
--- a/packages/EasterEgg/res/drawable/collar.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="collar" android:fillColor="#FF000000" android:pathData="M9,18.4h30v1.7h-30z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/face_spot.xml b/packages/EasterEgg/res/drawable/face_spot.xml
deleted file mode 100644
index a89fb4fdaadd..000000000000
--- a/packages/EasterEgg/res/drawable/face_spot.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="face_spot" android:fillColor="#FF000000" android:pathData="M19.5,15.2a4.5,3.2 0,1 0,9 0a4.5,3.2 0,1 0,-9 0z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/food_bits.xml b/packages/EasterEgg/res/drawable/food_bits.xml
deleted file mode 100644
index 1b2bb6f36947..000000000000
--- a/packages/EasterEgg/res/drawable/food_bits.xml
+++ /dev/null
@@ -1,33 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M19.1,34l-3.5,1.3c-1,0.4,-2.2,-0.1,-2.6,-1.1l-1.2,-3c-0.4,-1,0.1,-2.2,1.1,-2.6l3.5,-1.3c1,-0.4,2.2,0.1,2.6,1.1l1.2,3 C20.6,32.4,20.1,33.6,19.1,34z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M25.2,28.1L22.9,28c-0.8,0,-1.5,-0.7,-1.4,-1.6l0.1,-2c0,-0.8,0.7,-1.5,1.6,-1.4l2.4,0.1c0.8,0,1.5,0.7,1.4,1.6l-0.1,2 C26.8,27.5,26.1,28.1,25.2,28.1z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M18.7,23.1L16.5,23c-0.5,0,-0.9,-0.4,-0.8,-0.9l0.1,-2.2c0,-0.5,0.4,-0.9,0.9,-0.8l2.2,0.1c0.5,0,0.9,0.4,0.8,0.9 l-0.1,2.2C19.6,22.8,19.2,23.1,18.7,23.1z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M32.2,35.3l-3.6,-1.8c-1,-0.5,-1.4,-1.7,-0.9,-2.7l1.6,-3.1c0.5,-1,1.7,-1.4,2.7,-0.9l3.6,1.8c1,0.5,1.4,1.7,0.9,2.7 l-1.6,3.1C34.4,35.4,33.2,35.7,32.2,35.3z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/food_chicken.xml b/packages/EasterEgg/res/drawable/food_chicken.xml
deleted file mode 100644
index 95b2fb55b796..000000000000
--- a/packages/EasterEgg/res/drawable/food_chicken.xml
+++ /dev/null
@@ -1,39 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M9,12v14h10V11H9z M11.7,16.3c-0.7,0,-1.3,-0.6,-1.3,-1.3s0.6,-1.3,1.3,-1.3S13,14.3,13,15S12.4,16.3,11.7,16.3z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M5.7,20.1l1.6,-3.0l-1.6,-3.0l4.4,3.0z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M19.0,6.0l-2.3,2.3l-2.7,-2.6l-2.7,2.6l-2.3,-2.3l0.0,4.0l10.0,0.0z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M9,25c0,8.3,6.7,15,15,15s15,-6.7,15,-15H9z M29.9,31.5h-11v-1h12L29.9,31.5z M31.9,29.5h-13v-1h14L31.9,29.5z M33.9,27.5 h-15v-1h16L33.9,27.5z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M27.0,38.6h2.0v6.0h-2.0z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M17.4,44.6l-2.1999998,0.0l4.4000006,-6.0l2.1999989,0.0z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/food_cookie.xml b/packages/EasterEgg/res/drawable/food_cookie.xml
deleted file mode 100644
index 74dd134355e2..000000000000
--- a/packages/EasterEgg/res/drawable/food_cookie.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2017 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <group>
- <path
- android:fillColor="#55FFFFFF"
- android:fillType="evenOdd"
- android:pathData="M5.71 18.29A8.99 8.99 0 0 0 22 13c0-3-1.46-5.65-3.71-7.29A8.99 8.99 0 0 0 2 11c0 3 1.46 5.65 3.71 7.29z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:fillType="evenOdd"
- android:pathData="M7.25 19.18A8.5 8.5 0 0 0 19.19 7.24 9 9 0 0 1 7.24 19.19z"/>
- <path
- android:fillColor="#55FFFFFF"
- android:pathData="M10.5 3a0.5 0.5 0 1 1 1 0v2.05a0.5 0.5 0 1 1-1 0V3zm3.1 0.42a0.5 0.5 0 0 1 0.93 0.39l-0.8 1.88A0.5 0.5 0 1 1 12.8 5.3l0.8-1.88zm2.7 1.57a0.5 0.5 0 1 1 0.71 0.7l-1.45 1.46a0.5 0.5 0 0 1-0.7-0.71l1.44-1.45zm1.9 2.5a0.5 0.5 0 0 1 0.38 0.92l-1.9 0.77a0.5 0.5 0 0 1-0.37-0.93l1.9-0.77zM19 10.5a0.5 0.5 0 1 1 0 1h-2.05a0.5 0.5 0 0 1 0-1H19zm-0.42 3.1a0.5 0.5 0 0 1-0.39 0.93l-1.88-0.8a0.5 0.5 0 1 1 0.39-0.92l1.88 0.8zm-1.57 2.7a0.5 0.5 0 1 1-0.7 0.71l-1.46-1.45a0.5 0.5 0 0 1 0.71-0.7l1.45 1.44zm-2.5 1.9a0.5 0.5 0 1 1-0.92 0.38l-0.77-1.9a0.5 0.5 0 0 1 0.93-0.37l0.77 1.9zM11.5 19a0.5 0.5 0 1 1-1 0v-2.05a0.5 0.5 0 0 1 1 0V19zm-3.1-0.42a0.5 0.5 0 0 1-0.93-0.39l0.8-1.88A0.5 0.5 0 0 1 9.2 16.7l-0.8 1.88zm-2.7-1.57a0.5 0.5 0 1 1-0.71-0.7l1.45-1.46a0.5 0.5 0 0 1 0.7 0.71L5.7 17.01zm-1.9-2.48a0.5 0.5 0 0 1-0.38-0.92l1.88-0.8a0.5 0.5 0 0 1 0.4 0.92l-1.9 0.8zM3 11.5a0.5 0.5 0 1 1 0-1h2.05a0.5 0.5 0 1 1 0 1H3zm0.42-3.1A0.5 0.5 0 0 1 3.8 7.46l1.88 0.8A0.5 0.5 0 1 1 5.3 9.2L3.42 8.4zm1.57-2.7a0.5 0.5 0 1 1 0.7-0.71l1.46 1.45a0.5 0.5 0 0 1-0.71 0.7L4.99 5.7zm2.5-1.9A0.5 0.5 0 0 1 8.4 3.41l0.77 1.9a0.5 0.5 0 0 1-0.93 0.37L7.48 3.8z"/>
- </group>
-</vector> \ No newline at end of file
diff --git a/packages/EasterEgg/res/drawable/food_dish.xml b/packages/EasterEgg/res/drawable/food_dish.xml
deleted file mode 100644
index 3fff6a90fad2..000000000000
--- a/packages/EasterEgg/res/drawable/food_dish.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M24,13.8C11.3,13.8,1,18.3,1,24c0,5.7,10.3,10.2,23,10.2S47,29.7,47,24C47,18.3,36.7,13.8,24,13.8z M33.7,26.6 c1.1,-0.6,1.8,-1.3,1.8,-2c0,-2.1,-5.2,-3.8,-11.7,-3.8s-11.7,1.7,-11.7,3.8c0,0.6,0.4,1.2,1.2,1.7c-1.7,-0.8,-2.8,-1.7,-2.8,-2.8 c0,-2.5,6,-4.5,13.4,-4.5s13.4,2,13.4,4.5C37.4,24.7,36,25.8,33.7,26.6z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/food_donut.xml b/packages/EasterEgg/res/drawable/food_donut.xml
deleted file mode 100644
index eaf831ea560c..000000000000
--- a/packages/EasterEgg/res/drawable/food_donut.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M24,4.5c-10.5,0,-19,8.5,-19,19s8.5,19,19,19s19,-8.5,19,-19S34.5,4.5,24,4.5z M35.2,15.5l1.6,-1.1 c0.3,-0.2,0.6,-0.1,0.8,0.1l0.1,0.1c0.2,0.3,0.1,0.6,-0.1,0.8l-1.6,1.1c-0.3,0.2,-0.6,0.1,-0.8,-0.1l-0.1,-0.1 C34.9,16.1,35,15.7,35.2,15.5z M32.7,10.7c0,-0.3,0.3,-0.5,0.6,-0.5l0.1,0c0.3,0,0.5,0.3,0.5,0.6l-0.2,2c0,0.3,-0.3,0.5,-0.6,0.5l-0.1,0 c-0.3,0,-0.5,-0.3,-0.5,-0.6L32.7,10.7z M31.7,15.1l1.5,-0.2c0.2,0,0.5,0.1,0.5,0.4l0,0.1c0,0.2,-0.1,0.5,-0.4,0.5l-1.5,0.2 c-0.2,0,-0.5,-0.1,-0.5,-0.4l0,-0.1C31.3,15.4,31.5,15.2,31.7,15.1z M28.8,10.6l1.6,-1.1c0.3,-0.2,0.6,-0.1,0.8,0.1l0.1,0.1 c0.2,0.3,0.1,0.6,-0.1,0.8l-1.6,1.1c-0.3,0.2,-0.6,0.1,-0.8,-0.1l-0.1,-0.1C28.4,11.1,28.5,10.8,28.8,10.6z M25.8,6 c0,-0.3,0.3,-0.5,0.6,-0.5l0.1,0c0.3,0,0.5,0.3,0.5,0.6l-0.2,2c0,0.3,-0.3,0.5,-0.6,0.5l-0.1,0c-0.3,0,-0.5,-0.3,-0.5,-0.6L25.8,6z M20.7,6.5l1.9,-0.7c0.3,-0.1,0.6,0,0.7,0.3l0,0.1c0.1,0.3,0,0.6,-0.3,0.7l-1.9,0.7c-0.3,0.1,-0.6,0,-0.7,-0.3l0,-0.1 C20.3,6.9,20.4,6.6,20.7,6.5z M19.9,10.9l1.5,-0.2c0.2,0,0.5,0.1,0.5,0.4l0,0.1c0,0.2,-0.1,0.5,-0.4,0.5l-1.5,0.2 c-0.2,0,-0.5,-0.1,-0.5,-0.4l0,-0.1C19.5,11.1,19.7,10.9,19.9,10.9z M16,10.9L16,10.9c0.2,-0.3,0.4,-0.4,0.6,-0.3l1.3,0.7 c0.2,0.1,0.3,0.4,0.2,0.6L18,12c-0.1,0.2,-0.4,0.3,-0.6,0.2l-1.3,-0.7C15.9,11.4,15.8,11.1,16,10.9z M15.8,18.5c0.2,0,0.4,0.1,0.5,0.4 l0,0.1c0,0.2,-0.1,0.4,-0.4,0.5l-1.5,0.2c-0.2,0,-0.4,-0.1,-0.5,-0.4l0,-0.1c0,-0.2,0.1,-0.4,0.4,-0.5L15.8,18.5z M14,21.8l-1.6,1.1 c-0.3,0.2,-0.6,0.1,-0.8,-0.1l-0.1,-0.1c-0.2,-0.3,-0.1,-0.6,0.1,-0.8l1.6,-1.1c0.3,-0.2,0.6,-0.1,0.8,0.1l0.1,0.1 C14.3,21.3,14.3,21.6,14,21.8z M12.4,12L12.4,12c0.3,-0.2,0.5,-0.2,0.7,-0.1l1,1.1c0.2,0.2,0.2,0.4,0,0.6L14,13.7 c-0.2,0.2,-0.4,0.2,-0.6,0l-1,-1.1C12.2,12.4,12.2,12.1,12.4,12z M8.3,24.5c0,0.3,-0.3,0.5,-0.6,0.5l-0.1,0c-0.3,0,-0.5,-0.3,-0.5,-0.6 l0.2,-2c0,-0.3,0.3,-0.5,0.6,-0.5l0.1,0c0.3,0,0.5,0.3,0.5,0.6L8.3,24.5z M8.5,16.2v-0.1c0,-0.3,0.2,-0.6,0.6,-0.6h2 c0.3,0,0.6,0.2,0.6,0.6v0.1c0,0.3,-0.2,0.6,-0.6,0.6H9C8.7,16.7,8.5,16.5,8.5,16.2z M10.3,20.7c-0.3,0.2,-0.6,0.1,-0.8,-0.1l-0.1,-0.1 c-0.2,-0.3,-0.1,-0.6,0.1,-0.8l1.6,-1.1c0.3,-0.2,0.6,-0.1,0.8,0.1l0.1,0.1c0.2,0.3,0.1,0.6,-0.1,0.8L10.3,20.7z M11.3,28.3l0,-0.1 c-0.1,-0.3,0,-0.6,0.3,-0.7l1.9,-0.7c0.3,-0.1,0.6,0,0.7,0.3l0,0.1c0.1,0.3,0,0.6,-0.3,0.7L12,28.6C11.7,28.7,11.4,28.6,11.3,28.3z M14.4,33c0,0.2,-0.2,0.4,-0.4,0.4h-1.5c-0.2,0,-0.4,-0.2,-0.4,-0.4v-0.1c0,-0.2,0.2,-0.4,0.4,-0.4H14c0.2,0,0.4,0.2,0.4,0.4V33z M17.9,35.2 l-1.6,1.1c-0.3,0.2,-0.6,0.1,-0.8,-0.1l-0.1,-0.1c-0.2,-0.3,-0.1,-0.6,0.1,-0.8l1.6,-1.1c0.3,-0.2,0.6,-0.1,0.8,0.1l0.1,0.1 C18.2,34.7,18.2,35.1,17.9,35.2z M20.7,33.8l-0.1,0.1c-0.1,0.3,-0.5,0.4,-0.8,0.2l-1.7,-1c-0.3,-0.1,-0.4,-0.5,-0.2,-0.8l0.1,-0.1 c0.1,-0.3,0.5,-0.4,0.8,-0.2l1.7,1C20.7,33.2,20.8,33.5,20.7,33.8z M17.5,23.5c0,-3.6,2.9,-6.5,6.5,-6.5s6.5,2.9,6.5,6.5 c0,3.6,-2.9,6.5,-6.5,6.5S17.5,27.1,17.5,23.5z M27.4,35.7l-1.9,0.7c-0.3,0.1,-0.6,0,-0.7,-0.3l0,-0.1c-0.1,-0.3,0,-0.6,0.3,-0.7l1.9,-0.7 c0.3,-0.1,0.6,0,0.7,0.3l0,0.1C27.9,35.3,27.7,35.6,27.4,35.7z M29.7,32.7l-1.4,0.5c-0.2,0.1,-0.5,0,-0.5,-0.3l0,-0.1 c-0.1,-0.2,0,-0.5,0.3,-0.5l1.4,-0.5c0.2,-0.1,0.5,0,0.5,0.3l0,0.1C30,32.3,29.9,32.6,29.7,32.7z M32.8,35.5l-0.1,0.1 c-0.1,0.3,-0.5,0.4,-0.8,0.2l-1.7,-1c-0.3,-0.1,-0.4,-0.5,-0.2,-0.8l0.1,-0.1c0.1,-0.3,0.5,-0.4,0.8,-0.2l1.7,1C32.8,34.9,32.9,35.2,32.8,35.5z M33.7,30.9c0,0.2,-0.2,0.4,-0.5,0.4l-0.1,0c-0.2,0,-0.4,-0.2,-0.4,-0.5l0.1,-1.5c0,-0.2,0.2,-0.4,0.5,-0.4l0.1,0c0.2,0,0.4,0.2,0.4,0.5 L33.7,30.9z M34.5,26.5l-1.3,0.9c-0.2,0.1,-0.5,0.1,-0.6,-0.1l-0.1,-0.1c-0.1,-0.2,-0.1,-0.5,0.1,-0.6l1.3,-0.9c0.2,-0.1,0.5,-0.1,0.6,0.1 l0.1,0.1C34.8,26.1,34.7,26.3,34.5,26.5z M35.6,20.6l-1.7,-1c-0.3,-0.1,-0.4,-0.5,-0.2,-0.8l0.1,-0.1c0.1,-0.3,0.5,-0.4,0.8,-0.2l1.7,1 c0.3,0.1,0.4,0.5,0.2,0.8l-0.1,0.1C36.2,20.6,35.8,20.7,35.6,20.6z M38.6,27.1l-1.6,1.1c-0.3,0.2,-0.6,0.1,-0.8,-0.1L36.1,28 c-0.2,-0.3,-0.1,-0.6,0.1,-0.8l1.6,-1.1c0.3,-0.2,0.6,-0.1,0.8,0.1l0.1,0.1C38.9,26.6,38.8,27,38.6,27.1z M39,19.4l-1.5,0.2 c-0.2,0,-0.5,-0.1,-0.5,-0.4l0,-0.1c0,-0.2,0.1,-0.5,0.4,-0.5l1.5,-0.2c0.2,0,0.5,0.1,0.5,0.4l0,0.1C39.4,19.1,39.2,19.3,39,19.4z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/food_sysuituna.xml b/packages/EasterEgg/res/drawable/food_sysuituna.xml
deleted file mode 100644
index 28cf4a2c7683..000000000000
--- a/packages/EasterEgg/res/drawable/food_sysuituna.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M46,18.4l-5.8,4.6c-3.9,-3.2,-8.9,-5.6,-14.6,-6.3l1.2,-6l-7.3,5.9C12.5,17.2,6.4,20,2,24.3l7.2,1.4L2,27 c4.3,4.2,10.4,7.1,17.3,7.6l3.1,2.5L22,34.8c7.1,0,13.5,-2.5,18.2,-6.5l5.8,4.6l-1.4,-7.2L46,18.4z M14.3,24.8l-0.6,0.6l-1.1,-1.1 l-1.1,1.1l-0.6,-0.6l1.1,-1.1l-1.1,-1.1l0.6,-0.6l1.1,1.1l1.1,-1.1l0.6,0.6l-1.1,1.1L14.3,24.8z M18.8,29.1c0.7,-0.8,1.1,-2.2,1.1,-3.8 c0,-1.6,-0.4,-3,-1.1,-3.8c1.1,0.5,1.9,2,1.9,3.8S19.9,28.5,18.8,29.1z M20.7,29.1c0.7,-0.8,1.1,-2.2,1.1,-3.8c0,-1.6,-0.4,-3,-1.1,-3.8 c1.1,0.5,1.9,2,1.9,3.8S21.8,28.5,20.7,29.1z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/foot1.xml b/packages/EasterEgg/res/drawable/foot1.xml
deleted file mode 100644
index 0d9085998a18..000000000000
--- a/packages/EasterEgg/res/drawable/foot1.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="foot1" android:fillColor="#FF000000" android:pathData="M11.5,43m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/foot2.xml b/packages/EasterEgg/res/drawable/foot2.xml
deleted file mode 100644
index 364ba0cd861c..000000000000
--- a/packages/EasterEgg/res/drawable/foot2.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="foot2" android:fillColor="#FF000000" android:pathData="M18.5,43m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/foot3.xml b/packages/EasterEgg/res/drawable/foot3.xml
deleted file mode 100644
index e3a512a2568d..000000000000
--- a/packages/EasterEgg/res/drawable/foot3.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="foot3" android:fillColor="#FF000000" android:pathData="M29.5,43m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/foot4.xml b/packages/EasterEgg/res/drawable/foot4.xml
deleted file mode 100644
index 66b78fa26649..000000000000
--- a/packages/EasterEgg/res/drawable/foot4.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="foot4" android:fillColor="#FF000000" android:pathData="M36.5,43m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/head.xml b/packages/EasterEgg/res/drawable/head.xml
deleted file mode 100644
index df600a8613cd..000000000000
--- a/packages/EasterEgg/res/drawable/head.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="head" android:fillColor="#FF000000" android:pathData="M9,18.5c0,-8.3 6.8,-15 15,-15s15,6.7 15,15H9z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/back.xml b/packages/EasterEgg/res/drawable/ic_clear.xml
index b55d65cdf76d..489dcd20759d 100644
--- a/packages/EasterEgg/res/drawable/back.xml
+++ b/packages/EasterEgg/res/drawable/ic_clear.xml
@@ -1,5 +1,5 @@
<!--
-Copyright (C) 2016 The Android Open Source Project
+Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,9 +14,14 @@ Copyright (C) 2016 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="back" android:fillColor="#FF000000" android:pathData="M37.1,22c-1.1,0 -1.9,0.8 -1.9,1.9v5.6c0,1.1 0.8,1.9 1.9,1.9H39v-1.9v-5.6V22H37.1z"/>
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M19,6.41l-1.41,-1.41l-5.59,5.59l-5.59,-5.59l-1.41,1.41l5.59,5.59l-5.59,5.59l1.41,1.41l5.59,-5.59l5.59,5.59l1.41,-1.41l-5.59,-5.59z"
+ android:strokeWidth="1"
+ android:fillColor="#000000"
+ android:fillType="nonZero"
+ android:strokeColor="#00000000"/>
</vector>
diff --git a/packages/EasterEgg/res/drawable/ic_dropper.xml b/packages/EasterEgg/res/drawable/ic_dropper.xml
new file mode 100644
index 000000000000..230730921b9a
--- /dev/null
+++ b/packages/EasterEgg/res/drawable/ic_dropper.xml
@@ -0,0 +1,39 @@
+<!--
+Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M13.6789,5.6997L3,16.3784L3,20L4,21L7.6216,21L18.3004,10.3212L13.6789,5.6997ZM7,19L5,19L5,17L13.788,8.344L15.6561,10.212L7,19Z"
+ android:strokeWidth="1"
+ android:fillColor="#000000"
+ android:fillType="nonZero"
+ android:strokeColor="#00000000"/>
+ <path
+ android:pathData="M20.9983,2.4982L21.5018,3.0017C22.0876,3.5875 22.0876,4.5373 21.5018,5.1231L18.1231,8.5018C17.5373,9.0876 16.5875,9.0876 16.0017,8.5018L15.4982,7.9983C14.9124,7.4125 14.9124,6.4627 15.4982,5.8769L18.8769,2.4982C19.4627,1.9124 20.4125,1.9124 20.9983,2.4982Z"
+ android:strokeWidth="1"
+ android:fillColor="#000000"
+ android:fillType="evenOdd"
+ android:strokeColor="#00000000"/>
+ <path
+ android:pathData="M13.8284,3l7.0711,7.0711l-2.8284,2.8284l-7.0711,-7.0711z"
+ android:strokeWidth="1"
+ android:fillColor="#000000"
+ android:fillType="evenOdd"
+ android:strokeColor="#00000000"/>
+</vector>
diff --git a/packages/EasterEgg/res/drawable/ic_hourglass.xml b/packages/EasterEgg/res/drawable/ic_hourglass.xml
new file mode 100644
index 000000000000..fe4b9c47e547
--- /dev/null
+++ b/packages/EasterEgg/res/drawable/ic_hourglass.xml
@@ -0,0 +1,27 @@
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:pathData="M12.5,11L16,7.5L16,4L8,4L8,7.5L11.5,11L11.5,13L8,16.5L8,20L16,20L16,16.5L12.5,13L12.5,11ZM6,2L18,2L18,8L17.99,8L18,8.01L14,12L18,16L17.99,16.01L18,16.01L18,22L6,22L6,16.01L6.01,16.01L6,16L10,12L6,8.01L6.01,8L6,8L6,2Z"
+ android:strokeWidth="1"
+ android:fillColor="#000000"
+ android:fillType="nonZero"
+ android:strokeColor="#00000000"/>
+</vector>
diff --git a/packages/EasterEgg/res/drawable/ic_share.xml b/packages/EasterEgg/res/drawable/ic_share.xml
deleted file mode 100644
index 8cebc7ed46de..000000000000
--- a/packages/EasterEgg/res/drawable/ic_share.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
- Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24.0dp"
- android:height="24.0dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M18.0,16.08c-0.76,0.0 -1.4,0.3 -1.9,0.77L8.91,12.7c0.05,-0.2 0.09,-0.4 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.5,0.5 1.2,0.81 2.0,0.81 1.66,0.0 3.0,-1.34 3.0,-3.0s-1.34,-3.0 -3.0,-3.0 -3.0,1.34 -3.0,3.0c0.0,0.2 0.0,0.4 0.0,0.7L8.04,9.81C7.5,9.31 6.79,9.0 6.0,9.0c-1.66,0.0 -3.0,1.34 -3.0,3.0s1.34,3.0 3.0,3.0c0.79,0.0 1.5,-0.31 2.04,-0.81l7.12,4.16c0.0,0.21 0.0,0.43 0.0,0.65 0.0,1.61 1.31,2.92 2.92,2.92 1.61,0.0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/icon.xml b/packages/EasterEgg/res/drawable/icon.xml
index 5ce9e5133847..2306b7b554c5 100644
--- a/packages/EasterEgg/res/drawable/icon.xml
+++ b/packages/EasterEgg/res/drawable/icon.xml
@@ -1,7 +1,7 @@
<!--
-Copyright (C) 2017 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
+ 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
@@ -13,28 +13,7 @@ Copyright (C) 2017 The Android Open Source Project
See the License for the specific language governing permissions and
limitations under the License.
-->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:pathData="M25.0,25.0m-20.5,0.0a20.5,20.5,0,1,1,41.0,0.0a20.5,20.5,0,1,1,-41.0,0.0"
- android:fillAlpha="0.066"
- android:fillColor="#000000"/>
- <path
- android:pathData="M24.0,24.0m-20.0,0.0a20.0,20.0,0,1,1,40.0,0.0a20.0,20.0,0,1,1,-40.0,0.0"
- android:fillColor="#283593"/>
- <path
- android:pathData="M44,24.2010101 L33.9004889,14.101499 L14.101499,33.9004889 L24.2010101,44 C29.2525804,43.9497929 34.2887564,41.9975027 38.1431296,38.1431296 C41.9975027,34.2887564 43.9497929,29.2525804 44,24.2010101 Z"
- android:fillColor="#1a237e"/>
- <path
- android:pathData="M24.0,24.0m-14.0,0.0a14.0,14.0,0,1,1,28.0,0.0a14.0,14.0,0,1,1,-28.0,0.0"
- android:fillColor="#5c6bc0"/>
- <path
- android:pathData="M37.7829445,26.469236 L29.6578482,18.3441397 L18.3441397,29.6578482 L26.469236,37.7829445 C29.1911841,37.2979273 31.7972024,36.0037754 33.9004889,33.9004889 C36.0037754,31.7972024 37.2979273,29.1911841 37.7829445,26.469236 Z"
- android:fillColor="#3f51b5"/>
- <path
- android:pathData="M24.0,24.0m-8.0,0.0a8.0,8.0,0,1,1,16.0,0.0a8.0,8.0,0,1,1,-16.0,0.0"
- android:fillColor="#FFFFFF"/>
-</vector>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/icon_bg"/>
+ <foreground android:drawable="@drawable/p"/>
+</adaptive-icon>
diff --git a/packages/EasterEgg/res/xml/filepaths.xml b/packages/EasterEgg/res/drawable/icon_bg.xml
index 2130025e9265..c1553ce50946 100644
--- a/packages/EasterEgg/res/xml/filepaths.xml
+++ b/packages/EasterEgg/res/drawable/icon_bg.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-Copyright (C) 2017 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
+ 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
@@ -14,6 +14,5 @@ Copyright (C) 2017 The Android Open Source Project
See the License for the specific language governing permissions and
limitations under the License.
-->
-<paths>
- <external-path name="cats" path="Pictures/Cats" />
-</paths> \ No newline at end of file
+<color xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="#C5E1A5" /> \ No newline at end of file
diff --git a/packages/EasterEgg/res/drawable/left_ear.xml b/packages/EasterEgg/res/drawable/left_ear.xml
deleted file mode 100644
index 2b98736df039..000000000000
--- a/packages/EasterEgg/res/drawable/left_ear.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="left_ear" android:fillColor="#FF000000" android:pathData="M15.4,1l5.1000004,5.3l-6.3,2.8000002z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/left_ear_inside.xml b/packages/EasterEgg/res/drawable/left_ear_inside.xml
deleted file mode 100644
index 1d947edc31e2..000000000000
--- a/packages/EasterEgg/res/drawable/left_ear_inside.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="left_ear_inside" android:fillColor="#FF000000" android:pathData="M15.4,1l3.5,6.2l-4.7,1.9z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/left_eye.xml b/packages/EasterEgg/res/drawable/left_eye.xml
deleted file mode 100644
index 4dde1b661393..000000000000
--- a/packages/EasterEgg/res/drawable/left_eye.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="left_eye" android:fillColor="#FF000000" android:pathData="M20.5,11c0,1.7 -3,1.7 -3,0C17.5,9.3 20.5,9.3 20.5,11z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/leg2.xml b/packages/EasterEgg/res/drawable/leg2.xml
deleted file mode 100644
index a772a870af7d..000000000000
--- a/packages/EasterEgg/res/drawable/leg2.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="leg2" android:fillColor="#FF000000" android:pathData="M16,37h5v6h-5z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/leg2_shadow.xml b/packages/EasterEgg/res/drawable/leg2_shadow.xml
deleted file mode 100644
index b01bd6995c0b..000000000000
--- a/packages/EasterEgg/res/drawable/leg2_shadow.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="leg2_shadow" android:fillColor="#FF000000" android:pathData="M16,37h5v3h-5z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/leg3.xml b/packages/EasterEgg/res/drawable/leg3.xml
deleted file mode 100644
index d471236687b5..000000000000
--- a/packages/EasterEgg/res/drawable/leg3.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="leg3" android:fillColor="#FF000000" android:pathData="M27,37h5v6h-5z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/leg4.xml b/packages/EasterEgg/res/drawable/leg4.xml
deleted file mode 100644
index e5868eb80c59..000000000000
--- a/packages/EasterEgg/res/drawable/leg4.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="leg4" android:fillColor="#FF000000" android:pathData="M34,37h5v6h-5z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/mouth.xml b/packages/EasterEgg/res/drawable/mouth.xml
deleted file mode 100644
index ddcf2e82f976..000000000000
--- a/packages/EasterEgg/res/drawable/mouth.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="mouth"
- android:strokeColor="#FF000000"
- android:strokeWidth="1.2"
- android:strokeLineCap="round"
- android:pathData="M29,14.3c-0.4,0.8 -1.3,1.4 -2.3,1.4c-1.4,0 -2.7,-1.3 -2.7,-2.7
- M24,13c0,1.5 -1.2,2.7 -2.7,2.7c-1,0 -1.9,-0.5 -2.3,-1.4"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/nose.xml b/packages/EasterEgg/res/drawable/nose.xml
deleted file mode 100644
index d403cd1baadf..000000000000
--- a/packages/EasterEgg/res/drawable/nose.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="nose" android:fillColor="#FF000000" android:pathData="M25.2,13c0,1.3 -2.3,1.3 -2.3,0S25.2,11.7 25.2,13z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/octo_bg.xml b/packages/EasterEgg/res/drawable/octo_bg.xml
deleted file mode 100644
index 1e46cf434a8b..000000000000
--- a/packages/EasterEgg/res/drawable/octo_bg.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient android:angle="-90"
- android:startColor="#FF205090"
- android:endColor="#FF001040"
- android:type="linear"
- />
-</shape> \ No newline at end of file
diff --git a/packages/EasterEgg/res/drawable/p.xml b/packages/EasterEgg/res/drawable/p.xml
new file mode 100644
index 000000000000..596b7824cdb7
--- /dev/null
+++ b/packages/EasterEgg/res/drawable/p.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="108"
+ android:viewportHeight="108">
+ <path
+ android:pathData="M49,65L54,65C60.075,65 65,60.075 65,54C65,47.925 60.075,43 54,43C47.925,43 43,47.925 43,54L43,108"
+ android:strokeWidth="16"
+ android:fillColor="#00000000"
+ android:strokeColor="#7CB342"
+ android:fillType="evenOdd"/>
+ <path
+ android:pathData="M51,65L54,65C60.075,65 65,60.075 65,54C65,47.925 60.075,43 54,43C47.925,43 43,47.925 43,54L43,108"
+ android:strokeWidth="8"
+ android:fillColor="#00000000"
+ android:strokeColor="#FFFFFF"
+ android:fillType="evenOdd"/>
+</vector>
diff --git a/packages/EasterEgg/res/drawable/right_ear.xml b/packages/EasterEgg/res/drawable/right_ear.xml
deleted file mode 100644
index b9fb4d1c7470..000000000000
--- a/packages/EasterEgg/res/drawable/right_ear.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="right_ear" android:fillColor="#FF000000" android:pathData="M32.6,1l-5.0999985,5.3l6.299999,2.8000002z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/right_eye.xml b/packages/EasterEgg/res/drawable/right_eye.xml
deleted file mode 100644
index a1871a62c25b..000000000000
--- a/packages/EasterEgg/res/drawable/right_eye.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="right_eye" android:fillColor="#FF000000" android:pathData="M30.5,11c0,1.7 -3,1.7 -3,0C27.5,9.3 30.5,9.3 30.5,11z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/stat_icon.xml b/packages/EasterEgg/res/drawable/stat_icon.xml
deleted file mode 100644
index 608cb2017c3f..000000000000
--- a/packages/EasterEgg/res/drawable/stat_icon.xml
+++ /dev/null
@@ -1,30 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M12,2C6.5,2 2,6.5 2,12c0,5.5 4.5,10 10,10s10,-4.5 10,-10C22,6.5 17.5,2 12,2zM5.5,11c0,-1.6 3,-1.6 3,0C8.5,12.7 5.5,12.7 5.5,11zM17.5,14.6c-0.6,1 -1.7,1.7 -2.9,1.7c-1.1,0 -2,-0.6 -2.6,-1.4c-0.6,0.9 -1.6,1.4 -2.7,1.4c-1.3,0 -2.3,-0.7 -2.9,-1.8c-0.2,-0.3 0,-0.7 0.3,-0.8c0.3,-0.2 0.7,0 0.8,0.3c0.3,0.7 1,1.1 1.8,1.1c0.9,0 1.6,-0.5 1.9,-1.3c-0.2,-0.2 -0.4,-0.4 -0.4,-0.7c0,-1.3 2.3,-1.3 2.3,0c0,0.3 -0.2,0.6 -0.4,0.7c0.3,0.8 1.1,1.3 1.9,1.3c0.8,0 1.5,-0.6 1.8,-1.1c0.2,-0.3 0.6,-0.4 0.9,-0.2C17.6,13.9 17.7,14.3 17.5,14.6zM15.5,11c0,-1.6 3,-1.6 3,0C18.5,12.7 15.5,12.7 15.5,11z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M5.2,1.0l4.1000004,4.2l-5.0,2.1000004z"/>
- <path
- android:fillColor="#FF000000"
- android:pathData="M18.8,1.0l-4.0999994,4.2l5.000001,2.1000004z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/tail.xml b/packages/EasterEgg/res/drawable/tail.xml
deleted file mode 100644
index 0cca23c3e16c..000000000000
--- a/packages/EasterEgg/res/drawable/tail.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="tail"
- android:strokeColor="#FF000000"
- android:strokeWidth="5"
- android:strokeLineCap="round"
- android:pathData="M35,35.5h5.9c2.1,0 3.8,-1.7 3.8,-3.8v-6.2"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/tail_cap.xml b/packages/EasterEgg/res/drawable/tail_cap.xml
deleted file mode 100644
index b82f6f9b478a..000000000000
--- a/packages/EasterEgg/res/drawable/tail_cap.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="tail_cap" android:fillColor="#FF000000" android:pathData="M42.2,25.5c0,-1.4 1.1,-2.5 2.5,-2.5s2.5,1.1 2.5,2.5H42.2z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/tail_shadow.xml b/packages/EasterEgg/res/drawable/tail_shadow.xml
deleted file mode 100644
index bb1ff12b3afe..000000000000
--- a/packages/EasterEgg/res/drawable/tail_shadow.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Copyright (C) 2016 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="tail_shadow" android:fillColor="#FF000000" android:pathData="M40,38l0,-5l-1,0l0,5z"/>
-</vector>
diff --git a/packages/EasterEgg/res/drawable/toolbar_bg.xml b/packages/EasterEgg/res/drawable/toolbar_bg.xml
new file mode 100644
index 000000000000..0f0e702fd7c8
--- /dev/null
+++ b/packages/EasterEgg/res/drawable/toolbar_bg.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+ <solid android:color="@color/toolbar_bg_color" />
+</shape> \ No newline at end of file
diff --git a/packages/EasterEgg/res/layout/neko_activity.xml b/packages/EasterEgg/res/drawable/toolbar_button_bg.xml
index 21a4600bae40..1b6a53ec7cc6 100644
--- a/packages/EasterEgg/res/layout/neko_activity.xml
+++ b/packages/EasterEgg/res/drawable/toolbar_button_bg.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-Copyright (C) 2016 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
+ 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
@@ -14,12 +14,12 @@ Copyright (C) 2016 The Android Open Source Project
See the License for the specific language governing permissions and
limitations under the License.
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <android.support.v7.widget.RecyclerView
- android:id="@+id/holder"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"/>
-</FrameLayout> \ No newline at end of file
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="?android:attr/colorControlHighlight">
+ <item android:id="@android:id/mask">
+ <shape android:shape="rectangle">
+ <solid android:color="@android:color/black" />
+ <corners android:radius="4dp" />
+ </shape>
+ </item>
+</ripple>
diff --git a/packages/EasterEgg/res/layout/activity_paint.xml b/packages/EasterEgg/res/layout/activity_paint.xml
new file mode 100644
index 000000000000..a4c17afd1531
--- /dev/null
+++ b/packages/EasterEgg/res/layout/activity_paint.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res/com.android.egg"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#666"
+ tools:context=".paint.PaintActivity"
+ android:id="@+id/contentView" >
+
+ <include layout="@layout/toolbar"
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:layout_gravity="top"
+ />
+ <include layout="@layout/colors"
+ android:id="@+id/colors"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:layout_gravity="top"
+ android:visibility="gone"
+ />
+ <include layout="@layout/brushes"
+ android:id="@+id/brushes"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:layout_gravity="top"
+ android:visibility="gone"
+ />
+
+
+</FrameLayout> \ No newline at end of file
diff --git a/packages/EasterEgg/res/drawable/bowtie.xml b/packages/EasterEgg/res/layout/brushes.xml
index 33fa9216712f..0c4b849b4eb8 100644
--- a/packages/EasterEgg/res/drawable/bowtie.xml
+++ b/packages/EasterEgg/res/layout/brushes.xml
@@ -1,7 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
-Copyright (C) 2016 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
+ 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
@@ -13,10 +14,12 @@ Copyright (C) 2016 The Android Open Source Project
See the License for the specific language governing permissions and
limitations under the License.
-->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path android:name="bowtie" android:fillColor="#FF000000" android:pathData="M29,16.8l-10,5l0,-5l10,5z"/>
-</vector>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="left"
+ android:background="@drawable/toolbar_bg"
+ android:elevation="10dp"
+ >
+</LinearLayout> \ No newline at end of file
diff --git a/packages/EasterEgg/res/layout/cat_view.xml b/packages/EasterEgg/res/layout/cat_view.xml
deleted file mode 100644
index 85b494d2e68d..000000000000
--- a/packages/EasterEgg/res/layout/cat_view.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2016 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.
- -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeightSmall"
- android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:gravity="center_horizontal"
- android:clipToPadding="false">
-
- <FrameLayout
- android:layout_width="96dp"
- android:layout_height="wrap_content">
-
- <ImageView
- android:id="@android:id/icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="10dp"
- android:layout_gravity="center"
- android:scaleType="fitCenter" />
-
- <LinearLayout
- android:id="@+id/contextGroup"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="invisible"
- android:layout_gravity="bottom">
-
- <ImageView
- android:id="@android:id/shareText"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:padding="8dp"
- android:src="@drawable/ic_share"
- android:scaleType="fitCenter"
- android:background="#40000000"/>
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <ImageView
- android:id="@android:id/closeButton"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:padding="4dp"
- android:src="@drawable/ic_close"
- android:scaleType="fitCenter"
- android:background="#40000000"/>
-
- </LinearLayout>
-
- </FrameLayout>
-
- <TextView
- android:id="@android:id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceListItem"
- android:gravity="center"/>
-</LinearLayout>
-
diff --git a/packages/EasterEgg/res/drawable/right_ear_inside.xml b/packages/EasterEgg/res/layout/colors.xml
index 86b6e3428d1f..b90f4d71b1e9 100644
--- a/packages/EasterEgg/res/drawable/right_ear_inside.xml
+++ b/packages/EasterEgg/res/layout/colors.xml
@@ -1,7 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
-Copyright (C) 2016 The Android Open Source Project
+ Copyright (C) 2018 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
+ 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
@@ -13,11 +14,13 @@ Copyright (C) 2016 The Android Open Source Project
See the License for the specific language governing permissions and
limitations under the License.
-->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="48dp"
- android:height="48dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="left"
+ android:background="@drawable/toolbar_bg"
+ android:elevation="10dp"
+ >
- <path android:name="right_ear_inside" android:fillColor="#FF000000" android:pathData="M33.8,9.1l-4.7,-1.9l3.5,-6.2z"/>
-</vector>
+</LinearLayout> \ No newline at end of file
diff --git a/packages/EasterEgg/res/layout/edit_text.xml b/packages/EasterEgg/res/layout/edit_text.xml
deleted file mode 100644
index 9f7ac802bad4..000000000000
--- a/packages/EasterEgg/res/layout/edit_text.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2016 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.
- -->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingStart="20dp"
- android:paddingEnd="20dp">
-
- <EditText
- android:id="@android:id/edit"
- android:maxLines="1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
-
-</FrameLayout> \ No newline at end of file
diff --git a/packages/EasterEgg/res/layout/food_layout.xml b/packages/EasterEgg/res/layout/food_layout.xml
deleted file mode 100644
index d0ca0c8899aa..000000000000
--- a/packages/EasterEgg/res/layout/food_layout.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2016 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.
- -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:paddingLeft="4dp" android:paddingRight="4dp"
- android:paddingBottom="6dp" android:paddingTop="6dp">
- <ImageView
- android:layout_width="64dp"
- android:layout_height="64dp"
- android:id="@+id/icon"
- android:tint="?android:attr/colorControlNormal"/>
- <TextView android:layout_width="64dp" android:layout_height="wrap_content"
- android:gravity="top|center_horizontal"
- android:id="@+id/text" />
-</LinearLayout>
diff --git a/packages/EasterEgg/res/layout/toolbar.xml b/packages/EasterEgg/res/layout/toolbar.xml
new file mode 100644
index 000000000000..9a5a9c541a4d
--- /dev/null
+++ b/packages/EasterEgg/res/layout/toolbar.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<com.android.egg.paint.CutoutAvoidingToolbar
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:orientation="horizontal"
+ android:gravity="left"
+ android:background="@drawable/toolbar_bg"
+ android:elevation="20dp"
+ >
+
+ <Space
+ android:tag="cutoutLeft"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:tag="beforeCutout"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:layout_weight="1"
+ tools:ignore="UselessParent">
+
+ <ImageButton
+ android:id="@+id/btnBrush"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:tint="@color/toolbar_icon_color"
+ android:background="@drawable/toolbar_button_bg"
+ />
+
+ <ImageButton
+ android:id="@+id/btnColor"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:tint="@color/toolbar_icon_color"
+ android:background="@drawable/toolbar_button_bg"
+ />
+
+ <ImageButton
+ android:id="@+id/btnSample"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:background="@drawable/toolbar_button_bg"
+ android:tint="@color/toolbar_icon_color"
+ android:src="@drawable/ic_dropper" />
+
+ </LinearLayout>
+
+ <Space
+ android:tag="cutoutCenter"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:tag="afterCutout"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:layout_weight="1"
+ tools:ignore="UselessParent">
+
+ <ImageButton
+ android:id="@+id/btnZen"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:background="@drawable/toolbar_button_bg"
+ android:tint="@color/toolbar_icon_color"
+ android:src="@drawable/ic_hourglass" />
+
+ <ImageButton
+ android:id="@+id/btnClear"
+ android:layout_width="48dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:background="@drawable/toolbar_button_bg"
+ android:tint="@color/toolbar_icon_color"
+ android:src="@drawable/ic_clear" />
+
+ </LinearLayout>
+
+ <Space
+ android:tag="cutoutRight"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ />
+
+</com.android.egg.paint.CutoutAvoidingToolbar> \ No newline at end of file
diff --git a/packages/EasterEgg/res/values-night/colors.xml b/packages/EasterEgg/res/values-night/colors.xml
new file mode 100644
index 000000000000..7c188f77f444
--- /dev/null
+++ b/packages/EasterEgg/res/values-night/colors.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <color name="toolbar_bg_color">#FF333333</color>
+ <color name="paper_color">#FF000000</color>
+ <color name="paint_color">#FFFFFFFF</color>
+</resources> \ No newline at end of file
diff --git a/packages/EasterEgg/res/values-night/styles.xml b/packages/EasterEgg/res/values-night/styles.xml
new file mode 100644
index 000000000000..4edf6926da41
--- /dev/null
+++ b/packages/EasterEgg/res/values-night/styles.xml
@@ -0,0 +1,21 @@
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <style name="AppTheme" parent="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen">
+ <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
+ <item name="android:windowLightNavigationBar">false</item>
+ </style>
+</resources>
diff --git a/packages/EasterEgg/res/values/attrs_toolbar_view.xml b/packages/EasterEgg/res/values/attrs_toolbar_view.xml
new file mode 100644
index 000000000000..ed1360f7d468
--- /dev/null
+++ b/packages/EasterEgg/res/values/attrs_toolbar_view.xml
@@ -0,0 +1,19 @@
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <declare-styleable name="ToolbarView">
+ </declare-styleable>
+</resources>
diff --git a/packages/EasterEgg/res/values/colors.xml b/packages/EasterEgg/res/values/colors.xml
new file mode 100644
index 000000000000..1a5388b738dd
--- /dev/null
+++ b/packages/EasterEgg/res/values/colors.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <color name="toolbar_bg_color">#FFDDDDDD</color>
+ <color name="paper_color">#FFFFFFFF</color>
+ <color name="paint_color">#FF000000</color>
+</resources> \ No newline at end of file
diff --git a/packages/EasterEgg/res/values/strings.xml b/packages/EasterEgg/res/values/strings.xml
index 61e38342872e..32dbc97a00fb 100644
--- a/packages/EasterEgg/res/values/strings.xml
+++ b/packages/EasterEgg/res/values/strings.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-Copyright (C) 2016 The Android Open Source Project
+Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -15,40 +15,5 @@ Copyright (C) 2016 The Android Open Source Project
limitations under the License.
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <string name="app_name" translatable="false">Android Easter Egg</string>
- <string name="notification_name" translatable="false">Android Neko</string>
- <string name="notification_channel_name" translatable="false">New cats</string>
- <string name="default_tile_name" translatable="false">\????</string>
- <string name="notification_title" translatable="false">A cat is here.</string>
- <string name="default_cat_name" translatable="false">Cat #%s</string>
- <string name="directory_name" translatable="false">Cats</string>
- <string name="confirm_delete" translatable="false">Forget %s?</string>
- <string-array name="food_names" translatable="false">
- <item>Empty dish</item>
- <item>Bits</item>
- <item>Fish</item>
- <item>Chicken</item>
- <item>Treat</item>
- </string-array>
- <array name="food_icons">
- <item>@drawable/food_dish</item>
- <item>@drawable/food_bits</item>
- <item>@drawable/food_sysuituna</item>
- <item>@drawable/food_chicken</item>
- <item>@drawable/food_cookie</item>
- </array>
- <integer-array name="food_intervals">
- <item>0</item>
- <item>15</item>
- <item>30</item>
- <item>60</item>
- <item>120</item>
- </integer-array>
- <integer-array name="food_new_cat_prob">
- <item>0</item>
- <item>5</item>
- <item>35</item>
- <item>65</item>
- <item>90</item>
- </integer-array>
+ <string name="app_name" translatable="false">PAINT.APK</string>
</resources>
diff --git a/packages/EasterEgg/res/values/styles.xml b/packages/EasterEgg/res/values/styles.xml
new file mode 100644
index 000000000000..44e2ce52aab8
--- /dev/null
+++ b/packages/EasterEgg/res/values/styles.xml
@@ -0,0 +1,23 @@
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+
+ <style name="AppTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar.Fullscreen">
+ <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
+ <item name="android:windowLightNavigationBar">true</item>
+ </style>
+
+</resources>
diff --git a/packages/EasterEgg/src/com/android/egg/neko/Cat.java b/packages/EasterEgg/src/com/android/egg/neko/Cat.java
deleted file mode 100644
index dd1bd07f3298..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/Cat.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.*;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
-
-import java.io.ByteArrayOutputStream;
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
-
-import com.android.egg.R;
-import com.android.internal.logging.MetricsLogger;
-
-import static com.android.egg.neko.NekoLand.CHAN_ID;
-
-public class Cat extends Drawable {
- public static final long[] PURR = {0, 40, 20, 40, 20, 40, 20, 40, 20, 40, 20, 40};
-
- private Random mNotSoRandom;
- private Bitmap mBitmap;
- private long mSeed;
- private String mName;
- private int mBodyColor;
- private int mFootType;
- private boolean mBowTie;
-
- private synchronized Random notSoRandom(long seed) {
- if (mNotSoRandom == null) {
- mNotSoRandom = new Random();
- mNotSoRandom.setSeed(seed);
- }
- return mNotSoRandom;
- }
-
- public static final float frandrange(Random r, float a, float b) {
- return (b-a)*r.nextFloat() + a;
- }
-
- public static final Object choose(Random r, Object...l) {
- return l[r.nextInt(l.length)];
- }
-
- public static final int chooseP(Random r, int[] a) {
- int pct = r.nextInt(1000);
- final int stop = a.length-2;
- int i=0;
- while (i<stop) {
- pct -= a[i];
- if (pct < 0) break;
- i+=2;
- }
- return a[i+1];
- }
-
- public static final int getColorIndex(int q, int[] a) {
- for(int i = 1; i < a.length; i+=2) {
- if (a[i] == q) {
- return i/2;
- }
- }
- return -1;
- }
-
- public static final int[] P_BODY_COLORS = {
- 180, 0xFF212121, // black
- 180, 0xFFFFFFFF, // white
- 140, 0xFF616161, // gray
- 140, 0xFF795548, // brown
- 100, 0xFF90A4AE, // steel
- 100, 0xFFFFF9C4, // buff
- 100, 0xFFFF8F00, // orange
- 5, 0xFF29B6F6, // blue..?
- 5, 0xFFFFCDD2, // pink!?
- 5, 0xFFCE93D8, // purple?!?!?
- 4, 0xFF43A047, // yeah, why not green
- 1, 0, // ?!?!?!
- };
-
- public static final int[] P_COLLAR_COLORS = {
- 250, 0xFFFFFFFF,
- 250, 0xFF000000,
- 250, 0xFFF44336,
- 50, 0xFF1976D2,
- 50, 0xFFFDD835,
- 50, 0xFFFB8C00,
- 50, 0xFFF48FB1,
- 50, 0xFF4CAF50,
- };
-
- public static final int[] P_BELLY_COLORS = {
- 750, 0,
- 250, 0xFFFFFFFF,
- };
-
- public static final int[] P_DARK_SPOT_COLORS = {
- 700, 0,
- 250, 0xFF212121,
- 50, 0xFF6D4C41,
- };
-
- public static final int[] P_LIGHT_SPOT_COLORS = {
- 700, 0,
- 300, 0xFFFFFFFF,
- };
-
- private CatParts D;
-
- public static void tint(int color, Drawable ... ds) {
- for (Drawable d : ds) {
- if (d != null) {
- d.mutate().setTint(color);
- }
- }
- }
-
- public static boolean isDark(int color) {
- final int r = (color & 0xFF0000) >> 16;
- final int g = (color & 0x00FF00) >> 8;
- final int b = color & 0x0000FF;
- return (r + g + b) < 0x80;
- }
-
- public Cat(Context context, long seed) {
- D = new CatParts(context);
- mSeed = seed;
-
- setName(context.getString(R.string.default_cat_name,
- String.valueOf(mSeed % 1000)));
-
- final Random nsr = notSoRandom(seed);
-
- // body color
- mBodyColor = chooseP(nsr, P_BODY_COLORS);
- if (mBodyColor == 0) mBodyColor = Color.HSVToColor(new float[] {
- nsr.nextFloat()*360f, frandrange(nsr,0.5f,1f), frandrange(nsr,0.5f, 1f)});
-
- tint(mBodyColor, D.body, D.head, D.leg1, D.leg2, D.leg3, D.leg4, D.tail,
- D.leftEar, D.rightEar, D.foot1, D.foot2, D.foot3, D.foot4, D.tailCap);
- tint(0x20000000, D.leg2Shadow, D.tailShadow);
- if (isDark(mBodyColor)) {
- tint(0xFFFFFFFF, D.leftEye, D.rightEye, D.mouth, D.nose);
- }
- tint(isDark(mBodyColor) ? 0xFFEF9A9A : 0x20D50000, D.leftEarInside, D.rightEarInside);
-
- tint(chooseP(nsr, P_BELLY_COLORS), D.belly);
- tint(chooseP(nsr, P_BELLY_COLORS), D.back);
- final int faceColor = chooseP(nsr, P_BELLY_COLORS);
- tint(faceColor, D.faceSpot);
- if (!isDark(faceColor)) {
- tint(0xFF000000, D.mouth, D.nose);
- }
-
- mFootType = 0;
- if (nsr.nextFloat() < 0.25f) {
- mFootType = 4;
- tint(0xFFFFFFFF, D.foot1, D.foot2, D.foot3, D.foot4);
- } else {
- if (nsr.nextFloat() < 0.25f) {
- mFootType = 2;
- tint(0xFFFFFFFF, D.foot1, D.foot3);
- } else if (nsr.nextFloat() < 0.25f) {
- mFootType = 3; // maybe -2 would be better? meh.
- tint(0xFFFFFFFF, D.foot2, D.foot4);
- } else if (nsr.nextFloat() < 0.1f) {
- mFootType = 1;
- tint(0xFFFFFFFF, (Drawable) choose(nsr, D.foot1, D.foot2, D.foot3, D.foot4));
- }
- }
-
- tint(nsr.nextFloat() < 0.333f ? 0xFFFFFFFF : mBodyColor, D.tailCap);
-
- final int capColor = chooseP(nsr, isDark(mBodyColor) ? P_LIGHT_SPOT_COLORS : P_DARK_SPOT_COLORS);
- tint(capColor, D.cap);
- //tint(chooseP(nsr, isDark(bodyColor) ? P_LIGHT_SPOT_COLORS : P_DARK_SPOT_COLORS), D.nose);
-
- final int collarColor = chooseP(nsr, P_COLLAR_COLORS);
- tint(collarColor, D.collar);
- mBowTie = nsr.nextFloat() < 0.1f;
- tint(mBowTie ? collarColor : 0, D.bowtie);
- }
-
- public static Cat create(Context context) {
- return new Cat(context, Math.abs(ThreadLocalRandom.current().nextInt()));
- }
-
- public Notification.Builder buildNotification(Context context) {
- final Bundle extras = new Bundle();
- extras.putString("android.substName", context.getString(R.string.notification_name));
- final Intent intent = new Intent(Intent.ACTION_MAIN)
- .setClass(context, NekoLand.class)
- .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return new Notification.Builder(context)
- .setSmallIcon(Icon.createWithResource(context, R.drawable.stat_icon))
- .setLargeIcon(createNotificationLargeIcon(context))
- .setColor(getBodyColor())
- .setPriority(Notification.PRIORITY_LOW)
- .setContentTitle(context.getString(R.string.notification_title))
- .setShowWhen(true)
- .setCategory(Notification.CATEGORY_STATUS)
- .setContentText(getName())
- .setContentIntent(PendingIntent.getActivity(context, 0, intent, 0))
- .setAutoCancel(true)
- .setChannel(CHAN_ID)
- .setVibrate(PURR)
- .addExtras(extras);
- }
-
- public long getSeed() {
- return mSeed;
- }
-
- @Override
- public void draw(Canvas canvas) {
- final int w = Math.min(canvas.getWidth(), canvas.getHeight());
- final int h = w;
-
- if (mBitmap == null || mBitmap.getWidth() != w || mBitmap.getHeight() != h) {
- mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
- final Canvas bitCanvas = new Canvas(mBitmap);
- slowDraw(bitCanvas, 0, 0, w, h);
- }
- canvas.drawBitmap(mBitmap, 0, 0, null);
- }
-
- private void slowDraw(Canvas canvas, int x, int y, int w, int h) {
- for (int i = 0; i < D.drawingOrder.length; i++) {
- final Drawable d = D.drawingOrder[i];
- if (d != null) {
- d.setBounds(x, y, x+w, y+h);
- d.draw(canvas);
- }
- }
-
- }
-
- public Bitmap createBitmap(int w, int h) {
- if (mBitmap != null && mBitmap.getWidth() == w && mBitmap.getHeight() == h) {
- return mBitmap.copy(mBitmap.getConfig(), true);
- }
- Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
- slowDraw(new Canvas(result), 0, 0, w, h);
- return result;
- }
-
- public static Icon recompressIcon(Icon bitmapIcon) {
- if (bitmapIcon.getType() != Icon.TYPE_BITMAP) return bitmapIcon;
- final Bitmap bits = bitmapIcon.getBitmap();
- final ByteArrayOutputStream ostream = new ByteArrayOutputStream(
- bits.getWidth() * bits.getHeight() * 2); // guess 50% compression
- final boolean ok = bits.compress(Bitmap.CompressFormat.PNG, 100, ostream);
- if (!ok) return null;
- return Icon.createWithData(ostream.toByteArray(), 0, ostream.size());
- }
-
- public Icon createNotificationLargeIcon(Context context) {
- final Resources res = context.getResources();
- final int w = 2*res.getDimensionPixelSize(android.R.dimen.notification_large_icon_width);
- final int h = 2*res.getDimensionPixelSize(android.R.dimen.notification_large_icon_height);
- return recompressIcon(createIcon(context, w, h));
- }
-
- public Icon createIcon(Context context, int w, int h) {
- Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(result);
- final Paint pt = new Paint();
- float[] hsv = new float[3];
- Color.colorToHSV(mBodyColor, hsv);
- hsv[2] = (hsv[2]>0.5f)
- ? (hsv[2] - 0.25f)
- : (hsv[2] + 0.25f);
- pt.setColor(Color.HSVToColor(hsv));
- float r = w/2;
- canvas.drawCircle(r, r, r, pt);
- int m = w/10;
-
- slowDraw(canvas, m, m, w-m-m, h-m-m);
-
- return Icon.createWithBitmap(result);
- }
-
- @Override
- public void setAlpha(int i) {
-
- }
-
- @Override
- public void setColorFilter(ColorFilter colorFilter) {
-
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
- public String getName() {
- return mName;
- }
-
- public void setName(String name) {
- this.mName = name;
- }
-
- public int getBodyColor() {
- return mBodyColor;
- }
-
- public void logAdd(Context context) {
- logCatAction(context, "egg_neko_add");
- }
-
- public void logRename(Context context) {
- logCatAction(context, "egg_neko_rename");
- }
-
- public void logRemove(Context context) {
- logCatAction(context, "egg_neko_remove");
- }
-
- public void logShare(Context context) {
- logCatAction(context, "egg_neko_share");
- }
-
- private void logCatAction(Context context, String prefix) {
- MetricsLogger.count(context, prefix, 1);
- MetricsLogger.histogram(context, prefix +"_color",
- getColorIndex(mBodyColor, P_BODY_COLORS));
- MetricsLogger.histogram(context, prefix + "_bowtie", mBowTie ? 1 : 0);
- MetricsLogger.histogram(context, prefix + "_feet", mFootType);
- }
-
- public static class CatParts {
- public Drawable leftEar;
- public Drawable rightEar;
- public Drawable rightEarInside;
- public Drawable leftEarInside;
- public Drawable head;
- public Drawable faceSpot;
- public Drawable cap;
- public Drawable mouth;
- public Drawable body;
- public Drawable foot1;
- public Drawable leg1;
- public Drawable foot2;
- public Drawable leg2;
- public Drawable foot3;
- public Drawable leg3;
- public Drawable foot4;
- public Drawable leg4;
- public Drawable tail;
- public Drawable leg2Shadow;
- public Drawable tailShadow;
- public Drawable tailCap;
- public Drawable belly;
- public Drawable back;
- public Drawable rightEye;
- public Drawable leftEye;
- public Drawable nose;
- public Drawable bowtie;
- public Drawable collar;
- public Drawable[] drawingOrder;
-
- public CatParts(Context context) {
- body = context.getDrawable(R.drawable.body);
- head = context.getDrawable(R.drawable.head);
- leg1 = context.getDrawable(R.drawable.leg1);
- leg2 = context.getDrawable(R.drawable.leg2);
- leg3 = context.getDrawable(R.drawable.leg3);
- leg4 = context.getDrawable(R.drawable.leg4);
- tail = context.getDrawable(R.drawable.tail);
- leftEar = context.getDrawable(R.drawable.left_ear);
- rightEar = context.getDrawable(R.drawable.right_ear);
- rightEarInside = context.getDrawable(R.drawable.right_ear_inside);
- leftEarInside = context.getDrawable(R.drawable.left_ear_inside);
- faceSpot = context.getDrawable(R.drawable.face_spot);
- cap = context.getDrawable(R.drawable.cap);
- mouth = context.getDrawable(R.drawable.mouth);
- foot4 = context.getDrawable(R.drawable.foot4);
- foot3 = context.getDrawable(R.drawable.foot3);
- foot1 = context.getDrawable(R.drawable.foot1);
- foot2 = context.getDrawable(R.drawable.foot2);
- leg2Shadow = context.getDrawable(R.drawable.leg2_shadow);
- tailShadow = context.getDrawable(R.drawable.tail_shadow);
- tailCap = context.getDrawable(R.drawable.tail_cap);
- belly = context.getDrawable(R.drawable.belly);
- back = context.getDrawable(R.drawable.back);
- rightEye = context.getDrawable(R.drawable.right_eye);
- leftEye = context.getDrawable(R.drawable.left_eye);
- nose = context.getDrawable(R.drawable.nose);
- collar = context.getDrawable(R.drawable.collar);
- bowtie = context.getDrawable(R.drawable.bowtie);
- drawingOrder = getDrawingOrder();
- }
- private Drawable[] getDrawingOrder() {
- return new Drawable[] {
- collar,
- leftEar, leftEarInside, rightEar, rightEarInside,
- head,
- faceSpot,
- cap,
- leftEye, rightEye,
- nose, mouth,
- tail, tailCap, tailShadow,
- foot1, leg1,
- foot2, leg2,
- foot3, leg3,
- foot4, leg4,
- leg2Shadow,
- body, belly,
- bowtie
- };
- }
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/Food.java b/packages/EasterEgg/src/com/android/egg/neko/Food.java
deleted file mode 100644
index 5c0f12e2639f..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/Food.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-
-import com.android.egg.R;
-
-public class Food {
- private final int mType;
-
- private static int[] sIcons;
- private static String[] sNames;
-
- public Food(int type) {
- mType = type;
- }
-
- public Icon getIcon(Context context) {
- if (sIcons == null) {
- TypedArray icons = context.getResources().obtainTypedArray(R.array.food_icons);
- sIcons = new int[icons.length()];
- for (int i = 0; i < sIcons.length; i++) {
- sIcons[i] = icons.getResourceId(i, 0);
- }
- icons.recycle();
- }
- return Icon.createWithResource(context, sIcons[mType]);
- }
-
- public String getName(Context context) {
- if (sNames == null) {
- sNames = context.getResources().getStringArray(R.array.food_names);
- }
- return sNames[mType];
- }
-
- public long getInterval(Context context) {
- return context.getResources().getIntArray(R.array.food_intervals)[mType];
- }
-
- public int getType() {
- return mType;
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoActivationActivity.java b/packages/EasterEgg/src/com/android/egg/neko/NekoActivationActivity.java
deleted file mode 100644
index c0b725c05899..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/NekoActivationActivity.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.pm.PackageManager;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.android.internal.logging.MetricsLogger;
-
-public class NekoActivationActivity extends Activity {
- private void toastUp(String s) {
- Toast toast = Toast.makeText(this, s, Toast.LENGTH_SHORT);
- toast.getView().setBackgroundDrawable(null);
- toast.show();
- }
-
- @Override
- public void onStart() {
- super.onStart();
-
- final PackageManager pm = getPackageManager();
- final ComponentName cn = new ComponentName(this, NekoTile.class);
- if (pm.getComponentEnabledSetting(cn) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
- if (NekoLand.DEBUG) {
- Log.v("Neko", "Disabling tile.");
- }
- pm.setComponentEnabledSetting(cn, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
- PackageManager.DONT_KILL_APP);
- MetricsLogger.histogram(this, "egg_neko_enable", 0);
- toastUp("\uD83D\uDEAB");
- } else {
- if (NekoLand.DEBUG) {
- Log.v("Neko", "Enabling tile.");
- }
- pm.setComponentEnabledSetting(cn, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
- PackageManager.DONT_KILL_APP);
- MetricsLogger.histogram(this, "egg_neko_enable", 1);
- toastUp("\uD83D\uDC31");
- }
- finish();
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoDialog.java b/packages/EasterEgg/src/com/android/egg/neko/NekoDialog.java
deleted file mode 100644
index 2d2fbe8207af..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/NekoDialog.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.support.annotation.NonNull;
-import android.app.Dialog;
-import android.content.Context;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.egg.R;
-import com.android.internal.logging.MetricsLogger;
-
-import java.util.ArrayList;
-
-public class NekoDialog extends Dialog {
-
- private final Adapter mAdapter;
-
- public NekoDialog(@NonNull Context context) {
- super(context, android.R.style.Theme_Material_Dialog_NoActionBar);
- RecyclerView view = new RecyclerView(getContext());
- mAdapter = new Adapter(getContext());
- view.setLayoutManager(new GridLayoutManager(getContext(), 2));
- view.setAdapter(mAdapter);
- final float dp = context.getResources().getDisplayMetrics().density;
- final int pad = (int)(16*dp);
- view.setPadding(pad, pad, pad, pad);
- setContentView(view);
- }
-
- private void onFoodSelected(Food food) {
- PrefState prefs = new PrefState(getContext());
- int currentState = prefs.getFoodState();
- if (currentState == 0 && food.getType() != 0) {
- NekoService.registerJob(getContext(), food.getInterval(getContext()));
- }
- MetricsLogger.histogram(getContext(), "egg_neko_offered_food", food.getType());
- prefs.setFoodState(food.getType());
- dismiss();
- }
-
- private class Adapter extends RecyclerView.Adapter<Holder> {
-
- private final Context mContext;
- private final ArrayList<Food> mFoods = new ArrayList<>();
-
- public Adapter(Context context) {
- mContext = context;
- int[] foods = context.getResources().getIntArray(R.array.food_names);
- // skip food 0, you can't choose it
- for (int i=1; i<foods.length; i++) {
- mFoods.add(new Food(i));
- }
- }
-
- @Override
- public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new Holder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.food_layout, parent, false));
- }
-
- @Override
- public void onBindViewHolder(final Holder holder, int position) {
- final Food food = mFoods.get(position);
- ((ImageView) holder.itemView.findViewById(R.id.icon))
- .setImageIcon(food.getIcon(mContext));
- ((TextView) holder.itemView.findViewById(R.id.text))
- .setText(food.getName(mContext));
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onFoodSelected(mFoods.get(holder.getAdapterPosition()));
- }
- });
- }
-
- @Override
- public int getItemCount() {
- return mFoods.size();
- }
- }
-
- public static class Holder extends RecyclerView.ViewHolder {
-
- public Holder(View itemView) {
- super(itemView);
- }
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java b/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java
deleted file mode 100644
index d2e37d8779d1..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/NekoLand.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.Manifest;
-import android.app.ActionBar;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.graphics.drawable.Drawable;
-import android.media.MediaScannerConnection;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Environment;
-import android.provider.MediaStore.Images;
-import android.support.v4.content.FileProvider;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.util.Log;
-import android.view.ContextThemeWrapper;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnLongClickListener;
-import android.view.ViewGroup;
-import android.widget.EditText;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.egg.R;
-import com.android.egg.neko.PrefState.PrefsListener;
-import com.android.internal.logging.MetricsLogger;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-public class NekoLand extends Activity implements PrefsListener {
- public static String CHAN_ID = "EGG";
-
- public static boolean DEBUG = false;
- public static boolean DEBUG_NOTIFICATIONS = false;
-
- private static final int EXPORT_BITMAP_SIZE = 600;
-
- private static final int STORAGE_PERM_REQUEST = 123;
-
- private static boolean CAT_GEN = false;
- private PrefState mPrefs;
- private CatAdapter mAdapter;
- private Cat mPendingShareCat;
-
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.neko_activity);
- final ActionBar actionBar = getActionBar();
- if (actionBar != null) {
- actionBar.setLogo(Cat.create(this));
- actionBar.setDisplayUseLogoEnabled(false);
- actionBar.setDisplayShowHomeEnabled(true);
- }
-
- mPrefs = new PrefState(this);
- mPrefs.setListener(this);
- final RecyclerView recyclerView = findViewById(R.id.holder);
- mAdapter = new CatAdapter();
- recyclerView.setAdapter(mAdapter);
- recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
- int numCats = updateCats();
- MetricsLogger.histogram(this, "egg_neko_visit_gallery", numCats);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mPrefs.setListener(null);
- }
-
- private int updateCats() {
- Cat[] cats;
- if (CAT_GEN) {
- cats = new Cat[50];
- for (int i = 0; i < cats.length; i++) {
- cats[i] = Cat.create(this);
- }
- } else {
- final float[] hsv = new float[3];
- List<Cat> list = mPrefs.getCats();
- Collections.sort(list, new Comparator<Cat>() {
- @Override
- public int compare(Cat cat, Cat cat2) {
- Color.colorToHSV(cat.getBodyColor(), hsv);
- float bodyH1 = hsv[0];
- Color.colorToHSV(cat2.getBodyColor(), hsv);
- float bodyH2 = hsv[0];
- return Float.compare(bodyH1, bodyH2);
- }
- });
- cats = list.toArray(new Cat[0]);
- }
- mAdapter.setCats(cats);
- return cats.length;
- }
-
- private void onCatClick(Cat cat) {
- if (CAT_GEN) {
- mPrefs.addCat(cat);
- new AlertDialog.Builder(NekoLand.this)
- .setTitle("Cat added")
- .setPositiveButton(android.R.string.ok, null)
- .show();
- } else {
- showNameDialog(cat);
- }
-// noman.notify(1, cat.buildNotification(NekoLand.this).build());
- }
-
- private void onCatRemove(Cat cat) {
- cat.logRemove(this);
- mPrefs.removeCat(cat);
- }
-
- private void showNameDialog(final Cat cat) {
- final Context context = new ContextThemeWrapper(this,
- android.R.style.Theme_Material_Light_Dialog_NoActionBar);
- // TODO: Move to XML, add correct margins.
- View view = LayoutInflater.from(context).inflate(R.layout.edit_text, null);
- final EditText text = (EditText) view.findViewById(android.R.id.edit);
- text.setText(cat.getName());
- text.setSelection(cat.getName().length());
- final int size = context.getResources()
- .getDimensionPixelSize(android.R.dimen.app_icon_size);
- Drawable catIcon = cat.createIcon(this, size, size).loadDrawable(this);
- new AlertDialog.Builder(context)
- .setTitle(" ")
- .setIcon(catIcon)
- .setView(view)
- .setPositiveButton(android.R.string.ok, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- cat.logRename(context);
- cat.setName(text.getText().toString().trim());
- mPrefs.addCat(cat);
- }
- }).show();
- }
-
- @Override
- public void onPrefsChanged() {
- updateCats();
- }
-
- private class CatAdapter extends RecyclerView.Adapter<CatHolder> {
-
- private Cat[] mCats;
-
- public void setCats(Cat[] cats) {
- mCats = cats;
- notifyDataSetChanged();
- }
-
- @Override
- public CatHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new CatHolder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.cat_view, parent, false));
- }
-
- private void setContextGroupVisible(final CatHolder holder, boolean vis) {
- final View group = holder.contextGroup;
- if (vis && group.getVisibility() != View.VISIBLE) {
- group.setAlpha(0);
- group.setVisibility(View.VISIBLE);
- group.animate().alpha(1.0f).setDuration(333);
- Runnable hideAction = new Runnable() {
- @Override
- public void run() {
- setContextGroupVisible(holder, false);
- }
- };
- group.setTag(hideAction);
- group.postDelayed(hideAction, 5000);
- } else if (!vis && group.getVisibility() == View.VISIBLE) {
- group.removeCallbacks((Runnable) group.getTag());
- group.animate().alpha(0f).setDuration(250).withEndAction(new Runnable() {
- @Override
- public void run() {
- group.setVisibility(View.INVISIBLE);
- }
- });
- }
- }
-
- @Override
- public void onBindViewHolder(final CatHolder holder, int position) {
- Context context = holder.itemView.getContext();
- final int size = context.getResources().getDimensionPixelSize(R.dimen.neko_display_size);
- holder.imageView.setImageIcon(mCats[position].createIcon(context, size, size));
- holder.textView.setText(mCats[position].getName());
- holder.itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onCatClick(mCats[holder.getAdapterPosition()]);
- }
- });
- holder.itemView.setOnLongClickListener(new OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- setContextGroupVisible(holder, true);
- return true;
- }
- });
- holder.delete.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- setContextGroupVisible(holder, false);
- new AlertDialog.Builder(NekoLand.this)
- .setTitle(getString(R.string.confirm_delete, mCats[position].getName()))
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- onCatRemove(mCats[holder.getAdapterPosition()]);
- }
- })
- .show();
- }
- });
- holder.share.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- setContextGroupVisible(holder, false);
- Cat cat = mCats[holder.getAdapterPosition()];
- if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
- != PackageManager.PERMISSION_GRANTED) {
- mPendingShareCat = cat;
- requestPermissions(
- new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
- STORAGE_PERM_REQUEST);
- return;
- }
- shareCat(cat);
- }
- });
- }
-
- @Override
- public int getItemCount() {
- return mCats.length;
- }
- }
-
- private void shareCat(Cat cat) {
- final File dir = new File(
- Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
- getString(R.string.directory_name));
- if (!dir.exists() && !dir.mkdirs()) {
- Log.e("NekoLand", "save: error: can't create Pictures directory");
- return;
- }
- final File png = new File(dir, cat.getName().replaceAll("[/ #:]+", "_") + ".png");
- Bitmap bitmap = cat.createBitmap(EXPORT_BITMAP_SIZE, EXPORT_BITMAP_SIZE);
- if (bitmap != null) {
- try {
- OutputStream os = new FileOutputStream(png);
- bitmap.compress(Bitmap.CompressFormat.PNG, 0, os);
- os.close();
- MediaScannerConnection.scanFile(
- this,
- new String[] {png.toString()},
- new String[] {"image/png"},
- null);
- Log.v("Neko", "cat file: " + png);
- Uri uri = FileProvider.getUriForFile(this, "com.android.egg.fileprovider", png);
- Log.v("Neko", "cat uri: " + uri);
- Intent intent = new Intent(Intent.ACTION_SEND);
- intent.putExtra(Intent.EXTRA_STREAM, uri);
- intent.putExtra(Intent.EXTRA_SUBJECT, cat.getName());
- intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- intent.setType("image/png");
- startActivity(Intent.createChooser(intent, null));
- cat.logShare(this);
- } catch (IOException e) {
- Log.e("NekoLand", "save: error: " + e);
- }
- }
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode,
- String permissions[], int[] grantResults) {
- if (requestCode == STORAGE_PERM_REQUEST) {
- if (mPendingShareCat != null) {
- shareCat(mPendingShareCat);
- mPendingShareCat = null;
- }
- }
- }
-
- private static class CatHolder extends RecyclerView.ViewHolder {
- private final ImageView imageView;
- private final TextView textView;
- private final View contextGroup;
- private final View delete;
- private final View share;
-
- public CatHolder(View itemView) {
- super(itemView);
- imageView = (ImageView) itemView.findViewById(android.R.id.icon);
- textView = (TextView) itemView.findViewById(android.R.id.title);
- contextGroup = itemView.findViewById(R.id.contextGroup);
- delete = itemView.findViewById(android.R.id.closeButton);
- share = itemView.findViewById(android.R.id.shareText);
- }
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoLockedActivity.java b/packages/EasterEgg/src/com/android/egg/neko/NekoLockedActivity.java
deleted file mode 100644
index 5f01da879ebb..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/NekoLockedActivity.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.support.annotation.Nullable;
-import android.app.Activity;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
-import android.os.Bundle;
-import android.view.WindowManager;
-
-public class NekoLockedActivity extends Activity implements OnDismissListener {
-
- private NekoDialog mDialog;
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
-
- mDialog = new NekoDialog(this);
- mDialog.setOnDismissListener(this);
- mDialog.show();
- }
-
- @Override
- public void onDismiss(DialogInterface dialog) {
- finish();
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoService.java b/packages/EasterEgg/src/com/android/egg/neko/NekoService.java
deleted file mode 100644
index 42506e61d2ec..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/NekoService.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.job.JobInfo;
-import android.app.job.JobParameters;
-import android.app.job.JobScheduler;
-import android.app.job.JobService;
-import android.content.ComponentName;
-import android.content.Context;
-import android.net.Uri;
-import android.os.Bundle;
-
-import java.util.List;
-import android.util.Log;
-
-import com.android.egg.R;
-
-import java.util.Random;
-
-import static com.android.egg.neko.Cat.PURR;
-import static com.android.egg.neko.NekoLand.CHAN_ID;
-
-public class NekoService extends JobService {
-
- private static final String TAG = "NekoService";
-
- public static int JOB_ID = 42;
-
- public static int CAT_NOTIFICATION = 1;
- public static int DEBUG_NOTIFICATION = 1234;
-
- public static float CAT_CAPTURE_PROB = 1.0f; // generous
-
- public static long SECONDS = 1000;
- public static long MINUTES = 60 * SECONDS;
-
- public static long INTERVAL_FLEX = 5 * MINUTES;
-
- public static float INTERVAL_JITTER_FRAC = 0.25f;
-
- private static void setupNotificationChannels(Context context) {
- NotificationManager noman = context.getSystemService(NotificationManager.class);
- NotificationChannel eggChan = new NotificationChannel(CHAN_ID,
- context.getString(R.string.notification_channel_name),
- NotificationManager.IMPORTANCE_DEFAULT);
- eggChan.setSound(Uri.EMPTY, Notification.AUDIO_ATTRIBUTES_DEFAULT); // cats are quiet
- eggChan.setVibrationPattern(PURR); // not totally quiet though
- eggChan.setBlockableSystem(true); // unlike a real cat, you can push this one off your lap
- eggChan.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC); // cats sit in the window
- noman.createNotificationChannel(eggChan);
- }
-
- @Override
- public boolean onStartJob(JobParameters params) {
- Log.v(TAG, "Starting job: " + String.valueOf(params));
-
- NotificationManager noman = getSystemService(NotificationManager.class);
- if (NekoLand.DEBUG_NOTIFICATIONS) {
- final Bundle extras = new Bundle();
- extras.putString("android.substName", getString(R.string.notification_name));
- final int size = getResources()
- .getDimensionPixelSize(android.R.dimen.notification_large_icon_width);
- final Cat cat = Cat.create(this);
- final Notification.Builder builder
- = cat.buildNotification(this)
- .setContentTitle("DEBUG")
- .setChannel(NekoLand.CHAN_ID)
- .setContentText("Ran job: " + params);
- noman.notify(DEBUG_NOTIFICATION, builder.build());
- }
-
- final PrefState prefs = new PrefState(this);
- int food = prefs.getFoodState();
- if (food != 0) {
- prefs.setFoodState(0); // nom
- final Random rng = new Random();
- if (rng.nextFloat() <= CAT_CAPTURE_PROB) {
- Cat cat;
- List<Cat> cats = prefs.getCats();
- final int[] probs = getResources().getIntArray(R.array.food_new_cat_prob);
- final float new_cat_prob = (float)((food < probs.length) ? probs[food] : 50) / 100f;
-
- if (cats.size() == 0 || rng.nextFloat() <= new_cat_prob) {
- cat = Cat.create(this);
- prefs.addCat(cat);
- cat.logAdd(this);
- Log.v(TAG, "A new cat is here: " + cat.getName());
- } else {
- cat = cats.get(rng.nextInt(cats.size()));
- Log.v(TAG, "A cat has returned: " + cat.getName());
- }
-
- final Notification.Builder builder = cat.buildNotification(this);
- noman.notify(CAT_NOTIFICATION, builder.build());
- }
- }
- cancelJob(this);
- return false;
- }
-
- @Override
- public boolean onStopJob(JobParameters jobParameters) {
- return false;
- }
-
- public static void registerJobIfNeeded(Context context, long intervalMinutes) {
- JobScheduler jss = context.getSystemService(JobScheduler.class);
- JobInfo info = jss.getPendingJob(JOB_ID);
- if (info == null) {
- registerJob(context, intervalMinutes);
- }
- }
-
- public static void registerJob(Context context, long intervalMinutes) {
- setupNotificationChannels(context);
-
- JobScheduler jss = context.getSystemService(JobScheduler.class);
- jss.cancel(JOB_ID);
- long interval = intervalMinutes * MINUTES;
- long jitter = (long)(INTERVAL_JITTER_FRAC * interval);
- interval += (long)(Math.random() * (2 * jitter)) - jitter;
- final JobInfo jobInfo = new JobInfo.Builder(JOB_ID,
- new ComponentName(context, NekoService.class))
- .setPeriodic(interval, INTERVAL_FLEX)
- .build();
-
- Log.v(TAG, "A cat will visit in " + interval + "ms: " + String.valueOf(jobInfo));
- jss.schedule(jobInfo);
-
- if (NekoLand.DEBUG_NOTIFICATIONS) {
- NotificationManager noman = context.getSystemService(NotificationManager.class);
- noman.notify(DEBUG_NOTIFICATION, new Notification.Builder(context)
- .setSmallIcon(R.drawable.stat_icon)
- .setContentTitle(String.format("Job scheduled in %d min", (interval / MINUTES)))
- .setContentText(String.valueOf(jobInfo))
- .setPriority(Notification.PRIORITY_MIN)
- .setCategory(Notification.CATEGORY_SERVICE)
- .setChannel(NekoLand.CHAN_ID)
- .setShowWhen(true)
- .build());
- }
- }
-
- public static void cancelJob(Context context) {
- JobScheduler jss = context.getSystemService(JobScheduler.class);
- Log.v(TAG, "Canceling job");
- jss.cancel(JOB_ID);
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java b/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java
deleted file mode 100644
index 159b40a3e5af..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.content.Intent;
-import android.service.quicksettings.Tile;
-import android.service.quicksettings.TileService;
-import android.util.Log;
-
-import com.android.egg.neko.PrefState.PrefsListener;
-import com.android.internal.logging.MetricsLogger;
-
-public class NekoTile extends TileService implements PrefsListener {
-
- private static final String TAG = "NekoTile";
-
- private PrefState mPrefs;
-
- @Override
- public void onCreate() {
- super.onCreate();
- mPrefs = new PrefState(this);
- }
-
- @Override
- public void onStartListening() {
- super.onStartListening();
- mPrefs.setListener(this);
- updateState();
- }
-
- @Override
- public void onStopListening() {
- super.onStopListening();
- mPrefs.setListener(null);
- }
-
- @Override
- public void onTileAdded() {
- super.onTileAdded();
- MetricsLogger.count(this, "egg_neko_tile_added", 1);
- }
-
- @Override
- public void onTileRemoved() {
- super.onTileRemoved();
- MetricsLogger.count(this, "egg_neko_tile_removed", 1);
- }
-
- @Override
- public void onPrefsChanged() {
- updateState();
- }
-
- private void updateState() {
- Tile tile = getQsTile();
- int foodState = mPrefs.getFoodState();
- Food food = new Food(foodState);
- if (foodState != 0) {
- NekoService.registerJobIfNeeded(this, food.getInterval(this));
- }
- tile.setIcon(food.getIcon(this));
- tile.setLabel(food.getName(this));
- tile.setState(foodState != 0 ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
- tile.updateTile();
- }
-
- @Override
- public void onClick() {
- if (mPrefs.getFoodState() != 0) {
- // there's already food loaded, let's empty it
- MetricsLogger.count(this, "egg_neko_empty_food", 1);
- mPrefs.setFoodState(0);
- NekoService.cancelJob(this);
- } else {
- // time to feed the cats
- if (isLocked()) {
- if (isSecure()) {
- Log.d(TAG, "startActivityAndCollapse");
- Intent intent = new Intent(this, NekoLockedActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivityAndCollapse(intent);
- } else {
- unlockAndRun(new Runnable() {
- @Override
- public void run() {
- showNekoDialog();
- }
- });
- }
- } else {
- showNekoDialog();
- }
- }
- }
-
- private void showNekoDialog() {
- Log.d(TAG, "showNekoDialog");
- MetricsLogger.count(this, "egg_neko_select_food", 1);
- showDialog(new NekoDialog(this));
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/neko/PrefState.java b/packages/EasterEgg/src/com/android/egg/neko/PrefState.java
deleted file mode 100644
index bf71b197d3cb..000000000000
--- a/packages/EasterEgg/src/com/android/egg/neko/PrefState.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2016 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.egg.neko;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class PrefState implements OnSharedPreferenceChangeListener {
-
- private static final String FILE_NAME = "mPrefs";
-
- private static final String FOOD_STATE = "food";
-
- private static final String CAT_KEY_PREFIX = "cat:";
-
- private final Context mContext;
- private final SharedPreferences mPrefs;
- private PrefsListener mListener;
-
- public PrefState(Context context) {
- mContext = context;
- mPrefs = mContext.getSharedPreferences(FILE_NAME, 0);
- }
-
- // Can also be used for renaming.
- public void addCat(Cat cat) {
- mPrefs.edit()
- .putString(CAT_KEY_PREFIX + String.valueOf(cat.getSeed()), cat.getName())
- .apply();
- }
-
- public void removeCat(Cat cat) {
- mPrefs.edit().remove(CAT_KEY_PREFIX + String.valueOf(cat.getSeed())).apply();
- }
-
- public List<Cat> getCats() {
- ArrayList<Cat> cats = new ArrayList<>();
- Map<String, ?> map = mPrefs.getAll();
- for (String key : map.keySet()) {
- if (key.startsWith(CAT_KEY_PREFIX)) {
- long seed = Long.parseLong(key.substring(CAT_KEY_PREFIX.length()));
- Cat cat = new Cat(mContext, seed);
- cat.setName(String.valueOf(map.get(key)));
- cats.add(cat);
- }
- }
- return cats;
- }
-
- public int getFoodState() {
- return mPrefs.getInt(FOOD_STATE, 0);
- }
-
- public void setFoodState(int foodState) {
- mPrefs.edit().putInt(FOOD_STATE, foodState).apply();
- }
-
- public void setListener(PrefsListener listener) {
- mListener = listener;
- if (mListener != null) {
- mPrefs.registerOnSharedPreferenceChangeListener(this);
- } else {
- mPrefs.unregisterOnSharedPreferenceChangeListener(this);
- }
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- mListener.onPrefsChanged();
- }
-
- public interface PrefsListener {
- void onPrefsChanged();
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/octo/Ocquarium.java b/packages/EasterEgg/src/com/android/egg/octo/Ocquarium.java
deleted file mode 100644
index 8a06cc604f1e..000000000000
--- a/packages/EasterEgg/src/com/android/egg/octo/Ocquarium.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2017 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.egg.octo;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-
-import com.android.egg.R;
-
-public class Ocquarium extends Activity {
- ImageView mImageView;
- private OctopusDrawable mOcto;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- final float dp = getResources().getDisplayMetrics().density;
-
- getWindow().setBackgroundDrawableResource(R.drawable.octo_bg);
-
- FrameLayout bg = new FrameLayout(this);
- setContentView(bg);
- bg.setAlpha(0f);
- bg.animate().setStartDelay(500).setDuration(5000).alpha(1f).start();
-
- mImageView = new ImageView(this);
- bg.addView(mImageView, new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
-
- mOcto = new OctopusDrawable(getApplicationContext());
- mOcto.setSizePx((int) (OctopusDrawable.randfrange(40f,180f) * dp));
- mImageView.setImageDrawable(mOcto);
-
- mImageView.setOnTouchListener(new View.OnTouchListener() {
- boolean touching;
- @Override
- public boolean onTouch(View view, MotionEvent motionEvent) {
- switch (motionEvent.getActionMasked()) {
- case MotionEvent.ACTION_DOWN:
- if (mOcto.hitTest(motionEvent.getX(), motionEvent.getY())) {
- touching = true;
- mOcto.stopDrift();
- }
- break;
- case MotionEvent.ACTION_MOVE:
- if (touching) {
- mOcto.moveTo(motionEvent.getX(), motionEvent.getY());
- }
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- touching = false;
- mOcto.startDrift();
- break;
- }
- return true;
- }
- });
- }
-
- @Override
- protected void onPause() {
- mOcto.stopDrift();
- super.onPause();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mOcto.startDrift();
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/octo/OctopusDrawable.java b/packages/EasterEgg/src/com/android/egg/octo/OctopusDrawable.java
deleted file mode 100644
index 5dde6e115268..000000000000
--- a/packages/EasterEgg/src/com/android/egg/octo/OctopusDrawable.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/*
- * Copyright (C) 2017 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.egg.octo;
-
-import android.animation.TimeAnimator;
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.DashPathEffect;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.PixelFormat;
-import android.graphics.PointF;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.support.animation.DynamicAnimation;
-import android.support.animation.SpringForce;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.animation.SpringAnimation;
-import android.support.animation.FloatValueHolder;
-
-public class OctopusDrawable extends Drawable {
- private static float BASE_SCALE = 100f;
- public static boolean PATH_DEBUG = false;
-
- private static int BODY_COLOR = 0xFF101010;
- private static int ARM_COLOR = 0xFF101010;
- private static int ARM_COLOR_BACK = 0xFF000000;
- private static int EYE_COLOR = 0xFF808080;
-
- private static int[] BACK_ARMS = {1, 3, 4, 6};
- private static int[] FRONT_ARMS = {0, 2, 5, 7};
-
- private Paint mPaint = new Paint();
- private Arm[] mArms = new Arm[8];
- final PointF point = new PointF();
- private int mSizePx = 100;
- final Matrix M = new Matrix();
- final Matrix M_inv = new Matrix();
- private TimeAnimator mDriftAnimation;
- private boolean mBlinking;
- private float[] ptmp = new float[2];
- private float[] scaledBounds = new float[2];
-
- public static float randfrange(float a, float b) {
- return (float) (Math.random()*(b-a) + a);
- }
- public static float clamp(float v, float a, float b) {
- return v<a?a:v>b?b:v;
- }
-
- public OctopusDrawable(Context context) {
- float dp = context.getResources().getDisplayMetrics().density;
- setSizePx((int) (100*dp));
- mPaint.setAntiAlias(true);
- for (int i=0; i<mArms.length; i++) {
- final float bias = (float)i/(mArms.length-1) - 0.5f;
- mArms[i] = new Arm(
- 0,0, // arm will be repositioned on moveTo
- 10f*bias + randfrange(0,20f), randfrange(20f,50f),
- 40f*bias+randfrange(-60f,60f), randfrange(30f, 80f),
- randfrange(-40f,40f), randfrange(-80f,40f),
- 14f, 2f);
- }
- }
-
- public void setSizePx(int size) {
- mSizePx = size;
- M.setScale(mSizePx/BASE_SCALE, mSizePx/BASE_SCALE);
- // TaperedPathStroke.setMinStep(20f*BASE_SCALE/mSizePx); // nice little floaty circles
- TaperedPathStroke.setMinStep(8f*BASE_SCALE/mSizePx); // classic tentacles
- M.invert(M_inv);
- }
-
- public void startDrift() {
- if (mDriftAnimation == null) {
- mDriftAnimation = new TimeAnimator();
- mDriftAnimation.setTimeListener(new TimeAnimator.TimeListener() {
- float MAX_VY = 35f;
- float JUMP_VY = -100f;
- float MAX_VX = 15f;
- private float ax = 0f, ay = 30f;
- private float vx, vy;
- long nextjump = 0;
- long unblink = 0;
- @Override
- public void onTimeUpdate(TimeAnimator timeAnimator, long t, long dt) {
- float t_sec = 0.001f * t;
- float dt_sec = 0.001f * dt;
- if (t > nextjump) {
- vy = JUMP_VY;
- nextjump = t + (long) randfrange(5000, 10000);
- }
- if (unblink > 0 && t > unblink) {
- setBlinking(false);
- unblink = 0;
- } else if (Math.random() < 0.001f) {
- setBlinking(true);
- unblink = t + 200;
- }
-
- ax = (float) (MAX_VX * Math.sin(t_sec*.25f));
-
- vx = clamp(vx + dt_sec * ax, -MAX_VX, MAX_VX);
- vy = clamp(vy + dt_sec * ay, -100*MAX_VY, MAX_VY);
-
- // oob check
- if (point.y - BASE_SCALE/2 > scaledBounds[1]) {
- vy = JUMP_VY;
- } else if (point.y + BASE_SCALE < 0) {
- vy = MAX_VY;
- }
-
- point.x = clamp(point.x + dt_sec * vx, 0, scaledBounds[0]);
- point.y = point.y + dt_sec * vy;
-
- repositionArms();
- }
- });
- }
- mDriftAnimation.start();
- }
-
- public void stopDrift() {
- mDriftAnimation.cancel();
- }
-
- @Override
- public void onBoundsChange(Rect bounds) {
- final float w = bounds.width();
- final float h = bounds.height();
-
- lockArms(true);
- moveTo(w/2, h/2);
- lockArms(false);
-
- scaledBounds[0] = w;
- scaledBounds[1] = h;
- M_inv.mapPoints(scaledBounds);
- }
-
- // real pixel coordinates
- public void moveTo(float x, float y) {
- point.x = x;
- point.y = y;
- mapPointF(M_inv, point);
- repositionArms();
- }
-
- public boolean hitTest(float x, float y) {
- ptmp[0] = x;
- ptmp[1] = y;
- M_inv.mapPoints(ptmp);
- return Math.hypot(ptmp[0] - point.x, ptmp[1] - point.y) < BASE_SCALE/2;
- }
-
- private void lockArms(boolean l) {
- for (Arm arm : mArms) {
- arm.setLocked(l);
- }
- }
- private void repositionArms() {
- for (int i=0; i<mArms.length; i++) {
- final float bias = (float)i/(mArms.length-1) - 0.5f;
- mArms[i].setAnchor(
- point.x+bias*30f,point.y+26f);
- }
- invalidateSelf();
- }
-
- private void drawPupil(Canvas canvas, float x, float y, float size, boolean open,
- Paint pt) {
- final float r = open ? size*.33f : size * .1f;
- canvas.drawRoundRect(x - size, y - r, x + size, y + r, r, r, pt);
- }
-
- @Override
- public void draw(@NonNull Canvas canvas) {
- canvas.save();
- {
- canvas.concat(M);
-
- // arms behind
- mPaint.setColor(ARM_COLOR_BACK);
- for (int i : BACK_ARMS) {
- mArms[i].draw(canvas, mPaint);
- }
-
- // head/body/thing
- mPaint.setColor(EYE_COLOR);
- canvas.drawCircle(point.x, point.y, 36f, mPaint);
- mPaint.setColor(BODY_COLOR);
- canvas.save();
- {
- canvas.clipOutRect(point.x - 61f, point.y + 8f,
- point.x + 61f, point.y + 12f);
- canvas.drawOval(point.x-40f,point.y-60f,point.x+40f,point.y+40f, mPaint);
- }
- canvas.restore();
-
- // eyes
- mPaint.setColor(EYE_COLOR);
- if (mBlinking) {
- drawPupil(canvas, point.x - 16f, point.y - 12f, 6f, false, mPaint);
- drawPupil(canvas, point.x + 16f, point.y - 12f, 6f, false, mPaint);
- } else {
- canvas.drawCircle(point.x - 16f, point.y - 12f, 6f, mPaint);
- canvas.drawCircle(point.x + 16f, point.y - 12f, 6f, mPaint);
- }
-
- // too much?
- if (false) {
- mPaint.setColor(0xFF000000);
- drawPupil(canvas, point.x - 16f, point.y - 12f, 5f, true, mPaint);
- drawPupil(canvas, point.x + 16f, point.y - 12f, 5f, true, mPaint);
- }
-
- // arms in front
- mPaint.setColor(ARM_COLOR);
- for (int i : FRONT_ARMS) {
- mArms[i].draw(canvas, mPaint);
- }
-
- if (PATH_DEBUG) for (Arm arm : mArms) {
- arm.drawDebug(canvas);
- }
- }
- canvas.restore();
- }
-
- public void setBlinking(boolean b) {
- mBlinking = b;
- invalidateSelf();
- }
-
- @Override
- public void setAlpha(int i) {
- }
-
- @Override
- public void setColorFilter(@Nullable ColorFilter colorFilter) {
-
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
- static Path pathMoveTo(Path p, PointF pt) {
- p.moveTo(pt.x, pt.y);
- return p;
- }
- static Path pathQuadTo(Path p, PointF p1, PointF p2) {
- p.quadTo(p1.x, p1.y, p2.x, p2.y);
- return p;
- }
-
- static void mapPointF(Matrix m, PointF point) {
- float[] p = new float[2];
- p[0] = point.x;
- p[1] = point.y;
- m.mapPoints(p);
- point.x = p[0];
- point.y = p[1];
- }
-
- private class Link // he come to town
- implements DynamicAnimation.OnAnimationUpdateListener {
- final FloatValueHolder[] coords = new FloatValueHolder[2];
- final SpringAnimation[] anims = new SpringAnimation[coords.length];
- private float dx, dy;
- private boolean locked = false;
- Link next;
-
- Link(int index, float x1, float y1, float dx, float dy) {
- coords[0] = new FloatValueHolder(x1);
- coords[1] = new FloatValueHolder(y1);
- this.dx = dx;
- this.dy = dy;
- for (int i=0; i<coords.length; i++) {
- anims[i] = new SpringAnimation(coords[i]);
- anims[i].setSpring(new SpringForce()
- .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY)
- .setStiffness(
- index == 0 ? SpringForce.STIFFNESS_LOW
- : index == 1 ? SpringForce.STIFFNESS_VERY_LOW
- : SpringForce.STIFFNESS_VERY_LOW/2)
- .setFinalPosition(0f));
- anims[i].addUpdateListener(this);
- }
- }
- public void setLocked(boolean locked) {
- this.locked = locked;
- }
- public PointF start() {
- return new PointF(coords[0].getValue(), coords[1].getValue());
- }
- public PointF end() {
- return new PointF(coords[0].getValue()+dx,coords[1].getValue()+dy);
- }
- public PointF mid() {
- return new PointF(
- 0.5f*dx+(coords[0].getValue()),
- 0.5f*dy+(coords[1].getValue()));
- }
- public void animateTo(PointF target) {
- if (locked) {
- setStart(target.x, target.y);
- } else {
- anims[0].animateToFinalPosition(target.x);
- anims[1].animateToFinalPosition(target.y);
- }
- }
- @Override
- public void onAnimationUpdate(DynamicAnimation dynamicAnimation, float v, float v1) {
- if (next != null) {
- next.animateTo(end());
- }
- OctopusDrawable.this.invalidateSelf();
- }
-
- public void setStart(float x, float y) {
- coords[0].setValue(x);
- coords[1].setValue(y);
- onAnimationUpdate(null, 0, 0);
- }
- }
-
- private class Arm {
- final Link link1, link2, link3;
- float max, min;
-
- public Arm(float x, float y, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3,
- float max, float min) {
- link1 = new Link(0, x, y, dx1, dy1);
- link2 = new Link(1, x+dx1, y+dy1, dx2, dy2);
- link3 = new Link(2, x+dx1+dx2, y+dy1+dy2, dx3, dy3);
- link1.next = link2;
- link2.next = link3;
-
- link1.setLocked(true);
- link2.setLocked(false);
- link3.setLocked(false);
-
- this.max = max;
- this.min = min;
- }
-
- // when the arm is locked, it moves rigidly, without physics
- public void setLocked(boolean locked) {
- link2.setLocked(locked);
- link3.setLocked(locked);
- }
-
- private void setAnchor(float x, float y) {
- link1.setStart(x,y);
- }
-
- public Path getPath() {
- Path p = new Path();
- pathMoveTo(p, link1.start());
- pathQuadTo(p, link2.start(), link2.mid());
- pathQuadTo(p, link2.end(), link3.end());
- return p;
- }
-
- public void draw(@NonNull Canvas canvas, Paint pt) {
- final Path p = getPath();
- TaperedPathStroke.drawPath(canvas, p, max, min, pt);
- }
-
- private final Paint dpt = new Paint();
- public void drawDebug(Canvas canvas) {
- dpt.setStyle(Paint.Style.STROKE);
- dpt.setStrokeWidth(0.75f);
- dpt.setStrokeCap(Paint.Cap.ROUND);
-
- dpt.setAntiAlias(true);
- dpt.setColor(0xFF336699);
-
- final Path path = getPath();
- canvas.drawPath(path, dpt);
-
- dpt.setColor(0xFFFFFF00);
-
- dpt.setPathEffect(new DashPathEffect(new float[] {2f, 2f}, 0f));
-
- canvas.drawLines(new float[] {
- link1.end().x, link1.end().y,
- link2.start().x, link2.start().y,
-
- link2.end().x, link2.end().y,
- link3.start().x, link3.start().y,
- }, dpt);
- dpt.setPathEffect(null);
-
- dpt.setColor(0xFF00CCFF);
-
- canvas.drawLines(new float[] {
- link1.start().x, link1.start().y,
- link1.end().x, link1.end().y,
-
- link2.start().x, link2.start().y,
- link2.end().x, link2.end().y,
-
- link3.start().x, link3.start().y,
- link3.end().x, link3.end().y,
- }, dpt);
-
- dpt.setColor(0xFFCCEEFF);
- canvas.drawCircle(link2.start().x, link2.start().y, 2f, dpt);
- canvas.drawCircle(link3.start().x, link3.start().y, 2f, dpt);
-
- dpt.setStyle(Paint.Style.FILL_AND_STROKE);
- canvas.drawCircle(link1.start().x, link1.start().y, 2f, dpt);
- canvas.drawCircle(link2.mid().x, link2.mid().y, 2f, dpt);
- canvas.drawCircle(link3.end().x, link3.end().y, 2f, dpt);
- }
-
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/octo/TaperedPathStroke.java b/packages/EasterEgg/src/com/android/egg/octo/TaperedPathStroke.java
deleted file mode 100644
index e014fbc2559e..000000000000
--- a/packages/EasterEgg/src/com/android/egg/octo/TaperedPathStroke.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2017 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.egg.octo;
-
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.PathMeasure;
-import android.os.Debug;
-
-import java.util.Arrays;
-
-public class TaperedPathStroke {
- static float sMinStepPx = 4f;
- static PathMeasure pm = new PathMeasure();
- static float[] pos = {0,0};
- static float[] tan = {0,0};
- static float lerp(float t, float a, float b) {
- return a + t*(b-a);
- }
- public static void setMinStep(float px) {
- sMinStepPx = px;
- }
-
- // it's the variable-width brush algorithm from the Markers app, basically
- public static void drawPath(Canvas c, Path p, float r1, float r2, Paint pt) {
- pm.setPath(p,false);
- final float len = pm.getLength();
- float t=0;
- boolean last=false;
- while (true) {
- if (t>=len) {
- t=len;
- last=true;
- }
- pm.getPosTan(t, pos, tan);
- float r = len > 0 ? lerp(t/len, r1, r2) : r1;
- c.drawCircle(pos[0], pos[1], r, pt);
- t += Math.max(r*0.25f, sMinStepPx); // walk forward 1/4 radius, not too small though
- if (last) break;
- }
- }
-}
diff --git a/packages/EasterEgg/src/com/android/egg/paint/BrushPropertyDrawable.kt b/packages/EasterEgg/src/com/android/egg/paint/BrushPropertyDrawable.kt
new file mode 100644
index 000000000000..4a02ee688cf4
--- /dev/null
+++ b/packages/EasterEgg/src/com/android/egg/paint/BrushPropertyDrawable.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.egg.paint
+
+import android.content.Context
+import android.graphics.*
+import android.graphics.PixelFormat.TRANSLUCENT
+import android.graphics.drawable.Drawable
+import android.util.DisplayMetrics
+
+class BrushPropertyDrawable : Drawable {
+ val framePaint = Paint(Paint.ANTI_ALIAS_FLAG).also {
+ it.color = Color.BLACK
+ it.style = Paint.Style.FILL
+ }
+ val wellPaint = Paint(Paint.ANTI_ALIAS_FLAG).also {
+ it.color = Color.RED
+ it.style = Paint.Style.FILL
+ }
+
+ constructor(context: Context) {
+ _size = (24 * context.resources.displayMetrics.density).toInt()
+ }
+
+ private var _size = 24
+ private var _scale = 1f
+
+ fun setFrameColor(color: Int) {
+ framePaint.color = color
+ invalidateSelf()
+ }
+
+ fun setWellColor(color: Int) {
+ wellPaint.color = color
+ invalidateSelf()
+ }
+
+ fun setWellScale(scale: Float) {
+ _scale = scale
+ invalidateSelf()
+ }
+
+ override fun getIntrinsicWidth(): Int {
+ return _size
+ }
+
+ override fun getIntrinsicHeight(): Int {
+ return _size
+ }
+
+ override fun draw(c: Canvas?) {
+ c?.let {
+ val w = bounds.width().toFloat()
+ val h = bounds.height().toFloat()
+ val inset = _size / 12 // 2dp in a 24x24 icon
+ val r = Math.min(w, h) / 2
+
+ c.drawCircle(w/2, h/2, (r - inset) * _scale + 1 , wellPaint)
+
+ val p = Path()
+ p.addCircle(w/2, h/2, r, Path.Direction.CCW)
+ p.addCircle(w/2, h/2, r - inset, Path.Direction.CW)
+ c.drawPath(p, framePaint)
+ }
+ }
+
+ override fun setAlpha(p0: Int) {
+ //
+ }
+
+ override fun getOpacity(): Int {
+ return TRANSLUCENT
+ }
+
+ override fun setColorFilter(p0: ColorFilter?) {
+ //
+ }
+
+} \ No newline at end of file
diff --git a/packages/EasterEgg/src/com/android/egg/paint/CutoutAvoidingToolbar.kt b/packages/EasterEgg/src/com/android/egg/paint/CutoutAvoidingToolbar.kt
new file mode 100644
index 000000000000..164fc5a5af3d
--- /dev/null
+++ b/packages/EasterEgg/src/com/android/egg/paint/CutoutAvoidingToolbar.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.egg.paint
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.*
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import android.widget.LinearLayout
+
+class CutoutAvoidingToolbar : LinearLayout {
+ private var _insets: WindowInsets? = null
+
+ constructor(context: Context) : super(context) {
+ init(null, 0)
+ }
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ init(attrs, 0)
+ }
+
+ constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
+ init(attrs, defStyle)
+ }
+
+ override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+ super.onSizeChanged(w, h, oldw, oldh)
+ adjustLayout()
+ }
+
+ override fun onApplyWindowInsets(insets: WindowInsets?): WindowInsets {
+ _insets = insets
+ adjustLayout()
+ return super.onApplyWindowInsets(insets)
+ }
+
+ fun adjustLayout() {
+ _insets?.displayCutout?.boundingRects?.let {
+ var cutoutCenter = 0
+ var cutoutLeft = 0
+ var cutoutRight = 0
+
+ // collect at most three cutouts
+ for (r in it) {
+ if (r.top > 0) continue
+
+ if (r.left == left) {
+ cutoutLeft = r.width()
+ } else if (r.right == right) {
+ cutoutRight = r.width()
+ } else {
+ cutoutCenter = r.width()
+ }
+ }
+
+ // apply to layout
+ (findViewWithTag("cutoutLeft") as View?)?.let {
+ it.layoutParams = LayoutParams(cutoutLeft, MATCH_PARENT)
+ }
+ (findViewWithTag("cutoutCenter") as View?)?.let {
+ it.layoutParams = LayoutParams(cutoutCenter, MATCH_PARENT)
+ }
+ (findViewWithTag("cutoutRight") as View?)?.let {
+ it.layoutParams = LayoutParams(cutoutRight, MATCH_PARENT)
+ }
+
+ requestLayout()
+ }
+ }
+
+ private fun init(attrs: AttributeSet?, defStyle: Int) {
+ }
+
+}
diff --git a/packages/EasterEgg/src/com/android/egg/paint/PaintActivity.java b/packages/EasterEgg/src/com/android/egg/paint/PaintActivity.java
new file mode 100644
index 000000000000..ac47fbda09c6
--- /dev/null
+++ b/packages/EasterEgg/src/com/android/egg/paint/PaintActivity.java
@@ -0,0 +1,351 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.egg.paint;
+
+import static android.view.MotionEvent.ACTION_CANCEL;
+import static android.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.ACTION_MOVE;
+import static android.view.MotionEvent.ACTION_UP;
+
+import android.app.Activity;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.animation.OvershootInterpolator;
+import android.widget.FrameLayout;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.Magnifier;
+
+import com.android.egg.R;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.stream.IntStream;
+
+public class PaintActivity extends Activity {
+ private static final float MAX_BRUSH_WIDTH_DP = 100f;
+ private static final float MIN_BRUSH_WIDTH_DP = 1f;
+
+ private static final int NUM_BRUSHES = 6;
+ private static final int NUM_COLORS = 6;
+
+ private Painting painting = null;
+ private CutoutAvoidingToolbar toolbar = null;
+ private LinearLayout brushes = null;
+ private LinearLayout colors = null;
+ private Magnifier magnifier = null;
+ private boolean sampling = false;
+
+ private View.OnClickListener buttonHandler = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.btnBrush:
+ view.setSelected(true);
+ hideToolbar(colors);
+ toggleToolbar(brushes);
+ break;
+ case R.id.btnColor:
+ view.setSelected(true);
+ hideToolbar(brushes);
+ toggleToolbar(colors);
+ break;
+ case R.id.btnClear:
+ painting.clear();
+ break;
+ case R.id.btnSample:
+ sampling = true;
+ view.setSelected(true);
+ break;
+ case R.id.btnZen:
+ painting.setZenMode(!painting.getZenMode());
+ view.animate()
+ .setStartDelay(200)
+ .setInterpolator(new OvershootInterpolator())
+ .rotation(painting.getZenMode() ? 0f : 90f);
+ break;
+ }
+ }
+ };
+
+ private void showToolbar(View bar) {
+ if (bar.getVisibility() != View.GONE) return;
+ bar.setVisibility(View.VISIBLE);
+ bar.setTranslationY(toolbar.getHeight()/2);
+ bar.animate()
+ .translationY(toolbar.getHeight())
+ .alpha(1f)
+ .setDuration(220)
+ .start();
+ }
+
+ private void hideToolbar(View bar) {
+ if (bar.getVisibility() != View.VISIBLE) return;
+ bar.animate()
+ .translationY(toolbar.getHeight()/2)
+ .alpha(0f)
+ .setDuration(150)
+ .withEndAction(new Runnable() {
+ @Override
+ public void run() {
+ bar.setVisibility(View.GONE);
+ }
+ })
+ .start();
+ }
+
+ private void toggleToolbar(View bar) {
+ if (bar.getVisibility() == View.VISIBLE) {
+ hideToolbar(bar);
+ } else {
+ showToolbar(bar);
+ }
+ }
+
+ private BrushPropertyDrawable widthButtonDrawable;
+ private BrushPropertyDrawable colorButtonDrawable;
+ private float maxBrushWidth, minBrushWidth;
+ private int nightMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
+
+ static final float lerp(float f, float a, float b) {
+ return a + (b-a) * f;
+ }
+
+ void setupViews(Painting oldPainting) {
+ setContentView(R.layout.activity_paint);
+
+ painting = oldPainting != null ? oldPainting : new Painting(this);
+ ((FrameLayout) findViewById(R.id.contentView)).addView(painting,
+ new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT));
+
+ painting.setPaperColor(getColor(R.color.paper_color));
+ painting.setPaintColor(getColor(R.color.paint_color));
+
+ toolbar = findViewById(R.id.toolbar);
+ brushes = findViewById(R.id.brushes);
+ colors = findViewById(R.id.colors);
+
+ magnifier = new Magnifier(painting);
+
+ painting.setOnTouchListener(
+ new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View view, MotionEvent event) {
+ switch (event.getActionMasked()) {
+ case ACTION_DOWN:
+ case ACTION_MOVE:
+ if (sampling) {
+ magnifier.show(event.getX(), event.getY());
+ colorButtonDrawable.setWellColor(
+ painting.sampleAt(event.getX(), event.getY()));
+ return true;
+ }
+ break;
+ case ACTION_CANCEL:
+ if (sampling) {
+ findViewById(R.id.btnSample).setSelected(false);
+ sampling = false;
+ magnifier.dismiss();
+ }
+ break;
+ case ACTION_UP:
+ if (sampling) {
+ findViewById(R.id.btnSample).setSelected(false);
+ sampling = false;
+ magnifier.dismiss();
+ painting.setPaintColor(
+ painting.sampleAt(event.getX(), event.getY()));
+ refreshBrushAndColor();
+ }
+ break;
+ }
+ return false; // allow view to continue handling
+ }
+ });
+
+ findViewById(R.id.btnBrush).setOnClickListener(buttonHandler);
+ findViewById(R.id.btnColor).setOnClickListener(buttonHandler);
+ findViewById(R.id.btnClear).setOnClickListener(buttonHandler);
+ findViewById(R.id.btnSample).setOnClickListener(buttonHandler);
+ findViewById(R.id.btnZen).setOnClickListener(buttonHandler);
+
+ findViewById(R.id.btnColor).setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View view) {
+ colors.removeAllViews();
+ showToolbar(colors);
+ refreshBrushAndColor();
+ return true;
+ }
+ });
+
+ findViewById(R.id.btnClear).setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View view) {
+ painting.invertContents();
+ return true;
+ }
+ });
+
+ widthButtonDrawable = new BrushPropertyDrawable(this);
+ widthButtonDrawable.setFrameColor(getColor(R.color.toolbar_icon_color));
+ colorButtonDrawable = new BrushPropertyDrawable(this);
+ colorButtonDrawable.setFrameColor(getColor(R.color.toolbar_icon_color));
+
+ ((ImageButton) findViewById(R.id.btnBrush)).setImageDrawable(widthButtonDrawable);
+ ((ImageButton) findViewById(R.id.btnColor)).setImageDrawable(colorButtonDrawable);
+
+ refreshBrushAndColor();
+ }
+
+ private void refreshBrushAndColor() {
+ final LinearLayout.LayoutParams button_lp = new LinearLayout.LayoutParams(
+ 0, ViewGroup.LayoutParams.WRAP_CONTENT);
+ button_lp.weight = 1f;
+ if (brushes.getChildCount() == 0) {
+ for (int i = 0; i < NUM_BRUSHES; i++) {
+ final BrushPropertyDrawable icon = new BrushPropertyDrawable(this);
+ icon.setFrameColor(getColor(R.color.toolbar_icon_color));
+ // exponentially increasing brush size
+ final float width = lerp(
+ (float) Math.pow((float) i / NUM_BRUSHES, 2f), minBrushWidth,
+ maxBrushWidth);
+ icon.setWellScale(width / maxBrushWidth);
+ icon.setWellColor(getColor(R.color.toolbar_icon_color));
+ final ImageButton button = new ImageButton(this);
+ button.setImageDrawable(icon);
+ button.setBackground(getDrawable(R.drawable.toolbar_button_bg));
+ button.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ brushes.setSelected(false);
+ hideToolbar(brushes);
+ painting.setBrushWidth(width);
+ refreshBrushAndColor();
+ }
+ });
+ brushes.addView(button, button_lp);
+ }
+ }
+
+ if (colors.getChildCount() == 0) {
+ final Palette pal = new Palette(NUM_COLORS);
+ for (final int c : IntStream.concat(
+ IntStream.of(Color.BLACK, Color.WHITE),
+ Arrays.stream(pal.getColors())
+ ).toArray()) {
+ final BrushPropertyDrawable icon = new BrushPropertyDrawable(this);
+ icon.setFrameColor(getColor(R.color.toolbar_icon_color));
+ icon.setWellColor(c);
+ final ImageButton button = new ImageButton(this);
+ button.setImageDrawable(icon);
+ button.setBackground(getDrawable(R.drawable.toolbar_button_bg));
+ button.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ colors.setSelected(false);
+ hideToolbar(colors);
+ painting.setPaintColor(c);
+ refreshBrushAndColor();
+ }
+ });
+ colors.addView(button, button_lp);
+ }
+ }
+
+ widthButtonDrawable.setWellScale(painting.getBrushWidth() / maxBrushWidth);
+ widthButtonDrawable.setWellColor(painting.getPaintColor());
+ colorButtonDrawable.setWellColor(painting.getPaintColor());
+ }
+
+ private void refreshNightMode(Configuration config) {
+ int newNightMode =
+ (config.uiMode & Configuration.UI_MODE_NIGHT_MASK);
+ if (nightMode != newNightMode) {
+ if (nightMode != Configuration.UI_MODE_NIGHT_UNDEFINED) {
+ painting.invertContents();
+
+ ((ViewGroup) painting.getParent()).removeView(painting);
+ setupViews(painting);
+
+ final View decorView = getWindow().getDecorView();
+ int decorSUIV = decorView.getSystemUiVisibility();
+
+ if (newNightMode == Configuration.UI_MODE_NIGHT_YES) {
+ decorView.setSystemUiVisibility(
+ decorSUIV & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
+ } else {
+ decorView.setSystemUiVisibility(
+ decorSUIV | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
+ }
+ }
+ nightMode = newNightMode;
+ }
+ }
+
+ public PaintActivity() {
+
+ }
+
+ @Override
+ public void onTrimMemory(int level) {
+ super.onTrimMemory(level);
+
+ painting.onTrimMemory();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+
+ refreshNightMode(newConfig);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ WindowManager.LayoutParams lp = getWindow().getAttributes();
+ lp.flags = lp.flags
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
+ getWindow().setAttributes(lp);
+
+ maxBrushWidth = MAX_BRUSH_WIDTH_DP * getResources().getDisplayMetrics().density;
+ minBrushWidth = MIN_BRUSH_WIDTH_DP * getResources().getDisplayMetrics().density;
+
+ setupViews(null);
+ refreshNightMode(getResources().getConfiguration());
+ }
+
+ @Override
+ public void onPostResume() {
+ super.onPostResume();
+ }
+
+}
diff --git a/packages/EasterEgg/src/com/android/egg/paint/Painting.kt b/packages/EasterEgg/src/com/android/egg/paint/Painting.kt
new file mode 100644
index 000000000000..a4a3d3d835e0
--- /dev/null
+++ b/packages/EasterEgg/src/com/android/egg/paint/Painting.kt
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.egg.paint
+
+import android.content.Context
+import android.content.res.Resources
+import android.graphics.*
+import android.provider.Settings
+import android.util.AttributeSet
+import android.util.DisplayMetrics
+import android.view.MotionEvent
+import android.view.View
+import android.view.WindowInsets
+import java.util.concurrent.TimeUnit
+import android.util.Log
+import android.provider.Settings.System
+
+import org.json.JSONObject
+
+fun hypot(x: Float, y: Float): Float {
+ return Math.hypot(x.toDouble(), y.toDouble()).toFloat()
+}
+
+fun invlerp(x: Float, a: Float, b: Float): Float {
+ return if (b > a) {
+ (x - a) / (b - a)
+ } else 1.0f
+}
+
+public class Painting : View, SpotFilter.Plotter {
+ companion object {
+ val FADE_MINS = TimeUnit.MINUTES.toMillis(3) // about how long a drawing should last
+ val ZEN_RATE = TimeUnit.SECONDS.toMillis(2) // how often to apply the fade
+ val ZEN_FADE = Math.max(1f, ZEN_RATE / FADE_MINS * 255f)
+
+ val FADE_TO_WHITE_CF = ColorMatrixColorFilter(ColorMatrix(floatArrayOf(
+ 1f, 0f, 0f, 0f, ZEN_FADE,
+ 0f, 1f, 0f, 0f, ZEN_FADE,
+ 0f, 0f, 1f, 0f, ZEN_FADE,
+ 0f, 0f, 0f, 1f, 0f
+ )))
+
+ val FADE_TO_BLACK_CF = ColorMatrixColorFilter(ColorMatrix(floatArrayOf(
+ 1f, 0f, 0f, 0f, -ZEN_FADE,
+ 0f, 1f, 0f, 0f, -ZEN_FADE,
+ 0f, 0f, 1f, 0f, -ZEN_FADE,
+ 0f, 0f, 0f, 1f, 0f
+ )))
+
+ val INVERT_CF = ColorMatrixColorFilter(ColorMatrix(floatArrayOf(
+ -1f, 0f, 0f, 0f, 255f,
+ 0f, -1f, 0f, 0f, 255f,
+ 0f, 0f, -1f, 0f, 255f,
+ 0f, 0f, 0f, 1f, 0f
+ )))
+
+ val TOUCH_STATS = "touch.stats" // Settings.System key
+ }
+
+ var devicePressureMin = 0f; // ideal value
+ var devicePressureMax = 1f; // ideal value
+
+ var zenMode = true
+ set(value) {
+ if (field != value) {
+ field = value
+ removeCallbacks(fadeRunnable)
+ if (value && isAttachedToWindow) {
+ handler.postDelayed(fadeRunnable, ZEN_RATE)
+ }
+ }
+ }
+
+ var bitmap: Bitmap? = null
+ var paperColor : Int = 0xFFFFFFFF.toInt()
+
+ private var _paintCanvas: Canvas? = null
+ private val _bitmapLock = Object()
+
+ private var _drawPaint = Paint(Paint.ANTI_ALIAS_FLAG)
+ private var _lastX = 0f
+ private var _lastY = 0f
+ private var _lastR = 0f
+ private var _insets: WindowInsets? = null
+
+ private var _brushWidth = 100f
+
+ private var _filter = SpotFilter(10, 0.5f, 0.9f, this)
+
+ private val fadeRunnable = object : Runnable {
+ private val pt = Paint()
+ override fun run() {
+ val c = _paintCanvas
+ if (c != null) {
+ pt.colorFilter =
+ if (paperColor.and(0xFF) > 0x80)
+ FADE_TO_WHITE_CF
+ else
+ FADE_TO_BLACK_CF
+
+ synchronized(_bitmapLock) {
+ c.drawBitmap(bitmap, 0f, 0f, pt)
+ }
+ invalidate()
+ }
+ postDelayed(this, ZEN_RATE)
+ }
+ }
+
+ constructor(context: Context) : super(context) {
+ init(null, 0)
+ }
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ init(attrs, 0)
+ }
+
+ constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
+ init(attrs, defStyle)
+ }
+
+ private fun init(attrs: AttributeSet?, defStyle: Int) {
+ loadDevicePressureData()
+ }
+
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
+
+ setupBitmaps()
+
+ if (zenMode) {
+ handler.postDelayed(fadeRunnable, ZEN_RATE)
+ }
+ }
+
+ override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+ super.onSizeChanged(w, h, oldw, oldh)
+ setupBitmaps()
+ }
+
+ override fun onDetachedFromWindow() {
+ if (zenMode) {
+ removeCallbacks(fadeRunnable)
+ }
+ super.onDetachedFromWindow()
+ }
+
+ fun onTrimMemory() {
+ }
+
+ override fun onApplyWindowInsets(insets: WindowInsets?): WindowInsets {
+ _insets = insets
+ if (insets != null && _paintCanvas == null) {
+ setupBitmaps()
+ }
+ return super.onApplyWindowInsets(insets)
+ }
+
+ private fun powf(a: Float, b: Float): Float {
+ return Math.pow(a.toDouble(), b.toDouble()).toFloat()
+ }
+
+ override fun plot(s: MotionEvent.PointerCoords) {
+ val c = _paintCanvas
+ if (c == null) return
+ synchronized(_bitmapLock) {
+ var x = _lastX
+ var y = _lastY
+ var r = _lastR
+ val newR = Math.max(1f, powf(adjustPressure(s.pressure), 2f).toFloat() * _brushWidth)
+
+ if (r >= 0) {
+ val d = hypot(s.x - x, s.y - y)
+ if (d > 1f && (r + newR) > 1f) {
+ val N = (2 * d / Math.min(4f, r + newR)).toInt()
+
+ val stepX = (s.x - x) / N
+ val stepY = (s.y - y) / N
+ val stepR = (newR - r) / N
+ for (i in 0 until N - 1) { // we will draw the last circle below
+ x += stepX
+ y += stepY
+ r += stepR
+ c.drawCircle(x, y, r, _drawPaint)
+ }
+ }
+ }
+
+ c.drawCircle(s.x, s.y, newR, _drawPaint)
+ _lastX = s.x
+ _lastY = s.y
+ _lastR = newR
+ }
+ }
+
+ private fun loadDevicePressureData() {
+ try {
+ val touchDataJson = Settings.System.getString(context.contentResolver, TOUCH_STATS)
+ val touchData = JSONObject(
+ if (touchDataJson != null) touchDataJson else "{}")
+ if (touchData.has("min")) devicePressureMin = touchData.getDouble("min").toFloat()
+ if (touchData.has("max")) devicePressureMax = touchData.getDouble("max").toFloat()
+ if (devicePressureMin < 0) devicePressureMin = 0f
+ if (devicePressureMax < devicePressureMin) devicePressureMax = devicePressureMin + 1f
+ } catch (e: Exception) {
+ }
+ }
+
+ private fun adjustPressure(pressure: Float): Float {
+ if (pressure > devicePressureMax) devicePressureMax = pressure
+ if (pressure < devicePressureMin) devicePressureMin = pressure
+ return invlerp(pressure, devicePressureMin, devicePressureMax)
+ }
+
+ override fun onTouchEvent(event: MotionEvent?): Boolean {
+ val c = _paintCanvas
+ if (event == null || c == null) return super.onTouchEvent(event)
+
+ /*
+ val pt = Paint(Paint.ANTI_ALIAS_FLAG)
+ pt.style = Paint.Style.STROKE
+ pt.color = 0x800000FF.toInt()
+ _paintCanvas?.drawCircle(event.x, event.y, 20f, pt)
+ */
+
+ when (event.actionMasked) {
+ MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
+ _filter.add(event)
+ _filter.finish()
+ invalidate()
+ }
+
+ MotionEvent.ACTION_DOWN -> {
+ _lastR = -1f
+ _filter.add(event)
+ invalidate()
+ }
+
+ MotionEvent.ACTION_MOVE -> {
+ _filter.add(event)
+
+ invalidate()
+ }
+ }
+
+ return true
+ }
+
+ override fun onDraw(canvas: Canvas) {
+ super.onDraw(canvas)
+
+ bitmap?.let {
+ canvas.drawBitmap(bitmap, 0f, 0f, _drawPaint);
+ }
+ }
+
+ // public api
+ fun clear() {
+ bitmap = null
+ setupBitmaps()
+ invalidate()
+ }
+
+ fun sampleAt(x: Float, y: Float): Int {
+ val localX = (x - left).toInt()
+ val localY = (y - top).toInt()
+ return bitmap?.getPixel(localX, localY) ?: Color.BLACK
+ }
+
+ fun setPaintColor(color: Int) {
+ _drawPaint.color = color
+ }
+
+ fun getPaintColor(): Int {
+ return _drawPaint.color
+ }
+
+ fun setBrushWidth(w: Float) {
+ _brushWidth = w
+ }
+
+ fun getBrushWidth(): Float {
+ return _brushWidth
+ }
+
+ private fun setupBitmaps() {
+ val dm = DisplayMetrics()
+ display.getRealMetrics(dm)
+ val w = dm.widthPixels
+ val h = dm.heightPixels
+ val oldBits = bitmap
+ var bits = oldBits
+ if (bits == null || bits.width != w || bits.height != h) {
+ bits = Bitmap.createBitmap(
+ w,
+ h,
+ Bitmap.Config.ARGB_8888
+ )
+ }
+ if (bits == null) return
+
+ val c = Canvas(bits)
+
+ if (oldBits != null) {
+ if (oldBits.width < oldBits.height != bits.width < bits.height) {
+ // orientation change. let's rotate things so they fit better
+ val matrix = Matrix()
+ if (bits.width > bits.height) {
+ // now landscape
+ matrix.postRotate(-90f)
+ matrix.postTranslate(0f, bits.height.toFloat())
+ } else {
+ // now portrait
+ matrix.postRotate(90f)
+ matrix.postTranslate(bits.width.toFloat(), 0f)
+ }
+ if (bits.width != oldBits.height || bits.height != oldBits.width) {
+ matrix.postScale(
+ bits.width.toFloat()/oldBits.height,
+ bits.height.toFloat()/oldBits.width)
+ }
+ c.matrix = matrix
+ }
+ // paint the old artwork atop the new
+ c.drawBitmap(oldBits, 0f, 0f, _drawPaint)
+ c.matrix = Matrix()
+ } else {
+ c.drawColor(paperColor)
+ }
+
+ bitmap = bits
+ _paintCanvas = c
+ }
+
+ fun invertContents() {
+ val invertPaint = Paint()
+ invertPaint.colorFilter = INVERT_CF
+ synchronized(_bitmapLock) {
+ _paintCanvas?.drawBitmap(bitmap, 0f, 0f, invertPaint)
+ }
+ invalidate()
+ }
+}
+
diff --git a/packages/EasterEgg/src/com/android/egg/paint/Palette.kt b/packages/EasterEgg/src/com/android/egg/paint/Palette.kt
new file mode 100644
index 000000000000..7043efe1f4f5
--- /dev/null
+++ b/packages/EasterEgg/src/com/android/egg/paint/Palette.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.egg.paint
+
+import android.graphics.Color
+
+class Palette {
+ var colors : IntArray
+ var lightest = 0
+ var darkest = 0
+
+ /**
+ * rough luminance calculation
+ * https://www.w3.org/TR/AERT/#color-contrast
+ */
+ private fun lum(rgb: Int): Float {
+ return (Color.red(rgb) * 299f + Color.green(rgb) * 587f + Color.blue(rgb) * 114f) / 1000f
+ }
+
+ /**
+ * create a random evenly-spaced color palette
+ * guaranteed to contrast!
+ */
+ fun randomize(S: Float, V: Float) {
+ val hsv = floatArrayOf((Math.random() * 360f).toFloat(), S, V)
+ val count = colors.size
+ colors[0] = Color.HSVToColor(hsv)
+ lightest = 0
+ darkest = 0
+
+ for (i in 0 until count) {
+ hsv[0] = (hsv[0] + 360f / count).rem(360f)
+ val color = Color.HSVToColor(hsv)
+ colors[i] = color
+
+ val lum = lum(colors[i])
+ if (lum < lum(colors[darkest])) darkest = i
+ if (lum > lum(colors[lightest])) lightest = i
+ }
+ }
+
+ override fun toString() : String {
+ val str = StringBuilder("Palette{ ")
+ for (c in colors) {
+ str.append(String.format("#%08x ", c))
+ }
+ str.append("}")
+ return str.toString()
+ }
+
+ constructor(count: Int) {
+ colors = IntArray(count)
+ randomize(1f, 1f)
+ }
+
+ constructor(count: Int, S: Float, V: Float) {
+ colors = IntArray(count)
+ randomize(S, V)
+ }
+
+ constructor(_colors: IntArray) {
+ colors = _colors
+ for (i in 0 until colors.size) {
+ val lum = lum(colors[i])
+ if (lum < lum(colors[darkest])) darkest = i
+ if (lum > lum(colors[lightest])) lightest = i
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/EasterEgg/src/com/android/egg/paint/SpotFilter.kt b/packages/EasterEgg/src/com/android/egg/paint/SpotFilter.kt
new file mode 100644
index 000000000000..2c15c0dc4861
--- /dev/null
+++ b/packages/EasterEgg/src/com/android/egg/paint/SpotFilter.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.egg.paint
+
+import java.util.LinkedList
+
+import android.view.MotionEvent
+
+class SpotFilter(internal var mBufSize: Int, posDecay: Float, pressureDecay: Float, internal var mPlotter: Plotter) {
+ val spots = LinkedList<MotionEvent.PointerCoords>() // newest at front
+ val tmpSpot = MotionEvent.PointerCoords()
+ var lastTool = MotionEvent.TOOL_TYPE_UNKNOWN
+
+ val posDecay: Float
+ val pressureDecay: Float
+
+ interface Plotter {
+ fun plot(s: MotionEvent.PointerCoords)
+ }
+
+ init {
+ this.posDecay = if (posDecay in 0f..1f) posDecay else 1f
+ this.pressureDecay = if (pressureDecay in 0f..1f) pressureDecay else 1f
+ }
+
+ fun filterInto(out: MotionEvent.PointerCoords, tool: Int): MotionEvent.PointerCoords {
+ lastTool = tool
+
+ var wi = 1f // weight for ith component (position)
+ var w = 0f // total weight
+ var wi_press = 1f // weight for ith component (pressure)
+ var w_press = 0f // total weight (pressure)
+
+ var x = 0f
+ var y = 0f
+ var pressure = 0f
+ var size = 0f
+ for (pi in spots) {
+ x += pi.x * wi
+ y += pi.y * wi
+
+ pressure += pi.pressure * wi_press
+ size += pi.size * wi_press
+
+ w += wi
+ wi *= posDecay // exponential backoff
+
+ w_press += wi_press
+ wi_press *= pressureDecay
+
+ if (PRECISE_STYLUS_INPUT && tool == MotionEvent.TOOL_TYPE_STYLUS) {
+ // just take the newest one, no need to average
+ break
+ }
+ }
+
+ out.x = x / w
+ out.y = y / w
+ out.pressure = pressure / w_press
+ out.size = size / w_press
+ return out
+ }
+
+ protected fun addInternal(c: MotionEvent.PointerCoords, tool: Int) {
+ val coord =
+ if (spots.size == mBufSize) {
+ spots.removeLast()
+ } else {
+ MotionEvent.PointerCoords()
+ }
+ coord.copyFrom(c)
+
+ spots.add(0, coord)
+
+ filterInto(tmpSpot, tool)
+ mPlotter.plot(tmpSpot)
+ }
+
+ fun add(cv: List<MotionEvent.PointerCoords>, tool: Int) {
+ for (c in cv) {
+ addInternal(c, tool)
+ }
+ }
+
+ fun add(evt: MotionEvent) {
+ val tool = evt.getToolType(0)
+ for (i in 0 until evt.historySize) {
+ evt.getHistoricalPointerCoords(0, i, tmpSpot)
+ addInternal(tmpSpot, tool)
+ }
+ evt.getPointerCoords(0, tmpSpot)
+ addInternal(tmpSpot, tool)
+ }
+
+ fun finish() {
+ while (spots.size > 0) {
+ filterInto(tmpSpot, lastTool)
+ spots.removeLast()
+ mPlotter.plot(tmpSpot)
+ }
+
+ spots.clear()
+ }
+
+ companion object {
+ var PRECISE_STYLUS_INPUT = true
+ }
+}
+
+
diff --git a/packages/EasterEgg/src/com/android/egg/paint/ToolbarView.kt b/packages/EasterEgg/src/com/android/egg/paint/ToolbarView.kt
new file mode 100644
index 000000000000..86b11e7be81e
--- /dev/null
+++ b/packages/EasterEgg/src/com/android/egg/paint/ToolbarView.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.egg.paint
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Paint
+import android.graphics.Rect
+import android.graphics.drawable.Drawable
+import android.text.TextPaint
+import android.transition.ChangeBounds
+import android.transition.Transition
+import android.transition.TransitionListenerAdapter
+import android.transition.TransitionManager
+import android.util.AttributeSet
+import android.view.*
+import android.view.animation.OvershootInterpolator
+import android.widget.FrameLayout
+
+class ToolbarView : FrameLayout {
+ var inTransition = false
+ var transitionListener: Transition.TransitionListener = object : TransitionListenerAdapter() {
+ override fun onTransitionStart(transition: Transition?) {
+ inTransition = true
+ }
+ override fun onTransitionEnd(transition: Transition?) {
+ inTransition = false
+ }
+ }
+
+ constructor(context: Context) : super(context) {
+ init(null, 0)
+ }
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ init(attrs, 0)
+ }
+
+ constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
+ init(attrs, defStyle)
+ }
+
+ override fun onApplyWindowInsets(insets: WindowInsets?): WindowInsets {
+ var lp = layoutParams as FrameLayout.LayoutParams?
+ if (lp != null && insets != null) {
+ if (insets.hasStableInsets()) {
+ lp.topMargin = insets.stableInsetTop
+ lp.bottomMargin = insets.stableInsetBottom
+ } else {
+ lp.topMargin = insets.systemWindowInsetTop
+ lp.bottomMargin = insets.systemWindowInsetBottom
+ }
+ layoutParams = lp
+ }
+
+ return super.onApplyWindowInsets(insets)
+ }
+
+ private fun init(attrs: AttributeSet?, defStyle: Int) {
+ }
+
+}
diff --git a/packages/ExtServices/AndroidManifest.xml b/packages/ExtServices/AndroidManifest.xml
index 45e557c00333..ff70e9712bcc 100644
--- a/packages/ExtServices/AndroidManifest.xml
+++ b/packages/ExtServices/AndroidManifest.xml
@@ -35,9 +35,8 @@
</service>
<service android:name=".resolver.LRResolverRankerService"
- android:permission="android.permission.BIND_RESOLVER_RANKER_SERVICE"
- android:priority="-1" >
- <intent-filter>
+ android:permission="android.permission.BIND_RESOLVER_RANKER_SERVICE">
+ <intent-filter android:priority="-1">
<action android:name="android.service.resolver.ResolverRankerService" />
</intent-filter>
</service>
diff --git a/packages/ExtServices/res/values/strings.xml b/packages/ExtServices/res/values/strings.xml
index 72647ab8ae3f..617e49ac1120 100644
--- a/packages/ExtServices/res/values/strings.xml
+++ b/packages/ExtServices/res/values/strings.xml
@@ -18,7 +18,6 @@
<string name="app_name">Android Services Library</string>
<string name="notification_assistant">Notification Assistant</string>
- <string name="prompt_block_reason">Too many dismissals:views</string>
<string name="autofill_field_classification_default_algorithm">EDIT_DISTANCE</string>
<string-array name="autofill_field_classification_available_algorithms">
diff --git a/packages/ExtServices/src/android/ext/services/notification/Assistant.java b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
index f8788226fc51..a539b1f2ba60 100644
--- a/packages/ExtServices/src/android/ext/services/notification/Assistant.java
+++ b/packages/ExtServices/src/android/ext/services/notification/Assistant.java
@@ -19,7 +19,9 @@ package android.ext.services.notification;
import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE;
+import android.annotation.NonNull;
import android.app.INotificationManager;
+import android.app.Notification;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
@@ -80,6 +82,7 @@ public class Assistant extends NotificationAssistantService {
private float mDismissToViewRatioLimit;
private int mStreakLimit;
+ private SmartActionsHelper mSmartActionsHelper;
// key : impressions tracker
// TODO: prune deleted channels and apps
@@ -99,6 +102,7 @@ public class Assistant extends NotificationAssistantService {
// Contexts are correctly hooked up by the creation step, which is required for the observer
// to be hooked up/initialized.
new SettingsObserver(mHandler);
+ mSmartActionsHelper = new SmartActionsHelper();
}
private void loadFile() {
@@ -187,7 +191,26 @@ public class Assistant extends NotificationAssistantService {
@Override
public Adjustment onNotificationEnqueued(StatusBarNotification sbn) {
if (DEBUG) Log.i(TAG, "ENQUEUED " + sbn.getKey());
- return null;
+ ArrayList<Notification.Action> actions =
+ mSmartActionsHelper.suggestActions(this, sbn);
+ if (actions.isEmpty()) {
+ return null;
+ }
+ return createEnqueuedNotificationAdjustment(sbn, actions);
+ }
+
+ /** A convenience helper for creating an adjustment for an SBN. */
+ private Adjustment createEnqueuedNotificationAdjustment(
+ @NonNull StatusBarNotification statusBarNotification,
+ @NonNull ArrayList<Notification.Action> smartActions) {
+ Bundle signals = new Bundle();
+ signals.putParcelableArrayList(Adjustment.KEY_SMART_ACTIONS, smartActions);
+ return new Adjustment(
+ statusBarNotification.getPackageName(),
+ statusBarNotification.getKey(),
+ signals,
+ "smart action" /* explanation */,
+ statusBarNotification.getUserId());
}
@Override
@@ -292,8 +315,7 @@ public class Assistant extends NotificationAssistantService {
if (DEBUG) Log.d(TAG, "User probably doesn't want " + key);
Bundle signals = new Bundle();
signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE);
- return new Adjustment(packageName, key, signals,
- getContext().getString(R.string.prompt_block_reason), user);
+ return new Adjustment(packageName, key, signals, "", user);
}
// for testing
@@ -379,4 +401,4 @@ public class Assistant extends NotificationAssistantService {
}
}
}
-} \ No newline at end of file
+}
diff --git a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
new file mode 100644
index 000000000000..ed5cbabe1ca2
--- /dev/null
+++ b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java
@@ -0,0 +1,227 @@
+/**
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.ext.services.notification;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.Notification;
+import android.app.RemoteAction;
+import android.app.RemoteInput;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.os.Process;
+import android.service.notification.StatusBarNotification;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.view.textclassifier.TextClassification;
+import android.view.textclassifier.TextClassificationManager;
+import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextLinks;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class SmartActionsHelper {
+ private static final ArrayList<Notification.Action> EMPTY_LIST = new ArrayList<>();
+
+ // If a notification has any of these flags set, it's inelgibile for actions being added.
+ private static final int FLAG_MASK_INELGIBILE_FOR_ACTIONS =
+ Notification.FLAG_ONGOING_EVENT
+ | Notification.FLAG_FOREGROUND_SERVICE
+ | Notification.FLAG_GROUP_SUMMARY
+ | Notification.FLAG_NO_CLEAR;
+ private static final int MAX_ACTION_EXTRACTION_TEXT_LENGTH = 400;
+ private static final int MAX_ACTIONS_PER_LINK = 1;
+ private static final int MAX_SMART_ACTIONS = Notification.MAX_ACTION_BUTTONS;
+
+ SmartActionsHelper() {}
+
+ /**
+ * Adds action adjustments based on the notification contents.
+ *
+ * TODO: Once we have a API in {@link TextClassificationManager} to predict smart actions
+ * from notification text / message, we can replace most of the code here by consuming that API.
+ */
+ @NonNull
+ ArrayList<Notification.Action> suggestActions(
+ @Nullable Context context, @NonNull StatusBarNotification sbn) {
+ if (!isEligibleForActionAdjustment(sbn)) {
+ return EMPTY_LIST;
+ }
+ if (context == null) {
+ return EMPTY_LIST;
+ }
+ TextClassificationManager tcm = context.getSystemService(TextClassificationManager.class);
+ if (tcm == null) {
+ return EMPTY_LIST;
+ }
+ Notification.Action[] actions = sbn.getNotification().actions;
+ int numOfExistingActions = actions == null ? 0: actions.length;
+ int maxSmartActions = MAX_SMART_ACTIONS - numOfExistingActions;
+ return suggestActionsFromText(
+ tcm,
+ getMostSalientActionText(sbn.getNotification()), maxSmartActions);
+ }
+
+ /**
+ * Returns whether a notification is eligible for action adjustments.
+ *
+ * <p>We exclude system notifications, those that get refreshed frequently, or ones that relate
+ * to fundamental phone functionality where any error would result in a very negative user
+ * experience.
+ */
+ private boolean isEligibleForActionAdjustment(@NonNull StatusBarNotification sbn) {
+ Notification notification = sbn.getNotification();
+ String pkg = sbn.getPackageName();
+ if (!Process.myUserHandle().equals(sbn.getUser())) {
+ return false;
+ }
+ if (notification.actions != null
+ && notification.actions.length >= Notification.MAX_ACTION_BUTTONS) {
+ return false;
+ }
+ if (0 != (notification.flags & FLAG_MASK_INELGIBILE_FOR_ACTIONS)) {
+ return false;
+ }
+ if (TextUtils.isEmpty(pkg) || pkg.equals("android")) {
+ return false;
+ }
+ // For now, we are only interested in messages.
+ return Notification.CATEGORY_MESSAGE.equals(notification.category)
+ || Notification.MessagingStyle.class.equals(notification.getNotificationStyle())
+ || hasInlineReply(notification);
+ }
+
+ private boolean hasInlineReply(Notification notification) {
+ Notification.Action[] actions = notification.actions;
+ if (actions == null) {
+ return false;
+ }
+ for (Notification.Action action : actions) {
+ RemoteInput[] remoteInputs = action.getRemoteInputs();
+ if (remoteInputs == null) {
+ continue;
+ }
+ for (RemoteInput remoteInput : remoteInputs) {
+ if (remoteInput.getAllowFreeFormInput()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /** Returns the text most salient for action extraction in a notification. */
+ @Nullable
+ private CharSequence getMostSalientActionText(@NonNull Notification notification) {
+ /* If it's messaging style, use the most recent message. */
+ Parcelable[] messages = notification.extras.getParcelableArray(Notification.EXTRA_MESSAGES);
+ if (messages != null && messages.length != 0) {
+ Bundle lastMessage = (Bundle) messages[messages.length - 1];
+ CharSequence lastMessageText =
+ lastMessage.getCharSequence(Notification.MessagingStyle.Message.KEY_TEXT);
+ if (!TextUtils.isEmpty(lastMessageText)) {
+ return lastMessageText;
+ }
+ }
+
+ // Fall back to using the normal text.
+ return notification.extras.getCharSequence(Notification.EXTRA_TEXT);
+ }
+
+ /** Returns a list of actions to act on entities in a given piece of text. */
+ @NonNull
+ private ArrayList<Notification.Action> suggestActionsFromText(
+ @NonNull TextClassificationManager tcm, @Nullable CharSequence text,
+ int maxSmartActions) {
+ if (TextUtils.isEmpty(text)) {
+ return EMPTY_LIST;
+ }
+ TextClassifier textClassifier = tcm.getTextClassifier();
+
+ // We want to process only text visible to the user to avoid confusing suggestions, so we
+ // truncate the text to a reasonable length. This is particularly important for e.g.
+ // email apps that sometimes include the text for the entire thread.
+ text = text.subSequence(0, Math.min(text.length(), MAX_ACTION_EXTRACTION_TEXT_LENGTH));
+
+ // Extract all entities.
+ TextLinks.Request textLinksRequest = new TextLinks.Request.Builder(text)
+ .setEntityConfig(
+ TextClassifier.EntityConfig.createWithHints(
+ Collections.singletonList(
+ TextClassifier.HINT_TEXT_IS_NOT_EDITABLE)))
+ .build();
+ TextLinks links = textClassifier.generateLinks(textLinksRequest);
+ ArrayMap<String, Integer> entityTypeFrequency = getEntityTypeFrequency(links);
+
+ ArrayList<Notification.Action> actions = new ArrayList<>();
+ for (TextLinks.TextLink link : links.getLinks()) {
+ // Ignore any entity type for which we have too many entities. This is to handle the
+ // case where a notification contains e.g. a list of phone numbers. In such cases, the
+ // user likely wants to act on the whole list rather than an individual entity.
+ if (link.getEntityCount() == 0
+ || entityTypeFrequency.get(link.getEntity(0)) != 1) {
+ continue;
+ }
+
+ // Generate the actions, and add the most prominent ones to the action bar.
+ TextClassification classification =
+ textClassifier.classifyText(
+ new TextClassification.Request.Builder(
+ text, link.getStart(), link.getEnd()).build());
+ int numOfActions = Math.min(
+ MAX_ACTIONS_PER_LINK, classification.getActions().size());
+ for (int i = 0; i < numOfActions; ++i) {
+ RemoteAction action = classification.getActions().get(i);
+ actions.add(
+ new Notification.Action.Builder(
+ action.getIcon(),
+ action.getTitle(),
+ action.getActionIntent())
+ .build());
+ // We have enough smart actions.
+ if (actions.size() >= maxSmartActions) {
+ return actions;
+ }
+ }
+ }
+ return actions;
+ }
+
+ /**
+ * Given the links extracted from a piece of text, returns the frequency of each entity
+ * type.
+ */
+ @NonNull
+ private ArrayMap<String, Integer> getEntityTypeFrequency(@NonNull TextLinks links) {
+ ArrayMap<String, Integer> entityTypeCount = new ArrayMap<>();
+ for (TextLinks.TextLink link : links.getLinks()) {
+ if (link.getEntityCount() == 0) {
+ continue;
+ }
+ String entityType = link.getEntity(0);
+ if (entityTypeCount.containsKey(entityType)) {
+ entityTypeCount.put(entityType, entityTypeCount.get(entityType) + 1);
+ } else {
+ entityTypeCount.put(entityType, 1);
+ }
+ }
+ return entityTypeCount;
+ }
+}
diff --git a/packages/InputDevices/Android.mk b/packages/InputDevices/Android.mk
index 6de1f1d43f72..80803fd94ff1 100644
--- a/packages/InputDevices/Android.mk
+++ b/packages/InputDevices/Android.mk
@@ -19,7 +19,7 @@ LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
-LOCAL_JAVA_LIBRARIES :=
+LOCAL_JAVA_LIBRARIES :=
LOCAL_PACKAGE_NAME := InputDevices
LOCAL_SDK_VERSION := current
@@ -39,7 +39,7 @@ validatekeymaps := $(HOST_OUT_EXECUTABLES)/validatekeymaps$(HOST_EXECUTABLE_SUFF
input_devices_keymaps := $(wildcard $(LOCAL_PATH)/res/raw/*.kcm)
$(LOCAL_BUILT_MODULE): PRIVATE_VALIDATEKEYMAPS := $(validatekeymaps)
$(LOCAL_BUILT_MODULE) : $(input_devices_keymaps) | $(validatekeymaps)
- $(hide) $(PRIVATE_VALIDATEKEYMAPS) $^
+ $(hide) $(PRIVATE_VALIDATEKEYMAPS) -q $^
$(hide) mkdir -p $(dir $@) && touch $@
# Run validatekeymaps unconditionally for platform build.
diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/PrinterHashMap.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/PrinterHashMap.java
deleted file mode 100644
index 61956f694245..000000000000
--- a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/PrinterHashMap.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2016 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.printservice.recommendation.plugin.hp;
-
-import android.net.nsd.NsdServiceInfo;
-
-import java.util.HashMap;
-
-final class PrinterHashMap extends HashMap<String, NsdServiceInfo> {
- public static String getKey(NsdServiceInfo serviceInfo) {
- return serviceInfo.getServiceName();
- }
- public NsdServiceInfo addPrinter(NsdServiceInfo device) {
- return put(getKey(device), device);
- }
- public NsdServiceInfo removePrinter(NsdServiceInfo device) {
- return remove(getKey(device));
- }
-}
diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/ServiceListener.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/ServiceListener.java
index 600af1ff6da4..9535ef06f888 100644
--- a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/ServiceListener.java
+++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/hp/ServiceListener.java
@@ -24,6 +24,7 @@ import android.text.TextUtils;
import com.android.printservice.recommendation.R;
import com.android.printservice.recommendation.util.DiscoveryListenerMultiplexer;
+import com.android.printservice.recommendation.util.PrinterHashMap;
import java.net.InetAddress;
import java.util.ArrayList;
@@ -183,9 +184,7 @@ public class ServiceListener implements ServiceResolveQueue.ResolveCallback {
ArrayList<InetAddress> printerAddressess = new ArrayList<>();
for (PrinterHashMap oneVendorPrinters : mVendorHashMap.values()) {
- for (NsdServiceInfo printer : oneVendorPrinters.values()) {
- printerAddressess.add(printer.getHost());
- }
+ printerAddressess.addAll(oneVendorPrinters.getPrinterAddresses());
}
return printerAddressess;
diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/PrinterHashMap.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/PrinterHashMap.java
deleted file mode 100755
index b88c7c725349..000000000000
--- a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/PrinterHashMap.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2016 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.printservice.recommendation.plugin.xerox;
-
-import android.net.nsd.NsdServiceInfo;
-
-import java.util.HashMap;
-
-final class PrinterHashMap extends HashMap<String, NsdServiceInfo> {
- public static String getKey(NsdServiceInfo serviceInfo) {
- return serviceInfo.getServiceName();
- }
-
- public NsdServiceInfo addPrinter(NsdServiceInfo device) {
- return put(getKey(device), device);
- }
-
- public NsdServiceInfo removePrinter(NsdServiceInfo device) {
- return remove(getKey(device));
- }
-}
diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/ServiceResolver.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/ServiceResolver.java
index 4d0efd8be23d..9ada969c84c9 100755
--- a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/ServiceResolver.java
+++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/ServiceResolver.java
@@ -22,6 +22,7 @@ import android.text.TextUtils;
import com.android.printservice.recommendation.util.DiscoveryListenerMultiplexer;
import com.android.printservice.recommendation.util.NsdResolveQueue;
+import com.android.printservice.recommendation.util.PrinterHashMap;
import java.net.InetAddress;
import java.util.ArrayList;
@@ -195,12 +196,7 @@ class ServiceResolver {
}
public ArrayList<InetAddress> getPrinters() {
- ArrayList<InetAddress> printerAddresses = new ArrayList<>();
- for (NsdServiceInfo printer : mPrinterHashMap.values()) {
- printerAddresses.add(printer.getHost());
- }
-
- return printerAddresses;
+ return mPrinterHashMap.getPrinterAddresses();
}
}
diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/MDNSFilteredDiscovery.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/MDNSFilteredDiscovery.java
index c08ca6ef591f..65cef9441fdc 100644
--- a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/MDNSFilteredDiscovery.java
+++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/MDNSFilteredDiscovery.java
@@ -18,6 +18,7 @@ package com.android.printservice.recommendation.util;
import android.content.Context;
import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo;
+import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.GuardedBy;
@@ -27,9 +28,8 @@ import androidx.core.util.Preconditions;
import com.android.printservice.recommendation.PrintServicePlugin;
-import java.net.InetAddress;
-import java.util.ArrayList;
import java.util.HashSet;
+import java.util.Objects;
import java.util.Set;
/**
@@ -55,9 +55,9 @@ public class MDNSFilteredDiscovery implements NsdManager.DiscoveryListener {
boolean matchesCriteria(NsdServiceInfo nsdServiceInfo);
}
- /** Printer identifiers of the mPrinters found. */
+ /** Printers found. */
@GuardedBy("mLock")
- private final @NonNull HashSet<InetAddress> mPrinters;
+ private final @NonNull PrinterHashMap mPrinters;
/** Service types discovered by this plugin */
private final @NonNull HashSet<String> mServiceTypes;
@@ -97,7 +97,7 @@ public class MDNSFilteredDiscovery implements NsdManager.DiscoveryListener {
mPrinterFilter = Preconditions.checkNotNull(printerFilter, "printerFilter");
mResolveQueue = NsdResolveQueue.getInstance();
- mPrinters = new HashSet<>();
+ mPrinters = new PrinterHashMap();
}
/**
@@ -107,6 +107,12 @@ public class MDNSFilteredDiscovery implements NsdManager.DiscoveryListener {
return (NsdManager) mContext.getSystemService(Context.NSD_SERVICE);
}
+ private void onChanged() {
+ if (mCallback != null) {
+ mCallback.onChanged(mPrinters.getPrinterAddresses());
+ }
+ }
+
/**
* Start the discovery.
*
@@ -114,7 +120,8 @@ public class MDNSFilteredDiscovery implements NsdManager.DiscoveryListener {
*/
public void start(@NonNull PrintServicePlugin.PrinterDiscoveryCallback callback) {
mCallback = callback;
- mCallback.onChanged(new ArrayList<>(mPrinters));
+
+ onChanged();
for (String serviceType : mServiceTypes) {
DiscoveryListenerMultiplexer.addListener(getNDSManager(), serviceType, this);
@@ -167,11 +174,12 @@ public class MDNSFilteredDiscovery implements NsdManager.DiscoveryListener {
@Override
public void onServiceResolved(NsdServiceInfo serviceInfo) {
- if (mPrinterFilter.matchesCriteria(serviceInfo)) {
+ if (!TextUtils.isEmpty(PrinterHashMap.getKey(serviceInfo))
+ && mPrinterFilter.matchesCriteria(serviceInfo)) {
if (mCallback != null) {
- boolean added = mPrinters.add(serviceInfo.getHost());
- if (added) {
- mCallback.onChanged(new ArrayList<>(mPrinters));
+ NsdServiceInfo old = mPrinters.addPrinter(serviceInfo);
+ if (!Objects.equals(old, serviceInfo)) {
+ onChanged();
}
}
}
@@ -181,26 +189,9 @@ public class MDNSFilteredDiscovery implements NsdManager.DiscoveryListener {
@Override
public void onServiceLost(NsdServiceInfo serviceInfo) {
- mResolveQueue.resolve(getNDSManager(), serviceInfo,
- new NsdManager.ResolveListener() {
- @Override
- public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
- Log.w(LOG_TAG, "Service lost: Could not resolve " + serviceInfo + ": "
- + errorCode);
- }
-
- @Override
- public void onServiceResolved(NsdServiceInfo serviceInfo) {
- if (mPrinterFilter.matchesCriteria(serviceInfo)) {
- if (mCallback != null) {
- boolean removed = mPrinters.remove(serviceInfo.getHost());
-
- if (removed) {
- mCallback.onChanged(new ArrayList<>(mPrinters));
- }
- }
- }
- }
- });
+ NsdServiceInfo oldAddress = mPrinters.removePrinter(serviceInfo);
+ if (oldAddress != null) {
+ onChanged();
+ }
}
-} \ No newline at end of file
+}
diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/PrinterHashMap.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/PrinterHashMap.java
new file mode 100644
index 000000000000..ee35edb3956d
--- /dev/null
+++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/util/PrinterHashMap.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2016 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.printservice.recommendation.util;
+
+import android.net.nsd.NsdServiceInfo;
+import android.util.ArrayMap;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+
+/**
+ * Map to store {@link NsdServiceInfo} belonging to printers. If two infos have the same
+ * {@link PrinterHashMap#getKey(NsdServiceInfo) key} they are considered the same.
+ */
+public class PrinterHashMap {
+ private final ArrayMap<String, NsdServiceInfo> mPrinters = new ArrayMap<>();
+
+ /**
+ * Key uniquely identifying a printer.
+ *
+ * @param serviceInfo The service info describing the printer
+ *
+ * @return The key
+ */
+ public static String getKey(NsdServiceInfo serviceInfo) {
+ return serviceInfo.getServiceName();
+ }
+
+ /**
+ * Add a printer.
+ *
+ * @param device The service info of the printer
+ *
+ * @return The service info of the printer that was previously registered for the same key
+ */
+ public NsdServiceInfo addPrinter(NsdServiceInfo device) {
+ return mPrinters.put(getKey(device), device);
+ }
+
+ /**
+ * Remove a printer.
+ *
+ * @param device The service info of the printer
+ *
+ * @return The service info of the printer that was previously registered for the same key
+ */
+ public NsdServiceInfo removePrinter(NsdServiceInfo device) {
+ return mPrinters.remove(getKey(device));
+ }
+
+ /**
+ * @return the addresses of printers
+ */
+ public ArrayList<InetAddress> getPrinterAddresses() {
+ int numPrinters = mPrinters.size();
+ ArrayList<InetAddress> printerAddressess = new ArrayList<>(numPrinters);
+ for (int i = 0; i < numPrinters; i++) {
+ printerAddressess.add(mPrinters.valueAt(i).getHost());
+ }
+
+ return printerAddressess;
+ }
+
+ /**
+ * Remove all printers
+ */
+ public void clear() {
+ mPrinters.clear();
+ }
+
+ /**
+ * @return {@code} true iff the map is empty
+ */
+ public boolean isEmpty() {
+ return mPrinters.isEmpty();
+ }
+}
diff --git a/packages/PrintSpooler/jni/Android.bp b/packages/PrintSpooler/jni/Android.bp
new file mode 100644
index 000000000000..789312e58863
--- /dev/null
+++ b/packages/PrintSpooler/jni/Android.bp
@@ -0,0 +1,18 @@
+cc_library_shared {
+ name: "libprintspooler_jni",
+
+ srcs: ["com_android_printspooler_util_BitmapSerializeUtils.cpp"],
+
+ shared_libs: [
+ "libnativehelper",
+ "libjnigraphics",
+ "liblog",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/packages/PrintSpooler/jni/Android.mk b/packages/PrintSpooler/jni/Android.mk
deleted file mode 100644
index 9fd4c84203c7..000000000000
--- a/packages/PrintSpooler/jni/Android.mk
+++ /dev/null
@@ -1,21 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- com_android_printspooler_util_BitmapSerializeUtils.cpp \
-
-LOCAL_C_INCLUDES += \
- $(JNI_H_INCLUDE)
-
-LOCAL_SHARED_LIBRARIES := \
- libnativehelper \
- libjnigraphics \
- liblog
-
-LOCAL_MODULE := libprintspooler_jni
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_expand_less.png b/packages/PrintSpooler/res/drawable-hdpi/ic_expand_less.png
deleted file mode 100644
index b6a5eb5fa48c..000000000000
--- a/packages/PrintSpooler/res/drawable-hdpi/ic_expand_less.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_expand_more.png b/packages/PrintSpooler/res/drawable-hdpi/ic_expand_more.png
deleted file mode 100644
index 4e36bd29db9e..000000000000
--- a/packages/PrintSpooler/res/drawable-hdpi/ic_expand_more.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_grayedout_printer.png b/packages/PrintSpooler/res/drawable-hdpi/ic_grayedout_printer.png
deleted file mode 100644
index 5e54970d6b3f..000000000000
--- a/packages/PrintSpooler/res/drawable-hdpi/ic_grayedout_printer.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png
deleted file mode 100644
index bb9d855f7769..000000000000
--- a/packages/PrintSpooler/res/drawable-hdpi/ic_restart.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-hdpi/stat_notify_cancelling.png b/packages/PrintSpooler/res/drawable-hdpi/stat_notify_cancelling.png
deleted file mode 100644
index 2757db05d657..000000000000
--- a/packages/PrintSpooler/res/drawable-hdpi/stat_notify_cancelling.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_expand_less.png b/packages/PrintSpooler/res/drawable-mdpi/ic_expand_less.png
deleted file mode 100644
index 428a94663194..000000000000
--- a/packages/PrintSpooler/res/drawable-mdpi/ic_expand_less.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_expand_less_24dp.png b/packages/PrintSpooler/res/drawable-mdpi/ic_expand_less_24dp.png
deleted file mode 100644
index 3220eeafa859..000000000000
--- a/packages/PrintSpooler/res/drawable-mdpi/ic_expand_less_24dp.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_expand_more.png b/packages/PrintSpooler/res/drawable-mdpi/ic_expand_more.png
deleted file mode 100644
index fbbd094bdc53..000000000000
--- a/packages/PrintSpooler/res/drawable-mdpi/ic_expand_more.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_expand_more_24dp.png b/packages/PrintSpooler/res/drawable-mdpi/ic_expand_more_24dp.png
deleted file mode 100644
index 5530f52e6b0c..000000000000
--- a/packages/PrintSpooler/res/drawable-mdpi/ic_expand_more_24dp.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_grayedout_printer.png b/packages/PrintSpooler/res/drawable-mdpi/ic_grayedout_printer.png
deleted file mode 100644
index 5e54970d6b3f..000000000000
--- a/packages/PrintSpooler/res/drawable-mdpi/ic_grayedout_printer.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png
deleted file mode 100644
index bd611e8e24d2..000000000000
--- a/packages/PrintSpooler/res/drawable-mdpi/ic_restart.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-mdpi/stat_notify_cancelling.png b/packages/PrintSpooler/res/drawable-mdpi/stat_notify_cancelling.png
deleted file mode 100644
index c1b380a7778f..000000000000
--- a/packages/PrintSpooler/res/drawable-mdpi/stat_notify_cancelling.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_expand_less.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_expand_less.png
deleted file mode 100644
index 6161c209482d..000000000000
--- a/packages/PrintSpooler/res/drawable-xhdpi/ic_expand_less.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_expand_more.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_expand_more.png
deleted file mode 100644
index 3a89805d503a..000000000000
--- a/packages/PrintSpooler/res/drawable-xhdpi/ic_expand_more.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_grayedout_printer.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_grayedout_printer.png
deleted file mode 100644
index 5e54970d6b3f..000000000000
--- a/packages/PrintSpooler/res/drawable-xhdpi/ic_grayedout_printer.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png b/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png
deleted file mode 100644
index a7fdc0dfcb1d..000000000000
--- a/packages/PrintSpooler/res/drawable-xhdpi/ic_restart.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xhdpi/stat_notify_cancelling.png b/packages/PrintSpooler/res/drawable-xhdpi/stat_notify_cancelling.png
deleted file mode 100644
index fedc00e22e2a..000000000000
--- a/packages/PrintSpooler/res/drawable-xhdpi/stat_notify_cancelling.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xxhdpi/ic_expand_less.png b/packages/PrintSpooler/res/drawable-xxhdpi/ic_expand_less.png
deleted file mode 100644
index 52a52d9fa7a6..000000000000
--- a/packages/PrintSpooler/res/drawable-xxhdpi/ic_expand_less.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xxhdpi/ic_expand_more.png b/packages/PrintSpooler/res/drawable-xxhdpi/ic_expand_more.png
deleted file mode 100644
index 15e6abd447fd..000000000000
--- a/packages/PrintSpooler/res/drawable-xxhdpi/ic_expand_more.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xxxhdpi/ic_expand_less.png b/packages/PrintSpooler/res/drawable-xxxhdpi/ic_expand_less.png
deleted file mode 100644
index 46811a1269ad..000000000000
--- a/packages/PrintSpooler/res/drawable-xxxhdpi/ic_expand_less.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable-xxxhdpi/ic_expand_more.png b/packages/PrintSpooler/res/drawable-xxxhdpi/ic_expand_more.png
deleted file mode 100644
index 141f28b26264..000000000000
--- a/packages/PrintSpooler/res/drawable-xxxhdpi/ic_expand_more.png
+++ /dev/null
Binary files differ
diff --git a/packages/PrintSpooler/res/drawable/ic_clear.xml b/packages/PrintSpooler/res/drawable/ic_clear.xml
new file mode 100644
index 000000000000..076e8ef37ad0
--- /dev/null
+++ b/packages/PrintSpooler/res/drawable/ic_clear.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"
+ android:fillColor="?android:colorForeground"/>
+</vector>
diff --git a/packages/PrintSpooler/res/drawable/ic_expand_less.xml b/packages/PrintSpooler/res/drawable/ic_expand_less.xml
index 6f1ece17d393..c3e87dc9c4c3 100644
--- a/packages/PrintSpooler/res/drawable/ic_expand_less.xml
+++ b/packages/PrintSpooler/res/drawable/ic_expand_less.xml
@@ -1,43 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
- android:autoMirrored="true">
-
- <item
- android:state_checked="true">
- <bitmap
- android:src="@drawable/ic_expand_less"
- android:tint="?android:attr/colorControlActivated">
- </bitmap>
- </item>
-
- <item
- android:state_pressed="true">
- <bitmap
- android:src="@drawable/ic_expand_less"
- android:tint="?android:attr/colorControlActivated">
- </bitmap>
- </item>
-
- <item>
- <bitmap
- android:src="@drawable/ic_expand_less"
- android:tint="?android:attr/colorControlNormal">
- </bitmap>
- </item>
-
-</selector>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"
+ android:fillColor="?android:colorForeground" />
+</vector> \ No newline at end of file
diff --git a/packages/PrintSpooler/res/drawable/ic_expand_more.xml b/packages/PrintSpooler/res/drawable/ic_expand_more.xml
index 8d7145278988..3895144a5c1c 100644
--- a/packages/PrintSpooler/res/drawable/ic_expand_more.xml
+++ b/packages/PrintSpooler/res/drawable/ic_expand_more.xml
@@ -1,43 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
- android:autoMirrored="true">
-
- <item
- android:state_checked="true">
- <bitmap
- android:src="@drawable/ic_expand_more"
- android:tint="?android:attr/colorControlActivated">
- </bitmap>
- </item>
-
- <item
- android:state_pressed="true">
- <bitmap
- android:src="@drawable/ic_expand_more"
- android:tint="?android:attr/colorControlActivated">
- </bitmap>
- </item>
-
- <item>
- <bitmap
- android:src="@drawable/ic_expand_more"
- android:tint="?android:attr/colorControlNormal">
- </bitmap>
- </item>
-
-</selector>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6l-6,-6L7.41,8.59z"
+ android:fillColor="?android:colorForeground" />
+</vector> \ No newline at end of file
diff --git a/packages/PrintSpooler/res/drawable/print_warning.xml b/packages/PrintSpooler/res/drawable/print_warning.xml
deleted file mode 100644
index 35f0fed78a7f..000000000000
--- a/packages/PrintSpooler/res/drawable/print_warning.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="96dp"
- android:height="96dp"
- android:viewportWidth="96.0"
- android:viewportHeight="96.0">
- <path
- android:fillColor="#C8CCCE"
- android:pathData="M4,84H92L48,8 4,84zM52,72h-8v-8h8v8zM52,56H44V40h8v16z"/>
-</vector>
diff --git a/packages/PrintSpooler/res/layout/preview_page.xml b/packages/PrintSpooler/res/layout/preview_page.xml
index aafdd8fc035c..8db347e3db4f 100644
--- a/packages/PrintSpooler/res/layout/preview_page.xml
+++ b/packages/PrintSpooler/res/layout/preview_page.xml
@@ -44,7 +44,7 @@
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary">
+ android:textColor="@android:color/white">
</TextView>
<ImageView
diff --git a/packages/PrintSpooler/res/layout/preview_page_error.xml b/packages/PrintSpooler/res/layout/preview_page_error.xml
index 4e9fb7787010..99ab99d07c40 100644
--- a/packages/PrintSpooler/res/layout/preview_page_error.xml
+++ b/packages/PrintSpooler/res/layout/preview_page_error.xml
@@ -21,11 +21,14 @@
android:gravity="center">
<ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="12dip"
- android:src="@drawable/print_warning"
- android:contentDescription="@null" />
+ android:layout_width="120dp"
+ android:layout_height="110dp"
+ android:layout_marginBottom="12dip"
+ android:src="@*android:drawable/ic_print_error"
+ android:scaleType="fitEnd"
+ android:alpha="0.1"
+ android:tint="@android:color/black"
+ android:importantForAccessibility="no" />
<TextView
android:layout_width="wrap_content"
diff --git a/packages/PrintSpooler/res/layout/preview_page_loading.xml b/packages/PrintSpooler/res/layout/preview_page_loading.xml
index 1af3a17ca227..918edd987a79 100644
--- a/packages/PrintSpooler/res/layout/preview_page_loading.xml
+++ b/packages/PrintSpooler/res/layout/preview_page_loading.xml
@@ -19,14 +19,13 @@
android:layout_height="fill_parent">
<ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="36dip"
+ android:layout_width="120dp"
+ android:layout_height="110dp"
android:layout_gravity="center"
- android:src="@drawable/ic_grayedout_printer"
- android:contentDescription="@null"
- android:scaleType="centerInside"
- android:adjustViewBounds="true">
- </ImageView>
+ android:src="@*android:drawable/ic_print"
+ android:scaleType="fitCenter"
+ android:alpha="0.1"
+ android:tint="@android:color/black"
+ android:importantForAccessibility="no" />
</FrameLayout>
diff --git a/packages/PrintSpooler/res/layout/preview_page_selected.xml b/packages/PrintSpooler/res/layout/preview_page_selected.xml
index 77f4727434e6..6727142dfc8b 100644
--- a/packages/PrintSpooler/res/layout/preview_page_selected.xml
+++ b/packages/PrintSpooler/res/layout/preview_page_selected.xml
@@ -42,7 +42,7 @@
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorPrimary">
+ android:textColor="@android:color/white">
</TextView>
<ImageView
diff --git a/packages/PrintSpooler/res/layout/print_activity.xml b/packages/PrintSpooler/res/layout/print_activity.xml
index 774f320d6fd2..212f398aa163 100644
--- a/packages/PrintSpooler/res/layout/print_activity.xml
+++ b/packages/PrintSpooler/res/layout/print_activity.xml
@@ -29,7 +29,7 @@
android:paddingStart="8dip"
android:layout_marginEnd="16dp"
android:elevation="@dimen/preview_controls_elevation"
- android:background="?android:attr/colorPrimary">
+ style="?android:actionBarStyle">
<com.android.printspooler.widget.ClickInterceptSpinner
android:id="@+id/destination_spinner"
@@ -55,7 +55,7 @@
android:paddingBottom="8dip"
android:orientation="horizontal"
android:elevation="@dimen/preview_controls_elevation"
- android:background="?android:attr/colorPrimary">
+ style="?android:actionBarStyle">
<TextView
android:layout_width="wrap_content"
@@ -121,7 +121,6 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:animateLayoutChanges="true"
- android:background="@color/print_preview_background_color"
android:gravity="center">
<!-- Error message added here -->
diff --git a/packages/PrintSpooler/res/layout/print_activity_controls.xml b/packages/PrintSpooler/res/layout/print_activity_controls.xml
index 69d4f914a453..3aafc99da454 100644
--- a/packages/PrintSpooler/res/layout/print_activity_controls.xml
+++ b/packages/PrintSpooler/res/layout/print_activity_controls.xml
@@ -22,7 +22,7 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:elevation="@dimen/preview_controls_elevation"
- android:background="?android:attr/colorPrimary">
+ style="?android:actionBarStyle">
<LinearLayout
android:id="@+id/draggable_content"
diff --git a/packages/PrintSpooler/res/layout/print_error_fragment.xml b/packages/PrintSpooler/res/layout/print_error_fragment.xml
index 3ea2abdb5b5a..9d9dd0100481 100644
--- a/packages/PrintSpooler/res/layout/print_error_fragment.xml
+++ b/packages/PrintSpooler/res/layout/print_error_fragment.xml
@@ -16,35 +16,39 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginStart="16dip"
+ android:layout_marginEnd="16dip"
android:gravity="center"
android:orientation="vertical">
<ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="12dip"
- android:src="@drawable/ic_grayedout_printer"
- android:contentDescription="@null">
- </ImageView>
+ android:layout_width="120dp"
+ android:layout_height="110dp"
+ android:layout_marginBottom="12dp"
+ android:src="@*android:drawable/ic_print_error"
+ android:scaleType="fitEnd"
+ android:alpha="0.1"
+ android:tint="?android:colorForeground"
+ android:importantForAccessibility="no" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="16dip"
- android:layout_marginEnd="16dip"
- android:gravity="center_horizontal"
- android:text="@string/print_error_default_message"
- android:textAppearance="?android:attr/textAppearanceLargeInverse">
- </TextView>
+ android:layout_marginBottom="16dp"
+ android:gravity="center"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textColor="?android:attr/textColorSecondary"
+ android:text="@string/print_error_default_message" />
<Button
android:id="@+id/action_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/print_error_retry">
- </Button>
+ style="?android:attr/borderlessButtonStyle"
+ android:textColor="?android:attr/textColorSecondary"
+ android:text="@string/print_add_printer" />
</LinearLayout>
diff --git a/packages/PrintSpooler/res/layout/print_progress_fragment.xml b/packages/PrintSpooler/res/layout/print_progress_fragment.xml
index 3b010f813e06..890716051d55 100644
--- a/packages/PrintSpooler/res/layout/print_progress_fragment.xml
+++ b/packages/PrintSpooler/res/layout/print_progress_fragment.xml
@@ -15,34 +15,39 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp"
android:gravity="center"
android:orientation="vertical">
<ImageView
+ android:layout_width="120dp"
+ android:layout_height="110dp"
+ android:layout_marginBottom="12dp"
+ android:src="@*android:drawable/ic_print"
+ android:scaleType="fitEnd"
+ android:alpha="0.1"
+ android:tint="?android:colorForeground"
+ android:importantForAccessibility="no" />
+
+ <TextView
+ android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginBottom="12dip"
- android:src="@drawable/ic_grayedout_printer"
- android:contentDescription="@null">
- </ImageView>
+ android:layout_marginBottom="16dp"
+ android:gravity="center"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textColor="?android:attr/textColorSecondary"
+ android:text="@string/print_preparing_preview" />
<ProgressBar
- android:layout_width="fill_parent"
+ android:layout_width="300dp"
android:layout_height="wrap_content"
android:indeterminate="true"
- style="?android:attr/progressBarStyleHorizontal">
- </ProgressBar>
-
- <TextView
- android:id="@+id/message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceLargeInverse"
- android:text="@string/print_preparing_preview">
- </TextView>
+ android:importantForAccessibility="no"
+ style="?android:attr/progressBarStyleHorizontal" />
</LinearLayout>
diff --git a/packages/PrintSpooler/res/layout/select_printer_activity.xml b/packages/PrintSpooler/res/layout/select_printer_activity.xml
index 91beff6993d2..681924b334d0 100644
--- a/packages/PrintSpooler/res/layout/select_printer_activity.xml
+++ b/packages/PrintSpooler/res/layout/select_printer_activity.xml
@@ -31,45 +31,48 @@
android:visibility="gone">
<LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp"
android:gravity="center"
android:orientation="vertical">
<ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="12dip"
- android:src="@*android:drawable/ic_grayedout_printer"
- android:importantForAccessibility="no">
- </ImageView>
+ android:layout_width="120dp"
+ android:layout_height="110dp"
+ android:layout_marginBottom="12dp"
+ android:src="@*android:drawable/ic_print"
+ android:scaleType="fitEnd"
+ android:alpha="0.1"
+ android:tint="?android:colorForeground"
+ android:importantForAccessibility="no" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginBottom="16dp"
+ android:gravity="center"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorSecondary"
- android:text="@string/print_searching_for_printers">
- </TextView>
+ android:text="@string/print_searching_for_printers" />
<ProgressBar
android:id="@+id/progress_bar"
- android:layout_width="fill_parent"
+ android:layout_width="300dp"
android:layout_height="wrap_content"
android:indeterminate="true"
- style="?android:attr/progressBarStyleHorizontal">
- </ProgressBar>
+ android:importantForAccessibility="no"
+ style="?android:attr/progressBarStyleHorizontal" />
<Button
- android:id="@+id/button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- style="?android:attr/buttonBarButtonStyle"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:text="@string/print_add_printer"
- android:textAllCaps="true" />
+ android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="?android:attr/borderlessButtonStyle"
+ android:textColor="?android:attr/textColorSecondary"
+ android:text="@string/print_add_printer" />
</LinearLayout>
diff --git a/packages/PrintSpooler/res/values-km/strings.xml b/packages/PrintSpooler/res/values-km/strings.xml
index ed8219e788b7..c878ebe537fd 100644
--- a/packages/PrintSpooler/res/values-km/strings.xml
+++ b/packages/PrintSpooler/res/values-km/strings.xml
@@ -27,7 +27,7 @@
<string name="label_duplex" msgid="5370037254347072243">"សងខាង"</string>
<string name="label_orientation" msgid="2853142581990496477">"ទិស"</string>
<string name="label_pages" msgid="7768589729282182230">"ទំព័រ"</string>
- <string name="destination_default_text" msgid="5422708056807065710">"ជ្រើសម៉ាស៊ីនបោះពុម្ព"</string>
+ <string name="destination_default_text" msgid="5422708056807065710">"ជ្រើសរើសម៉ាស៊ីនបោះពុម្ព"</string>
<string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> ទាំងអស់"</string>
<string name="template_page_range" msgid="428638530038286328">"ជួរ​នៃ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
<string name="pages_range_example" msgid="8558694453556945172">"ឧ. 1—5,8,11—13"</string>
@@ -103,7 +103,7 @@
<item msgid="3199660090246166812">"ផ្ដេក"</item>
</string-array>
<string name="print_write_error_message" msgid="5787642615179572543">"មិន​អាច​សរសេរ​ទៅ​កាន់​ឯកសារ"</string>
- <string name="print_error_default_message" msgid="8602678405502922346">"សូម​ទោស វា​មិន​ដំណើរ​ការ​ទេ។ ព្យាយាម​ម្ដងទៀត។"</string>
+ <string name="print_error_default_message" msgid="8602678405502922346">"សូមអភ័យ​ទោស វា​មិន​ដំណើរ​ការ​ទេ។ ព្យាយាម​ម្ដងទៀត។"</string>
<string name="print_error_retry" msgid="1426421728784259538">"ព្យាយាម​ម្ដងទៀត"</string>
<string name="print_error_printer_unavailable" msgid="8985614415253203381">"ឥឡូវ​នេះ ម៉ាស៊ីន​បោះពុម្ព​នេះ​មិន​អាច​ប្រើ​បាន។"</string>
<string name="print_cannot_load_page" msgid="6179560924492912009">"មិនអាចបង្ហាញការមើលជាមុនបានទេ"</string>
diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml
index 8aaf6f49a83d..12f5b6002211 100644
--- a/packages/PrintSpooler/res/values-sw/strings.xml
+++ b/packages/PrintSpooler/res/values-sw/strings.xml
@@ -103,7 +103,7 @@
<item msgid="3199660090246166812">"Mlalo"</item>
</string-array>
<string name="print_write_error_message" msgid="5787642615179572543">"Haikuweza kuandika kwenye faili"</string>
- <string name="print_error_default_message" msgid="8602678405502922346">"Samahani, hiyo haikufanya kazi. Jaribu tena."</string>
+ <string name="print_error_default_message" msgid="8602678405502922346">"Samahani, imeshindwa kufanya kazi. Jaribu tena."</string>
<string name="print_error_retry" msgid="1426421728784259538">"Jaribu tena"</string>
<string name="print_error_printer_unavailable" msgid="8985614415253203381">"Printa hii haipatikani kwa sasa."</string>
<string name="print_cannot_load_page" msgid="6179560924492912009">"Haiwezi kupakia onyesho la kuchungulia"</string>
diff --git a/packages/PrintSpooler/res/values/colors.xml b/packages/PrintSpooler/res/values/colors.xml
index 68bc6f277ad2..cb9e8866a396 100644
--- a/packages/PrintSpooler/res/values/colors.xml
+++ b/packages/PrintSpooler/res/values/colors.xml
@@ -18,8 +18,6 @@
<color name="print_preview_scrim_color">#99000000</color>
- <color name="print_preview_background_color">#F2F1F2</color>
-
<color name="unselected_page_background_color">#C0C0C0</color>
<color name="material_grey_500">#ffa3a3a3</color>
diff --git a/packages/PrintSpooler/res/values/themes.xml b/packages/PrintSpooler/res/values/themes.xml
index a968ffa9ed1d..844e9c9f0030 100644
--- a/packages/PrintSpooler/res/values/themes.xml
+++ b/packages/PrintSpooler/res/values/themes.xml
@@ -21,17 +21,14 @@
</style>
<style name="Theme.SelectPrinterActivity"
- parent="android:style/Theme.DeviceDefault.Light.DarkActionBar">
+ parent="android:style/Theme.DeviceDefault.Light">
<item name="android:textAppearanceListItemSecondary">@style/ListItemSecondary</item>
</style>
- <style name="Theme.PrintActivity" parent="@android:style/Theme.DeviceDefault">
+ <style name="Theme.PrintActivity" parent="@android:style/Theme.DeviceDefault.Light">
<item name="android:windowIsTranslucent">true</item>
- <item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:windowContentOverlay">@null</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
- <item name="android:backgroundDimEnabled">false</item>
</style>
</resources>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/NotificationController.java b/packages/PrintSpooler/src/com/android/printspooler/model/NotificationController.java
index 9d737e0cd9d5..abdfad5bb27a 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/NotificationController.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/NotificationController.java
@@ -166,7 +166,7 @@ final class NotificationController {
*/
private Action createCancelAction(PrintJobInfo printJob) {
return new Action.Builder(
- Icon.createWithResource(mContext, R.drawable.stat_notify_cancelling),
+ Icon.createWithResource(mContext, R.drawable.ic_clear),
mContext.getString(R.string.cancel), createCancelIntent(printJob)).build();
}
@@ -225,7 +225,7 @@ final class NotificationController {
private void createFailedNotification(PrintJobInfo printJob) {
Action.Builder restartActionBuilder = new Action.Builder(
- Icon.createWithResource(mContext, R.drawable.ic_restart),
+ Icon.createWithResource(mContext, com.android.internal.R.drawable.ic_restart),
mContext.getString(R.string.restart), createRestartIntent(printJob.getId()));
createNotification(printJob, createCancelAction(printJob), restartActionBuilder.build());
@@ -317,7 +317,7 @@ final class NotificationController {
if (!printJob.isCancelling()) {
return com.android.internal.R.drawable.ic_print;
} else {
- return R.drawable.stat_notify_cancelling;
+ return R.drawable.ic_clear;
}
}
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
index eba5edbf6d68..bba57d5fe0a2 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
@@ -16,6 +16,8 @@
package com.android.printspooler.model;
+import static android.os.PowerManager.PARTIAL_WAKE_LOCK;
+
import static com.android.internal.print.DumpUtils.writePrintJobInfo;
import static com.android.internal.util.dump.DumpUtils.writeComponentName;
@@ -35,6 +37,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.ParcelFileDescriptor;
+import android.os.PowerManager;
import android.os.RemoteException;
import android.print.IPrintSpooler;
import android.print.IPrintSpoolerCallbacks;
@@ -124,6 +127,9 @@ public final class PrintSpoolerService extends Service {
/** Cache for custom printer icons loaded from the print service */
private CustomPrinterIconCache mCustomIconCache;
+ /** If the system should be kept awake to process print jobs */
+ private PowerManager.WakeLock mKeepAwake;
+
public static PrintSpoolerService peekInstance() {
synchronized (sLock) {
return sInstance;
@@ -137,6 +143,8 @@ public final class PrintSpoolerService extends Service {
mPersistanceManager = new PersistenceManager();
mNotificationController = new NotificationController(PrintSpoolerService.this);
mCustomIconCache = new CustomPrinterIconCache(getCacheDir());
+ mKeepAwake = getSystemService(PowerManager.class).newWakeLock(PARTIAL_WAKE_LOCK,
+ "Active Print Job");
synchronized (mLock) {
mPersistanceManager.readStateLocked();
@@ -480,6 +488,11 @@ public final class PrintSpoolerService extends Service {
private void addPrintJobLocked(PrintJobInfo printJob) {
mPrintJobs.add(printJob);
+
+ if (printJob.shouldStayAwake()) {
+ keepAwakeLocked();
+ }
+
if (DEBUG_PRINT_JOB_LIFECYCLE) {
Slog.i(LOG_TAG, "[ADD] " + printJob);
}
@@ -500,6 +513,9 @@ public final class PrintSpoolerService extends Service {
persistState = true;
}
}
+
+ checkIfStillKeepAwakeLocked();
+
if (persistState) {
mPersistanceManager.writeStateLocked();
}
@@ -546,6 +562,12 @@ public final class PrintSpoolerService extends Service {
printJob.setStatus(error);
printJob.setCancelling(false);
+ if (printJob.shouldStayAwake()) {
+ keepAwakeLocked();
+ } else {
+ checkIfStillKeepAwakeLocked();
+ }
+
if (DEBUG_PRINT_JOB_LIFECYCLE) {
Slog.i(LOG_TAG, "[STATE CHANGED] " + printJob);
}
@@ -717,6 +739,12 @@ public final class PrintSpoolerService extends Service {
}
mNotificationController.onUpdateNotifications(mPrintJobs);
+ if (printJob.shouldStayAwake()) {
+ keepAwakeLocked();
+ } else {
+ checkIfStillKeepAwakeLocked();
+ }
+
Message message = PooledLambda.obtainMessage(
PrintSpoolerService::onPrintJobStateChanged, this, printJob);
Handler.getMain().executeOrSendMessage(message);
@@ -1098,7 +1126,7 @@ public final class PrintSpoolerService extends Service {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, StandardCharsets.UTF_8.name());
- parseState(parser);
+ parseStateLocked(parser);
} catch (IllegalStateException ise) {
Slog.w(LOG_TAG, "Failed parsing ", ise);
} catch (NullPointerException npe) {
@@ -1116,14 +1144,14 @@ public final class PrintSpoolerService extends Service {
}
}
- private void parseState(XmlPullParser parser)
+ private void parseStateLocked(XmlPullParser parser)
throws IOException, XmlPullParserException {
parser.next();
skipEmptyTextTags(parser);
expect(parser, XmlPullParser.START_TAG, TAG_SPOOLER);
parser.next();
- while (parsePrintJob(parser)) {
+ while (parsePrintJobLocked(parser)) {
parser.next();
}
@@ -1131,7 +1159,7 @@ public final class PrintSpoolerService extends Service {
expect(parser, XmlPullParser.END_TAG, TAG_SPOOLER);
}
- private boolean parsePrintJob(XmlPullParser parser)
+ private boolean parsePrintJobLocked(XmlPullParser parser)
throws IOException, XmlPullParserException {
skipEmptyTextTags(parser);
if (!accept(parser, XmlPullParser.START_TAG, TAG_JOB)) {
@@ -1343,6 +1371,10 @@ public final class PrintSpoolerService extends Service {
mPrintJobs.add(printJob);
+ if (printJob.shouldStayAwake()) {
+ keepAwakeLocked();
+ }
+
if (DEBUG_PERSISTENCE) {
Log.i(LOG_TAG, "[RESTORED] " + printJob);
}
@@ -1386,6 +1418,33 @@ public final class PrintSpoolerService extends Service {
}
}
+ /**
+ * Keep the system awake as a print job needs to be processed.
+ */
+ private void keepAwakeLocked() {
+ if (!mKeepAwake.isHeld()) {
+ mKeepAwake.acquire();
+ }
+ }
+
+ /**
+ * Check if we still need to keep the system awake.
+ *
+ * @see #keepAwakeLocked
+ */
+ private void checkIfStillKeepAwakeLocked() {
+ if (mKeepAwake.isHeld()) {
+ int numPrintJobs = mPrintJobs.size();
+ for (int i = 0; i < numPrintJobs; i++) {
+ if (mPrintJobs.get(i).shouldStayAwake()) {
+ return;
+ }
+ }
+
+ mKeepAwake.release();
+ }
+ }
+
public final class PrintSpooler extends IPrintSpooler.Stub {
@Override
public void getPrintJobInfos(IPrintSpoolerCallbacks callback,
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index 06fbf9f6e1c1..59f272ff70f6 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -297,7 +297,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
+ " cannot be null");
}
- mCallingPackageName = extras.getString(DocumentsContract.EXTRA_PACKAGE_NAME);
+ mCallingPackageName = extras.getString(Intent.EXTRA_PACKAGE_NAME);
if (savedInstanceState == null) {
MetricsLogger.action(this, MetricsEvent.PRINT_PREVIEW, mCallingPackageName);
@@ -715,7 +715,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.setType("application/pdf");
intent.putExtra(Intent.EXTRA_TITLE, info.getName());
- intent.putExtra(DocumentsContract.EXTRA_PACKAGE_NAME, mCallingPackageName);
+ intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mCallingPackageName);
try {
startActivityForResult(intent, ACTIVITY_REQUEST_CREATE_FILE);
diff --git a/packages/SettingsLib/Android.mk b/packages/SettingsLib/Android.mk
index 5a8be3192b0c..96012c1f2a34 100644
--- a/packages/SettingsLib/Android.mk
+++ b/packages/SettingsLib/Android.mk
@@ -8,17 +8,17 @@ LOCAL_AAPT2_ONLY := true
LOCAL_MODULE := SettingsLib
LOCAL_JAVA_LIBRARIES := \
- android-support-annotations
+ androidx.annotation_annotation
LOCAL_SHARED_ANDROID_LIBRARIES := \
- android-support-v4 \
- android-support-v7-recyclerview \
- android-support-v7-preference \
- android-support-v7-appcompat \
- android-arch-lifecycle-runtime
+ androidx.legacy_legacy-support-v4 \
+ androidx.recyclerview_recyclerview \
+ androidx.preference_preference \
+ androidx.appcompat_appcompat \
+ androidx.lifecycle_lifecycle-runtime
LOCAL_SHARED_JAVA_LIBRARIES := \
- android-arch-lifecycle-common
+ androidx.lifecycle_lifecycle-common
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
@@ -26,6 +26,8 @@ LOCAL_JAR_EXCLUDE_FILES := none
LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_MIN_SDK_VERSION := 21
+
include $(BUILD_STATIC_JAVA_LIBRARY)
# For the test package.
diff --git a/packages/SettingsLib/common.mk b/packages/SettingsLib/common.mk
index 5de3a6e99440..834b83b49ada 100644
--- a/packages/SettingsLib/common.mk
+++ b/packages/SettingsLib/common.mk
@@ -14,15 +14,15 @@
#
LOCAL_STATIC_JAVA_LIBRARIES += \
- android-support-annotations \
- android-arch-lifecycle-common
+ androidx.annotation_annotation \
+ androidx.lifecycle_lifecycle-common
LOCAL_STATIC_ANDROID_LIBRARIES += \
- android-support-v4 \
- android-arch-lifecycle-runtime \
- android-support-v7-recyclerview \
- android-support-v7-preference \
- android-support-v7-appcompat \
- android-support-v14-preference \
+ androidx.legacy_legacy-support-v4 \
+ androidx.lifecycle_lifecycle-runtime \
+ androidx.recyclerview_recyclerview \
+ androidx.preference_preference \
+ androidx.appcompat_appcompat \
+ androidx.legacy_legacy-preference-v14 \
SettingsLib
diff --git a/packages/SettingsLib/res/layout/preference_access_point.xml b/packages/SettingsLib/res/layout/preference_access_point.xml
index 62173da5b7eb..472a6e3d0dd4 100644
--- a/packages/SettingsLib/res/layout/preference_access_point.xml
+++ b/packages/SettingsLib/res/layout/preference_access_point.xml
@@ -45,7 +45,7 @@
android:clipToPadding="false"
android:paddingTop="4dp"
android:paddingBottom="4dp">
- <android.support.v7.internal.widget.PreferenceImageView
+ <androidx.preference.internal.PreferenceImageView
android:id="@android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/packages/SettingsLib/res/layout/preference_category_material_settings.xml b/packages/SettingsLib/res/layout/preference_category_material_settings.xml
deleted file mode 100644
index 1086106e54f4..000000000000
--- a/packages/SettingsLib/res/layout/preference_category_material_settings.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2017 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.
- -->
-
-<!-- Based off frameworks/base/core/res/res/layout/preference_category_material.xml
- except that this supports icon -->
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
- android:layout_marginBottom="8dp"
- android:paddingStart="?android:attr/listPreferredItemPaddingStart" >
-
- <LinearLayout
- android:id="@+id/icon_container"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="start|center_vertical"
- android:orientation="horizontal">
- <com.android.internal.widget.PreferenceImageView
- android:id="@android:id/icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:tint="?android:attr/textColorPrimary"
- android:maxWidth="18dp"
- android:maxHeight="18dp"/>
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="56dp"
- android:orientation="vertical">
- <TextView
- android:id="@android:id/title"
- android:layout_marginTop="16dp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
- android:textAppearance="@android:style/TextAppearance.Material.Body2"
- android:textAlignment="viewStart"
- android:textColor="?android:attr/colorAccent"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"/>
- <TextView
- android:id="@android:id/summary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceListItemSecondary"
- android:textColor="?android:attr/textColorSecondary"
- android:ellipsize="end"
- android:singleLine="true" />
- </LinearLayout>
-
-</FrameLayout> \ No newline at end of file
diff --git a/packages/SettingsLib/res/layout/preference_category_material_settings_with_divider.xml b/packages/SettingsLib/res/layout/preference_category_material_settings_with_divider.xml
index 70d0898f71c1..5b5d474b13f9 100644
--- a/packages/SettingsLib/res/layout/preference_category_material_settings_with_divider.xml
+++ b/packages/SettingsLib/res/layout/preference_category_material_settings_with_divider.xml
@@ -24,5 +24,5 @@
android:layout_height="wrap_content">
<include layout="@layout/preference_category_divider"/>
- <include layout="@layout/preference_category_material_settings"/>
-</LinearLayout> \ No newline at end of file
+ <include layout="@layout/preference_category_material"/>
+</LinearLayout>
diff --git a/packages/SettingsLib/res/layout/preference_dropdown_material_settings.xml b/packages/SettingsLib/res/layout/preference_dropdown_material_settings.xml
deleted file mode 100644
index a0b8155c0818..000000000000
--- a/packages/SettingsLib/res/layout/preference_dropdown_material_settings.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2017 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.
- -->
-
-
-<!-- Based off frameworks/base/core/res/res/layout/preference_dropdown_material.xml
- except that icon space in this layout is always reserved -->
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <Spinner
- android:id="@+id/spinner"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/preference_no_icon_padding_start"
- android:visibility="invisible" />
-
- <include layout="@layout/preference_material"/>
-
-</FrameLayout> \ No newline at end of file
diff --git a/packages/SettingsLib/res/layout/preference_two_target.xml b/packages/SettingsLib/res/layout/preference_two_target.xml
index 4658924477a0..ff6a22d5523c 100644
--- a/packages/SettingsLib/res/layout/preference_two_target.xml
+++ b/packages/SettingsLib/res/layout/preference_two_target.xml
@@ -46,7 +46,7 @@
android:clipToPadding="false"
android:paddingTop="4dp"
android:paddingBottom="4dp">
- <android.support.v7.internal.widget.PreferenceImageView
+ <androidx.preference.internal.PreferenceImageView
android:id="@android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 95a01cf7a8a7..9bacaf33806e 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Wys visuele terugvoer vir tikke"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Wys oppervlakopdaterings"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Flits vensteroppervlaktes in geheel wanneer dit opdateer"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Wys GPU-aansigopdaterings"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flits aansigte binne die vensters wanneer dit met die GPU geskets is"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Wys aansigopdaterings"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Flits aansigte binne vensters wanneer getrek word"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Wys hardewarelae se opdaterings"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Laat hardewarelae groen flits wanneer hulle opgedateer word"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ontfout GPU-oortrek"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Wys snitgrense, kantlyne, ens."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Dwing RTL-uitlegrigting"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Dwing skermuitlegrigting na RTL vir alle locales"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forseer GPU-lewering"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Dwing gebruik van GPU vir 2D-tekening"</string>
<string name="force_msaa" msgid="7920323238677284387">"Dwing 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Aktiveer 4x MSAA in OpenGL ES 2.0-programme"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Ontfout nie-reghoekige knipbedrywighede"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profiel se GPU-lewering"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profiel-HWUI-lewering"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Aktiveer GPU-ontfoutlae"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Laat laai van GPU-ontfoutlae vir ontfoutapps toe"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Vensteranimasieskaal"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 935a9fc937e2..329e9fe03271 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"ለነካ ማድረጎች ምስላዊ ግብረመልስን አሳይ"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"የወለል ዝማኔዎችን አሳይ"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"የመስኮት ወለሎች ሲዘምኑ መላ መስኮቱን አብለጭልጭ"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"የGPU እይታ ዝማኔዎችን አሳይ"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"ከGPU ጋር ሲሳል መስኮቶች ውስጥ እይታዎችን አብለጭልጭ"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"የእይታ ዝማኔዎችን አሳይ"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"እይታዎችን ሲሳሉ በመስኮቶች ውስጥ አብለጭልጭ"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"የሃርድዌር ንብርብሮች ዝማኔዎችን አሳይ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"የሃርድዌር ንብርብሮች ሲዘምኑ አረንጓዴ አብራ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"የጂፒዩ አልፎ መሳል አርም"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"የቅንጥብ ገደቦች፣ ጠርዞች፣ ወዘተ አሳይ"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"የቀኝ-ወደ-ግራ አቀማመጥ አቅጣጫ አስገድድ"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ለሁሉም አካባቢዎች የማያ ገጽ አቀማመጥ ከቀኝ-ወደ-ግራ እንዲሆን አስገድድ"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU ምላሽ መስጠትን አስገድድ"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"ለ2-ልኬት መሳል የGPU ስራ አስገድድ"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA አስገድድ"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"4x MSAA በ OpenGL ES 2.0 መተግበሪያዎች ውስጥ ያንቁ"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"አራት ማእዘን ያልሆኑ የቅንጥብ ክዋኔዎችን ስህተት አርም"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"የGPU ምላሽ መስጠት መዝግብ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"የመገለጫ HWUI ምስልን በመስራት ላይ"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"የጂፒዩ ስህተት ማረሚያ ንብርብሮችን ያንቁ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ለስህተት ማረሚያ መተግበሪያዎች የጂፒዩ ንብርብሮችን መስቀልን ፍቀድ"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"የዊንዶው እነማ ልኬት ለውጥ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 6d01891d6206..846f5d82a71f 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"عرض التعليقات المرئية للنقرات"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"عرض تحديثات السطح"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"وميض أسطح النوافذ بالكامل عندما يتم تحديثها"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"‏إظهار تحديثات عرض GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"وميض العروض داخل النوافذ عندما يتم الرسم باستخدام وحدة معالجة الرسومات"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"إظهار تحديثات العرض"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"إظهار الوميض داخل النوافذ أثناء رسمها"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"عرض تحديثات طبقات الأجهزة"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"تشغيل وميض بالأخضر لطبقات الأجهزة عند تحديثها"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"تصحيح تجاوز حد وحدة معالجة الرسومات"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"عرض حدود وهوامش المقطع وما إلى ذلك."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"فرض اتجاه التنسيق ليكون من اليمين إلى اليسار"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"فرض اتجاه تنسيق الشاشة ليكون من اليمين إلى اليسار لجميع اللغات"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"‏فرض عرض رسومات GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"فرض استخدام وحدة معالجة الرسومات للرسم الثنائي الأبعاد"</string>
<string name="force_msaa" msgid="7920323238677284387">"‏فرض 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"‏تفعيل 4x MSAA في تطبيقات OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"تصحيح أخطاء عمليات القصاصات غير المستطيلة"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"‏رسم مخطط لعرض GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"‏عرض ملف التعريف HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"‏تفعيل طبقات تصحيح أخطاء GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"‏السماح بتحميل طبقات تصحيح أخطاء GPU لتطبيقات تصحيح الأخطاء"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"حجم الرسوم المتحركة للنافذة"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index da76337fe9a8..e3b4bc97a79f 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -224,8 +224,7 @@
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ব্লুটুথ অডিঅ\' চ্চেনেল ম\'ড"</string>
<string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="7234956835280563341">"ব্লুটুথ অডিঅ\' ক\'ডেকৰ বাছনি\nআৰম্ভ কৰক: চ্চেনেল ম\'ড"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ব্লুটুথ অডিঅ’ LDAC ক’ডেক: পৰিৱেশনৰ মান"</string>
- <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (6893955536658137179) -->
- <skip />
+ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="6893955536658137179">"ব্লুটুথ অডিঅ\' LDAC\nক\'ডেক বাছনি আৰম্ভ কৰক: প্লেবেকৰ গুণগত মান"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ষ্ট্ৰীম কৰি থকা হৈছে: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ব্যক্তিগত DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ব্যক্তিগত DNS ম\'ড বাছনি কৰক"</string>
@@ -286,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"টিপিলে দৃশ্যায়িত ফীডবেক দিয়ক"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"পৃষ্ঠভাগৰ আপডেইট দেখুৱাওক"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"আপডেইট হওতে গোটেই ৱিণ্ড পৃষ্ঠসমূহ ফ্লাশ্ব কৰক"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"জিপিইউৰ দৰ্শন আপডেইটসমূহ দেখুৱাওক"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"জিপিইউৰ জৰিয়তে অঁকাৰ সময়ত ৱিণ্ড’ৰ ভিতৰত ফ্লাশ্ব দৰ্শন"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"আপডেট চাওক দেখুৱাওক"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"অঁকাৰ সময়ত ৱিণ্ড\'ৰ ভিতৰত ফ্লাশ্ব দৰ্শন"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"হাৰ্ডৱেৰৰ তৰপৰ আপডেইট দেখুৱাওক"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"হাৰ্ডৱেৰ লেয়াৰ আপডেইট হওতে সিঁহতক সেউজীয়া ৰঙেৰে ফ্লাশ্ব কৰক"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU অভাৰড্ৰ ডিবাগ কৰক"</string>
@@ -301,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ক্লিপ বাউণ্ড, মাৰ্জিন আদিসমূহ দেখুৱাওক"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"আৰটিএল চানেকিৰ দিশ বলেৰে সলনি কৰক"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"সকলো ভাষাৰ বাবে স্ক্ৰীণৰ চানেকিৰ দিশ RTLলৈ বলেৰে সলনি কৰক"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"জিপিইউ ৰেণ্ডাৰিং বলেৰে ব্যৱহাৰ কৰক"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d চিত্ৰাংকনৰ বাবে GPUক বলেৰে ব্যৱহাৰ কৰক"</string>
<string name="force_msaa" msgid="7920323238677284387">"বল ৪গুণ MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 এপত ৪গুণ MSAA সক্ষম কৰক"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"আয়তাকৃতিৰ নোহোৱা ক্লিপ প্ৰক্ৰিয়াসমূহ ডিবাগ কৰক"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"প্ৰ\'ফাইল জিপিইউ ৰেণ্ডাৰিং"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"প্ৰ\'ফাইল HWUI ৰেণ্ডাৰিং"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"জিপিইউ ডিবাগ স্তৰবোৰ সক্ষম কৰক"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ডিবাগ এপসমূহৰ বাবে জিপিইউ ডিবাগ তৰপ ল\'ড কৰিবলৈ অনুমতি দিয়ক"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"ৱিণ্ড\' এনিমেশ্বন স্কেল"</string>
@@ -368,18 +365,12 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ৰং শুধৰণী"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"এই সুবিধাটো পৰীক্ষামূলক, সেয়ে ই কাৰ্যক্ষমতাৰ ওপৰত প্ৰভাৱ পেলাব পাৰে।"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g>ৰ দ্বাৰা অগ্ৰাহ্য কৰা হৈছে"</string>
- <!-- no translation found for power_remaining_settings_home_page (4845022416859002011) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only (6123167166221295462) -->
- <skip />
- <!-- no translation found for power_discharging_duration (8848256785736335185) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_enhanced (4189311599812296592) -->
- <skip />
- <!-- no translation found for power_discharging_duration_enhanced (1992003260664804080) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_short (3463575350656389957) -->
- <skip />
+ <string name="power_remaining_settings_home_page" msgid="4845022416859002011">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="6123167166221295462">"প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string>
+ <string name="power_discharging_duration" msgid="8848256785736335185">"প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="4189311599812296592">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্ৰায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string>
+ <string name="power_discharging_duration_enhanced" msgid="1992003260664804080">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_only_short" msgid="3463575350656389957">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string>
<string name="power_discharge_by_enhanced" msgid="2095821536747992464">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_discharge_by_only_enhanced" msgid="2175151772952365149">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব"</string>
<string name="power_discharge_by" msgid="6453537733650125582">"বেটাৰি আনুমানিকভাৱে <xliff:g id="TIME">%1$s</xliff:g> লৈকে চলিব (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 122a5210771e..5a49c62bd1fe 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Tıklamalar üçün vizual cavab rəylərini göstərin"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Səth güncəlləşməsini göstər"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Güncəlləmədən sonra bütün ekranda işartı olsun"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU görünüş güncəlləməsini göstər"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU ilə tərtib edildikdə işıq pəncərələr daxilində görüntülənir"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Görüntü yeniliklərinə baxın"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"pəncərələrin daxilindəki fleş görüntüləri"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Avadanlıq düzənlərinin güncəlləşməsini göstərin"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Onlar güncəllənəndən sonra avadanlıq qatlarında işartı olsun"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU böyütməsini sazlayın"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Klip sərhədləri, boşluqları və s. göstər"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL düzən istiqamətinə məcbur edin"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Ekran düzən istiqamətini RTL üzərinə bütün yerli variantlar üçün məcbur edin"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU renderə məcbur edin"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d rəsm üçün GPU məcburi istifadə"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA məcbur edin"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 tətbiqlərində 4x MSAA aktiv et"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Qeyri-düzbucaqlı klip əməliyyatlarını debaq edin"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profil GPU render"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profil HWUI bərpası"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU debaq təbəqələrini aktiv edin"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"GPU debaq təbəqələrinin yüklənməsinə icazə verin"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Pəncərə animasiya miqyası"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index c108b974b86f..75999a403860 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Prikazuj vizuelne povratne informacije za dodire"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Prikaži ažuriranja površine"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Osvetli sve površine prozora kada se ažuriraju"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Prikaži ažur. GPU prikaza"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Osvetli prikaze u prozor. kada se crta sa GPU-om"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Prikaži ažuriranja prikaza"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Osvetli prikaze u prozorima kada se crta"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Prikaži ažuriranja hardverskih slojeva"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardverski slojevi trepere zeleno kada se ažuriraju"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Otkloni greške GPU preklapanja"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Prikaži granice klipa, margine itd."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Nametni smer rasporeda zdesna nalevo"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Nametni smer rasporeda ekrana zdesna nalevo za sve lokalitete"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Prinudni prikaz pom. GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Prinudno koristi GPU za 2D crtanje"</string>
<string name="force_msaa" msgid="7920323238677284387">"Nametni 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Omogući 4x MSAA u OpenGL ES 2.0 aplikacijama"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Otkloni greške u vezi sa radnjama za isecanje oblasti koje nisu pravougaonog oblika"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Prikaži profil pomoću GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Prik. prof. pomoću HWUI-a"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Omogući slojeve za otklanjanje grešaka GPU-a"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Omogući učitavanje otk. greš. GPU-a u apl. za otk. greš."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Razmera animacije prozora"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index a42a7168e433..654138395e03 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Паказваць візуалізацыю дотыкаў"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Паказ. абнаўл. паверхні"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Мігаць ўсёй паверхней акна пры абнаўленні"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Паказ. абнаўленне экрана"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Мігнуць вакном пры чарчэнні з дапамогай GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Паказаць абнаўленні"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Падсвечваць вобласці экрана падчас рысавання"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Паказаць абнаўленнi апаратнага пласта"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Апаратныя пласты набываюць зялёны колер, калi абнаўляюцца"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Адладка перамалёўкі GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Паказаць межы кліпу, палі і г. д."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Прымусовая раскладка справа налева"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Прымусовая раскладка экрана справа налева для ўсіх рэгіянальных налад"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Прымусовае адлюстраванне GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Прымусовае выкарыстанне GPU для 2-мерных чарцяжоў"</string>
<string name="force_msaa" msgid="7920323238677284387">"Прымусовае выкананне 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Уключыць 4x MSAA у прыкладаннях з OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Адладка аперацый непрамавугольнага кліпа"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Профіль рэндэрынгу GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Профіль візуалізацыі HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Уключыць слаі адладкі GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Дазв. загр. слаёў адладкі GPU для праграм адладкі"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Маштаб анімацыі акна"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 4c516eb13d56..676114026b30 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Показване на визуална обр. връзка за докосванията"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Актуал. на повърхн: Показв."</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Примигв. на целите повърхности на прозорците при актуализирането им"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Показв. на актуал. на изгледа от GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Примигв. на изгледи в прозорците при начертаване с GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Актуализации на изгледите"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Примигв. на изгледите в прозорците при начертаване"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Актуал. на слоевете на хардуера"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Примигв. на слоевете на хардуера в зелено при актуал."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отстран. на проблеми с преизчертаване от GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Показв. на границите на изрязване, полетата и др."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Принуд. оформл. отдясно наляво"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Принуд. оформл. на екрана отдясно наляво за вс. локали"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Принудително изобразяване"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Принуд. използв. на GPU за двуизмерно начертаване"</string>
<string name="force_msaa" msgid="7920323238677284387">"Задаване на 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Активиране на 4x MSAA в прилож. с OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Отстр. на грешки при неправоъг. изрязване"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Профилиране на GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Изобр. на HWUI: Профилир."</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Слоеве за отстр. на грешки в ГП: Актив."</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Разреш. на зарежд. на слоевете за отстр. на грешки в ГП за съотв. прилож."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Скала на аним.: Прозорец"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 46fb0afe32bf..66f5c0709fdb 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -278,15 +278,15 @@
<string name="media_category" msgid="4388305075496848353">"মিডিয়া"</string>
<string name="debug_monitoring_category" msgid="7640508148375798343">"পর্যবেক্ষণে রাখা"</string>
<string name="strict_mode" msgid="1938795874357830695">"কঠোর মোড সক্ষম"</string>
- <string name="strict_mode_summary" msgid="142834318897332338">"মুখ্য থ্রেডে অ্যাপ্লিকেশানগুলির দীর্ঘ কার্যকলাপের সময় স্ক্রিন ফ্ল্যাশ করে"</string>
+ <string name="strict_mode_summary" msgid="142834318897332338">"মুখ্য থ্রেডে অ্যাপ্লিকেশানগুলির দীর্ঘ অ্যাক্টিভিটির সময় স্ক্রিন ফ্ল্যাশ করে"</string>
<string name="pointer_location" msgid="6084434787496938001">"পয়েন্টারের লোকেশন"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"স্ক্রিন ওভারলে বর্তমান স্পর্শ ডেটা দেখাচ্ছে"</string>
<string name="show_touches" msgid="2642976305235070316">"আলতো চাপ দেখান"</string>
<string name="show_touches_summary" msgid="6101183132903926324">"আলতো চাপ দিলে ভিজ্যুয়াল প্রতিক্রিয়া দেখান"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"সারফেস আপডেটগুলি দেখান"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"সম্পূর্ণ উইন্ডোর সারফেস আপডেট হয়ে গেলে সেটিকে ফ্ল্যাশ করুন"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU দৃশ্য আপডেটগুলি প্রদর্শন করুন"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU এর সহ অঙ্কনের সময় উইন্ডোগুলির মধ্যেকার দৃশ্যগুলি ফ্ল্যাশ করুন।"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"ভিউয়ের আপডেট দেখুন"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ড্র করা থাকলে উইন্ডোর মধ্যে কী ঘটছে তা দেখানো হবে"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"হার্ডওয়্যার স্তর আপডেটগুলি প্রদর্শন করুন"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"যখন হার্ডওয়্যার স্তরগুলি আপডেট হয় তখন সেগুলিকে সবুজ রঙে ফ্ল্যাশ করুন"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"ডিবাগ GPU ওভারড্র"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ক্লিপ বাউন্ড, মার্জিন ইত্যাদি দেখান"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL লেআউট দিকনির্দেশ জোর দিন"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"সমস্ত স্থানের জন্য RTL এ স্ক্রিন লেআউট দিকনির্দেশে জোর দেয়"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"জোর করে GPU রেন্ডারিং করুন"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2D অঙ্কনের জন্য GPU-এর ব্যবহারে জোর দিন"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA এ জোর দিন"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 অ্যাপ্লিকেশানগুলির মধ্যে 4x MSAA সক্রিয় করুন"</string>
- <string name="show_non_rect_clip" msgid="505954950474595172">"অ-আয়তক্ষেত্রাকার ক্লিপ কার্যকলাপ ডিবাগ করুন"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"প্রোফাইল GPU রেন্ডারিং"</string>
+ <string name="show_non_rect_clip" msgid="505954950474595172">"অ-আয়তক্ষেত্রাকার ক্লিপ অ্যাক্টিভিটি ডিবাগ করুন"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"প্রোফাইল HWUI রেন্ডারিং"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU ডিবাগ স্তর সক্ষম করুন"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ডিবাগ অ্যাপের জন্য GPU ডিবাগ স্তর লোড হতে দিন"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"উইন্ডো অ্যানিমেশন স্কেল"</string>
@@ -313,8 +311,8 @@
<string name="animator_duration_scale_title" msgid="3406722410819934083">"অ্যানিমেটর সময়কাল স্কেল"</string>
<string name="overlay_display_devices_title" msgid="5364176287998398539">"গৌণ প্রদর্শনগুলি নকল করুন"</string>
<string name="debug_applications_category" msgid="4206913653849771549">"অ্যাপ"</string>
- <string name="immediately_destroy_activities" msgid="1579659389568133959">"কার্যকলাপ রাখবেন না"</string>
- <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ব্যবহারকারী এটি ছেড়ে যাওয়ার পরে যত তাড়াতাড়ি সম্ভব প্রতিটি কার্যকলাপ ধ্বংস করুন"</string>
+ <string name="immediately_destroy_activities" msgid="1579659389568133959">"অ্যাক্টিভিটি রাখবেন না"</string>
+ <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ব্যবহারকারী এটি ছেড়ে যাওয়ার পরে যত তাড়াতাড়ি সম্ভব প্রতিটি অ্যাক্টিভিটি ধ্বংস করুন"</string>
<string name="app_process_limit_title" msgid="4280600650253107163">"পশ্চাদপট প্রক্রিয়ার সীমা"</string>
<string name="show_all_anrs" msgid="4924885492787069007">"ব্যাকগ্রাউন্ডের ANR দেখুন"</string>
<string name="show_all_anrs_summary" msgid="6636514318275139826">"ব্যাকগ্রাউন্ডের অ্যাপগুলির জন্য \'অ্যাপ থেকে সাড়া পাওয়া যাচ্ছে না\' মেসেজ দেখান"</string>
diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml
index 8577779d104c..9b3c38c0ab0c 100644
--- a/packages/SettingsLib/res/values-bs/arrays.xml
+++ b/packages/SettingsLib/res/values-bs/arrays.xml
@@ -27,7 +27,7 @@
<item msgid="515055375277271756">"Autentifikacija…"</item>
<item msgid="1943354004029184381">"Dobivanje IP adrese…"</item>
<item msgid="4221763391123233270">"Povezano"</item>
- <item msgid="624838831631122137">"Suspendiran"</item>
+ <item msgid="624838831631122137">"Suspendirano"</item>
<item msgid="7979680559596111948">"Prekidanje veze…"</item>
<item msgid="1634960474403853625">"Isključen"</item>
<item msgid="746097431216080650">"Neuspješno"</item>
@@ -38,11 +38,11 @@
<item msgid="7714855332363650812"></item>
<item msgid="8878186979715711006">"Skeniranje…"</item>
<item msgid="355508996603873860">"Povezivanje na mrežu <xliff:g id="NETWORK_NAME">%1$s</xliff:g>..."</item>
- <item msgid="554971459996405634">"Autentifikacija sa mrežom <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
+ <item msgid="554971459996405634">"Autentifikacija s mrežom <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
<item msgid="7928343808033020343">"Dobivanje IP adrese iz mreže <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
- <item msgid="8937994881315223448">"Povezan na mrežu <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item>
- <item msgid="1330262655415760617">"Suspendiran"</item>
- <item msgid="7698638434317271902">"Prekidanje veze sa mrežom <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
+ <item msgid="8937994881315223448">"Povezano na mrežu <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item>
+ <item msgid="1330262655415760617">"Suspendirano"</item>
+ <item msgid="7698638434317271902">"Prekidanje veze s mrežom <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item>
<item msgid="197508606402264311">"Isključen"</item>
<item msgid="8578370891960825148">"Neuspješno"</item>
<item msgid="5660739516542454527">"Blokirano"</item>
@@ -59,7 +59,7 @@
<item msgid="45075631231212732">"Uvijek koristi HDCP provjeru"</item>
</string-array>
<string-array name="bluetooth_avrcp_versions">
- <item msgid="5347678900838034763">"AVRCP 1.4 (Zadano)"</item>
+ <item msgid="5347678900838034763">"AVRCP 1.4 (zadano)"</item>
<item msgid="2809759619990248160">"AVRCP 1.3"</item>
<item msgid="6199178154704729352">"AVRCP 1.5"</item>
<item msgid="5172170854953034852">"AVRCP 1.6"</item>
@@ -71,58 +71,58 @@
<item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
- <item msgid="7065842274271279580">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="7065842274271279580">"Koristi odabir sistema (zadano)"</item>
<item msgid="7539690996561263909">"SBC"</item>
<item msgid="686685526567131661">"AAC"</item>
<item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
<item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
<item msgid="6751080638867012696">"LDAC"</item>
- <item msgid="723675059572222462">"Omogućite opcionalne kodeke"</item>
- <item msgid="3304843301758635896">"Onemogućite opcionalne kodeke"</item>
+ <item msgid="723675059572222462">"Omogući opcionalne kodeke"</item>
+ <item msgid="3304843301758635896">"Onemogući opcionalne kodeke"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_summaries">
- <item msgid="5062108632402595000">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="5062108632402595000">"Koristi odabir sistema (zadano)"</item>
<item msgid="6898329690939802290">"SBC"</item>
<item msgid="6839647709301342559">"AAC"</item>
<item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> audio"</item>
<item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> audio"</item>
<item msgid="7950781694447359344">"LDAC"</item>
- <item msgid="2209680154067241740">"Omogućite opcionalne kodeke"</item>
- <item msgid="741805482892725657">"Onemogućite opcionalne kodeke"</item>
+ <item msgid="2209680154067241740">"Omogući opcionalne kodeke"</item>
+ <item msgid="741805482892725657">"Onemogući opcionalne kodeke"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
- <item msgid="3093023430402746802">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="3093023430402746802">"Koristi odabir sistema (zadano)"</item>
<item msgid="8895532488906185219">"44,1 kHz"</item>
<item msgid="2909915718994807056">"48,0 kHz"</item>
<item msgid="3347287377354164611">"88,2 kHz"</item>
<item msgid="1234212100239985373">"96,0 kHz"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_summaries">
- <item msgid="3214516120190965356">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="3214516120190965356">"Koristi odabir sistema (zadano)"</item>
<item msgid="4482862757811638365">"44,1 kHz"</item>
<item msgid="354495328188724404">"48,0 kHz"</item>
<item msgid="7329816882213695083">"88,2 kHz"</item>
<item msgid="6967397666254430476">"96,0 kHz"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_bits_per_sample_titles">
- <item msgid="2684127272582591429">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="2684127272582591429">"Koristi odabir sistema (zadano)"</item>
<item msgid="5618929009984956469">"16 bitova/uzorak"</item>
<item msgid="3412640499234627248">"24 bitova/uzorak"</item>
<item msgid="121583001492929387">"32 bitova/uzorak"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries">
- <item msgid="1081159789834584363">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="1081159789834584363">"Koristi odabir sistema (zadano)"</item>
<item msgid="4726688794884191540">"16 bitova/uzorak"</item>
<item msgid="305344756485516870">"24 bitova/uzorak"</item>
<item msgid="244568657919675099">"32 bitova/uzorak"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_channel_mode_titles">
- <item msgid="5226878858503393706">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="5226878858503393706">"Koristi odabir sistema (zadano)"</item>
<item msgid="4106832974775067314">"Mono"</item>
<item msgid="5571632958424639155">"Stereo"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_channel_mode_summaries">
- <item msgid="4118561796005528173">"Koristi odabir sistema (Zadano)"</item>
+ <item msgid="4118561796005528173">"Koristi odabir sistema (zadano)"</item>
<item msgid="8900559293912978337">"Mono"</item>
<item msgid="8883739882299884241">"Stereo"</item>
</string-array>
@@ -130,13 +130,13 @@
<item msgid="7158319962230727476">"Optimizirano za kvalitet zvuka (990 kbps/909 kbps)"</item>
<item msgid="2921767058740704969">"Uravnotežen kvalitet zvuka i veze (660kbps/606kbps)"</item>
<item msgid="8860982705384396512">"Optimizirano za kvalitet veze (330 kbps/303 kbps)"</item>
- <item msgid="4414060457677684127">"Maksimalan napor (Prilagodljiva brzina prijenosa)"</item>
+ <item msgid="4414060457677684127">"Maksimalan napor (prilagodljiva brzina prijenosa)"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries">
<item msgid="6398189564246596868">"Optimizirano za kvalitet zvuka"</item>
<item msgid="4327143584633311908">"Uravnotežen kvalitet zvuka i veze"</item>
<item msgid="4681409244565426925">"Optimizirano za kvalitet veze"</item>
- <item msgid="364670732877872677">"Maksimalan napor (Prilagodljiva brzina prijenosa)"</item>
+ <item msgid="364670732877872677">"Maksimalan napor (prilagodljiva brzina prijenosa)"</item>
</string-array>
<string-array name="bluetooth_audio_active_device_summaries">
<item msgid="4862957058729193940"></item>
@@ -169,7 +169,7 @@
<string-array name="select_logpersist_titles">
<item msgid="1744840221860799971">"Isključeno"</item>
<item msgid="3054662377365844197">"Sve"</item>
- <item msgid="688870735111627832">"Svi osim radija"</item>
+ <item msgid="688870735111627832">"Sve osim radija"</item>
<item msgid="2850427388488887328">"samo kernel"</item>
</string-array>
<string-array name="select_logpersist_summaries">
@@ -208,13 +208,13 @@
<string-array name="overlay_display_devices_entries">
<item msgid="1606809880904982133">"Nema"</item>
<item msgid="9033194758688161545">"480p"</item>
- <item msgid="1025306206556583600">"480p (osiguran)"</item>
+ <item msgid="1025306206556583600">"480p (sigurno)"</item>
<item msgid="1853913333042744661">"720p"</item>
- <item msgid="3414540279805870511">"720p (osiguran)"</item>
+ <item msgid="3414540279805870511">"720p (sigurno)"</item>
<item msgid="9039818062847141551">"1080p"</item>
- <item msgid="4939496949750174834">"1080p (osiguran)"</item>
+ <item msgid="4939496949750174834">"1080p (sigurno)"</item>
<item msgid="1833612718524903568">"4K"</item>
- <item msgid="238303513127879234">"4K (osiguran)"</item>
+ <item msgid="238303513127879234">"4K (sigurno)"</item>
<item msgid="3547211260846843098">"4K (povećava rezoluciju)"</item>
<item msgid="5411365648951414254">"4K (povećava rezoluciju, osiguran)"</item>
<item msgid="1311305077526792901">"720p, 1080p (dupli ekran)"</item>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index a35f4f2e27cb..e049f6f99d18 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -43,7 +43,7 @@
<string name="wifi_status_no_internet" msgid="5784710974669608361">"Nema internetske veze"</string>
<string name="wifi_status_sign_in_required" msgid="123517180404752756">"Potrebna je prijava"</string>
<string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Pristupna tačka je privremeno puna"</string>
- <string name="connected_via_carrier" msgid="7583780074526041912">"Povezana koristeći %1$s"</string>
+ <string name="connected_via_carrier" msgid="7583780074526041912">"Povezano koristeći %1$s"</string>
<string name="available_via_carrier" msgid="1469036129740799053">"Dostupna koristeći %1$s"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"Veoma sporo"</string>
<string name="speed_label_slow" msgid="813109590815810235">"Sporo"</string>
@@ -84,11 +84,11 @@
<string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Povezano na slušni aparat"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezano sa zvukom medija"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezano na zvuk telefona"</string>
- <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezan na server za prijenos podataka"</string>
+ <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezano sa serverom za prijenos podataka"</string>
<string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"Povezano na mapu"</string>
<string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"Povezan na SAP"</string>
- <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"Nije povezan na server za prijenos podataka"</string>
- <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"Spojen na ulazni uređaj"</string>
+ <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"Nije povezano sa serverom za prijenos podataka"</string>
+ <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"Povezano s ulaznim uređajem"</string>
<string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"Povezano na uređaj za pristup internetu"</string>
<string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"Dijeljenje lokalne internetske veze s uređajem"</string>
<string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"Koristi za pristup internetu"</string>
@@ -102,10 +102,10 @@
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Upari"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"UPARI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Otkaži"</string>
- <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Uparivanje odobrava pristup kontaktima i istoriji poziva kada je uspostavljeno."</string>
- <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Nije se moguće upariti s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
- <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Nije se moguće upariti s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g> zbog pogrešnog PIN-a ili pristupnog koda."</string>
- <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"Ne može komunicirati sa uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Uparivanje odobrava pristup kontaktima i historiji poziva kada je uspostavljeno."</string>
+ <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Nije moguće upariti s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Nije moguće upariti s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g> zbog pogrešnog PIN-a ili pristupnog koda."</string>
+ <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"Nije moguće komunicirati s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
<string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"Uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> je odbio uparivanje."</string>
<string name="bluetooth_talkback_computer" msgid="4875089335641234463">"Računar"</string>
<string name="bluetooth_talkback_headset" msgid="5140152177885220949">"Slušalice s mikrofonom"</string>
@@ -118,12 +118,12 @@
<string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Uparivanje desnog slušnog aparata…"</string>
<string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Lijevi - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
<string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Desni - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
- <string name="accessibility_wifi_off" msgid="1166761729660614716">"WiFi isključen."</string>
+ <string name="accessibility_wifi_off" msgid="1166761729660614716">"WiFi je isključen."</string>
<string name="accessibility_no_wifi" msgid="8834610636137374508">"WiFi nije povezan."</string>
- <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WiFi jedna crtica."</string>
- <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"WiFi dvije crtice."</string>
- <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"WiFi tri crtice."</string>
- <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"WiFi puni signal."</string>
+ <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WiFi signal ima jednu crtu."</string>
+ <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"WiFi signal ima dvije crte."</string>
+ <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"WiFi signal ima tri crte."</string>
+ <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"WiFi signal je pun."</string>
<string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Otvorena mreža"</string>
<string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Sigurna mreža"</string>
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
@@ -132,7 +132,7 @@
<string name="tether_settings_title_usb" msgid="6688416425801386511">"Povezivanje mobitela USB-om"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Prijenosna pristupna tačka"</string>
<string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Dijeljenje Bluetooth veze"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Dijeljenje veze"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Povezivanje putem mobitela"</string>
<string name="tether_settings_title_all" msgid="8356136101061143841">"Povezivanje putem mobitela i prijenosna pristupna tačka"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Sve radne aplikacije"</string>
<string name="user_guest" msgid="8475274842845401871">"Gost"</string>
@@ -145,7 +145,7 @@
<string name="tts_default_rate_title" msgid="6030550998379310088">"Brzina govora"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"Brzina kojom se izgovara tekst"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"Visina"</string>
- <string name="tts_default_pitch_summary" msgid="1944885882882650009">"Utječe na ton sintetiziranog govora"</string>
+ <string name="tts_default_pitch_summary" msgid="1944885882882650009">"Utiče na ton sintetiziranog govora"</string>
<string name="tts_default_lang_title" msgid="8018087612299820556">"Jezik"</string>
<string name="tts_lang_use_system" msgid="2679252467416513208">"Korištenje sistemskog jezika"</string>
<string name="tts_lang_not_selected" msgid="7395787019276734765">"Jezik nije izabran"</string>
@@ -187,7 +187,7 @@
<string name="development_settings_summary" msgid="1815795401632854041">"Postavi opcije za razvoj aplikacija"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"Opcije za programere nisu dostupne za ovog korisnika"</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"VPN postavke nisu dostupne za ovog korisnika"</string>
- <string name="tethering_settings_not_available" msgid="6765770438438291012">"Postavke za privezivanje nisu dostupne za ovog korisnika"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"Postavke za povezivanje putem mobitela nisu dostupne za ovog korisnika"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"Postavke za ime pristupne tačke nisu dostupne za ovog korisnika"</string>
<string name="enable_adb" msgid="7982306934419797485">"Otklanjanje grešaka putem uređaja spojenog na USB"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"Način rada za uklanjanje grešaka kada je povezan USB"</string>
@@ -201,7 +201,7 @@
<string name="oem_unlock_enable" msgid="6040763321967327691">"OEM otključavanje"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Dozvoli otključavanje bootloadera"</string>
<string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Želite li dozvoliti OEM otključavanje?"</string>
- <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"UPOZORENJE: Funkcije zaštite ovog uređaja neće funkcionisati dok je ova postavka uključena."</string>
+ <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"UPOZORENJE: Funkcije zaštite ovog uređaja neće funkcionirati dok je ova postavka uključena."</string>
<string name="mock_location_app" msgid="7966220972812881854">"Odaberite aplikaciju za lažne lokacije"</string>
<string name="mock_location_app_not_set" msgid="809543285495344223">"Aplikacija za lažnu lokaciju nije postavljena"</string>
<string name="mock_location_app_set" msgid="8966420655295102685">"Aplikacija za lažne lokacije: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -210,7 +210,7 @@
<string name="wifi_verbose_logging" msgid="4203729756047242344">"Omogući detaljniju evidenciju za WiFi"</string>
<string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"Nasumični odabir MAC adrese pri povezivanju"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilna mreža za prijenos podataka je uvijek aktivna"</string>
- <string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardversko ubrzavanje dijeljenja veze"</string>
+ <string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardversko ubrzavanje za povezivanje putem mobitela"</string>
<string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Prikaži Bluetooth uređaje bez naziva"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogući apsolutnu jačinu zvuka"</string>
<string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP verzija"</string>
@@ -220,7 +220,7 @@
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Brzina uzorkovanja za Bluetooth audio"</string>
<string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="8010380028880963535">"Aktivirajte Bluetooth Audio Codec\nOdabir: Brzina uzorkovanja"</string>
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth audio bitovi po uzorku"</string>
- <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="8063859754619484760">"Aktivirajte Bluetooth Audio Codec\nOdabir: Bitovi po semplu"</string>
+ <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="8063859754619484760">"Aktivirajte Bluetooth Audio Codec\nOdabir: Bitovi po uzorku"</string>
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Način Bluetooth audio kanala"</string>
<string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="7234956835280563341">"Aktivirajte Bluetooth Audio Codec\nOdabir: Način rada po kanalima"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC kodek: Kvalitet reprodukcije"</string>
@@ -249,7 +249,7 @@
<string name="allow_mock_location" msgid="2787962564578664888">"Dozvoli lažne lokacije"</string>
<string name="allow_mock_location_summary" msgid="317615105156345626">"Dozvoli lažne lokacije"</string>
<string name="debug_view_attributes" msgid="6485448367803310384">"Omogući pregled atributa prikaza"</string>
- <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Uvijek drži prijenos podataka na mobilnoj mreži aktivnim, čak i kada je WiFi je aktivan (za brzo prebacivanje između mreža)."</string>
+ <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Uvijek drži prijenos podataka na mobilnoj mreži aktivnim, čak i kada je WiFi aktivan (za brzo prebacivanje između mreža)."</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Koristi hardversko ubrzavanje dijeljenja veze, ako je dostupno"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"Omogućiti otklanjanje grešaka putem uređaja spojenog na USB?"</string>
<string name="adb_warning_message" msgid="7316799925425402244">"Otklanjanje grešaka putem uređaja spojenog na USB je namijenjeno samo u svrhe razvoja aplikacija. Koristite ga za kopiranje podataka između računara i uređaja, instaliranje aplikacija na uređaj bez obavještenja te čitanje podataka iz zapisnika."</string>
@@ -277,7 +277,7 @@
<string name="debug_hw_drawing_category" msgid="6220174216912308658">"Prikaz s hardverskom akceleracijom"</string>
<string name="media_category" msgid="4388305075496848353">"Mediji"</string>
<string name="debug_monitoring_category" msgid="7640508148375798343">"Praćenje"</string>
- <string name="strict_mode" msgid="1938795874357830695">"Omogućen strogi režim"</string>
+ <string name="strict_mode" msgid="1938795874357830695">"Omogućen strogi način rada"</string>
<string name="strict_mode_summary" msgid="142834318897332338">"Prikaži ekran uz treptanje kada aplikacije vrše duge operacije u glavnoj niti"</string>
<string name="pointer_location" msgid="6084434787496938001">"Lokacija pokazivača"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"Trenutni podaci o dodirivanju prikazuju se u nadsloju preko ekrana"</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Prikaži vizuelne povratne informacije za dodirivanja"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Prikaži ažuriranja za površinu"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Prikaži cijele površine prozora uz treptanje prilikom ažuriranja"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Pok. ažur. za GPU prikaz"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Prikazi uz treptanje unutar prozora kada se crta koristeći GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Prikaži ažuriranja prikaza"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Zatreperi prikaze u prozorima prilikom iscrtavanja"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Prikaži dodatne informacije za ažuriranja za hardver"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardverski slojevi trepću zelenom bojom pri ažuriranju"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Otkl. greške GPU preklap."</string>
@@ -298,14 +298,12 @@
<string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Onemogući autom. usmjerav. na USB audio periferije"</string>
<string name="debug_layout" msgid="5981361776594526155">"Prikaži granice rasporeda"</string>
<string name="debug_layout_summary" msgid="2001775315258637682">"Prikaži granice isječka, margine itd."</string>
- <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Prisilno postavi raspored s desna u lijevo"</string>
- <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Prisilno postavi raspored ekrana s desna u lijevo za sve regije"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Prisili GPU iscrtavanje"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Prisilno koristi GPU za 2d crtanje"</string>
+ <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Prisilno postavi raspored s desna ulijevo"</string>
+ <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Prisilno postavi raspored ekrana s desna ulijevo za sve regije"</string>
<string name="force_msaa" msgid="7920323238677284387">"Prinudno primijeni 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Omogući 4x MSAA u OpenGL ES 2.0 aplikacijama"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Ispravi greške na nepravougaonim operacijama isjecanja"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profil GPU iscrtavanja"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profil HWUI iscrtavanja"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Omogući slojeve za otklanjanje grešaka na GPU-u"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Omogući učitavanje slojeva za otklanjanje grešaka na GPU-u za aplikacije za otklanjanje grešaka"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Skala animacije prozora"</string>
@@ -323,19 +321,19 @@
<string name="force_allow_on_external" msgid="3215759785081916381">"Nametni aplikacije na vanjskoj pohrani"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava upisivanje svih aplikacija u vanjsku pohranu, bez obzira na prikazane vrijednosti"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Nametni aktivnostima mijenjanje veličina"</string>
- <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Omogući mijenjanje veličine svih aktivnosti za prikaz sa više prozora, bez obzira na prikazane vrijednosti."</string>
+ <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Omogući mijenjanje veličine svih aktivnosti za prikaz s više prozora, bez obzira na prikazane vrijednosti."</string>
<string name="enable_freeform_support" msgid="1461893351278940416">"Omogući prozore nepravilnih oblika"</string>
<string name="enable_freeform_support_summary" msgid="8247310463288834487">"Omogući podršku za eksperimentalne prozore nepravilnih oblika."</string>
<string name="local_backup_password_title" msgid="3860471654439418822">"Lozinka za sigurnosnu kopiju radne površine"</string>
<string name="local_backup_password_summary_none" msgid="6951095485537767956">"Potpune sigurnosne kopije za računare trenutno nisu zaštićene"</string>
- <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Dodirnite da promijenite ili uklonite lozinku za potpune rezervne kopije sa radne površine"</string>
- <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova lozinka za sigurnosnu kopiju postavljena"</string>
+ <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Dodirnite da promijenite ili uklonite lozinku za potpune rezervne kopije s radne površine"</string>
+ <string name="local_backup_password_toast_success" msgid="582016086228434290">"Nova lozinka za sigurnosnu kopiju je postavljena"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nova lozinka i potvrda se ne podudaraju"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Nije uspjelo postavljanje lozinke za sigurnosnu kopiju"</string>
<string-array name="color_mode_names">
- <item msgid="2425514299220523812">"Živopisan (zadano)"</item>
+ <item msgid="2425514299220523812">"Živopisno (zadano)"</item>
<item msgid="8446070607501413455">"Prirodan"</item>
- <item msgid="6553408765810699025">"Standardni"</item>
+ <item msgid="6553408765810699025">"Standardno"</item>
</string-array>
<string-array name="color_mode_descriptions">
<item msgid="4979629397075120893">"Unaprijeđene boje"</item>
@@ -355,9 +353,9 @@
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Pretvaranje…"</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Fajl je već šifriran"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Pretvaranje u šifrirane fajlove"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Pretvorite particiju sa podacima u particiju šifriranu sistemom fajlova.\n !! Upozorenje!! Ovo će izbrisati sve vaše podatke.\n Ova funkcija je u alfa fazi razvoja i možda neće ispravno raditi.\n Pritisnite \"Obriši i pretvori…\" da nastavite."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Pretvorite particiju s podacima u particiju šifriranu sistemom fajlova.\n !! Upozorenje!! Ovo će izbrisati sve vaše podatke.\n Ova funkcija je u alfa fazi razvoja i možda neće ispravno raditi.\n Pritisnite \"Obriši i pretvori…\" da nastavite."</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"Obriši i pretvori…"</string>
- <string name="picture_color_mode" msgid="4560755008730283695">"Režim boja Slika"</string>
+ <string name="picture_color_mode" msgid="4560755008730283695">"Način rada boja slika"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Koristi sRGB"</string>
<string name="daltonizer_mode_disabled" msgid="7482661936053801862">"Onemogućeno"</string>
<string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"Crno-bijelo"</string>
@@ -424,8 +422,8 @@
<string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string>
<string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktivne metode unosa"</string>
<string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Koristi jezik sistema"</string>
- <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"Nije uspjelo otvaranje postavki za <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
- <string name="ime_security_warning" msgid="4135828934735934248">"Ovaj način unosa može prikupiti sav tekst koji otkucate, uključujući lične podatke kao što su lozinke i brojevi kreditnih kartica. Način omogućava aplikacija <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Da li želite koristiti ovaj način unosa?"</string>
+ <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"Otvaranje postavki za <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> nije uspjelo"</string>
+ <string name="ime_security_warning" msgid="4135828934735934248">"Ovaj način unosa može prikupiti sav tekst koji upišete, uključujući lične podatke kao što su lozinke i brojevi kreditnih kartica. Način omogućava aplikacija <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Da li želite koristiti ovaj način unosa?"</string>
<string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"Napomena: Nakon ponovnog pokretanja, ova aplikacija se neće moći pokrenuti dok ne otključate telefon"</string>
<string name="ims_reg_title" msgid="7609782759207241443">"Stanje IMS registracije"</string>
<string name="ims_reg_status_registered" msgid="933003316932739188">"Registrirano"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 511ac70e4483..50d9c17bec23 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Mostra la ubicació visual dels tocs"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Canvis de superfície"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Actualitza superfícies de finestres en actualitzar-se"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Mostra actualitzacions GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Actualitza visualitzacions de finestres creades amb GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Mostra actualitzacions"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Actualitza visualitzacions de finestres creades"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mostra actualitzacions de capes de maquinari"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Il·lumina capes de maquinari en verd en actualitzar-se"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depura sobredibuix de GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Mostra els límits de clips, els marges, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Força direcció dreta-esquerra"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Força direcció de pantalla dreta-esquerra en totes les llengües"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Força renderització GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Força l\'ús de GPU per a dibuixos en 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Força MSAA 4x"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Activa MSAA 4x en aplicacions d\'OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Depura operacions de retall no rectangulars"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Perfil de renderització de GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Renderització perfil HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Activa les capes de depuració de GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Permet carregar capes de depuració de GPU per a apps de depuració"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Escala d\'animació finestra"</string>
@@ -400,8 +398,8 @@
<string name="enabled_by_admin" msgid="5302986023578399263">"Activada per l\'administrador"</string>
<string name="disabled_by_admin" msgid="8505398946020816620">"Desactivada per l\'administrador"</string>
<string name="disabled" msgid="9206776641295849915">"Desactivat"</string>
- <string name="external_source_trusted" msgid="2707996266575928037">"Permeses"</string>
- <string name="external_source_untrusted" msgid="2677442511837596726">"No permeses"</string>
+ <string name="external_source_trusted" msgid="2707996266575928037">"Amb permís"</string>
+ <string name="external_source_untrusted" msgid="2677442511837596726">"Sense permís"</string>
<string name="install_other_apps" msgid="6986686991775883017">"Instal·lar aplicacions desconegudes"</string>
<string name="home" msgid="3256884684164448244">"Pàgina d\'inici de configuració"</string>
<string-array name="battery_labels">
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index cf011d5ab648..1579d8f9a77a 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Zobrazování vizuální zpětné vazby pro klepnutí"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Zobrazit obnovení obsahu"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Rozblikat obsah okna při aktualizaci"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Zobrazit obnovení s GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Rozblikat zobrazení v oknech při vykreslování pomocí GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Zobrazit aktualizace"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Rozblikat zobrazení v oknech při vykreslování"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Zobrazit aktual. HW vrstev"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Rozblikat zeleně hardwarové vrstvy při aktualizaci"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ladit překreslování GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Zobrazit u výstřižku ohraničení, okraje atd."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Vynutit rozvržení zprava doleva"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Vynutit ve všech jazycích rozvržení obrazovky zprava doleva"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Vykreslování pomocí GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Vynutit použití GPU pro 2D vykreslování"</string>
<string name="force_msaa" msgid="7920323238677284387">"Vynutit 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Povolit 4x MSAA v aplikacích OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Ladit operace s neobdélníkovými výstřižky"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profil – vykreslování GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profil – vykres. HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Povolit vrstvy ladění GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Povolit načítání vrstev ladění GPU pro ladicí aplikace"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Měřítko animace okna"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 0f670b413f32..fbedd900c1b9 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Vis visuel feedback ved tryk"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Vis overfladeopdateringer"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Fremhæv hele vinduesoverflader, når de opdateres"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Vis opdat. af GPU-eksp."</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Fremhæv visninger i vinduer, når de tegnes med GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Se visningsopdateringer"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Fremhæv visninger i vinduer, når de tegnes"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Se opdat. af hardwarelag"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwarelag blinker grønt, når de opdateres"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ret GPU-overlapsfejl"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Vis grænser for klip, margener osv."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Tving læsning mod venstre"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Tving til højre mod venstre-layout for alle sprog"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Tving gengivelse af GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Gennemtving brug af GPU til 2D-tegning"</string>
<string name="force_msaa" msgid="7920323238677284387">"Tving 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Aktivér 4x MSAA i apps med OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Fejlfind på ikke-rektangulære klippehandlinger"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU-profilgengivelse"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI-profilgengivelse"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Aktivér fejlretningslag for grafikprocessor"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Tillad, at fejlretningslag indlæses for grafikprocessor i apps til fejlretning"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Animationsskala for vindue"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 7fc5e4c4bd86..6fb0fc9941be 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Visuelles Feedback für Fingertipps anzeigen"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Oberflächenaktualisierungen"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Flash für gesamte Fensteroberfläche bei Aktualisierung"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Updates mit GPU-Ansicht"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flash-Ansicht im Fenster, wenn mit GPU dargestellt"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Updates anzeigen"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Flash-Ansicht im Fenster, wenn dargestellt"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardwareebenen-Updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwareebenen blinken beim Aktualisieren grün"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debugging – GPU-Überschneidung"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Clip-Begrenzungen, Ränder usw. anzeigen"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL-Layout erzwingen"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"RTL-Bildschirmlayout für alle Sprachen erzwingen"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU-Rendering erzwingen"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Einsatz von GPU für 2D-Zeichnung erzwingen"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA erzwingen"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"4x MSAA in OpenGL ES 2.0-Apps aktivieren"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Nicht rechteckige Clip-Operationen debuggen"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU-Rendering für Profil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI-Rendering für Profil"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU-Debugging-Ebene aktivieren"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Laden von GPU-Debugging-Ebene für Debugging-Apps erlauben"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Maßstab Fensteranimation"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 6b3841d06132..336075faaaf1 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Εμφάνιση οπτικών σχολίων για πατήματα"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Εμφάνιση ενημερώσεων επιφάνειας"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Προβολή Flash ολόκλ. των επιφ παραθ. όταν ενημερ."</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Εμφάνιση των ενημερώσεων προβολής GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Προβολές Flash εντός παραθύρων όταν γίνεται σχεδιασμός με το GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Εμφάνιση ενημερ. προβολής"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Προβολές Flash εντός παραθύρων με σχεδιασμό"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Εμφ. ενημ. επιπ. υλικού"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Επισήμ. επιπέδων υλικού με πράσινο κατά την ενημ."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Κατάρ.σφαλμ.υπέρβ.GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Εμφάνιση ορίων κλιπ, περιθωρίων, κλπ."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Επιβολή κατ. διάταξης RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Επιβολή διάταξης οθόν. RTL για όλες τις τοπ. ρυθμ."</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Αναγκαστική απόδοση GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Αναγκαστική χρήση του GPU για σχέδιο 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Αναγκαστικά 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Ενεργοποίηση 4x MSAA σε εφαρμογές OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Εντοπισμός σφαλμάτων σε λειτουργίες μη ορθογώνιας περιοχής"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Απόδοση GPU προφίλ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Απόδοση HWUI προφίλ"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Ενεργ. επιπ. εντ. σφ. GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Φόρτωση επιπ. εντοπ. σφ. GPU για εφαρμ. αντιμ. σφ."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Κλίμακα κίνησης παραθύρου"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 9bb5347283bd..e028e73932a1 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Show visual feedback for taps"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Show surface updates"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Flash entire window surfaces when they update"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Show GPU view updates"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flash views inside windows when drawn with the GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Show view updates"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Flash views inside windows when drawn"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Show clip bounds, margins, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Force RTL layout direction"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Force screen layout direction to RTL for all locales"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Force GPU rendering"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Force use of GPU for 2D drawing"</string>
<string name="force_msaa" msgid="7920323238677284387">"Force 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Enable 4x MSAA in OpenGL ES 2.0 apps"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Debug non-rectangular clip operations"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profile GPU rendering"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profile HWUI rendering"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Enable GPU debug layers"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Allow loading GPU debug layers for debug apps"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Window animation scale"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 9bb5347283bd..e028e73932a1 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Show visual feedback for taps"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Show surface updates"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Flash entire window surfaces when they update"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Show GPU view updates"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flash views inside windows when drawn with the GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Show view updates"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Flash views inside windows when drawn"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Show clip bounds, margins, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Force RTL layout direction"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Force screen layout direction to RTL for all locales"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Force GPU rendering"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Force use of GPU for 2D drawing"</string>
<string name="force_msaa" msgid="7920323238677284387">"Force 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Enable 4x MSAA in OpenGL ES 2.0 apps"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Debug non-rectangular clip operations"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profile GPU rendering"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profile HWUI rendering"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Enable GPU debug layers"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Allow loading GPU debug layers for debug apps"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Window animation scale"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 9bb5347283bd..e028e73932a1 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Show visual feedback for taps"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Show surface updates"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Flash entire window surfaces when they update"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Show GPU view updates"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flash views inside windows when drawn with the GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Show view updates"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Flash views inside windows when drawn"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Show clip bounds, margins, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Force RTL layout direction"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Force screen layout direction to RTL for all locales"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Force GPU rendering"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Force use of GPU for 2D drawing"</string>
<string name="force_msaa" msgid="7920323238677284387">"Force 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Enable 4x MSAA in OpenGL ES 2.0 apps"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Debug non-rectangular clip operations"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profile GPU rendering"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profile HWUI rendering"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Enable GPU debug layers"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Allow loading GPU debug layers for debug apps"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Window animation scale"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 9bb5347283bd..e028e73932a1 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Show visual feedback for taps"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Show surface updates"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Flash entire window surfaces when they update"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Show GPU view updates"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flash views inside windows when drawn with the GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Show view updates"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Flash views inside windows when drawn"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Show clip bounds, margins, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Force RTL layout direction"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Force screen layout direction to RTL for all locales"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Force GPU rendering"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Force use of GPU for 2D drawing"</string>
<string name="force_msaa" msgid="7920323238677284387">"Force 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Enable 4x MSAA in OpenGL ES 2.0 apps"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Debug non-rectangular clip operations"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profile GPU rendering"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profile HWUI rendering"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Enable GPU debug layers"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Allow loading GPU debug layers for debug apps"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Window animation scale"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index a42b8fae68b1..5e046e03242f 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎Show visual feedback for taps‎‏‎‎‏‎"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎Show surface updates‎‏‎‎‏‎"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎‎‏‎Flash entire window surfaces when they update‎‏‎‎‏‎"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎Show GPU view updates‎‏‎‎‏‎"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎Flash views inside windows when drawn with the GPU‎‏‎‎‏‎"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎Show view updates‎‏‎‎‏‎"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎Flash views inside windows when drawn‎‏‎‎‏‎"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‏‏‎‏‎Show hardware layers updates‎‏‎‎‏‎"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎Flash hardware layers green when they update‎‏‎‎‏‎"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎Debug GPU overdraw‎‏‎‎‏‎"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎Show clip bounds, margins, etc.‎‏‎‎‏‎"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎Force RTL layout direction‎‏‎‎‏‎"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎Force screen layout direction to RTL for all locales‎‏‎‎‏‎"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎Force GPU rendering‎‏‎‎‏‎"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎Force use of GPU for 2d drawing‎‏‎‎‏‎"</string>
<string name="force_msaa" msgid="7920323238677284387">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‎‎‎‏‏‎Force 4x MSAA‎‏‎‎‏‎"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‎Enable 4x MSAA in OpenGL ES 2.0 apps‎‏‎‎‏‎"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‎‎‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎Debug non-rectangular clip operations‎‏‎‎‏‎"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎Profile GPU rendering‎‏‎‎‏‎"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‎Profile HWUI rendering‎‏‎‎‏‎"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎Enable GPU debug layers‎‏‎‎‏‎"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‎Allow loading GPU debug layers for debug apps‎‏‎‎‏‎"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‎Window animation scale‎‏‎‎‏‎"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 6a4e3800cf01..6c4f3b0172ab 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Mostrar información visual para presiones"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Ver actualiz. de superficie"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Destello en superficie por actualización"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Ver actualizaciones de GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Mostrar vistas de ventanas procesadas con GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Mostrar actualizaciones"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Mostrar vistas de ventanas procesadas"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ver actualiz. de capas de hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Luz verde en capas de hardware al actualizarse"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar superpos. de GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Mostrar límites de recortes, márgenes, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forzar diseño der. a izq."</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Forzar diseño de pantalla de derecha a izquierda para todos los idiomas"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forzar representación GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forzar uso de GPU para dibujar en 2d"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forzar MSAA 4x"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Activar MSAA 4x en aplicaciones OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Depurar operaciones de recorte no rectangulares"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Represent. GPU del perfil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Perfil procesamiento HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Habilitar depuración GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Permitir capas de GPU para apps de depuración"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Escala de animación de ventana"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 2496717e8c0a..f04767b72b78 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -217,8 +217,8 @@
<string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecciona la versión AVRCP del Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Códec de audio de Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="8436224899475822557">"Activar el códec de audio por Bluetooth\nSelección"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Porcentaje de muestreo de audio por Bluetooth"</string>
- <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="8010380028880963535">"Activar el códec de audio por Bluetooth\nSelección: porcentaje de muestreo"</string>
+ <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Frecuencia de muestreo de audio por Bluetooth"</string>
+ <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="8010380028880963535">"Activar el códec de audio por Bluetooth\nSelección: frecuencia de muestreo"</string>
<string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bits por muestra del audio Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="8063859754619484760">"Activar el códec de audio por Bluetooth\nSelección: bits por muestra"</string>
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Modo de canal de audio por Bluetooth"</string>
@@ -238,7 +238,7 @@
<string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Ordenar las direcciones MAC de forma aleatoria al conectarse a redes Wi‑Fi"</string>
<string name="wifi_metered_label" msgid="4514924227256839725">"Medida"</string>
<string name="wifi_unmetered_label" msgid="6124098729457992931">"No medida"</string>
- <string name="select_logd_size_title" msgid="7433137108348553508">"Tamaños de búfer de registrador"</string>
+ <string name="select_logd_size_title" msgid="7433137108348553508">"Tamaños del búfer para registrar"</string>
<string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Elige el tamaño del Logger por búfer"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"¿Borrar almacenamiento continuo del registrador?"</string>
<string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"Cuando ya no supervisamos la actividad con el registrador de forma continua, estamos obligados a borrar los datos del registrador almacenados en el dispositivo."</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Mostrar la ubicación de los toques en la pantalla"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Cambios de superficie"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Actualizar superficies de ventana al actualizarse"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Ver actualizaciones de GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Actualizar vistas de las ventanas creadas con GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Ver cambios de vista"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Actualizar vistas de las ventanas creadas"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ver actualizaciones de capas de hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Iluminar capas de hardware en verde al actualizarse"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar sobredibujos de GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Mostrar límites de vídeo, márgenes, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forzar dirección de diseño RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Forzar dirección RTL para todos los idiomas"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forzar renderización por GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forzar uso de la GPU para dibujar en 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forzar MSAA 4x"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Habilitar MSAA 4x en aplicaciones de OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Depurar operaciones de recorte no rectangulares"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Trazar la renderización de la GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Trazar la renderización de HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Activar capas depuración GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Permitir cargar capas de depuración de GPU en apps"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Escala de animación de ventana"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 94d7fdcbabaa..1f50226d9a47 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Kuvab puudutuste visuaalse tagasiside"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Näita pinna värskendusi"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Akna pinna värskendamiseks kirjuta kogu akna pind üle"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Kuva GPU kuva värskendusi"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU-ga joonistades kirjuta akende kuvad üle"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Kuva ekraanikuva värsk."</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Joonistades kirjuta akende kuvad üle"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Kuva riistvarakihtide värskendusi"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Riistvara kihid vilguvad värskendamisel roheliselt"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Silu GPU ülejoonistust"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Kuva klipi piirid, veerised jms"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Jõusta paremalt vasakule paigutus"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Jõusta kõikides lokaatides paremalt vasakule ekraanipaigutus"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Jõusta GPU renderdamine"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Jõusta GPU kasutamine 2D-graafika puhul"</string>
<string name="force_msaa" msgid="7920323238677284387">"Jõusta 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Luba 4x MSAA OpenGL ES 2.0 rakendustes"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Silu mittetäisnurksed kärpimistoimingud"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU renderduse profiil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profiili HWUI renderdam."</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU silumise kihtide lubamine"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"GPU silumise kihtide laadimise lubamine silumisrakendustele"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Akna animatsioonimastaap"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 4c4f99fac6a3..ec7bf9884327 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Erakutsi sakatutako elementuak"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Erakutsi azaleko aldaketak"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Distiratu leiho osoen azalak eguneratzen direnean"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ikuspegi-eguneratzeak"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Ikuspegi-distira leiho barrutik GPUz marraztean"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Erakutsi ikuspegi-aldaketak"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Nabarmendu leiho barruko ikuspegiak marraztean"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardware-geruzen eguneratzeak"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Eguneratu bitartean, hardware-geruzak berdez"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Araztu GPU gainidazketa"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Erakutsi kliparen mugak, marjinak, etab."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Behartu eskuin-ezker norabidea"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Behartu pantaila-diseinuaren norabidea eskuin-ezker izatera eskualdeko ezarpen guztiekin."</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Behartu GPU errendatzea"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Behartu GPUa erabiltzera 2 dimentsioko marrazkietan"</string>
<string name="force_msaa" msgid="7920323238677284387">"Behartu 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Gaitu 4x MSAA, OpenGL ES 2.0 aplikazioetan"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Araztu angeluzuzenak ez diren klip-eragiketak"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU errendatze-profila"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profilaren HWUI errendatzea"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Gaitu GPUaren arazte-geruzak"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Onartu GPUaren arazte-geruzak kargatzea arazte-aplikazioetarako"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Leihoen animazio-eskala"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index c58b52efbdf7..447ce3cf6172 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -159,7 +159,7 @@
<string name="tts_default_sample_string" msgid="4040835213373086322">"این نمونه‌ای از ترکیب گفتار است"</string>
<string name="tts_status_title" msgid="7268566550242584413">"وضعیت زبان پیش‌فرض"</string>
<string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> کاملاً پشتیبانی می‌شود"</string>
- <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> به اتصال شبکه نیاز دارد"</string>
+ <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> باید اتصال شبکه داشته باشد"</string>
<string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> پشتیبانی نمی‌شود"</string>
<string name="tts_status_checking" msgid="5339150797940483592">"در حال بررسی…"</string>
<string name="tts_engine_settings_title" msgid="3499112142425680334">"تنظیمات برای <xliff:g id="TTS_ENGINE_NAME">%s</xliff:g>"</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"نمایش بازخورد تصویری برای ضربه‌ها"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"نمایش به‌روزرسانی سطح"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"هنگام به‌روزرسانی سطوح پنجره همه فلش شوند"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"‏نمایش به روزرسانی‌های نمای GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"‏در طراحی با GPU، نماها در داخل پنجره‌ها فلش شوند"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"نمایش به‌روزرسانی‌های نما"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"هنگام طراحی، نماها در داخل پنجره‌ها فلش شوند"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"نمایش به‌روزرسانی‌های لایه‌های سخت‌افزار"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"وقتی لایه‌های سخت‌افزاری به‌روزرسانی‌ می‌شوند، به رنگ سبز درآیند"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"‏اشکال‌زدایی بازنویسی GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"نمایش مرزها، حاشیه‌ها و ویژگی‌های دیگر کلیپ."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"‏اجباری کردن چیدمان RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"‏اجباری کردن چیدمان RTL صفحه برای همه زبان‌ها"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"‏پردازش اجباری GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"‏استفاده اجباری از GPU برای طراحی دوم"</string>
<string name="force_msaa" msgid="7920323238677284387">"‏اجبار 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"‏فعال کردن 4X MSAA در برنامه‌های OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"اشکال‌زدایی عملکردهای کلیپ غیرمربعی"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"‏پردازش GPU نمایه"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"‏پرداز زدن HWUI نمایه"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"‏فعال کردن لایه‌های اشکال‌زدایی GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"‏مجاز کردن بارگیری لایه‌های اشکال‌زدایی GPU برای برنامه‌های اشکا‌ل‌زدایی"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"مقیاس پویانمایی پنجره"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 25a8f56ee20a..377f8ce700b3 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Anna visuaalista palautetta kosketuksesta."</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Näytä pintapäivitykset"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Väläytä koko ikkunoiden pinnat päivitettäessä"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Näytä GPU:n näytön päivitykset"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Väläytä ikkunoiden sisältö GPU:lla piirrettäessä."</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Näytä näyttöpäivitykset"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Näytä ikkunoiden sisältö piirtämisen yhteydessä"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Näytä laitteistotason päivitykset"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Näytä laitteistotasot vihreinä niiden päivittyessä."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU-objektien päällekkäisyys"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Näytä leikkeiden rajat, marginaalit jne."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Pakota RTL-ulkoasun suunta"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Pakota kaikkien kielten näytön ulkoasun suunnaksi RTL."</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Pakota GPU-hahmonnus"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Käytä GPU:ta 2d-piirtämiseen."</string>
<string name="force_msaa" msgid="7920323238677284387">"Pakota 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Ota käyttöön 4x MSAA OpenGL ES 2.0 -sovelluksissa."</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Korjaa ei-suorakulmaisten leiketoimintojen virheet"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profiilin GPU-hahmonnus"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI-profiilirenderöinti"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU-virheenkorjaus päälle"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Salli GPU:n virheenkorjauskerrosten lataus."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Ikkuna"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 283dd2b72607..67e7779e692c 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Afficher repère visuel pour éléments sélectionnés"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Affich. mise à jour surface"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Faire clignoter les surfaces à chaque mise à jour"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Afficher mises à jour GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Faire clignoter les éléments dessinés avec le GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Afficher m. à j. affichage"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Faire clignoter éléments dessinés dans les fenêtres"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mises à jour couches mat."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Couches matérielles en vert une fois mises à jour"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Déboguer les conflits GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Afficher les limites, les marges de clip, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forcer droite à gauche"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Forcer l\'orientation droite à gauche (toutes langues)"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forcer le rendu GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forcer l\'utilisation du GPU pour le dessin 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forcer MSAA 4x"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Activer MSAA 4x dans les applications OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Déboguer opérations de découpage non rectangulaire"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Rendu GPU du profil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Rendu HWUI du profil"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Activ. couches débog. GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Autor. couches débog. GPU pour applis de débogage"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Échelle animation fenêtres"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index eb03b53080cb..5eac8fadfd02 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Afficher repère visuel pour éléments sélectionnés"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Affich. mise à jour surface"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Faire clignoter les surfaces à chaque mise à jour"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Afficher mises à jour GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Faire clignoter les éléments dessinés avec le GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Afficher les mises à jour"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Faire clignoter les éléments dessinés"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mises à jour couches matérielles"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Couches matérielles en vert une fois mises à jour"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Déboguer les conflits GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Afficher les limites de coupe, les marges, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forcer droite à gauche"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Forcer orient. droite à gauche pour toutes langues"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forcer le rendu GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forcer l\'utilisation du GPU pour le dessin 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forcer MSAA 4x"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Activer MSAA 4x dans les applications OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Déboguer opé. de découpage non rect."</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Rendu GPU du profil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Rendu HWUI du profil"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Activer couches débogage GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Autoriser charg. couches débogage GPU pour applis débogage"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Échelle animation fenêtres"</string>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index a25d13602906..f8a69c210d80 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -207,17 +207,17 @@
</string-array>
<string-array name="overlay_display_devices_entries">
<item msgid="1606809880904982133">"Ningunha"</item>
- <item msgid="9033194758688161545">"480 p"</item>
- <item msgid="1025306206556583600">"480 p (seguro)"</item>
- <item msgid="1853913333042744661">"720 p"</item>
- <item msgid="3414540279805870511">"720 p (seguro)"</item>
- <item msgid="9039818062847141551">"1080 p"</item>
- <item msgid="4939496949750174834">"1080 p (seguro)"</item>
+ <item msgid="9033194758688161545">"480p"</item>
+ <item msgid="1025306206556583600">"480p (seguro)"</item>
+ <item msgid="1853913333042744661">"720p"</item>
+ <item msgid="3414540279805870511">"720p (seguro)"</item>
+ <item msgid="9039818062847141551">"1080p"</item>
+ <item msgid="4939496949750174834">"1080p (seguro)"</item>
<item msgid="1833612718524903568">"4K"</item>
<item msgid="238303513127879234">"4K (seguro)"</item>
<item msgid="3547211260846843098">"4K (mellorado)"</item>
<item msgid="5411365648951414254">"4K (mellorado e seguro)"</item>
- <item msgid="1311305077526792901">"720 p, 1080 p (pantalla dual)"</item>
+ <item msgid="1311305077526792901">"720p, 1080p (pantalla dual)"</item>
</string-array>
<string-array name="enable_opengl_traces_entries">
<item msgid="3191973083884253830">"Ningún"</item>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 1705f3a321ef..3e55dc3f93bc 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -110,7 +110,7 @@
<string name="bluetooth_talkback_computer" msgid="4875089335641234463">"Ordenador"</string>
<string name="bluetooth_talkback_headset" msgid="5140152177885220949">"Auriculares con micrófono"</string>
<string name="bluetooth_talkback_phone" msgid="4260255181240622896">"Teléfono"</string>
- <string name="bluetooth_talkback_imaging" msgid="551146170554589119">"Imaxes"</string>
+ <string name="bluetooth_talkback_imaging" msgid="551146170554589119">"Dispositivo de imaxe"</string>
<string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auriculares"</string>
<string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
<string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
@@ -213,8 +213,8 @@
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Aceleración de hardware para conexión compartida"</string>
<string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Mostrar dispositivos Bluetooth sen nomes"</string>
<string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Desactivar volume absoluto"</string>
- <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión AVRCP de Bluetooth"</string>
- <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecciona a versión AVRCP de Bluetooth"</string>
+ <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Versión de Bluetooth AVRCP"</string>
+ <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Selecciona a versión de Bluetooth AVRCP"</string>
<string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Códec de audio por Bluetooth"</string>
<string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="8436224899475822557">"Activar códec de audio por Bluetooth\nSelección"</string>
<string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Taxa de mostraxe de audio por Bluetooth"</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Mostra a información visual dos toques"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Cambios de superficie"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Iluminar superficies de ventás ao actualizarse"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Mostrar actualizac. GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Iluminar vistas das ventás creadas con GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Mostrar actualizacións"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Actualiza as vistas das ventás creadas"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ver act. capas hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Iluminar capas hardware en verde ao actualizarse"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar superposición GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Mostra os límites dos clips, as marxes, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forzar dirección do deseño RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Forza a dirección de pantalla a RTL (dereita a esquerda) para todas as configuración rexionais"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forzar procesamento GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forzar o uso de GPU para o debuxo en 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forzar MSAA 4x"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Activar MSAA 4x en aplicacións OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Depurar operacións recorte non rectangulares"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Perfil procesamento GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Perfil procesamento HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Activar depuración da GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Permite capas da GPU para apps de depuración"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Escala animación da ventá"</string>
@@ -355,8 +353,8 @@
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Converter..."</string>
<string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Xa se encriptou o ficheiro"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"Convertendo no encriptado baseado en ficheiros"</string>
- <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Converte a partición de datos nunha encriptación baseada en ficheiros.\n Advertencia: Esta acción borrará todos os datos.\n Esta función é alfa e quizais non funcione correctamente.\n Para continuar, toca Limpar e converter..."</string>
- <string name="button_convert_fbe" msgid="5152671181309826405">"Limpar e converter..."</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Converte a partición de datos nunha encriptación baseada en ficheiros.\n Advertencia: Esta acción borrará todos os datos.\n Esta función é alfa e quizais non funcione correctamente.\n Para continuar, toca Borrar e converter..."</string>
+ <string name="button_convert_fbe" msgid="5152671181309826405">"Borrar e converter..."</string>
<string name="picture_color_mode" msgid="4560755008730283695">"Modo de cor da imaxe"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"Utiliza sRGB"</string>
<string name="daltonizer_mode_disabled" msgid="7482661936053801862">"Desactivado"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 5bfe348ff7a2..bccf0e6ef227 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"ટૅપ્સ માટે દૃશ્યાત્મક પ્રતિસાદ બતાવો"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"સપાટી અપડેટ્સ બતાવો"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"જ્યારે તે અપડેટ થાય ત્યારે સમગ્ર વિંડો સપાટીને ફ્લેશ કરો"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU દૃશ્ય અપડેટ્સ બતાવો"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU સાથે દોરાઈ ત્યારે વિંડોઝની અંદરના દ્રશ્યોને પ્રકાશિત કરો"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"દૃશ્યના અપડેટ બતાવો"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"દોરવામાં આવે ત્યારે વિંડોની અંદર દૃશ્યો બતાવો"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"હાર્ડવેર સ્તરોનાં અપડેટ્સ બતાવો"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"હાર્ડવેર સ્તરો અપડેટ થાય ત્યારે તેને લીલા રંગથી પ્રકાશિત કરો"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ઓવરડ્રો ડીબગ કરો"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ક્લિપ બાઉન્ડ્સ, હાંસિયાં વગેરે બતાવો."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL લેઆઉટ દિશા નિર્દેશની ફરજ પાડો"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"તમામ લૉકેલ્સ માટે સ્ક્રીન લેઆઉટ દિશા નિર્દેશને RTL ની ફરજ પાડો"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU રેન્ડરિંગની ફરજ પાડો"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2જા રેખાંકન માટે GPU ના ઉપયોગની ફરજ પાડો"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA ને ફરજ પાડો"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 એપ્લિકેશન્સમાં 4x MSAA સક્ષમ કરો"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"બિન-લંબચોરસ ક્લિપ કામગીરી ડીબગ કરો"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"પ્રોફાઇલ GPU રેન્ડરિંગ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUIની પ્રોફાઇલ રેંડરીંગ"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU ડિબગ સ્તરોને સક્ષમ કરો"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ડિબગ ઍપ માટે GPU ડિબગ સ્તરો લોડ કરવાની મંજૂરી આપો"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"વિંડો એનિમેશન સ્કેલ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 9430345824fa..c5d662cb660d 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"टैप के लिए विज़ुअल फ़ीडबैक दिखाएं"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"सर्फ़ेस अपडेट दिखाएं"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"अपडेट होने पर पूरे विंडो सर्फ़ेस को फ़्लैश करें"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"जीपीयू व्यू अपडेट दिखाएं"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"जीपीयू रेंडर हो जाने पर विंडो में व्यू फ़्लैश करें"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"GPU व्यू के अपडेट दिखाएं"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"GPU से बनाए गए व्यू, विंडो में फ़्लैश करता है"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेयर लेयर अपडेट दिखाएं"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेयर लेयर अपडेट होने पर उनमें हरी रोशनी डालें"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"जीपीयू ओवरड्रॉ डीबग करें"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"क्लिप सीमाएं, मार्जिन आदि दिखाएं."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"लेआउट की दिशा दाएं से बाएं करें"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"सभी भाषाओं के लिए स्क्रीन लेआउट की दिशा दाएं से बाएं रखें"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"हर हाल में जीपीयू रेंडर करें"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2डी ड्रॉइंग के लिए जीपीयू का हर हाल में उपयोग करें"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA को हर हाल में चालू करें"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ऐप में 4x MSAA को चालू करें"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"उन क्लिप ऑपरेशन को डीबग करें, जो आयताकार नहीं हैं"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"प्रोफ़ाइल जीपीयू रेंडरिंग"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"प्रोफ़ाइल HWUI रेंडरिंग"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"जीपीयू डीबग लेयर चालू करें"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"डीबग ऐप के लिए जीपीयू डीबग लेयर लोड करने दें"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"विंडो एनिमेशन स्‍केल"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 14c1e0dbda3f..f269c384fbaf 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Prikaži vizualne povratne informacije za dodire"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Prikaži ažur. površine"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Površina prozora bljeska pri ažuriranju."</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Prikaži ažur. GPU prikaza"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Bljeskanje prikaza u prozorima pri crtanju GPU-om"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Pokaži ažuriranja prikaza"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Bljeskanje prikaza u prozorima pri crtanju"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Prikaži ažuriranja hardverskih slojeva"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardverski slojevi bljeskaju zeleno pri ažuriranju."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Rješavanje GPU preklapanja"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Prikazuju se obrubi, margine itd. isječaka."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Nametni zdesna ulijevo"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Nametni smjer zdesna ulijevo za sve zemlje/jezike"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Nametni GPU renderiranje"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Nametni upotrebu GPU-a za 2D crteže"</string>
<string name="force_msaa" msgid="7920323238677284387">"Nametni 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Omogući 4x MSAA u aplikacijama OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Otkloni pogreške operacija nepravokutnog isječka"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profil GPU prikazivanja"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profil HWUI generiranja"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Omogući slojeve za otklanjanje pogrešaka GPU-a"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Omogući učitavanje slojeva za otklanjanje pogrešaka GPU-a za aplikacije za otklanjanje pogrešaka"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Brzina animacije prozora"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 038d4079e794..a09a4ff7851b 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Koppintások vizuális visszajelzésének megjelenítése"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Képernyőfrissítések megj."</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"A teljes ablakfelület villogjon frissítéskor."</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU-nézetfriss. megjel."</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Ablakbeli nézetek villognak GPU-s rajznál."</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Frissítések megjelenítése"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Ablakos Flash-nézetek megjelenítéskor"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardverréteg-frissítések"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Frissítéskor a hardverrétegek zölden villognak"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU tartalom-felülírási hibakeresés"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Kliphatárok, margók stb. megjelenítése."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Elrendezés jobbról balra"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Elrendezés jobbról balra minden nyelvnél"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU-megjelenítés"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"GPU használatának kényszerítése 2D rajzhoz"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA kényszerítése"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"A 4x MSAA engedélyezése az OpenGL ES 2.0-nál"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Nem négyzetes kivágási műveletek hibakeresése"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU-renderelési profil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profil HWUI-renderelése"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU-hibakeresési rétegek engedélyezése"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"GPU-hibakeresési rétegek betöltésének engedélyezése"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Ablakanimáció tempója"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 1e3cc9c0d8cd..c808fe72c6aa 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Ցույց տալ հպումների տեսանելի արձագանքը"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Ցույց տալ մակերեսի թարմացումները"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Թող պատուհանի ամբողջական մակերեսները առկայծեն, երբ թարմացվում են"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Ցույց տալ GPU տեսքի թարմացումները"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Ցույց տալ ֆլեշ տեսքերը պատուհանի ներսում GPU-ով պատկերելու ընթացքում"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Ցուցադրել թարմացումները"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Լուսավորել պատուհանի թարմացված տարածքները"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ցույց տալ սարքաշարի ծածկույթի թարմացումները"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Թող սարքաշարի ծածկույթները կանաչ գույնով առկայծեն, երբ թարմացվեն"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Վրիպազերծել GPU գերազանցումները"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Ցույց տալ կտրվածքի սահմանները, լուսանցքները և այլն"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Փոխել RTL-ի դասավորության ուղղությունը"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Դարձնել էկրանի դասավորության ուղղությունը դեպի RTL բոլոր լեզուների համար"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Ստիպել GPU-ին մատուցել"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Ստիպողաբար GPU-ի օգտագործում 2-րդ պատկերի համար"</string>
<string name="force_msaa" msgid="7920323238677284387">"Ստիպել 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Միացնել 4x MSAA-ը OpenGL ES 2.0 հավելվածներում"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Վրիպազերծել ոչ ուղղանկյուն կտրումների գործողությունները"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU տվյալներ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Պրոֆիլի HWUI արտապատկերում"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Միացնել GPU վրիպազերծման շերտերը"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Թույլատրել GPU վրիպազերծման շերտերի բեռնումը վրիպազերծման հավելվածների համար"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Պատուհանի շարժապատկերի սանդղակ"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 17009dc511cf..e4b12e4c6832 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Tampilkan masukan visual untuk ketukan"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Lihat pembaruan permukaan"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Sorot seluruh permukaan jendela saat diperbarui"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Tampilkan update tampilan GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Tampilan cepat dlm jendela saat digambar dgn GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Tampilkan update tampilan"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Tampilan cepat dalam jendela saat digambar"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Tunjukkan update lapisan hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Lapisan hardware berkedip hijau saat memperbarui"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug overdraw oleh GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Tampilkan batas klip, margin, dll."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Paksa arah tata letak RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Paksa arah tata letak layar RTL untuk semua lokal"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Paksa rendering GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Paksa penggunaan GPU untuk gambar 2d"</string>
<string name="force_msaa" msgid="7920323238677284387">"Paksa 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Aktifkan 4x MSAA dalam aplikasi OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Debug operasi klip non-kotak"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Penguraian GPU profil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Rendering HWUI profil"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Aktifkan lapisan debug GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Izinkan memuat lapisan debug GPU untuk aplikasi debug"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Skala animasi jendela"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index d1c3339b55cd..61510c2e2401 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Sýna snertingar myndrænt"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Sýna yfirborðsuppfærslur"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Láta allt yfirborð glugga blikka við uppfærslu"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Sýna uppfærslur skjákorts"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Láta svæði í gluggum blikka við skjákortsteiknun"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Sýna uppfærslur yfirlits"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Láta svæði í gluggum blikka við birtingu"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Sýna uppfærslur vélbúnaðar"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Láta vélbúnaðarlög blikka græn við uppfærslu"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Yfirteiknun skjákorts"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Sýna skurðlínur, spássíur o.s.frv."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Þvinga umbrot frá hægri til vinstri"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Þvinga umbrot skjás frá hægri til vinstri fyrir alla tungumálskóða"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Þvinga skjákortsteiknun"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Þvinga notkun skjákorts fyrir tvívíða teikningu"</string>
<string name="force_msaa" msgid="7920323238677284387">"Þvinga 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Virkja 4x MSAA í OpenGL ES 2.0 forritum"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Villuleita klippt svæði sem ekki eru rétthyrnd"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Greina skjákortsteiknun"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI-teiknun prófíls"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Virkja villuleit skják."</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Leyfa villuleit skjákorts fyrir villuleit forrita"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Kvarði gluggahreyfinga"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 93754dbb1624..546495b5c10f 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Mostra feedback visivi per i tocchi"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Aggiornamenti superficie"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Flash delle superfici delle finestre all\'aggiornamento"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Aggiornamenti visualizz. GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flash delle visualizzazioni dentro le finestre se disegnate con GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Aggiornamenti visualizz."</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Flash visualizzazioni dentro finestre se disegnate"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Aggiornam. livelli hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Lampeggia verde se aggiornam. livelli hardware"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug overdraw GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Mostra limiti, margini dei clip e così via"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forza direzione layout RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Direzione layout schermo RTL per tutte le lingue"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forza rendering GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forza l\'uso della GPU per i disegni 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forza MSAA 4x"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Attiva MSAA 4x in applicazioni OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Debug operazioni ritaglio non rettangolare"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Rendering GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Rendering HWUI profilo"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Attiva livelli debug GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Consenti caricamento livelli debug GPU app debug"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Scala animazione finestra"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 5a0a35f21f86..015487ab31ff 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"הצג משוב ויזואלי להקשות"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"הצג עדכונים על פני השטח"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"הבזק את כל שטחי החלון כשהם מתעדכנים"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"‏הצג עדכוני תצוגה של GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"‏הבזק תצוגות בתוך חלונות בעת ציור באמצעות ה-GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"תצוגת \'הצגת עדכונים\'"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"הבזק תצוגות בתוך חלונות בעת ציור"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"הצג עדכוני שכבות חומרה"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"הצג הבהוב ירוק לשכבות חומרה כשהן מתעדכנות"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"‏חריגה בניפוי באגים ב-GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"הצג גבולות אזור, שוליים וכדומה"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"אלץ כיוון פריסה מימין לשמאל"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"אלץ כיוון פריסת מסך מימין לשמאל עבור כל השפות בכל המקומות"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"‏אלץ עיבוד ב-GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"‏אכוף שימוש ב-GPU לשרטוט דו-מימדי"</string>
<string name="force_msaa" msgid="7920323238677284387">"‏אלץ הפעלת 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"‏הפעל 4x MSAA ביישומי OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"ניפוי באגים בפעולות באזור שאינו מלבני"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"‏עיבוד פרופיל ב-GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"‏עיבוד פרופיל ב-HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"‏הפעלת שכבות לניפוי באגים ב-GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"‏טעינת שכבות לניפוי באגים ב-GPU לאפליקציות ניפוי באגים"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"קנה מידה לאנימציה של חלון"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 8bf0335bbfe8..b2a6bd003f06 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -141,7 +141,7 @@
<string name="launch_defaults_some" msgid="313159469856372621">"一部デフォルトで設定"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"デフォルトの設定なし"</string>
<string name="tts_settings" msgid="8186971894801348327">"テキスト読み上げの設定"</string>
- <string name="tts_settings_title" msgid="1237820681016639683">"テキスト読み上げの出力"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"テキスト読み上げの設定"</string>
<string name="tts_default_rate_title" msgid="6030550998379310088">"音声の速度"</string>
<string name="tts_default_rate_summary" msgid="4061815292287182801">"テキストの読み上げ速度"</string>
<string name="tts_default_pitch_title" msgid="6135942113172488671">"音の高さ"</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"タップを視覚表示する"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"表示面の更新を表示"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"更新時にウィンドウの表示面全体を点滅させる"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU表示の更新を表示"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPUでの描画時にウィンドウ内の表示を点滅させる"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"画面の更新を表示"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"描画時にウィンドウ内の表示を点滅させる"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ハードウェア層情報を表示"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ハードウェア層が更新されると緑を表示する"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPUオーバードローをデバッグ"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"クリップの境界線、マージンなどを表示"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTLレイアウト方向を使用"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"すべての言語/地域で画面レイアウト方向をRTLに設定"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPUレンダリングを使用"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2D描画にGPUを常に使用する"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAAを適用"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0アプリで4x MSAAを有効にする"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"非矩形クリップ操作をデバッグ"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPUレンダリングのプロファイル作成"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI レンダリングのプロファイル作成"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU デバッグレイヤの有効化"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"デバッグアプリに GPU デバッグレイヤの読み込みを許可"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"ウィンドウアニメスケール"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 8b56159768aa..bd09bf16d858 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"შეხებებისთვის ვიზუალური უკუკავშირის ჩვენება"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"ზედაპირის განახლებების ჩვენება"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"ფანჯრის მთელი ზედაპირის აციმციმება მისი განახლებისას"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ხედის განახლებების ჩვენება"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU-თი ხაზვისას განათდეს ფანჯრების შიგთავსი"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"განახლებების ჩვენება"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ხაზვისას განათდეს ფანჯრების შიგთავსი"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"აპარატურის დონეების განახლებების ჩვენება"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"განახლებისას სააპარატო დონეების მწვანით მონიშვნა"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU overdraw-ს გამართვა"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"კლიპის საზღვრების, მინდვრების ჩვენება და ა.შ."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"მარჯვნიდან მარცხნივ განლაგების მიმართულების იძულება"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ეკრანის RTL მიმართულებაზე იძულება ყველა ლოკალისათვის"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU-აჩქარება"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"GPU-ის ძალით გამოყენება 2d drawing-თვის"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA-ს ჩართვა"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"4x MSAA-ის ჩართვა OpenGL ES 2.0 აპში."</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"არა-მართკუთხა კლიპ-ოპერაციების გამართვა"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU რენდერის პროფილი"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"პროფილის HWUI რენდერი"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU-ს შეცდომების გამართვის შრეების ჩართვა"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"გასამართი აპებისთვის GPU-ს შეცდომების გამართვის შრეების გაშვების დაშვება"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"ფანჯარა: მასშტაბი"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index b2a1eb228953..005ee6db824d 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Түрту қимылын экраннан көрсету"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Беттің жаңарғанын көрсету"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Жаңарғанда, терезе беттерін жыпылықтату"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Графикалық процессор көрінісінің жаңартуларын көрсету"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Графикалық процессор сызғанда, терезе ішіндегі көріністердің жыпылықтауы"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Көру аумағын жаңартуды көрсету"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Терезелерде жаңартылған аумақтарды жарықтандыру"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Аппараттық қабат жаңартуларын көрсету"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Жаңартылғанда, аппараттық қабаттарды жасылмен жыпылықтату"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Үстінен бастырылғанды жөндеу"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Қию шектерін, жиектерін, т.б көрсету."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Оңнан солға орналастыру"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Экранның орналасу бағытын барлық тілдер үшін оңнан солға қарату"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU рендерингін жылдамдату"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Графикалық процессорды 2d сызбаларына қолдану"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA қолдану"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"4x MSAA функциясын OpenGL ES 2.0 қолданбаларында іске қосу"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Тіктөртбұрышты емес қию қимылдарын жөндеу"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU жұмысын жазу"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Профиль бойынша HWUI рендерингі"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU жөндеу қабаттарын қосу"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"GPU жқндеу қабаттарының жүктелуіне рұқсат ету"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Терезе анимациясының өлшемі"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 92a3dbfa7df0..d90a89f801b6 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"បង្ហាញដានចុច នៅពេលចុច"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"បង្ហាញ​បច្ចុប្បន្នភាព​ផ្ទៃ"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"ផ្ទៃ​បង្អួច​ទាំង​មូល​បញ្ចេញ​ពន្លឺ​ពេល​ពួកវា​ធ្វើ​បច្ចុប្បន្នភាព"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"បង្ហាញ​បច្ចុប្បន្នភាព​ទិដ្ឋភាព GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"មើល Flash ក្នុង​វីនដូ​ពេល​បាន​គូរ​ជា​មួយ GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"បង្ហាញ​ការធ្វើ​បច្ចុប្បន្នភាព​នៃការមើល"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ទិដ្ឋភាព​បញ្ចេញពន្លឺភ្លឹបភ្លែត​នៅក្នុង​វិនដូនៅ​ពេលគូរ"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"បង្ហាញ​​បច្ចុប្បន្នភាព​ស្រទាប់​ផ្នែក​រឹង"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ស្រទាប់​ផ្នែក​រឹង​បញ្ចេញ​ពន្លឺ​បៃ​តង​ ពេល​ពួក​វា​ធ្វើ​បច្ចុប្បន្នភាព"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"កែ​កំហុស​ការ​លើស GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"បង្ហាញ​ការ​ភ្ជាប់​អត្ថបទ​សម្រង់ រឹម ។ល។"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"បង្ខំ​ទិស​ប្លង់ RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"បង្ខំ​ទិស​ប្លង់​អេក្រង់​ទៅកាន់ RTL សម្រាប់​មូលដ្ឋាន​ទាំងអស់"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"បង្ខំ​ឲ្យ​បង្ហាញ GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"បង្ខំ​ប្រើ GPU សម្រាប់​ការ​គូរ​ 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"បង្ខំ 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"បើក 4x MSAA ក្នុង​កម្មវិធី OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"កែ​ប្រតិបត្តិការ​​ស្រង់ non-rectangular"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"ការ​បង្ហាញ​ទម្រង់ GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"ការបំប្លែង​កម្រងព័ត៌មាន HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"បើក​ស្រទាប់​ជួសជុល GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"អនុញ្ញាតឱ្យ​ផ្ទុក​ស្រទាប់​ជួស​ជុល GPU សម្រាប់​កម្មវិធី​ជួសជុល"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"មាត្រដ្ឋាន​ចលនា​វិនដូ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 7ce59f19a982..af7890ef6f88 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"ಟ್ಯಾಪ್‌ಗಳಿಗೆ ದೃಶ್ಯ ಪ್ರತಿಕ್ರಿಯೆ ತೋರಿಸು"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"ಸರ್ಫೇಸ್‌‌ ಅಪ್‌ಡೇಟ್‌"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"ಅಪ್‌ಡೇಟ್‌ ಆಗುವಾಗ ವಿಂಡೋದ ಸರ್ಫೇಸ್‌ ಫ್ಲ್ಯಾಶ್ ಆಗುತ್ತದೆ"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ವೀಕ್ಷಣೆ ಅಪ್‌ಡೇಟ್‌"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU ಡ್ರಾ ಮಾಡಿದಾಗ ವಿಂಡೊದಲ್ಲಿ ವೀಕ್ಷಣೆ ಫ್ಲ್ಯಾಶ್‌"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ ತೋರಿಸಿ"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ಡ್ರಾ ಮಾಡಿದಾಗ ವಿಂಡೊದಲ್ಲಿ ವೀಕ್ಷಣೆ ಫ್ಲ್ಯಾಶ್‌"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ಹಾರ್ಡ್‌ವೇರ್‌ ಲೇಯರ್‌‌ ಅಪ್‌ಡೇಟ್‌"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ಅವುಗಳು ನವೀಕರಿಸಿದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ಓವರ್‌ಡ್ರಾ ಡೀಬಗ್"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ಕ್ಲಿಪ್‌ನ ಗಡಿಗಳು, ಅಂಚುಗಳು, ಇತ್ಯಾದಿ ತೋರಿಸು."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL ಲೇಔಟ್‌ ಪರಿಮಿತಿ ಬಲಗೊಳಿಸಿ"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ಎಲ್ಲ ಸ್ಥಳಗಳಿಗಾಗಿ RTL ಗೆ ಸ್ಕ್ರೀನ್‌ ಲೇಔಟ್‌ ದಿಕ್ಕನ್ನು ಪ್ರಬಲಗೊಳಿಸಿ"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU ನೀಡುವಿಕೆ ಬಲಗೊಳಿಸು"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d ಚಿತ್ರಕಲೆಗಾಗಿ GPU ಬಳಕೆ ಬಲಗೊಳಿಸಿ"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA ಪ್ರಬಲಗೊಳಿಸಿ"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ 4x MSAA ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"ಆಯತಾಕಾರವಲ್ಲದ ಕ್ಲಿಪ್ ಕಾರ್ಯಾಚರಣೆ ಡೀಬಗ್"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU ಪ್ರೊಫೈಲ್‌ ಸಲ್ಲಿಕೆ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"ಪ್ರೊಫೈಲ್ HWUI ಸಲ್ಲಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU ಡೀಬಗ್ ಲೇಯರ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ಡೀಬಗ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ GPU ಡೀಬಗ್ ಲೇಯರ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡುವುದನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Window ಅನಿಮೇಶನ್ ಸ್ಕೇಲ್‌"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 0aa80e7e009c..14ce137f0822 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"탭한 항목에 대해 시각적인 의견 표시"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"표면 업데이트 표시"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"전체 창 표면이 업데이트되었을 때 플래시 처리"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU 보기 업데이트 표시"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU로 드로잉했을 때 창 내부 보기 플래시 처리"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"업데이트 보기 표시"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"드로잉했을 때 창 내부 보기 플래시 처리"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"하드웨어 레이어 업데이트 표시"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"업데이트할 때 하드웨어 레이어 녹색으로 깜박이기"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU 오버드로 디버그"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"클립 경계, 여백 등을 표시"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL 레이아웃 방향 강제 적용"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"모든 언어에 대해 화면 레이아웃 방향을 RTL로 강제 적용"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU 렌더링 강제 설정"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2D 드로잉용으로 GPU 강제 사용"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA 강제 사용"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 앱에서 4x MSAA 사용"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"사각형이 아닌 클립 작업 디버그"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"프로필 GPU 렌더링"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"프로필 HWUI 렌더링"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU 디버그 레이어 사용 설정"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"디버그 앱에 GPU 디버그 레이어 로드 허용"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"창 애니메이션 배율"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index da29653ca52b..109c47eb1811 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Экранда басылган жерлер көрүнүп турат"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Экран жаңыруусун көрсөтүү"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Экран жаңырганда анын үстү жарык болот"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Экран жаңыртуусун көрсөтүү"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU менен тартканда экрандын аймактары жарык болот"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Жаңыртууларды көрсөтүү"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Тартканда көрүүлөрдү терезелердин ичинде көрсөтүү"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Аппараттык жаңыртууларды көрсөтүү"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Жаңырган аппараттык деңгээлдер жашыл түскө боелот"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU мүчүлүштүктөрүн оңдоо"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Кесилген нерсенин чектери жана жээктери көрүнөт"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Интерфейсти чагылдыруу"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Интерфейстин элементтери бардык тилдерде оңдон солго карай жайгаштырылат"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU тездетүү"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Эки өлчөмдүү (2d) сүрөт үчүн ар дайым GPU колдонулат"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA иштетүү"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 колдонмолорунда 4x MSAA иштетилет"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Татаал формаларды кесүү операцияларынын мүчүлүштүктөрүн оңдоо"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU иштетүү профили"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI профили түзүлүүдө"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU мүчүлүштүктөрдү оңдоо катмарларын иштетүү"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"GPU мүчүлүштүктөрдү оңдоо катмарларын иштетет"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Терезелердин анимациясы"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index b43c0d84d86c..4034a7e816a0 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"ສະແດງຄໍາຕິຊົມທາງຮູບພາບສຳລັບການແຕະ"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"ສະແດງການອັບເດດພື້ນຜິວ"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"ກະພິບໜ້າຈໍທັງໜ້າເມື່ອມີການອັບເດດ"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"ສະແດງມຸມມອງການອັບເດດ GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"ກະພິບມຸມມອງໃນໜ້າຈໍເມື່ອຖືກແຕ້ມດ້ວຍ GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"ສະແດງອັບເດດມຸມມອງ"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ກະພິບມຸມມອງພາຍໃນໜ້າຈໍເມື່ອແຕ້ມແລ້ວ"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ສະແດງການອັບເດດເລເຢີຂອງຮາດແວ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ກະພິບເລເຢີຂອງຮາດແວໃຫ້ເປັນສີຂຽວເມື່ອມີການອັບເດດ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"ແກ້ບັນຫາການແຕ້ມທັບຂອງ GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ສະແດງໜ້າປົກຄລິບ, ຂອບ ແລະອື່ນໆ."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"ບັງ​ຄັບ​ໃຫ້ຮູບຮ່າງຂຽນຈາກຂວາຫາຊ້າຍ"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ບັງຄັບໃຫ້ຮູບຮ່າງໜ້າຈໍ ຂຽນຈາກຂວາໄປຊ້າຍ ສຳລັບທຸກພາສາ"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"ບັງຄັບໃຊ້ GPU ປະມວນພາບ"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"ບັງຄັບໃຊ້ GPU ເພື່ອການແຕ້ມພາບ 2 ມິຕິ"</string>
<string name="force_msaa" msgid="7920323238677284387">"ບັງຄັບໃຊ້ 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"ເປິດໃຊ້ 4x MSAA ໃນແອັບຯ OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"ດີບັ໊ກການເຮັດວຽກຂອງຄລິບທີ່ບໍ່ແມ່ນສີ່ຫຼ່ຽມ"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"ສະແດງຜົນ GPU ຕາມໂປຣໄຟລ໌"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"ການປະມວນຜົນໂປຣໄຟລ໌ HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"ເປີດໃຊ້ຊັ້ນຂໍ້ມູນດີບັກ GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ອະນຸຍາດການໂຫລດຊັ້ນຂໍ້ມູນດີບັກ GPU ສຳລັບແອັບດີບັກ"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"ຂະໜາດອະນິເມຊັນ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 2bf4ce43d0a1..c9748127aad0 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Rodyti vaizdinius palietimų atsiliepimus"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Rodyti paviršiaus naujin."</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Naujinant mirginti visus langų paviršius"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Rodyt GPU rodinių naujin."</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"„Flash“ rodiniai languose atvaizduojant su GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Rodyti rodinių naujinius"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"„Flash“ rodiniai languose atvaizduojant"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Rod. apar. įr. sl. nauj."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Kai atsin. apar. įr. sl., rod. juos blyks. ž. sp."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Derinti GPU perdangą"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Rodyti iškarpų ribas, kraštines ir t. t."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Išdėst. iš dešin. į kairę"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Nust. visų lokalių ekran. išdėst. iš deš. į kairę"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Priverst. GPU atvaizd."</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Priverstinai naudoti GPU atvaizduojant 2D formatą"</string>
<string name="force_msaa" msgid="7920323238677284387">"Priverst. vykdyti 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Įgalinti 4x MSAA „OpenGL ES 2.0“ programose"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Derinti ne stačiakampio klipo operacijas"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profiliuotas GPU atvaizd."</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profilio HWUI atvaizdav."</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Įg. graf. proc. der. sl."</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Leisti įkelti graf. proc. der. sluoks. der. progr."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Lango animacijos mast."</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 168edd8672c4..80aa91798d65 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Rādīt vizuālo reakciju pēc pieskārieniem"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Rādīt virsmas atjauninājumus WL: 294"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Atjaunināt visa loga virsmas, kad tās tiek atjauninātas WL: 294"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Rādīt GPU skat. atjaun."</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Atjaunināt logu skat., ja zīm. tiek liet. GPU."</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Rādīt skat. atjaunin."</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Atjaunināt logu skatījumus, ja lietots zīmējums"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Rādīt apar. slāņu atjaun."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Atjaunin. aparatūras slāņiem ir jāmirgo zaļā krāsā"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Atkļūdot graf. proc. kapac. pārsn."</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Rādīt klipu robežas, malas utt."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Virziens no labās uz kreiso (Obligāts) WL: 295"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Obl. izkārt. virz. no labās uz kr. pusi visām lok."</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Piespiedu GPU render."</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Izmantot GPU atveidi divdimensiju zīmējumiem"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA piespiedu palaiš."</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Iespējot 4x MSAA OpenGL ES 2.0 lietotnēs"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Atkļūdot darbības daļā, kas nav taisnstūris."</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profila GPU atveide"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profila HWUI atveide"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Iesp. GPU atkļūd. slāņus"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Atļaut GPU atkļūd. slāņu ielādi atkļūd. lietotnēm"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Loga animācijas mērogs"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 3481de8b871d..534dc2a311aa 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Прикажи визуелни повратни информации за допири"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Прикажи ажурир. површина"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Осветли површ. на прозорци при нивно ажурирање"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Прикажи ажурир. со GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Осветли прегледи во прозорците при цртање со GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Прикажи ажурирања на прегледи"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Осветли прегледи во прозорците при цртање"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ажурир. слоеви на хардвер"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Осветли слоеви на хардвер со зелено кога се ажур."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отстр. греш. на GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Прикажи граници на клип, маргини, итн."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Принудно користи RTL за насока"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Присилно постави насока на распоред на екран во РТЛ за сите локални стандарди"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Присили рендерирање на GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Присилно користење на GPU за цртеж 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Принудно користи 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Овозможи 4x MSAA за апликации OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Отстрани грешка на неправоаголни клип операции"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Прикажување профил на GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI-прикажување профил"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Овозм. отстр. греш. на GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Дозволи отстр. греш. на GPU за поправање апликации"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Опсег на аним. на прозор."</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index f6539a16e50b..01d710703f43 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"ടാപ്പുകൾക്ക് ദൃശ്യ ഫീഡ്ബാക്ക് കാണിക്കുക"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"സർഫേസ് അപ്‌ഡേറ്റ് കാണിക്കൂ"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"മുഴുവൻ വിൻഡോ സർഫേസുകളും അപ്‌ഡേറ്റുചെയ്‌തുകഴിയുമ്പോൾ അവ ഫ്ലാഷുചെയ്യുക"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU കാഴ്‌ചയുടെ അപ്‌ഡേറ്റുകൾ കാണിക്കൂ"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU ഉപയോഗിച്ച് വലിക്കുമ്പോൾ വിൻഡോകൾക്കുള്ളിൽ കാഴ്‌ചകൾ ഫ്ലാഷുചെയ്യുക"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"\'അപ്‌ഡേറ്റുകൾ കാണുക\' കാണിക്കുക"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"വലിക്കുമ്പോൾ വിൻഡോകൾക്കുള്ളിൽ കാഴ്‌ചകൾ ഫ്ലാഷ് ചെയ്യുക"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ഹാർഡ്‌വെയർ ലേയർ അപ്‌ഡേറ്റ് കാണിക്കൂ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ഹാർഡ്‌വെയർ ലേയറുകളുടെ അപ്‌ഡേറ്റുകൾ പൂർത്തിയാകുമ്പോൾ അവ പച്ച നിറത്തിൽ പ്രകാശിപ്പിക്കുക"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ഓവർഡ്രോ ഡീബഗ്ഗുചെയ്യുക"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ക്ലിപ്പ് ബൗണ്ടുകൾ, മാർജിനുകൾ തുടങ്ങിയവ ദൃശ്യമാക്കുക"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL ലേഔട്ട് ഡയറക്ഷൻ നിർബന്ധമാക്കുക"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"എല്ലാ ഭാഷകൾക്കുമായി സ്‌ക്രീൻ ലേഔട്ട് ഡയറക്ഷൻ RTL-ലേക്ക് നിർബന്ധമാക്കുക"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU റെൻഡറിംഗ് ഫോഴ്സ്ചെയ്യുക"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d ഡ്രോയിംഗിനായുള്ള നി‍‍ർബന്ധിത GPU ഉപയോഗം"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA നിർബന്ധമാക്കുക"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 അപ്ലിക്കേഷനുകളിൽ 4x MSAA പ്രവർത്തനക്ഷമമാക്കുക"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"ചതുരാകൃതിയിലല്ലാത്ത ക്ലിപ്പ്‌പ്രവർത്തനം ഡീബഗുചെയ്യൂ"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"പ്രൊഫൈൽ GPU റെൻഡർചെയ്യൽ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI റെൻഡറിംഗ് പ്രൊഫൈൽ"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU ഡീബഗ് ലെയറുകൾ പ്രവർത്തനക്ഷമമാക്കൂ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ഡീബഗ് ആപ്പുകൾക്കായി GPU ഡീബഗ് ലെയറുകൾ ലോഡ് ചെയ്യാൻ അനുവദിക്കുക"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"വിൻഡോ ആനിമേഷൻ സ്‌കെയിൽ"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 53146e558981..960f3e1efea9 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Товшилтын визуал хариу үйлдлийг харуулах"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Гадаргын шинэчлэлтүүдийг харуулах"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Шинэчлэгдэх үед цонхны гадаргыг бүхэлд нь анивчуулах"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU харагдацын шинэчлэлтүүдийг харуулах"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU-тай зурагдсан үед цонхнуудын доторхыг гялс харуулна"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Шинэчлэлт харахыг харуулах"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Үүсгэсэн үеийн цонхон дахь Flash-н харагдах байдал"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Техник хангамжийн давхаргын шинэчлэлтүүдийг харуулах"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Техник хангамжууд шинэчлэх үед давхаргыг анивчуулах"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU давхар дүрслэлийг дебаг хийх"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Клипийн зах, хязгаар зэргийг харуулах"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL байрлалын чиглэлийг хүчээр тогтоох"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Бүх локалын хувьд дэлгэцийн байрлалын чиглэлийг хүчээр RTL болгох"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Хүчээр GPU ашиглах"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"GPU-г 2d зурагт хүчээр ашиглах"</string>
<string name="force_msaa" msgid="7920323238677284387">"Хүчээр 4x MSAA ашиглах"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 апп-уудад 4x MSAA-г идэвхжүүлэх"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Тэгш өнцөгт бус клипийн үйлдлүүдийн согогийг засах"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Профайл GPU гаргах"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Профайл HWUI-н буулгалт"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU дебаг хийх давхаргыг идэвхжүүлэх"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Дебаг хийх аппад GPU дебаг хийх давхарга ачааллахыг зөвшөөрөх"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Цонхны дүрс амилуулалтын далайц"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 514a55f18ba6..6e89a846f649 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"टॅपसाठी दृश्यमान अभिप्राय दर्शवा"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"पृष्ठभाग अपडेट दर्शवा"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"संपूर्ण विंडो पृष्ठभाग अद्ययावत होतात तेव्हा ते फ्‍लॅश करा"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU दृश्य अपडेट दर्शवा"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU सह रेखांकित करताना विंडोच्या आतील दृश्ये फ्लॅश करा"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"व्‍ह्यू अपडेट दाखवा"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"रेखांकित केल्‍यावर विंडोच्‍या आतील फ्लॅश व्‍ह्यू"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेअर स्तर अपडेट दर्शवा"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेअर स्तर अद्ययावत झाल्यावर ते हिरव्या रंगात फ्लॅश करा"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ओव्हरड्रॉ डीबग करा"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"क्लिप सीमा, समास इत्यादी दर्शवा."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL लेआउट दिशानिर्देशाची सक्ती करा"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"सर्व लोकॅलसाठी RTL स्क्रीन लेआउट दिशानिर्देशाची सक्ती करा"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU प्रस्तुतीस सक्ती करा"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d रेखांकनासाठी GPU च्या वापराची सक्ती करा"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA ची सक्ती करा"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 अॅप्समध्ये 4x MSAA सुरू करा"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"आयताकृती नसलेले क्लिप ऑपरेशन डीबग करा"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"प्रोफाईल GPU प्रस्तुती"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"प्रोफाइल HWUI रेंडरिंग"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU डीबग स्तर सुरू करा"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"डीबग अॅप्ससाठी GPU डीबग स्तर लोड करण्याची अनुमती द्या"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"विंडो अॅनिमेशन स्केल"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index dc7b1c601ed7..f3f9eb649722 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Tunjukkan maklum balas visual untuk ketikan"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Tunjuk kemas kini permukaan"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Denyar permukaan tetingkap apabila dikemas kini"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Tunjuk kemas kini GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Denyar paparan dalam tetingkap jika dilukis dengan GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Papar lihat kemas kini"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Denyar paparan dalam tetingkap apabila dilukis"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Tunjukkan kemas kini perkakasan"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Denyar hijau lapisan perkakasan yang dikemas kini"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Nyahpepijat lebih lukis GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Tunjukkan batas klip, margin dll."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Paksa arah reka letak RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Paksa arah reka letak skrin RTL bagi semua tempat peristiwa"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Paksa pemaparan GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Paksa penggunaan GPU untuk lukisan 2d"</string>
<string name="force_msaa" msgid="7920323238677284387">"Paksa 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Dayakan 4x MSAA dalam apl OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Nyahpepijat operasi keratan bukan segi empat tepat"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Pemaparan GPU profil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Pemaparan HWUI profil"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Dayakan lpsn nyhppjat GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Bnrkn pemuatan lpsn nyhppjt GPU utk apl pnyhppjtn"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Skala animasi tetingkap"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 2079e442f343..adae0d2ded3d 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"တို့ခြင်းများအတွက် အမြင်ဖြင့် တုံ့ပြန်မှုပြပါ"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"surface အဆင့်မြှင့်မှုများပြပါ"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"အပ်ဒိတ်လုပ်စဉ် ဝင်းဒိုးမျက်နှာပြင်တွင် အချက်ပြရန်"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU မြင်ကွင်းအပ်ဒိတ် ပြခြင်း"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU နှင့်ဆွဲစဉ် ၀င်းဒိုးအတွင်းပိုင်း လျှပ်တပြက်မြင်ကွင်းများ"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"အပ်ဒိတ်မြင်ကွင်း ပြရန်"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ပုံရေးဆွဲစဉ် ဝင်းဒိုးအတွင်း လျှပ်တစ်ပြက်မြင်ကွင်းများ"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ဟာ့ဒ်ဝဲအလွှာ အပ်ဒိတ်များပြခြင်း"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"အပ်ဒိတ်လုပ်ချိန် ဟာ့ဒ်ဝဲအလွှာများ အစိမ်းရောင်ပြပါ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ပိုသုံးစွဲမှု ပြင်ဆင်ခြင်း"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ဖြတ်ပိုင်းအနားသတ်များ၊ အနားများ စသဖြင့် ပြပါ။"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL ဖွဲ့စည်းပုံအညွှန်း မဖြစ်မနေလုပ်ပါ"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ဘာသာစကား အားလုံးအတွက် မျက်နှာပြင် ဖွဲ့စည်းပုံအညွှန်း မဖြစ်မနေလုပ်ရန်"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU ဖြစ်စေခြင်း"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d ပုံဆွဲရန် GPU မဖြစ်မနေသုံးခြင်း"</string>
<string name="force_msaa" msgid="7920323238677284387">"တွန်းအား ၄× MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 apps တွင် ၄×MSAA အသုံးပြုခွင့်ပေးရန်"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"စတုဂံပုံမကျသောဖြတ်ပိုင်း လုပ်ဆောင်ချက်များကို အမှားဖယ်ရှားသည်"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU တင်ဆက်မှု ကိုယ်ရေးအချက်အလက်"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI ပြင်ဆင်စဉ် ပရိုဖိုင်"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU အမှားရှာ အလွှာများဖွင့်ထားပါ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"အမှားရှာအက်ပ်များအတွက် GPU အမှားရှာအလွှာများ ထည့်သွင်းခွင့်ပြုပါ"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"လှုပ်ရှားသက်ဝင်ပုံစကေး"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index b5163e044689..a3293e5ba400 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Vis visuell tilbakemelding for trykk"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Vis overflateoppdateringer"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Fremhev hele vindusoverflater når de oppdateres"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Vis GPU-visningsoppdateringer"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Fremhev visninger i vinduer når tegnet med GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Vis «Se oppdateringer»"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Fremhev visninger i vinduer når de tegnes"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Vis maskinvarelag-oppdat."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Maskinvarelag blinker grønt under oppdatering"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Feilsøk GPU-overtrekk"</string>
@@ -300,16 +300,14 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Vis kanter, marger osv."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Tving layoutretning for RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Tving RTL-retning på skjermen for alle språk"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Tving GPU-gjengivelse"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Tving bruk av GPU for 2D-tegning"</string>
<string name="force_msaa" msgid="7920323238677284387">"Tving 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Slå på 4x MSAA i OpenGL ES 2.0-apper"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Feilsøk ikke-rektangulær klipping"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU-gjengivelse av profil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI-gjengivelse av profil"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Slå på GPU-feilsøkingslag"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Tillat GPU-feilsøkingslag for feilsøkingsapper"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Animasjonsskala for vindu"</string>
- <string name="transition_animation_scale_title" msgid="387527540523595875">"Overgangsanimasjonsskala"</string>
+ <string name="transition_animation_scale_title" msgid="387527540523595875">"Animasjonsskala for overgang"</string>
<string name="animator_duration_scale_title" msgid="3406722410819934083">"Varighetsskala for animasjon"</string>
<string name="overlay_display_devices_title" msgid="5364176287998398539">"Simulering av sekundærskjermer"</string>
<string name="debug_applications_category" msgid="4206913653849771549">"Apper"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 5ae529896136..ca6fe8829406 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"ट्यापका लागि दृश्य प्रतिक्रिया देखाउनुहोस्"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"सतह अद्यावधिक देखाउनुहोस्"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"तिनीहरू अपडेट हुँदा पुरै विन्डो सतहहरूमा फ्यास गर्नुहोस्"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU दृश्य अद्यावधिक देखाउनुहोस्"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU को साथ कोरिएको बेला विन्डोहरू भित्र फ्ल्यास दृश्यहरू"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"दृश्यसम्बन्धी अद्यावधिकहरू देखाउनुहोस्"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"कोरिएको बेला विन्डोभित्रका फ्ल्यास दृश्यहरू"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेयर तह अद्यावधिक देखाउनुहोस्"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"फ्ल्यास हार्डवेयर तहहरू अपडेट हुँदा हरिया हुन्छन्"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU overdraw डिबग गर्नुहोस्"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"क्लिप सीमा, मार्जिन, इत्यादि देखाउनुहोस्।"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL लेआउट दिशामा जबर्जस्ती गर्नुहोस्"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"सबै लोकेलहरूको लागि RTLमा स्क्रिन लेआउट दिशामा जबर्जस्ती गर्नुहोस्"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU रेन्डर गर्न जोड गर्नुहोस्"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d चित्र कोर्नका लागि GPU को प्रयोगलाई जोड दिनुहोस्"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA जोड गर्नुहोस्"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES २.० अनुप्रयोगमा ४x MSAA सक्षम पार्नुहोस्"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"गैर आयातकर क्लिप कार्यहरू डिबग गर्नुहोस्"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"प्रोफाइल GPU रेन्डर गर्दै"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"प्रोफाइल HWUI रेन्डर गरिँदै छ"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU का डिबग तहहरूलाई सक्षम पार्नुहोस्"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"डिबगसम्बन्धी अनुप्रयोगहरूका लागि GPU का डिबग तहहरूलाई लोड गर्न दिनुहोस्"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"विन्डो सजीविकरण स्केल"</string>
@@ -322,7 +320,7 @@
<string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"अनुप्रयोगले कुनै मान्य च्यानल बिना सूचना पोस्ट गर्दा स्क्रिनमा चेतावनी देखाउँछ"</string>
<string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यमा बल प्रयोगको अनुमति प्राप्त अनुप्रयोगहरू"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"म्यानिफेेस्टका मानहरूको ख्याल नगरी कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न सकिने खाले बनाउँछ"</string>
- <string name="force_resizable_activities" msgid="8615764378147824985">"गतिविधिहरू रिसाइज गर्नको लागि बाध्य गर्नुहोस्"</string>
+ <string name="force_resizable_activities" msgid="8615764378147824985">"आकार बदल्न योग्य हुने बनाउन गतिविधिहरूलाई बाध्यात्मक बनाउनुहोस्।"</string>
<string name="force_resizable_activities_summary" msgid="6667493494706124459">"म्यानिफेेस्ट मानहरूको ख्याल नगरी, बहु-विन्डोको लागि सबै रिसाइज गर्न सकिने गतिविधिहरू बनाउनुहोस्।"</string>
<string name="enable_freeform_support" msgid="1461893351278940416">"फ्रिफर्म विन्डोहरू सक्रिय गर्नुहोस्"</string>
<string name="enable_freeform_support_summary" msgid="8247310463288834487">"प्रयोगात्मक फ्रिफर्म विन्डोहरूका लागि समर्थन सक्रिय गर्नुहोस्।"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index f557f44c8204..41ba2b0a929f 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Visuele feedback weergeven voor tikken"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Oppervlakupdates weergeven"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Volledige vensteroppervlakken flashen bij updates"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU-weergave-updates weergeven"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flash-weergaven in vensters indien getekend met de GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Weergave-updates tonen"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Flikkerende weergave in vensters bij update"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Updaten hardwarelgn wrgvn"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwarelagen knipperen groen bij updates"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Foutopsporing GPU-overbelasting"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Clipgrenzen, marges en meer weergeven"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"V.r.n.l.-indelingsrichting afdwingen"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Schermindelingsrichting geforceerd instellen op v.r.n.l. voor alle talen"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU-rendering afdwingen"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Gebruik van GPU voor 2D-tekening forceren"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA forceren"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"4x MSAA inschakelen in OpenGL ES 2.0-apps"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Fouten met niet-rechthoekige bijsnijdbewerkingen opsporen"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU-rendering van profiel"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI-weergave van profiel"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU-foutopsporingslagen inschakelen"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Laden van GPU-foutopsporingslagen toestaan voor foutopsporingsapps"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Vensteranimatieschaal"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 6f480bd02f34..987d075bb707 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -224,8 +224,7 @@
<string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ବ୍ଲୁ-ଟୂଥ୍‍‌ ଅଡିଓ ଚ୍ୟାନେଲ୍‌ ମୋଡ୍"</string>
<string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="7234956835280563341">"ବ୍ଲୁ-ଟୂଥ୍‍ ଅଡିଓ କୋଡେକ୍\nସିଲେକ୍ସନ୍‌କୁ ଗତିଶୀଳ କରନ୍ତୁ: ଚ୍ୟାନେଲ୍ ମୋଡ୍"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ବ୍ଲୁ-ଟୂଥ୍‍‌ ଅଡିଓ LDAC କୋଡେକ୍‌: ପ୍ଲେବ୍ୟାକ୍‌ ଗୁଣବତ୍ତା"</string>
- <!-- no translation found for bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title (6893955536658137179) -->
- <skip />
+ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="6893955536658137179">"ବ୍ଲୁ-ଟୁଥ୍‌ ଅଡିଓ LDAC\nକୋଡେକ୍‌ ଚୟନକୁ ଗତିଶୀଳ କରନ୍ତୁ: ପ୍ଲେବ୍ୟାକ୍‌ କ୍ୱାଲିଟୀ"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ଷ୍ଟ୍ରିମ୍ କରୁଛି: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ବ୍ୟକ୍ତିଗତ DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ବ୍ୟକ୍ତିଗତ DNS ମୋଡ୍‌ ବାଛନ୍ତୁ"</string>
@@ -286,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"ଟାପ୍ ପାଇଁ ଭିଜୁଆଲ୍ ମତାମତ ଦେଖାନ୍ତୁ"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"ସର୍ଫେସ୍‌ ଅପଡେଟ୍‌ ଦେଖାନ୍ତୁ"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"ସମଗ୍ର ୱିଣ୍ଡୋ ପୃଷ୍ଠ ଅପଡେଟ୍‌ ହେବା ବେଳେ ସେଗୁଡ଼ିକ ଫ୍ଲାସ୍‌ କରନ୍ତୁ"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ଭ୍ୟୁ ଅପଡେଟ୍‌ ଦେଖନ୍ତୁ"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU ସହ ଅଙ୍କାଯାଇଥିବା ବେଳେ ୱିଣ୍ଡୋ ଭିତରେ ଦୃଶ୍ୟଗୁଡ଼ିକ ଫ୍ଲାଶ କରନ୍ତୁ"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"ଭ୍ୟୁ ଅପଡେଟ୍‌ଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ଅଙ୍କାଯିବାବେଳେ ୱିଣ୍ଡୋସ୍ ଭିତରେ ଫ୍ଲାଶ୍ ଭ୍ୟୁ"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ହାର୍ଡୱେର୍‌ ଲେୟର୍‌ର ଅପଡେଟ୍ ଦେଖାନ୍ତୁ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ହାର୍ଡୱେର୍ ଲେୟାର୍ ଅପଡେଟ୍‌ ହେବାବେଳେ ସେଗୁଡ଼ିକୁ ସବୁଜ ରଙ୍ଗରେ ଦେଖାନ୍ତୁ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ଓଭର୍‌ଡ୍ର\' ଡିବଗ୍‌ କରନ୍ତୁ"</string>
@@ -301,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"କ୍ଲିପ୍‌ ବାଉଣ୍ଡ, ମାର୍ଜିନ୍‌ ଆଦି ଦେଖନ୍ତୁ"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL ଲେଆଉଟ୍ ଦିଗ ବାଧ୍ୟ କରନ୍ତୁ"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ସମସ୍ତ ଲୋକେଲ୍‌ ସକାଶେ ସ୍କ୍ରୀନ୍‌ ଲେଆଉଟ୍‌ ଦିଗ RTL ପାଇଁ ବାଧ୍ୟ କରନ୍ତୁ"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU ରେଣ୍ଡରିଙ୍ଗ ପାଇଁ ବାଧ୍ୟ କରନ୍ତୁ"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2D ଅଙ୍କନ ପାଇଁ GUP ବ୍ୟବହାର ପାଇଁ ବାଧ୍ୟ କରିବା"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA ବାଧ୍ୟ କରନ୍ତୁ"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ଆପ୍‌ରେ 4x MSAA ସକ୍ଷମ କରନ୍ତୁ"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"ଅଣ-ଆୟତାକାର କ୍ଲିପ୍‌ କାର୍ଯ୍ୟକୁ ଡିବଗ୍‌ କରନ୍ତୁ"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"ପ୍ରୋଫାଇଲ୍‌ GPU ରେଣ୍ଡରିଙ୍ଗ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"ପ୍ରୋଫାଇଲ୍ HWUI ରେଣ୍ଡର୍ ହେଉଛି"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU ଡିବଗ୍‌ ଲେୟର୍‌ ସକ୍ଷମ କରନ୍ତୁ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ଡିବଗ୍‌ ଆପ୍‌ଗୁଡ଼ିକ ପାଇଁ GPU ଡିବଗ୍‌ ଲେୟର୍‌ ଲୋଡ୍ କରିବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"ୱିଣ୍ଡୋ ଆନିମେଶନ୍‌ ସ୍କେଲ୍‌"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index a8e7704cd5dc..995ebfe5f773 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"ਟੈਪਾਂ ਲਈ ਨਜ਼ਰ ਸੰਬੰਧੀ ਪ੍ਰਤੀਕਰਮ ਦਿਖਾਓ"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"ਸਰਫ਼ੇਸ ਅੱਪਡੇਟ ਦਿਖਾਓ"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"ਸਮੁੱਚੀ ਵਿੰਡੋ ਸਰਫ਼ੇਸਾਂ ਫਲੈਸ਼ ਕਰੋ ਜਦੋਂ ਉਹ ਅੱਪਡੇਟ ਹੁੰਦੀਆਂ ਹਨ"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ਦ੍ਰਿਸ਼ ਅੱਪਡੇਟ ਦਿਖਾਓ"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"ਜਦੋਂ GPU ਨਾਲ ਡ੍ਰਾ ਕੀਤਾ ਜਾਏ ਤਾਂ ਵਿੰਡੋਜ਼ ਦੇ ਅੰਦਰ ਦ੍ਰਿਸ਼ ਫਲੈਸ਼ ਕਰੋ"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"\'ਅੱਪਡੇਟ ਦੇਖੋ\' ਨੂੰ ਦਿਖਾਓ"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ਡ੍ਰਾ ਕੀਤੇ ਜਾਣ \'ਤੇ ਵਿੰਡੋਜ਼ ਦੇ ਅੰਦਰ ਦ੍ਰਿਸ਼ ਫਲੈਸ਼ ਕਰੋ"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ਹਾਰਡਵੇਅਰ ਲੇਅਰਾਂ ਦੇ ਅੱਪਡੇਟ ਦਿਖਾਓ"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ਹਾਰਡਵੇਅਰ ਲੇਅਰਾਂ ਅੱਪਡੇਟ ਹੋਣ \'ਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਹਰਾ ਕਰੋ"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ਓਵਰਡ੍ਰਾ ਡੀਬੱਗ ਕਰੋ"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ਕਲਿਪ ਬਾਊਂਡਸ, ਮਾਰਜਿਨ ਆਦਿ ਦਿਖਾਓ"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"ਸੱਜੇ ਤੋਂ ਖੱਬੇ ਵਾਲਾ ਲੇਆਊਟ ਲਾਗੂ ਕਰੋ"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ਸਾਰੇ ਸਥਾਨਾਂ ਲਈ ਸਕ੍ਰੀਨ \'ਤੇ ਸੱਜੇ ਤੋਂ ਖੱਬੇ ਵਾਲਾ ਲੇਆਊਟ ਲਾਗੂ ਕਰੋ"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU ਰੈਂਡਰਿੰਗ ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d ਡ੍ਰਾਇੰਗ ਲਈ GPU ਦੀ ਵਰਤੋਂ ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA ਤੇ ਜ਼ੋਰ ਪਾਓ"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ਐਪਾਂ ਵਿੱਚ 4x MSAA ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"ਗੈਰ-ਆਇਤਾਕਾਰ ਕਲਿੱਪ ਓਪਰੇਸ਼ਨ ਡੀਬੱਗ ਕਰੋ"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"ਪ੍ਰੋਫਾਈਲ GPU ਰੈਂਡਰਿੰਗ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"ਪ੍ਰੋਫਾਈਲ HWUI ਰੈਂਡਰਿੰਗ"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU ਡੀਬੱਗ ਲੇਅਰਾਂ ਚਾਲੂ ਕਰੋ"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ਡੀਬੱਗ ਐਪਾਂ ਲਈ GPU ਡੀਬੱਗ ਲੇਅਰਾਂ ਨੂੰ ਲੋਡ ਹੋਣ ਦਿਓ"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"ਵਿੰਡੋ ਐਨੀਮੇਸ਼ਨ ਸਕੇਲ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index c78db2735112..e472b15c92f2 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -194,7 +194,7 @@
<string name="clear_adb_keys" msgid="4038889221503122743">"Odwołaj dostęp do debugowania USB"</string>
<string name="bugreport_in_power" msgid="7923901846375587241">"Skrót do zgłoszenia błędu"</string>
<string name="bugreport_in_power_summary" msgid="1778455732762984579">"Pokaż w menu zasilania przycisk zgłaszania błędu"</string>
- <string name="keep_screen_on" msgid="1146389631208760344">"Pozostaw ekran włączony"</string>
+ <string name="keep_screen_on" msgid="1146389631208760344">"Pozostaw włączony ekran"</string>
<string name="keep_screen_on_summary" msgid="2173114350754293009">"Ekran nie będzie gaszony podczas ładowania telefonu"</string>
<string name="bt_hci_snoop_log" msgid="3340699311158865670">"Włącz dziennik snoop Bluetooth HCI"</string>
<string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Przechwyć wszystkie pakiety Bluetooth HCI do pliku (przełącz Bluetooth po zmianie tego ustawienia)"</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Pokaż potwierdzenie wizualne po dotknięciu"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Pokaż zmiany powierzchni"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Podświetlaj całe aktualizowane powierzchnie okien"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Pokaż zmiany widoku z GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Podświetlaj elementy w oknach, jeśli są rysowane przez GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Pokaż aktualizacje widoku"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Podświetlaj elementy w oknach podczas rysowania"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Pokaż zmiany warstw sprzęt."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Oznaczaj aktualizowane warstwy sprzętowe na zielono"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debuguj przerysowania GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Pokaż granice przycięcia, marginesy itd."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Układ od prawej do lewej"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Wymuś wszędzie układ ekranu od prawej do lewej"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Renderowanie na GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Wymuszaj użycie GPU do rysowania 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Wymuś 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Włącz 4x MSAA w aplikacjach OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Debuguj operacje przycinania nieprostokątnego"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profil renderowania GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profil renderowania HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Warstwy debugowania GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Zezwól na ładowanie warstw debugowania GPU"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Skala animacji okna"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index dfdc09c2cb1b..563698a42da8 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -160,11 +160,11 @@
</string-array>
<string-array name="select_logd_size_summaries">
<item msgid="6921048829791179331">"Desativado"</item>
- <item msgid="2969458029344750262">"64 K/buffer de log"</item>
- <item msgid="1342285115665698168">"256 K/buffer de log"</item>
- <item msgid="1314234299552254621">"1 M/buffer de log"</item>
- <item msgid="3606047780792894151">"4 M/buffer de log"</item>
- <item msgid="5431354956856655120">"16 M/buffer de log"</item>
+ <item msgid="2969458029344750262">"64 K/buffer de registro"</item>
+ <item msgid="1342285115665698168">"256 K/buffer de registro"</item>
+ <item msgid="1314234299552254621">"1 M/buffer de registro"</item>
+ <item msgid="3606047780792894151">"4 M/buffer de registro"</item>
+ <item msgid="5431354956856655120">"16 M/buffer de registro"</item>
</string-array>
<string-array name="select_logpersist_titles">
<item msgid="1744840221860799971">"Desativado"</item>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 17bce0e4d465..98b877bee5e7 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -195,8 +195,8 @@
<string name="bugreport_in_power" msgid="7923901846375587241">"Atalho para relatório do bug"</string>
<string name="bugreport_in_power_summary" msgid="1778455732762984579">"Mostrar um botão para gerar relatórios de bugs no menu do botão liga/desliga"</string>
<string name="keep_screen_on" msgid="1146389631208760344">"Permanecer ativo"</string>
- <string name="keep_screen_on_summary" msgid="2173114350754293009">"A tela nunca entrará em inatividade enquanto estiver carregando."</string>
- <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar log de rastreamento Bluetooth HCI"</string>
+ <string name="keep_screen_on_summary" msgid="2173114350754293009">"A tela nunca entrará em suspensão enquanto estiver carregando."</string>
+ <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar registro de rastreamento Bluetooth HCI"</string>
<string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos os pacotes Bluetooth HCI em um arquivo (ative o Bluetooth depois de alterar esta configuração)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueio de OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que o bootloader seja desbloqueado"</string>
@@ -239,7 +239,7 @@
<string name="wifi_metered_label" msgid="4514924227256839725">"Limitada"</string>
<string name="wifi_unmetered_label" msgid="6124098729457992931">"Ilimitada"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Tamanhos de buffer de logger"</string>
- <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Sel. tam. de logger/buffer de log"</string>
+ <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Sel. tam. de logger/buffer de registro"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Limpar armazenamento de logger constante?"</string>
<string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"Quando não estivermos mais monitorando com o logger constante, devemos limpar o residente de dados de logger do seu dispositivo."</string>
<string name="select_logpersist_title" msgid="7530031344550073166">"Armazenar dados de logger constantemente no dispositivo"</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Mostrar feedback visual para toques"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Mostrar atual. superfície"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Piscar superfícies de toda a janela ao atualizar"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Mostrar atualiz. da GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Piscar visualizações em janelas ao desenhar c/ GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Ver atual. de exibição"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Piscar visualizações em janelas ao desenhar"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Atual. camad. de hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Piscar camadas de hardware em verde ao atualizar"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar overdraw da GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Mostrar limites de corte, margens, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forçar dir. layout (RTL)"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Forçar direção do layout (RTL) p/ todas as localidades"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forçar renderização GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forçar uso da GPU para desenho em 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forçar 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Ativar 4x MSAA em apps OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Depurar operações de corte não retangulares"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Classific. render. GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Classific. render. HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Ativar camadas depuração de GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Permitir carreg. camadas de depuração GPU p/ apps de dep."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Escala de anim. da janela"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index daa259135644..ce40198442f9 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Mostrar feedback visual para toques"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Atualiz. de superfície"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Destacar a superfície da janela ao atualizar"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Most.atualiz. visual. GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Dest. visualiz. em janelas quando desenh. c/ GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Most. atualiz. de vistas"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Destacar vistas em janelas quando desenhadas"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mostrar atual. cam. hard."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Camadas de hard. flash verdes quando estão atuali."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar sobreposição GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Apresentar limites de clipes, margens, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forçar dir. do esq. RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Forçar dir. do esq. do ecrã p. RTL tds os locais"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forçar composição GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forçar a utilização de GPU para desenho 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forçar 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Ativar o 4x MSAA em aplicações OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Depurar operações de clipe não retangulares"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Conversão GPU do perfil"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Renderiz. HWUI do perfil"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Ativar cam. depuração GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Permitir carreg. cam. depuração GPU p/ dep. aplic."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Escala de anim. da janela"</string>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index dfdc09c2cb1b..563698a42da8 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -160,11 +160,11 @@
</string-array>
<string-array name="select_logd_size_summaries">
<item msgid="6921048829791179331">"Desativado"</item>
- <item msgid="2969458029344750262">"64 K/buffer de log"</item>
- <item msgid="1342285115665698168">"256 K/buffer de log"</item>
- <item msgid="1314234299552254621">"1 M/buffer de log"</item>
- <item msgid="3606047780792894151">"4 M/buffer de log"</item>
- <item msgid="5431354956856655120">"16 M/buffer de log"</item>
+ <item msgid="2969458029344750262">"64 K/buffer de registro"</item>
+ <item msgid="1342285115665698168">"256 K/buffer de registro"</item>
+ <item msgid="1314234299552254621">"1 M/buffer de registro"</item>
+ <item msgid="3606047780792894151">"4 M/buffer de registro"</item>
+ <item msgid="5431354956856655120">"16 M/buffer de registro"</item>
</string-array>
<string-array name="select_logpersist_titles">
<item msgid="1744840221860799971">"Desativado"</item>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 17bce0e4d465..98b877bee5e7 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -195,8 +195,8 @@
<string name="bugreport_in_power" msgid="7923901846375587241">"Atalho para relatório do bug"</string>
<string name="bugreport_in_power_summary" msgid="1778455732762984579">"Mostrar um botão para gerar relatórios de bugs no menu do botão liga/desliga"</string>
<string name="keep_screen_on" msgid="1146389631208760344">"Permanecer ativo"</string>
- <string name="keep_screen_on_summary" msgid="2173114350754293009">"A tela nunca entrará em inatividade enquanto estiver carregando."</string>
- <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar log de rastreamento Bluetooth HCI"</string>
+ <string name="keep_screen_on_summary" msgid="2173114350754293009">"A tela nunca entrará em suspensão enquanto estiver carregando."</string>
+ <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Ativar registro de rastreamento Bluetooth HCI"</string>
<string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Capturar todos os pacotes Bluetooth HCI em um arquivo (ative o Bluetooth depois de alterar esta configuração)"</string>
<string name="oem_unlock_enable" msgid="6040763321967327691">"Desbloqueio de OEM"</string>
<string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Permitir que o bootloader seja desbloqueado"</string>
@@ -239,7 +239,7 @@
<string name="wifi_metered_label" msgid="4514924227256839725">"Limitada"</string>
<string name="wifi_unmetered_label" msgid="6124098729457992931">"Ilimitada"</string>
<string name="select_logd_size_title" msgid="7433137108348553508">"Tamanhos de buffer de logger"</string>
- <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Sel. tam. de logger/buffer de log"</string>
+ <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Sel. tam. de logger/buffer de registro"</string>
<string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Limpar armazenamento de logger constante?"</string>
<string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"Quando não estivermos mais monitorando com o logger constante, devemos limpar o residente de dados de logger do seu dispositivo."</string>
<string name="select_logpersist_title" msgid="7530031344550073166">"Armazenar dados de logger constantemente no dispositivo"</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Mostrar feedback visual para toques"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Mostrar atual. superfície"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Piscar superfícies de toda a janela ao atualizar"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Mostrar atualiz. da GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Piscar visualizações em janelas ao desenhar c/ GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Ver atual. de exibição"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Piscar visualizações em janelas ao desenhar"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Atual. camad. de hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Piscar camadas de hardware em verde ao atualizar"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar overdraw da GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Mostrar limites de corte, margens, etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Forçar dir. layout (RTL)"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Forçar direção do layout (RTL) p/ todas as localidades"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forçar renderização GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forçar uso da GPU para desenho em 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forçar 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Ativar 4x MSAA em apps OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Depurar operações de corte não retangulares"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Classific. render. GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Classific. render. HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Ativar camadas depuração de GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Permitir carreg. camadas de depuração GPU p/ apps de dep."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Escala de anim. da janela"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 7d42a10a5ead..b53a3e33469a 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Afișați feedbackul vizual pentru atingeri"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Actualizări suprafețe"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Iluminare suprafețe toată fereastra la actualizare"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Afiș. actualiz. ecran GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Iluminare ecrane din ferestre la desenarea cu GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Afiș. actualizări ecran"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Iluminare ecrane din ferestre la desenare"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Actualiz. strat. hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Straturile hardware clipesc verde la actualizare"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depanați suprapunerea"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Afișați limitele clipului, marginile etc."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Direcție aspect dreapta - stânga"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Direcție obligatorie aspect ecran dreapta - stânga"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Forțați redarea cu GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Forțați utilizarea GPU pentru desen în 2D"</string>
<string name="force_msaa" msgid="7920323238677284387">"Forțați MSAA 4x"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Activați MSAA 4x în aplicațiile OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Remediați decupări nerectangulare"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profil redare cu GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profil redare cu HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Activați nivelurile de depanare GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Permiteți încărcarea nivelurilor de depanare GPU pentru aplicațiile de depanare"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Scară animație fereastră"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 3e15ff3a7cff..a421c728c149 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -56,7 +56,7 @@
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Отключение..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Подключение..."</string>
<string name="bluetooth_connected" msgid="5427152882755735944">"Подключено<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
- <string name="bluetooth_pairing" msgid="1426882272690346242">"Сопряжение..."</string>
+ <string name="bluetooth_pairing" msgid="1426882272690346242">"Устанавливается соединение..."</string>
<string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Подключено (кроме звонков)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Подключено (кроме аудио)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Подключено (кроме сообщений)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
@@ -102,11 +102,11 @@
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Добавить"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ДОБАВИТЬ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Отмена"</string>
- <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Сопряжение обеспечивает доступ к вашим контактам и журналу звонков при подключении."</string>
- <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Не удалось установить сопряжение с устройством \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
- <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Не удалось установить сопряжение с устройством \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\", так как введен неверный PIN-код или пароль."</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Установление соединения обеспечивает доступ к вашим контактам и журналу звонков при подключении."</string>
+ <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Не удалось подключиться к устройству \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Не удалось подключиться к устройству \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\", так как введен неверный PIN-код или пароль."</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"Не удается установить соединение с устройством \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
- <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> не разрешает сопряжение."</string>
+ <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> не разрешает подключение."</string>
<string name="bluetooth_talkback_computer" msgid="4875089335641234463">"Компьютер"</string>
<string name="bluetooth_talkback_headset" msgid="5140152177885220949">"Гарнитура"</string>
<string name="bluetooth_talkback_phone" msgid="4260255181240622896">"Телефон"</string>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Показывать места нажатия на экране"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Показ. обнов. поверхности"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Подсвечивать поверхности окон при обновлении"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Показывать обнов. экрана"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Подсвечивать области экрана при отрисовке с GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Показывать обнов. экрана"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Подсвечивать области экрана при отрисовке"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Показ. аппаратные обновл."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Выделять аппаратные уровни зеленым при обновлении"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отладка наложения"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Показывать границы обрезки, поля и т. п."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Отразить интерфейс"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Принудительно расположить элементы интерфейса справа налево во всех локалях"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU-ускорение"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Всегда использовать GPU для двухмерного рисования"</string>
<string name="force_msaa" msgid="7920323238677284387">"Включить 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Включить 4x MSAA в приложениях OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Отладка операций усечения сложной формы"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Профилировать GPU-отрисовку"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Учет времени работы HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Отладка графического процессора"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Включить загрузку слоев отладки графического процессора"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Анимация окон"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 578b92a2045b..6916787a9e86 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"තට්ටු කිරීම් සඳහා දෘශ්‍ය ප්‍රතිපෝෂණ පෙන්වන්න"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"පෘෂ්ඨ යාවත්කාලීන පෙන්වන්න"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"යාවත්කාලින වනවිට මුළු කවුළු තලයම දැල්වෙන්න"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU පෙනුම් යාවත්කාලීන පෙන්වන්න"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU සමග ඈඳෙන විට තිරයේ ඇතුලත Flash නරඹයි"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"නැරඹීම් යාවත්කාලීන පෙන්වන්න"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"ඇඳි විට කවුළු තුළ සැණෙළි දසුන්"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"දෘඨාංග ස්ථර යාවත්කාලීන"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"යාවත්කාලින වන විට දෘඩාංග තලය කොළ පහන් දැල්වෙන්න"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU වැඩිකොට දැක්වීම නිදොස් කරන්න"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"ක්ලිප් සීමා, මායිම්, ආදිය පෙන්වන්න."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"බල RTL පිරිසැලසුම් දිශාව"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"සියලු පෙදෙසි සඳහා RTL වෙත බල තිර පිරිසැලසුම"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU විදහාපෑම බලකරන්න"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d ඇඳීම් සඳහා GPU බලයෙන් භාවිතා කරන්න"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA බල කරන්න"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 යෙදුම්හි 4x MSAA සබල කරන්න"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"සෘජුකෝණාස්‍ර-නොවන ක්ලිප් මෙහෙයුම් නිදොස් කරන්න"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU විදැහුම විස්තර කරන්න"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"පැතිකඩ HWUI විදහමින්"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU නිදොසීමේ ස්තර සබල කර."</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"නිදොසීමේ යෙදුම්වලට GPU නිදොසීමේ ස්තර පූරණයට ඉඩ දෙ."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"කවුළු සජීවිකරණ පරිමාණය"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 9f0a59d4edfe..fc30b702851a 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Vizuálne znázorňovať klepnutia"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Ukazovať obnovenia obsahu"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Rozblikať obsah okna pri aktualizácii"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Ukazovať obnovenia grafickým procesorom"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Rozblikať zobrazenia v oknách vykresľované grafickým procesorom"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Ukazovať obnovenia zobrazenia"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Rozblikať zobrazenia vo vykresľovaných oknách"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ukazovať obnovenia hardvérových vrstiev"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Rozblikať zelenou hardvérové vrstvy pri obnovení"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ladiť prekresľovanie grafickým procesorom"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Zobraziť vo výstrižku ohraničenie, okraje a pod."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Rozloženia sprava doľava"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Vynútiť pre všetky jazyky rozloženie obrazovky sprava doľava"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Vykresľovať grafickým procesorom"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Vynútiť použitie grafického procesora na dvojrozmerné vykresľovanie"</string>
<string name="force_msaa" msgid="7920323238677284387">"Vynútiť 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Povoliť 4x MSAA v aplikáciách OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Ladenie operácií s neobdĺžnikovými výstrižkami"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profil vykresľovania grafickým procesorom"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Vykresľovanie HWUI profilu"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Povoliť vrstvy ladenia grafického procesora"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Povoliť načítanie vrstiev ladenia grafického procesora na ladenie aplikácií"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Mierka animácie okna"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index c9e98bc4af26..458f7f1823a0 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Prikaz vizualnih povratnih informacij za dotike"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Pokaži posodob. površine"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Ob posodobitvi osvetli celotne površine oken"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Pokaži posod. pogleda GPE"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Osvetli poglede v oknih pri risanju z GPE"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Prikaži posodob. pogleda"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Osvetli poglede v oknih pri risanju"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Pokaži pos. sl. str. opr."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Obarvaj sloje strojne opreme zeleno ob posodobitvi"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Prekoračitev območja GPE"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Pokaži meje obrezovanja, obrobe ipd."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Vsili od desne proti levi"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Vsili smer postavitve na zaslonu od desne proti levi za vse jezike"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Vsili upodabljanje z GPE-jem"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Za risanje 2D vsili uporabo grafičnega procesorja"</string>
<string name="force_msaa" msgid="7920323238677284387">"Vsili 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"V aplikacijah OpenGL ES 2.0 omogoči 4x MSAA"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Odpr. težav s postopki nepravokotnega izrezovanja"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Upod. profilov z GPE"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Upodob. profilov s HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Omog. sloje odpr. nap. GPE"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Apl. za odpr. nap. dovoli nal. sloj. odpr. nap. GPE"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Merilo animacije okna"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index efc35ad86975..cab1201ec5a8 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Shfaq reagimet vizuale për trokitjet"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Shfaq përditësimet e sipërfaqes"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Ndriço të gjitha sipërfaqet e dritares kur ato të përditësohen"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Shfaq përditësimet e pamjes së GPU-së"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Ndriço pamjet brenda dritareve kur dizajnohen me GPU-në"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Shfaq përditësimet e pamjes"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Ndriço pamjet brenda dritareve kur dizajnohen"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Shfaq përditësimet e shtresave të harduerit"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Ndriço në të gjelbër shtresat e harduerit që përditësohen"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Korrigjo konfliktet e GPU-së"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Shfaq konturet e klipit, hapësirat etj."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Detyro drejtimin e shkrimit nga e djathta në të majtë"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Ndrysho me detyrim drejtimin e planit të ekranit nga e djathta në të majtë për të gjitha vendet"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Detyro interpretimin e GPU-së"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Detyro përdorimin e GPU-së për vizatimin e dytë"</string>
<string name="force_msaa" msgid="7920323238677284387">"Detyro 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Aktivizo 4x MSAA në aplikacionet OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Korrigjo veprimet mbi klipet jodrejtkëndore"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Interpretimi i profilit të GPU-së"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Interpretimi i profilit me HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Aktivizo shtresat e korrigjimit të GPU-së"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Lejo ngarkimin e shtresave të korrigjimit të GPU-së për aplikacionet e korrigjimit"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Animacioni i dritares"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 7cfcdd190c6d..d2ebb18399c5 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Приказуј визуелне повратне информације за додире"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Прикажи ажурирања површине"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Осветли све површине прозора када се ажурирају"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Прикажи ажур. GPU приказа"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Осветли приказе у прозор. када се црта са GPU-ом"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Прикажи ажурирања приказа"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Осветли приказе у прозорима када се црта"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Прикажи ажурирања хардверских слојева"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Хардверски слојеви трепере зелено када се ажурирају"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отклони грешке GPU преклапања"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Прикажи границе клипа, маргине итд."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Наметни смер распореда здесна налево"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Наметни смер распореда екрана здесна налево за све локалитете"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Принудни приказ пом. GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Принудно користи GPU за 2D цртање"</string>
<string name="force_msaa" msgid="7920323238677284387">"Наметни 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Омогући 4x MSAA у OpenGL ES 2.0 апликацијама"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Отклони грешке у вези са радњама за исецање области које нису правоугаоног облика"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Прикажи профил помоћу GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Прик. проф. помоћу HWUI-а"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Омогући слојеве за отклањање грешака GPU-a"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Омогући учитавање отк. греш. GPU-a у апл. за отк. греш."</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Размера анимације прозора"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 9293148912d9..0f33159281c1 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Visa visuell feedback för tryck"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Visa ytuppdateringar"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Hela fönstret blinkar vid uppdatering"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Visa GPU-visningsuppdateringar"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Visningar blinkar i fönster vid GPU-ritningar"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Visa visningsuppdatering"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Visningar blinkar i fönster vid ritningar"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Visa maskinvaruskiktuppd."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Låt maskinvaruskikt blinka grönt vid uppdateringar"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Felsök GPU-överritning"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Visa gränser för videoklipp, marginaler m.m."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Tvinga fram RTL-layout"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Tvinga fram RTL-skärmlayout (hö–vä) för alla språk"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Framtvinga GPU-rendering"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Tvingad användning av GPU för 2D-ritning"</string>
<string name="force_msaa" msgid="7920323238677284387">"Force 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Aktivera 4x MSAA i OpenGL ES 2.0-appar"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Felsök icke-rektangulära urklippsåtgärder"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profilens GPU-rendering"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profilens HWUI-rendering"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Aktivera GPU-felsökningslager"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Tillåt att felsökningsappar läser in GPU-felsökningslager"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Skala, fönsteranimering"</string>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index f13c2ea5b239..fdf9fd1a4246 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -59,7 +59,7 @@
<item msgid="45075631231212732">"Kila wakati tumia ukakuaji wa HDCP"</item>
</string-array>
<string-array name="bluetooth_avrcp_versions">
- <item msgid="5347678900838034763">"AVRCP 1.4 (Chaguo msingi)"</item>
+ <item msgid="5347678900838034763">"AVRCP 1.4 (Chaguomsingi)"</item>
<item msgid="2809759619990248160">"AVRCP 1.3"</item>
<item msgid="6199178154704729352">"AVRCP 1.5"</item>
<item msgid="5172170854953034852">"AVRCP 1.6"</item>
@@ -71,7 +71,7 @@
<item msgid="3422726142222090896">"avrcp16"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_titles">
- <item msgid="7065842274271279580">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>
+ <item msgid="7065842274271279580">"Tumia Uteuzi wa Mfumo (Chaguomsingi)"</item>
<item msgid="7539690996561263909">"SBC"</item>
<item msgid="686685526567131661">"AAC"</item>
<item msgid="5254942598247222737">"Sauti ya <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
@@ -81,7 +81,7 @@
<item msgid="3304843301758635896">"Zima Kodeki Zisizo za Lazima"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_summaries">
- <item msgid="5062108632402595000">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>
+ <item msgid="5062108632402595000">"Tumia Uteuzi wa Mfumo (Chaguomsingi)"</item>
<item msgid="6898329690939802290">"SBC"</item>
<item msgid="6839647709301342559">"AAC"</item>
<item msgid="7848030269621918608">"Sauti ya <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item>
@@ -91,38 +91,38 @@
<item msgid="741805482892725657">"Zima Kodeki Zisizo za Lazima"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_titles">
- <item msgid="3093023430402746802">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>
+ <item msgid="3093023430402746802">"Tumia Uteuzi wa Mfumo (Chaguomsingi)"</item>
<item msgid="8895532488906185219">"kHz 44.1"</item>
<item msgid="2909915718994807056">"kHz 48.0"</item>
<item msgid="3347287377354164611">"kHz 88.2"</item>
<item msgid="1234212100239985373">"kHz 96.0"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_sample_rate_summaries">
- <item msgid="3214516120190965356">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>
+ <item msgid="3214516120190965356">"Tumia Uteuzi wa Mfumo (Chaguomsingi)"</item>
<item msgid="4482862757811638365">"kHz 44.1"</item>
<item msgid="354495328188724404">"kHz 48.0"</item>
<item msgid="7329816882213695083">"kHz 88.2"</item>
<item msgid="6967397666254430476">"kHz 96.0"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_bits_per_sample_titles">
- <item msgid="2684127272582591429">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>
+ <item msgid="2684127272582591429">"Tumia Uteuzi wa Mfumo (Chaguomsingi)"</item>
<item msgid="5618929009984956469">"Biti 16 kwa kila sampuli"</item>
<item msgid="3412640499234627248">"Biti 24 kwa kila sampuli"</item>
<item msgid="121583001492929387">"Biti 32 kwa kila sampuli"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries">
- <item msgid="1081159789834584363">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>
+ <item msgid="1081159789834584363">"Tumia Uteuzi wa Mfumo (Chaguomsingi)"</item>
<item msgid="4726688794884191540">"Biti 16 kwa kila sampuli"</item>
<item msgid="305344756485516870">"Biti 24 kwa kila sampuli"</item>
<item msgid="244568657919675099">"Biti 32 kwa kila sampuli"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_channel_mode_titles">
- <item msgid="5226878858503393706">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>
+ <item msgid="5226878858503393706">"Tumia Uteuzi wa Mfumo (Chaguomsingi)"</item>
<item msgid="4106832974775067314">"Mono"</item>
<item msgid="5571632958424639155">"Stereo"</item>
</string-array>
<string-array name="bluetooth_a2dp_codec_channel_mode_summaries">
- <item msgid="4118561796005528173">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>
+ <item msgid="4118561796005528173">"Tumia Uteuzi wa Mfumo (Chaguomsingi)"</item>
<item msgid="8900559293912978337">"Mono"</item>
<item msgid="8883739882299884241">"Stereo"</item>
</string-array>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 6d5916b36fc2..2d752ea92d5d 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -138,7 +138,7 @@
<string name="user_guest" msgid="8475274842845401871">"Aliyealikwa"</string>
<string name="unknown" msgid="1592123443519355854">"Haijulikani"</string>
<string name="running_process_item_user_label" msgid="3129887865552025943">"Mtumiaji: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
- <string name="launch_defaults_some" msgid="313159469856372621">"Baadhi ya chaguo msingi zimewekwa"</string>
+ <string name="launch_defaults_some" msgid="313159469856372621">"Baadhi ya chaguomsingi zimewekwa"</string>
<string name="launch_defaults_none" msgid="4241129108140034876">"Hakuna chaguo-misingi zilizowekwa"</string>
<string name="tts_settings" msgid="8186971894801348327">"Mipangilio ya kusoma maandishi kwa sauti"</string>
<string name="tts_settings_title" msgid="1237820681016639683">"Kusoma maandishi kwa sauti"</string>
@@ -157,7 +157,7 @@
<string name="tts_engine_security_warning" msgid="8786238102020223650">"Hotuba hii inawezesha injini huenda ikaweza kukusanya maandishi ambayo yatazungumziwa, ikijumlisha data ya kibinafsi ya nenosiri na namba ya kaddi ya mkopo. Inatoka kwa injini ya <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> Wezesha matumizi ya hotuba hii iliyowezeshwa ya injini?"</string>
<string name="tts_engine_network_required" msgid="1190837151485314743">"Lugha hii inahitaji muunganisho wa mtandao unaofanya kazi ili kipengele cha kusoma maandishi kwa sauti kifanye kazi."</string>
<string name="tts_default_sample_string" msgid="4040835213373086322">"Huu ni mfano wa usanisi usemaji"</string>
- <string name="tts_status_title" msgid="7268566550242584413">"Hali ya lugha chaguo msingi"</string>
+ <string name="tts_status_title" msgid="7268566550242584413">"Hali ya lugha chaguomsingi"</string>
<string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> inaweza kutumiwa kikamilifu"</string>
<string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> inahitaji muunganisho wa mtandao"</string>
<string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> haiwezi kutumiwa"</string>
@@ -167,7 +167,7 @@
<string name="tts_engine_preference_section_title" msgid="448294500990971413">"Injini inayofaa"</string>
<string name="tts_general_section_title" msgid="4402572014604490502">"Kwa ujumla"</string>
<string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Weka upya mipangilio ya ubora wa matamshi"</string>
- <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Rejesha mipangilio ya ubora wa matamshi kuwa ya chaguo msingi."</string>
+ <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Rejesha mipangilio ya ubora wa matamshi kuwa ya chaguomsingi."</string>
<string-array name="tts_rate_entries">
<item msgid="6695494874362656215">"Polepole sana"</item>
<item msgid="4795095314303559268">"Polepole"</item>
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Onyesha ishara za kuthibitisha unapogusa"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Onyesha masasisho ya sehemu"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Angaza dirisha lote zitakaposasisha"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Onyesha masasisho ya mtazamo wa GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Kiwango cha maoni ndani ya madirisha wakati yanatolewa na GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Onyesha taarifa za kuonekana"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Angaza maoni ndani ya madirisha wakati yanatolewa"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Onyesha masasisho ya safu za maunzi"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Angaza kijani safu za maunzi zinaposasisha"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Tatua uondoaji wa GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Onyesha mipaka ya picha, kingo, nk."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Lazimisha uelekezaji wa muundo wa RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Lazimisha uelekezaji wa muundo wa skrini kwa RTL kwa lugha zote"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Lazimisha kutekeleza kwa GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Lazimisha matumizi ya GPU kwa uchoraji wa 2d"</string>
<string name="force_msaa" msgid="7920323238677284387">"Lazimisha 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Wezesha 4x MSAA katika programu za OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Tatua uendeshaji wa klipu usio mstatili"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Utekelezaji wa GPU ya wasifu"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Kutekeleza HWUI ya wasifu"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Ruhusu safu za utatuzi wa GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Ruhusu upakiaji wa safu za utatuzi wa GPU za programu za utatuzi"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Uhuishaji kwenye dirisha"</string>
@@ -333,7 +331,7 @@
<string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nenosiri jipya na uthibitisho havioani"</string>
<string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Imeshindwa kuweka nenosiri la hifadhi rudufu"</string>
<string-array name="color_mode_names">
- <item msgid="2425514299220523812">"Maridadi (chaguo msingi)"</item>
+ <item msgid="2425514299220523812">"Maridadi (chaguomsingi)"</item>
<item msgid="8446070607501413455">"Asili"</item>
<item msgid="6553408765810699025">"Muundo-msingi"</item>
</string-array>
@@ -412,7 +410,7 @@
<string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> zilizopita"</string>
<string name="remaining_length_format" msgid="7886337596669190587">"Zimesalia <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="screen_zoom_summary_small" msgid="5867245310241621570">"Ndogo"</string>
- <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Chaguo msingi"</string>
+ <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Chaguomsingi"</string>
<string name="screen_zoom_summary_large" msgid="4835294730065424084">"Kubwa"</string>
<string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Kubwa kiasi"</string>
<string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Kubwa zaidi"</string>
diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml
index 7b69c7859802..54adf826076c 100644
--- a/packages/SettingsLib/res/values-ta/arrays.xml
+++ b/packages/SettingsLib/res/values-ta/arrays.xml
@@ -22,7 +22,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="wifi_status">
<item msgid="1922181315419294640"></item>
- <item msgid="8934131797783724664">"ஸ்கேன் செய்கிறது…"</item>
+ <item msgid="8934131797783724664">"தேடுகிறது..."</item>
<item msgid="8513729475867537913">"இணைக்கிறது..."</item>
<item msgid="515055375277271756">"அங்கீகரிக்கிறது..."</item>
<item msgid="1943354004029184381">"IP முகவரியைப் பெறுகிறது…"</item>
@@ -36,7 +36,7 @@
</string-array>
<string-array name="wifi_status_with_ssid">
<item msgid="7714855332363650812"></item>
- <item msgid="8878186979715711006">"ஸ்கேன் செய்கிறது…"</item>
+ <item msgid="8878186979715711006">"தேடுகிறது..."</item>
<item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> இல் இணைக்கிறது…"</item>
<item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> உடன் அங்கீகரிக்கிறது…"</item>
<item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> இலிருந்து IP முகவரியைப் பெறுகிறது…"</item>
@@ -180,30 +180,30 @@
</string-array>
<string-array name="window_animation_scale_entries">
<item msgid="8134156599370824081">"அனிமேஷனை முடக்கு"</item>
- <item msgid="6624864048416710414">"அனிமேஷன் அளவு .5x"</item>
- <item msgid="2219332261255416635">"அனிமேஷன் அளவு 1x"</item>
- <item msgid="3544428804137048509">"அனிமேஷன் அளவு 1.5x"</item>
- <item msgid="3110710404225974514">"அனிமேஷன் அளவு 2x"</item>
- <item msgid="4402738611528318731">"அனிமேஷன் அளவு 5x"</item>
- <item msgid="6189539267968330656">"அனிமேஷன் அளவு 10x"</item>
+ <item msgid="6624864048416710414">"அனிமேஷன் வேகம் .5x"</item>
+ <item msgid="2219332261255416635">"அனிமேஷன் வேகம் 1x"</item>
+ <item msgid="3544428804137048509">"அனிமேஷன் வேகம் 1.5x"</item>
+ <item msgid="3110710404225974514">"அனிமேஷன் வேகம் 2x"</item>
+ <item msgid="4402738611528318731">"அனிமேஷன் வேகம் 5x"</item>
+ <item msgid="6189539267968330656">"அனிமேஷன் வேகம் 10x"</item>
</string-array>
<string-array name="transition_animation_scale_entries">
<item msgid="8464255836173039442">"அனிமேஷனை முடக்கு"</item>
- <item msgid="3375781541913316411">"அனிமேஷன் அளவு .5x"</item>
- <item msgid="1991041427801869945">"அனிமேஷன் அளவு 1x"</item>
- <item msgid="4012689927622382874">"அனிமேஷன் அளவு 1.5x"</item>
- <item msgid="3289156759925947169">"அனிமேஷன் அளவு 2x"</item>
- <item msgid="7705857441213621835">"அனிமேஷன் அளவு 5x"</item>
- <item msgid="6660750935954853365">"அனிமேஷன் அளவு 10x"</item>
+ <item msgid="3375781541913316411">"அனிமேஷன் வேகம் .5x"</item>
+ <item msgid="1991041427801869945">"அனிமேஷன் வேகம் 1x"</item>
+ <item msgid="4012689927622382874">"அனிமேஷன் வேகம் 1.5x"</item>
+ <item msgid="3289156759925947169">"அனிமேஷன் வேகம் 2x"</item>
+ <item msgid="7705857441213621835">"அனிமேஷன் வேகம் 5x"</item>
+ <item msgid="6660750935954853365">"அனிமேஷன் வேகம் 10x"</item>
</string-array>
<string-array name="animator_duration_scale_entries">
<item msgid="6039901060648228241">"அனிமேஷனை முடக்கு"</item>
- <item msgid="1138649021950863198">"அனிமேஷன் அளவு .5x"</item>
- <item msgid="4394388961370833040">"அனிமேஷன் அளவு 1x"</item>
- <item msgid="8125427921655194973">"அனிமேஷன் அளவு 1.5x"</item>
- <item msgid="3334024790739189573">"அனிமேஷன் அளவு 2x"</item>
- <item msgid="3170120558236848008">"அனிமேஷன் அளவு 5x"</item>
- <item msgid="1069584980746680398">"அனிமேஷன் அளவு 10x"</item>
+ <item msgid="1138649021950863198">"அனிமேஷன் வேகம் .5x"</item>
+ <item msgid="4394388961370833040">"அனிமேஷன் வேகம் 1x"</item>
+ <item msgid="8125427921655194973">"அனிமேஷன் வேகம் 1.5x"</item>
+ <item msgid="3334024790739189573">"அனிமேஷன் வேகம் 2x"</item>
+ <item msgid="3170120558236848008">"அனிமேஷன் வேகம் 5x"</item>
+ <item msgid="1069584980746680398">"அனிமேஷன் வேகம் 10x"</item>
</string-array>
<string-array name="overlay_display_devices_entries">
<item msgid="1606809880904982133">"ஏதுமில்லை"</item>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 7879c479162d..5f63fee33b43 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"தட்டல்களின் போது காட்சி அறிகுறிகளைக் காட்டு"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"மேலோட்ட புதுப்பிப்புகளைக் காட்டு"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"சாளரத்தின் பரப்புநிலைகள் புதுப்பிக்கப்படும்போது, அவற்றை முழுவதுமாகக் காட்டு"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU காட்சி புதுப்பிப்புகளைக் காட்டு"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU மூலம் வரையும்போது சாளரங்களில் காட்சிகளைக் காட்டு"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"வியூ அப்டேட்ஸைக் காட்டு"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"வரையும்போது, சாளரங்களில் காட்சிகளைக் காட்டு"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"வன்பொருள் லேயர்களின் புதுப்பிப்புகளைக் காட்டு"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"வன்பொருள் லேயர்களைப் புதுப்பிக்கும்போது, அவற்றைப் பச்சை நிறத்தில் காட்டு"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ஓவர்டிரா பிழைதிருத்து"</string>
@@ -300,16 +300,14 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"கிளிப் எல்லைகள், ஓரங்கள், மேலும் பலவற்றைக் காட்டு"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL தளவமைப்பின் திசையை வலியுறுத்து"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"எல்லா மொழிகளுக்கும் திரையின் தளவமைப்பு திசையை RTL க்கு மாற்று"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU காட்சியாக்கத்தை வலியுறுத்து"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2டி வரைபடத்திற்கு GPU பயன்பாட்டை வலியுறுத்து"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA ஐ வலியுறுத்து"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 பயன்பாடுகளில் 4x MSAA ஐ இயக்கு"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"செவ்வகம் அல்லாத கிளிப் செயல்பாடுகளைப் பிழைத்திருத்து"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"சுயவிவர GPU ரெண்டரிங்"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"சுயவிவர HWUI ரெண்டரிங்"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU பிழைத்திருத்த லேயர்களை இயக்கு"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"பிழைத்திருத்த ஆப்ஸிற்கு, GPU பிழைத்திருத்த லேயர்களை ஏற்றுவதற்கு அனுமதி"</string>
- <string name="window_animation_scale_title" msgid="6162587588166114700">"சாளர அனிமேஷன் அளவு"</string>
- <string name="transition_animation_scale_title" msgid="387527540523595875">"அனிமேஷன் மாற்றத்தின் அளவு"</string>
+ <string name="window_animation_scale_title" msgid="6162587588166114700">"சாளர அனிமேஷன் வேகம்"</string>
+ <string name="transition_animation_scale_title" msgid="387527540523595875">"அனிமேஷன் மாற்றத்தின் வேகம்"</string>
<string name="animator_duration_scale_title" msgid="3406722410819934083">"அனிமேட்டர் கால அளவு"</string>
<string name="overlay_display_devices_title" msgid="5364176287998398539">"இரண்டாம்நிலைக் காட்சிகளை உருவகப்படுத்து"</string>
<string name="debug_applications_category" msgid="4206913653849771549">"ஆப்ஸ்"</string>
@@ -360,7 +358,7 @@
<string name="picture_color_mode" msgid="4560755008730283695">"படத்தின் வண்ணப் பயன்முறை"</string>
<string name="picture_color_mode_desc" msgid="1141891467675548590">"sRGBஐப் பயன்படுத்தும்"</string>
<string name="daltonizer_mode_disabled" msgid="7482661936053801862">"முடக்கப்பட்டது"</string>
- <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"மோனோகுரோமசி"</string>
+ <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"ஒற்றை நிறத் தன்மை"</string>
<string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"நிறம் அடையாளங்காண முடியாமை (சிவப்பு-பச்சை)"</string>
<string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"நிறம் அடையாளங்காண முடியாமை (சிவப்பு-பச்சை)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"நிறம் அடையாளங்காண முடியாமை (நீலம்-மஞ்சள்)"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 041f27cbfd22..c30b9cd65309 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"నొక్కినప్పుడు దృశ్యపరమైన ప్రతిస్పందన చూపు"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"సర్ఫేస్ అప్‌డేట్‌లను చూపండి"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"పూర్తి విండో ఉపరితలాలు అప్‌డేట్‌ చేయబడినప్పుడు వాటిని ఫ్లాష్ చేయండి"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU వీక్షణ అప్‌డేట్‌లను చూపు"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPUతో డ్రా చేసినప్పుడు విండోల లోపలి వీక్షణలను ఫ్లాష్ చేయి"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"వీక్షణ అప్‌డేట్‌లను చూపు"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"గీసినప్పుడు విండోల లోపల వీక్షణలను ఫ్లాష్ చేయి"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"హార్డ్‌వేర్ లేయర్‌ల అప్‌డేట్‌లను చూపు"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"హార్డ్‌వేర్ లేయర్‌లు అప్‌డేట్‌ చేయబడినప్పుడు వాటిని ఆకుపచ్చ రంగులో ఫ్లాష్ చేయి"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ఓవర్‌డ్రాను డీబగ్ చేయండి"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"క్లిప్ సరిహద్దులు, అంచులు మొ. చూపు"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL లేఅవుట్ దిశను నిర్భందం చేయండి"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"అన్ని లొకేల్‌ల కోసం RTLకి స్క్రీన్ లేఅవుట్ దిశను నిర్భందించు"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"తప్పనిసరి GPU రెండరింగ్"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d డ్రాయింగ్ కోసం GPU నిర్భంద వినియోగం"</string>
<string name="force_msaa" msgid="7920323238677284387">"నిర్భందం 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 యాప్‌లలో 4x MSAAను ప్రారంభించండి"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"దీర్ఘ చతురస్రం కాని క్లిప్ చర్యలను డీబగ్ చేయండి"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"ప్రొఫైల్ GPU రెండరింగ్"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"ప్రొఫైల్ HWUI రెండరింగ్"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU డీబగ్ లేయర్‌లను ప్రారంభించండి"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"డీబగ్ యాప్‌ల కోసం GPU డీబగ్ లేయర్‌లను లోడ్ చేయడాన్ని అనుమతించండి"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"విండో యానిమేషన్ ప్రమాణం"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index ee857ad58d29..b937a7d285a1 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"แสดงความคิดเห็นด้วยภาพสำหรับการแตะ"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"แสดงการอัปเดตพื้นผิว"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"แฟลชพื้นผิวหน้าต่างทั้งหมดเมื่อมีการอัปเดต"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"แสดงการอัปเดตมุมมอง GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"แฟลชมุมมองภายในหน้าต่างเมื่อวาดด้วย GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"แสดงมุมมองการอัปเดต"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"แสดงมุมมองภายในหน้าต่างขณะลาก"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"แสดงอัปเดตเลเยอร์ฮาร์ดแวร์"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"เลเยอร์ฮาร์ดแวร์กะพริบเป็นสีเขียว เมื่อมีการอัปเดต"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"แก้ปัญหาการแสดงพิกเซลซ้ำด้วย GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"แสดงหน้าปกคลิป ขอบ ฯลฯ"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"บังคับทิศทางการจัดวาง RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"บังคับทิศทางการจัดวางหน้าจอเป็น RTL สำหรับทุกภาษา"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"เร่งการแสดงผลของ GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"ต้องใช้ GPU สำหรับการวาดภาพ 2 มิติ"</string>
<string name="force_msaa" msgid="7920323238677284387">"บังคับใช้ 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"เปิดใช้งาน 4x MSAA ในแอปพลิเคชัน OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"แก้ไขการทำงานของคลิปที่ไม่ใช่สี่เหลี่ยม"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"การแสดงผล GPU ตามโปรไฟล์"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"การแสดงผล HWUI ตามโปรไฟล์"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"เปิดใช้เลเยอร์การแก้ไขข้อบกพร่อง GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"อนุญาตให้โหลดเลเยอร์การแก้ไขข้อบกพร่อง GPU สำหรับแอปแก้ไขข้อบกพร่อง"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"อัตราการเคลื่อนไหวของหน้าต่าง"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index a6242bf256c9..2e62dc081da6 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Ipakita ang visual na feedback para sa mga pag-tap"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Ipakita update sa surface"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"I-flash ang buong window surface kapag nag-update"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Ipakita GPU view update"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"I-flash ang view sa windows kapag ginuhit sa GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Ipakita update ng view"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"I-flash mga view sa loob ng window kapag na-draw"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ipakita ang mga update ng hardware layers"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"I-flash nang berde ang hardware layer pag nag-update ito"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"I-debug ang GPU overdraw"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Ipakita ang mga hangganan ng clip, margin, atbp."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Ipilit ang RTL na dir. ng layout"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Ipilit ang RTL na direksyon ng screen layout sa lahat ng lokal"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Ipilit ang pag-render ng GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Sapilitang paggamit sa GPU para sa 2d na pagguhit"</string>
<string name="force_msaa" msgid="7920323238677284387">"Puwersahin ang 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Paganahin ang 4x MSAA sa OpenGL ES 2.0 na apps"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"I-debug ang di-parihabang mga clip operation"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Pag-render ng Profile GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Rendering ng Profile HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"I-enable ang GPU debug layer"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Payagang i-load ang GPU debug layer sa debug app"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Scale ng window animation"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 7ceea17db78c..0995a804902c 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Dokunmalarda görsel geri bildirim göster"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Yüzey güncellemelerini göster"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Güncellenirken tüm pencere yüzeylerini yakıp söndür"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU görünüm güncellemelerini göster"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU ile çizim yapılırken pencerelerdeki görünümleri çiz"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Görünüm güncellemelerini göster"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Çizim yapılırken görünümleri pencerede çiz"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Donanım katmanı güncellemelerini göster"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash donanım katmanları güncellendiğinde yeşildir"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU fazla çizim hatasını ayıkla"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Klip sınırlarını, kenar boşluklarını vb. göster"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Sağdan sola düzenini zorla"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Tüm yerel ayarlar için sağdan sola ekran düzenini zorlar"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU oluşturmayı zorla"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"2D çizimde GPU kullanımını zorla"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAA\'yı zorla"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 uygulamalarda 4x MSAA\'yı etkinleştir"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Dikdörtgen olmayan kırpma işlemlerinde hata ayıkla"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Profil GPU oluşturma"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Profil HWUI oluşturma"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU hata ayıklama katmanlarını etkinleştir"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Hata ayıklama uygulamaları için GPU hata ayıklama katmanlarının yüklenmesine izin ver"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Pencere animasyonu ölçeği"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 70f949616ede..06fe03676b58 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Показувати візуальну реакцію на торкання"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Показ. оновлення поверхні"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Підсвічувати вікна повністю під час оновлення"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Показувати оновл. екрана"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Підсвічув. область у вікні під час рисування з GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Показувати оновлення областей"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Підсвічувати оновлені області у вікнах"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Показ. апаратні оновлення"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Виділяти апаратні рівні зеленим під час оновлення"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Налагодити накладання GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Показувати межі роликів, поля тощо"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Макет письма справа наліво"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Застосовувати макет письма справа наліво для всіх мов"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Примусова візуалізація GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Примусово використовувати GPU для 2D-малювання"</string>
<string name="force_msaa" msgid="7920323238677284387">"Примус. запустити 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Увімкнути 4x MSAA в програмах OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Налагодити операції непрямокутної обрізки"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Запис часу роботи GPU"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Обробка HWUI за профілем"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Увімкнути шари налагодження ГП"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Дозвольте завантажувати шари налагодження ГП для додатків налагодження"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Анімація вікон"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 1ebf4bcb7ad5..6b33df7b3d01 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"تھپتھپاہٹوں کیلئے بصری تاثرات دکھائیں"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"سطح کے اپ ڈیٹس دکھائیں"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"اپ ڈیٹ ہونے پر ونڈو کی پوری سطحیں جھلملائیں"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"‏GPU منظر اپ ڈیٹس دکھائیں"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"‏GPU کے ساتھ تیار ہونے پر ملاحظات ونڈوز کے اندر جھلملائیں"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"منظر کے اپ ڈیٹس دکھائیں"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"تیار ہونے پر ملاحظات ونڈوز کے اندر جھلملائیں"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ہارڈویئر پرتوں کی اپ ڈیٹس دکھائیں"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ہارڈویئر پرتیں اپ ڈیٹ ہونے پر سبز رنگ میں جھلملائیں"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"‏GPU اوور ڈرا کو ڈیبگ کریں"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"کلپ باؤنڈز، حاشیے وغیرہ دکھائیں"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"‏RTL لے آؤٹ سمت زبردستی نافذ کریں"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"‏سبھی زبانوں کیلئے اسکرین لے آؤٹ کی سمت کو RTL پر مجبور کریں"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"‏GPU رینڈرنگ زبردستی نافذ کریں"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"‏2D ڈرائنگ کیلئے GPU کا استعمال زبردستی نافذ کریں"</string>
<string name="force_msaa" msgid="7920323238677284387">"‏4x MSAA زبردستی نافذ کریں"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"‏OpenGL ES 2.0 ایپس میں 4x MSAA فعال کریں"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"غیر مستطیل نما کلپ آپریشنز ڈیبگ کریں"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"‏پروفائل GPU رینڈرنگ"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"‏پروفائل HWUI رینڈرنگ"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"‏GPU ڈیبگ پرتیں فعال کریں"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"‏ڈیبگ ایپس کیلئے GPU ڈیبگ پرتوں کو لوڈ کرنے دیں"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"ونڈو اینیمیشن اسکیل"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 395be1d27688..fdb6bb6d7714 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Ekranda bosilgan joylardagi nuqtalarni ko‘rsatish"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Yuza yangilanishlarini ko‘rsatish"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Yangilangandan so‘ng to‘liq oyna sirtlarini miltillatish"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Ekran yangilanishlarini ko‘rsatish"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU bilan chizishda ekran hududini miltillatish"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Yangilash oynasini ochish"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Chizish paytida ekran sohasining miltillashi"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Apparatli yangilanishlarni ko‘rsatish"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Yangilanganda apparatli darajalarni yashil bilan belgilash"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ortiqcha chiziqlarini o‘chirish"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Klip, maydon va h.k. chegaralarini ko‘rsatish"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"O‘ngdan chapga qarab yozish"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Barcha tillarda o‘ngdan chapga qarab yozish"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"GPU yordamida tezlatish"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Ikki o‘lchamli chizma uchun doim GPU ishlatilsin"</string>
<string name="force_msaa" msgid="7920323238677284387">"4x MSAAni yoqish"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ilovasidan 4x MSAAni yoqish"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"To‘g‘ri burchakli bo‘lmagan kesishma amallarini tuzatish"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU ish vaqtini yozib olish"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI ishlash vaqtining hisobi"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Grafik protsessorni tuzatish"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Grafik protsessorni tuzatish qatlamlarini yuklashni yoqish"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Oynalar animatsiyasi"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 051b0373fb2a..88721084385b 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Hiển thị phản hồi trực quan cho các lần nhấn"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Hiển thị bản cập nhật giao diện"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Chuyển nhanh toàn bộ các giao diện cửa sổ khi các giao diện này cập nhật"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Hiện cập nhật giao diện GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Chuyển nhanh chế độ xem trong cửa sổ khi được vẽ bằng GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Hiện cập nhật chế độ xem"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Chuyển nhanh chế độ xem trong cửa sổ khi được vẽ"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hiện bản cập nhật lớp phần cứng"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Lớp phần cứng flash có màu xanh khi chúng cập nhật"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Gỡ lỗi mức vẽ quá GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Hiển thị viền đoạn video, lề, v.v.."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Buộc hướng bố cục phải sang trái"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Buộc hướng bố cục màn hình phải sang trái cho tất cả ngôn ngữ"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Bắt buộc kết xuất GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Bắt buộc sử dụng GPU cho bản vẽ 2d"</string>
<string name="force_msaa" msgid="7920323238677284387">"Bắt buộc 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Bật 4x MSAA trong ứng dụng OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Gỡ lỗi hoạt động của clip không phải là hình chữ nhật"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Kết xuất GPU cấu hình"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Kết xuất HWUI cấu hình"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Bật lớp gỡ lỗi GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Cho phép tải lớp gỡ lỗi GPU cho ứng dụng gỡ lỗi"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Tỷ lệ hình động của cửa sổ"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index fd6e6ef03e2a..addad73474c9 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"显示点按操作的视觉反馈"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"显示面 (surface) 更新"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"窗口中的面 (surface) 更新时全部闪烁"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"显示 GPU 视图更新"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"使用 GPU 进行绘图时闪烁显示窗口中的视图"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"显示视图更新"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"绘图时闪烁显示窗口中的视图"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"显示硬件层更新"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash 硬件层在进行更新时会显示为绿色"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"调试 GPU 过度绘制"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"显示剪辑边界、边距等。"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"强制使用从右到左的布局方向"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"强制将所有语言区域的屏幕布局方向改为从右到左"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"强制进行 GPU 渲染"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"强制使用 GPU 进行 2D 绘图"</string>
<string name="force_msaa" msgid="7920323238677284387">"强制启用 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"在 OpenGL ES 2.0 应用中启用 4x MSAA"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"调试非矩形剪裁操作"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"GPU 渲染模式分析"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"HWUI 呈现模式分析"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"启用 GPU 调试层"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"允许为调试应用加载 GPU 调试层"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"窗口动画缩放"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index f9f5e63011ff..8054548f96fe 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"顯示輕按位置的視覺回應"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"顯示表層更新"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"更新表層時閃動整個視窗表層"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"顯示 GPU 畫面更新"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"使用 GPU 繪圖時在視窗中閃動畫面"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"顯示畫面更新"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"繪圖時在視窗中閃爍顯示畫面"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"顯示硬件層更新"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"在硬件層更新時閃動綠燈"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU 透支偵錯"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"顯示剪輯範圍、邊界等"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"強制使用從右至左的版面配置方向"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"強制將所有語言代碼的畫面配置方向改為從右至左"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"強制使用 GPU 轉譯"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"強制使用 GPU 進行 2D 繪圖"</string>
<string name="force_msaa" msgid="7920323238677284387">"強制 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"在 OpenGL ES 2.0 應用程式中啟用 4x MSAA"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"對非矩形裁剪操作進行偵錯"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"分析 GPU 轉譯"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"分析 HWUI 轉譯"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"啟用 GPU 偵錯圖層"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"允許為偵錯應用程式載入 GPU 偵錯圖層"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"視窗動畫比例"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index e884afcb00d5..95d8b5d4acd4 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"顯示觸控位置的視覺回應"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"顯示表層更新"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"更新表層時閃爍顯示整個視窗表層"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"顯示 GPU 畫面更新"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"使用 GPU 繪圖時在視窗中閃爍顯示畫面"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"顯示畫面更新"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"繪圖時在視窗中閃爍顯示畫面"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"顯示硬體層更新"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"在硬體層更新時閃綠燈"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"針對 GPU 重複繪圖進行偵錯"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"顯示剪輯範圍、邊界等。"</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"強制使用從右至左版面配置方向"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"強制將所有語言代碼的畫面配置方向改為從右至左"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"強制使用 GPU 轉譯"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"強制使用 GPU 進行 2D 繪圖"</string>
<string name="force_msaa" msgid="7920323238677284387">"強制 4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"在 OpenGL ES 2.0 應用程式中啟用 4x MSAA"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"針對非矩形裁剪操作進行偵錯"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"剖析 GPU 轉譯"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"剖析 HWUI 轉譯"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"啟用 GPU 偵錯圖層"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"允許載入 GPU 偵錯圖層為應用程式偵錯"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"視窗動畫比例"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 6784b342a538..541c5883d51b 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -285,8 +285,8 @@
<string name="show_touches_summary" msgid="6101183132903926324">"Bonisa izmpendulo ebukekayo ngamathebhu"</string>
<string name="show_screen_updates" msgid="5470814345876056420">"Buka izibuyekezo ezibonakalayo"</string>
<string name="show_screen_updates_summary" msgid="2569622766672785529">"Khanyisa ukubonakala kwalo lonke iwindi uma libuyekezwa"</string>
- <string name="show_hw_screen_updates" msgid="5036904558145941590">"Buka izibuyekezo ze-GPU"</string>
- <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Ukubuka okukhanyayo phakathi kwamawindi uma kudwetshwe nge-GPU"</string>
+ <string name="show_hw_screen_updates" msgid="4117270979975470789">"Bonisa izibuyekezo zokubuka"</string>
+ <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Ukubukwa kwe-flash ngaphakathi kwamawindi uma adwetshiwe"</string>
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Bonisa izibuyekezo zezendlalelo izingxenyekazi zekhompyutha"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Izendlalelo zengxenyekazi zekhompyutha eziluhlaza uma zibuyekeza"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Susa iphutha lokukhipha okungaphezulu kwe-GPU"</string>
@@ -300,12 +300,10 @@
<string name="debug_layout_summary" msgid="2001775315258637682">"Bonisa imikhawulo, imiphetho, njll, yesiqeshana."</string>
<string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Phoqelela isikhombisi-ndlela sesakhiwo se-RTL"</string>
<string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Phoqelela isikhombisi-ndlela sesikrini ku-RTL kuzo zonke izifunda"</string>
- <string name="force_hw_ui" msgid="6426383462520888732">"Phoqa ukunikeza i-GPU"</string>
- <string name="force_hw_ui_summary" msgid="5535991166074861515">"Phoqelela ukusetshenziswa kwe-GPU ngomdwebo we-2d"</string>
<string name="force_msaa" msgid="7920323238677284387">"Phoqelela i-4x MSAA"</string>
<string name="force_msaa_summary" msgid="9123553203895817537">"Nika amandla i-4x MSAA ezinhlelweni zokusebenza ze-OpenGL ES 2.0"</string>
<string name="show_non_rect_clip" msgid="505954950474595172">"Susa iphutha ekusebenzeniokungekhona unxantathu kwesiqeshana"</string>
- <string name="track_frame_time" msgid="6146354853663863443">"Iphrofayela ye-GPU iyasebenzeka"</string>
+ <string name="track_frame_time" msgid="6094365083096851167">"Inikezela iphrofayela ye-HWUI"</string>
<string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Nika amandla izendlalelo zokususa amaphutha ze-GPU"</string>
<string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Vumela izendlalelo zokususa amaphutha ze-GPU ngezinhlelo zokusebenza zokususa amaphutha"</string>
<string name="window_animation_scale_title" msgid="6162587588166114700">"Iwindi yesilinganisi sesithombe esinyakazayo"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 63b7b19b748f..ef7d9ce3058f 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -723,9 +723,9 @@
<string name="show_screen_updates_summary">Flash entire window surfaces when they update</string>
<!-- UI debug setting: show where window updates happen with GPU rendering? [CHAR LIMIT=25] -->
- <string name="show_hw_screen_updates">Show GPU view updates</string>
+ <string name="show_hw_screen_updates">Show view updates</string>
<!-- UI debug setting: show GPU rendering screen updates summary [CHAR LIMIT=50] -->
- <string name="show_hw_screen_updates_summary">Flash views inside windows when drawn with the GPU</string>
+ <string name="show_hw_screen_updates_summary">Flash views inside windows when drawn</string>
<!-- UI debug setting: show when hardware layers get updated [CHAR LIMIT=25] -->
<string name="show_hw_layers_updates">Show hardware layers updates</string>
@@ -761,11 +761,6 @@
<!-- UI debug setting: force right to left layout summary [CHAR LIMIT=100] -->
<string name="force_rtl_layout_all_locales_summary">Force screen layout direction to RTL for all locales</string>
- <!-- UI debug setting: force hardware acceleration to render apps [CHAR LIMIT=25] -->
- <string name="force_hw_ui">Force GPU rendering</string>
- <!-- UI debug setting: force hardware acceleration summary [CHAR LIMIT=50] -->
- <string name="force_hw_ui_summary">Force use of GPU for 2d drawing</string>
-
<!-- UI debug setting: force anti-aliasing to render apps [CHAR LIMIT=25] -->
<string name="force_msaa">Force 4x MSAA</string>
<!-- UI debug setting: force anti-aliasing summary [CHAR LIMIT=50] -->
@@ -775,7 +770,7 @@
<string name="show_non_rect_clip">Debug non-rectangular clip operations</string>
<!-- UI debug setting: profile time taken by hardware acceleration to render apps [CHAR LIMIT=25] -->
- <string name="track_frame_time">Profile GPU rendering</string>
+ <string name="track_frame_time">Profile HWUI rendering</string>
<!-- UI debug setting: enable gpu debug layers [CHAR LIMIT=25] -->
<string name="enable_gpu_debug_layers">Enable GPU debug layers</string>
diff --git a/packages/SettingsLib/res/values/styles_support_preference.xml b/packages/SettingsLib/res/values/styles_support_preference.xml
index 59de6c904e89..5d787f85e3ab 100644
--- a/packages/SettingsLib/res/values/styles_support_preference.xml
+++ b/packages/SettingsLib/res/values/styles_support_preference.xml
@@ -20,82 +20,14 @@
<dimen name="preference_no_icon_padding_start">72dp</dimen>
- <!-- Fragment style -->
- <style name="PreferenceFragmentStyle.SettingsBase" parent="@*android:style/PreferenceFragment.Material">
- <item name="allowDividerAfterLastItem">false</item>
- </style>
-
- <!-- Preferences -->
- <style name="Preference.SettingsBase" parent="@style/Preference.Material">
- <item name="allowDividerAbove">false</item>
- <item name="allowDividerBelow">true</item>
- <item name="singleLineTitle">false</item>
- <item name="iconSpaceReserved">true</item>
- </style>
-
- <!-- Preference category -->
- <style name="Preference.Category.SettingsBase" parent="@style/Preference.Category.Material">
- <item name="allowDividerAbove">true</item>
- <item name="allowDividerBelow">true</item>
- <item name="android:layout">@layout/preference_category_material_settings</item>
- </style>
-
- <!-- Preference screen -->
- <style name="Preference.Screen.SettingsBase" parent="@style/Preference.PreferenceScreen.Material">
- <item name="allowDividerAbove">false</item>
- <item name="allowDividerBelow">true</item>
- <item name="iconSpaceReserved">true</item>
- </style>
-
<!-- Footer Preferences -->
- <style name="Preference.FooterPreference.SettingsBase" parent="Preference.SettingsBase">
+ <style name="Preference.FooterPreference.SettingsBase" parent="@style/Preference.Material">
<item name="android:layout">@layout/preference_footer</item>
<item name="allowDividerAbove">true</item>
</style>
- <!-- Dropdown Preferences -->
- <style name="Preference.DropdownPreference.SettingsBase" parent="Preference.SettingsBase">
- <item name="android:layout">@layout/preference_dropdown_material_settings</item>
- </style>
-
- <!-- Switch Preferences -->
- <style name="Preference.SwitchPreference.SettingsBase" parent="@style/Preference.SwitchPreference.Material">
- <item name="allowDividerAbove">false</item>
- <item name="allowDividerBelow">true</item>
- <item name="iconSpaceReserved">true</item>
- <item name="singleLineTitle">false</item>
- </style>
-
- <!-- CheckBox Preferences -->
- <style name="Preference.CheckBoxPreference.SettingsBase" parent="@style/Preference.CheckBoxPreference.Material">
- <item name="allowDividerAbove">false</item>
- <item name="allowDividerBelow">true</item>
- <item name="iconSpaceReserved">true</item>
- <item name="singleLineTitle">false</item>
- </style>
-
- <!-- EditText Preferences -->
- <style name="Preference.EditTextPreference.SettingsBase"
- parent="@style/Preference.DialogPreference.EditTextPreference.Material">
- <item name="allowDividerAbove">false</item>
- <item name="allowDividerBelow">true</item>
- <item name="iconSpaceReserved">true</item>
- <item name="singleLineTitle">false</item>
- </style>
-
<style name="PreferenceThemeOverlay.SettingsBase" parent="@style/PreferenceThemeOverlay.v14.Material">
- <!-- Parent path frameworks/support/v14/preference/res/values/themes.xml -->
- <item name="android:scrollbars">vertical</item>
- <item name="preferenceFragmentStyle">@style/PreferenceFragmentStyle.SettingsBase</item>
- <item name="preferenceCategoryStyle">@style/Preference.Category.SettingsBase</item>
- <item name="preferenceScreenStyle">@style/Preference.Screen.SettingsBase</item>
- <item name="preferenceStyle">@style/Preference.SettingsBase</item>
- <item name="dialogPreferenceStyle">@style/Preference.SettingsBase</item>
- <item name="editTextPreferenceStyle">@style/Preference.EditTextPreference.SettingsBase</item>
<item name="footerPreferenceStyle">@style/Preference.FooterPreference.SettingsBase</item>
- <item name="switchPreferenceStyle">@style/Preference.SwitchPreference.SettingsBase</item>
- <item name="checkBoxPreferenceStyle">@style/Preference.CheckBoxPreference.SettingsBase</item>
- <item name="dropdownPreferenceStyle">@style/Preference.DropdownPreference.SettingsBase</item>
</style>
-</resources> \ No newline at end of file
+</resources>
diff --git a/packages/SettingsLib/search/Android.mk b/packages/SettingsLib/search/Android.mk
new file mode 100644
index 000000000000..cb1989157db8
--- /dev/null
+++ b/packages/SettingsLib/search/Android.mk
@@ -0,0 +1,33 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE = SettingsLib-search
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE = SettingsLib-search-host
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+include $(BUILD_HOST_JAVA_LIBRARY)
+
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE = SettingsLib-annotation-processor
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ javapoet-prebuilt-jar \
+ SettingsLib-search-host
+
+LOCAL_SRC_FILES := $(call all-java-files-under, processor-src)
+
+LOCAL_JAVA_RESOURCE_DIRS := \
+ resources
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/packages/SettingsLib/search/common.mk b/packages/SettingsLib/search/common.mk
new file mode 100644
index 000000000000..05226db5cb91
--- /dev/null
+++ b/packages/SettingsLib/search/common.mk
@@ -0,0 +1,10 @@
+# Include this file to generate SearchIndexableResourcesImpl
+
+LOCAL_ANNOTATION_PROCESSORS += \
+ SettingsLib-annotation-processor
+
+LOCAL_ANNOTATION_PROCESSOR_CLASSES += \
+ com.android.settingslib.search.IndexableProcessor
+
+LOCAL_STATIC_JAVA_LIBRARIES += \
+ SettingsLib-search
diff --git a/packages/SettingsLib/search/processor-src/com/android/settingslib/search/IndexableProcessor.java b/packages/SettingsLib/search/processor-src/com/android/settingslib/search/IndexableProcessor.java
new file mode 100644
index 000000000000..10fc685015b7
--- /dev/null
+++ b/packages/SettingsLib/search/processor-src/com/android/settingslib/search/IndexableProcessor.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.search;
+
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.FieldSpec;
+import com.squareup.javapoet.JavaFile;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterizedTypeName;
+import com.squareup.javapoet.TypeName;
+import com.squareup.javapoet.TypeSpec;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.Filer;
+import javax.annotation.processing.Messager;
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedAnnotationTypes;
+import javax.annotation.processing.SupportedSourceVersion;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.Modifier;
+import javax.lang.model.element.Name;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.util.SimpleElementVisitor8;
+import javax.tools.Diagnostic.Kind;
+
+/**
+ * Annotation processor for {@link SearchIndexable} that generates {@link SearchIndexableResources}
+ * subclasses.
+ */
+@SupportedSourceVersion(SourceVersion.RELEASE_8)
+@SupportedAnnotationTypes({"com.android.settingslib.search.SearchIndexable"})
+public class IndexableProcessor extends AbstractProcessor {
+
+ private static final String PACKAGE = "com.android.settingslib.search";
+ private static final String CLASS_BASE = "SearchIndexableResourcesBase";
+ private static final String CLASS_MOBILE = "SearchIndexableResourcesMobile";
+ private static final String CLASS_TV = "SearchIndexableResourcesTv";
+ private static final String CLASS_WEAR = "SearchIndexableResourcesWear";
+ private static final String CLASS_AUTO = "SearchIndexableResourcesAuto";
+ private static final String CLASS_ARC = "SearchIndexableResourcesArc";
+
+ private Filer mFiler;
+ private Messager mMessager;
+ private boolean mRanOnce;
+
+ @Override
+ public boolean process(Set<? extends TypeElement> annotations,
+ RoundEnvironment roundEnvironment) {
+ if (mRanOnce) {
+ // Will get called once per round, but we only want to run on the first one.
+ return true;
+ }
+ mRanOnce = true;
+
+ final FieldSpec providers = FieldSpec.builder(
+ ParameterizedTypeName.get(
+ ClassName.get(Set.class),
+ TypeName.get(Class.class)),
+ "mProviders",
+ Modifier.PRIVATE, Modifier.FINAL)
+ .initializer("new $T()", HashSet.class)
+ .build();
+
+ final MethodSpec addIndex = MethodSpec.methodBuilder("addIndex")
+ .addModifiers(Modifier.PUBLIC)
+ .addParameter(ClassName.get(Class.class), "indexClass")
+ .addCode("$N.add(indexClass);\n", providers)
+ .build();
+
+ final MethodSpec.Builder baseConstructorBuilder = MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC);
+ final MethodSpec.Builder mobileConstructorBuilder = MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC);
+ final MethodSpec.Builder tvConstructorBuilder = MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC);
+ final MethodSpec.Builder wearConstructorBuilder = MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC);
+ final MethodSpec.Builder autoConstructorBuilder = MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC);
+ final MethodSpec.Builder arcConstructorBuilder = MethodSpec.constructorBuilder()
+ .addModifiers(Modifier.PUBLIC);
+
+ for (Element element : roundEnvironment.getElementsAnnotatedWith(SearchIndexable.class)) {
+ if (element.getKind().isClass()) {
+ Name className = element.accept(new SimpleElementVisitor8<Name, Void>() {
+ @Override
+ public Name visitType(TypeElement typeElement, Void aVoid) {
+ return typeElement.getQualifiedName();
+ }
+ }, null);
+ if (className != null) {
+ SearchIndexable searchIndexable = element.getAnnotation(SearchIndexable.class);
+
+ int forTarget = searchIndexable.forTarget();
+ if (forTarget == SearchIndexable.ALL) {
+ baseConstructorBuilder.addCode("$N($L.class);\n", addIndex, className);
+ } else if ((forTarget & SearchIndexable.MOBILE) != 0) {
+ mobileConstructorBuilder.addCode("$N($L.class);\n", addIndex, className);
+ } else if ((forTarget & SearchIndexable.TV) != 0) {
+ tvConstructorBuilder.addCode("$N($L.class);\n", addIndex, className);
+ } else if ((forTarget & SearchIndexable.WEAR) != 0) {
+ wearConstructorBuilder.addCode("$N($L.class);\n", addIndex, className);
+ } else if ((forTarget & SearchIndexable.AUTO) != 0) {
+ autoConstructorBuilder.addCode("$N($L.class);\n", addIndex, className);
+ } else if ((forTarget & SearchIndexable.ARC) != 0) {
+ arcConstructorBuilder.addCode("$N($L.class);\n", addIndex, className);
+ }
+ } else {
+ throw new IllegalStateException("Null classname from " + element);
+ }
+ }
+ }
+
+ final MethodSpec getProviderValues = MethodSpec.methodBuilder("getProviderValues")
+ .addAnnotation(Override.class)
+ .addModifiers(Modifier.PUBLIC)
+ .returns(ParameterizedTypeName.get(
+ ClassName.get(Collection.class),
+ TypeName.get(Class.class)))
+ .addCode("return $N;\n", providers)
+ .build();
+
+ final TypeSpec baseClass = TypeSpec.classBuilder(CLASS_BASE)
+ .addModifiers(Modifier.PUBLIC)
+ .addSuperinterface(ClassName.get(SearchIndexableResources.class))
+ .addField(providers)
+ .addMethod(baseConstructorBuilder.build())
+ .addMethod(addIndex)
+ .addMethod(getProviderValues)
+ .build();
+ final JavaFile searchIndexableResourcesBase = JavaFile.builder(PACKAGE, baseClass).build();
+
+ final JavaFile searchIndexableResourcesMobile = JavaFile.builder(PACKAGE,
+ TypeSpec.classBuilder(CLASS_MOBILE)
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(ClassName.get(PACKAGE, baseClass.name))
+ .addMethod(mobileConstructorBuilder.build())
+ .build())
+ .build();
+
+ final JavaFile searchIndexableResourcesTv = JavaFile.builder(PACKAGE,
+ TypeSpec.classBuilder(CLASS_TV)
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(ClassName.get(PACKAGE, baseClass.name))
+ .addMethod(tvConstructorBuilder.build())
+ .build())
+ .build();
+
+ final JavaFile searchIndexableResourcesWear = JavaFile.builder(PACKAGE,
+ TypeSpec.classBuilder(CLASS_WEAR)
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(ClassName.get(PACKAGE, baseClass.name))
+ .addMethod(wearConstructorBuilder.build())
+ .build())
+ .build();
+
+ final JavaFile searchIndexableResourcesAuto = JavaFile.builder(PACKAGE,
+ TypeSpec.classBuilder(CLASS_AUTO)
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(ClassName.get(PACKAGE, baseClass.name))
+ .addMethod(autoConstructorBuilder.build())
+ .build())
+ .build();
+
+ final JavaFile searchIndexableResourcesArc = JavaFile.builder(PACKAGE,
+ TypeSpec.classBuilder(CLASS_ARC)
+ .addModifiers(Modifier.PUBLIC)
+ .superclass(ClassName.get(PACKAGE, baseClass.name))
+ .addMethod(arcConstructorBuilder.build())
+ .build())
+ .build();
+
+ try {
+ searchIndexableResourcesBase.writeTo(mFiler);
+ searchIndexableResourcesMobile.writeTo(mFiler);
+ searchIndexableResourcesTv.writeTo(mFiler);
+ searchIndexableResourcesWear.writeTo(mFiler);
+ searchIndexableResourcesAuto.writeTo(mFiler);
+ searchIndexableResourcesArc.writeTo(mFiler);
+ } catch (IOException e) {
+ mMessager.printMessage(Kind.ERROR, "Error while writing file: " + e);
+ }
+ return true;
+ }
+
+ @Override
+ public synchronized void init(ProcessingEnvironment processingEnvironment) {
+ super.init(processingEnvironment);
+ mFiler = processingEnvironment.getFiler();
+ mMessager = processingEnvironment.getMessager();
+ }
+}
diff --git a/libs/usb/Android.mk b/packages/SettingsLib/search/resources/META-INF/services/javax.annotation.processing.Processor
index 129828fd463b..13b8fa8d07dc 100644
--- a/libs/usb/Android.mk
+++ b/packages/SettingsLib/search/resources/META-INF/services/javax.annotation.processing.Processor
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2011 The Android Open Source Project
+# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -14,14 +14,4 @@
# limitations under the License.
#
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE:= com.android.future.usb.accessory
-
-include $(BUILD_JAVA_LIBRARY)
+com.android.settingslib.search.IndexableProcessor
diff --git a/packages/SettingsLib/search/src/com/android/settingslib/search/SearchIndexable.java b/packages/SettingsLib/search/src/com/android/settingslib/search/SearchIndexable.java
new file mode 100644
index 000000000000..638fa3e98138
--- /dev/null
+++ b/packages/SettingsLib/search/src/com/android/settingslib/search/SearchIndexable.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.search;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Denotes that the class should participate in search indexing.
+ */
+@Retention(RetentionPolicy.SOURCE)
+public @interface SearchIndexable {
+ /**
+ * Bitfield for the form factors this class should be considered indexable for.
+ * Default is {@link #ALL}.
+ *
+ * TODO: actually use this value somehow
+ */
+ int forTarget() default ALL;
+
+ /**
+ * Indicates that the class should be considered indexable for Mobile.
+ */
+ int MOBILE = 1<<0;
+
+ /**
+ * Indicates that the class should be considered indexable for TV.
+ */
+ int TV = 1<<1;
+
+ /**
+ * Indicates that the class should be considered indexable for Wear.
+ */
+ int WEAR = 1<<2;
+
+ /**
+ * Indicates that the class should be considered indexable for Auto.
+ */
+ int AUTO = 1<<3;
+
+ /**
+ * Indicates that the class should be considered indexable for ARC++.
+ */
+ int ARC = 1<<4;
+
+ /**
+ * Indicates that the class should be considered indexable for all targets.
+ */
+ int ALL = MOBILE | TV | WEAR | AUTO | ARC;
+
+}
diff --git a/libs/hwui/tests/unit/DeviceInfoTests.cpp b/packages/SettingsLib/search/src/com/android/settingslib/search/SearchIndexableResources.java
index af37938915e5..300d360e0057 100644
--- a/libs/hwui/tests/unit/DeviceInfoTests.cpp
+++ b/packages/SettingsLib/search/src/com/android/settingslib/search/SearchIndexableResources.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,18 +14,22 @@
* limitations under the License.
*/
-#include <DeviceInfo.h>
+package com.android.settingslib.search;
-#include <gtest/gtest.h>
-#include "tests/common/TestUtils.h"
+import java.util.Collection;
-using namespace android;
-using namespace android::uirenderer;
+public interface SearchIndexableResources {
-OPENGL_PIPELINE_TEST(DeviceInfo, basic) {
- // can't assert state before init - another test may have initialized the singleton
- DeviceInfo::initialize();
- const DeviceInfo* di = DeviceInfo::get();
- ASSERT_NE(nullptr, di) << "DeviceInfo initialization failed";
- EXPECT_EQ(2048, di->maxTextureSize()) << "Max texture size didn't match";
+ /**
+ * Returns a collection of classes that should be indexed for search.
+ *
+ * Each class should have the SEARCH_INDEX_DATA_PROVIDER public static member.
+ */
+ Collection<Class> getProviderValues();
+
+ /**
+ * For testing. Can't use @VisibleForTesting here because this builds as a host binary as well
+ * as a device binary.
+ */
+ void addIndex(Class indexClass);
}
diff --git a/packages/SettingsLib/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesArc.java
index 14b0d5986817..df64f4c23b6b 100644
--- a/packages/SettingsLib/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java
+++ b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesArc.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,13 +14,10 @@
* limitations under the License.
*/
-package android.bluetooth;
+package com.android.settingslib.search;
/**
- * A placeholder class to prevent ClassNotFound exceptions caused by lack of visibility.
+ * Stub for Intellij, not compiled! See {@link IndexableProcessor}
*/
-public class BluetoothCodecConfig {
- public boolean isMandatoryCodec() { return true; }
- public String getCodecName() { return null; }
- public int getCodecType() { return -1; }
+public class SearchIndexableResourcesArc extends SearchIndexableResourcesBase {
}
diff --git a/packages/SettingsLib/tests/robotests/src/android/bluetooth/BluetoothCodecStatus.java b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesAuto.java
index 919ec3f3aa10..768fe4412c39 100644
--- a/packages/SettingsLib/tests/robotests/src/android/bluetooth/BluetoothCodecStatus.java
+++ b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesAuto.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,12 +14,10 @@
* limitations under the License.
*/
-package android.bluetooth;
+package com.android.settingslib.search;
/**
- * A placeholder class to prevent ClassNotFound exceptions caused by lack of visibility.
+ * Stub for Intellij, not compiled! See {@link IndexableProcessor}
*/
-public class BluetoothCodecStatus {
- public BluetoothCodecConfig getCodecConfig() { return null; }
- public BluetoothCodecConfig[] getCodecsSelectableCapabilities() { return null; }
+public class SearchIndexableResourcesAuto extends SearchIndexableResourcesBase {
}
diff --git a/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesBase.java b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesBase.java
new file mode 100644
index 000000000000..4870d45cff04
--- /dev/null
+++ b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesBase.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.search;
+
+import java.util.Collection;
+
+/**
+ * Stub for Intellij, not compiled! See {@link IndexableProcessor}
+ */
+public class SearchIndexableResourcesBase implements SearchIndexableResources {
+
+ @Override
+ public Collection<Class> getProviderValues() {
+ throw new RuntimeException("STUB!");
+ }
+
+ public void addIndex(Class indexClass) {
+ throw new RuntimeException("STUB!");
+ }
+}
diff --git a/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesMobile.java b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesMobile.java
new file mode 100644
index 000000000000..d04443b3431f
--- /dev/null
+++ b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesMobile.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.search;
+
+/**
+ * Stub for Intellij, not compiled! See {@link IndexableProcessor}
+ */
+public class SearchIndexableResourcesMobile extends SearchIndexableResourcesBase {
+}
diff --git a/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesTv.java b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesTv.java
new file mode 100644
index 000000000000..1a47add9a5a3
--- /dev/null
+++ b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesTv.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.search;
+
+/**
+ * Stub for Intellij, not compiled! See {@link IndexableProcessor}
+ */
+public class SearchIndexableResourcesTv extends SearchIndexableResourcesBase {
+}
diff --git a/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesWear.java b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesWear.java
new file mode 100644
index 000000000000..a604fefb858f
--- /dev/null
+++ b/packages/SettingsLib/search/stub-src/com/android/settingslib/search/SearchIndexableResourcesWear.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.search;
+
+/**
+ * Stub for Intellij, not compiled! See {@link IndexableProcessor}
+ */
+public class SearchIndexableResourcesWear extends SearchIndexableResourcesBase {
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/CustomDialogPreference.java b/packages/SettingsLib/src/com/android/settingslib/CustomDialogPreference.java
index 95a8f1d9782e..cf1c2c348367 100644
--- a/packages/SettingsLib/src/com/android/settingslib/CustomDialogPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/CustomDialogPreference.java
@@ -20,8 +20,8 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
-import android.support.v14.preference.PreferenceDialogFragment;
-import android.support.v7.preference.DialogPreference;
+import androidx.preference.PreferenceDialogFragment;
+import androidx.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
diff --git a/packages/SettingsLib/src/com/android/settingslib/CustomDialogPreferenceCompat.java b/packages/SettingsLib/src/com/android/settingslib/CustomDialogPreferenceCompat.java
new file mode 100644
index 000000000000..6ac9d4e21f40
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/CustomDialogPreferenceCompat.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settingslib;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.preference.DialogPreference;
+import androidx.preference.PreferenceDialogFragmentCompat;
+
+public class CustomDialogPreferenceCompat extends DialogPreference {
+
+ private CustomPreferenceDialogFragment mFragment;
+ private DialogInterface.OnShowListener mOnShowListener;
+
+ public CustomDialogPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public CustomDialogPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public CustomDialogPreferenceCompat(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CustomDialogPreferenceCompat(Context context) {
+ super(context);
+ }
+
+ public boolean isDialogOpen() {
+ return getDialog() != null && getDialog().isShowing();
+ }
+
+ public Dialog getDialog() {
+ return mFragment != null ? mFragment.getDialog() : null;
+ }
+
+ public void setOnShowListener(DialogInterface.OnShowListener listner) {
+ mOnShowListener = listner;
+ }
+
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
+ DialogInterface.OnClickListener listener) {
+ }
+
+ protected void onDialogClosed(boolean positiveResult) {
+ }
+
+ protected void onClick(DialogInterface dialog, int which) {
+ }
+
+ protected void onBindDialogView(View view) {
+ }
+
+ private void setFragment(CustomPreferenceDialogFragment fragment) {
+ mFragment = fragment;
+ }
+
+ private DialogInterface.OnShowListener getOnShowListener() {
+ return mOnShowListener;
+ }
+
+ public static class CustomPreferenceDialogFragment extends PreferenceDialogFragmentCompat {
+
+ public static CustomPreferenceDialogFragment newInstance(String key) {
+ final CustomPreferenceDialogFragment fragment = new CustomPreferenceDialogFragment();
+ final Bundle b = new Bundle(1);
+ b.putString(ARG_KEY, key);
+ fragment.setArguments(b);
+ return fragment;
+ }
+
+ private CustomDialogPreferenceCompat getCustomizablePreference() {
+ return (CustomDialogPreferenceCompat) getPreference();
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+ super.onPrepareDialogBuilder(builder);
+ getCustomizablePreference().setFragment(this);
+ getCustomizablePreference().onPrepareDialogBuilder(builder, this);
+ }
+
+ @Override
+ public void onDialogClosed(boolean positiveResult) {
+ getCustomizablePreference().onDialogClosed(positiveResult);
+ }
+
+ @Override
+ protected void onBindDialogView(View view) {
+ super.onBindDialogView(view);
+ getCustomizablePreference().onBindDialogView(view);
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final Dialog dialog = super.onCreateDialog(savedInstanceState);
+ dialog.setOnShowListener(getCustomizablePreference().getOnShowListener());
+ return dialog;
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ super.onClick(dialog, which);
+ getCustomizablePreference().onClick(dialog, which);
+ }
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java b/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
index d39ec4b43151..04c39540cf27 100644
--- a/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreference.java
@@ -23,9 +23,9 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
-import android.support.annotation.CallSuper;
-import android.support.v14.preference.EditTextPreferenceDialogFragment;
-import android.support.v7.preference.EditTextPreference;
+import androidx.annotation.CallSuper;
+import androidx.preference.EditTextPreferenceDialogFragment;
+import androidx.preference.EditTextPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
diff --git a/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreferenceCompat.java b/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreferenceCompat.java
new file mode 100644
index 000000000000..6ddc89af03ad
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/CustomEditTextPreferenceCompat.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settingslib;
+
+import static android.text.InputType.TYPE_CLASS_TEXT;
+import static android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.EditText;
+
+import androidx.annotation.CallSuper;
+import androidx.appcompat.app.AlertDialog;
+import androidx.preference.EditTextPreference;
+import androidx.preference.EditTextPreferenceDialogFragmentCompat;
+
+public class CustomEditTextPreferenceCompat extends EditTextPreference {
+
+ private CustomPreferenceDialogFragment mFragment;
+
+ public CustomEditTextPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public CustomEditTextPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public CustomEditTextPreferenceCompat(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CustomEditTextPreferenceCompat(Context context) {
+ super(context);
+ }
+
+ public EditText getEditText() {
+ if (mFragment != null) {
+ final Dialog dialog = mFragment.getDialog();
+ if (dialog != null) {
+ return (EditText) dialog.findViewById(android.R.id.edit);
+ }
+ }
+ return null;
+ }
+
+ public boolean isDialogOpen() {
+ return getDialog() != null && getDialog().isShowing();
+ }
+
+ public Dialog getDialog() {
+ return mFragment != null ? mFragment.getDialog() : null;
+ }
+
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
+ DialogInterface.OnClickListener listener) {
+ }
+
+ protected void onDialogClosed(boolean positiveResult) {
+ }
+
+ protected void onClick(DialogInterface dialog, int which) {
+ }
+
+ @CallSuper
+ protected void onBindDialogView(View view) {
+ final EditText editText = view.findViewById(android.R.id.edit);
+ if (editText != null) {
+ editText.setInputType(TYPE_CLASS_TEXT | TYPE_TEXT_FLAG_CAP_SENTENCES);
+ editText.requestFocus();
+ }
+ }
+
+ private void setFragment(CustomPreferenceDialogFragment fragment) {
+ mFragment = fragment;
+ }
+
+ public static class CustomPreferenceDialogFragment extends
+ EditTextPreferenceDialogFragmentCompat {
+
+ public static CustomPreferenceDialogFragment newInstance(String key) {
+ final CustomPreferenceDialogFragment fragment = new CustomPreferenceDialogFragment();
+ final Bundle b = new Bundle(1);
+ b.putString(ARG_KEY, key);
+ fragment.setArguments(b);
+ return fragment;
+ }
+
+ private CustomEditTextPreferenceCompat getCustomizablePreference() {
+ return (CustomEditTextPreferenceCompat) getPreference();
+ }
+
+ @Override
+ protected void onBindDialogView(View view) {
+ super.onBindDialogView(view);
+ getCustomizablePreference().onBindDialogView(view);
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+ super.onPrepareDialogBuilder(builder);
+ getCustomizablePreference().setFragment(this);
+ getCustomizablePreference().onPrepareDialogBuilder(builder, this);
+ }
+
+ @Override
+ public void onDialogClosed(boolean positiveResult) {
+ super.onDialogClosed(positiveResult);
+ getCustomizablePreference().onDialogClosed(positiveResult);
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ super.onClick(dialog, which);
+ getCustomizablePreference().onClick(dialog, which);
+ }
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java
index f2cd1033cd38..c98bc39fe574 100644
--- a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java
@@ -30,7 +30,7 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.Log;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import java.io.BufferedReader;
import java.io.FileReader;
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
index 8bab3ca05dd6..7f518c1d71d3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtils.java
@@ -35,7 +35,7 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java
index b4a3b51809ce..79e011c6e7ed 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java
@@ -18,9 +18,9 @@ package com.android.settingslib;
import android.content.Context;
import android.os.UserHandle;
-import android.support.v4.content.res.TypedArrayUtils;
-import android.support.v7.preference.PreferenceManager;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.view.View;
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
index 8e3a6c51ddda..a930bb8373ba 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
@@ -20,8 +20,8 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
index 42b3156559e0..fe6d9fe77b73 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java
@@ -21,10 +21,10 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.UserHandle;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v4.content.res.TypedArrayUtils;
-import android.support.v7.preference.PreferenceManager;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.preference.SwitchPreference;
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
diff --git a/packages/SettingsLib/src/com/android/settingslib/TetherUtil.java b/packages/SettingsLib/src/com/android/settingslib/TetherUtil.java
index abbef702bd9f..b8516dc9514f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/TetherUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/TetherUtil.java
@@ -15,10 +15,14 @@
*/
package com.android.settingslib;
+import static android.os.UserManager.DISALLOW_CONFIG_TETHERING;
+
import android.content.Context;
+import android.net.ConnectivityManager;
import android.os.SystemProperties;
-import android.support.annotation.VisibleForTesting;
+import android.os.UserHandle;
import android.telephony.CarrierConfigManager;
+import androidx.annotation.VisibleForTesting;
public class TetherUtil {
@@ -49,4 +53,13 @@ public class TetherUtil {
}
return (provisionApp.length == 2);
}
+
+ public static boolean isTetherAvailable(Context context) {
+ final ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
+ final boolean tetherConfigDisallowed = RestrictedLockUtils.checkIfRestrictionEnforced(
+ context, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null;
+ final boolean hasBaseUserRestriction = RestrictedLockUtils.hasBaseUserRestriction(
+ context, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId());
+ return (cm.isTetheringSupported() || tetherConfigDisallowed) && !hasBaseUserRestriction;
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java b/packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java
index 02b68d8ccbc5..3a26f4649b64 100644
--- a/packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java
@@ -18,8 +18,8 @@ package com.android.settingslib;
import android.annotation.IntDef;
import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index 505cfeac220c..c789c5d848c4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -27,7 +27,7 @@ import android.provider.Settings;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.UserIcons;
import com.android.settingslib.drawable.UserIconDrawable;
-import com.android.settingslib.wrapper.LocationManagerWrapper;
+
import java.text.NumberFormat;
public class Utils {
@@ -69,8 +69,7 @@ public class Utils {
intent, UserHandle.of(userId), android.Manifest.permission.WRITE_SECURE_SETTINGS);
LocationManager locationManager =
(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
- LocationManagerWrapper wrapper = new LocationManagerWrapper(locationManager);
- wrapper.setLocationEnabledForUser(enabled, UserHandle.of(userId));
+ locationManager.setLocationEnabledForUser(enabled, UserHandle.of(userId));
}
public static boolean updateLocationMode(Context context, int oldMode, int newMode, int userId,
@@ -203,21 +202,28 @@ public class Utils {
return statusString;
}
- @ColorInt
- public static int getColorAccent(Context context) {
+ public static ColorStateList getColorAccent(Context context) {
return getColorAttr(context, android.R.attr.colorAccent);
}
- @ColorInt
- public static int getColorError(Context context) {
+ public static ColorStateList getColorError(Context context) {
return getColorAttr(context, android.R.attr.colorError);
}
@ColorInt
- public static int getDefaultColor(Context context, int resId) {
+ public static int getColorAccentDefaultColor(Context context) {
+ return getColorAttrDefaultColor(context, android.R.attr.colorAccent);
+ }
+
+ @ColorInt
+ public static int getColorErrorDefaultColor(Context context) {
+ return getColorAttrDefaultColor(context, android.R.attr.colorError);
+ }
+
+ @ColorInt
+ public static int getColorStateListDefaultColor(Context context, int resId) {
final ColorStateList list =
context.getResources().getColorStateList(resId, context.getTheme());
-
return list.getDefaultColor();
}
@@ -242,13 +248,24 @@ public class Utils {
}
@ColorInt
- public static int getColorAttr(Context context, int attr) {
+ public static int getColorAttrDefaultColor(Context context, int attr) {
TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
@ColorInt int colorAccent = ta.getColor(0, 0);
ta.recycle();
return colorAccent;
}
+ public static ColorStateList getColorAttr(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ ColorStateList stateList = null;
+ try {
+ stateList = ta.getColorStateList(0);
+ } finally {
+ ta.recycle();
+ }
+ return stateList;
+ }
+
public static int getThemeAttr(Context context, int attr) {
TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
int theme = ta.getResourceId(0, 0);
diff --git a/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java b/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java
index 8473c06c1ac7..a18600abf788 100644
--- a/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java
@@ -40,9 +40,6 @@ import java.util.Set;
public class AccessibilityUtils {
public static final char ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR = ':';
- final static TextUtils.SimpleStringSplitter sStringColonSplitter =
- new TextUtils.SimpleStringSplitter(ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR);
-
/**
* @return the set of enabled accessibility services. If there are no services,
* it returns the unmodifiable {@link Collections#emptySet()}.
@@ -72,16 +69,16 @@ public class AccessibilityUtils {
final String enabledServicesSetting = Settings.Secure.getStringForUser(
context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
userId);
- if (enabledServicesSetting == null) {
+ if (TextUtils.isEmpty(enabledServicesSetting)) {
return Collections.emptySet();
}
final Set<ComponentName> enabledServices = new HashSet<>();
- final TextUtils.SimpleStringSplitter colonSplitter = sStringColonSplitter;
+ final TextUtils.StringSplitter colonSplitter =
+ new TextUtils.SimpleStringSplitter(ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR);
colonSplitter.setString(enabledServicesSetting);
- while (colonSplitter.hasNext()) {
- final String componentNameString = colonSplitter.next();
+ for (String componentNameString : colonSplitter) {
final ComponentName enabledService = ComponentName.unflattenFromString(
componentNameString);
if (enabledService != null) {
@@ -168,8 +165,7 @@ public class AccessibilityUtils {
* an OEM-configurable default if the setting has never been set.
*
* @param context A valid context
- * @param userId The user whose settings should be checked
- *
+ * @param userId The user whose settings should be checked
* @return The component name, flattened to a string, of the target service.
*/
public static String getShortcutTargetServiceComponentNameString(
@@ -187,9 +183,9 @@ public class AccessibilityUtils {
* Check if the accessibility shortcut is enabled for a user
*
* @param context A valid context
- * @param userId The user of interest
+ * @param userId The user of interest
* @return {@code true} if the shortcut is enabled for the user. {@code false} otherwise.
- * Note that the shortcut may be enabled, but no action associated with it.
+ * Note that the shortcut may be enabled, but no action associated with it.
*/
public static boolean isShortcutEnabled(Context context, int userId) {
return Settings.Secure.getIntForUser(context.getContentResolver(),
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 093b1bd2b8f8..21bac88e802b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -22,9 +22,6 @@ import android.app.AppGlobals;
import android.app.Application;
import android.app.usage.StorageStats;
import android.app.usage.StorageStatsManager;
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.LifecycleObserver;
-import android.arch.lifecycle.OnLifecycleEvent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -49,7 +46,6 @@ import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
-import android.support.annotation.VisibleForTesting;
import android.text.format.Formatter;
import android.util.IconDrawableFactory;
import android.util.Log;
@@ -62,6 +58,7 @@ import java.io.File;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
import java.text.Collator;
import java.text.Normalizer;
import java.text.Normalizer.Form;
@@ -74,6 +71,11 @@ import java.util.Objects;
import java.util.UUID;
import java.util.regex.Pattern;
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+
/**
* Keeps track of information about all installed applications, lazy-loading
* as needed.
@@ -132,7 +134,7 @@ public class ApplicationsState {
boolean mSessionsChanged;
// Temporary for dispatching session callbacks. Only touched by main thread.
- final ArrayList<Session> mActiveSessions = new ArrayList<Session>();
+ final ArrayList<WeakReference<Session>> mActiveSessions = new ArrayList<>();
final HandlerThread mThread;
final BackgroundHandler mBackgroundHandler;
@@ -618,7 +620,7 @@ public class ApplicationsState {
for (int i=0; i<mSessions.size(); i++) {
Session s = mSessions.get(i);
if (s.mResumed) {
- mActiveSessions.add(s);
+ mActiveSessions.add(new WeakReference<>(s));
}
}
}
@@ -830,46 +832,70 @@ public class ApplicationsState {
rebuildActiveSessions();
switch (msg.what) {
case MSG_REBUILD_COMPLETE: {
- Session s = (Session)msg.obj;
- if (mActiveSessions.contains(s)) {
- s.mCallbacks.onRebuildComplete(s.mLastAppList);
+ Session s = (Session) msg.obj;
+ for (WeakReference<Session> sessionRef : mActiveSessions) {
+ final Session session = sessionRef.get();
+ if (session != null && session == s) {
+ s.mCallbacks.onRebuildComplete(s.mLastAppList);
+ }
}
} break;
case MSG_PACKAGE_LIST_CHANGED: {
- for (int i=0; i<mActiveSessions.size(); i++) {
- mActiveSessions.get(i).mCallbacks.onPackageListChanged();
+ for (WeakReference<Session> sessionRef : mActiveSessions) {
+ final Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onPackageListChanged();
+ }
}
} break;
case MSG_PACKAGE_ICON_CHANGED: {
- for (int i=0; i<mActiveSessions.size(); i++) {
- mActiveSessions.get(i).mCallbacks.onPackageIconChanged();
+ for (WeakReference<Session> sessionRef : mActiveSessions) {
+ final Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onPackageIconChanged();
+ }
}
} break;
case MSG_PACKAGE_SIZE_CHANGED: {
- for (int i=0; i<mActiveSessions.size(); i++) {
- mActiveSessions.get(i).mCallbacks.onPackageSizeChanged(
- (String)msg.obj);
+ for (WeakReference<Session> sessionRef : mActiveSessions) {
+ final Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onPackageSizeChanged(
+ (String) msg.obj);
+ }
}
} break;
case MSG_ALL_SIZES_COMPUTED: {
- for (int i=0; i<mActiveSessions.size(); i++) {
- mActiveSessions.get(i).mCallbacks.onAllSizesComputed();
+ for (WeakReference<Session> sessionRef : mActiveSessions) {
+ final Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onAllSizesComputed();
+ }
}
} break;
case MSG_RUNNING_STATE_CHANGED: {
- for (int i=0; i<mActiveSessions.size(); i++) {
- mActiveSessions.get(i).mCallbacks.onRunningStateChanged(
- msg.arg1 != 0);
+ for (WeakReference<Session> sessionRef : mActiveSessions) {
+ final Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onRunningStateChanged(
+ msg.arg1 != 0);
+ }
}
} break;
case MSG_LAUNCHER_INFO_CHANGED: {
- for (int i=0; i<mActiveSessions.size(); i++) {
- mActiveSessions.get(i).mCallbacks.onLauncherInfoChanged();
+ for (WeakReference<Session> sessionRef : mActiveSessions) {
+ final Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onLauncherInfoChanged();
+ }
}
} break;
case MSG_LOAD_ENTRIES_COMPLETE: {
- for (int i=0; i<mActiveSessions.size(); i++) {
- mActiveSessions.get(i).mCallbacks.onLoadEntriesCompleted();
+ for (WeakReference<Session> sessionRef : mActiveSessions) {
+ final Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onLoadEntriesCompleted();
+ }
}
} break;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java b/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java
index 246ca474da32..3102239c2c9e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java
@@ -29,7 +29,6 @@ import android.os.UserHandle;
import android.util.IconDrawableFactory;
import com.android.settingslib.widget.CandidateInfo;
-import com.android.settingslib.wrapper.PackageManagerWrapper;
/**
* Data model representing an app in DefaultAppPicker UI.
@@ -40,18 +39,18 @@ public class DefaultAppInfo extends CandidateInfo {
public final ComponentName componentName;
public final PackageItemInfo packageItemInfo;
public final String summary;
- protected final PackageManagerWrapper mPm;
+ protected final PackageManager mPm;
private final Context mContext;
- public DefaultAppInfo(Context context, PackageManagerWrapper pm, int uid, ComponentName cn) {
+ public DefaultAppInfo(Context context, PackageManager pm, int uid, ComponentName cn) {
this(context, pm, uid, cn, null /* summary */, true /* enabled */);
}
- public DefaultAppInfo(Context context, PackageManagerWrapper pm, PackageItemInfo info) {
+ public DefaultAppInfo(Context context, PackageManager pm, PackageItemInfo info) {
this(context, pm, info, null /* summary */, true /* enabled */);
}
- public DefaultAppInfo(Context context, PackageManagerWrapper pm, int uid, ComponentName cn,
+ public DefaultAppInfo(Context context, PackageManager pm, int uid, ComponentName cn,
String summary, boolean enabled) {
super(enabled);
mContext = context;
@@ -62,7 +61,7 @@ public class DefaultAppInfo extends CandidateInfo {
this.summary = summary;
}
- public DefaultAppInfo(Context context, PackageManagerWrapper pm, PackageItemInfo info,
+ public DefaultAppInfo(Context context, PackageManager pm, PackageItemInfo info,
String summary, boolean enabled) {
super(enabled);
mContext = context;
@@ -79,17 +78,17 @@ public class DefaultAppInfo extends CandidateInfo {
try {
final ComponentInfo componentInfo = getComponentInfo();
if (componentInfo != null) {
- return componentInfo.loadLabel(mPm.getPackageManager());
+ return componentInfo.loadLabel(mPm);
} else {
final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
componentName.getPackageName(), 0, userId);
- return appInfo.loadLabel(mPm.getPackageManager());
+ return appInfo.loadLabel(mPm);
}
} catch (PackageManager.NameNotFoundException e) {
return null;
}
} else if (packageItemInfo != null) {
- return packageItemInfo.loadLabel(mPm.getPackageManager());
+ return packageItemInfo.loadLabel(mPm);
} else {
return null;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java
index 3c3c70ac364e..454d1dce0b2f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java
@@ -32,8 +32,6 @@ import android.os.Handler;
import android.provider.Settings;
import android.util.Slog;
-import com.android.settingslib.wrapper.PackageManagerWrapper;
-
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -127,8 +125,7 @@ public class ServiceListing {
mServices.clear();
final int user = ActivityManager.getCurrentUser();
- final PackageManagerWrapper pmWrapper =
- new PackageManagerWrapper(mContext.getPackageManager());
+ final PackageManager pmWrapper = mContext.getPackageManager();
List<ResolveInfo> installedServices = pmWrapper.queryIntentServicesAsUser(
new Intent(mIntentAction),
PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java b/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
index 9fbadee3075a..b15f35ddc240 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
@@ -21,7 +21,7 @@ import android.app.usage.StorageStatsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserHandle;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import java.io.IOException;
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
index 9346deac4759..ddedc7d7b2c4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
@@ -20,7 +20,6 @@ import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothCodecConfig;
-import android.bluetooth.BluetoothCodecStatus;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
@@ -28,9 +27,7 @@ import android.content.Context;
import android.os.ParcelUuid;
import android.util.Log;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.R;
-import com.android.settingslib.wrapper.BluetoothA2dpWrapper;
import java.util.ArrayList;
import java.util.Arrays;
@@ -43,7 +40,6 @@ public class A2dpProfile implements LocalBluetoothProfile {
private Context mContext;
private BluetoothA2dp mService;
- private BluetoothA2dpWrapper mServiceWrapper;
private boolean mIsProfileReady;
private final LocalBluetoothAdapter mLocalAdapter;
@@ -67,7 +63,6 @@ public class A2dpProfile implements LocalBluetoothProfile {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (V) Log.d(TAG,"Bluetooth service connected");
mService = (BluetoothA2dp) proxy;
- mServiceWrapper = new BluetoothA2dpWrapper(mService);
// We just bound to the service, so refresh the UI for any connected A2DP devices.
List<BluetoothDevice> deviceList = mService.getConnectedDevices();
while (!deviceList.isEmpty()) {
@@ -110,11 +105,6 @@ public class A2dpProfile implements LocalBluetoothProfile {
BluetoothProfile.A2DP);
}
- @VisibleForTesting
- void setBluetoothA2dpWrapper(BluetoothA2dpWrapper wrapper) {
- mServiceWrapper = wrapper;
- }
-
public boolean isConnectable() {
return true;
}
@@ -194,12 +184,12 @@ public class A2dpProfile implements LocalBluetoothProfile {
}
public boolean supportsHighQualityAudio(BluetoothDevice device) {
- int support = mServiceWrapper.supportsOptionalCodecs(device);
+ int support = mService.supportsOptionalCodecs(device);
return support == BluetoothA2dp.OPTIONAL_CODECS_SUPPORTED;
}
public boolean isHighQualityAudioEnabled(BluetoothDevice device) {
- int enabled = mServiceWrapper.getOptionalCodecsEnabled(device);
+ int enabled = mService.getOptionalCodecsEnabled(device);
if (enabled != BluetoothA2dp.OPTIONAL_CODECS_PREF_UNKNOWN) {
return enabled == BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED;
} else if (getConnectionStatus(device) != BluetoothProfile.STATE_CONNECTED &&
@@ -210,8 +200,8 @@ public class A2dpProfile implements LocalBluetoothProfile {
return true;
}
BluetoothCodecConfig codecConfig = null;
- if (mServiceWrapper.getCodecStatus(device) != null) {
- codecConfig = mServiceWrapper.getCodecStatus(device).getCodecConfig();
+ if (mService.getCodecStatus(device) != null) {
+ codecConfig = mService.getCodecStatus(device).getCodecConfig();
}
if (codecConfig != null) {
return !codecConfig.isMandatoryCodec();
@@ -224,7 +214,7 @@ public class A2dpProfile implements LocalBluetoothProfile {
int prefValue = enabled
? BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED
: BluetoothA2dp.OPTIONAL_CODECS_PREF_DISABLED;
- mServiceWrapper.setOptionalCodecsEnabled(device, prefValue);
+ mService.setOptionalCodecsEnabled(device, prefValue);
if (getConnectionStatus(device) != BluetoothProfile.STATE_CONNECTED) {
return;
}
@@ -244,8 +234,8 @@ public class A2dpProfile implements LocalBluetoothProfile {
// We want to get the highest priority codec, since that's the one that will be used with
// this device, and see if it is high-quality (ie non-mandatory).
BluetoothCodecConfig[] selectable = null;
- if (mServiceWrapper.getCodecStatus(device) != null) {
- selectable = mServiceWrapper.getCodecStatus(device).getCodecsSelectableCapabilities();
+ if (mService.getCodecStatus(device) != null) {
+ selectable = mService.getCodecStatus(device).getCodecsSelectableCapabilities();
// To get the highest priority, we sort in reverse.
Arrays.sort(selectable,
(a, b) -> {
@@ -309,7 +299,7 @@ public class A2dpProfile implements LocalBluetoothProfile {
return R.string.bluetooth_a2dp_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
index ac5f5373d8ec..2cf1d58bc9f1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
@@ -202,7 +202,7 @@ final class A2dpSinkProfile implements LocalBluetoothProfile {
return R.string.bluetooth_a2dp_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
index c0dce90207ef..2866a54c16d9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
@@ -381,7 +381,7 @@ public class BluetoothEventManager {
Log.w(TAG, "showUnbondMessage: Not displaying any message for reason: " + reason);
return;
}
- Utils.showError(context, name, errorMsg);
+ BluetoothUtils.showError(context, name, errorMsg);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/Utils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
index 0ee1dad9d744..d8379757ea42 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
@@ -5,7 +5,7 @@ import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.support.annotation.DrawableRes;
+import androidx.annotation.DrawableRes;
import android.util.Pair;
import com.android.settingslib.R;
@@ -13,7 +13,7 @@ import com.android.settingslib.graph.BluetoothDeviceLayerDrawable;
import java.util.List;
-public class Utils {
+public class BluetoothUtils {
public static final boolean V = false; // verbose logging
public static final boolean D = true; // regular logging
@@ -21,16 +21,16 @@ public class Utils {
public static int getConnectionStateSummary(int connectionState) {
switch (connectionState) {
- case BluetoothProfile.STATE_CONNECTED:
- return R.string.bluetooth_connected;
- case BluetoothProfile.STATE_CONNECTING:
- return R.string.bluetooth_connecting;
- case BluetoothProfile.STATE_DISCONNECTED:
- return R.string.bluetooth_disconnected;
- case BluetoothProfile.STATE_DISCONNECTING:
- return R.string.bluetooth_disconnecting;
- default:
- return 0;
+ case BluetoothProfile.STATE_CONNECTED:
+ return R.string.bluetooth_connected;
+ case BluetoothProfile.STATE_CONNECTING:
+ return R.string.bluetooth_connecting;
+ case BluetoothProfile.STATE_DISCONNECTED:
+ return R.string.bluetooth_disconnected;
+ case BluetoothProfile.STATE_DISCONNECTING:
+ return R.string.bluetooth_disconnecting;
+ default:
+ return 0;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index a7da0046e840..254d19f582c8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -29,7 +29,7 @@ import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import android.bluetooth.BluetoothAdapter;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.os.SystemProperties;
import com.android.settingslib.R;
@@ -48,7 +48,6 @@ import java.util.List;
*/
public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
private static final String TAG = "CachedBluetoothDevice";
- private static final boolean DEBUG = Utils.V;
private final Context mContext;
private final LocalBluetoothAdapter mLocalAdapter;
@@ -104,7 +103,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
}
public void setHiSyncId(long id) {
- if (Utils.D) {
+ if (BluetoothUtils.D) {
Log.d(TAG, "setHiSyncId: mDevice " + mDevice + ", id " + id);
}
mHiSyncId = id;
@@ -160,13 +159,15 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
}
void onProfileStateChanged(LocalBluetoothProfile profile, int newProfileState) {
- if (Utils.D) {
+ if (BluetoothUtils.D) {
Log.d(TAG, "onProfileStateChanged: profile " + profile +
" newProfileState " + newProfileState);
}
if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_TURNING_OFF)
{
- if (Utils.D) Log.d(TAG, " BT Turninig Off...Profile conn state change ignored...");
+ if (BluetoothUtils.D) {
+ Log.d(TAG, " BT Turninig Off...Profile conn state change ignored...");
+ }
return;
}
mProfileConnectionState.put(profile, newProfileState);
@@ -227,7 +228,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
public void disconnect(LocalBluetoothProfile profile) {
if (profile.disconnect(mDevice)) {
- if (Utils.D) {
+ if (BluetoothUtils.D) {
Log.d(TAG, "Command sent successfully:DISCONNECT " + describe(profile));
}
}
@@ -274,7 +275,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
}
}
}
- if (DEBUG) Log.d(TAG, "Preferred profiles = " + preferredProfiles);
+ if (BluetoothUtils.D) Log.d(TAG, "Preferred profiles = " + preferredProfiles);
if (preferredProfiles == 0) {
connectAutoConnectableProfiles();
@@ -315,7 +316,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
return;
}
if (profile.connect(mDevice)) {
- if (Utils.D) {
+ if (BluetoothUtils.D) {
Log.d(TAG, "Command sent successfully:CONNECT " + describe(profile));
}
return;
@@ -376,10 +377,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
if (dev != null) {
final boolean successful = dev.removeBond();
if (successful) {
- if (Utils.D) {
+ if (BluetoothUtils.D) {
Log.d(TAG, "Command sent successfully:REMOVE_BOND " + describe(null));
}
- } else if (Utils.V) {
+ } else if (BluetoothUtils.V) {
Log.v(TAG, "Framework rejected command immediately:REMOVE_BOND " +
describe(null));
}
@@ -398,7 +399,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
public void clearProfileConnectionState ()
{
- if (Utils.D) {
+ if (BluetoothUtils.D) {
Log.d(TAG," Clearing all connection state for dev:" + mDevice.getName());
}
for (LocalBluetoothProfile profile :getProfiles()) {
@@ -502,7 +503,9 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
if (TextUtils.isEmpty(mName)) {
mName = mDevice.getAddress();
- if (DEBUG) Log.d(TAG, "Device has no name (yet), use address: " + mName);
+ if (BluetoothUtils.D) {
+ Log.d(TAG, "Device has no name (yet), use address: " + mName);
+ }
}
}
@@ -658,7 +661,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
mProfileManager.updateProfiles(uuids, localUuids, mProfiles, mRemovedProfiles,
mLocalNapRoleConnected, mDevice);
- if (DEBUG) {
+ if (BluetoothUtils.D) {
Log.e(TAG, "updating profiles for " + mDevice.getAliasName());
BluetoothClass bluetoothClass = mDevice.getBluetoothClass();
@@ -707,7 +710,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
timeout = MAX_HOGP_DELAY_FOR_AUTO_CONNECT;
}
- if (DEBUG) {
+ if (BluetoothUtils.D) {
Log.d(TAG, "onUuidChanged: Time since last connect"
+ (SystemClock.elapsedRealtime() - mConnectAttempted));
}
@@ -1030,7 +1033,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
switch (connectionStatus) {
case BluetoothProfile.STATE_CONNECTING:
case BluetoothProfile.STATE_DISCONNECTING:
- return mContext.getString(Utils.getConnectionStateSummary(connectionStatus));
+ return mContext.getString(
+ BluetoothUtils.getConnectionStateSummary(connectionStatus));
case BluetoothProfile.STATE_CONNECTED:
profileConnected = true;
@@ -1125,7 +1129,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
switch (connectionStatus) {
case BluetoothProfile.STATE_CONNECTING:
case BluetoothProfile.STATE_DISCONNECTING:
- return mContext.getString(Utils.getConnectionStateSummary(connectionStatus));
+ return mContext.getString(
+ BluetoothUtils.getConnectionStateSummary(connectionStatus));
case BluetoothProfile.STATE_CONNECTED:
profileConnected = true;
@@ -1241,7 +1246,17 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
* @return {@code true} if {@code cachedBluetoothDevice} is HFP device
*/
public boolean isHfpDevice() {
- return mProfileManager.getHeadsetProfile().getConnectionStatus(mDevice) ==
+ HeadsetProfile headsetProfile = mProfileManager.getHeadsetProfile();
+ return headsetProfile != null && headsetProfile.getConnectionStatus(mDevice) ==
+ BluetoothProfile.STATE_CONNECTED;
+ }
+
+ /**
+ * @return {@code true} if {@code cachedBluetoothDevice} is Hearing Aid device
+ */
+ public boolean isConnectedHearingAidDevice() {
+ HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile();
+ return hearingAidProfile != null && hearingAidProfile.getConnectionStatus(mDevice) ==
BluetoothProfile.STATE_CONNECTED;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
index 05ff9c5f3644..4736cb8e67b5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
@@ -39,7 +39,7 @@ import java.util.Objects;
*/
public class CachedBluetoothDeviceManager {
private static final String TAG = "CachedBluetoothDeviceManager";
- private static final boolean DEBUG = Utils.D;
+ private static final boolean DEBUG = BluetoothUtils.D;
private Context mContext;
private final LocalBluetoothManager mBtManager;
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
index f7518cd63c5c..6a4d97832338 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
@@ -229,7 +229,7 @@ public class HeadsetProfile implements LocalBluetoothProfile {
return R.string.bluetooth_headset_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
index 4c21e61eb47b..1747d28aeeb6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
@@ -19,20 +19,14 @@ package com.android.settingslib.bluetooth;
import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
-import android.bluetooth.BluetoothCodecConfig;
-import android.bluetooth.BluetoothCodecStatus;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothUuid;
import android.content.Context;
-import android.os.ParcelUuid;
import android.util.Log;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.R;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
public class HearingAidProfile implements LocalBluetoothProfile {
@@ -234,7 +228,7 @@ public class HearingAidProfile implements LocalBluetoothProfile {
return R.string.bluetooth_hearing_aid_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
index d0819098deb1..94c84b9a71ea 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
@@ -209,7 +209,7 @@ final class HfpClientProfile implements LocalBluetoothProfile {
return R.string.bluetooth_headset_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
index 45ec4a1e554d..179a60d7ebc7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
@@ -26,7 +26,6 @@ import android.util.Log;
import com.android.settingslib.R;
-import java.util.Collection;
import java.util.List;
/**
@@ -179,7 +178,7 @@ public class HidDeviceProfile implements LocalBluetoothProfile {
case BluetoothProfile.STATE_CONNECTED:
return R.string.bluetooth_hid_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
index 93e562179399..da348f91e89a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
@@ -168,7 +168,7 @@ public class HidProfile implements LocalBluetoothProfile {
return R.string.bluetooth_hid_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java
index 38c8a883d89c..f8674a6e136a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java
@@ -232,7 +232,7 @@ public class LocalBluetoothAdapter {
? BluetoothAdapter.STATE_TURNING_ON
: BluetoothAdapter.STATE_TURNING_OFF);
} else {
- if (Utils.V) {
+ if (BluetoothUtils.V) {
Log.v(TAG, "setBluetoothEnabled call, manager didn't return " +
"success for enabled: " + enabled);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java
index 373247162563..1c50953bac12 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothManager.java
@@ -19,6 +19,8 @@ package com.android.settingslib.bluetooth;
import android.content.Context;
import android.util.Log;
+import java.lang.ref.WeakReference;
+
/**
* LocalBluetoothManager provides a simplified interface on top of a subset of
* the Bluetooth API. Note that {@link #getInstance} will return null
@@ -34,7 +36,7 @@ public class LocalBluetoothManager {
private final Context mContext;
/** If a BT-related activity is in the foreground, this will be it. */
- private Context mForegroundActivity;
+ private WeakReference<Context> mForegroundActivity;
private final LocalBluetoothAdapter mLocalAdapter;
@@ -85,17 +87,19 @@ public class LocalBluetoothManager {
}
public Context getForegroundActivity() {
- return mForegroundActivity;
+ return mForegroundActivity == null
+ ? null
+ : mForegroundActivity.get();
}
public boolean isForegroundActivity() {
- return mForegroundActivity != null;
+ return mForegroundActivity != null && mForegroundActivity.get() != null;
}
public synchronized void setForegroundActivity(Context context) {
if (context != null) {
Log.d(TAG, "setting foreground activity to non-null context");
- mForegroundActivity = context;
+ mForegroundActivity = new WeakReference<>(context);
} else {
if (mForegroundActivity != null) {
Log.d(TAG, "setting foreground activity to null");
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
index df6afa5342a8..1afc6a4e869c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
@@ -35,7 +35,7 @@ import android.bluetooth.BluetoothUuid;
import android.content.Context;
import android.content.Intent;
import android.os.ParcelUuid;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.Log;
import com.android.internal.R;
import java.util.ArrayList;
@@ -52,7 +52,7 @@ import android.os.SystemProperties;
*/
public class LocalBluetoothProfileManager {
private static final String TAG = "LocalBluetoothProfileManager";
- private static final boolean DEBUG = Utils.D;
+ private static final boolean DEBUG = BluetoothUtils.D;
/** Singleton instance. */
private static LocalBluetoothProfileManager sInstance;
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
index ad0d8ba7ebab..6aa32fc01eb5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java
@@ -194,7 +194,7 @@ public final class MapClientProfile implements LocalBluetoothProfile {
return R.string.bluetooth_map_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
index aa7a7af582a7..c53cacc2af47 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapProfile.java
@@ -195,7 +195,7 @@ public class MapProfile implements LocalBluetoothProfile {
return R.string.bluetooth_map_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
index b18b19b1e244..e204d03cb327 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
@@ -153,7 +153,7 @@ public class PanProfile implements LocalBluetoothProfile {
}
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
index 93e6be6559f6..60985f3c6d55 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/SapProfile.java
@@ -198,7 +198,7 @@ final class SapProfile implements LocalBluetoothProfile {
return R.string.bluetooth_sap_profile_summary_connected;
default:
- return Utils.getConnectionStateSummary(state);
+ return BluetoothUtils.getConnectionStateSummary(state);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
index 573504a96141..f4d647d61005 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
@@ -1,9 +1,9 @@
package com.android.settingslib.core;
import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceGroup;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceScreen;
/**
* A controller that manages event for preference.
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/ConfirmationDialogController.java b/packages/SettingsLib/src/com/android/settingslib/core/ConfirmationDialogController.java
index 72ab8c3848c5..1d3a909df55b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/ConfirmationDialogController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/ConfirmationDialogController.java
@@ -16,8 +16,8 @@
package com.android.settingslib.core;
-import android.support.annotation.Nullable;
-import android.support.v7.preference.Preference;
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
/**
* Interface for {@link AbstractPreferenceController} objects which manage confirmation dialogs
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java
index facce4e0bcbb..a79f125d4c99 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java
@@ -20,7 +20,7 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java
index c23f22648764..cb1ca59d2f43 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixin.java
@@ -17,9 +17,9 @@
package com.android.settingslib.core.instrumentation;
import android.app.Activity;
-import android.arch.lifecycle.Lifecycle.Event;
-import android.arch.lifecycle.LifecycleObserver;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.Lifecycle.Event;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
import android.content.Intent;
import android.os.SystemClock;
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/Lifecycle.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/Lifecycle.java
index 451e5611979a..7ec757a56217 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/Lifecycle.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/Lifecycle.java
@@ -15,17 +15,17 @@
*/
package com.android.settingslib.core.lifecycle;
-import static android.arch.lifecycle.Lifecycle.Event.ON_ANY;
+import static androidx.lifecycle.Lifecycle.Event.ON_ANY;
import android.annotation.UiThread;
-import android.arch.lifecycle.LifecycleOwner;
-import android.arch.lifecycle.LifecycleRegistry;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleRegistry;
+import androidx.lifecycle.OnLifecycleEvent;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceScreen;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
@@ -75,7 +75,7 @@ public class Lifecycle extends LifecycleRegistry {
*/
@UiThread
@Override
- public void addObserver(android.arch.lifecycle.LifecycleObserver observer) {
+ public void addObserver(androidx.lifecycle.LifecycleObserver observer) {
ThreadUtils.ensureMainThread();
super.addObserver(observer);
if (observer instanceof LifecycleObserver) {
@@ -85,7 +85,7 @@ public class Lifecycle extends LifecycleRegistry {
@UiThread
@Override
- public void removeObserver(android.arch.lifecycle.LifecycleObserver observer) {
+ public void removeObserver(androidx.lifecycle.LifecycleObserver observer) {
ThreadUtils.ensureMainThread();
super.removeObserver(observer);
if (observer instanceof LifecycleObserver) {
@@ -207,7 +207,7 @@ public class Lifecycle extends LifecycleRegistry {
}
private class LifecycleProxy
- implements android.arch.lifecycle.LifecycleObserver {
+ implements androidx.lifecycle.LifecycleObserver {
@OnLifecycleEvent(ON_ANY)
public void onLifecycleEvent(LifecycleOwner owner, Event event) {
switch (event) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/LifecycleObserver.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/LifecycleObserver.java
index ec8a8b537f48..9eb25806263f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/LifecycleObserver.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/LifecycleObserver.java
@@ -17,9 +17,9 @@ package com.android.settingslib.core.lifecycle;
/**
* Observer of lifecycle events.
- * @deprecated use {@link android.arch.lifecycle.LifecycleObserver} instead
+ * @deprecated use {@link androidx.lifecycle.LifecycleObserver} instead
*/
@Deprecated
public interface LifecycleObserver extends
- android.arch.lifecycle.LifecycleObserver {
+ androidx.lifecycle.LifecycleObserver {
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableActivity.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableActivity.java
index 8b062f8447b0..2bd0b27063ea 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableActivity.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableActivity.java
@@ -15,29 +15,31 @@
*/
package com.android.settingslib.core.lifecycle;
-import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
-import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
-import static android.arch.lifecycle.Lifecycle.Event.ON_START;
-import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
+import static androidx.lifecycle.Lifecycle.Event.ON_CREATE;
+import static androidx.lifecycle.Lifecycle.Event.ON_DESTROY;
+import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
+import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
import android.annotation.Nullable;
import android.app.Activity;
-import android.arch.lifecycle.LifecycleOwner;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.Menu;
import android.view.MenuItem;
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.LifecycleOwner;
+
/**
* {@link Activity} that has hooks to observe activity lifecycle events.
*/
-public class ObservableActivity extends Activity implements LifecycleOwner {
+public class ObservableActivity extends FragmentActivity implements LifecycleOwner {
private final Lifecycle mLifecycle = new Lifecycle(this);
- public Lifecycle getLifecycle() {
+ public Lifecycle getSettingsLifecycle() {
return mLifecycle;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableDialogFragment.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableDialogFragment.java
index dc95384b26a5..869f54f7d13a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableDialogFragment.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableDialogFragment.java
@@ -15,21 +15,22 @@
*/
package com.android.settingslib.core.lifecycle;
-import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
-import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
-import static android.arch.lifecycle.Lifecycle.Event.ON_START;
-import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
-
-import android.app.DialogFragment;
-import android.arch.lifecycle.LifecycleOwner;
+import static androidx.lifecycle.Lifecycle.Event.ON_CREATE;
+import static androidx.lifecycle.Lifecycle.Event.ON_DESTROY;
+import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
+import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import androidx.fragment.app.DialogFragment;
+import androidx.lifecycle.LifecycleOwner;
+
/**
* {@link DialogFragment} that has hooks to observe fragment lifecycle events.
*/
@@ -37,6 +38,10 @@ public class ObservableDialogFragment extends DialogFragment implements Lifecycl
protected final Lifecycle mLifecycle = new Lifecycle(this);
+ public Lifecycle getSettingsLifecycle() {
+ return mLifecycle;
+ }
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -100,9 +105,4 @@ public class ObservableDialogFragment extends DialogFragment implements Lifecycl
}
return lifecycleHandled;
}
-
- @Override
- public Lifecycle getLifecycle() {
- return mLifecycle;
- }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableFragment.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableFragment.java
index 925eda6ef9d5..6ba930dcac96 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableFragment.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservableFragment.java
@@ -16,27 +16,28 @@
package com.android.settingslib.core.lifecycle;
-import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
-import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
-import static android.arch.lifecycle.Lifecycle.Event.ON_START;
-import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
+import static androidx.lifecycle.Lifecycle.Event.ON_CREATE;
+import static androidx.lifecycle.Lifecycle.Event.ON_DESTROY;
+import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
+import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
import android.annotation.CallSuper;
-import android.app.Fragment;
-import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.LifecycleOwner;
+
public class ObservableFragment extends Fragment implements LifecycleOwner {
private final Lifecycle mLifecycle = new Lifecycle(this);
- public Lifecycle getLifecycle() {
+ public Lifecycle getSettingsLifecycle() {
return mLifecycle;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservablePreferenceFragment.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservablePreferenceFragment.java
index abd77559612e..bd1e5a588968 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservablePreferenceFragment.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/ObservablePreferenceFragment.java
@@ -16,32 +16,33 @@
package com.android.settingslib.core.lifecycle;
-import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
-import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
-import static android.arch.lifecycle.Lifecycle.Event.ON_START;
-import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
+import static androidx.lifecycle.Lifecycle.Event.ON_CREATE;
+import static androidx.lifecycle.Lifecycle.Event.ON_DESTROY;
+import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
+import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
import android.annotation.CallSuper;
-import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.os.Bundle;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.PreferenceScreen;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+
/**
- * {@link PreferenceFragment} that has hooks to observe fragment lifecycle events.
+ * {@link PreferenceFragmentCompat} that has hooks to observe fragment lifecycle events.
*/
-public abstract class ObservablePreferenceFragment extends PreferenceFragment
+public abstract class ObservablePreferenceFragment extends PreferenceFragmentCompat
implements LifecycleOwner {
private final Lifecycle mLifecycle = new Lifecycle(this);
- public Lifecycle getLifecycle() {
+ public Lifecycle getSettingsLifecycle() {
return mLifecycle;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnCreate.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnCreate.java
index ad7068e2f9fb..ada1537250b6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnCreate.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnCreate.java
@@ -16,8 +16,8 @@
package com.android.settingslib.core.lifecycle.events;
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
import android.os.Bundle;
/**
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnDestroy.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnDestroy.java
index c37286e1efaa..938374832d38 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnDestroy.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnDestroy.java
@@ -15,8 +15,8 @@
*/
package com.android.settingslib.core.lifecycle.events;
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
/**
* @deprecated use {@link OnLifecycleEvent(Lifecycle.Event) }
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnPause.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnPause.java
index a5ab39c46ab1..b75d6d9d8438 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnPause.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnPause.java
@@ -15,8 +15,8 @@
*/
package com.android.settingslib.core.lifecycle.events;
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
/**
* @deprecated use {@link OnLifecycleEvent(Lifecycle.Event) }
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnResume.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnResume.java
index 1effba4a750d..5b0ff60b793d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnResume.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnResume.java
@@ -15,8 +15,8 @@
*/
package com.android.settingslib.core.lifecycle.events;
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
/**
* @deprecated use {@link OnLifecycleEvent(Lifecycle.Event)}
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStart.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStart.java
index 07b8460367c1..7994dfd182f9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStart.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStart.java
@@ -15,8 +15,8 @@
*/
package com.android.settingslib.core.lifecycle.events;
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
/**
* @deprecated use {@link OnLifecycleEvent(Lifecycle.Event) }
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStop.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStop.java
index d6a5967116be..52a13978d956 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStop.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/OnStop.java
@@ -15,8 +15,8 @@
*/
package com.android.settingslib.core.lifecycle.events;
-import android.arch.lifecycle.Lifecycle;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
/**
* @deprecated use {@link OnLifecycleEvent(Lifecycle.Event) }
diff --git a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/SetPreferenceScreen.java b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/SetPreferenceScreen.java
index cdd72fbc883f..87be3481eaa7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/SetPreferenceScreen.java
+++ b/packages/SettingsLib/src/com/android/settingslib/core/lifecycle/events/SetPreferenceScreen.java
@@ -16,7 +16,7 @@
package com.android.settingslib.core.lifecycle.events;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.PreferenceScreen;
public interface SetPreferenceScreen {
diff --git a/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java b/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java
index 974b2a4389e2..75c2533d5d43 100644
--- a/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java
+++ b/packages/SettingsLib/src/com/android/settingslib/datetime/ZoneGetter.java
@@ -20,9 +20,9 @@ import android.content.Context;
import android.content.res.XmlResourceParser;
import android.icu.text.TimeZoneFormat;
import android.icu.text.TimeZoneNames;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.text.BidiFormatter;
-import android.support.v4.text.TextDirectionHeuristicsCompat;
+import androidx.annotation.VisibleForTesting;
+import androidx.core.text.BidiFormatter;
+import androidx.core.text.TextDirectionHeuristicsCompat;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
@@ -381,7 +381,7 @@ public class ZoneGetter {
// Create a lookup of local zone IDs.
final List<String> zoneIds = lookupTimeZoneIdsByCountry(locale.getCountry());
- localZoneIds = new HashSet<>(zoneIds);
+ localZoneIds = zoneIds != null ? new HashSet<>(zoneIds) : new HashSet<>();
}
@VisibleForTesting
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java
index 2d3dfe4511e0..b512448454f8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java
@@ -22,12 +22,12 @@ import android.content.Context;
import android.content.Intent;
import android.os.UserManager;
import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.TwoStatePreference;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.SwitchPreference;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
import android.text.TextUtils;
import com.android.settingslib.core.ConfirmationDialogController;
@@ -59,8 +59,7 @@ public abstract class AbstractEnableAdbPreferenceController extends
@Override
public boolean isAvailable() {
- final UserManager um = mContext.getSystemService(UserManager.class);
- return um != null && (um.isAdminUser() || um.isDemoUser());
+ return mContext.getSystemService(UserManager.class).isAdminUser();
}
@Override
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogdSizePreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogdSizePreferenceController.java
index f79be7eaddb1..e2f6b7b87560 100644
--- a/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogdSizePreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogdSizePreferenceController.java
@@ -19,11 +19,11 @@ package com.android.settingslib.development;
import android.content.Context;
import android.content.Intent;
import android.os.SystemProperties;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.VisibleForTesting;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.R;
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogpersistPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogpersistPreferenceController.java
index 77b2d86c445f..f277c16a1e2c 100644
--- a/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogpersistPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogpersistPreferenceController.java
@@ -22,11 +22,11 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.SystemProperties;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.VisibleForTesting;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.text.TextUtils;
import com.android.settingslib.R;
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/DeveloperOptionsPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/development/DeveloperOptionsPreferenceController.java
index d3dc8aa13482..15d5522bbd7b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/development/DeveloperOptionsPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/development/DeveloperOptionsPreferenceController.java
@@ -17,8 +17,8 @@
package com.android.settingslib.development;
import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.AbstractPreferenceController;
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java b/packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java
index d21da4e1cd0e..13d28fc6ef04 100644
--- a/packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java
+++ b/packages/SettingsLib/src/com/android/settingslib/development/DevelopmentSettingsEnabler.java
@@ -21,7 +21,7 @@ import android.content.Intent;
import android.os.Build;
import android.os.UserManager;
import android.provider.Settings;
-import android.support.v4.content.LocalBroadcastManager;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
public class DevelopmentSettingsEnabler {
@@ -45,7 +45,7 @@ public class DevelopmentSettingsEnabler {
Build.TYPE.equals("eng") ? 1 : 0) != 0;
final boolean hasRestriction = um.hasUserRestriction(
UserManager.DISALLOW_DEBUGGING_FEATURES);
- final boolean isAdminOrDemo = um.isAdminUser() || um.isDemoUser();
- return isAdminOrDemo && !hasRestriction && settingEnabled;
+ final boolean isAdmin = um.isAdminUser();
+ return isAdmin && !hasRestriction && settingEnabled;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java b/packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java
index 628d0d08b526..dba22d0c6af3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/development/SystemPropPoker.java
@@ -21,8 +21,8 @@ import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import android.util.Log;
public class SystemPropPoker {
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractBluetoothAddressPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractBluetoothAddressPreferenceController.java
index ba358f83c9d5..821b4d5da049 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractBluetoothAddressPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractBluetoothAddressPreferenceController.java
@@ -19,9 +19,9 @@ package com.android.settingslib.deviceinfo;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.text.TextUtils;
import com.android.settingslib.R;
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractImsStatusPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractImsStatusPreferenceController.java
index bb8404b0abd5..10260de289d3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractImsStatusPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractImsStatusPreferenceController.java
@@ -21,9 +21,9 @@ import android.content.Context;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.PersistableBundle;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractIpAddressPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractIpAddressPreferenceController.java
index ded30226e2ae..45cd86667f1e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractIpAddressPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractIpAddressPreferenceController.java
@@ -20,9 +20,9 @@ import android.content.Context;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
import android.net.wifi.WifiManager;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.R;
import com.android.settingslib.core.lifecycle.Lifecycle;
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractSerialNumberPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractSerialNumberPreferenceController.java
index 90f14ef4c32c..60b29fb8682f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractSerialNumberPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractSerialNumberPreferenceController.java
@@ -18,9 +18,9 @@ package com.android.settingslib.deviceinfo;
import android.content.Context;
import android.os.Build;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.text.TextUtils;
import com.android.settingslib.core.AbstractPreferenceController;
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractUptimePreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractUptimePreferenceController.java
index ac61ade19222..332a2a463b74 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractUptimePreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractUptimePreferenceController.java
@@ -20,9 +20,9 @@ import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.text.format.DateUtils;
import com.android.settingslib.core.AbstractPreferenceController;
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractWifiMacAddressPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractWifiMacAddressPreferenceController.java
index 2a86993124f6..ffbda3ae76ae 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractWifiMacAddressPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractWifiMacAddressPreferenceController.java
@@ -22,9 +22,9 @@ import android.net.ConnectivityManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.text.TextUtils;
import com.android.settingslib.R;
@@ -38,6 +38,10 @@ public abstract class AbstractWifiMacAddressPreferenceController
@VisibleForTesting
static final String KEY_WIFI_MAC_ADDRESS = "wifi_mac_address";
+ @VisibleForTesting
+ static final int OFF = 0;
+ @VisibleForTesting
+ static final int ON = 1;
private static final String[] CONNECTIVITY_INTENTS = {
ConnectivityManager.CONNECTIVITY_ACTION,
@@ -80,13 +84,14 @@ public abstract class AbstractWifiMacAddressPreferenceController
protected void updateConnectivity() {
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
final int macRandomizationMode = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 0);
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, OFF);
final String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
- if (TextUtils.isEmpty(macAddress)) {
- mWifiMacAddress.setSummary(R.string.status_unavailable);
- } else if (macRandomizationMode == 1 && WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
+ if (macRandomizationMode == ON && WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
mWifiMacAddress.setSummary(R.string.wifi_status_mac_randomized);
+ } else if (TextUtils.isEmpty(macAddress)
+ || WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
+ mWifiMacAddress.setSummary(R.string.status_unavailable);
} else {
mWifiMacAddress.setSummary(macAddress);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
index 54d1aba09ae3..2213db88f2fd 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawable/UserIconDrawable.java
@@ -16,6 +16,7 @@
package com.android.settingslib.drawable;
+import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.annotation.NonNull;
import android.app.admin.DevicePolicyManager;
@@ -251,11 +252,8 @@ public class UserIconDrawable extends Drawable implements Drawable.Callback {
mPaint.setColorFilter(null);
} else {
int color = mTintColor.getColorForState(getState(), mTintColor.getDefaultColor());
- if (mPaint.getColorFilter() == null) {
+ if (shouldUpdateColorFilter(color, mTintMode)) {
mPaint.setColorFilter(new PorterDuffColorFilter(color, mTintMode));
- } else {
- ((PorterDuffColorFilter) mPaint.getColorFilter()).setMode(mTintMode);
- ((PorterDuffColorFilter) mPaint.getColorFilter()).setColor(color);
}
}
@@ -263,6 +261,18 @@ public class UserIconDrawable extends Drawable implements Drawable.Callback {
}
}
+ private boolean shouldUpdateColorFilter(@ColorInt int color, PorterDuff.Mode mode) {
+ ColorFilter colorFilter = mPaint.getColorFilter();
+ if (colorFilter instanceof PorterDuffColorFilter) {
+ PorterDuffColorFilter porterDuffColorFilter = (PorterDuffColorFilter) colorFilter;
+ int currentColor = porterDuffColorFilter.getColor();
+ PorterDuff.Mode currentMode = porterDuffColorFilter.getMode();
+ return currentColor != color || currentMode != mode;
+ } else {
+ return true;
+ }
+ }
+
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java
index 07033304653c..d9605367dc56 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java
@@ -17,7 +17,7 @@ package com.android.settingslib.drawer;
import android.content.ComponentName;
import android.content.Context;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/Tile.java b/packages/SettingsLib/src/com/android/settingslib/drawer/Tile.java
index f1d43bfe4096..b55d2ef59445 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/Tile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/Tile.java
@@ -16,6 +16,10 @@
package com.android.settingslib.drawer;
+import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE;
+import static com.android.settingslib.drawer.TileUtils.PROFILE_ALL;
+import static com.android.settingslib.drawer.TileUtils.PROFILE_PRIMARY;
+
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.os.Bundle;
@@ -169,4 +173,11 @@ public class Tile implements Parcelable {
return new Tile[size];
}
};
+
+ public boolean isPrimaryProfileOnly() {
+ String profile = metaData != null ?
+ metaData.getString(META_DATA_KEY_PROFILE) : PROFILE_ALL;
+ profile = (profile != null ? profile : PROFILE_ALL);
+ return TextUtils.equals(profile, PROFILE_PRIMARY);
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
index 0f0e4e57886c..96ed0cdb8ab5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
@@ -34,8 +34,8 @@ import android.provider.Settings.Global;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
-import android.widget.RemoteViews;
+import androidx.annotation.VisibleForTesting;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -96,11 +96,7 @@ public class TileUtils {
/**
* The key used to get the category from metadata of activities of action
* {@link #EXTRA_SETTINGS_ACTION}
- * The value must be one of:
- * <li>com.android.settings.category.wireless</li>
- * <li>com.android.settings.category.device</li>
- * <li>com.android.settings.category.personal</li>
- * <li>com.android.settings.category.system</li>
+ * The value must be from {@link CategoryKey}.
*/
private static final String EXTRA_CATEGORY_KEY = "com.android.settings.category";
@@ -171,18 +167,35 @@ public class TileUtils {
public static final String META_DATA_PREFERENCE_SUMMARY_URI =
"com.android.settings.summary_uri";
+ public static final String SETTING_PKG = "com.android.settings";
+
/**
- * Name of the meta-data item that should be set in the AndroidManifest.xml to specify the
- * custom view which should be displayed for the preference. The custom view will be inflated
- * as a remote view.
+ * Value for {@link #META_DATA_KEY_PROFILE}. When the device has a managed profile,
+ * the app will always be run in the primary profile.
*
- * This also can be used with {@link #META_DATA_PREFERENCE_SUMMARY_URI}, by setting the id
- * of the summary TextView to '@android:id/summary'.
+ * @see #META_DATA_KEY_PROFILE
*/
- public static final String META_DATA_PREFERENCE_CUSTOM_VIEW =
- "com.android.settings.custom_view";
+ public static final String PROFILE_PRIMARY = "primary_profile_only";
- public static final String SETTING_PKG = "com.android.settings";
+ /**
+ * Value for {@link #META_DATA_KEY_PROFILE}. When the device has a managed profile, the user
+ * will be presented with a dialog to choose the profile the app will be run in.
+ *
+ * @see #META_DATA_KEY_PROFILE
+ */
+ public static final String PROFILE_ALL = "all_profiles";
+
+ /**
+ * Name of the meta-data item that should be set in the AndroidManifest.xml
+ * to specify the profile in which the app should be run when the device has a managed profile.
+ * The default value is {@link #PROFILE_ALL} which means the user will be presented with a
+ * dialog to choose the profile. If set to {@link #PROFILE_PRIMARY} the app will always be
+ * run in the primary profile.
+ *
+ * @see #PROFILE_PRIMARY
+ * @see #PROFILE_ALL
+ */
+ public static final String META_DATA_KEY_PROFILE = "com.android.settings.profile";
/**
* Build a list of DashboardCategory. Each category must be defined in manifest.
@@ -442,11 +455,6 @@ public class TileUtils {
keyHint = metaData.getString(META_DATA_PREFERENCE_KEYHINT);
}
}
- if (metaData.containsKey(META_DATA_PREFERENCE_CUSTOM_VIEW)) {
- int layoutId = metaData.getInt(META_DATA_PREFERENCE_CUSTOM_VIEW);
- tile.remoteViews = new RemoteViews(applicationInfo.packageName, layoutId);
- updateSummaryAndTitle(context, providerMap, tile);
- }
}
} catch (PackageManager.NameNotFoundException | Resources.NotFoundException e) {
if (DEBUG) Log.d(LOG_TAG, "Couldn't find info", e);
diff --git a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
index 988060eac64d..3c0f6fe8ccbb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
+++ b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java
@@ -36,12 +36,12 @@ import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -97,15 +97,15 @@ public class DreamBackend {
}
public DreamBackend(Context context) {
- mContext = context;
+ mContext = context.getApplicationContext();
mDreamManager = IDreamManager.Stub.asInterface(
ServiceManager.getService(DreamService.DREAM_SERVICE));
mComparator = new DreamInfoComparator(getDefaultDream());
- mDreamsEnabledByDefault = context.getResources()
+ mDreamsEnabledByDefault = mContext.getResources()
.getBoolean(com.android.internal.R.bool.config_dreamsEnabledByDefault);
- mDreamsActivatedOnSleepByDefault = context.getResources()
+ mDreamsActivatedOnSleepByDefault = mContext.getResources()
.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
- mDreamsActivatedOnDockByDefault = context.getResources()
+ mDreamsActivatedOnDockByDefault = mContext.getResources()
.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
}
@@ -256,11 +256,12 @@ public class DreamBackend {
}
}
- public void launchSettings(DreamInfo dreamInfo) {
+ public void launchSettings(Context uiContext, DreamInfo dreamInfo) {
logd("launchSettings(%s)", dreamInfo);
- if (dreamInfo == null || dreamInfo.settingsComponentName == null)
+ if (dreamInfo == null || dreamInfo.settingsComponentName == null) {
return;
- mContext.startActivity(new Intent().setComponent(dreamInfo.settingsComponentName));
+ }
+ uiContext.startActivity(new Intent().setComponent(dreamInfo.settingsComponentName));
}
public void preview(DreamInfo dreamInfo) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
index c9990e574eed..94efc71e6467 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
@@ -23,7 +23,6 @@ import android.content.pm.PackageManager;
import android.os.IDeviceIdleController;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.support.annotation.VisibleForTesting;
import android.telecom.DefaultDialerManager;
import android.text.TextUtils;
import android.util.ArraySet;
@@ -32,6 +31,8 @@ import android.util.Log;
import com.android.internal.telephony.SmsApplication;
import com.android.internal.util.ArrayUtils;
+import androidx.annotation.VisibleForTesting;
+
/**
* Handles getting/changing the whitelist for the exceptions to battery saving features.
*/
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
index 2fc6db08c7f9..17c2b02ed576 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
@@ -107,7 +107,8 @@ public class BatteryMeterDrawableBase extends Drawable {
for (int i = 0; i < N; i++) {
mColors[2 * i] = levels.getInt(i, 0);
if (colors.getType(i) == TypedValue.TYPE_ATTRIBUTE) {
- mColors[2 * i + 1] = Utils.getColorAttr(context, colors.getThemeAttributeId(i, 0));
+ mColors[2 * i + 1] = Utils.getColorAttrDefaultColor(context,
+ colors.getThemeAttributeId(i, 0));
} else {
mColors[2 * i + 1] = colors.getColor(i, 0);
}
@@ -149,14 +150,16 @@ public class BatteryMeterDrawableBase extends Drawable {
mWarningTextPaint.setColor(mColors[1]);
}
- mChargeColor = Utils.getDefaultColor(mContext, R.color.meter_consumed_color);
+ mChargeColor = Utils.getColorStateListDefaultColor(mContext, R.color.meter_consumed_color);
mBoltPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mBoltPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_bolt_color));
+ mBoltPaint.setColor(Utils.getColorStateListDefaultColor(mContext,
+ R.color.batterymeter_bolt_color));
mBoltPoints = loadPoints(res, R.array.batterymeter_bolt_points);
mPlusPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mPlusPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_plus_color));
+ mPlusPaint.setColor(Utils.getColorStateListDefaultColor(mContext,
+ R.color.batterymeter_plus_color));
mPlusPoints = loadPoints(res, R.array.batterymeter_plus_points);
mPowersavePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
@@ -207,6 +210,10 @@ public class BatteryMeterDrawableBase extends Drawable {
postInvalidate();
}
+ public boolean getPowerSave() {
+ return mPowerSaveEnabled;
+ }
+
protected void setPowerSaveAsColorError(boolean asError) {
mPowerSaveAsColorError = asError;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
index 3c5ac8dff0af..d0804bb88162 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BluetoothDeviceLayerDrawable.java
@@ -28,7 +28,7 @@ import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.view.Gravity;
import android.view.View;
@@ -117,7 +117,8 @@ public class BluetoothDeviceLayerDrawable extends LayerDrawable {
R.fraction.bt_battery_button_height_fraction, 1, 1);
mAspectRatio = resources.getFraction(R.fraction.bt_battery_ratio_fraction, 1, 1);
- final int tintColor = Utils.getColorAttr(context, android.R.attr.colorControlNormal);
+ final int tintColor = Utils.getColorAttrDefaultColor(context,
+ android.R.attr.colorControlNormal);
setColorFilter(new PorterDuffColorFilter(tintColor, PorterDuff.Mode.SRC_IN));
setBatteryLevel(batteryLevel);
mFrameColor = frameColor;
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
index 846e30d50063..a6b57550c358 100644
--- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java
@@ -132,13 +132,17 @@ public class SignalDrawable extends Drawable {
public SignalDrawable(Context context) {
mDarkModeBackgroundColor =
- Utils.getDefaultColor(context, R.color.dark_mode_icon_color_dual_tone_background);
+ Utils.getColorStateListDefaultColor(context,
+ R.color.dark_mode_icon_color_dual_tone_background);
mDarkModeFillColor =
- Utils.getDefaultColor(context, R.color.dark_mode_icon_color_dual_tone_fill);
+ Utils.getColorStateListDefaultColor(context,
+ R.color.dark_mode_icon_color_dual_tone_fill);
mLightModeBackgroundColor =
- Utils.getDefaultColor(context, R.color.light_mode_icon_color_dual_tone_background);
+ Utils.getColorStateListDefaultColor(context,
+ R.color.light_mode_icon_color_dual_tone_background);
mLightModeFillColor =
- Utils.getDefaultColor(context, R.color.light_mode_icon_color_dual_tone_fill);
+ Utils.getColorStateListDefaultColor(context,
+ R.color.light_mode_icon_color_dual_tone_fill);
mIntrinsicSize = context.getResources().getDimensionPixelSize(R.dimen.signal_icon_size);
mHandler = new Handler();
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManager.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManager.java
index c9e3475eafd6..628e70af8318 100644
--- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManager.java
@@ -19,11 +19,11 @@ package com.android.settingslib.inputmethod;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.TwoStatePreference;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
import android.text.TextUtils;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManagerCompat.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManagerCompat.java
new file mode 100644
index 000000000000..ad1368c7731d
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeEnablerManagerCompat.java
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settingslib.inputmethod;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.settingslib.R;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
+
+public class InputMethodAndSubtypeEnablerManagerCompat implements
+ Preference.OnPreferenceChangeListener {
+
+ private final PreferenceFragmentCompat mFragment;
+
+ private boolean mHaveHardKeyboard;
+ private final HashMap<String, List<Preference>> mInputMethodAndSubtypePrefsMap =
+ new HashMap<>();
+ private final HashMap<String, TwoStatePreference> mAutoSelectionPrefsMap = new HashMap<>();
+ private InputMethodManager mImm;
+ // TODO: Change mInputMethodInfoList to Map
+ private List<InputMethodInfo> mInputMethodInfoList;
+ private final Collator mCollator = Collator.getInstance();
+
+ public InputMethodAndSubtypeEnablerManagerCompat(PreferenceFragmentCompat fragment) {
+ mFragment = fragment;
+ mImm = fragment.getContext().getSystemService(InputMethodManager.class);
+
+ mInputMethodInfoList = mImm.getInputMethodList();
+ }
+
+ public void init(PreferenceFragmentCompat fragment, String targetImi, PreferenceScreen root) {
+ final Configuration config = fragment.getResources().getConfiguration();
+ mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY);
+
+ for (final InputMethodInfo imi : mInputMethodInfoList) {
+ // Add subtype preferences of this IME when it is specified or no IME is specified.
+ if (imi.getId().equals(targetImi) || TextUtils.isEmpty(targetImi)) {
+ addInputMethodSubtypePreferences(fragment, imi, root);
+ }
+ }
+ }
+
+ public void refresh(Context context, PreferenceFragmentCompat fragment) {
+ // Refresh internal states in mInputMethodSettingValues to keep the latest
+ // "InputMethodInfo"s and "InputMethodSubtype"s
+ InputMethodSettingValuesWrapper
+ .getInstance(context).refreshAllInputMethodAndSubtypes();
+ InputMethodAndSubtypeUtilCompat.loadInputMethodSubtypeList(fragment,
+ context.getContentResolver(), mInputMethodInfoList, mInputMethodAndSubtypePrefsMap);
+ updateAutoSelectionPreferences();
+ }
+
+ public void save(Context context, PreferenceFragmentCompat fragment) {
+ InputMethodAndSubtypeUtilCompat.saveInputMethodSubtypeList(fragment,
+ context.getContentResolver(), mInputMethodInfoList, mHaveHardKeyboard);
+ }
+
+ @Override
+ public boolean onPreferenceChange(final Preference pref, final Object newValue) {
+ if (!(newValue instanceof Boolean)) {
+ return true; // Invoke default behavior.
+ }
+ final boolean isChecking = (Boolean) newValue;
+ for (final String imiId : mAutoSelectionPrefsMap.keySet()) {
+ // An auto select subtype preference is changing.
+ if (mAutoSelectionPrefsMap.get(imiId) == pref) {
+ final TwoStatePreference autoSelectionPref = (TwoStatePreference) pref;
+ autoSelectionPref.setChecked(isChecking);
+ // Enable or disable subtypes depending on the auto selection preference.
+ setAutoSelectionSubtypesEnabled(imiId, autoSelectionPref.isChecked());
+ return false;
+ }
+ }
+ // A subtype preference is changing.
+ if (pref instanceof InputMethodSubtypePreference) {
+ final InputMethodSubtypePreference subtypePref = (InputMethodSubtypePreference) pref;
+ subtypePref.setChecked(isChecking);
+ if (!subtypePref.isChecked()) {
+ // It takes care of the case where no subtypes are explicitly enabled then the auto
+ // selection preference is going to be checked.
+ updateAutoSelectionPreferences();
+ }
+ return false;
+ }
+ return true; // Invoke default behavior.
+ }
+
+ private void addInputMethodSubtypePreferences(PreferenceFragmentCompat fragment,
+ InputMethodInfo imi, final PreferenceScreen root) {
+ Context prefContext = fragment.getPreferenceManager().getContext();
+
+ final int subtypeCount = imi.getSubtypeCount();
+ if (subtypeCount <= 1) {
+ return;
+ }
+ final String imiId = imi.getId();
+ final PreferenceCategory keyboardSettingsCategory =
+ new PreferenceCategory(prefContext);
+ root.addPreference(keyboardSettingsCategory);
+ final PackageManager pm = prefContext.getPackageManager();
+ final CharSequence label = imi.loadLabel(pm);
+
+ keyboardSettingsCategory.setTitle(label);
+ keyboardSettingsCategory.setKey(imiId);
+ // TODO: Use toggle Preference if images are ready.
+ final TwoStatePreference autoSelectionPref =
+ new SwitchWithNoTextPreference(prefContext);
+ mAutoSelectionPrefsMap.put(imiId, autoSelectionPref);
+ keyboardSettingsCategory.addPreference(autoSelectionPref);
+ autoSelectionPref.setOnPreferenceChangeListener(this);
+
+ final PreferenceCategory activeInputMethodsCategory =
+ new PreferenceCategory(prefContext);
+ activeInputMethodsCategory.setTitle(R.string.active_input_method_subtypes);
+ root.addPreference(activeInputMethodsCategory);
+
+ CharSequence autoSubtypeLabel = null;
+ final ArrayList<Preference> subtypePreferences = new ArrayList<>();
+ for (int index = 0; index < subtypeCount; ++index) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(index);
+ if (subtype.overridesImplicitlyEnabledSubtype()) {
+ if (autoSubtypeLabel == null) {
+ autoSubtypeLabel = InputMethodAndSubtypeUtil.getSubtypeLocaleNameAsSentence(
+ subtype, prefContext, imi);
+ }
+ } else {
+ final Preference subtypePref = new InputMethodSubtypePreference(
+ prefContext, subtype, imi);
+ subtypePreferences.add(subtypePref);
+ }
+ }
+ subtypePreferences.sort((lhs, rhs) -> {
+ if (lhs instanceof InputMethodSubtypePreference) {
+ return ((InputMethodSubtypePreference) lhs).compareTo(rhs, mCollator);
+ }
+ return lhs.compareTo(rhs);
+ });
+ for (final Preference pref : subtypePreferences) {
+ activeInputMethodsCategory.addPreference(pref);
+ pref.setOnPreferenceChangeListener(this);
+ InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref);
+ }
+ mInputMethodAndSubtypePrefsMap.put(imiId, subtypePreferences);
+ if (TextUtils.isEmpty(autoSubtypeLabel)) {
+ autoSelectionPref.setTitle(
+ R.string.use_system_language_to_select_input_method_subtypes);
+ } else {
+ autoSelectionPref.setTitle(autoSubtypeLabel);
+ }
+ }
+
+ private boolean isNoSubtypesExplicitlySelected(final String imiId) {
+ final List<Preference> subtypePrefs = mInputMethodAndSubtypePrefsMap.get(imiId);
+ for (final Preference pref : subtypePrefs) {
+ if (pref instanceof TwoStatePreference && ((TwoStatePreference) pref).isChecked()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void setAutoSelectionSubtypesEnabled(final String imiId,
+ final boolean autoSelectionEnabled) {
+ final TwoStatePreference autoSelectionPref = mAutoSelectionPrefsMap.get(imiId);
+ if (autoSelectionPref == null) {
+ return;
+ }
+ autoSelectionPref.setChecked(autoSelectionEnabled);
+ final List<Preference> subtypePrefs = mInputMethodAndSubtypePrefsMap.get(imiId);
+ for (final Preference pref : subtypePrefs) {
+ if (pref instanceof TwoStatePreference) {
+ // When autoSelectionEnabled is true, all subtype prefs need to be disabled with
+ // implicitly checked subtypes. In case of false, all subtype prefs need to be
+ // enabled.
+ pref.setEnabled(!autoSelectionEnabled);
+ if (autoSelectionEnabled) {
+ ((TwoStatePreference) pref).setChecked(false);
+ }
+ }
+ }
+ if (autoSelectionEnabled) {
+ InputMethodAndSubtypeUtilCompat.saveInputMethodSubtypeList(
+ mFragment, mFragment.getContext().getContentResolver(),
+ mInputMethodInfoList, mHaveHardKeyboard);
+ updateImplicitlyEnabledSubtypes(imiId);
+ }
+ }
+
+ private void updateImplicitlyEnabledSubtypes(final String targetImiId) {
+ // When targetImiId is null, apply to all subtypes of all IMEs
+ for (final InputMethodInfo imi : mInputMethodInfoList) {
+ final String imiId = imi.getId();
+ final TwoStatePreference autoSelectionPref = mAutoSelectionPrefsMap.get(imiId);
+ // No need to update implicitly enabled subtypes when the user has unchecked the
+ // "subtype auto selection".
+ if (autoSelectionPref == null || !autoSelectionPref.isChecked()) {
+ continue;
+ }
+ if (imiId.equals(targetImiId) || targetImiId == null) {
+ updateImplicitlyEnabledSubtypesOf(imi);
+ }
+ }
+ }
+
+ private void updateImplicitlyEnabledSubtypesOf(final InputMethodInfo imi) {
+ final String imiId = imi.getId();
+ final List<Preference> subtypePrefs = mInputMethodAndSubtypePrefsMap.get(imiId);
+ final List<InputMethodSubtype> implicitlyEnabledSubtypes =
+ mImm.getEnabledInputMethodSubtypeList(imi, true);
+ if (subtypePrefs == null || implicitlyEnabledSubtypes == null) {
+ return;
+ }
+ for (final Preference pref : subtypePrefs) {
+ if (!(pref instanceof TwoStatePreference)) {
+ continue;
+ }
+ final TwoStatePreference subtypePref = (TwoStatePreference) pref;
+ subtypePref.setChecked(false);
+ for (final InputMethodSubtype subtype : implicitlyEnabledSubtypes) {
+ final String implicitlyEnabledSubtypePrefKey = imiId + subtype.hashCode();
+ if (subtypePref.getKey().equals(implicitlyEnabledSubtypePrefKey)) {
+ subtypePref.setChecked(true);
+ break;
+ }
+ }
+ }
+ }
+
+ private void updateAutoSelectionPreferences() {
+ for (final String imiId : mInputMethodAndSubtypePrefsMap.keySet()) {
+ setAutoSelectionSubtypesEnabled(imiId, isNoSubtypesExplicitlySelected(imiId));
+ }
+ updateImplicitlyEnabledSubtypes(null /* targetImiId */ /* check */);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java
index 55be13761a97..026bbd47711a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtil.java
@@ -25,17 +25,16 @@ import android.content.res.Configuration;
import android.icu.text.ListFormatter;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.TwoStatePreference;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
import android.text.TextUtils;
import android.util.Log;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.internal.app.LocaleHelper;
-import com.android.internal.inputmethod.InputMethodUtils;
import java.util.HashMap;
import java.util.HashSet;
@@ -49,6 +48,7 @@ public class InputMethodAndSubtypeUtil {
private static final boolean DEBUG = false;
private static final String TAG = "InputMethdAndSubtypeUtl";
+ private static final String SUBTYPE_MODE_KEYBOARD = "keyboard";
private static final char INPUT_METHOD_SEPARATER = ':';
private static final char INPUT_METHOD_SUBTYPE_SEPARATER = ';';
private static final int NOT_A_SUBTYPE_ID = -1;
@@ -61,7 +61,7 @@ public class InputMethodAndSubtypeUtil {
// InputMethods and subtypes are saved in the settings as follows:
// ime0;subtype0;subtype1:ime1;subtype0:ime2:ime3;subtype0;subtype1
- private static String buildInputMethodsAndSubtypesString(
+ public static String buildInputMethodsAndSubtypesString(
final HashMap<String, HashSet<String>> imeToSubtypesMap) {
final StringBuilder builder = new StringBuilder();
for (final String imi : imeToSubtypesMap.keySet()) {
@@ -106,7 +106,7 @@ public class InputMethodAndSubtypeUtil {
}
// Needs to modify InputMethodManageService if you want to change the format of saved string.
- private static HashMap<String, HashSet<String>> getEnabledInputMethodsAndSubtypeList(
+ static HashMap<String, HashSet<String>> getEnabledInputMethodsAndSubtypeList(
ContentResolver resolver) {
final String enabledInputMethodsStr = Settings.Secure.getString(
resolver, Settings.Secure.ENABLED_INPUT_METHODS);
@@ -116,7 +116,7 @@ public class InputMethodAndSubtypeUtil {
return parseInputMethodsAndSubtypesString(enabledInputMethodsStr);
}
- private static HashMap<String, HashSet<String>> parseInputMethodsAndSubtypesString(
+ public static HashMap<String, HashSet<String>> parseInputMethodsAndSubtypesString(
final String inputMethodsAndSubtypesString) {
final HashMap<String, HashSet<String>> subtypesMap = new HashMap<>();
if (TextUtils.isEmpty(inputMethodsAndSubtypesString)) {
@@ -176,9 +176,9 @@ public class InputMethodAndSubtypeUtil {
((TwoStatePreference) pref).isChecked()
: enabledIMEsAndSubtypesMap.containsKey(imiId);
final boolean isCurrentInputMethod = imiId.equals(currentInputMethodId);
- final boolean systemIme = InputMethodUtils.isSystemIme(imi);
+ final boolean systemIme = imi.isSystem();
if ((!hasHardKeyboard && InputMethodSettingValuesWrapper.getInstance(
- context.getActivity()).isAlwaysCheckedIme(imi, context.getActivity()))
+ context.getActivity()).isAlwaysCheckedIme(imi))
|| isImeChecked) {
if (!enabledIMEsAndSubtypesMap.containsKey(imiId)) {
// imiId has just been enabled
@@ -417,4 +417,19 @@ public class InputMethodAndSubtypeUtil {
}
return configurationLocale;
}
+
+ public static boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi) {
+ if (imi.isAuxiliaryIme() || !imi.isSystem()) {
+ return false;
+ }
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ if (SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())
+ && subtype.isAsciiCapable()) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilCompat.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilCompat.java
new file mode 100644
index 000000000000..9ad2adbcc432
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilCompat.java
@@ -0,0 +1,436 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settingslib.inputmethod;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.icu.text.ListFormatter;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.internal.app.LocaleHelper;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
+
+// TODO: Consolidate this with {@link InputMethodSettingValuesWrapper}.
+public class InputMethodAndSubtypeUtilCompat {
+
+ private static final boolean DEBUG = false;
+ private static final String TAG = "InputMethdAndSubtypeUtlCompat";
+
+ private static final String SUBTYPE_MODE_KEYBOARD = "keyboard";
+ private static final char INPUT_METHOD_SEPARATER = ':';
+ private static final char INPUT_METHOD_SUBTYPE_SEPARATER = ';';
+ private static final int NOT_A_SUBTYPE_ID = -1;
+
+ private static final TextUtils.SimpleStringSplitter sStringInputMethodSplitter
+ = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SEPARATER);
+
+ private static final TextUtils.SimpleStringSplitter sStringInputMethodSubtypeSplitter
+ = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATER);
+
+ // InputMethods and subtypes are saved in the settings as follows:
+ // ime0;subtype0;subtype1:ime1;subtype0:ime2:ime3;subtype0;subtype1
+ public static String buildInputMethodsAndSubtypesString(
+ final HashMap<String, HashSet<String>> imeToSubtypesMap) {
+ final StringBuilder builder = new StringBuilder();
+ for (final String imi : imeToSubtypesMap.keySet()) {
+ if (builder.length() > 0) {
+ builder.append(INPUT_METHOD_SEPARATER);
+ }
+ final HashSet<String> subtypeIdSet = imeToSubtypesMap.get(imi);
+ builder.append(imi);
+ for (final String subtypeId : subtypeIdSet) {
+ builder.append(INPUT_METHOD_SUBTYPE_SEPARATER).append(subtypeId);
+ }
+ }
+ return builder.toString();
+ }
+
+ private static String buildInputMethodsString(final HashSet<String> imiList) {
+ final StringBuilder builder = new StringBuilder();
+ for (final String imi : imiList) {
+ if (builder.length() > 0) {
+ builder.append(INPUT_METHOD_SEPARATER);
+ }
+ builder.append(imi);
+ }
+ return builder.toString();
+ }
+
+ private static int getInputMethodSubtypeSelected(ContentResolver resolver) {
+ try {
+ return Settings.Secure.getInt(resolver,
+ Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE);
+ } catch (SettingNotFoundException e) {
+ return NOT_A_SUBTYPE_ID;
+ }
+ }
+
+ private static boolean isInputMethodSubtypeSelected(ContentResolver resolver) {
+ return getInputMethodSubtypeSelected(resolver) != NOT_A_SUBTYPE_ID;
+ }
+
+ private static void putSelectedInputMethodSubtype(ContentResolver resolver, int hashCode) {
+ Settings.Secure.putInt(resolver, Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, hashCode);
+ }
+
+ // Needs to modify InputMethodManageService if you want to change the format of saved string.
+ static HashMap<String, HashSet<String>> getEnabledInputMethodsAndSubtypeList(
+ ContentResolver resolver) {
+ final String enabledInputMethodsStr = Settings.Secure.getString(
+ resolver, Settings.Secure.ENABLED_INPUT_METHODS);
+ if (DEBUG) {
+ Log.d(TAG, "--- Load enabled input methods: " + enabledInputMethodsStr);
+ }
+ return parseInputMethodsAndSubtypesString(enabledInputMethodsStr);
+ }
+
+ public static HashMap<String, HashSet<String>> parseInputMethodsAndSubtypesString(
+ final String inputMethodsAndSubtypesString) {
+ final HashMap<String, HashSet<String>> subtypesMap = new HashMap<>();
+ if (TextUtils.isEmpty(inputMethodsAndSubtypesString)) {
+ return subtypesMap;
+ }
+ sStringInputMethodSplitter.setString(inputMethodsAndSubtypesString);
+ while (sStringInputMethodSplitter.hasNext()) {
+ final String nextImsStr = sStringInputMethodSplitter.next();
+ sStringInputMethodSubtypeSplitter.setString(nextImsStr);
+ if (sStringInputMethodSubtypeSplitter.hasNext()) {
+ final HashSet<String> subtypeIdSet = new HashSet<>();
+ // The first element is {@link InputMethodInfoId}.
+ final String imiId = sStringInputMethodSubtypeSplitter.next();
+ while (sStringInputMethodSubtypeSplitter.hasNext()) {
+ subtypeIdSet.add(sStringInputMethodSubtypeSplitter.next());
+ }
+ subtypesMap.put(imiId, subtypeIdSet);
+ }
+ }
+ return subtypesMap;
+ }
+
+ private static HashSet<String> getDisabledSystemIMEs(ContentResolver resolver) {
+ HashSet<String> set = new HashSet<>();
+ String disabledIMEsStr = Settings.Secure.getString(
+ resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS);
+ if (TextUtils.isEmpty(disabledIMEsStr)) {
+ return set;
+ }
+ sStringInputMethodSplitter.setString(disabledIMEsStr);
+ while(sStringInputMethodSplitter.hasNext()) {
+ set.add(sStringInputMethodSplitter.next());
+ }
+ return set;
+ }
+
+ public static void saveInputMethodSubtypeList(PreferenceFragmentCompat context,
+ ContentResolver resolver, List<InputMethodInfo> inputMethodInfos,
+ boolean hasHardKeyboard) {
+ String currentInputMethodId = Settings.Secure.getString(resolver,
+ Settings.Secure.DEFAULT_INPUT_METHOD);
+ final int selectedInputMethodSubtype = getInputMethodSubtypeSelected(resolver);
+ final HashMap<String, HashSet<String>> enabledIMEsAndSubtypesMap =
+ getEnabledInputMethodsAndSubtypeList(resolver);
+ final HashSet<String> disabledSystemIMEs = getDisabledSystemIMEs(resolver);
+
+ boolean needsToResetSelectedSubtype = false;
+ for (final InputMethodInfo imi : inputMethodInfos) {
+ final String imiId = imi.getId();
+ final Preference pref = context.findPreference(imiId);
+ if (pref == null) {
+ continue;
+ }
+ // In the choose input method screen or in the subtype enabler screen,
+ // <code>pref</code> is an instance of TwoStatePreference.
+ final boolean isImeChecked = (pref instanceof TwoStatePreference) ?
+ ((TwoStatePreference) pref).isChecked()
+ : enabledIMEsAndSubtypesMap.containsKey(imiId);
+ final boolean isCurrentInputMethod = imiId.equals(currentInputMethodId);
+ final boolean systemIme = imi.isSystem();
+ if ((!hasHardKeyboard && InputMethodSettingValuesWrapper.getInstance(
+ context.getActivity()).isAlwaysCheckedIme(imi))
+ || isImeChecked) {
+ if (!enabledIMEsAndSubtypesMap.containsKey(imiId)) {
+ // imiId has just been enabled
+ enabledIMEsAndSubtypesMap.put(imiId, new HashSet<>());
+ }
+ final HashSet<String> subtypesSet = enabledIMEsAndSubtypesMap.get(imiId);
+
+ boolean subtypePrefFound = false;
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ final String subtypeHashCodeStr = String.valueOf(subtype.hashCode());
+ final TwoStatePreference subtypePref = (TwoStatePreference) context
+ .findPreference(imiId + subtypeHashCodeStr);
+ // In the Configure input method screen which does not have subtype preferences.
+ if (subtypePref == null) {
+ continue;
+ }
+ if (!subtypePrefFound) {
+ // Once subtype preference is found, subtypeSet needs to be cleared.
+ // Because of system change, hashCode value could have been changed.
+ subtypesSet.clear();
+ // If selected subtype preference is disabled, needs to reset.
+ needsToResetSelectedSubtype = true;
+ subtypePrefFound = true;
+ }
+ // Checking <code>subtypePref.isEnabled()</code> is insufficient to determine
+ // whether the user manually enabled this subtype or not. Implicitly-enabled
+ // subtypes are also checked just as an indicator to users. We also need to
+ // check <code>subtypePref.isEnabled()</code> so that only manually enabled
+ // subtypes can be saved here.
+ if (subtypePref.isEnabled() && subtypePref.isChecked()) {
+ subtypesSet.add(subtypeHashCodeStr);
+ if (isCurrentInputMethod) {
+ if (selectedInputMethodSubtype == subtype.hashCode()) {
+ // Selected subtype is still enabled, there is no need to reset
+ // selected subtype.
+ needsToResetSelectedSubtype = false;
+ }
+ }
+ } else {
+ subtypesSet.remove(subtypeHashCodeStr);
+ }
+ }
+ } else {
+ enabledIMEsAndSubtypesMap.remove(imiId);
+ if (isCurrentInputMethod) {
+ // We are processing the current input method, but found that it's not enabled.
+ // This means that the current input method has been uninstalled.
+ // If currentInputMethod is already uninstalled, InputMethodManagerService will
+ // find the applicable IME from the history and the system locale.
+ if (DEBUG) {
+ Log.d(TAG, "Current IME was uninstalled or disabled.");
+ }
+ currentInputMethodId = null;
+ }
+ }
+ // If it's a disabled system ime, add it to the disabled list so that it
+ // doesn't get enabled automatically on any changes to the package list
+ if (systemIme && hasHardKeyboard) {
+ if (disabledSystemIMEs.contains(imiId)) {
+ if (isImeChecked) {
+ disabledSystemIMEs.remove(imiId);
+ }
+ } else {
+ if (!isImeChecked) {
+ disabledSystemIMEs.add(imiId);
+ }
+ }
+ }
+ }
+
+ final String enabledIMEsAndSubtypesString = buildInputMethodsAndSubtypesString(
+ enabledIMEsAndSubtypesMap);
+ final String disabledSystemIMEsString = buildInputMethodsString(disabledSystemIMEs);
+ if (DEBUG) {
+ Log.d(TAG, "--- Save enabled inputmethod settings. :" + enabledIMEsAndSubtypesString);
+ Log.d(TAG, "--- Save disabled system inputmethod settings. :"
+ + disabledSystemIMEsString);
+ Log.d(TAG, "--- Save default inputmethod settings. :" + currentInputMethodId);
+ Log.d(TAG, "--- Needs to reset the selected subtype :" + needsToResetSelectedSubtype);
+ Log.d(TAG, "--- Subtype is selected :" + isInputMethodSubtypeSelected(resolver));
+ }
+
+ // Redefines SelectedSubtype when all subtypes are unchecked or there is no subtype
+ // selected. And if the selected subtype of the current input method was disabled,
+ // We should reset the selected input method's subtype.
+ if (needsToResetSelectedSubtype || !isInputMethodSubtypeSelected(resolver)) {
+ if (DEBUG) {
+ Log.d(TAG, "--- Reset inputmethod subtype because it's not defined.");
+ }
+ putSelectedInputMethodSubtype(resolver, NOT_A_SUBTYPE_ID);
+ }
+
+ Settings.Secure.putString(resolver,
+ Settings.Secure.ENABLED_INPUT_METHODS, enabledIMEsAndSubtypesString);
+ if (disabledSystemIMEsString.length() > 0) {
+ Settings.Secure.putString(resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS,
+ disabledSystemIMEsString);
+ }
+ // If the current input method is unset, InputMethodManagerService will find the applicable
+ // IME from the history and the system locale.
+ Settings.Secure.putString(resolver, Settings.Secure.DEFAULT_INPUT_METHOD,
+ currentInputMethodId != null ? currentInputMethodId : "");
+ }
+
+ public static void loadInputMethodSubtypeList(final PreferenceFragmentCompat context,
+ final ContentResolver resolver, final List<InputMethodInfo> inputMethodInfos,
+ final Map<String, List<Preference>> inputMethodPrefsMap) {
+ final HashMap<String, HashSet<String>> enabledSubtypes =
+ getEnabledInputMethodsAndSubtypeList(resolver);
+
+ for (final InputMethodInfo imi : inputMethodInfos) {
+ final String imiId = imi.getId();
+ final Preference pref = context.findPreference(imiId);
+ if (pref instanceof TwoStatePreference) {
+ final TwoStatePreference subtypePref = (TwoStatePreference) pref;
+ final boolean isEnabled = enabledSubtypes.containsKey(imiId);
+ subtypePref.setChecked(isEnabled);
+ if (inputMethodPrefsMap != null) {
+ for (final Preference childPref: inputMethodPrefsMap.get(imiId)) {
+ childPref.setEnabled(isEnabled);
+ }
+ }
+ setSubtypesPreferenceEnabled(context, inputMethodInfos, imiId, isEnabled);
+ }
+ }
+ updateSubtypesPreferenceChecked(context, inputMethodInfos, enabledSubtypes);
+ }
+
+ private static void setSubtypesPreferenceEnabled(final PreferenceFragmentCompat context,
+ final List<InputMethodInfo> inputMethodProperties, final String id,
+ final boolean enabled) {
+ final PreferenceScreen preferenceScreen = context.getPreferenceScreen();
+ for (final InputMethodInfo imi : inputMethodProperties) {
+ if (id.equals(imi.getId())) {
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ final TwoStatePreference pref = (TwoStatePreference) preferenceScreen
+ .findPreference(id + subtype.hashCode());
+ if (pref != null) {
+ pref.setEnabled(enabled);
+ }
+ }
+ }
+ }
+ }
+
+ private static void updateSubtypesPreferenceChecked(final PreferenceFragmentCompat context,
+ final List<InputMethodInfo> inputMethodProperties,
+ final HashMap<String, HashSet<String>> enabledSubtypes) {
+ final PreferenceScreen preferenceScreen = context.getPreferenceScreen();
+ for (final InputMethodInfo imi : inputMethodProperties) {
+ final String id = imi.getId();
+ if (!enabledSubtypes.containsKey(id)) {
+ // There is no need to enable/disable subtypes of disabled IMEs.
+ continue;
+ }
+ final HashSet<String> enabledSubtypesSet = enabledSubtypes.get(id);
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ final String hashCode = String.valueOf(subtype.hashCode());
+ if (DEBUG) {
+ Log.d(TAG, "--- Set checked state: " + "id" + ", " + hashCode + ", "
+ + enabledSubtypesSet.contains(hashCode));
+ }
+ final TwoStatePreference pref = (TwoStatePreference) preferenceScreen
+ .findPreference(id + hashCode);
+ if (pref != null) {
+ pref.setChecked(enabledSubtypesSet.contains(hashCode));
+ }
+ }
+ }
+ }
+
+ public static void removeUnnecessaryNonPersistentPreference(final Preference pref) {
+ final String key = pref.getKey();
+ if (pref.isPersistent() || key == null) {
+ return;
+ }
+ final SharedPreferences prefs = pref.getSharedPreferences();
+ if (prefs != null && prefs.contains(key)) {
+ prefs.edit().remove(key).apply();
+ }
+ }
+
+ @NonNull
+ public static String getSubtypeLocaleNameAsSentence(@Nullable InputMethodSubtype subtype,
+ @NonNull final Context context, @NonNull final InputMethodInfo inputMethodInfo) {
+ if (subtype == null) {
+ return "";
+ }
+ final Locale locale = getDisplayLocale(context);
+ final CharSequence subtypeName = subtype.getDisplayName(context,
+ inputMethodInfo.getPackageName(), inputMethodInfo.getServiceInfo()
+ .applicationInfo);
+ return LocaleHelper.toSentenceCase(subtypeName.toString(), locale);
+ }
+
+ @NonNull
+ public static String getSubtypeLocaleNameListAsSentence(
+ @NonNull final List<InputMethodSubtype> subtypes, @NonNull final Context context,
+ @NonNull final InputMethodInfo inputMethodInfo) {
+ if (subtypes.isEmpty()) {
+ return "";
+ }
+ final Locale locale = getDisplayLocale(context);
+ final int subtypeCount = subtypes.size();
+ final CharSequence[] subtypeNames = new CharSequence[subtypeCount];
+ for (int i = 0; i < subtypeCount; i++) {
+ subtypeNames[i] = subtypes.get(i).getDisplayName(context,
+ inputMethodInfo.getPackageName(), inputMethodInfo.getServiceInfo()
+ .applicationInfo);
+ }
+ return LocaleHelper.toSentenceCase(
+ ListFormatter.getInstance(locale).format((Object[]) subtypeNames), locale);
+ }
+
+ @NonNull
+ private static Locale getDisplayLocale(@Nullable final Context context) {
+ if (context == null) {
+ return Locale.getDefault();
+ }
+ if (context.getResources() == null) {
+ return Locale.getDefault();
+ }
+ final Configuration configuration = context.getResources().getConfiguration();
+ if (configuration == null) {
+ return Locale.getDefault();
+ }
+ final Locale configurationLocale = configuration.getLocales().get(0);
+ if (configurationLocale == null) {
+ return Locale.getDefault();
+ }
+ return configurationLocale;
+ }
+
+ public static boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi) {
+ if (imi.isAuxiliaryIme() || !imi.isSystem()) {
+ return false;
+ }
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ if (SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())
+ && subtype.isAsciiCapable()) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java
index 5e25f519a130..2dec6c341f92 100644
--- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodPreference.java
@@ -24,9 +24,9 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.UserHandle;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v7.preference.Preference.OnPreferenceClickListener;
+import androidx.preference.Preference;
+import androidx.preference.Preference.OnPreferenceChangeListener;
+import androidx.preference.Preference.OnPreferenceClickListener;
import android.text.TextUtils;
import android.util.Log;
import android.view.inputmethod.InputMethodInfo;
@@ -35,7 +35,6 @@ import android.view.inputmethod.InputMethodSubtype;
import android.widget.Toast;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.inputmethod.InputMethodUtils;
import com.android.settingslib.R;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedSwitchPreference;
@@ -124,8 +123,8 @@ public class InputMethodPreference extends RestrictedSwitchPreference implements
setIntent(intent);
}
mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(context);
- mHasPriorityInSorting = InputMethodUtils.isSystemIme(imi)
- && mInputMethodSettingValues.isValidSystemNonAuxAsciiCapableIme(imi, context);
+ mHasPriorityInSorting = imi.isSystem()
+ && InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi);
setOnPreferenceClickListener(this);
setOnPreferenceChangeListener(this);
}
@@ -153,7 +152,7 @@ public class InputMethodPreference extends RestrictedSwitchPreference implements
setCheckedInternal(false);
return false;
}
- if (InputMethodUtils.isSystemIme(mImi)) {
+ if (mImi.isSystem()) {
// Enable a system IME. No need to show a security warning dialog,
// but we might need to prompt if it's not Direct Boot aware.
// TV doesn't doesn't need to worry about this, but other platforms should show
@@ -198,8 +197,7 @@ public class InputMethodPreference extends RestrictedSwitchPreference implements
}
public void updatePreferenceViews() {
- final boolean isAlwaysChecked = mInputMethodSettingValues.isAlwaysCheckedIme(
- mImi, getContext());
+ final boolean isAlwaysChecked = mInputMethodSettingValues.isAlwaysCheckedIme(mImi);
// When this preference has a switch and an input method should be always enabled,
// this preference should be disabled to prevent accidentally disabling an input method.
// This preference should also be disabled in case the admin does not allow this input
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java
index fac50bda3c69..b6786d424e6f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSettingValuesWrapper.java
@@ -16,39 +16,33 @@
package com.android.settingslib.inputmethod;
-import android.app.ActivityManager;
+import android.annotation.UiThread;
+import android.content.ContentResolver;
import android.content.Context;
-import android.os.RemoteException;
import android.util.Log;
-import android.util.Slog;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
-import android.view.inputmethod.InputMethodSubtype;
-
-import com.android.internal.inputmethod.InputMethodUtils;
-import com.android.internal.inputmethod.InputMethodUtils.InputMethodSettings;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Locale;
/**
- * This class is a wrapper for InputMethodSettings. You need to refresh internal states
- * manually on some events when "InputMethodInfo"s and "InputMethodSubtype"s can be
- * changed.
+ * This class is a wrapper for {@link InputMethodManager} and
+ * {@link android.provider.Settings.Secure#ENABLED_INPUT_METHODS}. You need to refresh internal
+ * states manually on some events when "InputMethodInfo"s and "InputMethodSubtype"s can be changed.
+ *
+ * <p>TODO: Consolidate this with {@link InputMethodAndSubtypeUtil}.</p>
*/
-// TODO: Consolidate this with {@link InputMethodAndSubtypeUtil}.
+@UiThread
public class InputMethodSettingValuesWrapper {
private static final String TAG = InputMethodSettingValuesWrapper.class.getSimpleName();
private static volatile InputMethodSettingValuesWrapper sInstance;
private final ArrayList<InputMethodInfo> mMethodList = new ArrayList<>();
- private final HashMap<String, InputMethodInfo> mMethodMap = new HashMap<>();
- private final InputMethodSettings mSettings;
+ private final ContentResolver mContentResolver;
private final InputMethodManager mImm;
- private final HashSet<InputMethodInfo> mAsciiCapableEnabledImis = new HashSet<>();
public static InputMethodSettingValuesWrapper getInstance(Context context) {
if (sInstance == null) {
@@ -61,87 +55,42 @@ public class InputMethodSettingValuesWrapper {
return sInstance;
}
- private static int getDefaultCurrentUserId() {
- try {
- return ActivityManager.getService().getCurrentUser().id;
- } catch (RemoteException e) {
- Slog.w(TAG, "Couldn't get current user ID; guessing it's 0", e);
- }
- return 0;
- }
-
// Ensure singleton
private InputMethodSettingValuesWrapper(Context context) {
- mSettings = new InputMethodSettings(context.getResources(), context.getContentResolver(),
- mMethodMap, mMethodList, getDefaultCurrentUserId(), false /* copyOnWrite */);
- mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ mContentResolver = context.getContentResolver();
+ mImm = context.getSystemService(InputMethodManager.class);
refreshAllInputMethodAndSubtypes();
}
public void refreshAllInputMethodAndSubtypes() {
- synchronized (mMethodMap) {
- mMethodList.clear();
- mMethodMap.clear();
- final List<InputMethodInfo> imms = mImm.getInputMethodList();
- mMethodList.addAll(imms);
- for (InputMethodInfo imi : imms) {
- mMethodMap.put(imi.getId(), imi);
- }
- updateAsciiCapableEnabledImis();
- }
- }
-
- // TODO: Add a cts to ensure at least one AsciiCapableSubtypeEnabledImis exist
- private void updateAsciiCapableEnabledImis() {
- synchronized (mMethodMap) {
- mAsciiCapableEnabledImis.clear();
- final List<InputMethodInfo> enabledImis = mSettings.getEnabledInputMethodListLocked();
- for (final InputMethodInfo imi : enabledImis) {
- final int subtypeCount = imi.getSubtypeCount();
- for (int i = 0; i < subtypeCount; ++i) {
- final InputMethodSubtype subtype = imi.getSubtypeAt(i);
- if (InputMethodUtils.SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())
- && subtype.isAsciiCapable()) {
- mAsciiCapableEnabledImis.add(imi);
- break;
- }
- }
- }
- }
+ mMethodList.clear();
+ mMethodList.addAll(mImm.getInputMethodList());
}
public List<InputMethodInfo> getInputMethodList() {
- synchronized (mMethodMap) {
- return mMethodList;
- }
+ return new ArrayList<>(mMethodList);
}
- public boolean isAlwaysCheckedIme(InputMethodInfo imi, Context context) {
+ public boolean isAlwaysCheckedIme(InputMethodInfo imi) {
final boolean isEnabled = isEnabledImi(imi);
- synchronized (mMethodMap) {
- if (mSettings.getEnabledInputMethodListLocked().size() <= 1 && isEnabled) {
- return true;
- }
+ if (getEnabledInputMethodList().size() <= 1 && isEnabled) {
+ return true;
}
final int enabledValidSystemNonAuxAsciiCapableImeCount =
- getEnabledValidSystemNonAuxAsciiCapableImeCount(context);
+ getEnabledValidSystemNonAuxAsciiCapableImeCount();
return enabledValidSystemNonAuxAsciiCapableImeCount <= 1
&& !(enabledValidSystemNonAuxAsciiCapableImeCount == 1 && !isEnabled)
- && InputMethodUtils.isSystemIme(imi)
- && isValidSystemNonAuxAsciiCapableIme(imi, context);
-
+ && imi.isSystem()
+ && InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi);
}
- private int getEnabledValidSystemNonAuxAsciiCapableImeCount(Context context) {
+ private int getEnabledValidSystemNonAuxAsciiCapableImeCount() {
int count = 0;
- final List<InputMethodInfo> enabledImis;
- synchronized (mMethodMap) {
- enabledImis = mSettings.getEnabledInputMethodListLocked();
- }
+ final List<InputMethodInfo> enabledImis = getEnabledInputMethodList();
for (final InputMethodInfo imi : enabledImis) {
- if (isValidSystemNonAuxAsciiCapableIme(imi, context)) {
+ if (InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(imi)) {
++count;
}
}
@@ -152,10 +101,7 @@ public class InputMethodSettingValuesWrapper {
}
public boolean isEnabledImi(InputMethodInfo imi) {
- final List<InputMethodInfo> enabledImis;
- synchronized (mMethodMap) {
- enabledImis = mSettings.getEnabledInputMethodListLocked();
- }
+ final List<InputMethodInfo> enabledImis = getEnabledInputMethodList();
for (final InputMethodInfo tempImi : enabledImis) {
if (tempImi.getId().equals(imi.getId())) {
return true;
@@ -164,22 +110,22 @@ public class InputMethodSettingValuesWrapper {
return false;
}
- public boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi, Context context) {
- if (imi.isAuxiliaryIme()) {
- return false;
- }
- final Locale systemLocale = context.getResources().getConfiguration().locale;
- if (InputMethodUtils.isSystemImeThatHasSubtypeOf(imi, context,
- true /* checkDefaultAttribute */, systemLocale, false /* checkCountry */,
- InputMethodUtils.SUBTYPE_MODE_ANY)) {
- return true;
- }
- if (mAsciiCapableEnabledImis.isEmpty()) {
- Log.w(TAG, "ascii capable subtype enabled imi not found. Fall back to English"
- + " Keyboard subtype.");
- return InputMethodUtils.containsSubtypeOf(imi, Locale.ENGLISH, false /* checkCountry */,
- InputMethodUtils.SUBTYPE_MODE_KEYBOARD);
+ /**
+ * Returns the list of the enabled {@link InputMethodInfo} determined by
+ * {@link android.provider.Settings.Secure#ENABLED_INPUT_METHODS} rather than just returning
+ * {@link InputMethodManager#getEnabledInputMethodList()}.
+ *
+ * @return the list of the enabled {@link InputMethodInfo}
+ */
+ private ArrayList<InputMethodInfo> getEnabledInputMethodList() {
+ final HashMap<String, HashSet<String>> enabledInputMethodsAndSubtypes =
+ InputMethodAndSubtypeUtil.getEnabledInputMethodsAndSubtypeList(mContentResolver);
+ final ArrayList<InputMethodInfo> result = new ArrayList<>();
+ for (InputMethodInfo imi : mMethodList) {
+ if (enabledInputMethodsAndSubtypes.keySet().contains(imi.getId())) {
+ result.add(imi);
+ }
}
- return mAsciiCapableEnabledImis.contains(imi);
+ return result;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSubtypePreference.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSubtypePreference.java
index f824ec75968b..bb4358115921 100644
--- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSubtypePreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/InputMethodSubtypePreference.java
@@ -17,13 +17,12 @@
package com.android.settingslib.inputmethod;
import android.content.Context;
-import android.support.v7.preference.Preference;
+import androidx.preference.Preference;
import android.text.TextUtils;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.inputmethod.InputMethodUtils;
import java.text.Collator;
import java.util.Locale;
@@ -42,7 +41,7 @@ public class InputMethodSubtypePreference extends SwitchWithNoTextPreference {
this(context,
imi.getId() + subtype.hashCode(),
InputMethodAndSubtypeUtil.getSubtypeLocaleNameAsSentence(subtype, context, imi),
- subtype.getLocale(),
+ subtype.getLocaleObject(),
context.getResources().getConfiguration().locale);
}
@@ -51,20 +50,19 @@ public class InputMethodSubtypePreference extends SwitchWithNoTextPreference {
final Context context,
final String prefKey,
final CharSequence title,
- final String subtypeLocaleString,
+ final Locale subtypeLocale,
final Locale systemLocale) {
super(context);
setPersistent(false);
setKey(prefKey);
setTitle(title);
- if (TextUtils.isEmpty(subtypeLocaleString)) {
+ if (subtypeLocale == null) {
mIsSystemLocale = false;
mIsSystemLanguage = false;
} else {
- mIsSystemLocale = subtypeLocaleString.equals(systemLocale.toString());
+ mIsSystemLocale = subtypeLocale.equals(systemLocale);
mIsSystemLanguage = mIsSystemLocale
- || InputMethodUtils.getLanguageFromLocaleString(subtypeLocaleString)
- .equals(systemLocale.getLanguage());
+ || TextUtils.equals(subtypeLocale.getLanguage(), systemLocale.getLanguage());
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/inputmethod/SwitchWithNoTextPreference.java b/packages/SettingsLib/src/com/android/settingslib/inputmethod/SwitchWithNoTextPreference.java
index 798f8fe73b24..2b38697a65ce 100644
--- a/packages/SettingsLib/src/com/android/settingslib/inputmethod/SwitchWithNoTextPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/inputmethod/SwitchWithNoTextPreference.java
@@ -17,7 +17,7 @@
package com.android.settingslib.inputmethod;
import android.content.Context;
-import android.support.v14.preference.SwitchPreference;
+import androidx.preference.SwitchPreference;
public class SwitchWithNoTextPreference extends SwitchPreference {
private static final String EMPTY_TEXT = "";
diff --git a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java
index e3e27ce17c9a..444c19c94c9f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java
+++ b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java
@@ -16,7 +16,7 @@
package com.android.settingslib.license;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.Log;
import android.util.Xml;
diff --git a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java
index a9fb20ca9e17..92044c338ac0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java
+++ b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoader.java
@@ -17,7 +17,7 @@
package com.android.settingslib.license;
import android.content.Context;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.Log;
import com.android.settingslib.utils.AsyncLoader;
diff --git a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java
new file mode 100644
index 000000000000..d7c14ad66baa
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlLoaderCompat.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.license;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.android.settingslib.utils.AsyncLoaderCompat;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.VisibleForTesting;
+
+/**
+ * LicenseHtmlLoader is a loader which loads a license html file from default license xml files.
+ */
+public class LicenseHtmlLoaderCompat extends AsyncLoaderCompat<File> {
+ private static final String TAG = "LicenseHtmlLoaderCompat";
+
+ private static final String[] DEFAULT_LICENSE_XML_PATHS = {
+ "/system/etc/NOTICE.xml.gz",
+ "/vendor/etc/NOTICE.xml.gz",
+ "/odm/etc/NOTICE.xml.gz",
+ "/oem/etc/NOTICE.xml.gz"};
+ private static final String NOTICE_HTML_FILE_NAME = "NOTICE.html";
+
+ private Context mContext;
+
+ public LicenseHtmlLoaderCompat(Context context) {
+ super(context);
+ mContext = context;
+ }
+
+ @Override
+ public File loadInBackground() {
+ return generateHtmlFromDefaultXmlFiles();
+ }
+
+ @Override
+ protected void onDiscardResult(File f) {
+ }
+
+ private File generateHtmlFromDefaultXmlFiles() {
+ final List<File> xmlFiles = getVaildXmlFiles();
+ if (xmlFiles.isEmpty()) {
+ Log.e(TAG, "No notice file exists.");
+ return null;
+ }
+
+ File cachedHtmlFile = getCachedHtmlFile();
+ if (!isCachedHtmlFileOutdated(xmlFiles, cachedHtmlFile)
+ || generateHtmlFile(xmlFiles, cachedHtmlFile)) {
+ return cachedHtmlFile;
+ }
+
+ return null;
+ }
+
+ @VisibleForTesting
+ List<File> getVaildXmlFiles() {
+ final List<File> xmlFiles = new ArrayList();
+ for (final String xmlPath : DEFAULT_LICENSE_XML_PATHS) {
+ File file = new File(xmlPath);
+ if (file.exists() && file.length() != 0) {
+ xmlFiles.add(file);
+ }
+ }
+ return xmlFiles;
+ }
+
+ @VisibleForTesting
+ File getCachedHtmlFile() {
+ return new File(mContext.getCacheDir(), NOTICE_HTML_FILE_NAME);
+ }
+
+ @VisibleForTesting
+ boolean isCachedHtmlFileOutdated(List<File> xmlFiles, File cachedHtmlFile) {
+ boolean outdated = true;
+ if (cachedHtmlFile.exists() && cachedHtmlFile.length() != 0) {
+ outdated = false;
+ for (File file : xmlFiles) {
+ if (cachedHtmlFile.lastModified() < file.lastModified()) {
+ outdated = true;
+ break;
+ }
+ }
+ }
+ return outdated;
+ }
+
+ @VisibleForTesting
+ boolean generateHtmlFile(List<File> xmlFiles, File htmlFile) {
+ return LicenseHtmlGeneratorFromXml.generateHtml(xmlFiles, htmlFile);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java
index 13364aba00fd..96bed93165fb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java
+++ b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java
@@ -25,7 +25,7 @@ import android.graphics.drawable.Drawable;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.text.format.DateUtils;
import android.util.IconDrawableFactory;
import android.util.Log;
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/ChartDataLoaderCompat.java b/packages/SettingsLib/src/com/android/settingslib/net/ChartDataLoaderCompat.java
new file mode 100644
index 000000000000..3adbd4d01ca0
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/net/ChartDataLoaderCompat.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.net;
+
+import static android.net.NetworkStats.SET_DEFAULT;
+import static android.net.NetworkStats.SET_FOREGROUND;
+import static android.net.NetworkStats.TAG_NONE;
+import static android.net.NetworkStatsHistory.FIELD_RX_BYTES;
+import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
+
+import android.content.Context;
+import android.net.INetworkStatsSession;
+import android.net.NetworkStatsHistory;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.os.RemoteException;
+
+import com.android.settingslib.AppItem;
+
+import androidx.loader.content.AsyncTaskLoader;
+
+/**
+ * Loader for historical chart data for both network and UID details.
+ */
+public class ChartDataLoaderCompat extends AsyncTaskLoader<ChartData> {
+ private static final String KEY_TEMPLATE = "template";
+ private static final String KEY_APP = "app";
+ private static final String KEY_FIELDS = "fields";
+
+ private final INetworkStatsSession mSession;
+ private final Bundle mArgs;
+
+ public static Bundle buildArgs(NetworkTemplate template, AppItem app) {
+ return buildArgs(template, app, FIELD_RX_BYTES | FIELD_TX_BYTES);
+ }
+
+ public static Bundle buildArgs(NetworkTemplate template, AppItem app, int fields) {
+ final Bundle args = new Bundle();
+ args.putParcelable(KEY_TEMPLATE, template);
+ args.putParcelable(KEY_APP, app);
+ args.putInt(KEY_FIELDS, fields);
+ return args;
+ }
+
+ public ChartDataLoaderCompat(Context context, INetworkStatsSession session, Bundle args) {
+ super(context);
+ mSession = session;
+ mArgs = args;
+ }
+
+ @Override
+ protected void onStartLoading() {
+ super.onStartLoading();
+ forceLoad();
+ }
+
+ @Override
+ public ChartData loadInBackground() {
+ final NetworkTemplate template = mArgs.getParcelable(KEY_TEMPLATE);
+ final AppItem app = mArgs.getParcelable(KEY_APP);
+ final int fields = mArgs.getInt(KEY_FIELDS);
+
+ try {
+ return loadInBackground(template, app, fields);
+ } catch (RemoteException e) {
+ // since we can't do much without history, and we don't want to
+ // leave with half-baked UI, we bail hard.
+ throw new RuntimeException("problem reading network stats", e);
+ }
+ }
+
+ private ChartData loadInBackground(NetworkTemplate template, AppItem app, int fields)
+ throws RemoteException {
+ final ChartData data = new ChartData();
+ data.network = mSession.getHistoryForNetwork(template, fields);
+
+ if (app != null) {
+ // load stats for current uid and template
+ final int size = app.uids.size();
+ for (int i = 0; i < size; i++) {
+ final int uid = app.uids.keyAt(i);
+ data.detailDefault = collectHistoryForUid(
+ template, uid, SET_DEFAULT, data.detailDefault);
+ data.detailForeground = collectHistoryForUid(
+ template, uid, SET_FOREGROUND, data.detailForeground);
+ }
+
+ if (size > 0) {
+ data.detail = new NetworkStatsHistory(data.detailForeground.getBucketDuration());
+ data.detail.recordEntireHistory(data.detailDefault);
+ data.detail.recordEntireHistory(data.detailForeground);
+ } else {
+ data.detailDefault = new NetworkStatsHistory(HOUR_IN_MILLIS);
+ data.detailForeground = new NetworkStatsHistory(HOUR_IN_MILLIS);
+ data.detail = new NetworkStatsHistory(HOUR_IN_MILLIS);
+ }
+ }
+
+ return data;
+ }
+
+ @Override
+ protected void onStopLoading() {
+ super.onStopLoading();
+ cancelLoad();
+ }
+
+ @Override
+ protected void onReset() {
+ super.onReset();
+ cancelLoad();
+ }
+
+ /**
+ * Collect {@link NetworkStatsHistory} for the requested UID, combining with
+ * an existing {@link NetworkStatsHistory} if provided.
+ */
+ private NetworkStatsHistory collectHistoryForUid(
+ NetworkTemplate template, int uid, int set, NetworkStatsHistory existing)
+ throws RemoteException {
+ final NetworkStatsHistory history = mSession.getHistoryForUid(
+ template, uid, set, TAG_NONE, FIELD_RX_BYTES | FIELD_TX_BYTES);
+
+ if (existing != null) {
+ existing.recordEntireHistory(history);
+ return existing;
+ } else {
+ return history;
+ }
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
index f7aa29796ce8..87f5b4f372e0 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
@@ -41,6 +41,7 @@ import android.util.Log;
import android.util.Pair;
import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
import java.time.ZonedDateTime;
import java.util.Date;
@@ -86,7 +87,8 @@ public class DataUsageController {
* mContext.getResources().getInteger(R.integer.default_data_warning_level_mb);
}
- private INetworkStatsSession getSession() {
+ @VisibleForTesting
+ INetworkStatsSession getSession() {
if (mSession == null) {
try {
mSession = mStatsService.openSession();
@@ -176,6 +178,30 @@ public class DataUsageController {
}
}
+ /**
+ * Get the total usage level recorded in the network history
+ * @param template the network template to retrieve the network history
+ * @return the total usage level recorded in the network history
+ */
+ public long getHistoriclUsageLevel(NetworkTemplate template) {
+ final INetworkStatsSession session = getSession();
+ if (session != null) {
+ try {
+ final NetworkStatsHistory history = session.getHistoryForNetwork(template, FIELDS);
+ final long now = System.currentTimeMillis();
+ final NetworkStatsHistory.Entry entry =
+ history.getValues(0L /* start */, now /* end */, now, null /* recycle */);
+ if (entry != null) {
+ return entry.rxBytes + entry.txBytes;
+ }
+ Log.w(TAG, "Failed to get data usage, no entry data");
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to get data usage, remote call failed");
+ }
+ }
+ return 0L;
+ }
+
private NetworkPolicy findNetworkPolicy(NetworkTemplate template) {
if (mPolicyManager == null || template == null) return null;
final NetworkPolicy[] policies = mPolicyManager.getNetworkPolicies();
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/SummaryForAllUidLoaderCompat.java b/packages/SettingsLib/src/com/android/settingslib/net/SummaryForAllUidLoaderCompat.java
new file mode 100644
index 000000000000..c311337d6cf5
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/net/SummaryForAllUidLoaderCompat.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.net;
+
+import android.content.Context;
+import android.net.INetworkStatsSession;
+import android.net.NetworkStats;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.os.RemoteException;
+
+import androidx.loader.content.AsyncTaskLoader;
+
+public class SummaryForAllUidLoaderCompat extends AsyncTaskLoader<NetworkStats> {
+ private static final String KEY_TEMPLATE = "template";
+ private static final String KEY_START = "start";
+ private static final String KEY_END = "end";
+
+ private final INetworkStatsSession mSession;
+ private final Bundle mArgs;
+
+ public static Bundle buildArgs(NetworkTemplate template, long start, long end) {
+ final Bundle args = new Bundle();
+ args.putParcelable(KEY_TEMPLATE, template);
+ args.putLong(KEY_START, start);
+ args.putLong(KEY_END, end);
+ return args;
+ }
+
+ public SummaryForAllUidLoaderCompat(Context context, INetworkStatsSession session,
+ Bundle args) {
+ super(context);
+ mSession = session;
+ mArgs = args;
+ }
+
+ @Override
+ protected void onStartLoading() {
+ super.onStartLoading();
+ forceLoad();
+ }
+
+ @Override
+ public NetworkStats loadInBackground() {
+ final NetworkTemplate template = mArgs.getParcelable(KEY_TEMPLATE);
+ final long start = mArgs.getLong(KEY_START);
+ final long end = mArgs.getLong(KEY_END);
+
+ try {
+ return mSession.getSummaryForAllUid(template, start, end, false);
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ @Override
+ protected void onStopLoading() {
+ super.onStopLoading();
+ cancelLoad();
+ }
+
+ @Override
+ protected void onReset() {
+ super.onReset();
+ cancelLoad();
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java b/packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java
index adf49aaf4e68..6da486ab3aa8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java
+++ b/packages/SettingsLib/src/com/android/settingslib/notification/ZenDurationDialog.java
@@ -24,7 +24,7 @@ import android.content.DialogInterface;
import android.provider.Settings;
import android.service.notification.Condition;
import android.service.notification.ZenModeConfig;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CompoundButton;
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java
index b0451b7ad2ea..6a8b01a23688 100644
--- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java
@@ -24,8 +24,8 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.service.settings.suggestions.ISuggestionService;
import android.service.settings.suggestions.Suggestion;
-import android.support.annotation.Nullable;
-import android.support.annotation.WorkerThread;
+import androidx.annotation.Nullable;
+import androidx.annotation.WorkerThread;
import android.util.Log;
import java.util.List;
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixin.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixin.java
index 46fc32fa43cc..ee8b6fe60478 100644
--- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixin.java
+++ b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixin.java
@@ -17,13 +17,13 @@
package com.android.settingslib.suggestions;
import android.app.LoaderManager;
-import android.arch.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.OnLifecycleEvent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Loader;
import android.os.Bundle;
import android.service.settings.suggestions.Suggestion;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.util.Log;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -34,7 +34,7 @@ import java.util.List;
* Manages IPC communication to SettingsIntelligence for suggestion related services.
*/
public class SuggestionControllerMixin implements SuggestionController.ServiceConnectionListener,
- android.arch.lifecycle.LifecycleObserver, LoaderManager.LoaderCallbacks<List<Suggestion>> {
+ androidx.lifecycle.LifecycleObserver, LoaderManager.LoaderCallbacks<List<Suggestion>> {
public interface SuggestionControllerHost {
/**
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixinCompat.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixinCompat.java
new file mode 100644
index 000000000000..179121739896
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionControllerMixinCompat.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.suggestions;
+
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Bundle;
+import android.service.settings.suggestions.Suggestion;
+import android.util.Log;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.List;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.OnLifecycleEvent;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
+/**
+ * Manages IPC communication to SettingsIntelligence for suggestion related services.
+ */
+public class SuggestionControllerMixinCompat implements
+ SuggestionController.ServiceConnectionListener, androidx.lifecycle.LifecycleObserver,
+ LoaderManager.LoaderCallbacks<List<Suggestion>> {
+
+ public interface SuggestionControllerHost {
+ /**
+ * Called when suggestion data fetching is ready.
+ */
+ void onSuggestionReady(List<Suggestion> data);
+
+ /**
+ * Returns {@link LoaderManager} associated with the host. If host is not attached to
+ * activity then return null.
+ */
+ @Nullable
+ LoaderManager getLoaderManager();
+ }
+
+ private static final String TAG = "SuggestionCtrlMixin";
+ private static final boolean DEBUG = false;
+
+ private final Context mContext;
+ private final SuggestionController mSuggestionController;
+ private final SuggestionControllerHost mHost;
+
+ private boolean mSuggestionLoaded;
+
+ public SuggestionControllerMixinCompat(Context context, SuggestionControllerHost host,
+ Lifecycle lifecycle, ComponentName componentName) {
+ mContext = context.getApplicationContext();
+ mHost = host;
+ mSuggestionController = new SuggestionController(mContext, componentName,
+ this /* serviceConnectionListener */);
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ }
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_START)
+ public void onStart() {
+ if (DEBUG) {
+ Log.d(TAG, "SuggestionController started");
+ }
+ mSuggestionController.start();
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
+ public void onStop() {
+ if (DEBUG) {
+ Log.d(TAG, "SuggestionController stopped.");
+ }
+ mSuggestionController.stop();
+ }
+
+ @Override
+ public void onServiceConnected() {
+ final LoaderManager loaderManager = mHost.getLoaderManager();
+ if (loaderManager != null) {
+ loaderManager.restartLoader(SuggestionLoader.LOADER_ID_SUGGESTIONS,
+ null /* args */, this /* callback */);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected() {
+ if (DEBUG) {
+ Log.d(TAG, "SuggestionService disconnected");
+ }
+ final LoaderManager loaderManager = mHost.getLoaderManager();
+ if (loaderManager != null) {
+ loaderManager.destroyLoader(SuggestionLoader.LOADER_ID_SUGGESTIONS);
+ }
+ }
+
+ @Override
+ public Loader<List<Suggestion>> onCreateLoader(int id, Bundle args) {
+ if (id == SuggestionLoader.LOADER_ID_SUGGESTIONS) {
+ mSuggestionLoaded = false;
+ return new SuggestionLoaderCompat(mContext, mSuggestionController);
+ }
+ throw new IllegalArgumentException("This loader id is not supported " + id);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<List<Suggestion>> loader, List<Suggestion> data) {
+ mSuggestionLoaded = true;
+ mHost.onSuggestionReady(data);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<List<Suggestion>> loader) {
+ mSuggestionLoaded = false;
+ }
+
+ public boolean isSuggestionLoaded() {
+ return mSuggestionLoaded;
+ }
+
+ public void dismissSuggestion(Suggestion suggestion) {
+ mSuggestionController.dismissSuggestions(suggestion);
+ }
+
+ public void launchSuggestion(Suggestion suggestion) {
+ mSuggestionController.launchSuggestion(suggestion);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionList.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionList.java
deleted file mode 100644
index a89092040e71..000000000000
--- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionList.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2017 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.settingslib.suggestions;
-
-import android.content.Intent;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-
-import com.android.settingslib.drawer.Tile;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class SuggestionList {
- // Category -> list of suggestion map
- private final Map<SuggestionCategory, List<Tile>> mSuggestions;
-
- // A flatten list of all suggestions.
- private List<Tile> mSuggestionList;
-
- public SuggestionList() {
- mSuggestions = new ArrayMap<>();
- }
-
- public void addSuggestions(SuggestionCategory category, List<Tile> suggestions) {
- mSuggestions.put(category, suggestions);
- }
-
- public List<Tile> getSuggestions() {
- if (mSuggestionList != null) {
- return mSuggestionList;
- }
- mSuggestionList = new ArrayList<>();
- for (List<Tile> suggestions : mSuggestions.values()) {
- mSuggestionList.addAll(suggestions);
- }
- dedupeSuggestions(mSuggestionList);
- return mSuggestionList;
- }
-
- public boolean isExclusiveSuggestionCategory() {
- if (mSuggestions.size() != 1) {
- // If there is no category, or more than 1 category, it's not exclusive by definition.
- return false;
- }
- for (SuggestionCategory category : mSuggestions.keySet()) {
- if (category.exclusive) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Filter suggestions list so they are all unique.
- */
- private void dedupeSuggestions(List<Tile> suggestions) {
- final Set<String> intents = new ArraySet<>();
- for (int i = suggestions.size() - 1; i >= 0; i--) {
- final Tile suggestion = suggestions.get(i);
- final String intentUri = suggestion.intent.toUri(Intent.URI_INTENT_SCHEME);
- if (intents.contains(intentUri)) {
- suggestions.remove(i);
- } else {
- intents.add(intentUri);
- }
- }
- }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionLoaderCompat.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionLoaderCompat.java
new file mode 100644
index 000000000000..066de19172de
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionLoaderCompat.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 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.settingslib.suggestions;
+
+import android.content.Context;
+import android.service.settings.suggestions.Suggestion;
+import android.util.Log;
+
+import com.android.settingslib.utils.AsyncLoaderCompat;
+
+import java.util.List;
+
+public class SuggestionLoaderCompat extends AsyncLoaderCompat<List<Suggestion>> {
+
+ public static final int LOADER_ID_SUGGESTIONS = 42;
+ private static final String TAG = "SuggestionLoader";
+
+ private final SuggestionController mSuggestionController;
+
+ public SuggestionLoaderCompat(Context context, SuggestionController controller) {
+ super(context);
+ mSuggestionController = controller;
+ }
+
+ @Override
+ protected void onDiscardResult(List<Suggestion> result) {
+
+ }
+
+ @Override
+ public List<Suggestion> loadInBackground() {
+ final List<Suggestion> data = mSuggestionController.getSuggestions();
+ if (data == null) {
+ Log.d(TAG, "data is null");
+ } else {
+ Log.d(TAG, "data size " + data.size());
+ }
+ return data;
+ }
+} \ No newline at end of file
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java
deleted file mode 100644
index 9c347631d817..000000000000
--- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * Copyright (C) 2017 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.settingslib.suggestions;
-
-import android.Manifest;
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.annotation.RequiresPermission;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
-import android.content.res.Resources;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.util.ArrayMap;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Pair;
-import android.util.Xml;
-import android.view.InflateException;
-
-import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.drawer.TileUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class SuggestionParser {
-
- private static final String TAG = "SuggestionParser";
-
- // If defined, only returns this suggestion if the feature is supported.
- public static final String META_DATA_REQUIRE_FEATURE = "com.android.settings.require_feature";
-
- // If defined, only display this optional step if an account of that type exists.
- private static final String META_DATA_REQUIRE_ACCOUNT = "com.android.settings.require_account";
-
- // If defined and not true, do not should optional step.
- private static final String META_DATA_IS_SUPPORTED = "com.android.settings.is_supported";
-
- // If defined, only display this optional step if the current user is of that type.
- private static final String META_DATA_REQUIRE_USER_TYPE =
- "com.android.settings.require_user_type";
-
- // If defined, only display this optional step if a connection is available.
- private static final String META_DATA_IS_CONNECTION_REQUIRED =
- "com.android.settings.require_connection";
-
- // The valid values that setup wizard recognizes for differentiating user types.
- private static final String META_DATA_PRIMARY_USER_TYPE_VALUE = "primary";
- private static final String META_DATA_ADMIN_USER_TYPE_VALUE = "admin";
- private static final String META_DATA_GUEST_USER_TYPE_VALUE = "guest";
- private static final String META_DATA_RESTRICTED_USER_TYPE_VALUE = "restricted";
-
- /**
- * Allows suggestions to appear after a certain number of days, and to re-appear if dismissed.
- * For instance:
- * 0,10
- * Will appear immediately, but if the user removes it, it will come back after 10 days.
- *
- * Another example:
- * 10,30
- * Will only show up after 10 days, and then again after 30.
- */
- public static final String META_DATA_DISMISS_CONTROL = "com.android.settings.dismiss";
-
- // Shared prefs keys for storing dismissed state.
- // Index into current dismissed state.
- public static final String SETUP_TIME = "_setup_time";
- private static final String IS_DISMISSED = "_is_dismissed";
-
- // Default dismiss control for smart suggestions.
- private static final String DEFAULT_SMART_DISMISS_CONTROL = "0";
-
- private final Context mContext;
- private final List<SuggestionCategory> mSuggestionList;
- private final ArrayMap<Pair<String, String>, Tile> mAddCache = new ArrayMap<>();
- private final SharedPreferences mSharedPrefs;
- private final String mDefaultDismissControl;
-
- public SuggestionParser(Context context, SharedPreferences sharedPrefs, int orderXml,
- String defaultDismissControl) {
- this(
- context,
- sharedPrefs,
- (List<SuggestionCategory>) new SuggestionOrderInflater(context).parse(orderXml),
- defaultDismissControl);
- }
-
- public SuggestionParser(Context context, SharedPreferences sharedPrefs, int orderXml) {
- this(context, sharedPrefs, orderXml, DEFAULT_SMART_DISMISS_CONTROL);
- }
-
- @VisibleForTesting
- public SuggestionParser(
- Context context,
- SharedPreferences sharedPrefs,
- List<SuggestionCategory> suggestionList,
- String defaultDismissControl) {
- mContext = context;
- mSuggestionList = suggestionList;
- mSharedPrefs = sharedPrefs;
- mDefaultDismissControl = defaultDismissControl;
- }
-
- public SuggestionList getSuggestions(boolean isSmartSuggestionEnabled) {
- final SuggestionList suggestionList = new SuggestionList();
- final int N = mSuggestionList.size();
- for (int i = 0; i < N; i++) {
- final SuggestionCategory category = mSuggestionList.get(i);
- if (category.exclusive && !isExclusiveCategoryExpired(category)) {
- // If suggestions from an exclusive category are present, parsing is stopped
- // and only suggestions from that category are displayed. Note that subsequent
- // exclusive categories are also ignored.
- final List<Tile> exclusiveSuggestions = new ArrayList<>();
-
- // Read suggestion and force isSmartSuggestion to be false so the rule defined
- // from each suggestion itself is used.
- readSuggestions(category, exclusiveSuggestions, false /* isSmartSuggestion */);
- if (!exclusiveSuggestions.isEmpty()) {
- final SuggestionList exclusiveList = new SuggestionList();
- exclusiveList.addSuggestions(category, exclusiveSuggestions);
- return exclusiveList;
- }
- } else {
- // Either the category is not exclusive, or the exclusiveness expired so we should
- // treat it as a normal category.
- final List<Tile> suggestions = new ArrayList<>();
- readSuggestions(category, suggestions, isSmartSuggestionEnabled);
- suggestionList.addSuggestions(category, suggestions);
- }
- }
- return suggestionList;
- }
-
- /**
- * Dismisses a suggestion, returns true if the suggestion has no more dismisses left and should
- * be disabled.
- */
- public boolean dismissSuggestion(Tile suggestion) {
- final String keyBase = suggestion.intent.getComponent().flattenToShortString();
- mSharedPrefs.edit()
- .putBoolean(keyBase + IS_DISMISSED, true)
- .commit();
- return true;
- }
-
- @VisibleForTesting
- public void filterSuggestions(
- List<Tile> suggestions, int countBefore, boolean isSmartSuggestionEnabled) {
- for (int i = countBefore; i < suggestions.size(); i++) {
- if (!isAvailable(suggestions.get(i)) ||
- !isSupported(suggestions.get(i)) ||
- !satisifesRequiredUserType(suggestions.get(i)) ||
- !satisfiesRequiredAccount(suggestions.get(i)) ||
- !satisfiesConnectivity(suggestions.get(i)) ||
- isDismissed(suggestions.get(i), isSmartSuggestionEnabled)) {
- suggestions.remove(i--);
- }
- }
- }
-
- @VisibleForTesting
- void readSuggestions(
- SuggestionCategory category, List<Tile> suggestions, boolean isSmartSuggestionEnabled) {
- int countBefore = suggestions.size();
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(category.category);
- if (category.pkg != null) {
- intent.setPackage(category.pkg);
- }
- TileUtils.getTilesForIntent(mContext, new UserHandle(UserHandle.myUserId()), intent,
- mAddCache, null, suggestions, true, false, false, true /* shouldUpdateTiles */);
- filterSuggestions(suggestions, countBefore, isSmartSuggestionEnabled);
- if (!category.multiple && suggestions.size() > (countBefore + 1)) {
- // If there are too many, remove them all and only re-add the one with the highest
- // priority.
- Tile item = suggestions.remove(suggestions.size() - 1);
- while (suggestions.size() > countBefore) {
- Tile last = suggestions.remove(suggestions.size() - 1);
- if (last.priority > item.priority) {
- item = last;
- }
- }
- // If category is marked as done, do not add any item.
- if (!isCategoryDone(category.category)) {
- suggestions.add(item);
- }
- }
- }
-
- private boolean isAvailable(Tile suggestion) {
- final String featuresRequired = suggestion.metaData.getString(META_DATA_REQUIRE_FEATURE);
- if (featuresRequired != null) {
- for (String feature : featuresRequired.split(",")) {
- if (TextUtils.isEmpty(feature)) {
- Log.w(TAG, "Found empty substring when parsing required features: "
- + featuresRequired);
- } else if (!mContext.getPackageManager().hasSystemFeature(feature)) {
- Log.i(TAG, suggestion.title + " requires unavailable feature " + feature);
- return false;
- }
- }
- }
- return true;
- }
-
- @RequiresPermission(Manifest.permission.MANAGE_USERS)
- private boolean satisifesRequiredUserType(Tile suggestion) {
- final String requiredUser = suggestion.metaData.getString(META_DATA_REQUIRE_USER_TYPE);
- if (requiredUser != null) {
- final UserManager userManager = mContext.getSystemService(UserManager.class);
- UserInfo userInfo = userManager.getUserInfo(UserHandle.myUserId());
- for (String userType : requiredUser.split("\\|")) {
- final boolean primaryUserCondtionMet = userInfo.isPrimary()
- && META_DATA_PRIMARY_USER_TYPE_VALUE.equals(userType);
- final boolean adminUserConditionMet = userInfo.isAdmin()
- && META_DATA_ADMIN_USER_TYPE_VALUE.equals(userType);
- final boolean guestUserCondtionMet = userInfo.isGuest()
- && META_DATA_GUEST_USER_TYPE_VALUE.equals(userType);
- final boolean restrictedUserCondtionMet = userInfo.isRestricted()
- && META_DATA_RESTRICTED_USER_TYPE_VALUE.equals(userType);
- if (primaryUserCondtionMet || adminUserConditionMet || guestUserCondtionMet
- || restrictedUserCondtionMet) {
- return true;
- }
- }
- Log.i(TAG, suggestion.title + " requires user type " + requiredUser);
- return false;
- }
- return true;
- }
-
- public boolean satisfiesRequiredAccount(Tile suggestion) {
- final String requiredAccountType = suggestion.metaData.getString(META_DATA_REQUIRE_ACCOUNT);
- if (requiredAccountType == null) {
- return true;
- }
- AccountManager accountManager = mContext.getSystemService(AccountManager.class);
- Account[] accounts = accountManager.getAccountsByType(requiredAccountType);
- boolean satisfiesRequiredAccount = accounts.length > 0;
- if (!satisfiesRequiredAccount) {
- Log.i(TAG, suggestion.title + " requires unavailable account type "
- + requiredAccountType);
- }
- return satisfiesRequiredAccount;
- }
-
- public boolean isSupported(Tile suggestion) {
- final int isSupportedResource = suggestion.metaData.getInt(META_DATA_IS_SUPPORTED);
- try {
- if (suggestion.intent == null) {
- return false;
- }
- final Resources res = mContext.getPackageManager().getResourcesForActivity(
- suggestion.intent.getComponent());
- boolean isSupported =
- isSupportedResource != 0 ? res.getBoolean(isSupportedResource) : true;
- if (!isSupported) {
- Log.i(TAG, suggestion.title + " requires unsupported resource "
- + isSupportedResource);
- }
- return isSupported;
- } catch (PackageManager.NameNotFoundException e) {
- Log.w(TAG, "Cannot find resources for " + suggestion.intent.getComponent());
- return false;
- } catch (Resources.NotFoundException e) {
- Log.w(TAG, "Cannot find resources for " + suggestion.intent.getComponent(), e);
- return false;
- }
- }
-
- private boolean satisfiesConnectivity(Tile suggestion) {
- final boolean isConnectionRequired =
- suggestion.metaData.getBoolean(META_DATA_IS_CONNECTION_REQUIRED);
- if (!isConnectionRequired) {
- return true;
- }
- ConnectivityManager cm =
- (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo netInfo = cm.getActiveNetworkInfo();
- boolean satisfiesConnectivity = netInfo != null && netInfo.isConnectedOrConnecting();
- if (!satisfiesConnectivity) {
- Log.i(TAG, suggestion.title + " is missing required connection.");
- }
- return satisfiesConnectivity;
- }
-
- public boolean isCategoryDone(String category) {
- String name = Settings.Secure.COMPLETED_CATEGORY_PREFIX + category;
- return Settings.Secure.getInt(mContext.getContentResolver(), name, 0) != 0;
- }
-
- public void markCategoryDone(String category) {
- String name = Settings.Secure.COMPLETED_CATEGORY_PREFIX + category;
- Settings.Secure.putInt(mContext.getContentResolver(), name, 1);
- }
-
- /**
- * Whether or not the category's exclusiveness has expired.
- */
- private boolean isExclusiveCategoryExpired(SuggestionCategory category) {
- final String keySetupTime = category.category + SETUP_TIME;
- final long currentTime = System.currentTimeMillis();
- if (!mSharedPrefs.contains(keySetupTime)) {
- mSharedPrefs.edit()
- .putLong(keySetupTime, currentTime)
- .commit();
- }
- if (category.exclusiveExpireDaysInMillis < 0) {
- // negative means never expires
- return false;
- }
- final long setupTime = mSharedPrefs.getLong(keySetupTime, 0);
- final long elapsedTime = currentTime - setupTime;
- Log.d(TAG, "Day " + elapsedTime / DateUtils.DAY_IN_MILLIS + " for " + category.category);
- return elapsedTime > category.exclusiveExpireDaysInMillis;
- }
-
- @VisibleForTesting
- boolean isDismissed(Tile suggestion, boolean isSmartSuggestionEnabled) {
- String dismissControl = getDismissControl(suggestion, isSmartSuggestionEnabled);
- String keyBase = suggestion.intent.getComponent().flattenToShortString();
- if (!mSharedPrefs.contains(keyBase + SETUP_TIME)) {
- mSharedPrefs.edit()
- .putLong(keyBase + SETUP_TIME, System.currentTimeMillis())
- .commit();
- }
- // Check if it's already manually dismissed
- final boolean isDismissed = mSharedPrefs.getBoolean(keyBase + IS_DISMISSED, false);
- if (isDismissed) {
- return true;
- }
- if (dismissControl == null) {
- return false;
- }
- // Parse when suggestion should first appear. return true to artificially hide suggestion
- // before then.
- int firstAppearDay = parseDismissString(dismissControl);
- long firstAppearDayInMs = getEndTime(mSharedPrefs.getLong(keyBase + SETUP_TIME, 0),
- firstAppearDay);
- if (System.currentTimeMillis() >= firstAppearDayInMs) {
- // Dismiss timeout has passed, undismiss it.
- mSharedPrefs.edit()
- .putBoolean(keyBase + IS_DISMISSED, false)
- .commit();
- return false;
- }
- return true;
- }
-
- private long getEndTime(long startTime, int daysDelay) {
- long days = daysDelay * DateUtils.DAY_IN_MILLIS;
- return startTime + days;
- }
-
- /**
- * Parse the first int from a string formatted as "0,1,2..."
- * The value means suggestion should first appear on Day X.
- */
- private int parseDismissString(String dismissControl) {
- final String[] dismissStrs = dismissControl.split(",");
- return Integer.parseInt(dismissStrs[0]);
- }
-
- private String getDismissControl(Tile suggestion, boolean isSmartSuggestionEnabled) {
- if (isSmartSuggestionEnabled) {
- return mDefaultDismissControl;
- } else {
- return suggestion.metaData.getString(META_DATA_DISMISS_CONTROL);
- }
- }
-
- private static class SuggestionOrderInflater {
- private static final String TAG_LIST = "optional-steps";
- private static final String TAG_ITEM = "step";
-
- private static final String ATTR_CATEGORY = "category";
- private static final String ATTR_PACKAGE = "package";
- private static final String ATTR_MULTIPLE = "multiple";
- private static final String ATTR_EXCLUSIVE = "exclusive";
- private static final String ATTR_EXCLUSIVE_EXPIRE_DAYS = "exclusiveExpireDays";
-
- private final Context mContext;
-
- public SuggestionOrderInflater(Context context) {
- mContext = context;
- }
-
- public Object parse(int resource) {
- XmlPullParser parser = mContext.getResources().getXml(resource);
- final AttributeSet attrs = Xml.asAttributeSet(parser);
- try {
- // Look for the root node.
- int type;
- do {
- type = parser.next();
- } while (type != XmlPullParser.START_TAG && type != XmlPullParser.END_DOCUMENT);
-
- if (type != XmlPullParser.START_TAG) {
- throw new InflateException(parser.getPositionDescription()
- + ": No start tag found!");
- }
-
- // Temp is the root that was found in the xml
- Object xmlRoot = onCreateItem(parser.getName(), attrs);
-
- // Inflate all children under temp
- rParse(parser, xmlRoot, attrs);
- return xmlRoot;
- } catch (XmlPullParserException | IOException e) {
- Log.w(TAG, "Problem parser resource " + resource, e);
- return null;
- }
- }
-
- /**
- * Recursive method used to descend down the xml hierarchy and instantiate
- * items, instantiate their children.
- */
- private void rParse(XmlPullParser parser, Object parent, final AttributeSet attrs)
- throws XmlPullParserException, IOException {
- final int depth = parser.getDepth();
-
- int type;
- while (((type = parser.next()) != XmlPullParser.END_TAG ||
- parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
- if (type != XmlPullParser.START_TAG) {
- continue;
- }
-
- final String name = parser.getName();
-
- Object item = onCreateItem(name, attrs);
- onAddChildItem(parent, item);
- rParse(parser, item, attrs);
- }
- }
-
- protected void onAddChildItem(Object parent, Object child) {
- if (parent instanceof List<?> && child instanceof SuggestionCategory) {
- ((List<SuggestionCategory>) parent).add((SuggestionCategory) child);
- } else {
- throw new IllegalArgumentException("Parent was not a list");
- }
- }
-
- protected Object onCreateItem(String name, AttributeSet attrs) {
- if (name.equals(TAG_LIST)) {
- return new ArrayList<SuggestionCategory>();
- } else if (name.equals(TAG_ITEM)) {
- SuggestionCategory category = new SuggestionCategory();
- category.category = attrs.getAttributeValue(null, ATTR_CATEGORY);
- category.pkg = attrs.getAttributeValue(null, ATTR_PACKAGE);
- String multiple = attrs.getAttributeValue(null, ATTR_MULTIPLE);
- category.multiple = !TextUtils.isEmpty(multiple) && Boolean.parseBoolean(multiple);
- String exclusive = attrs.getAttributeValue(null, ATTR_EXCLUSIVE);
- category.exclusive =
- !TextUtils.isEmpty(exclusive) && Boolean.parseBoolean(exclusive);
- String expireDaysAttr = attrs.getAttributeValue(null,
- ATTR_EXCLUSIVE_EXPIRE_DAYS);
- long expireDays = !TextUtils.isEmpty(expireDaysAttr)
- ? Integer.parseInt(expireDaysAttr)
- : -1;
- category.exclusiveExpireDaysInMillis = DateUtils.DAY_IN_MILLIS * expireDays;
- return category;
- } else {
- throw new IllegalArgumentException("Unknown item " + name);
- }
- }
- }
-}
-
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
index 0fc9a4d6e408..7cdbe719df78 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
@@ -31,7 +31,7 @@ import android.graphics.drawable.Drawable;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.Log;
import android.view.inputmethod.InputMethodInfo;
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/AsyncLoaderCompat.java b/packages/SettingsLib/src/com/android/settingslib/utils/AsyncLoaderCompat.java
new file mode 100644
index 000000000000..916d7e312631
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/AsyncLoaderCompat.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.utils;
+
+import android.content.Context;
+
+import androidx.loader.content.AsyncTaskLoader;
+
+/**
+ * This class fills in some boilerplate for AsyncTaskLoader to actually load things.
+ *
+ * Subclasses need to implement {@link AsyncLoaderCompat#loadInBackground()} to perform the actual
+ * background task, and {@link AsyncLoaderCompat#onDiscardResult(T)} to clean up previously loaded
+ * results.
+ *
+ * This loader is based on the MailAsyncTaskLoader from the AOSP EmailUnified repo.
+ *
+ * @param <T> the data type to be loaded.
+ */
+public abstract class AsyncLoaderCompat<T> extends AsyncTaskLoader<T> {
+ private T mResult;
+
+ public AsyncLoaderCompat(final Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void onStartLoading() {
+ if (mResult != null) {
+ deliverResult(mResult);
+ }
+
+ if (takeContentChanged() || mResult == null) {
+ forceLoad();
+ }
+ }
+
+ @Override
+ protected void onStopLoading() {
+ cancelLoad();
+ }
+
+ @Override
+ public void deliverResult(final T data) {
+ if (isReset()) {
+ if (data != null) {
+ onDiscardResult(data);
+ }
+ return;
+ }
+
+ final T oldResult = mResult;
+ mResult = data;
+
+ if (isStarted()) {
+ super.deliverResult(data);
+ }
+
+ if (oldResult != null && oldResult != mResult) {
+ onDiscardResult(oldResult);
+ }
+ }
+
+ @Override
+ protected void onReset() {
+ super.onReset();
+
+ onStopLoading();
+
+ if (mResult != null) {
+ onDiscardResult(mResult);
+ }
+ mResult = null;
+ }
+
+ @Override
+ public void onCanceled(final T data) {
+ super.onCanceled(data);
+
+ if (data != null) {
+ onDiscardResult(data);
+ }
+ }
+
+ /**
+ * Called when discarding the load results so subclasses can take care of clean-up or
+ * recycling tasks. This is not called if the same result (by way of pointer equality) is
+ * returned again by a subsequent call to loadInBackground, or if result is null.
+ *
+ * Note that this may be called concurrently with loadInBackground(), and in some circumstances
+ * may be called more than once for a given object.
+ *
+ * @param result The value returned from {@link AsyncLoaderCompat#loadInBackground()} which
+ * is to be discarded.
+ */
+ protected abstract void onDiscardResult(T result);
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java b/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java
index 3d55c4fee358..f0548ff7a923 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java
@@ -19,8 +19,8 @@ package com.android.settingslib.utils;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.util.ArrayMap;
+import androidx.annotation.VisibleForTesting;
+import androidx.collection.ArrayMap;
/**
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
index a53ff3904346..e16da84ce713 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
@@ -22,7 +22,7 @@ import android.icu.text.MeasureFormat;
import android.icu.text.MeasureFormat.FormatWidth;
import android.icu.util.Measure;
import android.icu.util.MeasureUnit;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.text.TextUtils;
import com.android.settingslib.R;
diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
index e6935516f401..87a56c7548d2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
@@ -17,9 +17,9 @@
package com.android.settingslib.widget;
import android.content.Context;
-import android.support.v4.content.res.TypedArrayUtils;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
import android.text.method.LinkMovementMethod;
import android.util.AttributeSet;
import android.widget.TextView;
diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixin.java b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixin.java
index 2edcd9e2c066..5883754fa2ed 100644
--- a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixin.java
+++ b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixin.java
@@ -17,8 +17,8 @@
package com.android.settingslib.widget;
import android.content.Context;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixinCompat.java b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixinCompat.java
new file mode 100644
index 000000000000..260ac838cb32
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreferenceMixinCompat.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.widget;
+
+import android.content.Context;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.SetPreferenceScreen;
+
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+
+public class FooterPreferenceMixinCompat implements LifecycleObserver, SetPreferenceScreen {
+
+ private final PreferenceFragmentCompat mFragment;
+ private FooterPreference mFooterPreference;
+
+ public FooterPreferenceMixinCompat(PreferenceFragmentCompat fragment, Lifecycle lifecycle) {
+ mFragment = fragment;
+ lifecycle.addObserver(this);
+ }
+
+ @Override
+ public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
+ if (mFooterPreference != null) {
+ preferenceScreen.addPreference(mFooterPreference);
+ }
+ }
+
+ /**
+ * Creates a new {@link FooterPreference}.
+ */
+ public FooterPreference createFooterPreference() {
+ final PreferenceScreen screen = mFragment.getPreferenceScreen();
+ if (mFooterPreference != null && screen != null) {
+ screen.removePreference(mFooterPreference);
+ }
+ mFooterPreference = new FooterPreference(getPrefContext());
+
+ if (screen != null) {
+ screen.addPreference(mFooterPreference);
+ }
+ return mFooterPreference;
+ }
+
+ /**
+ * Returns an UI context with theme properly set for new Preference objects.
+ */
+ private Context getPrefContext() {
+ return mFragment.getPreferenceManager().getContext();
+ }
+
+ public boolean hasFooter() {
+ return mFooterPreference != null;
+ }
+}
+
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index ba5fdc09b55a..a876e42e765e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -48,7 +48,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
@@ -836,10 +836,7 @@ public class AccessPoint implements Comparable<AccessPoint> {
}
public CharSequence getSsid() {
- final SpannableString str = new SpannableString(ssid);
- str.setSpan(new TtsSpan.TelephoneBuilder(ssid).build(), 0, ssid.length(),
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- return str;
+ return ssid;
}
public String getConfigName() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
index c0a4172514d8..504fbc548fa5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -25,9 +25,9 @@ import android.graphics.drawable.StateListDrawable;
import android.net.wifi.WifiConfiguration;
import android.os.Looper;
import android.os.UserHandle;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.SparseArray;
@@ -191,7 +191,7 @@ public class AccessPointPreference extends Preference {
Drawable drawable = mIconInjector.getIcon(level);
if (!mForSavedNetworks && drawable != null) {
- drawable.setTint(Utils.getColorAttr(context, android.R.attr.colorControlNormal));
+ drawable.setTintList(Utils.getColorAttr(context, android.R.attr.colorControlNormal));
setIcon(drawable);
} else {
safeSetDefaultIcon();
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
index 2993a0de0658..5862e6f19e16 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java
@@ -24,7 +24,7 @@ import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.os.Bundle;
import android.os.Parcelable;
-import android.support.annotation.Keep;
+import androidx.annotation.Keep;
import com.android.settingslib.wifi.AccessPoint.Speed;
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index 0270796680cd..8e79dcd5fa08 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -41,9 +41,9 @@ import android.os.Message;
import android.os.Process;
import android.os.SystemClock;
import android.provider.Settings;
-import android.support.annotation.GuardedBy;
-import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java
index 8b5863aee91f..e73d952cd645 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTrackerFactory.java
@@ -16,8 +16,8 @@
package com.android.settingslib.wifi;
import android.content.Context;
-import android.support.annotation.Keep;
-import android.support.annotation.NonNull;
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
import com.android.settingslib.core.lifecycle.Lifecycle;
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
index bee2fa135957..4792317c9f1e 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java
@@ -21,7 +21,7 @@ import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.os.SystemClock;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import com.android.settingslib.R;
diff --git a/packages/SettingsLib/src/com/android/settingslib/wrapper/BluetoothA2dpWrapper.java b/packages/SettingsLib/src/com/android/settingslib/wrapper/BluetoothA2dpWrapper.java
deleted file mode 100644
index 17e34016a53b..000000000000
--- a/packages/SettingsLib/src/com/android/settingslib/wrapper/BluetoothA2dpWrapper.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2017 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.settingslib.wrapper;
-
-import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothCodecStatus;
-import android.bluetooth.BluetoothDevice;
-
-/**
- * This class replicates some methods of android.bluetooth.BluetoothA2dp that are new and not
- * yet available in our current version of Robolectric. It provides a thin wrapper to call the real
- * methods in production and a mock in tests.
- */
-public class BluetoothA2dpWrapper {
-
- private BluetoothA2dp mService;
-
- public BluetoothA2dpWrapper(BluetoothA2dp service) {
- mService = service;
- }
-
- /**
- * @return the real {@code BluetoothA2dp} object
- */
- public BluetoothA2dp getService() {
- return mService;
- }
-
- /**
- * Wraps {@code BluetoothA2dp.getCodecStatus}
- */
- public BluetoothCodecStatus getCodecStatus(BluetoothDevice device) {
- return mService.getCodecStatus(device);
- }
-
- /**
- * Wraps {@code BluetoothA2dp.supportsOptionalCodecs}
- */
- public int supportsOptionalCodecs(BluetoothDevice device) {
- return mService.supportsOptionalCodecs(device);
- }
-
- /**
- * Wraps {@code BluetoothA2dp.getOptionalCodecsEnabled}
- */
- public int getOptionalCodecsEnabled(BluetoothDevice device) {
- return mService.getOptionalCodecsEnabled(device);
- }
-
- /**
- * Wraps {@code BluetoothA2dp.setOptionalCodecsEnabled}
- */
- public void setOptionalCodecsEnabled(BluetoothDevice device, int value) {
- mService.setOptionalCodecsEnabled(device, value);
- }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wrapper/LocationManagerWrapper.java b/packages/SettingsLib/src/com/android/settingslib/wrapper/LocationManagerWrapper.java
deleted file mode 100644
index 1a268a608e5d..000000000000
--- a/packages/SettingsLib/src/com/android/settingslib/wrapper/LocationManagerWrapper.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2017 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.settingslib.wrapper;
-
-import android.location.LocationManager;
-import android.os.UserHandle;
-
-/**
- * This class replicates some methods of android.location.LocationManager that are new and not
- * yet available in our current version of Robolectric. It provides a thin wrapper to call the real
- * methods in production and a mock in tests.
- */
-public class LocationManagerWrapper {
-
- private LocationManager mLocationManager;
-
- public LocationManagerWrapper(LocationManager locationManager) {
- mLocationManager = locationManager;
- }
-
- /** Returns the real {@code LocationManager} object */
- public LocationManager getLocationManager() {
- return mLocationManager;
- }
-
- /** Wraps {@code LocationManager.isProviderEnabled} method */
- public boolean isProviderEnabled(String provider) {
- return mLocationManager.isProviderEnabled(provider);
- }
-
- /** Wraps {@code LocationManager.setProviderEnabledForUser} method */
- public void setProviderEnabledForUser(String provider, boolean enabled, UserHandle userHandle) {
- mLocationManager.setProviderEnabledForUser(provider, enabled, userHandle);
- }
-
- /** Wraps {@code LocationManager.isLocationEnabled} method */
- public boolean isLocationEnabled() {
- return mLocationManager.isLocationEnabled();
- }
-
- /** Wraps {@code LocationManager.isLocationEnabledForUser} method */
- public boolean isLocationEnabledForUser(UserHandle userHandle) {
- return mLocationManager.isLocationEnabledForUser(userHandle);
- }
-
- /** Wraps {@code LocationManager.setLocationEnabledForUser} method */
- public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
- mLocationManager.setLocationEnabledForUser(enabled, userHandle);
- }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java b/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java
deleted file mode 100644
index 235daf23a664..000000000000
--- a/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (C) 2017 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.settingslib.wrapper;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageDeleteObserver;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-import android.os.storage.VolumeInfo;
-
-import java.util.List;
-
-/**
- * A thin wrapper class that simplifies testing by putting a mockable layer between the application
- * and the PackageManager. This class only provides access to the minimum number of functions from
- * the PackageManager needed for DeletionHelper to work.
- */
-public class PackageManagerWrapper {
-
- private final PackageManager mPm;
-
- public PackageManagerWrapper(PackageManager pm) {
- mPm = pm;
- }
-
- /**
- * Returns the real {@code PackageManager} object.
- */
- public PackageManager getPackageManager() {
- return mPm;
- }
-
- /**
- * Calls {@code PackageManager.getInstalledApplicationsAsUser()}.
- *
- * @see android.content.pm.PackageManager#getInstalledApplicationsAsUser
- */
- public List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
- return mPm.getInstalledApplicationsAsUser(flags, userId);
- }
-
- /**
- * Calls {@code PackageManager.getInstalledPackagesAsUser}
- */
- public List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) {
- return mPm.getInstalledPackagesAsUser(flags, userId);
- }
-
- /**
- * Calls {@code PackageManager.hasSystemFeature()}.
- *
- * @see android.content.pm.PackageManager#hasSystemFeature
- */
- public boolean hasSystemFeature(String name) {
- return mPm.hasSystemFeature(name);
- }
-
- /**
- * Calls {@code PackageManager.queryIntentActivitiesAsUser()}.
- *
- * @see android.content.pm.PackageManager#queryIntentActivitiesAsUser
- */
- public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
- return mPm.queryIntentActivitiesAsUser(intent, flags, userId);
- }
-
- /**
- * Calls {@code PackageManager.getInstallReason()}.
- *
- * @see android.content.pm.PackageManager#getInstallReason
- */
- public int getInstallReason(String packageName, UserHandle user) {
- return mPm.getInstallReason(packageName, user);
- }
-
- /**
- * Calls {@code PackageManager.getApplicationInfoAsUser}
- */
- public ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
- throws PackageManager.NameNotFoundException {
- return mPm.getApplicationInfoAsUser(packageName, i, userId);
- }
-
- /**
- * Calls {@code PackageManager.setDefaultBrowserPackageNameAsUser}
- */
- public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
- return mPm.setDefaultBrowserPackageNameAsUser(packageName, userId);
- }
-
- /**
- * Calls {@code PackageManager.getDefaultBrowserPackageNameAsUser}
- */
- public String getDefaultBrowserPackageNameAsUser(int userId) {
- return mPm.getDefaultBrowserPackageNameAsUser(userId);
- }
-
- /**
- * Calls {@code PackageManager.getHomeActivities}
- */
- public ComponentName getHomeActivities(List<ResolveInfo> homeActivities) {
- return mPm.getHomeActivities(homeActivities);
- }
-
- /**
- * Calls {@code PackageManager.queryIntentServicesAsUser}
- */
- public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user) {
- return mPm.queryIntentServicesAsUser(intent, i, user);
- }
-
- /**
- * Calls {@code PackageManager.queryIntentServices}
- */
- public List<ResolveInfo> queryIntentServices(Intent intent, int i) {
- return mPm.queryIntentServices(intent, i);
- }
-
- /**
- * Calls {@code PackageManager.replacePreferredActivity}
- */
- public void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
- ComponentName[] componentNames, ComponentName component) {
- mPm.replacePreferredActivity(homeFilter, matchCategoryEmpty, componentNames, component);
- }
-
- /**
- * Gets information about a particular package from the package manager.
- *
- * @param packageName The name of the package we would like information about.
- * @param i additional options flags. see javadoc for
- * {@link PackageManager#getPackageInfo(String, int)}
- * @return The PackageInfo for the requested package
- */
- public PackageInfo getPackageInfo(String packageName, int i) throws NameNotFoundException {
- return mPm.getPackageInfo(packageName, i);
- }
-
- /**
- * Retrieves the icon associated with this particular set of ApplicationInfo
- *
- * @param info The ApplicationInfo to retrieve the icon for
- * @return The icon as a drawable.
- */
- public Drawable getUserBadgedIcon(ApplicationInfo info) {
- return mPm.getUserBadgedIcon(mPm.loadUnbadgedItemIcon(info, info),
- new UserHandle(UserHandle.getUserId(info.uid)));
- }
-
- /**
- * Retrieves the label associated with the particular set of ApplicationInfo
- *
- * @param app The ApplicationInfo to retrieve the label for
- * @return the label as a CharSequence
- */
- public CharSequence loadLabel(ApplicationInfo app) {
- return app.loadLabel(mPm);
- }
-
- /**
- * Retrieve all activities that can be performed for the given intent.
- */
- public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
- return mPm.queryIntentActivities(intent, flags);
- }
-
- /**
- * Calls {@code PackageManager.getPrimaryStorageCurrentVolume}
- */
- public VolumeInfo getPrimaryStorageCurrentVolume() {
- return mPm.getPrimaryStorageCurrentVolume();
- }
-
- /**
- * Calls {@code PackageManager.deletePackageAsUser}
- */
- public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
- int userId) {
- mPm.deletePackageAsUser(packageName, observer, flags, userId);
- }
-
- /**
- * Calls {@code PackageManager.getPackageUidAsUser}
- */
- public int getPackageUidAsUser(String pkg, int userId)
- throws PackageManager.NameNotFoundException {
- return mPm.getPackageUidAsUser(pkg, userId);
- }
-
- /**
- * Calls {@code PackageManager.setApplicationEnabledSetting}
- */
- public void setApplicationEnabledSetting(String packageName, int newState, int flags) {
- mPm.setApplicationEnabledSetting(packageName, newState, flags);
- }
-
- /**
- * Calls {@code PackageManager.getApplicationEnabledSetting}
- */
- public int getApplicationEnabledSetting(String packageName) {
- return mPm.getApplicationEnabledSetting(packageName);
- }
-
- /**
- * Calls {@code PackageManager.setComponentEnabledSetting}
- */
- public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags) {
- mPm.setComponentEnabledSetting(componentName, newState, flags);
- }
-
- /**
- * Calls {@code PackageManager.getApplicationInfo}
- */
- public ApplicationInfo getApplicationInfo(String packageName, int flags)
- throws NameNotFoundException {
- return mPm.getApplicationInfo(packageName, flags);
- }
-
- /**
- * Calls {@code PackageManager.getApplicationLabel}
- */
- public CharSequence getApplicationLabel(ApplicationInfo info) {
- return mPm.getApplicationLabel(info);
- }
-
- /**
- * Calls {@code PackageManager.queryBroadcastReceivers}
- */
- public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
- return mPm.queryBroadcastReceivers(intent, flags);
- }
-}
-
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java
index 143a6cfb14a1..3fa2ce5f8312 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawable/UserIconDrawableTest.java
@@ -18,8 +18,15 @@ package com.android.settingslib.drawable;
import static com.google.common.truth.Truth.assertThat;
+import android.annotation.ColorInt;
+import android.content.res.ColorStateList;
import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuff.Mode;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
@@ -39,7 +46,27 @@ public class UserIconDrawableTest {
InstrumentationRegistry.getTargetContext().getResources(),
R.drawable.ic_mode_edit);
mDrawable = new UserIconDrawable(100 /* size */).setIcon(b).bake();
-
assertThat(mDrawable.getConstantState()).isNotNull();
}
+
+ @Test
+ public void setTintList_shouldBeApplied() {
+ @ColorInt final int targetColor = Color.BLUE;
+ final PorterDuff.Mode mode = Mode.SRC_OVER;
+
+ final Bitmap b = Bitmap.createBitmap(1, 1, Config.ARGB_8888);
+ UserIconDrawable drawable = new UserIconDrawable().setIcon(b);
+ drawable.setBounds(0, 0, 100, 100);
+
+ int[][] stateSet = new int[][] { {} };
+ int[] colors = new int[] { targetColor };
+ drawable.setTintList(new ColorStateList(stateSet, colors));
+ drawable.setTintMode(mode);
+
+ Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ drawable.draw(canvas);
+
+ assertThat(bitmap.getPixel(0, 0)).isEqualTo(Color.BLUE);
+ }
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodPreferenceTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodPreferenceTest.java
index ab2b97f7b548..93b038e07b51 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodPreferenceTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodPreferenceTest.java
@@ -125,6 +125,7 @@ public class InputMethodPreferenceTest {
final InputMethodSubtype systemLocaleSubtype =
new InputMethodSubtype.InputMethodSubtypeBuilder()
.setIsAsciiCapable(true)
+ .setSubtypeMode("keyboard")
.setSubtypeLocale(systemLocale.getLanguage())
.build();
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodSubtypePreferenceTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodSubtypePreferenceTest.java
index 131d74274a88..e591d8cac9f2 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodSubtypePreferenceTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/inputmethod/InputMethodSubtypePreferenceTest.java
@@ -19,6 +19,7 @@ package com.android.settingslib.inputmethod;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.text.TextUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -98,11 +99,14 @@ public class InputMethodSubtypePreferenceTest {
final String subtypeLocaleString,
final Locale systemLocale) {
final String key = subtypeName + "-" + subtypeLocaleString + "-" + systemLocale;
+ final String subtypeLanguageTag = subtypeLocaleString.replace('_', '-');
+ final Locale subtypeLocale = TextUtils.isEmpty(subtypeLanguageTag)
+ ? null : Locale.forLanguageTag(subtypeLanguageTag);
return new InputMethodSubtypePreference(
InstrumentationRegistry.getTargetContext(),
key,
subtypeName,
- subtypeLocaleString,
+ subtypeLocale,
systemLocale);
}
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index e435a72861da..032479990cae 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -104,18 +104,13 @@ public class AccessPointTest {
}
@Test
- public void testSsidIsTelephoneSpan() {
+ public void testSsidIsSpannableString_returnFalse() {
final Bundle bundle = new Bundle();
bundle.putString("key_ssid", TEST_SSID);
final AccessPoint ap = new AccessPoint(InstrumentationRegistry.getTargetContext(), bundle);
final CharSequence ssid = ap.getSsid();
- assertThat(ssid instanceof SpannableString).isTrue();
-
- TtsSpan[] spans = ((SpannableString) ssid).getSpans(0, TEST_SSID.length(), TtsSpan.class);
-
- assertThat(spans.length).isEqualTo(1);
- assertThat(spans[0].getType()).isEqualTo(TtsSpan.TYPE_TELEPHONE);
+ assertThat(ssid instanceof SpannableString).isFalse();
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/res/xml/suggestion_ordering.xml b/packages/SettingsLib/tests/robotests/res/xml/suggestion_ordering.xml
deleted file mode 100644
index f02ac15fbd19..000000000000
--- a/packages/SettingsLib/tests/robotests/res/xml/suggestion_ordering.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 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.
--->
-
-<optional-steps>
- <step category="com.android.settings.suggested.category.DEFERRED_SETUP"
- exclusive="true" />
- <step category="com.android.settings.suggested.category.LOCK_SCREEN" />
- <step category="com.android.settings.suggested.category.TRUST_AGENT" />
- <step category="com.android.settings.suggested.category.EMAIL" />
- <step category="com.android.settings.suggested.category.PARTNER_ACCOUNT"
- multiple="true" />
- <step category="com.android.settings.suggested.category.GESTURE" />
- <step category="com.android.settings.suggested.category.HOTWORD" />
- <step category="com.android.settings.suggested.category.DEFAULT"
- multiple="true" />
- <step category="com.android.settings.suggested.category.SETTINGS_ONLY"
- multiple="true" />
-</optional-steps>
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/CustomEditTextPreferenceComaptTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/CustomEditTextPreferenceComaptTest.java
new file mode 100644
index 000000000000..9ba996752f49
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/CustomEditTextPreferenceComaptTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.EditText;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+public class CustomEditTextPreferenceComaptTest {
+
+ @Mock
+ private View mView;
+
+ private TestPreference mPreference;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mPreference = new TestPreference(RuntimeEnvironment.application);
+ }
+
+ @Test
+ public void bindDialogView_shouldRequestFocus() {
+ final String testText = "";
+ final EditText editText = spy(new EditText(RuntimeEnvironment.application));
+ editText.setText(testText);
+ when(mView.findViewById(android.R.id.edit)).thenReturn(editText);
+
+ mPreference.onBindDialogView(mView);
+
+ verify(editText).requestFocus();
+ }
+
+ @Test
+ public void getEditText_noDialog_shouldNotCrash() {
+ ReflectionHelpers.setField(mPreference, "mFragment",
+ mock(CustomEditTextPreferenceCompat.CustomPreferenceDialogFragment.class));
+
+ mPreference.getEditText();
+
+ // no crash
+ }
+
+ private static class TestPreference extends CustomEditTextPreferenceCompat {
+ public TestPreference(Context context) {
+ super(context);
+ }
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
index a8821ba60785..f00ae0b08019 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java
@@ -24,8 +24,8 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
import android.view.View;
import android.widget.TextView;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java
index 8778ae949e20..914d1828981e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/SettingsLibRobolectricTestRunner.java
@@ -54,7 +54,7 @@ public class SettingsLibRobolectricTestRunner extends RobolectricTestRunner {
final List<ResourcePath> paths = super.getIncludedResourcePaths();
paths.add(resourcePath("file:frameworks/base/packages/SettingsLib/res"));
paths.add(resourcePath("file:frameworks/base/core/res/res"));
- paths.add(resourcePath("file:frameworks/support/v7/appcompat/res"));
+ paths.add(resourcePath("file:frameworks/support/appcompat/res"));
return paths;
}
};
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TetherUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TetherUtilTest.java
index 0109f48e0c5d..fc0203a1a0c8 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TetherUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TetherUtilTest.java
@@ -17,31 +17,132 @@
package com.android.settingslib;
import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.net.ConnectivityManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.List;
@RunWith(SettingsLibRobolectricTestRunner.class)
public class TetherUtilTest {
- @Mock
private Context mContext;
+ @Mock
+ private ConnectivityManager mConnectivityManager;
+ @Mock
+ private UserManager mUserManager;
+
@Before
public void setUp() {
+ mContext = spy(RuntimeEnvironment.application);
+
MockitoAnnotations.initMocks(this);
+ doReturn(mConnectivityManager)
+ .when(mContext).getSystemService(Context.CONNECTIVITY_SERVICE);
+ doReturn(mUserManager)
+ .when(mContext).getSystemService(Context.USER_SERVICE);
}
@Test
public void isEntitlementCheckRequired_noConfigManager_returnTrue() {
- when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE)).thenReturn(null);
+ doReturn(null).when(mContext).getSystemService(Context.CARRIER_CONFIG_SERVICE);
assertThat(TetherUtil.isEntitlementCheckRequired(mContext)).isTrue();
}
+
+ @Test
+ public void isTetherAvailable_supported_configDisallowed_hasUserRestriction_returnTrue() {
+ setupIsTetherAvailable(true, true, true);
+
+ assertThat(TetherUtil.isTetherAvailable(mContext)).isFalse();
+ }
+
+ @Test
+ public void isTetherAvailable_notSupported_configDisallowed_hasUserRestriction_returnTrue() {
+ setupIsTetherAvailable(false, true, true);
+
+ assertThat(TetherUtil.isTetherAvailable(mContext)).isFalse();
+ }
+
+ @Test
+ public void isTetherAvailable_supported_configAllowed_hasUserRestriction_returnTrue() {
+ setupIsTetherAvailable(true, false, true);
+
+ assertThat(TetherUtil.isTetherAvailable(mContext)).isFalse();
+ }
+
+ @Test
+ public void isTetherAvailable_notSupported_configAllowed_hasUserRestriction_returnFalse() {
+ setupIsTetherAvailable(false, false, true);
+
+ assertThat(TetherUtil.isTetherAvailable(mContext)).isFalse();
+ }
+
+ @Test
+ public void isTetherAvailable_supported_configDisallowed_noUserRestriction_returnTrue() {
+ setupIsTetherAvailable(true, true, false);
+
+ assertThat(TetherUtil.isTetherAvailable(mContext)).isTrue();
+ }
+
+ @Test
+ public void isTetherAvailable_notSupported_configDisallowed_noUserRestriction_returnTrue() {
+ setupIsTetherAvailable(false, true, false);
+
+ assertThat(TetherUtil.isTetherAvailable(mContext)).isTrue();
+ }
+
+ @Test
+ public void isTetherAvailable_supported_configAllowed_noUserRestriction_returnTrue() {
+ setupIsTetherAvailable(true, false, false);
+
+ assertThat(TetherUtil.isTetherAvailable(mContext)).isTrue();
+ }
+
+ @Test
+ public void isTetherAvailable_notSupported_configAllowed_noUserRestriction_returnFalse() {
+ setupIsTetherAvailable(false, false, false);
+
+ assertThat(TetherUtil.isTetherAvailable(mContext)).isFalse();
+ }
+
+ private void setupIsTetherAvailable(boolean tetherSupported, boolean configAllowed,
+ boolean hasBseUserRestriction) {
+ when(mConnectivityManager.isTetheringSupported()).thenReturn(tetherSupported);
+
+ // For RestrictedLockUtils.checkIfRestrictionEnforced
+ final int userId = UserHandle.myUserId();
+ List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>();
+ if (configAllowed) {
+ // Add two enforcing users so that RestrictedLockUtils.checkIfRestrictionEnforced
+ // returns non-null
+ enforcingUsers.add(new UserManager.EnforcingUser(userId,
+ UserManager.RESTRICTION_SOURCE_DEVICE_OWNER));
+ enforcingUsers.add(new UserManager.EnforcingUser(userId,
+ UserManager.RESTRICTION_SOURCE_PROFILE_OWNER));
+ }
+ when(mUserManager.getUserRestrictionSources(
+ UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.of(userId)))
+ .thenReturn(enforcingUsers);
+
+ // For RestrictedLockUtils.hasBaseUserRestriction
+ when(mUserManager.hasBaseUserRestriction(
+ UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.of(userId)))
+ .thenReturn(hasBseUserRestriction);
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java
index 480143a79410..efd7de351ebe 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java
@@ -24,7 +24,7 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import android.content.Context;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.preference.PreferenceViewHolder;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
index a79f841e70c6..09a2bd299c0b 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java
@@ -41,8 +41,6 @@ import android.provider.Settings;
import android.provider.Settings.Secure;
import android.text.TextUtils;
-import com.android.settingslib.wrapper.LocationManagerWrapper;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -63,7 +61,7 @@ import java.util.Map;
@RunWith(SettingsLibRobolectricTestRunner.class)
@Config(shadows = {
UtilsTest.ShadowSecure.class,
- UtilsTest.ShadowLocationManagerWrapper.class})
+ UtilsTest.ShadowLocationManager.class})
public class UtilsTest {
private static final double[] TEST_PERCENTAGES = {0, 0.4, 0.5, 0.6, 49, 49.3, 49.8, 50, 100};
private static final String PERCENTAGE_0 = "0%";
@@ -192,8 +190,8 @@ public class UtilsTest {
}
}
- @Implements(value = LocationManagerWrapper.class)
- public static class ShadowLocationManagerWrapper {
+ @Implements(value = LocationManager.class)
+ public static class ShadowLocationManager {
@Implementation
public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/accessibility/AccessibilityUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/accessibility/AccessibilityUtilsTest.java
new file mode 100644
index 000000000000..152d024d0155
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/accessibility/AccessibilityUtilsTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+public class AccessibilityUtilsTest {
+
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ }
+
+ @Test
+ public void getEnabledServicesFromSettings_noService_emptyResult() {
+ assertThat(AccessibilityUtils.getEnabledServicesFromSettings(mContext)).isEmpty();
+ }
+
+ @Test
+ public void getEnabledServicesFromSettings_badFormat_emptyResult() {
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ ":",
+ UserHandle.myUserId());
+
+ assertThat(AccessibilityUtils.getEnabledServicesFromSettings(mContext)).isEmpty();
+ }
+
+ @Test
+ public void getEnabledServicesFromSettings_1Service_1result() {
+ final ComponentName cn = new ComponentName("pkg", "serv");
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ cn.flattenToString() + ":",
+ UserHandle.myUserId());
+
+ assertThat(AccessibilityUtils.getEnabledServicesFromSettings(mContext))
+ .containsExactly(cn);
+ }
+
+ @Test
+ public void getEnabledServicesFromSettings_2Services_2results() {
+ final ComponentName cn1 = new ComponentName("pkg", "serv");
+ final ComponentName cn2 = new ComponentName("pkg", "serv2");
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ cn1.flattenToString() + ":" + cn2.flattenToString(),
+ UserHandle.myUserId());
+
+ assertThat(AccessibilityUtils.getEnabledServicesFromSettings(mContext))
+ .containsExactly(cn1, cn2);
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java
index 6a161d0a645c..01f0d78ede1a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java
@@ -33,7 +33,6 @@ import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
-import com.android.settingslib.wrapper.PackageManagerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -41,7 +40,6 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
@RunWith(SettingsLibRobolectricTestRunner.class)
public class DefaultAppInfoTest {
@@ -53,8 +51,6 @@ public class DefaultAppInfoTest {
@Mock
private PackageManager mPackageManager;
@Mock
- private PackageManagerWrapper mPackageManagerWrapper;
- @Mock
private ApplicationInfo mApplicationInfo;
@Mock
private Drawable mIcon;
@@ -67,8 +63,7 @@ public class DefaultAppInfoTest {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
doReturn(mPackageManager).when(mContext).getPackageManager();
- when(mPackageManagerWrapper.getPackageManager()).thenReturn(mPackageManager);
- when(mPackageManagerWrapper.getApplicationInfoAsUser(anyString(), anyInt(),
+ when(mPackageManager.getApplicationInfoAsUser(anyString(), anyInt(),
anyInt())).thenReturn(mApplicationInfo);
when(mPackageManager.loadUnbadgedItemIcon(mPackageItemInfo, mApplicationInfo)).thenReturn(
mIcon);
@@ -77,7 +72,7 @@ public class DefaultAppInfoTest {
@Test
public void initInfoWithActivityInfo_shouldLoadInfo() {
mPackageItemInfo.packageName = "test";
- mInfo = new DefaultAppInfo(mContext, mPackageManagerWrapper, mPackageItemInfo);
+ mInfo = new DefaultAppInfo(mContext, mPackageManager, mPackageItemInfo);
mInfo.loadLabel();
Drawable icon = mInfo.loadIcon();
@@ -90,7 +85,7 @@ public class DefaultAppInfoTest {
public void initInfoWithComponent_shouldLoadInfo() {
when(mComponentName.getPackageName()).thenReturn("com.android.settings");
- mInfo = new DefaultAppInfo(mContext, mPackageManagerWrapper, 0 /* uid */, mComponentName);
+ mInfo = new DefaultAppInfo(mContext, mPackageManager, 0 /* uid */, mComponentName);
mInfo.getKey();
verify(mComponentName).flattenToString();
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java
index 0a91b7f40bab..4d1cf0649c8c 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/A2dpProfileTest.java
@@ -31,7 +31,6 @@ import android.content.Context;
import android.content.res.Resources;
import com.android.settingslib.R;
-import com.android.settingslib.wrapper.BluetoothA2dpWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -49,7 +48,6 @@ public class A2dpProfileTest {
@Mock LocalBluetoothProfileManager mProfileManager;
@Mock BluetoothDevice mDevice;
@Mock BluetoothA2dp mBluetoothA2dp;
- @Mock BluetoothA2dpWrapper mBluetoothA2dpWrapper;
BluetoothProfile.ServiceListener mServiceListener;
A2dpProfile mProfile;
@@ -68,31 +66,30 @@ public class A2dpProfileTest {
mProfile = new A2dpProfile(mContext, mAdapter, mDeviceManager, mProfileManager);
mServiceListener.onServiceConnected(BluetoothProfile.A2DP, mBluetoothA2dp);
- mProfile.setBluetoothA2dpWrapper(mBluetoothA2dpWrapper);
}
@Test
public void supportsHighQualityAudio() {
- when(mBluetoothA2dpWrapper.supportsOptionalCodecs(any())).thenReturn(
+ when(mBluetoothA2dp.supportsOptionalCodecs(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_SUPPORTED);
assertThat(mProfile.supportsHighQualityAudio(mDevice)).isTrue();
- when(mBluetoothA2dpWrapper.supportsOptionalCodecs(any())).thenReturn(
+ when(mBluetoothA2dp.supportsOptionalCodecs(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_NOT_SUPPORTED);
assertThat(mProfile.supportsHighQualityAudio(mDevice)).isFalse();
- when(mBluetoothA2dpWrapper.supportsOptionalCodecs(any())).thenReturn(
+ when(mBluetoothA2dp.supportsOptionalCodecs(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_SUPPORT_UNKNOWN);
assertThat(mProfile.supportsHighQualityAudio(mDevice)).isFalse();
}
@Test
public void isHighQualityAudioEnabled() {
- when(mBluetoothA2dpWrapper.getOptionalCodecsEnabled(any())).thenReturn(
+ when(mBluetoothA2dp.getOptionalCodecsEnabled(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
assertThat(mProfile.isHighQualityAudioEnabled(mDevice)).isTrue();
- when(mBluetoothA2dpWrapper.getOptionalCodecsEnabled(any())).thenReturn(
+ when(mBluetoothA2dp.getOptionalCodecsEnabled(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_PREF_DISABLED);
assertThat(mProfile.isHighQualityAudioEnabled(mDevice)).isFalse();
@@ -100,23 +97,23 @@ public class A2dpProfileTest {
// then isHighQualityAudioEnabled() should return true or false based on whether optional
// codecs are supported. If the device is connected then we should ask it directly, but if
// the device isn't connected then rely on the stored pref about such support.
- when(mBluetoothA2dpWrapper.getOptionalCodecsEnabled(any())).thenReturn(
+ when(mBluetoothA2dp.getOptionalCodecsEnabled(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_PREF_UNKNOWN);
when(mBluetoothA2dp.getConnectionState(any())).thenReturn(
BluetoothProfile.STATE_DISCONNECTED);
- when(mBluetoothA2dpWrapper.supportsOptionalCodecs(any())).thenReturn(
+ when(mBluetoothA2dp.supportsOptionalCodecs(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_NOT_SUPPORTED);
assertThat(mProfile.isHighQualityAudioEnabled(mDevice)).isFalse();
- when(mBluetoothA2dpWrapper.supportsOptionalCodecs(any())).thenReturn(
+ when(mBluetoothA2dp.supportsOptionalCodecs(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_SUPPORTED);
assertThat(mProfile.isHighQualityAudioEnabled(mDevice)).isTrue();
when(mBluetoothA2dp.getConnectionState(any())).thenReturn(
BluetoothProfile.STATE_CONNECTED);
BluetoothCodecStatus status = mock(BluetoothCodecStatus.class);
- when(mBluetoothA2dpWrapper.getCodecStatus(mDevice)).thenReturn(status);
+ when(mBluetoothA2dp.getCodecStatus(mDevice)).thenReturn(status);
BluetoothCodecConfig config = mock(BluetoothCodecConfig.class);
when(status.getCodecConfig()).thenReturn(config);
when(config.isMandatoryCodec()).thenReturn(false);
@@ -151,14 +148,14 @@ public class A2dpProfileTest {
// Most tests want to simulate optional codecs being supported by the device, so do that
// by default here.
- when(mBluetoothA2dpWrapper.supportsOptionalCodecs(any())).thenReturn(
+ when(mBluetoothA2dp.supportsOptionalCodecs(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_SUPPORTED);
}
@Test
public void getLableCodecsNotSupported() {
setupLabelTest();
- when(mBluetoothA2dpWrapper.supportsOptionalCodecs(any())).thenReturn(
+ when(mBluetoothA2dp.supportsOptionalCodecs(any())).thenReturn(
BluetoothA2dp.OPTIONAL_CODECS_NOT_SUPPORTED);
assertThat(mProfile.getHighQualityAudioOptionLabel(mDevice)).isEqualTo(UNKNOWN_CODEC_LABEL);
}
@@ -179,7 +176,7 @@ public class A2dpProfileTest {
BluetoothCodecStatus status = mock(BluetoothCodecStatus.class);
BluetoothCodecConfig config = mock(BluetoothCodecConfig.class);
BluetoothCodecConfig[] configs = {config};
- when(mBluetoothA2dpWrapper.getCodecStatus(mDevice)).thenReturn(status);
+ when(mBluetoothA2dp.getCodecStatus(mDevice)).thenReturn(status);
when(status.getCodecsSelectableCapabilities()).thenReturn(configs);
when(config.isMandatoryCodec()).thenReturn(true);
@@ -194,7 +191,7 @@ public class A2dpProfileTest {
BluetoothCodecStatus status = mock(BluetoothCodecStatus.class);
BluetoothCodecConfig config = mock(BluetoothCodecConfig.class);
BluetoothCodecConfig[] configs = {config};
- when(mBluetoothA2dpWrapper.getCodecStatus(mDevice)).thenReturn(status);
+ when(mBluetoothA2dp.getCodecStatus(mDevice)).thenReturn(status);
when(status.getCodecsSelectableCapabilities()).thenReturn(configs);
when(config.isMandatoryCodec()).thenReturn(false);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
index baba267cdf55..07310bd5746c 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/UtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
@@ -29,20 +29,22 @@ import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsLibRobolectricTestRunner.class)
-public class UtilsTest {
+public class BluetoothUtilsTest {
@Test
public void testGetBluetoothDrawable_noBatteryLevel_returnSimpleDrawable() {
- final Drawable drawable = Utils.getBluetoothDrawable(RuntimeEnvironment.application,
- R.drawable.ic_bt_laptop, BluetoothDevice.BATTERY_LEVEL_UNKNOWN, 1 /* iconScale */);
+ final Drawable drawable = BluetoothUtils.getBluetoothDrawable(
+ RuntimeEnvironment.application, R.drawable.ic_bt_laptop,
+ BluetoothDevice.BATTERY_LEVEL_UNKNOWN, 1 /* iconScale */);
assertThat(drawable).isNotInstanceOf(BluetoothDeviceLayerDrawable.class);
}
@Test
public void testGetBluetoothDrawable_hasBatteryLevel_returnLayerDrawable() {
- final Drawable drawable = Utils.getBluetoothDrawable(RuntimeEnvironment.application,
- R.drawable.ic_bt_laptop, 10 /* batteryLevel */, 1 /* iconScale */);
+ final Drawable drawable = BluetoothUtils.getBluetoothDrawable(
+ RuntimeEnvironment.application, R.drawable.ic_bt_laptop,
+ 10 /* batteryLevel */, 1 /* iconScale */);
assertThat(drawable).isInstanceOf(BluetoothDeviceLayerDrawable.class);
}
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 927a94f6b017..c39fb85428fa 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
@@ -572,4 +572,43 @@ public class CachedBluetoothDeviceTest {
assertThat(mCachedDevice.isHfpDevice()).isFalse();
}
+
+ @Test
+ public void isConnectedHearingAidDevice_connected_returnTrue() {
+ when(mProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile);
+ when(mHearingAidProfile.getConnectionStatus(mDevice)).
+ thenReturn(BluetoothProfile.STATE_CONNECTED);
+
+ assertThat(mCachedDevice.isConnectedHearingAidDevice()).isTrue();
+ }
+
+ @Test
+ public void isConnectedHearingAidDevice_disconnected_returnFalse() {
+ when(mProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile);
+ when(mHearingAidProfile.getConnectionStatus(mDevice)).
+ thenReturn(BluetoothProfile.STATE_DISCONNECTED);
+
+ assertThat(mCachedDevice.isConnectedHearingAidDevice()).isFalse();
+ }
+
+ @Test
+ public void isConnectedHfpDevice_profileIsNull_returnFalse() {
+ when(mProfileManager.getHeadsetProfile()).thenReturn(null);
+
+ assertThat(mCachedDevice.isHfpDevice()).isFalse();
+ }
+
+ @Test
+ public void isConnectedA2dpDevice_profileIsNull_returnFalse() {
+ when(mProfileManager.getA2dpProfile()).thenReturn(null);
+
+ assertThat(mCachedDevice.isA2dpDevice()).isFalse();
+ }
+
+ @Test
+ public void isConnectedHearingAidDevice_profileIsNull_returnFalse() {
+ when(mProfileManager.getHearingAidProfile()).thenReturn(null);
+
+ assertThat(mCachedDevice.isConnectedHearingAidDevice()).isFalse();
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/AbstractPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/AbstractPreferenceControllerTest.java
index 393fd029e6da..5261ea0c88bb 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/AbstractPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/AbstractPreferenceControllerTest.java
@@ -19,8 +19,8 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import org.junit.Before;
import org.junit.Test;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixinTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixinTest.java
index 8b31450f8a3f..f34c33844d11 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixinTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/VisibilityLoggerMixinTest.java
@@ -30,7 +30,7 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v4.app.FragmentActivity;
+import androidx.fragment.app.FragmentActivity;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java
index 2b2bf5b6cc8b..28828a00cce6 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/lifecycle/LifecycleTest.java
@@ -15,14 +15,15 @@
*/
package com.android.settingslib.core.lifecycle;
-import static android.arch.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
import static com.google.common.truth.Truth.assertThat;
-import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
+import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.widget.LinearLayout;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.events.OnAttach;
@@ -34,13 +35,15 @@ import com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
+import com.android.settingslib.testutils.FragmentTestUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.android.controller.ActivityController;
-import org.robolectric.android.controller.FragmentController;
+
+import androidx.lifecycle.LifecycleOwner;
@RunWith(SettingsLibRobolectricTestRunner.class)
public class LifecycleTest {
@@ -64,7 +67,7 @@ public class LifecycleTest {
public TestFragment() {
mFragObserver = new TestObserver();
- getLifecycle().addObserver(mFragObserver);
+ getSettingsLifecycle().addObserver(mFragObserver);
}
}
@@ -74,9 +77,17 @@ public class LifecycleTest {
public TestActivity() {
mActObserver = new TestObserver();
- getLifecycle().addObserver(mActObserver);
+ getSettingsLifecycle().addObserver(mActObserver);
}
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ LinearLayout view = new LinearLayout(this);
+ view.setId(1);
+
+ setContentView(view);
+ }
}
public static class TestObserver implements LifecycleObserver, OnAttach, OnStart, OnResume,
@@ -151,11 +162,9 @@ public class LifecycleTest {
@Test
public void runThroughActivityLifecycles_shouldObserveEverything() {
ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
- TestActivity activity = ac.get();
+ TestActivity activity = ac.setup().get();
- ac.start();
assertThat(activity.mActObserver.mOnStartObserved).isTrue();
- ac.resume();
assertThat(activity.mActObserver.mOnResumeObserved).isTrue();
activity.onCreateOptionsMenu(null);
assertThat(activity.mActObserver.mOnCreateOptionsMenuObserved).isTrue();
@@ -173,50 +182,50 @@ public class LifecycleTest {
@Test
public void runThroughDialogFragmentLifecycles_shouldObserveEverything() {
- FragmentController<TestDialogFragment> fragmentController =
- Robolectric.buildFragment(TestDialogFragment.class);
- TestDialogFragment fragment = fragmentController.get();
+ final TestDialogFragment fragment = new TestDialogFragment();
+ FragmentTestUtils.startFragment(fragment);
- fragmentController.create().start().resume();
fragment.onCreateOptionsMenu(null, null);
fragment.onPrepareOptionsMenu(null);
fragment.onOptionsItemSelected(null);
- fragmentController.pause().stop().destroy();
+ assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
+ assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
+ assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue();
assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue();
assertThat(fragment.mFragObserver.mOnStartObserved).isTrue();
assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue();
+ fragment.onPause();
assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue();
+ fragment.onStop();
assertThat(fragment.mFragObserver.mOnStopObserved).isTrue();
+ fragment.onDestroy();
assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue();
- assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
- assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
- assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
}
@Test
public void runThroughFragmentLifecycles_shouldObserveEverything() {
- FragmentController<TestFragment> fragmentController =
- Robolectric.buildFragment(TestFragment.class);
- TestFragment fragment = fragmentController.get();
+ final TestFragment fragment = new TestFragment();
+ FragmentTestUtils.startFragment(fragment);
- fragmentController.create().start().resume();
fragment.onCreateOptionsMenu(null, null);
fragment.onPrepareOptionsMenu(null);
fragment.onOptionsItemSelected(null);
- fragmentController.pause().stop().destroy();
+ assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
+ assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
+ assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
assertThat(fragment.mFragObserver.mOnAttachObserved).isTrue();
assertThat(fragment.mFragObserver.mOnAttachHasContext).isTrue();
assertThat(fragment.mFragObserver.mOnStartObserved).isTrue();
assertThat(fragment.mFragObserver.mOnResumeObserved).isTrue();
+ fragment.onPause();
assertThat(fragment.mFragObserver.mOnPauseObserved).isTrue();
+ fragment.onStop();
assertThat(fragment.mFragObserver.mOnStopObserved).isTrue();
+ fragment.onDestroy();
assertThat(fragment.mFragObserver.mOnDestroyObserved).isTrue();
- assertThat(fragment.mFragObserver.mOnCreateOptionsMenuObserved).isTrue();
- assertThat(fragment.mFragObserver.mOnPrepareOptionsMenuObserved).isTrue();
- assertThat(fragment.mFragObserver.mOnOptionsItemSelectedObserved).isTrue();
}
@Test
@@ -237,17 +246,16 @@ public class LifecycleTest {
@Test
public void onOptionItemSelectedShortCircuitsIfAnObserverHandlesTheMenuItem() {
- FragmentController<TestFragment> fragmentController =
- Robolectric.buildFragment(TestFragment.class);
- TestFragment fragment = fragmentController.get();
- OptionItemAccepter accepter = new OptionItemAccepter();
+ final TestFragment fragment = new TestFragment();
+ FragmentTestUtils.startFragment(fragment);
+
+ final OptionItemAccepter accepter = new OptionItemAccepter();
fragment.getLifecycle().addObserver(accepter);
- fragmentController.create().start().resume();
+
fragment.onCreateOptionsMenu(null, null);
fragment.onPrepareOptionsMenu(null);
fragment.onOptionsItemSelected(null);
- fragmentController.pause().stop().destroy();
assertThat(accepter.wasCalled).isFalse();
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DeveloperOptionsPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DeveloperOptionsPreferenceControllerTest.java
index 7820fd2fe340..9dd93b3af390 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DeveloperOptionsPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DeveloperOptionsPreferenceControllerTest.java
@@ -19,8 +19,8 @@ package com.android.settingslib.development;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
index ccaf3fcbef17..a15f5fce558e 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/DevelopmentSettingsEnablerTest.java
@@ -73,22 +73,11 @@ public class DevelopmentSettingsEnablerTest {
}
@Test
- public void isEnabled_settingsOn_noRestriction_notAdmin_notDemo_shouldReturnFalse() {
+ public void isEnabled_settingsOn_noRestriction_notAdmin_shouldReturnFalse() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
ShadowUserManager.getShadow().setIsAdminUser(false);
- ShadowUserManager.getShadow().setIsDemoUser(false);
assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isFalse();
}
-
- @Test
- public void isEnabled_settingsOn_noRestriction_notAdmin_isDemo_shouldReturnTrue() {
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
- ShadowUserManager.getShadow().setIsAdminUser(false);
- ShadowUserManager.getShadow().setIsDemoUser(true);
-
- assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isTrue();
- }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java
index 475e7d8c2209..7c653351974a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java
@@ -26,9 +26,9 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserManager;
import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogdSizePreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogdSizePreferenceControllerTest.java
index 72c8d1ad3642..ae3072ca86b8 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogdSizePreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogdSizePreferenceControllerTest.java
@@ -40,8 +40,8 @@ import static org.mockito.Mockito.verify;
import android.content.Context;
import android.os.SystemProperties;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.R;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogpersistPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogpersistPreferenceControllerTest.java
index 4b9bfc3f37ca..b0aaa256fdab 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogpersistPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/LogpersistPreferenceControllerTest.java
@@ -21,11 +21,11 @@ import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
-import android.arch.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleOwner;
import android.os.SystemProperties;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.Lifecycle;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/BluetoothAddressPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/BluetoothAddressPreferenceControllerTest.java
index 0385f4bd29af..8ec7149ce1a8 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/BluetoothAddressPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/BluetoothAddressPreferenceControllerTest.java
@@ -22,8 +22,8 @@ import static org.mockito.Mockito.doReturn;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.Lifecycle;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/ImsStatusPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/ImsStatusPreferenceControllerTest.java
index d600c2093c77..cb7861b30562 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/ImsStatusPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/ImsStatusPreferenceControllerTest.java
@@ -23,8 +23,8 @@ import static org.mockito.Mockito.mock;
import android.content.Context;
import android.os.PersistableBundle;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/IpAddressPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/IpAddressPreferenceControllerTest.java
index 99e582cae60a..8f144cdf3a15 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/IpAddressPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/IpAddressPreferenceControllerTest.java
@@ -23,8 +23,8 @@ import static org.mockito.Mockito.doReturn;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.Lifecycle;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/SerialNumberPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/SerialNumberPreferenceControllerTest.java
index a4fa7aa29bef..69fb86e88d5b 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/SerialNumberPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/SerialNumberPreferenceControllerTest.java
@@ -20,8 +20,8 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/UptimePreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/UptimePreferenceControllerTest.java
index 39e05faddc1a..ba955f9f2275 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/UptimePreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/UptimePreferenceControllerTest.java
@@ -23,8 +23,8 @@ import static org.mockito.Mockito.verify;
import android.content.Context;
import android.os.SystemClock;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.text.format.DateUtils;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/WifiMacAddressPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/WifiMacAddressPreferenceControllerTest.java
index b7bc661116e9..757df5b12518 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/WifiMacAddressPreferenceControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/deviceinfo/WifiMacAddressPreferenceControllerTest.java
@@ -16,11 +16,10 @@
package com.android.settingslib.deviceinfo;
+import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.spy;
import android.annotation.SuppressLint;
import android.content.Context;
@@ -28,8 +27,8 @@ import android.net.ConnectivityManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settingslib.R;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
@@ -40,6 +39,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import java.util.Arrays;
import java.util.List;
@@ -48,12 +48,16 @@ import java.util.List;
@RunWith(SettingsLibRobolectricTestRunner.class)
public class WifiMacAddressPreferenceControllerTest {
@Mock
- private Context mContext;
- @Mock
private Lifecycle mLifecycle;
@Mock
private PreferenceScreen mScreen;
@Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private WifiInfo mWifiInfo;
+
+ private AbstractWifiMacAddressPreferenceController mController;
+ private Context mContext;
private Preference mPreference;
private static final String TEST_MAC_ADDRESS = "00:11:22:33:44:55";
@@ -61,14 +65,20 @@ public class WifiMacAddressPreferenceControllerTest {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+
+ mContext = spy(RuntimeEnvironment.application);
+ mPreference = new Preference(mContext);
+
doReturn(mPreference).when(mScreen)
.findPreference(AbstractWifiMacAddressPreferenceController.KEY_WIFI_MAC_ADDRESS);
+ doReturn(mWifiManager).when(mContext).getSystemService(WifiManager.class);
+ doReturn(mWifiInfo).when(mWifiManager).getConnectionInfo();
+
+ mController = new ConcreteWifiMacAddressPreferenceController(mContext, mLifecycle);
}
@Test
public void testHasIntentFilters() {
- final AbstractWifiMacAddressPreferenceController wifiMacAddressPreferenceController =
- new ConcreteWifiMacAddressPreferenceController(mContext, mLifecycle);
final List<String> expectedIntents = Arrays.asList(
ConnectivityManager.CONNECTIVITY_ACTION,
WifiManager.LINK_CONFIGURATION_CHANGED_ACTION,
@@ -76,37 +86,110 @@ public class WifiMacAddressPreferenceControllerTest {
assertWithMessage("Intent filter should contain expected intents")
- .that(wifiMacAddressPreferenceController.getConnectivityIntents())
+ .that(mController.getConnectivityIntents())
.asList().containsAllIn(expectedIntents);
}
@Test
- public void testWifiMacAddress() {
- final WifiManager wifiManager = mock(WifiManager.class);
- final WifiInfo wifiInfo = mock(WifiInfo.class);
+ public void updateConnectivity_nullWifiInfoWithMacRandomizationOff_setMacUnavailable() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
+ AbstractWifiMacAddressPreferenceController.OFF);
+ doReturn(null).when(mWifiManager).getConnectionInfo();
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.status_unavailable));
+ }
+
+ @Test
+ public void updateConnectivity_nullMacWithMacRandomizationOff_setMacUnavailable() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
+ AbstractWifiMacAddressPreferenceController.OFF);
+ doReturn(null).when(mWifiInfo).getMacAddress();
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.status_unavailable));
+ }
+
+ @Test
+ public void updateConnectivity_defaultMacWithMacRandomizationOff_setMacUnavailable() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
+ AbstractWifiMacAddressPreferenceController.OFF);
+ doReturn(WifiInfo.DEFAULT_MAC_ADDRESS).when(mWifiInfo).getMacAddress();
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.status_unavailable));
+ }
+
+ @Test
+ public void updateConnectivity_validMacWithMacRandomizationOff_setValidMac() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
+ AbstractWifiMacAddressPreferenceController.OFF);
+ doReturn(TEST_MAC_ADDRESS).when(mWifiInfo).getMacAddress();
+
+ mController.displayPreference(mScreen);
- doReturn(null).when(wifiManager).getConnectionInfo();
- doReturn(wifiManager).when(mContext).getSystemService(WifiManager.class);
+ assertThat(mPreference.getSummary()).isEqualTo(TEST_MAC_ADDRESS);
+ }
- final AbstractWifiMacAddressPreferenceController wifiMacAddressPreferenceController =
- new ConcreteWifiMacAddressPreferenceController(mContext, mLifecycle);
+ @Test
+ public void updateConnectivity_nullWifiInfoWithMacRandomizationOn_setMacUnavailable() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
+ AbstractWifiMacAddressPreferenceController.ON);
+ doReturn(null).when(mWifiManager).getConnectionInfo();
- wifiMacAddressPreferenceController.displayPreference(mScreen);
- verify(mPreference).setSummary(R.string.status_unavailable);
+ mController.displayPreference(mScreen);
- doReturn(wifiInfo).when(wifiManager).getConnectionInfo();
- doReturn(TEST_MAC_ADDRESS).when(wifiInfo).getMacAddress();
- wifiMacAddressPreferenceController.displayPreference(mScreen);
- verify(mPreference).setSummary(TEST_MAC_ADDRESS);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.status_unavailable));
+ }
+ @Test
+ public void updateConnectivity_nullMacWithMacRandomizationOn_setMacUnavailable() {
Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 1);
- wifiMacAddressPreferenceController.displayPreference(mScreen);
- verify(mPreference, times(2)).setSummary(TEST_MAC_ADDRESS);
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
+ AbstractWifiMacAddressPreferenceController.ON);
+ doReturn(null).when(mWifiInfo).getMacAddress();
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.status_unavailable));
+ }
+
+ @Test
+ public void updateConnectivity_defaultMacWithMacRandomizationOn_setMacRandomized() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
+ AbstractWifiMacAddressPreferenceController.ON);
+ doReturn(WifiInfo.DEFAULT_MAC_ADDRESS).when(mWifiInfo).getMacAddress();
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.wifi_status_mac_randomized));
+ }
+
+ @Test
+ public void updateConnectivity_validMacWithMacRandomizationOn_setValidMac() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED,
+ AbstractWifiMacAddressPreferenceController.ON);
+ doReturn(TEST_MAC_ADDRESS).when(mWifiInfo).getMacAddress();
+
+ mController.displayPreference(mScreen);
- doReturn(WifiInfo.DEFAULT_MAC_ADDRESS).when(wifiInfo).getMacAddress();
- wifiMacAddressPreferenceController.displayPreference(mScreen);
- verify(mPreference).setSummary(R.string.wifi_status_mac_randomized);
+ assertThat(mPreference.getSummary()).isEqualTo(TEST_MAC_ADDRESS);
}
private static class ConcreteWifiMacAddressPreferenceController
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java
new file mode 100644
index 000000000000..996a1223589c
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java
@@ -0,0 +1,48 @@
+package com.android.settingslib.drawer;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE;
+import static com.android.settingslib.drawer.TileUtils.PROFILE_ALL;
+import static com.android.settingslib.drawer.TileUtils.PROFILE_PRIMARY;
+
+import android.os.Bundle;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.junit.Test;
+
+@RunWith(RobolectricTestRunner.class)
+public class TileTest {
+
+ private Tile mTile;
+
+ @Before
+ public void setUp() {
+ mTile = new Tile();
+ mTile.metaData = new Bundle();
+ }
+
+ @Test
+ public void isPrimaryProfileOnly_profilePrimary_shouldReturnTrue() {
+ mTile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY);
+ assertThat(mTile.isPrimaryProfileOnly()).isTrue();
+ }
+
+ @Test
+ public void isPrimaryProfileOnly_profileAll_shouldReturnFalse() {
+ mTile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL);
+ assertThat(mTile.isPrimaryProfileOnly()).isFalse();
+ }
+
+ @Test
+ public void isPrimaryProfileOnly_noExplicitValue_shouldReturnFalse() {
+ assertThat(mTile.isPrimaryProfileOnly()).isFalse();
+ }
+
+ @Test
+ public void isPrimaryProfileOnly_nullMetadata_shouldReturnFalse() {
+ mTile.metaData = null;
+ assertThat(mTile.isPrimaryProfileOnly()).isFalse();
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
index fc1b22385b49..6e66805795b0 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
@@ -28,7 +28,6 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.RuntimeEnvironment.application;
-import static org.robolectric.shadow.api.Shadow.extract;
import android.app.ActivityManager;
import android.content.ContentResolver;
@@ -52,9 +51,6 @@ import android.util.ArrayMap;
import android.util.Pair;
import android.widget.RemoteViews;
-import com.android.settingslib.R;
-import com.android.settingslib.suggestions.SuggestionParser;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -67,7 +63,6 @@ import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -164,35 +159,6 @@ public class TileUtilsTest {
}
@Test
- public void getTilesForIntent_shouldSkipFilteredApps() {
- Intent intent = new Intent();
- Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
- List<Tile> outTiles = new ArrayList<>();
- List<ResolveInfo> info = new ArrayList<>();
- ResolveInfo resolveInfo = newInfo(true, null /* category */, null, URI_GET_ICON,
- URI_GET_SUMMARY);
- addMetadataToInfo(resolveInfo, "com.android.settings.require_account", "com.google");
- addMetadataToInfo(resolveInfo, "com.android.settings.require_connection", "true");
- info.add(resolveInfo);
-
- when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
- .thenReturn(info);
-
- TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
- null /* defaultCategory */, outTiles, false /* usePriority */,
- false /* checkCategory */, true /* forceTintExternalIcon */);
-
- assertThat(outTiles.size()).isEqualTo(1);
- SuggestionParser parser = new SuggestionParser(
- mContext,
- null,
- Collections.emptyList(),
- "0,10");
- parser.filterSuggestions(outTiles, 0, false);
- assertThat(outTiles.size()).isEqualTo(0);
- }
-
- @Test
public void getCategories_shouldHandleExtraIntentAction() {
final String testCategory = "category1";
final String testAction = "action1";
@@ -392,108 +358,6 @@ public class TileUtilsTest {
assertThat(outTiles.size()).isEqualTo(1);
}
- @Test
- public void getTilesForIntent_shouldShowRemoteViewIfSpecified() {
- Intent intent = new Intent();
- Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
- List<Tile> outTiles = new ArrayList<>();
- List<ResolveInfo> info = new ArrayList<>();
- ResolveInfo resolveInfo = newInfo(true, null /* category */);
- resolveInfo.activityInfo.metaData.putInt("com.android.settings.custom_view",
- R.layout.user_preference);
- info.add(resolveInfo);
-
- when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
- .thenReturn(info);
-
- TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
- null /* defaultCategory */, outTiles, false /* usePriority */,
- false /* checkCategory */, true /* forceTintExternalIcon */);
-
- assertThat(outTiles.size()).isEqualTo(1);
- Tile tile = outTiles.get(0);
- assertThat(tile.remoteViews).isNotNull();
- assertThat(tile.remoteViews.getLayoutId()).isEqualTo(R.layout.user_preference);
- }
-
- @Test
- public void getTilesForIntent_summaryUriSpecified_shouldOverrideRemoteViewSummary()
- throws RemoteException {
- Intent intent = new Intent();
- Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
- List<Tile> outTiles = new ArrayList<>();
- List<ResolveInfo> info = new ArrayList<>();
- ResolveInfo resolveInfo = newInfo(true, null /* category */, null,
- null, URI_GET_SUMMARY);
- resolveInfo.activityInfo.metaData.putInt("com.android.settings.custom_view",
- R.layout.user_preference);
- info.add(resolveInfo);
-
- when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
- .thenReturn(info);
-
- // Mock the content provider interaction.
- Bundle bundle = new Bundle();
- bundle.putString(TileUtils.META_DATA_PREFERENCE_SUMMARY, "new summary text");
- when(mIContentProvider.call(anyString(),
- eq(TileUtils.getMethodFromUri(Uri.parse(URI_GET_SUMMARY))), eq(URI_GET_SUMMARY),
- any())).thenReturn(bundle);
- when(mContentResolver.acquireUnstableProvider(anyString()))
- .thenReturn(mIContentProvider);
- when(mContentResolver.acquireUnstableProvider(any(Uri.class)))
- .thenReturn(mIContentProvider);
-
- TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
- null /* defaultCategory */, outTiles, false /* usePriority */,
- false /* checkCategory */, true /* forceTintExternalIcon */);
-
- assertThat(outTiles.size()).isEqualTo(1);
- Tile tile = outTiles.get(0);
- assertThat(tile.remoteViews).isNotNull();
- assertThat(tile.remoteViews.getLayoutId()).isEqualTo(R.layout.user_preference);
- // Make sure the summary TextView got a new text string.
- TileUtilsShadowRemoteViews shadowRemoteViews = extract(tile.remoteViews);
- assertThat(shadowRemoteViews.overrideViewId).isEqualTo(android.R.id.summary);
- assertThat(shadowRemoteViews.overrideText).isEqualTo("new summary text");
- }
-
- @Test
- public void getTilesForIntent_providerUnavailable_shouldNotOverrideRemoteViewSummary()
- throws RemoteException {
- Intent intent = new Intent();
- Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
- List<Tile> outTiles = new ArrayList<>();
- List<ResolveInfo> info = new ArrayList<>();
- ResolveInfo resolveInfo = newInfo(true, null /* category */, null,
- null, URI_GET_SUMMARY);
- resolveInfo.activityInfo.metaData.putInt("com.android.settings.custom_view",
- R.layout.user_preference);
- info.add(resolveInfo);
-
- when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
- .thenReturn(info);
-
- // Mock the content provider interaction.
- Bundle bundle = new Bundle();
- bundle.putString(TileUtils.META_DATA_PREFERENCE_SUMMARY, "new summary text");
- when(mIContentProvider.call(anyString(),
- eq(TileUtils.getMethodFromUri(Uri.parse(URI_GET_SUMMARY))), eq(URI_GET_SUMMARY),
- any())).thenReturn(bundle);
-
- TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
- null /* defaultCategory */, outTiles, false /* usePriority */,
- false /* checkCategory */, true /* forceTintExternalIcon */);
-
- assertThat(outTiles.size()).isEqualTo(1);
- Tile tile = outTiles.get(0);
- assertThat(tile.remoteViews).isNotNull();
- assertThat(tile.remoteViews.getLayoutId()).isEqualTo(R.layout.user_preference);
- // Make sure the summary TextView didn't get any text view updates.
- TileUtilsShadowRemoteViews shadowRemoteViews = extract(tile.remoteViews);
- assertThat(shadowRemoteViews.overrideViewId).isNull();
- assertThat(shadowRemoteViews.overrideText).isNull();
- }
-
public static ResolveInfo newInfo(boolean systemApp, String category) {
return newInfo(systemApp, category, null);
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
index 5c932586dd28..8bc677c53688 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
@@ -72,7 +72,7 @@ public class PowerWhitelistBackendTest {
doNothing().when(mDeviceIdleService).removePowerSaveWhitelistApp(anyString());
mPackageManager = Shadow.extract(mContext.getPackageManager());
mPackageManager.setSystemFeature(PackageManager.FEATURE_TELEPHONY, true);
-
+ doReturn(mDevicePolicyManager).when(mContext).getSystemService(DevicePolicyManager.class);
mPowerWhitelistBackend = new PowerWhitelistBackend(mContext, mDeviceIdleService);
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilCompatTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilCompatTest.java
new file mode 100644
index 000000000000..ddadac105c18
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilCompatTest.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.inputmethod;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+
+@RunWith(RobolectricTestRunner.class)
+public class InputMethodAndSubtypeUtilCompatTest {
+
+ private static final HashSet<String> EMPTY_STRING_SET = new HashSet<>();
+
+ private static HashSet<String> asHashSet(String... strings) {
+ HashSet<String> hashSet = new HashSet<>();
+ for (String s : strings) {
+ hashSet.add(s);
+ }
+ return hashSet;
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_EmptyString() {
+ assertThat(InputMethodAndSubtypeUtilCompat.
+ parseInputMethodsAndSubtypesString("")).isEmpty();
+ assertThat(InputMethodAndSubtypeUtilCompat.
+ parseInputMethodsAndSubtypesString(null)).isEmpty();
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_SingleImeNoSubtype() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString("ime0");
+ assertThat(r).containsExactly("ime0", EMPTY_STRING_SET);
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_MultipleImesNoSubtype() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString("ime0:ime1");
+ assertThat(r).containsExactly("ime0", EMPTY_STRING_SET, "ime1", EMPTY_STRING_SET);
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_SingleImeSingleSubtype() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString("ime0;subtype0");
+ assertThat(r).containsExactly("ime0", asHashSet("subtype0"));
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_SingleImeDuplicateSameSubtypes() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype0");
+ assertThat(r).containsExactly("ime0", asHashSet("subtype0"));
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_SingleImeMultipleSubtypes() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype1");
+ assertThat(r).containsExactly("ime0", asHashSet("subtype0", "subtype1"));
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_MultiplePairsOfImeSubtype() {
+ assertThat(InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0:ime1;subtype1"))
+ .containsExactly("ime0", asHashSet("subtype0"), "ime1", asHashSet("subtype1"));
+ assertThat(InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype1:ime1;subtype2"))
+ .containsExactly("ime0", asHashSet("subtype0", "subtype1"),
+ "ime1", asHashSet("subtype2"));
+ assertThat(InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype1:ime1;subtype1;subtype2"))
+ .containsExactly("ime0", asHashSet("subtype0", "subtype1"),
+ "ime1", asHashSet("subtype1", "subtype2"));
+
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_MixedImeSubtypePairsAndImeNoSubtype() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtilCompat.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype1:ime1;subtype1;subtype2:ime2");
+ assertThat(r).containsExactly("ime0", asHashSet("subtype0", "subtype1"),
+ "ime1", asHashSet("subtype1", "subtype2"),
+ "ime2", EMPTY_STRING_SET);
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_EmptyInput() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ assertThat(map).isEmpty();
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_SingleIme() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", new HashSet<>());
+ String result = InputMethodAndSubtypeUtilCompat.buildInputMethodsAndSubtypesString(map);
+ assertThat(result).isEqualTo("ime0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_SingleImeSingleSubtype() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", asHashSet("subtype0"));
+ String result = InputMethodAndSubtypeUtilCompat.buildInputMethodsAndSubtypesString(map);
+ assertThat(result).isEqualTo("ime0;subtype0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_SingleImeMultipleSubtypes() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", asHashSet("subtype0", "subtype1"));
+ String result = InputMethodAndSubtypeUtilCompat.buildInputMethodsAndSubtypesString(map);
+
+ // We do not expect what order will be used to concatenate items in
+ // InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString() hence accept all possible
+ // permutations here.
+ assertThat(result).matches("ime0;subtype0;subtype1|ime0;subtype1;subtype0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_MultipleImesNoSubtypes() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", EMPTY_STRING_SET);
+ map.put("ime1", EMPTY_STRING_SET);
+ String result = InputMethodAndSubtypeUtilCompat.buildInputMethodsAndSubtypesString(map);
+
+ // We do not expect what order will be used to concatenate items in
+ // InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString() hence accept all possible
+ // permutations here.
+ assertThat(result).matches("ime0:ime1|ime1:ime0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_MultipleImesWithAndWithoutSubtypes() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", asHashSet("subtype0", "subtype1"));
+ map.put("ime1", EMPTY_STRING_SET);
+ String result = InputMethodAndSubtypeUtilCompat.buildInputMethodsAndSubtypesString(map);
+
+ // We do not expect what order will be used to concatenate items in
+ // InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString() hence accept all possible
+ // permutations here.
+ assertThat(result).matches("ime0;subtype0;subtype1:ime1|ime0;subtype1;subtype0:ime1"
+ + "|ime1:ime0;subtype0;subtype1|ime1:ime0;subtype1;subtype0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_MultipleImesWithSubtypes() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", asHashSet("subtype0", "subtype1"));
+ map.put("ime1", asHashSet("subtype2", "subtype3"));
+ String result = InputMethodAndSubtypeUtilCompat.buildInputMethodsAndSubtypesString(map);
+
+ // We do not expect what order will be used to concatenate items in
+ // InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString() hence accept all possible
+ // permutations here.
+ assertThat(result).matches("ime0;subtype0;subtype1:ime1;subtype2;subtype3"
+ + "|ime0;subtype1;subtype0:ime1;subtype2;subtype3"
+ + "|ime0;subtype0;subtype1:ime1;subtype3;subtype2"
+ + "|ime0;subtype1;subtype0:ime1;subtype3;subtype2"
+ + "|ime1;subtype2;subtype3:ime0;subtype0;subtype1"
+ + "|ime2;subtype3;subtype2:ime0;subtype0;subtype1"
+ + "|ime3;subtype2;subtype3:ime0;subtype1;subtype0"
+ + "|ime4;subtype3;subtype2:ime0;subtype1;subtype0");
+ }
+
+ @Test
+ public void isValidSystemNonAuxAsciiCapableIme() {
+ // System IME w/ no subtype
+ assertThat(InputMethodAndSubtypeUtilCompat.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false)))
+ .isFalse();
+
+ // System IME w/ non-Aux and non-ASCII-capable "keyboard" subtype
+ assertThat(InputMethodAndSubtypeUtilCompat.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false, createDummySubtype("keyboard", false, false))))
+ .isFalse();
+
+ // System IME w/ non-Aux and ASCII-capable "keyboard" subtype
+ assertThat(InputMethodAndSubtypeUtilCompat.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false, createDummySubtype("keyboard", false, true))))
+ .isTrue();
+
+ // System IME w/ Aux and ASCII-capable "keyboard" subtype
+ assertThat(InputMethodAndSubtypeUtilCompat.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, true, createDummySubtype("keyboard", true, true))))
+ .isFalse();
+
+ // System IME w/ non-Aux and ASCII-capable "voice" subtype
+ assertThat(InputMethodAndSubtypeUtilCompat.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false, createDummySubtype("voice", false, true))))
+ .isFalse();
+
+ // System IME w/ non-Aux and non-ASCII-capable subtype + Non-Aux and ASCII-capable subtype
+ assertThat(InputMethodAndSubtypeUtilCompat.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false,
+ createDummySubtype("keyboard", false, true),
+ createDummySubtype("keyboard", false, false))))
+ .isTrue();
+
+ // Non-system IME w/ non-Aux and ASCII-capable "keyboard" subtype
+ assertThat(InputMethodAndSubtypeUtilCompat.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(false, false, createDummySubtype("keyboard", false, true))))
+ .isFalse();
+ }
+
+ private static InputMethodInfo createDummyIme(boolean isSystem, boolean isAuxIme,
+ InputMethodSubtype... subtypes) {
+ final ResolveInfo ri = new ResolveInfo();
+ final ServiceInfo si = new ServiceInfo();
+ final ApplicationInfo ai = new ApplicationInfo();
+ ai.packageName = "com.example.android.dummyime";
+ ai.enabled = true;
+ ai.flags |= (isSystem ? ApplicationInfo.FLAG_SYSTEM : 0);
+ si.applicationInfo = ai;
+ si.enabled = true;
+ si.packageName = "com.example.android.dummyime";
+ si.name = "Dummy IME";
+ si.exported = true;
+ si.nonLocalizedLabel = "Dummy IME";
+ ri.serviceInfo = si;
+ return new InputMethodInfo(ri, isAuxIme, "", Arrays.asList(subtypes), 1, false);
+ }
+
+ private static InputMethodSubtype createDummySubtype(
+ String mode, boolean isAuxiliary, boolean isAsciiCapable) {
+ return new InputMethodSubtypeBuilder()
+ .setSubtypeNameResId(0)
+ .setSubtypeIconResId(0)
+ .setSubtypeLocale("en_US")
+ .setLanguageTag("en-US")
+ .setSubtypeMode(mode)
+ .setIsAuxiliary(isAuxiliary)
+ .setIsAsciiCapable(isAsciiCapable)
+ .build();
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java
new file mode 100644
index 000000000000..d0a0686782ab
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/inputmethod/InputMethodAndSubtypeUtilTest.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.inputmethod;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+
+@RunWith(RobolectricTestRunner.class)
+public class InputMethodAndSubtypeUtilTest {
+
+ private static final HashSet<String> EMPTY_STRING_SET = new HashSet<>();
+
+ private static HashSet<String> asHashSet(String... strings) {
+ HashSet<String> hashSet = new HashSet<>();
+ for (String s : strings) {
+ hashSet.add(s);
+ }
+ return hashSet;
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_EmptyString() {
+ assertThat(InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString("")).isEmpty();
+ assertThat(InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(null)).isEmpty();
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_SingleImeNoSubtype() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString("ime0");
+ assertThat(r).containsExactly("ime0", EMPTY_STRING_SET);
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_MultipleImesNoSubtype() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString("ime0:ime1");
+ assertThat(r).containsExactly("ime0", EMPTY_STRING_SET, "ime1", EMPTY_STRING_SET);
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_SingleImeSingleSubtype() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString("ime0;subtype0");
+ assertThat(r).containsExactly("ime0", asHashSet("subtype0"));
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_SingleImeDuplicateSameSubtypes() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype0");
+ assertThat(r).containsExactly("ime0", asHashSet("subtype0"));
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_SingleImeMultipleSubtypes() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype1");
+ assertThat(r).containsExactly("ime0", asHashSet("subtype0", "subtype1"));
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_MultiplePairsOfImeSubtype() {
+ assertThat(InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0:ime1;subtype1"))
+ .containsExactly("ime0", asHashSet("subtype0"), "ime1", asHashSet("subtype1"));
+ assertThat(InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype1:ime1;subtype2"))
+ .containsExactly("ime0", asHashSet("subtype0", "subtype1"),
+ "ime1", asHashSet("subtype2"));
+ assertThat(InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype1:ime1;subtype1;subtype2"))
+ .containsExactly("ime0", asHashSet("subtype0", "subtype1"),
+ "ime1", asHashSet("subtype1", "subtype2"));
+
+ }
+
+ @Test
+ public void parseInputMethodsAndSubtypesString_MixedImeSubtypePairsAndImeNoSubtype() {
+ HashMap<String, HashSet<String>> r =
+ InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(
+ "ime0;subtype0;subtype1:ime1;subtype1;subtype2:ime2");
+ assertThat(r).containsExactly("ime0", asHashSet("subtype0", "subtype1"),
+ "ime1", asHashSet("subtype1", "subtype2"),
+ "ime2", EMPTY_STRING_SET);
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_EmptyInput() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ assertThat(map).isEmpty();
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_SingleIme() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", new HashSet<>());
+ String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
+ assertThat(result).isEqualTo("ime0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_SingleImeSingleSubtype() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", asHashSet("subtype0"));
+ String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
+ assertThat(result).isEqualTo("ime0;subtype0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_SingleImeMultipleSubtypes() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", asHashSet("subtype0", "subtype1"));
+ String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
+
+ // We do not expect what order will be used to concatenate items in
+ // InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString() hence accept all possible
+ // permutations here.
+ assertThat(result).matches("ime0;subtype0;subtype1|ime0;subtype1;subtype0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_MultipleImesNoSubtypes() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", EMPTY_STRING_SET);
+ map.put("ime1", EMPTY_STRING_SET);
+ String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
+
+ // We do not expect what order will be used to concatenate items in
+ // InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString() hence accept all possible
+ // permutations here.
+ assertThat(result).matches("ime0:ime1|ime1:ime0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_MultipleImesWithAndWithoutSubtypes() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", asHashSet("subtype0", "subtype1"));
+ map.put("ime1", EMPTY_STRING_SET);
+ String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
+
+ // We do not expect what order will be used to concatenate items in
+ // InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString() hence accept all possible
+ // permutations here.
+ assertThat(result).matches("ime0;subtype0;subtype1:ime1|ime0;subtype1;subtype0:ime1"
+ + "|ime1:ime0;subtype0;subtype1|ime1:ime0;subtype1;subtype0");
+ }
+
+ @Test
+ public void buildInputMethodsAndSubtypesString_MultipleImesWithSubtypes() {
+ HashMap<String, HashSet<String>> map = new HashMap<>();
+ map.put("ime0", asHashSet("subtype0", "subtype1"));
+ map.put("ime1", asHashSet("subtype2", "subtype3"));
+ String result = InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString(map);
+
+ // We do not expect what order will be used to concatenate items in
+ // InputMethodAndSubtypeUtil.buildInputMethodsAndSubtypesString() hence accept all possible
+ // permutations here.
+ assertThat(result).matches("ime0;subtype0;subtype1:ime1;subtype2;subtype3"
+ + "|ime0;subtype1;subtype0:ime1;subtype2;subtype3"
+ + "|ime0;subtype0;subtype1:ime1;subtype3;subtype2"
+ + "|ime0;subtype1;subtype0:ime1;subtype3;subtype2"
+ + "|ime1;subtype2;subtype3:ime0;subtype0;subtype1"
+ + "|ime2;subtype3;subtype2:ime0;subtype0;subtype1"
+ + "|ime3;subtype2;subtype3:ime0;subtype1;subtype0"
+ + "|ime4;subtype3;subtype2:ime0;subtype1;subtype0");
+ }
+
+ @Test
+ public void isValidSystemNonAuxAsciiCapableIme() {
+ // System IME w/ no subtype
+ assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false)))
+ .isFalse();
+
+ // System IME w/ non-Aux and non-ASCII-capable "keyboard" subtype
+ assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false, createDummySubtype("keyboard", false, false))))
+ .isFalse();
+
+ // System IME w/ non-Aux and ASCII-capable "keyboard" subtype
+ assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false, createDummySubtype("keyboard", false, true))))
+ .isTrue();
+
+ // System IME w/ Aux and ASCII-capable "keyboard" subtype
+ assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, true, createDummySubtype("keyboard", true, true))))
+ .isFalse();
+
+ // System IME w/ non-Aux and ASCII-capable "voice" subtype
+ assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false, createDummySubtype("voice", false, true))))
+ .isFalse();
+
+ // System IME w/ non-Aux and non-ASCII-capable subtype + Non-Aux and ASCII-capable subtype
+ assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(true, false,
+ createDummySubtype("keyboard", false, true),
+ createDummySubtype("keyboard", false, false))))
+ .isTrue();
+
+ // Non-system IME w/ non-Aux and ASCII-capable "keyboard" subtype
+ assertThat(InputMethodAndSubtypeUtil.isValidSystemNonAuxAsciiCapableIme(
+ createDummyIme(false, false, createDummySubtype("keyboard", false, true))))
+ .isFalse();
+ }
+
+ private static InputMethodInfo createDummyIme(boolean isSystem, boolean isAuxIme,
+ InputMethodSubtype... subtypes) {
+ final ResolveInfo ri = new ResolveInfo();
+ final ServiceInfo si = new ServiceInfo();
+ final ApplicationInfo ai = new ApplicationInfo();
+ ai.packageName = "com.example.android.dummyime";
+ ai.enabled = true;
+ ai.flags |= (isSystem ? ApplicationInfo.FLAG_SYSTEM : 0);
+ si.applicationInfo = ai;
+ si.enabled = true;
+ si.packageName = "com.example.android.dummyime";
+ si.name = "Dummy IME";
+ si.exported = true;
+ si.nonLocalizedLabel = "Dummy IME";
+ ri.serviceInfo = si;
+ return new InputMethodInfo(ri, isAuxIme, "", Arrays.asList(subtypes), 1, false);
+ }
+
+ private static InputMethodSubtype createDummySubtype(
+ String mode, boolean isAuxiliary, boolean isAsciiCapable) {
+ return new InputMethodSubtypeBuilder()
+ .setSubtypeNameResId(0)
+ .setSubtypeIconResId(0)
+ .setSubtypeLocale("en_US")
+ .setLanguageTag("en-US")
+ .setSubtypeMode(mode)
+ .setIsAuxiliary(isAuxiliary)
+ .setIsAsciiCapable(isAsciiCapable)
+ .build();
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java
new file mode 100644
index 000000000000..f981f365ec2b
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/license/LicenseHtmlLoaderCompatTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2017 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.settingslib.license;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.io.File;
+import java.util.ArrayList;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+public class LicenseHtmlLoaderCompatTest {
+ @Mock
+ private Context mContext;
+
+ LicenseHtmlLoaderCompat newLicenseHtmlLoader(ArrayList<File> xmlFiles,
+ File cachedHtmlFile, boolean isCachedHtmlFileOutdated,
+ boolean generateHtmlFileSucceeded) {
+ LicenseHtmlLoaderCompat loader = spy(new LicenseHtmlLoaderCompat(mContext));
+ doReturn(xmlFiles).when(loader).getVaildXmlFiles();
+ doReturn(cachedHtmlFile).when(loader).getCachedHtmlFile();
+ doReturn(isCachedHtmlFileOutdated).when(loader).isCachedHtmlFileOutdated(any(), any());
+ doReturn(generateHtmlFileSucceeded).when(loader).generateHtmlFile(any(), any());
+ return loader;
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testLoadInBackground() {
+ ArrayList<File> xmlFiles = new ArrayList();
+ xmlFiles.add(new File("test.xml"));
+ File cachedHtmlFile = new File("test.html");
+
+ LicenseHtmlLoaderCompat loader = newLicenseHtmlLoader(xmlFiles, cachedHtmlFile, true, true);
+
+ assertThat(loader.loadInBackground()).isEqualTo(cachedHtmlFile);
+ verify(loader).generateHtmlFile(any(), any());
+ }
+
+ @Test
+ public void testLoadInBackgroundWithNoVaildXmlFiles() {
+ ArrayList<File> xmlFiles = new ArrayList();
+ File cachedHtmlFile = new File("test.html");
+
+ LicenseHtmlLoaderCompat loader = newLicenseHtmlLoader(xmlFiles, cachedHtmlFile, true, true);
+
+ assertThat(loader.loadInBackground()).isNull();
+ verify(loader, never()).generateHtmlFile(any(), any());
+ }
+
+ @Test
+ public void testLoadInBackgroundWithNonOutdatedCachedHtmlFile() {
+ ArrayList<File> xmlFiles = new ArrayList();
+ xmlFiles.add(new File("test.xml"));
+ File cachedHtmlFile = new File("test.html");
+
+ LicenseHtmlLoaderCompat loader = newLicenseHtmlLoader(xmlFiles, cachedHtmlFile, false,
+ true);
+
+ assertThat(loader.loadInBackground()).isEqualTo(cachedHtmlFile);
+ verify(loader, never()).generateHtmlFile(any(), any());
+ }
+
+ @Test
+ public void testLoadInBackgroundWithGenerateHtmlFileFailed() {
+ ArrayList<File> xmlFiles = new ArrayList();
+ xmlFiles.add(new File("test.xml"));
+ File cachedHtmlFile = new File("test.html");
+
+ LicenseHtmlLoaderCompat loader = newLicenseHtmlLoader(xmlFiles, cachedHtmlFile, true,
+ false);
+
+ assertThat(loader.loadInBackground()).isNull();
+ verify(loader).generateHtmlFile(any(), any());
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
new file mode 100644
index 000000000000..1be856a59fb5
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.net;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.INetworkStatsSession;
+import android.net.NetworkStatsHistory;
+import android.net.NetworkStatsHistory.Entry;
+import android.net.NetworkTemplate;
+import android.os.RemoteException;
+import android.text.format.DateUtils;
+
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+public class DataUsageControllerTest {
+
+ @Mock
+ private INetworkStatsSession mSession;
+
+ private Context mContext;
+ private DataUsageController mController;
+ private NetworkStatsHistory mNetworkStatsHistory;
+
+ @Before
+ public void setUp() throws RemoteException {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mController = spy(new DataUsageController(mContext));
+ mNetworkStatsHistory = spy(
+ new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */));
+ doReturn(mNetworkStatsHistory)
+ .when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt());
+ }
+
+ @Test
+ public void getHistoriclUsageLevel_noNetworkSession_shouldReturn0() {
+ doReturn(null).when(mController).getSession();
+
+ assertThat(mController.getHistoriclUsageLevel(null /* template */)).isEqualTo(0L);
+
+ }
+
+ @Test
+ public void getHistoriclUsageLevel_noUsageData_shouldReturn0() {
+ doReturn(mSession).when(mController).getSession();
+
+ assertThat(mController.getHistoriclUsageLevel(NetworkTemplate.buildTemplateWifiWildcard()))
+ .isEqualTo(0L);
+
+ }
+
+ @Test
+ public void getHistoriclUsageLevel_hasUsageData_shouldReturnTotalUsage() {
+ doReturn(mSession).when(mController).getSession();
+ final long receivedBytes = 743823454L;
+ final long transmittedBytes = 16574289L;
+ final Entry entry = new Entry();
+ entry.bucketStart = 1521583200000L;
+ entry.rxBytes = receivedBytes;
+ entry.txBytes = transmittedBytes;
+ when(mNetworkStatsHistory.getValues(eq(0L), anyLong(), anyLong(), nullable(Entry.class)))
+ .thenReturn(entry);
+
+ assertThat(mController.getHistoriclUsageLevel(NetworkTemplate.buildTemplateWifiWildcard()))
+ .isEqualTo(receivedBytes + transmittedBytes);
+
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinCompatTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinCompatTest.java
new file mode 100644
index 000000000000..1ee3afa9c1ce
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinCompatTest.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.suggestions;
+
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.loader.app.LoaderManager;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+@Config(shadows = ShadowSuggestionController.class)
+public class SuggestionControllerMixinCompatTest {
+
+ @Mock
+ private SuggestionControllerMixinCompat.SuggestionControllerHost mHost;
+
+ private Context mContext;
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
+ private SuggestionControllerMixinCompat mMixin;
+ private ComponentName mComponentName;
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ mComponentName = new ComponentName(
+ "com.android.settings.intelligence",
+ "com.android.settings.intelligence.suggestions.SuggestionService");
+ }
+
+ @After
+ public void tearDown() {
+ ShadowSuggestionController.reset();
+ }
+
+ @Test
+ public void goThroughLifecycle_onStartStop_shouldStartStopController() {
+ mMixin = new SuggestionControllerMixinCompat(mContext, mHost, mLifecycle, mComponentName);
+
+ mLifecycle.handleLifecycleEvent(ON_START);
+ assertThat(ShadowSuggestionController.sStartCalled).isTrue();
+
+ mLifecycle.handleLifecycleEvent(ON_STOP);
+ assertThat(ShadowSuggestionController.sStopCalled).isTrue();
+ }
+
+ @Test
+ public void onServiceConnected_shouldGetSuggestion() {
+ final LoaderManager loaderManager = mock(LoaderManager.class);
+ when(mHost.getLoaderManager()).thenReturn(loaderManager);
+
+ mMixin = new SuggestionControllerMixinCompat(mContext, mHost, mLifecycle, mComponentName);
+ mMixin.onServiceConnected();
+
+ verify(loaderManager).restartLoader(SuggestionLoader.LOADER_ID_SUGGESTIONS,
+ null /* args */, mMixin /* callback */);
+ }
+
+ @Test
+ public void onServiceConnected_hostNotAttached_shouldDoNothing() {
+ when(mHost.getLoaderManager()).thenReturn(null);
+
+ mMixin = new SuggestionControllerMixinCompat(mContext, mHost, mLifecycle, mComponentName);
+ mMixin.onServiceConnected();
+
+ verify(mHost).getLoaderManager();
+ }
+
+ @Test
+ public void onServiceDisconnected_hostNotAttached_shouldDoNothing() {
+ when(mHost.getLoaderManager()).thenReturn(null);
+
+ mMixin = new SuggestionControllerMixinCompat(mContext, mHost, mLifecycle, mComponentName);
+ mMixin.onServiceDisconnected();
+
+ verify(mHost).getLoaderManager();
+ }
+
+ @Test
+ public void doneLoadingg_shouldSetSuggestionLoaded() {
+ mMixin = new SuggestionControllerMixinCompat(mContext, mHost, mLifecycle, mComponentName);
+
+ mMixin.onLoadFinished(mock(SuggestionLoaderCompat.class), null);
+
+ assertThat(mMixin.isSuggestionLoaded()).isTrue();
+
+ mMixin.onLoaderReset(mock(SuggestionLoaderCompat.class));
+
+ assertThat(mMixin.isSuggestionLoaded()).isFalse();
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinTest.java
index cfa16b8a952a..f486989f5a56 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionControllerMixinTest.java
@@ -16,15 +16,15 @@
package com.android.settingslib.suggestions;
-import static android.arch.lifecycle.Lifecycle.Event.ON_START;
-import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.LoaderManager;
-import android.arch.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleOwner;
import android.content.ComponentName;
import android.content.Context;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionParserTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionParserTest.java
deleted file mode 100644
index d05bcfd31685..000000000000
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/suggestions/SuggestionParserTest.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2017 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.settingslib.suggestions;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.robolectric.RuntimeEnvironment.application;
-import static org.robolectric.shadow.api.Shadow.extract;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-
-import com.android.settingslib.SettingsLibRobolectricTestRunner;
-import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.drawer.TileUtilsTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.shadows.ShadowPackageManager;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(SettingsLibRobolectricTestRunner.class)
-public class SuggestionParserTest {
-
- private ShadowPackageManager mPackageManager;
- private SuggestionParser mSuggestionParser;
- private SuggestionCategory mMultipleCategory;
- private SuggestionCategory mExclusiveCategory;
- private SuggestionCategory mExpiredExclusiveCategory;
- private List<Tile> mSuggestionsBeforeDismiss;
- private List<Tile> mSuggestionsAfterDismiss;
- private SharedPreferences mPrefs;
- private Tile mSuggestion;
-
- @Before
- public void setUp() {
- mPackageManager = extract(application.getPackageManager());
- mPrefs = PreferenceManager.getDefaultSharedPreferences(application);
- mSuggestion = new Tile();
- mSuggestion.intent = new Intent("action");
- mSuggestion.intent.setComponent(new ComponentName("pkg", "cls"));
- mSuggestion.metaData = new Bundle();
- mMultipleCategory = new SuggestionCategory();
- mMultipleCategory.category = "category1";
- mMultipleCategory.multiple = true;
- mExclusiveCategory = new SuggestionCategory();
- mExclusiveCategory.category = "category2";
- mExclusiveCategory.exclusive = true;
- mExpiredExclusiveCategory = new SuggestionCategory();
- mExpiredExclusiveCategory.category = "category3";
- mExpiredExclusiveCategory.exclusive = true;
- mExpiredExclusiveCategory.exclusiveExpireDaysInMillis = 0;
-
- mSuggestionParser = new SuggestionParser(application, mPrefs,
- Arrays.asList(mMultipleCategory, mExclusiveCategory, mExpiredExclusiveCategory),
- "0");
-
- ResolveInfo info1 = TileUtilsTest.newInfo(true, null);
- info1.activityInfo.packageName = "pkg";
- ResolveInfo infoDupe1 = TileUtilsTest.newInfo(true, null);
- infoDupe1.activityInfo.packageName = "pkg";
-
- ResolveInfo info2 = TileUtilsTest.newInfo(true, null);
- info2.activityInfo.packageName = "pkg2";
- ResolveInfo info3 = TileUtilsTest.newInfo(true, null);
- info3.activityInfo.packageName = "pkg3";
- ResolveInfo info4 = TileUtilsTest.newInfo(true, null);
- info4.activityInfo.packageName = "pkg4";
-
- Intent intent1 = new Intent(Intent.ACTION_MAIN).addCategory("category1");
- Intent intent2 = new Intent(Intent.ACTION_MAIN).addCategory("category2");
- Intent intent3 = new Intent(Intent.ACTION_MAIN).addCategory("category3");
-
- mPackageManager.addResolveInfoForIntent(intent1, info1);
- mPackageManager.addResolveInfoForIntent(intent1, info2);
- mPackageManager.addResolveInfoForIntent(intent1, infoDupe1);
- mPackageManager.addResolveInfoForIntent(intent2, info3);
- mPackageManager.addResolveInfoForIntent(intent3, info4);
- }
-
- @Test
- public void dismissSuggestion_shouldDismiss() {
- assertThat(mSuggestionParser.dismissSuggestion(mSuggestion)).isTrue();
- }
-
- @Test
- public void testGetSuggestions_withoutSmartSuggestions_shouldDismiss() {
- readAndDismissSuggestion(false);
- mSuggestionParser.readSuggestions(mMultipleCategory, mSuggestionsAfterDismiss, false);
- assertThat(mSuggestionsBeforeDismiss).hasSize(2);
- assertThat(mSuggestionsAfterDismiss).hasSize(1);
- assertThat(mSuggestionsBeforeDismiss.get(1)).isEqualTo(mSuggestionsAfterDismiss.get(0));
- }
-
- @Test
- public void testGetSuggestions_withSmartSuggestions_shouldDismiss() {
- readAndDismissSuggestion(true);
- assertThat(mSuggestionsBeforeDismiss).hasSize(2);
- assertThat(mSuggestionsAfterDismiss).hasSize(1);
- }
-
- @Test
- public void testGetSuggestion_exclusiveNotAvailable_onlyRegularCategoryAndNoDupe() {
- mPackageManager.removeResolveInfosForIntent(
- new Intent(Intent.ACTION_MAIN).addCategory("category2"),
- "pkg3");
- mPackageManager.removeResolveInfosForIntent(
- new Intent(Intent.ACTION_MAIN).addCategory("category3"),
- "pkg4");
-
- // If exclusive item is not available, the other categories should be shown
- final SuggestionList sl =
- mSuggestionParser.getSuggestions(false /* isSmartSuggestionEnabled */);
- final List<Tile> suggestions = sl.getSuggestions();
- assertThat(suggestions).hasSize(2);
-
- assertThat(suggestions.get(0).intent.getComponent().getPackageName()).isEqualTo("pkg");
- assertThat(suggestions.get(1).intent.getComponent().getPackageName()).isEqualTo("pkg2");
- }
-
- @Test
- public void testGetSuggestion_exclusiveExpiredAvailable_shouldLoadWithRegularCategory() {
- // First remove permanent exclusive
- mPackageManager.removeResolveInfosForIntent(
- new Intent(Intent.ACTION_MAIN).addCategory("category2"),
- "pkg3");
- // Set the other exclusive to be expired.
- mPrefs.edit()
- .putLong(mExpiredExclusiveCategory.category + "_setup_time",
- System.currentTimeMillis() - 1000)
- .commit();
-
- // If exclusive is expired, they should be shown together with the other categories
- final SuggestionList sl =
- mSuggestionParser.getSuggestions(true /* isSmartSuggestionEnabled */);
- final List<Tile> suggestions = sl.getSuggestions();
-
- assertThat(suggestions).hasSize(3);
- }
-
- @Test
- public void testGetSuggestions_exclusive() {
- final SuggestionList sl =
- mSuggestionParser.getSuggestions(false /* isSmartSuggestionEnabled */);
- final List<Tile> suggestions = sl.getSuggestions();
-
- assertThat(suggestions).hasSize(1);
- }
-
- @Test
- public void isSuggestionDismissed_dismissedSuggestion_shouldReturnTrue() {
- final Tile suggestion = new Tile();
- suggestion.metaData = new Bundle();
- suggestion.metaData.putString(SuggestionParser.META_DATA_DISMISS_CONTROL, "1,2,3");
- suggestion.intent = new Intent().setComponent(new ComponentName("pkg", "cls"));
-
- // Dismiss suggestion when smart suggestion is not enabled.
- mSuggestionParser.dismissSuggestion(suggestion);
-
- assertThat(mSuggestionParser.isDismissed(suggestion, true /* isSmartSuggestionEnabled */))
- .isTrue();
- }
-
- private void readAndDismissSuggestion(boolean isSmartSuggestionEnabled) {
- mSuggestionsBeforeDismiss = new ArrayList<>();
- mSuggestionsAfterDismiss = new ArrayList<>();
- mSuggestionParser.readSuggestions(
- mMultipleCategory, mSuggestionsBeforeDismiss, isSmartSuggestionEnabled);
-
- final Tile suggestion = mSuggestionsBeforeDismiss.get(0);
- if (mSuggestionParser.dismissSuggestion(suggestion)) {
- mPackageManager.removeResolveInfosForIntent(
- new Intent(Intent.ACTION_MAIN).addCategory(mMultipleCategory.category),
- suggestion.intent.getComponent().getPackageName());
- }
- mSuggestionParser.readSuggestions(
- mMultipleCategory, mSuggestionsAfterDismiss, isSmartSuggestionEnabled);
- }
-}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/FragmentTestUtils.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/FragmentTestUtils.java
new file mode 100644
index 000000000000..8ba8606b8e08
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/FragmentTestUtils.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.testutils;
+
+import android.os.Bundle;
+import android.widget.LinearLayout;
+
+import org.robolectric.Robolectric;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+
+/**
+ * Utilities for creating Fragments for testing.
+ * <p>
+ * TODO(b/111195449) - Duplicated from org.robolectric.shadows.support.v4.SupportFragmentTestUtil
+ */
+@Deprecated
+public class FragmentTestUtils {
+
+ public static void startFragment(Fragment fragment) {
+ buildFragmentManager(FragmentUtilActivity.class)
+ .beginTransaction().add(fragment, null).commit();
+ }
+
+ public static void startFragment(Fragment fragment,
+ Class<? extends FragmentActivity> activityClass) {
+ buildFragmentManager(activityClass)
+ .beginTransaction().add(fragment, null).commit();
+ }
+
+ public static void startVisibleFragment(Fragment fragment) {
+ buildFragmentManager(FragmentUtilActivity.class)
+ .beginTransaction().add(1, fragment, null).commit();
+ }
+
+ public static void startVisibleFragment(Fragment fragment,
+ Class<? extends FragmentActivity> activityClass, int containerViewId) {
+ buildFragmentManager(activityClass)
+ .beginTransaction().add(containerViewId, fragment, null).commit();
+ }
+
+ private static FragmentManager buildFragmentManager(
+ Class<? extends FragmentActivity> activityClass) {
+ FragmentActivity activity = Robolectric.setupActivity(activityClass);
+ return activity.getSupportFragmentManager();
+ }
+
+ private static class FragmentUtilActivity extends FragmentActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ LinearLayout view = new LinearLayout(this);
+ view.setId(1);
+
+ setContentView(view);
+ }
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java
new file mode 100644
index 000000000000..1abbaba441ee
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinCompatTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2016 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.settingslib.widget;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.shadows.ShadowApplication;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+public class FooterPreferenceMixinCompatTest {
+
+ @Mock
+ private PreferenceFragmentCompat mFragment;
+ @Mock
+ private PreferenceScreen mScreen;
+
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
+ private FooterPreferenceMixinCompat mMixin;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ when(mFragment.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
+ when(mFragment.getPreferenceManager().getContext())
+ .thenReturn(ShadowApplication.getInstance().getApplicationContext());
+ mMixin = new FooterPreferenceMixinCompat(mFragment, mLifecycle);
+ }
+
+ @Test
+ public void createFooter_screenNotAvailable_noCrash() {
+ assertThat(mMixin.createFooterPreference()).isNotNull();
+ }
+
+ @Test
+ public void createFooter_screenAvailable_canAttachToScreen() {
+ when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
+
+ final FooterPreference preference = mMixin.createFooterPreference();
+
+ assertThat(preference).isNotNull();
+ verify(mScreen).addPreference(preference);
+ }
+
+ @Test
+ public void createFooter_screenAvailableDelayed_canAttachToScreen() {
+ final FooterPreference preference = mMixin.createFooterPreference();
+
+ mLifecycle.setPreferenceScreen(mScreen);
+
+ assertThat(preference).isNotNull();
+ verify(mScreen).addPreference(preference);
+ }
+
+ @Test
+ public void createFooterTwice_screenAvailable_replaceOldFooter() {
+ when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
+
+ mMixin.createFooterPreference();
+ mMixin.createFooterPreference();
+
+ verify(mScreen).removePreference(any(FooterPreference.class));
+ verify(mScreen, times(2)).addPreference(any(FooterPreference.class));
+ }
+
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java
index 8071c6db4cfd..8604d186f2dd 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceMixinTest.java
@@ -23,11 +23,6 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.arch.lifecycle.LifecycleOwner;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.PreferenceManager;
-import android.support.v7.preference.PreferenceScreen;
-
import com.android.settingslib.SettingsLibRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -38,6 +33,11 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.shadows.ShadowApplication;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+
@RunWith(SettingsLibRobolectricTestRunner.class)
public class FooterPreferenceMixinTest {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
index ff11b803c053..3280089a88f6 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/FooterPreferenceTest.java
@@ -19,7 +19,7 @@ package com.android.settingslib.widget;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.preference.PreferenceViewHolder;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.widget.TextView;
diff --git a/packages/SettingsProvider/Android.mk b/packages/SettingsProvider/Android.mk
index db57fd162362..ccde5716ef93 100644
--- a/packages/SettingsProvider/Android.mk
+++ b/packages/SettingsProvider/Android.mk
@@ -3,6 +3,8 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
src/com/android/providers/settings/EventLogTags.logtags
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index f72868431d43..9d398b5b69a1 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -841,7 +841,19 @@ public class SettingsBackupAgent extends BackupAgentHelper {
WifiConfiguration config = WifiConfiguration
.getWifiConfigFromBackup(new DataInputStream(new ByteArrayInputStream(data)));
if (DEBUG) Log.d(TAG, "Successfully unMarshaled WifiConfiguration ");
+ int originalApBand = config.apBand;
mWifiManager.setWifiApConfiguration(config);
+
+ // Depending on device hardware, we may need to notify the user of a setting change for
+ // the apBand preference
+ boolean dualMode = mWifiManager.isDualModeSupported();
+ int storedApBand = mWifiManager.getWifiApConfiguration().apBand;
+ if (dualMode) {
+ if (storedApBand != originalApBand) {
+ Log.d(TAG, "restored ap configuration requires a conversion, notify the user");
+ mWifiManager.notifyUserOfApBandConversion();
+ }
+ }
} catch (IOException | BackupUtils.BadVersionException e) {
Log.e(TAG, "Failed to unMarshal SoftAPConfiguration " + e.getMessage());
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 1c635c41172a..274acad2b1e4 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -17,7 +17,6 @@
package com.android.providers.settings;
import android.os.Process;
-import com.android.internal.R;
import com.android.internal.app.LocalePicker;
import com.android.internal.annotations.VisibleForTesting;
@@ -30,13 +29,11 @@ import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
-import android.hardware.display.DisplayManager;
import android.icu.util.ULocale;
import android.location.LocationManager;
import android.media.AudioManager;
import android.media.RingtoneManager;
import android.net.Uri;
-import android.os.IPowerManager;
import android.os.LocaleList;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -46,16 +43,17 @@ import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArraySet;
-import android.util.Slog;
+import java.lang.IllegalArgumentException;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Locale;
public class SettingsHelper {
private static final String TAG = "SettingsHelper";
private static final String SILENT_RINGTONE = "_silent";
+ private static final float FLOAT_TOLERANCE = 0.01f;
+
private Context mContext;
private AudioManager mAudioManager;
private TelephonyManager mTelephonyManager;
@@ -155,7 +153,8 @@ public class SettingsHelper {
} else if (isAlreadyConfiguredCriticalAccessibilitySetting(name)) {
return;
} else if (Settings.System.RINGTONE.equals(name)
- || Settings.System.NOTIFICATION_SOUND.equals(name)) {
+ || Settings.System.NOTIFICATION_SOUND.equals(name)
+ || Settings.System.ALARM_ALERT.equals(name)) {
setRingtone(name, value);
return;
}
@@ -187,7 +186,8 @@ public class SettingsHelper {
public String onBackupValue(String name, String value) {
// Special processing for backing up ringtones & notification sounds
if (Settings.System.RINGTONE.equals(name)
- || Settings.System.NOTIFICATION_SOUND.equals(name)) {
+ || Settings.System.NOTIFICATION_SOUND.equals(name)
+ || Settings.System.ALARM_ALERT.equals(name)) {
if (value == null) {
if (Settings.System.RINGTONE.equals(name)) {
// For ringtones, we need to distinguish between non-telephony vs telephony
@@ -199,7 +199,7 @@ public class SettingsHelper {
return null;
}
} else {
- // Backup a null notification sound as silent
+ // Backup a null notification sound or alarm alert as silent
return SILENT_RINGTONE;
}
} else {
@@ -213,13 +213,14 @@ public class SettingsHelper {
/**
* Sets the ringtone of type specified by the name.
*
- * @param name should be Settings.System.RINGTONE or Settings.System.NOTIFICATION_SOUND.
+ * @param name should be Settings.System.RINGTONE, Settings.System.NOTIFICATION_SOUND
+ * or Settings.System.ALARM_ALERT.
* @param value can be a canonicalized uri or "_silent" to indicate a silent (null) ringtone.
*/
private void setRingtone(String name, String value) {
// If it's null, don't change the default
if (value == null) return;
- Uri ringtoneUri = null;
+ final Uri ringtoneUri;
if (SILENT_RINGTONE.equals(value)) {
ringtoneUri = null;
} else {
@@ -230,11 +231,24 @@ public class SettingsHelper {
return;
}
}
- final int ringtoneType = Settings.System.RINGTONE.equals(name)
- ? RingtoneManager.TYPE_RINGTONE : RingtoneManager.TYPE_NOTIFICATION;
+ final int ringtoneType = getRingtoneType(name);
+
RingtoneManager.setActualDefaultRingtoneUri(mContext, ringtoneType, ringtoneUri);
}
+ private int getRingtoneType(String name) {
+ switch (name) {
+ case Settings.System.RINGTONE:
+ return RingtoneManager.TYPE_RINGTONE;
+ case Settings.System.NOTIFICATION_SOUND:
+ return RingtoneManager.TYPE_NOTIFICATION;
+ case Settings.System.ALARM_ALERT:
+ return RingtoneManager.TYPE_ALARM;
+ default:
+ throw new IllegalArgumentException("Incorrect ringtone name: " + name);
+ }
+ }
+
private String getCanonicalRingtoneValue(String value) {
final Uri ringtoneUri = Uri.parse(value);
final Uri canonicalUri = mContext.getContentResolver().canonicalize(ringtoneUri);
@@ -250,19 +264,22 @@ public class SettingsHelper {
// these features working after the restore.
switch (name) {
case Settings.Secure.ACCESSIBILITY_ENABLED:
- case Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD:
case Settings.Secure.TOUCH_EXPLORATION_ENABLED:
case Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:
case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED:
case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED:
- case Settings.Secure.UI_NIGHT_MODE:
return Settings.Secure.getInt(mContext.getContentResolver(), name, 0) != 0;
case Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES:
case Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES:
case Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER:
- case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE:
return !TextUtils.isEmpty(Settings.Secure.getString(
mContext.getContentResolver(), name));
+ case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE:
+ float defaultScale = mContext.getResources().getFraction(
+ R.fraction.def_accessibility_display_magnification_scale, 1, 1);
+ float currentScale = Settings.Secure.getFloat(
+ mContext.getContentResolver(), name, defaultScale);
+ return Math.abs(currentScale - defaultScale) >= FLOAT_TOLERANCE;
case Settings.System.FONT_SCALE:
return Settings.System.getFloat(mContext.getContentResolver(), name, 1.0f) != 1.0f;
default:
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index d5efcb549e64..77eb6c472e4a 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -963,11 +963,14 @@ class SettingsProtoDumpUtil {
GlobalSettingsProto.Ntp.TIMEOUT_MS);
p.end(ntpToken);
- final long uaroToken = p.start(GlobalSettingsProto.USER_ABSENT_RADIOS_OFF);
+ final long uasbToken = p.start(GlobalSettingsProto.USER_ABSENT_SMALL_BATTERY);
dumpSetting(s, p,
Settings.Global.USER_ABSENT_RADIOS_OFF_FOR_SMALL_BATTERY_ENABLED,
- GlobalSettingsProto.UserAbsentRadiosOff.ENABLED_FOR_SMALL_BATTERY);
- p.end(uaroToken);
+ GlobalSettingsProto.UserAbsentSmallBattery.RADIOS_OFF_ENABLED);
+ dumpSetting(s, p,
+ Settings.Global.USER_ABSENT_TOUCH_OFF_FOR_SMALL_BATTERY_ENABLED,
+ GlobalSettingsProto.UserAbsentSmallBattery.TOUCH_OFF_ENABLED);
+ p.end(uasbToken);
dumpSetting(s, p,
Settings.Global.OTA_DISABLE_AUTOMATIC_UPDATE,
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 960d30524b95..9592b63c6d1e 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -2935,7 +2935,7 @@ public class SettingsProvider extends ContentProvider {
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 169;
+ private static final int SETTINGS_VERSION = 170;
private final int mUserId;
@@ -3726,17 +3726,7 @@ public class SettingsProvider extends ContentProvider {
}
if (currentVersion == 164) {
- // Version 164: show zen upgrade notification
- final SettingsState settings = getGlobalSettingsLocked();
- final Setting currentSetting = settings.getSettingLocked(
- Global.SHOW_ZEN_UPGRADE_NOTIFICATION);
- if (!currentSetting.isNull()
- && TextUtils.equals("0", currentSetting.getValue())) {
- settings.insertSettingLocked(
- Global.SHOW_ZEN_UPGRADE_NOTIFICATION, "1",
- null, true, SettingsState.SYSTEM_PACKAGE_NAME);
- }
-
+ // Version 164: REMOVED: show zen upgrade notification
currentVersion = 165;
}
@@ -3820,6 +3810,37 @@ public class SettingsProvider extends ContentProvider {
currentVersion = 169;
}
+ if (currentVersion == 169) {
+ // Version 169: by default, add STREAM_VOICE_CALL to list of streams that can
+ // be muted.
+ final SettingsState systemSettings = getSystemSettingsLocked(userId);
+ final Setting currentSetting = systemSettings.getSettingLocked(
+ Settings.System.MUTE_STREAMS_AFFECTED);
+ if (!currentSetting.isNull()) {
+ try {
+ int currentSettingIntegerValue = Integer.parseInt(
+ currentSetting.getValue());
+ if ((currentSettingIntegerValue
+ & (1 << AudioManager.STREAM_VOICE_CALL)) == 0) {
+ systemSettings.insertSettingLocked(
+ Settings.System.MUTE_STREAMS_AFFECTED,
+ Integer.toString(
+ currentSettingIntegerValue
+ | (1 << AudioManager.STREAM_VOICE_CALL)),
+ null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+ } catch (NumberFormatException e) {
+ // remove the setting in case it is not a valid integer
+ Slog.w("Failed to parse integer value of MUTE_STREAMS_AFFECTED"
+ + "setting, removing setting", e);
+ systemSettings.deleteSettingLocked(
+ Settings.System.MUTE_STREAMS_AFFECTED);
+ }
+
+ }
+ currentVersion = 170;
+ }
+
// vXXX: Add new settings above this point.
if (currentVersion != newVersion) {
diff --git a/packages/SettingsProvider/test/Android.mk b/packages/SettingsProvider/test/Android.mk
index 1ca6afee6daf..0d681ed0f37a 100644
--- a/packages/SettingsProvider/test/Android.mk
+++ b/packages/SettingsProvider/test/Android.mk
@@ -10,12 +10,14 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) \
../src/com/android/providers/settings/SettingsState.java \
../src/com/android/providers/settings/SettingsHelper.java
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
- truth-prebuilt
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
LOCAL_JAVA_LIBRARIES := android.test.base
+LOCAL_RESOURCE_DIR := frameworks/base/packages/SettingsProvider/res
+
+LOCAL_AAPT_FLAGS += --auto-add-overlay --extra-packages com.android.providers.settings
+
LOCAL_PACKAGE_NAME := SettingsProviderTest
LOCAL_PRIVATE_PLATFORM_APIS := true
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java
index b438e9130a88..10749571b623 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperRestoreTest.java
@@ -16,7 +16,7 @@
package com.android.providers.settings;
-import static com.google.common.truth.Truth.assertThat;
+import static junit.framework.Assert.assertEquals;
import android.content.ContentResolver;
import android.content.ContentValues;
@@ -37,6 +37,8 @@ import org.junit.runner.RunWith;
*/
@RunWith(AndroidJUnit4.class)
public class SettingsHelperRestoreTest {
+ private static final float FLOAT_TOLERANCE = 0.01f;
+
private Context mContext;
private ContentResolver mContentResolver;
private SettingsHelper mSettingsHelper;
@@ -48,58 +50,116 @@ public class SettingsHelperRestoreTest {
mSettingsHelper = new SettingsHelper(mContext);
}
- /** Tests for {@link Settings.Secure#ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED}. */
+ /** Tests for {@link Settings.Secure#ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}. */
@Test
public void
- restoreAccessibilityDisplayMagnificationNavbarEnabled_alreadyConfigured_doesNotRestore()
+ testRestoreAccessibilityDisplayMagnificationScale_alreadyConfigured_doesNotRestoreValue()
throws Exception {
+ float defaultSettingValue = setDefaultAccessibilityDisplayMagnificationScale();
+ String settingName = Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE;
+ float restoreSettingValue = defaultSettingValue + 0.5f;
+
// Simulate already configuring setting via SUW.
- Settings.Secure.putInt(
+ float configuredSettingValue = defaultSettingValue + 1.0f;
+ Settings.Secure.putFloat(mContentResolver, settingName, configuredSettingValue);
+
+ mSettingsHelper.restoreValue(
+ mContext,
+ mContentResolver,
+ new ContentValues(2),
+ Settings.Secure.getUriFor(settingName),
+ settingName,
+ String.valueOf(restoreSettingValue),
+ Build.VERSION.SDK_INT);
+
+ assertEquals(
+ configuredSettingValue,
+ Settings.Secure.getFloat(mContentResolver, settingName),
+ FLOAT_TOLERANCE);
+ }
+
+ @Test
+ public void
+ testRestoreAccessibilityDisplayMagnificationScale_notAlreadyConfigured_restoresValue()
+ throws Exception {
+ float defaultSettingValue = setDefaultAccessibilityDisplayMagnificationScale();
+ String settingName = Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE;
+ float restoreSettingValue = defaultSettingValue + 0.5f;
+
+ mSettingsHelper.restoreValue(
+ mContext,
+ mContentResolver,
+ new ContentValues(2),
+ Settings.Secure.getUriFor(settingName),
+ settingName,
+ String.valueOf(restoreSettingValue),
+ Build.VERSION.SDK_INT);
+
+ assertEquals(
+ restoreSettingValue,
+ Settings.Secure.getFloat(mContentResolver, settingName),
+ FLOAT_TOLERANCE);
+ }
+
+ /**
+ * Simulate {@link Settings.Secure#ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE} value at boot by
+ * loading the default.
+ *
+ * @return the default value.
+ */
+ private float setDefaultAccessibilityDisplayMagnificationScale() {
+ float defaultSettingValue =
+ mContext.getResources()
+ .getFraction(
+ R.fraction.def_accessibility_display_magnification_scale, 1, 1);
+ Settings.Secure.putFloat(
mContentResolver,
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
- 1);
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
+ defaultSettingValue);
+ return defaultSettingValue;
+ }
+
+ /** Tests for {@link Settings.Secure#ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED}. */
+ @Test
+ public void
+ testRestoreAccessibilityDisplayMagnificationNavbarEnabled_alreadyConfigured_doesNotRestoreValue()
+ throws Exception {
+ String settingName = Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED;
+ // Simulate already configuring setting via SUW.
+ int configuredSettingValue = 1;
+ Settings.Secure.putInt(mContentResolver, settingName, configuredSettingValue);
mSettingsHelper.restoreValue(
mContext,
mContentResolver,
new ContentValues(2),
- Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED),
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
+ Settings.Secure.getUriFor(settingName),
+ settingName,
String.valueOf(0),
Build.VERSION.SDK_INT);
- assertThat(
- Settings.Secure.getInt(
- mContentResolver,
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED))
- .isEqualTo(1);
+ assertEquals(configuredSettingValue, Settings.Secure.getInt(mContentResolver, settingName));
}
@Test
public void
- restoreAccessibilityDisplayMagnificationNavbarEnabled_notAlreadyConfigured_restores()
+ testRestoreAccessibilityDisplayMagnificationNavbarEnabled_notAlreadyConfigured_restoresValue()
throws Exception {
+ String settingName = Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED;
+ int defaultSettingValue = 0;
// Simulate system default at boot.
- Settings.Secure.putInt(
- mContentResolver,
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
- 0);
+ Settings.Secure.putInt(mContentResolver, settingName, defaultSettingValue);
+ int restoreSettingValue = 1;
mSettingsHelper.restoreValue(
mContext,
mContentResolver,
new ContentValues(2),
- Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED),
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED,
- String.valueOf(1),
+ Settings.Secure.getUriFor(settingName),
+ settingName,
+ String.valueOf(restoreSettingValue),
Build.VERSION.SDK_INT);
- assertThat(
- Settings.Secure.getInt(
- mContentResolver,
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED))
- .isEqualTo(1);
+ assertEquals(restoreSettingValue, Settings.Secure.getInt(mContentResolver, settingName));
}
}
diff --git a/packages/Shell/Android.mk b/packages/Shell/Android.mk
index 5713dc679341..b738d7771465 100644
--- a/packages/Shell/Android.mk
+++ b/packages/Shell/Android.mk
@@ -12,7 +12,8 @@ LOCAL_SRC_FILES += \
LOCAL_AIDL_INCLUDES = frameworks/native/cmds/dumpstate/binder
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+LOCAL_STATIC_ANDROID_LIBRARIES := androidx.legacy_legacy-support-v4
+LOCAL_USE_AAPT2 := true
LOCAL_PACKAGE_NAME := Shell
LOCAL_PRIVATE_PLATFORM_APIS := true
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index b4f331d89074..f811665c91ea 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -152,12 +152,13 @@
<uses-permission android:name="android.permission.WATCH_APPOPS" />
<uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
+ <uses-permission android:name="android.permission.SUSPEND_APPS" />
<application android:label="@string/app_label"
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true">
<provider
- android:name="android.support.v4.content.FileProvider"
+ android:name="androidx.core.content.FileProvider"
android:authorities="com.android.shell"
android:grantUriPermissions="true"
android:exported="false">
diff --git a/packages/Shell/res/values-hy/strings.xml b/packages/Shell/res/values-hy/strings.xml
index 95b6131c6884..3bc54b28691c 100644
--- a/packages/Shell/res/values-hy/strings.xml
+++ b/packages/Shell/res/values-hy/strings.xml
@@ -25,9 +25,9 @@
<string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Վրիպակների մասին հաշվետվությունը շուտով կստանաք հեռախոսին"</string>
<string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"Ընտրեք՝ վրիպակի զեկույցն ուղարկելու համար"</string>
<string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Հպեք՝ վրիպակի զեկույցը տրամադրելու համար"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Ընտրեք՝ վրիպակի զեկույցն առանց էկրանի պատկերի ուղարկելու համար կամ սպասեք էկրանի պատկերի ստեղծմանը"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Հպեք՝ վրիպակի զեկույցն առանց էկրանի պատկերի ուղարկելու համար կամ սպասեք էկրանի պատկերի ստեղծմանը"</string>
- <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Հպեք՝ վրիպակի զեկույցն առանց էկրանի պատկերի ուղարկելու համար կամ սպասեք էկրանի պատկերի ստեղծմանը"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Ընտրեք՝ վրիպակի զեկույցն առանց սքրինշոթի ուղարկելու համար կամ սպասեք էկրանի պատկերի ստեղծմանը"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Հպեք՝ վրիպակի զեկույցն առանց սքրինշոթի ուղարկելու համար կամ սպասեք էկրանի պատկերի ստեղծմանը"</string>
+ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Հպեք՝ վրիպակի զեկույցն առանց սքրինշոթի ուղարկելու համար կամ սպասեք էկրանի պատկերի ստեղծմանը"</string>
<string name="bugreport_confirm" msgid="5917407234515812495">"Վրիպակի զեկույցները պարունակում են տվյալներ համակարգի տարբեր մատյաններից և կարող են ներառել տեղեկություններ, որոնք դուք գաղտնի եք համարում (օրինակ՝ հավելվածի օգտագործման կամ տեղադրության մասին): Վրիպակի զեկույցները տրամադրեք միայն վստահելի մարդկանց և հավելվածներին:"</string>
<string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Այլևս ցույց չտալ"</string>
<string name="bugreport_storage_title" msgid="5332488144740527109">"Վրիպակների հաշվետվություններ"</string>
@@ -35,9 +35,9 @@
<string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Չհաջողվեց ավելացնել վրիպակի զեկույցի մանրամասները zip ֆայլին"</string>
<string name="bugreport_unnamed" msgid="2800582406842092709">"անանուն"</string>
<string name="bugreport_info_action" msgid="2158204228510576227">"Մանրամասներ"</string>
- <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Էկրանի պատկեր"</string>
- <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Էկրանի պատկերը հաջողությամբ ստացվեց:"</string>
- <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Չհաջողվեց ստանալ էկրանի պատկերը:"</string>
+ <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Սքրինշոթ"</string>
+ <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Սքրինշոթը հաջողությամբ ստացվեց:"</string>
+ <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Չհաջողվեց ստանալ սքրինշոթը:"</string>
<string name="bugreport_info_dialog_title" msgid="1355948594292983332">"<xliff:g id="ID">#%d</xliff:g> վրիպակի զեկույցի մանրամասները"</string>
<string name="bugreport_info_name" msgid="4414036021935139527">"Ֆայլի անունը"</string>
<string name="bugreport_info_title" msgid="2306030793918239804">"Վրիպակի զեկույցի վերնագիրը"</string>
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 600f0dc37775..4fc190d43056 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -88,7 +88,7 @@ import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.Vibrator;
-import android.support.v4.content.FileProvider;
+import androidx.core.content.FileProvider;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
diff --git a/packages/SimAppDialog/Android.mk b/packages/SimAppDialog/Android.mk
index 6a4099bcc637..991e3330e00a 100644
--- a/packages/SimAppDialog/Android.mk
+++ b/packages/SimAppDialog/Android.mk
@@ -11,7 +11,7 @@ LOCAL_CERTIFICATE := platform
LOCAL_STATIC_ANDROID_LIBRARIES := \
- android-support-v4
+ androidx.legacy_legacy-support-v4
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
include frameworks/opt/setupwizard/library/common-platform-deprecated.mk
diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk
index 1a5ee277eb73..f201c3595d76 100644
--- a/packages/SystemUI/Android.mk
+++ b/packages/SystemUI/Android.mk
@@ -37,20 +37,20 @@ LOCAL_SRC_FILES := \
LOCAL_STATIC_ANDROID_LIBRARIES := \
SystemUIPluginLib \
SystemUISharedLib \
- android-support-car \
- android-support-v4 \
- android-support-v7-recyclerview \
- android-support-v7-preference \
- android-support-v7-appcompat \
- android-support-v7-mediarouter \
- android-support-v7-palette \
- android-support-v14-preference \
- android-support-v17-leanback \
- android-slices-core \
- android-slices-view \
- android-slices-builders \
- android-arch-core-runtime \
- android-arch-lifecycle-extensions \
+ androidx.car_car \
+ androidx.legacy_legacy-support-v4 \
+ androidx.recyclerview_recyclerview \
+ androidx.preference_preference \
+ androidx.appcompat_appcompat \
+ androidx.mediarouter_mediarouter \
+ androidx.palette_palette \
+ androidx.legacy_legacy-preference-v14 \
+ androidx.leanback_leanback \
+ androidx.slice_slice-core \
+ androidx.slice_slice-view \
+ androidx.slice_slice-builders \
+ androidx.arch.core_core-runtime \
+ androidx.lifecycle_lifecycle-extensions \
LOCAL_STATIC_JAVA_LIBRARIES := \
SystemUI-tags \
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index d6d8469b0b12..62dd23aac9ff 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -121,6 +121,7 @@
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
<uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
<uses-permission android:name="android.permission.TRUST_LISTENER" />
+ <uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT" />
<uses-permission android:name="android.permission.MANAGE_SLICE_PERMISSIONS" />
@@ -230,7 +231,7 @@
android:theme="@style/Theme.SystemUI"
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true"
- android:appComponentFactory="android.support.v4.app.CoreComponentFactory">
+ android:appComponentFactory="androidx.core.app.CoreComponentFactory">
<!-- Keep theme in sync with SystemUIApplication.onCreate().
Setting the theme on the application does not affect views inflated by services.
The application theme is set again from onCreate to take effect for those views. -->
@@ -339,19 +340,17 @@
android:exported="false">
</activity>
- <!-- Springboard for launching the share activity -->
- <receiver android:name=".screenshot.GlobalScreenshot$ScreenshotActionReceiver"
- android:process=":screenshot"
+ <!-- Springboard for launching the share and edit activity. This needs to be in the main
+ system ui process since we need to notify the status bar to dismiss the keyguard -->
+ <receiver android:name=".screenshot.GlobalScreenshot$ActionProxyReceiver"
android:exported="false" />
<!-- Callback for dismissing screenshot notification after a share target is picked -->
<receiver android:name=".screenshot.GlobalScreenshot$TargetChosenReceiver"
- android:process=":screenshot"
android:exported="false" />
<!-- Callback for deleting screenshot notification -->
<receiver android:name=".screenshot.GlobalScreenshot$DeleteScreenshotReceiver"
- android:process=":screenshot"
android:exported="false" />
<!-- started from UsbDeviceSettingsManager -->
@@ -595,7 +594,7 @@
</receiver>
<provider
- android:name="android.support.v4.content.FileProvider"
+ android:name="androidx.core.content.FileProvider"
android:authorities="com.android.systemui.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS
index e217ace5a644..47f2cdcf80c6 100644
--- a/packages/SystemUI/OWNERS
+++ b/packages/SystemUI/OWNERS
@@ -14,6 +14,7 @@ jmonk@google.com
jaggies@google.com
jjaggi@google.com
juliacr@google.com
+kchyn@google.com
madym@google.com
ngmatthew@google.com
roosa@google.com
diff --git a/packages/SystemUI/proguard.flags b/packages/SystemUI/proguard.flags
index 4b5d10e8d190..e6452e717d5e 100644
--- a/packages/SystemUI/proguard.flags
+++ b/packages/SystemUI/proguard.flags
@@ -36,9 +36,9 @@
public <init>(android.content.Context, android.util.AttributeSet);
}
--keep class ** extends android.support.v14.preference.PreferenceFragment
+-keep class ** extends androidx.preference.PreferenceFragment
-keep class com.android.systemui.tuner.*
-keep class com.android.systemui.plugins.** {
public protected *;
}
--keep class android.support.v4.app.CoreComponentFactory
+-keep class androidx.core.app.CoreComponentFactory
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index 41a3f108c0e9..f43d57ada95e 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Toestel is <xliff:g id="NUMBER_1">%d</xliff:g> uur lank nie ontsluit nie. Bevestig wagwoord.</item>
<item quantity="one">Toestel is <xliff:g id="NUMBER_0">%d</xliff:g> uur lank nie ontsluit nie. Bevestig wagwoord.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nie herken nie"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nie herken nie"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nie herken nie"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Voer SIM-PIN in. Jy het <xliff:g id="NUMBER_1">%d</xliff:g> pogings oor.</item>
<item quantity="one">Voer SIM-PIN in. Jy het <xliff:g id="NUMBER_0">%d</xliff:g> poging oor voordat jy jou diensverskaffer moet kontak om jou toestel te ontsluit.</item>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index 0ee1820ca44f..11e099ae4818 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">መሣሪያው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። የይለፍ ቃል ያረጋግጡ።</item>
<item quantity="other">መሣሪያው ለ<xliff:g id="NUMBER_1">%d</xliff:g> ሰዓቶች አልተከፈተም ነበር። የይለፍ ቃል ያረጋግጡ።</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"አልታወቀም"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"አልታወቀም"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"አልታወቀም"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">የሲም ፒን ያስገቡ። <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>
<item quantity="other">የሲም ፒን ያስገቡ። <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index 9980d64a7041..111773056faf 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -164,7 +164,8 @@
<item quantity="other">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_1">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
<item quantity="one">لم يتم إلغاء تأمين الجهاز لمدة <xliff:g id="NUMBER_0">%d</xliff:g> ساعة. تأكيد كلمة المرور.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"لم يتم التعرف عليها"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"لم يتم التعرف عليها."</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"لم يتم التعرّف عليه."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="zero">‏أدخل رقم التعريف الشخصي لشريحة SIM. تتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولة.</item>
<item quantity="two">‏أدخل رقم التعريف الشخصي لشريحة SIM. تتبقى لديك محاولتان (<xliff:g id="NUMBER_1">%d</xliff:g>).</item>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index 929d89cf4600..50dd855e2683 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পাছৱৰ্ড নিশ্চিত কৰক।</item>
<item quantity="other">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পাছৱৰ্ড নিশ্চিত কৰক।</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"চিনাক্ত কৰিব পৰা নগ\'ল"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"চিনাক্ত কৰিব পৰা নাই"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"চিনাক্ত কৰিব পৰা নাই"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">ছিমৰ পিন দিয়ক। আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g>বাৰ প্ৰয়াস কৰিব পাৰে।</item>
<item quantity="other">ছিমৰ পিন দিয়ক। আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g>বাৰ প্ৰয়াস কৰিব পাৰে।</item>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index 09261940f9bd..19a096352d5a 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Cihaz <xliff:g id="NUMBER_1">%d</xliff:g> saat kiliddən çıxarılmayıb. Parolu təsdiq edin.</item>
<item quantity="one">Cihaz <xliff:g id="NUMBER_0">%d</xliff:g> saat kiliddən çıxarılmayıb. Parolu təsdiq edin.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tanınmır"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Tanınmır"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Tanınmır"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM PIN-ni daxil edin. <xliff:g id="NUMBER_1">%d</xliff:g> cəhdiniz qalır.</item>
<item quantity="one">SIM PIN-ni daxil edin. Cihazınızı kiliddən çıxarmaq üçün operatorunuzla əlaqə saxlamadan öncə <xliff:g id="NUMBER_0">%d</xliff:g> cəhdiniz qalır.</item>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index 67da7b8e6e21..1e8e443fbc6c 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -146,7 +146,8 @@
<item quantity="few">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite lozinku.</item>
<item quantity="other">Niste otključali uređaj <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite lozinku.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nije prepoznat"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nije prepoznat"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
<item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index 5b11a0973db7..8251071496aa 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -152,7 +152,8 @@
<item quantity="many">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзін. Увядзіце пароль.</item>
<item quantity="other">Прылада не была разблакіравана на працягу <xliff:g id="NUMBER_1">%d</xliff:g> гадзіны. Увядзіце пароль.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не распазнаны"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Не распазнана"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Не распазнана"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Увядзіце PIN-код SIM-карты. У вас засталася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item>
<item quantity="few">Увядзіце PIN-код SIM-карты. У вас засталося <xliff:g id="NUMBER_1">%d</xliff:g> спробы.</item>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 663d5f01da39..7438d7f3c993 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Устройството не е отключвано от <xliff:g id="NUMBER_1">%d</xliff:g> часа. Потвърдете паролата.</item>
<item quantity="one">Устройството не е отключвано от <xliff:g id="NUMBER_0">%d</xliff:g> час. Потвърдете паролата.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не е разпознато"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Не е разпознато"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Не е разпознато"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Въведете ПИН кода за SIM картата – остават ви <xliff:g id="NUMBER_1">%d</xliff:g> опита.</item>
<item quantity="one">Въведете ПИН кода за SIM картата – остава ви <xliff:g id="NUMBER_0">%d</xliff:g> опит, преди да се наложи да се свържете с оператора си, за да отключите устройството.</item>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 7a3b5757f258..814aafe6a9c9 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -140,7 +140,10 @@
<item quantity="one">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধরে আনলক করা হয় নি। পাসওয়ার্ড নিশ্চিত করুন।</item>
<item quantity="other">ডিভাইসটি <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধরে আনলক করা হয় নি। পাসওয়ার্ড নিশ্চিত করুন।</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"স্বীকৃত নয়"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">সিমের পিন লিখুন। আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন।</item>
<item quantity="other">সিমের পিন লিখুন। আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন।</item>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 319014e666d9..a87b72a7f230 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -146,7 +146,8 @@
<item quantity="few">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite lozinku.</item>
<item quantity="other">Uređaj nije otključavan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite lozinku.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nije prepoznat"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nije prepoznat"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
<item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 7b53abe5240e..093bd1c84316 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Fa <xliff:g id="NUMBER_1">%d</xliff:g> hores que no es desbloqueja el dispositiu. Confirma la contrasenya.</item>
<item quantity="one">Fa <xliff:g id="NUMBER_0">%d</xliff:g> hora que no es desbloqueja el dispositiu. Confirma la contrasenya.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"No s\'ha reconegut"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"No s\'ha reconegut"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"No s\'ha reconegut"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Introdueix el PIN de la SIM. Et queden <xliff:g id="NUMBER_1">%d</xliff:g> intents.</item>
<item quantity="one">Introdueix el PIN de la SIM. Et queda <xliff:g id="NUMBER_0">%d</xliff:g> intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu.</item>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index d827b258e1dc..2142c9ce7e4a 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -152,7 +152,8 @@
<item quantity="other">Zařízení již <xliff:g id="NUMBER_1">%d</xliff:g> hodin nebylo odemknuto. Zadejte heslo.</item>
<item quantity="one">Zařízení již <xliff:g id="NUMBER_0">%d</xliff:g> hodinu nebylo odemknuto. Zadejte heslo.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nerozpoznáno"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nerozpoznáno"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nerozpoznáno"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="few">Zadejte PIN SIM karty. Zbývají <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item>
<item quantity="many">Zadejte PIN SIM karty. Zbývá <xliff:g id="NUMBER_1">%d</xliff:g> pokusu.</item>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index b65087ade4dd..df4ab21d0844 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> time siden. Bekræft adgangskoden.</item>
<item quantity="other">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> timer siden. Bekræft adgangskoden.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ikke genkendt"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Ikke genkendt"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Ikke genkendt"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Angiv pinkoden til SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item>
<item quantity="other">Angiv pinkoden til SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 8a1de2cbaeff..c86a9ad2442f 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Das Gerät wurde seit <xliff:g id="NUMBER_1">%d</xliff:g> Stunden nicht mehr entsperrt. Bitte bestätige das Passwort.</item>
<item quantity="one">Das Gerät wurde seit <xliff:g id="NUMBER_0">%d</xliff:g> Stunde nicht mehr entsperrt. Bitte bestätige das Passwort.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nicht erkannt"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nicht erkannt"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nicht erkannt"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Gib die PIN für die SIM-Karte ein. Du hast noch <xliff:g id="NUMBER_1">%d</xliff:g> Versuche.</item>
<item quantity="one">Gib die PIN für die SIM-Karte ein. Du hast noch <xliff:g id="NUMBER_0">%d</xliff:g> Versuch, bevor das Gerät nur noch vom Mobilfunkanbieter entsperrt werden kann.</item>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index bfab0d672711..59e76697c003 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Η συσκευή δεν έχει ξεκλειδωθεί εδώ και <xliff:g id="NUMBER_1">%d</xliff:g> ώρες. Επιβεβαιώστε τον κωδικό πρόσβασης.</item>
<item quantity="one">Η συσκευή δεν έχει ξεκλειδωθεί εδώ και <xliff:g id="NUMBER_0">%d</xliff:g> ώρα. Επιβεβαιώστε τον κωδικό πρόσβασης.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Δεν αναγνωρίστηκε"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Δεν αναγνωρίστηκε"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Δεν αναγνωρίστηκε"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Εισαγάγετε τον αριθμό PIN της κάρτας SIM. Απομένουν άλλες <xliff:g id="NUMBER_1">%d</xliff:g> προσπάθειες.</item>
<item quantity="one">Εισαγάγετε τον αριθμό PIN της κάρτας SIM. Απομένει άλλη <xliff:g id="NUMBER_0">%d</xliff:g> προσπάθεια. Στη συνέχεια, θα πρέπει να επικοινωνήσετε με τον πάροχο κινητής τηλεφωνίας, για να ξεκλειδώσετε τη συσκευή.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index 44ef5524c44f..77ff1b759890 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
<item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm password.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Not recognised"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Not recognised"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Not recognised"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 1bddc86b2197..dafdd3248d4e 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
<item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm password.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Not recognised"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Not recognised"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Not recognised"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index 44ef5524c44f..77ff1b759890 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
<item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm password.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Not recognised"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Not recognised"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Not recognised"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index 44ef5524c44f..77ff1b759890 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
<item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_0">%d</xliff:g> hour. Confirm password.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Not recognised"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Not recognised"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Not recognised"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index 987d983cf1ef..5eac25cb0ca7 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‎Device hasn\'t been unlocked for ‎‏‎‎‏‏‎<xliff:g id="NUMBER_1">%d</xliff:g>‎‏‎‎‏‏‏‎ hours. Confirm password.‎‏‎‎‏‎</item>
<item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‎Device hasn\'t been unlocked for ‎‏‎‎‏‏‎<xliff:g id="NUMBER_0">%d</xliff:g>‎‏‎‎‏‏‏‎ hour. Confirm password.‎‏‎‎‏‎</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎Not recognized‎‏‎‎‏‎"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‎Not recognized‎‏‎‎‏‎"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎Not recognized‎‏‎‎‏‎"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎Enter SIM PIN. You have ‎‏‎‎‏‏‎<xliff:g id="NUMBER_1">%d</xliff:g>‎‏‎‎‏‏‏‎ remaining attempts.‎‏‎‎‏‎</item>
<item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎Enter SIM PIN. You have ‎‏‎‎‏‏‎<xliff:g id="NUMBER_0">%d</xliff:g>‎‏‎‎‏‏‏‎ remaining attempt before you must contact your carrier to unlock your device.‎‏‎‎‏‎</item>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 0583d4b45a0d..8af47fdcde83 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Hace <xliff:g id="NUMBER_1">%d</xliff:g> horas que no se desbloquea el dispositivo. Confirma la contraseña.</item>
<item quantity="one">Hace <xliff:g id="NUMBER_0">%d</xliff:g> hora que no se desbloquea el dispositivo. Confirma la contraseña.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"No se reconoció"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"No se reconoció"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"No se reconoció"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Ingresa el PIN de la SIM. Quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos más.</item>
<item quantity="one">Ingresa el PIN de la SIM. Queda <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que debas comunicarte con tu proveedor para desbloquear el dispositivo.</item>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index 2d6721d9db3f..92dc58fc0dc8 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirma la contraseña.</item>
<item quantity="one">El dispositivo no se ha desbloqueado durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma la contraseña.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"No reconocido"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"No reconocida"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"No reconocida"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Introduce el PIN de la tarjeta SIM. Te quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item>
<item quantity="one">Introduce el PIN de la tarjeta SIM. Te queda <xliff:g id="NUMBER_0">%d</xliff:g> intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo.</item>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index ac37c5ce6dc3..ad6becdca766 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Seadet pole avatud <xliff:g id="NUMBER_1">%d</xliff:g> tundi. Kinnitage parool.</item>
<item quantity="one">Seadet pole avatud <xliff:g id="NUMBER_0">%d</xliff:g> tund. Kinnitage parool.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ei tuvastatud"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Ei tuvastatud"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Ei tuvastatud"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Sisestage SIM-kaardi PIN-kood. Jäänud on <xliff:g id="NUMBER_1">%d</xliff:g> katset.</item>
<item quantity="one">Sisestage SIM-kaardi PIN-kood. Jäänud on <xliff:g id="NUMBER_0">%d</xliff:g> katse enne, kui peate seadme avamiseks ühendust võtma operaatoriga.</item>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index 06bb32b3a5c9..40368515fe1c 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Gailua ez da desblokeatu <xliff:g id="NUMBER_1">%d</xliff:g> orduz. Berretsi pasahitza.</item>
<item quantity="one">Gailua ez da desblokeatu <xliff:g id="NUMBER_0">%d</xliff:g> orduz. Berretsi pasahitza.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ez da ezagutu"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Ez da ezagutu"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Ez da ezagutu"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Idatzi SIM txartelaren PIN kodea. <xliff:g id="NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu.</item>
<item quantity="one">Idatzi SIM txartelaren PIN kodea. <xliff:g id="NUMBER_0">%d</xliff:g> saiakera geratzen zaizu; oker idatziz gero, operadoreari eskatu beharko diozu gailua desblokeatzeko.</item>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index f273d6ea53d8..3b1d8d710719 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. گذرواژه را تأیید کنید.</item>
<item quantity="other">قفل دستگاه <xliff:g id="NUMBER_1">%d</xliff:g> ساعت باز نشده است. گذرواژه را تأیید کنید.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"شناسایی نشد"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"شناسایی نشد"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"شناسایی نشد"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">پین سیم‌کارت را وارد کنید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش دیگری باقی مانده است.</item>
<item quantity="other">پین سیم‌کارت را وارد کنید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش دیگری باقی مانده است.</item>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 52671516fdb1..34d830f6ee1e 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_1">%d</xliff:g> tuntiin. Vahvista salasana.</item>
<item quantity="one">Laitteen lukitusta ei ole avattu <xliff:g id="NUMBER_0">%d</xliff:g> tuntiin. Vahvista salasana.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ei tunnistettu"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Ei tunnistettu"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Ei tunnistettu"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Anna SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER_1">%d</xliff:g> yritystä jäljellä.</item>
<item quantity="one">Anna SIM-kortin PIN-koodi. <xliff:g id="NUMBER_0">%d</xliff:g> yrityksen jälkeen laite lukittuu, ja vain operaattori voi avata sen.</item>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 742e1eb42272..c34480759354 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le mot de passe.</item>
<item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le mot de passe.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Doigt non reconnu"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Doigt non reconnu"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Doigt non reconnu"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
<item quantity="other">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 9ada218cc74a..bf8c7e82f175 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le mot de passe.</item>
<item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le mot de passe.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non reconnu"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Non reconnu"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Non reconnu"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Saisissez le code de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentative restante.</item>
<item quantity="other">Saisissez le code de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentatives restantes.</item>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 4a8fe8a3a012..b4ff9ea253e0 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirma o contrasinal.</item>
<item quantity="one">O dispositivo non se desbloqueou durante <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirma o contrasinal.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non se recoñece"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Non se recoñeceu"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Non se recoñeceu"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Introduce o código PIN da SIM. Quédanche <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item>
<item quantity="one">Introduce o código PIN da SIM. Quédache <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que teñas que contactar co operador para desbloquear o dispositivo.</item>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index 6a10af578838..e2cd09b42526 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -140,7 +140,10 @@
<item quantity="one">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. પાસવર્ડની પુષ્ટિ કરો.</item>
<item quantity="other">ઉપકરણને <xliff:g id="NUMBER_1">%d</xliff:g> કલાક માટે અનલૉક કરવામાં આવ્યું નથી. પાસવર્ડની પુષ્ટિ કરો.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"ઓળખાયેલ નથી"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">સિમનો પિન દાખલ કરો, તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે.</item>
<item quantity="other">સિમનો પિન દાખલ કરો, તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસો બાકી છે.</item>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index 553f6633e8dc..539efd9199f7 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -140,7 +140,10 @@
<item quantity="one">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पासवर्ड की पुष्टि करें.</item>
<item quantity="other">डिवाइस को <xliff:g id="NUMBER_1">%d</xliff:g> घंटों से अनलॉक नहीं किया गया है. पासवर्ड की पुष्टि करें.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"उंगली की पहचान नहीं हो सकी"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">सिम का पिन डालें. आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> मौके बचे हैं.</item>
<item quantity="other">सिम का पिन डालें. आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> मौके बचे हैं.</item>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 7485cef615c6..6ae39b2fbfb0 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -146,7 +146,8 @@
<item quantity="few">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sata. Potvrdite zaporku.</item>
<item quantity="other">Uređaj nije bio otključan <xliff:g id="NUMBER_1">%d</xliff:g> sati. Potvrdite zaporku.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nije prepoznat"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nije prepoznat"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nije prepoznato"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
<item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 371bc645df3c..a03a8b24dbc0 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Az eszköz zárolása <xliff:g id="NUMBER_1">%d</xliff:g> órája nem lett feloldva. Erősítse meg a jelszót.</item>
<item quantity="one">Az eszköz zárolása <xliff:g id="NUMBER_0">%d</xliff:g> órája nem lett feloldva. Erősítse meg a jelszót.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nem sikerült felismerni"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nem ismerhető fel"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nem ismerhető fel"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Adja meg a SIM-kártya PIN-kódját. <xliff:g id="NUMBER_1">%d</xliff:g> próbálkozása maradt.</item>
<item quantity="one">Adja meg a SIM-kártya PIN-kódját. <xliff:g id="NUMBER_0">%d</xliff:g> próbálkozása maradt. Ha elfogynak a próbálkozási lehetőségek, az eszköz feloldásához fel kell vennie a kapcsolatot szolgáltatójával.</item>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index 92cb87aa2134..800937126c22 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
<item quantity="other">Սարքը չի ապակողպվել <xliff:g id="NUMBER_1">%d</xliff:g> ժամվա ընթացքում: Հաստատեք գաղտնաբառը:</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Չճանաչվեց"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Չհաջողվեց ճանաչել"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Չհաջողվեց ճանաչել"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Մուտքագրեք SIM քարտի PIN կոդը: Մնացել է <xliff:g id="NUMBER_1">%d</xliff:g> փորձ:</item>
<item quantity="other">Մուտքագրեք SIM քարտի PIN կոդը: Մնացել է <xliff:g id="NUMBER_1">%d</xliff:g> փորձ:</item>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index c0c828bc47ce..c1a20c638969 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_1">%d</xliff:g> jam. Konfirmasi sandi.</item>
<item quantity="one">Perangkat belum dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Konfirmasi sandi.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tidak dikenali"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Tidak dikenali"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Tidak dikenali"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Masukkan PIN SIM. Tersisa <xliff:g id="NUMBER_1">%d</xliff:g> percobaan.</item>
<item quantity="one">Masukkan PIN SIM. Tersisa <xliff:g id="NUMBER_0">%d</xliff:g> percobaan sebelum Anda harus menghubungi operator untuk membuka kunci perangkat.</item>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index dad5e698b910..0800b3e05949 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustund. Staðfestu aðgangsorðið.</item>
<item quantity="other">Tækið hefur ekki verið tekið úr lás í <xliff:g id="NUMBER_1">%d</xliff:g> klukkustundir. Staðfestu aðgangsorðið.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Þekktist ekki"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Þekktist ekki"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Þekktist ekki"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Sláðu inn PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraun eftir.</item>
<item quantity="other">Sláðu inn PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraunir eftir.</item>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 2f322e857fa2..07830c21c1af 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_1">%d</xliff:g> ore. Conferma la password.</item>
<item quantity="one">Il dispositivo non viene sbloccato da <xliff:g id="NUMBER_0">%d</xliff:g> ora. Conferma la password.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Non riconosciuta"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Non riconosciuta"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Non riconosciuta"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Inserisci il codice PIN della SIM. Hai ancora <xliff:g id="NUMBER_1">%d</xliff:g> tentativi a disposizione.</item>
<item quantity="one">Inserisci il codice PIN della SIM. Hai ancora <xliff:g id="NUMBER_0">%d</xliff:g> tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo.</item>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index cfffcd2f06fc..6ed4e5f7c422 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -152,7 +152,8 @@
<item quantity="other">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_1">%d</xliff:g> שעות. הזן את הסיסמה.</item>
<item quantity="one">נעילת המכשיר לא בוטלה במשך <xliff:g id="NUMBER_0">%d</xliff:g> שעה. הזן את הסיסמה.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"לא זוהתה"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"לא זוהתה"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"לא זוהתה"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="two">‏יש להזין קוד גישה לכרטיס SIM. נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסונות נוספים.</item>
<item quantity="many">‏יש להזין קוד גישה לכרטיס SIM. נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסונות נוספים.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 98e8ce08a2b6..c9acb553649f 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">端末のロックが <xliff:g id="NUMBER_1">%d</xliff:g> 時間、解除されていません。パスワードを確認してください。</item>
<item quantity="one">端末のロックが <xliff:g id="NUMBER_0">%d</xliff:g> 時間、解除されていません。パスワードを確認してください。</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"認識されませんでした"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"認識されませんでした"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"認識されませんでした"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM PIN を入力してください。入力できるのはあと <xliff:g id="NUMBER_1">%d</xliff:g> 回です。</item>
<item quantity="one">SIM PIN を入力してください。入力できるのはあと <xliff:g id="NUMBER_0">%d</xliff:g> 回です。この回数を超えた場合は、携帯通信会社にお問い合わせください。</item>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index df9697958965..c5f415b25418 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">მოწყობილობა არ განბლოკილა <xliff:g id="NUMBER_1">%d</xliff:g> საათის განმავლობაში. დაადასტურეთ პაროლი.</item>
<item quantity="one">მოწყობილობა არ განბლოკილა <xliff:g id="NUMBER_0">%d</xliff:g> საათის განმავლობაში. დაადასტურეთ პაროლი.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"არ არის ამოცნობილი"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"არ არის ამოცნობილი"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"არ არის ამოცნობილი"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">შეიყვანეთ SIM ბარათის PIN-კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER_1">%d</xliff:g> მცდელობა.</item>
<item quantity="one">შეიყვანეთ SIM ბარათის PIN-კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER_0">%d</xliff:g> მცდელობა, რომლის შემდეგაც მოწყობილობის განსაბლოკად დაგჭირდებათ თქვენს ოპერატორთან დაკავშირება.</item>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index 6ed9f44391a0..d206bcbcbca3 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Құрылғы құлпы <xliff:g id="NUMBER_1">%d</xliff:g> сағаттан бері ашылмаған. Құпия сөзді растаңыз.</item>
<item quantity="one">Құрылғы құлпы <xliff:g id="NUMBER_0">%d</xliff:g> сағаттан бері ашылмаған. Құпия сөзді растаңыз.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Анықталмады"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Танылмады"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Танылмады"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM PIN кодын енгізіңіз. <xliff:g id="NUMBER_1">%d</xliff:g> мүмкіндік қалды, одан кейін оператордан SIM картасының құлпын ашуды сұрауға тура келеді.</item>
<item quantity="one">SIM PIN кодын енгізіңіз. <xliff:g id="NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін оператордан SIM картасының құлпын ашуды сұрауға тура келеді.</item>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index f7960e5a8c60..d38aa3f14ffd 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">ឧបករណ៍​បាន​ជាប់​សោ​អស់រយៈ​ពេល <xliff:g id="NUMBER_1">%d</xliff:g> ម៉ោង​ហើយ។ សូម​បញ្ជាក់​ពាក្យ​សម្ងាត់។</item>
<item quantity="one">ឧបករណ៍​បាន​ជាប់​សោ​អស់រយៈ​ពេល <xliff:g id="NUMBER_0">%d</xliff:g> ម៉ោង​ហើយ។ សូម​បញ្ជាក់​ពាក្យ​សម្ងាត់។</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"មិនអាចសម្គាល់បានទេ"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"មិនអាចសម្គាល់បានទេ"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"មិនអាចសម្គាល់បានទេ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">បញ្ចូល​កូដ PIN របស់ស៊ីម។ អ្នកនៅ​សល់ការ​ព្យាយាម <xliff:g id="NUMBER_1">%d</xliff:g> ដងទៀត។</item>
<item quantity="one">បញ្ចូលកូដ PIN របស់ស៊ីម។ អ្នក​នៅសល់​ការព្យាយាម <xliff:g id="NUMBER_0">%d</xliff:g> ដង​ទៀត មុន​ពេល​ដែលអ្នក​ត្រូវទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​របស់អ្នក​ដើម្បី​ដោះសោ​ឧបករណ៍​របស់អ្នក។</item>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index e6b03f92112b..a43560850286 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -140,7 +140,10 @@
<item quantity="one">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್‌ಲಾಕ್‌ ಮಾಡಿರಲಿಲ್ಲ. ಪಾಸ್‌ವರ್ಡ್‌ ಖಚಿತಪಡಿಸಿ.</item>
<item quantity="other">ಸಾಧನವನ್ನು <xliff:g id="NUMBER_1">%d</xliff:g> ಗಂಟೆಗಳವರೆಗೆ ಅನ್‌ಲಾಕ್‌ ಮಾಡಿರಲಿಲ್ಲ. ಪಾಸ್‌ವರ್ಡ್‌ ಖಚಿತಪಡಿಸಿ.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ. ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ.</item>
<item quantity="other">ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ. ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index ffdb1e5c0b00..87359cad7540 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">기기가 <xliff:g id="NUMBER_1">%d</xliff:g>시간 동안 잠금 해제되지 않았습니다. 비밀번호를 입력하세요.</item>
<item quantity="one">기기가 <xliff:g id="NUMBER_0">%d</xliff:g>시간 동안 잠금 해제되지 않았습니다. 비밀번호를 입력하세요.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"인식할 수 없음"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"인식할 수 없음"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"인식할 수 없음"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM PIN을 입력하세요. 입력은 <xliff:g id="NUMBER_1">%d</xliff:g>번 더 시도할 수 있습니다.</item>
<item quantity="one">SIM PIN을 입력하세요. 입력에 <xliff:g id="NUMBER_0">%d</xliff:g>번 더 실패하면 이동통신사에 문의하여 기기를 잠금 해제해야 합니다.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 80ae05031e3a..832e5af80d14 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Түзмөктүн кулпусу <xliff:g id="NUMBER_1">%d</xliff:g> саат бою ачылган жок. Сырсөздү ырастаңыз.</item>
<item quantity="one">Түзмөктүн кулпусу <xliff:g id="NUMBER_0">%d</xliff:g> саат бою ачылган жок. Сырсөздү ырастаңыз.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Таанылган жок"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Таанылган жок"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Таанылган жок"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM-картанын PIN кодун киргизиңиз. Сизде <xliff:g id="NUMBER_1">%d</xliff:g> аракет калды.</item>
<item quantity="one">SIM-картанын PIN кодун киргизиңиз. Сизде <xliff:g id="NUMBER_0">%d</xliff:g> аракет калды, андан кийин түзмөктү бөгөттөн чыгаруу үчүн байланыш операторуна кайрылышыңыз керек болот.</item>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index b05915acfdb2..4d66dfeedee7 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">ອຸປະກອນບໍ່ໄດ້ຖືກປົດລັອກເປັນເວລາ <xliff:g id="NUMBER_1">%d</xliff:g> ຊົ່ວໂມງ. ຢືນຢັນລະຫັດຜ່ານ.</item>
<item quantity="one">ອຸປະກອນບໍ່ໄດ້ຖືກປົດລັອກເປັນເວລາ <xliff:g id="NUMBER_0">%d</xliff:g> ຊົ່ວໂມງ. ຢືນຢັນລະຫັດຜ່ານ.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"ບໍ່ຮັບຮູ້"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"ບໍ່ຮູ້ຈັກ"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"ບໍ່ຮູ້ຈັກ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">ລະຫັດ SIM PIN ບໍ່ຖືກຕ້ອງ. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ.</item>
<item quantity="one">ໃສ່ລະຫັດ SIM PIN. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ຈະຕ້ອງຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການເພື່ອປົດລັອກ.</item>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index 5cd696f7adeb..18404e04a509 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -152,7 +152,8 @@
<item quantity="many">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandos. Patvirtinkite slaptažodį.</item>
<item quantity="other">Įrenginys nebuvo atrakintas <xliff:g id="NUMBER_1">%d</xliff:g> valandų. Patvirtinkite slaptažodį.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Neatpažinta"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Neatpažinta"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Neatpažinta"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymas.</item>
<item quantity="few">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymai.</item>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index d4f60208b652..9ec52cf80d9b 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -146,7 +146,8 @@
<item quantity="one">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundu. Apstipriniet paroli.</item>
<item quantity="other">Ierīce nav tikusi atbloķēta <xliff:g id="NUMBER_1">%d</xliff:g> stundas. Apstipriniet paroli.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nav atpazīts"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nav atpazīts"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nav atpazīts"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="zero">Ievadiet SIM kartes PIN. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes.</item>
<item quantity="one">Ievadiet SIM kartes PIN. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizi.</item>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index aff4803711ef..0685a106de81 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> час. Потврдете ја лозинката.</item>
<item quantity="other">Уредот не е отклучен веќе <xliff:g id="NUMBER_1">%d</xliff:g> часа. Потврдете ја лозинката.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Непознат"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Непознат"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Непознат"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Внесете PIN-код за SIM-картичката. Ви преостанува уште <xliff:g id="NUMBER_1">%d</xliff:g> обид.</item>
<item quantity="other">Внесете PIN-код за SIM-картичката. Ви преостануваат уште <xliff:g id="NUMBER_1">%d</xliff:g> обиди.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index d3283e122c32..c6aadb0deb4e 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -140,7 +140,10 @@
<item quantity="other">ഉപകരണം <xliff:g id="NUMBER_1">%d</xliff:g> മണിക്കൂറായി അൺലോക്ക് ചെയ്തിട്ടില്ല. പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക.</item>
<item quantity="one">ഉപകരണം <xliff:g id="NUMBER_0">%d</xliff:g> മണിക്കൂറായി അൺലോക്ക് ചെയ്തിട്ടില്ല. പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"തിരിച്ചറിഞ്ഞില്ല"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">സിം പിൻ നൽകുക. നിങ്ങൾക്ക് <xliff:g id="NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു.</item>
<item quantity="one">സിം പിൻ നൽകുക. ഉപകരണം അൺലോക്ക് ചെയ്യാൻ കാരിയറുമായി ബന്ധപ്പെടേണ്ടിവരുന്നതിന് മുമ്പ് <xliff:g id="NUMBER_0">%d</xliff:g> ശ്രമം കൂടി ശേഷിക്കുന്നു.</item>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 99c7339c6bee..3c1870d1241d 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Төхөөрөмжийн түгжээг <xliff:g id="NUMBER_1">%d</xliff:g> цагийн турш тайлаагүй байна. Нууц үгээ баталгаажуулна уу.</item>
<item quantity="one">Төхөөрөмжийн түгжээг <xliff:g id="NUMBER_0">%d</xliff:g> цагийн турш тайлаагүй байна. Нууц үгээ баталгаажуулна уу.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Танигдахгүй байна"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Таньж чадсангүй"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Таньж чадсангүй"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM-н ПИН кодыг оруулна уу. Танд <xliff:g id="NUMBER_1">%d</xliff:g> оролдлого үлдлээ.</item>
<item quantity="one">SIM-н ПИН кодыг оруулна уу. Танд оператор компанитайгаа холбогдохгүйгээр төхөөрөмжийн түгжээг тайлах <xliff:g id="NUMBER_0">%d</xliff:g> оролдлого үлдлээ.</item>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index 16a9d6360194..88724ce9205b 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -140,7 +140,10 @@
<item quantity="one">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासासाठी अनलॉक केले गेले नाही. पासवर्डची खात्री करा.</item>
<item quantity="other">डिव्हाइस <xliff:g id="NUMBER_1">%d</xliff:g> तासांसाठी अनलॉक केले गेले नाही. पासवर्डची खात्री करा.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"ओळखले नाही"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">सिम पिन एंटर करा, तुमच्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहे.</item>
<item quantity="other">सिम पिन एंटर करा, तुमच्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index 19e53d564a87..bec32951bcad 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_1">%d</xliff:g> jam. Sahkan kata laluan.</item>
<item quantity="one">Peranti tidak dibuka kuncinya selama <xliff:g id="NUMBER_0">%d</xliff:g> jam. Sahkan kata laluan.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tidak dikenali"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Tidak dikenali"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Tidak dikenali"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Masukkan PIN SIM. Tinggal <xliff:g id="NUMBER_1">%d</xliff:g> percubaan lagi.</item>
<item quantity="one">Masukkan PIN SIM. Tinggal <xliff:g id="NUMBER_0">%d</xliff:g> percubaan lagi sebelum anda perlu menghubungi pembawa anda untuk membuka kunci peranti.</item>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index c9a2e1cb496d..017bf0af2051 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">စက်ပစ္စည်းကို <xliff:g id="NUMBER_1">%d</xliff:g> နာရီကြာ လော့ခ်ဖွင့်ခဲ့ခြင်း မရှိပါ။ စကားဝှက်အား အတည်ပြုပါ။</item>
<item quantity="one">စက်ပစ္စည်းကို <xliff:g id="NUMBER_0">%d</xliff:g> နာရီကြာ လော့ခ်ဖွင့်ခဲ့ခြင်း မရှိပါ။ စကားဝှက်အား အတည်ပြုပါ။</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"မသိပါ"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"မသိပါ"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"မသိပါ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">ဆင်းမ်ကဒ် ပင်နံပါတ် ထည့်ပါ။ <xliff:g id="NUMBER_1">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့်ရှိပါသေးသည်။</item>
<item quantity="one">ဆင်းမ်ကဒ် ပင်နံပါတ် ထည့်ပါ။ သင့်စက်ကို လော့ခ်ဖွင့်ပေးရန်အတွက် ဝန်ဆောင်မှုပေးသူသို့ မဆက်သွယ်မီ <xliff:g id="NUMBER_0">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့်ရှိပါသေးသည်။</item>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 457359685ec2..125ffb08aa30 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Enheten har ikke blitt låst opp de siste <xliff:g id="NUMBER_1">%d</xliff:g> timene. Bekreft passordet.</item>
<item quantity="one">Enheten har ikke blitt låst opp på <xliff:g id="NUMBER_0">%d</xliff:g> time. Bekreft passordet.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ikke gjenkjent"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Ikke gjenkjent"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Ikke gjenkjent"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Skriv inn PIN-koden for SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøk igjen.</item>
<item quantity="one">Skriv inn PIN-koden for SIM-kortet. Du har <xliff:g id="NUMBER_0">%d</xliff:g> forsøk igjen før du må kontakte operatøren din for å låse opp enheten.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 3f6b749f2747..ccb78d112e04 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -140,7 +140,10 @@
<item quantity="other">यन्त्र <xliff:g id="NUMBER_1">%d</xliff:g> घन्टा देखि अनलक भएको छैन। पासवर्ड पुष्टि गर्नुहोस्।</item>
<item quantity="one">यन्त्र <xliff:g id="NUMBER_0">%d</xliff:g> घन्टा देखि अनलक भएको छैन। पासवर्ड पुष्टि गर्नुहोस्।</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"पहिचान भएन"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM को PIN प्रविष्ट गर्नुहोस्। तपाईंसँग <xliff:g id="NUMBER_1">%d</xliff:g>  प्रयासहरू बाँकी छन्।</item>
<item quantity="one">SIM को PIN प्रविष्ट गर्नुहोस्। तपाईंसँग <xliff:g id="NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि भने आफ्नो यन्त्र अनलक गर्नका लागि तपाईंले अनिवार्य रूपमा आफ्नो सेवा प्रदायकलाई सम्पर्क गर्नु पर्ने हुन्छ।</item>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index e2f5806f261c..cf0cff23e342 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Apparaat is al <xliff:g id="NUMBER_1">%d</xliff:g> uur niet ontgrendeld. Bevestig het wachtwoord.</item>
<item quantity="one">Apparaat is al <xliff:g id="NUMBER_0">%d</xliff:g> uur niet ontgrendeld. Bevestig het wachtwoord.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Niet herkend"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Niet herkend"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Niet herkend"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_1">%d</xliff:g> pogingen over.</item>
<item quantity="one">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_0">%d</xliff:g> poging over voordat je contact met je provider moet opnemen om het apparaat te ontgrendelen.</item>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index 1ffce78f593a..6d9462649bda 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> ଘଣ୍ଟା ପାଇଁ ଡିଭାଇସ୍‍ ଅନଲକ୍‍ କରାଯାଇ ନାହିଁ। ପାସୱର୍ଡ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</item>
<item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> ଘଣ୍ଟା ପାଇଁ ଡିଭାଇସ୍‍ ଅନଲକ୍‍ କରାଯାଇ ନାହିଁ। ପାସୱର୍ଡ ସୁନିଶ୍ଚିତ କରନ୍ତୁ</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM PIN ପ୍ରବେଶ କରନ୍ତୁ। ଆପଣଙ୍କ ପାଇଁ <xliff:g id="NUMBER_1">%d</xliff:g>ଟି ପ୍ରୟାସ ବଳକା ଅଛି।</item>
<item quantity="one">SIM PIN ପ୍ରବେଶ କରନ୍ତୁ। ଆପଣଙ୍କ ଡିଭାଇସ୍‍କୁ ଅନଲକ୍ କରିବା ପାଇଁ ପାଖରେ ବଳକା ଥିବା <xliff:g id="NUMBER_0">%d</xliff:g>ଟି ପ୍ରୟାସର ବ୍ୟବହାର କରିବା ପୂର୍ବରୁ ନିଜର କେରିଅର୍‍ଙ୍କୁ ସମ୍ପର୍କ କରନ୍ତୁ।</item>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index e1379f6f16f9..498151c685ac 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -140,7 +140,10 @@
<item quantity="one">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟੇ ਤੋਂ ਅਣਲਾਕ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</item>
<item quantity="other">ਡੀਵਾਈਸ <xliff:g id="NUMBER_1">%d</xliff:g> ਘੰਟਿਆਂ ਤੋਂ ਅਣਲਾਕ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ।</item>
<item quantity="other">ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ।</item>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 8376a365eb37..538135f6f0b7 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -152,7 +152,8 @@
<item quantity="other">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_1">%d</xliff:g> godziny. Potwierdź hasło.</item>
<item quantity="one">Urządzenie nie zostało odblokowane od <xliff:g id="NUMBER_0">%d</xliff:g> godziny. Potwierdź hasło.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nie rozpoznano"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nie rozpoznano"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nie rozpoznano"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="few">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby.</item>
<item quantity="many">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> prób.</item>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 897056099885..13508b79b880 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> hora. Confirme a senha.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a senha.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Não reconhecido"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Não reconhecido"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Informe o PIN do SIM. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativa restante.</item>
<item quantity="other">Informe o PIN do SIM. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativas restantes.</item>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index a2f8aea2ca52..c87799a308ec 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a palavra-passe.</item>
<item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme a palavra-passe.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Não reconhecido."</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Não reconhecido."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Introduza o PIN do cartão SIM. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item>
<item quantity="one">Introduza o PIN do cartão SIM. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo.</item>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 897056099885..13508b79b880 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> hora. Confirme a senha.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a senha.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Não reconhecido"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Não reconhecido"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Informe o PIN do SIM. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativa restante.</item>
<item quantity="other">Informe o PIN do SIM. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativas restantes.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index 148772b66f02..3741157d515e 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -146,7 +146,8 @@
<item quantity="other">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_1">%d</xliff:g> de ore. Confirmați parola.</item>
<item quantity="one">Dispozitivul nu a fost deblocat de <xliff:g id="NUMBER_0">%d</xliff:g> oră. Confirmați parola.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nu este recunoscută"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nu este recunoscută"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nu este recunoscut"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="few">Introduceți codul PIN pentru cardul SIM. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> încercări.</item>
<item quantity="other">Introduceți codul PIN pentru cardul SIM. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> de încercări.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index c6d06aad0c4c..5fc9af75e761 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -152,7 +152,8 @@
<item quantity="many">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часов. Введите пароль ещё раз.</item>
<item quantity="other">Устройство не разблокировалось в течение <xliff:g id="NUMBER_1">%d</xliff:g> часа. Введите пароль ещё раз.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не распознано"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Не распознано"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Не распознано"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Введите PIN-код. Осталась <xliff:g id="NUMBER_1">%d</xliff:g> попытка.</item>
<item quantity="few">Введите PIN-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попытки.</item>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index 7e3b6356b885..dd99e8bfb7c8 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. මුරපදය තහවුරු කරන්න.</item>
<item quantity="other">උපාංගය පැය <xliff:g id="NUMBER_1">%d</xliff:g>ක් අගුලු හැර නැත. මුරපදය තහවුරු කරන්න.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"හඳුනා නොගන්නා ලදී"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"හඳුනා නොගන්නා ලදී"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"හඳුනා නොගන්නා ලදී"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">SIM PIN ඇතුළු කරන්න, ඔබ සතුව උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>
<item quantity="other">SIM PIN ඇතුළු කරන්න, ඔබ සතුව උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index a0cd7a52bb31..868e0f6d2df1 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -152,7 +152,8 @@
<item quantity="other">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_1">%d</xliff:g> hodín. Potvrďte heslo.</item>
<item quantity="one">Zariadenie nebolo odomknuté <xliff:g id="NUMBER_0">%d</xliff:g> hodinu. Potvrďte heslo.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nerozpoznané"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nerozpoznané"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nerozpoznané"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="few">Zadajte kód PIN SIM karty. Zostávajú vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item>
<item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index 6bcae3e5b6d2..9be4dbd5827e 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -152,7 +152,8 @@
<item quantity="few">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ure. Potrdite geslo.</item>
<item quantity="other">Naprava ni bila odklenjena <xliff:g id="NUMBER_1">%d</xliff:g> ur. Potrdite geslo.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Ni prepoznano"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Ni prepoznano"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Ni prepoznano"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskus.</item>
<item quantity="two">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusa.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index dca238857603..e92b9b6ac065 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_1">%d</xliff:g> orë. Konfirmo fjalëkalimin.</item>
<item quantity="one">Pajisja nuk është shkyçur për <xliff:g id="NUMBER_0">%d</xliff:g> orë. Konfirmo fjalëkalimin.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Nuk njihet"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Nuk njihet"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Nuk njihet"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Fut kodin PIN të kartës SIM. Të kanë mbetur edhe <xliff:g id="NUMBER_1">%d</xliff:g> tentativa.</item>
<item quantity="one">Fut kodin PIN të kartës SIM. Të ka mbetur edhe <xliff:g id="NUMBER_0">%d</xliff:g> tentativë para se të duhet të kontaktosh me operatorin tënd celular për ta shkyçur pajisjen.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 6882333f470e..b146603a3b96 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -146,7 +146,8 @@
<item quantity="few">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сата. Потврдите лозинку.</item>
<item quantity="other">Нисте откључали уређај <xliff:g id="NUMBER_1">%d</xliff:g> сати. Потврдите лозинку.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Није препознат"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Није препознат"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Није препознат"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушај.</item>
<item quantity="few">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушаја.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index e8fd26eeafbf..ba5c346654da 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Enheten har inte låsts upp på <xliff:g id="NUMBER_1">%d</xliff:g> timmar. Bekräfta lösenordet.</item>
<item quantity="one">Enheten har inte låsts upp på <xliff:g id="NUMBER_0">%d</xliff:g> timme. Bekräfta lösenordet.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Identifierades inte"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Identifierades inte"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Identifierades inte"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Ange pinkod för SIM-kortet. <xliff:g id="NUMBER_1">%d</xliff:g> försök återstår.</item>
<item quantity="one">Ange pinkod för SIM-kortet. <xliff:g id="NUMBER_0">%d</xliff:g> försök återstår innan du måste kontakta operatören för att låsa upp enheten.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index 3dc496a6158f..6376b61c4f09 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_1">%d</xliff:g>. Thibitisha nenosiri.</item>
<item quantity="one">Hujafungua kifaa kwa saa <xliff:g id="NUMBER_0">%d</xliff:g>. Thibitisha nenosiri.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Haikutambua alama ya kidole"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Haikutambua alama ya kidole"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Haitambuliwi"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Weka PIN ya SIM. Zimesalia mara <xliff:g id="NUMBER_1">%d</xliff:g> za kujaribu.</item>
<item quantity="one">Weka PIN ya SIM. Ukijaribu tena mara <xliff:g id="NUMBER_0">%d</xliff:g> bila kufaulu, kifaa chako kitafungwa na utalazimika uwasiliane na mtoa huduma wako ili akifungue.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index ae05463da28a..44968c30331d 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -140,7 +140,10 @@
<item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. கடவுச்சொல்லை உறுதிப்படுத்தவும்.</item>
<item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> மணிநேரமாகச் சாதனம் திறக்கப்படவில்லை. கடவுச்சொல்லை உறுதிப்படுத்தவும்.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"அடையாளங்காண முடியவில்லை"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">சிம் பின்னை உள்ளிடவும். மேலும், <xliff:g id="NUMBER_1">%d</xliff:g> வாய்ப்புகள் மீதமுள்ளன.</item>
<item quantity="one">சிம் பின்னை உள்ளிடவும். மீதமுள்ள <xliff:g id="NUMBER_0">%d</xliff:g> வாய்ப்பில் தவறுதலான பின் உள்ளிடப்பட்டால், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தைத் திறக்க முடியும்.</item>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 2f0377f87040..2597a55ccf61 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -140,7 +140,10 @@
<item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> గంటల పాటు పరికరాన్ని అన్‌లాక్ చేయలేదు. పాస్‌వర్డ్‌ని నమోదు చేయండి.</item>
<item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> గంట పాటు పరికరాన్ని అన్‌లాక్ చేయలేదు. పాస్‌వర్డ్‌ని నమోదు చేయండి.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"గుర్తించలేదు"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM పిన్‌ని నమోదు చేయండి. మీకు <xliff:g id="NUMBER_1">%d</xliff:g> ప్రయత్నలు మిగిలి ఉన్నాయి.</item>
<item quantity="one">SIM పిన్‌ని నమోదు చేయండి, మీరు మీ పరికరాన్ని అన్‌లాక్ చేయడానికి తప్పనిసరిగా మీ క్యారియర్‌ను సంప్రదించడానికి ముందు మీకు <xliff:g id="NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది.</item>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index 92a5a08e419e..52d7f1f65d74 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">ไม่มีการปลดล็อกอุปกรณ์มา <xliff:g id="NUMBER_1">%d</xliff:g> ชั่วโมงแล้ว ยืนยันรหัสผ่าน</item>
<item quantity="one">ไม่มีการปลดล็อกอุปกรณ์มา <xliff:g id="NUMBER_0">%d</xliff:g> ชั่วโมงแล้ว ยืนยันรหัสผ่าน</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"ไม่รู้จัก"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"ไม่รู้จัก"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"ไม่รู้จัก"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">โปรดป้อน PIN ของซิม คุณพยายามได้อีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง</item>
<item quantity="one">โปรดป้อน PIN ของซิม คุณพยายามได้อีก <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งก่อนที่จะต้องติดต่อผู้ให้บริการเพื่อปลดล็อกอุปกรณ์</item>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index b993167bf58c..eb4f2ca01be6 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> oras. Kumpirmahin ang password.</item>
<item quantity="other">Hindi na-unlock ang device sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> na oras. Kumpirmahin ang password.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Hindi nakilala"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Hindi nakilala"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Hindi nakilala"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Ilagay ang PIN ng SIM. Mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> natitirang pagsubok.</item>
<item quantity="other">Ilagay ang PIN ng SIM. Mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> na natitirang pagsubok.</item>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index 399134a0f564..a7d870a90cf9 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Cihazın kilidi son <xliff:g id="NUMBER_1">%d</xliff:g> saattir açılmadı. Şifreyi doğrulayın.</item>
<item quantity="one">Cihazın kilidi son <xliff:g id="NUMBER_0">%d</xliff:g> saattir açılmadı. Şifreyi doğrulayın.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Tanınmadı"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Tanınmadı"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Tanınmadı"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM PIN\'inizi girin. <xliff:g id="NUMBER_1">%d</xliff:g> deneme hakkınız kaldı.</item>
<item quantity="one">SIM PIN\'inizi girin. Cihazınızın kilidini açmak için operatörünüzle bağlantı kurmak zorunda kalmadan önce <xliff:g id="NUMBER_0">%d</xliff:g> deneme hakkınız kaldı.</item>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index 821257e05f1a..5f5bfc37e5f9 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -152,7 +152,8 @@
<item quantity="many">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> годин. Підтвердьте пароль.</item>
<item quantity="other">Ви не розблоковували пристрій <xliff:g id="NUMBER_1">%d</xliff:g> години. Підтвердьте пароль.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Не розпізнано"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Не розпізнано"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Не розпізнано"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Введіть PIN-код SIM-карти. Залишилася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item>
<item quantity="few">Введіть PIN-код SIM-карти. Залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index bfbc70f8039f..3e7aaeede274 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -140,7 +140,10 @@
<item quantity="other">آلہ <xliff:g id="NUMBER_1">%d</xliff:g> گھنٹوں سے غیر مقفل نہیں کیا گيا۔ پاسورڈ کی توثیق کریں۔</item>
<item quantity="one">آلہ <xliff:g id="NUMBER_0">%d</xliff:g> گھنٹہ سے غیر مقفل نہیں کیا گیا۔ پاسورڈ کی توثیق کریں۔</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"تسلیم شدہ نہیں ہے"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">‏SIM کا PIN درج کریں، آپ کے پاس <xliff:g id="NUMBER_1">%d</xliff:g> کوششیں بچی ہیں۔</item>
<item quantity="one">‏SIM کا PIN درج کریں، آپ کے پاس <xliff:g id="NUMBER_0">%d</xliff:g> کوشش بچی ہے، اس کے بعد آپ کو اپنا آلہ غیر مقفل کرنے کے لیے اپنے کیریئر سے رابطہ کرنا ہوگا۔</item>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index ad7a0dcc5235..277fa8b5af60 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Qurilma <xliff:g id="NUMBER_1">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. Parolni yana bir marta kiriting.</item>
<item quantity="one">Qurilma <xliff:g id="NUMBER_0">%d</xliff:g> soatdan beri qulfdan chiqarilgani yo‘q. Parolni yana bir marta kiriting.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Barmoq izi aniqlanmadi"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Aniqlanmadi"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Aniqlanmadi"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">SIM PIN kodini kiriting, sizda <xliff:g id="NUMBER_1">%d</xliff:g> ta urinish bor.</item>
<item quantity="one">SIM PIN kodini kiriting, qurilmani qulfdan chiqarish uchun sizda <xliff:g id="NUMBER_0">%d</xliff:g> ta urinish bor.</item>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 1a2d6b41185f..d851cebc2884 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -140,7 +140,8 @@
<item quantity="other">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_1">%d</xliff:g> giờ. Xác nhận mật khẩu.</item>
<item quantity="one">Thiết bị đã không được mở khóa trong <xliff:g id="NUMBER_0">%d</xliff:g> giờ. Xác nhận mật khẩu.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Không nhận dạng được"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Không nhận dạng được"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Không nhận dạng được"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">Hãy nhập mã PIN của SIM. Bạn còn <xliff:g id="NUMBER_1">%d</xliff:g> lần thử.</item>
<item quantity="one">Hãy nhập mã PIN của SIM. Bạn còn <xliff:g id="NUMBER_0">%d</xliff:g> lần thử trước khi phải liên hệ với nhà mạng để mở khóa thiết bị của mình.</item>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index dcb0d0476f15..d36794b537e5 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -144,7 +144,10 @@
<item quantity="other">设备已保持锁定状态达 <xliff:g id="NUMBER_1">%d</xliff:g> 小时。请确认密码。</item>
<item quantity="one">设备已保持锁定状态达 <xliff:g id="NUMBER_0">%d</xliff:g> 小时。请确认密码。</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"无法识别"</string>
+ <!-- no translation found for kg_fingerprint_not_recognized (7854413849848459418) -->
+ <skip />
+ <!-- no translation found for kg_face_not_recognized (6382535088345875294) -->
+ <skip />
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
<item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 21dc277986da..69ea472c7141 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -144,7 +144,8 @@
<item quantity="other">裝置在過去 <xliff:g id="NUMBER_1">%d</xliff:g> 小時內未有解鎖,請確認密碼。</item>
<item quantity="one">裝置在過去 <xliff:g id="NUMBER_0">%d</xliff:g> 小時內未有解鎖,請確認密碼。</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"未能識別"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"未能識別"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"未能識別"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">輸入 SIM 卡的 PIN,您還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
<item quantity="one">輸入 SIM 卡的 PIN,您還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,您必須聯絡流動網絡供應商解鎖您的裝置。</item>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index f0d5ff673de0..a76a3a3e6654 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -144,7 +144,8 @@
<item quantity="other">裝置已有 <xliff:g id="NUMBER_1">%d</xliff:g> 小時未解鎖。請確認密碼。</item>
<item quantity="one">裝置已有 <xliff:g id="NUMBER_0">%d</xliff:g> 小時未解鎖。請確認密碼。</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"無法識別"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"無法識別"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"無法識別"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="other">請輸入 SIM 卡的 PIN 碼,你還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
<item quantity="one">請輸入 SIM 卡的 PIN 碼,你還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然失敗,就必須請電信業者為裝置解鎖。</item>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 54096387a5cd..78bb66cd1dca 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -140,7 +140,8 @@
<item quantity="one">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphasiwedi.</item>
<item quantity="other">Idivayisi ayikavulwa ngamahora angu-<xliff:g id="NUMBER_1">%d</xliff:g>. Qinisekisa iphasiwedi.</item>
</plurals>
- <string name="fingerprint_not_recognized" msgid="348813995267914625">"Akubonwa"</string>
+ <string name="kg_fingerprint_not_recognized" msgid="7854413849848459418">"Akwaziwa"</string>
+ <string name="kg_face_not_recognized" msgid="6382535088345875294">"Akwaziwa"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="3739658416797652781">
<item quantity="one">Faka i-PIN ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item>
<item quantity="other">Faka i-PIN ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item>
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml
index 33f15f9d3a29..10b6bb380c99 100644
--- a/packages/SystemUI/res-keyguard/values/strings.xml
+++ b/packages/SystemUI/res-keyguard/values/strings.xml
@@ -48,10 +48,10 @@
<string name="keyguard_enter_your_pin">Enter your PIN</string>
<!-- Instructions telling the user to enter their pattern to unlock the keyguard [CHAR LIMIT=30] -->
- <string name="keyguard_enter_your_pattern">Enter your Pattern</string>
+ <string name="keyguard_enter_your_pattern">Enter your pattern</string>
<!-- Instructions telling the user to enter their text password to unlock the keyguard [CHAR LIMIT=30] -->
- <string name="keyguard_enter_your_password">Enter your Password</string>
+ <string name="keyguard_enter_your_password">Enter your password</string>
<!-- Instructions telling the user that they entered the wrong pin while trying
to unlock the keyguard. Displayed in one line in a large font. -->
@@ -62,7 +62,7 @@
<!-- When the lock screen is showing, the phone is plugged in and the battery is fully
charged, say that it is charged. -->
- <string name="keyguard_charged">Charged</string>
+ <string name="keyguard_charged">Fully charged</string>
<!-- When the lock screen is showing and the phone plugged in, and the battery
is not fully charged, say that it's charging. -->
@@ -146,9 +146,9 @@
<!-- Message shown in pattern unlock after some number of unsuccessful attempts -->
<string name="kg_forgot_pattern_button_text">Forgot Pattern</string>
<!-- Message shown when user enters wrong pattern -->
- <string name="kg_wrong_pattern">Wrong Pattern</string>
+ <string name="kg_wrong_pattern">Wrong pattern</string>
<!-- Message shown when user enters wrong password -->
- <string name="kg_wrong_password">Wrong Password</string>
+ <string name="kg_wrong_password">Wrong password</string>
<!-- Message shown when user enters wrong PIN -->
<string name="kg_wrong_pin">Wrong PIN</string>
<!-- Countdown message shown after too many failed unlock attempts -->
@@ -385,7 +385,10 @@
</plurals>
<!-- Fingerprint hint message when finger was not recognized.-->
- <string name="fingerprint_not_recognized">Not recognized</string>
+ <string name="kg_fingerprint_not_recognized">Not recognized</string>
+
+ <!-- Face hint message when finger was not recognized. [CHAR LIMIT=20] -->
+ <string name="kg_face_not_recognized">Not recognized</string>
<!-- Instructions telling the user remaining times when enter SIM PIN view. -->
<plurals name="kg_password_default_pin_message">
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/color/qs_detail_progress_track.xml b/packages/SystemUI/res/color-night/qs_detail_progress_track.xml
index c56382e6047f..c56382e6047f 100644
--- a/packages/overlays/SysuiDarkThemeOverlay/res/color/qs_detail_progress_track.xml
+++ b/packages/SystemUI/res/color-night/qs_detail_progress_track.xml
diff --git a/packages/SystemUI/res/color/notification_guts_buttons.xml b/packages/SystemUI/res/color/notification_guts_buttons.xml
index 3b8d59bae744..412e0be65cf7 100644
--- a/packages/SystemUI/res/color/notification_guts_buttons.xml
+++ b/packages/SystemUI/res/color/notification_guts_buttons.xml
@@ -2,6 +2,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true"
android:color="?android:attr/colorAccent" />
- <item android:color="@android:color/black"
+ <item android:color="@color/notification_primary_text_color"
android:alpha=".54" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable-hdpi/qs_scrubber_track.9.png b/packages/SystemUI/res/drawable-hdpi/qs_scrubber_track.9.png
deleted file mode 100644
index 0899d3515f1b..000000000000
--- a/packages/SystemUI/res/drawable-hdpi/qs_scrubber_track.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/qs_scrubber_track.9.png b/packages/SystemUI/res/drawable-mdpi/qs_scrubber_track.9.png
deleted file mode 100644
index 22664496db76..000000000000
--- a/packages/SystemUI/res/drawable-mdpi/qs_scrubber_track.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/qs_scrubber_track.9.png b/packages/SystemUI/res/drawable-xhdpi/qs_scrubber_track.9.png
deleted file mode 100644
index 3328add435fb..000000000000
--- a/packages/SystemUI/res/drawable-xhdpi/qs_scrubber_track.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/qs_scrubber_track.9.png b/packages/SystemUI/res/drawable-xxhdpi/qs_scrubber_track.9.png
deleted file mode 100644
index ed651da88800..000000000000
--- a/packages/SystemUI/res/drawable-xxhdpi/qs_scrubber_track.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxxhdpi/qs_scrubber_track.9.png b/packages/SystemUI/res/drawable-xxxhdpi/qs_scrubber_track.9.png
deleted file mode 100644
index 06e120239eb2..000000000000
--- a/packages/SystemUI/res/drawable-xxxhdpi/qs_scrubber_track.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/EasterEgg/res/drawable/ic_close.xml b/packages/SystemUI/res/drawable/faster_emergency_icon.xml
index 60ea36b11fcc..208ff41eaba4 100644
--- a/packages/EasterEgg/res/drawable/ic_close.xml
+++ b/packages/SystemUI/res/drawable/faster_emergency_icon.xml
@@ -1,7 +1,7 @@
<!--
- Copyright (C) 2016 The Android Open Source Project
+Copyright (C) 2018 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the "License");
+ 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
@@ -13,12 +13,18 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
+<!-- TODO: For demo only, will change content after UI team provide new faster emergency icon. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24.0dp"
android:height="24.0dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="#D93025"
+ android:pathData="M0,0h24v24H0z" />
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M19.0,6.41L17.59,5.0 12.0,10.59 6.41,5.0 5.0,6.41 10.59,12.0 5.0,17.59 6.41,19.0 12.0,13.41 17.59,19.0 19.0,17.59 13.41,12.0z"/>
+ android:pathData="M19,3H5c-1.1,0-1.99,0.9,-1.99,2L3,19c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V5c0-1.1-0.9-2-2-2zm-1,11h-4v4h-4v-4H6v-4h4V6h4v4h4v4z" />
+
</vector>
diff --git a/packages/SystemUI/res/layout/contextual.xml b/packages/SystemUI/res/layout/contextual.xml
index 94591e932b5b..c8f0a24aff62 100644
--- a/packages/SystemUI/res/layout/contextual.xml
+++ b/packages/SystemUI/res/layout/contextual.xml
@@ -20,6 +20,7 @@
android:layout_width="@dimen/navigation_key_width"
android:layout_height="match_parent"
android:importantForAccessibility="no"
+ android:focusable="false"
android:clipChildren="false"
android:clipToPadding="false"
>
diff --git a/packages/SystemUI/res/layout/global_actions_wrapped.xml b/packages/SystemUI/res/layout/global_actions_wrapped.xml
index b715def73294..7f4e0d21078f 100644
--- a/packages/SystemUI/res/layout/global_actions_wrapped.xml
+++ b/packages/SystemUI/res/layout/global_actions_wrapped.xml
@@ -3,7 +3,9 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:layout_gravity="top|right"
android:layout_marginBottom="0dp"
+ android:orientation="vertical"
android:paddingTop="@dimen/global_actions_top_padding"
android:clipToPadding="false"
android:theme="@style/qs_theme"
@@ -17,7 +19,19 @@
android:layout_gravity="top|right"
android:gravity="center"
android:orientation="vertical"
- android:padding="12dp"
- android:translationZ="9dp" />
+ android:padding="@dimen/global_actions_padding"
+ android:translationZ="@dimen/global_actions_translate" />
+
+ <!-- For separated button-->
+ <FrameLayout
+ android:id="@+id/separated_button"
+ android:layout_width="@dimen/global_actions_panel_width"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top|right"
+ android:layout_marginTop="6dp"
+ android:gravity="center"
+ android:orientation="vertical"
+ android:padding="@dimen/global_actions_padding"
+ android:translationZ="@dimen/global_actions_translate" />
</com.android.systemui.HardwareUiLayout>
diff --git a/packages/SystemUI/res/layout/menu_ime.xml b/packages/SystemUI/res/layout/menu_ime.xml
index 9130fb454893..8a3a0b19c892 100644
--- a/packages/SystemUI/res/layout/menu_ime.xml
+++ b/packages/SystemUI/res/layout/menu_ime.xml
@@ -17,13 +17,13 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:id="@+id/menu_container"
- android:layout_width="match_parent"
+ android:layout_width="@dimen/navigation_key_width"
android:layout_height="match_parent"
android:importantForAccessibility="no"
>
- <!-- Use width & height=match_parent for parent FrameLayout and buttons because they are placed
- inside a view that has a size controlled by weight. Ensure weight is large enough to support
- icon size. -->
+ <!-- Use nav button width & height=match_parent for parent FrameLayout and buttons because they
+ are placed inside a view that has a size controlled by weight. Ensure weight is large enough to
+ support icon size. -->
<com.android.systemui.statusbar.policy.KeyButtonView
android:id="@+id/menu"
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 88d19f495e93..28466fdfba21 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -161,30 +161,31 @@
style="@style/TextAppearance.NotificationInfo.Button"/>
</LinearLayout>
</LinearLayout>
- <RelativeLayout
+ <com.android.systemui.statusbar.NotificationUndoLayout
android:id="@+id/confirmation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/notification_guts_button_spacing"
- android:layout_marginTop="@dimen/notification_guts_button_spacing"
- android:layout_marginStart="@dimen/notification_guts_button_side_margin"
- android:layout_marginEnd="@dimen/notification_guts_button_side_margin"
android:visibility="gone"
android:orientation="horizontal" >
<TextView
android:id="@+id/confirmation_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_centerVertical="true"
+ android:layout_gravity="start|center_vertical"
+ android:layout_marginStart="@*android:dimen/notification_content_margin_start"
+ android:layout_marginEnd="@*android:dimen/notification_content_margin_start"
android:text="@string/notification_channel_disabled"
style="@style/TextAppearance.NotificationInfo.Confirmation"/>
<TextView
android:id="@+id/undo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
+ android:layout_marginTop="@dimen/notification_guts_button_spacing"
+ android:layout_marginBottom="@dimen/notification_guts_button_spacing"
+ android:layout_marginStart="@dimen/notification_guts_button_side_margin"
+ android:layout_marginEnd="@dimen/notification_guts_button_side_margin"
+ android:layout_gravity="end|center_vertical"
android:text="@string/inline_undo"
style="@style/TextAppearance.NotificationInfo.Button"/>
- </RelativeLayout>
+ </com.android.systemui.statusbar.NotificationUndoLayout>
</com.android.systemui.statusbar.NotificationInfo>
diff --git a/packages/SystemUI/res/layout/notification_snooze.xml b/packages/SystemUI/res/layout/notification_snooze.xml
index ea6ef4cc0012..55e7a8526e1a 100644
--- a/packages/SystemUI/res/layout/notification_snooze.xml
+++ b/packages/SystemUI/res/layout/notification_snooze.xml
@@ -36,7 +36,7 @@
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:paddingStart="@*android:dimen/notification_content_margin_start"
- android:textColor="#DD000000"
+ android:textColor="@color/notification_primary_text_color"
android:paddingEnd="4dp"/>
<ImageView
diff --git a/packages/SystemUI/res/layout/qs_customize_panel_content.xml b/packages/SystemUI/res/layout/qs_customize_panel_content.xml
index d70a37ae15b2..4ce6ef6ed31d 100644
--- a/packages/SystemUI/res/layout/qs_customize_panel_content.xml
+++ b/packages/SystemUI/res/layout/qs_customize_panel_content.xml
@@ -38,7 +38,7 @@
android:navigationContentDescription="@*android:string/action_bar_up_description"
style="?android:attr/toolbarStyle" />
- <android.support.v7.widget.RecyclerView
+ <androidx.recyclerview.widget.RecyclerView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
index 25b117fb2e33..f13f0199f34c 100644
--- a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
@@ -43,7 +43,7 @@
android:layout_weight="0"
android:paddingStart="@dimen/screen_pinning_request_frame_padding"
android:paddingEnd="@dimen/screen_pinning_request_frame_padding"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ android:theme="@style/ScreenPinningRequestTheme">
<ImageView
android:id="@+id/screen_pinning_back_bg_light"
@@ -86,7 +86,7 @@
android:layout_weight="0"
android:paddingStart="@dimen/screen_pinning_request_frame_padding"
android:paddingEnd="@dimen/screen_pinning_request_frame_padding"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ android:theme="@style/ScreenPinningRequestTheme">
<ImageView
android:id="@+id/screen_pinning_home_bg_light"
@@ -129,7 +129,7 @@
android:layout_weight="0"
android:paddingStart="@dimen/screen_pinning_request_frame_padding"
android:paddingEnd="@dimen/screen_pinning_request_frame_padding"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ android:theme="@style/ScreenPinningRequestTheme">
<ImageView
android:id="@+id/screen_pinning_recents_bg_light"
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
index 367c13c92185..420b072a8608 100644
--- a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
@@ -39,7 +39,7 @@
android:layout_height="@dimen/screen_pinning_request_button_width"
android:layout_width="@dimen/screen_pinning_request_button_height"
android:layout_weight="0"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ android:theme="@style/ScreenPinningRequestTheme">
<ImageView
android:id="@+id/screen_pinning_recents_bg_light"
@@ -79,7 +79,7 @@
android:layout_height="@dimen/screen_pinning_request_button_width"
android:layout_width="@dimen/screen_pinning_request_button_height"
android:layout_weight="0"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ android:theme="@style/ScreenPinningRequestTheme">
<ImageView
android:id="@+id/screen_pinning_home_bg_light"
@@ -120,7 +120,7 @@
android:layout_height="@dimen/screen_pinning_request_button_width"
android:layout_width="@dimen/screen_pinning_request_button_height"
android:layout_weight="0"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ android:theme="@style/ScreenPinningRequestTheme">
<ImageView
android:id="@+id/screen_pinning_back_bg_light"
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml
index bac02aa34ed9..f9308cdc504e 100644
--- a/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml
@@ -39,7 +39,7 @@
android:layout_height="@dimen/screen_pinning_request_button_width"
android:layout_width="@dimen/screen_pinning_request_button_height"
android:layout_weight="0"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ android:theme="@style/ScreenPinningRequestTheme">
<ImageView
android:id="@+id/screen_pinning_back_bg_light"
@@ -82,7 +82,7 @@
android:layout_height="@dimen/screen_pinning_request_button_width"
android:layout_width="@dimen/screen_pinning_request_button_height"
android:layout_weight="0"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent" >
+ android:theme="@style/ScreenPinningRequestTheme" >
<ImageView
android:id="@+id/screen_pinning_home_bg_light"
@@ -125,7 +125,7 @@
android:layout_height="@dimen/screen_pinning_request_button_width"
android:layout_width="@dimen/screen_pinning_request_button_height"
android:layout_weight="0"
- android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ android:theme="@style/ScreenPinningRequestTheme">
<ImageView
android:id="@+id/screen_pinning_recents_bg_light"
diff --git a/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml b/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml
index 0ef48ebfc6ed..fa29c7aba0ed 100644
--- a/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml
+++ b/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml
@@ -62,6 +62,7 @@
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical"
+ android:paddingStart="2.5dp"
android:paddingEnd="1dp"
android:visibility="gone" />
<Space
diff --git a/packages/SystemUI/res/layout/status_bar_no_notifications.xml b/packages/SystemUI/res/layout/status_bar_no_notifications.xml
index 1e00e5203255..28b5a40f892a 100644
--- a/packages/SystemUI/res/layout/status_bar_no_notifications.xml
+++ b/packages/SystemUI/res/layout/status_bar_no_notifications.xml
@@ -26,9 +26,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="64dp"
- android:paddingTop="28dp"
+ android:paddingTop="12dp"
+ android:textAppearance="?android:attr/textAppearanceButton"
android:gravity="top|center_horizontal"
android:textColor="?attr/wallpaperTextColor"
- android:textSize="16sp"
android:text="@string/empty_shade_text"/>
</com.android.systemui.statusbar.EmptyShadeView>
diff --git a/packages/SystemUI/res/layout/tuner_shortcut_list.xml b/packages/SystemUI/res/layout/tuner_shortcut_list.xml
index 9aaffb49e652..b4165cf89bda 100644
--- a/packages/SystemUI/res/layout/tuner_shortcut_list.xml
+++ b/packages/SystemUI/res/layout/tuner_shortcut_list.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
-<android.support.v7.widget.RecyclerView
+<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 974c80e51357..fb9b5dfa4c36 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Versteek <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Dit sal verskyn die volgende keer wanneer jy dit in instellings aanskakel."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Versteek"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Jy gebruik tans jou werkprofiel"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Bel"</string>
<string name="stream_system" msgid="7493299064422163147">"Stelsel"</string>
<string name="stream_ring" msgid="8213049469184048338">"Lui"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Terug"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Kennisgewings"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Kortpadsleutels"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Wissel invoermetode"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Wissel sleutelborduitleg"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Programme"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Bystand"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Blaaier"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 612db5558abc..305082f026d7 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ይደበቅ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"በቅንብሮች ውስጥ በሚቀጥለው ጊዜ እንዲበራ በሚያደርጉበት ጊዜ ዳግመኛ ብቅ ይላል።"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ደብቅ"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"የስራ መገለጫዎን እየተጠቀሙ ነው"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"ጥሪ"</string>
<string name="stream_system" msgid="7493299064422163147">"ሥርዓት"</string>
<string name="stream_ring" msgid="8213049469184048338">"ጥሪ"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ተመለስ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"ማሳወቂያዎች"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"የቁልፍ ሰሌዳ አቋራጮች"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"የግቤት ስልት ቀይር"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"የቁልፍ ሰሌዳ ገጽታ ለውጥ"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"መተግበሪያዎች"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"ረዳት"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"አሳሽ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 6e7477dda498..8f197e80abd7 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -534,7 +534,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"هل تريد إخفاء <xliff:g id="TILE_LABEL">%1$s</xliff:g>؟"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"سيظهر مرة أخرى عند تمكينه في الإعدادات المرة التالية."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"إخفاء"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"أنت تستخدم ملفك الشخصي للعمل"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"الاتصال"</string>
<string name="stream_system" msgid="7493299064422163147">"النظام"</string>
<string name="stream_ring" msgid="8213049469184048338">"الرنين"</string>
@@ -697,7 +696,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"رجوع"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"الإشعارات"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"اختصارات لوحة المفاتيح"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"تبديل أسلوب الإدخال"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"تبديل نمط لوحة المفاتيح"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"التطبيقات"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"التطبيق المساعد"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"المتصفح"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index c8cb35526609..c20b5bc1c3b1 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -95,8 +95,7 @@
<string name="accessibility_unlock_button" msgid="128158454631118828">"আনলক কৰক"</string>
<string name="accessibility_waiting_for_fingerprint" msgid="4808860050517462885">"ফিংগাৰপ্ৰিণ্টৰ বাবে ৰৈ থকা হৈছে"</string>
<string name="accessibility_unlock_without_fingerprint" msgid="7541705575183694446">"ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ নকৰাকৈ আনলক কৰক"</string>
- <!-- no translation found for accessibility_scanning_face (769545173211758586) -->
- <skip />
+ <string name="accessibility_scanning_face" msgid="769545173211758586">"চেহেৰা স্কেন কৰি থকা হৈছে"</string>
<string name="accessibility_send_smart_reply" msgid="7766727839703044493">"পঠিয়াওক"</string>
<string name="unlock_label" msgid="8779712358041029439">"আনলক কৰক"</string>
<string name="phone_label" msgid="2320074140205331708">"ফ\'ন খোলক"</string>
@@ -523,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকুৱাবনে?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপুনি ইয়াক পৰৱৰ্তী সময়ত ছেটিংসমূহত অন কৰিলে ই পুনৰ প্ৰকট হ\'ব।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকুৱাওক"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইল ব্যৱহাৰ কৰি আছে"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"কল"</string>
<string name="stream_system" msgid="7493299064422163147">"ছিষ্টেম"</string>
<string name="stream_ring" msgid="8213049469184048338">"ৰিং"</string>
@@ -678,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"উভতি যাওক"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"জাননীসমূহ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"কীব\'ৰ্ড শ্বৰ্টকাটসমূহ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ইনপুট পদ্ধতি সলনি কৰক"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"কীব\'ৰ্ডৰ সজ্জা সলনি কৰক"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"এপ্লিকেশ্বনসমূহ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"সহায়"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ব্ৰাউজাৰ"</string>
@@ -854,6 +852,5 @@
<string name="auto_saver_enabled_text" msgid="874711029884777579">"বেটাৰি চ্চাৰ্জৰ স্তৰ <xliff:g id="PERCENTAGE">%d</xliff:g>%%তকৈ কম হোৱাৰ লগে লগে বেটাৰি সঞ্চয়কাৰী স্বয়ংক্ৰিয়ভাৱে অন হ’ব।"</string>
<string name="open_saver_setting_action" msgid="8314624730997322529">"ছেটিংবোৰ"</string>
<string name="auto_saver_okay_action" msgid="2701221740227683650">"বুজি পালোঁ"</string>
- <!-- no translation found for heap_dump_tile_name (9141031328971226374) -->
- <skip />
+ <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI হীপ ডাম্প কৰক"</string>
</resources>
diff --git a/packages/SystemUI/res/values-as/strings_car.xml b/packages/SystemUI/res/values-as/strings_car.xml
index e8cb6e35fb7b..1c4d7944b451 100644
--- a/packages/SystemUI/res/values-as/strings_car.xml
+++ b/packages/SystemUI/res/values-as/strings_car.xml
@@ -22,8 +22,6 @@
<string name="car_guest" msgid="3738772168718508650">"অতিথি"</string>
<string name="car_add_user" msgid="5245196248349230898">"ব্যৱহাৰকাৰী যোগ কৰক"</string>
<string name="car_new_user" msgid="8142927244990323906">"নতুন ব্যৱহাৰকাৰী"</string>
- <!-- no translation found for user_add_user_message_setup (1791011504259527329) -->
- <skip />
- <!-- no translation found for user_add_user_message_update (3383320289232716179) -->
- <skip />
+ <string name="user_add_user_message_setup" msgid="1791011504259527329">"আপুনি কোনো নতুন ব্য়ৱহাৰকাৰীক যোগ কৰিলে তেখেতে নিজৰ বাবে খালী ঠাই ছেট আপ কৰিব লাগে।"</string>
+ <string name="user_add_user_message_update" msgid="3383320289232716179">"সকলো ব্য়ৱহাৰকাৰীয়ে অইন ব্য়ৱহাৰকাৰীৰ বাবে এপসমূহ আপডেট কৰিব পাৰে।"</string>
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index c975de1cc2fe..239dc20b5011 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlədilsin?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ayarlarda onu aktivləşdirəcəyiniz vaxta qədər o, yenidən görünəcək."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Gizlədin"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"İş profilinizi istifadə edirsiniz"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Zəng"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Zəng Edin"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Geri"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Bildirişlər"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Klaviatura qısa yolları"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Daxiletmə metoduna keçin"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Klaviatura düzümünü dəyişin"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Tətbiqlər"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Yardım"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Brauzer"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 5c34cd247bc0..47eb26623d5e 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -525,7 +525,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li da sakrijete <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ovo će se ponovo pojaviti kada ga sledeći put budete uključili u podešavanjima."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Koristite profil za Work"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Poziv"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Zvono"</string>
@@ -682,7 +681,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Nazad"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Obaveštenja"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Tasterske prečice"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Promeni metod unosa"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Promeni raspored tastature"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikacije"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Aplikacija za pomoć"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Pregledač"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 562925cb9a1b..2db91e839392 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -530,7 +530,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Схаваць <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Гэта паведамленне з\'явіцца зноў у наступны раз, калі вы ўключыце яго ў наладах."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Схаваць"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Вы выкарыстоўваеце свой працоўны профіль"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Выклік"</string>
<string name="stream_system" msgid="7493299064422163147">"Сістэма"</string>
<string name="stream_ring" msgid="8213049469184048338">"Званок"</string>
@@ -689,7 +688,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Назад"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Апавяшчэнні"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Спалучэнні клавіш"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Пераключэнне рэжыму ўводу"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Пераключыць раскладку клавіятуры"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Праграмы"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Памочнік"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Браўзер"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index da70fb481e6b..850977dc8096 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Да се скрие ли „<xliff:g id="TILE_LABEL">%1$s</xliff:g>“?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Бързите настройки ще се покажат отново следващия път, когато ги включите от „Настройки“."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Скриване"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Използвате служебния си потребителски профил"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Обаждане"</string>
<string name="stream_system" msgid="7493299064422163147">"Система"</string>
<string name="stream_ring" msgid="8213049469184048338">"Позвъняване"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Назад"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Известия"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Клавишни комбинации"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Превключване на метода на въвеждане"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Превкл. на клавиат. подредба"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Приложения"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Помощно приложение"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Браузър"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index d34193f67a69..eacf30cc2809 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -472,8 +472,8 @@
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"আপনার প্রতিষ্ঠান আপনার অফিস প্রোফাইলে একটি সার্টিফিকেট কর্তৃপক্ষ ইনস্টল করেছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।"</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"এই ডিভাইসে একটি সার্টিফিকেট কর্তৃপক্ষ ইনস্টল করা আছে। আপনার নিরাপদ নেটওয়ার্ক ট্রাফিকে নজর রাখা হতে পারে বা তাতে পরিবর্তন করা হতে পারে।"</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিকের উপরে নজর রাখে।"</string>
- <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"আপনি <xliff:g id="VPN_APP">%1$s</xliff:g> এ সংযুক্ত রয়েছেন, যা আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপের উপর নজর রাখতে পারে।"</string>
- <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"আপনি <xliff:g id="VPN_APP_0">%1$s</xliff:g> এবং <xliff:g id="VPN_APP_1">%2$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন, যেগুলি আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপের উপর নজর রাখতে পারে।"</string>
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"আপনি <xliff:g id="VPN_APP">%1$s</xliff:g> এ সংযুক্ত রয়েছেন, যা আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক অ্যাক্টিভিটির উপর নজর রাখতে পারে।"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"আপনি <xliff:g id="VPN_APP_0">%1$s</xliff:g> এবং <xliff:g id="VPN_APP_1">%2$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন, যেগুলি আপনার ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক অ্যাক্টিভিটির উপর নজর রাখতে পারে।"</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"আপনার কর্মস্থলের প্রোফাইল <xliff:g id="VPN_APP">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছে, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে।"</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"আপনার ব্যক্তিগত প্রোফাইল <xliff:g id="VPN_APP">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছে, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে৷"</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"আপনার ডিভাইসটি <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> এর দ্বারা পরিচালিত৷"</string>
@@ -481,20 +481,20 @@
<string name="monitoring_description_do_body" msgid="3639594537660975895">"আপনার প্রশাসক আপনার ডিভাইসের লোকেশন তথ্য সহ এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্স, ডেটা নিরীক্ষণ ও পরিচালনা করতে পারেন।"</string>
<string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
<string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"আরও জানুন"</string>
- <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"আপনি <xliff:g id="VPN_APP">%1$s</xliff:g> এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করবে৷"</string>
+ <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"আপনি <xliff:g id="VPN_APP">%1$s</xliff:g> এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্ক অ্যাক্টিভিটি নিরীক্ষণ করবে৷"</string>
<string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string>
<string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN সেটিংস খুলুন"</string>
<string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"বিশ্বস্ত শংসাপত্রগুলি খুলুন"</string>
<string name="monitoring_description_network_logging" msgid="7223505523384076027">"আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিক নিরীক্ষণ করে।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।"</string>
- <string name="monitoring_description_vpn" msgid="4445150119515393526">"আপনি VPN সংযোগ সেট আপ করার জন্য একটি অ্যাপ্লিকেশানকে অনুমতি দিন৷\n\nএই অ্যাপ্লিকেশানটি ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার ডিভাইস এবং নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে।"</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"আপনার কর্মস্থলের প্রোফাইলটি <xliff:g id="ORGANIZATION">%1$s</xliff:g> দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ইমেল, অ্যাপ্স ও ওয়েবসাইট সহ কর্মস্থলের নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সঙ্গে যোগাযোগ করুন।\n\nএছাড়া আপনি একটি VPN এর সাথেও সংযুক্ত যা আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে।"</string>
+ <string name="monitoring_description_vpn" msgid="4445150119515393526">"আপনি VPN সংযোগ সেট আপ করার জন্য একটি অ্যাপ্লিকেশানকে অনুমতি দিন৷\n\nএই অ্যাপ্লিকেশানটি ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার ডিভাইস এবং নেটওয়ার্কের অ্যাক্টিভিটি নিরীক্ষণ করতে পারে।"</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"আপনার কর্মস্থলের প্রোফাইলটি <xliff:g id="ORGANIZATION">%1$s</xliff:g> দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ইমেল, অ্যাপ্স ও ওয়েবসাইট সহ কর্মস্থলের নেটওয়ার্ক অ্যাক্টিভিটি নিরীক্ষণ করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সঙ্গে যোগাযোগ করুন।\n\nএছাড়া আপনি একটি VPN এর সাথেও সংযুক্ত যা আপনার নেটওয়ার্ক অ্যাক্টিভিটি নিরীক্ষণ করতে পারে।"</string>
<string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
<string name="monitoring_description_app" msgid="1828472472674709532">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে৷"</string>
- <string name="monitoring_description_app_personal" msgid="484599052118316268">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার ব্যক্তিগত নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string>
- <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> এর সাথে সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করবে৷"</string>
- <string name="monitoring_description_app_work" msgid="4612997849787922906">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি <xliff:g id="APPLICATION">%2$s</xliff:g> এর সাথে সংযুক্ত, যেটি ইমেল, অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক কার্যকলাপের উপরে নজর রাখতে পারে।\n\nআরও তথ্যের জন্য প্রশাসকের সাথে যোগাযোগ করুন।"</string>
- <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> এর সাথে সংযুক্ত, যেটি ইমেল অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক কার্যকলাপের উপরে নজর রাখতে পারে।\n\n এ ছাড়াও আপনি <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> এর সাথে সংযুক্ত, যেটি আপনার ব্যক্তিগত নেটওয়ার্কে নজর রাখে।"</string>
+ <string name="monitoring_description_app_personal" msgid="484599052118316268">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার ব্যক্তিগত নেটওয়ার্ক অ্যাক্টিভিটি নিরীক্ষণ করতে পারে৷"</string>
+ <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> এর সাথে সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার ব্যক্তিগত নেটওয়ার্কের অ্যাক্টিভিটি নিরীক্ষণ করবে৷"</string>
+ <string name="monitoring_description_app_work" msgid="4612997849787922906">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি <xliff:g id="APPLICATION">%2$s</xliff:g> এর সাথে সংযুক্ত, যেটি ইমেল, অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক অ্যাক্টিভিটির উপরে নজর রাখতে পারে।\n\nআরও তথ্যের জন্য প্রশাসকের সাথে যোগাযোগ করুন।"</string>
+ <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কর্মস্থলের প্রোফাইল পরিচালনা করে। প্রোফাইলটি <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> এর সাথে সংযুক্ত, যেটি ইমেল অ্যাপ, ও ওয়েবসাইট সহ আপনার কর্মস্থলের নেটওয়ার্ক অ্যাক্টিভিটির উপরে নজর রাখতে পারে।\n\n এ ছাড়াও আপনি <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> এর সাথে সংযুক্ত, যেটি আপনার ব্যক্তিগত নেটওয়ার্কে নজর রাখে।"</string>
<string name="keyguard_indication_trust_granted" msgid="4985003749105182372">"<xliff:g id="USER_NAME">%1$s</xliff:g> এর জন্য আনলক করা হয়েছে"</string>
<string name="keyguard_indication_trust_managed" msgid="8319646760022357585">"<xliff:g id="TRUST_AGENT">%1$s</xliff:g> চালু আছে"</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"আপনি নিজে আনলক না করা পর্যন্ত ডিভাইসটি লক হয়ে থাকবে"</string>
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকাবেন?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপনি পরের বার সেটিংস-এ এটি চালু করলে এটি উপস্থিত হবে"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকান"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"আপনি আপনার কাজের প্রোফাইল ব্যবহার করছেন"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"কল"</string>
<string name="stream_system" msgid="7493299064422163147">"সিস্টেম"</string>
<string name="stream_ring" msgid="8213049469184048338">"রিং"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"পিছনে"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"বিজ্ঞপ্তিগুলি"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"কীবোর্ড শর্টকাট"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ইনপুট পদ্ধতি পাল্টান"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"কীবোর্ড লে-আউট পাল্টান"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"অ্যাপ্লিকেশানগুলি"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"সহযোগিতা"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ব্রাউজার"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 73d9b39e0523..0303ffd50755 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -525,7 +525,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li sakriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Pojavit će se sljedeći put kada opciju uključite u postavkama."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Koristite svoj profil za posao"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Poziv"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Zvono"</string>
@@ -684,7 +683,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Nazad"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Obavještenja"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Prečice tastature"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Promjena načina unosa"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Zamijeni raspored tastature"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikacije"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Pomoć"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Preglednik"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 4fb481333818..171fd1ab8125 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vols amagar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tornarà a mostrar-se la propera vegada que l\'activis a la configuració."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Amaga"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estàs utilitzant el perfil professional"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Trucada"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"To de trucada"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Enrere"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificacions"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Tecles de drecera"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Canvia el mètode d\'introducció"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Canvia la disposició de teclat"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicacions"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistència"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navegador"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 90a6b5856b9c..d72b1d1adaa6 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -530,7 +530,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Skrýt <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tato položka se znovu zobrazí, až ji v nastavení znovu zapnete."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skrýt"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Používáte pracovní profil"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Hovor"</string>
<string name="stream_system" msgid="7493299064422163147">"Systém"</string>
<string name="stream_ring" msgid="8213049469184048338">"Vyzvánění"</string>
@@ -689,7 +688,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Zpět"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Oznámení"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Klávesové zkratky"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Přepnout metodu zadávání"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Přepnout rozložení klávesnice"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikace"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistence"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Prohlížeč"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 253f2c5c230f..fff619b61590 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vil du skjule <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Den vises igen, næste gang du aktiverer den i indstillingerne."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skjul"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du bruger din arbejdsprofil"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Ring op"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ring"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Tilbage"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Underretninger"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Tastaturgenveje"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Skift indtastningsmetode"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Skift tastaturlayout"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applikationer"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistance"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index d59916090583..d3d945803eac 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -526,7 +526,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ausblenden?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Sie wird wieder eingeblendet, wenn du sie in den Einstellungen erneut aktivierst."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ausblenden"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du verwendest dein Arbeitsprofil."</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Anruf"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Klingelton"</string>
@@ -681,7 +680,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Zurück"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Benachrichtigungen"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Tastenkombinationen"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Eingabemethode wechseln"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Tastaturlayout wechseln"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Apps"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistent"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 6414c05787bb..45e1b1ba47f4 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Απόκρυψη <xliff:g id="TILE_LABEL">%1$s</xliff:g>;"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Θα εμφανιστεί ξανά την επόμενη φορά που θα το ενεργοποιήσετε στις ρυθμίσεις."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Απόκρυψη"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Χρησιμοποιείτε το προφίλ εργασίας σας"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Κλήση"</string>
<string name="stream_system" msgid="7493299064422163147">"Σύστημα"</string>
<string name="stream_ring" msgid="8213049469184048338">"Κλήση"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Πίσω"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Ειδοποιήσεις"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Συντομεύσεις πληκτρολογίου"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Εναλλαγή μεθόδου εισαγωγής"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Αλλαγή διάταξης πληκτρολογίου"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Εφαρμογές"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Υποβοήθηση"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Πρόγραμμα περιήγησης"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 766b241f72e9..561601dfc63d 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Call"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ring"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Back"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard shortcuts"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Switch input method"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Switch keyboard layout"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assist"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 306723ae11c7..efa8ad277210 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Call"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ring"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Back"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard shortcuts"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Switch input method"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Switch keyboard layout"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assist"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 766b241f72e9..561601dfc63d 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Call"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ring"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Back"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard shortcuts"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Switch input method"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Switch keyboard layout"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assist"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 766b241f72e9..561601dfc63d 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"You\'re using your work profile"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Call"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ring"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Back"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Keyboard shortcuts"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Switch input method"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Switch keyboard layout"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assist"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 11ca904c5fa3..881ee908a63e 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎Hide ‎‏‎‎‏‏‎<xliff:g id="TILE_LABEL">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎It will reappear the next time you turn it on in settings.‎‏‎‎‏‎"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎Hide‎‏‎‎‏‎"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‎‎You\'re using your work profile‎‏‎‎‏‎"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‎‎Call‎‏‎‎‏‎"</string>
<string name="stream_system" msgid="7493299064422163147">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎System‎‏‎‎‏‎"</string>
<string name="stream_ring" msgid="8213049469184048338">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎Ring‎‏‎‎‏‎"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎Back‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎‎‎‎Notifications‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‎‏‏‎‏‎‎Keyboard Shortcuts‎‏‎‎‏‎"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎Switch input method‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎Switch keyboard layout‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‏‎‏‏‎‎Applications‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎Assist‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‏‎Browser‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index c712070c4de3..6681dbb57db8 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"¿Ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá a aparecer la próxima vez que se active en la configuración."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando tu perfil de trabajo"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Llamada"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Hacer sonar"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Atrás"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificaciones"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Combinación de teclas"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Cambiar método de entrada"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Cambiar diseño del teclado"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicaciones"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistencia"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navegador"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 6797aea90343..27daa5c920ae 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"¿Ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá a aparecer la próxima vez que actives esta opción en Ajustes."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando tu perfil de trabajo"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Llamada"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Tono"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Atrás"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificaciones"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Combinaciones de teclas"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Cambiar método de introducción"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Cambiar diseño del teclado"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicaciones"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistencia"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navegador"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 29b45577a105..c309294e5c51 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Kas peita <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"See kuvatakse uuesti järgmisel korral, kui selle seadetes sisse lülitate."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Peida"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Kasutate oma tööprofiili"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Kõne"</string>
<string name="stream_system" msgid="7493299064422163147">"Süsteem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Helin"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Tagasi"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Märguanded"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Klaviatuuri otseteed"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Sisestusmeetodi vahetamine"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Klaviatuuripaigutuse vahetus"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Rakendused"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Abi"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Brauser"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 190a27d093d2..d2dbc79c012d 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ezkutatu nahi duzu?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ezarpenetan aktibatzen duzun hurrengoan agertuko da berriro."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ezkutatu"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Work profila erabiltzen ari zara"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Deia"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Jo tonua"</string>
@@ -564,8 +563,8 @@
<string name="status_bar" msgid="4877645476959324760">"Egoera-barra"</string>
<string name="overview" msgid="4018602013895926956">"Ikuspegi orokorra"</string>
<string name="demo_mode" msgid="2532177350215638026">"Sistemaren erabiltzaile-interfazearen demo modua"</string>
- <string name="enable_demo_mode" msgid="4844205668718636518">"Gaitu proba modua"</string>
- <string name="show_demo_mode" msgid="2018336697782464029">"Erakutsi proba modua"</string>
+ <string name="enable_demo_mode" msgid="4844205668718636518">"Gaitu demo modua"</string>
+ <string name="show_demo_mode" msgid="2018336697782464029">"Erakutsi demo modua"</string>
<string name="status_bar_ethernet" msgid="5044290963549500128">"Ethernet"</string>
<string name="status_bar_alarm" msgid="8536256753575881818">"Alarma"</string>
<string name="status_bar_work" msgid="6022553324802866373">"Work profila"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Atzera"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Jakinarazpenak"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Lasterbideak"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Aldatu idazketa-metodoa"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Aldatu teklatuaren diseinua"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikazioak"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Laguntzailea"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Arakatzailea"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index e0d330a321f9..34ab46f62ccc 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> مخفی شود؟"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"دفعه بعد که آن را روشن کنید، در تنظیمات نشان داده می‌شود."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"پنهان کردن"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"درحال استفاده از نمایه کاری‌تان هستید"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"تماس"</string>
<string name="stream_system" msgid="7493299064422163147">"سیستم"</string>
<string name="stream_ring" msgid="8213049469184048338">"زنگ زدن"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"برگشت"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"اعلان‌ها"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"میان‌برهای صفحه‌کلید"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"تغییر روش ورودی"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"تغییر طرح‌بندی صفحه‌کلید"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"برنامه‌ها"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"دستیار"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"مرورگر"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 428f8f896bb5..baa7822cd90d 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Piilotetaanko <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Se tulee takaisin näkyviin, kun seuraavan kerran otat sen käyttöön asetuksissa."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Piilota"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Käytät työprofiilia."</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Puhelu"</string>
<string name="stream_system" msgid="7493299064422163147">"Järjestelmä"</string>
<string name="stream_ring" msgid="8213049469184048338">"Soittoääni"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Takaisin"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Ilmoitukset"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Pikanäppäimet"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Vaihda syöttötapaa"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Vaihda näppäimistöasettelu"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Sovellukset"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Apusovellus"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Selain"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index d1980b42fdee..bb4cdfb98fdf 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Masquer <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Cet élément réapparaîtra la prochaine fois que vous l\'activerez dans les paramètres."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Masquer"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Vous utilisez votre profil professionnel."</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Appeler"</string>
<string name="stream_system" msgid="7493299064422163147">"Système"</string>
<string name="stream_ring" msgid="8213049469184048338">"Sonnerie"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Précédent"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Raccourcis clavier"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Changer de méthode d\'entrée"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Changer la dispos. du clavier"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistance"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navigateur"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index f14bde50567e..e38e83c0f53e 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Masquer <xliff:g id="TILE_LABEL">%1$s</xliff:g> ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Cet élément réapparaîtra la prochaine fois que vous l\'activerez dans les paramètres."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Masquer"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Vous utilisez votre profil professionnel."</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Appel"</string>
<string name="stream_system" msgid="7493299064422163147">"Système"</string>
<string name="stream_ring" msgid="8213049469184048338">"Sonnerie"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Précédent"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Raccourcis clavier"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Changer le mode de saisie"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Changer disposition du clavier"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applications"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistance"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navigateur"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index bd2950784a17..0e8b0933b39a 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Queres ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá aparecer a próxima vez que se active na configuración."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Estás usando o perfil de traballo"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Chamada"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ton"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Volver"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificacións"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Atallos de teclado"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Cambiar de método de introdución"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Cambiar de deseño de teclado"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicacións"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistente"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navegador"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index fb707e768125..a730f018d998 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ને છુપાવીએ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"તે સેટિંગ્સમાં તમે તેને ચાલુ કરશો ત્યારે આગલી વખતે ફરીથી દેખાશે."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"છુપાવો"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"તમે તમારી કાર્ય પ્રોફાઇલનો ઉપયોગ કરી રહ્યાં છો"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"કૉલ કરો"</string>
<string name="stream_system" msgid="7493299064422163147">"સિસ્ટમ"</string>
<string name="stream_ring" msgid="8213049469184048338">"રિંગ વગાડો"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"પાછળ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"નોટિફિકેશનો"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"કીબોર્ડ શૉર્ટકટ્સ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ઇનપુટ પદ્ધતિ સ્વિચ કરો"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"કીબોર્ડ લેઆઉટ સ્વિચ કરો"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ઍપ્લિકેશનો"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"સહાય"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"બ્રાઉઝર"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index ef4cd82e4b4f..7049044688ca 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -409,7 +409,7 @@
<string name="user_add_user" msgid="5110251524486079492">"उपयोगकर्ता जोड़ें"</string>
<string name="user_new_user_name" msgid="426540612051178753">"नया उपयोगकर्ता"</string>
<string name="guest_nickname" msgid="8059989128963789678">"मेहमान"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"अतिथि जोड़ें"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"मेहमान जोड़ें"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"अतिथि को निकालें"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"अतिथि को निकालें?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"इस सत्र के सभी ऐप्स और डेटा को हटा दिया जाएगा."</string>
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> को छिपाएं?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"जब आप उसे अगली बार सेटिंग में चालू करेंगे तो वह फिर से दिखाई देगी."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"छिपाएं"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"आप अपनी कार्य प्रोफ़ाइल का उपयोग कर रहे हैं"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"कॉल करें"</string>
<string name="stream_system" msgid="7493299064422163147">"सिस्‍टम"</string>
<string name="stream_ring" msgid="8213049469184048338">"घंटी बजाएं"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"वापस जाएं"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"सूचनाएं"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"कीबोर्ड शॉर्टकट"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"इनपुट का तरीका बदलें"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"कीबोर्ड लेआउट बदलें"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ऐप्लिकेशन"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"सहायक"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ब्राउज़र"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 61d72a5bc797..a77b7ff03b1b 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -525,7 +525,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li sakriti pločicu <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ponovo će se pojaviti kada je sljedeći put uključite u postavkama."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Upotrebljavate radni profil"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Nazovi"</string>
<string name="stream_system" msgid="7493299064422163147">"Sustav"</string>
<string name="stream_ring" msgid="8213049469184048338">"Zvoni"</string>
@@ -682,7 +681,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Natrag"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Obavijesti"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Tipkovni prečaci"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Promjena načina unosa"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Promjena rasporeda tipkovnice"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikacije"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Pomoć"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Preglednik"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 752bba9c3b38..d6e2cb6db386 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Elrejti ezt: <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Újból megjelenik majd, amikor ismét engedélyezi a beállítások között."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Elrejtés"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"A munkaprofilt használja"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Telefonhívás"</string>
<string name="stream_system" msgid="7493299064422163147">"Rendszer"</string>
<string name="stream_ring" msgid="8213049469184048338">"Csörgetés"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Vissza"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Értesítések"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Billentyűkódok"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Beviteli mód váltása"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Billentyűzetkiosztás váltása"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Alkalmazások"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Segédalkalmazás"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Böngésző"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 6cb5d7c0b86e..2e8c9bebb0cb 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -69,14 +69,14 @@
<string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ընթացիկ հաշվի օգտատերը չի կարող միացնել USB վրիպազերծումը: Այս գործառույթը միացնելու համար մուտք գործեք հիմնական օգտատիրոջ հաշվով:"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Խոշորացնել` էկրանը լցնելու համար"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"Ձգել` էկրանը լցնելու համար"</string>
- <string name="global_action_screenshot" msgid="8329831278085426283">"Էկրանի պատկեր"</string>
- <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Էկրանի պատկերը պահվում է…"</string>
- <string name="screenshot_saving_title" msgid="8242282144535555697">"Էկրանի պատկերը պահվում է..."</string>
- <string name="screenshot_saved_title" msgid="5637073968117370753">"Էկրանի պատկերը պահվեց"</string>
- <string name="screenshot_saved_text" msgid="7574667448002050363">"Հպեք՝ էկրանի պատկերը տեսնելու համար"</string>
- <string name="screenshot_failed_title" msgid="7612509838919089748">"Չհաջողվեց պահել էկրանի պատկերը"</string>
+ <string name="global_action_screenshot" msgid="8329831278085426283">"Սքրինշոթ"</string>
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Սքրինշոթը պահվում է…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Սքրինշոթը պահվում է..."</string>
+ <string name="screenshot_saved_title" msgid="5637073968117370753">"Սքրինշոթը պահվեց"</string>
+ <string name="screenshot_saved_text" msgid="7574667448002050363">"Հպեք՝ սքրինշոթը տեսնելու համար"</string>
+ <string name="screenshot_failed_title" msgid="7612509838919089748">"Չհաջողվեց պահել սքրինշոթը"</string>
<string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Փորձեք նորից"</string>
- <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Չհաջողվեց պահել էկրանի պատկերը անբավարար հիշողության պատճառով"</string>
+ <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Չհաջողվեց պահել սքրինշոթը անբավարար հիշողության պատճառով"</string>
<string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Հավելվածը կամ ձեր կազմակերպությունը չի թույլատրում էկրանի պատկերի ստացումը"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ֆայլերի փոխանցման ընտրանքներ"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Միացնել որպես մեդիա նվագարկիչ (MTP)"</string>
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Թաքցնե՞լ <xliff:g id="TILE_LABEL">%1$s</xliff:g>-ը:"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Այն դարձյալ կհայտնվի, երբ նորից միացնեք կարգավորումներում:"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Թաքցնել"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Դուք օգտագործում եք ձեր աշխատանքային պրոֆիլը"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Զանգ"</string>
<string name="stream_system" msgid="7493299064422163147">"Համակարգ"</string>
<string name="stream_ring" msgid="8213049469184048338">"Զանգ"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Հետ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Ծանուցումներ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Ստեղնային դյուրանցումներ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Փոխել ներածման եղանակը"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Դասավորության փոխարկում"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Հավելվածներ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Օգնություն"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Դիտարկիչ"</string>
@@ -815,7 +814,7 @@
<string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> հավելված"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Ծանուցումներ"</string>
<string name="notification_channel_battery" msgid="5786118169182888462">"Մարտկոց"</string>
- <string name="notification_channel_screenshot" msgid="6314080179230000938">"Էկրանի պատկերներ"</string>
+ <string name="notification_channel_screenshot" msgid="6314080179230000938">"Սքրինշոթներ"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Ընդհանուր հաղորդագրություններ"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Տարածք"</string>
<string name="notification_channel_hints" msgid="7323870212489152689">"Հուշումներ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index eb0cf08ee581..d75d1217ab64 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Sembunyikan <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ini akan muncul kembali saat Anda mengaktifkannya dalam setelan."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sembunyikan"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Anda menggunakan profil kerja"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Telepon"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Dering"</string>
@@ -580,7 +579,7 @@
<string name="tuner_warning_title" msgid="7094689930793031682">"Tidak semua orang menganggapnya baik"</string>
<string name="tuner_warning" msgid="8730648121973575701">"Penyetel Antarmuka Pengguna Sistem memberikan cara tambahan untuk mengubah dan menyesuaikan antarmuka pengguna Android. Fitur eksperimental ini dapat berubah, rusak, atau menghilang dalam rilis di masa mendatang. Lanjutkan dengan hati-hati."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"Fitur eksperimental ini dapat berubah, rusak, atau menghilang dalam rilis di masa mendatang. Lanjutkan dengan hati-hati."</string>
- <string name="got_it" msgid="2239653834387972602">"Mengerti"</string>
+ <string name="got_it" msgid="2239653834387972602">"Oke"</string>
<string name="tuner_toast" msgid="603429811084428439">"Selamat! Penyetel Antarmuka Pengguna Sistem telah ditambahkan ke Setelan"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"Hapus dari Setelan"</string>
<string name="remove_from_settings_prompt" msgid="6069085993355887748">"Hapus Penyetel Antarmuka Pengguna Sistem dari Setelan dan berhenti menggunakan semua fiturnya?"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Kembali"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifikasi"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Pintasan Keyboard"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Beralih metode masukan"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Ganti tata letak keyboard"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikasi"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Bantuan"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index a8357e76398a..eaad622b626b 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Fela <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Þetta birtist aftur næst þegar þú kveikir á því í stillingunum."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fela"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Þú ert að nota vinnusniðið"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Símtal"</string>
<string name="stream_system" msgid="7493299064422163147">"Kerfi"</string>
<string name="stream_ring" msgid="8213049469184048338">"Hringing"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Til baka"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Tilkynningar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Flýtilyklar"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Skipta um innsláttaraðferð"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Skipta um lyklaskipan"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Forrit"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Aðstoð"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Vafri"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 26b607ed776b..7bd52d46e1a0 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Nascondere <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Verranno visualizzate di nuovo quando le riattiverai nelle impostazioni."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Nascondi"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Stai utilizzando il profilo di lavoro"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Chiamata"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Suoneria"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Indietro"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notifiche"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Scorciatoie da tastiera"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Cambia metodo di immissione"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Cambia layout della tastiera"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Applicazioni"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistenza"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index ed9df68b9856..cac6d3197b75 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -528,7 +528,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"להסתיר<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"יופיע מחדש בפעם הבאה שתפעיל את האפשרות בהגדרות."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"הסתר"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"אתה משתמש בפרופיל העבודה שלך"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"שיחה"</string>
<string name="stream_system" msgid="7493299064422163147">"מערכת"</string>
<string name="stream_ring" msgid="8213049469184048338">"צלצול"</string>
@@ -687,7 +686,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"הקודם"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"הודעות"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"מקשי קיצור במקלדת"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"החלפת שיטת קלט"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"החלפה של פריסת מקלדת"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"אפליקציות"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"מסייע"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"דפדפן"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index cc2613b696f1..10e956860279 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>を非表示にしますか?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"次回、設定でONにすると再表示されます。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"非表示"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"仕事用プロファイルを使用しています"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"発信"</string>
<string name="stream_system" msgid="7493299064422163147">"システム"</string>
<string name="stream_ring" msgid="8213049469184048338">"着信音"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"戻る"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"キーボード ショートカット"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"入力方法の切り替え"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"キーボード レイアウトの切り替え"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"アプリ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"アシスト"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ブラウザ"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 1994e7205cc2..c28fab705aac 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"დაიმალოს <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ის კვლავ გამოჩნდება, როდესაც პარამეტრებში ჩართავთ"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"დამალვა"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"თქვენ სამსახურის პროფილს იყენებთ"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"დარეკვა"</string>
<string name="stream_system" msgid="7493299064422163147">"სისტემა"</string>
<string name="stream_ring" msgid="8213049469184048338">"დარეკვა"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"უკან"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"შეტყობინებები"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"კლავიატურის მალსახმობები"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"შეყვანის მეთოდის გადართვა"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"კლავიატურის განლაგების გადართვა"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"აპლიკაციები"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"დახმარება"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ბრაუზერი"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 93791cb910b5..f256d33c04e7 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> жасыру керек пе?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ол сіз оны параметрлерде келесі қосқанда қайта пайда болады."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Жасыру"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Сіз жұмыс профиліңізді пайдаланып жатырсыз"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Қоңырау шалу"</string>
<string name="stream_system" msgid="7493299064422163147">"Жүйе"</string>
<string name="stream_ring" msgid="8213049469184048338">"Шылдырлау"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Артқа"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Хабарландырулар"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Пернелер тіркесімдері"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Енгізу әдісін ауыстыру"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Пернетақта орналасуын ауыстыру"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Қолданбалар"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Көмекші"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Браузер"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 21ad0096f560..2c9a55481595 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"លាក់ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"វា​នឹង​បង្ហាញ​ពេល​ក្រោយ​ ពេល​ដែល​អ្នក​បើក​ក្នុង​ការ​កំណត់។"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"លាក់"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"អ្នកកំពុងប្រើប្រវត្តិរូបការងាររបស់អ្នក"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"ហៅ"</string>
<string name="stream_system" msgid="7493299064422163147">"ប្រព័ន្ធ"</string>
<string name="stream_ring" msgid="8213049469184048338">"រោទ៍"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ថយក្រោយ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"ការជូនដំណឹង"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"ផ្លូវកាត់ក្ដារចុច"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ប្ដូរវិធីសាស្ត្របញ្ចូល"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"ប្ដូរប្លង់ក្ដារចុច"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"កម្មវិធី"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"ជំនួយ"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"កម្មវិធីរុករក"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index e789bb27b770..8760d001e43c 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ಮರೆಮಾಡುವುದೇ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ನೀವು ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿದಾಗ ಅದು ಮರುಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ಮರೆಮಾಡಿ"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು ನೀವು ಬಳಸುತ್ತಿರುವಿರಿ"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"ಕರೆಮಾಡಿ"</string>
<string name="stream_system" msgid="7493299064422163147">"ಸಿಸ್ಟಂ"</string>
<string name="stream_ring" msgid="8213049469184048338">"ರಿಂಗ್"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ಹಿಂದೆ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"ಅಧಿಸೂಚನೆಗಳು"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ಇನ್‌ಪುಟ್‌‌ ವಿಧಾನ ಬದಲಿಸಿ"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"ಕೀಬೋರ್ಡ್‌ ಲೇಔಟ್‌ ಬದಲಾಯಿಸಿ"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳು"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"ಸಹಾಯ ಮಾಡು"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ಬ್ರೌಸರ್"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 766f0d980134..7983966f0b3e 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>을(를) 숨기시겠습니까?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"다음번에 설정에서 사용 설정하면 다시 표시됩니다."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"숨기기"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"직장 프로필을 사용하고 있습니다."</string>
<string name="stream_voice_call" msgid="4410002696470423714">"전화걸기"</string>
<string name="stream_system" msgid="7493299064422163147">"시스템"</string>
<string name="stream_ring" msgid="8213049469184048338">"벨소리"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"뒤로"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"알림"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"단축키"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"입력 방법 전환"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"키보드 레이아웃 전환"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"애플리케이션"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"지원"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"브라우저"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 02cc59625f60..5ee60c9947bf 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> жашырылсынбы?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Бул кийинки жолу жөндөөлөрдөн күйгүзүлгөндө кайра көрүнөт."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Жашыруу"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Жумуш профилиңизди колдонуп жатасыз"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Чалуу"</string>
<string name="stream_system" msgid="7493299064422163147">"Тутум"</string>
<string name="stream_ring" msgid="8213049469184048338">"Шыңгыратуу"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Артка"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Билдирмелер"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Ыкчам баскычтар"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Киргизүү ыкмасын которуштуруу"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Баскычтоп калыбын которуштуруу"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Колдонмолор"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Көмөкчү"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Серепчи"</string>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index c59dbdc32158..bb0c6f6acb06 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -24,8 +24,6 @@
<dimen name="brightness_mirror_height">40dp</dimen>
- <!-- Width for the spacer, used between QS tiles. -->
- <dimen name="qs_quick_tile_space_width">38dp</dimen>
<dimen name="qs_tile_margin_top">2dp</dimen>
<dimen name="qs_header_tooltip_height">24dp</dimen>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 0a0da1cfb551..7e2375e827a0 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ເຊື່ອງ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ຫຼື​ບໍ່?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"​ມັນ​ຈະ​ສະ​ແດງ​ຄືນ​ໃໝ່​ເມື່ອ​ທ່ານ​ເປີດ​ນຳ​ໃຊ້​ມັນ​ໃນ​ການ​ຕັ້ງ​ຄ່າ​ຄັ້ງ​ຕໍ່​ໄປ."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ເຊື່ອງ"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ທ່ານກຳລັງໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"ໂທ"</string>
<string name="stream_system" msgid="7493299064422163147">"ລະ​ບົບ"</string>
<string name="stream_ring" msgid="8213049469184048338">"​ເຕືອນ​ດ້ວຍ​ສຽງ"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ກັບຄືນ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"ການແຈ້ງເຕືອນ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"ປຸ່ມລັດແປ້ນພິມ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ສະລັບຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"ສະຫຼັບແປ້ນພິມ"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ແອັບພລິເຄຊັນ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"ຕົວຊ່ວຍ"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ໂປຣແກຣມທ່ອງເວັບ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index fc893f8ee2c3..d784ba69e6a6 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -528,7 +528,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Slėpti „<xliff:g id="TILE_LABEL">%1$s</xliff:g>“?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tai bus vėl parodyta, kai kitą kartą įjungsite tai nustatymuose."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Slėpti"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Naudojate darbo profilį"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Skambutis"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Skambutis"</string>
@@ -687,7 +686,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Atgal"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Pranešimai"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Spartieji klavišai"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Perjungti įvesties metodą"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Perjungti klaviat. išdėstymą"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Programos"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Pagalbinė programa"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Naršyklė"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 8eeea1618e31..86e2e4c0ff0d 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -525,7 +525,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vai paslēpt vienumu <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tas tiks atkārtoti parādīts, kad nākamreiz ieslēgsiet to iestatījumos."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Paslēpt"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Jūs izmantojat darba profilu."</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Zvans"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistēma"</string>
<string name="stream_ring" msgid="8213049469184048338">"Zvans"</string>
@@ -682,7 +681,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Atpakaļ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Paziņojumi"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Īsinājumtaustiņi"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Pārslēgt ievades metodi"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Mainīt tastatūras izkārtojumu"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Lietojumprogrammas"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Palīgs"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Pārlūkprogramma"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 7e1a59d75839..88ea1624bf9e 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Сокриј <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ќе се појави повторно следниот пат кога ќе го вклучите во поставки."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сокриј"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Го користите работниот профил"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Повик"</string>
<string name="stream_system" msgid="7493299064422163147">"Систем"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ѕвони"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Назад"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Известувања"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Кратенки на тастатурата"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Префрли метод за внесување"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Промени распоред на тастатура"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Апликации"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Помош"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Прелистувач"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 15da3b07f09a..9c18a22c5927 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> എന്നത് മറയ്‌ക്കണോ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"അടുത്ത തവണ നിങ്ങൾ അത് ക്രമീകരണങ്ങളിൽ ഓണാക്കുമ്പോൾ അത് വീണ്ടും ദൃശ്യമാകും."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"മറയ്‌ക്കുക"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"നിങ്ങൾ ഉപയോഗിക്കുന്നത് ഔദ്യോഗിക പ്രൊഫൈലാണ്"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"കോള്‍"</string>
<string name="stream_system" msgid="7493299064422163147">"സിസ്റ്റം"</string>
<string name="stream_ring" msgid="8213049469184048338">"റിംഗുചെയ്യുക"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"മടങ്ങുക"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"അറിയിപ്പുകൾ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"കീബോഡ് കുറുക്കുവഴികൾ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ടൈപ്പിംഗ് രീതി മാറുക"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"കീബോർഡ് ലേഔട്ട് സ്വിച്ച് ചെയ്യുക"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"അപ്ലിക്കേഷനുകൾ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"അസിസ്റ്റ്"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ബ്രൗസർ"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 6ce9115cd82e..fb26e816f657 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -520,7 +520,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>-ийг нуух уу?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Тохируулгын хэсэгт үүнийг асаахад энэ дахин харагдана."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Нуух"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Та өөрийн ажлын профайлыг ашиглаж байна"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Залгах"</string>
<string name="stream_system" msgid="7493299064422163147">"Систем"</string>
<string name="stream_ring" msgid="8213049469184048338">"Хонх"</string>
@@ -675,7 +674,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Буцах"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Мэдэгдэл"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Гарын товчлол"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Оролтын аргыг солих"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Гарын бүдүүвч рүү сэлгэх"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Апп"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Дэмжлэг"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Хөтөч"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index b7fcbd9e1308..958a877b57c3 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> लपवायचे?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"तुम्ही सेटिंग्जमध्ये ते पुढील वेळी चालू कराल तेव्हा ते पुन्हा दिसेल."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"लपवा"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"तुम्ही तुमचे कार्य प्रोफाईल वापरत आहात"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"कॉल करा"</string>
<string name="stream_system" msgid="7493299064422163147">"सिस्टम"</string>
<string name="stream_ring" msgid="8213049469184048338">"रिंग करा"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"परत"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"सूचना"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"कीबोर्ड शॉर्टकट"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"इनपुट पद्धत स्विच करा"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"कीबोर्ड लेआउट स्विच करा"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"अॅप्लिकेशन"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"सहाय्य"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ब्राउझर"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 60231ec3db9a..18007c23384e 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Sembunyikan <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Mesej itu akan terpapar semula pada kali seterusnya anda menghidupkan apl dalam tetapan."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sembunyikan"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Anda sedang menggunakan profil kerja"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Panggil"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Dering"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Kembali"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Pemberitahuan"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Pintasan Papan Kekunci"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Tukar kaedah input"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Tukar reka letak papan kekunci"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikasi"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Bantu"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Penyemak imbas"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 72a897dd988d..f1d48b98515e 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ဝှက်မည်လား?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"နောက်တစ်ကြိမ်သင် ချိန်ညှိချက်များဖွင့်လျှင် ၎င်းပေါ်လာပါမည်။"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ဖျောက်ထားမည်"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"သင်သည် အလုပ်ပရိုဖိုင်းအား သုံးနေသည်"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"ဖုန်းခေါ်ရန်"</string>
<string name="stream_system" msgid="7493299064422163147">"စနစ်"</string>
<string name="stream_ring" msgid="8213049469184048338">"အသံမြည်စေသည်"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"နောက်သို့"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"အကြောင်းကြားချက်များ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"ကီးဘုတ် ဖြတ်လမ်းများ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"စာရိုက်စနစ် ပြောင်းခြင်း"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"ကီးဘုတ်အပြင်အဆင် ပြောင်းခြင်း"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"အက်ပ်များ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"အထောက်အကူ"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ဘရောင်ဇာ"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index b7121ddd1638..d8d6e470044b 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vil du skjule <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Den vises igjen neste gang du slår den på i innstillingene."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skjul"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du bruker jobbprofilen din"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Anrop"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ring"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Tilbake"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Varsler"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Hurtigtaster"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Bytt inndatametode"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Bytt tastaturoppsett"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Apper"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assist"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Nettleser"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 59444b24abe7..5cd4325db9dc 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"लुकाउनुहुन्छ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"यो तपाईं सेटिङ् मा यो बारी अर्को समय देखापर्नेछ।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"लुकाउनुहोस्"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"तपाईँले कार्य प्रोफाइल प्रयोग गर्दै हुनुहुन्छ"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"कल"</string>
<string name="stream_system" msgid="7493299064422163147">"प्रणाली"</string>
<string name="stream_ring" msgid="8213049469184048338">"घन्टी"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"पछाडि"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"सूचनाहरू"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"किबोर्ड सर्टकटहरू"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"इनपुट विधिलाई स्विच गर्नुहोस्"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"किबोर्डको लेआउट बदल्नुहोस्"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"अनुप्रयोगहरू"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"सहायता"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ब्राउजर"</string>
diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml
new file mode 100644
index 000000000000..45d218548d1a
--- /dev/null
+++ b/packages/SystemUI/res/values-night/colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+
+ NOTE: You might also want to edit: core/res/res/values-night/*.xml
+ -->
+<resources>
+ <!-- The color of the material notification background -->
+ <color name="notification_material_background_color">@*android:color/notification_material_background_color</color>
+
+ <!-- The color of the legacy notifications with customs backgrounds (gingerbread and lollipop.)
+ It's fine to override this color since at that point the shade was dark. -->
+ <color name="notification_legacy_background_color">@*android:color/notification_material_background_color</color>
+
+ <!-- The color of the material notification background when dimmed -->
+ <color name="notification_material_background_dimmed_color">#aa212121</color>
+
+ <!-- The color of the dividing line between grouped notifications while . -->
+ <color name="notification_divider_color">#000</color>
+
+ <!-- The background color of the notification shade -->
+ <color name="notification_shade_background_color">#181818</color>
+
+ <!-- The color of the ripples on the untinted notifications -->
+ <color name="notification_ripple_untinted_color">#30ffffff</color>
+
+ <!-- The "inside" of a notification, reached via longpress -->
+ <color name="notification_guts_bg_color">@*android:color/notification_material_background_color</color>
+
+ <!-- The color of the text inside a notification -->
+ <color name="notification_primary_text_color">@*android:color/notification_primary_text_color_dark</color>
+</resources> \ No newline at end of file
diff --git a/packages/SystemUI/res/values-night/dimens.xml b/packages/SystemUI/res/values-night/dimens.xml
new file mode 100644
index 000000000000..481483991de9
--- /dev/null
+++ b/packages/SystemUI/res/values-night/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!-- The height of the divider between the individual notifications. -->
+ <dimen name="notification_divider_height">1dp</dimen>
+</resources> \ No newline at end of file
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index a730586aade5..ac5b3e1fed2a 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> verbergen?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Deze wordt opnieuw weergegeven zodra u de instelling weer inschakelt."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Verbergen"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Je gebruikt je werkprofiel"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Bellen"</string>
<string name="stream_system" msgid="7493299064422163147">"Systeem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Bellen"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Terug"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Meldingen"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Sneltoetsen"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Invoermethode schakelen"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Toetsenbordindeling schakelen"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Apps"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistentie"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index a223d44fe32a..8ac9f5f17a11 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -150,16 +150,13 @@
<string name="data_connection_gprs" msgid="7652872568358508452">"GPRS"</string>
<string name="data_connection_hspa" msgid="1499615426569473562">"HSPA"</string>
<string name="data_connection_3g" msgid="503045449315378373">"3G"</string>
- <!-- no translation found for data_connection_3_5g (3164370985817123144) -->
- <skip />
- <!-- no translation found for data_connection_3_5g_plus (4464630787664529264) -->
- <skip />
+ <string name="data_connection_3_5g" msgid="3164370985817123144">"H"</string>
+ <string name="data_connection_3_5g_plus" msgid="4464630787664529264">"H+"</string>
<string name="data_connection_4g" msgid="9139963475267449144">"4G"</string>
<string name="data_connection_4g_plus" msgid="1148687201877800700">"4G+"</string>
<string name="data_connection_lte" msgid="2694876797724028614">"LTE"</string>
<string name="data_connection_lte_plus" msgid="3423013208570937424">"LTE+"</string>
- <!-- no translation found for data_connection_cdma (8176597308239086780) -->
- <skip />
+ <string name="data_connection_cdma" msgid="8176597308239086780">"1X"</string>
<string name="data_connection_roaming" msgid="6037232010953697354">"ରୋମିଙ୍ଗ"</string>
<string name="data_connection_edge" msgid="871835227939216682">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ୱାଇ-ଫାଇ"</string>
@@ -525,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ଲୁଚାନ୍ତୁ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ଆଗକୁ ଆପଣ ଯେତେବେଳେ ଏହି ସେଟିଙ୍ଗକୁ ଚାଲୁ କରିବେ, ଏହା ପୁଣି ଦେଖାଦେବ।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ଲୁଚାନ୍ତୁ"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ଆପଣ ନିଜ ୱର୍କ ପ୍ରୋଫାଇଲ୍‌ ବ୍ୟବହାର କରୁଛନ୍ତି"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"କଲ୍ କରନ୍ତୁ"</string>
<string name="stream_system" msgid="7493299064422163147">"ସିଷ୍ଟମ୍‌"</string>
<string name="stream_ring" msgid="8213049469184048338">"ରିଙ୍ଗ"</string>
@@ -680,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ଫେରନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"ବିଜ୍ଞପ୍ତି"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"କୀ\'ବୋର୍ଡ ଶର୍ଟକଟ୍"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ଇନପୁଟ୍‌ ପଦ୍ଧତି ବଦଳାନ୍ତୁ"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"କୀ\'ବୋର୍ଡ୍‍ର ଲେଆଉଟ୍‍କୁ ବଦଳାନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ଆପ୍ଲିକେଶନ୍‌"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"ସହାୟତା"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ବ୍ରାଉଜର୍"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 7dac72bc17ad..f4be71ce2458 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ਕੀ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ਨੂੰ ਲੁਕਾਉਣਾ ਹੈ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ਇਹ ਅਗਲੀ ਵਾਰ ਮੁੜ ਪ੍ਰਗਟ ਹੋਵੇਗਾ ਜਦੋਂ ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰਦੇ ਹੋ।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ਲੁਕਾਓ"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ਤੁਸੀਂ ਆਪਣੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਰਤ ਰਹੇ ਹੋ"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"ਕਾਲ ਕਰੋ"</string>
<string name="stream_system" msgid="7493299064422163147">"ਸਿਸਟਮ"</string>
<string name="stream_ring" msgid="8213049469184048338">"ਘੰਟੀ ਵਜਾਓ"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ਪਿੱਛੇ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"ਸੂਚਨਾਵਾਂ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ਇਨਪੁੱਟ ਵਿਧੀ ਸਵਿੱਚ ਕਰੋ"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"ਕੀ-ਬੋਰਡ ਖਾਕਾ ਬਦਲੋ"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ਐਪਲੀਕੇਸ਼ਨਾਂ"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"ਸਹਾਇਕ"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"ਬ੍ਰਾਊਜ਼ਰ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 44517f62850d..6e2f6643d60f 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -528,7 +528,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ukryć <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Pojawi się ponownie, gdy następnym włączysz go w ustawieniach."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ukryj"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Używasz profilu do pracy"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Połączenie"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Dzwonek"</string>
@@ -687,7 +686,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Wstecz"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Powiadomienia"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Skróty klawiszowe"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Przełącz metodę wprowadzania"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Przełącz układ klawiatury"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikacje"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Pomoc"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Przeglądarka"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index bcb4e1b8a40c..a4f46a0e5ed2 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ela reaparecerá na próxima vez que você ativá-la nas configurações."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Você está usando seu perfil de trabalho"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Ligar"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Tocar"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Voltar"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Atalhos do teclado"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Alterar o método de entrada"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Alterar layout do teclado"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicativos"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistente"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navegador"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index d505ac62a3b5..58b0315061a6 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Pretende ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Reaparecerá da próxima vez que a funcionalidade for ativada nas definições."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Está a utilizar o seu perfil de trabalho"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Chamada"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Toque"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Anterior"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Atalhos de teclado"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Alternar o método de introdução"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Alterar esquema de teclado"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicações"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistência"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navegador"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index bcb4e1b8a40c..a4f46a0e5ed2 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ela reaparecerá na próxima vez que você ativá-la nas configurações."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Você está usando seu perfil de trabalho"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Ligar"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistema"</string>
<string name="stream_ring" msgid="8213049469184048338">"Tocar"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Voltar"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Atalhos do teclado"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Alterar o método de entrada"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Alterar layout do teclado"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicativos"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Assistente"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Navegador"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 6ed33cb6d372..34baa8af5c73 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -527,7 +527,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ascundeți <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Va reapărea la următoarea activare în setări."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ascundeți"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Acum folosiți profilul de serviciu"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Apel"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Sonerie"</string>
@@ -684,7 +683,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Înapoi"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificări"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Comenzi rapide de la tastatură"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Comutați metoda de introducere a textului"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Schimbați aspectul tastaturii"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicații"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistent"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index ef3d41fd093e..186baca2f930 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -530,7 +530,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Скрыть параметр \"<xliff:g id="TILE_LABEL">%1$s</xliff:g>\"?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Этот параметр появится в следующий раз, когда вы включите его."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Скрыть"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Вы перешли в рабочий профиль"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Вызов"</string>
<string name="stream_system" msgid="7493299064422163147">"Система"</string>
<string name="stream_ring" msgid="8213049469184048338">"Звонок"</string>
@@ -689,7 +688,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Назад"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Уведомления"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Быстрые клавиши"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Сменить способ ввода"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Переключение раскладки"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Приложения"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Помощник"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Браузер"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index ebfaba643878..a34cd9d1dc14 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> සඟවන්නද?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ඊළඟ අවස්ථාවේ සැකසීම් තුළ ඔබ එය සක්‍රිය කළ විට එය නැවත දිසිවේ."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"සඟවන්න"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"ඔබ ඔබේ කාර්යාල පැතිකඩ භාවිත කරමින් සිටී"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"අමතන්න"</string>
<string name="stream_system" msgid="7493299064422163147">"පද්ධතිය"</string>
<string name="stream_ring" msgid="8213049469184048338">"නාද කරන්න"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"ආපසු"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"දැනුම්දීම්"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"යතුරු පුවරු කෙටිමං"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ආදාන ක්‍රමය මාරු කිරීම"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"යතුරුපුවරු පිරිසැලසුම මාරු කරන්න"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"යෙදුම්"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"සහාය"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"බ්‍රවුසරය"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 38656addaf45..e2fa57782124 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -530,7 +530,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Skryť <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Táto položka sa znova zobrazí, keď ju v nastaveniach opätovne zapnete."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skryť"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Používate svoj pracovný profil."</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Zavolať"</string>
<string name="stream_system" msgid="7493299064422163147">"Systém"</string>
<string name="stream_ring" msgid="8213049469184048338">"Zvonenie"</string>
@@ -689,7 +688,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Späť"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Upozornenia"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Klávesové skratky"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Prepnúť metódu vstupu"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Prepnúť rozloženie klávesnice"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikácie"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Pomocná aplikácia"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Prehliadač"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 5ccfc3700d64..3114f107113f 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -530,7 +530,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite skriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Znova se bo pojavila, ko jo naslednjič vklopite v nastavitvah."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skrij"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Uporabljate delovni profil"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Klic"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Sprožitev zvonjenja"</string>
@@ -689,7 +688,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Nazaj"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Obvestila"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Bližnjične tipke"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Preklop načina vnosa"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Preklop razporeda tipkovnice"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikacije"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Pomoč"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Brskalnik"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 7ea171d9b0b6..7ad3fa3a63af 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Të fshihet <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Do të rishfaqet herën tjetër kur ta aktivizoni te cilësimet."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fshih"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Po përdor profilin tënd të punës"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Telefono"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistemi"</string>
<string name="stream_ring" msgid="8213049469184048338">"Bjeri ziles"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Prapa"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Njoftimet"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Shkurtoret e tastierës"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Ndërro metodën e hyrjes"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Ndërro strukturën e tastierës"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplikacionet"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistenti"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Shfletuesi"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index f88d2ccb415c..da303921b881 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -525,7 +525,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Желите ли да сакријете <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ово ће се поново појавити када га следећи пут будете укључили у подешавањима."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сакриј"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Користите профил за Work"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Позив"</string>
<string name="stream_system" msgid="7493299064422163147">"Систем"</string>
<string name="stream_ring" msgid="8213049469184048338">"Звоно"</string>
@@ -682,7 +681,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Назад"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Обавештења"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Тастерске пречице"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Промени метод уноса"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Промени распоред тастатуре"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Апликације"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Апликација за помоћ"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Прегледач"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 88946f7bdf61..0deb4b485b08 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vill du dölja <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Den visas på nytt nästa gång du aktiverar den i inställningarna."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Dölj"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Du använder din jobbprofil"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Samtal"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ringsignal"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Tillbaka"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Aviseringar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Kortkommandon"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Byt inmatningsmetod"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Byt tangentbordslayout"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Appar"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Hjälp"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Webbläsare"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index d25279c7d69b..ef90f3e8f12b 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ungependa kuficha <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Itaonekana tena wakati mwingine utakapoiwasha katika mipangilio."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ficha"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Unatumia wasifu wako wa kazini"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Piga simu"</string>
<string name="stream_system" msgid="7493299064422163147">"Mfumo"</string>
<string name="stream_ring" msgid="8213049469184048338">"Piga"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Nyuma"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Arifa"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Mikato ya Kibodi"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Kubadili mbinu ya kuingiza data"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Badili mkao wa kibodi"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Programu"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Programu ya usaidizi"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Kivinjari"</string>
@@ -706,7 +705,7 @@
<string name="nav_bar_layout" msgid="3664072994198772020">"Mpangilio"</string>
<string name="left_nav_bar_button_type" msgid="8555981238887546528">"Aina ya kitufe cha kushoto cha ziada"</string>
<string name="right_nav_bar_button_type" msgid="2481056627065649656">"Aina ya kitufe cha kulia cha ziada"</string>
- <string name="nav_bar_default" msgid="8587114043070993007">"(chaguo msingi)"</string>
+ <string name="nav_bar_default" msgid="8587114043070993007">"(chaguomsingi)"</string>
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Ubao wa kunakili"</item>
<item msgid="5742013440802239414">"Msimbo wa ufunguo"</item>
@@ -736,12 +735,12 @@
<string name="tuner_time" msgid="6572217313285536011">"Wakati"</string>
<string-array name="clock_options">
<item msgid="5965318737560463480">"Onyesha saa, dakika na sekunde"</item>
- <item msgid="1427801730816895300">"Onyesha saa na dakika (chaguo msingi)"</item>
+ <item msgid="1427801730816895300">"Onyesha saa na dakika (chaguomsingi)"</item>
<item msgid="3830170141562534721">"Usionyeshe aikoni hii"</item>
</string-array>
<string-array name="battery_options">
<item msgid="3160236755818672034">"Onyesha asilimia kila wakati"</item>
- <item msgid="2139628951880142927">"Onyesha asilimia wakati inachaji (chaguo msingi)"</item>
+ <item msgid="2139628951880142927">"Onyesha asilimia wakati inachaji (chaguomsingi)"</item>
<item msgid="3327323682209964956">"Usionyeshe aikoni hii"</item>
</string-array>
<string name="other" msgid="4060683095962566764">"Nyingine"</string>
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index 2dc6525ffdd9..eb5c180aa754 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -17,7 +17,7 @@
-->
<resources>
<!-- Standard notification width + gravity -->
- <dimen name="notification_panel_width">@dimen/standard_notification_panel_width</dimen>
+ <dimen name="notification_panel_width">416dp</dimen>
<!-- Diameter of outer shape drawable shown in navbar search-->
<dimen name="navbar_search_outerring_diameter">430dip</dimen>
diff --git a/packages/SystemUI/res/values-sw600dp/styles.xml b/packages/SystemUI/res/values-sw600dp/styles.xml
index 791d7615eb80..23b64e34a939 100644
--- a/packages/SystemUI/res/values-sw600dp/styles.xml
+++ b/packages/SystemUI/res/values-sw600dp/styles.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="BrightnessDialogContainer" parent="@style/BaseBrightnessDialogContainer">
- <item name="android:layout_width">@dimen/standard_notification_panel_width</item>
+ <item name="android:layout_width">@dimen/notification_panel_width</item>
</style>
<style name="UserDetailView">
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values/strings.xml b/packages/SystemUI/res/values-sw900dp-land/dimen.xml
index 71f48d6279f1..ac7e6b815666 100644
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values/strings.xml
+++ b/packages/SystemUI/res/values-sw900dp-land/dimen.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/**
- * Copyright (c) 2017, The Android Open Source Project
+ * Copyright (c) 2012, 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.
@@ -14,11 +13,14 @@
* 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.
- */
+*/
-->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+<resources>
+ <!-- Standard notification width + gravity for tablet large screen device -->
+ <dimen name="notification_panel_width">544dp</dimen>
- <string name="sysui_overlay_dark">Dark</string>
+ <!-- Maximum width of quick quick settings panel. -->
+ <dimen name="qs_quick_layout_width">478dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index e0b5cf2dc2d8..b1eeb41dcf66 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ஐ மறைக்கவா?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"அடுத்த முறை அமைப்புகளில் மீண்டும் இயக்கும்போது, இது மீண்டும் தோன்றும்."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"மறை"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"பணி சுயவிவரத்தைப் பயன்படுத்துகிறீர்கள்"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"அழைப்பு"</string>
<string name="stream_system" msgid="7493299064422163147">"சிஸ்டம்"</string>
<string name="stream_ring" msgid="8213049469184048338">"ரிங் செய்"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"முந்தையது"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"அறிவிப்புகள்"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"கீபோர்ட் ஷார்ட்கட்கள்"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"உள்ளீட்டு முறையை மாற்று"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"கீபோர்டு லே அவுட்டை மாற்று"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"பயன்பாடுகள்"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"அசிஸ்ட்"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"உலாவி"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 86ae324fa243..20a146e647df 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ని దాచాలా?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"మీరు సెట్టింగ్‌ల్లో దీన్ని ఆన్ చేసిన తదుపరిసారి ఇది కనిపిస్తుంది."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"దాచు"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"మీరు మీ కార్యాలయ ప్రొఫైల్‌ను ఉపయోగిస్తున్నారు"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"కాల్"</string>
<string name="stream_system" msgid="7493299064422163147">"సిస్టమ్"</string>
<string name="stream_ring" msgid="8213049469184048338">"రింగ్"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"వెనుకకు"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"నోటిఫికేషన్‌లు"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"కీబోర్డ్ షార్ట్‌కట్‌లు"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"ఇన్‌పుట్ పద్ధతిని మార్చండి"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"కీబోర్డ్ లేఅవుట్‌ను మార్చండి"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"అప్లికేషన్‌లు"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"సహాయకం"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"బ్రౌజర్"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index ed91dbd9fdee..76fae4e03592 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ซ่อน <xliff:g id="TILE_LABEL">%1$s</xliff:g> ไหม"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"จะปรากฏอีกครั้งเมื่อคุณเปิดใช้ในการตั้งค่าครั้งถัดไป"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ซ่อน"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"คุณกำลังใช้โปรไฟล์งานของคุณ"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"การโทร"</string>
<string name="stream_system" msgid="7493299064422163147">"ระบบ"</string>
<string name="stream_ring" msgid="8213049469184048338">"เสียงเรียกเข้า"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"กลับ"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"การแจ้งเตือน"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"แป้นพิมพ์ลัด"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"สลับวิธีการป้อนข้อมูล"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"สลับรูปแบบแป้นพิมพ์"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"แอปพลิเคชัน"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"การสนับสนุน"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"เบราว์เซอร์"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 260f7dde4bdd..0c1b8a510d50 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Itago ang <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Lalabas itong muli sa susunod na pagkakataon na i-on mo ito sa mga setting."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Itago"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Ginagamit mo ang iyong profile sa trabaho"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Tumawag"</string>
<string name="stream_system" msgid="7493299064422163147">"System"</string>
<string name="stream_ring" msgid="8213049469184048338">"Ipa-ring"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Bumalik"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Mga Notification"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Mga Keyboard Shortcut"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Magpalit ng pamamaraan ng pag-input"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Magpalit ng layout ng keyboard"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Mga Application"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Tulong"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Browser"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 6fea0b733e1c..7abf64fdf921 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlensin mi?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ayarlardan etkinleştirdiğiniz bir sonraki sefer tekrar görünür."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Gizle"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"İş profilinizi kullanıyorsunuz"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Çağrı"</string>
<string name="stream_system" msgid="7493299064422163147">"Sistem"</string>
<string name="stream_ring" msgid="8213049469184048338">"Zili çaldır"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Geri"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Bildirimler"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Klavye Kısayolları"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Giriş yöntemini değiştir"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Klavye düzenini değiştir"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Uygulamalar"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asist"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Tarayıcı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index aa7b945fcd41..f9f5ce8f306e 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -530,7 +530,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Сховати <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"З’явиться знову, коли ви ввімкнете його в налаштуваннях."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сховати"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Ви в робочому профілі"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Виклик"</string>
<string name="stream_system" msgid="7493299064422163147">"Система"</string>
<string name="stream_ring" msgid="8213049469184048338">"Дзвінок"</string>
@@ -689,7 +688,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Назад"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Сповіщення"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Комбінації клавіш"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Змінити метод введення"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Змінити розкладку клавіатури"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Додатки"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Помічник"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Веб-переглядач"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 5af6d3e11e44..05660224e155 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> کو چھپائیں؟"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"اگلی بار جب آپ اسے ترتیبات میں آن کریں گے تو یہ ظاہر ہوگی۔"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"چھپائیں"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"آپ اپنا دفتری پروفائل استعمال کر رہے ہیں۔"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"کال"</string>
<string name="stream_system" msgid="7493299064422163147">"سسٹم"</string>
<string name="stream_ring" msgid="8213049469184048338">"رِنگ"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"پیچھے"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"اطلاعات"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"کی بورڈ شارٹ کٹس"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"اندراج کا طریقہ سوئچ کریں"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"کی بورڈ لے آؤٹ سوئچ کریں"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"ایپلیکیشنز"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"اسسٹ"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"براؤزر"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index fba027ba4dbd..5ce50a3689e2 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> berkitilsinmi?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Keyingi safar sozlamalardan yoqilgan paydo bo‘ladi."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Berkitish"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Siz ishchi profildan foydalanmoqdasiz"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Chaqiruv"</string>
<string name="stream_system" msgid="7493299064422163147">"Tizim"</string>
<string name="stream_ring" msgid="8213049469184048338">"Jiringlatish"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Orqaga"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Bildirishnomalar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Tezkor tugmalar"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Matn kiritish usulini almashtirish"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Klaviatura sxemasini almashtirish"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Ilovalar"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Yordamchi"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Brauzer"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 0d26f67219d7..3f0091f35581 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ẩn <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Thông báo này sẽ xuất hiện lại vào lần tiếp theo bạn bật thông báo trong cài đặt."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ẩn"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Bạn đang sử dụng hồ sơ công việc của mình"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Gọi"</string>
<string name="stream_system" msgid="7493299064422163147">"Hệ thống"</string>
<string name="stream_ring" msgid="8213049469184048338">"Chuông"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Quay lại"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Thông báo"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Phím tắt"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Chuyển phương thức nhập"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Chuyển đổi bố cục bàn phím"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Ứng dụng"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Trợ lý"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Trình duyệt"</string>
diff --git a/packages/SystemUI/res/values-w550dp-land/dimens.xml b/packages/SystemUI/res/values-w550dp-land/dimens.xml
index eaca9d718fd2..2c6645480abf 100644
--- a/packages/SystemUI/res/values-w550dp-land/dimens.xml
+++ b/packages/SystemUI/res/values-w550dp-land/dimens.xml
@@ -18,4 +18,7 @@
<resources>
<!-- Standard notification width + gravity -->
<dimen name="notification_panel_width">544dp</dimen>
+
+ <!-- Maximum width of quick quick settings panel. -->
+ <dimen name="qs_quick_layout_width">478dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 3cf6fbdefc8e..64db825f0674 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"要隐藏“<xliff:g id="TILE_LABEL">%1$s</xliff:g>”吗?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"下次在设置中将其开启后,此快捷设置条目将会重新显示。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隐藏"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您当前正在使用工作资料"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"通话"</string>
<string name="stream_system" msgid="7493299064422163147">"系统"</string>
<string name="stream_ring" msgid="8213049469184048338">"铃声"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"返回"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"键盘快捷键"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"切换输入法"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"切换键盘布局"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"应用"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"助手应用"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"浏览器"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 1a207d1ceb5c..5d36aa5a3f6c 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -524,7 +524,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"隱藏 <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"下一次您在設定開啟它時,它將再次出現。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隱藏"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"您正在使用工作設定檔"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"通話"</string>
<string name="stream_system" msgid="7493299064422163147">"系統"</string>
<string name="stream_ring" msgid="8213049469184048338">"鈴聲"</string>
@@ -679,7 +678,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"返回"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"鍵盤快速鍵"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"切換輸入法"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"切換鍵盤配置"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"應用程式"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"小幫手"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"瀏覽器"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 359e6e205711..34014f46e723 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"隱藏<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"只要在設定頁面中重新啟用,就能再次看到快捷設定選項。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隱藏"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"你正在使用工作資料夾"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"通話"</string>
<string name="stream_system" msgid="7493299064422163147">"系統"</string>
<string name="stream_ring" msgid="8213049469184048338">"鈴響"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"返回"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"鍵盤快速鍵"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"切換輸入法"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"切換鍵盤配置"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"應用程式"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"小幫手"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"瀏覽器"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 871a2501c3e3..099cbfe5c369 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -522,7 +522,6 @@
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Fihla i-<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Izovela ngesikhathi esilandelayo uma uvule lesi silungiselelo."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fihla"</string>
- <string name="managed_profile_foreground_toast" msgid="5421487114739245972">"Usebenzisa iphrofayela yakho yomsebenzi"</string>
<string name="stream_voice_call" msgid="4410002696470423714">"Shaya"</string>
<string name="stream_system" msgid="7493299064422163147">"Isistimu"</string>
<string name="stream_ring" msgid="8213049469184048338">"Khalisa"</string>
@@ -677,7 +676,7 @@
<string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Emuva"</string>
<string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Izaziso"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Izinqamulelo Zekhibhodi"</string>
- <string name="keyboard_shortcut_group_system_switch_input" msgid="2334164096341310324">"Shintsha indlela yokufaka"</string>
+ <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Shintsha isakhiwo sekhibhodi"</string>
<string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Izinhlelo zokusebenza"</string>
<string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Siza"</string>
<string name="keyboard_shortcut_group_applications_browser" msgid="6465985474000766533">"Isiphequluli"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 975055ce72e6..4920fb2ea407 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -94,6 +94,9 @@
<!-- The color of the gear shown behind a notification -->
<color name="notification_gear_color">#ff757575</color>
+ <!-- The color of the text inside a notification -->
+ <color name="notification_primary_text_color">@*android:color/notification_primary_text_color_light</color>
+
<!-- The "inside" of a notification, reached via longpress -->
<color name="notification_guts_bg_color">#f8f9fa</color>
@@ -137,8 +140,10 @@
<color name="remote_input_accent">#eeeeee</color>
- <color name="quick_step_track_background_dark">#61000000</color>
- <color name="quick_step_track_background_light">#33FFFFFF</color>
+ <color name="quick_step_track_background_background_dark">#1F000000</color>
+ <color name="quick_step_track_background_background_light">#33FFFFFF</color>
+ <color name="quick_step_track_background_foreground_dark">#38000000</color>
+ <color name="quick_step_track_background_foreground_light">#59FFFFFF</color>
<!-- Keyboard shortcuts colors -->
<color name="ksh_application_group_color">#fff44336</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index c62d1af31d66..f1c298d4e0ce 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -104,6 +104,9 @@
prevent wasting cpu cycles on the dimming animation -->
<bool name="config_navigation_bar_enable_auto_dim_no_visible_wallpaper">true</bool>
+ <!-- The maximum number of tiles in the QuickQSPanel -->
+ <integer name="quick_qs_panel_max_columns">6</integer>
+
<!-- Whether QuickSettings is in a phone landscape -->
<bool name="quick_settings_wide">false</bool>
@@ -144,6 +147,9 @@
<!-- Should "4G" be shown instead of "LTE" when the network is NETWORK_TYPE_LTE? -->
<bool name="config_show4GForLTE">true</bool>
+ <!-- Show indicator for Wifi on but not connected. -->
+ <bool name="config_showWifiIndicatorWhenEnabled">false</bool>
+
<!-- Whether to show wifi activity indicators in the status bar -->
<bool name="config_showWifiActivity">true</bool>
@@ -564,4 +570,7 @@
<!-- On debuggable builds, alert the user if SystemUI PSS goes over this number (in kb) -->
<integer name="watch_heap_limit">256000</integer>
+
+ <!-- Allow dragging the PIP to a location to close it -->
+ <bool name="config_pipEnableDismissDragToEdge">true</bool>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 92ee7ef88c6b..ac4b175162c7 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -55,7 +55,7 @@
<dimen name="status_bar_left_clock_end_padding">7dp</dimen>
<!-- Spacing after the wifi signals that is present if there are any icons following it. -->
- <dimen name="status_bar_wifi_signal_spacer_width">4dp</dimen>
+ <dimen name="status_bar_wifi_signal_spacer_width">2.5dp</dimen>
<!-- Spacing before the airplane mode icon if there are any icons preceding it. -->
<dimen name="status_bar_airplane_spacer_width">4dp</dimen>
@@ -252,6 +252,9 @@
-->
<dimen name="qs_header_system_icons_area_height">48dp</dimen>
+ <!-- How far the quick-quick settings panel extends below the status bar -->
+ <dimen name="qs_quick_header_panel_height">128dp</dimen>
+
<!-- The height of the container that holds the system icons in the quick settings header in the
car setting. -->
<dimen name="car_qs_header_system_icons_area_height">54dp</dimen>
@@ -277,7 +280,6 @@
<!-- Width for the notification panel and related windows -->
<dimen name="match_parent">-1px</dimen>
- <dimen name="standard_notification_panel_width">416dp</dimen>
<!-- The top margin of the panel that holds the list of notifications. -->
<dimen name="notification_panel_margin_top">0dp</dimen>
@@ -349,8 +351,8 @@
<dimen name="qs_tile_margin_top_bottom">12dp</dimen>
<dimen name="qs_tile_margin_top">18dp</dimen>
<dimen name="qs_quick_tile_size">48dp</dimen>
- <!-- Width for the spacer, used between QS tiles. -->
- <dimen name="qs_quick_tile_space_width">0dp</dimen>
+ <!-- Maximum width of quick quick settings panel. Defaults to MATCH_PARENT-->
+ <dimen name="qs_quick_layout_width">-1px</dimen>
<dimen name="qs_quick_tile_padding">12dp</dimen>
<dimen name="qs_header_gear_translation">16dp</dimen>
<dimen name="qs_header_tile_margin_horizontal">0dp</dimen>
@@ -764,9 +766,6 @@
<dimen name="volume_expander_margin_end">2dp</dimen>
<dimen name="volume_expander_margin_top">6dp</dimen>
- <!-- Padding between icon and text for managed profile toast -->
- <dimen name="managed_profile_toast_padding">4dp</dimen>
-
<!-- Thickness of the assist disclosure beams -->
<dimen name="assist_disclosure_thickness">2.5dp</dimen>
@@ -922,14 +921,22 @@
<dimen name="global_actions_top_padding">120dp</dimen>
- <!-- the maximum offset in either direction that elements are moved horizontally to prevent
- burn-in on AOD -->
+ <dimen name="global_actions_padding">12dp</dimen>
+
+ <dimen name="global_actions_translate">9dp</dimen>
+
+ <!-- The maximum offset in either direction that elements are moved horizontally to prevent
+ burn-in on AOD. -->
<dimen name="burn_in_prevention_offset_x">8dp</dimen>
- <!-- the maximum offset in either direction that elements are moved vertically to prevent
- burn-in on AOD -->
+ <!-- The maximum offset in either direction that elements are moved vertically to prevent
+ burn-in on AOD. -->
<dimen name="burn_in_prevention_offset_y">50dp</dimen>
+ <!-- The maximum offset in either direction that the charging indication moves vertically
+ to prevent burn-in on AOD. -->
+ <dimen name="charging_indication_burn_in_prevention_offset_y">5dp</dimen>
+
<dimen name="corner_size">8dp</dimen>
<dimen name="top_padding">0dp</dimen>
<dimen name="bottom_padding">48dp</dimen>
@@ -1012,4 +1019,7 @@
<!-- How much into a DisplayCutout's bounds we can go, on each side -->
<dimen name="display_cutout_margin_consumption">0px</dimen>
+ <!-- How much we expand the touchable region of the status bar below the notch to catch touches
+ that just start below the notch. -->
+ <dimen name="display_cutout_touchable_region_size">12dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index e4cf2d811432..2fec54c73e78 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1326,9 +1326,6 @@
<!-- Hide quick settings tile confirmation button -->
<string name="quick_settings_reset_confirmation_button">Hide</string>
- <!-- Toast shown when user unlocks screen and managed profile activity is in the foreground -->
- <string name="managed_profile_foreground_toast">You\'re using your work profile</string>
-
<!-- volume stream names. All nouns. -->
<string name="stream_voice_call">Call</string> <!-- STREAM_VOICE_CALL -->
<string name="stream_system">System</string> <!-- STREAM_SYSTEM -->
@@ -1727,8 +1724,8 @@
<string name="keyboard_shortcut_group_system_notifications">Notifications</string>
<!-- User visible title for the the keyboard shortcut that triggers the keyboard shortcuts helper. -->
<string name="keyboard_shortcut_group_system_shortcuts_helper">Keyboard Shortcuts</string>
- <!-- User visible title for the the keyboard shortcut that switches input methods. -->
- <string name="keyboard_shortcut_group_system_switch_input">Switch input method</string>
+ <!-- User visible title for the the keyboard shortcut that switches to the next hardware keyboard layout. [CHAR LIMIT=30] -->
+ <string name="keyboard_shortcut_group_system_switch_input">Switch keyboard layout</string>
<!-- User visible title for the system-wide applications keyboard shortcuts list. -->
<string name="keyboard_shortcut_group_applications">Applications</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index e4f59892f79b..5a03c4a37cad 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -335,10 +335,7 @@
<item name="*android:errorColor">?android:attr/colorError</item>
</style>
- <!-- Overlay manager may replace this theme -->
- <style name="qs_base" parent="@*android:style/Theme.DeviceDefault.QuickSettings" />
-
- <style name="qs_theme" parent="qs_base">
+ <style name="qs_theme" parent="@*android:style/Theme.DeviceDefault.QuickSettings">
<item name="lightIconTheme">@style/QSIconTheme</item>
<item name="darkIconTheme">@style/QSIconTheme</item>
<item name="android:windowIsFloating">true</item>
@@ -403,6 +400,9 @@
<item name="fillColor">?android:attr/textColorPrimary</item>
<item name="singleToneColor">?android:attr/textColorPrimary</item>
</style>
+ <style name="ScreenPinningRequestTheme" parent="@*android:style/ThemeOverlay.DeviceDefault.Accent">
+ <item name="singleToneColor">@color/light_mode_icon_color_single_tone</item>
+ </style>
<style name="TextAppearance.Volume">
<item name="android:textStyle">normal</item>
@@ -452,23 +452,20 @@
<style name="TextAppearance.NotificationInfo">
<item name="android:fontFamily">sans-serif</item>
- <item name="android:textColor">@android:color/black</item>
+ <item name="android:textColor">@color/notification_primary_text_color</item>
</style>
<style name="TextAppearance.NotificationInfo.Primary">
- <item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textSize">16sp</item>
<item name="android:alpha">0.87</item>
</style>
<style name="TextAppearance.NotificationInfo.Confirmation">
- <item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textSize">14sp</item>
<item name="android:alpha">0.87</item>
</style>
<style name="TextAppearance.NotificationInfo.Secondary">
- <item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textSize">14sp</item>
<item name="android:alpha">0.54</item>
</style>
@@ -498,7 +495,7 @@
parent="@*android:style/TextAppearance.Material.Notification.Info">
</style>
- <style name="edit_theme" parent="qs_base">
+ <style name="edit_theme" parent="qs_theme">
<item name="android:colorBackground">?android:attr/colorSecondary</item>
</style>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java
index a04a6a3fe0c5..f69e91145dfc 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java
@@ -19,6 +19,7 @@ package com.android.systemui.shared.recents.model;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.KeyguardManager;
import android.content.ComponentName;
import android.content.Context;
@@ -92,7 +93,7 @@ public class RecentsTaskLoadPlan {
ArrayList<Task> allTasks = new ArrayList<>();
if (mRawTasks == null) {
mRawTasks = ActivityManagerWrapper.getInstance().getRecentTasks(
- ActivityManager.getMaxRecentTasksStatic(), currentUserId);
+ ActivityTaskManager.getMaxRecentTasksStatic(), currentUserId);
// Since the raw tasks are given in most-recent to least-recent order, we need to reverse it
Collections.reverse(mRawTasks);
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java
index 1309a6065c8a..ab2e277ecfd6 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java
@@ -17,6 +17,7 @@
package com.android.systemui.shared.recents.model;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.ComponentCallbacks2;
import android.content.ComponentName;
import android.content.Context;
@@ -98,7 +99,7 @@ public class RecentsTaskLoader {
mSvelteLevel = svelteLevel;
// Initialize the proxy, cache and loaders
- int numRecentTasks = ActivityManager.getMaxRecentTasksStatic();
+ int numRecentTasks = ActivityTaskManager.getMaxRecentTasksStatic();
mHighResThumbnailLoader = new HighResThumbnailLoader(ActivityManagerWrapper.getInstance(),
Looper.getMainLooper(), ActivityManager.isLowRamDeviceStatic());
mLoadQueue = new TaskResourceLoadQueue();
@@ -221,14 +222,14 @@ public class RecentsTaskLoader {
// We are leaving recents, so trim the data a bit
mIconCache.trimToSize(Math.max(1, mMaxIconCacheSize / 2));
mActivityInfoCache.trimToSize(Math.max(1,
- ActivityManager.getMaxRecentTasksStatic() / 2));
+ ActivityTaskManager.getMaxRecentTasksStatic() / 2));
break;
case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW:
case ComponentCallbacks2.TRIM_MEMORY_MODERATE:
// We are going to be low on memory
mIconCache.trimToSize(Math.max(1, mMaxIconCacheSize / 4));
mActivityInfoCache.trimToSize(Math.max(1,
- ActivityManager.getMaxRecentTasksStatic() / 4));
+ ActivityTaskManager.getMaxRecentTasksStatic() / 4));
break;
case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL:
case ComponentCallbacks2.TRIM_MEMORY_COMPLETE:
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
index 63a4cd497bc1..dce72b440f58 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
@@ -30,6 +30,7 @@ import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.ActivityManager.RecentTaskInfo;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.AppGlobals;
import android.app.IAssistDataReceiver;
import android.app.WindowConfiguration.ActivityType;
@@ -113,7 +114,7 @@ public class ActivityManagerWrapper {
// Note: The set of running tasks from the system is ordered by recency
try {
List<ActivityManager.RunningTaskInfo> tasks =
- ActivityManager.getService().getFilteredTasks(1, ignoreActivityType,
+ ActivityTaskManager.getService().getFilteredTasks(1, ignoreActivityType,
WINDOWING_MODE_PINNED /* ignoreWindowingMode */);
if (tasks.isEmpty()) {
return null;
@@ -129,7 +130,7 @@ public class ActivityManagerWrapper {
*/
public List<RecentTaskInfo> getRecentTasks(int numTasks, int userId) {
try {
- return ActivityManager.getService().getRecentTasks(numTasks,
+ return ActivityTaskManager.getService().getRecentTasks(numTasks,
RECENT_IGNORE_UNAVAILABLE, userId).getList();
} catch (RemoteException e) {
Log.e(TAG, "Failed to get recent tasks", e);
@@ -143,7 +144,7 @@ public class ActivityManagerWrapper {
public @NonNull ThumbnailData getTaskThumbnail(int taskId, boolean reducedResolution) {
ActivityManager.TaskSnapshot snapshot = null;
try {
- snapshot = ActivityManager.getService().getTaskSnapshot(taskId, reducedResolution);
+ snapshot = ActivityTaskManager.getService().getTaskSnapshot(taskId, reducedResolution);
} catch (RemoteException e) {
Log.w(TAG, "Failed to retrieve task snapshot", e);
}
@@ -234,7 +235,7 @@ public class ActivityManagerWrapper {
}
};
}
- ActivityManager.getService().startRecentsActivity(intent, receiver, runner);
+ ActivityTaskManager.getService().startRecentsActivity(intent, receiver, runner);
if (resultCallback != null) {
resultCallbackHandler.post(new Runnable() {
@Override
@@ -260,7 +261,7 @@ public class ActivityManagerWrapper {
*/
public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
try {
- ActivityManager.getService().cancelRecentsAnimation(restoreHomeStackPosition);
+ ActivityTaskManager.getService().cancelRecentsAnimation(restoreHomeStackPosition);
} catch (RemoteException e) {
Log.e(TAG, "Failed to cancel recents animation", e);
}
@@ -333,7 +334,7 @@ public class ActivityManagerWrapper {
public boolean startActivityFromRecents(int taskId, ActivityOptions options) {
try {
Bundle optsBundle = options == null ? null : options.toBundle();
- ActivityManager.getService().startActivityFromRecents(taskId, optsBundle);
+ ActivityTaskManager.getService().startActivityFromRecents(taskId, optsBundle);
return true;
} catch (Exception e) {
return false;
@@ -384,7 +385,7 @@ public class ActivityManagerWrapper {
@Override
public void run() {
try {
- ActivityManager.getService().removeTask(taskId);
+ ActivityTaskManager.getService().removeTask(taskId);
} catch (RemoteException e) {
Log.w(TAG, "Failed to remove task=" + taskId, e);
}
@@ -397,7 +398,7 @@ public class ActivityManagerWrapper {
*/
public void cancelWindowTransition(int taskId) {
try {
- ActivityManager.getService().cancelTaskWindowTransition(taskId);
+ ActivityTaskManager.getService().cancelTaskWindowTransition(taskId);
} catch (RemoteException e) {
Log.w(TAG, "Failed to cancel window transition for task=" + taskId, e);
}
@@ -408,7 +409,7 @@ public class ActivityManagerWrapper {
*/
public boolean isScreenPinningActive() {
try {
- return ActivityManager.getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED;
+ return ActivityTaskManager.getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED;
} catch (RemoteException e) {
return false;
}
@@ -427,7 +428,7 @@ public class ActivityManagerWrapper {
*/
public boolean isLockToAppActive() {
try {
- return ActivityManager.getService().getLockTaskModeState() != LOCK_TASK_MODE_NONE;
+ return ActivityTaskManager.getService().getLockTaskModeState() != LOCK_TASK_MODE_NONE;
} catch (RemoteException e) {
return false;
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
index 712cca67c5d6..36fb3a7b4307 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityOptionsCompat.java
@@ -16,8 +16,8 @@
package com.android.systemui.shared.system;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import android.app.ActivityOptions;
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java
index 38b8ae8418af..0d25c91e62d9 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java
@@ -67,7 +67,7 @@ public class InputConsumerController {
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
boolean handled = true;
try {
if (mListener != null && event instanceof MotionEvent) {
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java
index cd831d1e31f6..d38cc0f608ce 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java
@@ -54,6 +54,7 @@ public class NavigationBarCompat {
public static final int HIT_TARGET_HOME = 2;
public static final int HIT_TARGET_OVERVIEW = 3;
public static final int HIT_TARGET_ROTATION = 4;
+ public static final int HIT_TARGET_DEAD_ZONE = 5;
@Retention(RetentionPolicy.SOURCE)
@IntDef({FLAG_DISABLE_SWIPE_UP,
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 5e293c61c35a..628b3c6e21dc 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
@@ -16,6 +16,7 @@
package com.android.systemui.shared.system;
+import android.app.ActivityTaskManager;
import android.app.ActivityManager.TaskSnapshot;
import android.app.IActivityManager;
import android.app.TaskStackListener;
@@ -57,7 +58,7 @@ public class TaskStackChangeListeners extends TaskStackListener {
if (!mRegistered) {
// Register mTaskStackListener to IActivityManager only once if needed.
try {
- am.registerTaskStackListener(this);
+ ActivityTaskManager.getService().registerTaskStackListener(this);
mRegistered = true;
} catch (Exception e) {
Log.w(TAG, "Failed to call registerTaskStackListener", e);
diff --git a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
index 5593fe5f5dfe..2ef5cf1f3942 100644
--- a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
+++ b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
@@ -18,6 +18,7 @@ package com.android.keyguard;
import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
@@ -178,7 +179,7 @@ public class EmergencyButton extends Button {
// should be the equivalent to the old userActivity(EMERGENCY_CALL_TIMEOUT)
mPowerManager.userActivity(SystemClock.uptimeMillis(), true);
try {
- ActivityManager.getService().stopSystemLockTaskMode();
+ ActivityTaskManager.getService().stopSystemLockTaskMode();
} catch (RemoteException e) {
Slog.w(LOG_TAG, "Failed to stop app pinning");
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
index c3119793eaf5..2511f74e4ab6 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
@@ -20,6 +20,7 @@ import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL;
import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL_UNLOCKED;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.os.AsyncTask;
import android.os.CountDownTimer;
import android.os.SystemClock;
@@ -294,8 +295,8 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout
}
@Override
- public void showMessage(CharSequence message, int color) {
- mSecurityMessageDisplay.setNextMessageColor(color);
+ public void showMessage(CharSequence message, ColorStateList colorState) {
+ mSecurityMessageDisplay.setNextMessageColor(colorState);
mSecurityMessageDisplay.setMessage(message);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardConstants.java b/packages/SystemUI/src/com/android/keyguard/KeyguardConstants.java
index 8125afd6d46c..9ade1cf4a723 100755
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardConstants.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardConstants.java
@@ -27,5 +27,5 @@ public class KeyguardConstants {
*/
public static final boolean DEBUG = true;
public static final boolean DEBUG_SIM_STATES = true;
- public static final boolean DEBUG_FP_WAKELOCK = true;
+ public static final boolean DEBUG_BIOMETRIC_WAKELOCK = true;
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
index aa0bcc5cf2b8..df64160c9e48 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
@@ -20,6 +20,7 @@ import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.res.Resources;
+import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.media.AudioManager;
import android.os.SystemClock;
@@ -175,8 +176,8 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback {
mSecurityContainer.showPromptReason(reason);
}
- public void showMessage(CharSequence message, int color) {
- mSecurityContainer.showMessage(message, color);
+ public void showMessage(CharSequence message, ColorStateList colorState) {
+ mSecurityContainer.showMessage(message, colorState);
}
public void showErrorMessage(CharSequence message) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
index d19821fb9723..010ec7c44cf3 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
@@ -17,6 +17,7 @@
package com.android.keyguard;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
@@ -42,10 +43,10 @@ class KeyguardMessageArea extends TextView implements SecurityMessageDisplay {
private static final int DEFAULT_COLOR = -1;
private final Handler mHandler;
- private final int mDefaultColor;
+ private final ColorStateList mDefaultColorState;
private CharSequence mMessage;
- private int mNextMessageColor = DEFAULT_COLOR;
+ private ColorStateList mNextMessageColorState = ColorStateList.valueOf(DEFAULT_COLOR);
private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
public void onFinishedGoingToSleep(int why) {
@@ -71,13 +72,13 @@ class KeyguardMessageArea extends TextView implements SecurityMessageDisplay {
monitor.registerCallback(mInfoCallback);
mHandler = new Handler(Looper.myLooper());
- mDefaultColor = getCurrentTextColor();
+ mDefaultColorState = getTextColors();
update();
}
@Override
- public void setNextMessageColor(int color) {
- mNextMessageColor = color;
+ public void setNextMessageColor(ColorStateList colorState) {
+ mNextMessageColorState = colorState;
}
@Override
@@ -139,12 +140,12 @@ class KeyguardMessageArea extends TextView implements SecurityMessageDisplay {
CharSequence status = mMessage;
setVisibility(TextUtils.isEmpty(status) ? INVISIBLE : VISIBLE);
setText(status);
- int color = mDefaultColor;
- if (mNextMessageColor != DEFAULT_COLOR) {
- color = mNextMessageColor;
- mNextMessageColor = DEFAULT_COLOR;
+ ColorStateList colorState = mDefaultColorState;
+ if (mNextMessageColorState.getDefaultColor() != DEFAULT_COLOR) {
+ colorState = mNextMessageColorState;
+ mNextMessageColorState = ColorStateList.valueOf(DEFAULT_COLOR);
}
- setTextColor(color);
+ setTextColor(colorState);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
index 474de3ff3456..f96e460de77e 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
@@ -19,6 +19,7 @@ import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL;
import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL_UNLOCKED;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.graphics.Rect;
import android.os.AsyncTask;
import android.os.CountDownTimer;
@@ -405,8 +406,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit
}
@Override
- public void showMessage(CharSequence message, int color) {
- mSecurityMessageDisplay.setNextMessageColor(color);
+ public void showMessage(CharSequence message, ColorStateList colorState) {
+ mSecurityMessageDisplay.setNextMessageColor(colorState);
mSecurityMessageDisplay.setMessage(message);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index cb5a0507815b..745f81d55e31 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -20,8 +20,9 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.os.UserHandle;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Slog;
@@ -142,6 +143,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
mSecurityViewFlipper.addView(v);
updateSecurityView(v);
view = (KeyguardSecurityView)v;
+ view.reset();
}
return view;
@@ -537,9 +539,9 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe
}
}
- public void showMessage(CharSequence message, int color) {
+ public void showMessage(CharSequence message, ColorStateList colorState) {
if (mCurrentSecuritySelection != SecurityMode.None) {
- getSecurityView(mCurrentSecuritySelection).showMessage(message, color);
+ getSecurityView(mCurrentSecuritySelection).showMessage(message, colorState);
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
index 6e445ff0e26d..1a09364f564c 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
@@ -16,6 +16,7 @@
package com.android.keyguard;
import com.android.internal.widget.LockPatternUtils;
+import android.content.res.ColorStateList;
public interface KeyguardSecurityView {
static public final int SCREEN_ON = 1;
@@ -104,9 +105,9 @@ public interface KeyguardSecurityView {
* Show a message on the security view with a specified color
*
* @param message the message to show
- * @param color the color to use
+ * @param colorState the color to use
*/
- void showMessage(CharSequence message, int color);
+ void showMessage(CharSequence message, ColorStateList colorState);
/**
* Instruct the view to show usability hints, if any.
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
index 3aede569147a..74e2a6835b41 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
@@ -19,6 +19,7 @@ package com.android.keyguard;
import android.annotation.NonNull;
import android.content.Context;
import android.content.res.TypedArray;
+import android.content.res.ColorStateList;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
@@ -139,10 +140,10 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper implements Keyguard
}
@Override
- public void showMessage(CharSequence message, int color) {
+ public void showMessage(CharSequence message, ColorStateList colorState) {
KeyguardSecurityView ksv = getSecurityView();
if (ksv != null) {
- ksv.showMessage(message, color);
+ ksv.showMessage(message, colorState);
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 67bdd216b13b..6517a9dd4f71 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -21,8 +21,8 @@ import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.annotation.ColorInt;
import android.app.PendingIntent;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.Observer;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.Observer;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
@@ -126,7 +126,8 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
super.onFinishInflate();
mTitle = findViewById(R.id.title);
mRow = findViewById(R.id.row);
- mTextColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
+ mTextColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor);
+ mIconSize = (int) mContext.getResources().getDimension(R.dimen.widget_icon_size);
}
@Override
@@ -156,7 +157,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
return;
}
- ListContent lc = new ListContent(getContext(), mSlice);
+ ListContent lc = new ListContent(getContext(), mSlice, null, 0, 0);
mHasHeader = lc.hasHeader();
List<SliceItem> subItems = new ArrayList<SliceItem>();
for (int i = 0; i < lc.getRowItems().size(); i++) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 41df196c62b0..6da143c0e083 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -28,7 +28,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.UserHandle;
-import android.support.v4.graphics.ColorUtils;
+import androidx.core.graphics.ColorUtils;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.ArraySet;
@@ -73,6 +73,7 @@ public class KeyguardStatusView extends GridLayout implements
private ArraySet<View> mVisibleInDoze;
private boolean mPulsing;
+ private boolean mWasPulsing;
private float mDarkAmount = 0;
private int mTextColor;
private float mWidgetPadding;
@@ -198,6 +199,9 @@ public class KeyguardStatusView extends GridLayout implements
mClockView.setElegantTextHeight(false);
}
+ /**
+ * Moves clock and separator, adjusting margins when slice content changes.
+ */
private void onSliceContentChanged() {
boolean smallClock = mKeyguardSlice.hasHeader() || mPulsing;
float clockScale = smallClock ? mSmallClockScale : 1;
@@ -220,11 +224,12 @@ public class KeyguardStatusView extends GridLayout implements
@Override
public void onLayoutChange(View view, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
- int heightOffset = mPulsing ? 0 : getHeight() - mLastLayoutHeight;
+ int heightOffset = mPulsing || mWasPulsing ? 0 : getHeight() - mLastLayoutHeight;
boolean hasHeader = mKeyguardSlice.hasHeader();
boolean smallClock = hasHeader || mPulsing;
long duration = KeyguardSliceView.DEFAULT_ANIM_DURATION;
- long delay = smallClock ? 0 : duration / 4;
+ long delay = smallClock || mWasPulsing ? 0 : duration / 4;
+ mWasPulsing = false;
boolean shouldAnimate = mKeyguardSlice.getLayoutTransition() != null
&& mKeyguardSlice.getLayoutTransition().isRunning();
@@ -448,7 +453,18 @@ public class KeyguardStatusView extends GridLayout implements
}
public void setPulsing(boolean pulsing, boolean animate) {
+ if (mPulsing == pulsing) {
+ return;
+ }
+ if (mPulsing) {
+ mWasPulsing = true;
+ }
mPulsing = pulsing;
+ // Animation can look really weird when the slice has a header, let's hide the views
+ // immediately instead of fading them away.
+ if (mKeyguardSlice.hasHeader()) {
+ animate = false;
+ }
mKeyguardSlice.setPulsing(pulsing, animate);
updateDozeVisibleViews();
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 93a052c55594..1f25f372b34b 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -32,12 +32,14 @@ import static android.os.BatteryManager.EXTRA_STATUS;
import android.annotation.AnyThread;
import android.annotation.MainThread;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.AlarmManager;
import android.app.Instrumentation;
import android.app.PendingIntent;
import android.app.UserSwitchObserver;
import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
+import android.hardware.biometrics.BiometricSourceType;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -47,6 +49,7 @@ import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.ContentObserver;
+import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
@@ -71,7 +74,6 @@ import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.util.Log;
-import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
@@ -144,27 +146,27 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private static final int MSG_DREAMING_STATE_CHANGED = 333;
private static final int MSG_USER_UNLOCKED = 334;
private static final int MSG_ASSISTANT_STACK_CHANGED = 335;
- private static final int MSG_FINGERPRINT_AUTHENTICATION_CONTINUE = 336;
+ private static final int MSG_BIOMETRIC_AUTHENTICATION_CONTINUE = 336;
private static final int MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED = 337;
private static final int MSG_LOCALE_CHANGED = 500;
- /** Fingerprint state: Not listening to fingerprint. */
- private static final int FINGERPRINT_STATE_STOPPED = 0;
+ /** Biometric authentication state: Not listening. */
+ private static final int BIOMETRIC_STATE_STOPPED = 0;
- /** Fingerprint state: Listening. */
- private static final int FINGERPRINT_STATE_RUNNING = 1;
+ /** Biometric authentication state: Listening. */
+ private static final int BIOMETRIC_STATE_RUNNING = 1;
/**
- * Fingerprint state: Cancelling and waiting for the confirmation from FingerprintService to
+ * Biometric authentication: Cancelling and waiting for the relevant biometric service to
* send us the confirmation that cancellation has happened.
*/
- private static final int FINGERPRINT_STATE_CANCELLING = 2;
+ private static final int BIOMETRIC_STATE_CANCELLING = 2;
/**
- * Fingerprint state: During cancelling we got another request to start listening, so when we
+ * Biometric state: During cancelling we got another request to start listening, so when we
* receive the cancellation done signal, we should start listening again.
*/
- private static final int FINGERPRINT_STATE_CANCELLING_RESTARTING = 3;
+ private static final int BIOMETRIC_STATE_CANCELLING_RESTARTING = 3;
private static final int DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT = 5000000;
@@ -227,7 +229,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private List<SubscriptionInfo> mSubscriptionInfo;
private TrustManager mTrustManager;
private UserManager mUserManager;
- private int mFingerprintRunningState = FINGERPRINT_STATE_STOPPED;
+ private int mFingerprintRunningState = BIOMETRIC_STATE_STOPPED;
+ private int mFaceRunningState = BIOMETRIC_STATE_STOPPED;
private LockPatternUtils mLockPatternUtils;
private final IDreamManager mDreamManager;
private boolean mIsDreaming;
@@ -235,14 +238,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private boolean mLogoutEnabled;
/**
- * Short delay before restarting fingerprint authentication after a successful try
- * This should be slightly longer than the time between onFingerprintAuthenticated and
- * setKeyguardGoingAway(true).
+ * Short delay before restarting biometric authentication after a successful try
+ * This should be slightly longer than the time between on<biometric>Authenticated
+ * (e.g. onFingerprintAuthenticated) and setKeyguardGoingAway(true).
*/
- private static final int FINGERPRINT_CONTINUE_DELAY_MS = 500;
+ private static final int BIOMETRIC_CONTINUE_DELAY_MS = 500;
// If FP daemon dies, keyguard should retry after a short delay
- private int mHardwareUnavailableRetryCount = 0;
+ private int mHardwareFingerprintUnavailableRetryCount = 0;
+ private int mHardwareFaceUnavailableRetryCount = 0;
private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms
private static final int HW_UNAVAILABLE_RETRY_MAX = 3;
@@ -333,10 +337,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
break;
case MSG_ASSISTANT_STACK_CHANGED:
mAssistantVisible = (boolean)msg.obj;
- updateFingerprintListeningState();
+ updateBiometricListeningState();
break;
- case MSG_FINGERPRINT_AUTHENTICATION_CONTINUE:
- updateFingerprintListeningState();
+ case MSG_BIOMETRIC_AUTHENTICATION_CONTINUE:
+ updateBiometricListeningState();
break;
case MSG_LOCALE_CHANGED:
handleLocaleChanged();
@@ -362,10 +366,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private SparseBooleanArray mUserHasTrust = new SparseBooleanArray();
private SparseBooleanArray mUserTrustIsManaged = new SparseBooleanArray();
private SparseBooleanArray mUserFingerprintAuthenticated = new SparseBooleanArray();
+ private SparseBooleanArray mUserFaceAuthenticated = new SparseBooleanArray();
private SparseBooleanArray mUserFaceUnlockRunning = new SparseBooleanArray();
private static int sCurrentUser;
- private Runnable mUpdateFingerprintListeningState = this::updateFingerprintListeningState;
+ private Runnable mUpdateBiometricListeningState = this::updateBiometricListeningState;
private static boolean sDisableHandlerCheckForTesting;
public synchronized static void setCurrentUser(int currentUser) {
@@ -490,7 +495,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
*/
public void setKeyguardOccluded(boolean occluded) {
mKeyguardOccluded = occluded;
- updateFingerprintListeningState();
+ updateBiometricListeningState();
}
/**
@@ -518,19 +523,19 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
mUserFingerprintAuthenticated.put(userId, true);
// Update/refresh trust state only if user can skip bouncer
if (getUserCanSkipBouncer(userId)) {
- mTrustManager.unlockedByFingerprintForUser(userId);
+ mTrustManager.unlockedByBiometricForUser(userId, BiometricSourceType.FINGERPRINT);
}
// Don't send cancel if authentication succeeds
mFingerprintCancelSignal = null;
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
- cb.onFingerprintAuthenticated(userId);
+ cb.onBiometricAuthenticated(userId, BiometricSourceType.FINGERPRINT);
}
}
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_FINGERPRINT_AUTHENTICATION_CONTINUE),
- FINGERPRINT_CONTINUE_DELAY_MS);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE),
+ BIOMETRIC_CONTINUE_DELAY_MS);
// Only authenticate fingerprint once when assistant is visible
mAssistantVisible = false;
@@ -542,10 +547,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
- cb.onFingerprintAuthFailed();
+ cb.onBiometricAuthFailed(BiometricSourceType.FINGERPRINT);
}
}
- handleFingerprintHelp(-1, mContext.getString(R.string.fingerprint_not_recognized));
+ handleFingerprintHelp(-1, mContext.getString(R.string.kg_fingerprint_not_recognized));
}
private void handleFingerprintAcquired(int acquireInfo) {
@@ -555,7 +560,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
- cb.onFingerprintAcquired();
+ cb.onBiometricAcquired(BiometricSourceType.FINGERPRINT);
}
}
}
@@ -580,7 +585,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
onFingerprintAuthenticated(userId);
} finally {
- setFingerprintRunningState(FINGERPRINT_STATE_STOPPED);
+ setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
}
Trace.endSection();
}
@@ -589,7 +594,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
- cb.onFingerprintHelp(msgId, helpString);
+ cb.onBiometricHelp(msgId, helpString, BiometricSourceType.FINGERPRINT);
}
}
}
@@ -598,23 +603,23 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
@Override
public void run() {
Log.w(TAG, "Retrying fingerprint after HW unavailable, attempt " +
- mHardwareUnavailableRetryCount);
+ mHardwareFingerprintUnavailableRetryCount);
updateFingerprintListeningState();
}
};
private void handleFingerprintError(int msgId, String errString) {
if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED
- && mFingerprintRunningState == FINGERPRINT_STATE_CANCELLING_RESTARTING) {
- setFingerprintRunningState(FINGERPRINT_STATE_STOPPED);
+ && mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
+ setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
startListeningForFingerprint();
} else {
- setFingerprintRunningState(FINGERPRINT_STATE_STOPPED);
+ setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
}
if (msgId == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) {
- if (mHardwareUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
- mHardwareUnavailableRetryCount++;
+ if (mHardwareFingerprintUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
+ mHardwareFingerprintUnavailableRetryCount++;
mHandler.removeCallbacks(mRetryFingerprintAuthentication);
mHandler.postDelayed(mRetryFingerprintAuthentication, HW_UNAVAILABLE_TIMEOUT);
}
@@ -629,7 +634,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
- cb.onFingerprintError(msgId, errString);
+ cb.onBiometricError(msgId, errString, BiometricSourceType.FINGERPRINT);
}
}
}
@@ -639,8 +644,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void setFingerprintRunningState(int fingerprintRunningState) {
- boolean wasRunning = mFingerprintRunningState == FINGERPRINT_STATE_RUNNING;
- boolean isRunning = fingerprintRunningState == FINGERPRINT_STATE_RUNNING;
+ boolean wasRunning = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING;
+ boolean isRunning = fingerprintRunningState == BIOMETRIC_STATE_RUNNING;
mFingerprintRunningState = fingerprintRunningState;
// Clients of KeyguardUpdateMonitor don't care about the internal state about the
@@ -656,10 +661,162 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
- cb.onFingerprintRunningStateChanged(isFingerprintDetectionRunning());
+ cb.onBiometricRunningStateChanged(isFingerprintDetectionRunning(),
+ BiometricSourceType.FINGERPRINT);
+ }
+ }
+ }
+
+ private void onFaceAuthenticated(int userId) {
+ Trace.beginSection("KeyGuardUpdateMonitor#onFaceAuthenticated");
+ mUserFaceAuthenticated.put(userId, true);
+ // Update/refresh trust state only if user can skip bouncer
+ if (getUserCanSkipBouncer(userId)) {
+ mTrustManager.unlockedByBiometricForUser(userId, BiometricSourceType.FACE);
+ }
+ // Don't send cancel if authentication succeeds
+ mFaceCancelSignal = null;
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onBiometricAuthenticated(userId,
+ BiometricSourceType.FACE);
+ }
+ }
+
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE),
+ BIOMETRIC_CONTINUE_DELAY_MS);
+
+ // Only authenticate face once when assistant is visible
+ mAssistantVisible = false;
+
+ Trace.endSection();
+ }
+
+ private void handleFaceAuthFailed() {
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onBiometricAuthFailed(BiometricSourceType.FACE);
+ }
+ }
+ handleFaceHelp(-1, mContext.getString(R.string.kg_face_not_recognized));
+ }
+
+ private void handleFaceAcquired(int acquireInfo) {
+ if (acquireInfo != FaceManager.FACE_ACQUIRED_GOOD) {
+ return;
+ }
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onBiometricAcquired(BiometricSourceType.FACE);
+ }
+ }
+ }
+
+ private void handleFaceAuthenticated(int authUserId) {
+ Trace.beginSection("KeyGuardUpdateMonitor#handlerFaceAuthenticated");
+ try {
+ final int userId;
+ try {
+ userId = ActivityManager.getService().getCurrentUser().id;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to get current user id: ", e);
+ return;
+ }
+ if (userId != authUserId) {
+ Log.d(TAG, "Face authenticated for wrong user: " + authUserId);
+ return;
+ }
+ if (isFaceDisabled(userId)) {
+ Log.d(TAG, "Face authentication disabled by DPM for userId: " + userId);
+ return;
+ }
+ onFaceAuthenticated(userId);
+ } finally {
+ setFaceRunningState(BIOMETRIC_STATE_STOPPED);
+ }
+ Trace.endSection();
+ }
+
+ private void handleFaceHelp(int msgId, String helpString) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onBiometricHelp(msgId, helpString, BiometricSourceType.FACE);
+ }
+ }
+ }
+
+ private Runnable mRetryFaceAuthentication = new Runnable() {
+ @Override
+ public void run() {
+ Log.w(TAG, "Retrying face after HW unavailable, attempt " +
+ mHardwareFaceUnavailableRetryCount);
+ updateFaceListeningState();
+ }
+ };
+
+ private void handleFaceError(int msgId, String errString) {
+ if (msgId == FaceManager.FACE_ERROR_CANCELED
+ && mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
+ setFaceRunningState(BIOMETRIC_STATE_STOPPED);
+ startListeningForFace();
+ } else {
+ setFaceRunningState(BIOMETRIC_STATE_STOPPED);
+ }
+
+ if (msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE) {
+ if (mHardwareFaceUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
+ mHardwareFaceUnavailableRetryCount++;
+ mHandler.removeCallbacks(mRetryFaceAuthentication);
+ mHandler.postDelayed(mRetryFaceAuthentication, HW_UNAVAILABLE_TIMEOUT);
+ }
+ }
+
+ if (msgId == FaceManager.FACE_ERROR_LOCKOUT_PERMANENT) {
+ mLockPatternUtils.requireStrongAuth(
+ LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT,
+ getCurrentUser());
+ }
+
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onBiometricError(msgId, errString,
+ BiometricSourceType.FACE);
+ }
+ }
+ }
+
+ private void handleFaceLockoutReset() {
+ updateFaceListeningState();
+ }
+
+ private void setFaceRunningState(int faceRunningState) {
+ boolean wasRunning = mFaceRunningState == BIOMETRIC_STATE_RUNNING;
+ boolean isRunning = faceRunningState == BIOMETRIC_STATE_RUNNING;
+ mFaceRunningState = faceRunningState;
+
+ // Clients of KeyguardUpdateMonitor don't care about the internal state or about the
+ // asynchronousness of the cancel cycle. So only notify them if the actualy running state
+ // has changed.
+ if (wasRunning != isRunning) {
+ notifyFaceRunningStateChanged();
+ }
+ }
+
+ private void notifyFaceRunningStateChanged() {
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onBiometricRunningStateChanged(isFaceDetectionRunning(),
+ BiometricSourceType.FACE);
}
}
}
+
private void handleFaceUnlockStateChanged(boolean running, int userId) {
checkIsHandlerThread();
mUserFaceUnlockRunning.put(userId, running);
@@ -676,7 +833,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
public boolean isFingerprintDetectionRunning() {
- return mFingerprintRunningState == FINGERPRINT_STATE_RUNNING;
+ return mFingerprintRunningState == BIOMETRIC_STATE_RUNNING;
+ }
+
+ public boolean isFaceDetectionRunning() {
+ return mFaceRunningState == BIOMETRIC_STATE_RUNNING;
}
private boolean isTrustDisabled(int userId) {
@@ -695,9 +856,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
|| isSimPinSecure();
}
+ private boolean isFaceDisabled(int userId) {
+ final DevicePolicyManager dpm =
+ (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ return dpm != null && (dpm.getKeyguardDisabledFeatures(null, userId)
+ & DevicePolicyManager.KEYGUARD_DISABLE_FACE) != 0
+ || isSimPinSecure();
+ }
+
+
public boolean getUserCanSkipBouncer(int userId) {
return getUserHasTrust(userId) || (mUserFingerprintAuthenticated.get(userId)
- && isUnlockingWithFingerprintAllowed());
+ && isUnlockingWithBiometricAllowed());
}
public boolean getUserHasTrust(int userId) {
@@ -708,8 +878,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
return mUserTrustIsManaged.get(userId) && !isTrustDisabled(userId);
}
- public boolean isUnlockingWithFingerprintAllowed() {
- return mStrongAuthTracker.isUnlockingWithFingerprintAllowed();
+ public boolean isUnlockingWithBiometricAllowed() {
+ return mStrongAuthTracker.isUnlockingWithBiometricAllowed();
}
public boolean isUserInLockdown(int userId) {
@@ -867,7 +1037,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
};
- private final FingerprintManager.LockoutResetCallback mLockoutResetCallback
+ private final FingerprintManager.LockoutResetCallback mFingerprintLockoutResetCallback
= new FingerprintManager.LockoutResetCallback() {
@Override
public void onLockoutReset() {
@@ -875,13 +1045,21 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
};
- private FingerprintManager.AuthenticationCallback mAuthenticationCallback
+ private final FaceManager.LockoutResetCallback mFaceLockoutResetCallback
+ = new FaceManager.LockoutResetCallback() {
+ @Override
+ public void onLockoutReset() {
+ handleFaceLockoutReset();
+ }
+ };
+
+ private FingerprintManager.AuthenticationCallback mFingerprintAuthenticationCallback
= new AuthenticationCallback() {
@Override
public void onAuthenticationFailed() {
handleFingerprintAuthFailed();
- };
+ }
@Override
public void onAuthenticationSucceeded(AuthenticationResult result) {
@@ -905,8 +1083,42 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
handleFingerprintAcquired(acquireInfo);
}
};
+
+ private FaceManager.AuthenticationCallback mFaceAuthenticationCallback
+ = new FaceManager.AuthenticationCallback() {
+
+ @Override
+ public void onAuthenticationFailed() {
+ handleFaceAuthFailed();
+ }
+
+ @Override
+ public void onAuthenticationSucceeded(FaceManager.AuthenticationResult result) {
+ Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded");
+ handleFaceAuthenticated(result.getUserId());
+ Trace.endSection();
+ }
+
+ @Override
+ public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
+ handleFaceHelp(helpMsgId, helpString.toString());
+ }
+
+ @Override
+ public void onAuthenticationError(int errMsgId, CharSequence errString) {
+ handleFaceError(errMsgId, errString.toString());
+ }
+
+ @Override
+ public void onAuthenticationAcquired(int acquireInfo) {
+ handleFaceAcquired(acquireInfo);
+ }
+ };
+
private CancellationSignal mFingerprintCancelSignal;
+ private CancellationSignal mFaceCancelSignal;
private FingerprintManager mFpm;
+ private FaceManager mFaceAuthenticationManager;
/**
* When we receive a
@@ -1054,9 +1266,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
super(context);
}
- public boolean isUnlockingWithFingerprintAllowed() {
+ public boolean isUnlockingWithBiometricAllowed() {
int userId = getCurrentUser();
- return isFingerprintAllowedForUser(userId);
+ return isBiometricAllowedForUser(userId);
}
public boolean hasUserAuthenticatedSinceBoot() {
@@ -1080,7 +1292,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
protected void handleStartedWakingUp() {
Trace.beginSection("KeyguardUpdateMonitor#handleStartedWakingUp");
- updateFingerprintListeningState();
+ updateBiometricListeningState();
final int count = mCallbacks.size();
for (int i = 0; i < count; i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -1092,7 +1304,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
protected void handleStartedGoingToSleep(int arg1) {
- clearFingerprintRecognized();
+ clearBiometricRecognized();
final int count = mCallbacks.size();
for (int i = 0; i < count; i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -1101,7 +1313,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
}
mGoingToSleep = true;
- updateFingerprintListeningState();
+ updateBiometricListeningState();
}
protected void handleFinishedGoingToSleep(int arg1) {
@@ -1113,7 +1325,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
cb.onFinishedGoingToSleep(arg1);
}
}
- updateFingerprintListeningState();
+ updateBiometricListeningState();
}
private void handleScreenTurnedOn() {
@@ -1127,7 +1339,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleScreenTurnedOff() {
- mHardwareUnavailableRetryCount = 0;
+ mHardwareFingerprintUnavailableRetryCount = 0;
+ mHardwareFaceUnavailableRetryCount = 0;
final int count = mCallbacks.size();
for (int i = 0; i < count; i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -1146,7 +1359,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
cb.onDreamingStateChanged(mIsDreaming);
}
}
- updateFingerprintListeningState();
+ updateBiometricListeningState();
}
private void handleUserInfoChanged(int userId) {
@@ -1244,9 +1457,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
}
- updateFingerprintListeningState();
+
+ if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
+ mFaceAuthenticationManager =
+ (FaceManager) context.getSystemService(Context.FACE_SERVICE);
+ }
+ updateBiometricListeningState();
if (mFpm != null) {
- mFpm.addLockoutResetCallback(mLockoutResetCallback);
+ mFpm.addLockoutResetCallback(mFingerprintLockoutResetCallback);
+ }
+ if (mFaceAuthenticationManager != null) {
+ mFaceAuthenticationManager.addLockoutResetCallback(mFaceLockoutResetCallback);
}
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
@@ -1255,28 +1476,55 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled();
}
+ private void updateBiometricListeningState() {
+ updateFingerprintListeningState();
+ updateFaceListeningState();
+ }
+
private void updateFingerprintListeningState() {
// If this message exists, we should not authenticate again until this message is
// consumed by the handler
- if (mHandler.hasMessages(MSG_FINGERPRINT_AUTHENTICATION_CONTINUE)) {
+ if (mHandler.hasMessages(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE)) {
return;
}
mHandler.removeCallbacks(mRetryFingerprintAuthentication);
boolean shouldListenForFingerprint = shouldListenForFingerprint();
- if (mFingerprintRunningState == FINGERPRINT_STATE_RUNNING && !shouldListenForFingerprint) {
+ if (mFingerprintRunningState == BIOMETRIC_STATE_RUNNING && !shouldListenForFingerprint) {
stopListeningForFingerprint();
- } else if (mFingerprintRunningState != FINGERPRINT_STATE_RUNNING
+ } else if (mFingerprintRunningState != BIOMETRIC_STATE_RUNNING
&& shouldListenForFingerprint) {
startListeningForFingerprint();
}
}
+ private void updateFaceListeningState() {
+ // If this message exists, we should not authenticate again until this message is
+ // consumed by the handler
+ if (mHandler.hasMessages(MSG_BIOMETRIC_AUTHENTICATION_CONTINUE)) {
+ return;
+ }
+ mHandler.removeCallbacks(mRetryFaceAuthentication);
+ boolean shouldListenForFace = shouldListenForFace();
+ if (mFaceRunningState == BIOMETRIC_STATE_RUNNING && !shouldListenForFace) {
+ stopListeningForFace();
+ } else if (mFaceRunningState != BIOMETRIC_STATE_RUNNING
+ && shouldListenForFace) {
+ startListeningForFace();
+ }
+ }
+
private boolean shouldListenForFingerprintAssistant() {
return mAssistantVisible && mKeyguardOccluded
&& !mUserFingerprintAuthenticated.get(getCurrentUser(), false)
&& !mUserHasTrust.get(getCurrentUser(), false);
}
+ private boolean shouldListenForFaceAssistant() {
+ return mAssistantVisible && mKeyguardOccluded
+ && !mUserFaceAuthenticated.get(getCurrentUser(), false)
+ && !mUserHasTrust.get(getCurrentUser(), false);
+ }
+
private boolean shouldListenForFingerprint() {
return (mKeyguardIsVisible || !mDeviceInteractive ||
(mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
@@ -1285,9 +1533,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
&& !mKeyguardGoingAway;
}
+ private boolean shouldListenForFace() {
+ return (mKeyguardIsVisible || !mDeviceInteractive ||
+ (mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
+ shouldListenForFaceAssistant() || (mKeyguardOccluded && mIsDreaming))
+ && !mSwitchingUser && !isFaceDisabled(getCurrentUser())
+ && !mKeyguardGoingAway;
+ }
+
+
private void startListeningForFingerprint() {
- if (mFingerprintRunningState == FINGERPRINT_STATE_CANCELLING) {
- setFingerprintRunningState(FINGERPRINT_STATE_CANCELLING_RESTARTING);
+ if (mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING) {
+ setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING_RESTARTING);
return;
}
if (DEBUG) Log.v(TAG, "startListeningForFingerprint()");
@@ -1297,9 +1554,27 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
mFingerprintCancelSignal.cancel();
}
mFingerprintCancelSignal = new CancellationSignal();
- mFpm.authenticate(null, mFingerprintCancelSignal, 0, mAuthenticationCallback, null,
- userId);
- setFingerprintRunningState(FINGERPRINT_STATE_RUNNING);
+ mFpm.authenticate(null, mFingerprintCancelSignal, 0, mFingerprintAuthenticationCallback,
+ null, userId);
+ setFingerprintRunningState(BIOMETRIC_STATE_RUNNING);
+ }
+ }
+
+ private void startListeningForFace() {
+ if (mFaceRunningState == BIOMETRIC_STATE_CANCELLING) {
+ setFaceRunningState(BIOMETRIC_STATE_CANCELLING_RESTARTING);
+ return;
+ }
+ if (DEBUG) Log.v(TAG, "startListeningForFace()");
+ int userId = ActivityManager.getCurrentUser();
+ if (isUnlockWithFacePossible(userId)) {
+ if (mFaceCancelSignal != null) {
+ mFaceCancelSignal.cancel();
+ }
+ mFaceCancelSignal = new CancellationSignal();
+ mFaceAuthenticationManager.authenticate(null, mFaceCancelSignal, 0,
+ mFaceAuthenticationCallback, null);
+ setFaceRunningState(BIOMETRIC_STATE_RUNNING);
}
}
@@ -1320,17 +1595,37 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
&& mFpm.getEnrolledFingerprints(userId).size() > 0;
}
+ public boolean isUnlockWithFacePossible(int userId) {
+ return mFaceAuthenticationManager != null && mFaceAuthenticationManager.isHardwareDetected()
+ && !isFaceDisabled(userId)
+ && mFaceAuthenticationManager.hasEnrolledFaces(userId);
+ }
+
private void stopListeningForFingerprint() {
if (DEBUG) Log.v(TAG, "stopListeningForFingerprint()");
- if (mFingerprintRunningState == FINGERPRINT_STATE_RUNNING) {
+ if (mFingerprintRunningState == BIOMETRIC_STATE_RUNNING) {
if (mFingerprintCancelSignal != null) {
mFingerprintCancelSignal.cancel();
mFingerprintCancelSignal = null;
}
- setFingerprintRunningState(FINGERPRINT_STATE_CANCELLING);
+ setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING);
+ }
+ if (mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
+ setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING);
+ }
+ }
+
+ private void stopListeningForFace() {
+ if (DEBUG) Log.v(TAG, "stopListeningForFace()");
+ if (mFaceRunningState == BIOMETRIC_STATE_RUNNING) {
+ if (mFaceCancelSignal != null) {
+ mFaceCancelSignal.cancel();
+ mFaceCancelSignal = null;
+ }
+ setFaceRunningState(BIOMETRIC_STATE_CANCELLING);
}
- if (mFingerprintRunningState == FINGERPRINT_STATE_CANCELLING_RESTARTING) {
- setFingerprintRunningState(FINGERPRINT_STATE_CANCELLING);
+ if (mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
+ setFaceRunningState(BIOMETRIC_STATE_CANCELLING);
}
}
@@ -1609,6 +1904,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
}
+ public boolean isKeyguardVisible() {
+ return mKeyguardIsVisible;
+ }
+
/**
* Notifies that the visibility state of Keyguard has changed.
*
@@ -1624,7 +1923,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
cb.onKeyguardVisibilityChangedRaw(showing);
}
}
- updateFingerprintListeningState();
+ updateBiometricListeningState();
}
/**
@@ -1632,7 +1931,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
*/
private void handleKeyguardReset() {
if (DEBUG) Log.d(TAG, "handleKeyguardReset");
- updateFingerprintListeningState();
+ updateBiometricListeningState();
mNeedsSlowUnlockTransition = resolveNeedsSlowUnlockTransition();
}
@@ -1661,7 +1960,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
cb.onKeyguardBouncerChanged(isBouncer);
}
}
- updateFingerprintListeningState();
+ updateBiometricListeningState();
}
/**
@@ -1744,7 +2043,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
public void setSwitchingUser(boolean switching) {
mSwitchingUser = switching;
// Since this comes in on a binder thread, we need to post if first
- mHandler.post(mUpdateFingerprintListeningState);
+ mHandler.post(mUpdateBiometricListeningState);
}
private void sendUpdates(KeyguardUpdateMonitorCallback callback) {
@@ -1832,9 +2131,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
mFailedAttempts.put(userId, getFailedUnlockAttempts(userId) + 1);
}
- public void clearFingerprintRecognized() {
+ public void clearBiometricRecognized() {
mUserFingerprintAuthenticated.clear();
- mTrustManager.clearAllFingerprints();
+ mUserFaceAuthenticated.clear();
+ mTrustManager.clearAllBiometricRecognized(BiometricSourceType.FINGERPRINT);
+ mTrustManager.clearAllBiometricRecognized(BiometricSourceType.FACE);
}
public boolean isSimPinVoiceSecure() {
@@ -1863,7 +2164,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
@Override
public void onTaskStackChangedBackground() {
try {
- ActivityManager.StackInfo info = ActivityManager.getService().getStackInfo(
+ ActivityManager.StackInfo info = ActivityTaskManager.getService().getStackInfo(
WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_ASSISTANT);
if (info == null) {
return;
@@ -2099,7 +2400,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
final int userId = ActivityManager.getCurrentUser();
final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId);
pw.println(" Fingerprint state (user=" + userId + ")");
- pw.println(" allowed=" + isUnlockingWithFingerprintAllowed());
+ pw.println(" allowed=" + isUnlockingWithBiometricAllowed());
pw.println(" auth'd=" + mUserFingerprintAuthenticated.get(userId));
pw.println(" authSinceBoot="
+ getStrongAuthTracker().hasUserAuthenticatedSinceBoot());
@@ -2108,5 +2409,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
pw.println(" strongAuthFlags=" + Integer.toHexString(strongAuthFlags));
pw.println(" trustManaged=" + getUserTrustIsManaged(userId));
}
+ if (mFaceAuthenticationManager != null && mFaceAuthenticationManager.isHardwareDetected()) {
+ final int userId = ActivityManager.getCurrentUser();
+ final int strongAuthFlags = mStrongAuthTracker.getStrongAuthForUser(userId);
+ pw.println(" Face authentication state (user=" + userId + ")");
+ pw.println(" allowed=" + isUnlockingWithBiometricAllowed());
+ pw.println(" auth'd=" + mUserFaceAuthenticated.get(userId));
+ pw.println(" authSinceBoot="
+ + getStrongAuthTracker().hasUserAuthenticatedSinceBoot());
+ pw.println(" disabled(DPM)=" + isFaceDisabled(userId));
+ pw.println(" possible=" + isUnlockWithFacePossible(userId));
+ pw.println(" strongAuthFlags=" + Integer.toHexString(strongAuthFlags));
+ pw.println(" trustManaged=" + getUserTrustIsManaged(userId));
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
index 730ccb998364..08da6f30607c 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
@@ -17,7 +17,7 @@ package com.android.keyguard;
import android.app.admin.DevicePolicyManager;
import android.graphics.Bitmap;
-import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.biometrics.BiometricSourceType;
import android.media.AudioManager;
import android.os.SystemClock;
import android.telephony.ServiceState;
@@ -221,38 +221,46 @@ public class KeyguardUpdateMonitorCallback {
public void onTrustGrantedWithFlags(int flags, int userId) { }
/**
- * Called when a finger has been acquired.
+ * Called when a biometric has been acquired.
* <p>
- * It is guaranteed that either {@link #onFingerprintAuthenticated} or
- * {@link #onFingerprintAuthFailed()} is called after this method eventually.
+ * It is guaranteed that either {@link #onBiometricAuthenticated} or
+ * {@link #onBiometricAuthFailed(BiometricSourceType)} is called after this method eventually.
+ * @param biometricSourceType
*/
- public void onFingerprintAcquired() { }
+ public void onBiometricAcquired(BiometricSourceType biometricSourceType) { }
/**
- * Called when a fingerprint couldn't be authenticated.
+ * Called when a biometric couldn't be authenticated.
+ * @param biometricSourceType
*/
- public void onFingerprintAuthFailed() { }
+ public void onBiometricAuthFailed(BiometricSourceType biometricSourceType) { }
/**
- * Called when a fingerprint is recognized.
- * @param userId the user id for which the fingerprint was authenticated
+ * Called when a biometric is recognized.
+ * @param userId the user id for which the biometric sample was authenticated
+ * @param biometricSourceType
*/
- public void onFingerprintAuthenticated(int userId) { }
+ public void onBiometricAuthenticated(int userId, BiometricSourceType biometricSourceType) { }
/**
- * Called when fingerprint provides help string (e.g. "Try again")
+ * Called when biometric authentication provides help string (e.g. "Try again")
* @param msgId
* @param helpString
+ * @param biometricSourceType
*/
- public void onFingerprintHelp(int msgId, String helpString) { }
+ public void onBiometricHelp(int msgId, String helpString,
+ BiometricSourceType biometricSourceType) { }
/**
- * Called when fingerprint provides an semi-permanent error message
- * (e.g. "Hardware not available").
- * @param msgId one of the error messages listed in {@link FingerprintManager}
+ * Called when biometric authentication method provides a semi-permanent
+ * error message (e.g. "Hardware not available").
+ * @param msgId one of the error messages listed in
+ * {@link android.hardware.biometrics.BiometricConstants}
* @param errString
+ * @param biometricSourceType
*/
- public void onFingerprintError(int msgId, String errString) { }
+ public void onBiometricError(int msgId, String errString,
+ BiometricSourceType biometricSourceType) { }
/**
* Called when the state of face unlock changed.
@@ -260,9 +268,10 @@ public class KeyguardUpdateMonitorCallback {
public void onFaceUnlockStateChanged(boolean running, int userId) { }
/**
- * Called when the fingerprint running state changed.
+ * Called when biometric running state changed.
*/
- public void onFingerprintRunningStateChanged(boolean running) { }
+ public void onBiometricRunningStateChanged(boolean running,
+ BiometricSourceType biometricSourceType) { }
/**
* Called when the state that the user hasn't used strong authentication since quite some time
diff --git a/packages/SystemUI/src/com/android/keyguard/SecurityMessageDisplay.java b/packages/SystemUI/src/com/android/keyguard/SecurityMessageDisplay.java
index 6977b51e8712..7c86a1dfb797 100644
--- a/packages/SystemUI/src/com/android/keyguard/SecurityMessageDisplay.java
+++ b/packages/SystemUI/src/com/android/keyguard/SecurityMessageDisplay.java
@@ -16,9 +16,11 @@
package com.android.keyguard;
+import android.content.res.ColorStateList;
+
public interface SecurityMessageDisplay {
- void setNextMessageColor(int color);
+ void setNextMessageColor(ColorStateList colorState);
void setMessage(CharSequence msg);
diff --git a/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java b/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java
index 01b42545a8cf..bbc8ecdcc066 100644
--- a/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java
@@ -92,6 +92,11 @@ public class AutoReinflateContainer extends FrameLayout implements
}
@Override
+ public void onUiModeChanged() {
+ inflateLayout();
+ }
+
+ @Override
public void onLocaleListChanged() {
inflateLayout();
}
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 59501f0970c2..3ac67056ff80 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -55,7 +55,10 @@ import com.android.systemui.statusbar.policy.IconLogger;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
import com.android.systemui.util.Utils.DisableStateTracker;
+import com.android.systemui.R;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.text.NumberFormat;
public class BatteryMeterView extends LinearLayout implements
@@ -72,6 +75,7 @@ public class BatteryMeterView extends LinearLayout implements
private int mTextColor;
private int mLevel;
private boolean mForceShowPercent;
+ private boolean mShowPercentAvailable;
private int mDarkModeBackgroundColor;
private int mDarkModeFillColor;
@@ -111,6 +115,9 @@ public class BatteryMeterView extends LinearLayout implements
atts.recycle();
mSettingObserver = new SettingObserver(new Handler(context.getMainLooper()));
+ mShowPercentAvailable = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_battery_percentage_setting_available);
+
addOnAttachStateChangeListener(
new DisableStateTracker(DISABLE_NONE, DISABLE2_SYSTEM_ICONS));
@@ -167,8 +174,8 @@ public class BatteryMeterView extends LinearLayout implements
if (mUseWallpaperTextColors) {
updateColors(
- Utils.getColorAttr(mContext, R.attr.wallpaperTextColor),
- Utils.getColorAttr(mContext, R.attr.wallpaperTextColorSecondary));
+ Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor),
+ Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColorSecondary));
} else {
updateColors(mNonAdaptedForegroundColor, mNonAdaptedBackgroundColor);
}
@@ -183,10 +190,13 @@ public class BatteryMeterView extends LinearLayout implements
Utils.getThemeAttr(context, R.attr.darkIconTheme));
Context dualToneLightTheme = new ContextThemeWrapper(context,
Utils.getThemeAttr(context, R.attr.lightIconTheme));
- mDarkModeBackgroundColor = Utils.getColorAttr(dualToneDarkTheme, R.attr.backgroundColor);
- mDarkModeFillColor = Utils.getColorAttr(dualToneDarkTheme, R.attr.fillColor);
- mLightModeBackgroundColor = Utils.getColorAttr(dualToneLightTheme, R.attr.backgroundColor);
- mLightModeFillColor = Utils.getColorAttr(dualToneLightTheme, R.attr.fillColor);
+ mDarkModeBackgroundColor = Utils.getColorAttrDefaultColor(dualToneDarkTheme,
+ R.attr.backgroundColor);
+ mDarkModeFillColor = Utils.getColorAttrDefaultColor(dualToneDarkTheme,
+ R.attr.fillColor);
+ mLightModeBackgroundColor = Utils.getColorAttrDefaultColor(dualToneLightTheme,
+ R.attr.backgroundColor);
+ mLightModeFillColor = Utils.getColorAttrDefaultColor(dualToneLightTheme, R.attr.fillColor);
}
@Override
@@ -259,8 +269,11 @@ public class BatteryMeterView extends LinearLayout implements
private void updateShowPercent() {
final boolean showing = mBatteryPercentView != null;
- if (0 != Settings.System.getIntForUser(getContext().getContentResolver(),
- SHOW_BATTERY_PERCENT, 0, mUser) || mForceShowPercent) {
+ final boolean systemSetting = 0 != Settings.System
+ .getIntForUser(getContext().getContentResolver(),
+ SHOW_BATTERY_PERCENT, 0, mUser);
+
+ if ((mShowPercentAvailable && systemSetting) || mForceShowPercent) {
if (!showing) {
mBatteryPercentView = loadPercentView();
if (mTextColor != 0) mBatteryPercentView.setTextColor(mTextColor);
@@ -340,6 +353,17 @@ public class BatteryMeterView extends LinearLayout implements
return (int) ArgbEvaluator.getInstance().evaluate(darkIntensity, lightColor, darkColor);
}
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ String powerSave = mDrawable == null ? null : mDrawable.getPowerSave() + "";
+ CharSequence percent = mBatteryPercentView == null ? null : mBatteryPercentView.getText();
+ pw.println(" BatteryMeterView:");
+ pw.println(" mDrawable.getPowerSave: " + powerSave);
+ pw.println(" mBatteryPercentView.getText(): " + percent);
+ pw.println(" mTextColor: #" + Integer.toHexString(mTextColor));
+ pw.println(" mLevel: " + mLevel);
+ pw.println(" mForceShowPercent: " + mForceShowPercent);
+ }
+
private final class SettingObserver extends ContentObserver {
public SettingObserver(Handler handler) {
super(handler);
diff --git a/packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java b/packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java
index fb2eb4cbe36d..97d799909ed9 100644
--- a/packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/HardwareBgDrawable.java
@@ -61,7 +61,7 @@ public class HardwareBgDrawable extends LayerDrawable {
: R.drawable.rounded_bg_bottom).mutate(),
};
}
- layers[1].setTint(Utils.getColorAttr(context, android.R.attr.colorPrimary));
+ layers[1].setTintList(Utils.getColorAttr(context, android.R.attr.colorPrimary));
return layers;
}
diff --git a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
index 98dc3219acc6..198a4e6cedb8 100644
--- a/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/HardwareUiLayout.java
@@ -27,32 +27,33 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver;
-import android.widget.FrameLayout;
import android.widget.LinearLayout;
+
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
import com.android.systemui.util.leak.RotationUtils;
-import java.util.ArrayList;
-
import static com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE;
import static com.android.systemui.util.leak.RotationUtils.ROTATION_NONE;
import static com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE;
-public class HardwareUiLayout extends FrameLayout implements Tunable {
+public class HardwareUiLayout extends LinearLayout implements Tunable {
private static final String EDGE_BLEED = "sysui_hwui_edge_bleed";
private static final String ROUNDED_DIVIDER = "sysui_hwui_rounded_divider";
private final int[] mTmp2 = new int[2];
- private View mChild;
+ private View mList;
+ private View mSeparatedView;
private int mOldHeight;
private boolean mAnimating;
private AnimatorSet mAnimation;
private View mDivision;
private boolean mHasOutsideTouch;
- private HardwareBgDrawable mBackground;
+ private HardwareBgDrawable mListBackground;
+ private HardwareBgDrawable mSeparatedViewBackground;
private Animator mAnimator;
private boolean mCollapse;
+ private boolean mHasSeparatedButton;
private int mEndPoint;
private boolean mEdgeBleed;
private boolean mRoundedDivider;
@@ -91,16 +92,19 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
mRoundedDivider = Settings.Secure.getInt(getContext().getContentResolver(),
ROUNDED_DIVIDER, 0) != 0;
updateEdgeMargin(mEdgeBleed ? 0 : getEdgePadding());
- mBackground = new HardwareBgDrawable(mRoundedDivider, !mEdgeBleed, getContext());
- if (mChild != null) {
- mChild.setBackground(mBackground);
+ mListBackground = new HardwareBgDrawable(mRoundedDivider, !mEdgeBleed, getContext());
+ mSeparatedViewBackground = new HardwareBgDrawable(mRoundedDivider, !mEdgeBleed,
+ getContext());
+ if (mList != null) {
+ mList.setBackground(mListBackground);
+ mSeparatedView.setBackground(mSeparatedViewBackground);
requestLayout();
}
}
private void updateEdgeMargin(int edge) {
- if (mChild != null) {
- MarginLayoutParams params = (MarginLayoutParams) mChild.getLayoutParams();
+ if (mList != null) {
+ MarginLayoutParams params = (MarginLayoutParams) mList.getLayoutParams();
if (mRotation == ROTATION_LANDSCAPE) {
params.topMargin = edge;
} else if (mRotation == ROTATION_SEASCAPE) {
@@ -108,7 +112,19 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
} else {
params.rightMargin = edge;
}
- mChild.setLayoutParams(params);
+ mList.setLayoutParams(params);
+ }
+
+ if (mSeparatedView != null) {
+ MarginLayoutParams params = (MarginLayoutParams) mSeparatedView.getLayoutParams();
+ if (mRotation == ROTATION_LANDSCAPE) {
+ params.topMargin = edge;
+ } else if (mRotation == ROTATION_SEASCAPE) {
+ params.bottomMargin = edge;
+ } else {
+ params.rightMargin = edge;
+ }
+ mSeparatedView.setLayoutParams(params);
}
}
@@ -119,13 +135,15 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- if (mChild == null) {
+ if (mList == null) {
if (getChildCount() != 0) {
- mChild = getChildAt(0);
- mChild.setBackground(mBackground);
+ mList = getChildAt(0);
+ mList.setBackground(mListBackground);
+ mSeparatedView = getChildAt(1);
+ mSeparatedView.setBackground(mSeparatedViewBackground);
updateEdgeMargin(mEdgeBleed ? 0 : getEdgePadding());
- mOldHeight = mChild.getMeasuredHeight();
- mChild.addOnLayoutChangeListener(
+ mOldHeight = mList.getMeasuredHeight();
+ mList.addOnLayoutChangeListener(
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
updatePosition());
updateRotation();
@@ -133,7 +151,7 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
return;
}
}
- int newHeight = mChild.getMeasuredHeight();
+ int newHeight = mList.getMeasuredHeight();
if (newHeight != mOldHeight) {
animateChild(mOldHeight, newHeight);
}
@@ -170,37 +188,60 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
} else {
rotateLeft();
}
+ if (mHasSeparatedButton) {
+ if (from == ROTATION_SEASCAPE || to == ROTATION_SEASCAPE) {
+ // Separated view has top margin, so seascape separated view need special rotation,
+ // not a full left or right rotation.
+ swapLeftAndTop(mSeparatedView);
+ } else if (from == ROTATION_LANDSCAPE) {
+ rotateRight(mSeparatedView);
+ } else {
+ rotateLeft(mSeparatedView);
+ }
+ }
if (to != ROTATION_NONE) {
- if (mChild instanceof LinearLayout) {
+ if (mList instanceof LinearLayout) {
mRotatedBackground = true;
- mBackground.setRotatedBackground(true);
- LinearLayout linearLayout = (LinearLayout) mChild;
+ mListBackground.setRotatedBackground(true);
+ mSeparatedViewBackground.setRotatedBackground(true);
+ LinearLayout linearLayout = (LinearLayout) mList;
if (mSwapOrientation) {
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
+ setOrientation(LinearLayout.HORIZONTAL);
}
- swapDimens(this.mChild);
+ swapDimens(mList);
+ swapDimens(mSeparatedView);
}
} else {
- if (mChild instanceof LinearLayout) {
+ if (mList instanceof LinearLayout) {
mRotatedBackground = false;
- mBackground.setRotatedBackground(false);
- LinearLayout linearLayout = (LinearLayout) mChild;
+ mListBackground.setRotatedBackground(false);
+ mSeparatedViewBackground.setRotatedBackground(false);
+ LinearLayout linearLayout = (LinearLayout) mList;
if (mSwapOrientation) {
linearLayout.setOrientation(LinearLayout.VERTICAL);
+ setOrientation(LinearLayout.VERTICAL);
}
- swapDimens(mChild);
+ swapDimens(mList);
+ swapDimens(mSeparatedView);
}
}
}
private void rotateRight() {
rotateRight(this);
- rotateRight(mChild);
+ rotateRight(mList);
swapDimens(this);
- LayoutParams p = (LayoutParams) mChild.getLayoutParams();
+ LayoutParams p = (LayoutParams) mList.getLayoutParams();
p.gravity = rotateGravityRight(p.gravity);
- mChild.setLayoutParams(p);
+ mList.setLayoutParams(p);
+
+ LayoutParams separatedViewLayoutParams = (LayoutParams) mSeparatedView.getLayoutParams();
+ separatedViewLayoutParams.gravity = rotateGravityRight(separatedViewLayoutParams.gravity);
+ mSeparatedView.setLayoutParams(separatedViewLayoutParams);
+
+ setGravity(p.gravity);
}
private void swapDimens(View v) {
@@ -247,12 +288,18 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
private void rotateLeft() {
rotateLeft(this);
- rotateLeft(mChild);
+ rotateLeft(mList);
swapDimens(this);
- LayoutParams p = (LayoutParams) mChild.getLayoutParams();
+ LayoutParams p = (LayoutParams) mList.getLayoutParams();
p.gravity = rotateGravityLeft(p.gravity);
- mChild.setLayoutParams(p);
+ mList.setLayoutParams(p);
+
+ LayoutParams separatedViewLayoutParams = (LayoutParams) mSeparatedView.getLayoutParams();
+ separatedViewLayoutParams.gravity = rotateGravityLeft(separatedViewLayoutParams.gravity);
+ mSeparatedView.setLayoutParams(separatedViewLayoutParams);
+
+ setGravity(p.gravity);
}
private int rotateGravityLeft(int gravity) {
@@ -310,6 +357,15 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
v.setLayoutParams(params);
}
+ private void swapLeftAndTop(View v) {
+ v.setPadding(v.getPaddingTop(), v.getPaddingLeft(), v.getPaddingBottom(),
+ v.getPaddingRight());
+ MarginLayoutParams params = (MarginLayoutParams) v.getLayoutParams();
+ params.setMargins(params.topMargin, params.leftMargin, params.bottomMargin,
+ params.rightMargin);
+ v.setLayoutParams(params);
+ }
+
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
@@ -329,14 +385,14 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
mAnimating = false;
}
});
- int fromTop = mChild.getTop();
- int fromBottom = mChild.getBottom();
+ int fromTop = mList.getTop();
+ int fromBottom = mList.getBottom();
int toTop = fromTop - ((newHeight - oldHeight) / 2);
int toBottom = fromBottom + ((newHeight - oldHeight) / 2);
- ObjectAnimator top = ObjectAnimator.ofInt(mChild, "top", fromTop, toTop);
- top.addUpdateListener(animation -> mBackground.invalidateSelf());
+ ObjectAnimator top = ObjectAnimator.ofInt(mList, "top", fromTop, toTop);
+ top.addUpdateListener(animation -> mListBackground.invalidateSelf());
mAnimation.playTogether(top,
- ObjectAnimator.ofInt(mChild, "bottom", fromBottom, toBottom));
+ ObjectAnimator.ofInt(mList, "bottom", fromBottom, toBottom));
}
public void setDivisionView(View v) {
@@ -350,26 +406,30 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
}
private void updatePosition() {
- if (mChild == null) return;
+ if (mList == null) return;
+ // If got separated button, setRotatedBackground to false,
+ // all items won't get white background.
+ mListBackground.setRotatedBackground(mHasSeparatedButton);
+ mSeparatedViewBackground.setRotatedBackground(mHasSeparatedButton);
if (mDivision != null && mDivision.getVisibility() == VISIBLE) {
int index = mRotatedBackground ? 0 : 1;
mDivision.getLocationOnScreen(mTmp2);
float trans = mRotatedBackground ? mDivision.getTranslationX()
: mDivision.getTranslationY();
int viewTop = (int) (mTmp2[index] + trans);
- mChild.getLocationOnScreen(mTmp2);
+ mList.getLocationOnScreen(mTmp2);
viewTop -= mTmp2[index];
setCutPoint(viewTop);
} else {
- setCutPoint(mChild.getMeasuredHeight());
+ setCutPoint(mList.getMeasuredHeight());
}
}
private void setCutPoint(int point) {
- int curPoint = mBackground.getCutPoint();
+ int curPoint = mListBackground.getCutPoint();
if (curPoint == point) return;
if (getAlpha() == 0 || curPoint == 0) {
- mBackground.setCutPoint(point);
+ mListBackground.setCutPoint(point);
return;
}
if (mAnimator != null) {
@@ -379,7 +439,7 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
mAnimator.cancel();
}
mEndPoint = point;
- mAnimator = ObjectAnimator.ofInt(mBackground, "cutPoint", curPoint, point);
+ mAnimator = ObjectAnimator.ofInt(mListBackground, "cutPoint", curPoint, point);
if (mCollapse) {
mAnimator.setStartDelay(300);
mCollapse = false;
@@ -404,6 +464,10 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
mCollapse = true;
}
+ public void setHasSeparatedButton(boolean hasSeparatedButton) {
+ mHasSeparatedButton = hasSeparatedButton;
+ }
+
public static HardwareUiLayout get(View v) {
if (v instanceof HardwareUiLayout) return (HardwareUiLayout) v;
if (v.getParent() instanceof View) {
@@ -413,14 +477,14 @@ public class HardwareUiLayout extends FrameLayout implements Tunable {
}
private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsListener = inoutInfo -> {
- if (mHasOutsideTouch || (mChild == null)) {
+ if (mHasOutsideTouch || (mList == null)) {
inoutInfo.setTouchableInsets(
ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
return;
}
inoutInfo.setTouchableInsets(
ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT);
- inoutInfo.contentInsets.set(mChild.getLeft(), mChild.getTop(),
- 0, getBottom() - mChild.getBottom());
+ inoutInfo.contentInsets.set(mList.getLeft(), mList.getTop(),
+ 0, getBottom() - mList.getBottom());
};
}
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index b8a57bfe885a..50d862dee29c 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -290,7 +290,7 @@ public class ImageWallpaper extends WallpaperService {
|| dh != mLastSurfaceHeight;
boolean redrawNeeded = surfaceDimensionsChanged || newRotation != mLastRotation
- || mSurfaceRedrawNeeded;
+ || mSurfaceRedrawNeeded || mNeedsDrawAfterLoadingWallpaper;
if (!redrawNeeded && !mOffsetsChanged) {
if (DEBUG) {
Log.d(TAG, "Suppressed drawFrame since redraw is not needed "
diff --git a/packages/SystemUI/src/com/android/systemui/Interpolators.java b/packages/SystemUI/src/com/android/systemui/Interpolators.java
index aeef49689517..eb704c863ebc 100644
--- a/packages/SystemUI/src/com/android/systemui/Interpolators.java
+++ b/packages/SystemUI/src/com/android/systemui/Interpolators.java
@@ -31,6 +31,13 @@ import com.android.systemui.statusbar.stack.HeadsUpAppearInterpolator;
*/
public class Interpolators {
public static final Interpolator FAST_OUT_SLOW_IN = new PathInterpolator(0.4f, 0f, 0.2f, 1f);
+
+ /**
+ * Like {@link #FAST_OUT_SLOW_IN}, but used in case the animation is played in reverse (i.e. t
+ * goes from 1 to 0 instead of 0 to 1).
+ */
+ public static final Interpolator FAST_OUT_SLOW_IN_REVERSE =
+ new PathInterpolator(0.8f, 0f, 0.6f, 1f);
public static final Interpolator FAST_OUT_LINEAR_IN = new PathInterpolator(0.4f, 0f, 1f, 1f);
public static final Interpolator LINEAR_OUT_SLOW_IN = new PathInterpolator(0f, 0f, 0.2f, 1f);
public static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f);
@@ -51,4 +58,11 @@ public class Interpolators {
*/
public static final Interpolator TOUCH_RESPONSE =
new PathInterpolator(0.3f, 0f, 0.1f, 1f);
+
+ /**
+ * Like {@link #TOUCH_RESPONSE}, but used in case the animation is played in reverse (i.e. t
+ * goes from 1 to 0 instead of 0 to 1).
+ */
+ public static final Interpolator TOUCH_RESPONSE_REVERSE =
+ new PathInterpolator(0.9f, 0f, 0.7f, 1f);
}
diff --git a/packages/SystemUI/src/com/android/systemui/LatencyTester.java b/packages/SystemUI/src/com/android/systemui/LatencyTester.java
index cbb69ee98a03..1e458fa5c112 100644
--- a/packages/SystemUI/src/com/android/systemui/LatencyTester.java
+++ b/packages/SystemUI/src/com/android/systemui/LatencyTester.java
@@ -16,6 +16,7 @@
package com.android.systemui;
+import android.hardware.biometrics.BiometricSourceType;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -26,7 +27,7 @@ import android.os.SystemClock;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.internal.util.LatencyTracker;
-import com.android.systemui.statusbar.phone.FingerprintUnlockController;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.StatusBar;
/**
@@ -72,10 +73,10 @@ public class LatencyTester extends SystemUI {
}
private void fakeWakeAndUnlock() {
- FingerprintUnlockController fingerprintUnlockController = getComponent(StatusBar.class)
- .getFingerprintUnlockController();
- fingerprintUnlockController.onFingerprintAcquired();
- fingerprintUnlockController.onFingerprintAuthenticated(
- KeyguardUpdateMonitor.getCurrentUser());
+ BiometricUnlockController biometricUnlockController = getComponent(StatusBar.class)
+ .getBiometricUnlockController();
+ biometricUnlockController.onBiometricAcquired(BiometricSourceType.FINGERPRINT);
+ biometricUnlockController.onBiometricAuthenticated(
+ KeyguardUpdateMonitor.getCurrentUser(), BiometricSourceType.FINGERPRINT);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
index 9fc71c813d74..d21465c53bdf 100644
--- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
@@ -30,6 +30,7 @@ import android.os.Looper;
import android.os.PatternMatcher;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.provider.Settings;
import android.util.Log;
import android.view.SurfaceControl;
@@ -65,7 +66,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
public static final String TAG_OPS = "OverviewProxyService";
public static final boolean DEBUG_OVERVIEW_PROXY = false;
- private static final long BACKOFF_MILLIS = 5000;
+ private static final long BACKOFF_MILLIS = 1000;
private static final long DEFERRED_CALLBACK_MILLIS = 5000;
private final Context mContext;
@@ -99,7 +100,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
long token = Binder.clearCallingIdentity();
try {
mHandler.post(() -> {
- StatusBar statusBar = ((SystemUIApplication) mContext).getComponent(
+ StatusBar statusBar = SysUiServiceProvider.getComponent(mContext,
StatusBar.class);
if (statusBar != null) {
statusBar.showScreenPinningRequest(taskId, false /* allowCancel */);
@@ -152,7 +153,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
public Rect getNonMinimizedSplitScreenSecondaryBounds() {
long token = Binder.clearCallingIdentity();
try {
- Divider divider = ((SystemUIApplication) mContext).getComponent(Divider.class);
+ Divider divider = SysUiServiceProvider.getComponent(mContext, Divider.class);
if (divider != null) {
return divider.getView().getNonMinimizedSplitScreenSecondaryBounds();
}
@@ -391,14 +392,22 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println(TAG_OPS + " state:");
- pw.print(" mConnectionBackoffAttempts="); pw.println(mConnectionBackoffAttempts);
+ pw.print(" recentsComponentName="); pw.println(mRecentsComponentName);
+ pw.print(" isConnected="); pw.println(mOverviewProxy != null);
pw.print(" isCurrentUserSetup="); pw.println(mDeviceProvisionedController
.isCurrentUserSetup());
- pw.print(" isConnected="); pw.println(mOverviewProxy != null);
- pw.print(" mRecentsComponentName="); pw.println(mRecentsComponentName);
- pw.print(" mIsEnabled="); pw.println(isEnabled());
- pw.print(" mInteractionFlags="); pw.println(mInteractionFlags);
- pw.print(" mQuickStepIntent="); pw.println(mQuickStepIntent);
+ pw.print(" connectionBackoffAttempts="); pw.println(mConnectionBackoffAttempts);
+ pw.print(" interactionFlags="); pw.println(mInteractionFlags);
+
+ pw.print(" quickStepIntent="); pw.println(mQuickStepIntent);
+ pw.print(" quickStepIntentResolved="); pw.println(isEnabled());
+
+ final int swipeUpDefaultValue = mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_swipe_up_gesture_default) ? 1 : 0;
+ final int swipeUpEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.SWIPE_UP_TO_SWITCH_APPS_ENABLED, swipeUpDefaultValue);
+ pw.print(" swipeUpSetting="); pw.println(swipeUpEnabled != 0);
+ pw.print(" swipeUpSettingDefault="); pw.println(swipeUpDefaultValue != 0);
}
public interface OverviewProxyListener {
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index efaf557660d2..bbbc71fe8c1c 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -26,8 +26,12 @@ import static com.android.systemui.tuner.TunablePadding.FLAG_END;
import static com.android.systemui.tuner.TunablePadding.FLAG_START;
import android.annotation.Dimension;
+import android.app.ActivityManager;
import android.app.Fragment;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.graphics.Canvas;
@@ -41,7 +45,6 @@ import android.graphics.Region;
import android.hardware.display.DisplayManager;
import android.os.SystemProperties;
import android.provider.Settings.Secure;
-import android.support.annotation.VisibleForTesting;
import android.util.DisplayMetrics;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
@@ -68,6 +71,8 @@ import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
import com.android.systemui.util.leak.RotationUtils;
+import androidx.annotation.VisibleForTesting;
+
/**
* An overlay that draws screen decorations in software (e.g for rounded corners or display cutout)
* for antialiasing and emulation purposes.
@@ -89,6 +94,9 @@ public class ScreenDecorations extends SystemUI implements Tunable {
private float mDensity;
private WindowManager mWindowManager;
private int mRotation;
+ private DisplayCutoutView mCutoutTop;
+ private DisplayCutoutView mCutoutBottom;
+ private SecureSetting mColorInversionSetting;
@Override
public void start() {
@@ -135,14 +143,14 @@ public class ScreenDecorations extends SystemUI implements Tunable {
private void setupDecorations() {
mOverlay = LayoutInflater.from(mContext)
.inflate(R.layout.rounded_corners, null);
- DisplayCutoutView cutoutTop = new DisplayCutoutView(mContext, true,
+ mCutoutTop = new DisplayCutoutView(mContext, true,
this::updateWindowVisibilities);
- ((ViewGroup)mOverlay).addView(cutoutTop);
+ ((ViewGroup)mOverlay).addView(mCutoutTop);
mBottomOverlay = LayoutInflater.from(mContext)
.inflate(R.layout.rounded_corners, null);
- DisplayCutoutView cutoutBottom = new DisplayCutoutView(mContext, false,
+ mCutoutBottom = new DisplayCutoutView(mContext, false,
this::updateWindowVisibilities);
- ((ViewGroup)mBottomOverlay).addView(cutoutBottom);
+ ((ViewGroup)mBottomOverlay).addView(mCutoutBottom);
mOverlay.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
mOverlay.setAlpha(0);
@@ -162,22 +170,19 @@ public class ScreenDecorations extends SystemUI implements Tunable {
Dependency.get(TunerService.class).addTunable(this, SIZE);
// Watch color inversion and invert the overlay as needed.
- SecureSetting setting = new SecureSetting(mContext, Dependency.get(Dependency.MAIN_HANDLER),
+ mColorInversionSetting = new SecureSetting(mContext, Dependency.get(Dependency.MAIN_HANDLER),
Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED) {
@Override
protected void handleValueChanged(int value, boolean observedChange) {
- int tint = value != 0 ? Color.WHITE : Color.BLACK;
- ColorStateList tintList = ColorStateList.valueOf(tint);
- ((ImageView) mOverlay.findViewById(R.id.left)).setImageTintList(tintList);
- ((ImageView) mOverlay.findViewById(R.id.right)).setImageTintList(tintList);
- ((ImageView) mBottomOverlay.findViewById(R.id.left)).setImageTintList(tintList);
- ((ImageView) mBottomOverlay.findViewById(R.id.right)).setImageTintList(tintList);
- cutoutTop.setColor(tint);
- cutoutBottom.setColor(tint);
+ updateColorInversion(value);
}
};
- setting.setListening(true);
- setting.onChange(false);
+ mColorInversionSetting.setListening(true);
+ mColorInversionSetting.onChange(false);
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ mContext.registerReceiver(mIntentReceiver, filter);
mOverlay.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
@@ -197,6 +202,31 @@ public class ScreenDecorations extends SystemUI implements Tunable {
});
}
+ private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_USER_SWITCHED)) {
+ int newUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
+ ActivityManager.getCurrentUser());
+ // update color inversion setting to the new user
+ mColorInversionSetting.setUserId(newUserId);
+ updateColorInversion(mColorInversionSetting.getValue());
+ }
+ }
+ };
+
+ private void updateColorInversion(int colorsInvertedValue) {
+ int tint = colorsInvertedValue != 0 ? Color.WHITE : Color.BLACK;
+ ColorStateList tintList = ColorStateList.valueOf(tint);
+ ((ImageView) mOverlay.findViewById(R.id.left)).setImageTintList(tintList);
+ ((ImageView) mOverlay.findViewById(R.id.right)).setImageTintList(tintList);
+ ((ImageView) mBottomOverlay.findViewById(R.id.left)).setImageTintList(tintList);
+ ((ImageView) mBottomOverlay.findViewById(R.id.right)).setImageTintList(tintList);
+ mCutoutTop.setColor(tint);
+ mCutoutBottom.setColor(tint);
+ }
+
@Override
protected void onConfigurationChanged(Configuration newConfig) {
updateOrientation();
@@ -245,6 +275,9 @@ public class ScreenDecorations extends SystemUI implements Tunable {
updateView(bottomRight, Gravity.TOP | Gravity.LEFT, 0);
}
+ mCutoutTop.setRotation(mRotation);
+ mCutoutBottom.setRotation(mRotation);
+
updateWindowVisibilities();
}
@@ -416,14 +449,16 @@ public class ScreenDecorations extends SystemUI implements Tunable {
private final Rect mBoundingRect = new Rect();
private final Path mBoundingPath = new Path();
private final int[] mLocation = new int[2];
- private final boolean mStart;
+ private final boolean mInitialStart;
private final Runnable mVisibilityChangedListener;
private int mColor = Color.BLACK;
+ private boolean mStart;
+ private int mRotation;
public DisplayCutoutView(Context context, boolean start,
Runnable visibilityChangedListener) {
super(context);
- mStart = start;
+ mInitialStart = start;
mVisibilityChangedListener = visibilityChangedListener;
setId(R.id.display_cutout);
}
@@ -475,7 +510,22 @@ public class ScreenDecorations extends SystemUI implements Tunable {
}
}
+ public void setRotation(int rotation) {
+ mRotation = rotation;
+ update();
+ }
+
+ private boolean isStart() {
+ final boolean flipped = (mRotation == RotationUtils.ROTATION_SEASCAPE
+ || mRotation == RotationUtils.ROTATION_UPSIDE_DOWN);
+ return flipped ? !mInitialStart : mInitialStart;
+ }
+
private void update() {
+ mStart = isStart();
+ if (!isAttachedToWindow()) {
+ return;
+ }
requestLayout();
getDisplay().getDisplayInfo(mInfo);
mBounds.setEmpty();
@@ -560,31 +610,34 @@ public class ScreenDecorations extends SystemUI implements Tunable {
resolveSizeAndState(mBoundingRect.height(), heightMeasureSpec, 0));
}
- public static void boundsFromDirection(DisplayCutout displayCutout, int gravity, Rect out) {
+ public static void boundsFromDirection(DisplayCutout displayCutout, int gravity,
+ Rect out) {
+ Region bounds = boundsFromDirection(displayCutout, gravity);
+ out.set(bounds.getBounds());
+ bounds.recycle();
+ }
+
+ public static Region boundsFromDirection(DisplayCutout displayCutout, int gravity) {
Region bounds = displayCutout.getBounds();
switch (gravity) {
case Gravity.TOP:
bounds.op(0, 0, Integer.MAX_VALUE, displayCutout.getSafeInsetTop(),
Region.Op.INTERSECT);
- out.set(bounds.getBounds());
break;
case Gravity.LEFT:
bounds.op(0, 0, displayCutout.getSafeInsetLeft(), Integer.MAX_VALUE,
Region.Op.INTERSECT);
- out.set(bounds.getBounds());
break;
case Gravity.BOTTOM:
bounds.op(0, displayCutout.getSafeInsetTop() + 1, Integer.MAX_VALUE,
Integer.MAX_VALUE, Region.Op.INTERSECT);
- out.set(bounds.getBounds());
break;
case Gravity.RIGHT:
bounds.op(displayCutout.getSafeInsetLeft() + 1, 0, Integer.MAX_VALUE,
Integer.MAX_VALUE, Region.Op.INTERSECT);
- out.set(bounds.getBounds());
break;
}
- bounds.recycle();
+ return bounds;
}
private void localBounds(Rect out) {
diff --git a/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java b/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java
index 19f8416860a2..6d790668995e 100644
--- a/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java
@@ -23,6 +23,7 @@ import android.app.slice.SliceProvider;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
+import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
@@ -53,10 +54,14 @@ public class SlicePermissionActivity extends Activity implements OnClickListener
try {
PackageManager pm = getPackageManager();
- CharSequence app1 = BidiFormatter.getInstance().unicodeWrap(
- pm.getApplicationInfo(mCallingPkg, 0).loadSafeLabel(pm).toString());
- CharSequence app2 = BidiFormatter.getInstance().unicodeWrap(
- pm.getApplicationInfo(mProviderPkg, 0).loadSafeLabel(pm).toString());
+ CharSequence app1 = BidiFormatter.getInstance().unicodeWrap(pm.getApplicationInfo(
+ mCallingPkg, 0).loadSafeLabel(pm, PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
+ PackageItemInfo.SAFE_LABEL_FLAG_TRIM
+ | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE).toString());
+ CharSequence app2 = BidiFormatter.getInstance().unicodeWrap(pm.getApplicationInfo(
+ mProviderPkg, 0).loadSafeLabel(pm, PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
+ PackageItemInfo.SAFE_LABEL_FLAG_TRIM
+ | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE).toString());
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle(getString(R.string.slice_permission_title, app1, app2))
.setView(R.layout.slice_permission_request)
diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java
index 9c411d6cb1af..ad6dfa4236bc 100644
--- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java
+++ b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.java
@@ -95,7 +95,7 @@ final class WirelessChargingView extends View {
private void setupPaint() {
mPaint = new Paint();
- mPaint.setColor(Utils.getColorAttr(mContext, R.attr.wallpaperTextColor));
+ mPaint.setColor(Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor));
}
public void setPaintColor(int color) {
@@ -179,4 +179,4 @@ final class WirelessChargingView extends View {
private float getPathGone(long now) {
return (float) (now - mAnimationStartTime) / (WirelessChargingAnimation.DURATION);
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
index 9a43d9e07610..3c8a461d3f73 100644
--- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
+++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java
@@ -21,7 +21,6 @@ import android.app.WallpaperManager;
import android.content.Context;
import android.os.Handler;
import android.os.RemoteException;
-import android.os.Trace;
import android.os.UserHandle;
import android.util.Log;
import android.view.Display;
@@ -46,7 +45,7 @@ import java.util.Arrays;
public class SysuiColorExtractor extends ColorExtractor implements Dumpable {
private static final String TAG = "SysuiColorExtractor";
private boolean mWallpaperVisible;
- private boolean mMediaBackdropVisible;
+ private boolean mHasBackdrop;
// Colors to return when the wallpaper isn't visible
private final GradientColors mWpHiddenColors;
@@ -165,7 +164,7 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable {
return mWpHiddenColors;
}
} else {
- if (mMediaBackdropVisible) {
+ if (mHasBackdrop) {
return mWpHiddenColors;
} else {
return super.getColors(which, type);
@@ -181,9 +180,9 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable {
}
}
- public void setMediaBackdropVisible(boolean visible) {
- if (mMediaBackdropVisible != visible) {
- mMediaBackdropVisible = visible;
+ public void setHasBackdrop(boolean hasBackdrop) {
+ if (mHasBackdrop != hasBackdrop) {
+ mHasBackdrop = hasBackdrop;
triggerColorsChanged(WallpaperManager.FLAG_LOCK);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java
index 03b0082b96e7..4fc2d9bd344b 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenStatePreventingAdapter.java
@@ -16,7 +16,7 @@
package com.android.systemui.doze;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.view.Display;
import com.android.systemui.statusbar.phone.DozeParameters;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java
index 1c6521f641bf..3013b969c74b 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java
@@ -16,7 +16,7 @@
package com.android.systemui.doze;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.view.Display;
import com.android.systemui.statusbar.phone.DozeParameters;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
index b7ff98402081..78632459c867 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
@@ -33,7 +33,6 @@ import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.wakelock.WakeLock;
import java.util.Calendar;
-import java.util.GregorianCalendar;
/**
* The policy controlling doze.
@@ -113,9 +112,7 @@ public class DozeUi implements DozeMachine.Part {
// The display buffers will be empty and need to be filled.
mHost.dozeTimeTick();
// The first frame may arrive when the display isn't ready yet.
- mHandler.postDelayed(mWakeLock.wrap(mHost::dozeTimeTick), 100);
- // The the delayed frame may arrive when the display isn't ready yet either.
- mHandler.postDelayed(mWakeLock.wrap(mHost::dozeTimeTick), 1000);
+ mHandler.postDelayed(mWakeLock.wrap(mHost::dozeTimeTick), 500);
}
scheduleTimeTick();
break;
@@ -184,7 +181,7 @@ public class DozeUi implements DozeMachine.Part {
}
private long roundToNextMinute(long timeInMillis) {
- Calendar calendar = GregorianCalendar.getInstance();
+ Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeInMillis);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java
index f8f364da089b..0ed1cd128caa 100644
--- a/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java
+++ b/packages/SystemUI/src/com/android/systemui/fragments/FragmentHostManager.java
@@ -28,7 +28,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Parcelable;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import android.util.ArrayMap;
import android.view.LayoutInflater;
import android.view.View;
@@ -51,7 +51,8 @@ public class FragmentHostManager {
private final View mRootView;
private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges(
ActivityInfo.CONFIG_FONT_SCALE | ActivityInfo.CONFIG_LOCALE
- | ActivityInfo.CONFIG_SCREEN_LAYOUT | ActivityInfo.CONFIG_ASSETS_PATHS);
+ | ActivityInfo.CONFIG_SCREEN_LAYOUT | ActivityInfo.CONFIG_ASSETS_PATHS
+ | ActivityInfo.CONFIG_UI_MODE);
private final FragmentService mManager;
private final ExtensionFragmentManager mPlugins = new ExtensionFragmentManager();
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index d232108ded40..201f40e40f26 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -28,12 +28,10 @@ import android.app.WallpaperManager;
import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
-import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.ServiceConnection;
import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.graphics.Point;
@@ -42,9 +40,7 @@ import android.media.AudioManager;
import android.net.ConnectivityManager;
import android.os.Build;
import android.os.Handler;
-import android.os.IBinder;
import android.os.Message;
-import android.os.Messenger;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
@@ -68,9 +64,9 @@ import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
-import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
@@ -127,6 +123,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
private static final String GLOBAL_ACTION_KEY_RESTART = "restart";
private static final String GLOBAL_ACTION_KEY_LOGOUT = "logout";
+ private static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency";
private static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot";
private final Context mContext;
@@ -149,6 +146,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private boolean mDeviceProvisioned = false;
private ToggleAction.State mAirplaneState = ToggleAction.State.Off;
private boolean mIsWaitingForEcmExit = false;
+ private boolean mHasFasterEmergencyButton;
private boolean mHasTelephony;
private boolean mHasVibrator;
private boolean mHasLogoutButton;
@@ -267,7 +265,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
if (!mHasVibrator) {
mSilentModeAction = new SilentModeToggleAction();
} else {
- mSilentModeAction = new SilentModeTriStateAction(mContext, mAudioManager, mHandler);
+ mSilentModeAction = new SilentModeTriStateAction(mAudioManager, mHandler);
}
mAirplaneModeOn = new ToggleAction(
R.drawable.ic_lock_airplane_mode,
@@ -319,6 +317,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
ArraySet<String> addedKeys = new ArraySet<String>();
mHasLogoutButton = false;
mHasLockdownButton = false;
+ mHasFasterEmergencyButton = false;
for (int i = 0; i < defaultActions.length; i++) {
String actionKey = defaultActions[i];
if (addedKeys.contains(actionKey)) {
@@ -357,6 +356,13 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mItems.add(getAssistAction());
} else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {
mItems.add(new RestartAction());
+ } else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) {
+ if (Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.FASTER_EMERGENCY_PHONE_CALL_ENABLED, 0) != 0
+ && !mEmergencyAffordanceManager.needsEmergencyAffordance()) {
+ mItems.add(new EmergencyAction());
+ mHasFasterEmergencyButton = true;
+ }
} else if (GLOBAL_ACTION_KEY_SCREENSHOT.equals(actionKey)) {
mItems.add(new ScreenshotAction());
} else if (GLOBAL_ACTION_KEY_LOGOUT.equals(actionKey)) {
@@ -386,7 +392,8 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
return false;
};
- ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener);
+ ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener,
+ mHasFasterEmergencyButton);
dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
dialog.setKeyguardShowing(mKeyguardShowing);
@@ -441,6 +448,33 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
}
+ private class EmergencyAction extends SinglePressAction {
+ private static final String ACTION_EMERGENCY_DIALER_DIAL =
+ "com.android.phone.EmergencyDialer.DIAL";
+
+ private EmergencyAction() {
+ super(com.android.systemui.R.drawable.faster_emergency_icon,
+ R.string.global_action_emergency);
+ }
+
+ @Override
+ public void onPress() {
+ Intent intent = new Intent(ACTION_EMERGENCY_DIALER_DIAL);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mContext.startActivityAsUser(intent, UserHandle.CURRENT);
+ }
+
+ @Override
+ public boolean showDuringKeyguard() {
+ return true;
+ }
+
+ @Override
+ public boolean showBeforeProvisioning() {
+ return true;
+ }
+ }
+
private final class RestartAction extends SinglePressAction implements LongPressAction {
private RestartAction() {
super(R.drawable.ic_restart, R.string.global_action_restart);
@@ -1177,12 +1211,10 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final AudioManager mAudioManager;
private final Handler mHandler;
- private final Context mContext;
- SilentModeTriStateAction(Context context, AudioManager audioManager, Handler handler) {
+ SilentModeTriStateAction(AudioManager audioManager, Handler handler) {
mAudioManager = audioManager;
mHandler = handler;
- mContext = context;
}
private int ringerModeToIndex(int ringerMode) {
@@ -1354,15 +1386,17 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final Context mContext;
private final MyAdapter mAdapter;
private final LinearLayout mListView;
+ private final FrameLayout mSeparatedView;
private final HardwareUiLayout mHardwareLayout;
private final OnClickListener mClickListener;
private final OnItemLongClickListener mLongClickListener;
private final GradientDrawable mGradientDrawable;
private final ColorExtractor mColorExtractor;
private boolean mKeyguardShowing;
+ private boolean mShouldDisplaySeparatedButton;
public ActionsDialog(Context context, OnClickListener clickListener, MyAdapter adapter,
- OnItemLongClickListener longClickListener) {
+ OnItemLongClickListener longClickListener, boolean shouldDisplaySeparatedButton) {
super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions);
mContext = context;
mAdapter = adapter;
@@ -1370,6 +1404,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mLongClickListener = longClickListener;
mGradientDrawable = new GradientDrawable(mContext);
mColorExtractor = Dependency.get(SysuiColorExtractor.class);
+ mShouldDisplaySeparatedButton = shouldDisplaySeparatedButton;
// Window initialization
Window window = getWindow();
@@ -1393,8 +1428,13 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
setContentView(com.android.systemui.R.layout.global_actions_wrapped);
mListView = findViewById(android.R.id.list);
+ mSeparatedView = findViewById(com.android.systemui.R.id.separated_button);
+ if (!mShouldDisplaySeparatedButton) {
+ mSeparatedView.setVisibility(View.GONE);
+ }
mHardwareLayout = HardwareUiLayout.get(mListView);
mHardwareLayout.setOutsideTouchListener(view -> dismiss());
+ mHardwareLayout.setHasSeparatedButton(mShouldDisplaySeparatedButton);
setTitle(R.string.global_actions);
mListView.setAccessibilityDelegate(new View.AccessibilityDelegate() {
@Override
@@ -1409,13 +1449,16 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private void updateList() {
mListView.removeAllViews();
+ mSeparatedView.removeAllViews();
for (int i = 0; i < mAdapter.getCount(); i++) {
- View v = mAdapter.getView(i, null, mListView);
+ ViewGroup parentView = mShouldDisplaySeparatedButton && i == mAdapter.getCount() - 1
+ ? mSeparatedView : mListView;
+ View v = mAdapter.getView(i, null, parentView);
final int pos = i;
v.setOnClickListener(view -> mClickListener.onClick(this, pos));
v.setOnLongClickListener(view ->
mLongClickListener.onItemLongClick(null, v, pos, 0));
- mListView.addView(v);
+ parentView.addView(v);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
index a1adfa6b28aa..1489c21c5a5c 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
@@ -106,7 +106,8 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
d.setContentView(R.layout.shutdown_dialog);
d.setCancelable(false);
- int color = Utils.getColorAttr(mContext, com.android.systemui.R.attr.wallpaperTextColor);
+ int color = Utils.getColorAttrDefaultColor(mContext,
+ com.android.systemui.R.attr.wallpaperTextColor);
boolean onKeyguard = mContext.getSystemService(
KeyguardManager.class).isKeyguardLocked();
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
index ebd15f559239..81d700ca3d02 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
@@ -48,7 +48,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
-import com.android.settingslib.bluetooth.Utils;
+import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
@@ -183,7 +183,7 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
mLocalBluetoothAdapter = bluetoothManager.getBluetoothAdapter();
mProfileManager = bluetoothManager.getProfileManager();
bluetoothManager.getEventManager().registerCallback(new BluetoothCallbackHandler());
- Utils.setErrorListener(new BluetoothErrorListener());
+ BluetoothUtils.setErrorListener(new BluetoothErrorListener());
InputManager im = context.getSystemService(InputManager.class);
im.registerOnTabletModeChangedListener(this, mHandler);
@@ -616,7 +616,7 @@ public class KeyboardUI extends SystemUI implements InputManager.OnTabletModeCha
public void onAudioModeChanged() { }
}
- private final class BluetoothErrorListener implements Utils.ErrorListener {
+ private final class BluetoothErrorListener implements BluetoothUtils.ErrorListener {
public void onShowError(Context context, String name, int messageResId) {
mHandler.obtainMessage(MSG_SHOW_ERROR, messageResId, 0 /*unused*/,
new Pair<>(context, name)).sendToTarget();
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 6809e76c18e3..8d7eb6c719ff 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -26,9 +26,11 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STR
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.StatusBarManager;
+import android.hardware.biometrics.BiometricSourceType;
import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
@@ -81,8 +83,8 @@ import com.android.systemui.SystemUI;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.UiOffloadThread;
import com.android.systemui.classifier.FalsingManager;
-import com.android.systemui.statusbar.phone.FingerprintUnlockController;
import com.android.systemui.statusbar.phone.NotificationPanelView;
+import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -344,6 +346,11 @@ public class KeyguardViewMediator extends SystemUI {
*/
private WorkLockActivityController mWorkLockController;
+ /**
+ * @see #setPulsing(boolean)
+ */
+ private boolean mPulsing;
+
private boolean mLockLater;
private boolean mWakeAndUnlocking;
@@ -495,6 +502,7 @@ public class KeyguardViewMediator extends SystemUI {
break;
case READY:
synchronized (KeyguardViewMediator.this) {
+ if (DEBUG_SIM_STATES) Log.d(TAG, "READY, reset state? " + mShowing);
if (mShowing) {
resetStateLocked();
}
@@ -520,18 +528,18 @@ public class KeyguardViewMediator extends SystemUI {
}
@Override
- public void onFingerprintAuthFailed() {
+ public void onBiometricAuthFailed(BiometricSourceType biometricSourceType) {
final int currentUser = KeyguardUpdateMonitor.getCurrentUser();
if (mLockPatternUtils.isSecure(currentUser)) {
- mLockPatternUtils.getDevicePolicyManager().reportFailedFingerprintAttempt(
+ mLockPatternUtils.getDevicePolicyManager().reportFailedBiometricAttempt(
currentUser);
}
}
@Override
- public void onFingerprintAuthenticated(int userId) {
+ public void onBiometricAuthenticated(int userId, BiometricSourceType biometricSourceType) {
if (mLockPatternUtils.isSecure(userId)) {
- mLockPatternUtils.getDevicePolicyManager().reportSuccessfulFingerprintAttempt(
+ mLockPatternUtils.getDevicePolicyManager().reportSuccessfulBiometricAttempt(
userId);
}
}
@@ -1643,7 +1651,7 @@ public class KeyguardViewMediator extends SystemUI {
}
mUpdateMonitor.clearFailedUnlockAttempts();
- mUpdateMonitor.clearFingerprintRecognized();
+ mUpdateMonitor.clearBiometricRecognized();
if (mGoingToSleep) {
Log.i(TAG, "Device is going to sleep, aborting keyguardDone");
@@ -1749,7 +1757,7 @@ public class KeyguardViewMediator extends SystemUI {
int secondaryDisplayShowing) {
mUiOffloadThread.submit(() -> {
try {
- ActivityManager.getService().setLockScreenShown(showing, aodShowing,
+ ActivityTaskManager.getService().setLockScreenShown(showing, aodShowing,
secondaryDisplayShowing);
} catch (RemoteException e) {
}
@@ -1798,10 +1806,12 @@ public class KeyguardViewMediator extends SystemUI {
int flags = 0;
if (mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock()
- || mWakeAndUnlocking) {
- flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS;
+ || (mWakeAndUnlocking && !mPulsing)) {
+ flags |= WindowManagerPolicyConstants
+ .KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS;
}
- if (mStatusBarKeyguardViewManager.isGoingToNotificationShade()) {
+ if (mStatusBarKeyguardViewManager.isGoingToNotificationShade()
+ || (mWakeAndUnlocking && mPulsing)) {
flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE;
}
if (mStatusBarKeyguardViewManager.isUnlockWithWallpaper()) {
@@ -1812,7 +1822,7 @@ public class KeyguardViewMediator extends SystemUI {
// Don't actually hide the Keyguard at the moment, wait for window
// manager until it tells us it's safe to do so with
// startKeyguardExitAnimation.
- ActivityManager.getService().keyguardGoingAway(flags);
+ ActivityTaskManager.getService().keyguardGoingAway(flags);
} catch (RemoteException e) {
Log.e(TAG, "Error while calling WindowManager", e);
}
@@ -2049,9 +2059,9 @@ public class KeyguardViewMediator extends SystemUI {
public StatusBarKeyguardViewManager registerStatusBar(StatusBar statusBar,
ViewGroup container, NotificationPanelView panelView,
- FingerprintUnlockController fingerprintUnlockController) {
+ BiometricUnlockController biometricUnlockController) {
mStatusBarKeyguardViewManager.registerStatusBar(statusBar, container, panelView,
- fingerprintUnlockController, mDismissCallbackRegistry);
+ biometricUnlockController, mDismissCallbackRegistry);
return mStatusBarKeyguardViewManager;
}
@@ -2100,10 +2110,20 @@ public class KeyguardViewMediator extends SystemUI {
pw.print(" mDrawnCallback: "); pw.println(mDrawnCallback);
}
+ /**
+ * @param aodShowing true when AOD - or ambient mode - is showing.
+ */
public void setAodShowing(boolean aodShowing) {
setShowingLocked(mShowing, aodShowing);
}
+ /**
+ * @param pulsing true when device temporarily wakes up to display an incoming notification.
+ */
+ public void setPulsing(boolean pulsing) {
+ mPulsing = pulsing;
+ }
+
private static class StartKeyguardExitAnimParams {
long startTime;
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java
index b9e9e0a7f529..0cedf9825990 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivityController.java
@@ -18,7 +18,9 @@ package com.android.systemui.keyguard;
import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.KeyguardManager;
import android.content.ComponentName;
import android.content.Context;
@@ -37,16 +39,17 @@ public class WorkLockActivityController {
private static final String TAG = WorkLockActivityController.class.getSimpleName();
private final Context mContext;
- private final IActivityManager mIam;
+ private final IActivityTaskManager mIatm;
public WorkLockActivityController(Context context) {
- this(context, ActivityManagerWrapper.getInstance(), ActivityManager.getService());
+ this(context, ActivityManagerWrapper.getInstance(), ActivityTaskManager.getService());
}
@VisibleForTesting
- WorkLockActivityController(Context context, ActivityManagerWrapper am, IActivityManager iAm) {
+ WorkLockActivityController(
+ Context context, ActivityManagerWrapper am, IActivityTaskManager iAtm) {
mContext = context;
- mIam = iAm;
+ mIatm = iAtm;
am.registerTaskStackListener(mLockListener);
}
@@ -54,7 +57,7 @@ public class WorkLockActivityController {
private void startWorkChallengeInTask(int taskId, int userId) {
ActivityManager.TaskDescription taskDescription = null;
try {
- taskDescription = mIam.getTaskDescription(taskId);
+ taskDescription = mIatm.getTaskDescription(taskId);
} catch (RemoteException e) {
Log.w(TAG, "Failed to get description for task=" + taskId);
}
@@ -76,7 +79,7 @@ public class WorkLockActivityController {
// Starting the activity inside the task failed. We can't be sure why, so to be
// safe just remove the whole task if it still exists.
try {
- mIam.removeTask(taskId);
+ mIatm.removeTask(taskId);
} catch (RemoteException e) {
Log.w(TAG, "Failed to get description for task=" + taskId);
}
@@ -89,7 +92,7 @@ public class WorkLockActivityController {
*/
private int startActivityAsUser(Intent intent, Bundle options, int userId) {
try {
- return mIam.startActivityAsUser(
+ return mIatm.startActivityAsUser(
mContext.getIApplicationThread() /*caller*/,
mContext.getBasePackageName() /*callingPackage*/,
intent /*intent*/,
diff --git a/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java b/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java
index f5f06db348ab..89786ee880ad 100644
--- a/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java
+++ b/packages/SystemUI/src/com/android/systemui/media/NotificationPlayer.java
@@ -86,11 +86,12 @@ public class NotificationPlayer implements OnCompletionListener, OnErrorListener
// synchronized on mCompletionHandlingLock due to the Object.wait() in startSound(cmd)
mLooper = Looper.myLooper();
if (DEBUG) Log.d(mTag, "in run: new looper " + mLooper);
+ MediaPlayer player = null;
synchronized(this) {
AudioManager audioManager =
(AudioManager) mCmd.context.getSystemService(Context.AUDIO_SERVICE);
try {
- MediaPlayer player = new MediaPlayer();
+ player = new MediaPlayer();
if (mCmd.attributes == null) {
mCmd.attributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
@@ -137,26 +138,26 @@ public class NotificationPlayer implements OnCompletionListener, OnErrorListener
Log.e(mTag, "Exception while sleeping to sync notification playback"
+ " with ducking", e);
}
- try {
- player.start();
- if (DEBUG) { Log.d(mTag, "player.start"); }
- } catch (Exception e) {
+ player.start();
+ if (DEBUG) { Log.d(mTag, "player.start"); }
+ } catch (Exception e) {
+ if (player != null) {
player.release();
player = null;
- // playing the notification didn't work, revert the focus request
- abandonAudioFocusAfterError();
- }
- if (mPlayer != null) {
- if (DEBUG) { Log.d(mTag, "mPlayer.release"); }
- mPlayer.release();
}
- mPlayer = player;
- }
- catch (Exception e) {
Log.w(mTag, "error loading sound for " + mCmd.uri, e);
// playing the notification didn't work, revert the focus request
abandonAudioFocusAfterError();
}
+ final MediaPlayer mp;
+ synchronized (mPlayerLock) {
+ mp = mPlayer;
+ mPlayer = player;
+ }
+ if (mp != null) {
+ if (DEBUG) { Log.d(mTag, "mPlayer.release"); }
+ mp.release();
+ }
this.notify();
}
Looper.loop();
@@ -230,14 +231,20 @@ public class NotificationPlayer implements OnCompletionListener, OnErrorListener
break;
case STOP:
if (DEBUG) Log.d(mTag, "STOP");
- if (mPlayer != null) {
+ final MediaPlayer mp;
+ synchronized (mPlayerLock) {
+ mp = mPlayer;
+ mPlayer = null;
+ }
+ if (mp != null) {
long delay = SystemClock.uptimeMillis() - cmd.requestTime;
if (delay > 1000) {
Log.w(mTag, "Notification stop delayed by " + delay + "msecs");
}
- mPlayer.stop();
- mPlayer.release();
- mPlayer = null;
+ try {
+ mp.stop();
+ } catch (Exception e) { }
+ mp.release();
synchronized(mQueueAudioFocusLock) {
if (mAudioManagerWithAudioFocus != null) {
if (DEBUG) { Log.d(mTag, "in STOP: abandonning AudioFocus"); }
@@ -297,6 +304,14 @@ public class NotificationPlayer implements OnCompletionListener, OnErrorListener
}
}
}
+ synchronized (mPlayerLock) {
+ if (mp == mPlayer) {
+ mPlayer = null;
+ }
+ }
+ if (mp != null) {
+ mp.release();
+ }
}
public boolean onError(MediaPlayer mp, int what, int extra) {
@@ -311,6 +326,8 @@ public class NotificationPlayer implements OnCompletionListener, OnErrorListener
@GuardedBy("mCmdQueue")
private CmdThread mThread;
+ private final Object mPlayerLock = new Object();
+ @GuardedBy("mPlayerLock")
private MediaPlayer mPlayer;
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 2af7ae27873c..ee15655d87b2 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -20,7 +20,9 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.INPUT_CONSUMER_PIP;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ParceledListSlice;
@@ -55,6 +57,7 @@ public class PipManager implements BasePipManager {
private Context mContext;
private IActivityManager mActivityManager;
+ private IActivityTaskManager mActivityTaskManager;
private IWindowManager mWindowManager;
private Handler mHandler = new Handler();
@@ -172,6 +175,7 @@ public class PipManager implements BasePipManager {
public void initialize(Context context) {
mContext = context;
mActivityManager = ActivityManager.getService();
+ mActivityTaskManager = ActivityTaskManager.getService();
mWindowManager = WindowManagerGlobal.getWindowManagerService();
try {
@@ -186,8 +190,8 @@ public class PipManager implements BasePipManager {
mMediaController = new PipMediaController(context, mActivityManager);
mMenuController = new PipMenuActivityController(context, mActivityManager, mMediaController,
mInputConsumerController);
- mTouchHandler = new PipTouchHandler(context, mActivityManager, mMenuController,
- mInputConsumerController);
+ mTouchHandler = new PipTouchHandler(context, mActivityManager, mActivityTaskManager,
+ mMenuController, mInputConsumerController);
mAppOpsListener = new PipAppOpsListener(context, mActivityManager,
mTouchHandler.getMotionHelper());
EventBus.getDefault().register(this);
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
index 615b29f93269..2dc531aea0f7 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
@@ -229,7 +229,9 @@ public class PipMenuActivity extends Activity {
mSettingsButton = findViewById(R.id.settings);
mSettingsButton.setAlpha(0);
mSettingsButton.setOnClickListener((v) -> {
- showSettings();
+ if (v.getAlpha() != 0) {
+ showSettings();
+ }
});
mDismissButton = findViewById(R.id.dismiss);
mDismissButton.setAlpha(0);
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
index 26fced307bac..360fe73be95a 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
@@ -19,6 +19,7 @@ package com.android.systemui.pip.phone;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import android.app.ActivityTaskManager;
import android.app.ActivityManager.StackInfo;
import android.app.ActivityOptions;
import android.app.IActivityManager;
@@ -384,7 +385,7 @@ public class PipMenuActivityController {
private void startMenuActivity(int menuState, Rect stackBounds, Rect movementBounds,
boolean allowMenuTimeout, boolean willResizeMenu) {
try {
- StackInfo pinnedStackInfo = mActivityManager.getStackInfo(
+ StackInfo pinnedStackInfo = ActivityTaskManager.getService().getStackInfo(
WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
if (pinnedStackInfo != null && pinnedStackInfo.taskIds != null &&
pinnedStackInfo.taskIds.length > 0) {
@@ -423,7 +424,7 @@ public class PipMenuActivityController {
// Fetch the pinned stack bounds
Rect stackBounds = null;
try {
- StackInfo pinnedStackInfo = mActivityManager.getStackInfo(
+ StackInfo pinnedStackInfo = ActivityTaskManager.getService().getStackInfo(
WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
if (pinnedStackInfo != null) {
stackBounds = pinnedStackInfo.bounds;
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
index ad841308cb0d..f0ab046f7dbe 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
@@ -30,7 +30,9 @@ import android.animation.RectEvaluator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.ActivityManager.StackInfo;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.content.Context;
import android.graphics.Point;
import android.graphics.PointF;
@@ -81,6 +83,7 @@ public class PipMotionHelper implements Handler.Callback {
private Context mContext;
private IActivityManager mActivityManager;
+ private IActivityTaskManager mActivityTaskManager;
private Handler mHandler;
private PipMenuActivityController mMenuController;
@@ -94,11 +97,12 @@ public class PipMotionHelper implements Handler.Callback {
private ValueAnimator mBoundsAnimator = null;
public PipMotionHelper(Context context, IActivityManager activityManager,
- PipMenuActivityController menuController, PipSnapAlgorithm snapAlgorithm,
- FlingAnimationUtils flingAnimationUtils) {
+ IActivityTaskManager activityTaskManager, PipMenuActivityController menuController,
+ PipSnapAlgorithm snapAlgorithm, FlingAnimationUtils flingAnimationUtils) {
mContext = context;
mHandler = new Handler(ForegroundThread.get().getLooper(), this);
mActivityManager = activityManager;
+ mActivityTaskManager = activityTaskManager;
mMenuController = menuController;
mSnapAlgorithm = snapAlgorithm;
mFlingAnimationUtils = flingAnimationUtils;
@@ -121,8 +125,8 @@ public class PipMotionHelper implements Handler.Callback {
void synchronizePinnedStackBounds() {
cancelAnimations();
try {
- StackInfo stackInfo =
- mActivityManager.getStackInfo(WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
+ StackInfo stackInfo = mActivityTaskManager.getStackInfo(
+ WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
if (stackInfo != null) {
mBounds.set(stackInfo.bounds);
}
@@ -159,7 +163,7 @@ public class PipMotionHelper implements Handler.Callback {
mMenuController.hideMenuWithoutResize();
mHandler.post(() -> {
try {
- mActivityManager.dismissPip(!skipAnimation, EXPAND_STACK_TO_FULLSCREEN_DURATION);
+ mActivityTaskManager.dismissPip(!skipAnimation, EXPAND_STACK_TO_FULLSCREEN_DURATION);
} catch (RemoteException e) {
Log.e(TAG, "Error expanding PiP activity", e);
}
@@ -177,7 +181,8 @@ public class PipMotionHelper implements Handler.Callback {
mMenuController.hideMenuWithoutResize();
mHandler.post(() -> {
try {
- mActivityManager.removeStacksInWindowingModes(new int[]{ WINDOWING_MODE_PINNED });
+ mActivityTaskManager.removeStacksInWindowingModes(
+ new int[]{ WINDOWING_MODE_PINNED });
} catch (RemoteException e) {
Log.e(TAG, "Failed to remove PiP", e);
}
@@ -512,7 +517,8 @@ public class PipMotionHelper implements Handler.Callback {
SomeArgs args = (SomeArgs) msg.obj;
Rect toBounds = (Rect) args.arg1;
try {
- mActivityManager.resizePinnedStack(toBounds, null /* tempPinnedTaskBounds */);
+ mActivityTaskManager.resizePinnedStack(
+ toBounds, null /* tempPinnedTaskBounds */);
mBounds.set(toBounds);
} catch (RemoteException e) {
Log.e(TAG, "Could not resize pinned stack to bounds: " + toBounds, e);
@@ -525,7 +531,7 @@ public class PipMotionHelper implements Handler.Callback {
Rect toBounds = (Rect) args.arg1;
int duration = args.argi1;
try {
- StackInfo stackInfo = mActivityManager.getStackInfo(
+ StackInfo stackInfo = mActivityTaskManager.getStackInfo(
WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
if (stackInfo == null) {
// In the case where we've already re-expanded or dismissed the PiP, then
@@ -533,7 +539,7 @@ public class PipMotionHelper implements Handler.Callback {
return true;
}
- mActivityManager.resizeStack(stackInfo.stackId, toBounds,
+ mActivityTaskManager.resizeStack(stackInfo.stackId, toBounds,
false /* allowResizeInDockedMode */, true /* preserveWindows */,
true /* animate */, duration);
mBounds.set(toBounds);
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index 1805f96c2cf5..3742194738b0 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -25,6 +25,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
@@ -66,10 +67,10 @@ public class PipTouchHandler {
private static final int SHOW_DISMISS_AFFORDANCE_DELAY = 225;
// Allow dragging the PIP to a location to close it
- private static final boolean ENABLE_DISMISS_DRAG_TO_EDGE = true;
-
+ private final boolean mEnableDimissDragToEdge;
private final Context mContext;
private final IActivityManager mActivityManager;
+ private final IActivityTaskManager mActivityTaskManager;
private final ViewConfiguration mViewConfig;
private final PipMenuListener mMenuListener = new PipMenuListener();
private IPinnedStackController mPinnedStackController;
@@ -101,7 +102,7 @@ public class PipTouchHandler {
private Runnable mShowDismissAffordance = new Runnable() {
@Override
public void run() {
- if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ if (mEnableDimissDragToEdge) {
mDismissViewController.showDismissTarget();
}
}
@@ -173,12 +174,13 @@ public class PipTouchHandler {
}
public PipTouchHandler(Context context, IActivityManager activityManager,
- PipMenuActivityController menuController,
+ IActivityTaskManager activityTaskManager, PipMenuActivityController menuController,
InputConsumerController inputConsumerController) {
// Initialize the Pip input consumer
mContext = context;
mActivityManager = activityManager;
+ mActivityTaskManager = activityTaskManager;
mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
mViewConfig = ViewConfiguration.get(context);
mMenuController = menuController;
@@ -189,8 +191,8 @@ public class PipTouchHandler {
mGestures = new PipTouchGesture[] {
mDefaultMovementGesture
};
- mMotionHelper = new PipMotionHelper(mContext, mActivityManager, mMenuController,
- mSnapAlgorithm, mFlingAnimationUtils);
+ mMotionHelper = new PipMotionHelper(mContext, mActivityManager, mActivityTaskManager,
+ mMenuController, mSnapAlgorithm, mFlingAnimationUtils);
mTouchState = new PipTouchState(mViewConfig, mHandler,
() -> mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(),
mMovementBounds, true /* allowMenuTimeout */, willResizeMenu()));
@@ -200,6 +202,8 @@ public class PipTouchHandler {
R.dimen.pip_expanded_shortest_edge_size);
mImeOffset = res.getDimensionPixelSize(R.dimen.pip_ime_offset);
+ mEnableDimissDragToEdge = res.getBoolean(R.bool.config_pipEnableDismissDragToEdge);
+
// Register the listener for input consumer touch events
inputConsumerController.setTouchListener(this::handleTouchEvent);
inputConsumerController.setRegistrationListener(this::onRegistrationChanged);
@@ -598,7 +602,7 @@ public class PipTouchHandler {
mMenuController.pokeMenu();
}
- if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ if (mEnableDimissDragToEdge) {
mDismissViewController.createDismissTarget();
mHandler.postDelayed(mShowDismissAffordance, SHOW_DISMISS_AFFORDANCE_DELAY);
}
@@ -613,7 +617,7 @@ public class PipTouchHandler {
if (touchState.startedDragging()) {
mSavedSnapFraction = -1f;
- if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ if (mEnableDimissDragToEdge) {
mHandler.removeCallbacks(mShowDismissAffordance);
mDismissViewController.showDismissTarget();
}
@@ -629,7 +633,7 @@ public class PipTouchHandler {
if (!touchState.allowDraggingOffscreen() || !ENABLE_MINIMIZE) {
left = Math.max(mMovementBounds.left, Math.min(mMovementBounds.right, left));
}
- if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ if (mEnableDimissDragToEdge) {
// Allow pip to move past bottom bounds
top = Math.max(mMovementBounds.top, top);
} else {
@@ -644,7 +648,7 @@ public class PipTouchHandler {
mTmpBounds.offsetTo((int) left, (int) top);
mMotionHelper.movePip(mTmpBounds);
- if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ if (mEnableDimissDragToEdge) {
updateDismissFraction();
}
@@ -666,7 +670,7 @@ public class PipTouchHandler {
@Override
public boolean onUp(PipTouchState touchState) {
- if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ if (mEnableDimissDragToEdge) {
// Clean up the dismiss target regardless of the touch state in case the touch
// enabled state changes while the user is interacting
cleanUpDismissTarget();
@@ -686,7 +690,7 @@ public class PipTouchHandler {
vel.y, isFling);
final boolean isFlingToBot = isFling && vel.y > 0 && !isHorizontal
&& (mMovementWithinDismiss || isUpWithinDimiss);
- if (ENABLE_DISMISS_DRAG_TO_EDGE) {
+ if (mEnableDimissDragToEdge) {
// Check if the user dragged or flung the PiP offscreen to dismiss it
if (mMotionHelper.shouldDismissPip() || isFlingToBot) {
MetricsLoggerWrapper.logPictureInPictureDismissByDrag(mContext,
@@ -830,7 +834,7 @@ public class PipTouchHandler {
pw.println(innerPrefix + "mIsShelfShowing=" + mIsShelfShowing);
pw.println(innerPrefix + "mShelfHeight=" + mShelfHeight);
pw.println(innerPrefix + "mSavedSnapFraction=" + mSavedSnapFraction);
- pw.println(innerPrefix + "mEnableDragToEdgeDismiss=" + ENABLE_DISMISS_DRAG_TO_EDGE);
+ pw.println(innerPrefix + "mEnableDragToEdgeDismiss=" + mEnableDimissDragToEdge);
pw.println(innerPrefix + "mEnableMinimize=" + ENABLE_MINIMIZE);
mSnapAlgorithm.dump(pw, innerPrefix);
mTouchState.dump(pw, innerPrefix);
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipUtils.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipUtils.java
index 2f53de96db2d..1ed1904d30fb 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipUtils.java
@@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import android.app.ActivityManager.StackInfo;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
import android.content.ComponentName;
import android.content.Context;
@@ -39,8 +40,8 @@ public class PipUtils {
IActivityManager activityManager) {
try {
final String sysUiPackageName = context.getPackageName();
- final StackInfo pinnedStackInfo =
- activityManager.getStackInfo(WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
+ final StackInfo pinnedStackInfo = ActivityTaskManager.getService().getStackInfo(
+ WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
if (pinnedStackInfo != null && pinnedStackInfo.taskIds != null &&
pinnedStackInfo.taskIds.length > 0) {
for (int i = pinnedStackInfo.taskNames.length - 1; i >= 0; i--) {
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 d6f67604a050..020c5500c0a0 100644..100755
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -19,7 +19,9 @@ package com.android.systemui.pip.tv;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.StackInfo;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -53,7 +55,7 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
+import static android.app.ActivityTaskManager.INVALID_STACK_ID;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.view.Display.DEFAULT_DISPLAY;
@@ -108,6 +110,7 @@ public class PipManager implements BasePipManager {
private Context mContext;
private IActivityManager mActivityManager;
+ private IActivityTaskManager mActivityTaskManager;
private IWindowManager mWindowManager;
private MediaSessionManager mMediaSessionManager;
private int mState = STATE_NO_PIP;
@@ -238,6 +241,7 @@ public class PipManager implements BasePipManager {
mContext = context;
mActivityManager = ActivityManager.getService();
+ mActivityTaskManager = ActivityTaskManager.getService();
mWindowManager = WindowManagerGlobal.getWindowManagerService();
ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener);
IntentFilter intentFilter = new IntentFilter();
@@ -258,12 +262,13 @@ public class PipManager implements BasePipManager {
entry = Pair.<String, String>create(packageAndClassName[0], null);
break;
case 2:
- if (packageAndClassName[1] != null
- && packageAndClassName[1].startsWith(".")) {
- entry = Pair.<String, String>create(
- packageAndClassName[0],
- packageAndClassName[0] + packageAndClassName[1]);
+ if (packageAndClassName[1] != null) {
+ entry = Pair.<String, String>create(packageAndClassName[0],
+ packageAndClassName[1].startsWith(".")
+ ? packageAndClassName[0] + packageAndClassName[1]
+ : packageAndClassName[1]);
}
+ break;
}
if (entry != null) {
sSettingsPackageAndClassNamePairList.add(entry);
@@ -343,7 +348,7 @@ public class PipManager implements BasePipManager {
mMediaSessionManager.removeOnActiveSessionsChangedListener(mActiveMediaSessionListener);
if (removePipStack) {
try {
- mActivityManager.removeStack(mPinnedStackId);
+ mActivityTaskManager.removeStack(mPinnedStackId);
} catch (RemoteException e) {
Log.e(TAG, "removeStack failed", e);
} finally {
@@ -433,7 +438,7 @@ public class PipManager implements BasePipManager {
}
try {
int animationDurationMs = -1;
- mActivityManager.resizeStack(mPinnedStackId, mCurrentPipBounds,
+ mActivityTaskManager.resizeStack(mPinnedStackId, mCurrentPipBounds,
true, true, true, animationDurationMs);
} catch (RemoteException e) {
Log.e(TAG, "resizeStack failed", e);
@@ -511,7 +516,7 @@ public class PipManager implements BasePipManager {
private StackInfo getPinnedStackInfo() {
StackInfo stackInfo = null;
try {
- stackInfo = mActivityManager.getStackInfo(
+ stackInfo = ActivityTaskManager.getService().getStackInfo(
WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED);
} catch (RemoteException e) {
Log.e(TAG, "getStackInfo failed", e);
@@ -604,7 +609,7 @@ public class PipManager implements BasePipManager {
private boolean isSettingsShown() {
List<RunningTaskInfo> runningTasks;
try {
- runningTasks = mActivityManager.getTasks(1);
+ runningTasks = mActivityTaskManager.getTasks(1);
if (runningTasks.isEmpty()) {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index 065e9cc2d1d3..9070170f4df9 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -30,7 +30,6 @@ import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
import android.os.UserHandle;
-import android.support.annotation.VisibleForTesting;
import android.text.Annotation;
import android.text.Layout;
import android.text.SpannableString;
@@ -42,6 +41,7 @@ import android.text.style.URLSpan;
import android.util.Log;
import android.util.Slog;
import android.view.View;
+import androidx.annotation.VisibleForTesting;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.settingslib.Utils;
@@ -264,7 +264,7 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
// remaining estimate is disabled
if (mEstimate == null || mBucket < 0
|| mEstimate.estimateMillis < mSevereWarningThreshold) {
- nb.setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
+ nb.setColor(Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorError));
}
nb.addAction(0,
mContext.getString(R.string.battery_saver_start_action),
@@ -361,7 +361,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setContentIntent(pendingBroadcast(ACTION_CLICKED_TEMP_WARNING))
.setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_TEMP_WARNING))
- .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
+ .setColor(Utils.getColorAttrDefaultColor(mContext,
+ android.R.attr.colorError));
SystemUI.overrideNotificationAppName(mContext, nb, false);
final Notification n = nb.build();
mNoMan.notifyAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, n, UserHandle.ALL);
@@ -411,7 +412,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
.setContentIntent(pendingBroadcast(ACTION_CLICKED_THERMAL_SHUTDOWN_WARNING))
.setDeleteIntent(
pendingBroadcast(ACTION_DISMISSED_THERMAL_SHUTDOWN_WARNING))
- .setColor(Utils.getColorAttr(mContext, android.R.attr.colorError));
+ .setColor(Utils.getColorAttrDefaultColor(mContext,
+ android.R.attr.colorError));
SystemUI.overrideNotificationAppName(mContext, nb, false);
final Notification n = nb.build();
mNoMan.notifyAsUser(
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index 6801e6917d3d..9a648d17c4ff 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -77,6 +77,7 @@ public class PowerUI extends SystemUI {
private int mPlugType = 0;
private int mInvalidCharger = 0;
private EnhancedEstimates mEnhancedEstimates;
+ private Estimate mLastEstimate;
private boolean mLowWarningShownThisChargeCycle;
private boolean mSevereWarningShownThisChargeCycle;
@@ -247,7 +248,8 @@ public class PowerUI extends SystemUI {
// Show the correct version of low battery warning if needed
ThreadUtils.postOnBackgroundThread(() -> {
- maybeShowBatteryWarning(plugged, oldPlugged, oldBucket, bucket);
+ maybeShowBatteryWarning(
+ oldBatteryLevel, plugged, oldPlugged, oldBucket, bucket);
});
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
@@ -262,14 +264,18 @@ public class PowerUI extends SystemUI {
}
}
- protected void maybeShowBatteryWarning(boolean plugged, boolean oldPlugged, int oldBucket,
- int bucket) {
+ protected void maybeShowBatteryWarning(int oldBatteryLevel, boolean plugged, boolean oldPlugged,
+ int oldBucket, int bucket) {
boolean isPowerSaver = mPowerManager.isPowerSaveMode();
// only play SFX when the dialog comes up or the bucket changes
final boolean playSound = bucket != oldBucket || oldPlugged;
final boolean hybridEnabled = mEnhancedEstimates.isHybridNotificationEnabled();
if (hybridEnabled) {
- final Estimate estimate = mEnhancedEstimates.getEstimate();
+ Estimate estimate = mLastEstimate;
+ if (estimate == null || mBatteryLevel != oldBatteryLevel) {
+ estimate = mEnhancedEstimates.getEstimate();
+ mLastEstimate = estimate;
+ }
// Turbo is not always booted once SysUI is running so we have ot make sure we actually
// get data back
if (estimate != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java b/packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java
index 047e0d17ad18..6aad47927a15 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/DataUsageGraph.java
@@ -18,6 +18,7 @@ package com.android.systemui.qs;
import android.content.Context;
import android.content.res.Resources;
+import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
@@ -45,10 +46,12 @@ public class DataUsageGraph extends View {
public DataUsageGraph(Context context, AttributeSet attrs) {
super(context, attrs);
final Resources res = context.getResources();
- mTrackColor = Utils.getDefaultColor(context, R.color.data_usage_graph_track);
- mWarningColor = Utils.getDefaultColor(context, R.color.data_usage_graph_warning);
- mUsageColor = Utils.getColorAccent(context);
- mOverlimitColor = Utils.getColorError(context);
+ mTrackColor = Utils.getColorStateListDefaultColor(context,
+ R.color.data_usage_graph_track);
+ mWarningColor = Utils.getColorStateListDefaultColor(context,
+ R.color.data_usage_graph_warning);
+ mUsageColor = Utils.getColorAccentDefaultColor(context);
+ mOverlimitColor = Utils.getColorErrorDefaultColor(context);
mMarkerWidth = res.getDimensionPixelSize(R.dimen.data_usage_graph_marker_width);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index ab822696d382..f13f4899baed 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -8,8 +8,8 @@ import android.animation.PropertyValuesHolder;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
@@ -189,8 +189,9 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
// marquee. This will ensure that accessibility doesn't announce the TYPE_VIEW_SELECTED
// event on any of the children.
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+ int currentItem = isLayoutRtl() ? mPages.size() - 1 - getCurrentItem() : getCurrentItem();
for (int i = 0; i < mPages.size(); i++) {
- mPages.get(i).setSelected(i == getCurrentItem() ? selected : false);
+ mPages.get(i).setSelected(i == currentItem ? selected : false);
}
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index d8bf990f6465..80b6c73f0ddf 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -17,6 +17,7 @@
package com.android.systemui.qs;
import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import android.content.Context;
import android.content.res.Configuration;
@@ -77,16 +78,7 @@ public class QSContainerImpl extends FrameLayout {
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
-
- // Hide the backgrounds when in landscape mode.
- if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
- mBackgroundGradient.setVisibility(View.INVISIBLE);
- mStatusBarBackground.setVisibility(View.INVISIBLE);
- } else {
- mBackgroundGradient.setVisibility(View.VISIBLE);
- mStatusBarBackground.setVisibility(View.VISIBLE);
- }
-
+ setBackgroundGradientVisibility(newConfig);
updateResources();
mSizePoint.set(0, 0); // Will be retrieved on next measure pass.
}
@@ -128,7 +120,7 @@ public class QSContainerImpl extends FrameLayout {
final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0;
if (disabled == mQsDisabled) return;
mQsDisabled = disabled;
- mBackgroundGradient.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
+ setBackgroundGradientVisibility(getResources().getConfiguration());
mBackground.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
}
@@ -168,6 +160,16 @@ public class QSContainerImpl extends FrameLayout {
+ mHeader.getHeight();
}
+ private void setBackgroundGradientVisibility(Configuration newConfig) {
+ if (newConfig.orientation == ORIENTATION_LANDSCAPE) {
+ mBackgroundGradient.setVisibility(View.INVISIBLE);
+ mStatusBarBackground.setVisibility(View.INVISIBLE);
+ } else {
+ mBackgroundGradient.setVisibility(mQsDisabled ? View.INVISIBLE : View.VISIBLE);
+ mStatusBarBackground.setVisibility(View.VISIBLE);
+ }
+ }
+
public void setExpansion(float expansion) {
mQsExpansion = expansion;
updateExpansion();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
index 5ae43c660b12..84eb3da51bcf 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -15,7 +15,7 @@
*/
package com.android.systemui.qs;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.view.View;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index 7cfe1083af4b..bc75feb666a9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -28,8 +28,8 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
import android.os.Bundle;
import android.os.UserManager;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
@@ -101,7 +101,7 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
public QSFooterImpl(Context context, AttributeSet attrs) {
super(context, attrs);
- mColorForeground = Utils.getColorAttr(context, android.R.attr.colorForeground);
+ mColorForeground = Utils.getColorAttrDefaultColor(context, android.R.attr.colorForeground);
}
@Override
@@ -390,7 +390,7 @@ public class QSFooterImpl extends FrameLayout implements QSFooter,
!(picture instanceof UserIconDrawable)) {
picture = picture.getConstantState().newDrawable(mContext.getResources()).mutate();
picture.setColorFilter(
- Utils.getColorAttr(mContext, android.R.attr.colorForeground),
+ Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorForeground),
Mode.SRC_IN);
}
mMultiUserAvatar.setImageDrawable(picture);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index b146cfccf180..bd89ad166520 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -23,8 +23,8 @@ import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java b/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java
index 7b1509dcd173..7ebab0bfce24 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java
@@ -17,7 +17,7 @@ package com.android.systemui.qs;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
-import android.support.v4.widget.NestedScrollView;
+import androidx.core.widget.NestedScrollView;
import android.util.Property;
import android.view.MotionEvent;
import android.view.View;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index c9c04d9ead0b..1c50f797e1a7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -45,6 +45,7 @@ public class QuickQSPanel extends QSPanel {
public static final String NUM_QUICK_TILES = "sysui_qqs_count";
private boolean mDisabledByPolicy;
+ private static int mDefaultMaxTiles;
private int mMaxTiles;
protected QSPanel mFullPanel;
@@ -59,6 +60,7 @@ public class QuickQSPanel extends QSPanel {
}
removeView((View) mTileLayout);
}
+ mDefaultMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_columns);
mTileLayout = new HeaderTileLayout(context);
mTileLayout.setListening(mListening);
addView((View) mTileLayout, 0 /* Between brightness and footer */);
@@ -149,7 +151,7 @@ public class QuickQSPanel extends QSPanel {
};
public static int getNumQuickTiles(Context context) {
- return Dependency.get(TunerService.class).getValue(NUM_QUICK_TILES, 6);
+ return Dependency.get(TunerService.class).getValue(NUM_QUICK_TILES, mDefaultMaxTiles);
}
void setDisabledByPolicy(boolean disabled) {
@@ -190,29 +192,21 @@ public class QuickQSPanel extends QSPanel {
mTileDimensionSize = mContext.getResources().getDimensionPixelSize(
R.dimen.qs_quick_tile_size);
-
- setGravity(Gravity.CENTER);
- setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+ updateLayoutParams();
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
+ updateLayoutParams();
+ }
+ private void updateLayoutParams() {
setGravity(Gravity.CENTER);
- LayoutParams staticSpaceLayoutParams = generateSpaceLayoutParams(
- mContext.getResources().getDimensionPixelSize(
- R.dimen.qs_quick_tile_space_width));
-
- // Update space params since they fill any open space in portrait orientation and have
- // a static width in landscape orientation.
- final int childViewCount = getChildCount();
- for (int i = 0; i < childViewCount; i++) {
- View childView = getChildAt(i);
- if (childView instanceof Space) {
- childView.setLayoutParams(staticSpaceLayoutParams);
- }
- }
+ int width = getResources().getDimensionPixelSize(R.dimen.qs_quick_layout_width);
+ LayoutParams lp = new LayoutParams(width, LayoutParams.MATCH_PARENT);
+ lp.gravity = Gravity.CENTER_HORIZONTAL;
+ setLayoutParams(lp);
}
/**
@@ -220,11 +214,9 @@ public class QuickQSPanel extends QSPanel {
* then we're going to have the space expand to take up as much space as possible. If the
* width is non-zero, we want the inter-tile spacers to be fixed.
*/
- private LayoutParams generateSpaceLayoutParams(int spaceWidth) {
- LayoutParams lp = new LayoutParams(spaceWidth, mTileDimensionSize);
- if (spaceWidth == 0) {
- lp.weight = 1;
- }
+ private LayoutParams generateSpaceLayoutParams() {
+ LayoutParams lp = new LayoutParams(0, mTileDimensionSize);
+ lp.weight = 1;
lp.gravity = Gravity.CENTER;
return lp;
}
@@ -241,13 +233,7 @@ public class QuickQSPanel extends QSPanel {
@Override
public void addTile(TileRecord tile) {
if (getChildCount() != 0) {
- // Add a spacer between tiles. We want static-width spaces if we're in landscape to
- // keep the tiles close. For portrait, we stick with spaces that fill up any
- // available space.
- LayoutParams spaceLayoutParams = generateSpaceLayoutParams(
- mContext.getResources().getDimensionPixelSize(
- R.dimen.qs_quick_tile_space_width));
- addView(new Space(mContext), getChildCount(), spaceLayoutParams);
+ addView(new Space(mContext), getChildCount(), generateSpaceLayoutParams());
}
addView(tile.tileView, getChildCount(), generateTileLayoutParams());
@@ -303,6 +289,10 @@ public class QuickQSPanel extends QSPanel {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ if (hideOverflowingChildren(widthMeasureSpec)) {
+ return; // Rely on visibility change to trigger remeasure.
+ }
+
if (mRecords != null && mRecords.size() > 0) {
View previousView = this;
for (TileRecord record : mRecords) {
@@ -315,5 +305,32 @@ public class QuickQSPanel extends QSPanel {
R.id.expand_indicator);
}
}
+
+ /**
+ * Hide child views that would otherwise be clipped.
+ * @return {@code true} if any child visibilities have changed.
+ */
+ private boolean hideOverflowingChildren(int widthMeasureSpec) {
+ if (getChildCount() == 0) {
+ return false;
+ }
+ boolean childVisibilityChanged = false;
+ int widthRemaining = MeasureSpec.getSize(widthMeasureSpec)
+ - getChildAt(0).getMeasuredWidth() - getPaddingStart() - getPaddingEnd();
+ for (int i = 2; i < getChildCount(); i += 2) {
+ View tileChild = getChildAt(i);
+ LayoutParams lp = (LayoutParams) tileChild.getLayoutParams();
+ // All Space views have 0 width; only tiles contribute to the total width.
+ widthRemaining = widthRemaining
+ - tileChild.getMeasuredWidth() - lp.getMarginEnd() - lp.getMarginStart();
+ int newVisibility = widthRemaining < 0 ? View.GONE : View.VISIBLE;
+ if (tileChild.getVisibility() != newVisibility) {
+ tileChild.setVisibility(newVisibility);
+ getChildAt(i - 1).setVisibility(newVisibility); // Hide spacer as well.
+ childVisibilityChanged = true;
+ }
+ }
+ return childVisibilityChanged;
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index a9bfa45b6a73..ff5ac767410d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -33,7 +33,8 @@ import android.media.AudioManager;
import android.os.Handler;
import android.provider.AlarmClock;
import android.service.notification.ZenModeConfig;
-import android.support.annotation.VisibleForTesting;
+import android.widget.FrameLayout;
+import androidx.annotation.VisibleForTesting;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
@@ -167,7 +168,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements
updateResources();
Rect tintArea = new Rect(0, 0, 0, 0);
- int colorForeground = Utils.getColorAttr(getContext(), android.R.attr.colorForeground);
+ int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
+ android.R.attr.colorForeground);
float intensity = getColorIntensity(colorForeground);
int fillColor = fillColorForIntensity(intensity, getContext());
@@ -269,8 +271,22 @@ public class QuickStatusBarHeader extends RelativeLayout implements
updateResources();
}
+ /**
+ * The height of QQS should always be the status bar height + 128dp. This is normally easy, but
+ * when there is a notch involved the status bar can remain a fixed pixel size.
+ */
+ private void updateMinimumHeight() {
+ int sbHeight = mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.status_bar_height);
+ int qqsHeight = mContext.getResources().getDimensionPixelSize(
+ R.dimen.qs_quick_header_panel_height);
+
+ setMinimumHeight(sbHeight + qqsHeight);
+ }
+
private void updateResources() {
Resources resources = mContext.getResources();
+ updateMinimumHeight();
// Update height for a few views, especially due to landscape mode restricting space.
mHeaderTextContainerView.getLayoutParams().height =
@@ -281,10 +297,17 @@ public class QuickStatusBarHeader extends RelativeLayout implements
com.android.internal.R.dimen.quick_qs_offset_height);
mSystemIconsView.setLayoutParams(mSystemIconsView.getLayoutParams());
- getLayoutParams().height = resources.getDimensionPixelSize(mQsDisabled
- ? com.android.internal.R.dimen.quick_qs_offset_height
- : com.android.internal.R.dimen.quick_qs_total_height);
- setLayoutParams(getLayoutParams());
+ FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
+ if (mQsDisabled) {
+ lp.height = resources.getDimensionPixelSize(
+ com.android.internal.R.dimen.quick_qs_offset_height);
+ } else {
+ lp.height = Math.max(getMinimumHeight(),
+ resources.getDimensionPixelSize(
+ com.android.internal.R.dimen.quick_qs_total_height));
+ }
+
+ setLayoutParams(lp);
updateStatusIconAlphaAnimator();
updateHeaderTextContainerAlphaAnimator();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
index 2ea21c66240f..f6b08b05bf38 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
@@ -16,7 +16,7 @@ package com.android.systemui.qs.car;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
index 608a2364662e..2d9e4d7fc22b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
@@ -22,9 +22,9 @@ import android.animation.ValueAnimator;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.GridLayoutManager;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.recyclerview.widget.GridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
index 31c455d880d6..9b225bb9f18b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java
@@ -16,7 +16,7 @@ package com.android.systemui.qs.car;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
-import android.support.annotation.IdRes;
+import androidx.annotation.IdRes;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
@@ -40,7 +40,8 @@ public class CarStatusBarHeader extends LinearLayout {
super.onFinishInflate();
// Set the light/dark theming on the header status UI to match the current theme.
- int colorForeground = Utils.getColorAttr(getContext(), android.R.attr.colorForeground);
+ int colorForeground = Utils.getColorAttrDefaultColor(getContext(),
+ android.R.attr.colorForeground);
float intensity = colorForeground == Color.WHITE ? 0f : 1f;
Rect tintArea = new Rect(0, 0, 0, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index 394c3225bceb..2ea15bd2ad3e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -22,9 +22,9 @@ import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.Bundle;
-import android.support.v7.widget.DefaultItemAnimator;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.DefaultItemAnimator;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
@@ -101,7 +101,7 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene
mToolbar.getMenu().add(Menu.NONE, MENU_RESET, 0,
mContext.getString(com.android.internal.R.string.reset));
mToolbar.setTitle(R.string.qs_edit);
- int accentColor = Utils.getColorAttr(context, android.R.attr.colorAccent);
+ int accentColor = Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent);
mToolbar.setTitleTextColor(accentColor);
mToolbar.getNavigationIcon().setTint(accentColor);
mToolbar.getOverflowIcon().setTint(accentColor);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index 5adeec3cbab4..78e9f36d69aa 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -23,13 +23,13 @@ import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.widget.GridLayoutManager.SpanSizeLookup;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.RecyclerView.ItemDecoration;
-import android.support.v7.widget.RecyclerView.State;
-import android.support.v7.widget.RecyclerView.ViewHolder;
-import android.support.v7.widget.helper.ItemTouchHelper;
+import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView.ItemDecoration;
+import androidx.recyclerview.widget.RecyclerView.State;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
+import androidx.recyclerview.widget.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileColorPicker.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileColorPicker.java
index 0cc17ff37241..75dd0d9e565d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileColorPicker.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileColorPicker.java
@@ -18,7 +18,7 @@ package com.android.systemui.qs.external;
import android.content.Context;
import android.content.res.ColorStateList;
import android.service.quicksettings.Tile;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import com.android.systemui.R;
public class TileColorPicker {
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 1170d7b6e8a9..4e0f38fc4662 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -34,7 +34,7 @@ import android.service.quicksettings.IQSService;
import android.service.quicksettings.IQSTileService;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.ArraySet;
import android.util.Log;
import com.android.systemui.qs.external.PackageManagerAdapter;
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 f5f8ffa7f641..9f9fe39bab6c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
@@ -30,7 +30,7 @@ import android.os.UserHandle;
import android.service.quicksettings.IQSTileService;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.Log;
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
index cc60f8744ca7..91afef02a246 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
@@ -94,10 +94,10 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setBackground(mTileBackground);
- mColorActive = Utils.getColorAttr(context, android.R.attr.colorAccent);
+ mColorActive = Utils.getColorAttrDefaultColor(context, android.R.attr.colorAccent);
mColorDisabled = Utils.getDisabled(context,
- Utils.getColorAttr(context, android.R.attr.textColorTertiary));
- mColorInactive = Utils.getColorAttr(context, android.R.attr.textColorSecondary);
+ Utils.getColorAttrDefaultColor(context, android.R.attr.textColorTertiary));
+ mColorInactive = Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
setPadding(0, 0, 0, 0);
setClipChildren(false);
@@ -265,6 +265,8 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
+ // Clear selected state so it is not announce by talkback.
+ info.setSelected(false);
if (!TextUtils.isEmpty(mAccessibilityClass)) {
info.setClassName(mAccessibilityClass);
if (Switch.class.getName().equals(mAccessibilityClass)) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 834feb7781ea..6bc3bee636d0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -387,11 +387,11 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
switch (state) {
case Tile.STATE_UNAVAILABLE:
return Utils.getDisabled(context,
- Utils.getColorAttr(context, android.R.attr.textColorSecondary));
+ Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary));
case Tile.STATE_INACTIVE:
- return Utils.getColorAttr(context, android.R.attr.textColorSecondary);
+ return Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
case Tile.STATE_ACTIVE:
- return Utils.getColorAttr(context, android.R.attr.colorPrimary);
+ return Utils.getColorAttrDefaultColor(context, android.R.attr.colorPrimary);
default:
Log.e("QSTile", "Invalid state " + state);
return 0;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
index 63d6f82ce9e6..a3e9afd366fd 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
@@ -17,7 +17,7 @@ package com.android.systemui.qs.tileimpl;
import android.annotation.Nullable;
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import android.widget.ImageView;
import com.android.internal.annotations.VisibleForTesting;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
index 23e3f25f6f5a..7f3537c2d41d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
@@ -70,6 +70,9 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements
@Override
protected void handleClick() {
+ if (getState().state == Tile.STATE_UNAVAILABLE) {
+ return;
+ }
mBatteryController.setPowerSaveMode(!mPowerSave);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
index 7224ae6a1e15..7bcc6d7b93a9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java
@@ -20,6 +20,7 @@ import android.annotation.ColorInt;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.content.res.ColorStateList;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
@@ -66,7 +67,7 @@ public class DataUsageDetailView extends LinearLayout {
final Resources res = mContext.getResources();
final int titleId;
final long bytes;
- @ColorInt int usageColor = 0;
+ ColorStateList usageColorState = null;
final String top;
String bottom = null;
if (info.usageLevel < info.warningLevel || info.limitLevel <= 0) {
@@ -91,18 +92,18 @@ public class DataUsageDetailView extends LinearLayout {
formatBytes(info.usageLevel));
bottom = res.getString(R.string.quick_settings_cellular_detail_data_limit,
formatBytes(info.limitLevel));
- usageColor = Utils.getDefaultColor(mContext, android.R.attr.colorError);
+ usageColorState = Utils.getColorError(mContext);
}
- if (usageColor == 0) {
- usageColor = Utils.getColorAccent(mContext);
+ if (usageColorState == null) {
+ usageColorState = Utils.getColorAccent(mContext);
}
final TextView title = findViewById(android.R.id.title);
title.setText(titleId);
final TextView usage = findViewById(R.id.usage_text);
usage.setText(formatBytes(bytes));
- usage.setTextColor(usageColor);
+ usage.setTextColor(usageColorState);
final DataUsageGraph graph = findViewById(R.id.usage_graph);
graph.setLevels(info.limitLevel, info.warningLevel, info.usageLevel);
final TextView carrier = findViewById(R.id.usage_carrier_text);
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 67900d93be9a..d1e33d3fb8d6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -215,6 +215,7 @@ public class DndTile extends QSTileImpl<BooleanState> {
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
+ if (mController == null) return;
final int zen = arg instanceof Integer ? (Integer) arg : mController.getZen();
final boolean newValue = zen != ZEN_MODE_OFF;
final boolean valueChanged = state.value != newValue;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
index c7191f81620c..c41f087aa76b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
@@ -24,7 +24,8 @@ import android.content.Intent;
import android.metrics.LogMaker;
import android.provider.Settings;
import android.service.quicksettings.Tile;
-import android.support.annotation.StringRes;
+import androidx.annotation.StringRes;
+import android.text.TextUtils;
import android.util.Log;
import android.widget.Switch;
@@ -35,8 +36,11 @@ import com.android.systemui.qs.QSHost;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.qs.tileimpl.QSTileImpl;
+import java.text.DateFormat;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+import java.util.TimeZone;
public class NightDisplayTile extends QSTileImpl<BooleanState>
implements ColorDisplayController.Callback {
@@ -47,6 +51,7 @@ public class NightDisplayTile extends QSTileImpl<BooleanState>
*/
private static final String PATTERN_HOUR = "h a";
private static final String PATTERN_HOUR_MINUTE = "h:mm a";
+ private static final String PATTERN_HOUR_NINUTE_24 = "HH:mm";
private ColorDisplayController mController;
@@ -101,12 +106,14 @@ public class NightDisplayTile extends QSTileImpl<BooleanState>
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
state.value = mController.isActivated();
- state.label = state.contentDescription =
- mContext.getString(R.string.quick_settings_night_display_label);
+ state.label = mContext.getString(R.string.quick_settings_night_display_label);
state.icon = ResourceIcon.get(R.drawable.ic_qs_night_display_on);
state.expandedAccessibilityClassName = Switch.class.getName();
state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
state.secondaryLabel = getSecondaryLabel(state.value);
+ state.contentDescription = TextUtils.isEmpty(state.secondaryLabel)
+ ? state.label
+ : TextUtils.concat(state.label, ", ", state.secondaryLabel);
}
/**
@@ -139,12 +146,17 @@ public class NightDisplayTile extends QSTileImpl<BooleanState>
toggleTimeStringRes = R.string.quick_settings_night_secondary_label_on_at;
}
- // Choose between just showing the hour or also showing the minutes (based on the
- // user-selected toggle time). This helps reduce how much space the label takes.
- toggleTimeFormat = DateTimeFormatter.ofPattern(
- toggleTime.getMinute() == 0 ? PATTERN_HOUR : PATTERN_HOUR_MINUTE);
-
- return mContext.getString(toggleTimeStringRes, toggleTime.format(toggleTimeFormat));
+ // TODO(b/111085930): Move this calendar snippet to a common code location that
+ // settings lib can also access.
+ final Calendar c = Calendar.getInstance();
+ DateFormat nightTileFormat = android.text.format.DateFormat.getTimeFormat(mContext);
+ nightTileFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ c.setTimeZone(nightTileFormat.getTimeZone());
+ c.set(Calendar.HOUR_OF_DAY, toggleTime.getHour());
+ c.set(Calendar.MINUTE, toggleTime.getMinute());
+ c.set(Calendar.SECOND, 0);
+ c.set(Calendar.MILLISECOND, 0);
+ return mContext.getString(toggleTimeStringRes, nightTileFormat.format(c.getTime()));
default:
// No secondary label when auto mode is disabled.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/touch/SwipeDetector.java b/packages/SystemUI/src/com/android/systemui/qs/touch/SwipeDetector.java
index 252205201e5d..911bea67b8b4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/touch/SwipeDetector.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/touch/SwipeDetector.java
@@ -19,8 +19,8 @@ import static android.view.MotionEvent.INVALID_POINTER_ID;
import android.content.Context;
import android.graphics.PointF;
-import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 7e4acc2d0e28..63a65d030f6d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -48,6 +48,7 @@ import android.widget.Toast;
import com.android.systemui.Dependency;
import com.android.systemui.OverviewProxyService;
+import com.android.systemui.SysUiServiceProvider;
import com.google.android.collect.Lists;
import com.android.internal.logging.MetricsLogger;
@@ -1095,7 +1096,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
}
private StatusBar getStatusBar() {
- return ((SystemUIApplication) mContext).getComponent(StatusBar.class);
+ return SysUiServiceProvider.getComponent(mContext, StatusBar.class);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index 8d8e20669a1f..ce9d7e160e0e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -479,7 +479,7 @@ public class RecentsOnboarding {
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
x, -mNavBarHeight / 2,
- WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+ WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
flags,
PixelFormat.TRANSLUCENT);
lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUserService.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUserService.java
index 2c1158df3793..b4212d310fc0 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUserService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUserService.java
@@ -21,6 +21,7 @@ import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
+import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.SystemUIApplication;
/**
@@ -40,8 +41,7 @@ public class RecentsSystemUserService extends Service {
@Override
public IBinder onBind(Intent intent) {
- SystemUIApplication app = (SystemUIApplication) getApplication();
- Recents recents = app.getComponent(Recents.class);
+ Recents recents = SysUiServiceProvider.getComponent(this, Recents.class);
if (DEBUG) {
Log.d(TAG, "onBind: " + recents);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
index 481d54f3bbb6..91512dd53f96 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
@@ -19,6 +19,7 @@ package com.android.systemui.recents;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -124,7 +125,7 @@ public class ScreenPinningRequest implements View.OnClickListener {
public void onClick(View v) {
if (v.getId() == R.id.screen_pinning_ok_button || mRequestWindow == v) {
try {
- ActivityManager.getService().startSystemLockTaskMode(taskId);
+ ActivityTaskManager.getService().startSystemLockTaskMode(taskId);
} catch (RemoteException e) {}
}
clearPrompt();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java b/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java
index de85c0f9a726..af8c2d08f4b4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java
@@ -19,7 +19,7 @@ package com.android.systemui.recents;
import android.graphics.Outline;
import android.graphics.Path;
import android.graphics.drawable.shapes.PathShape;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
/**
* Wrapper around {@link android.graphics.drawable.shapes.PathShape}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 544d95c7b62f..350fe7848d9d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -28,8 +28,10 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import android.app.ActivityManager;
import android.app.ActivityManager.StackInfo;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.AppGlobals;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.WindowConfiguration;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -94,6 +96,7 @@ public class SystemServicesProxy {
AccessibilityManager mAccm;
ActivityManager mAm;
IActivityManager mIam;
+ IActivityTaskManager mIatm;
PackageManager mPm;
IPackageManager mIpm;
private final IDreamManager mDreamManager;
@@ -133,6 +136,7 @@ public class SystemServicesProxy {
mAccm = AccessibilityManager.getInstance(context);
mAm = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
mIam = ActivityManager.getService();
+ mIatm = ActivityTaskManager.getService();
mPm = context.getPackageManager();
mIpm = AppGlobals.getPackageManager();
mAssistUtils = new AssistUtils(context);
@@ -203,7 +207,7 @@ public class SystemServicesProxy {
if (mIam == null) return false;
try {
- List<StackInfo> stackInfos = mIam.getAllStackInfos();
+ List<StackInfo> stackInfos = mIatm.getAllStackInfos();
ActivityManager.StackInfo homeStackInfo = null;
ActivityManager.StackInfo fullscreenStackInfo = null;
ActivityManager.StackInfo recentsStackInfo = null;
@@ -261,13 +265,13 @@ public class SystemServicesProxy {
/** Moves an already resumed task to the side of the screen to initiate split screen. */
public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode,
Rect initialBounds) {
- if (mIam == null) {
+ if (mIatm == null) {
return false;
}
try {
- return mIam.setTaskWindowingModeSplitScreenPrimary(taskId, createMode, true /* onTop */,
- false /* animate */, initialBounds, true /* showRecents */);
+ return mIatm.setTaskWindowingModeSplitScreenPrimary(taskId, createMode,
+ true /* onTop */, false /* animate */, initialBounds, true /* showRecents */);
} catch (RemoteException e) {
e.printStackTrace();
}
@@ -276,7 +280,7 @@ public class SystemServicesProxy {
public ActivityManager.StackInfo getSplitScreenPrimaryStack() {
try {
- return mIam.getStackInfo(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_UNDEFINED);
+ return mIatm.getStackInfo(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_UNDEFINED);
} catch (RemoteException e) {
return null;
}
@@ -324,10 +328,10 @@ public class SystemServicesProxy {
/** Set the task's windowing mode. */
public void setTaskWindowingMode(int taskId, int windowingMode) {
- if (mIam == null) return;
+ if (mIatm == null) return;
try {
- mIam.setTaskWindowingMode(taskId, windowingMode, false /* onTop */);
+ mIatm.setTaskWindowingMode(taskId, windowingMode, false /* onTop */);
} catch (RemoteException | IllegalArgumentException e) {
e.printStackTrace();
}
@@ -372,7 +376,7 @@ public class SystemServicesProxy {
if (mIam == null) return false;
try {
- return mIam.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_PINNED;
+ return mIatm.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_PINNED;
} catch (RemoteException e) {
return false;
}
@@ -413,9 +417,9 @@ public class SystemServicesProxy {
try {
// Use the recents stack bounds, fallback to fullscreen stack if it is null
ActivityManager.StackInfo stackInfo =
- mIam.getStackInfo(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS);
+ mIatm.getStackInfo(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_RECENTS);
if (stackInfo == null) {
- stackInfo = mIam.getStackInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+ stackInfo = mIatm.getStackInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
}
if (stackInfo != null) {
windowRect.set(stackInfo.bounds);
@@ -437,7 +441,7 @@ public class SystemServicesProxy {
if (mIam == null) return;
try {
- mIam.startInPlaceAnimationOnFrontMostApplication(
+ mIatm.startInPlaceAnimationOnFrontMostApplication(
opts == null ? null : opts.toBundle());
} catch (Exception e) {
e.printStackTrace();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/DockState.java b/packages/SystemUI/src/com/android/systemui/recents/views/DockState.java
index 65b96fbb52f9..a246141c74f8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/DockState.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/DockState.java
@@ -16,8 +16,8 @@
package com.android.systemui.recents.views;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.view.WindowManager.DOCKED_BOTTOM;
import static android.view.WindowManager.DOCKED_INVALID;
import static android.view.WindowManager.DOCKED_LEFT;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index e3ed1aaa5506..5c925fda640e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -16,7 +16,7 @@
package com.android.systemui.recents.views;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_RECENT_APPS;
@@ -198,7 +198,7 @@ public class RecentsView extends FrameLayout {
}
public void reevaluateStyles() {
- int textColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
+ int textColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor);
boolean usingDarkText = Color.luminance(textColor) < 0.5f;
mEmptyView.setTextColor(textColor);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
index 5c69ae3915b3..53a91e536c8a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
@@ -17,6 +17,7 @@
package com.android.systemui.recents.views;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.InputDevice;
@@ -137,7 +138,7 @@ public class RecentsViewTouchHandler {
}
mVisibleDockStates.clear();
- if (ActivityManager.supportsMultiWindow(mRv.getContext()) && !ssp.hasDockedTask()
+ if (ActivityTaskManager.supportsMultiWindow(mRv.getContext()) && !ssp.hasDockedTask()
&& mDividerSnapAlgorithm.isSplitScreenFeasible()) {
Recents.logDockAttempt(mRv.getContext(), event.task.getTopComponent(),
event.task.resizeMode);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java
index 0fc507b92bf3..f217596bd4a9 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java
@@ -17,6 +17,7 @@
package com.android.systemui.recents.views;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
@@ -58,7 +59,7 @@ public class TaskViewAccessibilityDelegate extends View.AccessibilityDelegate {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
- if (ActivityManager.supportsSplitScreenMultiWindow(mTaskView.getContext())
+ if (ActivityTaskManager.supportsSplitScreenMultiWindow(mTaskView.getContext())
&& !Recents.getSystemServices().hasDockedTask()) {
DockState[] dockStates = Recents.getConfiguration()
.getDockStatesForCurrentOrientation();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
index 842899b62635..de4291446e7c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
@@ -36,7 +36,7 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
import android.os.CountDownTimer;
-import android.support.v4.graphics.ColorUtils;
+import androidx.core.graphics.ColorUtils;
import android.util.AttributeSet;
import android.util.IconDrawableFactory;
import android.view.Gravity;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 8a0d7e38f875..5eaee5452ad5 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -16,9 +16,11 @@
package com.android.systemui.screenshot;
+import static android.content.Context.NOTIFICATION_SERVICE;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
-
-import static com.android.systemui.screenshot.GlobalScreenshot.SHARING_INTENT;
+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;
import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_SCREENSHOT;
import android.animation.Animator;
@@ -26,7 +28,6 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.Notification;
import android.app.Notification.BigPictureStyle;
@@ -56,10 +57,11 @@ import android.os.AsyncTask;
import android.os.Environment;
import android.os.PowerManager;
import android.os.Process;
-import android.os.RemoteException;
import android.os.UserHandle;
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;
@@ -72,12 +74,13 @@ import android.view.WindowManager;
import android.view.animation.Interpolator;
import android.widget.ImageView;
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.shared.system.ActivityManagerWrapper;
+import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.NotificationChannels;
-
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
@@ -246,7 +249,10 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
try {
// Create screenshot directory if it doesn't exist
- mScreenshotDir.mkdirs();
+ boolean madeDirs = mScreenshotDir.mkdirs();
+ if (madeDirs == false) {
+ Log.e(TAG, "Couldn't create screenshot directory: " + mScreenshotDir);
+ }
// media provider uses seconds for DATE_MODIFIED and DATE_ADDED, but milliseconds
// for DATE_TAKEN
@@ -273,7 +279,12 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
values.put(MediaStore.Images.ImageColumns.SIZE, new File(mImageFilePath).length());
Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
- // Create a share intent
+ // Note: Both the share and edit actions are proxied through ActionProxyReceiver in
+ // order to do some common work like dismissing the keyguard and sending
+ // closeSystemWindows
+
+ // Create a share intent, this will always go through the chooser activity first which
+ // should not trigger auto-enter PiP
String subjectDate = DateFormat.getDateTimeInstance().format(new Date(mImageTime));
String subject = String.format(SCREENSHOT_SHARE_SUBJECT_TEMPLATE, subjectDate);
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
@@ -282,37 +293,47 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
sharingIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- // Create a share action for the notification. Note, we proxy the call to
- // ScreenshotActionReceiver because RemoteViews currently forces an activity options
- // on the PendingIntent being launched, and since we don't want to trigger the share
- // sheet in this case, we start the chooser activity directly in
- // ScreenshotActionReceiver.
- PendingIntent shareAction = PendingIntent.getBroadcast(context, 0,
- new Intent(context, GlobalScreenshot.ScreenshotActionReceiver.class)
- .putExtra(SHARING_INTENT, sharingIntent),
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent chooserAction = PendingIntent.getBroadcast(context, 0,
+ new Intent(context, GlobalScreenshot.TargetChosenReceiver.class),
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
+ Intent sharingChooserIntent = Intent.createChooser(sharingIntent, null,
+ chooserAction.getIntentSender())
+ .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ // Create a share action for the notification
+ PendingIntent shareAction = PendingIntent.getBroadcastAsUser(context, 0,
+ new Intent(context, GlobalScreenshot.ActionProxyReceiver.class)
+ .putExtra(EXTRA_ACTION_INTENT, sharingChooserIntent)
+ .putExtra(EXTRA_DISALLOW_ENTER_PIP, true),
+ PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.SYSTEM);
Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder(
R.drawable.ic_screenshot_share,
r.getString(com.android.internal.R.string.share), shareAction);
mNotificationBuilder.addAction(shareActionBuilder.build());
+ // Create an edit intent, if a specific package is provided as the editor, then launch
+ // that directly
+ String editorPackage = context.getString(R.string.config_screenshotEditor);
Intent editIntent = new Intent(Intent.ACTION_EDIT);
+ if (!TextUtils.isEmpty(editorPackage)) {
+ editIntent.setComponent(ComponentName.unflattenFromString(editorPackage));
+ }
editIntent.setType("image/png");
editIntent.setData(uri);
editIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
editIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- // Create a edit action for the notification the same way.
- PendingIntent editAction = PendingIntent.getBroadcast(context, 1,
- new Intent(context, GlobalScreenshot.ScreenshotActionReceiver.class)
- .putExtra(SHARING_INTENT, editIntent),
- PendingIntent.FLAG_CANCEL_CURRENT);
+ // Create a edit action
+ PendingIntent editAction = PendingIntent.getBroadcastAsUser(context, 1,
+ new Intent(context, GlobalScreenshot.ActionProxyReceiver.class)
+ .putExtra(EXTRA_ACTION_INTENT, editIntent)
+ .putExtra(EXTRA_CANCEL_NOTIFICATION, editIntent.getComponent() != null),
+ PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.SYSTEM);
Notification.Action.Builder editActionBuilder = new Notification.Action.Builder(
R.drawable.ic_screenshot_edit,
r.getString(com.android.internal.R.string.screenshot_edit), editAction);
mNotificationBuilder.addAction(editActionBuilder.build());
-
// Create a delete action for the notification
PendingIntent deleteAction = PendingIntent.getBroadcast(context, 0,
new Intent(context, GlobalScreenshot.DeleteScreenshotReceiver.class)
@@ -425,7 +446,9 @@ class DeleteImageInBackgroundTask extends AsyncTask<Uri, Void, Void> {
class GlobalScreenshot {
static final String SCREENSHOT_URI_ID = "android:screenshot_uri_id";
- static final String SHARING_INTENT = "android:screenshot_sharing_intent";
+ static final String EXTRA_ACTION_INTENT = "android:screenshot_action_intent";
+ static final String EXTRA_CANCEL_NOTIFICATION = "android:screenshot_cancel_notification";
+ static final String EXTRA_DISALLOW_ENTER_PIP = "android:screenshot_disallow_enter_pip";
private static final int SCREENSHOT_FLASH_TO_PEAK_DURATION = 130;
private static final int SCREENSHOT_DROP_IN_DURATION = 430;
@@ -448,7 +471,6 @@ class GlobalScreenshot {
private NotificationManager mNotificationManager;
private Display mDisplay;
private DisplayMetrics mDisplayMetrics;
- private Matrix mDisplayMatrix;
private Bitmap mScreenBitmap;
private View mScreenshotLayout;
@@ -478,7 +500,6 @@ class GlobalScreenshot {
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Inflate the screenshot layout
- mDisplayMatrix = new Matrix();
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);
@@ -508,7 +529,7 @@ class GlobalScreenshot {
mWindowLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mNotificationManager =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
mDisplay = mWindowManager.getDefaultDisplay();
mDisplayMetrics = new DisplayMetrics();
mDisplay.getRealMetrics(mDisplayMetrics);
@@ -558,21 +579,6 @@ class GlobalScreenshot {
}
/**
- * @return the current display rotation in degrees
- */
- private float getDegreesForRotation(int value) {
- switch (value) {
- case Surface.ROTATION_90:
- return 360f - 90f;
- case Surface.ROTATION_180:
- return 360f - 180f;
- case Surface.ROTATION_270:
- return 360f - 270f;
- }
- return 0f;
- }
-
- /**
* Takes a screenshot of the current display and shows an animation.
*/
private void takeScreenshot(Runnable finisher, boolean statusBarVisible, boolean navBarVisible,
@@ -887,52 +893,39 @@ class GlobalScreenshot {
}
/**
- * Receiver to proxy the share or edit intent.
+ * Receiver to proxy the share or edit intent, used to clean up the notification and send
+ * appropriate signals to the system (ie. to dismiss the keyguard if necessary).
*/
- public static class ScreenshotActionReceiver extends BroadcastReceiver {
+ public static class ActionProxyReceiver extends BroadcastReceiver {
@Override
- public void onReceive(Context context, Intent intent) {
- try {
- ActivityManager.getService().closeSystemDialogs(SYSTEM_DIALOG_REASON_SCREENSHOT);
- } catch (RemoteException e) {
- }
-
- Intent actionIntent = intent.getParcelableExtra(SHARING_INTENT);
-
- // If this is an edit & default editor exists, route straight there.
- String editorPackage = context.getResources().getString(R.string.config_screenshotEditor);
- if (actionIntent.getAction() == Intent.ACTION_EDIT &&
- editorPackage != null && editorPackage.length() > 0) {
- actionIntent.setComponent(ComponentName.unflattenFromString(editorPackage));
- final NotificationManager nm =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- nm.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT);
- } else {
- PendingIntent chooseAction = PendingIntent.getBroadcast(context, 0,
- new Intent(context, GlobalScreenshot.TargetChosenReceiver.class),
- PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
- actionIntent = Intent.createChooser(actionIntent, null,
- chooseAction.getIntentSender())
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
- }
-
- ActivityOptions opts = ActivityOptions.makeBasic();
- opts.setDisallowEnterPictureInPictureWhileLaunching(true);
-
- context.startActivityAsUser(actionIntent, opts.toBundle(), UserHandle.CURRENT);
+ public void onReceive(Context context, final Intent intent) {
+ Runnable startActivityRunnable = () -> {
+ ActivityManagerWrapper.getInstance().closeSystemWindows(
+ SYSTEM_DIALOG_REASON_SCREENSHOT);
+
+ Intent actionIntent = intent.getParcelableExtra(EXTRA_ACTION_INTENT);
+ if (intent.getBooleanExtra(EXTRA_CANCEL_NOTIFICATION, false)) {
+ cancelScreenshotNotification(context);
+ }
+ ActivityOptions opts = ActivityOptions.makeBasic();
+ opts.setDisallowEnterPictureInPictureWhileLaunching(
+ 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,
+ true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
}
}
/**
- * Removes the notification for a screenshot after a share or edit target is chosen.
+ * Removes the notification for a screenshot after a share target is chosen.
*/
public static class TargetChosenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- // Clear the notification
- final NotificationManager nm =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- nm.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT);
+ // Clear the notification only after the user has chosen a share action
+ cancelScreenshotNotification(context);
}
}
@@ -946,14 +939,18 @@ class GlobalScreenshot {
return;
}
- // Clear the notification
- final NotificationManager nm =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- final Uri uri = Uri.parse(intent.getStringExtra(SCREENSHOT_URI_ID));
- nm.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT);
+ // Clear the notification when the image is deleted
+ cancelScreenshotNotification(context);
// And delete the image from the media store
+ final Uri uri = Uri.parse(intent.getStringExtra(SCREENSHOT_URI_ID));
new DeleteImageInBackgroundTask(context).execute(uri);
}
}
+
+ private static void cancelScreenshotNotification(Context context) {
+ final NotificationManager nm =
+ (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
+ nm.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java
index da798848f7e8..750002cbc5ca 100644
--- a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java
@@ -16,8 +16,8 @@
package com.android.systemui.shortcut;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.os.UserHandle.USER_CURRENT;
import static com.android.systemui.statusbar.phone.NavigationBarGestureHelper.DRAG_MODE_NONE;
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
index 1e5b37c9af50..600964e98b84 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java
@@ -19,6 +19,7 @@ package com.android.systemui.stackdivider;
import static android.view.WindowManager.DOCKED_INVALID;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.graphics.Rect;
import android.os.RemoteException;
import android.util.Log;
@@ -71,7 +72,7 @@ public class WindowManagerProxy {
mTmpRect5.set(mTempOtherInsetRect);
}
try {
- ActivityManager.getService()
+ ActivityTaskManager.getService()
.resizeDockedStack(mTmpRect1,
mTmpRect2.isEmpty() ? null : mTmpRect2,
mTmpRect3.isEmpty() ? null : mTmpRect3,
@@ -87,7 +88,7 @@ public class WindowManagerProxy {
@Override
public void run() {
try {
- ActivityManager.getService().dismissSplitScreenMode(false /* onTop */);
+ ActivityTaskManager.getService().dismissSplitScreenMode(false /* onTop */);
} catch (RemoteException e) {
Log.w(TAG, "Failed to remove stack: " + e);
}
@@ -98,7 +99,7 @@ public class WindowManagerProxy {
@Override
public void run() {
try {
- ActivityManager.getService().dismissSplitScreenMode(true /* onTop */);
+ ActivityTaskManager.getService().dismissSplitScreenMode(true /* onTop */);
} catch (RemoteException e) {
Log.w(TAG, "Failed to resize stack: " + e);
}
@@ -180,7 +181,7 @@ public class WindowManagerProxy {
@Override
public void run() {
try {
- ActivityManager.getService().setSplitScreenResizing(resizing);
+ ActivityTaskManager.getService().setSplitScreenResizing(resizing);
} catch (RemoteException e) {
Log.w(TAG, "Error calling setDockedStackResizing: " + e);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 6a387971500e..acdfa293ee6c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -98,8 +98,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
= new PathInterpolator(0.6f, 0, 0.5f, 1);
private static final Interpolator ACTIVATE_INVERSE_ALPHA_INTERPOLATOR
= new PathInterpolator(0, 0, 0.5f, 1);
- private final int mTintedRippleColor;
- protected final int mNormalRippleColor;
+ private int mTintedRippleColor;
+ protected int mNormalRippleColor;
private final AccessibilityManager mAccessibilityManager;
private final DoubleTapHelper mDoubleTapHelper;
@@ -132,7 +132,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
private ValueAnimator mBackgroundColorAnimator;
private float mAppearAnimationFraction = -1.0f;
private float mAppearAnimationTranslation;
- private final int mNormalColor;
+ private int mNormalColor;
private boolean mIsBelowSpeedBump;
private FalsingManager mFalsingManager;
@@ -188,11 +188,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mSlowOutLinearInInterpolator = new PathInterpolator(0.8f, 0.0f, 1.0f, 1.0f);
setClipChildren(false);
setClipToPadding(false);
- mNormalColor = context.getColor(R.color.notification_material_background_color);
- mTintedRippleColor = context.getColor(
- R.color.notification_ripple_tinted_color);
- mNormalRippleColor = context.getColor(
- R.color.notification_ripple_untinted_color);
+ updateColors();
mFalsingManager = FalsingManager.getInstance(context);
mAccessibilityManager = AccessibilityManager.getInstance(mContext);
@@ -206,6 +202,16 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
initDimens();
}
+ private void updateColors() {
+ mNormalColor = mContext.getColor(R.color.notification_material_background_color);
+ mTintedRippleColor = mContext.getColor(
+ R.color.notification_ripple_tinted_color);
+ mNormalRippleColor = mContext.getColor(
+ R.color.notification_ripple_untinted_color);
+ mDimmedAlpha = Color.alpha(mContext.getColor(
+ R.color.notification_material_background_dimmed_color));
+ }
+
private void initDimens() {
mHeadsUpAddStartLocation = getResources().getDimensionPixelSize(
com.android.internal.R.dimen.notification_content_margin_start);
@@ -217,6 +223,12 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
initDimens();
}
+ public void onUiModeChanged() {
+ updateColors();
+ initBackground();
+ updateBackgroundTint();
+ }
+
@Override
protected void onFinishInflate() {
super.onFinishInflate();
@@ -224,8 +236,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mFakeShadow = findViewById(R.id.fake_shadow);
mShadowHidden = mFakeShadow.getVisibility() != VISIBLE;
mBackgroundDimmed = findViewById(R.id.backgroundDimmed);
- mDimmedAlpha = Color.alpha(mContext.getColor(
- R.color.notification_material_background_dimmed_color));
initBackground();
updateBackground();
updateBackgroundTint();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 6fd0aa6330f5..145a2466f7d2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -25,7 +25,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.Pair;
import com.android.internal.os.SomeArgs;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index d647e21888dd..1d3f40894399 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -24,6 +24,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.Nullable;
+import android.app.Notification;
import android.app.NotificationChannel;
import android.content.Context;
import android.content.pm.PackageInfo;
@@ -37,6 +38,7 @@ import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Build;
+import android.os.SystemClock;
import android.os.Bundle;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
@@ -63,7 +65,7 @@ import android.widget.RemoteViews;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.CachingIconView;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
@@ -108,6 +110,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private static final int COLORED_DIVIDER_ALPHA = 0x7B;
private static final int MENU_VIEW_INDEX = 0;
private static final String TAG = "ExpandableNotifRow";
+ public static final float DEFAULT_HEADER_VISIBLE_AMOUNT = 1.0f;
/**
* Listener for when {@link ExpandableNotificationRow} is laid out.
@@ -122,12 +125,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private final NotificationInflater mNotificationInflater;
private int mIconTransformContentShift;
private int mIconTransformContentShiftNoIcon;
- private int mNotificationMinHeightLegacy;
- private int mNotificationMinHeightBeforeP;
- private int mMaxHeadsUpHeightLegacy;
+ private int mMaxHeadsUpHeightBeforeN;
private int mMaxHeadsUpHeightBeforeP;
private int mMaxHeadsUpHeight;
private int mMaxHeadsUpHeightIncreased;
+ private int mNotificationMinHeightBeforeN;
+ private int mNotificationMinHeightBeforeP;
private int mNotificationMinHeight;
private int mNotificationMinHeightLarge;
private int mNotificationMaxHeight;
@@ -157,7 +160,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private boolean mSensitiveHiddenInGeneral;
private boolean mShowingPublicInitialized;
private boolean mHideSensitiveForIntrinsicHeight;
- private float mHeaderVisibleAmount = 1.0f;
+ private float mHeaderVisibleAmount = DEFAULT_HEADER_VISIBLE_AMOUNT;
/**
* Is this notification expanded by the system. The expansion state can be overridden by the
@@ -438,7 +441,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
*/
public boolean getIsNonblockable() {
boolean isNonblockable = Dependency.get(NotificationBlockingHelperManager.class)
- .isNonblockablePackage(mStatusBarNotification.getPackageName());
+ .isNonblockable(mStatusBarNotification.getPackageName(),
+ mEntry.channel.getId());
// If the SystemNotifAsyncTask hasn't finished running or retrieved a value, we'll try once
// again, but in-place on the main thread this time. This should rarely ever get called.
@@ -496,7 +500,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
StatusBarIconView expandedIcon = mEntry.expandedIcon;
boolean isPreL = Boolean.TRUE.equals(expandedIcon.getTag(R.id.icon_is_pre_L));
boolean colorize = !isPreL || NotificationUtils.isGrayscale(expandedIcon,
- NotificationColorUtil.getInstance(mContext));
+ ContrastColorUtil.getInstance(mContext));
int color = StatusBarIconView.NO_COLOR;
if (colorize) {
NotificationHeaderView header = getVisibleNotificationHeader();
@@ -543,7 +547,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
boolean beforeP = mEntry.targetSdk < Build.VERSION_CODES.P;
int minHeight;
if (customView && beforeP && !mIsSummaryWithChildren) {
- minHeight = beforeN ? mNotificationMinHeightLegacy : mNotificationMinHeightBeforeP;
+ minHeight = beforeN ? mNotificationMinHeightBeforeN : mNotificationMinHeightBeforeP;
} else if (mUseIncreasedCollapsedHeight && layout == mPrivateLayout) {
minHeight = mNotificationMinHeightLarge;
} else {
@@ -552,20 +556,20 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
boolean headsUpCustom = layout.getHeadsUpChild() != null &&
layout.getHeadsUpChild().getId()
!= com.android.internal.R.id.status_bar_latest_event_content;
- int headsUpheight;
+ int headsUpHeight;
if (headsUpCustom && beforeP) {
- headsUpheight = beforeN ? mMaxHeadsUpHeightLegacy : mMaxHeadsUpHeightBeforeP;
+ headsUpHeight = beforeN ? mMaxHeadsUpHeightBeforeN : mMaxHeadsUpHeightBeforeP;
} else if (mUseIncreasedHeadsUpHeight && layout == mPrivateLayout) {
- headsUpheight = mMaxHeadsUpHeightIncreased;
+ headsUpHeight = mMaxHeadsUpHeightIncreased;
} else {
- headsUpheight = mMaxHeadsUpHeight;
+ headsUpHeight = mMaxHeadsUpHeight;
}
NotificationViewWrapper headsUpWrapper = layout.getVisibleWrapper(
NotificationContentView.VISIBLE_TYPE_HEADSUP);
if (headsUpWrapper != null) {
- headsUpheight = Math.max(headsUpheight, headsUpWrapper.getMinLayoutHeight());
+ headsUpHeight = Math.max(headsUpHeight, headsUpWrapper.getMinLayoutHeight());
}
- layout.setHeights(minHeight, headsUpheight, mNotificationMaxHeight,
+ layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight,
mNotificationAmbientHeight);
}
@@ -991,6 +995,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
+ mEntry.setInitializationTime(SystemClock.elapsedRealtime());
Dependency.get(PluginManager.class).addPluginListener(this,
NotificationMenuRowPlugin.class, false /* Allow multiple */);
}
@@ -1049,6 +1054,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
super.onDensityOrFontScaleChanged();
initDimens();
initBackground();
+ reInflateViews();
+ }
+
+ private void reInflateViews() {
// Let's update our childrencontainer. This is intentionally not guarded with
// mIsSummaryWithChildren since we might have had children but not anymore.
if (mChildrenContainer != null) {
@@ -1075,7 +1084,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
l.initView();
l.reInflateViews();
}
- mNotificationInflater.onDensityOrFontScaleChanged();
+ mNotificationInflater.clearCachesAndReInflate();
onNotificationUpdated();
}
@@ -1086,6 +1095,17 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
}
+ @Override
+ public void onUiModeChanged() {
+ super.onUiModeChanged();
+ reInflateViews();
+ if (mChildrenContainer != null) {
+ for (ExpandableNotificationRow child : mChildrenContainer.getNotificationChildren()) {
+ child.onUiModeChanged();
+ }
+ }
+ }
+
public void setContentBackground(int customBackgroundColor, boolean animate,
NotificationContentView notificationContentView) {
if (getShowingLayout() == notificationContentView) {
@@ -1120,10 +1140,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
private void updateNotificationColor() {
- mNotificationColor = NotificationColorUtil.resolveContrastColor(mContext,
+ mNotificationColor = ContrastColorUtil.resolveContrastColor(mContext,
getStatusBarNotification().getNotification().color,
getBackgroundColorWithoutTint());
- mNotificationColorAmbient = NotificationColorUtil.resolveAmbientColor(mContext,
+ mNotificationColorAmbient = ContrastColorUtil.resolveAmbientColor(mContext,
getStatusBarNotification().getNotification().color);
}
@@ -1444,6 +1464,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
mNotificationInflater.setUsesIncreasedHeight(use);
}
+ public void setSmartActions(List<Notification.Action> smartActions) {
+ mNotificationInflater.setSmartActions(smartActions);
+ }
+
public void setUseIncreasedHeadsUpHeight(boolean use) {
mUseIncreasedHeadsUpHeight = use;
mNotificationInflater.setUsesIncreasedHeadsUpHeight(use);
@@ -1483,7 +1507,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
private void initDimens() {
- mNotificationMinHeightLegacy = NotificationUtils.getFontScaledHeight(mContext,
+ mNotificationMinHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height_legacy);
mNotificationMinHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height_before_p);
@@ -1495,7 +1519,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
R.dimen.notification_max_height);
mNotificationAmbientHeight = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_ambient_height);
- mMaxHeadsUpHeightLegacy = NotificationUtils.getFontScaledHeight(mContext,
+ mMaxHeadsUpHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_heads_up_height_legacy);
mMaxHeadsUpHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_heads_up_height_before_p);
@@ -2850,12 +2874,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
@Override
public Path getCustomClipPath(View child) {
if (child instanceof NotificationGuts) {
- return getClipPath(true, /* ignoreTranslation */
- false /* clipRoundedToBottom */);
- }
- if (child instanceof NotificationChildrenContainer) {
- return getClipPath(false, /* ignoreTranslation */
- true /* clipRoundedToBottom */);
+ return getClipPath(true /* ignoreTranslation */);
}
return super.getCustomClipPath(child);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
index edfa61b4ddc2..584b63759865 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
@@ -64,7 +64,6 @@ public abstract class ExpandableOutlineView extends ExpandableView {
protected float mOutlineRadius;
private boolean mAlwaysRoundBothCorners;
private Path mTmpPath = new Path();
- private Path mTmpPath2 = new Path();
private float mCurrentBottomRoundness;
private float mCurrentTopRoundness;
private float mBottomRoundness;
@@ -94,7 +93,7 @@ public abstract class ExpandableOutlineView extends ExpandableView {
int bottom = Math.max(getActualHeight() - mClipBottomAmount, top);
outline.setRect(left, top, right, bottom);
} else {
- Path clipPath = getClipPath();
+ Path clipPath = getClipPath(false /* ignoreTranslation */);
if (clipPath != null && clipPath.isConvex()) {
// The path might not be convex in border cases where the view is small and
// clipped
@@ -105,36 +104,23 @@ public abstract class ExpandableOutlineView extends ExpandableView {
}
};
- private Path getClipPath() {
- return getClipPath(false, /* ignoreTranslation */
- false /* clipRoundedToBottom */);
- }
-
- protected Path getClipPath(boolean ignoreTranslation, boolean clipRoundedToBottom) {
+ protected Path getClipPath(boolean ignoreTranslation) {
int left;
int top;
int right;
int bottom;
int height;
- Path intersectPath = null;
+ float topRoundness = mAlwaysRoundBothCorners
+ ? mOutlineRadius : getCurrentBackgroundRadiusTop();
if (!mCustomOutline) {
int translation = mShouldTranslateContents && !ignoreTranslation
? (int) getTranslation() : 0;
left = Math.max(translation, 0);
top = mClipTopAmount + mBackgroundTop;
right = getWidth() + Math.min(translation, 0);
- bottom = Math.max(getActualHeight(), top);
- int intersectBottom = Math.max(getActualHeight() - mClipBottomAmount, top);
- if (bottom != intersectBottom) {
- if (clipRoundedToBottom) {
- bottom = intersectBottom;
- } else {
- getRoundedRectPath(left, top, right,
- intersectBottom, 0.0f,
- 0.0f, mTmpPath2);
- intersectPath = mTmpPath2;
- }
- }
+ // If the top is rounded we want the bottom to be at most at the top roundness, in order
+ // to avoid the shadow changing when scrolling up.
+ bottom = Math.max(getActualHeight() - mClipBottomAmount, (int) (top + topRoundness));
} else {
left = mOutlineRect.left;
top = mOutlineRect.top;
@@ -145,8 +131,6 @@ public abstract class ExpandableOutlineView extends ExpandableView {
if (height == 0) {
return EMPTY_PATH;
}
- float topRoundness = mAlwaysRoundBothCorners
- ? mOutlineRadius : getCurrentBackgroundRadiusTop();
float bottomRoundness = mAlwaysRoundBothCorners
? mOutlineRadius : getCurrentBackgroundRadiusBottom();
if (topRoundness + bottomRoundness > height) {
@@ -158,11 +142,7 @@ public abstract class ExpandableOutlineView extends ExpandableView {
}
getRoundedRectPath(left, top, right, bottom, topRoundness,
bottomRoundness, mTmpPath);
- Path roundedRectPath = mTmpPath;
- if (intersectPath != null) {
- roundedRectPath.op(intersectPath, Path.Op.INTERSECT);
- }
- return roundedRectPath;
+ return mTmpPath;
}
public static void getRoundedRectPath(int left, int top, int right, int bottom,
@@ -219,7 +199,7 @@ public abstract class ExpandableOutlineView extends ExpandableView {
if (childNeedsClipping(child)) {
Path clipPath = getCustomClipPath(child);
if (clipPath == null) {
- clipPath = getClipPath();
+ clipPath = getClipPath(false /* ignoreTranslation */);
}
if (clipPath != null) {
if (intersectPath != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
index 39485c3c8800..ac289d7d6262 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java
@@ -21,6 +21,8 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.Display;
import android.view.DisplayCutout;
@@ -38,6 +40,12 @@ import java.util.List;
* The view in the statusBar that contains part of the heads-up information
*/
public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {
+ private static final String HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE =
+ "heads_up_status_bar_view_super_parcelable";
+ private static final String FIRST_LAYOUT = "first_layout";
+ private static final String PUBLIC_MODE = "public_mode";
+ private static final String VISIBILITY = "visibility";
+ private static final String ALPHA = "alpha";
private int mAbsoluteStartPadding;
private int mEndMargin;
private View mIconPlaceholder;
@@ -107,6 +115,39 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {
updateMaxWidth();
}
+ @Override
+ public Bundle onSaveInstanceState() {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE,
+ super.onSaveInstanceState());
+ bundle.putBoolean(FIRST_LAYOUT, mFirstLayout);
+ bundle.putBoolean(PUBLIC_MODE, mPublicMode);
+ bundle.putInt(VISIBILITY, getVisibility());
+ bundle.putFloat(ALPHA, getAlpha());
+
+ return bundle;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ if (state == null || !(state instanceof Bundle)) {
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ Bundle bundle = (Bundle) state;
+ Parcelable superState = bundle.getParcelable(HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE);
+ super.onRestoreInstanceState(superState);
+ mFirstLayout = bundle.getBoolean(FIRST_LAYOUT, true);
+ mPublicMode = bundle.getBoolean(PUBLIC_MODE, false);
+ if (bundle.containsKey(VISIBILITY)) {
+ setVisibility(bundle.getInt(VISIBILITY));
+ }
+ if (bundle.containsKey(ALPHA)) {
+ setAlpha(bundle.getFloat(ALPHA));
+ }
+ }
+
@VisibleForTesting
public HeadsUpStatusBarView(Context context, View iconPlaceholder, TextView textView) {
this(context);
@@ -178,11 +219,7 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {
* @param translationX how to translate the horizontal position
*/
public void setPanelTranslation(float translationX) {
- if (isLayoutRtl()) {
- setTranslationX(translationX + mCutOutInset);
- } else {
- setTranslationX(translationX - mCutOutInset);
- }
+ setTranslationX(translationX);
updateDrawingRect();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
index 2d16d2209c9e..247e3d342bbb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java
@@ -29,6 +29,7 @@ import android.content.Intent;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
+import android.content.res.ColorStateList;
import android.graphics.drawable.Icon;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -609,9 +610,8 @@ public final class KeyboardShortcuts {
TextView categoryTitle = (TextView) inflater.inflate(
R.layout.keyboard_shortcuts_category_title, keyboardShortcutsLayout, false);
categoryTitle.setText(group.getLabel());
- categoryTitle.setTextColor(group.isSystemGroup()
- ? Utils.getColorAccent(mContext)
- : mContext.getColor(R.color.ksh_application_group_color));
+ categoryTitle.setTextColor(group.isSystemGroup() ? Utils.getColorAccent(mContext) :
+ ColorStateList.valueOf(mContext.getColor(R.color.ksh_application_group_color)));
keyboardShortcutsLayout.addView(categoryTitle);
LinearLayout shortcutContainer = (LinearLayout) inflater.inflate(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 795140ea9d04..551e8a9dcb81 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -19,12 +19,15 @@ package com.android.systemui.statusbar;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.admin.DevicePolicyManager;
+import android.hardware.biometrics.BiometricSourceType;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
+import android.content.res.ColorStateList;
import android.graphics.Color;
+import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
import android.os.BatteryManager;
import android.os.BatteryStats;
@@ -69,8 +72,8 @@ public class KeyguardIndicationController {
private static final boolean DEBUG_CHARGING_SPEED = false;
private static final int MSG_HIDE_TRANSIENT = 1;
- private static final int MSG_CLEAR_FP_MSG = 2;
- private static final long TRANSIENT_FP_ERROR_TIMEOUT = 1300;
+ private static final int MSG_CLEAR_BIOMETRIC_MSG = 2;
+ private static final long TRANSIENT_BIOMETRIC_ERROR_TIMEOUT = 1300;
private final Context mContext;
private ViewGroup mIndicationArea;
@@ -87,8 +90,8 @@ public class KeyguardIndicationController {
private String mRestingIndication;
private CharSequence mTransientIndication;
- private int mTransientTextColor;
- private int mInitialTextColor;
+ private ColorStateList mTransientTextColorState;
+ private ColorStateList mInitialTextColorState;
private boolean mVisible;
private boolean mPowerPluggedIn;
@@ -124,7 +127,8 @@ public class KeyguardIndicationController {
mContext = context;
mIndicationArea = indicationArea;
mTextView = indicationArea.findViewById(R.id.keyguard_indication_text);
- mInitialTextColor = mTextView != null ? mTextView.getCurrentTextColor() : Color.WHITE;
+ mInitialTextColorState = mTextView != null ?
+ mTextView.getTextColors() : ColorStateList.valueOf(Color.WHITE);
mDisclosure = indicationArea.findViewById(R.id.keyguard_indication_enterprise_disclosure);
mLockIcon = lockIcon;
mWakeLock = new SettableWakeLock(wakeLock);
@@ -255,15 +259,16 @@ public class KeyguardIndicationController {
* Shows {@param transientIndication} until it is hidden by {@link #hideTransientIndication}.
*/
public void showTransientIndication(CharSequence transientIndication) {
- showTransientIndication(transientIndication, mInitialTextColor);
+ showTransientIndication(transientIndication, mInitialTextColorState);
}
/**
* Shows {@param transientIndication} until it is hidden by {@link #hideTransientIndication}.
*/
- public void showTransientIndication(CharSequence transientIndication, int textColor) {
+ public void showTransientIndication(CharSequence transientIndication,
+ ColorStateList textColorState) {
mTransientIndication = transientIndication;
- mTransientTextColor = textColor;
+ mTransientTextColorState = textColorState;
mHandler.removeMessages(MSG_HIDE_TRANSIENT);
if (mDozing && !TextUtils.isEmpty(mTransientIndication)) {
// Make sure this doesn't get stuck and burns in. Acquire wakelock until its cleared.
@@ -320,20 +325,20 @@ public class KeyguardIndicationController {
String trustManagedIndication = getTrustManagedIndication();
if (!mUserManager.isUserUnlocked(userId)) {
mTextView.switchIndication(com.android.internal.R.string.lockscreen_storage_locked);
- mTextView.setTextColor(mInitialTextColor);
+ mTextView.setTextColor(mInitialTextColorState);
} else if (!TextUtils.isEmpty(mTransientIndication)) {
mTextView.switchIndication(mTransientIndication);
- mTextView.setTextColor(mTransientTextColor);
+ mTextView.setTextColor(mTransientTextColorState);
} else if (!TextUtils.isEmpty(trustGrantedIndication)
&& updateMonitor.getUserHasTrust(userId)) {
mTextView.switchIndication(trustGrantedIndication);
- mTextView.setTextColor(mInitialTextColor);
+ mTextView.setTextColor(mInitialTextColorState);
} else if (mPowerPluggedIn) {
String indication = computePowerIndication();
if (DEBUG_CHARGING_SPEED) {
indication += ", " + (mChargingWattage / 1000) + " mW";
}
- mTextView.setTextColor(mInitialTextColor);
+ mTextView.setTextColor(mInitialTextColorState);
if (animate) {
animateText(mTextView, indication);
} else {
@@ -343,10 +348,10 @@ public class KeyguardIndicationController {
&& updateMonitor.getUserTrustIsManaged(userId)
&& !updateMonitor.getUserHasTrust(userId)) {
mTextView.switchIndication(trustManagedIndication);
- mTextView.setTextColor(mInitialTextColor);
+ mTextView.setTextColor(mInitialTextColorState);
} else {
mTextView.switchIndication(mRestingIndication);
- mTextView.setTextColor(mInitialTextColor);
+ mTextView.setTextColor(mInitialTextColorState);
}
}
}
@@ -359,22 +364,41 @@ public class KeyguardIndicationController {
R.integer.wired_charging_keyguard_text_animation_duration_up);
int animateDownDuration = mContext.getResources().getInteger(
R.integer.wired_charging_keyguard_text_animation_duration_down);
+ textView.animate().cancel();
+ float translation = textView.getTranslationY();
textView.animate()
.translationYBy(yTranslation)
.setInterpolator(Interpolators.LINEAR)
.setDuration(animateUpDuration)
.setListener(new AnimatorListenerAdapter() {
+ private boolean mCancelled;
+
@Override
public void onAnimationStart(Animator animation) {
textView.switchIndication(indication);
}
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ textView.setTranslationY(translation);
+ mCancelled = true;
+ }
+
@Override
public void onAnimationEnd(Animator animation) {
+ if (mCancelled) {
+ return;
+ }
textView.animate()
.setDuration(animateDownDuration)
.setInterpolator(Interpolators.BOUNCE)
- .translationYBy(-1 * yTranslation)
- .setListener(null);
+ .translationY(translation)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ textView.setTranslationY(translation);
+ }
+ });
}
});
}
@@ -458,7 +482,7 @@ public class KeyguardIndicationController {
public void handleMessage(Message msg) {
if (msg.what == MSG_HIDE_TRANSIENT) {
hideTransientIndication();
- } else if (msg.what == MSG_CLEAR_FP_MSG) {
+ } else if (msg.what == MSG_CLEAR_BIOMETRIC_MSG) {
mLockIcon.setTransientFpError(false);
}
}
@@ -475,8 +499,8 @@ public class KeyguardIndicationController {
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("KeyguardIndicationController:");
- pw.println(" mTransientTextColor: " + Integer.toHexString(mTransientTextColor));
- pw.println(" mInitialTextColor: " + Integer.toHexString(mInitialTextColor));
+ pw.println(" mTransientTextColorState: " + mTransientTextColorState);
+ pw.println(" mInitialTextColorState: " + mInitialTextColorState);
pw.println(" mPowerPluggedInWired: " + mPowerPluggedInWired);
pw.println(" mPowerPluggedIn: " + mPowerPluggedIn);
pw.println(" mPowerCharged: " + mPowerCharged);
@@ -523,21 +547,23 @@ public class KeyguardIndicationController {
}
@Override
- public void onFingerprintHelp(int msgId, String helpString) {
+ public void onBiometricHelp(int msgId, String helpString,
+ BiometricSourceType biometricSourceType) {
KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
- if (!updateMonitor.isUnlockingWithFingerprintAllowed()) {
+ if (!updateMonitor.isUnlockingWithBiometricAllowed()) {
return;
}
- int errorColor = Utils.getColorError(mContext);
+ ColorStateList errorColorState = Utils.getColorError(mContext);
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
- mStatusBarKeyguardViewManager.showBouncerMessage(helpString, errorColor);
+ mStatusBarKeyguardViewManager.showBouncerMessage(helpString,
+ errorColorState);
} else if (updateMonitor.isScreenOn()) {
mLockIcon.setTransientFpError(true);
- showTransientIndication(helpString, errorColor);
- hideTransientIndicationDelayed(TRANSIENT_FP_ERROR_TIMEOUT);
- mHandler.removeMessages(MSG_CLEAR_FP_MSG);
- mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_FP_MSG),
- TRANSIENT_FP_ERROR_TIMEOUT);
+ showTransientIndication(helpString, errorColorState);
+ hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT);
+ mHandler.removeMessages(MSG_CLEAR_BIOMETRIC_MSG);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEAR_BIOMETRIC_MSG),
+ TRANSIENT_BIOMETRIC_ERROR_TIMEOUT);
}
// Help messages indicate that there was actually a try since the last error, so those
// are not two successive error messages anymore.
@@ -545,24 +571,24 @@ public class KeyguardIndicationController {
}
@Override
- public void onFingerprintError(int msgId, String errString) {
+ public void onBiometricError(int msgId, String errString,
+ BiometricSourceType biometricSourceType) {
KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
- if ((!updateMonitor.isUnlockingWithFingerprintAllowed()
- && msgId != FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT)
- || msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
+ if (shouldSuppressBiometricError(msgId, biometricSourceType, updateMonitor)) {
return;
}
- int errorColor = Utils.getColorError(mContext);
+ ColorStateList errorColorState = Utils.getColorError(mContext);
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
- // When swiping up right after receiving a fingerprint error, the bouncer calls
+ // When swiping up right after receiving a biometric error, the bouncer calls
// authenticate leading to the same message being shown again on the bouncer.
// We want to avoid this, as it may confuse the user when the message is too
// generic.
if (mLastSuccessiveErrorMessage != msgId) {
- mStatusBarKeyguardViewManager.showBouncerMessage(errString, errorColor);
+ mStatusBarKeyguardViewManager.showBouncerMessage(errString,
+ errorColorState);
}
} else if (updateMonitor.isScreenOn()) {
- showTransientIndication(errString, errorColor);
+ showTransientIndication(errString, errorColorState);
// We want to keep this message around in case the screen was off
hideTransientIndicationDelayed(HIDE_DELAY_MS);
} else {
@@ -571,17 +597,37 @@ public class KeyguardIndicationController {
mLastSuccessiveErrorMessage = msgId;
}
+ private boolean shouldSuppressBiometricError(int msgId,
+ BiometricSourceType biometricSourceType, KeyguardUpdateMonitor updateMonitor) {
+ if (biometricSourceType == BiometricSourceType.FINGERPRINT)
+ return shouldSuppressFingerprintError(msgId, updateMonitor);
+ if (biometricSourceType == BiometricSourceType.FACE)
+ return shouldSuppressFaceError(msgId, updateMonitor);
+ return false;
+ }
+
+ private boolean shouldSuppressFingerprintError(int msgId,
+ KeyguardUpdateMonitor updateMonitor) {
+ return ((!updateMonitor.isUnlockingWithBiometricAllowed()
+ && msgId != FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT)
+ || msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED);
+ }
+
+ private boolean shouldSuppressFaceError(int msgId, KeyguardUpdateMonitor updateMonitor) {
+ return ((!updateMonitor.isUnlockingWithBiometricAllowed()
+ && msgId != FaceManager.FACE_ERROR_LOCKOUT_PERMANENT)
+ || msgId == FaceManager.FACE_ERROR_CANCELED);
+ }
+
@Override
public void onTrustAgentErrorMessage(CharSequence message) {
- int errorColor = Utils.getColorError(mContext);
- showTransientIndication(message, errorColor);
+ showTransientIndication(message, Utils.getColorError(mContext));
}
@Override
public void onScreenTurnedOn() {
if (mMessageToShowOnScreenOn != null) {
- int errorColor = Utils.getColorError(mContext);
- showTransientIndication(mMessageToShowOnScreenOn, errorColor);
+ showTransientIndication(mMessageToShowOnScreenOn, Utils.getColorError(mContext));
// We want to keep this message around in case the screen was off
hideTransientIndicationDelayed(HIDE_DELAY_MS);
mMessageToShowOnScreenOn = null;
@@ -589,21 +635,22 @@ public class KeyguardIndicationController {
}
@Override
- public void onFingerprintRunningStateChanged(boolean running) {
+ public void onBiometricRunningStateChanged(boolean running,
+ BiometricSourceType biometricSourceType) {
if (running) {
mMessageToShowOnScreenOn = null;
}
}
@Override
- public void onFingerprintAuthenticated(int userId) {
- super.onFingerprintAuthenticated(userId);
+ public void onBiometricAuthenticated(int userId, BiometricSourceType biometricSourceType) {
+ super.onBiometricAuthenticated(userId, biometricSourceType);
mLastSuccessiveErrorMessage = -1;
}
@Override
- public void onFingerprintAuthFailed() {
- super.onFingerprintAuthFailed();
+ public void onBiometricAuthFailed(BiometricSourceType biometricSourceType) {
+ super.onBiometricAuthFailed(biometricSourceType);
mLastSuccessiveErrorMessage = -1;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBlockingHelperManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBlockingHelperManager.java
index 1b613cbcaa41..c78ab8db2ff7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBlockingHelperManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBlockingHelperManager.java
@@ -20,7 +20,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.Log;
import com.android.internal.logging.MetricsLogger;
@@ -144,8 +144,15 @@ public class NotificationBlockingHelperManager {
/**
* Returns whether the given package name is in the list of non-blockable packages.
*/
- public boolean isNonblockablePackage(String packageName) {
- return mNonBlockablePkgs.contains(packageName);
+ public boolean isNonblockable(String packageName, String channelName) {
+ return mNonBlockablePkgs.contains(packageName)
+ || mNonBlockablePkgs.contains(makeChannelKey(packageName, channelName));
+ }
+
+ // Format must stay in sync with frameworks/base/core/res/res/values/config.xml
+ // config_nonBlockableNotificationPackages
+ private String makeChannelKey(String pkg, String channel) {
+ return pkg + ":" + channel;
}
@VisibleForTesting
@@ -157,4 +164,10 @@ public class NotificationBlockingHelperManager {
void setBlockingHelperRowForTest(ExpandableNotificationRow blockingHelperRowForTest) {
mBlockingHelperRow = blockingHelperRowForTest;
}
+
+ @VisibleForTesting
+ void setNonBlockablePkgs(String[] pkgsAndChannels) {
+ mNonBlockablePkgs = new HashSet<>();
+ Collections.addAll(mNonBlockablePkgs, pkgsAndChannels);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index 70dad198a5a8..a90ddf0a1b16 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -36,7 +36,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.HybridGroupManager;
@@ -1323,7 +1323,7 @@ public class NotificationContentView extends FrameLayout {
if (color == Notification.COLOR_DEFAULT) {
color = mContext.getColor(R.color.default_remote_input_background);
}
- existing.setBackgroundColor(NotificationColorUtil.ensureTextBackgroundColor(color,
+ existing.setBackgroundColor(ContrastColorUtil.ensureTextBackgroundColor(color,
mContext.getColor(R.color.remote_input_text_enabled),
mContext.getColor(R.color.remote_input_hint)));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 872f33a537a2..93433da9574b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -28,6 +28,7 @@ import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
import android.Manifest;
+import android.annotation.NonNull;
import android.app.AppGlobals;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -51,10 +52,12 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.RemoteViews;
+import androidx.annotation.Nullable;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Dependency;
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.statusbar.notification.InflationException;
@@ -84,6 +87,7 @@ public class NotificationData {
public static final class Entry {
private static final long LAUNCH_COOLDOWN = 2000;
private static final long REMOTE_INPUT_COOLDOWN = 500;
+ private static final long INITIALIZATION_DELAY = 400;
private static final long NOT_LAUNCHED_YET = -LAUNCH_COOLDOWN;
private static final int COLOR_INVALID = 1;
public String key;
@@ -104,6 +108,8 @@ public class NotificationData {
public CharSequence remoteInputText;
public List<SnoozeCriterion> snoozeCriteria;
public int userSentiment = Ranking.USER_SENTIMENT_NEUTRAL;
+ @NonNull
+ public List<Notification.Action> smartActions = Collections.emptyList();
private int mCachedContrastColor = COLOR_INVALID;
private int mCachedContrastColorIsFor = COLOR_INVALID;
@@ -114,6 +120,9 @@ public class NotificationData {
public ArraySet<Integer> mActiveAppOps = new ArraySet<>(3);
public CharSequence headsUpStatusBarText;
public CharSequence headsUpStatusBarTextPublic;
+
+ private long initializationTime = -1;
+
/**
* Whether or not this row represents a system notification. Note that if this is
* {@code null}, that means we were either unable to retrieve the info or have yet to
@@ -127,8 +136,23 @@ public class NotificationData {
private boolean hasSentReply;
public Entry(StatusBarNotification n) {
+ this(n, null);
+ }
+
+ public Entry(StatusBarNotification n, @Nullable Ranking ranking) {
this.key = n.getKey();
this.notification = n;
+ if (ranking != null) {
+ populateFromRanking(ranking);
+ }
+ }
+
+ public void populateFromRanking(@NonNull Ranking ranking) {
+ channel = ranking.getChannel();
+ snoozeCriteria = ranking.getSnoozeCriteria();
+ userSentiment = ranking.getUserSentiment();
+ smartActions = ranking.getSmartActions() == null
+ ? Collections.emptyList() : ranking.getSmartActions();
}
public void setInterruption() {
@@ -169,6 +193,11 @@ public class NotificationData {
return SystemClock.elapsedRealtime() < lastRemoteInputSent + REMOTE_INPUT_COOLDOWN;
}
+ public boolean hasFinishedInitialization() {
+ return initializationTime == -1 ||
+ SystemClock.elapsedRealtime() > initializationTime + INITIALIZATION_DELAY;
+ }
+
/**
* Create the icons for a notification
* @param context the context to create the icons with
@@ -223,6 +252,7 @@ public class NotificationData {
/**
* Update the notification icons.
+ *
* @param context the context to create the icons with.
* @param sbn the notification to read the icon from.
* @throws InflationException
@@ -254,7 +284,7 @@ public class NotificationData {
if (mCachedContrastColorIsFor == rawColor && mCachedContrastColor != COLOR_INVALID) {
return mCachedContrastColor;
}
- final int contrasted = NotificationColorUtil.resolveContrastColor(context, rawColor,
+ final int contrasted = ContrastColorUtil.resolveContrastColor(context, rawColor,
backgroundColor);
mCachedContrastColorIsFor = rawColor;
mCachedContrastColor = contrasted;
@@ -282,7 +312,7 @@ public class NotificationData {
}
public void onInflationTaskFinished() {
- mRunningTask = null;
+ mRunningTask = null;
}
@VisibleForTesting
@@ -341,6 +371,12 @@ public class NotificationData {
}
return false;
}
+
+ public void setInitializationTime(long time) {
+ if (initializationTime == -1) {
+ initializationTime = time;
+ }
+ }
}
private final ArrayMap<String, Entry> mEntries = new ArrayMap<>();
@@ -592,7 +628,7 @@ public class NotificationData {
getRanking(key, mTmpRanking);
return mTmpRanking.getOverrideGroupKey();
}
- return null;
+ return null;
}
public List<SnoozeCriterion> getSnoozeCriteria(String key) {
@@ -643,9 +679,7 @@ public class NotificationData {
entry.notification.setOverrideGroupKey(overrideGroupKey);
mGroupManager.onEntryUpdated(entry, oldSbn);
}
- entry.channel = getChannel(entry.key);
- entry.snoozeCriteria = getSnoozeCriteria(entry.key);
- entry.userSentiment = mTmpRanking.getUserSentiment();
+ entry.populateFromRanking(mTmpRanking);
}
}
}
@@ -818,6 +852,7 @@ public class NotificationData {
public boolean isNotificationForCurrentProfiles(StatusBarNotification sbn);
public String getCurrentMediaNotificationKey();
public NotificationGroupManager getGroupManager();
+
/**
* @return true iff the device is dozing
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
index 06f26c9cbc7c..bf0792923a22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
@@ -19,6 +19,7 @@ import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENAB
import static com.android.systemui.statusbar.NotificationRemoteInputManager
.FORCE_REMOTE_INPUT_HISTORY;
+import android.annotation.Nullable;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -37,6 +38,7 @@ import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationStats;
import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.EventLog;
import android.util.Log;
@@ -726,10 +728,10 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
&& !mPresenter.isPresenterFullyCollapsed();
row.setUseIncreasedCollapsedHeight(useIncreasedCollapsedHeight);
row.setUseIncreasedHeadsUpHeight(useIncreasedHeadsUp);
+ row.setSmartActions(entry.smartActions);
row.updateNotification(entry);
}
-
protected void addNotificationViews(NotificationData.Entry entry) {
if (entry == null) {
return;
@@ -740,12 +742,13 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
updateNotifications();
}
- protected NotificationData.Entry createNotificationViews(StatusBarNotification sbn)
+ protected NotificationData.Entry createNotificationViews(
+ StatusBarNotification sbn, NotificationListenerService.Ranking ranking)
throws InflationException {
if (DEBUG) {
- Log.d(TAG, "createNotificationViews(notification=" + sbn);
+ Log.d(TAG, "createNotificationViews(notification=" + sbn + " " + ranking);
}
- NotificationData.Entry entry = new NotificationData.Entry(sbn);
+ NotificationData.Entry entry = new NotificationData.Entry(sbn, ranking);
Dependency.get(LeakDetector.class).trackInstance(entry);
entry.createIcons(mContext, sbn);
// Construct the expanded view.
@@ -754,12 +757,14 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
}
private void addNotificationInternal(StatusBarNotification notification,
- NotificationListenerService.RankingMap ranking) throws InflationException {
+ NotificationListenerService.RankingMap rankingMap) throws InflationException {
String key = notification.getKey();
if (DEBUG) Log.d(TAG, "addNotification key=" + key);
- mNotificationData.updateRanking(ranking);
- NotificationData.Entry shadeEntry = createNotificationViews(notification);
+ mNotificationData.updateRanking(rankingMap);
+ NotificationListenerService.Ranking ranking = new NotificationListenerService.Ranking();
+ rankingMap.getRanking(key, ranking);
+ NotificationData.Entry shadeEntry = createNotificationViews(notification, ranking);
boolean isHeadsUped = shouldPeek(shadeEntry);
if (!isHeadsUped && notification.getNotification().fullScreenIntent != null) {
if (shouldSuppressFullScreenIntent(shadeEntry)) {
@@ -905,11 +910,57 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
mPresenter.updateNotificationViews();
}
- public void updateNotificationRanking(NotificationListenerService.RankingMap ranking) {
- mNotificationData.updateRanking(ranking);
+ public void updateNotificationRanking(NotificationListenerService.RankingMap rankingMap) {
+ List<NotificationData.Entry> entries = new ArrayList<>();
+ entries.addAll(mNotificationData.getActiveNotifications());
+ entries.addAll(mPendingNotifications.values());
+
+ // Has a copy of the current UI adjustments.
+ ArrayMap<String, NotificationUiAdjustment> oldAdjustments = new ArrayMap<>();
+ for (NotificationData.Entry entry : entries) {
+ NotificationUiAdjustment adjustment =
+ NotificationUiAdjustment.extractFromNotificationEntry(entry);
+ oldAdjustments.put(entry.key, adjustment);
+ }
+
+ // Populate notification entries from the new rankings.
+ mNotificationData.updateRanking(rankingMap);
+ updateRankingOfPendingNotifications(rankingMap);
+
+ // By comparing the old and new UI adjustments, reinflate the view accordingly.
+ for (NotificationData.Entry entry : entries) {
+ NotificationUiAdjustment newAdjustment =
+ NotificationUiAdjustment.extractFromNotificationEntry(entry);
+
+ if (NotificationUiAdjustment.needReinflate(
+ oldAdjustments.get(entry.key), newAdjustment)) {
+ if (entry.row != null) {
+ entry.reset();
+ PackageManager pmUser = StatusBar.getPackageManagerForUser(mContext,
+ entry.notification.getUser().getIdentifier());
+ updateNotification(entry, pmUser, entry.notification, entry.row);
+ } else {
+ // Once the RowInflaterTask is done, it will pick up the updated entry, so
+ // no-op here.
+ }
+ }
+ }
+
updateNotifications();
}
+ private void updateRankingOfPendingNotifications(
+ @Nullable NotificationListenerService.RankingMap rankingMap) {
+ if (rankingMap == null) {
+ return;
+ }
+ NotificationListenerService.Ranking tmpRanking = new NotificationListenerService.Ranking();
+ for (NotificationData.Entry pendingNotification : mPendingNotifications.values()) {
+ rankingMap.getRanking(pendingNotification.key, tmpRanking);
+ pendingNotification.populateFromRanking(tmpRanking);
+ }
+ }
+
protected boolean shouldPeek(NotificationData.Entry entry) {
return shouldPeek(entry, entry.notification);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
index cfd5d83c87b9..4a8f4bbfff03 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java
@@ -23,7 +23,7 @@ import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Handler;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
index 8d7668ad6f66..91a381fe13b0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
@@ -33,7 +33,7 @@ import android.os.ServiceManager;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.ArraySet;
import android.util.Log;
import android.view.HapticFeedbackConstants;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
index 886d6f17fedb..e013ae723c22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar;
import android.app.Notification;
+import android.content.res.Configuration;
import android.graphics.PorterDuff;
import android.graphics.drawable.Icon;
import android.text.TextUtils;
@@ -25,6 +26,8 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
+import com.android.internal.util.ContrastColorUtil;
+
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -74,8 +77,11 @@ public class NotificationHeaderUtil {
imageView.getDrawable().mutate();
if (shouldApply) {
// lets gray it out
- int grey = view.getContext().getColor(
- com.android.internal.R.color.notification_default_color_light);
+ Configuration config = view.getContext().getResources().getConfiguration();
+ boolean inNightMode = (config.uiMode & Configuration.UI_MODE_NIGHT_MASK)
+ == Configuration.UI_MODE_NIGHT_YES;
+ int grey = ContrastColorUtil.resolveColor(view.getContext(),
+ Notification.COLOR_DEFAULT, inNightMode);
imageView.getDrawable().setColorFilter(grey, PorterDuff.Mode.SRC_ATOP);
} else {
// lets reset it
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index e52829a088e1..bd40686da012 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -416,6 +416,12 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
}
});
mExpandAnimation.start();
+
+ // Since we're swapping/update the content, reset the timeout so the UI can't close
+ // immediately after the update.
+ if (mGutsContainer != null) {
+ mGutsContainer.resetFalsingCheck();
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
index 1287ced8594c..2f62d595d19e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.Notification;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
@@ -108,16 +109,6 @@ public class NotificationLockscreenUserManager implements Dumpable {
} else if (Intent.ACTION_USER_UNLOCKED.equals(action)) {
// Start the overview connection to the launcher service
Dependency.get(OverviewProxyService.class).startConnectionToCurrentUser();
- } else if (Intent.ACTION_USER_PRESENT.equals(action)) {
- try {
- final int lastResumedActivityUserId =
- ActivityManager.getService().getLastResumedActivityUserId();
- if (mUserManager.isManagedProfile(lastResumedActivityUserId)) {
- showForegroundManagedProfileActivityToast();
- }
- } catch (RemoteException e) {
- // Abandon hope activity manager not running.
- }
} else if (NOTIFICATION_UNLOCKED_BY_WORK_CHALLENGE_ACTION.equals(action)) {
final IntentSender intentSender = intent.getParcelableExtra(Intent.EXTRA_INTENT);
final String notificationKey = intent.getStringExtra(Intent.EXTRA_INDEX);
@@ -224,7 +215,6 @@ public class NotificationLockscreenUserManager implements Dumpable {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(Intent.ACTION_USER_ADDED);
- filter.addAction(Intent.ACTION_USER_PRESENT);
filter.addAction(Intent.ACTION_USER_UNLOCKED);
mContext.registerReceiver(mBaseBroadcastReceiver, filter);
@@ -237,19 +227,6 @@ public class NotificationLockscreenUserManager implements Dumpable {
mSettingsObserver.onChange(false); // set up
}
- private void showForegroundManagedProfileActivityToast() {
- Toast toast = Toast.makeText(mContext,
- R.string.managed_profile_foreground_toast,
- Toast.LENGTH_SHORT);
- TextView text = toast.getView().findViewById(android.R.id.message);
- text.setCompoundDrawablesRelativeWithIntrinsicBounds(
- R.drawable.stat_sys_managed_profile_status, 0, 0, 0);
- int paddingPx = mContext.getResources().getDimensionPixelSize(
- R.dimen.managed_profile_toast_padding);
- text.setCompoundDrawablePadding(paddingPx);
- toast.show();
- }
-
public boolean shouldShowLockscreenNotifications() {
return mShowLockscreenNotifications;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
index d84d3dca527d..b3ab1093f5dc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
@@ -256,10 +256,14 @@ public class NotificationSnooze extends LinearLayout
int count = showInHours ? (minutes / 60) : minutes;
String description = res.getQuantityString(pluralResId, count, count);
String resultText = String.format(res.getString(R.string.snoozed_for_time), description);
+ AccessibilityAction action = new AccessibilityAction(accessibilityActionId, description);
+ final int index = resultText.indexOf(description);
+ if (index == -1) {
+ return new NotificationSnoozeOption(null, minutes, description, resultText, action);
+ }
SpannableString string = new SpannableString(resultText);
string.setSpan(new StyleSpan(Typeface.BOLD),
- resultText.length() - description.length(), resultText.length(), 0 /* flags */);
- AccessibilityAction action = new AccessibilityAction(accessibilityActionId, description);
+ index, index + description.length(), 0 /* flags */);
return new NotificationSnoozeOption(null, minutes, description, string,
action);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java
new file mode 100644
index 000000000000..e6bdb2631912
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUiAdjustment.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.Notification;
+import android.app.RemoteInput;
+import android.graphics.drawable.Icon;
+import android.text.TextUtils;
+
+import androidx.annotation.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * By diffing two entries, determines is view reinflation needed.
+ */
+public class NotificationUiAdjustment {
+
+ public final String key;
+ public final List<Notification.Action> smartActions;
+
+ @VisibleForTesting
+ NotificationUiAdjustment(String key, List<Notification.Action> smartActions) {
+ this.key = key;
+ this.smartActions = smartActions == null
+ ? Collections.emptyList()
+ : new ArrayList<>(smartActions);
+ }
+
+ public static NotificationUiAdjustment extractFromNotificationEntry(
+ NotificationData.Entry entry) {
+ return new NotificationUiAdjustment(entry.key, entry.smartActions);
+ }
+
+ public static boolean needReinflate(
+ @NonNull NotificationUiAdjustment oldAdjustment,
+ @NonNull NotificationUiAdjustment newAdjustment) {
+ if (oldAdjustment == newAdjustment) {
+ return false;
+ }
+ return areDifferent(oldAdjustment.smartActions, newAdjustment.smartActions);
+ }
+
+ public static boolean areDifferent(
+ @NonNull List<Notification.Action> first, @NonNull List<Notification.Action> second) {
+ if (first == second) {
+ return false;
+ }
+ if (first == null || second == null) {
+ return true;
+ }
+ if (first.size() != second.size()) {
+ return true;
+ }
+ for (int i = 0; i < first.size(); i++) {
+ Notification.Action firstAction = first.get(i);
+ Notification.Action secondAction = second.get(i);
+
+ if (!TextUtils.equals(firstAction.title, secondAction.title)) {
+ return true;
+ }
+
+ if (areDifferent(firstAction.getIcon(), secondAction.getIcon())) {
+ return true;
+ }
+
+ if (!Objects.equals(firstAction.actionIntent, secondAction.actionIntent)) {
+ return true;
+ }
+
+ if (areDifferent(firstAction.getRemoteInputs(), secondAction.getRemoteInputs())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static boolean areDifferent(@Nullable Icon first, @Nullable Icon second) {
+ if (first == second) {
+ return false;
+ }
+ if (first == null || second == null) {
+ return true;
+ }
+ return !first.sameAs(second);
+ }
+
+ private static boolean areDifferent(
+ @Nullable RemoteInput[] first, @Nullable RemoteInput[] second) {
+ if (first == second) {
+ return false;
+ }
+ if (first == null || second == null) {
+ return true;
+ }
+ if (first.length != second.length) {
+ return true;
+ }
+ for (int i = 0; i < first.length; i++) {
+ RemoteInput firstRemoteInput = first[i];
+ RemoteInput secondRemoteInput = second[i];
+
+ if (!TextUtils.equals(firstRemoteInput.getLabel(), secondRemoteInput.getLabel())) {
+ return true;
+ }
+ if (areDifferent(firstRemoteInput.getChoices(), secondRemoteInput.getChoices())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static boolean areDifferent(
+ @Nullable CharSequence[] first, @Nullable CharSequence[] second) {
+ if (first == second) {
+ return false;
+ }
+ if (first == null || second == null) {
+ return true;
+ }
+ if (first.length != second.length) {
+ return true;
+ }
+ for (int i = 0; i < first.length; i++) {
+ CharSequence firstCharSequence = first[i];
+ CharSequence secondCharSequence = second[i];
+ if (!TextUtils.equals(firstCharSequence, secondCharSequence)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUndoLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUndoLayout.java
new file mode 100644
index 000000000000..11a1c9bff0c9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationUndoLayout.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import com.android.systemui.R;
+
+/**
+ * Custom view for the NotificationInfo confirmation views so that the confirmation text can
+ * occupy the full width of the notification and push the undo button down to the next line if
+ * necessary.
+ *
+ * @see NotificationInfo
+ */
+public class NotificationUndoLayout extends FrameLayout {
+ /**
+ * View for the prompt/confirmation text to tell the user the previous action was successful.
+ */
+ private View mConfirmationTextView;
+ /** Undo button (actionable text) view. */
+ private View mUndoView;
+
+ /**
+ * Whether {@link #mConfirmationTextView} is multiline and will require the full width of the
+ * parent (which causes the {@link #mUndoView} to push down).
+ */
+ private boolean mIsMultiline = false;
+ private int mMultilineTopMargin;
+
+ public NotificationUndoLayout(Context context) {
+ this(context, null);
+ }
+
+ public NotificationUndoLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public NotificationUndoLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ mConfirmationTextView = findViewById(R.id.confirmation_text);
+ mUndoView = findViewById(R.id.undo);
+
+ mMultilineTopMargin = getResources().getDimensionPixelOffset(
+ com.android.internal.R.dimen.notification_content_margin_start);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ LayoutParams confirmationLayoutParams =
+ (LayoutParams) mConfirmationTextView.getLayoutParams();
+ LayoutParams undoLayoutParams =(LayoutParams) mUndoView.getLayoutParams();
+
+ int measuredWidth = getMeasuredWidth();
+ // Ignore the left margin on the undo button - no need for additional extra space between
+ // the text and the button.
+ int requiredWidth = mConfirmationTextView.getMeasuredWidth()
+ + confirmationLayoutParams.rightMargin
+ + confirmationLayoutParams.leftMargin
+ + mUndoView.getMeasuredWidth()
+ + undoLayoutParams.rightMargin;
+ // If the measured width isn't enough to accommodate both the undo button and the text in
+ // the same line, we'll need to adjust the view to be multi-line. Otherwise, we're done.
+ if (requiredWidth > measuredWidth) {
+ mIsMultiline = true;
+
+ // Update height requirement to the text height and the button's height (along with
+ // additional spacing for the top of the text).
+ int updatedHeight = mMultilineTopMargin
+ + mConfirmationTextView.getMeasuredHeight()
+ + mUndoView.getMeasuredHeight()
+ + undoLayoutParams.topMargin
+ + undoLayoutParams.bottomMargin;
+
+ setMeasuredDimension(measuredWidth, updatedHeight);
+ } else {
+ mIsMultiline = false;
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ // If the text view and undo view don't fit on the same line, we'll need to manually lay
+ // out the content.
+ if (mIsMultiline) {
+ // Re-align parent right/bottom values. Left and top are considered to be 0.
+ int parentBottom = getMeasuredHeight();
+ int parentRight = getMeasuredWidth();
+
+ LayoutParams confirmationLayoutParams =
+ (LayoutParams) mConfirmationTextView.getLayoutParams();
+ LayoutParams undoLayoutParams = (LayoutParams) mUndoView.getLayoutParams();
+
+ // The confirmation text occupies the full width as computed earlier. Both side margins
+ // are equivalent, so we only need to grab the left one here.
+ mConfirmationTextView.layout(
+ confirmationLayoutParams.leftMargin,
+ mMultilineTopMargin,
+ confirmationLayoutParams.leftMargin + mConfirmationTextView.getMeasuredWidth(),
+ mMultilineTopMargin + mConfirmationTextView.getMeasuredHeight());
+
+ // The undo button is aligned bottom|end with the parent in the case of multiline text.
+ int undoViewLeft = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL
+ ? undoLayoutParams.rightMargin
+ : parentRight - mUndoView.getMeasuredWidth() - undoLayoutParams.rightMargin;
+ mUndoView.layout(
+ undoViewLeft,
+ parentBottom - mUndoView.getMeasuredHeight() - undoLayoutParams.bottomMargin,
+ undoViewLeft + mUndoView.getMeasuredWidth(),
+ parentBottom - undoLayoutParams.bottomMargin);
+ } else {
+ super.onLayout(changed, left, top, right, bottom);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
index 1807465004c6..eaa4c6de0202 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
@@ -26,11 +26,12 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.PorterDuff;
+import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.support.v4.graphics.ColorUtils;
+import androidx.core.graphics.ColorUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Display;
@@ -272,12 +273,18 @@ public class ScrimView extends View implements ConfigurationController.Configura
tintAmount);
drawable.setColors(mainTinted, secondaryTinted, animated);
} else {
- if (mColorFilter == null) {
- mColorFilter = new PorterDuffColorFilter(mTintColor, PorterDuff.Mode.SRC_OVER);
+ boolean hasAlpha = Color.alpha(mTintColor) != 0;
+ if (hasAlpha) {
+ PorterDuff.Mode targetMode = mColorFilter == null ? Mode.SRC_OVER :
+ mColorFilter.getMode();
+ if (mColorFilter == null || mColorFilter.getColor() != mTintColor) {
+ mColorFilter = new PorterDuffColorFilter(mTintColor, targetMode);
+ }
} else {
- mColorFilter.setColor(mTintColor);
+ mColorFilter = null;
}
- mDrawable.setColorFilter(Color.alpha(mTintColor) == 0 ? null : mColorFilter);
+
+ mDrawable.setColorFilter(mColorFilter);
mDrawable.invalidateSelf();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index c0e7ac4810d9..cc5fbe53bba4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -38,7 +38,7 @@ import android.graphics.drawable.Icon;
import android.os.Parcelable;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
-import android.support.v4.graphics.ColorUtils;
+import androidx.core.graphics.ColorUtils;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.FloatProperty;
@@ -50,7 +50,7 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.animation.Interpolator;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.NotificationIconDozeHelper;
@@ -652,7 +652,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi
}
// We'll modify the color if it doesn't pass GAR
int contrastedColor = mDrawableColor;
- if (!NotificationColorUtil.satisfiesTextContrast(mCachedContrastBackgroundColor,
+ if (!ContrastColorUtil.satisfiesTextContrast(mCachedContrastBackgroundColor,
contrastedColor)) {
float[] hsl = new float[3];
ColorUtils.colorToHSL(mDrawableColor, hsl);
@@ -661,8 +661,9 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi
if (hsl[1] < 0.2f) {
contrastedColor = Notification.COLOR_DEFAULT;
}
- contrastedColor = NotificationColorUtil.resolveContrastColor(mContext,
- contrastedColor, mCachedContrastBackgroundColor);
+ boolean isDark = !ContrastColorUtil.isColorLight(mCachedContrastBackgroundColor);
+ contrastedColor = ContrastColorUtil.resolveContrastColor(mContext,
+ contrastedColor, mCachedContrastBackgroundColor, isDark);
}
mContrastedDrawableColor = contrastedColor;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
index d38173c151af..bee7dd8f0ce3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
@@ -146,20 +146,21 @@ public class StatusBarMobileView extends FrameLayout implements DarkReceiver,
}
public void applyMobileState(MobileIconState state) {
+ boolean requestLayout = false;
if (state == null) {
+ requestLayout = getVisibility() != View.GONE;
setVisibility(View.GONE);
mState = null;
- return;
- }
-
- if (mState == null) {
+ } else if (mState == null) {
+ requestLayout = true;
mState = state.copy();
initViewState();
- return;
+ } else if (!mState.equals(state)) {
+ requestLayout = updateState(state.copy());
}
- if (!mState.equals(state)) {
- updateState(state.copy());
+ if (requestLayout) {
+ requestLayout();
}
}
@@ -182,21 +183,25 @@ public class StatusBarMobileView extends FrameLayout implements DarkReceiver,
mMobileRoaming.setVisibility(mState.roaming ? View.VISIBLE : View.GONE);
mMobileRoamingSpace.setVisibility(mState.roaming ? View.VISIBLE : View.GONE);
mIn.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
- mOut.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
+ mOut.setVisibility(mState.activityOut ? View.VISIBLE : View.GONE);
mInoutContainer.setVisibility((mState.activityIn || mState.activityOut)
? View.VISIBLE : View.GONE);
mFiveGGroup.setVisibility(View.GONE);
}
- private void updateState(MobileIconState state) {
+ private boolean updateState(MobileIconState state) {
+ boolean needsLayout = false;
+
setContentDescription(state.contentDescription);
if (mState.visible != state.visible) {
mMobileGroup.setVisibility(state.visible ? View.VISIBLE : View.GONE);
+ needsLayout = true;
}
if (mState.strengthId != state.strengthId) {
mMobileDrawable.setLevel(state.strengthId);
}
if (mState.typeId != state.typeId) {
+ needsLayout |= state.typeId == 0 || mState.typeId == 0;
if (state.typeId != 0) {
mMobileType.setContentDescription(state.typeContentDescription);
mMobileType.setImageResource(state.typeId);
@@ -209,13 +214,17 @@ public class StatusBarMobileView extends FrameLayout implements DarkReceiver,
mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
mMobileRoamingSpace.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
- mOut.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
+ mOut.setVisibility(state.activityOut ? View.VISIBLE : View.GONE);
mInoutContainer.setVisibility((state.activityIn || state.activityOut)
? View.VISIBLE : View.GONE);
updateFiveGState(state);
+ needsLayout |= state.roaming != mState.roaming
+ || state.activityIn != mState.activityIn
+ || state.activityOut != mState.activityOut;
mState = state;
+ return needsLayout;
}
private void updateFiveGState(MobileIconState state) {
@@ -305,7 +314,7 @@ public class StatusBarMobileView extends FrameLayout implements DarkReceiver,
}
@Override
- public void setVisibleState(int state) {
+ public void setVisibleState(int state, boolean animate) {
if (state == mVisibleState) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
index 0ed6b77f7047..f3fc99e36426 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
@@ -124,7 +124,7 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver,
}
@Override
- public void setVisibleState(int state) {
+ public void setVisibleState(int state, boolean animate) {
if (state == mVisibleState) {
return;
}
@@ -191,23 +191,26 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver,
}
public void applyWifiState(WifiIconState state) {
+ boolean requestLayout = false;
+
if (state == null) {
+ requestLayout = getVisibility() != View.GONE;
setVisibility(View.GONE);
mState = null;
- return;
- }
-
- if (mState == null) {
+ } else if (mState == null) {
+ requestLayout = true;
mState = state.copy();
initViewState();
+ } else if (!mState.equals(state)) {
+ requestLayout = updateState(state.copy());
}
- if (!mState.equals(state)) {
- updateState(state.copy());
+ if (requestLayout) {
+ requestLayout();
}
}
- private void updateState(WifiIconState state) {
+ private boolean updateState(WifiIconState state) {
setContentDescription(state.contentDescription);
if (mState.resId != state.resId && state.resId >= 0) {
NeutralGoodDrawable drawable = NeutralGoodDrawable
@@ -222,11 +225,17 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver,
(state.activityIn || state.activityOut) ? View.VISIBLE : View.GONE);
mAirplaneSpacer.setVisibility(state.airplaneSpacerVisible ? View.VISIBLE : View.GONE);
mSignalSpacer.setVisibility(state.signalSpacerVisible ? View.VISIBLE : View.GONE);
+
+ boolean needsLayout = state.activityIn != mState.activityIn
+ ||state.activityOut != mState.activityOut;
+
if (mState.visible != state.visible) {
+ needsLayout |= true;
setVisibility(state.visible ? View.VISIBLE : View.GONE);
}
mState = state;
+ return needsLayout;
}
private void initViewState() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java
index b831b8657be3..beb90b893ec8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java
@@ -22,7 +22,10 @@ public interface StatusIconDisplayable extends DarkReceiver {
String getSlot();
void setStaticDrawableColor(int color);
void setDecorColor(int color);
- void setVisibleState(int state);
+ default void setVisibleState(int state) {
+ setVisibleState(state, false);
+ }
+ void setVisibleState(int state, boolean animate);
int getVisibleState();
boolean isIconVisible();
default boolean isIconBlocked() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index 83021ca51a55..288b473461e0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.car;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.SystemProperties;
@@ -452,7 +453,7 @@ public class CarStatusBar extends StatusBar implements
public void onTaskStackChanged() {
try {
mCarFacetButtonController.taskChanged(
- ActivityManager.getService().getAllStackInfos());
+ ActivityTaskManager.getService().getAllStackInfos());
} catch (Exception e) {
Log.e(TAG, "Getting StackInfo from activity manager failed", e);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
index f78e3912ad91..d720aef3a138 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
@@ -24,7 +24,7 @@ import android.util.Log;
import android.view.View;
import android.view.ViewStub;
-import android.support.v7.widget.GridLayoutManager;
+import androidx.recyclerview.widget.GridLayoutManager;
import com.android.settingslib.users.UserManagerHelper;
import com.android.systemui.R;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
index a49d507aa21a..257fa7508125 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
@@ -28,9 +28,7 @@ import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.os.AsyncTask;
-import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
-import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
-import android.support.v7.widget.RecyclerView;
+import android.os.UserHandle;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
@@ -39,6 +37,9 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.car.widget.PagedListView;
+import androidx.core.graphics.drawable.RoundedBitmapDrawable;
+import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
+import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.util.UserIcons;
import com.android.settingslib.users.UserManagerHelper;
@@ -102,8 +103,7 @@ public class UserGridRecyclerView extends PagedListView implements
// Don't display guests in the switcher.
continue;
}
- boolean isForeground =
- mUserManagerHelper.getForegroundUserId() == userInfo.id;
+ boolean isForeground = mUserManagerHelper.getForegroundUserId() == userInfo.id;
UserRecord record = new UserRecord(userInfo, false /* isStartGuestSession */,
false /* isAddUser */, isForeground);
userRecords.add(record);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
index 2b7949b1de54..8c0d70062eb1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java
@@ -23,11 +23,11 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.graphics.Palette;
+import androidx.annotation.VisibleForTesting;
+import androidx.palette.graphics.Palette;
import android.util.LayoutDirection;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.R;
import java.util.List;
@@ -155,7 +155,7 @@ public class MediaNotificationProcessor {
}
private int selectForegroundColor(int backgroundColor, Palette palette) {
- if (NotificationColorUtil.isColorLight(backgroundColor)) {
+ if (ContrastColorUtil.isColorLight(backgroundColor)) {
return selectForegroundColorForSwatches(palette.getDarkVibrantSwatch(),
palette.getVibrantSwatch(),
palette.getDarkMutedSwatch(),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
index 2fc2cdbd5e33..ade27f9f3ad2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationHeaderViewWrapper.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.notification;
+import static com.android.systemui.statusbar.ExpandableNotificationRow
+ .DEFAULT_HEADER_VISIBLE_AMOUNT;
import static com.android.systemui.statusbar.notification.TransformState.TRANSFORM_Y;
import android.app.Notification;
@@ -123,6 +125,9 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper {
// Reinspect the notification.
resolveHeaderViews();
+ if (row.getHeaderVisibleAmount() != DEFAULT_HEADER_VISIBLE_AMOUNT) {
+ setHeaderVisibleAmount(row.getHeaderVisibleAmount());
+ }
updateTransformedTypes();
addRemainingTransformTypes();
updateCropToPaddingForImageViews();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java
index 9f79ef2491d9..43e45b14cfbe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationIconDozeHelper.java
@@ -16,9 +16,10 @@
package com.android.systemui.statusbar.notification;
+import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Color;
-import android.graphics.PorterDuff;
+import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
@@ -29,8 +30,9 @@ public class NotificationIconDozeHelper extends NotificationDozeHelper {
private final int mImageDarkAlpha;
private final int mImageDarkColor = 0xffffffff;
- private final PorterDuffColorFilter mImageColorFilter = new PorterDuffColorFilter(
- 0, PorterDuff.Mode.SRC_ATOP);
+
+ @Nullable
+ private PorterDuffColorFilter mImageColorFilter = null;
private int mColor = Color.BLACK;
@@ -80,7 +82,9 @@ public class NotificationIconDozeHelper extends NotificationDozeHelper {
private void updateImageColorFilter(ImageView target, float intensity) {
int color = NotificationUtils.interpolateColors(mColor, mImageDarkColor, intensity);
- mImageColorFilter.setColor(color);
+ if (mImageColorFilter == null || mImageColorFilter.getColor() != color) {
+ mImageColorFilter = new PorterDuffColorFilter(color, Mode.SRC_ATOP);
+ }
Drawable imageDrawable = target.getDrawable();
// Also, the notification might have been modified during the animation, so background
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
index 130305715409..b9740d370782 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
@@ -27,15 +27,17 @@ import android.view.View;
import android.widget.RemoteViews;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.systemui.R;
-import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.NotificationContentView;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.util.Assert;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
@@ -67,6 +69,7 @@ public class NotificationInflater {
private boolean mIsChildInGroup;
private InflationCallback mCallback;
private boolean mRedactAmbient;
+ private List<Notification.Action> mSmartActions;
public NotificationInflater(ExpandableNotificationRow row) {
mRow = row;
@@ -95,6 +98,10 @@ public class NotificationInflater {
mUsesIncreasedHeight = usesIncreasedHeight;
}
+ public void setSmartActions(List<Notification.Action> smartActions) {
+ mSmartActions = smartActions;
+ }
+
public void setUsesIncreasedHeadsUpHeight(boolean usesIncreasedHeight) {
mUsesIncreasedHeadsUpHeight = usesIncreasedHeight;
}
@@ -140,7 +147,7 @@ public class NotificationInflater {
AsyncInflationTask task = new AsyncInflationTask(sbn, reInflateFlags, mRow,
mIsLowPriority,
mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient,
- mCallback, mRemoteViewClickHandler);
+ mCallback, mRemoteViewClickHandler, mSmartActions);
if (mCallback != null && mCallback.doInflateSynchronous()) {
task.onPostExecute(task.doInBackground());
} else {
@@ -554,7 +561,7 @@ public class NotificationInflater {
}
}
- public void onDensityOrFontScaleChanged() {
+ public void clearCachesAndReInflate() {
NotificationData.Entry entry = mRow.getEntry();
entry.cachedAmbientContentView = null;
entry.cachedBigContentView = null;
@@ -586,13 +593,15 @@ public class NotificationInflater {
private Exception mError;
private RemoteViews.OnClickHandler mRemoteViewClickHandler;
private CancellationSignal mCancellationSignal;
+ private List<Notification.Action> mSmartActions;
private AsyncInflationTask(StatusBarNotification notification,
int reInflateFlags, ExpandableNotificationRow row, boolean isLowPriority,
boolean isChildInGroup, boolean usesIncreasedHeight,
boolean usesIncreasedHeadsUpHeight, boolean redactAmbient,
InflationCallback callback,
- RemoteViews.OnClickHandler remoteViewClickHandler) {
+ RemoteViews.OnClickHandler remoteViewClickHandler,
+ List<Notification.Action> smartActions) {
mRow = row;
mSbn = notification;
mReInflateFlags = reInflateFlags;
@@ -604,6 +613,9 @@ public class NotificationInflater {
mRedactAmbient = redactAmbient;
mRemoteViewClickHandler = remoteViewClickHandler;
mCallback = callback;
+ mSmartActions = smartActions == null
+ ? Collections.emptyList()
+ : new ArrayList<>(smartActions);
NotificationData.Entry entry = row.getEntry();
entry.setInflationTask(this);
}
@@ -619,6 +631,9 @@ public class NotificationInflater {
final Notification.Builder recoveredBuilder
= Notification.Builder.recoverBuilder(mContext,
mSbn.getNotification());
+
+ applyChanges(recoveredBuilder);
+
Context packageContext = mSbn.getPackageContext(mContext);
Notification notification = mSbn.getNotification();
if (notification.isMediaNotification()) {
@@ -646,6 +661,18 @@ public class NotificationInflater {
}
}
+ /**
+ * Apply changes to the given notification builder, like adding smart actions suggested by
+ * a {@link android.service.notification.NotificationAssistantService}.
+ */
+ private void applyChanges(Notification.Builder builder) {
+ if (mSmartActions != null) {
+ for (Notification.Action smartAction : mSmartActions) {
+ builder.addAction(smartAction);
+ }
+ }
+ }
+
private void handleError(Exception e) {
mRow.getEntry().onInflationTaskFinished();
StatusBarNotification sbn = mRow.getStatusBarNotification();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
index 91a4dda5a281..d4b0be89aedd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java
@@ -31,7 +31,7 @@ import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.NotificationActionListLayout;
import com.android.systemui.Dependency;
import com.android.systemui.R;
@@ -210,7 +210,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
private int blendColorWithBackground(int color, float alpha) {
// alpha doesn't go well for color filters, so let's blend it manually
- return NotificationColorUtil.compositeColors(Color.argb((int) (alpha * 255),
+ return ContrastColorUtil.compositeColors(Color.argb((int) (alpha * 255),
Color.red(color), Color.green(color), Color.blue(color)), resolveBackgroundColor());
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java
index 7e2336c4454b..66ba9e9fc928 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java
@@ -18,14 +18,11 @@ package com.android.systemui.statusbar.notification;
import android.content.Context;
import android.graphics.Color;
-import android.os.UserHandle;
-import android.provider.Settings;
import android.view.View;
import android.widget.ImageView;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.R;
-import com.android.systemui.statusbar.stack.NotificationChildrenContainer;
/**
* A util class for various reusable functions
@@ -33,7 +30,7 @@ import com.android.systemui.statusbar.stack.NotificationChildrenContainer;
public class NotificationUtils {
private static final int[] sLocationBase = new int[2];
private static final int[] sLocationOffset = new int[2];
- public static boolean isGrayscale(ImageView v, NotificationColorUtil colorUtil) {
+ public static boolean isGrayscale(ImageView v, ContrastColorUtil colorUtil) {
Object isGrayscale = v.getTag(R.id.icon_is_grayscale);
if (isGrayscale != null) {
return Boolean.TRUE.equals(isGrayscale);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
index c2141714b391..9b9dfc96ccff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
@@ -17,7 +17,7 @@
package com.android.systemui.statusbar.notification;
import android.content.Context;
-import android.support.v4.view.AsyncLayoutInflater;
+import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
index 09aff1b97305..7fe01c0ff0c1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
@@ -16,7 +16,7 @@
package com.android.systemui.statusbar.notification;
-import android.support.v4.util.ArraySet;
+import androidx.collection.ArraySet;
import android.view.View;
import com.android.systemui.statusbar.ExpandableNotificationRow;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index 4bca79715422..235ff2bc93a6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -166,7 +166,7 @@ public class BarTransitions {
mSemiTransparent = context.getColor(
com.android.internal.R.color.system_bar_background_semi_transparent);
mTransparent = context.getColor(R.color.system_bar_background_transparent);
- mWarning = Utils.getColorAttr(context, android.R.attr.colorError);
+ mWarning = Utils.getColorAttrDefaultColor(context, android.R.attr.colorError);
}
mGradient = context.getDrawable(gradientResourceId);
}
@@ -183,20 +183,19 @@ public class BarTransitions {
@Override
public void setTint(int color) {
- if (mTintFilter == null) {
- mTintFilter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN);
- } else {
- mTintFilter.setColor(color);
+ PorterDuff.Mode targetMode = mTintFilter == null ? Mode.SRC_IN :
+ mTintFilter.getMode();
+ if (mTintFilter == null || mTintFilter.getColor() != color) {
+ mTintFilter = new PorterDuffColorFilter(color, targetMode);
}
invalidateSelf();
}
@Override
public void setTintMode(Mode tintMode) {
- if (mTintFilter == null) {
- mTintFilter = new PorterDuffColorFilter(0, tintMode);
- } else {
- mTintFilter.setMode(tintMode);
+ int targetColor = mTintFilter == null ? 0 : mTintFilter.getColor();
+ if (mTintFilter == null || mTintFilter.getMode() != tintMode) {
+ mTintFilter = new PorterDuffColorFilter(targetColor, tintMode);
}
invalidateSelf();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index f0b1a82cfc2f..2087a165b215 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone;
+import android.hardware.biometrics.BiometricSourceType;
import android.content.Context;
import android.os.Handler;
import android.os.PowerManager;
@@ -35,14 +36,14 @@ import com.android.systemui.keyguard.WakefulnessLifecycle;
import java.io.PrintWriter;
/**
- * Controller which coordinates all the fingerprint unlocking actions with the UI.
+ * Controller which coordinates all the biometric unlocking actions with the UI.
*/
-public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
+public class BiometricUnlockController extends KeyguardUpdateMonitorCallback {
- private static final String TAG = "FingerprintController";
- private static final boolean DEBUG_FP_WAKELOCK = KeyguardConstants.DEBUG_FP_WAKELOCK;
- private static final long FINGERPRINT_WAKELOCK_TIMEOUT_MS = 15 * 1000;
- private static final String FINGERPRINT_WAKE_LOCK_NAME = "wake-and-unlock wakelock";
+ private static final String TAG = "BiometricUnlockController";
+ private static final boolean DEBUG_BIO_WAKELOCK = KeyguardConstants.DEBUG_BIOMETRIC_WAKELOCK;
+ private static final long BIOMETRIC_WAKELOCK_TIMEOUT_MS = 15 * 1000;
+ private static final String BIOMETRIC_WAKE_LOCK_NAME = "wake-and-unlock wakelock";
/**
* Mode in which we don't need to wake up the device when we get a fingerprint.
@@ -90,9 +91,9 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
public static final int MODE_WAKE_AND_UNLOCK_FROM_DREAM = 7;
/**
- * How much faster we collapse the lockscreen when authenticating with fingerprint.
+ * How much faster we collapse the lockscreen when authenticating with biometric.
*/
- private static final float FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR = 1.1f;
+ private static final float BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR = 1.1f;
private PowerManager mPowerManager;
private Handler mHandler = new Handler();
@@ -108,15 +109,16 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
private final UnlockMethodCache mUnlockMethodCache;
private final Context mContext;
private int mPendingAuthenticatedUserId = -1;
+ private BiometricSourceType mPendingAuthenticatedBioSourceType = null;
private boolean mPendingShowBouncer;
private boolean mHasScreenTurnedOnSinceAuthenticating;
- public FingerprintUnlockController(Context context,
- DozeScrimController dozeScrimController,
- KeyguardViewMediator keyguardViewMediator,
- ScrimController scrimController,
- StatusBar statusBar,
- UnlockMethodCache unlockMethodCache) {
+ public BiometricUnlockController(Context context,
+ DozeScrimController dozeScrimController,
+ KeyguardViewMediator keyguardViewMediator,
+ ScrimController scrimController,
+ StatusBar statusBar,
+ UnlockMethodCache unlockMethodCache) {
mContext = context;
mPowerManager = context.getSystemService(PowerManager.class);
mUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
@@ -136,21 +138,21 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
}
- private final Runnable mReleaseFingerprintWakeLockRunnable = new Runnable() {
+ private final Runnable mReleaseBiometricWakeLockRunnable = new Runnable() {
@Override
public void run() {
- if (DEBUG_FP_WAKELOCK) {
- Log.i(TAG, "fp wakelock: TIMEOUT!!");
+ if (DEBUG_BIO_WAKELOCK) {
+ Log.i(TAG, "biometric wakelock: TIMEOUT!!");
}
- releaseFingerprintWakeLock();
+ releaseBiometricWakeLock();
}
};
- private void releaseFingerprintWakeLock() {
+ private void releaseBiometricWakeLock() {
if (mWakeLock != null) {
- mHandler.removeCallbacks(mReleaseFingerprintWakeLockRunnable);
- if (DEBUG_FP_WAKELOCK) {
- Log.i(TAG, "releasing fp wakelock");
+ mHandler.removeCallbacks(mReleaseBiometricWakeLockRunnable);
+ if (DEBUG_BIO_WAKELOCK) {
+ Log.i(TAG, "releasing biometric wakelock");
}
mWakeLock.release();
mWakeLock = null;
@@ -158,24 +160,27 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
}
@Override
- public void onFingerprintAcquired() {
- Trace.beginSection("FingerprintUnlockController#onFingerprintAcquired");
- releaseFingerprintWakeLock();
+ public void onBiometricAcquired(BiometricSourceType biometricSourceType) {
+ Trace.beginSection("BiometricUnlockController#onBiometricAcquired");
+ releaseBiometricWakeLock();
if (!mUpdateMonitor.isDeviceInteractive()) {
if (LatencyTracker.isEnabled(mContext)) {
- LatencyTracker.getInstance(mContext).onActionStart(
- LatencyTracker.ACTION_FINGERPRINT_WAKE_AND_UNLOCK);
+ int action = LatencyTracker.ACTION_FINGERPRINT_WAKE_AND_UNLOCK;
+ if (biometricSourceType == BiometricSourceType.FACE) {
+ action = LatencyTracker.ACTION_FACE_WAKE_AND_UNLOCK;
+ }
+ LatencyTracker.getInstance(mContext).onActionStart(action);
}
mWakeLock = mPowerManager.newWakeLock(
- PowerManager.PARTIAL_WAKE_LOCK, FINGERPRINT_WAKE_LOCK_NAME);
+ PowerManager.PARTIAL_WAKE_LOCK, BIOMETRIC_WAKE_LOCK_NAME);
Trace.beginSection("acquiring wake-and-unlock");
mWakeLock.acquire();
Trace.endSection();
- if (DEBUG_FP_WAKELOCK) {
- Log.i(TAG, "fingerprint acquired, grabbing fp wakelock");
+ if (DEBUG_BIO_WAKELOCK) {
+ Log.i(TAG, "biometric acquired, grabbing biometric wakelock");
}
- mHandler.postDelayed(mReleaseFingerprintWakeLockRunnable,
- FINGERPRINT_WAKELOCK_TIMEOUT_MS);
+ mHandler.postDelayed(mReleaseBiometricWakeLockRunnable,
+ BIOMETRIC_WAKELOCK_TIMEOUT_MS);
}
Trace.endSection();
}
@@ -187,10 +192,11 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
}
@Override
- public void onFingerprintAuthenticated(int userId) {
- Trace.beginSection("FingerprintUnlockController#onFingerprintAuthenticated");
+ public void onBiometricAuthenticated(int userId, BiometricSourceType biometricSourceType) {
+ Trace.beginSection("BiometricUnlockController#onBiometricAuthenticated");
if (mUpdateMonitor.isGoingToSleep()) {
mPendingAuthenticatedUserId = userId;
+ mPendingAuthenticatedBioSourceType = biometricSourceType;
Trace.endSection();
return;
}
@@ -210,15 +216,28 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
// until the clock and the notifications are faded out.
mStatusBarWindowManager.setForceDozeBrightness(true);
}
- if (!wasDeviceInteractive) {
- if (DEBUG_FP_WAKELOCK) {
- Log.i(TAG, "fp wakelock: Authenticated, waking up...");
+ // During wake and unlock, we need to draw black before waking up to avoid abrupt
+ // brightness changes due to display state transitions.
+ boolean alwaysOnEnabled = DozeParameters.getInstance(mContext).getAlwaysOn();
+ boolean delayWakeUp = mode == MODE_WAKE_AND_UNLOCK && alwaysOnEnabled;
+ Runnable wakeUp = ()-> {
+ if (!wasDeviceInteractive) {
+ if (DEBUG_BIO_WAKELOCK) {
+ Log.i(TAG, "bio wakelock: Authenticated, waking up...");
+ }
+ mPowerManager.wakeUp(SystemClock.uptimeMillis(), "android.policy:BIOMETRIC");
}
- mPowerManager.wakeUp(SystemClock.uptimeMillis(), "android.policy:FINGERPRINT");
+ if (delayWakeUp) {
+ mKeyguardViewMediator.onWakeAndUnlocking();
+ }
+ Trace.beginSection("release wake-and-unlock");
+ releaseBiometricWakeLock();
+ Trace.endSection();
+ };
+
+ if (!delayWakeUp) {
+ wakeUp.run();
}
- Trace.beginSection("release wake-and-unlock");
- releaseFingerprintWakeLock();
- Trace.endSection();
switch (mMode) {
case MODE_DISMISS_BOUNCER:
Trace.beginSection("MODE_DISMISS");
@@ -251,7 +270,11 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
mUpdateMonitor.awakenFromDream();
}
mStatusBarWindowManager.setStatusBarFocusable(false);
- mKeyguardViewMediator.onWakeAndUnlocking();
+ if (delayWakeUp) {
+ mHandler.postDelayed(wakeUp, 50);
+ } else {
+ mKeyguardViewMediator.onWakeAndUnlocking();
+ }
if (mStatusBar.getNavigationBarView() != null) {
mStatusBar.getNavigationBarView().setWakeAndUnlocking(true);
}
@@ -261,7 +284,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
case MODE_NONE:
break;
}
- mStatusBar.notifyFpAuthModeChanged();
+ mStatusBar.notifyBiometricAuthModeChanged();
Trace.endSection();
}
@@ -270,7 +293,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
mStatusBarKeyguardViewManager.showBouncer(false);
}
mStatusBarKeyguardViewManager.animateCollapsePanels(
- FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);
+ BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR);
mPendingShowBouncer = false;
}
@@ -278,28 +301,31 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
public void onStartedGoingToSleep(int why) {
resetMode();
mPendingAuthenticatedUserId = -1;
+ mPendingAuthenticatedBioSourceType = null;
}
@Override
public void onFinishedGoingToSleep(int why) {
- Trace.beginSection("FingerprintUnlockController#onFinishedGoingToSleep");
+ Trace.beginSection("BiometricUnlockController#onFinishedGoingToSleep");
if (mPendingAuthenticatedUserId != -1) {
// Post this to make sure it's executed after the device is fully locked.
mHandler.post(new Runnable() {
@Override
public void run() {
- onFingerprintAuthenticated(mPendingAuthenticatedUserId);
+ onBiometricAuthenticated(mPendingAuthenticatedUserId,
+ mPendingAuthenticatedBioSourceType);
}
});
}
mPendingAuthenticatedUserId = -1;
+ mPendingAuthenticatedBioSourceType = null;
Trace.endSection();
}
public boolean hasPendingAuthentication() {
return mPendingAuthenticatedUserId != -1
- && mUpdateMonitor.isUnlockingWithFingerprintAllowed()
+ && mUpdateMonitor.isUnlockingWithBiometricAllowed()
&& mPendingAuthenticatedUserId == KeyguardUpdateMonitor.getCurrentUser();
}
@@ -308,7 +334,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
}
private int calculateMode() {
- boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithFingerprintAllowed();
+ boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed();
boolean deviceDreaming = mUpdateMonitor.isDreaming();
if (!mUpdateMonitor.isDeviceInteractive()) {
@@ -338,17 +364,18 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
}
@Override
- public void onFingerprintAuthFailed() {
+ public void onBiometricAuthFailed(BiometricSourceType biometricSourceType) {
cleanup();
}
@Override
- public void onFingerprintError(int msgId, String errString) {
+ public void onBiometricError(int msgId, String errString,
+ BiometricSourceType biometricSourceType) {
cleanup();
}
private void cleanup() {
- releaseFingerprintWakeLock();
+ releaseBiometricWakeLock();
}
public void startKeyguardFadingAway() {
@@ -372,7 +399,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
if (mStatusBar.getNavigationBarView() != null) {
mStatusBar.getNavigationBarView().setWakeAndUnlocking(false);
}
- mStatusBar.notifyFpAuthModeChanged();
+ mStatusBar.notifyBiometricAuthModeChanged();
}
private final WakefulnessLifecycle.Observer mWakefulnessObserver =
@@ -380,7 +407,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
@Override
public void onFinishedWakingUp() {
if (mPendingShowBouncer) {
- FingerprintUnlockController.this.showBouncer();
+ BiometricUnlockController.this.showBouncer();
}
}
};
@@ -398,7 +425,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
}
public void dump(PrintWriter pw) {
- pw.println(" FingerprintUnlockController:");
+ pw.println(" BiometricUnlockController:");
pw.print(" mMode="); pw.println(mMode);
pw.print(" mWakeLock="); pw.println(mWakeLock);
}
@@ -415,7 +442,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
/**
* Successful authentication with fingerprint when the screen was either on or off.
*/
- public boolean isFingerprintUnlock() {
+ public boolean isBiometricUnlock() {
return isWakeAndUnlock() || mMode == MODE_UNLOCK;
}
}
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 f7b7eeb2ad88..a781be69c93e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -22,6 +22,8 @@ import android.annotation.Nullable;
import android.app.Fragment;
import android.app.StatusBarManager;
import android.os.Bundle;
+import android.os.Parcelable;
+import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -89,7 +91,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
super.onViewCreated(view, savedInstanceState);
mStatusBar = (PhoneStatusBarView) view;
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_PANEL_STATE)) {
- mStatusBar.go(savedInstanceState.getInt(EXTRA_PANEL_STATE));
+ mStatusBar.restoreHierarchyState(
+ savedInstanceState.getSparseParcelableArray(EXTRA_PANEL_STATE));
}
mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons));
mDarkIconManager.setShouldLog(true);
@@ -105,7 +108,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- outState.putInt(EXTRA_PANEL_STATE, mStatusBar.getState());
+ SparseArray<Parcelable> states = new SparseArray<>();
+ mStatusBar.saveHierarchyState(states);
+ outState.putSparseParcelableArray(EXTRA_PANEL_STATE, states);
}
@Override
@@ -184,6 +189,14 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
state |= DISABLE_SYSTEM_INFO;
state |= DISABLE_CLOCK;
}
+
+ // In landscape, the heads up show but shouldHideNotificationIcons() return false
+ // because the visual icon is in notification icon area rather than heads up's space.
+ // whether the notification icon show or not, clock should hide when heads up show.
+ if (mStatusBarComponent.isHeadsUpShouldBeVisible()) {
+ state |= DISABLE_CLOCK;
+ }
+
if (mNetworkController != null && EncryptionHelper.IS_DATA_ENCRYPTED) {
if (mNetworkController.hasEmergencyCryptKeeperText()) {
state |= DISABLE_NOTIFICATION_ICONS;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java
index 6f538440647e..7ddca1756070 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.java
@@ -64,8 +64,9 @@ public class ConfigurationControllerImpl implements ConfigurationController,
final float fontScale = newConfig.fontScale;
final int density = newConfig.densityDpi;
int uiMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;
+ boolean uiModeChanged = uiMode != mUiMode;
if (density != mDensity || fontScale != mFontScale
- || (mInCarMode && uiMode != mUiMode)) {
+ || (mInCarMode && uiModeChanged)) {
listeners.forEach(l -> {
if (mListeners.contains(l)) {
l.onDensityOrFontScaleChanged();
@@ -73,7 +74,6 @@ public class ConfigurationControllerImpl implements ConfigurationController,
});
mDensity = density;
mFontScale = fontScale;
- mUiMode = uiMode;
}
final LocaleList localeList = newConfig.getLocales();
@@ -86,6 +86,15 @@ public class ConfigurationControllerImpl implements ConfigurationController,
});
}
+ if (uiModeChanged) {
+ mUiMode = uiMode;
+ listeners.forEach(l -> {
+ if (mListeners.contains(l)) {
+ l.onUiModeChanged();
+ }
+ });
+ }
+
if ((mLastConfig.updateFrom(newConfig) & ActivityInfo.CONFIG_ASSETS_PATHS) != 0) {
listeners.forEach(l -> {
if (mListeners.contains(l)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
index e0e991b4993f..e052e531ddd2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
@@ -203,7 +203,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da
v.set(icon);
v.setStaticDrawableColor(mColor);
v.setDecorColor(mColor);
- addView(v, 0, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize));
+ addView(v, 0, createLayoutParams());
}
public void addDemoWifiView(WifiIconState state) {
@@ -223,7 +223,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da
mWifiView = view;
mWifiView.applyWifiState(state);
mWifiView.setStaticDrawableColor(mColor);
- addView(view, viewIndex);
+ addView(view, viewIndex, createLayoutParams());
}
public void updateWifiState(WifiIconState state) {
@@ -244,7 +244,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da
// mobile always goes at the end
mMobileViews.add(view);
- addView(view, getChildCount());
+ addView(view, getChildCount(), createLayoutParams());
}
public void updateMobileState(MobileIconState state) {
@@ -290,6 +290,10 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da
return null;
}
+ private LayoutParams createLayoutParams() {
+ return new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
+ }
+
@Override
public void onDarkChanged(Rect area, float darkIntensity, int tint) {
setColor(DarkIconDispatcher.getTint(area, mStatusIcons, tint));
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 409a78391975..e1936fadb17a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone;
import android.graphics.Point;
import android.graphics.Rect;
+import android.view.DisplayCutout;
import android.view.View;
import android.view.WindowInsets;
@@ -53,9 +54,12 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
mSetTrackingHeadsUp = this::setTrackingHeadsUp;
private final Runnable mUpdatePanelTranslation = this::updatePanelTranslation;
private final BiConsumer<Float, Float> mSetExpandedHeight = this::setExpandedHeight;
- private float mExpandedHeight;
- private boolean mIsExpanded;
- private float mExpandFraction;
+ @VisibleForTesting
+ float mExpandedHeight;
+ @VisibleForTesting
+ boolean mIsExpanded;
+ @VisibleForTesting
+ float mExpandFraction;
private ExpandableNotificationRow mTrackedChild;
private boolean mShown;
private final View.OnLayoutChangeListener mStackScrollLayoutChangeListener =
@@ -99,6 +103,20 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
mClockView = clockView;
mDarkIconDispatcher = Dependency.get(DarkIconDispatcher.class);
mDarkIconDispatcher.addDarkReceiver(this);
+
+ mHeadsUpStatusBarView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ if (shouldBeVisible()) {
+ updateTopEntry();
+
+ // trigger scroller to notify the latest panel translation
+ mStackScroller.requestLayout();
+ }
+ mHeadsUpStatusBarView.removeOnLayoutChangeListener(this);
+ }
+ });
}
@@ -159,8 +177,15 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
}
WindowInsets windowInset = mStackScroller.getRootWindowInsets();
- return windowInset.getSystemWindowInsetLeft() + mStackScroller.getRight()
- + windowInset.getSystemWindowInsetRight() - realDisplaySize;
+ DisplayCutout cutout = (windowInset != null) ? windowInset.getDisplayCutout() : null;
+ int sysWinLeft = (windowInset != null) ? windowInset.getStableInsetLeft() : 0;
+ int sysWinRight = (windowInset != null) ? windowInset.getStableInsetRight() : 0;
+ int cutoutLeft = (cutout != null) ? cutout.getSafeInsetLeft() : 0;
+ int cutoutRight = (cutout != null) ? cutout.getSafeInsetRight() : 0;
+ int leftInset = Math.max(sysWinLeft, cutoutLeft);
+ int rightInset = Math.max(sysWinRight, cutoutRight);
+
+ return leftInset + mStackScroller.getRight() + rightInset - realDisplaySize;
}
public void updatePanelTranslation() {
@@ -293,4 +318,13 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,
mHeadsUpStatusBarView.setPublicMode(publicMode);
updateTopEntry();
}
+
+ void readFrom(HeadsUpAppearanceController oldController) {
+ if (oldController != null) {
+ mTrackedChild = oldController.mTrackedChild;
+ mExpandedHeight = oldController.mExpandedHeight;
+ mIsExpanded = oldController.mIsExpanded;
+ mExpandFraction = oldController.mExpandFraction;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index fa0a774c249e..0a26e7345717 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -21,15 +21,22 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.support.v4.util.ArraySet;
+import androidx.collection.ArraySet;
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.graphics.Region.Op;
import android.util.Log;
import android.util.Pools;
+import android.view.DisplayCutout;
+import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.InternalInsetsInfo;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
+import com.android.systemui.ScreenDecorations;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.StatusBarState;
@@ -41,6 +48,7 @@ import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashSet;
+import java.util.List;
import java.util.Stack;
/**
@@ -60,6 +68,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
private int mStatusBarHeight;
private int mHeadsUpInset;
+ private int mDisplayCutoutTouchableRegionSize;
private boolean mTrackingHeadsUp;
private HashSet<String> mSwipedOutKeys = new HashSet<>();
private HashSet<NotificationData.Entry> mEntriesToRemoveAfterExpand = new HashSet<>();
@@ -120,6 +129,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
com.android.internal.R.dimen.status_bar_height);
mHeadsUpInset = mStatusBarHeight + resources.getDimensionPixelSize(
R.dimen.heads_up_status_bar_padding);
+ mDisplayCutoutTouchableRegionSize = resources.getDimensionPixelSize(
+ R.dimen.display_cutout_touchable_region_size);
}
@Override
@@ -128,6 +139,11 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
initResources();
}
+ @Override
+ public void onOverlayChanged() {
+ initResources();
+ }
+
///////////////////////////////////////////////////////////////////////////////////////////////
// Public methods:
@@ -301,12 +317,32 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
info.touchableRegion.set(minX, 0, maxX, mHeadsUpInset + height);
- } else if (mHeadsUpGoingAway || mWaitingOnCollapseWhenGoingAway) {
- info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
- info.touchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight);
+ } else {
+ setCollapsedTouchableInsets(info);
}
}
+ private void setCollapsedTouchableInsets(ViewTreeObserver.InternalInsetsInfo info) {
+ info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
+ info.touchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight);
+ updateRegionForNotch(info.touchableRegion);
+ }
+
+ private void updateRegionForNotch(Region region) {
+ DisplayCutout cutout = mStatusBarWindowView.getRootWindowInsets().getDisplayCutout();
+ if (cutout == null) {
+ return;
+ }
+
+ // Expand touchable region such that we also catch touches that just start below the notch
+ // area.
+ Region bounds = ScreenDecorations.DisplayCutoutView.boundsFromDirection(
+ cutout, Gravity.TOP);
+ bounds.translate(0, mDisplayCutoutTouchableRegionSize);
+ region.op(bounds, Op.UNION);
+ bounds.recycle();
+ }
+
@Override
public void onConfigChanged(Configuration newConfig) {
Resources resources = mContext.getResources();
@@ -403,7 +439,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable,
private void updateTouchableRegionListener() {
boolean shouldObserve = hasPinnedHeadsUp() || mHeadsUpGoingAway
- || mWaitingOnCollapseWhenGoingAway;
+ || mWaitingOnCollapseWhenGoingAway
+ || mStatusBarWindowView.getRootWindowInsets().getDisplayCutout() != null;
if (shouldObserve == mIsObserving) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
index 46d982768179..e2f33198a0ed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
@@ -367,10 +367,10 @@ public class KeyguardAffordanceHelper {
}
}
- private void startFinishingCircleAnimation(float velocity, Runnable mAnimationEndRunnable,
+ private void startFinishingCircleAnimation(float velocity, Runnable animationEndRunnable,
boolean right) {
KeyguardAffordanceView targetView = right ? mRightIcon : mLeftIcon;
- targetView.finishAnimation(velocity, mAnimationEndRunnable);
+ targetView.finishAnimation(velocity, animationEndRunnable);
}
private void setTranslation(float translation, boolean isReset, boolean animateReset) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index b6e6a11319d1..b1a42f2eeee5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -26,7 +26,9 @@ import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_RIGHT_UNL
import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.admin.DevicePolicyManager;
+import android.hardware.biometrics.BiometricSourceType;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -174,6 +176,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
private int mIndicationBottomMarginAmbient;
private float mDarkAmount;
private int mBurnInXOffset;
+ private int mBurnInYOffset;
public KeyguardBottomAreaView(Context context) {
this(context, null);
@@ -248,6 +251,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
R.dimen.keyguard_indication_margin_bottom);
mIndicationBottomMarginAmbient = getResources().getDimensionPixelSize(
R.dimen.keyguard_indication_margin_bottom_ambient);
+ mBurnInYOffset = getResources().getDimensionPixelSize(
+ R.dimen.charging_indication_burn_in_prevention_offset_y);
updateCameraVisibility();
mUnlockMethodCache = UnlockMethodCache.getInstance(getContext());
mUnlockMethodCache.addListener(this);
@@ -321,6 +326,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
R.dimen.keyguard_indication_margin_bottom);
mIndicationBottomMarginAmbient = getResources().getDimensionPixelSize(
R.dimen.keyguard_indication_margin_bottom_ambient);
+ mBurnInYOffset = getResources().getDimensionPixelSize(
+ R.dimen.charging_indication_burn_in_prevention_offset_y);
MarginLayoutParams mlp = (MarginLayoutParams) mIndicationArea.getLayoutParams();
if (mlp.bottomMargin != mIndicationBottomMargin) {
mlp.bottomMargin = mIndicationBottomMargin;
@@ -528,7 +535,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
o.setRotationAnimationHint(
WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS);
try {
- result = ActivityManager.getService().startActivityAsUser(
+ result = ActivityTaskManager.getService().startActivityAsUser(
null, getContext().getBasePackageName(),
intent,
intent.resolveTypeIfNeeded(getContext().getContentResolver()),
@@ -565,12 +572,6 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
return;
}
mDarkAmount = darkAmount;
- // Let's randomize the bottom margin every time we wake up to avoid burn-in.
- if (darkAmount == 0) {
- mIndicationBottomMarginAmbient = getResources().getDimensionPixelSize(
- R.dimen.keyguard_indication_margin_bottom_ambient)
- + (int) (Math.random() * mIndicationText.getTextSize());
- }
mIndicationArea.setAlpha(MathUtils.lerp(1f, 0.7f, darkAmount));
mIndicationArea.setTranslationY(MathUtils.lerp(0,
mIndicationBottomMargin - mIndicationBottomMarginAmbient, darkAmount));
@@ -778,7 +779,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
}
@Override
- public void onFingerprintRunningStateChanged(boolean running) {
+ public void onBiometricRunningStateChanged(boolean running,
+ BiometricSourceType biometricSourceType) {
mLockIcon.update();
}
@@ -846,8 +848,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
public void dozeTimeTick() {
if (mDarkAmount == 1) {
// Move indication every minute to avoid burn-in
- final int dozeTranslation = mIndicationBottomMargin - mIndicationBottomMarginAmbient;
- mIndicationArea.setTranslationY(dozeTranslation + (float) Math.random() * 5);
+ int dozeTranslation = mIndicationBottomMargin - mIndicationBottomMarginAmbient;
+ int burnInYOffset = (int) (-mBurnInYOffset + Math.random() * mBurnInYOffset * 2);
+ mIndicationArea.setTranslationY(dozeTranslation + burnInYOffset);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index c74d09d93fc4..2a4595b980ac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -20,6 +20,7 @@ import static com.android.keyguard.KeyguardHostView.OnDismissAction;
import static com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.os.Handler;
import android.os.UserHandle;
import android.os.UserManager;
@@ -247,9 +248,9 @@ public class KeyguardBouncer {
}
}
- public void showMessage(String message, int color) {
+ public void showMessage(String message, ColorStateList colorState) {
if (mKeyguardView != null) {
- mKeyguardView.showMessage(message, color);
+ mKeyguardView.showMessage(message, colorState);
} else {
Log.w(TAG, "Trying to show message on empty bouncer");
}
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 0bd3cc795bc3..20ea27a3f9c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -57,6 +57,9 @@ import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChange
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
/**
* The header group on Keyguard.
*/
@@ -67,6 +70,7 @@ public class KeyguardStatusBarView extends RelativeLayout
private static final int LAYOUT_CUTOUT = 1;
private static final int LAYOUT_NO_CUTOUT = 2;
+ private boolean mShowPercentAvailable;
private boolean mBatteryCharging;
private boolean mKeyguardUserSwitcherShowing;
private boolean mBatteryListening;
@@ -165,6 +169,8 @@ public class KeyguardStatusBarView extends RelativeLayout
R.dimen.system_icons_super_container_avatarless_margin_end);
mCutoutSideNudge = getResources().getDimensionPixelSize(
R.dimen.display_cutout_margin_consumption);
+ mShowPercentAvailable = getContext().getResources().getBoolean(
+ com.android.internal.R.bool.config_battery_percentage_setting_available);
}
private void updateVisibilities() {
@@ -186,7 +192,7 @@ public class KeyguardStatusBarView extends RelativeLayout
mMultiUserSwitch.setVisibility(View.GONE);
}
}
- mBatteryView.setForceShowPercent(mBatteryCharging);
+ mBatteryView.setForceShowPercent(mBatteryCharging && mShowPercentAvailable);
}
private void updateSystemIconsLayoutParams() {
@@ -434,9 +440,10 @@ public class KeyguardStatusBarView extends RelativeLayout
}
public void onThemeChanged() {
- @ColorInt int textColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
- @ColorInt int iconColor = Utils.getDefaultColor(mContext, Color.luminance(textColor) < 0.5 ?
- R.color.dark_mode_icon_color_single_tone :
+ @ColorInt int textColor = Utils.getColorAttrDefaultColor(mContext,
+ R.attr.wallpaperTextColor);
+ @ColorInt int iconColor = Utils.getColorStateListDefaultColor(mContext,
+ Color.luminance(textColor) < 0.5 ? R.color.dark_mode_icon_color_single_tone :
R.color.light_mode_icon_color_single_tone);
float intensity = textColor == Color.WHITE ? 0 : 1;
mCarrierLabel.setTextColor(iconColor);
@@ -457,4 +464,15 @@ public class KeyguardStatusBarView extends RelativeLayout
((DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
}
}
+
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("KeyguardStatusBarView:");
+ pw.println(" mBatteryCharging: " + mBatteryCharging);
+ pw.println(" mKeyguardUserSwitcherShowing: " + mKeyguardUserSwitcherShowing);
+ pw.println(" mBatteryListening: " + mBatteryListening);
+ pw.println(" mLayoutState: " + mLayoutState);
+ if (mBatteryView != null) {
+ mBatteryView.dump(fd, pw, args);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index 8b8cbfef990d..8cace7206a1f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -44,7 +44,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
private final DarkIconDispatcher mStatusBarIconController;
private final BatteryController mBatteryController;
- private FingerprintUnlockController mFingerprintUnlockController;
+ private BiometricUnlockController mBiometricUnlockController;
private LightBarTransitionsController mNavigationBarController;
private int mSystemUiVisibility;
@@ -89,9 +89,9 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
updateNavigation();
}
- public void setFingerprintUnlockController(
- FingerprintUnlockController fingerprintUnlockController) {
- mFingerprintUnlockController = fingerprintUnlockController;
+ public void setBiometricUnlockController(
+ BiometricUnlockController biometricUnlockController) {
+ mBiometricUnlockController = biometricUnlockController;
}
public void onSystemUiVisibilityChanged(int fullscreenStackVis, int dockedStackVis,
@@ -178,12 +178,12 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
}
private boolean animateChange() {
- if (mFingerprintUnlockController == null) {
+ if (mBiometricUnlockController == null) {
return false;
}
- int unlockMode = mFingerprintUnlockController.getMode();
- return unlockMode != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
- && unlockMode != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
+ int unlockMode = mBiometricUnlockController.getMode();
+ return unlockMode != BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
+ && unlockMode != BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
}
private void updateStatus(Rect fullscreenStackBounds, Rect dockedStackBounds) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index 4b66ee5aa68e..8928530c6c0e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -306,7 +306,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange
private int getState() {
KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
- boolean unlockingAllowed = updateMonitor.isUnlockingWithFingerprintAllowed();
+ boolean unlockingAllowed = updateMonitor.isUnlockingWithBiometricAllowed();
if (mTransientFpError) {
return STATE_FINGERPRINT_ERROR;
} else if (mUnlockMethodCache.canSkipBouncer()) {
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 697b2d39533e..e8ea3bed6c4e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -35,8 +35,10 @@ import android.annotation.IdRes;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
+import android.app.ActivityTaskManager;
import android.app.Fragment;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
@@ -57,7 +59,7 @@ import android.os.Message;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.util.Log;
@@ -882,7 +884,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks {
private boolean onLongPressNavigationButtons(View v, @IdRes int btnId1, @IdRes int btnId2) {
try {
boolean sendBackLongPress = false;
- IActivityManager activityManager = ActivityManagerNative.getDefault();
+ IActivityTaskManager activityManager = ActivityTaskManager.getService();
boolean touchExplorationEnabled = mAccessibilityManager.isTouchExplorationEnabled();
boolean inLockTaskMode = activityManager.isInLockTaskMode();
if (inLockTaskMode && !touchExplorationEnabled) {
@@ -936,7 +938,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks {
}
private boolean onLongPressRecents() {
- if (mRecents == null || !ActivityManager.supportsMultiWindow(getContext())
+ if (mRecents == null || !ActivityTaskManager.supportsMultiWindow(getContext())
|| !mDivider.getView().getSnapAlgorithm().isSplitScreenFeasible()
|| Recents.getConfiguration().isLowRamDevice
// If we are connected to the overview service, then disable the recents button
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
index 18e8775de21f..ed1ae1097542 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.phone;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.view.WindowManager.DOCKED_INVALID;
import static android.view.WindowManager.DOCKED_LEFT;
import static android.view.WindowManager.DOCKED_TOP;
@@ -73,7 +75,6 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture
private int mTouchDownY;
private boolean mDownOnRecents;
private VelocityTracker mVelocityTracker;
- private boolean mIsInScreenPinning;
private boolean mNotificationsVisibleOnDown;
private boolean mDockWindowEnabled;
@@ -108,7 +109,6 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture
public boolean onInterceptTouchEvent(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
- mIsInScreenPinning = mNavigationBarView.inScreenPinning();
mNotificationsVisibleOnDown = !mStatusBar.isPresenterFullyCollapsed();
}
if (!canHandleGestures()) {
@@ -216,7 +216,7 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture
&& mDivider.getView().getWindowManagerProxy().getDockSide() == DOCKED_INVALID) {
Rect initialBounds = null;
int dragMode = calculateDragMode();
- int createMode = ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+ int createMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
if (dragMode == DRAG_MODE_DIVIDER) {
initialBounds = new Rect();
mDivider.getView().calculateBoundsForPosition(mIsVertical
@@ -228,7 +228,7 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture
initialBounds);
} else if (dragMode == DRAG_MODE_RECENTS && mTouchDownX
< mContext.getResources().getDisplayMetrics().widthPixels / 2) {
- createMode = ActivityManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
+ createMode = SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
}
boolean docked = mRecentsComponent.splitPrimaryTask(dragMode, createMode,
initialBounds, MetricsEvent.ACTION_WINDOW_DOCK_SWIPE);
@@ -275,8 +275,7 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture
}
private boolean canHandleGestures() {
- return !mIsInScreenPinning && !mStatusBar.isKeyguardShowing()
- && !mNotificationsVisibleOnDown;
+ return !mStatusBar.isKeyguardShowing() && !mNotificationsVisibleOnDown;
}
private int calculateDragMode() {
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 2a1f92f5edda..6077e79942a5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone;
import static android.view.MotionEvent.ACTION_DOWN;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK;
+import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_DEAD_ZONE;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_HOME;
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_NONE;
@@ -40,7 +41,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemProperties;
-import android.support.annotation.ColorInt;
+import androidx.annotation.ColorInt;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
@@ -161,6 +162,13 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
private int mRotateBtnStyle = R.style.RotateButtonCCWStart90;
+ /**
+ * Helper that is responsible for showing the right toast when a disallowed activity operation
+ * occurred. In pinned mode, we show instructions on how to break out of this mode, whilst in
+ * fully locked mode we only show that unlocking is blocked.
+ */
+ private ScreenPinningNotify mScreenPinningNotify;
+
private class NavTransitionListener implements TransitionListener {
private boolean mBackTransitioning;
private boolean mHomeAppearing;
@@ -286,6 +294,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
mConfiguration.updateFrom(context.getResources().getConfiguration());
reloadNavIcons();
+ mScreenPinningNotify = new ScreenPinningNotify(mContext);
mBarTransitions = new NavigationBarTransitions(this);
mButtonDispatchers.put(R.id.back, new ButtonDispatcher(R.id.back));
@@ -328,15 +337,15 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
- if (shouldDeadZoneConsumeTouchEvents(event)) {
- return true;
- }
+ final boolean deadZoneConsumed = shouldDeadZoneConsumeTouchEvents(event);
switch (event.getActionMasked()) {
case ACTION_DOWN:
int x = (int) event.getX();
int y = (int) event.getY();
mDownHitTarget = HIT_TARGET_NONE;
- if (getBackButton().isVisible() && mBackButtonBounds.contains(x, y)) {
+ if (deadZoneConsumed) {
+ mDownHitTarget = HIT_TARGET_DEAD_ZONE;
+ } else if (getBackButton().isVisible() && mBackButtonBounds.contains(x, y)) {
mDownHitTarget = HIT_TARGET_BACK;
} else if (getHomeButton().isVisible() && mHomeButtonBounds.contains(x, y)) {
mDownHitTarget = HIT_TARGET_HOME;
@@ -353,9 +362,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
@Override
public boolean onTouchEvent(MotionEvent event) {
- if (shouldDeadZoneConsumeTouchEvents(event)) {
- return true;
- }
+ shouldDeadZoneConsumeTouchEvents(event);
if (mGestureHelper.onTouchEvent(event)) {
return true;
}
@@ -764,7 +771,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
showSwipeUpUI ? mQuickStepAccessibilityDelegate : null);
}
- private void updateSlippery() {
+ public void updateSlippery() {
setSlippery(!isQuickStepSwipeUpEnabled() || mPanelView.isFullyExpanded());
}
@@ -830,8 +837,8 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme);
Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme);
Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme);
- final int lightColor = Utils.getColorAttr(lightContext, R.attr.singleToneColor);
- final int darkColor = Utils.getColorAttr(darkContext, R.attr.singleToneColor);
+ final int lightColor = Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor);
+ final int darkColor = Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor);
// Use the supplied style to set the icon's rotation parameters
Context rotateContext = new ContextThemeWrapper(ctx, style);
@@ -983,6 +990,18 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
mBarTransitions.reapplyDarkIntensity();
}
+ public void showPinningEnterExitToast(boolean entering) {
+ if (entering) {
+ mScreenPinningNotify.showPinningStartToast();
+ } else {
+ mScreenPinningNotify.showPinningExitToast();
+ }
+ }
+
+ public void showPinningEscapeToast() {
+ mScreenPinningNotify.showEscapeToast(isRecentsButtonVisible());
+ }
+
public boolean isVertical() {
return mVertical;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
index e5083c144114..09833d44915d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
@@ -17,7 +17,7 @@ package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Rect;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
index 55ffb3e62e53..8858381af668 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java
@@ -19,7 +19,7 @@ package com.android.systemui.statusbar.phone;
import android.app.Notification;
import android.os.SystemClock;
import android.service.notification.StatusBarNotification;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.util.Log;
import com.android.systemui.statusbar.ExpandableNotificationRow;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index 44d666eb0d65..a5b56eb9aa1c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -4,14 +4,14 @@ import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.v4.util.ArrayMap;
+import androidx.annotation.NonNull;
+import androidx.collection.ArrayMap;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.ExpandableNotificationRow;
@@ -32,7 +32,7 @@ import java.util.function.Function;
* normally reserved for notifications.
*/
public class NotificationIconAreaController implements DarkReceiver {
- private final NotificationColorUtil mNotificationColorUtil;
+ private final ContrastColorUtil mContrastColorUtil;
private final NotificationEntryManager mEntryManager;
private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons;
@@ -47,10 +47,12 @@ public class NotificationIconAreaController implements DarkReceiver {
private final Rect mTintArea = new Rect();
private NotificationStackScrollLayout mNotificationScrollLayout;
private Context mContext;
+ private boolean mFullyDark;
+ private boolean mHasShelfIconsWhenFullyDark;
public NotificationIconAreaController(Context context, StatusBar statusBar) {
mStatusBar = statusBar;
- mNotificationColorUtil = NotificationColorUtil.getInstance(context);
+ mContrastColorUtil = ContrastColorUtil.getInstance(context);
mContext = context;
mEntryManager = Dependency.get(NotificationEntryManager.class);
@@ -173,13 +175,40 @@ public class NotificationIconAreaController implements DarkReceiver {
public void updateNotificationIcons() {
updateStatusBarIcons();
- updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons,
- NotificationShelf.SHOW_AMBIENT_ICONS, false /* hideDismissed */,
- false /* hideRepliedMessages */);
+ updateShelfIcons();
+ updateHasShelfIconsWhenFullyDark();
applyNotificationIconsTint();
}
+ private void updateHasShelfIconsWhenFullyDark() {
+ boolean hasIconsWhenFullyDark = false;
+ for (int i = 0; i < mNotificationScrollLayout.getChildCount(); i++) {
+ View view = mNotificationScrollLayout.getChildAt(i);
+ if (view instanceof ExpandableNotificationRow) {
+ NotificationData.Entry ent = ((ExpandableNotificationRow) view).getEntry();
+ if (shouldShowNotificationIcon(ent,
+ NotificationShelf.SHOW_AMBIENT_ICONS /* showAmbient */,
+ false /* hideDismissed */,
+ true /* hideReplied */)) {
+ hasIconsWhenFullyDark = true;
+ break;
+ }
+ }
+ }
+ mHasShelfIconsWhenFullyDark = hasIconsWhenFullyDark;
+ }
+
+ public boolean hasShelfIconsWhenFullyDark() {
+ return mHasShelfIconsWhenFullyDark;
+ }
+
+ private void updateShelfIcons() {
+ updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons,
+ NotificationShelf.SHOW_AMBIENT_ICONS, false /* hideDismissed */,
+ mFullyDark /* hideRepliedMessages */);
+ }
+
public void updateStatusBarIcons() {
updateIconsForLayout(entry -> entry.icon, mNotificationIcons,
false /* showAmbient */, true /* hideDismissed */, true /* hideRepliedMessages */);
@@ -312,7 +341,7 @@ public class NotificationIconAreaController implements DarkReceiver {
private void updateTintForIcon(StatusBarIconView v) {
boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L));
int color = StatusBarIconView.NO_COLOR;
- boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mNotificationColorUtil);
+ boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mContrastColorUtil);
if (colorize) {
color = DarkIconDispatcher.getTint(mTintArea, v, mIconTint);
}
@@ -320,6 +349,11 @@ public class NotificationIconAreaController implements DarkReceiver {
v.setDecorColor(mIconTint);
}
+ public void setFullyDark(boolean fullyDark) {
+ mFullyDark = fullyDark;
+ updateShelfIcons();
+ }
+
public void setDark(boolean dark) {
mNotificationIcons.setDark(dark, false, 0);
mShelfIcons.setDark(dark, false, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 5dee2a6000c7..653471d8a220 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -26,7 +26,7 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Icon;
-import android.support.v4.util.ArrayMap;
+import androidx.collection.ArrayMap;
import android.util.AttributeSet;
import android.view.View;
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 2f18aad9612d..240d467936b3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -47,6 +47,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.accessibility.AccessibilityManager;
+import android.view.animation.Interpolator;
import android.widget.FrameLayout;
import com.android.internal.logging.MetricsLogger;
@@ -77,6 +78,8 @@ import com.android.systemui.statusbar.stack.AnimationProperties;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.StackStateAnimator;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
@@ -107,17 +110,20 @@ public class NotificationPanelView extends PanelView implements
private static final AnimationProperties CLOCK_ANIMATION_PROPERTIES = new AnimationProperties()
.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
private static final FloatProperty<NotificationPanelView> SET_DARK_AMOUNT_PROPERTY =
- new FloatProperty<NotificationPanelView>("mDarkAmount") {
+ new FloatProperty<NotificationPanelView>("mInterpolatedDarkAmount") {
+
@Override
public void setValue(NotificationPanelView object, float value) {
- object.setDarkAmount(value);
+ object.setDarkAmount(value, object.mDarkInterpolator.getInterpolation(value));
}
@Override
public Float get(NotificationPanelView object) {
- return object.mDarkAmount;
+ return object.mLinearDarkAmount;
}
};
+
+ private Interpolator mDarkInterpolator;
private final PowerManager mPowerManager;
private final AccessibilityManager mAccessibilityManager;
@@ -221,6 +227,7 @@ public class NotificationPanelView extends PanelView implements
private boolean mClosingWithAlphaFadeOut;
private boolean mHeadsUpAnimatingAway;
private boolean mLaunchingAffordance;
+ private boolean mAffordanceHasPreview;
private FalsingManager mFalsingManager;
private String mLastCameraLaunchSource = KeyguardBottomAreaView.CAMERA_LAUNCH_SOURCE_AFFORDANCE;
@@ -236,7 +243,18 @@ public class NotificationPanelView extends PanelView implements
private int mIndicationBottomPadding;
private int mAmbientIndicationBottomPadding;
private boolean mIsFullWidth;
- private float mDarkAmount;
+
+ /**
+ * Current dark amount that follows regular interpolation curve of animation.
+ */
+ private float mInterpolatedDarkAmount;
+
+ /**
+ * Dark amount that animates from 0 to 1 or vice-versa in linear manner, even if the
+ * interpolation curve is different.
+ */
+ private float mLinearDarkAmount;
+
private float mDarkAmountTarget;
private boolean mPulsing;
private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
@@ -391,7 +409,7 @@ public class NotificationPanelView extends PanelView implements
false);
addView(mKeyguardBottomArea, index);
initBottomArea();
- setDarkAmount(mDarkAmount);
+ setDarkAmount(mLinearDarkAmount, mInterpolatedDarkAmount);
setKeyguardStatusViewVisibility(mStatusBarState, false, false);
setKeyguardBottomAreaVisibility(mStatusBarState, false);
@@ -505,7 +523,7 @@ public class NotificationPanelView extends PanelView implements
getExpandedFraction(),
totalHeight,
mKeyguardStatusView.getHeight(),
- mDarkAmount,
+ mInterpolatedDarkAmount,
mStatusBar.isKeyguardCurrentlySecure(),
mPulsing,
mBouncerTop);
@@ -1916,7 +1934,7 @@ public class NotificationPanelView extends PanelView implements
if (view == null && mQsExpanded) {
return;
}
- if (needsAnimation && mDarkAmount == 0) {
+ if (needsAnimation && mInterpolatedDarkAmount == 0) {
mAnimateNextPositionUpdate = true;
}
ExpandableView firstChildNotGone = mNotificationStackScroller.getFirstChildNotGone();
@@ -2489,7 +2507,7 @@ public class NotificationPanelView extends PanelView implements
}
protected void setVerticalPanelTranslation(float translation) {
- mNotificationStackScroller.setTranslationX(translation);
+ mNotificationStackScroller.setVerticalPanelTranslation(translation);
mQsFrame.setTranslationX(translation);
int size = mVerticalTranslationListener.size();
for (int i = 0; i < size; i++) {
@@ -2515,7 +2533,8 @@ public class NotificationPanelView extends PanelView implements
}
private void updateStatusBarIcons() {
- boolean showIconsWhenExpanded = isFullWidth() && getExpandedHeight() < getOpeningHeight();
+ boolean showIconsWhenExpanded = (isPanelVisibleBecauseOfHeadsUp() || isFullWidth())
+ && getExpandedHeight() < getOpeningHeight();
if (showIconsWhenExpanded && mNoVisibleNotifications && isOnKeyguard()) {
showIconsWhenExpanded = false;
}
@@ -2569,6 +2588,7 @@ public class NotificationPanelView extends PanelView implements
} else {
animate = false;
}
+ mAffordanceHasPreview = mKeyguardBottomArea.getRightPreview() != null;
mAffordanceHelper.launchAffordance(animate, getLayoutDirection() == LAYOUT_DIRECTION_RTL);
}
@@ -2614,6 +2634,13 @@ public class NotificationPanelView extends PanelView implements
}
/**
+ * Return true when a bottom affordance is launching an occluded activity with a splash screen.
+ */
+ public boolean isLaunchingAffordanceWithPreview() {
+ return mLaunchingAffordance && mAffordanceHasPreview;
+ }
+
+ /**
* Whether the camera application can be launched for the camera launch gesture.
*
* @param keyguardIsShowing whether keyguard is being shown
@@ -2718,31 +2745,40 @@ public class NotificationPanelView extends PanelView implements
}
mDarkAmountTarget = darkAmount;
if (animate) {
+ if (mInterpolatedDarkAmount == 0f || mInterpolatedDarkAmount == 1f) {
+ mDarkInterpolator = dozing
+ ? Interpolators.FAST_OUT_SLOW_IN
+ : Interpolators.TOUCH_RESPONSE_REVERSE;
+ }
+ mNotificationStackScroller.notifyDarkAnimationStart(dozing);
mDarkAnimator = ObjectAnimator.ofFloat(this, SET_DARK_AMOUNT_PROPERTY, darkAmount);
- mDarkAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
- mDarkAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
+ mDarkAnimator.setInterpolator(Interpolators.LINEAR);
+ mDarkAnimator.setDuration(mNotificationStackScroller.getDarkAnimationDuration(dozing));
mDarkAnimator.start();
} else {
- setDarkAmount(darkAmount);
+ setDarkAmount(darkAmount, darkAmount);
}
}
- private void setDarkAmount(float amount) {
- mDarkAmount = amount;
- mKeyguardStatusView.setDarkAmount(mDarkAmount);
- mKeyguardBottomArea.setDarkAmount(mDarkAmount);
+ private void setDarkAmount(float linearAmount, float amount) {
+ mInterpolatedDarkAmount = amount;
+ mLinearDarkAmount = linearAmount;
+ mKeyguardStatusView.setDarkAmount(mInterpolatedDarkAmount);
+ mKeyguardBottomArea.setDarkAmount(mInterpolatedDarkAmount);
positionClockAndNotifications();
+ mNotificationStackScroller.setDarkAmount(linearAmount, mInterpolatedDarkAmount);
}
public void setPulsing(boolean pulsing) {
mPulsing = pulsing;
- final boolean canAnimatePulse =
- !DozeParameters.getInstance(mContext).getDisplayNeedsBlanking();
- if (canAnimatePulse) {
+ DozeParameters dozeParameters = DozeParameters.getInstance(mContext);
+ final boolean animatePulse = !dozeParameters.getDisplayNeedsBlanking()
+ && dozeParameters.getAlwaysOn();
+ if (animatePulse) {
mAnimateNextPositionUpdate = true;
}
- mNotificationStackScroller.setPulsing(pulsing, canAnimatePulse);
- mKeyguardStatusView.setPulsing(pulsing, canAnimatePulse);
+ mNotificationStackScroller.setPulsing(pulsing, animatePulse);
+ mKeyguardStatusView.setPulsing(pulsing, animatePulse);
}
public void setAmbientIndicationBottomPadding(int ambientIndicationBottomPadding) {
@@ -2755,7 +2791,7 @@ public class NotificationPanelView extends PanelView implements
public void dozeTimeTick() {
mKeyguardStatusView.dozeTimeTick();
mKeyguardBottomArea.dozeTimeTick();
- if (mDarkAmount > 0) {
+ if (mInterpolatedDarkAmount > 0) {
positionClockAndNotifications();
}
}
@@ -2827,4 +2863,12 @@ public class NotificationPanelView extends PanelView implements
setKeyguardStatusViewVisibility(mStatusBarState, true /* keyguardFadingAway */,
false /* goingToFullShade */);
}
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ super.dump(fd, pw, args);
+ if (mKeyguardStatusBar != null) {
+ mKeyguardStatusBar.dump(fd, pw, args);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java
index 76cc0ff2a2e1..641f485690f6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java
@@ -20,7 +20,7 @@ import android.app.Fragment;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Canvas;
-import android.support.annotation.DimenRes;
+import androidx.annotation.DimenRes;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewStub;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
index c4d7e72c0d82..5d234947de29 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
@@ -17,6 +17,8 @@
package com.android.systemui.statusbar.phone;
import android.content.Context;
+import android.os.Bundle;
+import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
@@ -27,8 +29,11 @@ public abstract class PanelBar extends FrameLayout {
public static final boolean DEBUG = false;
public static final String TAG = PanelBar.class.getSimpleName();
private static final boolean SPEW = false;
+ private static final String PANEL_BAR_SUPER_PARCELABLE = "panel_bar_super_parcelable";
+ private static final String STATE = "state";
private boolean mBouncerShowing;
private boolean mExpanded;
+ protected float mPanelFraction;
public static final void LOG(String fmt, Object... args) {
if (!DEBUG) return;
@@ -48,8 +53,26 @@ public abstract class PanelBar extends FrameLayout {
mState = state;
}
- public int getState() {
- return mState;
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(PANEL_BAR_SUPER_PARCELABLE, super.onSaveInstanceState());
+ bundle.putInt(STATE, mState);
+ return bundle;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ if (state == null || !(state instanceof Bundle)) {
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ Bundle bundle = (Bundle) state;
+ super.onRestoreInstanceState(bundle.getParcelable(PANEL_BAR_SUPER_PARCELABLE));
+ if (((Bundle) state).containsKey(STATE)) {
+ go(bundle.getInt(STATE, STATE_CLOSED));
+ }
}
public PanelBar(Context context, AttributeSet attrs) {
@@ -77,6 +100,14 @@ public abstract class PanelBar extends FrameLayout {
if (mPanel != null) mPanel.setImportantForAccessibility(important);
}
+ public float getExpansionFraction() {
+ return mPanelFraction;
+ }
+
+ public boolean isExpanded() {
+ return mExpanded;
+ }
+
private void updateVisibility() {
mPanel.setVisibility(mExpanded || mBouncerShowing ? VISIBLE : INVISIBLE);
}
@@ -131,6 +162,7 @@ public abstract class PanelBar extends FrameLayout {
if (SPEW) LOG("panelExpansionChanged: start state=%d", mState);
PanelView pv = mPanel;
mExpanded = expanded;
+ mPanelFraction = frac;
updateVisibility();
// adjust any other panels that may be partially visible
if (expanded) {
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 e9c0f5d8afb1..57e01e7cd4f6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -23,6 +23,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND
import android.app.ActivityManager;
import android.app.ActivityManager.StackInfo;
+import android.app.ActivityTaskManager;
import android.app.AlarmManager;
import android.app.AlarmManager.AlarmClockInfo;
import android.app.AppGlobals;
@@ -505,7 +506,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
mUiOffloadThread.submit(() -> {
final int userId;
try {
- userId = ActivityManager.getService().getLastResumedActivityUserId();
+ userId = ActivityTaskManager.getService().getLastResumedActivityUserId();
boolean isManagedProfile = mUserManager.isManagedProfile(userId);
mHandler.post(() -> {
final boolean showIcon;
@@ -536,7 +537,8 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
mCurrentNotifs.clear();
mUiOffloadThread.submit(() -> {
try {
- final StackInfo focusedStack = ActivityManager.getService().getFocusedStackInfo();
+ final StackInfo focusedStack =
+ ActivityTaskManager.getService().getFocusedStackInfo();
if (focusedStack != null) {
final int windowingMode =
focusedStack.configuration.windowConfiguration.getWindowingMode();
@@ -562,7 +564,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
ArraySet<Pair<String, Integer>> notifs, NotificationManager noMan, IPackageManager pm) {
try {
final StackInfo info =
- ActivityManager.getService().getStackInfo(windowingMode, activityType);
+ ActivityTaskManager.getService().getStackInfo(windowingMode, activityType);
checkStack(info, notifs, noMan, pm);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
@@ -625,7 +627,6 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
.putExtra(Intent.EXTRA_PACKAGE_NAME, appInfo.packageName)
.putExtra(Intent.EXTRA_VERSION_CODE, (int) (appInfo.versionCode & 0x7fffffff))
.putExtra(Intent.EXTRA_LONG_VERSION_CODE, appInfo.versionCode)
- .putExtra(Intent.EXTRA_EPHEMERAL_FAILURE, pendingIntent)
.putExtra(Intent.EXTRA_INSTANT_APP_FAILURE, pendingIntent);
PendingIntent webPendingIntent = PendingIntent.getActivity(mContext, 0, goToWebIntent, 0);
@@ -652,7 +653,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
private Intent getTaskIntent(int taskId, int userId) {
try {
final List<ActivityManager.RecentTaskInfo> tasks =
- ActivityManager.getService().getRecentTasks(
+ ActivityTaskManager.getService().getRecentTasks(
NUM_TASKS_FOR_INSTANT_APP_INFO, 0, userId).getList();
for (int i = 0; i < tasks.size(); i++) {
if (tasks.get(i).id == taskId) {
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 5477f882e5f9..59863ecb1191 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -59,7 +59,6 @@ public class PhoneStatusBarView extends PanelBar {
private final PhoneStatusBarTransitions mBarTransitions;
private ScrimController mScrimController;
private float mMinFraction;
- private float mPanelFraction;
private Runnable mHideExpandedRunnable = new Runnable() {
@Override
public void run() {
@@ -269,7 +268,6 @@ public class PhoneStatusBarView extends PanelBar {
@Override
public void panelExpansionChanged(float frac, boolean expanded) {
super.panelExpansionChanged(frac, expanded);
- mPanelFraction = frac;
updateScrimFraction();
if ((frac == 0 || frac == 1) && mBar.getNavigationBarView() != null) {
mBar.getNavigationBarView().onPanelExpandedChange(expanded);
@@ -331,30 +329,25 @@ public class PhoneStatusBarView extends PanelBar {
// or letterboxing from the right or left sides.
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
- if (mDisplayCutout == null) {
+ if (mDisplayCutout == null || mDisplayCutout.isEmpty()
+ || mLastOrientation != ORIENTATION_PORTRAIT || cornerCutoutMargins == null) {
lp.leftMargin = 0;
lp.rightMargin = 0;
return;
}
- lp.leftMargin = mDisplayCutout.getSafeInsetLeft();
- lp.rightMargin = mDisplayCutout.getSafeInsetRight();
-
- if (cornerCutoutMargins != null) {
- lp.leftMargin = Math.max(lp.leftMargin, cornerCutoutMargins.first);
- lp.rightMargin = Math.max(lp.rightMargin, cornerCutoutMargins.second);
-
- // If we're already inset enough (e.g. on the status bar side), we can have 0 margin
- WindowInsets insets = getRootWindowInsets();
- int leftInset = insets.getSystemWindowInsetLeft();
- int rightInset = insets.getSystemWindowInsetRight();
- if (lp.leftMargin <= leftInset) {
- lp.leftMargin = 0;
- }
- if (lp.rightMargin <= rightInset) {
- lp.rightMargin = 0;
- }
+ lp.leftMargin = Math.max(lp.leftMargin, cornerCutoutMargins.first);
+ lp.rightMargin = Math.max(lp.rightMargin, cornerCutoutMargins.second);
+ // If we're already inset enough (e.g. on the status bar side), we can have 0 margin
+ WindowInsets insets = getRootWindowInsets();
+ int leftInset = insets.getSystemWindowInsetLeft();
+ int rightInset = insets.getSystemWindowInsetRight();
+ if (lp.leftMargin <= leftInset) {
+ lp.leftMargin = 0;
+ }
+ if (lp.rightMargin <= rightInset) {
+ lp.rightMargin = 0;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
index 860b77e1b251..2516a9b2ffec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
@@ -22,20 +22,21 @@ import static com.android.systemui.Interpolators.ALPHA_IN;
import static com.android.systemui.Interpolators.ALPHA_OUT;
import static com.android.systemui.OverviewProxyService.DEBUG_OVERVIEW_PROXY;
import static com.android.systemui.OverviewProxyService.TAG_OPS;
+import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_DEAD_ZONE;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
-import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
-import android.graphics.Color;
import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.RadialGradient;
import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
+import android.graphics.Shader;
import android.os.Handler;
import android.os.RemoteException;
import android.util.FloatProperty;
@@ -46,7 +47,7 @@ import android.view.View;
import android.view.WindowManagerGlobal;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
-import android.support.annotation.DimenRes;
+import androidx.annotation.DimenRes;
import com.android.systemui.Dependency;
import com.android.systemui.OverviewProxyService;
import com.android.systemui.R;
@@ -54,7 +55,6 @@ import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper;
import com.android.systemui.shared.recents.IOverviewProxy;
import com.android.systemui.shared.recents.utilities.Utilities;
import com.android.systemui.shared.system.NavigationBarCompat;
-import com.android.internal.graphics.ColorUtils;
/**
* Class to detect gestures on the navigation bar and implement quick scrub.
@@ -65,6 +65,7 @@ public class QuickStepController implements GestureHelper {
private static final int ANIM_IN_DURATION_MS = 150;
private static final int ANIM_OUT_DURATION_MS = 134;
private static final float TRACK_SCALE = 0.95f;
+ private static final float GRADIENT_WIDTH = .75f;
private NavigationBarView mNavigationBarView;
@@ -78,23 +79,23 @@ public class QuickStepController implements GestureHelper {
private boolean mIsRTL;
private float mTrackAlpha;
private float mTrackScale = TRACK_SCALE;
- private int mLightTrackColor;
- private int mDarkTrackColor;
private float mDarkIntensity;
+ private RadialGradient mHighlight;
+ private float mHighlightCenter;
private AnimatorSet mTrackAnimator;
private ButtonDispatcher mHitTarget;
private View mCurrentNavigationBarView;
+ private boolean mIsInScreenPinning;
private final Handler mHandler = new Handler();
private final Rect mTrackRect = new Rect();
- private final Drawable mTrackDrawable;
private final OverviewProxyService mOverviewEventSender;
private final int mTrackThickness;
private final int mTrackEndPadding;
private final Context mContext;
private final Matrix mTransformGlobalMatrix = new Matrix();
private final Matrix mTransformLocalMatrix = new Matrix();
- private final ArgbEvaluator mTrackColorEvaluator = new ArgbEvaluator();
+ private final Paint mTrackPaint = new Paint();
private final FloatProperty<QuickStepController> mTrackAlphaProperty =
new FloatProperty<QuickStepController>("TrackAlpha") {
@@ -155,7 +156,8 @@ public class QuickStepController implements GestureHelper {
mOverviewEventSender = Dependency.get(OverviewProxyService.class);
mTrackThickness = res.getDimensionPixelSize(R.dimen.nav_quick_scrub_track_thickness);
mTrackEndPadding = res.getDimensionPixelSize(R.dimen.nav_quick_scrub_track_edge_padding);
- mTrackDrawable = context.getDrawable(R.drawable.qs_scrubber_track).mutate();
+ mTrackPaint.setAntiAlias(true);
+ mTrackPaint.setDither(true);
}
public void setComponents(NavigationBarView navigationBarView) {
@@ -184,6 +186,8 @@ public class QuickStepController implements GestureHelper {
}
private boolean handleTouchEvent(MotionEvent event) {
+ final boolean deadZoneConsumed =
+ mNavigationBarView.getDownHitTarget() == HIT_TARGET_DEAD_ZONE;
if (mOverviewEventSender.getProxy() == null || (!mNavigationBarView.isQuickScrubEnabled()
&& !mNavigationBarView.isQuickStepSwipeUpEnabled())) {
return false;
@@ -195,6 +199,7 @@ public class QuickStepController implements GestureHelper {
case MotionEvent.ACTION_DOWN: {
int x = (int) event.getX();
int y = (int) event.getY();
+ mIsInScreenPinning = mNavigationBarView.inScreenPinning();
// End any existing quickscrub animations before starting the new transition
if (mTrackAnimator != null) {
@@ -287,6 +292,8 @@ public class QuickStepController implements GestureHelper {
} catch (RemoteException e) {
Log.e(TAG, "Failed to send progress of quick scrub.", e);
}
+ mHighlightCenter = x;
+ mNavigationBarView.invalidate();
}
break;
}
@@ -298,11 +305,11 @@ public class QuickStepController implements GestureHelper {
// Proxy motion events to launcher if not handled by quick scrub
// Proxy motion events up/cancel that would be sent after long press on any nav button
- if (!mQuickScrubActive && (mAllowGestureDetection || action == MotionEvent.ACTION_CANCEL
- || action == MotionEvent.ACTION_UP)) {
+ if (!mQuickScrubActive && !mIsInScreenPinning && (mAllowGestureDetection
+ || action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP)) {
proxyMotionEvents(event);
}
- return mQuickScrubActive || mQuickStepStarted;
+ return mQuickScrubActive || mQuickStepStarted || deadZoneConsumed;
}
@Override
@@ -310,18 +317,18 @@ public class QuickStepController implements GestureHelper {
if (!mNavigationBarView.isQuickScrubEnabled()) {
return;
}
- int color = (int) mTrackColorEvaluator.evaluate(mDarkIntensity, mLightTrackColor,
- mDarkTrackColor);
- int colorAlpha = ColorUtils.setAlphaComponent(color,
- (int) (Color.alpha(color) * mTrackAlpha));
- mTrackDrawable.setTint(colorAlpha);
+ mTrackPaint.setAlpha(Math.round(255f * mTrackAlpha));
// Scale the track, but apply the inverse scale from the nav bar
+ final float radius = mTrackRect.height() / 2;
canvas.save();
+ float translate = Utilities.clamp(mHighlightCenter, mTrackRect.left, mTrackRect.right);
+ canvas.translate(translate, 0);
canvas.scale(mTrackScale / mNavigationBarView.getScaleX(),
1f / mNavigationBarView.getScaleY(),
mTrackRect.centerX(), mTrackRect.centerY());
- mTrackDrawable.draw(canvas);
+ canvas.drawRoundRect(mTrackRect.left - translate, mTrackRect.top,
+ mTrackRect.right - translate, mTrackRect.bottom, radius, radius, mTrackPaint);
canvas.restore();
}
@@ -346,12 +353,20 @@ public class QuickStepController implements GestureHelper {
x2 = x1 + width - 2 * mTrackEndPadding;
}
mTrackRect.set(x1, y1, x2, y2);
- mTrackDrawable.setBounds(mTrackRect);
+ updateHighlight();
}
@Override
public void onDarkIntensityChange(float intensity) {
+ final float oldIntensity = mDarkIntensity;
mDarkIntensity = intensity;
+
+ // When in quick scrub, invalidate gradient if changing intensity from black to white and
+ // vice-versa
+ if (mNavigationBarView.isQuickScrubEnabled()
+ && Math.round(intensity) != Math.round(oldIntensity)) {
+ updateHighlight();
+ }
mNavigationBarView.invalidate();
}
@@ -382,6 +397,12 @@ public class QuickStepController implements GestureHelper {
}
private void startQuickStep(MotionEvent event) {
+ if (mIsInScreenPinning) {
+ mNavigationBarView.showPinningEscapeToast();
+ mAllowGestureDetection = false;
+ return;
+ }
+
mQuickStepStarted = true;
event.transform(mTransformGlobalMatrix);
try {
@@ -407,11 +428,15 @@ public class QuickStepController implements GestureHelper {
}
private void startQuickScrub() {
+ if (mIsInScreenPinning) {
+ mNavigationBarView.showPinningEscapeToast();
+ mAllowGestureDetection = false;
+ return;
+ }
+
if (!mQuickScrubActive) {
+ updateHighlight();
mQuickScrubActive = true;
- mLightTrackColor = mContext.getColor(R.color.quick_step_track_background_light);
- mDarkTrackColor = mContext.getColor(R.color.quick_step_track_background_dark);
-
ObjectAnimator trackAnimator = ObjectAnimator.ofPropertyValuesHolder(this,
PropertyValuesHolder.ofFloat(mTrackAlphaProperty, 1f),
PropertyValuesHolder.ofFloat(mTrackScaleProperty, 1f));
@@ -424,6 +449,9 @@ public class QuickStepController implements GestureHelper {
mTrackAnimator.playTogether(trackAnimator, navBarAnimator);
mTrackAnimator.start();
+ // Disable slippery for quick scrub to not cancel outside the nav bar
+ mNavigationBarView.updateSlippery();
+
try {
mOverviewEventSender.getProxy().onQuickScrubStart();
if (DEBUG_OVERVIEW_PROXY) {
@@ -483,6 +511,25 @@ public class QuickStepController implements GestureHelper {
mQuickScrubActive = false;
mAllowGestureDetection = false;
mCurrentNavigationBarView = null;
+ updateHighlight();
+ }
+
+ private void updateHighlight() {
+ if (mTrackRect.isEmpty()) {
+ return;
+ }
+ int colorBase, colorGrad;
+ if (mDarkIntensity > 0.5f) {
+ colorBase = mContext.getColor(R.color.quick_step_track_background_background_dark);
+ colorGrad = mContext.getColor(R.color.quick_step_track_background_foreground_dark);
+ } else {
+ colorBase = mContext.getColor(R.color.quick_step_track_background_background_light);
+ colorGrad = mContext.getColor(R.color.quick_step_track_background_foreground_light);
+ }
+ mHighlight = new RadialGradient(0, mTrackRect.height() / 2,
+ mTrackRect.width() * GRADIENT_WIDTH, colorGrad, colorBase,
+ Shader.TileMode.CLAMP);
+ mTrackPaint.setShader(mHighlight);
}
private boolean proxyMotionEvents(MotionEvent event) {
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 279ede914fa7..5b42d5e31c0a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -29,9 +29,7 @@ import android.os.Handler;
import android.os.Trace;
import android.util.Log;
import android.util.MathUtils;
-import android.view.Choreographer;
import android.view.View;
-import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
@@ -43,12 +41,11 @@ import com.android.internal.colorextraction.ColorExtractor.OnColorsChangedListen
import com.android.internal.graphics.ColorUtils;
import com.android.internal.util.function.TriConsumer;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.colorextraction.SysuiColorExtractor;
-import com.android.systemui.statusbar.ExpandableNotificationRow;
-import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.stack.ViewState;
import com.android.systemui.util.AlarmTimeout;
@@ -116,6 +113,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final DozeParameters mDozeParameters;
private final AlarmTimeout mTimeTicker;
+ private final KeyguardVisibilityCallback mKeyguardVisibilityCallback;
private final SysuiColorExtractor mColorExtractor;
private GradientColors mLockColors;
@@ -174,6 +172,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
mUnlockMethodCache = UnlockMethodCache.getInstance(mContext);
mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer();
mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardVisibilityCallback = new KeyguardVisibilityCallback();
+ mKeyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback);
mScrimBehindAlphaResValue = mContext.getResources().getFloat(R.dimen.scrim_behind_alpha);
mTimeTicker = new AlarmTimeout(alarmManager, this::onHideWallpaperTimeout,
"hide_aod_wallpaper", new Handler());
@@ -463,7 +463,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
if (mState == ScrimState.AOD && mDozeParameters.getAlwaysOn()
&& mCurrentInFrontAlpha != alpha) {
mCurrentInFrontAlpha = alpha;
- scheduleUpdate();
+ updateScrims();
}
mState.AOD.setAodFrontScrimAlpha(alpha);
@@ -482,21 +482,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
// Make sure we have the right gradients and their opacities will satisfy GAR.
if (mNeedsDrawableColorUpdate) {
mNeedsDrawableColorUpdate = false;
- final GradientColors currentScrimColors;
- if (mState == ScrimState.KEYGUARD || mState == ScrimState.BOUNCER_SCRIMMED
- || mState == ScrimState.BOUNCER) {
- // Always animate color changes if we're seeing the keyguard
- mScrimInFront.setColors(mLockColors, true /* animated */);
- mScrimBehind.setColors(mLockColors, true /* animated */);
- currentScrimColors = mLockColors;
- } else {
- // Only animate scrim color if the scrim view is actually visible
- boolean animateScrimInFront = mScrimInFront.getViewAlpha() != 0;
- boolean animateScrimBehind = mScrimBehind.getViewAlpha() != 0;
- mScrimInFront.setColors(mSystemColors, animateScrimInFront);
- mScrimBehind.setColors(mSystemColors, animateScrimBehind);
- currentScrimColors = mSystemColors;
- }
+ boolean isKeyguard = mKeyguardUpdateMonitor.isKeyguardVisible() && !mKeyguardOccluded;
+ GradientColors currentScrimColors = isKeyguard ? mLockColors : mSystemColors;
+ // Only animate scrim color if the scrim view is actually visible
+ boolean animateScrimInFront = mScrimInFront.getViewAlpha() != 0 && !mBlankScreen;
+ boolean animateScrimBehind = mScrimBehind.getViewAlpha() != 0 && !mBlankScreen;
+ mScrimInFront.setColors(currentScrimColors, animateScrimInFront);
+ mScrimBehind.setColors(currentScrimColors, animateScrimBehind);
// Calculate minimum scrim opacity for white or black text.
int textColor = currentScrimColors.supportsDarkText() ? Color.BLACK : Color.WHITE;
@@ -899,6 +891,28 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
updateScrims();
}
+ public void setHasBackdrop(boolean hasBackdrop) {
+ for (ScrimState state : ScrimState.values()) {
+ state.setHasBackdrop(hasBackdrop);
+ }
+
+ // Backdrop event may arrive after state was already applied,
+ // in this case, back-scrim needs to be re-evaluated
+ if (mState == ScrimState.AOD || mState == ScrimState.PULSING) {
+ float newBehindAlpha = mState.getBehindAlpha(mNotificationDensity);
+ if (mCurrentBehindAlpha != newBehindAlpha) {
+ mCurrentBehindAlpha = newBehindAlpha;
+ updateScrims();
+ }
+ }
+ }
+
+ public void setLaunchingAffordanceWithPreview(boolean launchingAffordanceWithPreview) {
+ for (ScrimState state : ScrimState.values()) {
+ state.setLaunchingAffordanceWithPreview(launchingAffordanceWithPreview);
+ }
+ }
+
public interface Callback {
default void onStart() {
}
@@ -909,4 +923,16 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
default void onCancelled() {
}
}
+
+ /**
+ * Simple keyguard callback that updates scrims when keyguard visibility changes.
+ */
+ private class KeyguardVisibilityCallback extends KeyguardUpdateMonitorCallback {
+
+ @Override
+ public void onKeyguardVisibilityChanged(boolean showing) {
+ mNeedsDrawableColorUpdate = true;
+ scheduleUpdate();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index 713356bc2381..081ebfac5f1b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -20,7 +20,6 @@ import android.graphics.Color;
import android.os.Trace;
import android.util.MathUtils;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.stack.StackStateAnimator;
@@ -106,8 +105,6 @@ public enum ScrimState {
public void prepare(ScrimState previousState) {
final boolean alwaysOnEnabled = mDozeParameters.getAlwaysOn();
mBlankScreen = mDisplayRequiresBlanking;
- mCurrentBehindAlpha = mWallpaperSupportsAmbientMode
- && !mKeyguardUpdateMonitor.hasLockscreenWallpaper() ? 0f : 1f;
mCurrentInFrontAlpha = alwaysOnEnabled ? mAodFrontScrimAlpha : 1f;
mCurrentInFrontTint = Color.BLACK;
mCurrentBehindTint = Color.BLACK;
@@ -118,6 +115,11 @@ public enum ScrimState {
}
@Override
+ public float getBehindAlpha(float busyness) {
+ return mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f : 1f;
+ }
+
+ @Override
public boolean isLowPowerState() {
return true;
}
@@ -131,11 +133,14 @@ public enum ScrimState {
public void prepare(ScrimState previousState) {
mCurrentInFrontAlpha = 0;
mCurrentInFrontTint = Color.BLACK;
- mCurrentBehindAlpha = mWallpaperSupportsAmbientMode
- && !mKeyguardUpdateMonitor.hasLockscreenWallpaper() ? 0f : 1f;
mCurrentBehindTint = Color.BLACK;
mBlankScreen = mDisplayRequiresBlanking;
}
+
+ @Override
+ public float getBehindAlpha(float busyness) {
+ return mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f : 1f;
+ }
},
/**
@@ -147,8 +152,9 @@ public enum ScrimState {
mCurrentBehindAlpha = 0;
mCurrentInFrontAlpha = 0;
mAnimationDuration = StatusBar.FADE_KEYGUARD_DURATION;
+ mAnimateChange = !mLaunchingAffordanceWithPreview;
- if (previousState == ScrimState.AOD || previousState == ScrimState.PULSING) {
+ if (previousState == ScrimState.AOD) {
// Fade from black to transparent when coming directly from AOD
updateScrimColor(mScrimInFront, 1, Color.BLACK);
updateScrimColor(mScrimBehind, 1, Color.BLACK);
@@ -178,8 +184,9 @@ public enum ScrimState {
DozeParameters mDozeParameters;
boolean mDisplayRequiresBlanking;
boolean mWallpaperSupportsAmbientMode;
- KeyguardUpdateMonitor mKeyguardUpdateMonitor;
int mIndex;
+ boolean mHasBackdrop;
+ boolean mLaunchingAffordanceWithPreview;
ScrimState(int index) {
mIndex = index;
@@ -190,7 +197,6 @@ public enum ScrimState {
mScrimBehind = scrimBehind;
mDozeParameters = dozeParameters;
mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking();
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(scrimInFront.getContext());
}
public void prepare(ScrimState previousState) {
@@ -253,7 +259,15 @@ public enum ScrimState {
mWallpaperSupportsAmbientMode = wallpaperSupportsAmbientMode;
}
+ public void setLaunchingAffordanceWithPreview(boolean launchingAffordanceWithPreview) {
+ mLaunchingAffordanceWithPreview = launchingAffordanceWithPreview;
+ }
+
public boolean isLowPowerState() {
return false;
}
+
+ public void setHasBackdrop(boolean hasBackdrop) {
+ mHasBackdrop = hasBackdrop;
+ }
} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadowKeyDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadowKeyDrawable.java
index 8311dfd64fd2..2471e34a5a11 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadowKeyDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadowKeyDrawable.java
@@ -82,7 +82,12 @@ public class ShadowKeyDrawable extends Drawable {
if (bounds.isEmpty()) {
return;
}
- if (mState.mLastDrawnBitmap == null) {
+
+ // If no cache or previous cached bitmap is hardware/software acceleration does not match
+ // the current canvas on draw then regenerate
+ if (mState.mLastDrawnBitmap == null
+ || mState.mIsHardwareBitmap != canvas.isHardwareAccelerated()) {
+ mState.mIsHardwareBitmap = canvas.isHardwareAccelerated();
regenerateBitmapCache();
}
canvas.drawBitmap(mState.mLastDrawnBitmap, null, bounds, mPaint);
@@ -171,7 +176,10 @@ public class ShadowKeyDrawable extends Drawable {
d.draw(canvas);
}
- bitmap = bitmap.copy(Bitmap.Config.HARDWARE, false);
+ if (mState.mIsHardwareBitmap) {
+ bitmap = bitmap.copy(Bitmap.Config.HARDWARE, false);
+ }
+
mState.mLastDrawnBitmap = bitmap;
canvas.restore();
}
@@ -186,6 +194,7 @@ public class ShadowKeyDrawable extends Drawable {
int mShadowSize;
int mShadowColor;
+ boolean mIsHardwareBitmap;
Bitmap mLastDrawnBitmap;
ConstantState mChildState;
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 7bdeab0af83a..8d077f3afcbd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.phone;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.StatusBarManager.windowStateToString;
@@ -44,6 +46,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.AlarmManager;
import android.app.IWallpaperManager;
import android.app.KeyguardManager;
@@ -52,6 +55,7 @@ import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.StatusBarManager;
import android.app.TaskStackBuilder;
+import android.app.UiModeManager;
import android.app.WallpaperColors;
import android.app.WallpaperInfo;
import android.app.WallpaperManager;
@@ -358,7 +362,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private VolumeComponent mVolumeComponent;
private BrightnessMirrorController mBrightnessMirrorController;
private boolean mBrightnessMirrorVisible;
- protected FingerprintUnlockController mFingerprintUnlockController;
+ protected BiometricUnlockController mBiometricUnlockController;
private LightBarController mLightBarController;
protected LockscreenWallpaper mLockscreenWallpaper;
@@ -420,13 +424,6 @@ public class StatusBar extends SystemUI implements DemoMode,
protected KeyguardViewMediator mKeyguardViewMediator;
private ZenModeController mZenController;
- /**
- * Helper that is responsible for showing the right toast when a disallowed activity operation
- * occurred. In pinned mode, we show instructions on how to break out of this mode, whilst in
- * fully locked mode we only show that unlocking is blocked.
- */
- private ScreenPinningNotify mScreenPinningNotify;
-
// for disabling the status bar
private int mDisabled1 = 0;
private int mDisabled2 = 0;
@@ -509,7 +506,7 @@ public class StatusBar extends SystemUI implements DemoMode,
protected NotificationLockscreenUserManager mLockscreenUserManager;
protected NotificationRemoteInputManager mRemoteInputManager;
- private BroadcastReceiver mWallpaperChangedReceiver = new BroadcastReceiver() {
+ private final BroadcastReceiver mWallpaperChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
WallpaperManager wallpaperManager = context.getSystemService(WallpaperManager.class);
@@ -517,7 +514,7 @@ public class StatusBar extends SystemUI implements DemoMode,
Log.w(TAG, "WallpaperManager not available");
return;
}
- WallpaperInfo info = wallpaperManager.getWallpaperInfo();
+ WallpaperInfo info = wallpaperManager.getWallpaperInfo(UserHandle.USER_CURRENT);
final boolean supportsAmbientMode = info != null &&
info.getSupportsAmbientMode();
@@ -577,7 +574,7 @@ public class StatusBar extends SystemUI implements DemoMode,
= (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class);
private BatteryController mBatteryController;
protected boolean mPanelExpanded;
- private IOverlayManager mOverlayManager;
+ private UiModeManager mUiModeManager;
private boolean mKeyguardRequested;
private boolean mIsKeyguard;
private LogMaker mStatusBarStateLog;
@@ -638,8 +635,7 @@ public class StatusBar extends SystemUI implements DemoMode,
mWakefulnessLifecycle.addObserver(mWakefulnessObserver);
mBatteryController = Dependency.get(BatteryController.class);
mAssistManager = Dependency.get(AssistManager.class);
- mOverlayManager = IOverlayManager.Stub.asInterface(
- ServiceManager.getService(Context.OVERLAY_SERVICE));
+ mUiModeManager = mContext.getSystemService(UiModeManager.class);
mLockscreenUserManager = Dependency.get(NotificationLockscreenUserManager.class);
mGutsManager = Dependency.get(NotificationGutsManager.class);
mMediaManager = Dependency.get(NotificationMediaManager.class);
@@ -711,7 +707,8 @@ public class StatusBar extends SystemUI implements DemoMode,
// Make sure we always have the most current wallpaper info.
IntentFilter wallpaperChangedFilter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
- mContext.registerReceiver(mWallpaperChangedReceiver, wallpaperChangedFilter);
+ mContext.registerReceiverAsUser(mWallpaperChangedReceiver, UserHandle.ALL,
+ wallpaperChangedFilter, null /* broadcastPermission */, null /* scheduler */);
mWallpaperChangedReceiver.onReceive(mContext, null);
mLockscreenUserManager.setUpWithPresenter(this, mEntryManager);
@@ -829,23 +826,45 @@ public class StatusBar extends SystemUI implements DemoMode,
.createNotificationIconAreaController(context, this);
inflateShelf();
mNotificationIconAreaController.setupShelf(mNotificationShelf);
+ mStackScroller.setIconAreaController(mNotificationIconAreaController);
Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mNotificationIconAreaController);
FragmentHostManager.get(mStatusBarWindow)
.addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
CollapsedStatusBarFragment statusBarFragment =
(CollapsedStatusBarFragment) fragment;
statusBarFragment.initNotificationIconArea(mNotificationIconAreaController);
+ PhoneStatusBarView oldStatusBarView = mStatusBarView;
mStatusBarView = (PhoneStatusBarView) fragment.getView();
mStatusBarView.setBar(this);
mStatusBarView.setPanel(mNotificationPanel);
mStatusBarView.setScrimController(mScrimController);
+
+ // CollapsedStatusBarFragment re-inflated PhoneStatusBarView and both of
+ // mStatusBarView.mExpanded and mStatusBarView.mBouncerShowing are false.
+ // PhoneStatusBarView's new instance will set to be gone in
+ // PanelBar.updateVisibility after calling mStatusBarView.setBouncerShowing
+ // that will trigger PanelBar.updateVisibility. If there is a heads up showing,
+ // it needs to notify PhoneStatusBarView's new instance to update the correct
+ // status by calling mNotificationPanel.notifyBarPanelExpansionChanged().
+ if (mHeadsUpManager.hasPinnedHeadsUp()) {
+ mNotificationPanel.notifyBarPanelExpansionChanged();
+ }
mStatusBarView.setBouncerShowing(mBouncerShowing);
+ if (oldStatusBarView != null) {
+ float fraction = oldStatusBarView.getExpansionFraction();
+ boolean expanded = oldStatusBarView.isExpanded();
+ mStatusBarView.panelExpansionChanged(fraction, expanded);
+ }
+
+ HeadsUpAppearanceController oldController = mHeadsUpAppearanceController;
if (mHeadsUpAppearanceController != null) {
// This view is being recreated, let's destroy the old one
mHeadsUpAppearanceController.destroy();
}
mHeadsUpAppearanceController = new HeadsUpAppearanceController(
mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow);
+ mHeadsUpAppearanceController.readFrom(oldController);
+ mStatusBarWindow.setStatusBarView(mStatusBarView);
setAreThereNotifications();
checkBarModes();
}).getFragmentManager()
@@ -883,7 +902,6 @@ public class StatusBar extends SystemUI implements DemoMode,
} catch (RemoteException ex) {
// no window manager? good luck with that
}
- mScreenPinningNotify = new ScreenPinningNotify(mContext);
mStackScroller.setLongPressListener(mEntryManager.getNotificationLongClicker());
mStackScroller.setStatusBar(this);
mStackScroller.setGroupManager(mGroupManager);
@@ -1128,6 +1146,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mNotificationIconAreaController.onDensityOrFontScaleChanged(mContext);
mHeadsUpManager.onDensityOrFontScaleChanged();
+ inflateFooterView();
+ inflateEmptyShadeView();
reevaluateStyles();
}
@@ -1156,10 +1176,8 @@ public class StatusBar extends SystemUI implements DemoMode,
}
}
- protected void reevaluateStyles() {
- inflateFooterView();
+ private void reevaluateStyles() {
updateFooter();
- inflateEmptyShadeView();
updateEmptyShadeView();
}
@@ -1170,6 +1188,21 @@ public class StatusBar extends SystemUI implements DemoMode,
}
}
+ @Override
+ public void onUiModeChanged() {
+ // UiMode will change the style was already evaluated.
+ // We need to force the re-evaluation to make sure that all parents
+ // are up to date and new attrs will be rettrieved.
+ mContext.getTheme().applyStyle(mContext.getThemeResId(), true);
+
+ if (mBrightnessMirrorController != null) {
+ mBrightnessMirrorController.onUiModeChanged();
+ }
+ if (mStackScroller != null) {
+ mStackScroller.onUiModeChanged();
+ }
+ }
+
private void inflateEmptyShadeView() {
if (mStackScroller == null) {
return;
@@ -1180,7 +1213,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mStackScroller.setEmptyShadeView(mEmptyShadeView);
}
- private void inflateFooterView() {
+ @VisibleForTesting
+ protected void inflateFooterView() {
if (mStackScroller == null) {
return;
}
@@ -1310,18 +1344,18 @@ public class StatusBar extends SystemUI implements DemoMode,
protected void startKeyguard() {
Trace.beginSection("StatusBar#startKeyguard");
KeyguardViewMediator keyguardViewMediator = getComponent(KeyguardViewMediator.class);
- mFingerprintUnlockController = new FingerprintUnlockController(mContext,
+ mBiometricUnlockController = new BiometricUnlockController(mContext,
mDozeScrimController, keyguardViewMediator,
mScrimController, this, UnlockMethodCache.getInstance(mContext));
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,
- getBouncerContainer(), mNotificationPanel, mFingerprintUnlockController);
+ getBouncerContainer(), mNotificationPanel, mBiometricUnlockController);
mKeyguardIndicationController
.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
- mFingerprintUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
+ mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
mRemoteInputManager.getController().addCallback(mStatusBarKeyguardViewManager);
mKeyguardViewMediatorCallback = keyguardViewMediator.getViewMediatorCallback();
- mLightBarController.setFingerprintUnlockController(mFingerprintUnlockController);
+ mLightBarController.setBiometricUnlockController(mBiometricUnlockController);
Dependency.get(KeyguardDismissUtil.class).setDismissHandler(this::executeWhenUnlocked);
Trace.endSection();
}
@@ -1358,8 +1392,8 @@ public class StatusBar extends SystemUI implements DemoMode,
return false;
}
int createMode = navbarPos == NAV_BAR_POS_LEFT
- ? ActivityManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT
- : ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+ ? SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT
+ : SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
return mRecents.splitPrimaryTask(NavigationBarGestureHelper.DRAG_MODE_NONE, createMode,
null, metricsDockAction);
} else {
@@ -1605,8 +1639,8 @@ public class StatusBar extends SystemUI implements DemoMode,
return; // called too early
}
- boolean wakeAndUnlock = mFingerprintUnlockController != null
- && mFingerprintUnlockController.isWakeAndUnlock();
+ boolean wakeAndUnlock = mBiometricUnlockController != null
+ && mBiometricUnlockController.isWakeAndUnlock();
if (mLaunchTransitionFadingAway || wakeAndUnlock) {
mBackdrop.setVisibility(View.INVISIBLE);
Trace.endSection();
@@ -1651,11 +1685,15 @@ public class StatusBar extends SystemUI implements DemoMode,
&& mStatusBarKeyguardViewManager.isOccluded();
final boolean hasArtwork = artworkDrawable != null;
+ mColorExtractor.setHasBackdrop(hasArtwork);
+ if (mScrimController != null) {
+ mScrimController.setHasBackdrop(hasArtwork);
+ }
- if ((hasArtwork || DEBUG_MEDIA_FAKE_ARTWORK) && !mDozing
+ if ((hasArtwork || DEBUG_MEDIA_FAKE_ARTWORK)
&& (mState != StatusBarState.SHADE || allowWhenShade)
- && mFingerprintUnlockController.getMode()
- != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
+ && mBiometricUnlockController.getMode()
+ != BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
&& !hideBecauseOccluded) {
// time to show some art!
if (mBackdrop.getVisibility() != View.VISIBLE) {
@@ -1668,7 +1706,6 @@ public class StatusBar extends SystemUI implements DemoMode,
mBackdrop.setAlpha(1f);
}
mStatusBarWindowManager.setBackdropShowing(true);
- mColorExtractor.setMediaBackdropVisible(true);
metaDataChanged = true;
if (DEBUG_MEDIA) {
Log.v(TAG, "DEBUG_MEDIA: Fading in album artwork");
@@ -1720,10 +1757,9 @@ public class StatusBar extends SystemUI implements DemoMode,
if (DEBUG_MEDIA) {
Log.v(TAG, "DEBUG_MEDIA: Fading out album artwork");
}
- mColorExtractor.setMediaBackdropVisible(false);
boolean cannotAnimateDoze = mDozing && !ScrimState.AOD.getAnimateChange();
- if (mFingerprintUnlockController.getMode()
- == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
+ if (mBiometricUnlockController.getMode()
+ == BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
|| hideBecauseOccluded || cannotAnimateDoze) {
// We are unlocking directly - no animation!
@@ -2067,17 +2103,6 @@ public class StatusBar extends SystemUI implements DemoMode,
updateTheme();
}
- public boolean isUsingDarkTheme() {
- OverlayInfo themeInfo = null;
- try {
- themeInfo = mOverlayManager.getOverlayInfo("com.android.systemui.theme.dark",
- mLockscreenUserManager.getCurrentUserId());
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- return themeInfo != null && themeInfo.isEnabled();
- }
-
@Nullable
public View getAmbientIndicationContainer() {
return mAmbientIndicationContainer;
@@ -2133,6 +2158,10 @@ public class StatusBar extends SystemUI implements DemoMode,
}
}
+ public boolean isHeadsUpShouldBeVisible() {
+ return mHeadsUpAppearanceController.shouldBeVisible();
+ }
+
/**
* All changes to the status bar and notifications funnel through here and are batched.
*/
@@ -2219,17 +2248,16 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public void showPinningEnterExitToast(boolean entering) {
- if (entering) {
- mScreenPinningNotify.showPinningStartToast();
- } else {
- mScreenPinningNotify.showPinningExitToast();
+ if (getNavigationBarView() != null) {
+ getNavigationBarView().showPinningEnterExitToast(entering);
}
}
@Override
public void showPinningEscapeToast() {
- mScreenPinningNotify.showEscapeToast(getNavigationBarView() == null
- || getNavigationBarView().isRecentsButtonVisible());
+ if (getNavigationBarView() != null) {
+ getNavigationBarView().showPinningEscapeToast();
+ }
}
boolean panelsEnabled() {
@@ -2456,8 +2484,8 @@ public class StatusBar extends SystemUI implements DemoMode,
return mGestureRec;
}
- public FingerprintUnlockController getFingerprintUnlockController() {
- return mFingerprintUnlockController;
+ public BiometricUnlockController getBiometricUnlockController() {
+ return mBiometricUnlockController;
}
@Override // CommandQueue
@@ -2781,18 +2809,18 @@ public class StatusBar extends SystemUI implements DemoMode,
mStackScroller.dump(fd, pw, args);
}
pw.println(" Theme:");
- if (mOverlayManager == null) {
- pw.println(" overlay manager not initialized!");
- } else {
- pw.println(" dark overlay on: " + isUsingDarkTheme());
- }
+ String nightMode = mUiModeManager == null ? "null" : mUiModeManager.getNightMode() + "";
+ pw.println(" dark theme: " + nightMode +
+ " (auto: " + UiModeManager.MODE_NIGHT_AUTO +
+ ", yes: " + UiModeManager.MODE_NIGHT_YES +
+ ", no: " + UiModeManager.MODE_NIGHT_NO + ")");
final boolean lightWpTheme = mContext.getThemeResId() == R.style.Theme_SystemUI_Light;
pw.println(" light wallpaper theme: " + lightWpTheme);
DozeLog.dump(pw);
- if (mFingerprintUnlockController != null) {
- mFingerprintUnlockController.dump(pw);
+ if (mBiometricUnlockController != null) {
+ mBiometricUnlockController.dump(pw);
}
if (mKeyguardIndicationController != null) {
@@ -2957,7 +2985,7 @@ public class StatusBar extends SystemUI implements DemoMode,
WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS);
}
try {
- result = ActivityManager.getService().startActivityAsUser(
+ result = ActivityTaskManager.getService().startActivityAsUser(
null, mContext.getBasePackageName(),
intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
@@ -3100,10 +3128,10 @@ public class StatusBar extends SystemUI implements DemoMode,
&& mUnlockMethodCache.canSkipBouncer()
&& !mLeaveOpenOnKeyguardHide
&& isPulsing()) {
- // Reuse the fingerprint wake-and-unlock transition if we dismiss keyguard from a pulse.
- // TODO: Factor this transition out of FingerprintUnlockController.
- mFingerprintUnlockController.startWakeAndUnlock(
- FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING);
+ // Reuse the biometric wake-and-unlock transition if we dismiss keyguard from a pulse.
+ // TODO: Factor this transition out of BiometricUnlockController.
+ mBiometricUnlockController.startWakeAndUnlock(
+ BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING);
}
if (mStatusBarKeyguardViewManager.isShowing()) {
mStatusBarKeyguardViewManager.dismissWithAction(action, cancelAction,
@@ -3143,6 +3171,7 @@ public class StatusBar extends SystemUI implements DemoMode,
updateNotificationViews();
mMediaManager.clearCurrentMediaNotification();
setLockscreenUser(newUserId);
+ mWallpaperChangedReceiver.onReceive(mContext, null);
}
@Override
@@ -3507,8 +3536,8 @@ public class StatusBar extends SystemUI implements DemoMode,
}
private boolean updateIsKeyguard() {
- boolean wakeAndUnlocking = mFingerprintUnlockController.getMode()
- == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
+ boolean wakeAndUnlocking = mBiometricUnlockController.getMode()
+ == BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
// For dozing, keyguard needs to be shown whenever the device is non-interactive. Otherwise
// there's no surface we can show to the user. Note that the device goes fully interactive
@@ -3555,8 +3584,8 @@ public class StatusBar extends SystemUI implements DemoMode,
}
private void updatePanelExpansionForKeyguard() {
- if (mState == StatusBarState.KEYGUARD && mFingerprintUnlockController.getMode()
- != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK) {
+ if (mState == StatusBarState.KEYGUARD && mBiometricUnlockController.getMode()
+ != BiometricUnlockController.MODE_WAKE_AND_UNLOCK) {
instantExpandNotificationsPanel();
} else if (mState == StatusBarState.FULLSCREEN_USER_SWITCHER) {
instantCollapseNotificationPanel();
@@ -3852,23 +3881,7 @@ public class StatusBar extends SystemUI implements DemoMode,
* Switches theme from light to dark and vice-versa.
*/
protected void updateTheme() {
- final boolean inflated = mStackScroller != null;
-
- // The system wallpaper defines if QS should be light or dark.
- WallpaperColors systemColors = mColorExtractor
- .getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
- final boolean useDarkTheme = systemColors != null
- && (systemColors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_THEME) != 0;
- if (isUsingDarkTheme() != useDarkTheme) {
- mUiOffloadThread.submit(() -> {
- try {
- mOverlayManager.setEnabled("com.android.systemui.theme.dark",
- useDarkTheme, mLockscreenUserManager.getCurrentUserId());
- } catch (RemoteException e) {
- Log.w(TAG, "Can't change theme", e);
- }
- });
- }
+ final boolean inflated = mStackScroller != null && mStatusBarWindowManager != null;
// Lock wallpaper defines the color of the majority of the views, hence we'll use it
// to set our default theme.
@@ -4457,12 +4470,15 @@ public class StatusBar extends SystemUI implements DemoMode,
updateScrimController();
}
- public void cancelCurrentTouch() {
+ /**
+ * Collapses the notification shade if it is tracking or expanded.
+ */
+ public void collapseShade() {
if (mNotificationPanel.isTracking()) {
mStatusBarWindow.cancelCurrentTouch();
- if (mState == StatusBarState.SHADE) {
- animateCollapsePanels();
- }
+ }
+ if (mPanelExpanded && mState == StatusBarState.SHADE) {
+ animateCollapsePanels();
}
}
@@ -4681,7 +4697,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|| mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_ON;
}
- public void notifyFpAuthModeChanged() {
+ public void notifyBiometricAuthModeChanged() {
updateDozing();
updateScrimController();
}
@@ -4690,18 +4706,17 @@ public class StatusBar extends SystemUI implements DemoMode,
Trace.beginSection("StatusBar#updateDozing");
// When in wake-and-unlock while pulsing, keep dozing state until fully unlocked.
boolean dozing = mDozingRequested && mState == StatusBarState.KEYGUARD
- || mFingerprintUnlockController.getMode()
- == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
- final boolean alwaysOn = DozeParameters.getInstance(mContext).getAlwaysOn();
+ || mBiometricUnlockController.getMode()
+ == BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
// When in wake-and-unlock we may not have received a change to mState
// but we still should not be dozing, manually set to false.
- if (mFingerprintUnlockController.getMode() ==
- FingerprintUnlockController.MODE_WAKE_AND_UNLOCK) {
+ if (mBiometricUnlockController.getMode() ==
+ mBiometricUnlockController.MODE_WAKE_AND_UNLOCK) {
dozing = false;
}
if (mDozing != dozing) {
mDozing = dozing;
- mKeyguardViewMediator.setAodShowing(mDozing && alwaysOn);
+ mKeyguardViewMediator.setAodShowing(mDozing);
mStatusBarWindowManager.setDozing(mDozing);
mStatusBarKeyguardViewManager.setDozing(mDozing);
if (mAmbientIndicationContainer instanceof DozeReceiver) {
@@ -4720,22 +4735,25 @@ public class StatusBar extends SystemUI implements DemoMode,
// We don't want to end up in KEYGUARD state when we're unlocking with
// fingerprint from doze. We should cross fade directly from black.
- boolean wakeAndUnlocking = mFingerprintUnlockController.isWakeAndUnlock();
+ boolean wakeAndUnlocking = mBiometricUnlockController.isWakeAndUnlock();
// Do not animate the scrim expansion when triggered by the fingerprint sensor.
mScrimController.setExpansionAffectsAlpha(
- !mFingerprintUnlockController.isFingerprintUnlock());
+ !mBiometricUnlockController.isBiometricUnlock());
+
+ boolean launchingAffordanceWithPreview =
+ mNotificationPanel.isLaunchingAffordanceWithPreview();
+ mScrimController.setLaunchingAffordanceWithPreview(launchingAffordanceWithPreview);
if (mBouncerShowing) {
// Bouncer needs the front scrim when it's on top of an activity,
// tapping on a notification, editing QS or being dismissed by
// FLAG_DISMISS_KEYGUARD_ACTIVITY.
- ScrimState state = mIsOccluded || mStatusBarKeyguardViewManager.bouncerNeedsScrimming()
- || mStatusBarKeyguardViewManager.willDismissWithAction()
- || mStatusBarKeyguardViewManager.isFullscreenBouncer() ?
- ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER;
+ ScrimState state = mStatusBarKeyguardViewManager.bouncerNeedsScrimming()
+ ? ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER;
mScrimController.transitionTo(state);
- } else if (mLaunchCameraOnScreenTurningOn || isInLaunchTransition()) {
+ } else if (isInLaunchTransition() || mLaunchCameraOnScreenTurningOn
+ || launchingAffordanceWithPreview) {
mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback);
} else if (mBrightnessMirrorVisible) {
mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR);
@@ -4828,6 +4846,7 @@ public class StatusBar extends SystemUI implements DemoMode,
}
private void setPulsing(boolean pulsing) {
+ mKeyguardViewMediator.setPulsing(pulsing);
mNotificationPanel.setPulsing(pulsing);
mVisualStabilityManager.setPulsing(pulsing);
mIgnoreTouchWhilePulsing = false;
@@ -4868,8 +4887,8 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public boolean isPulsingBlocked() {
- return mFingerprintUnlockController.getMode()
- == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
+ return mBiometricUnlockController.getMode()
+ == BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
}
@Override
@@ -4880,7 +4899,7 @@ public class StatusBar extends SystemUI implements DemoMode,
@Override
public boolean isBlockingDoze() {
- if (mFingerprintUnlockController.hasPendingAuthentication()) {
+ if (mBiometricUnlockController.hasPendingAuthentication()) {
Log.i(TAG, "Blocking AOD because fingerprint has authenticated");
return true;
}
@@ -5150,7 +5169,7 @@ public class StatusBar extends SystemUI implements DemoMode,
row, wasOccluded);
try {
if (adapter != null) {
- ActivityManager.getService()
+ ActivityTaskManager.getService()
.registerRemoteAnimationForNextActivityStart(
intent.getCreatorPackage(), adapter);
}
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 3b9ee8bcd378..0d6cb5c50077 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java
@@ -22,7 +22,7 @@ import static com.android.systemui.statusbar.phone.StatusBarIconHolder.TYPE_WIFI
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 5001d4ffa13c..378910af3e02 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -17,11 +17,12 @@
package com.android.systemui.statusbar.phone;
import static com.android.keyguard.KeyguardHostView.OnDismissAction;
-import static com.android.systemui.statusbar.phone.FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
-import static com.android.systemui.statusbar.phone.FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
+import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
+import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
import android.content.ComponentCallbacks2;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.StatsLog;
@@ -90,7 +91,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
protected ViewMediatorCallback mViewMediatorCallback;
protected StatusBar mStatusBar;
private NotificationPanelView mNotificationPanelView;
- private FingerprintUnlockController mFingerprintUnlockController;
+ private BiometricUnlockController mBiometricUnlockController;
private ViewGroup mContainer;
@@ -107,7 +108,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
private boolean mLastBouncerDismissible;
protected boolean mLastRemoteInputActive;
private boolean mLastDozing;
- private int mLastFpMode;
+ private int mLastBiometricMode;
private boolean mGoingToSleepVisibleNotOccluded;
private OnDismissAction mAfterKeyguardGoneAction;
@@ -141,11 +142,11 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
public void registerStatusBar(StatusBar statusBar,
ViewGroup container,
NotificationPanelView notificationPanelView,
- FingerprintUnlockController fingerprintUnlockController,
+ BiometricUnlockController biometricUnlockController,
DismissCallbackRegistry dismissCallbackRegistry) {
mStatusBar = statusBar;
mContainer = container;
- mFingerprintUnlockController = fingerprintUnlockController;
+ mBiometricUnlockController = biometricUnlockController;
mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry,
mExpansionCallback);
@@ -169,11 +170,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
// • Full-screen user switcher is displayed.
if (mNotificationPanelView.isUnlockHintRunning()) {
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);
- } else if (mOccluded || mBouncer.willDismissWithAction() || mBouncer.isShowingScrimmed()
- || mStatusBar.isFullScreenUserSwitcherState()) {
+ } else if (bouncerNeedsScrimming()) {
mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
} else if (mShowing && !mDozing) {
- if (!isWakeAndUnlocking()) {
+ if (!isWakeAndUnlocking() && !mStatusBar.isInLaunchTransition()) {
mBouncer.setExpansion(expansion);
}
if (expansion != KeyguardBouncer.EXPANSION_HIDDEN && tracking
@@ -259,7 +259,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
private boolean isWakeAndUnlocking() {
- int mode = mFingerprintUnlockController.getMode();
+ int mode = mBiometricUnlockController.getMode();
return mode == MODE_WAKE_AND_UNLOCK || mode == MODE_WAKE_AND_UNLOCK_PULSING;
}
@@ -442,13 +442,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
} else {
executeAfterKeyguardGoneAction();
boolean wakeUnlockPulsing =
- mFingerprintUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING;
+ mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING;
if (wakeUnlockPulsing) {
delay = 0;
fadeoutDuration = 240;
}
mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
- mFingerprintUnlockController.startKeyguardFadingAway();
+ mBiometricUnlockController.startKeyguardFadingAway();
hideBouncer(true /* destroyView */);
if (wakeUnlockPulsing) {
mStatusBar.fadeKeyguardWhilePulsing();
@@ -460,7 +460,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
wakeAndUnlockDejank();
} else {
mStatusBar.finishKeyguardFadingAway();
- mFingerprintUnlockController.finishKeyguardFadingAway();
+ mBiometricUnlockController.finishKeyguardFadingAway();
}
}
updateStates();
@@ -484,14 +484,14 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mContainer.postDelayed(() -> mStatusBarWindowManager.setKeyguardFadingAway(false),
100);
mStatusBar.finishKeyguardFadingAway();
- mFingerprintUnlockController.finishKeyguardFadingAway();
+ mBiometricUnlockController.finishKeyguardFadingAway();
WindowManagerGlobal.getInstance().trimMemory(
ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
}
private void wakeAndUnlockDejank() {
- if (mFingerprintUnlockController.getMode() == MODE_WAKE_AND_UNLOCK
+ if (mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK
&& LatencyTracker.isEnabled(mContext)) {
DejankUtils.postAfterTraversal(() ->
LatencyTracker.getInstance(mContext).onActionEnd(
@@ -618,7 +618,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mLastBouncerDismissible = bouncerDismissible;
mLastRemoteInputActive = remoteInputActive;
mLastDozing = mDozing;
- mLastFpMode = mFingerprintUnlockController.getMode();
+ mLastBiometricMode = mBiometricUnlockController.getMode();
mStatusBar.onKeyguardViewManagerStatesUpdated();
}
@@ -643,9 +643,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
* @return Whether the navigation bar should be made visible based on the current state.
*/
protected boolean isNavBarVisible() {
- int fpMode = mFingerprintUnlockController.getMode();
+ int biometricMode = mBiometricUnlockController.getMode();
boolean keyguardShowing = mShowing && !mOccluded;
- boolean hideWhileDozing = mDozing && fpMode != MODE_WAKE_AND_UNLOCK_PULSING;
+ boolean hideWhileDozing = mDozing && biometricMode != MODE_WAKE_AND_UNLOCK_PULSING;
return (!keyguardShowing && !hideWhileDozing || mBouncer.isShowing()
|| mRemoteInputActive);
}
@@ -655,7 +655,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
*/
protected boolean getLastNavBarVisible() {
boolean keyguardShowing = mLastShowing && !mLastOccluded;
- boolean hideWhileDozing = mLastDozing && mLastFpMode != MODE_WAKE_AND_UNLOCK_PULSING;
+ boolean hideWhileDozing = mLastDozing && mLastBiometricMode != MODE_WAKE_AND_UNLOCK_PULSING;
return (!keyguardShowing && !hideWhileDozing || mLastBouncerShowing
|| mLastRemoteInputActive);
}
@@ -701,8 +701,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mBouncer.notifyKeyguardAuthenticated(strongAuth);
}
- public void showBouncerMessage(String message, int color) {
- mBouncer.showMessage(message, color);
+ public void showBouncerMessage(String message, ColorStateList colorState) {
+ mBouncer.showMessage(message, colorState);
}
public ViewRootImpl getViewRootImpl() {
@@ -730,12 +730,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
}
}
- public boolean willDismissWithAction() {
- return mBouncer.willDismissWithAction();
- }
-
public boolean bouncerNeedsScrimming() {
- return mBouncer.isShowingScrimmed();
+ return mOccluded || mBouncer.willDismissWithAction() || mBouncer.needsFullscreenBouncer()
+ || mStatusBar.isFullScreenUserSwitcherState() || mBouncer.isShowingScrimmed();
}
public void dump(PrintWriter pw) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
index fadc0eac9e73..a38328a8161e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -180,6 +180,15 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D
mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
}
+ private void applyExpandedFlag(State state) {
+ if (state.panelExpanded || state.isKeyguardShowingAndNotOccluded() || state.bouncerShowing
+ || ENABLE_REMOTE_INPUT && state.remoteInputActive) {
+ mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_BAR_EXPANDED;
+ } else {
+ mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_STATUS_BAR_EXPANDED;
+ }
+ }
+
private void applyHeight(State state) {
boolean expanded = isExpanded(state);
if (state.forcePluginOpen) {
@@ -234,6 +243,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D
applyKeyguardFlags(state);
applyForceStatusBarVisibleFlag(state);
applyFocusableFlag(state);
+ applyExpandedFlag(state);
adjustScreenOrientation(state);
applyHeight(state);
applyUserActivityTimeout(state);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index a79a41b07797..fa763c852cdf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -37,6 +37,7 @@ import android.os.IBinder;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.ActionMode;
+import android.view.DisplayCutout;
import android.view.InputDevice;
import android.view.InputQueue;
import android.view.KeyEvent;
@@ -75,6 +76,7 @@ public class StatusBarWindowView extends FrameLayout {
private NotificationStackScrollLayout mStackScrollLayout;
private NotificationPanelView mNotificationPanel;
private View mBrightnessMirror;
+ private PhoneStatusBarView mStatusBarView;
private int mRightInset = 0;
private int mLeftInset = 0;
@@ -94,6 +96,12 @@ public class StatusBarWindowView extends FrameLayout {
private boolean mExpandAnimationRunning;
private boolean mExpandAnimationPending;
+ /**
+ * If set to true, the current gesture started below the notch and we need to dispatch touch
+ * events manually as it's outside of the regular view bounds.
+ */
+ private boolean mExpandingBelowNotch;
+
public StatusBarWindowView(Context context, AttributeSet attrs) {
super(context, attrs);
setMotionEventSplittingEnabled(false);
@@ -112,10 +120,21 @@ public class StatusBarWindowView extends FrameLayout {
boolean paddingChanged = insets.top != getPaddingTop()
|| insets.bottom != getPaddingBottom();
+ int rightCutout = 0;
+ int leftCutout = 0;
+ DisplayCutout displayCutout = getRootWindowInsets().getDisplayCutout();
+ if (displayCutout != null) {
+ leftCutout = displayCutout.getSafeInsetLeft();
+ rightCutout = displayCutout.getSafeInsetRight();
+ }
+
+ int targetLeft = Math.max(insets.left, leftCutout);
+ int targetRight = Math.max(insets.right, rightCutout);
+
// Super-special right inset handling, because scrims and backdrop need to ignore it.
- if (insets.right != mRightInset || insets.left != mLeftInset) {
- mRightInset = insets.right;
- mLeftInset = insets.left;
+ if (targetRight != mRightInset || targetLeft != mLeftInset) {
+ mRightInset = targetRight;
+ mLeftInset = targetLeft;
applyMargins();
}
// Drop top inset, and pass through bottom inset.
@@ -186,6 +205,10 @@ public class StatusBarWindowView extends FrameLayout {
}
}
+ public void setStatusBarView(PhoneStatusBarView statusBarView) {
+ mStatusBarView = statusBarView;
+ }
+
public void setService(StatusBar service) {
mService = service;
setDragDownHelper(new DragDownHelper(getContext(), this, mStackScrollLayout, mService));
@@ -258,7 +281,16 @@ public class StatusBarWindowView extends FrameLayout {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean isDown = ev.getActionMasked() == MotionEvent.ACTION_DOWN;
+ boolean isUp = ev.getActionMasked() == MotionEvent.ACTION_UP;
boolean isCancel = ev.getActionMasked() == MotionEvent.ACTION_CANCEL;
+
+ // Reset manual touch dispatch state here but make sure the UP/CANCEL event still gets
+ // delivered.
+ boolean expandingBelowNotch = mExpandingBelowNotch;
+ if (isUp || isCancel) {
+ mExpandingBelowNotch = false;
+ }
+
if (!isCancel && mService.shouldIgnoreTouch()) {
return false;
}
@@ -291,6 +323,17 @@ public class StatusBarWindowView extends FrameLayout {
mService.mDozeScrimController.extendPulse();
}
+ // In case we start outside of the view bounds (below the status bar), we need to dispatch
+ // the touch manually as the view system can't accomodate for touches outside of the
+ // regular view bounds.
+ if (isDown && ev.getY() >= mBottom) {
+ mExpandingBelowNotch = true;
+ expandingBelowNotch = true;
+ }
+ if (expandingBelowNotch) {
+ return mStatusBarView.dispatchTouchEvent(ev);
+ }
+
return super.dispatchTouchEvent(ev);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
index 0811179e23d3..f8f698131f4e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java
@@ -301,11 +301,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {
vs.initFrom(child);
vs.alpha = 1.0f;
- if (child instanceof StatusIconDisplayable) {
- vs.hidden = !((StatusIconDisplayable)child).isIconVisible();
- } else {
- vs.hidden = false;
- }
+ vs.hidden = false;
}
}
@@ -333,22 +329,33 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {
}
StatusIconDisplayable icon = (StatusIconDisplayable) view;
AnimationProperties animationProperties = null;
- boolean animate = false;
+ boolean animateVisibility = true;
- if (justAdded) {
+ // Figure out which properties of the state transition (if any) we need to animate
+ if (justAdded
+ || icon.getVisibleState() == STATE_HIDDEN && visibleState == STATE_ICON) {
+ // Icon is appearing, fade it in by putting it where it will be and animating alpha
super.applyToView(view);
+ view.setAlpha(0.f);
+ icon.setVisibleState(STATE_HIDDEN);
animationProperties = ADD_ICON_PROPERTIES;
- animate = true;
} else if (icon.getVisibleState() != visibleState) {
- animationProperties = DOT_ANIMATION_PROPERTIES;
- animate = true;
+ if (icon.getVisibleState() == STATE_ICON && visibleState == STATE_HIDDEN) {
+ // Disappearing, don't do anything fancy
+ animateVisibility = false;
+ } else {
+ // all other transitions (to/from dot, etc)
+ animationProperties = ANIMATE_ALL_PROPERTIES;
+ }
+ } else if (visibleState != STATE_HIDDEN && xTranslation != view.getTranslationX()) {
+ // Visibility isn't changing, just animate position
+ animationProperties = X_ANIMATION_PROPERTIES;
}
- if (animate) {
+ icon.setVisibleState(visibleState, animateVisibility);
+ if (animationProperties != null) {
animateTo(view, animationProperties);
- icon.setVisibleState(visibleState);
} else {
- icon.setVisibleState(visibleState);
super.applyToView(view);
}
@@ -365,7 +372,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {
}
}.setDuration(200).setDelay(50);
- private static final AnimationProperties DOT_ANIMATION_PROPERTIES = new AnimationProperties() {
+ private static final AnimationProperties X_ANIMATION_PROPERTIES = new AnimationProperties() {
private AnimationFilter mAnimationFilter = new AnimationFilter().animateX();
@Override
@@ -373,4 +380,14 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {
return mAnimationFilter;
}
}.setDuration(200);
+
+ private static final AnimationProperties ANIMATE_ALL_PROPERTIES = new AnimationProperties() {
+ private AnimationFilter mAnimationFilter = new AnimationFilter().animateX().animateY()
+ .animateAlpha().animateScale();
+
+ @Override
+ public AnimationFilter getAnimationFilter() {
+ return mAnimationFilter;
+ }
+ }.setDuration(200);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
index 028da86dea34..aa60ec5208d8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
@@ -83,7 +83,7 @@ public class TrustDrawable extends Drawable {
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setColor(Utils.getColorAttr(context, R.attr.wallpaperTextColor));
+ mPaint.setColor(Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor));
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(mThickness);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
index f9c2130e4e81..e5925f07017f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone;
+import android.hardware.biometrics.BiometricSourceType;
import android.content.Context;
import android.os.Trace;
@@ -135,9 +136,9 @@ public class UnlockMethodCache {
}
@Override
- public void onFingerprintAuthenticated(int userId) {
- Trace.beginSection("KeyguardUpdateMonitorCallback#onFingerprintAuthenticated");
- if (!mKeyguardUpdateMonitor.isUnlockingWithFingerprintAllowed()) {
+ public void onBiometricAuthenticated(int userId, BiometricSourceType biometricSourceType) {
+ Trace.beginSection("KeyguardUpdateMonitorCallback#onBiometricAuthenticated");
+ if (!mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed()) {
Trace.endSection();
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
index e9bdc6848ab0..b1986782e914 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.policy;
import android.annotation.NonNull;
import android.content.res.Resources;
import android.util.ArraySet;
-import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
@@ -105,11 +104,9 @@ public class BrightnessMirrorController
}
private void reinflate() {
- ContextThemeWrapper qsThemeContext =
- new ContextThemeWrapper(mBrightnessMirror.getContext(), R.style.qs_theme);
int index = mStatusBarWindow.indexOfChild(mBrightnessMirror);
mStatusBarWindow.removeView(mBrightnessMirror);
- mBrightnessMirror = LayoutInflater.from(qsThemeContext).inflate(
+ mBrightnessMirror = LayoutInflater.from(mBrightnessMirror.getContext()).inflate(
R.layout.brightness_mirror, mStatusBarWindow, false);
mStatusBarWindow.addView(mBrightnessMirror, index);
@@ -129,6 +126,10 @@ public class BrightnessMirrorController
mBrightnessMirrorListeners.remove(listener);
}
+ public void onUiModeChanged() {
+ reinflate();
+ }
+
public interface BrightnessMirrorListener {
void onBrightnessMirrorReinflated(View brightnessMirror);
}
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 9aa804484716..8517d9086fc7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -25,6 +25,7 @@ import android.content.res.TypedArray;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Parcelable;
import android.os.SystemClock;
import android.os.UserHandle;
import android.text.Spannable;
@@ -65,6 +66,12 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
DarkReceiver, ConfigurationListener {
public static final String CLOCK_SECONDS = "clock_seconds";
+ private static final String CLOCK_SUPER_PARCELABLE = "clock_super_parcelable";
+ private static final String CURRENT_USER_ID = "current_user_id";
+ private static final String VISIBLE_BY_POLICY = "visible_by_policy";
+ private static final String VISIBLE_BY_USER = "visible_by_user";
+ private static final String SHOW_SECONDS = "show_seconds";
+ private static final String VISIBILITY = "visibility";
private final CurrentUserTracker mCurrentUserTracker;
private int mCurrentUserId;
@@ -129,6 +136,40 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C
}
@Override
+ public Parcelable onSaveInstanceState() {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(CLOCK_SUPER_PARCELABLE, super.onSaveInstanceState());
+ bundle.putInt(CURRENT_USER_ID, mCurrentUserId);
+ bundle.putBoolean(VISIBLE_BY_POLICY, mClockVisibleByPolicy);
+ bundle.putBoolean(VISIBLE_BY_USER, mClockVisibleByUser);
+ bundle.putBoolean(SHOW_SECONDS, mShowSeconds);
+ bundle.putInt(VISIBILITY, getVisibility());
+
+ return bundle;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ if (state == null || !(state instanceof Bundle)) {
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ Bundle bundle = (Bundle) state;
+ Parcelable superState = bundle.getParcelable(CLOCK_SUPER_PARCELABLE);
+ super.onRestoreInstanceState(superState);
+ if (bundle.containsKey(CURRENT_USER_ID)) {
+ mCurrentUserId = bundle.getInt(CURRENT_USER_ID);
+ }
+ mClockVisibleByPolicy = bundle.getBoolean(VISIBLE_BY_POLICY, true);
+ mClockVisibleByUser = bundle.getBoolean(VISIBLE_BY_USER, true);
+ mShowSeconds = bundle.getBoolean(SHOW_SECONDS, false);
+ if (bundle.containsKey(VISIBILITY)) {
+ setVisibility(bundle.getInt(VISIBILITY));
+ }
+ }
+
+ @Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java
index 3dca371541ef..8c631d9107df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java
@@ -28,6 +28,7 @@ public interface ConfigurationController extends CallbackController<Configuratio
default void onConfigChanged(Configuration newConfig) {}
default void onDensityOrFontScaleChanged() {}
default void onOverlayChanged() {}
+ default void onUiModeChanged() {}
default void onLocaleListChanged() {}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java
index f0cfa2c40931..11fc40804f71 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.policy;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
@@ -24,6 +25,8 @@ import android.hardware.camera2.CameraManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
+import android.provider.Settings;
+import android.provider.Settings.Secure;
import android.text.TextUtils;
import android.util.Log;
@@ -46,6 +49,9 @@ public class FlashlightControllerImpl implements FlashlightController {
private static final int DISPATCH_CHANGED = 1;
private static final int DISPATCH_AVAILABILITY_CHANGED = 2;
+ private static final String ACTION_FLASHLIGHT_CHANGED =
+ "com.android.settings.flashlight.action.FLASHLIGHT_CHANGED";
+
private final CameraManager mCameraManager;
private final Context mContext;
/** Call {@link #ensureHandler()} before using */
@@ -206,6 +212,9 @@ public class FlashlightControllerImpl implements FlashlightController {
public void onTorchModeUnavailable(String cameraId) {
if (TextUtils.equals(cameraId, mCameraId)) {
setCameraAvailable(false);
+ Settings.Secure.putInt(
+ mContext.getContentResolver(), Settings.Secure.FLASHLIGHT_AVAILABLE, 0);
+
}
}
@@ -214,6 +223,11 @@ public class FlashlightControllerImpl implements FlashlightController {
if (TextUtils.equals(cameraId, mCameraId)) {
setCameraAvailable(true);
setTorchMode(enabled);
+ Settings.Secure.putInt(
+ mContext.getContentResolver(), Settings.Secure.FLASHLIGHT_AVAILABLE, 1);
+ Settings.Secure.putInt(
+ mContext.getContentResolver(), Secure.FLASHLIGHT_ENABLED, enabled ? 1 : 0);
+ mContext.sendBroadcast(new Intent(ACTION_FLASHLIGHT_CHANGED));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
index 0034bee38094..89a23049f5de 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
@@ -135,6 +135,10 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof
@Override
public void setHotspotEnabled(boolean enabled) {
+ if (mWaitingForCallback) {
+ if (DEBUG) Log.d(TAG, "Ignoring setHotspotEnabled; waiting for callback.");
+ return;
+ }
if (enabled) {
OnStartTetheringCallback callback = new OnStartTetheringCallback();
mWaitingForCallback = true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java
index 0c201c3d8660..5fd79a4bb342 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IconLoggerImpl.java
@@ -23,7 +23,7 @@ import android.content.Context;
import android.metrics.LogMaker;
import android.os.Handler;
import android.os.Looper;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import android.util.ArraySet;
import com.android.internal.logging.MetricsLogger;
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 3febdfdfbe7e..fcd7e0953825 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java
@@ -33,7 +33,7 @@ import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
import com.android.systemui.util.Utils;
import java.util.ArrayList;
import java.util.List;
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 ebc9aac5478b..3e0060e5fae2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -981,7 +981,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
private SubscriptionInfo addSignalController(int id, int simSlotIndex) {
SubscriptionInfo info = new SubscriptionInfo(id, "", simSlotIndex, "", "", 0, 0, "", 0,
- null, 0, 0, "");
+ null, null, null, "");
MobileSignalController controller = new MobileSignalController(mContext,
mConfig, mHasMobileDataFeature, mPhone, mCallbackHandler, this, info,
mSubDefaults, mReceiverHandler.getLooper());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index 924aa0120c94..cda9d0416653 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -27,7 +27,7 @@ import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.widget.Button;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.keyguard.KeyguardHostView.OnDismissAction;
import com.android.systemui.Dependency;
import com.android.systemui.R;
@@ -114,7 +114,7 @@ public class SmartReplyView extends ViewGroup {
mRippleColor = mContext.getColor(R.color.notification_ripple_untinted_color);
mRippleColorDarkBg = Color.argb(Color.alpha(mRippleColor),
255 /* red */, 255 /* green */, 255 /* blue */);
- mMinStrokeContrast = NotificationColorUtil.calculateContrast(mDefaultStrokeColor,
+ mMinStrokeContrast = ContrastColorUtil.calculateContrast(mDefaultStrokeColor,
mDefaultBackgroundColor);
int spacing = 0;
@@ -574,12 +574,12 @@ public class SmartReplyView extends ViewGroup {
}
mCurrentBackgroundColor = backgroundColor;
- final boolean dark = !NotificationColorUtil.isColorLight(backgroundColor);
+ final boolean dark = !ContrastColorUtil.isColorLight(backgroundColor);
- int textColor = NotificationColorUtil.ensureTextContrast(
+ int textColor = ContrastColorUtil.ensureTextContrast(
dark ? mDefaultTextColorDarkBg : mDefaultTextColor,
backgroundColor | 0xff000000, dark);
- int strokeColor = NotificationColorUtil.ensureContrast(
+ int strokeColor = ContrastColorUtil.ensureContrast(
mDefaultStrokeColor, backgroundColor | 0xff000000, dark, mMinStrokeContrast);
int rippleColor = dark ? mRippleColorDarkBg : mRippleColor;
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 302f0975c90e..13fabfd93427 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -677,7 +677,8 @@ public class UserSwitcherController {
Drawable icon = UserIcons.getDefaultUserIcon(
context.getResources(), item.resolveId(), /* light= */ false);
if (item.isGuest) {
- icon.setColorFilter(Utils.getColorAttr(context, android.R.attr.colorForeground),
+ icon.setColorFilter(Utils.getColorAttrDefaultColor(context,
+ android.R.attr.colorForeground),
Mode.SRC_IN);
}
return icon;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
index b9bccefc4e64..cc5525aa9783 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
@@ -88,8 +88,10 @@ public class WifiSignalController extends
@Override
public void notifyListeners(SignalCallback callback) {
// only show wifi in the cluster if connected or if wifi-only
+ boolean visibleWhenEnabled = mContext.getResources().getBoolean(
+ R.bool.config_showWifiIndicatorWhenEnabled);
boolean wifiVisible = mCurrentState.enabled
- && (mCurrentState.connected || !mHasMobileData);
+ && (mCurrentState.connected || !mHasMobileData || visibleWhenEnabled);
String wifiDesc = wifiVisible ? mCurrentState.ssid : null;
boolean ssidPresent = wifiVisible && mCurrentState.ssid != null;
String contentDescription = getStringIfExists(getContentDescription());
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 2031b27c93f2..ef51bf06e411 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -32,32 +32,33 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings.Global;
import android.provider.Settings.Secure;
-import android.service.notification.Condition;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.ZenRule;
+import android.text.format.DateFormat;
import android.util.Log;
-import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.Dumpable;
import com.android.systemui.qs.GlobalSetting;
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.util.Utils;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.LinkedHashMap;
import java.util.Objects;
/** Platform implementation of the zen mode controller. **/
-public class ZenModeControllerImpl extends CurrentUserTracker implements ZenModeController {
+public class ZenModeControllerImpl extends CurrentUserTracker
+ implements ZenModeController, Dumpable {
private static final String TAG = "ZenModeController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>();
+ private final ArrayList<Callback> mCallbacks = new ArrayList<>();
private final Context mContext;
private final GlobalSetting mModeSetting;
private final GlobalSetting mConfigSetting;
private final NotificationManager mNoMan;
- private final LinkedHashMap<Uri, Condition> mConditions = new LinkedHashMap<Uri, Condition>();
private final AlarmManager mAlarmManager;
private final SetupObserver mSetupObserver;
private final UserManager mUserManager;
@@ -66,6 +67,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
private boolean mRegistered;
private ZenModeConfig mConfig;
private int mZenMode;
+ private long mZenUpdateTime;
public ZenModeControllerImpl(Context context, Handler handler) {
super(context);
@@ -84,7 +86,6 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
}
};
mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- mConfig = mNoMan.getZenModeConfig();
mModeSetting.setListening(true);
updateZenMode(mModeSetting.getValue());
mConfigSetting.setListening(true);
@@ -113,10 +114,6 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
@Override
public void addCallback(Callback callback) {
- if (callback == null) {
- Slog.e(TAG, "Attempted to add a null callback.");
- return;
- }
mCallbacks.add(callback);
}
@@ -213,6 +210,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
@VisibleForTesting
protected void updateZenMode(int mode) {
mZenMode = mode;
+ mZenUpdateTime = System.currentTimeMillis();
}
@VisibleForTesting
@@ -221,6 +219,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
if (Objects.equals(config, mConfig)) return;
final ZenRule oldRule = mConfig != null ? mConfig.manualRule : null;
mConfig = config;
+ mZenUpdateTime = System.currentTimeMillis();
fireConfigChanged(config);
final ZenRule newRule = config != null ? config.manualRule : null;
if (Objects.equals(oldRule, newRule)) return;
@@ -239,6 +238,14 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
}
};
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("ZenModeControllerImpl:");
+ pw.println(" mZenMode=" + mZenMode);
+ pw.println(" mConfig=" + mConfig);
+ pw.println(" mZenUpdateTime=" + DateFormat.format("MM-dd HH:mm:ss", mZenUpdateTime));
+ }
+
private final class SetupObserver extends ContentObserver {
private final ContentResolver mResolver;
@@ -265,6 +272,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
Global.getUriFor(Global.DEVICE_PROVISIONED), false, this);
mResolver.registerContentObserver(
Secure.getUriFor(Secure.USER_SETUP_COMPLETE), false, this, mUserId);
+ mRegistered = true;
fireZenAvailableChanged(isZenAvailable());
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
index c26568ea00b3..fd49b262a55f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
@@ -16,7 +16,7 @@
package com.android.systemui.statusbar.stack;
-import android.support.v4.util.ArraySet;
+import androidx.collection.ArraySet;
import android.util.Property;
import android.view.View;
@@ -137,6 +137,10 @@ public class AnimationFilter {
// to look nice
customDelay = StackStateAnimator.ANIMATION_DELAY_HEADS_UP_CLICKED
+ StackStateAnimator.ANIMATION_DELAY_HEADS_UP;
+ } else if (ev.animationType == NotificationStackScrollLayout.AnimationEvent
+ .ANIMATION_TYPE_PULSE_APPEAR || ev.animationType ==
+ NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_PULSE_DISAPPEAR) {
+ customDelay = StackStateAnimator.ANIMATION_DURATION_PULSE_APPEAR / 2;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
index 2dd3d4e131db..ffd54942738a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
@@ -49,10 +49,14 @@ import java.util.List;
*/
public class NotificationChildrenContainer extends ViewGroup {
- private static final int NUMBER_OF_CHILDREN_WHEN_COLLAPSED = 2;
- private static final int NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED = 5;
- private static final int NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED = 8;
- private static final int NUMBER_OF_CHILDREN_WHEN_AMBIENT = 1;
+ @VisibleForTesting
+ static final int NUMBER_OF_CHILDREN_WHEN_COLLAPSED = 2;
+ @VisibleForTesting
+ static final int NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED = 5;
+ @VisibleForTesting
+ static final int NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED = 8;
+ @VisibleForTesting
+ static final int NUMBER_OF_CHILDREN_WHEN_AMBIENT = 1;
private static final AnimationProperties ALPHA_FADE_IN = new AnimationProperties() {
private AnimationFilter mAnimationFilter = new AnimationFilter().animateAlpha();
@@ -699,15 +703,18 @@ public class NotificationChildrenContainer extends ViewGroup {
return childState.height != intrinsicHeight && !childState.hidden;
}
- private int getMaxAllowedVisibleChildren() {
+ @VisibleForTesting
+ int getMaxAllowedVisibleChildren() {
return getMaxAllowedVisibleChildren(false /* likeCollapsed */);
}
- private int getMaxAllowedVisibleChildren(boolean likeCollapsed) {
+ @VisibleForTesting
+ int getMaxAllowedVisibleChildren(boolean likeCollapsed) {
if (mContainingNotification.isShowingAmbient()) {
return NUMBER_OF_CHILDREN_WHEN_AMBIENT;
}
- if (!likeCollapsed && (mChildrenExpanded || mContainingNotification.isUserLocked())) {
+ if (!likeCollapsed && (mChildrenExpanded || mContainingNotification.isUserLocked())
+ && !showingAsLowPriority()) {
return NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED;
}
if (mIsLowPriority || !mContainingNotification.isOnKeyguard()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index 9c26c69045d5..eb3289b8e8e8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -34,7 +34,6 @@ import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
-import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
@@ -42,15 +41,13 @@ import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
import android.service.notification.StatusBarNotification;
-import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.graphics.ColorUtils;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+import androidx.core.graphics.ColorUtils;
import android.util.AttributeSet;
-import android.util.FloatProperty;
import android.util.Log;
import android.util.MathUtils;
import android.util.Pair;
-import android.util.Property;
import android.view.ContextThemeWrapper;
import android.view.InputDevice;
import android.view.MotionEvent;
@@ -101,6 +98,7 @@ import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
+import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.HeadsUpUtil;
@@ -140,7 +138,6 @@ public class NotificationStackScrollLayout extends ViewGroup
private boolean mSwipingInProgress;
private int mCurrentStackHeight = Integer.MAX_VALUE;
private final Paint mBackgroundPaint = new Paint();
- private final Path mBackgroundPath = new Path();
private final boolean mShouldDrawNotificationBackground;
private float mExpandedHeight;
@@ -375,20 +372,22 @@ public class NotificationStackScrollLayout extends ViewGroup
private boolean mScrollable;
private View mForcedScroll;
private View mNeedingPulseAnimation;
- private float mDarkAmount = 0f;
- private static final Property<NotificationStackScrollLayout, Float> DARK_AMOUNT =
- new FloatProperty<NotificationStackScrollLayout>("darkAmount") {
- @Override
- public void setValue(NotificationStackScrollLayout object, float value) {
- object.setDarkAmount(value);
- }
- @Override
- public Float get(NotificationStackScrollLayout object) {
- return object.getDarkAmount();
- }
- };
- private ObjectAnimator mDarkAmountAnimator;
+ /**
+ * @see #setDarkAmount(float, float)
+ */
+ private float mInterpolatedDarkAmount = 0f;
+
+ /**
+ * @see #setDarkAmount(float, float)
+ */
+ private float mLinearDarkAmount = 0f;
+
+ /**
+ * How fast the background scales in the X direction as a factor of the Y expansion.
+ */
+ private float mBackgroundXFactor = 1f;
+
private boolean mUsingLightTheme;
private boolean mQsExpanded;
private boolean mForwardScrollable;
@@ -416,6 +415,10 @@ public class NotificationStackScrollLayout extends ViewGroup
private ArrayList<BiConsumer<Float, Float>> mExpandedHeightListeners = new ArrayList<>();
private int mHeadsUpInset;
private HeadsUpAppearanceController mHeadsUpAppearanceController;
+ private NotificationIconAreaController mIconAreaController;
+ private float mVerticalPanelTranslation;
+
+ private Interpolator mDarkXInterpolator = Interpolators.FAST_OUT_SLOW_IN;
public NotificationStackScrollLayout(Context context) {
this(context, null);
@@ -511,6 +514,20 @@ public class NotificationStackScrollLayout extends ViewGroup
mSwipeHelper.onMenuShown(row);
}
+ public void onUiModeChanged() {
+ mBgColor = mContext.getColor(R.color.notification_shade_background_color);
+ updateBackgroundDimming();
+
+ // Re-inflate all notification views
+ int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View child = getChildAt(i);
+ if (child instanceof ActivatableNotificationView) {
+ ((ActivatableNotificationView) child).onUiModeChanged();
+ }
+ }
+ }
+
protected void onDraw(Canvas canvas) {
if (mShouldDrawNotificationBackground
&& (mCurrentBounds.top < mCurrentBounds.bottom || mAmbientState.isDark())) {
@@ -532,10 +549,16 @@ public class NotificationStackScrollLayout extends ViewGroup
final int lockScreenRight = getWidth() - mSidePaddings;
final int lockScreenTop = mCurrentBounds.top;
final int lockScreenBottom = mCurrentBounds.bottom;
- final int darkLeft = getWidth() / 2 - mSeparatorWidth / 2;
- final int darkRight = darkLeft + mSeparatorWidth;
- final int darkTop = (int) (mRegularTopPadding + mSeparatorThickness / 2f);
- final int darkBottom = darkTop + mSeparatorThickness;
+ int separatorWidth = 0;
+ int separatorThickness = 0;
+ if (mIconAreaController.hasShelfIconsWhenFullyDark()) {
+ separatorThickness = mSeparatorThickness;
+ separatorWidth = mSeparatorWidth;
+ }
+ final int darkLeft = getWidth() / 2 - separatorWidth / 2;
+ final int darkRight = darkLeft + separatorWidth;
+ final int darkTop = (int) (mRegularTopPadding + separatorThickness / 2f);
+ final int darkBottom = darkTop + separatorThickness;
if (mAmbientState.hasPulsingNotifications()) {
// No divider, we have a notification icon instead
@@ -545,16 +568,16 @@ public class NotificationStackScrollLayout extends ViewGroup
canvas.drawRect(darkLeft, darkTop, darkRight, darkBottom, mBackgroundPaint);
}
} else {
- float inverseDark = 1 - mDarkAmount;
- float yProgress = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(inverseDark);
- float xProgress = Interpolators.FAST_OUT_SLOW_IN
- .getInterpolation(inverseDark * 2f);
+ float yProgress = 1 - mInterpolatedDarkAmount;
+ float xProgress = mDarkXInterpolator.getInterpolation(
+ (1 - mLinearDarkAmount) * mBackgroundXFactor);
mBackgroundAnimationRect.set(
(int) MathUtils.lerp(darkLeft, lockScreenLeft, xProgress),
(int) MathUtils.lerp(darkTop, lockScreenTop, yProgress),
(int) MathUtils.lerp(darkRight, lockScreenRight, xProgress),
(int) MathUtils.lerp(darkBottom, lockScreenBottom, yProgress));
+
if (!mAmbientState.isDark() || mFirstVisibleBackgroundChild != null) {
canvas.drawRoundRect(mBackgroundAnimationRect.left, mBackgroundAnimationRect.top,
mBackgroundAnimationRect.right, mBackgroundAnimationRect.bottom,
@@ -572,14 +595,15 @@ public class NotificationStackScrollLayout extends ViewGroup
float alpha =
BACKGROUND_ALPHA_DIMMED + (1 - BACKGROUND_ALPHA_DIMMED) * (1.0f - mDimAmount);
- alpha *= 1f - mDarkAmount;
+ alpha *= 1f - mInterpolatedDarkAmount;
// We need to manually blend in the background color.
int scrimColor = mScrimController.getBackgroundColor();
int awakeColor = ColorUtils.blendARGB(scrimColor, mBgColor, alpha);
// Interpolate between semi-transparent notification panel background color
// and white AOD separator.
- float colorInterpolation = Interpolators.DECELERATE_QUINT.getInterpolation(mDarkAmount);
+ float colorInterpolation = MathUtils.smoothStep(0.4f /* start */, 1f /* end */,
+ mLinearDarkAmount);
int color = ColorUtils.blendARGB(awakeColor, Color.WHITE, colorInterpolation);
if (mCachedBackgroundColor != color) {
@@ -652,11 +676,15 @@ public class NotificationStackScrollLayout extends ViewGroup
int width = MeasureSpec.getSize(widthMeasureSpec);
int childWidthSpec = MeasureSpec.makeMeasureSpec(width - mSidePaddings * 2,
MeasureSpec.getMode(widthMeasureSpec));
+ // Don't constrain the height of the children so we know how big they'd like to be
+ int childHeightSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec),
+ MeasureSpec.UNSPECIFIED);
+
// We need to measure all children even the GONE ones, such that the heights are calculated
// correctly as they are used to calculate how many we can fit on the screen.
final int size = getChildCount();
for (int i = 0; i < size; i++) {
- measureChild(getChildAt(i), childWidthSpec, heightMeasureSpec);
+ measureChild(getChildAt(i), childWidthSpec, childHeightSpec);
}
}
@@ -723,7 +751,8 @@ public class NotificationStackScrollLayout extends ViewGroup
}
private void updateAlgorithmHeightAndPadding() {
- mTopPadding = (int) MathUtils.lerp(mRegularTopPadding, mDarkTopPadding, mDarkAmount);
+ mTopPadding = (int) MathUtils.lerp(mRegularTopPadding, mDarkTopPadding,
+ mInterpolatedDarkAmount);
mAmbientState.setLayoutHeight(getLayoutHeight());
updateAlgorithmLayoutMinHeight();
mAmbientState.setTopPadding(mTopPadding);
@@ -948,7 +977,7 @@ public class NotificationStackScrollLayout extends ViewGroup
}
public void updateClipping() {
- boolean animatingClipping = mDarkAmount > 0 && mDarkAmount < 1;
+ boolean animatingClipping = mInterpolatedDarkAmount > 0 && mInterpolatedDarkAmount < 1;
boolean clipped = mRequestedClipBounds != null && !mInHeadsUpPinnedMode
&& !mHeadsUpAnimatingAway;
if (mIsClipped != clipped) {
@@ -970,7 +999,7 @@ public class NotificationStackScrollLayout extends ViewGroup
* Measured relative to the resting position.
*/
private float getExpandTranslationStart() {
- return - mTopPadding;
+ return -mTopPadding + getMinExpansionHeight();
}
/**
@@ -1410,7 +1439,8 @@ public class NotificationStackScrollLayout extends ViewGroup
*/
private int targetScrollForView(ExpandableView v, int positionInLinearLayout) {
return positionInLinearLayout + v.getIntrinsicHeight() +
- getImeInset() - getHeight() + getTopPadding();
+ getImeInset() - getHeight()
+ + ((!isExpanded() && isPinnedHeadsUp(v)) ? mHeadsUpInset : getTopPadding());
}
@Override
@@ -2041,11 +2071,15 @@ public class NotificationStackScrollLayout extends ViewGroup
}
private int getScrollRange() {
- int contentHeight = getContentHeight();
+ // In current design, it only use the top HUN to treat all of HUNs
+ // although there are more than one HUNs
+ int contentHeight = mContentHeight;
+ if (!isExpanded() && mHeadsUpManager.hasPinnedHeadsUp()) {
+ contentHeight = mHeadsUpInset + getTopHeadsUpPinnedHeight();
+ }
int scrollRange = Math.max(0, contentHeight - mMaxLayoutHeight);
int imeInset = getImeInset();
- scrollRange += Math.min(imeInset, Math.max(0,
- getContentHeight() - (getHeight() - imeInset)));
+ scrollRange += Math.min(imeInset, Math.max(0, contentHeight - (getHeight() - imeInset)));
return scrollRange;
}
@@ -2146,10 +2180,6 @@ public class NotificationStackScrollLayout extends ViewGroup
return count;
}
- public int getContentHeight() {
- return mContentHeight;
- }
-
private void updateContentHeight() {
int height = 0;
float previousPaddingRequest = mPaddingBetweenElements;
@@ -2213,7 +2243,11 @@ public class NotificationStackScrollLayout extends ViewGroup
}
}
mIntrinsicContentHeight = height;
- mContentHeight = height + mTopPadding + mBottomMargin;
+
+ // We don't want to use the toppadding since that might be interpolated and we want
+ // to take the final value of the animation.
+ int topPadding = mAmbientState.isFullyDark() ? mDarkTopPadding : mRegularTopPadding;
+ mContentHeight = height + topPadding + mBottomMargin;
updateScrollability();
clampScrollPosition();
mAmbientState.setLayoutMaxHeight(mContentHeight);
@@ -2410,7 +2444,7 @@ public class NotificationStackScrollLayout extends ViewGroup
return;
}
- final boolean awake = mDarkAmount != 0 || mAmbientState.isDark();
+ final boolean awake = mInterpolatedDarkAmount != 0 || mAmbientState.isDark();
mScrimController.setExcludedBackgroundArea(
mFadingOut || mParentNotFullyVisible || awake || mIsClipped ? null
: mCurrentBounds);
@@ -3158,7 +3192,7 @@ public class NotificationStackScrollLayout extends ViewGroup
private void startAnimationToState() {
if (mNeedsAnimation) {
- generateChildHierarchyEvents();
+ generateAllAnimationEvents();
mNeedsAnimation = false;
}
if (!mAnimationEvents.isEmpty() || isCurrentlyAnimating()) {
@@ -3175,7 +3209,7 @@ public class NotificationStackScrollLayout extends ViewGroup
mGoToFullShadeDelay = 0;
}
- private void generateChildHierarchyEvents() {
+ private void generateAllAnimationEvents() {
generateHeadsUpAnimationEvents();
generateChildRemovalEvents();
generateChildAdditionEvents();
@@ -3192,7 +3226,6 @@ public class NotificationStackScrollLayout extends ViewGroup
generateGroupExpansionEvent();
generateAnimateEverythingEvent();
generatePulsingAnimationEvent();
- mNeedsAnimation = false;
}
private void generateHeadsUpAnimationEvents() {
@@ -3403,7 +3436,6 @@ public class NotificationStackScrollLayout extends ViewGroup
.animateY(mShelf));
ev.darkAnimationOriginIndex = mDarkAnimationOriginIndex;
mAnimationEvents.add(ev);
- startDarkAmountAnimation();
}
mDarkNeedsAnimation = false;
}
@@ -3931,7 +3963,7 @@ public class NotificationStackScrollLayout extends ViewGroup
mUsingLightTheme = lightTheme;
Context context = new ContextThemeWrapper(mContext,
lightTheme ? R.style.Theme_SystemUI_Light : R.style.Theme_SystemUI);
- final int textColor = Utils.getColorAttr(context, R.attr.wallpaperTextColor);
+ final int textColor = Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor);
mFooterView.setTextColor(textColor);
mEmptyShadeView.setTextColor(textColor);
}
@@ -3979,11 +4011,8 @@ public class NotificationStackScrollLayout extends ViewGroup
if (animate && mAnimationsEnabled) {
mDarkNeedsAnimation = true;
mDarkAnimationOriginIndex = findDarkAnimationOriginIndex(touchWakeUpScreenLocation);
- mNeedsAnimation = true;
+ mNeedsAnimation = true;
} else {
- if (mDarkAmountAnimator != null) {
- mDarkAmountAnimator.cancel();
- }
setDarkAmount(dark ? 1f : 0f);
updateBackground();
}
@@ -3993,8 +4022,13 @@ public class NotificationStackScrollLayout extends ViewGroup
notifyHeightChangeListener(mShelf);
}
- private void updateAntiBurnInTranslation() {
- setTranslationX(mAntiBurnInOffsetX * mDarkAmount);
+ private void updatePanelTranslation() {
+ setTranslationX(mVerticalPanelTranslation + mAntiBurnInOffsetX * mInterpolatedDarkAmount);
+ }
+
+ public void setVerticalPanelTranslation(float verticalPanelTranslation) {
+ mVerticalPanelTranslation = verticalPanelTranslation;
+ updatePanelTranslation();
}
/**
@@ -4008,42 +4042,57 @@ public class NotificationStackScrollLayout extends ViewGroup
}
private void setDarkAmount(float darkAmount) {
- mDarkAmount = darkAmount;
+ setDarkAmount(darkAmount, darkAmount);
+ }
+
+ /**
+ * Sets the current dark amount.
+ *
+ * @param linearDarkAmount The dark amount that follows linear interpoloation in the animation,
+ * i.e. animates from 0 to 1 or vice-versa in a linear manner.
+ * @param interpolatedDarkAmount The dark amount that follows the actual interpolation of the
+ * animation curve.
+ */
+ public void setDarkAmount(float linearDarkAmount, float interpolatedDarkAmount) {
+ mLinearDarkAmount = linearDarkAmount;
+ mInterpolatedDarkAmount = interpolatedDarkAmount;
boolean wasFullyDark = mAmbientState.isFullyDark();
- mAmbientState.setDarkAmount(darkAmount);
- if (mAmbientState.isFullyDark() != wasFullyDark) {
+ mAmbientState.setDarkAmount(interpolatedDarkAmount);
+ boolean nowFullyDark = mAmbientState.isFullyDark();
+ if (nowFullyDark != wasFullyDark) {
updateContentHeight();
DozeParameters dozeParameters = DozeParameters.getInstance(mContext);
- if (mAmbientState.isFullyDark() && dozeParameters.shouldControlScreenOff()) {
+ if (nowFullyDark && dozeParameters.shouldControlScreenOff()) {
mShelf.fadeInTranslating();
}
+ if (mIconAreaController != null) {
+ mIconAreaController.setFullyDark(nowFullyDark);
+ }
}
updateAlgorithmHeightAndPadding();
updateBackgroundDimming();
- updateAntiBurnInTranslation();
+ updatePanelTranslation();
requestChildrenUpdate();
}
- public float getDarkAmount() {
- return mDarkAmount;
+ public void notifyDarkAnimationStart(boolean dark) {
+ // We only swap the scaling factor if we're fully dark or fully awake to avoid
+ // interpolation issues when playing with the power button.
+ if (mInterpolatedDarkAmount == 0 || mInterpolatedDarkAmount == 1) {
+ mBackgroundXFactor = dark ? 1.8f : 1.5f;
+ mDarkXInterpolator = dark
+ ? Interpolators.FAST_OUT_SLOW_IN_REVERSE
+ : Interpolators.FAST_OUT_SLOW_IN;
+ }
}
- private void startDarkAmountAnimation() {
- ObjectAnimator darkAnimator = ObjectAnimator.ofFloat(this, DARK_AMOUNT, mDarkAmount,
- mAmbientState.isDark() ? 1f : 0);
- darkAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_WAKEUP);
- darkAnimator.setInterpolator(Interpolators.ALPHA_IN);
- darkAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mDarkAmountAnimator = null;
- }
- });
- if (mDarkAmountAnimator != null) {
- mDarkAmountAnimator.cancel();
+ public long getDarkAnimationDuration(boolean dark) {
+ long duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP;
+ // Longer animation when sleeping with more than 1 notification
+ if (dark && getNotGoneChildCount() > 2) {
+ duration *= 1.2f;
}
- mDarkAmountAnimator = darkAnimator;
- mDarkAmountAnimator.start();
+ return duration;
}
private int findDarkAnimationOriginIndex(@Nullable PointF screenLocation) {
@@ -4572,7 +4621,7 @@ public class NotificationStackScrollLayout extends ViewGroup
public void setAntiBurnInOffsetX(int antiBurnInOffsetX) {
mAntiBurnInOffsetX = antiBurnInOffsetX;
- updateAntiBurnInTranslation();
+ updatePanelTranslation();
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
@@ -4618,6 +4667,10 @@ public class NotificationStackScrollLayout extends ViewGroup
mHeadsUpAppearanceController = headsUpAppearanceController;
}
+ public void setIconAreaController(NotificationIconAreaController controller) {
+ mIconAreaController = controller;
+ }
+
/**
* A listener that is notified when the empty space below the notifications is clicked on
*/
@@ -4681,10 +4734,13 @@ public class NotificationStackScrollLayout extends ViewGroup
if (currView instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) currView;
- mCurrMenuRow = row.createMenu();
- mCurrMenuRow.setSwipeActionHelper(NotificationSwipeHelper.this);
- mCurrMenuRow.setMenuClickListener(NotificationStackScrollLayout.this);
- mCurrMenuRow.onTouchEvent(currView, ev, 0 /* velocity */);
+
+ if (row.getEntry().hasFinishedInitialization()) {
+ mCurrMenuRow = row.createMenu();
+ mCurrMenuRow.setSwipeActionHelper(NotificationSwipeHelper.this);
+ mCurrMenuRow.setMenuClickListener(NotificationStackScrollLayout.this);
+ mCurrMenuRow.onTouchEvent(currView, ev, 0 /* velocity */);
+ }
}
}
@@ -5031,11 +5087,13 @@ public class NotificationStackScrollLayout extends ViewGroup
// ANIMATION_TYPE_PULSE_APPEAR
new AnimationFilter()
.animateAlpha()
+ .hasDelays()
.animateY(),
// ANIMATION_TYPE_PULSE_DISAPPEAR
new AnimationFilter()
.animateAlpha()
+ .hasDelays()
.animateY(),
};
@@ -5099,10 +5157,10 @@ public class NotificationStackScrollLayout extends ViewGroup
StackStateAnimator.ANIMATION_DURATION_STANDARD,
// ANIMATION_TYPE_PULSE_APPEAR
- KeyguardSliceView.DEFAULT_ANIM_DURATION,
+ StackStateAnimator.ANIMATION_DURATION_PULSE_APPEAR,
// ANIMATION_TYPE_PULSE_DISAPPEAR
- KeyguardSliceView.DEFAULT_ANIM_DURATION / 2,
+ StackStateAnimator.ANIMATION_DURATION_PULSE_APPEAR / 2,
};
static final int ANIMATION_TYPE_ADD = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
index 0d50f5a9eef7..886bd5e3dd8d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -178,7 +178,7 @@ public class StackScrollAlgorithm {
return false;
}
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
- if (row.areGutsExposed()) {
+ if (row.areGutsExposed() || !row.getEntry().hasFinishedInitialization()) {
return false;
}
return row.canViewBeDismissed();
@@ -473,6 +473,15 @@ public class StackScrollAlgorithm {
childState.yTranslation = topState.yTranslation + topState.height
- childState.height;
}
+
+ // heads up notification show and this row is the top entry of heads up
+ // notifications. i.e. this row should be the only one row that has input field
+ // To check if the row need to do translation according to scroll Y
+ // heads up show full of row's content and any scroll y indicate that the
+ // translationY need to move up the HUN.
+ if (!mIsExpanded && isTopEntry && ambientState.getScrollY() > 0) {
+ childState.yTranslation -= ambientState.getScrollY();
+ }
}
if (row.isHeadsUpAnimatingAway()) {
childState.hidden = false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index a75d40f92011..b83a09dd02ad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -24,6 +24,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
+import com.android.keyguard.KeyguardSliceView;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.statusbar.ExpandableNotificationRow;
@@ -51,6 +52,8 @@ public class StackStateAnimator {
= (int) (ANIMATION_DURATION_HEADS_UP_APPEAR
* HeadsUpAppearInterpolator.getFractionUntilOvershoot());
public static final int ANIMATION_DURATION_HEADS_UP_DISAPPEAR = 300;
+ public static final int ANIMATION_DURATION_PULSE_APPEAR =
+ KeyguardSliceView.DEFAULT_ANIM_DURATION;
public static final int ANIMATION_DURATION_BLOCKING_HELPER_FADE = 240;
public static final int ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING = 80;
public static final int ANIMATION_DELAY_PER_ELEMENT_MANUAL = 32;
@@ -430,15 +433,26 @@ public class StackStateAnimator {
} else if (event.animationType == NotificationStackScrollLayout
.AnimationEvent.ANIMATION_TYPE_PULSE_APPEAR) {
ExpandableViewState viewState = finalState.getViewStateForView(changingView);
- mTmpState.copyFrom(viewState);
- mTmpState.yTranslation += mPulsingAppearingTranslation;
- mTmpState.alpha = 0;
- mTmpState.applyToView(changingView);
+ if (viewState != null) {
+ mTmpState.copyFrom(viewState);
+ mTmpState.yTranslation += mPulsingAppearingTranslation;
+ mTmpState.alpha = 0;
+ mTmpState.applyToView(changingView);
+ }
} else if (event.animationType == NotificationStackScrollLayout
.AnimationEvent.ANIMATION_TYPE_PULSE_DISAPPEAR) {
ExpandableViewState viewState = finalState.getViewStateForView(changingView);
- viewState.yTranslation += mPulsingAppearingTranslation;
- viewState.alpha = 0;
+ if (viewState != null) {
+ viewState.alpha = 0;
+ // We want to animate the alpha away before the view starts translating,
+ // otherwise everything will overlap and look xtra ugly.
+ float originalYTranslation = viewState.yTranslation;
+ viewState.yTranslation = changingView.getTranslationY();
+ mAnimationFilter.animateAlpha = true;
+ mAnimationProperties.duration = ANIMATION_DURATION_PULSE_APPEAR / 2;
+ viewState.animateTo(changingView, mAnimationProperties);
+ viewState.yTranslation = originalYTranslation;
+ }
} else if (event.animationType == NotificationStackScrollLayout
.AnimationEvent.ANIMATION_TYPE_HEADS_UP_APPEAR) {
// This item is added, initialize it's properties.
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
index 1a51dabe209a..499be42b0b8c 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/BatteryPreference.java
@@ -16,7 +16,7 @@ package com.android.systemui.tuner;
import android.content.Context;
import android.provider.Settings;
-import android.support.v7.preference.DropDownPreference;
+import androidx.preference.DropDownPreference;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.AttributeSet;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/BetterListPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/BetterListPreference.java
index c9c780aa6a70..702abeabc136 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/BetterListPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/BetterListPreference.java
@@ -15,7 +15,7 @@
package com.android.systemui.tuner;
import android.content.Context;
-import android.support.v7.preference.ListPreference;
+import androidx.preference.ListPreference;
import android.util.AttributeSet;
public class BetterListPreference extends ListPreference {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java
index 014ec9279395..16ab65c341ca 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/ClockPreference.java
@@ -14,7 +14,7 @@
package com.android.systemui.tuner;
import android.content.Context;
-import android.support.v7.preference.DropDownPreference;
+import androidx.preference.DropDownPreference;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.AttributeSet;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/CustomListPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/CustomListPreference.java
index e50fd5e2c5c5..8da0043bf439 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/CustomListPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/CustomListPreference.java
@@ -22,8 +22,8 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
-import android.support.v14.preference.ListPreferenceDialogFragment;
-import android.support.v7.preference.ListPreference;
+import androidx.preference.ListPreferenceDialogFragment;
+import androidx.preference.ListPreference;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
index b3c86c6c6a7b..a0f278bfbb8a 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/DemoModeFragment.java
@@ -23,11 +23,11 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.SwitchPreference;
+import androidx.preference.Preference;
+import androidx.preference.Preference.OnPreferenceChangeListener;
+import androidx.preference.PreferenceScreen;
import android.view.MenuItem;
import com.android.internal.logging.MetricsLogger;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java
index 2df1793acb47..d63235ca8d26 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/LockscreenFragment.java
@@ -30,13 +30,13 @@ import android.graphics.drawable.ScaleDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Process;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceGroup;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.RecyclerView.ViewHolder;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.SwitchPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java b/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java
index eb0c89b06528..e3a452a0786a 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/NavBarTuner.java
@@ -34,9 +34,9 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.Handler;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.Preference.OnPreferenceChangeListener;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
import android.util.Log;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/OtherPrefs.java b/packages/SystemUI/src/com/android/systemui/tuner/OtherPrefs.java
index 205db323ba41..d766145f27db 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/OtherPrefs.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/OtherPrefs.java
@@ -15,7 +15,7 @@
package com.android.systemui.tuner;
import android.os.Bundle;
-import android.support.v14.preference.PreferenceFragment;
+import androidx.preference.PreferenceFragment;
import com.android.systemui.R;
public class OtherPrefs extends PreferenceFragment {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java
index 27bf534c290e..c2948060d6bf 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java
@@ -25,10 +25,10 @@ import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.SwitchPreference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.PreferenceViewHolder;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.view.View;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java
index 3a2a6c3c4b64..d80c649be1ba 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java
@@ -21,9 +21,9 @@ import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/SelectablePreference.java b/packages/SystemUI/src/com/android/systemui/tuner/SelectablePreference.java
index 1d1570846a4f..dded464901ac 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/SelectablePreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/SelectablePreference.java
@@ -16,7 +16,7 @@ package com.android.systemui.tuner;
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.support.v7.preference.CheckBoxPreference;
+import androidx.preference.CheckBoxPreference;
import android.util.TypedValue;
import com.android.systemui.statusbar.ScalingDrawableWrapper;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java b/packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java
index 533388a1a5d8..3c9d25d13350 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/ShortcutPicker.java
@@ -23,11 +23,11 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Process;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.preference.PreferenceViewHolder;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.PreferenceViewHolder;
import com.android.systemui.Dependency;
import com.android.systemui.R;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
index 8a2407ac1d08..670fcc2a4d15 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java
@@ -19,7 +19,7 @@ import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
+import androidx.preference.SwitchPreference;
import android.text.TextUtils;
import android.util.AttributeSet;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
index 474a9a46c326..526e69bba795 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java
@@ -18,9 +18,9 @@ package com.android.systemui.tuner;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import android.util.Log;
import android.view.MenuItem;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
index df2be489b886..088630fa3f56 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java
@@ -22,8 +22,8 @@ import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.Preference;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerPreferenceFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerPreferenceFragment.java
index 06d40da4557e..a22277eea05b 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerPreferenceFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerPreferenceFragment.java
@@ -16,8 +16,8 @@ package com.android.systemui.tuner;
import android.app.DialogFragment;
import android.os.Bundle;
-import android.support.v14.preference.PreferenceFragment;
-import android.support.v7.preference.Preference;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.Preference;
public abstract class TunerPreferenceFragment extends PreferenceFragment {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
index d5b6ccdeb320..f53d51690712 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerSwitch.java
@@ -3,7 +3,7 @@ package com.android.systemui.tuner;
import android.content.Context;
import android.content.res.TypedArray;
import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
+import androidx.preference.SwitchPreference;
import android.util.AttributeSet;
import com.android.internal.logging.MetricsLogger;
diff --git a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
index 67fa049d688f..c468fef293de 100644
--- a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
+++ b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java
@@ -113,7 +113,7 @@ public class NotificationChannels extends SystemUI {
NotificationChannel screenshotChannel = new NotificationChannel(SCREENSHOTS_HEADSUP,
name, NotificationManager.IMPORTANCE_HIGH); // pop on screen
- screenshotChannel.setSound(Uri.parse(""), // silent
+ screenshotChannel.setSound(null, // silent
new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build());
screenshotChannel.setBlockableSystem(true);
diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java
index eca612776f21..6812410c851c 100644
--- a/packages/SystemUI/src/com/android/systemui/util/Utils.java
+++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java
@@ -26,11 +26,14 @@ public class Utils {
/**
* Allows lambda iteration over a list. It is done in reverse order so it is safe
- * to add or remove items during the iteration.
+ * to add or remove items during the iteration. Skips over null items.
*/
public static <T> void safeForeach(List<T> list, Consumer<T> c) {
for (int i = list.size() - 1; i >= 0; i--) {
- c.accept(list.get(i));
+ T item = list.get(i);
+ if (item != null) {
+ c.accept(item);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java b/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java
index 2995eba2b8a7..9b15b00b9242 100644
--- a/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java
+++ b/packages/SystemUI/src/com/android/systemui/util/leak/DumpTruck.java
@@ -20,7 +20,7 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
-import android.support.v4.content.FileProvider;
+import androidx.core.content.FileProvider;
import android.util.Log;
import com.android.systemui.Dependency;
diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
index b2cc2694916e..3c88d29f1711 100644
--- a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java
@@ -37,6 +37,7 @@ import android.os.Message;
import android.os.Process;
import android.os.SystemProperties;
import android.provider.Settings;
+import androidx.annotation.VisibleForTesting;
import android.service.quicksettings.Tile;
import android.text.format.DateUtils;
import android.util.Log;
diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/LeakReporter.java b/packages/SystemUI/src/com/android/systemui/util/leak/LeakReporter.java
index a247f3fe15dd..8ea5fd4ee93c 100644
--- a/packages/SystemUI/src/com/android/systemui/util/leak/LeakReporter.java
+++ b/packages/SystemUI/src/com/android/systemui/util/leak/LeakReporter.java
@@ -27,7 +27,7 @@ import android.net.Uri;
import android.os.Debug;
import android.os.SystemProperties;
import android.os.UserHandle;
-import android.support.v4.content.FileProvider;
+import androidx.core.content.FileProvider;
import android.util.Log;
import com.google.android.collect.Lists;
diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java
index a901e88219a5..b83590979ef7 100644
--- a/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java
+++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java
@@ -23,7 +23,7 @@ import android.os.Handler;
*/
public class DelayedWakeLock implements WakeLock {
- private static final long RELEASE_DELAY_MS = 140;
+ private static final long RELEASE_DELAY_MS = 100;
private final Handler mHandler;
private final WakeLock mInner;
diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
index edf294e772f7..16ce35c50ea2 100644
--- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
+++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
@@ -18,7 +18,7 @@ package com.android.systemui.util.wakelock;
import android.content.Context;
import android.os.PowerManager;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.VisibleForTesting;
/** WakeLock wrapper for testability */
public interface WakeLock {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
index d7fad67c7f09..2cbb78a4a8f5 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/CarVolumeDialogImpl.java
@@ -193,11 +193,11 @@ public class CarVolumeDialogImpl implements VolumeDialog {
}
public void show(int reason) {
- mHandler.obtainMessage(H.SHOW, reason, 0).sendToTarget();
+ mHandler.obtainMessage(H.SHOW, reason).sendToTarget();
}
public void dismiss(int reason) {
- mHandler.obtainMessage(H.DISMISS, reason, 0).sendToTarget();
+ mHandler.obtainMessage(H.DISMISS, reason).sendToTarget();
}
private void showH(int reason) {
@@ -223,7 +223,7 @@ public class CarVolumeDialogImpl implements VolumeDialog {
mHandler.removeMessages(H.DISMISS);
final int timeout = computeTimeoutH();
mHandler.sendMessageDelayed(mHandler
- .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT, 0), timeout);
+ .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT), timeout);
if (D.BUG) {
Log.d(TAG, "rescheduleTimeout " + timeout + " " + Debug.getCaller());
@@ -246,7 +246,6 @@ public class CarVolumeDialogImpl implements VolumeDialog {
}
mListView.animate().cancel();
- mShowing = false;
mListView.setTranslationY(0);
mListView.setAlpha(1);
@@ -260,6 +259,7 @@ public class CarVolumeDialogImpl implements VolumeDialog {
Log.d(TAG, "mDialog.dismiss()");
}
mDialog.dismiss();
+ mShowing = false;
}, DISMISS_DELAY_IN_MILLIS))
.start();
@@ -351,11 +351,11 @@ public class CarVolumeDialogImpl implements VolumeDialog {
listItem.setOnSeekBarChangeListener(
new CarVolumeDialogImpl.VolumeSeekBarChangeListener(volumeGroupId, mCarAudioManager));
Drawable primaryIcon = mContext.getResources().getDrawable(volumeItem.icon);
- primaryIcon.setTint(color);
+ primaryIcon.mutate().setTint(color);
listItem.setPrimaryActionIcon(primaryIcon);
if (supplementalIconId != 0) {
Drawable supplementalIcon = mContext.getResources().getDrawable(supplementalIconId);
- supplementalIcon.setTint(color);
+ supplementalIcon.mutate().setTint(color);
listItem.setSupplementalIcon(supplementalIcon, true,
supplementalIconOnClickListener);
} else {
@@ -436,7 +436,8 @@ public class CarVolumeDialogImpl implements VolumeDialog {
public boolean onTouchEvent(MotionEvent event) {
if (isShowing()) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
- dismissH(Events.DISMISS_REASON_TOUCH_OUTSIDE);
+ mHandler.obtainMessage(
+ H.DISMISS, Events.DISMISS_REASON_TOUCH_OUTSIDE).sendToTarget();
return true;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/MediaRouterWrapper.java b/packages/SystemUI/src/com/android/systemui/volume/MediaRouterWrapper.java
index 3423452c2a27..9965b0459b9a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/MediaRouterWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/MediaRouterWrapper.java
@@ -16,8 +16,8 @@
package com.android.systemui.volume;
-import android.support.v7.media.MediaRouteSelector;
-import android.support.v7.media.MediaRouter;
+import androidx.mediarouter.media.MediaRouteSelector;
+import androidx.mediarouter.media.MediaRouter;
import java.util.List;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
index dd552646955a..2861dffe5460 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
@@ -61,7 +61,7 @@ public class VolumeDialogComponent implements VolumeComponent, TunerService.Tuna
private final VolumeDialogControllerImpl mController;
private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges(
ActivityInfo.CONFIG_FONT_SCALE | ActivityInfo.CONFIG_LOCALE
- | ActivityInfo.CONFIG_ASSETS_PATHS);
+ | ActivityInfo.CONFIG_ASSETS_PATHS | ActivityInfo.CONFIG_UI_MODE);
private VolumeDialog mDialog;
private VolumePolicy mVolumePolicy = new VolumePolicy(
DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT, // volumeDownToEnterSilent
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index ed243ef6a417..955939cffb2e 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -227,10 +227,9 @@ public class VolumeDialogImpl implements VolumeDialog {
return true;
});
- mActiveTint = ColorStateList.valueOf(Utils.getColorAccent(mContext));
+ mActiveTint = Utils.getColorAccent(mContext);
mActiveAlpha = Color.alpha(mActiveTint.getDefaultColor());
- mInactiveTint = ColorStateList.valueOf(
- Utils.getColorAttr(mContext, android.R.attr.colorForeground));
+ mInactiveTint = Utils.getColorAttr(mContext, android.R.attr.colorForeground);
mInactiveAlpha = getAlphaAttr(android.R.attr.secondaryContentAlpha);
mDialogRowsView = mDialog.findViewById(R.id.volume_dialog_rows);
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index ef0c1c313cd8..77716df59e2b 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -40,20 +40,20 @@ LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
LOCAL_STATIC_ANDROID_LIBRARIES := \
SystemUIPluginLib \
SystemUISharedLib \
- android-support-car \
- android-support-v4 \
- android-support-v7-recyclerview \
- android-support-v7-preference \
- android-support-v7-appcompat \
- android-support-v7-mediarouter \
- android-support-v7-palette \
- android-support-v14-preference \
- android-support-v17-leanback \
- android-slices-core \
- android-slices-view \
- android-slices-builders \
- android-arch-core-runtime \
- android-arch-lifecycle-extensions \
+ androidx.car_car \
+ androidx.legacy_legacy-support-v4 \
+ androidx.recyclerview_recyclerview \
+ androidx.preference_preference \
+ androidx.appcompat_appcompat \
+ androidx.mediarouter_mediarouter \
+ androidx.palette_palette \
+ androidx.legacy_legacy-preference-v14 \
+ androidx.leanback_leanback \
+ androidx.slice_slice-core \
+ androidx.slice_slice-view \
+ androidx.slice_slice-builders \
+ androidx.arch.core_core-runtime \
+ androidx.lifecycle_lifecycle-extensions \
LOCAL_STATIC_JAVA_LIBRARIES := \
metrics-helper-lib \
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
index fe235410cc26..6792bc080066 100644
--- a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -14,7 +14,10 @@
package com.android;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
import android.support.test.filters.LargeTest;
import android.support.test.filters.MediumTest;
@@ -31,11 +34,11 @@ import com.android.systemui.SysuiTestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.junit.internal.builders.AllDefaultPossibilitiesBuilder;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -72,9 +75,9 @@ public class AAAPlusPlusVerifySysuiRequiredTestPropertiesTest extends SysuiTestC
@Test
public void testAllClassInheritance() throws Throwable {
- boolean anyClassWrong = false;
+ ArrayList<String> fails = new ArrayList<>();
for (String className : getClassNamesFromClassPath()) {
- Class<?> cls = Class.forName(className, false, this.getClass().getClassLoader());
+ Class<?> cls = Class.forName(className, false, this.getClass().getClassLoader());
if (!isTestClass(cls)) continue;
boolean hasParent = false;
@@ -86,17 +89,15 @@ public class AAAPlusPlusVerifySysuiRequiredTestPropertiesTest extends SysuiTestC
}
boolean hasSize = hasSize(cls);
if (!hasSize) {
- anyClassWrong = true;
- Log.e(TAG, cls.getName() + " does not have size annotation, such as @SmallTest");
+ fails.add(cls.getName() + " does not have size annotation, such as @SmallTest");
}
if (!hasParent) {
- anyClassWrong = true;
- Log.e(TAG, cls.getName() + " does not extend any of " + getClsStr());
+ fails.add(cls.getName() + " does not extend any of " + getClsStr());
}
}
- assertFalse("All sysui test classes must have size and extend one of " + getClsStr(),
- anyClassWrong);
+ assertThat("All sysui test classes must have size and extend one of " + getClsStr(),
+ fails, is(empty()));
}
private boolean hasSize(Class<?> cls) {
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java
index 189b1eed15e3..d2e837158872 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java
@@ -105,4 +105,4 @@ public class KeyguardSliceViewTest extends SysuiTestCase {
Assert.assertEquals("Should be using AOD text color", Color.WHITE,
mKeyguardSliceView.getTextColor());
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
index 8153953a0c38..13dc36da2698 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java
@@ -93,7 +93,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase {
SysuiColorExtractor extractor = getTestableExtractor(colors);
simulateEvent(extractor);
extractor.setWallpaperVisible(true);
- extractor.setMediaBackdropVisible(true);
+ extractor.setHasBackdrop(true);
ColorExtractor.GradientColors fallbackColors = extractor.getFallbackColors();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
index 64507be764de..bb67d6e03a9d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationTest.java
@@ -16,7 +16,7 @@
package com.android.systemui.doze;
-import static org.junit.Assert.assertTrue;
+import static junit.framework.TestCase.assertEquals;
import android.os.UserHandle;
import android.provider.Settings;
@@ -42,14 +42,15 @@ public class DozeConfigurationTest extends SysuiTestCase {
}
@Test
- public void alwaysOn_onByDefault() throws Exception {
+ public void alwaysOn_followsConfigByDefault() throws Exception {
if (!mDozeConfig.alwaysOnAvailable()) {
return;
}
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.DOZE_ALWAYS_ON,
null);
-
- assertTrue(mDozeConfig.alwaysOnEnabled(UserHandle.USER_CURRENT));
+ boolean defaultValue = mContext.getResources()
+ .getBoolean(com.android.internal.R.bool.config_dozeAlwaysOnEnabled);
+ assertEquals(mDozeConfig.alwaysOnEnabled(UserHandle.USER_CURRENT), defaultValue);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
index cf32760dc803..f8aa28dbb945 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
@@ -27,7 +27,7 @@ import static org.mockito.Matchers.argThat;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityOptions;
-import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.IApplicationThread;
import android.app.ProfilerInfo;
import android.content.ComponentName;
@@ -62,7 +62,7 @@ public class WorkLockActivityControllerTest extends SysuiTestCase {
private @Mock Context mContext;
private @Mock ActivityManagerWrapper mActivityManager;
- private @Mock IActivityManager mIActivityManager;
+ private @Mock IActivityTaskManager mIActivityTaskManager;
private WorkLockActivityController mController;
private SysUiTaskStackChangeListener mTaskStackListener;
@@ -77,7 +77,8 @@ public class WorkLockActivityControllerTest extends SysuiTestCase {
// Construct controller. Save the TaskStackListener for injecting events.
final ArgumentCaptor<SysUiTaskStackChangeListener> listenerCaptor =
ArgumentCaptor.forClass(SysUiTaskStackChangeListener.class);
- mController = new WorkLockActivityController(mContext, mActivityManager, mIActivityManager);
+ mController = new WorkLockActivityController(mContext, mActivityManager,
+ mIActivityTaskManager);
verify(mActivityManager).registerTaskStackListener(listenerCaptor.capture());
mTaskStackListener = listenerCaptor.getValue();
@@ -93,7 +94,7 @@ public class WorkLockActivityControllerTest extends SysuiTestCase {
// The overlay should start and the task the activity started in should not be removed.
verifyStartActivity(TASK_ID, true /*taskOverlay*/);
- verify(mIActivityManager, never()).removeTask(anyInt() /*taskId*/);
+ verify(mIActivityTaskManager, never()).removeTask(anyInt() /*taskId*/);
}
@Test
@@ -107,14 +108,14 @@ public class WorkLockActivityControllerTest extends SysuiTestCase {
// The task the activity started in should be removed to prevent the locked task from
// being shown.
verifyStartActivity(TASK_ID, true /*taskOverlay*/);
- verify(mIActivityManager).removeTask(TASK_ID);
+ verify(mIActivityTaskManager).removeTask(TASK_ID);
}
// End of tests, start of helpers
// ------------------------------
private void setActivityStartCode(int taskId, boolean taskOverlay, int code) throws Exception {
- doReturn(code).when(mIActivityManager).startActivityAsUser(
+ doReturn(code).when(mIActivityTaskManager).startActivityAsUser(
eq((IApplicationThread) null),
eq((String) null),
any(Intent.class),
@@ -129,7 +130,7 @@ public class WorkLockActivityControllerTest extends SysuiTestCase {
}
private void verifyStartActivity(int taskId, boolean taskOverlay) throws Exception {
- verify(mIActivityManager).startActivityAsUser(
+ verify(mIActivityTaskManager).startActivityAsUser(
eq((IApplicationThread) null),
eq((String) null),
any(Intent.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
index d19715d5c5cc..5ecf0c04aeb1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java
@@ -24,6 +24,7 @@ import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -66,6 +67,8 @@ public class PowerUITest extends SysuiTestCase {
public static final long BELOW_HYBRID_THRESHOLD = TimeUnit.HOURS.toMillis(2);
public static final long ABOVE_HYBRID_THRESHOLD = TimeUnit.HOURS.toMillis(4);
private static final long ABOVE_CHARGE_CYCLE_THRESHOLD = Duration.ofHours(8).toMillis();
+ private static final int OLD_BATTERY_LEVEL_NINE = 9;
+ private static final int OLD_BATTERY_LEVEL_10 = 10;
private HardwarePropertiesManager mHardProps;
private WarningsUI mMockWarnings;
private PowerUI mPowerUI;
@@ -307,8 +310,8 @@ public class PowerUITest extends SysuiTestCase {
.thenReturn(new Estimate(BELOW_HYBRID_THRESHOLD, true));
mPowerUI.mBatteryStatus = BatteryManager.BATTERY_HEALTH_GOOD;
- mPowerUI.maybeShowBatteryWarning(UNPLUGGED, UNPLUGGED, ABOVE_WARNING_BUCKET,
- ABOVE_WARNING_BUCKET);
+ mPowerUI.maybeShowBatteryWarning(OLD_BATTERY_LEVEL_NINE, UNPLUGGED, UNPLUGGED,
+ ABOVE_WARNING_BUCKET, ABOVE_WARNING_BUCKET);
// reduce battery level to handle time based trigger -> level trigger interactions
mPowerUI.mBatteryLevel = 10;
@@ -449,6 +452,33 @@ public class PowerUITest extends SysuiTestCase {
verify(mMockWarnings, never()).dismissLowBatteryWarning();
}
+ @Test
+ public void testMaybeShowBatteryWarning_onlyQueriesEstimateOnBatteryLevelChangeOrNull() {
+ mPowerUI.start();
+ Estimate estimate = new Estimate(BELOW_HYBRID_THRESHOLD, true);
+ when(mEnhancedEstimates.isHybridNotificationEnabled()).thenReturn(true);
+ when(mEnhancedEstimates.getLowWarningThreshold()).thenReturn(PowerUI.THREE_HOURS_IN_MILLIS);
+ when(mEnhancedEstimates.getSevereWarningThreshold()).thenReturn(ONE_HOUR_MILLIS);
+ when(mEnhancedEstimates.getEstimate()).thenReturn(estimate);
+ mPowerUI.mBatteryStatus = BatteryManager.BATTERY_HEALTH_GOOD;
+
+ // we expect that the first time it will query even if the level is the same
+ mPowerUI.mBatteryLevel = 9;
+ mPowerUI.maybeShowBatteryWarning(OLD_BATTERY_LEVEL_NINE, UNPLUGGED, UNPLUGGED,
+ ABOVE_WARNING_BUCKET, ABOVE_WARNING_BUCKET);
+ verify(mEnhancedEstimates, times(1)).getEstimate();
+
+ // We should NOT query again if the battery level hasn't changed
+ mPowerUI.maybeShowBatteryWarning(OLD_BATTERY_LEVEL_NINE, UNPLUGGED, UNPLUGGED,
+ ABOVE_WARNING_BUCKET, ABOVE_WARNING_BUCKET);
+ verify(mEnhancedEstimates, times(1)).getEstimate();
+
+ // Battery level has changed, so we should query again
+ mPowerUI.maybeShowBatteryWarning(OLD_BATTERY_LEVEL_10, UNPLUGGED, UNPLUGGED,
+ ABOVE_WARNING_BUCKET, ABOVE_WARNING_BUCKET);
+ verify(mEnhancedEstimates, times(2)).getEstimate();
+ }
+
private void setCurrentTemp(float temp) {
when(mHardProps.getDeviceTemperatures(DEVICE_TEMPERATURE_SKIN, TEMPERATURE_CURRENT))
.thenReturn(new float[] { temp });
diff --git a/packages/SystemUI/tests/src/com/android/systemui/recents/RecentsTest.java b/packages/SystemUI/tests/src/com/android/systemui/recents/RecentsTest.java
index bdbd24418d3f..2160f9a2ac0f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/recents/RecentsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/recents/RecentsTest.java
@@ -23,9 +23,9 @@ import static com.android.systemui.recents.RecentsImpl.RECENTS_PACKAGE;
import static org.junit.Assert.fail;
-import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
-import android.app.IActivityManager;
+import android.app.ActivityTaskManager;
+import android.app.IActivityTaskManager;
import android.os.SystemClock;
import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
@@ -44,8 +44,8 @@ public class RecentsTest extends SysuiTestCase {
@Test
public void testRecentsActivityType() throws Exception {
// Clear the state
- final IActivityManager am = ActivityManager.getService();
- am.removeStacksWithActivityTypes(new int[] { ACTIVITY_TYPE_RECENTS });
+ final IActivityTaskManager atm = ActivityTaskManager.getService();
+ atm.removeStacksWithActivityTypes(new int[] { ACTIVITY_TYPE_RECENTS });
// Toggle recents, use a shell command because it is not exported
runShellCommand("am start -n " + RECENTS_PACKAGE + "/" + RECENTS_ACTIVITY);
@@ -53,7 +53,7 @@ public class RecentsTest extends SysuiTestCase {
// Verify that an activity was launched with the right activity type
int retryCount = 0;
while (retryCount < 10) {
- List<RunningTaskInfo> tasks = am.getTasks(Integer.MAX_VALUE);
+ List<RunningTaskInfo> tasks = atm.getTasks(Integer.MAX_VALUE);
for (RunningTaskInfo info : tasks) {
if (info.configuration.windowConfiguration.getActivityType()
== ACTIVITY_TYPE_RECENTS) {
@@ -66,4 +66,4 @@ public class RecentsTest extends SysuiTestCase {
}
fail("Expected Recents activity with ACTIVITY_TYPE_RECENTS");
}
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
index ff12c5373af8..f363cf05fe29 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
@@ -308,4 +308,12 @@ public class ExpandableNotificationRowTest extends SysuiTestCase {
mGroupRow.resetTranslation();
assertEquals(0, mGroupRow.getEntry().expandedIcon.getScrollX());
}
+
+ @Test
+ public void testIsExpanded_userExpanded() {
+ mGroupRow.setExpandable(true);
+ Assert.assertFalse(mGroupRow.isExpanded());
+ mGroupRow.setUserExpanded(true);
+ Assert.assertTrue(mGroupRow.isExpanded());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java
index 9638541ead42..43660328e783 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java
@@ -147,6 +147,7 @@ public class NotificationBlockingHelperManagerTest extends SysuiTestCase {
// of the child row.
ExpandableNotificationRow childRow = groupRow.getChildrenContainer().getViewAtPosition(0);
childRow.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
+ assertFalse(childRow.getIsNonblockable());
assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(childRow, mMenuRow));
@@ -220,6 +221,24 @@ public class NotificationBlockingHelperManagerTest extends SysuiTestCase {
verify(mEntryManager).updateNotifications();
}
+ @Test
+ public void testNonBlockable_package() {
+ mBlockingHelperManager.setNonBlockablePkgs(new String[] {"banana", "strawberry:pie"});
+
+ assertFalse(mBlockingHelperManager.isNonblockable("orange", "pie"));
+
+ assertTrue(mBlockingHelperManager.isNonblockable("banana", "pie"));
+ }
+
+ @Test
+ public void testNonBlockable_channel() {
+ mBlockingHelperManager.setNonBlockablePkgs(new String[] {"banana", "strawberry:pie"});
+
+ assertFalse(mBlockingHelperManager.isNonblockable("strawberry", "shortcake"));
+
+ assertTrue(mBlockingHelperManager.isNonblockable("strawberry", "pie"));
+ }
+
private ExpandableNotificationRow createBlockableRowSpy() throws Exception {
ExpandableNotificationRow row = spy(mHelper.createRow());
when(row.getIsNonblockable()).thenReturn(false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
index 77522e44b183..f2f58938009b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
@@ -38,11 +38,16 @@ import static org.mockito.Mockito.when;
import android.Manifest;
import android.app.Notification;
import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.content.Intent;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.graphics.drawable.Icon;
import android.media.session.MediaSession;
import android.os.Bundle;
import android.service.notification.NotificationListenerService;
+import android.service.notification.NotificationListenerService.Ranking;
+import android.service.notification.SnoozeCriterion;
import android.service.notification.StatusBarNotification;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.SmallTest;
@@ -72,6 +77,8 @@ public class NotificationDataTest extends SysuiTestCase {
private static final int UID_ALLOW_DURING_SETUP = 456;
private static final String TEST_HIDDEN_NOTIFICATION_KEY = "testHiddenNotificationKey";
private static final String TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY = "exempt";
+ private static final NotificationChannel NOTIFICATION_CHANNEL =
+ new NotificationChannel("id", "name", NotificationChannel.USER_LOCKED_IMPORTANCE);
private final StatusBarNotification mMockStatusBarNotification =
mock(StatusBarNotification.class);
@@ -145,11 +152,9 @@ public class NotificationDataTest extends SysuiTestCase {
@Test
public void testChannelSetWhenAdded() {
mNotificationData.add(mRow.getEntry());
- Assert.assertTrue(mRow.getEntry().channel != null);
+ assertEquals(NOTIFICATION_CHANNEL, mRow.getEntry().channel);
}
-
-
@Test
public void testAllRelevantNotisTaggedWithAppOps() throws Exception {
mNotificationData.add(mRow.getEntry());
@@ -373,6 +378,32 @@ public class NotificationDataTest extends SysuiTestCase {
assertFalse(mNotificationData.isExemptFromDndVisualSuppression(entry));
}
+ @Test
+ public void testCreateNotificationDataEntry_RankingUpdate() {
+ Ranking ranking = mock(Ranking.class);
+
+ ArrayList<Notification.Action> smartActions = new ArrayList<>();
+ smartActions.add(createAction());
+ when(ranking.getSmartActions()).thenReturn(smartActions);
+
+ when(ranking.getChannel()).thenReturn(NOTIFICATION_CHANNEL);
+
+ when(ranking.getUserSentiment()).thenReturn(Ranking.USER_SENTIMENT_NEGATIVE);
+
+ SnoozeCriterion snoozeCriterion = new SnoozeCriterion("id", "explanation", "confirmation");
+ ArrayList<SnoozeCriterion> snoozeCriterions = new ArrayList<>();
+ snoozeCriterions.add(snoozeCriterion);
+ when(ranking.getSnoozeCriteria()).thenReturn(snoozeCriterions);
+
+ NotificationData.Entry entry =
+ new NotificationData.Entry(mMockStatusBarNotification, ranking);
+
+ assertEquals(smartActions, entry.smartActions);
+ assertEquals(NOTIFICATION_CHANNEL, entry.channel);
+ assertEquals(Ranking.USER_SENTIMENT_NEGATIVE, entry.userSentiment);
+ assertEquals(snoozeCriterions, entry.snoozeCriteria);
+ }
+
private void initStatusBarNotification(boolean allowDuringSetup) {
Bundle bundle = new Bundle();
bundle.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, allowDuringSetup);
@@ -388,12 +419,7 @@ public class NotificationDataTest extends SysuiTestCase {
}
@Override
- public NotificationChannel getChannel(String key) {
- return new NotificationChannel(null, null, 0);
- }
-
- @Override
- protected boolean getRanking(String key, NotificationListenerService.Ranking outRanking) {
+ protected boolean getRanking(String key, Ranking outRanking) {
super.getRanking(key, outRanking);
if (key.equals(TEST_HIDDEN_NOTIFICATION_KEY)) {
outRanking.populate(key, outRanking.getRank(),
@@ -401,23 +427,31 @@ public class NotificationDataTest extends SysuiTestCase {
outRanking.getVisibilityOverride(), outRanking.getSuppressedVisualEffects(),
outRanking.getImportance(), outRanking.getImportanceExplanation(),
outRanking.getOverrideGroupKey(), outRanking.getChannel(), null, null,
- outRanking.canShowBadge(), outRanking.getUserSentiment(), true);
+ outRanking.canShowBadge(), outRanking.getUserSentiment(), true,
+ null);
} else if (key.equals(TEST_EXEMPT_DND_VISUAL_SUPPRESSION_KEY)) {
outRanking.populate(key, outRanking.getRank(),
outRanking.matchesInterruptionFilter(),
outRanking.getVisibilityOverride(), 255,
outRanking.getImportance(), outRanking.getImportanceExplanation(),
outRanking.getOverrideGroupKey(), outRanking.getChannel(), null, null,
- outRanking.canShowBadge(), outRanking.getUserSentiment(), true);
+ outRanking.canShowBadge(), outRanking.getUserSentiment(), true, null);
} else {
outRanking.populate(key, outRanking.getRank(),
outRanking.matchesInterruptionFilter(),
outRanking.getVisibilityOverride(), outRanking.getSuppressedVisualEffects(),
outRanking.getImportance(), outRanking.getImportanceExplanation(),
- outRanking.getOverrideGroupKey(), outRanking.getChannel(), null, null,
- outRanking.canShowBadge(), outRanking.getUserSentiment(), false);
+ outRanking.getOverrideGroupKey(), NOTIFICATION_CHANNEL, null, null,
+ outRanking.canShowBadge(), outRanking.getUserSentiment(), false, null);
}
return true;
}
}
+
+ private Notification.Action createAction() {
+ return new Notification.Action.Builder(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ "action",
+ PendingIntent.getBroadcast(getContext(), 0, new Intent("Action"), 0)).build();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
index afe16cf13b76..e75e5786b463 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
@@ -37,7 +37,10 @@ import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.Notification;
import android.app.NotificationManager;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
@@ -54,6 +57,8 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.notification.NotificationInflater;
+import com.android.systemui.statusbar.notification.RowInflaterTask;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -68,6 +73,9 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -99,6 +107,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
@Mock private VisualStabilityManager mVisualStabilityManager;
@Mock private MetricsLogger mMetricsLogger;
@Mock private SmartReplyController mSmartReplyController;
+ @Mock private RowInflaterTask mAsyncInflationTask;
private NotificationData.Entry mEntry;
private StatusBarNotification mSbn;
@@ -139,7 +148,26 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
0,
NotificationManager.IMPORTANCE_DEFAULT,
null, null,
- null, null, null, true, sentiment, false);
+ null, null, null, true, sentiment, false, null);
+ return true;
+ }).when(mRankingMap).getRanking(eq(key), any(NotificationListenerService.Ranking.class));
+ }
+
+ private void setSmartActions(String key, ArrayList<Notification.Action> smartActions) {
+ doAnswer(invocationOnMock -> {
+ NotificationListenerService.Ranking ranking = (NotificationListenerService.Ranking)
+ invocationOnMock.getArguments()[1];
+ ranking.populate(
+ key,
+ 0,
+ false,
+ 0,
+ 0,
+ NotificationManager.IMPORTANCE_DEFAULT,
+ null, null,
+ null, null, null, true,
+ NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL, false,
+ smartActions);
return true;
}).when(mRankingMap).getRanking(eq(key), any(NotificationListenerService.Ranking.class));
}
@@ -427,4 +455,71 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
Assert.assertTrue(newSbn.getNotification().extras
.getBoolean(Notification.EXTRA_HIDE_SMART_REPLIES, false));
}
+
+ @Test
+ public void testUpdateNotificationRanking() {
+ when(mPresenter.isDeviceProvisioned()).thenReturn(true);
+ when(mPresenter.isNotificationForCurrentProfiles(any())).thenReturn(true);
+
+ mEntry.row = mRow;
+ mEntry.setInflationTask(mAsyncInflationTask);
+ mEntryManager.getNotificationData().add(mEntry);
+ setSmartActions(mEntry.key, new ArrayList<>(Arrays.asList(createAction())));
+
+ mEntryManager.updateNotificationRanking(mRankingMap);
+ verify(mRow).updateNotification(eq(mEntry));
+ assertEquals(1, mEntry.smartActions.size());
+ assertEquals("action", mEntry.smartActions.get(0).title);
+ }
+
+ @Test
+ public void testUpdateNotificationRanking_noChange() {
+ when(mPresenter.isDeviceProvisioned()).thenReturn(true);
+ when(mPresenter.isNotificationForCurrentProfiles(any())).thenReturn(true);
+
+ mEntry.row = mRow;
+ mEntryManager.getNotificationData().add(mEntry);
+ setSmartActions(mEntry.key, null);
+
+ mEntryManager.updateNotificationRanking(mRankingMap);
+ verify(mRow, never()).updateNotification(eq(mEntry));
+ assertEquals(0, mEntry.smartActions.size());
+ }
+
+ @Test
+ public void testUpdateNotificationRanking_rowNotInflatedYet() {
+ when(mPresenter.isDeviceProvisioned()).thenReturn(true);
+ when(mPresenter.isNotificationForCurrentProfiles(any())).thenReturn(true);
+
+ mEntry.row = null;
+ mEntryManager.getNotificationData().add(mEntry);
+ setSmartActions(mEntry.key, new ArrayList<>(Arrays.asList(createAction())));
+
+ mEntryManager.updateNotificationRanking(mRankingMap);
+ verify(mRow, never()).updateNotification(eq(mEntry));
+ assertEquals(1, mEntry.smartActions.size());
+ assertEquals("action", mEntry.smartActions.get(0).title);
+ }
+
+ @Test
+ public void testUpdateNotificationRanking_pendingNotification() {
+ when(mPresenter.isDeviceProvisioned()).thenReturn(true);
+ when(mPresenter.isNotificationForCurrentProfiles(any())).thenReturn(true);
+
+ mEntry.row = null;
+ mEntryManager.mPendingNotifications.put(mEntry.key, mEntry);
+ setSmartActions(mEntry.key, new ArrayList<>(Arrays.asList(createAction())));
+
+ mEntryManager.updateNotificationRanking(mRankingMap);
+ verify(mRow, never()).updateNotification(eq(mEntry));
+ assertEquals(1, mEntry.smartActions.size());
+ assertEquals("action", mEntry.smartActions.get(0).title);
+ }
+
+ private Notification.Action createAction() {
+ return new Notification.Action.Builder(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ "action",
+ PendingIntent.getBroadcast(getContext(), 0, new Intent("Action"), 0)).build();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java
index cba1b548611b..72255f3c8fa4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationGutsManagerTest.java
@@ -280,7 +280,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
any(PackageManager.class),
any(INotificationManager.class),
eq(statusBarNotification.getPackageName()),
- isNull(),
+ any(NotificationChannel.class),
anyInt(),
eq(statusBarNotification),
any(NotificationInfo.CheckSaveListener.class),
@@ -306,7 +306,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
any(PackageManager.class),
any(INotificationManager.class),
eq(statusBarNotification.getPackageName()),
- isNull(),
+ any(NotificationChannel.class),
anyInt(),
eq(statusBarNotification),
any(NotificationInfo.CheckSaveListener.class),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
index 2b0c6bfac988..c6bcd36c1abf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java
@@ -16,10 +16,13 @@
package com.android.systemui.statusbar;
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.Instrumentation;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.content.Context;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
@@ -118,7 +121,7 @@ public class NotificationTestHelper {
R.layout.custom_view_dark))
.build();
Notification.Builder notificationBuilder =
- new Notification.Builder(mContext)
+ new Notification.Builder(mContext, "channelId")
.setSmallIcon(R.drawable.ic_person)
.setContentTitle("Title")
.setContentText("Text")
@@ -166,6 +169,9 @@ public class NotificationTestHelper {
NotificationData.Entry entry = new NotificationData.Entry(sbn);
entry.row = row;
entry.createIcons(mContext, sbn);
+ entry.channel = new NotificationChannel(
+ notification.getChannelId(), notification.getChannelId(), IMPORTANCE_DEFAULT);
+ entry.channel.setBlockableSystem(true);
NotificationInflaterTest.runThenWaitForInflation(
() -> row.updateNotification(entry),
row.getNotificationInflater());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java
new file mode 100644
index 000000000000..ce47e60f3e1c
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationUiAdjustmentTest.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.app.RemoteInput;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
+import android.support.test.filters.SmallTest;
+
+import com.android.internal.R;
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Test;
+
+import java.util.Collections;
+
+@SmallTest
+public class NotificationUiAdjustmentTest extends SysuiTestCase {
+
+ @Test
+ public void needReinflate_differentLength() {
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+ Notification.Action action =
+ createActionBuilder("first", R.drawable.ic_corp_icon, pendingIntent).build();
+ assertThat(NotificationUiAdjustment.needReinflate(
+ new NotificationUiAdjustment("first", Collections.emptyList()),
+ new NotificationUiAdjustment("second", Collections.singletonList(action))))
+ .isTrue();
+ }
+
+ @Test
+ public void needReinflate_differentLabels() {
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+ Notification.Action firstAction =
+ createActionBuilder("first", R.drawable.ic_corp_icon, pendingIntent).build();
+ Notification.Action secondAction =
+ createActionBuilder("second", R.drawable.ic_corp_icon, pendingIntent).build();
+
+ assertThat(NotificationUiAdjustment.needReinflate(
+ new NotificationUiAdjustment("first", Collections.singletonList(firstAction)),
+ new NotificationUiAdjustment("second", Collections.singletonList(secondAction))))
+ .isTrue();
+ }
+
+ @Test
+ public void needReinflate_differentIcons() {
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+ Notification.Action firstAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, pendingIntent).build();
+ Notification.Action secondAction =
+ createActionBuilder("same", R.drawable.ic_account_circle, pendingIntent)
+ .build();
+
+ assertThat(NotificationUiAdjustment.needReinflate(
+ new NotificationUiAdjustment("first", Collections.singletonList(firstAction)),
+ new NotificationUiAdjustment("second", Collections.singletonList(secondAction))))
+ .isTrue();
+ }
+
+ @Test
+ public void needReinflate_differentPendingIntent() {
+ PendingIntent firstPendingIntent =
+ PendingIntent.getActivity(mContext, 0, new Intent(Intent.ACTION_VIEW), 0);
+ PendingIntent secondPendingIntent =
+ PendingIntent.getActivity(mContext, 0, new Intent(Intent.ACTION_PROCESS_TEXT), 0);
+ Notification.Action firstAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, firstPendingIntent)
+ .build();
+ Notification.Action secondAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, secondPendingIntent)
+ .build();
+
+ assertThat(NotificationUiAdjustment.needReinflate(
+ new NotificationUiAdjustment("first", Collections.singletonList(firstAction)),
+ new NotificationUiAdjustment("second", Collections.singletonList(secondAction))))
+ .isTrue();
+ }
+
+ @Test
+ public void needReinflate_differentChoices() {
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+
+ RemoteInput firstRemoteInput =
+ createRemoteInput("same", "same", new CharSequence[] {"first"});
+ RemoteInput secondRemoteInput =
+ createRemoteInput("same", "same", new CharSequence[] {"second"});
+
+ Notification.Action firstAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, pendingIntent)
+ .addRemoteInput(firstRemoteInput)
+ .build();
+ Notification.Action secondAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, pendingIntent)
+ .addRemoteInput(secondRemoteInput)
+ .build();
+
+ assertThat(NotificationUiAdjustment.needReinflate(
+ new NotificationUiAdjustment("first", Collections.singletonList(firstAction)),
+ new NotificationUiAdjustment("second", Collections.singletonList(secondAction))))
+ .isTrue();
+ }
+
+ @Test
+ public void needReinflate_differentRemoteInputLabel() {
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+
+ RemoteInput firstRemoteInput =
+ createRemoteInput("same", "first", new CharSequence[] {"same"});
+ RemoteInput secondRemoteInput =
+ createRemoteInput("same", "second", new CharSequence[] {"same"});
+
+ Notification.Action firstAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, pendingIntent)
+ .addRemoteInput(firstRemoteInput)
+ .build();
+ Notification.Action secondAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, pendingIntent)
+ .addRemoteInput(secondRemoteInput)
+ .build();
+
+ assertThat(NotificationUiAdjustment.needReinflate(
+ new NotificationUiAdjustment("first", Collections.singletonList(firstAction)),
+ new NotificationUiAdjustment("second", Collections.singletonList(secondAction))))
+ .isTrue();
+ }
+
+ @Test
+ public void needReinflate_negative() {
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+ RemoteInput firstRemoteInput =
+ createRemoteInput("same", "same", new CharSequence[] {"same"});
+ RemoteInput secondRemoteInput =
+ createRemoteInput("same", "same", new CharSequence[] {"same"});
+
+ Notification.Action firstAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, pendingIntent)
+ .addRemoteInput(firstRemoteInput).build();
+ Notification.Action secondAction =
+ createActionBuilder("same", R.drawable.ic_corp_icon, pendingIntent)
+ .addRemoteInput(secondRemoteInput).build();
+
+ assertThat(NotificationUiAdjustment.needReinflate(
+ new NotificationUiAdjustment("first", Collections.singletonList(firstAction)),
+ new NotificationUiAdjustment("second", Collections.singletonList(secondAction))))
+ .isFalse();
+ }
+
+ private Notification.Action.Builder createActionBuilder(
+ String title, int drawableRes, PendingIntent pendingIntent) {
+ return new Notification.Action.Builder(
+ Icon.createWithResource(mContext, drawableRes), title, pendingIntent);
+ }
+
+ private RemoteInput createRemoteInput(String resultKey, String label, CharSequence[] choices) {
+ return new RemoteInput.Builder(resultKey).setLabel(label).setChoices(choices).build();
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
index 7b2071ca14fd..8fee1071ba87 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java
@@ -42,7 +42,7 @@ import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.util.NotificationColorUtil;
+import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
@@ -115,7 +115,7 @@ public class StatusBarIconViewTest extends SysuiTestCase {
mIconView.setStaticDrawableColor(Color.WHITE);
color = mIconView.getContrastedStaticDrawableColor(Color.WHITE);
assertTrue("Similar colors should be shifted to satisfy contrast",
- NotificationColorUtil.satisfiesTextContrast(Color.WHITE, color));
+ ContrastColorUtil.satisfiesTextContrast(Color.WHITE, color));
mIconView.setStaticDrawableColor(Color.GREEN);
color = mIconView.getContrastedStaticDrawableColor(0xcc000000);
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 537bfd4be66c..fe7bf2537085 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
@@ -123,6 +123,27 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase {
}
@Test
+ public void testHeaderReadFromOldController() {
+ mHeadsUpAppearanceController.setExpandedHeight(1.0f, 1.0f);
+
+ HeadsUpAppearanceController newController = new HeadsUpAppearanceController(
+ mock(NotificationIconAreaController.class),
+ mHeadsUpManager,
+ mHeadsUpStatusBarView,
+ mStackScroller,
+ mPanelView,
+ new View(mContext));
+ newController.readFrom(mHeadsUpAppearanceController);
+
+ Assert.assertEquals(mHeadsUpAppearanceController.mExpandedHeight,
+ newController.mExpandedHeight, 0.0f);
+ Assert.assertEquals(mHeadsUpAppearanceController.mExpandFraction,
+ newController.mExpandFraction, 0.0f);
+ Assert.assertEquals(mHeadsUpAppearanceController.mIsExpanded,
+ newController.mIsExpanded);
+ }
+
+ @Test
public void testDestroy() {
reset(mHeadsUpManager);
reset(mDarkIconDispatcher);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index 12b14c807917..a7954f2aa199 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -35,6 +35,7 @@ import android.testing.TestableLooper;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
+import android.content.res.ColorStateList;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardHostView;
@@ -227,8 +228,8 @@ public class KeyguardBouncerTest extends SysuiTestCase {
public void testShowMessage_propagates() {
final String message = "a message";
mBouncer.ensureView();
- mBouncer.showMessage(message, Color.GREEN);
- verify(mKeyguardHostView).showMessage(eq(message), eq(Color.GREEN));
+ mBouncer.showMessage(message, ColorStateList.valueOf(Color.GREEN));
+ verify(mKeyguardHostView).showMessage(eq(message), eq(ColorStateList.valueOf(Color.GREEN)));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index e95702c5ab91..9c558748697a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -44,7 +44,6 @@ import android.view.View;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.util.function.TriConsumer;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.util.wakelock.WakeLock;
@@ -94,6 +93,7 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimInFrontColor = scrimInFrontColor;
},
visible -> mScrimVisibility = visible, mDozeParamenters, mAlarmManager);
+ mScrimController.setHasBackdrop(false);
}
@Test
@@ -140,15 +140,24 @@ public class ScrimControllerTest extends SysuiTestCase {
@Test
public void transitionToAod_withAodWallpaperAndLockScreenWallpaper() {
- ScrimState.AOD.mKeyguardUpdateMonitor = new KeyguardUpdateMonitor(getContext()) {
- @Override
- public boolean hasLockscreenWallpaper() {
- return true;
- }
- };
+ mScrimController.setHasBackdrop(true);
+ mScrimController.setWallpaperSupportsAmbientMode(true);
+ mScrimController.transitionTo(ScrimState.AOD);
+ mScrimController.finishAnimationsImmediately();
+ // Front scrim should be transparent
+ // Back scrim should be visible with tint
+ assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE);
+ assertScrimTint(mScrimBehind, true /* tinted */);
+ assertScrimTint(mScrimInFront, true /* tinted */);
+ }
+
+ @Test
+ public void setHasBackdrop_withAodWallpaperAndAlbumArt() {
mScrimController.setWallpaperSupportsAmbientMode(true);
mScrimController.transitionTo(ScrimState.AOD);
mScrimController.finishAnimationsImmediately();
+ mScrimController.setHasBackdrop(true);
+ mScrimController.finishAnimationsImmediately();
// Front scrim should be transparent
// Back scrim should be visible with tint
assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 85135ac77b3c..6933328d1893 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -60,7 +60,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
@Mock
private NotificationPanelView mNotificationPanelView;
@Mock
- private FingerprintUnlockController mFingerprintUnlockController;
+ private BiometricUnlockController mBiometrucUnlockController;
@Mock
private DismissCallbackRegistry mDismissCallbackRegistry;
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@@ -72,7 +72,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
mStatusBarKeyguardViewManager = new TestableStatusBarKeyguardViewManager(getContext(),
mViewMediatorCallback, mLockPatternUtils);
mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer,
- mNotificationPanelView, mFingerprintUnlockController, mDismissCallbackRegistry);
+ mNotificationPanelView, mBiometrucUnlockController, mDismissCallbackRegistry);
mStatusBarKeyguardViewManager.show(null);
}
@@ -170,8 +170,16 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
@Test
public void onPanelExpansionChanged_neverTranslatesBouncerWhenWakeAndUnlock() {
- when(mFingerprintUnlockController.getMode())
- .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
+ when(mBiometrucUnlockController.getMode())
+ .thenReturn(BiometricUnlockController.MODE_WAKE_AND_UNLOCK);
+ mStatusBarKeyguardViewManager.onPanelExpansionChanged(KeyguardBouncer.EXPANSION_VISIBLE,
+ false /* tracking */);
+ verify(mBouncer, never()).setExpansion(anyFloat());
+ }
+
+ @Test
+ public void onPanelExpansionChanged_neverTranslatesBouncerWhenLaunchingApp() {
+ when(mStatusBar.isInLaunchTransition()).thenReturn(true);
mStatusBarKeyguardViewManager.onPanelExpansionChanged(KeyguardBouncer.EXPANSION_VISIBLE,
false /* tracking */);
verify(mBouncer, never()).setExpansion(anyFloat());
@@ -188,7 +196,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
@Override
public void registerStatusBar(StatusBar statusBar, ViewGroup container,
NotificationPanelView notificationPanelView,
- FingerprintUnlockController fingerprintUnlockController,
+ BiometricUnlockController fingerprintUnlockController,
DismissCallbackRegistry dismissCallbackRegistry) {
super.registerStatusBar(statusBar, container, notificationPanelView,
fingerprintUnlockController, dismissCallbackRegistry);
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 0a412b96ed54..f908dfb7e362 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
@@ -132,7 +132,7 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private IStatusBarService mBarService;
@Mock private ScrimController mScrimController;
@Mock private ArrayList<Entry> mNotificationList;
- @Mock private FingerprintUnlockController mFingerprintUnlockController;
+ @Mock private BiometricUnlockController mBiometricUnlockController;
@Mock private NotificationData mNotificationData;
// Mock dependencies:
@@ -207,7 +207,7 @@ public class StatusBarTest extends SysuiTestCase {
mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
- mEntryManager, mScrimController, mFingerprintUnlockController,
+ mEntryManager, mScrimController, mBiometricUnlockController,
mock(ActivityLaunchAnimator.class), mKeyguardViewMediator,
mRemoteInputManager, mock(NotificationGroupManager.class),
mock(FalsingManager.class), mock(StatusBarWindowManager.class),
@@ -572,15 +572,15 @@ public class StatusBarTest extends SysuiTestCase {
@Test
public void testFingerprintNotification_UpdatesScrims() {
- mStatusBar.notifyFpAuthModeChanged();
+ mStatusBar.notifyBiometricAuthModeChanged();
verify(mScrimController).transitionTo(any(), any());
}
@Test
public void testFingerprintUnlock_UpdatesScrims() {
// Simulate unlocking from AoD with fingerprint.
- when(mFingerprintUnlockController.getMode())
- .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
+ when(mBiometricUnlockController.getMode())
+ .thenReturn(BiometricUnlockController.MODE_WAKE_AND_UNLOCK);
mStatusBar.updateScrimController();
verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
}
@@ -597,7 +597,7 @@ public class StatusBarTest extends SysuiTestCase {
@Test
public void testInflateFooterView() {
- mStatusBar.reevaluateStyles();
+ mStatusBar.inflateFooterView();
ArgumentCaptor<FooterView> captor = ArgumentCaptor.forClass(FooterView.class);
verify(mStackScroller).setFooterView(captor.capture());
@@ -661,7 +661,7 @@ public class StatusBarTest extends SysuiTestCase {
@Test
public void testUpdateFooter_atEnd() {
// add footer
- mStatusBar.reevaluateStyles();
+ mStatusBar.inflateFooterView();
// add notification
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
@@ -700,6 +700,13 @@ public class StatusBarTest extends SysuiTestCase {
assertTrue(mStatusBar.mState == StatusBarState.FULLSCREEN_USER_SWITCHER);
}
+ @Test
+ public void testOnDensityOrFontScaleChanged_reInflatesFooterViews() {
+ mStatusBar.onDensityOrFontScaleChanged();
+ verify(mStackScroller).setFooterView(any());
+ verify(mStackScroller).setEmptyShadeView(any());
+ }
+
static class TestableStatusBar extends StatusBar {
public TestableStatusBar(StatusBarKeyguardViewManager man,
UnlockMethodCache unlock, KeyguardIndicationController key,
@@ -710,7 +717,7 @@ public class StatusBarTest extends SysuiTestCase {
VisualStabilityManager visualStabilityManager,
NotificationViewHierarchyManager viewHierarchyManager,
TestableNotificationEntryManager entryManager, ScrimController scrimController,
- FingerprintUnlockController fingerprintUnlockController,
+ BiometricUnlockController biometricUnlockController,
ActivityLaunchAnimator launchAnimator, KeyguardViewMediator keyguardViewMediator,
NotificationRemoteInputManager notificationRemoteInputManager,
NotificationGroupManager notificationGroupManager,
@@ -736,7 +743,7 @@ public class StatusBarTest extends SysuiTestCase {
mViewHierarchyManager = viewHierarchyManager;
mEntryManager = entryManager;
mScrimController = scrimController;
- mFingerprintUnlockController = fingerprintUnlockController;
+ mBiometricUnlockController = biometricUnlockController;
mActivityLaunchAnimator = launchAnimator;
mKeyguardViewMediator = keyguardViewMediator;
mClearAllEnabled = true;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
index 8a74019dca36..cfacf0b121c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
@@ -40,30 +40,117 @@ public class NotificationChildrenContainerTest extends SysuiTestCase {
private ExpandableNotificationRow mGroup;
private int mId;
private NotificationTestHelper mNotificationTestHelper;
+ private NotificationChildrenContainer mChildrenContainer;
@Before
public void setUp() throws Exception {
mNotificationTestHelper = new NotificationTestHelper(mContext);
mGroup = mNotificationTestHelper.createGroup();
+ mChildrenContainer = mGroup.getChildrenContainer();
+ }
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_ambient() {
+ mGroup.setShowAmbient(true);
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_AMBIENT);
+ }
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_lowPriority() {
+ mChildrenContainer.setIsLowPriority(true);
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED);
+ }
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_headsUp() {
+ mGroup.setHeadsUp(true);
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED);
+ }
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_lowPriority_expandedChildren() {
+ mChildrenContainer.setIsLowPriority(true);
+ mChildrenContainer.setChildrenExpanded(true);
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED);
+ }
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_lowPriority_userLocked() {
+ mChildrenContainer.setIsLowPriority(true);
+ mChildrenContainer.setUserLocked(true);
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED);
+ }
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_likeCollapsed() {
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(true),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_COLLAPSED);
+ }
+
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_expandedChildren() {
+ mChildrenContainer.setChildrenExpanded(true);
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED);
+ }
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_userLocked() {
+ mGroup.setUserLocked(true);
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED);
+ }
+
+ @Test
+ public void testShowingAsLowPriority_lowPriority() {
+ mChildrenContainer.setIsLowPriority(true);
+ Assert.assertTrue(mChildrenContainer.showingAsLowPriority());
+ }
+
+ @Test
+ public void testShowingAsLowPriority_notLowPriority() {
+ Assert.assertFalse(mChildrenContainer.showingAsLowPriority());
+ }
+
+ @Test
+ public void testShowingAsLowPriority_lowPriority_expanded() {
+ mChildrenContainer.setIsLowPriority(true);
+ mGroup.setExpandable(true);
+ mGroup.setUserExpanded(true, false);
+ Assert.assertFalse(mChildrenContainer.showingAsLowPriority());
+ }
+
+ @Test
+ public void testGetMaxAllowedVisibleChildren_userLocked_expandedChildren_lowPriority() {
+ mGroup.setUserLocked(true);
+ mGroup.setExpandable(true);
+ mGroup.setUserExpanded(true);
+ mChildrenContainer.setIsLowPriority(true);
+ Assert.assertEquals(mChildrenContainer.getMaxAllowedVisibleChildren(),
+ NotificationChildrenContainer.NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED);
}
@Test
public void testLowPriorityHeaderCleared() {
mGroup.setIsLowPriority(true);
- NotificationChildrenContainer childrenContainer = mGroup.getChildrenContainer();
- NotificationHeaderView lowPriorityHeaderView = childrenContainer.getLowPriorityHeaderView();
+ NotificationHeaderView lowPriorityHeaderView = mChildrenContainer.getLowPriorityHeaderView();
Assert.assertTrue(lowPriorityHeaderView.getVisibility() == View.VISIBLE);
- Assert.assertTrue(lowPriorityHeaderView.getParent() == childrenContainer);
+ Assert.assertTrue(lowPriorityHeaderView.getParent() == mChildrenContainer);
mGroup.setIsLowPriority(false);
Assert.assertTrue(lowPriorityHeaderView.getParent() == null);
- Assert.assertTrue(childrenContainer.getLowPriorityHeaderView() == null);
+ Assert.assertTrue(mChildrenContainer.getLowPriorityHeaderView() == null);
}
@Test
public void testRecreateNotificationHeader_hasHeader() {
- NotificationChildrenContainer childrenContainer = mGroup.getChildrenContainer();
- childrenContainer.recreateNotificationHeader(null);
+ mChildrenContainer.recreateNotificationHeader(null);
Assert.assertNotNull("Children container must have a header after recreation",
- childrenContainer.getCurrentHeaderView());
+ mChildrenContainer.getCurrentHeaderView());
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
index 50b4f3f15d8a..0d398bef4233 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/ChannelsTest.java
@@ -103,7 +103,7 @@ public class ChannelsTest extends SysuiTestCase {
NotificationManager.IMPORTANCE_MIN);
NotificationChannel newChannel =
NotificationChannels.createScreenshotChannel("newName", legacyChannel);
- assertEquals(Uri.EMPTY, newChannel.getSound());
+ assertEquals(null, newChannel.getSound());
assertEquals("newName", newChannel.getName());
// MIN importance not user locked, so HIGH wins out.
assertEquals(NotificationManager.IMPORTANCE_HIGH, newChannel.getImportance());
@@ -113,7 +113,7 @@ public class ChannelsTest extends SysuiTestCase {
public void testInheritFromLegacy_noLegacyExists() {
NotificationChannel newChannel =
NotificationChannels.createScreenshotChannel("newName", null);
- assertEquals(Uri.EMPTY, newChannel.getSound());
+ assertEquals(null, newChannel.getSound());
assertEquals("newName", newChannel.getName());
assertEquals(NotificationManager.IMPORTANCE_HIGH, newChannel.getImportance());
}
diff --git a/packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.png
deleted file mode 100644
index a0b4b6131a78..000000000000
--- a/packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.png
+++ /dev/null
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png
deleted file mode 100644
index df5dfe8e1a6a..000000000000
--- a/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png
+++ /dev/null
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png
deleted file mode 100644
index 18d5a3aeddee..000000000000
--- a/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png
+++ /dev/null
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png
deleted file mode 100644
index 4d475dc08a84..000000000000
--- a/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png
+++ /dev/null
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png
deleted file mode 100644
index 9d458b42943c..000000000000
--- a/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png
+++ /dev/null
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable/ic_vpn_dialog.xml b/packages/VpnDialogs/res/drawable/ic_vpn_dialog.xml
new file mode 100644
index 000000000000..24f622eace0a
--- /dev/null
+++ b/packages/VpnDialogs/res/drawable/ic_vpn_dialog.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2017, 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.
+*/
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="17dp"
+ android:height="17dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M12.09,9C11.11,7.5 9.43,6.5 7.5,6.5C4.46,6.5 2,8.96 2,12c0,3.04 2.46,5.5 5.5,5.5c1.93,0 3.61,-1 4.59,-2.5H14v3h6v-3h2V9H12.09zM20,13h-2v3h-2v-3h-5.16c-0.43,1.44 -1.76,2.5 -3.34,2.5C5.57,15.5 4,13.93 4,12c0,-1.93 1.57,-3.5 3.5,-3.5c1.58,0 2.9,1.06 3.34,2.5H20V13z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M7.5,12m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
+</vector>
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml
index 80d8066959af..9254b4d65b50 100644
--- a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml
@@ -37,6 +37,8 @@
@right
</string>
+ <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string>
+
<!-- Whether the display cutout region of the main built-in display should be forced to
black in software (to avoid aliasing or emulate a cutout that is not physically existent).
-->
diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml
index ca261f98cfae..80c997a46264 100644
--- a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml
+++ b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml
@@ -49,6 +49,8 @@
@dp
</string>
+ <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string>
+
<!-- Whether the display cutout region of the main built-in display should be forced to
black in software (to avoid aliasing or emulate a cutout that is not physically existent).
-->
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml
index c22b2e778ff1..6fb3c7f51e26 100644
--- a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values/config.xml
@@ -40,6 +40,8 @@
@dp
</string>
+ <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string>
+
<!-- Whether the display cutout region of the main built-in display should be forced to
black in software (to avoid aliasing or emulate a cutout that is not physically existent).
-->
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml
index 401e09211ae7..7c29ffb92f4e 100644
--- a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values/config.xml
@@ -40,6 +40,8 @@
@dp
</string>
+ <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string>
+
<!-- Whether the display cutout region of the main built-in display should be forced to
black in software (to avoid aliasing or emulate a cutout that is not physically existent).
-->
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml
index f328b83c1cbf..5fb8b9e241b8 100644
--- a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values/config.xml
@@ -40,6 +40,8 @@
@dp
</string>
+ <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string>
+
<!-- Whether the display cutout region of the main built-in display should be forced to
black in software (to avoid aliasing or emulate a cutout that is not physically existent).
-->
diff --git a/packages/overlays/SysuiDarkThemeOverlay/Android.mk b/packages/overlays/SysuiDarkThemeOverlay/Android.mk
deleted file mode 100644
index 7b277bcf0351..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/Android.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_RRO_THEME := SysuiDarkTheme
-LOCAL_CERTIFICATE := platform
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PACKAGE_NAME := SysuiDarkThemeOverlay
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_RRO_PACKAGE)
diff --git a/packages/overlays/SysuiDarkThemeOverlay/AndroidManifest.xml b/packages/overlays/SysuiDarkThemeOverlay/AndroidManifest.xml
deleted file mode 100644
index 8b6ee2bb851c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/AndroidManifest.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.systemui.theme.dark"
- android:versionCode="1"
- android:versionName="1.0">
- <overlay android:targetPackage="com.android.systemui" android:priority="1"/>
-
- <application android:label="@string/sysui_overlay_dark" android:hasCode="false"/>
-</manifest>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-af/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-af/strings.xml
deleted file mode 100644
index 33c6982e007a..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-af/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Donker"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-am/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-am/strings.xml
deleted file mode 100644
index 59795695251b..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-am/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ጨለማ"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ar/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ar/strings.xml
deleted file mode 100644
index 7b20c01957aa..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ar/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"داكن"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-as/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-as/strings.xml
deleted file mode 100644
index 0910e7e753cb..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-as/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"গাঢ়"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-az/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-az/strings.xml
deleted file mode 100644
index a9db75cdb525..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-az/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Qaranlıq"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-b+sr+Latn/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index b63dcbcaa88e..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tamno"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-be/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-be/strings.xml
deleted file mode 100644
index eb875b3e8035..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-be/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Цёмная"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-bg/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-bg/strings.xml
deleted file mode 100644
index 7b39462ffc25..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-bg/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Тъмно"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-bn/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-bn/strings.xml
deleted file mode 100644
index 0910e7e753cb..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-bn/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"গাঢ়"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-bs/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-bs/strings.xml
deleted file mode 100644
index b63dcbcaa88e..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-bs/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tamno"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ca/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ca/strings.xml
deleted file mode 100644
index 02ee2268bb83..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ca/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Fosc"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-cs/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-cs/strings.xml
deleted file mode 100644
index 5d11f07d9948..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-cs/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tmavé"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-da/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-da/strings.xml
deleted file mode 100644
index 460ebe7739bc..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-da/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Mørk"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-de/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-de/strings.xml
deleted file mode 100644
index 4b54b8e11920..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-de/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Dunkel"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-el/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-el/strings.xml
deleted file mode 100644
index c58061dab337..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-el/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Σκοτεινό"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rAU/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rAU/strings.xml
deleted file mode 100644
index 7c94a51ded3c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rCA/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rCA/strings.xml
deleted file mode 100644
index 7c94a51ded3c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rGB/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rGB/strings.xml
deleted file mode 100644
index 7c94a51ded3c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rIN/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rIN/strings.xml
deleted file mode 100644
index 7c94a51ded3c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Dark"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rXC/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rXC/strings.xml
deleted file mode 100644
index cbdd3d2030b4..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎Dark‎‏‎‎‏‎"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-es-rUS/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-es-rUS/strings.xml
deleted file mode 100644
index 2717f0f879c5..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Oscuro"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-es/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-es/strings.xml
deleted file mode 100644
index 2717f0f879c5..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-es/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Oscuro"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-et/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-et/strings.xml
deleted file mode 100644
index e0cce054fc07..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-et/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tume"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-eu/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-eu/strings.xml
deleted file mode 100644
index 44cee4cf9da4..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-eu/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Iluna"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-fa/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-fa/strings.xml
deleted file mode 100644
index fdd1df54bfff..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-fa/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"تیره"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-fi/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-fi/strings.xml
deleted file mode 100644
index 237fe70ff91d..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-fi/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tumma"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-fr-rCA/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-fr-rCA/strings.xml
deleted file mode 100644
index f92c2ef95af3..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Sombre"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-fr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-fr/strings.xml
deleted file mode 100644
index eac51d3a4fbf..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-fr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Foncé"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-gl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-gl/strings.xml
deleted file mode 100644
index 300868f871e2..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-gl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Escuro"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-gu/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-gu/strings.xml
deleted file mode 100644
index 6a4cd62ff26f..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-gu/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ઘેરી"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-hi/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-hi/strings.xml
deleted file mode 100644
index c5bc0e24ed5c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-hi/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"गहरे रंग की थीम"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-hr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-hr/strings.xml
deleted file mode 100644
index b63dcbcaa88e..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-hr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tamno"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-hu/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-hu/strings.xml
deleted file mode 100644
index 84a3ab87c721..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-hu/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Sötét"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-hy/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-hy/strings.xml
deleted file mode 100644
index 555cb647083e..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-hy/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Մուգ"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-in/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-in/strings.xml
deleted file mode 100644
index 391451bc3afe..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-in/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Gelap"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-is/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-is/strings.xml
deleted file mode 100644
index f4d15311c951..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-is/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Dökkt"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-it/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-it/strings.xml
deleted file mode 100644
index b59155bda97a..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-it/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Scuro"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-iw/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-iw/strings.xml
deleted file mode 100644
index 3ecf444fcbb0..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-iw/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"כהה"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ja/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ja/strings.xml
deleted file mode 100644
index 3a2dba02f501..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ja/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ダーク"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ka/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ka/strings.xml
deleted file mode 100644
index 36bf77e1c8a4..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ka/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"მუქი"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-kk/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-kk/strings.xml
deleted file mode 100644
index 913c0b18448d..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-kk/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Қараңғы"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-km/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-km/strings.xml
deleted file mode 100644
index b56c4909fbc7..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-km/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ងងឹត"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-kn/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-kn/strings.xml
deleted file mode 100644
index e75711668387..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-kn/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ಕತ್ತಲೆ"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ko/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ko/strings.xml
deleted file mode 100644
index ca4ab1e283ae..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ko/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"어두움"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ky/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ky/strings.xml
deleted file mode 100644
index e8e827972a04..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ky/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Караңгы"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-lo/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-lo/strings.xml
deleted file mode 100644
index 0434a413fb7f..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-lo/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ມືດ"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-lt/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-lt/strings.xml
deleted file mode 100644
index 147779b850f4..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-lt/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tamsi"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-lv/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-lv/strings.xml
deleted file mode 100644
index 7a296ecda7f3..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-lv/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tumšs"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-mk/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-mk/strings.xml
deleted file mode 100644
index 6be693af1219..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-mk/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Темна"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ml/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ml/strings.xml
deleted file mode 100644
index f8a24fa4af66..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ml/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ഡാർക്ക്"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-mn/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-mn/strings.xml
deleted file mode 100644
index e65d9c70c07d..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-mn/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Бараан"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-mr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-mr/strings.xml
deleted file mode 100644
index 854af000ab0f..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-mr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"गडद"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ms/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ms/strings.xml
deleted file mode 100644
index 391451bc3afe..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ms/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Gelap"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-my/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-my/strings.xml
deleted file mode 100644
index 008e9c694a98..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-my/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"မှောင်သော"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-nb/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-nb/strings.xml
deleted file mode 100644
index 460ebe7739bc..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-nb/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Mørk"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ne/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ne/strings.xml
deleted file mode 100644
index 8f2c5ba89732..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ne/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"अँध्यारो"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-nl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-nl/strings.xml
deleted file mode 100644
index 33c6982e007a..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-nl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Donker"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-or/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-or/strings.xml
deleted file mode 100644
index d8045bd6de6e..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-or/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ଗାଢ଼"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pa/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pa/strings.xml
deleted file mode 100644
index 71103030493a..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-pa/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ਗੂੜ੍ਹਾ"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pl/strings.xml
deleted file mode 100644
index 25ca20fe421d..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-pl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Ciemna"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rBR/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 300868f871e2..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Escuro"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rPT/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 300868f871e2..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Escuro"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-pt/strings.xml
deleted file mode 100644
index 300868f871e2..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-pt/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Escuro"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ro/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ro/strings.xml
deleted file mode 100644
index de73f36e6b83..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ro/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Întunecată"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ru/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ru/strings.xml
deleted file mode 100644
index b05e84454c68..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ru/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Темный"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-si/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-si/strings.xml
deleted file mode 100644
index f0f572502f5f..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-si/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"අඳුරු"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sk/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sk/strings.xml
deleted file mode 100644
index 5df68959b1a2..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-sk/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tmavý"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sl/strings.xml
deleted file mode 100644
index ad58250a117c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-sl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Temno"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sq/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sq/strings.xml
deleted file mode 100644
index 0e1eae7064b6..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-sq/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"E errët"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sr/strings.xml
deleted file mode 100644
index 1561ee298a2c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-sr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Тамно"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sv/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sv/strings.xml
deleted file mode 100644
index 676de42dceb1..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-sv/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Mörk"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-sw/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-sw/strings.xml
deleted file mode 100644
index cc1f120adfc1..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-sw/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Nyeusi"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ta/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ta/strings.xml
deleted file mode 100644
index af98172472d4..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ta/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"டார்க்"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-te/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-te/strings.xml
deleted file mode 100644
index 446455fe7dd8..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-te/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"ముదురు రంగు"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-th/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-th/strings.xml
deleted file mode 100644
index 9e3462b61e4b..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-th/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"เข้ม"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-tl/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-tl/strings.xml
deleted file mode 100644
index 5502d90a889c..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-tl/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Madilim"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-tr/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-tr/strings.xml
deleted file mode 100644
index 368b398bcf17..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-tr/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Koyu"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-uk/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-uk/strings.xml
deleted file mode 100644
index 6e67e455e95d..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-uk/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Темна тема"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-ur/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-ur/strings.xml
deleted file mode 100644
index 1d5d6de407b3..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-ur/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"گہرا"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-uz/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-uz/strings.xml
deleted file mode 100644
index 957c28f8fb04..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-uz/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tungi"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-vi/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-vi/strings.xml
deleted file mode 100644
index a45888955988..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-vi/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Tối"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rCN/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rCN/strings.xml
deleted file mode 100644
index c9b43dcba4ea..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"深色"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rHK/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rHK/strings.xml
deleted file mode 100644
index c9b43dcba4ea..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"深色"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rTW/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rTW/strings.xml
deleted file mode 100644
index c9b43dcba4ea..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"深色"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values-zu/strings.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values-zu/strings.xml
deleted file mode 100644
index 6d328da358a7..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values-zu/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Copyright (c) 2017, 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.
- */
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sysui_overlay_dark" msgid="557336259295713662">"Emnyama"</string>
-</resources>
diff --git a/packages/overlays/SysuiDarkThemeOverlay/res/values/styles.xml b/packages/overlays/SysuiDarkThemeOverlay/res/values/styles.xml
deleted file mode 100644
index 41a294092648..000000000000
--- a/packages/overlays/SysuiDarkThemeOverlay/res/values/styles.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <style name="qs_base" parent="android:Theme.DeviceDefault">
- <item name="android:colorPrimary">@*android:color/primary_device_default_settings</item>
- <item name="android:colorPrimaryDark">@*android:color/primary_dark_device_default_settings</item>
- <item name="android:colorSecondary">@*android:color/secondary_device_default_settings</item>
- <item name="android:colorAccent">@*android:color/accent_device_default_dark</item>
- <item name="android:colorControlNormal">?android:attr/textColorPrimary</item>
- <item name="android:colorBackgroundFloating">@*android:color/material_grey_900</item>
- <item name="android:panelColorBackground">@*android:color/material_grey_800</item>
- </style>
-</resources> \ No newline at end of file
diff --git a/packages/services/PacProcessor/Android.mk b/packages/services/PacProcessor/Android.mk
index 5be90c0bf3d5..75d03633f5c8 100644
--- a/packages/services/PacProcessor/Android.mk
+++ b/packages/services/PacProcessor/Android.mk
@@ -26,7 +26,7 @@ LOCAL_PACKAGE_NAME := PacProcessor
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
-LOCAL_JNI_SHARED_LIBRARIES := libjni_pacprocessor
+LOCAL_JNI_SHARED_LIBRARIES := libjni_pacprocessor libpac
include $(BUILD_PACKAGE)
diff --git a/proto/Android.bp b/proto/Android.bp
index f3811bdd7d81..5fd288513384 100644
--- a/proto/Android.bp
+++ b/proto/Android.bp
@@ -17,3 +17,33 @@ java_library_static {
},
},
}
+
+cc_library {
+ name: "libmetricprotos",
+ host_supported: true,
+ proto: {
+ export_proto_headers: true,
+ include_dirs: ["external/protobuf/src"],
+ },
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-unused-parameter",
+ ],
+ srcs: ["src/metrics_constants.proto"],
+ target: {
+ host: {
+ proto: {
+ type: "full",
+ },
+ },
+ android: {
+ proto: {
+ type: "lite",
+ },
+ shared: {
+ enabled: false,
+ },
+ },
+ },
+}
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 4328d94275e9..deb936ce8516 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -6117,6 +6117,59 @@ message MetricsEvent {
FIELD_AUTOFILL_SESSION_ID = 1456;
// ---- End P Constants, all P constants go above this line ----
+
+ // Time since this notification last interrupted (visibly or audible) the user
+ NOTIFICATION_SINCE_INTERRUPTION_MILLIS = 1500;
+
+ // OPEN: Notification interrupted the user, either audibly or visually.
+ // Tagged data: NOTIFICATION_SINCE_INTERRUPTION_MILLIS
+ // CATEGORY: NOTIFICATION
+ NOTIFICATION_INTERRUPTION = 1501;
+
+ // OPEN: Settings
+ // CATEGORY: SETTINGS
+ // OS: Q
+ SETTINGS_HOMEPAGE = 1502;
+
+ // OPEN: Settings > Create shortcut(widget)
+ // CATEGORY: SETTINGS
+ // OS: Q
+ SETTINGS_CREATE_SHORTCUT = 1503;
+
+ // ACTION: Authenticate using fingerprint
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ACTION_FACE_AUTH = 1504;
+
+ // ACTION: Add fingerprint > Enroll fingerprint
+ // CATEGORY: SETTINGS
+ // OS: Q
+ ACTION_FACE_ENROLL = 1505;
+
+ // OPEN: Face Enroll introduction
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE_ENROLL_INTRO = 1506;
+
+ // OPEN: Face Enroll introduction
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE_ENROLL_ENROLLING = 1507;
+
+ // OPEN: Face Enroll introduction
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE_ENROLL_FINISHED = 1508;
+
+ // OPEN: Face Enroll sidecar
+ // CATEGORY: SETTINGS
+ // OS: Q
+ FACE_ENROLL_SIDECAR = 1509;
+
+ // OPEN: Settings > Add face > Error dialog
+ DIALOG_FACE_ERROR = 1510;
+ // ---- End Q Constants, all Q constants go above this line ----
+
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
}
diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto
index a9a14cad7f7d..fba639c3fc4a 100644
--- a/proto/src/system_messages.proto
+++ b/proto/src/system_messages.proto
@@ -212,6 +212,10 @@ message SystemMessage {
// Package: android
NOTE_AUTO_SAVER_SUGGESTION = 49;
+ // Notify the user that their softap config preference has changed.
+ // Package: android
+ NOTE_SOFTAP_CONFIG_CHANGED = 50;
+
// ADD_NEW_IDS_ABOVE_THIS_LINE
// Legacy IDs with arbitrary values appear below
// Legacy IDs existed as stable non-conflicting constants prior to the O release
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index 72f11e0a63c1..15c04681e38f 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -457,6 +457,22 @@ message WifiLog {
// Identifier for experimental scoring parameter settings.
optional string score_experiment_id = 117;
+ // Data on wifi radio usage
+ optional WifiRadioUsage wifi_radio_usage = 118;
+
+ // Stores settings values used for metrics testing.
+ optional ExperimentValues experiment_values = 119;
+
+ // List of WifiIsUnusableEvents which get logged when we notice that WiFi is unusable.
+ // Collected only when WIFI_IS_UNUSABLE_EVENT_METRICS_ENABLED Settings is enabled.
+ repeated WifiIsUnusableEvent wifi_is_unusable_event_list = 120;
+
+ // Counts the occurrences of each link speed (Mbps) level
+ // with rssi (dBm) and rssi^2 sums (dBm^2)
+ repeated LinkSpeedCount link_speed_counts = 121;
+
+ // Number of times the SarManager failed to register SAR sensor listener
+ optional int32 num_sar_sensor_registration_failures = 122;
}
// Information that gets logged for every WiFi connection.
@@ -642,6 +658,22 @@ message WifiScoreCount {
optional int32 count = 2;
}
+// Number of occurrences of a specific link speed (Mbps)
+// and sum of rssi (dBm) and rssi^2 (dBm^2)
+message LinkSpeedCount {
+ // Link speed (Mbps)
+ optional int32 link_speed_mbps = 1;
+
+ // Number of RSSI polls with link_speed
+ optional int32 count = 2;
+
+ // Sum of absolute values of rssi values (dBm)
+ optional int32 rssi_sum_dbm = 3;
+
+ // Sum of squares of rssi values (dBm^2)
+ optional int64 rssi_sum_of_squares_dbm_sq = 4;
+}
+
// Number of occurrences of Soft AP session durations
message SoftApDurationBucket {
// Bucket covers duration : [duration_sec, duration_sec + bucket_size_sec)
@@ -874,7 +906,7 @@ message StaEvent {
STATE_INVALID = 12;
}
- // Bit mask of all supplicant state changes that occured since the last event
+ // Bit mask of all supplicant state changes that occurred since the last event
optional uint32 supplicant_state_changes_bitmask = 9 [default = 0];
// The number of milliseconds that have elapsed since the device booted
@@ -882,7 +914,7 @@ message StaEvent {
optional FrameworkDisconnectReason framework_disconnect_reason = 11 [default = DISCONNECT_UNKNOWN];
- // Flag which indicates if an association rejection event occured due to a timeout
+ // Flag which indicates if an association rejection event occurred due to a timeout
optional bool association_timed_out = 12 [default = false];
// Authentication failure reason, as reported by WifiManager (calculated from state & deauth code)
@@ -1503,3 +1535,83 @@ message WifiRttLog {
optional int32 count = 2;
}
}
+
+// Usage data for the wifi radio while device is running on battery.
+message WifiRadioUsage {
+ // Duration of log (ms)
+ optional int64 logging_duration_ms = 1;
+
+ // Total time for which the radio is awake due to scan.
+ optional int64 scan_time_ms = 2;
+}
+
+message ExperimentValues {
+ // Indicates if we are logging WifiIsUnusableEvent in metrics
+ optional bool wifi_is_unusable_logging_enabled = 1;
+
+ // Minimum number of txBad to trigger a data stall
+ optional int32 wifi_data_stall_min_tx_bad = 2;
+
+ // Minimum number of txSuccess to trigger a data stall
+ // when rxSuccess is 0
+ optional int32 wifi_data_stall_min_tx_success_without_rx = 3;
+
+ // Indicates if we are logging LinkSpeedCount in metrics
+ optional bool link_speed_counts_logging_enabled = 4;
+}
+
+message WifiIsUnusableEvent {
+ enum TriggerType {
+ // Default/Invalid event
+ TYPE_UNKNOWN = 0;
+
+ // There is a data stall from tx failures
+ TYPE_DATA_STALL_BAD_TX = 1;
+
+ // There is a data stall from rx failures
+ TYPE_DATA_STALL_TX_WITHOUT_RX = 2;
+
+ // There is a data stall from both tx and rx failures
+ TYPE_DATA_STALL_BOTH = 3;
+
+ // Firmware generated an alert
+ TYPE_FIRMWARE_ALERT = 4;
+ }
+
+ // What event triggered WifiIsUnusableEvent.
+ optional TriggerType type = 1;
+
+ // The timestamp at which this event occurred.
+ // Measured in milliseconds that have elapsed since the device booted.
+ optional int64 start_time_millis = 2;
+
+ // NetworkAgent score of connected wifi.
+ // Defaults to -1 if the score was never set.
+ optional int32 last_score = 3 [default = -1];
+
+ // Delta of successfully transmitted (ACKed) unicast data packets
+ // between the last two WifiLinkLayerStats.
+ optional int64 tx_success_delta = 4;
+
+ // Delta of transmitted unicast data retry packets
+ // between the last two WifiLinkLayerStats.
+ optional int64 tx_retries_delta = 5;
+
+ // Delta of lost (not ACKed) transmitted unicast data packets
+ // between the last two WifiLinkLayerStats.
+ optional int64 tx_bad_delta = 6;
+
+ // Delta of received unicast data packets
+ // between the last two WifiLinkLayerStats.
+ optional int64 rx_success_delta = 7;
+
+ // Time in millisecond between the last two WifiLinkLayerStats.
+ optional int64 packet_update_time_delta = 8;
+
+ // The timestamp at which the last WifiLinkLayerStats was updated.
+ // Measured in milliseconds that have elapsed since the device booted.
+ optional int64 last_link_layer_stats_update_time = 9;
+
+ // Firmware alert code. Only valid when the event was triggered by a firmware alert, otherwise -1.
+ optional int32 firmware_alert_code = 10 [default = -1];
+}
diff --git a/sax/tests/saxtests/src/android/sax/ExpatPerformanceTest.java b/sax/tests/saxtests/src/android/sax/ExpatPerformanceTest.java
deleted file mode 100644
index 892c49052533..000000000000
--- a/sax/tests/saxtests/src/android/sax/ExpatPerformanceTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2007 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.sax;
-
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.util.Log;
-import android.util.Xml;
-import org.kxml2.io.KXmlParser;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import com.android.frameworks.saxtests.R;
-
-public class ExpatPerformanceTest extends AndroidTestCase {
-
- private static final String TAG = ExpatPerformanceTest.class.getSimpleName();
-
- private byte[] mXmlBytes;
-
- @Override
- public void setUp() throws Exception {
- super.setUp();
- InputStream in = mContext.getResources().openRawResource(R.raw.youtube);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int length;
- while ((length = in.read(buffer)) != -1) {
- out.write(buffer, 0, length);
- }
- mXmlBytes = out.toByteArray();
-
- Log.i("***", "File size: " + (mXmlBytes.length / 1024) + "k");
- }
-
- @LargeTest
- public void testPerformance() throws Exception {
-// try {
-// Debug.startMethodTracing("expat3");
-// for (int i = 0; i < 1; i++) {
- runJavaPullParser();
- runSax();
- runExpatPullParser();
-// }
-// } finally {
-// Debug.stopMethodTracing();
-// }
- }
-
- private InputStream newInputStream() {
- return new ByteArrayInputStream(mXmlBytes);
- }
-
- private void runSax() throws IOException, SAXException {
- long start = System.currentTimeMillis();
- Xml.parse(newInputStream(), Xml.Encoding.UTF_8, new DefaultHandler());
- long elapsed = System.currentTimeMillis() - start;
- Log.i(TAG, "expat SAX: " + elapsed + "ms");
- }
-
- private void runExpatPullParser() throws XmlPullParserException, IOException {
- long start = System.currentTimeMillis();
- XmlPullParser pullParser = Xml.newPullParser();
- pullParser.setInput(newInputStream(), "UTF-8");
- withPullParser(pullParser);
- long elapsed = System.currentTimeMillis() - start;
- Log.i(TAG, "expat pull: " + elapsed + "ms");
- }
-
- private void runJavaPullParser() throws XmlPullParserException, IOException {
- XmlPullParser pullParser;
- long start = System.currentTimeMillis();
- pullParser = new KXmlParser();
- pullParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- pullParser.setInput(newInputStream(), "UTF-8");
- withPullParser(pullParser);
- long elapsed = System.currentTimeMillis() - start;
- Log.i(TAG, "java pull parser: " + elapsed + "ms");
- }
-
- private static void withPullParser(XmlPullParser pullParser)
- throws IOException, XmlPullParserException {
- int eventType = pullParser.next();
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- case XmlPullParser.START_TAG:
- pullParser.getName();
-// int nattrs = pullParser.getAttributeCount();
-// for (int i = 0; i < nattrs; ++i) {
-// pullParser.getAttributeName(i);
-// pullParser.getAttributeValue(i);
-// }
- break;
- case XmlPullParser.END_TAG:
- pullParser.getName();
- break;
- case XmlPullParser.TEXT:
- pullParser.getText();
- break;
- }
- eventType = pullParser.next();
- }
- }
-}
diff --git a/services/Android.bp b/services/Android.bp
index d125adc5fa7d..bea51be321c9 100644
--- a/services/Android.bp
+++ b/services/Android.bp
@@ -2,6 +2,7 @@
// ============================================================
java_library {
name: "services",
+ installable: true,
dex_preopt: {
app_image: true,
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 7798cf7af3cb..376d16bf1476 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -20,7 +20,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
import static android.view.accessibility.AccessibilityEvent.WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS;
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS;
-
import static com.android.internal.util.FunctionalUtils.ignoreRemoteException;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
@@ -30,7 +29,6 @@ import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceClient;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.ActivityManagerInternal;
import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.app.PendingIntent;
@@ -111,10 +109,9 @@ import com.android.internal.util.DumpUtils;
import com.android.internal.util.IntPair;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
+import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
-import libcore.util.EmptyArray;
-
import org.xmlpull.v1.XmlPullParserException;
import java.io.FileDescriptor;
@@ -133,6 +130,8 @@ import java.util.Set;
import java.util.function.Consumer;
import java.util.function.IntSupplier;
+import libcore.util.EmptyArray;
+
/**
* This class is instantiated by the system as a system level service and can be
* accessed only by the system. The task of this service is to be a centralized
@@ -2624,7 +2623,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY, 0);
if (activityToken != null) {
- LocalServices.getService(ActivityManagerInternal.class)
+ LocalServices.getService(ActivityTaskManagerInternal.class)
.setFocusedActivity(activityToken);
}
connection.mConnection.performAccessibilityAction(accessibilityNodeId, action,
@@ -3743,6 +3742,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
/**
* Removes a service.
+ * There are three states to a service here: off, bound, and binding.
+ * This stops tracking the service as bound.
*
* @param serviceConnection The service.
*/
@@ -3759,6 +3760,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
scheduleNotifyClientsOfServicesStateChange(this);
}
+ /**
+ * Make sure a services disconnected but still 'on' state is reflected in UserState
+ * There are three states to a service here: off, bound, and binding.
+ * This drops a service from a bound state, to the binding state.
+ * The binding state describes the situation where a service is on, but not bound.
+ *
+ * @param serviceConnection The service.
+ */
+ public void serviceDisconnectedLocked(AccessibilityServiceConnection serviceConnection) {
+ removeServiceLocked(serviceConnection);
+ mBindingServices.add(serviceConnection.getComponentName());
+ }
+
public Set<ComponentName> getBindingServicesLocked() {
return mBindingServices;
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
index eb18f06baae0..8f921454196f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
@@ -258,7 +258,11 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
return;
}
mWasConnectedAndDied = true;
- resetLocked();
+ mSystemSupport.getKeyEventDispatcher().flush(this);
+ UserState userState = mUserStateWeakReference.get();
+ if (userState != null) {
+ userState.serviceDisconnectedLocked(this);
+ }
if (mId == mSystemSupport.getMagnificationController().getIdOfLastServiceToMagnify()) {
mSystemSupport.getMagnificationController().resetIfNeeded(true);
}
diff --git a/services/accessibility/java/com/android/server/accessibility/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/MagnificationController.java
index 9f441978f3aa..b697434f28bf 100644
--- a/services/accessibility/java/com/android/server/accessibility/MagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/MagnificationController.java
@@ -650,12 +650,14 @@ public class MagnificationController implements Handler.Callback {
+ ", nonNormOffsetY = " + nonNormOffsetY + ")");
}
boolean changed = false;
- final float offsetX = MathUtils.constrain(nonNormOffsetX, getMinOffsetXLocked(), 0);
+ final float offsetX = MathUtils.constrain(
+ nonNormOffsetX, getMinOffsetXLocked(), getMaxOffsetXLocked());
if (Float.compare(mCurrentMagnificationSpec.offsetX, offsetX) != 0) {
mCurrentMagnificationSpec.offsetX = offsetX;
changed = true;
}
- final float offsetY = MathUtils.constrain(nonNormOffsetY, getMinOffsetYLocked(), 0);
+ final float offsetY = MathUtils.constrain(
+ nonNormOffsetY, getMinOffsetYLocked(), getMaxOffsetYLocked());
if (Float.compare(mCurrentMagnificationSpec.offsetY, offsetY) != 0) {
mCurrentMagnificationSpec.offsetY = offsetY;
changed = true;
@@ -665,12 +667,26 @@ public class MagnificationController implements Handler.Callback {
private float getMinOffsetXLocked() {
final float viewportWidth = mMagnificationBounds.width();
- return viewportWidth - viewportWidth * mCurrentMagnificationSpec.scale;
+ final float viewportLeft = mMagnificationBounds.left;
+ return (viewportLeft + viewportWidth) -
+ (viewportLeft + viewportWidth) * mCurrentMagnificationSpec.scale;
+ }
+
+ private float getMaxOffsetXLocked() {
+ return mMagnificationBounds.left -
+ mMagnificationBounds.left * mCurrentMagnificationSpec.scale;
}
private float getMinOffsetYLocked() {
final float viewportHeight = mMagnificationBounds.height();
- return viewportHeight - viewportHeight * mCurrentMagnificationSpec.scale;
+ final float viewportTop = mMagnificationBounds.top;
+ return (viewportTop + viewportHeight) -
+ (viewportTop + viewportHeight) * mCurrentMagnificationSpec.scale;
+ }
+
+ private float getMaxOffsetYLocked() {
+ return mMagnificationBounds.top -
+ mMagnificationBounds.top * mCurrentMagnificationSpec.scale;
}
/**
diff --git a/services/art-profile b/services/art-profile
index a372a9c2f2ae..a33527e3396e 100644
--- a/services/art-profile
+++ b/services/art-profile
@@ -1,112 +1,833 @@
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->notifySyspropsChanged()V
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->ping()V
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->primaryUserCredential(Ljava/util/ArrayList;)V
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->setHALInstrumentation()V
+HPLandroid/hardware/authsecret/V1_0/IAuthSecret;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->authenticate(JI)I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->cancel()I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->enroll([BII)I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->enumerate()I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getAuthenticatorId()J
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->notifySyspropsChanged()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->ping()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->postEnroll()I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->preEnroll()J
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->remove(II)I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setActiveGroup(ILjava/lang/String;)I
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setHALInstrumentation()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setNotify(Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;)J
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onAcquired(JII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onAuthenticated(JIILjava/util/ArrayList;)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onEnrollResult(JIII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onEnumerate(JIII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onError(JII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onRemoved(JIII)V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->ping()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->setHALInstrumentation()V
+HPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->hasHDRDisplay()Landroid/hardware/configstore/V1_0/OptionalBool;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->hasSyncFramework()Landroid/hardware/configstore/V1_0/OptionalBool;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->hasWideColorDisplay()Landroid/hardware/configstore/V1_0/OptionalBool;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->maxFrameBufferAcquiredBuffers()Landroid/hardware/configstore/V1_0/OptionalInt64;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->maxVirtualDisplaySize()Landroid/hardware/configstore/V1_0/OptionalUInt64;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->notifySyspropsChanged()V
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->ping()V
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->presentTimeOffsetFromVSyncNs()Landroid/hardware/configstore/V1_0/OptionalInt64;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->setHALInstrumentation()V
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->startGraphicsAllocatorService()Landroid/hardware/configstore/V1_0/OptionalBool;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->useContextPriority()Landroid/hardware/configstore/V1_0/OptionalBool;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->useHwcForRGBtoYUV()Landroid/hardware/configstore/V1_0/OptionalBool;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->useVrFlinger()Landroid/hardware/configstore/V1_0/OptionalBool;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->vsyncEventPhaseOffsetNs()Landroid/hardware/configstore/V1_0/OptionalInt64;
+HPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->vsyncSfEventPhaseOffsetNs()Landroid/hardware/configstore/V1_0/OptionalInt64;
+HPLandroid/hardware/health/V1_0/HealthInfo;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/health/V2_0/DiskStats;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/health/V2_0/HealthInfo;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/health/V2_0/HealthInfo;->readFromParcel(Landroid/os/HwParcel;)V
+HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getCapacity(Landroid/hardware/health/V2_0/IHealth$getCapacityCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getChargeCounter(Landroid/hardware/health/V2_0/IHealth$getChargeCounterCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth$Proxy;->getCurrentAverage(Landroid/hardware/health/V2_0/IHealth$getCurrentAverageCallback;)V
HPLandroid/hardware/health/V2_0/IHealth$getCapacityCallback;->onValues(II)V
HPLandroid/hardware/health/V2_0/IHealth$getChargeCounterCallback;->onValues(II)V
+HPLandroid/hardware/health/V2_0/IHealth$getChargeStatusCallback;->onValues(II)V
HPLandroid/hardware/health/V2_0/IHealth$getCurrentAverageCallback;->onValues(II)V
+HPLandroid/hardware/health/V2_0/IHealth$getCurrentNowCallback;->onValues(II)V
+HPLandroid/hardware/health/V2_0/IHealth$getEnergyCounterCallback;->onValues(IJ)V
+HPLandroid/hardware/health/V2_0/IHealth;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/health/V2_0/IHealth;->getCapacity(Landroid/hardware/health/V2_0/IHealth$getCapacityCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->getChargeCounter(Landroid/hardware/health/V2_0/IHealth$getChargeCounterCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->getChargeStatus(Landroid/hardware/health/V2_0/IHealth$getChargeStatusCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->getCurrentAverage(Landroid/hardware/health/V2_0/IHealth$getCurrentAverageCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->getCurrentNow(Landroid/hardware/health/V2_0/IHealth$getCurrentNowCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/health/V2_0/IHealth;->getDiskStats(Landroid/hardware/health/V2_0/IHealth$getDiskStatsCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->getEnergyCounter(Landroid/hardware/health/V2_0/IHealth$getEnergyCounterCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/health/V2_0/IHealth;->getHealthInfo(Landroid/hardware/health/V2_0/IHealth$getHealthInfoCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->getStorageInfo(Landroid/hardware/health/V2_0/IHealth$getStorageInfoCallback;)V
+HPLandroid/hardware/health/V2_0/IHealth;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/health/V2_0/IHealth;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/health/V2_0/IHealth;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/health/V2_0/IHealth;->notifySyspropsChanged()V
+HPLandroid/hardware/health/V2_0/IHealth;->ping()V
+HPLandroid/hardware/health/V2_0/IHealth;->registerCallback(Landroid/hardware/health/V2_0/IHealthInfoCallback;)I
+HPLandroid/hardware/health/V2_0/IHealth;->setHALInstrumentation()V
+HPLandroid/hardware/health/V2_0/IHealth;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/health/V2_0/IHealth;->unregisterCallback(Landroid/hardware/health/V2_0/IHealthInfoCallback;)I
+HPLandroid/hardware/health/V2_0/IHealth;->update()I
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->healthInfoChanged(Landroid/hardware/health/V2_0/HealthInfo;)V
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->ping()V
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->setHALInstrumentation()V
+HPLandroid/hardware/health/V2_0/IHealthInfoCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/health/V2_0/StorageAttribute;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/health/V2_0/StorageInfo;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/oemlock/V1_0/IOemLock$isOemUnlockAllowedByCarrierCallback;->onValues(IZ)V
+HPLandroid/hardware/oemlock/V1_0/IOemLock$isOemUnlockAllowedByDeviceCallback;->onValues(IZ)V
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->getName(Landroid/hardware/oemlock/V1_0/IOemLock$getNameCallback;)V
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->isOemUnlockAllowedByCarrier(Landroid/hardware/oemlock/V1_0/IOemLock$isOemUnlockAllowedByCarrierCallback;)V
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->isOemUnlockAllowedByDevice(Landroid/hardware/oemlock/V1_0/IOemLock$isOemUnlockAllowedByDeviceCallback;)V
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->notifySyspropsChanged()V
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->ping()V
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->setHALInstrumentation()V
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->setOemUnlockAllowedByCarrier(ZLjava/util/ArrayList;)I
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->setOemUnlockAllowedByDevice(Z)I
+HPLandroid/hardware/oemlock/V1_0/IOemLock;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/tetheroffload/control/V1_0/IOffloadControl$addDownstreamCallback;->onValues(ZLjava/lang/String;)V
+HPLandroid/hardware/tetheroffload/control/V1_0/IOffloadControl$getForwardedStatsCallback;->onValues(JJ)V
+HPLandroid/hardware/tetheroffload/control/V1_0/IOffloadControl$initOffloadCallback;->onValues(ZLjava/lang/String;)V
+HPLandroid/hardware/tetheroffload/control/V1_0/IOffloadControl$removeDownstreamCallback;->onValues(ZLjava/lang/String;)V
+HPLandroid/hardware/tetheroffload/control/V1_0/IOffloadControl$setDataLimitCallback;->onValues(ZLjava/lang/String;)V
+HPLandroid/hardware/tetheroffload/control/V1_0/IOffloadControl$setLocalPrefixesCallback;->onValues(ZLjava/lang/String;)V
+HPLandroid/hardware/tetheroffload/control/V1_0/IOffloadControl$setUpstreamParametersCallback;->onValues(ZLjava/lang/String;)V
+HPLandroid/hardware/tetheroffload/control/V1_0/IOffloadControl$stopOffloadCallback;->onValues(ZLjava/lang/String;)V
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->onEvent(I)V
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->ping()V
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->setHALInstrumentation()V
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/tetheroffload/control/V1_0/ITetheringOffloadCallback;->updateTimeout(Landroid/hardware/tetheroffload/control/V1_0/NatTimeoutUpdate;)V
+HPLandroid/hardware/usb/V1_0/IUsb;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/usb/V1_0/IUsb;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/usb/V1_0/IUsb;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_0/IUsb;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_0/IUsb;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/usb/V1_0/IUsb;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/usb/V1_0/IUsb;->notifySyspropsChanged()V
+HPLandroid/hardware/usb/V1_0/IUsb;->ping()V
+HPLandroid/hardware/usb/V1_0/IUsb;->queryPortStatus()V
+HPLandroid/hardware/usb/V1_0/IUsb;->setCallback(Landroid/hardware/usb/V1_0/IUsbCallback;)V
+HPLandroid/hardware/usb/V1_0/IUsb;->setHALInstrumentation()V
+HPLandroid/hardware/usb/V1_0/IUsb;->switchRole(Ljava/lang/String;Landroid/hardware/usb/V1_0/PortRole;)V
+HPLandroid/hardware/usb/V1_0/IUsb;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->notifyPortStatusChange(Ljava/util/ArrayList;I)V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->notifyRoleSwitchStatus(Ljava/lang/String;Landroid/hardware/usb/V1_0/PortRole;I)V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->ping()V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->setHALInstrumentation()V
+HPLandroid/hardware/usb/V1_0/IUsbCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/usb/V1_0/PortStatus;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+HPLandroid/hardware/usb/V1_1/IUsbCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->notifyPortStatusChange_1_1(Ljava/util/ArrayList;I)V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->notifySyspropsChanged()V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->ping()V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->setHALInstrumentation()V
+HPLandroid/hardware/usb/V1_1/IUsbCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/usb/V1_1/PortStatus_1_1;->readVectorFromParcel(Landroid/os/HwParcel;)Ljava/util/ArrayList;
+HPLandroid/hardware/weaver/V1_0/IWeaver$getConfigCallback;->onValues(ILandroid/hardware/weaver/V1_0/WeaverConfig;)V
HPLandroid/hardware/weaver/V1_0/IWeaver$readCallback;->onValues(ILandroid/hardware/weaver/V1_0/WeaverReadResponse;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$addNetworkCallback;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantNetwork;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->asBinder()Landroid/os/IHwBinder;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->disable()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->enable(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getAuthAlg(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getAuthAlgCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getBssid(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getBssidCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapAltSubjectMatch(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapAltSubjectMatchCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapAnonymousIdentity(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapAnonymousIdentityCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapCACert(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapCACertCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapCAPath(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapCAPathCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapClientCert(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapClientCertCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapDomainSuffixMatch(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapDomainSuffixMatchCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapEngine(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapEngineCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapEngineID(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapEngineIDCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapIdentity(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapIdentityCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapMethod(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapMethodCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapPassword(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapPasswordCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapPhase2Method(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapPhase2MethodCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapPrivateKeyId(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapPrivateKeyIdCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getEapSubjectMatch(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getEapSubjectMatchCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getGroupCipher(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getGroupCipherCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getHashChain()Ljava/util/ArrayList;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getIdStr(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getIdStrCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getKeyMgmt(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getKeyMgmtCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getPairwiseCipher(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getPairwiseCipherCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getProto(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getProtoCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getPsk(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getPskCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getPskPassphrase(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getPskPassphraseCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getRequirePmf(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getRequirePmfCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getScanSsid(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getScanSsidCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getSsid(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getSsidCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getWepKey(ILandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getWepKeyCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getWepTxKeyIdx(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getWepTxKeyIdxCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->getWpsNfcConfigurationToken(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$getWpsNfcConfigurationTokenCallback;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->interfaceChain()Ljava/util/ArrayList;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->interfaceDescriptor()Ljava/lang/String;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->notifySyspropsChanged()V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->ping()V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->select()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapIdentityResponse(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimGsmAuthFailure()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimGsmAuthResponse(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimUmtsAuthFailure()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimUmtsAuthResponse(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork$NetworkResponseEapSimUmtsAuthParams;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->sendNetworkEapSimUmtsAutsResponse([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setAuthAlg(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setBssid([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapAltSubjectMatch(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapAnonymousIdentity(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapCACert(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapCAPath(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapClientCert(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapDomainSuffixMatch(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapEngine(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapEngineID(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapIdentity(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapMethod(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapPassword(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapPhase2Method(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapPrivateKeyId(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setEapSubjectMatch(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setGroupCipher(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setHALInstrumentation()V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setIdStr(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setKeyMgmt(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setPairwiseCipher(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setProactiveKeyCaching(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setProto(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setPsk([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setPskPassphrase(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setRequirePmf(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setScanSsid(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setSsid(Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setUpdateIdentifier(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setWepKey(ILjava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->setWepTxKeyIdx(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetwork;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->asBinder()Landroid/os/IHwBinder;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->getHashChain()Ljava/util/ArrayList;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->interfaceChain()Ljava/util/ArrayList;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->interfaceDescriptor()Ljava/lang/String;
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->notifySyspropsChanged()V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->onNetworkEapIdentityRequest()V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->onNetworkEapSimGsmAuthRequest(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback$NetworkRequestEapSimGsmAuthParams;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->onNetworkEapSimUmtsAuthRequest(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback$NetworkRequestEapSimUmtsAuthParams;)V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->ping()V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->setHALInstrumentation()V
-HPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaNetworkCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HPLandroid/net/ip/IpNeighborMonitor$NeighborEventConsumer;->accept(Landroid/net/ip/IpNeighborMonitor$NeighborEvent;)V
+HPLandroid/hardware/weaver/V1_0/IWeaver;->asBinder()Landroid/os/IHwBinder;
+HPLandroid/hardware/weaver/V1_0/IWeaver;->getConfig(Landroid/hardware/weaver/V1_0/IWeaver$getConfigCallback;)V
+HPLandroid/hardware/weaver/V1_0/IWeaver;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
+HPLandroid/hardware/weaver/V1_0/IWeaver;->getHashChain()Ljava/util/ArrayList;
+HPLandroid/hardware/weaver/V1_0/IWeaver;->interfaceChain()Ljava/util/ArrayList;
+HPLandroid/hardware/weaver/V1_0/IWeaver;->interfaceDescriptor()Ljava/lang/String;
+HPLandroid/hardware/weaver/V1_0/IWeaver;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+HPLandroid/hardware/weaver/V1_0/IWeaver;->notifySyspropsChanged()V
+HPLandroid/hardware/weaver/V1_0/IWeaver;->ping()V
+HPLandroid/hardware/weaver/V1_0/IWeaver;->read(ILjava/util/ArrayList;Landroid/hardware/weaver/V1_0/IWeaver$readCallback;)V
+HPLandroid/hardware/weaver/V1_0/IWeaver;->setHALInstrumentation()V
+HPLandroid/hardware/weaver/V1_0/IWeaver;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
+HPLandroid/hardware/weaver/V1_0/IWeaver;->write(ILjava/util/ArrayList;Ljava/util/ArrayList;)I
+HPLandroid/media/IMediaExtractorUpdateService;->loadPlugins(Ljava/lang/String;)V
+HPLandroid/net/apf/ApfGenerator$Instruction;-><init>(Landroid/net/apf/ApfGenerator;Landroid/net/apf/ApfGenerator$Opcodes;Landroid/net/apf/ApfGenerator$Register;)V
+HPLandroid/net/apf/ApfGenerator$Instruction;->calculateImmSize(IZ)B
+HPLandroid/net/apf/ApfGenerator$Instruction;->calculateTargetLabelOffset()I
+HPLandroid/net/apf/ApfGenerator$Instruction;->generatedImmSize()B
+HPLandroid/net/apf/ApfGenerator$Instruction;->shrink()Z
+HPLandroid/net/apf/ApfGenerator$Instruction;->size()I
+HPLandroid/net/apf/ApfGenerator$Instruction;->writeValue(I[BI)I
+HPLandroid/net/apf/ApfGenerator;->addInstruction(Landroid/net/apf/ApfGenerator$Instruction;)V
+HPLandroid/net/apf/ApfGenerator;->generate()[B
+HPLandroid/net/apf/ApfGenerator;->updateInstructionOffsets()I
+HPLandroid/net/ip/IpNeighborMonitor;->handlePacket([BI)V
HPLandroid/net/ip/IpReachabilityMonitor$Callback;->notifyLost(Ljava/net/InetAddress;Ljava/lang/String;)V
HPLandroid/net/ip/IpReachabilityMonitor$Dependencies;->acquireWakeLock(J)V
+HPLandroid/net/metrics/INetdEventListener;->onConnectEvent(IIILjava/lang/String;II)V
+HPLandroid/net/metrics/INetdEventListener;->onDnsEvent(IIIILjava/lang/String;[Ljava/lang/String;II)V
+HPLandroid/net/metrics/INetdEventListener;->onPrivateDnsValidationEvent(ILjava/lang/String;Ljava/lang/String;Z)V
+HPLandroid/net/metrics/INetdEventListener;->onTcpSocketStatsEvent([I[I[I[I[I)V
+HPLandroid/net/metrics/INetdEventListener;->onWakeupEvent(Ljava/lang/String;III[BLjava/lang/String;Ljava/lang/String;IIJ)V
+HPLandroid/net/netlink/NetlinkConstants;->alignedLengthOf(I)I
+HPLandroid/net/netlink/NetlinkConstants;->alignedLengthOf(S)I
+HPLandroid/net/netlink/RtNetlinkNeighborMessage;->findNextAttrOfType(SLjava/nio/ByteBuffer;)Landroid/net/netlink/StructNlAttr;
+HPLandroid/net/netlink/StructNlAttr;-><init>(Ljava/nio/ByteOrder;)V
+HPLandroid/net/netlink/StructNlAttr;->getAlignedLength()I
+HPLandroid/net/netlink/StructNlAttr;->peek(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNlAttr;
+HPLandroid/net/util/ConnectivityPacketSummary;->getMacAddressString(Ljava/nio/ByteBuffer;)Ljava/lang/String;
+HPLandroid/net/util/PacketReader;->isRunning()Z
+HPLcom/android/server/-$$Lambda$AlarmManagerService$ZVedZIeWdB3G6AGM0_-9P_GEO24;-><init>(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V
+HPLcom/android/server/-$$Lambda$AlarmManagerService$ZVedZIeWdB3G6AGM0_-9P_GEO24;->test(Ljava/lang/Object;)Z
+HPLcom/android/server/-$$Lambda$NetworkManagementService$D43p3Tqq7B3qaMs9AGb_3j0KZd0;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+HPLcom/android/server/AlarmManagerInternal;->removeAlarmsForUid(I)V
+HPLcom/android/server/AlarmManagerService$2;->set(Ljava/lang/String;IJJJILandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V
+HPLcom/android/server/AlarmManagerService$Alarm;-><init>(IJJJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;ILandroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;)V
+HPLcom/android/server/AlarmManagerService$Alarm;->makeTag(Landroid/app/PendingIntent;Ljava/lang/String;I)Ljava/lang/String;
+HPLcom/android/server/AlarmManagerService$Alarm;->matches(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)Z
+HPLcom/android/server/AlarmManagerService$AlarmThread;->run()V
+HPLcom/android/server/AlarmManagerService$Batch;-><init>(Lcom/android/server/AlarmManagerService;Lcom/android/server/AlarmManagerService$Alarm;)V
+HPLcom/android/server/AlarmManagerService$Batch;->add(Lcom/android/server/AlarmManagerService$Alarm;)Z
+HPLcom/android/server/AlarmManagerService$Batch;->canHold(JJ)Z
+HPLcom/android/server/AlarmManagerService$Batch;->get(I)Lcom/android/server/AlarmManagerService$Alarm;
+HPLcom/android/server/AlarmManagerService$Batch;->hasWakeups()Z
+HPLcom/android/server/AlarmManagerService$Batch;->remove(Ljava/util/function/Predicate;)Z
+HPLcom/android/server/AlarmManagerService$Batch;->size()I
+HPLcom/android/server/AlarmManagerService$BatchTimeOrder;->compare(Lcom/android/server/AlarmManagerService$Batch;Lcom/android/server/AlarmManagerService$Batch;)I
+HPLcom/android/server/AlarmManagerService$BatchTimeOrder;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/AlarmManagerService$ClockReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+HPLcom/android/server/AlarmManagerService$ClockReceiver;->scheduleTimeTickEvent()V
+HPLcom/android/server/AlarmManagerService$DeliveryTracker;->alarmComplete(Landroid/os/IBinder;)V
+HPLcom/android/server/AlarmManagerService$DeliveryTracker;->updateStatsLocked(Lcom/android/server/AlarmManagerService$InFlight;)V
+HPLcom/android/server/AlarmManagerService$IncreasingTimeOrder;->compare(Lcom/android/server/AlarmManagerService$Alarm;Lcom/android/server/AlarmManagerService$Alarm;)I
+HPLcom/android/server/AlarmManagerService$IncreasingTimeOrder;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/AlarmManagerService;->access$002(Lcom/android/server/AlarmManagerService;J)J
+HPLcom/android/server/AlarmManagerService;->access$1300(Lcom/android/server/AlarmManagerService;Lcom/android/server/AlarmManagerService$Alarm;)Z
+HPLcom/android/server/AlarmManagerService;->access$600(Lcom/android/server/AlarmManagerService;)Lcom/android/server/AppStateTracker;
+HPLcom/android/server/AlarmManagerService;->access$900(Lcom/android/server/AlarmManagerService;J)I
+HPLcom/android/server/AlarmManagerService;->addBatchLocked(Ljava/util/ArrayList;Lcom/android/server/AlarmManagerService$Batch;)Z
+HPLcom/android/server/AlarmManagerService;->adjustDeliveryTimeBasedOnStandbyBucketLocked(Lcom/android/server/AlarmManagerService$Alarm;)Z
+HPLcom/android/server/AlarmManagerService;->attemptCoalesceLocked(JJ)I
+HPLcom/android/server/AlarmManagerService;->calculateDeliveryPriorities(Ljava/util/ArrayList;)V
+HPLcom/android/server/AlarmManagerService;->clampPositive(J)J
+HPLcom/android/server/AlarmManagerService;->convertToElapsed(JI)J
+HPLcom/android/server/AlarmManagerService;->deliverAlarmsLocked(Ljava/util/ArrayList;J)V
+HPLcom/android/server/AlarmManagerService;->findFirstWakeupBatchLocked()Lcom/android/server/AlarmManagerService$Batch;
+HPLcom/android/server/AlarmManagerService;->getAlarmCount(Ljava/util/ArrayList;)I
+HPLcom/android/server/AlarmManagerService;->getMinDelayForBucketLocked(I)J
+HPLcom/android/server/AlarmManagerService;->haveAlarmsTimeTickAlarm(Ljava/util/ArrayList;)Z
+HPLcom/android/server/AlarmManagerService;->haveBatchesTimeTickAlarm(Ljava/util/ArrayList;)Z
+HPLcom/android/server/AlarmManagerService;->insertAndBatchAlarmLocked(Lcom/android/server/AlarmManagerService$Alarm;)V
+HPLcom/android/server/AlarmManagerService;->isExemptFromAppStandby(Lcom/android/server/AlarmManagerService$Alarm;)Z
+HPLcom/android/server/AlarmManagerService;->lambda$removeLocked$0(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;Lcom/android/server/AlarmManagerService$Alarm;)Z
+HPLcom/android/server/AlarmManagerService;->maxTriggerTime(JJJ)J
+HPLcom/android/server/AlarmManagerService;->reAddAlarmLocked(Lcom/android/server/AlarmManagerService$Alarm;JZ)V
+HPLcom/android/server/AlarmManagerService;->rebatchAllAlarmsLocked(Z)V
+HPLcom/android/server/AlarmManagerService;->removeLocked(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V
+HPLcom/android/server/AlarmManagerService;->reorderAlarmsBasedOnStandbyBuckets(Landroid/util/ArraySet;)Z
+HPLcom/android/server/AlarmManagerService;->rescheduleKernelAlarmsLocked()V
+HPLcom/android/server/AlarmManagerService;->setImpl(IJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;ILandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;)V
+HPLcom/android/server/AlarmManagerService;->setImplLocked(IJJJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;IZLandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;)V
+HPLcom/android/server/AlarmManagerService;->setImplLocked(Lcom/android/server/AlarmManagerService$Alarm;ZZ)V
+HPLcom/android/server/AlarmManagerService;->setLocked(IJ)V
+HPLcom/android/server/AlarmManagerService;->triggerAlarmsLocked(Ljava/util/ArrayList;JJ)Z
+HPLcom/android/server/AlarmManagerService;->updateNextAlarmClockLocked()V
+HPLcom/android/server/AppOpsService$Op;->getMode()I
+HPLcom/android/server/AppOpsService$UidState;->evalMode(I)I
+HPLcom/android/server/AppOpsService;->checkPackage(ILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->collectOps(Lcom/android/server/AppOpsService$Ops;[I)Ljava/util/ArrayList;
+HPLcom/android/server/AppOpsService;->commitUidPendingStateLocked(Lcom/android/server/AppOpsService$UidState;)V
+HPLcom/android/server/AppOpsService;->evalAllForegroundOpsLocked()V
+HPLcom/android/server/AppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;)V
+HPLcom/android/server/AppOpsService;->finishOperationLocked(Lcom/android/server/AppOpsService$Op;Z)V
+HPLcom/android/server/AppOpsService;->getOpLocked(IILjava/lang/String;Z)Lcom/android/server/AppOpsService$Op;
+HPLcom/android/server/AppOpsService;->getOpLocked(Lcom/android/server/AppOpsService$Ops;IZ)Lcom/android/server/AppOpsService$Op;
+HPLcom/android/server/AppOpsService;->getOpsRawLocked(ILjava/lang/String;ZZ)Lcom/android/server/AppOpsService$Ops;
+HPLcom/android/server/AppOpsService;->getPackagesForOps([I)Ljava/util/List;
+HPLcom/android/server/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;)Z
+HPLcom/android/server/AppOpsService;->noteOperation(IILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->noteOperationUnchecked(IILjava/lang/String;ILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->noteProxyOperation(ILjava/lang/String;ILjava/lang/String;)I
+HPLcom/android/server/AppOpsService;->notifyOpChanged(Lcom/android/server/AppOpsService$ModeCallback;IILjava/lang/String;)V
+HPLcom/android/server/AppOpsService;->resolvePackageName(ILjava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/AppOpsService;->scheduleOpActiveChangedIfNeededLocked(IILjava/lang/String;Z)V
+HPLcom/android/server/AppOpsService;->scheduleWriteLocked()V
+HPLcom/android/server/AppOpsService;->setAudioRestriction(IIII[Ljava/lang/String;)V
+HPLcom/android/server/AppOpsService;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Z)I
+HPLcom/android/server/AppOpsService;->updateUidProcState(II)V
+HPLcom/android/server/AppOpsService;->verifyIncomingOp(I)V
+HPLcom/android/server/AppOpsService;->verifyIncomingUid(I)V
+HPLcom/android/server/AppOpsService;->writeState()V
+HPLcom/android/server/AppStateTracker$Listener;->access$1100(Lcom/android/server/AppStateTracker$Listener;Lcom/android/server/AppStateTracker;I)V
+HPLcom/android/server/AppStateTracker$Listener;->onUidForeground(IZ)V
+HPLcom/android/server/AppStateTracker$Listener;->onUidForegroundStateChanged(Lcom/android/server/AppStateTracker;I)V
+HPLcom/android/server/AppStateTracker$MyHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/AppStateTracker$MyHandler;->handleUidStateChanged(II)V
+HPLcom/android/server/AppStateTracker$MyHandler;->onUidStateChanged(II)V
+HPLcom/android/server/AppStateTracker$UidObserver;->onUidStateChanged(IIJ)V
+HPLcom/android/server/AppStateTracker;->access$100(Lcom/android/server/AppStateTracker;)Ljava/lang/Object;
+HPLcom/android/server/AppStateTracker;->access$1800(Landroid/util/SparseBooleanArray;IZ)Z
+HPLcom/android/server/AppStateTracker;->access$200(Lcom/android/server/AppStateTracker;)Lcom/android/server/AppStateTracker$MyHandler;
+HPLcom/android/server/AppStateTracker;->access$800(Lcom/android/server/AppStateTracker;)Lcom/android/internal/util/StatLogger;
+HPLcom/android/server/AppStateTracker;->areJobsRestricted(ILjava/lang/String;Z)Z
+HPLcom/android/server/AppStateTracker;->findForcedAppStandbyUidPackageIndexLocked(ILjava/lang/String;)I
+HPLcom/android/server/AppStateTracker;->isAnyAppIdUnwhitelisted([I[I)Z
+HPLcom/android/server/AppStateTracker;->isRestricted(ILjava/lang/String;ZZ)Z
+HPLcom/android/server/AppStateTracker;->isRunAnyRestrictedLocked(ILjava/lang/String;)Z
+HPLcom/android/server/AppStateTracker;->isUidActive(I)Z
+HPLcom/android/server/AppStateTracker;->isUidInForeground(I)Z
+HPLcom/android/server/AppStateTracker;->removeUidFromArray(Landroid/util/SparseBooleanArray;IZ)Z
+HPLcom/android/server/BatteryService$HealthServiceWrapper$Callback;->onRegistration(Landroid/hardware/health/V2_0/IHealth;Landroid/hardware/health/V2_0/IHealth;Ljava/lang/String;)V
+HPLcom/android/server/BatteryService;->update(Landroid/hardware/health/V2_0/HealthInfo;)V
+HPLcom/android/server/ConnectivityService;->checkSettingsPermission(II)Z
+HPLcom/android/server/ConnectivityService;->enforceAccessPermission()V
+HPLcom/android/server/ConnectivityService;->enforceConnectivityInternalPermission()V
+HPLcom/android/server/ConnectivityService;->filterNetworkStateForUid(Landroid/net/NetworkState;IZ)V
+HPLcom/android/server/ConnectivityService;->getActiveNetwork()Landroid/net/Network;
+HPLcom/android/server/ConnectivityService;->getActiveNetworkForUid(IZ)Landroid/net/Network;
+HPLcom/android/server/ConnectivityService;->getActiveNetworkForUidInternal(IZ)Landroid/net/Network;
+HPLcom/android/server/ConnectivityService;->getActiveNetworkInfo()Landroid/net/NetworkInfo;
+HPLcom/android/server/ConnectivityService;->getDefaultNetwork()Lcom/android/server/connectivity/NetworkAgentInfo;
+HPLcom/android/server/ConnectivityService;->getNetworkAgentInfoForNetId(I)Lcom/android/server/connectivity/NetworkAgentInfo;
+HPLcom/android/server/ConnectivityService;->getNetworkAgentInfoForNetwork(Landroid/net/Network;)Lcom/android/server/connectivity/NetworkAgentInfo;
+HPLcom/android/server/ConnectivityService;->getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;
+HPLcom/android/server/ConnectivityService;->getNetworkCapabilitiesInternal(Lcom/android/server/connectivity/NetworkAgentInfo;)Landroid/net/NetworkCapabilities;
+HPLcom/android/server/ConnectivityService;->getNetworkForRequest(I)Lcom/android/server/connectivity/NetworkAgentInfo;
+HPLcom/android/server/ConnectivityService;->getNetworkInfoForUid(Landroid/net/Network;IZ)Landroid/net/NetworkInfo;
+HPLcom/android/server/ConnectivityService;->getUnfilteredActiveNetworkState(I)Landroid/net/NetworkState;
+HPLcom/android/server/ConnectivityService;->getVpnUnderlyingNetworks(I)[Landroid/net/Network;
+HPLcom/android/server/ConnectivityService;->isActiveNetworkMetered()Z
+HPLcom/android/server/ConnectivityService;->isNetworkWithLinkPropertiesBlocked(Landroid/net/LinkProperties;IZ)Z
+HPLcom/android/server/ConnectivityService;->isSystem(I)Z
+HPLcom/android/server/ConnectivityService;->maybeLogBlockedNetworkInfo(Landroid/net/NetworkInfo;I)V
+HPLcom/android/server/ConnectivityService;->networkCapabilitiesRestrictedForCallerPermissions(Landroid/net/NetworkCapabilities;II)Landroid/net/NetworkCapabilities;
+HPLcom/android/server/ConnectivityService;->processListenRequests(Lcom/android/server/connectivity/NetworkAgentInfo;Z)V
+HPLcom/android/server/ConnectivityService;->putParcelable(Landroid/os/Bundle;Landroid/os/Parcelable;)V
+HPLcom/android/server/ConnectivityService;->rematchNetworkAndRequests(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/ConnectivityService$ReapUnvalidatedNetworks;J)V
+HPLcom/android/server/ConnectivityService;->sendDataActivityBroadcast(IZJ)V
+HPLcom/android/server/DeviceIdleController$BinderService;->isPowerSaveWhitelistExceptIdleApp(Ljava/lang/String;)Z
+HPLcom/android/server/DeviceIdleController;->isPowerSaveWhitelistExceptIdleAppInternal(Ljava/lang/String;)Z
+HPLcom/android/server/DiskStatsService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HPLcom/android/server/DropBoxManagerService$EntryFile;->compareTo(Lcom/android/server/DropBoxManagerService$EntryFile;)I
+HPLcom/android/server/DropBoxManagerService$EntryFile;->compareTo(Ljava/lang/Object;)I
+HPLcom/android/server/DropBoxManagerService$EntryFile;->hasFile()Z
+HPLcom/android/server/DropBoxManagerService;->add(Landroid/os/DropBoxManager$Entry;)V
+HPLcom/android/server/DropBoxManagerService;->createEntry(Ljava/io/File;Ljava/lang/String;I)J
+HPLcom/android/server/DropBoxManagerService;->isTagEnabled(Ljava/lang/String;)Z
+HPLcom/android/server/DropBoxManagerService;->trimToFit()J
+HPLcom/android/server/EventLogTags;->writeNotificationEnqueue(IILjava/lang/String;ILjava/lang/String;ILjava/lang/String;I)V
+HPLcom/android/server/InputMethodManagerService;->calledFromValidUser()Z
+HPLcom/android/server/IntentResolver$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/IntentResolver;->buildResolveList(Landroid/content/Intent;Landroid/util/FastImmutableArraySet;ZZLjava/lang/String;Ljava/lang/String;[Landroid/content/IntentFilter;Ljava/util/List;I)V
+HPLcom/android/server/IntentResolver;->filterEquals(Landroid/content/IntentFilter;Landroid/content/IntentFilter;)Z
+HPLcom/android/server/IntentResolver;->filterResults(Ljava/util/List;)V
+HPLcom/android/server/IntentResolver;->getFastIntentCategories(Landroid/content/Intent;)Landroid/util/FastImmutableArraySet;
+HPLcom/android/server/IntentResolver;->isFilterStopped(Landroid/content/IntentFilter;I)Z
+HPLcom/android/server/IntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+HPLcom/android/server/IntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;ZI)Ljava/util/List;
+HPLcom/android/server/IntentResolver;->queryIntentFromList(Landroid/content/Intent;Ljava/lang/String;ZLjava/util/ArrayList;I)Ljava/util/List;
+HPLcom/android/server/IntentResolver;->sortResults(Ljava/util/List;)V
+HPLcom/android/server/IpSecService$IpSecServiceConfiguration;->getNetdInstance()Landroid/net/INetd;
+HPLcom/android/server/IpSecService$UidFdTagger;->tag(Ljava/io/FileDescriptor;I)V
+HPLcom/android/server/LocationManagerService;->checkInteractAcrossUsersPermission(I)V
+HPLcom/android/server/LocationManagerService;->checkPackageName(Ljava/lang/String;)V
+HPLcom/android/server/LocationManagerService;->getCallerAllowedResolutionLevel()I
+HPLcom/android/server/LocationManagerService;->getLastLocation(Landroid/location/LocationRequest;Ljava/lang/String;)Landroid/location/Location;
+HPLcom/android/server/LocationManagerService;->handleLocationChangedLocked(Landroid/location/Location;Z)V
+HPLcom/android/server/LocationManagerService;->isLocationEnabledForUser(I)Z
+HPLcom/android/server/LocationManagerService;->isLocationProviderEnabledForUser(Ljava/lang/String;I)Z
+HPLcom/android/server/LocationManagerService;->locationCallbackFinished(Landroid/location/ILocationListener;)V
+HPLcom/android/server/LocationManagerService;->onUidImportanceChanged(II)V
+HPLcom/android/server/NativeDaemonConnector;->appendEscaped(Ljava/lang/StringBuilder;Ljava/lang/String;)V
+HPLcom/android/server/NativeDaemonConnector;->executeForList(JLjava/lang/String;[Ljava/lang/Object;)[Lcom/android/server/NativeDaemonEvent;
+HPLcom/android/server/NativeDaemonConnector;->listenToSocket()V
+HPLcom/android/server/NativeDaemonConnector;->uptimeMillisInt()I
+HPLcom/android/server/NativeDaemonEvent;->isClassUnsolicited(I)Z
+HPLcom/android/server/NativeDaemonEvent;->unescapeArgs(Ljava/lang/String;)[Ljava/lang/String;
+HPLcom/android/server/NetworkManagementInternal;->isNetworkRestrictedForUid(I)Z
+HPLcom/android/server/NetworkManagementService$LocalService;->isNetworkRestrictedForUid(I)Z
+HPLcom/android/server/NetworkManagementService$NetdTetheringStatsProvider;->getTetherStats(I)Landroid/net/NetworkStats;
+HPLcom/android/server/NetworkManagementService;->access$1700(Lcom/android/server/NetworkManagementService;I)Z
+HPLcom/android/server/NetworkManagementService;->enforceSystemUid()V
+HPLcom/android/server/NetworkManagementService;->getFirewallChainState(I)Z
+HPLcom/android/server/NetworkManagementService;->getNetworkStatsTethering(I)Landroid/net/NetworkStats;
+HPLcom/android/server/NetworkManagementService;->invokeForAllObservers(Lcom/android/server/NetworkManagementService$NetworkManagementEventCallback;)V
+HPLcom/android/server/NetworkManagementService;->isNetworkRestrictedInternal(I)Z
+HPLcom/android/server/NetworkManagementService;->lambda$notifyInterfaceClassActivity$5(IZJLandroid/net/INetworkManagementEventObserver;)V
+HPLcom/android/server/NetworkManagementService;->setUidCleartextNetworkPolicy(II)V
+HPLcom/android/server/NetworkScoreService$ScoringServiceConnection;->getPackageName()Ljava/lang/String;
+HPLcom/android/server/NetworkScoreService;->enforceSystemOrHasScoreNetworks()V
+HPLcom/android/server/NetworkScoreService;->getActiveScorerPackage()Ljava/lang/String;
+HPLcom/android/server/NsdService$DaemonConnectionSupplier;->get(Lcom/android/server/NsdService$NativeCallbackReceiver;)Lcom/android/server/NsdService$DaemonConnection;
+HPLcom/android/server/NsdService$NsdSettings;->isEnabled()Z
+HPLcom/android/server/NsdService$NsdSettings;->putEnabledStatus(Z)V
+HPLcom/android/server/NsdService$NsdSettings;->registerContentObserver(Landroid/net/Uri;Landroid/database/ContentObserver;)V
+HPLcom/android/server/PersistentDataBlockManagerInternal;->forceOemUnlockEnabled(Z)V
+HPLcom/android/server/PersistentDataBlockManagerInternal;->getFrpCredentialHandle()[B
+HPLcom/android/server/PersistentDataBlockManagerInternal;->setFrpCredentialHandle([B)V
+HPLcom/android/server/StorageManagerService;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;
+HPLcom/android/server/StorageManagerService;->getVolumes(I)[Landroid/os/storage/VolumeInfo;
+HPLcom/android/server/StorageManagerService;->isUserKeyUnlocked(I)Z
+HPLcom/android/server/TelephonyRegistry$Record;->matchPhoneStateListenerEvent(I)Z
+HPLcom/android/server/TelephonyRegistry;->broadcastSignalStrengthChanged(Landroid/telephony/SignalStrength;II)V
+HPLcom/android/server/TelephonyRegistry;->notifyDataConnectionForSubscriber(IIZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;IZ)V
+HPLcom/android/server/TelephonyRegistry;->notifySignalStrengthForPhoneId(IILandroid/telephony/SignalStrength;)V
+HPLcom/android/server/TelephonyRegistry;->validateEventsAndUserLocked(Lcom/android/server/TelephonyRegistry$Record;I)Z
+HPLcom/android/server/ThreadPriorityBooster;->boost()V
+HPLcom/android/server/ThreadPriorityBooster;->reset()V
+HPLcom/android/server/Watchdog$BinderThreadMonitor;->monitor()V
+HPLcom/android/server/Watchdog$HandlerChecker;->getCompletionStateLocked()I
+HPLcom/android/server/Watchdog$HandlerChecker;->run()V
+HPLcom/android/server/Watchdog$HandlerChecker;->scheduleCheckLocked()V
+HPLcom/android/server/Watchdog;->evaluateCheckerCompletionLocked()I
+HPLcom/android/server/Watchdog;->run()V
+HPLcom/android/server/accessibility/KeyEventDispatcher$KeyEventFilter;->onKeyEvent(Landroid/view/KeyEvent;I)Z
+HPLcom/android/server/accounts/AccountManagerService$Session;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZZ)V
+HPLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$800(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I
+HPLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$900(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+HPLcom/android/server/accounts/AccountManagerService;->accountTypeManagesContacts(Ljava/lang/String;I)Z
+HPLcom/android/server/accounts/AccountManagerService;->cancelNotification(Lcom/android/server/accounts/AccountManagerService$NotificationId;Ljava/lang/String;Landroid/os/UserHandle;)V
+HPLcom/android/server/accounts/AccountManagerService;->checkPackageSignature(Ljava/lang/String;II)I
+HPLcom/android/server/accounts/AccountManagerService;->filterAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;[Landroid/accounts/Account;ILjava/lang/String;Z)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->filterSharedAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/util/Map;ILjava/lang/String;)Ljava/util/Map;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountVisibilityFromCache(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I
+HPLcom/android/server/accounts/AccountManagerService;->getAccounts(ILjava/lang/String;)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUser(Ljava/lang/String;ILjava/lang/String;)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUserForPackage(Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsFromCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAccountsInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;ILjava/lang/String;Ljava/util/List;Z)[Landroid/accounts/Account;
+HPLcom/android/server/accounts/AccountManagerService;->getAuthToken(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;Ljava/lang/String;ZZLandroid/os/Bundle;)V
+HPLcom/android/server/accounts/AccountManagerService;->getAuthenticatorTypes(I)[Landroid/accounts/AuthenticatorDescription;
+HPLcom/android/server/accounts/AccountManagerService;->getPackagesAndVisibilityForAccountLocked(Landroid/accounts/Account;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+HPLcom/android/server/accounts/AccountManagerService;->getPassword(Landroid/accounts/Account;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountManagerService;->getTypesForCaller(IIZ)Ljava/util/List;
+HPLcom/android/server/accounts/AccountManagerService;->getTypesManagedByCaller(II)Ljava/util/List;
+HPLcom/android/server/accounts/AccountManagerService;->getTypesVisibleToCaller(IILjava/lang/String;)Ljava/util/List;
+HPLcom/android/server/accounts/AccountManagerService;->getUserAccounts(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts;
+HPLcom/android/server/accounts/AccountManagerService;->getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountManagerService;->getUserManager()Landroid/os/UserManager;
+HPLcom/android/server/accounts/AccountManagerService;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/UserHandle;)Z
+HPLcom/android/server/accounts/AccountManagerService;->isAccountManagedByCaller(Ljava/lang/String;II)Z
+HPLcom/android/server/accounts/AccountManagerService;->isPermittedForPackage(Ljava/lang/String;II[Ljava/lang/String;)Z
+HPLcom/android/server/accounts/AccountManagerService;->isPreOApplication(Ljava/lang/String;)Z
+HPLcom/android/server/accounts/AccountManagerService;->isPrivileged(I)Z
+HPLcom/android/server/accounts/AccountManagerService;->isProfileOwner(I)Z
+HPLcom/android/server/accounts/AccountManagerService;->onAccountAccessed(Ljava/lang/String;)V
+HPLcom/android/server/accounts/AccountManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLcom/android/server/accounts/AccountManagerService;->peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/accounts/AccountManagerService;->permissionIsGranted(Landroid/accounts/Account;Ljava/lang/String;II)Z
+HPLcom/android/server/accounts/AccountManagerService;->resolveAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/lang/Integer;
+HPLcom/android/server/accounts/AccountManagerService;->setAuthToken(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/accounts/AccountManagerService;->setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->access$600(Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;)Z
+HPLcom/android/server/accounts/AccountsDb;->isCeDatabaseAttached()Z
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;I)V
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->getAllServices(I)Ljava/util/Collection;
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->getBindInstantServiceAllowed(I)Z
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->getServiceInfo(Landroid/accounts/AuthenticatorDescription;I)Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->invalidateCache(I)V
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->setBindInstantServiceAllowed(IZ)V
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->setListener(Landroid/content/pm/RegisteredServicesCacheListener;Landroid/os/Handler;)V
+HPLcom/android/server/accounts/IAccountAuthenticatorCache;->updateServices(I)V
+HPLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$PpNEY15dspg9oLlkg1OsyjrPTqw;-><init>(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+HPLcom/android/server/am/-$$Lambda$RunningTasks$BGar3HlUsTw-0HzSmfkEWly0moY;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/am/ActiveServices$ServiceLookupResult;-><init>(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ServiceRecord;Ljava/lang/String;)V
+HPLcom/android/server/am/ActiveServices$ServiceMap;->ensureNotStartingBackgroundLocked(Lcom/android/server/am/ServiceRecord;)V
+HPLcom/android/server/am/ActiveServices$ServiceMap;->rescheduleDelayedStartsLocked()V
+HPLcom/android/server/am/ActiveServices$ServiceRestarter;-><init>(Lcom/android/server/am/ActiveServices;)V
+HPLcom/android/server/am/ActiveServices$ServiceRestarter;-><init>(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices$1;)V
+HPLcom/android/server/am/ActiveServices$ServiceRestarter;->setService(Lcom/android/server/am/ServiceRecord;)V
+HPLcom/android/server/am/ActiveServices;->bindServiceLocked(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;I)I
+HPLcom/android/server/am/ActiveServices;->bringDownServiceIfNeededLocked(Lcom/android/server/am/ServiceRecord;ZZ)V
+HPLcom/android/server/am/ActiveServices;->bringDownServiceLocked(Lcom/android/server/am/ServiceRecord;)V
+HPLcom/android/server/am/ActiveServices;->bringUpServiceLocked(Lcom/android/server/am/ServiceRecord;IZZZ)Ljava/lang/String;
+HPLcom/android/server/am/ActiveServices;->bumpServiceExecutingLocked(Lcom/android/server/am/ServiceRecord;ZLjava/lang/String;)V
+HPLcom/android/server/am/ActiveServices;->cancelForegroundNotificationLocked(Lcom/android/server/am/ServiceRecord;)V
+HPLcom/android/server/am/ActiveServices;->collectPackageServicesLocked(Ljava/lang/String;Ljava/util/Set;ZZZLandroid/util/ArrayMap;)Z
+HPLcom/android/server/am/ActiveServices;->findServiceLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Lcom/android/server/am/ServiceRecord;
+HPLcom/android/server/am/ActiveServices;->getServiceByNameLocked(Landroid/content/ComponentName;I)Lcom/android/server/am/ServiceRecord;
+HPLcom/android/server/am/ActiveServices;->getServiceMapLocked(I)Lcom/android/server/am/ActiveServices$ServiceMap;
+HPLcom/android/server/am/ActiveServices;->hasBackgroundServicesLocked(I)Z
+HPLcom/android/server/am/ActiveServices;->isServiceNeededLocked(Lcom/android/server/am/ServiceRecord;ZZ)Z
+HPLcom/android/server/am/ActiveServices;->makeRunningServiceInfoLocked(Lcom/android/server/am/ServiceRecord;)Landroid/app/ActivityManager$RunningServiceInfo;
+HPLcom/android/server/am/ActiveServices;->publishServiceLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Landroid/os/IBinder;)V
+HPLcom/android/server/am/ActiveServices;->realStartServiceLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ProcessRecord;Z)V
+HPLcom/android/server/am/ActiveServices;->removeConnectionLocked(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActivityRecord;)V
+HPLcom/android/server/am/ActiveServices;->requestServiceBindingLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;ZZ)Z
+HPLcom/android/server/am/ActiveServices;->requestServiceBindingsLocked(Lcom/android/server/am/ServiceRecord;Z)V
+HPLcom/android/server/am/ActiveServices;->retrieveServiceLocked(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;IIIZZZZ)Lcom/android/server/am/ActiveServices$ServiceLookupResult;
+HPLcom/android/server/am/ActiveServices;->scheduleServiceTimeoutLocked(Lcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/ActiveServices;->sendServiceArgsLocked(Lcom/android/server/am/ServiceRecord;ZZ)V
+HPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;III)V
+HPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;ZZ)V
+HPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ActiveServices$ServiceMap;Landroid/content/Intent;Lcom/android/server/am/ServiceRecord;ZZ)Landroid/content/ComponentName;
+HPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;I)Landroid/content/ComponentName;
+HPLcom/android/server/am/ActiveServices;->stopInBackgroundLocked(I)V
+HPLcom/android/server/am/ActiveServices;->stopServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I
+HPLcom/android/server/am/ActiveServices;->stopServiceLocked(Lcom/android/server/am/ServiceRecord;)V
+HPLcom/android/server/am/ActiveServices;->stopServiceTokenLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z
+HPLcom/android/server/am/ActiveServices;->unbindServiceLocked(Landroid/app/IServiceConnection;)Z
+HPLcom/android/server/am/ActiveServices;->unscheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;IZ)Z
+HPLcom/android/server/am/ActiveServices;->updateServiceClientActivitiesLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;Z)Z
+HPLcom/android/server/am/ActiveServices;->updateServiceForegroundLocked(Lcom/android/server/am/ProcessRecord;Z)V
+HPLcom/android/server/am/ActivityDisplay;->getChildAt(I)Lcom/android/server/am/ActivityStack;
+HPLcom/android/server/am/ActivityDisplay;->getChildCount()I
+HPLcom/android/server/am/ActivityDisplay;->isTopNotPinnedStack(Lcom/android/server/am/ActivityStack;)Z
+HPLcom/android/server/am/ActivityManagerService$2;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+HPLcom/android/server/am/ActivityManagerService$2;->allowFilterResult(Lcom/android/server/am/BroadcastFilter;Ljava/util/List;)Z
+HPLcom/android/server/am/ActivityManagerService$2;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+HPLcom/android/server/am/ActivityManagerService$2;->isPackageForFilter(Ljava/lang/String;Lcom/android/server/am/BroadcastFilter;)Z
+HPLcom/android/server/am/ActivityManagerService$2;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+HPLcom/android/server/am/ActivityManagerService$2;->newResult(Lcom/android/server/am/BroadcastFilter;II)Lcom/android/server/am/BroadcastFilter;
+HPLcom/android/server/am/ActivityManagerService$3;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/am/ActivityManagerService$Injector;->ensureHasNetworkManagementInternal()Z
+HPLcom/android/server/am/ActivityManagerService$Injector;->isNetworkRestrictedForUid(I)Z
+HPLcom/android/server/am/ActivityManagerService$KillHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/am/ActivityManagerService$LocalService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService$LocalService;->notifyNetworkPolicyRulesUpdated(IJ)V
+HPLcom/android/server/am/ActivityManagerService$LocalService;->setPendingIntentWhitelistDuration(Landroid/content/IIntentSender;Landroid/os/IBinder;J)V
+HPLcom/android/server/am/ActivityManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/am/ActivityManagerService$UiHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/am/ActivityManagerService;->addBroadcastStatLocked(Ljava/lang/String;Ljava/lang/String;IIJ)V
+HPLcom/android/server/am/ActivityManagerService;->appDiedLocked(Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;Z)V
+HPLcom/android/server/am/ActivityManagerService;->appRestrictedInBackgroundLocked(ILjava/lang/String;I)I
+HPLcom/android/server/am/ActivityManagerService;->applyOomAdjLocked(Lcom/android/server/am/ProcessRecord;ZJJ)Z
+HPLcom/android/server/am/ActivityManagerService;->attachApplication(Landroid/app/IApplicationThread;J)V
+HPLcom/android/server/am/ActivityManagerService;->attachApplicationLocked(Landroid/app/IApplicationThread;IIJ)Z
+HPLcom/android/server/am/ActivityManagerService;->backgroundServicesFinishedLocked(I)V
+HPLcom/android/server/am/ActivityManagerService;->bindService(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;ILjava/lang/String;I)I
+HPLcom/android/server/am/ActivityManagerService;->boostPriorityForLockedSection()V
+HPLcom/android/server/am/ActivityManagerService;->broadcastIntent(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I
+HPLcom/android/server/am/ActivityManagerService;->broadcastIntentInPackage(Ljava/lang/String;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;Ljava/lang/String;Landroid/os/Bundle;ZZI)I
+HPLcom/android/server/am/ActivityManagerService;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZIII)I
+HPLcom/android/server/am/ActivityManagerService;->broadcastQueueForIntent(Landroid/content/Intent;)Lcom/android/server/am/BroadcastQueue;
+HPLcom/android/server/am/ActivityManagerService;->canClearIdentity(III)Z
+HPLcom/android/server/am/ActivityManagerService;->checkBroadcastFromSystem(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;IZLjava/util/List;)V
+HPLcom/android/server/am/ActivityManagerService;->checkCallingPermission(Ljava/lang/String;)I
+HPLcom/android/server/am/ActivityManagerService;->checkComponentPermission(Ljava/lang/String;IIIZ)I
+HPLcom/android/server/am/ActivityManagerService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService;->checkContentProviderPermissionLocked(Landroid/content/pm/ProviderInfo;Lcom/android/server/am/ProcessRecord;IZ)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService;->checkGrantUriPermissionFromIntentLocked(ILjava/lang/String;Landroid/content/Intent;ILcom/android/server/am/ActivityManagerService$NeededUriGrants;I)Lcom/android/server/am/ActivityManagerService$NeededUriGrants;
+HPLcom/android/server/am/ActivityManagerService;->checkPermission(Ljava/lang/String;II)I
+HPLcom/android/server/am/ActivityManagerService;->checkPermissionWithToken(Ljava/lang/String;IILandroid/os/IBinder;)I
+HPLcom/android/server/am/ActivityManagerService;->checkTime(JLjava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->collectReceiverComponents(Landroid/content/Intent;Ljava/lang/String;I[I)Ljava/util/List;
+HPLcom/android/server/am/ActivityManagerService;->compatibilityInfoForPackageLocked(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;
+HPLcom/android/server/am/ActivityManagerService;->computeOomAdjLocked(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJ)Z
+HPLcom/android/server/am/ActivityManagerService;->decProviderCountLocked(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;Z)Z
+HPLcom/android/server/am/ActivityManagerService;->dispatchUidsChanged()V
+HPLcom/android/server/am/ActivityManagerService;->dispatchUidsChangedForObserver(Landroid/app/IUidObserver;Lcom/android/server/am/ActivityManagerService$UidObserverRegistration;I)V
+HPLcom/android/server/am/ActivityManagerService;->enforceCallerIsRecentsOrHasPermission(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->enforceNotIsolatedCaller(Ljava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->enqueueUidChangeLocked(Lcom/android/server/am/UidRecord;II)V
+HPLcom/android/server/am/ActivityManagerService;->fillInProcMemInfo(Lcom/android/server/am/ProcessRecord;Landroid/app/ActivityManager$RunningAppProcessInfo;I)V
+HPLcom/android/server/am/ActivityManagerService;->findAppProcess(Landroid/os/IBinder;Ljava/lang/String;)Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ActivityManagerService;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V
+HPLcom/android/server/am/ActivityManagerService;->getActivityOptions(Landroid/os/IBinder;)Landroid/os/Bundle;
+HPLcom/android/server/am/ActivityManagerService;->getAppStartModeLocked(ILjava/lang/String;IIZZZ)I
+HPLcom/android/server/am/ActivityManagerService;->getBackgroundLaunchBroadcasts()Landroid/util/ArraySet;
+HPLcom/android/server/am/ActivityManagerService;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder;
+HPLcom/android/server/am/ActivityManagerService;->getContentProviderExternalUnchecked(Ljava/lang/String;Landroid/os/IBinder;I)Landroid/app/ContentProviderHolder;
+HPLcom/android/server/am/ActivityManagerService;->getContentProviderImpl(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/os/IBinder;ZI)Landroid/app/ContentProviderHolder;
+HPLcom/android/server/am/ActivityManagerService;->getCurrentUser()Landroid/content/pm/UserInfo;
+HPLcom/android/server/am/ActivityManagerService;->getFilteredTasks(III)Ljava/util/List;
+HPLcom/android/server/am/ActivityManagerService;->getFocusedStackInfo()Landroid/app/ActivityManager$StackInfo;
+HPLcom/android/server/am/ActivityManagerService;->getGlobalConfiguration()Landroid/content/res/Configuration;
+HPLcom/android/server/am/ActivityManagerService;->getIntentSender(ILjava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;I)Landroid/content/IIntentSender;
+HPLcom/android/server/am/ActivityManagerService;->getIntentSenderLocked(ILjava/lang/String;IILandroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;)Landroid/content/IIntentSender;
+HPLcom/android/server/am/ActivityManagerService;->getLRURecordIndexForAppLocked(Landroid/app/IApplicationThread;)I
+HPLcom/android/server/am/ActivityManagerService;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V
+HPLcom/android/server/am/ActivityManagerService;->getMemoryTrimLevel()I
+HPLcom/android/server/am/ActivityManagerService;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V
+HPLcom/android/server/am/ActivityManagerService;->getPackageForIntentSender(Landroid/content/IIntentSender;)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService;->getPackageManagerInternalLocked()Landroid/content/pm/PackageManagerInternal;
+HPLcom/android/server/am/ActivityManagerService;->getPackageProcessState(Ljava/lang/String;Ljava/lang/String;)I
+HPLcom/android/server/am/ActivityManagerService;->getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;
+HPLcom/android/server/am/ActivityManagerService;->getProcessRecordLocked(Ljava/lang/String;IZ)Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ActivityManagerService;->getProviderMimeType(Landroid/net/Uri;I)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService;->getRecentTasks()Lcom/android/server/am/RecentTasks;
+HPLcom/android/server/am/ActivityManagerService;->getRecentTasks(III)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/am/ActivityManagerService;->getRecordForAppLocked(Landroid/app/IApplicationThread;)Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ActivityManagerService;->getRunningAppProcesses()Ljava/util/List;
+HPLcom/android/server/am/ActivityManagerService;->getStackInfo(II)Landroid/app/ActivityManager$StackInfo;
+HPLcom/android/server/am/ActivityManagerService;->getTagForIntentSender(Landroid/content/IIntentSender;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService;->getTagForIntentSenderLocked(Lcom/android/server/am/PendingIntentRecord;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/am/ActivityManagerService;->getUidForIntentSender(Landroid/content/IIntentSender;)I
+HPLcom/android/server/am/ActivityManagerService;->grantEphemeralAccessLocked(ILandroid/content/Intent;II)V
+HPLcom/android/server/am/ActivityManagerService;->grantUriPermissionFromOwner(Landroid/os/IBinder;ILjava/lang/String;Landroid/net/Uri;III)V
+HPLcom/android/server/am/ActivityManagerService;->handleIncomingUser(IIIZZLjava/lang/String;Ljava/lang/String;)I
+HPLcom/android/server/am/ActivityManagerService;->handleProcessStartedLocked(Lcom/android/server/am/ProcessRecord;IZJZ)Z
+HPLcom/android/server/am/ActivityManagerService;->idleUids()V
+HPLcom/android/server/am/ActivityManagerService;->incProviderCountLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;Z)Lcom/android/server/am/ContentProviderConnection;
+HPLcom/android/server/am/ActivityManagerService;->isAppStartModeDisabled(ILjava/lang/String;)Z
+HPLcom/android/server/am/ActivityManagerService;->isInstantApp(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;I)Z
+HPLcom/android/server/am/ActivityManagerService;->isProcessAliveLocked(Lcom/android/server/am/ProcessRecord;)Z
+HPLcom/android/server/am/ActivityManagerService;->isReceivingBroadcastLocked(Lcom/android/server/am/ProcessRecord;Landroid/util/ArraySet;)Z
+HPLcom/android/server/am/ActivityManagerService;->isSingleton(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Z
+HPLcom/android/server/am/ActivityManagerService;->isUidActiveLocked(I)Z
+HPLcom/android/server/am/ActivityManagerService;->killPackageProcessesLocked(Ljava/lang/String;IIIZZZZLjava/lang/String;)Z
+HPLcom/android/server/am/ActivityManagerService;->maybeUpdateProviderUsageStatsLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/am/ActivityManagerService;->maybeUpdateUsageStatsLocked(Lcom/android/server/am/ProcessRecord;J)V
+HPLcom/android/server/am/ActivityManagerService;->noteUidProcessState(II)V
+HPLcom/android/server/am/ActivityManagerService;->notifyPackageUse(Ljava/lang/String;I)V
+HPLcom/android/server/am/ActivityManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLcom/android/server/am/ActivityManagerService;->procStateToImportance(IILandroid/app/ActivityManager$RunningAppProcessInfo;I)I
+HPLcom/android/server/am/ActivityManagerService;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V
+HPLcom/android/server/am/ActivityManagerService;->publishService(Landroid/os/IBinder;Landroid/content/Intent;Landroid/os/IBinder;)V
+HPLcom/android/server/am/ActivityManagerService;->refContentProvider(Landroid/os/IBinder;II)Z
+HPLcom/android/server/am/ActivityManagerService;->registerReceiver(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;
+HPLcom/android/server/am/ActivityManagerService;->removeContentProvider(Landroid/os/IBinder;Z)V
+HPLcom/android/server/am/ActivityManagerService;->removeDyingProviderLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Z)Z
+HPLcom/android/server/am/ActivityManagerService;->removeReceiverLocked(Lcom/android/server/am/ReceiverList;)V
+HPLcom/android/server/am/ActivityManagerService;->resetPriorityAfterLockedSection()V
+HPLcom/android/server/am/ActivityManagerService;->rotateBroadcastStatsIfNeededLocked()V
+HPLcom/android/server/am/ActivityManagerService;->scheduleAppGcsLocked()V
+HPLcom/android/server/am/ActivityManagerService;->serviceDoneExecuting(Landroid/os/IBinder;III)V
+HPLcom/android/server/am/ActivityManagerService;->setAppIdTempWhitelistStateLocked(IZ)V
+HPLcom/android/server/am/ActivityManagerService;->setProcessTrackerStateLocked(Lcom/android/server/am/ProcessRecord;IJ)V
+HPLcom/android/server/am/ActivityManagerService;->startAssociationLocked(ILjava/lang/String;IILandroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/am/ActivityManagerService$Association;
+HPLcom/android/server/am/ActivityManagerService;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Z
+HPLcom/android/server/am/ActivityManagerService;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILjava/lang/String;Landroid/content/ComponentName;ZZIZLjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Runnable;)Lcom/android/server/am/ProcessRecord;
+HPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;I)Landroid/content/ComponentName;
+HPLcom/android/server/am/ActivityManagerService;->startServiceInPackage(ILandroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;I)Landroid/content/ComponentName;
+HPLcom/android/server/am/ActivityManagerService;->stopAssociationLocked(ILjava/lang/String;ILandroid/content/ComponentName;)V
+HPLcom/android/server/am/ActivityManagerService;->stopServiceToken(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z
+HPLcom/android/server/am/ActivityManagerService;->trimApplicationsLocked()V
+HPLcom/android/server/am/ActivityManagerService;->unbindService(Landroid/app/IServiceConnection;)Z
+HPLcom/android/server/am/ActivityManagerService;->unregisterReceiver(Landroid/content/IIntentReceiver;)V
+HPLcom/android/server/am/ActivityManagerService;->updateCpuStats()V
+HPLcom/android/server/am/ActivityManagerService;->updateCpuStatsNow()V
+HPLcom/android/server/am/ActivityManagerService;->updateLruProcessInternalLocked(Lcom/android/server/am/ProcessRecord;JILjava/lang/String;Ljava/lang/Object;Lcom/android/server/am/ProcessRecord;)I
+HPLcom/android/server/am/ActivityManagerService;->updateLruProcessLocked(Lcom/android/server/am/ProcessRecord;ZLcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJ)Z
+HPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;Z)Z
+HPLcom/android/server/am/ActivityManagerService;->updateProcessForegroundLocked(Lcom/android/server/am/ProcessRecord;ZZ)V
+HPLcom/android/server/am/ActivityManagerService;->verifyBroadcastLocked(Landroid/content/Intent;)Landroid/content/Intent;
+HPLcom/android/server/am/ActivityRecord;->canShowWhenLocked()Z
+HPLcom/android/server/am/ActivityRecord;->getStack()Lcom/android/server/am/ActivityStack;
+HPLcom/android/server/am/ActivityRecord;->getTask()Lcom/android/server/am/TaskRecord;
+HPLcom/android/server/am/ActivityRecord;->hasDismissKeyguardWindows()Z
+HPLcom/android/server/am/ActivityRecord;->isState(Lcom/android/server/am/ActivityStack$ActivityState;)Z
+HPLcom/android/server/am/ActivityRecord;->isState(Lcom/android/server/am/ActivityStack$ActivityState;Lcom/android/server/am/ActivityStack$ActivityState;)Z
+HPLcom/android/server/am/ActivityRecord;->okToShowLocked()Z
+HPLcom/android/server/am/ActivityRecord;->shouldBeVisibleIgnoringKeyguard(Z)Z
+HPLcom/android/server/am/ActivityStack;->cancelInitializingActivities()V
+HPLcom/android/server/am/ActivityStack;->checkKeyguardVisibility(Lcom/android/server/am/ActivityRecord;ZZ)Z
+HPLcom/android/server/am/ActivityStack;->checkTranslucentActivityWaiting(Lcom/android/server/am/ActivityRecord;)V
+HPLcom/android/server/am/ActivityStack;->ensureActivitiesVisibleLocked(Lcom/android/server/am/ActivityRecord;IZZ)V
+HPLcom/android/server/am/ActivityStack;->getDisplay()Lcom/android/server/am/ActivityDisplay;
+HPLcom/android/server/am/ActivityStack;->getParent()Lcom/android/server/wm/ConfigurationContainer;
+HPLcom/android/server/am/ActivityStack;->getResumedActivity()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/ActivityStack;->getRunningTasks(Ljava/util/List;IIIZ)V
+HPLcom/android/server/am/ActivityStack;->getTopDismissingKeyguardActivity()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/ActivityStack;->isAttached()Z
+HPLcom/android/server/am/ActivityStack;->isStackTranslucent(Lcom/android/server/am/ActivityRecord;)Z
+HPLcom/android/server/am/ActivityStack;->makeInvisible(Lcom/android/server/am/ActivityRecord;)V
+HPLcom/android/server/am/ActivityStack;->numActivities()I
+HPLcom/android/server/am/ActivityStack;->removeHistoryRecordsForAppLocked(Lcom/android/server/am/ProcessRecord;)Z
+HPLcom/android/server/am/ActivityStack;->removeHistoryRecordsForAppLocked(Ljava/util/ArrayList;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)V
+HPLcom/android/server/am/ActivityStack;->shouldBeVisible(Lcom/android/server/am/ActivityRecord;)Z
+HPLcom/android/server/am/ActivityStack;->topRunningActivityLocked()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/ActivityStack;->topRunningActivityLocked(Z)Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/ActivityStackSupervisor;->attachApplicationLocked(Lcom/android/server/am/ProcessRecord;)Z
+HPLcom/android/server/am/ActivityStackSupervisor;->ensureActivitiesVisibleLocked(Lcom/android/server/am/ActivityRecord;IZZ)V
+HPLcom/android/server/am/ActivityStackSupervisor;->getActivityDisplay(I)Lcom/android/server/am/ActivityDisplay;
+HPLcom/android/server/am/ActivityStackSupervisor;->getFocusedStack()Lcom/android/server/am/ActivityStack;
+HPLcom/android/server/am/ActivityStackSupervisor;->handleAppDiedLocked(Lcom/android/server/am/ProcessRecord;)Z
+HPLcom/android/server/am/ActivityStackSupervisor;->isCurrentProfileLocked(I)Z
+HPLcom/android/server/am/ActivityStackSupervisor;->isFocusedStack(Lcom/android/server/am/ActivityStack;)Z
+HPLcom/android/server/am/ActivityStarter;->startActivityMayWait(Landroid/app/IApplicationThread;ILjava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/app/WaitResult;Landroid/content/res/Configuration;Lcom/android/server/am/SafeActivityOptions;ZILcom/android/server/am/TaskRecord;Ljava/lang/String;Z)I
+HPLcom/android/server/am/AppBindRecord;-><init>(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;Lcom/android/server/am/ProcessRecord;)V
HPLcom/android/server/am/AssistDataRequester$AssistDataRequesterCallbacks;->canHandleReceivedAssistDataLocked()Z
HPLcom/android/server/am/AssistDataRequester$AssistDataRequesterCallbacks;->onAssistDataReceivedLocked(Landroid/os/Bundle;II)V
HPLcom/android/server/am/AssistDataRequester$AssistDataRequesterCallbacks;->onAssistScreenshotReceivedLocked(Landroid/graphics/Bitmap;)V
-HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onFillRequestFailure(Ljava/lang/CharSequence;Ljava/lang/String;)V
-HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onFillRequestSuccess(ILandroid/service/autofill/FillResponse;Ljava/lang/String;)V
+HPLcom/android/server/am/BatteryExternalStatsWorker;->scheduleCpuSyncDueToWakelockChange(J)Ljava/util/concurrent/Future;
+HPLcom/android/server/am/BatteryExternalStatsWorker;->scheduleDelayedSyncLocked(Ljava/util/concurrent/Future;Ljava/lang/Runnable;J)Ljava/util/concurrent/Future;
+HPLcom/android/server/am/BatteryStatsService;->enforceCallingPermission()V
+HPLcom/android/server/am/BatteryStatsService;->noteJobFinish(Ljava/lang/String;II)V
+HPLcom/android/server/am/BatteryStatsService;->noteJobStart(Ljava/lang/String;I)V
+HPLcom/android/server/am/BatteryStatsService;->noteProcessFinish(Ljava/lang/String;I)V
+HPLcom/android/server/am/BatteryStatsService;->noteProcessStart(Ljava/lang/String;I)V
+HPLcom/android/server/am/BatteryStatsService;->noteStartWakelock(IILjava/lang/String;Ljava/lang/String;IZ)V
+HPLcom/android/server/am/BatteryStatsService;->noteStartWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V
+HPLcom/android/server/am/BatteryStatsService;->noteStopSensor(II)V
+HPLcom/android/server/am/BatteryStatsService;->noteStopWakelock(IILjava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/am/BatteryStatsService;->noteStopWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/am/BatteryStatsService;->noteUidProcessState(II)V
+HPLcom/android/server/am/BatteryStatsService;->noteUserActivity(II)V
+HPLcom/android/server/am/BroadcastQueue$BroadcastHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/am/BroadcastQueue;->addBroadcastToHistoryLocked(Lcom/android/server/am/BroadcastRecord;)V
+HPLcom/android/server/am/BroadcastQueue;->cancelBroadcastTimeoutLocked()V
+HPLcom/android/server/am/BroadcastQueue;->deliverToRegisteredReceiverLocked(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastFilter;ZI)V
+HPLcom/android/server/am/BroadcastQueue;->enqueueBroadcastHelper(Lcom/android/server/am/BroadcastRecord;)V
+HPLcom/android/server/am/BroadcastQueue;->enqueueOrderedBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)V
+HPLcom/android/server/am/BroadcastQueue;->enqueueParallelBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)V
+HPLcom/android/server/am/BroadcastQueue;->finishReceiverLocked(Lcom/android/server/am/BroadcastRecord;ILjava/lang/String;Landroid/os/Bundle;ZZ)Z
+HPLcom/android/server/am/BroadcastQueue;->getMatchingOrderedReceiver(Landroid/os/IBinder;)Lcom/android/server/am/BroadcastRecord;
+HPLcom/android/server/am/BroadcastQueue;->performReceiveLocked(Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+HPLcom/android/server/am/BroadcastQueue;->processCurBroadcastLocked(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/ProcessRecord;Z)V
+HPLcom/android/server/am/BroadcastQueue;->processNextBroadcast(Z)V
+HPLcom/android/server/am/BroadcastQueue;->processNextBroadcastLocked(ZZ)V
+HPLcom/android/server/am/BroadcastQueue;->ringAdvance(III)I
+HPLcom/android/server/am/BroadcastQueue;->scheduleBroadcastsLocked()V
+HPLcom/android/server/am/BroadcastQueue;->setBroadcastTimeoutLocked(J)V
+HPLcom/android/server/am/BroadcastRecord;-><init>(Lcom/android/server/am/BroadcastQueue;Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;IIZLjava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;Ljava/util/List;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;ZZZI)V
+HPLcom/android/server/am/BroadcastRecord;-><init>(Lcom/android/server/am/BroadcastRecord;Landroid/content/Intent;)V
+HPLcom/android/server/am/BroadcastRecord;->maybeStripForHistory()Lcom/android/server/am/BroadcastRecord;
+HPLcom/android/server/am/BroadcastStats;->addBroadcast(Ljava/lang/String;Ljava/lang/String;IIJ)V
+HPLcom/android/server/am/BroadcastStats;->dumpCheckinStats(Ljava/io/PrintWriter;Ljava/lang/String;)V
+HPLcom/android/server/am/CompatModePackages;->compatibilityInfoForPackageLocked(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;
+HPLcom/android/server/am/CompatModePackages;->getPackageFlags(Ljava/lang/String;)I
+HPLcom/android/server/am/ConnectionRecord;-><init>(Lcom/android/server/am/AppBindRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/IServiceConnection;IILandroid/app/PendingIntent;)V
+HPLcom/android/server/am/ContentProviderConnection;-><init>(Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ProcessRecord;)V
+HPLcom/android/server/am/ContentProviderRecord;->canRunHere(Lcom/android/server/am/ProcessRecord;)Z
+HPLcom/android/server/am/ContentProviderRecord;->hasExternalProcessHandles()Z
+HPLcom/android/server/am/ContentProviderRecord;->newHolder(Lcom/android/server/am/ContentProviderConnection;)Landroid/app/ContentProviderHolder;
+HPLcom/android/server/am/EventLogTags;->writeAmPss(IILjava/lang/String;JJJJIIJ)V
+HPLcom/android/server/am/EventLogTags;->writeAmUidRunning(I)V
+HPLcom/android/server/am/EventLogTags;->writeAmUidStopped(I)V
+HPLcom/android/server/am/IntentBindRecord;-><init>(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent$FilterComparison;)V
+HPLcom/android/server/am/KeyguardController;->beginActivityVisibilityUpdate()V
+HPLcom/android/server/am/KeyguardController;->endActivityVisibilityUpdate()V
+HPLcom/android/server/am/KeyguardController;->isKeyguardLocked()Z
+HPLcom/android/server/am/KeyguardController;->isKeyguardOrAodShowing(I)Z
+HPLcom/android/server/am/KeyguardController;->visibilitiesUpdated()V
+HPLcom/android/server/am/PendingIntentRecord$Key;-><init>(ILjava/lang/String;Lcom/android/server/am/ActivityRecord;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILcom/android/server/am/SafeActivityOptions;I)V
+HPLcom/android/server/am/PendingIntentRecord$Key;->equals(Ljava/lang/Object;)Z
+HPLcom/android/server/am/PendingIntentRecord$Key;->hashCode()I
+HPLcom/android/server/am/PendingIntentRecord;->sendInner(ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)I
+HPLcom/android/server/am/PendingIntentRecord;->setWhitelistDurationLocked(Landroid/os/IBinder;J)V
+HPLcom/android/server/am/PersistentConnection;->asInterface(Landroid/os/IBinder;)Ljava/lang/Object;
+HPLcom/android/server/am/ProcessList;->computeNextPssTime(ILcom/android/server/am/ProcessList$ProcStateMemTracker;ZZJ)J
+HPLcom/android/server/am/ProcessList;->procStatesDifferForMem(II)Z
+HPLcom/android/server/am/ProcessList;->setOomAdj(III)V
+HPLcom/android/server/am/ProcessList;->writeLmkd(Ljava/nio/ByteBuffer;)V
+HPLcom/android/server/am/ProcessRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/internal/os/BatteryStatsImpl;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)V
+HPLcom/android/server/am/ProcessRecord;->addPackage(Ljava/lang/String;JLcom/android/server/am/ProcessStatsService;)Z
+HPLcom/android/server/am/ProcessRecord;->forceProcessStateUpTo(I)V
+HPLcom/android/server/am/ProcessRecord;->getPackageList()[Ljava/lang/String;
+HPLcom/android/server/am/ProcessRecord;->kill(Ljava/lang/String;Z)V
+HPLcom/android/server/am/ProcessRecord;->makeInactive(Lcom/android/server/am/ProcessStatsService;)V
+HPLcom/android/server/am/ProcessRecord;->modifyRawOomAdj(I)I
+HPLcom/android/server/am/ProcessRecord;->resetPackageList(Lcom/android/server/am/ProcessStatsService;)V
+HPLcom/android/server/am/ProcessRecord;->unlinkDeathRecipient()V
+HPLcom/android/server/am/ProcessStatsService;->getServiceStateLocked(Ljava/lang/String;IJLjava/lang/String;Ljava/lang/String;)Lcom/android/internal/app/procstats/ServiceState;
+HPLcom/android/server/am/ProviderMap;->collectPackageProvidersLocked(Ljava/lang/String;Ljava/util/Set;ZZLjava/util/HashMap;Ljava/util/ArrayList;)Z
+HPLcom/android/server/am/ProviderMap;->getProviderByName(Ljava/lang/String;I)Lcom/android/server/am/ContentProviderRecord;
+HPLcom/android/server/am/ProviderMap;->getProvidersByClass(I)Ljava/util/HashMap;
+HPLcom/android/server/am/ProviderMap;->getProvidersByName(I)Ljava/util/HashMap;
+HPLcom/android/server/am/RecentTasks;->isCallerRecents(I)Z
+HPLcom/android/server/am/RunningTasks;->getTasks(ILjava/util/List;IILandroid/util/SparseArray;IZ)V
+HPLcom/android/server/am/RunningTasks;->lambda$static$0(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/TaskRecord;)I
+HPLcom/android/server/am/SafeActivityOptions;->fromBundle(Landroid/os/Bundle;)Lcom/android/server/am/SafeActivityOptions;
+HPLcom/android/server/am/ServiceRecord$StartItem;-><init>(Lcom/android/server/am/ServiceRecord;ZILandroid/content/Intent;Lcom/android/server/am/ActivityManagerService$NeededUriGrants;I)V
+HPLcom/android/server/am/ServiceRecord$StartItem;->removeUriPermissionsLocked()V
+HPLcom/android/server/am/ServiceRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;Landroid/content/ComponentName;Landroid/content/Intent$FilterComparison;Landroid/content/pm/ServiceInfo;ZLjava/lang/Runnable;)V
+HPLcom/android/server/am/ServiceRecord;->clearDeliveredStartsLocked()V
+HPLcom/android/server/am/ServiceRecord;->findDeliveredStart(IZZ)Lcom/android/server/am/ServiceRecord$StartItem;
+HPLcom/android/server/am/ServiceRecord;->getLastStartId()I
+HPLcom/android/server/am/ServiceRecord;->getTracker()Lcom/android/internal/app/procstats/ServiceState;
+HPLcom/android/server/am/ServiceRecord;->hasAutoCreateConnections()Z
+HPLcom/android/server/am/ServiceRecord;->makeNextStartId()I
+HPLcom/android/server/am/ServiceRecord;->postNotification()V
+HPLcom/android/server/am/ServiceRecord;->resetRestartCounter()V
+HPLcom/android/server/am/ServiceRecord;->retrieveAppBindingLocked(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;)Lcom/android/server/am/AppBindRecord;
+HPLcom/android/server/am/TaskPersister$LazyTaskWriterThread;->processNextItem()V
+HPLcom/android/server/am/TaskRecord;->getActivityType()I
+HPLcom/android/server/am/TaskRecord;->getInactiveDuration()J
+HPLcom/android/server/am/TaskRecord;->getNumRunningActivities(Lcom/android/server/am/TaskRecord$TaskActivitiesReport;)V
+HPLcom/android/server/am/TaskRecord;->getStack()Lcom/android/server/am/ActivityStack;
+HPLcom/android/server/am/TaskRecord;->getTopActivity()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/TaskRecord;->getTopActivity(Z)Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/TaskRecord;->topRunningActivityLocked()Lcom/android/server/am/ActivityRecord;
+HPLcom/android/server/am/UidRecord;->reset()V
+HPLcom/android/server/am/UidRecord;->updateLastDispatchedProcStateSeq(I)V
+HPLcom/android/server/am/UserController$Injector;->checkCallingPermission(Ljava/lang/String;)I
+HPLcom/android/server/am/UserController$Injector;->checkComponentPermission(Ljava/lang/String;IIIZ)I
+HPLcom/android/server/am/UserController$Injector;->getUserManager()Lcom/android/server/pm/UserManagerService;
+HPLcom/android/server/am/UserController$Injector;->isCallerRecents(I)Z
+HPLcom/android/server/am/UserController;->exists(I)Z
+HPLcom/android/server/am/UserController;->getCurrentUser()Landroid/content/pm/UserInfo;
+HPLcom/android/server/am/UserController;->getStartedUserArray()[I
+HPLcom/android/server/am/UserController;->getStartedUserState(I)Lcom/android/server/am/UserState;
+HPLcom/android/server/am/UserController;->getUserInfo(I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/am/UserController;->handleIncomingUser(IIIZILjava/lang/String;Ljava/lang/String;)I
+HPLcom/android/server/am/UserController;->hasStartedUserState(I)Z
+HPLcom/android/server/am/UserController;->isUserOrItsParentRunning(I)Z
+HPLcom/android/server/am/UserController;->isUserRunning(II)Z
+HPLcom/android/server/am/UserController;->unsafeConvertIncomingUser(I)I
+HPLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;->equals(Ljava/lang/Object;)Z
+HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->enforceCallFromPackage(Ljava/lang/String;)V
+HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getEnabledGroupProfileIds(I)[I
+HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getProfileParent(I)I
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->isBoundWidgetPackage(Ljava/lang/String;I)Z
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->isProfileWithLockedParent(I)Z
+HPLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupProviderLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;
+HPLcom/android/server/autofill/FieldClassificationStrategy$Command;->run(Landroid/service/autofill/IAutofillFieldClassificationService;)V
+HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onFillRequestFailure(ILjava/lang/CharSequence;Ljava/lang/String;)V
+HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onFillRequestSuccess(ILandroid/service/autofill/FillResponse;Ljava/lang/String;I)V
+HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onFillRequestTimeout(ILjava/lang/String;)V
HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onSaveRequestFailure(Ljava/lang/CharSequence;Ljava/lang/String;)V
HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onSaveRequestSuccess(Ljava/lang/String;Landroid/content/IntentSender;)V
HPLcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;->onServiceDied(Lcom/android/server/autofill/RemoteFillService;)V
-HPLcom/android/server/autofill/RemoteFillService$PendingRequest;->onTimeout(Lcom/android/server/autofill/RemoteFillService;)V
HPLcom/android/server/autofill/ViewState$Listener;->onFillReady(Landroid/service/autofill/FillResponse;Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;)V
HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->authenticate(IILandroid/content/IntentSender;Landroid/os/Bundle;)V
HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->cancelSave()V
@@ -116,30 +837,1117 @@ HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->requestHideFil
HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->requestShowFillUi(Landroid/view/autofill/AutofillId;IILandroid/view/autofill/IAutofillWindowPresenter;)V
HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->save()V
HPLcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;->startIntentSender(Landroid/content/IntentSender;)V
+HPLcom/android/server/autofill/ui/FillUi$Callback;->dispatchUnhandledKey(Landroid/view/KeyEvent;)V
+HPLcom/android/server/autofill/ui/FillUi$Callback;->onCanceled()V
+HPLcom/android/server/autofill/ui/FillUi$Callback;->onDatasetPicked(Landroid/service/autofill/Dataset;)V
+HPLcom/android/server/autofill/ui/FillUi$Callback;->onDestroy()V
+HPLcom/android/server/autofill/ui/FillUi$Callback;->onResponsePicked(Landroid/service/autofill/FillResponse;)V
+HPLcom/android/server/autofill/ui/FillUi$Callback;->requestHideFillUi()V
+HPLcom/android/server/autofill/ui/FillUi$Callback;->requestShowFillUi(IILandroid/view/autofill/IAutofillWindowPresenter;)V
+HPLcom/android/server/autofill/ui/FillUi$Callback;->startIntentSender(Landroid/content/IntentSender;)V
+HPLcom/android/server/autofill/ui/SaveUi$OnSaveListener;->onCancel(Landroid/content/IntentSender;)V
+HPLcom/android/server/autofill/ui/SaveUi$OnSaveListener;->onDestroy()V
+HPLcom/android/server/autofill/ui/SaveUi$OnSaveListener;->onSave()V
+HPLcom/android/server/backup/BackupManagerService;->dataChangedTargets(Ljava/lang/String;)Ljava/util/HashSet;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->acknowledgeAdbBackupOrRestore(IZLjava/lang/String;Ljava/lang/String;Landroid/app/backup/IFullBackupRestoreObserver;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->adbBackup(Landroid/os/ParcelFileDescriptor;ZZZZZZZZ[Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->adbRestore(Landroid/os/ParcelFileDescriptor;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->agentConnected(Ljava/lang/String;Landroid/os/IBinder;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->agentDisconnected(Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->backupNow()V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->beginFullBackup(Lcom/android/server/backup/FullBackupJob;)Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->beginRestoreSession(Ljava/lang/String;Ljava/lang/String;)Landroid/app/backup/IRestoreSession;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->bindToAgentSynchronous(Landroid/content/pm/ApplicationInfo;I)Landroid/app/IBackupAgent;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->cancelBackups()V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->clearBackupData(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->dataChanged(Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->endFullBackup()V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->filterAppsEligibleForBackup([Ljava/lang/String;)[Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->fullTransportBackup([Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->generateRandomIntegerToken()I
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getAgentTimeoutParameters()Lcom/android/server/backup/BackupAgentTimeoutParameters;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getAvailableRestoreToken(Ljava/lang/String;)J
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getBackupManagerBinder()Landroid/app/backup/IBackupManager;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getConfigurationIntent(Ljava/lang/String;)Landroid/content/Intent;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getCurrentTransport()Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getDataManagementIntent(Ljava/lang/String;)Landroid/content/Intent;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getDataManagementLabel(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getDestinationString(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->getTransportWhitelist()[Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->hasBackupPassword()Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->initializeTransports([Ljava/lang/String;Landroid/app/backup/IBackupObserver;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->isAppEligibleForBackup(Ljava/lang/String;)Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->isBackupEnabled()Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->listAllTransportComponents()[Landroid/content/ComponentName;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->listAllTransports()[Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->opComplete(IJ)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->prepareOperationTimeout(IJLcom/android/server/backup/BackupRestoreTask;I)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->requestBackup([Ljava/lang/String;Landroid/app/backup/IBackupObserver;I)I
+HPLcom/android/server/backup/BackupManagerServiceInterface;->requestBackup([Ljava/lang/String;Landroid/app/backup/IBackupObserver;Landroid/app/backup/IBackupManagerMonitor;I)I
+HPLcom/android/server/backup/BackupManagerServiceInterface;->restoreAtInstall(Ljava/lang/String;I)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->selectBackupTransport(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/backup/BackupManagerServiceInterface;->selectBackupTransportAsync(Landroid/content/ComponentName;Landroid/app/backup/ISelectBackupTransportCallback;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->setAutoRestore(Z)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupEnabled(Z)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupPassword(Ljava/lang/String;Ljava/lang/String;)Z
+HPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupProvisioned(Z)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->tearDownAgentAndKill(Landroid/content/pm/ApplicationInfo;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->unlockSystemUser()V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;)V
+HPLcom/android/server/backup/BackupManagerServiceInterface;->waitUntilOperationComplete(I)Z
+HPLcom/android/server/backup/BackupRestoreTask;->execute()V
+HPLcom/android/server/backup/BackupRestoreTask;->handleCancel(Z)V
+HPLcom/android/server/backup/BackupRestoreTask;->operationComplete(J)V
HPLcom/android/server/backup/DataChangedJournal$Consumer;->accept(Ljava/lang/String;)V
-HPLcom/android/server/backup/internal/OnTaskFinishedListener;->onFinished(Ljava/lang/String;)V
+HPLcom/android/server/backup/fullbackup/FullBackupPreflight;->getExpectedSizeOrErrorCode()J
+HPLcom/android/server/backup/fullbackup/FullBackupPreflight;->preflightFullBackup(Landroid/content/pm/PackageInfo;Landroid/app/IBackupAgent;)I
+HPLcom/android/server/backup/transport/OnTransportRegisteredListener;->onTransportRegistered(Ljava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/backup/transport/TransportClient;->saveLogEntry(Ljava/lang/String;)V
HPLcom/android/server/backup/transport/TransportConnectionListener;->onTransportConnectionResult(Lcom/android/internal/backup/IBackupTransport;Lcom/android/server/backup/transport/TransportClient;)V
+HPLcom/android/server/backup/transport/TransportUtils;->log(ILjava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/backup/utils/SparseArrayUtils;->union(Landroid/util/SparseArray;)Ljava/util/HashSet;
+HPLcom/android/server/clipboard/HostClipboardMonitor$HostClipboardCallback;->onHostClipboardUpdated(Ljava/lang/String;)V
+HPLcom/android/server/companion/CompanionDeviceManagerService;->getCallingUserId()I
+HPLcom/android/server/companion/CompanionDeviceManagerService;->isCallerSystem()Z
+HPLcom/android/server/connectivity/IpConnectivityMetrics$Logger;->defaultNetworkMetrics()Lcom/android/server/connectivity/DefaultNetworkMetrics;
+HPLcom/android/server/connectivity/NetdEventListenerService;->onConnectEvent(IIILjava/lang/String;II)V
+HPLcom/android/server/connectivity/NetdEventListenerService;->onDnsEvent(IIIILjava/lang/String;[Ljava/lang/String;II)V
+HPLcom/android/server/connectivity/NetdEventListenerService;->onTcpSocketStatsEvent([I[I[I[I[I)V
+HPLcom/android/server/connectivity/NetworkAgentInfo;->getNetworkState()Landroid/net/NetworkState;
+HPLcom/android/server/connectivity/NetworkAgentInfo;->isSatisfyingRequest(I)Z
+HPLcom/android/server/connectivity/NetworkAgentInfo;->numNetworkRequests()I
+HPLcom/android/server/connectivity/NetworkAgentInfo;->requestAt(I)Landroid/net/NetworkRequest;
+HPLcom/android/server/connectivity/NetworkAgentInfo;->satisfies(Landroid/net/NetworkRequest;)Z
HPLcom/android/server/connectivity/NetworkMonitor$NetworkMonitorSettings;->getSetting(Landroid/content/Context;Ljava/lang/String;I)I
HPLcom/android/server/connectivity/NetworkMonitor$NetworkMonitorSettings;->getSetting(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/connectivity/PermissionMonitor;->hasPermission(Landroid/content/pm/PackageInfo;Ljava/lang/String;)Z
+HPLcom/android/server/connectivity/Vpn;->appliesToUid(I)Z
+HPLcom/android/server/connectivity/Vpn;->isBlockingUid(I)Z
+HPLcom/android/server/connectivity/Vpn;->isRunningLocked()Z
+HPLcom/android/server/connectivity/tethering/OffloadController$OffloadTetheringStatsProvider;->getTetherStats(I)Landroid/net/NetworkStats;
+HPLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;-><init>(Lcom/android/server/content/ContentService$ObserverNode;Landroid/database/IContentObserver;ZLjava/lang/Object;III)V
+HPLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;->access$300(Lcom/android/server/content/ContentService$ObserverNode$ObserverEntry;)I
+HPLcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZLjava/lang/Object;III)V
+HPLcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;Landroid/database/IContentObserver;ZLjava/lang/Object;III)V
+HPLcom/android/server/content/ContentService$ObserverNode;->collectMyObserversLocked(ZLandroid/database/IContentObserver;ZIILjava/util/ArrayList;)V
+HPLcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZIILjava/util/ArrayList;)V
+HPLcom/android/server/content/ContentService$ObserverNode;->countUriSegments(Landroid/net/Uri;)I
+HPLcom/android/server/content/ContentService$ObserverNode;->getUriSegment(Landroid/net/Uri;I)Ljava/lang/String;
+HPLcom/android/server/content/ContentService$ObserverNode;->removeObserverLocked(Landroid/database/IContentObserver;)Z
+HPLcom/android/server/content/ContentService;->enforceCrossUserPermission(ILjava/lang/String;)V
+HPLcom/android/server/content/ContentService;->getIsSyncableAsUser(Landroid/accounts/Account;Ljava/lang/String;I)I
+HPLcom/android/server/content/ContentService;->getMasterSyncAutomaticallyAsUser(I)Z
+HPLcom/android/server/content/ContentService;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;I)[Ljava/lang/String;
+HPLcom/android/server/content/ContentService;->getSyncAdapterTypesAsUser(I)[Landroid/content/SyncAdapterType;
+HPLcom/android/server/content/ContentService;->getSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;I)Z
+HPLcom/android/server/content/ContentService;->getSyncManager()Lcom/android/server/content/SyncManager;
+HPLcom/android/server/content/ContentService;->handleIncomingUser(Landroid/net/Uri;IIIZI)I
+HPLcom/android/server/content/ContentService;->notifyChange(Landroid/net/Uri;Landroid/database/IContentObserver;ZIII)V
+HPLcom/android/server/content/ContentService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLcom/android/server/content/ContentService;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/IContentObserver;II)V
+HPLcom/android/server/content/ContentService;->unregisterContentObserver(Landroid/database/IContentObserver;)V
+HPLcom/android/server/content/SyncJobService;->onStartJob(Landroid/app/job/JobParameters;)Z
+HPLcom/android/server/content/SyncJobService;->onStopJob(Landroid/app/job/JobParameters;)Z
+HPLcom/android/server/content/SyncLogger$RotatingFileLogger;->log([Ljava/lang/Object;)V
HPLcom/android/server/content/SyncManager$OnReadyCallback;->onReady()V
-HPLcom/android/server/display/ColorDisplayService$AutoMode;->onStart()V
-HPLcom/android/server/display/ColorDisplayService$AutoMode;->onStop()V
-HPLcom/android/server/net/NetworkStatsObservers$RequestInfo;->checkStats()Z
-HPLcom/android/server/net/NetworkStatsObservers$RequestInfo;->recordSample(Lcom/android/server/net/NetworkStatsObservers$StatsContext;)V
-HPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleReturnCode()V
-HPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleServiceError()V
-HPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleStartCopy()V
-HPLcom/android/server/pm/PackageManagerService$InstallArgs;->cleanUpResourcesLI()V
-HPLcom/android/server/pm/PackageManagerService$InstallArgs;->copyApk(Lcom/android/internal/app/IMediaContainerService;Z)I
-HPLcom/android/server/pm/PackageManagerService$InstallArgs;->doPostDeleteLI(Z)Z
-HPLcom/android/server/pm/PackageManagerService$InstallArgs;->doPostInstall(II)I
-HPLcom/android/server/pm/PackageManagerService$InstallArgs;->doPreInstall(I)I
-HPLcom/android/server/pm/PackageManagerService$InstallArgs;->doRename(ILandroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
-HPLcom/android/server/pm/PackageManagerService$InstallArgs;->getCodePath()Ljava/lang/String;
-HPLcom/android/server/pm/PackageManagerService$InstallArgs;->getResourcePath()Ljava/lang/String;
+HPLcom/android/server/content/SyncManager$SyncHandler;->dispatchSyncOperation(Lcom/android/server/content/SyncOperation;)Z
+HPLcom/android/server/content/SyncManager$SyncHandler;->handleSyncMessage(Landroid/os/Message;)V
+HPLcom/android/server/content/SyncManager$SyncHandler;->insertStartSyncEvent(Lcom/android/server/content/SyncOperation;)J
+HPLcom/android/server/content/SyncManager$SyncHandler;->runSyncFinishedOrCanceledH(Landroid/content/SyncResult;Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
+HPLcom/android/server/content/SyncManager$SyncHandler;->startSyncH(Lcom/android/server/content/SyncOperation;)V
+HPLcom/android/server/content/SyncManager$SyncHandler;->updateOrAddPeriodicSyncH(Lcom/android/server/content/SyncStorageEngine$EndPoint;JJLandroid/os/Bundle;)V
+HPLcom/android/server/content/SyncManager;->access$2900(Lcom/android/server/content/SyncManager;)Landroid/os/PowerManager$WakeLock;
+HPLcom/android/server/content/SyncManager;->getAllPendingSyncs()Ljava/util/List;
+HPLcom/android/server/content/SyncManager;->getSyncAdapterTypes(I)[Landroid/content/SyncAdapterType;
+HPLcom/android/server/content/SyncManager;->getSyncStorageEngine()Lcom/android/server/content/SyncStorageEngine;
+HPLcom/android/server/content/SyncManager;->isJobIdInUseLockedH(ILjava/util/List;)Z
+HPLcom/android/server/content/SyncManager;->postMonitorSyncProgressMessage(Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
+HPLcom/android/server/content/SyncManager;->printTwoDigitNumber(Ljava/lang/StringBuilder;JCZ)Z
+HPLcom/android/server/content/SyncManager;->rescheduleSyncs(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)V
+HPLcom/android/server/content/SyncManager;->scheduleSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;IJZI)V
+HPLcom/android/server/content/SyncManager;->scheduleSyncOperationH(Lcom/android/server/content/SyncOperation;J)V
+HPLcom/android/server/content/SyncManager;->setAuthorityPendingState(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+HPLcom/android/server/content/SyncManager;->setDelayUntilTime(Lcom/android/server/content/SyncStorageEngine$EndPoint;J)V
+HPLcom/android/server/content/SyncOperation;-><init>(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILjava/lang/String;IILandroid/os/Bundle;ZZIJJI)V
+HPLcom/android/server/content/SyncOperation;->dump(Landroid/content/pm/PackageManager;ZLcom/android/server/content/SyncAdapterStateFetcher;)Ljava/lang/String;
+HPLcom/android/server/content/SyncOperation;->extrasToStringBuilder(Landroid/os/Bundle;Ljava/lang/StringBuilder;)V
+HPLcom/android/server/content/SyncOperation;->maybeCreateFromJobExtras(Landroid/os/PersistableBundle;)Lcom/android/server/content/SyncOperation;
+HPLcom/android/server/content/SyncOperation;->toKey()Ljava/lang/String;
+HPLcom/android/server/content/SyncStorageEngine$EndPoint;-><init>(Landroid/accounts/Account;Ljava/lang/String;I)V
+HPLcom/android/server/content/SyncStorageEngine$EndPoint;->matchesSpec(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Z
+HPLcom/android/server/content/SyncStorageEngine$OnAuthorityRemovedListener;->onAuthorityRemoved(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+HPLcom/android/server/content/SyncStorageEngine$OnSyncRequestListener;->onSyncRequest(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILandroid/os/Bundle;I)V
+HPLcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;->onPeriodicSyncAdded(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;JJ)V
+HPLcom/android/server/content/SyncStorageEngine;->getAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+HPLcom/android/server/content/SyncStorageEngine;->getMasterSyncAutomatically(I)Z
+HPLcom/android/server/content/SyncStorageEngine;->getSyncAutomatically(Landroid/accounts/Account;ILjava/lang/String;)Z
+HPLcom/android/server/content/SyncStorageEngine;->insertStartSyncEvent(Lcom/android/server/content/SyncOperation;J)J
+HPLcom/android/server/content/SyncStorageEngine;->reportChange(I)V
+HPLcom/android/server/content/SyncStorageEngine;->stopSyncEvent(JJLjava/lang/String;JJ)V
+HPLcom/android/server/content/SyncStorageEngine;->writeStatusLocked()V
+HPLcom/android/server/devicepolicy/BaseIDevicePolicyManager;->handleStartUser(I)V
+HPLcom/android/server/devicepolicy/BaseIDevicePolicyManager;->handleStopUser(I)V
+HPLcom/android/server/devicepolicy/BaseIDevicePolicyManager;->handleUnlockUser(I)V
+HPLcom/android/server/devicepolicy/BaseIDevicePolicyManager;->systemReady(I)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getUid()I
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderClearCallingIdentity()J
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderGetCallingUid()I
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderRestoreCallingIdentity(J)V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isActiveAdminWithPolicy(II)Z
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2600(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->ensureLocked()V
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminWithPolicyForUidLocked(Landroid/content/ComponentName;II)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getLockObject()Ljava/lang/Object;
+HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserData(I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;
+HPLcom/android/server/display/AmbientBrightnessStatsTracker$Clock;->elapsedTimeMillis()J
+HPLcom/android/server/display/AmbientBrightnessStatsTracker$Injector;->elapsedRealtimeMillis()J
+HPLcom/android/server/display/AutomaticBrightnessController$1;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->getLux(I)F
+HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->getTime(I)J
+HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->offsetOf(I)I
+HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->size()I
+HPLcom/android/server/display/AutomaticBrightnessController;->calculateAmbientLux(JJ)F
+HPLcom/android/server/display/AutomaticBrightnessController;->calculateWeight(JJ)F
+HPLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux()V
+HPLcom/android/server/display/AutomaticBrightnessController;->weightIntegral(J)F
+HPLcom/android/server/display/BrightnessTracker$Injector;->currentTimeMillis()J
+HPLcom/android/server/display/BrightnessTracker$Injector;->elapsedRealtimeNanos()J
+HPLcom/android/server/display/ColorDisplayService$ColorMatrixEvaluator;->evaluate(F[F[F)[F
+HPLcom/android/server/display/ColorFade;->draw(F)Z
+HPLcom/android/server/display/ColorFade;->drawFaded(FF)V
+HPLcom/android/server/display/DisplayManagerService$BinderService;->getDisplayIds()[I
+HPLcom/android/server/display/DisplayManagerService$LocalService;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z
+HPLcom/android/server/display/DisplayManagerService;->access$4200(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayPowerController;
+HPLcom/android/server/display/DisplayPowerController;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z
+HPLcom/android/server/display/OverlayDisplayWindow$Listener;->onStateChanged(I)V
+HPLcom/android/server/display/OverlayDisplayWindow$Listener;->onWindowCreated(Landroid/graphics/SurfaceTexture;FJI)V
+HPLcom/android/server/display/OverlayDisplayWindow$Listener;->onWindowDestroyed()V
+HPLcom/android/server/display/RampAnimator$Listener;->onAnimationEnd()V
+HPLcom/android/server/display/utils/Plog;->emit(Ljava/lang/String;)V
+HPLcom/android/server/dreams/DreamController$Listener;->onDreamStopped(Landroid/os/Binder;)V
+HPLcom/android/server/dreams/DreamManagerService$BinderService;->isDreaming()Z
+HPLcom/android/server/dreams/DreamManagerService$LocalService;->isDreaming()Z
+HPLcom/android/server/dreams/DreamManagerService;->access$1400(Lcom/android/server/dreams/DreamManagerService;)Z
+HPLcom/android/server/dreams/DreamManagerService;->isDreamingInternal()Z
+HPLcom/android/server/fingerprint/AuthenticationClient;->handleFailedAttempt()I
+HPLcom/android/server/fingerprint/AuthenticationClient;->onStart()V
+HPLcom/android/server/fingerprint/AuthenticationClient;->onStop()V
+HPLcom/android/server/fingerprint/AuthenticationClient;->resetFailedAttempts()V
+HPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->queryByComponent(Landroid/content/ComponentName;Ljava/util/List;)V
+HPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->sortResults(Ljava/util/List;)V
+HPLcom/android/server/firewall/IntentFirewall;->checkBroadcast(Landroid/content/Intent;IILjava/lang/String;I)Z
+HPLcom/android/server/firewall/IntentFirewall;->checkIntent(Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;Landroid/content/ComponentName;ILandroid/content/Intent;IILjava/lang/String;I)Z
+HPLcom/android/server/firewall/IntentFirewall;->checkService(Landroid/content/ComponentName;Landroid/content/Intent;IILjava/lang/String;Landroid/content/pm/ApplicationInfo;)Z
+HPLcom/android/server/input/InputManagerService;->injectInputEventInternal(Landroid/view/InputEvent;II)Z
+HPLcom/android/server/input/InputManagerService;->monitor()V
+HPLcom/android/server/input/InputManagerService;->setInputWindows([Lcom/android/server/input/InputWindowHandle;Lcom/android/server/input/InputWindowHandle;)V
+HPLcom/android/server/job/-$$Lambda$JobSchedulerService$LocalService$yaChpLJ2odu2Fk7A6H8erUndrN8;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/job/-$$Lambda$JobSchedulerService$V6_ZmVmzJutg4w0s0LktDOsRAss;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/job/-$$Lambda$JobStore$1$Wgepg1oHZp0-Q01q1baIVZKWujU;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/job/JobPackageTracker$DataSet;->decPending(ILjava/lang/String;J)V
+HPLcom/android/server/job/JobPackageTracker$DataSet;->getEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;
+HPLcom/android/server/job/JobPackageTracker$DataSet;->getOrCreateEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;
+HPLcom/android/server/job/JobPackageTracker$DataSet;->getTotalTime(J)J
+HPLcom/android/server/job/JobPackageTracker$DataSet;->incPending(ILjava/lang/String;J)V
+HPLcom/android/server/job/JobPackageTracker$PackageEntry;->getActiveTime(J)J
+HPLcom/android/server/job/JobPackageTracker$PackageEntry;->getPendingTime(J)J
+HPLcom/android/server/job/JobPackageTracker;->getLoadFactor(Lcom/android/server/job/controllers/JobStatus;)F
+HPLcom/android/server/job/JobPackageTracker;->noteConcurrency(II)V
+HPLcom/android/server/job/JobPackageTracker;->noteNonpending(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobPackageTracker;->notePending(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobPackageTracker;->rebatchIfNeeded(J)V
+HPLcom/android/server/job/JobSchedulerInternal;->addBackingUpUid(I)V
+HPLcom/android/server/job/JobSchedulerInternal;->baseHeartbeatForApp(Ljava/lang/String;II)J
+HPLcom/android/server/job/JobSchedulerInternal;->cancelJobsForUid(ILjava/lang/String;)V
+HPLcom/android/server/job/JobSchedulerInternal;->clearAllBackingUpUids()V
+HPLcom/android/server/job/JobSchedulerInternal;->currentHeartbeat()J
+HPLcom/android/server/job/JobSchedulerInternal;->getPersistStats()Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;
+HPLcom/android/server/job/JobSchedulerInternal;->getSystemScheduledPendingJobs()Ljava/util/List;
+HPLcom/android/server/job/JobSchedulerInternal;->nextHeartbeatForBucket(I)J
+HPLcom/android/server/job/JobSchedulerInternal;->noteJobStart(Ljava/lang/String;I)V
+HPLcom/android/server/job/JobSchedulerInternal;->removeBackingUpUid(I)V
+HPLcom/android/server/job/JobSchedulerInternal;->reportAppUsage(Ljava/lang/String;I)V
+HPLcom/android/server/job/JobSchedulerService$2;->onUidStateChanged(IIJ)V
+HPLcom/android/server/job/JobSchedulerService$JobHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->cancel(I)V
+HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getAllPendingJobs()Ljava/util/List;
+HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getPendingJob(I)Landroid/app/job/JobInfo;
+HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->schedule(Landroid/app/job/JobInfo;)I
+HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->scheduleAsPackage(Landroid/app/job/JobInfo;Ljava/lang/String;ILjava/lang/String;)I
+HPLcom/android/server/job/JobSchedulerService$LocalService;->lambda$getSystemScheduledPendingJobs$0(Lcom/android/server/job/JobSchedulerService$LocalService;Ljava/util/List;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/job/JobSchedulerService;->access$200(Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobSchedulerService;->access$700(Lcom/android/server/job/JobSchedulerService;)V
+HPLcom/android/server/job/JobSchedulerService;->access$800(Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobSchedulerService;->adjustJobPriority(ILcom/android/server/job/controllers/JobStatus;)I
+HPLcom/android/server/job/JobSchedulerService;->assignJobsToContextsLocked()V
+HPLcom/android/server/job/JobSchedulerService;->evaluateJobPriorityLocked(Lcom/android/server/job/controllers/JobStatus;)I
+HPLcom/android/server/job/JobSchedulerService;->findJobContextIdFromMap(Lcom/android/server/job/controllers/JobStatus;[Lcom/android/server/job/controllers/JobStatus;)I
+HPLcom/android/server/job/JobSchedulerService;->getPendingJob(II)Landroid/app/job/JobInfo;
+HPLcom/android/server/job/JobSchedulerService;->getPendingJobs(I)Ljava/util/List;
+HPLcom/android/server/job/JobSchedulerService;->isCurrentlyActiveLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobSchedulerService;->isReadyToBeExecutedLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobSchedulerService;->lambda$static$0(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)I
+HPLcom/android/server/job/JobSchedulerService;->maybeRunPendingJobsLocked()V
+HPLcom/android/server/job/JobSchedulerService;->noteJobsNonpending(Ljava/util/List;)V
+HPLcom/android/server/job/JobSchedulerService;->noteJobsPending(Ljava/util/List;)V
+HPLcom/android/server/job/JobSchedulerService;->reportActiveLocked()V
+HPLcom/android/server/job/JobSchedulerService;->scheduleAsPackage(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;ILjava/lang/String;ILjava/lang/String;)I
+HPLcom/android/server/job/JobSchedulerService;->startTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobSchedulerService;->stopJobOnServiceContextLocked(Lcom/android/server/job/controllers/JobStatus;ILjava/lang/String;)Z
+HPLcom/android/server/job/JobSchedulerService;->stopNonReadyActiveJobsLocked()V
+HPLcom/android/server/job/JobSchedulerService;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)Z
+HPLcom/android/server/job/JobSchedulerService;->updateUidState(II)V
+HPLcom/android/server/job/JobServiceContext;->clearPreferredUid()V
+HPLcom/android/server/job/JobServiceContext;->doCallback(Lcom/android/server/job/JobServiceContext$JobCallback;ZLjava/lang/String;)V
+HPLcom/android/server/job/JobServiceContext;->getPreferredUid()I
+HPLcom/android/server/job/JobServiceContext;->getRunningJobLocked()Lcom/android/server/job/controllers/JobStatus;
+HPLcom/android/server/job/JobServiceContext;->removeOpTimeOutLocked()V
+HPLcom/android/server/job/JobServiceContext;->scheduleOpTimeOutLocked()V
+HPLcom/android/server/job/JobStore$1;->addAttributesToJobTag(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobStore$1;->deepCopyBundle(Landroid/os/PersistableBundle;I)Landroid/os/PersistableBundle;
+HPLcom/android/server/job/JobStore$1;->lambda$run$0(Ljava/util/List;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobStore$1;->writeBundleToXml(Landroid/os/PersistableBundle;Lorg/xmlpull/v1/XmlSerializer;)V
+HPLcom/android/server/job/JobStore$1;->writeConstraintsToXml(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobStore$1;->writeExecutionCriteriaToXml(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/JobStore$1;->writeJobsMapImpl(Ljava/util/List;)V
+HPLcom/android/server/job/JobStore$JobSet;->contains(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobStore$JobSet;->countJobsForUid(I)I
+HPLcom/android/server/job/JobStore$JobSet;->forEachJob(ILjava/util/function/Consumer;)V
+HPLcom/android/server/job/JobStore$JobSet;->forEachJob(Ljava/util/function/Predicate;Ljava/util/function/Consumer;)V
+HPLcom/android/server/job/JobStore$JobSet;->forEachJobForSourceUid(ILjava/util/function/Consumer;)V
+HPLcom/android/server/job/JobStore$JobSet;->get(II)Lcom/android/server/job/controllers/JobStatus;
+HPLcom/android/server/job/JobStore$JobSet;->remove(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobStore;->access$000()Z
+HPLcom/android/server/job/JobStore;->access$100(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobStore;->containsJob(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/JobStore;->isSyncJob(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/job/controllers/BackgroundJobsController;->updateSingleJobRestrictionLocked(Lcom/android/server/job/controllers/JobStatus;I)Z
+HPLcom/android/server/job/controllers/ConnectivityController;->isCongestionDelayed(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z
+HPLcom/android/server/job/controllers/ConnectivityController;->isInsane(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z
+HPLcom/android/server/job/controllers/ConnectivityController;->isSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z
+HPLcom/android/server/job/controllers/ConnectivityController;->isStrictSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z
+HPLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;)Z
+HPLcom/android/server/job/controllers/ConnectivityController;->updateTrackedJobs(ILandroid/net/Network;)V
+HPLcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/job/controllers/DeviceIdleJobsController;->access$600(Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/controllers/DeviceIdleJobsController;->isWhitelistedLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/controllers/DeviceIdleJobsController;->updateTaskStateLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/controllers/JobStatus;-><init>(Landroid/app/job/JobInfo;IILjava/lang/String;IIJLjava/lang/String;IJJJJI)V
+HPLcom/android/server/job/controllers/JobStatus;-><init>(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/controllers/JobStatus;->clearTrackingController(I)Z
+HPLcom/android/server/job/controllers/JobStatus;->computeEstimatedNetworkBytesLocked()J
+HPLcom/android/server/job/controllers/JobStatus;->getBaseHeartbeat()J
+HPLcom/android/server/job/controllers/JobStatus;->getBatteryName()Ljava/lang/String;
+HPLcom/android/server/job/controllers/JobStatus;->getEarliestRunTime()J
+HPLcom/android/server/job/controllers/JobStatus;->getEstimatedNetworkBytes()J
+HPLcom/android/server/job/controllers/JobStatus;->getFlags()I
+HPLcom/android/server/job/controllers/JobStatus;->getInternalFlags()I
+HPLcom/android/server/job/controllers/JobStatus;->getJob()Landroid/app/job/JobInfo;
+HPLcom/android/server/job/controllers/JobStatus;->getJobId()I
+HPLcom/android/server/job/controllers/JobStatus;->getLastFailedRunTime()J
+HPLcom/android/server/job/controllers/JobStatus;->getLastSuccessfulRunTime()J
+HPLcom/android/server/job/controllers/JobStatus;->getLatestRunTimeElapsed()J
+HPLcom/android/server/job/controllers/JobStatus;->getNumFailures()I
+HPLcom/android/server/job/controllers/JobStatus;->getPersistedUtcTimes()Landroid/util/Pair;
+HPLcom/android/server/job/controllers/JobStatus;->getPriority()I
+HPLcom/android/server/job/controllers/JobStatus;->getServiceComponent()Landroid/content/ComponentName;
+HPLcom/android/server/job/controllers/JobStatus;->getSourcePackageName()Ljava/lang/String;
+HPLcom/android/server/job/controllers/JobStatus;->getSourceTag()Ljava/lang/String;
+HPLcom/android/server/job/controllers/JobStatus;->getSourceUid()I
+HPLcom/android/server/job/controllers/JobStatus;->getSourceUserId()I
+HPLcom/android/server/job/controllers/JobStatus;->getStandbyBucket()I
+HPLcom/android/server/job/controllers/JobStatus;->getUid()I
+HPLcom/android/server/job/controllers/JobStatus;->getUserId()I
+HPLcom/android/server/job/controllers/JobStatus;->hasBatteryNotLowConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasChargingConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasConnectivityConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasDeadlineConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasIdleConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->hasTimingDelayConstraint()Z
+HPLcom/android/server/job/controllers/JobStatus;->isConstraintSatisfied(I)Z
+HPLcom/android/server/job/controllers/JobStatus;->isConstraintsSatisfied()Z
+HPLcom/android/server/job/controllers/JobStatus;->isPersisted()Z
+HPLcom/android/server/job/controllers/JobStatus;->isReady()Z
+HPLcom/android/server/job/controllers/JobStatus;->matches(II)Z
+HPLcom/android/server/job/controllers/JobStatus;->setBackgroundNotRestrictedConstraintSatisfied(Z)Z
+HPLcom/android/server/job/controllers/JobStatus;->setConnectivityConstraintSatisfied(Z)Z
+HPLcom/android/server/job/controllers/JobStatus;->setConstraintSatisfied(IZ)Z
+HPLcom/android/server/job/controllers/JobStatus;->setDeviceNotDozingConstraintSatisfied(ZZ)Z
+HPLcom/android/server/job/controllers/JobStatus;->setTimingDelayConstraintSatisfied(Z)Z
+HPLcom/android/server/job/controllers/JobStatus;->setUidActive(Z)Z
+HPLcom/android/server/job/controllers/JobStatus;->updateEstimatedNetworkBytesLocked()V
+HPLcom/android/server/job/controllers/StateController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/job/controllers/TimeController;->canStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)Z
+HPLcom/android/server/job/controllers/TimeController;->checkExpiredDelaysAndResetAlarm()V
+HPLcom/android/server/job/controllers/TimeController;->evaluateTimingDelayConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z
+HPLcom/android/server/job/controllers/TimeController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+HPLcom/android/server/location/ContextHubServiceUtil;->createPrimitiveByteArray(Ljava/util/ArrayList;)[B
+HPLcom/android/server/location/GnssLocationProvider$GnssMetricsProvider;->getGnssMetricsAsProtoString()Ljava/lang/String;
+HPLcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;->getGnssHardwareModelName()Ljava/lang/String;
+HPLcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;->getGnssYearOfHardware()I
+HPLcom/android/server/location/GnssLocationProvider$ProviderHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/location/GnssLocationProvider;->handleReportLocation(ZLandroid/location/Location;)V
+HPLcom/android/server/location/GnssLocationProvider;->handleReportSvStatus(Lcom/android/server/location/GnssLocationProvider$SvStatusInfo;)V
+HPLcom/android/server/location/GnssLocationProvider;->reportNmea(J)V
+HPLcom/android/server/location/GnssLocationProvider;->sendMessage(IILjava/lang/Object;)V
+HPLcom/android/server/location/GnssStatusListenerHelper$5;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;JLjava/lang/String;)V
+HPLcom/android/server/location/GnssStatusListenerHelper$5;->execute(Landroid/location/IGnssStatusListener;)V
+HPLcom/android/server/location/GnssStatusListenerHelper$5;->execute(Landroid/os/IInterface;)V
+HPLcom/android/server/location/GnssStatusListenerHelper;->onNmeaReceived(JLjava/lang/String;)V
+HPLcom/android/server/location/RemoteListenerHelper$HandlerRunnable;-><init>(Lcom/android/server/location/RemoteListenerHelper;Landroid/os/IInterface;Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;)V
+HPLcom/android/server/location/RemoteListenerHelper$HandlerRunnable;->run()V
+HPLcom/android/server/location/RemoteListenerHelper$LinkedListener;->getUnderlyingListener()Landroid/os/IInterface;
+HPLcom/android/server/location/RemoteListenerHelper;->foreach(Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;)V
+HPLcom/android/server/location/RemoteListenerHelper;->foreachUnsafe(Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;)V
+HPLcom/android/server/location/RemoteListenerHelper;->post(Landroid/os/IInterface;Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;)V
+HPLcom/android/server/locksettings/LockSettingsService;->checkReadPermission(Ljava/lang/String;I)V
+HPLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;->equals(Ljava/lang/Object;)Z
+HPLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;->hashCode()I
+HPLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;->set(ILjava/lang/String;I)Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;
+HPLcom/android/server/locksettings/LockSettingsStorage$Callback;->initialize(Landroid/database/sqlite/SQLiteDatabase;)V
+HPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;->containsAlias(Ljava/lang/String;)Z
+HPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;->deleteEntry(Ljava/lang/String;)V
+HPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;->getKey(Ljava/lang/String;[C)Ljava/security/Key;
+HPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;->setEntry(Ljava/lang/String;Ljava/security/KeyStore$Entry;Ljava/security/KeyStore$ProtectionParameter;)V
+HPLcom/android/server/media/AudioPlayerStateMonitor;->dispatchPlaybackConfigChange(Ljava/util/List;Z)V
+HPLcom/android/server/media/MediaSessionService$SessionManagerImpl;->getSessions(Landroid/content/ComponentName;I)Ljava/util/List;
+HPLcom/android/server/media/MediaSessionStack$OnMediaButtonSessionChangedListener;->onMediaButtonSessionChanged(Lcom/android/server/media/MediaSessionRecord;Lcom/android/server/media/MediaSessionRecord;)V
+HPLcom/android/server/media/RemoteDisplayProviderProxy$Callback;->onDisplayStateChanged(Lcom/android/server/media/RemoteDisplayProviderProxy;Landroid/media/RemoteDisplayState;)V
+HPLcom/android/server/media/RemoteDisplayProviderWatcher$Callback;->addProvider(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+HPLcom/android/server/media/RemoteDisplayProviderWatcher$Callback;->removeProvider(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+HPLcom/android/server/net/NetworkIdentitySet;->areAllMembersOnDefaultNetwork()Z
+HPLcom/android/server/net/NetworkIdentitySet;->isAnyMemberMetered()Z
+HPLcom/android/server/net/NetworkIdentitySet;->isAnyMemberRoaming()Z
+HPLcom/android/server/net/NetworkPolicyLogger$Data;->reset()V
+HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->networkBlocked(II)V
+HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->uidFirewallRuleChanged(III)V
+HPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->uidStateChanged(IIJ)V
+HPLcom/android/server/net/NetworkPolicyLogger;->networkBlocked(II)V
+HPLcom/android/server/net/NetworkPolicyLogger;->uidStateChanged(IIJ)V
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->getSubscriptionOpportunisticQuota(Landroid/net/Network;I)J
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->getSubscriptionPlan(Landroid/net/Network;)Landroid/telephony/SubscriptionPlan;
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->getSubscriptionPlan(Landroid/net/NetworkTemplate;)Landroid/telephony/SubscriptionPlan;
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->isUidNetworkingBlocked(ILjava/lang/String;)Z
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->isUidRestrictedOnMeteredNetworks(I)Z
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->onAdminDataAvailable()V
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->onTempPowerSaveWhitelistChange(IZ)V
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->resetUserState(I)V
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->setMeteredRestrictedPackages(Ljava/util/Set;I)V
+HPLcom/android/server/net/NetworkPolicyManagerInternal;->setMeteredRestrictedPackagesAsync(Ljava/util/Set;I)V
+HPLcom/android/server/net/NetworkPolicyManagerService$17;->handleMessage(Landroid/os/Message;)Z
+HPLcom/android/server/net/NetworkPolicyManagerService$18;->handleMessage(Landroid/os/Message;)Z
+HPLcom/android/server/net/NetworkPolicyManagerService$4;->onUidStateChanged(IIJ)V
+HPLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->isUidNetworkingBlocked(ILjava/lang/String;)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->access$2100(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/os/RemoteCallbackList;
+HPLcom/android/server/net/NetworkPolicyManagerService;->access$2200(Lcom/android/server/net/NetworkPolicyManagerService;Landroid/net/INetworkPolicyListener;II)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->access$2400(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/ArraySet;
+HPLcom/android/server/net/NetworkPolicyManagerService;->access$3600(Lcom/android/server/net/NetworkPolicyManagerService;IZ)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->dispatchUidRulesChanged(Landroid/net/INetworkPolicyListener;II)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->getRestrictBackgroundByCaller()I
+HPLcom/android/server/net/NetworkPolicyManagerService;->handleUidChanged(IIJ)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->hasInternetPermissions(I)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->hasRule(II)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->isUidForegroundOnRestrictPowerUL(I)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->isUidIdle(I)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->isUidNetworkingBlockedInternal(IZ)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->isUidStateForeground(I)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForBlacklistRules(I)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->isWhitelistedBatterySaverUL(IZ)Z
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkStats(IZ)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateRestrictBackgroundRulesOnUidStatusChangedUL(III)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForAllAppsUL(I)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(I)V
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(IIZ)I
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsULInner(IIZ)I
+HPLcom/android/server/net/NetworkPolicyManagerService;->updateUidStateUL(II)V
+HPLcom/android/server/net/NetworkStatsAccess;->isAccessibleToUser(III)Z
+HPLcom/android/server/net/NetworkStatsCollection$Key;-><init>(Lcom/android/server/net/NetworkIdentitySet;III)V
+HPLcom/android/server/net/NetworkStatsCollection$Key;->equals(Ljava/lang/Object;)Z
+HPLcom/android/server/net/NetworkStatsCollection$Key;->hashCode()I
+HPLcom/android/server/net/NetworkStatsCollection;->findOrCreateHistory(Lcom/android/server/net/NetworkIdentitySet;III)Landroid/net/NetworkStatsHistory;
+HPLcom/android/server/net/NetworkStatsCollection;->getSummary(Landroid/net/NetworkTemplate;JJII)Landroid/net/NetworkStats;
+HPLcom/android/server/net/NetworkStatsCollection;->noteRecordedHistory(JJJ)V
+HPLcom/android/server/net/NetworkStatsCollection;->read(Ljava/io/DataInputStream;)V
+HPLcom/android/server/net/NetworkStatsCollection;->recordData(Lcom/android/server/net/NetworkIdentitySet;IIIJJLandroid/net/NetworkStats$Entry;)V
+HPLcom/android/server/net/NetworkStatsCollection;->templateMatches(Landroid/net/NetworkTemplate;Lcom/android/server/net/NetworkIdentitySet;)Z
+HPLcom/android/server/net/NetworkStatsCollection;->write(Ljava/io/DataOutputStream;)V
+HPLcom/android/server/net/NetworkStatsRecorder;->getTotalSinceBootLocked(Landroid/net/NetworkTemplate;)Landroid/net/NetworkStats$Entry;
+HPLcom/android/server/net/NetworkStatsRecorder;->recordSnapshotLocked(Landroid/net/NetworkStats;Ljava/util/Map;[Lcom/android/internal/net/VpnInfo;J)V
+HPLcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;->setUidForeground(IZ)V
+HPLcom/android/server/net/NetworkStatsService;->checkBpfStatsEnable()Z
+HPLcom/android/server/net/NetworkStatsService;->getIfaceStats(Ljava/lang/String;I)J
+HPLcom/android/server/net/NetworkStatsService;->getUidStats(II)J
+HPLcom/android/server/net/NetworkStatsService;->isBandwidthControlEnabled()Z
+HPLcom/android/server/net/NetworkStatsService;->resolveSubscriptionPlan(Landroid/net/NetworkTemplate;I)Landroid/telephony/SubscriptionPlan;
+HPLcom/android/server/net/NetworkStatsService;->setUidForeground(IZ)V
+HPLcom/android/server/net/watchlist/DigestUtils;->getSha256Hash(Ljava/io/InputStream;)[B
+HPLcom/android/server/net/watchlist/HarmfulDigests;->contains([B)Z
+HPLcom/android/server/net/watchlist/WatchlistConfig;->containsIp(Ljava/lang/String;)Z
+HPLcom/android/server/net/watchlist/WatchlistConfig;->getCrc32(Ljava/lang/String;)[B
+HPLcom/android/server/net/watchlist/WatchlistLoggingHandler;->asyncNetworkEvent(Ljava/lang/String;[Ljava/lang/String;I)V
+HPLcom/android/server/net/watchlist/WatchlistLoggingHandler;->isIpInWatchlist(Ljava/lang/String;)Z
+HPLcom/android/server/net/watchlist/WatchlistLoggingHandler;->searchAllSubDomainsInWatchlist(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/net/watchlist/WatchlistLoggingHandler;->searchIpInWatchlist([Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/notification/BadgeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/CalendarTracker$Callback;->onChanged()V
+HPLcom/android/server/notification/ConditionProviders$Callback;->onBootComplete()V
+HPLcom/android/server/notification/ConditionProviders$Callback;->onConditionChanged(Landroid/net/Uri;Landroid/service/notification/Condition;)V
+HPLcom/android/server/notification/ConditionProviders$Callback;->onServiceAdded(Landroid/content/ComponentName;)V
+HPLcom/android/server/notification/ConditionProviders$Callback;->onUserSwitched()V
+HPLcom/android/server/notification/GlobalSortKeyComparator;->compare(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)I
+HPLcom/android/server/notification/GlobalSortKeyComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/notification/GroupHelper$Callback;->addAutoGroup(Ljava/lang/String;)V
+HPLcom/android/server/notification/GroupHelper$Callback;->addAutoGroupSummary(ILjava/lang/String;Ljava/lang/String;)V
+HPLcom/android/server/notification/GroupHelper$Callback;->removeAutoGroup(Ljava/lang/String;)V
+HPLcom/android/server/notification/GroupHelper$Callback;->removeAutoGroupSummary(ILjava/lang/String;)V
+HPLcom/android/server/notification/ImportanceExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->enabledAndUserMatches(I)Z
+HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isEnabledForCurrentProfiles()Z
+HPLcom/android/server/notification/ManagedServices;->access$900(Lcom/android/server/notification/ManagedServices;)Landroid/util/ArraySet;
+HPLcom/android/server/notification/ManagedServices;->writeXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+HPLcom/android/server/notification/NotificationAdjustmentExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/NotificationChannelExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/NotificationComparator;->compare(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)I
+HPLcom/android/server/notification/NotificationComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/notification/NotificationComparator;->isImportantColorized(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/NotificationComparator;->isImportantMessaging(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/NotificationComparator;->isImportantOngoing(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/NotificationComparator;->isImportantPeople(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/NotificationComparator;->isOngoing(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/NotificationDelegate;->clearEffects()V
+HPLcom/android/server/notification/NotificationDelegate;->onClearAll(III)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationActionClick(IILjava/lang/String;ILcom/android/internal/statusbar/NotificationVisibility;)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationClear(IILjava/lang/String;Ljava/lang/String;IILjava/lang/String;ILcom/android/internal/statusbar/NotificationVisibility;)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationClick(IILjava/lang/String;Lcom/android/internal/statusbar/NotificationVisibility;)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationDirectReplied(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationError(IILjava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationExpansionChanged(Ljava/lang/String;ZZ)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationSettingsViewed(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationSmartRepliesAdded(Ljava/lang/String;I)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationSmartReplySent(Ljava/lang/String;I)V
+HPLcom/android/server/notification/NotificationDelegate;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
+HPLcom/android/server/notification/NotificationDelegate;->onPanelHidden()V
+HPLcom/android/server/notification/NotificationDelegate;->onPanelRevealed(ZI)V
+HPLcom/android/server/notification/NotificationDelegate;->onSetDisabled(I)V
+HPLcom/android/server/notification/NotificationIntrusivenessExtractor$1;->applyChangesLocked(Lcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/NotificationIntrusivenessExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/NotificationManagerInternal;->enqueueNotification(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;I)V
+HPLcom/android/server/notification/NotificationManagerInternal;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;)Landroid/app/NotificationChannel;
+HPLcom/android/server/notification/NotificationManagerInternal;->removeForegroundServiceFlagFromNotification(Ljava/lang/String;II)V
+HPLcom/android/server/notification/NotificationManagerService$10;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;II)V
+HPLcom/android/server/notification/NotificationManagerService$10;->createNotificationChannels(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
+HPLcom/android/server/notification/NotificationManagerService$10;->enqueueNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/app/Notification;I)V
+HPLcom/android/server/notification/NotificationManagerService$10;->getActiveNotificationsFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannel(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel;
+HPLcom/android/server/notification/NotificationManagerService$FlagChecker;->apply(I)Z
+HPLcom/android/server/notification/NotificationManagerService;->access$3000(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService;->access$3700(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+HPLcom/android/server/notification/NotificationManagerService;->access$4400(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
+HPLcom/android/server/notification/NotificationManagerService;->access$700(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/RankingHelper;
+HPLcom/android/server/notification/NotificationManagerService;->access$800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
+HPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSameApp(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSystemOrSameApp(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationManagerService;->clamp(III)I
+HPLcom/android/server/notification/NotificationManagerService;->enqueueNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;I)V
+HPLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
+HPLcom/android/server/notification/NotificationManagerService;->findNotificationRecordIndexLocked(Lcom/android/server/notification/NotificationRecord;)I
+HPLcom/android/server/notification/NotificationManagerService;->getNotificationCountLocked(Ljava/lang/String;IILjava/lang/String;)I
+HPLcom/android/server/notification/NotificationManagerService;->grantUriPermission(Landroid/os/IBinder;Landroid/net/Uri;ILjava/lang/String;I)V
+HPLcom/android/server/notification/NotificationManagerService;->handleRankingSort()V
+HPLcom/android/server/notification/NotificationManagerService;->hasCompanionDevice(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+HPLcom/android/server/notification/NotificationManagerService;->indexOfNotificationLocked(Ljava/lang/String;)I
+HPLcom/android/server/notification/NotificationManagerService;->isCallerSystemOrPhone()Z
+HPLcom/android/server/notification/NotificationManagerService;->isCallingUidSystem()Z
+HPLcom/android/server/notification/NotificationManagerService;->isNotificationForCurrentUser(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/NotificationManagerService;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/NotificationManagerService;->isUidSystemOrPhone(I)Z
+HPLcom/android/server/notification/NotificationManagerService;->isVisibleToListener(Landroid/service/notification/StatusBarNotification;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+HPLcom/android/server/notification/NotificationManagerService;->makeRankingUpdateLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+HPLcom/android/server/notification/NotificationManagerService;->notificationMatchesUserId(Lcom/android/server/notification/NotificationRecord;I)Z
+HPLcom/android/server/notification/NotificationManagerService;->updateUriPermissions(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;I)V
+HPLcom/android/server/notification/NotificationRecord;->applyAdjustments()V
+HPLcom/android/server/notification/NotificationRecord;->applyUserImportance()V
+HPLcom/android/server/notification/NotificationRecord;->calculateImportance()I
+HPLcom/android/server/notification/NotificationRecord;->calculateUserSentiment()V
+HPLcom/android/server/notification/NotificationRecord;->canShowBadge()Z
+HPLcom/android/server/notification/NotificationRecord;->getAudioAttributes()Landroid/media/AudioAttributes;
+HPLcom/android/server/notification/NotificationRecord;->getAuthoritativeRank()I
+HPLcom/android/server/notification/NotificationRecord;->getChannel()Landroid/app/NotificationChannel;
+HPLcom/android/server/notification/NotificationRecord;->getContactAffinity()F
+HPLcom/android/server/notification/NotificationRecord;->getFreshnessMs(J)I
+HPLcom/android/server/notification/NotificationRecord;->getGlobalSortKey()Ljava/lang/String;
+HPLcom/android/server/notification/NotificationRecord;->getGrantableUris()Landroid/util/ArraySet;
+HPLcom/android/server/notification/NotificationRecord;->getGroupKey()Ljava/lang/String;
+HPLcom/android/server/notification/NotificationRecord;->getImportance()I
+HPLcom/android/server/notification/NotificationRecord;->getImportanceExplanation()Ljava/lang/CharSequence;
+HPLcom/android/server/notification/NotificationRecord;->getKey()Ljava/lang/String;
+HPLcom/android/server/notification/NotificationRecord;->getNotification()Landroid/app/Notification;
+HPLcom/android/server/notification/NotificationRecord;->getPackagePriority()I
+HPLcom/android/server/notification/NotificationRecord;->getPackageVisibilityOverride()I
+HPLcom/android/server/notification/NotificationRecord;->getPeopleOverride()Ljava/util/ArrayList;
+HPLcom/android/server/notification/NotificationRecord;->getRankingTimeMs()J
+HPLcom/android/server/notification/NotificationRecord;->getSnoozeCriteria()Ljava/util/ArrayList;
+HPLcom/android/server/notification/NotificationRecord;->getSuppressedVisualEffects()I
+HPLcom/android/server/notification/NotificationRecord;->getUser()Landroid/os/UserHandle;
+HPLcom/android/server/notification/NotificationRecord;->getUserExplanation()Ljava/lang/String;
+HPLcom/android/server/notification/NotificationRecord;->getUserId()I
+HPLcom/android/server/notification/NotificationRecord;->getUserSentiment()I
+HPLcom/android/server/notification/NotificationRecord;->isAudioAttributesUsage(I)Z
+HPLcom/android/server/notification/NotificationRecord;->isCategory(Ljava/lang/String;)Z
+HPLcom/android/server/notification/NotificationRecord;->isHidden()Z
+HPLcom/android/server/notification/NotificationRecord;->isIntercepted()Z
+HPLcom/android/server/notification/NotificationRecord;->isRecentlyIntrusive()Z
+HPLcom/android/server/notification/NotificationRecord;->setAuthoritativeRank(I)V
+HPLcom/android/server/notification/NotificationRecord;->setContactAffinity(F)V
+HPLcom/android/server/notification/NotificationRecord;->setGlobalSortKey(Ljava/lang/String;)V
+HPLcom/android/server/notification/NotificationRecord;->setIntercepted(Z)Z
+HPLcom/android/server/notification/NotificationRecord;->setPackagePriority(I)V
+HPLcom/android/server/notification/NotificationRecord;->setPackageVisibilityOverride(I)V
+HPLcom/android/server/notification/NotificationRecord;->setRecentlyIntrusive(Z)V
+HPLcom/android/server/notification/NotificationRecord;->setShowBadge(Z)V
+HPLcom/android/server/notification/NotificationRecord;->setSuppressedVisualEffects(I)V
+HPLcom/android/server/notification/NotificationRecord;->setUserImportance(I)V
+HPLcom/android/server/notification/NotificationRecord;->updateNotificationChannel(Landroid/app/NotificationChannel;)V
+HPLcom/android/server/notification/NotificationRecord;->visitGrantableUri(Landroid/net/Uri;)V
+HPLcom/android/server/notification/NotificationUsageStats$SQLiteLog$1;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->pruneIfNecessary(Landroid/database/sqlite/SQLiteDatabase;)V
+HPLcom/android/server/notification/NotificationUsageStats;->getAggregatedStatsLocked(Lcom/android/server/notification/NotificationRecord;)[Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
+HPLcom/android/server/notification/NotificationUsageStats;->getAggregatedStatsLocked(Ljava/lang/String;)[Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
+HPLcom/android/server/notification/NotificationUsageStats;->getAppEnqueueRate(Ljava/lang/String;)F
+HPLcom/android/server/notification/NotificationUsageStats;->getOrCreateAggregatedStatsLocked(Ljava/lang/String;)Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
+HPLcom/android/server/notification/NotificationUsageStats;->registerPeopleAffinity(Lcom/android/server/notification/NotificationRecord;ZZZ)V
+HPLcom/android/server/notification/NotificationUsageStats;->registerUpdatedByApp(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/NotificationUsageStats;->releaseAggregatedStatsLocked([Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;)V
+HPLcom/android/server/notification/PriorityExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/RankingConfig;->badgingEnabled(Landroid/os/UserHandle;)Z
+HPLcom/android/server/notification/RankingConfig;->canShowBadge(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/RankingConfig;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;ZZ)V
+HPLcom/android/server/notification/RankingConfig;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;Z)V
+HPLcom/android/server/notification/RankingConfig;->deleteNotificationChannel(Ljava/lang/String;ILjava/lang/String;)V
+HPLcom/android/server/notification/RankingConfig;->getImportance(Ljava/lang/String;I)I
+HPLcom/android/server/notification/RankingConfig;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Z)Landroid/app/NotificationChannel;
+HPLcom/android/server/notification/RankingConfig;->getNotificationChannelGroups(Ljava/lang/String;I)Ljava/util/Collection;
+HPLcom/android/server/notification/RankingConfig;->getNotificationChannelGroups(Ljava/lang/String;IZZ)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/RankingConfig;->getNotificationChannels(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/notification/RankingConfig;->isGroupBlocked(Ljava/lang/String;ILjava/lang/String;)Z
+HPLcom/android/server/notification/RankingConfig;->permanentlyDeleteNotificationChannel(Ljava/lang/String;ILjava/lang/String;)V
+HPLcom/android/server/notification/RankingConfig;->permanentlyDeleteNotificationChannels(Ljava/lang/String;I)V
+HPLcom/android/server/notification/RankingConfig;->setImportance(Ljava/lang/String;II)V
+HPLcom/android/server/notification/RankingConfig;->setShowBadge(Ljava/lang/String;IZ)V
+HPLcom/android/server/notification/RankingConfig;->updateNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;Z)V
+HPLcom/android/server/notification/RankingHandler;->requestReconsideration(Lcom/android/server/notification/RankingReconsideration;)V
+HPLcom/android/server/notification/RankingHandler;->requestSort()V
+HPLcom/android/server/notification/RankingHelper;->badgingEnabled(Landroid/os/UserHandle;)Z
+HPLcom/android/server/notification/RankingHelper;->canShowBadge(Ljava/lang/String;I)Z
+HPLcom/android/server/notification/RankingHelper;->extractSignals(Lcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/RankingHelper;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Z)Landroid/app/NotificationChannel;
+HPLcom/android/server/notification/RankingHelper;->getOrCreateRecord(Ljava/lang/String;I)Lcom/android/server/notification/RankingHelper$Record;
+HPLcom/android/server/notification/RankingHelper;->getOrCreateRecord(Ljava/lang/String;IIIIZ)Lcom/android/server/notification/RankingHelper$Record;
+HPLcom/android/server/notification/RankingHelper;->indexOf(Ljava/util/ArrayList;Lcom/android/server/notification/NotificationRecord;)I
+HPLcom/android/server/notification/RankingHelper;->recordKey(Ljava/lang/String;I)Ljava/lang/String;
+HPLcom/android/server/notification/RankingHelper;->sort(Ljava/util/ArrayList;)V
+HPLcom/android/server/notification/RankingHelper;->updateConfig()V
+HPLcom/android/server/notification/RankingHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+HPLcom/android/server/notification/RankingReconsideration;->run()V
+HPLcom/android/server/notification/SnoozeHelper$Callback;->repost(ILcom/android/server/notification/NotificationRecord;)V
+HPLcom/android/server/notification/ValidateNotificationPeople$LookupResult;-><init>()V
+HPLcom/android/server/notification/ValidateNotificationPeople$LookupResult;->access$400(Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;)Z
+HPLcom/android/server/notification/ValidateNotificationPeople$LookupResult;->getAffinity()F
+HPLcom/android/server/notification/ValidateNotificationPeople$LookupResult;->isExpired()Z
+HPLcom/android/server/notification/ValidateNotificationPeople$LookupResult;->isInvalid()Z
+HPLcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;->work()V
+HPLcom/android/server/notification/ValidateNotificationPeople;->access$000()Z
+HPLcom/android/server/notification/ValidateNotificationPeople;->access$300(Lcom/android/server/notification/ValidateNotificationPeople;)Landroid/util/LruCache;
+HPLcom/android/server/notification/ValidateNotificationPeople;->combineLists([Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String;
+HPLcom/android/server/notification/ValidateNotificationPeople;->getCacheKey(ILjava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/notification/ValidateNotificationPeople;->getContextAsUser(Landroid/os/UserHandle;)Landroid/content/Context;
+HPLcom/android/server/notification/ValidateNotificationPeople;->getExtraPeople(Landroid/os/Bundle;)[Ljava/lang/String;
+HPLcom/android/server/notification/ValidateNotificationPeople;->getExtraPeopleForKey(Landroid/os/Bundle;Ljava/lang/String;)[Ljava/lang/String;
+HPLcom/android/server/notification/ValidateNotificationPeople;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/List;[F)Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;
+HPLcom/android/server/notification/VisibilityExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/ZenLog;->traceIntercepted(Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;)V
+HPLcom/android/server/notification/ZenModeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;
+HPLcom/android/server/notification/ZenModeFiltering;->isAlarm(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/ZenModeFiltering;->isCall(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/ZenModeFiltering;->isDefaultPhoneApp(Ljava/lang/String;)Z
+HPLcom/android/server/notification/ZenModeFiltering;->isEvent(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/ZenModeFiltering;->isMedia(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/ZenModeFiltering;->isMessage(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/ZenModeFiltering;->isReminder(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/ZenModeFiltering;->isSystem(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/ZenModeFiltering;->shouldIntercept(ILandroid/service/notification/ZenModeConfig;Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/notification/ZenModeHelper;->applyRestrictions(ZII)V
+HPLcom/android/server/notification/ZenModeHelper;->getNotificationPolicy()Landroid/app/NotificationManager$Policy;
+HPLcom/android/server/notification/ZenModeHelper;->getNotificationPolicy(Landroid/service/notification/ZenModeConfig;)Landroid/app/NotificationManager$Policy;
+HPLcom/android/server/notification/ZenModeHelper;->shouldIntercept(Lcom/android/server/notification/NotificationRecord;)Z
+HPLcom/android/server/om/OverlayManagerServiceImpl$OverlayChangeListener;->onOverlaysChanged(Ljava/lang/String;I)V
+HPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->getOverlayPackages(I)Ljava/util/List;
+HPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->signaturesMatching(Ljava/lang/String;Ljava/lang/String;I)Z
+HPLcom/android/server/pm/-$$Lambda$ShortcutService$3$n_VdEzyBcjs0pGZO8GnB0FoTgR0;-><init>(Lcom/android/server/pm/ShortcutService$3;II)V
+HPLcom/android/server/pm/-$$Lambda$ShortcutService$3$n_VdEzyBcjs0pGZO8GnB0FoTgR0;->run()V
+HPLcom/android/server/pm/AbstractStatsBase;->maybeWriteAsync(Ljava/lang/Object;)Z
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->clearCallingIdentity()J
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getActivityManagerInternal()Landroid/app/ActivityManagerInternal;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getAppOpsManager()Landroid/app/AppOpsManager;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getCallingUid()I
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getCallingUserHandle()Landroid/os/UserHandle;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getCallingUserId()I
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getPackageManager()Landroid/content/pm/PackageManager;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getUserManager()Landroid/os/UserManager;
+HPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->restoreCallingIdentity(J)V
+HPLcom/android/server/pm/InstantAppRegistry;->getInstalledInstantApplicationsLPr(I)Ljava/util/List;
+HPLcom/android/server/pm/InstantAppRegistry;->grantInstantAccessLPw(ILandroid/content/Intent;II)V
+HPLcom/android/server/pm/InstantAppResolverConnection$PhaseTwoCallback;->onPhaseTwoResolved(Ljava/util/List;J)V
+HPLcom/android/server/pm/InstantAppResolverConnection;->getRemoteInstanceLazy(Ljava/lang/String;)Landroid/app/IInstantAppResolver;
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectBinderCallingPid()I
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectBinderCallingUid()I
+HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->verifyCallingPackage(Ljava/lang/String;)V
+HPLcom/android/server/pm/PackageDexOptimizer;->acquireWakeLockLI(I)J
+HPLcom/android/server/pm/PackageDexOptimizer;->dexOptPath(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;IILcom/android/server/pm/CompilerStats$PackageStats;ZLjava/lang/String;Ljava/lang/String;I)I
+HPLcom/android/server/pm/PackageDexOptimizer;->getDexFlags(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Lcom/android/server/pm/dex/DexoptOptions;)I
+HPLcom/android/server/pm/PackageDexOptimizer;->getDexoptNeeded(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)I
+HPLcom/android/server/pm/PackageDexOptimizer;->getRealCompilerFilter(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Z)Ljava/lang/String;
+HPLcom/android/server/pm/PackageDexOptimizer;->releaseWakeLockLI(J)V
+HPLcom/android/server/pm/PackageKeySetData;->getAliases()Landroid/util/ArrayMap;
+HPLcom/android/server/pm/PackageKeySetData;->isUsingUpgradeKeySets()Z
+HPLcom/android/server/pm/PackageManagerService$1;->onPermissionUpdated([IZ)V
+HPLcom/android/server/pm/PackageManagerService$5;->compare(Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;)I
+HPLcom/android/server/pm/PackageManagerService$5;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->allowFilterResult(Landroid/content/pm/PackageParser$ActivityIntentInfo;Ljava/util/List;)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isFilterStopped(Landroid/content/IntentFilter;I)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isFilterStopped(Landroid/content/pm/PackageParser$ActivityIntentInfo;I)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->newResult(Landroid/content/pm/PackageParser$ActivityIntentInfo;II)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->queryIntentForPackage(Landroid/content/Intent;Ljava/lang/String;ILjava/util/ArrayList;I)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->sortResults(Ljava/util/List;)V
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->canAccessInstantApps(II)Z
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->filterAppAccess(Landroid/content/pm/PackageParser$Package;II)Z
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getInstantAppPackageName(I)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getKnownPackageName(II)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackage(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getSigningDetails(I)Landroid/content/pm/PackageParser$SigningDetails;
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->grantEphemeralAccess(ILandroid/content/Intent;II)V
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->hasSignatureCapability(III)Z
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isPackageEphemeral(ILjava/lang/String;)Z
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->notifyPackageUse(Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->resolveService(Landroid/content/Intent;Ljava/lang/String;III)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->access$2300(Lcom/android/server/pm/PackageManagerService$ServiceIntentResolver;)Landroid/util/ArrayMap;
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->allowFilterResult(Landroid/content/pm/PackageParser$ServiceIntentInfo;Ljava/util/List;)Z
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/pm/PackageParser$ServiceIntentInfo;)Z
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->newResult(Landroid/content/pm/PackageParser$ServiceIntentInfo;II)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->queryIntentForPackage(Landroid/content/Intent;Ljava/lang/String;ILjava/util/ArrayList;I)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->sortResults(Ljava/util/List;)V
+HPLcom/android/server/pm/PackageManagerService;->access$2900(Lcom/android/server/pm/PackageManagerService;I)Z
+HPLcom/android/server/pm/PackageManagerService;->access$3000()Ljava/util/Comparator;
+HPLcom/android/server/pm/PackageManagerService;->access$5100(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/InstantAppRegistry;
+HPLcom/android/server/pm/PackageManagerService;->access$6400(Lcom/android/server/pm/PackageManagerService;I)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->access$6500(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageSetting;II)Z
+HPLcom/android/server/pm/PackageManagerService;->access$6600(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;J)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->access$8200(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;III)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService;->access$8600(Lcom/android/server/pm/PackageManagerService;II)Z
+HPLcom/android/server/pm/PackageManagerService;->access$8800(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService;->addPackageHoldingPermissions(Ljava/util/ArrayList;Lcom/android/server/pm/PackageSetting;[Ljava/lang/String;[ZII)V
+HPLcom/android/server/pm/PackageManagerService;->applyPostResolutionFilter(Ljava/util/List;Ljava/lang/String;ZIILandroid/content/Intent;)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->applyPostServiceResolutionFilter(Ljava/util/List;Ljava/lang/String;)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->canViewInstantApps(II)Z
+HPLcom/android/server/pm/PackageManagerService;->checkPackageStartable(Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I
+HPLcom/android/server/pm/PackageManagerService;->checkUidPermission(Ljava/lang/String;I)I
+HPLcom/android/server/pm/PackageManagerService;->filterAppAccessLPr(Lcom/android/server/pm/PackageSetting;II)Z
+HPLcom/android/server/pm/PackageManagerService;->filterAppAccessLPr(Lcom/android/server/pm/PackageSetting;ILandroid/content/ComponentName;II)Z
+HPLcom/android/server/pm/PackageManagerService;->filterIfNotSystemUser(Ljava/util/List;I)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->filterSharedLibPackageLPr(Lcom/android/server/pm/PackageSetting;III)Z
+HPLcom/android/server/pm/PackageManagerService;->findPreferredActivity(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;IZZZI)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService;->generatePackageInfo(Lcom/android/server/pm/PackageSetting;II)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/pm/PackageManagerService;->getActivityInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
+HPLcom/android/server/pm/PackageManagerService;->getActivityInfoInternal(Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
+HPLcom/android/server/pm/PackageManagerService;->getApplicationEnabledSetting(Ljava/lang/String;I)I
+HPLcom/android/server/pm/PackageManagerService;->getApplicationInfo(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
+HPLcom/android/server/pm/PackageManagerService;->getApplicationInfoInternal(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+HPLcom/android/server/pm/PackageManagerService;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I
+HPLcom/android/server/pm/PackageManagerService;->getInstalledApplications(II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->getInstantAppPackageName(I)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->getInstantApps(I)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->getNameForUid(I)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->getPackageGids(Ljava/lang/String;II)[I
+HPLcom/android/server/pm/PackageManagerService;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/pm/PackageManagerService;->getPackageInfoInternal(Ljava/lang/String;JIII)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/pm/PackageManagerService;->getPackageUid(Ljava/lang/String;II)I
+HPLcom/android/server/pm/PackageManagerService;->getPackagesForUid(I)[Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->getPackagesHoldingPermissions([Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
+HPLcom/android/server/pm/PackageManagerService;->getProfileParent(I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/pm/PackageManagerService;->getReceiverInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ActivityInfo;
+HPLcom/android/server/pm/PackageManagerService;->getServiceInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ServiceInfo;
+HPLcom/android/server/pm/PackageManagerService;->getUserManagerInternal()Landroid/os/UserManagerInternal;
+HPLcom/android/server/pm/PackageManagerService;->isCallerSameApp(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PackageManagerService;->isInstantApp(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PackageManagerService;->isPackageAvailable(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PackageManagerService;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/PackageManagerService;->isProtectedBroadcast(Ljava/lang/String;)Z
+HPLcom/android/server/pm/PackageManagerService;->logAppProcessStartIfNeeded(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService;->notifyPackageUseLocked(Ljava/lang/String;I)V
+HPLcom/android/server/pm/PackageManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLcom/android/server/pm/PackageManagerService;->performDexOptInternal(Lcom/android/server/pm/dex/DexoptOptions;)I
+HPLcom/android/server/pm/PackageManagerService;->queryContentProviders(Ljava/lang/String;IILjava/lang/String;)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;IIIZZ)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentReceiversInternal(Landroid/content/Intent;Ljava/lang/String;IIZ)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentServices(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+HPLcom/android/server/pm/PackageManagerService;->queryIntentServicesInternal(Landroid/content/Intent;Ljava/lang/String;IIIZ)Ljava/util/List;
+HPLcom/android/server/pm/PackageManagerService;->replacePreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V
+HPLcom/android/server/pm/PackageManagerService;->resolveContentProvider(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+HPLcom/android/server/pm/PackageManagerService;->resolveContentProviderInternal(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+HPLcom/android/server/pm/PackageManagerService;->resolveExternalPackageNameLPr(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService;->resolveIntentInternal(Landroid/content/Intent;Ljava/lang/String;IIZI)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService;->resolveInternalPackageNameLPr(Ljava/lang/String;J)Ljava/lang/String;
+HPLcom/android/server/pm/PackageManagerService;->resolveService(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService;->resolveServiceInternal(Landroid/content/Intent;Ljava/lang/String;III)Landroid/content/pm/ResolveInfo;
+HPLcom/android/server/pm/PackageManagerService;->setEnabledSetting(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerService;->setPackageStoppedState(Ljava/lang/String;ZI)V
+HPLcom/android/server/pm/PackageManagerService;->updateFlags(II)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForApplication(IILjava/lang/Object;)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForComponent(IILjava/lang/Object;)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForPackage(IILjava/lang/Object;)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IILandroid/content/Intent;IZ)I
+HPLcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IILandroid/content/Intent;IZZ)I
+HPLcom/android/server/pm/PackageManagerService;->userNeedsBadging(I)Z
+HPLcom/android/server/pm/PackageManagerServiceUtils;->dumpCriticalInfo(Ljava/io/PrintWriter;Ljava/lang/String;)V
+HPLcom/android/server/pm/PackageManagerServiceUtils;->enforceShellRestriction(Ljava/lang/String;II)V
+HPLcom/android/server/pm/PackageSettingBase;->getEnabled(I)I
+HPLcom/android/server/pm/PackageSettingBase;->getHarmfulAppWarning(I)Ljava/lang/String;
+HPLcom/android/server/pm/PackageSettingBase;->getHidden(I)Z
+HPLcom/android/server/pm/PackageSettingBase;->getInstalled(I)Z
+HPLcom/android/server/pm/PackageSettingBase;->getLastDisabledAppCaller(I)Ljava/lang/String;
+HPLcom/android/server/pm/PackageSettingBase;->getNotLaunched(I)Z
+HPLcom/android/server/pm/PackageSettingBase;->getSigningDetails()Landroid/content/pm/PackageParser$SigningDetails;
+HPLcom/android/server/pm/PackageSettingBase;->getStopped(I)Z
+HPLcom/android/server/pm/PackageSettingBase;->getSuspended(I)Z
+HPLcom/android/server/pm/PackageSignatures;->writeCertsListXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/ArrayList;[Landroid/content/pm/Signature;[I)V
+HPLcom/android/server/pm/PackageSignatures;->writeXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/util/ArrayList;)V
+HPLcom/android/server/pm/PackageUsage;->readToken(Ljava/io/InputStream;Ljava/lang/StringBuffer;C)Ljava/lang/String;
+HPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissions(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+HPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissionsForUserAsyncLPr(I)V
+HPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissionsSync(I)V
+HPLcom/android/server/pm/Settings;->dumpPackageLPr(Ljava/io/PrintWriter;Ljava/lang/String;Ljava/lang/String;Landroid/util/ArraySet;Lcom/android/server/pm/PackageSetting;Ljava/text/SimpleDateFormat;Ljava/util/Date;Ljava/util/List;Z)V
+HPLcom/android/server/pm/Settings;->dumpPackagesLPr(Ljava/io/PrintWriter;Ljava/lang/String;Landroid/util/ArraySet;Lcom/android/server/pm/DumpState;Z)V
+HPLcom/android/server/pm/Settings;->isEnabledAndMatchLPr(Landroid/content/pm/ComponentInfo;II)Z
+HPLcom/android/server/pm/Settings;->setPackageStoppedStateLPw(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ZZII)Z
+HPLcom/android/server/pm/Settings;->writeChildPackagesLPw(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+HPLcom/android/server/pm/Settings;->writeDomainVerificationsLPr(Lorg/xmlpull/v1/XmlSerializer;Landroid/content/pm/IntentFilterVerificationInfo;)V
+HPLcom/android/server/pm/Settings;->writeKeySetAliasesLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V
+HPLcom/android/server/pm/Settings;->writeLPr()V
+HPLcom/android/server/pm/Settings;->writePackageLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageSetting;)V
+HPLcom/android/server/pm/Settings;->writePackageListLPr(I)V
+HPLcom/android/server/pm/Settings;->writePackageRestrictionsLPr(I)V
+HPLcom/android/server/pm/Settings;->writePermissionsLPr(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+HPLcom/android/server/pm/Settings;->writeSigningKeySetLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V
+HPLcom/android/server/pm/Settings;->writeUpgradeKeySetsLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V
+HPLcom/android/server/pm/Settings;->writeUsesStaticLibLPw(Lorg/xmlpull/v1/XmlSerializer;[Ljava/lang/String;[J)V
+HPLcom/android/server/pm/ShortcutPackage;->saveShortcut(Lorg/xmlpull/v1/XmlSerializer;Landroid/content/pm/ShortcutInfo;ZZ)V
+HPLcom/android/server/pm/ShortcutPackage;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+HPLcom/android/server/pm/ShortcutPackageItem;->getPackageInfo()Lcom/android/server/pm/ShortcutPackageInfo;
+HPLcom/android/server/pm/ShortcutPackageItem;->getPackageName()Ljava/lang/String;
+HPLcom/android/server/pm/ShortcutPackageItem;->getPackageUserId()I
+HPLcom/android/server/pm/ShortcutService$3;->lambda$onUidStateChanged$0(Lcom/android/server/pm/ShortcutService$3;II)V
+HPLcom/android/server/pm/ShortcutService$3;->onUidStateChanged(IIJ)V
+HPLcom/android/server/pm/ShortcutService;->handleOnUidStateChanged(II)V
+HPLcom/android/server/pm/ShortcutService;->injectClearCallingIdentity()J
+HPLcom/android/server/pm/ShortcutService;->injectCurrentTimeMillis()J
+HPLcom/android/server/pm/ShortcutService;->injectElapsedRealtime()J
+HPLcom/android/server/pm/ShortcutService;->injectPostToHandler(Ljava/lang/Runnable;)V
+HPLcom/android/server/pm/ShortcutService;->injectRestoreCallingIdentity(J)V
+HPLcom/android/server/pm/ShortcutService;->isProcessStateForeground(I)Z
+HPLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;J)V
+HPLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/lang/CharSequence;)V
+HPLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Z)V
+HPLcom/android/server/pm/ShortcutService;->writeTagExtra(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/os/PersistableBundle;)V
+HPLcom/android/server/pm/UserManagerService$LocalService;->exists(I)Z
+HPLcom/android/server/pm/UserManagerService$LocalService;->isUserUnlockingOrUnlocked(I)Z
+HPLcom/android/server/pm/UserManagerService;->access$2800(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseIntArray;
+HPLcom/android/server/pm/UserManagerService;->access$2900(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/pm/UserManagerService;->checkManageOrInteractPermIfCallerInOtherProfileGroup(ILjava/lang/String;)V
+HPLcom/android/server/pm/UserManagerService;->exists(I)Z
+HPLcom/android/server/pm/UserManagerService;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
+HPLcom/android/server/pm/UserManagerService;->getApplicationRestrictionsForUser(Ljava/lang/String;I)Landroid/os/Bundle;
+HPLcom/android/server/pm/UserManagerService;->getProfileIds(IZ)[I
+HPLcom/android/server/pm/UserManagerService;->getProfileIdsLU(IZ)Landroid/util/IntArray;
+HPLcom/android/server/pm/UserManagerService;->getProfiles(IZ)Ljava/util/List;
+HPLcom/android/server/pm/UserManagerService;->getUidForPackage(Ljava/lang/String;)I
+HPLcom/android/server/pm/UserManagerService;->getUserDataLU(I)Lcom/android/server/pm/UserManagerService$UserData;
+HPLcom/android/server/pm/UserManagerService;->getUserIds()[I
+HPLcom/android/server/pm/UserManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/pm/UserManagerService;->getUserInfoLU(I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/pm/UserManagerService;->getUserInfoNoChecks(I)Landroid/content/pm/UserInfo;
+HPLcom/android/server/pm/UserManagerService;->getUserStartRealtime()J
+HPLcom/android/server/pm/UserManagerService;->getUserUnlockRealtime()J
+HPLcom/android/server/pm/UserManagerService;->hasManageUsersPermission()Z
+HPLcom/android/server/pm/UserManagerService;->hasManagedProfile(I)Z
+HPLcom/android/server/pm/UserManagerService;->hasPermissionGranted(Ljava/lang/String;I)Z
+HPLcom/android/server/pm/UserManagerService;->packageToRestrictionsFileName(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/pm/UserManagerService;->readApplicationRestrictionsLAr(Landroid/util/AtomicFile;)Landroid/os/Bundle;
+HPLcom/android/server/pm/UserManagerService;->readApplicationRestrictionsLAr(Ljava/lang/String;I)Landroid/os/Bundle;
+HPLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->searchDex(Ljava/lang/String;I)I
+HPLcom/android/server/pm/dex/DexManager;->access$400()I
+HPLcom/android/server/pm/dex/DexManager;->getDexPackage(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Lcom/android/server/pm/dex/DexManager$DexSearchResult;
+HPLcom/android/server/pm/permission/BasePermission;->getSourcePackageName()Ljava/lang/String;
+HPLcom/android/server/pm/permission/BasePermission;->getSourcePackageSetting()Lcom/android/server/pm/PackageSettingBase;
+HPLcom/android/server/pm/permission/BasePermission;->isDynamic()Z
+HPLcom/android/server/pm/permission/BasePermission;->isNormal()Z
+HPLcom/android/server/pm/permission/BasePermission;->isOEM()Z
+HPLcom/android/server/pm/permission/BasePermission;->isPrivileged()Z
+HPLcom/android/server/pm/permission/BasePermission;->isRuntime()Z
+HPLcom/android/server/pm/permission/BasePermission;->isRuntimeOnly()Z
+HPLcom/android/server/pm/permission/BasePermission;->isSignature()Z
+HPLcom/android/server/pm/permission/BasePermission;->isVendorPrivileged()Z
+HPLcom/android/server/pm/permission/BasePermission;->writeLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+HPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantRuntimePermissions(Landroid/content/pm/PackageParser$Package;Ljava/util/Set;ZZI)V
+HPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->checkPermission(Ljava/lang/String;Ljava/lang/String;II)I
+HPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->checkUidPermission(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;II)I
+HPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->enforceCrossUserPermission(IIZZLjava/lang/String;)V
+HPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->enforceCrossUserPermission(IIZZZLjava/lang/String;)V
+HPLcom/android/server/pm/permission/PermissionManagerService;->access$1900(Lcom/android/server/pm/permission/PermissionManagerService;IIZZZLjava/lang/String;)V
+HPLcom/android/server/pm/permission/PermissionManagerService;->access$2100(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Ljava/lang/String;II)I
+HPLcom/android/server/pm/permission/PermissionManagerService;->access$2200(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Landroid/content/pm/PackageParser$Package;II)I
+HPLcom/android/server/pm/permission/PermissionManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;II)I
+HPLcom/android/server/pm/permission/PermissionManagerService;->checkUidPermission(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;II)I
+HPLcom/android/server/pm/permission/PermissionManagerService;->enforceCrossUserPermission(IIZZZLjava/lang/String;)V
+HPLcom/android/server/pm/permission/PermissionManagerService;->grantPermissions(Landroid/content/pm/PackageParser$Package;ZLjava/lang/String;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+HPLcom/android/server/pm/permission/PermissionManagerService;->grantSignaturePermission(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/permission/BasePermission;Lcom/android/server/pm/permission/PermissionsState;)Z
+HPLcom/android/server/pm/permission/PermissionManagerService;->hasPrivappWhitelistEntry(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;)Z
+HPLcom/android/server/pm/permission/PermissionManagerService;->updatePermissions(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;I)I
+HPLcom/android/server/pm/permission/PermissionSettings;->writePermissions(Lorg/xmlpull/v1/XmlSerializer;)V
+HPLcom/android/server/pm/permission/PermissionsState$PermissionData;->getPermissionState(I)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+HPLcom/android/server/pm/permission/PermissionsState$PermissionState;->getFlags()I
+HPLcom/android/server/pm/permission/PermissionsState$PermissionState;->getName()Ljava/lang/String;
+HPLcom/android/server/pm/permission/PermissionsState$PermissionState;->isGranted()Z
+HPLcom/android/server/pm/permission/PermissionsState;->computeGids([I)[I
+HPLcom/android/server/pm/permission/PermissionsState;->getInstallPermissionStates()Ljava/util/List;
+HPLcom/android/server/pm/permission/PermissionsState;->getPermissionState(Ljava/lang/String;I)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+HPLcom/android/server/pm/permission/PermissionsState;->getPermissionStatesInternal(I)Ljava/util/List;
+HPLcom/android/server/pm/permission/PermissionsState;->getPermissions(I)Ljava/util/Set;
+HPLcom/android/server/pm/permission/PermissionsState;->getRuntimePermissionState(Ljava/lang/String;I)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+HPLcom/android/server/pm/permission/PermissionsState;->getRuntimePermissionStates(I)Ljava/util/List;
+HPLcom/android/server/pm/permission/PermissionsState;->hasInstallPermission(Ljava/lang/String;)Z
+HPLcom/android/server/pm/permission/PermissionsState;->hasRuntimePermission(Ljava/lang/String;I)Z
+HPLcom/android/server/policy/BarController$OnBarVisibilityChangedListener;->onBarVisibilityChanged(Z)V
+HPLcom/android/server/policy/BarController;->applyTranslucentFlagLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;II)I
+HPLcom/android/server/policy/BarController;->checkHiddenLw()Z
+HPLcom/android/server/policy/BarController;->computeStateLw(ZZLcom/android/server/policy/WindowManagerPolicy$WindowState;Z)I
+HPLcom/android/server/policy/BarController;->isTransientShowRequested()Z
+HPLcom/android/server/policy/BarController;->isTransientShowing()Z
+HPLcom/android/server/policy/BarController;->isTransparentAllowed(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+HPLcom/android/server/policy/BarController;->setBarShowingLw(Z)Z
+HPLcom/android/server/policy/BarController;->setContentFrame(Landroid/graphics/Rect;)V
+HPLcom/android/server/policy/BarController;->updateStateLw(I)Z
+HPLcom/android/server/policy/BarController;->updateVisibilityLw(ZII)I
+HPLcom/android/server/policy/GlobalActionsProvider$GlobalActionsListener;->onGlobalActionsAvailableChanged(Z)V
+HPLcom/android/server/policy/GlobalActionsProvider$GlobalActionsListener;->onGlobalActionsDismissed()V
+HPLcom/android/server/policy/GlobalActionsProvider$GlobalActionsListener;->onGlobalActionsShown()V
+HPLcom/android/server/policy/GlobalActionsProvider;->isGlobalActionsDisabled()Z
+HPLcom/android/server/policy/GlobalActionsProvider;->setGlobalActionsListener(Lcom/android/server/policy/GlobalActionsProvider$GlobalActionsListener;)V
+HPLcom/android/server/policy/GlobalActionsProvider;->showGlobalActions()V
+HPLcom/android/server/policy/PhoneWindowManager;->applyKeyguardPolicyLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)V
+HPLcom/android/server/policy/PhoneWindowManager;->applyPostLayoutPolicyLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)V
+HPLcom/android/server/policy/PhoneWindowManager;->applyStableConstraints(IILandroid/graphics/Rect;Lcom/android/server/wm/DisplayFrames;)V
+HPLcom/android/server/policy/PhoneWindowManager;->areTranslucentBarsAllowed()Z
+HPLcom/android/server/policy/PhoneWindowManager;->canBeHiddenByKeyguardLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+HPLcom/android/server/policy/PhoneWindowManager;->canHideNavigationBar()Z
+HPLcom/android/server/policy/PhoneWindowManager;->drawsStatusBarBackground(ILcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+HPLcom/android/server/policy/PhoneWindowManager;->getImpliedSysUiFlagsForLayout(Landroid/view/WindowManager$LayoutParams;)I
+HPLcom/android/server/policy/PhoneWindowManager;->getNavigationBarHeight(II)I
+HPLcom/android/server/policy/PhoneWindowManager;->inKeyguardRestrictedKeyInputMode()Z
+HPLcom/android/server/policy/PhoneWindowManager;->isImmersiveMode(I)Z
+HPLcom/android/server/policy/PhoneWindowManager;->isKeyguardLocked()Z
+HPLcom/android/server/policy/PhoneWindowManager;->isKeyguardShowingAndNotOccluded()Z
+HPLcom/android/server/policy/PhoneWindowManager;->isStatusBarKeyguard()Z
+HPLcom/android/server/policy/PhoneWindowManager;->keyguardOn()Z
+HPLcom/android/server/policy/PhoneWindowManager;->layoutWindowLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/wm/DisplayFrames;)V
+HPLcom/android/server/policy/PhoneWindowManager;->shouldBeHiddenByKeyguard(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+HPLcom/android/server/policy/PhoneWindowManager;->shouldUseOutsets(Landroid/view/WindowManager$LayoutParams;I)Z
+HPLcom/android/server/policy/PhoneWindowManager;->updateLightStatusBarLw(ILcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)I
+HPLcom/android/server/policy/PhoneWindowManager;->updateSystemBarsLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;II)I
+HPLcom/android/server/policy/PhoneWindowManager;->userActivity()V
+HPLcom/android/server/policy/PolicyControl;->getSystemUiVisibility(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;)I
+HPLcom/android/server/policy/PolicyControl;->getWindowFlags(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;)I
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onDebug()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onDown()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onFling(I)V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseHoverAtBottom()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseHoverAtTop()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseLeaveFromEdge()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromBottom()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromLeft()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromRight()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromTop()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onUpOrCancel()V
+HPLcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;->onFling(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z
+HPLcom/android/server/policy/SystemGesturesPointerEventListener;->detectSwipe(IJFF)I
+HPLcom/android/server/policy/SystemGesturesPointerEventListener;->detectSwipe(Landroid/view/MotionEvent;)I
+HPLcom/android/server/policy/SystemGesturesPointerEventListener;->findIndex(I)I
+HPLcom/android/server/policy/SystemGesturesPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V
+HPLcom/android/server/policy/WakeGestureListener;->onWakeUp()V
HPLcom/android/server/policy/WindowManagerPolicy$InputConsumer;->dismiss()V
HPLcom/android/server/policy/WindowManagerPolicy$ScreenOffListener;->onScreenOff()V
HPLcom/android/server/policy/WindowManagerPolicy$ScreenOnListener;->onScreenOn()V
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->canAcquireSleepToken()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->canAffectSystemUiFlags()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->computeFrameLw(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Lcom/android/server/wm/utils/WmDisplayCutout;Z)V
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getAppToken()Landroid/view/IApplicationToken;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getBaseType()I
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getContentFrameLw()Landroid/graphics/Rect;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getDisplayFrameLw()Landroid/graphics/Rect;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getDisplayId()I
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getFrameLw()Landroid/graphics/Rect;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getGivenContentInsetsLw()Landroid/graphics/Rect;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getGivenInsetsPendingLw()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getGivenVisibleInsetsLw()Landroid/graphics/Rect;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getNeedsMenuLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getOverscanFrameLw()Landroid/graphics/Rect;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getOwningPackage()Ljava/lang/String;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getOwningUid()I
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getRotationAnimationHint()I
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getSurfaceLayer()I
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getSystemUiVisibility()I
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getVisibleFrameLw()Landroid/graphics/Rect;
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getWindowingMode()I
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->hasAppShownWindows()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->hasDrawnLw()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->hideLw(Z)Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isAlive()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isAnimatingLw()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isDefaultDisplay()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isDimming()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isDisplayedLw()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isDrawnLw()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isGoneForLayoutLw()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isInMultiWindowMode()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isInputMethodTarget()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isInputMethodWindow()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isVisibleLw()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isVoiceInteraction()Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->showLw(Z)Z
+HPLcom/android/server/policy/WindowManagerPolicy$WindowState;->writeIdentifierToProto(Landroid/util/proto/ProtoOutputStream;J)V
+HPLcom/android/server/policy/WindowManagerPolicy;->getWindowLayerFromTypeLw(I)I
+HPLcom/android/server/policy/WindowManagerPolicy;->getWindowLayerFromTypeLw(IZ)I
+HPLcom/android/server/policy/WindowManagerPolicy;->getWindowLayerLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)I
+HPLcom/android/server/policy/WindowOrientationListener;->onProposedRotationChanged(I)V
+HPLcom/android/server/policy/WindowOrientationListener;->onTouchEnd()V
+HPLcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;->onDrawn()V
+HPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isInputRestricted()Z
+HPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isShowing()Z
+HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isInputRestricted()Z
+HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isShowing()Z
+HPLcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;->onShowingChanged()V
+HPLcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;->onTrustedChanged()V
+HPLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isInputRestricted()Z
+HPLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isShowing()Z
+HPLcom/android/server/power/Notifier$NotifierHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/power/Notifier;->access$500(Lcom/android/server/power/Notifier;)V
+HPLcom/android/server/power/Notifier;->getBatteryStatsWakeLockMonitorType(I)I
+HPLcom/android/server/power/Notifier;->onUserActivity(II)V
+HPLcom/android/server/power/Notifier;->onWakeLockAcquired(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+HPLcom/android/server/power/Notifier;->onWakeLockReleased(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+HPLcom/android/server/power/Notifier;->sendUserActivity()V
+HPLcom/android/server/power/PowerManagerService$BinderService;->acquireWakeLock(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;)V
+HPLcom/android/server/power/PowerManagerService$BinderService;->isDeviceIdleMode()Z
+HPLcom/android/server/power/PowerManagerService$BinderService;->isInteractive()Z
+HPLcom/android/server/power/PowerManagerService$BinderService;->isLightDeviceIdleMode()Z
+HPLcom/android/server/power/PowerManagerService$BinderService;->isPowerSaveMode()Z
+HPLcom/android/server/power/PowerManagerService$BinderService;->releaseWakeLock(Landroid/os/IBinder;I)V
+HPLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;)V
+HPLcom/android/server/power/PowerManagerService$LocalService;->finishUidChanges()V
+HPLcom/android/server/power/PowerManagerService$LocalService;->startUidChanges()V
+HPLcom/android/server/power/PowerManagerService$LocalService;->updateUidProcState(II)V
+HPLcom/android/server/power/PowerManagerService$PowerManagerHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/power/PowerManagerService$WakeLock;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILcom/android/server/power/PowerManagerService$UidState;)V
+HPLcom/android/server/power/PowerManagerService$WakeLock;->hasSameProperties(ILjava/lang/String;Landroid/os/WorkSource;II)Z
+HPLcom/android/server/power/PowerManagerService$WakeLock;->hasSameWorkSource(Landroid/os/WorkSource;)Z
+HPLcom/android/server/power/PowerManagerService;->access$2600(Lcom/android/server/power/PowerManagerService;)V
+HPLcom/android/server/power/PowerManagerService;->access$2800(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+HPLcom/android/server/power/PowerManagerService;->access$3000(Ljava/lang/String;)V
+HPLcom/android/server/power/PowerManagerService;->access$3300(Lcom/android/server/power/PowerManagerService;)Landroid/content/Context;
+HPLcom/android/server/power/PowerManagerService;->access$3400(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;II)V
+HPLcom/android/server/power/PowerManagerService;->access$3500(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;I)V
+HPLcom/android/server/power/PowerManagerService;->access$4300(Lcom/android/server/power/PowerManagerService;)Z
+HPLcom/android/server/power/PowerManagerService;->acquireWakeLockInternal(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;II)V
+HPLcom/android/server/power/PowerManagerService;->adjustWakeLockSummaryLocked(I)I
+HPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnAcquireLocked(Lcom/android/server/power/PowerManagerService$WakeLock;I)V
+HPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnReleaseLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+HPLcom/android/server/power/PowerManagerService;->checkForLongWakeLocks()V
+HPLcom/android/server/power/PowerManagerService;->copyWorkSource(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+HPLcom/android/server/power/PowerManagerService;->findWakeLockIndexLocked(Landroid/os/IBinder;)I
+HPLcom/android/server/power/PowerManagerService;->finishUidChangesInternal()V
+HPLcom/android/server/power/PowerManagerService;->finishWakefulnessChangeIfNeededLocked()V
+HPLcom/android/server/power/PowerManagerService;->getDesiredScreenPolicyLocked()I
+HPLcom/android/server/power/PowerManagerService;->getNextProfileTimeoutLocked(J)J
+HPLcom/android/server/power/PowerManagerService;->getScreenDimDurationLocked(J)J
+HPLcom/android/server/power/PowerManagerService;->getScreenOffTimeoutLocked(J)J
+HPLcom/android/server/power/PowerManagerService;->getSleepTimeoutLocked()J
+HPLcom/android/server/power/PowerManagerService;->getWakeLockSummaryFlags(Lcom/android/server/power/PowerManagerService$WakeLock;)I
+HPLcom/android/server/power/PowerManagerService;->handleSandman()V
+HPLcom/android/server/power/PowerManagerService;->isBeingKeptAwakeLocked()Z
+HPLcom/android/server/power/PowerManagerService;->isInteractiveInternal()Z
+HPLcom/android/server/power/PowerManagerService;->isItBedTimeYetLocked()Z
+HPLcom/android/server/power/PowerManagerService;->isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()Z
+HPLcom/android/server/power/PowerManagerService;->isValidBrightness(I)Z
+HPLcom/android/server/power/PowerManagerService;->maybeUpdateForegroundProfileLastActivityLocked(J)V
+HPLcom/android/server/power/PowerManagerService;->needDisplaySuspendBlockerLocked()Z
+HPLcom/android/server/power/PowerManagerService;->notifyWakeLockAcquiredLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+HPLcom/android/server/power/PowerManagerService;->notifyWakeLockLongFinishedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+HPLcom/android/server/power/PowerManagerService;->notifyWakeLockReleasedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+HPLcom/android/server/power/PowerManagerService;->powerHintInternal(II)V
+HPLcom/android/server/power/PowerManagerService;->releaseWakeLockInternal(Landroid/os/IBinder;I)V
+HPLcom/android/server/power/PowerManagerService;->removeWakeLockLocked(Lcom/android/server/power/PowerManagerService$WakeLock;I)V
+HPLcom/android/server/power/PowerManagerService;->restartNofifyLongTimerLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+HPLcom/android/server/power/PowerManagerService;->scheduleSandmanLocked()V
+HPLcom/android/server/power/PowerManagerService;->scheduleUserInactivityTimeout(J)V
+HPLcom/android/server/power/PowerManagerService;->setHalAutoSuspendModeLocked(Z)V
+HPLcom/android/server/power/PowerManagerService;->setHalInteractiveModeLocked(Z)V
+HPLcom/android/server/power/PowerManagerService;->setWakeLockDisabledStateLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)Z
+HPLcom/android/server/power/PowerManagerService;->shouldBoostScreenBrightness()Z
+HPLcom/android/server/power/PowerManagerService;->shouldUseProximitySensorLocked()Z
+HPLcom/android/server/power/PowerManagerService;->startUidChangesInternal()V
+HPLcom/android/server/power/PowerManagerService;->updateDisplayPowerStateLocked(I)Z
+HPLcom/android/server/power/PowerManagerService;->updateDreamLocked(IZ)V
+HPLcom/android/server/power/PowerManagerService;->updateIsPoweredLocked(I)V
+HPLcom/android/server/power/PowerManagerService;->updatePowerRequestFromBatterySaverPolicy(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;)V
+HPLcom/android/server/power/PowerManagerService;->updatePowerStateLocked()V
+HPLcom/android/server/power/PowerManagerService;->updateProfilesLocked(J)V
+HPLcom/android/server/power/PowerManagerService;->updateScreenBrightnessBoostLocked(I)V
+HPLcom/android/server/power/PowerManagerService;->updateStayOnLocked(I)V
+HPLcom/android/server/power/PowerManagerService;->updateSuspendBlockerLocked()V
+HPLcom/android/server/power/PowerManagerService;->updateUidProcStateInternal(II)V
+HPLcom/android/server/power/PowerManagerService;->updateUserActivitySummaryLocked(JI)V
+HPLcom/android/server/power/PowerManagerService;->updateWakeLockSummaryLocked(I)V
+HPLcom/android/server/power/PowerManagerService;->updateWakefulnessLocked(I)Z
+HPLcom/android/server/power/PowerManagerService;->userActivityFromNative(JII)V
+HPLcom/android/server/power/PowerManagerService;->userActivityNoUpdateLocked(JIII)Z
HPLcom/android/server/print/RemotePrintService$PrintServiceCallbacks;->onCustomPrinterIconLoaded(Landroid/print/PrinterId;Landroid/graphics/drawable/Icon;)V
HPLcom/android/server/print/RemotePrintService$PrintServiceCallbacks;->onPrintersAdded(Ljava/util/List;)V
HPLcom/android/server/print/RemotePrintService$PrintServiceCallbacks;->onPrintersRemoved(Ljava/util/List;)V
@@ -148,23 +1956,206 @@ HPLcom/android/server/print/RemotePrintServiceRecommendationService$RemotePrintS
HPLcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;->onAllPrintJobsForServiceHandled(Landroid/content/ComponentName;)V
HPLcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;->onPrintJobQueued(Landroid/print/PrintJobInfo;)V
HPLcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;->onPrintJobStateChanged(Landroid/print/PrintJobInfo;)V
+HPLcom/android/server/print/UserState$PrintJobStateChangeListenerRecord;->onBinderDied()V
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->getModuleProperties()Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->startRecognition(ILandroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->stopRecognition(ILandroid/hardware/soundtrigger/IRecognitionStatusCallback;)I
+HPLcom/android/server/soundtrigger/SoundTriggerInternal;->unloadKeyphraseModel(I)I
+HPLcom/android/server/stats/-$$Lambda$StatsCompanionService$HnKmFmrhuaLvGqFujHXRVkF_MsY;->onUidCpuPolicyTime(I[J)V
+HPLcom/android/server/stats/-$$Lambda$StatsCompanionService$huFrwWUJ-ABqZn7Xg215J22rAxY;->onUidCpuTime(IJJ)V
+HPLcom/android/server/stats/-$$Lambda$StatsCompanionService$jXfS7_WmvALP_3l6Dg3O1qMWGdk;->onUidCpuActiveTime(IJ)V
+HPLcom/android/server/stats/StatsCompanionService;->addNetworkStats(ILjava/util/List;Landroid/net/NetworkStats;Z)V
+HPLcom/android/server/stats/StatsCompanionService;->cancelAnomalyAlarm()V
+HPLcom/android/server/stats/StatsCompanionService;->enforceCallingPermission()V
+HPLcom/android/server/stats/StatsCompanionService;->lambda$pullKernelUidCpuActiveTime$3(JILjava/util/List;IJ)V
+HPLcom/android/server/stats/StatsCompanionService;->lambda$pullKernelUidCpuClusterTime$2(JILjava/util/List;I[J)V
+HPLcom/android/server/stats/StatsCompanionService;->lambda$pullKernelUidCpuTime$0(JILjava/util/List;IJJ)V
+HPLcom/android/server/stats/StatsCompanionService;->pullKernelWakelock(ILjava/util/List;)V
+HPLcom/android/server/stats/StatsCompanionService;->pullSystemElapsedRealtime(ILjava/util/List;)V
+HPLcom/android/server/stats/StatsCompanionService;->pullWifiBytesTransferByFgBg(ILjava/util/List;)V
+HPLcom/android/server/stats/StatsCompanionService;->rollupNetworkStatsByFGBG(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;
+HPLcom/android/server/stats/StatsCompanionService;->setAnomalyAlarm(J)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionCancelled()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionFinished()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionPending()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionStarting(JJ)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->cancelPreloadRecentApps()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->dismissKeyboardShortcutsMenu()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->hideRecentApps(ZZ)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->onCameraLaunchGestureDetected(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->onProposedRotationChanged(IZ)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->preloadRecentApps()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setCurrentUser(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setNotificationDelegate(Lcom/android/server/notification/NotificationDelegate;)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setSystemUiVisibility(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setTopAppHidesStatusBar(Z)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->setWindowState(II)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showAssistDisclosure()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showChargingAnimation(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showPictureInPictureMenu()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showRecentApps(Z)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showScreenPinningRequest(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->showShutdownUi(ZLjava/lang/String;)Z
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->startAssist(Landroid/os/Bundle;)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleKeyboardShortcutsMenu(I)V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleRecentApps()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleSplitScreen()V
+HPLcom/android/server/statusbar/StatusBarManagerInternal;->topAppWindowChanged(Z)V
+HPLcom/android/server/statusbar/StatusBarManagerService$DisableRecord;->getFlags(I)I
+HPLcom/android/server/statusbar/StatusBarManagerService;->access$100(Lcom/android/server/statusbar/StatusBarManagerService;)Lcom/android/internal/statusbar/IStatusBar;
+HPLcom/android/server/statusbar/StatusBarManagerService;->enforceStatusBarService()V
+HPLcom/android/server/statusbar/StatusBarManagerService;->gatherDisableActionsLocked(II)I
+HPLcom/android/server/statusbar/StatusBarManagerService;->manageDisableListLocked(IILandroid/os/IBinder;Ljava/lang/String;I)V
+HPLcom/android/server/storage/AppFuseBridge$MountScope;->open()Landroid/os/ParcelFileDescriptor;
+HPLcom/android/server/storage/DeviceStorageMonitorInternal;->checkMemory()V
+HPLcom/android/server/storage/DeviceStorageMonitorInternal;->getMemoryLowThreshold()J
+HPLcom/android/server/storage/DeviceStorageMonitorInternal;->isMemoryLow()Z
+HPLcom/android/server/storage/DeviceStorageMonitorService;->isBootImageOnDisk()Z
+HPLcom/android/server/timezone/ConfigHelper;->getCheckTimeAllowedMillis()I
+HPLcom/android/server/timezone/ConfigHelper;->getDataAppPackageName()Ljava/lang/String;
+HPLcom/android/server/timezone/ConfigHelper;->getFailedCheckRetryCount()I
+HPLcom/android/server/timezone/ConfigHelper;->getUpdateAppPackageName()Ljava/lang/String;
+HPLcom/android/server/timezone/ConfigHelper;->isTrackingEnabled()Z
+HPLcom/android/server/timezone/PackageManagerHelper;->contentProviderRegistered(Ljava/lang/String;Ljava/lang/String;)Z
+HPLcom/android/server/timezone/PackageManagerHelper;->getInstalledPackageVersion(Ljava/lang/String;)J
+HPLcom/android/server/timezone/PackageManagerHelper;->isPrivilegedApp(Ljava/lang/String;)Z
+HPLcom/android/server/timezone/PackageManagerHelper;->receiverRegistered(Landroid/content/Intent;Ljava/lang/String;)Z
+HPLcom/android/server/timezone/PackageManagerHelper;->usesPermission(Ljava/lang/String;Ljava/lang/String;)Z
+HPLcom/android/server/timezone/PackageTrackerIntentHelper;->initialize(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/timezone/PackageTracker;)V
+HPLcom/android/server/timezone/PackageTrackerIntentHelper;->scheduleReliabilityTrigger(J)V
+HPLcom/android/server/timezone/PackageTrackerIntentHelper;->sendTriggerUpdateCheck(Lcom/android/server/timezone/CheckToken;)V
+HPLcom/android/server/timezone/PackageTrackerIntentHelper;->unscheduleReliabilityTrigger()V
+HPLcom/android/server/timezone/PermissionHelper;->checkDumpPermission(Ljava/lang/String;Ljava/io/PrintWriter;)Z
+HPLcom/android/server/timezone/PermissionHelper;->enforceCallerHasPermission(Ljava/lang/String;)V
+HPLcom/android/server/timezone/RulesManagerIntentHelper;->sendTimeZoneOperationStaged()V
+HPLcom/android/server/timezone/RulesManagerIntentHelper;->sendTimeZoneOperationUnstaged()V
+HPLcom/android/server/trust/TrustManagerService$1;->isDeviceLocked(I)Z
+HPLcom/android/server/trust/TrustManagerService$1;->isDeviceSecure(I)Z
+HPLcom/android/server/trust/TrustManagerService;->resolveProfileParent(I)I
+HPLcom/android/server/twilight/TwilightManager;->getLastTwilightState()Lcom/android/server/twilight/TwilightState;
+HPLcom/android/server/twilight/TwilightManager;->registerListener(Lcom/android/server/twilight/TwilightListener;Landroid/os/Handler;)V
+HPLcom/android/server/twilight/TwilightManager;->unregisterListener(Lcom/android/server/twilight/TwilightListener;)V
+HPLcom/android/server/usage/AppIdleHistory;->getAppStandbyBucket(Ljava/lang/String;IJ)I
+HPLcom/android/server/usage/AppIdleHistory;->getAppUsageHistory(Ljava/lang/String;IJ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;
+HPLcom/android/server/usage/AppIdleHistory;->getElapsedTime(J)J
+HPLcom/android/server/usage/AppIdleHistory;->getPackageHistory(Landroid/util/ArrayMap;Ljava/lang/String;JZ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;
+HPLcom/android/server/usage/AppIdleHistory;->getScreenOnTime(J)J
+HPLcom/android/server/usage/AppIdleHistory;->getThresholdIndex(Ljava/lang/String;IJ[J[J)I
+HPLcom/android/server/usage/AppIdleHistory;->getUserHistory(I)Landroid/util/ArrayMap;
+HPLcom/android/server/usage/AppIdleHistory;->isIdle(Ljava/lang/String;IJ)Z
+HPLcom/android/server/usage/AppIdleHistory;->reportUsage(Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;Ljava/lang/String;IIJJ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;
+HPLcom/android/server/usage/AppIdleHistory;->shouldInformListeners(Ljava/lang/String;IJI)Z
+HPLcom/android/server/usage/AppStandbyController$AppStandbyHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/usage/AppStandbyController$Injector;->elapsedRealtime()J
+HPLcom/android/server/usage/AppStandbyController$Injector;->getActiveNetworkScorer()Ljava/lang/String;
+HPLcom/android/server/usage/AppStandbyController$Injector;->isBoundWidgetPackage(Landroid/appwidget/AppWidgetManager;Ljava/lang/String;I)Z
+HPLcom/android/server/usage/AppStandbyController$Injector;->isPackageEphemeral(ILjava/lang/String;)Z
+HPLcom/android/server/usage/AppStandbyController$Injector;->isPowerSaveWhitelistExceptIdleApp(Ljava/lang/String;)Z
+HPLcom/android/server/usage/AppStandbyController;->access$400(Lcom/android/server/usage/AppStandbyController;Ljava/lang/String;IIJ)V
+HPLcom/android/server/usage/AppStandbyController;->checkAndUpdateStandbyState(Ljava/lang/String;IIJ)V
+HPLcom/android/server/usage/AppStandbyController;->getAppId(Ljava/lang/String;)I
+HPLcom/android/server/usage/AppStandbyController;->getAppStandbyBucket(Ljava/lang/String;IJZ)I
+HPLcom/android/server/usage/AppStandbyController;->getBucketForLocked(Ljava/lang/String;IJ)I
+HPLcom/android/server/usage/AppStandbyController;->isActiveDeviceAdmin(Ljava/lang/String;I)Z
+HPLcom/android/server/usage/AppStandbyController;->isActiveNetworkScorer(Ljava/lang/String;)Z
+HPLcom/android/server/usage/AppStandbyController;->isAppIdleFiltered(Ljava/lang/String;IIJ)Z
+HPLcom/android/server/usage/AppStandbyController;->isAppIdleFilteredOrParoled(Ljava/lang/String;IJZ)Z
+HPLcom/android/server/usage/AppStandbyController;->isAppIdleUnfiltered(Ljava/lang/String;IJ)Z
+HPLcom/android/server/usage/AppStandbyController;->isAppSpecial(Ljava/lang/String;II)Z
+HPLcom/android/server/usage/AppStandbyController;->isCarrierApp(Ljava/lang/String;)Z
+HPLcom/android/server/usage/AppStandbyController;->isDeviceProvisioningPackage(Ljava/lang/String;)Z
+HPLcom/android/server/usage/AppStandbyController;->isParoledOrCharging()Z
+HPLcom/android/server/usage/AppStandbyController;->maybeInformListeners(Ljava/lang/String;IJIIZ)V
+HPLcom/android/server/usage/AppStandbyController;->predictionTimedOut(Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;J)Z
+HPLcom/android/server/usage/AppStandbyController;->reportEvent(Landroid/app/usage/UsageEvents$Event;JI)V
+HPLcom/android/server/usage/AppStandbyController;->usageEventToSubReason(I)I
+HPLcom/android/server/usage/AppTimeLimitController$OnLimitReachedListener;->onLimitReached(IIJJLandroid/app/PendingIntent;)V
+HPLcom/android/server/usage/IntervalStats;->buildEvent(Ljava/lang/String;Ljava/lang/String;)Landroid/app/usage/UsageEvents$Event;
+HPLcom/android/server/usage/IntervalStats;->getCachedStringRef(Ljava/lang/String;)Ljava/lang/String;
+HPLcom/android/server/usage/IntervalStats;->getOrCreateUsageStats(Ljava/lang/String;)Landroid/app/usage/UsageStats;
+HPLcom/android/server/usage/IntervalStats;->isStatefulEvent(I)Z
+HPLcom/android/server/usage/IntervalStats;->isUserVisibleEvent(I)Z
+HPLcom/android/server/usage/IntervalStats;->update(Ljava/lang/String;JI)V
+HPLcom/android/server/usage/StorageStatsService;->getAppIds(I)[I
+HPLcom/android/server/usage/StorageStatsService;->queryStatsForPackage(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;
+HPLcom/android/server/usage/StorageStatsService;->queryStatsForUid(Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;
+HPLcom/android/server/usage/UnixCalendar;->getTimeInMillis()J
HPLcom/android/server/usage/UsageStatsDatabase$CheckinAction;->checkin(Lcom/android/server/usage/IntervalStats;)Z
+HPLcom/android/server/usage/UsageStatsService$2;->onUidStateChanged(IIJ)V
+HPLcom/android/server/usage/UsageStatsService$BinderService;->hasPermission(Ljava/lang/String;)Z
+HPLcom/android/server/usage/UsageStatsService$BinderService;->isAppInactive(Ljava/lang/String;I)Z
+HPLcom/android/server/usage/UsageStatsService$BinderService;->queryEvents(JJLjava/lang/String;)Landroid/app/usage/UsageEvents;
+HPLcom/android/server/usage/UsageStatsService$H;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/usage/UsageStatsService$LocalService;->getAppStandbyBucket(Ljava/lang/String;IJ)I
+HPLcom/android/server/usage/UsageStatsService$LocalService;->isAppIdle(Ljava/lang/String;II)Z
+HPLcom/android/server/usage/UsageStatsService$LocalService;->reportEvent(Ljava/lang/String;II)V
+HPLcom/android/server/usage/UsageStatsService$LocalService;->reportInterruptiveNotification(Ljava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/usage/UsageStatsService;->access$300(Lcom/android/server/usage/UsageStatsService;)Landroid/util/SparseIntArray;
+HPLcom/android/server/usage/UsageStatsService;->access$600(Lcom/android/server/usage/UsageStatsService;II)Z
+HPLcom/android/server/usage/UsageStatsService;->checkAndGetTimeLocked()J
+HPLcom/android/server/usage/UsageStatsService;->convertToSystemTimeLocked(Landroid/app/usage/UsageEvents$Event;)V
+HPLcom/android/server/usage/UsageStatsService;->getUserDataAndInitializeIfNeededLocked(IJ)Lcom/android/server/usage/UserUsageStatsService;
+HPLcom/android/server/usage/UsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;I)V
+HPLcom/android/server/usage/UsageStatsService;->shouldObfuscateInstantAppsForCaller(II)Z
+HPLcom/android/server/usage/UsageStatsXmlV1;->loadEvent(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats;)V
+HPLcom/android/server/usage/UsageStatsXmlV1;->loadUsageStats(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats;)V
+HPLcom/android/server/usage/UsageStatsXmlV1;->read(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats;)V
+HPLcom/android/server/usage/UsageStatsXmlV1;->write(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/usage/IntervalStats;)V
+HPLcom/android/server/usage/UsageStatsXmlV1;->writeChooserCounts(Lorg/xmlpull/v1/XmlSerializer;Landroid/app/usage/UsageStats;)V
+HPLcom/android/server/usage/UsageStatsXmlV1;->writeEvent(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/usage/IntervalStats;Landroid/app/usage/UsageEvents$Event;)V
+HPLcom/android/server/usage/UsageStatsXmlV1;->writeUsageStats(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/usage/IntervalStats;Landroid/app/usage/UsageStats;)V
+HPLcom/android/server/usage/UserUsageStatsService$4;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)V
+HPLcom/android/server/usage/UserUsageStatsService;->notifyStatsChanged()V
+HPLcom/android/server/usage/UserUsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;)V
+HPLcom/android/server/usb/MtpNotificationManager$OnOpenInAppListener;->onOpenInApp(Landroid/hardware/usb/UsbDevice;)V
+HPLcom/android/server/utils/ManagedApplicationService$BinderChecker;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
+HPLcom/android/server/utils/ManagedApplicationService$BinderChecker;->checkType(Landroid/os/IInterface;)Z
+HPLcom/android/server/utils/ManagedApplicationService$EventCallback;->onServiceEvent(Lcom/android/server/utils/ManagedApplicationService$LogEvent;)V
+HPLcom/android/server/utils/ManagedApplicationService$PendingEvent;->runEvent(Landroid/os/IInterface;)V
HPLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$Callback;->onSessionHidden(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
HPLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$Callback;->onSessionShown(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
HPLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$Callback;->sessionConnectionGone(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->addBand(I)V
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->addChannel(I)V
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->clear()V
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->containsBand(I)Z
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->containsChannel(I)Z
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->fillBucketSettings(Lcom/android/server/wifi/WifiNative$BucketSettings;I)V
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->getChannelSet()Ljava/util/Set;
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->getContainingChannelsFromBand(I)Ljava/util/Set;
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->getMissingChannelsFromBand(I)Ljava/util/Set;
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->getScanFreqs()Ljava/util/Set;
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->isAllChannels()Z
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->isEmpty()Z
-HPLcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;->partiallyContainsBand(I)Z
+HPLcom/android/server/vr/SettingsObserver$SettingChangeListener;->onSettingChanged()V
+HPLcom/android/server/vr/SettingsObserver$SettingChangeListener;->onSettingRestored(Ljava/lang/String;Ljava/lang/String;I)V
+HPLcom/android/server/vr/VrManagerInternal;->addPersistentVrModeStateListener(Landroid/service/vr/IPersistentVrStateCallbacks;)V
+HPLcom/android/server/vr/VrManagerInternal;->getVr2dDisplayId()I
+HPLcom/android/server/vr/VrManagerInternal;->hasVrPackage(Landroid/content/ComponentName;I)I
+HPLcom/android/server/vr/VrManagerInternal;->isCurrentVrListener(Ljava/lang/String;I)Z
+HPLcom/android/server/vr/VrManagerInternal;->onScreenStateChanged(Z)V
+HPLcom/android/server/vr/VrManagerInternal;->setPersistentVrModeEnabled(Z)V
+HPLcom/android/server/vr/VrManagerInternal;->setVr2dDisplayProperties(Landroid/app/Vr2dDisplayProperties;)V
+HPLcom/android/server/vr/VrManagerInternal;->setVrMode(ZLandroid/content/ComponentName;IILandroid/content/ComponentName;)V
+HPLcom/android/server/wallpaper/IWallpaperManagerService;->onBootPhase(I)V
+HPLcom/android/server/wallpaper/IWallpaperManagerService;->onUnlockUser(I)V
+HPLcom/android/server/webkit/SystemInterface;->enableFallbackLogic(Z)V
+HPLcom/android/server/webkit/SystemInterface;->enablePackageForAllUsers(Landroid/content/Context;Ljava/lang/String;Z)V
+HPLcom/android/server/webkit/SystemInterface;->enablePackageForUser(Ljava/lang/String;ZI)V
+HPLcom/android/server/webkit/SystemInterface;->getFactoryPackageVersion(Ljava/lang/String;)J
+HPLcom/android/server/webkit/SystemInterface;->getMultiProcessSetting(Landroid/content/Context;)I
+HPLcom/android/server/webkit/SystemInterface;->getPackageInfoForProvider(Landroid/webkit/WebViewProviderInfo;)Landroid/content/pm/PackageInfo;
+HPLcom/android/server/webkit/SystemInterface;->getPackageInfoForProviderAllUsers(Landroid/content/Context;Landroid/webkit/WebViewProviderInfo;)Ljava/util/List;
+HPLcom/android/server/webkit/SystemInterface;->getUserChosenWebViewProvider(Landroid/content/Context;)Ljava/lang/String;
+HPLcom/android/server/webkit/SystemInterface;->getWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
+HPLcom/android/server/webkit/SystemInterface;->isFallbackLogicEnabled()Z
+HPLcom/android/server/webkit/SystemInterface;->isMultiProcessDefaultEnabled()Z
+HPLcom/android/server/webkit/SystemInterface;->killPackageDependents(Ljava/lang/String;)V
+HPLcom/android/server/webkit/SystemInterface;->notifyZygote(Z)V
+HPLcom/android/server/webkit/SystemInterface;->onWebViewProviderChanged(Landroid/content/pm/PackageInfo;)I
+HPLcom/android/server/webkit/SystemInterface;->setMultiProcessSetting(Landroid/content/Context;I)V
+HPLcom/android/server/webkit/SystemInterface;->systemIsDebuggable()Z
+HPLcom/android/server/webkit/SystemInterface;->uninstallAndDisablePackageForAllUsers(Landroid/content/Context;Ljava/lang/String;)V
+HPLcom/android/server/webkit/SystemInterface;->updateUserSetting(Landroid/content/Context;Ljava/lang/String;)V
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$0yxrqH9eGY2qTjH1u_BvaVrXCSA;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$7uZtakUXzuXqF_Qht5Uq7LUvubI;->apply(Ljava/lang/Object;)Z
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$7voe_dEKk2BYMriCvPuvaznb9WQ;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$D0QJUvhaQkGgoMtOmjw5foY9F8M;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$JibsaX4YnJd0ta_wiDDdSp-PjQk;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$NonAppWindowContainers$FI_O7m2qEDfIRZef3D32AxG-rcs;->test(Ljava/lang/Object;)Z
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$qT01Aq6xt_ZOs86A1yDQe-qmPFQ;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$DisplayContent$qxt4izS31fb0LF2uo_OF9DMa7gc;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$puhYAP5tF0mSSJva-eUz59HnrkA;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V
+HPLcom/android/server/wm/-$$Lambda$WallpaperController$6pruPGLeSJAwNl9vGfC87eso21w;->apply(Ljava/lang/Object;)Z
HPLcom/android/server/wm/AnimationAdapter;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
HPLcom/android/server/wm/AnimationAdapter;->getBackgroundColor()I
HPLcom/android/server/wm/AnimationAdapter;->getDetachWallpaper()Z
@@ -174,551 +2165,427 @@ HPLcom/android/server/wm/AnimationAdapter;->getStatusBarTransitionsStartTime()J
HPLcom/android/server/wm/AnimationAdapter;->onAnimationCancelled(Landroid/view/SurfaceControl;)V
HPLcom/android/server/wm/AnimationAdapter;->startAnimation(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
HPLcom/android/server/wm/AnimationAdapter;->writeToProto(Landroid/util/proto/ProtoOutputStream;)V
-HPLcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;->apply(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;J)V
-HPLcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V
-HPLcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;->getDuration()J
-HPLcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;->writeToProtoInner(Landroid/util/proto/ProtoOutputStream;)V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->authenticate(JI)I
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->cancel()I
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->enroll([BII)I
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->enumerate()I
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getAuthenticatorId()J
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->notifySyspropsChanged()V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->ping()V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->postEnroll()I
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->preEnroll()J
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->remove(II)I
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setActiveGroup(ILjava/lang/String;)I
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setHALInstrumentation()V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->setNotify(Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;)J
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onAcquired(JII)V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onAuthenticated(JIILjava/util/ArrayList;)V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onEnrollResult(JIII)V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onEnumerate(JIII)V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onError(JII)V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->onRemoved(JIII)V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->ping()V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->hasHDRDisplay()Landroid/hardware/configstore/V1_0/OptionalBool;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->hasSyncFramework()Landroid/hardware/configstore/V1_0/OptionalBool;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->hasWideColorDisplay()Landroid/hardware/configstore/V1_0/OptionalBool;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->maxFrameBufferAcquiredBuffers()Landroid/hardware/configstore/V1_0/OptionalInt64;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->maxVirtualDisplaySize()Landroid/hardware/configstore/V1_0/OptionalUInt64;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->notifySyspropsChanged()V
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->ping()V
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->presentTimeOffsetFromVSyncNs()Landroid/hardware/configstore/V1_0/OptionalInt64;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->setHALInstrumentation()V
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->startGraphicsAllocatorService()Landroid/hardware/configstore/V1_0/OptionalBool;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->useContextPriority()Landroid/hardware/configstore/V1_0/OptionalBool;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->useHwcForRGBtoYUV()Landroid/hardware/configstore/V1_0/OptionalBool;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->useVrFlinger()Landroid/hardware/configstore/V1_0/OptionalBool;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->vsyncEventPhaseOffsetNs()Landroid/hardware/configstore/V1_0/OptionalInt64;
-HSPLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->vsyncSfEventPhaseOffsetNs()Landroid/hardware/configstore/V1_0/OptionalInt64;
-HSPLandroid/hardware/health/V2_0/IHealth;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/health/V2_0/IHealth;->getCapacity(Landroid/hardware/health/V2_0/IHealth$getCapacityCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->getChargeCounter(Landroid/hardware/health/V2_0/IHealth$getChargeCounterCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->getChargeStatus(Landroid/hardware/health/V2_0/IHealth$getChargeStatusCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->getCurrentAverage(Landroid/hardware/health/V2_0/IHealth$getCurrentAverageCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->getCurrentNow(Landroid/hardware/health/V2_0/IHealth$getCurrentNowCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/health/V2_0/IHealth;->getDiskStats(Landroid/hardware/health/V2_0/IHealth$getDiskStatsCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->getEnergyCounter(Landroid/hardware/health/V2_0/IHealth$getEnergyCounterCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/health/V2_0/IHealth;->getHealthInfo(Landroid/hardware/health/V2_0/IHealth$getHealthInfoCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->getStorageInfo(Landroid/hardware/health/V2_0/IHealth$getStorageInfoCallback;)V
-HSPLandroid/hardware/health/V2_0/IHealth;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/health/V2_0/IHealth;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/health/V2_0/IHealth;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/health/V2_0/IHealth;->notifySyspropsChanged()V
-HSPLandroid/hardware/health/V2_0/IHealth;->ping()V
-HSPLandroid/hardware/health/V2_0/IHealth;->registerCallback(Landroid/hardware/health/V2_0/IHealthInfoCallback;)I
-HSPLandroid/hardware/health/V2_0/IHealth;->setHALInstrumentation()V
-HSPLandroid/hardware/health/V2_0/IHealth;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/health/V2_0/IHealth;->unregisterCallback(Landroid/hardware/health/V2_0/IHealthInfoCallback;)I
-HSPLandroid/hardware/health/V2_0/IHealth;->update()I
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->healthInfoChanged(Landroid/hardware/health/V2_0/HealthInfo;)V
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->ping()V
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/health/V2_0/IHealthInfoCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->getName(Landroid/hardware/oemlock/V1_0/IOemLock$getNameCallback;)V
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->isOemUnlockAllowedByCarrier(Landroid/hardware/oemlock/V1_0/IOemLock$isOemUnlockAllowedByCarrierCallback;)V
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->isOemUnlockAllowedByDevice(Landroid/hardware/oemlock/V1_0/IOemLock$isOemUnlockAllowedByDeviceCallback;)V
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->notifySyspropsChanged()V
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->ping()V
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->setHALInstrumentation()V
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->setOemUnlockAllowedByCarrier(ZLjava/util/ArrayList;)I
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->setOemUnlockAllowedByDevice(Z)I
-HSPLandroid/hardware/oemlock/V1_0/IOemLock;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/usb/V1_0/IUsb;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/usb/V1_0/IUsb;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/usb/V1_0/IUsb;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/usb/V1_0/IUsb;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/usb/V1_0/IUsb;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/usb/V1_0/IUsb;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/usb/V1_0/IUsb;->notifySyspropsChanged()V
-HSPLandroid/hardware/usb/V1_0/IUsb;->ping()V
-HSPLandroid/hardware/usb/V1_0/IUsb;->queryPortStatus()V
-HSPLandroid/hardware/usb/V1_0/IUsb;->setCallback(Landroid/hardware/usb/V1_0/IUsbCallback;)V
-HSPLandroid/hardware/usb/V1_0/IUsb;->setHALInstrumentation()V
-HSPLandroid/hardware/usb/V1_0/IUsb;->switchRole(Ljava/lang/String;Landroid/hardware/usb/V1_0/PortRole;)V
-HSPLandroid/hardware/usb/V1_0/IUsb;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->notifyPortStatusChange(Ljava/util/ArrayList;I)V
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->notifyRoleSwitchStatus(Ljava/lang/String;Landroid/hardware/usb/V1_0/PortRole;I)V
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->ping()V
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/usb/V1_0/IUsbCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->notifyPortStatusChange_1_1(Ljava/util/ArrayList;I)V
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->ping()V
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/usb/V1_1/IUsbCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/weaver/V1_0/IWeaver$getConfigCallback;->onValues(ILandroid/hardware/weaver/V1_0/WeaverConfig;)V
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->getConfig(Landroid/hardware/weaver/V1_0/IWeaver$getConfigCallback;)V
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->notifySyspropsChanged()V
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->ping()V
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->read(ILjava/util/ArrayList;Landroid/hardware/weaver/V1_0/IWeaver$readCallback;)V
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->setHALInstrumentation()V
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/weaver/V1_0/IWeaver;->write(ILjava/util/ArrayList;Ljava/util/ArrayList;)I
-HSPLandroid/hardware/wifi/V1_0/IWifi$getChipCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip;)V
-HSPLandroid/hardware/wifi/V1_0/IWifi$getChipIdsCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifi;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_0/IWifi;->getChip(ILandroid/hardware/wifi/V1_0/IWifi$getChipCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifi;->getChipIds(Landroid/hardware/wifi/V1_0/IWifi$getChipIdsCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifi;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_0/IWifi;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifi;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifi;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_0/IWifi;->isStarted()Z
-HSPLandroid/hardware/wifi/V1_0/IWifi;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_0/IWifi;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_0/IWifi;->ping()V
-HSPLandroid/hardware/wifi/V1_0/IWifi;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifi;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_0/IWifi;->start()Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifi;->stop()Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifi;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$createNanIfaceCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiNanIface;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$createRttControllerCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiRttController;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$createStaIfaceCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getApIfaceNamesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getAvailableModesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getDebugHostWakeReasonStatsCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/WifiDebugHostWakeReasonStats;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getDebugRingBuffersStatusCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getModeCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getNanIfaceCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiNanIface;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getNanIfaceNamesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getP2pIfaceNamesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiStaIface;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceNamesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$requestChipDebugInfoCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$requestDriverDebugDumpCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChip$requestFirmwareDebugDumpCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onChipReconfigureFailure(Landroid/hardware/wifi/V1_0/WifiStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onChipReconfigured(I)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onDebugErrorAlert(ILjava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onDebugRingBufferDataAvailable(Landroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onIfaceAdded(ILjava/lang/String;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiChipEventCallback;->onIfaceRemoved(ILjava/lang/String;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->onFailure(Landroid/hardware/wifi/V1_0/WifiStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->onStart()V
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->onStop()V
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->ping()V
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_0/IWifiEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiIface$getNameCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/lang/String;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiIface$getTypeCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventClusterEvent(Landroid/hardware/wifi/V1_0/NanClusterEventInd;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventDataPathConfirm(Landroid/hardware/wifi/V1_0/NanDataPathConfirmInd;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventDataPathRequest(Landroid/hardware/wifi/V1_0/NanDataPathRequestInd;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventDataPathTerminated(I)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventDisabled(Landroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventFollowupReceived(Landroid/hardware/wifi/V1_0/NanFollowupReceivedInd;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventMatch(Landroid/hardware/wifi/V1_0/NanMatchInd;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventMatchExpired(BI)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventPublishTerminated(BLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventSubscribeTerminated(BLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->eventTransmitFollowup(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyCapabilitiesResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;Landroid/hardware/wifi/V1_0/NanCapabilities;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyConfigResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyCreateDataInterfaceResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyDeleteDataInterfaceResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyDisableResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyEnableResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyInitiateDataPathResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;I)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyRespondToDataPathIndicationResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyStartPublishResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;B)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyStartSubscribeResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;B)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyStopPublishResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyStopSubscribeResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyTerminateDataPathResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->notifyTransmitFollowupResponse(SLandroid/hardware/wifi/V1_0/WifiNanStatus;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->ping()V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController$getResponderInfoCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/RttResponder;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->disableResponder(I)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->enableResponder(ILandroid/hardware/wifi/V1_0/WifiChannelInfo;ILandroid/hardware/wifi/V1_0/RttResponder;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->getBoundIface(Landroid/hardware/wifi/V1_0/IWifiRttController$getBoundIfaceCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->getCapabilities(Landroid/hardware/wifi/V1_0/IWifiRttController$getCapabilitiesCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->getResponderInfo(Landroid/hardware/wifi/V1_0/IWifiRttController$getResponderInfoCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->ping()V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->rangeCancel(ILjava/util/ArrayList;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->rangeRequest(ILjava/util/ArrayList;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->setLci(ILandroid/hardware/wifi/V1_0/RttLciInformation;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->setLcr(ILandroid/hardware/wifi/V1_0/RttLcrInformation;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttController;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->ping()V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface$getApfPacketFilterCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface$getBackgroundScanCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface$getCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;I)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface$getDebugRxPacketFatesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface$getDebugTxPacketFatesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface$getLinkLayerStatsCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaLinkLayerStats;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface$getRoamingCapabilitiesCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Landroid/hardware/wifi/V1_0/StaRoamingCapabilities;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->configureRoaming(Landroid/hardware/wifi/V1_0/StaRoamingConfig;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->disableLinkLayerStatsCollection()Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->enableLinkLayerStatsCollection(Z)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->enableNdOffload(Z)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getApfPacketFilterCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getApfPacketFilterCapabilitiesCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getBackgroundScanCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getBackgroundScanCapabilitiesCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getCapabilitiesCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getDebugRxPacketFates(Landroid/hardware/wifi/V1_0/IWifiStaIface$getDebugRxPacketFatesCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getDebugTxPacketFates(Landroid/hardware/wifi/V1_0/IWifiStaIface$getDebugTxPacketFatesCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getLinkLayerStats(Landroid/hardware/wifi/V1_0/IWifiStaIface$getLinkLayerStatsCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getRoamingCapabilities(Landroid/hardware/wifi/V1_0/IWifiStaIface$getRoamingCapabilitiesCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->getValidFrequenciesForBand(ILandroid/hardware/wifi/V1_0/IWifiStaIface$getValidFrequenciesForBandCallback;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->installApfPacketFilter(ILjava/util/ArrayList;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->ping()V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->registerEventCallback(Landroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->setRoamingState(B)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->setScanningMacOui([B)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->startBackgroundScan(ILandroid/hardware/wifi/V1_0/StaBackgroundScanParameters;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->startDebugPacketFateMonitoring()Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->startRssiMonitoring(III)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->startSendingKeepAlivePackets(ILjava/util/ArrayList;S[B[BI)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->stopBackgroundScan(I)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->stopRssiMonitoring(I)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->stopSendingKeepAlivePackets(I)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIface;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->onBackgroundFullScanResult(IILandroid/hardware/wifi/V1_0/StaScanResult;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->onBackgroundScanFailure(I)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->onBackgroundScanResults(ILjava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->onRssiThresholdBreached(I[BI)V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->ping()V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->ping()V
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->resetTxPowerScenario()Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->selectTxPowerScenario(I)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_1/IWifiChip;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->ping()V
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->registerEventCallback_1_2(Landroid/hardware/wifi/V1_2/IWifiChipEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->selectTxPowerScenario_1_2(I)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_2/IWifiChip;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->onRadioModeChange(Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->ping()V
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_2/IWifiChipEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->configRequest_1_2(SLandroid/hardware/wifi/V1_0/NanConfigRequest;Landroid/hardware/wifi/V1_2/NanConfigRequestSupplemental;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->enableRequest_1_2(SLandroid/hardware/wifi/V1_0/NanEnableRequest;Landroid/hardware/wifi/V1_2/NanConfigRequestSupplemental;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->ping()V
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->registerEventCallback_1_2(Landroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;)Landroid/hardware/wifi/V1_0/WifiStatus;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIface;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->eventDataPathConfirm_1_2(Landroid/hardware/wifi/V1_2/NanDataPathConfirmInd;)V
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->eventDataPathScheduleUpdate(Landroid/hardware/wifi/V1_2/NanDataPathScheduleUpdateInd;)V
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->ping()V
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/V1_2/IWifiStaIface$readApfPacketFilterDataCallback;->onValues(Landroid/hardware/wifi/V1_0/WifiStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$listNetworksCallback;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$getMacAddressCallback;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;[B)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->addExtRadioWork(Ljava/lang/String;IILandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$addExtRadioWorkCallback;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->addRxFilter(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->cancelWps()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->disconnect()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->enableAutoReconnect(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->getMacAddress(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$getMacAddressCallback;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateAnqpQuery([BLjava/util/ArrayList;Ljava/util/ArrayList;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateHs20IconQuery([BLjava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateTdlsDiscover([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateTdlsSetup([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->initiateTdlsTeardown([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->ping()V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->reassociate()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->reconnect()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->registerCallback(Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->removeExtRadioWork(I)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->removeRxFilter(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setBtCoexistenceMode(B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setBtCoexistenceScanModeEnabled(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setCountryCode([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setExternalSim(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setPowerSave(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->setSuspendModeEnabled(Z)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startRxFilter()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startWpsPbc([B)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startWpsPinDisplay([BLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$startWpsPinDisplayCallback;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startWpsPinKeypad(Ljava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->startWpsRegistrar([BLjava/lang/String;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->stopRxFilter()Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onAnqpQueryDone([BLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback$AnqpData;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback$Hs20AnqpData;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onAssociationRejected([BIZ)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onAuthenticationTimeout([B)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onBssidChanged(B[B)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onDisconnected([BZI)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onEapFailure()V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onExtRadioWorkStart(I)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onExtRadioWorkTimeout(I)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onHs20DeauthImminentNotice([BIILjava/lang/String;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onHs20IconQueryDone([BLjava/lang/String;Ljava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onHs20SubscriptionRemediation([BBLjava/lang/String;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onNetworkAdded(I)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onNetworkRemoved(I)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onStateChanged(I[BILjava/util/ArrayList;)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onWpsEventFail([BSS)V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onWpsEventPbcOverlap()V
-HSPLandroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;->onWpsEventSuccess()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant$addInterfaceCallback;->onValues(Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;)V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->addInterface(Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;Landroid/hardware/wifi/supplicant/V1_1/ISupplicant$addInterfaceCallback;)V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->ping()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->removeInterface(Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->terminate()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicant;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->ping()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->registerCallback_1_1(Landroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;)Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->asBinder()Landroid/os/IHwBinder;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->getDebugInfo()Landroid/hidl/base/V1_0/DebugInfo;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->getHashChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->interfaceChain()Ljava/util/ArrayList;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->interfaceDescriptor()Ljava/lang/String;
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->notifySyspropsChanged()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->onEapFailure_1_1(I)V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->ping()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->setHALInstrumentation()V
-HSPLandroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
-HSPLandroid/media/IMediaExtractorUpdateService;->loadPlugins(Ljava/lang/String;)V
-HSPLandroid/net/metrics/INetdEventListener;->onConnectEvent(IIILjava/lang/String;II)V
-HSPLandroid/net/metrics/INetdEventListener;->onDnsEvent(IIIILjava/lang/String;[Ljava/lang/String;II)V
-HSPLandroid/net/metrics/INetdEventListener;->onPrivateDnsValidationEvent(ILjava/lang/String;Ljava/lang/String;Z)V
-HSPLandroid/net/metrics/INetdEventListener;->onTcpSocketStatsEvent([I[I[I[I[I)V
-HSPLandroid/net/metrics/INetdEventListener;->onWakeupEvent(Ljava/lang/String;III[BLjava/lang/String;Ljava/lang/String;IIJ)V
-HSPLandroid/net/wifi/IClientInterface;->getInterfaceName()Ljava/lang/String;
-HSPLandroid/net/wifi/IClientInterface;->getMacAddress()[B
-HSPLandroid/net/wifi/IClientInterface;->getPacketCounters()[I
-HSPLandroid/net/wifi/IClientInterface;->getWifiScannerImpl()Landroid/net/wifi/IWifiScannerImpl;
-HSPLandroid/net/wifi/IClientInterface;->setMacAddress([B)Z
-HSPLandroid/net/wifi/IClientInterface;->signalPoll()[I
-HSPLandroid/net/wifi/IPnoScanEvent;->OnPnoNetworkFound()V
-HSPLandroid/net/wifi/IPnoScanEvent;->OnPnoScanFailed()V
-HSPLandroid/net/wifi/IPnoScanEvent;->OnPnoScanOverOffloadFailed(I)V
-HSPLandroid/net/wifi/IPnoScanEvent;->OnPnoScanOverOffloadStarted()V
-HSPLandroid/net/wifi/IScanEvent;->OnScanFailed()V
-HSPLandroid/net/wifi/IScanEvent;->OnScanResultReady()V
-HSPLandroid/net/wifi/IWifiScannerImpl;->abortScan()V
-HSPLandroid/net/wifi/IWifiScannerImpl;->getPnoScanResults()[Lcom/android/server/wifi/wificond/NativeScanResult;
-HSPLandroid/net/wifi/IWifiScannerImpl;->getScanResults()[Lcom/android/server/wifi/wificond/NativeScanResult;
-HSPLandroid/net/wifi/IWifiScannerImpl;->scan(Lcom/android/server/wifi/wificond/SingleScanSettings;)Z
-HSPLandroid/net/wifi/IWifiScannerImpl;->startPnoScan(Lcom/android/server/wifi/wificond/PnoSettings;)Z
-HSPLandroid/net/wifi/IWifiScannerImpl;->stopPnoScan()Z
-HSPLandroid/net/wifi/IWifiScannerImpl;->subscribePnoScanEvents(Landroid/net/wifi/IPnoScanEvent;)V
-HSPLandroid/net/wifi/IWifiScannerImpl;->subscribeScanEvents(Landroid/net/wifi/IScanEvent;)V
-HSPLandroid/net/wifi/IWifiScannerImpl;->unsubscribePnoScanEvents()V
-HSPLandroid/net/wifi/IWifiScannerImpl;->unsubscribeScanEvents()V
-HSPLandroid/net/wifi/IWificond;->GetApInterfaces()Ljava/util/List;
-HSPLandroid/net/wifi/IWificond;->GetClientInterfaces()Ljava/util/List;
-HSPLandroid/net/wifi/IWificond;->RegisterCallback(Landroid/net/wifi/IInterfaceEventCallback;)V
-HSPLandroid/net/wifi/IWificond;->UnregisterCallback(Landroid/net/wifi/IInterfaceEventCallback;)V
-HSPLandroid/net/wifi/IWificond;->createApInterface(Ljava/lang/String;)Landroid/net/wifi/IApInterface;
-HSPLandroid/net/wifi/IWificond;->createClientInterface(Ljava/lang/String;)Landroid/net/wifi/IClientInterface;
-HSPLandroid/net/wifi/IWificond;->disableSupplicant()Z
-HSPLandroid/net/wifi/IWificond;->enableSupplicant()Z
-HSPLandroid/net/wifi/IWificond;->getAvailable2gChannels()[I
-HSPLandroid/net/wifi/IWificond;->getAvailable5gNonDFSChannels()[I
-HSPLandroid/net/wifi/IWificond;->getAvailableDFSChannels()[I
-HSPLandroid/net/wifi/IWificond;->tearDownApInterface(Ljava/lang/String;)Z
-HSPLandroid/net/wifi/IWificond;->tearDownClientInterface(Ljava/lang/String;)Z
-HSPLandroid/net/wifi/IWificond;->tearDownInterfaces()V
-HSPLcom/android/server/AlarmManagerInternal;->removeAlarmsForUid(I)V
+HPLcom/android/server/wm/AppTransition;->isRunning()Z
+HPLcom/android/server/wm/AppTransition;->isTransitionSet()Z
+HPLcom/android/server/wm/AppWindowToken;->asAppWindowToken()Lcom/android/server/wm/AppWindowToken;
+HPLcom/android/server/wm/AppWindowToken;->checkAppWindowsReadyToShow()V
+HPLcom/android/server/wm/AppWindowToken;->checkCompleteDeferredRemoval()Z
+HPLcom/android/server/wm/AppWindowToken;->containsDismissKeyguardWindow()Z
+HPLcom/android/server/wm/AppWindowToken;->containsShowWhenLockedWindow()Z
+HPLcom/android/server/wm/AppWindowToken;->findMainWindow()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/AppWindowToken;->findMainWindow(Z)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/AppWindowToken;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/AppWindowToken;->forAllWindowsUnchecked(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/AppWindowToken;->getTask()Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/AppWindowToken;->isAppAnimating()Z
+HPLcom/android/server/wm/AppWindowToken;->isClientHidden()Z
+HPLcom/android/server/wm/AppWindowToken;->isLetterboxOverlappingWith(Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/AppWindowToken;->isReallyAnimating()Z
+HPLcom/android/server/wm/AppWindowToken;->isRelaunching()Z
+HPLcom/android/server/wm/AppWindowToken;->isSelfAnimating()Z
+HPLcom/android/server/wm/AppWindowToken;->isWaitingForTransitionStart()Z
+HPLcom/android/server/wm/AppWindowToken;->layoutLetterbox(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/AppWindowToken;->needsZBoost()Z
+HPLcom/android/server/wm/AppWindowToken;->prepareSurfaces()V
+HPLcom/android/server/wm/AppWindowToken;->updateDrawnWindowStates(Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/AppWindowToken;->updateLetterboxSurface(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/AppWindowToken;->windowsAreFocusable()Z
+HPLcom/android/server/wm/BoundsAnimationTarget;->onAnimationEnd(ZLandroid/graphics/Rect;Z)V
+HPLcom/android/server/wm/BoundsAnimationTarget;->onAnimationStart(ZZ)V
+HPLcom/android/server/wm/BoundsAnimationTarget;->setPinnedStackSize(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/BoundsAnimationTarget;->shouldDeferStartOnMoveToFullscreen()Z
+HPLcom/android/server/wm/ConfigurationContainer;->getActivityType()I
+HPLcom/android/server/wm/ConfigurationContainer;->getBounds()Landroid/graphics/Rect;
+HPLcom/android/server/wm/ConfigurationContainer;->getBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/ConfigurationContainer;->getConfiguration()Landroid/content/res/Configuration;
+HPLcom/android/server/wm/ConfigurationContainer;->getOverrideBounds()Landroid/graphics/Rect;
+HPLcom/android/server/wm/ConfigurationContainer;->getOverrideConfiguration()Landroid/content/res/Configuration;
+HPLcom/android/server/wm/ConfigurationContainer;->getWindowConfiguration()Landroid/app/WindowConfiguration;
+HPLcom/android/server/wm/ConfigurationContainer;->getWindowingMode()I
+HPLcom/android/server/wm/ConfigurationContainer;->inFreeformWindowingMode()Z
+HPLcom/android/server/wm/ConfigurationContainer;->inPinnedWindowingMode()Z
+HPLcom/android/server/wm/ConfigurationContainer;->inSplitScreenPrimaryWindowingMode()Z
+HPLcom/android/server/wm/ConfigurationContainer;->inSplitScreenWindowingMode()Z
+HPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeAssistant()Z
+HPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeHome()Z
+HPLcom/android/server/wm/ConfigurationContainer;->isActivityTypeStandardOrUndefined()Z
+HPLcom/android/server/wm/ConfigurationContainer;->isAlwaysOnTop()Z
+HPLcom/android/server/wm/ConfigurationContainer;->isCompatible(II)Z
+HPLcom/android/server/wm/ConfigurationContainer;->matchParentBounds()Z
+HPLcom/android/server/wm/Dimmer$SurfaceAnimatorStarter;->startAnimation(Lcom/android/server/wm/SurfaceAnimator;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;Z)V
+HPLcom/android/server/wm/Dimmer;->resetDimStates()V
+HPLcom/android/server/wm/Dimmer;->updateDims(Landroid/view/SurfaceControl$Transaction;Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/DisplayContent$AboveAppWindowContainers;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;)V
+HPLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->getDimmer()Lcom/android/server/wm/Dimmer;
+HPLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->lambda$new$1(Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->prepareSurfaces()V
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->assignStackOrdering(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->forAllExitingAppTokenWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->getHomeStack()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->getSplitScreenPrimaryStack()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->getStack(II)Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->removeExistingAppTokensIfPossible()V
+HPLcom/android/server/wm/DisplayContent$TaskStackContainers;->setExitingTokensHasVisible(Z)V
+HPLcom/android/server/wm/DisplayContent;->access$100(Lcom/android/server/wm/DisplayContent;)Lcom/android/server/wm/DisplayContent$TaskStackContainers;
+HPLcom/android/server/wm/DisplayContent;->adjustForImeIfNeeded()V
+HPLcom/android/server/wm/DisplayContent;->calculateBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/DisplayContent;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/DisplayContent;->getAppWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/AppWindowToken;
+HPLcom/android/server/wm/DisplayContent;->getBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/DisplayContent;->getDisplayId()I
+HPLcom/android/server/wm/DisplayContent;->getDisplayInfo()Landroid/view/DisplayInfo;
+HPLcom/android/server/wm/DisplayContent;->getDockedDividerController()Lcom/android/server/wm/DockedStackDividerController;
+HPLcom/android/server/wm/DisplayContent;->getHomeStack()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent;->getSplitScreenPrimaryStack()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent;->getSplitScreenPrimaryStackIgnoringVisibility()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent;->getStack(II)Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent;->getTopStackInWindowingMode(I)Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/DisplayContent;->getWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/WindowToken;
+HPLcom/android/server/wm/DisplayContent;->isLayoutNeeded()Z
+HPLcom/android/server/wm/DisplayContent;->isStackVisible(I)Z
+HPLcom/android/server/wm/DisplayContent;->lambda$new$0(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$new$1(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$new$3(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/DisplayContent;->lambda$new$4(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$new$5(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$new$7(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->lambda$new$8(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/DisplayContent;->prepareSurfaces()V
+HPLcom/android/server/wm/DisplayContent;->resetAnimationBackgroundAnimator()V
+HPLcom/android/server/wm/DisplayContent;->setTouchExcludeRegion(Lcom/android/server/wm/Task;)V
+HPLcom/android/server/wm/DisplayContent;->skipTraverseChild(Lcom/android/server/wm/WindowContainer;)Z
+HPLcom/android/server/wm/DockedStackDividerController;->isResizing()Z
+HPLcom/android/server/wm/DragDropController;->dragDropActiveLocked()Z
+HPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Ljava/lang/Object;)V
+HPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->access$100(Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;Z)V
+HPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->updateInputWindows(Z)V
+HPLcom/android/server/wm/InputMonitor;->access$1000(Lcom/android/server/wm/InputMonitor;)[Lcom/android/server/input/InputWindowHandle;
+HPLcom/android/server/wm/InputMonitor;->access$1100(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/input/InputWindowHandle;
+HPLcom/android/server/wm/InputMonitor;->access$1200(Lcom/android/server/wm/InputMonitor;)V
+HPLcom/android/server/wm/InputMonitor;->access$1300(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/InputMonitor;->access$200(Lcom/android/server/wm/InputMonitor;)Z
+HPLcom/android/server/wm/InputMonitor;->access$202(Lcom/android/server/wm/InputMonitor;Z)Z
+HPLcom/android/server/wm/InputMonitor;->access$302(Lcom/android/server/wm/InputMonitor;Z)Z
+HPLcom/android/server/wm/InputMonitor;->access$400(Lcom/android/server/wm/InputMonitor;)Z
+HPLcom/android/server/wm/InputMonitor;->access$402(Lcom/android/server/wm/InputMonitor;Z)Z
+HPLcom/android/server/wm/InputMonitor;->access$500(Lcom/android/server/wm/InputMonitor;)Z
+HPLcom/android/server/wm/InputMonitor;->access$502(Lcom/android/server/wm/InputMonitor;Z)Z
+HPLcom/android/server/wm/InputMonitor;->access$600(Lcom/android/server/wm/InputMonitor;)Landroid/graphics/Rect;
+HPLcom/android/server/wm/InputMonitor;->access$702(Lcom/android/server/wm/InputMonitor;Z)Z
+HPLcom/android/server/wm/InputMonitor;->access$800(Lcom/android/server/wm/InputMonitor;)Lcom/android/server/wm/WindowManagerService;
+HPLcom/android/server/wm/InputMonitor;->addInputWindowHandle(Lcom/android/server/input/InputWindowHandle;)V
+HPLcom/android/server/wm/InputMonitor;->addInputWindowHandle(Lcom/android/server/input/InputWindowHandle;Lcom/android/server/wm/WindowState;IIZZZ)V
+HPLcom/android/server/wm/InputMonitor;->clearInputWindowHandlesLw()V
+HPLcom/android/server/wm/InputMonitor;->getInputConsumer(Ljava/lang/String;I)Lcom/android/server/wm/InputConsumerImpl;
+HPLcom/android/server/wm/InputMonitor;->layoutInputConsumers(II)V
+HPLcom/android/server/wm/InputMonitor;->updateInputWindowsLw(Z)V
+HPLcom/android/server/wm/PointerEventDispatcher;->onInputEvent(Landroid/view/InputEvent;I)V
+HPLcom/android/server/wm/RootWindowContainer$MyHandler;->handleMessage(Landroid/os/Message;)V
+HPLcom/android/server/wm/RootWindowContainer;->applySurfaceChangesTransaction(ZII)V
+HPLcom/android/server/wm/RootWindowContainer;->getAppWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/AppWindowToken;
+HPLcom/android/server/wm/RootWindowContainer;->getDisplayContent(I)Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/RootWindowContainer;->getStack(II)Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/RootWindowContainer;->handleNotObscuredLocked(Lcom/android/server/wm/WindowState;ZZ)Z
+HPLcom/android/server/wm/RootWindowContainer;->hasPendingLayoutChanges(Lcom/android/server/wm/WindowAnimator;)Z
+HPLcom/android/server/wm/RootWindowContainer;->isLayoutNeeded()Z
+HPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacement(Z)V
+HPLcom/android/server/wm/RootWindowContainer;->scheduleAnimation()V
+HPLcom/android/server/wm/Session;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLcom/android/server/wm/Session;->pokeDrawLock(Landroid/os/IBinder;)V
+HPLcom/android/server/wm/SurfaceAnimationRunner$AnimatorFactory;->makeAnimator()Landroid/animation/ValueAnimator;
+HPLcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;->access$000(Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;)Z
+HPLcom/android/server/wm/SurfaceAnimationRunner;->applyTransformation(Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;Landroid/view/SurfaceControl$Transaction;J)V
+HPLcom/android/server/wm/SurfaceAnimationRunner;->lambda$startAnimationLocked$3(Lcom/android/server/wm/SurfaceAnimationRunner;Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;)V
+HPLcom/android/server/wm/SurfaceAnimationRunner;->scheduleApplyTransaction()V
+HPLcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;->onAnimationFinished(Lcom/android/server/wm/AnimationAdapter;)V
+HPLcom/android/server/wm/SurfaceAnimator;->getAnimation()Lcom/android/server/wm/AnimationAdapter;
+HPLcom/android/server/wm/SurfaceAnimator;->hasLeash()Z
+HPLcom/android/server/wm/SurfaceAnimator;->isAnimating()Z
+HPLcom/android/server/wm/SurfaceBuilderFactory;->make(Landroid/view/SurfaceSession;)Landroid/view/SurfaceControl$Builder;
+HPLcom/android/server/wm/Task;->canAffectSystemUiFlags()Z
+HPLcom/android/server/wm/Task;->cropWindowsToStackBounds()Z
+HPLcom/android/server/wm/Task;->getDimBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/Task;->getDimmer()Lcom/android/server/wm/Dimmer;
+HPLcom/android/server/wm/Task;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/Task;->getTopVisibleAppToken()Lcom/android/server/wm/AppWindowToken;
+HPLcom/android/server/wm/Task;->isFullscreen()Z
+HPLcom/android/server/wm/Task;->isResizeable()Z
+HPLcom/android/server/wm/Task;->isTaskAnimating()Z
+HPLcom/android/server/wm/Task;->prepareSurfaces()V
+HPLcom/android/server/wm/Task;->useCurrentBounds()Z
+HPLcom/android/server/wm/TaskPositioningController;->isPositioningLocked()Z
+HPLcom/android/server/wm/TaskSnapshotPersister$DirectoryResolver;->getSystemDirectoryForUser(I)Ljava/io/File;
+HPLcom/android/server/wm/TaskStack;->checkCompleteDeferredRemoval()Z
+HPLcom/android/server/wm/TaskStack;->fillsParent()Z
+HPLcom/android/server/wm/TaskStack;->getBounds()Landroid/graphics/Rect;
+HPLcom/android/server/wm/TaskStack;->getBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/TaskStack;->getDimBounds(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/TaskStack;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/TaskStack;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;
+HPLcom/android/server/wm/TaskStack;->getStackOutset()I
+HPLcom/android/server/wm/TaskStack;->hideAnimationSurface()V
+HPLcom/android/server/wm/TaskStack;->isAdjustedForMinimizedDockedStack()Z
+HPLcom/android/server/wm/TaskStack;->isForceScaled()Z
+HPLcom/android/server/wm/TaskStack;->isTaskAnimating()Z
+HPLcom/android/server/wm/TaskStack;->prepareSurfaces()V
+HPLcom/android/server/wm/TaskStack;->resetAdjustedForIme(Z)V
+HPLcom/android/server/wm/TaskStack;->resetAnimationBackgroundAnimator()V
+HPLcom/android/server/wm/TaskStack;->setTouchExcludeRegion(Lcom/android/server/wm/Task;ILandroid/graphics/Region;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/TaskStack;->shouldIgnoreInput()Z
+HPLcom/android/server/wm/TaskStack;->useCurrentBounds()Z
+HPLcom/android/server/wm/TaskTapPointerEventListener;->getDisplayId()I
+HPLcom/android/server/wm/TaskTapPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V
+HPLcom/android/server/wm/TaskTapPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;I)V
+HPLcom/android/server/wm/TransactionFactory;->make()Landroid/view/SurfaceControl$Transaction;
+HPLcom/android/server/wm/WallpaperController;->hideWallpapers(Lcom/android/server/wm/WindowState;)V
+HPLcom/android/server/wm/WallpaperController;->isWallpaperTarget(Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/WallpaperController;->lambda$new$0(Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/WallpaperWindowToken;->hideWallpaperToken(ZLjava/lang/String;)V
+HPLcom/android/server/wm/WindowAnimationSpec;->apply(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;J)V
+HPLcom/android/server/wm/WindowAnimationSpec;->needsEarlyWakeup()Z
+HPLcom/android/server/wm/WindowAnimator;->animate(J)V
+HPLcom/android/server/wm/WindowAnimator;->executeAfterPrepareSurfacesRunnables()V
+HPLcom/android/server/wm/WindowAnimator;->getDisplayContentsAnimatorLocked(I)Lcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;
+HPLcom/android/server/wm/WindowAnimator;->getScreenRotationAnimationLocked(I)Lcom/android/server/wm/ScreenRotationAnimation;
+HPLcom/android/server/wm/WindowAnimator;->scheduleAnimation()V
+HPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Lcom/android/server/wm/WindowState;)Z
+HPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Ljava/lang/Object;)Z
+HPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->release()V
+HPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->setConsumer(Ljava/util/function/Consumer;)V
+HPLcom/android/server/wm/WindowContainer;->access$100(Lcom/android/server/wm/WindowContainer;)Landroid/util/Pools$SynchronizedPool;
+HPLcom/android/server/wm/WindowContainer;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/WindowContainer;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V
+HPLcom/android/server/wm/WindowContainer;->checkAppWindowsReadyToShow()V
+HPLcom/android/server/wm/WindowContainer;->checkCompleteDeferredRemoval()Z
+HPLcom/android/server/wm/WindowContainer;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/WindowContainer;->forAllWindows(Ljava/util/function/Consumer;Z)V
+HPLcom/android/server/wm/WindowContainer;->getAnimation()Lcom/android/server/wm/AnimationAdapter;
+HPLcom/android/server/wm/WindowContainer;->getChildAt(I)Lcom/android/server/wm/WindowContainer;
+HPLcom/android/server/wm/WindowContainer;->getChildCount()I
+HPLcom/android/server/wm/WindowContainer;->getDimmer()Lcom/android/server/wm/Dimmer;
+HPLcom/android/server/wm/WindowContainer;->getParent()Lcom/android/server/wm/WindowContainer;
+HPLcom/android/server/wm/WindowContainer;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;
+HPLcom/android/server/wm/WindowContainer;->getPrefixOrderIndex(Lcom/android/server/wm/WindowContainer;)I
+HPLcom/android/server/wm/WindowContainer;->getSurfaceControl()Landroid/view/SurfaceControl;
+HPLcom/android/server/wm/WindowContainer;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowContainer;->isAnimating()Z
+HPLcom/android/server/wm/WindowContainer;->isAppAnimating()Z
+HPLcom/android/server/wm/WindowContainer;->isSelfAnimating()Z
+HPLcom/android/server/wm/WindowContainer;->isSelfOrChildAnimating()Z
+HPLcom/android/server/wm/WindowContainer;->needsZBoost()Z
+HPLcom/android/server/wm/WindowContainer;->obtainConsumerWrapper(Ljava/util/function/Consumer;)Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;
+HPLcom/android/server/wm/WindowContainer;->onAppTransitionDone()V
+HPLcom/android/server/wm/WindowContainer;->prepareSurfaces()V
+HPLcom/android/server/wm/WindowContainer;->scheduleAnimation()V
+HPLcom/android/server/wm/WindowManagerInternal$OnHardKeyboardStatusChangeListener;->onHardKeyboardStatusChange(Z)V
+HPLcom/android/server/wm/WindowManagerInternal$WindowsForAccessibilityCallback;->onWindowsForAccessibilityChanged(Ljava/util/List;)V
+HPLcom/android/server/wm/WindowManagerInternal;->addWindowToken(Landroid/os/IBinder;II)V
+HPLcom/android/server/wm/WindowManagerInternal;->clearLastInputMethodWindowForTransition()V
+HPLcom/android/server/wm/WindowManagerInternal;->computeWindowsForAccessibility()V
+HPLcom/android/server/wm/WindowManagerInternal;->getCompatibleMagnificationSpecForWindow(Landroid/os/IBinder;)Landroid/view/MagnificationSpec;
+HPLcom/android/server/wm/WindowManagerInternal;->getFocusedWindowToken()Landroid/os/IBinder;
+HPLcom/android/server/wm/WindowManagerInternal;->getInputMethodWindowVisibleHeight()I
+HPLcom/android/server/wm/WindowManagerInternal;->getMagnificationRegion(Landroid/graphics/Region;)V
+HPLcom/android/server/wm/WindowManagerInternal;->getWindowFrame(Landroid/os/IBinder;Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowManagerInternal;->getWindowOwnerUserId(Landroid/os/IBinder;)I
+HPLcom/android/server/wm/WindowManagerInternal;->isDockedDividerResizing()Z
+HPLcom/android/server/wm/WindowManagerInternal;->isHardKeyboardAvailable()Z
+HPLcom/android/server/wm/WindowManagerInternal;->isKeyguardLocked()Z
+HPLcom/android/server/wm/WindowManagerInternal;->isKeyguardShowingAndNotOccluded()Z
+HPLcom/android/server/wm/WindowManagerInternal;->isStackVisible(I)Z
+HPLcom/android/server/wm/WindowManagerInternal;->lockNow()V
+HPLcom/android/server/wm/WindowManagerInternal;->registerAppTransitionListener(Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener;)V
+HPLcom/android/server/wm/WindowManagerInternal;->registerDragDropControllerCallback(Lcom/android/server/wm/WindowManagerInternal$IDragDropCallback;)V
+HPLcom/android/server/wm/WindowManagerInternal;->removeWindowToken(Landroid/os/IBinder;ZI)V
+HPLcom/android/server/wm/WindowManagerInternal;->requestTraversalFromDisplayManager()V
+HPLcom/android/server/wm/WindowManagerInternal;->saveLastInputMethodWindowForTransition()V
+HPLcom/android/server/wm/WindowManagerInternal;->setForceShowMagnifiableBounds(Z)V
+HPLcom/android/server/wm/WindowManagerInternal;->setInputFilter(Landroid/view/IInputFilter;)V
+HPLcom/android/server/wm/WindowManagerInternal;->setMagnificationCallbacks(Lcom/android/server/wm/WindowManagerInternal$MagnificationCallbacks;)V
+HPLcom/android/server/wm/WindowManagerInternal;->setMagnificationSpec(Landroid/view/MagnificationSpec;)V
+HPLcom/android/server/wm/WindowManagerInternal;->setOnHardKeyboardStatusChangeListener(Lcom/android/server/wm/WindowManagerInternal$OnHardKeyboardStatusChangeListener;)V
+HPLcom/android/server/wm/WindowManagerInternal;->setVr2dDisplayId(I)V
+HPLcom/android/server/wm/WindowManagerInternal;->setWindowsForAccessibilityCallback(Lcom/android/server/wm/WindowManagerInternal$WindowsForAccessibilityCallback;)V
+HPLcom/android/server/wm/WindowManagerInternal;->showGlobalActions()V
+HPLcom/android/server/wm/WindowManagerInternal;->updateInputMethodWindowStatus(Landroid/os/IBinder;ZZLandroid/os/IBinder;)V
+HPLcom/android/server/wm/WindowManagerInternal;->waitForAllWindowsDrawn(Ljava/lang/Runnable;J)V
+HPLcom/android/server/wm/WindowManagerService$AppFreezeListener;->onAppFreezeTimeout()V
+HPLcom/android/server/wm/WindowManagerService$LocalService;->isStackVisible(I)Z
+HPLcom/android/server/wm/WindowManagerService$MousePositionTracker;->onPointerEvent(Landroid/view/MotionEvent;)V
+HPLcom/android/server/wm/WindowManagerService;->boostPriorityForLockedSection()V
+HPLcom/android/server/wm/WindowManagerService;->checkCallingPermission(Ljava/lang/String;Ljava/lang/String;)Z
+HPLcom/android/server/wm/WindowManagerService;->closeSurfaceTransaction(Ljava/lang/String;)V
+HPLcom/android/server/wm/WindowManagerService;->containsDismissKeyguardWindow(Landroid/os/IBinder;)Z
+HPLcom/android/server/wm/WindowManagerService;->containsShowWhenLockedWindow(Landroid/os/IBinder;)Z
+HPLcom/android/server/wm/WindowManagerService;->finishDrawingWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;)V
+HPLcom/android/server/wm/WindowManagerService;->getDefaultDisplayContentLocked()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/WindowManagerService;->getInputMethodWindowLw()Lcom/android/server/policy/WindowManagerPolicy$WindowState;
+HPLcom/android/server/wm/WindowManagerService;->getRecentsAnimationController()Lcom/android/server/wm/RecentsAnimationController;
+HPLcom/android/server/wm/WindowManagerService;->getStackBounds(IILandroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowManagerService;->isCurrentProfileLocked(I)Z
+HPLcom/android/server/wm/WindowManagerService;->isKeyguardLocked()Z
+HPLcom/android/server/wm/WindowManagerService;->markForSeamlessRotation(Lcom/android/server/wm/WindowState;Z)V
+HPLcom/android/server/wm/WindowManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+HPLcom/android/server/wm/WindowManagerService;->openSurfaceTransaction()V
+HPLcom/android/server/wm/WindowManagerService;->pokeDrawLock(Lcom/android/server/wm/Session;Landroid/os/IBinder;)V
+HPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+HPLcom/android/server/wm/WindowManagerService;->resetPriorityAfterLockedSection()V
+HPLcom/android/server/wm/WindowManagerService;->scheduleAnimationLocked()V
+HPLcom/android/server/wm/WindowManagerService;->traceStateLocked(Ljava/lang/String;)V
+HPLcom/android/server/wm/WindowManagerService;->updateOrientationFromAppTokensLocked(IZ)Z
+HPLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/os/IBinder;Z)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->boost()V
+HPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->reset()V
+HPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->updatePriorityLocked()V
+HPLcom/android/server/wm/WindowState$PowerManagerWrapper;->isInteractive()Z
+HPLcom/android/server/wm/WindowState$PowerManagerWrapper;->wakeUp(JLjava/lang/String;)V
+HPLcom/android/server/wm/WindowState;->applyDims(Lcom/android/server/wm/Dimmer;)V
+HPLcom/android/server/wm/WindowState;->applyGravityAndUpdateFrame(Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->applyImeWindowsIfNeeded(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/WindowState;->applyInOrderWithImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/WindowState;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/WindowState;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V
+HPLcom/android/server/wm/WindowState;->calculatePolicyCrop(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->calculateSystemDecorRect(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->canAddInternalSystemWindow()Z
+HPLcom/android/server/wm/WindowState;->canAffectSystemUiFlags()Z
+HPLcom/android/server/wm/WindowState;->canReceiveKeys()Z
+HPLcom/android/server/wm/WindowState;->canReceiveTouchInput()Z
+HPLcom/android/server/wm/WindowState;->computeDragResizing()Z
+HPLcom/android/server/wm/WindowState;->computeFrameLw(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Lcom/android/server/wm/utils/WmDisplayCutout;Z)V
+HPLcom/android/server/wm/WindowState;->cropRegionToStackBoundsIfNeeded(Landroid/graphics/Region;)V
+HPLcom/android/server/wm/WindowState;->expandForSurfaceInsets(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->fillsDisplay()Z
+HPLcom/android/server/wm/WindowState;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+HPLcom/android/server/wm/WindowState;->getAppToken()Landroid/view/IApplicationToken;
+HPLcom/android/server/wm/WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
+HPLcom/android/server/wm/WindowState;->getBaseType()I
+HPLcom/android/server/wm/WindowState;->getConfiguration()Landroid/content/res/Configuration;
+HPLcom/android/server/wm/WindowState;->getContentFrameLw()Landroid/graphics/Rect;
+HPLcom/android/server/wm/WindowState;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/WindowState;->getDisplayId()I
+HPLcom/android/server/wm/WindowState;->getDisplayInfo()Landroid/view/DisplayInfo;
+HPLcom/android/server/wm/WindowState;->getInputDispatchingTimeoutNanos()J
+HPLcom/android/server/wm/WindowState;->getLastReportedConfiguration()Landroid/content/res/Configuration;
+HPLcom/android/server/wm/WindowState;->getOrientationChanging()Z
+HPLcom/android/server/wm/WindowState;->getParentWindow()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowState;->getStack()Lcom/android/server/wm/TaskStack;
+HPLcom/android/server/wm/WindowState;->getSurfaceLayer()I
+HPLcom/android/server/wm/WindowState;->getSystemUiVisibility()I
+HPLcom/android/server/wm/WindowState;->getTask()Lcom/android/server/wm/Task;
+HPLcom/android/server/wm/WindowState;->getTopParentWindow()Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowState;->getTouchableRegion(Landroid/graphics/Region;)V
+HPLcom/android/server/wm/WindowState;->getTouchableRegion(Landroid/graphics/Region;I)I
+HPLcom/android/server/wm/WindowState;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;
+HPLcom/android/server/wm/WindowState;->getWindowTag()Ljava/lang/CharSequence;
+HPLcom/android/server/wm/WindowState;->handleWindowMovedIfNeeded()V
+HPLcom/android/server/wm/WindowState;->hasMoved()Z
+HPLcom/android/server/wm/WindowState;->hideLw(Z)Z
+HPLcom/android/server/wm/WindowState;->hideLw(ZZ)Z
+HPLcom/android/server/wm/WindowState;->inFullscreenContainer()Z
+HPLcom/android/server/wm/WindowState;->isAnimatingLw()Z
+HPLcom/android/server/wm/WindowState;->isChildWindow()Z
+HPLcom/android/server/wm/WindowState;->isConfigChanged()Z
+HPLcom/android/server/wm/WindowState;->isDefaultDisplay()Z
+HPLcom/android/server/wm/WindowState;->isDimming()Z
+HPLcom/android/server/wm/WindowState;->isDisplayedLw()Z
+HPLcom/android/server/wm/WindowState;->isDockedResizing()Z
+HPLcom/android/server/wm/WindowState;->isDragResizeChanged()Z
+HPLcom/android/server/wm/WindowState;->isDragResizing()Z
+HPLcom/android/server/wm/WindowState;->isDrawnLw()Z
+HPLcom/android/server/wm/WindowState;->isGoneForLayoutLw()Z
+HPLcom/android/server/wm/WindowState;->isHiddenFromUserLocked()Z
+HPLcom/android/server/wm/WindowState;->isInMultiWindowMode()Z
+HPLcom/android/server/wm/WindowState;->isInputMethodTarget()Z
+HPLcom/android/server/wm/WindowState;->isInputMethodWindow()Z
+HPLcom/android/server/wm/WindowState;->isLaidOut()Z
+HPLcom/android/server/wm/WindowState;->isLetterboxedAppWindow()Z
+HPLcom/android/server/wm/WindowState;->isLetterboxedForDisplayCutoutLw()Z
+HPLcom/android/server/wm/WindowState;->isLetterboxedOverlappingWith(Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/WindowState;->isObscuringDisplay()Z
+HPLcom/android/server/wm/WindowState;->isOnScreen()Z
+HPLcom/android/server/wm/WindowState;->isOpaqueDrawn()Z
+HPLcom/android/server/wm/WindowState;->isParentWindowHidden()Z
+HPLcom/android/server/wm/WindowState;->isVisible()Z
+HPLcom/android/server/wm/WindowState;->isVisibleLw()Z
+HPLcom/android/server/wm/WindowState;->isVisibleOrAdding()Z
+HPLcom/android/server/wm/WindowState;->needsRelativeLayeringToIme()Z
+HPLcom/android/server/wm/WindowState;->needsZBoost()Z
+HPLcom/android/server/wm/WindowState;->pokeDrawLockLw(J)V
+HPLcom/android/server/wm/WindowState;->prelayout()V
+HPLcom/android/server/wm/WindowState;->prepareSurfaces()V
+HPLcom/android/server/wm/WindowState;->setDrawnStateEvaluated(Z)V
+HPLcom/android/server/wm/WindowState;->setReportResizeHints()Z
+HPLcom/android/server/wm/WindowState;->showLw(Z)Z
+HPLcom/android/server/wm/WindowState;->showLw(ZZ)Z
+HPLcom/android/server/wm/WindowState;->skipDecorCrop()Z
+HPLcom/android/server/wm/WindowState;->toString()Ljava/lang/String;
+HPLcom/android/server/wm/WindowState;->transformClipRectFromScreenToSurfaceSpace(Landroid/graphics/Rect;)V
+HPLcom/android/server/wm/WindowState;->transformFrameToSurfacePosition(IILandroid/graphics/Point;)V
+HPLcom/android/server/wm/WindowState;->updateResizingWindowIfNeeded()V
+HPLcom/android/server/wm/WindowState;->updateSurfacePosition()V
+HPLcom/android/server/wm/WindowState;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V
+HPLcom/android/server/wm/WindowState;->wouldBeVisibleIfPolicyIgnored()Z
+HPLcom/android/server/wm/WindowStateAnimator;->applyCrop(Landroid/graphics/Rect;Z)V
+HPLcom/android/server/wm/WindowStateAnimator;->calculateCrop(Landroid/graphics/Rect;)Z
+HPLcom/android/server/wm/WindowStateAnimator;->calculateSurfaceBounds(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V
+HPLcom/android/server/wm/WindowStateAnimator;->commitFinishDrawingLocked()Z
+HPLcom/android/server/wm/WindowStateAnimator;->computeShownFrameLocked()V
+HPLcom/android/server/wm/WindowStateAnimator;->getShown()Z
+HPLcom/android/server/wm/WindowStateAnimator;->hasSurface()Z
+HPLcom/android/server/wm/WindowStateAnimator;->hide(Landroid/view/SurfaceControl$Transaction;Ljava/lang/String;)V
+HPLcom/android/server/wm/WindowStateAnimator;->hide(Ljava/lang/String;)V
+HPLcom/android/server/wm/WindowStateAnimator;->isAnimationSet()Z
+HPLcom/android/server/wm/WindowStateAnimator;->isForceScaled()Z
+HPLcom/android/server/wm/WindowStateAnimator;->prepareSurfaceLocked(Z)V
+HPLcom/android/server/wm/WindowStateAnimator;->setSurfaceBoundariesLocked(Z)V
+HPLcom/android/server/wm/WindowSurfaceController;->clearCropInTransaction(Z)V
+HPLcom/android/server/wm/WindowSurfaceController;->getHeight()I
+HPLcom/android/server/wm/WindowSurfaceController;->getShown()Z
+HPLcom/android/server/wm/WindowSurfaceController;->getWidth()I
+HPLcom/android/server/wm/WindowSurfaceController;->hasSurface()Z
+HPLcom/android/server/wm/WindowSurfaceController;->setMatrix(Landroid/view/SurfaceControl$Transaction;FFFFZ)V
+HPLcom/android/server/wm/WindowSurfaceController;->setMatrixInTransaction(FFFFZ)V
+HPLcom/android/server/wm/WindowSurfaceController;->setPosition(Landroid/view/SurfaceControl$Transaction;FFZ)V
+HPLcom/android/server/wm/WindowSurfaceController;->setPositionInTransaction(FFZ)V
+HPLcom/android/server/wm/WindowToken;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+HPLcom/android/server/wm/WindowToken;->isHidden()Z
+HPLcom/android/server/wm/WindowTracing;->isEnabled()Z
+HPLcom/android/server/wm/WindowTracing;->traceStateLocked(Ljava/lang/String;Lcom/android/server/wm/WindowManagerService;)V
+HPLcom/android/server/wm/utils/RotationCache$RotationDependentComputation;->compute(Ljava/lang/Object;I)Ljava/lang/Object;
+HPLcom/android/server/wm/utils/WmDisplayCutout;->calculateRelativeTo(Landroid/graphics/Rect;)Lcom/android/server/wm/utils/WmDisplayCutout;
+HPLcom/android/server/wm/utils/WmDisplayCutout;->equals(Ljava/lang/Object;)Z
+HPLcom/android/server/wm/utils/WmDisplayCutout;->getDisplayCutout()Landroid/view/DisplayCutout;
+HSLcom/android/server/location/LocationProviderInterface;->disable()V
+HSLcom/android/server/location/LocationProviderInterface;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+HSLcom/android/server/location/LocationProviderInterface;->enable()V
+HSLcom/android/server/location/LocationProviderInterface;->getName()Ljava/lang/String;
+HSLcom/android/server/location/LocationProviderInterface;->getProperties()Lcom/android/internal/location/ProviderProperties;
+HSLcom/android/server/location/LocationProviderInterface;->getStatus(Landroid/os/Bundle;)I
+HSLcom/android/server/location/LocationProviderInterface;->getStatusUpdateTime()J
+HSLcom/android/server/location/LocationProviderInterface;->isEnabled()Z
+HSLcom/android/server/location/LocationProviderInterface;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)Z
+HSLcom/android/server/location/LocationProviderInterface;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
HSPLcom/android/server/AnyMotionDetector$DeviceIdleCallback;->onAnyMotionResult(I)V
-HSPLcom/android/server/BatteryService$HealthServiceWrapper$Callback;->onRegistration(Landroid/hardware/health/V2_0/IHealth;Landroid/hardware/health/V2_0/IHealth;Ljava/lang/String;)V
-HSPLcom/android/server/IpSecService$IpSecServiceConfiguration;->getNetdInstance()Landroid/net/INetd;
-HSPLcom/android/server/IpSecService$UidFdTagger;->tag(Ljava/io/FileDescriptor;I)V
-HSPLcom/android/server/NetworkManagementInternal;->isNetworkRestrictedForUid(I)Z
-HSPLcom/android/server/NsdService$DaemonConnectionSupplier;->get(Lcom/android/server/NsdService$NativeCallbackReceiver;)Lcom/android/server/NsdService$DaemonConnection;
-HSPLcom/android/server/NsdService$NsdSettings;->isEnabled()Z
-HSPLcom/android/server/NsdService$NsdSettings;->putEnabledStatus(Z)V
-HSPLcom/android/server/NsdService$NsdSettings;->registerContentObserver(Landroid/net/Uri;Landroid/database/ContentObserver;)V
-HSPLcom/android/server/PersistentDataBlockManagerInternal;->forceOemUnlockEnabled(Z)V
-HSPLcom/android/server/PersistentDataBlockManagerInternal;->getFrpCredentialHandle()[B
-HSPLcom/android/server/PersistentDataBlockManagerInternal;->setFrpCredentialHandle([B)V
+HSPLcom/android/server/AppOpsService$Op;-><init>(Lcom/android/server/AppOpsService$UidState;Ljava/lang/String;I)V
+HSPLcom/android/server/AppOpsService$UidState;->evalForegroundOps(Landroid/util/SparseArray;)V
+HSPLcom/android/server/AppOpsService;->getUidStateLocked(IZ)Lcom/android/server/AppOpsService$UidState;
+HSPLcom/android/server/AppOpsService;->readPackage(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/AppOpsService;->readUid(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
+HSPLcom/android/server/IntentResolver;->addFilter(Landroid/content/IntentFilter;)V
+HSPLcom/android/server/IntentResolver;->addFilter(Landroid/util/ArrayMap;Ljava/lang/String;Landroid/content/IntentFilter;)V
+HSPLcom/android/server/IntentResolver;->register_intent_filter(Landroid/content/IntentFilter;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I
+HSPLcom/android/server/IntentResolver;->register_mime_types(Landroid/content/IntentFilter;Ljava/lang/String;)I
+HSPLcom/android/server/IntentResolver;->removeFilter(Landroid/content/IntentFilter;)V
+HSPLcom/android/server/IntentResolver;->removeFilterInternal(Landroid/content/IntentFilter;)V
+HSPLcom/android/server/IntentResolver;->remove_all_objects(Landroid/util/ArrayMap;Ljava/lang/String;Ljava/lang/Object;)V
+HSPLcom/android/server/IntentResolver;->unregister_intent_filter(Landroid/content/IntentFilter;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I
+HSPLcom/android/server/IntentResolver;->unregister_mime_types(Landroid/content/IntentFilter;Ljava/lang/String;)I
+HSPLcom/android/server/SystemService;->getContext()Landroid/content/Context;
+HSPLcom/android/server/SystemServiceManager;->startBootPhase(I)V
HSPLcom/android/server/accessibility/AbstractAccessibilityServiceConnection$SystemSupport;->ensureWindowsAvailableTimed()V
HSPLcom/android/server/accessibility/AbstractAccessibilityServiceConnection$SystemSupport;->getCompatibleMagnificationSpecLocked(I)Landroid/view/MagnificationSpec;
HSPLcom/android/server/accessibility/AbstractAccessibilityServiceConnection$SystemSupport;->getConnectionLocked(I)Lcom/android/server/accessibility/AccessibilityManagerService$RemoteAccessibilityConnection;
@@ -733,99 +2600,42 @@ HSPLcom/android/server/accessibility/AbstractAccessibilityServiceConnection$Syst
HSPLcom/android/server/accessibility/AbstractAccessibilityServiceConnection$SystemSupport;->performAccessibilityAction(IJILandroid/os/Bundle;ILandroid/view/accessibility/IAccessibilityInteractionConnectionCallback;IJ)Z
HSPLcom/android/server/accessibility/AbstractAccessibilityServiceConnection$SystemSupport;->persistComponentNamesToSettingLocked(Ljava/lang/String;Ljava/util/Set;I)V
HSPLcom/android/server/accessibility/AbstractAccessibilityServiceConnection$SystemSupport;->replaceCallbackIfNeeded(Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback;IIIJ)Landroid/view/accessibility/IAccessibilityInteractionConnectionCallback;
-HSPLcom/android/server/accessibility/AbstractAccessibilityServiceConnection;->isCalledForCurrentUserLocked()Z
-HSPLcom/android/server/accessibility/FingerprintGestureDispatcher$FingerprintGestureClient;->isCapturingFingerprintGestures()Z
-HSPLcom/android/server/accessibility/FingerprintGestureDispatcher$FingerprintGestureClient;->onFingerprintGesture(I)V
-HSPLcom/android/server/accessibility/FingerprintGestureDispatcher$FingerprintGestureClient;->onFingerprintGestureDetectionActiveChanged(Z)V
-HSPLcom/android/server/accessibility/KeyEventDispatcher$KeyEventFilter;->onKeyEvent(Landroid/view/KeyEvent;I)Z
-HSPLcom/android/server/accounts/IAccountAuthenticatorCache;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;I)V
-HSPLcom/android/server/accounts/IAccountAuthenticatorCache;->getAllServices(I)Ljava/util/Collection;
-HSPLcom/android/server/accounts/IAccountAuthenticatorCache;->getServiceInfo(Landroid/accounts/AuthenticatorDescription;I)Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
-HSPLcom/android/server/accounts/IAccountAuthenticatorCache;->invalidateCache(I)V
-HSPLcom/android/server/accounts/IAccountAuthenticatorCache;->setListener(Landroid/content/pm/RegisteredServicesCacheListener;Landroid/os/Handler;)V
-HSPLcom/android/server/accounts/IAccountAuthenticatorCache;->updateServices(I)V
+HSPLcom/android/server/am/ActivityDisplay$OnStackOrderChangedListener;->onStackOrderChanged()V
+HSPLcom/android/server/am/ActivityManagerService;->incrementProcStateSeqAndNotifyAppsLocked()V
+HSPLcom/android/server/am/ActivityManagerService;->isSleepingLocked()Z
+HSPLcom/android/server/am/ActivityManagerService;->resumedAppLocked()Lcom/android/server/am/ActivityRecord;
+HSPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked()V
+HSPLcom/android/server/am/ActivityStackSupervisor;->getKeyguardController()Lcom/android/server/am/KeyguardController;
+HSPLcom/android/server/am/ActivityStackSupervisor;->getResumedActivityLocked()Lcom/android/server/am/ActivityRecord;
+HSPLcom/android/server/am/ActivityStackSupervisor;->rankTaskLayersIfNeeded()V
HSPLcom/android/server/am/ActivityStarter$Factory;->obtain()Lcom/android/server/am/ActivityStarter;
HSPLcom/android/server/am/ActivityStarter$Factory;->recycle(Lcom/android/server/am/ActivityStarter;)V
HSPLcom/android/server/am/ActivityStarter$Factory;->setController(Lcom/android/server/am/ActivityStartController;)V
+HSPLcom/android/server/am/BatteryExternalStatsWorker$1;->run()V
+HSPLcom/android/server/am/BatteryExternalStatsWorker;->updateExternalStatsLocked(Ljava/lang/String;IZZZ)V
+HSPLcom/android/server/am/BatteryStatsService;->access$100(Ljava/nio/ByteBuffer;)I
+HSPLcom/android/server/am/BatteryStatsService;->getActiveStatistics()Lcom/android/internal/os/BatteryStatsImpl;
+HSPLcom/android/server/am/PreBootBroadcaster;->onFinished()V
+HSPLcom/android/server/am/ProcessList;->getMemLevel(I)J
+HSPLcom/android/server/am/ProcessStatsService;->getMemFactorLocked()I
+HSPLcom/android/server/am/ProcessStatsService;->setMemFactorLocked(IZJ)Z
+HSPLcom/android/server/am/ProcessStatsService;->shouldWriteNowLocked(J)Z
HSPLcom/android/server/am/RecentTasks$Callbacks;->onRecentTaskAdded(Lcom/android/server/am/TaskRecord;)V
HSPLcom/android/server/am/RecentTasks$Callbacks;->onRecentTaskRemoved(Lcom/android/server/am/TaskRecord;Z)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->acknowledgeAdbBackupOrRestore(IZLjava/lang/String;Ljava/lang/String;Landroid/app/backup/IFullBackupRestoreObserver;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->adbBackup(Landroid/os/ParcelFileDescriptor;ZZZZZZZZ[Ljava/lang/String;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->adbRestore(Landroid/os/ParcelFileDescriptor;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->agentConnected(Ljava/lang/String;Landroid/os/IBinder;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->agentDisconnected(Ljava/lang/String;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->backupNow()V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->beginFullBackup(Lcom/android/server/backup/FullBackupJob;)Z
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->beginRestoreSession(Ljava/lang/String;Ljava/lang/String;)Landroid/app/backup/IRestoreSession;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->bindToAgentSynchronous(Landroid/content/pm/ApplicationInfo;I)Landroid/app/IBackupAgent;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->cancelBackups()V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->clearBackupData(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->dataChanged(Ljava/lang/String;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->endFullBackup()V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->filterAppsEligibleForBackup([Ljava/lang/String;)[Ljava/lang/String;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->fullTransportBackup([Ljava/lang/String;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->generateRandomIntegerToken()I
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getAgentTimeoutParameters()Lcom/android/server/backup/BackupAgentTimeoutParameters;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getAvailableRestoreToken(Ljava/lang/String;)J
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getBackupManagerBinder()Landroid/app/backup/IBackupManager;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getConfigurationIntent(Ljava/lang/String;)Landroid/content/Intent;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getCurrentTransport()Ljava/lang/String;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getDataManagementIntent(Ljava/lang/String;)Landroid/content/Intent;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getDataManagementLabel(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getDestinationString(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->getTransportWhitelist()[Ljava/lang/String;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->hasBackupPassword()Z
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->initializeTransports([Ljava/lang/String;Landroid/app/backup/IBackupObserver;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->isAppEligibleForBackup(Ljava/lang/String;)Z
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->isBackupEnabled()Z
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->listAllTransportComponents()[Landroid/content/ComponentName;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->listAllTransports()[Ljava/lang/String;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->opComplete(IJ)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->prepareOperationTimeout(IJLcom/android/server/backup/BackupRestoreTask;I)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->requestBackup([Ljava/lang/String;Landroid/app/backup/IBackupObserver;I)I
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->requestBackup([Ljava/lang/String;Landroid/app/backup/IBackupObserver;Landroid/app/backup/IBackupManagerMonitor;I)I
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->restoreAtInstall(Ljava/lang/String;I)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->selectBackupTransport(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->selectBackupTransportAsync(Landroid/content/ComponentName;Landroid/app/backup/ISelectBackupTransportCallback;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->setAutoRestore(Z)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupEnabled(Z)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupPassword(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->setBackupProvisioned(Z)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->tearDownAgentAndKill(Landroid/content/pm/ApplicationInfo;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->unlockSystemUser()V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;)V
-HSPLcom/android/server/backup/BackupManagerServiceInterface;->waitUntilOperationComplete(I)Z
-HSPLcom/android/server/connectivity/IpConnectivityMetrics$Logger;->defaultNetworkMetrics()Lcom/android/server/connectivity/DefaultNetworkMetrics;
-HSPLcom/android/server/content/SyncStorageEngine$OnAuthorityRemovedListener;->onAuthorityRemoved(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
-HSPLcom/android/server/content/SyncStorageEngine$OnSyncRequestListener;->onSyncRequest(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILandroid/os/Bundle;I)V
-HSPLcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;->onPeriodicSyncAdded(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;JJ)V
-HSPLcom/android/server/devicepolicy/BaseIDevicePolicyManager;->handleStartUser(I)V
-HSPLcom/android/server/devicepolicy/BaseIDevicePolicyManager;->handleStopUser(I)V
-HSPLcom/android/server/devicepolicy/BaseIDevicePolicyManager;->handleUnlockUser(I)V
-HSPLcom/android/server/devicepolicy/BaseIDevicePolicyManager;->systemReady(I)V
-HSPLcom/android/server/display/AmbientBrightnessStatsTracker$Clock;->elapsedTimeMillis()J
HSPLcom/android/server/display/AutomaticBrightnessController$Callbacks;->updateBrightness()V
-HSPLcom/android/server/display/BrightnessMappingStrategy;->addUserDataPoint(FF)V
-HSPLcom/android/server/display/BrightnessMappingStrategy;->clearUserDataPoints()V
-HSPLcom/android/server/display/BrightnessMappingStrategy;->convertToNits(I)F
-HSPLcom/android/server/display/BrightnessMappingStrategy;->dump(Ljava/io/PrintWriter;)V
-HSPLcom/android/server/display/BrightnessMappingStrategy;->getAutoBrightnessAdjustment()F
-HSPLcom/android/server/display/BrightnessMappingStrategy;->getBrightness(F)F
-HSPLcom/android/server/display/BrightnessMappingStrategy;->getDefaultConfig()Landroid/hardware/display/BrightnessConfiguration;
-HSPLcom/android/server/display/BrightnessMappingStrategy;->hasUserDataPoints()Z
-HSPLcom/android/server/display/BrightnessMappingStrategy;->isDefaultConfig()Z
-HSPLcom/android/server/display/BrightnessMappingStrategy;->setAutoBrightnessAdjustment(F)Z
-HSPLcom/android/server/display/BrightnessMappingStrategy;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;)Z
+HSPLcom/android/server/display/DisplayAdapter$Listener;->onDisplayDeviceEvent(Lcom/android/server/display/DisplayDevice;I)V
+HSPLcom/android/server/display/DisplayAdapter$Listener;->onTraversalRequested()V
HSPLcom/android/server/display/DisplayBlanker;->requestDisplayState(II)V
-HSPLcom/android/server/display/RampAnimator$Listener;->onAnimationEnd()V
-HSPLcom/android/server/display/utils/Plog;->emit(Ljava/lang/String;)V
-HSPLcom/android/server/dreams/DreamController$Listener;->onDreamStopped(Landroid/os/Binder;)V
-HSPLcom/android/server/fingerprint/AuthenticationClient;->handleFailedAttempt()I
-HSPLcom/android/server/fingerprint/AuthenticationClient;->onStart()V
-HSPLcom/android/server/fingerprint/AuthenticationClient;->onStop()V
-HSPLcom/android/server/fingerprint/AuthenticationClient;->resetFailedAttempts()V
-HSPLcom/android/server/input/InputManagerService$KeyboardLayoutVisitor;->visitKeyboardLayout(Landroid/content/res/Resources;ILandroid/hardware/input/KeyboardLayout;)V
+HSPLcom/android/server/display/DisplayManagerService$BinderService;->getDisplayInfo(I)Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/DisplayManagerService$BinderService;->registerCallback(Landroid/hardware/display/IDisplayManagerCallback;)V
+HSPLcom/android/server/display/DisplayManagerService;->access$2000(Lcom/android/server/display/DisplayManagerService;II)Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/DisplayManagerService;->access$600(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayManagerService$SyncRoot;
+HSPLcom/android/server/display/DisplayManagerService;->getDisplayInfoInternal(II)Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/DisplayManagerService;->registerCallbackInternal(Landroid/hardware/display/IDisplayManagerCallback;I)V
+HSPLcom/android/server/display/LogicalDisplay;->getDisplayInfoLocked()Landroid/view/DisplayInfo;
+HSPLcom/android/server/display/VirtualDisplayAdapter$SurfaceControlDisplayFactory;->createDisplay(Ljava/lang/String;Z)Landroid/os/IBinder;
+HSPLcom/android/server/firewall/IntentFirewall$AMSInterface;->checkComponentPermission(Ljava/lang/String;IIIZ)I
+HSPLcom/android/server/firewall/IntentFirewall$AMSInterface;->getAMSLock()Ljava/lang/Object;
HSPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->dispatchUnhandledKey(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
HSPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->getPointerLayer()I
HSPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->interceptKeyBeforeDispatching(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J
@@ -839,49 +2649,20 @@ HSPLcom/android/server/input/InputManagerService$WindowManagerCallbacks;->notify
HSPLcom/android/server/input/InputManagerService$WiredAccessoryCallbacks;->notifyWiredAccessoryChanged(JII)V
HSPLcom/android/server/input/InputManagerService$WiredAccessoryCallbacks;->systemReady()V
HSPLcom/android/server/job/JobCompletedListener;->onJobCompletedLocked(Lcom/android/server/job/controllers/JobStatus;Z)V
-HSPLcom/android/server/job/JobSchedulerInternal;->addBackingUpUid(I)V
-HSPLcom/android/server/job/JobSchedulerInternal;->baseHeartbeatForApp(Ljava/lang/String;II)J
-HSPLcom/android/server/job/JobSchedulerInternal;->cancelJobsForUid(ILjava/lang/String;)V
-HSPLcom/android/server/job/JobSchedulerInternal;->clearAllBackingUpUids()V
-HSPLcom/android/server/job/JobSchedulerInternal;->currentHeartbeat()J
-HSPLcom/android/server/job/JobSchedulerInternal;->getPersistStats()Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;
-HSPLcom/android/server/job/JobSchedulerInternal;->getSystemScheduledPendingJobs()Ljava/util/List;
-HSPLcom/android/server/job/JobSchedulerInternal;->nextHeartbeatForBucket(I)J
-HSPLcom/android/server/job/JobSchedulerInternal;->noteJobStart(Ljava/lang/String;I)V
-HSPLcom/android/server/job/JobSchedulerInternal;->removeBackingUpUid(I)V
-HSPLcom/android/server/job/JobSchedulerInternal;->reportAppUsage(Ljava/lang/String;I)V
HSPLcom/android/server/job/StateChangedListener;->onControllerStateChanged()V
HSPLcom/android/server/job/StateChangedListener;->onDeviceIdleStateChanged(Z)V
HSPLcom/android/server/job/StateChangedListener;->onRunJobNow(Lcom/android/server/job/controllers/JobStatus;)V
-HSPLcom/android/server/location/ContextHubServiceTransaction;->onTransact()I
-HSPLcom/android/server/location/CountryDetectorBase;->detectCountry()Landroid/location/Country;
-HSPLcom/android/server/location/CountryDetectorBase;->stop()V
-HSPLcom/android/server/location/GnssLocationProvider$GnssMetricsProvider;->getGnssMetricsAsProtoString()Ljava/lang/String;
-HSPLcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;->getGnssHardwareModelName()Ljava/lang/String;
-HSPLcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;->getGnssYearOfHardware()I
+HSPLcom/android/server/lights/Light;->pulse()V
+HSPLcom/android/server/lights/Light;->pulse(II)V
+HSPLcom/android/server/lights/Light;->setBrightness(I)V
+HSPLcom/android/server/lights/Light;->setBrightness(II)V
+HSPLcom/android/server/lights/Light;->setColor(I)V
+HSPLcom/android/server/lights/Light;->setFlashing(IIII)V
+HSPLcom/android/server/lights/Light;->setVrMode(Z)V
+HSPLcom/android/server/lights/Light;->turnOff()V
+HSPLcom/android/server/lights/LightsManager;->getLight(I)Lcom/android/server/lights/Light;
HSPLcom/android/server/location/GnssSatelliteBlacklistHelper$GnssSatelliteBlacklistCallback;->onUpdateSatelliteBlacklist([I[I)V
HSPLcom/android/server/location/NtpTimeHelper$InjectNtpTimeCallback;->injectTime(JJI)V
-HSPLcom/android/server/location/RemoteListenerHelper$ListenerOperation;->execute(Landroid/os/IInterface;)V
-HSPLcom/android/server/locksettings/LockSettingsStorage$Callback;->initialize(Landroid/database/sqlite/SQLiteDatabase;)V
-HSPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;->containsAlias(Ljava/lang/String;)Z
-HSPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;->deleteEntry(Ljava/lang/String;)V
-HSPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;->getKey(Ljava/lang/String;[C)Ljava/security/Key;
-HSPLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;->setEntry(Ljava/lang/String;Ljava/security/KeyStore$Entry;Ljava/security/KeyStore$ProtectionParameter;)V
-HSPLcom/android/server/media/MediaSessionStack$OnMediaButtonSessionChangedListener;->onMediaButtonSessionChanged(Lcom/android/server/media/MediaSessionRecord;Lcom/android/server/media/MediaSessionRecord;)V
-HSPLcom/android/server/media/RemoteDisplayProviderProxy$Callback;->onDisplayStateChanged(Lcom/android/server/media/RemoteDisplayProviderProxy;Landroid/media/RemoteDisplayState;)V
-HSPLcom/android/server/media/RemoteDisplayProviderWatcher$Callback;->addProvider(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
-HSPLcom/android/server/media/RemoteDisplayProviderWatcher$Callback;->removeProvider(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
-HSPLcom/android/server/net/DelayedDiskWrite$Writer;->onWriteCalled(Ljava/io/DataOutputStream;)V
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->getSubscriptionOpportunisticQuota(Landroid/net/Network;I)J
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->getSubscriptionPlan(Landroid/net/Network;)Landroid/telephony/SubscriptionPlan;
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->getSubscriptionPlan(Landroid/net/NetworkTemplate;)Landroid/telephony/SubscriptionPlan;
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->isUidNetworkingBlocked(ILjava/lang/String;)Z
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->isUidRestrictedOnMeteredNetworks(I)Z
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->onAdminDataAvailable()V
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->onTempPowerSaveWhitelistChange(IZ)V
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->resetUserState(I)V
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->setMeteredRestrictedPackages(Ljava/util/Set;I)V
-HSPLcom/android/server/net/NetworkPolicyManagerInternal;->setMeteredRestrictedPackagesAsync(Ljava/util/Set;I)V
HSPLcom/android/server/net/NetworkStatsManagerInternal;->advisePersistThreshold(J)V
HSPLcom/android/server/net/NetworkStatsManagerInternal;->forceUpdate()V
HSPLcom/android/server/net/NetworkStatsManagerInternal;->getNetworkTotalBytes(Landroid/net/NetworkTemplate;JJ)J
@@ -899,75 +2680,100 @@ HSPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getUidTagC
HSPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getUidTagPersistBytes(J)J
HSPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getXtConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
HSPLcom/android/server/net/NetworkStatsService$NetworkStatsSettings;->getXtPersistBytes(J)J
-HSPLcom/android/server/notification/CalendarTracker$Callback;->onChanged()V
-HSPLcom/android/server/notification/ConditionProviders$Callback;->onBootComplete()V
-HSPLcom/android/server/notification/ConditionProviders$Callback;->onConditionChanged(Landroid/net/Uri;Landroid/service/notification/Condition;)V
-HSPLcom/android/server/notification/ConditionProviders$Callback;->onServiceAdded(Landroid/content/ComponentName;)V
-HSPLcom/android/server/notification/ConditionProviders$Callback;->onUserSwitched()V
-HSPLcom/android/server/notification/GroupHelper$Callback;->addAutoGroup(Ljava/lang/String;)V
-HSPLcom/android/server/notification/GroupHelper$Callback;->addAutoGroupSummary(ILjava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/server/notification/GroupHelper$Callback;->removeAutoGroup(Ljava/lang/String;)V
-HSPLcom/android/server/notification/GroupHelper$Callback;->removeAutoGroupSummary(ILjava/lang/String;)V
-HSPLcom/android/server/notification/NotificationDelegate;->clearEffects()V
-HSPLcom/android/server/notification/NotificationDelegate;->onClearAll(III)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationActionClick(IILjava/lang/String;ILcom/android/internal/statusbar/NotificationVisibility;)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationClear(IILjava/lang/String;Ljava/lang/String;IILjava/lang/String;ILcom/android/internal/statusbar/NotificationVisibility;)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationClick(IILjava/lang/String;Lcom/android/internal/statusbar/NotificationVisibility;)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationDirectReplied(Ljava/lang/String;)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationError(IILjava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationExpansionChanged(Ljava/lang/String;ZZ)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationSettingsViewed(Ljava/lang/String;)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationSmartRepliesAdded(Ljava/lang/String;I)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationSmartReplySent(Ljava/lang/String;I)V
-HSPLcom/android/server/notification/NotificationDelegate;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
-HSPLcom/android/server/notification/NotificationDelegate;->onPanelHidden()V
-HSPLcom/android/server/notification/NotificationDelegate;->onPanelRevealed(ZI)V
-HSPLcom/android/server/notification/NotificationDelegate;->onSetDisabled(I)V
-HSPLcom/android/server/notification/NotificationManagerInternal;->enqueueNotification(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;I)V
-HSPLcom/android/server/notification/NotificationManagerInternal;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;)Landroid/app/NotificationChannel;
-HSPLcom/android/server/notification/NotificationManagerInternal;->removeForegroundServiceFlagFromNotification(Ljava/lang/String;II)V
-HSPLcom/android/server/notification/NotificationManagerService$FlagChecker;->apply(I)Z
-HSPLcom/android/server/notification/RankingConfig;->badgingEnabled(Landroid/os/UserHandle;)Z
-HSPLcom/android/server/notification/RankingConfig;->canShowBadge(Ljava/lang/String;I)Z
-HSPLcom/android/server/notification/RankingConfig;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;ZZ)V
-HSPLcom/android/server/notification/RankingConfig;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;Z)V
-HSPLcom/android/server/notification/RankingConfig;->deleteNotificationChannel(Ljava/lang/String;ILjava/lang/String;)V
-HSPLcom/android/server/notification/RankingConfig;->getImportance(Ljava/lang/String;I)I
-HSPLcom/android/server/notification/RankingConfig;->getNotificationChannel(Ljava/lang/String;ILjava/lang/String;Z)Landroid/app/NotificationChannel;
-HSPLcom/android/server/notification/RankingConfig;->getNotificationChannelGroups(Ljava/lang/String;I)Ljava/util/Collection;
-HSPLcom/android/server/notification/RankingConfig;->getNotificationChannelGroups(Ljava/lang/String;IZZ)Landroid/content/pm/ParceledListSlice;
-HSPLcom/android/server/notification/RankingConfig;->getNotificationChannels(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
-HSPLcom/android/server/notification/RankingConfig;->isGroupBlocked(Ljava/lang/String;ILjava/lang/String;)Z
-HSPLcom/android/server/notification/RankingConfig;->permanentlyDeleteNotificationChannel(Ljava/lang/String;ILjava/lang/String;)V
-HSPLcom/android/server/notification/RankingConfig;->permanentlyDeleteNotificationChannels(Ljava/lang/String;I)V
-HSPLcom/android/server/notification/RankingConfig;->setImportance(Ljava/lang/String;II)V
-HSPLcom/android/server/notification/RankingConfig;->setShowBadge(Ljava/lang/String;IZ)V
-HSPLcom/android/server/notification/RankingConfig;->updateNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;Z)V
-HSPLcom/android/server/notification/RankingHandler;->requestReconsideration(Lcom/android/server/notification/RankingReconsideration;)V
-HSPLcom/android/server/notification/RankingHandler;->requestSort()V
-HSPLcom/android/server/notification/SnoozeHelper$Callback;->repost(ILcom/android/server/notification/NotificationRecord;)V
-HSPLcom/android/server/oemlock/OemLock;->isOemUnlockAllowedByCarrier()Z
-HSPLcom/android/server/oemlock/OemLock;->isOemUnlockAllowedByDevice()Z
-HSPLcom/android/server/oemlock/OemLock;->setOemUnlockAllowedByCarrier(Z[B)V
-HSPLcom/android/server/oemlock/OemLock;->setOemUnlockAllowedByDevice(Z)V
-HSPLcom/android/server/om/OverlayManagerServiceImpl$OverlayChangeListener;->onOverlaysChanged(Ljava/lang/String;I)V
-HSPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->getOverlayPackages(I)Ljava/util/List;
-HSPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
-HSPLcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;->signaturesMatching(Ljava/lang/String;Ljava/lang/String;I)Z
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->clearCallingIdentity()J
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getActivityManagerInternal()Landroid/app/ActivityManagerInternal;
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getAppOpsManager()Landroid/app/AppOpsManager;
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getCallingUid()I
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getCallingUserHandle()Landroid/os/UserHandle;
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getCallingUserId()I
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getPackageManager()Landroid/content/pm/PackageManager;
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->getUserManager()Landroid/os/UserManager;
-HSPLcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;->restoreCallingIdentity(J)V
+HSPLcom/android/server/pm/InstructionSets;->getPreferredInstructionSet()Ljava/lang/String;
+HSPLcom/android/server/pm/InstructionSets;->getPrimaryInstructionSet(Landroid/content/pm/ApplicationInfo;)Ljava/lang/String;
+HSPLcom/android/server/pm/KeySetManagerService;->getPublicKeysFromKeySetLPr(J)Landroid/util/ArraySet;
+HSPLcom/android/server/pm/KeySetManagerService;->readKeySetListLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/pm/PackageKeySetData;-><init>()V
+HSPLcom/android/server/pm/PackageKeySetData;->getProperSigningKeySet()J
+HSPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->addActivity(Landroid/content/pm/PackageParser$Activity;Ljava/lang/String;)V
+HSPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->adjustPriority(Ljava/util/List;Landroid/content/pm/PackageParser$ActivityIntentInfo;)V
+HSPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->isProtectedAction(Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+HSPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+HSPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->newArray(I)[Landroid/content/pm/PackageParser$ActivityIntentInfo;
+HSPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->removeActivity(Landroid/content/pm/PackageParser$Activity;Ljava/lang/String;)V
+HSPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleReturnCode()V
+HSPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleServiceError()V
+HSPLcom/android/server/pm/PackageManagerService$HandlerParams;->handleStartCopy()V
HSPLcom/android/server/pm/PackageManagerService$IntentFilterVerifier;->addOneIntentFilterVerification(IIILandroid/content/IntentFilter;Ljava/lang/String;)Z
HSPLcom/android/server/pm/PackageManagerService$IntentFilterVerifier;->receiveVerificationResponse(I)V
HSPLcom/android/server/pm/PackageManagerService$IntentFilterVerifier;->startVerifications(I)V
+HSPLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getStaticOverlayPackages(Ljava/util/Collection;Ljava/lang/String;)Ljava/util/List;
+HSPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->addService(Landroid/content/pm/PackageParser$Service;)V
+HSPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+HSPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->newArray(I)[Landroid/content/pm/PackageParser$ServiceIntentInfo;
+HSPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->removeService(Landroid/content/pm/PackageParser$Service;)V
+HSPLcom/android/server/pm/PackageManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;ZZ)V
+HSPLcom/android/server/pm/PackageManagerService;->applyPolicy(Landroid/content/pm/PackageParser$Package;IILandroid/content/pm/PackageParser$Package;)V
+HSPLcom/android/server/pm/PackageManagerService;->cleanPackageDataStructuresLILPw(Landroid/content/pm/PackageParser$Package;Z)V
+HSPLcom/android/server/pm/PackageManagerService;->commitPackageSettings(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/PackageSetting;Landroid/os/UserHandle;IZ)V
+HSPLcom/android/server/pm/PackageManagerService;->fixProcessName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+HSPLcom/android/server/pm/PackageManagerService;->getOriginalPackageLocked(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+HSPLcom/android/server/pm/PackageManagerService;->getRealPackageName(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Ljava/lang/String;
+HSPLcom/android/server/pm/PackageManagerService;->getSettingsVersionForPackage(Landroid/content/pm/PackageParser$Package;)Lcom/android/server/pm/Settings$VersionInfo;
+HSPLcom/android/server/pm/PackageManagerService;->hasSystemFeature(Ljava/lang/String;I)Z
+HSPLcom/android/server/pm/PackageManagerService;->isExternal(Landroid/content/pm/PackageParser$Package;)Z
+HSPLcom/android/server/pm/PackageManagerService;->isPackageRenamed(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
+HSPLcom/android/server/pm/PackageManagerService;->isSystemApp(Landroid/content/pm/PackageParser$Package;)Z
+HSPLcom/android/server/pm/PackageManagerService;->scanDirLI(Ljava/io/File;IIJ)V
+HSPLcom/android/server/pm/PackageManagerService;->scanPackageNewLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+HSPLcom/android/server/pm/PackageManagerService;->setNativeLibraryPaths(Landroid/content/pm/PackageParser$Package;Ljava/io/File;)V
+HSPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getAndCheckValidity(I)Ljava/lang/String;
+HSPLcom/android/server/pm/PackageManagerServiceUtils;->getLastModifiedTime(Landroid/content/pm/PackageParser$Package;)J
+HSPLcom/android/server/pm/PackageSender;->notifyPackageAdded(Ljava/lang/String;)V
+HSPLcom/android/server/pm/PackageSender;->notifyPackageRemoved(Ljava/lang/String;)V
+HSPLcom/android/server/pm/PackageSender;->sendPackageAddedForNewUsers(Ljava/lang/String;ZZI[I[I)V
+HSPLcom/android/server/pm/PackageSender;->sendPackageBroadcast(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I[I)V
+HSPLcom/android/server/pm/PackageSetting;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
+HSPLcom/android/server/pm/PackageSetting;->isSystem()Z
+HSPLcom/android/server/pm/PackageSettingBase;->doCopy(Lcom/android/server/pm/PackageSettingBase;)V
+HSPLcom/android/server/pm/PackageSettingBase;->getInstantApp(I)Z
+HSPLcom/android/server/pm/PackageSettingBase;->getNotInstalledUserIds()[I
+HSPLcom/android/server/pm/PackageSettingBase;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
+HSPLcom/android/server/pm/PackageSettingBase;->getVirtulalPreload(I)Z
+HSPLcom/android/server/pm/PackageSettingBase;->modifyUserState(I)Landroid/content/pm/PackageUserState;
+HSPLcom/android/server/pm/PackageSettingBase;->readUserState(I)Landroid/content/pm/PackageUserState;
+HSPLcom/android/server/pm/PackageSettingBase;->setTimeStamp(J)V
+HSPLcom/android/server/pm/PackageSignatures;->readCertsListXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/ArrayList;[Landroid/content/pm/Signature;[ILandroid/content/pm/PackageParser$SigningDetails$Builder;)I
+HSPLcom/android/server/pm/Policy;->getMatchedSeInfo(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+HSPLcom/android/server/pm/PreferredComponent$Callbacks;->onReadTag(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;)Z
+HSPLcom/android/server/pm/SELinuxMMAC;->getSeInfo(Landroid/content/pm/PackageParser$Package;ZII)Ljava/lang/String;
+HSPLcom/android/server/pm/SettingBase;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
+HSPLcom/android/server/pm/SettingBase;->setFlags(I)V
+HSPLcom/android/server/pm/SettingBase;->setPrivateFlags(I)V
+HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->parsePermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/permission/PermissionsState;I)V
+HSPLcom/android/server/pm/Settings;->addUserIdLPw(ILjava/lang/Object;Ljava/lang/Object;)Z
+HSPLcom/android/server/pm/Settings;->getAllUsers(Lcom/android/server/pm/UserManagerService;)Ljava/util/List;
+HSPLcom/android/server/pm/Settings;->getDisabledSystemPkgLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+HSPLcom/android/server/pm/Settings;->getInternalVersion()Lcom/android/server/pm/Settings$VersionInfo;
+HSPLcom/android/server/pm/Settings;->getPackageLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+HSPLcom/android/server/pm/Settings;->getRenamedPackageLPr(Ljava/lang/String;)Ljava/lang/String;
+HSPLcom/android/server/pm/Settings;->getUserIdLPr(I)Ljava/lang/Object;
+HSPLcom/android/server/pm/Settings;->readComponentsLPr(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/ArraySet;
+HSPLcom/android/server/pm/Settings;->readInstallPermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/permission/PermissionsState;)V
+HSPLcom/android/server/pm/Settings;->readLPw(Ljava/util/List;)Z
+HSPLcom/android/server/pm/Settings;->readPackageLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/pm/Settings;->readPackageRestrictionsLPr(I)V
+HSPLcom/android/server/pm/Settings;->readSharedUserLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/pm/Settings;->writeIntToFile(Ljava/io/File;I)V
+HSPLcom/android/server/pm/Settings;->writeKernelMappingLPr()V
+HSPLcom/android/server/pm/Settings;->writeKernelMappingLPr(Lcom/android/server/pm/PackageSetting;)V
+HSPLcom/android/server/pm/Settings;->writeUserRestrictionsLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)V
+HSPLcom/android/server/pm/SharedUserSetting;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
+HSPLcom/android/server/pm/UserManagerService;->checkManageOrCreateUsersPermission(Ljava/lang/String;)V
+HSPLcom/android/server/pm/UserManagerService;->getInstance()Lcom/android/server/pm/UserManagerService;
+HSPLcom/android/server/pm/UserManagerService;->getUsers(Z)Ljava/util/List;
+HSPLcom/android/server/pm/UserManagerService;->hasManageOrCreateUsersPermission()Z
+HSPLcom/android/server/pm/UserManagerService;->userWithName(Landroid/content/pm/UserInfo;)Landroid/content/pm/UserInfo;
HSPLcom/android/server/pm/dex/DexManager$Listener;->onReconcileSecondaryDexFile(Landroid/content/pm/ApplicationInfo;Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;Ljava/lang/String;I)V
+HSPLcom/android/server/pm/permission/BasePermission;-><init>(Ljava/lang/String;Ljava/lang/String;I)V
+HSPLcom/android/server/pm/permission/BasePermission;->computeGids(I)[I
+HSPLcom/android/server/pm/permission/BasePermission;->createOrUpdate(Lcom/android/server/pm/permission/BasePermission;Landroid/content/pm/PackageParser$Permission;Landroid/content/pm/PackageParser$Package;Ljava/util/Collection;Z)Lcom/android/server/pm/permission/BasePermission;
+HSPLcom/android/server/pm/permission/BasePermission;->findPermissionTree(Ljava/util/Collection;Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+HSPLcom/android/server/pm/permission/BasePermission;->getName()Ljava/lang/String;
+HSPLcom/android/server/pm/permission/BasePermission;->isAppOp()Z
+HSPLcom/android/server/pm/permission/BasePermission;->readInt(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/lang/String;I)I
+HSPLcom/android/server/pm/permission/BasePermission;->readLPw(Ljava/util/Map;Lorg/xmlpull/v1/XmlPullParser;)Z
HSPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermissionGrantedCallback;->onDefaultRuntimePermissionsGranted(I)V
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->addAllPermissionGroups(Landroid/content/pm/PackageParser$Package;Z)V
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->addAllPermissions(Landroid/content/pm/PackageParser$Package;Z)V
@@ -975,6 +2781,7 @@ HSPLcom/android/server/pm/permission/PermissionManagerInternal;->addDynamicPermi
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->checkPermission(Ljava/lang/String;Ljava/lang/String;II)I
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->checkUidPermission(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;II)I
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->enforceCrossUserPermission(IIZZLjava/lang/String;)V
+HSPLcom/android/server/pm/permission/PermissionManagerInternal;->enforceCrossUserPermission(IIZZZLjava/lang/String;)V
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->enforceGrantRevokeRuntimePermissionPermissions(Ljava/lang/String;)V
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->getAllPermissionGroups(II)Ljava/util/List;
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->getAppOpPermissionPackages(Ljava/lang/String;)[Ljava/lang/String;
@@ -998,22 +2805,43 @@ HSPLcom/android/server/pm/permission/PermissionManagerInternal;->updateAllPermis
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IIIILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->updatePermissionFlagsForAllApps(IIIILjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)Z
HSPLcom/android/server/pm/permission/PermissionManagerInternal;->updatePermissions(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;ZLjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
-HSPLcom/android/server/policy/BarController$OnBarVisibilityChangedListener;->onBarVisibilityChanged(Z)V
-HSPLcom/android/server/policy/GlobalActionsProvider;->isGlobalActionsDisabled()Z
-HSPLcom/android/server/policy/GlobalActionsProvider;->setGlobalActionsListener(Lcom/android/server/policy/GlobalActionsProvider$GlobalActionsListener;)V
-HSPLcom/android/server/policy/GlobalActionsProvider;->showGlobalActions()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onDebug()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onDown()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onFling(I)V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseHoverAtBottom()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseHoverAtTop()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onMouseLeaveFromEdge()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromBottom()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromLeft()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromRight()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onSwipeFromTop()V
-HSPLcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;->onUpOrCancel()V
-HSPLcom/android/server/policy/WakeGestureListener;->onWakeUp()V
+HSPLcom/android/server/pm/permission/PermissionManagerService;->addAllPermissions(Landroid/content/pm/PackageParser$Package;Z)V
+HSPLcom/android/server/pm/permission/PermissionManagerService;->removeAllPermissions(Landroid/content/pm/PackageParser$Package;Z)V
+HSPLcom/android/server/pm/permission/PermissionSettings;->getAllPermissionTreesLocked()Ljava/util/Collection;
+HSPLcom/android/server/pm/permission/PermissionSettings;->getPermission(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+HSPLcom/android/server/pm/permission/PermissionSettings;->getPermissionLocked(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+HSPLcom/android/server/pm/permission/PermissionSettings;->isPermissionAppOp(Ljava/lang/String;)Z
+HSPLcom/android/server/pm/permission/PermissionSettings;->putPermissionLocked(Ljava/lang/String;Lcom/android/server/pm/permission/BasePermission;)V
+HSPLcom/android/server/pm/permission/PermissionSettings;->readPermissions(Landroid/util/ArrayMap;Lorg/xmlpull/v1/XmlPullParser;)V
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;-><init>(Lcom/android/server/pm/permission/BasePermission;)V
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;-><init>(Lcom/android/server/pm/permission/PermissionsState$PermissionData;)V
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->computeGids(I)[I
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->getFlags(I)I
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->grant(I)Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->isCompatibleUserId(I)Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->isDefault()Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->isGranted(I)Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->isInstallPermission()Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->isInstallPermissionKey(I)Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionData;->updateFlags(III)Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionState;-><init>(Lcom/android/server/pm/permission/PermissionsState$PermissionState;)V
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionState;-><init>(Ljava/lang/String;)V
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionState;->access$000(Lcom/android/server/pm/permission/PermissionsState$PermissionState;)Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionState;->access$002(Lcom/android/server/pm/permission/PermissionsState$PermissionState;Z)Z
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionState;->access$100(Lcom/android/server/pm/permission/PermissionsState$PermissionState;)I
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionState;->access$102(Lcom/android/server/pm/permission/PermissionsState$PermissionState;I)I
+HSPLcom/android/server/pm/permission/PermissionsState$PermissionState;->isDefault()Z
+HSPLcom/android/server/pm/permission/PermissionsState;-><init>()V
+HSPLcom/android/server/pm/permission/PermissionsState;->appendInts([I[I)[I
+HSPLcom/android/server/pm/permission/PermissionsState;->computeGids(I)[I
+HSPLcom/android/server/pm/permission/PermissionsState;->copyFrom(Lcom/android/server/pm/permission/PermissionsState;)V
+HSPLcom/android/server/pm/permission/PermissionsState;->enforceValidUserId(I)V
+HSPLcom/android/server/pm/permission/PermissionsState;->ensurePermissionData(Lcom/android/server/pm/permission/BasePermission;)Lcom/android/server/pm/permission/PermissionsState$PermissionData;
+HSPLcom/android/server/pm/permission/PermissionsState;->grantInstallPermission(Lcom/android/server/pm/permission/BasePermission;)I
+HSPLcom/android/server/pm/permission/PermissionsState;->grantPermission(Lcom/android/server/pm/permission/BasePermission;I)I
+HSPLcom/android/server/pm/permission/PermissionsState;->grantRuntimePermission(Lcom/android/server/pm/permission/BasePermission;I)I
+HSPLcom/android/server/pm/permission/PermissionsState;->hasPermission(Ljava/lang/String;I)Z
+HSPLcom/android/server/pm/permission/PermissionsState;->updatePermissionFlags(Lcom/android/server/pm/permission/BasePermission;III)Z
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->createInputConsumer(Landroid/os/Looper;Ljava/lang/String;Landroid/view/InputEventReceiver$Factory;)Lcom/android/server/policy/WindowManagerPolicy$InputConsumer;
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->getCameraLensCoverState()I
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->getDockedDividerInsetsLw()I
@@ -1024,6 +2852,7 @@ HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->getWindow
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->lockDeviceNow()V
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->notifyKeyguardTrustedChanged()V
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->notifyShowingDreamChanged()V
+HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->onKeyguardShowingAndNotOccludedChanged()V
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->reboot(Z)V
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->rebootSafeMode(Z)V
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->reevaluateStatusBarVisibility()V
@@ -1034,45 +2863,6 @@ HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->switchInp
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->switchKeyboardLayout(II)V
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->triggerAnimationFailsafe()V
HSPLcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;->unregisterPointerEventListener(Landroid/view/WindowManagerPolicyConstants$PointerEventListener;)V
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->canAcquireSleepToken()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->canAffectSystemUiFlags()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->computeFrameLw(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Lcom/android/server/wm/utils/WmDisplayCutout;Z)V
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getAppToken()Landroid/view/IApplicationToken;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getBaseType()I
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getContentFrameLw()Landroid/graphics/Rect;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getDisplayFrameLw()Landroid/graphics/Rect;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getDisplayId()I
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getFrameLw()Landroid/graphics/Rect;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getGivenContentInsetsLw()Landroid/graphics/Rect;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getGivenInsetsPendingLw()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getGivenVisibleInsetsLw()Landroid/graphics/Rect;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getNeedsMenuLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getOverscanFrameLw()Landroid/graphics/Rect;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getOwningPackage()Ljava/lang/String;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getOwningUid()I
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getRotationAnimationHint()I
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getSurfaceLayer()I
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getSystemUiVisibility()I
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getVisibleFrameLw()Landroid/graphics/Rect;
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->getWindowingMode()I
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->hasAppShownWindows()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->hasDrawnLw()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->hideLw(Z)Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isAlive()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isAnimatingLw()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isDefaultDisplay()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isDimming()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isDisplayedLw()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isDrawnLw()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isGoneForLayoutLw()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isInMultiWindowMode()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isInputMethodTarget()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isInputMethodWindow()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isVisibleLw()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->isVoiceInteraction()Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->showLw(Z)Z
-HSPLcom/android/server/policy/WindowManagerPolicy$WindowState;->writeIdentifierToProto(Landroid/util/proto/ProtoOutputStream;J)V
HSPLcom/android/server/policy/WindowManagerPolicy;->addSplashScreen(Landroid/os/IBinder;Ljava/lang/String;ILandroid/content/res/CompatibilityInfo;Ljava/lang/CharSequence;IIIILandroid/content/res/Configuration;I)Lcom/android/server/policy/WindowManagerPolicy$StartingSurface;
HSPLcom/android/server/policy/WindowManagerPolicy;->adjustConfigurationLw(Landroid/content/res/Configuration;II)V
HSPLcom/android/server/policy/WindowManagerPolicy;->adjustSystemUiVisibilityLw(I)I
@@ -1172,473 +2962,55 @@ HSPLcom/android/server/policy/WindowManagerPolicy;->systemReady()V
HSPLcom/android/server/policy/WindowManagerPolicy;->userActivity()V
HSPLcom/android/server/policy/WindowManagerPolicy;->validateRotationAnimationLw(IIZ)Z
HSPLcom/android/server/policy/WindowManagerPolicy;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
-HSPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->dumpLocked(Ljava/io/PrintWriter;Ljava/lang/String;)V
-HSPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->getProposedRotationLocked()I
-HSPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
-HSPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->onSensorChanged(Landroid/hardware/SensorEvent;)V
-HSPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->onTouchEndLocked(J)V
-HSPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->onTouchStartLocked()V
-HSPLcom/android/server/policy/WindowOrientationListener$OrientationJudge;->resetLocked(Z)V
-HSPLcom/android/server/policy/WindowOrientationListener;->onProposedRotationChanged(I)V
-HSPLcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;->onDrawn()V
-HSPLcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;->onTrustedChanged()V
HSPLcom/android/server/power/BatterySaverPolicy$BatterySaverPolicyListener;->onBatterySaverPolicyChanged(Lcom/android/server/power/BatterySaverPolicy;)V
+HSPLcom/android/server/power/BatterySaverPolicy;->getBatterySaverPolicy(IZ)Landroid/os/PowerSaveState;
+HSPLcom/android/server/power/PowerManagerService;->access$3100(Ljava/lang/String;)V
+HSPLcom/android/server/power/SuspendBlocker;->acquire()V
+HSPLcom/android/server/power/SuspendBlocker;->release()V
+HSPLcom/android/server/power/SuspendBlocker;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V
HSPLcom/android/server/power/batterysaver/BatterySaverController$Plugin;->onBatterySaverChanged(Lcom/android/server/power/batterysaver/BatterySaverController;)V
HSPLcom/android/server/power/batterysaver/BatterySaverController$Plugin;->onSystemReady(Lcom/android/server/power/batterysaver/BatterySaverController;)V
-HSPLcom/android/server/soundtrigger/SoundTriggerInternal;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
-HSPLcom/android/server/soundtrigger/SoundTriggerInternal;->getModuleProperties()Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
-HSPLcom/android/server/soundtrigger/SoundTriggerInternal;->startRecognition(ILandroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
-HSPLcom/android/server/soundtrigger/SoundTriggerInternal;->stopRecognition(ILandroid/hardware/soundtrigger/IRecognitionStatusCallback;)I
-HSPLcom/android/server/soundtrigger/SoundTriggerInternal;->unloadKeyphraseModel(I)I
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionCancelled()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionFinished()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionPending()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->appTransitionStarting(JJ)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->cancelPreloadRecentApps()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->dismissKeyboardShortcutsMenu()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->hideRecentApps(ZZ)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->onCameraLaunchGestureDetected(I)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->onProposedRotationChanged(IZ)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->preloadRecentApps()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->setCurrentUser(I)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->setNotificationDelegate(Lcom/android/server/notification/NotificationDelegate;)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->setSystemUiVisibility(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->setTopAppHidesStatusBar(Z)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->setWindowState(II)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->showAssistDisclosure()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->showChargingAnimation(I)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->showPictureInPictureMenu()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->showRecentApps(Z)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->showScreenPinningRequest(I)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->showShutdownUi(ZLjava/lang/String;)Z
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->startAssist(Landroid/os/Bundle;)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleKeyboardShortcutsMenu(I)V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleRecentApps()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->toggleSplitScreen()V
-HSPLcom/android/server/statusbar/StatusBarManagerInternal;->topAppWindowChanged(Z)V
-HSPLcom/android/server/storage/DeviceStorageMonitorInternal;->checkMemory()V
-HSPLcom/android/server/storage/DeviceStorageMonitorInternal;->getMemoryLowThreshold()J
-HSPLcom/android/server/storage/DeviceStorageMonitorInternal;->isMemoryLow()Z
-HSPLcom/android/server/timezone/ConfigHelper;->getCheckTimeAllowedMillis()I
-HSPLcom/android/server/timezone/ConfigHelper;->getDataAppPackageName()Ljava/lang/String;
-HSPLcom/android/server/timezone/ConfigHelper;->getFailedCheckRetryCount()I
-HSPLcom/android/server/timezone/ConfigHelper;->getUpdateAppPackageName()Ljava/lang/String;
-HSPLcom/android/server/timezone/ConfigHelper;->isTrackingEnabled()Z
-HSPLcom/android/server/timezone/PackageManagerHelper;->contentProviderRegistered(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/server/timezone/PackageManagerHelper;->getInstalledPackageVersion(Ljava/lang/String;)J
-HSPLcom/android/server/timezone/PackageManagerHelper;->isPrivilegedApp(Ljava/lang/String;)Z
-HSPLcom/android/server/timezone/PackageManagerHelper;->receiverRegistered(Landroid/content/Intent;Ljava/lang/String;)Z
-HSPLcom/android/server/timezone/PackageManagerHelper;->usesPermission(Ljava/lang/String;Ljava/lang/String;)Z
-HSPLcom/android/server/timezone/PackageTrackerIntentHelper;->initialize(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/timezone/PackageTracker;)V
-HSPLcom/android/server/timezone/PackageTrackerIntentHelper;->scheduleReliabilityTrigger(J)V
-HSPLcom/android/server/timezone/PackageTrackerIntentHelper;->sendTriggerUpdateCheck(Lcom/android/server/timezone/CheckToken;)V
-HSPLcom/android/server/timezone/PackageTrackerIntentHelper;->unscheduleReliabilityTrigger()V
-HSPLcom/android/server/timezone/PermissionHelper;->checkDumpPermission(Ljava/lang/String;Ljava/io/PrintWriter;)Z
-HSPLcom/android/server/timezone/PermissionHelper;->enforceCallerHasPermission(Ljava/lang/String;)V
-HSPLcom/android/server/timezone/RulesManagerIntentHelper;->sendTimeZoneOperationStaged()V
-HSPLcom/android/server/timezone/RulesManagerIntentHelper;->sendTimeZoneOperationUnstaged()V
-HSPLcom/android/server/twilight/TwilightListener;->onTwilightStateChanged(Lcom/android/server/twilight/TwilightState;)V
-HSPLcom/android/server/twilight/TwilightManager;->getLastTwilightState()Lcom/android/server/twilight/TwilightState;
-HSPLcom/android/server/twilight/TwilightManager;->registerListener(Lcom/android/server/twilight/TwilightListener;Landroid/os/Handler;)V
-HSPLcom/android/server/twilight/TwilightManager;->unregisterListener(Lcom/android/server/twilight/TwilightListener;)V
-HSPLcom/android/server/usage/AppTimeLimitController$OnLimitReachedListener;->onLimitReached(IIJJLandroid/app/PendingIntent;)V
+HSPLcom/android/server/power/batterysaver/BatterySaverController;->isEnabled()Z
HSPLcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;->onNewUpdate(I)V
HSPLcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;->onStatsReloaded()V
HSPLcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;->onStatsUpdated()V
-HSPLcom/android/server/usb/MtpNotificationManager$OnOpenInAppListener;->onOpenInApp(Landroid/hardware/usb/UsbDevice;)V
-HSPLcom/android/server/utils/ManagedApplicationService$BinderChecker;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
-HSPLcom/android/server/utils/ManagedApplicationService$BinderChecker;->checkType(Landroid/os/IInterface;)Z
-HSPLcom/android/server/utils/ManagedApplicationService$EventCallback;->onServiceEvent(Lcom/android/server/utils/ManagedApplicationService$LogEvent;)V
-HSPLcom/android/server/utils/ManagedApplicationService$LogFormattable;->toLogString(Ljava/text/SimpleDateFormat;)Ljava/lang/String;
-HSPLcom/android/server/vr/SettingsObserver$SettingChangeListener;->onSettingChanged()V
-HSPLcom/android/server/vr/SettingsObserver$SettingChangeListener;->onSettingRestored(Ljava/lang/String;Ljava/lang/String;I)V
-HSPLcom/android/server/vr/VrManagerInternal;->addPersistentVrModeStateListener(Landroid/service/vr/IPersistentVrStateCallbacks;)V
-HSPLcom/android/server/vr/VrManagerInternal;->getVr2dDisplayId()I
-HSPLcom/android/server/vr/VrManagerInternal;->hasVrPackage(Landroid/content/ComponentName;I)I
-HSPLcom/android/server/vr/VrManagerInternal;->isCurrentVrListener(Ljava/lang/String;I)Z
-HSPLcom/android/server/vr/VrManagerInternal;->onScreenStateChanged(Z)V
-HSPLcom/android/server/vr/VrManagerInternal;->setPersistentVrModeEnabled(Z)V
-HSPLcom/android/server/vr/VrManagerInternal;->setVr2dDisplayProperties(Landroid/app/Vr2dDisplayProperties;)V
-HSPLcom/android/server/vr/VrManagerInternal;->setVrMode(ZLandroid/content/ComponentName;IILandroid/content/ComponentName;)V
-HSPLcom/android/server/wallpaper/IWallpaperManagerService;->onBootPhase(I)V
-HSPLcom/android/server/wallpaper/IWallpaperManagerService;->onUnlockUser(I)V
-HSPLcom/android/server/webkit/SystemInterface;->enableFallbackLogic(Z)V
-HSPLcom/android/server/webkit/SystemInterface;->enablePackageForAllUsers(Landroid/content/Context;Ljava/lang/String;Z)V
-HSPLcom/android/server/webkit/SystemInterface;->enablePackageForUser(Ljava/lang/String;ZI)V
-HSPLcom/android/server/webkit/SystemInterface;->getFactoryPackageVersion(Ljava/lang/String;)J
-HSPLcom/android/server/webkit/SystemInterface;->getMultiProcessSetting(Landroid/content/Context;)I
-HSPLcom/android/server/webkit/SystemInterface;->getPackageInfoForProvider(Landroid/webkit/WebViewProviderInfo;)Landroid/content/pm/PackageInfo;
-HSPLcom/android/server/webkit/SystemInterface;->getPackageInfoForProviderAllUsers(Landroid/content/Context;Landroid/webkit/WebViewProviderInfo;)Ljava/util/List;
-HSPLcom/android/server/webkit/SystemInterface;->getUserChosenWebViewProvider(Landroid/content/Context;)Ljava/lang/String;
-HSPLcom/android/server/webkit/SystemInterface;->getWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
-HSPLcom/android/server/webkit/SystemInterface;->isFallbackLogicEnabled()Z
-HSPLcom/android/server/webkit/SystemInterface;->isMultiProcessDefaultEnabled()Z
-HSPLcom/android/server/webkit/SystemInterface;->killPackageDependents(Ljava/lang/String;)V
-HSPLcom/android/server/webkit/SystemInterface;->notifyZygote(Z)V
-HSPLcom/android/server/webkit/SystemInterface;->onWebViewProviderChanged(Landroid/content/pm/PackageInfo;)I
-HSPLcom/android/server/webkit/SystemInterface;->setMultiProcessSetting(Landroid/content/Context;I)V
-HSPLcom/android/server/webkit/SystemInterface;->systemIsDebuggable()Z
-HSPLcom/android/server/webkit/SystemInterface;->uninstallAndDisablePackageForAllUsers(Landroid/content/Context;Ljava/lang/String;)V
-HSPLcom/android/server/webkit/SystemInterface;->updateUserSetting(Landroid/content/Context;Ljava/lang/String;)V
-HSPLcom/android/server/wifi/BuildProperties;->isEngBuild()Z
-HSPLcom/android/server/wifi/BuildProperties;->isUserBuild()Z
-HSPLcom/android/server/wifi/BuildProperties;->isUserdebugBuild()Z
-HSPLcom/android/server/wifi/PropertyService;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/wifi/PropertyService;->getBoolean(Ljava/lang/String;Z)Z
-HSPLcom/android/server/wifi/PropertyService;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/server/wifi/PropertyService;->set(Ljava/lang/String;Ljava/lang/String;)V
-HSPLcom/android/server/wifi/ScanOnlyModeManager$Listener;->onStateChanged(I)V
-HSPLcom/android/server/wifi/SsidSetStoreData$DataSource;->getSsids()Ljava/util/Set;
-HSPLcom/android/server/wifi/SsidSetStoreData$DataSource;->setSsids(Ljava/util/Set;)V
-HSPLcom/android/server/wifi/WifiBackupDataParser;->parseNetworkConfigurationsFromXml(Lorg/xmlpull/v1/XmlPullParser;II)Ljava/util/List;
-HSPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkAdded(I)V
-HSPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkEnabled(I)V
-HSPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkPermanentlyDisabled(I)V
-HSPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkRemoved(I)V
-HSPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkTemporarilyDisabled(I)V
-HSPLcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;->onSavedNetworkUpdated(I)V
-HSPLcom/android/server/wifi/WifiConfigurationUtil$WifiConfigurationComparator;->compareNetworksWithSameStatus(Landroid/net/wifi/WifiConfiguration;Landroid/net/wifi/WifiConfiguration;)I
-HSPLcom/android/server/wifi/WifiMulticastLockManager$FilterController;->startFilteringMulticastPackets()V
-HSPLcom/android/server/wifi/WifiMulticastLockManager$FilterController;->stopFilteringMulticastPackets()V
-HSPLcom/android/server/wifi/WifiNative$InterfaceCallback;->onDestroyed(Ljava/lang/String;)V
-HSPLcom/android/server/wifi/WifiNative$InterfaceCallback;->onDown(Ljava/lang/String;)V
-HSPLcom/android/server/wifi/WifiNative$InterfaceCallback;->onUp(Ljava/lang/String;)V
-HSPLcom/android/server/wifi/WifiNative$PnoEventHandler;->onPnoNetworkFound([Landroid/net/wifi/ScanResult;)V
-HSPLcom/android/server/wifi/WifiNative$PnoEventHandler;->onPnoScanFailed()V
-HSPLcom/android/server/wifi/WifiNative$StatusListener;->onStatusChanged(Z)V
-HSPLcom/android/server/wifi/WifiNative$SupplicantDeathEventHandler;->onDeath()V
-HSPLcom/android/server/wifi/WifiNative$VendorHalDeathEventHandler;->onDeath()V
-HSPLcom/android/server/wifi/WifiNative$VendorHalRadioModeChangeEventHandler;->onDbs()V
-HSPLcom/android/server/wifi/WifiNative$VendorHalRadioModeChangeEventHandler;->onMcc(I)V
-HSPLcom/android/server/wifi/WifiNative$VendorHalRadioModeChangeEventHandler;->onSbs(I)V
-HSPLcom/android/server/wifi/WifiNative$VendorHalRadioModeChangeEventHandler;->onScc(I)V
-HSPLcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;->onRingBufferData(Lcom/android/server/wifi/WifiNative$RingBufferStatus;[B)V
-HSPLcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;->onWifiAlert(I[B)V
-HSPLcom/android/server/wifi/WifiNative$WifiRssiEventHandler;->onRssiThresholdBreached(B)V
-HSPLcom/android/server/wifi/WifiNative$WificondDeathEventHandler;->onDeath()V
-HSPLcom/android/server/wifi/hotspot2/OsuNetworkConnection$Callbacks;->onConnected(Landroid/net/Network;)V
-HSPLcom/android/server/wifi/hotspot2/OsuNetworkConnection$Callbacks;->onDisconnected()V
-HSPLcom/android/server/wifi/hotspot2/OsuNetworkConnection$Callbacks;->onTimeOut()V
-HSPLcom/android/server/wifi/hotspot2/OsuNetworkConnection$Callbacks;->onWifiDisabled()V
-HSPLcom/android/server/wifi/hotspot2/OsuNetworkConnection$Callbacks;->onWifiEnabled()V
-HSPLcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;->getProviderIndex()J
-HSPLcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;->getProviders()Ljava/util/List;
-HSPLcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;->setProviderIndex(J)V
-HSPLcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;->setProviders(Ljava/util/List;)V
-HSPLcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;->onANQPResponse(JLjava/util/Map;)V
-HSPLcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;->onIconResponse(JLjava/lang/String;[B)V
-HSPLcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;->onWnmFrameReceived(Lcom/android/server/wifi/hotspot2/WnmData;)V
-HSPLcom/android/server/wifi/scanner/ChannelHelper;->createChannelCollection()Lcom/android/server/wifi/scanner/ChannelHelper$ChannelCollection;
-HSPLcom/android/server/wifi/scanner/ChannelHelper;->estimateScanDuration(Landroid/net/wifi/WifiScanner$ScanSettings;)I
-HSPLcom/android/server/wifi/scanner/ChannelHelper;->getAvailableScanChannels(I)[Landroid/net/wifi/WifiScanner$ChannelSpec;
-HSPLcom/android/server/wifi/scanner/ChannelHelper;->settingsContainChannel(Landroid/net/wifi/WifiScanner$ScanSettings;I)Z
-HSPLcom/android/server/wifi/scanner/WifiScannerImpl$WifiScannerImplFactory;->create(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/wifi/Clock;)Lcom/android/server/wifi/scanner/WifiScannerImpl;
-HSPLcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;->reportEvent(IIILjava/lang/Object;)V
-HSPLcom/android/server/wm/BoundsAnimationTarget;->onAnimationEnd(ZLandroid/graphics/Rect;Z)V
-HSPLcom/android/server/wm/BoundsAnimationTarget;->onAnimationStart(ZZ)V
-HSPLcom/android/server/wm/BoundsAnimationTarget;->setPinnedStackSize(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
-HSPLcom/android/server/wm/BoundsAnimationTarget;->shouldDeferStartOnMoveToFullscreen()Z
-HSPLcom/android/server/wm/Dimmer$SurfaceAnimatorStarter;->startAnimation(Lcom/android/server/wm/SurfaceAnimator;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;Z)V
+HSPLcom/android/server/usb/descriptors/report/Reporting;->report(Lcom/android/server/usb/descriptors/report/ReportCanvas;)V
+HSPLcom/android/server/usb/descriptors/report/Reporting;->shortReport(Lcom/android/server/usb/descriptors/report/ReportCanvas;)V
+HSPLcom/android/server/vr/EnabledComponentsObserver$EnabledComponentChangeListener;->onEnabledComponentChanged()V
+HSPLcom/android/server/wm/AppWindowContainerListener;->keyDispatchingTimedOut(Ljava/lang/String;I)Z
+HSPLcom/android/server/wm/AppWindowContainerListener;->onStartingWindowDrawn(J)V
+HSPLcom/android/server/wm/AppWindowContainerListener;->onWindowsDrawn(J)V
+HSPLcom/android/server/wm/AppWindowContainerListener;->onWindowsGone()V
+HSPLcom/android/server/wm/AppWindowContainerListener;->onWindowsVisible()V
+HSPLcom/android/server/wm/RecentsAnimationController$RecentsAnimationCallbacks;->onAnimationFinished(IZ)V
HSPLcom/android/server/wm/StackWindowListener;->requestResize(Landroid/graphics/Rect;)V
-HSPLcom/android/server/wm/SurfaceAnimationRunner$AnimatorFactory;->makeAnimator()Landroid/animation/ValueAnimator;
-HSPLcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;->onAnimationFinished(Lcom/android/server/wm/AnimationAdapter;)V
-HSPLcom/android/server/wm/SurfaceBuilderFactory;->make(Landroid/view/SurfaceSession;)Landroid/view/SurfaceControl$Builder;
-HSPLcom/android/server/wm/TaskSnapshotPersister$DirectoryResolver;->getSystemDirectoryForUser(I)Ljava/io/File;
-HSPLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;->write()V
-HSPLcom/android/server/wm/TransactionFactory;->make()Landroid/view/SurfaceControl$Transaction;
-HSPLcom/android/server/wm/WindowManagerInternal$OnHardKeyboardStatusChangeListener;->onHardKeyboardStatusChange(Z)V
-HSPLcom/android/server/wm/WindowManagerInternal;->addWindowToken(Landroid/os/IBinder;II)V
-HSPLcom/android/server/wm/WindowManagerInternal;->clearLastInputMethodWindowForTransition()V
-HSPLcom/android/server/wm/WindowManagerInternal;->computeWindowsForAccessibility()V
-HSPLcom/android/server/wm/WindowManagerInternal;->getCompatibleMagnificationSpecForWindow(Landroid/os/IBinder;)Landroid/view/MagnificationSpec;
-HSPLcom/android/server/wm/WindowManagerInternal;->getFocusedWindowToken()Landroid/os/IBinder;
-HSPLcom/android/server/wm/WindowManagerInternal;->getInputMethodWindowVisibleHeight()I
-HSPLcom/android/server/wm/WindowManagerInternal;->getMagnificationRegion(Landroid/graphics/Region;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->getWindowFrame(Landroid/os/IBinder;Landroid/graphics/Rect;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->getWindowOwnerUserId(Landroid/os/IBinder;)I
-HSPLcom/android/server/wm/WindowManagerInternal;->isDockedDividerResizing()Z
-HSPLcom/android/server/wm/WindowManagerInternal;->isHardKeyboardAvailable()Z
-HSPLcom/android/server/wm/WindowManagerInternal;->isKeyguardLocked()Z
-HSPLcom/android/server/wm/WindowManagerInternal;->isKeyguardShowingAndNotOccluded()Z
-HSPLcom/android/server/wm/WindowManagerInternal;->isStackVisible(I)Z
-HSPLcom/android/server/wm/WindowManagerInternal;->lockNow()V
-HSPLcom/android/server/wm/WindowManagerInternal;->registerAppTransitionListener(Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->registerDragDropControllerCallback(Lcom/android/server/wm/WindowManagerInternal$IDragDropCallback;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->removeWindowToken(Landroid/os/IBinder;ZI)V
-HSPLcom/android/server/wm/WindowManagerInternal;->requestTraversalFromDisplayManager()V
-HSPLcom/android/server/wm/WindowManagerInternal;->saveLastInputMethodWindowForTransition()V
-HSPLcom/android/server/wm/WindowManagerInternal;->setForceShowMagnifiableBounds(Z)V
-HSPLcom/android/server/wm/WindowManagerInternal;->setInputFilter(Landroid/view/IInputFilter;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->setMagnificationCallbacks(Lcom/android/server/wm/WindowManagerInternal$MagnificationCallbacks;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->setMagnificationSpec(Landroid/view/MagnificationSpec;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->setOnHardKeyboardStatusChangeListener(Lcom/android/server/wm/WindowManagerInternal$OnHardKeyboardStatusChangeListener;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->setVr2dDisplayId(I)V
-HSPLcom/android/server/wm/WindowManagerInternal;->setWindowsForAccessibilityCallback(Lcom/android/server/wm/WindowManagerInternal$WindowsForAccessibilityCallback;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->showGlobalActions()V
-HSPLcom/android/server/wm/WindowManagerInternal;->updateInputMethodWindowStatus(Landroid/os/IBinder;ZZLandroid/os/IBinder;)V
-HSPLcom/android/server/wm/WindowManagerInternal;->waitForAllWindowsDrawn(Ljava/lang/Runnable;J)V
-HSPLcom/android/server/wm/WindowManagerService$AppFreezeListener;->onAppFreezeTimeout()V
-HSPLcom/android/server/wm/WindowState$PowerManagerWrapper;->isInteractive()Z
-HSPLcom/android/server/wm/WindowState$PowerManagerWrapper;->wakeUp(JLjava/lang/String;)V
-HSPLcom/android/server/wm/utils/RotationCache$RotationDependentComputation;->compute(Ljava/lang/Object;I)Ljava/lang/Object;
-Landroid/hardware/authsecret/V1_0/IAuthSecret;
-Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;
-Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
-Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback$Stub;
-Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;
-Landroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs$Proxy;
-Landroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;
-Landroid/hardware/configstore/V1_0/OptionalBool;
-Landroid/hardware/health/V1_0/HealthInfo;
-Landroid/hardware/health/V2_0/DiskStats;
-Landroid/hardware/health/V2_0/HealthInfo;
-Landroid/hardware/health/V2_0/IHealth$Proxy;
-Landroid/hardware/health/V2_0/IHealth;
-Landroid/hardware/health/V2_0/IHealthInfoCallback$Stub;
-Landroid/hardware/health/V2_0/IHealthInfoCallback;
-Landroid/hardware/health/V2_0/StorageAttribute;
-Landroid/hardware/health/V2_0/StorageInfo;
-Landroid/hardware/oemlock/V1_0/IOemLock$Proxy;
-Landroid/hardware/oemlock/V1_0/IOemLock;
-Landroid/hardware/usb/V1_0/IUsb$Proxy;
-Landroid/hardware/usb/V1_0/IUsb;
-Landroid/hardware/usb/V1_0/IUsbCallback;
-Landroid/hardware/usb/V1_0/PortStatus;
-Landroid/hardware/usb/V1_1/IUsbCallback$Stub;
-Landroid/hardware/usb/V1_1/IUsbCallback;
-Landroid/hardware/usb/V1_1/PortStatus_1_1;
-Landroid/hardware/weaver/V1_0/IWeaver$Proxy;
-Landroid/hardware/weaver/V1_0/IWeaver$getConfigCallback;
-Landroid/hardware/weaver/V1_0/IWeaver;
-Landroid/hardware/weaver/V1_0/WeaverConfig;
-Landroid/hardware/wifi/V1_0/IWifi$Proxy;
-Landroid/hardware/wifi/V1_0/IWifi$getChipCallback;
-Landroid/hardware/wifi/V1_0/IWifi$getChipIdsCallback;
-Landroid/hardware/wifi/V1_0/IWifi;
-Landroid/hardware/wifi/V1_0/IWifiApIface;
-Landroid/hardware/wifi/V1_0/IWifiChip$ChipDebugInfo;
-Landroid/hardware/wifi/V1_0/IWifiChip$ChipIfaceCombination;
-Landroid/hardware/wifi/V1_0/IWifiChip$ChipIfaceCombinationLimit;
-Landroid/hardware/wifi/V1_0/IWifiChip$ChipMode;
-Landroid/hardware/wifi/V1_0/IWifiChip$Proxy;
-Landroid/hardware/wifi/V1_0/IWifiChip$createNanIfaceCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$createRttControllerCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$createStaIfaceCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getApIfaceNamesCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getAvailableModesCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getCapabilitiesCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getDebugHostWakeReasonStatsCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getDebugRingBuffersStatusCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getModeCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getNanIfaceCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getNanIfaceNamesCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getP2pIfaceNamesCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$getStaIfaceNamesCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$requestChipDebugInfoCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$requestDriverDebugDumpCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip$requestFirmwareDebugDumpCallback;
-Landroid/hardware/wifi/V1_0/IWifiChip;
-Landroid/hardware/wifi/V1_0/IWifiChipEventCallback$Stub;
-Landroid/hardware/wifi/V1_0/IWifiChipEventCallback;
-Landroid/hardware/wifi/V1_0/IWifiEventCallback$Stub;
-Landroid/hardware/wifi/V1_0/IWifiEventCallback;
-Landroid/hardware/wifi/V1_0/IWifiIface$getNameCallback;
-Landroid/hardware/wifi/V1_0/IWifiIface$getTypeCallback;
-Landroid/hardware/wifi/V1_0/IWifiIface;
-Landroid/hardware/wifi/V1_0/IWifiNanIface$Proxy;
-Landroid/hardware/wifi/V1_0/IWifiNanIface;
-Landroid/hardware/wifi/V1_0/IWifiNanIfaceEventCallback;
-Landroid/hardware/wifi/V1_0/IWifiRttController$Proxy;
-Landroid/hardware/wifi/V1_0/IWifiRttController$getCapabilitiesCallback;
-Landroid/hardware/wifi/V1_0/IWifiRttController$getResponderInfoCallback;
-Landroid/hardware/wifi/V1_0/IWifiRttController;
-Landroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback$Stub;
-Landroid/hardware/wifi/V1_0/IWifiRttControllerEventCallback;
-Landroid/hardware/wifi/V1_0/IWifiStaIface$Proxy;
-Landroid/hardware/wifi/V1_0/IWifiStaIface$getApfPacketFilterCapabilitiesCallback;
-Landroid/hardware/wifi/V1_0/IWifiStaIface$getBackgroundScanCapabilitiesCallback;
-Landroid/hardware/wifi/V1_0/IWifiStaIface$getCapabilitiesCallback;
-Landroid/hardware/wifi/V1_0/IWifiStaIface$getDebugRxPacketFatesCallback;
-Landroid/hardware/wifi/V1_0/IWifiStaIface$getDebugTxPacketFatesCallback;
-Landroid/hardware/wifi/V1_0/IWifiStaIface$getLinkLayerStatsCallback;
-Landroid/hardware/wifi/V1_0/IWifiStaIface$getRoamingCapabilitiesCallback;
-Landroid/hardware/wifi/V1_0/IWifiStaIface;
-Landroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback$Stub;
-Landroid/hardware/wifi/V1_0/IWifiStaIfaceEventCallback;
-Landroid/hardware/wifi/V1_0/NanCapabilities;
-Landroid/hardware/wifi/V1_0/RttCapabilities;
-Landroid/hardware/wifi/V1_0/RttConfig;
-Landroid/hardware/wifi/V1_0/RttResponder;
-Landroid/hardware/wifi/V1_0/RttResult;
-Landroid/hardware/wifi/V1_0/StaApfPacketFilterCapabilities;
-Landroid/hardware/wifi/V1_0/StaBackgroundScanBucketParameters;
-Landroid/hardware/wifi/V1_0/StaBackgroundScanCapabilities;
-Landroid/hardware/wifi/V1_0/StaBackgroundScanParameters;
-Landroid/hardware/wifi/V1_0/StaLinkLayerIfacePacketStats;
-Landroid/hardware/wifi/V1_0/StaLinkLayerIfaceStats;
-Landroid/hardware/wifi/V1_0/StaLinkLayerRadioStats;
-Landroid/hardware/wifi/V1_0/StaLinkLayerStats;
-Landroid/hardware/wifi/V1_0/StaRoamingCapabilities;
-Landroid/hardware/wifi/V1_0/StaRoamingConfig;
-Landroid/hardware/wifi/V1_0/StaScanData;
-Landroid/hardware/wifi/V1_0/StaScanResult;
-Landroid/hardware/wifi/V1_0/WifiChannelInfo;
-Landroid/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxIcmpPacketDetails;
-Landroid/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxMulticastPacketDetails;
-Landroid/hardware/wifi/V1_0/WifiDebugHostWakeReasonRxPacketDetails;
-Landroid/hardware/wifi/V1_0/WifiDebugHostWakeReasonStats;
-Landroid/hardware/wifi/V1_0/WifiDebugPacketFateFrameInfo;
-Landroid/hardware/wifi/V1_0/WifiDebugRingBufferStatus;
-Landroid/hardware/wifi/V1_0/WifiDebugRxPacketFateReport;
-Landroid/hardware/wifi/V1_0/WifiDebugTxPacketFateReport;
-Landroid/hardware/wifi/V1_0/WifiInformationElement;
-Landroid/hardware/wifi/V1_0/WifiNanStatus;
-Landroid/hardware/wifi/V1_0/WifiRateInfo;
-Landroid/hardware/wifi/V1_0/WifiStatus;
-Landroid/hardware/wifi/V1_0/WifiStatusCode;
-Landroid/hardware/wifi/V1_1/IWifiChip;
-Landroid/hardware/wifi/V1_2/IWifiChip$Proxy;
-Landroid/hardware/wifi/V1_2/IWifiChip;
-Landroid/hardware/wifi/V1_2/IWifiChipEventCallback$Stub;
-Landroid/hardware/wifi/V1_2/IWifiChipEventCallback;
-Landroid/hardware/wifi/V1_2/IWifiNanIface$Proxy;
-Landroid/hardware/wifi/V1_2/IWifiNanIface;
-Landroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback$Stub;
-Landroid/hardware/wifi/V1_2/IWifiNanIfaceEventCallback;
-Landroid/hardware/wifi/V1_2/IWifiStaIface$readApfPacketFilterDataCallback;
-Landroid/hardware/wifi/V1_2/IWifiStaIface;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$IfaceInfo;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicant$Proxy;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicant;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$Proxy;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface$listNetworksCallback;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicantIface;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface$getMacAddressCallback;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIface;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback$Stub;
-Landroid/hardware/wifi/supplicant/V1_0/ISupplicantStaIfaceCallback;
-Landroid/hardware/wifi/supplicant/V1_0/SupplicantStatus;
-Landroid/hardware/wifi/supplicant/V1_1/ISupplicant$Proxy;
-Landroid/hardware/wifi/supplicant/V1_1/ISupplicant$addInterfaceCallback;
-Landroid/hardware/wifi/supplicant/V1_1/ISupplicant;
-Landroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface$Proxy;
-Landroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIface;
-Landroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback$Stub;
-Landroid/hardware/wifi/supplicant/V1_1/ISupplicantStaIfaceCallback;
-Landroid/media/IMediaExtractorUpdateService$Stub$Proxy;
-Landroid/media/IMediaExtractorUpdateService$Stub;
-Landroid/media/IMediaExtractorUpdateService;
-Landroid/net/apf/ApfCapabilities;
-Landroid/net/apf/ApfFilter;
-Landroid/net/dhcp/DhcpClient$ReceiveThread;
-Landroid/net/dhcp/DhcpClient;
-Landroid/net/ip/InterfaceController;
-Landroid/net/ip/IpClient$2;
-Landroid/net/ip/IpClient$3;
-Landroid/net/ip/IpClient$Callback;
-Landroid/net/ip/IpClient$Dependencies;
-Landroid/net/ip/IpClient$LoggingCallbackWrapper;
-Landroid/net/ip/IpClient$MessageHandlingLogger;
-Landroid/net/ip/IpClient$ProvisioningConfiguration$Builder;
-Landroid/net/ip/IpClient$ProvisioningConfiguration;
-Landroid/net/ip/IpClient$RunningState;
-Landroid/net/ip/IpClient$StartedState;
-Landroid/net/ip/IpClient$StoppedState;
-Landroid/net/ip/IpClient$StoppingState;
-Landroid/net/ip/IpClient;
-Landroid/net/ip/IpReachabilityMonitor;
-Landroid/net/ip/RouterAdvertisementDaemon$RaParams;
-Landroid/net/ip/RouterAdvertisementDaemon;
-Landroid/net/metrics/INetdEventListener$Stub;
-Landroid/net/metrics/INetdEventListener;
-Landroid/net/util/-$$Lambda$MultinetworkPolicyTracker$0siHK6f4lHJz8hbdHbT6G4Kp-V4;
-Landroid/net/util/InterfaceParams;
-Landroid/net/util/InterfaceSet;
-Landroid/net/util/MultinetworkPolicyTracker$1;
-Landroid/net/util/MultinetworkPolicyTracker$SettingObserver;
-Landroid/net/util/MultinetworkPolicyTracker;
-Landroid/net/util/NetdService;
-Landroid/net/util/SharedLog$Category;
-Landroid/net/util/SharedLog;
-Landroid/net/util/VersionedBroadcastListener$Receiver;
-Landroid/net/util/VersionedBroadcastListener;
-Landroid/net/wifi/IClientInterface$Stub$Proxy;
-Landroid/net/wifi/IClientInterface$Stub;
-Landroid/net/wifi/IClientInterface;
-Landroid/net/wifi/IPnoScanEvent$Stub;
-Landroid/net/wifi/IPnoScanEvent;
-Landroid/net/wifi/IScanEvent$Stub;
-Landroid/net/wifi/IScanEvent;
-Landroid/net/wifi/IWifiScannerImpl$Stub$Proxy;
-Landroid/net/wifi/IWifiScannerImpl$Stub;
-Landroid/net/wifi/IWifiScannerImpl;
-Landroid/net/wifi/IWificond$Stub$Proxy;
-Landroid/net/wifi/IWificond$Stub;
-Landroid/net/wifi/IWificond;
-Lcom/android/server/-$$Lambda$1xUIIN0BU8izGcnYWT-VzczLBFU;
-Lcom/android/server/-$$Lambda$AlarmManagerService$ZVedZIeWdB3G6AGM0_-9P_GEO24;
+HSPLcom/android/server/wm/TaskWindowContainerListener;->onSnapshotChanged(Landroid/app/ActivityManager$TaskSnapshot;)V
+HSPLcom/android/server/wm/TaskWindowContainerListener;->requestResize(Landroid/graphics/Rect;I)V
+HSPLcom/android/server/wm/WindowContainerListener;->registerConfigurationChangeListener(Lcom/android/server/wm/ConfigurationContainerListener;)V
+HSPLcom/android/server/wm/WindowContainerListener;->unregisterConfigurationChangeListener(Lcom/android/server/wm/ConfigurationContainerListener;)V
+Lcom/android/server/-$$Lambda$AppOpsService$1lQKm3WHEUQsD7KzYyJ5stQSc04;
+Lcom/android/server/-$$Lambda$AppOpsService$NC5g1JY4YR6y4VePru4TO7AKp8M;
Lcom/android/server/-$$Lambda$AppOpsService$UKMH8n9xZqCOX59uFPylskhjBgo;
-Lcom/android/server/-$$Lambda$AppStateTracker$zzioY8jvEm-1GnJ13CUiQGauPEE;
-Lcom/android/server/-$$Lambda$BatteryService$2x73lvpB0jctMSVP4qb9sHAqRPw;
-Lcom/android/server/-$$Lambda$BatteryService$D1kwd7L7yyqN5niz3KWkTepVmUk;
-Lcom/android/server/-$$Lambda$CommonTimeManagementService$2pDf0xdhqutmGymQBZY0XdP5zLg;
-Lcom/android/server/-$$Lambda$CommonTimeManagementService$G4hdVfmKjXahO1EZQGCi66JNtFI;
-Lcom/android/server/-$$Lambda$CommonTimeManagementService$o7NVT2DAE8gGyUPocEDzMJMp3rY;
-Lcom/android/server/-$$Lambda$ConnectivityService$SFqiR4Pfksb1C7csMC3uNxCllR8;
-Lcom/android/server/-$$Lambda$ContextHubSystemService$q-5gSEKm3he-4vIHcay4DLtf85E;
-Lcom/android/server/-$$Lambda$GraphicsStatsService$2EDVu98hsJvSwNgKvijVLSR3IrQ;
-Lcom/android/server/-$$Lambda$IpSecService$AnqunmSwm_yQvDDEPg-gokhVs5M;
-Lcom/android/server/-$$Lambda$NetworkManagementService$VhSl9D6THA_3jE0unleMmkHavJ0;
-Lcom/android/server/-$$Lambda$NetworkManagementService$_L953cbquVj0BMBP1MZlSTm0Umg;
-Lcom/android/server/-$$Lambda$NetworkManagementService$iDseO-DhVR7T2LR6qxVJCC-3wfI;
-Lcom/android/server/-$$Lambda$PersistentDataBlockService$EZl9OYaT2eNL7kfSr2nKUBjxidk;
-Lcom/android/server/-$$Lambda$QTLvklqCTz22VSzZPEWJs-o0bv4;
+Lcom/android/server/-$$Lambda$AppOpsService$lxgFmOnGguOiLyfUZbyOpNBfTVw;
+Lcom/android/server/-$$Lambda$LockGuard$C107ImDhsfBAwlfWxZPBoVXIl_4;
Lcom/android/server/-$$Lambda$SystemServer$NlJmG18aPrQduhRqASIdcn7G0z8;
Lcom/android/server/-$$Lambda$SystemServer$UyrPns7R814g-ZEylCbDKhe8It4;
Lcom/android/server/-$$Lambda$SystemServer$VBGb9VpEls6bUcVBPwYLtX7qDTs;
Lcom/android/server/-$$Lambda$SystemServer$Y1gEdKr_Hb7K7cbTDAo_WOJ-SYI;
Lcom/android/server/-$$Lambda$SystemServer$s9erd2iGXiS7bbg_mQJUxyVboQM;
Lcom/android/server/-$$Lambda$SystemServerInitThreadPool$7wfLGkZF7FvYZv7xj3ghvuiJJGk;
-Lcom/android/server/-$$Lambda$TextServicesManagerService$Gx5nx59gL-Y47MWUiJn5TqC2DLs;
-Lcom/android/server/-$$Lambda$UiModeManagerService$SMGExVQCkMpTx7aAoJee7KHGMA0;
Lcom/android/server/-$$Lambda$YWiwiKm_Qgqb55C6tTuq_n2JzdY;
Lcom/android/server/AlarmManagerInternal;
-Lcom/android/server/AlarmManagerService$1;
-Lcom/android/server/AlarmManagerService$2;
-Lcom/android/server/AlarmManagerService$5;
-Lcom/android/server/AlarmManagerService$Alarm;
-Lcom/android/server/AlarmManagerService$AlarmHandler;
-Lcom/android/server/AlarmManagerService$AlarmThread;
-Lcom/android/server/AlarmManagerService$AppStandbyTracker;
-Lcom/android/server/AlarmManagerService$Batch;
-Lcom/android/server/AlarmManagerService$BatchTimeOrder;
-Lcom/android/server/AlarmManagerService$BroadcastStats;
-Lcom/android/server/AlarmManagerService$ClockReceiver;
-Lcom/android/server/AlarmManagerService$Constants;
-Lcom/android/server/AlarmManagerService$DeliveryTracker;
-Lcom/android/server/AlarmManagerService$FilterStats;
-Lcom/android/server/AlarmManagerService$InFlight;
-Lcom/android/server/AlarmManagerService$IncreasingTimeOrder;
-Lcom/android/server/AlarmManagerService$InteractiveStateReceiver;
-Lcom/android/server/AlarmManagerService$LocalService;
-Lcom/android/server/AlarmManagerService$PriorityClass;
-Lcom/android/server/AlarmManagerService$UidObserver;
-Lcom/android/server/AlarmManagerService$UninstallReceiver;
Lcom/android/server/AlarmManagerService;
Lcom/android/server/AnimationThread;
-Lcom/android/server/AnyMotionDetector$1;
-Lcom/android/server/AnyMotionDetector$2;
-Lcom/android/server/AnyMotionDetector$3;
-Lcom/android/server/AnyMotionDetector$4;
Lcom/android/server/AnyMotionDetector$DeviceIdleCallback;
-Lcom/android/server/AnyMotionDetector$RunningSignalStats;
-Lcom/android/server/AnyMotionDetector$Vector3;
-Lcom/android/server/AnyMotionDetector;
+Lcom/android/server/AppOpsService$1$1;
Lcom/android/server/AppOpsService$1;
Lcom/android/server/AppOpsService$2;
Lcom/android/server/AppOpsService$3;
Lcom/android/server/AppOpsService$ActiveCallback;
+Lcom/android/server/AppOpsService$AppOpsManagerInternalImpl;
+Lcom/android/server/AppOpsService$ChangeRec;
Lcom/android/server/AppOpsService$ClientRestrictionState;
Lcom/android/server/AppOpsService$ClientState;
Lcom/android/server/AppOpsService$Constants;
@@ -1646,334 +3018,111 @@ Lcom/android/server/AppOpsService$ModeCallback;
Lcom/android/server/AppOpsService$Op;
Lcom/android/server/AppOpsService$Ops;
Lcom/android/server/AppOpsService$Restriction;
+Lcom/android/server/AppOpsService$Shell;
Lcom/android/server/AppOpsService$UidState;
Lcom/android/server/AppOpsService;
-Lcom/android/server/AppStateTracker$AppOpsWatcher;
-Lcom/android/server/AppStateTracker$FeatureFlagsObserver;
Lcom/android/server/AppStateTracker$Listener;
-Lcom/android/server/AppStateTracker$MyHandler;
-Lcom/android/server/AppStateTracker$MyReceiver;
-Lcom/android/server/AppStateTracker$StandbyTracker;
-Lcom/android/server/AppStateTracker$UidObserver;
Lcom/android/server/AppStateTracker;
-Lcom/android/server/AttributeCache$Entry;
-Lcom/android/server/AttributeCache$Package;
Lcom/android/server/AttributeCache;
-Lcom/android/server/BatteryService$2;
-Lcom/android/server/BatteryService$3;
-Lcom/android/server/BatteryService$4;
-Lcom/android/server/BatteryService$BatteryPropertiesRegistrar;
-Lcom/android/server/BatteryService$BinderService;
-Lcom/android/server/BatteryService$HealthHalCallback;
-Lcom/android/server/BatteryService$HealthServiceWrapper$Callback;
-Lcom/android/server/BatteryService$HealthServiceWrapper$IHealthSupplier;
-Lcom/android/server/BatteryService$HealthServiceWrapper$IServiceManagerSupplier;
-Lcom/android/server/BatteryService$HealthServiceWrapper$Notification$1;
-Lcom/android/server/BatteryService$HealthServiceWrapper$Notification;
-Lcom/android/server/BatteryService$HealthServiceWrapper;
-Lcom/android/server/BatteryService$Led;
-Lcom/android/server/BatteryService$LocalService;
Lcom/android/server/BatteryService;
Lcom/android/server/BinderCallsStatsService;
-Lcom/android/server/BluetoothManagerService$1;
-Lcom/android/server/BluetoothManagerService$2;
-Lcom/android/server/BluetoothManagerService$3;
-Lcom/android/server/BluetoothManagerService$4;
-Lcom/android/server/BluetoothManagerService$5;
-Lcom/android/server/BluetoothManagerService$ActiveLog;
-Lcom/android/server/BluetoothManagerService$BluetoothHandler;
-Lcom/android/server/BluetoothManagerService$BluetoothServiceConnection;
-Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;
-Lcom/android/server/BluetoothManagerService;
Lcom/android/server/BluetoothService;
-Lcom/android/server/CertBlacklister$BlacklistObserver;
Lcom/android/server/CertBlacklister;
-Lcom/android/server/CommonTimeManagementService$1;
-Lcom/android/server/CommonTimeManagementService$2;
-Lcom/android/server/CommonTimeManagementService$InterfaceScoreRule;
Lcom/android/server/CommonTimeManagementService;
-Lcom/android/server/ConnectivityService$1;
-Lcom/android/server/ConnectivityService$2;
-Lcom/android/server/ConnectivityService$3;
-Lcom/android/server/ConnectivityService$4;
-Lcom/android/server/ConnectivityService$5;
-Lcom/android/server/ConnectivityService$6;
-Lcom/android/server/ConnectivityService$7;
-Lcom/android/server/ConnectivityService$InternalHandler;
-Lcom/android/server/ConnectivityService$LegacyTypeTracker;
-Lcom/android/server/ConnectivityService$NetworkFactoryInfo;
-Lcom/android/server/ConnectivityService$NetworkRequestInfo;
-Lcom/android/server/ConnectivityService$NetworkStateTrackerHandler;
-Lcom/android/server/ConnectivityService$SettingsObserver;
Lcom/android/server/ConnectivityService;
Lcom/android/server/ConsumerIrService;
Lcom/android/server/ContextHubSystemService;
-Lcom/android/server/CountryDetectorService$1;
Lcom/android/server/CountryDetectorService;
-Lcom/android/server/DeviceIdleController$1;
-Lcom/android/server/DeviceIdleController$2;
-Lcom/android/server/DeviceIdleController$3;
-Lcom/android/server/DeviceIdleController$4;
-Lcom/android/server/DeviceIdleController$5;
-Lcom/android/server/DeviceIdleController$6;
-Lcom/android/server/DeviceIdleController$7;
-Lcom/android/server/DeviceIdleController$8;
-Lcom/android/server/DeviceIdleController$9;
-Lcom/android/server/DeviceIdleController$BinderService;
-Lcom/android/server/DeviceIdleController$Constants;
Lcom/android/server/DeviceIdleController$LocalService;
-Lcom/android/server/DeviceIdleController$MotionListener;
-Lcom/android/server/DeviceIdleController$MyHandler;
Lcom/android/server/DeviceIdleController;
Lcom/android/server/DiskStatsService;
Lcom/android/server/DisplayThread;
-Lcom/android/server/DockObserver$1;
-Lcom/android/server/DockObserver$2;
-Lcom/android/server/DockObserver$BinderService;
Lcom/android/server/DockObserver;
-Lcom/android/server/DropBoxManagerService$1$1;
-Lcom/android/server/DropBoxManagerService$1;
-Lcom/android/server/DropBoxManagerService$2;
-Lcom/android/server/DropBoxManagerService$3;
-Lcom/android/server/DropBoxManagerService$4;
-Lcom/android/server/DropBoxManagerService$EntryFile;
-Lcom/android/server/DropBoxManagerService$FileList;
Lcom/android/server/DropBoxManagerService;
-Lcom/android/server/EntropyMixer$1;
-Lcom/android/server/EntropyMixer$2;
Lcom/android/server/EntropyMixer;
Lcom/android/server/EventLogTags;
Lcom/android/server/FgThread;
-Lcom/android/server/GestureLauncherService$1;
-Lcom/android/server/GestureLauncherService$2;
-Lcom/android/server/GestureLauncherService$CameraLiftTriggerEventListener;
-Lcom/android/server/GestureLauncherService$GestureEventListener;
Lcom/android/server/GestureLauncherService;
-Lcom/android/server/GraphicsStatsService$1;
-Lcom/android/server/GraphicsStatsService$ActiveBuffer;
-Lcom/android/server/GraphicsStatsService$BufferInfo;
Lcom/android/server/GraphicsStatsService;
Lcom/android/server/HardwarePropertiesManagerService;
-Lcom/android/server/INativeDaemonConnectorCallbacks;
-Lcom/android/server/InputMethodManagerService$1;
-Lcom/android/server/InputMethodManagerService$2;
-Lcom/android/server/InputMethodManagerService$3;
-Lcom/android/server/InputMethodManagerService$ClientState;
-Lcom/android/server/InputMethodManagerService$HardKeyboardListener;
-Lcom/android/server/InputMethodManagerService$ImmsBroadcastReceiver;
-Lcom/android/server/InputMethodManagerService$InputMethodFileManager;
Lcom/android/server/InputMethodManagerService$Lifecycle;
-Lcom/android/server/InputMethodManagerService$LocalServiceImpl;
-Lcom/android/server/InputMethodManagerService$MyPackageMonitor;
-Lcom/android/server/InputMethodManagerService$SettingsObserver;
-Lcom/android/server/InputMethodManagerService$StartInputHistory$Entry;
-Lcom/android/server/InputMethodManagerService$StartInputHistory;
-Lcom/android/server/InputMethodManagerService;
Lcom/android/server/IntentResolver$1;
+Lcom/android/server/IntentResolver$IteratorWrapper;
Lcom/android/server/IntentResolver;
Lcom/android/server/IoThread;
-Lcom/android/server/IpSecService$1;
-Lcom/android/server/IpSecService$IpSecServiceConfiguration$1;
-Lcom/android/server/IpSecService$IpSecServiceConfiguration;
-Lcom/android/server/IpSecService$UidFdTagger;
-Lcom/android/server/IpSecService$UserResourceTracker;
Lcom/android/server/IpSecService;
-Lcom/android/server/LocationManagerService$1;
-Lcom/android/server/LocationManagerService$2;
-Lcom/android/server/LocationManagerService$3;
-Lcom/android/server/LocationManagerService$4$1;
-Lcom/android/server/LocationManagerService$4;
-Lcom/android/server/LocationManagerService$5;
-Lcom/android/server/LocationManagerService$6;
-Lcom/android/server/LocationManagerService$7;
-Lcom/android/server/LocationManagerService$8;
-Lcom/android/server/LocationManagerService$9;
-Lcom/android/server/LocationManagerService$Identity;
-Lcom/android/server/LocationManagerService$LocationWorkerHandler;
-Lcom/android/server/LocationManagerService$Receiver;
-Lcom/android/server/LocationManagerService$UpdateRecord;
Lcom/android/server/LocationManagerService;
+Lcom/android/server/LockGuard$1;
Lcom/android/server/LockGuard$LockInfo;
Lcom/android/server/LockGuard;
-Lcom/android/server/MmsServiceBroker$1;
-Lcom/android/server/MmsServiceBroker$2;
-Lcom/android/server/MmsServiceBroker$3;
-Lcom/android/server/MmsServiceBroker$BinderService;
Lcom/android/server/MmsServiceBroker;
-Lcom/android/server/MountServiceIdler;
-Lcom/android/server/NativeDaemonConnector$ResponseQueue$PendingCmd;
-Lcom/android/server/NativeDaemonConnector$ResponseQueue;
-Lcom/android/server/NativeDaemonConnector$SensitiveArg;
-Lcom/android/server/NativeDaemonConnector;
-Lcom/android/server/NativeDaemonConnectorException;
-Lcom/android/server/NativeDaemonEvent;
Lcom/android/server/NetworkManagementInternal;
-Lcom/android/server/NetworkManagementService$LocalService;
-Lcom/android/server/NetworkManagementService$NetdCallbackReceiver;
-Lcom/android/server/NetworkManagementService$NetdTetheringStatsProvider;
-Lcom/android/server/NetworkManagementService$NetworkManagementEventCallback;
-Lcom/android/server/NetworkManagementService$SystemServices;
Lcom/android/server/NetworkManagementService;
-Lcom/android/server/NetworkScoreService$1;
-Lcom/android/server/NetworkScoreService$2;
-Lcom/android/server/NetworkScoreService$3;
-Lcom/android/server/NetworkScoreService$4;
-Lcom/android/server/NetworkScoreService$5;
-Lcom/android/server/NetworkScoreService$DispatchingContentObserver;
Lcom/android/server/NetworkScoreService$Lifecycle;
-Lcom/android/server/NetworkScoreService$ServiceHandler;
-Lcom/android/server/NetworkScoreService;
-Lcom/android/server/NetworkScorerAppManager$SettingsFacade;
-Lcom/android/server/NetworkScorerAppManager;
-Lcom/android/server/NetworkTimeUpdateService$1;
-Lcom/android/server/NetworkTimeUpdateService$2;
-Lcom/android/server/NetworkTimeUpdateService$MyHandler;
-Lcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;
-Lcom/android/server/NetworkTimeUpdateService$SettingsObserver;
Lcom/android/server/NetworkTimeUpdateService;
-Lcom/android/server/NsdService$DaemonConnection;
-Lcom/android/server/NsdService$DaemonConnectionSupplier;
-Lcom/android/server/NsdService$NativeCallbackReceiver;
-Lcom/android/server/NsdService$NsdSettings$1;
-Lcom/android/server/NsdService$NsdSettings;
-Lcom/android/server/NsdService$NsdStateMachine$1;
-Lcom/android/server/NsdService$NsdStateMachine$DefaultState;
-Lcom/android/server/NsdService$NsdStateMachine$DisabledState;
-Lcom/android/server/NsdService$NsdStateMachine$EnabledState;
-Lcom/android/server/NsdService$NsdStateMachine;
Lcom/android/server/NsdService;
-Lcom/android/server/PersistentDataBlockManagerInternal;
-Lcom/android/server/PersistentDataBlockService$1;
-Lcom/android/server/PersistentDataBlockService$2;
Lcom/android/server/PersistentDataBlockService;
-Lcom/android/server/PinnerService$1;
-Lcom/android/server/PinnerService$BinderService;
-Lcom/android/server/PinnerService$PinnedFile;
-Lcom/android/server/PinnerService$PinnerHandler;
Lcom/android/server/PinnerService;
Lcom/android/server/PruneInstantAppsJobService;
-Lcom/android/server/RandomBlock;
+Lcom/android/server/RecoverySystemService$1;
Lcom/android/server/RecoverySystemService$BinderService;
Lcom/android/server/RecoverySystemService;
+Lcom/android/server/RescueParty$AppThreshold;
Lcom/android/server/RescueParty$BootThreshold;
Lcom/android/server/RescueParty$Threshold;
Lcom/android/server/RescueParty;
Lcom/android/server/SensorNotificationService;
Lcom/android/server/SerialService;
Lcom/android/server/ServiceThread;
-Lcom/android/server/ServiceWatcher$1;
-Lcom/android/server/ServiceWatcher$2;
-Lcom/android/server/ServiceWatcher$BinderRunner;
-Lcom/android/server/ServiceWatcher;
-Lcom/android/server/StorageManagerService$1;
-Lcom/android/server/StorageManagerService$2;
-Lcom/android/server/StorageManagerService$3;
-Lcom/android/server/StorageManagerService$4;
-Lcom/android/server/StorageManagerService$5;
-Lcom/android/server/StorageManagerService$Callbacks;
-Lcom/android/server/StorageManagerService$DefaultContainerConnection;
-Lcom/android/server/StorageManagerService$Lifecycle;
-Lcom/android/server/StorageManagerService$ObbActionHandler;
-Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;
-Lcom/android/server/StorageManagerService$StorageManagerServiceHandler;
-Lcom/android/server/StorageManagerService;
+Lcom/android/server/SystemServer$1;
Lcom/android/server/SystemServer;
Lcom/android/server/SystemServerInitThreadPool;
Lcom/android/server/SystemService;
Lcom/android/server/SystemServiceManager;
Lcom/android/server/SystemUpdateManagerService;
-Lcom/android/server/TelephonyRegistry$1;
-Lcom/android/server/TelephonyRegistry$2;
-Lcom/android/server/TelephonyRegistry$Record;
-Lcom/android/server/TelephonyRegistry$TelephonyRegistryDeathRecipient;
Lcom/android/server/TelephonyRegistry;
Lcom/android/server/TextServicesManagerService$Lifecycle;
-Lcom/android/server/TextServicesManagerService$TextServicesData;
-Lcom/android/server/TextServicesManagerService$TextServicesMonitor;
-Lcom/android/server/TextServicesManagerService;
Lcom/android/server/ThreadPriorityBooster$1;
Lcom/android/server/ThreadPriorityBooster$PriorityState;
Lcom/android/server/ThreadPriorityBooster;
-Lcom/android/server/UiModeManagerService$1;
-Lcom/android/server/UiModeManagerService$2;
-Lcom/android/server/UiModeManagerService$3;
-Lcom/android/server/UiModeManagerService$4;
-Lcom/android/server/UiModeManagerService$5;
-Lcom/android/server/UiModeManagerService$6;
Lcom/android/server/UiModeManagerService;
Lcom/android/server/UiThread;
-Lcom/android/server/UpdateLockService$LockWatcher;
Lcom/android/server/UpdateLockService;
-Lcom/android/server/VibratorService$1;
-Lcom/android/server/VibratorService$2;
-Lcom/android/server/VibratorService$3;
-Lcom/android/server/VibratorService$4;
-Lcom/android/server/VibratorService$SettingsObserver;
Lcom/android/server/VibratorService;
+Lcom/android/server/Watchdog$1;
Lcom/android/server/Watchdog$BinderThreadMonitor;
Lcom/android/server/Watchdog$HandlerChecker;
Lcom/android/server/Watchdog$Monitor;
Lcom/android/server/Watchdog$OpenFdMonitor;
Lcom/android/server/Watchdog$RebootRequestReceiver;
Lcom/android/server/Watchdog;
-Lcom/android/server/WiredAccessoryManager$1;
-Lcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;
-Lcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;
+Lcom/android/server/WatchdogDiagnostics;
Lcom/android/server/WiredAccessoryManager;
-Lcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$5vwr6qV-eqdCr73CeDmVnsJlZHM;
-Lcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$CNt8wbTQCYcsUnUkUCQHtKqr-tY;
-Lcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$K4sS36agT2_B03tVUTy8mldugxY;
-Lcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$RFkfb_W9wnTTs_gy8Dg3k2uQOYQ;
-Lcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$mAPLBShddfLlktd9Q8jVo04VVXo;
-Lcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$w0ifSldCn8nADYgU7v1foSdmfe0;
-Lcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$zXJtauhUptSkQJSF-M55-grAVbo;
Lcom/android/server/accessibility/AbstractAccessibilityServiceConnection$SystemSupport;
-Lcom/android/server/accessibility/AbstractAccessibilityServiceConnection;
-Lcom/android/server/accessibility/AccessibilityManagerService$1;
-Lcom/android/server/accessibility/AccessibilityManagerService$2;
-Lcom/android/server/accessibility/AccessibilityManagerService$AccessibilityContentObserver;
-Lcom/android/server/accessibility/AccessibilityManagerService$Client;
-Lcom/android/server/accessibility/AccessibilityManagerService$MainHandler;
-Lcom/android/server/accessibility/AccessibilityManagerService$RemoteAccessibilityConnection;
-Lcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;
-Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
Lcom/android/server/accessibility/AccessibilityManagerService;
-Lcom/android/server/accessibility/AccessibilityServiceConnection;
-Lcom/android/server/accessibility/DisplayAdjustmentUtils;
-Lcom/android/server/accessibility/FingerprintGestureDispatcher$FingerprintGestureClient;
-Lcom/android/server/accessibility/GlobalActionPerformer;
-Lcom/android/server/accessibility/KeyEventDispatcher$KeyEventFilter;
-Lcom/android/server/accessibility/UiAutomationManager$1;
-Lcom/android/server/accessibility/UiAutomationManager;
-Lcom/android/server/accounts/-$$Lambda$AccountManagerService$c6GExIY3Vh2fORdBziuAPJbExac;
-Lcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;
-Lcom/android/server/accounts/AccountAuthenticatorCache;
-Lcom/android/server/accounts/AccountManagerService$1;
-Lcom/android/server/accounts/AccountManagerService$2;
-Lcom/android/server/accounts/AccountManagerService$3;
-Lcom/android/server/accounts/AccountManagerService$4;
-Lcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;
-Lcom/android/server/accounts/AccountManagerService$Injector;
-Lcom/android/server/accounts/AccountManagerService$Lifecycle;
-Lcom/android/server/accounts/AccountManagerService$MessageHandler;
-Lcom/android/server/accounts/AccountManagerService$UserAccounts;
-Lcom/android/server/accounts/AccountManagerService;
-Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;
-Lcom/android/server/accounts/AccountsDb;
-Lcom/android/server/accounts/IAccountAuthenticatorCache;
-Lcom/android/server/accounts/TokenCache$TokenLruCache;
-Lcom/android/server/accounts/TokenCache;
Lcom/android/server/am/-$$Lambda$5hokEl5hcign5FXeGZdl53qh2zg;
+Lcom/android/server/am/-$$Lambda$ActivityManagerService$3$poTyYzHinA8s8lAJ-y6Bb3JsBNo;
Lcom/android/server/am/-$$Lambda$ActivityManagerService$UgpguyCBuObHjnmry_xkrJGkFi0;
Lcom/android/server/am/-$$Lambda$ActivityManagerService$dLQ66dH4nIti4hweaVJTGHj2tMU;
Lcom/android/server/am/-$$Lambda$ActivityManagerService$eFxS8Z-_MXzP9a8ro45rBMHy3bk;
Lcom/android/server/am/-$$Lambda$ActivityManagerService$gATL8uvTPRd405IfefK1RL9bNqA;
+Lcom/android/server/am/-$$Lambda$ActivityManagerService$nLON5M4YCRoJpSNB1Y_UERhbBKo;
Lcom/android/server/am/-$$Lambda$ActivityManagerService$w5jCshLsk1jfv4UDTmEfq_HU0OQ;
+Lcom/android/server/am/-$$Lambda$ActivityMetricsLogger$EXtnEt47a9lJOX0u5R1TXhfh0XE;
+Lcom/android/server/am/-$$Lambda$ActivityStackSupervisor$2EfPspQe887pLmnBFuHkVjyLdzE;
+Lcom/android/server/am/-$$Lambda$ActivityStackSupervisor$x0Vocp-itdO3YPTBM6d_k8Yij7g;
+Lcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$7toxTvZDSEytL0rCkoEfGilPDWM;
Lcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$Nx17DLnpsjeC2juW1TuPEAogLvE;
Lcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$PpNEY15dspg9oLlkg1OsyjrPTqw;
Lcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$cC4f0pNQX9_D9f8AXLmKk2sArGY;
+Lcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$eNtlYRY6yBjSWzaL4STPjcGEduM;
Lcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$y4b5S_CLdUbDV0ejaQDagLXGZRg;
Lcom/android/server/am/-$$Lambda$BatteryStatsService$ZxbqtJ7ozYmzYFkkNV3m_QRd0Sk;
+Lcom/android/server/am/-$$Lambda$BatteryStatsService$rRONgIFHr4sujxPESRmo9P5RJ6w;
+Lcom/android/server/am/-$$Lambda$HKoBBTwYfMTyX1rzuzxIXu0s2cc;
+Lcom/android/server/am/-$$Lambda$LockTaskController$CFBSOJhWPyFwVT85DSWkAEj1wF0;
+Lcom/android/server/am/-$$Lambda$LockTaskController$HCwwKEV1_Hy1M3bHXdwhoMEXmJM;
+Lcom/android/server/am/-$$Lambda$LockTaskController$utz-CwgPkuGXoN5jp5hMoe4EpuQ;
Lcom/android/server/am/-$$Lambda$RecentTasks$NgzE6eN0wIO1cgLW7RzciPDBTHk;
Lcom/android/server/am/-$$Lambda$RunningTasks$BGar3HlUsTw-0HzSmfkEWly0moY;
Lcom/android/server/am/-$$Lambda$TaskChangeNotificationController$1RAH1a7gRlnrDczBty2_cTiNlBI;
@@ -1993,38 +3142,70 @@ Lcom/android/server/am/-$$Lambda$TaskChangeNotificationController$grn5FwM5ofT98e
Lcom/android/server/am/-$$Lambda$TaskChangeNotificationController$iVGVcx2Ee37igl6ebl_htq_WO9o;
Lcom/android/server/am/-$$Lambda$TaskChangeNotificationController$kftD881t3KfWCASQEbeTkieVI2M;
Lcom/android/server/am/-$$Lambda$TaskChangeNotificationController$sw023kIrIGSeLwYwKC0ioKX3zEA;
+Lcom/android/server/am/-$$Lambda$UserController$6-7xYKliE1NO81VB53uGwFaD8Jg;
+Lcom/android/server/am/-$$Lambda$UserController$AHHTCREuropaUGilzG-tndQCCSM;
+Lcom/android/server/am/-$$Lambda$UserController$Eh5Od1-6teHInq04bnfmHhMt3-E;
+Lcom/android/server/am/-$$Lambda$UserController$GGvEPHwny2cP0yTZnJTgitTq9_U;
+Lcom/android/server/am/-$$Lambda$UserController$OCWSENtTocgCKtAUTrbiQWfjiB4;
+Lcom/android/server/am/-$$Lambda$UserController$d0zeElfogOIugnQQLWhCzumk53k;
+Lcom/android/server/am/-$$Lambda$UserController$o6oQFjGYYIfx-I94cSakTLPLt6s;
+Lcom/android/server/am/-$$Lambda$Y_KRxxoOXfy-YceuDG7WHd46Y_I;
Lcom/android/server/am/ActiveInstrumentation;
Lcom/android/server/am/ActiveServices$1;
+Lcom/android/server/am/ActiveServices$2;
+Lcom/android/server/am/ActiveServices$3;
+Lcom/android/server/am/ActiveServices$4;
+Lcom/android/server/am/ActiveServices$ActiveForegroundApp;
Lcom/android/server/am/ActiveServices$ForcedStandbyListener;
Lcom/android/server/am/ActiveServices$ServiceDumper;
Lcom/android/server/am/ActiveServices$ServiceLookupResult;
Lcom/android/server/am/ActiveServices$ServiceMap;
Lcom/android/server/am/ActiveServices$ServiceRestarter;
Lcom/android/server/am/ActiveServices;
+Lcom/android/server/am/ActivityDisplay$OnStackOrderChangedListener;
Lcom/android/server/am/ActivityDisplay;
Lcom/android/server/am/ActivityLaunchParamsModifier;
Lcom/android/server/am/ActivityManagerConstants;
-Lcom/android/server/am/ActivityManagerDebugConfig;
+Lcom/android/server/am/ActivityManagerService$10;
+Lcom/android/server/am/ActivityManagerService$11;
+Lcom/android/server/am/ActivityManagerService$12;
+Lcom/android/server/am/ActivityManagerService$13;
+Lcom/android/server/am/ActivityManagerService$14;
+Lcom/android/server/am/ActivityManagerService$15;
+Lcom/android/server/am/ActivityManagerService$16;
+Lcom/android/server/am/ActivityManagerService$17;
+Lcom/android/server/am/ActivityManagerService$18;
Lcom/android/server/am/ActivityManagerService$19;
Lcom/android/server/am/ActivityManagerService$1;
Lcom/android/server/am/ActivityManagerService$20;
+Lcom/android/server/am/ActivityManagerService$21;
Lcom/android/server/am/ActivityManagerService$22;
Lcom/android/server/am/ActivityManagerService$23;
+Lcom/android/server/am/ActivityManagerService$24;
Lcom/android/server/am/ActivityManagerService$25;
+Lcom/android/server/am/ActivityManagerService$26;
+Lcom/android/server/am/ActivityManagerService$27;
+Lcom/android/server/am/ActivityManagerService$28;
Lcom/android/server/am/ActivityManagerService$2;
Lcom/android/server/am/ActivityManagerService$3;
Lcom/android/server/am/ActivityManagerService$4;
Lcom/android/server/am/ActivityManagerService$5;
+Lcom/android/server/am/ActivityManagerService$6;
+Lcom/android/server/am/ActivityManagerService$7;
+Lcom/android/server/am/ActivityManagerService$8;
+Lcom/android/server/am/ActivityManagerService$9;
Lcom/android/server/am/ActivityManagerService$AppDeathRecipient;
-Lcom/android/server/am/ActivityManagerService$CpuBinder$1;
+Lcom/android/server/am/ActivityManagerService$Association;
Lcom/android/server/am/ActivityManagerService$CpuBinder;
Lcom/android/server/am/ActivityManagerService$DbBinder;
Lcom/android/server/am/ActivityManagerService$DevelopmentSettingsObserver;
+Lcom/android/server/am/ActivityManagerService$DumpStackFileObserver;
Lcom/android/server/am/ActivityManagerService$FontScaleSettingObserver;
Lcom/android/server/am/ActivityManagerService$GrantUri;
Lcom/android/server/am/ActivityManagerService$GraphicsBinder;
Lcom/android/server/am/ActivityManagerService$HiddenApiSettings;
Lcom/android/server/am/ActivityManagerService$Identity;
+Lcom/android/server/am/ActivityManagerService$ImportanceToken;
Lcom/android/server/am/ActivityManagerService$Injector;
Lcom/android/server/am/ActivityManagerService$IntentFirewallInterface;
Lcom/android/server/am/ActivityManagerService$ItemMatcher;
@@ -2033,8 +3214,13 @@ Lcom/android/server/am/ActivityManagerService$Lifecycle;
Lcom/android/server/am/ActivityManagerService$LocalService;
Lcom/android/server/am/ActivityManagerService$MainHandler$1;
Lcom/android/server/am/ActivityManagerService$MainHandler;
-Lcom/android/server/am/ActivityManagerService$MemBinder$1;
Lcom/android/server/am/ActivityManagerService$MemBinder;
+Lcom/android/server/am/ActivityManagerService$MemItem;
+Lcom/android/server/am/ActivityManagerService$MemoryUsageDumpOptions;
+Lcom/android/server/am/ActivityManagerService$NeededUriGrants;
+Lcom/android/server/am/ActivityManagerService$OomAdjObserver;
+Lcom/android/server/am/ActivityManagerService$PendingAssistExtras;
+Lcom/android/server/am/ActivityManagerService$PendingTempWhitelist;
Lcom/android/server/am/ActivityManagerService$PermissionController;
Lcom/android/server/am/ActivityManagerService$ProcessChangeItem;
Lcom/android/server/am/ActivityManagerService$ProcessInfoService;
@@ -2042,34 +3228,43 @@ Lcom/android/server/am/ActivityManagerService$UiHandler;
Lcom/android/server/am/ActivityManagerService$UidObserverRegistration;
Lcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;
Lcom/android/server/am/ActivityManagerService;
+Lcom/android/server/am/ActivityManagerShellCommand;
+Lcom/android/server/am/ActivityMetricsLogger$1;
Lcom/android/server/am/ActivityMetricsLogger$H;
Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;
+Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;
Lcom/android/server/am/ActivityMetricsLogger;
-Lcom/android/server/am/ActivityRecord$Token;
Lcom/android/server/am/ActivityRecord;
-Lcom/android/server/am/ActivityStack$1;
-Lcom/android/server/am/ActivityStack$ActivityStackHandler;
Lcom/android/server/am/ActivityStack$ActivityState;
Lcom/android/server/am/ActivityStack;
Lcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;
Lcom/android/server/am/ActivityStackSupervisor$FindTaskResult;
+Lcom/android/server/am/ActivityStackSupervisor$PendingActivityLaunch;
Lcom/android/server/am/ActivityStackSupervisor$SleepTokenImpl;
+Lcom/android/server/am/ActivityStackSupervisor$WaitInfo;
Lcom/android/server/am/ActivityStackSupervisor;
Lcom/android/server/am/ActivityStartController$StartHandler;
Lcom/android/server/am/ActivityStartController;
Lcom/android/server/am/ActivityStartInterceptor;
Lcom/android/server/am/ActivityStarter$DefaultFactory;
Lcom/android/server/am/ActivityStarter$Factory;
-Lcom/android/server/am/ActivityStarter$Request;
Lcom/android/server/am/ActivityStarter;
Lcom/android/server/am/AppBindRecord;
Lcom/android/server/am/AppErrorDialog$Data;
+Lcom/android/server/am/AppErrorDialog;
Lcom/android/server/am/AppErrorResult;
Lcom/android/server/am/AppErrors$BadProcessInfo;
Lcom/android/server/am/AppErrors;
+Lcom/android/server/am/AppNotRespondingDialog$Data;
+Lcom/android/server/am/AppNotRespondingDialog;
+Lcom/android/server/am/AppTaskImpl;
+Lcom/android/server/am/AppTimeTracker;
+Lcom/android/server/am/AppWaitingForDebuggerDialog;
Lcom/android/server/am/AppWarnings$ConfigHandler;
Lcom/android/server/am/AppWarnings$UiHandler;
Lcom/android/server/am/AppWarnings;
+Lcom/android/server/am/BackupRecord;
+Lcom/android/server/am/BaseErrorDialog;
Lcom/android/server/am/BatteryExternalStatsWorker$1;
Lcom/android/server/am/BatteryExternalStatsWorker$2;
Lcom/android/server/am/BatteryExternalStatsWorker;
@@ -2078,302 +3273,131 @@ Lcom/android/server/am/BatteryStatsService$LocalService;
Lcom/android/server/am/BatteryStatsService$WakeupReasonThread;
Lcom/android/server/am/BatteryStatsService;
Lcom/android/server/am/BroadcastFilter;
+Lcom/android/server/am/BroadcastQueue$1;
+Lcom/android/server/am/BroadcastQueue$AppNotResponding;
Lcom/android/server/am/BroadcastQueue$BroadcastHandler;
Lcom/android/server/am/BroadcastQueue;
Lcom/android/server/am/BroadcastRecord;
-Lcom/android/server/am/BroadcastStats$1;
-Lcom/android/server/am/BroadcastStats$ActionEntry;
-Lcom/android/server/am/BroadcastStats$PackageEntry;
Lcom/android/server/am/BroadcastStats;
+Lcom/android/server/am/CarUserSwitchingDialog;
Lcom/android/server/am/ClientLifecycleManager;
+Lcom/android/server/am/CompatModeDialog;
Lcom/android/server/am/CompatModePackages$CompatHandler;
Lcom/android/server/am/CompatModePackages;
Lcom/android/server/am/ConnectionRecord;
Lcom/android/server/am/ContentProviderConnection;
-Lcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;
Lcom/android/server/am/ContentProviderRecord;
Lcom/android/server/am/CoreSettingsObserver;
+Lcom/android/server/am/DeprecatedTargetSdkVersionDialog;
Lcom/android/server/am/DumpHeapProvider;
Lcom/android/server/am/EventLogTags;
-Lcom/android/server/am/GlobalSettingsToPropertiesMapper$1;
+Lcom/android/server/am/FactoryErrorDialog;
Lcom/android/server/am/GlobalSettingsToPropertiesMapper;
+Lcom/android/server/am/HealthStatsBatteryStatsWriter;
+Lcom/android/server/am/InstrumentationReporter$MyThread;
+Lcom/android/server/am/InstrumentationReporter$Report;
Lcom/android/server/am/InstrumentationReporter;
Lcom/android/server/am/IntentBindRecord;
Lcom/android/server/am/KeyguardController;
Lcom/android/server/am/LaunchParamsController$LaunchParams;
Lcom/android/server/am/LaunchParamsController$LaunchParamsModifier;
Lcom/android/server/am/LaunchParamsController;
+Lcom/android/server/am/LaunchTimeTracker$Entry;
+Lcom/android/server/am/LaunchTimeTracker;
+Lcom/android/server/am/LockTaskController$1;
Lcom/android/server/am/LockTaskController;
+Lcom/android/server/am/MemoryStatUtil$MemoryStat;
Lcom/android/server/am/MemoryStatUtil;
Lcom/android/server/am/NativeCrashListener;
Lcom/android/server/am/PendingIntentRecord$Key;
Lcom/android/server/am/PendingIntentRecord;
Lcom/android/server/am/PendingRemoteAnimationRegistry$Entry;
Lcom/android/server/am/PendingRemoteAnimationRegistry;
+Lcom/android/server/am/PinnedActivityStack;
+Lcom/android/server/am/PreBootBroadcaster;
Lcom/android/server/am/ProcessList$ProcStateMemTracker;
Lcom/android/server/am/ProcessList;
Lcom/android/server/am/ProcessMemInfo;
Lcom/android/server/am/ProcessRecord;
Lcom/android/server/am/ProcessStatsService$1;
+Lcom/android/server/am/ProcessStatsService$2;
+Lcom/android/server/am/ProcessStatsService$3;
Lcom/android/server/am/ProcessStatsService;
Lcom/android/server/am/ProviderMap;
Lcom/android/server/am/ReceiverList;
Lcom/android/server/am/RecentTasks$Callbacks;
Lcom/android/server/am/RecentTasks;
+Lcom/android/server/am/RecentsAnimation;
Lcom/android/server/am/RunningTasks;
Lcom/android/server/am/SafeActivityOptions;
Lcom/android/server/am/ServiceRecord$StartItem;
Lcom/android/server/am/ServiceRecord;
+Lcom/android/server/am/StrictModeViolationDialog;
Lcom/android/server/am/TaskChangeNotificationController$MainHandler;
Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
Lcom/android/server/am/TaskChangeNotificationController;
Lcom/android/server/am/TaskLaunchParamsModifier;
+Lcom/android/server/am/TaskPersister$1;
+Lcom/android/server/am/TaskPersister$ImageWriteQueueItem;
Lcom/android/server/am/TaskPersister$LazyTaskWriterThread;
+Lcom/android/server/am/TaskPersister$TaskWriteQueueItem;
+Lcom/android/server/am/TaskPersister$WriteQueueItem;
Lcom/android/server/am/TaskPersister;
Lcom/android/server/am/TaskRecord$TaskActivitiesReport;
-Lcom/android/server/am/TaskRecord$TaskRecordFactory;
Lcom/android/server/am/TaskRecord;
Lcom/android/server/am/UidRecord$ChangeItem;
Lcom/android/server/am/UidRecord;
-Lcom/android/server/am/UriPermissionOwner$ExternalToken;
+Lcom/android/server/am/UnsupportedCompileSdkDialog;
+Lcom/android/server/am/UnsupportedDisplaySizeDialog;
+Lcom/android/server/am/UriPermission$PersistedTimeComparator;
+Lcom/android/server/am/UriPermission$Snapshot;
+Lcom/android/server/am/UriPermission;
Lcom/android/server/am/UriPermissionOwner;
+Lcom/android/server/am/UserController$1;
+Lcom/android/server/am/UserController$2;
+Lcom/android/server/am/UserController$3;
+Lcom/android/server/am/UserController$4;
+Lcom/android/server/am/UserController$5;
+Lcom/android/server/am/UserController$6;
+Lcom/android/server/am/UserController$7;
+Lcom/android/server/am/UserController$Injector$1;
Lcom/android/server/am/UserController$Injector;
Lcom/android/server/am/UserController$UserProgressListener;
Lcom/android/server/am/UserController;
Lcom/android/server/am/UserState;
+Lcom/android/server/am/UserSwitchingDialog;
Lcom/android/server/am/VrController$1;
Lcom/android/server/am/VrController;
-Lcom/android/server/appwidget/AppWidgetService;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$1;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$AppWidgetManagerLocal;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$CallbackHandler;
-Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;
-Lcom/android/server/appwidget/AppWidgetServiceImpl;
-Lcom/android/server/audio/AudioEventLogger$Event;
-Lcom/android/server/audio/AudioEventLogger;
-Lcom/android/server/audio/AudioService$1;
-Lcom/android/server/audio/AudioService$2;
-Lcom/android/server/audio/AudioService$3;
-Lcom/android/server/audio/AudioService$4;
-Lcom/android/server/audio/AudioService$5;
-Lcom/android/server/audio/AudioService$AudioHandler;
-Lcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;
-Lcom/android/server/audio/AudioService$AudioServiceInternal;
-Lcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;
-Lcom/android/server/audio/AudioService$AudioSystemThread;
Lcom/android/server/audio/AudioService$Lifecycle;
-Lcom/android/server/audio/AudioService$MyDisplayStatusCallback;
-Lcom/android/server/audio/AudioService$SettingsObserver;
-Lcom/android/server/audio/AudioService$SoundPoolCallback;
-Lcom/android/server/audio/AudioService$SoundPoolListenerThread;
-Lcom/android/server/audio/AudioService$VolumeController;
-Lcom/android/server/audio/AudioService$VolumeStreamState;
-Lcom/android/server/audio/AudioService;
-Lcom/android/server/audio/AudioServiceEvents$ForceUseEvent;
-Lcom/android/server/audio/MediaFocusControl;
-Lcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;
-Lcom/android/server/audio/PlaybackActivityMonitor$NewPlayerEvent;
-Lcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;
-Lcom/android/server/audio/PlaybackActivityMonitor$PlayerOpPlayAudioEvent;
-Lcom/android/server/audio/PlaybackActivityMonitor;
-Lcom/android/server/audio/PlayerFocusEnforcer;
-Lcom/android/server/audio/RecordingActivityMonitor$RecMonitorClient;
-Lcom/android/server/audio/RecordingActivityMonitor;
-Lcom/android/server/audio/RotationHelper$AudioDisplayListener;
-Lcom/android/server/audio/RotationHelper;
-Lcom/android/server/autofill/-$$Lambda$AutofillManagerService$Yt8ZUfnHlFcXzCNLhvGde5dPRDA;
-Lcom/android/server/autofill/AutofillManagerService$1;
-Lcom/android/server/autofill/AutofillManagerService$2;
-Lcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;
-Lcom/android/server/autofill/AutofillManagerService$AutofillCompatState;
-Lcom/android/server/autofill/AutofillManagerService$LocalService;
-Lcom/android/server/autofill/AutofillManagerService$SettingsObserver;
-Lcom/android/server/autofill/AutofillManagerService;
-Lcom/android/server/autofill/Helper;
-Lcom/android/server/autofill/ui/AutoFillUI;
-Lcom/android/server/autofill/ui/OverlayControl;
-Lcom/android/server/backup/BackupManagerService$Lifecycle;
-Lcom/android/server/backup/BackupManagerService;
-Lcom/android/server/backup/BackupManagerServiceInterface;
-Lcom/android/server/backup/Trampoline;
-Lcom/android/server/backup/transport/TransportNotRegisteredException;
Lcom/android/server/broadcastradio/BroadcastRadioService;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$-XcW_oxw3YwSco8d8bZQoqwUTnM;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$-h4udaDmWtN-rprVGi_U0x7oSJc;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$C_-9BcvTpHXxQ-jC-hu9LBHT0XU;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$QNBMPvImBEGMe4jaw6iOF4QPjns;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$QwopTG5nMx1CO2s6KecqSuCqviA;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$YlDkqdeYbHPdKcgZh23aJ5Yw8mg;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$mdqODkiuJlYCJRXqdXBC-d6vdp4;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$ndOBpfBmClsz77tzZfe3mvcA1lI;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$nm8WiKzJMmmFFCbXZdjr71O3V8Q;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$qR-bdRNnpcaEQYaUWeumt5lHhtY;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$yDfY5pWuRHaQpNiYhPjLkNUUrc0;
+Lcom/android/server/broadcastradio/hal1/-$$Lambda$TunerCallback$yVJR7oPW6kDozlkthdDAOaT7L-4;
Lcom/android/server/broadcastradio/hal1/BroadcastRadioService;
Lcom/android/server/broadcastradio/hal1/Convert;
Lcom/android/server/broadcastradio/hal1/Tuner;
+Lcom/android/server/broadcastradio/hal1/TunerCallback$RunnableThrowingRemoteException;
Lcom/android/server/broadcastradio/hal1/TunerCallback;
-Lcom/android/server/camera/CameraServiceProxy$1;
-Lcom/android/server/camera/CameraServiceProxy$2;
Lcom/android/server/camera/CameraServiceProxy;
-Lcom/android/server/camera/CameraStatsJobService;
-Lcom/android/server/clipboard/ClipboardService$ClipboardImpl;
Lcom/android/server/clipboard/ClipboardService;
-Lcom/android/server/companion/-$$Lambda$CompanionDeviceManagerService$CompanionDeviceManagerImpl$bdv3Vfadbb8b9nrSgkARO4oYOXU;
-Lcom/android/server/companion/-$$Lambda$CompanionDeviceManagerService$bh5xRJq9-CRJoXvmerYRNjK1xEQ;
-Lcom/android/server/companion/CompanionDeviceManagerService$1;
-Lcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;
-Lcom/android/server/companion/CompanionDeviceManagerService;
-Lcom/android/server/connectivity/-$$Lambda$IpConnectivityMetrics$B0oR30xfeM300kIzUVaV_zUNLCg;
-Lcom/android/server/connectivity/-$$Lambda$MultipathPolicyTracker$2$dvyDLfu9d6g2XoEdL3QMHx7ut6k;
-Lcom/android/server/connectivity/-$$Lambda$Tethering$5JkghhOVq1MW7iK03DMZUSuLdFM;
-Lcom/android/server/connectivity/-$$Lambda$Tethering$G9TtPVJE34-mHCiIrkFoFBxZRf8;
-Lcom/android/server/connectivity/DataConnectionStats$1;
-Lcom/android/server/connectivity/DataConnectionStats;
-Lcom/android/server/connectivity/DefaultNetworkMetrics;
-Lcom/android/server/connectivity/DnsManager$PrivateDnsConfig;
-Lcom/android/server/connectivity/DnsManager;
-Lcom/android/server/connectivity/IpConnectivityMetrics$Impl;
-Lcom/android/server/connectivity/IpConnectivityMetrics$Logger;
-Lcom/android/server/connectivity/IpConnectivityMetrics$LoggerImpl;
Lcom/android/server/connectivity/IpConnectivityMetrics;
-Lcom/android/server/connectivity/KeepaliveTracker;
-Lcom/android/server/connectivity/LingerMonitor;
-Lcom/android/server/connectivity/MockableSystemProperties;
-Lcom/android/server/connectivity/MultipathPolicyTracker$1;
-Lcom/android/server/connectivity/MultipathPolicyTracker$2;
-Lcom/android/server/connectivity/MultipathPolicyTracker$ConfigChangeReceiver;
-Lcom/android/server/connectivity/MultipathPolicyTracker$Dependencies;
-Lcom/android/server/connectivity/MultipathPolicyTracker$SettingsObserver;
-Lcom/android/server/connectivity/MultipathPolicyTracker;
-Lcom/android/server/connectivity/Nat464Xlat;
-Lcom/android/server/connectivity/NetdEventListenerService$NetworkMetricsSnapshot;
-Lcom/android/server/connectivity/NetdEventListenerService;
-Lcom/android/server/connectivity/NetworkAgentInfo;
-Lcom/android/server/connectivity/NetworkMonitor;
-Lcom/android/server/connectivity/NetworkNotificationManager;
-Lcom/android/server/connectivity/PacManager$1;
-Lcom/android/server/connectivity/PacManager$PacRefreshIntentReceiver;
-Lcom/android/server/connectivity/PacManager;
-Lcom/android/server/connectivity/PermissionMonitor$1;
-Lcom/android/server/connectivity/PermissionMonitor;
-Lcom/android/server/connectivity/Tethering$StateReceiver;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$ErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$InitialState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$OffloadWrapper;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$SetDnsForwardersErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$SetIpForwardingDisabledErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$SetIpForwardingEnabledErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$StartTetheringErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$StopTetheringErrorState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM$TetherModeAliveState;
-Lcom/android/server/connectivity/Tethering$TetherMasterSM;
-Lcom/android/server/connectivity/Tethering$TetheringUserRestrictionListener;
-Lcom/android/server/connectivity/Tethering;
-Lcom/android/server/connectivity/Vpn$1;
-Lcom/android/server/connectivity/Vpn$3;
-Lcom/android/server/connectivity/Vpn$SystemServices;
Lcom/android/server/connectivity/Vpn;
-Lcom/android/server/connectivity/tethering/-$$Lambda$OffloadController$OffloadTetheringStatsProvider$3TF0NI3fE8A-xW0925oMv3YzAOk;
-Lcom/android/server/connectivity/tethering/IControlsTethering;
-Lcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;
-Lcom/android/server/connectivity/tethering/OffloadController$OffloadTetheringStatsProvider;
-Lcom/android/server/connectivity/tethering/OffloadController;
-Lcom/android/server/connectivity/tethering/OffloadHardwareInterface$ForwardedStats;
Lcom/android/server/connectivity/tethering/OffloadHardwareInterface;
-Lcom/android/server/connectivity/tethering/SimChangeListener$1;
-Lcom/android/server/connectivity/tethering/SimChangeListener;
-Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;
-Lcom/android/server/connectivity/tethering/TetheringConfiguration;
-Lcom/android/server/connectivity/tethering/TetheringDependencies;
-Lcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;
-Lcom/android/server/content/-$$Lambda$SyncManager$68MEyNkTh36YmYoFlURJoRa_-cY;
-Lcom/android/server/content/-$$Lambda$SyncManager$CjX_2uO4O4xJPQnKzeqvGwd87Dc;
-Lcom/android/server/content/-$$Lambda$SyncManager$HhiSFjEoPA_Hnv3xYZGfwkalc68;
-Lcom/android/server/content/-$$Lambda$SyncManager$bVs0A6OYdmGkOiq_lbp5MiBwelw;
-Lcom/android/server/content/-$$Lambda$SyncManagerConstants$qo5ldQVp10jCUY9aavBZDKP2k6Q;
-Lcom/android/server/content/ContentService$1;
-Lcom/android/server/content/ContentService$3;
-Lcom/android/server/content/ContentService$Lifecycle;
-Lcom/android/server/content/ContentService$ObserverCall;
-Lcom/android/server/content/ContentService$ObserverNode$ObserverEntry;
-Lcom/android/server/content/ContentService$ObserverNode;
-Lcom/android/server/content/ContentService;
-Lcom/android/server/content/SyncJobService;
-Lcom/android/server/content/SyncLogger$RotatingFileLogger;
-Lcom/android/server/content/SyncLogger;
-Lcom/android/server/content/SyncManager$10;
-Lcom/android/server/content/SyncManager$11;
-Lcom/android/server/content/SyncManager$12;
-Lcom/android/server/content/SyncManager$14;
-Lcom/android/server/content/SyncManager$1;
-Lcom/android/server/content/SyncManager$2;
-Lcom/android/server/content/SyncManager$3;
-Lcom/android/server/content/SyncManager$4;
-Lcom/android/server/content/SyncManager$5;
-Lcom/android/server/content/SyncManager$6;
-Lcom/android/server/content/SyncManager$7;
-Lcom/android/server/content/SyncManager$9;
-Lcom/android/server/content/SyncManager$SyncHandler;
-Lcom/android/server/content/SyncManager$SyncTimeTracker;
-Lcom/android/server/content/SyncManager;
-Lcom/android/server/content/SyncManagerConstants;
-Lcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;
-Lcom/android/server/content/SyncStorageEngine$AccountInfo;
-Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
-Lcom/android/server/content/SyncStorageEngine$DayStats;
-Lcom/android/server/content/SyncStorageEngine$EndPoint;
-Lcom/android/server/content/SyncStorageEngine$MyHandler;
-Lcom/android/server/content/SyncStorageEngine$OnAuthorityRemovedListener;
-Lcom/android/server/content/SyncStorageEngine$OnSyncRequestListener;
-Lcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;
-Lcom/android/server/content/SyncStorageEngine;
Lcom/android/server/coverage/CoverageService;
-Lcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$_Nw-YGl5ncBg-LJs8W81WNW6xoU;
-Lcom/android/server/devicepolicy/BaseIDevicePolicyManager;
-Lcom/android/server/devicepolicy/CertificateMonitor$1;
-Lcom/android/server/devicepolicy/CertificateMonitor;
Lcom/android/server/devicepolicy/CryptoTestHelper;
-Lcom/android/server/devicepolicy/DeviceAdminServiceController;
-Lcom/android/server/devicepolicy/DevicePolicyCacheImpl;
-Lcom/android/server/devicepolicy/DevicePolicyConstants;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$1;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$2;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$3;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$4;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$8;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;
Lcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$RestrictionsListener;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService$SetupContentObserver;
-Lcom/android/server/devicepolicy/DevicePolicyManagerService;
-Lcom/android/server/devicepolicy/OverlayPackagesProvider;
-Lcom/android/server/devicepolicy/Owners$DeviceOwnerReadWriter;
-Lcom/android/server/devicepolicy/Owners$FileReadWriter;
-Lcom/android/server/devicepolicy/Owners$Injector;
-Lcom/android/server/devicepolicy/Owners$OwnerInfo;
-Lcom/android/server/devicepolicy/Owners$ProfileOwnerReadWriter;
-Lcom/android/server/devicepolicy/Owners;
-Lcom/android/server/devicepolicy/SecurityLogMonitor;
-Lcom/android/server/devicepolicy/TransferOwnershipMetadataManager$Injector;
-Lcom/android/server/devicepolicy/TransferOwnershipMetadataManager;
-Lcom/android/server/display/-$$Lambda$AmbientBrightnessStatsTracker$vQZYn_dAhbvzT-Un4vvpuyIATII;
Lcom/android/server/display/-$$Lambda$VirtualDisplayAdapter$PFyqe-aYIEBicSVtuy5lL_bT8B0;
-Lcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;
-Lcom/android/server/display/AmbientBrightnessStatsTracker$Clock;
-Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;
-Lcom/android/server/display/AmbientBrightnessStatsTracker$Timer;
-Lcom/android/server/display/AmbientBrightnessStatsTracker;
-Lcom/android/server/display/AutomaticBrightnessController$1;
-Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;
-Lcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;
Lcom/android/server/display/AutomaticBrightnessController$Callbacks;
-Lcom/android/server/display/AutomaticBrightnessController;
-Lcom/android/server/display/BrightnessIdleJob;
-Lcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;
-Lcom/android/server/display/BrightnessMappingStrategy;
-Lcom/android/server/display/BrightnessTracker$Injector;
-Lcom/android/server/display/BrightnessTracker$Receiver;
-Lcom/android/server/display/BrightnessTracker$SensorListener;
-Lcom/android/server/display/BrightnessTracker$SettingsObserver;
-Lcom/android/server/display/BrightnessTracker$TrackerHandler;
-Lcom/android/server/display/BrightnessTracker;
-Lcom/android/server/display/ColorDisplayService$ColorMatrixEvaluator;
Lcom/android/server/display/ColorDisplayService;
-Lcom/android/server/display/ColorFade;
Lcom/android/server/display/DisplayAdapter$1;
Lcom/android/server/display/DisplayAdapter$2;
Lcom/android/server/display/DisplayAdapter$Listener;
@@ -2381,6 +3405,7 @@ Lcom/android/server/display/DisplayAdapter;
Lcom/android/server/display/DisplayBlanker;
Lcom/android/server/display/DisplayDevice;
Lcom/android/server/display/DisplayDeviceInfo;
+Lcom/android/server/display/DisplayManagerService$1;
Lcom/android/server/display/DisplayManagerService$BinderService;
Lcom/android/server/display/DisplayManagerService$CallbackRecord;
Lcom/android/server/display/DisplayManagerService$DisplayAdapterListener;
@@ -2390,92 +3415,31 @@ Lcom/android/server/display/DisplayManagerService$LocalService$1;
Lcom/android/server/display/DisplayManagerService$LocalService;
Lcom/android/server/display/DisplayManagerService$SyncRoot;
Lcom/android/server/display/DisplayManagerService;
-Lcom/android/server/display/DisplayPowerController$1;
-Lcom/android/server/display/DisplayPowerController$2;
-Lcom/android/server/display/DisplayPowerController$3;
-Lcom/android/server/display/DisplayPowerController$4;
-Lcom/android/server/display/DisplayPowerController$5;
-Lcom/android/server/display/DisplayPowerController$6;
-Lcom/android/server/display/DisplayPowerController$8;
-Lcom/android/server/display/DisplayPowerController$DisplayControllerHandler;
-Lcom/android/server/display/DisplayPowerController$SettingsObserver;
+Lcom/android/server/display/DisplayManagerShellCommand;
Lcom/android/server/display/DisplayPowerController;
-Lcom/android/server/display/DisplayPowerState$1;
-Lcom/android/server/display/DisplayPowerState$2;
-Lcom/android/server/display/DisplayPowerState$3;
-Lcom/android/server/display/DisplayPowerState$4;
-Lcom/android/server/display/DisplayPowerState$PhotonicModulator;
-Lcom/android/server/display/DisplayPowerState;
Lcom/android/server/display/DisplayTransformManager;
-Lcom/android/server/display/HysteresisLevels;
Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
Lcom/android/server/display/LocalDisplayAdapter$HotplugDisplayEventReceiver;
Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;
Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;
Lcom/android/server/display/LocalDisplayAdapter;
Lcom/android/server/display/LogicalDisplay;
-Lcom/android/server/display/OverlayDisplayAdapter$1$1;
-Lcom/android/server/display/OverlayDisplayAdapter$1;
Lcom/android/server/display/OverlayDisplayAdapter;
+Lcom/android/server/display/PersistentDataStore$1;
Lcom/android/server/display/PersistentDataStore$BrightnessConfigurations;
Lcom/android/server/display/PersistentDataStore$DisplayState;
Lcom/android/server/display/PersistentDataStore$Injector;
Lcom/android/server/display/PersistentDataStore$StableDeviceValues;
Lcom/android/server/display/PersistentDataStore;
-Lcom/android/server/display/RampAnimator$1;
-Lcom/android/server/display/RampAnimator$Listener;
-Lcom/android/server/display/RampAnimator;
+Lcom/android/server/display/VirtualDisplayAdapter$Callback;
+Lcom/android/server/display/VirtualDisplayAdapter$MediaProjectionCallback;
Lcom/android/server/display/VirtualDisplayAdapter$SurfaceControlDisplayFactory;
+Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;
Lcom/android/server/display/VirtualDisplayAdapter;
-Lcom/android/server/display/utils/Plog$SystemPlog;
-Lcom/android/server/display/utils/Plog;
-Lcom/android/server/dreams/DreamController$1;
-Lcom/android/server/dreams/DreamController$2;
-Lcom/android/server/dreams/DreamController$Listener;
-Lcom/android/server/dreams/DreamController;
-Lcom/android/server/dreams/DreamManagerService$1;
-Lcom/android/server/dreams/DreamManagerService$4;
-Lcom/android/server/dreams/DreamManagerService$5;
-Lcom/android/server/dreams/DreamManagerService$6;
-Lcom/android/server/dreams/DreamManagerService$BinderService;
-Lcom/android/server/dreams/DreamManagerService$DreamHandler;
-Lcom/android/server/dreams/DreamManagerService$LocalService;
+Lcom/android/server/display/WifiDisplayAdapter;
Lcom/android/server/dreams/DreamManagerService;
-Lcom/android/server/emergency/EmergencyAffordanceService$1;
-Lcom/android/server/emergency/EmergencyAffordanceService$2;
-Lcom/android/server/emergency/EmergencyAffordanceService$3;
-Lcom/android/server/emergency/EmergencyAffordanceService$MyHandler;
Lcom/android/server/emergency/EmergencyAffordanceService;
-Lcom/android/server/fingerprint/-$$Lambda$l42rkDmfSgEoarEM7da3vinr3Iw;
-Lcom/android/server/fingerprint/AuthenticationClient$1;
-Lcom/android/server/fingerprint/AuthenticationClient;
-Lcom/android/server/fingerprint/ClientMonitor;
-Lcom/android/server/fingerprint/EnumerateClient;
-Lcom/android/server/fingerprint/FingerprintService$10;
-Lcom/android/server/fingerprint/FingerprintService$12$4;
-Lcom/android/server/fingerprint/FingerprintService$12$6;
-Lcom/android/server/fingerprint/FingerprintService$12;
-Lcom/android/server/fingerprint/FingerprintService$13;
-Lcom/android/server/fingerprint/FingerprintService$1;
-Lcom/android/server/fingerprint/FingerprintService$2;
-Lcom/android/server/fingerprint/FingerprintService$3;
-Lcom/android/server/fingerprint/FingerprintService$4;
-Lcom/android/server/fingerprint/FingerprintService$5;
-Lcom/android/server/fingerprint/FingerprintService$8;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor$2;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$3;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$4;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$9;
-Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;
-Lcom/android/server/fingerprint/FingerprintService$PerformanceStats;
Lcom/android/server/fingerprint/FingerprintService;
-Lcom/android/server/fingerprint/FingerprintUtils;
-Lcom/android/server/fingerprint/FingerprintsUserState$1;
-Lcom/android/server/fingerprint/FingerprintsUserState;
-Lcom/android/server/fingerprint/InternalEnumerateClient;
-Lcom/android/server/fingerprint/InternalRemovalClient;
-Lcom/android/server/fingerprint/RemovalClient;
Lcom/android/server/firewall/AndFilter$1;
Lcom/android/server/firewall/AndFilter;
Lcom/android/server/firewall/CategoryFilter$1;
@@ -2483,6 +3447,7 @@ Lcom/android/server/firewall/CategoryFilter;
Lcom/android/server/firewall/Filter;
Lcom/android/server/firewall/FilterFactory;
Lcom/android/server/firewall/FilterList;
+Lcom/android/server/firewall/IntentFirewall$1;
Lcom/android/server/firewall/IntentFirewall$AMSInterface;
Lcom/android/server/firewall/IntentFirewall$FirewallHandler;
Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;
@@ -2516,308 +3481,77 @@ Lcom/android/server/firewall/StringFilter$6;
Lcom/android/server/firewall/StringFilter$7;
Lcom/android/server/firewall/StringFilter$8;
Lcom/android/server/firewall/StringFilter$9;
+Lcom/android/server/firewall/StringFilter$ContainsFilter;
Lcom/android/server/firewall/StringFilter$EqualsFilter;
+Lcom/android/server/firewall/StringFilter$IsNullFilter;
+Lcom/android/server/firewall/StringFilter$PatternStringFilter;
+Lcom/android/server/firewall/StringFilter$RegexFilter;
+Lcom/android/server/firewall/StringFilter$StartsWithFilter;
Lcom/android/server/firewall/StringFilter$ValueProvider;
Lcom/android/server/firewall/StringFilter;
Lcom/android/server/hdmi/HdmiCecController;
+Lcom/android/server/hdmi/HdmiControlService;
Lcom/android/server/input/InputApplicationHandle;
+Lcom/android/server/input/InputForwarder;
Lcom/android/server/input/InputManagerService$10;
Lcom/android/server/input/InputManagerService$11;
+Lcom/android/server/input/InputManagerService$12;
Lcom/android/server/input/InputManagerService$1;
Lcom/android/server/input/InputManagerService$2;
Lcom/android/server/input/InputManagerService$3;
+Lcom/android/server/input/InputManagerService$4;
Lcom/android/server/input/InputManagerService$5;
+Lcom/android/server/input/InputManagerService$6;
+Lcom/android/server/input/InputManagerService$7;
+Lcom/android/server/input/InputManagerService$8;
Lcom/android/server/input/InputManagerService$9;
Lcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;
+Lcom/android/server/input/InputManagerService$InputFilterHost;
Lcom/android/server/input/InputManagerService$InputManagerHandler;
Lcom/android/server/input/InputManagerService$KeyboardLayoutDescriptor;
Lcom/android/server/input/InputManagerService$KeyboardLayoutVisitor;
Lcom/android/server/input/InputManagerService$LocalService;
+Lcom/android/server/input/InputManagerService$TabletModeChangedListenerRecord;
+Lcom/android/server/input/InputManagerService$VibratorToken;
Lcom/android/server/input/InputManagerService$WindowManagerCallbacks;
Lcom/android/server/input/InputManagerService$WiredAccessoryCallbacks;
Lcom/android/server/input/InputManagerService;
Lcom/android/server/input/InputWindowHandle;
-Lcom/android/server/input/PersistentDataStore$InputDeviceState;
Lcom/android/server/input/PersistentDataStore;
-Lcom/android/server/job/-$$Lambda$JobSchedulerService$AauD0it1BcgWldVm_V1m2Jo7_Zc;
-Lcom/android/server/job/-$$Lambda$JobSchedulerService$Lfddr1PhKRLtm92W7niRGMWO69M;
-Lcom/android/server/job/-$$Lambda$JobSchedulerService$StandbyTracker$18Nt1smLe-l9bimlwR39k5RbMdM;
-Lcom/android/server/job/-$$Lambda$JobSchedulerService$StandbyTracker$Ofnn0P__SXhzXRU-7eLyuPrl31w;
-Lcom/android/server/job/-$$Lambda$JobSchedulerService$V6_ZmVmzJutg4w0s0LktDOsRAss;
-Lcom/android/server/job/-$$Lambda$JobSchedulerService$nXpbkYDrU0yC5DuTafFiblXBdTY;
-Lcom/android/server/job/-$$Lambda$JobStore$JobSet$D9839QVHHu4X-hnxouyIMkP5NWA;
-Lcom/android/server/job/-$$Lambda$JobStore$JobSet$id1Y3Yh8Y9sEb-njlNCUNay6U9k;
Lcom/android/server/job/JobCompletedListener;
-Lcom/android/server/job/JobPackageTracker$DataSet;
-Lcom/android/server/job/JobPackageTracker;
-Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;
Lcom/android/server/job/JobSchedulerInternal;
-Lcom/android/server/job/JobSchedulerService$1;
-Lcom/android/server/job/JobSchedulerService$2;
-Lcom/android/server/job/JobSchedulerService$3;
-Lcom/android/server/job/JobSchedulerService$Constants;
-Lcom/android/server/job/JobSchedulerService$ConstantsObserver;
-Lcom/android/server/job/JobSchedulerService$DeferredJobCounter;
-Lcom/android/server/job/JobSchedulerService$HeartbeatAlarmListener;
-Lcom/android/server/job/JobSchedulerService$JobHandler;
-Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;
-Lcom/android/server/job/JobSchedulerService$LocalService;
-Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;
-Lcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;
-Lcom/android/server/job/JobSchedulerService$StandbyTracker;
Lcom/android/server/job/JobSchedulerService;
-Lcom/android/server/job/JobServiceContext$JobServiceHandler;
-Lcom/android/server/job/JobServiceContext;
-Lcom/android/server/job/JobStore$1;
-Lcom/android/server/job/JobStore$JobSet;
-Lcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;
-Lcom/android/server/job/JobStore;
Lcom/android/server/job/StateChangedListener;
-Lcom/android/server/job/controllers/-$$Lambda$IdleController$IdlenessTracker$nTdS-lGBXcES5VWKcJFmQFgU7IU;
-Lcom/android/server/job/controllers/BackgroundJobsController$1;
-Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;
-Lcom/android/server/job/controllers/BackgroundJobsController;
-Lcom/android/server/job/controllers/BatteryController$ChargingTracker;
-Lcom/android/server/job/controllers/BatteryController;
-Lcom/android/server/job/controllers/ConnectivityController$1;
-Lcom/android/server/job/controllers/ConnectivityController$2;
-Lcom/android/server/job/controllers/ConnectivityController;
-Lcom/android/server/job/controllers/ContentObserverController;
-Lcom/android/server/job/controllers/DeviceIdleJobsController$1;
-Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleJobsDelayHandler;
-Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;
-Lcom/android/server/job/controllers/DeviceIdleJobsController;
-Lcom/android/server/job/controllers/IdleController$IdlenessTracker;
-Lcom/android/server/job/controllers/IdleController;
-Lcom/android/server/job/controllers/JobStatus;
-Lcom/android/server/job/controllers/StateController;
-Lcom/android/server/job/controllers/StorageController$StorageTracker;
-Lcom/android/server/job/controllers/StorageController;
-Lcom/android/server/job/controllers/TimeController$1;
-Lcom/android/server/job/controllers/TimeController$2;
-Lcom/android/server/job/controllers/TimeController;
Lcom/android/server/lights/Light;
Lcom/android/server/lights/LightsManager;
Lcom/android/server/lights/LightsService$1;
Lcom/android/server/lights/LightsService$2;
Lcom/android/server/lights/LightsService$LightImpl;
Lcom/android/server/lights/LightsService;
-Lcom/android/server/location/-$$Lambda$5U-_NhZgxqnYDZhpyacq4qBxh8k;
-Lcom/android/server/location/-$$Lambda$ContextHubClientManager$f15OSYbsSONpkXn7GinnrBPeumw;
-Lcom/android/server/location/-$$Lambda$ContextHubTransactionManager$sHbjr4TaLEATkCX_yhD2L7ebuxE;
-Lcom/android/server/location/-$$Lambda$GnssGeofenceProvider$x-gy6KDILxd4rIEjriAkYQ46QwA;
-Lcom/android/server/location/-$$Lambda$GnssLocationProvider$2m3d6BkqWO0fZAJAijxHyPDHfxI;
-Lcom/android/server/location/-$$Lambda$GnssLocationProvider$6$0TBIDASC8cGFJxhCk2blveu19LI;
-Lcom/android/server/location/-$$Lambda$GnssLocationProvider$6$7ITcPSS3RLwdJLvqPT1qDZbuYgU;
-Lcom/android/server/location/-$$Lambda$GnssLocationProvider$6$M4Zfb6dp_EFsOdGGju4tOPs-lc4;
-Lcom/android/server/location/-$$Lambda$GnssLocationProvider$6$d34_RfOwt4eW2WTSkMsS8UoXSqY;
-Lcom/android/server/location/-$$Lambda$GnssLocationProvider$6$fIEuYdSEFZVtEQQ5H4O-bTmj-LE;
-Lcom/android/server/location/-$$Lambda$GnssLocationProvider$6$pJxRP_yDkUU0yl--Fw431I8fN70;
-Lcom/android/server/location/-$$Lambda$GnssLocationProvider$6$vt8zMIL_RIFwKcgd1rz4Y33NVyk;
-Lcom/android/server/location/-$$Lambda$nmIoImstXHuMaecjUXtG9FcFizs;
-Lcom/android/server/location/ActivityRecognitionProxy$1;
-Lcom/android/server/location/ActivityRecognitionProxy;
-Lcom/android/server/location/ComprehensiveCountryDetector$1;
-Lcom/android/server/location/ComprehensiveCountryDetector;
-Lcom/android/server/location/ContextHubClientBroker;
-Lcom/android/server/location/ContextHubClientManager;
-Lcom/android/server/location/ContextHubService$1;
-Lcom/android/server/location/ContextHubService$4;
-Lcom/android/server/location/ContextHubService$ContextHubServiceCallback;
-Lcom/android/server/location/ContextHubService;
-Lcom/android/server/location/ContextHubServiceTransaction;
-Lcom/android/server/location/ContextHubServiceUtil;
-Lcom/android/server/location/ContextHubTransactionManager$5;
-Lcom/android/server/location/ContextHubTransactionManager;
-Lcom/android/server/location/CountryDetectorBase;
-Lcom/android/server/location/ExponentialBackOff;
-Lcom/android/server/location/GeocoderProxy;
-Lcom/android/server/location/GeofenceManager$1;
-Lcom/android/server/location/GeofenceManager$GeofenceHandler;
-Lcom/android/server/location/GeofenceManager;
-Lcom/android/server/location/GeofenceProxy$1;
-Lcom/android/server/location/GeofenceProxy$2;
-Lcom/android/server/location/GeofenceProxy$3;
-Lcom/android/server/location/GeofenceProxy$4;
-Lcom/android/server/location/GeofenceProxy;
-Lcom/android/server/location/GnssBatchingProvider$GnssBatchingProviderNative;
Lcom/android/server/location/GnssBatchingProvider;
-Lcom/android/server/location/GnssGeofenceProvider$GnssGeofenceProviderNative;
Lcom/android/server/location/GnssGeofenceProvider;
-Lcom/android/server/location/GnssLocationProvider$13;
-Lcom/android/server/location/GnssLocationProvider$14;
-Lcom/android/server/location/GnssLocationProvider$15;
-Lcom/android/server/location/GnssLocationProvider$16;
-Lcom/android/server/location/GnssLocationProvider$1;
-Lcom/android/server/location/GnssLocationProvider$2;
-Lcom/android/server/location/GnssLocationProvider$3;
-Lcom/android/server/location/GnssLocationProvider$4;
-Lcom/android/server/location/GnssLocationProvider$5;
-Lcom/android/server/location/GnssLocationProvider$6;
-Lcom/android/server/location/GnssLocationProvider$7;
-Lcom/android/server/location/GnssLocationProvider$8;
-Lcom/android/server/location/GnssLocationProvider$9;
-Lcom/android/server/location/GnssLocationProvider$FusedLocationListener;
-Lcom/android/server/location/GnssLocationProvider$GnssMetricsProvider;
-Lcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;
-Lcom/android/server/location/GnssLocationProvider$LocationChangeListener;
-Lcom/android/server/location/GnssLocationProvider$LocationExtras;
-Lcom/android/server/location/GnssLocationProvider$NetworkLocationListener;
-Lcom/android/server/location/GnssLocationProvider$ProviderHandler;
-Lcom/android/server/location/GnssLocationProvider$SetCarrierProperty;
Lcom/android/server/location/GnssLocationProvider;
-Lcom/android/server/location/GnssMeasurementsProvider$GnssMeasurementProviderNative;
Lcom/android/server/location/GnssMeasurementsProvider;
-Lcom/android/server/location/GnssNavigationMessageProvider$GnssNavigationMessageProviderNative;
-Lcom/android/server/location/GnssNavigationMessageProvider$StatusChangedOperation;
Lcom/android/server/location/GnssNavigationMessageProvider;
-Lcom/android/server/location/GnssSatelliteBlacklistHelper$1;
Lcom/android/server/location/GnssSatelliteBlacklistHelper$GnssSatelliteBlacklistCallback;
-Lcom/android/server/location/GnssSatelliteBlacklistHelper;
-Lcom/android/server/location/GnssStatusListenerHelper;
-Lcom/android/server/location/LocationBlacklist;
-Lcom/android/server/location/LocationFudger$1;
-Lcom/android/server/location/LocationFudger;
Lcom/android/server/location/LocationProviderInterface;
-Lcom/android/server/location/LocationProviderProxy$1$1;
-Lcom/android/server/location/LocationProviderProxy$1;
-Lcom/android/server/location/LocationProviderProxy$2;
-Lcom/android/server/location/LocationProviderProxy;
-Lcom/android/server/location/LocationRequestStatistics$PackageProviderKey;
-Lcom/android/server/location/LocationRequestStatistics$PackageStatistics;
-Lcom/android/server/location/LocationRequestStatistics;
-Lcom/android/server/location/NanoAppStateManager;
Lcom/android/server/location/NtpTimeHelper$InjectNtpTimeCallback;
-Lcom/android/server/location/NtpTimeHelper;
-Lcom/android/server/location/PassiveProvider;
-Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
Lcom/android/server/location/RemoteListenerHelper;
-Lcom/android/server/locksettings/-$$Lambda$SyntheticPasswordManager$WjMV-qfQ1YUbeAiLzyAhyepqPFI;
-Lcom/android/server/locksettings/LockSettingsService$2;
-Lcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;
-Lcom/android/server/locksettings/LockSettingsService$GateKeeperDiedRecipient;
-Lcom/android/server/locksettings/LockSettingsService$Injector$1;
-Lcom/android/server/locksettings/LockSettingsService$Injector;
-Lcom/android/server/locksettings/LockSettingsService$Lifecycle;
-Lcom/android/server/locksettings/LockSettingsService$LocalService;
-Lcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;
-Lcom/android/server/locksettings/LockSettingsService;
-Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;
-Lcom/android/server/locksettings/LockSettingsStorage$Cache;
-Lcom/android/server/locksettings/LockSettingsStorage$Callback;
-Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
-Lcom/android/server/locksettings/LockSettingsStorage$DatabaseHelper;
-Lcom/android/server/locksettings/LockSettingsStorage;
-Lcom/android/server/locksettings/LockSettingsStrongAuth$1;
-Lcom/android/server/locksettings/LockSettingsStrongAuth;
-Lcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;
Lcom/android/server/locksettings/SyntheticPasswordManager;
-Lcom/android/server/locksettings/recoverablekeystore/InsecureUserException;
-Lcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;
-Lcom/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl;
-Lcom/android/server/locksettings/recoverablekeystore/PlatformKeyManager;
-Lcom/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator;
-Lcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStorageException;
-Lcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;
-Lcom/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorage;
-Lcom/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper;
-Lcom/android/server/locksettings/recoverablekeystore/certificate/CertParsingException;
-Lcom/android/server/locksettings/recoverablekeystore/certificate/CertValidationException;
-Lcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotParserException;
-Lcom/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage;
-Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;
-Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper;
-Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorage;
-Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;
-Lcom/android/server/media/-$$Lambda$MediaSessionService$za_9dlUSlnaiZw6eCdPVEZq0XLw;
-Lcom/android/server/media/AudioPlayerStateMonitor$MessageHandler;
-Lcom/android/server/media/AudioPlayerStateMonitor$OnAudioPlayerActiveStateChangedListener;
-Lcom/android/server/media/AudioPlayerStateMonitor;
-Lcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;
Lcom/android/server/media/MediaResourceMonitorService;
-Lcom/android/server/media/MediaRouterService$1$1;
-Lcom/android/server/media/MediaRouterService$1;
-Lcom/android/server/media/MediaRouterService$2;
-Lcom/android/server/media/MediaRouterService$3;
-Lcom/android/server/media/MediaRouterService$ClientRecord;
-Lcom/android/server/media/MediaRouterService$MediaRouterServiceBroadcastReceiver;
-Lcom/android/server/media/MediaRouterService$UserHandler;
-Lcom/android/server/media/MediaRouterService$UserRecord;
Lcom/android/server/media/MediaRouterService;
-Lcom/android/server/media/MediaSessionRecord$2;
-Lcom/android/server/media/MediaSessionRecord$ControllerStub;
-Lcom/android/server/media/MediaSessionRecord$MessageHandler;
-Lcom/android/server/media/MediaSessionRecord$SessionCb;
-Lcom/android/server/media/MediaSessionRecord$SessionStub;
-Lcom/android/server/media/MediaSessionRecord;
-Lcom/android/server/media/MediaSessionService$1;
-Lcom/android/server/media/MediaSessionService$FullUserRecord;
-Lcom/android/server/media/MediaSessionService$MessageHandler;
-Lcom/android/server/media/MediaSessionService$SessionManagerImpl$1;
-Lcom/android/server/media/MediaSessionService$SessionManagerImpl$5;
-Lcom/android/server/media/MediaSessionService$SessionManagerImpl$KeyEventWakeLockReceiver;
-Lcom/android/server/media/MediaSessionService$SessionManagerImpl;
-Lcom/android/server/media/MediaSessionService$SessionsListenerRecord;
-Lcom/android/server/media/MediaSessionService$SettingsObserver;
Lcom/android/server/media/MediaSessionService;
-Lcom/android/server/media/MediaSessionStack$OnMediaButtonSessionChangedListener;
-Lcom/android/server/media/MediaSessionStack;
-Lcom/android/server/media/MediaUpdateService$1;
-Lcom/android/server/media/MediaUpdateService$2;
-Lcom/android/server/media/MediaUpdateService$3;
Lcom/android/server/media/MediaUpdateService;
-Lcom/android/server/media/RemoteDisplayProviderProxy$Callback;
-Lcom/android/server/media/RemoteDisplayProviderWatcher$1;
-Lcom/android/server/media/RemoteDisplayProviderWatcher$2;
-Lcom/android/server/media/RemoteDisplayProviderWatcher$Callback;
-Lcom/android/server/media/RemoteDisplayProviderWatcher;
-Lcom/android/server/media/projection/MediaProjectionManagerService$1;
-Lcom/android/server/media/projection/MediaProjectionManagerService$BinderService;
-Lcom/android/server/media/projection/MediaProjectionManagerService$CallbackDelegate;
-Lcom/android/server/media/projection/MediaProjectionManagerService$MediaRouterCallback;
Lcom/android/server/media/projection/MediaProjectionManagerService;
-Lcom/android/server/midi/MidiService$1;
-Lcom/android/server/midi/MidiService$Lifecycle;
-Lcom/android/server/midi/MidiService;
-Lcom/android/server/net/-$$Lambda$NetworkPolicyManagerService$HDTUqowtgL-W_V0Kq6psXLWC9ws;
-Lcom/android/server/net/DelayedDiskWrite$Writer;
-Lcom/android/server/net/DelayedDiskWrite;
-Lcom/android/server/net/IpConfigStore;
-Lcom/android/server/net/LockdownVpnTracker;
Lcom/android/server/net/NetworkIdentitySet;
-Lcom/android/server/net/NetworkPolicyLogger$Data;
-Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;
-Lcom/android/server/net/NetworkPolicyLogger;
Lcom/android/server/net/NetworkPolicyManagerInternal;
-Lcom/android/server/net/NetworkPolicyManagerService$10;
-Lcom/android/server/net/NetworkPolicyManagerService$11;
-Lcom/android/server/net/NetworkPolicyManagerService$12;
-Lcom/android/server/net/NetworkPolicyManagerService$13;
-Lcom/android/server/net/NetworkPolicyManagerService$14;
-Lcom/android/server/net/NetworkPolicyManagerService$15;
-Lcom/android/server/net/NetworkPolicyManagerService$16;
-Lcom/android/server/net/NetworkPolicyManagerService$17;
-Lcom/android/server/net/NetworkPolicyManagerService$18;
-Lcom/android/server/net/NetworkPolicyManagerService$1;
-Lcom/android/server/net/NetworkPolicyManagerService$2;
-Lcom/android/server/net/NetworkPolicyManagerService$3;
-Lcom/android/server/net/NetworkPolicyManagerService$4;
-Lcom/android/server/net/NetworkPolicyManagerService$5;
-Lcom/android/server/net/NetworkPolicyManagerService$6;
-Lcom/android/server/net/NetworkPolicyManagerService$7;
-Lcom/android/server/net/NetworkPolicyManagerService$8;
-Lcom/android/server/net/NetworkPolicyManagerService$9;
-Lcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;
-Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;
Lcom/android/server/net/NetworkPolicyManagerService;
-Lcom/android/server/net/NetworkStatsCollection$Key;
+Lcom/android/server/net/NetworkStatsAccess;
Lcom/android/server/net/NetworkStatsCollection;
Lcom/android/server/net/NetworkStatsManagerInternal;
-Lcom/android/server/net/NetworkStatsObservers$1;
-Lcom/android/server/net/NetworkStatsObservers$StatsContext;
Lcom/android/server/net/NetworkStatsObservers;
-Lcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;
Lcom/android/server/net/NetworkStatsRecorder;
+Lcom/android/server/net/NetworkStatsService$1;
Lcom/android/server/net/NetworkStatsService$2;
Lcom/android/server/net/NetworkStatsService$3;
Lcom/android/server/net/NetworkStatsService$4;
@@ -2831,234 +3565,165 @@ Lcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;
Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings;
Lcom/android/server/net/NetworkStatsService;
-Lcom/android/server/net/watchlist/NetworkWatchlistService$1;
Lcom/android/server/net/watchlist/NetworkWatchlistService$Lifecycle;
-Lcom/android/server/net/watchlist/NetworkWatchlistService;
-Lcom/android/server/net/watchlist/ReportWatchlistJobService;
-Lcom/android/server/net/watchlist/WatchlistConfig;
-Lcom/android/server/net/watchlist/WatchlistLoggingHandler;
-Lcom/android/server/net/watchlist/WatchlistReportDbHelper;
-Lcom/android/server/net/watchlist/WatchlistSettings;
-Lcom/android/server/notification/-$$Lambda$NotificationManagerService$15$wXaTmmz_lG6grUqU8upk0686eXA;
-Lcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$E8qsF-PrFYYUtUGked50-pRub20;
-Lcom/android/server/notification/-$$Lambda$NotificationRecord$XgkrZGcjOHPHem34oE9qLGy3siA;
-Lcom/android/server/notification/-$$Lambda$ouaYRM5YVYoMkUW8dm6TnIjLfgg;
-Lcom/android/server/notification/AlertRateLimiter;
-Lcom/android/server/notification/BadgeExtractor;
-Lcom/android/server/notification/CalendarTracker$1;
-Lcom/android/server/notification/CalendarTracker$Callback;
-Lcom/android/server/notification/CalendarTracker$CheckEventResult;
-Lcom/android/server/notification/CalendarTracker;
-Lcom/android/server/notification/ConditionProviders$Callback;
-Lcom/android/server/notification/ConditionProviders$ConditionRecord;
-Lcom/android/server/notification/ConditionProviders;
-Lcom/android/server/notification/CountdownConditionProvider$Receiver;
-Lcom/android/server/notification/CountdownConditionProvider;
-Lcom/android/server/notification/EventConditionProvider$1;
-Lcom/android/server/notification/EventConditionProvider$2;
-Lcom/android/server/notification/EventConditionProvider$3;
-Lcom/android/server/notification/EventConditionProvider$4;
-Lcom/android/server/notification/EventConditionProvider;
-Lcom/android/server/notification/GlobalSortKeyComparator;
-Lcom/android/server/notification/GroupHelper$Callback;
-Lcom/android/server/notification/GroupHelper;
-Lcom/android/server/notification/ImportanceExtractor;
-Lcom/android/server/notification/ManagedServices$1;
-Lcom/android/server/notification/ManagedServices$Config;
-Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
-Lcom/android/server/notification/ManagedServices$UserProfiles;
-Lcom/android/server/notification/ManagedServices;
-Lcom/android/server/notification/NotificationAdjustmentExtractor;
-Lcom/android/server/notification/NotificationChannelExtractor;
-Lcom/android/server/notification/NotificationComparator$1;
-Lcom/android/server/notification/NotificationComparator;
-Lcom/android/server/notification/NotificationDelegate;
-Lcom/android/server/notification/NotificationIntrusivenessExtractor;
-Lcom/android/server/notification/NotificationManagerInternal;
-Lcom/android/server/notification/NotificationManagerService$10$1;
-Lcom/android/server/notification/NotificationManagerService$10;
-Lcom/android/server/notification/NotificationManagerService$11;
-Lcom/android/server/notification/NotificationManagerService$14;
-Lcom/android/server/notification/NotificationManagerService$15;
-Lcom/android/server/notification/NotificationManagerService$17;
-Lcom/android/server/notification/NotificationManagerService$1;
-Lcom/android/server/notification/NotificationManagerService$2;
-Lcom/android/server/notification/NotificationManagerService$3;
-Lcom/android/server/notification/NotificationManagerService$4;
-Lcom/android/server/notification/NotificationManagerService$5;
-Lcom/android/server/notification/NotificationManagerService$6;
-Lcom/android/server/notification/NotificationManagerService$7;
-Lcom/android/server/notification/NotificationManagerService$8;
-Lcom/android/server/notification/NotificationManagerService$9;
-Lcom/android/server/notification/NotificationManagerService$Archive;
-Lcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;
-Lcom/android/server/notification/NotificationManagerService$FlagChecker;
-Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
-Lcom/android/server/notification/NotificationManagerService$NotificationListeners;
-Lcom/android/server/notification/NotificationManagerService$PostNotificationRunnable$1;
-Lcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;
-Lcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;
-Lcom/android/server/notification/NotificationManagerService$SettingsObserver;
-Lcom/android/server/notification/NotificationManagerService$TrimCache;
-Lcom/android/server/notification/NotificationManagerService$WorkerHandler;
Lcom/android/server/notification/NotificationManagerService;
-Lcom/android/server/notification/NotificationRecord;
-Lcom/android/server/notification/NotificationSignalExtractor;
-Lcom/android/server/notification/NotificationUsageStats$1;
-Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
-Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;
-Lcom/android/server/notification/NotificationUsageStats$SQLiteLog$1;
-Lcom/android/server/notification/NotificationUsageStats$SQLiteLog$2;
-Lcom/android/server/notification/NotificationUsageStats$SQLiteLog;
-Lcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;
-Lcom/android/server/notification/NotificationUsageStats;
-Lcom/android/server/notification/PriorityExtractor;
-Lcom/android/server/notification/PropConfig;
-Lcom/android/server/notification/RankingConfig;
-Lcom/android/server/notification/RankingHandler;
-Lcom/android/server/notification/RankingHelper$Record;
-Lcom/android/server/notification/RankingHelper;
-Lcom/android/server/notification/RateEstimator;
-Lcom/android/server/notification/ScheduleConditionProvider$1;
-Lcom/android/server/notification/ScheduleConditionProvider;
-Lcom/android/server/notification/SnoozeHelper$1;
-Lcom/android/server/notification/SnoozeHelper$Callback;
-Lcom/android/server/notification/SnoozeHelper;
-Lcom/android/server/notification/SystemConditionProviderService;
-Lcom/android/server/notification/ValidateNotificationPeople$1;
-Lcom/android/server/notification/ValidateNotificationPeople;
-Lcom/android/server/notification/VisibilityExtractor;
-Lcom/android/server/notification/ZenLog;
-Lcom/android/server/notification/ZenModeConditions;
-Lcom/android/server/notification/ZenModeExtractor;
-Lcom/android/server/notification/ZenModeFiltering$RepeatCallers;
-Lcom/android/server/notification/ZenModeFiltering;
-Lcom/android/server/notification/ZenModeHelper$Callback;
-Lcom/android/server/notification/ZenModeHelper$H$ConfigMessageData;
-Lcom/android/server/notification/ZenModeHelper$H;
-Lcom/android/server/notification/ZenModeHelper$Metrics;
-Lcom/android/server/notification/ZenModeHelper$RingerModeDelegate;
-Lcom/android/server/notification/ZenModeHelper$SettingsObserver;
-Lcom/android/server/notification/ZenModeHelper;
-Lcom/android/server/oemlock/OemLock;
-Lcom/android/server/oemlock/OemLockService$1;
-Lcom/android/server/oemlock/OemLockService$2;
Lcom/android/server/oemlock/OemLockService;
-Lcom/android/server/oemlock/VendorLock;
-Lcom/android/server/om/-$$Lambda$OverlayManagerService$YGMOwF5u3kvuRAEYnGl_xpXcVC4;
-Lcom/android/server/om/-$$Lambda$OverlayManagerService$mX9VnR-_2XOwgKo9C81uZcpqETM;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$ATr0DZmWpSWdKD0COw4t2qS-DRk;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$IkswmT9ZZJXmNAztGRVrD3hODMw;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$WYtPK6Ebqjgxm8_8Cot-ijv_z_8;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$bX7CTrJVR3B_eQmD43OOHtRIxgw;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$bXuJGR0fITXNwGnQfQHv9KS-XgY;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$jZUujzDxrP0hpAqUxnqEf-b-nQc;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$mq-CHAn1jQBVquxuOUv0eQANHIY;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$sx0Nyvq91kCH_A-4Ctf09G_0u9M;
-Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$vXm2C4y9Q-F5yYZNimB-Lr6w-oI;
-Lcom/android/server/om/IdmapManager;
-Lcom/android/server/om/OverlayManagerService$1;
-Lcom/android/server/om/OverlayManagerService$OverlayChangeListener;
-Lcom/android/server/om/OverlayManagerService$PackageManagerHelper;
-Lcom/android/server/om/OverlayManagerService$PackageReceiver;
-Lcom/android/server/om/OverlayManagerService$UserReceiver;
Lcom/android/server/om/OverlayManagerService;
-Lcom/android/server/om/OverlayManagerServiceImpl$OverlayChangeListener;
-Lcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;
-Lcom/android/server/om/OverlayManagerServiceImpl;
-Lcom/android/server/om/OverlayManagerSettings$BadKeyException;
-Lcom/android/server/om/OverlayManagerSettings$Serializer;
-Lcom/android/server/om/OverlayManagerSettings$SettingsItem;
-Lcom/android/server/om/OverlayManagerSettings;
-Lcom/android/server/os/-$$Lambda$SchedulingPolicyService$ao2OiSvvlyzmJ0li0c0nhHy-IDk;
Lcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;
Lcom/android/server/os/DeviceIdentifiersPolicyService;
-Lcom/android/server/os/SchedulingPolicyService$1;
Lcom/android/server/os/SchedulingPolicyService;
-Lcom/android/server/pm/-$$Lambda$PackageManagerService$VdFIChnSvWsw9h6zr1iz3vBkDH8;
-Lcom/android/server/pm/-$$Lambda$PackageManagerService$pGTsKkwNjkJ18DCR_lMoTlx3JzA;
+Lcom/android/server/pm/-$$Lambda$Installer$SebeftIfAJ7KsTmM0tju6PfW4Pc;
+Lcom/android/server/pm/-$$Lambda$InstantAppRegistry$BuKCbLr_MGBazMPl54-pWTuGHYY;
+Lcom/android/server/pm/-$$Lambda$InstantAppRegistry$UOn4sUy4zBQuofxUbY8RBYhkNSE;
+Lcom/android/server/pm/-$$Lambda$InstantAppRegistry$eaYsiecM_Rq6dliDvliwVtj695o;
+Lcom/android/server/pm/-$$Lambda$InstantAppRegistry$o-Qxi7Gaam-yhhMK-IMWv499oME;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$1IFDaSQRqG4pqlUtBm87Yzturic;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$8-IQ5_GLnR11f6LVoppcC-6hZ78;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$Iz1l7RVtATr5Ybl_zHeYuCbGMvA;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$S4BXTl5Ly3EHhXAReFCtlz2B8eo;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$bnLYyNywBZdr_a6WGQKRTv8z0S4;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$gqdNHYJiYM0w_nIH0nGMWWU8yzQ;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$mOTJOturHO9FjzNA-qffT913E0M;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$opO5L-t6aW9gAx6B5CGlW6sAaX8;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$pG5M8N0ge8cs9_1xCnV9yYuSdCw;
Lcom/android/server/pm/-$$Lambda$PackageManagerService$sJ5w9GfSftnZPyv5hBDxQkxDJMU;
+Lcom/android/server/pm/-$$Lambda$PackageManagerService$yfOQ0T-7_IM-V0KeaeTUW5KgZRQ;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$Fz3elZ0VmMMv9-wl_G3AN15dUU8;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$QMV-UHbRIK26QMZL5iM27MchX7U;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$ePZ6rsJ05hJ2glmOqcq1_jX6J8w;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$fMBP3pPR7BB2hICieRxkdNG-3H8;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$hVRkjdaFuAMTY9J9JQ7JyWMYCHA;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$nPt0Hym3GvYeWA2vwfOLFDxZmCE;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$p5q19y4-2x-i747j_hTNL1EMzt0;
+Lcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$whx96xO50U3fax1NRe1upTcx9jc;
Lcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;
-Lcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$AUDgG57FGyGDUVDAjL-7cuiE0pM;
-Lcom/android/server/pm/-$$Lambda$ShortcutService$3$WghiV-HLnzJqZabObC5uHCmb960;
-Lcom/android/server/pm/-$$Lambda$ShortcutService$3$n_VdEzyBcjs0pGZO8GnB0FoTgR0;
-Lcom/android/server/pm/-$$Lambda$jZzCUQd1whVIqs_s1XMLbFqTP_E;
+Lcom/android/server/pm/-$$Lambda$UserManagerService$1$DQ_02g7kZ7QrJXO6aCATwE6DYCE;
+Lcom/android/server/pm/AbstractStatsBase$1;
Lcom/android/server/pm/AbstractStatsBase;
Lcom/android/server/pm/BackgroundDexOptService;
Lcom/android/server/pm/CompilerStats$PackageStats;
Lcom/android/server/pm/CompilerStats;
Lcom/android/server/pm/CrossProfileAppsService;
-Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;
-Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;
-Lcom/android/server/pm/CrossProfileAppsServiceImpl;
+Lcom/android/server/pm/CrossProfileIntentFilter;
Lcom/android/server/pm/CrossProfileIntentResolver;
+Lcom/android/server/pm/DumpState;
Lcom/android/server/pm/Installer$1;
Lcom/android/server/pm/Installer$InstallerException;
Lcom/android/server/pm/Installer;
Lcom/android/server/pm/InstantAppRegistry$CookiePersistence;
+Lcom/android/server/pm/InstantAppRegistry$UninstalledInstantAppState;
Lcom/android/server/pm/InstantAppRegistry;
-Lcom/android/server/pm/InstantAppResolverConnection$ConnectionException;
-Lcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller$1;
-Lcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller;
-Lcom/android/server/pm/InstantAppResolverConnection$MyServiceConnection;
+Lcom/android/server/pm/InstantAppResolver;
Lcom/android/server/pm/InstantAppResolverConnection;
Lcom/android/server/pm/InstructionSets;
+Lcom/android/server/pm/IntentFilterVerificationResponse;
+Lcom/android/server/pm/IntentFilterVerificationState;
Lcom/android/server/pm/KeySetHandle;
+Lcom/android/server/pm/KeySetManagerService$1;
Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle;
Lcom/android/server/pm/KeySetManagerService;
-Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;
-Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;
-Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;
Lcom/android/server/pm/LauncherAppsService;
Lcom/android/server/pm/OtaDexoptService;
+Lcom/android/server/pm/PackageDexOptimizer$ForcedUpdatePackageDexOptimizer;
Lcom/android/server/pm/PackageDexOptimizer;
Lcom/android/server/pm/PackageInstallerService$1;
+Lcom/android/server/pm/PackageInstallerService$2;
Lcom/android/server/pm/PackageInstallerService$Callbacks;
Lcom/android/server/pm/PackageInstallerService$InternalCallback;
+Lcom/android/server/pm/PackageInstallerService$PackageDeleteObserverAdapter;
Lcom/android/server/pm/PackageInstallerService;
+Lcom/android/server/pm/PackageInstallerSession;
Lcom/android/server/pm/PackageKeySetData;
Lcom/android/server/pm/PackageManagerException;
+Lcom/android/server/pm/PackageManagerService$1$1;
+Lcom/android/server/pm/PackageManagerService$10;
Lcom/android/server/pm/PackageManagerService$11;
+Lcom/android/server/pm/PackageManagerService$12;
+Lcom/android/server/pm/PackageManagerService$13;
+Lcom/android/server/pm/PackageManagerService$14;
+Lcom/android/server/pm/PackageManagerService$15;
+Lcom/android/server/pm/PackageManagerService$16;
+Lcom/android/server/pm/PackageManagerService$17;
+Lcom/android/server/pm/PackageManagerService$18;
+Lcom/android/server/pm/PackageManagerService$19;
Lcom/android/server/pm/PackageManagerService$1;
+Lcom/android/server/pm/PackageManagerService$20;
Lcom/android/server/pm/PackageManagerService$21;
Lcom/android/server/pm/PackageManagerService$22;
Lcom/android/server/pm/PackageManagerService$23;
+Lcom/android/server/pm/PackageManagerService$24;
+Lcom/android/server/pm/PackageManagerService$25;
+Lcom/android/server/pm/PackageManagerService$26;
+Lcom/android/server/pm/PackageManagerService$27;
+Lcom/android/server/pm/PackageManagerService$28;
+Lcom/android/server/pm/PackageManagerService$29;
Lcom/android/server/pm/PackageManagerService$2;
+Lcom/android/server/pm/PackageManagerService$30;
+Lcom/android/server/pm/PackageManagerService$31;
Lcom/android/server/pm/PackageManagerService$3;
+Lcom/android/server/pm/PackageManagerService$4;
Lcom/android/server/pm/PackageManagerService$5;
Lcom/android/server/pm/PackageManagerService$6;
+Lcom/android/server/pm/PackageManagerService$7;
+Lcom/android/server/pm/PackageManagerService$8;
Lcom/android/server/pm/PackageManagerService$9;
Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$ActionIterGenerator;
+Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$AuthoritiesIterGenerator;
Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$CategoriesIterGenerator;
Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$IterGenerator;
+Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$SchemesIterGenerator;
Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;
+Lcom/android/server/pm/PackageManagerService$BlobXmlRestorer;
+Lcom/android/server/pm/PackageManagerService$ClearStorageConnection;
+Lcom/android/server/pm/PackageManagerService$CrossProfileDomainInfo;
Lcom/android/server/pm/PackageManagerService$DefaultContainerConnection;
+Lcom/android/server/pm/PackageManagerService$FileInstallArgs$1;
+Lcom/android/server/pm/PackageManagerService$FileInstallArgs;
+Lcom/android/server/pm/PackageManagerService$HandlerParams;
+Lcom/android/server/pm/PackageManagerService$IFVerificationParams;
+Lcom/android/server/pm/PackageManagerService$InstallArgs;
+Lcom/android/server/pm/PackageManagerService$InstallParams;
Lcom/android/server/pm/PackageManagerService$IntentFilterVerifier;
Lcom/android/server/pm/PackageManagerService$IntentVerifierProxy;
Lcom/android/server/pm/PackageManagerService$MoveCallbacks;
+Lcom/android/server/pm/PackageManagerService$MoveInfo;
+Lcom/android/server/pm/PackageManagerService$MoveInstallArgs;
Lcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;
+Lcom/android/server/pm/PackageManagerService$OriginInfo;
+Lcom/android/server/pm/PackageManagerService$PackageFreezer;
Lcom/android/server/pm/PackageManagerService$PackageHandler;
+Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;
Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;
Lcom/android/server/pm/PackageManagerService$PackageManagerNative;
+Lcom/android/server/pm/PackageManagerService$PackageParserCallback$1;
Lcom/android/server/pm/PackageManagerService$PackageParserCallback;
+Lcom/android/server/pm/PackageManagerService$PackageRemovedInfo;
Lcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;
Lcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;
+Lcom/android/server/pm/PackageManagerService$PostInstallData;
Lcom/android/server/pm/PackageManagerService$ProviderIntentResolver;
Lcom/android/server/pm/PackageManagerService$ScanRequest;
Lcom/android/server/pm/PackageManagerService$ScanResult;
Lcom/android/server/pm/PackageManagerService$ServiceIntentResolver;
Lcom/android/server/pm/PackageManagerService$SharedLibraryEntry;
+Lcom/android/server/pm/PackageManagerService$VerificationInfo;
Lcom/android/server/pm/PackageManagerService;
Lcom/android/server/pm/PackageManagerServiceCompilerMapping;
+Lcom/android/server/pm/PackageManagerServiceUtils$1;
Lcom/android/server/pm/PackageManagerServiceUtils;
+Lcom/android/server/pm/PackageManagerShellCommand;
Lcom/android/server/pm/PackageSender;
Lcom/android/server/pm/PackageSetting;
Lcom/android/server/pm/PackageSettingBase;
Lcom/android/server/pm/PackageSignatures;
Lcom/android/server/pm/PackageUsage;
+Lcom/android/server/pm/PackageVerificationResponse;
+Lcom/android/server/pm/PackageVerificationState;
Lcom/android/server/pm/ParallelPackageParser$ParseResult;
Lcom/android/server/pm/ParallelPackageParser;
+Lcom/android/server/pm/PersistentPreferredActivity;
Lcom/android/server/pm/PersistentPreferredIntentResolver;
+Lcom/android/server/pm/Policy$1;
Lcom/android/server/pm/Policy$PolicyBuilder;
Lcom/android/server/pm/Policy;
Lcom/android/server/pm/PolicyComparator;
@@ -3070,6 +3735,7 @@ Lcom/android/server/pm/ProcessLoggingHandler;
Lcom/android/server/pm/ProtectedPackages;
Lcom/android/server/pm/SELinuxMMAC;
Lcom/android/server/pm/SettingBase;
+Lcom/android/server/pm/Settings$1;
Lcom/android/server/pm/Settings$KernelPackageState;
Lcom/android/server/pm/Settings$RestoredPermissionGrant;
Lcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;
@@ -3077,28 +3743,26 @@ Lcom/android/server/pm/Settings$RuntimePermissionPersistence;
Lcom/android/server/pm/Settings$VersionInfo;
Lcom/android/server/pm/Settings;
Lcom/android/server/pm/SharedUserSetting;
-Lcom/android/server/pm/ShortcutBitmapSaver;
-Lcom/android/server/pm/ShortcutDumpFiles;
-Lcom/android/server/pm/ShortcutRequestPinProcessor;
-Lcom/android/server/pm/ShortcutService$1;
-Lcom/android/server/pm/ShortcutService$2;
-Lcom/android/server/pm/ShortcutService$3;
-Lcom/android/server/pm/ShortcutService$4;
-Lcom/android/server/pm/ShortcutService$5;
-Lcom/android/server/pm/ShortcutService$InvalidFileFormatException;
Lcom/android/server/pm/ShortcutService$Lifecycle;
-Lcom/android/server/pm/ShortcutService$LocalService;
-Lcom/android/server/pm/ShortcutService;
Lcom/android/server/pm/UserDataPreparer;
Lcom/android/server/pm/UserManagerService$1;
Lcom/android/server/pm/UserManagerService$2;
Lcom/android/server/pm/UserManagerService$3;
+Lcom/android/server/pm/UserManagerService$4;
+Lcom/android/server/pm/UserManagerService$5;
+Lcom/android/server/pm/UserManagerService$6;
+Lcom/android/server/pm/UserManagerService$DisableQuietModeUserUnlockedCallback;
Lcom/android/server/pm/UserManagerService$LifeCycle;
+Lcom/android/server/pm/UserManagerService$LocalService$1;
Lcom/android/server/pm/UserManagerService$LocalService;
Lcom/android/server/pm/UserManagerService$MainHandler;
+Lcom/android/server/pm/UserManagerService$Shell;
Lcom/android/server/pm/UserManagerService$UserData;
Lcom/android/server/pm/UserManagerService;
Lcom/android/server/pm/UserRestrictionsUtils;
+Lcom/android/server/pm/dex/-$$Lambda$ArtManagerService$MEVzU-orlv4msZVF-bA5NLti04g;
+Lcom/android/server/pm/dex/-$$Lambda$ArtManagerService$_rD0Y6OPSJHMdjTIOtucoGQ1xag;
+Lcom/android/server/pm/dex/ArtManagerService$1;
Lcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl;
Lcom/android/server/pm/dex/ArtManagerService;
Lcom/android/server/pm/dex/DexLogger;
@@ -3107,7 +3771,9 @@ Lcom/android/server/pm/dex/DexManager$2;
Lcom/android/server/pm/dex/DexManager$DexSearchResult;
Lcom/android/server/pm/dex/DexManager$Listener;
Lcom/android/server/pm/dex/DexManager$PackageCodeLocations;
+Lcom/android/server/pm/dex/DexManager$RegisterDexModuleResult;
Lcom/android/server/pm/dex/DexManager;
+Lcom/android/server/pm/dex/DexoptOptions;
Lcom/android/server/pm/dex/DexoptUtils;
Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;
Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;
@@ -3119,88 +3785,24 @@ Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermission
Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;
Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;
Lcom/android/server/pm/permission/PermissionManagerInternal;
+Lcom/android/server/pm/permission/PermissionManagerService$1;
Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;
Lcom/android/server/pm/permission/PermissionManagerService;
Lcom/android/server/pm/permission/PermissionSettings;
Lcom/android/server/pm/permission/PermissionsState$PermissionData;
Lcom/android/server/pm/permission/PermissionsState$PermissionState;
Lcom/android/server/pm/permission/PermissionsState;
-Lcom/android/server/policy/-$$Lambda$PhoneWindowManager$SMVPfeuVGHeByGLchxVc-pxEEMw;
-Lcom/android/server/policy/-$$Lambda$PhoneWindowManager$qkEs_boDTAbqA6wKqcLwnsgoklc;
-Lcom/android/server/policy/BarController$BarHandler;
-Lcom/android/server/policy/BarController$OnBarVisibilityChangedListener;
-Lcom/android/server/policy/BarController;
-Lcom/android/server/policy/GlobalActionsProvider;
-Lcom/android/server/policy/GlobalKeyManager;
-Lcom/android/server/policy/IconUtilities;
-Lcom/android/server/policy/ImmersiveModeConfirmation$1;
-Lcom/android/server/policy/ImmersiveModeConfirmation$2;
-Lcom/android/server/policy/ImmersiveModeConfirmation$H;
-Lcom/android/server/policy/ImmersiveModeConfirmation;
-Lcom/android/server/policy/LogDecelerateInterpolator;
-Lcom/android/server/policy/PhoneWindowManager$10;
-Lcom/android/server/policy/PhoneWindowManager$13;
-Lcom/android/server/policy/PhoneWindowManager$14;
-Lcom/android/server/policy/PhoneWindowManager$15;
-Lcom/android/server/policy/PhoneWindowManager$16;
-Lcom/android/server/policy/PhoneWindowManager$17;
-Lcom/android/server/policy/PhoneWindowManager$18;
-Lcom/android/server/policy/PhoneWindowManager$1;
-Lcom/android/server/policy/PhoneWindowManager$20;
-Lcom/android/server/policy/PhoneWindowManager$2;
-Lcom/android/server/policy/PhoneWindowManager$3;
-Lcom/android/server/policy/PhoneWindowManager$4;
-Lcom/android/server/policy/PhoneWindowManager$5;
-Lcom/android/server/policy/PhoneWindowManager$6;
-Lcom/android/server/policy/PhoneWindowManager$7;
-Lcom/android/server/policy/PhoneWindowManager$8;
-Lcom/android/server/policy/PhoneWindowManager$9;
-Lcom/android/server/policy/PhoneWindowManager$MyOrientationListener;
-Lcom/android/server/policy/PhoneWindowManager$MyWakeGestureListener;
-Lcom/android/server/policy/PhoneWindowManager$PolicyHandler;
-Lcom/android/server/policy/PhoneWindowManager$ScreenLockTimeout;
-Lcom/android/server/policy/PhoneWindowManager$ScreenshotRunnable;
-Lcom/android/server/policy/PhoneWindowManager$SettingsObserver;
Lcom/android/server/policy/PhoneWindowManager;
-Lcom/android/server/policy/PolicyControl;
-Lcom/android/server/policy/ShortcutManager$ShortcutInfo;
-Lcom/android/server/policy/ShortcutManager;
-Lcom/android/server/policy/StatusBarController$1$1;
-Lcom/android/server/policy/StatusBarController$1$2;
-Lcom/android/server/policy/StatusBarController$1$4;
-Lcom/android/server/policy/StatusBarController$1;
-Lcom/android/server/policy/StatusBarController;
-Lcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;
-Lcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;
-Lcom/android/server/policy/SystemGesturesPointerEventListener;
-Lcom/android/server/policy/WakeGestureListener$1;
-Lcom/android/server/policy/WakeGestureListener$2;
-Lcom/android/server/policy/WakeGestureListener;
Lcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;
-Lcom/android/server/policy/WindowManagerPolicy$WindowState;
Lcom/android/server/policy/WindowManagerPolicy;
-Lcom/android/server/policy/WindowOrientationListener$OrientationJudge;
-Lcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge$1;
-Lcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;
-Lcom/android/server/policy/WindowOrientationListener;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$1;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardShowDelegate;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardState;
-Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;
-Lcom/android/server/policy/keyguard/KeyguardServiceWrapper;
-Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;
-Lcom/android/server/policy/keyguard/KeyguardStateMonitor;
+Lcom/android/server/power/-$$Lambda$BatterySaverPolicy$9q6hxnTofoZqK_ebwl_HDCH8A4A;
Lcom/android/server/power/-$$Lambda$BatterySaverPolicy$DPeh8xGdH0ye3BQJ8Ozaqeu6Y30;
Lcom/android/server/power/BatterySaverPolicy$BatterySaverPolicyListener;
Lcom/android/server/power/BatterySaverPolicy;
-Lcom/android/server/power/Notifier$6;
-Lcom/android/server/power/Notifier$7;
-Lcom/android/server/power/Notifier$8;
-Lcom/android/server/power/Notifier$NotifierHandler;
Lcom/android/server/power/Notifier;
Lcom/android/server/power/PowerManagerService$1;
Lcom/android/server/power/PowerManagerService$2;
+Lcom/android/server/power/PowerManagerService$3;
Lcom/android/server/power/PowerManagerService$4;
Lcom/android/server/power/PowerManagerService$BatteryReceiver;
Lcom/android/server/power/PowerManagerService$BinderService;
@@ -3210,17 +3812,18 @@ Lcom/android/server/power/PowerManagerService$DreamReceiver;
Lcom/android/server/power/PowerManagerService$ForegroundProfileObserver;
Lcom/android/server/power/PowerManagerService$LocalService;
Lcom/android/server/power/PowerManagerService$PowerManagerHandler;
+Lcom/android/server/power/PowerManagerService$ProfilePowerState;
Lcom/android/server/power/PowerManagerService$SettingsObserver;
Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;
Lcom/android/server/power/PowerManagerService$UidState;
Lcom/android/server/power/PowerManagerService$UserSwitchedReceiver;
Lcom/android/server/power/PowerManagerService$WakeLock;
Lcom/android/server/power/PowerManagerService;
+Lcom/android/server/power/PowerManagerShellCommand;
Lcom/android/server/power/SuspendBlocker;
-Lcom/android/server/power/WirelessChargerDetector$1;
-Lcom/android/server/power/WirelessChargerDetector$2;
Lcom/android/server/power/WirelessChargerDetector;
Lcom/android/server/power/batterysaver/-$$Lambda$BatterySaverStateMachine$SSfmWJrD4RBoVg8A8loZrS-jhAo;
+Lcom/android/server/power/batterysaver/-$$Lambda$BatterySaverStateMachine$fEidyt_9TXlXBpF6D2lhOOrfOC4;
Lcom/android/server/power/batterysaver/-$$Lambda$FileUpdater$NUmipjKCJwbgmFbIcGS3uaz3QFk;
Lcom/android/server/power/batterysaver/BatterySaverController$1;
Lcom/android/server/power/batterysaver/BatterySaverController$MyHandler;
@@ -3230,874 +3833,16013 @@ Lcom/android/server/power/batterysaver/BatterySaverLocationPlugin;
Lcom/android/server/power/batterysaver/BatterySaverStateMachine$1;
Lcom/android/server/power/batterysaver/BatterySaverStateMachine;
Lcom/android/server/power/batterysaver/BatterySavingStats$BatterySaverState;
+Lcom/android/server/power/batterysaver/BatterySavingStats$DozeState;
+Lcom/android/server/power/batterysaver/BatterySavingStats$InteractiveState;
Lcom/android/server/power/batterysaver/BatterySavingStats$MetricsLoggerHelper;
+Lcom/android/server/power/batterysaver/BatterySavingStats$Stat;
Lcom/android/server/power/batterysaver/BatterySavingStats;
Lcom/android/server/power/batterysaver/CpuFrequencies;
Lcom/android/server/power/batterysaver/FileUpdater;
-Lcom/android/server/print/PrintManagerService$PrintManagerImpl$1;
-Lcom/android/server/print/PrintManagerService$PrintManagerImpl$2;
-Lcom/android/server/print/PrintManagerService$PrintManagerImpl;
-Lcom/android/server/print/PrintManagerService;
-Lcom/android/server/restrictions/RestrictionsManagerService$RestrictionsManagerImpl;
Lcom/android/server/restrictions/RestrictionsManagerService;
-Lcom/android/server/search/SearchManagerService$GlobalSearchProviderObserver;
-Lcom/android/server/search/SearchManagerService$Lifecycle;
-Lcom/android/server/search/SearchManagerService$MyPackageMonitor;
-Lcom/android/server/search/SearchManagerService;
Lcom/android/server/security/KeyAttestationApplicationIdProviderService;
-Lcom/android/server/security/KeyChainSystemService$1;
Lcom/android/server/security/KeyChainSystemService;
-Lcom/android/server/slice/-$$Lambda$PinnedSliceState$KzxFkvfomRuMb5PD8_pIHDIhUUE;
-Lcom/android/server/slice/-$$Lambda$PinnedSliceState$TZdoqC_LDA8If7sQ7WXz9LM6VHg;
-Lcom/android/server/slice/-$$Lambda$SliceManagerService$pJ39TkC3AEVezLFEPuJgSQSTDJM;
-Lcom/android/server/slice/DirtyTracker$Persistable;
-Lcom/android/server/slice/DirtyTracker;
-Lcom/android/server/slice/PinnedSliceState$ListenerInfo;
-Lcom/android/server/slice/PinnedSliceState;
-Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;
-Lcom/android/server/slice/SliceClientPermissions;
-Lcom/android/server/slice/SliceManagerService$1;
-Lcom/android/server/slice/SliceManagerService$Lifecycle;
-Lcom/android/server/slice/SliceManagerService;
-Lcom/android/server/slice/SlicePermissionManager$H;
-Lcom/android/server/slice/SlicePermissionManager$ParserHolder;
-Lcom/android/server/slice/SlicePermissionManager$PkgUser;
-Lcom/android/server/slice/SlicePermissionManager;
-Lcom/android/server/soundtrigger/SoundTriggerDbHelper;
-Lcom/android/server/soundtrigger/SoundTriggerHelper$MyCallStateListener;
-Lcom/android/server/soundtrigger/SoundTriggerHelper;
-Lcom/android/server/soundtrigger/SoundTriggerInternal;
-Lcom/android/server/soundtrigger/SoundTriggerService$1;
-Lcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;
-Lcom/android/server/soundtrigger/SoundTriggerService$SoundTriggerServiceStub;
+Lcom/android/server/security/VerityUtils$SetupResult;
+Lcom/android/server/security/VerityUtils;
Lcom/android/server/soundtrigger/SoundTriggerService;
-Lcom/android/server/stats/StatsCompanionService$1;
-Lcom/android/server/stats/StatsCompanionService$AnomalyAlarmReceiver;
-Lcom/android/server/stats/StatsCompanionService$AppUpdateReceiver;
Lcom/android/server/stats/StatsCompanionService$Lifecycle;
-Lcom/android/server/stats/StatsCompanionService$PeriodicAlarmReceiver;
-Lcom/android/server/stats/StatsCompanionService$PullingAlarmReceiver;
-Lcom/android/server/stats/StatsCompanionService$ShutdownEventReceiver;
-Lcom/android/server/stats/StatsCompanionService$StatsdDeathRecipient;
-Lcom/android/server/stats/StatsCompanionService;
-Lcom/android/server/statusbar/-$$Lambda$StatusBarManagerService$yJtT-4wu2t7bMtUpZNqcLBShMU8;
Lcom/android/server/statusbar/StatusBarManagerInternal;
-Lcom/android/server/statusbar/StatusBarManagerService$1;
-Lcom/android/server/statusbar/StatusBarManagerService$2;
-Lcom/android/server/statusbar/StatusBarManagerService$3;
-Lcom/android/server/statusbar/StatusBarManagerService$4;
-Lcom/android/server/statusbar/StatusBarManagerService$6;
-Lcom/android/server/statusbar/StatusBarManagerService$7;
-Lcom/android/server/statusbar/StatusBarManagerService$DisableRecord;
Lcom/android/server/statusbar/StatusBarManagerService;
+Lcom/android/server/storage/AppFuseBridge$MountScope;
Lcom/android/server/storage/AppFuseBridge;
-Lcom/android/server/storage/CacheQuotaStrategy;
Lcom/android/server/storage/DeviceStorageMonitorInternal;
-Lcom/android/server/storage/DeviceStorageMonitorService$1;
-Lcom/android/server/storage/DeviceStorageMonitorService$2;
-Lcom/android/server/storage/DeviceStorageMonitorService$3;
-Lcom/android/server/storage/DeviceStorageMonitorService$CacheFileDeletedObserver;
-Lcom/android/server/storage/DeviceStorageMonitorService$State;
Lcom/android/server/storage/DeviceStorageMonitorService;
-Lcom/android/server/storage/DiskStatsLoggingService;
-Lcom/android/server/telecom/TelecomLoaderService$1;
-Lcom/android/server/telecom/TelecomLoaderService$2;
-Lcom/android/server/telecom/TelecomLoaderService$3;
-Lcom/android/server/telecom/TelecomLoaderService$4;
-Lcom/android/server/telecom/TelecomLoaderService$5;
-Lcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection$1;
-Lcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;
Lcom/android/server/telecom/TelecomLoaderService;
Lcom/android/server/textclassifier/TextClassificationManagerService$Lifecycle;
-Lcom/android/server/textclassifier/TextClassificationManagerService$UserState$TextClassifierServiceConnection;
-Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;
-Lcom/android/server/textclassifier/TextClassificationManagerService;
-Lcom/android/server/timezone/ConfigHelper;
-Lcom/android/server/timezone/PackageManagerHelper;
-Lcom/android/server/timezone/PackageStatusStorage;
-Lcom/android/server/timezone/PackageTracker;
-Lcom/android/server/timezone/PackageTrackerHelperImpl;
-Lcom/android/server/timezone/PackageTrackerIntentHelper;
-Lcom/android/server/timezone/PackageTrackerIntentHelperImpl$Receiver;
-Lcom/android/server/timezone/PackageTrackerIntentHelperImpl;
-Lcom/android/server/timezone/PermissionHelper;
-Lcom/android/server/timezone/RulesManagerIntentHelper;
-Lcom/android/server/timezone/RulesManagerService$Lifecycle;
-Lcom/android/server/timezone/RulesManagerService;
-Lcom/android/server/timezone/RulesManagerServiceHelperImpl;
-Lcom/android/server/timezone/TimeZoneUpdateIdler;
-Lcom/android/server/trust/-$$Lambda$TrustManagerService$1$98HKBkg-C1PLlz_Q1vJz1OJtw4c;
-Lcom/android/server/trust/TrustArchive;
-Lcom/android/server/trust/TrustManagerService$1;
-Lcom/android/server/trust/TrustManagerService$2;
-Lcom/android/server/trust/TrustManagerService$3;
-Lcom/android/server/trust/TrustManagerService$AgentInfo;
-Lcom/android/server/trust/TrustManagerService$Receiver;
-Lcom/android/server/trust/TrustManagerService$SettingsAttrs;
-Lcom/android/server/trust/TrustManagerService$StrongAuthTracker;
Lcom/android/server/trust/TrustManagerService;
+Lcom/android/server/tv/TvInputHal$Callback;
Lcom/android/server/tv/TvInputHal;
+Lcom/android/server/tv/TvInputManagerService;
+Lcom/android/server/tv/TvRemoteService;
Lcom/android/server/tv/UinputBridge;
-Lcom/android/server/twilight/TwilightListener;
-Lcom/android/server/twilight/TwilightManager;
-Lcom/android/server/twilight/TwilightService$1;
Lcom/android/server/twilight/TwilightService;
-Lcom/android/server/usage/-$$Lambda$UsageStatsService$VoLNrRDaTqGpWDfCW6NTYC92LRY;
-Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;
-Lcom/android/server/usage/AppIdleHistory;
-Lcom/android/server/usage/AppStandbyController$1;
-Lcom/android/server/usage/AppStandbyController$2;
-Lcom/android/server/usage/AppStandbyController$AppStandbyHandler;
-Lcom/android/server/usage/AppStandbyController$DeviceStateReceiver;
-Lcom/android/server/usage/AppStandbyController$Injector;
-Lcom/android/server/usage/AppStandbyController$Lock;
-Lcom/android/server/usage/AppStandbyController$PackageReceiver;
-Lcom/android/server/usage/AppStandbyController$SettingsObserver;
-Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;
-Lcom/android/server/usage/AppStandbyController;
-Lcom/android/server/usage/AppTimeLimitController$Lock;
-Lcom/android/server/usage/AppTimeLimitController$MyHandler;
-Lcom/android/server/usage/AppTimeLimitController$OnLimitReachedListener;
-Lcom/android/server/usage/AppTimeLimitController$UserData;
-Lcom/android/server/usage/AppTimeLimitController;
-Lcom/android/server/usage/IntervalStats$EventTracker;
-Lcom/android/server/usage/IntervalStats;
-Lcom/android/server/usage/StorageStatsService$1;
-Lcom/android/server/usage/StorageStatsService$H;
-Lcom/android/server/usage/StorageStatsService$Lifecycle;
-Lcom/android/server/usage/StorageStatsService;
-Lcom/android/server/usage/UnixCalendar;
-Lcom/android/server/usage/UsageStatsDatabase$1;
-Lcom/android/server/usage/UsageStatsDatabase$StatCombiner;
-Lcom/android/server/usage/UsageStatsDatabase;
-Lcom/android/server/usage/UsageStatsService$1;
-Lcom/android/server/usage/UsageStatsService$2;
-Lcom/android/server/usage/UsageStatsService$BinderService;
-Lcom/android/server/usage/UsageStatsService$H;
-Lcom/android/server/usage/UsageStatsService$LocalService;
-Lcom/android/server/usage/UsageStatsService$UserActionsReceiver;
Lcom/android/server/usage/UsageStatsService;
-Lcom/android/server/usage/UsageStatsXml;
-Lcom/android/server/usage/UsageStatsXmlV1;
-Lcom/android/server/usage/UserUsageStatsService$1;
-Lcom/android/server/usage/UserUsageStatsService$2;
-Lcom/android/server/usage/UserUsageStatsService$3;
Lcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;
-Lcom/android/server/usage/UserUsageStatsService;
Lcom/android/server/usb/-$$Lambda$UsbHostManager$XT3F5aQci4H6VWSBYBQQNSzpnvs;
-Lcom/android/server/usb/-$$Lambda$UsbPortManager$FUqGOOupcl6RrRkZBk-BnrRQyPI;
-Lcom/android/server/usb/-$$Lambda$UsbProfileGroupSettingsManager$IQKTzU0q3lyaW9nLL_sbxJPW8ME;
-Lcom/android/server/usb/MtpNotificationManager$OnOpenInAppListener;
-Lcom/android/server/usb/MtpNotificationManager$Receiver;
-Lcom/android/server/usb/MtpNotificationManager;
Lcom/android/server/usb/UsbAlsaJackDetector;
Lcom/android/server/usb/UsbAlsaManager;
-Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingHandler;
-Lcom/android/server/usb/UsbDebuggingManager;
-Lcom/android/server/usb/UsbDeviceManager$1;
-Lcom/android/server/usb/UsbDeviceManager$2;
-Lcom/android/server/usb/UsbDeviceManager$3;
-Lcom/android/server/usb/UsbDeviceManager$4;
-Lcom/android/server/usb/UsbDeviceManager$AdbSettingsObserver;
-Lcom/android/server/usb/UsbDeviceManager$UsbHandler;
-Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal$ServiceNotification;
-Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal$UsbGadgetCallback;
-Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal$UsbGadgetDeathRecipient;
-Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;
-Lcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;
-Lcom/android/server/usb/UsbDeviceManager$UsbUEventObserver;
Lcom/android/server/usb/UsbDeviceManager;
+Lcom/android/server/usb/UsbHostManager$ConnectionRecord;
Lcom/android/server/usb/UsbHostManager;
+Lcom/android/server/usb/UsbMidiDevice$1;
+Lcom/android/server/usb/UsbMidiDevice$2;
+Lcom/android/server/usb/UsbMidiDevice$3;
+Lcom/android/server/usb/UsbMidiDevice$InputReceiverProxy;
Lcom/android/server/usb/UsbMidiDevice;
-Lcom/android/server/usb/UsbPortManager$1;
-Lcom/android/server/usb/UsbPortManager$DeathRecipient;
-Lcom/android/server/usb/UsbPortManager$HALCallback;
-Lcom/android/server/usb/UsbPortManager$PortInfo;
-Lcom/android/server/usb/UsbPortManager$RawPortInfo$1;
-Lcom/android/server/usb/UsbPortManager$RawPortInfo;
-Lcom/android/server/usb/UsbPortManager$ServiceNotification;
-Lcom/android/server/usb/UsbPortManager;
-Lcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;
Lcom/android/server/usb/UsbProfileGroupSettingsManager;
-Lcom/android/server/usb/UsbService$1;
-Lcom/android/server/usb/UsbService$Lifecycle;
-Lcom/android/server/usb/UsbService;
Lcom/android/server/usb/UsbSettingsManager;
-Lcom/android/server/utils/ManagedApplicationService$BinderChecker;
-Lcom/android/server/utils/ManagedApplicationService$EventCallback;
-Lcom/android/server/utils/ManagedApplicationService$LogFormattable;
+Lcom/android/server/usb/UsbUserSettingsManager;
+Lcom/android/server/usb/descriptors/UsbDescriptor;
+Lcom/android/server/usb/descriptors/UsbDescriptorParser;
+Lcom/android/server/usb/descriptors/UsbDeviceDescriptor;
+Lcom/android/server/usb/descriptors/report/Reporting;
Lcom/android/server/utils/PriorityDump$PriorityDumper;
-Lcom/android/server/voiceinteraction/DatabaseHelper;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$1;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$LocalService;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$2;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$SettingsObserver;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;
-Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;
-Lcom/android/server/vr/EnabledComponentsObserver$1;
+Lcom/android/server/utils/PriorityDump;
Lcom/android/server/vr/EnabledComponentsObserver$EnabledComponentChangeListener;
-Lcom/android/server/vr/EnabledComponentsObserver;
-Lcom/android/server/vr/SettingsObserver$1;
-Lcom/android/server/vr/SettingsObserver$2;
-Lcom/android/server/vr/SettingsObserver$SettingChangeListener;
-Lcom/android/server/vr/SettingsObserver;
-Lcom/android/server/vr/Vr2dDisplay$1;
-Lcom/android/server/vr/Vr2dDisplay;
Lcom/android/server/vr/VrManagerInternal;
-Lcom/android/server/vr/VrManagerService$1;
-Lcom/android/server/vr/VrManagerService$2;
-Lcom/android/server/vr/VrManagerService$3;
-Lcom/android/server/vr/VrManagerService$4;
-Lcom/android/server/vr/VrManagerService$5;
-Lcom/android/server/vr/VrManagerService$LocalService;
-Lcom/android/server/vr/VrManagerService$NotificationAccessManager;
-Lcom/android/server/vr/VrManagerService$VrState;
Lcom/android/server/vr/VrManagerService;
-Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$KpV9TczlJklVG4VNZncaU86_KtQ;
-Lcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$QhODF3v-swnwSYvDbeEhU85gOBw;
-Lcom/android/server/wallpaper/IWallpaperManagerService;
-Lcom/android/server/wallpaper/WallpaperManagerService$1;
-Lcom/android/server/wallpaper/WallpaperManagerService$2;
-Lcom/android/server/wallpaper/WallpaperManagerService$3;
-Lcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;
-Lcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;
-Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;
-Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;
-Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperObserver;
-Lcom/android/server/wallpaper/WallpaperManagerService;
-Lcom/android/server/webkit/SystemImpl$LazyHolder;
-Lcom/android/server/webkit/SystemImpl;
-Lcom/android/server/webkit/SystemInterface;
-Lcom/android/server/webkit/WebViewUpdateService$1;
-Lcom/android/server/webkit/WebViewUpdateService$BinderService;
Lcom/android/server/webkit/WebViewUpdateService;
-Lcom/android/server/webkit/WebViewUpdateServiceImpl;
-Lcom/android/server/webkit/WebViewUpdater$ProviderAndPackageInfo;
-Lcom/android/server/webkit/WebViewUpdater$WebViewPackageMissingException;
-Lcom/android/server/webkit/WebViewUpdater;
-Lcom/android/server/wifi/-$$Lambda$AvailableNetworkNotifier$uFi1H-bLBjC8591OGivQMgKmiaU;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$-QOM6V5ZTnXWwvLBR-5woE-K_9c;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$7IqRxcNtEnrXS9uVkc3w4xT9lgk;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$ErxCpEghr4yhQpGHX1NQPumvouc;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$HLPmFjXA6r19Ma_sML3KIFjYXI8;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$INj3cXuz7UCfJAOVdMEteizngtw;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$ListenerProxy$EUZ7m5GXHY27oKauEW_8pihGjbw;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$ListenerProxy$YGLSZf58sxTORRCaSB1wOY_oquo;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$OTxRCq8TAZZlX8UFhmqaHcpXJYQ;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$W3qf_0tQXw4SlDmLzDZsc-YHrJQ;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$ZUYyxSyT0hYOkWCRHSzePknlIo0;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$aTCTYHFoCRvUuzhQPn5Voq6cUFw;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$bTmsDoAj9faJCBOTeT1Q3Ww5yNM;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$csull9RuGux3O9fMU2TmHd3K8YE;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$d3wDJSLIYr6Z1fiH2ZtAJWELMyY;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$jNAzj5YlVhwJm5NjZ6HiKskQStI;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$joTzPjiPCypwHxT_jbl9OKHFMJo;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$noScTs3Ynk8rNxP5lvUv8ww_gg4;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$oV0zj57wyQrMevn_BdPhBTwDZhY;
-Lcom/android/server/wifi/-$$Lambda$HalDeviceManager$rMUl3IrUZdoNc-Vrb1rqn8XExY0;
-Lcom/android/server/wifi/-$$Lambda$HostapdHal$BanSRPFiiwZZpFD4d63QpeU1xBA;
-Lcom/android/server/wifi/-$$Lambda$HostapdHal$ykyXfQPF5iy3e1W0s1ikBBPfH-Y;
-Lcom/android/server/wifi/-$$Lambda$SupplicantStaIfaceHal$HYy_ivRYb5h7sLwkHNoi3DEuZxA;
-Lcom/android/server/wifi/-$$Lambda$SupplicantStaIfaceHal$MsPuzKcT4xAfuigKAAOs1rYm9CU;
-Lcom/android/server/wifi/-$$Lambda$SupplicantStaIfaceHal$RN5yy1Bc5d6E1Z6k9lqZIMdLATc;
-Lcom/android/server/wifi/-$$Lambda$SupplicantStaIfaceHal$jt86rUfXpbjU1MKB5KeL4Iv2b0k;
-Lcom/android/server/wifi/-$$Lambda$SupplicantStaIfaceHal$oY40I1ZV1zNoEKNITjSxjIr7WaE;
-Lcom/android/server/wifi/-$$Lambda$WifiServiceImpl$Zd1sHIg7rJfJmwY_51xkiXQGMAI;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$0gGojGcifgvfhGv7aD4Qbmyl79k;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$0nn1d2XVTxIXDSyzfYz5nuiMmaM;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$78Olu6lZcZThVdxrs2nTDEfDswQ;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$9OKuBaEsJa-3ksFDFIHk8H-fn6Q;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$Cu5ECBYZ9xFCAH1Q99vuft6nyvY;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$Lnl0TvBZpgQMVgoYAtSlApp_k88;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$ZD_VoFx-B8racz66daaqFreli3E;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$bXzROfFjRqOgC9QmMk6fP3MnLSg;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$dFBsbco7FdXhMfSsRSt5MvRa-No;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$dLmE-Gt21lNab7JkIiohEIIEf6Q;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$j9-GquCvCUY0kL-ke7FWj2rB-_I;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$nzLDa8bqkjnOhiEpwrQr8oy-Abg;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$qPUuRnlo2XMDrsA1gI_KLrbvPAI;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$sRX80xmV169NEPfDVRtnwl0y95Q;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$tzHRLpLug6A0mb6rrMUdhsh-NDU;
-Lcom/android/server/wifi/-$$Lambda$WifiVendorHal$xptizMJG5Idss3aicEI09xlMbnE;
-Lcom/android/server/wifi/ActiveModeManager;
-Lcom/android/server/wifi/AggressiveConnectedScore;
-Lcom/android/server/wifi/AvailableNetworkNotifier$1;
-Lcom/android/server/wifi/AvailableNetworkNotifier$AvailableNetworkNotifierStoreData;
-Lcom/android/server/wifi/AvailableNetworkNotifier$NotificationEnabledSettingObserver;
-Lcom/android/server/wifi/AvailableNetworkNotifier;
-Lcom/android/server/wifi/BackupManagerProxy;
-Lcom/android/server/wifi/BaseWifiDiagnostics;
-Lcom/android/server/wifi/BuildProperties;
-Lcom/android/server/wifi/CarrierNetworkConfig$1;
-Lcom/android/server/wifi/CarrierNetworkConfig$2;
-Lcom/android/server/wifi/CarrierNetworkConfig;
-Lcom/android/server/wifi/CarrierNetworkNotifier;
-Lcom/android/server/wifi/ClientModeManager$ClientModeStateMachine$1;
-Lcom/android/server/wifi/ClientModeManager$ClientModeStateMachine$IdleState;
-Lcom/android/server/wifi/ClientModeManager$ClientModeStateMachine$StartedState;
-Lcom/android/server/wifi/ClientModeManager$ClientModeStateMachine;
-Lcom/android/server/wifi/ClientModeManager$Listener;
-Lcom/android/server/wifi/ClientModeManager;
-Lcom/android/server/wifi/Clock;
-Lcom/android/server/wifi/ConfigurationMap;
-Lcom/android/server/wifi/ConnectToNetworkNotificationBuilder;
-Lcom/android/server/wifi/ConnectedScore;
-Lcom/android/server/wifi/DefaultModeManager;
-Lcom/android/server/wifi/DeletedEphemeralSsidsStoreData;
-Lcom/android/server/wifi/DummyLogMessage;
-Lcom/android/server/wifi/ExtendedWifiInfo;
-Lcom/android/server/wifi/FakeWifiLog;
-Lcom/android/server/wifi/FrameworkFacade;
-Lcom/android/server/wifi/HalDeviceManager$1;
-Lcom/android/server/wifi/HalDeviceManager$IfaceCreationData;
-Lcom/android/server/wifi/HalDeviceManager$InterfaceAvailableForRequestListener;
-Lcom/android/server/wifi/HalDeviceManager$InterfaceAvailableForRequestListenerProxy;
-Lcom/android/server/wifi/HalDeviceManager$InterfaceCacheEntry;
-Lcom/android/server/wifi/HalDeviceManager$InterfaceDestroyedListener;
-Lcom/android/server/wifi/HalDeviceManager$InterfaceDestroyedListenerProxy;
-Lcom/android/server/wifi/HalDeviceManager$ListenerProxy;
-Lcom/android/server/wifi/HalDeviceManager$ManagerStatusListener;
-Lcom/android/server/wifi/HalDeviceManager$ManagerStatusListenerProxy;
-Lcom/android/server/wifi/HalDeviceManager$WifiChipInfo;
-Lcom/android/server/wifi/HalDeviceManager$WifiEventCallback;
-Lcom/android/server/wifi/HalDeviceManager$WifiIfaceInfo;
-Lcom/android/server/wifi/HalDeviceManager;
-Lcom/android/server/wifi/HostapdHal$1;
-Lcom/android/server/wifi/HostapdHal;
-Lcom/android/server/wifi/LastMileLogger;
-Lcom/android/server/wifi/LogcatLog$RealLogMessage;
-Lcom/android/server/wifi/LogcatLog;
-Lcom/android/server/wifi/NetworkListStoreData;
-Lcom/android/server/wifi/NetworkUpdateResult;
-Lcom/android/server/wifi/OpenNetworkNotifier;
-Lcom/android/server/wifi/PropertyService;
-Lcom/android/server/wifi/SIMAccessor;
-Lcom/android/server/wifi/SarManager$WifiPhoneStateListener;
-Lcom/android/server/wifi/SarManager;
-Lcom/android/server/wifi/SavedNetworkEvaluator;
-Lcom/android/server/wifi/ScanDetail;
-Lcom/android/server/wifi/ScanDetailCache;
-Lcom/android/server/wifi/ScanOnlyModeManager$Listener;
-Lcom/android/server/wifi/ScanOnlyModeManager;
-Lcom/android/server/wifi/ScanRequestProxy;
-Lcom/android/server/wifi/ScoredNetworkEvaluator$1;
-Lcom/android/server/wifi/ScoredNetworkEvaluator;
-Lcom/android/server/wifi/ScoringParams$1;
-Lcom/android/server/wifi/ScoringParams$Values;
-Lcom/android/server/wifi/ScoringParams;
-Lcom/android/server/wifi/SelfRecovery;
-Lcom/android/server/wifi/SoftApManager;
-Lcom/android/server/wifi/SoftApModeConfiguration;
-Lcom/android/server/wifi/SsidSetStoreData$DataSource;
-Lcom/android/server/wifi/SsidSetStoreData;
-Lcom/android/server/wifi/StateChangeResult;
-Lcom/android/server/wifi/SupplicantStaIfaceHal$1;
-Lcom/android/server/wifi/SupplicantStaIfaceHal$SupplicantStaIfaceHalCallback;
-Lcom/android/server/wifi/SupplicantStaIfaceHal$SupplicantStaIfaceHalCallbackV1_1;
-Lcom/android/server/wifi/SupplicantStaIfaceHal;
-Lcom/android/server/wifi/SupplicantStateTracker$CompletedState;
-Lcom/android/server/wifi/SupplicantStateTracker$ConnectionActiveState;
-Lcom/android/server/wifi/SupplicantStateTracker$DefaultState;
-Lcom/android/server/wifi/SupplicantStateTracker$DisconnectedState;
-Lcom/android/server/wifi/SupplicantStateTracker$DormantState;
-Lcom/android/server/wifi/SupplicantStateTracker$HandshakeState;
-Lcom/android/server/wifi/SupplicantStateTracker$InactiveState;
-Lcom/android/server/wifi/SupplicantStateTracker$ScanState;
-Lcom/android/server/wifi/SupplicantStateTracker$UninitializedState;
-Lcom/android/server/wifi/SupplicantStateTracker;
-Lcom/android/server/wifi/SystemBuildProperties;
-Lcom/android/server/wifi/SystemPropertyService;
-Lcom/android/server/wifi/VelocityBasedConnectedScore;
-Lcom/android/server/wifi/WakeupConfigStoreData$DataSource;
-Lcom/android/server/wifi/WakeupConfigStoreData;
-Lcom/android/server/wifi/WakeupController$1;
-Lcom/android/server/wifi/WakeupController$2;
-Lcom/android/server/wifi/WakeupController$IsActiveDataSource;
-Lcom/android/server/wifi/WakeupController;
-Lcom/android/server/wifi/WakeupEvaluator;
-Lcom/android/server/wifi/WakeupLock$WakeupLockDataSource;
-Lcom/android/server/wifi/WakeupLock;
-Lcom/android/server/wifi/WakeupNotificationFactory;
-Lcom/android/server/wifi/WakeupOnboarding$1;
-Lcom/android/server/wifi/WakeupOnboarding$IsOnboardedDataSource;
-Lcom/android/server/wifi/WakeupOnboarding$NotificationsDataSource;
-Lcom/android/server/wifi/WakeupOnboarding;
-Lcom/android/server/wifi/WifiApConfigStore;
-Lcom/android/server/wifi/WifiBackupDataParser;
-Lcom/android/server/wifi/WifiBackupDataV1Parser;
-Lcom/android/server/wifi/WifiBackupRestore$SupplicantBackupMigration$SupplicantNetworks;
-Lcom/android/server/wifi/WifiBackupRestore$SupplicantBackupMigration;
-Lcom/android/server/wifi/WifiBackupRestore;
-Lcom/android/server/wifi/WifiConfigManager$1;
-Lcom/android/server/wifi/WifiConfigManager$OnSavedNetworkUpdateListener;
-Lcom/android/server/wifi/WifiConfigManager;
-Lcom/android/server/wifi/WifiConfigStore$1;
-Lcom/android/server/wifi/WifiConfigStore$StoreData;
-Lcom/android/server/wifi/WifiConfigStore$StoreFile;
-Lcom/android/server/wifi/WifiConfigStore;
-Lcom/android/server/wifi/WifiConfigStoreLegacy$IpConfigStoreWrapper;
-Lcom/android/server/wifi/WifiConfigStoreLegacy;
-Lcom/android/server/wifi/WifiConfigurationUtil$WifiConfigurationComparator;
-Lcom/android/server/wifi/WifiConnectivityHelper;
-Lcom/android/server/wifi/WifiConnectivityManager$1;
-Lcom/android/server/wifi/WifiConnectivityManager$2;
-Lcom/android/server/wifi/WifiConnectivityManager$3;
-Lcom/android/server/wifi/WifiConnectivityManager$AllSingleScanListener;
-Lcom/android/server/wifi/WifiConnectivityManager$OnSavedNetworkUpdateListener;
-Lcom/android/server/wifi/WifiConnectivityManager$PnoScanListener;
-Lcom/android/server/wifi/WifiConnectivityManager;
-Lcom/android/server/wifi/WifiController$1;
-Lcom/android/server/wifi/WifiController$ClientModeCallback;
-Lcom/android/server/wifi/WifiController$DefaultState;
-Lcom/android/server/wifi/WifiController$DeviceActiveState;
-Lcom/android/server/wifi/WifiController$EcmState;
-Lcom/android/server/wifi/WifiController$ScanOnlyCallback;
-Lcom/android/server/wifi/WifiController$StaDisabledState;
-Lcom/android/server/wifi/WifiController$StaDisabledWithScanState;
-Lcom/android/server/wifi/WifiController$StaEnabledState;
-Lcom/android/server/wifi/WifiController;
-Lcom/android/server/wifi/WifiCountryCode;
-Lcom/android/server/wifi/WifiDiagnostics$1;
-Lcom/android/server/wifi/WifiDiagnostics$2;
-Lcom/android/server/wifi/WifiDiagnostics$BugReport;
-Lcom/android/server/wifi/WifiDiagnostics$LimitedCircularArray;
-Lcom/android/server/wifi/WifiDiagnostics;
-Lcom/android/server/wifi/WifiInjector;
-Lcom/android/server/wifi/WifiKeyStore;
-Lcom/android/server/wifi/WifiLastResortWatchdog;
-Lcom/android/server/wifi/WifiLinkLayerStats;
-Lcom/android/server/wifi/WifiLockManager;
-Lcom/android/server/wifi/WifiLog$LogMessage;
-Lcom/android/server/wifi/WifiLog;
-Lcom/android/server/wifi/WifiMetrics$1;
-Lcom/android/server/wifi/WifiMetrics;
-Lcom/android/server/wifi/WifiMonitor;
-Lcom/android/server/wifi/WifiMulticastLockManager$FilterController;
-Lcom/android/server/wifi/WifiMulticastLockManager;
-Lcom/android/server/wifi/WifiNative$BucketSettings;
-Lcom/android/server/wifi/WifiNative$ChannelSettings;
-Lcom/android/server/wifi/WifiNative$FateReport;
-Lcom/android/server/wifi/WifiNative$Iface;
-Lcom/android/server/wifi/WifiNative$IfaceManager;
-Lcom/android/server/wifi/WifiNative$InterfaceCallback;
-Lcom/android/server/wifi/WifiNative$InterfaceDestoyedListenerInternal;
-Lcom/android/server/wifi/WifiNative$NetworkObserverInternal;
-Lcom/android/server/wifi/WifiNative$PnoEventHandler;
-Lcom/android/server/wifi/WifiNative$RingBufferStatus;
-Lcom/android/server/wifi/WifiNative$RoamingCapabilities;
-Lcom/android/server/wifi/WifiNative$RoamingConfig;
-Lcom/android/server/wifi/WifiNative$RttEventHandler;
-Lcom/android/server/wifi/WifiNative$RxFateReport;
-Lcom/android/server/wifi/WifiNative$ScanCapabilities;
-Lcom/android/server/wifi/WifiNative$ScanEventHandler;
-Lcom/android/server/wifi/WifiNative$ScanSettings;
-Lcom/android/server/wifi/WifiNative$SignalPollResult;
-Lcom/android/server/wifi/WifiNative$StatusListener;
-Lcom/android/server/wifi/WifiNative$SupplicantDeathEventHandler;
-Lcom/android/server/wifi/WifiNative$SupplicantDeathHandlerInternal;
-Lcom/android/server/wifi/WifiNative$TxFateReport;
-Lcom/android/server/wifi/WifiNative$TxPacketCounters;
-Lcom/android/server/wifi/WifiNative$VendorHalDeathEventHandler;
-Lcom/android/server/wifi/WifiNative$VendorHalDeathHandlerInternal;
-Lcom/android/server/wifi/WifiNative$VendorHalRadioModeChangeEventHandler;
-Lcom/android/server/wifi/WifiNative$VendorHalRadioModeChangeHandlerInternal;
-Lcom/android/server/wifi/WifiNative$WifiLoggerEventHandler;
-Lcom/android/server/wifi/WifiNative$WifiRssiEventHandler;
-Lcom/android/server/wifi/WifiNative$WificondDeathEventHandler;
-Lcom/android/server/wifi/WifiNative$WificondDeathHandlerInternal;
-Lcom/android/server/wifi/WifiNative;
-Lcom/android/server/wifi/WifiNetworkHistory$1;
-Lcom/android/server/wifi/WifiNetworkHistory;
-Lcom/android/server/wifi/WifiNetworkSelector$NetworkEvaluator;
-Lcom/android/server/wifi/WifiNetworkSelector;
-Lcom/android/server/wifi/WifiPowerMetrics;
-Lcom/android/server/wifi/WifiScoreReport;
-Lcom/android/server/wifi/WifiService;
-Lcom/android/server/wifi/WifiServiceImpl$1;
-Lcom/android/server/wifi/WifiServiceImpl$2;
-Lcom/android/server/wifi/WifiServiceImpl$3;
-Lcom/android/server/wifi/WifiServiceImpl$4;
-Lcom/android/server/wifi/WifiServiceImpl$5;
-Lcom/android/server/wifi/WifiServiceImpl$6;
-Lcom/android/server/wifi/WifiServiceImpl$7;
-Lcom/android/server/wifi/WifiServiceImpl$ClientHandler;
-Lcom/android/server/wifi/WifiServiceImpl$SoftApCallbackImpl;
-Lcom/android/server/wifi/WifiServiceImpl$WifiStateMachineHandler;
-Lcom/android/server/wifi/WifiServiceImpl;
-Lcom/android/server/wifi/WifiSettingsStore;
-Lcom/android/server/wifi/WifiStateMachine$1;
-Lcom/android/server/wifi/WifiStateMachine$2;
-Lcom/android/server/wifi/WifiStateMachine$3;
-Lcom/android/server/wifi/WifiStateMachine$4;
-Lcom/android/server/wifi/WifiStateMachine$ConnectModeState;
-Lcom/android/server/wifi/WifiStateMachine$ConnectedState;
-Lcom/android/server/wifi/WifiStateMachine$DefaultState;
-Lcom/android/server/wifi/WifiStateMachine$DisconnectedState;
-Lcom/android/server/wifi/WifiStateMachine$DisconnectingState;
-Lcom/android/server/wifi/WifiStateMachine$IpClientCallback;
-Lcom/android/server/wifi/WifiStateMachine$L2ConnectedState$RssiEventHandler;
-Lcom/android/server/wifi/WifiStateMachine$L2ConnectedState;
-Lcom/android/server/wifi/WifiStateMachine$McastLockManagerFilterController;
-Lcom/android/server/wifi/WifiStateMachine$ObtainingIpState;
-Lcom/android/server/wifi/WifiStateMachine$RoamingState;
-Lcom/android/server/wifi/WifiStateMachine$UntrustedWifiNetworkFactory;
-Lcom/android/server/wifi/WifiStateMachine$WifiNetworkAgent;
-Lcom/android/server/wifi/WifiStateMachine$WifiNetworkFactory;
-Lcom/android/server/wifi/WifiStateMachine;
-Lcom/android/server/wifi/WifiStateMachinePrime$ModeStateMachine$ClientModeActiveState$ClientListener;
-Lcom/android/server/wifi/WifiStateMachinePrime$ModeStateMachine$ClientModeActiveState;
-Lcom/android/server/wifi/WifiStateMachinePrime$ModeStateMachine$ModeActiveState;
-Lcom/android/server/wifi/WifiStateMachinePrime$ModeStateMachine$ScanOnlyModeActiveState;
-Lcom/android/server/wifi/WifiStateMachinePrime$ModeStateMachine$WifiDisabledState;
-Lcom/android/server/wifi/WifiStateMachinePrime$ModeStateMachine;
-Lcom/android/server/wifi/WifiStateMachinePrime$WifiNativeStatusListener;
-Lcom/android/server/wifi/WifiStateMachinePrime;
-Lcom/android/server/wifi/WifiStateTracker;
-Lcom/android/server/wifi/WifiTrafficPoller$1;
-Lcom/android/server/wifi/WifiTrafficPoller$TrafficHandler;
-Lcom/android/server/wifi/WifiTrafficPoller;
-Lcom/android/server/wifi/WifiVendorHal$1;
-Lcom/android/server/wifi/WifiVendorHal$1AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$2AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$3AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$4AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$5AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$6AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$7AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$8AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$9AnswerBox;
-Lcom/android/server/wifi/WifiVendorHal$ApInterfaceDestroyedListenerInternal;
-Lcom/android/server/wifi/WifiVendorHal$ChipEventCallback;
-Lcom/android/server/wifi/WifiVendorHal$ChipEventCallbackV12;
-Lcom/android/server/wifi/WifiVendorHal$CurrentBackgroundScan;
-Lcom/android/server/wifi/WifiVendorHal$HalDeviceManagerStatusListener;
-Lcom/android/server/wifi/WifiVendorHal$RttEventCallback;
-Lcom/android/server/wifi/WifiVendorHal$StaIfaceEventCallback;
-Lcom/android/server/wifi/WifiVendorHal$StaInterfaceDestroyedListenerInternal;
-Lcom/android/server/wifi/WifiVendorHal;
-Lcom/android/server/wifi/WifiWakeMetrics;
-Lcom/android/server/wifi/WificondControl$PnoScanEventHandler;
-Lcom/android/server/wifi/WificondControl$ScanEventHandler;
-Lcom/android/server/wifi/WificondControl;
-Lcom/android/server/wifi/WrongPasswordNotifier;
-Lcom/android/server/wifi/aware/Capabilities;
-Lcom/android/server/wifi/aware/WifiAwareDataPathStateManager$NetworkInterfaceWrapper;
-Lcom/android/server/wifi/aware/WifiAwareDataPathStateManager$WifiAwareNetworkFactory;
-Lcom/android/server/wifi/aware/WifiAwareDataPathStateManager;
-Lcom/android/server/wifi/aware/WifiAwareMetrics;
-Lcom/android/server/wifi/aware/WifiAwareNativeApi;
-Lcom/android/server/wifi/aware/WifiAwareNativeCallback;
-Lcom/android/server/wifi/aware/WifiAwareNativeManager$InterfaceAvailableForRequestListener;
-Lcom/android/server/wifi/aware/WifiAwareNativeManager$InterfaceDestroyedListener;
-Lcom/android/server/wifi/aware/WifiAwareNativeManager;
-Lcom/android/server/wifi/aware/WifiAwareService;
-Lcom/android/server/wifi/aware/WifiAwareServiceImpl$1;
-Lcom/android/server/wifi/aware/WifiAwareServiceImpl;
-Lcom/android/server/wifi/aware/WifiAwareShellCommand$DelegatedShellCommand;
-Lcom/android/server/wifi/aware/WifiAwareShellCommand;
-Lcom/android/server/wifi/aware/WifiAwareStateManager$1;
-Lcom/android/server/wifi/aware/WifiAwareStateManager$2;
-Lcom/android/server/wifi/aware/WifiAwareStateManager$3;
-Lcom/android/server/wifi/aware/WifiAwareStateManager$WifiAwareStateMachine$DefaultState;
-Lcom/android/server/wifi/aware/WifiAwareStateManager$WifiAwareStateMachine$WaitForResponseState;
-Lcom/android/server/wifi/aware/WifiAwareStateManager$WifiAwareStateMachine$WaitState;
-Lcom/android/server/wifi/aware/WifiAwareStateManager$WifiAwareStateMachine;
-Lcom/android/server/wifi/aware/WifiAwareStateManager;
-Lcom/android/server/wifi/hotspot2/-$$Lambda$PasspointProvisioner$D6b75X8GL55-AmCExPWESj54yLE;
-Lcom/android/server/wifi/hotspot2/ANQPRequestManager;
-Lcom/android/server/wifi/hotspot2/AnqpCache;
-Lcom/android/server/wifi/hotspot2/AnqpEvent;
-Lcom/android/server/wifi/hotspot2/CertificateVerifier;
-Lcom/android/server/wifi/hotspot2/IconEvent;
-Lcom/android/server/wifi/hotspot2/LegacyPasspointConfigParser;
-Lcom/android/server/wifi/hotspot2/NetworkDetail$Ant;
-Lcom/android/server/wifi/hotspot2/NetworkDetail;
-Lcom/android/server/wifi/hotspot2/OsuNetworkConnection$1;
-Lcom/android/server/wifi/hotspot2/OsuNetworkConnection$Callbacks;
-Lcom/android/server/wifi/hotspot2/OsuNetworkConnection$ConnectivityCallbacks;
-Lcom/android/server/wifi/hotspot2/OsuNetworkConnection;
-Lcom/android/server/wifi/hotspot2/OsuServerConnection$WFATrustManager;
-Lcom/android/server/wifi/hotspot2/OsuServerConnection;
-Lcom/android/server/wifi/hotspot2/PasspointConfigStoreData$DataSource;
-Lcom/android/server/wifi/hotspot2/PasspointConfigStoreData;
-Lcom/android/server/wifi/hotspot2/PasspointEventHandler$Callbacks;
-Lcom/android/server/wifi/hotspot2/PasspointEventHandler;
-Lcom/android/server/wifi/hotspot2/PasspointManager$CallbackHandler;
-Lcom/android/server/wifi/hotspot2/PasspointManager$DataSourceHandler;
-Lcom/android/server/wifi/hotspot2/PasspointManager;
-Lcom/android/server/wifi/hotspot2/PasspointNetworkEvaluator;
-Lcom/android/server/wifi/hotspot2/PasspointObjectFactory;
-Lcom/android/server/wifi/hotspot2/PasspointProvisioner$OsuNetworkCallbacks;
-Lcom/android/server/wifi/hotspot2/PasspointProvisioner$ProvisioningStateMachine;
-Lcom/android/server/wifi/hotspot2/PasspointProvisioner;
-Lcom/android/server/wifi/hotspot2/WfaCertBuilder;
-Lcom/android/server/wifi/hotspot2/WfaKeyStore;
-Lcom/android/server/wifi/hotspot2/WnmData;
-Lcom/android/server/wifi/hotspot2/anqp/Constants$ANQPElementType;
-Lcom/android/server/wifi/p2p/-$$Lambda$SupplicantP2pIfaceHal$AwvLtkH4UyCOhUYx__3ExZj_7jQ;
-Lcom/android/server/wifi/p2p/-$$Lambda$SupplicantP2pIfaceHal$Wvwk6xCSAknWmsVUgpUqV_3NQiE;
-Lcom/android/server/wifi/p2p/-$$Lambda$WifiP2pNative$OugPqsliuKv73AxYwflB8JKX3Gg;
-Lcom/android/server/wifi/p2p/-$$Lambda$WifiP2pServiceImpl$LwceCrSRIRY_Lp9TjCEZZ62j-ls;
-Lcom/android/server/wifi/p2p/-$$Lambda$WifiP2pServiceImpl$P2pStateMachine$zMDJmVHxNOQccRUsy4cDbijFDbc;
-Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal$1;
-Lcom/android/server/wifi/p2p/SupplicantP2pIfaceHal;
-Lcom/android/server/wifi/p2p/WifiP2pMonitor;
-Lcom/android/server/wifi/p2p/WifiP2pNative$InterfaceAvailableListenerInternal;
-Lcom/android/server/wifi/p2p/WifiP2pNative;
-Lcom/android/server/wifi/p2p/WifiP2pService;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$1;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$ClientHandler;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$DeathHandlerData;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$1;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$2;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$DefaultState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$FrequencyConflictState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupCreatedState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupCreatingState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$GroupNegotiationState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$InactiveState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$OngoingGroupRemovalState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pDisabledState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pDisablingState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pEnabledState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$P2pNotSupportedState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$ProvisionDiscoveryState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingInviteRequestState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingJoinState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine$UserAuthorizingNegotiationRequestState;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStateMachine;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl$P2pStatus;
-Lcom/android/server/wifi/p2p/WifiP2pServiceImpl;
-Lcom/android/server/wifi/rtt/-$$Lambda$RttNative$51zuZWl5ad-UD9FpUAuwwPgkpgg;
-Lcom/android/server/wifi/rtt/-$$Lambda$RttNative$nRSOFcP2WhqxmfStf2OeZAekTCY;
-Lcom/android/server/wifi/rtt/-$$Lambda$RttServiceImpl$RttServiceSynchronized$nvl34lO7P1KT2zH6q5nTdziEODs;
-Lcom/android/server/wifi/rtt/-$$Lambda$RttServiceImpl$ehyq-_xe9BYccoyltP3Gc2lh51g;
-Lcom/android/server/wifi/rtt/-$$Lambda$RttServiceImpl$q9ANpyRqIip_-lKXLzaUsSwgxFs;
-Lcom/android/server/wifi/rtt/-$$Lambda$RttServiceImpl$wP--CWXsaxeveXsy_7abZeA-Q-w;
-Lcom/android/server/wifi/rtt/RttMetrics$PerPeerTypeInfo;
-Lcom/android/server/wifi/rtt/RttMetrics;
-Lcom/android/server/wifi/rtt/RttNative;
-Lcom/android/server/wifi/rtt/RttService;
-Lcom/android/server/wifi/rtt/RttServiceImpl$1;
-Lcom/android/server/wifi/rtt/RttServiceImpl$2;
-Lcom/android/server/wifi/rtt/RttServiceImpl$3;
-Lcom/android/server/wifi/rtt/RttServiceImpl$4;
-Lcom/android/server/wifi/rtt/RttServiceImpl$RttServiceSynchronized;
-Lcom/android/server/wifi/rtt/RttServiceImpl$RttShellCommand;
-Lcom/android/server/wifi/rtt/RttServiceImpl;
-Lcom/android/server/wifi/scanner/BackgroundScanScheduler$Bucket;
-Lcom/android/server/wifi/scanner/BackgroundScanScheduler$BucketList$1;
-Lcom/android/server/wifi/scanner/BackgroundScanScheduler$BucketList;
-Lcom/android/server/wifi/scanner/BackgroundScanScheduler;
-Lcom/android/server/wifi/scanner/ChannelHelper;
-Lcom/android/server/wifi/scanner/HalWifiScannerImpl;
-Lcom/android/server/wifi/scanner/KnownBandsChannelHelper;
-Lcom/android/server/wifi/scanner/WifiScannerImpl$1;
-Lcom/android/server/wifi/scanner/WifiScannerImpl$2;
-Lcom/android/server/wifi/scanner/WifiScannerImpl$WifiScannerImplFactory;
-Lcom/android/server/wifi/scanner/WifiScannerImpl;
-Lcom/android/server/wifi/scanner/WifiScanningService;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$1;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientHandler;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ClientInfo;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$ExternalClientInfo;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestInfo;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$RequestList;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$DefaultState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$PausedState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine$StartedState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiBackgroundScanStateMachine;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$DefaultState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$HwPnoScanState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$SingleScanState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine$StartedState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiPnoScanStateMachine;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DefaultState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$DriverStartedState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$IdleState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine$ScanningState;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl$WifiSingleScanStateMachine;
-Lcom/android/server/wifi/scanner/WifiScanningServiceImpl;
-Lcom/android/server/wifi/scanner/WificondChannelHelper;
-Lcom/android/server/wifi/scanner/WificondScannerImpl;
-Lcom/android/server/wifi/util/BitMask;
-Lcom/android/server/wifi/util/ByteArrayRingBuffer;
-Lcom/android/server/wifi/util/KalmanFilter;
-Lcom/android/server/wifi/util/Matrix;
-Lcom/android/server/wifi/util/MetricsUtils$LogHistParms;
-Lcom/android/server/wifi/util/NativeUtil;
-Lcom/android/server/wifi/util/TelephonyUtil$SimAuthRequestData;
-Lcom/android/server/wifi/util/TelephonyUtil$SimAuthResponseData;
-Lcom/android/server/wifi/util/TelephonyUtil;
-Lcom/android/server/wifi/util/WifiAsyncChannel;
-Lcom/android/server/wifi/util/WifiHandler;
-Lcom/android/server/wifi/util/WifiPermissionsUtil;
-Lcom/android/server/wifi/util/WifiPermissionsWrapper;
-Lcom/android/server/wifi/util/XmlUtil$IpConfigurationXmlUtil;
-Lcom/android/server/wifi/util/XmlUtil$WifiConfigurationXmlUtil;
-Lcom/android/server/wifi/util/XmlUtil;
-Lcom/android/server/wm/-$$Lambda$01bPtngJg5AqEoOWfW3rWfV7MH4;
-Lcom/android/server/wm/-$$Lambda$2KrtdmjrY7Nagc4IRqzCk9gDuQU;
-Lcom/android/server/wm/-$$Lambda$8kACnZAYfDhQTXwuOd2shUPmkTE;
-Lcom/android/server/wm/-$$Lambda$AppWindowContainerController$BD6wMjkwgPM5dckzkeLRiPrmx9Y;
-Lcom/android/server/wm/-$$Lambda$AppWindowContainerController$mZqlV7Ety8-HHzaQXVEl4hu-8mc;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$0yxrqH9eGY2qTjH1u_BvaVrXCSA;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$7uZtakUXzuXqF_Qht5Uq7LUvubI;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$7voe_dEKk2BYMriCvPuvaznb9WQ;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$BgTlvHbVclnASz-MrvERWxyMV-A;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$D0QJUvhaQkGgoMtOmjw5foY9F8M;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$JibsaX4YnJd0ta_wiDDdSp-PjQk;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$NonAppWindowContainers$FI_O7m2qEDfIRZef3D32AxG-rcs;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$NonAppWindowContainers$nqCymC3xR9b3qaeohnnJJpSiajc;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$TPj3OjTsuIg5GTLb5nMmFqIghA4;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$fiC19lMy-d_-rvza7hhOSw6bOM8;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$hRKjZwmneu0T85LNNY6_Zcs4gKM;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$jJlRHCiYzTPceX3tUkQ_1wUz71E;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$oqhmXZMcpcvgI50swQTzosAcjac;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$qT01Aq6xt_ZOs86A1yDQe-qmPFQ;
-Lcom/android/server/wm/-$$Lambda$DisplayContent$qxt4izS31fb0LF2uo_OF9DMa7gc;
-Lcom/android/server/wm/-$$Lambda$PinnedStackController$PinnedStackControllerCallback$MdGjZinCTxKrX3GJTl1CXkAuFro;
-Lcom/android/server/wm/-$$Lambda$RootWindowContainer$3VVFoec4x74e1MMAq03gYI9kKjo;
-Lcom/android/server/wm/-$$Lambda$RootWindowContainer$Vvv8jzH2oSE9-eakZwTuKd5NpsU;
-Lcom/android/server/wm/-$$Lambda$RootWindowContainer$qT2ficAmvrvFcBdiJIGNKxJ8Z9Q;
-Lcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$lSzwjoKEGADoEFOzdEnwriAk0T4;
-Lcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$we7K92eAl3biB_bzyqbv5xCmasE;
-Lcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$xDyZdsMrcbp64p4BQmOGPvVnSWA;
-Lcom/android/server/wm/-$$Lambda$SurfaceAnimator$vdRZk66hQVbQCvVXEaQCT1kVmFc;
-Lcom/android/server/wm/-$$Lambda$TaskSnapshotController$OPdXuZQLetMnocdH6XV32JbNQ3I;
-Lcom/android/server/wm/-$$Lambda$UnknownAppVisibilityController$FYhcjOhYWVp6HX5hr3GGaPg67Gc;
-Lcom/android/server/wm/-$$Lambda$WallpaperController$6pruPGLeSJAwNl9vGfC87eso21w;
-Lcom/android/server/wm/-$$Lambda$WindowAnimator$U3Fu5_RzEyNo8Jt6zTb2ozdXiqM;
-Lcom/android/server/wm/-$$Lambda$WindowAnimator$ddXU8gK8rmDqri0OZVMNa3Y4GHk;
-Lcom/android/server/wm/-$$Lambda$WindowManagerService$5dMkMeana3BB2vTfpghrIR2jQMg;
-Lcom/android/server/wm/-$$Lambda$WindowManagerService$XZ-U3HlCFtHp_gydNmNMeRmQMCI;
-Lcom/android/server/wm/-$$Lambda$WindowManagerService$hBnABSAsqXWvQ0zKwHWE4BZ3Mc0;
-Lcom/android/server/wm/-$$Lambda$WindowManagerService$qOaUiWHWefHk1N5K-T4WND2mknQ;
-Lcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$4Hbamt-LFcbu8AoZBoOZN_LveKQ;
-Lcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$AnzDJL6vBWwhbuz7sYsAfUAzZko;
-Lcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$tJcqA51ohv9DQjcvHOarwInr01s;
-Lcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$wCevQN6hMxiB97Eay8ibpi2Xaxo;
-Lcom/android/server/wm/-$$Lambda$WindowToken$tFLHn4S6WuSXW1gp1kvT_sp7WC0;
-Lcom/android/server/wm/-$$Lambda$yACUZqn1Ak-GL14-Nu3kHUSaLX0;
-Lcom/android/server/wm/-$$Lambda$yVRF8YoeNdTa8GR1wDStVsHu8xM;
-Lcom/android/server/wm/AnimatingAppWindowTokenRegistry;
-Lcom/android/server/wm/AppTokenList;
-Lcom/android/server/wm/AppTransition$1;
-Lcom/android/server/wm/AppTransition$2;
-Lcom/android/server/wm/AppTransition;
-Lcom/android/server/wm/AppWindowContainerController$1;
-Lcom/android/server/wm/AppWindowContainerController$H;
-Lcom/android/server/wm/AppWindowContainerController;
Lcom/android/server/wm/AppWindowContainerListener;
-Lcom/android/server/wm/AppWindowToken;
-Lcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;
-Lcom/android/server/wm/BoundsAnimationController;
-Lcom/android/server/wm/BoundsAnimationTarget;
Lcom/android/server/wm/ConfigurationContainer;
Lcom/android/server/wm/ConfigurationContainerListener;
-Lcom/android/server/wm/Dimmer$SurfaceAnimatorStarter;
-Lcom/android/server/wm/Dimmer;
-Lcom/android/server/wm/DisplayContent$AboveAppWindowContainers;
-Lcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;
-Lcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;
-Lcom/android/server/wm/DisplayContent$NonAppWindowContainers;
-Lcom/android/server/wm/DisplayContent$NonMagnifiableWindowContainers;
-Lcom/android/server/wm/DisplayContent$TaskForResizePointSearchResult;
-Lcom/android/server/wm/DisplayContent$TaskStackContainers;
-Lcom/android/server/wm/DisplayContent;
-Lcom/android/server/wm/DisplayFrames;
-Lcom/android/server/wm/DisplaySettings$Entry;
-Lcom/android/server/wm/DisplaySettings;
-Lcom/android/server/wm/DisplayWindowController;
-Lcom/android/server/wm/DockedStackDividerController;
-Lcom/android/server/wm/DragDropController$1;
-Lcom/android/server/wm/DragDropController$DragHandler;
-Lcom/android/server/wm/DragDropController;
-Lcom/android/server/wm/InputConsumerImpl;
-Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;
Lcom/android/server/wm/InputMonitor;
-Lcom/android/server/wm/KeyguardDisableHandler;
-Lcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;
-Lcom/android/server/wm/PinnedStackController$PinnedStackListenerDeathHandler;
-Lcom/android/server/wm/PinnedStackController;
-Lcom/android/server/wm/PointerEventDispatcher;
-Lcom/android/server/wm/RootWindowContainer$MyHandler;
-Lcom/android/server/wm/RootWindowContainer;
-Lcom/android/server/wm/Session;
-Lcom/android/server/wm/StackWindowController$H;
+Lcom/android/server/wm/PinnedStackWindowController;
+Lcom/android/server/wm/PinnedStackWindowListener;
+Lcom/android/server/wm/RecentsAnimationController$RecentsAnimationCallbacks;
Lcom/android/server/wm/StackWindowController;
Lcom/android/server/wm/StackWindowListener;
-Lcom/android/server/wm/SurfaceAnimationRunner$AnimatorFactory;
-Lcom/android/server/wm/SurfaceAnimationRunner;
Lcom/android/server/wm/SurfaceAnimationThread;
-Lcom/android/server/wm/SurfaceAnimator$Animatable;
-Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;
-Lcom/android/server/wm/SurfaceAnimator;
-Lcom/android/server/wm/SurfaceBuilderFactory;
-Lcom/android/server/wm/Task;
-Lcom/android/server/wm/TaskPositioningController;
-Lcom/android/server/wm/TaskSnapshotCache;
-Lcom/android/server/wm/TaskSnapshotController;
-Lcom/android/server/wm/TaskSnapshotLoader;
-Lcom/android/server/wm/TaskSnapshotPersister$1;
-Lcom/android/server/wm/TaskSnapshotPersister$DirectoryResolver;
-Lcom/android/server/wm/TaskSnapshotPersister$RemoveObsoleteFilesQueueItem;
-Lcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;
-Lcom/android/server/wm/TaskSnapshotPersister;
-Lcom/android/server/wm/TaskStack;
-Lcom/android/server/wm/TaskTapPointerEventListener;
-Lcom/android/server/wm/TaskWindowContainerController$H;
-Lcom/android/server/wm/TaskWindowContainerController;
Lcom/android/server/wm/TaskWindowContainerListener;
-Lcom/android/server/wm/TransactionFactory;
-Lcom/android/server/wm/UnknownAppVisibilityController;
-Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;
-Lcom/android/server/wm/WallpaperController;
-Lcom/android/server/wm/WallpaperVisibilityListeners;
-Lcom/android/server/wm/WallpaperWindowToken;
-Lcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;
-Lcom/android/server/wm/WindowAnimator;
-Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;
-Lcom/android/server/wm/WindowContainer;
Lcom/android/server/wm/WindowContainerController;
Lcom/android/server/wm/WindowContainerListener;
-Lcom/android/server/wm/WindowHashMap;
-Lcom/android/server/wm/WindowList;
-Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener;
-Lcom/android/server/wm/WindowManagerInternal$IDragDropCallback;
-Lcom/android/server/wm/WindowManagerInternal$OnHardKeyboardStatusChangeListener;
Lcom/android/server/wm/WindowManagerInternal;
-Lcom/android/server/wm/WindowManagerService$1;
-Lcom/android/server/wm/WindowManagerService$2;
-Lcom/android/server/wm/WindowManagerService$3;
-Lcom/android/server/wm/WindowManagerService$4;
-Lcom/android/server/wm/WindowManagerService$5;
-Lcom/android/server/wm/WindowManagerService$6;
-Lcom/android/server/wm/WindowManagerService$7;
-Lcom/android/server/wm/WindowManagerService$9;
-Lcom/android/server/wm/WindowManagerService$AppFreezeListener;
-Lcom/android/server/wm/WindowManagerService$H;
-Lcom/android/server/wm/WindowManagerService$LocalService;
-Lcom/android/server/wm/WindowManagerService$MousePositionTracker;
-Lcom/android/server/wm/WindowManagerService$RotationWatcher;
-Lcom/android/server/wm/WindowManagerService$SettingsObserver;
Lcom/android/server/wm/WindowManagerService;
-Lcom/android/server/wm/WindowManagerThreadPriorityBooster;
-Lcom/android/server/wm/WindowState$1;
-Lcom/android/server/wm/WindowState$2;
-Lcom/android/server/wm/WindowState$DeathRecipient;
-Lcom/android/server/wm/WindowState$PowerManagerWrapper;
-Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;
-Lcom/android/server/wm/WindowState$WindowId;
-Lcom/android/server/wm/WindowState;
-Lcom/android/server/wm/WindowStateAnimator;
-Lcom/android/server/wm/WindowSurfaceController;
-Lcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;
-Lcom/android/server/wm/WindowSurfacePlacer;
-Lcom/android/server/wm/WindowToken;
-Lcom/android/server/wm/WindowTracing;
-Lcom/android/server/wm/utils/RotationCache$RotationDependentComputation;
-Lcom/android/server/wm/utils/RotationCache;
-Lcom/android/server/wm/utils/WmDisplayCutout;
-Lcom/android/timezone/distro/DistroException;
-Lcom/android/timezone/distro/installer/TimeZoneDistroInstaller;
+PLandroid/hardware/authsecret/V1_0/IAuthSecret;->getService()Landroid/hardware/authsecret/V1_0/IAuthSecret;
+PLandroid/hardware/authsecret/V1_0/IAuthSecret;->getService(Ljava/lang/String;)Landroid/hardware/authsecret/V1_0/IAuthSecret;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->authenticate(JI)I
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->cancel()I
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->enumerate()I
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->getAuthenticatorId()J
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->setActiveGroup(ILjava/lang/String;)I
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint$Proxy;->setNotify(Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback;)J
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getService()Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;->getService(Ljava/lang/String;)Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback$Stub;-><init>()V
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprintClientCallback$Stub;->onTransact(ILandroid/os/HwParcel;Landroid/os/HwParcel;I)V
+PLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs$Proxy;->hasWideColorDisplay()Landroid/hardware/configstore/V1_0/OptionalBool;
+PLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;
+PLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->getService()Landroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;
+PLandroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;->getService(Ljava/lang/String;)Landroid/hardware/configstore/V1_0/ISurfaceFlingerConfigs;
+PLandroid/hardware/configstore/V1_0/OptionalBool;-><init>()V
+PLandroid/hardware/configstore/V1_0/OptionalBool;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/configstore/V1_0/OptionalBool;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/health/V1_0/HealthInfo;-><init>()V
+PLandroid/hardware/health/V2_0/DiskStats;-><init>()V
+PLandroid/hardware/health/V2_0/HealthInfo;-><init>()V
+PLandroid/hardware/health/V2_0/IHealth$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/health/V2_0/IHealth$Proxy;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/health/V2_0/IHealth$Proxy;->equals(Ljava/lang/Object;)Z
+PLandroid/hardware/health/V2_0/IHealth$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/health/V2_0/IHealth$Proxy;->registerCallback(Landroid/hardware/health/V2_0/IHealthInfoCallback;)I
+PLandroid/hardware/health/V2_0/IHealth$Proxy;->update()I
+PLandroid/hardware/health/V2_0/IHealth;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/health/V2_0/IHealth;
+PLandroid/hardware/health/V2_0/IHealth;->getService(Ljava/lang/String;Z)Landroid/hardware/health/V2_0/IHealth;
+PLandroid/hardware/health/V2_0/IHealthInfoCallback$Stub;-><init>()V
+PLandroid/hardware/health/V2_0/IHealthInfoCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/health/V2_0/StorageAttribute;-><init>()V
+PLandroid/hardware/health/V2_0/StorageInfo;-><init>()V
+PLandroid/hardware/oemlock/V1_0/IOemLock$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/oemlock/V1_0/IOemLock$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/oemlock/V1_0/IOemLock$Proxy;->isOemUnlockAllowedByCarrier(Landroid/hardware/oemlock/V1_0/IOemLock$isOemUnlockAllowedByCarrierCallback;)V
+PLandroid/hardware/oemlock/V1_0/IOemLock;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/oemlock/V1_0/IOemLock;
+PLandroid/hardware/oemlock/V1_0/IOemLock;->getService()Landroid/hardware/oemlock/V1_0/IOemLock;
+PLandroid/hardware/oemlock/V1_0/IOemLock;->getService(Ljava/lang/String;)Landroid/hardware/oemlock/V1_0/IOemLock;
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;->linkToDeath(Landroid/os/IHwBinder$DeathRecipient;J)Z
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;->queryPortStatus()V
+PLandroid/hardware/usb/V1_0/IUsb$Proxy;->setCallback(Landroid/hardware/usb/V1_0/IUsbCallback;)V
+PLandroid/hardware/usb/V1_0/IUsb;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/usb/V1_0/IUsb;
+PLandroid/hardware/usb/V1_0/IUsb;->getService()Landroid/hardware/usb/V1_0/IUsb;
+PLandroid/hardware/usb/V1_0/IUsb;->getService(Ljava/lang/String;)Landroid/hardware/usb/V1_0/IUsb;
+PLandroid/hardware/usb/V1_0/PortStatus;-><init>()V
+PLandroid/hardware/usb/V1_1/IUsbCallback$Stub;-><init>()V
+PLandroid/hardware/usb/V1_1/IUsbCallback$Stub;->asBinder()Landroid/os/IHwBinder;
+PLandroid/hardware/usb/V1_1/IUsbCallback$Stub;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/usb/V1_1/PortStatus_1_1;-><init>()V
+PLandroid/hardware/usb/V1_1/PortStatus_1_1;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/weaver/V1_0/IWeaver$Proxy;-><init>(Landroid/os/IHwBinder;)V
+PLandroid/hardware/weaver/V1_0/IWeaver$Proxy;->getConfig(Landroid/hardware/weaver/V1_0/IWeaver$getConfigCallback;)V
+PLandroid/hardware/weaver/V1_0/IWeaver$Proxy;->interfaceChain()Ljava/util/ArrayList;
+PLandroid/hardware/weaver/V1_0/IWeaver$Proxy;->read(ILjava/util/ArrayList;Landroid/hardware/weaver/V1_0/IWeaver$readCallback;)V
+PLandroid/hardware/weaver/V1_0/IWeaver;->asInterface(Landroid/os/IHwBinder;)Landroid/hardware/weaver/V1_0/IWeaver;
+PLandroid/hardware/weaver/V1_0/IWeaver;->getService()Landroid/hardware/weaver/V1_0/IWeaver;
+PLandroid/hardware/weaver/V1_0/IWeaver;->getService(Ljava/lang/String;)Landroid/hardware/weaver/V1_0/IWeaver;
+PLandroid/hardware/weaver/V1_0/WeaverConfig;-><init>()V
+PLandroid/hardware/weaver/V1_0/WeaverConfig;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/weaver/V1_0/WeaverConfig;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/hardware/weaver/V1_0/WeaverReadResponse;-><init>()V
+PLandroid/hardware/weaver/V1_0/WeaverReadResponse;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
+PLandroid/hardware/weaver/V1_0/WeaverReadResponse;->readFromParcel(Landroid/os/HwParcel;)V
+PLandroid/media/IMediaExtractorUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+PLandroid/media/IMediaExtractorUpdateService$Stub$Proxy;->loadPlugins(Ljava/lang/String;)V
+PLandroid/media/IMediaExtractorUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaExtractorUpdateService;
+PLandroid/net/apf/-$$Lambda$ApfFilter$UV1wDVoVlbcxpr8zevj_aMFtUGw;-><init>()V
+PLandroid/net/apf/-$$Lambda$ApfFilter$UV1wDVoVlbcxpr8zevj_aMFtUGw;->applyAsInt(Ljava/lang/Object;)I
+PLandroid/net/apf/ApfCapabilities;-><init>(III)V
+PLandroid/net/apf/ApfCapabilities;->hasDataAccess()Z
+PLandroid/net/apf/ApfCapabilities;->toString()Ljava/lang/String;
+PLandroid/net/apf/ApfFilter$1;-><init>(Landroid/net/apf/ApfFilter;)V
+PLandroid/net/apf/ApfFilter$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLandroid/net/apf/ApfFilter$ApfConfiguration;-><init>()V
+PLandroid/net/apf/ApfFilter$Counter;-><init>(Ljava/lang/String;I)V
+PLandroid/net/apf/ApfFilter$ProcessRaResult;-><init>(Ljava/lang/String;I)V
+PLandroid/net/apf/ApfFilter$ProcessRaResult;->values()[Landroid/net/apf/ApfFilter$ProcessRaResult;
+PLandroid/net/apf/ApfFilter$Ra;-><init>(Landroid/net/apf/ApfFilter;[BI)V
+PLandroid/net/apf/ApfFilter$Ra;->IPv6AddresstoString(I)Ljava/lang/String;
+PLandroid/net/apf/ApfFilter$Ra;->addNonLifetime(III)I
+PLandroid/net/apf/ApfFilter$Ra;->addNonLifetimeU32(I)I
+PLandroid/net/apf/ApfFilter$Ra;->currentLifetime()J
+PLandroid/net/apf/ApfFilter$Ra;->generateFilterLocked(Landroid/net/apf/ApfGenerator;)J
+PLandroid/net/apf/ApfFilter$Ra;->isExpired()Z
+PLandroid/net/apf/ApfFilter$Ra;->matches([BI)Z
+PLandroid/net/apf/ApfFilter$Ra;->minLifetime([BI)J
+PLandroid/net/apf/ApfFilter$Ra;->prefixOptionToString(Ljava/lang/StringBuffer;I)V
+PLandroid/net/apf/ApfFilter$Ra;->rdnssOptionToString(Ljava/lang/StringBuffer;I)V
+PLandroid/net/apf/ApfFilter$Ra;->toString()Ljava/lang/String;
+PLandroid/net/apf/ApfFilter$ReceiveThread;-><init>(Landroid/net/apf/ApfFilter;Ljava/io/FileDescriptor;)V
+PLandroid/net/apf/ApfFilter$ReceiveThread;->halt()V
+PLandroid/net/apf/ApfFilter$ReceiveThread;->logStats()V
+PLandroid/net/apf/ApfFilter$ReceiveThread;->run()V
+PLandroid/net/apf/ApfFilter$ReceiveThread;->updateStats(Landroid/net/apf/ApfFilter$ProcessRaResult;)V
+PLandroid/net/apf/ApfFilter;-><init>(Landroid/content/Context;Landroid/net/apf/ApfFilter$ApfConfiguration;Landroid/net/util/InterfaceParams;Landroid/net/ip/IpClient$Callback;Landroid/net/metrics/IpConnectivityLog;)V
+PLandroid/net/apf/ApfFilter;->access$000(Landroid/net/apf/ApfFilter;Ljava/lang/String;)V
+PLandroid/net/apf/ApfFilter;->access$100(Landroid/net/apf/ApfFilter;)Landroid/net/apf/ApfCapabilities;
+PLandroid/net/apf/ApfFilter;->access$200(Landroid/net/apf/ApfFilter;)I
+PLandroid/net/apf/ApfFilter;->access$300(Landroid/net/apf/ApfFilter;)I
+PLandroid/net/apf/ApfFilter;->access$400(Landroid/net/apf/ApfFilter;)Landroid/net/metrics/IpConnectivityLog;
+PLandroid/net/apf/ApfFilter;->access$500(Landroid/net/apf/ApfFilter;J)V
+PLandroid/net/apf/ApfFilter;->access$600(Landroid/net/apf/ApfFilter;)J
+PLandroid/net/apf/ApfFilter;->access$700(Landroid/net/apf/ApfFilter;Landroid/net/apf/ApfGenerator;Landroid/net/apf/ApfFilter$Counter;)V
+PLandroid/net/apf/ApfFilter;->access$800(Landroid/net/apf/ApfFilter;)Ljava/lang/String;
+PLandroid/net/apf/ApfFilter;->currentTimeSeconds()J
+PLandroid/net/apf/ApfFilter;->emitEpilogue(Landroid/net/apf/ApfGenerator;)V
+PLandroid/net/apf/ApfFilter;->emitPrologueLocked()Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfFilter;->filterEthTypeBlackList([I)[I
+PLandroid/net/apf/ApfFilter;->findIPv4LinkAddress(Landroid/net/LinkProperties;)Landroid/net/LinkAddress;
+PLandroid/net/apf/ApfFilter;->generateArpFilterLocked(Landroid/net/apf/ApfGenerator;)V
+PLandroid/net/apf/ApfFilter;->generateIPv4FilterLocked(Landroid/net/apf/ApfGenerator;)V
+PLandroid/net/apf/ApfFilter;->generateIPv6FilterLocked(Landroid/net/apf/ApfGenerator;)V
+PLandroid/net/apf/ApfFilter;->getUniqueNumberLocked()J
+PLandroid/net/apf/ApfFilter;->installNewProgramLocked()V
+PLandroid/net/apf/ApfFilter;->ipv4BroadcastAddress([BI)I
+PLandroid/net/apf/ApfFilter;->lambda$UV1wDVoVlbcxpr8zevj_aMFtUGw(Ljava/lang/Integer;)I
+PLandroid/net/apf/ApfFilter;->log(Ljava/lang/String;)V
+PLandroid/net/apf/ApfFilter;->logApfProgramEventLocked(J)V
+PLandroid/net/apf/ApfFilter;->maybeCreate(Landroid/content/Context;Landroid/net/apf/ApfFilter$ApfConfiguration;Landroid/net/util/InterfaceParams;Landroid/net/ip/IpClient$Callback;)Landroid/net/apf/ApfFilter;
+PLandroid/net/apf/ApfFilter;->maybeSetCounter(Landroid/net/apf/ApfGenerator;Landroid/net/apf/ApfFilter$Counter;)V
+PLandroid/net/apf/ApfFilter;->maybeStartFilter()V
+PLandroid/net/apf/ApfFilter;->processRa([BI)Landroid/net/apf/ApfFilter$ProcessRaResult;
+PLandroid/net/apf/ApfFilter;->purgeExpiredRasLocked()V
+PLandroid/net/apf/ApfFilter;->setDozeMode(Z)V
+PLandroid/net/apf/ApfFilter;->setLinkProperties(Landroid/net/LinkProperties;)V
+PLandroid/net/apf/ApfFilter;->shouldInstallnewProgram()Z
+PLandroid/net/apf/ApfFilter;->shutdown()V
+PLandroid/net/apf/ApfGenerator$ExtendedOpcodes;-><init>(Ljava/lang/String;II)V
+PLandroid/net/apf/ApfGenerator$Instruction;-><init>(Landroid/net/apf/ApfGenerator;Landroid/net/apf/ApfGenerator$Opcodes;)V
+PLandroid/net/apf/ApfGenerator$Instruction;->generate([B)V
+PLandroid/net/apf/ApfGenerator$Instruction;->generateImmSizeField()B
+PLandroid/net/apf/ApfGenerator$Instruction;->generateInstructionByte()B
+PLandroid/net/apf/ApfGenerator$Instruction;->setCompareBytes([B)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setImm(IZ)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setLabel(Ljava/lang/String;)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setSignedImm(I)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setTargetLabel(Ljava/lang/String;)V
+PLandroid/net/apf/ApfGenerator$Instruction;->setUnsignedImm(I)V
+PLandroid/net/apf/ApfGenerator$Opcodes;-><init>(Ljava/lang/String;II)V
+PLandroid/net/apf/ApfGenerator$Register;-><init>(Ljava/lang/String;II)V
+PLandroid/net/apf/ApfGenerator;-><init>(I)V
+PLandroid/net/apf/ApfGenerator;->access$000(Landroid/net/apf/ApfGenerator;)Ljava/util/HashMap;
+PLandroid/net/apf/ApfGenerator;->access$100(Landroid/net/apf/ApfGenerator;)Landroid/net/apf/ApfGenerator$Instruction;
+PLandroid/net/apf/ApfGenerator;->access$200(Landroid/net/apf/ApfGenerator;)Landroid/net/apf/ApfGenerator$Instruction;
+PLandroid/net/apf/ApfGenerator;->addAddR1()Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addAnd(I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJump(Ljava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfBytesNotEqual(Landroid/net/apf/ApfGenerator$Register;[BLjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0AnyBitsSet(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0Equals(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0GreaterThan(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0LessThan(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addJumpIfR0NotEquals(ILjava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoad16(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoad16Indexed(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoad32(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoad8(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoadFromMemory(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->addLoadImmediate(Landroid/net/apf/ApfGenerator$Register;I)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->defineLabel(Ljava/lang/String;)Landroid/net/apf/ApfGenerator;
+PLandroid/net/apf/ApfGenerator;->programLengthOverEstimate()I
+PLandroid/net/apf/ApfGenerator;->requireApfVersion(I)V
+PLandroid/net/apf/ApfGenerator;->supportsVersion(I)Z
+PLandroid/net/dhcp/DhcpAckPacket;-><init>(ISZLjava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;[B)V
+PLandroid/net/dhcp/DhcpAckPacket;->toString()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpClient$ConfiguringInterfaceState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$ConfiguringInterfaceState;->enter()V
+PLandroid/net/dhcp/DhcpClient$ConfiguringInterfaceState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$DhcpBoundState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpBoundState;->enter()V
+PLandroid/net/dhcp/DhcpClient$DhcpBoundState;->exit()V
+PLandroid/net/dhcp/DhcpClient$DhcpBoundState;->logTimeToBoundState()V
+PLandroid/net/dhcp/DhcpClient$DhcpBoundState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$DhcpHaveLeaseState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpHaveLeaseState;->exit()V
+PLandroid/net/dhcp/DhcpClient$DhcpHaveLeaseState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$DhcpInitRebootState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpInitState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpInitState;->enter()V
+PLandroid/net/dhcp/DhcpClient$DhcpInitState;->receivePacket(Landroid/net/dhcp/DhcpPacket;)V
+PLandroid/net/dhcp/DhcpClient$DhcpInitState;->sendPacket()Z
+PLandroid/net/dhcp/DhcpClient$DhcpReacquiringState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpReacquiringState;->enter()V
+PLandroid/net/dhcp/DhcpClient$DhcpReacquiringState;->receivePacket(Landroid/net/dhcp/DhcpPacket;)V
+PLandroid/net/dhcp/DhcpClient$DhcpReacquiringState;->sendPacket()Z
+PLandroid/net/dhcp/DhcpClient$DhcpRebindingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRebindingState;->enter()V
+PLandroid/net/dhcp/DhcpClient$DhcpRebindingState;->packetDestination()Ljava/net/Inet4Address;
+PLandroid/net/dhcp/DhcpClient$DhcpRebootingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRenewingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRenewingState;->packetDestination()Ljava/net/Inet4Address;
+PLandroid/net/dhcp/DhcpClient$DhcpRenewingState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$DhcpRequestingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRequestingState;->receivePacket(Landroid/net/dhcp/DhcpPacket;)V
+PLandroid/net/dhcp/DhcpClient$DhcpRequestingState;->sendPacket()Z
+PLandroid/net/dhcp/DhcpClient$DhcpSelectingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$DhcpState;->enter()V
+PLandroid/net/dhcp/DhcpClient$DhcpState;->exit()V
+PLandroid/net/dhcp/DhcpClient$DhcpState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$LoggingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$LoggingState;->enter()V
+PLandroid/net/dhcp/DhcpClient$LoggingState;->exit()V
+PLandroid/net/dhcp/DhcpClient$LoggingState;->getName()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpClient$LoggingState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->enter()V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->exit()V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->initTimer()V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->jitterTimer(I)I
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->maybeInitTimeout()V
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$PacketRetransmittingState;->scheduleKick()V
+PLandroid/net/dhcp/DhcpClient$ReceiveThread;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$ReceiveThread;->halt()V
+PLandroid/net/dhcp/DhcpClient$ReceiveThread;->run()V
+PLandroid/net/dhcp/DhcpClient$StoppedState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$StoppedState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$WaitBeforeOtherState;-><init>(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient$WaitBeforeOtherState;->enter()V
+PLandroid/net/dhcp/DhcpClient$WaitBeforeOtherState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/dhcp/DhcpClient$WaitBeforeRenewalState;-><init>(Landroid/net/dhcp/DhcpClient;Lcom/android/internal/util/State;)V
+PLandroid/net/dhcp/DhcpClient$WaitBeforeStartState;-><init>(Landroid/net/dhcp/DhcpClient;Lcom/android/internal/util/State;)V
+PLandroid/net/dhcp/DhcpClient;-><init>(Landroid/content/Context;Lcom/android/internal/util/StateMachine;Ljava/lang/String;)V
+PLandroid/net/dhcp/DhcpClient;->acceptDhcpResults(Landroid/net/DhcpResults;Ljava/lang/String;)V
+PLandroid/net/dhcp/DhcpClient;->access$000(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient;->access$100(Landroid/net/dhcp/DhcpClient;)Ljava/io/FileDescriptor;
+PLandroid/net/dhcp/DhcpClient;->access$1000(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->access$1100(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->access$1200(Landroid/net/dhcp/DhcpClient;)Landroid/net/dhcp/DhcpClient$ReceiveThread;
+PLandroid/net/dhcp/DhcpClient;->access$1202(Landroid/net/dhcp/DhcpClient;Landroid/net/dhcp/DhcpClient$ReceiveThread;)Landroid/net/dhcp/DhcpClient$ReceiveThread;
+PLandroid/net/dhcp/DhcpClient;->access$1400(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->access$1500(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->access$1600(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->access$1700(Landroid/net/dhcp/DhcpClient;)Ljava/util/Random;
+PLandroid/net/dhcp/DhcpClient;->access$1800(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient;->access$1900(Landroid/net/dhcp/DhcpClient;)J
+PLandroid/net/dhcp/DhcpClient;->access$1902(Landroid/net/dhcp/DhcpClient;J)J
+PLandroid/net/dhcp/DhcpClient;->access$2000(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->access$2100(Landroid/net/dhcp/DhcpClient;)Landroid/net/DhcpResults;
+PLandroid/net/dhcp/DhcpClient;->access$2102(Landroid/net/dhcp/DhcpClient;Landroid/net/DhcpResults;)Landroid/net/DhcpResults;
+PLandroid/net/dhcp/DhcpClient;->access$2200(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->access$2300(Landroid/net/dhcp/DhcpClient;Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpClient;->access$2400(Landroid/net/dhcp/DhcpClient;Landroid/net/DhcpResults;Ljava/lang/String;)V
+PLandroid/net/dhcp/DhcpClient;->access$2500(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->access$2600(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->access$2700(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->access$2800(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->access$2900(Landroid/net/dhcp/DhcpClient;)Landroid/net/DhcpResults;
+PLandroid/net/dhcp/DhcpClient;->access$300(Landroid/net/dhcp/DhcpClient;Ljava/lang/String;I)V
+PLandroid/net/dhcp/DhcpClient;->access$3000(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->access$3100(Landroid/net/dhcp/DhcpClient;Ljava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpClient;->access$3200(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient;->access$3300(Landroid/net/dhcp/DhcpClient;)J
+PLandroid/net/dhcp/DhcpClient;->access$3302(Landroid/net/dhcp/DhcpClient;J)J
+PLandroid/net/dhcp/DhcpClient;->access$3400(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->access$3600(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->access$3700(Landroid/net/dhcp/DhcpClient;)Ljava/io/FileDescriptor;
+PLandroid/net/dhcp/DhcpClient;->access$3800(Ljava/io/FileDescriptor;)V
+PLandroid/net/dhcp/DhcpClient;->access$3900(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->access$500(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/StateMachine;
+PLandroid/net/dhcp/DhcpClient;->access$600(Landroid/net/dhcp/DhcpClient;)Z
+PLandroid/net/dhcp/DhcpClient;->access$700(Landroid/net/dhcp/DhcpClient;)Lcom/android/internal/util/State;
+PLandroid/net/dhcp/DhcpClient;->access$900(Landroid/net/dhcp/DhcpClient;)V
+PLandroid/net/dhcp/DhcpClient;->clearDhcpState()V
+PLandroid/net/dhcp/DhcpClient;->closeQuietly(Ljava/io/FileDescriptor;)V
+PLandroid/net/dhcp/DhcpClient;->closeSockets()V
+PLandroid/net/dhcp/DhcpClient;->connectUdpSock(Ljava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpClient;->doQuit()V
+PLandroid/net/dhcp/DhcpClient;->getSecs()S
+PLandroid/net/dhcp/DhcpClient;->initInterface()Z
+PLandroid/net/dhcp/DhcpClient;->initPacketSocket()Z
+PLandroid/net/dhcp/DhcpClient;->initSockets()Z
+PLandroid/net/dhcp/DhcpClient;->initUdpSocket()Z
+PLandroid/net/dhcp/DhcpClient;->isValidPacket(Landroid/net/dhcp/DhcpPacket;)Z
+PLandroid/net/dhcp/DhcpClient;->logState(Ljava/lang/String;I)V
+PLandroid/net/dhcp/DhcpClient;->makeDhcpClient(Landroid/content/Context;Lcom/android/internal/util/StateMachine;Landroid/net/util/InterfaceParams;)Landroid/net/dhcp/DhcpClient;
+PLandroid/net/dhcp/DhcpClient;->makeWakeupMessage(Ljava/lang/String;I)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/dhcp/DhcpClient;->notifySuccess()V
+PLandroid/net/dhcp/DhcpClient;->onQuitting()V
+PLandroid/net/dhcp/DhcpClient;->registerForPreDhcpNotification()V
+PLandroid/net/dhcp/DhcpClient;->scheduleLeaseTimers()V
+PLandroid/net/dhcp/DhcpClient;->sendDiscoverPacket()Z
+PLandroid/net/dhcp/DhcpClient;->sendRequestPacket(Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpClient;->setDhcpLeaseExpiry(Landroid/net/dhcp/DhcpPacket;)V
+PLandroid/net/dhcp/DhcpClient;->startNewTransaction()V
+PLandroid/net/dhcp/DhcpClient;->transmitPacket(Ljava/nio/ByteBuffer;Ljava/lang/String;ILjava/net/Inet4Address;)Z
+PLandroid/net/dhcp/DhcpDiscoverPacket;-><init>(IS[BZ)V
+PLandroid/net/dhcp/DhcpDiscoverPacket;->buildPacket(ISS)Ljava/nio/ByteBuffer;
+PLandroid/net/dhcp/DhcpDiscoverPacket;->finishPacket(Ljava/nio/ByteBuffer;)V
+PLandroid/net/dhcp/DhcpDiscoverPacket;->toString()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpOfferPacket;-><init>(ISZLjava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;[B)V
+PLandroid/net/dhcp/DhcpOfferPacket;->toString()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;-><init>(ISLjava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;Ljava/net/Inet4Address;[BZ)V
+PLandroid/net/dhcp/DhcpPacket;->addCommonClientTlvs(Ljava/nio/ByteBuffer;)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;BB)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;BLjava/lang/Short;)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;BLjava/lang/String;)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;BLjava/net/Inet4Address;)V
+PLandroid/net/dhcp/DhcpPacket;->addTlv(Ljava/nio/ByteBuffer;B[B)V
+PLandroid/net/dhcp/DhcpPacket;->addTlvEnd(Ljava/nio/ByteBuffer;)V
+PLandroid/net/dhcp/DhcpPacket;->buildDiscoverPacket(IIS[BZ[B)Ljava/nio/ByteBuffer;
+PLandroid/net/dhcp/DhcpPacket;->buildRequestPacket(IISLjava/net/Inet4Address;Z[BLjava/net/Inet4Address;Ljava/net/Inet4Address;[BLjava/lang/String;)Ljava/nio/ByteBuffer;
+PLandroid/net/dhcp/DhcpPacket;->checksum(Ljava/nio/ByteBuffer;III)I
+PLandroid/net/dhcp/DhcpPacket;->decodeFullPacket(Ljava/nio/ByteBuffer;I)Landroid/net/dhcp/DhcpPacket;
+PLandroid/net/dhcp/DhcpPacket;->decodeFullPacket([BII)Landroid/net/dhcp/DhcpPacket;
+PLandroid/net/dhcp/DhcpPacket;->fillInPacket(ILjava/net/Inet4Address;Ljava/net/Inet4Address;SSLjava/nio/ByteBuffer;BZ)V
+PLandroid/net/dhcp/DhcpPacket;->getClientId()[B
+PLandroid/net/dhcp/DhcpPacket;->getClientMac()[B
+PLandroid/net/dhcp/DhcpPacket;->getHostname()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;->getLeaseTimeMillis()J
+PLandroid/net/dhcp/DhcpPacket;->getTransactionId()I
+PLandroid/net/dhcp/DhcpPacket;->getVendorId()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;->intAbs(S)I
+PLandroid/net/dhcp/DhcpPacket;->isPacketToOrFromClient(SS)Z
+PLandroid/net/dhcp/DhcpPacket;->macToString([B)Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;->readAsciiString(Ljava/nio/ByteBuffer;IZ)Ljava/lang/String;
+PLandroid/net/dhcp/DhcpPacket;->readIpAddress(Ljava/nio/ByteBuffer;)Ljava/net/Inet4Address;
+PLandroid/net/dhcp/DhcpPacket;->toDhcpResults()Landroid/net/DhcpResults;
+PLandroid/net/dhcp/DhcpPacket;->toString()Ljava/lang/String;
+PLandroid/net/dhcp/DhcpRequestPacket;-><init>(ISLjava/net/Inet4Address;[BZ)V
+PLandroid/net/dhcp/DhcpRequestPacket;->buildPacket(ISS)Ljava/nio/ByteBuffer;
+PLandroid/net/dhcp/DhcpRequestPacket;->finishPacket(Ljava/nio/ByteBuffer;)V
+PLandroid/net/dhcp/DhcpRequestPacket;->toString()Ljava/lang/String;
+PLandroid/net/dns/ResolvUtil;->blockingResolveAllLocally(Landroid/net/Network;Ljava/lang/String;)[Ljava/net/InetAddress;
+PLandroid/net/dns/ResolvUtil;->blockingResolveAllLocally(Landroid/net/Network;Ljava/lang/String;I)[Ljava/net/InetAddress;
+PLandroid/net/dns/ResolvUtil;->getNetworkWithUseLocalNameserversFlag(Landroid/net/Network;)Landroid/net/Network;
+PLandroid/net/ip/-$$Lambda$IpClient$RunningState$62CnAIrZ9p4JQ9DgmmpMjXifdaw;-><init>(Landroid/net/ip/IpClient$RunningState;)V
+PLandroid/net/ip/-$$Lambda$IpReachabilityMonitor$5Sg30oRgfU2r5ogQj53SRYnnFiQ;-><init>(Landroid/net/ip/IpReachabilityMonitor;)V
+PLandroid/net/ip/-$$Lambda$IpReachabilityMonitor$5Sg30oRgfU2r5ogQj53SRYnnFiQ;->accept(Landroid/net/ip/IpNeighborMonitor$NeighborEvent;)V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;-><init>(Landroid/net/ip/ConnectivityPacketTracker;Landroid/os/Handler;Landroid/net/util/InterfaceParams;)V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->addLogEntry(Ljava/lang/String;)V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->createFd()Ljava/io/FileDescriptor;
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->handlePacket([BI)V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->onStart()V
+PLandroid/net/ip/ConnectivityPacketTracker$PacketListener;->onStop()V
+PLandroid/net/ip/ConnectivityPacketTracker;-><init>(Landroid/os/Handler;Landroid/net/util/InterfaceParams;Landroid/util/LocalLog;)V
+PLandroid/net/ip/ConnectivityPacketTracker;->access$000(Landroid/net/ip/ConnectivityPacketTracker;)Ljava/lang/String;
+PLandroid/net/ip/ConnectivityPacketTracker;->access$100(Landroid/net/ip/ConnectivityPacketTracker;)Landroid/util/LocalLog;
+PLandroid/net/ip/ConnectivityPacketTracker;->access$200(Landroid/net/ip/ConnectivityPacketTracker;)Z
+PLandroid/net/ip/ConnectivityPacketTracker;->start(Ljava/lang/String;)V
+PLandroid/net/ip/ConnectivityPacketTracker;->stop()V
+PLandroid/net/ip/InterfaceController;-><init>(Ljava/lang/String;Landroid/os/INetworkManagementService;Landroid/net/INetd;Landroid/net/util/SharedLog;)V
+PLandroid/net/ip/InterfaceController;->clearAllAddresses()Z
+PLandroid/net/ip/InterfaceController;->clearIPv4Address()Z
+PLandroid/net/ip/InterfaceController;->disableIPv6()Z
+PLandroid/net/ip/InterfaceController;->enableIPv6()Z
+PLandroid/net/ip/InterfaceController;->setIPv4Address(Landroid/net/LinkAddress;)Z
+PLandroid/net/ip/InterfaceController;->setIPv6AddrGenModeIfSupported(I)Z
+PLandroid/net/ip/InterfaceController;->setIPv6PrivacyExtensions(Z)Z
+PLandroid/net/ip/IpClient$2;-><init>(Landroid/net/ip/IpClient;)V
+PLandroid/net/ip/IpClient$2;->update()V
+PLandroid/net/ip/IpClient$3;-><init>(Landroid/net/ip/IpClient;Ljava/lang/String;Lcom/android/server/net/NetlinkTracker$Callback;)V
+PLandroid/net/ip/IpClient$4;-><init>(Landroid/net/ip/IpClient;)V
+PLandroid/net/ip/IpClient$Callback;-><init>()V
+PLandroid/net/ip/IpClient$Dependencies;-><init>()V
+PLandroid/net/ip/IpClient$Dependencies;->getInterfaceParams(Ljava/lang/String;)Landroid/net/util/InterfaceParams;
+PLandroid/net/ip/IpClient$Dependencies;->getNMS()Landroid/os/INetworkManagementService;
+PLandroid/net/ip/IpClient$Dependencies;->getNetd()Landroid/net/INetd;
+PLandroid/net/ip/IpClient$InitialConfiguration;->copy(Landroid/net/ip/IpClient$InitialConfiguration;)Landroid/net/ip/IpClient$InitialConfiguration;
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;-><init>(Landroid/net/ip/IpClient;Landroid/net/ip/IpClient$Callback;)V
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;->installPacketFilter([B)V
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;->log(Ljava/lang/String;)V
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;->onLinkPropertiesChange(Landroid/net/LinkProperties;)V
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;->onNewDhcpResults(Landroid/net/DhcpResults;)V
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;->onPostDhcpAction()V
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;->onPreDhcpAction()V
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;->onProvisioningSuccess(Landroid/net/LinkProperties;)V
+PLandroid/net/ip/IpClient$LoggingCallbackWrapper;->setNeighborDiscoveryOffload(Z)V
+PLandroid/net/ip/IpClient$MessageHandlingLogger;-><init>()V
+PLandroid/net/ip/IpClient$MessageHandlingLogger;-><init>(Landroid/net/ip/IpClient$1;)V
+PLandroid/net/ip/IpClient$MessageHandlingLogger;->handled(Lcom/android/internal/util/State;Lcom/android/internal/util/IState;)V
+PLandroid/net/ip/IpClient$MessageHandlingLogger;->reset()V
+PLandroid/net/ip/IpClient$MessageHandlingLogger;->toString()Ljava/lang/String;
+PLandroid/net/ip/IpClient$ProvisioningConfiguration$Builder;-><init>()V
+PLandroid/net/ip/IpClient$ProvisioningConfiguration$Builder;->build()Landroid/net/ip/IpClient$ProvisioningConfiguration;
+PLandroid/net/ip/IpClient$ProvisioningConfiguration$Builder;->withApfCapabilities(Landroid/net/apf/ApfCapabilities;)Landroid/net/ip/IpClient$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpClient$ProvisioningConfiguration$Builder;->withDisplayName(Ljava/lang/String;)Landroid/net/ip/IpClient$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpClient$ProvisioningConfiguration$Builder;->withNetwork(Landroid/net/Network;)Landroid/net/ip/IpClient$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpClient$ProvisioningConfiguration$Builder;->withPreDhcpAction()Landroid/net/ip/IpClient$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpClient$ProvisioningConfiguration$Builder;->withRandomMacAddress()Landroid/net/ip/IpClient$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpClient$ProvisioningConfiguration;-><init>()V
+PLandroid/net/ip/IpClient$ProvisioningConfiguration;-><init>(Landroid/net/ip/IpClient$ProvisioningConfiguration;)V
+PLandroid/net/ip/IpClient$ProvisioningConfiguration;->isValid()Z
+PLandroid/net/ip/IpClient$ProvisioningConfiguration;->toString()Ljava/lang/String;
+PLandroid/net/ip/IpClient$RunningState;-><init>(Landroid/net/ip/IpClient;)V
+PLandroid/net/ip/IpClient$RunningState;->createPacketTracker()Landroid/net/ip/ConnectivityPacketTracker;
+PLandroid/net/ip/IpClient$RunningState;->ensureDhcpAction()V
+PLandroid/net/ip/IpClient$RunningState;->enter()V
+PLandroid/net/ip/IpClient$RunningState;->exit()V
+PLandroid/net/ip/IpClient$RunningState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/ip/IpClient$RunningState;->stopDhcpAction()V
+PLandroid/net/ip/IpClient$StartedState;-><init>(Landroid/net/ip/IpClient;)V
+PLandroid/net/ip/IpClient$StartedState;->enter()V
+PLandroid/net/ip/IpClient$StartedState;->exit()V
+PLandroid/net/ip/IpClient$StartedState;->readyToProceed()Z
+PLandroid/net/ip/IpClient$StoppedState;-><init>(Landroid/net/ip/IpClient;)V
+PLandroid/net/ip/IpClient$StoppedState;->enter()V
+PLandroid/net/ip/IpClient$StoppedState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/ip/IpClient$StoppingState;-><init>(Landroid/net/ip/IpClient;)V
+PLandroid/net/ip/IpClient$StoppingState;->enter()V
+PLandroid/net/ip/IpClient$StoppingState;->processMessage(Landroid/os/Message;)Z
+PLandroid/net/ip/IpClient;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/net/ip/IpClient$Callback;)V
+PLandroid/net/ip/IpClient;-><init>(Landroid/content/Context;Ljava/lang/String;Landroid/net/ip/IpClient$Callback;Landroid/net/ip/IpClient$Dependencies;)V
+PLandroid/net/ip/IpClient;->access$000(Landroid/net/ip/IpClient;)Landroid/net/util/SharedLog;
+PLandroid/net/ip/IpClient;->access$1000(Landroid/net/ip/IpClient;)Landroid/net/ip/IpClient$ProvisioningConfiguration;
+PLandroid/net/ip/IpClient;->access$1002(Landroid/net/ip/IpClient;Landroid/net/ip/IpClient$ProvisioningConfiguration;)Landroid/net/ip/IpClient$ProvisioningConfiguration;
+PLandroid/net/ip/IpClient;->access$1100(Landroid/net/ip/IpClient;)Lcom/android/internal/util/State;
+PLandroid/net/ip/IpClient;->access$1200(Landroid/net/ip/IpClient;Z)Z
+PLandroid/net/ip/IpClient;->access$1302(Landroid/net/ip/IpClient;Ljava/lang/String;)Ljava/lang/String;
+PLandroid/net/ip/IpClient;->access$1402(Landroid/net/ip/IpClient;Landroid/net/ProxyInfo;)Landroid/net/ProxyInfo;
+PLandroid/net/ip/IpClient;->access$1500(Landroid/net/ip/IpClient;)Z
+PLandroid/net/ip/IpClient;->access$1502(Landroid/net/ip/IpClient;Z)Z
+PLandroid/net/ip/IpClient;->access$1700(Landroid/net/ip/IpClient;)Landroid/net/ip/IpClient$MessageHandlingLogger;
+PLandroid/net/ip/IpClient;->access$1800(Landroid/net/ip/IpClient;)Landroid/net/dhcp/DhcpClient;
+PLandroid/net/ip/IpClient;->access$1802(Landroid/net/ip/IpClient;Landroid/net/dhcp/DhcpClient;)Landroid/net/dhcp/DhcpClient;
+PLandroid/net/ip/IpClient;->access$1900(Landroid/net/ip/IpClient;)Lcom/android/internal/util/State;
+PLandroid/net/ip/IpClient;->access$2000(Landroid/net/ip/IpClient;)Landroid/net/ip/InterfaceController;
+PLandroid/net/ip/IpClient;->access$2100(Landroid/net/ip/IpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/ip/IpClient;->access$2200(Landroid/net/ip/IpClient;)Lcom/android/internal/util/State;
+PLandroid/net/ip/IpClient;->access$2300(Landroid/net/ip/IpClient;)Lcom/android/internal/util/State;
+PLandroid/net/ip/IpClient;->access$2500(Landroid/net/ip/IpClient;)Landroid/net/LinkProperties;
+PLandroid/net/ip/IpClient;->access$2600(Landroid/net/ip/IpClient;)Landroid/content/Context;
+PLandroid/net/ip/IpClient;->access$2700(Landroid/net/ip/IpClient;)Landroid/net/apf/ApfFilter;
+PLandroid/net/ip/IpClient;->access$2702(Landroid/net/ip/IpClient;Landroid/net/apf/ApfFilter;)Landroid/net/apf/ApfFilter;
+PLandroid/net/ip/IpClient;->access$2800(Landroid/net/ip/IpClient;)Landroid/net/util/InterfaceParams;
+PLandroid/net/ip/IpClient;->access$2900(Landroid/net/ip/IpClient;)Z
+PLandroid/net/ip/IpClient;->access$3100(Landroid/net/ip/IpClient;)Z
+PLandroid/net/ip/IpClient;->access$3300(Landroid/net/ip/IpClient;)Landroid/net/util/MultinetworkPolicyTracker;
+PLandroid/net/ip/IpClient;->access$3302(Landroid/net/ip/IpClient;Landroid/net/util/MultinetworkPolicyTracker;)Landroid/net/util/MultinetworkPolicyTracker;
+PLandroid/net/ip/IpClient;->access$3400(Landroid/net/ip/IpClient;)Z
+PLandroid/net/ip/IpClient;->access$3500(Landroid/net/ip/IpClient;)Landroid/net/ip/IpReachabilityMonitor;
+PLandroid/net/ip/IpClient;->access$3502(Landroid/net/ip/IpClient;Landroid/net/ip/IpReachabilityMonitor;)Landroid/net/ip/IpReachabilityMonitor;
+PLandroid/net/ip/IpClient;->access$3600(Landroid/net/ip/IpClient;)Landroid/util/LocalLog;
+PLandroid/net/ip/IpClient;->access$3700(Landroid/net/ip/IpClient;)Lcom/android/internal/util/WakeupMessage;
+PLandroid/net/ip/IpClient;->access$4000(Landroid/net/ip/IpClient;Landroid/net/DhcpResults;)V
+PLandroid/net/ip/IpClient;->access$500(Landroid/net/ip/IpClient;)V
+PLandroid/net/ip/IpClient;->access$600(Landroid/net/ip/IpClient;)V
+PLandroid/net/ip/IpClient;->access$700(Landroid/net/ip/IpClient;)J
+PLandroid/net/ip/IpClient;->access$702(Landroid/net/ip/IpClient;J)J
+PLandroid/net/ip/IpClient;->access$800(Landroid/net/ip/IpClient;I)V
+PLandroid/net/ip/IpClient;->addAllReachableDnsServers(Landroid/net/LinkProperties;Ljava/lang/Iterable;)V
+PLandroid/net/ip/IpClient;->assembleLinkProperties()Landroid/net/LinkProperties;
+PLandroid/net/ip/IpClient;->buildProvisioningConfiguration()Landroid/net/ip/IpClient$ProvisioningConfiguration$Builder;
+PLandroid/net/ip/IpClient;->compareProvisioning(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Landroid/net/LinkProperties$ProvisioningChange;
+PLandroid/net/ip/IpClient;->completedPreDhcpAction()V
+PLandroid/net/ip/IpClient;->configureAndStartStateMachine()V
+PLandroid/net/ip/IpClient;->confirmConfiguration()V
+PLandroid/net/ip/IpClient;->dispatchCallback(Landroid/net/LinkProperties$ProvisioningChange;Landroid/net/LinkProperties;)V
+PLandroid/net/ip/IpClient;->getLogRecString(Landroid/os/Message;)Ljava/lang/String;
+PLandroid/net/ip/IpClient;->getWhatToString(I)Ljava/lang/String;
+PLandroid/net/ip/IpClient;->handleIPv4Success(Landroid/net/DhcpResults;)V
+PLandroid/net/ip/IpClient;->handleLinkPropertiesUpdate(Z)Z
+PLandroid/net/ip/IpClient;->isProvisioned(Landroid/net/LinkProperties;Landroid/net/ip/IpClient$InitialConfiguration;)Z
+PLandroid/net/ip/IpClient;->recordLogRec(Landroid/os/Message;)Z
+PLandroid/net/ip/IpClient;->recordMetric(I)V
+PLandroid/net/ip/IpClient;->resetLinkProperties()V
+PLandroid/net/ip/IpClient;->setHttpProxy(Landroid/net/ProxyInfo;)V
+PLandroid/net/ip/IpClient;->setLinkProperties(Landroid/net/LinkProperties;)Landroid/net/LinkProperties$ProvisioningChange;
+PLandroid/net/ip/IpClient;->setMulticastFilter(Z)V
+PLandroid/net/ip/IpClient;->setTcpBufferSizes(Ljava/lang/String;)V
+PLandroid/net/ip/IpClient;->startIPv4()Z
+PLandroid/net/ip/IpClient;->startIPv6()Z
+PLandroid/net/ip/IpClient;->startIpReachabilityMonitor()Z
+PLandroid/net/ip/IpClient;->startProvisioning(Landroid/net/ip/IpClient$ProvisioningConfiguration;)V
+PLandroid/net/ip/IpClient;->startStateMachineUpdaters()V
+PLandroid/net/ip/IpClient;->stop()V
+PLandroid/net/ip/IpClient;->stopAllIP()V
+PLandroid/net/ip/IpNeighborMonitor$NeighborEvent;-><init>(JSILjava/net/InetAddress;SLandroid/net/MacAddress;)V
+PLandroid/net/ip/IpNeighborMonitor;-><init>(Landroid/os/Handler;Landroid/net/util/SharedLog;Landroid/net/ip/IpNeighborMonitor$NeighborEventConsumer;)V
+PLandroid/net/ip/IpNeighborMonitor;->createFd()Ljava/io/FileDescriptor;
+PLandroid/net/ip/IpNeighborMonitor;->evaluateRtNetlinkNeighborMessage(Landroid/net/netlink/RtNetlinkNeighborMessage;J)V
+PLandroid/net/ip/IpNeighborMonitor;->getMacAddress([B)Landroid/net/MacAddress;
+PLandroid/net/ip/IpNeighborMonitor;->parseNetlinkMessageBuffer(Ljava/nio/ByteBuffer;J)V
+PLandroid/net/ip/IpNeighborMonitor;->startKernelNeighborProbe(ILjava/net/InetAddress;)I
+PLandroid/net/ip/IpReachabilityMonitor$Dependencies$1;-><init>(Landroid/os/PowerManager$WakeLock;)V
+PLandroid/net/ip/IpReachabilityMonitor$Dependencies$1;->acquireWakeLock(J)V
+PLandroid/net/ip/IpReachabilityMonitor$Dependencies;->makeDefault(Landroid/content/Context;Ljava/lang/String;)Landroid/net/ip/IpReachabilityMonitor$Dependencies;
+PLandroid/net/ip/IpReachabilityMonitor;-><init>(Landroid/content/Context;Landroid/net/util/InterfaceParams;Landroid/os/Handler;Landroid/net/util/SharedLog;Landroid/net/ip/IpReachabilityMonitor$Callback;Landroid/net/util/MultinetworkPolicyTracker;)V
+PLandroid/net/ip/IpReachabilityMonitor;-><init>(Landroid/net/util/InterfaceParams;Landroid/os/Handler;Landroid/net/util/SharedLog;Landroid/net/ip/IpReachabilityMonitor$Callback;Landroid/net/util/MultinetworkPolicyTracker;Landroid/net/ip/IpReachabilityMonitor$Dependencies;)V
+PLandroid/net/ip/IpReachabilityMonitor;->clearLinkProperties()V
+PLandroid/net/ip/IpReachabilityMonitor;->getProbeWakeLockDuration()J
+PLandroid/net/ip/IpReachabilityMonitor;->isOnLink(Ljava/util/List;Ljava/net/InetAddress;)Z
+PLandroid/net/ip/IpReachabilityMonitor;->lambda$new$0(Landroid/net/ip/IpReachabilityMonitor;Landroid/net/ip/IpNeighborMonitor$NeighborEvent;)V
+PLandroid/net/ip/IpReachabilityMonitor;->logEvent(II)V
+PLandroid/net/ip/IpReachabilityMonitor;->probeAll()V
+PLandroid/net/ip/IpReachabilityMonitor;->stop()V
+PLandroid/net/ip/IpReachabilityMonitor;->updateLinkProperties(Landroid/net/LinkProperties;)V
+PLandroid/net/metrics/INetdEventListener$Stub;-><init>()V
+PLandroid/net/metrics/INetdEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLandroid/net/netlink/NetlinkErrorMessage;-><init>(Landroid/net/netlink/StructNlMsgHdr;)V
+PLandroid/net/netlink/NetlinkErrorMessage;->getNlMsgError()Landroid/net/netlink/StructNlMsgErr;
+PLandroid/net/netlink/NetlinkErrorMessage;->parse(Landroid/net/netlink/StructNlMsgHdr;Ljava/nio/ByteBuffer;)Landroid/net/netlink/NetlinkErrorMessage;
+PLandroid/net/netlink/NetlinkMessage;-><init>(Landroid/net/netlink/StructNlMsgHdr;)V
+PLandroid/net/netlink/NetlinkMessage;->getHeader()Landroid/net/netlink/StructNlMsgHdr;
+PLandroid/net/netlink/NetlinkMessage;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/NetlinkMessage;
+PLandroid/net/netlink/NetlinkSocket;->checkTimeout(J)V
+PLandroid/net/netlink/NetlinkSocket;->connectToKernel(Ljava/io/FileDescriptor;)V
+PLandroid/net/netlink/NetlinkSocket;->forProto(I)Ljava/io/FileDescriptor;
+PLandroid/net/netlink/NetlinkSocket;->recvMessage(Ljava/io/FileDescriptor;IJ)Ljava/nio/ByteBuffer;
+PLandroid/net/netlink/NetlinkSocket;->sendMessage(Ljava/io/FileDescriptor;[BIIJ)I
+PLandroid/net/netlink/NetlinkSocket;->sendOneShotKernelMessage(I[B)V
+PLandroid/net/netlink/RtNetlinkNeighborMessage;-><init>(Landroid/net/netlink/StructNlMsgHdr;)V
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->getDestination()Ljava/net/InetAddress;
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->getLinkLayerAddress()[B
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->getNdHeader()Landroid/net/netlink/StructNdMsg;
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->getRequiredSpace()I
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->newNewNeighborMessage(ILjava/net/InetAddress;SI[B)[B
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->pack(Ljava/nio/ByteBuffer;)V
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->packNlAttr(S[BLjava/nio/ByteBuffer;)V
+PLandroid/net/netlink/RtNetlinkNeighborMessage;->parse(Landroid/net/netlink/StructNlMsgHdr;Ljava/nio/ByteBuffer;)Landroid/net/netlink/RtNetlinkNeighborMessage;
+PLandroid/net/netlink/StructNdMsg;-><init>()V
+PLandroid/net/netlink/StructNdMsg;->hasAvailableSpace(Ljava/nio/ByteBuffer;)Z
+PLandroid/net/netlink/StructNdMsg;->pack(Ljava/nio/ByteBuffer;)V
+PLandroid/net/netlink/StructNdMsg;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNdMsg;
+PLandroid/net/netlink/StructNdaCacheInfo;-><init>()V
+PLandroid/net/netlink/StructNdaCacheInfo;->hasAvailableSpace(Ljava/nio/ByteBuffer;)Z
+PLandroid/net/netlink/StructNdaCacheInfo;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNdaCacheInfo;
+PLandroid/net/netlink/StructNlAttr;-><init>()V
+PLandroid/net/netlink/StructNlAttr;->getValueAsByteBuffer()Ljava/nio/ByteBuffer;
+PLandroid/net/netlink/StructNlAttr;->getValueAsInetAddress()Ljava/net/InetAddress;
+PLandroid/net/netlink/StructNlAttr;->getValueAsInt(I)I
+PLandroid/net/netlink/StructNlAttr;->pack(Ljava/nio/ByteBuffer;)V
+PLandroid/net/netlink/StructNlAttr;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNlAttr;
+PLandroid/net/netlink/StructNlMsgErr;-><init>()V
+PLandroid/net/netlink/StructNlMsgErr;->hasAvailableSpace(Ljava/nio/ByteBuffer;)Z
+PLandroid/net/netlink/StructNlMsgErr;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNlMsgErr;
+PLandroid/net/netlink/StructNlMsgHdr;-><init>()V
+PLandroid/net/netlink/StructNlMsgHdr;->hasAvailableSpace(Ljava/nio/ByteBuffer;)Z
+PLandroid/net/netlink/StructNlMsgHdr;->pack(Ljava/nio/ByteBuffer;)V
+PLandroid/net/netlink/StructNlMsgHdr;->parse(Ljava/nio/ByteBuffer;)Landroid/net/netlink/StructNlMsgHdr;
+PLandroid/net/util/-$$Lambda$MultinetworkPolicyTracker$0siHK6f4lHJz8hbdHbT6G4Kp-V4;-><init>(Landroid/net/util/MultinetworkPolicyTracker;Ljava/lang/Runnable;)V
+PLandroid/net/util/-$$Lambda$MultinetworkPolicyTracker$0siHK6f4lHJz8hbdHbT6G4Kp-V4;->run()V
+PLandroid/net/util/ConnectivityPacketSummary;-><init>(Landroid/net/MacAddress;[BI)V
+PLandroid/net/util/ConnectivityPacketSummary;->getIPv4AddressString(Ljava/nio/ByteBuffer;)Ljava/lang/String;
+PLandroid/net/util/ConnectivityPacketSummary;->getIPv6AddressString(Ljava/nio/ByteBuffer;)Ljava/lang/String;
+PLandroid/net/util/ConnectivityPacketSummary;->getIpAddressString(Ljava/nio/ByteBuffer;I)Ljava/lang/String;
+PLandroid/net/util/ConnectivityPacketSummary;->parseARP(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseDHCPv4(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseEther(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6NeighborDiscoveryOptions(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6NeighborMessage(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6RouterAdvertisement(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseICMPv6RouterSolicitation(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseIPv4(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseIPv6(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->parseUDP(Ljava/util/StringJoiner;)V
+PLandroid/net/util/ConnectivityPacketSummary;->summarize(Landroid/net/MacAddress;[BI)Ljava/lang/String;
+PLandroid/net/util/ConnectivityPacketSummary;->toString()Ljava/lang/String;
+PLandroid/net/util/InterfaceParams;-><init>(Ljava/lang/String;ILandroid/net/MacAddress;I)V
+PLandroid/net/util/InterfaceParams;->getByName(Ljava/lang/String;)Landroid/net/util/InterfaceParams;
+PLandroid/net/util/InterfaceParams;->getMacAddress(Ljava/net/NetworkInterface;)Landroid/net/MacAddress;
+PLandroid/net/util/InterfaceParams;->getNetworkInterfaceByName(Ljava/lang/String;)Ljava/net/NetworkInterface;
+PLandroid/net/util/MultinetworkPolicyTracker$1;-><init>(Landroid/net/util/MultinetworkPolicyTracker;)V
+PLandroid/net/util/MultinetworkPolicyTracker$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLandroid/net/util/MultinetworkPolicyTracker$SettingObserver;-><init>(Landroid/net/util/MultinetworkPolicyTracker;)V
+PLandroid/net/util/MultinetworkPolicyTracker;-><init>(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/Runnable;)V
+PLandroid/net/util/MultinetworkPolicyTracker;->configMeteredMultipathPreference()I
+PLandroid/net/util/MultinetworkPolicyTracker;->configRestrictsAvoidBadWifi()Z
+PLandroid/net/util/MultinetworkPolicyTracker;->getAvoidBadWifi()Z
+PLandroid/net/util/MultinetworkPolicyTracker;->getAvoidBadWifiSetting()Ljava/lang/String;
+PLandroid/net/util/MultinetworkPolicyTracker;->lambda$new$0(Landroid/net/util/MultinetworkPolicyTracker;Ljava/lang/Runnable;)V
+PLandroid/net/util/MultinetworkPolicyTracker;->reevaluate()V
+PLandroid/net/util/MultinetworkPolicyTracker;->shutdown()V
+PLandroid/net/util/MultinetworkPolicyTracker;->start()V
+PLandroid/net/util/MultinetworkPolicyTracker;->updateAvoidBadWifi()Z
+PLandroid/net/util/MultinetworkPolicyTracker;->updateMeteredMultipathPreference()V
+PLandroid/net/util/NetdService;->get()Landroid/net/INetd;
+PLandroid/net/util/NetdService;->get(J)Landroid/net/INetd;
+PLandroid/net/util/NetdService;->getInstance()Landroid/net/INetd;
+PLandroid/net/util/NetworkConstants;->asByte(I)B
+PLandroid/net/util/NetworkConstants;->asString(I)Ljava/lang/String;
+PLandroid/net/util/NetworkConstants;->asUint(B)I
+PLandroid/net/util/NetworkConstants;->asUint(S)I
+PLandroid/net/util/PacketReader$1;-><init>(Landroid/net/util/PacketReader;)V
+PLandroid/net/util/PacketReader$1;->onFileDescriptorEvents(Ljava/io/FileDescriptor;I)I
+PLandroid/net/util/PacketReader;-><init>(Landroid/os/Handler;I)V
+PLandroid/net/util/PacketReader;->access$000(Landroid/net/util/PacketReader;)Z
+PLandroid/net/util/PacketReader;->access$100(Landroid/net/util/PacketReader;)Z
+PLandroid/net/util/PacketReader;->closeFd(Ljava/io/FileDescriptor;)V
+PLandroid/net/util/PacketReader;->createAndRegisterFd()V
+PLandroid/net/util/PacketReader;->handleInput()Z
+PLandroid/net/util/PacketReader;->onCorrectThread()Z
+PLandroid/net/util/PacketReader;->onStart()V
+PLandroid/net/util/PacketReader;->onStop()V
+PLandroid/net/util/PacketReader;->readPacket(Ljava/io/FileDescriptor;[B)I
+PLandroid/net/util/PacketReader;->start()V
+PLandroid/net/util/PacketReader;->stop()V
+PLandroid/net/util/PacketReader;->unregisterAndDestroyFd()V
+PLandroid/net/util/PrefixUtils;->addNonForwardablePrefixes(Ljava/util/Set;)V
+PLandroid/net/util/PrefixUtils;->pfx(Ljava/lang/String;)Landroid/net/IpPrefix;
+PLandroid/net/util/SharedLog$Category;-><init>(Ljava/lang/String;I)V
+PLandroid/net/util/SharedLog;-><init>(ILjava/lang/String;)V
+PLandroid/net/util/SharedLog;-><init>(Landroid/util/LocalLog;Ljava/lang/String;Ljava/lang/String;)V
+PLandroid/net/util/SharedLog;-><init>(Ljava/lang/String;)V
+PLandroid/net/util/SharedLog;->forSubComponent(Ljava/lang/String;)Landroid/net/util/SharedLog;
+PLandroid/net/util/SharedLog;->isRootLogInstance()Z
+PLandroid/net/util/SharedLog;->log(Ljava/lang/String;)V
+PLandroid/net/util/SharedLog;->logLine(Landroid/net/util/SharedLog$Category;Ljava/lang/String;)Ljava/lang/String;
+PLandroid/net/util/SharedLog;->mark(Ljava/lang/String;)V
+PLandroid/net/util/SharedLog;->record(Landroid/net/util/SharedLog$Category;Ljava/lang/String;)Ljava/lang/String;
+PLandroid/net/util/Stopwatch;-><init>()V
+PLandroid/net/util/Stopwatch;->isRunning()Z
+PLandroid/net/util/Stopwatch;->isStarted()Z
+PLandroid/net/util/Stopwatch;->isStopped()Z
+PLandroid/net/util/Stopwatch;->reset()V
+PLandroid/net/util/Stopwatch;->start()Landroid/net/util/Stopwatch;
+PLandroid/net/util/Stopwatch;->stop()J
+PLandroid/net/util/VersionedBroadcastListener$Receiver;-><init>(Ljava/lang/String;Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/function/Consumer;)V
+PLandroid/net/util/VersionedBroadcastListener$Receiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLandroid/net/util/VersionedBroadcastListener;-><init>(Ljava/lang/String;Landroid/content/Context;Landroid/os/Handler;Landroid/content/IntentFilter;Ljava/util/function/Consumer;)V
+PLandroid/net/util/VersionedBroadcastListener;->startListening()V
+PLcom/android/server/-$$Lambda$1xUIIN0BU8izGcnYWT-VzczLBFU;-><init>()V
+PLcom/android/server/-$$Lambda$1xUIIN0BU8izGcnYWT-VzczLBFU;->get(Lcom/android/server/NsdService$NativeCallbackReceiver;)Lcom/android/server/NsdService$DaemonConnection;
+PLcom/android/server/-$$Lambda$AlarmManagerService$Batch$Xltkj5RTKUMuFVeuavpuY7-Ogzc;-><init>(Lcom/android/server/AlarmManagerService$Alarm;)V
+PLcom/android/server/-$$Lambda$AlarmManagerService$Batch$Xltkj5RTKUMuFVeuavpuY7-Ogzc;->test(Ljava/lang/Object;)Z
+PLcom/android/server/-$$Lambda$AppOpsService$NC5g1JY4YR6y4VePru4TO7AKp8M;-><init>()V
+PLcom/android/server/-$$Lambda$AppOpsService$NC5g1JY4YR6y4VePru4TO7AKp8M;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/-$$Lambda$AppOpsService$UKMH8n9xZqCOX59uFPylskhjBgo;-><init>()V
+PLcom/android/server/-$$Lambda$AppOpsService$UKMH8n9xZqCOX59uFPylskhjBgo;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/-$$Lambda$AppStateTracker$zzioY8jvEm-1GnJ13CUiQGauPEE;-><init>(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/-$$Lambda$BatteryService$2x73lvpB0jctMSVP4qb9sHAqRPw;-><init>(Landroid/content/Intent;)V
+PLcom/android/server/-$$Lambda$BatteryService$2x73lvpB0jctMSVP4qb9sHAqRPw;->run()V
+PLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$7Y-B9O7NDYgUY9hQvFzC2FQ2V5w;-><init>(Landroid/util/MutableInt;Landroid/os/BatteryProperty;)V
+PLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$7Y-B9O7NDYgUY9hQvFzC2FQ2V5w;->onValues(II)V
+PLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$DM4ow6LC--JYWBfhHp2f1JW8nww;-><init>(Landroid/util/MutableInt;Landroid/os/BatteryProperty;)V
+PLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$DM4ow6LC--JYWBfhHp2f1JW8nww;->onValues(II)V
+PLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$KZAu97wwr_7_MI0awCjQTzdIuAI;-><init>(Landroid/util/MutableInt;Landroid/os/BatteryProperty;)V
+PLcom/android/server/-$$Lambda$BatteryService$BatteryPropertiesRegistrar$KZAu97wwr_7_MI0awCjQTzdIuAI;->onValues(II)V
+PLcom/android/server/-$$Lambda$BatteryService$D1kwd7L7yyqN5niz3KWkTepVmUk;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/-$$Lambda$BatteryService$D1kwd7L7yyqN5niz3KWkTepVmUk;->run()V
+PLcom/android/server/-$$Lambda$CommonTimeManagementService$2pDf0xdhqutmGymQBZY0XdP5zLg;-><init>(Lcom/android/server/CommonTimeManagementService;)V
+PLcom/android/server/-$$Lambda$CommonTimeManagementService$G4hdVfmKjXahO1EZQGCi66JNtFI;-><init>(Lcom/android/server/CommonTimeManagementService;)V
+PLcom/android/server/-$$Lambda$CommonTimeManagementService$o7NVT2DAE8gGyUPocEDzMJMp3rY;-><init>(Lcom/android/server/CommonTimeManagementService;)V
+PLcom/android/server/-$$Lambda$ConnectivityService$SFqiR4Pfksb1C7csMC3uNxCllR8;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/-$$Lambda$ContextHubSystemService$q-5gSEKm3he-4vIHcay4DLtf85E;-><init>(Lcom/android/server/ContextHubSystemService;Landroid/content/Context;)V
+PLcom/android/server/-$$Lambda$ContextHubSystemService$q-5gSEKm3he-4vIHcay4DLtf85E;->run()V
+PLcom/android/server/-$$Lambda$GraphicsStatsService$2EDVu98hsJvSwNgKvijVLSR3IrQ;-><init>(Lcom/android/server/GraphicsStatsService;)V
+PLcom/android/server/-$$Lambda$GraphicsStatsService$2EDVu98hsJvSwNgKvijVLSR3IrQ;->onAlarm()V
+PLcom/android/server/-$$Lambda$IpSecService$AnqunmSwm_yQvDDEPg-gokhVs5M;-><init>()V
+PLcom/android/server/-$$Lambda$NetworkManagementService$8J1LB_n8vMkXxx2KS06P_lQCw6w;-><init>(Ljava/lang/String;J[Ljava/lang/String;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$8J1LB_n8vMkXxx2KS06P_lQCw6w;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$D43p3Tqq7B3qaMs9AGb_3j0KZd0;-><init>(IZJ)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$V2aaK7-IK-mKPVvhONFoyFWi4zM;-><init>(Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$V2aaK7-IK-mKPVvhONFoyFWi4zM;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$VhSl9D6THA_3jE0unleMmkHavJ0;-><init>(Landroid/net/RouteInfo;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$VhSl9D6THA_3jE0unleMmkHavJ0;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$_L953cbquVj0BMBP1MZlSTm0Umg;-><init>(Ljava/lang/String;Z)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$_L953cbquVj0BMBP1MZlSTm0Umg;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$glaDh2pKbTpJLW8cwpYGiYd-sCA;-><init>(Landroid/net/RouteInfo;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$glaDh2pKbTpJLW8cwpYGiYd-sCA;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$iDseO-DhVR7T2LR6qxVJCC-3wfI;-><init>(Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$iDseO-DhVR7T2LR6qxVJCC-3wfI;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$xer7k2RLU4mODjrkZqaX89S9gD8;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/-$$Lambda$NetworkManagementService$xer7k2RLU4mODjrkZqaX89S9gD8;->sendCallback(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/-$$Lambda$PersistentDataBlockService$EZl9OYaT2eNL7kfSr2nKUBjxidk;-><init>(Lcom/android/server/PersistentDataBlockService;)V
+PLcom/android/server/-$$Lambda$PersistentDataBlockService$EZl9OYaT2eNL7kfSr2nKUBjxidk;->run()V
+PLcom/android/server/-$$Lambda$PruneInstantAppsJobService$i4sLSJdxcTXdgPAQZFbP66ZRprE;-><init>(Lcom/android/server/PruneInstantAppsJobService;Landroid/app/job/JobParameters;)V
+PLcom/android/server/-$$Lambda$PruneInstantAppsJobService$i4sLSJdxcTXdgPAQZFbP66ZRprE;->run()V
+PLcom/android/server/-$$Lambda$QTLvklqCTz22VSzZPEWJs-o0bv4;-><init>()V
+PLcom/android/server/-$$Lambda$QTLvklqCTz22VSzZPEWJs-o0bv4;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/-$$Lambda$SystemServer$NlJmG18aPrQduhRqASIdcn7G0z8;-><init>()V
+PLcom/android/server/-$$Lambda$SystemServer$NlJmG18aPrQduhRqASIdcn7G0z8;->run()V
+PLcom/android/server/-$$Lambda$SystemServer$UyrPns7R814g-ZEylCbDKhe8It4;-><init>()V
+PLcom/android/server/-$$Lambda$SystemServer$UyrPns7R814g-ZEylCbDKhe8It4;->run()V
+PLcom/android/server/-$$Lambda$SystemServer$VBGb9VpEls6bUcVBPwYLtX7qDTs;-><init>()V
+PLcom/android/server/-$$Lambda$SystemServer$VBGb9VpEls6bUcVBPwYLtX7qDTs;->run()V
+PLcom/android/server/-$$Lambda$SystemServer$Y1gEdKr_Hb7K7cbTDAo_WOJ-SYI;-><init>(Lcom/android/server/SystemServer;)V
+PLcom/android/server/-$$Lambda$SystemServer$Y1gEdKr_Hb7K7cbTDAo_WOJ-SYI;->run()V
+PLcom/android/server/-$$Lambda$SystemServer$s9erd2iGXiS7bbg_mQJUxyVboQM;-><init>(Lcom/android/server/SystemServer;Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;Lcom/android/server/NetworkManagementService;Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/IpSecService;Lcom/android/server/net/NetworkStatsService;Lcom/android/server/ConnectivityService;Lcom/android/server/LocationManagerService;Lcom/android/server/CountryDetectorService;Lcom/android/server/NetworkTimeUpdateService;Lcom/android/server/CommonTimeManagementService;Lcom/android/server/input/InputManagerService;Lcom/android/server/TelephonyRegistry;Lcom/android/server/media/MediaRouterService;Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/-$$Lambda$SystemServer$s9erd2iGXiS7bbg_mQJUxyVboQM;->run()V
+PLcom/android/server/-$$Lambda$TextServicesManagerService$Gx5nx59gL-Y47MWUiJn5TqC2DLs;-><init>(Lcom/android/server/TextServicesManagerService;)V
+PLcom/android/server/-$$Lambda$TextServicesManagerService$Gx5nx59gL-Y47MWUiJn5TqC2DLs;->applyAsInt(I)I
+PLcom/android/server/-$$Lambda$TextServicesManagerService$SpellCheckerBindGroup$WPb2Qavn5gWhsY_rCdz_4UGBTAw;-><init>(Landroid/os/IBinder;)V
+PLcom/android/server/-$$Lambda$UiModeManagerService$SMGExVQCkMpTx7aAoJee7KHGMA0;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/-$$Lambda$UiModeManagerService$SMGExVQCkMpTx7aAoJee7KHGMA0;->run()V
+PLcom/android/server/AlarmManagerService$1;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$1;->compare(Lcom/android/server/AlarmManagerService$Alarm;Lcom/android/server/AlarmManagerService$Alarm;)I
+PLcom/android/server/AlarmManagerService$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/AlarmManagerService$2;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$2;->currentNetworkTimeMillis()J
+PLcom/android/server/AlarmManagerService$2;->getNextAlarmClock(I)Landroid/app/AlarmManager$AlarmClockInfo;
+PLcom/android/server/AlarmManagerService$2;->getNextWakeFromIdleTime()J
+PLcom/android/server/AlarmManagerService$2;->remove(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V
+PLcom/android/server/AlarmManagerService$2;->setTime(J)Z
+PLcom/android/server/AlarmManagerService$2;->setTimeZone(Ljava/lang/String;)V
+PLcom/android/server/AlarmManagerService$5;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$5;->onUidForeground(IZ)V
+PLcom/android/server/AlarmManagerService$5;->unblockAlarmsForUid(I)V
+PLcom/android/server/AlarmManagerService$AlarmHandler;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$AlarmHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/AlarmManagerService$AlarmThread;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$AppStandbyTracker;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$AppStandbyTracker;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+PLcom/android/server/AlarmManagerService$AppStandbyTracker;->onParoleStateChanged(Z)V
+PLcom/android/server/AlarmManagerService$Batch;->lambda$remove$0(Lcom/android/server/AlarmManagerService$Alarm;Lcom/android/server/AlarmManagerService$Alarm;)Z
+PLcom/android/server/AlarmManagerService$Batch;->remove(Lcom/android/server/AlarmManagerService$Alarm;)Z
+PLcom/android/server/AlarmManagerService$BatchTimeOrder;-><init>()V
+PLcom/android/server/AlarmManagerService$BroadcastStats;-><init>(ILjava/lang/String;)V
+PLcom/android/server/AlarmManagerService$ClockReceiver;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$ClockReceiver;->scheduleDateChangedEvent()V
+PLcom/android/server/AlarmManagerService$Constants;-><init>(Lcom/android/server/AlarmManagerService;Landroid/os/Handler;)V
+PLcom/android/server/AlarmManagerService$Constants;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/AlarmManagerService$Constants;->updateAllowWhileIdleWhitelistDurationLocked()V
+PLcom/android/server/AlarmManagerService$Constants;->updateConstants()V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->deliverLocked(Lcom/android/server/AlarmManagerService$Alarm;JZ)V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->onSendFinished(Landroid/app/PendingIntent;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/app/PendingIntent;Landroid/content/Intent;)Lcom/android/server/AlarmManagerService$InFlight;
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/os/IBinder;)Lcom/android/server/AlarmManagerService$InFlight;
+PLcom/android/server/AlarmManagerService$DeliveryTracker;->updateTrackingLocked(Lcom/android/server/AlarmManagerService$InFlight;)V
+PLcom/android/server/AlarmManagerService$FilterStats;-><init>(Lcom/android/server/AlarmManagerService$BroadcastStats;Ljava/lang/String;)V
+PLcom/android/server/AlarmManagerService$InFlight;-><init>(Lcom/android/server/AlarmManagerService;Landroid/app/PendingIntent;Landroid/app/IAlarmListener;Landroid/os/WorkSource;ILjava/lang/String;ILjava/lang/String;J)V
+PLcom/android/server/AlarmManagerService$IncreasingTimeOrder;-><init>()V
+PLcom/android/server/AlarmManagerService$InteractiveStateReceiver;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$InteractiveStateReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/AlarmManagerService$LocalService;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$LocalService;-><init>(Lcom/android/server/AlarmManagerService;Lcom/android/server/AlarmManagerService$1;)V
+PLcom/android/server/AlarmManagerService$PriorityClass;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$UidObserver;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$UidObserver;->onUidActive(I)V
+PLcom/android/server/AlarmManagerService$UidObserver;->onUidGone(IZ)V
+PLcom/android/server/AlarmManagerService$UidObserver;->onUidIdle(IZ)V
+PLcom/android/server/AlarmManagerService$UninstallReceiver;-><init>(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService$UninstallReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/AlarmManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/AlarmManagerService;->access$1002(Lcom/android/server/AlarmManagerService;J)J
+PLcom/android/server/AlarmManagerService;->access$1102(Lcom/android/server/AlarmManagerService;J)J
+PLcom/android/server/AlarmManagerService;->access$1200(Lcom/android/server/AlarmManagerService;)V
+PLcom/android/server/AlarmManagerService;->access$1502(Lcom/android/server/AlarmManagerService;Z)Z
+PLcom/android/server/AlarmManagerService;->access$1602(Lcom/android/server/AlarmManagerService;J)J
+PLcom/android/server/AlarmManagerService;->access$1802(Lcom/android/server/AlarmManagerService;J)J
+PLcom/android/server/AlarmManagerService;->access$1900(Lcom/android/server/AlarmManagerService;)Landroid/util/ArrayMap;
+PLcom/android/server/AlarmManagerService;->access$2008(Lcom/android/server/AlarmManagerService;)I
+PLcom/android/server/AlarmManagerService;->access$202(Lcom/android/server/AlarmManagerService;J)J
+PLcom/android/server/AlarmManagerService;->access$2108(Lcom/android/server/AlarmManagerService;)I
+PLcom/android/server/AlarmManagerService;->access$2208(Lcom/android/server/AlarmManagerService;)I
+PLcom/android/server/AlarmManagerService;->access$2302(Lcom/android/server/AlarmManagerService;J)J
+PLcom/android/server/AlarmManagerService;->access$2400(Lcom/android/server/AlarmManagerService;)Landroid/content/Intent;
+PLcom/android/server/AlarmManagerService;->access$2508(Lcom/android/server/AlarmManagerService;)I
+PLcom/android/server/AlarmManagerService;->access$400(Lcom/android/server/AlarmManagerService;Landroid/app/PendingIntent;)Lcom/android/server/AlarmManagerService$BroadcastStats;
+PLcom/android/server/AlarmManagerService;->access$500(Lcom/android/server/AlarmManagerService;ILjava/lang/String;)Lcom/android/server/AlarmManagerService$BroadcastStats;
+PLcom/android/server/AlarmManagerService;->access$700(Lcom/android/server/AlarmManagerService;Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V
+PLcom/android/server/AlarmManagerService;->checkAllowNonWakeupDelayLocked(J)Z
+PLcom/android/server/AlarmManagerService;->currentNonWakeupFuzzLocked(J)J
+PLcom/android/server/AlarmManagerService;->fuzzForDuration(J)I
+PLcom/android/server/AlarmManagerService;->getNextAlarmClockImpl(I)Landroid/app/AlarmManager$AlarmClockInfo;
+PLcom/android/server/AlarmManagerService;->getNextWakeFromIdleTimeImpl()J
+PLcom/android/server/AlarmManagerService;->getStatsLocked(ILjava/lang/String;)Lcom/android/server/AlarmManagerService$BroadcastStats;
+PLcom/android/server/AlarmManagerService;->getStatsLocked(Landroid/app/PendingIntent;)Lcom/android/server/AlarmManagerService$BroadcastStats;
+PLcom/android/server/AlarmManagerService;->getWhileIdleMinIntervalLocked(I)J
+PLcom/android/server/AlarmManagerService;->interactiveStateChangedLocked(Z)V
+PLcom/android/server/AlarmManagerService;->isBackgroundRestricted(Lcom/android/server/AlarmManagerService$Alarm;)Z
+PLcom/android/server/AlarmManagerService;->onBootPhase(I)V
+PLcom/android/server/AlarmManagerService;->onStart()V
+PLcom/android/server/AlarmManagerService;->rebatchAllAlarms()V
+PLcom/android/server/AlarmManagerService;->removeImpl(Landroid/app/PendingIntent;)V
+PLcom/android/server/AlarmManagerService;->restorePendingWhileIdleAlarmsLocked()V
+PLcom/android/server/AlarmManagerService;->sendPendingBackgroundAlarmsLocked(ILjava/lang/String;)V
+PLcom/android/server/AlarmManagerService;->setTimeImpl(J)Z
+PLcom/android/server/AlarmManagerService;->setTimeZoneImpl(Ljava/lang/String;)V
+PLcom/android/server/AlarmManagerService;->setWakelockWorkSource(Landroid/app/PendingIntent;Landroid/os/WorkSource;ILjava/lang/String;IZ)V
+PLcom/android/server/AnimationThread;-><init>()V
+PLcom/android/server/AnimationThread;->ensureThreadLocked()V
+PLcom/android/server/AnimationThread;->get()Lcom/android/server/AnimationThread;
+PLcom/android/server/AnimationThread;->getHandler()Landroid/os/Handler;
+PLcom/android/server/AnyMotionDetector$1;-><init>(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector$1;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
+PLcom/android/server/AnyMotionDetector$1;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+PLcom/android/server/AnyMotionDetector$2;-><init>(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector$2;->run()V
+PLcom/android/server/AnyMotionDetector$3;-><init>(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector$4;-><init>(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector$RunningSignalStats;-><init>()V
+PLcom/android/server/AnyMotionDetector$RunningSignalStats;->accumulate(Lcom/android/server/AnyMotionDetector$Vector3;)V
+PLcom/android/server/AnyMotionDetector$RunningSignalStats;->getEnergy()F
+PLcom/android/server/AnyMotionDetector$RunningSignalStats;->getRunningAverage()Lcom/android/server/AnyMotionDetector$Vector3;
+PLcom/android/server/AnyMotionDetector$RunningSignalStats;->getSampleCount()I
+PLcom/android/server/AnyMotionDetector$RunningSignalStats;->reset()V
+PLcom/android/server/AnyMotionDetector$Vector3;-><init>(JFFF)V
+PLcom/android/server/AnyMotionDetector$Vector3;->angleBetween(Lcom/android/server/AnyMotionDetector$Vector3;)F
+PLcom/android/server/AnyMotionDetector$Vector3;->cross(Lcom/android/server/AnyMotionDetector$Vector3;)Lcom/android/server/AnyMotionDetector$Vector3;
+PLcom/android/server/AnyMotionDetector$Vector3;->dotProduct(Lcom/android/server/AnyMotionDetector$Vector3;)F
+PLcom/android/server/AnyMotionDetector$Vector3;->minus(Lcom/android/server/AnyMotionDetector$Vector3;)Lcom/android/server/AnyMotionDetector$Vector3;
+PLcom/android/server/AnyMotionDetector$Vector3;->norm()F
+PLcom/android/server/AnyMotionDetector$Vector3;->normalized()Lcom/android/server/AnyMotionDetector$Vector3;
+PLcom/android/server/AnyMotionDetector$Vector3;->plus(Lcom/android/server/AnyMotionDetector$Vector3;)Lcom/android/server/AnyMotionDetector$Vector3;
+PLcom/android/server/AnyMotionDetector$Vector3;->times(F)Lcom/android/server/AnyMotionDetector$Vector3;
+PLcom/android/server/AnyMotionDetector$Vector3;->toString()Ljava/lang/String;
+PLcom/android/server/AnyMotionDetector;-><init>(Landroid/os/PowerManager;Landroid/os/Handler;Landroid/hardware/SensorManager;Lcom/android/server/AnyMotionDetector$DeviceIdleCallback;F)V
+PLcom/android/server/AnyMotionDetector;->access$000(Lcom/android/server/AnyMotionDetector;)Ljava/lang/Object;
+PLcom/android/server/AnyMotionDetector;->access$100(Lcom/android/server/AnyMotionDetector;)Lcom/android/server/AnyMotionDetector$RunningSignalStats;
+PLcom/android/server/AnyMotionDetector;->access$200(Lcom/android/server/AnyMotionDetector;)I
+PLcom/android/server/AnyMotionDetector;->access$300(Lcom/android/server/AnyMotionDetector;)I
+PLcom/android/server/AnyMotionDetector;->access$400(Lcom/android/server/AnyMotionDetector;)Ljava/lang/Runnable;
+PLcom/android/server/AnyMotionDetector;->access$500(Lcom/android/server/AnyMotionDetector;)Landroid/os/Handler;
+PLcom/android/server/AnyMotionDetector;->access$602(Lcom/android/server/AnyMotionDetector;Z)Z
+PLcom/android/server/AnyMotionDetector;->access$700(Lcom/android/server/AnyMotionDetector;)Lcom/android/server/AnyMotionDetector$DeviceIdleCallback;
+PLcom/android/server/AnyMotionDetector;->access$800(Lcom/android/server/AnyMotionDetector;)Z
+PLcom/android/server/AnyMotionDetector;->access$802(Lcom/android/server/AnyMotionDetector;Z)Z
+PLcom/android/server/AnyMotionDetector;->access$900(Lcom/android/server/AnyMotionDetector;)V
+PLcom/android/server/AnyMotionDetector;->checkForAnyMotion()V
+PLcom/android/server/AnyMotionDetector;->getStationaryStatus()I
+PLcom/android/server/AnyMotionDetector;->startOrientationMeasurementLocked()V
+PLcom/android/server/AnyMotionDetector;->stop()V
+PLcom/android/server/AnyMotionDetector;->stopOrientationMeasurementLocked()I
+PLcom/android/server/AppOpsService$1$1;-><init>(Lcom/android/server/AppOpsService$1;)V
+PLcom/android/server/AppOpsService$1$1;->doInBackground([Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/AppOpsService$1$1;->doInBackground([Ljava/lang/Void;)Ljava/lang/Void;
+PLcom/android/server/AppOpsService$1;->run()V
+PLcom/android/server/AppOpsService$2;-><init>(Lcom/android/server/AppOpsService;)V
+PLcom/android/server/AppOpsService$3;-><init>(Lcom/android/server/AppOpsService;)V
+PLcom/android/server/AppOpsService$3;->getMountMode(ILjava/lang/String;)I
+PLcom/android/server/AppOpsService$3;->hasExternalStorage(ILjava/lang/String;)Z
+PLcom/android/server/AppOpsService$ActiveCallback;-><init>(Lcom/android/server/AppOpsService;Lcom/android/internal/app/IAppOpsActiveCallback;III)V
+PLcom/android/server/AppOpsService$AppOpsManagerInternalImpl;->setDeviceAndProfileOwners(Landroid/util/SparseIntArray;)V
+PLcom/android/server/AppOpsService$ClientRestrictionState;-><init>(Lcom/android/server/AppOpsService;Landroid/os/IBinder;)V
+PLcom/android/server/AppOpsService$ClientRestrictionState;->destroy()V
+PLcom/android/server/AppOpsService$ClientRestrictionState;->hasRestriction(ILjava/lang/String;I)Z
+PLcom/android/server/AppOpsService$ClientRestrictionState;->isDefault()Z
+PLcom/android/server/AppOpsService$ClientRestrictionState;->isDefault([Z)Z
+PLcom/android/server/AppOpsService$ClientRestrictionState;->setRestriction(IZ[Ljava/lang/String;I)Z
+PLcom/android/server/AppOpsService$ClientState;-><init>(Lcom/android/server/AppOpsService;Landroid/os/IBinder;)V
+PLcom/android/server/AppOpsService$Constants;->startMonitoring(Landroid/content/ContentResolver;)V
+PLcom/android/server/AppOpsService$ModeCallback;-><init>(Lcom/android/server/AppOpsService;Lcom/android/internal/app/IAppOpsCallback;IIII)V
+PLcom/android/server/AppOpsService$ModeCallback;->binderDied()V
+PLcom/android/server/AppOpsService$ModeCallback;->unlinkToDeath()V
+PLcom/android/server/AppOpsService$Restriction;-><init>()V
+PLcom/android/server/AppOpsService$Restriction;-><init>(Lcom/android/server/AppOpsService$1;)V
+PLcom/android/server/AppOpsService$UidState;->clear()V
+PLcom/android/server/AppOpsService$UidState;->isDefault()Z
+PLcom/android/server/AppOpsService;->checkAudioOperation(IIILjava/lang/String;)I
+PLcom/android/server/AppOpsService;->checkOperation(IILjava/lang/String;)I
+PLcom/android/server/AppOpsService;->checkRestrictionLocked(IIILjava/lang/String;)I
+PLcom/android/server/AppOpsService;->checkSystemUid(Ljava/lang/String;)V
+PLcom/android/server/AppOpsService;->enforceManageAppOpsModes(III)V
+PLcom/android/server/AppOpsService;->getOpsForPackage(ILjava/lang/String;[I)Ljava/util/List;
+PLcom/android/server/AppOpsService;->getPackagesForUid(I)[Ljava/lang/String;
+PLcom/android/server/AppOpsService;->getToken(Landroid/os/IBinder;)Landroid/os/IBinder;
+PLcom/android/server/AppOpsService;->isOperationActive(IILjava/lang/String;)Z
+PLcom/android/server/AppOpsService;->isPackageSuspendedForUser(Ljava/lang/String;I)Z
+PLcom/android/server/AppOpsService;->lambda$NC5g1JY4YR6y4VePru4TO7AKp8M(Lcom/android/server/AppOpsService;Landroid/util/ArraySet;IILjava/lang/String;Z)V
+PLcom/android/server/AppOpsService;->lambda$UKMH8n9xZqCOX59uFPylskhjBgo(Lcom/android/server/AppOpsService;II)V
+PLcom/android/server/AppOpsService;->notifyOpActiveChanged(Landroid/util/ArraySet;IILjava/lang/String;Z)V
+PLcom/android/server/AppOpsService;->notifyOpChanged(Landroid/util/ArraySet;IILjava/lang/String;)V
+PLcom/android/server/AppOpsService;->notifyWatchersOfChange(II)V
+PLcom/android/server/AppOpsService;->permissionToOpCode(Ljava/lang/String;)I
+PLcom/android/server/AppOpsService;->resolveUid(Ljava/lang/String;)I
+PLcom/android/server/AppOpsService;->scheduleFastWriteLocked()V
+PLcom/android/server/AppOpsService;->setMode(IILjava/lang/String;I)V
+PLcom/android/server/AppOpsService;->setUidMode(III)V
+PLcom/android/server/AppOpsService;->setUserRestriction(IZLandroid/os/IBinder;I[Ljava/lang/String;)V
+PLcom/android/server/AppOpsService;->setUserRestrictionNoCheck(IZLandroid/os/IBinder;I[Ljava/lang/String;)V
+PLcom/android/server/AppOpsService;->setUserRestrictions(Landroid/os/Bundle;Landroid/os/IBinder;I)V
+PLcom/android/server/AppOpsService;->startWatchingActive([ILcom/android/internal/app/IAppOpsActiveCallback;)V
+PLcom/android/server/AppOpsService;->startWatchingMode(ILjava/lang/String;Lcom/android/internal/app/IAppOpsCallback;)V
+PLcom/android/server/AppOpsService;->startWatchingModeWithFlags(ILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V
+PLcom/android/server/AppOpsService;->stopWatchingMode(Lcom/android/internal/app/IAppOpsCallback;)V
+PLcom/android/server/AppOpsService;->systemReady()V
+PLcom/android/server/AppStateTracker$AppOpsWatcher;-><init>(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker$AppOpsWatcher;-><init>(Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTracker$1;)V
+PLcom/android/server/AppStateTracker$FeatureFlagsObserver;-><init>(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker$FeatureFlagsObserver;->isForcedAppStandbyEnabled()Z
+PLcom/android/server/AppStateTracker$FeatureFlagsObserver;->isForcedAppStandbyForSmallBatteryEnabled()Z
+PLcom/android/server/AppStateTracker$FeatureFlagsObserver;->register()V
+PLcom/android/server/AppStateTracker$Listener;-><init>()V
+PLcom/android/server/AppStateTracker$Listener;->access$1000(Lcom/android/server/AppStateTracker$Listener;Lcom/android/server/AppStateTracker;I)V
+PLcom/android/server/AppStateTracker$Listener;->access$1500(Lcom/android/server/AppStateTracker$Listener;Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker$Listener;->onTempPowerSaveWhitelistChanged(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker$Listener;->onUidActiveStateChanged(Lcom/android/server/AppStateTracker;I)V
+PLcom/android/server/AppStateTracker$Listener;->unblockAlarmsForUid(I)V
+PLcom/android/server/AppStateTracker$Listener;->updateAllJobs()V
+PLcom/android/server/AppStateTracker$Listener;->updateJobsForUid(IZ)V
+PLcom/android/server/AppStateTracker$MyHandler;-><init>(Lcom/android/server/AppStateTracker;Landroid/os/Looper;)V
+PLcom/android/server/AppStateTracker$MyHandler;->handleUidActive(I)V
+PLcom/android/server/AppStateTracker$MyHandler;->handleUidGone(IZ)V
+PLcom/android/server/AppStateTracker$MyHandler;->handleUidIdle(IZ)V
+PLcom/android/server/AppStateTracker$MyHandler;->notifyAllWhitelistChanged()V
+PLcom/android/server/AppStateTracker$MyHandler;->notifyTempWhitelistChanged()V
+PLcom/android/server/AppStateTracker$MyHandler;->notifyUidActiveStateChanged(I)V
+PLcom/android/server/AppStateTracker$MyHandler;->notifyUidForegroundStateChanged(I)V
+PLcom/android/server/AppStateTracker$MyHandler;->onUidActive(I)V
+PLcom/android/server/AppStateTracker$MyHandler;->onUidGone(IZ)V
+PLcom/android/server/AppStateTracker$MyHandler;->onUidIdle(IZ)V
+PLcom/android/server/AppStateTracker$MyHandler;->removeUid(IZ)V
+PLcom/android/server/AppStateTracker$MyReceiver;-><init>(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker$MyReceiver;-><init>(Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTracker$1;)V
+PLcom/android/server/AppStateTracker$MyReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/AppStateTracker$StandbyTracker;-><init>(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker$StandbyTracker;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+PLcom/android/server/AppStateTracker$StandbyTracker;->onParoleStateChanged(Z)V
+PLcom/android/server/AppStateTracker$UidObserver;-><init>(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker$UidObserver;-><init>(Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTracker$1;)V
+PLcom/android/server/AppStateTracker$UidObserver;->onUidActive(I)V
+PLcom/android/server/AppStateTracker$UidObserver;->onUidGone(IZ)V
+PLcom/android/server/AppStateTracker$UidObserver;->onUidIdle(IZ)V
+PLcom/android/server/AppStateTracker;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
+PLcom/android/server/AppStateTracker;->access$000(Lcom/android/server/AppStateTracker;)Landroid/content/Context;
+PLcom/android/server/AppStateTracker;->access$1900(Landroid/util/SparseBooleanArray;I)Z
+PLcom/android/server/AppStateTracker;->access$300(Lcom/android/server/AppStateTracker;)V
+PLcom/android/server/AppStateTracker;->access$700(Lcom/android/server/AppStateTracker;)Landroid/util/SparseSetArray;
+PLcom/android/server/AppStateTracker;->access$900(Lcom/android/server/AppStateTracker;)[Lcom/android/server/AppStateTracker$Listener;
+PLcom/android/server/AppStateTracker;->addListener(Lcom/android/server/AppStateTracker$Listener;)V
+PLcom/android/server/AppStateTracker;->addUidToArray(Landroid/util/SparseBooleanArray;I)Z
+PLcom/android/server/AppStateTracker;->areAlarmsRestricted(ILjava/lang/String;Z)Z
+PLcom/android/server/AppStateTracker;->cloneListeners()[Lcom/android/server/AppStateTracker$Listener;
+PLcom/android/server/AppStateTracker;->injectActivityManagerInternal()Landroid/app/ActivityManagerInternal;
+PLcom/android/server/AppStateTracker;->injectAppOpsManager()Landroid/app/AppOpsManager;
+PLcom/android/server/AppStateTracker;->injectGetGlobalSettingInt(Ljava/lang/String;I)I
+PLcom/android/server/AppStateTracker;->injectIActivityManager()Landroid/app/IActivityManager;
+PLcom/android/server/AppStateTracker;->injectIAppOpsService()Lcom/android/internal/app/IAppOpsService;
+PLcom/android/server/AppStateTracker;->injectPowerManagerInternal()Landroid/os/PowerManagerInternal;
+PLcom/android/server/AppStateTracker;->injectUsageStatsManagerInternal()Landroid/app/usage/UsageStatsManagerInternal;
+PLcom/android/server/AppStateTracker;->isForceAllAppsStandbyEnabled()Z
+PLcom/android/server/AppStateTracker;->isUidActiveSynced(I)Z
+PLcom/android/server/AppStateTracker;->isUidPowerSaveUserWhitelisted(I)Z
+PLcom/android/server/AppStateTracker;->onSystemServicesReady()V
+PLcom/android/server/AppStateTracker;->refreshForcedAppStandbyUidPackagesLocked()V
+PLcom/android/server/AppStateTracker;->setPowerSaveWhitelistAppIds([I[I[I)V
+PLcom/android/server/AppStateTracker;->toggleForceAllAppsStandbyLocked(Z)V
+PLcom/android/server/AppStateTracker;->updateForceAllAppStandbyState()V
+PLcom/android/server/AttributeCache$Entry;-><init>(Landroid/content/Context;Landroid/content/res/TypedArray;)V
+PLcom/android/server/AttributeCache$Entry;->recycle()V
+PLcom/android/server/AttributeCache$Package;-><init>(Landroid/content/Context;)V
+PLcom/android/server/AttributeCache$Package;->access$000(Lcom/android/server/AttributeCache$Package;)Landroid/util/SparseArray;
+PLcom/android/server/AttributeCache;-><init>(Landroid/content/Context;)V
+PLcom/android/server/AttributeCache;->get(Ljava/lang/String;I[II)Lcom/android/server/AttributeCache$Entry;
+PLcom/android/server/AttributeCache;->init(Landroid/content/Context;)V
+PLcom/android/server/AttributeCache;->instance()Lcom/android/server/AttributeCache;
+PLcom/android/server/AttributeCache;->removePackage(Ljava/lang/String;)V
+PLcom/android/server/AttributeCache;->updateConfiguration(Landroid/content/res/Configuration;)V
+PLcom/android/server/BatteryService$2;-><init>(Lcom/android/server/BatteryService;Landroid/os/Handler;)V
+PLcom/android/server/BatteryService$2;->onChange(Z)V
+PLcom/android/server/BatteryService$3;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$4;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$7;-><init>(Lcom/android/server/BatteryService;Landroid/content/Intent;)V
+PLcom/android/server/BatteryService$7;->run()V
+PLcom/android/server/BatteryService$8;-><init>(Lcom/android/server/BatteryService;Landroid/content/Intent;)V
+PLcom/android/server/BatteryService$8;->run()V
+PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;-><init>(Lcom/android/server/BatteryService;Lcom/android/server/BatteryService$1;)V
+PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->getProperty(ILandroid/os/BatteryProperty;)I
+PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$getProperty$0(Landroid/util/MutableInt;Landroid/os/BatteryProperty;II)V
+PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$getProperty$2(Landroid/util/MutableInt;Landroid/os/BatteryProperty;II)V
+PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->lambda$getProperty$3(Landroid/util/MutableInt;Landroid/os/BatteryProperty;II)V
+PLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->scheduleUpdate()V
+PLcom/android/server/BatteryService$BinderService;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$BinderService;-><init>(Lcom/android/server/BatteryService;Lcom/android/server/BatteryService$1;)V
+PLcom/android/server/BatteryService$HealthHalCallback;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$HealthHalCallback;-><init>(Lcom/android/server/BatteryService;Lcom/android/server/BatteryService$1;)V
+PLcom/android/server/BatteryService$HealthHalCallback;->healthInfoChanged(Landroid/hardware/health/V2_0/HealthInfo;)V
+PLcom/android/server/BatteryService$HealthHalCallback;->onRegistration(Landroid/hardware/health/V2_0/IHealth;Landroid/hardware/health/V2_0/IHealth;Ljava/lang/String;)V
+PLcom/android/server/BatteryService$HealthServiceWrapper$IHealthSupplier;->get(Ljava/lang/String;)Landroid/hardware/health/V2_0/IHealth;
+PLcom/android/server/BatteryService$HealthServiceWrapper$IServiceManagerSupplier;->get()Landroid/hidl/manager/V1_0/IServiceManager;
+PLcom/android/server/BatteryService$HealthServiceWrapper$Notification$1;-><init>(Lcom/android/server/BatteryService$HealthServiceWrapper$Notification;)V
+PLcom/android/server/BatteryService$HealthServiceWrapper$Notification$1;->run()V
+PLcom/android/server/BatteryService$HealthServiceWrapper$Notification;-><init>(Lcom/android/server/BatteryService$HealthServiceWrapper;)V
+PLcom/android/server/BatteryService$HealthServiceWrapper$Notification;-><init>(Lcom/android/server/BatteryService$HealthServiceWrapper;Lcom/android/server/BatteryService$1;)V
+PLcom/android/server/BatteryService$HealthServiceWrapper$Notification;->onRegistration(Ljava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/BatteryService$HealthServiceWrapper;-><init>()V
+PLcom/android/server/BatteryService$HealthServiceWrapper;->access$2200(Lcom/android/server/BatteryService$HealthServiceWrapper;)Ljava/lang/String;
+PLcom/android/server/BatteryService$HealthServiceWrapper;->access$2300(Lcom/android/server/BatteryService$HealthServiceWrapper;)Lcom/android/server/BatteryService$HealthServiceWrapper$IHealthSupplier;
+PLcom/android/server/BatteryService$HealthServiceWrapper;->access$2400(Lcom/android/server/BatteryService$HealthServiceWrapper;)Ljava/util/concurrent/atomic/AtomicReference;
+PLcom/android/server/BatteryService$HealthServiceWrapper;->access$2600(Lcom/android/server/BatteryService$HealthServiceWrapper;)Landroid/os/HandlerThread;
+PLcom/android/server/BatteryService$HealthServiceWrapper;->getLastService()Landroid/hardware/health/V2_0/IHealth;
+PLcom/android/server/BatteryService$HealthServiceWrapper;->init(Lcom/android/server/BatteryService$HealthServiceWrapper$Callback;Lcom/android/server/BatteryService$HealthServiceWrapper$IServiceManagerSupplier;Lcom/android/server/BatteryService$HealthServiceWrapper$IHealthSupplier;)V
+PLcom/android/server/BatteryService$Led;-><init>(Lcom/android/server/BatteryService;Landroid/content/Context;Lcom/android/server/lights/LightsManager;)V
+PLcom/android/server/BatteryService$Led;->updateLightsLocked()V
+PLcom/android/server/BatteryService$LocalService;-><init>(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService$LocalService;-><init>(Lcom/android/server/BatteryService;Lcom/android/server/BatteryService$1;)V
+PLcom/android/server/BatteryService$LocalService;->getBatteryChargeCounter()I
+PLcom/android/server/BatteryService$LocalService;->getBatteryLevel()I
+PLcom/android/server/BatteryService$LocalService;->getBatteryLevelLow()Z
+PLcom/android/server/BatteryService$LocalService;->getPlugType()I
+PLcom/android/server/BatteryService$LocalService;->isPowered(I)Z
+PLcom/android/server/BatteryService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/BatteryService;->access$000(Lcom/android/server/BatteryService;)Ljava/lang/Object;
+PLcom/android/server/BatteryService;->access$1000(Lcom/android/server/BatteryService;)I
+PLcom/android/server/BatteryService;->access$1100(Lcom/android/server/BatteryService;Landroid/hardware/health/V2_0/HealthInfo;)V
+PLcom/android/server/BatteryService;->access$1200(Ljava/lang/String;)V
+PLcom/android/server/BatteryService;->access$1400()V
+PLcom/android/server/BatteryService;->access$1700(Lcom/android/server/BatteryService;)Lcom/android/server/BatteryService$HealthServiceWrapper;
+PLcom/android/server/BatteryService;->access$1800(Lcom/android/server/BatteryService;I)Z
+PLcom/android/server/BatteryService;->access$1900(Lcom/android/server/BatteryService;)I
+PLcom/android/server/BatteryService;->access$2000(Lcom/android/server/BatteryService;)Z
+PLcom/android/server/BatteryService;->access$500(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService;->access$800(Lcom/android/server/BatteryService;)Landroid/content/Context;
+PLcom/android/server/BatteryService;->access$900(Lcom/android/server/BatteryService;)Landroid/hardware/health/V1_0/HealthInfo;
+PLcom/android/server/BatteryService;->getIconLocked(I)I
+PLcom/android/server/BatteryService;->isPoweredLocked(I)Z
+PLcom/android/server/BatteryService;->lambda$D1kwd7L7yyqN5niz3KWkTepVmUk(Lcom/android/server/BatteryService;)V
+PLcom/android/server/BatteryService;->lambda$sendBatteryChangedIntentLocked$0(Landroid/content/Intent;)V
+PLcom/android/server/BatteryService;->logBatteryStatsLocked()V
+PLcom/android/server/BatteryService;->logOutlierLocked(J)V
+PLcom/android/server/BatteryService;->onBootPhase(I)V
+PLcom/android/server/BatteryService;->onStart()V
+PLcom/android/server/BatteryService;->processValuesLocked(Z)V
+PLcom/android/server/BatteryService;->registerHealthCallback()V
+PLcom/android/server/BatteryService;->sendBatteryChangedIntentLocked()V
+PLcom/android/server/BatteryService;->sendBatteryLevelChangedIntentLocked()V
+PLcom/android/server/BatteryService;->sendEnqueuedBatteryLevelChangedEvents()V
+PLcom/android/server/BatteryService;->shouldSendBatteryLowLocked()Z
+PLcom/android/server/BatteryService;->shutdownIfNoPowerLocked()V
+PLcom/android/server/BatteryService;->shutdownIfOverTempLocked()V
+PLcom/android/server/BatteryService;->traceBegin(Ljava/lang/String;)V
+PLcom/android/server/BatteryService;->traceEnd()V
+PLcom/android/server/BatteryService;->updateBatteryWarningLevelLocked()V
+PLcom/android/server/BinderCallsStatsService;-><init>()V
+PLcom/android/server/BinderCallsStatsService;->reset()V
+PLcom/android/server/BinderCallsStatsService;->start()V
+PLcom/android/server/BluetoothManagerService$1;-><init>(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService$1;->onBluetoothStateChange(II)V
+PLcom/android/server/BluetoothManagerService$2;-><init>(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService$2;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/BluetoothManagerService$3;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/os/Handler;)V
+PLcom/android/server/BluetoothManagerService$4;-><init>(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/BluetoothManagerService$5;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/os/Handler;)V
+PLcom/android/server/BluetoothManagerService$ActiveLog;-><init>(Lcom/android/server/BluetoothManagerService;ILjava/lang/String;ZJ)V
+PLcom/android/server/BluetoothManagerService$BluetoothHandler;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/os/Looper;)V
+PLcom/android/server/BluetoothManagerService$BluetoothHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/BluetoothManagerService$BluetoothServiceConnection;-><init>(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService$BluetoothServiceConnection;-><init>(Lcom/android/server/BluetoothManagerService;Lcom/android/server/BluetoothManagerService$1;)V
+PLcom/android/server/BluetoothManagerService$BluetoothServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/BluetoothManagerService$ClientDeathRecipient;-><init>(Lcom/android/server/BluetoothManagerService;Ljava/lang/String;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;-><init>(Lcom/android/server/BluetoothManagerService;Landroid/content/Intent;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$2000(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;)Z
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->access$3300(Lcom/android/server/BluetoothManagerService$ProfileServiceConnections;Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->addProxy(Landroid/bluetooth/IBluetoothProfileServiceConnection;)V
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->bindService()Z
+PLcom/android/server/BluetoothManagerService$ProfileServiceConnections;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/BluetoothManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/BluetoothManagerService;->access$1000(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetooth;
+PLcom/android/server/BluetoothManagerService;->access$1002(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetooth;)Landroid/bluetooth/IBluetooth;
+PLcom/android/server/BluetoothManagerService;->access$1300(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$1302(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->access$1700(Lcom/android/server/BluetoothManagerService;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/BluetoothManagerService;->access$200(Lcom/android/server/BluetoothManagerService;)Lcom/android/server/BluetoothManagerService$BluetoothHandler;
+PLcom/android/server/BluetoothManagerService;->access$2400(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$2402(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->access$2600(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$2602(Lcom/android/server/BluetoothManagerService;Z)Z
+PLcom/android/server/BluetoothManagerService;->access$2700(Lcom/android/server/BluetoothManagerService;Z)V
+PLcom/android/server/BluetoothManagerService;->access$3000(Lcom/android/server/BluetoothManagerService;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/BluetoothManagerService;->access$3100(Lcom/android/server/BluetoothManagerService;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/BluetoothManagerService;->access$3200(Lcom/android/server/BluetoothManagerService;)Ljava/util/Map;
+PLcom/android/server/BluetoothManagerService;->access$3402(Lcom/android/server/BluetoothManagerService;Landroid/bluetooth/IBluetoothGatt;)Landroid/bluetooth/IBluetoothGatt;
+PLcom/android/server/BluetoothManagerService;->access$3500(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService;->access$3602(Lcom/android/server/BluetoothManagerService;Landroid/os/IBinder;)Landroid/os/IBinder;
+PLcom/android/server/BluetoothManagerService;->access$3700(Lcom/android/server/BluetoothManagerService;)Z
+PLcom/android/server/BluetoothManagerService;->access$3800(Lcom/android/server/BluetoothManagerService;)Landroid/bluetooth/IBluetoothCallback;
+PLcom/android/server/BluetoothManagerService;->access$3900(Lcom/android/server/BluetoothManagerService;)V
+PLcom/android/server/BluetoothManagerService;->access$4002(Lcom/android/server/BluetoothManagerService;I)I
+PLcom/android/server/BluetoothManagerService;->access$4100(Lcom/android/server/BluetoothManagerService;II)V
+PLcom/android/server/BluetoothManagerService;->access$4300(Lcom/android/server/BluetoothManagerService;)I
+PLcom/android/server/BluetoothManagerService;->access$900(Lcom/android/server/BluetoothManagerService;)Ljava/util/concurrent/locks/ReentrantReadWriteLock;
+PLcom/android/server/BluetoothManagerService;->addActiveLog(ILjava/lang/String;Z)V
+PLcom/android/server/BluetoothManagerService;->bindBluetoothProfileService(ILandroid/bluetooth/IBluetoothProfileServiceConnection;)Z
+PLcom/android/server/BluetoothManagerService;->bluetoothStateChangeHandler(II)V
+PLcom/android/server/BluetoothManagerService;->checkIfCallerIsForegroundUser()Z
+PLcom/android/server/BluetoothManagerService;->continueFromBleOnState()V
+PLcom/android/server/BluetoothManagerService;->doBind(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/UserHandle;)Z
+PLcom/android/server/BluetoothManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/BluetoothManagerService;->getAddress()Ljava/lang/String;
+PLcom/android/server/BluetoothManagerService;->getBluetoothGatt()Landroid/bluetooth/IBluetoothGatt;
+PLcom/android/server/BluetoothManagerService;->handleEnable(Z)V
+PLcom/android/server/BluetoothManagerService;->handleOnBootPhase()V
+PLcom/android/server/BluetoothManagerService;->handleOnUnlockUser(I)V
+PLcom/android/server/BluetoothManagerService;->isAirplaneModeOn()Z
+PLcom/android/server/BluetoothManagerService;->isBleScanAlwaysAvailable()Z
+PLcom/android/server/BluetoothManagerService;->isBluetoothDisallowed()Z
+PLcom/android/server/BluetoothManagerService;->isBluetoothPersistedStateOn()Z
+PLcom/android/server/BluetoothManagerService;->isBluetoothPersistedStateOnBluetooth()Z
+PLcom/android/server/BluetoothManagerService;->isNameAndAddressSet()Z
+PLcom/android/server/BluetoothManagerService;->loadStoredNameAndAddress()V
+PLcom/android/server/BluetoothManagerService;->persistBluetoothSetting(I)V
+PLcom/android/server/BluetoothManagerService;->registerAdapter(Landroid/bluetooth/IBluetoothManagerCallback;)Landroid/bluetooth/IBluetooth;
+PLcom/android/server/BluetoothManagerService;->registerForBleScanModeChange()V
+PLcom/android/server/BluetoothManagerService;->registerStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
+PLcom/android/server/BluetoothManagerService;->sendBleStateChanged(II)V
+PLcom/android/server/BluetoothManagerService;->sendBluetoothServiceUpCallback()V
+PLcom/android/server/BluetoothManagerService;->sendBluetoothStateCallback(Z)V
+PLcom/android/server/BluetoothManagerService;->sendEnableMsg(ZILjava/lang/String;)V
+PLcom/android/server/BluetoothManagerService;->storeNameAndAddress(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/BluetoothManagerService;->supportBluetoothPersistedState()Z
+PLcom/android/server/BluetoothManagerService;->unregisterStateChangeCallback(Landroid/bluetooth/IBluetoothStateChangeCallback;)V
+PLcom/android/server/BluetoothManagerService;->updateBleAppCount(Landroid/os/IBinder;ZLjava/lang/String;)I
+PLcom/android/server/BluetoothService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/BluetoothService;->onBootPhase(I)V
+PLcom/android/server/BluetoothService;->onStart()V
+PLcom/android/server/BluetoothService;->onUnlockUser(I)V
+PLcom/android/server/CertBlacklister$BlacklistObserver;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentResolver;)V
+PLcom/android/server/CertBlacklister;-><init>(Landroid/content/Context;)V
+PLcom/android/server/CertBlacklister;->buildPubkeyObserver(Landroid/content/ContentResolver;)Lcom/android/server/CertBlacklister$BlacklistObserver;
+PLcom/android/server/CertBlacklister;->buildSerialObserver(Landroid/content/ContentResolver;)Lcom/android/server/CertBlacklister$BlacklistObserver;
+PLcom/android/server/CertBlacklister;->registerObservers(Landroid/content/ContentResolver;)V
+PLcom/android/server/CommonTimeManagementService$1;-><init>(Lcom/android/server/CommonTimeManagementService;)V
+PLcom/android/server/CommonTimeManagementService$2;-><init>(Lcom/android/server/CommonTimeManagementService;)V
+PLcom/android/server/CommonTimeManagementService$InterfaceScoreRule;-><init>(Ljava/lang/String;B)V
+PLcom/android/server/CommonTimeManagementService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/CommonTimeManagementService;->systemRunning()V
+PLcom/android/server/ConnectivityService$1;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$2;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$2;->isTetheringSupported()Z
+PLcom/android/server/ConnectivityService$3;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$3;->interfaceClassDataActivityChanged(Ljava/lang/String;ZJ)V
+PLcom/android/server/ConnectivityService$4;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$4;->onPrivateDnsValidationEvent(ILjava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/ConnectivityService$5;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$5;->onUidRulesChanged(II)V
+PLcom/android/server/ConnectivityService$6;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/ConnectivityService$7;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$7;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/ConnectivityService$InternalHandler;-><init>(Lcom/android/server/ConnectivityService;Landroid/os/Looper;)V
+PLcom/android/server/ConnectivityService$InternalHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;-><init>(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->add(ILcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->addSupportedType(I)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->getNetworkForType(I)Lcom/android/server/connectivity/NetworkAgentInfo;
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->isTypeSupported(I)Z
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->maybeLogBroadcast(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo$DetailedState;IZ)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->remove(ILcom/android/server/connectivity/NetworkAgentInfo;Z)V
+PLcom/android/server/ConnectivityService$LegacyTypeTracker;->remove(Lcom/android/server/connectivity/NetworkAgentInfo;Z)V
+PLcom/android/server/ConnectivityService$NetworkFactoryInfo;-><init>(Ljava/lang/String;Landroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;)V
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;-><init>(Lcom/android/server/ConnectivityService;Landroid/os/Messenger;Landroid/net/NetworkRequest;Landroid/os/IBinder;)V
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;->binderDied()V
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;->enforceRequestCountLimit()V
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;->toString()Ljava/lang/String;
+PLcom/android/server/ConnectivityService$NetworkRequestInfo;->unlinkDeathRecipient()V
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;-><init>(Lcom/android/server/ConnectivityService;Landroid/os/Looper;)V
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->getCaptivePortalMode()I
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->maybeHandleAsyncChannelMessage(Landroid/os/Message;)Z
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->maybeHandleNetworkAgentInfoMessage(Landroid/os/Message;)Z
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->maybeHandleNetworkAgentMessage(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService$NetworkStateTrackerHandler;->maybeHandleNetworkMonitorMessage(Landroid/os/Message;)Z
+PLcom/android/server/ConnectivityService$ReapUnvalidatedNetworks;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/ConnectivityService$SettingsObserver;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/ConnectivityService$SettingsObserver;->observe(Landroid/net/Uri;I)V
+PLcom/android/server/ConnectivityService$UnneededFor;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/ConnectivityService$UnneededFor;->values()[Lcom/android/server/ConnectivityService$UnneededFor;
+PLcom/android/server/ConnectivityService$ValidationLog;-><init>(Landroid/net/Network;Ljava/lang/String;Landroid/util/LocalLog$ReadOnlyLocalLog;)V
+PLcom/android/server/ConnectivityService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/net/INetworkStatsService;Landroid/net/INetworkPolicyManager;)V
+PLcom/android/server/ConnectivityService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/net/INetworkStatsService;Landroid/net/INetworkPolicyManager;Landroid/net/metrics/IpConnectivityLog;)V
+PLcom/android/server/ConnectivityService;->access$000(Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->access$100(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)Z
+PLcom/android/server/ConnectivityService;->access$1000(Lcom/android/server/ConnectivityService;)Ljava/util/HashMap;
+PLcom/android/server/ConnectivityService;->access$1100(Lcom/android/server/ConnectivityService;Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService;->access$1300(Lcom/android/server/ConnectivityService;ILcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->access$1400(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo;)V
+PLcom/android/server/ConnectivityService;->access$1500(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/ConnectivityService;->access$1700(Lcom/android/server/ConnectivityService;I)Lcom/android/server/connectivity/NetworkAgentInfo;
+PLcom/android/server/ConnectivityService;->access$1800(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->access$1900(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->access$200(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo$DetailedState;I)V
+PLcom/android/server/ConnectivityService;->access$2100(I)Z
+PLcom/android/server/ConnectivityService;->access$2300(Lcom/android/server/ConnectivityService;)Lcom/android/server/connectivity/NetworkNotificationManager;
+PLcom/android/server/ConnectivityService;->access$2500(Lcom/android/server/ConnectivityService;)Landroid/content/Context;
+PLcom/android/server/ConnectivityService;->access$2800(Lcom/android/server/ConnectivityService;I)V
+PLcom/android/server/ConnectivityService;->access$2900(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService;->access$3100(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkFactoryInfo;)V
+PLcom/android/server/ConnectivityService;->access$3300(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->access$3400(Lcom/android/server/ConnectivityService;Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->access$3800(Lcom/android/server/ConnectivityService;Landroid/net/NetworkRequest;I)V
+PLcom/android/server/ConnectivityService;->access$400(Lcom/android/server/ConnectivityService;)Z
+PLcom/android/server/ConnectivityService;->access$4100(Lcom/android/server/ConnectivityService;Landroid/net/Network;)V
+PLcom/android/server/ConnectivityService;->access$4200(Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/ConnectivityService;->access$4400(Lcom/android/server/ConnectivityService;Landroid/net/Network;IZ)V
+PLcom/android/server/ConnectivityService;->access$4600(Lcom/android/server/ConnectivityService;Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationUpdate;)V
+PLcom/android/server/ConnectivityService;->access$4700(Lcom/android/server/ConnectivityService;I)V
+PLcom/android/server/ConnectivityService;->access$500(Lcom/android/server/ConnectivityService;IZJ)V
+PLcom/android/server/ConnectivityService;->access$5100(Lcom/android/server/ConnectivityService;I)V
+PLcom/android/server/ConnectivityService;->access$5200(Lcom/android/server/ConnectivityService;Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->access$5300(Lcom/android/server/ConnectivityService;)Landroid/util/SparseIntArray;
+PLcom/android/server/ConnectivityService;->access$600(Lcom/android/server/ConnectivityService;)Lcom/android/server/ConnectivityService$InternalHandler;
+PLcom/android/server/ConnectivityService;->access$900(Lcom/android/server/ConnectivityService;Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService;->addValidationLogs(Landroid/util/LocalLog$ReadOnlyLocalLog;Landroid/net/Network;Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->avoidBadWifi()Z
+PLcom/android/server/ConnectivityService;->callCallbackForRequest(Lcom/android/server/ConnectivityService$NetworkRequestInfo;Lcom/android/server/connectivity/NetworkAgentInfo;II)V
+PLcom/android/server/ConnectivityService;->canonicalizeProxyInfo(Landroid/net/ProxyInfo;)Landroid/net/ProxyInfo;
+PLcom/android/server/ConnectivityService;->checkSettingsPermission()Z
+PLcom/android/server/ConnectivityService;->clearNetworkForRequest(I)V
+PLcom/android/server/ConnectivityService;->createDefaultInternetRequestForTransport(ILandroid/net/NetworkRequest$Type;)Landroid/net/NetworkRequest;
+PLcom/android/server/ConnectivityService;->createDefaultNetworkCapabilitiesForUid(I)Landroid/net/NetworkCapabilities;
+PLcom/android/server/ConnectivityService;->createMultinetworkPolicyTracker(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/Runnable;)Landroid/net/util/MultinetworkPolicyTracker;
+PLcom/android/server/ConnectivityService;->createNetworkMonitor(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkRequest;)Lcom/android/server/connectivity/NetworkMonitor;
+PLcom/android/server/ConnectivityService;->createVpnInfo(Lcom/android/server/connectivity/Vpn;)Lcom/android/internal/net/VpnInfo;
+PLcom/android/server/ConnectivityService;->disconnectAndDestroyNetwork(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->encodeBool(Z)I
+PLcom/android/server/ConnectivityService;->enforceChangePermission()V
+PLcom/android/server/ConnectivityService;->enforceCrossUserPermission(I)V
+PLcom/android/server/ConnectivityService;->enforceInternetPermission()V
+PLcom/android/server/ConnectivityService;->enforceMeteredApnPolicy(Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->enforceNetworkRequestPermissions(Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->enforceTetherAccessPermission()V
+PLcom/android/server/ConnectivityService;->ensureNetworkRequestHasType(Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->ensureNetworkTransitionWakelock(Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->ensureRequestableCapabilities(Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->ensureSufficientPermissionsForRequest(Landroid/net/NetworkCapabilities;II)V
+PLcom/android/server/ConnectivityService;->ensureValidNetworkSpecifier(Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->eventName(I)Ljava/lang/String;
+PLcom/android/server/ConnectivityService;->getActiveLinkProperties()Landroid/net/LinkProperties;
+PLcom/android/server/ConnectivityService;->getAllNetworkInfo()[Landroid/net/NetworkInfo;
+PLcom/android/server/ConnectivityService;->getAllNetworkState()[Landroid/net/NetworkState;
+PLcom/android/server/ConnectivityService;->getAllNetworks()[Landroid/net/Network;
+PLcom/android/server/ConnectivityService;->getAllVpnInfo()[Lcom/android/internal/net/VpnInfo;
+PLcom/android/server/ConnectivityService;->getDefaultNetworkCapabilitiesForUser(I)[Landroid/net/NetworkCapabilities;
+PLcom/android/server/ConnectivityService;->getDefaultNetworks()[Landroid/net/Network;
+PLcom/android/server/ConnectivityService;->getDefaultProxy()Landroid/net/ProxyInfo;
+PLcom/android/server/ConnectivityService;->getFilteredNetworkState(IIZ)Landroid/net/NetworkState;
+PLcom/android/server/ConnectivityService;->getGlobalProxy()Landroid/net/ProxyInfo;
+PLcom/android/server/ConnectivityService;->getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;
+PLcom/android/server/ConnectivityService;->getLinkProperties(Lcom/android/server/connectivity/NetworkAgentInfo;)Landroid/net/LinkProperties;
+PLcom/android/server/ConnectivityService;->getNetworkInfo(I)Landroid/net/NetworkInfo;
+PLcom/android/server/ConnectivityService;->getNetworkPermission(Landroid/net/NetworkCapabilities;)Ljava/lang/String;
+PLcom/android/server/ConnectivityService;->getNriForAppRequest(Landroid/net/NetworkRequest;ILjava/lang/String;)Lcom/android/server/ConnectivityService$NetworkRequestInfo;
+PLcom/android/server/ConnectivityService;->getProxyForNetwork(Landroid/net/Network;)Landroid/net/ProxyInfo;
+PLcom/android/server/ConnectivityService;->getSignalStrengthThresholds(Lcom/android/server/connectivity/NetworkAgentInfo;)Ljava/util/ArrayList;
+PLcom/android/server/ConnectivityService;->getSystemProperties()Lcom/android/server/connectivity/MockableSystemProperties;
+PLcom/android/server/ConnectivityService;->getTetherableBluetoothRegexs()[Ljava/lang/String;
+PLcom/android/server/ConnectivityService;->getTetherableUsbRegexs()[Ljava/lang/String;
+PLcom/android/server/ConnectivityService;->getTetherableWifiRegexs()[Ljava/lang/String;
+PLcom/android/server/ConnectivityService;->getTetheredIfaces()[Ljava/lang/String;
+PLcom/android/server/ConnectivityService;->getVpnConfig(I)Lcom/android/internal/net/VpnConfig;
+PLcom/android/server/ConnectivityService;->handleApplyDefaultProxy(Landroid/net/ProxyInfo;)V
+PLcom/android/server/ConnectivityService;->handleAsyncChannelDisconnected(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService;->handleAsyncChannelHalfConnect(Landroid/os/Message;)V
+PLcom/android/server/ConnectivityService;->handleDeprecatedGlobalHttpProxy()V
+PLcom/android/server/ConnectivityService;->handleMobileDataAlwaysOn()V
+PLcom/android/server/ConnectivityService;->handlePerNetworkPrivateDnsConfig(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/connectivity/DnsManager$PrivateDnsConfig;)V
+PLcom/android/server/ConnectivityService;->handlePrivateDnsValidationUpdate(Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationUpdate;)V
+PLcom/android/server/ConnectivityService;->handlePromptUnvalidated(Landroid/net/Network;)V
+PLcom/android/server/ConnectivityService;->handleRegisterNetworkAgent(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->handleRegisterNetworkFactory(Lcom/android/server/ConnectivityService$NetworkFactoryInfo;)V
+PLcom/android/server/ConnectivityService;->handleRegisterNetworkRequest(Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->handleReleaseNetworkRequest(Landroid/net/NetworkRequest;I)V
+PLcom/android/server/ConnectivityService;->handleReleaseNetworkTransitionWakelock(I)V
+PLcom/android/server/ConnectivityService;->handleRemoveNetworkRequest(Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->handleReportNetworkConnectivity(Landroid/net/Network;IZ)V
+PLcom/android/server/ConnectivityService;->handleUpdateLinkProperties(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/LinkProperties;)V
+PLcom/android/server/ConnectivityService;->hasWifiNetworkListenPermission(Landroid/net/NetworkCapabilities;)Z
+PLcom/android/server/ConnectivityService;->isDefaultNetwork(Lcom/android/server/connectivity/NetworkAgentInfo;)Z
+PLcom/android/server/ConnectivityService;->isDefaultRequest(Lcom/android/server/ConnectivityService$NetworkRequestInfo;)Z
+PLcom/android/server/ConnectivityService;->isNetworkSupported(I)Z
+PLcom/android/server/ConnectivityService;->isTetheringSupported()Z
+PLcom/android/server/ConnectivityService;->isTetheringSupported(Ljava/lang/String;)Z
+PLcom/android/server/ConnectivityService;->listenForNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;Landroid/os/IBinder;)Landroid/net/NetworkRequest;
+PLcom/android/server/ConnectivityService;->loadGlobalProxy()V
+PLcom/android/server/ConnectivityService;->log(Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->makeDefault(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->makeGeneralIntent(Landroid/net/NetworkInfo;Ljava/lang/String;)Landroid/content/Intent;
+PLcom/android/server/ConnectivityService;->makeTethering()Lcom/android/server/connectivity/Tethering;
+PLcom/android/server/ConnectivityService;->metricsLogger()Lcom/android/server/connectivity/IpConnectivityMetrics$Logger;
+PLcom/android/server/ConnectivityService;->mixInCapabilities(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkCapabilities;)Landroid/net/NetworkCapabilities;
+PLcom/android/server/ConnectivityService;->networkRequiresValidation(Lcom/android/server/connectivity/NetworkAgentInfo;)Z
+PLcom/android/server/ConnectivityService;->nextNetworkRequestId()I
+PLcom/android/server/ConnectivityService;->notifyIfacesChangedForNetworkStats()V
+PLcom/android/server/ConnectivityService;->notifyLockdownVpn(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->notifyNetworkAvailable(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/ConnectivityService$NetworkRequestInfo;)V
+PLcom/android/server/ConnectivityService;->notifyNetworkCallbacks(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/ConnectivityService;->notifyNetworkCallbacks(Lcom/android/server/connectivity/NetworkAgentInfo;II)V
+PLcom/android/server/ConnectivityService;->onUserStart(I)V
+PLcom/android/server/ConnectivityService;->onUserUnlocked(I)V
+PLcom/android/server/ConnectivityService;->proxyInfoEqual(Landroid/net/ProxyInfo;Landroid/net/ProxyInfo;)Z
+PLcom/android/server/ConnectivityService;->registerNetdEventCallback()V
+PLcom/android/server/ConnectivityService;->registerNetworkAgent(Landroid/os/Messenger;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/net/NetworkMisc;)I
+PLcom/android/server/ConnectivityService;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->registerPrivateDnsSettingsCallbacks()V
+PLcom/android/server/ConnectivityService;->registerSettingsCallbacks()V
+PLcom/android/server/ConnectivityService;->releaseNetworkRequest(Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->rematchAllNetworksAndRequests(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/ConnectivityService;->removeDataActivityTracking(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->reportNetworkConnectivity(Landroid/net/Network;Z)V
+PLcom/android/server/ConnectivityService;->requestNetwork(Landroid/net/NetworkCapabilities;Landroid/os/Messenger;ILandroid/os/IBinder;I)Landroid/net/NetworkRequest;
+PLcom/android/server/ConnectivityService;->reserveNetId()I
+PLcom/android/server/ConnectivityService;->restrictBackgroundRequestForCaller(Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->restrictRequestUidsForCaller(Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->scheduleReleaseNetworkTransitionWakelock()V
+PLcom/android/server/ConnectivityService;->scheduleUnvalidatedPrompt(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->sendConnectedBroadcast(Landroid/net/NetworkInfo;)V
+PLcom/android/server/ConnectivityService;->sendGeneralBroadcast(Landroid/net/NetworkInfo;Ljava/lang/String;)V
+PLcom/android/server/ConnectivityService;->sendInetConditionBroadcast(Landroid/net/NetworkInfo;)V
+PLcom/android/server/ConnectivityService;->sendLegacyNetworkBroadcast(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo$DetailedState;I)V
+PLcom/android/server/ConnectivityService;->sendStickyBroadcast(Landroid/content/Intent;)V
+PLcom/android/server/ConnectivityService;->sendUpdatedScoreToFactories(Landroid/net/NetworkRequest;I)V
+PLcom/android/server/ConnectivityService;->sendUpdatedScoreToFactories(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->setLockdownTracker(Lcom/android/server/net/LockdownVpnTracker;)V
+PLcom/android/server/ConnectivityService;->setNetworkForRequest(ILcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->setupDataActivityTracking(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->startAlwaysOnVpn(I)Z
+PLcom/android/server/ConnectivityService;->systemReady()V
+PLcom/android/server/ConnectivityService;->toBool(I)Z
+PLcom/android/server/ConnectivityService;->unneeded(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/ConnectivityService$UnneededFor;)Z
+PLcom/android/server/ConnectivityService;->updateAllVpnsCapabilities()V
+PLcom/android/server/ConnectivityService;->updateCapabilities(ILcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->updateDnses(Landroid/net/LinkProperties;Landroid/net/LinkProperties;I)V
+PLcom/android/server/ConnectivityService;->updateInetCondition(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->updateInterfaces(Landroid/net/LinkProperties;Landroid/net/LinkProperties;ILandroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->updateLingerState(Lcom/android/server/connectivity/NetworkAgentInfo;J)V
+PLcom/android/server/ConnectivityService;->updateLinkProperties(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/LinkProperties;)V
+PLcom/android/server/ConnectivityService;->updateLockdownVpn()Z
+PLcom/android/server/ConnectivityService;->updateMtu(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)V
+PLcom/android/server/ConnectivityService;->updateNetworkInfo(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkInfo;)V
+PLcom/android/server/ConnectivityService;->updateNetworkScore(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/ConnectivityService;->updatePrivateDns(Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/connectivity/DnsManager$PrivateDnsConfig;)V
+PLcom/android/server/ConnectivityService;->updateProxy(Landroid/net/LinkProperties;Landroid/net/LinkProperties;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->updateRoutes(Landroid/net/LinkProperties;Landroid/net/LinkProperties;I)Z
+PLcom/android/server/ConnectivityService;->updateSignalStrengthThresholds(Lcom/android/server/connectivity/NetworkAgentInfo;Ljava/lang/String;Landroid/net/NetworkRequest;)V
+PLcom/android/server/ConnectivityService;->updateTcpBufferSizes(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/ConnectivityService;->updateUids(Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/ConnectivityService;->wakeupModifyInterface(Ljava/lang/String;Landroid/net/NetworkCapabilities;Z)V
+PLcom/android/server/ConsumerIrService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/ContextHubSystemService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/ContextHubSystemService;->lambda$new$0(Lcom/android/server/ContextHubSystemService;Landroid/content/Context;)V
+PLcom/android/server/ContextHubSystemService;->onBootPhase(I)V
+PLcom/android/server/ContextHubSystemService;->onStart()V
+PLcom/android/server/CountryDetectorService$1;-><init>(Lcom/android/server/CountryDetectorService;)V
+PLcom/android/server/CountryDetectorService$2;-><init>(Lcom/android/server/CountryDetectorService;Landroid/location/CountryListener;)V
+PLcom/android/server/CountryDetectorService$2;->run()V
+PLcom/android/server/CountryDetectorService$Receiver;-><init>(Lcom/android/server/CountryDetectorService;Landroid/location/ICountryListener;)V
+PLcom/android/server/CountryDetectorService$Receiver;->binderDied()V
+PLcom/android/server/CountryDetectorService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/CountryDetectorService;->access$000(Lcom/android/server/CountryDetectorService;Landroid/os/IBinder;)V
+PLcom/android/server/CountryDetectorService;->access$200(Lcom/android/server/CountryDetectorService;)Lcom/android/server/location/ComprehensiveCountryDetector;
+PLcom/android/server/CountryDetectorService;->addCountryListener(Landroid/location/ICountryListener;)V
+PLcom/android/server/CountryDetectorService;->addListener(Landroid/location/ICountryListener;)V
+PLcom/android/server/CountryDetectorService;->detectCountry()Landroid/location/Country;
+PLcom/android/server/CountryDetectorService;->initialize()V
+PLcom/android/server/CountryDetectorService;->removeListener(Landroid/os/IBinder;)V
+PLcom/android/server/CountryDetectorService;->run()V
+PLcom/android/server/CountryDetectorService;->setCountryListener(Landroid/location/CountryListener;)V
+PLcom/android/server/CountryDetectorService;->systemRunning()V
+PLcom/android/server/DeviceIdleController$1;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/DeviceIdleController$2;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$2;->onAlarm()V
+PLcom/android/server/DeviceIdleController$3;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$4;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$4;->onAlarm()V
+PLcom/android/server/DeviceIdleController$5;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$5;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/DeviceIdleController$6;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/DeviceIdleController$7;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$7;->onLocationChanged(Landroid/location/Location;)V
+PLcom/android/server/DeviceIdleController$8;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$9;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$9;->onAwakeStateChanged(Z)V
+PLcom/android/server/DeviceIdleController$9;->onKeyguardStateChanged(Z)V
+PLcom/android/server/DeviceIdleController$BinderService;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$BinderService;-><init>(Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController$1;)V
+PLcom/android/server/DeviceIdleController$BinderService;->exitIdle(Ljava/lang/String;)V
+PLcom/android/server/DeviceIdleController$BinderService;->getAppIdWhitelist()[I
+PLcom/android/server/DeviceIdleController$BinderService;->getAppIdWhitelistExceptIdle()[I
+PLcom/android/server/DeviceIdleController$BinderService;->isPowerSaveWhitelistApp(Ljava/lang/String;)Z
+PLcom/android/server/DeviceIdleController$Constants;-><init>(Lcom/android/server/DeviceIdleController;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/DeviceIdleController$Constants;->updateConstants()V
+PLcom/android/server/DeviceIdleController$LocalService;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$LocalService;->addPowerSaveTempWhitelistApp(ILjava/lang/String;JIZLjava/lang/String;)V
+PLcom/android/server/DeviceIdleController$LocalService;->addPowerSaveTempWhitelistAppDirect(IJZLjava/lang/String;)V
+PLcom/android/server/DeviceIdleController$LocalService;->getNotificationWhitelistDuration()J
+PLcom/android/server/DeviceIdleController$LocalService;->getPowerSaveTempWhitelistAppIds()[I
+PLcom/android/server/DeviceIdleController$LocalService;->getPowerSaveWhitelistUserAppIds()[I
+PLcom/android/server/DeviceIdleController$LocalService;->setAlarmsActive(Z)V
+PLcom/android/server/DeviceIdleController$LocalService;->setJobsActive(Z)V
+PLcom/android/server/DeviceIdleController$MotionListener;-><init>(Lcom/android/server/DeviceIdleController;)V
+PLcom/android/server/DeviceIdleController$MotionListener;-><init>(Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController$1;)V
+PLcom/android/server/DeviceIdleController$MotionListener;->registerLocked()Z
+PLcom/android/server/DeviceIdleController$MotionListener;->unregisterLocked()V
+PLcom/android/server/DeviceIdleController$MyHandler;-><init>(Lcom/android/server/DeviceIdleController;Landroid/os/Looper;)V
+PLcom/android/server/DeviceIdleController$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/DeviceIdleController;-><init>(Landroid/content/Context;)V
+PLcom/android/server/DeviceIdleController;->access$100(Lcom/android/server/DeviceIdleController;)Lcom/android/server/DeviceIdleController$Constants;
+PLcom/android/server/DeviceIdleController;->access$1000(Lcom/android/server/DeviceIdleController;)Landroid/content/Intent;
+PLcom/android/server/DeviceIdleController;->access$1100(Lcom/android/server/DeviceIdleController;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/DeviceIdleController;->access$1200(Lcom/android/server/DeviceIdleController;)Landroid/content/BroadcastReceiver;
+PLcom/android/server/DeviceIdleController;->access$1300(Lcom/android/server/DeviceIdleController;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/DeviceIdleController;->access$1400(Lcom/android/server/DeviceIdleController;)Lcom/android/server/net/NetworkPolicyManagerInternal;
+PLcom/android/server/DeviceIdleController;->access$200(Lcom/android/server/DeviceIdleController;)Landroid/hardware/Sensor;
+PLcom/android/server/DeviceIdleController;->access$300(Lcom/android/server/DeviceIdleController;)Landroid/hardware/SensorManager;
+PLcom/android/server/DeviceIdleController;->access$400(Lcom/android/server/DeviceIdleController;)Lcom/android/server/DeviceIdleController$MotionListener;
+PLcom/android/server/DeviceIdleController;->access$600(Lcom/android/server/DeviceIdleController;)Landroid/os/PowerManagerInternal;
+PLcom/android/server/DeviceIdleController;->access$700(Lcom/android/server/DeviceIdleController;)Landroid/net/INetworkPolicyManager;
+PLcom/android/server/DeviceIdleController;->access$800(Lcom/android/server/DeviceIdleController;)Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/DeviceIdleController;->access$900(Lcom/android/server/DeviceIdleController;)Landroid/content/Intent;
+PLcom/android/server/DeviceIdleController;->addEvent(ILjava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->addPowerSaveTempWhitelistAppDirectInternal(IIJZLjava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->addPowerSaveTempWhitelistAppInternal(ILjava/lang/String;JIZLjava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->becomeActiveLocked(Ljava/lang/String;I)V
+PLcom/android/server/DeviceIdleController;->becomeInactiveIfAppropriateLocked()V
+PLcom/android/server/DeviceIdleController;->buildAppIdArray(Landroid/util/ArrayMap;Landroid/util/ArrayMap;Landroid/util/SparseBooleanArray;)[I
+PLcom/android/server/DeviceIdleController;->cancelAlarmLocked()V
+PLcom/android/server/DeviceIdleController;->cancelLightAlarmLocked()V
+PLcom/android/server/DeviceIdleController;->cancelLocatingLocked()V
+PLcom/android/server/DeviceIdleController;->cancelSensingTimeoutAlarmLocked()V
+PLcom/android/server/DeviceIdleController;->checkTempAppWhitelistTimeout(I)V
+PLcom/android/server/DeviceIdleController;->decActiveIdleOps()V
+PLcom/android/server/DeviceIdleController;->exitIdleInternal(Ljava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->exitMaintenanceEarlyIfNeededLocked()V
+PLcom/android/server/DeviceIdleController;->getAppIdTempWhitelistInternal()[I
+PLcom/android/server/DeviceIdleController;->getAppIdWhitelistExceptIdleInternal()[I
+PLcom/android/server/DeviceIdleController;->getAppIdWhitelistInternal()[I
+PLcom/android/server/DeviceIdleController;->getPowerSaveWhitelistUserAppIds()[I
+PLcom/android/server/DeviceIdleController;->getSystemDir()Ljava/io/File;
+PLcom/android/server/DeviceIdleController;->incActiveIdleOps()V
+PLcom/android/server/DeviceIdleController;->isOpsInactiveLocked()Z
+PLcom/android/server/DeviceIdleController;->isPowerSaveWhitelistAppInternal(Ljava/lang/String;)Z
+PLcom/android/server/DeviceIdleController;->keyguardShowingLocked(Z)V
+PLcom/android/server/DeviceIdleController;->onAnyMotionResult(I)V
+PLcom/android/server/DeviceIdleController;->onAppRemovedFromTempWhitelistLocked(ILjava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->onBootPhase(I)V
+PLcom/android/server/DeviceIdleController;->onStart()V
+PLcom/android/server/DeviceIdleController;->passWhiteListsToForceAppStandbyTrackerLocked()V
+PLcom/android/server/DeviceIdleController;->postTempActiveTimeoutMessage(IJ)V
+PLcom/android/server/DeviceIdleController;->readConfigFileLocked()V
+PLcom/android/server/DeviceIdleController;->receivedGenericLocationLocked(Landroid/location/Location;)V
+PLcom/android/server/DeviceIdleController;->reportMaintenanceActivityIfNeededLocked()V
+PLcom/android/server/DeviceIdleController;->reportTempWhitelistChangedLocked()V
+PLcom/android/server/DeviceIdleController;->resetIdleManagementLocked()V
+PLcom/android/server/DeviceIdleController;->resetLightIdleManagementLocked()V
+PLcom/android/server/DeviceIdleController;->scheduleAlarmLocked(JZ)V
+PLcom/android/server/DeviceIdleController;->scheduleLightAlarmLocked(J)V
+PLcom/android/server/DeviceIdleController;->scheduleReportActiveLocked(Ljava/lang/String;I)V
+PLcom/android/server/DeviceIdleController;->scheduleSensingTimeoutAlarmLocked(J)V
+PLcom/android/server/DeviceIdleController;->setAlarmsActive(Z)V
+PLcom/android/server/DeviceIdleController;->setJobsActive(Z)V
+PLcom/android/server/DeviceIdleController;->startMonitoringMotionLocked()V
+PLcom/android/server/DeviceIdleController;->stepIdleStateLocked(Ljava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->stepLightIdleStateLocked(Ljava/lang/String;)V
+PLcom/android/server/DeviceIdleController;->stopMonitoringMotionLocked()V
+PLcom/android/server/DeviceIdleController;->updateChargingLocked(Z)V
+PLcom/android/server/DeviceIdleController;->updateConnectivityState(Landroid/content/Intent;)V
+PLcom/android/server/DeviceIdleController;->updateInteractivityLocked()V
+PLcom/android/server/DeviceIdleController;->updateTempWhitelistAppIdsLocked(IZ)V
+PLcom/android/server/DeviceIdleController;->updateWhitelistAppIdsLocked()V
+PLcom/android/server/DiskStatsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/DiskStatsService;->getRecentPerf()I
+PLcom/android/server/DiskStatsService;->hasOption([Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/DiskStatsService;->reportCachedValues(Ljava/io/PrintWriter;)V
+PLcom/android/server/DiskStatsService;->reportDiskWriteSpeed(Ljava/io/PrintWriter;)V
+PLcom/android/server/DiskStatsService;->reportFreeSpace(Ljava/io/File;Ljava/lang/String;Ljava/io/PrintWriter;Landroid/util/proto/ProtoOutputStream;I)V
+PLcom/android/server/DockObserver$1;-><init>(Lcom/android/server/DockObserver;Z)V
+PLcom/android/server/DockObserver$2;-><init>(Lcom/android/server/DockObserver;)V
+PLcom/android/server/DockObserver$BinderService;-><init>(Lcom/android/server/DockObserver;)V
+PLcom/android/server/DockObserver$BinderService;-><init>(Lcom/android/server/DockObserver;Lcom/android/server/DockObserver$1;)V
+PLcom/android/server/DockObserver;-><init>(Landroid/content/Context;)V
+PLcom/android/server/DockObserver;->init()V
+PLcom/android/server/DockObserver;->onBootPhase(I)V
+PLcom/android/server/DockObserver;->onStart()V
+PLcom/android/server/DropBoxManagerService$1$1;-><init>(Lcom/android/server/DropBoxManagerService$1;)V
+PLcom/android/server/DropBoxManagerService$1$1;->run()V
+PLcom/android/server/DropBoxManagerService$1;-><init>(Lcom/android/server/DropBoxManagerService;)V
+PLcom/android/server/DropBoxManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/DropBoxManagerService$2;-><init>(Lcom/android/server/DropBoxManagerService;)V
+PLcom/android/server/DropBoxManagerService$2;->add(Landroid/os/DropBoxManager$Entry;)V
+PLcom/android/server/DropBoxManagerService$2;->getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;
+PLcom/android/server/DropBoxManagerService$2;->isTagEnabled(Ljava/lang/String;)Z
+PLcom/android/server/DropBoxManagerService$3;-><init>(Lcom/android/server/DropBoxManagerService;Landroid/os/Looper;)V
+PLcom/android/server/DropBoxManagerService$3;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/DropBoxManagerService$4;-><init>(Lcom/android/server/DropBoxManagerService;Landroid/os/Handler;)V
+PLcom/android/server/DropBoxManagerService$4;->onChange(Z)V
+PLcom/android/server/DropBoxManagerService$EntryFile;-><init>(J)V
+PLcom/android/server/DropBoxManagerService$EntryFile;-><init>(Ljava/io/File;I)V
+PLcom/android/server/DropBoxManagerService$EntryFile;-><init>(Ljava/io/File;Ljava/io/File;Ljava/lang/String;JII)V
+PLcom/android/server/DropBoxManagerService$EntryFile;->getExtension()Ljava/lang/String;
+PLcom/android/server/DropBoxManagerService$EntryFile;->getFile(Ljava/io/File;)Ljava/io/File;
+PLcom/android/server/DropBoxManagerService$EntryFile;->getFilename()Ljava/lang/String;
+PLcom/android/server/DropBoxManagerService$FileList;-><init>()V
+PLcom/android/server/DropBoxManagerService$FileList;-><init>(Lcom/android/server/DropBoxManagerService$1;)V
+PLcom/android/server/DropBoxManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/DropBoxManagerService;-><init>(Landroid/content/Context;Ljava/io/File;Landroid/os/Looper;)V
+PLcom/android/server/DropBoxManagerService;->access$002(Lcom/android/server/DropBoxManagerService;J)J
+PLcom/android/server/DropBoxManagerService;->access$100(Lcom/android/server/DropBoxManagerService;)V
+PLcom/android/server/DropBoxManagerService;->access$200(Lcom/android/server/DropBoxManagerService;)J
+PLcom/android/server/DropBoxManagerService;->access$300(Lcom/android/server/DropBoxManagerService;)Landroid/content/BroadcastReceiver;
+PLcom/android/server/DropBoxManagerService;->enrollEntry(Lcom/android/server/DropBoxManagerService$EntryFile;)V
+PLcom/android/server/DropBoxManagerService;->getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;
+PLcom/android/server/DropBoxManagerService;->init()V
+PLcom/android/server/DropBoxManagerService;->onBootPhase(I)V
+PLcom/android/server/DropBoxManagerService;->onStart()V
+PLcom/android/server/EntropyMixer$1;-><init>(Lcom/android/server/EntropyMixer;Landroid/os/Looper;)V
+PLcom/android/server/EntropyMixer$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/EntropyMixer$2;-><init>(Lcom/android/server/EntropyMixer;)V
+PLcom/android/server/EntropyMixer$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/EntropyMixer;-><init>(Landroid/content/Context;)V
+PLcom/android/server/EntropyMixer;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/EntropyMixer;->access$000(Lcom/android/server/EntropyMixer;)V
+PLcom/android/server/EntropyMixer;->access$100(Lcom/android/server/EntropyMixer;)V
+PLcom/android/server/EntropyMixer;->access$200(Lcom/android/server/EntropyMixer;)V
+PLcom/android/server/EntropyMixer;->addDeviceSpecificEntropy()V
+PLcom/android/server/EntropyMixer;->addHwRandomEntropy()V
+PLcom/android/server/EntropyMixer;->getSystemDir()Ljava/lang/String;
+PLcom/android/server/EntropyMixer;->loadInitialEntropy()V
+PLcom/android/server/EntropyMixer;->scheduleEntropyWriter()V
+PLcom/android/server/EntropyMixer;->writeEntropy()V
+PLcom/android/server/EventLogTags;->writeBatterySaverSetting(I)V
+PLcom/android/server/EventLogTags;->writeBatterySavingStats(IIIJIIJII)V
+PLcom/android/server/EventLogTags;->writeDeviceIdle(ILjava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeDeviceIdleLight(ILjava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeDeviceIdleLightStep()V
+PLcom/android/server/EventLogTags;->writeDeviceIdleOffComplete()V
+PLcom/android/server/EventLogTags;->writeDeviceIdleOffPhase(Ljava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeDeviceIdleOffStart(Ljava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeDeviceIdleOnComplete()V
+PLcom/android/server/EventLogTags;->writeDeviceIdleOnPhase(Ljava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeDeviceIdleOnStart()V
+PLcom/android/server/EventLogTags;->writeDeviceIdleStep()V
+PLcom/android/server/EventLogTags;->writeNetstatsMobileSample(JJJJJJJJJJJJJ)V
+PLcom/android/server/EventLogTags;->writeNetstatsWifiSample(JJJJJJJJJJJJJ)V
+PLcom/android/server/EventLogTags;->writeNotificationAlert(Ljava/lang/String;III)V
+PLcom/android/server/EventLogTags;->writeNotificationCancel(IILjava/lang/String;ILjava/lang/String;IIIILjava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeNotificationCancelAll(IILjava/lang/String;IIIILjava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeNotificationCanceled(Ljava/lang/String;IIIIIILjava/lang/String;)V
+PLcom/android/server/EventLogTags;->writeNotificationClicked(Ljava/lang/String;IIIII)V
+PLcom/android/server/EventLogTags;->writeNotificationExpansion(Ljava/lang/String;IIIII)V
+PLcom/android/server/EventLogTags;->writeNotificationPanelHidden()V
+PLcom/android/server/EventLogTags;->writeNotificationPanelRevealed(I)V
+PLcom/android/server/EventLogTags;->writeNotificationVisibility(Ljava/lang/String;IIIII)V
+PLcom/android/server/EventLogTags;->writePowerScreenState(IIJII)V
+PLcom/android/server/EventLogTags;->writePowerSleepRequested(I)V
+PLcom/android/server/EventLogTags;->writeStorageState(Ljava/lang/String;IIJJ)V
+PLcom/android/server/EventLogTags;->writeStreamDevicesChanged(III)V
+PLcom/android/server/EventLogTags;->writeUserActivityTimeoutOverride(J)V
+PLcom/android/server/GestureLauncherService$1;-><init>(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/GestureLauncherService$2;-><init>(Lcom/android/server/GestureLauncherService;Landroid/os/Handler;)V
+PLcom/android/server/GestureLauncherService$CameraLiftTriggerEventListener;-><init>(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService$CameraLiftTriggerEventListener;-><init>(Lcom/android/server/GestureLauncherService;Lcom/android/server/GestureLauncherService$1;)V
+PLcom/android/server/GestureLauncherService$GestureEventListener;-><init>(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService$GestureEventListener;-><init>(Lcom/android/server/GestureLauncherService;Lcom/android/server/GestureLauncherService$1;)V
+PLcom/android/server/GestureLauncherService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/GestureLauncherService;-><init>(Landroid/content/Context;Lcom/android/internal/logging/MetricsLogger;)V
+PLcom/android/server/GestureLauncherService;->access$202(Lcom/android/server/GestureLauncherService;I)I
+PLcom/android/server/GestureLauncherService;->access$300(Lcom/android/server/GestureLauncherService;)Landroid/database/ContentObserver;
+PLcom/android/server/GestureLauncherService;->access$400(Lcom/android/server/GestureLauncherService;)Landroid/content/Context;
+PLcom/android/server/GestureLauncherService;->access$500(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService;->access$600(Lcom/android/server/GestureLauncherService;)V
+PLcom/android/server/GestureLauncherService;->interceptPowerKeyDown(Landroid/view/KeyEvent;ZLandroid/util/MutableBoolean;)Z
+PLcom/android/server/GestureLauncherService;->isCameraDoubleTapPowerEnabled(Landroid/content/res/Resources;)Z
+PLcom/android/server/GestureLauncherService;->isCameraDoubleTapPowerSettingEnabled(Landroid/content/Context;I)Z
+PLcom/android/server/GestureLauncherService;->isCameraLaunchEnabled(Landroid/content/res/Resources;)Z
+PLcom/android/server/GestureLauncherService;->isCameraLaunchSettingEnabled(Landroid/content/Context;I)Z
+PLcom/android/server/GestureLauncherService;->isCameraLiftTriggerEnabled(Landroid/content/res/Resources;)Z
+PLcom/android/server/GestureLauncherService;->isCameraLiftTriggerSettingEnabled(Landroid/content/Context;I)Z
+PLcom/android/server/GestureLauncherService;->isGestureLauncherEnabled(Landroid/content/res/Resources;)Z
+PLcom/android/server/GestureLauncherService;->onBootPhase(I)V
+PLcom/android/server/GestureLauncherService;->onStart()V
+PLcom/android/server/GestureLauncherService;->registerContentObservers()V
+PLcom/android/server/GestureLauncherService;->unregisterCameraLaunchGesture()V
+PLcom/android/server/GestureLauncherService;->unregisterCameraLiftTrigger()V
+PLcom/android/server/GestureLauncherService;->updateCameraDoubleTapPowerEnabled()V
+PLcom/android/server/GestureLauncherService;->updateCameraRegistered()V
+PLcom/android/server/GraphicsStatsService$1;-><init>(Lcom/android/server/GraphicsStatsService;)V
+PLcom/android/server/GraphicsStatsService$1;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/GraphicsStatsService$ActiveBuffer;-><init>(Lcom/android/server/GraphicsStatsService;Landroid/view/IGraphicsStatsCallback;IILjava/lang/String;J)V
+PLcom/android/server/GraphicsStatsService$ActiveBuffer;->binderDied()V
+PLcom/android/server/GraphicsStatsService$ActiveBuffer;->closeAllBuffers()V
+PLcom/android/server/GraphicsStatsService$BufferInfo;-><init>(Lcom/android/server/GraphicsStatsService;Ljava/lang/String;JJ)V
+PLcom/android/server/GraphicsStatsService$HistoricalBuffer;-><init>(Lcom/android/server/GraphicsStatsService;Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/GraphicsStatsService;->access$000(Lcom/android/server/GraphicsStatsService;Lcom/android/server/GraphicsStatsService$HistoricalBuffer;)V
+PLcom/android/server/GraphicsStatsService;->access$100(Lcom/android/server/GraphicsStatsService;)V
+PLcom/android/server/GraphicsStatsService;->access$200(Lcom/android/server/GraphicsStatsService;)I
+PLcom/android/server/GraphicsStatsService;->access$300(Lcom/android/server/GraphicsStatsService;)[B
+PLcom/android/server/GraphicsStatsService;->access$400(Lcom/android/server/GraphicsStatsService;Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;->addToSaveQueue(Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;->deleteOldBuffers()V
+PLcom/android/server/GraphicsStatsService;->fetchActiveBuffersLocked(Landroid/view/IGraphicsStatsCallback;IILjava/lang/String;J)Lcom/android/server/GraphicsStatsService$ActiveBuffer;
+PLcom/android/server/GraphicsStatsService;->getPfd(Landroid/os/MemoryFile;)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/GraphicsStatsService;->lambda$2EDVu98hsJvSwNgKvijVLSR3IrQ(Lcom/android/server/GraphicsStatsService;)V
+PLcom/android/server/GraphicsStatsService;->normalizeDate(J)Ljava/util/Calendar;
+PLcom/android/server/GraphicsStatsService;->onAlarm()V
+PLcom/android/server/GraphicsStatsService;->pathForApp(Lcom/android/server/GraphicsStatsService$BufferInfo;)Ljava/io/File;
+PLcom/android/server/GraphicsStatsService;->processDied(Lcom/android/server/GraphicsStatsService$ActiveBuffer;)V
+PLcom/android/server/GraphicsStatsService;->requestBufferForProcess(Ljava/lang/String;Landroid/view/IGraphicsStatsCallback;)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/GraphicsStatsService;->requestBufferForProcessLocked(Landroid/view/IGraphicsStatsCallback;IILjava/lang/String;J)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/GraphicsStatsService;->saveBuffer(Lcom/android/server/GraphicsStatsService$HistoricalBuffer;)V
+PLcom/android/server/GraphicsStatsService;->scheduleRotateLocked()V
+PLcom/android/server/HardwarePropertiesManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/HardwarePropertiesManagerService;->enforceHardwarePropertiesRetrievalAllowed(Ljava/lang/String;)V
+PLcom/android/server/HardwarePropertiesManagerService;->getDeviceTemperatures(Ljava/lang/String;II)[F
+PLcom/android/server/InputMethodManagerService$1;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/InputMethodManagerService$2;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$3;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$ClientState;-><init>(Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;II)V
+PLcom/android/server/InputMethodManagerService$ClientState;->toString()Ljava/lang/String;
+PLcom/android/server/InputMethodManagerService$DebugFlag;-><init>(Ljava/lang/String;Z)V
+PLcom/android/server/InputMethodManagerService$DebugFlag;->value()Z
+PLcom/android/server/InputMethodManagerService$HardKeyboardListener;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$HardKeyboardListener;-><init>(Lcom/android/server/InputMethodManagerService;Lcom/android/server/InputMethodManagerService$1;)V
+PLcom/android/server/InputMethodManagerService$ImmsBroadcastReceiver;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$ImmsBroadcastReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/InputMethodManagerService$InputMethodFileManager;-><init>(Ljava/util/HashMap;I)V
+PLcom/android/server/InputMethodManagerService$InputMethodFileManager;->getAllAdditionalInputMethodSubtypes()Ljava/util/HashMap;
+PLcom/android/server/InputMethodManagerService$InputMethodFileManager;->readAdditionalInputMethodSubtypes(Ljava/util/HashMap;Landroid/util/AtomicFile;)V
+PLcom/android/server/InputMethodManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/InputMethodManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/InputMethodManagerService$Lifecycle;->onStart()V
+PLcom/android/server/InputMethodManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/InputMethodManagerService$LocalServiceImpl;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/InputMethodManagerService$LocalServiceImpl;->setInteractive(Z)V
+PLcom/android/server/InputMethodManagerService$MethodCallback;-><init>(Lcom/android/server/InputMethodManagerService;Lcom/android/internal/view/IInputMethod;Landroid/view/InputChannel;)V
+PLcom/android/server/InputMethodManagerService$MethodCallback;->sessionCreated(Lcom/android/internal/view/IInputMethodSession;)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;-><init>(Lcom/android/server/InputMethodManagerService;)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->addKnownImePackageNameLocked(Ljava/lang/String;)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->clearKnownImePackageNamesLocked()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->clearPackageChangeState()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->isChangingPackagesOfCurrentUserLocked()Z
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onBeginPackageChanges()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onFinishPackageChanges()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onFinishPackageChangesInternal()V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onPackageAppeared(Ljava/lang/String;I)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onPackageDisappeared(Ljava/lang/String;I)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/InputMethodManagerService$MyPackageMonitor;->shouldRebuildInputMethodListLocked()Z
+PLcom/android/server/InputMethodManagerService$SessionState;-><init>(Lcom/android/server/InputMethodManagerService$ClientState;Lcom/android/internal/view/IInputMethod;Lcom/android/internal/view/IInputMethodSession;Landroid/view/InputChannel;)V
+PLcom/android/server/InputMethodManagerService$SettingsObserver;-><init>(Lcom/android/server/InputMethodManagerService;Landroid/os/Handler;)V
+PLcom/android/server/InputMethodManagerService$SettingsObserver;->registerContentObserverLocked(I)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory$Entry;-><init>(Lcom/android/server/InputMethodManagerService$StartInputInfo;)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory$Entry;->set(Lcom/android/server/InputMethodManagerService$StartInputInfo;)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory;-><init>()V
+PLcom/android/server/InputMethodManagerService$StartInputHistory;-><init>(Lcom/android/server/InputMethodManagerService$1;)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory;->addEntry(Lcom/android/server/InputMethodManagerService$StartInputInfo;)V
+PLcom/android/server/InputMethodManagerService$StartInputHistory;->getEntrySize()I
+PLcom/android/server/InputMethodManagerService$StartInputInfo;-><init>(Landroid/os/IBinder;Ljava/lang/String;IZLandroid/os/IBinder;Landroid/view/inputmethod/EditorInfo;II)V
+PLcom/android/server/InputMethodManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/InputMethodManagerService;->access$500(Lcom/android/server/InputMethodManagerService;I)I
+PLcom/android/server/InputMethodManagerService;->addClient(Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;II)V
+PLcom/android/server/InputMethodManagerService;->attachNewInputLocked(IZ)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->bindCurrentInputMethodServiceLocked(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z
+PLcom/android/server/InputMethodManagerService;->buildInputMethodListLocked(Z)V
+PLcom/android/server/InputMethodManagerService;->calledWithValidToken(Landroid/os/IBinder;)Z
+PLcom/android/server/InputMethodManagerService;->clearClientSessionLocked(Lcom/android/server/InputMethodManagerService$ClientState;)V
+PLcom/android/server/InputMethodManagerService;->clearCurMethodLocked()V
+PLcom/android/server/InputMethodManagerService;->executeOrSendMessage(Landroid/os/IInterface;Landroid/os/Message;)V
+PLcom/android/server/InputMethodManagerService;->finishInput(Lcom/android/internal/view/IInputMethodClient;)V
+PLcom/android/server/InputMethodManagerService;->finishSessionLocked(Lcom/android/server/InputMethodManagerService$SessionState;)V
+PLcom/android/server/InputMethodManagerService;->getAppShowFlags()I
+PLcom/android/server/InputMethodManagerService;->getComponentMatchingFlags(I)I
+PLcom/android/server/InputMethodManagerService;->getCurrentInputMethodSubtype()Landroid/view/inputmethod/InputMethodSubtype;
+PLcom/android/server/InputMethodManagerService;->getCurrentInputMethodSubtypeLocked()Landroid/view/inputmethod/InputMethodSubtype;
+PLcom/android/server/InputMethodManagerService;->getEnabledInputMethodList()Ljava/util/List;
+PLcom/android/server/InputMethodManagerService;->getEnabledInputMethodSubtypeList(Ljava/lang/String;Z)Ljava/util/List;
+PLcom/android/server/InputMethodManagerService;->getImeShowFlags()I
+PLcom/android/server/InputMethodManagerService;->getInputMethodList()Ljava/util/List;
+PLcom/android/server/InputMethodManagerService;->getInputMethodList(Z)Ljava/util/List;
+PLcom/android/server/InputMethodManagerService;->getInputMethodWindowVisibleHeight()I
+PLcom/android/server/InputMethodManagerService;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/InputMethodManagerService;->handleSetInteractive(Z)V
+PLcom/android/server/InputMethodManagerService;->hideCurrentInputLocked(ILandroid/os/ResultReceiver;)Z
+PLcom/android/server/InputMethodManagerService;->hideInputMethodMenu()V
+PLcom/android/server/InputMethodManagerService;->hideInputMethodMenuLocked()V
+PLcom/android/server/InputMethodManagerService;->hideSoftInput(Lcom/android/internal/view/IInputMethodClient;ILandroid/os/ResultReceiver;)Z
+PLcom/android/server/InputMethodManagerService;->isKeyguardLocked()Z
+PLcom/android/server/InputMethodManagerService;->notifyUserAction(I)V
+PLcom/android/server/InputMethodManagerService;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/InputMethodManagerService;->onSessionCreated(Lcom/android/internal/view/IInputMethod;Lcom/android/internal/view/IInputMethodSession;Landroid/view/InputChannel;)V
+PLcom/android/server/InputMethodManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/InputMethodManagerService;->onUnlockUser(I)V
+PLcom/android/server/InputMethodManagerService;->removeClient(Lcom/android/internal/view/IInputMethodClient;)V
+PLcom/android/server/InputMethodManagerService;->reportFullscreenMode(Landroid/os/IBinder;Z)V
+PLcom/android/server/InputMethodManagerService;->requestClientSessionLocked(Lcom/android/server/InputMethodManagerService$ClientState;)V
+PLcom/android/server/InputMethodManagerService;->resetDefaultImeLocked(Landroid/content/Context;)V
+PLcom/android/server/InputMethodManagerService;->setEnabledSessionInMainThread(Lcom/android/server/InputMethodManagerService$SessionState;)V
+PLcom/android/server/InputMethodManagerService;->setImeWindowStatus(Landroid/os/IBinder;Landroid/os/IBinder;II)V
+PLcom/android/server/InputMethodManagerService;->setInputMethodEnabledLocked(Ljava/lang/String;Z)Z
+PLcom/android/server/InputMethodManagerService;->setInputMethodLocked(Ljava/lang/String;I)V
+PLcom/android/server/InputMethodManagerService;->setSelectedInputMethodAndSubtypeLocked(Landroid/view/inputmethod/InputMethodInfo;IZ)V
+PLcom/android/server/InputMethodManagerService;->shouldOfferSwitchingToNextInputMethod(Landroid/os/IBinder;)Z
+PLcom/android/server/InputMethodManagerService;->shouldShowImeSwitcherLocked(I)Z
+PLcom/android/server/InputMethodManagerService;->showCurrentInputLocked(ILandroid/os/ResultReceiver;)Z
+PLcom/android/server/InputMethodManagerService;->showSoftInput(Lcom/android/internal/view/IInputMethodClient;ILandroid/os/ResultReceiver;)Z
+PLcom/android/server/InputMethodManagerService;->startInput(ILcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;ILandroid/view/inputmethod/EditorInfo;I)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->startInputInnerLocked()Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->startInputLocked(ILcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;ILandroid/view/inputmethod/EditorInfo;I)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->startInputOrWindowGainedFocus(ILcom/android/internal/view/IInputMethodClient;Landroid/os/IBinder;IIILandroid/view/inputmethod/EditorInfo;Lcom/android/internal/view/IInputContext;II)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->startInputUncheckedLocked(Lcom/android/server/InputMethodManagerService$ClientState;Lcom/android/internal/view/IInputContext;ILandroid/view/inputmethod/EditorInfo;II)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/InputMethodManagerService;->systemRunning(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/InputMethodManagerService;->unbindCurrentClientLocked(I)V
+PLcom/android/server/InputMethodManagerService;->unbindCurrentMethodLocked(Z)V
+PLcom/android/server/InputMethodManagerService;->updateCurrentProfileIds()V
+PLcom/android/server/InputMethodManagerService;->updateFromSettingsLocked(Z)V
+PLcom/android/server/InputMethodManagerService;->updateInputMethodsFromSettingsLocked(Z)V
+PLcom/android/server/InputMethodManagerService;->updateKeyboardFromSettingsLocked()V
+PLcom/android/server/InputMethodManagerService;->updateStatusIcon(Landroid/os/IBinder;Ljava/lang/String;I)V
+PLcom/android/server/InputMethodManagerService;->updateSystemUiLocked(Landroid/os/IBinder;II)V
+PLcom/android/server/InputMethodManagerService;->windowGainedFocus(ILcom/android/internal/view/IInputMethodClient;Landroid/os/IBinder;IIILandroid/view/inputmethod/EditorInfo;Lcom/android/internal/view/IInputContext;II)Lcom/android/internal/view/InputBindResult;
+PLcom/android/server/IntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+PLcom/android/server/IntentResolver;->collectFilters([Landroid/content/IntentFilter;Landroid/content/IntentFilter;)Ljava/util/ArrayList;
+PLcom/android/server/IntentResolver;->findFilters(Landroid/content/IntentFilter;)Ljava/util/ArrayList;
+PLcom/android/server/IpSecService$1;-><init>(Lcom/android/server/IpSecService;)V
+PLcom/android/server/IpSecService$1;->run()V
+PLcom/android/server/IpSecService$IpSecServiceConfiguration$1;-><init>()V
+PLcom/android/server/IpSecService$IpSecServiceConfiguration$1;->getNetdInstance()Landroid/net/INetd;
+PLcom/android/server/IpSecService$UserResourceTracker;-><init>()V
+PLcom/android/server/IpSecService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/IpSecService;-><init>(Landroid/content/Context;Lcom/android/server/IpSecService$IpSecServiceConfiguration;)V
+PLcom/android/server/IpSecService;-><init>(Landroid/content/Context;Lcom/android/server/IpSecService$IpSecServiceConfiguration;Lcom/android/server/IpSecService$UidFdTagger;)V
+PLcom/android/server/IpSecService;->connectNativeNetdService()V
+PLcom/android/server/IpSecService;->create(Landroid/content/Context;)Lcom/android/server/IpSecService;
+PLcom/android/server/IpSecService;->isNetdAlive()Z
+PLcom/android/server/IpSecService;->systemReady()V
+PLcom/android/server/LocationManagerService$1;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$1;->getPackages(I)[Ljava/lang/String;
+PLcom/android/server/LocationManagerService$2;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$3;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$3;->onPermissionsChanged(I)V
+PLcom/android/server/LocationManagerService$4$1;-><init>(Lcom/android/server/LocationManagerService$4;II)V
+PLcom/android/server/LocationManagerService$4$1;->run()V
+PLcom/android/server/LocationManagerService$4;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$4;->onUidImportance(II)V
+PLcom/android/server/LocationManagerService$5;-><init>(Lcom/android/server/LocationManagerService;Landroid/os/Handler;)V
+PLcom/android/server/LocationManagerService$5;->onChange(Z)V
+PLcom/android/server/LocationManagerService$6;-><init>(Lcom/android/server/LocationManagerService;Landroid/os/Handler;)V
+PLcom/android/server/LocationManagerService$7;-><init>(Lcom/android/server/LocationManagerService;Landroid/os/Handler;)V
+PLcom/android/server/LocationManagerService$8;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$8;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/LocationManagerService$9;-><init>(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService$9;->onPackageDisappeared(Ljava/lang/String;I)V
+PLcom/android/server/LocationManagerService$Identity;-><init>(IILjava/lang/String;)V
+PLcom/android/server/LocationManagerService$LocationWorkerHandler;-><init>(Lcom/android/server/LocationManagerService;Landroid/os/Looper;)V
+PLcom/android/server/LocationManagerService$LocationWorkerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/LocationManagerService$Receiver;-><init>(Lcom/android/server/LocationManagerService;Landroid/location/ILocationListener;Landroid/app/PendingIntent;IILjava/lang/String;Landroid/os/WorkSource;Z)V
+PLcom/android/server/LocationManagerService$Receiver;->access$1800(Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService$Receiver;->callLocationChangedLocked(Landroid/location/Location;)Z
+PLcom/android/server/LocationManagerService$Receiver;->clearPendingBroadcastsLocked()V
+PLcom/android/server/LocationManagerService$Receiver;->decrementPendingBroadcastsLocked()V
+PLcom/android/server/LocationManagerService$Receiver;->getListener()Landroid/location/ILocationListener;
+PLcom/android/server/LocationManagerService$Receiver;->incrementPendingBroadcastsLocked()V
+PLcom/android/server/LocationManagerService$Receiver;->isListener()Z
+PLcom/android/server/LocationManagerService$Receiver;->updateMonitoring(Z)V
+PLcom/android/server/LocationManagerService$Receiver;->updateMonitoring(ZZI)Z
+PLcom/android/server/LocationManagerService$UpdateRecord;-><init>(Lcom/android/server/LocationManagerService;Ljava/lang/String;Landroid/location/LocationRequest;Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService$UpdateRecord;->disposeLocked(Z)V
+PLcom/android/server/LocationManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/LocationManagerService;->access$000(Lcom/android/server/LocationManagerService;)Landroid/content/Context;
+PLcom/android/server/LocationManagerService;->access$100(Lcom/android/server/LocationManagerService;)Ljava/lang/Object;
+PLcom/android/server/LocationManagerService;->access$1100(Lcom/android/server/LocationManagerService;II)I
+PLcom/android/server/LocationManagerService;->access$1200(Lcom/android/server/LocationManagerService;)Landroid/os/PowerManager;
+PLcom/android/server/LocationManagerService;->access$1300(Lcom/android/server/LocationManagerService;Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->access$1400(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
+PLcom/android/server/LocationManagerService;->access$1500(Lcom/android/server/LocationManagerService;)Landroid/app/AppOpsManager;
+PLcom/android/server/LocationManagerService;->access$1700(Lcom/android/server/LocationManagerService;Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService;->access$1900(Lcom/android/server/LocationManagerService;)Landroid/app/ActivityManager;
+PLcom/android/server/LocationManagerService;->access$200(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
+PLcom/android/server/LocationManagerService;->access$2000(I)Z
+PLcom/android/server/LocationManagerService;->access$2100(Lcom/android/server/LocationManagerService;)Ljava/util/HashMap;
+PLcom/android/server/LocationManagerService;->access$2200(Lcom/android/server/LocationManagerService;)Lcom/android/server/location/LocationRequestStatistics;
+PLcom/android/server/LocationManagerService;->access$2300(Lcom/android/server/LocationManagerService;Landroid/location/Location;Z)V
+PLcom/android/server/LocationManagerService;->access$300(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService;->access$400(Lcom/android/server/LocationManagerService;II)V
+PLcom/android/server/LocationManagerService;->access$500(Lcom/android/server/LocationManagerService;)Lcom/android/server/LocationManagerService$LocationWorkerHandler;
+PLcom/android/server/LocationManagerService;->access$600(Lcom/android/server/LocationManagerService;)V
+PLcom/android/server/LocationManagerService;->access$800(Lcom/android/server/LocationManagerService;I)V
+PLcom/android/server/LocationManagerService;->addGnssMeasurementsListener(Landroid/location/IGnssMeasurementsListener;Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->addProviderLocked(Lcom/android/server/location/LocationProviderInterface;)V
+PLcom/android/server/LocationManagerService;->applyAllProviderRequirementsLocked()V
+PLcom/android/server/LocationManagerService;->applyRequirementsLocked(Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->checkCallerIsProvider()V
+PLcom/android/server/LocationManagerService;->checkDeviceStatsAllowed()V
+PLcom/android/server/LocationManagerService;->checkListenerOrIntentLocked(Landroid/location/ILocationListener;Landroid/app/PendingIntent;IILjava/lang/String;Landroid/os/WorkSource;Z)Lcom/android/server/LocationManagerService$Receiver;
+PLcom/android/server/LocationManagerService;->checkLocationAccess(IILjava/lang/String;I)Z
+PLcom/android/server/LocationManagerService;->checkResolutionLevelIsSufficientForProviderUse(ILjava/lang/String;)V
+PLcom/android/server/LocationManagerService;->checkUpdateAppOpsAllowed()V
+PLcom/android/server/LocationManagerService;->createSanitizedRequest(Landroid/location/LocationRequest;IZ)Landroid/location/LocationRequest;
+PLcom/android/server/LocationManagerService;->doesUidHavePackage(ILjava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->ensureFallbackFusedProviderPresentLocked(Ljava/util/ArrayList;)V
+PLcom/android/server/LocationManagerService;->geocoderIsPresent()Z
+PLcom/android/server/LocationManagerService;->getAllProviders()Ljava/util/List;
+PLcom/android/server/LocationManagerService;->getAllowedResolutionLevel(II)I
+PLcom/android/server/LocationManagerService;->getMinimumResolutionLevelForProviderUse(Ljava/lang/String;)I
+PLcom/android/server/LocationManagerService;->getProviderProperties(Ljava/lang/String;)Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/LocationManagerService;->getProviders(Landroid/location/Criteria;Z)Ljava/util/List;
+PLcom/android/server/LocationManagerService;->getReceiverLocked(Landroid/location/ILocationListener;IILjava/lang/String;Landroid/os/WorkSource;Z)Lcom/android/server/LocationManagerService$Receiver;
+PLcom/android/server/LocationManagerService;->handleLocationChanged(Landroid/location/Location;Z)V
+PLcom/android/server/LocationManagerService;->hasGnssPermissions(Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->isAllowedByCurrentUserSettingsLocked(Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->isAllowedByUserSettingsLocked(Ljava/lang/String;II)Z
+PLcom/android/server/LocationManagerService;->isAllowedByUserSettingsLockedForUser(Ljava/lang/String;I)Z
+PLcom/android/server/LocationManagerService;->isCurrentProfile(I)Z
+PLcom/android/server/LocationManagerService;->isImportanceForeground(I)Z
+PLcom/android/server/LocationManagerService;->isMockProvider(Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->isProviderEnabledForUser(Ljava/lang/String;I)Z
+PLcom/android/server/LocationManagerService;->isThrottlingExemptLocked(Lcom/android/server/LocationManagerService$Identity;)Z
+PLcom/android/server/LocationManagerService;->isUidALocationProvider(I)Z
+PLcom/android/server/LocationManagerService;->isValidWorkSource(Landroid/os/WorkSource;)Z
+PLcom/android/server/LocationManagerService;->loadProvidersLocked()V
+PLcom/android/server/LocationManagerService;->registerGnssStatusCallback(Landroid/location/IGnssStatusListener;Ljava/lang/String;)Z
+PLcom/android/server/LocationManagerService;->removeGnssMeasurementsListener(Landroid/location/IGnssMeasurementsListener;)V
+PLcom/android/server/LocationManagerService;->removeUpdates(Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->removeUpdatesLocked(Lcom/android/server/LocationManagerService$Receiver;)V
+PLcom/android/server/LocationManagerService;->reportLocation(Landroid/location/Location;Z)V
+PLcom/android/server/LocationManagerService;->reportLocationAccessNoThrow(IILjava/lang/String;I)Z
+PLcom/android/server/LocationManagerService;->requestLocationUpdates(Landroid/location/LocationRequest;Landroid/location/ILocationListener;Landroid/app/PendingIntent;Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->requestLocationUpdatesLocked(Landroid/location/LocationRequest;Lcom/android/server/LocationManagerService$Receiver;IILjava/lang/String;)V
+PLcom/android/server/LocationManagerService;->resolutionLevelToOp(I)I
+PLcom/android/server/LocationManagerService;->shouldBroadcastSafe(Landroid/location/Location;Landroid/location/Location;Lcom/android/server/LocationManagerService$UpdateRecord;J)Z
+PLcom/android/server/LocationManagerService;->switchUser(I)V
+PLcom/android/server/LocationManagerService;->systemRunning()V
+PLcom/android/server/LocationManagerService;->unregisterGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/LocationManagerService;->updateBackgroundThrottlingWhitelistLocked()V
+PLcom/android/server/LocationManagerService;->updateLastLocationLocked(Landroid/location/Location;Ljava/lang/String;)V
+PLcom/android/server/LocationManagerService;->updateProviderListenersLocked(Ljava/lang/String;Z)V
+PLcom/android/server/LocationManagerService;->updateProvidersLocked()V
+PLcom/android/server/LocationManagerService;->updateUserProfiles(I)V
+PLcom/android/server/MmsServiceBroker$1;-><init>(Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/MmsServiceBroker$2;-><init>(Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/MmsServiceBroker$3;-><init>(Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/MmsServiceBroker$BinderService;-><init>(Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/MmsServiceBroker$BinderService;-><init>(Lcom/android/server/MmsServiceBroker;Lcom/android/server/MmsServiceBroker$1;)V
+PLcom/android/server/MmsServiceBroker;-><init>(Landroid/content/Context;)V
+PLcom/android/server/MmsServiceBroker;->onStart()V
+PLcom/android/server/MmsServiceBroker;->systemRunning()V
+PLcom/android/server/MountServiceIdler;->scheduleIdlePass(Landroid/content/Context;)V
+PLcom/android/server/MountServiceIdler;->tomorrowMidnight()Ljava/util/Calendar;
+PLcom/android/server/NativeDaemonConnector$Command;-><init>(Ljava/lang/String;[Ljava/lang/Object;)V
+PLcom/android/server/NativeDaemonConnector$Command;->access$000(Lcom/android/server/NativeDaemonConnector$Command;)Ljava/lang/String;
+PLcom/android/server/NativeDaemonConnector$Command;->access$100(Lcom/android/server/NativeDaemonConnector$Command;)Ljava/util/ArrayList;
+PLcom/android/server/NativeDaemonConnector$Command;->appendArg(Ljava/lang/Object;)Lcom/android/server/NativeDaemonConnector$Command;
+PLcom/android/server/NativeDaemonConnector$ResponseQueue$PendingCmd;-><init>(ILjava/lang/String;)V
+PLcom/android/server/NativeDaemonConnector$ResponseQueue;-><init>(I)V
+PLcom/android/server/NativeDaemonConnector$ResponseQueue;->add(ILcom/android/server/NativeDaemonEvent;)V
+PLcom/android/server/NativeDaemonConnector$ResponseQueue;->remove(IJLjava/lang/String;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;-><init>(Lcom/android/server/INativeDaemonConnectorCallbacks;Ljava/lang/String;ILjava/lang/String;ILandroid/os/PowerManager$WakeLock;)V
+PLcom/android/server/NativeDaemonConnector;-><init>(Lcom/android/server/INativeDaemonConnectorCallbacks;Ljava/lang/String;ILjava/lang/String;ILandroid/os/PowerManager$WakeLock;Landroid/os/Looper;)V
+PLcom/android/server/NativeDaemonConnector;->determineSocketAddress()Landroid/net/LocalSocketAddress;
+PLcom/android/server/NativeDaemonConnector;->execute(JLjava/lang/String;[Ljava/lang/Object;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;->execute(Lcom/android/server/NativeDaemonConnector$Command;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;->execute(Ljava/lang/String;[Ljava/lang/Object;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;->executeForList(Ljava/lang/String;[Ljava/lang/Object;)[Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonConnector;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/NativeDaemonConnector;->isShuttingDown()Z
+PLcom/android/server/NativeDaemonConnector;->log(Ljava/lang/String;)V
+PLcom/android/server/NativeDaemonConnector;->loge(Ljava/lang/String;)V
+PLcom/android/server/NativeDaemonConnector;->makeCommand(Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;ILjava/lang/String;[Ljava/lang/Object;)V
+PLcom/android/server/NativeDaemonConnector;->monitor()V
+PLcom/android/server/NativeDaemonConnector;->run()V
+PLcom/android/server/NativeDaemonEvent;-><init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/io/FileDescriptor;)V
+PLcom/android/server/NativeDaemonEvent;->checkCode(I)V
+PLcom/android/server/NativeDaemonEvent;->filterMessageList([Lcom/android/server/NativeDaemonEvent;I)[Ljava/lang/String;
+PLcom/android/server/NativeDaemonEvent;->getCmdNumber()I
+PLcom/android/server/NativeDaemonEvent;->getCode()I
+PLcom/android/server/NativeDaemonEvent;->getMessage()Ljava/lang/String;
+PLcom/android/server/NativeDaemonEvent;->getRawEvent()Ljava/lang/String;
+PLcom/android/server/NativeDaemonEvent;->isClassClientError()Z
+PLcom/android/server/NativeDaemonEvent;->isClassContinue()Z
+PLcom/android/server/NativeDaemonEvent;->isClassServerError()Z
+PLcom/android/server/NativeDaemonEvent;->isClassUnsolicited()Z
+PLcom/android/server/NativeDaemonEvent;->parseRawEvent(Ljava/lang/String;[Ljava/io/FileDescriptor;)Lcom/android/server/NativeDaemonEvent;
+PLcom/android/server/NativeDaemonEvent;->toString()Ljava/lang/String;
+PLcom/android/server/NetworkManagementInternal;-><init>()V
+PLcom/android/server/NetworkManagementService$1;-><init>(Lcom/android/server/NetworkManagementService;I)V
+PLcom/android/server/NetworkManagementService$1;->run()V
+PLcom/android/server/NetworkManagementService$2;-><init>(Lcom/android/server/NetworkManagementService;Lcom/android/server/NetworkManagementService$IdleTimerParams;)V
+PLcom/android/server/NetworkManagementService$2;->run()V
+PLcom/android/server/NetworkManagementService$IdleTimerParams;-><init>(II)V
+PLcom/android/server/NetworkManagementService$LocalService;-><init>(Lcom/android/server/NetworkManagementService;)V
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;-><init>(Lcom/android/server/NetworkManagementService;)V
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;-><init>(Lcom/android/server/NetworkManagementService;Lcom/android/server/NetworkManagementService$1;)V
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;->onCheckHoldWakeLock(I)Z
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;->onDaemonConnected()V
+PLcom/android/server/NetworkManagementService$NetdCallbackReceiver;->onEvent(ILjava/lang/String;[Ljava/lang/String;)Z
+PLcom/android/server/NetworkManagementService$NetdTetheringStatsProvider;-><init>(Lcom/android/server/NetworkManagementService;)V
+PLcom/android/server/NetworkManagementService$NetdTetheringStatsProvider;-><init>(Lcom/android/server/NetworkManagementService;Lcom/android/server/NetworkManagementService$1;)V
+PLcom/android/server/NetworkManagementService$SystemServices;-><init>()V
+PLcom/android/server/NetworkManagementService$SystemServices;->getNetd()Landroid/net/INetd;
+PLcom/android/server/NetworkManagementService$SystemServices;->getService(Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/NetworkManagementService$SystemServices;->registerLocalService(Lcom/android/server/NetworkManagementInternal;)V
+PLcom/android/server/NetworkManagementService;-><init>(Landroid/content/Context;Ljava/lang/String;Lcom/android/server/NetworkManagementService$SystemServices;)V
+PLcom/android/server/NetworkManagementService;->access$1000(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->access$1100(Lcom/android/server/NetworkManagementService;IIJIZ)V
+PLcom/android/server/NetworkManagementService;->access$1200(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/NetworkManagementService;->access$1300(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/NetworkManagementService;->access$1400(Lcom/android/server/NetworkManagementService;Ljava/lang/String;J[Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->access$1500(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Landroid/net/RouteInfo;)V
+PLcom/android/server/NetworkManagementService;->access$1600(Lcom/android/server/NetworkManagementService;)Landroid/net/INetd;
+PLcom/android/server/NetworkManagementService;->access$200(Lcom/android/server/NetworkManagementService;)Ljava/util/concurrent/CountDownLatch;
+PLcom/android/server/NetworkManagementService;->access$202(Lcom/android/server/NetworkManagementService;Ljava/util/concurrent/CountDownLatch;)Ljava/util/concurrent/CountDownLatch;
+PLcom/android/server/NetworkManagementService;->access$900(Lcom/android/server/NetworkManagementService;Ljava/lang/String;Z)V
+PLcom/android/server/NetworkManagementService;->addIdleTimer(Ljava/lang/String;II)V
+PLcom/android/server/NetworkManagementService;->addInterfaceToNetwork(Ljava/lang/String;I)V
+PLcom/android/server/NetworkManagementService;->addRoute(ILandroid/net/RouteInfo;)V
+PLcom/android/server/NetworkManagementService;->clearInterfaceAddresses(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->closeSocketsForFirewallChainLocked(ILjava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->connectNativeNetdService()V
+PLcom/android/server/NetworkManagementService;->create(Landroid/content/Context;)Lcom/android/server/NetworkManagementService;
+PLcom/android/server/NetworkManagementService;->create(Landroid/content/Context;Ljava/lang/String;Lcom/android/server/NetworkManagementService$SystemServices;)Lcom/android/server/NetworkManagementService;
+PLcom/android/server/NetworkManagementService;->createPhysicalNetwork(ILjava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->disableIpv6(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->enableIpv6(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->getBatteryStats()Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/NetworkManagementService;->getFirewallChainName(I)Ljava/lang/String;
+PLcom/android/server/NetworkManagementService;->getFirewallRuleName(II)Ljava/lang/String;
+PLcom/android/server/NetworkManagementService;->getFirewallType(I)I
+PLcom/android/server/NetworkManagementService;->getInterfaceConfig(Ljava/lang/String;)Landroid/net/InterfaceConfiguration;
+PLcom/android/server/NetworkManagementService;->getNetdService()Landroid/net/INetd;
+PLcom/android/server/NetworkManagementService;->getNetworkStatsSummaryDev()Landroid/net/NetworkStats;
+PLcom/android/server/NetworkManagementService;->getNetworkStatsSummaryXt()Landroid/net/NetworkStats;
+PLcom/android/server/NetworkManagementService;->getNetworkStatsUidDetail(I[Ljava/lang/String;)Landroid/net/NetworkStats;
+PLcom/android/server/NetworkManagementService;->getUidFirewallRulesLR(I)Landroid/util/SparseIntArray;
+PLcom/android/server/NetworkManagementService;->isBandwidthControlEnabled()Z
+PLcom/android/server/NetworkManagementService;->isNetworkActive()Z
+PLcom/android/server/NetworkManagementService;->lambda$notifyAddressRemoved$7(Ljava/lang/String;Landroid/net/LinkAddress;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$notifyAddressUpdated$6(Ljava/lang/String;Landroid/net/LinkAddress;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$notifyInterfaceDnsServerInfo$8(Ljava/lang/String;J[Ljava/lang/String;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$notifyInterfaceLinkStateChanged$1(Ljava/lang/String;ZLandroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$notifyLimitReached$4(Ljava/lang/String;Ljava/lang/String;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$notifyRouteChange$10(Landroid/net/RouteInfo;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->lambda$notifyRouteChange$9(Landroid/net/RouteInfo;Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->listInterfaces()[Ljava/lang/String;
+PLcom/android/server/NetworkManagementService;->modifyInterfaceInNetwork(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->modifyRoute(Ljava/lang/String;Ljava/lang/String;Landroid/net/RouteInfo;)V
+PLcom/android/server/NetworkManagementService;->monitor()V
+PLcom/android/server/NetworkManagementService;->notifyAddressRemoved(Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/NetworkManagementService;->notifyAddressUpdated(Ljava/lang/String;Landroid/net/LinkAddress;)V
+PLcom/android/server/NetworkManagementService;->notifyInterfaceClassActivity(IIJIZ)V
+PLcom/android/server/NetworkManagementService;->notifyInterfaceDnsServerInfo(Ljava/lang/String;J[Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->notifyInterfaceLinkStateChanged(Ljava/lang/String;Z)V
+PLcom/android/server/NetworkManagementService;->notifyLimitReached(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->notifyRouteChange(Ljava/lang/String;Landroid/net/RouteInfo;)V
+PLcom/android/server/NetworkManagementService;->prepareNativeDaemon()V
+PLcom/android/server/NetworkManagementService;->registerObserver(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->registerTetheringStatsProvider(Landroid/net/ITetheringStatsProvider;Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->removeIdleTimer(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->removeNetwork(I)V
+PLcom/android/server/NetworkManagementService;->reportNetworkActive()V
+PLcom/android/server/NetworkManagementService;->setDataSaverModeEnabled(Z)Z
+PLcom/android/server/NetworkManagementService;->setDefaultNetId(I)V
+PLcom/android/server/NetworkManagementService;->setDnsConfigurationForNetwork(I[Ljava/lang/String;[Ljava/lang/String;[ILjava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->setFirewallChainEnabled(IZ)V
+PLcom/android/server/NetworkManagementService;->setFirewallChainState(IZ)V
+PLcom/android/server/NetworkManagementService;->setFirewallEnabled(Z)V
+PLcom/android/server/NetworkManagementService;->setFirewallUidRule(III)V
+PLcom/android/server/NetworkManagementService;->setFirewallUidRuleLocked(III)V
+PLcom/android/server/NetworkManagementService;->setFirewallUidRules(I[I[I)V
+PLcom/android/server/NetworkManagementService;->setGlobalAlert(J)V
+PLcom/android/server/NetworkManagementService;->setIPv6AddrGenMode(Ljava/lang/String;I)V
+PLcom/android/server/NetworkManagementService;->setInterfaceConfig(Ljava/lang/String;Landroid/net/InterfaceConfiguration;)V
+PLcom/android/server/NetworkManagementService;->setInterfaceIpv6PrivacyExtensions(Ljava/lang/String;Z)V
+PLcom/android/server/NetworkManagementService;->setPermission(Ljava/lang/String;[I)V
+PLcom/android/server/NetworkManagementService;->setUidMeteredNetworkWhitelist(IZ)V
+PLcom/android/server/NetworkManagementService;->setUidOnMeteredNetworkList(IZZ)V
+PLcom/android/server/NetworkManagementService;->startClatd(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->stopClatd(Ljava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->syncFirewallChainLocked(ILjava/lang/String;)V
+PLcom/android/server/NetworkManagementService;->systemReady()V
+PLcom/android/server/NetworkManagementService;->unregisterObserver(Landroid/net/INetworkManagementEventObserver;)V
+PLcom/android/server/NetworkManagementService;->updateFirewallUidRuleLocked(III)Z
+PLcom/android/server/NetworkScoreService$1;-><init>(Lcom/android/server/NetworkScoreService;)V
+PLcom/android/server/NetworkScoreService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/NetworkScoreService$2;-><init>(Lcom/android/server/NetworkScoreService;)V
+PLcom/android/server/NetworkScoreService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/NetworkScoreService$3;-><init>(Lcom/android/server/NetworkScoreService;Landroid/os/Handler;)V
+PLcom/android/server/NetworkScoreService$4;-><init>(Lcom/android/server/NetworkScoreService;)V
+PLcom/android/server/NetworkScoreService$4;->getPackages(I)[Ljava/lang/String;
+PLcom/android/server/NetworkScoreService$5;-><init>(Lcom/android/server/NetworkScoreService;)V
+PLcom/android/server/NetworkScoreService$5;->accept(Landroid/net/INetworkScoreCache;Ljava/lang/Object;)V
+PLcom/android/server/NetworkScoreService$5;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/NetworkScoreService$CurrentNetworkScoreCacheFilter;-><init>(Ljava/util/function/Supplier;)V
+PLcom/android/server/NetworkScoreService$CurrentNetworkScoreCacheFilter;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/NetworkScoreService$CurrentNetworkScoreCacheFilter;->apply(Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/NetworkScoreService$DispatchingContentObserver;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/NetworkScoreService$DispatchingContentObserver;->observe(Landroid/net/Uri;I)V
+PLcom/android/server/NetworkScoreService$DispatchingContentObserver;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;-><init>(Landroid/content/Context;Ljava/util/List;ILjava/util/function/UnaryOperator;Ljava/util/function/UnaryOperator;)V
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;->accept(Landroid/net/INetworkScoreCache;Ljava/lang/Object;)V
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;->create(Landroid/content/Context;Ljava/util/List;I)Lcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;
+PLcom/android/server/NetworkScoreService$FilteringCacheUpdatingConsumer;->filterScores(Ljava/util/List;I)Ljava/util/List;
+PLcom/android/server/NetworkScoreService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkScoreService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/NetworkScoreService$Lifecycle;->onStart()V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;-><init>(Lcom/android/server/NetworkScoreService;Ljava/lang/String;)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;-><init>(Lcom/android/server/NetworkScoreService;Ljava/lang/String;Lcom/android/server/NetworkScoreService$1;)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;->evaluateBinding(Ljava/lang/String;Z)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/NetworkScoreService$NetworkScorerPackageMonitor;->onPackageUpdateFinished(Ljava/lang/String;I)V
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;-><init>(Landroid/net/NetworkScorerAppData;)V
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->bind(Landroid/content/Context;)V
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->getAppData()Landroid/net/NetworkScorerAppData;
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->getRecommendationProvider()Landroid/net/INetworkRecommendationProvider;
+PLcom/android/server/NetworkScoreService$ScoringServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/NetworkScoreService$ServiceHandler;-><init>(Lcom/android/server/NetworkScoreService;Landroid/os/Looper;)V
+PLcom/android/server/NetworkScoreService$ServiceHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/NetworkScoreService$WifiInfoSupplier;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkScoreService$WifiInfoSupplier;->get()Landroid/net/wifi/WifiInfo;
+PLcom/android/server/NetworkScoreService$WifiInfoSupplier;->get()Ljava/lang/Object;
+PLcom/android/server/NetworkScoreService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkScoreService;-><init>(Landroid/content/Context;Lcom/android/server/NetworkScorerAppManager;Ljava/util/function/Function;Landroid/os/Looper;)V
+PLcom/android/server/NetworkScoreService;->access$000()Z
+PLcom/android/server/NetworkScoreService;->access$100(Lcom/android/server/NetworkScoreService;)V
+PLcom/android/server/NetworkScoreService;->access$200(Lcom/android/server/NetworkScoreService;)Lcom/android/server/NetworkScorerAppManager;
+PLcom/android/server/NetworkScoreService;->access$400(Lcom/android/server/NetworkScoreService;Landroid/net/NetworkScorerAppData;)V
+PLcom/android/server/NetworkScoreService;->access$500(Lcom/android/server/NetworkScoreService;)Landroid/content/Context;
+PLcom/android/server/NetworkScoreService;->bindToScoringServiceIfNeeded()V
+PLcom/android/server/NetworkScoreService;->bindToScoringServiceIfNeeded(Landroid/net/NetworkScorerAppData;)V
+PLcom/android/server/NetworkScoreService;->clearInternal()V
+PLcom/android/server/NetworkScoreService;->enforceSystemOnly()V
+PLcom/android/server/NetworkScoreService;->getActiveScorer()Landroid/net/NetworkScorerAppData;
+PLcom/android/server/NetworkScoreService;->getRecommendationProvider()Landroid/net/INetworkRecommendationProvider;
+PLcom/android/server/NetworkScoreService;->getScoreCacheLists()Ljava/util/Collection;
+PLcom/android/server/NetworkScoreService;->isCallerActiveScorer(I)Z
+PLcom/android/server/NetworkScoreService;->onUserUnlocked(I)V
+PLcom/android/server/NetworkScoreService;->refreshBinding()V
+PLcom/android/server/NetworkScoreService;->registerNetworkScoreCache(ILandroid/net/INetworkScoreCache;I)V
+PLcom/android/server/NetworkScoreService;->registerPackageMonitorIfNeeded()V
+PLcom/android/server/NetworkScoreService;->registerRecommendationSettingsObserver()V
+PLcom/android/server/NetworkScoreService;->requestScores([Landroid/net/NetworkKey;)Z
+PLcom/android/server/NetworkScoreService;->sendCacheUpdateCallback(Ljava/util/function/BiConsumer;Ljava/util/Collection;)V
+PLcom/android/server/NetworkScoreService;->systemReady()V
+PLcom/android/server/NetworkScoreService;->systemRunning()V
+PLcom/android/server/NetworkScoreService;->unbindFromScoringServiceIfNeeded()V
+PLcom/android/server/NetworkScoreService;->unregisterNetworkScoreCache(ILandroid/net/INetworkScoreCache;)V
+PLcom/android/server/NetworkScoreService;->updateScores([Landroid/net/ScoredNetwork;)Z
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;-><init>()V
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getInt(Landroid/content/Context;Ljava/lang/String;I)I
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getSecureInt(Landroid/content/Context;Ljava/lang/String;I)I
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;->getString(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager$SettingsFacade;->putInt(Landroid/content/Context;Ljava/lang/String;I)Z
+PLcom/android/server/NetworkScorerAppManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkScorerAppManager;-><init>(Landroid/content/Context;Lcom/android/server/NetworkScorerAppManager$SettingsFacade;)V
+PLcom/android/server/NetworkScorerAppManager;->canAccessLocation(ILjava/lang/String;)Z
+PLcom/android/server/NetworkScorerAppManager;->findUseOpenWifiNetworksActivity(Landroid/content/pm/ServiceInfo;)Landroid/content/ComponentName;
+PLcom/android/server/NetworkScorerAppManager;->getActiveScorer()Landroid/net/NetworkScorerAppData;
+PLcom/android/server/NetworkScorerAppManager;->getAllValidScorers()Ljava/util/List;
+PLcom/android/server/NetworkScorerAppManager;->getDefaultPackageSetting()Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager;->getNetworkAvailableNotificationChannelId(Landroid/content/pm/ServiceInfo;)Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager;->getNetworkRecommendationsEnabledSetting()I
+PLcom/android/server/NetworkScorerAppManager;->getNetworkRecommendationsPackage()Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager;->getRecommendationServiceLabel(Landroid/content/pm/ServiceInfo;Landroid/content/pm/PackageManager;)Ljava/lang/String;
+PLcom/android/server/NetworkScorerAppManager;->getScorer(Ljava/lang/String;)Landroid/net/NetworkScorerAppData;
+PLcom/android/server/NetworkScorerAppManager;->hasPermissions(ILjava/lang/String;)Z
+PLcom/android/server/NetworkScorerAppManager;->hasScoreNetworksPermission(Ljava/lang/String;)Z
+PLcom/android/server/NetworkScorerAppManager;->isLocationModeEnabled()Z
+PLcom/android/server/NetworkScorerAppManager;->migrateNetworkScorerAppSettingIfNeeded()V
+PLcom/android/server/NetworkScorerAppManager;->setNetworkRecommendationsEnabledSetting(I)V
+PLcom/android/server/NetworkScorerAppManager;->updateState()V
+PLcom/android/server/NetworkTimeUpdateService$1;-><init>(Lcom/android/server/NetworkTimeUpdateService;)V
+PLcom/android/server/NetworkTimeUpdateService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/NetworkTimeUpdateService$2;-><init>(Lcom/android/server/NetworkTimeUpdateService;)V
+PLcom/android/server/NetworkTimeUpdateService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/NetworkTimeUpdateService$MyHandler;-><init>(Lcom/android/server/NetworkTimeUpdateService;Landroid/os/Looper;)V
+PLcom/android/server/NetworkTimeUpdateService$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;-><init>(Lcom/android/server/NetworkTimeUpdateService;)V
+PLcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;-><init>(Lcom/android/server/NetworkTimeUpdateService;Lcom/android/server/NetworkTimeUpdateService$1;)V
+PLcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;->onAvailable(Landroid/net/Network;)V
+PLcom/android/server/NetworkTimeUpdateService$NetworkTimeUpdateCallback;->onLost(Landroid/net/Network;)V
+PLcom/android/server/NetworkTimeUpdateService$SettingsObserver;-><init>(Landroid/os/Handler;I)V
+PLcom/android/server/NetworkTimeUpdateService$SettingsObserver;->observe(Landroid/content/Context;)V
+PLcom/android/server/NetworkTimeUpdateService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/NetworkTimeUpdateService;->access$100(Lcom/android/server/NetworkTimeUpdateService;)Landroid/os/Handler;
+PLcom/android/server/NetworkTimeUpdateService;->access$202(Lcom/android/server/NetworkTimeUpdateService;J)J
+PLcom/android/server/NetworkTimeUpdateService;->access$300(Lcom/android/server/NetworkTimeUpdateService;I)V
+PLcom/android/server/NetworkTimeUpdateService;->access$400(Lcom/android/server/NetworkTimeUpdateService;)Landroid/net/Network;
+PLcom/android/server/NetworkTimeUpdateService;->access$402(Lcom/android/server/NetworkTimeUpdateService;Landroid/net/Network;)Landroid/net/Network;
+PLcom/android/server/NetworkTimeUpdateService;->getNitzAge()J
+PLcom/android/server/NetworkTimeUpdateService;->isAutomaticTimeRequested()Z
+PLcom/android/server/NetworkTimeUpdateService;->onPollNetworkTime(I)V
+PLcom/android/server/NetworkTimeUpdateService;->onPollNetworkTimeUnderWakeLock(I)V
+PLcom/android/server/NetworkTimeUpdateService;->registerForAlarms()V
+PLcom/android/server/NetworkTimeUpdateService;->registerForTelephonyIntents()V
+PLcom/android/server/NetworkTimeUpdateService;->resetAlarm(J)V
+PLcom/android/server/NetworkTimeUpdateService;->systemRunning()V
+PLcom/android/server/NetworkTimeUpdateService;->updateSystemClock(I)V
+PLcom/android/server/NsdService$DaemonConnection;-><init>(Lcom/android/server/NsdService$NativeCallbackReceiver;)V
+PLcom/android/server/NsdService$NativeCallbackReceiver;-><init>(Lcom/android/server/NsdService;)V
+PLcom/android/server/NsdService$NativeCallbackReceiver;->awaitConnection()V
+PLcom/android/server/NsdService$NativeCallbackReceiver;->onDaemonConnected()V
+PLcom/android/server/NsdService$NsdSettings$1;-><init>(Landroid/content/ContentResolver;)V
+PLcom/android/server/NsdService$NsdSettings$1;->isEnabled()Z
+PLcom/android/server/NsdService$NsdSettings$1;->registerContentObserver(Landroid/net/Uri;Landroid/database/ContentObserver;)V
+PLcom/android/server/NsdService$NsdSettings;->makeDefault(Landroid/content/Context;)Lcom/android/server/NsdService$NsdSettings;
+PLcom/android/server/NsdService$NsdStateMachine$1;-><init>(Lcom/android/server/NsdService$NsdStateMachine;Landroid/os/Handler;)V
+PLcom/android/server/NsdService$NsdStateMachine$DefaultState;-><init>(Lcom/android/server/NsdService$NsdStateMachine;)V
+PLcom/android/server/NsdService$NsdStateMachine$DisabledState;-><init>(Lcom/android/server/NsdService$NsdStateMachine;)V
+PLcom/android/server/NsdService$NsdStateMachine$EnabledState;-><init>(Lcom/android/server/NsdService$NsdStateMachine;)V
+PLcom/android/server/NsdService$NsdStateMachine$EnabledState;->enter()V
+PLcom/android/server/NsdService$NsdStateMachine;-><init>(Lcom/android/server/NsdService;Ljava/lang/String;Landroid/os/Handler;)V
+PLcom/android/server/NsdService$NsdStateMachine;->registerForNsdSetting()V
+PLcom/android/server/NsdService;-><init>(Landroid/content/Context;Lcom/android/server/NsdService$NsdSettings;Landroid/os/Handler;Lcom/android/server/NsdService$DaemonConnectionSupplier;)V
+PLcom/android/server/NsdService;->access$000(Lcom/android/server/NsdService;)Z
+PLcom/android/server/NsdService;->access$200(Lcom/android/server/NsdService;)Lcom/android/server/NsdService$NsdSettings;
+PLcom/android/server/NsdService;->access$400(Lcom/android/server/NsdService;)Ljava/util/HashMap;
+PLcom/android/server/NsdService;->access$900(Lcom/android/server/NsdService;Z)V
+PLcom/android/server/NsdService;->create(Landroid/content/Context;)Lcom/android/server/NsdService;
+PLcom/android/server/NsdService;->isNsdEnabled()Z
+PLcom/android/server/NsdService;->sendNsdStateChangeBroadcast(Z)V
+PLcom/android/server/PersistentDataBlockService$1;-><init>(Lcom/android/server/PersistentDataBlockService;)V
+PLcom/android/server/PersistentDataBlockService$1;->getFlashLockState()I
+PLcom/android/server/PersistentDataBlockService$1;->getMaximumDataBlockSize()J
+PLcom/android/server/PersistentDataBlockService$1;->read()[B
+PLcom/android/server/PersistentDataBlockService$1;->write([B)I
+PLcom/android/server/PersistentDataBlockService$2;-><init>(Lcom/android/server/PersistentDataBlockService;)V
+PLcom/android/server/PersistentDataBlockService$2;->forceOemUnlockEnabled(Z)V
+PLcom/android/server/PersistentDataBlockService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/PersistentDataBlockService;->access$000(Lcom/android/server/PersistentDataBlockService;I)V
+PLcom/android/server/PersistentDataBlockService;->access$100(Lcom/android/server/PersistentDataBlockService;)J
+PLcom/android/server/PersistentDataBlockService;->access$1300(Lcom/android/server/PersistentDataBlockService;Z)V
+PLcom/android/server/PersistentDataBlockService;->access$1400(Lcom/android/server/PersistentDataBlockService;)V
+PLcom/android/server/PersistentDataBlockService;->access$200(Lcom/android/server/PersistentDataBlockService;)Ljava/lang/String;
+PLcom/android/server/PersistentDataBlockService;->access$400(Lcom/android/server/PersistentDataBlockService;)Ljava/lang/Object;
+PLcom/android/server/PersistentDataBlockService;->access$500(Lcom/android/server/PersistentDataBlockService;)Z
+PLcom/android/server/PersistentDataBlockService;->access$600(Lcom/android/server/PersistentDataBlockService;)Z
+PLcom/android/server/PersistentDataBlockService;->access$700(Lcom/android/server/PersistentDataBlockService;)Z
+PLcom/android/server/PersistentDataBlockService;->access$800(Lcom/android/server/PersistentDataBlockService;Ljava/io/DataInputStream;)I
+PLcom/android/server/PersistentDataBlockService;->computeAndWriteDigestLocked()Z
+PLcom/android/server/PersistentDataBlockService;->computeDigestLocked([B)[B
+PLcom/android/server/PersistentDataBlockService;->doGetMaximumDataBlockSize()J
+PLcom/android/server/PersistentDataBlockService;->doGetOemUnlockEnabled()Z
+PLcom/android/server/PersistentDataBlockService;->doSetOemUnlockEnabledLocked(Z)V
+PLcom/android/server/PersistentDataBlockService;->enforceChecksumValidity()Z
+PLcom/android/server/PersistentDataBlockService;->enforceOemUnlockReadPermission()V
+PLcom/android/server/PersistentDataBlockService;->enforceUid(I)V
+PLcom/android/server/PersistentDataBlockService;->formatIfOemUnlockEnabled()V
+PLcom/android/server/PersistentDataBlockService;->getAllowedUid(I)I
+PLcom/android/server/PersistentDataBlockService;->getBlockDeviceSize()J
+PLcom/android/server/PersistentDataBlockService;->getTotalDataSizeLocked(Ljava/io/DataInputStream;)I
+PLcom/android/server/PersistentDataBlockService;->lambda$onStart$0(Lcom/android/server/PersistentDataBlockService;)V
+PLcom/android/server/PersistentDataBlockService;->onBootPhase(I)V
+PLcom/android/server/PersistentDataBlockService;->onStart()V
+PLcom/android/server/PinnerService$1;-><init>(Lcom/android/server/PinnerService;)V
+PLcom/android/server/PinnerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/PinnerService$BinderService;-><init>(Lcom/android/server/PinnerService;)V
+PLcom/android/server/PinnerService$BinderService;-><init>(Lcom/android/server/PinnerService;Lcom/android/server/PinnerService$1;)V
+PLcom/android/server/PinnerService$PinRange;-><init>()V
+PLcom/android/server/PinnerService$PinRangeSource;-><init>()V
+PLcom/android/server/PinnerService$PinRangeSource;-><init>(Lcom/android/server/PinnerService$1;)V
+PLcom/android/server/PinnerService$PinRangeSourceStatic;-><init>(II)V
+PLcom/android/server/PinnerService$PinRangeSourceStatic;->read(Lcom/android/server/PinnerService$PinRange;)Z
+PLcom/android/server/PinnerService$PinnedFile;-><init>(JILjava/lang/String;I)V
+PLcom/android/server/PinnerService$PinnedFile;->close()V
+PLcom/android/server/PinnerService$PinnedFile;->finalize()V
+PLcom/android/server/PinnerService$PinnerHandler;-><init>(Lcom/android/server/PinnerService;Landroid/os/Looper;)V
+PLcom/android/server/PinnerService$PinnerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/PinnerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/PinnerService;->access$400(JJ)V
+PLcom/android/server/PinnerService;->access$500(Lcom/android/server/PinnerService;I)V
+PLcom/android/server/PinnerService;->access$600(Lcom/android/server/PinnerService;)V
+PLcom/android/server/PinnerService;->clamp(III)I
+PLcom/android/server/PinnerService;->getCameraInfo(I)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/PinnerService;->handlePinCamera(I)V
+PLcom/android/server/PinnerService;->handlePinOnStart()V
+PLcom/android/server/PinnerService;->isResolverActivity(Landroid/content/pm/ActivityInfo;)Z
+PLcom/android/server/PinnerService;->maybeOpenPinMetaInZip(Ljava/util/zip/ZipFile;Ljava/lang/String;)Ljava/io/InputStream;
+PLcom/android/server/PinnerService;->maybeOpenZip(Ljava/lang/String;)Ljava/util/zip/ZipFile;
+PLcom/android/server/PinnerService;->onStart()V
+PLcom/android/server/PinnerService;->pinCamera(I)Z
+PLcom/android/server/PinnerService;->pinFile(Ljava/lang/String;IZ)Lcom/android/server/PinnerService$PinnedFile;
+PLcom/android/server/PinnerService;->pinFileRanges(Ljava/lang/String;ILcom/android/server/PinnerService$PinRangeSource;)Lcom/android/server/PinnerService$PinnedFile;
+PLcom/android/server/PinnerService;->safeClose(Ljava/io/Closeable;)V
+PLcom/android/server/PinnerService;->safeClose(Ljava/io/FileDescriptor;)V
+PLcom/android/server/PinnerService;->safeMunmap(JJ)V
+PLcom/android/server/PinnerService;->unpinCameraApp()V
+PLcom/android/server/PinnerService;->update(Landroid/util/ArraySet;)V
+PLcom/android/server/PruneInstantAppsJobService;-><init>()V
+PLcom/android/server/PruneInstantAppsJobService;->lambda$onStartJob$0(Lcom/android/server/PruneInstantAppsJobService;Landroid/app/job/JobParameters;)V
+PLcom/android/server/PruneInstantAppsJobService;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/PruneInstantAppsJobService;->schedule(Landroid/content/Context;)V
+PLcom/android/server/RandomBlock;-><init>()V
+PLcom/android/server/RandomBlock;->close(Ljava/io/Closeable;)V
+PLcom/android/server/RandomBlock;->fromFile(Ljava/lang/String;)Lcom/android/server/RandomBlock;
+PLcom/android/server/RandomBlock;->fromStream(Ljava/io/InputStream;)Lcom/android/server/RandomBlock;
+PLcom/android/server/RandomBlock;->toDataOut(Ljava/io/DataOutput;)V
+PLcom/android/server/RandomBlock;->toFile(Ljava/lang/String;Z)V
+PLcom/android/server/RandomBlock;->truncateIfPossible(Ljava/io/RandomAccessFile;)V
+PLcom/android/server/RescueParty;->executeRescueLevel(Landroid/content/Context;)V
+PLcom/android/server/RescueParty;->onSettingsProviderPublished(Landroid/content/Context;)V
+PLcom/android/server/SensorNotificationService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/SensorNotificationService;->onBootPhase(I)V
+PLcom/android/server/SensorNotificationService;->onLocationChanged(Landroid/location/Location;)V
+PLcom/android/server/SensorNotificationService;->onStart()V
+PLcom/android/server/SensorNotificationService;->useMockedLocation()Z
+PLcom/android/server/SerialService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/ServiceWatcher$1;-><init>(Lcom/android/server/ServiceWatcher;)V
+PLcom/android/server/ServiceWatcher$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/ServiceWatcher$2;-><init>(Lcom/android/server/ServiceWatcher;)V
+PLcom/android/server/ServiceWatcher$2;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/ServiceWatcher$2;->onPackageChanged(Ljava/lang/String;I[Ljava/lang/String;)Z
+PLcom/android/server/ServiceWatcher$2;->onPackageUpdateFinished(Ljava/lang/String;I)V
+PLcom/android/server/ServiceWatcher;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/Runnable;Landroid/os/Handler;)V
+PLcom/android/server/ServiceWatcher;->access$000(Lcom/android/server/ServiceWatcher;)Ljava/lang/Object;
+PLcom/android/server/ServiceWatcher;->access$100(Lcom/android/server/ServiceWatcher;)Ljava/lang/String;
+PLcom/android/server/ServiceWatcher;->access$200(Lcom/android/server/ServiceWatcher;Ljava/lang/String;Z)Z
+PLcom/android/server/ServiceWatcher;->bindBestPackageLocked(Ljava/lang/String;Z)Z
+PLcom/android/server/ServiceWatcher;->bindToPackageLocked(Landroid/content/ComponentName;II)V
+PLcom/android/server/ServiceWatcher;->getBestPackageName()Ljava/lang/String;
+PLcom/android/server/ServiceWatcher;->getSignatureSets(Landroid/content/Context;Ljava/util/List;)Ljava/util/ArrayList;
+PLcom/android/server/ServiceWatcher;->isServiceMissing()Z
+PLcom/android/server/ServiceWatcher;->isSignatureMatch([Landroid/content/pm/Signature;)Z
+PLcom/android/server/ServiceWatcher;->isSignatureMatch([Landroid/content/pm/Signature;Ljava/util/List;)Z
+PLcom/android/server/ServiceWatcher;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/ServiceWatcher;->runOnBinder(Lcom/android/server/ServiceWatcher$BinderRunner;)Z
+PLcom/android/server/ServiceWatcher;->start()Z
+PLcom/android/server/ServiceWatcher;->switchUser(I)V
+PLcom/android/server/ServiceWatcher;->unbindLocked()V
+PLcom/android/server/ServiceWatcher;->unlockUser(I)V
+PLcom/android/server/StorageManagerService$1;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$2;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/Handler;)V
+PLcom/android/server/StorageManagerService$3;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$3;->onVolumeCreated(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$3;->onVolumeDestroyed(Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$3;->onVolumeInternalPathChanged(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$3;->onVolumePathChanged(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$3;->onVolumeStateChanged(Ljava/lang/String;I)V
+PLcom/android/server/StorageManagerService$4;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$5;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$Callbacks;-><init>(Landroid/os/Looper;)V
+PLcom/android/server/StorageManagerService$Callbacks;->access$2000(Lcom/android/server/StorageManagerService$Callbacks;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$Callbacks;->access$2900(Lcom/android/server/StorageManagerService$Callbacks;Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService$Callbacks;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/StorageManagerService$Callbacks;->invokeCallback(Landroid/os/storage/IStorageEventListener;ILcom/android/internal/os/SomeArgs;)V
+PLcom/android/server/StorageManagerService$Callbacks;->notifyStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService$Callbacks;->notifyVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService$Callbacks;->register(Landroid/os/storage/IStorageEventListener;)V
+PLcom/android/server/StorageManagerService$DefaultContainerConnection;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/StorageManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/StorageManagerService$Lifecycle;->onStart()V
+PLcom/android/server/StorageManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/StorageManagerService$ObbActionHandler;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/Looper;)V
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;-><init>(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;-><init>(Lcom/android/server/StorageManagerService;Lcom/android/server/StorageManagerService$1;)V
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->addExternalStoragePolicy(Landroid/os/storage/StorageManagerInternal$ExternalStorageMountPolicy;)V
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->getExternalStorageMountMode(ILjava/lang/String;)I
+PLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->hasExternalStorage(ILjava/lang/String;)Z
+PLcom/android/server/StorageManagerService$StorageManagerServiceHandler;-><init>(Lcom/android/server/StorageManagerService;Landroid/os/Looper;)V
+PLcom/android/server/StorageManagerService$StorageManagerServiceHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/StorageManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/StorageManagerService;->access$000(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->access$100(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->access$1200(Lcom/android/server/StorageManagerService;)Landroid/os/IVold;
+PLcom/android/server/StorageManagerService;->access$1300(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)Z
+PLcom/android/server/StorageManagerService;->access$1400(Lcom/android/server/StorageManagerService;)Landroid/content/Context;
+PLcom/android/server/StorageManagerService;->access$1700(Lcom/android/server/StorageManagerService;)Landroid/util/ArrayMap;
+PLcom/android/server/StorageManagerService;->access$200(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->access$2100(Lcom/android/server/StorageManagerService;)Ljava/lang/Object;
+PLcom/android/server/StorageManagerService;->access$2200(Lcom/android/server/StorageManagerService;)Landroid/util/ArrayMap;
+PLcom/android/server/StorageManagerService;->access$2600(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;)V
+PLcom/android/server/StorageManagerService;->access$2700(Lcom/android/server/StorageManagerService;Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService;->access$400(Lcom/android/server/StorageManagerService;I)V
+PLcom/android/server/StorageManagerService;->access$800(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->access$900(Lcom/android/server/StorageManagerService;)V
+PLcom/android/server/StorageManagerService;->addInternalVolumeLocked()V
+PLcom/android/server/StorageManagerService;->adjustAllocateFlags(IILjava/lang/String;)I
+PLcom/android/server/StorageManagerService;->allocateBytes(Ljava/lang/String;JILjava/lang/String;)V
+PLcom/android/server/StorageManagerService;->bootCompleted()V
+PLcom/android/server/StorageManagerService;->clearPassword()V
+PLcom/android/server/StorageManagerService;->connect()V
+PLcom/android/server/StorageManagerService;->copyLocaleFromMountService()V
+PLcom/android/server/StorageManagerService;->encodeBytes([B)Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->enforcePermission(Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService;->getAllocatableBytes(Ljava/lang/String;ILjava/lang/String;)J
+PLcom/android/server/StorageManagerService;->getDefaultPrimaryStorageUuid()Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getDisks()[Landroid/os/storage/DiskInfo;
+PLcom/android/server/StorageManagerService;->getField(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getPassword()Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getPrimaryStorageUuid()Ljava/lang/String;
+PLcom/android/server/StorageManagerService;->getVolumeRecords(I)[Landroid/os/storage/VolumeRecord;
+PLcom/android/server/StorageManagerService;->handleDaemonConnected()V
+PLcom/android/server/StorageManagerService;->handleSystemReady()V
+PLcom/android/server/StorageManagerService;->initIfReadyAndConnected()V
+PLcom/android/server/StorageManagerService;->isConvertibleToFBE()Z
+PLcom/android/server/StorageManagerService;->isMountDisallowed(Landroid/os/storage/VolumeInfo;)Z
+PLcom/android/server/StorageManagerService;->killMediaProvider(Ljava/util/List;)V
+PLcom/android/server/StorageManagerService;->lastMaintenance()J
+PLcom/android/server/StorageManagerService;->maybeLogMediaMount(Landroid/os/storage/VolumeInfo;I)V
+PLcom/android/server/StorageManagerService;->mkdirs(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/StorageManagerService;->onAwakeStateChanged(Z)V
+PLcom/android/server/StorageManagerService;->onDaemonConnected()V
+PLcom/android/server/StorageManagerService;->onKeyguardStateChanged(Z)V
+PLcom/android/server/StorageManagerService;->onUnlockUser(I)V
+PLcom/android/server/StorageManagerService;->onVolumeCreatedLocked(Landroid/os/storage/VolumeInfo;)V
+PLcom/android/server/StorageManagerService;->onVolumeStateChangedLocked(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/StorageManagerService;->prepareUserStorage(Ljava/lang/String;III)V
+PLcom/android/server/StorageManagerService;->readSettingsLocked()V
+PLcom/android/server/StorageManagerService;->refreshZramSettings()V
+PLcom/android/server/StorageManagerService;->registerListener(Landroid/os/storage/IStorageEventListener;)V
+PLcom/android/server/StorageManagerService;->resetIfReadyAndConnected()V
+PLcom/android/server/StorageManagerService;->start()V
+PLcom/android/server/StorageManagerService;->systemReady()V
+PLcom/android/server/StorageManagerService;->unlockUserKey(II[B[B)V
+PLcom/android/server/SystemServer;->isFirstBootOrUpgrade()Z
+PLcom/android/server/SystemServer;->lambda$startBootstrapServices$0()V
+PLcom/android/server/SystemServer;->lambda$startOtherServices$1()V
+PLcom/android/server/SystemServer;->lambda$startOtherServices$2()V
+PLcom/android/server/SystemServer;->lambda$startOtherServices$3(Lcom/android/server/SystemServer;)V
+PLcom/android/server/SystemServer;->lambda$startOtherServices$4(Lcom/android/server/SystemServer;Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;Lcom/android/server/NetworkManagementService;Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/IpSecService;Lcom/android/server/net/NetworkStatsService;Lcom/android/server/ConnectivityService;Lcom/android/server/LocationManagerService;Lcom/android/server/CountryDetectorService;Lcom/android/server/NetworkTimeUpdateService;Lcom/android/server/CommonTimeManagementService;Lcom/android/server/input/InputManagerService;Lcom/android/server/TelephonyRegistry;Lcom/android/server/media/MediaRouterService;Lcom/android/server/MmsServiceBroker;)V
+PLcom/android/server/SystemServer;->startCoreServices()V
+PLcom/android/server/SystemServer;->startOtherServices()V
+PLcom/android/server/SystemServer;->startSystemUi(Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/SystemServerInitThreadPool;->shutdown()V
+PLcom/android/server/SystemService;->getBinderService(Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/SystemService;->getLocalService(Ljava/lang/Class;)Ljava/lang/Object;
+PLcom/android/server/SystemService;->getManager()Lcom/android/server/SystemServiceManager;
+PLcom/android/server/SystemService;->isSafeMode()Z
+PLcom/android/server/SystemService;->onStartUser(I)V
+PLcom/android/server/SystemService;->onUnlockUser(I)V
+PLcom/android/server/SystemServiceManager;->isBootCompleted()Z
+PLcom/android/server/SystemServiceManager;->isRuntimeRestarted()Z
+PLcom/android/server/SystemServiceManager;->isSafeMode()Z
+PLcom/android/server/SystemServiceManager;->setSafeMode(Z)V
+PLcom/android/server/SystemServiceManager;->startService(Ljava/lang/String;)Lcom/android/server/SystemService;
+PLcom/android/server/SystemServiceManager;->startUser(I)V
+PLcom/android/server/SystemServiceManager;->unlockUser(I)V
+PLcom/android/server/SystemUpdateManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/SystemUpdateManagerService;->loadSystemUpdateInfoLocked()Landroid/os/Bundle;
+PLcom/android/server/SystemUpdateManagerService;->removeInfoFileAndGetDefaultInfoBundleLocked()Landroid/os/Bundle;
+PLcom/android/server/SystemUpdateManagerService;->retrieveSystemUpdateInfo()Landroid/os/Bundle;
+PLcom/android/server/TelephonyRegistry$1;-><init>(Lcom/android/server/TelephonyRegistry;)V
+PLcom/android/server/TelephonyRegistry$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/TelephonyRegistry$2;-><init>(Lcom/android/server/TelephonyRegistry;)V
+PLcom/android/server/TelephonyRegistry$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/TelephonyRegistry$Record;-><init>()V
+PLcom/android/server/TelephonyRegistry$Record;-><init>(Lcom/android/server/TelephonyRegistry$1;)V
+PLcom/android/server/TelephonyRegistry$Record;->canReadCallLog()Z
+PLcom/android/server/TelephonyRegistry$Record;->matchOnSubscriptionsChangedListener()Z
+PLcom/android/server/TelephonyRegistry$TelephonyRegistryDeathRecipient;-><init>(Lcom/android/server/TelephonyRegistry;Landroid/os/IBinder;)V
+PLcom/android/server/TelephonyRegistry$TelephonyRegistryDeathRecipient;->binderDied()V
+PLcom/android/server/TelephonyRegistry;-><init>(Landroid/content/Context;)V
+PLcom/android/server/TelephonyRegistry;->access$000(Lcom/android/server/TelephonyRegistry;)[Landroid/os/Bundle;
+PLcom/android/server/TelephonyRegistry;->access$100(Lcom/android/server/TelephonyRegistry;)Ljava/util/ArrayList;
+PLcom/android/server/TelephonyRegistry;->access$200(Lcom/android/server/TelephonyRegistry;Lcom/android/server/TelephonyRegistry$Record;I)V
+PLcom/android/server/TelephonyRegistry;->access$300(Lcom/android/server/TelephonyRegistry;)V
+PLcom/android/server/TelephonyRegistry;->access$400(Lcom/android/server/TelephonyRegistry;)I
+PLcom/android/server/TelephonyRegistry;->access$402(Lcom/android/server/TelephonyRegistry;I)I
+PLcom/android/server/TelephonyRegistry;->access$502(Lcom/android/server/TelephonyRegistry;I)I
+PLcom/android/server/TelephonyRegistry;->access$600(Lcom/android/server/TelephonyRegistry;Landroid/os/IBinder;)V
+PLcom/android/server/TelephonyRegistry;->access$700(Lcom/android/server/TelephonyRegistry;)Landroid/os/Handler;
+PLcom/android/server/TelephonyRegistry;->access$800(Lcom/android/server/TelephonyRegistry;I)Z
+PLcom/android/server/TelephonyRegistry;->add(Landroid/os/IBinder;)Lcom/android/server/TelephonyRegistry$Record;
+PLcom/android/server/TelephonyRegistry;->addOnSubscriptionsChangedListener(Ljava/lang/String;Lcom/android/internal/telephony/IOnSubscriptionsChangedListener;)V
+PLcom/android/server/TelephonyRegistry;->broadcastCallStateChanged(ILjava/lang/String;II)V
+PLcom/android/server/TelephonyRegistry;->broadcastDataConnectionFailed(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/TelephonyRegistry;->broadcastDataConnectionStateChanged(IZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ZI)V
+PLcom/android/server/TelephonyRegistry;->broadcastPreciseDataConnectionStateChanged(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/LinkProperties;Ljava/lang/String;)V
+PLcom/android/server/TelephonyRegistry;->broadcastServiceStateChanged(Landroid/telephony/ServiceState;II)V
+PLcom/android/server/TelephonyRegistry;->checkListenerPermission(IILjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/TelephonyRegistry;->checkLocationAccess(Lcom/android/server/TelephonyRegistry$Record;)Z
+PLcom/android/server/TelephonyRegistry;->checkNotifyPermission()Z
+PLcom/android/server/TelephonyRegistry;->checkNotifyPermission(Ljava/lang/String;)Z
+PLcom/android/server/TelephonyRegistry;->checkPossibleMissNotify(Lcom/android/server/TelephonyRegistry$Record;I)V
+PLcom/android/server/TelephonyRegistry;->getCallIncomingNumber(Lcom/android/server/TelephonyRegistry$Record;I)Ljava/lang/String;
+PLcom/android/server/TelephonyRegistry;->handleRemoveListLocked()V
+PLcom/android/server/TelephonyRegistry;->idMatch(III)Z
+PLcom/android/server/TelephonyRegistry;->listen(Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;IZI)V
+PLcom/android/server/TelephonyRegistry;->listenForSubscriber(ILjava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;IZ)V
+PLcom/android/server/TelephonyRegistry;->log(Ljava/lang/String;)V
+PLcom/android/server/TelephonyRegistry;->notifyCallForwardingChangedForSubscriber(IZ)V
+PLcom/android/server/TelephonyRegistry;->notifyCallStateForPhoneId(IIILjava/lang/String;)V
+PLcom/android/server/TelephonyRegistry;->notifyCellLocationForSubscriber(ILandroid/os/Bundle;)V
+PLcom/android/server/TelephonyRegistry;->notifyDataActivityForSubscriber(II)V
+PLcom/android/server/TelephonyRegistry;->notifyDataConnectionFailedForSubscriber(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/TelephonyRegistry;->notifyMessageWaitingChangedForPhoneId(IIZ)V
+PLcom/android/server/TelephonyRegistry;->notifyOemHookRawEventForSubscriber(I[B)V
+PLcom/android/server/TelephonyRegistry;->notifyOtaspChanged(I)V
+PLcom/android/server/TelephonyRegistry;->notifyServiceStateForPhoneId(IILandroid/telephony/ServiceState;)V
+PLcom/android/server/TelephonyRegistry;->notifySubscriptionInfoChanged()V
+PLcom/android/server/TelephonyRegistry;->remove(Landroid/os/IBinder;)V
+PLcom/android/server/TelephonyRegistry;->systemRunning()V
+PLcom/android/server/TelephonyRegistry;->validatePhoneId(I)Z
+PLcom/android/server/TextServicesManagerService$ISpellCheckerServiceCallbackBinder;-><init>(Lcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;Lcom/android/server/TextServicesManagerService$SessionRequest;)V
+PLcom/android/server/TextServicesManagerService$ISpellCheckerServiceCallbackBinder;->onSessionCreated(Lcom/android/internal/textservice/ISpellCheckerSession;)V
+PLcom/android/server/TextServicesManagerService$InternalDeathRecipients;-><init>(Lcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;)V
+PLcom/android/server/TextServicesManagerService$InternalServiceConnection;-><init>(Lcom/android/server/TextServicesManagerService;Ljava/lang/String;Ljava/util/HashMap;)V
+PLcom/android/server/TextServicesManagerService$InternalServiceConnection;->access$1900(Lcom/android/server/TextServicesManagerService$InternalServiceConnection;)Ljava/util/HashMap;
+PLcom/android/server/TextServicesManagerService$InternalServiceConnection;->access$2000(Lcom/android/server/TextServicesManagerService$InternalServiceConnection;)Ljava/lang/String;
+PLcom/android/server/TextServicesManagerService$InternalServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/TextServicesManagerService$InternalServiceConnection;->onServiceConnectedInnerLocked(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/TextServicesManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/TextServicesManagerService$Lifecycle;->onStart()V
+PLcom/android/server/TextServicesManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/TextServicesManagerService$SessionRequest;-><init>(ILjava/lang/String;Lcom/android/internal/textservice/ITextServicesSessionListener;Lcom/android/internal/textservice/ISpellCheckerSessionListener;Landroid/os/Bundle;)V
+PLcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;-><init>(Lcom/android/server/TextServicesManagerService;Lcom/android/server/TextServicesManagerService$InternalServiceConnection;)V
+PLcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;->access$100(Lcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;)Lcom/android/server/TextServicesManagerService$InternalServiceConnection;
+PLcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;->cleanLocked()V
+PLcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;->getISpellCheckerSessionOrQueueLocked(Lcom/android/server/TextServicesManagerService$SessionRequest;)V
+PLcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;->onServiceConnectedLocked(Lcom/android/internal/textservice/ISpellCheckerService;)V
+PLcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;->onSessionCreated(Lcom/android/internal/textservice/ISpellCheckerSession;Lcom/android/server/TextServicesManagerService$SessionRequest;)V
+PLcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;->removeListener(Lcom/android/internal/textservice/ISpellCheckerSessionListener;)V
+PLcom/android/server/TextServicesManagerService$TextServicesData;-><init>(ILandroid/content/Context;)V
+PLcom/android/server/TextServicesManagerService$TextServicesData;->access$1400(Lcom/android/server/TextServicesManagerService$TextServicesData;)Ljava/util/HashMap;
+PLcom/android/server/TextServicesManagerService$TextServicesData;->access$1600(Lcom/android/server/TextServicesManagerService$TextServicesData;)Ljava/util/HashMap;
+PLcom/android/server/TextServicesManagerService$TextServicesData;->access$1700(Lcom/android/server/TextServicesManagerService$TextServicesData;)I
+PLcom/android/server/TextServicesManagerService$TextServicesData;->access$900(Lcom/android/server/TextServicesManagerService$TextServicesData;)V
+PLcom/android/server/TextServicesManagerService$TextServicesData;->getBoolean(Ljava/lang/String;Z)Z
+PLcom/android/server/TextServicesManagerService$TextServicesData;->getCurrentSpellChecker()Landroid/view/textservice/SpellCheckerInfo;
+PLcom/android/server/TextServicesManagerService$TextServicesData;->getInt(Ljava/lang/String;I)I
+PLcom/android/server/TextServicesManagerService$TextServicesData;->getSelectedSpellChecker()Ljava/lang/String;
+PLcom/android/server/TextServicesManagerService$TextServicesData;->getSelectedSpellCheckerSubtype(I)I
+PLcom/android/server/TextServicesManagerService$TextServicesData;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/TextServicesManagerService$TextServicesData;->initializeTextServicesData()V
+PLcom/android/server/TextServicesManagerService$TextServicesData;->isSpellCheckerEnabled()Z
+PLcom/android/server/TextServicesManagerService$TextServicesMonitor;-><init>(Lcom/android/server/TextServicesManagerService;)V
+PLcom/android/server/TextServicesManagerService$TextServicesMonitor;-><init>(Lcom/android/server/TextServicesManagerService;Lcom/android/server/TextServicesManagerService$1;)V
+PLcom/android/server/TextServicesManagerService$TextServicesMonitor;->onSomePackagesChanged()V
+PLcom/android/server/TextServicesManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/TextServicesManagerService;->access$1000(Lcom/android/server/TextServicesManagerService;)Ljava/lang/Object;
+PLcom/android/server/TextServicesManagerService;->access$1100(Lcom/android/server/TextServicesManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/TextServicesManagerService;->access$2100(Lcom/android/server/TextServicesManagerService;)Landroid/content/Context;
+PLcom/android/server/TextServicesManagerService;->bindCurrentSpellCheckerService(Landroid/content/Intent;Landroid/content/ServiceConnection;II)Z
+PLcom/android/server/TextServicesManagerService;->finishSpellCheckerService(Lcom/android/internal/textservice/ISpellCheckerSessionListener;)V
+PLcom/android/server/TextServicesManagerService;->getCurrentSpellChecker(Ljava/lang/String;)Landroid/view/textservice/SpellCheckerInfo;
+PLcom/android/server/TextServicesManagerService;->getCurrentSpellCheckerSubtype(Ljava/lang/String;Z)Landroid/view/textservice/SpellCheckerSubtype;
+PLcom/android/server/TextServicesManagerService;->getDataFromCallingUserIdLocked(I)Lcom/android/server/TextServicesManagerService$TextServicesData;
+PLcom/android/server/TextServicesManagerService;->getSpellCheckerService(Ljava/lang/String;Ljava/lang/String;Lcom/android/internal/textservice/ITextServicesSessionListener;Lcom/android/internal/textservice/ISpellCheckerSessionListener;Landroid/os/Bundle;)V
+PLcom/android/server/TextServicesManagerService;->initializeInternalStateLocked(I)V
+PLcom/android/server/TextServicesManagerService;->isSpellCheckerEnabled()Z
+PLcom/android/server/TextServicesManagerService;->lambda$new$0(Lcom/android/server/TextServicesManagerService;I)I
+PLcom/android/server/TextServicesManagerService;->onUnlockUser(I)V
+PLcom/android/server/TextServicesManagerService;->startSpellCheckerServiceInnerLocked(Landroid/view/textservice/SpellCheckerInfo;Lcom/android/server/TextServicesManagerService$TextServicesData;)Lcom/android/server/TextServicesManagerService$SpellCheckerBindGroup;
+PLcom/android/server/ThreadPriorityBooster$1;->initialValue()Lcom/android/server/ThreadPriorityBooster$PriorityState;
+PLcom/android/server/ThreadPriorityBooster$1;->initialValue()Ljava/lang/Object;
+PLcom/android/server/ThreadPriorityBooster$PriorityState;-><init>()V
+PLcom/android/server/ThreadPriorityBooster$PriorityState;-><init>(Lcom/android/server/ThreadPriorityBooster$1;)V
+PLcom/android/server/ThreadPriorityBooster;->setBoostToPriority(I)V
+PLcom/android/server/UiModeManagerService$1;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$2;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$3;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/UiModeManagerService$4;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$5;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$6;-><init>(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService$6;->getCurrentModeType()I
+PLcom/android/server/UiModeManagerService$6;->getNightMode()I
+PLcom/android/server/UiModeManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/UiModeManagerService;->access$202(Lcom/android/server/UiModeManagerService;Z)Z
+PLcom/android/server/UiModeManagerService;->access$300(Lcom/android/server/UiModeManagerService;)I
+PLcom/android/server/UiModeManagerService;->isDeskDockState(I)Z
+PLcom/android/server/UiModeManagerService;->lambda$onStart$0(Lcom/android/server/UiModeManagerService;)V
+PLcom/android/server/UiModeManagerService;->onBootPhase(I)V
+PLcom/android/server/UiModeManagerService;->onStart()V
+PLcom/android/server/UiModeManagerService;->registerVrStateListener()V
+PLcom/android/server/UiModeManagerService;->sendConfigurationAndStartDreamOrDockAppLocked(Ljava/lang/String;)V
+PLcom/android/server/UiModeManagerService;->sendConfigurationLocked()V
+PLcom/android/server/UiModeManagerService;->updateComputedNightModeLocked()V
+PLcom/android/server/UiModeManagerService;->updateConfigurationLocked()V
+PLcom/android/server/UiModeManagerService;->updateLocked(II)V
+PLcom/android/server/UpdateLockService$LockWatcher;-><init>(Lcom/android/server/UpdateLockService;Landroid/os/Handler;Ljava/lang/String;)V
+PLcom/android/server/UpdateLockService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/UpdateLockService;->sendLockChangedBroadcast(Z)V
+PLcom/android/server/VibratorService$1;-><init>(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService$2;-><init>(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/VibratorService$3;-><init>(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService$3;->run()V
+PLcom/android/server/VibratorService$4;-><init>(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/VibratorService$ScaleLevel;-><init>(F)V
+PLcom/android/server/VibratorService$ScaleLevel;-><init>(FI)V
+PLcom/android/server/VibratorService$SettingsObserver;-><init>(Lcom/android/server/VibratorService;Landroid/os/Handler;)V
+PLcom/android/server/VibratorService$Vibration;-><init>(Lcom/android/server/VibratorService;Landroid/os/IBinder;Landroid/os/VibrationEffect;IILjava/lang/String;)V
+PLcom/android/server/VibratorService$Vibration;-><init>(Lcom/android/server/VibratorService;Landroid/os/IBinder;Landroid/os/VibrationEffect;IILjava/lang/String;Lcom/android/server/VibratorService$1;)V
+PLcom/android/server/VibratorService$Vibration;->isHapticFeedback()Z
+PLcom/android/server/VibratorService$Vibration;->isNotification()Z
+PLcom/android/server/VibratorService$Vibration;->isRingtone()Z
+PLcom/android/server/VibratorService$Vibration;->toInfo()Lcom/android/server/VibratorService$VibrationInfo;
+PLcom/android/server/VibratorService$VibrationInfo;-><init>(JLandroid/os/VibrationEffect;Landroid/os/VibrationEffect;IILjava/lang/String;)V
+PLcom/android/server/VibratorService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/VibratorService;->access$000(Lcom/android/server/VibratorService;)Ljava/lang/Object;
+PLcom/android/server/VibratorService;->access$100(Lcom/android/server/VibratorService;)Lcom/android/server/VibratorService$Vibration;
+PLcom/android/server/VibratorService;->access$300(Lcom/android/server/VibratorService;)V
+PLcom/android/server/VibratorService;->addToPreviousVibrationsLocked(Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService;->applyVibrationIntensityScalingLocked(Lcom/android/server/VibratorService$Vibration;I)V
+PLcom/android/server/VibratorService;->cancelVibrate(Landroid/os/IBinder;)V
+PLcom/android/server/VibratorService;->createEffectFromResource(I)Landroid/os/VibrationEffect;
+PLcom/android/server/VibratorService;->createEffectFromTimings([J)Landroid/os/VibrationEffect;
+PLcom/android/server/VibratorService;->doCancelVibrateLocked()V
+PLcom/android/server/VibratorService;->doVibratorExists()Z
+PLcom/android/server/VibratorService;->doVibratorOff()V
+PLcom/android/server/VibratorService;->doVibratorPrebakedEffectLocked(Lcom/android/server/VibratorService$Vibration;)J
+PLcom/android/server/VibratorService;->getAppOpMode(Lcom/android/server/VibratorService$Vibration;)I
+PLcom/android/server/VibratorService;->getCurrentIntensityLocked(Lcom/android/server/VibratorService$Vibration;)I
+PLcom/android/server/VibratorService;->getLongIntArray(Landroid/content/res/Resources;I)[J
+PLcom/android/server/VibratorService;->hasVibrator()Z
+PLcom/android/server/VibratorService;->intensityToEffectStrength(I)I
+PLcom/android/server/VibratorService;->isAllowedToVibrateLocked(Lcom/android/server/VibratorService$Vibration;)Z
+PLcom/android/server/VibratorService;->isRepeatingVibration(Landroid/os/VibrationEffect;)Z
+PLcom/android/server/VibratorService;->linkVibration(Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService;->noteVibratorOffLocked()V
+PLcom/android/server/VibratorService;->noteVibratorOnLocked(IJ)V
+PLcom/android/server/VibratorService;->onVibrationFinished()V
+PLcom/android/server/VibratorService;->reportFinishVibrationLocked()V
+PLcom/android/server/VibratorService;->startVibrationInnerLocked(Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService;->startVibrationLocked(Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService;->systemReady()V
+PLcom/android/server/VibratorService;->unlinkVibration(Lcom/android/server/VibratorService$Vibration;)V
+PLcom/android/server/VibratorService;->updateInputDeviceVibratorsLocked()Z
+PLcom/android/server/VibratorService;->updateLowPowerModeLocked()Z
+PLcom/android/server/VibratorService;->updateVibrationIntensityLocked()V
+PLcom/android/server/VibratorService;->updateVibrators()V
+PLcom/android/server/VibratorService;->verifyIncomingUid(I)V
+PLcom/android/server/VibratorService;->verifyVibrationEffect(Landroid/os/VibrationEffect;)Z
+PLcom/android/server/VibratorService;->vibrate(ILjava/lang/String;Landroid/os/VibrationEffect;ILandroid/os/IBinder;)V
+PLcom/android/server/Watchdog$OpenFdMonitor;->monitor()Z
+PLcom/android/server/Watchdog$RebootRequestReceiver;-><init>(Lcom/android/server/Watchdog;)V
+PLcom/android/server/Watchdog;->init(Landroid/content/Context;Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/Watchdog;->processStarted(Ljava/lang/String;I)V
+PLcom/android/server/WiredAccessoryManager$1;-><init>(Lcom/android/server/WiredAccessoryManager;Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
+PLcom/android/server/WiredAccessoryManager$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;-><init>(Lcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;Ljava/lang/String;III)V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;->checkSwitchExists()Z
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;->getDevPath()Ljava/lang/String;
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver$UEventInfo;->getSwitchStatePath()Ljava/lang/String;
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;-><init>(Lcom/android/server/WiredAccessoryManager;)V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;->init()V
+PLcom/android/server/WiredAccessoryManager$WiredAccessoryObserver;->makeObservedUEventList()Ljava/util/List;
+PLcom/android/server/WiredAccessoryManager;-><init>(Landroid/content/Context;Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/WiredAccessoryManager;->access$100(Lcom/android/server/WiredAccessoryManager;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/WiredAccessoryManager;->access$200(Lcom/android/server/WiredAccessoryManager;)V
+PLcom/android/server/WiredAccessoryManager;->access$300(Lcom/android/server/WiredAccessoryManager;)Ljava/lang/Object;
+PLcom/android/server/WiredAccessoryManager;->access$400()Ljava/lang/String;
+PLcom/android/server/WiredAccessoryManager;->access$500(Lcom/android/server/WiredAccessoryManager;)Z
+PLcom/android/server/WiredAccessoryManager;->notifyWiredAccessoryChanged(JII)V
+PLcom/android/server/WiredAccessoryManager;->onSystemReady()V
+PLcom/android/server/WiredAccessoryManager;->switchCodeToString(II)Ljava/lang/String;
+PLcom/android/server/WiredAccessoryManager;->systemReady()V
+PLcom/android/server/WiredAccessoryManager;->updateLocked(Ljava/lang/String;I)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$5vwr6qV-eqdCr73CeDmVnsJlZHM;-><init>()V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$5vwr6qV-eqdCr73CeDmVnsJlZHM;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$CNt8wbTQCYcsUnUkUCQHtKqr-tY;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$CNt8wbTQCYcsUnUkUCQHtKqr-tY;->acceptOrThrow(Ljava/lang/Object;)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$K4sS36agT2_B03tVUTy8mldugxY;-><init>(I)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$K4sS36agT2_B03tVUTy8mldugxY;->acceptOrThrow(Ljava/lang/Object;)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$RFkfb_W9wnTTs_gy8Dg3k2uQOYQ;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$RFkfb_W9wnTTs_gy8Dg3k2uQOYQ;->run()V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$mAPLBShddfLlktd9Q8jVo04VVXo;-><init>()V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$mAPLBShddfLlktd9Q8jVo04VVXo;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$w0ifSldCn8nADYgU7v1foSdmfe0;-><init>()V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$w0ifSldCn8nADYgU7v1foSdmfe0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$zXJtauhUptSkQJSF-M55-grAVbo;-><init>()V
+PLcom/android/server/accessibility/-$$Lambda$AccessibilityManagerService$zXJtauhUptSkQJSF-M55-grAVbo;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$1;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$1;->onPackageUpdateFinished(Ljava/lang/String;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService$1;->onSomePackagesChanged()V
+PLcom/android/server/accessibility/AccessibilityManagerService$2;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$AccessibilityContentObserver;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Landroid/os/Handler;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$AccessibilityContentObserver;->register(Landroid/content/ContentResolver;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$Client;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Landroid/view/accessibility/IAccessibilityManagerClient;ILcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$Client;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Landroid/view/accessibility/IAccessibilityManagerClient;ILcom/android/server/accessibility/AccessibilityManagerService$UserState;Lcom/android/server/accessibility/AccessibilityManagerService$1;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$MainHandler;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;Landroid/os/Looper;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$RemoteAccessibilityConnection;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;ILandroid/view/accessibility/IAccessibilityInteractionConnection;Ljava/lang/String;II)V
+PLcom/android/server/accessibility/AccessibilityManagerService$RemoteAccessibilityConnection;->linkToDeath()V
+PLcom/android/server/accessibility/AccessibilityManagerService$RemoteAccessibilityConnection;->unlinkToDeath()V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->access$1400(Lcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->access$1600(Lcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;I)I
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->hasPermission(Ljava/lang/String;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->isCallerInteractingAcrossUsers(I)Z
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->resolveCallingUserIdEnforcingPermissionsLocked(I)I
+PLcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;->resolveProfileParentLocked(I)I
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;-><init>(Lcom/android/server/accessibility/AccessibilityManagerService;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->access$1500(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Ljava/util/Set;
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->getClientState()I
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->isHandlingAccessibilityEvents()Z
+PLcom/android/server/accessibility/AccessibilityManagerService$UserState;->onSwitchToAnotherUserLocked()V
+PLcom/android/server/accessibility/AccessibilityManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$1700(Lcom/android/server/accessibility/AccessibilityManagerService;)Landroid/content/Context;
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$200(Lcom/android/server/accessibility/AccessibilityManagerService;)Ljava/lang/Object;
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$300(Lcom/android/server/accessibility/AccessibilityManagerService;)I
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$3200(Lcom/android/server/accessibility/AccessibilityManagerService;)Landroid/content/pm/PackageManager;
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$400(Lcom/android/server/accessibility/AccessibilityManagerService;)Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$4000()I
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$4100(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;Lcom/android/server/accessibility/AccessibilityManagerService$Client;)I
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$4200(Lcom/android/server/accessibility/AccessibilityManagerService;)Lcom/android/server/accessibility/UiAutomationManager;
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$4300(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$500(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$600(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$700(Lcom/android/server/accessibility/AccessibilityManagerService;I)Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$800(Lcom/android/server/accessibility/AccessibilityManagerService;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->access$900(Lcom/android/server/accessibility/AccessibilityManagerService;I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->addClient(Landroid/view/accessibility/IAccessibilityManagerClient;I)J
+PLcom/android/server/accessibility/AccessibilityManagerService;->broadcastToClients(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;Ljava/util/function/Consumer;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->canRegisterService(Landroid/content/pm/ServiceInfo;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->computeRelevantEventTypesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;Lcom/android/server/accessibility/AccessibilityManagerService$Client;)I
+PLcom/android/server/accessibility/AccessibilityManagerService;->getCurrentUserStateLocked()Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->getEnabledAccessibilityServiceList(II)Ljava/util/List;
+PLcom/android/server/accessibility/AccessibilityManagerService;->getInstalledAccessibilityServiceList(I)Ljava/util/List;
+PLcom/android/server/accessibility/AccessibilityManagerService;->getUserState(I)Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->getUserStateLocked(I)Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
+PLcom/android/server/accessibility/AccessibilityManagerService;->isClientInPackageWhitelist(Landroid/accessibilityservice/AccessibilityServiceInfo;Lcom/android/server/accessibility/AccessibilityManagerService$Client;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$5vwr6qV-eqdCr73CeDmVnsJlZHM(Lcom/android/server/accessibility/AccessibilityManagerService;II)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$mAPLBShddfLlktd9Q8jVo04VVXo(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$sendStateToClients$2(ILandroid/view/accessibility/IAccessibilityManagerClient;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$updateRelevantEventsLocked$0(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;Lcom/android/server/accessibility/AccessibilityManagerService$Client;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$updateRelevantEventsLocked$1(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$w0ifSldCn8nADYgU7v1foSdmfe0(Lcom/android/server/accessibility/AccessibilityManagerService;Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->lambda$zXJtauhUptSkQJSF-M55-grAVbo(Lcom/android/server/accessibility/AccessibilityManagerService;II)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->notifyAccessibilityButtonVisibilityChanged(Z)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->notifyAccessibilityButtonVisibilityChangedLocked(Z)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->onUserStateChangedLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->readAccessibilityButtonSettingsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readAccessibilityShortcutSettingLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readAutoclickEnabledSettingLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readComponentNamesFromSettingLocked(Ljava/lang/String;ILjava/util/Set;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->readComponentNamesFromStringLocked(Ljava/lang/String;Ljava/util/Set;Z)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->readConfigurationForUserStateLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readEnabledAccessibilityServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readHighTextContrastEnabledSettingLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readInstalledAccessibilityServiceLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readMagnificationEnabledSettingsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readTouchExplorationEnabledSettingLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->readTouchExplorationGrantedAccessibilityServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->registerBroadcastReceivers()V
+PLcom/android/server/accessibility/AccessibilityManagerService;->scheduleUpdateClientsIfNeededLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->scheduleUpdateFingerprintGestureHandling(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->scheduleUpdateInputFilter(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->sendStateToAllClients(II)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->sendStateToClients(II)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->sendStateToClients(ILandroid/os/RemoteCallbackList;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->setPictureInPictureActionReplacingConnection(Landroid/view/accessibility/IAccessibilityInteractionConnection;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->switchUser(I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->unbindAllServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->unlockUser(I)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityButtonTargetsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityEnabledSetting(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityFocusBehaviorLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateAccessibilityShortcutLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateDisplayDaltonizerLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateDisplayInversionLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateFilterKeyEventsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateFingerprintGestureHandling(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateInputFilter(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateLegacyCapabilitiesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateMagnificationLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updatePerformGesturesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateRelevantEventsLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateSoftKeyboardShowModeLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateTouchExplorationLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->updateWindowsForAccessibilityCallbackLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)V
+PLcom/android/server/accessibility/AccessibilityManagerService;->userHasListeningMagnificationServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/AccessibilityManagerService;->userHasMagnificationServicesLocked(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Z
+PLcom/android/server/accessibility/DisplayAdjustmentUtils;->applyDaltonizerSetting(Landroid/content/Context;I)V
+PLcom/android/server/accessibility/DisplayAdjustmentUtils;->applyInversionSetting(Landroid/content/Context;I)V
+PLcom/android/server/accessibility/GlobalActionPerformer;-><init>(Landroid/content/Context;Lcom/android/server/wm/WindowManagerInternal;)V
+PLcom/android/server/accessibility/UiAutomationManager$1;-><init>(Lcom/android/server/accessibility/UiAutomationManager;)V
+PLcom/android/server/accessibility/UiAutomationManager;-><init>()V
+PLcom/android/server/accessibility/UiAutomationManager;->canRetrieveInteractiveWindowsLocked()Z
+PLcom/android/server/accessibility/UiAutomationManager;->getServiceInfo()Landroid/accessibilityservice/AccessibilityServiceInfo;
+PLcom/android/server/accessibility/UiAutomationManager;->isTouchExplorationEnabledLocked()Z
+PLcom/android/server/accessibility/UiAutomationManager;->isUiAutomationRunningLocked()Z
+PLcom/android/server/accessibility/UiAutomationManager;->suppressingAccessibilityServicesLocked()Z
+PLcom/android/server/accounts/-$$Lambda$AccountManagerService$c6GExIY3Vh2fORdBziuAPJbExac;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/-$$Lambda$AccountManagerService$c6GExIY3Vh2fORdBziuAPJbExac;->onPermissionsChanged(I)V
+PLcom/android/server/accounts/-$$Lambda$AccountManagerService$nCdu9dc3c8qBwJIwS0ZQk2waXfY;-><init>(Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener;Landroid/accounts/Account;I)V
+PLcom/android/server/accounts/-$$Lambda$AccountManagerService$nCdu9dc3c8qBwJIwS0ZQk2waXfY;->run()V
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;-><init>()V
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;-><init>(Lcom/android/server/accounts/AccountAuthenticatorCache$1;)V
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;->createFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/accounts/AuthenticatorDescription;
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;->createFromXml(Lorg/xmlpull/v1/XmlPullParser;)Ljava/lang/Object;
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;->writeAsXml(Landroid/accounts/AuthenticatorDescription;Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/accounts/AccountAuthenticatorCache$MySerializer;->writeAsXml(Ljava/lang/Object;Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/accounts/AccountAuthenticatorCache;-><init>(Landroid/content/Context;)V
+PLcom/android/server/accounts/AccountAuthenticatorCache;->getServiceInfo(Landroid/accounts/AuthenticatorDescription;I)Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
+PLcom/android/server/accounts/AccountAuthenticatorCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/accounts/AuthenticatorDescription;
+PLcom/android/server/accounts/AccountAuthenticatorCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Ljava/lang/Object;
+PLcom/android/server/accounts/AccountManagerBackupHelper;-><init>(Lcom/android/server/accounts/AccountManagerService;Landroid/accounts/AccountManagerInternal;)V
+PLcom/android/server/accounts/AccountManagerBackupHelper;->backupAccountAccessPermissions(I)[B
+PLcom/android/server/accounts/AccountManagerService$10;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZZLjava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService$10;->run()V
+PLcom/android/server/accounts/AccountManagerService$1;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/accounts/AccountManagerService$1LogRecordTask;-><init>(Lcom/android/server/accounts/AccountManagerService;Ljava/lang/String;Ljava/lang/String;JLcom/android/server/accounts/AccountManagerService$UserAccounts;IJ)V
+PLcom/android/server/accounts/AccountManagerService$1LogRecordTask;->run()V
+PLcom/android/server/accounts/AccountManagerService$2;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$3;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$3;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/accounts/AccountManagerService$3;->onPackageUpdateFinished(Ljava/lang/String;I)V
+PLcom/android/server/accounts/AccountManagerService$4;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$8;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZLandroid/os/Bundle;Landroid/accounts/Account;Ljava/lang/String;ZZIZLjava/lang/String;[BLcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService$8;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$8;->run()V
+PLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;-><init>(Lcom/android/server/accounts/AccountManagerService;)V
+PLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$1;)V
+PLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;->addOnAppPermissionChangeListener(Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener;)V
+PLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;->backupAccountAccessPermissions(I)[B
+PLcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;->hasAccountAccess(Landroid/accounts/Account;I)Z
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;ILjava/lang/String;Z)V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->checkAccount()V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->run()V
+PLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->sendResult()V
+PLcom/android/server/accounts/AccountManagerService$Injector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/accounts/AccountManagerService$Injector;->addLocalService(Landroid/accounts/AccountManagerInternal;)V
+PLcom/android/server/accounts/AccountManagerService$Injector;->getAccountAuthenticatorCache()Lcom/android/server/accounts/IAccountAuthenticatorCache;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getCeDatabaseName(I)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getContext()Landroid/content/Context;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getDeDatabaseName(I)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getMessageHandlerLooper()Landroid/os/Looper;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getNotificationManager()Landroid/app/INotificationManager;
+PLcom/android/server/accounts/AccountManagerService$Injector;->getPreNDatabaseName(I)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/accounts/AccountManagerService$Lifecycle;->onStart()V
+PLcom/android/server/accounts/AccountManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/accounts/AccountManagerService$MessageHandler;-><init>(Lcom/android/server/accounts/AccountManagerService;Landroid/os/Looper;)V
+PLcom/android/server/accounts/AccountManagerService$NotificationId;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/accounts/AccountManagerService$NotificationId;->access$3800(Lcom/android/server/accounts/AccountManagerService$NotificationId;)I
+PLcom/android/server/accounts/AccountManagerService$RemoveAccountSession;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;Z)V
+PLcom/android/server/accounts/AccountManagerService$RemoveAccountSession;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$RemoveAccountSession;->run()V
+PLcom/android/server/accounts/AccountManagerService$Session;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;Z)V
+PLcom/android/server/accounts/AccountManagerService$Session;->bind()V
+PLcom/android/server/accounts/AccountManagerService$Session;->bindToAuthenticator(Ljava/lang/String;)Z
+PLcom/android/server/accounts/AccountManagerService$Session;->cancelTimeout()V
+PLcom/android/server/accounts/AccountManagerService$Session;->checkKeyIntent(ILandroid/content/Intent;)Z
+PLcom/android/server/accounts/AccountManagerService$Session;->close()V
+PLcom/android/server/accounts/AccountManagerService$Session;->getResponseAndClose()Landroid/accounts/IAccountManagerResponse;
+PLcom/android/server/accounts/AccountManagerService$Session;->isExportedSystemActivity(Landroid/content/pm/ActivityInfo;)Z
+PLcom/android/server/accounts/AccountManagerService$Session;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$Session;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/accounts/AccountManagerService$Session;->unbind()V
+PLcom/android/server/accounts/AccountManagerService$TestFeaturesSession;-><init>(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;[Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService$TestFeaturesSession;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService$TestFeaturesSession;->run()V
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;-><init>(Landroid/content/Context;ILjava/io/File;Ljava/io/File;)V
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$1000(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$1100(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$1200(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$1300(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Lcom/android/server/accounts/TokenCache;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$1400(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Landroid/database/sqlite/SQLiteStatement;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$1402(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/database/sqlite/SQLiteStatement;)Landroid/database/sqlite/SQLiteStatement;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$1500(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/HashMap;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$1700(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/HashMap;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$2300(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/HashMap;
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$3700(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I
+PLcom/android/server/accounts/AccountManagerService$UserAccounts;->access$3702(Lcom/android/server/accounts/AccountManagerService$UserAccounts;I)I
+PLcom/android/server/accounts/AccountManagerService;-><init>(Lcom/android/server/accounts/AccountManagerService$Injector;)V
+PLcom/android/server/accounts/AccountManagerService;->access$1800(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;I)Z
+PLcom/android/server/accounts/AccountManagerService;->access$2100(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;[BLjava/lang/String;Ljava/lang/String;J)V
+PLcom/android/server/accounts/AccountManagerService;->access$2900(Lcom/android/server/accounts/AccountManagerService;)Ljava/util/LinkedHashMap;
+PLcom/android/server/accounts/AccountManagerService;->access$3200(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Lcom/android/server/accounts/AccountManagerService$NotificationId;
+PLcom/android/server/accounts/AccountManagerService;->access$3300(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$NotificationId;Landroid/os/UserHandle;)V
+PLcom/android/server/accounts/AccountManagerService;->access$3400(Lcom/android/server/accounts/AccountManagerService;)Lcom/android/server/accounts/IAccountAuthenticatorCache;
+PLcom/android/server/accounts/AccountManagerService;->access$3500(Lcom/android/server/accounts/AccountManagerService;I)Z
+PLcom/android/server/accounts/AccountManagerService;->access$3600(Lcom/android/server/accounts/AccountManagerService;)Ljava/text/SimpleDateFormat;
+PLcom/android/server/accounts/AccountManagerService;->access$400(Lcom/android/server/accounts/AccountManagerService;IZ)V
+PLcom/android/server/accounts/AccountManagerService;->access$4200(Lcom/android/server/accounts/AccountManagerService;)Ljava/util/concurrent/CopyOnWriteArrayList;
+PLcom/android/server/accounts/AccountManagerService;->access$4300(Lcom/android/server/accounts/AccountManagerService;Landroid/accounts/Account;Ljava/lang/String;I)Z
+PLcom/android/server/accounts/AccountManagerService;->accountExistsCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Z
+PLcom/android/server/accounts/AccountManagerService;->addAccountAsUser(Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;ZLandroid/os/Bundle;I)V
+PLcom/android/server/accounts/AccountManagerService;->addAccountExplicitly(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Z
+PLcom/android/server/accounts/AccountManagerService;->addAccountExplicitlyWithVisibility(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/Map;)Z
+PLcom/android/server/accounts/AccountManagerService;->addAccountInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;ILjava/util/Map;)Z
+PLcom/android/server/accounts/AccountManagerService;->addAccountToLinkedRestrictedUsers(Landroid/accounts/Account;I)V
+PLcom/android/server/accounts/AccountManagerService;->calculatePackageSignatureDigest(Ljava/lang/String;)[B
+PLcom/android/server/accounts/AccountManagerService;->canHaveProfile(I)Z
+PLcom/android/server/accounts/AccountManagerService;->canUserModifyAccounts(II)Z
+PLcom/android/server/accounts/AccountManagerService;->canUserModifyAccountsForType(ILjava/lang/String;I)Z
+PLcom/android/server/accounts/AccountManagerService;->cancelAccountAccessRequestNotificationIfNeeded(IZ)V
+PLcom/android/server/accounts/AccountManagerService;->cancelAccountAccessRequestNotificationIfNeeded(Landroid/accounts/Account;ILjava/lang/String;Z)V
+PLcom/android/server/accounts/AccountManagerService;->cancelAccountAccessRequestNotificationIfNeeded(Landroid/accounts/Account;IZ)V
+PLcom/android/server/accounts/AccountManagerService;->cancelNotification(Lcom/android/server/accounts/AccountManagerService$NotificationId;Landroid/os/UserHandle;)V
+PLcom/android/server/accounts/AccountManagerService;->checkGetAccountsPermission(Ljava/lang/String;II)Z
+PLcom/android/server/accounts/AccountManagerService;->checkReadAccountsPermitted(ILjava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->checkReadContactsPermission(Ljava/lang/String;II)Z
+PLcom/android/server/accounts/AccountManagerService;->getAccountRemovedReceivers(Landroid/accounts/Account;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/List;
+PLcom/android/server/accounts/AccountManagerService;->getAccounts(Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;
+PLcom/android/server/accounts/AccountManagerService;->getAccounts([I)[Landroid/accounts/AccountAndUser;
+PLcom/android/server/accounts/AccountManagerService;->getAccountsByFeatures(Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->getAllAccounts()[Landroid/accounts/AccountAndUser;
+PLcom/android/server/accounts/AccountManagerService;->getAuthenticatorTypeAndUIDForUser(Lcom/android/server/accounts/IAccountAuthenticatorCache;I)Ljava/util/HashMap;
+PLcom/android/server/accounts/AccountManagerService;->getAuthenticatorTypesInternal(I)[Landroid/accounts/AuthenticatorDescription;
+PLcom/android/server/accounts/AccountManagerService;->getCredentialPermissionNotificationId(Landroid/accounts/Account;Ljava/lang/String;I)Lcom/android/server/accounts/AccountManagerService$NotificationId;
+PLcom/android/server/accounts/AccountManagerService;->getPackageNameForUid(I)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->getPreviousName(Landroid/accounts/Account;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->getRequestingPackages(Landroid/accounts/Account;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountManagerService;->getRunningAccounts()[Landroid/accounts/AccountAndUser;
+PLcom/android/server/accounts/AccountManagerService;->getSigninRequiredNotificationId(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Lcom/android/server/accounts/AccountManagerService$NotificationId;
+PLcom/android/server/accounts/AccountManagerService;->getSingleton()Lcom/android/server/accounts/AccountManagerService;
+PLcom/android/server/accounts/AccountManagerService;->getUidsOfInstalledOrUpdatedPackagesAsUser(I)Landroid/util/SparseBooleanArray;
+PLcom/android/server/accounts/AccountManagerService;->grantAppPermission(Landroid/accounts/Account;Ljava/lang/String;I)V
+PLcom/android/server/accounts/AccountManagerService;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;I)Z
+PLcom/android/server/accounts/AccountManagerService;->hasExplicitlyGrantedPermission(Landroid/accounts/Account;Ljava/lang/String;I)Z
+PLcom/android/server/accounts/AccountManagerService;->hasFeatures(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;[Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->initializeDebugDbSizeAndCompileSqlStatementForLogging(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->insertAccountIntoCacheLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Landroid/accounts/Account;
+PLcom/android/server/accounts/AccountManagerService;->invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->invalidateAuthTokenLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/accounts/AccountManagerService;->isAccountVisibleToCaller(Ljava/lang/String;IILjava/lang/String;)Z
+PLcom/android/server/accounts/AccountManagerService;->isCrossUser(II)Z
+PLcom/android/server/accounts/AccountManagerService;->isLocalUnlockedUser(I)Z
+PLcom/android/server/accounts/AccountManagerService;->lambda$grantAppPermission$3(Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener;Landroid/accounts/Account;I)V
+PLcom/android/server/accounts/AccountManagerService;->lambda$new$0(Lcom/android/server/accounts/AccountManagerService;I)V
+PLcom/android/server/accounts/AccountManagerService;->logRecord(Ljava/lang/String;Ljava/lang/String;JLcom/android/server/accounts/AccountManagerService$UserAccounts;I)V
+PLcom/android/server/accounts/AccountManagerService;->logRecordWithUid(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/accounts/AccountManagerService;->notifyPackage(Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->onResult(Landroid/accounts/IAccountManagerResponse;Landroid/os/Bundle;)V
+PLcom/android/server/accounts/AccountManagerService;->onServiceChanged(Landroid/accounts/AuthenticatorDescription;IZ)V
+PLcom/android/server/accounts/AccountManagerService;->onServiceChanged(Ljava/lang/Object;IZ)V
+PLcom/android/server/accounts/AccountManagerService;->onUnlockUser(I)V
+PLcom/android/server/accounts/AccountManagerService;->purgeOldGrants(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->readAuthTokenInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->readCachedTokenInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;[B)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->readPasswordInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->readPreviousNameInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->readUserDataInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountManagerService;->registerAccountListener([Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->registerAccountListener([Ljava/lang/String;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->removeAccount(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;Z)V
+PLcom/android/server/accounts/AccountManagerService;->removeAccountAsUser(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;ZI)V
+PLcom/android/server/accounts/AccountManagerService;->removeAccountInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;I)Z
+PLcom/android/server/accounts/AccountManagerService;->saveAuthTokenToDatabase(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/accounts/AccountManagerService;->saveCachedToken(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;[BLjava/lang/String;Ljava/lang/String;J)V
+PLcom/android/server/accounts/AccountManagerService;->sendAccountsChangedBroadcast(I)V
+PLcom/android/server/accounts/AccountManagerService;->sendNotificationAccountUpdated(Landroid/accounts/Account;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->setPassword(Landroid/accounts/Account;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->setPasswordInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;I)V
+PLcom/android/server/accounts/AccountManagerService;->setUserdataInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->syncDeCeAccountsLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->unregisterAccountListener([Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->unregisterAccountListener([Ljava/lang/String;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V
+PLcom/android/server/accounts/AccountManagerService;->updateAppPermission(Landroid/accounts/Account;Ljava/lang/String;IZ)V
+PLcom/android/server/accounts/AccountManagerService;->validateAccounts(I)V
+PLcom/android/server/accounts/AccountManagerService;->validateAccountsInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Z)V
+PLcom/android/server/accounts/AccountManagerService;->writeAuthTokenIntoCacheLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountManagerService;->writeUserDataIntoCacheLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountsDb$CeDatabaseHelper;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/accounts/AccountsDb$CeDatabaseHelper;->create(Landroid/content/Context;Ljava/io/File;Ljava/io/File;)Lcom/android/server/accounts/AccountsDb$CeDatabaseHelper;
+PLcom/android/server/accounts/AccountsDb$CeDatabaseHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;-><init>(Landroid/content/Context;ILjava/lang/String;)V
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;-><init>(Landroid/content/Context;ILjava/lang/String;Lcom/android/server/accounts/AccountsDb$1;)V
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->access$602(Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;Z)Z
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->getReadableDatabaseUserIsUnlocked()Landroid/database/sqlite/SQLiteDatabase;
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->getWritableDatabaseUserIsUnlocked()Landroid/database/sqlite/SQLiteDatabase;
+PLcom/android/server/accounts/AccountsDb$DeDatabaseHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V
+PLcom/android/server/accounts/AccountsDb;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/accounts/AccountsDb;-><init>(Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;Landroid/content/Context;Ljava/io/File;)V
+PLcom/android/server/accounts/AccountsDb;->attachCeDatabase(Ljava/io/File;)V
+PLcom/android/server/accounts/AccountsDb;->beginTransaction()V
+PLcom/android/server/accounts/AccountsDb;->calculateDebugTableInsertionPoint()I
+PLcom/android/server/accounts/AccountsDb;->compileSqlStatementForLogging()Landroid/database/sqlite/SQLiteStatement;
+PLcom/android/server/accounts/AccountsDb;->create(Landroid/content/Context;ILjava/io/File;Ljava/io/File;)Lcom/android/server/accounts/AccountsDb;
+PLcom/android/server/accounts/AccountsDb;->deleteAuthToken(Ljava/lang/String;)Z
+PLcom/android/server/accounts/AccountsDb;->deleteAuthTokensByAccountId(J)Z
+PLcom/android/server/accounts/AccountsDb;->deleteAuthtokensByAccountIdAndType(JLjava/lang/String;)Z
+PLcom/android/server/accounts/AccountsDb;->endTransaction()V
+PLcom/android/server/accounts/AccountsDb;->findAccountPasswordByNameAndType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountsDb;->findAllAccountGrants()Ljava/util/List;
+PLcom/android/server/accounts/AccountsDb;->findAllDeAccounts()Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->findAllUidGrants()Ljava/util/List;
+PLcom/android/server/accounts/AccountsDb;->findAllVisibilityValues()Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->findAuthTokensByAccount(Landroid/accounts/Account;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->findAuthtokenForAllAccounts(Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
+PLcom/android/server/accounts/AccountsDb;->findCeAccountId(Landroid/accounts/Account;)J
+PLcom/android/server/accounts/AccountsDb;->findCeAccountsNotInDe()Ljava/util/List;
+PLcom/android/server/accounts/AccountsDb;->findDeAccountId(Landroid/accounts/Account;)J
+PLcom/android/server/accounts/AccountsDb;->findDeAccountPreviousName(Landroid/accounts/Account;)Ljava/lang/String;
+PLcom/android/server/accounts/AccountsDb;->findExtrasIdByAccountId(JLjava/lang/String;)J
+PLcom/android/server/accounts/AccountsDb;->findMatchingGrantsCountAnyToken(ILandroid/accounts/Account;)J
+PLcom/android/server/accounts/AccountsDb;->findMetaAuthUid()Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->findUserExtrasForAccount(Landroid/accounts/Account;)Ljava/util/Map;
+PLcom/android/server/accounts/AccountsDb;->insertAuthToken(JLjava/lang/String;Ljava/lang/String;)J
+PLcom/android/server/accounts/AccountsDb;->insertCeAccount(Landroid/accounts/Account;Ljava/lang/String;)J
+PLcom/android/server/accounts/AccountsDb;->insertDeAccount(Landroid/accounts/Account;J)J
+PLcom/android/server/accounts/AccountsDb;->insertExtra(JLjava/lang/String;Ljava/lang/String;)J
+PLcom/android/server/accounts/AccountsDb;->insertGrant(JLjava/lang/String;I)J
+PLcom/android/server/accounts/AccountsDb;->insertOrReplaceMetaAuthTypeAndUid(Ljava/lang/String;I)J
+PLcom/android/server/accounts/AccountsDb;->setTransactionSuccessful()V
+PLcom/android/server/accounts/AccountsDb;->updateCeAccountPassword(JLjava/lang/String;)I
+PLcom/android/server/accounts/AccountsDb;->updateExtra(JLjava/lang/String;)Z
+PLcom/android/server/accounts/TokenCache$Key;-><init>(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;[B)V
+PLcom/android/server/accounts/TokenCache$Key;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/accounts/TokenCache$Key;->hashCode()I
+PLcom/android/server/accounts/TokenCache$TokenLruCache$Evictor;-><init>(Lcom/android/server/accounts/TokenCache$TokenLruCache;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache$Evictor;->add(Lcom/android/server/accounts/TokenCache$Key;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache$Evictor;->evict()V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;-><init>()V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->entryRemoved(ZLcom/android/server/accounts/TokenCache$Key;Lcom/android/server/accounts/TokenCache$Value;Lcom/android/server/accounts/TokenCache$Value;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->entryRemoved(ZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->evict(Landroid/accounts/Account;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->evict(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->putToken(Lcom/android/server/accounts/TokenCache$Key;Lcom/android/server/accounts/TokenCache$Value;)V
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->sizeOf(Lcom/android/server/accounts/TokenCache$Key;Lcom/android/server/accounts/TokenCache$Value;)I
+PLcom/android/server/accounts/TokenCache$TokenLruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/accounts/TokenCache$Value;-><init>(Ljava/lang/String;J)V
+PLcom/android/server/accounts/TokenCache;-><init>()V
+PLcom/android/server/accounts/TokenCache;->get(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;[B)Ljava/lang/String;
+PLcom/android/server/accounts/TokenCache;->put(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[BJ)V
+PLcom/android/server/accounts/TokenCache;->remove(Landroid/accounts/Account;)V
+PLcom/android/server/accounts/TokenCache;->remove(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/-$$Lambda$5hokEl5hcign5FXeGZdl53qh2zg;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/-$$Lambda$5hokEl5hcign5FXeGZdl53qh2zg;->run()V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$3$poTyYzHinA8s8lAJ-y6Bb3JsBNo;-><init>()V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$3$poTyYzHinA8s8lAJ-y6Bb3JsBNo;->needed(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$UgpguyCBuObHjnmry_xkrJGkFi0;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;JLjava/lang/String;Ljava/lang/String;[IIILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$UgpguyCBuObHjnmry_xkrJGkFi0;->run()V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$eFxS8Z-_MXzP9a8ro45rBMHy3bk;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$gATL8uvTPRd405IfefK1RL9bNqA;-><init>(Landroid/hardware/display/DisplayManagerInternal;)V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$gATL8uvTPRd405IfefK1RL9bNqA;->run()V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$w5jCshLsk1jfv4UDTmEfq_HU0OQ;-><init>(Landroid/os/DropBoxManager;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/-$$Lambda$ActivityManagerService$w5jCshLsk1jfv4UDTmEfq_HU0OQ;->run()V
+PLcom/android/server/am/-$$Lambda$ActivityMetricsLogger$EXtnEt47a9lJOX0u5R1TXhfh0XE;-><init>(Lcom/android/server/am/ActivityMetricsLogger;IILcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)V
+PLcom/android/server/am/-$$Lambda$ActivityMetricsLogger$EXtnEt47a9lJOX0u5R1TXhfh0XE;->run()V
+PLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$Nx17DLnpsjeC2juW1TuPEAogLvE;-><init>(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+PLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$Nx17DLnpsjeC2juW1TuPEAogLvE;->run()V
+PLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$PpNEY15dspg9oLlkg1OsyjrPTqw;->run()V
+PLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$cC4f0pNQX9_D9f8AXLmKk2sArGY;-><init>()V
+PLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$cC4f0pNQX9_D9f8AXLmKk2sArGY;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$eNtlYRY6yBjSWzaL4STPjcGEduM;-><init>(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+PLcom/android/server/am/-$$Lambda$BatteryStatsService$ZxbqtJ7ozYmzYFkkNV3m_QRd0Sk;-><init>(Lcom/android/server/am/BatteryStatsService;IIIIIIII)V
+PLcom/android/server/am/-$$Lambda$BatteryStatsService$ZxbqtJ7ozYmzYFkkNV3m_QRd0Sk;->run()V
+PLcom/android/server/am/-$$Lambda$BatteryStatsService$rRONgIFHr4sujxPESRmo9P5RJ6w;-><init>(Lcom/android/server/am/BatteryStatsService;IIIIIIII)V
+PLcom/android/server/am/-$$Lambda$BatteryStatsService$rRONgIFHr4sujxPESRmo9P5RJ6w;->run()V
+PLcom/android/server/am/-$$Lambda$PendingRemoteAnimationRegistry$Entry$nMsaTjyghAPVeCjs7XjsdMM78mc;-><init>(Lcom/android/server/am/PendingRemoteAnimationRegistry$Entry;Ljava/lang/String;)V
+PLcom/android/server/am/-$$Lambda$PendingRemoteAnimationRegistry$Entry$nMsaTjyghAPVeCjs7XjsdMM78mc;->run()V
+PLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$1RAH1a7gRlnrDczBty2_cTiNlBI;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$IPqcWaWHIL4UnZEYJhAve5H7KmE;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$K9kaSj6_p5pzfyRh9i93xiC9T3s;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$O2UuB84QeMcZfsRHiuiFSTwwWHY;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$YDk9fnP8p2R_OweiU9rSGaheQeE;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$bteC39aBoUFmJeWf3dk2BX1xZ6k;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$grn5FwM5ofT98exjpSvrJhz-e7s;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$kftD881t3KfWCASQEbeTkieVI2M;->accept(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/-$$Lambda$UserController$Eh5Od1-6teHInq04bnfmHhMt3-E;-><init>(Lcom/android/server/am/UserController;I)V
+PLcom/android/server/am/-$$Lambda$UserController$Eh5Od1-6teHInq04bnfmHhMt3-E;->run()V
+PLcom/android/server/am/-$$Lambda$UserController$d0zeElfogOIugnQQLWhCzumk53k;-><init>(Lcom/android/server/am/UserController;Lcom/android/server/am/UserState;)V
+PLcom/android/server/am/-$$Lambda$UserController$d0zeElfogOIugnQQLWhCzumk53k;->run()V
+PLcom/android/server/am/-$$Lambda$UserController$o6oQFjGYYIfx-I94cSakTLPLt6s;-><init>(Lcom/android/server/am/UserController;ILcom/android/server/am/UserState;)V
+PLcom/android/server/am/-$$Lambda$UserController$o6oQFjGYYIfx-I94cSakTLPLt6s;->run()V
+PLcom/android/server/am/-$$Lambda$Y_KRxxoOXfy-YceuDG7WHd46Y_I;-><init>()V
+PLcom/android/server/am/ActiveServices$ForcedStandbyListener;-><init>(Lcom/android/server/am/ActiveServices;)V
+PLcom/android/server/am/ActiveServices$ServiceMap;-><init>(Lcom/android/server/am/ActiveServices;Landroid/os/Looper;I)V
+PLcom/android/server/am/ActiveServices$ServiceMap;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActiveServices$ServiceRestarter;->run()V
+PLcom/android/server/am/ActiveServices;->appRestrictedAnyInBackground(ILjava/lang/String;)Z
+PLcom/android/server/am/ActiveServices;->attachApplicationLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)Z
+PLcom/android/server/am/ActiveServices;->bringDownDisabledPackageServicesLocked(Ljava/lang/String;Ljava/util/Set;IZZZ)Z
+PLcom/android/server/am/ActiveServices;->cleanUpRemovedTaskLocked(Lcom/android/server/am/TaskRecord;Landroid/content/ComponentName;Landroid/content/Intent;)V
+PLcom/android/server/am/ActiveServices;->clearRestartingIfNeededLocked(Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->dumpService(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;Ljava/lang/String;[Ljava/lang/String;IZ)Z
+PLcom/android/server/am/ActiveServices;->dumpService(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;Lcom/android/server/am/ServiceRecord;[Ljava/lang/String;Z)V
+PLcom/android/server/am/ActiveServices;->forceStopPackageLocked(Ljava/lang/String;I)V
+PLcom/android/server/am/ActiveServices;->getRunningServiceInfoLocked(IIIZZ)Ljava/util/List;
+PLcom/android/server/am/ActiveServices;->getServicesLocked(I)Landroid/util/ArrayMap;
+PLcom/android/server/am/ActiveServices;->killServicesLocked(Lcom/android/server/am/ProcessRecord;Z)V
+PLcom/android/server/am/ActiveServices;->performServiceRestartLocked(Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->scheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;Z)Z
+PLcom/android/server/am/ActiveServices;->serviceProcessGoneLocked(Lcom/android/server/am/ServiceRecord;)V
+PLcom/android/server/am/ActiveServices;->serviceTimeout(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActiveServices;->setServiceForegroundInnerLocked(Lcom/android/server/am/ServiceRecord;ILandroid/app/Notification;I)V
+PLcom/android/server/am/ActiveServices;->setServiceForegroundLocked(Landroid/content/ComponentName;Landroid/os/IBinder;ILandroid/app/Notification;I)V
+PLcom/android/server/am/ActiveServices;->systemServicesReady()V
+PLcom/android/server/am/ActiveServices;->unbindFinishedLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Z)V
+PLcom/android/server/am/ActiveServices;->updateScreenStateLocked(Z)V
+PLcom/android/server/am/ActiveServices;->updateServiceApplicationInfoLocked(Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/am/ActiveServices;->updateServiceConnectionActivitiesLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActiveServices;->updateWhitelistManagerLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityDisplay;-><init>(Lcom/android/server/am/ActivityStackSupervisor;Landroid/view/Display;)V
+PLcom/android/server/am/ActivityDisplay;->addChild(Lcom/android/server/am/ActivityStack;I)V
+PLcom/android/server/am/ActivityDisplay;->addStackReferenceIfNeeded(Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityDisplay;->alwaysCreateStack(II)Z
+PLcom/android/server/am/ActivityDisplay;->continueUpdateImeTarget()V
+PLcom/android/server/am/ActivityDisplay;->createStack(IIZ)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityDisplay;->createStackUnchecked(IIIZ)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityDisplay;->createWindowContainerController()Lcom/android/server/wm/DisplayWindowController;
+PLcom/android/server/am/ActivityDisplay;->deferUpdateImeTarget()V
+PLcom/android/server/am/ActivityDisplay;->getChildAt(I)Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/am/ActivityDisplay;->getIndexOf(Lcom/android/server/am/ActivityStack;)I
+PLcom/android/server/am/ActivityDisplay;->getNextStackId()I
+PLcom/android/server/am/ActivityDisplay;->getOrCreateStack(IIZ)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityDisplay;->getOrCreateStack(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;IZ)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityDisplay;->getParent()Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/am/ActivityDisplay;->getSplitScreenPrimaryStack()Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityDisplay;->getStack(I)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityDisplay;->getStack(II)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityDisplay;->getTopInsertPosition(Lcom/android/server/am/ActivityStack;I)I
+PLcom/android/server/am/ActivityDisplay;->getTopStack()Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityDisplay;->hasPinnedStack()Z
+PLcom/android/server/am/ActivityDisplay;->hasSplitScreenPrimaryStack()Z
+PLcom/android/server/am/ActivityDisplay;->isPrivate()Z
+PLcom/android/server/am/ActivityDisplay;->isSleeping()Z
+PLcom/android/server/am/ActivityDisplay;->isTopStack(Lcom/android/server/am/ActivityStack;)Z
+PLcom/android/server/am/ActivityDisplay;->isWindowingModeSupported(IZZZZI)Z
+PLcom/android/server/am/ActivityDisplay;->onLockTaskPackagesUpdated()V
+PLcom/android/server/am/ActivityDisplay;->onStackOrderChanged()V
+PLcom/android/server/am/ActivityDisplay;->onStackWindowingModeChanged(Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityDisplay;->positionChildAt(Lcom/android/server/am/ActivityStack;I)V
+PLcom/android/server/am/ActivityDisplay;->positionChildAtBottom(Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityDisplay;->positionChildAtTop(Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityDisplay;->removeChild(Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityDisplay;->removeStackReferenceIfNeeded(Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityDisplay;->resolveWindowingMode(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;I)I
+PLcom/android/server/am/ActivityDisplay;->setIsSleeping(Z)V
+PLcom/android/server/am/ActivityDisplay;->shouldSleep()Z
+PLcom/android/server/am/ActivityDisplay;->updateBounds()V
+PLcom/android/server/am/ActivityLaunchParamsModifier;->onCalculate(Lcom/android/server/am/TaskRecord;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/LaunchParamsController$LaunchParams;Lcom/android/server/am/LaunchParamsController$LaunchParams;)I
+PLcom/android/server/am/ActivityManagerConstants;->getOverrideMaxCachedProcesses()I
+PLcom/android/server/am/ActivityManagerConstants;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/am/ActivityManagerConstants;->updateConstants()V
+PLcom/android/server/am/ActivityManagerService$10;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$11;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$11;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+PLcom/android/server/am/ActivityManagerService$12;-><init>(Lcom/android/server/am/ActivityManagerService;ILandroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService$19;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$19;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+PLcom/android/server/am/ActivityManagerService$1;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;Z)V
+PLcom/android/server/am/ActivityManagerService$20;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$21;-><init>(Lcom/android/server/am/ActivityManagerService;IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$ParcelableCrashInfo;)V
+PLcom/android/server/am/ActivityManagerService$21;->run()V
+PLcom/android/server/am/ActivityManagerService$22;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;Ljava/lang/String;Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;Landroid/os/DropBoxManager;)V
+PLcom/android/server/am/ActivityManagerService$22;->run()V
+PLcom/android/server/am/ActivityManagerService$28;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$28;->run()V
+PLcom/android/server/am/ActivityManagerService$2;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/am/ActivityManagerService$2;->newArray(I)[Lcom/android/server/am/BroadcastFilter;
+PLcom/android/server/am/ActivityManagerService$3;->lambda$handleMessage$0(Lcom/android/internal/os/ProcessCpuTracker$Stats;)Z
+PLcom/android/server/am/ActivityManagerService$4;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$9;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$AppDeathRecipient;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;)V
+PLcom/android/server/am/ActivityManagerService$AppDeathRecipient;->binderDied()V
+PLcom/android/server/am/ActivityManagerService$CpuBinder$1;-><init>(Lcom/android/server/am/ActivityManagerService$CpuBinder;)V
+PLcom/android/server/am/ActivityManagerService$CpuBinder;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$DbBinder;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$DevelopmentSettingsObserver;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$DevelopmentSettingsObserver;->onChange()V
+PLcom/android/server/am/ActivityManagerService$FontScaleSettingObserver;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$GrantUri;-><init>(ILandroid/net/Uri;Z)V
+PLcom/android/server/am/ActivityManagerService$GrantUri;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/am/ActivityManagerService$GrantUri;->hashCode()I
+PLcom/android/server/am/ActivityManagerService$GrantUri;->resolve(ILandroid/net/Uri;)Lcom/android/server/am/ActivityManagerService$GrantUri;
+PLcom/android/server/am/ActivityManagerService$GraphicsBinder;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$HiddenApiSettings;->getPolicyForPApps()I
+PLcom/android/server/am/ActivityManagerService$HiddenApiSettings;->getPolicyForPrePApps()I
+PLcom/android/server/am/ActivityManagerService$HiddenApiSettings;->getValidEnforcementPolicy(Ljava/lang/String;)I
+PLcom/android/server/am/ActivityManagerService$HiddenApiSettings;->isDisabled()Z
+PLcom/android/server/am/ActivityManagerService$HiddenApiSettings;->registerObserver()V
+PLcom/android/server/am/ActivityManagerService$HiddenApiSettings;->update()V
+PLcom/android/server/am/ActivityManagerService$ImportanceToken;-><init>(Lcom/android/server/am/ActivityManagerService;ILandroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->acquireSleepToken(Ljava/lang/String;I)Landroid/app/ActivityManagerInternal$SleepToken;
+PLcom/android/server/am/ActivityManagerService$LocalService;->enforceCallerIsRecentsOrHasPermission(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->getMemoryStateForProcesses()Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService$LocalService;->getTopVisibleActivities()Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService$LocalService;->getUidProcessState(I)I
+PLcom/android/server/am/ActivityManagerService$LocalService;->isCallerRecents(I)Z
+PLcom/android/server/am/ActivityManagerService$LocalService;->isRuntimeRestarted()Z
+PLcom/android/server/am/ActivityManagerService$LocalService;->isSystemReady()Z
+PLcom/android/server/am/ActivityManagerService$LocalService;->isUidActive(I)Z
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyActiveVoiceInteractionServiceChanged(Landroid/content/ComponentName;)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyAppTransitionFinished()V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyAppTransitionStarting(Landroid/util/SparseIntArray;J)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyDockedStackMinimizedChanged(Z)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->notifyKeyguardTrustedChanged()V
+PLcom/android/server/am/ActivityManagerService$LocalService;->onWakefulnessChanged(I)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->registerScreenObserver(Landroid/app/ActivityManagerInternal$ScreenObserver;)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->setAllowAppSwitches(Ljava/lang/String;II)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->setDeviceIdleWhitelist([I[I)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->setHasOverlayUi(IZ)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->setRunningRemoteAnimation(IZ)V
+PLcom/android/server/am/ActivityManagerService$LocalService;->startIsolatedProcess(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Runnable;)Z
+PLcom/android/server/am/ActivityManagerService$LocalService;->updateDeviceIdleTempWhitelist([IIZ)V
+PLcom/android/server/am/ActivityManagerService$MemBinder$1;-><init>(Lcom/android/server/am/ActivityManagerService$MemBinder;)V
+PLcom/android/server/am/ActivityManagerService$MemBinder;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$PendingAssistExtras;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityRecord;Landroid/os/Bundle;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IAssistDataReceiver;Landroid/os/Bundle;I)V
+PLcom/android/server/am/ActivityManagerService$PendingTempWhitelist;-><init>(IJLjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService$PermissionController;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$PermissionController;->checkPermission(Ljava/lang/String;II)Z
+PLcom/android/server/am/ActivityManagerService$PermissionController;->getPackagesForUid(I)[Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService$PermissionController;->isRuntimePermission(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService$PermissionController;->noteOp(Ljava/lang/String;ILjava/lang/String;)I
+PLcom/android/server/am/ActivityManagerService$ProcessChangeItem;-><init>()V
+PLcom/android/server/am/ActivityManagerService$ProcessInfoService;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService$UidObserverRegistration;-><init>(ILjava/lang/String;II)V
+PLcom/android/server/am/ActivityManagerService;->access$000(Lcom/android/server/am/ActivityManagerService;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;Z)V
+PLcom/android/server/am/ActivityManagerService;->access$1200(Lcom/android/server/am/ActivityManagerService;)Lcom/android/server/am/VrController;
+PLcom/android/server/am/ActivityManagerService;->access$1800(Lcom/android/server/am/ActivityManagerService;)Lcom/android/server/am/KeyguardController;
+PLcom/android/server/am/ActivityManagerService;->access$600(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/ActivityManagerService;->access$700(Lcom/android/server/am/ActivityManagerService;II)V
+PLcom/android/server/am/ActivityManagerService;->acquireSleepToken(Ljava/lang/String;I)Landroid/app/ActivityManagerInternal$SleepToken;
+PLcom/android/server/am/ActivityManagerService;->activityDestroyed(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activityIdle(Landroid/os/IBinder;Landroid/content/res/Configuration;Z)V
+PLcom/android/server/am/ActivityManagerService;->activityPaused(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activityRelaunched(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activityResumed(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activitySlept(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->activityStopped(Landroid/os/IBinder;Landroid/os/Bundle;Landroid/os/PersistableBundle;Ljava/lang/CharSequence;)V
+PLcom/android/server/am/ActivityManagerService;->addAppLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZLjava/lang/String;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->addAppLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZZLjava/lang/String;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->addBackgroundCheckViolationLocked(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->addErrorToDropBox(Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;)V
+PLcom/android/server/am/ActivityManagerService;->addPackageDependency(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->addProcessNameLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->addServiceToMap(Landroid/util/ArrayMap;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->appServicesRestrictedInBackgroundLocked(ILjava/lang/String;I)I
+PLcom/android/server/am/ActivityManagerService;->appendDropBoxProcessHeaders(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/StringBuilder;)V
+PLcom/android/server/am/ActivityManagerService;->applyUpdateLockStateLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityManagerService;->applyUpdateVrModeLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityManagerService;->backupAgentCreated(Ljava/lang/String;Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->batteryNeedsCpuUpdate()V
+PLcom/android/server/am/ActivityManagerService;->batteryPowerChanged(Z)V
+PLcom/android/server/am/ActivityManagerService;->batterySendBroadcast(Landroid/content/Intent;)V
+PLcom/android/server/am/ActivityManagerService;->batteryStatsReset()V
+PLcom/android/server/am/ActivityManagerService;->bindBackupAgent(Ljava/lang/String;II)Z
+PLcom/android/server/am/ActivityManagerService;->bootAnimationComplete()V
+PLcom/android/server/am/ActivityManagerService;->buildAssistBundleLocked(Lcom/android/server/am/ActivityManagerService$PendingAssistExtras;Landroid/os/Bundle;)V
+PLcom/android/server/am/ActivityManagerService;->cancelIntentSender(Landroid/content/IIntentSender;)V
+PLcom/android/server/am/ActivityManagerService;->cancelIntentSenderLocked(Lcom/android/server/am/PendingIntentRecord;Z)V
+PLcom/android/server/am/ActivityManagerService;->checkAppInLaunchingProvidersLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityManagerService;->checkAppSwitchAllowedLocked(IIIILjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->checkAuthorityGrants(ILandroid/content/pm/ProviderInfo;IZ)Z
+PLcom/android/server/am/ActivityManagerService;->checkExcessivePowerUsageLocked()V
+PLcom/android/server/am/ActivityManagerService;->checkGrantUriPermission(ILjava/lang/String;Landroid/net/Uri;II)I
+PLcom/android/server/am/ActivityManagerService;->checkGrantUriPermissionLocked(ILjava/lang/String;Lcom/android/server/am/ActivityManagerService$GrantUri;II)I
+PLcom/android/server/am/ActivityManagerService;->checkHoldingPermissionsInternalLocked(Landroid/content/pm/IPackageManager;Landroid/content/pm/ProviderInfo;Lcom/android/server/am/ActivityManagerService$GrantUri;IIZ)Z
+PLcom/android/server/am/ActivityManagerService;->checkHoldingPermissionsLocked(Landroid/content/pm/IPackageManager;Landroid/content/pm/ProviderInfo;Lcom/android/server/am/ActivityManagerService$GrantUri;II)Z
+PLcom/android/server/am/ActivityManagerService;->checkUriPermission(Landroid/net/Uri;IIIILandroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->checkUriPermissionLocked(Lcom/android/server/am/ActivityManagerService$GrantUri;II)Z
+PLcom/android/server/am/ActivityManagerService;->cleanUpApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;ZZIZ)Z
+PLcom/android/server/am/ActivityManagerService;->cleanupAppInLaunchingProvidersLocked(Lcom/android/server/am/ProcessRecord;Z)Z
+PLcom/android/server/am/ActivityManagerService;->cleanupDisabledPackageComponentsLocked(Ljava/lang/String;IZ[Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->closeSystemDialogs(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->closeSystemDialogsLocked(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->constructResumedTraceName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->convertFromTranslucent(Landroid/os/IBinder;)Z
+PLcom/android/server/am/ActivityManagerService;->dispatchProcessDied(II)V
+PLcom/android/server/am/ActivityManagerService;->dispatchProcessesChanged()V
+PLcom/android/server/am/ActivityManagerService;->doDump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;Z)V
+PLcom/android/server/am/ActivityManagerService;->doLowMemReportIfNeededLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->doStopUidLocked(ILcom/android/server/am/UidRecord;)V
+PLcom/android/server/am/ActivityManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->dumpBroadcastStatsCheckinLocked(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;IZLjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->enableScreenAfterBoot()V
+PLcom/android/server/am/ActivityManagerService;->enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->enqueueAssistContext(ILandroid/content/Intent;Ljava/lang/String;Landroid/app/IAssistDataReceiver;Landroid/os/Bundle;Landroid/os/IBinder;ZZILandroid/os/Bundle;JI)Lcom/android/server/am/ActivityManagerService$PendingAssistExtras;
+PLcom/android/server/am/ActivityManagerService;->ensureConfigAndVisibilityAfterUpdate(Lcom/android/server/am/ActivityRecord;I)Z
+PLcom/android/server/am/ActivityManagerService;->findOrCreateUriPermissionLocked(Ljava/lang/String;Ljava/lang/String;ILcom/android/server/am/ActivityManagerService$GrantUri;)Lcom/android/server/am/UriPermission;
+PLcom/android/server/am/ActivityManagerService;->finishActivity(Landroid/os/IBinder;ILandroid/content/Intent;I)Z
+PLcom/android/server/am/ActivityManagerService;->finishActivityAffinity(Landroid/os/IBinder;)Z
+PLcom/android/server/am/ActivityManagerService;->finishBooting()V
+PLcom/android/server/am/ActivityManagerService;->finishRunningVoiceLocked()V
+PLcom/android/server/am/ActivityManagerService;->finishVoiceTask(Landroid/service/voice/IVoiceInteractionSession;)V
+PLcom/android/server/am/ActivityManagerService;->forceStopPackageLocked(Ljava/lang/String;IZZZZZILjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->generateApplicationProvidersLocked(Lcom/android/server/am/ProcessRecord;)Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getActivityDisplayId(Landroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->getActivityInfoForUser(Landroid/content/pm/ActivityInfo;I)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/am/ActivityManagerService;->getActivityStartController()Lcom/android/server/am/ActivityStartController;
+PLcom/android/server/am/ActivityManagerService;->getAppId(Ljava/lang/String;)I
+PLcom/android/server/am/ActivityManagerService;->getAppInfoForUser(Landroid/content/pm/ApplicationInfo;I)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/am/ActivityManagerService;->getAppOpsService()Lcom/android/internal/app/IAppOpsService;
+PLcom/android/server/am/ActivityManagerService;->getAppTasks(Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getAppWarningsLocked()Lcom/android/server/am/AppWarnings;
+PLcom/android/server/am/ActivityManagerService;->getBlockStateForUid(Lcom/android/server/am/UidRecord;)I
+PLcom/android/server/am/ActivityManagerService;->getCallingActivity(Landroid/os/IBinder;)Landroid/content/ComponentName;
+PLcom/android/server/am/ActivityManagerService;->getCallingPackage(Landroid/os/IBinder;)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->getCallingRecordLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityManagerService;->getCheckedForSetup()Z
+PLcom/android/server/am/ActivityManagerService;->getCommonServicesLocked(Z)Landroid/util/ArrayMap;
+PLcom/android/server/am/ActivityManagerService;->getConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/am/ActivityManagerService;->getContentProviderExternal(Ljava/lang/String;ILandroid/os/IBinder;)Landroid/app/ContentProviderHolder;
+PLcom/android/server/am/ActivityManagerService;->getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;
+PLcom/android/server/am/ActivityManagerService;->getFocusedStack()Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityManagerService;->getHomeIntent()Landroid/content/Intent;
+PLcom/android/server/am/ActivityManagerService;->getInputDispatchingTimeoutLocked(Lcom/android/server/am/ActivityRecord;)J
+PLcom/android/server/am/ActivityManagerService;->getInputDispatchingTimeoutLocked(Lcom/android/server/am/ProcessRecord;)J
+PLcom/android/server/am/ActivityManagerService;->getIntentForIntentSender(Landroid/content/IIntentSender;)Landroid/content/Intent;
+PLcom/android/server/am/ActivityManagerService;->getLastResumedActivityUserId()I
+PLcom/android/server/am/ActivityManagerService;->getLaunchedFromPackage(Landroid/os/IBinder;)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->getLaunchedFromUid(Landroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->getLifecycleManager()Lcom/android/server/am/ClientLifecycleManager;
+PLcom/android/server/am/ActivityManagerService;->getLockTaskController()Lcom/android/server/am/LockTaskController;
+PLcom/android/server/am/ActivityManagerService;->getLockTaskModeState()I
+PLcom/android/server/am/ActivityManagerService;->getPackageManager()Landroid/content/pm/IPackageManager;
+PLcom/android/server/am/ActivityManagerService;->getPersistedUriPermissions(Ljava/lang/String;Z)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/am/ActivityManagerService;->getProcessLimit()I
+PLcom/android/server/am/ActivityManagerService;->getProviderInfoLocked(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+PLcom/android/server/am/ActivityManagerService;->getRequestedOrientation(Landroid/os/IBinder;)I
+PLcom/android/server/am/ActivityManagerService;->getRunningUserIds()[I
+PLcom/android/server/am/ActivityManagerService;->getServices(II)Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getTaskDescriptionIcon(Ljava/lang/String;I)Landroid/graphics/Bitmap;
+PLcom/android/server/am/ActivityManagerService;->getTaskForActivity(Landroid/os/IBinder;Z)I
+PLcom/android/server/am/ActivityManagerService;->getTaskSnapshot(IZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/am/ActivityManagerService;->getTasks(I)Ljava/util/List;
+PLcom/android/server/am/ActivityManagerService;->getUidFromIntent(Landroid/content/Intent;)I
+PLcom/android/server/am/ActivityManagerService;->getUidState(I)I
+PLcom/android/server/am/ActivityManagerService;->getUidStateLocked(I)I
+PLcom/android/server/am/ActivityManagerService;->grantUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
+PLcom/android/server/am/ActivityManagerService;->grantUriPermissionFromIntentLocked(ILjava/lang/String;Landroid/content/Intent;Lcom/android/server/am/UriPermissionOwner;I)V
+PLcom/android/server/am/ActivityManagerService;->grantUriPermissionLocked(ILjava/lang/String;Lcom/android/server/am/ActivityManagerService$GrantUri;ILcom/android/server/am/UriPermissionOwner;I)V
+PLcom/android/server/am/ActivityManagerService;->grantUriPermissionUncheckedLocked(ILjava/lang/String;Lcom/android/server/am/ActivityManagerService$GrantUri;ILcom/android/server/am/UriPermissionOwner;)V
+PLcom/android/server/am/ActivityManagerService;->handleAppDiedLocked(Lcom/android/server/am/ProcessRecord;ZZ)V
+PLcom/android/server/am/ActivityManagerService;->handleApplicationStrictModeViolation(Landroid/os/IBinder;ILandroid/os/StrictMode$ViolationInfo;)V
+PLcom/android/server/am/ActivityManagerService;->handleApplicationWtf(Landroid/os/IBinder;Ljava/lang/String;ZLandroid/app/ApplicationErrorReport$ParcelableCrashInfo;)Z
+PLcom/android/server/am/ActivityManagerService;->handleApplicationWtfInner(IILandroid/os/IBinder;Ljava/lang/String;Landroid/app/ApplicationErrorReport$CrashInfo;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->handleProcessStartedLocked(Lcom/android/server/am/ProcessRecord;Landroid/os/Process$ProcessStartResult;J)Z
+PLcom/android/server/am/ActivityManagerService;->hasUsageStatsPermission(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->installEncryptionUnawareProviders(I)V
+PLcom/android/server/am/ActivityManagerService;->installSystemProviders()V
+PLcom/android/server/am/ActivityManagerService;->isAllowedWhileBooting(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/am/ActivityManagerService;->isAppForeground(I)Z
+PLcom/android/server/am/ActivityManagerService;->isAssistDataAllowedOnCurrentActivity()Z
+PLcom/android/server/am/ActivityManagerService;->isGetTasksAllowed(Ljava/lang/String;II)Z
+PLcom/android/server/am/ActivityManagerService;->isInLockTaskMode()Z
+PLcom/android/server/am/ActivityManagerService;->isInMultiWindowMode(Landroid/os/IBinder;)Z
+PLcom/android/server/am/ActivityManagerService;->isIntentSenderAForegroundService(Landroid/content/IIntentSender;)Z
+PLcom/android/server/am/ActivityManagerService;->isIntentSenderAnActivity(Landroid/content/IIntentSender;)Z
+PLcom/android/server/am/ActivityManagerService;->isKeyguardLocked()Z
+PLcom/android/server/am/ActivityManagerService;->isNextTransitionForward()Z
+PLcom/android/server/am/ActivityManagerService;->isOnDeviceIdleWhitelistLocked(IZ)Z
+PLcom/android/server/am/ActivityManagerService;->isPendingBroadcastProcessLocked(I)Z
+PLcom/android/server/am/ActivityManagerService;->isProcStartValidLocked(Lcom/android/server/am/ProcessRecord;J)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->isShuttingDownLocked()Z
+PLcom/android/server/am/ActivityManagerService;->isSleepingOrShuttingDownLocked()Z
+PLcom/android/server/am/ActivityManagerService;->isSplitConfigurationChange(I)Z
+PLcom/android/server/am/ActivityManagerService;->isTopOfTask(Landroid/os/IBinder;)Z
+PLcom/android/server/am/ActivityManagerService;->isUserAMonkey()Z
+PLcom/android/server/am/ActivityManagerService;->isUserRunning(II)Z
+PLcom/android/server/am/ActivityManagerService;->isValidSingletonCall(II)Z
+PLcom/android/server/am/ActivityManagerService;->keyguardGoingAway(I)V
+PLcom/android/server/am/ActivityManagerService;->killAllBackgroundProcessesExcept(II)V
+PLcom/android/server/am/ActivityManagerService;->killApplication(Ljava/lang/String;IILjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->killApplicationProcess(Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityManagerService;->killProcessGroup(II)V
+PLcom/android/server/am/ActivityManagerService;->lambda$gATL8uvTPRd405IfefK1RL9bNqA(Landroid/hardware/display/DisplayManagerInternal;)V
+PLcom/android/server/am/ActivityManagerService;->lambda$logStrictModeViolationToDropBox$3(Landroid/os/DropBoxManager;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->lambda$startProcessLocked$0(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;JLjava/lang/String;Ljava/lang/String;[IIILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->logAppTooSlow(Lcom/android/server/am/ProcessRecord;JLjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->logStrictModeViolationToDropBox(Lcom/android/server/am/ProcessRecord;Landroid/os/StrictMode$ViolationInfo;)V
+PLcom/android/server/am/ActivityManagerService;->makeIntentSenderCanceledLocked(Lcom/android/server/am/PendingIntentRecord;)V
+PLcom/android/server/am/ActivityManagerService;->matchesProvider(Landroid/net/Uri;Landroid/content/pm/ProviderInfo;)Z
+PLcom/android/server/am/ActivityManagerService;->monitor()V
+PLcom/android/server/am/ActivityManagerService;->moveActivityTaskToBack(Landroid/os/IBinder;Z)Z
+PLcom/android/server/am/ActivityManagerService;->moveTaskToFrontLocked(IILcom/android/server/am/SafeActivityOptions;Z)V
+PLcom/android/server/am/ActivityManagerService;->navigateUpTo(Landroid/os/IBinder;Landroid/content/Intent;ILandroid/content/Intent;)Z
+PLcom/android/server/am/ActivityManagerService;->newProcessRecordLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZI)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->newUriPermissionOwner(Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/am/ActivityManagerService;->noteAlarmFinish(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->noteAlarmStart(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->noteWakeupAlarm(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->notifyActivityDrawn(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->notifyEnterAnimationComplete(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->notifyTaskPersisterLocked(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/ActivityManagerService;->onCoreSettingsChange(Landroid/os/Bundle;)V
+PLcom/android/server/am/ActivityManagerService;->onWakefulnessChanged(I)V
+PLcom/android/server/am/ActivityManagerService;->overridePendingTransition(Landroid/os/IBinder;Ljava/lang/String;II)V
+PLcom/android/server/am/ActivityManagerService;->performDisplayOverrideConfigUpdate(Landroid/content/res/Configuration;ZI)I
+PLcom/android/server/am/ActivityManagerService;->postFinishBooting(ZZ)V
+PLcom/android/server/am/ActivityManagerService;->processClass(Lcom/android/server/am/ProcessRecord;)Ljava/lang/String;
+PLcom/android/server/am/ActivityManagerService;->pushTempWhitelist()V
+PLcom/android/server/am/ActivityManagerService;->readGrantedUriPermissionsLocked()V
+PLcom/android/server/am/ActivityManagerService;->recordPssSampleLocked(Lcom/android/server/am/ProcessRecord;IJJJJIJJ)V
+PLcom/android/server/am/ActivityManagerService;->registerIntentSenderCancelListener(Landroid/content/IIntentSender;Lcom/android/internal/os/IResultReceiver;)V
+PLcom/android/server/am/ActivityManagerService;->registerProcessObserver(Landroid/app/IProcessObserver;)V
+PLcom/android/server/am/ActivityManagerService;->registerRemoteAnimationForNextActivityStart(Ljava/lang/String;Landroid/view/RemoteAnimationAdapter;)V
+PLcom/android/server/am/ActivityManagerService;->registerRemoteAnimations(Landroid/os/IBinder;Landroid/view/RemoteAnimationDefinition;)V
+PLcom/android/server/am/ActivityManagerService;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V
+PLcom/android/server/am/ActivityManagerService;->registerUidObserver(Landroid/app/IUidObserver;IILjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->registerUserSwitchObserver(Landroid/app/IUserSwitchObserver;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->removeContentProviderExternal(Ljava/lang/String;Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityManagerService;->removeContentProviderExternalUnchecked(Ljava/lang/String;Landroid/os/IBinder;I)V
+PLcom/android/server/am/ActivityManagerService;->removeLruProcessLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->removeProcessLocked(Lcom/android/server/am/ProcessRecord;ZZLjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->removeProcessNameLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->removeProcessNameLocked(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->removeUriPermissionsForPackageLocked(Ljava/lang/String;IZZ)V
+PLcom/android/server/am/ActivityManagerService;->reportAssistContextExtras(Landroid/os/IBinder;Landroid/os/Bundle;Landroid/app/assist/AssistStructure;Landroid/app/assist/AssistContent;Landroid/net/Uri;)V
+PLcom/android/server/am/ActivityManagerService;->reportCurKeyguardUsageEventLocked()V
+PLcom/android/server/am/ActivityManagerService;->reportCurWakefulnessUsageEventLocked()V
+PLcom/android/server/am/ActivityManagerService;->reportGlobalUsageEventLocked(I)V
+PLcom/android/server/am/ActivityManagerService;->reportOomAdjMessageLocked(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->reportSizeConfigurations(Landroid/os/IBinder;[I[I[I)V
+PLcom/android/server/am/ActivityManagerService;->reportUidInfoMessageLocked(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityManagerService;->requestAssistContextExtras(ILandroid/app/IAssistDataReceiver;Landroid/os/Bundle;Landroid/os/IBinder;ZZ)Z
+PLcom/android/server/am/ActivityManagerService;->requestAutofillData(Landroid/app/IAssistDataReceiver;Landroid/os/Bundle;Landroid/os/IBinder;I)Z
+PLcom/android/server/am/ActivityManagerService;->requestPssLocked(Lcom/android/server/am/ProcessRecord;I)Z
+PLcom/android/server/am/ActivityManagerService;->resolveActivityInfo(Landroid/content/Intent;II)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/am/ActivityManagerService;->resumeAppSwitches()V
+PLcom/android/server/am/ActivityManagerService;->retrieveSettings()V
+PLcom/android/server/am/ActivityManagerService;->revokeUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V
+PLcom/android/server/am/ActivityManagerService;->revokeUriPermissionFromOwner(Landroid/os/IBinder;Landroid/net/Uri;II)V
+PLcom/android/server/am/ActivityManagerService;->revokeUriPermissionLocked(Ljava/lang/String;ILcom/android/server/am/ActivityManagerService$GrantUri;I)V
+PLcom/android/server/am/ActivityManagerService;->scheduleApplicationInfoChanged(Ljava/util/List;I)V
+PLcom/android/server/am/ActivityManagerService;->sendIntentSender(Landroid/content/IIntentSender;Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I
+PLcom/android/server/am/ActivityManagerService;->sendPackageBroadcastLocked(I[Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityManagerService;->sendPendingBroadcastsLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityManagerService;->setCheckedForSetup(Z)V
+PLcom/android/server/am/ActivityManagerService;->setDebugApp(Ljava/lang/String;ZZ)V
+PLcom/android/server/am/ActivityManagerService;->setHasTopUi(Z)V
+PLcom/android/server/am/ActivityManagerService;->setLockScreenShown(ZZI)V
+PLcom/android/server/am/ActivityManagerService;->setProcessImportant(Landroid/os/IBinder;IZLjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->setRenderThread(I)V
+PLcom/android/server/am/ActivityManagerService;->setRequestedOrientation(Landroid/os/IBinder;I)V
+PLcom/android/server/am/ActivityManagerService;->setResumedActivityUncheckLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->setRunningRemoteAnimation(IZ)V
+PLcom/android/server/am/ActivityManagerService;->setServiceForeground(Landroid/content/ComponentName;Landroid/os/IBinder;ILandroid/app/Notification;I)V
+PLcom/android/server/am/ActivityManagerService;->setSystemProcess()V
+PLcom/android/server/am/ActivityManagerService;->setTaskDescription(Landroid/os/IBinder;Landroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/am/ActivityManagerService;->setUidTempWhitelistStateLocked(IZ)V
+PLcom/android/server/am/ActivityManagerService;->setUsageStatsManager(Landroid/app/usage/UsageStatsManagerInternal;)V
+PLcom/android/server/am/ActivityManagerService;->setWindowManager(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/ActivityManagerService;->shouldDisableNonVrUiLocked()Z
+PLcom/android/server/am/ActivityManagerService;->shouldUpRecreateTask(Landroid/os/IBinder;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->showAskCompatModeDialogLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityManagerService;->skipCurrentReceiverLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityManagerService;->startActivities(Landroid/app/IApplicationThread;Ljava/lang/String;[Landroid/content/Intent;[Ljava/lang/String;Landroid/os/IBinder;Landroid/os/Bundle;I)I
+PLcom/android/server/am/ActivityManagerService;->startActivity(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;)I
+PLcom/android/server/am/ActivityManagerService;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;I)I
+PLcom/android/server/am/ActivityManagerService;->startActivityAsUser(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILandroid/app/ProfilerInfo;Landroid/os/Bundle;IZ)I
+PLcom/android/server/am/ActivityManagerService;->startActivityFromRecents(ILandroid/os/Bundle;)I
+PLcom/android/server/am/ActivityManagerService;->startActivityIntentSender(Landroid/app/IApplicationThread;Landroid/content/IIntentSender;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)I
+PLcom/android/server/am/ActivityManagerService;->startAssistantActivity(Ljava/lang/String;IILandroid/content/Intent;Ljava/lang/String;Landroid/os/Bundle;I)I
+PLcom/android/server/am/ActivityManagerService;->startHomeActivityLocked(ILjava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->startIsolatedProcess(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Runnable;)Z
+PLcom/android/server/am/ActivityManagerService;->startObservingNativeCrashes()V
+PLcom/android/server/am/ActivityManagerService;->startPersistentApps(I)V
+PLcom/android/server/am/ActivityManagerService;->startProcess(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Landroid/os/Process$ProcessStartResult;
+PLcom/android/server/am/ActivityManagerService;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityManagerService;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILjava/lang/String;Landroid/content/ComponentName;ZZZ)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityManagerService;->startProcessLocked(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Z
+PLcom/android/server/am/ActivityManagerService;->startTimeTrackingFocusedActivityLocked()V
+PLcom/android/server/am/ActivityManagerService;->stopAppSwitches()V
+PLcom/android/server/am/ActivityManagerService;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I
+PLcom/android/server/am/ActivityManagerService;->systemReady(Ljava/lang/Runnable;Landroid/util/TimingsTraceLog;)V
+PLcom/android/server/am/ActivityManagerService;->tempWhitelistForPendingIntentLocked(IIIJLjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->tempWhitelistUidLocked(IJLjava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->trimApplications()V
+PLcom/android/server/am/ActivityManagerService;->uidOnBackgroundWhitelist(I)Z
+PLcom/android/server/am/ActivityManagerService;->unbindBackupAgent(Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/am/ActivityManagerService;->unbindFinished(Landroid/os/IBinder;Landroid/content/Intent;Z)V
+PLcom/android/server/am/ActivityManagerService;->unlockUser(I[B[BLandroid/os/IProgressListener;)Z
+PLcom/android/server/am/ActivityManagerService;->unregisterIntentSenderCancelListener(Landroid/content/IIntentSender;Lcom/android/internal/os/IResultReceiver;)V
+PLcom/android/server/am/ActivityManagerService;->unregisterTaskStackListener(Landroid/app/ITaskStackListener;)V
+PLcom/android/server/am/ActivityManagerService;->updateApplicationInfoLocked(Ljava/util/List;I)V
+PLcom/android/server/am/ActivityManagerService;->updateConfiguration(Landroid/content/res/Configuration;)Z
+PLcom/android/server/am/ActivityManagerService;->updateConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityManagerService;->updateConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZZ)Z
+PLcom/android/server/am/ActivityManagerService;->updateConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZZIZ)Z
+PLcom/android/server/am/ActivityManagerService;->updateConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZZIZLcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;)Z
+PLcom/android/server/am/ActivityManagerService;->updateDisplayOverrideConfiguration(Landroid/content/res/Configuration;I)Z
+PLcom/android/server/am/ActivityManagerService;->updateDisplayOverrideConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZI)Z
+PLcom/android/server/am/ActivityManagerService;->updateDisplayOverrideConfigurationLocked(Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;ZILcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;)Z
+PLcom/android/server/am/ActivityManagerService;->updateEventDispatchingLocked()V
+PLcom/android/server/am/ActivityManagerService;->updateForceBackgroundCheck(Z)V
+PLcom/android/server/am/ActivityManagerService;->updateGlobalConfigurationLocked(Landroid/content/res/Configuration;ZZIZ)I
+PLcom/android/server/am/ActivityManagerService;->updateLockTaskFeatures(II)V
+PLcom/android/server/am/ActivityManagerService;->updateLockTaskPackages(I[Ljava/lang/String;)V
+PLcom/android/server/am/ActivityManagerService;->updateResumedAppTrace(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityManagerService;->updateShouldShowDialogsLocked(Landroid/content/res/Configuration;)V
+PLcom/android/server/am/ActivityManagerService;->updateSleepIfNeededLocked()V
+PLcom/android/server/am/ActivityManagerService;->updateUsageStats(Lcom/android/server/am/ActivityRecord;Z)V
+PLcom/android/server/am/ActivityManagerService;->waitForNetworkStateUpdate(J)V
+PLcom/android/server/am/ActivityMetricsLogger$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;-><init>(Lcom/android/server/am/ActivityMetricsLogger;)V
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;-><init>(Lcom/android/server/am/ActivityMetricsLogger;Lcom/android/server/am/ActivityMetricsLogger$1;)V
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$100(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$1000(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$1002(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$102(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$1100(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)Z
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$1102(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;Z)Z
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$1200(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)Z
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$1202(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;Z)Z
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$200(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$202(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$300(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$302(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$400(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$402(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$500(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$502(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;I)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$900(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)Z
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;->access$902(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;Z)Z
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;-><init>(Lcom/android/server/am/ActivityMetricsLogger;Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)V
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;-><init>(Lcom/android/server/am/ActivityMetricsLogger;Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;Lcom/android/server/am/ActivityMetricsLogger$1;)V
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$1400(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)Ljava/lang/String;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$1500(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$1600(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)Ljava/lang/String;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$1700(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$1800(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)Ljava/lang/String;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$1900(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)Ljava/lang/String;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$2000(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$2100(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$2200(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$2300(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)I
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$2400(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)Ljava/lang/String;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$2500(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;->access$2600(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)Ljava/lang/String;
+PLcom/android/server/am/ActivityMetricsLogger;->access$000(Lcom/android/server/am/ActivityMetricsLogger;Lcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityMetricsLogger;->access$600(Lcom/android/server/am/ActivityMetricsLogger;Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger;->access$700(Lcom/android/server/am/ActivityMetricsLogger;Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityMetricsLogger;->allWindowsDrawn()Z
+PLcom/android/server/am/ActivityMetricsLogger;->calculateCurrentDelay()I
+PLcom/android/server/am/ActivityMetricsLogger;->calculateDelay(J)I
+PLcom/android/server/am/ActivityMetricsLogger;->checkVisibility(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityMetricsLogger;->convertAppStartTransitionType(I)I
+PLcom/android/server/am/ActivityMetricsLogger;->findProcessForActivity(Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ProcessRecord;
+PLcom/android/server/am/ActivityMetricsLogger;->getArtManagerInternal()Landroid/content/pm/dex/ArtManagerInternal;
+PLcom/android/server/am/ActivityMetricsLogger;->getTransitionType(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)I
+PLcom/android/server/am/ActivityMetricsLogger;->hasStartedActivity(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityMetricsLogger;->isAnyTransitionActive()Z
+PLcom/android/server/am/ActivityMetricsLogger;->isLoggableResultCode(I)Z
+PLcom/android/server/am/ActivityMetricsLogger;->lambda$logAppTransitionMultiEvents$0(Lcom/android/server/am/ActivityMetricsLogger;IILcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)V
+PLcom/android/server/am/ActivityMetricsLogger;->logAppStartMemoryStateCapture(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)V
+PLcom/android/server/am/ActivityMetricsLogger;->logAppTransition(IILcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfoSnapshot;)V
+PLcom/android/server/am/ActivityMetricsLogger;->logAppTransitionCancel(Lcom/android/server/am/ActivityMetricsLogger$WindowingModeTransitionInfo;)V
+PLcom/android/server/am/ActivityMetricsLogger;->logAppTransitionMultiEvents()V
+PLcom/android/server/am/ActivityMetricsLogger;->logWindowState()V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyActivityLaunched(ILcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyActivityLaunched(ILcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyActivityLaunching()V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyBindApplication(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyStartingWindowDrawn(IJ)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyTransitionStarting(Landroid/util/SparseIntArray;J)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyVisibilityChanged(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityMetricsLogger;->notifyWindowsDrawn(IJ)V
+PLcom/android/server/am/ActivityMetricsLogger;->reset(Z)V
+PLcom/android/server/am/ActivityRecord$Token;-><init>(Lcom/android/server/am/ActivityRecord;Landroid/content/Intent;)V
+PLcom/android/server/am/ActivityRecord$Token;->access$000(Lcom/android/server/am/ActivityRecord$Token;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityRecord$Token;->toString()Ljava/lang/String;
+PLcom/android/server/am/ActivityRecord$Token;->tokenToActivityRecordLocked(Lcom/android/server/am/ActivityRecord$Token;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;IILjava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Landroid/content/res/Configuration;Lcom/android/server/am/ActivityRecord;Ljava/lang/String;IZZLcom/android/server/am/ActivityStackSupervisor;Landroid/app/ActivityOptions;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityRecord;->activityResumedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityRecord;->activityStoppedLocked(Landroid/os/Bundle;Landroid/os/PersistableBundle;Ljava/lang/CharSequence;)V
+PLcom/android/server/am/ActivityRecord;->addNewIntentLocked(Lcom/android/internal/content/ReferrerIntent;)V
+PLcom/android/server/am/ActivityRecord;->addResultLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;IILandroid/content/Intent;)V
+PLcom/android/server/am/ActivityRecord;->allowTaskSnapshot()Z
+PLcom/android/server/am/ActivityRecord;->applyOptionsLocked()V
+PLcom/android/server/am/ActivityRecord;->canBeLaunchedOnDisplay(I)Z
+PLcom/android/server/am/ActivityRecord;->canLaunchAssistActivity(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityRecord;->canLaunchHomeActivity(ILcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityRecord;->canTurnScreenOn()Z
+PLcom/android/server/am/ActivityRecord;->changeWindowTranslucency(Z)Z
+PLcom/android/server/am/ActivityRecord;->checkEnterPictureInPictureAppOpsState()Z
+PLcom/android/server/am/ActivityRecord;->checkEnterPictureInPictureState(Ljava/lang/String;Z)Z
+PLcom/android/server/am/ActivityRecord;->clearOptionsLocked()V
+PLcom/android/server/am/ActivityRecord;->clearOptionsLocked(Z)V
+PLcom/android/server/am/ActivityRecord;->completeResumeLocked()V
+PLcom/android/server/am/ActivityRecord;->computeBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/am/ActivityRecord;->continueLaunchTickingLocked()Z
+PLcom/android/server/am/ActivityRecord;->createImageFilename(JI)Ljava/lang/String;
+PLcom/android/server/am/ActivityRecord;->createWindowContainer()V
+PLcom/android/server/am/ActivityRecord;->crossesHorizontalSizeThreshold(II)Z
+PLcom/android/server/am/ActivityRecord;->crossesSizeThreshold([III)Z
+PLcom/android/server/am/ActivityRecord;->deliverNewIntentLocked(ILandroid/content/Intent;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityRecord;->ensureActivityConfiguration(IZ)Z
+PLcom/android/server/am/ActivityRecord;->ensureActivityConfiguration(IZZ)Z
+PLcom/android/server/am/ActivityRecord;->finishLaunchTickingLocked()V
+PLcom/android/server/am/ActivityRecord;->forTokenLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityRecord;->getChildCount()I
+PLcom/android/server/am/ActivityRecord;->getConfigurationChanges(Landroid/content/res/Configuration;)I
+PLcom/android/server/am/ActivityRecord;->getDisplay()Lcom/android/server/am/ActivityDisplay;
+PLcom/android/server/am/ActivityRecord;->getDisplayId()I
+PLcom/android/server/am/ActivityRecord;->getParent()Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/am/ActivityRecord;->getRequestedOrientation()I
+PLcom/android/server/am/ActivityRecord;->getStackLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityRecord;->getState()Lcom/android/server/am/ActivityStack$ActivityState;
+PLcom/android/server/am/ActivityRecord;->getTaskForActivityLocked(Landroid/os/IBinder;Z)I
+PLcom/android/server/am/ActivityRecord;->getUriPermissionsLocked()Lcom/android/server/am/UriPermissionOwner;
+PLcom/android/server/am/ActivityRecord;->getWindowContainerController()Lcom/android/server/wm/AppWindowContainerController;
+PLcom/android/server/am/ActivityRecord;->handleAlreadyVisible()Z
+PLcom/android/server/am/ActivityRecord;->isAlwaysFocusable()Z
+PLcom/android/server/am/ActivityRecord;->isFocusable()Z
+PLcom/android/server/am/ActivityRecord;->isHomeIntent(Landroid/content/Intent;)Z
+PLcom/android/server/am/ActivityRecord;->isInStackLocked()Z
+PLcom/android/server/am/ActivityRecord;->isInStackLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityRecord;->isMainIntent(Landroid/content/Intent;)Z
+PLcom/android/server/am/ActivityRecord;->isNoHistory()Z
+PLcom/android/server/am/ActivityRecord;->isPersistable()Z
+PLcom/android/server/am/ActivityRecord;->isProcessRunning()Z
+PLcom/android/server/am/ActivityRecord;->isResizeOnlyChange(I)Z
+PLcom/android/server/am/ActivityRecord;->isResizeable()Z
+PLcom/android/server/am/ActivityRecord;->isResolverActivity()Z
+PLcom/android/server/am/ActivityRecord;->isSleeping()Z
+PLcom/android/server/am/ActivityRecord;->isState(Lcom/android/server/am/ActivityStack$ActivityState;Lcom/android/server/am/ActivityStack$ActivityState;Lcom/android/server/am/ActivityStack$ActivityState;)Z
+PLcom/android/server/am/ActivityRecord;->isState(Lcom/android/server/am/ActivityStack$ActivityState;Lcom/android/server/am/ActivityStack$ActivityState;Lcom/android/server/am/ActivityStack$ActivityState;Lcom/android/server/am/ActivityStack$ActivityState;)Z
+PLcom/android/server/am/ActivityRecord;->isTopRunningActivity()Z
+PLcom/android/server/am/ActivityRecord;->makeClientVisible()V
+PLcom/android/server/am/ActivityRecord;->makeFinishingLocked()V
+PLcom/android/server/am/ActivityRecord;->makeVisibleIfNeeded(Lcom/android/server/am/ActivityRecord;Z)V
+PLcom/android/server/am/ActivityRecord;->mayFreezeScreenLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityRecord;->notifyAppResumed(Z)V
+PLcom/android/server/am/ActivityRecord;->notifyUnknownVisibilityLaunched()V
+PLcom/android/server/am/ActivityRecord;->onStartingWindowDrawn(J)V
+PLcom/android/server/am/ActivityRecord;->onWindowsDrawn(J)V
+PLcom/android/server/am/ActivityRecord;->onWindowsGone()V
+PLcom/android/server/am/ActivityRecord;->onWindowsVisible()V
+PLcom/android/server/am/ActivityRecord;->onlyVrUiModeChanged(ILandroid/content/res/Configuration;)Z
+PLcom/android/server/am/ActivityRecord;->pauseKeyDispatchingLocked()V
+PLcom/android/server/am/ActivityRecord;->registerRemoteAnimations(Landroid/view/RemoteAnimationDefinition;)V
+PLcom/android/server/am/ActivityRecord;->relaunchActivityLocked(ZZ)V
+PLcom/android/server/am/ActivityRecord;->removeOrphanedStartingWindow(Z)V
+PLcom/android/server/am/ActivityRecord;->removeResultsLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityRecord;->removeUriPermissionsLocked()V
+PLcom/android/server/am/ActivityRecord;->removeWindowContainer()V
+PLcom/android/server/am/ActivityRecord;->reportLaunchTimeLocked(J)V
+PLcom/android/server/am/ActivityRecord;->resumeKeyDispatchingLocked()V
+PLcom/android/server/am/ActivityRecord;->scheduleConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/am/ActivityRecord;->setActivityType(ZILandroid/content/Intent;Landroid/app/ActivityOptions;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityRecord;->setDeferHidingClient(Z)V
+PLcom/android/server/am/ActivityRecord;->setLastReportedConfiguration(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)V
+PLcom/android/server/am/ActivityRecord;->setLastReportedConfiguration(Landroid/util/MergedConfiguration;)V
+PLcom/android/server/am/ActivityRecord;->setLastReportedGlobalConfiguration(Landroid/content/res/Configuration;)V
+PLcom/android/server/am/ActivityRecord;->setProcess(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/ActivityRecord;->setRequestedOrientation(I)V
+PLcom/android/server/am/ActivityRecord;->setSizeConfigurations([I[I[I)V
+PLcom/android/server/am/ActivityRecord;->setSleeping(Z)V
+PLcom/android/server/am/ActivityRecord;->setSleeping(ZZ)V
+PLcom/android/server/am/ActivityRecord;->setState(Lcom/android/server/am/ActivityStack$ActivityState;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityRecord;->setTask(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityRecord;->setTask(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/ActivityRecord;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/am/ActivityRecord;->setVisibility(Z)V
+PLcom/android/server/am/ActivityRecord;->setVisible(Z)V
+PLcom/android/server/am/ActivityRecord;->shouldPauseWhenBecomingVisible()Z
+PLcom/android/server/am/ActivityRecord;->shouldRelaunchLocked(ILandroid/content/res/Configuration;)Z
+PLcom/android/server/am/ActivityRecord;->showStartingWindow(Lcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityRecord;->showStartingWindow(Lcom/android/server/am/ActivityRecord;ZZZ)V
+PLcom/android/server/am/ActivityRecord;->startFreezingScreenLocked(Lcom/android/server/am/ProcessRecord;I)V
+PLcom/android/server/am/ActivityRecord;->startLaunchTickingLocked()V
+PLcom/android/server/am/ActivityRecord;->stopFreezingScreenLocked(Z)V
+PLcom/android/server/am/ActivityRecord;->supportsFreeform()Z
+PLcom/android/server/am/ActivityRecord;->supportsPictureInPicture()Z
+PLcom/android/server/am/ActivityRecord;->supportsResizeableMultiWindow()Z
+PLcom/android/server/am/ActivityRecord;->supportsSplitScreenWindowingMode()Z
+PLcom/android/server/am/ActivityRecord;->takeFromHistory()V
+PLcom/android/server/am/ActivityRecord;->takeOptionsLocked()Landroid/app/ActivityOptions;
+PLcom/android/server/am/ActivityRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/ActivityRecord;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/am/ActivityRecord;->updateOptionsLocked(Landroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityRecord;->updateOverrideConfiguration()V
+PLcom/android/server/am/ActivityRecord;->updateTaskDescription(Ljava/lang/CharSequence;)V
+PLcom/android/server/am/ActivityResult;-><init>(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;IILandroid/content/Intent;)V
+PLcom/android/server/am/ActivityStack$ActivityStackHandler;-><init>(Lcom/android/server/am/ActivityStack;Landroid/os/Looper;)V
+PLcom/android/server/am/ActivityStack$ActivityStackHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityStack$ActivityState;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityStack$ActivityState;->values()[Lcom/android/server/am/ActivityStack$ActivityState;
+PLcom/android/server/am/ActivityStack;-><init>(Lcom/android/server/am/ActivityDisplay;ILcom/android/server/am/ActivityStackSupervisor;IIZ)V
+PLcom/android/server/am/ActivityStack;->activityDestroyedLocked(Landroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->activityDestroyedLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->activityPausedLocked(Landroid/os/IBinder;Z)V
+PLcom/android/server/am/ActivityStack;->addStartingWindowsForVisibleActivities(Z)V
+PLcom/android/server/am/ActivityStack;->addTask(Lcom/android/server/am/TaskRecord;IZLjava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->addTask(Lcom/android/server/am/TaskRecord;ZLjava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->addToStopping(Lcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityStack;->adjustFocusToNextFocusableStack(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStack;->adjustFocusToNextFocusableStack(Ljava/lang/String;Z)Z
+PLcom/android/server/am/ActivityStack;->adjustFocusedActivityStack(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->awakeFromSleepingLocked()V
+PLcom/android/server/am/ActivityStack;->canEnterPipOnTaskSwitch(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStack;->canShowWithInsecureKeyguard()Z
+PLcom/android/server/am/ActivityStack;->checkReadyForSleep()V
+PLcom/android/server/am/ActivityStack;->cleanUpActivityLocked(Lcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityStack;->cleanUpActivityServicesLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->clearLaunchTime(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->closeSystemDialogsLocked()V
+PLcom/android/server/am/ActivityStack;->completePauseLocked(ZLcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->containsActivityFromStack(Ljava/util/List;)Z
+PLcom/android/server/am/ActivityStack;->continueUpdateBounds()V
+PLcom/android/server/am/ActivityStack;->createStackWindowController(IZLandroid/graphics/Rect;)Lcom/android/server/wm/StackWindowController;
+PLcom/android/server/am/ActivityStack;->createTaskRecord(ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;ZLcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStack;->destroyActivityLocked(Lcom/android/server/am/ActivityRecord;ZLjava/lang/String;)Z
+PLcom/android/server/am/ActivityStack;->ensureActivitiesVisibleLocked(Lcom/android/server/am/ActivityRecord;IZ)V
+PLcom/android/server/am/ActivityStack;->executeAppTransition(Landroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityStack;->findActivityLocked(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Z)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->findTaskLocked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStackSupervisor$FindTaskResult;)V
+PLcom/android/server/am/ActivityStack;->finishActivityAffinityLocked(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->finishActivityLocked(Lcom/android/server/am/ActivityRecord;ILandroid/content/Intent;Ljava/lang/String;Z)Z
+PLcom/android/server/am/ActivityStack;->finishActivityLocked(Lcom/android/server/am/ActivityRecord;ILandroid/content/Intent;Ljava/lang/String;ZZ)Z
+PLcom/android/server/am/ActivityStack;->finishActivityResultsLocked(Lcom/android/server/am/ActivityRecord;ILandroid/content/Intent;)V
+PLcom/android/server/am/ActivityStack;->finishCurrentActivityLocked(Lcom/android/server/am/ActivityRecord;IZLjava/lang/String;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->finishDisabledPackageActivitiesLocked(Ljava/lang/String;Ljava/util/Set;ZZI)Z
+PLcom/android/server/am/ActivityStack;->finishVoiceTask(Landroid/service/voice/IVoiceInteractionSession;)V
+PLcom/android/server/am/ActivityStack;->getAdjustedPositionForTask(Lcom/android/server/am/TaskRecord;ILcom/android/server/am/ActivityRecord;)I
+PLcom/android/server/am/ActivityStack;->getAllRunningVisibleActivitiesLocked(Ljava/util/ArrayList;)V
+PLcom/android/server/am/ActivityStack;->getAllTasks()Ljava/util/ArrayList;
+PLcom/android/server/am/ActivityStack;->getChildAt(I)Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/am/ActivityStack;->getChildCount()I
+PLcom/android/server/am/ActivityStack;->getStackId()I
+PLcom/android/server/am/ActivityStack;->getTopActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->getWindowContainerBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/am/ActivityStack;->getWindowContainerController()Lcom/android/server/wm/StackWindowController;
+PLcom/android/server/am/ActivityStack;->goToSleep()V
+PLcom/android/server/am/ActivityStack;->goToSleepIfPossible(Z)Z
+PLcom/android/server/am/ActivityStack;->handleAppDiedLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/ActivityStack;->insertTaskAtBottom(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->insertTaskAtTop(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->isCompatible(II)Z
+PLcom/android/server/am/ActivityStack;->isFocusable()Z
+PLcom/android/server/am/ActivityStack;->isHomeOrRecentsStack()Z
+PLcom/android/server/am/ActivityStack;->isInStackLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->isInStackLocked(Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->isInStackLocked(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/ActivityStack;->isOnHomeDisplay()Z
+PLcom/android/server/am/ActivityStack;->isTaskSwitch(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->isTopStackOnDisplay()Z
+PLcom/android/server/am/ActivityStack;->logStartActivity(ILcom/android/server/am/ActivityRecord;Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->makeVisibleAndRestartIfNeeded(Lcom/android/server/am/ActivityRecord;IZZLcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->minimalResumeActivityLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->moveHomeStackTaskToTop()V
+PLcom/android/server/am/ActivityStack;->moveTaskToBackLocked(I)Z
+PLcom/android/server/am/ActivityStack;->moveTaskToFrontLocked(Lcom/android/server/am/TaskRecord;ZLandroid/app/ActivityOptions;Lcom/android/server/am/AppTimeTracker;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->moveToBack(Ljava/lang/String;Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->moveToFront(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->moveToFront(Ljava/lang/String;Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->navigateUpToLocked(Lcom/android/server/am/ActivityRecord;Landroid/content/Intent;ILandroid/content/Intent;)Z
+PLcom/android/server/am/ActivityStack;->notifyActivityDrawnLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->onActivityAddedToStack(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->onActivityRemovedFromStack(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->onActivityStateChanged(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStack$ActivityState;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/am/ActivityStack;->onLockTaskPackagesUpdated()V
+PLcom/android/server/am/ActivityStack;->onParentChanged()V
+PLcom/android/server/am/ActivityStack;->postAddTask(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityStack;Z)V
+PLcom/android/server/am/ActivityStack;->postAddToDisplay(Lcom/android/server/am/ActivityDisplay;Landroid/graphics/Rect;Z)V
+PLcom/android/server/am/ActivityStack;->preAddTask(Lcom/android/server/am/TaskRecord;Ljava/lang/String;Z)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStack;->rankTaskLayers(I)I
+PLcom/android/server/am/ActivityStack;->remove()V
+PLcom/android/server/am/ActivityStack;->removeActivitiesFromLRUListLocked(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStack;->removeActivityFromHistoryLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->removeFromDisplay()V
+PLcom/android/server/am/ActivityStack;->removeTask(Lcom/android/server/am/TaskRecord;Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityStack;->removeTimeoutsForActivityLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->requestFinishActivityLocked(Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Z)Z
+PLcom/android/server/am/ActivityStack;->resetTargetTaskIfNeededLocked(Lcom/android/server/am/TaskRecord;Z)Landroid/app/ActivityOptions;
+PLcom/android/server/am/ActivityStack;->resetTaskIfNeededLocked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->resumeTopActivityInNextFocusableStack(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStack;->resumeTopActivityInnerLocked(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStack;->resumeTopActivityUncheckedLocked(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStack;->returnsToHomeStack()Z
+PLcom/android/server/am/ActivityStack;->schedulePauseTimeout(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->sendActivityResultLocked(ILcom/android/server/am/ActivityRecord;Ljava/lang/String;IILandroid/content/Intent;)V
+PLcom/android/server/am/ActivityStack;->setBounds(Landroid/graphics/Rect;)I
+PLcom/android/server/am/ActivityStack;->setResumedActivity(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStack;->setWindowingMode(I)V
+PLcom/android/server/am/ActivityStack;->setWindowingMode(IZZZZ)V
+PLcom/android/server/am/ActivityStack;->shouldSleepActivities()Z
+PLcom/android/server/am/ActivityStack;->shouldSleepOrShutDownActivities()Z
+PLcom/android/server/am/ActivityStack;->shouldUpRecreateTaskLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStack;->startActivityLocked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;ZZLandroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityStack;->startPausingLocked(ZZLcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityStack;->stopActivityLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStack;->taskForIdLocked(I)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStack;->topActivityOccludesKeyguard()Z
+PLcom/android/server/am/ActivityStack;->topRunningNonDelayedActivityLocked(Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStack;->topTask()Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStack;->updateActivityApplicationInfoLocked(Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/am/ActivityStack;->updateBehindFullscreen(ZZLcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->updateLRUListLocked(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStack;->updateTaskMovement(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/ActivityStack;->updateTransitLocked(ILandroid/app/ActivityOptions;)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;->activityIdleInternal(Lcom/android/server/am/ActivityRecord;Z)V
+PLcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityStackSupervisor$SleepTokenImpl;-><init>(Lcom/android/server/am/ActivityStackSupervisor;Ljava/lang/String;I)V
+PLcom/android/server/am/ActivityStackSupervisor$SleepTokenImpl;->access$000(Lcom/android/server/am/ActivityStackSupervisor$SleepTokenImpl;)I
+PLcom/android/server/am/ActivityStackSupervisor$SleepTokenImpl;->release()V
+PLcom/android/server/am/ActivityStackSupervisor;->access$200(Lcom/android/server/am/ActivityStackSupervisor;I)V
+PLcom/android/server/am/ActivityStackSupervisor;->access$500(Lcom/android/server/am/ActivityStackSupervisor;Lcom/android/server/am/ActivityStackSupervisor$SleepTokenImpl;)V
+PLcom/android/server/am/ActivityStackSupervisor;->acquireLaunchWakelock()V
+PLcom/android/server/am/ActivityStackSupervisor;->activityIdleInternalLocked(Landroid/os/IBinder;ZZLandroid/content/res/Configuration;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->activityRelaunchedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/am/ActivityStackSupervisor;->activityRelaunchingLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->activitySleptLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->addStartingWindowsForVisibleActivities(Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->allPausedActivitiesComplete()Z
+PLcom/android/server/am/ActivityStackSupervisor;->allResumedActivitiesComplete()Z
+PLcom/android/server/am/ActivityStackSupervisor;->allResumedActivitiesIdle()Z
+PLcom/android/server/am/ActivityStackSupervisor;->allResumedActivitiesVisible()Z
+PLcom/android/server/am/ActivityStackSupervisor;->anyTaskForIdLocked(I)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->anyTaskForIdLocked(II)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->anyTaskForIdLocked(IILandroid/app/ActivityOptions;Z)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->applySleepTokensLocked(Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->beginDeferResume()V
+PLcom/android/server/am/ActivityStackSupervisor;->calculateDefaultMinimalSizeOfResizeableTasks(Lcom/android/server/am/ActivityDisplay;)V
+PLcom/android/server/am/ActivityStackSupervisor;->canLaunchOnDisplay(Lcom/android/server/am/ActivityRecord;I)Z
+PLcom/android/server/am/ActivityStackSupervisor;->canPlaceEntityOnDisplay(IZIILandroid/content/pm/ActivityInfo;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->canUseActivityOptionsLaunchBounds(Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->cancelInitializingActivities()V
+PLcom/android/server/am/ActivityStackSupervisor;->checkFinishBootingLocked()Z
+PLcom/android/server/am/ActivityStackSupervisor;->checkReadyForSleepLocked(Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->checkStartAnyActivityPermission(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/String;IIILjava/lang/String;ZZLcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStack;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->cleanUpRemovedTaskLocked(Lcom/android/server/am/TaskRecord;ZZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->cleanupActivity(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->closeSystemDialogsLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->comeOutOfSleepIfNeededLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->continueUpdateBounds(I)V
+PLcom/android/server/am/ActivityStackSupervisor;->continueUpdateRecentsHomeStackBounds()V
+PLcom/android/server/am/ActivityStackSupervisor;->createSleepTokenLocked(Ljava/lang/String;I)Landroid/app/ActivityManagerInternal$SleepToken;
+PLcom/android/server/am/ActivityStackSupervisor;->endDeferResume()V
+PLcom/android/server/am/ActivityStackSupervisor;->ensureActivitiesVisibleLocked(Lcom/android/server/am/ActivityRecord;IZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->ensureVisibilityAndConfig(Lcom/android/server/am/ActivityRecord;IZZ)Z
+PLcom/android/server/am/ActivityStackSupervisor;->findActivityLocked(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Z)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->findTaskLocked(Lcom/android/server/am/ActivityRecord;I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->findTaskToMoveToFront(Lcom/android/server/am/TaskRecord;ILandroid/app/ActivityOptions;Ljava/lang/String;Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->finishDisabledPackageActivitiesLocked(Ljava/lang/String;Ljava/util/Set;ZZI)Z
+PLcom/android/server/am/ActivityStackSupervisor;->finishVoiceTask(Landroid/service/voice/IVoiceInteractionSession;)V
+PLcom/android/server/am/ActivityStackSupervisor;->getActionRestrictionForCallingPackage(Ljava/lang/String;Ljava/lang/String;II)I
+PLcom/android/server/am/ActivityStackSupervisor;->getActivityDisplayOrCreateLocked(I)Lcom/android/server/am/ActivityDisplay;
+PLcom/android/server/am/ActivityStackSupervisor;->getActivityMetricsLogger()Lcom/android/server/am/ActivityMetricsLogger;
+PLcom/android/server/am/ActivityStackSupervisor;->getChildAt(I)Lcom/android/server/am/ActivityDisplay;
+PLcom/android/server/am/ActivityStackSupervisor;->getChildAt(I)Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/am/ActivityStackSupervisor;->getComponentRestrictionForCallingPackage(Landroid/content/pm/ActivityInfo;Ljava/lang/String;IIZ)I
+PLcom/android/server/am/ActivityStackSupervisor;->getDefaultDisplay()Lcom/android/server/am/ActivityDisplay;
+PLcom/android/server/am/ActivityStackSupervisor;->getDisplayOverrideConfiguration(I)Landroid/content/res/Configuration;
+PLcom/android/server/am/ActivityStackSupervisor;->getHomeActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->getHomeActivityForUser(I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->getLastStack()Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getLaunchParamsController()Lcom/android/server/am/LaunchParamsController;
+PLcom/android/server/am/ActivityStackSupervisor;->getLaunchStack(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;Z)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getLaunchStack(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;ZI)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getLaunchTimeTracker()Lcom/android/server/am/LaunchTimeTracker;
+PLcom/android/server/am/ActivityStackSupervisor;->getNextFocusableStackLocked(Lcom/android/server/am/ActivityStack;Z)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getNextTaskIdForUserLocked(I)I
+PLcom/android/server/am/ActivityStackSupervisor;->getRunningTasks(ILjava/util/List;IIIZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->getStack(I)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getStack(II)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStackSupervisor;->getStackInfo(I)Landroid/app/ActivityManager$StackInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->getStackInfo(II)Landroid/app/ActivityManager$StackInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->getStackInfo(Lcom/android/server/am/ActivityStack;)Landroid/app/ActivityManager$StackInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->getTopVisibleActivities()Ljava/util/List;
+PLcom/android/server/am/ActivityStackSupervisor;->goingToSleepLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->handleDisplayChanged(I)V
+PLcom/android/server/am/ActivityStackSupervisor;->handleNonResizableTaskIfNeeded(Lcom/android/server/am/TaskRecord;IILcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityStackSupervisor;->handleNonResizableTaskIfNeeded(Lcom/android/server/am/TaskRecord;IILcom/android/server/am/ActivityStack;Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->hasAwakeDisplay()Z
+PLcom/android/server/am/ActivityStackSupervisor;->invalidateTaskLayers()V
+PLcom/android/server/am/ActivityStackSupervisor;->isDisplayAdded(I)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isFocusable(Lcom/android/server/wm/ConfigurationContainer;Z)Z
+PLcom/android/server/am/ActivityStackSupervisor;->isInAnyStackLocked(Landroid/os/IBinder;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->isStoppingNoHistoryActivity()Z
+PLcom/android/server/am/ActivityStackSupervisor;->isValidTopRunningActivity(Lcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityStackSupervisor;->logIfTransactionTooLarge(Landroid/content/Intent;Landroid/os/Bundle;)V
+PLcom/android/server/am/ActivityStackSupervisor;->logStackState()V
+PLcom/android/server/am/ActivityStackSupervisor;->moveFocusableActivityStackToFrontLocked(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->moveHomeStackTaskToTop(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->moveHomeStackToFront(Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStackSupervisor;->nextTaskIdForUser(II)I
+PLcom/android/server/am/ActivityStackSupervisor;->notifyAppTransitionDone()V
+PLcom/android/server/am/ActivityStackSupervisor;->onDisplayChanged(I)V
+PLcom/android/server/am/ActivityStackSupervisor;->onRecentTaskAdded(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->onRecentTaskRemoved(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->pauseBackStacks(ZLcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/ActivityStackSupervisor;->processStoppingActivitiesLocked(Lcom/android/server/am/ActivityRecord;ZZ)Ljava/util/ArrayList;
+PLcom/android/server/am/ActivityStackSupervisor;->putStacksToSleepLocked(ZZ)Z
+PLcom/android/server/am/ActivityStackSupervisor;->readyToResume()Z
+PLcom/android/server/am/ActivityStackSupervisor;->realStartActivityLocked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ProcessRecord;ZZ)Z
+PLcom/android/server/am/ActivityStackSupervisor;->removeSleepTimeouts()V
+PLcom/android/server/am/ActivityStackSupervisor;->removeSleepTokenLocked(Lcom/android/server/am/ActivityStackSupervisor$SleepTokenImpl;)V
+PLcom/android/server/am/ActivityStackSupervisor;->removeTaskByIdLocked(IZZLjava/lang/String;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->removeTaskByIdLocked(IZZZLjava/lang/String;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->removeTimeoutsForActivityLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->reportActivityLaunchedLocked(ZLcom/android/server/am/ActivityRecord;JJ)V
+PLcom/android/server/am/ActivityStackSupervisor;->reportActivityVisibleLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->reportResumedActivityLocked(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->reportWaitingActivityLaunchedIfNeeded(Lcom/android/server/am/ActivityRecord;I)V
+PLcom/android/server/am/ActivityStackSupervisor;->resolveActivity(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;ILandroid/app/ProfilerInfo;)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->resolveActivity(Landroid/content/Intent;Ljava/lang/String;ILandroid/app/ProfilerInfo;II)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->resolveActivityType(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;)I
+PLcom/android/server/am/ActivityStackSupervisor;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;III)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/am/ActivityStackSupervisor;->restoreRecentTaskLocked(Lcom/android/server/am/TaskRecord;Landroid/app/ActivityOptions;Z)Z
+PLcom/android/server/am/ActivityStackSupervisor;->resumeFocusedStackTopActivityLocked()Z
+PLcom/android/server/am/ActivityStackSupervisor;->resumeFocusedStackTopActivityLocked(Lcom/android/server/am/ActivityStack;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->resumeHomeStackTask(Lcom/android/server/am/ActivityRecord;Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStackSupervisor;->scheduleIdleLocked()V
+PLcom/android/server/am/ActivityStackSupervisor;->scheduleIdleTimeoutLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->scheduleResumeTopActivities()V
+PLcom/android/server/am/ActivityStackSupervisor;->scheduleSleepTimeout()V
+PLcom/android/server/am/ActivityStackSupervisor;->sendPowerHintForLaunchEndIfNeeded()V
+PLcom/android/server/am/ActivityStackSupervisor;->sendPowerHintForLaunchStartIfNeeded(ZLcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->sendWaitingVisibleReportLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->setDisplayOverrideConfiguration(Landroid/content/res/Configuration;I)V
+PLcom/android/server/am/ActivityStackSupervisor;->setDockedStackMinimized(Z)V
+PLcom/android/server/am/ActivityStackSupervisor;->setFocusStackUnchecked(Ljava/lang/String;Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityStackSupervisor;->setLaunchSource(I)V
+PLcom/android/server/am/ActivityStackSupervisor;->setNextTaskIdForUserLocked(II)V
+PLcom/android/server/am/ActivityStackSupervisor;->setWindowManager(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/ActivityStackSupervisor;->startActivityFromRecents(IIILcom/android/server/am/SafeActivityOptions;)I
+PLcom/android/server/am/ActivityStackSupervisor;->startSpecificActivityLocked(Lcom/android/server/am/ActivityRecord;ZZ)V
+PLcom/android/server/am/ActivityStackSupervisor;->topRunningActivityLocked()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->topRunningActivityLocked(Z)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStackSupervisor;->updateActivityApplicationInfoLocked(Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/am/ActivityStackSupervisor;->updatePreviousProcessLocked(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStackSupervisor;->updateUIDsPresentOnDisplay()V
+PLcom/android/server/am/ActivityStackSupervisor;->updateUserStackLocked(ILcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityStartController$StartHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/ActivityStartController;->access$000(Lcom/android/server/am/ActivityStartController;)Lcom/android/server/am/ActivityManagerService;
+PLcom/android/server/am/ActivityStartController;->checkTargetUser(IZIILjava/lang/String;)I
+PLcom/android/server/am/ActivityStartController;->clearPendingActivityLaunches(Ljava/lang/String;)Z
+PLcom/android/server/am/ActivityStartController;->doPendingActivityLaunches(Z)V
+PLcom/android/server/am/ActivityStartController;->getPendingRemoteAnimationRegistry()Lcom/android/server/am/PendingRemoteAnimationRegistry;
+PLcom/android/server/am/ActivityStartController;->obtainStarter(Landroid/content/Intent;Ljava/lang/String;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStartController;->onExecutionComplete(Lcom/android/server/am/ActivityStarter;)V
+PLcom/android/server/am/ActivityStartController;->postStartActivityProcessingForLastStarter(Lcom/android/server/am/ActivityRecord;ILcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityStartController;->registerRemoteAnimationForNextActivityStart(Ljava/lang/String;Landroid/view/RemoteAnimationAdapter;)V
+PLcom/android/server/am/ActivityStartController;->schedulePendingActivityLaunches(J)V
+PLcom/android/server/am/ActivityStartController;->startActivities(Landroid/app/IApplicationThread;ILjava/lang/String;[Landroid/content/Intent;[Ljava/lang/String;Landroid/os/IBinder;Lcom/android/server/am/SafeActivityOptions;ILjava/lang/String;)I
+PLcom/android/server/am/ActivityStartController;->startActivityInPackage(IIILjava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IILcom/android/server/am/SafeActivityOptions;ILcom/android/server/am/TaskRecord;Ljava/lang/String;Z)I
+PLcom/android/server/am/ActivityStartController;->startHomeActivity(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStartController;->startSetupActivity()V
+PLcom/android/server/am/ActivityStartInterceptor;->intercept(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;Landroid/content/pm/ActivityInfo;Ljava/lang/String;Lcom/android/server/am/TaskRecord;IILandroid/app/ActivityOptions;)Z
+PLcom/android/server/am/ActivityStartInterceptor;->interceptHarmfulAppIfNeeded()Z
+PLcom/android/server/am/ActivityStartInterceptor;->interceptQuietProfileIfNeeded()Z
+PLcom/android/server/am/ActivityStartInterceptor;->interceptSuspendedPackageIfNeeded()Z
+PLcom/android/server/am/ActivityStartInterceptor;->interceptWithConfirmCredentialsIfNeeded(Landroid/content/pm/ActivityInfo;I)Landroid/content/Intent;
+PLcom/android/server/am/ActivityStartInterceptor;->interceptWorkProfileChallengeIfNeeded()Z
+PLcom/android/server/am/ActivityStartInterceptor;->setStates(IIIILjava/lang/String;)V
+PLcom/android/server/am/ActivityStarter$DefaultFactory;->obtain()Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter$DefaultFactory;->recycle(Lcom/android/server/am/ActivityStarter;)V
+PLcom/android/server/am/ActivityStarter$Request;-><init>()V
+PLcom/android/server/am/ActivityStarter$Request;->reset()V
+PLcom/android/server/am/ActivityStarter$Request;->set(Lcom/android/server/am/ActivityStarter$Request;)V
+PLcom/android/server/am/ActivityStarter;-><init>(Lcom/android/server/am/ActivityStartController;Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;Lcom/android/server/am/ActivityStartInterceptor;)V
+PLcom/android/server/am/ActivityStarter;->addOrReparentStartingActivity(Lcom/android/server/am/TaskRecord;Ljava/lang/String;)V
+PLcom/android/server/am/ActivityStarter;->adjustLaunchFlagsToDocumentMode(Lcom/android/server/am/ActivityRecord;ZZI)I
+PLcom/android/server/am/ActivityStarter;->computeLaunchingTaskFlags()V
+PLcom/android/server/am/ActivityStarter;->computeResolveFilterUid(III)I
+PLcom/android/server/am/ActivityStarter;->computeSourceStack()V
+PLcom/android/server/am/ActivityStarter;->computeStackFocus(Lcom/android/server/am/ActivityRecord;ZILandroid/app/ActivityOptions;)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStarter;->deliverNewIntent(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStarter;->execute()I
+PLcom/android/server/am/ActivityStarter;->getExternalResult(I)I
+PLcom/android/server/am/ActivityStarter;->getLaunchStack(Lcom/android/server/am/ActivityRecord;ILcom/android/server/am/TaskRecord;Landroid/app/ActivityOptions;)Lcom/android/server/am/ActivityStack;
+PLcom/android/server/am/ActivityStarter;->getPreferedDisplayId(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)I
+PLcom/android/server/am/ActivityStarter;->getReusableIntentActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStarter;->isDocumentLaunchesIntoExisting(I)Z
+PLcom/android/server/am/ActivityStarter;->isLaunchModeOneOf(II)Z
+PLcom/android/server/am/ActivityStarter;->onExecutionComplete()V
+PLcom/android/server/am/ActivityStarter;->postStartActivityProcessing(Lcom/android/server/am/ActivityRecord;ILcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/ActivityStarter;->reset(Z)V
+PLcom/android/server/am/ActivityStarter;->resumeTargetStackIfNeeded()V
+PLcom/android/server/am/ActivityStarter;->sendNewTaskResultRequestIfNeeded()V
+PLcom/android/server/am/ActivityStarter;->set(Lcom/android/server/am/ActivityStarter;)V
+PLcom/android/server/am/ActivityStarter;->setActivityInfo(Landroid/content/pm/ActivityInfo;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setActivityOptions(Landroid/os/Bundle;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setActivityOptions(Lcom/android/server/am/SafeActivityOptions;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setAllowPendingRemoteAnimationRegistryLookup(Z)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setCaller(Landroid/app/IApplicationThread;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setCallingPackage(Ljava/lang/String;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setCallingPid(I)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setCallingUid(I)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setComponentSpecified(Z)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setInTask(Lcom/android/server/am/TaskRecord;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setInitialState(Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;ZILcom/android/server/am/ActivityRecord;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)V
+PLcom/android/server/am/ActivityStarter;->setIntent(Landroid/content/Intent;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setMayWait(I)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setOutActivity([Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setProfilerInfo(Landroid/app/ProfilerInfo;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setRealCallingPid(I)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setRealCallingUid(I)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setReason(Ljava/lang/String;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setRequestCode(I)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setResolvedType(Ljava/lang/String;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setResultTo(Landroid/os/IBinder;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setResultWho(Ljava/lang/String;)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setStartFlags(I)Lcom/android/server/am/ActivityStarter;
+PLcom/android/server/am/ActivityStarter;->setTargetStackAndMoveToFrontIfNeeded(Lcom/android/server/am/ActivityRecord;)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/ActivityStarter;->setTaskFromInTask()I
+PLcom/android/server/am/ActivityStarter;->setTaskFromIntentActivity(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/ActivityStarter;->setTaskFromReuseOrCreateNewTask(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/ActivityStack;)I
+PLcom/android/server/am/ActivityStarter;->setTaskFromSourceRecord()I
+PLcom/android/server/am/ActivityStarter;->startActivity(Landroid/app/IApplicationThread;Landroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Landroid/content/pm/ResolveInfo;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Landroid/os/IBinder;Ljava/lang/String;IIILjava/lang/String;IIILcom/android/server/am/SafeActivityOptions;ZZ[Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/TaskRecord;Ljava/lang/String;Z)I
+PLcom/android/server/am/ActivityStarter;->startActivity(Landroid/app/IApplicationThread;Landroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Landroid/content/pm/ResolveInfo;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;Landroid/os/IBinder;Ljava/lang/String;IIILjava/lang/String;IIILcom/android/server/am/SafeActivityOptions;ZZ[Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/TaskRecord;Z)I
+PLcom/android/server/am/ActivityStarter;->startActivity(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;IZLandroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;[Lcom/android/server/am/ActivityRecord;)I
+PLcom/android/server/am/ActivityStarter;->startActivityUnchecked(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;IZLandroid/app/ActivityOptions;Lcom/android/server/am/TaskRecord;[Lcom/android/server/am/ActivityRecord;)I
+PLcom/android/server/am/ActivityStarter;->updateBounds(Lcom/android/server/am/TaskRecord;Landroid/graphics/Rect;)V
+PLcom/android/server/am/AppErrors;->isBadProcessLocked(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/am/AppErrors;->loadAppsNotReportingCrashesFromConfigLocked(Ljava/lang/String;)V
+PLcom/android/server/am/AppErrors;->resetProcessCrashTimeLocked(Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/am/AppErrors;->resetProcessCrashTimeLocked(ZII)V
+PLcom/android/server/am/AppTaskImpl;-><init>(Lcom/android/server/am/ActivityManagerService;II)V
+PLcom/android/server/am/AppTaskImpl;->checkCaller()V
+PLcom/android/server/am/AppTaskImpl;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;
+PLcom/android/server/am/AppTaskImpl;->setExcludeFromRecents(Z)V
+PLcom/android/server/am/AppWarnings$UiHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/AppWarnings$UiHandler;->hideUnsupportedDisplaySizeDialog()V
+PLcom/android/server/am/AppWarnings;->access$100(Lcom/android/server/am/AppWarnings;)V
+PLcom/android/server/am/AppWarnings;->hideUnsupportedDisplaySizeDialogUiThread()V
+PLcom/android/server/am/AppWarnings;->onDensityChanged()V
+PLcom/android/server/am/AppWarnings;->onResumeActivity(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/AppWarnings;->onStartActivity(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/AppWarnings;->showDeprecatedTargetDialogIfNeeded(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/AppWarnings;->showUnsupportedCompileSdkDialogIfNeeded(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/AppWarnings;->showUnsupportedDisplaySizeDialogIfNeeded(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/AssistDataRequester$AssistDataRequesterCallbacks;->onAssistRequestCompleted()V
+PLcom/android/server/am/AssistDataRequester;-><init>(Landroid/content/Context;Landroid/app/IActivityManager;Landroid/view/IWindowManager;Landroid/app/AppOpsManager;Lcom/android/server/am/AssistDataRequester$AssistDataRequesterCallbacks;Ljava/lang/Object;II)V
+PLcom/android/server/am/AssistDataRequester;->cancel()V
+PLcom/android/server/am/AssistDataRequester;->dispatchAssistDataReceived(Landroid/os/Bundle;)V
+PLcom/android/server/am/AssistDataRequester;->dispatchAssistScreenshotReceived(Landroid/graphics/Bitmap;)V
+PLcom/android/server/am/AssistDataRequester;->flushPendingAssistData()V
+PLcom/android/server/am/AssistDataRequester;->getPendingDataCount()I
+PLcom/android/server/am/AssistDataRequester;->onHandleAssistData(Landroid/os/Bundle;)V
+PLcom/android/server/am/AssistDataRequester;->onHandleAssistScreenshot(Landroid/graphics/Bitmap;)V
+PLcom/android/server/am/AssistDataRequester;->processPendingAssistData()V
+PLcom/android/server/am/AssistDataRequester;->requestAssistData(Ljava/util/List;ZZZZILjava/lang/String;)V
+PLcom/android/server/am/AssistDataRequester;->tryDispatchRequestComplete()V
+PLcom/android/server/am/BackupRecord;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;Landroid/content/pm/ApplicationInfo;I)V
+PLcom/android/server/am/BatteryExternalStatsWorker;->extractDeltaLocked(Landroid/net/wifi/WifiActivityEnergyInfo;)Landroid/net/wifi/WifiActivityEnergyInfo;
+PLcom/android/server/am/BatteryExternalStatsWorker;->getLastCollectionTimeStamp()J
+PLcom/android/server/am/BatteryExternalStatsWorker;->lambda$cC4f0pNQX9_D9f8AXLmKk2sArGY(Lcom/android/internal/os/BatteryStatsImpl;ZZ)V
+PLcom/android/server/am/BatteryExternalStatsWorker;->lambda$scheduleCpuSyncDueToWakelockChange$1(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+PLcom/android/server/am/BatteryExternalStatsWorker;->lambda$scheduleCpuSyncDueToWakelockChange$2(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleCpuSyncDueToRemovedUid(I)Ljava/util/concurrent/Future;
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleCpuSyncDueToScreenStateChange(ZZ)Ljava/util/concurrent/Future;
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleReadProcStateCpuTimes(ZZJ)Ljava/util/concurrent/Future;
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleRunnable(Ljava/lang/Runnable;)V
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleSync(Ljava/lang/String;I)Ljava/util/concurrent/Future;
+PLcom/android/server/am/BatteryExternalStatsWorker;->scheduleSyncDueToBatteryLevelChange(J)Ljava/util/concurrent/Future;
+PLcom/android/server/am/BatteryStatsService$1;->getUserIds()[I
+PLcom/android/server/am/BatteryStatsService$LocalService;->getMobileIfaces()[Ljava/lang/String;
+PLcom/android/server/am/BatteryStatsService$LocalService;->getWifiIfaces()[Ljava/lang/String;
+PLcom/android/server/am/BatteryStatsService$LocalService;->noteJobsDeferred(IIJ)V
+PLcom/android/server/am/BatteryStatsService;->addIsolatedUid(II)V
+PLcom/android/server/am/BatteryStatsService;->awaitUninterruptibly(Ljava/util/concurrent/Future;)V
+PLcom/android/server/am/BatteryStatsService;->computeChargeTimeRemaining()J
+PLcom/android/server/am/BatteryStatsService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/am/BatteryStatsService;->dumpHelp(Ljava/io/PrintWriter;)V
+PLcom/android/server/am/BatteryStatsService;->getCellularBatteryStats()Landroid/os/connectivity/CellularBatteryStats;
+PLcom/android/server/am/BatteryStatsService;->getGpsBatteryStats()Landroid/os/connectivity/GpsBatteryStats;
+PLcom/android/server/am/BatteryStatsService;->getHealthStatsForUidLocked(I)Landroid/os/health/HealthStatsParceler;
+PLcom/android/server/am/BatteryStatsService;->getPlatformLowPowerStats()Ljava/lang/String;
+PLcom/android/server/am/BatteryStatsService;->getService()Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/am/BatteryStatsService;->getStatisticsStream()Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/am/BatteryStatsService;->getSubsystemLowPowerStats()Ljava/lang/String;
+PLcom/android/server/am/BatteryStatsService;->getWifiBatteryStats()Landroid/os/connectivity/WifiBatteryStats;
+PLcom/android/server/am/BatteryStatsService;->isCharging()Z
+PLcom/android/server/am/BatteryStatsService;->isOnBattery()Z
+PLcom/android/server/am/BatteryStatsService;->lambda$setBatteryState$0(Lcom/android/server/am/BatteryStatsService;IIIIIIII)V
+PLcom/android/server/am/BatteryStatsService;->lambda$setBatteryState$1(Lcom/android/server/am/BatteryStatsService;IIIIIIII)V
+PLcom/android/server/am/BatteryStatsService;->noteAlarmFinish(Ljava/lang/String;Landroid/os/WorkSource;I)V
+PLcom/android/server/am/BatteryStatsService;->noteAlarmStart(Ljava/lang/String;Landroid/os/WorkSource;I)V
+PLcom/android/server/am/BatteryStatsService;->noteBleScanResults(Landroid/os/WorkSource;I)V
+PLcom/android/server/am/BatteryStatsService;->noteBleScanStarted(Landroid/os/WorkSource;Z)V
+PLcom/android/server/am/BatteryStatsService;->noteBleScanStopped(Landroid/os/WorkSource;Z)V
+PLcom/android/server/am/BatteryStatsService;->noteChangeWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V
+PLcom/android/server/am/BatteryStatsService;->noteConnectivityChanged(ILjava/lang/String;)V
+PLcom/android/server/am/BatteryStatsService;->noteDeviceIdleMode(ILjava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteEvent(ILjava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteFlashlightOff(I)V
+PLcom/android/server/am/BatteryStatsService;->noteFlashlightOn(I)V
+PLcom/android/server/am/BatteryStatsService;->noteFullWifiLockAcquiredFromSource(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteFullWifiLockReleasedFromSource(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteGpsChanged(Landroid/os/WorkSource;Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteGpsSignalQuality(I)V
+PLcom/android/server/am/BatteryStatsService;->noteInteractive(Z)V
+PLcom/android/server/am/BatteryStatsService;->noteJobsDeferred(IIJ)V
+PLcom/android/server/am/BatteryStatsService;->noteLongPartialWakelockFinish(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteLongPartialWakelockFinishFromSource(Ljava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteLongPartialWakelockStart(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteLongPartialWakelockStartFromSource(Ljava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteNetworkInterfaceType(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteNetworkStatsEnabled()V
+PLcom/android/server/am/BatteryStatsService;->notePackageInstalled(Ljava/lang/String;J)V
+PLcom/android/server/am/BatteryStatsService;->notePhoneDataConnectionState(IZ)V
+PLcom/android/server/am/BatteryStatsService;->notePhoneOff()V
+PLcom/android/server/am/BatteryStatsService;->notePhoneSignalStrength(Landroid/telephony/SignalStrength;)V
+PLcom/android/server/am/BatteryStatsService;->notePhoneState(I)V
+PLcom/android/server/am/BatteryStatsService;->noteResetBleScan()V
+PLcom/android/server/am/BatteryStatsService;->noteScreenBrightness(I)V
+PLcom/android/server/am/BatteryStatsService;->noteScreenState(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStartAudio(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStartSensor(II)V
+PLcom/android/server/am/BatteryStatsService;->noteStartVideo(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStopAudio(I)V
+PLcom/android/server/am/BatteryStatsService;->noteStopVideo(I)V
+PLcom/android/server/am/BatteryStatsService;->noteSyncFinish(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteSyncStart(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteVibratorOff(I)V
+PLcom/android/server/am/BatteryStatsService;->noteVibratorOn(IJ)V
+PLcom/android/server/am/BatteryStatsService;->noteWakeUp(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->noteWakupAlarm(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiOff()V
+PLcom/android/server/am/BatteryStatsService;->noteWifiOn()V
+PLcom/android/server/am/BatteryStatsService;->noteWifiRadioPowerState(IJI)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiRssiChanged(I)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiRunning(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiScanStartedFromSource(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiScanStoppedFromSource(Landroid/os/WorkSource;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiState(ILjava/lang/String;)V
+PLcom/android/server/am/BatteryStatsService;->noteWifiSupplicantStateChanged(IZ)V
+PLcom/android/server/am/BatteryStatsService;->removeIsolatedUid(II)V
+PLcom/android/server/am/BatteryStatsService;->setBatteryState(IIIIIIII)V
+PLcom/android/server/am/BatteryStatsService;->shouldCollectExternalStats()Z
+PLcom/android/server/am/BatteryStatsService;->syncStats(Ljava/lang/String;I)V
+PLcom/android/server/am/BatteryStatsService;->systemServicesReady()V
+PLcom/android/server/am/BatteryStatsService;->takeUidSnapshot(I)Landroid/os/health/HealthStatsParceler;
+PLcom/android/server/am/BroadcastFilter;-><init>(Landroid/content/IntentFilter;Lcom/android/server/am/ReceiverList;Ljava/lang/String;Ljava/lang/String;IIZZ)V
+PLcom/android/server/am/BroadcastQueue;->backgroundServicesFinishedLocked(I)V
+PLcom/android/server/am/BroadcastQueue;->cleanupDisabledPackageReceiversLocked(Ljava/lang/String;Ljava/util/Set;IZ)Z
+PLcom/android/server/am/BroadcastQueue;->isPendingBroadcastProcessLocked(I)Z
+PLcom/android/server/am/BroadcastQueue;->isSignaturePerm([Ljava/lang/String;)Z
+PLcom/android/server/am/BroadcastQueue;->replaceBroadcastLocked(Ljava/util/ArrayList;Lcom/android/server/am/BroadcastRecord;Ljava/lang/String;)Lcom/android/server/am/BroadcastRecord;
+PLcom/android/server/am/BroadcastQueue;->replaceOrderedBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)Lcom/android/server/am/BroadcastRecord;
+PLcom/android/server/am/BroadcastQueue;->replaceParallelBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)Lcom/android/server/am/BroadcastRecord;
+PLcom/android/server/am/BroadcastQueue;->scheduleTempWhitelistLocked(IJLcom/android/server/am/BroadcastRecord;)V
+PLcom/android/server/am/BroadcastQueue;->sendPendingBroadcastsLocked(Lcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/BroadcastQueue;->skipCurrentReceiverLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/BroadcastRecord;->cleanupDisabledPackageReceiversLocked(Ljava/lang/String;Ljava/util/Set;IZ)Z
+PLcom/android/server/am/BroadcastRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/BroadcastStats$1;-><init>()V
+PLcom/android/server/am/BroadcastStats$ActionEntry;-><init>(Ljava/lang/String;)V
+PLcom/android/server/am/BroadcastStats$PackageEntry;-><init>()V
+PLcom/android/server/am/BroadcastStats$ViolationEntry;-><init>()V
+PLcom/android/server/am/BroadcastStats;-><init>()V
+PLcom/android/server/am/BroadcastStats;->addBackgroundCheckViolation(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/ClientLifecycleManager;->scheduleTransaction(Landroid/app/IApplicationThread;Landroid/app/servertransaction/ClientTransactionItem;)V
+PLcom/android/server/am/ClientLifecycleManager;->scheduleTransaction(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/app/servertransaction/ActivityLifecycleItem;)V
+PLcom/android/server/am/ClientLifecycleManager;->scheduleTransaction(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/app/servertransaction/ClientTransactionItem;)V
+PLcom/android/server/am/ClientLifecycleManager;->scheduleTransaction(Landroid/app/servertransaction/ClientTransaction;)V
+PLcom/android/server/am/ClientLifecycleManager;->transactionWithCallback(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/app/servertransaction/ClientTransactionItem;)Landroid/app/servertransaction/ClientTransaction;
+PLcom/android/server/am/ClientLifecycleManager;->transactionWithState(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/app/servertransaction/ActivityLifecycleItem;)Landroid/app/servertransaction/ClientTransaction;
+PLcom/android/server/am/CompatModePackages;->handlePackageAddedLocked(Ljava/lang/String;Z)V
+PLcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;-><init>(Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;)V
+PLcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;->access$000(Lcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;)I
+PLcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;->access$008(Lcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;)I
+PLcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;->access$010(Lcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;)I
+PLcom/android/server/am/ContentProviderRecord$ExternalProcessHandle;->unlinkFromOwnDeathLocked()V
+PLcom/android/server/am/ContentProviderRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ProviderInfo;Landroid/content/pm/ApplicationInfo;Landroid/content/ComponentName;Z)V
+PLcom/android/server/am/ContentProviderRecord;->addExternalProcessHandleLocked(Landroid/os/IBinder;)V
+PLcom/android/server/am/ContentProviderRecord;->removeExternalProcessHandleInternalLocked(Landroid/os/IBinder;)V
+PLcom/android/server/am/ContentProviderRecord;->removeExternalProcessHandleLocked(Landroid/os/IBinder;)Z
+PLcom/android/server/am/CoreSettingsObserver;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/CoreSettingsObserver;->beginObserveCoreSettings()V
+PLcom/android/server/am/CoreSettingsObserver;->getCoreSettingsLocked()Landroid/os/Bundle;
+PLcom/android/server/am/CoreSettingsObserver;->populateSettings(Landroid/os/Bundle;Ljava/util/Map;)V
+PLcom/android/server/am/CoreSettingsObserver;->sendCoreSettings()V
+PLcom/android/server/am/DumpHeapProvider;-><init>()V
+PLcom/android/server/am/DumpHeapProvider;->onCreate()Z
+PLcom/android/server/am/EventLogTags;->writeAmFocusedStack(IIILjava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmMemFactor(II)V
+PLcom/android/server/am/EventLogTags;->writeAmMeminfo(JJJJJ)V
+PLcom/android/server/am/EventLogTags;->writeAmPauseActivity(IILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmPreBoot(ILjava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmSetResumedActivity(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmStopActivity(IILjava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmStopIdleService(ILjava/lang/String;)V
+PLcom/android/server/am/EventLogTags;->writeAmUidActive(I)V
+PLcom/android/server/am/EventLogTags;->writeAmUidIdle(I)V
+PLcom/android/server/am/EventLogTags;->writeAmUserStateChanged(II)V
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper$1;-><init>(Lcom/android/server/am/GlobalSettingsToPropertiesMapper;Landroid/os/Handler;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper$1;->onChange(Z)V
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper;-><init>(Landroid/content/ContentResolver;[[Ljava/lang/String;)V
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper;->getGlobalSetting(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper;->setProperty(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper;->systemPropertiesGet(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper;->systemPropertiesSet(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper;->updatePropertiesFromGlobalSettings()V
+PLcom/android/server/am/GlobalSettingsToPropertiesMapper;->updatePropertyFromSetting(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/am/HealthStatsBatteryStatsWriter;-><init>()V
+PLcom/android/server/am/HealthStatsBatteryStatsWriter;->addTimer(Landroid/os/health/HealthStatsWriter;ILandroid/os/BatteryStats$Timer;)V
+PLcom/android/server/am/HealthStatsBatteryStatsWriter;->addTimers(Landroid/os/health/HealthStatsWriter;ILjava/lang/String;Landroid/os/BatteryStats$Timer;)V
+PLcom/android/server/am/HealthStatsBatteryStatsWriter;->writePid(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Pid;)V
+PLcom/android/server/am/HealthStatsBatteryStatsWriter;->writePkg(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Pkg;)V
+PLcom/android/server/am/HealthStatsBatteryStatsWriter;->writeProc(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Proc;)V
+PLcom/android/server/am/HealthStatsBatteryStatsWriter;->writeServ(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats$Uid$Pkg$Serv;)V
+PLcom/android/server/am/HealthStatsBatteryStatsWriter;->writeUid(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats;Landroid/os/BatteryStats$Uid;)V
+PLcom/android/server/am/KeyguardController;->canShowActivityWhileKeyguardShowing(Lcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/KeyguardController;->convertTransitFlags(I)I
+PLcom/android/server/am/KeyguardController;->dismissDockedStackIfNeeded()V
+PLcom/android/server/am/KeyguardController;->handleOccludedChanged()V
+PLcom/android/server/am/KeyguardController;->isKeyguardGoingAway()Z
+PLcom/android/server/am/KeyguardController;->isKeyguardShowing(I)Z
+PLcom/android/server/am/KeyguardController;->keyguardGoingAway(I)V
+PLcom/android/server/am/KeyguardController;->setKeyguardGoingAway(Z)V
+PLcom/android/server/am/KeyguardController;->setKeyguardShown(ZZI)V
+PLcom/android/server/am/KeyguardController;->setWindowManager(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/KeyguardController;->updateKeyguardSleepToken()V
+PLcom/android/server/am/LaunchParamsController$LaunchParams;->isEmpty()Z
+PLcom/android/server/am/LaunchParamsController$LaunchParams;->reset()V
+PLcom/android/server/am/LaunchParamsController$LaunchParams;->set(Lcom/android/server/am/LaunchParamsController$LaunchParams;)V
+PLcom/android/server/am/LaunchParamsController;->calculate(Lcom/android/server/am/TaskRecord;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/LaunchParamsController$LaunchParams;)V
+PLcom/android/server/am/LaunchParamsController;->layoutTask(Lcom/android/server/am/TaskRecord;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;)Z
+PLcom/android/server/am/LaunchTimeTracker$Entry;-><init>()V
+PLcom/android/server/am/LaunchTimeTracker$Entry;->access$000(Lcom/android/server/am/LaunchTimeTracker$Entry;)V
+PLcom/android/server/am/LaunchTimeTracker$Entry;->setLaunchTime(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/LaunchTimeTracker$Entry;->startLaunchTraces(Ljava/lang/String;)V
+PLcom/android/server/am/LaunchTimeTracker$Entry;->stopFullyDrawnTraceIfNeeded()V
+PLcom/android/server/am/LaunchTimeTracker;->getEntry(I)Lcom/android/server/am/LaunchTimeTracker$Entry;
+PLcom/android/server/am/LaunchTimeTracker;->setLaunchTime(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/LaunchTimeTracker;->stopFullyDrawnTraceIfNeeded(I)V
+PLcom/android/server/am/LockTaskController;->activityBlockedFromFinish(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/LockTaskController;->canMoveTaskToBack(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/LockTaskController;->clearLockedTask(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/LockTaskController;->getLockTaskFeaturesForUser(I)I
+PLcom/android/server/am/LockTaskController;->getLockTaskModeState()I
+PLcom/android/server/am/LockTaskController;->getRootTask()Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/LockTaskController;->isKeyguardAllowed(I)Z
+PLcom/android/server/am/LockTaskController;->isLockTaskModeViolation(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/LockTaskController;->isLockTaskModeViolation(Lcom/android/server/am/TaskRecord;Z)Z
+PLcom/android/server/am/LockTaskController;->isLockTaskModeViolationInternal(Lcom/android/server/am/TaskRecord;Z)Z
+PLcom/android/server/am/LockTaskController;->isPackageWhitelisted(ILjava/lang/String;)Z
+PLcom/android/server/am/LockTaskController;->isRootTask(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/LockTaskController;->isTaskLocked(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/LockTaskController;->isTaskWhitelisted(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/LockTaskController;->setWindowManager(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/LockTaskController;->updateLockTaskFeatures(II)V
+PLcom/android/server/am/LockTaskController;->updateLockTaskPackages(I[Ljava/lang/String;)V
+PLcom/android/server/am/MemoryStatUtil$MemoryStat;-><init>()V
+PLcom/android/server/am/MemoryStatUtil;->hasMemcg()Z
+PLcom/android/server/am/MemoryStatUtil;->parseMemoryStatFromProcfs(Ljava/lang/String;)Lcom/android/server/am/MemoryStatUtil$MemoryStat;
+PLcom/android/server/am/MemoryStatUtil;->readFileContents(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/am/MemoryStatUtil;->readMemoryStatFromFilesystem(II)Lcom/android/server/am/MemoryStatUtil$MemoryStat;
+PLcom/android/server/am/MemoryStatUtil;->readMemoryStatFromProcfs(I)Lcom/android/server/am/MemoryStatUtil$MemoryStat;
+PLcom/android/server/am/NativeCrashListener;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+PLcom/android/server/am/NativeCrashListener;->run()V
+PLcom/android/server/am/PendingIntentRecord;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/PendingIntentRecord$Key;I)V
+PLcom/android/server/am/PendingIntentRecord;->completeFinalize()V
+PLcom/android/server/am/PendingIntentRecord;->detachCancelListenersLocked()Landroid/os/RemoteCallbackList;
+PLcom/android/server/am/PendingIntentRecord;->finalize()V
+PLcom/android/server/am/PendingIntentRecord;->registerCancelListenerLocked(Lcom/android/internal/os/IResultReceiver;)V
+PLcom/android/server/am/PendingIntentRecord;->sendWithResult(ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I
+PLcom/android/server/am/PendingIntentRecord;->unregisterCancelListenerLocked(Lcom/android/internal/os/IResultReceiver;)V
+PLcom/android/server/am/PendingRemoteAnimationRegistry$Entry;-><init>(Lcom/android/server/am/PendingRemoteAnimationRegistry;Ljava/lang/String;Landroid/view/RemoteAnimationAdapter;)V
+PLcom/android/server/am/PendingRemoteAnimationRegistry$Entry;->lambda$new$0(Lcom/android/server/am/PendingRemoteAnimationRegistry$Entry;Ljava/lang/String;)V
+PLcom/android/server/am/PendingRemoteAnimationRegistry;->access$000(Lcom/android/server/am/PendingRemoteAnimationRegistry;)Landroid/os/Handler;
+PLcom/android/server/am/PendingRemoteAnimationRegistry;->access$100(Lcom/android/server/am/PendingRemoteAnimationRegistry;)Lcom/android/server/am/ActivityManagerService;
+PLcom/android/server/am/PendingRemoteAnimationRegistry;->access$200(Lcom/android/server/am/PendingRemoteAnimationRegistry;)Landroid/util/ArrayMap;
+PLcom/android/server/am/PendingRemoteAnimationRegistry;->addPendingAnimation(Ljava/lang/String;Landroid/view/RemoteAnimationAdapter;)V
+PLcom/android/server/am/PendingRemoteAnimationRegistry;->overrideOptionsIfNeeded(Ljava/lang/String;Landroid/app/ActivityOptions;)Landroid/app/ActivityOptions;
+PLcom/android/server/am/PreBootBroadcaster$1;-><init>(Lcom/android/server/am/PreBootBroadcaster;Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
+PLcom/android/server/am/PreBootBroadcaster$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/PreBootBroadcaster;-><init>(Lcom/android/server/am/ActivityManagerService;ILcom/android/internal/util/ProgressReporter;Z)V
+PLcom/android/server/am/PreBootBroadcaster;->access$000(Lcom/android/server/am/PreBootBroadcaster;)Lcom/android/server/am/ActivityManagerService;
+PLcom/android/server/am/PreBootBroadcaster;->access$100(Lcom/android/server/am/PreBootBroadcaster;)I
+PLcom/android/server/am/PreBootBroadcaster;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+PLcom/android/server/am/PreBootBroadcaster;->sendNext()V
+PLcom/android/server/am/ProcessList$ProcStateMemTracker;-><init>()V
+PLcom/android/server/am/ProcessList;->abortNextPssTime(Lcom/android/server/am/ProcessList$ProcStateMemTracker;)V
+PLcom/android/server/am/ProcessList;->applyDisplaySize(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/am/ProcessList;->buildOomTag(Ljava/lang/String;Ljava/lang/String;II)Ljava/lang/String;
+PLcom/android/server/am/ProcessList;->commitNextPssTime(Lcom/android/server/am/ProcessList$ProcStateMemTracker;)V
+PLcom/android/server/am/ProcessList;->getCachedRestoreThresholdKb()J
+PLcom/android/server/am/ProcessList;->makeOomAdjString(I)Ljava/lang/String;
+PLcom/android/server/am/ProcessList;->makeProcStateString(I)Ljava/lang/String;
+PLcom/android/server/am/ProcessList;->minTimeFromStateChange(Z)J
+PLcom/android/server/am/ProcessList;->openLmkdSocket()Z
+PLcom/android/server/am/ProcessList;->remove(I)V
+PLcom/android/server/am/ProcessRecord;->clearRecentTasks()V
+PLcom/android/server/am/ProcessRecord;->makeActive(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessStatsService;)V
+PLcom/android/server/am/ProcessRecord;->setPid(I)V
+PLcom/android/server/am/ProcessRecord;->setStartParams(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V
+PLcom/android/server/am/ProcessRecord;->toShortString()Ljava/lang/String;
+PLcom/android/server/am/ProcessRecord;->toShortString(Ljava/lang/StringBuilder;)V
+PLcom/android/server/am/ProcessRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/ProcessStatsService$1;->run()V
+PLcom/android/server/am/ProcessStatsService$2;-><init>(Lcom/android/server/am/ProcessStatsService;J)V
+PLcom/android/server/am/ProcessStatsService$2;->run()V
+PLcom/android/server/am/ProcessStatsService$3;-><init>(Lcom/android/server/am/ProcessStatsService;Ljava/lang/String;[Landroid/os/ParcelFileDescriptor;[B)V
+PLcom/android/server/am/ProcessStatsService$3;->run()V
+PLcom/android/server/am/ProcessStatsService;->addSysMemUsageLocked(JJJJJ)V
+PLcom/android/server/am/ProcessStatsService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/am/ProcessStatsService;->dumpInner(Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/am/ProcessStatsService;->getCommittedFiles(IZZ)Ljava/util/ArrayList;
+PLcom/android/server/am/ProcessStatsService;->getProcessStateLocked(Ljava/lang/String;IJLjava/lang/String;)Lcom/android/internal/app/procstats/ProcessState;
+PLcom/android/server/am/ProcessStatsService;->getStatsOverTime(J)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/am/ProcessStatsService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/am/ProcessStatsService;->performWriteState(J)V
+PLcom/android/server/am/ProcessStatsService;->readLocked(Lcom/android/internal/app/procstats/ProcessStats;Landroid/util/AtomicFile;)Z
+PLcom/android/server/am/ProcessStatsService;->trimHistoricStatesWriteLocked()V
+PLcom/android/server/am/ProcessStatsService;->writeStateAsyncLocked()V
+PLcom/android/server/am/ProcessStatsService;->writeStateLocked(Z)V
+PLcom/android/server/am/ProcessStatsService;->writeStateLocked(ZZ)V
+PLcom/android/server/am/ProviderMap;->collectPackageProvidersLocked(Ljava/lang/String;Ljava/util/Set;ZZILjava/util/ArrayList;)Z
+PLcom/android/server/am/ProviderMap;->getProviderByClass(Landroid/content/ComponentName;I)Lcom/android/server/am/ContentProviderRecord;
+PLcom/android/server/am/ProviderMap;->putProviderByClass(Landroid/content/ComponentName;Lcom/android/server/am/ContentProviderRecord;)V
+PLcom/android/server/am/ProviderMap;->putProviderByName(Ljava/lang/String;Lcom/android/server/am/ContentProviderRecord;)V
+PLcom/android/server/am/ProviderMap;->removeProviderByClass(Landroid/content/ComponentName;I)V
+PLcom/android/server/am/ProviderMap;->removeProviderByName(Ljava/lang/String;I)V
+PLcom/android/server/am/ReceiverList;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;IIILandroid/content/IIntentReceiver;)V
+PLcom/android/server/am/ReceiverList;->containsFilter(Landroid/content/IntentFilter;)Z
+PLcom/android/server/am/ReceiverList;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/am/ReceiverList;->hashCode()I
+PLcom/android/server/am/ReceiverList;->toString()Ljava/lang/String;
+PLcom/android/server/am/RecentTasks;->add(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/RecentTasks;->cleanupDisabledPackageTasksLocked(Ljava/lang/String;Ljava/util/Set;I)V
+PLcom/android/server/am/RecentTasks;->cleanupLocked(I)V
+PLcom/android/server/am/RecentTasks;->containsTaskId(II)Z
+PLcom/android/server/am/RecentTasks;->createRecentTaskInfo(Lcom/android/server/am/TaskRecord;)Landroid/app/ActivityManager$RecentTaskInfo;
+PLcom/android/server/am/RecentTasks;->findRemoveIndexForAddTask(Lcom/android/server/am/TaskRecord;)I
+PLcom/android/server/am/RecentTasks;->getAppTasksList(ILjava/lang/String;)Ljava/util/ArrayList;
+PLcom/android/server/am/RecentTasks;->getPersistableTaskIds(Landroid/util/ArraySet;)V
+PLcom/android/server/am/RecentTasks;->getRecentTasks(IIZZII)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/am/RecentTasks;->getTask(I)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/RecentTasks;->getTaskDescriptionIcon(Ljava/lang/String;)Landroid/graphics/Bitmap;
+PLcom/android/server/am/RecentTasks;->getTaskIdsForUser(I)Landroid/util/SparseBooleanArray;
+PLcom/android/server/am/RecentTasks;->hasCompatibleActivityTypeAndWindowingMode(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/RecentTasks;->isActiveRecentTask(Lcom/android/server/am/TaskRecord;Landroid/util/SparseBooleanArray;)Z
+PLcom/android/server/am/RecentTasks;->isInVisibleRange(Lcom/android/server/am/TaskRecord;I)Z
+PLcom/android/server/am/RecentTasks;->isRecentsComponent(Landroid/content/ComponentName;I)Z
+PLcom/android/server/am/RecentTasks;->isTrimmable(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/RecentTasks;->isVisibleRecentTask(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/RecentTasks;->loadPersistedTaskIdsForUserLocked(I)V
+PLcom/android/server/am/RecentTasks;->loadRecentsComponent(Landroid/content/res/Resources;)V
+PLcom/android/server/am/RecentTasks;->loadUserRecentsLocked(I)V
+PLcom/android/server/am/RecentTasks;->notifyTaskAdded(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/RecentTasks;->notifyTaskPersisterLocked(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/RecentTasks;->notifyTaskRemoved(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/RecentTasks;->onSystemReadyLocked()V
+PLcom/android/server/am/RecentTasks;->processNextAffiliateChainLocked(I)I
+PLcom/android/server/am/RecentTasks;->remove(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/RecentTasks;->removeForAddTask(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/RecentTasks;->saveImage(Landroid/graphics/Bitmap;Ljava/lang/String;)V
+PLcom/android/server/am/RecentTasks;->shouldPersistTaskLocked(Lcom/android/server/am/TaskRecord;)Z
+PLcom/android/server/am/RecentTasks;->syncPersistentTaskIdsLocked()V
+PLcom/android/server/am/RecentTasks;->trimInactiveRecentTasks()V
+PLcom/android/server/am/RecentTasks;->usersWithRecentsLoadedLocked()[I
+PLcom/android/server/am/RunningTasks;->createRunningTaskInfo(Lcom/android/server/am/TaskRecord;)Landroid/app/ActivityManager$RunningTaskInfo;
+PLcom/android/server/am/SafeActivityOptions;-><init>(Landroid/app/ActivityOptions;)V
+PLcom/android/server/am/SafeActivityOptions;->abort()V
+PLcom/android/server/am/SafeActivityOptions;->abort(Lcom/android/server/am/SafeActivityOptions;)V
+PLcom/android/server/am/SafeActivityOptions;->checkPermissions(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActivityStackSupervisor;Landroid/app/ActivityOptions;II)V
+PLcom/android/server/am/SafeActivityOptions;->getOptions(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActivityStackSupervisor;)Landroid/app/ActivityOptions;
+PLcom/android/server/am/SafeActivityOptions;->getOptions(Lcom/android/server/am/ActivityStackSupervisor;)Landroid/app/ActivityOptions;
+PLcom/android/server/am/SafeActivityOptions;->mergeActivityOptions(Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;)Landroid/app/ActivityOptions;
+PLcom/android/server/am/SafeActivityOptions;->popAppVerificationBundle()Landroid/os/Bundle;
+PLcom/android/server/am/SafeActivityOptions;->setCallingPidForRemoteAnimationAdapter(Landroid/app/ActivityOptions;I)V
+PLcom/android/server/am/ServiceRecord;->forceClearTracker()V
+PLcom/android/server/am/ServiceRecord;->getComponentName()Landroid/content/ComponentName;
+PLcom/android/server/am/ServiceRecord;->makeRestarting(IJ)V
+PLcom/android/server/am/ServiceRecord;->stripForegroundServiceFlagFromNotification()V
+PLcom/android/server/am/ServiceRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/ServiceRecord;->updateWhitelistManager()V
+PLcom/android/server/am/TaskChangeNotificationController$MainHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->access$000(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/ActivityManagerService;
+PLcom/android/server/am/TaskChangeNotificationController;->access$100(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/ActivityStackSupervisor;
+PLcom/android/server/am/TaskChangeNotificationController;->access$1900(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->access$200(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->access$300(Lcom/android/server/am/TaskChangeNotificationController;Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->access$400(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->access$500(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->access$600(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->access$700(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->access$800(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->access$900(Lcom/android/server/am/TaskChangeNotificationController;)Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;
+PLcom/android/server/am/TaskChangeNotificationController;->forAllLocalListeners(Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->forAllRemoteListeners(Lcom/android/server/am/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$new$0(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$new$1(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$new$16(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$new$2(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$new$3(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$new$4(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$new$5(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->lambda$new$6(Landroid/app/ITaskStackListener;Landroid/os/Message;)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyActivityRequestedOrientationChanged(II)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskCreated(ILandroid/content/ComponentName;)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskDescriptionChanged(ILandroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskMovedToFront(I)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskRemovalStarted(I)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskRemoved(I)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskSnapshotChanged(ILandroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/am/TaskChangeNotificationController;->notifyTaskStackChanged()V
+PLcom/android/server/am/TaskChangeNotificationController;->registerTaskStackListener(Landroid/app/ITaskStackListener;)V
+PLcom/android/server/am/TaskChangeNotificationController;->unregisterTaskStackListener(Landroid/app/ITaskStackListener;)V
+PLcom/android/server/am/TaskLaunchParamsModifier;->onCalculate(Lcom/android/server/am/TaskRecord;Landroid/content/pm/ActivityInfo$WindowLayout;Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityRecord;Landroid/app/ActivityOptions;Lcom/android/server/am/LaunchParamsController$LaunchParams;Lcom/android/server/am/LaunchParamsController$LaunchParams;)I
+PLcom/android/server/am/TaskPersister$1;-><init>(Lcom/android/server/am/TaskPersister;)V
+PLcom/android/server/am/TaskPersister$1;->compare(Lcom/android/server/am/TaskRecord;Lcom/android/server/am/TaskRecord;)I
+PLcom/android/server/am/TaskPersister$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/am/TaskPersister$ImageWriteQueueItem;-><init>(Ljava/lang/String;Landroid/graphics/Bitmap;)V
+PLcom/android/server/am/TaskPersister$LazyTaskWriterThread;->run()V
+PLcom/android/server/am/TaskPersister$TaskWriteQueueItem;-><init>(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/TaskPersister$WriteQueueItem;-><init>()V
+PLcom/android/server/am/TaskPersister$WriteQueueItem;-><init>(Lcom/android/server/am/TaskPersister$1;)V
+PLcom/android/server/am/TaskPersister;->access$100(Lcom/android/server/am/TaskPersister;)Lcom/android/server/am/ActivityManagerService;
+PLcom/android/server/am/TaskPersister;->access$200(Lcom/android/server/am/TaskPersister;)Lcom/android/server/am/RecentTasks;
+PLcom/android/server/am/TaskPersister;->access$300(Lcom/android/server/am/TaskPersister;Landroid/util/ArraySet;)V
+PLcom/android/server/am/TaskPersister;->access$400(Lcom/android/server/am/TaskPersister;)V
+PLcom/android/server/am/TaskPersister;->access$500(Lcom/android/server/am/TaskPersister;)J
+PLcom/android/server/am/TaskPersister;->access$502(Lcom/android/server/am/TaskPersister;J)J
+PLcom/android/server/am/TaskPersister;->access$600(Ljava/lang/String;)Z
+PLcom/android/server/am/TaskPersister;->access$700(Lcom/android/server/am/TaskPersister;Lcom/android/server/am/TaskRecord;)Ljava/io/StringWriter;
+PLcom/android/server/am/TaskPersister;->createParentDirectory(Ljava/lang/String;)Z
+PLcom/android/server/am/TaskPersister;->getImageFromWriteQueue(Ljava/lang/String;)Landroid/graphics/Bitmap;
+PLcom/android/server/am/TaskPersister;->getTaskDescriptionIcon(Ljava/lang/String;)Landroid/graphics/Bitmap;
+PLcom/android/server/am/TaskPersister;->getUserImagesDir(I)Ljava/io/File;
+PLcom/android/server/am/TaskPersister;->getUserPersistedTaskIdsFile(I)Ljava/io/File;
+PLcom/android/server/am/TaskPersister;->getUserTasksDir(I)Ljava/io/File;
+PLcom/android/server/am/TaskPersister;->loadPersistedTaskIdsForUser(I)Landroid/util/SparseBooleanArray;
+PLcom/android/server/am/TaskPersister;->removeObsoleteFiles(Landroid/util/ArraySet;)V
+PLcom/android/server/am/TaskPersister;->removeObsoleteFiles(Landroid/util/ArraySet;[Ljava/io/File;)V
+PLcom/android/server/am/TaskPersister;->removeThumbnails(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/TaskPersister;->restoreImage(Ljava/lang/String;)Landroid/graphics/Bitmap;
+PLcom/android/server/am/TaskPersister;->restoreTasksForUserLocked(ILandroid/util/SparseBooleanArray;)Ljava/util/List;
+PLcom/android/server/am/TaskPersister;->saveImage(Landroid/graphics/Bitmap;Ljava/lang/String;)V
+PLcom/android/server/am/TaskPersister;->saveToXml(Lcom/android/server/am/TaskRecord;)Ljava/io/StringWriter;
+PLcom/android/server/am/TaskPersister;->startPersisting()V
+PLcom/android/server/am/TaskPersister;->taskIdToTask(ILjava/util/ArrayList;)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/TaskPersister;->wakeup(Lcom/android/server/am/TaskRecord;Z)V
+PLcom/android/server/am/TaskPersister;->writePersistedTaskIdsForUser(Landroid/util/SparseBooleanArray;I)V
+PLcom/android/server/am/TaskPersister;->writeTaskIdsFiles()V
+PLcom/android/server/am/TaskPersister;->yieldIfQueueTooDeep()V
+PLcom/android/server/am/TaskRecord$TaskActivitiesReport;->reset()V
+PLcom/android/server/am/TaskRecord$TaskRecordFactory;-><init>()V
+PLcom/android/server/am/TaskRecord$TaskRecordFactory;->create(Lcom/android/server/am/ActivityManagerService;ILandroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZIILjava/lang/String;Ljava/util/ArrayList;JZLandroid/app/ActivityManager$TaskDescription;IIIIILjava/lang/String;IZZZII)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/TaskRecord$TaskRecordFactory;->create(Lcom/android/server/am/ActivityManagerService;ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/TaskRecord$TaskRecordFactory;->restoreFromXml(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/am/ActivityStackSupervisor;)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/TaskRecord;-><init>(Lcom/android/server/am/ActivityManagerService;ILandroid/content/Intent;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZZIILjava/lang/String;Ljava/util/ArrayList;JZLandroid/app/ActivityManager$TaskDescription;IIIIILjava/lang/String;IZZZII)V
+PLcom/android/server/am/TaskRecord;-><init>(Lcom/android/server/am/ActivityManagerService;ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)V
+PLcom/android/server/am/TaskRecord;->addActivityAtIndex(ILcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/TaskRecord;->addActivityToTop(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/TaskRecord;->addStartingWindowsForVisibleActivities(Z)V
+PLcom/android/server/am/TaskRecord;->autoRemoveFromRecents()Z
+PLcom/android/server/am/TaskRecord;->clearAllPendingOptions()V
+PLcom/android/server/am/TaskRecord;->clearRootProcess()V
+PLcom/android/server/am/TaskRecord;->closeRecentsChain()V
+PLcom/android/server/am/TaskRecord;->create(Lcom/android/server/am/ActivityManagerService;ILandroid/content/pm/ActivityInfo;Landroid/content/Intent;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/TaskRecord;->createWindowContainer(ZZ)V
+PLcom/android/server/am/TaskRecord;->findEffectiveRootIndex()I
+PLcom/android/server/am/TaskRecord;->getAllRunningVisibleActivitiesLocked(Ljava/util/ArrayList;)V
+PLcom/android/server/am/TaskRecord;->getBaseIntent()Landroid/content/Intent;
+PLcom/android/server/am/TaskRecord;->getChildAt(I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->getChildAt(I)Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/am/TaskRecord;->getChildCount()I
+PLcom/android/server/am/TaskRecord;->getLaunchBounds()Landroid/graphics/Rect;
+PLcom/android/server/am/TaskRecord;->getParent()Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/am/TaskRecord;->getRootActivity()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->getSnapshot(Z)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/am/TaskRecord;->getStackId()I
+PLcom/android/server/am/TaskRecord;->getTaskRecordFactory()Lcom/android/server/am/TaskRecord$TaskRecordFactory;
+PLcom/android/server/am/TaskRecord;->getWindowContainerBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/am/TaskRecord;->getWindowContainerController()Lcom/android/server/wm/TaskWindowContainerController;
+PLcom/android/server/am/TaskRecord;->isClearingToReuseTask()Z
+PLcom/android/server/am/TaskRecord;->isResizeable()Z
+PLcom/android/server/am/TaskRecord;->isResizeable(Z)Z
+PLcom/android/server/am/TaskRecord;->isSameIntentFilter(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/TaskRecord;->isVisible()Z
+PLcom/android/server/am/TaskRecord;->okToShowLocked()Z
+PLcom/android/server/am/TaskRecord;->onActivityStateChanged(Lcom/android/server/am/ActivityRecord;Lcom/android/server/am/ActivityStack$ActivityState;Ljava/lang/String;)V
+PLcom/android/server/am/TaskRecord;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/am/TaskRecord;->onParentChanged()V
+PLcom/android/server/am/TaskRecord;->onSnapshotChanged(Landroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/am/TaskRecord;->onlyHasTaskOverlayActivities(Z)Z
+PLcom/android/server/am/TaskRecord;->performClearTaskAtIndexLocked(IZLjava/lang/String;)V
+PLcom/android/server/am/TaskRecord;->performClearTaskForReuseLocked(Lcom/android/server/am/ActivityRecord;I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->performClearTaskLocked()V
+PLcom/android/server/am/TaskRecord;->performClearTaskLocked(Lcom/android/server/am/ActivityRecord;I)Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->removeActivity(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/TaskRecord;->removeActivity(Lcom/android/server/am/ActivityRecord;Z)Z
+PLcom/android/server/am/TaskRecord;->removeTaskActivitiesLocked(ZLjava/lang/String;)V
+PLcom/android/server/am/TaskRecord;->removeWindowContainer()V
+PLcom/android/server/am/TaskRecord;->removedFromRecents()V
+PLcom/android/server/am/TaskRecord;->restoreFromXml(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/am/ActivityStackSupervisor;)Lcom/android/server/am/TaskRecord;
+PLcom/android/server/am/TaskRecord;->returnsToHomeStack()Z
+PLcom/android/server/am/TaskRecord;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/am/TaskRecord;->setFrontOfTask()V
+PLcom/android/server/am/TaskRecord;->setIntent(Landroid/content/Intent;Landroid/content/pm/ActivityInfo;)V
+PLcom/android/server/am/TaskRecord;->setIntent(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/TaskRecord;->setLockTaskAuth()V
+PLcom/android/server/am/TaskRecord;->setLockTaskAuth(Lcom/android/server/am/ActivityRecord;)V
+PLcom/android/server/am/TaskRecord;->setMinDimensions(Landroid/content/pm/ActivityInfo;)V
+PLcom/android/server/am/TaskRecord;->setNextAffiliate(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/TaskRecord;->setPrevAffiliate(Lcom/android/server/am/TaskRecord;)V
+PLcom/android/server/am/TaskRecord;->setRootProcess(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/TaskRecord;->setStack(Lcom/android/server/am/ActivityStack;)V
+PLcom/android/server/am/TaskRecord;->setTaskRecordFactory(Lcom/android/server/am/TaskRecord$TaskRecordFactory;)V
+PLcom/android/server/am/TaskRecord;->setWindowContainerController(Lcom/android/server/wm/TaskWindowContainerController;)V
+PLcom/android/server/am/TaskRecord;->supportsSplitScreenWindowingMode()Z
+PLcom/android/server/am/TaskRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/TaskRecord;->topRunningActivityWithStartingWindowLocked()Lcom/android/server/am/ActivityRecord;
+PLcom/android/server/am/TaskRecord;->touchActiveTime()V
+PLcom/android/server/am/TaskRecord;->updateEffectiveIntent()V
+PLcom/android/server/am/TaskRecord;->updateOverrideConfiguration(Landroid/graphics/Rect;)Z
+PLcom/android/server/am/TaskRecord;->updateOverrideConfiguration(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
+PLcom/android/server/am/TaskRecord;->updateOverrideConfigurationFromLaunchBounds()Landroid/graphics/Rect;
+PLcom/android/server/am/TaskRecord;->updateTaskDescription()V
+PLcom/android/server/am/UidRecord$ChangeItem;-><init>()V
+PLcom/android/server/am/UidRecord;-><init>(I)V
+PLcom/android/server/am/UidRecord;->toString()Ljava/lang/String;
+PLcom/android/server/am/UidRecord;->updateHasInternetPermission()V
+PLcom/android/server/am/UriPermission;-><init>(Ljava/lang/String;Ljava/lang/String;ILcom/android/server/am/ActivityManagerService$GrantUri;)V
+PLcom/android/server/am/UriPermission;->getStrength(I)I
+PLcom/android/server/am/UriPermission;->grantModes(ILcom/android/server/am/UriPermissionOwner;)V
+PLcom/android/server/am/UriPermission;->revokeModes(IZ)Z
+PLcom/android/server/am/UriPermission;->updateModeFlags()V
+PLcom/android/server/am/UriPermissionOwner$ExternalToken;-><init>(Lcom/android/server/am/UriPermissionOwner;)V
+PLcom/android/server/am/UriPermissionOwner$ExternalToken;->getOwner()Lcom/android/server/am/UriPermissionOwner;
+PLcom/android/server/am/UriPermissionOwner;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/Object;)V
+PLcom/android/server/am/UriPermissionOwner;->fromExternalToken(Landroid/os/IBinder;)Lcom/android/server/am/UriPermissionOwner;
+PLcom/android/server/am/UriPermissionOwner;->getExternalTokenLocked()Landroid/os/Binder;
+PLcom/android/server/am/UriPermissionOwner;->removeUriPermissionLocked(Lcom/android/server/am/ActivityManagerService$GrantUri;I)V
+PLcom/android/server/am/UriPermissionOwner;->removeUriPermissionsLocked()V
+PLcom/android/server/am/UriPermissionOwner;->removeUriPermissionsLocked(I)V
+PLcom/android/server/am/UserController$2;-><init>(Lcom/android/server/am/UserController;I)V
+PLcom/android/server/am/UserController$2;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZI)V
+PLcom/android/server/am/UserController$Injector$1;-><init>(Lcom/android/server/am/UserController$Injector;Lcom/android/server/am/ActivityManagerService;ILcom/android/internal/util/ProgressReporter;ZLjava/lang/Runnable;)V
+PLcom/android/server/am/UserController$Injector$1;->onFinished()V
+PLcom/android/server/am/UserController$Injector;->broadcastIntent(Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;ILandroid/os/Bundle;ZZIII)I
+PLcom/android/server/am/UserController$Injector;->getSystemServiceManager()Lcom/android/server/SystemServiceManager;
+PLcom/android/server/am/UserController$Injector;->getUserManagerInternal()Landroid/os/UserManagerInternal;
+PLcom/android/server/am/UserController$Injector;->installEncryptionUnawareProviders(I)V
+PLcom/android/server/am/UserController$Injector;->isFirstBootOrUpgrade()Z
+PLcom/android/server/am/UserController$Injector;->isRuntimeRestarted()Z
+PLcom/android/server/am/UserController$Injector;->loadUserRecents(I)V
+PLcom/android/server/am/UserController$Injector;->reportCurWakefulnessUsageEvent()V
+PLcom/android/server/am/UserController$Injector;->sendPreBootBroadcast(IZLjava/lang/Runnable;)V
+PLcom/android/server/am/UserController$Injector;->startPersistentApps(I)V
+PLcom/android/server/am/UserController$UserProgressListener;->onFinished(ILandroid/os/Bundle;)V
+PLcom/android/server/am/UserController$UserProgressListener;->onProgress(IILandroid/os/Bundle;)V
+PLcom/android/server/am/UserController$UserProgressListener;->onStarted(ILandroid/os/Bundle;)V
+PLcom/android/server/am/UserController;->dispatchLockedBootComplete(I)V
+PLcom/android/server/am/UserController;->ensureNotSpecialUser(I)V
+PLcom/android/server/am/UserController;->finishUserBoot(Lcom/android/server/am/UserState;Landroid/content/IIntentReceiver;)V
+PLcom/android/server/am/UserController;->finishUserUnlocked(Lcom/android/server/am/UserState;)V
+PLcom/android/server/am/UserController;->finishUserUnlockedCompleted(Lcom/android/server/am/UserState;)V
+PLcom/android/server/am/UserController;->finishUserUnlocking(Lcom/android/server/am/UserState;)V
+PLcom/android/server/am/UserController;->getCurrentProfileIds()[I
+PLcom/android/server/am/UserController;->getCurrentUserId()I
+PLcom/android/server/am/UserController;->getProfileIds(I)Ljava/util/Set;
+PLcom/android/server/am/UserController;->getStorageManager()Landroid/os/storage/IStorageManager;
+PLcom/android/server/am/UserController;->getUsers()[I
+PLcom/android/server/am/UserController;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/am/UserController;->isSameProfileGroup(II)Z
+PLcom/android/server/am/UserController;->lambda$finishUserUnlocked$1(Lcom/android/server/am/UserController;Lcom/android/server/am/UserState;)V
+PLcom/android/server/am/UserController;->lambda$finishUserUnlocking$0(Lcom/android/server/am/UserController;ILcom/android/server/am/UserState;)V
+PLcom/android/server/am/UserController;->lambda$handleMessage$6(Lcom/android/server/am/UserController;I)V
+PLcom/android/server/am/UserController;->maybeUnlockUser(I)Z
+PLcom/android/server/am/UserController;->onSystemReady()V
+PLcom/android/server/am/UserController;->registerUserSwitchObserver(Landroid/app/IUserSwitchObserver;Ljava/lang/String;)V
+PLcom/android/server/am/UserController;->scheduleStartProfiles()V
+PLcom/android/server/am/UserController;->sendBootCompleted(Landroid/content/IIntentReceiver;)V
+PLcom/android/server/am/UserController;->sendUserSwitchBroadcasts(II)V
+PLcom/android/server/am/UserController;->shouldConfirmCredentials(I)Z
+PLcom/android/server/am/UserController;->startProfiles()V
+PLcom/android/server/am/UserController;->unlockUser(I[B[BLandroid/os/IProgressListener;)Z
+PLcom/android/server/am/UserController;->unlockUserCleared(I[B[BLandroid/os/IProgressListener;)Z
+PLcom/android/server/am/UserController;->updateCurrentProfileIds()V
+PLcom/android/server/am/UserState;->setState(I)V
+PLcom/android/server/am/UserState;->setState(II)Z
+PLcom/android/server/am/UserState;->stateToString(I)Ljava/lang/String;
+PLcom/android/server/am/VrController;->changeVrModeLocked(ZLcom/android/server/am/ProcessRecord;)Z
+PLcom/android/server/am/VrController;->clearVrRenderThreadLocked(Z)V
+PLcom/android/server/am/VrController;->hasPersistentVrFlagSet()Z
+PLcom/android/server/am/VrController;->inVrMode()Z
+PLcom/android/server/am/VrController;->onSystemReady()V
+PLcom/android/server/am/VrController;->onTopProcChangedLocked(Lcom/android/server/am/ProcessRecord;)V
+PLcom/android/server/am/VrController;->onVrModeChanged(Lcom/android/server/am/ActivityRecord;)Z
+PLcom/android/server/am/VrController;->setVrRenderThreadLocked(IIZ)I
+PLcom/android/server/am/VrController;->shouldDisableNonVrUiLocked()Z
+PLcom/android/server/am/VrController;->updateVrRenderThreadLocked(IZ)I
+PLcom/android/server/appwidget/-$$Lambda$AppWidgetService$HIwvoPMyKqEhLVIiysgUKH8QJg8;-><init>(Lcom/android/server/appwidget/AppWidgetService;I)V
+PLcom/android/server/appwidget/-$$Lambda$AppWidgetService$HIwvoPMyKqEhLVIiysgUKH8QJg8;->run()V
+PLcom/android/server/appwidget/AppWidgetService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/appwidget/AppWidgetService;->lambda$onUnlockUser$0(Lcom/android/server/appwidget/AppWidgetService;I)V
+PLcom/android/server/appwidget/AppWidgetService;->onBootPhase(I)V
+PLcom/android/server/appwidget/AppWidgetService;->onStart()V
+PLcom/android/server/appwidget/AppWidgetService;->onUnlockUser(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$1;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$AppWidgetManagerLocal;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$AppWidgetManagerLocal;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl$1;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl$1;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;->getWidgetState(Ljava/lang/String;I)[B
+PLcom/android/server/appwidget/AppWidgetServiceImpl$BackupRestoreController;->packageNeedsWidgetBackupLocked(Ljava/lang/String;I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$CallbackHandler;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;Landroid/os/Looper;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$CallbackHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Host;-><init>()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Host;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl$1;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Host;->getUserId()I
+PLcom/android/server/appwidget/AppWidgetServiceImpl$HostId;-><init>(IILjava/lang/String;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$HostId;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;-><init>()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl$1;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->getUserId()I
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->setMaskedByLockedProfileLocked(Z)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->setMaskedByQuietProfileLocked(Z)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->setMaskedBySuspendedPackageLocked(Z)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$Provider;->shouldBePersisted()Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;-><init>(ILandroid/content/ComponentName;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;-><init>(ILandroid/content/ComponentName;Lcom/android/server/appwidget/AppWidgetServiceImpl$1;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;->hashCode()I
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SaveStateRunnable;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SaveStateRunnable;->run()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;-><init>(Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl$1;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getGroupParent(I)I
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isCallerInstantAppLocked()Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isEnabledGroupProfile(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isInstantAppLocked(Ljava/lang/String;I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isParentOrProfile(II)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isProfileEnabled(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->isProviderInCallerOrInProfileAndWhitelListed(Ljava/lang/String;I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$000()Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$100(Lcom/android/server/appwidget/AppWidgetServiceImpl;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$1800(Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;Lcom/android/internal/appwidget/IAppWidgetHost;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$200(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Ljava/lang/Object;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$2000(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Landroid/os/UserManager;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$2100(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Landroid/content/pm/IPackageManager;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$2200(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Landroid/app/AppOpsManager;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$2700(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$2900(Lcom/android/server/appwidget/AppWidgetServiceImpl;IZ)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$3000(Lcom/android/server/appwidget/AppWidgetServiceImpl;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$3100(Lcom/android/server/appwidget/AppWidgetServiceImpl;)Ljava/util/ArrayList;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->access$400(Lcom/android/server/appwidget/AppWidgetServiceImpl;Landroid/content/Intent;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->addProviderLocked(Landroid/content/pm/ResolveInfo;)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->bindLoadedWidgetsLocked(Ljava/util/List;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->clearProvidersAndHostsTagsLocked()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->cloneIfLocalBinder(Landroid/appwidget/AppWidgetProviderInfo;)Landroid/appwidget/AppWidgetProviderInfo;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->computeMaximumWidgetBitmapMemory()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->ensureGroupStateLoadedLocked(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->ensureGroupStateLoadedLocked(IZ)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getAppWidgetIds(Landroid/content/ComponentName;)[I
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getInstalledProvidersForProfile(IILjava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getSavedStateFile(I)Landroid/util/AtomicFile;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getStateFile(I)Ljava/io/File;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getUidForPackage(Ljava/lang/String;I)I
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getWidgetIds(Ljava/util/ArrayList;)[I
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->getWidgetState(Ljava/lang/String;I)[B
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->handleNotifyProvidersChanged(Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;Lcom/android/internal/appwidget/IAppWidgetHost;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->isLocalBinder()Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->isProfileWithUnlockedParent(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->isUserRunningAndUnlocked(I)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->loadGroupStateLocked([I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->loadGroupWidgetProvidersLocked([I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupHostLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$HostId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupOrAddHostLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$HostId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->onConfigurationChanged()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->onPackageBroadcastReceived(Landroid/content/Intent;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->onStart()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->onUserUnlocked(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->parseAppWidgetProviderInfo(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;Landroid/content/pm/ActivityInfo;Ljava/lang/String;)Landroid/appwidget/AppWidgetProviderInfo;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->parseProviderInfoXml(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;Landroid/content/pm/ResolveInfo;Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->performUpgradeLocked(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->pruneHostLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->queryIntentReceivers(Landroid/content/Intent;I)Ljava/util/List;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->readProfileStateFromFileLocked(Ljava/io/FileInputStream;ILjava/util/List;)I
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->registerBroadcastReceiver()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->registerOnCrossProfileProvidersChangedListener()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->reloadWidgetsMaskedState(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->reloadWidgetsMaskedStateForGroup(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->resolveHostUidLocked(Ljava/lang/String;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->saveGroupStateAsync(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->saveStateLocked(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->scheduleNotifyGroupHostsForProvidersChangedLocked(I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->serializeHost(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->setSafeMode(Z)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->startListening(Lcom/android/internal/appwidget/IAppWidgetHost;Ljava/lang/String;I[I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->stopListening(Ljava/lang/String;I)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->tagProvidersAndHosts()V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->updateAppWidgetProvider(Landroid/content/ComponentName;Landroid/widget/RemoteViews;)V
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->updateProvidersForPackageLocked(Ljava/lang/String;ILjava/util/Set;)Z
+PLcom/android/server/appwidget/AppWidgetServiceImpl;->writeProfileStateToFileLocked(Ljava/io/FileOutputStream;I)Z
+PLcom/android/server/audio/AudioEventLogger$Event;-><init>()V
+PLcom/android/server/audio/AudioEventLogger$Event;->printLog(Ljava/lang/String;)Lcom/android/server/audio/AudioEventLogger$Event;
+PLcom/android/server/audio/AudioEventLogger$StringEvent;-><init>(Ljava/lang/String;)V
+PLcom/android/server/audio/AudioEventLogger$StringEvent;->eventToString()Ljava/lang/String;
+PLcom/android/server/audio/AudioEventLogger;-><init>(ILjava/lang/String;)V
+PLcom/android/server/audio/AudioEventLogger;->log(Lcom/android/server/audio/AudioEventLogger$Event;)V
+PLcom/android/server/audio/AudioService$1;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$1;->onError(I)V
+PLcom/android/server/audio/AudioService$2;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$3;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$3;->onServiceConnected(ILandroid/bluetooth/BluetoothProfile;)V
+PLcom/android/server/audio/AudioService$4;-><init>(Lcom/android/server/audio/AudioService;Landroid/media/IVolumeController;)V
+PLcom/android/server/audio/AudioService$5;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioHandler;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioHandler;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$1;)V
+PLcom/android/server/audio/AudioService$AudioHandler;->getSoundEffectFilePath(I)Ljava/lang/String;
+PLcom/android/server/audio/AudioService$AudioHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/audio/AudioService$AudioHandler;->onLoadSoundEffects()Z
+PLcom/android/server/audio/AudioService$AudioHandler;->onPersistSafeVolumeState(I)V
+PLcom/android/server/audio/AudioService$AudioHandler;->setAllVolumes(Lcom/android/server/audio/AudioService$VolumeStreamState;)V
+PLcom/android/server/audio/AudioService$AudioHandler;->setForceUse(IILjava/lang/String;)V
+PLcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$1;)V
+PLcom/android/server/audio/AudioService$AudioServiceBroadcastReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->getRingerModeInternal()I
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->setAccessibilityServiceUids(Landroid/util/IntArray;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->setRingerModeDelegate(Landroid/media/AudioManagerInternal$RingerModeDelegate;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->setRingerModeInternal(ILjava/lang/String;)V
+PLcom/android/server/audio/AudioService$AudioServiceInternal;->updateRingerModeAffectedStreamsInternal()V
+PLcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$1;)V
+PLcom/android/server/audio/AudioService$AudioServiceUserRestrictionsListener;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/audio/AudioService$AudioSystemThread;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$AudioSystemThread;->run()V
+PLcom/android/server/audio/AudioService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/audio/AudioService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/audio/AudioService$Lifecycle;->onStart()V
+PLcom/android/server/audio/AudioService$MyDisplayStatusCallback;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$MyDisplayStatusCallback;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$1;)V
+PLcom/android/server/audio/AudioService$SettingsObserver;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$SettingsObserver;->onChange(Z)V
+PLcom/android/server/audio/AudioService$SettingsObserver;->updateEncodedSurroundOutput()V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;-><init>(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$1;)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;->onLoadComplete(Landroid/media/SoundPool;II)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;->setSamples([I)V
+PLcom/android/server/audio/AudioService$SoundPoolCallback;->status()I
+PLcom/android/server/audio/AudioService$SoundPoolListenerThread;-><init>(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService$SoundPoolListenerThread;->run()V
+PLcom/android/server/audio/AudioService$VolumeController;-><init>()V
+PLcom/android/server/audio/AudioService$VolumeController;->asBinder()Landroid/os/IBinder;
+PLcom/android/server/audio/AudioService$VolumeController;->binder(Landroid/media/IVolumeController;)Landroid/os/IBinder;
+PLcom/android/server/audio/AudioService$VolumeController;->isSameBinder(Landroid/media/IVolumeController;)Z
+PLcom/android/server/audio/AudioService$VolumeController;->loadSettings(Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService$VolumeController;->postDismiss()V
+PLcom/android/server/audio/AudioService$VolumeController;->setController(Landroid/media/IVolumeController;)V
+PLcom/android/server/audio/AudioService$VolumeController;->setLayoutDirection(I)V
+PLcom/android/server/audio/AudioService$VolumeController;->setVisible(Z)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;-><init>(Lcom/android/server/audio/AudioService;Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;-><init>(Lcom/android/server/audio/AudioService;Ljava/lang/String;ILcom/android/server/audio/AudioService$1;)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->access$500(Lcom/android/server/audio/AudioService$VolumeStreamState;)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->access$700(Lcom/android/server/audio/AudioService$VolumeStreamState;)Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;->access$800(Lcom/android/server/audio/AudioService$VolumeStreamState;)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->applyAllVolumes()V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->applyDeviceVolume_syncVSS(I)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->checkFixedVolumeDevices()V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getIndex(I)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getMaxIndex()I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getMinIndex()I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getSettingNameForDevice(I)Ljava/lang/String;
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getStreamType()I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->getValidIndex(I)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->hasValidSettingsName()Z
+PLcom/android/server/audio/AudioService$VolumeStreamState;->mute(Z)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->observeDevicesForStream_syncVSS(Z)I
+PLcom/android/server/audio/AudioService$VolumeStreamState;->readSettings()V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->setAllIndexes(Lcom/android/server/audio/AudioService$VolumeStreamState;Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService$VolumeStreamState;->setIndex(IILjava/lang/String;)Z
+PLcom/android/server/audio/AudioService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/audio/AudioService;->abandonAudioFocus(Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Landroid/media/AudioAttributes;Ljava/lang/String;)I
+PLcom/android/server/audio/AudioService;->access$000(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$AudioHandler;
+PLcom/android/server/audio/AudioService;->access$002(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$AudioHandler;)Lcom/android/server/audio/AudioService$AudioHandler;
+PLcom/android/server/audio/AudioService;->access$100(Landroid/os/Handler;IIIILjava/lang/Object;I)V
+PLcom/android/server/audio/AudioService;->access$10000(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$10002(Lcom/android/server/audio/AudioService;Z)Z
+PLcom/android/server/audio/AudioService;->access$10100(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/MediaFocusControl;
+PLcom/android/server/audio/AudioService;->access$10200(Lcom/android/server/audio/AudioService;Z)V
+PLcom/android/server/audio/AudioService;->access$11300(Lcom/android/server/audio/AudioService;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
+PLcom/android/server/audio/AudioService;->access$11302(Lcom/android/server/audio/AudioService;Landroid/media/AudioManagerInternal$RingerModeDelegate;)Landroid/media/AudioManagerInternal$RingerModeDelegate;
+PLcom/android/server/audio/AudioService;->access$11600(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->access$11702(Lcom/android/server/audio/AudioService;[I)[I
+PLcom/android/server/audio/AudioService;->access$2100(Lcom/android/server/audio/AudioService;)Landroid/os/Looper;
+PLcom/android/server/audio/AudioService;->access$2102(Lcom/android/server/audio/AudioService;Landroid/os/Looper;)Landroid/os/Looper;
+PLcom/android/server/audio/AudioService;->access$2200(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->access$2300(Lcom/android/server/audio/AudioService;)Landroid/media/SoundPool;
+PLcom/android/server/audio/AudioService;->access$2302(Lcom/android/server/audio/AudioService;Landroid/media/SoundPool;)Landroid/media/SoundPool;
+PLcom/android/server/audio/AudioService;->access$2400(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$SoundPoolCallback;
+PLcom/android/server/audio/AudioService;->access$2402(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$SoundPoolCallback;)Lcom/android/server/audio/AudioService$SoundPoolCallback;
+PLcom/android/server/audio/AudioService;->access$2600(Lcom/android/server/audio/AudioService;)Ljava/util/ArrayList;
+PLcom/android/server/audio/AudioService;->access$2700(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService;->access$2900(Lcom/android/server/audio/AudioService;)I
+PLcom/android/server/audio/AudioService;->access$3200(Lcom/android/server/audio/AudioService;)Landroid/content/ContentResolver;
+PLcom/android/server/audio/AudioService;->access$3300(Lcom/android/server/audio/AudioService;)Landroid/bluetooth/BluetoothHeadset;
+PLcom/android/server/audio/AudioService;->access$3302(Lcom/android/server/audio/AudioService;Landroid/bluetooth/BluetoothHeadset;)Landroid/bluetooth/BluetoothHeadset;
+PLcom/android/server/audio/AudioService;->access$3700(Lcom/android/server/audio/AudioService;)Landroid/util/ArrayMap;
+PLcom/android/server/audio/AudioService;->access$3800(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->access$3900(Lcom/android/server/audio/AudioService;)Landroid/bluetooth/BluetoothA2dp;
+PLcom/android/server/audio/AudioService;->access$3902(Lcom/android/server/audio/AudioService;Landroid/bluetooth/BluetoothA2dp;)Landroid/bluetooth/BluetoothA2dp;
+PLcom/android/server/audio/AudioService;->access$4100(Lcom/android/server/audio/AudioService;Landroid/bluetooth/BluetoothDevice;)V
+PLcom/android/server/audio/AudioService;->access$4200(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->access$4300(Lcom/android/server/audio/AudioService;)Landroid/bluetooth/BluetoothHearingAid;
+PLcom/android/server/audio/AudioService;->access$4302(Lcom/android/server/audio/AudioService;Landroid/bluetooth/BluetoothHearingAid;)Landroid/bluetooth/BluetoothHearingAid;
+PLcom/android/server/audio/AudioService;->access$4400(Lcom/android/server/audio/AudioService;I)V
+PLcom/android/server/audio/AudioService;->access$4500(Lcom/android/server/audio/AudioService;Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService;->access$4600(Lcom/android/server/audio/AudioService;)Ljava/lang/Object;
+PLcom/android/server/audio/AudioService;->access$4700(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$4800(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$5000(Lcom/android/server/audio/AudioService;I)I
+PLcom/android/server/audio/AudioService;->access$5100(Lcom/android/server/audio/AudioService;)[Lcom/android/server/audio/AudioService$VolumeStreamState;
+PLcom/android/server/audio/AudioService;->access$5200(Lcom/android/server/audio/AudioService;III)I
+PLcom/android/server/audio/AudioService;->access$5700(Lcom/android/server/audio/AudioService;)[[I
+PLcom/android/server/audio/AudioService;->access$5800()Ljava/util/List;
+PLcom/android/server/audio/AudioService;->access$5900(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$6000(Lcom/android/server/audio/AudioService;)V
+PLcom/android/server/audio/AudioService;->access$6100(Lcom/android/server/audio/AudioService;)Lcom/android/server/audio/AudioService$SoundPoolListenerThread;
+PLcom/android/server/audio/AudioService;->access$6102(Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService$SoundPoolListenerThread;)Lcom/android/server/audio/AudioService$SoundPoolListenerThread;
+PLcom/android/server/audio/AudioService;->access$6400(Lcom/android/server/audio/AudioService;IILjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->access$7900(Lcom/android/server/audio/AudioService;ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->access$8000(Lcom/android/server/audio/AudioService;I)V
+PLcom/android/server/audio/AudioService;->access$8500(Lcom/android/server/audio/AudioService;)I
+PLcom/android/server/audio/AudioService;->access$8502(Lcom/android/server/audio/AudioService;I)I
+PLcom/android/server/audio/AudioService;->access$8602(Lcom/android/server/audio/AudioService;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/audio/AudioService;->access$8700(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$8800(Lcom/android/server/audio/AudioService;IZ)V
+PLcom/android/server/audio/AudioService;->access$8900(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->access$9000(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->access$9100(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$9102(Lcom/android/server/audio/AudioService;Z)Z
+PLcom/android/server/audio/AudioService;->access$9200(Lcom/android/server/audio/AudioService;Landroid/content/ContentResolver;Z)V
+PLcom/android/server/audio/AudioService;->access$9800(Lcom/android/server/audio/AudioService;)Z
+PLcom/android/server/audio/AudioService;->access$9900(Lcom/android/server/audio/AudioService;Landroid/content/Context;)V
+PLcom/android/server/audio/AudioService;->broadcastMasterMuteStatus(Z)V
+PLcom/android/server/audio/AudioService;->broadcastRingerMode(Ljava/lang/String;I)V
+PLcom/android/server/audio/AudioService;->broadcastScoConnectionState(I)V
+PLcom/android/server/audio/AudioService;->broadcastVibrateSetting(I)V
+PLcom/android/server/audio/AudioService;->checkAllAliasStreamVolumes()V
+PLcom/android/server/audio/AudioService;->checkAllFixedVolumeDevices()V
+PLcom/android/server/audio/AudioService;->checkMuteAffectedStreams()V
+PLcom/android/server/audio/AudioService;->checkScoAudioState()V
+PLcom/android/server/audio/AudioService;->clearAllScoClients(IZ)V
+PLcom/android/server/audio/AudioService;->createAudioSystemThread()V
+PLcom/android/server/audio/AudioService;->createStreamStates()V
+PLcom/android/server/audio/AudioService;->enforceVolumeController(Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService;->ensureValidRingerMode(I)V
+PLcom/android/server/audio/AudioService;->ensureValidStreamType(I)V
+PLcom/android/server/audio/AudioService;->forceFocusDuckingForAccessibility(Landroid/media/AudioAttributes;II)Z
+PLcom/android/server/audio/AudioService;->getBluetoothHeadset()Z
+PLcom/android/server/audio/AudioService;->getCurrentAudioFocus()I
+PLcom/android/server/audio/AudioService;->getCurrentUserId()I
+PLcom/android/server/audio/AudioService;->getDeviceForStream(I)I
+PLcom/android/server/audio/AudioService;->getDevicesForStream(I)I
+PLcom/android/server/audio/AudioService;->getDevicesForStream(IZ)I
+PLcom/android/server/audio/AudioService;->getLastAudibleStreamVolume(I)I
+PLcom/android/server/audio/AudioService;->getMode()I
+PLcom/android/server/audio/AudioService;->getRingerModeExternal()I
+PLcom/android/server/audio/AudioService;->getRingerModeInternal()I
+PLcom/android/server/audio/AudioService;->getRingtonePlayer()Landroid/media/IRingtonePlayer;
+PLcom/android/server/audio/AudioService;->getSafeUsbMediaVolumeIndex()I
+PLcom/android/server/audio/AudioService;->getStreamMaxVolume(I)I
+PLcom/android/server/audio/AudioService;->getStreamMinVolume(I)I
+PLcom/android/server/audio/AudioService;->getStreamVolume(I)I
+PLcom/android/server/audio/AudioService;->getUiSoundsStreamType()I
+PLcom/android/server/audio/AudioService;->getVibrateSetting(I)I
+PLcom/android/server/audio/AudioService;->handleConfigurationChanged(Landroid/content/Context;)V
+PLcom/android/server/audio/AudioService;->initA11yMonitoring()V
+PLcom/android/server/audio/AudioService;->isBluetoothScoOn()Z
+PLcom/android/server/audio/AudioService;->isCameraSoundForced()Z
+PLcom/android/server/audio/AudioService;->isInCommunication()Z
+PLcom/android/server/audio/AudioService;->isPlatformTelevision()Z
+PLcom/android/server/audio/AudioService;->isSpeakerphoneOn()Z
+PLcom/android/server/audio/AudioService;->isStreamAffectedByMute(I)Z
+PLcom/android/server/audio/AudioService;->isStreamAffectedByRingerMode(I)Z
+PLcom/android/server/audio/AudioService;->isStreamMute(I)Z
+PLcom/android/server/audio/AudioService;->isStreamMutedByRingerOrZenMode(I)Z
+PLcom/android/server/audio/AudioService;->isSystem(I)Z
+PLcom/android/server/audio/AudioService;->isValidRingerMode(I)Z
+PLcom/android/server/audio/AudioService;->loadTouchSoundAssetDefaults()V
+PLcom/android/server/audio/AudioService;->loadTouchSoundAssets()V
+PLcom/android/server/audio/AudioService;->muteRingerModeStreams()V
+PLcom/android/server/audio/AudioService;->notifyVolumeControllerVisible(Landroid/media/IVolumeController;Z)V
+PLcom/android/server/audio/AudioService;->observeDevicesForStreams(I)V
+PLcom/android/server/audio/AudioService;->onBroadcastScoConnectionState(I)V
+PLcom/android/server/audio/AudioService;->onConfigureSafeVolume(ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->onIndicateSystemReady()V
+PLcom/android/server/audio/AudioService;->onSystemReady()V
+PLcom/android/server/audio/AudioService;->playSoundEffect(I)V
+PLcom/android/server/audio/AudioService;->playSoundEffectVolume(IF)V
+PLcom/android/server/audio/AudioService;->playerAttributes(ILandroid/media/AudioAttributes;)V
+PLcom/android/server/audio/AudioService;->playerEvent(II)V
+PLcom/android/server/audio/AudioService;->playerHasOpPlayAudio(IZ)V
+PLcom/android/server/audio/AudioService;->readAndSetLowRamDevice()V
+PLcom/android/server/audio/AudioService;->readAudioSettings(Z)V
+PLcom/android/server/audio/AudioService;->readCameraSoundForced()Z
+PLcom/android/server/audio/AudioService;->readDockAudioSettings(Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->readPersistedSettings()V
+PLcom/android/server/audio/AudioService;->readUserRestrictions()V
+PLcom/android/server/audio/AudioService;->registerPlaybackCallback(Landroid/media/IPlaybackConfigDispatcher;)V
+PLcom/android/server/audio/AudioService;->releasePlayer(I)V
+PLcom/android/server/audio/AudioService;->requestAudioFocus(Landroid/media/AudioAttributes;ILandroid/os/IBinder;Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Ljava/lang/String;ILandroid/media/audiopolicy/IAudioPolicyCallback;I)I
+PLcom/android/server/audio/AudioService;->rescaleIndex(III)I
+PLcom/android/server/audio/AudioService;->resetBluetoothSco()V
+PLcom/android/server/audio/AudioService;->sendBroadcastToAll(Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService;->sendEnabledSurroundFormats(Landroid/content/ContentResolver;Z)V
+PLcom/android/server/audio/AudioService;->sendEncodedSurroundMode(ILjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->sendEncodedSurroundMode(Landroid/content/ContentResolver;Ljava/lang/String;)V
+PLcom/android/server/audio/AudioService;->sendMsg(Landroid/os/Handler;IIIILjava/lang/Object;I)V
+PLcom/android/server/audio/AudioService;->sendStickyBroadcastToAll(Landroid/content/Intent;)V
+PLcom/android/server/audio/AudioService;->setBluetoothScoOnInt(ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->setBtScoActiveDevice(Landroid/bluetooth/BluetoothDevice;)V
+PLcom/android/server/audio/AudioService;->setForceUseInt_SyncDevices(IILjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->setRingerMode(ILjava/lang/String;Z)V
+PLcom/android/server/audio/AudioService;->setRingerModeExt(I)V
+PLcom/android/server/audio/AudioService;->setRingerModeInt(IZ)V
+PLcom/android/server/audio/AudioService;->setRingerModeInternal(ILjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->setRingtonePlayer(Landroid/media/IRingtonePlayer;)V
+PLcom/android/server/audio/AudioService;->setSystemAudioMute(Z)V
+PLcom/android/server/audio/AudioService;->setVolumeController(Landroid/media/IVolumeController;)V
+PLcom/android/server/audio/AudioService;->setVolumePolicy(Landroid/media/VolumePolicy;)V
+PLcom/android/server/audio/AudioService;->shouldZenMuteStream(I)Z
+PLcom/android/server/audio/AudioService;->startWatchingRoutes(Landroid/media/IAudioRoutesObserver;)Landroid/media/AudioRoutesInfo;
+PLcom/android/server/audio/AudioService;->systemReady()V
+PLcom/android/server/audio/AudioService;->trackPlayer(Landroid/media/PlayerBase$PlayerIdCard;)I
+PLcom/android/server/audio/AudioService;->updateA11yVolumeAlias(Z)V
+PLcom/android/server/audio/AudioService;->updateDefaultStreamOverrideDelay(Z)V
+PLcom/android/server/audio/AudioService;->updateDefaultVolumes()V
+PLcom/android/server/audio/AudioService;->updateMasterMono(Landroid/content/ContentResolver;)V
+PLcom/android/server/audio/AudioService;->updateRingerAndZenModeAffectedStreams()Z
+PLcom/android/server/audio/AudioService;->updateStreamVolumeAlias(ZLjava/lang/String;)V
+PLcom/android/server/audio/AudioService;->updateZenModeAffectedStreams()Z
+PLcom/android/server/audio/AudioService;->waitForAudioHandlerCreation()V
+PLcom/android/server/audio/AudioServiceEvents$ForceUseEvent;-><init>(IILjava/lang/String;)V
+PLcom/android/server/audio/FocusRequester;-><init>(Landroid/media/AudioAttributes;IILandroid/media/IAudioFocusDispatcher;Landroid/os/IBinder;Ljava/lang/String;Lcom/android/server/audio/MediaFocusControl$AudioFocusDeathHandler;Ljava/lang/String;ILcom/android/server/audio/MediaFocusControl;I)V
+PLcom/android/server/audio/FocusRequester;->finalize()V
+PLcom/android/server/audio/FocusRequester;->focusLossForGainRequest(I)I
+PLcom/android/server/audio/FocusRequester;->getClientUid()I
+PLcom/android/server/audio/FocusRequester;->handleFocusGainFromRequest(I)V
+PLcom/android/server/audio/FocusRequester;->handleFocusLoss(ILcom/android/server/audio/FocusRequester;Z)V
+PLcom/android/server/audio/FocusRequester;->handleFocusLossFromGain(ILcom/android/server/audio/FocusRequester;Z)Z
+PLcom/android/server/audio/FocusRequester;->hasSameClient(Ljava/lang/String;)Z
+PLcom/android/server/audio/FocusRequester;->isLockedFocusOwner()Z
+PLcom/android/server/audio/FocusRequester;->release()V
+PLcom/android/server/audio/FocusRequester;->toAudioFocusInfo()Landroid/media/AudioFocusInfo;
+PLcom/android/server/audio/MediaFocusControl$AudioFocusDeathHandler;-><init>(Lcom/android/server/audio/MediaFocusControl;Landroid/os/IBinder;)V
+PLcom/android/server/audio/MediaFocusControl;-><init>(Landroid/content/Context;Lcom/android/server/audio/PlayerFocusEnforcer;)V
+PLcom/android/server/audio/MediaFocusControl;->abandonAudioFocus(Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Landroid/media/AudioAttributes;Ljava/lang/String;)I
+PLcom/android/server/audio/MediaFocusControl;->canReassignAudioFocus()Z
+PLcom/android/server/audio/MediaFocusControl;->discardAudioFocusOwner()V
+PLcom/android/server/audio/MediaFocusControl;->getCurrentAudioFocus()I
+PLcom/android/server/audio/MediaFocusControl;->getFocusRampTimeMs(ILandroid/media/AudioAttributes;)I
+PLcom/android/server/audio/MediaFocusControl;->isLockedFocusOwner(Lcom/android/server/audio/FocusRequester;)Z
+PLcom/android/server/audio/MediaFocusControl;->mustNotifyFocusOwnerOnDuck()Z
+PLcom/android/server/audio/MediaFocusControl;->notifyExtFocusPolicyFocusRequest_syncAf(Landroid/media/AudioFocusInfo;Landroid/media/IAudioFocusDispatcher;Landroid/os/IBinder;)Z
+PLcom/android/server/audio/MediaFocusControl;->notifyExtPolicyFocusGrant_syncAf(Landroid/media/AudioFocusInfo;I)V
+PLcom/android/server/audio/MediaFocusControl;->notifyExtPolicyFocusLoss_syncAf(Landroid/media/AudioFocusInfo;Z)V
+PLcom/android/server/audio/MediaFocusControl;->notifyTopOfAudioFocusStack()V
+PLcom/android/server/audio/MediaFocusControl;->propagateFocusLossFromGain_syncAf(ILcom/android/server/audio/FocusRequester;Z)V
+PLcom/android/server/audio/MediaFocusControl;->removeFocusStackEntry(Ljava/lang/String;ZZ)V
+PLcom/android/server/audio/MediaFocusControl;->requestAudioFocus(Landroid/media/AudioAttributes;ILandroid/os/IBinder;Landroid/media/IAudioFocusDispatcher;Ljava/lang/String;Ljava/lang/String;IIZ)I
+PLcom/android/server/audio/MediaFocusControl;->unduckPlayers(Lcom/android/server/audio/FocusRequester;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$AudioAttrEvent;-><init>(ILandroid/media/AudioAttributes;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;-><init>()V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;-><init>(Lcom/android/server/audio/PlaybackActivityMonitor$1;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;->checkDuck(Landroid/media/AudioPlaybackConfiguration;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;->removeReleased(Landroid/media/AudioPlaybackConfiguration;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$DuckingManager;->unduckUid(ILjava/util/HashMap;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$NewPlayerEvent;-><init>(Landroid/media/AudioPlaybackConfiguration;)V
+PLcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;-><init>(Landroid/media/IPlaybackConfigDispatcher;Z)V
+PLcom/android/server/audio/PlaybackActivityMonitor$PlayMonitorClient;->init()Z
+PLcom/android/server/audio/PlaybackActivityMonitor$PlayerEvent;-><init>(II)V
+PLcom/android/server/audio/PlaybackActivityMonitor$PlayerOpPlayAudioEvent;-><init>(IZI)V
+PLcom/android/server/audio/PlaybackActivityMonitor;-><init>(Landroid/content/Context;I)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->checkConfigurationCaller(ILandroid/media/AudioPlaybackConfiguration;I)Z
+PLcom/android/server/audio/PlaybackActivityMonitor;->checkVolumeForPrivilegedAlarm(Landroid/media/AudioPlaybackConfiguration;I)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->dispatchPlaybackChange(Z)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->playerAttributes(ILandroid/media/AudioAttributes;I)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->playerDeath(I)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->playerEvent(III)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->playerHasOpPlayAudio(IZI)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->registerPlaybackCallback(Landroid/media/IPlaybackConfigDispatcher;Z)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->releasePlayer(II)V
+PLcom/android/server/audio/PlaybackActivityMonitor;->trackPlayer(Landroid/media/PlayerBase$PlayerIdCard;)I
+PLcom/android/server/audio/PlaybackActivityMonitor;->unduckPlayers(Lcom/android/server/audio/FocusRequester;)V
+PLcom/android/server/audio/RecordingActivityMonitor$RecordingEvent;-><init>(IIIILjava/lang/String;)V
+PLcom/android/server/audio/RecordingActivityMonitor;-><init>(Landroid/content/Context;)V
+PLcom/android/server/audio/RecordingActivityMonitor;->initMonitor()V
+PLcom/android/server/audio/RecordingActivityMonitor;->onRecordingConfigurationChanged(IIII[ILjava/lang/String;)V
+PLcom/android/server/audio/RecordingActivityMonitor;->updateSnapshot(IIII[I)Ljava/util/List;
+PLcom/android/server/audio/RotationHelper$AudioDisplayListener;-><init>()V
+PLcom/android/server/audio/RotationHelper$AudioDisplayListener;->onDisplayChanged(I)V
+PLcom/android/server/audio/RotationHelper;->disable()V
+PLcom/android/server/audio/RotationHelper;->enable()V
+PLcom/android/server/audio/RotationHelper;->init(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/audio/RotationHelper;->publishRotation(I)V
+PLcom/android/server/audio/RotationHelper;->updateOrientation()V
+PLcom/android/server/autofill/-$$Lambda$AutofillManagerService$Yt8ZUfnHlFcXzCNLhvGde5dPRDA;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/-$$Lambda$AutofillManagerService$Yt8ZUfnHlFcXzCNLhvGde5dPRDA;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$KN9CcjjmJTg_PJcamzzLgVvQt9M;-><init>()V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$KN9CcjjmJTg_PJcamzzLgVvQt9M;->accept(Ljava/lang/Object;)V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$PendingRequest$Wzl5nwSdboq2CuUeWvFraQLBZk8;-><init>(Lcom/android/server/autofill/RemoteFillService$PendingRequest;)V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$YjPsINV7QuCehWwsB0GTTg1hvr4;-><init>()V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$YjPsINV7QuCehWwsB0GTTg1hvr4;->accept(Ljava/lang/Object;)V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$_5v43Gwb-Yar1uuVIqDgfleCP_4;-><init>(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;Landroid/service/autofill/FillResponse;I)V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$_5v43Gwb-Yar1uuVIqDgfleCP_4;->run()V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$h6FPsdmILphrDZs953cJIyumyqg;-><init>()V
+PLcom/android/server/autofill/-$$Lambda$RemoteFillService$h6FPsdmILphrDZs953cJIyumyqg;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+PLcom/android/server/autofill/-$$Lambda$Session$xw4trZ-LA7gCvZvpKJ93vf377ak;-><init>(Lcom/android/server/autofill/Session;)V
+PLcom/android/server/autofill/AutofillManagerService$1;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/autofill/AutofillManagerService$2;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerService$2;->getActiveAutofillServicePackageName()Ljava/lang/String;
+PLcom/android/server/autofill/AutofillManagerService$2;->handlePackageUpdateLocked(Ljava/lang/String;)V
+PLcom/android/server/autofill/AutofillManagerService$2;->onPackageUpdateFinished(Ljava/lang/String;I)V
+PLcom/android/server/autofill/AutofillManagerService$2;->onSomePackagesChanged()V
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->addClient(Landroid/view/autofill/IAutoFillManagerClient;I)I
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->getFillEventHistory()Landroid/service/autofill/FillEventHistory;
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->removeClient(Landroid/view/autofill/IAutoFillManagerClient;I)V
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->setHasCallback(IIZ)V
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->startSession(Landroid/os/IBinder;Landroid/os/IBinder;Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;IZILandroid/content/ComponentName;Z)I
+PLcom/android/server/autofill/AutofillManagerService$AutoFillManagerServiceStub;->updateSession(ILandroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;III)V
+PLcom/android/server/autofill/AutofillManagerService$AutofillCompatState;-><init>()V
+PLcom/android/server/autofill/AutofillManagerService$AutofillCompatState;->isCompatibilityModeRequested(Ljava/lang/String;JI)Z
+PLcom/android/server/autofill/AutofillManagerService$AutofillCompatState;->reset(I)V
+PLcom/android/server/autofill/AutofillManagerService$LocalService;-><init>(Lcom/android/server/autofill/AutofillManagerService;)V
+PLcom/android/server/autofill/AutofillManagerService$LocalService;-><init>(Lcom/android/server/autofill/AutofillManagerService;Lcom/android/server/autofill/AutofillManagerService$1;)V
+PLcom/android/server/autofill/AutofillManagerService$LocalService;->isCompatibilityModeRequested(Ljava/lang/String;JI)Z
+PLcom/android/server/autofill/AutofillManagerService$LocalService;->onBackKeyPressed()V
+PLcom/android/server/autofill/AutofillManagerService$SettingsObserver;-><init>(Lcom/android/server/autofill/AutofillManagerService;Landroid/os/Handler;)V
+PLcom/android/server/autofill/AutofillManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/autofill/AutofillManagerService;->access$100(Lcom/android/server/autofill/AutofillManagerService;)Ljava/lang/Object;
+PLcom/android/server/autofill/AutofillManagerService;->access$1000(Lcom/android/server/autofill/AutofillManagerService;)Z
+PLcom/android/server/autofill/AutofillManagerService;->access$200(Lcom/android/server/autofill/AutofillManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/autofill/AutofillManagerService;->access$300(Lcom/android/server/autofill/AutofillManagerService;)Lcom/android/server/autofill/ui/AutoFillUI;
+PLcom/android/server/autofill/AutofillManagerService;->access$400(Lcom/android/server/autofill/AutofillManagerService;I)V
+PLcom/android/server/autofill/AutofillManagerService;->access$600(Lcom/android/server/autofill/AutofillManagerService;)Landroid/content/Context;
+PLcom/android/server/autofill/AutofillManagerService;->access$700(Lcom/android/server/autofill/AutofillManagerService;)Lcom/android/server/autofill/AutofillManagerService$AutofillCompatState;
+PLcom/android/server/autofill/AutofillManagerService;->addCompatibilityModeRequestsLocked(Lcom/android/server/autofill/AutofillManagerServiceImpl;I)V
+PLcom/android/server/autofill/AutofillManagerService;->getServiceForUserLocked(I)Lcom/android/server/autofill/AutofillManagerServiceImpl;
+PLcom/android/server/autofill/AutofillManagerService;->lambda$new$0(Lcom/android/server/autofill/AutofillManagerService;ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/autofill/AutofillManagerService;->onBootPhase(I)V
+PLcom/android/server/autofill/AutofillManagerService;->onStart()V
+PLcom/android/server/autofill/AutofillManagerService;->onUnlockUser(I)V
+PLcom/android/server/autofill/AutofillManagerService;->peekServiceForUserLocked(I)Lcom/android/server/autofill/AutofillManagerServiceImpl;
+PLcom/android/server/autofill/AutofillManagerService;->setDebugLocked(Z)V
+PLcom/android/server/autofill/AutofillManagerService;->startTrackingPackageChanges()V
+PLcom/android/server/autofill/AutofillManagerService;->updateCachedServiceLocked(I)V
+PLcom/android/server/autofill/AutofillManagerService;->updateCachedServiceLocked(IZ)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;-><init>(Landroid/content/Context;Ljava/lang/Object;Landroid/util/LocalLog;Landroid/util/LocalLog;Landroid/util/LocalLog;ILcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/AutofillManagerService$AutofillCompatState;Z)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->addClientLocked(Landroid/view/autofill/IAutoFillManagerClient;)Z
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->assertCallerLocked(Landroid/content/ComponentName;Z)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->createSessionByTokenLocked(Landroid/os/IBinder;ILandroid/os/IBinder;ZLandroid/content/ComponentName;ZZI)Lcom/android/server/autofill/Session;
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->destroyFinishedSessionsLocked()V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->destroySessionsLocked()V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->getCompatibilityPackagesLocked()Landroid/util/ArrayMap;
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->getComponentNameFromSettings()Ljava/lang/String;
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->getFillEventHistory(I)Landroid/service/autofill/FillEventHistory;
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->getServiceComponentName()Landroid/content/ComponentName;
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->getServicePackageName()Ljava/lang/String;
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->handlePackageUpdateLocked(Ljava/lang/String;)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->isAutofillDisabledLocked(Landroid/content/ComponentName;)Z
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->isEnabledLocked()Z
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->isSetupCompletedLocked()Z
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->pruneAbandonedSessionsLocked()V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->removeClientLocked(Landroid/view/autofill/IAutoFillManagerClient;)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->removeSessionLocked(I)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->resetLastResponse()V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->sendStateToClients(Z)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->setHasCallback(IIZ)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->startSessionLocked(Landroid/os/IBinder;ILandroid/os/IBinder;Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;ZLandroid/content/ComponentName;ZZI)I
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->updateLocked(Z)V
+PLcom/android/server/autofill/AutofillManagerServiceImpl;->updateSessionLocked(IILandroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;II)Z
+PLcom/android/server/autofill/FieldClassificationStrategy;-><init>(Landroid/content/Context;I)V
+PLcom/android/server/autofill/FieldClassificationStrategy;->getServiceInfo()Landroid/content/pm/ServiceInfo;
+PLcom/android/server/autofill/Helper;->newLogMaker(ILandroid/content/ComponentName;Ljava/lang/String;IZ)Landroid/metrics/LogMaker;
+PLcom/android/server/autofill/Helper;->newLogMaker(ILjava/lang/String;IZ)Landroid/metrics/LogMaker;
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest$1;-><init>(Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;Landroid/service/autofill/FillRequest;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest$1;->onCancellable(Landroid/os/ICancellationSignal;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest$1;->onSuccess(Landroid/service/autofill/FillResponse;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest;-><init>(Landroid/service/autofill/FillRequest;Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest;->access$100(Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;)Landroid/service/autofill/FillRequest;
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest;->access$1002(Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;Landroid/os/ICancellationSignal;)Landroid/os/ICancellationSignal;
+PLcom/android/server/autofill/RemoteFillService$PendingFillRequest;->run()V
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;-><init>(Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;->finish()Z
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;->getService()Lcom/android/server/autofill/RemoteFillService;
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;->isCancelledLocked()Z
+PLcom/android/server/autofill/RemoteFillService$PendingRequest;->isFinal()Z
+PLcom/android/server/autofill/RemoteFillService$RemoteServiceConnection;-><init>(Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService$RemoteServiceConnection;-><init>(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$1;)V
+PLcom/android/server/autofill/RemoteFillService$RemoteServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/autofill/RemoteFillService;-><init>(Landroid/content/Context;Landroid/content/ComponentName;ILcom/android/server/autofill/RemoteFillService$FillServiceCallbacks;Z)V
+PLcom/android/server/autofill/RemoteFillService;->access$1100(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;Landroid/service/autofill/FillResponse;I)V
+PLcom/android/server/autofill/RemoteFillService;->access$200(Lcom/android/server/autofill/RemoteFillService;)Z
+PLcom/android/server/autofill/RemoteFillService;->access$300(Lcom/android/server/autofill/RemoteFillService;)Z
+PLcom/android/server/autofill/RemoteFillService;->access$302(Lcom/android/server/autofill/RemoteFillService;Z)Z
+PLcom/android/server/autofill/RemoteFillService;->access$400(Lcom/android/server/autofill/RemoteFillService;)Landroid/service/autofill/IAutoFillService;
+PLcom/android/server/autofill/RemoteFillService;->access$402(Lcom/android/server/autofill/RemoteFillService;Landroid/service/autofill/IAutoFillService;)Landroid/service/autofill/IAutoFillService;
+PLcom/android/server/autofill/RemoteFillService;->access$600(Lcom/android/server/autofill/RemoteFillService;)Lcom/android/server/autofill/RemoteFillService$PendingRequest;
+PLcom/android/server/autofill/RemoteFillService;->access$602(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingRequest;)Lcom/android/server/autofill/RemoteFillService$PendingRequest;
+PLcom/android/server/autofill/RemoteFillService;->access$700(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingRequest;)V
+PLcom/android/server/autofill/RemoteFillService;->access$802(Lcom/android/server/autofill/RemoteFillService;Z)Z
+PLcom/android/server/autofill/RemoteFillService;->access$900(Lcom/android/server/autofill/RemoteFillService;)Landroid/os/Handler;
+PLcom/android/server/autofill/RemoteFillService;->cancelCurrentRequest()I
+PLcom/android/server/autofill/RemoteFillService;->cancelScheduledUnbind()V
+PLcom/android/server/autofill/RemoteFillService;->checkIfDestroyed()Z
+PLcom/android/server/autofill/RemoteFillService;->destroy()V
+PLcom/android/server/autofill/RemoteFillService;->dispatchOnFillRequestSuccess(Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;Landroid/service/autofill/FillResponse;I)V
+PLcom/android/server/autofill/RemoteFillService;->ensureBound()V
+PLcom/android/server/autofill/RemoteFillService;->ensureUnbound()V
+PLcom/android/server/autofill/RemoteFillService;->handleDestroy()V
+PLcom/android/server/autofill/RemoteFillService;->handlePendingRequest(Lcom/android/server/autofill/RemoteFillService$PendingRequest;)V
+PLcom/android/server/autofill/RemoteFillService;->handleResponseCallbackCommon(Lcom/android/server/autofill/RemoteFillService$PendingRequest;)Z
+PLcom/android/server/autofill/RemoteFillService;->handleUnbind()V
+PLcom/android/server/autofill/RemoteFillService;->isBound()Z
+PLcom/android/server/autofill/RemoteFillService;->lambda$KN9CcjjmJTg_PJcamzzLgVvQt9M(Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService;->lambda$YjPsINV7QuCehWwsB0GTTg1hvr4(Lcom/android/server/autofill/RemoteFillService;)V
+PLcom/android/server/autofill/RemoteFillService;->lambda$dispatchOnFillRequestSuccess$0(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingFillRequest;Landroid/service/autofill/FillResponse;I)V
+PLcom/android/server/autofill/RemoteFillService;->lambda$h6FPsdmILphrDZs953cJIyumyqg(Lcom/android/server/autofill/RemoteFillService;Lcom/android/server/autofill/RemoteFillService$PendingRequest;)V
+PLcom/android/server/autofill/RemoteFillService;->onFillRequest(Landroid/service/autofill/FillRequest;)V
+PLcom/android/server/autofill/RemoteFillService;->scheduleRequest(Lcom/android/server/autofill/RemoteFillService$PendingRequest;)V
+PLcom/android/server/autofill/RemoteFillService;->scheduleUnbind()V
+PLcom/android/server/autofill/Session$1;-><init>(Lcom/android/server/autofill/Session;)V
+PLcom/android/server/autofill/Session$1;->onHandleAssistData(Landroid/os/Bundle;)V
+PLcom/android/server/autofill/Session;-><init>(Lcom/android/server/autofill/AutofillManagerServiceImpl;Lcom/android/server/autofill/ui/AutoFillUI;Landroid/content/Context;Landroid/os/Handler;ILjava/lang/Object;IILandroid/os/IBinder;Landroid/os/IBinder;ZLandroid/util/LocalLog;Landroid/util/LocalLog;Landroid/content/ComponentName;Landroid/content/ComponentName;ZZI)V
+PLcom/android/server/autofill/Session;->access$000(Lcom/android/server/autofill/Session;)Ljava/lang/Object;
+PLcom/android/server/autofill/Session;->access$1000(Lcom/android/server/autofill/Session;)V
+PLcom/android/server/autofill/Session;->access$1100(Lcom/android/server/autofill/Session;Landroid/service/autofill/FillContext;I)V
+PLcom/android/server/autofill/Session;->access$1200(Lcom/android/server/autofill/Session;)Landroid/os/Bundle;
+PLcom/android/server/autofill/Session;->access$1300(Lcom/android/server/autofill/Session;)Lcom/android/server/autofill/RemoteFillService;
+PLcom/android/server/autofill/Session;->access$200(Lcom/android/server/autofill/Session;)Landroid/content/ComponentName;
+PLcom/android/server/autofill/Session;->access$500(Lcom/android/server/autofill/Session;)Z
+PLcom/android/server/autofill/Session;->access$900(Lcom/android/server/autofill/Session;)Ljava/util/ArrayList;
+PLcom/android/server/autofill/Session;->access$902(Lcom/android/server/autofill/Session;Ljava/util/ArrayList;)Ljava/util/ArrayList;
+PLcom/android/server/autofill/Session;->cancelCurrentRequestLocked()V
+PLcom/android/server/autofill/Session;->destroyLocked()Lcom/android/server/autofill/RemoteFillService;
+PLcom/android/server/autofill/Session;->fillContextWithAllowedValuesLocked(Landroid/service/autofill/FillContext;I)V
+PLcom/android/server/autofill/Session;->getIdsOfAllViewStatesLocked()[Landroid/view/autofill/AutofillId;
+PLcom/android/server/autofill/Session;->getLastResponseLocked(Ljava/lang/String;)Landroid/service/autofill/FillResponse;
+PLcom/android/server/autofill/Session;->getUiForShowing()Lcom/android/server/autofill/ui/AutoFillUI;
+PLcom/android/server/autofill/Session;->isIgnoredLocked(Landroid/view/autofill/AutofillId;)Z
+PLcom/android/server/autofill/Session;->isSaveUiPendingLocked()Z
+PLcom/android/server/autofill/Session;->newLogMaker(I)Landroid/metrics/LogMaker;
+PLcom/android/server/autofill/Session;->newLogMaker(ILjava/lang/String;)Landroid/metrics/LogMaker;
+PLcom/android/server/autofill/Session;->notifyUnavailableToClient(I)V
+PLcom/android/server/autofill/Session;->onFillRequestSuccess(ILandroid/service/autofill/FillResponse;Ljava/lang/String;I)V
+PLcom/android/server/autofill/Session;->processNullResponseLocked(I)V
+PLcom/android/server/autofill/Session;->removeSelf()V
+PLcom/android/server/autofill/Session;->removeSelfLocked()V
+PLcom/android/server/autofill/Session;->requestNewFillResponseLocked(I)V
+PLcom/android/server/autofill/Session;->requestNewFillResponseOnViewEnteredIfNecessaryLocked(Landroid/view/autofill/AutofillId;Lcom/android/server/autofill/ViewState;I)V
+PLcom/android/server/autofill/Session;->setClientLocked(Landroid/os/IBinder;)V
+PLcom/android/server/autofill/Session;->shouldStartNewPartitionLocked(Landroid/view/autofill/AutofillId;)Z
+PLcom/android/server/autofill/Session;->unlinkClientVultureLocked()V
+PLcom/android/server/autofill/Session;->updateLocked(Landroid/view/autofill/AutofillId;Landroid/graphics/Rect;Landroid/view/autofill/AutofillValue;II)V
+PLcom/android/server/autofill/ViewState;-><init>(Lcom/android/server/autofill/Session;Landroid/view/autofill/AutofillId;Lcom/android/server/autofill/ViewState$Listener;I)V
+PLcom/android/server/autofill/ViewState;->getAutofilledValue()Landroid/view/autofill/AutofillValue;
+PLcom/android/server/autofill/ViewState;->getCurrentValue()Landroid/view/autofill/AutofillValue;
+PLcom/android/server/autofill/ViewState;->getStateAsString()Ljava/lang/String;
+PLcom/android/server/autofill/ViewState;->getStateAsString(I)Ljava/lang/String;
+PLcom/android/server/autofill/ViewState;->maybeCallOnFillReady(I)V
+PLcom/android/server/autofill/ViewState;->setCurrentValue(Landroid/view/autofill/AutofillValue;)V
+PLcom/android/server/autofill/ViewState;->setState(I)V
+PLcom/android/server/autofill/ViewState;->update(Landroid/view/autofill/AutofillValue;Landroid/graphics/Rect;I)V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$56AC3ykfo4h_e2LSjdkJ3XQn370;-><init>(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$56AC3ykfo4h_e2LSjdkJ3XQn370;->run()V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$LjywPhTUqjU0ZUlG1crxBg8qhRA;-><init>(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Ljava/lang/String;)V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$LjywPhTUqjU0ZUlG1crxBg8qhRA;->run()V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$VF2EbGE70QNyGDbklN9Uz5xHqyQ;-><init>(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$VF2EbGE70QNyGDbklN9Uz5xHqyQ;->run()V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$XWhvh2-Jd9NLMoEos-e8RkZdQaI;-><init>(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/PendingUi;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Z)V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$XWhvh2-Jd9NLMoEos-e8RkZdQaI;->run()V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$Z-Di7CGd-L0nOI4i7_RO1FYbhgU;-><init>(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$Z-Di7CGd-L0nOI4i7_RO1FYbhgU;->run()V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$i7qTc5vqiej5Psbl-bIkD7js-Ao;-><init>(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/-$$Lambda$AutoFillUI$i7qTc5vqiej5Psbl-bIkD7js-Ao;->run()V
+PLcom/android/server/autofill/ui/AutoFillUI;-><init>(Landroid/content/Context;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->clearCallback(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->destroyAll(Lcom/android/server/autofill/ui/PendingUi;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Z)V
+PLcom/android/server/autofill/ui/AutoFillUI;->destroyAllUiThread(Lcom/android/server/autofill/ui/PendingUi;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Z)V
+PLcom/android/server/autofill/ui/AutoFillUI;->destroySaveUiUiThread(Lcom/android/server/autofill/ui/PendingUi;Z)V
+PLcom/android/server/autofill/ui/AutoFillUI;->filterFillUi(Ljava/lang/String;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideAll(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideAllUiThread(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideFillUi(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideFillUiUiThread(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Z)V
+PLcom/android/server/autofill/ui/AutoFillUI;->hideSaveUiUiThread(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)Lcom/android/server/autofill/ui/PendingUi;
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$clearCallback$1(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$destroyAll$9(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/PendingUi;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Z)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$filterFillUi$4(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;Ljava/lang/String;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$hideAll$8(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$hideFillUi$3(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->lambda$setCallback$0(Lcom/android/server/autofill/ui/AutoFillUI;Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/AutoFillUI;->setCallback(Lcom/android/server/autofill/ui/AutoFillUI$AutoFillUiCallback;)V
+PLcom/android/server/autofill/ui/OverlayControl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/backup/-$$Lambda$-xfpm33S8Jqv3KpU_-llxhj8ZPI;-><init>(Ljava/util/Set;)V
+PLcom/android/server/backup/-$$Lambda$-xfpm33S8Jqv3KpU_-llxhj8ZPI;->test(Ljava/lang/Object;)Z
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$-mOc1e-1SsZws3njOjKXfyubq98;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$-mOc1e-1SsZws3njOjKXfyubq98;->accept(Ljava/lang/String;)V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$2$8WilE3DKM3p1qJhvhqvZiHtD9hI;-><init>(Lcom/android/server/backup/BackupManagerService$2;Ljava/lang/String;)V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$2$8WilE3DKM3p1qJhvhqvZiHtD9hI;->run()V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$2$PXK_S3ijBAkFZ4wQtjneIECynPo;-><init>(Lcom/android/server/backup/BackupManagerService$2;Ljava/lang/String;)V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$2$PXK_S3ijBAkFZ4wQtjneIECynPo;->run()V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$2$k3_lOimiIJDhWdG7_SCrtoKbtjY;-><init>(Lcom/android/server/backup/BackupManagerService$2;Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$2$k3_lOimiIJDhWdG7_SCrtoKbtjY;->run()V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$7naKh6MW6ryzdPxgJfM5jV1nHp4;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$7naKh6MW6ryzdPxgJfM5jV1nHp4;->run()V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$QlgHuOXOPKAZpwyUhPFAintPnqM;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/-$$Lambda$BackupManagerService$QlgHuOXOPKAZpwyUhPFAintPnqM;->onTransportRegistered(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/backup/-$$Lambda$Trampoline$zhmxdOntlNYAyF3FWA7uhVoZeFI;-><init>(Lcom/android/server/backup/Trampoline;)V
+PLcom/android/server/backup/-$$Lambda$Trampoline$zhmxdOntlNYAyF3FWA7uhVoZeFI;->run()V
+PLcom/android/server/backup/-$$Lambda$TransportManager$4ND1hZMerK5gHU67okq6DZjKDQw;-><init>()V
+PLcom/android/server/backup/-$$Lambda$TransportManager$Qbutmzd17ICwZdy0UzRrO-3_VK0;-><init>()V
+PLcom/android/server/backup/-$$Lambda$TransportManager$Qbutmzd17ICwZdy0UzRrO-3_VK0;->test(Ljava/lang/Object;)Z
+PLcom/android/server/backup/-$$Lambda$TransportManager$Z9ckpFUW2V4jkdHnyXIEiLuAoBc;-><init>()V
+PLcom/android/server/backup/-$$Lambda$TransportManager$_dxJobf45tWiMkaNlKY-z26kB2Q;-><init>(Ljava/lang/String;)V
+PLcom/android/server/backup/-$$Lambda$TransportManager$_dxJobf45tWiMkaNlKY-z26kB2Q;->test(Ljava/lang/Object;)Z
+PLcom/android/server/backup/-$$Lambda$pM_c5tVAGDtxjxLF_ONtACWWq6Q;-><init>(Lcom/android/server/backup/TransportManager;)V
+PLcom/android/server/backup/-$$Lambda$pM_c5tVAGDtxjxLF_ONtACWWq6Q;->run()V
+PLcom/android/server/backup/BackupAgentTimeoutParameters;-><init>(Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/backup/BackupAgentTimeoutParameters;->getFullBackupAgentTimeoutMillis()J
+PLcom/android/server/backup/BackupAgentTimeoutParameters;->getKvBackupAgentTimeoutMillis()J
+PLcom/android/server/backup/BackupAgentTimeoutParameters;->getSettingValue(Landroid/content/ContentResolver;)Ljava/lang/String;
+PLcom/android/server/backup/BackupAgentTimeoutParameters;->update(Landroid/util/KeyValueListParser;)V
+PLcom/android/server/backup/BackupManagerConstants;-><init>(Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/backup/BackupManagerConstants;->getBackupFinishedNotificationReceivers()[Ljava/lang/String;
+PLcom/android/server/backup/BackupManagerConstants;->getFullBackupIntervalMilliseconds()J
+PLcom/android/server/backup/BackupManagerConstants;->getFullBackupRequireCharging()Z
+PLcom/android/server/backup/BackupManagerConstants;->getFullBackupRequiredNetworkType()I
+PLcom/android/server/backup/BackupManagerConstants;->getKeyValueBackupFuzzMilliseconds()J
+PLcom/android/server/backup/BackupManagerConstants;->getKeyValueBackupIntervalMilliseconds()J
+PLcom/android/server/backup/BackupManagerConstants;->getKeyValueBackupRequireCharging()Z
+PLcom/android/server/backup/BackupManagerConstants;->getKeyValueBackupRequiredNetworkType()I
+PLcom/android/server/backup/BackupManagerConstants;->getSettingValue(Landroid/content/ContentResolver;)Ljava/lang/String;
+PLcom/android/server/backup/BackupManagerConstants;->update(Landroid/util/KeyValueListParser;)V
+PLcom/android/server/backup/BackupManagerService$1;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService$1;->run()V
+PLcom/android/server/backup/BackupManagerService$2;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService$2;->lambda$onReceive$0(Lcom/android/server/backup/BackupManagerService$2;Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService$2;->lambda$onReceive$1(Lcom/android/server/backup/BackupManagerService$2;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService$2;->lambda$onReceive$2(Lcom/android/server/backup/BackupManagerService$2;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/backup/BackupManagerService$3;-><init>(Lcom/android/server/backup/BackupManagerService;J)V
+PLcom/android/server/backup/BackupManagerService$3;->run()V
+PLcom/android/server/backup/BackupManagerService$4;-><init>(Lcom/android/server/backup/BackupManagerService;J)V
+PLcom/android/server/backup/BackupManagerService$4;->run()V
+PLcom/android/server/backup/BackupManagerService$6;-><init>(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;Ljava/util/HashSet;)V
+PLcom/android/server/backup/BackupManagerService$6;->run()V
+PLcom/android/server/backup/BackupManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/backup/BackupManagerService$Lifecycle;->onStart()V
+PLcom/android/server/backup/BackupManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/backup/BackupManagerService;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/backup/BackupManagerService;-><init>(Landroid/content/Context;Lcom/android/server/backup/Trampoline;Landroid/os/HandlerThread;Ljava/io/File;Ljava/io/File;Lcom/android/server/backup/TransportManager;)V
+PLcom/android/server/backup/BackupManagerService;->access$000(Lcom/android/server/backup/BackupManagerService;)Ljava/lang/Object;
+PLcom/android/server/backup/BackupManagerService;->access$100(Lcom/android/server/backup/BackupManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/backup/BackupManagerService;->access$1000(Lcom/android/server/backup/BackupManagerService;)Lcom/android/server/backup/TransportManager;
+PLcom/android/server/backup/BackupManagerService;->access$1100(Lcom/android/server/backup/BackupManagerService;)Landroid/content/Context;
+PLcom/android/server/backup/BackupManagerService;->access$1200(Lcom/android/server/backup/BackupManagerService;)Lcom/android/server/backup/BackupManagerConstants;
+PLcom/android/server/backup/BackupManagerService;->access$1400(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;Ljava/util/HashSet;)V
+PLcom/android/server/backup/BackupManagerService;->access$200(Lcom/android/server/backup/BackupManagerService;)Ljava/io/File;
+PLcom/android/server/backup/BackupManagerService;->access$300(Lcom/android/server/backup/BackupManagerService;)Lcom/android/server/backup/internal/BackupHandler;
+PLcom/android/server/backup/BackupManagerService;->access$400(Lcom/android/server/backup/BackupManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/backup/BackupManagerService;->access$500(Lcom/android/server/backup/BackupManagerService;[Ljava/lang/String;I)V
+PLcom/android/server/backup/BackupManagerService;->access$600(Lcom/android/server/backup/BackupManagerService;[Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->access$700(Lcom/android/server/backup/BackupManagerService;)Landroid/content/pm/PackageManager;
+PLcom/android/server/backup/BackupManagerService;->access$800(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->access$900(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService;->addBackupTrace(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->addPackageParticipantsLocked([Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->addPackageParticipantsLockedInner(Ljava/lang/String;Ljava/util/List;)V
+PLcom/android/server/backup/BackupManagerService;->agentConnected(Ljava/lang/String;Landroid/os/IBinder;)V
+PLcom/android/server/backup/BackupManagerService;->allAgentPackages()Ljava/util/List;
+PLcom/android/server/backup/BackupManagerService;->backupNow()V
+PLcom/android/server/backup/BackupManagerService;->backupSettingMigrated(I)Z
+PLcom/android/server/backup/BackupManagerService;->beginFullBackup(Lcom/android/server/backup/FullBackupJob;)Z
+PLcom/android/server/backup/BackupManagerService;->bindToAgentSynchronous(Landroid/content/pm/ApplicationInfo;I)Landroid/app/IBackupAgent;
+PLcom/android/server/backup/BackupManagerService;->clearBackupTrace()V
+PLcom/android/server/backup/BackupManagerService;->create(Landroid/content/Context;Lcom/android/server/backup/Trampoline;Landroid/os/HandlerThread;)Lcom/android/server/backup/BackupManagerService;
+PLcom/android/server/backup/BackupManagerService;->dataChanged(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->dataChangedImpl(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->dataChangedImpl(Ljava/lang/String;Ljava/util/HashSet;)V
+PLcom/android/server/backup/BackupManagerService;->dequeueFullBackupLocked(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->enqueueFullBackup(Ljava/lang/String;J)V
+PLcom/android/server/backup/BackupManagerService;->fullBackupAllowable(Ljava/lang/String;)Z
+PLcom/android/server/backup/BackupManagerService;->generateRandomIntegerToken()I
+PLcom/android/server/backup/BackupManagerService;->getActivityManager()Landroid/app/IActivityManager;
+PLcom/android/server/backup/BackupManagerService;->getAgentTimeoutParameters()Lcom/android/server/backup/BackupAgentTimeoutParameters;
+PLcom/android/server/backup/BackupManagerService;->getAvailableRestoreToken(Ljava/lang/String;)J
+PLcom/android/server/backup/BackupManagerService;->getBackupHandler()Landroid/os/Handler;
+PLcom/android/server/backup/BackupManagerService;->getBackupManagerBinder()Landroid/app/backup/IBackupManager;
+PLcom/android/server/backup/BackupManagerService;->getBaseStateDir()Ljava/io/File;
+PLcom/android/server/backup/BackupManagerService;->getConstants()Lcom/android/server/backup/BackupManagerConstants;
+PLcom/android/server/backup/BackupManagerService;->getContext()Landroid/content/Context;
+PLcom/android/server/backup/BackupManagerService;->getCurrentOpLock()Ljava/lang/Object;
+PLcom/android/server/backup/BackupManagerService;->getCurrentOperations()Landroid/util/SparseArray;
+PLcom/android/server/backup/BackupManagerService;->getCurrentToken()J
+PLcom/android/server/backup/BackupManagerService;->getCurrentTransport()Ljava/lang/String;
+PLcom/android/server/backup/BackupManagerService;->getDataDir()Ljava/io/File;
+PLcom/android/server/backup/BackupManagerService;->getInstance()Lcom/android/server/backup/Trampoline;
+PLcom/android/server/backup/BackupManagerService;->getJournal()Lcom/android/server/backup/DataChangedJournal;
+PLcom/android/server/backup/BackupManagerService;->getMessageIdForOperationType(I)I
+PLcom/android/server/backup/BackupManagerService;->getPackageManager()Landroid/content/pm/PackageManager;
+PLcom/android/server/backup/BackupManagerService;->getPendingBackups()Ljava/util/HashMap;
+PLcom/android/server/backup/BackupManagerService;->getPendingInits()Landroid/util/ArraySet;
+PLcom/android/server/backup/BackupManagerService;->getQueueLock()Ljava/lang/Object;
+PLcom/android/server/backup/BackupManagerService;->getTransportManager()Lcom/android/server/backup/TransportManager;
+PLcom/android/server/backup/BackupManagerService;->getWakelock()Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/backup/BackupManagerService;->handleCancel(IZ)V
+PLcom/android/server/backup/BackupManagerService;->hasBackupPassword()Z
+PLcom/android/server/backup/BackupManagerService;->initPackageTracking()V
+PLcom/android/server/backup/BackupManagerService;->isBackupEnabled()Z
+PLcom/android/server/backup/BackupManagerService;->isBackupOperationInProgress()Z
+PLcom/android/server/backup/BackupManagerService;->isBackupRunning()Z
+PLcom/android/server/backup/BackupManagerService;->isEnabled()Z
+PLcom/android/server/backup/BackupManagerService;->isProvisioned()Z
+PLcom/android/server/backup/BackupManagerService;->lambda$7naKh6MW6ryzdPxgJfM5jV1nHp4(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/BackupManagerService;->lambda$QlgHuOXOPKAZpwyUhPFAintPnqM(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->lambda$parseLeftoverJournals$0(Lcom/android/server/backup/BackupManagerService;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->logBackupComplete(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->makeMetadataAgent()Lcom/android/server/backup/PackageManagerBackupAgent;
+PLcom/android/server/backup/BackupManagerService;->onTransportRegistered(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->opComplete(IJ)V
+PLcom/android/server/backup/BackupManagerService;->parseLeftoverJournals()V
+PLcom/android/server/backup/BackupManagerService;->prepareOperationTimeout(IJLcom/android/server/backup/BackupRestoreTask;I)V
+PLcom/android/server/backup/BackupManagerService;->readBackupEnableState(I)Z
+PLcom/android/server/backup/BackupManagerService;->readFullBackupSchedule()Ljava/util/ArrayList;
+PLcom/android/server/backup/BackupManagerService;->removeOperation(I)V
+PLcom/android/server/backup/BackupManagerService;->removePackageFromSetLocked(Ljava/util/HashSet;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->removePackageParticipantsLocked([Ljava/lang/String;I)V
+PLcom/android/server/backup/BackupManagerService;->restoreAtInstall(Ljava/lang/String;I)V
+PLcom/android/server/backup/BackupManagerService;->scheduleNextFullBackupJob(J)V
+PLcom/android/server/backup/BackupManagerService;->setBackupEnabled(Z)V
+PLcom/android/server/backup/BackupManagerService;->setBackupRunning(Z)V
+PLcom/android/server/backup/BackupManagerService;->setJournal(Lcom/android/server/backup/DataChangedJournal;)V
+PLcom/android/server/backup/BackupManagerService;->setLastBackupPass(J)V
+PLcom/android/server/backup/BackupManagerService;->setRunningFullBackupTask(Lcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;)V
+PLcom/android/server/backup/BackupManagerService;->tearDownAgentAndKill(Landroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/backup/BackupManagerService;->unlockSystemUser()V
+PLcom/android/server/backup/BackupManagerService;->updateTransportAttributes(ILandroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;)V
+PLcom/android/server/backup/BackupManagerService;->waitUntilOperationComplete(I)Z
+PLcom/android/server/backup/BackupManagerService;->writeBackupEnableState(ZI)V
+PLcom/android/server/backup/BackupManagerService;->writeFullBackupScheduleAsync()V
+PLcom/android/server/backup/BackupManagerService;->writeToJournalLocked(Ljava/lang/String;)V
+PLcom/android/server/backup/BackupPasswordManager$PasswordHashFileCodec;-><init>()V
+PLcom/android/server/backup/BackupPasswordManager$PasswordHashFileCodec;-><init>(Lcom/android/server/backup/BackupPasswordManager$1;)V
+PLcom/android/server/backup/BackupPasswordManager$PasswordVersionFileCodec;-><init>()V
+PLcom/android/server/backup/BackupPasswordManager$PasswordVersionFileCodec;-><init>(Lcom/android/server/backup/BackupPasswordManager$1;)V
+PLcom/android/server/backup/BackupPasswordManager;-><init>(Landroid/content/Context;Ljava/io/File;Ljava/security/SecureRandom;)V
+PLcom/android/server/backup/BackupPasswordManager;->getPasswordHashFile()Ljava/io/File;
+PLcom/android/server/backup/BackupPasswordManager;->getPasswordHashFileCodec()Lcom/android/server/backup/utils/DataStreamFileCodec;
+PLcom/android/server/backup/BackupPasswordManager;->getPasswordVersionFileCodec()Lcom/android/server/backup/utils/DataStreamFileCodec;
+PLcom/android/server/backup/BackupPasswordManager;->hasBackupPassword()Z
+PLcom/android/server/backup/BackupPasswordManager;->loadStateFromFilesystem()V
+PLcom/android/server/backup/BackupPolicyEnforcer;-><init>(Landroid/content/Context;)V
+PLcom/android/server/backup/BackupUtils;->hashSignature(Landroid/content/pm/Signature;)[B
+PLcom/android/server/backup/BackupUtils;->hashSignature([B)[B
+PLcom/android/server/backup/BackupUtils;->hashSignatureArray([Landroid/content/pm/Signature;)Ljava/util/ArrayList;
+PLcom/android/server/backup/DataChangedJournal;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/backup/DataChangedJournal;-><init>(Ljava/io/File;)V
+PLcom/android/server/backup/DataChangedJournal;->addPackage(Ljava/lang/String;)V
+PLcom/android/server/backup/DataChangedJournal;->delete()Z
+PLcom/android/server/backup/DataChangedJournal;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/backup/DataChangedJournal;->forEach(Lcom/android/server/backup/DataChangedJournal$Consumer;)V
+PLcom/android/server/backup/DataChangedJournal;->listJournals(Ljava/io/File;)Ljava/util/ArrayList;
+PLcom/android/server/backup/DataChangedJournal;->newJournal(Ljava/io/File;)Lcom/android/server/backup/DataChangedJournal;
+PLcom/android/server/backup/FullBackupJob;-><init>()V
+PLcom/android/server/backup/FullBackupJob;->finishBackupPass()V
+PLcom/android/server/backup/FullBackupJob;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/backup/FullBackupJob;->schedule(Landroid/content/Context;JLcom/android/server/backup/BackupManagerConstants;)V
+PLcom/android/server/backup/KeyValueBackupJob;-><init>()V
+PLcom/android/server/backup/KeyValueBackupJob;->cancel(Landroid/content/Context;)V
+PLcom/android/server/backup/KeyValueBackupJob;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/backup/KeyValueBackupJob;->schedule(Landroid/content/Context;JLcom/android/server/backup/BackupManagerConstants;)V
+PLcom/android/server/backup/KeyValueBackupJob;->schedule(Landroid/content/Context;Lcom/android/server/backup/BackupManagerConstants;)V
+PLcom/android/server/backup/PackageManagerBackupAgent$Metadata;-><init>(Lcom/android/server/backup/PackageManagerBackupAgent;JLjava/util/ArrayList;)V
+PLcom/android/server/backup/PackageManagerBackupAgent;-><init>(Landroid/content/pm/PackageManager;)V
+PLcom/android/server/backup/PackageManagerBackupAgent;->evaluateStorablePackages()V
+PLcom/android/server/backup/PackageManagerBackupAgent;->getPreferredHomeComponent()Landroid/content/ComponentName;
+PLcom/android/server/backup/PackageManagerBackupAgent;->getStorableApplications(Landroid/content/pm/PackageManager;)Ljava/util/List;
+PLcom/android/server/backup/PackageManagerBackupAgent;->init(Landroid/content/pm/PackageManager;Ljava/util/List;)V
+PLcom/android/server/backup/PackageManagerBackupAgent;->onBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V
+PLcom/android/server/backup/PackageManagerBackupAgent;->parseStateFile(Landroid/os/ParcelFileDescriptor;)V
+PLcom/android/server/backup/PackageManagerBackupAgent;->writeEntity(Landroid/app/backup/BackupDataOutput;Ljava/lang/String;[B)V
+PLcom/android/server/backup/PackageManagerBackupAgent;->writeSignatureHashArray(Ljava/io/DataOutputStream;Ljava/util/ArrayList;)V
+PLcom/android/server/backup/PackageManagerBackupAgent;->writeStateFile(Ljava/util/List;Landroid/content/ComponentName;JLjava/util/ArrayList;Landroid/os/ParcelFileDescriptor;)V
+PLcom/android/server/backup/ProcessedPackagesJournal;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/backup/ProcessedPackagesJournal;-><init>(Ljava/io/File;)V
+PLcom/android/server/backup/ProcessedPackagesJournal;->addPackage(Ljava/lang/String;)V
+PLcom/android/server/backup/ProcessedPackagesJournal;->hasBeenProcessed(Ljava/lang/String;)Z
+PLcom/android/server/backup/ProcessedPackagesJournal;->init()V
+PLcom/android/server/backup/ProcessedPackagesJournal;->loadFromDisk()V
+PLcom/android/server/backup/Trampoline;-><init>(Landroid/content/Context;)V
+PLcom/android/server/backup/Trampoline;->agentConnected(Ljava/lang/String;Landroid/os/IBinder;)V
+PLcom/android/server/backup/Trampoline;->backupNow()V
+PLcom/android/server/backup/Trampoline;->beginFullBackup(Lcom/android/server/backup/FullBackupJob;)Z
+PLcom/android/server/backup/Trampoline;->createBackupManagerService()Lcom/android/server/backup/BackupManagerServiceInterface;
+PLcom/android/server/backup/Trampoline;->dataChanged(Ljava/lang/String;)V
+PLcom/android/server/backup/Trampoline;->getCurrentTransport()Ljava/lang/String;
+PLcom/android/server/backup/Trampoline;->getSuppressFile()Ljava/io/File;
+PLcom/android/server/backup/Trampoline;->hasBackupPassword()Z
+PLcom/android/server/backup/Trampoline;->initialize(I)V
+PLcom/android/server/backup/Trampoline;->isBackupDisabled()Z
+PLcom/android/server/backup/Trampoline;->isBackupEnabled()Z
+PLcom/android/server/backup/Trampoline;->isBackupServiceActive(I)Z
+PLcom/android/server/backup/Trampoline;->lambda$unlockSystemUser$0(Lcom/android/server/backup/Trampoline;)V
+PLcom/android/server/backup/Trampoline;->opComplete(IJ)V
+PLcom/android/server/backup/Trampoline;->restoreAtInstall(Ljava/lang/String;I)V
+PLcom/android/server/backup/Trampoline;->setBackupEnabled(Z)V
+PLcom/android/server/backup/Trampoline;->unlockSystemUser()V
+PLcom/android/server/backup/Trampoline;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager$TransportDescription;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager$TransportDescription;-><init>(Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Lcom/android/server/backup/TransportManager$1;)V
+PLcom/android/server/backup/TransportManager$TransportDescription;->access$000(Lcom/android/server/backup/TransportManager$TransportDescription;)Ljava/lang/String;
+PLcom/android/server/backup/TransportManager$TransportDescription;->access$002(Lcom/android/server/backup/TransportManager$TransportDescription;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/backup/TransportManager$TransportDescription;->access$100(Lcom/android/server/backup/TransportManager$TransportDescription;)Ljava/lang/String;
+PLcom/android/server/backup/TransportManager$TransportDescription;->access$202(Lcom/android/server/backup/TransportManager$TransportDescription;Landroid/content/Intent;)Landroid/content/Intent;
+PLcom/android/server/backup/TransportManager$TransportDescription;->access$302(Lcom/android/server/backup/TransportManager$TransportDescription;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/backup/TransportManager$TransportDescription;->access$402(Lcom/android/server/backup/TransportManager$TransportDescription;Landroid/content/Intent;)Landroid/content/Intent;
+PLcom/android/server/backup/TransportManager$TransportDescription;->access$502(Lcom/android/server/backup/TransportManager$TransportDescription;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/backup/TransportManager;-><init>(Landroid/content/Context;Ljava/util/Set;Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->checkCanUseTransport()V
+PLcom/android/server/backup/TransportManager;->disposeOfTransportClient(Lcom/android/server/backup/transport/TransportClient;Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->fromPackageFilter(Ljava/lang/String;)Ljava/util/function/Predicate;
+PLcom/android/server/backup/TransportManager;->getCurrentTransportClient(Ljava/lang/String;)Lcom/android/server/backup/transport/TransportClient;
+PLcom/android/server/backup/TransportManager;->getCurrentTransportName()Ljava/lang/String;
+PLcom/android/server/backup/TransportManager;->getRegisteredTransportComponentLocked(Ljava/lang/String;)Landroid/content/ComponentName;
+PLcom/android/server/backup/TransportManager;->getRegisteredTransportDescriptionLocked(Ljava/lang/String;)Lcom/android/server/backup/TransportManager$TransportDescription;
+PLcom/android/server/backup/TransportManager;->getRegisteredTransportDescriptionOrThrowLocked(Ljava/lang/String;)Lcom/android/server/backup/TransportManager$TransportDescription;
+PLcom/android/server/backup/TransportManager;->getRegisteredTransportEntryLocked(Ljava/lang/String;)Ljava/util/Map$Entry;
+PLcom/android/server/backup/TransportManager;->getTransportClient(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/backup/transport/TransportClient;
+PLcom/android/server/backup/TransportManager;->getTransportClientOrThrow(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/backup/transport/TransportClient;
+PLcom/android/server/backup/TransportManager;->getTransportDirName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/backup/TransportManager;->isTransportRegistered(Ljava/lang/String;)Z
+PLcom/android/server/backup/TransportManager;->isTransportTrusted(Landroid/content/ComponentName;)Z
+PLcom/android/server/backup/TransportManager;->lambda$fromPackageFilter$3(Ljava/lang/String;Landroid/content/ComponentName;)Z
+PLcom/android/server/backup/TransportManager;->lambda$registerTransports$2(Landroid/content/ComponentName;)Z
+PLcom/android/server/backup/TransportManager;->onPackageAdded(Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->onPackageChanged(Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->onPackageRemoved(Ljava/lang/String;)V
+PLcom/android/server/backup/TransportManager;->registerTransport(Landroid/content/ComponentName;)I
+PLcom/android/server/backup/TransportManager;->registerTransport(Landroid/content/ComponentName;Lcom/android/internal/backup/IBackupTransport;)V
+PLcom/android/server/backup/TransportManager;->registerTransports()V
+PLcom/android/server/backup/TransportManager;->registerTransportsForIntent(Landroid/content/Intent;Ljava/util/function/Predicate;)V
+PLcom/android/server/backup/TransportManager;->registerTransportsFromPackage(Ljava/lang/String;Ljava/util/function/Predicate;)V
+PLcom/android/server/backup/TransportManager;->setOnTransportRegisteredListener(Lcom/android/server/backup/transport/OnTransportRegisteredListener;)V
+PLcom/android/server/backup/TransportManager;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;)V
+PLcom/android/server/backup/fullbackup/-$$Lambda$PerformFullTransportBackupTask$ymLoQLrsEpmGaMrcudrdAgsU1Zk;-><init>(Lcom/android/server/backup/TransportManager;Lcom/android/server/backup/transport/TransportClient;)V
+PLcom/android/server/backup/fullbackup/-$$Lambda$PerformFullTransportBackupTask$ymLoQLrsEpmGaMrcudrdAgsU1Zk;->onFinished(Ljava/lang/String;)V
+PLcom/android/server/backup/fullbackup/FullBackupEngine$FullBackupRunner;-><init>(Lcom/android/server/backup/fullbackup/FullBackupEngine;Landroid/content/pm/PackageInfo;Landroid/app/IBackupAgent;Landroid/os/ParcelFileDescriptor;IZZ[B)V
+PLcom/android/server/backup/fullbackup/FullBackupEngine$FullBackupRunner;->run()V
+PLcom/android/server/backup/fullbackup/FullBackupEngine;-><init>(Lcom/android/server/backup/BackupManagerService;Ljava/io/OutputStream;Lcom/android/server/backup/fullbackup/FullBackupPreflight;Landroid/content/pm/PackageInfo;ZLcom/android/server/backup/BackupRestoreTask;JII)V
+PLcom/android/server/backup/fullbackup/FullBackupEngine;->access$000(Lcom/android/server/backup/fullbackup/FullBackupEngine;)I
+PLcom/android/server/backup/fullbackup/FullBackupEngine;->access$100(Lcom/android/server/backup/fullbackup/FullBackupEngine;)Lcom/android/server/backup/BackupManagerService;
+PLcom/android/server/backup/fullbackup/FullBackupEngine;->access$400(Lcom/android/server/backup/fullbackup/FullBackupEngine;)Lcom/android/server/backup/BackupAgentTimeoutParameters;
+PLcom/android/server/backup/fullbackup/FullBackupEngine;->access$500(Lcom/android/server/backup/fullbackup/FullBackupEngine;)J
+PLcom/android/server/backup/fullbackup/FullBackupEngine;->backupOnePackage()I
+PLcom/android/server/backup/fullbackup/FullBackupEngine;->initializeAgent()Z
+PLcom/android/server/backup/fullbackup/FullBackupEngine;->preflightCheck()I
+PLcom/android/server/backup/fullbackup/FullBackupEngine;->tearDown()V
+PLcom/android/server/backup/fullbackup/FullBackupEntry;-><init>(Ljava/lang/String;J)V
+PLcom/android/server/backup/fullbackup/FullBackupEntry;->compareTo(Lcom/android/server/backup/fullbackup/FullBackupEntry;)I
+PLcom/android/server/backup/fullbackup/FullBackupEntry;->compareTo(Ljava/lang/Object;)I
+PLcom/android/server/backup/fullbackup/FullBackupTask;-><init>(Landroid/app/backup/IFullBackupRestoreObserver;)V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupPreflight;-><init>(Lcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;Lcom/android/server/backup/transport/TransportClient;JII)V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupPreflight;->getExpectedSizeOrErrorCode()J
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupPreflight;->operationComplete(J)V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupPreflight;->preflightFullBackup(Landroid/content/pm/PackageInfo;Landroid/app/IBackupAgent;)I
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupRunner;-><init>(Lcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;Landroid/os/ParcelFileDescriptor;Landroid/content/pm/PackageInfo;Lcom/android/server/backup/transport/TransportClient;JII)V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupRunner;->getBackupResultBlocking()I
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupRunner;->getPreflightResultBlocking()J
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupRunner;->operationComplete(J)V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupRunner;->registerTask()V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupRunner;->run()V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask$SinglePackageBackupRunner;->unregisterTask()V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;-><init>(Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/transport/TransportClient;Landroid/app/backup/IFullBackupRestoreObserver;[Ljava/lang/String;ZLcom/android/server/backup/FullBackupJob;Ljava/util/concurrent/CountDownLatch;Landroid/app/backup/IBackupObserver;Landroid/app/backup/IBackupManagerMonitor;Lcom/android/server/backup/internal/OnTaskFinishedListener;Z)V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;->access$000(Lcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;)Lcom/android/server/backup/BackupAgentTimeoutParameters;
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;->access$100(Lcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;)Lcom/android/server/backup/BackupManagerService;
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;->cleanUpPipes([Landroid/os/ParcelFileDescriptor;)V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;->lambda$newWithCurrentTransport$0(Lcom/android/server/backup/TransportManager;Lcom/android/server/backup/transport/TransportClient;Ljava/lang/String;)V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;->newWithCurrentTransport(Lcom/android/server/backup/BackupManagerService;Landroid/app/backup/IFullBackupRestoreObserver;[Ljava/lang/String;ZLcom/android/server/backup/FullBackupJob;Ljava/util/concurrent/CountDownLatch;Landroid/app/backup/IBackupObserver;Landroid/app/backup/IBackupManagerMonitor;ZLjava/lang/String;)Lcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;->registerTask()V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;->run()V
+PLcom/android/server/backup/fullbackup/PerformFullTransportBackupTask;->unregisterTask()V
+PLcom/android/server/backup/internal/-$$Lambda$BackupHandler$TJcRazGYTaUxjeiX6mPLlipfZUI;-><init>(Lcom/android/server/backup/TransportManager;Lcom/android/server/backup/transport/TransportClient;)V
+PLcom/android/server/backup/internal/-$$Lambda$BackupHandler$TJcRazGYTaUxjeiX6mPLlipfZUI;->onFinished(Ljava/lang/String;)V
+PLcom/android/server/backup/internal/BackupHandler;-><init>(Lcom/android/server/backup/BackupManagerService;Landroid/os/Looper;)V
+PLcom/android/server/backup/internal/BackupHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/backup/internal/BackupHandler;->lambda$handleMessage$0(Lcom/android/server/backup/TransportManager;Lcom/android/server/backup/transport/TransportClient;Ljava/lang/String;)V
+PLcom/android/server/backup/internal/BackupRequest;-><init>(Ljava/lang/String;)V
+PLcom/android/server/backup/internal/BackupRequest;->toString()Ljava/lang/String;
+PLcom/android/server/backup/internal/BackupState;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/backup/internal/BackupState;->values()[Lcom/android/server/backup/internal/BackupState;
+PLcom/android/server/backup/internal/Operation;-><init>(ILcom/android/server/backup/BackupRestoreTask;I)V
+PLcom/android/server/backup/internal/PerformBackupTask;-><init>(Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/transport/TransportClient;Ljava/lang/String;Ljava/util/ArrayList;Lcom/android/server/backup/DataChangedJournal;Landroid/app/backup/IBackupObserver;Landroid/app/backup/IBackupManagerMonitor;Lcom/android/server/backup/internal/OnTaskFinishedListener;Ljava/util/List;ZZ)V
+PLcom/android/server/backup/internal/PerformBackupTask;->backupPm()V
+PLcom/android/server/backup/internal/PerformBackupTask;->beginBackup()V
+PLcom/android/server/backup/internal/PerformBackupTask;->clearAgentState()V
+PLcom/android/server/backup/internal/PerformBackupTask;->execute()V
+PLcom/android/server/backup/internal/PerformBackupTask;->executeNextState(Lcom/android/server/backup/internal/BackupState;)V
+PLcom/android/server/backup/internal/PerformBackupTask;->finalizeBackup()V
+PLcom/android/server/backup/internal/PerformBackupTask;->invokeAgentForBackup(Ljava/lang/String;Landroid/app/IBackupAgent;)I
+PLcom/android/server/backup/internal/PerformBackupTask;->invokeNextAgent()V
+PLcom/android/server/backup/internal/PerformBackupTask;->operationComplete(J)V
+PLcom/android/server/backup/internal/PerformBackupTask;->registerTask()V
+PLcom/android/server/backup/internal/PerformBackupTask;->revertAndEndBackup()V
+PLcom/android/server/backup/internal/PerformBackupTask;->unregisterTask()V
+PLcom/android/server/backup/internal/PerformBackupTask;->writeWidgetPayloadIfAppropriate(Ljava/io/FileDescriptor;Ljava/lang/String;)V
+PLcom/android/server/backup/internal/ProvisionedObserver;-><init>(Lcom/android/server/backup/BackupManagerService;Landroid/os/Handler;)V
+PLcom/android/server/backup/internal/RunBackupReceiver;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/internal/RunBackupReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/backup/internal/RunInitializeReceiver;-><init>(Lcom/android/server/backup/BackupManagerService;)V
+PLcom/android/server/backup/transport/-$$Lambda$TransportClient$ciIUj0x0CRg93UETUpy2FB5aqCQ;-><init>(Lcom/android/server/backup/transport/TransportClient;Lcom/android/server/backup/transport/TransportConnectionListener;Lcom/android/internal/backup/IBackupTransport;)V
+PLcom/android/server/backup/transport/-$$Lambda$TransportClient$ciIUj0x0CRg93UETUpy2FB5aqCQ;->run()V
+PLcom/android/server/backup/transport/-$$Lambda$TransportClient$uc3fygwQjQIS_JT7mlt-yMBfJcE;-><init>(Ljava/util/concurrent/CompletableFuture;)V
+PLcom/android/server/backup/transport/-$$Lambda$TransportClient$uc3fygwQjQIS_JT7mlt-yMBfJcE;->onTransportConnectionResult(Lcom/android/internal/backup/IBackupTransport;Lcom/android/server/backup/transport/TransportClient;)V
+PLcom/android/server/backup/transport/TransportClient$TransportConnection;-><init>(Landroid/content/Context;Lcom/android/server/backup/transport/TransportClient;)V
+PLcom/android/server/backup/transport/TransportClient$TransportConnection;-><init>(Landroid/content/Context;Lcom/android/server/backup/transport/TransportClient;Lcom/android/server/backup/transport/TransportClient$1;)V
+PLcom/android/server/backup/transport/TransportClient$TransportConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/backup/transport/TransportClient;-><init>(Landroid/content/Context;Lcom/android/server/backup/transport/TransportStats;Landroid/content/Intent;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/backup/transport/TransportClient;-><init>(Landroid/content/Context;Lcom/android/server/backup/transport/TransportStats;Landroid/content/Intent;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/os/Handler;)V
+PLcom/android/server/backup/transport/TransportClient;->access$100(Lcom/android/server/backup/transport/TransportClient;Landroid/os/IBinder;)V
+PLcom/android/server/backup/transport/TransportClient;->checkState(ZLjava/lang/String;)V
+PLcom/android/server/backup/transport/TransportClient;->checkStateIntegrityLocked()V
+PLcom/android/server/backup/transport/TransportClient;->connect(Ljava/lang/String;)Lcom/android/internal/backup/IBackupTransport;
+PLcom/android/server/backup/transport/TransportClient;->connectAsync(Lcom/android/server/backup/transport/TransportConnectionListener;Ljava/lang/String;)V
+PLcom/android/server/backup/transport/TransportClient;->connectOrThrow(Ljava/lang/String;)Lcom/android/internal/backup/IBackupTransport;
+PLcom/android/server/backup/transport/TransportClient;->finalize()V
+PLcom/android/server/backup/transport/TransportClient;->lambda$connect$0(Ljava/util/concurrent/CompletableFuture;Lcom/android/internal/backup/IBackupTransport;Lcom/android/server/backup/transport/TransportClient;)V
+PLcom/android/server/backup/transport/TransportClient;->lambda$notifyListener$1(Lcom/android/server/backup/transport/TransportClient;Lcom/android/server/backup/transport/TransportConnectionListener;Lcom/android/internal/backup/IBackupTransport;)V
+PLcom/android/server/backup/transport/TransportClient;->log(ILjava/lang/String;)V
+PLcom/android/server/backup/transport/TransportClient;->log(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/backup/transport/TransportClient;->markAsDisposed()V
+PLcom/android/server/backup/transport/TransportClient;->notifyListener(Lcom/android/server/backup/transport/TransportConnectionListener;Lcom/android/internal/backup/IBackupTransport;Ljava/lang/String;)V
+PLcom/android/server/backup/transport/TransportClient;->notifyListenersAndClearLocked(Lcom/android/internal/backup/IBackupTransport;)V
+PLcom/android/server/backup/transport/TransportClient;->onServiceConnected(Landroid/os/IBinder;)V
+PLcom/android/server/backup/transport/TransportClient;->onStateTransition(II)V
+PLcom/android/server/backup/transport/TransportClient;->setStateLocked(ILcom/android/internal/backup/IBackupTransport;)V
+PLcom/android/server/backup/transport/TransportClient;->stateToString(I)Ljava/lang/String;
+PLcom/android/server/backup/transport/TransportClient;->toString()Ljava/lang/String;
+PLcom/android/server/backup/transport/TransportClient;->transitionThroughState(III)I
+PLcom/android/server/backup/transport/TransportClient;->unbind(Ljava/lang/String;)V
+PLcom/android/server/backup/transport/TransportClientManager;-><init>(Landroid/content/Context;Lcom/android/server/backup/transport/TransportStats;)V
+PLcom/android/server/backup/transport/TransportClientManager;->disposeOfTransportClient(Lcom/android/server/backup/transport/TransportClient;Ljava/lang/String;)V
+PLcom/android/server/backup/transport/TransportClientManager;->getTransportClient(Landroid/content/ComponentName;Landroid/os/Bundle;Ljava/lang/String;)Lcom/android/server/backup/transport/TransportClient;
+PLcom/android/server/backup/transport/TransportClientManager;->getTransportClient(Landroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/backup/transport/TransportClient;
+PLcom/android/server/backup/transport/TransportClientManager;->getTransportClient(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;)Lcom/android/server/backup/transport/TransportClient;
+PLcom/android/server/backup/transport/TransportStats$Stats;-><init>()V
+PLcom/android/server/backup/transport/TransportStats$Stats;->access$000(Lcom/android/server/backup/transport/TransportStats$Stats;J)V
+PLcom/android/server/backup/transport/TransportStats$Stats;->register(J)V
+PLcom/android/server/backup/transport/TransportStats;-><init>()V
+PLcom/android/server/backup/transport/TransportStats;->registerConnectionTime(Landroid/content/ComponentName;J)V
+PLcom/android/server/backup/transport/TransportUtils;->checkTransportNotNull(Lcom/android/internal/backup/IBackupTransport;)Lcom/android/internal/backup/IBackupTransport;
+PLcom/android/server/backup/transport/TransportUtils;->formatMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/backup/utils/AppBackupUtils;->appGetsFullBackup(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/backup/utils/AppBackupUtils;->appIsDisabled(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/PackageManager;)Z
+PLcom/android/server/backup/utils/AppBackupUtils;->appIsEligibleForBackup(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/PackageManager;)Z
+PLcom/android/server/backup/utils/AppBackupUtils;->appIsStopped(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/backup/utils/BackupManagerMonitorUtils;->monitorEvent(Landroid/app/backup/IBackupManagerMonitor;ILandroid/content/pm/PackageInfo;ILandroid/os/Bundle;)Landroid/app/backup/IBackupManagerMonitor;
+PLcom/android/server/backup/utils/BackupManagerMonitorUtils;->putMonitoringExtra(Landroid/os/Bundle;Ljava/lang/String;J)Landroid/os/Bundle;
+PLcom/android/server/backup/utils/BackupObserverUtils;->sendBackupFinished(Landroid/app/backup/IBackupObserver;I)V
+PLcom/android/server/backup/utils/BackupObserverUtils;->sendBackupOnPackageResult(Landroid/app/backup/IBackupObserver;Ljava/lang/String;I)V
+PLcom/android/server/backup/utils/DataStreamFileCodec;-><init>(Ljava/io/File;Lcom/android/server/backup/utils/DataStreamCodec;)V
+PLcom/android/server/backup/utils/DataStreamFileCodec;->deserialize()Ljava/lang/Object;
+PLcom/android/server/backup/utils/FullBackupUtils;->routeSocketDataToOutput(Landroid/os/ParcelFileDescriptor;Ljava/io/OutputStream;)V
+PLcom/android/server/backup/utils/FullBackupUtils;->writeAppManifest(Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageManager;Ljava/io/File;ZZ)V
+PLcom/android/server/camera/CameraServiceProxy$1;-><init>(Lcom/android/server/camera/CameraServiceProxy;)V
+PLcom/android/server/camera/CameraServiceProxy$2;-><init>(Lcom/android/server/camera/CameraServiceProxy;)V
+PLcom/android/server/camera/CameraServiceProxy;-><init>(Landroid/content/Context;)V
+PLcom/android/server/camera/CameraServiceProxy;->getEnabledUserHandles(I)Ljava/util/Set;
+PLcom/android/server/camera/CameraServiceProxy;->notifyMediaserverLocked(ILjava/util/Set;)Z
+PLcom/android/server/camera/CameraServiceProxy;->onStart()V
+PLcom/android/server/camera/CameraServiceProxy;->onStartUser(I)V
+PLcom/android/server/camera/CameraServiceProxy;->switchUserLocked(I)V
+PLcom/android/server/camera/CameraServiceProxy;->toArray(Ljava/util/Collection;)[I
+PLcom/android/server/camera/CameraStatsJobService;->schedule(Landroid/content/Context;)V
+PLcom/android/server/clipboard/ClipboardService$ClipboardImpl;-><init>(Lcom/android/server/clipboard/ClipboardService;)V
+PLcom/android/server/clipboard/ClipboardService$ClipboardImpl;-><init>(Lcom/android/server/clipboard/ClipboardService;Lcom/android/server/clipboard/ClipboardService$1;)V
+PLcom/android/server/clipboard/ClipboardService$ClipboardImpl;->addPrimaryClipChangedListener(Landroid/content/IOnPrimaryClipChangedListener;Ljava/lang/String;)V
+PLcom/android/server/clipboard/ClipboardService$ClipboardImpl;->hasPrimaryClip(Ljava/lang/String;)Z
+PLcom/android/server/clipboard/ClipboardService$ClipboardImpl;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/clipboard/ClipboardService$ListenerInfo;-><init>(Lcom/android/server/clipboard/ClipboardService;ILjava/lang/String;)V
+PLcom/android/server/clipboard/ClipboardService$PerUserClipboard;-><init>(Lcom/android/server/clipboard/ClipboardService;I)V
+PLcom/android/server/clipboard/ClipboardService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/clipboard/ClipboardService;->access$300(Lcom/android/server/clipboard/ClipboardService;ILjava/lang/String;I)Z
+PLcom/android/server/clipboard/ClipboardService;->access$500(Lcom/android/server/clipboard/ClipboardService;)Z
+PLcom/android/server/clipboard/ClipboardService;->access$700(Lcom/android/server/clipboard/ClipboardService;)Lcom/android/server/clipboard/ClipboardService$PerUserClipboard;
+PLcom/android/server/clipboard/ClipboardService;->clipboardAccessAllowed(ILjava/lang/String;I)Z
+PLcom/android/server/clipboard/ClipboardService;->getClipboard()Lcom/android/server/clipboard/ClipboardService$PerUserClipboard;
+PLcom/android/server/clipboard/ClipboardService;->getClipboard(I)Lcom/android/server/clipboard/ClipboardService$PerUserClipboard;
+PLcom/android/server/clipboard/ClipboardService;->isDeviceLocked()Z
+PLcom/android/server/clipboard/ClipboardService;->onStart()V
+PLcom/android/server/companion/-$$Lambda$CompanionDeviceManagerService$CompanionDeviceManagerImpl$bdv3Vfadbb8b9nrSgkARO4oYOXU;-><init>()V
+PLcom/android/server/companion/-$$Lambda$CompanionDeviceManagerService$bh5xRJq9-CRJoXvmerYRNjK1xEQ;-><init>()V
+PLcom/android/server/companion/-$$Lambda$CompanionDeviceManagerService$bh5xRJq9-CRJoXvmerYRNjK1xEQ;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/companion/CompanionDeviceManagerService$1;-><init>(Lcom/android/server/companion/CompanionDeviceManagerService;)V
+PLcom/android/server/companion/CompanionDeviceManagerService$1;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;-><init>(Lcom/android/server/companion/CompanionDeviceManagerService;)V
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->checkCallerIsSystemOr(Ljava/lang/String;I)V
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->checkUsesFeature(Ljava/lang/String;I)V
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->getAssociations(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/companion/CompanionDeviceManagerService$CompanionDeviceManagerImpl;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/companion/CompanionDeviceManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/companion/CompanionDeviceManagerService;->access$100(Lcom/android/server/companion/CompanionDeviceManagerService;ILjava/lang/String;)Ljava/util/Set;
+PLcom/android/server/companion/CompanionDeviceManagerService;->access$1000()Z
+PLcom/android/server/companion/CompanionDeviceManagerService;->access$300()I
+PLcom/android/server/companion/CompanionDeviceManagerService;->getStorageFileForUser(I)Landroid/util/AtomicFile;
+PLcom/android/server/companion/CompanionDeviceManagerService;->lambda$getStorageFileForUser$5(Ljava/lang/Integer;)Landroid/util/AtomicFile;
+PLcom/android/server/companion/CompanionDeviceManagerService;->onStart()V
+PLcom/android/server/companion/CompanionDeviceManagerService;->readAllAssociations(ILjava/lang/String;)Ljava/util/Set;
+PLcom/android/server/companion/CompanionDeviceManagerService;->registerPackageMonitor()V
+PLcom/android/server/connectivity/-$$Lambda$IpConnectivityMetrics$B0oR30xfeM300kIzUVaV_zUNLCg;-><init>()V
+PLcom/android/server/connectivity/-$$Lambda$IpConnectivityMetrics$B0oR30xfeM300kIzUVaV_zUNLCg;->applyAsInt(Ljava/lang/Object;)I
+PLcom/android/server/connectivity/-$$Lambda$MultipathPolicyTracker$2$dvyDLfu9d6g2XoEdL3QMHx7ut6k;-><init>(Lcom/android/server/connectivity/MultipathPolicyTracker$2;)V
+PLcom/android/server/connectivity/-$$Lambda$MultipathPolicyTracker$2$dvyDLfu9d6g2XoEdL3QMHx7ut6k;->run()V
+PLcom/android/server/connectivity/-$$Lambda$Tethering$5JkghhOVq1MW7iK03DMZUSuLdFM;-><init>(Lcom/android/server/connectivity/Tethering;)V
+PLcom/android/server/connectivity/-$$Lambda$Tethering$5JkghhOVq1MW7iK03DMZUSuLdFM;->accept(Ljava/lang/Object;)V
+PLcom/android/server/connectivity/-$$Lambda$Tethering$G9TtPVJE34-mHCiIrkFoFBxZRf8;-><init>(Lcom/android/server/connectivity/Tethering;)V
+PLcom/android/server/connectivity/DataConnectionStats$1;-><init>(Lcom/android/server/connectivity/DataConnectionStats;)V
+PLcom/android/server/connectivity/DataConnectionStats$1;->onDataActivity(I)V
+PLcom/android/server/connectivity/DataConnectionStats$1;->onDataConnectionStateChanged(II)V
+PLcom/android/server/connectivity/DataConnectionStats$1;->onServiceStateChanged(Landroid/telephony/ServiceState;)V
+PLcom/android/server/connectivity/DataConnectionStats$1;->onSignalStrengthsChanged(Landroid/telephony/SignalStrength;)V
+PLcom/android/server/connectivity/DataConnectionStats;-><init>(Landroid/content/Context;)V
+PLcom/android/server/connectivity/DataConnectionStats;->access$002(Lcom/android/server/connectivity/DataConnectionStats;Landroid/telephony/SignalStrength;)Landroid/telephony/SignalStrength;
+PLcom/android/server/connectivity/DataConnectionStats;->access$102(Lcom/android/server/connectivity/DataConnectionStats;Landroid/telephony/ServiceState;)Landroid/telephony/ServiceState;
+PLcom/android/server/connectivity/DataConnectionStats;->access$200(Lcom/android/server/connectivity/DataConnectionStats;)V
+PLcom/android/server/connectivity/DataConnectionStats;->access$302(Lcom/android/server/connectivity/DataConnectionStats;I)I
+PLcom/android/server/connectivity/DataConnectionStats;->hasService()Z
+PLcom/android/server/connectivity/DataConnectionStats;->notePhoneDataConnectionState()V
+PLcom/android/server/connectivity/DataConnectionStats;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/DataConnectionStats;->startMonitoring()V
+PLcom/android/server/connectivity/DataConnectionStats;->updateSimState(Landroid/content/Intent;)V
+PLcom/android/server/connectivity/DefaultNetworkMetrics;-><init>()V
+PLcom/android/server/connectivity/DefaultNetworkMetrics;->fillLinkInfo(Landroid/net/metrics/DefaultNetworkEvent;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/DefaultNetworkMetrics;->flushEvents(Ljava/util/List;)V
+PLcom/android/server/connectivity/DefaultNetworkMetrics;->logCurrentDefaultNetwork(JLcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/DefaultNetworkMetrics;->logDefaultNetworkEvent(JLcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/DefaultNetworkMetrics;->logDefaultNetworkValidity(JZ)V
+PLcom/android/server/connectivity/DefaultNetworkMetrics;->newDefaultNetwork(JLcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/DefaultNetworkMetrics;->updateValidationTime(J)V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsConfig;-><init>()V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsConfig;-><init>(Z)V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsConfig;->inStrictMode()Z
+PLcom/android/server/connectivity/DnsManager$PrivateDnsConfig;->toString()Ljava/lang/String;
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses$ValidationStatus;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;-><init>()V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;-><init>(Lcom/android/server/connectivity/DnsManager$1;)V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;->access$000(Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;)Z
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;->access$200(Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationUpdate;)V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;->access$400(Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;[Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;->hasValidatedServer()Z
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;->updateStatus(Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationUpdate;)V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationStatuses;->updateTrackedDnses([Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/connectivity/DnsManager$PrivateDnsValidationUpdate;-><init>(ILjava/net/InetAddress;Ljava/lang/String;Z)V
+PLcom/android/server/connectivity/DnsManager;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Lcom/android/server/connectivity/MockableSystemProperties;)V
+PLcom/android/server/connectivity/DnsManager;->flushVmDnsCache()V
+PLcom/android/server/connectivity/DnsManager;->getDomainStrings(Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/connectivity/DnsManager;->getIntSetting(Ljava/lang/String;I)I
+PLcom/android/server/connectivity/DnsManager;->getPrivateDnsConfig()Lcom/android/server/connectivity/DnsManager$PrivateDnsConfig;
+PLcom/android/server/connectivity/DnsManager;->getPrivateDnsConfig(Landroid/content/ContentResolver;)Lcom/android/server/connectivity/DnsManager$PrivateDnsConfig;
+PLcom/android/server/connectivity/DnsManager;->getPrivateDnsMode(Landroid/content/ContentResolver;)Ljava/lang/String;
+PLcom/android/server/connectivity/DnsManager;->getPrivateDnsSettingsUris()[Landroid/net/Uri;
+PLcom/android/server/connectivity/DnsManager;->getStringSetting(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/connectivity/DnsManager;->removeNetwork(Landroid/net/Network;)V
+PLcom/android/server/connectivity/DnsManager;->setDefaultDnsSystemProperties(Ljava/util/Collection;)V
+PLcom/android/server/connectivity/DnsManager;->setDnsConfigurationForNetwork(ILandroid/net/LinkProperties;Z)V
+PLcom/android/server/connectivity/DnsManager;->setNetDnsProperty(ILjava/lang/String;)V
+PLcom/android/server/connectivity/DnsManager;->updateParametersSettings()V
+PLcom/android/server/connectivity/DnsManager;->updatePrivateDns(Landroid/net/Network;Lcom/android/server/connectivity/DnsManager$PrivateDnsConfig;)Lcom/android/server/connectivity/DnsManager$PrivateDnsConfig;
+PLcom/android/server/connectivity/DnsManager;->updatePrivateDnsStatus(ILandroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/DnsManager;->updatePrivateDnsValidation(Lcom/android/server/connectivity/DnsManager$PrivateDnsValidationUpdate;)V
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->buildEvent(IJLjava/lang/String;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->bytesToInts([B)[I
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->ifnameToLinkLayer(Ljava/lang/String;)I
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->inferLinkLayer(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;)V
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->ipSupportOf(Landroid/net/metrics/DefaultNetworkEvent;)I
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->serialize(ILjava/util/List;)[B
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->setDhcpClientEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;Landroid/net/metrics/DhcpClientEvent;)V
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->setEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;Landroid/os/Parcelable;)Z
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->setIpManagerEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;Landroid/net/metrics/IpManagerEvent;)V
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->setIpReachabilityEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;Landroid/net/metrics/IpReachabilityEvent;)V
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->setNetworkEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;Landroid/net/metrics/NetworkEvent;)V
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->setValidationProbeEvent(Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;Landroid/net/metrics/ValidationProbeEvent;)V
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->toPairArray(Landroid/util/SparseIntArray;)[Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$Pair;
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->toProto(Landroid/net/ConnectivityMetricsEvent;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->toProto(Landroid/net/metrics/ConnectStats;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->toProto(Landroid/net/metrics/DefaultNetworkEvent;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->toProto(Landroid/net/metrics/DnsEvent;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->toProto(Landroid/net/metrics/WakeupStats;)Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->toProto(Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->transportToLinkLayer(I)I
+PLcom/android/server/connectivity/IpConnectivityEventBuilder;->transportsToLinkLayer(J)I
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;-><init>(Lcom/android/server/connectivity/IpConnectivityMetrics;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->addNetdEventCallback(ILandroid/net/INetdEventCallback;)Z
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->enforceConnectivityInternalPermission()V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->enforceDumpPermission()V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->enforceNetdEventListeningPermission()V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->enforcePermission(Ljava/lang/String;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics$Impl;->logEvent(Landroid/net/ConnectivityMetricsEvent;)I
+PLcom/android/server/connectivity/IpConnectivityMetrics$LoggerImpl;-><init>(Lcom/android/server/connectivity/IpConnectivityMetrics;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics$LoggerImpl;-><init>(Lcom/android/server/connectivity/IpConnectivityMetrics;Lcom/android/server/connectivity/IpConnectivityMetrics$1;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics$LoggerImpl;->defaultNetworkMetrics()Lcom/android/server/connectivity/DefaultNetworkMetrics;
+PLcom/android/server/connectivity/IpConnectivityMetrics;-><init>(Landroid/content/Context;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics;-><init>(Landroid/content/Context;Ljava/util/function/ToIntFunction;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics;->access$100(Lcom/android/server/connectivity/IpConnectivityMetrics;Landroid/net/ConnectivityMetricsEvent;)I
+PLcom/android/server/connectivity/IpConnectivityMetrics;->access$200(Lcom/android/server/connectivity/IpConnectivityMetrics;Ljava/io/PrintWriter;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics;->append(Landroid/net/ConnectivityMetricsEvent;)I
+PLcom/android/server/connectivity/IpConnectivityMetrics;->bufferCapacity()I
+PLcom/android/server/connectivity/IpConnectivityMetrics;->cmdFlush(Ljava/io/PrintWriter;)V
+PLcom/android/server/connectivity/IpConnectivityMetrics;->flushEncodedOutput()Ljava/lang/String;
+PLcom/android/server/connectivity/IpConnectivityMetrics;->initBuffer()V
+PLcom/android/server/connectivity/IpConnectivityMetrics;->isRateLimited(Landroid/net/ConnectivityMetricsEvent;)Z
+PLcom/android/server/connectivity/IpConnectivityMetrics;->lambda$static$0(Landroid/content/Context;)I
+PLcom/android/server/connectivity/IpConnectivityMetrics;->makeRateLimitingBuckets()Landroid/util/ArrayMap;
+PLcom/android/server/connectivity/IpConnectivityMetrics;->onBootPhase(I)V
+PLcom/android/server/connectivity/IpConnectivityMetrics;->onStart()V
+PLcom/android/server/connectivity/KeepaliveTracker;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/connectivity/KeepaliveTracker;->handleCheckKeepalivesStillValid(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/KeepaliveTracker;->handleStopAllKeepalives(Lcom/android/server/connectivity/NetworkAgentInfo;I)V
+PLcom/android/server/connectivity/LingerMonitor;-><init>(Landroid/content/Context;Lcom/android/server/connectivity/NetworkNotificationManager;IJ)V
+PLcom/android/server/connectivity/LingerMonitor;->getNotificationSource(Lcom/android/server/connectivity/NetworkAgentInfo;)I
+PLcom/android/server/connectivity/LingerMonitor;->makeTransportToNameMap()Ljava/util/HashMap;
+PLcom/android/server/connectivity/LingerMonitor;->maybeStopNotifying(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/LingerMonitor;->noteDisconnect(Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/MockableSystemProperties;-><init>()V
+PLcom/android/server/connectivity/MockableSystemProperties;->get(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/connectivity/MockableSystemProperties;->getBoolean(Ljava/lang/String;Z)Z
+PLcom/android/server/connectivity/MockableSystemProperties;->getInt(Ljava/lang/String;I)I
+PLcom/android/server/connectivity/MockableSystemProperties;->set(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker$1;-><init>(Lcom/android/server/connectivity/MultipathPolicyTracker;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker$2;-><init>(Lcom/android/server/connectivity/MultipathPolicyTracker;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker$2;->lambda$onMeteredIfacesChanged$0(Lcom/android/server/connectivity/MultipathPolicyTracker$2;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker$2;->onMeteredIfacesChanged([Ljava/lang/String;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker$ConfigChangeReceiver;-><init>(Lcom/android/server/connectivity/MultipathPolicyTracker;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker$ConfigChangeReceiver;-><init>(Lcom/android/server/connectivity/MultipathPolicyTracker;Lcom/android/server/connectivity/MultipathPolicyTracker$1;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker$ConfigChangeReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker$Dependencies;-><init>()V
+PLcom/android/server/connectivity/MultipathPolicyTracker$Dependencies;->getClock()Ljava/time/Clock;
+PLcom/android/server/connectivity/MultipathPolicyTracker$SettingsObserver;-><init>(Lcom/android/server/connectivity/MultipathPolicyTracker;Landroid/os/Handler;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/connectivity/MultipathPolicyTracker$Dependencies;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker;->access$1200(Lcom/android/server/connectivity/MultipathPolicyTracker;)V
+PLcom/android/server/connectivity/MultipathPolicyTracker;->access$900(Lcom/android/server/connectivity/MultipathPolicyTracker;)Landroid/os/Handler;
+PLcom/android/server/connectivity/MultipathPolicyTracker;->registerNetworkPolicyListener()V
+PLcom/android/server/connectivity/MultipathPolicyTracker;->registerTrackMobileCallback()V
+PLcom/android/server/connectivity/MultipathPolicyTracker;->start()V
+PLcom/android/server/connectivity/MultipathPolicyTracker;->updateAllMultipathBudgets()V
+PLcom/android/server/connectivity/Nat464Xlat$State;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/connectivity/Nat464Xlat;-><init>(Landroid/os/INetworkManagementService;Lcom/android/server/connectivity/NetworkAgentInfo;)V
+PLcom/android/server/connectivity/Nat464Xlat;->enterIdleState()V
+PLcom/android/server/connectivity/Nat464Xlat;->enterStartingState(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Nat464Xlat;->enterStoppingState()V
+PLcom/android/server/connectivity/Nat464Xlat;->fixupLinkProperties(Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/Nat464Xlat;->isRunning()Z
+PLcom/android/server/connectivity/Nat464Xlat;->isStarted()Z
+PLcom/android/server/connectivity/Nat464Xlat;->isStarting()Z
+PLcom/android/server/connectivity/Nat464Xlat;->requiresClat(Lcom/android/server/connectivity/NetworkAgentInfo;)Z
+PLcom/android/server/connectivity/Nat464Xlat;->start()V
+PLcom/android/server/connectivity/Nat464Xlat;->stop()V
+PLcom/android/server/connectivity/Nat464Xlat;->toString()Ljava/lang/String;
+PLcom/android/server/connectivity/NetdEventListenerService$NetworkMetricsSnapshot;-><init>()V
+PLcom/android/server/connectivity/NetdEventListenerService$NetworkMetricsSnapshot;->collect(JLandroid/util/SparseArray;)Lcom/android/server/connectivity/NetdEventListenerService$NetworkMetricsSnapshot;
+PLcom/android/server/connectivity/NetdEventListenerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/connectivity/NetdEventListenerService;-><init>(Landroid/net/ConnectivityManager;)V
+PLcom/android/server/connectivity/NetdEventListenerService;->addNetdEventCallback(ILandroid/net/INetdEventCallback;)Z
+PLcom/android/server/connectivity/NetdEventListenerService;->addWakeupEvent(Landroid/net/metrics/WakeupEvent;)V
+PLcom/android/server/connectivity/NetdEventListenerService;->collectPendingMetricsSnapshot(J)V
+PLcom/android/server/connectivity/NetdEventListenerService;->flushStatistics(Ljava/util/List;)V
+PLcom/android/server/connectivity/NetdEventListenerService;->getMetricsForNetwork(JI)Landroid/net/metrics/NetworkMetrics;
+PLcom/android/server/connectivity/NetdEventListenerService;->getTransports(I)J
+PLcom/android/server/connectivity/NetdEventListenerService;->isValidCallerType(I)Z
+PLcom/android/server/connectivity/NetdEventListenerService;->onPrivateDnsValidationEvent(ILjava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/connectivity/NetdEventListenerService;->onWakeupEvent(Ljava/lang/String;III[BLjava/lang/String;Ljava/lang/String;IIJ)V
+PLcom/android/server/connectivity/NetdEventListenerService;->projectSnapshotTime(J)J
+PLcom/android/server/connectivity/NetworkAgentInfo;-><init>(Landroid/os/Messenger;Lcom/android/internal/util/AsyncChannel;Landroid/net/Network;Landroid/net/NetworkInfo;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;ILandroid/content/Context;Landroid/os/Handler;Landroid/net/NetworkMisc;Landroid/net/NetworkRequest;Lcom/android/server/ConnectivityService;)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->addRequest(Landroid/net/NetworkRequest;)Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->clearLingerState()V
+PLcom/android/server/connectivity/NetworkAgentInfo;->getCurrentScore()I
+PLcom/android/server/connectivity/NetworkAgentInfo;->getCurrentScore(Z)I
+PLcom/android/server/connectivity/NetworkAgentInfo;->ignoreWifiUnvalidationPenalty()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->isBackgroundNetwork()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->isLingering()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->isSuspended()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->isVPN()Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->maybeStartClat(Landroid/os/INetworkManagementService;)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->maybeStopClat()V
+PLcom/android/server/connectivity/NetworkAgentInfo;->name()Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkAgentInfo;->network()Landroid/net/Network;
+PLcom/android/server/connectivity/NetworkAgentInfo;->numForegroundNetworkRequests()I
+PLcom/android/server/connectivity/NetworkAgentInfo;->numRequestNetworkRequests()I
+PLcom/android/server/connectivity/NetworkAgentInfo;->removeRequest(I)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->setCurrentScore(I)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->toString()Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkAgentInfo;->unlingerRequest(Landroid/net/NetworkRequest;)Z
+PLcom/android/server/connectivity/NetworkAgentInfo;->updateClat(Landroid/os/INetworkManagementService;)V
+PLcom/android/server/connectivity/NetworkAgentInfo;->updateLingerTimer()V
+PLcom/android/server/connectivity/NetworkAgentInfo;->updateRequestCounts(ZLandroid/net/NetworkRequest;)V
+PLcom/android/server/connectivity/NetworkMonitor$1ProbeThread;-><init>(Lcom/android/server/connectivity/NetworkMonitor;ZLandroid/net/ProxyInfo;Ljava/net/URL;Ljava/net/URL;Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/connectivity/NetworkMonitor$1ProbeThread;->result()Landroid/net/captiveportal/CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor$1ProbeThread;->run()V
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$1;)V
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalState;->enter()V
+PLcom/android/server/connectivity/NetworkMonitor$CaptivePortalState;->exit()V
+PLcom/android/server/connectivity/NetworkMonitor$CustomIntentReceiver;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Ljava/lang/String;II)V
+PLcom/android/server/connectivity/NetworkMonitor$CustomIntentReceiver;->getPendingIntent()Landroid/app/PendingIntent;
+PLcom/android/server/connectivity/NetworkMonitor$CustomIntentReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/NetworkMonitor$DefaultNetworkMonitorSettings;-><init>()V
+PLcom/android/server/connectivity/NetworkMonitor$DefaultNetworkMonitorSettings;->getSetting(Landroid/content/Context;Ljava/lang/String;I)I
+PLcom/android/server/connectivity/NetworkMonitor$DefaultNetworkMonitorSettings;->getSetting(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor$DefaultState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$DefaultState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$1;)V
+PLcom/android/server/connectivity/NetworkMonitor$DefaultState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingPrivateDnsState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingPrivateDnsState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$1;)V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingPrivateDnsState;->enter()V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingPrivateDnsState;->inStrictMode()Z
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingPrivateDnsState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$1;)V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;->enter()V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;->exit()V
+PLcom/android/server/connectivity/NetworkMonitor$EvaluatingState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/NetworkMonitor$EvaluationResult;-><init>(Ljava/lang/String;IZ)V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState$1;-><init>(Lcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;)V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState$1;->appResponse(I)V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$1;)V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;->exit()V
+PLcom/android/server/connectivity/NetworkMonitor$MaybeNotifyState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/NetworkMonitor$OneAddressPerFamilyNetwork;-><init>(Landroid/net/Network;)V
+PLcom/android/server/connectivity/NetworkMonitor$OneAddressPerFamilyNetwork;->getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;
+PLcom/android/server/connectivity/NetworkMonitor$ValidatedState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;)V
+PLcom/android/server/connectivity/NetworkMonitor$ValidatedState;-><init>(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$1;)V
+PLcom/android/server/connectivity/NetworkMonitor$ValidatedState;->enter()V
+PLcom/android/server/connectivity/NetworkMonitor$ValidatedState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/NetworkMonitor$ValidationStage;-><init>(Ljava/lang/String;IZ)V
+PLcom/android/server/connectivity/NetworkMonitor;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkRequest;)V
+PLcom/android/server/connectivity/NetworkMonitor;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/net/NetworkRequest;Landroid/net/metrics/IpConnectivityLog;Lcom/android/server/connectivity/NetworkMonitor$NetworkMonitorSettings;)V
+PLcom/android/server/connectivity/NetworkMonitor;->access$1000(Lcom/android/server/connectivity/NetworkMonitor;)I
+PLcom/android/server/connectivity/NetworkMonitor;->access$1002(Lcom/android/server/connectivity/NetworkMonitor;I)I
+PLcom/android/server/connectivity/NetworkMonitor;->access$1102(Lcom/android/server/connectivity/NetworkMonitor;Z)Z
+PLcom/android/server/connectivity/NetworkMonitor;->access$1200(Lcom/android/server/connectivity/NetworkMonitor;)Z
+PLcom/android/server/connectivity/NetworkMonitor;->access$1300(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/internal/util/State;
+PLcom/android/server/connectivity/NetworkMonitor;->access$1400(Lcom/android/server/connectivity/NetworkMonitor;)Z
+PLcom/android/server/connectivity/NetworkMonitor;->access$1500(Lcom/android/server/connectivity/NetworkMonitor;Ljava/lang/Object;)V
+PLcom/android/server/connectivity/NetworkMonitor;->access$1600(Lcom/android/server/connectivity/NetworkMonitor;)Z
+PLcom/android/server/connectivity/NetworkMonitor;->access$1700(Lcom/android/server/connectivity/NetworkMonitor;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->access$1702(Lcom/android/server/connectivity/NetworkMonitor;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->access$1800(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;
+PLcom/android/server/connectivity/NetworkMonitor;->access$1900(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;Lcom/android/server/connectivity/NetworkMonitor$EvaluationResult;)I
+PLcom/android/server/connectivity/NetworkMonitor;->access$2000(Lcom/android/server/connectivity/NetworkMonitor;I)V
+PLcom/android/server/connectivity/NetworkMonitor;->access$2100(Lcom/android/server/connectivity/NetworkMonitor;)I
+PLcom/android/server/connectivity/NetworkMonitor;->access$2200(Lcom/android/server/connectivity/NetworkMonitor;)Landroid/os/Handler;
+PLcom/android/server/connectivity/NetworkMonitor;->access$2308(Lcom/android/server/connectivity/NetworkMonitor;)I
+PLcom/android/server/connectivity/NetworkMonitor;->access$2400(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/internal/util/State;
+PLcom/android/server/connectivity/NetworkMonitor;->access$2500(Lcom/android/server/connectivity/NetworkMonitor;)Landroid/net/Network;
+PLcom/android/server/connectivity/NetworkMonitor;->access$2600(Lcom/android/server/connectivity/NetworkMonitor;)Landroid/net/captiveportal/CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->access$2602(Lcom/android/server/connectivity/NetworkMonitor;Landroid/net/captiveportal/CaptivePortalProbeResult;)Landroid/net/captiveportal/CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->access$2700(Lcom/android/server/connectivity/NetworkMonitor;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->access$2800(Lcom/android/server/connectivity/NetworkMonitor;)Landroid/net/util/Stopwatch;
+PLcom/android/server/connectivity/NetworkMonitor;->access$2900(Lcom/android/server/connectivity/NetworkMonitor;)I
+PLcom/android/server/connectivity/NetworkMonitor;->access$2904(Lcom/android/server/connectivity/NetworkMonitor;)I
+PLcom/android/server/connectivity/NetworkMonitor;->access$3100(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/internal/util/State;
+PLcom/android/server/connectivity/NetworkMonitor;->access$3200(Lcom/android/server/connectivity/NetworkMonitor;I)V
+PLcom/android/server/connectivity/NetworkMonitor;->access$3400(Lcom/android/server/connectivity/NetworkMonitor;Landroid/net/ProxyInfo;Ljava/net/URL;I)Landroid/net/captiveportal/CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->access$600(Lcom/android/server/connectivity/NetworkMonitor;I)V
+PLcom/android/server/connectivity/NetworkMonitor;->access$700(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/internal/util/State;
+PLcom/android/server/connectivity/NetworkMonitor;->access$800(Lcom/android/server/connectivity/NetworkMonitor;)Lcom/android/server/connectivity/NetworkMonitor$CustomIntentReceiver;
+PLcom/android/server/connectivity/NetworkMonitor;->access$802(Lcom/android/server/connectivity/NetworkMonitor;Lcom/android/server/connectivity/NetworkMonitor$CustomIntentReceiver;)Lcom/android/server/connectivity/NetworkMonitor$CustomIntentReceiver;
+PLcom/android/server/connectivity/NetworkMonitor;->access$900(Lcom/android/server/connectivity/NetworkMonitor;)Landroid/content/Context;
+PLcom/android/server/connectivity/NetworkMonitor;->getCaptivePortalServerHttpUrl(Lcom/android/server/connectivity/NetworkMonitor$NetworkMonitorSettings;Landroid/content/Context;)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->getCaptivePortalServerHttpsUrl()Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->getCaptivePortalUserAgent()Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkMonitor;->getIsCaptivePortalCheckEnabled()Z
+PLcom/android/server/connectivity/NetworkMonitor;->getUseHttpsValidation()Z
+PLcom/android/server/connectivity/NetworkMonitor;->getValidationLogs()Landroid/util/LocalLog$ReadOnlyLocalLog;
+PLcom/android/server/connectivity/NetworkMonitor;->getWifiScansAlwaysAvailableDisabled()Z
+PLcom/android/server/connectivity/NetworkMonitor;->isCaptivePortal()Landroid/net/captiveportal/CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->isValidationRequired()Z
+PLcom/android/server/connectivity/NetworkMonitor;->isValidationRequired(Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;)Z
+PLcom/android/server/connectivity/NetworkMonitor;->log(Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor;->logNetworkEvent(I)V
+PLcom/android/server/connectivity/NetworkMonitor;->logValidationProbe(JII)V
+PLcom/android/server/connectivity/NetworkMonitor;->makeCaptivePortalFallbackProbeSpecs()[Landroid/net/captiveportal/CaptivePortalProbeSpec;
+PLcom/android/server/connectivity/NetworkMonitor;->makeCaptivePortalFallbackUrls()[Ljava/net/URL;
+PLcom/android/server/connectivity/NetworkMonitor;->makeURL(Ljava/lang/String;)Ljava/net/URL;
+PLcom/android/server/connectivity/NetworkMonitor;->maybeLogEvaluationResult(I)V
+PLcom/android/server/connectivity/NetworkMonitor;->networkEventType(Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;Lcom/android/server/connectivity/NetworkMonitor$EvaluationResult;)I
+PLcom/android/server/connectivity/NetworkMonitor;->notifyNetworkTestResultInvalid(Ljava/lang/Object;)V
+PLcom/android/server/connectivity/NetworkMonitor;->notifyPrivateDnsSettingsChanged(Lcom/android/server/connectivity/DnsManager$PrivateDnsConfig;)V
+PLcom/android/server/connectivity/NetworkMonitor;->sendDnsAndHttpProbes(Landroid/net/ProxyInfo;Ljava/net/URL;I)Landroid/net/captiveportal/CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->sendDnsProbe(Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor;->sendHttpProbe(Ljava/net/URL;ILandroid/net/captiveportal/CaptivePortalProbeSpec;)Landroid/net/captiveportal/CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->sendNetworkConditionsBroadcast(ZZJJ)V
+PLcom/android/server/connectivity/NetworkMonitor;->sendParallelHttpProbes(Landroid/net/ProxyInfo;Ljava/net/URL;Ljava/net/URL;)Landroid/net/captiveportal/CaptivePortalProbeResult;
+PLcom/android/server/connectivity/NetworkMonitor;->validationLog(ILjava/lang/Object;Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor;->validationLog(Ljava/lang/String;)V
+PLcom/android/server/connectivity/NetworkMonitor;->validationStage()Lcom/android/server/connectivity/NetworkMonitor$ValidationStage;
+PLcom/android/server/connectivity/NetworkNotificationManager$NotificationType$Holder;->access$000()Landroid/util/SparseArray;
+PLcom/android/server/connectivity/NetworkNotificationManager$NotificationType;-><init>(Ljava/lang/String;II)V
+PLcom/android/server/connectivity/NetworkNotificationManager$NotificationType;->getFromId(I)Lcom/android/server/connectivity/NetworkNotificationManager$NotificationType;
+PLcom/android/server/connectivity/NetworkNotificationManager$NotificationType;->values()[Lcom/android/server/connectivity/NetworkNotificationManager$NotificationType;
+PLcom/android/server/connectivity/NetworkNotificationManager;-><init>(Landroid/content/Context;Landroid/telephony/TelephonyManager;Landroid/app/NotificationManager;)V
+PLcom/android/server/connectivity/NetworkNotificationManager;->clearNotification(I)V
+PLcom/android/server/connectivity/NetworkNotificationManager;->getFirstTransportType(Lcom/android/server/connectivity/NetworkAgentInfo;)I
+PLcom/android/server/connectivity/NetworkNotificationManager;->getIcon(I)I
+PLcom/android/server/connectivity/NetworkNotificationManager;->getTransportName(I)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkNotificationManager;->nameOf(I)Ljava/lang/String;
+PLcom/android/server/connectivity/NetworkNotificationManager;->priority(Lcom/android/server/connectivity/NetworkNotificationManager$NotificationType;)I
+PLcom/android/server/connectivity/NetworkNotificationManager;->showNotification(ILcom/android/server/connectivity/NetworkNotificationManager$NotificationType;Lcom/android/server/connectivity/NetworkAgentInfo;Lcom/android/server/connectivity/NetworkAgentInfo;Landroid/app/PendingIntent;Z)V
+PLcom/android/server/connectivity/NetworkNotificationManager;->tagFor(I)Ljava/lang/String;
+PLcom/android/server/connectivity/PacManager$1;-><init>(Lcom/android/server/connectivity/PacManager;)V
+PLcom/android/server/connectivity/PacManager$PacRefreshIntentReceiver;-><init>(Lcom/android/server/connectivity/PacManager;)V
+PLcom/android/server/connectivity/PacManager;-><init>(Landroid/content/Context;Landroid/os/Handler;I)V
+PLcom/android/server/connectivity/PermissionMonitor$1;-><init>(Lcom/android/server/connectivity/PermissionMonitor;)V
+PLcom/android/server/connectivity/PermissionMonitor$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/PermissionMonitor;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;)V
+PLcom/android/server/connectivity/PermissionMonitor;->access$200(Lcom/android/server/connectivity/PermissionMonitor;Ljava/lang/String;I)V
+PLcom/android/server/connectivity/PermissionMonitor;->access$300(Lcom/android/server/connectivity/PermissionMonitor;I)V
+PLcom/android/server/connectivity/PermissionMonitor;->hasNetworkPermission(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/connectivity/PermissionMonitor;->hasRestrictedNetworkPermission(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/connectivity/PermissionMonitor;->hasUseBackgroundNetworksPermission(I)Z
+PLcom/android/server/connectivity/PermissionMonitor;->hasUseBackgroundNetworksPermission(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/connectivity/PermissionMonitor;->highestPermissionForUid(Ljava/lang/Boolean;Ljava/lang/String;)Ljava/lang/Boolean;
+PLcom/android/server/connectivity/PermissionMonitor;->isPreinstalledSystemApp(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/connectivity/PermissionMonitor;->log(Ljava/lang/String;)V
+PLcom/android/server/connectivity/PermissionMonitor;->onAppAdded(Ljava/lang/String;I)V
+PLcom/android/server/connectivity/PermissionMonitor;->onAppRemoved(I)V
+PLcom/android/server/connectivity/PermissionMonitor;->startMonitoring()V
+PLcom/android/server/connectivity/PermissionMonitor;->toIntArray(Ljava/util/List;)[I
+PLcom/android/server/connectivity/PermissionMonitor;->update(Ljava/util/Set;Ljava/util/Map;Z)V
+PLcom/android/server/connectivity/Tethering$3;-><init>(Lcom/android/server/connectivity/Tethering;Ljava/lang/String;)V
+PLcom/android/server/connectivity/Tethering$3;->updateInterfaceState(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;II)V
+PLcom/android/server/connectivity/Tethering$3;->updateLinkProperties(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;-><init>(Lcom/android/server/connectivity/Tethering;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;-><init>(Lcom/android/server/connectivity/Tethering;Lcom/android/server/connectivity/Tethering$1;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;->handleConnectivityAction(Landroid/content/Intent;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;->handleUsbAction(Landroid/content/Intent;)V
+PLcom/android/server/connectivity/Tethering$StateReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$ErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$InitialState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$InitialState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$OffloadWrapper;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$OffloadWrapper;->excludeDownstreamInterface(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$OffloadWrapper;->sendOffloadExemptPrefixes()V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$OffloadWrapper;->sendOffloadExemptPrefixes(Ljava/util/Set;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$SetDnsForwardersErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$SetIpForwardingDisabledErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$SetIpForwardingEnabledErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$StartTetheringErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$StopTetheringErrorState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM$TetherModeAliveState;-><init>(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM;-><init>(Lcom/android/server/connectivity/Tethering;Ljava/lang/String;Landroid/os/Looper;Lcom/android/server/connectivity/tethering/TetheringDependencies;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM;->access$1500(Lcom/android/server/connectivity/Tethering$TetherMasterSM;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/Tethering$TetherMasterSM;->access$2800(Lcom/android/server/connectivity/Tethering$TetherMasterSM;)Ljava/util/ArrayList;
+PLcom/android/server/connectivity/Tethering$TetherMasterSM;->handleInterfaceServingStateInactive(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/Tethering$TetherState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/Tethering$TetheringUserRestrictionListener;-><init>(Lcom/android/server/connectivity/Tethering;)V
+PLcom/android/server/connectivity/Tethering$TetheringUserRestrictionListener;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/connectivity/Tethering;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/net/INetworkStatsService;Landroid/net/INetworkPolicyManager;Landroid/os/Looper;Lcom/android/server/connectivity/MockableSystemProperties;Lcom/android/server/connectivity/tethering/TetheringDependencies;)V
+PLcom/android/server/connectivity/Tethering;->access$1200(Lcom/android/server/connectivity/Tethering;Lcom/android/internal/util/State;I)V
+PLcom/android/server/connectivity/Tethering;->access$1900(Lcom/android/server/connectivity/Tethering;)Lcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;
+PLcom/android/server/connectivity/Tethering;->access$2200(Lcom/android/server/connectivity/Tethering;)Ljava/util/HashSet;
+PLcom/android/server/connectivity/Tethering;->access$3100(Lcom/android/server/connectivity/Tethering;)Lcom/android/server/connectivity/tethering/OffloadController;
+PLcom/android/server/connectivity/Tethering;->access$3200(Lcom/android/server/connectivity/Tethering;Ljava/lang/String;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;II)V
+PLcom/android/server/connectivity/Tethering;->access$3300(Lcom/android/server/connectivity/Tethering;Ljava/lang/String;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/Tethering;->access$400(Lcom/android/server/connectivity/Tethering;)Landroid/net/util/SharedLog;
+PLcom/android/server/connectivity/Tethering;->access$500(Lcom/android/server/connectivity/Tethering;)V
+PLcom/android/server/connectivity/Tethering;->access$600(Lcom/android/server/connectivity/Tethering;)Lcom/android/internal/util/StateMachine;
+PLcom/android/server/connectivity/Tethering;->access$700(Lcom/android/server/connectivity/Tethering;)Ljava/lang/Object;
+PLcom/android/server/connectivity/Tethering;->access$800(Lcom/android/server/connectivity/Tethering;)Z
+PLcom/android/server/connectivity/Tethering;->access$802(Lcom/android/server/connectivity/Tethering;Z)Z
+PLcom/android/server/connectivity/Tethering;->carrierConfigAffirmsEntitlementCheckNotRequired()Z
+PLcom/android/server/connectivity/Tethering;->clearTetheredNotification()V
+PLcom/android/server/connectivity/Tethering;->copy([Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/connectivity/Tethering;->getTetherableBluetoothRegexs()[Ljava/lang/String;
+PLcom/android/server/connectivity/Tethering;->getTetherableUsbRegexs()[Ljava/lang/String;
+PLcom/android/server/connectivity/Tethering;->getTetherableWifiRegexs()[Ljava/lang/String;
+PLcom/android/server/connectivity/Tethering;->getTetheredIfaces()[Ljava/lang/String;
+PLcom/android/server/connectivity/Tethering;->hasTetherableConfiguration()Z
+PLcom/android/server/connectivity/Tethering;->ifaceNameToType(Ljava/lang/String;)I
+PLcom/android/server/connectivity/Tethering;->interfaceLinkStateChanged(Ljava/lang/String;Z)V
+PLcom/android/server/connectivity/Tethering;->interfaceStatusChanged(Ljava/lang/String;Z)V
+PLcom/android/server/connectivity/Tethering;->lambda$new$0(Lcom/android/server/connectivity/Tethering;Landroid/content/Intent;)V
+PLcom/android/server/connectivity/Tethering;->logMessage(Lcom/android/internal/util/State;I)V
+PLcom/android/server/connectivity/Tethering;->makeControlCallback(Ljava/lang/String;)Lcom/android/server/connectivity/tethering/IControlsTethering;
+PLcom/android/server/connectivity/Tethering;->maybeTrackNewInterfaceLocked(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Tethering;->maybeTrackNewInterfaceLocked(Ljava/lang/String;I)V
+PLcom/android/server/connectivity/Tethering;->notifyInterfaceStateChange(Ljava/lang/String;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;II)V
+PLcom/android/server/connectivity/Tethering;->notifyLinkPropertiesChanged(Ljava/lang/String;Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/Tethering;->reevaluateSimCardProvisioning()V
+PLcom/android/server/connectivity/Tethering;->sendTetherStateChangedBroadcast()V
+PLcom/android/server/connectivity/Tethering;->startStateMachineUpdaters()V
+PLcom/android/server/connectivity/Tethering;->updateConfiguration()V
+PLcom/android/server/connectivity/Vpn$1;-><init>(Lcom/android/server/connectivity/Vpn;)V
+PLcom/android/server/connectivity/Vpn$3;-><init>(Lcom/android/server/connectivity/Vpn;)V
+PLcom/android/server/connectivity/Vpn$SystemServices;-><init>(Landroid/content/Context;)V
+PLcom/android/server/connectivity/Vpn$SystemServices;->settingsSecureGetIntForUser(Ljava/lang/String;II)I
+PLcom/android/server/connectivity/Vpn$SystemServices;->settingsSecureGetStringForUser(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/connectivity/Vpn;-><init>(Landroid/os/Looper;Landroid/content/Context;Landroid/os/INetworkManagementService;I)V
+PLcom/android/server/connectivity/Vpn;-><init>(Landroid/os/Looper;Landroid/content/Context;Landroid/os/INetworkManagementService;ILcom/android/server/connectivity/Vpn$SystemServices;)V
+PLcom/android/server/connectivity/Vpn;->enforceControlPermission()V
+PLcom/android/server/connectivity/Vpn;->enforceControlPermissionOrInternalCaller()V
+PLcom/android/server/connectivity/Vpn;->getAlwaysOnPackage()Ljava/lang/String;
+PLcom/android/server/connectivity/Vpn;->getAppUid(Ljava/lang/String;I)I
+PLcom/android/server/connectivity/Vpn;->getUnderlyingNetworks()[Landroid/net/Network;
+PLcom/android/server/connectivity/Vpn;->getVpnConfig()Lcom/android/internal/net/VpnConfig;
+PLcom/android/server/connectivity/Vpn;->getVpnInfo()Lcom/android/internal/net/VpnInfo;
+PLcom/android/server/connectivity/Vpn;->isCurrentPreparedPackage(Ljava/lang/String;)Z
+PLcom/android/server/connectivity/Vpn;->isNullOrLegacyVpn(Ljava/lang/String;)Z
+PLcom/android/server/connectivity/Vpn;->loadAlwaysOnPackage()V
+PLcom/android/server/connectivity/Vpn;->maybeRegisterPackageChangeReceiverLocked(Ljava/lang/String;)V
+PLcom/android/server/connectivity/Vpn;->setAllowOnlyVpnForUids(ZLjava/util/Collection;)Z
+PLcom/android/server/connectivity/Vpn;->setAlwaysOnPackageInternal(Ljava/lang/String;Z)Z
+PLcom/android/server/connectivity/Vpn;->setVpnForcedLocked(Z)V
+PLcom/android/server/connectivity/Vpn;->startAlwaysOnVpn()Z
+PLcom/android/server/connectivity/Vpn;->unregisterPackageChangeReceiverLocked()V
+PLcom/android/server/connectivity/Vpn;->updateAlwaysOnNotification(Landroid/net/NetworkInfo$DetailedState;)V
+PLcom/android/server/connectivity/Vpn;->updateCapabilities()V
+PLcom/android/server/connectivity/Vpn;->updateCapabilities(Landroid/net/ConnectivityManager;[Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/connectivity/tethering/-$$Lambda$OffloadController$OffloadTetheringStatsProvider$3TF0NI3fE8A-xW0925oMv3YzAOk;-><init>(Lcom/android/server/connectivity/tethering/OffloadController$OffloadTetheringStatsProvider;)V
+PLcom/android/server/connectivity/tethering/-$$Lambda$OffloadController$OffloadTetheringStatsProvider$3TF0NI3fE8A-xW0925oMv3YzAOk;->run()V
+PLcom/android/server/connectivity/tethering/IControlsTethering;-><init>()V
+PLcom/android/server/connectivity/tethering/IControlsTethering;->getStateString(I)Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;-><init>(Ljava/util/ArrayList;Landroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;->findDownstream(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)Lcom/android/server/connectivity/tethering/IPv6TetheringCoordinator$Downstream;
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;->generateUniqueLocalPrefix()[B
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;->removeActiveDownstream(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;->stopIPv6TetheringOn(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/OffloadController$OffloadTetheringStatsProvider;-><init>(Lcom/android/server/connectivity/tethering/OffloadController;)V
+PLcom/android/server/connectivity/tethering/OffloadController$OffloadTetheringStatsProvider;-><init>(Lcom/android/server/connectivity/tethering/OffloadController;Lcom/android/server/connectivity/tethering/OffloadController$1;)V
+PLcom/android/server/connectivity/tethering/OffloadController$OffloadTetheringStatsProvider;->lambda$getTetherStats$0(Lcom/android/server/connectivity/tethering/OffloadController$OffloadTetheringStatsProvider;)V
+PLcom/android/server/connectivity/tethering/OffloadController;-><init>(Landroid/os/Handler;Lcom/android/server/connectivity/tethering/OffloadHardwareInterface;Landroid/content/ContentResolver;Landroid/os/INetworkManagementService;Landroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/OffloadController;->access$1000(Lcom/android/server/connectivity/tethering/OffloadController;)Landroid/os/Handler;
+PLcom/android/server/connectivity/tethering/OffloadController;->access$1100(Lcom/android/server/connectivity/tethering/OffloadController;)Ljava/util/concurrent/ConcurrentHashMap;
+PLcom/android/server/connectivity/tethering/OffloadController;->access$800(Lcom/android/server/connectivity/tethering/OffloadController;)V
+PLcom/android/server/connectivity/tethering/OffloadController;->currentUpstreamInterface()Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/OffloadController;->maybeUpdateStats(Ljava/lang/String;)V
+PLcom/android/server/connectivity/tethering/OffloadController;->removeDownstreamInterface(Ljava/lang/String;)V
+PLcom/android/server/connectivity/tethering/OffloadController;->setLocalPrefixes(Ljava/util/Set;)V
+PLcom/android/server/connectivity/tethering/OffloadController;->started()Z
+PLcom/android/server/connectivity/tethering/OffloadController;->updateStatsForCurrentUpstream()V
+PLcom/android/server/connectivity/tethering/OffloadHardwareInterface$ForwardedStats;-><init>()V
+PLcom/android/server/connectivity/tethering/OffloadHardwareInterface;-><init>(Landroid/os/Handler;Landroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/SimChangeListener$1;-><init>(Ljava/lang/Runnable;)V
+PLcom/android/server/connectivity/tethering/SimChangeListener;-><init>(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/Runnable;)V
+PLcom/android/server/connectivity/tethering/SimChangeListener;->makeCallback(Ljava/lang/Runnable;)Ljava/util/function/Consumer;
+PLcom/android/server/connectivity/tethering/SimChangeListener;->makeIntentFilter()Landroid/content/IntentFilter;
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$BaseServingState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$InitialState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$InitialState;->enter()V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$InitialState;->processMessage(Landroid/os/Message;)Z
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$LocalHotspotState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$TetheredState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine$UnavailableState;-><init>(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;-><init>(Ljava/lang/String;Landroid/os/Looper;ILandroid/net/util/SharedLog;Landroid/os/INetworkManagementService;Landroid/net/INetworkStatsService;Lcom/android/server/connectivity/tethering/IControlsTethering;Lcom/android/server/connectivity/tethering/TetheringDependencies;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->access$000(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;I)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->access$100(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Lcom/android/internal/util/State;I)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->access$700(Lcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->interfaceName()Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->interfaceType()I
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->lastError()I
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->logMessage(Lcom/android/internal/util/State;I)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->resetLinkProperties()V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->sendInterfaceState(I)V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->sendLinkProperties()V
+PLcom/android/server/connectivity/tethering/TetherInterfaceStateMachine;->updateUpstreamIPv6LinkProperties(Landroid/net/LinkProperties;)V
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;-><init>(Landroid/content/Context;Landroid/net/util/SharedLog;)V
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->checkDunRequired(Landroid/content/Context;)I
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->containsOneOf(Ljava/util/ArrayList;[Ljava/lang/Integer;)Z
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->copy([Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->dunCheckString(I)Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->getDhcpRanges(Landroid/content/Context;)[Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->getProvisioningAppNoUi(Landroid/content/Context;)Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->getResourceStringArray(Landroid/content/Context;I)[Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->getUpstreamIfaceTypes(Landroid/content/Context;I)Ljava/util/Collection;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->hasMobileHotspotProvisionApp()Z
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->isWifi(Ljava/lang/String;)Z
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->makeString([Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->matchesDownstreamRegexs(Ljava/lang/String;[Ljava/lang/String;)Z
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->preferredUpstreamNames(Ljava/util/Collection;)[Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->prependIfNotPresent(Ljava/util/ArrayList;I)V
+PLcom/android/server/connectivity/tethering/TetheringConfiguration;->toString()Ljava/lang/String;
+PLcom/android/server/connectivity/tethering/TetheringDependencies;-><init>()V
+PLcom/android/server/connectivity/tethering/TetheringDependencies;->getIPv6TetheringCoordinator(Ljava/util/ArrayList;Landroid/net/util/SharedLog;)Lcom/android/server/connectivity/tethering/IPv6TetheringCoordinator;
+PLcom/android/server/connectivity/tethering/TetheringDependencies;->getNetdService()Landroid/net/INetd;
+PLcom/android/server/connectivity/tethering/TetheringDependencies;->getOffloadHardwareInterface(Landroid/os/Handler;Landroid/net/util/SharedLog;)Lcom/android/server/connectivity/tethering/OffloadHardwareInterface;
+PLcom/android/server/connectivity/tethering/TetheringDependencies;->getUpstreamNetworkMonitor(Landroid/content/Context;Lcom/android/internal/util/StateMachine;Landroid/net/util/SharedLog;I)Lcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;
+PLcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;-><init>(Landroid/content/Context;Lcom/android/internal/util/StateMachine;Landroid/net/util/SharedLog;I)V
+PLcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;->getLocalPrefixes()Ljava/util/Set;
+PLcom/android/server/connectivity/tethering/UpstreamNetworkMonitor;->updateMobileRequiresDun(Z)V
+PLcom/android/server/content/-$$Lambda$SyncManager$68MEyNkTh36YmYoFlURJoRa_-cY;-><init>()V
+PLcom/android/server/content/-$$Lambda$SyncManager$6y-gkGdDn-rSLmR9G8Pz_n9zy2A;-><init>(Lcom/android/server/content/SyncManager;I)V
+PLcom/android/server/content/-$$Lambda$SyncManager$6y-gkGdDn-rSLmR9G8Pz_n9zy2A;->run()V
+PLcom/android/server/content/-$$Lambda$SyncManager$CjX_2uO4O4xJPQnKzeqvGwd87Dc;-><init>(Lcom/android/server/content/SyncManager;I)V
+PLcom/android/server/content/-$$Lambda$SyncManager$CjX_2uO4O4xJPQnKzeqvGwd87Dc;->run()V
+PLcom/android/server/content/-$$Lambda$SyncManager$Dly2yZUw2lCDXffoc_fe8npXe2U;-><init>(Lcom/android/server/content/SyncManager;Landroid/accounts/AccountAndUser;ILjava/lang/String;Landroid/os/Bundle;IJI)V
+PLcom/android/server/content/-$$Lambda$SyncManager$Dly2yZUw2lCDXffoc_fe8npXe2U;->onReady()V
+PLcom/android/server/content/-$$Lambda$SyncManager$HhiSFjEoPA_Hnv3xYZGfwkalc68;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/-$$Lambda$SyncManager$HhiSFjEoPA_Hnv3xYZGfwkalc68;->onAppPermissionChanged(Landroid/accounts/Account;I)V
+PLcom/android/server/content/-$$Lambda$SyncManager$bVs0A6OYdmGkOiq_lbp5MiBwelw;-><init>()V
+PLcom/android/server/content/-$$Lambda$SyncManager$zZUXjd-GLFQgHtMQ3vq0EWHvir8;-><init>(Landroid/content/Context;Lcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;)V
+PLcom/android/server/content/-$$Lambda$SyncManager$zZUXjd-GLFQgHtMQ3vq0EWHvir8;->run()V
+PLcom/android/server/content/-$$Lambda$SyncManagerConstants$qo5ldQVp10jCUY9aavBZDKP2k6Q;-><init>(Lcom/android/server/content/SyncManagerConstants;)V
+PLcom/android/server/content/-$$Lambda$SyncManagerConstants$qo5ldQVp10jCUY9aavBZDKP2k6Q;->run()V
+PLcom/android/server/content/ContentService$1;-><init>(Lcom/android/server/content/ContentService;)V
+PLcom/android/server/content/ContentService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/ContentService$3;-><init>(Lcom/android/server/content/ContentService;)V
+PLcom/android/server/content/ContentService$3;->getPackages(Ljava/lang/String;I)[Ljava/lang/String;
+PLcom/android/server/content/ContentService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/content/ContentService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/content/ContentService$Lifecycle;->onStart()V
+PLcom/android/server/content/ContentService$Lifecycle;->onStartUser(I)V
+PLcom/android/server/content/ContentService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/content/ContentService$ObserverCall;-><init>(Lcom/android/server/content/ContentService$ObserverNode;Landroid/database/IContentObserver;ZI)V
+PLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;->binderDied()V
+PLcom/android/server/content/ContentService$ObserverNode;-><init>(Ljava/lang/String;)V
+PLcom/android/server/content/ContentService;-><init>(Landroid/content/Context;Z)V
+PLcom/android/server/content/ContentService;->access$000(Lcom/android/server/content/ContentService;)Landroid/util/SparseArray;
+PLcom/android/server/content/ContentService;->access$100(Lcom/android/server/content/ContentService;ILjava/lang/String;Landroid/net/Uri;)V
+PLcom/android/server/content/ContentService;->addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V
+PLcom/android/server/content/ContentService;->addStatusChangeListener(ILandroid/content/ISyncStatusObserver;)V
+PLcom/android/server/content/ContentService;->cancelSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)V
+PLcom/android/server/content/ContentService;->cancelSyncAsUser(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;I)V
+PLcom/android/server/content/ContentService;->clampPeriod(J)J
+PLcom/android/server/content/ContentService;->findOrCreateCacheLocked(ILjava/lang/String;)Landroid/util/ArrayMap;
+PLcom/android/server/content/ContentService;->getCache(Ljava/lang/String;Landroid/net/Uri;I)Landroid/os/Bundle;
+PLcom/android/server/content/ContentService;->getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I
+PLcom/android/server/content/ContentService;->getMasterSyncAutomatically()Z
+PLcom/android/server/content/ContentService;->getPeriodicSyncs(Landroid/accounts/Account;Ljava/lang/String;Landroid/content/ComponentName;)Ljava/util/List;
+PLcom/android/server/content/ContentService;->getProviderPackageName(Landroid/net/Uri;)Ljava/lang/String;
+PLcom/android/server/content/ContentService;->getSyncAdapterTypes()[Landroid/content/SyncAdapterType;
+PLcom/android/server/content/ContentService;->getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z
+PLcom/android/server/content/ContentService;->getSyncExemptionAndCleanUpExtrasForCaller(ILandroid/os/Bundle;)I
+PLcom/android/server/content/ContentService;->getSyncExemptionForCaller(I)I
+PLcom/android/server/content/ContentService;->invalidateCacheLocked(ILjava/lang/String;Landroid/net/Uri;)V
+PLcom/android/server/content/ContentService;->normalizeSyncable(I)I
+PLcom/android/server/content/ContentService;->onBootPhase(I)V
+PLcom/android/server/content/ContentService;->onStartUser(I)V
+PLcom/android/server/content/ContentService;->onUnlockUser(I)V
+PLcom/android/server/content/ContentService;->putCache(Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;I)V
+PLcom/android/server/content/ContentService;->removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/content/ContentService;->removeStatusChangeListener(Landroid/content/ISyncStatusObserver;)V
+PLcom/android/server/content/ContentService;->setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V
+PLcom/android/server/content/ContentService;->setSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;ZI)V
+PLcom/android/server/content/ContentService;->syncAsUser(Landroid/content/SyncRequest;I)V
+PLcom/android/server/content/ContentService;->validateExtras(ILandroid/os/Bundle;)V
+PLcom/android/server/content/SyncJobService;-><init>()V
+PLcom/android/server/content/SyncJobService;->callJobFinished(IZLjava/lang/String;)V
+PLcom/android/server/content/SyncJobService;->jobParametersToString(Landroid/app/job/JobParameters;)Ljava/lang/String;
+PLcom/android/server/content/SyncJobService;->markSyncStarted(I)V
+PLcom/android/server/content/SyncJobService;->onStartCommand(Landroid/content/Intent;II)I
+PLcom/android/server/content/SyncJobService;->sendMessage(Landroid/os/Message;)V
+PLcom/android/server/content/SyncJobService;->wtf(Ljava/lang/String;)V
+PLcom/android/server/content/SyncLogger$RotatingFileLogger;-><init>()V
+PLcom/android/server/content/SyncLogger$RotatingFileLogger;->closeCurrentLogLocked()V
+PLcom/android/server/content/SyncLogger$RotatingFileLogger;->enabled()Z
+PLcom/android/server/content/SyncLogger$RotatingFileLogger;->jobParametersToString(Landroid/app/job/JobParameters;)Ljava/lang/String;
+PLcom/android/server/content/SyncLogger$RotatingFileLogger;->openLogLocked(J)V
+PLcom/android/server/content/SyncLogger$RotatingFileLogger;->purgeOldLogs()V
+PLcom/android/server/content/SyncLogger;-><init>()V
+PLcom/android/server/content/SyncLogger;->getInstance()Lcom/android/server/content/SyncLogger;
+PLcom/android/server/content/SyncManager$10;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$10;->onPeriodicSyncAdded(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;JJ)V
+PLcom/android/server/content/SyncManager$11;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$12;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$12;->onServiceChanged(Landroid/content/SyncAdapterType;IZ)V
+PLcom/android/server/content/SyncManager$12;->onServiceChanged(Ljava/lang/Object;IZ)V
+PLcom/android/server/content/SyncManager$14;-><init>(Lcom/android/server/content/SyncManager;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$14;->run()V
+PLcom/android/server/content/SyncManager$1;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$2;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$3;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$4;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$5;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$6;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$7;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$7;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/content/SyncManager$8;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$8;->run()V
+PLcom/android/server/content/SyncManager$9;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$9;->onSyncRequest(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILandroid/os/Bundle;I)V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncOperation;JI)V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->bindToSyncAdapter(Landroid/content/ComponentName;I)Z
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->close()V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->onFinished(Landroid/content/SyncResult;)V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->toString()Ljava/lang/String;
+PLcom/android/server/content/SyncManager$ActiveSyncContext;->toString(Ljava/lang/StringBuilder;)V
+PLcom/android/server/content/SyncManager$OnUnsyncableAccountCheck$1;-><init>(Lcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;)V
+PLcom/android/server/content/SyncManager$OnUnsyncableAccountCheck$1;->onUnsyncableAccountDone(Z)V
+PLcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;-><init>(Landroid/content/pm/RegisteredServicesCache$ServiceInfo;Lcom/android/server/content/SyncManager$OnReadyCallback;)V
+PLcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;->access$2600(Lcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;)V
+PLcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;->onReady()V
+PLcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/content/SyncManager$ScheduleSyncMessagePayload;-><init>(Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager$ServiceConnectionData;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/os/IBinder;)V
+PLcom/android/server/content/SyncManager$SyncFinishedOrCancelledMessagePayload;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/content/SyncResult;)V
+PLcom/android/server/content/SyncManager$SyncHandler;-><init>(Lcom/android/server/content/SyncManager;Landroid/os/Looper;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->access$2100(Lcom/android/server/content/SyncManager$SyncHandler;Lcom/android/server/content/SyncOperation;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/content/SyncManager$SyncHandler;->cancelActiveSyncH(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->checkIfDeviceReady()V
+PLcom/android/server/content/SyncManager$SyncHandler;->closeActiveSyncContext(Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->computeSyncOpState(Lcom/android/server/content/SyncOperation;)I
+PLcom/android/server/content/SyncManager$SyncHandler;->deferActiveSyncH(Lcom/android/server/content/SyncManager$ActiveSyncContext;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->deferStoppedSyncH(Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager$SyncHandler;->deferSyncH(Lcom/android/server/content/SyncOperation;JLjava/lang/String;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->findActiveSyncContextH(I)Lcom/android/server/content/SyncManager$ActiveSyncContext;
+PLcom/android/server/content/SyncManager$SyncHandler;->getSyncWakeLock(Lcom/android/server/content/SyncOperation;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/content/SyncManager$SyncHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->isSyncNotUsingNetworkH(Lcom/android/server/content/SyncManager$ActiveSyncContext;)Z
+PLcom/android/server/content/SyncManager$SyncHandler;->maybeUpdateSyncPeriodH(Lcom/android/server/content/SyncOperation;JJ)V
+PLcom/android/server/content/SyncManager$SyncHandler;->onBootCompleted()V
+PLcom/android/server/content/SyncManager$SyncHandler;->removePeriodicSyncH(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->removePeriodicSyncInternalH(Lcom/android/server/content/SyncOperation;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->reschedulePeriodicSyncH(Lcom/android/server/content/SyncOperation;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->runBoundToAdapterH(Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/os/IBinder;)V
+PLcom/android/server/content/SyncManager$SyncHandler;->stopSyncEvent(JLcom/android/server/content/SyncOperation;Ljava/lang/String;IIJ)V
+PLcom/android/server/content/SyncManager$SyncHandler;->syncResultToErrorNumber(Landroid/content/SyncResult;)I
+PLcom/android/server/content/SyncManager$SyncHandler;->tryEnqueueMessageUntilReadyToRun(Landroid/os/Message;)Z
+PLcom/android/server/content/SyncManager$SyncHandler;->updateRunningAccountsH(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager$SyncTimeTracker;-><init>(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager$SyncTimeTracker;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$1;)V
+PLcom/android/server/content/SyncManager$SyncTimeTracker;->update()V
+PLcom/android/server/content/SyncManager$UpdatePeriodicSyncMessagePayload;-><init>(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;JJLandroid/os/Bundle;)V
+PLcom/android/server/content/SyncManager;-><init>(Landroid/content/Context;Z)V
+PLcom/android/server/content/SyncManager;->access$000(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->access$1000(Lcom/android/server/content/SyncManager;)Lcom/android/server/content/SyncLogger;
+PLcom/android/server/content/SyncManager;->access$1100(Lcom/android/server/content/SyncManager;)Lcom/android/server/content/SyncStorageEngine;
+PLcom/android/server/content/SyncManager;->access$1300(Lcom/android/server/content/SyncManager;I)V
+PLcom/android/server/content/SyncManager;->access$1500(Lcom/android/server/content/SyncManager;)Ljava/util/List;
+PLcom/android/server/content/SyncManager;->access$1600(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncOperation;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->access$1800(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->access$200(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->access$2000(Lcom/android/server/content/SyncManager;)Landroid/content/Context;
+PLcom/android/server/content/SyncManager;->access$202(Lcom/android/server/content/SyncManager;Z)Z
+PLcom/android/server/content/SyncManager;->access$2200(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/content/SyncResult;)V
+PLcom/android/server/content/SyncManager;->access$2300(Lcom/android/server/content/SyncManager;)Lcom/android/internal/app/IBatteryStats;
+PLcom/android/server/content/SyncManager;->access$2800(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->access$2802(Lcom/android/server/content/SyncManager;Z)Z
+PLcom/android/server/content/SyncManager;->access$300(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager;->access$3000(Lcom/android/server/content/SyncManager;)Lcom/android/server/content/SyncJobService;
+PLcom/android/server/content/SyncManager;->access$3002(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncJobService;)Lcom/android/server/content/SyncJobService;
+PLcom/android/server/content/SyncManager;->access$3100(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager;->access$3200(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->access$3300(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;)Z
+PLcom/android/server/content/SyncManager;->access$3400(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager$ActiveSyncContext;)V
+PLcom/android/server/content/SyncManager;->access$3500(Lcom/android/server/content/SyncManager;)Landroid/os/PowerManager;
+PLcom/android/server/content/SyncManager;->access$3600(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;)Z
+PLcom/android/server/content/SyncManager;->access$3700(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->access$3800(Lcom/android/server/content/SyncManager;)[Landroid/accounts/AccountAndUser;
+PLcom/android/server/content/SyncManager;->access$3802(Lcom/android/server/content/SyncManager;[Landroid/accounts/AccountAndUser;)[Landroid/accounts/AccountAndUser;
+PLcom/android/server/content/SyncManager;->access$3900(Lcom/android/server/content/SyncManager;)V
+PLcom/android/server/content/SyncManager;->access$400(Lcom/android/server/content/SyncManager;)Lcom/android/server/content/SyncManager$SyncHandler;
+PLcom/android/server/content/SyncManager;->access$4000(Lcom/android/server/content/SyncManager;[Landroid/accounts/AccountAndUser;Landroid/accounts/Account;I)Z
+PLcom/android/server/content/SyncManager;->access$4100(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncOperation;)V
+PLcom/android/server/content/SyncManager;->access$4400(Lcom/android/server/content/SyncManager;I)J
+PLcom/android/server/content/SyncManager;->access$4500(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->access$4600(Lcom/android/server/content/SyncManager;)Lcom/android/server/content/SyncManagerConstants;
+PLcom/android/server/content/SyncManager;->access$4700(Lcom/android/server/content/SyncManager;Landroid/content/SyncResult;Lcom/android/server/content/SyncOperation;)V
+PLcom/android/server/content/SyncManager;->access$4900(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;J)V
+PLcom/android/server/content/SyncManager;->access$500(Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->access$5000(Lcom/android/server/content/SyncManager;)Landroid/app/NotificationManager;
+PLcom/android/server/content/SyncManager;->access$600(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->access$602(Lcom/android/server/content/SyncManager;Z)Z
+PLcom/android/server/content/SyncManager;->access$700(Lcom/android/server/content/SyncManager;)Z
+PLcom/android/server/content/SyncManager;->access$800(Lcom/android/server/content/SyncManager;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->canAccessAccount(Landroid/accounts/Account;Ljava/lang/String;I)Z
+PLcom/android/server/content/SyncManager;->cancelActiveSync(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->cancelJob(Lcom/android/server/content/SyncOperation;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->cleanupJobs()V
+PLcom/android/server/content/SyncManager;->clearAllBackoffs(Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->clearBackoffSetting(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->clearScheduledSyncOperations(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->computeSyncable(Landroid/accounts/Account;ILjava/lang/String;Z)I
+PLcom/android/server/content/SyncManager;->containsAccountAndUser([Landroid/accounts/AccountAndUser;Landroid/accounts/Account;I)Z
+PLcom/android/server/content/SyncManager;->doDatabaseCleanup()V
+PLcom/android/server/content/SyncManager;->formatDurationHMS(Ljava/lang/StringBuilder;J)Ljava/lang/StringBuilder;
+PLcom/android/server/content/SyncManager;->getAdapterBindIntent(Landroid/content/Context;Landroid/content/ComponentName;I)Landroid/content/Intent;
+PLcom/android/server/content/SyncManager;->getConnectivityManager()Landroid/net/ConnectivityManager;
+PLcom/android/server/content/SyncManager;->getIsSyncable(Landroid/accounts/Account;ILjava/lang/String;)I
+PLcom/android/server/content/SyncManager;->getJobScheduler()Landroid/app/job/JobScheduler;
+PLcom/android/server/content/SyncManager;->getJobStats()Ljava/lang/String;
+PLcom/android/server/content/SyncManager;->getPeriodicSyncs(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Ljava/util/List;
+PLcom/android/server/content/SyncManager;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;I)[Ljava/lang/String;
+PLcom/android/server/content/SyncManager;->getTotalBytesTransferredByUid(I)J
+PLcom/android/server/content/SyncManager;->getUnusedJobIdH()I
+PLcom/android/server/content/SyncManager;->increaseBackoffSetting(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->isAdapterDelayed(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Z
+PLcom/android/server/content/SyncManager;->isDeviceProvisioned()Z
+PLcom/android/server/content/SyncManager;->isSyncStillActiveH(Lcom/android/server/content/SyncManager$ActiveSyncContext;)Z
+PLcom/android/server/content/SyncManager;->jitterize(JJ)J
+PLcom/android/server/content/SyncManager;->lambda$new$0(Lcom/android/server/content/SyncManager;Landroid/accounts/Account;I)V
+PLcom/android/server/content/SyncManager;->lambda$onStartUser$1(Lcom/android/server/content/SyncManager;I)V
+PLcom/android/server/content/SyncManager;->lambda$onUnlockUser$2(Lcom/android/server/content/SyncManager;I)V
+PLcom/android/server/content/SyncManager;->lambda$scheduleSync$5(Lcom/android/server/content/SyncManager;Landroid/accounts/AccountAndUser;ILjava/lang/String;Landroid/os/Bundle;IJI)V
+PLcom/android/server/content/SyncManager;->lambda$sendOnUnsyncableAccount$12(Landroid/content/Context;Lcom/android/server/content/SyncManager$OnUnsyncableAccountCheck;)V
+PLcom/android/server/content/SyncManager;->maybeRescheduleSync(Landroid/content/SyncResult;Lcom/android/server/content/SyncOperation;)V
+PLcom/android/server/content/SyncManager;->onBootPhase(I)V
+PLcom/android/server/content/SyncManager;->onStartUser(I)V
+PLcom/android/server/content/SyncManager;->onUnlockUser(I)V
+PLcom/android/server/content/SyncManager;->onUserUnlocked(I)V
+PLcom/android/server/content/SyncManager;->postScheduleSyncMessage(Lcom/android/server/content/SyncOperation;J)V
+PLcom/android/server/content/SyncManager;->readDataConnectionState()Z
+PLcom/android/server/content/SyncManager;->readyToSync()Z
+PLcom/android/server/content/SyncManager;->removePeriodicSync(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->scheduleLocalSync(Landroid/accounts/Account;IILjava/lang/String;I)V
+PLcom/android/server/content/SyncManager;->scheduleSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;II)V
+PLcom/android/server/content/SyncManager;->scheduleSyncOperationH(Lcom/android/server/content/SyncOperation;)V
+PLcom/android/server/content/SyncManager;->sendCancelSyncsMessage(Lcom/android/server/content/SyncStorageEngine$EndPoint;Landroid/os/Bundle;Ljava/lang/String;)V
+PLcom/android/server/content/SyncManager;->sendOnUnsyncableAccount(Landroid/content/Context;Landroid/content/pm/RegisteredServicesCache$ServiceInfo;ILcom/android/server/content/SyncManager$OnReadyCallback;)V
+PLcom/android/server/content/SyncManager;->sendSyncFinishedOrCanceledMessage(Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/content/SyncResult;)V
+PLcom/android/server/content/SyncManager;->syncExtrasEquals(Landroid/os/Bundle;Landroid/os/Bundle;Z)Z
+PLcom/android/server/content/SyncManager;->updateOrAddPeriodicSync(Lcom/android/server/content/SyncStorageEngine$EndPoint;JJLandroid/os/Bundle;)V
+PLcom/android/server/content/SyncManager;->updateRunningAccounts(Lcom/android/server/content/SyncStorageEngine$EndPoint;)V
+PLcom/android/server/content/SyncManager;->verifyJobScheduler()V
+PLcom/android/server/content/SyncManager;->whiteListExistingSyncAdaptersIfNeeded()V
+PLcom/android/server/content/SyncManagerConstants;-><init>(Landroid/content/Context;)V
+PLcom/android/server/content/SyncManagerConstants;->getInitialSyncRetryTimeInSeconds()I
+PLcom/android/server/content/SyncManagerConstants;->getKeyExemptionTempWhitelistDurationInSeconds()I
+PLcom/android/server/content/SyncManagerConstants;->getMaxRetriesWithAppStandbyExemption()I
+PLcom/android/server/content/SyncManagerConstants;->getMaxSyncRetryTimeInSeconds()I
+PLcom/android/server/content/SyncManagerConstants;->getRetryTimeIncreaseFactor()F
+PLcom/android/server/content/SyncManagerConstants;->lambda$start$0(Lcom/android/server/content/SyncManagerConstants;)V
+PLcom/android/server/content/SyncManagerConstants;->refresh()V
+PLcom/android/server/content/SyncManagerConstants;->start()V
+PLcom/android/server/content/SyncOperation;-><init>(Landroid/accounts/Account;IILjava/lang/String;IILjava/lang/String;Landroid/os/Bundle;ZI)V
+PLcom/android/server/content/SyncOperation;-><init>(Lcom/android/server/content/SyncOperation;JJ)V
+PLcom/android/server/content/SyncOperation;-><init>(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILjava/lang/String;IILandroid/os/Bundle;ZI)V
+PLcom/android/server/content/SyncOperation;->createOneTimeSyncOperation()Lcom/android/server/content/SyncOperation;
+PLcom/android/server/content/SyncOperation;->extrasToString(Landroid/os/Bundle;)Ljava/lang/String;
+PLcom/android/server/content/SyncOperation;->findPriority()I
+PLcom/android/server/content/SyncOperation;->ignoreBackoff()Z
+PLcom/android/server/content/SyncOperation;->isAppStandbyExempted()Z
+PLcom/android/server/content/SyncOperation;->isConflict(Lcom/android/server/content/SyncOperation;)Z
+PLcom/android/server/content/SyncOperation;->isDerivedFromFailedPeriodicSync()Z
+PLcom/android/server/content/SyncOperation;->isExpedited()Z
+PLcom/android/server/content/SyncOperation;->isIgnoreSettings()Z
+PLcom/android/server/content/SyncOperation;->isInitialization()Z
+PLcom/android/server/content/SyncOperation;->isNotAllowedOnMetered()Z
+PLcom/android/server/content/SyncOperation;->matchesPeriodicOperation(Lcom/android/server/content/SyncOperation;)Z
+PLcom/android/server/content/SyncOperation;->reasonToString(Landroid/content/pm/PackageManager;I)Ljava/lang/String;
+PLcom/android/server/content/SyncOperation;->toEventLog(I)[Ljava/lang/Object;
+PLcom/android/server/content/SyncOperation;->toJobInfoExtras()Landroid/os/PersistableBundle;
+PLcom/android/server/content/SyncOperation;->toString()Ljava/lang/String;
+PLcom/android/server/content/SyncOperation;->wakeLockName()Ljava/lang/String;
+PLcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;-><init>(Landroid/content/Context;)V
+PLcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;->isAccountValid(Landroid/accounts/Account;I)Z
+PLcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;->isAuthorityValid(Ljava/lang/String;I)Z
+PLcom/android/server/content/SyncStorageEngine$AccountInfo;-><init>(Landroid/accounts/AccountAndUser;)V
+PLcom/android/server/content/SyncStorageEngine$AuthorityInfo;-><init>(Lcom/android/server/content/SyncStorageEngine$EndPoint;I)V
+PLcom/android/server/content/SyncStorageEngine$AuthorityInfo;->defaultInitialisation()V
+PLcom/android/server/content/SyncStorageEngine$AuthorityInfo;->toString()Ljava/lang/String;
+PLcom/android/server/content/SyncStorageEngine$DayStats;-><init>(I)V
+PLcom/android/server/content/SyncStorageEngine$EndPoint;->toString()Ljava/lang/String;
+PLcom/android/server/content/SyncStorageEngine$MyHandler;-><init>(Lcom/android/server/content/SyncStorageEngine;Landroid/os/Looper;)V
+PLcom/android/server/content/SyncStorageEngine$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/content/SyncStorageEngine$SyncHistoryItem;-><init>()V
+PLcom/android/server/content/SyncStorageEngine;-><init>(Landroid/content/Context;Ljava/io/File;Landroid/os/Looper;)V
+PLcom/android/server/content/SyncStorageEngine;->access$000()Lcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;
+PLcom/android/server/content/SyncStorageEngine;->access$100(Lcom/android/server/content/SyncStorageEngine;)Landroid/util/SparseArray;
+PLcom/android/server/content/SyncStorageEngine;->access$200(Lcom/android/server/content/SyncStorageEngine;)V
+PLcom/android/server/content/SyncStorageEngine;->access$300(Lcom/android/server/content/SyncStorageEngine;)V
+PLcom/android/server/content/SyncStorageEngine;->addActiveSync(Lcom/android/server/content/SyncManager$ActiveSyncContext;)Landroid/content/SyncInfo;
+PLcom/android/server/content/SyncStorageEngine;->addStatusChangeListener(ILandroid/content/ISyncStatusObserver;)V
+PLcom/android/server/content/SyncStorageEngine;->calculateDefaultFlexTime(J)J
+PLcom/android/server/content/SyncStorageEngine;->clearAllBackoffsLocked()V
+PLcom/android/server/content/SyncStorageEngine;->createAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;IZ)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->doDatabaseCleanup([Landroid/accounts/Account;I)V
+PLcom/android/server/content/SyncStorageEngine;->getBackoff(Lcom/android/server/content/SyncStorageEngine$EndPoint;)Landroid/util/Pair;
+PLcom/android/server/content/SyncStorageEngine;->getCurrentDayLocked()I
+PLcom/android/server/content/SyncStorageEngine;->getCurrentSyncs(I)Ljava/util/List;
+PLcom/android/server/content/SyncStorageEngine;->getCurrentSyncsLocked(I)Ljava/util/List;
+PLcom/android/server/content/SyncStorageEngine;->getDelayUntilTime(Lcom/android/server/content/SyncStorageEngine$EndPoint;)J
+PLcom/android/server/content/SyncStorageEngine;->getIsSyncable(Landroid/accounts/Account;ILjava/lang/String;)I
+PLcom/android/server/content/SyncStorageEngine;->getOrCreateAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;IZ)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->getOrCreateSyncStatusLocked(I)Landroid/content/SyncStatusInfo;
+PLcom/android/server/content/SyncStorageEngine;->getSingleton()Lcom/android/server/content/SyncStorageEngine;
+PLcom/android/server/content/SyncStorageEngine;->init(Landroid/content/Context;Landroid/os/Looper;)V
+PLcom/android/server/content/SyncStorageEngine;->isClockValid()Z
+PLcom/android/server/content/SyncStorageEngine;->markPending(Lcom/android/server/content/SyncStorageEngine$EndPoint;Z)V
+PLcom/android/server/content/SyncStorageEngine;->maybeDeleteLegacyPendingInfoLocked(Ljava/io/File;)V
+PLcom/android/server/content/SyncStorageEngine;->maybeMigrateSettingsForRenamedAuthorities()Z
+PLcom/android/server/content/SyncStorageEngine;->parseAuthority(Lorg/xmlpull/v1/XmlPullParser;ILcom/android/server/content/SyncStorageEngine$AccountAuthorityValidator;)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;
+PLcom/android/server/content/SyncStorageEngine;->parseListenForTickles(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/content/SyncStorageEngine;->queueBackup()V
+PLcom/android/server/content/SyncStorageEngine;->readAccountInfoLocked()V
+PLcom/android/server/content/SyncStorageEngine;->readAndDeleteLegacyAccountInfoLocked()V
+PLcom/android/server/content/SyncStorageEngine;->readStatisticsLocked()V
+PLcom/android/server/content/SyncStorageEngine;->readStatusLocked()V
+PLcom/android/server/content/SyncStorageEngine;->removeActiveSync(Landroid/content/SyncInfo;I)V
+PLcom/android/server/content/SyncStorageEngine;->removeStatusChangeListener(Landroid/content/ISyncStatusObserver;)V
+PLcom/android/server/content/SyncStorageEngine;->reportActiveChange()V
+PLcom/android/server/content/SyncStorageEngine;->requestSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;I)V
+PLcom/android/server/content/SyncStorageEngine;->requestSync(Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;ILandroid/os/Bundle;I)V
+PLcom/android/server/content/SyncStorageEngine;->restoreAllPeriodicSyncs()Z
+PLcom/android/server/content/SyncStorageEngine;->setBackoff(Lcom/android/server/content/SyncStorageEngine$EndPoint;JJ)V
+PLcom/android/server/content/SyncStorageEngine;->setClockValid()V
+PLcom/android/server/content/SyncStorageEngine;->setDelayUntilTime(Lcom/android/server/content/SyncStorageEngine$EndPoint;J)V
+PLcom/android/server/content/SyncStorageEngine;->setIsSyncable(Landroid/accounts/Account;ILjava/lang/String;II)V
+PLcom/android/server/content/SyncStorageEngine;->setOnAuthorityRemovedListener(Lcom/android/server/content/SyncStorageEngine$OnAuthorityRemovedListener;)V
+PLcom/android/server/content/SyncStorageEngine;->setOnSyncRequestListener(Lcom/android/server/content/SyncStorageEngine$OnSyncRequestListener;)V
+PLcom/android/server/content/SyncStorageEngine;->setPeriodicSyncAddedListener(Lcom/android/server/content/SyncStorageEngine$PeriodicSyncAddedListener;)V
+PLcom/android/server/content/SyncStorageEngine;->setSyncAutomatically(Landroid/accounts/Account;ILjava/lang/String;ZII)V
+PLcom/android/server/content/SyncStorageEngine;->setSyncableStateForEndPoint(Lcom/android/server/content/SyncStorageEngine$EndPoint;II)V
+PLcom/android/server/content/SyncStorageEngine;->shouldGrantSyncAdaptersAccountAccess()Z
+PLcom/android/server/content/SyncStorageEngine;->writeAccountInfoLocked()V
+PLcom/android/server/content/SyncStorageEngine;->writeStatisticsLocked()V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$_Nw-YGl5ncBg-LJs8W81WNW6xoU;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/-$$Lambda$DevicePolicyManagerService$_Nw-YGl5ncBg-LJs8W81WNW6xoU;->run()V
+PLcom/android/server/devicepolicy/BaseIDevicePolicyManager;-><init>()V
+PLcom/android/server/devicepolicy/CertificateMonitor$1;-><init>(Lcom/android/server/devicepolicy/CertificateMonitor;)V
+PLcom/android/server/devicepolicy/CertificateMonitor$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/devicepolicy/CertificateMonitor;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/devicepolicy/CertificateMonitor;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Landroid/os/Handler;)V
+PLcom/android/server/devicepolicy/CertificateMonitor;->access$000(Lcom/android/server/devicepolicy/CertificateMonitor;Landroid/os/UserHandle;)V
+PLcom/android/server/devicepolicy/CertificateMonitor;->getInstalledCaCertificates(Landroid/os/UserHandle;)Ljava/util/List;
+PLcom/android/server/devicepolicy/CertificateMonitor;->updateInstalledCertificates(Landroid/os/UserHandle;)V
+PLcom/android/server/devicepolicy/DeviceAdminServiceController;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyConstants;)V
+PLcom/android/server/devicepolicy/DevicePolicyCacheImpl;-><init>()V
+PLcom/android/server/devicepolicy/DevicePolicyCacheImpl;->getScreenCaptureDisabled(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyCacheImpl;->setScreenCaptureDisabled(IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyConstants;-><init>(Ljava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyConstants;->loadFromString(Ljava/lang/String;)Lcom/android/server/devicepolicy/DevicePolicyConstants;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$1;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$2;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$3;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4$1;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService$4;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4$1;->run()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$4;->sendDeviceOwnerUserCommand(Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$8;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$8;->run()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;-><init>(Landroid/app/admin/DeviceAdminInfo;Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->getUserHandle()Landroid/os/UserHandle;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->hasUserRestrictions()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->writePackageListToXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/util/List;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;-><init>(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getAlarmManager()Landroid/app/AlarmManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getDevicePolicyFilePathForSystemUser()Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getIActivityManager()Landroid/app/IActivityManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getIPackageManager()Landroid/content/pm/IPackageManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getIWindowManager()Landroid/view/IWindowManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getMyLooper()Landroid/os/Looper;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getNetworkPolicyManagerInternal()Lcom/android/server/net/NetworkPolicyManagerInternal;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getNotificationManager()Landroid/app/NotificationManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManager()Landroid/content/pm/PackageManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPowerManagerInternal()Landroid/os/PowerManagerInternal;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getTelephonyManager()Landroid/telephony/TelephonyManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getUsageStatsManagerInternal()Landroid/app/usage/UsageStatsManagerInternal;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getUserManager()Landroid/os/UserManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getUserManagerInternal()Landroid/os/UserManagerInternal;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->hasFeature()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->isBuildDebuggable()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->keyChainBindAsUser(Landroid/os/UserHandle;)Landroid/security/KeyChain$KeyChainConnection;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->newLockPatternUtils()Lcom/android/internal/widget/LockPatternUtils;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->newOwners()Lcom/android/server/devicepolicy/Owners;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->newTransferOwnershipMetadataManager()Lcom/android/server/devicepolicy/TransferOwnershipMetadataManager;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->postOnSystemServerInitThreadPool(Ljava/lang/Runnable;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->securityLogIsLoggingEnabled()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->settingsGlobalGetInt(Ljava/lang/String;I)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->settingsGlobalGetString(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->settingsGlobalPutInt(Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->settingsSecureGetIntForUser(Ljava/lang/String;II)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->storageManagerIsFileBasedEncryptionEnabled()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->systemPropertiesGet(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->systemPropertiesGetLong(Ljava/lang/String;J)J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->systemPropertiesSet(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->userHandleGetCallingUserId()I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->userManagerIsSplitSystemUser()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;->onStart()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;->onStartUser(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->addOnCrossProfileWidgetProvidersChangeListener(Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->canUserHaveUntrustedCredentialReset(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->getDevicePolicyCache()Landroid/app/admin/DevicePolicyCache;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$RestrictionsListener;-><init>(Landroid/content/Context;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$RestrictionsListener;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$SetupContentObserver;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Landroid/os/Handler;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService$SetupContentObserver;->register()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1400(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1500(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$1700(Lcom/android/server/devicepolicy/DevicePolicyManagerService;Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$2900(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$3000(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)Lcom/android/server/devicepolicy/DevicePolicyCacheImpl;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->access$900(Lcom/android/server/devicepolicy/DevicePolicyManagerService;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->canUserHaveUntrustedCredentialReset(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->checkActiveAdminPrecondition(Landroid/content/ComponentName;Landroid/app/admin/DeviceAdminInfo;Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->checkDeviceOwnerProvisioningPreCondition(I)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->checkDeviceOwnerProvisioningPreConditionLocked(Landroid/content/ComponentName;IZZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->checkManagedProfileProvisioningPreCondition(Ljava/lang/String;I)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->checkProvisioningPreConditionSkipPermission(Ljava/lang/String;Ljava/lang/String;)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->cleanUpOldUsers()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enableIfNecessary(Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceDeviceOwnerOrManageUsers()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceFullCrossUsersPermission(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceManageUsers()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceSystemUserOrPermissionIfCrossUser(ILjava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceUserUnlocked(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->enforceUserUnlocked(IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->ensureCallerPackage(Ljava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->ensureDeviceOwnerUserStarted()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->findAdmin(Landroid/content/ComponentName;IZ)Landroid/app/admin/DeviceAdminInfo;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->findOwnerComponentIfNecessaryLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getAcceptedCaCertificates(Landroid/os/UserHandle;)Ljava/util/Set;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getAccountTypesWithManagementDisabledAsUser(I)[Ljava/lang/String;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminForCallerLocked(Landroid/content/ComponentName;I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminForCallerLocked(Landroid/content/ComponentName;IZ)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminForUidLocked(Landroid/content/ComponentName;I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminPackagesLocked(I)Ljava/util/Set;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminUncheckedLocked(Landroid/content/ComponentName;I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminUncheckedLocked(Landroid/content/ComponentName;IZ)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdmins(I)Ljava/util/List;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminsForLockscreenPoliciesLocked(IZ)Ljava/util/List;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getAdminWithMinimumFailedPasswordsForWipeLocked(IZ)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCameraDisabled(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCameraDisabled(Landroid/content/ComponentName;IZ)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCameraRestrictionScopeLocked(IZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCredentialOwner(IZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCurrentFailedPasswordAttempts(IZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerAdminLocked()Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerComponent(Z)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerOrganizationName()Ljava/lang/CharSequence;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerUserId()I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getEncryptionStatus()I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getGlobalProxyAdmin(I)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getKeepUninstalledPackagesLocked()Ljava/util/List;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;IZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getMaximumFailedPasswordsForWipe(Landroid/content/ComponentName;IZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getMaximumTimeToLock(Landroid/content/ComponentName;IZ)J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getMaximumTimeToLockPolicyFromAdmins(Ljava/util/List;)J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getMeteredDisabledPackagesLocked(I)Ljava/util/Set;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getMinimumStrongAuthTimeoutMs()J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getOwnerComponent(I)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getOwnerComponent(Ljava/lang/String;I)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPasswordExpirationLocked(Landroid/content/ComponentName;IZ)J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPasswordExpirationTimeout(Landroid/content/ComponentName;IZ)J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPasswordQuality(Landroid/content/ComponentName;IZ)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPermissionPolicy(Landroid/content/ComponentName;)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPolicyFileDirectory(I)Ljava/io/File;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwner(I)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwnerAdminLocked(I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileParentId(I)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getRequiredStrongAuthTimeout(Landroid/content/ComponentName;IZ)J
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getScreenCaptureDisabled(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getStorageEncryptionStatus(Ljava/lang/String;I)I
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getSystemUpdatePolicy()Landroid/app/admin/SystemUpdatePolicy;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserDataUnchecked(I)Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserPasswordMetricsLocked(I)Landroid/app/admin/PasswordMetrics;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handlePackagesChanged(Ljava/lang/String;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handlePasswordExpirationNotification(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handleStartUser(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->handleUnlockUser(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasDeviceOwner()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasFeatureManagedUsers()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasGrantedPolicy(Landroid/content/ComponentName;II)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasUserSetupCompleted(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isActiveAdminWithPolicyForUserLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;II)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isActivePasswordSufficient(IZ)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isActivePasswordSufficientForUserLocked(ZLandroid/app/admin/PasswordMetrics;IZ)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isAdminActive(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCallerWithSystemUid()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwner(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwnerPackage(Ljava/lang/String;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceProvisioned()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isLockTaskPermitted(Ljava/lang/String;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isLogoutEnabled()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isManagedProfile(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isNetworkLoggingEnabled(Landroid/content/ComponentName;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isNetworkLoggingEnabledInternalLocked()Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPackageTestOnly(Ljava/lang/String;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPasswordSufficientForUserWithoutCheckpointLocked(Landroid/app/admin/PasswordMetrics;IZ)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwner(Landroid/content/ComponentName;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwnerPackage(Ljava/lang/String;I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProvisioningAllowed(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSeparateProfileChallengeEnabled(I)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->isUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->lambda$loadAdminDataAsync$0(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->loadAdminDataAsync()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->loadOwners()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->loadSettingsLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->makeJournaledFile(I)Lcom/android/internal/util/JournaledFile;
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeLogPasswordComplexitySet(Landroid/content/ComponentName;IZLandroid/app/admin/PasswordMetrics;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeLogStart()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeSendAdminEnabledBroadcastLocked(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeSetDefaultDeviceOwnerUserRestrictionsLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->maybeSetDefaultProfileOwnerUserRestrictions()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->migrateUserRestrictionsIfNecessaryLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->onInstalledCertificatesChanged(Landroid/os/UserHandle;Ljava/util/Collection;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->onLockSettingsReady()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->pushActiveAdminPackages()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->pushAllMeteredRestrictedPackages()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->pushUserRestrictions(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->reportFailedFingerprintAttempt(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->reportKeyguardDismissed(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->reportKeyguardSecured(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->reportSuccessfulFingerprintAttempt(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->reportSuccessfulPasswordAttempt(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->revertTransferOwnershipIfNecessaryLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->saveSettingsLocked(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->sendAdminCommandLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;Ljava/lang/String;Landroid/os/Bundle;Landroid/content/BroadcastReceiver;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->sendAdminCommandLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$ActiveAdmin;Ljava/lang/String;Landroid/os/Bundle;Landroid/content/BroadcastReceiver;Z)Z
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->sendChangedNotification(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setActiveAdmin(Landroid/content/ComponentName;ZI)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setActiveAdmin(Landroid/content/ComponentName;ZILandroid/os/Bundle;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setActivePasswordState(Landroid/app/admin/PasswordMetrics;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setCameraDisabled(Landroid/content/ComponentName;Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setDeviceOwnerSystemPropertyLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setExpirationAlarmCheckLocked(Landroid/content/Context;IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setKeyguardDisabledFeatures(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setLongSupportMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setMaximumFailedPasswordsForWipe(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setMaximumTimeToLock(Landroid/content/ComponentName;JZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setPasswordHistoryLength(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setPasswordMinimumLength(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setPasswordQuality(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->setShortSupportMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->startOwnerService(ILjava/lang/String;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->systemReady(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateDeviceOwnerLocked()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateLockTaskFeaturesLocked(II)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateLockTaskPackagesLocked(Ljava/util/List;I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateMaximumTimeToLockLocked(I)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updatePasswordValidityCheckpointLocked(IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateScreenCaptureDisabled(IZ)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateSystemUpdateFreezePeriodsRecord(Z)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->updateUserSetupCompleteAndPaired()V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->validatePasswordOwnerLocked(Lcom/android/server/devicepolicy/DevicePolicyManagerService$DevicePolicyData;)V
+PLcom/android/server/devicepolicy/DevicePolicyManagerService;->validateQualityConstant(I)V
+PLcom/android/server/devicepolicy/OverlayPackagesProvider;-><init>(Landroid/content/Context;)V
+PLcom/android/server/devicepolicy/OverlayPackagesProvider;-><init>(Landroid/content/Context;Lcom/android/internal/view/IInputMethodManager;)V
+PLcom/android/server/devicepolicy/OverlayPackagesProvider;->getIInputMethodManager()Lcom/android/internal/view/IInputMethodManager;
+PLcom/android/server/devicepolicy/Owners$DeviceOwnerReadWriter;-><init>(Lcom/android/server/devicepolicy/Owners;)V
+PLcom/android/server/devicepolicy/Owners$FileReadWriter;-><init>(Ljava/io/File;)V
+PLcom/android/server/devicepolicy/Owners$FileReadWriter;->readFromFileLocked()V
+PLcom/android/server/devicepolicy/Owners$Injector;-><init>()V
+PLcom/android/server/devicepolicy/Owners$Injector;->environmentGetDataSystemDirectory()Ljava/io/File;
+PLcom/android/server/devicepolicy/Owners$Injector;->environmentGetUserSystemDirectory(I)Ljava/io/File;
+PLcom/android/server/devicepolicy/Owners$ProfileOwnerReadWriter;-><init>(Lcom/android/server/devicepolicy/Owners;I)V
+PLcom/android/server/devicepolicy/Owners;-><init>(Landroid/os/UserManager;Landroid/os/UserManagerInternal;Landroid/content/pm/PackageManagerInternal;)V
+PLcom/android/server/devicepolicy/Owners;-><init>(Landroid/os/UserManager;Landroid/os/UserManagerInternal;Landroid/content/pm/PackageManagerInternal;Lcom/android/server/devicepolicy/Owners$Injector;)V
+PLcom/android/server/devicepolicy/Owners;->getDeviceOwnerComponent()Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/Owners;->getDeviceOwnerFile()Ljava/io/File;
+PLcom/android/server/devicepolicy/Owners;->getDeviceOwnerUserId()I
+PLcom/android/server/devicepolicy/Owners;->getDeviceOwnerUserRestrictionsNeedsMigration()Z
+PLcom/android/server/devicepolicy/Owners;->getLegacyConfigFile()Ljava/io/File;
+PLcom/android/server/devicepolicy/Owners;->getProfileOwnerComponent(I)Landroid/content/ComponentName;
+PLcom/android/server/devicepolicy/Owners;->getProfileOwnerFile(I)Ljava/io/File;
+PLcom/android/server/devicepolicy/Owners;->getProfileOwnerKeys()Ljava/util/Set;
+PLcom/android/server/devicepolicy/Owners;->getProfileOwnerUserRestrictionsNeedsMigration(I)Z
+PLcom/android/server/devicepolicy/Owners;->getSystemUpdatePolicy()Landroid/app/admin/SystemUpdatePolicy;
+PLcom/android/server/devicepolicy/Owners;->hasDeviceOwner()Z
+PLcom/android/server/devicepolicy/Owners;->hasProfileOwner(I)Z
+PLcom/android/server/devicepolicy/Owners;->isDeviceOwnerUserId(I)Z
+PLcom/android/server/devicepolicy/Owners;->load()V
+PLcom/android/server/devicepolicy/Owners;->pushToAppOpsLocked()V
+PLcom/android/server/devicepolicy/Owners;->pushToPackageManagerLocked()V
+PLcom/android/server/devicepolicy/Owners;->readLegacyOwnerFileLocked(Ljava/io/File;)Z
+PLcom/android/server/devicepolicy/Owners;->systemReady()V
+PLcom/android/server/devicepolicy/SecurityLogMonitor;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;)V
+PLcom/android/server/devicepolicy/SecurityLogMonitor;-><init>(Lcom/android/server/devicepolicy/DevicePolicyManagerService;J)V
+PLcom/android/server/devicepolicy/TransferOwnershipMetadataManager$Injector;-><init>()V
+PLcom/android/server/devicepolicy/TransferOwnershipMetadataManager$Injector;->getOwnerTransferMetadataDir()Ljava/io/File;
+PLcom/android/server/devicepolicy/TransferOwnershipMetadataManager;-><init>()V
+PLcom/android/server/devicepolicy/TransferOwnershipMetadataManager;-><init>(Lcom/android/server/devicepolicy/TransferOwnershipMetadataManager$Injector;)V
+PLcom/android/server/devicepolicy/TransferOwnershipMetadataManager;->metadataFileExists()Z
+PLcom/android/server/display/-$$Lambda$AmbientBrightnessStatsTracker$vQZYn_dAhbvzT-Un4vvpuyIATII;-><init>(Lcom/android/server/display/AmbientBrightnessStatsTracker;)V
+PLcom/android/server/display/-$$Lambda$AmbientBrightnessStatsTracker$vQZYn_dAhbvzT-Un4vvpuyIATII;->elapsedTimeMillis()J
+PLcom/android/server/display/-$$Lambda$BrightnessTracker$fmx2Mcw7OCEtRi9DwxxGQgA74fg;-><init>(Lcom/android/server/display/BrightnessTracker;)V
+PLcom/android/server/display/-$$Lambda$BrightnessTracker$fmx2Mcw7OCEtRi9DwxxGQgA74fg;->run()V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;-><init>(Lcom/android/server/display/AmbientBrightnessStatsTracker;)V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;->getOrCreateDayStats(Ljava/util/Deque;Ljava/time/LocalDate;)Landroid/hardware/display/AmbientBrightnessDayStats;
+PLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;->getOrCreateUserStats(Ljava/util/Map;I)Ljava/util/Deque;
+PLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;->getUserStats(I)Ljava/util/ArrayList;
+PLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;->log(ILjava/time/LocalDate;FF)V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;->readFromXML(Ljava/io/InputStream;)V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;->writeToXML(Ljava/io/OutputStream;)V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Injector;-><init>()V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Injector;->getLocalDate()Ljava/time/LocalDate;
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Injector;->getUserId(Landroid/os/UserManager;I)I
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Injector;->getUserSerialNumber(Landroid/os/UserManager;I)I
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;-><init>(Lcom/android/server/display/AmbientBrightnessStatsTracker$Clock;)V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->isRunning()Z
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->reset()V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->start()V
+PLcom/android/server/display/AmbientBrightnessStatsTracker$Timer;->totalDurationSec()F
+PLcom/android/server/display/AmbientBrightnessStatsTracker;-><init>(Landroid/os/UserManager;Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;)V
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->access$000(Lcom/android/server/display/AmbientBrightnessStatsTracker;)Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->access$100(Lcom/android/server/display/AmbientBrightnessStatsTracker;)Landroid/os/UserManager;
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->add(IF)V
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->getUserStats(I)Ljava/util/ArrayList;
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->lambda$new$0(Lcom/android/server/display/AmbientBrightnessStatsTracker;)J
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->readStats(Ljava/io/InputStream;)V
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->start()V
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->stop()V
+PLcom/android/server/display/AmbientBrightnessStatsTracker;->writeStats(Ljava/io/OutputStream;)V
+PLcom/android/server/display/AutomaticBrightnessController$1;-><init>(Lcom/android/server/display/AutomaticBrightnessController;)V
+PLcom/android/server/display/AutomaticBrightnessController$1;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
+PLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;-><init>(JI)V
+PLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->clear()V
+PLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->prune(J)V
+PLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->push(JF)V
+PLcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;-><init>(Lcom/android/server/display/AutomaticBrightnessController;Landroid/os/Looper;)V
+PLcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/display/AutomaticBrightnessController;-><init>(Lcom/android/server/display/AutomaticBrightnessController$Callbacks;Landroid/os/Looper;Landroid/hardware/SensorManager;Lcom/android/server/display/BrightnessMappingStrategy;IIIFIIJJZLcom/android/server/display/HysteresisLevels;)V
+PLcom/android/server/display/AutomaticBrightnessController;->access$000(Lcom/android/server/display/AutomaticBrightnessController;)V
+PLcom/android/server/display/AutomaticBrightnessController;->access$100(Lcom/android/server/display/AutomaticBrightnessController;)V
+PLcom/android/server/display/AutomaticBrightnessController;->access$200(Lcom/android/server/display/AutomaticBrightnessController;)V
+PLcom/android/server/display/AutomaticBrightnessController;->access$300(Lcom/android/server/display/AutomaticBrightnessController;)Z
+PLcom/android/server/display/AutomaticBrightnessController;->access$400(Lcom/android/server/display/AutomaticBrightnessController;JF)V
+PLcom/android/server/display/AutomaticBrightnessController;->adjustLightSensorRate(I)V
+PLcom/android/server/display/AutomaticBrightnessController;->applyLightSensorMeasurement(JF)V
+PLcom/android/server/display/AutomaticBrightnessController;->clampScreenBrightness(I)I
+PLcom/android/server/display/AutomaticBrightnessController;->collectBrightnessAdjustmentSample()V
+PLcom/android/server/display/AutomaticBrightnessController;->configure(ZLandroid/hardware/display/BrightnessConfiguration;FZFZI)V
+PLcom/android/server/display/AutomaticBrightnessController;->getAutomaticScreenBrightness()I
+PLcom/android/server/display/AutomaticBrightnessController;->getAutomaticScreenBrightnessAdjustment()F
+PLcom/android/server/display/AutomaticBrightnessController;->handleLightSensorEvent(JF)V
+PLcom/android/server/display/AutomaticBrightnessController;->hasUserDataPoints()Z
+PLcom/android/server/display/AutomaticBrightnessController;->invalidateShortTermModel()V
+PLcom/android/server/display/AutomaticBrightnessController;->isDefaultConfig()Z
+PLcom/android/server/display/AutomaticBrightnessController;->isInteractivePolicy(I)Z
+PLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightBrighteningTransition(J)J
+PLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightDarkeningTransition(J)J
+PLcom/android/server/display/AutomaticBrightnessController;->prepareBrightnessAdjustmentSample()V
+PLcom/android/server/display/AutomaticBrightnessController;->resetShortTermModel()V
+PLcom/android/server/display/AutomaticBrightnessController;->setAmbientLux(F)V
+PLcom/android/server/display/AutomaticBrightnessController;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;)Z
+PLcom/android/server/display/AutomaticBrightnessController;->setDisplayPolicy(I)Z
+PLcom/android/server/display/AutomaticBrightnessController;->setLightSensorEnabled(Z)Z
+PLcom/android/server/display/AutomaticBrightnessController;->setScreenBrightnessByUser(F)Z
+PLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux(J)V
+PLcom/android/server/display/AutomaticBrightnessController;->updateAutoBrightness(Z)V
+PLcom/android/server/display/BrightnessIdleJob;-><init>()V
+PLcom/android/server/display/BrightnessIdleJob;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/display/BrightnessIdleJob;->scheduleJob(Landroid/content/Context;)V
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;-><init>(Landroid/hardware/display/BrightnessConfiguration;[F[IF)V
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->addUserDataPoint(FF)V
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->clearUserDataPoints()V
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->computeSpline()V
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->convertToNits(I)F
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->getAutoBrightnessAdjustment()F
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->getBrightness(F)F
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->getUnadjustedBrightness(F)F
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->hasUserDataPoints()Z
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->isDefaultConfig()Z
+PLcom/android/server/display/BrightnessMappingStrategy$PhysicalMappingStrategy;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;)Z
+PLcom/android/server/display/BrightnessMappingStrategy;-><init>()V
+PLcom/android/server/display/BrightnessMappingStrategy;->access$000(I)F
+PLcom/android/server/display/BrightnessMappingStrategy;->access$100(FFF)F
+PLcom/android/server/display/BrightnessMappingStrategy;->access$200([F[FFFFF)Landroid/util/Pair;
+PLcom/android/server/display/BrightnessMappingStrategy;->create(Landroid/content/res/Resources;)Lcom/android/server/display/BrightnessMappingStrategy;
+PLcom/android/server/display/BrightnessMappingStrategy;->findInsertionPoint([FF)I
+PLcom/android/server/display/BrightnessMappingStrategy;->getAdjustedCurve([F[FFFFF)Landroid/util/Pair;
+PLcom/android/server/display/BrightnessMappingStrategy;->getFloatArray(Landroid/content/res/TypedArray;)[F
+PLcom/android/server/display/BrightnessMappingStrategy;->getLuxLevels([I)[F
+PLcom/android/server/display/BrightnessMappingStrategy;->inferAutoBrightnessAdjustment(FFF)F
+PLcom/android/server/display/BrightnessMappingStrategy;->insertControlPoint([F[FFF)Landroid/util/Pair;
+PLcom/android/server/display/BrightnessMappingStrategy;->isValidMapping([F[F)Z
+PLcom/android/server/display/BrightnessMappingStrategy;->isValidMapping([F[I)Z
+PLcom/android/server/display/BrightnessMappingStrategy;->normalizeAbsoluteBrightness(I)F
+PLcom/android/server/display/BrightnessMappingStrategy;->permissibleRatio(FF)F
+PLcom/android/server/display/BrightnessMappingStrategy;->smoothCurve([F[FI)V
+PLcom/android/server/display/BrightnessTracker$BrightnessChangeValues;-><init>(FFZZJ)V
+PLcom/android/server/display/BrightnessTracker$Injector;-><init>()V
+PLcom/android/server/display/BrightnessTracker$Injector;->getBackgroundHandler()Landroid/os/Handler;
+PLcom/android/server/display/BrightnessTracker$Injector;->getFile(Ljava/lang/String;)Landroid/util/AtomicFile;
+PLcom/android/server/display/BrightnessTracker$Injector;->getFocusedStack()Landroid/app/ActivityManager$StackInfo;
+PLcom/android/server/display/BrightnessTracker$Injector;->getProfileIds(Landroid/os/UserManager;I)[I
+PLcom/android/server/display/BrightnessTracker$Injector;->getSecureIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)I
+PLcom/android/server/display/BrightnessTracker$Injector;->getUserSerialNumber(Landroid/os/UserManager;I)I
+PLcom/android/server/display/BrightnessTracker$Injector;->isBrightnessModeAutomatic(Landroid/content/ContentResolver;)Z
+PLcom/android/server/display/BrightnessTracker$Injector;->isInteractive(Landroid/content/Context;)Z
+PLcom/android/server/display/BrightnessTracker$Injector;->registerBrightnessModeObserver(Landroid/content/ContentResolver;Landroid/database/ContentObserver;)V
+PLcom/android/server/display/BrightnessTracker$Injector;->registerReceiver(Landroid/content/Context;Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)V
+PLcom/android/server/display/BrightnessTracker$Injector;->registerSensorListener(Landroid/content/Context;Landroid/hardware/SensorEventListener;Landroid/os/Handler;)V
+PLcom/android/server/display/BrightnessTracker$Injector;->scheduleIdleJob(Landroid/content/Context;)V
+PLcom/android/server/display/BrightnessTracker$Injector;->unregisterSensorListener(Landroid/content/Context;Landroid/hardware/SensorEventListener;)V
+PLcom/android/server/display/BrightnessTracker$LightData;-><init>()V
+PLcom/android/server/display/BrightnessTracker$LightData;-><init>(Lcom/android/server/display/BrightnessTracker$1;)V
+PLcom/android/server/display/BrightnessTracker$Receiver;-><init>(Lcom/android/server/display/BrightnessTracker;)V
+PLcom/android/server/display/BrightnessTracker$Receiver;-><init>(Lcom/android/server/display/BrightnessTracker;Lcom/android/server/display/BrightnessTracker$1;)V
+PLcom/android/server/display/BrightnessTracker$Receiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/display/BrightnessTracker$SensorListener;-><init>(Lcom/android/server/display/BrightnessTracker;)V
+PLcom/android/server/display/BrightnessTracker$SensorListener;-><init>(Lcom/android/server/display/BrightnessTracker;Lcom/android/server/display/BrightnessTracker$1;)V
+PLcom/android/server/display/BrightnessTracker$SensorListener;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
+PLcom/android/server/display/BrightnessTracker$SensorListener;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+PLcom/android/server/display/BrightnessTracker$SettingsObserver;-><init>(Lcom/android/server/display/BrightnessTracker;Landroid/os/Handler;)V
+PLcom/android/server/display/BrightnessTracker$TrackerHandler;-><init>(Lcom/android/server/display/BrightnessTracker;Landroid/os/Looper;)V
+PLcom/android/server/display/BrightnessTracker$TrackerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/display/BrightnessTracker;-><init>(Landroid/content/Context;Lcom/android/server/display/BrightnessTracker$Injector;)V
+PLcom/android/server/display/BrightnessTracker;->access$1000(Lcom/android/server/display/BrightnessTracker;F)V
+PLcom/android/server/display/BrightnessTracker;->access$1100(Lcom/android/server/display/BrightnessTracker;FZFZZJ)V
+PLcom/android/server/display/BrightnessTracker;->access$1200(Lcom/android/server/display/BrightnessTracker;)V
+PLcom/android/server/display/BrightnessTracker;->access$1300(Lcom/android/server/display/BrightnessTracker;)V
+PLcom/android/server/display/BrightnessTracker;->access$300(Lcom/android/server/display/BrightnessTracker;Landroid/hardware/SensorEvent;)V
+PLcom/android/server/display/BrightnessTracker;->access$400(Lcom/android/server/display/BrightnessTracker;Landroid/hardware/SensorEvent;)V
+PLcom/android/server/display/BrightnessTracker;->access$700(Lcom/android/server/display/BrightnessTracker;)Landroid/os/Handler;
+PLcom/android/server/display/BrightnessTracker;->access$900(Lcom/android/server/display/BrightnessTracker;II)V
+PLcom/android/server/display/BrightnessTracker;->backgroundStart(F)V
+PLcom/android/server/display/BrightnessTracker;->batteryLevelChanged(II)V
+PLcom/android/server/display/BrightnessTracker;->getAmbientBrightnessStats(I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/display/BrightnessTracker;->getEvents(IZ)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/display/BrightnessTracker;->handleBrightnessChanged(FZFZZJ)V
+PLcom/android/server/display/BrightnessTracker;->lambda$scheduleWriteBrightnessTrackerState$0(Lcom/android/server/display/BrightnessTracker;)V
+PLcom/android/server/display/BrightnessTracker;->notifyBrightnessChanged(FZFZZ)V
+PLcom/android/server/display/BrightnessTracker;->persistBrightnessTrackerState()V
+PLcom/android/server/display/BrightnessTracker;->readAmbientBrightnessStats()V
+PLcom/android/server/display/BrightnessTracker;->readEvents()V
+PLcom/android/server/display/BrightnessTracker;->recordAmbientBrightnessStats(Landroid/hardware/SensorEvent;)V
+PLcom/android/server/display/BrightnessTracker;->recordSensorEvent(Landroid/hardware/SensorEvent;)V
+PLcom/android/server/display/BrightnessTracker;->scheduleWriteBrightnessTrackerState()V
+PLcom/android/server/display/BrightnessTracker;->start(F)V
+PLcom/android/server/display/BrightnessTracker;->startSensorListener()V
+PLcom/android/server/display/BrightnessTracker;->stopSensorListener()V
+PLcom/android/server/display/BrightnessTracker;->writeAmbientBrightnessStats()V
+PLcom/android/server/display/BrightnessTracker;->writeEvents()V
+PLcom/android/server/display/BrightnessTracker;->writeEventsLocked(Ljava/io/OutputStream;)V
+PLcom/android/server/display/ColorDisplayService$2;-><init>(Lcom/android/server/display/ColorDisplayService;Lcom/android/server/display/DisplayTransformManager;)V
+PLcom/android/server/display/ColorDisplayService$2;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V
+PLcom/android/server/display/ColorDisplayService$3;-><init>(Lcom/android/server/display/ColorDisplayService;Lcom/android/server/display/DisplayTransformManager;[F)V
+PLcom/android/server/display/ColorDisplayService$3;->onAnimationEnd(Landroid/animation/Animator;)V
+PLcom/android/server/display/ColorDisplayService$AutoMode;-><init>(Lcom/android/server/display/ColorDisplayService;)V
+PLcom/android/server/display/ColorDisplayService$AutoMode;-><init>(Lcom/android/server/display/ColorDisplayService;Lcom/android/server/display/ColorDisplayService$1;)V
+PLcom/android/server/display/ColorDisplayService$ColorMatrixEvaluator;-><init>()V
+PLcom/android/server/display/ColorDisplayService$ColorMatrixEvaluator;-><init>(Lcom/android/server/display/ColorDisplayService$1;)V
+PLcom/android/server/display/ColorDisplayService$ColorMatrixEvaluator;->evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/display/ColorDisplayService$CustomAutoMode$1;-><init>(Lcom/android/server/display/ColorDisplayService$CustomAutoMode;Lcom/android/server/display/ColorDisplayService;)V
+PLcom/android/server/display/ColorDisplayService$CustomAutoMode;-><init>(Lcom/android/server/display/ColorDisplayService;)V
+PLcom/android/server/display/ColorDisplayService$CustomAutoMode;->onActivated(Z)V
+PLcom/android/server/display/ColorDisplayService$CustomAutoMode;->onAlarm()V
+PLcom/android/server/display/ColorDisplayService$CustomAutoMode;->onStart()V
+PLcom/android/server/display/ColorDisplayService$CustomAutoMode;->updateActivated()V
+PLcom/android/server/display/ColorDisplayService$CustomAutoMode;->updateNextAlarm(Ljava/lang/Boolean;Ljava/time/LocalDateTime;)V
+PLcom/android/server/display/ColorDisplayService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/display/ColorDisplayService;->access$1000(Lcom/android/server/display/ColorDisplayService;)Ljava/lang/Boolean;
+PLcom/android/server/display/ColorDisplayService;->access$602(Lcom/android/server/display/ColorDisplayService;Landroid/animation/ValueAnimator;)Landroid/animation/ValueAnimator;
+PLcom/android/server/display/ColorDisplayService;->access$900(Lcom/android/server/display/ColorDisplayService;)Lcom/android/internal/app/ColorDisplayController;
+PLcom/android/server/display/ColorDisplayService;->applyTint(Z)V
+PLcom/android/server/display/ColorDisplayService;->getDateTimeAfter(Ljava/time/LocalTime;Ljava/time/LocalDateTime;)Ljava/time/LocalDateTime;
+PLcom/android/server/display/ColorDisplayService;->getDateTimeBefore(Ljava/time/LocalTime;Ljava/time/LocalDateTime;)Ljava/time/LocalDateTime;
+PLcom/android/server/display/ColorDisplayService;->isUserSetupCompleted(Landroid/content/ContentResolver;I)Z
+PLcom/android/server/display/ColorDisplayService;->onActivated(Z)V
+PLcom/android/server/display/ColorDisplayService;->onAutoModeChanged(I)V
+PLcom/android/server/display/ColorDisplayService;->onBootPhase(I)V
+PLcom/android/server/display/ColorDisplayService;->onDisplayColorModeChanged(I)V
+PLcom/android/server/display/ColorDisplayService;->onStart()V
+PLcom/android/server/display/ColorDisplayService;->onStartUser(I)V
+PLcom/android/server/display/ColorDisplayService;->onUserChanged(I)V
+PLcom/android/server/display/ColorDisplayService;->setCoefficientMatrix(Landroid/content/Context;Z)V
+PLcom/android/server/display/ColorDisplayService;->setMatrix(I[F)V
+PLcom/android/server/display/ColorDisplayService;->setUp()V
+PLcom/android/server/display/ColorFade$NaturalSurfaceLayout;-><init>(Landroid/hardware/display/DisplayManagerInternal;ILandroid/view/SurfaceControl;)V
+PLcom/android/server/display/ColorFade$NaturalSurfaceLayout;->dispose()V
+PLcom/android/server/display/ColorFade$NaturalSurfaceLayout;->onDisplayTransaction()V
+PLcom/android/server/display/ColorFade;-><init>(I)V
+PLcom/android/server/display/ColorFade;->attachEglContext()Z
+PLcom/android/server/display/ColorFade;->captureScreenshotTextureAndSetViewport()Z
+PLcom/android/server/display/ColorFade;->checkGlErrors(Ljava/lang/String;)Z
+PLcom/android/server/display/ColorFade;->checkGlErrors(Ljava/lang/String;Z)Z
+PLcom/android/server/display/ColorFade;->createEglContext()Z
+PLcom/android/server/display/ColorFade;->createEglSurface()Z
+PLcom/android/server/display/ColorFade;->createNativeFloatBuffer(I)Ljava/nio/FloatBuffer;
+PLcom/android/server/display/ColorFade;->createSurface()Z
+PLcom/android/server/display/ColorFade;->destroyEglSurface()V
+PLcom/android/server/display/ColorFade;->destroyGLBuffers()V
+PLcom/android/server/display/ColorFade;->destroyGLShaders()V
+PLcom/android/server/display/ColorFade;->destroyScreenshotTexture()V
+PLcom/android/server/display/ColorFade;->destroySurface()V
+PLcom/android/server/display/ColorFade;->detachEglContext()V
+PLcom/android/server/display/ColorFade;->dismiss()V
+PLcom/android/server/display/ColorFade;->dismissResources()V
+PLcom/android/server/display/ColorFade;->initGLBuffers()Z
+PLcom/android/server/display/ColorFade;->initGLShaders(Landroid/content/Context;)Z
+PLcom/android/server/display/ColorFade;->loadShader(Landroid/content/Context;II)I
+PLcom/android/server/display/ColorFade;->ortho(FFFFFF)V
+PLcom/android/server/display/ColorFade;->prepare(Landroid/content/Context;I)Z
+PLcom/android/server/display/ColorFade;->readFile(Landroid/content/Context;I)Ljava/lang/String;
+PLcom/android/server/display/ColorFade;->setQuad(Ljava/nio/FloatBuffer;FFFF)V
+PLcom/android/server/display/ColorFade;->showSurface(F)Z
+PLcom/android/server/display/DisplayAdapter;->getContext()Landroid/content/Context;
+PLcom/android/server/display/DisplayAdapter;->getSyncRoot()Lcom/android/server/display/DisplayManagerService$SyncRoot;
+PLcom/android/server/display/DisplayDevice;->performTraversalLocked(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/display/DisplayDevice;->populateViewportLocked(Landroid/hardware/display/DisplayViewport;)V
+PLcom/android/server/display/DisplayDevice;->setLayerStackLocked(Landroid/view/SurfaceControl$Transaction;I)V
+PLcom/android/server/display/DisplayDevice;->setProjectionLocked(Landroid/view/SurfaceControl$Transaction;ILandroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/display/DisplayManagerService$BinderService;->getAmbientBrightnessStats()Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/display/DisplayManagerService$BinderService;->getBrightnessEvents(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/display/DisplayManagerService$BinderService;->getStableDisplaySize()Landroid/graphics/Point;
+PLcom/android/server/display/DisplayManagerService$BinderService;->getWifiDisplayStatus()Landroid/hardware/display/WifiDisplayStatus;
+PLcom/android/server/display/DisplayManagerService$BinderService;->requestColorMode(II)V
+PLcom/android/server/display/DisplayManagerService$BinderService;->setBrightnessConfigurationForUser(Landroid/hardware/display/BrightnessConfiguration;ILjava/lang/String;)V
+PLcom/android/server/display/DisplayManagerService$BinderService;->setTemporaryBrightness(I)V
+PLcom/android/server/display/DisplayManagerService$BinderService;->validatePackageName(ILjava/lang/String;)Z
+PLcom/android/server/display/DisplayManagerService$CallbackRecord;->binderDied()V
+PLcom/android/server/display/DisplayManagerService$CallbackRecord;->notifyDisplayEventAsync(II)V
+PLcom/android/server/display/DisplayManagerService$LocalService$1;-><init>(Lcom/android/server/display/DisplayManagerService$LocalService;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;)V
+PLcom/android/server/display/DisplayManagerService$LocalService$1;->requestDisplayState(II)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->getDisplayInfo(I)Landroid/view/DisplayInfo;
+PLcom/android/server/display/DisplayManagerService$LocalService;->getNonOverrideDisplayInfo(ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->initPowerManagement(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Landroid/os/Handler;Landroid/hardware/SensorManager;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->isProximitySensorAvailable()Z
+PLcom/android/server/display/DisplayManagerService$LocalService;->onOverlayChanged()V
+PLcom/android/server/display/DisplayManagerService$LocalService;->performTraversal(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->persistBrightnessTrackerState()V
+PLcom/android/server/display/DisplayManagerService$LocalService;->registerDisplayTransactionListener(Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->setDisplayAccessUIDs(Landroid/util/SparseArray;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->setDisplayInfoOverrideFromWindowManager(ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->setDisplayProperties(IZFIZ)V
+PLcom/android/server/display/DisplayManagerService$LocalService;->unregisterDisplayTransactionListener(Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+PLcom/android/server/display/DisplayManagerService;->access$1000(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/DisplayViewport;
+PLcom/android/server/display/DisplayManagerService;->access$1100(Lcom/android/server/display/DisplayManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/display/DisplayManagerService;->access$1200(Lcom/android/server/display/DisplayManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/display/DisplayManagerService;->access$1300(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/input/InputManagerInternal;
+PLcom/android/server/display/DisplayManagerService;->access$1400(Lcom/android/server/display/DisplayManagerService;)V
+PLcom/android/server/display/DisplayManagerService;->access$1900(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$CallbackRecord;)V
+PLcom/android/server/display/DisplayManagerService;->access$2100(Lcom/android/server/display/DisplayManagerService;I)[I
+PLcom/android/server/display/DisplayManagerService;->access$2200(Lcom/android/server/display/DisplayManagerService;)Landroid/graphics/Point;
+PLcom/android/server/display/DisplayManagerService;->access$2400(Lcom/android/server/display/DisplayManagerService;)Landroid/content/Context;
+PLcom/android/server/display/DisplayManagerService;->access$300(Lcom/android/server/display/DisplayManagerService;)V
+PLcom/android/server/display/DisplayManagerService;->access$3300(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/WifiDisplayStatus;
+PLcom/android/server/display/DisplayManagerService;->access$3400(Lcom/android/server/display/DisplayManagerService;II)V
+PLcom/android/server/display/DisplayManagerService;->access$4202(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayPowerController;)Lcom/android/server/display/DisplayPowerController;
+PLcom/android/server/display/DisplayManagerService;->access$4300(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/BrightnessConfiguration;ILjava/lang/String;)V
+PLcom/android/server/display/DisplayManagerService;->access$4600(Lcom/android/server/display/DisplayManagerService;II)V
+PLcom/android/server/display/DisplayManagerService;->access$4700(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler;
+PLcom/android/server/display/DisplayManagerService;->access$4800(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+PLcom/android/server/display/DisplayManagerService;->access$4900(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+PLcom/android/server/display/DisplayManagerService;->access$500(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/wm/WindowManagerInternal;
+PLcom/android/server/display/DisplayManagerService;->access$5000(Lcom/android/server/display/DisplayManagerService;ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->access$5100(Lcom/android/server/display/DisplayManagerService;ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->access$5200(Lcom/android/server/display/DisplayManagerService;IZFIZ)V
+PLcom/android/server/display/DisplayManagerService;->access$5400(Lcom/android/server/display/DisplayManagerService;Landroid/util/SparseArray;)V
+PLcom/android/server/display/DisplayManagerService;->access$5600(Lcom/android/server/display/DisplayManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/display/DisplayManagerService;->access$700(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/DisplayViewport;
+PLcom/android/server/display/DisplayManagerService;->access$800(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/DisplayViewport;
+PLcom/android/server/display/DisplayManagerService;->access$900(Lcom/android/server/display/DisplayManagerService;)Landroid/hardware/display/DisplayViewport;
+PLcom/android/server/display/DisplayManagerService;->applyGlobalDisplayStateLocked(Ljava/util/List;)V
+PLcom/android/server/display/DisplayManagerService;->clearViewportsLocked()V
+PLcom/android/server/display/DisplayManagerService;->configureDisplayLocked(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/DisplayDevice;)V
+PLcom/android/server/display/DisplayManagerService;->findLogicalDisplayForDeviceLocked(Lcom/android/server/display/DisplayDevice;)Lcom/android/server/display/LogicalDisplay;
+PLcom/android/server/display/DisplayManagerService;->getDisplayIdsInternal(I)[I
+PLcom/android/server/display/DisplayManagerService;->getNonOverrideDisplayInfoInternal(ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->getStableDisplaySizeInternal()Landroid/graphics/Point;
+PLcom/android/server/display/DisplayManagerService;->getUserManager()Landroid/os/UserManager;
+PLcom/android/server/display/DisplayManagerService;->getWifiDisplayStatusInternal()Landroid/hardware/display/WifiDisplayStatus;
+PLcom/android/server/display/DisplayManagerService;->isBrightnessConfigurationTooDark(Landroid/hardware/display/BrightnessConfiguration;)Z
+PLcom/android/server/display/DisplayManagerService;->loadBrightnessConfiguration()V
+PLcom/android/server/display/DisplayManagerService;->onCallbackDied(Lcom/android/server/display/DisplayManagerService$CallbackRecord;)V
+PLcom/android/server/display/DisplayManagerService;->performTraversalInternal(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/display/DisplayManagerService;->performTraversalLocked(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/display/DisplayManagerService;->registerAdditionalDisplayAdapters()V
+PLcom/android/server/display/DisplayManagerService;->registerDisplayTransactionListenerInternal(Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+PLcom/android/server/display/DisplayManagerService;->registerOverlayDisplayAdapterLocked()V
+PLcom/android/server/display/DisplayManagerService;->registerWifiDisplayAdapterLocked()V
+PLcom/android/server/display/DisplayManagerService;->requestColorModeInternal(II)V
+PLcom/android/server/display/DisplayManagerService;->requestGlobalDisplayStateInternal(II)V
+PLcom/android/server/display/DisplayManagerService;->setBrightnessConfigurationForUserInternal(Landroid/hardware/display/BrightnessConfiguration;ILjava/lang/String;)V
+PLcom/android/server/display/DisplayManagerService;->setDisplayAccessUIDsInternal(Landroid/util/SparseArray;)V
+PLcom/android/server/display/DisplayManagerService;->setDisplayInfoOverrideFromWindowManagerInternal(ILandroid/view/DisplayInfo;)V
+PLcom/android/server/display/DisplayManagerService;->setDisplayPropertiesInternal(IZFIZ)V
+PLcom/android/server/display/DisplayManagerService;->setViewportLocked(Landroid/hardware/display/DisplayViewport;Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/DisplayDevice;)V
+PLcom/android/server/display/DisplayManagerService;->setupSchedulerPolicies()V
+PLcom/android/server/display/DisplayManagerService;->shouldRegisterNonEssentialDisplayAdaptersLocked()Z
+PLcom/android/server/display/DisplayManagerService;->stopWifiDisplayScanLocked(Lcom/android/server/display/DisplayManagerService$CallbackRecord;)V
+PLcom/android/server/display/DisplayManagerService;->systemReady(ZZ)V
+PLcom/android/server/display/DisplayManagerService;->unregisterDisplayTransactionListenerInternal(Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;)V
+PLcom/android/server/display/DisplayManagerService;->validateBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;)V
+PLcom/android/server/display/DisplayManagerService;->windowManagerAndInputReady()V
+PLcom/android/server/display/DisplayPowerController$1;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$1;->onAnimationEnd(Landroid/animation/Animator;)V
+PLcom/android/server/display/DisplayPowerController$1;->onAnimationStart(Landroid/animation/Animator;)V
+PLcom/android/server/display/DisplayPowerController$2;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$2;->onAnimationEnd()V
+PLcom/android/server/display/DisplayPowerController$3;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$3;->run()V
+PLcom/android/server/display/DisplayPowerController$4;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$4;->run()V
+PLcom/android/server/display/DisplayPowerController$5;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$6;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$8;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$DisplayControllerHandler;-><init>(Lcom/android/server/display/DisplayPowerController;Landroid/os/Looper;)V
+PLcom/android/server/display/DisplayPowerController$DisplayControllerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/display/DisplayPowerController$ScreenOffUnblocker;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$ScreenOffUnblocker;-><init>(Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$1;)V
+PLcom/android/server/display/DisplayPowerController$ScreenOffUnblocker;->onScreenOff()V
+PLcom/android/server/display/DisplayPowerController$ScreenOnUnblocker;-><init>(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController$ScreenOnUnblocker;-><init>(Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$1;)V
+PLcom/android/server/display/DisplayPowerController$ScreenOnUnblocker;->onScreenOn()V
+PLcom/android/server/display/DisplayPowerController$SettingsObserver;-><init>(Lcom/android/server/display/DisplayPowerController;Landroid/os/Handler;)V
+PLcom/android/server/display/DisplayPowerController$SettingsObserver;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/display/DisplayPowerController;-><init>(Landroid/content/Context;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Landroid/os/Handler;Landroid/hardware/SensorManager;Lcom/android/server/display/DisplayBlanker;)V
+PLcom/android/server/display/DisplayPowerController;->access$000(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController;->access$1102(Lcom/android/server/display/DisplayPowerController;Landroid/hardware/display/BrightnessConfiguration;)Landroid/hardware/display/BrightnessConfiguration;
+PLcom/android/server/display/DisplayPowerController;->access$1202(Lcom/android/server/display/DisplayPowerController;I)I
+PLcom/android/server/display/DisplayPowerController;->access$1700(Lcom/android/server/display/DisplayPowerController;Z)V
+PLcom/android/server/display/DisplayPowerController;->access$1800(Lcom/android/server/display/DisplayPowerController;)Lcom/android/server/display/DisplayPowerController$DisplayControllerHandler;
+PLcom/android/server/display/DisplayPowerController;->access$300(Lcom/android/server/display/DisplayPowerController;)Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;
+PLcom/android/server/display/DisplayPowerController;->access$500(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController;->access$700(Lcom/android/server/display/DisplayPowerController;)Lcom/android/server/display/DisplayPowerController$ScreenOnUnblocker;
+PLcom/android/server/display/DisplayPowerController;->access$800(Lcom/android/server/display/DisplayPowerController;)V
+PLcom/android/server/display/DisplayPowerController;->access$900(Lcom/android/server/display/DisplayPowerController;)Lcom/android/server/display/DisplayPowerController$ScreenOffUnblocker;
+PLcom/android/server/display/DisplayPowerController;->animateScreenBrightness(II)V
+PLcom/android/server/display/DisplayPowerController;->animateScreenStateChange(IZ)V
+PLcom/android/server/display/DisplayPowerController;->blockScreenOff()V
+PLcom/android/server/display/DisplayPowerController;->blockScreenOn()V
+PLcom/android/server/display/DisplayPowerController;->clampAbsoluteBrightness(I)I
+PLcom/android/server/display/DisplayPowerController;->clampAutoBrightnessAdjustment(F)F
+PLcom/android/server/display/DisplayPowerController;->clampScreenBrightness(I)I
+PLcom/android/server/display/DisplayPowerController;->clampScreenBrightnessForVr(I)I
+PLcom/android/server/display/DisplayPowerController;->convertToNits(I)F
+PLcom/android/server/display/DisplayPowerController;->getAmbientBrightnessStats(I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/display/DisplayPowerController;->getAutoBrightnessAdjustmentSetting()F
+PLcom/android/server/display/DisplayPowerController;->getBrightnessEvents(IZ)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/display/DisplayPowerController;->getScreenBrightnessForVrSetting()I
+PLcom/android/server/display/DisplayPowerController;->getScreenBrightnessSetting()I
+PLcom/android/server/display/DisplayPowerController;->handleSettingsChange(Z)V
+PLcom/android/server/display/DisplayPowerController;->initialize()V
+PLcom/android/server/display/DisplayPowerController;->isProximitySensorAvailable()Z
+PLcom/android/server/display/DisplayPowerController;->notifyBrightnessChanged(IZZ)V
+PLcom/android/server/display/DisplayPowerController;->persistBrightnessTrackerState()V
+PLcom/android/server/display/DisplayPowerController;->putAutoBrightnessAdjustmentSetting(F)V
+PLcom/android/server/display/DisplayPowerController;->putScreenBrightnessSetting(I)V
+PLcom/android/server/display/DisplayPowerController;->sendOnStateChangedWithWakelock()V
+PLcom/android/server/display/DisplayPowerController;->sendUpdatePowerState()V
+PLcom/android/server/display/DisplayPowerController;->sendUpdatePowerStateLocked()V
+PLcom/android/server/display/DisplayPowerController;->setBrightnessConfiguration(Landroid/hardware/display/BrightnessConfiguration;)V
+PLcom/android/server/display/DisplayPowerController;->setProximitySensorEnabled(Z)V
+PLcom/android/server/display/DisplayPowerController;->setReportedScreenState(I)V
+PLcom/android/server/display/DisplayPowerController;->setScreenState(I)Z
+PLcom/android/server/display/DisplayPowerController;->setScreenState(IZ)Z
+PLcom/android/server/display/DisplayPowerController;->setTemporaryBrightness(I)V
+PLcom/android/server/display/DisplayPowerController;->unblockScreenOff()V
+PLcom/android/server/display/DisplayPowerController;->unblockScreenOn()V
+PLcom/android/server/display/DisplayPowerController;->updateAutoBrightnessAdjustment()Z
+PLcom/android/server/display/DisplayPowerController;->updateBrightness()V
+PLcom/android/server/display/DisplayPowerController;->updatePowerState()V
+PLcom/android/server/display/DisplayPowerController;->updateUserSetScreenBrightness()Z
+PLcom/android/server/display/DisplayPowerState$1;-><init>(Ljava/lang/String;)V
+PLcom/android/server/display/DisplayPowerState$1;->setValue(Lcom/android/server/display/DisplayPowerState;F)V
+PLcom/android/server/display/DisplayPowerState$1;->setValue(Ljava/lang/Object;F)V
+PLcom/android/server/display/DisplayPowerState$2;-><init>(Ljava/lang/String;)V
+PLcom/android/server/display/DisplayPowerState$2;->setValue(Lcom/android/server/display/DisplayPowerState;I)V
+PLcom/android/server/display/DisplayPowerState$2;->setValue(Ljava/lang/Object;I)V
+PLcom/android/server/display/DisplayPowerState$3;-><init>(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState$3;->run()V
+PLcom/android/server/display/DisplayPowerState$4;-><init>(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState$4;->run()V
+PLcom/android/server/display/DisplayPowerState$PhotonicModulator;-><init>(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState$PhotonicModulator;->run()V
+PLcom/android/server/display/DisplayPowerState$PhotonicModulator;->setState(II)Z
+PLcom/android/server/display/DisplayPowerState;-><init>(Lcom/android/server/display/DisplayBlanker;Lcom/android/server/display/ColorFade;)V
+PLcom/android/server/display/DisplayPowerState;->access$002(Lcom/android/server/display/DisplayPowerState;Z)Z
+PLcom/android/server/display/DisplayPowerState;->access$100(Lcom/android/server/display/DisplayPowerState;)I
+PLcom/android/server/display/DisplayPowerState;->access$1000(Lcom/android/server/display/DisplayPowerState;)Lcom/android/server/display/ColorFade;
+PLcom/android/server/display/DisplayPowerState;->access$1100()Ljava/lang/String;
+PLcom/android/server/display/DisplayPowerState;->access$1202(Lcom/android/server/display/DisplayPowerState;Z)Z
+PLcom/android/server/display/DisplayPowerState;->access$1300(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState;->access$1400(Lcom/android/server/display/DisplayPowerState;)Lcom/android/server/display/DisplayBlanker;
+PLcom/android/server/display/DisplayPowerState;->access$200(Lcom/android/server/display/DisplayPowerState;)F
+PLcom/android/server/display/DisplayPowerState;->access$300(Lcom/android/server/display/DisplayPowerState;)I
+PLcom/android/server/display/DisplayPowerState;->access$400(Lcom/android/server/display/DisplayPowerState;)Lcom/android/server/display/DisplayPowerState$PhotonicModulator;
+PLcom/android/server/display/DisplayPowerState;->access$500()Z
+PLcom/android/server/display/DisplayPowerState;->access$602(Lcom/android/server/display/DisplayPowerState;Z)Z
+PLcom/android/server/display/DisplayPowerState;->access$700(Lcom/android/server/display/DisplayPowerState;)V
+PLcom/android/server/display/DisplayPowerState;->access$802(Lcom/android/server/display/DisplayPowerState;Z)Z
+PLcom/android/server/display/DisplayPowerState;->access$900(Lcom/android/server/display/DisplayPowerState;)Z
+PLcom/android/server/display/DisplayPowerState;->dismissColorFade()V
+PLcom/android/server/display/DisplayPowerState;->dismissColorFadeResources()V
+PLcom/android/server/display/DisplayPowerState;->getColorFadeLevel()F
+PLcom/android/server/display/DisplayPowerState;->getScreenBrightness()I
+PLcom/android/server/display/DisplayPowerState;->getScreenState()I
+PLcom/android/server/display/DisplayPowerState;->invokeCleanListenerIfNeeded()V
+PLcom/android/server/display/DisplayPowerState;->postScreenUpdateThreadSafe()V
+PLcom/android/server/display/DisplayPowerState;->prepareColorFade(Landroid/content/Context;I)Z
+PLcom/android/server/display/DisplayPowerState;->scheduleColorFadeDraw()V
+PLcom/android/server/display/DisplayPowerState;->scheduleScreenUpdate()V
+PLcom/android/server/display/DisplayPowerState;->setColorFadeLevel(F)V
+PLcom/android/server/display/DisplayPowerState;->setScreenBrightness(I)V
+PLcom/android/server/display/DisplayPowerState;->setScreenState(I)V
+PLcom/android/server/display/DisplayPowerState;->waitUntilClean(Ljava/lang/Runnable;)Z
+PLcom/android/server/display/DisplayTransformManager;->applyColorMatrix([F)V
+PLcom/android/server/display/DisplayTransformManager;->applySaturation(F)V
+PLcom/android/server/display/DisplayTransformManager;->computeColorMatrixLocked()[F
+PLcom/android/server/display/DisplayTransformManager;->getColorMatrix(I)[F
+PLcom/android/server/display/DisplayTransformManager;->needsLinearColorMatrix()Z
+PLcom/android/server/display/DisplayTransformManager;->needsLinearColorMatrix(I)Z
+PLcom/android/server/display/DisplayTransformManager;->setColorMatrix(I[F)V
+PLcom/android/server/display/DisplayTransformManager;->setColorMode(I[F)Z
+PLcom/android/server/display/DisplayTransformManager;->setDaltonizerMode(I)V
+PLcom/android/server/display/DisplayTransformManager;->setDisplayColor(I)V
+PLcom/android/server/display/DisplayTransformManager;->updateConfiguration()V
+PLcom/android/server/display/HysteresisLevels;-><init>([I[I[I)V
+PLcom/android/server/display/HysteresisLevels;->getBrighteningThreshold(F)F
+PLcom/android/server/display/HysteresisLevels;->getDarkeningThreshold(F)F
+PLcom/android/server/display/HysteresisLevels;->getReferenceLevel(F[F)F
+PLcom/android/server/display/HysteresisLevels;->setArrayFormat([IF)[F
+PLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->onOverlayChangedLocked()V
+PLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestColorModeLocked(I)Z
+PLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestDisplayModesLocked(II)V
+PLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestModeLocked(I)Z
+PLcom/android/server/display/LogicalDisplay;->configureDisplayLocked(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/DisplayDevice;Z)V
+PLcom/android/server/display/LogicalDisplay;->getDisplayIdLocked()I
+PLcom/android/server/display/LogicalDisplay;->getNonOverrideDisplayInfoLocked(Landroid/view/DisplayInfo;)V
+PLcom/android/server/display/LogicalDisplay;->getRequestedColorModeLocked()I
+PLcom/android/server/display/LogicalDisplay;->getRequestedModeIdLocked()I
+PLcom/android/server/display/LogicalDisplay;->hasContentLocked()Z
+PLcom/android/server/display/LogicalDisplay;->setDisplayInfoOverrideFromWindowManagerLocked(Landroid/view/DisplayInfo;)Z
+PLcom/android/server/display/LogicalDisplay;->setHasContentLocked(Z)V
+PLcom/android/server/display/OverlayDisplayAdapter$1$1;-><init>(Lcom/android/server/display/OverlayDisplayAdapter$1;Landroid/os/Handler;)V
+PLcom/android/server/display/OverlayDisplayAdapter$1;-><init>(Lcom/android/server/display/OverlayDisplayAdapter;)V
+PLcom/android/server/display/OverlayDisplayAdapter$1;->run()V
+PLcom/android/server/display/OverlayDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Landroid/os/Handler;)V
+PLcom/android/server/display/OverlayDisplayAdapter;->access$000(Lcom/android/server/display/OverlayDisplayAdapter;)V
+PLcom/android/server/display/OverlayDisplayAdapter;->registerLocked()V
+PLcom/android/server/display/OverlayDisplayAdapter;->updateOverlayDisplayDevices()V
+PLcom/android/server/display/OverlayDisplayAdapter;->updateOverlayDisplayDevicesLocked()V
+PLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->access$200(Lcom/android/server/display/PersistentDataStore$BrightnessConfigurations;Landroid/hardware/display/BrightnessConfiguration;ILjava/lang/String;)Z
+PLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->getBrightnessConfiguration(I)Landroid/hardware/display/BrightnessConfiguration;
+PLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->saveConfigurationToXml(Lorg/xmlpull/v1/XmlSerializer;Landroid/hardware/display/BrightnessConfiguration;)V
+PLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->setBrightnessConfigurationForUser(Landroid/hardware/display/BrightnessConfiguration;ILjava/lang/String;)Z
+PLcom/android/server/display/PersistentDataStore$Injector;->finishWrite(Ljava/io/OutputStream;Z)V
+PLcom/android/server/display/PersistentDataStore$Injector;->startWrite()Ljava/io/OutputStream;
+PLcom/android/server/display/PersistentDataStore$StableDeviceValues;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/display/PersistentDataStore;->getBrightnessConfiguration(I)Landroid/hardware/display/BrightnessConfiguration;
+PLcom/android/server/display/PersistentDataStore;->save()V
+PLcom/android/server/display/PersistentDataStore;->saveIfNeeded()V
+PLcom/android/server/display/PersistentDataStore;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/display/PersistentDataStore;->setBrightnessConfigurationForUser(Landroid/hardware/display/BrightnessConfiguration;ILjava/lang/String;)V
+PLcom/android/server/display/PersistentDataStore;->setDirty()V
+PLcom/android/server/display/RampAnimator$1;-><init>(Lcom/android/server/display/RampAnimator;)V
+PLcom/android/server/display/RampAnimator$1;->run()V
+PLcom/android/server/display/RampAnimator;-><init>(Ljava/lang/Object;Landroid/util/IntProperty;)V
+PLcom/android/server/display/RampAnimator;->access$000(Lcom/android/server/display/RampAnimator;)Landroid/view/Choreographer;
+PLcom/android/server/display/RampAnimator;->access$100(Lcom/android/server/display/RampAnimator;)J
+PLcom/android/server/display/RampAnimator;->access$1000(Lcom/android/server/display/RampAnimator;)Lcom/android/server/display/RampAnimator$Listener;
+PLcom/android/server/display/RampAnimator;->access$102(Lcom/android/server/display/RampAnimator;J)J
+PLcom/android/server/display/RampAnimator;->access$200(Lcom/android/server/display/RampAnimator;)F
+PLcom/android/server/display/RampAnimator;->access$202(Lcom/android/server/display/RampAnimator;F)F
+PLcom/android/server/display/RampAnimator;->access$300(Lcom/android/server/display/RampAnimator;)I
+PLcom/android/server/display/RampAnimator;->access$400(Lcom/android/server/display/RampAnimator;)I
+PLcom/android/server/display/RampAnimator;->access$500(Lcom/android/server/display/RampAnimator;)I
+PLcom/android/server/display/RampAnimator;->access$502(Lcom/android/server/display/RampAnimator;I)I
+PLcom/android/server/display/RampAnimator;->access$600(Lcom/android/server/display/RampAnimator;)Ljava/lang/Object;
+PLcom/android/server/display/RampAnimator;->access$700(Lcom/android/server/display/RampAnimator;)Landroid/util/IntProperty;
+PLcom/android/server/display/RampAnimator;->access$800(Lcom/android/server/display/RampAnimator;)V
+PLcom/android/server/display/RampAnimator;->access$902(Lcom/android/server/display/RampAnimator;Z)Z
+PLcom/android/server/display/RampAnimator;->animateTo(II)Z
+PLcom/android/server/display/RampAnimator;->isAnimating()Z
+PLcom/android/server/display/RampAnimator;->postAnimationCallback()V
+PLcom/android/server/display/RampAnimator;->setListener(Lcom/android/server/display/RampAnimator$Listener;)V
+PLcom/android/server/display/utils/Plog$SystemPlog;-><init>(Ljava/lang/String;)V
+PLcom/android/server/display/utils/Plog;-><init>()V
+PLcom/android/server/display/utils/Plog;->createSystemPlog(Ljava/lang/String;)Lcom/android/server/display/utils/Plog;
+PLcom/android/server/dreams/-$$Lambda$DreamManagerService$f7cEVKQvPKMm_Ir9dq0e6PSOkX8;-><init>(Lcom/android/server/dreams/DreamManagerService;Landroid/os/Binder;Landroid/content/ComponentName;ZZILandroid/os/PowerManager$WakeLock;)V
+PLcom/android/server/dreams/-$$Lambda$DreamManagerService$f7cEVKQvPKMm_Ir9dq0e6PSOkX8;->run()V
+PLcom/android/server/dreams/-$$Lambda$gXC4nM2f5GMCBX0ED45DCQQjqv0;-><init>(Lcom/android/server/dreams/DreamController$DreamRecord;)V
+PLcom/android/server/dreams/-$$Lambda$gXC4nM2f5GMCBX0ED45DCQQjqv0;->run()V
+PLcom/android/server/dreams/DreamController$1;-><init>(Lcom/android/server/dreams/DreamController;)V
+PLcom/android/server/dreams/DreamController$1;->run()V
+PLcom/android/server/dreams/DreamController$2;-><init>(Lcom/android/server/dreams/DreamController;)V
+PLcom/android/server/dreams/DreamController$3;-><init>(Lcom/android/server/dreams/DreamController;Lcom/android/server/dreams/DreamController$DreamRecord;)V
+PLcom/android/server/dreams/DreamController$3;->run()V
+PLcom/android/server/dreams/DreamController$DreamRecord$2;-><init>(Lcom/android/server/dreams/DreamController$DreamRecord;Landroid/os/IBinder;)V
+PLcom/android/server/dreams/DreamController$DreamRecord$2;->run()V
+PLcom/android/server/dreams/DreamController$DreamRecord$4;-><init>(Lcom/android/server/dreams/DreamController$DreamRecord;)V
+PLcom/android/server/dreams/DreamController$DreamRecord$4;->sendResult(Landroid/os/Bundle;)V
+PLcom/android/server/dreams/DreamController$DreamRecord;-><init>(Lcom/android/server/dreams/DreamController;Landroid/os/Binder;Landroid/content/ComponentName;ZZILandroid/os/PowerManager$WakeLock;)V
+PLcom/android/server/dreams/DreamController$DreamRecord;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/dreams/DreamController$DreamRecord;->releaseWakeLockIfNeeded()V
+PLcom/android/server/dreams/DreamController;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/dreams/DreamController$Listener;)V
+PLcom/android/server/dreams/DreamController;->access$000(Lcom/android/server/dreams/DreamController;)Lcom/android/server/dreams/DreamController$DreamRecord;
+PLcom/android/server/dreams/DreamController;->access$100(Lcom/android/server/dreams/DreamController;)Lcom/android/server/dreams/DreamController$Listener;
+PLcom/android/server/dreams/DreamController;->access$200(Lcom/android/server/dreams/DreamController;)Landroid/os/Handler;
+PLcom/android/server/dreams/DreamController;->access$300(Lcom/android/server/dreams/DreamController;Landroid/service/dreams/IDreamService;)V
+PLcom/android/server/dreams/DreamController;->attach(Landroid/service/dreams/IDreamService;)V
+PLcom/android/server/dreams/DreamController;->startDream(Landroid/os/Binder;Landroid/content/ComponentName;ZZILandroid/os/PowerManager$WakeLock;)V
+PLcom/android/server/dreams/DreamController;->stopDream(Z)V
+PLcom/android/server/dreams/DreamManagerService$1;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/dreams/DreamManagerService$3;-><init>(Lcom/android/server/dreams/DreamManagerService;Z)V
+PLcom/android/server/dreams/DreamManagerService$3;->run()V
+PLcom/android/server/dreams/DreamManagerService$4;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$4;->onDreamStopped(Landroid/os/Binder;)V
+PLcom/android/server/dreams/DreamManagerService$5;-><init>(Lcom/android/server/dreams/DreamManagerService;Landroid/os/Handler;)V
+PLcom/android/server/dreams/DreamManagerService$6;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$6;->run()V
+PLcom/android/server/dreams/DreamManagerService$BinderService;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$BinderService;-><init>(Lcom/android/server/dreams/DreamManagerService;Lcom/android/server/dreams/DreamManagerService$1;)V
+PLcom/android/server/dreams/DreamManagerService$BinderService;->awaken()V
+PLcom/android/server/dreams/DreamManagerService$BinderService;->finishSelf(Landroid/os/IBinder;Z)V
+PLcom/android/server/dreams/DreamManagerService$BinderService;->startDozing(Landroid/os/IBinder;II)V
+PLcom/android/server/dreams/DreamManagerService$DreamHandler;-><init>(Lcom/android/server/dreams/DreamManagerService;Landroid/os/Looper;)V
+PLcom/android/server/dreams/DreamManagerService$LocalService;-><init>(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService$LocalService;-><init>(Lcom/android/server/dreams/DreamManagerService;Lcom/android/server/dreams/DreamManagerService$1;)V
+PLcom/android/server/dreams/DreamManagerService$LocalService;->startDream(Z)V
+PLcom/android/server/dreams/DreamManagerService$LocalService;->stopDream(Z)V
+PLcom/android/server/dreams/DreamManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/dreams/DreamManagerService;->access$1000(Lcom/android/server/dreams/DreamManagerService;Ljava/lang/String;)V
+PLcom/android/server/dreams/DreamManagerService;->access$1700(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService;->access$1800(Lcom/android/server/dreams/DreamManagerService;Landroid/os/IBinder;Z)V
+PLcom/android/server/dreams/DreamManagerService;->access$1900(Lcom/android/server/dreams/DreamManagerService;Landroid/os/IBinder;II)V
+PLcom/android/server/dreams/DreamManagerService;->access$200(Lcom/android/server/dreams/DreamManagerService;)V
+PLcom/android/server/dreams/DreamManagerService;->access$2100(Lcom/android/server/dreams/DreamManagerService;Z)V
+PLcom/android/server/dreams/DreamManagerService;->access$2200(Lcom/android/server/dreams/DreamManagerService;Z)V
+PLcom/android/server/dreams/DreamManagerService;->access$2300(Lcom/android/server/dreams/DreamManagerService;)Landroid/content/ComponentName;
+PLcom/android/server/dreams/DreamManagerService;->access$300(Lcom/android/server/dreams/DreamManagerService;)Ljava/lang/Object;
+PLcom/android/server/dreams/DreamManagerService;->access$400(Lcom/android/server/dreams/DreamManagerService;Z)V
+PLcom/android/server/dreams/DreamManagerService;->access$500(Lcom/android/server/dreams/DreamManagerService;)Lcom/android/server/dreams/DreamController;
+PLcom/android/server/dreams/DreamManagerService;->access$600(Lcom/android/server/dreams/DreamManagerService;)Landroid/os/Binder;
+PLcom/android/server/dreams/DreamManagerService;->checkPermission(Ljava/lang/String;)V
+PLcom/android/server/dreams/DreamManagerService;->chooseDreamForUser(ZI)Landroid/content/ComponentName;
+PLcom/android/server/dreams/DreamManagerService;->cleanupDreamLocked()V
+PLcom/android/server/dreams/DreamManagerService;->finishSelfInternal(Landroid/os/IBinder;Z)V
+PLcom/android/server/dreams/DreamManagerService;->getDozeComponent()Landroid/content/ComponentName;
+PLcom/android/server/dreams/DreamManagerService;->getDozeComponent(I)Landroid/content/ComponentName;
+PLcom/android/server/dreams/DreamManagerService;->getServiceInfo(Landroid/content/ComponentName;)Landroid/content/pm/ServiceInfo;
+PLcom/android/server/dreams/DreamManagerService;->lambda$startDreamLocked$0(Lcom/android/server/dreams/DreamManagerService;Landroid/os/Binder;Landroid/content/ComponentName;ZZILandroid/os/PowerManager$WakeLock;)V
+PLcom/android/server/dreams/DreamManagerService;->onBootPhase(I)V
+PLcom/android/server/dreams/DreamManagerService;->onStart()V
+PLcom/android/server/dreams/DreamManagerService;->requestAwakenInternal()V
+PLcom/android/server/dreams/DreamManagerService;->startDozingInternal(Landroid/os/IBinder;II)V
+PLcom/android/server/dreams/DreamManagerService;->startDreamInternal(Z)V
+PLcom/android/server/dreams/DreamManagerService;->startDreamLocked(Landroid/content/ComponentName;ZZI)V
+PLcom/android/server/dreams/DreamManagerService;->stopDreamInternal(Z)V
+PLcom/android/server/dreams/DreamManagerService;->stopDreamLocked(Z)V
+PLcom/android/server/dreams/DreamManagerService;->validateDream(Landroid/content/ComponentName;)Z
+PLcom/android/server/dreams/DreamManagerService;->writePulseGestureEnabled()V
+PLcom/android/server/emergency/EmergencyAffordanceService$1;-><init>(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$1;->onCellInfoChanged(Ljava/util/List;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$1;->onCellLocationChanged(Landroid/telephony/CellLocation;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$2;-><init>(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$3;-><init>(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$3;->onSubscriptionsChanged()V
+PLcom/android/server/emergency/EmergencyAffordanceService$MyHandler;-><init>(Lcom/android/server/emergency/EmergencyAffordanceService;Landroid/os/Looper;)V
+PLcom/android/server/emergency/EmergencyAffordanceService$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/emergency/EmergencyAffordanceService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->access$000(Lcom/android/server/emergency/EmergencyAffordanceService;)Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->access$100(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->access$300(Lcom/android/server/emergency/EmergencyAffordanceService;)Lcom/android/server/emergency/EmergencyAffordanceService$MyHandler;
+PLcom/android/server/emergency/EmergencyAffordanceService;->access$400(Lcom/android/server/emergency/EmergencyAffordanceService;)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->access$500(Lcom/android/server/emergency/EmergencyAffordanceService;)Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->access$600(Lcom/android/server/emergency/EmergencyAffordanceService;)Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->handleInitializeState()V
+PLcom/android/server/emergency/EmergencyAffordanceService;->handleUpdateCellInfo()Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->handleUpdateSimSubscriptionInfo()Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->isEmergencyAffordanceNeeded()Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->mccRequiresEmergencyAffordance(I)Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->onBootPhase(I)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->onStart()V
+PLcom/android/server/emergency/EmergencyAffordanceService;->requestCellScan()V
+PLcom/android/server/emergency/EmergencyAffordanceService;->setNetworkNeedsEmergencyAffordance(Z)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->setSimNeedsEmergencyAffordance(Z)V
+PLcom/android/server/emergency/EmergencyAffordanceService;->simNeededAffordanceBefore()Z
+PLcom/android/server/emergency/EmergencyAffordanceService;->startScanning()V
+PLcom/android/server/emergency/EmergencyAffordanceService;->stopScanning()V
+PLcom/android/server/emergency/EmergencyAffordanceService;->updateEmergencyAffordanceNeeded()V
+PLcom/android/server/fingerprint/-$$Lambda$l42rkDmfSgEoarEM7da3vinr3Iw;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/-$$Lambda$l42rkDmfSgEoarEM7da3vinr3Iw;->run()V
+PLcom/android/server/fingerprint/AuthenticationClient$1;-><init>(Lcom/android/server/fingerprint/AuthenticationClient;)V
+PLcom/android/server/fingerprint/AuthenticationClient;-><init>(Landroid/content/Context;JLandroid/os/IBinder;Landroid/hardware/fingerprint/IFingerprintServiceReceiver;IIJZLjava/lang/String;Landroid/os/Bundle;Landroid/hardware/biometrics/IBiometricPromptReceiver;Lcom/android/internal/statusbar/IStatusBarService;)V
+PLcom/android/server/fingerprint/AuthenticationClient;->onAcquired(II)Z
+PLcom/android/server/fingerprint/AuthenticationClient;->onAuthenticated(II)Z
+PLcom/android/server/fingerprint/AuthenticationClient;->onError(II)Z
+PLcom/android/server/fingerprint/AuthenticationClient;->start()I
+PLcom/android/server/fingerprint/AuthenticationClient;->stop(Z)I
+PLcom/android/server/fingerprint/ClientMonitor;-><init>(Landroid/content/Context;JLandroid/os/IBinder;Landroid/hardware/fingerprint/IFingerprintServiceReceiver;IIZLjava/lang/String;)V
+PLcom/android/server/fingerprint/ClientMonitor;->destroy()V
+PLcom/android/server/fingerprint/ClientMonitor;->finalize()V
+PLcom/android/server/fingerprint/ClientMonitor;->getContext()Landroid/content/Context;
+PLcom/android/server/fingerprint/ClientMonitor;->getGroupId()I
+PLcom/android/server/fingerprint/ClientMonitor;->getHalDeviceId()J
+PLcom/android/server/fingerprint/ClientMonitor;->getIsRestricted()Z
+PLcom/android/server/fingerprint/ClientMonitor;->getOwnerString()Ljava/lang/String;
+PLcom/android/server/fingerprint/ClientMonitor;->getReceiver()Landroid/hardware/fingerprint/IFingerprintServiceReceiver;
+PLcom/android/server/fingerprint/ClientMonitor;->getTargetUserId()I
+PLcom/android/server/fingerprint/ClientMonitor;->getToken()Landroid/os/IBinder;
+PLcom/android/server/fingerprint/ClientMonitor;->onAcquired(II)Z
+PLcom/android/server/fingerprint/ClientMonitor;->onError(II)Z
+PLcom/android/server/fingerprint/ClientMonitor;->vibrateError()V
+PLcom/android/server/fingerprint/ClientMonitor;->vibrateSuccess()V
+PLcom/android/server/fingerprint/EnumerateClient;-><init>(Landroid/content/Context;JLandroid/os/IBinder;Landroid/hardware/fingerprint/IFingerprintServiceReceiver;IIZLjava/lang/String;)V
+PLcom/android/server/fingerprint/EnumerateClient;->start()I
+PLcom/android/server/fingerprint/FingerprintService$10;-><init>(Lcom/android/server/fingerprint/FingerprintService;Landroid/content/Context;JLandroid/os/IBinder;Landroid/hardware/fingerprint/IFingerprintServiceReceiver;IIJZLjava/lang/String;Landroid/os/Bundle;Landroid/hardware/biometrics/IBiometricPromptReceiver;Lcom/android/internal/statusbar/IStatusBarService;)V
+PLcom/android/server/fingerprint/FingerprintService$10;->getFingerprintDaemon()Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLcom/android/server/fingerprint/FingerprintService$10;->handleFailedAttempt()I
+PLcom/android/server/fingerprint/FingerprintService$10;->notifyUserActivity()V
+PLcom/android/server/fingerprint/FingerprintService$10;->onStart()V
+PLcom/android/server/fingerprint/FingerprintService$10;->onStop()V
+PLcom/android/server/fingerprint/FingerprintService$10;->resetFailedAttempts()V
+PLcom/android/server/fingerprint/FingerprintService$12$2;-><init>(Lcom/android/server/fingerprint/FingerprintService$12;JII)V
+PLcom/android/server/fingerprint/FingerprintService$12$2;->run()V
+PLcom/android/server/fingerprint/FingerprintService$12$3;-><init>(Lcom/android/server/fingerprint/FingerprintService$12;JIILjava/util/ArrayList;)V
+PLcom/android/server/fingerprint/FingerprintService$12$3;->run()V
+PLcom/android/server/fingerprint/FingerprintService$12$4;-><init>(Lcom/android/server/fingerprint/FingerprintService$12;JII)V
+PLcom/android/server/fingerprint/FingerprintService$12$4;->run()V
+PLcom/android/server/fingerprint/FingerprintService$12$6;-><init>(Lcom/android/server/fingerprint/FingerprintService$12;JIII)V
+PLcom/android/server/fingerprint/FingerprintService$12$6;->run()V
+PLcom/android/server/fingerprint/FingerprintService$12;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$12;->onAcquired(JII)V
+PLcom/android/server/fingerprint/FingerprintService$12;->onAuthenticated(JIILjava/util/ArrayList;)V
+PLcom/android/server/fingerprint/FingerprintService$12;->onEnumerate(JIII)V
+PLcom/android/server/fingerprint/FingerprintService$12;->onError(JII)V
+PLcom/android/server/fingerprint/FingerprintService$13;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$1;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$2;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$3;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$3;->run()V
+PLcom/android/server/fingerprint/FingerprintService$4;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$5;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$5;->onTaskStackChanged()V
+PLcom/android/server/fingerprint/FingerprintService$8;-><init>(Lcom/android/server/fingerprint/FingerprintService;Landroid/content/Context;JLandroid/os/IBinder;Landroid/hardware/fingerprint/IFingerprintServiceReceiver;IIZLjava/lang/String;Ljava/util/List;)V
+PLcom/android/server/fingerprint/FingerprintService$8;->getFingerprintDaemon()Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor$1;-><init>(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor$1;->sendResult(Landroid/os/Bundle;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor$2;-><init>(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;-><init>(Lcom/android/server/fingerprint/FingerprintService;Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;->access$1400(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;->releaseWakelock()V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;->sendLockoutReset()V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$3;-><init>(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;JLandroid/os/IBinder;IILandroid/hardware/fingerprint/IFingerprintServiceReceiver;IZLjava/lang/String;Landroid/os/Bundle;Landroid/hardware/biometrics/IBiometricPromptReceiver;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$3;->run()V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$4;-><init>(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;Landroid/os/IBinder;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$4;->run()V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$5;-><init>(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;I)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$5;->run()V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$9;-><init>(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper$9;->run()V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;-><init>(Lcom/android/server/fingerprint/FingerprintService;Lcom/android/server/fingerprint/FingerprintService$1;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->addLockoutResetCallback(Landroid/hardware/fingerprint/IFingerprintServiceLockoutResetCallback;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->authenticate(Landroid/os/IBinder;JILandroid/hardware/fingerprint/IFingerprintServiceReceiver;ILjava/lang/String;Landroid/os/Bundle;Landroid/hardware/biometrics/IBiometricPromptReceiver;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->cancelAuthentication(Landroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->getEnrolledFingerprints(ILjava/lang/String;)Ljava/util/List;
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->hasEnrolledFingerprints(ILjava/lang/String;)Z
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->isHardwareDetected(JLjava/lang/String;)Z
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->isRestricted()Z
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->resetTimeout([B)V
+PLcom/android/server/fingerprint/FingerprintService$FingerprintServiceWrapper;->setActiveUser(I)V
+PLcom/android/server/fingerprint/FingerprintService$PerformanceStats;-><init>(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService$PerformanceStats;-><init>(Lcom/android/server/fingerprint/FingerprintService;Lcom/android/server/fingerprint/FingerprintService$1;)V
+PLcom/android/server/fingerprint/FingerprintService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/fingerprint/FingerprintService;->access$000(Lcom/android/server/fingerprint/FingerprintService;)Lcom/android/server/fingerprint/ClientMonitor;
+PLcom/android/server/fingerprint/FingerprintService;->access$1002(Lcom/android/server/fingerprint/FingerprintService;Lcom/android/server/fingerprint/FingerprintService$PerformanceStats;)Lcom/android/server/fingerprint/FingerprintService$PerformanceStats;
+PLcom/android/server/fingerprint/FingerprintService;->access$1200(Lcom/android/server/fingerprint/FingerprintService;)Landroid/os/PowerManager;
+PLcom/android/server/fingerprint/FingerprintService;->access$1300(Lcom/android/server/fingerprint/FingerprintService;)J
+PLcom/android/server/fingerprint/FingerprintService;->access$1500(Lcom/android/server/fingerprint/FingerprintService;)Landroid/os/Handler;
+PLcom/android/server/fingerprint/FingerprintService;->access$1700(Lcom/android/server/fingerprint/FingerprintService;)Landroid/content/Context;
+PLcom/android/server/fingerprint/FingerprintService;->access$1900(Lcom/android/server/fingerprint/FingerprintService;Ljava/lang/String;ZIII)Z
+PLcom/android/server/fingerprint/FingerprintService;->access$2000(Lcom/android/server/fingerprint/FingerprintService;)Ljava/util/HashMap;
+PLcom/android/server/fingerprint/FingerprintService;->access$2200(Lcom/android/server/fingerprint/FingerprintService;)I
+PLcom/android/server/fingerprint/FingerprintService;->access$2400(Lcom/android/server/fingerprint/FingerprintService;Landroid/os/IBinder;JIILandroid/hardware/fingerprint/IFingerprintServiceReceiver;IZLjava/lang/String;Landroid/os/Bundle;Landroid/hardware/biometrics/IBiometricPromptReceiver;)V
+PLcom/android/server/fingerprint/FingerprintService;->access$2500(Lcom/android/server/fingerprint/FingerprintService;ILjava/lang/String;)V
+PLcom/android/server/fingerprint/FingerprintService;->access$2900(Lcom/android/server/fingerprint/FingerprintService;)Ljava/lang/Runnable;
+PLcom/android/server/fingerprint/FingerprintService;->access$300(Lcom/android/server/fingerprint/FingerprintService;Ljava/lang/String;)Z
+PLcom/android/server/fingerprint/FingerprintService;->access$3000(Lcom/android/server/fingerprint/FingerprintService;Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService;->access$400(Lcom/android/server/fingerprint/FingerprintService;)Landroid/app/IActivityManager;
+PLcom/android/server/fingerprint/FingerprintService;->access$500(Lcom/android/server/fingerprint/FingerprintService;)V
+PLcom/android/server/fingerprint/FingerprintService;->access$600(Lcom/android/server/fingerprint/FingerprintService;)Landroid/app/TaskStackListener;
+PLcom/android/server/fingerprint/FingerprintService;->access$700(Lcom/android/server/fingerprint/FingerprintService;)Landroid/util/SparseIntArray;
+PLcom/android/server/fingerprint/FingerprintService;->access$800(Lcom/android/server/fingerprint/FingerprintService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/fingerprint/FingerprintService;->access$900(Lcom/android/server/fingerprint/FingerprintService;)I
+PLcom/android/server/fingerprint/FingerprintService;->addLockoutResetMonitor(Lcom/android/server/fingerprint/FingerprintService$FingerprintServiceLockoutResetMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService;->canUseFingerprint(Ljava/lang/String;ZIII)Z
+PLcom/android/server/fingerprint/FingerprintService;->cancelLockoutResetForUser(I)V
+PLcom/android/server/fingerprint/FingerprintService;->checkPermission(Ljava/lang/String;)V
+PLcom/android/server/fingerprint/FingerprintService;->cleanupUnknownFingerprints()V
+PLcom/android/server/fingerprint/FingerprintService;->clearEnumerateState()V
+PLcom/android/server/fingerprint/FingerprintService;->doFingerprintCleanupForUser(I)V
+PLcom/android/server/fingerprint/FingerprintService;->enumerateUser(I)V
+PLcom/android/server/fingerprint/FingerprintService;->getEffectiveUserId(I)I
+PLcom/android/server/fingerprint/FingerprintService;->getEnrolledFingerprints(I)Ljava/util/List;
+PLcom/android/server/fingerprint/FingerprintService;->getFingerprintDaemon()Landroid/hardware/biometrics/fingerprint/V2_1/IBiometricsFingerprint;
+PLcom/android/server/fingerprint/FingerprintService;->getLockoutMode()I
+PLcom/android/server/fingerprint/FingerprintService;->getLockoutResetIntentForUser(I)Landroid/app/PendingIntent;
+PLcom/android/server/fingerprint/FingerprintService;->getUserOrWorkProfileId(Ljava/lang/String;I)I
+PLcom/android/server/fingerprint/FingerprintService;->handleAcquired(JII)V
+PLcom/android/server/fingerprint/FingerprintService;->handleAuthenticated(JIILjava/util/ArrayList;)V
+PLcom/android/server/fingerprint/FingerprintService;->handleEnumerate(JIII)V
+PLcom/android/server/fingerprint/FingerprintService;->handleError(JII)V
+PLcom/android/server/fingerprint/FingerprintService;->hasEnrolledFingerprints(I)Z
+PLcom/android/server/fingerprint/FingerprintService;->hasPermission(Ljava/lang/String;)Z
+PLcom/android/server/fingerprint/FingerprintService;->isCurrentUserOrProfile(I)Z
+PLcom/android/server/fingerprint/FingerprintService;->isForegroundActivity(II)Z
+PLcom/android/server/fingerprint/FingerprintService;->isKeyguard(Ljava/lang/String;)Z
+PLcom/android/server/fingerprint/FingerprintService;->isWorkProfile(I)Z
+PLcom/android/server/fingerprint/FingerprintService;->listenForUserSwitches()V
+PLcom/android/server/fingerprint/FingerprintService;->loadAuthenticatorIds()V
+PLcom/android/server/fingerprint/FingerprintService;->notifyClientActiveCallbacks(Z)V
+PLcom/android/server/fingerprint/FingerprintService;->notifyLockoutResetMonitors()V
+PLcom/android/server/fingerprint/FingerprintService;->onStart()V
+PLcom/android/server/fingerprint/FingerprintService;->removeClient(Lcom/android/server/fingerprint/ClientMonitor;)V
+PLcom/android/server/fingerprint/FingerprintService;->resetFailedAttemptsForUser(ZI)V
+PLcom/android/server/fingerprint/FingerprintService;->startAuthentication(Landroid/os/IBinder;JIILandroid/hardware/fingerprint/IFingerprintServiceReceiver;IZLjava/lang/String;Landroid/os/Bundle;Landroid/hardware/biometrics/IBiometricPromptReceiver;)V
+PLcom/android/server/fingerprint/FingerprintService;->startClient(Lcom/android/server/fingerprint/ClientMonitor;Z)V
+PLcom/android/server/fingerprint/FingerprintService;->startEnumerate(Landroid/os/IBinder;ILandroid/hardware/fingerprint/IFingerprintServiceReceiver;ZZ)V
+PLcom/android/server/fingerprint/FingerprintService;->updateActiveGroup(ILjava/lang/String;)V
+PLcom/android/server/fingerprint/FingerprintService;->userActivity()V
+PLcom/android/server/fingerprint/FingerprintUtils;-><init>()V
+PLcom/android/server/fingerprint/FingerprintUtils;->getFingerprintsForUser(Landroid/content/Context;I)Ljava/util/List;
+PLcom/android/server/fingerprint/FingerprintUtils;->getInstance()Lcom/android/server/fingerprint/FingerprintUtils;
+PLcom/android/server/fingerprint/FingerprintUtils;->getStateForUser(Landroid/content/Context;I)Lcom/android/server/fingerprint/FingerprintsUserState;
+PLcom/android/server/fingerprint/FingerprintsUserState$1;-><init>(Lcom/android/server/fingerprint/FingerprintsUserState;)V
+PLcom/android/server/fingerprint/FingerprintsUserState;-><init>(Landroid/content/Context;I)V
+PLcom/android/server/fingerprint/FingerprintsUserState;->getCopy(Ljava/util/ArrayList;)Ljava/util/ArrayList;
+PLcom/android/server/fingerprint/FingerprintsUserState;->getFileForUser(I)Ljava/io/File;
+PLcom/android/server/fingerprint/FingerprintsUserState;->getFingerprints()Ljava/util/List;
+PLcom/android/server/fingerprint/FingerprintsUserState;->parseFingerprintsLocked(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/fingerprint/FingerprintsUserState;->parseStateLocked(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/fingerprint/FingerprintsUserState;->readStateSyncLocked()V
+PLcom/android/server/fingerprint/InternalEnumerateClient;-><init>(Landroid/content/Context;JLandroid/os/IBinder;Landroid/hardware/fingerprint/IFingerprintServiceReceiver;IIZLjava/lang/String;Ljava/util/List;)V
+PLcom/android/server/fingerprint/InternalEnumerateClient;->doFingerprintCleanup()V
+PLcom/android/server/fingerprint/InternalEnumerateClient;->getUnknownFingerprints()Ljava/util/List;
+PLcom/android/server/fingerprint/InternalEnumerateClient;->handleEnumeratedFingerprint(III)V
+PLcom/android/server/fingerprint/InternalEnumerateClient;->onEnumerationResult(III)Z
+PLcom/android/server/firewall/AndFilter;-><init>()V
+PLcom/android/server/firewall/FilterList;-><init>()V
+PLcom/android/server/firewall/FilterList;->readChild(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/firewall/FilterList;->readFromXml(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/firewall/FilterList;
+PLcom/android/server/firewall/IntentFirewall$FirewallHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;-><init>(Lcom/android/server/firewall/IntentFirewall$Rule;)V
+PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->newArray(I)[Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;
+PLcom/android/server/firewall/IntentFirewall$Rule;-><init>()V
+PLcom/android/server/firewall/IntentFirewall$Rule;-><init>(Lcom/android/server/firewall/IntentFirewall$1;)V
+PLcom/android/server/firewall/IntentFirewall$Rule;->getComponentFilterCount()I
+PLcom/android/server/firewall/IntentFirewall$Rule;->getIntentFilter(I)Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter;
+PLcom/android/server/firewall/IntentFirewall$Rule;->getIntentFilterCount()I
+PLcom/android/server/firewall/IntentFirewall$Rule;->readChild(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/firewall/IntentFirewall$Rule;->readFromXml(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/firewall/IntentFirewall$Rule;
+PLcom/android/server/firewall/IntentFirewall$RuleObserver;->onEvent(ILjava/lang/String;)V
+PLcom/android/server/firewall/IntentFirewall;->access$300(Lcom/android/server/firewall/IntentFirewall;Ljava/io/File;)V
+PLcom/android/server/firewall/IntentFirewall;->checkStartActivity(Landroid/content/Intent;IILjava/lang/String;Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/firewall/IntentFirewall;->parseFilter(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/firewall/Filter;
+PLcom/android/server/firewall/IntentFirewall;->readRules(Ljava/io/File;[Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;)V
+PLcom/android/server/firewall/StringFilter$EqualsFilter;-><init>(Lcom/android/server/firewall/StringFilter$ValueProvider;Ljava/lang/String;)V
+PLcom/android/server/firewall/StringFilter$ValueProvider;->newFilter(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/firewall/Filter;
+PLcom/android/server/firewall/StringFilter;-><init>(Lcom/android/server/firewall/StringFilter$ValueProvider;)V
+PLcom/android/server/firewall/StringFilter;-><init>(Lcom/android/server/firewall/StringFilter$ValueProvider;Lcom/android/server/firewall/StringFilter$1;)V
+PLcom/android/server/firewall/StringFilter;->getFilter(Lcom/android/server/firewall/StringFilter$ValueProvider;Lorg/xmlpull/v1/XmlPullParser;I)Lcom/android/server/firewall/StringFilter;
+PLcom/android/server/firewall/StringFilter;->readFromXml(Lcom/android/server/firewall/StringFilter$ValueProvider;Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/firewall/StringFilter;
+PLcom/android/server/input/InputApplicationHandle;-><init>(Ljava/lang/Object;)V
+PLcom/android/server/input/InputApplicationHandle;->finalize()V
+PLcom/android/server/input/InputManagerService$10;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
+PLcom/android/server/input/InputManagerService$11;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
+PLcom/android/server/input/InputManagerService$1;-><init>(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/input/InputManagerService$2;-><init>(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/input/InputManagerService$3;-><init>(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService$5;-><init>(Lcom/android/server/input/InputManagerService;Ljava/util/HashSet;)V
+PLcom/android/server/input/InputManagerService$5;->visitKeyboardLayout(Landroid/content/res/Resources;ILandroid/hardware/input/KeyboardLayout;)V
+PLcom/android/server/input/InputManagerService$9;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Handler;)V
+PLcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;-><init>(Lcom/android/server/input/InputManagerService;ILandroid/hardware/input/IInputDevicesChangedListener;)V
+PLcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;->binderDied()V
+PLcom/android/server/input/InputManagerService$InputDevicesChangedListenerRecord;->notifyInputDevicesChanged([I)V
+PLcom/android/server/input/InputManagerService$InputManagerHandler;-><init>(Lcom/android/server/input/InputManagerService;Landroid/os/Looper;)V
+PLcom/android/server/input/InputManagerService$InputManagerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/input/InputManagerService$KeyboardLayoutDescriptor;->format(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/input/InputManagerService$LocalService;-><init>(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService$LocalService;-><init>(Lcom/android/server/input/InputManagerService;Lcom/android/server/input/InputManagerService$1;)V
+PLcom/android/server/input/InputManagerService$LocalService;->setDisplayViewports(Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;Ljava/util/List;)V
+PLcom/android/server/input/InputManagerService$LocalService;->setInteractive(Z)V
+PLcom/android/server/input/InputManagerService$LocalService;->setPulseGestureEnabled(Z)V
+PLcom/android/server/input/InputManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/input/InputManagerService;->access$100(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService;->access$1100(Lcom/android/server/input/InputManagerService;I)V
+PLcom/android/server/input/InputManagerService;->access$1300(Lcom/android/server/input/InputManagerService;Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;Ljava/util/List;)V
+PLcom/android/server/input/InputManagerService;->access$1500(JZ)V
+PLcom/android/server/input/InputManagerService;->access$1700(Lcom/android/server/input/InputManagerService;)Ljava/io/File;
+PLcom/android/server/input/InputManagerService;->access$200(Lcom/android/server/input/InputManagerService;)V
+PLcom/android/server/input/InputManagerService;->access$500(Lcom/android/server/input/InputManagerService;[Landroid/view/InputDevice;)V
+PLcom/android/server/input/InputManagerService;->access$900(Lcom/android/server/input/InputManagerService;)J
+PLcom/android/server/input/InputManagerService;->checkInjectEventsPermission(II)Z
+PLcom/android/server/input/InputManagerService;->deliverInputDevicesChanged([Landroid/view/InputDevice;)V
+PLcom/android/server/input/InputManagerService;->dispatchUnhandledKey(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
+PLcom/android/server/input/InputManagerService;->getCurrentKeyboardLayoutForInputDevice(Landroid/hardware/input/InputDeviceIdentifier;)Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getDeviceAlias(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getDoubleTapTimeout()I
+PLcom/android/server/input/InputManagerService;->getExcludedDeviceNames()[Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getHoverTapSlop()I
+PLcom/android/server/input/InputManagerService;->getHoverTapTimeout()I
+PLcom/android/server/input/InputManagerService;->getInputDevice(I)Landroid/view/InputDevice;
+PLcom/android/server/input/InputManagerService;->getInputDeviceIds()[I
+PLcom/android/server/input/InputManagerService;->getInputDevices()[Landroid/view/InputDevice;
+PLcom/android/server/input/InputManagerService;->getKeyCodeState(III)I
+PLcom/android/server/input/InputManagerService;->getKeyRepeatDelay()I
+PLcom/android/server/input/InputManagerService;->getKeyRepeatTimeout()I
+PLcom/android/server/input/InputManagerService;->getKeyboardLayoutOverlay(Landroid/hardware/input/InputDeviceIdentifier;)[Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getLayoutDescriptor(Landroid/hardware/input/InputDeviceIdentifier;)Ljava/lang/String;
+PLcom/android/server/input/InputManagerService;->getLocalesFromLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList;
+PLcom/android/server/input/InputManagerService;->getLongPressTimeout()I
+PLcom/android/server/input/InputManagerService;->getPointerSpeedSetting()I
+PLcom/android/server/input/InputManagerService;->getScanCodeState(III)I
+PLcom/android/server/input/InputManagerService;->getShowTouchesSetting(I)I
+PLcom/android/server/input/InputManagerService;->getSwitchState(III)I
+PLcom/android/server/input/InputManagerService;->getTouchCalibrationForInputDevice(Ljava/lang/String;I)Landroid/hardware/input/TouchCalibration;
+PLcom/android/server/input/InputManagerService;->getVirtualKeyQuietTimeMillis()I
+PLcom/android/server/input/InputManagerService;->hasKeys(II[I[Z)Z
+PLcom/android/server/input/InputManagerService;->injectInputEvent(Landroid/view/InputEvent;I)Z
+PLcom/android/server/input/InputManagerService;->interceptKeyBeforeDispatching(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J
+PLcom/android/server/input/InputManagerService;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
+PLcom/android/server/input/InputManagerService;->monitorInput(Ljava/lang/String;)Landroid/view/InputChannel;
+PLcom/android/server/input/InputManagerService;->notifyConfigurationChanged(J)V
+PLcom/android/server/input/InputManagerService;->notifyInputDevicesChanged([Landroid/view/InputDevice;)V
+PLcom/android/server/input/InputManagerService;->onInputDevicesChangedListenerDied(I)V
+PLcom/android/server/input/InputManagerService;->registerAccessibilityLargePointerSettingObserver()V
+PLcom/android/server/input/InputManagerService;->registerInputChannel(Landroid/view/InputChannel;Lcom/android/server/input/InputWindowHandle;)V
+PLcom/android/server/input/InputManagerService;->registerInputDevicesChangedListener(Landroid/hardware/input/IInputDevicesChangedListener;)V
+PLcom/android/server/input/InputManagerService;->registerPointerSpeedSettingObserver()V
+PLcom/android/server/input/InputManagerService;->registerShowTouchesSettingObserver()V
+PLcom/android/server/input/InputManagerService;->reloadDeviceAliases()V
+PLcom/android/server/input/InputManagerService;->reloadKeyboardLayouts()V
+PLcom/android/server/input/InputManagerService;->setDisplayViewport(ILandroid/hardware/display/DisplayViewport;)V
+PLcom/android/server/input/InputManagerService;->setDisplayViewportsInternal(Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;Ljava/util/List;)V
+PLcom/android/server/input/InputManagerService;->setFocusedApplication(Lcom/android/server/input/InputApplicationHandle;)V
+PLcom/android/server/input/InputManagerService;->setInputDispatchMode(ZZ)V
+PLcom/android/server/input/InputManagerService;->setPointerSpeedUnchecked(I)V
+PLcom/android/server/input/InputManagerService;->setSystemUiVisibility(I)V
+PLcom/android/server/input/InputManagerService;->setWindowManagerCallbacks(Lcom/android/server/input/InputManagerService$WindowManagerCallbacks;)V
+PLcom/android/server/input/InputManagerService;->setWiredAccessoryCallbacks(Lcom/android/server/input/InputManagerService$WiredAccessoryCallbacks;)V
+PLcom/android/server/input/InputManagerService;->start()V
+PLcom/android/server/input/InputManagerService;->systemRunning()V
+PLcom/android/server/input/InputManagerService;->unregisterInputChannel(Landroid/view/InputChannel;)V
+PLcom/android/server/input/InputManagerService;->updateAccessibilityLargePointerFromSettings()V
+PLcom/android/server/input/InputManagerService;->updateKeyboardLayouts()V
+PLcom/android/server/input/InputManagerService;->updatePointerSpeedFromSettings()V
+PLcom/android/server/input/InputManagerService;->updateShowTouchesFromSettings()V
+PLcom/android/server/input/InputManagerService;->visitAllKeyboardLayouts(Lcom/android/server/input/InputManagerService$KeyboardLayoutVisitor;)V
+PLcom/android/server/input/InputManagerService;->visitKeyboardLayoutsInPackage(Landroid/content/pm/PackageManager;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILcom/android/server/input/InputManagerService$KeyboardLayoutVisitor;)V
+PLcom/android/server/input/InputWindowHandle;-><init>(Lcom/android/server/input/InputApplicationHandle;Ljava/lang/Object;Landroid/view/IWindow;I)V
+PLcom/android/server/input/InputWindowHandle;->finalize()V
+PLcom/android/server/input/PersistentDataStore;-><init>()V
+PLcom/android/server/input/PersistentDataStore;->clearState()V
+PLcom/android/server/input/PersistentDataStore;->getCurrentKeyboardLayout(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/input/PersistentDataStore;->getInputDeviceState(Ljava/lang/String;Z)Lcom/android/server/input/PersistentDataStore$InputDeviceState;
+PLcom/android/server/input/PersistentDataStore;->getTouchCalibration(Ljava/lang/String;I)Landroid/hardware/input/TouchCalibration;
+PLcom/android/server/input/PersistentDataStore;->load()V
+PLcom/android/server/input/PersistentDataStore;->loadIfNeeded()V
+PLcom/android/server/input/PersistentDataStore;->removeUninstalledKeyboardLayouts(Ljava/util/Set;)Z
+PLcom/android/server/input/PersistentDataStore;->saveIfNeeded()V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$AauD0it1BcgWldVm_V1m2Jo7_Zc;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$AauD0it1BcgWldVm_V1m2Jo7_Zc;->test(Ljava/lang/Object;)Z
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$Lfddr1PhKRLtm92W7niRGMWO69M;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$Lfddr1PhKRLtm92W7niRGMWO69M;->accept(Ljava/lang/Object;)V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$LocalService$yaChpLJ2odu2Fk7A6H8erUndrN8;-><init>(Lcom/android/server/job/JobSchedulerService$LocalService;Ljava/util/List;)V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$StandbyTracker$18Nt1smLe-l9bimlwR39k5RbMdM;-><init>(Lcom/android/server/job/JobSchedulerService$StandbyTracker;IILjava/lang/String;)V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$StandbyTracker$18Nt1smLe-l9bimlwR39k5RbMdM;->run()V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$StandbyTracker$Ofnn0P__SXhzXRU-7eLyuPrl31w;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$StandbyTracker$Ofnn0P__SXhzXRU-7eLyuPrl31w;->accept(Ljava/lang/Object;)V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$V6_ZmVmzJutg4w0s0LktDOsRAss;-><init>()V
+PLcom/android/server/job/-$$Lambda$JobSchedulerService$nXpbkYDrU0yC5DuTafFiblXBdTY;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/-$$Lambda$JobStore$1$Wgepg1oHZp0-Q01q1baIVZKWujU;-><init>(Ljava/util/List;)V
+PLcom/android/server/job/-$$Lambda$JobStore$JobSet$D9839QVHHu4X-hnxouyIMkP5NWA;-><init>([I)V
+PLcom/android/server/job/-$$Lambda$JobStore$JobSet$D9839QVHHu4X-hnxouyIMkP5NWA;->test(Ljava/lang/Object;)Z
+PLcom/android/server/job/-$$Lambda$JobStore$JobSet$id1Y3Yh8Y9sEb-njlNCUNay6U9k;-><init>([I)V
+PLcom/android/server/job/-$$Lambda$JobStore$JobSet$id1Y3Yh8Y9sEb-njlNCUNay6U9k;->test(Ljava/lang/Object;)Z
+PLcom/android/server/job/GrantedUriPermissions;->checkGrantFlags(I)Z
+PLcom/android/server/job/JobPackageTracker$DataSet;-><init>()V
+PLcom/android/server/job/JobPackageTracker$DataSet;->decActive(ILjava/lang/String;JI)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->decActiveTop(ILjava/lang/String;JI)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->finish(Lcom/android/server/job/JobPackageTracker$DataSet;J)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->incActive(ILjava/lang/String;J)V
+PLcom/android/server/job/JobPackageTracker$DataSet;->incActiveTop(ILjava/lang/String;J)V
+PLcom/android/server/job/JobPackageTracker$PackageEntry;-><init>()V
+PLcom/android/server/job/JobPackageTracker;-><init>()V
+PLcom/android/server/job/JobPackageTracker;->addEvent(IILjava/lang/String;IILjava/lang/String;)V
+PLcom/android/server/job/JobPackageTracker;->noteActive(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobPackageTracker;->noteInactive(Lcom/android/server/job/controllers/JobStatus;ILjava/lang/String;)V
+PLcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;-><init>()V
+PLcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;-><init>(Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;)V
+PLcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;->toString()Ljava/lang/String;
+PLcom/android/server/job/JobSchedulerService$1;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/job/JobSchedulerService$2;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$2;->onUidActive(I)V
+PLcom/android/server/job/JobSchedulerService$2;->onUidGone(IZ)V
+PLcom/android/server/job/JobSchedulerService$2;->onUidIdle(IZ)V
+PLcom/android/server/job/JobSchedulerService$3;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$Constants;-><init>()V
+PLcom/android/server/job/JobSchedulerService$Constants;->updateConstantsLocked(Ljava/lang/String;)V
+PLcom/android/server/job/JobSchedulerService$ConstantsObserver;-><init>(Lcom/android/server/job/JobSchedulerService;Landroid/os/Handler;)V
+PLcom/android/server/job/JobSchedulerService$ConstantsObserver;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/job/JobSchedulerService$ConstantsObserver;->updateConstants()V
+PLcom/android/server/job/JobSchedulerService$DeferredJobCounter;-><init>()V
+PLcom/android/server/job/JobSchedulerService$DeferredJobCounter;->accept(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobSchedulerService$DeferredJobCounter;->accept(Ljava/lang/Object;)V
+PLcom/android/server/job/JobSchedulerService$DeferredJobCounter;->numDeferred()I
+PLcom/android/server/job/JobSchedulerService$HeartbeatAlarmListener;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$HeartbeatAlarmListener;->onAlarm()V
+PLcom/android/server/job/JobSchedulerService$JobHandler;-><init>(Lcom/android/server/job/JobSchedulerService;Landroid/os/Looper;)V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->canPersistJobs(II)Z
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->cancelAll()V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enforceValidJobRequest(ILandroid/app/job/JobInfo;)V
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enqueue(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I
+PLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->validateJobFlags(Landroid/app/job/JobInfo;I)V
+PLcom/android/server/job/JobSchedulerService$LocalService;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$LocalService;->addBackingUpUid(I)V
+PLcom/android/server/job/JobSchedulerService$LocalService;->baseHeartbeatForApp(Ljava/lang/String;II)J
+PLcom/android/server/job/JobSchedulerService$LocalService;->currentHeartbeat()J
+PLcom/android/server/job/JobSchedulerService$LocalService;->getPersistStats()Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;
+PLcom/android/server/job/JobSchedulerService$LocalService;->getSystemScheduledPendingJobs()Ljava/util/List;
+PLcom/android/server/job/JobSchedulerService$LocalService;->noteJobStart(Ljava/lang/String;I)V
+PLcom/android/server/job/JobSchedulerService$LocalService;->removeBackingUpUid(I)V
+PLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->postProcess()V
+PLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->reset()V
+PLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->postProcess()V
+PLcom/android/server/job/JobSchedulerService$StandbyTracker;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService$StandbyTracker;->lambda$onAppIdleStateChanged$0(Ljava/lang/String;ILcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobSchedulerService$StandbyTracker;->lambda$onAppIdleStateChanged$1(Lcom/android/server/job/JobSchedulerService$StandbyTracker;IILjava/lang/String;)V
+PLcom/android/server/job/JobSchedulerService$StandbyTracker;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+PLcom/android/server/job/JobSchedulerService$StandbyTracker;->onParoleStateChanged(Z)V
+PLcom/android/server/job/JobSchedulerService$StandbyTracker;->onUserInteractionStarted(Ljava/lang/String;I)V
+PLcom/android/server/job/JobSchedulerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/job/JobSchedulerService;->access$000(Lcom/android/server/job/JobSchedulerService;Landroid/content/Intent;)Ljava/lang/String;
+PLcom/android/server/job/JobSchedulerService;->access$300(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService;->access$400(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/JobSchedulerService;->access$600(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/controllers/DeviceIdleJobsController;
+PLcom/android/server/job/JobSchedulerService;->addOrderedItem(Ljava/util/ArrayList;Ljava/lang/Object;Ljava/util/Comparator;)V
+PLcom/android/server/job/JobSchedulerService;->advanceHeartbeatLocked(J)V
+PLcom/android/server/job/JobSchedulerService;->cancelJob(III)Z
+PLcom/android/server/job/JobSchedulerService;->cancelJobImplLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Ljava/lang/String;)V
+PLcom/android/server/job/JobSchedulerService;->cancelJobsForNonExistentUsers()V
+PLcom/android/server/job/JobSchedulerService;->cancelJobsForUid(ILjava/lang/String;)Z
+PLcom/android/server/job/JobSchedulerService;->getConstants()Lcom/android/server/job/JobSchedulerService$Constants;
+PLcom/android/server/job/JobSchedulerService;->getCurrentHeartbeat()J
+PLcom/android/server/job/JobSchedulerService;->getJobStore()Lcom/android/server/job/JobStore;
+PLcom/android/server/job/JobSchedulerService;->getLock()Ljava/lang/Object;
+PLcom/android/server/job/JobSchedulerService;->getPackageName(Landroid/content/Intent;)Ljava/lang/String;
+PLcom/android/server/job/JobSchedulerService;->getRescheduleJobForFailureLocked(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/JobSchedulerService;->getRescheduleJobForPeriodic(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/JobSchedulerService;->getTestableContext()Landroid/content/Context;
+PLcom/android/server/job/JobSchedulerService;->heartbeatWhenJobsLastRun(Lcom/android/server/job/controllers/JobStatus;)J
+PLcom/android/server/job/JobSchedulerService;->heartbeatWhenJobsLastRun(Ljava/lang/String;I)J
+PLcom/android/server/job/JobSchedulerService;->isUidActive(I)Z
+PLcom/android/server/job/JobSchedulerService;->lambda$AauD0it1BcgWldVm_V1m2Jo7_Zc(Lcom/android/server/job/JobSchedulerService;I)Z
+PLcom/android/server/job/JobSchedulerService;->lambda$onBootPhase$2(Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobSchedulerService;->maybeQueueReadyJobsForExecutionLocked()V
+PLcom/android/server/job/JobSchedulerService;->onBootPhase(I)V
+PLcom/android/server/job/JobSchedulerService;->onControllerStateChanged()V
+PLcom/android/server/job/JobSchedulerService;->onDeviceIdleStateChanged(Z)V
+PLcom/android/server/job/JobSchedulerService;->onJobCompletedLocked(Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/JobSchedulerService;->onRunJobNow(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/JobSchedulerService;->onStart()V
+PLcom/android/server/job/JobSchedulerService;->onStartUser(I)V
+PLcom/android/server/job/JobSchedulerService;->onUnlockUser(I)V
+PLcom/android/server/job/JobSchedulerService;->queueReadyJobsForExecutionLocked()V
+PLcom/android/server/job/JobSchedulerService;->setLastJobHeartbeatLocked(Ljava/lang/String;IJ)V
+PLcom/android/server/job/JobSchedulerService;->setNextHeartbeatAlarm()V
+PLcom/android/server/job/JobSchedulerService;->standbyBucketForPackage(Ljava/lang/String;IJ)I
+PLcom/android/server/job/JobSchedulerService;->standbyBucketToBucketIndex(I)I
+PLcom/android/server/job/JobServiceContext$JobCallback;-><init>(Lcom/android/server/job/JobServiceContext;)V
+PLcom/android/server/job/JobServiceContext$JobCallback;->acknowledgeStartMessage(IZ)V
+PLcom/android/server/job/JobServiceContext$JobCallback;->acknowledgeStopMessage(IZ)V
+PLcom/android/server/job/JobServiceContext$JobCallback;->completeWork(II)Z
+PLcom/android/server/job/JobServiceContext$JobCallback;->dequeueWork(I)Landroid/app/job/JobWorkItem;
+PLcom/android/server/job/JobServiceContext$JobCallback;->jobFinished(IZ)V
+PLcom/android/server/job/JobServiceContext$JobServiceHandler;-><init>(Lcom/android/server/job/JobServiceContext;Landroid/os/Looper;)V
+PLcom/android/server/job/JobServiceContext;-><init>(Landroid/content/Context;Ljava/lang/Object;Lcom/android/internal/app/IBatteryStats;Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobCompletedListener;Landroid/os/Looper;)V
+PLcom/android/server/job/JobServiceContext;-><init>(Lcom/android/server/job/JobSchedulerService;Lcom/android/internal/app/IBatteryStats;Lcom/android/server/job/JobPackageTracker;Landroid/os/Looper;)V
+PLcom/android/server/job/JobServiceContext;->applyStoppedReasonLocked(Ljava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->assertCallerLocked(Lcom/android/server/job/JobServiceContext$JobCallback;)V
+PLcom/android/server/job/JobServiceContext;->cancelExecutingJobLocked(ILjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->closeAndCleanupJobLocked(ZLjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->deriveWorkSource(Lcom/android/server/job/controllers/JobStatus;)Landroid/os/WorkSource;
+PLcom/android/server/job/JobServiceContext;->doAcknowledgeStartMessage(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V
+PLcom/android/server/job/JobServiceContext;->doAcknowledgeStopMessage(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V
+PLcom/android/server/job/JobServiceContext;->doCallbackLocked(ZLjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->doCancelLocked(ILjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->doCompleteWork(Lcom/android/server/job/JobServiceContext$JobCallback;II)Z
+PLcom/android/server/job/JobServiceContext;->doDequeueWork(Lcom/android/server/job/JobServiceContext$JobCallback;I)Landroid/app/job/JobWorkItem;
+PLcom/android/server/job/JobServiceContext;->doJobFinished(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V
+PLcom/android/server/job/JobServiceContext;->doServiceBoundLocked()V
+PLcom/android/server/job/JobServiceContext;->executeRunnableJob(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobServiceContext;->handleCancelLocked(Ljava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->handleFinishedLocked(ZLjava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->handleServiceBoundLocked()V
+PLcom/android/server/job/JobServiceContext;->handleStartedLocked(Z)V
+PLcom/android/server/job/JobServiceContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/job/JobServiceContext;->onServiceDisconnected(Landroid/content/ComponentName;)V
+PLcom/android/server/job/JobServiceContext;->preemptExecutingJobLocked()V
+PLcom/android/server/job/JobServiceContext;->sendStopMessageLocked(Ljava/lang/String;)V
+PLcom/android/server/job/JobServiceContext;->verifyCallerLocked(Lcom/android/server/job/JobServiceContext$JobCallback;)Z
+PLcom/android/server/job/JobStore$1;-><init>(Lcom/android/server/job/JobStore;)V
+PLcom/android/server/job/JobStore$1;->run()V
+PLcom/android/server/job/JobStore$JobSet;-><init>()V
+PLcom/android/server/job/JobStore$JobSet;->add(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore$JobSet;->getJobsByUid(I)Ljava/util/List;
+PLcom/android/server/job/JobStore$JobSet;->lambda$removeJobsOfNonUsers$0([ILcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore$JobSet;->lambda$removeJobsOfNonUsers$1([ILcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore$JobSet;->removeAll(Ljava/util/function/Predicate;)V
+PLcom/android/server/job/JobStore$JobSet;->removeJobsOfNonUsers([I)V
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;-><init>(Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore$JobSet;Z)V
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->buildBuilderFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/app/job/JobInfo$Builder;
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->buildConstraintsFromXml(Landroid/app/job/JobInfo$Builder;Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->buildRtcExecutionTimesFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/Pair;
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->maybeBuildBackoffPolicyFromXml(Landroid/app/job/JobInfo$Builder;Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->readJobMapImpl(Ljava/io/FileInputStream;Z)Ljava/util/List;
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->restoreJobFromXml(ZLorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->run()V
+PLcom/android/server/job/JobStore;-><init>(Landroid/content/Context;Ljava/lang/Object;Ljava/io/File;)V
+PLcom/android/server/job/JobStore;->access$200(Lcom/android/server/job/JobStore;)Landroid/util/AtomicFile;
+PLcom/android/server/job/JobStore;->access$302(Lcom/android/server/job/JobStore;I)I
+PLcom/android/server/job/JobStore;->access$400(Lcom/android/server/job/JobStore;)Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;
+PLcom/android/server/job/JobStore;->access$500(Landroid/util/Pair;J)Landroid/util/Pair;
+PLcom/android/server/job/JobStore;->add(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/JobStore;->convertRtcBoundsToElapsed(Landroid/util/Pair;J)Landroid/util/Pair;
+PLcom/android/server/job/JobStore;->countJobsForUid(I)I
+PLcom/android/server/job/JobStore;->forEachJob(ILjava/util/function/Consumer;)V
+PLcom/android/server/job/JobStore;->forEachJob(Ljava/util/function/Consumer;)V
+PLcom/android/server/job/JobStore;->forEachJobForSourceUid(ILjava/util/function/Consumer;)V
+PLcom/android/server/job/JobStore;->getJobByUidAndJobId(II)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/JobStore;->getJobsByUid(I)Ljava/util/List;
+PLcom/android/server/job/JobStore;->getPersistStats()Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats;
+PLcom/android/server/job/JobStore;->initAndGet(Lcom/android/server/job/JobSchedulerService;)Lcom/android/server/job/JobStore;
+PLcom/android/server/job/JobStore;->jobTimesInflatedValid()Z
+PLcom/android/server/job/JobStore;->maybeWriteStatusToDiskAsync()V
+PLcom/android/server/job/JobStore;->readJobMapFromDisk(Lcom/android/server/job/JobStore$JobSet;Z)V
+PLcom/android/server/job/JobStore;->remove(Lcom/android/server/job/controllers/JobStatus;Z)Z
+PLcom/android/server/job/JobStore;->removeJobsOfNonUsers([I)V
+PLcom/android/server/job/controllers/-$$Lambda$IdleController$IdlenessTracker$nTdS-lGBXcES5VWKcJFmQFgU7IU;-><init>(Lcom/android/server/job/controllers/IdleController$IdlenessTracker;)V
+PLcom/android/server/job/controllers/-$$Lambda$IdleController$IdlenessTracker$nTdS-lGBXcES5VWKcJFmQFgU7IU;->onAlarm()V
+PLcom/android/server/job/controllers/BackgroundJobsController$1;-><init>(Lcom/android/server/job/controllers/BackgroundJobsController;)V
+PLcom/android/server/job/controllers/BackgroundJobsController$1;->updateAllJobs()V
+PLcom/android/server/job/controllers/BackgroundJobsController$1;->updateJobsForUid(IZ)V
+PLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;-><init>(Lcom/android/server/job/controllers/BackgroundJobsController;I)V
+PLcom/android/server/job/controllers/BackgroundJobsController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/BackgroundJobsController;->access$000(Lcom/android/server/job/controllers/BackgroundJobsController;)V
+PLcom/android/server/job/controllers/BackgroundJobsController;->access$100(Lcom/android/server/job/controllers/BackgroundJobsController;IZ)V
+PLcom/android/server/job/controllers/BackgroundJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/BackgroundJobsController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/BackgroundJobsController;->updateAllJobRestrictionsLocked()V
+PLcom/android/server/job/controllers/BackgroundJobsController;->updateJobRestrictionsForUidLocked(IZ)V
+PLcom/android/server/job/controllers/BackgroundJobsController;->updateJobRestrictionsLocked(II)V
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;-><init>(Lcom/android/server/job/controllers/BatteryController;)V
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;->isBatteryNotLow()Z
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;->isOnStablePower()Z
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;->onReceiveInternal(Landroid/content/Intent;)V
+PLcom/android/server/job/controllers/BatteryController$ChargingTracker;->startTracking()V
+PLcom/android/server/job/controllers/BatteryController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/BatteryController;->access$000()Z
+PLcom/android/server/job/controllers/BatteryController;->access$100(Lcom/android/server/job/controllers/BatteryController;)V
+PLcom/android/server/job/controllers/BatteryController;->maybeReportNewChargingStateLocked()V
+PLcom/android/server/job/controllers/BatteryController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/BatteryController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/ConnectivityController$1;-><init>(Lcom/android/server/job/controllers/ConnectivityController;)V
+PLcom/android/server/job/controllers/ConnectivityController$1;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/job/controllers/ConnectivityController$1;->onLost(Landroid/net/Network;)V
+PLcom/android/server/job/controllers/ConnectivityController$2;-><init>(Lcom/android/server/job/controllers/ConnectivityController;)V
+PLcom/android/server/job/controllers/ConnectivityController$2;->onUidRulesChanged(II)V
+PLcom/android/server/job/controllers/ConnectivityController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/ConnectivityController;->access$000()Z
+PLcom/android/server/job/controllers/ConnectivityController;->access$100(Lcom/android/server/job/controllers/ConnectivityController;ILandroid/net/Network;)V
+PLcom/android/server/job/controllers/ConnectivityController;->isRelaxedSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z
+PLcom/android/server/job/controllers/ConnectivityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/ConnectivityController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;)Z
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;-><init>(Lcom/android/server/job/controllers/ContentObserverController;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;->detachLocked()V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;->scheduleLocked()V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;->trigger()V
+PLcom/android/server/job/controllers/ContentObserverController$JobInstance;->unscheduleLocked()V
+PLcom/android/server/job/controllers/ContentObserverController$ObserverInstance;-><init>(Lcom/android/server/job/controllers/ContentObserverController;Landroid/os/Handler;Landroid/app/job/JobInfo$TriggerContentUri;I)V
+PLcom/android/server/job/controllers/ContentObserverController$ObserverInstance;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/job/controllers/ContentObserverController$TriggerRunnable;-><init>(Lcom/android/server/job/controllers/ContentObserverController$JobInstance;)V
+PLcom/android/server/job/controllers/ContentObserverController$TriggerRunnable;->run()V
+PLcom/android/server/job/controllers/ContentObserverController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/ContentObserverController;->access$000()Z
+PLcom/android/server/job/controllers/ContentObserverController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/ContentObserverController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/ContentObserverController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/ContentObserverController;->rescheduleForFailureLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController$1;-><init>(Lcom/android/server/job/controllers/DeviceIdleJobsController;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleJobsDelayHandler;-><init>(Lcom/android/server/job/controllers/DeviceIdleJobsController;Landroid/os/Looper;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleJobsDelayHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;-><init>(Lcom/android/server/job/controllers/DeviceIdleJobsController;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->access$000(Lcom/android/server/job/controllers/DeviceIdleJobsController;)Landroid/os/PowerManager;
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->access$200(Lcom/android/server/job/controllers/DeviceIdleJobsController;)Lcom/android/server/DeviceIdleController$LocalService;
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->access$300()Z
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->access$402(Lcom/android/server/job/controllers/DeviceIdleJobsController;[I)[I
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->access$500(Lcom/android/server/job/controllers/DeviceIdleJobsController;)Landroid/util/ArraySet;
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->access$700(Lcom/android/server/job/controllers/DeviceIdleJobsController;)Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->setUidActiveLocked(IZ)V
+PLcom/android/server/job/controllers/DeviceIdleJobsController;->updateIdleMode(Z)V
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;-><init>(Lcom/android/server/job/controllers/IdleController;)V
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;->handleIdleTrigger()V
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;->isIdle()Z
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;->lambda$new$0(Lcom/android/server/job/controllers/IdleController$IdlenessTracker;)V
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/job/controllers/IdleController$IdlenessTracker;->startTracking()V
+PLcom/android/server/job/controllers/IdleController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/IdleController;->access$000()Z
+PLcom/android/server/job/controllers/IdleController;->access$100(Lcom/android/server/job/controllers/IdleController;)J
+PLcom/android/server/job/controllers/IdleController;->access$200(Lcom/android/server/job/controllers/IdleController;)J
+PLcom/android/server/job/controllers/IdleController;->initIdleStateTracking()V
+PLcom/android/server/job/controllers/IdleController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/IdleController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/IdleController;->reportNewIdleState(Z)V
+PLcom/android/server/job/controllers/JobStatus;-><init>(Landroid/app/job/JobInfo;ILjava/lang/String;IIJLjava/lang/String;JJJJLandroid/util/Pair;I)V
+PLcom/android/server/job/controllers/JobStatus;-><init>(Lcom/android/server/job/controllers/JobStatus;JJJIJJ)V
+PLcom/android/server/job/controllers/JobStatus;->addInternalFlags(I)V
+PLcom/android/server/job/controllers/JobStatus;->clearPersistedUtcTimes()V
+PLcom/android/server/job/controllers/JobStatus;->completeWorkLocked(Landroid/app/IActivityManager;I)Z
+PLcom/android/server/job/controllers/JobStatus;->createFromJobInfo(Landroid/app/job/JobInfo;ILjava/lang/String;ILjava/lang/String;)Lcom/android/server/job/controllers/JobStatus;
+PLcom/android/server/job/controllers/JobStatus;->dequeueWorkLocked()Landroid/app/job/JobWorkItem;
+PLcom/android/server/job/controllers/JobStatus;->enqueueWorkLocked(Landroid/app/IActivityManager;Landroid/app/job/JobWorkItem;)V
+PLcom/android/server/job/controllers/JobStatus;->getTag()Ljava/lang/String;
+PLcom/android/server/job/controllers/JobStatus;->getTriggerContentMaxDelay()J
+PLcom/android/server/job/controllers/JobStatus;->getTriggerContentUpdateDelay()J
+PLcom/android/server/job/controllers/JobStatus;->getWhenStandbyDeferred()J
+PLcom/android/server/job/controllers/JobStatus;->hasContentTriggerConstraint()Z
+PLcom/android/server/job/controllers/JobStatus;->hasExecutingWorkLocked()Z
+PLcom/android/server/job/controllers/JobStatus;->hasPowerConstraint()Z
+PLcom/android/server/job/controllers/JobStatus;->hasStorageNotLowConstraint()Z
+PLcom/android/server/job/controllers/JobStatus;->hasWorkLocked()Z
+PLcom/android/server/job/controllers/JobStatus;->isPreparedLocked()Z
+PLcom/android/server/job/controllers/JobStatus;->maybeAddForegroundExemption(Ljava/util/function/Predicate;)V
+PLcom/android/server/job/controllers/JobStatus;->prepareLocked(Landroid/app/IActivityManager;)V
+PLcom/android/server/job/controllers/JobStatus;->resolveTargetSdkVersion(Landroid/app/job/JobInfo;)I
+PLcom/android/server/job/controllers/JobStatus;->setBatteryNotLowConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setChargingConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setContentTriggerConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setDeadlineConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setIdleConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setStandbyBucket(I)V
+PLcom/android/server/job/controllers/JobStatus;->setStorageNotLowConstraintSatisfied(Z)Z
+PLcom/android/server/job/controllers/JobStatus;->setTrackingController(I)V
+PLcom/android/server/job/controllers/JobStatus;->setWhenStandbyDeferred(J)V
+PLcom/android/server/job/controllers/JobStatus;->stopTrackingJobLocked(Landroid/app/IActivityManager;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/JobStatus;->ungrantWorkItem(Landroid/app/IActivityManager;Landroid/app/job/JobWorkItem;)V
+PLcom/android/server/job/controllers/JobStatus;->ungrantWorkList(Landroid/app/IActivityManager;Ljava/util/ArrayList;)V
+PLcom/android/server/job/controllers/JobStatus;->unprepareLocked(Landroid/app/IActivityManager;)V
+PLcom/android/server/job/controllers/StateController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/StateController;->rescheduleForFailureLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/StorageController$StorageTracker;-><init>(Lcom/android/server/job/controllers/StorageController;)V
+PLcom/android/server/job/controllers/StorageController$StorageTracker;->isStorageNotLow()Z
+PLcom/android/server/job/controllers/StorageController$StorageTracker;->startTracking()V
+PLcom/android/server/job/controllers/StorageController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/StorageController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+PLcom/android/server/job/controllers/StorageController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/TimeController$1;-><init>(Lcom/android/server/job/controllers/TimeController;)V
+PLcom/android/server/job/controllers/TimeController$1;->onAlarm()V
+PLcom/android/server/job/controllers/TimeController$2;-><init>(Lcom/android/server/job/controllers/TimeController;)V
+PLcom/android/server/job/controllers/TimeController$2;->onAlarm()V
+PLcom/android/server/job/controllers/TimeController;-><init>(Lcom/android/server/job/JobSchedulerService;)V
+PLcom/android/server/job/controllers/TimeController;->access$000()Z
+PLcom/android/server/job/controllers/TimeController;->access$100(Lcom/android/server/job/controllers/TimeController;)V
+PLcom/android/server/job/controllers/TimeController;->access$200(Lcom/android/server/job/controllers/TimeController;)V
+PLcom/android/server/job/controllers/TimeController;->checkExpiredDeadlinesAndResetAlarm()V
+PLcom/android/server/job/controllers/TimeController;->deriveWorkSource(ILjava/lang/String;)Landroid/os/WorkSource;
+PLcom/android/server/job/controllers/TimeController;->ensureAlarmServiceLocked()V
+PLcom/android/server/job/controllers/TimeController;->evaluateDeadlineConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z
+PLcom/android/server/job/controllers/TimeController;->maybeAdjustAlarmTime(J)J
+PLcom/android/server/job/controllers/TimeController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)V
+PLcom/android/server/job/controllers/TimeController;->maybeUpdateAlarmsLocked(JJLandroid/os/WorkSource;)V
+PLcom/android/server/job/controllers/TimeController;->setDeadlineExpiredAlarmLocked(JLandroid/os/WorkSource;)V
+PLcom/android/server/job/controllers/TimeController;->setDelayExpiredAlarmLocked(JLandroid/os/WorkSource;)V
+PLcom/android/server/job/controllers/TimeController;->updateAlarmWithListenerLocked(Ljava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;JLandroid/os/WorkSource;)V
+PLcom/android/server/lights/LightsService$LightImpl;->setColor(I)V
+PLcom/android/server/lights/LightsService$LightImpl;->turnOff()V
+PLcom/android/server/location/-$$Lambda$5U-_NhZgxqnYDZhpyacq4qBxh8k;-><init>(Lcom/android/server/location/GnssSatelliteBlacklistHelper;)V
+PLcom/android/server/location/-$$Lambda$5U-_NhZgxqnYDZhpyacq4qBxh8k;->run()V
+PLcom/android/server/location/-$$Lambda$ContextHubClientManager$f15OSYbsSONpkXn7GinnrBPeumw;-><init>(Landroid/hardware/location/NanoAppMessage;)V
+PLcom/android/server/location/-$$Lambda$ContextHubClientManager$f15OSYbsSONpkXn7GinnrBPeumw;->accept(Ljava/lang/Object;)V
+PLcom/android/server/location/-$$Lambda$ContextHubTransactionManager$sHbjr4TaLEATkCX_yhD2L7ebuxE;-><init>(Lcom/android/server/location/ContextHubTransactionManager;Lcom/android/server/location/ContextHubServiceTransaction;)V
+PLcom/android/server/location/-$$Lambda$GnssGeofenceProvider$x-gy6KDILxd4rIEjriAkYQ46QwA;-><init>(Lcom/android/server/location/GnssGeofenceProvider;)V
+PLcom/android/server/location/-$$Lambda$GnssGeofenceProvider$x-gy6KDILxd4rIEjriAkYQ46QwA;->run()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$2m3d6BkqWO0fZAJAijxHyPDHfxI;-><init>([I[I)V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$2m3d6BkqWO0fZAJAijxHyPDHfxI;->run()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$0TBIDASC8cGFJxhCk2blveu19LI;-><init>()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$0TBIDASC8cGFJxhCk2blveu19LI;->set(I)Z
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$7ITcPSS3RLwdJLvqPT1qDZbuYgU;-><init>()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$7ITcPSS3RLwdJLvqPT1qDZbuYgU;->set(I)Z
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$M4Zfb6dp_EFsOdGGju4tOPs-lc4;-><init>()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$M4Zfb6dp_EFsOdGGju4tOPs-lc4;->set(I)Z
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$d34_RfOwt4eW2WTSkMsS8UoXSqY;-><init>()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$d34_RfOwt4eW2WTSkMsS8UoXSqY;->set(I)Z
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$fIEuYdSEFZVtEQQ5H4O-bTmj-LE;-><init>()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$fIEuYdSEFZVtEQQ5H4O-bTmj-LE;->set(I)Z
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$pJxRP_yDkUU0yl--Fw431I8fN70;-><init>()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$pJxRP_yDkUU0yl--Fw431I8fN70;->set(I)Z
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$vt8zMIL_RIFwKcgd1rz4Y33NVyk;-><init>()V
+PLcom/android/server/location/-$$Lambda$GnssLocationProvider$6$vt8zMIL_RIFwKcgd1rz4Y33NVyk;->set(I)Z
+PLcom/android/server/location/-$$Lambda$GnssMeasurementsProvider$865xzodmeiSeR2xhh7cKZjiZkhE;-><init>(Landroid/location/GnssMeasurementsEvent;)V
+PLcom/android/server/location/-$$Lambda$GnssMeasurementsProvider$865xzodmeiSeR2xhh7cKZjiZkhE;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/-$$Lambda$NtpTimeHelper$xPxgficKWFyuwUj60WMuiGEEjdg;-><init>(Lcom/android/server/location/NtpTimeHelper;JJJ)V
+PLcom/android/server/location/-$$Lambda$NtpTimeHelper$xPxgficKWFyuwUj60WMuiGEEjdg;->run()V
+PLcom/android/server/location/-$$Lambda$NtpTimeHelper$xWqlqJuq4jBJ5-xhFLCwEKGVB0k;-><init>(Lcom/android/server/location/NtpTimeHelper;)V
+PLcom/android/server/location/-$$Lambda$NtpTimeHelper$xWqlqJuq4jBJ5-xhFLCwEKGVB0k;->run()V
+PLcom/android/server/location/-$$Lambda$nmIoImstXHuMaecjUXtG9FcFizs;-><init>(Lcom/android/server/location/GnssGeofenceProvider$GnssGeofenceProviderNative;)V
+PLcom/android/server/location/-$$Lambda$nmIoImstXHuMaecjUXtG9FcFizs;->call()Ljava/lang/Object;
+PLcom/android/server/location/ActivityRecognitionProxy$1;-><init>(Lcom/android/server/location/ActivityRecognitionProxy;)V
+PLcom/android/server/location/ActivityRecognitionProxy$1;->run()V
+PLcom/android/server/location/ActivityRecognitionProxy$2;-><init>(Lcom/android/server/location/ActivityRecognitionProxy;)V
+PLcom/android/server/location/ActivityRecognitionProxy$2;->run(Landroid/os/IBinder;)V
+PLcom/android/server/location/ActivityRecognitionProxy;-><init>(Landroid/content/Context;Landroid/os/Handler;ZLandroid/hardware/location/ActivityRecognitionHardware;III)V
+PLcom/android/server/location/ActivityRecognitionProxy;->access$000(Lcom/android/server/location/ActivityRecognitionProxy;)V
+PLcom/android/server/location/ActivityRecognitionProxy;->access$100(Lcom/android/server/location/ActivityRecognitionProxy;)Landroid/hardware/location/ActivityRecognitionHardware;
+PLcom/android/server/location/ActivityRecognitionProxy;->access$200(Lcom/android/server/location/ActivityRecognitionProxy;)Z
+PLcom/android/server/location/ActivityRecognitionProxy;->bindProvider()V
+PLcom/android/server/location/ActivityRecognitionProxy;->createAndBind(Landroid/content/Context;Landroid/os/Handler;ZLandroid/hardware/location/ActivityRecognitionHardware;III)Lcom/android/server/location/ActivityRecognitionProxy;
+PLcom/android/server/location/ComprehensiveCountryDetector$1;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;)V
+PLcom/android/server/location/ComprehensiveCountryDetector$2;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;Landroid/location/Country;Landroid/location/Country;ZZ)V
+PLcom/android/server/location/ComprehensiveCountryDetector$2;->run()V
+PLcom/android/server/location/ComprehensiveCountryDetector$4;-><init>(Lcom/android/server/location/ComprehensiveCountryDetector;)V
+PLcom/android/server/location/ComprehensiveCountryDetector$4;->onServiceStateChanged(Landroid/telephony/ServiceState;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->access$100(Lcom/android/server/location/ComprehensiveCountryDetector;ZZ)Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->access$308(Lcom/android/server/location/ComprehensiveCountryDetector;)I
+PLcom/android/server/location/ComprehensiveCountryDetector;->access$408(Lcom/android/server/location/ComprehensiveCountryDetector;)I
+PLcom/android/server/location/ComprehensiveCountryDetector;->access$500(Lcom/android/server/location/ComprehensiveCountryDetector;)Z
+PLcom/android/server/location/ComprehensiveCountryDetector;->addPhoneStateListener()V
+PLcom/android/server/location/ComprehensiveCountryDetector;->addToLogs(Landroid/location/Country;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->cancelLocationRefresh()V
+PLcom/android/server/location/ComprehensiveCountryDetector;->detectCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->detectCountry(ZZ)Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->getCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->getNetworkBasedCountry()Landroid/location/Country;
+PLcom/android/server/location/ComprehensiveCountryDetector;->isNetworkCountryCodeAvailable()Z
+PLcom/android/server/location/ComprehensiveCountryDetector;->notifyIfCountryChanged(Landroid/location/Country;Landroid/location/Country;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->removePhoneStateListener()V
+PLcom/android/server/location/ComprehensiveCountryDetector;->runAfterDetection(Landroid/location/Country;Landroid/location/Country;ZZ)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->runAfterDetectionAsync(Landroid/location/Country;Landroid/location/Country;ZZ)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->setCountryListener(Landroid/location/CountryListener;)V
+PLcom/android/server/location/ComprehensiveCountryDetector;->stopLocationBasedDetector()V
+PLcom/android/server/location/ContextHubClientBroker;-><init>(Landroid/content/Context;Landroid/hardware/contexthub/V1_0/IContexthub;Lcom/android/server/location/ContextHubClientManager;ISLandroid/hardware/location/IContextHubClientCallback;)V
+PLcom/android/server/location/ContextHubClientBroker;->attachDeathRecipient()V
+PLcom/android/server/location/ContextHubClientBroker;->getAttachedContextHubId()I
+PLcom/android/server/location/ContextHubClientBroker;->getHostEndPointId()S
+PLcom/android/server/location/ContextHubClientBroker;->sendMessageToClient(Landroid/hardware/location/NanoAppMessage;)V
+PLcom/android/server/location/ContextHubClientBroker;->sendMessageToNanoApp(Landroid/hardware/location/NanoAppMessage;)I
+PLcom/android/server/location/ContextHubClientManager;-><init>(Landroid/content/Context;Landroid/hardware/contexthub/V1_0/IContexthub;)V
+PLcom/android/server/location/ContextHubClientManager;->broadcastMessage(ILandroid/hardware/location/NanoAppMessage;)V
+PLcom/android/server/location/ContextHubClientManager;->createNewClientBroker(Landroid/hardware/location/IContextHubClientCallback;I)Lcom/android/server/location/ContextHubClientBroker;
+PLcom/android/server/location/ContextHubClientManager;->forEachClientOfHub(ILjava/util/function/Consumer;)V
+PLcom/android/server/location/ContextHubClientManager;->lambda$broadcastMessage$4(Landroid/hardware/location/NanoAppMessage;Lcom/android/server/location/ContextHubClientBroker;)V
+PLcom/android/server/location/ContextHubClientManager;->onMessageFromNanoApp(ILandroid/hardware/contexthub/V1_0/ContextHubMsg;)V
+PLcom/android/server/location/ContextHubClientManager;->registerClient(Landroid/hardware/location/IContextHubClientCallback;I)Landroid/hardware/location/IContextHubClient;
+PLcom/android/server/location/ContextHubService$1;-><init>(Lcom/android/server/location/ContextHubService;I)V
+PLcom/android/server/location/ContextHubService$1;->onMessageFromNanoApp(Landroid/hardware/location/NanoAppMessage;)V
+PLcom/android/server/location/ContextHubService$4;-><init>(Lcom/android/server/location/ContextHubService;I)V
+PLcom/android/server/location/ContextHubService$4;->onQueryResponse(ILjava/util/List;)V
+PLcom/android/server/location/ContextHubService$ContextHubServiceCallback;-><init>(Lcom/android/server/location/ContextHubService;I)V
+PLcom/android/server/location/ContextHubService$ContextHubServiceCallback;->handleAppsInfo(Ljava/util/ArrayList;)V
+PLcom/android/server/location/ContextHubService$ContextHubServiceCallback;->handleClientMsg(Landroid/hardware/contexthub/V1_0/ContextHubMsg;)V
+PLcom/android/server/location/ContextHubService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/ContextHubService;->access$000(Lcom/android/server/location/ContextHubService;ILandroid/hardware/contexthub/V1_0/ContextHubMsg;)V
+PLcom/android/server/location/ContextHubService;->access$400(Lcom/android/server/location/ContextHubService;ILjava/util/List;)V
+PLcom/android/server/location/ContextHubService;->access$500(Lcom/android/server/location/ContextHubService;)Lcom/android/server/location/NanoAppStateManager;
+PLcom/android/server/location/ContextHubService;->access$600(Lcom/android/server/location/ContextHubService;III[B)I
+PLcom/android/server/location/ContextHubService;->checkHalProxyAndContextHubId(ILandroid/hardware/location/IContextHubTransactionCallback;I)Z
+PLcom/android/server/location/ContextHubService;->checkPermissions()V
+PLcom/android/server/location/ContextHubService;->createDefaultClientCallback(I)Landroid/hardware/location/IContextHubClientCallback;
+PLcom/android/server/location/ContextHubService;->createQueryTransactionCallback(I)Landroid/hardware/location/IContextHubTransactionCallback;
+PLcom/android/server/location/ContextHubService;->findNanoAppOnHub(ILandroid/hardware/location/NanoAppFilter;)[I
+PLcom/android/server/location/ContextHubService;->getContextHubHandles()[I
+PLcom/android/server/location/ContextHubService;->getContextHubInfo(I)Landroid/hardware/location/ContextHubInfo;
+PLcom/android/server/location/ContextHubService;->getContextHubProxy()Landroid/hardware/contexthub/V1_0/IContexthub;
+PLcom/android/server/location/ContextHubService;->getContextHubs()Ljava/util/List;
+PLcom/android/server/location/ContextHubService;->getNanoAppInstanceInfo(I)Landroid/hardware/location/NanoAppInstanceInfo;
+PLcom/android/server/location/ContextHubService;->handleClientMessageCallback(ILandroid/hardware/contexthub/V1_0/ContextHubMsg;)V
+PLcom/android/server/location/ContextHubService;->handleQueryAppsCallback(ILjava/util/List;)V
+PLcom/android/server/location/ContextHubService;->isValidContextHubId(I)Z
+PLcom/android/server/location/ContextHubService;->onMessageReceiptOldApi(III[B)I
+PLcom/android/server/location/ContextHubService;->queryNanoApps(ILandroid/hardware/location/IContextHubTransactionCallback;)V
+PLcom/android/server/location/ContextHubService;->queryNanoAppsInternal(I)I
+PLcom/android/server/location/ContextHubService;->registerCallback(Landroid/hardware/location/IContextHubCallback;)I
+PLcom/android/server/location/ContextHubService;->sendMessage(IILandroid/hardware/location/ContextHubMessage;)I
+PLcom/android/server/location/ContextHubServiceTransaction;-><init>(II)V
+PLcom/android/server/location/ContextHubServiceTransaction;->getTimeout(Ljava/util/concurrent/TimeUnit;)J
+PLcom/android/server/location/ContextHubServiceTransaction;->getTransactionType()I
+PLcom/android/server/location/ContextHubServiceTransaction;->setComplete()V
+PLcom/android/server/location/ContextHubServiceUtil;->checkPermissions(Landroid/content/Context;)V
+PLcom/android/server/location/ContextHubServiceUtil;->copyToByteArrayList([BLjava/util/ArrayList;)V
+PLcom/android/server/location/ContextHubServiceUtil;->createContextHubInfoMap(Ljava/util/List;)Ljava/util/HashMap;
+PLcom/android/server/location/ContextHubServiceUtil;->createHidlContextHubMessage(SLandroid/hardware/location/NanoAppMessage;)Landroid/hardware/contexthub/V1_0/ContextHubMsg;
+PLcom/android/server/location/ContextHubServiceUtil;->createNanoAppMessage(Landroid/hardware/contexthub/V1_0/ContextHubMsg;)Landroid/hardware/location/NanoAppMessage;
+PLcom/android/server/location/ContextHubServiceUtil;->createNanoAppStateList(Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/location/ContextHubServiceUtil;->createPrimitiveIntArray(Ljava/util/Collection;)[I
+PLcom/android/server/location/ContextHubServiceUtil;->toTransactionResult(I)I
+PLcom/android/server/location/ContextHubTransactionManager$5;-><init>(Lcom/android/server/location/ContextHubTransactionManager;IIILandroid/hardware/location/IContextHubTransactionCallback;)V
+PLcom/android/server/location/ContextHubTransactionManager$5;->onQueryResponse(ILjava/util/List;)V
+PLcom/android/server/location/ContextHubTransactionManager$5;->onTransact()I
+PLcom/android/server/location/ContextHubTransactionManager;-><init>(Landroid/hardware/contexthub/V1_0/IContexthub;Lcom/android/server/location/ContextHubClientManager;Lcom/android/server/location/NanoAppStateManager;)V
+PLcom/android/server/location/ContextHubTransactionManager;->access$000(Lcom/android/server/location/ContextHubTransactionManager;)Landroid/hardware/contexthub/V1_0/IContexthub;
+PLcom/android/server/location/ContextHubTransactionManager;->addTransaction(Lcom/android/server/location/ContextHubServiceTransaction;)V
+PLcom/android/server/location/ContextHubTransactionManager;->createQueryTransaction(ILandroid/hardware/location/IContextHubTransactionCallback;)Lcom/android/server/location/ContextHubServiceTransaction;
+PLcom/android/server/location/ContextHubTransactionManager;->onQueryResponse(Ljava/util/List;)V
+PLcom/android/server/location/ContextHubTransactionManager;->removeTransactionAndStartNext()V
+PLcom/android/server/location/ContextHubTransactionManager;->startNextTransaction()V
+PLcom/android/server/location/CountryDetectorBase;-><init>(Landroid/content/Context;)V
+PLcom/android/server/location/ExponentialBackOff;-><init>(JJ)V
+PLcom/android/server/location/ExponentialBackOff;->reset()V
+PLcom/android/server/location/GeocoderProxy;-><init>(Landroid/content/Context;IIILandroid/os/Handler;)V
+PLcom/android/server/location/GeocoderProxy;->bind()Z
+PLcom/android/server/location/GeocoderProxy;->createAndBind(Landroid/content/Context;IIILandroid/os/Handler;)Lcom/android/server/location/GeocoderProxy;
+PLcom/android/server/location/GeocoderProxy;->getConnectedPackageName()Ljava/lang/String;
+PLcom/android/server/location/GeofenceManager$1;-><init>(Lcom/android/server/location/GeofenceManager;Landroid/os/Handler;)V
+PLcom/android/server/location/GeofenceManager$GeofenceHandler;-><init>(Lcom/android/server/location/GeofenceManager;)V
+PLcom/android/server/location/GeofenceManager;-><init>(Landroid/content/Context;Lcom/android/server/location/LocationBlacklist;)V
+PLcom/android/server/location/GeofenceManager;->updateMinInterval()V
+PLcom/android/server/location/GeofenceProxy$1;-><init>(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy$1;->run()V
+PLcom/android/server/location/GeofenceProxy$2;-><init>(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy$2;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/location/GeofenceProxy$3;-><init>(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy$3;->run(Landroid/os/IBinder;)V
+PLcom/android/server/location/GeofenceProxy$4;-><init>(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy$4;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/location/GeofenceProxy;-><init>(Landroid/content/Context;IIILandroid/os/Handler;Landroid/location/IGpsGeofenceHardware;Landroid/location/IFusedGeofenceHardware;)V
+PLcom/android/server/location/GeofenceProxy;->access$000(Lcom/android/server/location/GeofenceProxy;)Landroid/os/Handler;
+PLcom/android/server/location/GeofenceProxy;->access$100(Lcom/android/server/location/GeofenceProxy;)Ljava/lang/Object;
+PLcom/android/server/location/GeofenceProxy;->access$200(Lcom/android/server/location/GeofenceProxy;)Landroid/hardware/location/IGeofenceHardware;
+PLcom/android/server/location/GeofenceProxy;->access$202(Lcom/android/server/location/GeofenceProxy;Landroid/hardware/location/IGeofenceHardware;)Landroid/hardware/location/IGeofenceHardware;
+PLcom/android/server/location/GeofenceProxy;->access$300(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy;->access$400(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy;->access$500(Lcom/android/server/location/GeofenceProxy;)V
+PLcom/android/server/location/GeofenceProxy;->bindGeofenceProvider()Z
+PLcom/android/server/location/GeofenceProxy;->bindHardwareGeofence()V
+PLcom/android/server/location/GeofenceProxy;->createAndBind(Landroid/content/Context;IIILandroid/os/Handler;Landroid/location/IGpsGeofenceHardware;Landroid/location/IFusedGeofenceHardware;)Lcom/android/server/location/GeofenceProxy;
+PLcom/android/server/location/GeofenceProxy;->setFusedGeofenceLocked()V
+PLcom/android/server/location/GeofenceProxy;->setGeofenceHardwareInProviderLocked()V
+PLcom/android/server/location/GeofenceProxy;->setGpsGeofenceLocked()V
+PLcom/android/server/location/GnssBatchingProvider$GnssBatchingProviderNative;-><init>()V
+PLcom/android/server/location/GnssBatchingProvider$GnssBatchingProviderNative;->initBatching()Z
+PLcom/android/server/location/GnssBatchingProvider;-><init>()V
+PLcom/android/server/location/GnssBatchingProvider;-><init>(Lcom/android/server/location/GnssBatchingProvider$GnssBatchingProviderNative;)V
+PLcom/android/server/location/GnssBatchingProvider;->access$400()Z
+PLcom/android/server/location/GnssBatchingProvider;->enable()V
+PLcom/android/server/location/GnssBatchingProvider;->resumeIfStarted()V
+PLcom/android/server/location/GnssGeofenceProvider$GnssGeofenceProviderNative;-><init>()V
+PLcom/android/server/location/GnssGeofenceProvider$GnssGeofenceProviderNative;->isGeofenceSupported()Z
+PLcom/android/server/location/GnssGeofenceProvider;-><init>(Landroid/os/Looper;)V
+PLcom/android/server/location/GnssGeofenceProvider;-><init>(Landroid/os/Looper;Lcom/android/server/location/GnssGeofenceProvider$GnssGeofenceProviderNative;)V
+PLcom/android/server/location/GnssGeofenceProvider;->access$000()Z
+PLcom/android/server/location/GnssGeofenceProvider;->isHardwareGeofenceSupported()Z
+PLcom/android/server/location/GnssGeofenceProvider;->lambda$resumeIfStarted$0(Lcom/android/server/location/GnssGeofenceProvider;)V
+PLcom/android/server/location/GnssGeofenceProvider;->resumeIfStarted()V
+PLcom/android/server/location/GnssGeofenceProvider;->runOnHandlerThread(Ljava/util/concurrent/Callable;)Z
+PLcom/android/server/location/GnssLocationProvider$11;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/location/GnssMeasurementsEvent;)V
+PLcom/android/server/location/GnssLocationProvider$11;->run()V
+PLcom/android/server/location/GnssLocationProvider$13;-><init>(Lcom/android/server/location/GnssLocationProvider;I)V
+PLcom/android/server/location/GnssLocationProvider$13;->run()V
+PLcom/android/server/location/GnssLocationProvider$14;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$15;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$15;->getGnssMetricsAsProtoString()Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider$16;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$1;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$1;->registerGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssLocationProvider$1;->unregisterGnssStatusCallback(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssLocationProvider$2;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$2;->onAvailable(Landroid/net/Network;)V
+PLcom/android/server/location/GnssLocationProvider$2;->onLost(Landroid/net/Network;)V
+PLcom/android/server/location/GnssLocationProvider$3;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$4;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/location/GnssLocationProvider$5;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$5;->onSubscriptionsChanged()V
+PLcom/android/server/location/GnssLocationProvider$6;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$6;->lambda$new$0(I)Z
+PLcom/android/server/location/GnssLocationProvider$6;->lambda$new$1(I)Z
+PLcom/android/server/location/GnssLocationProvider$6;->lambda$new$2(I)Z
+PLcom/android/server/location/GnssLocationProvider$6;->lambda$new$3(I)Z
+PLcom/android/server/location/GnssLocationProvider$6;->lambda$new$4(I)Z
+PLcom/android/server/location/GnssLocationProvider$6;->lambda$new$5(I)Z
+PLcom/android/server/location/GnssLocationProvider$6;->lambda$new$6(I)Z
+PLcom/android/server/location/GnssLocationProvider$7;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/os/Handler;)V
+PLcom/android/server/location/GnssLocationProvider$7;->isAvailableInPlatform()Z
+PLcom/android/server/location/GnssLocationProvider$7;->isGpsEnabled()Z
+PLcom/android/server/location/GnssLocationProvider$8;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/GnssLocationProvider$8;->isGpsEnabled()Z
+PLcom/android/server/location/GnssLocationProvider$9;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/os/Handler;)V
+PLcom/android/server/location/GnssLocationProvider$9;->isGpsEnabled()Z
+PLcom/android/server/location/GnssLocationProvider$FusedLocationListener;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$FusedLocationListener;-><init>(Lcom/android/server/location/GnssLocationProvider;Lcom/android/server/location/GnssLocationProvider$1;)V
+PLcom/android/server/location/GnssLocationProvider$GpsRequest;-><init>(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider$LocationChangeListener;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$LocationChangeListener;-><init>(Lcom/android/server/location/GnssLocationProvider;Lcom/android/server/location/GnssLocationProvider$1;)V
+PLcom/android/server/location/GnssLocationProvider$LocationExtras;-><init>()V
+PLcom/android/server/location/GnssLocationProvider$LocationExtras;->getBundle()Landroid/os/Bundle;
+PLcom/android/server/location/GnssLocationProvider$LocationExtras;->reset()V
+PLcom/android/server/location/GnssLocationProvider$LocationExtras;->set(III)V
+PLcom/android/server/location/GnssLocationProvider$LocationExtras;->setBundle(Landroid/os/Bundle;)V
+PLcom/android/server/location/GnssLocationProvider$NetworkLocationListener;-><init>(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider$NetworkLocationListener;-><init>(Lcom/android/server/location/GnssLocationProvider;Lcom/android/server/location/GnssLocationProvider$1;)V
+PLcom/android/server/location/GnssLocationProvider$NetworkLocationListener;->onLocationChanged(Landroid/location/Location;)V
+PLcom/android/server/location/GnssLocationProvider$ProviderHandler;-><init>(Lcom/android/server/location/GnssLocationProvider;Landroid/os/Looper;)V
+PLcom/android/server/location/GnssLocationProvider$ProviderHandler;->handleInitialize()V
+PLcom/android/server/location/GnssLocationProvider$SvStatusInfo;-><init>()V
+PLcom/android/server/location/GnssLocationProvider$SvStatusInfo;-><init>(Lcom/android/server/location/GnssLocationProvider$1;)V
+PLcom/android/server/location/GnssLocationProvider;-><init>(Landroid/content/Context;Landroid/location/ILocationManager;Landroid/os/Looper;)V
+PLcom/android/server/location/GnssLocationProvider;->access$1200(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->access$1300(Lcom/android/server/location/GnssLocationProvider;Landroid/content/Context;)V
+PLcom/android/server/location/GnssLocationProvider;->access$1400(I)Z
+PLcom/android/server/location/GnssLocationProvider;->access$1500(I)Z
+PLcom/android/server/location/GnssLocationProvider;->access$1600(I)Z
+PLcom/android/server/location/GnssLocationProvider;->access$1700(I)Z
+PLcom/android/server/location/GnssLocationProvider;->access$1800(I)Z
+PLcom/android/server/location/GnssLocationProvider;->access$1900(I)Z
+PLcom/android/server/location/GnssLocationProvider;->access$200(Lcom/android/server/location/GnssLocationProvider;)Lcom/android/server/location/GnssStatusListenerHelper;
+PLcom/android/server/location/GnssLocationProvider;->access$2000(I)Z
+PLcom/android/server/location/GnssLocationProvider;->access$2100(Lcom/android/server/location/GnssLocationProvider;)Ljava/util/Properties;
+PLcom/android/server/location/GnssLocationProvider;->access$2800(Lcom/android/server/location/GnssLocationProvider;)Lcom/android/server/location/GnssMeasurementsProvider;
+PLcom/android/server/location/GnssLocationProvider;->access$2900(Lcom/android/server/location/GnssLocationProvider;)Lcom/android/server/location/GnssNavigationMessageProvider;
+PLcom/android/server/location/GnssLocationProvider;->access$300(Lcom/android/server/location/GnssLocationProvider;)Lcom/android/server/location/NtpTimeHelper;
+PLcom/android/server/location/GnssLocationProvider;->access$3002(Lcom/android/server/location/GnssLocationProvider;I)I
+PLcom/android/server/location/GnssLocationProvider;->access$3100(Lcom/android/server/location/GnssLocationProvider;I)Z
+PLcom/android/server/location/GnssLocationProvider;->access$3300(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->access$3600(Lcom/android/server/location/GnssLocationProvider;)Lcom/android/internal/location/gnssmetrics/GnssMetrics;
+PLcom/android/server/location/GnssLocationProvider;->access$3800(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->access$400(Lcom/android/server/location/GnssLocationProvider;)I
+PLcom/android/server/location/GnssLocationProvider;->access$4000(Lcom/android/server/location/GnssLocationProvider;Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider;->access$4100(Lcom/android/server/location/GnssLocationProvider;Landroid/net/Network;)V
+PLcom/android/server/location/GnssLocationProvider;->access$4200(Lcom/android/server/location/GnssLocationProvider;Ljava/net/InetAddress;)V
+PLcom/android/server/location/GnssLocationProvider;->access$4300(Lcom/android/server/location/GnssLocationProvider;I)V
+PLcom/android/server/location/GnssLocationProvider;->access$4600(Lcom/android/server/location/GnssLocationProvider;Landroid/location/Location;)V
+PLcom/android/server/location/GnssLocationProvider;->access$4700(Lcom/android/server/location/GnssLocationProvider;)Landroid/content/Context;
+PLcom/android/server/location/GnssLocationProvider;->access$4800(Lcom/android/server/location/GnssLocationProvider;ZLandroid/location/Location;)V
+PLcom/android/server/location/GnssLocationProvider;->access$4900(Lcom/android/server/location/GnssLocationProvider;Lcom/android/server/location/GnssLocationProvider$SvStatusInfo;)V
+PLcom/android/server/location/GnssLocationProvider;->access$500(Lcom/android/server/location/GnssLocationProvider;)Z
+PLcom/android/server/location/GnssLocationProvider;->access$5000(Lcom/android/server/location/GnssLocationProvider;)Landroid/os/PowerManager$WakeLock;
+PLcom/android/server/location/GnssLocationProvider;->access$5100(Lcom/android/server/location/GnssLocationProvider;I)Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider;->access$5200()V
+PLcom/android/server/location/GnssLocationProvider;->access$5300(Lcom/android/server/location/GnssLocationProvider;)Z
+PLcom/android/server/location/GnssLocationProvider;->access$5400(Lcom/android/server/location/GnssLocationProvider;)V
+PLcom/android/server/location/GnssLocationProvider;->access$5500(Lcom/android/server/location/GnssLocationProvider;Landroid/content/Context;Ljava/util/Properties;)V
+PLcom/android/server/location/GnssLocationProvider;->access$5600(Lcom/android/server/location/GnssLocationProvider;)Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;
+PLcom/android/server/location/GnssLocationProvider;->access$5700()Z
+PLcom/android/server/location/GnssLocationProvider;->access$5800(Lcom/android/server/location/GnssLocationProvider;)Landroid/content/BroadcastReceiver;
+PLcom/android/server/location/GnssLocationProvider;->access$5900(Lcom/android/server/location/GnssLocationProvider;)Landroid/net/ConnectivityManager$NetworkCallback;
+PLcom/android/server/location/GnssLocationProvider;->access$6000(Lcom/android/server/location/GnssLocationProvider;)Landroid/net/ConnectivityManager;
+PLcom/android/server/location/GnssLocationProvider;->access$700(Lcom/android/server/location/GnssLocationProvider;IILjava/lang/Object;)V
+PLcom/android/server/location/GnssLocationProvider;->access$900()Z
+PLcom/android/server/location/GnssLocationProvider;->enable()V
+PLcom/android/server/location/GnssLocationProvider;->getGnssBatchingProvider()Lcom/android/server/location/GnssBatchingProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssMeasurementsProvider()Lcom/android/server/location/GnssMeasurementsProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssMetricsProvider()Lcom/android/server/location/GnssLocationProvider$GnssMetricsProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssNavigationMessageProvider()Lcom/android/server/location/GnssNavigationMessageProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssStatusProvider()Landroid/location/IGnssStatusProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGnssSystemInfoProvider()Lcom/android/server/location/GnssLocationProvider$GnssSystemInfoProvider;
+PLcom/android/server/location/GnssLocationProvider;->getGpsGeofenceProxy()Landroid/location/IGpsGeofenceHardware;
+PLcom/android/server/location/GnssLocationProvider;->getName()Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider;->getNetInitiatedListener()Landroid/location/INetInitiatedListener;
+PLcom/android/server/location/GnssLocationProvider;->getProperties()Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/location/GnssLocationProvider;->getSelectedApn()Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider;->getStatus(Landroid/os/Bundle;)I
+PLcom/android/server/location/GnssLocationProvider;->getStatusUpdateTime()J
+PLcom/android/server/location/GnssLocationProvider;->getSuplMode(Ljava/util/Properties;ZZ)I
+PLcom/android/server/location/GnssLocationProvider;->handleEnable()V
+PLcom/android/server/location/GnssLocationProvider;->handleReleaseSuplConnection(I)V
+PLcom/android/server/location/GnssLocationProvider;->handleRequestSuplConnection(Ljava/net/InetAddress;)V
+PLcom/android/server/location/GnssLocationProvider;->handleSetRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider;->handleUpdateLocation(Landroid/location/Location;)V
+PLcom/android/server/location/GnssLocationProvider;->handleUpdateNetworkState(Landroid/net/Network;)V
+PLcom/android/server/location/GnssLocationProvider;->hasCapability(I)Z
+PLcom/android/server/location/GnssLocationProvider;->injectTime(JJI)V
+PLcom/android/server/location/GnssLocationProvider;->isEnabled()Z
+PLcom/android/server/location/GnssLocationProvider;->isSupported()Z
+PLcom/android/server/location/GnssLocationProvider;->lambda$onUpdateSatelliteBlacklist$0([I[I)V
+PLcom/android/server/location/GnssLocationProvider;->loadPropertiesFromFile(Ljava/lang/String;Ljava/util/Properties;)Z
+PLcom/android/server/location/GnssLocationProvider;->loadPropertiesFromResource(Landroid/content/Context;Ljava/util/Properties;)V
+PLcom/android/server/location/GnssLocationProvider;->messageIdAsString(I)Ljava/lang/String;
+PLcom/android/server/location/GnssLocationProvider;->onUpdateSatelliteBlacklist([I[I)V
+PLcom/android/server/location/GnssLocationProvider;->releaseSuplConnection(I)V
+PLcom/android/server/location/GnssLocationProvider;->reloadGpsProperties(Landroid/content/Context;Ljava/util/Properties;)V
+PLcom/android/server/location/GnssLocationProvider;->reportAGpsStatus(II[B)V
+PLcom/android/server/location/GnssLocationProvider;->reportLocation(ZLandroid/location/Location;)V
+PLcom/android/server/location/GnssLocationProvider;->reportMeasurementData(Landroid/location/GnssMeasurementsEvent;)V
+PLcom/android/server/location/GnssLocationProvider;->reportStatus(I)V
+PLcom/android/server/location/GnssLocationProvider;->reportSvStatus(I[I[F[F[F[F)V
+PLcom/android/server/location/GnssLocationProvider;->restartLocationRequest()V
+PLcom/android/server/location/GnssLocationProvider;->restartRequests()V
+PLcom/android/server/location/GnssLocationProvider;->setEngineCapabilities(I)V
+PLcom/android/server/location/GnssLocationProvider;->setGnssYearOfHardware(I)V
+PLcom/android/server/location/GnssLocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider;->setSuplHostPort(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/location/GnssLocationProvider;->startNavigating(Z)V
+PLcom/android/server/location/GnssLocationProvider;->stopNavigating()V
+PLcom/android/server/location/GnssLocationProvider;->subscriptionOrSimChanged(Landroid/content/Context;)V
+PLcom/android/server/location/GnssLocationProvider;->updateClientUids(Landroid/os/WorkSource;)V
+PLcom/android/server/location/GnssLocationProvider;->updateLowPowerMode()V
+PLcom/android/server/location/GnssLocationProvider;->updateRequirements()V
+PLcom/android/server/location/GnssLocationProvider;->updateStatus(I)V
+PLcom/android/server/location/GnssMeasurementsProvider$GnssMeasurementProviderNative;-><init>()V
+PLcom/android/server/location/GnssMeasurementsProvider$GnssMeasurementProviderNative;->isMeasurementSupported()Z
+PLcom/android/server/location/GnssMeasurementsProvider$GnssMeasurementProviderNative;->startMeasurementCollection(Z)Z
+PLcom/android/server/location/GnssMeasurementsProvider$GnssMeasurementProviderNative;->stopMeasurementCollection()Z
+PLcom/android/server/location/GnssMeasurementsProvider$StatusChangedOperation;-><init>(I)V
+PLcom/android/server/location/GnssMeasurementsProvider$StatusChangedOperation;->execute(Landroid/location/IGnssMeasurementsListener;)V
+PLcom/android/server/location/GnssMeasurementsProvider$StatusChangedOperation;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssMeasurementsProvider;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/GnssMeasurementsProvider;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/location/GnssMeasurementsProvider$GnssMeasurementProviderNative;)V
+PLcom/android/server/location/GnssMeasurementsProvider;->access$000()Z
+PLcom/android/server/location/GnssMeasurementsProvider;->access$100(Z)Z
+PLcom/android/server/location/GnssMeasurementsProvider;->access$200()Z
+PLcom/android/server/location/GnssMeasurementsProvider;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/GnssMeasurementsProvider;->isAvailableInPlatform()Z
+PLcom/android/server/location/GnssMeasurementsProvider;->lambda$onMeasurementsAvailable$0(Landroid/location/GnssMeasurementsEvent;Landroid/location/IGnssMeasurementsListener;)V
+PLcom/android/server/location/GnssMeasurementsProvider;->onCapabilitiesUpdated(Z)V
+PLcom/android/server/location/GnssMeasurementsProvider;->onGpsEnabledChanged()V
+PLcom/android/server/location/GnssMeasurementsProvider;->onMeasurementsAvailable(Landroid/location/GnssMeasurementsEvent;)V
+PLcom/android/server/location/GnssMeasurementsProvider;->registerWithService()I
+PLcom/android/server/location/GnssMeasurementsProvider;->resumeIfStarted()V
+PLcom/android/server/location/GnssMeasurementsProvider;->unregisterFromService()V
+PLcom/android/server/location/GnssNavigationMessageProvider$GnssNavigationMessageProviderNative;-><init>()V
+PLcom/android/server/location/GnssNavigationMessageProvider$GnssNavigationMessageProviderNative;->isNavigationMessageSupported()Z
+PLcom/android/server/location/GnssNavigationMessageProvider$StatusChangedOperation;-><init>(I)V
+PLcom/android/server/location/GnssNavigationMessageProvider;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/location/GnssNavigationMessageProvider;-><init>(Landroid/os/Handler;Lcom/android/server/location/GnssNavigationMessageProvider$GnssNavigationMessageProviderNative;)V
+PLcom/android/server/location/GnssNavigationMessageProvider;->access$000()Z
+PLcom/android/server/location/GnssNavigationMessageProvider;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/GnssNavigationMessageProvider;->isAvailableInPlatform()Z
+PLcom/android/server/location/GnssNavigationMessageProvider;->onCapabilitiesUpdated(Z)V
+PLcom/android/server/location/GnssNavigationMessageProvider;->onGpsEnabledChanged()V
+PLcom/android/server/location/GnssNavigationMessageProvider;->resumeIfStarted()V
+PLcom/android/server/location/GnssSatelliteBlacklistHelper$1;-><init>(Lcom/android/server/location/GnssSatelliteBlacklistHelper;Landroid/os/Handler;)V
+PLcom/android/server/location/GnssSatelliteBlacklistHelper;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/location/GnssSatelliteBlacklistHelper$GnssSatelliteBlacklistCallback;)V
+PLcom/android/server/location/GnssSatelliteBlacklistHelper;->parseSatelliteBlacklist(Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/location/GnssSatelliteBlacklistHelper;->updateSatelliteBlacklist()V
+PLcom/android/server/location/GnssStatusListenerHelper$1;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;)V
+PLcom/android/server/location/GnssStatusListenerHelper$1;->execute(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssStatusListenerHelper$1;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssStatusListenerHelper$2;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;)V
+PLcom/android/server/location/GnssStatusListenerHelper$2;->execute(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssStatusListenerHelper$2;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssStatusListenerHelper$3;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;I)V
+PLcom/android/server/location/GnssStatusListenerHelper$3;->execute(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssStatusListenerHelper$3;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssStatusListenerHelper$4;-><init>(Lcom/android/server/location/GnssStatusListenerHelper;I[I[F[F[F[F)V
+PLcom/android/server/location/GnssStatusListenerHelper$4;->execute(Landroid/location/IGnssStatusListener;)V
+PLcom/android/server/location/GnssStatusListenerHelper$4;->execute(Landroid/os/IInterface;)V
+PLcom/android/server/location/GnssStatusListenerHelper;-><init>(Landroid/os/Handler;)V
+PLcom/android/server/location/GnssStatusListenerHelper;->getHandlerOperation(I)Lcom/android/server/location/RemoteListenerHelper$ListenerOperation;
+PLcom/android/server/location/GnssStatusListenerHelper;->onFirstFix(I)V
+PLcom/android/server/location/GnssStatusListenerHelper;->onStatusChanged(Z)V
+PLcom/android/server/location/GnssStatusListenerHelper;->onSvStatusChanged(I[I[F[F[F[F)V
+PLcom/android/server/location/GnssStatusListenerHelper;->registerWithService()I
+PLcom/android/server/location/LocationBlacklist;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/LocationBlacklist;->getStringArrayLocked(Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/location/LocationBlacklist;->init()V
+PLcom/android/server/location/LocationBlacklist;->isBlacklisted(Ljava/lang/String;)Z
+PLcom/android/server/location/LocationBlacklist;->reloadBlacklist()V
+PLcom/android/server/location/LocationBlacklist;->reloadBlacklistLocked()V
+PLcom/android/server/location/LocationFudger$1;-><init>(Lcom/android/server/location/LocationFudger;Landroid/os/Handler;)V
+PLcom/android/server/location/LocationFudger;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/location/LocationFudger;->addCoarseLocationExtraLocked(Landroid/location/Location;)Landroid/location/Location;
+PLcom/android/server/location/LocationFudger;->createCoarseLocked(Landroid/location/Location;)Landroid/location/Location;
+PLcom/android/server/location/LocationFudger;->getOrCreate(Landroid/location/Location;)Landroid/location/Location;
+PLcom/android/server/location/LocationFudger;->loadCoarseAccuracy()F
+PLcom/android/server/location/LocationFudger;->metersToDegreesLatitude(D)D
+PLcom/android/server/location/LocationFudger;->metersToDegreesLongitude(DD)D
+PLcom/android/server/location/LocationFudger;->nextOffsetLocked()D
+PLcom/android/server/location/LocationFudger;->setAccuracyInMetersLocked(F)V
+PLcom/android/server/location/LocationFudger;->updateRandomOffsetLocked()V
+PLcom/android/server/location/LocationFudger;->wrapLatitude(D)D
+PLcom/android/server/location/LocationFudger;->wrapLongitude(D)D
+PLcom/android/server/location/LocationProviderProxy$1$1;-><init>(Lcom/android/server/location/LocationProviderProxy$1;[Lcom/android/internal/location/ProviderProperties;ZLcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/LocationProviderProxy$1$1;->run(Landroid/os/IBinder;)V
+PLcom/android/server/location/LocationProviderProxy$1;-><init>(Lcom/android/server/location/LocationProviderProxy;)V
+PLcom/android/server/location/LocationProviderProxy$1;->run()V
+PLcom/android/server/location/LocationProviderProxy$2;-><init>(Lcom/android/server/location/LocationProviderProxy;)V
+PLcom/android/server/location/LocationProviderProxy$4;-><init>(Lcom/android/server/location/LocationProviderProxy;Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/LocationProviderProxy$4;->run(Landroid/os/IBinder;)V
+PLcom/android/server/location/LocationProviderProxy$6;-><init>(Lcom/android/server/location/LocationProviderProxy;[ILandroid/os/Bundle;)V
+PLcom/android/server/location/LocationProviderProxy$6;->run(Landroid/os/IBinder;)V
+PLcom/android/server/location/LocationProviderProxy$7;-><init>(Lcom/android/server/location/LocationProviderProxy;[J)V
+PLcom/android/server/location/LocationProviderProxy$7;->run(Landroid/os/IBinder;)V
+PLcom/android/server/location/LocationProviderProxy;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;IIILandroid/os/Handler;)V
+PLcom/android/server/location/LocationProviderProxy;->access$000()Z
+PLcom/android/server/location/LocationProviderProxy;->access$100(Lcom/android/server/location/LocationProviderProxy;)Ljava/lang/Object;
+PLcom/android/server/location/LocationProviderProxy;->access$200(Lcom/android/server/location/LocationProviderProxy;)Z
+PLcom/android/server/location/LocationProviderProxy;->access$300(Lcom/android/server/location/LocationProviderProxy;)Lcom/android/internal/location/ProviderRequest;
+PLcom/android/server/location/LocationProviderProxy;->access$400(Lcom/android/server/location/LocationProviderProxy;)Landroid/os/WorkSource;
+PLcom/android/server/location/LocationProviderProxy;->access$500(Lcom/android/server/location/LocationProviderProxy;)Lcom/android/server/ServiceWatcher;
+PLcom/android/server/location/LocationProviderProxy;->access$602(Lcom/android/server/location/LocationProviderProxy;Lcom/android/internal/location/ProviderProperties;)Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/location/LocationProviderProxy;->bind()Z
+PLcom/android/server/location/LocationProviderProxy;->createAndBind(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;IIILandroid/os/Handler;)Lcom/android/server/location/LocationProviderProxy;
+PLcom/android/server/location/LocationProviderProxy;->enable()V
+PLcom/android/server/location/LocationProviderProxy;->getName()Ljava/lang/String;
+PLcom/android/server/location/LocationProviderProxy;->getProperties()Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/location/LocationProviderProxy;->getStatus(Landroid/os/Bundle;)I
+PLcom/android/server/location/LocationProviderProxy;->getStatusUpdateTime()J
+PLcom/android/server/location/LocationProviderProxy;->isEnabled()Z
+PLcom/android/server/location/LocationProviderProxy;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/LocationRequestStatistics$PackageProviderKey;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/location/LocationRequestStatistics$PackageProviderKey;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/location/LocationRequestStatistics$PackageProviderKey;->hashCode()I
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;-><init>()V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;-><init>(Lcom/android/server/location/LocationRequestStatistics$1;)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->access$100(Lcom/android/server/location/LocationRequestStatistics$PackageStatistics;J)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->access$200(Lcom/android/server/location/LocationRequestStatistics$PackageStatistics;Z)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->access$300(Lcom/android/server/location/LocationRequestStatistics$PackageStatistics;)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->startRequesting(J)V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->stopRequesting()V
+PLcom/android/server/location/LocationRequestStatistics$PackageStatistics;->updateForeground(Z)V
+PLcom/android/server/location/LocationRequestStatistics;-><init>()V
+PLcom/android/server/location/LocationRequestStatistics;->startRequesting(Ljava/lang/String;Ljava/lang/String;JZ)V
+PLcom/android/server/location/LocationRequestStatistics;->stopRequesting(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/location/NanoAppStateManager;-><init>()V
+PLcom/android/server/location/NanoAppStateManager;->addNanoAppInstance(IJI)V
+PLcom/android/server/location/NanoAppStateManager;->getNanoAppHandle(IJ)I
+PLcom/android/server/location/NanoAppStateManager;->getNanoAppInstanceInfo(I)Landroid/hardware/location/NanoAppInstanceInfo;
+PLcom/android/server/location/NanoAppStateManager;->getNanoAppInstanceInfoCollection()Ljava/util/Collection;
+PLcom/android/server/location/NanoAppStateManager;->handleQueryAppEntry(IJI)V
+PLcom/android/server/location/NanoAppStateManager;->removeNanoAppInstance(IJ)V
+PLcom/android/server/location/NanoAppStateManager;->updateCache(ILjava/util/List;)V
+PLcom/android/server/location/NtpTimeHelper;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/location/NtpTimeHelper$InjectNtpTimeCallback;)V
+PLcom/android/server/location/NtpTimeHelper;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/location/NtpTimeHelper$InjectNtpTimeCallback;Landroid/util/NtpTrustedTime;)V
+PLcom/android/server/location/NtpTimeHelper;->blockingGetNtpTimeAndInject()V
+PLcom/android/server/location/NtpTimeHelper;->isNetworkConnected()Z
+PLcom/android/server/location/NtpTimeHelper;->lambda$blockingGetNtpTimeAndInject$0(Lcom/android/server/location/NtpTimeHelper;JJJ)V
+PLcom/android/server/location/NtpTimeHelper;->lambda$xWqlqJuq4jBJ5-xhFLCwEKGVB0k(Lcom/android/server/location/NtpTimeHelper;)V
+PLcom/android/server/location/NtpTimeHelper;->onNetworkAvailable()V
+PLcom/android/server/location/NtpTimeHelper;->retrieveAndInjectNtpTime()V
+PLcom/android/server/location/PassiveProvider;-><init>(Landroid/location/ILocationManager;)V
+PLcom/android/server/location/PassiveProvider;->getName()Ljava/lang/String;
+PLcom/android/server/location/PassiveProvider;->getProperties()Lcom/android/internal/location/ProviderProperties;
+PLcom/android/server/location/PassiveProvider;->getStatus(Landroid/os/Bundle;)I
+PLcom/android/server/location/PassiveProvider;->getStatusUpdateTime()J
+PLcom/android/server/location/PassiveProvider;->isEnabled()Z
+PLcom/android/server/location/PassiveProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
+PLcom/android/server/location/PassiveProvider;->updateLocation(Landroid/location/Location;)V
+PLcom/android/server/location/RemoteListenerHelper$1;-><init>(Lcom/android/server/location/RemoteListenerHelper;)V
+PLcom/android/server/location/RemoteListenerHelper$1;->run()V
+PLcom/android/server/location/RemoteListenerHelper$2;-><init>(Lcom/android/server/location/RemoteListenerHelper;)V
+PLcom/android/server/location/RemoteListenerHelper$2;->run()V
+PLcom/android/server/location/RemoteListenerHelper$LinkedListener;-><init>(Lcom/android/server/location/RemoteListenerHelper;Landroid/os/IInterface;)V
+PLcom/android/server/location/RemoteListenerHelper;-><init>(Landroid/os/Handler;Ljava/lang/String;)V
+PLcom/android/server/location/RemoteListenerHelper;->access$000(Lcom/android/server/location/RemoteListenerHelper;)Z
+PLcom/android/server/location/RemoteListenerHelper;->access$002(Lcom/android/server/location/RemoteListenerHelper;Z)Z
+PLcom/android/server/location/RemoteListenerHelper;->addListener(Landroid/os/IInterface;)Z
+PLcom/android/server/location/RemoteListenerHelper;->calculateCurrentResultUnsafe()I
+PLcom/android/server/location/RemoteListenerHelper;->removeListener(Landroid/os/IInterface;)V
+PLcom/android/server/location/RemoteListenerHelper;->setSupported(Z)V
+PLcom/android/server/location/RemoteListenerHelper;->tryRegister()V
+PLcom/android/server/location/RemoteListenerHelper;->tryUnregister()V
+PLcom/android/server/location/RemoteListenerHelper;->tryUpdateRegistrationWithService()V
+PLcom/android/server/location/RemoteListenerHelper;->updateResult()V
+PLcom/android/server/locksettings/-$$Lambda$LockSettingsService$Hh44Kcp05cKI6Hc6dJfQupn4QY8;-><init>(Lcom/android/server/locksettings/LockSettingsService;Landroid/app/admin/PasswordMetrics;I)V
+PLcom/android/server/locksettings/-$$Lambda$LockSettingsService$Hh44Kcp05cKI6Hc6dJfQupn4QY8;->run()V
+PLcom/android/server/locksettings/-$$Lambda$LockSettingsService$lWTrcqR9gZxL-pxwBbtvTGqAifU;-><init>(Lcom/android/server/locksettings/LockSettingsService;I)V
+PLcom/android/server/locksettings/-$$Lambda$LockSettingsService$lWTrcqR9gZxL-pxwBbtvTGqAifU;->run()V
+PLcom/android/server/locksettings/-$$Lambda$SyntheticPasswordManager$WjMV-qfQ1YUbeAiLzyAhyepqPFI;-><init>(Lcom/android/server/locksettings/SyntheticPasswordManager;)V
+PLcom/android/server/locksettings/-$$Lambda$SyntheticPasswordManager$WjMV-qfQ1YUbeAiLzyAhyepqPFI;->onValues(ILandroid/hardware/weaver/V1_0/WeaverConfig;)V
+PLcom/android/server/locksettings/-$$Lambda$SyntheticPasswordManager$aWnbfYziDTrRrLqWFePMTj6-dy0;-><init>([Lcom/android/internal/widget/VerifyCredentialResponse;I)V
+PLcom/android/server/locksettings/-$$Lambda$SyntheticPasswordManager$aWnbfYziDTrRrLqWFePMTj6-dy0;->onValues(ILandroid/hardware/weaver/V1_0/WeaverReadResponse;)V
+PLcom/android/server/locksettings/LockSettingsService$1;-><init>(Lcom/android/server/locksettings/LockSettingsService;I)V
+PLcom/android/server/locksettings/LockSettingsService$1;->run()V
+PLcom/android/server/locksettings/LockSettingsService$2;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/locksettings/LockSettingsService$3;-><init>(Lcom/android/server/locksettings/LockSettingsService;Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/locksettings/LockSettingsService$3;->onFinished(ILandroid/os/Bundle;)V
+PLcom/android/server/locksettings/LockSettingsService$3;->onProgress(IILandroid/os/Bundle;)V
+PLcom/android/server/locksettings/LockSettingsService$3;->onStarted(ILandroid/os/Bundle;)V
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->isProvisioned()Z
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->onSystemReady()V
+PLcom/android/server/locksettings/LockSettingsService$DeviceProvisionedObserver;->updateRegistration()V
+PLcom/android/server/locksettings/LockSettingsService$GateKeeperDiedRecipient;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService$GateKeeperDiedRecipient;-><init>(Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/LockSettingsService$1;)V
+PLcom/android/server/locksettings/LockSettingsService$Injector$1;-><init>(Lcom/android/server/locksettings/LockSettingsService$Injector;Lcom/android/server/locksettings/LockSettingsStorage;)V
+PLcom/android/server/locksettings/LockSettingsService$Injector;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getActivityManager()Landroid/app/IActivityManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getContext()Landroid/content/Context;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getDevicePolicyManager()Landroid/app/admin/DevicePolicyManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getHandler()Landroid/os/Handler;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getKeyStore()Landroid/security/KeyStore;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getLockPatternUtils()Lcom/android/internal/widget/LockPatternUtils;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getNotificationManager()Landroid/app/NotificationManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getRecoverableKeyStoreManager(Landroid/security/KeyStore;)Lcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getStorage()Lcom/android/server/locksettings/LockSettingsStorage;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getStorageManager()Landroid/os/storage/IStorageManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getStrongAuth()Lcom/android/server/locksettings/LockSettingsStrongAuth;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getStrongAuthTracker()Lcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getSyntheticPasswordManager(Lcom/android/server/locksettings/LockSettingsStorage;)Lcom/android/server/locksettings/SyntheticPasswordManager;
+PLcom/android/server/locksettings/LockSettingsService$Injector;->getUserManager()Landroid/os/UserManager;
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onStart()V
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onStartUser(I)V
+PLcom/android/server/locksettings/LockSettingsService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/locksettings/LockSettingsService$LocalService;-><init>(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService$LocalService;-><init>(Lcom/android/server/locksettings/LockSettingsService;Lcom/android/server/locksettings/LockSettingsService$1;)V
+PLcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;->getStrongAuthForUser(I)I
+PLcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;->handleStrongAuthRequiredChanged(II)V
+PLcom/android/server/locksettings/LockSettingsService$SynchronizedStrongAuthTracker;->register(Lcom/android/server/locksettings/LockSettingsStrongAuth;)V
+PLcom/android/server/locksettings/LockSettingsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsService;-><init>(Lcom/android/server/locksettings/LockSettingsService$Injector;)V
+PLcom/android/server/locksettings/LockSettingsService;->access$000(Lcom/android/server/locksettings/LockSettingsService;)V
+PLcom/android/server/locksettings/LockSettingsService;->access$1100(Lcom/android/server/locksettings/LockSettingsService;)Landroid/content/Context;
+PLcom/android/server/locksettings/LockSettingsService;->access$200(Lcom/android/server/locksettings/LockSettingsService;I)V
+PLcom/android/server/locksettings/LockSettingsService;->access$300(Lcom/android/server/locksettings/LockSettingsService;Landroid/os/UserHandle;)V
+PLcom/android/server/locksettings/LockSettingsService;->access$400(Lcom/android/server/locksettings/LockSettingsService;)Landroid/os/UserManager;
+PLcom/android/server/locksettings/LockSettingsService;->access$500(Lcom/android/server/locksettings/LockSettingsService;I)Z
+PLcom/android/server/locksettings/LockSettingsService;->activateEscrowTokens(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;I)V
+PLcom/android/server/locksettings/LockSettingsService;->checkCredential(Ljava/lang/String;IILcom/android/internal/widget/ICheckCredentialProgressCallback;)Lcom/android/internal/widget/VerifyCredentialResponse;
+PLcom/android/server/locksettings/LockSettingsService;->checkPasswordHavePermission(I)V
+PLcom/android/server/locksettings/LockSettingsService;->checkPasswordReadPermission(I)V
+PLcom/android/server/locksettings/LockSettingsService;->checkVoldPassword(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->checkWritePermission(I)V
+PLcom/android/server/locksettings/LockSettingsService;->disableEscrowTokenOnNonManagedDevicesIfNeeded(I)V
+PLcom/android/server/locksettings/LockSettingsService;->doVerifyCredential(Ljava/lang/String;IZJILcom/android/internal/widget/ICheckCredentialProgressCallback;)Lcom/android/internal/widget/VerifyCredentialResponse;
+PLcom/android/server/locksettings/LockSettingsService;->ensureProfileKeystoreUnlocked(I)V
+PLcom/android/server/locksettings/LockSettingsService;->getBoolean(Ljava/lang/String;ZI)Z
+PLcom/android/server/locksettings/LockSettingsService;->getGateKeeperService()Landroid/service/gatekeeper/IGateKeeperService;
+PLcom/android/server/locksettings/LockSettingsService;->getKey(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsService;->getLong(Ljava/lang/String;JI)J
+PLcom/android/server/locksettings/LockSettingsService;->getRecoveryStatus()Ljava/util/Map;
+PLcom/android/server/locksettings/LockSettingsService;->getString(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsService;->getStringUnchecked(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsService;->getStrongAuthForUser(I)I
+PLcom/android/server/locksettings/LockSettingsService;->getSyntheticPasswordHandleLocked(I)J
+PLcom/android/server/locksettings/LockSettingsService;->havePattern(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->hideEncryptionNotification(Landroid/os/UserHandle;)V
+PLcom/android/server/locksettings/LockSettingsService;->initRecoveryServiceWithSigFile(Ljava/lang/String;[B[B)V
+PLcom/android/server/locksettings/LockSettingsService;->isManagedProfileWithSeparatedLock(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->isSyntheticPasswordBasedCredentialLocked(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->isUserSecure(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->lambda$notifyActivePasswordMetricsAvailable$0(Lcom/android/server/locksettings/LockSettingsService;Landroid/app/admin/PasswordMetrics;I)V
+PLcom/android/server/locksettings/LockSettingsService;->lambda$tryRemoveUserFromSpCacheLater$2(Lcom/android/server/locksettings/LockSettingsService;I)V
+PLcom/android/server/locksettings/LockSettingsService;->maybeShowEncryptionNotificationForUser(I)V
+PLcom/android/server/locksettings/LockSettingsService;->migrateOldData()V
+PLcom/android/server/locksettings/LockSettingsService;->migrateOldDataAfterSystemReady()V
+PLcom/android/server/locksettings/LockSettingsService;->notifyActivePasswordMetricsAvailable(Ljava/lang/String;I)V
+PLcom/android/server/locksettings/LockSettingsService;->onAuthTokenKnownForUser(ILcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;)V
+PLcom/android/server/locksettings/LockSettingsService;->onStartUser(I)V
+PLcom/android/server/locksettings/LockSettingsService;->onUnlockUser(I)V
+PLcom/android/server/locksettings/LockSettingsService;->registerStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
+PLcom/android/server/locksettings/LockSettingsService;->setBoolean(Ljava/lang/String;ZI)V
+PLcom/android/server/locksettings/LockSettingsService;->setRecoverySecretTypes([I)V
+PLcom/android/server/locksettings/LockSettingsService;->setServerParams([B)V
+PLcom/android/server/locksettings/LockSettingsService;->setSnapshotCreatedPendingIntent(Landroid/app/PendingIntent;)V
+PLcom/android/server/locksettings/LockSettingsService;->setStringUnchecked(Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/locksettings/LockSettingsService;->shouldCacheSpForUser(I)Z
+PLcom/android/server/locksettings/LockSettingsService;->spBasedDoVerifyCredential(Ljava/lang/String;IZJILcom/android/internal/widget/ICheckCredentialProgressCallback;)Lcom/android/internal/widget/VerifyCredentialResponse;
+PLcom/android/server/locksettings/LockSettingsService;->systemReady()V
+PLcom/android/server/locksettings/LockSettingsService;->tiedManagedProfileReadyToUnlock(Landroid/content/pm/UserInfo;)Z
+PLcom/android/server/locksettings/LockSettingsService;->tryRemoveUserFromSpCacheLater(I)V
+PLcom/android/server/locksettings/LockSettingsService;->unlockKeystore(Ljava/lang/String;I)V
+PLcom/android/server/locksettings/LockSettingsService;->unlockUser(I[B[B)V
+PLcom/android/server/locksettings/LockSettingsService;->userPresent(I)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;-><init>()V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;-><init>(Lcom/android/server/locksettings/LockSettingsStorage$1;)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;-><init>()V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;-><init>(Lcom/android/server/locksettings/LockSettingsStorage$1;)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->access$100(Lcom/android/server/locksettings/LockSettingsStorage$Cache;)I
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->contains(ILjava/lang/String;I)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->getVersion()I
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->hasFile(Ljava/lang/String;)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->hasKeyValue(Ljava/lang/String;I)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->isFetched(I)Z
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->peek(ILjava/lang/String;I)Ljava/lang/Object;
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->peekFile(Ljava/lang/String;)[B
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->peekKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->put(ILjava/lang/String;Ljava/lang/Object;I)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->putFileIfUnchanged(Ljava/lang/String;[BI)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->putIfUnchanged(ILjava/lang/String;Ljava/lang/Object;II)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->putKeyValue(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->putKeyValueIfUnchanged(Ljava/lang/String;Ljava/lang/Object;II)V
+PLcom/android/server/locksettings/LockSettingsStorage$Cache;->setFetched(I)V
+PLcom/android/server/locksettings/LockSettingsStorage$CredentialHash;-><init>([BII)V
+PLcom/android/server/locksettings/LockSettingsStorage$CredentialHash;-><init>([BIIZ)V
+PLcom/android/server/locksettings/LockSettingsStorage$CredentialHash;->createEmptyHash()Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
+PLcom/android/server/locksettings/LockSettingsStorage$DatabaseHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsStorage$DatabaseHelper;->setCallback(Lcom/android/server/locksettings/LockSettingsStorage$Callback;)V
+PLcom/android/server/locksettings/LockSettingsStorage;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsStorage;->access$500()Ljava/lang/Object;
+PLcom/android/server/locksettings/LockSettingsStorage;->deleteSyntheticPasswordState(IJLjava/lang/String;)V
+PLcom/android/server/locksettings/LockSettingsStorage;->getBaseZeroLockPatternFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLegacyLockPasswordFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLegacyLockPatternFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLockCredentialFilePathForUser(ILjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLockPasswordFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getLockPatternFilename(I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getSynthenticPasswordStateFilePathForUser(IJLjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->getSyntheticPasswordDirectoryForUser(I)Ljava/io/File;
+PLcom/android/server/locksettings/LockSettingsStorage;->prefetchUser(I)V
+PLcom/android/server/locksettings/LockSettingsStorage;->readCredentialHash(I)Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
+PLcom/android/server/locksettings/LockSettingsStorage;->readFile(Ljava/lang/String;)[B
+PLcom/android/server/locksettings/LockSettingsStorage;->readKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/locksettings/LockSettingsStorage;->readPasswordHashIfExists(I)Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
+PLcom/android/server/locksettings/LockSettingsStorage;->readPatternHashIfExists(I)Lcom/android/server/locksettings/LockSettingsStorage$CredentialHash;
+PLcom/android/server/locksettings/LockSettingsStorage;->readSyntheticPasswordState(IJLjava/lang/String;)[B
+PLcom/android/server/locksettings/LockSettingsStorage;->setDatabaseOnCreateCallback(Lcom/android/server/locksettings/LockSettingsStorage$Callback;)V
+PLcom/android/server/locksettings/LockSettingsStorage;->writeKeyValue(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/locksettings/LockSettingsStorage;->writeKeyValue(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth$1;-><init>(Lcom/android/server/locksettings/LockSettingsStrongAuth;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth$StrongAuthTimeoutAlarmListener;-><init>(Lcom/android/server/locksettings/LockSettingsStrongAuth;I)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->access$000(Lcom/android/server/locksettings/LockSettingsStrongAuth;Landroid/app/trust/IStrongAuthTracker;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->access$200(Lcom/android/server/locksettings/LockSettingsStrongAuth;II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->access$400(Lcom/android/server/locksettings/LockSettingsStrongAuth;I)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->handleAddStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->handleRequireStrongAuth(II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->handleRequireStrongAuthOneUser(II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->handleScheduleStrongAuthTimeout(I)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->notifyStrongAuthTrackers(II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->registerStrongAuthTracker(Landroid/app/trust/IStrongAuthTracker;)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->reportSuccessfulStrongAuthUnlock(I)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->reportUnlock(I)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->requireStrongAuth(II)V
+PLcom/android/server/locksettings/LockSettingsStrongAuth;->systemReady()V
+PLcom/android/server/locksettings/SyntheticPasswordCrypto;->decrypt(Ljavax/crypto/SecretKey;[B)[B
+PLcom/android/server/locksettings/SyntheticPasswordCrypto;->decrypt([B[B[B)[B
+PLcom/android/server/locksettings/SyntheticPasswordCrypto;->decryptBlob(Ljava/lang/String;[B[B)[B
+PLcom/android/server/locksettings/SyntheticPasswordCrypto;->personalisedHash([B[[B)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationResult;-><init>()V
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;-><init>()V
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->access$902(Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->deriveDiskEncryptionKey()[B
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->deriveGkPassword()[B
+PLcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;->deriveKeyStorePassword()Ljava/lang/String;
+PLcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;-><init>()V
+PLcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;->fromBytes([B)Lcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;
+PLcom/android/server/locksettings/SyntheticPasswordManager;-><init>(Landroid/content/Context;Lcom/android/server/locksettings/LockSettingsStorage;Landroid/os/UserManager;)V
+PLcom/android/server/locksettings/SyntheticPasswordManager;->access$000()[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->access$100()[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->access$200()[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->bytesToHex([B)Ljava/lang/String;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->computePasswordToken(Ljava/lang/String;Lcom/android/server/locksettings/SyntheticPasswordManager$PasswordData;)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->decryptSPBlob(Ljava/lang/String;[B[B)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->destroyEscrowData(I)V
+PLcom/android/server/locksettings/SyntheticPasswordManager;->destroyState(Ljava/lang/String;JI)V
+PLcom/android/server/locksettings/SyntheticPasswordManager;->fromByteArrayList(Ljava/util/ArrayList;)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->getCredentialType(JI)I
+PLcom/android/server/locksettings/SyntheticPasswordManager;->getHandleName(J)Ljava/lang/String;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->getPendingTokensForUser(I)Ljava/util/Set;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->getWeaverService()Landroid/hardware/weaver/V1_0/IWeaver;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->initWeaverService()V
+PLcom/android/server/locksettings/SyntheticPasswordManager;->isWeaverAvailable()Z
+PLcom/android/server/locksettings/SyntheticPasswordManager;->lambda$initWeaverService$0(Lcom/android/server/locksettings/SyntheticPasswordManager;ILandroid/hardware/weaver/V1_0/WeaverConfig;)V
+PLcom/android/server/locksettings/SyntheticPasswordManager;->lambda$weaverVerify$1([Lcom/android/internal/widget/VerifyCredentialResponse;IILandroid/hardware/weaver/V1_0/WeaverReadResponse;)V
+PLcom/android/server/locksettings/SyntheticPasswordManager;->loadState(Ljava/lang/String;JI)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->loadSyntheticPasswordHandle(I)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->loadWeaverSlot(JI)I
+PLcom/android/server/locksettings/SyntheticPasswordManager;->passwordTokenToWeaverKey([B)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->scrypt(Ljava/lang/String;[BIIII)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->toByteArrayList([B)Ljava/util/ArrayList;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->transformUnderWeaverSecret([B[B)[B
+PLcom/android/server/locksettings/SyntheticPasswordManager;->unwrapPasswordBasedSyntheticPassword(Landroid/service/gatekeeper/IGateKeeperService;JLjava/lang/String;ILcom/android/internal/widget/ICheckCredentialProgressCallback;)Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationResult;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->unwrapSyntheticPasswordBlob(JB[BJI)Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->verifyChallenge(Landroid/service/gatekeeper/IGateKeeperService;Lcom/android/server/locksettings/SyntheticPasswordManager$AuthenticationToken;JI)Lcom/android/internal/widget/VerifyCredentialResponse;
+PLcom/android/server/locksettings/SyntheticPasswordManager;->weaverVerify(I[B)Lcom/android/internal/widget/VerifyCredentialResponse;
+PLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl;-><init>(Ljava/security/KeyStore;)V
+PLcom/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl;->getAndLoadAndroidKeyStore()Ljava/security/KeyStore;
+PLcom/android/server/locksettings/recoverablekeystore/KeySyncTask;-><init>(Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;Lcom/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorage;IILjava/lang/String;ZLcom/android/server/locksettings/recoverablekeystore/PlatformKeyManager;Lcom/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper;Landroid/security/Scrypt;)V
+PLcom/android/server/locksettings/recoverablekeystore/KeySyncTask;->isCustomLockScreen()Z
+PLcom/android/server/locksettings/recoverablekeystore/KeySyncTask;->newInstance(Landroid/content/Context;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;Lcom/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorage;IILjava/lang/String;Z)Lcom/android/server/locksettings/recoverablekeystore/KeySyncTask;
+PLcom/android/server/locksettings/recoverablekeystore/KeySyncTask;->run()V
+PLcom/android/server/locksettings/recoverablekeystore/KeySyncTask;->shouldCreateSnapshot(I)Z
+PLcom/android/server/locksettings/recoverablekeystore/KeySyncTask;->syncKeys()V
+PLcom/android/server/locksettings/recoverablekeystore/KeySyncTask;->syncKeysForAgent(I)V
+PLcom/android/server/locksettings/recoverablekeystore/PlatformKeyManager;-><init>(Landroid/content/Context;Lcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;)V
+PLcom/android/server/locksettings/recoverablekeystore/PlatformKeyManager;->getAndLoadAndroidKeyStore()Ljava/security/KeyStore;
+PLcom/android/server/locksettings/recoverablekeystore/PlatformKeyManager;->getInstance(Landroid/content/Context;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;)Lcom/android/server/locksettings/recoverablekeystore/PlatformKeyManager;
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator;-><init>(Ljavax/crypto/KeyGenerator;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;)V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator;->newInstance(Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;)Lcom/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator;
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;-><init>(Landroid/content/Context;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorage;Ljava/util/concurrent/ExecutorService;Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;Lcom/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorage;Lcom/android/server/locksettings/recoverablekeystore/PlatformKeyManager;Lcom/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage;Lcom/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper;)V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->checkRecoverKeyStorePermission()V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->getAlias(IILjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->getInstance(Landroid/content/Context;Landroid/security/KeyStore;)Lcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->getKey(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->getRecoveryStatus()Ljava/util/Map;
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->initRecoveryService(Ljava/lang/String;[B)V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->initRecoveryServiceWithSigFile(Ljava/lang/String;[B[B)V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->lockScreenSecretAvailable(ILjava/lang/String;I)V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->setRecoverySecretTypes([I)V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->setServerParams([B)V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager;->setSnapshotCreatedPendingIntent(Landroid/app/PendingIntent;)V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorage;-><init>()V
+PLcom/android/server/locksettings/recoverablekeystore/RecoverySnapshotListenersStorage;->setSnapshotListener(ILandroid/app/PendingIntent;)V
+PLcom/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper;-><init>()V
+PLcom/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper;->getDefaultCertificateAliasIfEmpty(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper;->getRootCertificate(Ljava/lang/String;)Ljava/security/cert/X509Certificate;
+PLcom/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper;->isTestOnlyCertificateAlias(Ljava/lang/String;)Z
+PLcom/android/server/locksettings/recoverablekeystore/TestOnlyInsecureCertificateHelper;->isValidRootCertificateAlias(Ljava/lang/String;)Z
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->buildCertPath(Ljava/security/cert/PKIXParameters;)Ljava/security/cert/CertPath;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->buildPkixParams(Ljava/util/Date;Ljava/security/cert/X509Certificate;Ljava/util/List;Ljava/security/cert/X509Certificate;)Ljava/security/cert/PKIXParameters;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->decodeBase64(Ljava/lang/String;)[B
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->decodeCert(Ljava/io/InputStream;)Ljava/security/cert/X509Certificate;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->decodeCert([B)Ljava/security/cert/X509Certificate;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->getXmlNodeContents(ILorg/w3c/dom/Element;[Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->getXmlRootNode([B)Lorg/w3c/dom/Element;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->validateCert(Ljava/util/Date;Ljava/security/cert/X509Certificate;Ljava/util/List;Ljava/security/cert/X509Certificate;)Ljava/security/cert/CertPath;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertUtils;->verifyRsaSha256Signature(Ljava/security/PublicKey;[B[B)V
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertXml;-><init>(JJLjava/util/List;Ljava/util/List;)V
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertXml;->getSerial()J
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertXml;->parse([B)Lcom/android/server/locksettings/recoverablekeystore/certificate/CertXml;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertXml;->parseEndpointCerts(Lorg/w3c/dom/Element;)Ljava/util/List;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertXml;->parseIntermediateCerts(Lorg/w3c/dom/Element;)Ljava/util/List;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertXml;->parseRefreshInterval(Lorg/w3c/dom/Element;)J
+PLcom/android/server/locksettings/recoverablekeystore/certificate/CertXml;->parseSerial(Lorg/w3c/dom/Element;)J
+PLcom/android/server/locksettings/recoverablekeystore/certificate/SigXml;-><init>(Ljava/util/List;Ljava/security/cert/X509Certificate;[B)V
+PLcom/android/server/locksettings/recoverablekeystore/certificate/SigXml;->parse([B)Lcom/android/server/locksettings/recoverablekeystore/certificate/SigXml;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/SigXml;->parseFileSignature(Lorg/w3c/dom/Element;)[B
+PLcom/android/server/locksettings/recoverablekeystore/certificate/SigXml;->parseIntermediateCerts(Lorg/w3c/dom/Element;)Ljava/util/List;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/SigXml;->parseSignerCert(Lorg/w3c/dom/Element;)Ljava/security/cert/X509Certificate;
+PLcom/android/server/locksettings/recoverablekeystore/certificate/SigXml;->verifyFileSignature(Ljava/security/cert/X509Certificate;[B)V
+PLcom/android/server/locksettings/recoverablekeystore/certificate/SigXml;->verifyFileSignature(Ljava/security/cert/X509Certificate;[BLjava/util/Date;)V
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->deserialize(Ljava/io/InputStream;)Landroid/security/keystore/recovery/KeyChainSnapshot;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->deserializeInternal(Ljava/io/InputStream;)Landroid/security/keystore/recovery/KeyChainSnapshot;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readBlobTag(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)[B
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readCertPathTag(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/security/cert/CertPath;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readIntTag(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)I
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readKeyChainProtectionParams(Lorg/xmlpull/v1/XmlPullParser;)Landroid/security/keystore/recovery/KeyChainProtectionParams;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readKeyChainProtectionParamsList(Lorg/xmlpull/v1/XmlPullParser;)Ljava/util/List;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readKeyDerivationParams(Lorg/xmlpull/v1/XmlPullParser;)Landroid/security/keystore/recovery/KeyDerivationParams;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readLongTag(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)J
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readStringTag(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readText(Lorg/xmlpull/v1/XmlPullParser;)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readWrappedApplicationKey(Lorg/xmlpull/v1/XmlPullParser;)Landroid/security/keystore/recovery/WrappedApplicationKey;
+PLcom/android/server/locksettings/recoverablekeystore/serialization/KeyChainSnapshotDeserializer;->readWrappedApplicationKeys(Lorg/xmlpull/v1/XmlPullParser;)Ljava/util/List;
+PLcom/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage;-><init>(Lcom/android/server/locksettings/recoverablekeystore/KeyStoreProxy;Landroid/security/KeyStore;)V
+PLcom/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage;->getGrantAlias(IILjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage;->getInstance(Landroid/security/KeyStore;)Lcom/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage;
+PLcom/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage;->getInternalAlias(IILjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;-><init>(Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper;)V
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->ensureRecoveryServiceMetadataEntryExists(II)V
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getActiveRootOfTrust(II)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getBytes(IILjava/lang/String;)[B
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getLong(IILjava/lang/String;)Ljava/lang/Long;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getLong(IILjava/lang/String;Ljava/lang/String;)Ljava/lang/Long;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getRecoveryAgents(I)Ljava/util/List;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getRecoverySecretTypes(II)[I
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getRecoveryServiceCertSerial(IILjava/lang/String;)Ljava/lang/Long;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getServerParams(II)[B
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getShouldCreateSnapshot(II)Z
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getSnapshotVersion(II)Ljava/lang/Long;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->getStatusForAllKeys(I)Ljava/util/Map;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->newInstance(Landroid/content/Context;)Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb;->setActiveRootOfTrust(IILjava/lang/String;)J
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorage;-><init>()V
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;-><init>(Ljava/io/File;)V
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;->get(I)Landroid/security/keystore/recovery/KeyChainSnapshot;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;->getSnapshotFile(I)Ljava/io/File;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;->getSnapshotFileName(I)Ljava/lang/String;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;->getStorageFolder()Ljava/io/File;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;->newInstance()Lcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;
+PLcom/android/server/locksettings/recoverablekeystore/storage/RecoverySnapshotStorage;->readFromDisk(I)Landroid/security/keystore/recovery/KeyChainSnapshot;
+PLcom/android/server/media/-$$Lambda$MediaSessionService$za_9dlUSlnaiZw6eCdPVEZq0XLw;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/-$$Lambda$MediaSessionService$za_9dlUSlnaiZw6eCdPVEZq0XLw;->onAudioPlayerActiveStateChanged(Landroid/media/AudioPlaybackConfiguration;Z)V
+PLcom/android/server/media/AudioPlayerStateMonitor$MessageHandler;-><init>(Landroid/os/Looper;Lcom/android/server/media/AudioPlayerStateMonitor$OnAudioPlayerActiveStateChangedListener;)V
+PLcom/android/server/media/AudioPlayerStateMonitor$MessageHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/media/AudioPlayerStateMonitor$MessageHandler;->sendAudioPlayerActiveStateChangedMessage(Landroid/media/AudioPlaybackConfiguration;Z)V
+PLcom/android/server/media/AudioPlayerStateMonitor;-><init>()V
+PLcom/android/server/media/AudioPlayerStateMonitor;->getInstance()Lcom/android/server/media/AudioPlayerStateMonitor;
+PLcom/android/server/media/AudioPlayerStateMonitor;->getSortedAudioPlaybackClientUids()Landroid/util/IntArray;
+PLcom/android/server/media/AudioPlayerStateMonitor;->isPlaybackActive(I)Z
+PLcom/android/server/media/AudioPlayerStateMonitor;->registerListener(Lcom/android/server/media/AudioPlayerStateMonitor$OnAudioPlayerActiveStateChangedListener;Landroid/os/Handler;)V
+PLcom/android/server/media/AudioPlayerStateMonitor;->registerSelfIntoAudioServiceIfNeeded(Landroid/media/IAudioService;)V
+PLcom/android/server/media/AudioPlayerStateMonitor;->sendAudioPlayerActiveStateChangedMessageLocked(Landroid/media/AudioPlaybackConfiguration;Z)V
+PLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;-><init>(Lcom/android/server/media/MediaResourceMonitorService;)V
+PLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;->getPackageNamesFromPid(I)[Ljava/lang/String;
+PLcom/android/server/media/MediaResourceMonitorService$MediaResourceMonitorImpl;->notifyResourceGranted(II)V
+PLcom/android/server/media/MediaResourceMonitorService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/MediaResourceMonitorService;->access$000()Z
+PLcom/android/server/media/MediaResourceMonitorService;->onStart()V
+PLcom/android/server/media/MediaRouterService$1$1;-><init>(Lcom/android/server/media/MediaRouterService$1;)V
+PLcom/android/server/media/MediaRouterService$1$1;->run()V
+PLcom/android/server/media/MediaRouterService$1;-><init>(Lcom/android/server/media/MediaRouterService;)V
+PLcom/android/server/media/MediaRouterService$1;->onAudioPlayerActiveStateChanged(Landroid/media/AudioPlaybackConfiguration;Z)V
+PLcom/android/server/media/MediaRouterService$2;-><init>(Lcom/android/server/media/MediaRouterService;)V
+PLcom/android/server/media/MediaRouterService$3;-><init>(Lcom/android/server/media/MediaRouterService;)V
+PLcom/android/server/media/MediaRouterService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/media/MediaRouterService$ClientRecord;-><init>(Lcom/android/server/media/MediaRouterService;Lcom/android/server/media/MediaRouterService$UserRecord;Landroid/media/IMediaRouterClient;IILjava/lang/String;Z)V
+PLcom/android/server/media/MediaRouterService$ClientRecord;->binderDied()V
+PLcom/android/server/media/MediaRouterService$ClientRecord;->dispose()V
+PLcom/android/server/media/MediaRouterService$ClientRecord;->getState()Landroid/media/MediaRouterClientState;
+PLcom/android/server/media/MediaRouterService$MediaRouterServiceBroadcastReceiver;-><init>(Lcom/android/server/media/MediaRouterService;)V
+PLcom/android/server/media/MediaRouterService$MediaRouterServiceBroadcastReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/media/MediaRouterService$UserHandler$ProviderRecord;-><init>(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+PLcom/android/server/media/MediaRouterService$UserHandler$ProviderRecord;->appendClientState(Landroid/media/MediaRouterClientState;)V
+PLcom/android/server/media/MediaRouterService$UserHandler$ProviderRecord;->updateDescriptor(Landroid/media/RemoteDisplayState;)Z
+PLcom/android/server/media/MediaRouterService$UserHandler;-><init>(Lcom/android/server/media/MediaRouterService;Lcom/android/server/media/MediaRouterService$UserRecord;)V
+PLcom/android/server/media/MediaRouterService$UserHandler;->addProvider(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+PLcom/android/server/media/MediaRouterService$UserHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/media/MediaRouterService$UserHandler;->scheduleUpdateClientState()V
+PLcom/android/server/media/MediaRouterService$UserHandler;->start()V
+PLcom/android/server/media/MediaRouterService$UserHandler;->updateClientState()V
+PLcom/android/server/media/MediaRouterService$UserRecord;-><init>(Lcom/android/server/media/MediaRouterService;I)V
+PLcom/android/server/media/MediaRouterService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/MediaRouterService;->access$000(Lcom/android/server/media/MediaRouterService;)Landroid/util/IntArray;
+PLcom/android/server/media/MediaRouterService;->access$100(Lcom/android/server/media/MediaRouterService;)Landroid/util/IntArray;
+PLcom/android/server/media/MediaRouterService;->access$200(Lcom/android/server/media/MediaRouterService;)Landroid/os/Handler;
+PLcom/android/server/media/MediaRouterService;->access$300()Z
+PLcom/android/server/media/MediaRouterService;->access$400(Lcom/android/server/media/MediaRouterService;)Ljava/lang/Object;
+PLcom/android/server/media/MediaRouterService;->access$500(Lcom/android/server/media/MediaRouterService;)Landroid/content/Context;
+PLcom/android/server/media/MediaRouterService;->clientDied(Lcom/android/server/media/MediaRouterService$ClientRecord;)V
+PLcom/android/server/media/MediaRouterService;->disposeClientLocked(Lcom/android/server/media/MediaRouterService$ClientRecord;Z)V
+PLcom/android/server/media/MediaRouterService;->disposeUserIfNeededLocked(Lcom/android/server/media/MediaRouterService$UserRecord;)V
+PLcom/android/server/media/MediaRouterService;->getState(Landroid/media/IMediaRouterClient;)Landroid/media/MediaRouterClientState;
+PLcom/android/server/media/MediaRouterService;->getStateLocked(Landroid/media/IMediaRouterClient;)Landroid/media/MediaRouterClientState;
+PLcom/android/server/media/MediaRouterService;->initializeClientLocked(Lcom/android/server/media/MediaRouterService$ClientRecord;)V
+PLcom/android/server/media/MediaRouterService;->initializeUserLocked(Lcom/android/server/media/MediaRouterService$UserRecord;)V
+PLcom/android/server/media/MediaRouterService;->isPlaybackActive(Landroid/media/IMediaRouterClient;)Z
+PLcom/android/server/media/MediaRouterService;->monitor()V
+PLcom/android/server/media/MediaRouterService;->registerClientAsUser(Landroid/media/IMediaRouterClient;Ljava/lang/String;I)V
+PLcom/android/server/media/MediaRouterService;->registerClientLocked(Landroid/media/IMediaRouterClient;IILjava/lang/String;IZ)V
+PLcom/android/server/media/MediaRouterService;->restoreBluetoothA2dp()V
+PLcom/android/server/media/MediaRouterService;->restoreRoute(I)V
+PLcom/android/server/media/MediaRouterService;->setDiscoveryRequest(Landroid/media/IMediaRouterClient;IZ)V
+PLcom/android/server/media/MediaRouterService;->setDiscoveryRequestLocked(Landroid/media/IMediaRouterClient;IZ)V
+PLcom/android/server/media/MediaRouterService;->setSelectedRoute(Landroid/media/IMediaRouterClient;Ljava/lang/String;Z)V
+PLcom/android/server/media/MediaRouterService;->setSelectedRouteLocked(Landroid/media/IMediaRouterClient;Ljava/lang/String;Z)V
+PLcom/android/server/media/MediaRouterService;->switchUser()V
+PLcom/android/server/media/MediaRouterService;->systemRunning()V
+PLcom/android/server/media/MediaRouterService;->unregisterClientLocked(Landroid/media/IMediaRouterClient;Z)V
+PLcom/android/server/media/MediaRouterService;->validatePackageName(ILjava/lang/String;)Z
+PLcom/android/server/media/MediaSessionRecord$2;-><init>(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;-><init>(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getMetadata()Landroid/media/MediaMetadata;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getPackageName()Ljava/lang/String;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getPlaybackState()Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getQueue()Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->getVolumeAttributes()Landroid/media/session/ParcelableVolumeInfo;
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->registerCallbackListener(Ljava/lang/String;Landroid/media/session/ISessionControllerCallback;)V
+PLcom/android/server/media/MediaSessionRecord$ControllerStub;->unregisterCallbackListener(Landroid/media/session/ISessionControllerCallback;)V
+PLcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;-><init>(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/ISessionControllerCallback;Ljava/lang/String;I)V
+PLcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;->access$400(Lcom/android/server/media/MediaSessionRecord$ISessionControllerCallbackHolder;)Landroid/media/session/ISessionControllerCallback;
+PLcom/android/server/media/MediaSessionRecord$MessageHandler;-><init>(Lcom/android/server/media/MediaSessionRecord;Landroid/os/Looper;)V
+PLcom/android/server/media/MediaSessionRecord$MessageHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/media/MediaSessionRecord$MessageHandler;->post(I)V
+PLcom/android/server/media/MediaSessionRecord$MessageHandler;->post(ILjava/lang/Object;)V
+PLcom/android/server/media/MediaSessionRecord$SessionCb;-><init>(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/ISessionCallback;)V
+PLcom/android/server/media/MediaSessionRecord$SessionCb;->access$100(Lcom/android/server/media/MediaSessionRecord$SessionCb;)Landroid/media/session/ISessionCallback;
+PLcom/android/server/media/MediaSessionRecord$SessionStub;-><init>(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;-><init>(Lcom/android/server/media/MediaSessionRecord;Lcom/android/server/media/MediaSessionRecord$1;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->destroy()V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->getController()Landroid/media/session/ISessionController;
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setActive(Z)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setExtras(Landroid/os/Bundle;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setFlags(I)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setLaunchPendingIntent(Landroid/app/PendingIntent;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setMediaButtonReceiver(Landroid/app/PendingIntent;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setPlaybackState(Landroid/media/session/PlaybackState;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setPlaybackToLocal(Landroid/media/AudioAttributes;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setQueue(Landroid/content/pm/ParceledListSlice;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setQueueTitle(Ljava/lang/CharSequence;)V
+PLcom/android/server/media/MediaSessionRecord$SessionStub;->setRatingType(I)V
+PLcom/android/server/media/MediaSessionRecord;-><init>(IIILjava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;Lcom/android/server/media/MediaSessionService;Landroid/os/Looper;)V
+PLcom/android/server/media/MediaSessionRecord;->access$1000(Lcom/android/server/media/MediaSessionRecord;)Lcom/android/server/media/MediaSessionRecord$ControllerStub;
+PLcom/android/server/media/MediaSessionRecord;->access$1102(Lcom/android/server/media/MediaSessionRecord;Z)Z
+PLcom/android/server/media/MediaSessionRecord;->access$1202(Lcom/android/server/media/MediaSessionRecord;J)J
+PLcom/android/server/media/MediaSessionRecord;->access$1302(Lcom/android/server/media/MediaSessionRecord;Landroid/app/PendingIntent;)Landroid/app/PendingIntent;
+PLcom/android/server/media/MediaSessionRecord;->access$1402(Lcom/android/server/media/MediaSessionRecord;Landroid/app/PendingIntent;)Landroid/app/PendingIntent;
+PLcom/android/server/media/MediaSessionRecord;->access$1500(Lcom/android/server/media/MediaSessionRecord;)Ljava/lang/Object;
+PLcom/android/server/media/MediaSessionRecord;->access$1600(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/MediaMetadata;
+PLcom/android/server/media/MediaSessionRecord;->access$1700(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord;->access$1702(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/PlaybackState;)Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord;->access$1800(Lcom/android/server/media/MediaSessionRecord;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/media/MediaSessionRecord;->access$1802(Lcom/android/server/media/MediaSessionRecord;Landroid/content/pm/ParceledListSlice;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/media/MediaSessionRecord;->access$1902(Lcom/android/server/media/MediaSessionRecord;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
+PLcom/android/server/media/MediaSessionRecord;->access$2002(Lcom/android/server/media/MediaSessionRecord;Landroid/os/Bundle;)Landroid/os/Bundle;
+PLcom/android/server/media/MediaSessionRecord;->access$2102(Lcom/android/server/media/MediaSessionRecord;I)I
+PLcom/android/server/media/MediaSessionRecord;->access$2200(Lcom/android/server/media/MediaSessionRecord;)I
+PLcom/android/server/media/MediaSessionRecord;->access$2202(Lcom/android/server/media/MediaSessionRecord;I)I
+PLcom/android/server/media/MediaSessionRecord;->access$2300(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/AudioAttributes;
+PLcom/android/server/media/MediaSessionRecord;->access$2302(Lcom/android/server/media/MediaSessionRecord;Landroid/media/AudioAttributes;)Landroid/media/AudioAttributes;
+PLcom/android/server/media/MediaSessionRecord;->access$2800(Lcom/android/server/media/MediaSessionRecord;)Z
+PLcom/android/server/media/MediaSessionRecord;->access$2900(Lcom/android/server/media/MediaSessionRecord;Landroid/media/session/ISessionControllerCallback;)I
+PLcom/android/server/media/MediaSessionRecord;->access$3000(Lcom/android/server/media/MediaSessionRecord;)Ljava/util/ArrayList;
+PLcom/android/server/media/MediaSessionRecord;->access$3100()Z
+PLcom/android/server/media/MediaSessionRecord;->access$3200(Lcom/android/server/media/MediaSessionRecord;)Ljava/lang/String;
+PLcom/android/server/media/MediaSessionRecord;->access$3400(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/AudioManager;
+PLcom/android/server/media/MediaSessionRecord;->access$3600(Lcom/android/server/media/MediaSessionRecord;)Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord;->access$3800(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->access$3900(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->access$4000(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->access$4100(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->access$4300(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionRecord;->access$800(Lcom/android/server/media/MediaSessionRecord;)Lcom/android/server/media/MediaSessionService;
+PLcom/android/server/media/MediaSessionRecord;->access$900(Lcom/android/server/media/MediaSessionRecord;)Lcom/android/server/media/MediaSessionRecord$MessageHandler;
+PLcom/android/server/media/MediaSessionRecord;->binderDied()V
+PLcom/android/server/media/MediaSessionRecord;->getCallback()Landroid/media/session/ISessionCallback;
+PLcom/android/server/media/MediaSessionRecord;->getControllerBinder()Landroid/media/session/ISessionController;
+PLcom/android/server/media/MediaSessionRecord;->getControllerHolderIndexForCb(Landroid/media/session/ISessionControllerCallback;)I
+PLcom/android/server/media/MediaSessionRecord;->getFlags()J
+PLcom/android/server/media/MediaSessionRecord;->getPlaybackType()I
+PLcom/android/server/media/MediaSessionRecord;->getSessionBinder()Landroid/media/session/ISession;
+PLcom/android/server/media/MediaSessionRecord;->getStateWithUpdatedPosition()Landroid/media/session/PlaybackState;
+PLcom/android/server/media/MediaSessionRecord;->getUserId()I
+PLcom/android/server/media/MediaSessionRecord;->isActive()Z
+PLcom/android/server/media/MediaSessionRecord;->isPlaybackActive()Z
+PLcom/android/server/media/MediaSessionRecord;->onDestroy()V
+PLcom/android/server/media/MediaSessionRecord;->pushExtrasUpdate()V
+PLcom/android/server/media/MediaSessionRecord;->pushPlaybackStateUpdate()V
+PLcom/android/server/media/MediaSessionRecord;->pushQueueTitleUpdate()V
+PLcom/android/server/media/MediaSessionRecord;->pushQueueUpdate()V
+PLcom/android/server/media/MediaSessionRecord;->pushSessionDestroyed()V
+PLcom/android/server/media/MediaSessionRecord;->toString()Ljava/lang/String;
+PLcom/android/server/media/MediaSessionService$1;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/media/MediaSessionService$FullUserRecord;-><init>(Lcom/android/server/media/MediaSessionService;I)V
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->access$200(Lcom/android/server/media/MediaSessionService$FullUserRecord;)V
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->access$300(Lcom/android/server/media/MediaSessionService$FullUserRecord;)Lcom/android/server/media/MediaSessionStack;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->access$3100(Lcom/android/server/media/MediaSessionService$FullUserRecord;)Landroid/media/session/ICallback;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->access$3102(Lcom/android/server/media/MediaSessionService$FullUserRecord;Landroid/media/session/ICallback;)Landroid/media/session/ICallback;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->access$400(Lcom/android/server/media/MediaSessionService$FullUserRecord;)I
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->getMediaButtonSessionLocked()Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService$FullUserRecord;->pushAddressedPlayerChangedLocked()V
+PLcom/android/server/media/MediaSessionService$MessageHandler;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService$MessageHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/media/MediaSessionService$MessageHandler;->postSessionsChanged(I)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl$1;-><init>(Lcom/android/server/media/MediaSessionService$SessionManagerImpl;Lcom/android/server/media/MediaSessionService$FullUserRecord;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl$5;-><init>(Lcom/android/server/media/MediaSessionService$SessionManagerImpl;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl$KeyEventWakeLockReceiver;-><init>(Lcom/android/server/media/MediaSessionService$SessionManagerImpl;Landroid/os/Handler;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->addSessionsListener(Landroid/media/session/IActiveSessionsListener;Landroid/content/ComponentName;I)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->createSession(Ljava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;I)Landroid/media/session/ISession;
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->removeSessionsListener(Landroid/media/session/IActiveSessionsListener;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->setCallback(Landroid/media/session/ICallback;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->setRemoteVolumeController(Landroid/media/IRemoteVolumeController;)V
+PLcom/android/server/media/MediaSessionService$SessionManagerImpl;->verifySessionsRequest(Landroid/content/ComponentName;III)I
+PLcom/android/server/media/MediaSessionService$SessionsListenerRecord;-><init>(Lcom/android/server/media/MediaSessionService;Landroid/media/session/IActiveSessionsListener;Landroid/content/ComponentName;III)V
+PLcom/android/server/media/MediaSessionService$SessionsListenerRecord;->access$800(Lcom/android/server/media/MediaSessionService$SessionsListenerRecord;)I
+PLcom/android/server/media/MediaSessionService$SessionsListenerRecord;->access$900(Lcom/android/server/media/MediaSessionService$SessionsListenerRecord;)Landroid/media/session/IActiveSessionsListener;
+PLcom/android/server/media/MediaSessionService$SettingsObserver;-><init>(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService$SettingsObserver;-><init>(Lcom/android/server/media/MediaSessionService;Lcom/android/server/media/MediaSessionService$1;)V
+PLcom/android/server/media/MediaSessionService$SettingsObserver;->access$100(Lcom/android/server/media/MediaSessionService$SettingsObserver;)V
+PLcom/android/server/media/MediaSessionService$SettingsObserver;->observe()V
+PLcom/android/server/media/MediaSessionService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/MediaSessionService;->access$1000(Lcom/android/server/media/MediaSessionService;)V
+PLcom/android/server/media/MediaSessionService;->access$1200(Lcom/android/server/media/MediaSessionService;)Lcom/android/server/media/AudioPlayerStateMonitor;
+PLcom/android/server/media/MediaSessionService;->access$1300(Lcom/android/server/media/MediaSessionService;)Landroid/content/ContentResolver;
+PLcom/android/server/media/MediaSessionService;->access$1600(Lcom/android/server/media/MediaSessionService;I)Ljava/lang/String;
+PLcom/android/server/media/MediaSessionService;->access$1700(Lcom/android/server/media/MediaSessionService;)Ljava/lang/Object;
+PLcom/android/server/media/MediaSessionService;->access$1800(Lcom/android/server/media/MediaSessionService;)Lcom/android/server/media/MediaSessionService$MessageHandler;
+PLcom/android/server/media/MediaSessionService;->access$1900(Lcom/android/server/media/MediaSessionService;)Lcom/android/server/media/MediaSessionService$FullUserRecord;
+PLcom/android/server/media/MediaSessionService;->access$2000(Lcom/android/server/media/MediaSessionService;)Z
+PLcom/android/server/media/MediaSessionService;->access$2200(Lcom/android/server/media/MediaSessionService;)Ljava/util/ArrayList;
+PLcom/android/server/media/MediaSessionService;->access$2400(Lcom/android/server/media/MediaSessionService;Ljava/lang/String;I)V
+PLcom/android/server/media/MediaSessionService;->access$2500(Lcom/android/server/media/MediaSessionService;IIILjava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService;->access$2600(Lcom/android/server/media/MediaSessionService;I)Ljava/util/List;
+PLcom/android/server/media/MediaSessionService;->access$2700(Lcom/android/server/media/MediaSessionService;Landroid/media/session/IActiveSessionsListener;)I
+PLcom/android/server/media/MediaSessionService;->access$3000(Lcom/android/server/media/MediaSessionService;I)Lcom/android/server/media/MediaSessionService$FullUserRecord;
+PLcom/android/server/media/MediaSessionService;->access$3900(Lcom/android/server/media/MediaSessionService;Ljava/lang/String;II)V
+PLcom/android/server/media/MediaSessionService;->access$4002(Lcom/android/server/media/MediaSessionService;Landroid/media/IRemoteVolumeController;)Landroid/media/IRemoteVolumeController;
+PLcom/android/server/media/MediaSessionService;->access$4700(Lcom/android/server/media/MediaSessionService;Landroid/content/ComponentName;III)V
+PLcom/android/server/media/MediaSessionService;->access$6200(Lcom/android/server/media/MediaSessionService;I)V
+PLcom/android/server/media/MediaSessionService;->buildMediaSessionService2List()V
+PLcom/android/server/media/MediaSessionService;->createSessionInternal(IIILjava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService;->createSessionLocked(IIILjava/lang/String;Landroid/media/session/ISessionCallback;Ljava/lang/String;)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionService;->destroySession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->destroySessionLocked(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->enforceMediaPermissions(Landroid/content/ComponentName;III)V
+PLcom/android/server/media/MediaSessionService;->enforcePackageName(Ljava/lang/String;I)V
+PLcom/android/server/media/MediaSessionService;->enforcePhoneStatePermission(II)V
+PLcom/android/server/media/MediaSessionService;->enforceSystemUiPermission(Ljava/lang/String;II)V
+PLcom/android/server/media/MediaSessionService;->findIndexOfSessionsListenerLocked(Landroid/media/session/IActiveSessionsListener;)I
+PLcom/android/server/media/MediaSessionService;->getActiveSessionsLocked(I)Ljava/util/List;
+PLcom/android/server/media/MediaSessionService;->getAudioService()Landroid/media/IAudioService;
+PLcom/android/server/media/MediaSessionService;->getCallingPackageName(I)Ljava/lang/String;
+PLcom/android/server/media/MediaSessionService;->getFullUserRecordLocked(I)Lcom/android/server/media/MediaSessionService$FullUserRecord;
+PLcom/android/server/media/MediaSessionService;->isCurrentVolumeController(II)Z
+PLcom/android/server/media/MediaSessionService;->isGlobalPriorityActiveLocked()Z
+PLcom/android/server/media/MediaSessionService;->lambda$onStart$0(Lcom/android/server/media/MediaSessionService;Landroid/media/AudioPlaybackConfiguration;Z)V
+PLcom/android/server/media/MediaSessionService;->monitor()V
+PLcom/android/server/media/MediaSessionService;->onMediaButtonReceiverChanged(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->onSessionPlaystateChanged(Lcom/android/server/media/MediaSessionRecord;II)V
+PLcom/android/server/media/MediaSessionService;->onStart()V
+PLcom/android/server/media/MediaSessionService;->onStartUser(I)V
+PLcom/android/server/media/MediaSessionService;->pushRemoteVolumeUpdateLocked(I)V
+PLcom/android/server/media/MediaSessionService;->pushSessionsChanged(I)V
+PLcom/android/server/media/MediaSessionService;->registerPackageBroadcastReceivers()V
+PLcom/android/server/media/MediaSessionService;->sessionDied(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->setGlobalPrioritySession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->updateSession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionService;->updateUser()V
+PLcom/android/server/media/MediaSessionStack;-><init>(Lcom/android/server/media/AudioPlayerStateMonitor;Lcom/android/server/media/MediaSessionStack$OnMediaButtonSessionChangedListener;)V
+PLcom/android/server/media/MediaSessionStack;->addSession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionStack;->clearCache(I)V
+PLcom/android/server/media/MediaSessionStack;->contains(Lcom/android/server/media/MediaSessionRecord;)Z
+PLcom/android/server/media/MediaSessionStack;->containsState(I[I)Z
+PLcom/android/server/media/MediaSessionStack;->findMediaButtonSession(I)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionStack;->getActiveSessions(I)Ljava/util/ArrayList;
+PLcom/android/server/media/MediaSessionStack;->getDefaultRemoteSession(I)Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionStack;->getMediaButtonSession()Lcom/android/server/media/MediaSessionRecord;
+PLcom/android/server/media/MediaSessionStack;->getPriorityList(ZI)Ljava/util/ArrayList;
+PLcom/android/server/media/MediaSessionStack;->onPlaystateChanged(Lcom/android/server/media/MediaSessionRecord;II)V
+PLcom/android/server/media/MediaSessionStack;->onSessionStateChange(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionStack;->removeSession(Lcom/android/server/media/MediaSessionRecord;)V
+PLcom/android/server/media/MediaSessionStack;->shouldUpdatePriority(II)Z
+PLcom/android/server/media/MediaSessionStack;->updateMediaButtonSessionIfNeeded()V
+PLcom/android/server/media/MediaUpdateService$1;-><init>(Lcom/android/server/media/MediaUpdateService;)V
+PLcom/android/server/media/MediaUpdateService$2;-><init>(Lcom/android/server/media/MediaUpdateService;)V
+PLcom/android/server/media/MediaUpdateService$2;->run()V
+PLcom/android/server/media/MediaUpdateService$3;-><init>(Lcom/android/server/media/MediaUpdateService;)V
+PLcom/android/server/media/MediaUpdateService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/MediaUpdateService;->access$200(Lcom/android/server/media/MediaUpdateService;)V
+PLcom/android/server/media/MediaUpdateService;->connect()V
+PLcom/android/server/media/MediaUpdateService;->loadExtractorPlugins(Ljava/lang/String;)V
+PLcom/android/server/media/MediaUpdateService;->onStart()V
+PLcom/android/server/media/MediaUpdateService;->packageStateChanged()V
+PLcom/android/server/media/MediaUpdateService;->registerBroadcastReceiver()V
+PLcom/android/server/media/RemoteDisplayProviderProxy$1;-><init>(Lcom/android/server/media/RemoteDisplayProviderProxy;)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;-><init>(Landroid/content/Context;Landroid/content/ComponentName;I)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->getDisplayState()Landroid/media/RemoteDisplayState;
+PLcom/android/server/media/RemoteDisplayProviderProxy;->getFlattenedComponentName()Ljava/lang/String;
+PLcom/android/server/media/RemoteDisplayProviderProxy;->hasComponentName(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/media/RemoteDisplayProviderProxy;->rebindIfDisconnected()V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->setCallback(Lcom/android/server/media/RemoteDisplayProviderProxy$Callback;)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->setDiscoveryMode(I)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->setSelectedDisplay(Ljava/lang/String;)V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->shouldBind()Z
+PLcom/android/server/media/RemoteDisplayProviderProxy;->start()V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->unbind()V
+PLcom/android/server/media/RemoteDisplayProviderProxy;->updateBinding()V
+PLcom/android/server/media/RemoteDisplayProviderWatcher$1;-><init>(Lcom/android/server/media/RemoteDisplayProviderWatcher;)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher$2;-><init>(Lcom/android/server/media/RemoteDisplayProviderWatcher;)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher$2;->run()V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;-><init>(Landroid/content/Context;Lcom/android/server/media/RemoteDisplayProviderWatcher$Callback;Landroid/os/Handler;I)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->access$000()Z
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->access$100(Lcom/android/server/media/RemoteDisplayProviderWatcher;)V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->findProvider(Ljava/lang/String;Ljava/lang/String;)I
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->hasCaptureVideoPermission(Ljava/lang/String;)Z
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->scanPackages()V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->start()V
+PLcom/android/server/media/RemoteDisplayProviderWatcher;->verifyServiceTrusted(Landroid/content/pm/ServiceInfo;)Z
+PLcom/android/server/media/projection/MediaProjectionManagerService$1;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$BinderService;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$BinderService;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;Lcom/android/server/media/projection/MediaProjectionManagerService$1;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$BinderService;->addCallback(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$BinderService;->getActiveProjectionInfo()Landroid/media/projection/MediaProjectionInfo;
+PLcom/android/server/media/projection/MediaProjectionManagerService$CallbackDelegate;-><init>()V
+PLcom/android/server/media/projection/MediaProjectionManagerService$CallbackDelegate;->add(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$MediaRouterCallback;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService$MediaRouterCallback;-><init>(Lcom/android/server/media/projection/MediaProjectionManagerService;Lcom/android/server/media/projection/MediaProjectionManagerService$1;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->access$400(Lcom/android/server/media/projection/MediaProjectionManagerService;)Landroid/content/Context;
+PLcom/android/server/media/projection/MediaProjectionManagerService;->access$600(Lcom/android/server/media/projection/MediaProjectionManagerService;)Landroid/media/projection/MediaProjectionInfo;
+PLcom/android/server/media/projection/MediaProjectionManagerService;->access$800(Lcom/android/server/media/projection/MediaProjectionManagerService;Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->addCallback(Landroid/media/projection/IMediaProjectionWatcherCallback;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->getActiveProjectionInfo()Landroid/media/projection/MediaProjectionInfo;
+PLcom/android/server/media/projection/MediaProjectionManagerService;->linkDeathRecipientLocked(Landroid/media/projection/IMediaProjectionWatcherCallback;Landroid/os/IBinder$DeathRecipient;)V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->monitor()V
+PLcom/android/server/media/projection/MediaProjectionManagerService;->onStart()V
+PLcom/android/server/midi/MidiService$1;-><init>(Lcom/android/server/midi/MidiService;)V
+PLcom/android/server/midi/MidiService$1;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/midi/MidiService$1;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/midi/MidiService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/midi/MidiService$Lifecycle;->onStart()V
+PLcom/android/server/midi/MidiService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/midi/MidiService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/midi/MidiService;->access$000(Lcom/android/server/midi/MidiService;)V
+PLcom/android/server/midi/MidiService;->access$100(Lcom/android/server/midi/MidiService;Ljava/lang/String;)V
+PLcom/android/server/midi/MidiService;->access$200(Lcom/android/server/midi/MidiService;Ljava/lang/String;)V
+PLcom/android/server/midi/MidiService;->addPackageDeviceServer(Landroid/content/pm/ServiceInfo;)V
+PLcom/android/server/midi/MidiService;->addPackageDeviceServers(Ljava/lang/String;)V
+PLcom/android/server/midi/MidiService;->onUnlockUser()V
+PLcom/android/server/midi/MidiService;->removePackageDeviceServers(Ljava/lang/String;)V
+PLcom/android/server/net/-$$Lambda$NetworkPolicyManagerService$HDTUqowtgL-W_V0Kq6psXLWC9ws;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/net/-$$Lambda$NetworkPolicyManagerService$HDTUqowtgL-W_V0Kq6psXLWC9ws;->run()V
+PLcom/android/server/net/DelayedDiskWrite;-><init>()V
+PLcom/android/server/net/IpConfigStore;-><init>()V
+PLcom/android/server/net/IpConfigStore;-><init>(Lcom/android/server/net/DelayedDiskWrite;)V
+PLcom/android/server/net/IpConfigStore;->loge(Ljava/lang/String;)V
+PLcom/android/server/net/IpConfigStore;->readIpConfigurations(Ljava/lang/String;)Landroid/util/ArrayMap;
+PLcom/android/server/net/LockdownVpnTracker;->isEnabled()Z
+PLcom/android/server/net/NetworkIdentitySet;-><init>()V
+PLcom/android/server/net/NetworkIdentitySet;-><init>(Ljava/io/DataInputStream;)V
+PLcom/android/server/net/NetworkIdentitySet;->readOptionalString(Ljava/io/DataInputStream;)Ljava/lang/String;
+PLcom/android/server/net/NetworkIdentitySet;->writeOptionalString(Ljava/io/DataOutputStream;Ljava/lang/String;)V
+PLcom/android/server/net/NetworkIdentitySet;->writeToStream(Ljava/io/DataOutputStream;)V
+PLcom/android/server/net/NetworkPolicyLogger$Data;-><init>()V
+PLcom/android/server/net/NetworkPolicyLogger$LogBuffer;-><init>(I)V
+PLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->appIdleStateChanged(IZ)V
+PLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->deviceIdleModeEnabled(Z)V
+PLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->event(Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->firewallChainEnabled(IZ)V
+PLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->meterednessChanged(IZ)V
+PLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->paroleStateChanged(Z)V
+PLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->tempPowerSaveWlChanged(IZ)V
+PLcom/android/server/net/NetworkPolicyLogger;-><init>()V
+PLcom/android/server/net/NetworkPolicyLogger;->appIdleStateChanged(IZ)V
+PLcom/android/server/net/NetworkPolicyLogger;->deviceIdleModeEnabled(Z)V
+PLcom/android/server/net/NetworkPolicyLogger;->firewallChainEnabled(IZ)V
+PLcom/android/server/net/NetworkPolicyLogger;->firewallRulesChanged(I[I[I)V
+PLcom/android/server/net/NetworkPolicyLogger;->getFirewallChainName(I)Ljava/lang/String;
+PLcom/android/server/net/NetworkPolicyLogger;->meteredRestrictedPkgsChanged(Ljava/util/Set;)V
+PLcom/android/server/net/NetworkPolicyLogger;->meterednessChanged(IZ)V
+PLcom/android/server/net/NetworkPolicyLogger;->paroleStateChanged(Z)V
+PLcom/android/server/net/NetworkPolicyLogger;->tempPowerSaveWlChanged(IZ)V
+PLcom/android/server/net/NetworkPolicyLogger;->uidFirewallRuleChanged(III)V
+PLcom/android/server/net/NetworkPolicyManagerInternal;-><init>()V
+PLcom/android/server/net/NetworkPolicyManagerService$10;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$11;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$12;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$12;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$13;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$13;->onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V
+PLcom/android/server/net/NetworkPolicyManagerService$14;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$14;->limitReached(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerService$15;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$15;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$16;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$16;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$17;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$18;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$1;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$2;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$3;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;Landroid/os/Looper;)V
+PLcom/android/server/net/NetworkPolicyManagerService$3;->onSubscriptionsChanged()V
+PLcom/android/server/net/NetworkPolicyManagerService$4;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$4;->onUidGone(IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService$5;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$6;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$7;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$8;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$9;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$9;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService$1;)V
+PLcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+PLcom/android/server/net/NetworkPolicyManagerService$AppIdleStateChangeListener;->onParoleStateChanged(Z)V
+PLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;-><init>(Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService$1;)V
+PLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->getSubscriptionPlan(Landroid/net/NetworkTemplate;)Landroid/telephony/SubscriptionPlan;
+PLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->onAdminDataAvailable()V
+PLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->onTempPowerSaveWhitelistChange(IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->setMeteredRestrictedPackagesAsync(Ljava/util/Set;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;-><init>(Landroid/content/Context;Landroid/app/IActivityManager;Landroid/os/INetworkManagementService;)V
+PLcom/android/server/net/NetworkPolicyManagerService;-><init>(Landroid/content/Context;Landroid/app/IActivityManager;Landroid/os/INetworkManagementService;Landroid/content/pm/IPackageManager;Ljava/time/Clock;Ljava/io/File;Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1100(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1200(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/content/Context;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1300(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1400(Landroid/util/SparseBooleanArray;ZLandroid/net/Network;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1500(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1600(Lcom/android/server/net/NetworkPolicyManagerService;)Lcom/android/server/net/NetworkPolicyLogger;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1700(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1800(Lcom/android/server/net/NetworkPolicyManagerService;ILjava/lang/String;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->access$1900(Lcom/android/server/net/NetworkPolicyManagerService;ILjava/lang/String;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->access$2000(Lcom/android/server/net/NetworkPolicyManagerService;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->access$2300(Lcom/android/server/net/NetworkPolicyManagerService;Landroid/net/INetworkPolicyListener;[Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->access$2500(Lcom/android/server/net/NetworkPolicyManagerService;)Lcom/android/server/net/NetworkStatsManagerInternal;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$3300(Lcom/android/server/net/NetworkPolicyManagerService;Ljava/util/Set;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->access$3400(Lcom/android/server/net/NetworkPolicyManagerService;Landroid/net/NetworkTemplate;Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->access$3700(Lcom/android/server/net/NetworkPolicyManagerService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$3800(Lcom/android/server/net/NetworkPolicyManagerService;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->access$400(Lcom/android/server/net/NetworkPolicyManagerService;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->access$4000(Lcom/android/server/net/NetworkPolicyManagerService;I)Landroid/telephony/SubscriptionPlan;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$4100(Lcom/android/server/net/NetworkPolicyManagerService;Landroid/net/NetworkTemplate;)I
+PLcom/android/server/net/NetworkPolicyManagerService;->access$4200(Lcom/android/server/net/NetworkPolicyManagerService;)Ljava/util/concurrent/CountDownLatch;
+PLcom/android/server/net/NetworkPolicyManagerService;->access$500()Z
+PLcom/android/server/net/NetworkPolicyManagerService;->access$600(Lcom/android/server/net/NetworkPolicyManagerService;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->addDefaultRestrictBackgroundWhitelistUidsUL()Z
+PLcom/android/server/net/NetworkPolicyManagerService;->addDefaultRestrictBackgroundWhitelistUidsUL(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->bindConnectivityManager(Landroid/net/IConnectivityManager;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->defeatNullable([Landroid/net/NetworkState;)[Landroid/net/NetworkState;
+PLcom/android/server/net/NetworkPolicyManagerService;->dispatchMeteredIfacesChanged(Landroid/net/INetworkPolicyListener;[Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->enableFirewallChainUL(IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService;->enforceSubscriptionPlanAccess(IILjava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->ensureActiveMobilePolicyAL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->ensureActiveMobilePolicyAL(ILjava/lang/String;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->findRelevantSubIdNL(Landroid/net/NetworkTemplate;)I
+PLcom/android/server/net/NetworkPolicyManagerService;->getBooleanDefeatingNullable(Landroid/os/PersistableBundle;Ljava/lang/String;Z)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->getCycleDayFromCarrierConfig(Landroid/os/PersistableBundle;I)I
+PLcom/android/server/net/NetworkPolicyManagerService;->getDefaultClock()Ljava/time/Clock;
+PLcom/android/server/net/NetworkPolicyManagerService;->getDefaultSystemDir()Ljava/io/File;
+PLcom/android/server/net/NetworkPolicyManagerService;->getLimitBytesFromCarrierConfig(Landroid/os/PersistableBundle;J)J
+PLcom/android/server/net/NetworkPolicyManagerService;->getNetworkPolicies(Ljava/lang/String;)[Landroid/net/NetworkPolicy;
+PLcom/android/server/net/NetworkPolicyManagerService;->getNetworkTotalBytes(Landroid/net/NetworkTemplate;JJ)J
+PLcom/android/server/net/NetworkPolicyManagerService;->getPlatformDefaultLimitBytes()J
+PLcom/android/server/net/NetworkPolicyManagerService;->getPlatformDefaultWarningBytes()J
+PLcom/android/server/net/NetworkPolicyManagerService;->getPrimarySubscriptionPlanLocked(I)Landroid/telephony/SubscriptionPlan;
+PLcom/android/server/net/NetworkPolicyManagerService;->getRestrictBackground()Z
+PLcom/android/server/net/NetworkPolicyManagerService;->getSubIdLocked(Landroid/net/Network;)I
+PLcom/android/server/net/NetworkPolicyManagerService;->getSubscriptionPlans(ILjava/lang/String;)[Landroid/telephony/SubscriptionPlan;
+PLcom/android/server/net/NetworkPolicyManagerService;->getTotalBytes(Landroid/net/NetworkTemplate;JJ)J
+PLcom/android/server/net/NetworkPolicyManagerService;->getUidPolicy(I)I
+PLcom/android/server/net/NetworkPolicyManagerService;->getWarningBytesFromCarrierConfig(Landroid/os/PersistableBundle;J)J
+PLcom/android/server/net/NetworkPolicyManagerService;->handleNetworkPoliciesUpdateAL(Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->handleRestrictedPackagesChangeUL(Ljava/util/Set;Ljava/util/Set;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->handleUidGone(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->initService(Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->isBandwidthControlEnabled()Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isRestrictedByAdminUL(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isUidForegroundOnRestrictBackgroundUL(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForWhitelistRules(I)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->lambda$networkScoreAndNetworkManagementServiceReady$0(Lcom/android/server/net/NetworkPolicyManagerService;Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->maybeUpdateMobilePolicyCycleAL(ILjava/lang/String;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->networkScoreAndNetworkManagementServiceReady()Ljava/util/concurrent/CountDownLatch;
+PLcom/android/server/net/NetworkPolicyManagerService;->normalizePoliciesNL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->normalizePoliciesNL([Landroid/net/NetworkPolicy;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->notifyUnderLimitNL(Landroid/net/NetworkTemplate;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->onTetheringChanged(Ljava/lang/String;Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->parseSubId(Landroid/net/NetworkState;)I
+PLcom/android/server/net/NetworkPolicyManagerService;->readPolicyAL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->registerListener(Landroid/net/INetworkPolicyListener;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->removeUidStateUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setDeviceIdleMode(Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setMeteredNetworkWhitelist(IZ)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setMeteredRestrictedPackagesInternal(Ljava/util/Set;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setNetworkTemplateEnabled(Landroid/net/NetworkTemplate;Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setNetworkTemplateEnabledInner(Landroid/net/NetworkTemplate;Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setRestrictBackgroundUL(Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setSubscriptionPlans(I[Landroid/telephony/SubscriptionPlan;Ljava/lang/String;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRule(III)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRulesUL(ILandroid/util/SparseIntArray;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRulesUL(ILandroid/util/SparseIntArray;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->setUidPolicyUncheckedUL(IIZ)V
+PLcom/android/server/net/NetworkPolicyManagerService;->systemReady(Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->unregisterListener(Landroid/net/INetworkPolicyListener;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateCapabilityChange(Landroid/util/SparseBooleanArray;ZLandroid/net/Network;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->updateDefaultMobilePolicyAL(ILandroid/net/NetworkPolicy;)Z
+PLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkEnabledNL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkRulesNL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateNetworksInternal()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateNotificationsNL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updatePowerSaveWhitelistUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRestrictionRulesForUidUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForAppIdleUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForDeviceIdleUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForRestrictPowerUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForAppIdleParoleUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForAppIdleUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDataUsageRestrictionsUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDataUsageRestrictionsULInner(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDeviceIdleUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForGlobalChangeAL(Z)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerSaveUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForRestrictBackgroundUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForRestrictPowerUL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForTempWhitelistChangeUL(I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForWhitelistedAppIds(Landroid/util/SparseIntArray;Landroid/util/SparseBooleanArray;I)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForWhitelistedPowerSaveUL(IZI)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForWhitelistedPowerSaveUL(ZILandroid/util/SparseIntArray;)V
+PLcom/android/server/net/NetworkPolicyManagerService;->updateSubscriptions()V
+PLcom/android/server/net/NetworkPolicyManagerService;->upgradeWifiMeteredOverrideAL()V
+PLcom/android/server/net/NetworkPolicyManagerService;->waitForAdminData()V
+PLcom/android/server/net/NetworkPolicyManagerService;->writePolicyAL()V
+PLcom/android/server/net/NetworkStatsAccess;->checkAccessLevel(Landroid/content/Context;ILjava/lang/String;)I
+PLcom/android/server/net/NetworkStatsAccess;->hasAppOpsPermission(Landroid/content/Context;ILjava/lang/String;)Z
+PLcom/android/server/net/NetworkStatsCollection;-><init>(J)V
+PLcom/android/server/net/NetworkStatsCollection;->getHistory(Landroid/net/NetworkTemplate;Landroid/telephony/SubscriptionPlan;IIIIJJII)Landroid/net/NetworkStatsHistory;
+PLcom/android/server/net/NetworkStatsCollection;->getTotalBytes()J
+PLcom/android/server/net/NetworkStatsCollection;->isDirty()Z
+PLcom/android/server/net/NetworkStatsCollection;->read(Ljava/io/InputStream;)V
+PLcom/android/server/net/NetworkStatsCollection;->recordCollection(Lcom/android/server/net/NetworkStatsCollection;)V
+PLcom/android/server/net/NetworkStatsCollection;->recordHistory(Lcom/android/server/net/NetworkStatsCollection$Key;Landroid/net/NetworkStatsHistory;)V
+PLcom/android/server/net/NetworkStatsCollection;->reset()V
+PLcom/android/server/net/NetworkStatsManagerInternal;-><init>()V
+PLcom/android/server/net/NetworkStatsObservers$1;-><init>(Lcom/android/server/net/NetworkStatsObservers;)V
+PLcom/android/server/net/NetworkStatsObservers$1;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/net/NetworkStatsObservers$StatsContext;-><init>(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/util/ArrayMap;Landroid/util/ArrayMap;[Lcom/android/internal/net/VpnInfo;J)V
+PLcom/android/server/net/NetworkStatsObservers;-><init>()V
+PLcom/android/server/net/NetworkStatsObservers;->access$200(Lcom/android/server/net/NetworkStatsObservers;Lcom/android/server/net/NetworkStatsObservers$StatsContext;)V
+PLcom/android/server/net/NetworkStatsObservers;->getHandler()Landroid/os/Handler;
+PLcom/android/server/net/NetworkStatsObservers;->getHandlerLooperLocked()Landroid/os/Looper;
+PLcom/android/server/net/NetworkStatsObservers;->handleUpdateStats(Lcom/android/server/net/NetworkStatsObservers$StatsContext;)V
+PLcom/android/server/net/NetworkStatsObservers;->updateStats(Landroid/net/NetworkStats;Landroid/net/NetworkStats;Landroid/util/ArrayMap;Landroid/util/ArrayMap;[Lcom/android/internal/net/VpnInfo;J)V
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;-><init>(Lcom/android/server/net/NetworkStatsCollection;)V
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;->read(Ljava/io/InputStream;)V
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;->reset()V
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;->shouldWrite()Z
+PLcom/android/server/net/NetworkStatsRecorder$CombiningRewriter;->write(Ljava/io/OutputStream;)V
+PLcom/android/server/net/NetworkStatsRecorder;-><init>(Lcom/android/internal/util/FileRotator;Landroid/net/NetworkStats$NonMonotonicObserver;Landroid/os/DropBoxManager;Ljava/lang/String;JZ)V
+PLcom/android/server/net/NetworkStatsRecorder;->forcePersistLocked(J)V
+PLcom/android/server/net/NetworkStatsRecorder;->getOrLoadCompleteLocked()Lcom/android/server/net/NetworkStatsCollection;
+PLcom/android/server/net/NetworkStatsRecorder;->loadLocked(JJ)Lcom/android/server/net/NetworkStatsCollection;
+PLcom/android/server/net/NetworkStatsRecorder;->maybePersistLocked(J)V
+PLcom/android/server/net/NetworkStatsRecorder;->setPersistThreshold(J)V
+PLcom/android/server/net/NetworkStatsService$1;-><init>(Lcom/android/server/net/NetworkStatsService;ILjava/lang/String;I)V
+PLcom/android/server/net/NetworkStatsService$1;->close()V
+PLcom/android/server/net/NetworkStatsService$1;->getHistoryForNetwork(Landroid/net/NetworkTemplate;I)Landroid/net/NetworkStatsHistory;
+PLcom/android/server/net/NetworkStatsService$1;->getSummaryForAllUid(Landroid/net/NetworkTemplate;JJZ)Landroid/net/NetworkStats;
+PLcom/android/server/net/NetworkStatsService$1;->getUidComplete()Lcom/android/server/net/NetworkStatsCollection;
+PLcom/android/server/net/NetworkStatsService$2;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkStatsService$3;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/net/NetworkStatsService$4;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$5;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$6;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$7;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$7;->limitReached(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;-><init>(Landroid/content/Context;)V
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getAugmentEnabled()Z
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getDevConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getDevPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getGlobalAlertBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getGlobalBoolean(Ljava/lang/String;Z)Z
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getGlobalLong(Ljava/lang/String;J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getPollInterval()J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getSampleEnabled()Z
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidTagConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getUidTagPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getXtConfig()Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;
+PLcom/android/server/net/NetworkStatsService$DefaultNetworkStatsSettings;->getXtPersistBytes(J)J
+PLcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$DropBoxNonMonotonicObserver;-><init>(Lcom/android/server/net/NetworkStatsService;Lcom/android/server/net/NetworkStatsService$1;)V
+PLcom/android/server/net/NetworkStatsService$HandlerCallback;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$HandlerCallback;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;-><init>(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;-><init>(Lcom/android/server/net/NetworkStatsService;Lcom/android/server/net/NetworkStatsService$1;)V
+PLcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;->advisePersistThreshold(J)V
+PLcom/android/server/net/NetworkStatsService$NetworkStatsManagerInternalImpl;->getNetworkTotalBytes(Landroid/net/NetworkTemplate;JJ)J
+PLcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;-><init>(JJJ)V
+PLcom/android/server/net/NetworkStatsService;-><init>(Landroid/content/Context;Landroid/os/INetworkManagementService;Landroid/app/AlarmManager;Landroid/os/PowerManager$WakeLock;Ljava/time/Clock;Landroid/telephony/TelephonyManager;Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings;Lcom/android/server/net/NetworkStatsObservers;Ljava/io/File;Ljava/io/File;)V
+PLcom/android/server/net/NetworkStatsService;->access$1400(Lcom/android/server/net/NetworkStatsService;)Landroid/content/Context;
+PLcom/android/server/net/NetworkStatsService;->access$1500(Lcom/android/server/net/NetworkStatsService;)Landroid/os/Handler;
+PLcom/android/server/net/NetworkStatsService;->access$1600(Lcom/android/server/net/NetworkStatsService;Landroid/net/NetworkTemplate;JJ)J
+PLcom/android/server/net/NetworkStatsService;->access$1800(Lcom/android/server/net/NetworkStatsService;J)V
+PLcom/android/server/net/NetworkStatsService;->access$200(Lcom/android/server/net/NetworkStatsService;Ljava/lang/String;)I
+PLcom/android/server/net/NetworkStatsService;->access$300(Lcom/android/server/net/NetworkStatsService;)Ljava/lang/Object;
+PLcom/android/server/net/NetworkStatsService;->access$400(Lcom/android/server/net/NetworkStatsService;)Lcom/android/server/net/NetworkStatsRecorder;
+PLcom/android/server/net/NetworkStatsService;->access$700(Lcom/android/server/net/NetworkStatsService;Landroid/net/NetworkTemplate;IIII)Landroid/net/NetworkStatsHistory;
+PLcom/android/server/net/NetworkStatsService;->access$800(Lcom/android/server/net/NetworkStatsService;I)V
+PLcom/android/server/net/NetworkStatsService;->access$900(Lcom/android/server/net/NetworkStatsService;)V
+PLcom/android/server/net/NetworkStatsService;->advisePersistThreshold(J)V
+PLcom/android/server/net/NetworkStatsService;->assertBandwidthControlEnabled()V
+PLcom/android/server/net/NetworkStatsService;->assertSystemReady()V
+PLcom/android/server/net/NetworkStatsService;->bindConnectivityManager(Landroid/net/IConnectivityManager;)V
+PLcom/android/server/net/NetworkStatsService;->bootstrapStatsLocked()V
+PLcom/android/server/net/NetworkStatsService;->buildRecorder(Ljava/lang/String;Lcom/android/server/net/NetworkStatsService$NetworkStatsSettings$Config;Z)Lcom/android/server/net/NetworkStatsRecorder;
+PLcom/android/server/net/NetworkStatsService;->checkAccessLevel(Ljava/lang/String;)I
+PLcom/android/server/net/NetworkStatsService;->create(Landroid/content/Context;Landroid/os/INetworkManagementService;)Lcom/android/server/net/NetworkStatsService;
+PLcom/android/server/net/NetworkStatsService;->findOrCreateNetworkIdentitySet(Landroid/util/ArrayMap;Ljava/lang/Object;)Lcom/android/server/net/NetworkIdentitySet;
+PLcom/android/server/net/NetworkStatsService;->forceUpdateIfaces([Landroid/net/Network;)V
+PLcom/android/server/net/NetworkStatsService;->getDefaultBaseDir()Ljava/io/File;
+PLcom/android/server/net/NetworkStatsService;->getDefaultClock()Ljava/time/Clock;
+PLcom/android/server/net/NetworkStatsService;->getDefaultSystemDir()Ljava/io/File;
+PLcom/android/server/net/NetworkStatsService;->getMobileIfaces()[Ljava/lang/String;
+PLcom/android/server/net/NetworkStatsService;->getNetworkStatsTethering(I)Landroid/net/NetworkStats;
+PLcom/android/server/net/NetworkStatsService;->getNetworkStatsUidDetail([Ljava/lang/String;)Landroid/net/NetworkStats;
+PLcom/android/server/net/NetworkStatsService;->getNetworkStatsXt()Landroid/net/NetworkStats;
+PLcom/android/server/net/NetworkStatsService;->getNetworkTotalBytes(Landroid/net/NetworkTemplate;JJ)J
+PLcom/android/server/net/NetworkStatsService;->getTotalStats(I)J
+PLcom/android/server/net/NetworkStatsService;->incrementOperationCount(III)V
+PLcom/android/server/net/NetworkStatsService;->internalGetHistoryForNetwork(Landroid/net/NetworkTemplate;IIII)Landroid/net/NetworkStatsHistory;
+PLcom/android/server/net/NetworkStatsService;->internalGetSummaryForNetwork(Landroid/net/NetworkTemplate;IJJII)Landroid/net/NetworkStats;
+PLcom/android/server/net/NetworkStatsService;->isRateLimitedForPoll(I)Z
+PLcom/android/server/net/NetworkStatsService;->maybeUpgradeLegacyStatsLocked()V
+PLcom/android/server/net/NetworkStatsService;->openSession()Landroid/net/INetworkStatsSession;
+PLcom/android/server/net/NetworkStatsService;->openSessionForUsageStats(ILjava/lang/String;)Landroid/net/INetworkStatsSession;
+PLcom/android/server/net/NetworkStatsService;->openSessionInternal(ILjava/lang/String;)Landroid/net/INetworkStatsSession;
+PLcom/android/server/net/NetworkStatsService;->performPoll(I)V
+PLcom/android/server/net/NetworkStatsService;->performPollLocked(I)V
+PLcom/android/server/net/NetworkStatsService;->performSampleLocked()V
+PLcom/android/server/net/NetworkStatsService;->recordSnapshotLocked(J)V
+PLcom/android/server/net/NetworkStatsService;->registerGlobalAlert()V
+PLcom/android/server/net/NetworkStatsService;->registerPollAlarmLocked()V
+PLcom/android/server/net/NetworkStatsService;->setHandler(Landroid/os/Handler;Landroid/os/Handler$Callback;)V
+PLcom/android/server/net/NetworkStatsService;->systemReady()V
+PLcom/android/server/net/NetworkStatsService;->updateIfaces([Landroid/net/Network;)V
+PLcom/android/server/net/NetworkStatsService;->updateIfacesLocked([Landroid/net/Network;)V
+PLcom/android/server/net/NetworkStatsService;->updatePersistThresholdsLocked()V
+PLcom/android/server/net/watchlist/-$$Lambda$WatchlistLoggingHandler$GBD0dX6RhipHIkM0Z_B5jLlwfHQ;-><init>(Lcom/android/server/net/watchlist/WatchlistLoggingHandler;I)V
+PLcom/android/server/net/watchlist/-$$Lambda$WatchlistLoggingHandler$GBD0dX6RhipHIkM0Z_B5jLlwfHQ;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/net/watchlist/DigestUtils;->getSha256Hash(Ljava/io/File;)[B
+PLcom/android/server/net/watchlist/HarmfulDigests;-><init>(Ljava/util/List;)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService$1;-><init>(Lcom/android/server/net/watchlist/NetworkWatchlistService;)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService$1;->onConnectEvent(Ljava/lang/String;IJI)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService$1;->onDnsEvent(Ljava/lang/String;[Ljava/lang/String;IJI)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService$Lifecycle;->onStart()V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->access$100(Lcom/android/server/net/watchlist/NetworkWatchlistService;)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->access$200(Lcom/android/server/net/watchlist/NetworkWatchlistService;)V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->access$300(Lcom/android/server/net/watchlist/NetworkWatchlistService;)Z
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->enforceWatchlistLoggingPermission()V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->init()V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->initIpConnectivityMetrics()V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->reloadWatchlist()V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->reportWatchlistIfNecessary()V
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->startWatchlistLogging()Z
+PLcom/android/server/net/watchlist/NetworkWatchlistService;->startWatchlistLoggingImpl()Z
+PLcom/android/server/net/watchlist/PrivacyUtils;->createDpEncodedReportMap(Z[BLjava/util/List;Lcom/android/server/net/watchlist/WatchlistReportDbHelper$AggregatedResult;)Ljava/util/Map;
+PLcom/android/server/net/watchlist/PrivacyUtils;->createLongitudinalReportingConfig(Ljava/lang/String;)Landroid/privacy/internal/longitudinalreporting/LongitudinalReportingConfig;
+PLcom/android/server/net/watchlist/PrivacyUtils;->createSecureDPEncoder([BLjava/lang/String;)Landroid/privacy/DifferentialPrivacyEncoder;
+PLcom/android/server/net/watchlist/ReportEncoder;->encodeWatchlistReport(Lcom/android/server/net/watchlist/WatchlistConfig;[BLjava/util/List;Lcom/android/server/net/watchlist/WatchlistReportDbHelper$AggregatedResult;)[B
+PLcom/android/server/net/watchlist/ReportEncoder;->serializeReport(Lcom/android/server/net/watchlist/WatchlistConfig;Ljava/util/Map;)[B
+PLcom/android/server/net/watchlist/ReportWatchlistJobService;-><init>()V
+PLcom/android/server/net/watchlist/ReportWatchlistJobService;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/net/watchlist/ReportWatchlistJobService;->schedule(Landroid/content/Context;)V
+PLcom/android/server/net/watchlist/WatchlistConfig$CrcShaDigests;-><init>(Lcom/android/server/net/watchlist/HarmfulDigests;Lcom/android/server/net/watchlist/HarmfulDigests;)V
+PLcom/android/server/net/watchlist/WatchlistConfig;-><init>()V
+PLcom/android/server/net/watchlist/WatchlistConfig;-><init>(Ljava/io/File;)V
+PLcom/android/server/net/watchlist/WatchlistConfig;->containsDomain(Ljava/lang/String;)Z
+PLcom/android/server/net/watchlist/WatchlistConfig;->getInstance()Lcom/android/server/net/watchlist/WatchlistConfig;
+PLcom/android/server/net/watchlist/WatchlistConfig;->getSha256(Ljava/lang/String;)[B
+PLcom/android/server/net/watchlist/WatchlistConfig;->getWatchlistConfigHash()[B
+PLcom/android/server/net/watchlist/WatchlistConfig;->isConfigSecure()Z
+PLcom/android/server/net/watchlist/WatchlistConfig;->parseHashes(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/util/List;)V
+PLcom/android/server/net/watchlist/WatchlistConfig;->reloadConfig()V
+PLcom/android/server/net/watchlist/WatchlistConfig;->removeTestModeConfig()V
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->getAllDigestsForReport(Lcom/android/server/net/watchlist/WatchlistReportDbHelper$AggregatedResult;)Ljava/util/List;
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->getAllSubDomains(Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->getDigestFromUid(I)[B
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->getLastMidnightTime()J
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->getMidnightTimestamp(I)J
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->getPrimaryUserId()I
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->handleNetworkEvent(Ljava/lang/String;[Ljava/lang/String;IJ)V
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->insertRecord(ILjava/lang/String;J)Z
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->isHostInWatchlist(Ljava/lang/String;)Z
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->lambda$getDigestFromUid$0(Lcom/android/server/net/watchlist/WatchlistLoggingHandler;ILjava/lang/Integer;)[B
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->reportWatchlistIfNecessary()V
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->shouldReportNetworkWatchlist(J)Z
+PLcom/android/server/net/watchlist/WatchlistLoggingHandler;->tryAggregateRecords(J)V
+PLcom/android/server/net/watchlist/WatchlistReportDbHelper$AggregatedResult;-><init>(Ljava/util/Set;Ljava/lang/String;Ljava/util/HashMap;)V
+PLcom/android/server/net/watchlist/WatchlistReportDbHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/net/watchlist/WatchlistReportDbHelper;->cleanup(J)Z
+PLcom/android/server/net/watchlist/WatchlistReportDbHelper;->getAggregatedRecords(J)Lcom/android/server/net/watchlist/WatchlistReportDbHelper$AggregatedResult;
+PLcom/android/server/net/watchlist/WatchlistReportDbHelper;->getInstance(Landroid/content/Context;)Lcom/android/server/net/watchlist/WatchlistReportDbHelper;
+PLcom/android/server/net/watchlist/WatchlistReportDbHelper;->getSystemWatchlistDbFile()Ljava/io/File;
+PLcom/android/server/net/watchlist/WatchlistReportDbHelper;->insertNewRecord([BLjava/lang/String;J)Z
+PLcom/android/server/net/watchlist/WatchlistSettings;-><init>()V
+PLcom/android/server/net/watchlist/WatchlistSettings;-><init>(Ljava/io/File;)V
+PLcom/android/server/net/watchlist/WatchlistSettings;->getInstance()Lcom/android/server/net/watchlist/WatchlistSettings;
+PLcom/android/server/net/watchlist/WatchlistSettings;->getPrivacySecretKey()[B
+PLcom/android/server/net/watchlist/WatchlistSettings;->getSystemWatchlistFile()Ljava/io/File;
+PLcom/android/server/net/watchlist/WatchlistSettings;->parseSecretKey(Lorg/xmlpull/v1/XmlPullParser;)[B
+PLcom/android/server/net/watchlist/WatchlistSettings;->reloadSettings()V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$15$wXaTmmz_lG6grUqU8upk0686eXA;-><init>(II)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$15$wXaTmmz_lG6grUqU8upk0686eXA;->apply(I)Z
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$E8qsF-PrFYYUtUGked50-pRub20;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$E8qsF-PrFYYUtUGked50-pRub20;->run()V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$ZpwYxOiDD13VBHvGZVH3p7iGkFI;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$ZpwYxOiDD13VBHvGZVH3p7iGkFI;->run()V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$Zsu32u2gOsCsEatsnnXTLoY37u0;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/-$$Lambda$NotificationManagerService$NotificationListeners$Zsu32u2gOsCsEatsnnXTLoY37u0;->run()V
+PLcom/android/server/notification/-$$Lambda$NotificationRecord$XgkrZGcjOHPHem34oE9qLGy3siA;-><init>(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/-$$Lambda$NotificationRecord$XgkrZGcjOHPHem34oE9qLGy3siA;->accept(Ljava/lang/Object;)V
+PLcom/android/server/notification/-$$Lambda$ouaYRM5YVYoMkUW8dm6TnIjLfgg;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/-$$Lambda$ouaYRM5YVYoMkUW8dm6TnIjLfgg;->test(Ljava/lang/Object;)Z
+PLcom/android/server/notification/AlertRateLimiter;-><init>()V
+PLcom/android/server/notification/AlertRateLimiter;->shouldRateLimitAlert(J)Z
+PLcom/android/server/notification/BadgeExtractor;-><init>()V
+PLcom/android/server/notification/BadgeExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/BadgeExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/BadgeExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/CalendarTracker$1;-><init>(Lcom/android/server/notification/CalendarTracker;Landroid/os/Handler;)V
+PLcom/android/server/notification/CalendarTracker$1;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/notification/CalendarTracker$CheckEventResult;-><init>()V
+PLcom/android/server/notification/CalendarTracker;-><init>(Landroid/content/Context;Landroid/content/Context;)V
+PLcom/android/server/notification/CalendarTracker;->access$000()Z
+PLcom/android/server/notification/CalendarTracker;->access$200(Lcom/android/server/notification/CalendarTracker;)Lcom/android/server/notification/CalendarTracker$Callback;
+PLcom/android/server/notification/CalendarTracker;->checkEvent(Landroid/service/notification/ZenModeConfig$EventInfo;J)Lcom/android/server/notification/CalendarTracker$CheckEventResult;
+PLcom/android/server/notification/CalendarTracker;->getPrimaryCalendars()Landroid/util/ArraySet;
+PLcom/android/server/notification/CalendarTracker;->meetsAttendee(Landroid/service/notification/ZenModeConfig$EventInfo;ILjava/lang/String;)Z
+PLcom/android/server/notification/CalendarTracker;->meetsReply(II)Z
+PLcom/android/server/notification/CalendarTracker;->setCallback(Lcom/android/server/notification/CalendarTracker$Callback;)V
+PLcom/android/server/notification/CalendarTracker;->setRegistered(Z)V
+PLcom/android/server/notification/ConditionProviders$ConditionRecord;-><init>(Landroid/net/Uri;Landroid/content/ComponentName;)V
+PLcom/android/server/notification/ConditionProviders$ConditionRecord;-><init>(Landroid/net/Uri;Landroid/content/ComponentName;Lcom/android/server/notification/ConditionProviders$1;)V
+PLcom/android/server/notification/ConditionProviders;-><init>(Landroid/content/Context;Lcom/android/server/notification/ManagedServices$UserProfiles;Landroid/content/pm/IPackageManager;)V
+PLcom/android/server/notification/ConditionProviders;->addSystemProvider(Lcom/android/server/notification/SystemConditionProviderService;)V
+PLcom/android/server/notification/ConditionProviders;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
+PLcom/android/server/notification/ConditionProviders;->checkServiceToken(Landroid/service/notification/IConditionProvider;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ConditionProviders;->ensureRecordExists(Landroid/content/ComponentName;Landroid/net/Uri;Landroid/service/notification/IConditionProvider;)V
+PLcom/android/server/notification/ConditionProviders;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
+PLcom/android/server/notification/ConditionProviders;->getRecordLocked(Landroid/net/Uri;Landroid/content/ComponentName;Z)Lcom/android/server/notification/ConditionProviders$ConditionRecord;
+PLcom/android/server/notification/ConditionProviders;->getSystemProviders()Ljava/lang/Iterable;
+PLcom/android/server/notification/ConditionProviders;->isSystemProviderEnabled(Ljava/lang/String;)Z
+PLcom/android/server/notification/ConditionProviders;->isValidEntry(Ljava/lang/String;I)Z
+PLcom/android/server/notification/ConditionProviders;->notifyConditions(Ljava/lang/String;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;[Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/ConditionProviders;->onBootPhaseAppsCanStart()V
+PLcom/android/server/notification/ConditionProviders;->onPackagesChanged(Z[Ljava/lang/String;[I)V
+PLcom/android/server/notification/ConditionProviders;->onServiceAdded(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/ConditionProviders;->onServiceRemovedLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/ConditionProviders;->onUserSwitched(I)V
+PLcom/android/server/notification/ConditionProviders;->provider(Lcom/android/server/notification/ConditionProviders$ConditionRecord;)Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/ConditionProviders;->provider(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/ConditionProviders;->removeDuplicateConditions(Ljava/lang/String;[Landroid/service/notification/Condition;)[Landroid/service/notification/Condition;
+PLcom/android/server/notification/ConditionProviders;->safeSet([Ljava/lang/Object;)Landroid/util/ArraySet;
+PLcom/android/server/notification/ConditionProviders;->setCallback(Lcom/android/server/notification/ConditionProviders$Callback;)V
+PLcom/android/server/notification/ConditionProviders;->subscribeIfNecessary(Landroid/content/ComponentName;Landroid/net/Uri;)Z
+PLcom/android/server/notification/ConditionProviders;->subscribeLocked(Lcom/android/server/notification/ConditionProviders$ConditionRecord;)V
+PLcom/android/server/notification/CountdownConditionProvider$Receiver;-><init>(Lcom/android/server/notification/CountdownConditionProvider;)V
+PLcom/android/server/notification/CountdownConditionProvider$Receiver;-><init>(Lcom/android/server/notification/CountdownConditionProvider;Lcom/android/server/notification/CountdownConditionProvider$1;)V
+PLcom/android/server/notification/CountdownConditionProvider;-><init>()V
+PLcom/android/server/notification/CountdownConditionProvider;->asInterface()Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/CountdownConditionProvider;->attachBase(Landroid/content/Context;)V
+PLcom/android/server/notification/CountdownConditionProvider;->getComponent()Landroid/content/ComponentName;
+PLcom/android/server/notification/CountdownConditionProvider;->isValidConditionId(Landroid/net/Uri;)Z
+PLcom/android/server/notification/CountdownConditionProvider;->onBootComplete()V
+PLcom/android/server/notification/CountdownConditionProvider;->onConnected()V
+PLcom/android/server/notification/EventConditionProvider$1;-><init>(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider$2;-><init>(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider$2;->onChanged()V
+PLcom/android/server/notification/EventConditionProvider$3;-><init>(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/notification/EventConditionProvider$4;-><init>(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider$4;->run()V
+PLcom/android/server/notification/EventConditionProvider;-><init>()V
+PLcom/android/server/notification/EventConditionProvider;->access$100()Z
+PLcom/android/server/notification/EventConditionProvider;->access$200(Lcom/android/server/notification/EventConditionProvider;)Ljava/lang/Runnable;
+PLcom/android/server/notification/EventConditionProvider;->access$300(Lcom/android/server/notification/EventConditionProvider;)Landroid/os/Handler;
+PLcom/android/server/notification/EventConditionProvider;->access$400(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider;->access$500(Lcom/android/server/notification/EventConditionProvider;)V
+PLcom/android/server/notification/EventConditionProvider;->asInterface()Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/EventConditionProvider;->attachBase(Landroid/content/Context;)V
+PLcom/android/server/notification/EventConditionProvider;->createCondition(Landroid/net/Uri;I)Landroid/service/notification/Condition;
+PLcom/android/server/notification/EventConditionProvider;->evaluateSubscriptions()V
+PLcom/android/server/notification/EventConditionProvider;->evaluateSubscriptionsW()V
+PLcom/android/server/notification/EventConditionProvider;->getComponent()Landroid/content/ComponentName;
+PLcom/android/server/notification/EventConditionProvider;->isValidConditionId(Landroid/net/Uri;)Z
+PLcom/android/server/notification/EventConditionProvider;->onBootComplete()V
+PLcom/android/server/notification/EventConditionProvider;->onConnected()V
+PLcom/android/server/notification/EventConditionProvider;->onSubscribe(Landroid/net/Uri;)V
+PLcom/android/server/notification/EventConditionProvider;->reloadTrackers()V
+PLcom/android/server/notification/EventConditionProvider;->rescheduleAlarm(JJ)V
+PLcom/android/server/notification/EventConditionProvider;->setRegistered(Z)V
+PLcom/android/server/notification/GlobalSortKeyComparator;-><init>()V
+PLcom/android/server/notification/GroupHelper;-><init>(Lcom/android/server/notification/GroupHelper$Callback;)V
+PLcom/android/server/notification/GroupHelper;->adjustAutogroupingSummary(ILjava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/notification/GroupHelper;->maybeUngroup(Landroid/service/notification/StatusBarNotification;ZI)V
+PLcom/android/server/notification/GroupHelper;->onNotificationPosted(Landroid/service/notification/StatusBarNotification;Z)V
+PLcom/android/server/notification/GroupHelper;->onNotificationRemoved(Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/ImportanceExtractor;-><init>()V
+PLcom/android/server/notification/ImportanceExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/ImportanceExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/ImportanceExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/ManagedServices$1;-><init>(Lcom/android/server/notification/ManagedServices;Ljava/lang/String;IZI)V
+PLcom/android/server/notification/ManagedServices$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/notification/ManagedServices$1;->onServiceDisconnected(Landroid/content/ComponentName;)V
+PLcom/android/server/notification/ManagedServices$Config;-><init>()V
+PLcom/android/server/notification/ManagedServices$ManagedServiceInfo;-><init>(Lcom/android/server/notification/ManagedServices;Landroid/os/IInterface;Landroid/content/ComponentName;IZLandroid/content/ServiceConnection;I)V
+PLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->binderDied()V
+PLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->getOwner()Lcom/android/server/notification/ManagedServices;
+PLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isGuest(Lcom/android/server/notification/ManagedServices;)Z
+PLcom/android/server/notification/ManagedServices$UserProfiles;-><init>()V
+PLcom/android/server/notification/ManagedServices$UserProfiles;->getCurrentProfileIds()[I
+PLcom/android/server/notification/ManagedServices$UserProfiles;->isCurrentProfile(I)Z
+PLcom/android/server/notification/ManagedServices$UserProfiles;->updateCache(Landroid/content/Context;)V
+PLcom/android/server/notification/ManagedServices;-><init>(Landroid/content/Context;Ljava/lang/Object;Lcom/android/server/notification/ManagedServices$UserProfiles;Landroid/content/pm/IPackageManager;)V
+PLcom/android/server/notification/ManagedServices;->access$000(Lcom/android/server/notification/ManagedServices;)Landroid/util/ArraySet;
+PLcom/android/server/notification/ManagedServices;->access$100(Lcom/android/server/notification/ManagedServices;)Ljava/util/ArrayList;
+PLcom/android/server/notification/ManagedServices;->access$200(Lcom/android/server/notification/ManagedServices;Landroid/os/IInterface;Landroid/content/ComponentName;IZLandroid/content/ServiceConnection;I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->access$300(Lcom/android/server/notification/ManagedServices;)Ljava/util/ArrayList;
+PLcom/android/server/notification/ManagedServices;->access$400(Lcom/android/server/notification/ManagedServices;)Ljava/lang/String;
+PLcom/android/server/notification/ManagedServices;->access$800(Lcom/android/server/notification/ManagedServices;Landroid/os/IInterface;I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->addApprovedList(Ljava/lang/String;IZ)V
+PLcom/android/server/notification/ManagedServices;->checkNotNull(Landroid/os/IInterface;)V
+PLcom/android/server/notification/ManagedServices;->checkServiceTokenLocked(Landroid/os/IInterface;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->getAllowedPackages(I)Ljava/util/List;
+PLcom/android/server/notification/ManagedServices;->getApprovedValue(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/notification/ManagedServices;->getCaption()Ljava/lang/String;
+PLcom/android/server/notification/ManagedServices;->getPackageName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/notification/ManagedServices;->getServiceFromTokenLocked(Landroid/os/IInterface;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->getServices()Ljava/util/List;
+PLcom/android/server/notification/ManagedServices;->hasMatchingServices(Ljava/lang/String;I)Z
+PLcom/android/server/notification/ManagedServices;->isComponentEnabledForCurrentProfiles(Landroid/content/ComponentName;)Z
+PLcom/android/server/notification/ManagedServices;->isPackageOrComponentAllowed(Ljava/lang/String;I)Z
+PLcom/android/server/notification/ManagedServices;->isServiceTokenValidLocked(Landroid/os/IInterface;)Z
+PLcom/android/server/notification/ManagedServices;->isValidEntry(Ljava/lang/String;I)Z
+PLcom/android/server/notification/ManagedServices;->loadComponentNamesFromValues(Landroid/util/ArraySet;I)Landroid/util/ArraySet;
+PLcom/android/server/notification/ManagedServices;->newServiceInfo(Landroid/os/IInterface;Landroid/content/ComponentName;IZLandroid/content/ServiceConnection;I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->onBootPhaseAppsCanStart()V
+PLcom/android/server/notification/ManagedServices;->onPackagesChanged(Z[Ljava/lang/String;[I)V
+PLcom/android/server/notification/ManagedServices;->onUserSwitched(I)V
+PLcom/android/server/notification/ManagedServices;->onUserUnlocked(I)V
+PLcom/android/server/notification/ManagedServices;->queryPackageForServices(Ljava/lang/String;I)Ljava/util/Set;
+PLcom/android/server/notification/ManagedServices;->queryPackageForServices(Ljava/lang/String;II)Ljava/util/Set;
+PLcom/android/server/notification/ManagedServices;->readXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/function/Predicate;)V
+PLcom/android/server/notification/ManagedServices;->rebindServices(Z)V
+PLcom/android/server/notification/ManagedServices;->registerGuestService(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/ManagedServices;->registerService(Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/ManagedServices;->registerService(Landroid/os/IInterface;Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/ManagedServices;->registerServiceImpl(Landroid/os/IInterface;Landroid/content/ComponentName;I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->registerServiceImpl(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->registerServiceLocked(Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/ManagedServices;->registerServiceLocked(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/notification/ManagedServices;->removeServiceImpl(Landroid/os/IInterface;I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->removeServiceLocked(I)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;
+PLcom/android/server/notification/ManagedServices;->setComponentState(Landroid/content/ComponentName;Z)V
+PLcom/android/server/notification/ManagedServices;->setPackageOrComponentEnabled(Ljava/lang/String;IZZ)V
+PLcom/android/server/notification/ManagedServices;->trimApprovedListsAccordingToInstalledServices()V
+PLcom/android/server/notification/ManagedServices;->unregisterService(Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/ManagedServices;->unregisterService(Landroid/os/IInterface;I)V
+PLcom/android/server/notification/ManagedServices;->unregisterServiceImpl(Landroid/os/IInterface;I)V
+PLcom/android/server/notification/ManagedServices;->unregisterServiceLocked(Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/ManagedServices;->upgradeXml(II)V
+PLcom/android/server/notification/NotificationAdjustmentExtractor;-><init>()V
+PLcom/android/server/notification/NotificationAdjustmentExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/NotificationAdjustmentExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/NotificationAdjustmentExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/NotificationChannelExtractor;-><init>()V
+PLcom/android/server/notification/NotificationChannelExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/NotificationChannelExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/NotificationChannelExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/NotificationComparator$1;-><init>(Lcom/android/server/notification/NotificationComparator;)V
+PLcom/android/server/notification/NotificationComparator;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor$1;-><init>(Lcom/android/server/notification/NotificationIntrusivenessExtractor;Ljava/lang/String;J)V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor$1;->work()V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor;-><init>()V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/NotificationIntrusivenessExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/NotificationManagerService$10$1;-><init>(Lcom/android/server/notification/NotificationManagerService$10;Ljava/lang/String;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;[Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/NotificationManagerService$10$1;->run()V
+PLcom/android/server/notification/NotificationManagerService$10;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$10;->areNotificationsEnabled(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$10;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService$10;->canShowBadge(Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService$10;->cancelAllNotifications(Ljava/lang/String;I)V
+PLcom/android/server/notification/NotificationManagerService$10;->createNotificationChannelGroups(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V
+PLcom/android/server/notification/NotificationManagerService$10;->createNotificationChannelsImpl(Ljava/lang/String;ILandroid/content/pm/ParceledListSlice;)V
+PLcom/android/server/notification/NotificationManagerService$10;->deleteNotificationChannel(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$10;->enforcePolicyAccess(ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$10;->enforceSystemOrSystemUI(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$10;->enqueueToast(Ljava/lang/String;Landroid/app/ITransientNotification;I)V
+PLcom/android/server/notification/NotificationManagerService$10;->finishToken(Ljava/lang/String;Landroid/app/ITransientNotification;)V
+PLcom/android/server/notification/NotificationManagerService$10;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$10;->getBackupPayload(I)[B
+PLcom/android/server/notification/NotificationManagerService$10;->getBlockedChannelCount(Ljava/lang/String;I)I
+PLcom/android/server/notification/NotificationManagerService$10;->getDeletedChannelCount(Ljava/lang/String;I)I
+PLcom/android/server/notification/NotificationManagerService$10;->getEffectsSuppressor()Landroid/content/ComponentName;
+PLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannelGroupsForPackage(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$10;->getNotificationChannels(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/NotificationManagerService$10;->getNotificationPolicy(Ljava/lang/String;)Landroid/app/NotificationManager$Policy;
+PLcom/android/server/notification/NotificationManagerService$10;->getNumNotificationChannelsForPackage(Ljava/lang/String;IZ)I
+PLcom/android/server/notification/NotificationManagerService$10;->getZenMode()I
+PLcom/android/server/notification/NotificationManagerService$10;->getZenModeConfig()Landroid/service/notification/ZenModeConfig;
+PLcom/android/server/notification/NotificationManagerService$10;->getZenRules()Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService$10;->notifyConditions(Ljava/lang/String;Landroid/service/notification/IConditionProvider;[Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/NotificationManagerService$10;->onlyHasDefaultChannel(Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService$10;->registerListener(Landroid/service/notification/INotificationListener;Landroid/content/ComponentName;I)V
+PLcom/android/server/notification/NotificationManagerService$10;->requestBindListener(Landroid/content/ComponentName;)V
+PLcom/android/server/notification/NotificationManagerService$10;->requestUnbindListener(Landroid/service/notification/INotificationListener;)V
+PLcom/android/server/notification/NotificationManagerService$10;->requestUnbindProvider(Landroid/service/notification/IConditionProvider;)V
+PLcom/android/server/notification/NotificationManagerService$10;->sanitizeSbn(Ljava/lang/String;ILandroid/service/notification/StatusBarNotification;)Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$10;->setNotificationListenerAccessGrantedForUser(Landroid/content/ComponentName;IZ)V
+PLcom/android/server/notification/NotificationManagerService$10;->setNotificationPolicyAccessGranted(Ljava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService$10;->setNotificationPolicyAccessGrantedForUser(Ljava/lang/String;IZ)V
+PLcom/android/server/notification/NotificationManagerService$10;->setNotificationsEnabledForPackage(Ljava/lang/String;IZ)V
+PLcom/android/server/notification/NotificationManagerService$10;->setNotificationsShownFromListener(Landroid/service/notification/INotificationListener;[Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$10;->setZenMode(ILandroid/net/Uri;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$11;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$13;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService$13;->run()V
+PLcom/android/server/notification/NotificationManagerService$14;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;IILjava/lang/String;ILjava/lang/String;IIIIZII)V
+PLcom/android/server/notification/NotificationManagerService$14;->run()V
+PLcom/android/server/notification/NotificationManagerService$15;-><init>(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;IILjava/lang/String;IIIIZLjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$15;->lambda$run$0(III)Z
+PLcom/android/server/notification/NotificationManagerService$15;->run()V
+PLcom/android/server/notification/NotificationManagerService$17;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$1;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$1;->clearEffects()V
+PLcom/android/server/notification/NotificationManagerService$1;->onNotificationClear(IILjava/lang/String;Ljava/lang/String;IILjava/lang/String;ILcom/android/internal/statusbar/NotificationVisibility;)V
+PLcom/android/server/notification/NotificationManagerService$1;->onNotificationClick(IILjava/lang/String;Lcom/android/internal/statusbar/NotificationVisibility;)V
+PLcom/android/server/notification/NotificationManagerService$1;->onNotificationExpansionChanged(Ljava/lang/String;ZZ)V
+PLcom/android/server/notification/NotificationManagerService$1;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
+PLcom/android/server/notification/NotificationManagerService$1;->onPanelHidden()V
+PLcom/android/server/notification/NotificationManagerService$1;->onPanelRevealed(ZI)V
+PLcom/android/server/notification/NotificationManagerService$1;->onSetDisabled(I)V
+PLcom/android/server/notification/NotificationManagerService$2;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$3;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$4;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$5;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$5;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/notification/NotificationManagerService$6;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$6;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/notification/NotificationManagerService$7;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$7;->onConfigChanged()V
+PLcom/android/server/notification/NotificationManagerService$7;->onPolicyChanged()V
+PLcom/android/server/notification/NotificationManagerService$7;->onZenModeChanged()V
+PLcom/android/server/notification/NotificationManagerService$8;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$9;-><init>(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService$9;->removeAutoGroupSummary(ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$Archive;-><init>(I)V
+PLcom/android/server/notification/NotificationManagerService$Archive;->record(Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;-><init>(Lcom/android/server/notification/NotificationManagerService;ILcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants$1;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants$1;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/content/Context;Ljava/lang/Object;Lcom/android/server/notification/ManagedServices$UserProfiles;Landroid/content/pm/IPackageManager;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->access$8200(Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->ensureAssistant()V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->isEnabled()Z
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->notifyEnqueued(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onNotificationEnqueued(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onServiceAdded(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onServiceRemovedLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onUserUnlocked(I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$2;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$2;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$3;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$3;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$4;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$4;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$6;-><init>(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners$6;->run()V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/content/pm/IPackageManager;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$8500(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$8600(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$8700(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->access$8900(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->asInterface(Landroid/os/IBinder;)Landroid/os/IInterface;
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->checkType(Landroid/os/IInterface;)Z
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->getConfig()Lcom/android/server/notification/ManagedServices$Config;
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->getOnNotificationPostedTrim(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)I
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->isListenerPackage(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->lambda$notifyNotificationChannelChanged$1(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->lambda$notifyNotificationChannelGroupChanged$2(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->lambda$notifyRemovedLocked$0(Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyInterruptionFilterChanged(I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyInterruptionFilterChanged(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyNotificationChannelChanged(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyNotificationChannelGroupChanged(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyPosted(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyPostedLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyPostedLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Z)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRankingUpdate(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/NotificationRankingUpdate;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRankingUpdateLocked(Ljava/util/List;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRemoved(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyRemovedLocked(Lcom/android/server/notification/NotificationRecord;ILandroid/service/notification/NotificationStats;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->onServiceAdded(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService$NotificationListeners;->onServiceRemovedLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable$1;-><init>(Lcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable$1;->run()V
+PLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;-><init>(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;->run()V
+PLcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Looper;)V
+PLcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;->requestReconsideration(Lcom/android/server/notification/RankingReconsideration;)V
+PLcom/android/server/notification/NotificationManagerService$RankingHandlerWorker;->requestSort()V
+PLcom/android/server/notification/NotificationManagerService$SettingsObserver;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Handler;)V
+PLcom/android/server/notification/NotificationManagerService$SettingsObserver;->observe()V
+PLcom/android/server/notification/NotificationManagerService$SettingsObserver;->update(Landroid/net/Uri;)V
+PLcom/android/server/notification/NotificationManagerService$StatusBarNotificationHolder;-><init>(Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$StatusBarNotificationHolder;->get()Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$ToastRecord;-><init>(ILjava/lang/String;Landroid/app/ITransientNotification;ILandroid/os/Binder;)V
+PLcom/android/server/notification/NotificationManagerService$TrimCache;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)V
+PLcom/android/server/notification/NotificationManagerService$TrimCache;->ForListener(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/StatusBarNotification;
+PLcom/android/server/notification/NotificationManagerService$WorkerHandler;-><init>(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Looper;)V
+PLcom/android/server/notification/NotificationManagerService$WorkerHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService$WorkerHandler;->scheduleSendRankingUpdate()V
+PLcom/android/server/notification/NotificationManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/NotificationManagerService;->access$002(Lcom/android/server/notification/NotificationManagerService;Z)Z
+PLcom/android/server/notification/NotificationManagerService;->access$100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Ljava/lang/String;
+PLcom/android/server/notification/NotificationManagerService;->access$1200(Lcom/android/server/notification/NotificationManagerService;)Landroid/content/pm/IPackageManager;
+PLcom/android/server/notification/NotificationManagerService;->access$1300()I
+PLcom/android/server/notification/NotificationManagerService;->access$1400()I
+PLcom/android/server/notification/NotificationManagerService;->access$1500(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;
+PLcom/android/server/notification/NotificationManagerService;->access$1602(Lcom/android/server/notification/NotificationManagerService;Z)Z
+PLcom/android/server/notification/NotificationManagerService;->access$1700(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$1800(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/lights/Light;
+PLcom/android/server/notification/NotificationManagerService;->access$1900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationManagerService$SettingsObserver;
+PLcom/android/server/notification/NotificationManagerService;->access$200(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$2000(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ManagedServices$UserProfiles;
+PLcom/android/server/notification/NotificationManagerService;->access$2100(Lcom/android/server/notification/NotificationManagerService;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$2200(Lcom/android/server/notification/NotificationManagerService;)F
+PLcom/android/server/notification/NotificationManagerService;->access$2202(Lcom/android/server/notification/NotificationManagerService;F)F
+PLcom/android/server/notification/NotificationManagerService;->access$2300(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$2400(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$2500(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/RankingHandler;
+PLcom/android/server/notification/NotificationManagerService;->access$2700(Lcom/android/server/notification/NotificationManagerService;ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$2800(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;I)Z
+PLcom/android/server/notification/NotificationManagerService;->access$2900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/wm/WindowManagerInternal;
+PLcom/android/server/notification/NotificationManagerService;->access$300(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$3100(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$3200(Lcom/android/server/notification/NotificationManagerService;Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
+PLcom/android/server/notification/NotificationManagerService;->access$3500(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/SnoozeHelper;
+PLcom/android/server/notification/NotificationManagerService;->access$400(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$500(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$5000(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/List;
+PLcom/android/server/notification/NotificationManagerService;->access$5100(Lcom/android/server/notification/NotificationManagerService;)Landroid/util/AtomicFile;
+PLcom/android/server/notification/NotificationManagerService;->access$5200(Lcom/android/server/notification/NotificationManagerService;Ljava/io/OutputStream;Z)V
+PLcom/android/server/notification/NotificationManagerService;->access$5300(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$5400(Lcom/android/server/notification/NotificationManagerService;)Ljava/util/function/Predicate;
+PLcom/android/server/notification/NotificationManagerService;->access$5900(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$6100(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
+PLcom/android/server/notification/NotificationManagerService;->access$6200(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$6300(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/NotificationUsageStats;
+PLcom/android/server/notification/NotificationManagerService;->access$6400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->access$6500(Lcom/android/server/notification/NotificationManagerService;Landroid/service/notification/StatusBarNotification;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$6600(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/GroupHelper;
+PLcom/android/server/notification/NotificationManagerService;->access$7000(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService$ToastRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7100(Lcom/android/server/notification/NotificationManagerService;Landroid/os/IBinder;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7200(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7300(Lcom/android/server/notification/NotificationManagerService;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7500(Lcom/android/server/notification/NotificationManagerService;I)V
+PLcom/android/server/notification/NotificationManagerService;->access$7600(Lcom/android/server/notification/NotificationManagerService;Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7700(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7800(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
+PLcom/android/server/notification/NotificationManagerService;->access$7900(Lcom/android/server/notification/NotificationManagerService;Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService;->access$8300(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;
+PLcom/android/server/notification/NotificationManagerService;->access$8400(Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->access$900(Lcom/android/server/notification/NotificationManagerService;)Lcom/android/server/notification/ConditionProviders;
+PLcom/android/server/notification/NotificationManagerService;->applyZenModeLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->buzzBeepBlinkLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->canUseManagedServices(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService;->cancelAllNotificationsByListLocked(Ljava/util/ArrayList;IILjava/lang/String;ZLjava/lang/String;Lcom/android/server/notification/NotificationManagerService$FlagChecker;ZIZILjava/lang/String;Z)V
+PLcom/android/server/notification/NotificationManagerService;->cancelAllNotificationsInt(IILjava/lang/String;Ljava/lang/String;IIZIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelGroupChildrenByListLocked(Ljava/util/ArrayList;Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelGroupChildrenLocked(Lcom/android/server/notification/NotificationRecord;IILjava/lang/String;ZLcom/android/server/notification/NotificationManagerService$FlagChecker;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIIIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelNotificationLocked(Lcom/android/server/notification/NotificationRecord;ZIIIZLjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelNotificationLocked(Lcom/android/server/notification/NotificationRecord;ZIZLjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->cancelToastLocked(I)V
+PLcom/android/server/notification/NotificationManagerService;->checkCallerIsSystem()V
+PLcom/android/server/notification/NotificationManagerService;->checkCallerIsSystemOrShell()V
+PLcom/android/server/notification/NotificationManagerService;->checkDisqualifyingFeatures(IIILjava/lang/String;Lcom/android/server/notification/NotificationRecord;Z)Z
+PLcom/android/server/notification/NotificationManagerService;->clearAutogroupSummaryLocked(ILjava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->clearLightsLocked()V
+PLcom/android/server/notification/NotificationManagerService;->clearSoundLocked()V
+PLcom/android/server/notification/NotificationManagerService;->clearVibrateLocked()V
+PLcom/android/server/notification/NotificationManagerService;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;ZZ)V
+PLcom/android/server/notification/NotificationManagerService;->disableNotificationEffects(Lcom/android/server/notification/NotificationRecord;)Ljava/lang/String;
+PLcom/android/server/notification/NotificationManagerService;->exitIdle()V
+PLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->findNotificationLocked(Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;
+PLcom/android/server/notification/NotificationManagerService;->finishTokenLocked(Landroid/os/IBinder;)V
+PLcom/android/server/notification/NotificationManagerService;->getCompanionManager()Landroid/companion/ICompanionDeviceManager;
+PLcom/android/server/notification/NotificationManagerService;->getGroupHelper()Lcom/android/server/notification/GroupHelper;
+PLcom/android/server/notification/NotificationManagerService;->getLongArray(Landroid/content/res/Resources;II[J)[J
+PLcom/android/server/notification/NotificationManagerService;->getRealUserId(I)I
+PLcom/android/server/notification/NotificationManagerService;->handleDurationReached(Lcom/android/server/notification/NotificationManagerService$ToastRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->handleGroupedNotificationLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;II)V
+PLcom/android/server/notification/NotificationManagerService;->handleKillTokenTimeout(Landroid/os/IBinder;)V
+PLcom/android/server/notification/NotificationManagerService;->handleListenerInterruptionFilterChanged(I)V
+PLcom/android/server/notification/NotificationManagerService;->handleRankingReconsideration(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationManagerService;->handleSavePolicyFile()V
+PLcom/android/server/notification/NotificationManagerService;->handleSendRankingUpdate()V
+PLcom/android/server/notification/NotificationManagerService;->hasAutoGroupSummaryLocked(Landroid/service/notification/StatusBarNotification;)Z
+PLcom/android/server/notification/NotificationManagerService;->indexOfToastLocked(Ljava/lang/String;Landroid/app/ITransientNotification;)I
+PLcom/android/server/notification/NotificationManagerService;->indexOfToastPackageLocked(Ljava/lang/String;)I
+PLcom/android/server/notification/NotificationManagerService;->init(Landroid/os/Looper;Landroid/content/pm/IPackageManager;Landroid/content/pm/PackageManager;Lcom/android/server/lights/LightsManager;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/ConditionProviders;Landroid/companion/ICompanionDeviceManager;Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/NotificationUsageStats;Landroid/util/AtomicFile;Landroid/app/ActivityManager;Lcom/android/server/notification/GroupHelper;Landroid/app/IActivityManager;Landroid/app/usage/UsageStatsManagerInternal;Landroid/app/admin/DevicePolicyManagerInternal;)V
+PLcom/android/server/notification/NotificationManagerService;->isBlocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationUsageStats;)Z
+PLcom/android/server/notification/NotificationManagerService;->isCallerInstantApp(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationManagerService;->isPackageSuspendedLocked(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->isVisuallyInterruptive(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->keepProcessAliveIfNeededLocked(I)V
+PLcom/android/server/notification/NotificationManagerService;->listenForCallState()V
+PLcom/android/server/notification/NotificationManagerService;->loadPolicyFile()V
+PLcom/android/server/notification/NotificationManagerService;->logRecentLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->maybeRecordInterruptionLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->onBootPhase(I)V
+PLcom/android/server/notification/NotificationManagerService;->onStart()V
+PLcom/android/server/notification/NotificationManagerService;->playSound(Lcom/android/server/notification/NotificationRecord;Landroid/net/Uri;)Z
+PLcom/android/server/notification/NotificationManagerService;->readPolicyXml(Ljava/io/InputStream;Z)V
+PLcom/android/server/notification/NotificationManagerService;->recordCallerLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->removeDisabledHints(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z
+PLcom/android/server/notification/NotificationManagerService;->removeDisabledHints(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z
+PLcom/android/server/notification/NotificationManagerService;->removeFromNotificationListsLocked(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->reportSeen(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->reportUserInteraction(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->resolveNotificationUid(Ljava/lang/String;II)I
+PLcom/android/server/notification/NotificationManagerService;->savePolicyFile()V
+PLcom/android/server/notification/NotificationManagerService;->scheduleDurationReachedLocked(Lcom/android/server/notification/NotificationManagerService$ToastRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->scheduleInterruptionFilterChanged(I)V
+PLcom/android/server/notification/NotificationManagerService;->scheduleKillTokenTimeout(Landroid/os/IBinder;)V
+PLcom/android/server/notification/NotificationManagerService;->scheduleTimeoutLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationManagerService;->sendAccessibilityEvent(Landroid/app/Notification;Ljava/lang/CharSequence;)V
+PLcom/android/server/notification/NotificationManagerService;->sendRegisteredOnlyBroadcast(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationManagerService;->shouldMuteNotificationLocked(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/NotificationManagerService;->showNextToastLocked()V
+PLcom/android/server/notification/NotificationManagerService;->updateInterruptionFilterLocked()V
+PLcom/android/server/notification/NotificationManagerService;->updateLightsLocked()V
+PLcom/android/server/notification/NotificationManagerService;->updateNotificationPulse()V
+PLcom/android/server/notification/NotificationManagerService;->writePolicyXml(Ljava/io/OutputStream;Z)V
+PLcom/android/server/notification/NotificationRecord$Light;-><init>(III)V
+PLcom/android/server/notification/NotificationRecord;-><init>(Landroid/content/Context;Landroid/service/notification/StatusBarNotification;Landroid/app/NotificationChannel;)V
+PLcom/android/server/notification/NotificationRecord;->calculateAttributes()Landroid/media/AudioAttributes;
+PLcom/android/server/notification/NotificationRecord;->calculateGrantableUris()V
+PLcom/android/server/notification/NotificationRecord;->calculateLights()Lcom/android/server/notification/NotificationRecord$Light;
+PLcom/android/server/notification/NotificationRecord;->calculateRankingTimeMs(J)J
+PLcom/android/server/notification/NotificationRecord;->calculateSound()Landroid/net/Uri;
+PLcom/android/server/notification/NotificationRecord;->calculateVibration()[J
+PLcom/android/server/notification/NotificationRecord;->copyRankingInformation(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationRecord;->getChannelIdLogTag()Ljava/lang/String;
+PLcom/android/server/notification/NotificationRecord;->getExposureMs(J)I
+PLcom/android/server/notification/NotificationRecord;->getFlags()I
+PLcom/android/server/notification/NotificationRecord;->getGroupLogTag()Ljava/lang/String;
+PLcom/android/server/notification/NotificationRecord;->getLastIntrusive()J
+PLcom/android/server/notification/NotificationRecord;->getLifespanMs(J)I
+PLcom/android/server/notification/NotificationRecord;->getLight()Lcom/android/server/notification/NotificationRecord$Light;
+PLcom/android/server/notification/NotificationRecord;->getLogMaker()Landroid/metrics/LogMaker;
+PLcom/android/server/notification/NotificationRecord;->getLogMaker(J)Landroid/metrics/LogMaker;
+PLcom/android/server/notification/NotificationRecord;->getNumSmartRepliesAdded()I
+PLcom/android/server/notification/NotificationRecord;->getSound()Landroid/net/Uri;
+PLcom/android/server/notification/NotificationRecord;->getStats()Landroid/service/notification/NotificationStats;
+PLcom/android/server/notification/NotificationRecord;->getUid()I
+PLcom/android/server/notification/NotificationRecord;->getVibration()[J
+PLcom/android/server/notification/NotificationRecord;->hasRecordedInterruption()Z
+PLcom/android/server/notification/NotificationRecord;->isInterruptive()Z
+PLcom/android/server/notification/NotificationRecord;->isPreChannelsNotification()Z
+PLcom/android/server/notification/NotificationRecord;->isSeen()Z
+PLcom/android/server/notification/NotificationRecord;->lambda$calculateGrantableUris$0(Lcom/android/server/notification/NotificationRecord;Landroid/net/Uri;)V
+PLcom/android/server/notification/NotificationRecord;->recordDismissalSurface(I)V
+PLcom/android/server/notification/NotificationRecord;->recordExpanded()V
+PLcom/android/server/notification/NotificationRecord;->setHidden(Z)V
+PLcom/android/server/notification/NotificationRecord;->setInterruptive(Z)V
+PLcom/android/server/notification/NotificationRecord;->setIsAppImportanceLocked(Z)V
+PLcom/android/server/notification/NotificationRecord;->setRecordedInterruption(Z)V
+PLcom/android/server/notification/NotificationRecord;->setSeen()V
+PLcom/android/server/notification/NotificationRecord;->setTextChanged(Z)V
+PLcom/android/server/notification/NotificationRecord;->setVisibility(ZII)V
+PLcom/android/server/notification/NotificationRecord;->shortenTag(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/notification/NotificationUsageStats$1;-><init>(Lcom/android/server/notification/NotificationUsageStats;Landroid/os/Looper;)V
+PLcom/android/server/notification/NotificationUsageStats$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->countApiUse(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->emit()V
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->getEnqueueRate(J)F
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->getPrevious()Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->isAlertRateLimited()Z
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->maybeCount(Ljava/lang/String;I)V
+PLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->updateInterarrivalEstimate(J)V
+PLcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;->increment(I)V
+PLcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;->maybeCount(Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;)V
+PLcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;->update(Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog$1;-><init>(Lcom/android/server/notification/NotificationUsageStats$SQLiteLog;Landroid/os/Looper;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog$2;-><init>(Lcom/android/server/notification/NotificationUsageStats$SQLiteLog;Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog$2;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->access$000(Lcom/android/server/notification/NotificationUsageStats$SQLiteLog;JILcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->logClicked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->logPosted(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->logRemoved(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->putNotificationDetails(Lcom/android/server/notification/NotificationRecord;Landroid/content/ContentValues;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->putNotificationIdentifiers(Lcom/android/server/notification/NotificationRecord;Landroid/content/ContentValues;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->putPosttimeVisibility(Lcom/android/server/notification/NotificationRecord;Landroid/content/ContentValues;)V
+PLcom/android/server/notification/NotificationUsageStats$SQLiteLog;->writeEvent(JILcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;-><init>()V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->finish()V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->getCurrentAirtimeExpandedMs()J
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->getCurrentAirtimeMs()J
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->getCurrentPosttimeMs()J
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->onClick()V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->onExpansionChanged(ZZ)V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->onRemoved()V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->onVisibilityChanged(Z)V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->updateFrom(Lcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;)V
+PLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->updateVisiblyExpandedStats()V
+PLcom/android/server/notification/NotificationUsageStats;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/NotificationUsageStats;->emit()V
+PLcom/android/server/notification/NotificationUsageStats;->isAlertRateLimited(Ljava/lang/String;)Z
+PLcom/android/server/notification/NotificationUsageStats;->registerClickedByUser(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats;->registerEnqueuedByApp(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationUsageStats;->registerOverCountQuota(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationUsageStats;->registerOverRateQuota(Ljava/lang/String;)V
+PLcom/android/server/notification/NotificationUsageStats;->registerPostedByApp(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/NotificationUsageStats;->registerRemovedByApp(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/PriorityExtractor;-><init>()V
+PLcom/android/server/notification/PriorityExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/PriorityExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/PriorityExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/PropConfig;->getStringArray(Landroid/content/Context;Ljava/lang/String;I)[Ljava/lang/String;
+PLcom/android/server/notification/RankingHelper$Record;-><init>()V
+PLcom/android/server/notification/RankingHelper$Record;-><init>(Lcom/android/server/notification/RankingHelper$1;)V
+PLcom/android/server/notification/RankingHelper;-><init>(Landroid/content/Context;Landroid/content/pm/PackageManager;Lcom/android/server/notification/RankingHandler;Lcom/android/server/notification/ZenModeHelper;Lcom/android/server/notification/NotificationUsageStats;[Ljava/lang/String;)V
+PLcom/android/server/notification/RankingHelper;->clearLockedFields(Landroid/app/NotificationChannel;)V
+PLcom/android/server/notification/RankingHelper;->createDefaultChannelIfNeeded(Lcom/android/server/notification/RankingHelper$Record;)V
+PLcom/android/server/notification/RankingHelper;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;ZZ)V
+PLcom/android/server/notification/RankingHelper;->createNotificationChannelGroup(Ljava/lang/String;ILandroid/app/NotificationChannelGroup;Z)V
+PLcom/android/server/notification/RankingHelper;->deleteDefaultChannelIfNeeded(Lcom/android/server/notification/RankingHelper$Record;)V
+PLcom/android/server/notification/RankingHelper;->deleteNotificationChannel(Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/notification/RankingHelper;->getBlockedChannelCount(Ljava/lang/String;I)I
+PLcom/android/server/notification/RankingHelper;->getChannelGroupLog(Ljava/lang/String;Ljava/lang/String;)Landroid/metrics/LogMaker;
+PLcom/android/server/notification/RankingHelper;->getChannelLog(Landroid/app/NotificationChannel;Ljava/lang/String;)Landroid/metrics/LogMaker;
+PLcom/android/server/notification/RankingHelper;->getDeletedChannelCount(Ljava/lang/String;I)I
+PLcom/android/server/notification/RankingHelper;->getImportance(Ljava/lang/String;I)I
+PLcom/android/server/notification/RankingHelper;->getIsAppImportanceLocked(Ljava/lang/String;I)Z
+PLcom/android/server/notification/RankingHelper;->getNotificationChannelGroup(Ljava/lang/String;Ljava/lang/String;I)Landroid/app/NotificationChannelGroup;
+PLcom/android/server/notification/RankingHelper;->getNotificationChannelGroups(Ljava/lang/String;IZZ)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/RankingHelper;->getNotificationChannels(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/notification/RankingHelper;->getRecord(Ljava/lang/String;I)Lcom/android/server/notification/RankingHelper$Record;
+PLcom/android/server/notification/RankingHelper;->isGroupBlocked(Ljava/lang/String;ILjava/lang/String;)Z
+PLcom/android/server/notification/RankingHelper;->onPackagesChanged(ZI[Ljava/lang/String;[I)V
+PLcom/android/server/notification/RankingHelper;->onlyHasDefaultChannel(Ljava/lang/String;I)Z
+PLcom/android/server/notification/RankingHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;Z)V
+PLcom/android/server/notification/RankingHelper;->setEnabled(Ljava/lang/String;IZ)V
+PLcom/android/server/notification/RankingHelper;->setImportance(Ljava/lang/String;II)V
+PLcom/android/server/notification/RankingHelper;->shouldHaveDefaultChannel(Lcom/android/server/notification/RankingHelper$Record;)Z
+PLcom/android/server/notification/RankingHelper;->updateBadgingEnabled()V
+PLcom/android/server/notification/RankingHelper;->updateChannelsBypassingDnd()V
+PLcom/android/server/notification/RankingReconsideration;-><init>(Ljava/lang/String;J)V
+PLcom/android/server/notification/RankingReconsideration;->getDelay(Ljava/util/concurrent/TimeUnit;)J
+PLcom/android/server/notification/RankingReconsideration;->getKey()Ljava/lang/String;
+PLcom/android/server/notification/RateEstimator;-><init>()V
+PLcom/android/server/notification/RateEstimator;->getInterarrivalEstimate(J)D
+PLcom/android/server/notification/RateEstimator;->getRate(J)F
+PLcom/android/server/notification/RateEstimator;->update(J)F
+PLcom/android/server/notification/ScheduleConditionProvider$1;-><init>(Lcom/android/server/notification/ScheduleConditionProvider;)V
+PLcom/android/server/notification/ScheduleConditionProvider$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/notification/ScheduleConditionProvider;-><init>()V
+PLcom/android/server/notification/ScheduleConditionProvider;->access$100(Lcom/android/server/notification/ScheduleConditionProvider;)V
+PLcom/android/server/notification/ScheduleConditionProvider;->asInterface()Landroid/service/notification/IConditionProvider;
+PLcom/android/server/notification/ScheduleConditionProvider;->attachBase(Landroid/content/Context;)V
+PLcom/android/server/notification/ScheduleConditionProvider;->conditionSnoozed(Landroid/net/Uri;)Z
+PLcom/android/server/notification/ScheduleConditionProvider;->createCondition(Landroid/net/Uri;ILjava/lang/String;)Landroid/service/notification/Condition;
+PLcom/android/server/notification/ScheduleConditionProvider;->evaluateSubscriptionLocked(Landroid/net/Uri;Landroid/service/notification/ScheduleCalendar;JJ)Landroid/service/notification/Condition;
+PLcom/android/server/notification/ScheduleConditionProvider;->evaluateSubscriptions()V
+PLcom/android/server/notification/ScheduleConditionProvider;->getComponent()Landroid/content/ComponentName;
+PLcom/android/server/notification/ScheduleConditionProvider;->getNextAlarm()J
+PLcom/android/server/notification/ScheduleConditionProvider;->isValidConditionId(Landroid/net/Uri;)Z
+PLcom/android/server/notification/ScheduleConditionProvider;->onBootComplete()V
+PLcom/android/server/notification/ScheduleConditionProvider;->onConnected()V
+PLcom/android/server/notification/ScheduleConditionProvider;->onSubscribe(Landroid/net/Uri;)V
+PLcom/android/server/notification/ScheduleConditionProvider;->readSnoozed()V
+PLcom/android/server/notification/ScheduleConditionProvider;->removeSnoozed(Landroid/net/Uri;)V
+PLcom/android/server/notification/ScheduleConditionProvider;->saveSnoozedLocked()V
+PLcom/android/server/notification/ScheduleConditionProvider;->setRegistered(Z)V
+PLcom/android/server/notification/ScheduleConditionProvider;->updateAlarm(JJ)V
+PLcom/android/server/notification/SnoozeHelper$1;-><init>(Lcom/android/server/notification/SnoozeHelper;)V
+PLcom/android/server/notification/SnoozeHelper;-><init>(Landroid/content/Context;Lcom/android/server/notification/SnoozeHelper$Callback;Lcom/android/server/notification/ManagedServices$UserProfiles;)V
+PLcom/android/server/notification/SnoozeHelper;->cancel(ILjava/lang/String;)Z
+PLcom/android/server/notification/SnoozeHelper;->cancel(ILjava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/notification/SnoozeHelper;->getSnoozed(ILjava/lang/String;)Ljava/util/Collection;
+PLcom/android/server/notification/SnoozeHelper;->isSnoozed(ILjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/notification/SnoozeHelper;->repostGroupSummary(Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/notification/SystemConditionProviderService;-><init>()V
+PLcom/android/server/notification/SystemConditionProviderService;->formatDuration(J)Ljava/lang/String;
+PLcom/android/server/notification/SystemConditionProviderService;->ts(J)Ljava/lang/String;
+PLcom/android/server/notification/ValidateNotificationPeople$1;-><init>(Lcom/android/server/notification/ValidateNotificationPeople;Landroid/os/Handler;)V
+PLcom/android/server/notification/ValidateNotificationPeople$1;->onChange(ZLandroid/net/Uri;I)V
+PLcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;-><init>(Lcom/android/server/notification/ValidateNotificationPeople;Landroid/content/Context;Ljava/lang/String;Ljava/util/LinkedList;)V
+PLcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;-><init>(Lcom/android/server/notification/ValidateNotificationPeople;Landroid/content/Context;Ljava/lang/String;Ljava/util/LinkedList;Lcom/android/server/notification/ValidateNotificationPeople$1;)V
+PLcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;->applyChangesLocked(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;->setRecord(Lcom/android/server/notification/NotificationRecord;)V
+PLcom/android/server/notification/ValidateNotificationPeople;-><init>()V
+PLcom/android/server/notification/ValidateNotificationPeople;->access$100(Lcom/android/server/notification/ValidateNotificationPeople;)I
+PLcom/android/server/notification/ValidateNotificationPeople;->access$1000(Lcom/android/server/notification/ValidateNotificationPeople;)Lcom/android/server/notification/NotificationUsageStats;
+PLcom/android/server/notification/ValidateNotificationPeople;->access$108(Lcom/android/server/notification/ValidateNotificationPeople;)I
+PLcom/android/server/notification/ValidateNotificationPeople;->access$200()Z
+PLcom/android/server/notification/ValidateNotificationPeople;->access$700(Lcom/android/server/notification/ValidateNotificationPeople;Landroid/content/Context;Ljava/lang/String;)Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;
+PLcom/android/server/notification/ValidateNotificationPeople;->access$900(Lcom/android/server/notification/ValidateNotificationPeople;ILjava/lang/String;)Ljava/lang/String;
+PLcom/android/server/notification/ValidateNotificationPeople;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/ValidateNotificationPeople;->resolveEmailContact(Landroid/content/Context;Ljava/lang/String;)Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;
+PLcom/android/server/notification/ValidateNotificationPeople;->searchContacts(Landroid/content/Context;Landroid/net/Uri;)Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;
+PLcom/android/server/notification/ValidateNotificationPeople;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/ValidateNotificationPeople;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/VisibilityExtractor;-><init>()V
+PLcom/android/server/notification/VisibilityExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/VisibilityExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/VisibilityExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/ZenLog;->append(ILjava/lang/String;)V
+PLcom/android/server/notification/ZenLog;->subscribeResult(Landroid/service/notification/IConditionProvider;Landroid/os/RemoteException;)Ljava/lang/String;
+PLcom/android/server/notification/ZenLog;->traceConfig(Ljava/lang/String;Landroid/service/notification/ZenModeConfig;Landroid/service/notification/ZenModeConfig;)V
+PLcom/android/server/notification/ZenLog;->traceSetZenMode(ILjava/lang/String;)V
+PLcom/android/server/notification/ZenLog;->traceSubscribe(Landroid/net/Uri;Landroid/service/notification/IConditionProvider;Landroid/os/RemoteException;)V
+PLcom/android/server/notification/ZenLog;->typeToString(I)Ljava/lang/String;
+PLcom/android/server/notification/ZenLog;->zenModeToString(I)Ljava/lang/String;
+PLcom/android/server/notification/ZenModeConditions;-><init>(Lcom/android/server/notification/ZenModeHelper;Lcom/android/server/notification/ConditionProviders;)V
+PLcom/android/server/notification/ZenModeConditions;->evaluateConfig(Landroid/service/notification/ZenModeConfig;Z)V
+PLcom/android/server/notification/ZenModeConditions;->evaluateRule(Landroid/service/notification/ZenModeConfig$ZenRule;Landroid/util/ArraySet;Z)V
+PLcom/android/server/notification/ZenModeConditions;->onBootComplete()V
+PLcom/android/server/notification/ZenModeConditions;->onConditionChanged(Landroid/net/Uri;Landroid/service/notification/Condition;)V
+PLcom/android/server/notification/ZenModeConditions;->onServiceAdded(Landroid/content/ComponentName;)V
+PLcom/android/server/notification/ZenModeConditions;->onUserSwitched()V
+PLcom/android/server/notification/ZenModeConditions;->updateCondition(Landroid/net/Uri;Landroid/service/notification/Condition;Landroid/service/notification/ZenModeConfig$ZenRule;)Z
+PLcom/android/server/notification/ZenModeConditions;->updateSnoozing(Landroid/service/notification/ZenModeConfig$ZenRule;)Z
+PLcom/android/server/notification/ZenModeExtractor;-><init>()V
+PLcom/android/server/notification/ZenModeExtractor;->initialize(Landroid/content/Context;Lcom/android/server/notification/NotificationUsageStats;)V
+PLcom/android/server/notification/ZenModeExtractor;->setConfig(Lcom/android/server/notification/RankingConfig;)V
+PLcom/android/server/notification/ZenModeExtractor;->setZenHelper(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/ZenModeFiltering$RepeatCallers;-><init>()V
+PLcom/android/server/notification/ZenModeFiltering$RepeatCallers;-><init>(Lcom/android/server/notification/ZenModeFiltering$1;)V
+PLcom/android/server/notification/ZenModeFiltering;-><init>(Landroid/content/Context;)V
+PLcom/android/server/notification/ZenModeHelper$Callback;-><init>()V
+PLcom/android/server/notification/ZenModeHelper$Callback;->onConfigChanged()V
+PLcom/android/server/notification/ZenModeHelper$Callback;->onPolicyChanged()V
+PLcom/android/server/notification/ZenModeHelper$H$ConfigMessageData;-><init>(Lcom/android/server/notification/ZenModeHelper$H;Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper$H;-><init>(Lcom/android/server/notification/ZenModeHelper;Landroid/os/Looper;)V
+PLcom/android/server/notification/ZenModeHelper$H;-><init>(Lcom/android/server/notification/ZenModeHelper;Landroid/os/Looper;Lcom/android/server/notification/ZenModeHelper$1;)V
+PLcom/android/server/notification/ZenModeHelper$H;->access$200(Lcom/android/server/notification/ZenModeHelper$H;)V
+PLcom/android/server/notification/ZenModeHelper$H;->access$300(Lcom/android/server/notification/ZenModeHelper$H;Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper$H;->access$400(Lcom/android/server/notification/ZenModeHelper$H;)V
+PLcom/android/server/notification/ZenModeHelper$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/notification/ZenModeHelper$H;->postApplyConfig(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper$H;->postDispatchOnZenModeChanged()V
+PLcom/android/server/notification/ZenModeHelper$H;->postMetricsTimer()V
+PLcom/android/server/notification/ZenModeHelper$Metrics;-><init>(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/ZenModeHelper$Metrics;-><init>(Lcom/android/server/notification/ZenModeHelper;Lcom/android/server/notification/ZenModeHelper$1;)V
+PLcom/android/server/notification/ZenModeHelper$Metrics;->emit()V
+PLcom/android/server/notification/ZenModeHelper$Metrics;->onZenModeChanged()V
+PLcom/android/server/notification/ZenModeHelper$RingerModeDelegate;-><init>(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/ZenModeHelper$RingerModeDelegate;->getRingerModeAffectedStreams(I)I
+PLcom/android/server/notification/ZenModeHelper$RingerModeDelegate;->onSetRingerModeInternal(IILjava/lang/String;ILandroid/media/VolumePolicy;)I
+PLcom/android/server/notification/ZenModeHelper$SettingsObserver;-><init>(Lcom/android/server/notification/ZenModeHelper;Landroid/os/Handler;)V
+PLcom/android/server/notification/ZenModeHelper$SettingsObserver;->observe()V
+PLcom/android/server/notification/ZenModeHelper$SettingsObserver;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/notification/ZenModeHelper$SettingsObserver;->update(Landroid/net/Uri;)V
+PLcom/android/server/notification/ZenModeHelper;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/notification/ConditionProviders;)V
+PLcom/android/server/notification/ZenModeHelper;->access$1000(Lcom/android/server/notification/ZenModeHelper;)V
+PLcom/android/server/notification/ZenModeHelper;->access$1300(Lcom/android/server/notification/ZenModeHelper;Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper;->access$500(Lcom/android/server/notification/ZenModeHelper;Ljava/lang/Integer;)V
+PLcom/android/server/notification/ZenModeHelper;->access$700(Lcom/android/server/notification/ZenModeHelper;)Landroid/content/Context;
+PLcom/android/server/notification/ZenModeHelper;->access$800(Lcom/android/server/notification/ZenModeHelper;)I
+PLcom/android/server/notification/ZenModeHelper;->access$900(Lcom/android/server/notification/ZenModeHelper;)Lcom/android/server/notification/ZenModeHelper$H;
+PLcom/android/server/notification/ZenModeHelper;->addCallback(Lcom/android/server/notification/ZenModeHelper$Callback;)V
+PLcom/android/server/notification/ZenModeHelper;->appendDefaultEventRules(Landroid/service/notification/ZenModeConfig;)V
+PLcom/android/server/notification/ZenModeHelper;->appendDefaultEveryNightRule(Landroid/service/notification/ZenModeConfig;)V
+PLcom/android/server/notification/ZenModeHelper;->appendDefaultRules(Landroid/service/notification/ZenModeConfig;)V
+PLcom/android/server/notification/ZenModeHelper;->applyConfig(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper;->applyRestrictions()V
+PLcom/android/server/notification/ZenModeHelper;->applyRestrictions(ZI)V
+PLcom/android/server/notification/ZenModeHelper;->applyZenToRingerMode()V
+PLcom/android/server/notification/ZenModeHelper;->canManageAutomaticZenRule(Landroid/service/notification/ZenModeConfig$ZenRule;)Z
+PLcom/android/server/notification/ZenModeHelper;->cleanUpZenRules()V
+PLcom/android/server/notification/ZenModeHelper;->computeZenMode()I
+PLcom/android/server/notification/ZenModeHelper;->dispatchOnConfigChanged()V
+PLcom/android/server/notification/ZenModeHelper;->dispatchOnPolicyChanged()V
+PLcom/android/server/notification/ZenModeHelper;->dispatchOnZenModeChanged()V
+PLcom/android/server/notification/ZenModeHelper;->evaluateZenMode(Ljava/lang/String;Z)Z
+PLcom/android/server/notification/ZenModeHelper;->getConfig()Landroid/service/notification/ZenModeConfig;
+PLcom/android/server/notification/ZenModeHelper;->getDefaultRuleNames()V
+PLcom/android/server/notification/ZenModeHelper;->getZenMode()I
+PLcom/android/server/notification/ZenModeHelper;->getZenModeListenerInterruptionFilter()I
+PLcom/android/server/notification/ZenModeHelper;->getZenModeSetting()I
+PLcom/android/server/notification/ZenModeHelper;->getZenRules()Ljava/util/List;
+PLcom/android/server/notification/ZenModeHelper;->initZenMode()V
+PLcom/android/server/notification/ZenModeHelper;->isCall(Lcom/android/server/notification/NotificationRecord;)Z
+PLcom/android/server/notification/ZenModeHelper;->loadConfigForUser(ILjava/lang/String;)V
+PLcom/android/server/notification/ZenModeHelper;->onSystemReady()V
+PLcom/android/server/notification/ZenModeHelper;->onUserSwitched(I)V
+PLcom/android/server/notification/ZenModeHelper;->onUserUnlocked(I)V
+PLcom/android/server/notification/ZenModeHelper;->readDefaultConfig(Landroid/content/res/Resources;)Landroid/service/notification/ZenModeConfig;
+PLcom/android/server/notification/ZenModeHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;Z)V
+PLcom/android/server/notification/ZenModeHelper;->setConfig(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;)V
+PLcom/android/server/notification/ZenModeHelper;->setConfigLocked(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;)Z
+PLcom/android/server/notification/ZenModeHelper;->setConfigLocked(Landroid/service/notification/ZenModeConfig;Ljava/lang/String;Z)Z
+PLcom/android/server/notification/ZenModeHelper;->setDefaultZenRules(Landroid/content/Context;)V
+PLcom/android/server/notification/ZenModeHelper;->setManualZenMode(ILandroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/notification/ZenModeHelper;->setManualZenMode(ILandroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/notification/ZenModeHelper;->setPreviousRingerModeSetting(Ljava/lang/Integer;)V
+PLcom/android/server/notification/ZenModeHelper;->setZenModeSetting(I)V
+PLcom/android/server/notification/ZenModeHelper;->showZenUpgradeNotification(I)V
+PLcom/android/server/notification/ZenModeHelper;->updateRingerModeAffectedStreams()V
+PLcom/android/server/notification/ZenModeHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;ZLjava/lang/Integer;)V
+PLcom/android/server/oemlock/-$$Lambda$VendorLock$Xnx-_jv8ufdo_3b8_MqM0reCecE;-><init>([Ljava/lang/Integer;[Ljava/lang/Boolean;)V
+PLcom/android/server/oemlock/-$$Lambda$VendorLock$Xnx-_jv8ufdo_3b8_MqM0reCecE;->onValues(IZ)V
+PLcom/android/server/oemlock/OemLock;-><init>()V
+PLcom/android/server/oemlock/OemLockService$1;-><init>(Lcom/android/server/oemlock/OemLockService;)V
+PLcom/android/server/oemlock/OemLockService$1;->onUserRestrictionsChanged(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/oemlock/OemLockService$2;-><init>(Lcom/android/server/oemlock/OemLockService;)V
+PLcom/android/server/oemlock/OemLockService$2;->isDeviceOemUnlocked()Z
+PLcom/android/server/oemlock/OemLockService$2;->isOemUnlockAllowed()Z
+PLcom/android/server/oemlock/OemLockService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/oemlock/OemLockService;-><init>(Landroid/content/Context;Lcom/android/server/oemlock/OemLock;)V
+PLcom/android/server/oemlock/OemLockService;->access$000(Lcom/android/server/oemlock/OemLockService;)Lcom/android/server/oemlock/OemLock;
+PLcom/android/server/oemlock/OemLockService;->access$100(Lcom/android/server/oemlock/OemLockService;Z)V
+PLcom/android/server/oemlock/OemLockService;->access$600(Lcom/android/server/oemlock/OemLockService;)V
+PLcom/android/server/oemlock/OemLockService;->enforceOemUnlockReadPermission()V
+PLcom/android/server/oemlock/OemLockService;->getOemLock(Landroid/content/Context;)Lcom/android/server/oemlock/OemLock;
+PLcom/android/server/oemlock/OemLockService;->onStart()V
+PLcom/android/server/oemlock/OemLockService;->setPersistentDataBlockOemUnlockAllowedBit(Z)V
+PLcom/android/server/oemlock/VendorLock;-><init>(Landroid/content/Context;Landroid/hardware/oemlock/V1_0/IOemLock;)V
+PLcom/android/server/oemlock/VendorLock;->getOemLockHalService()Landroid/hardware/oemlock/V1_0/IOemLock;
+PLcom/android/server/oemlock/VendorLock;->isOemUnlockAllowedByCarrier()Z
+PLcom/android/server/oemlock/VendorLock;->lambda$isOemUnlockAllowedByCarrier$0([Ljava/lang/Integer;[Ljava/lang/Boolean;IZ)V
+PLcom/android/server/om/-$$Lambda$OverlayManagerService$OverlayChangeListener$u9oeN2C0PDMo0pYiLqfMBkwuMNA;-><init>(Lcom/android/server/om/OverlayManagerService$OverlayChangeListener;ILjava/lang/String;)V
+PLcom/android/server/om/-$$Lambda$OverlayManagerService$OverlayChangeListener$u9oeN2C0PDMo0pYiLqfMBkwuMNA;->run()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerService$YGMOwF5u3kvuRAEYnGl_xpXcVC4;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/-$$Lambda$OverlayManagerService$YGMOwF5u3kvuRAEYnGl_xpXcVC4;->run()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerService$mX9VnR-_2XOwgKo9C81uZcpqETM;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/-$$Lambda$OverlayManagerService$mX9VnR-_2XOwgKo9C81uZcpqETM;->run()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$ATr0DZmWpSWdKD0COw4t2qS-DRk;-><init>()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$ATr0DZmWpSWdKD0COw4t2qS-DRk;->test(Ljava/lang/Object;)Z
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$IkswmT9ZZJXmNAztGRVrD3hODMw;-><init>()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$IkswmT9ZZJXmNAztGRVrD3hODMw;->test(Ljava/lang/Object;)Z
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$WYtPK6Ebqjgxm8_8Cot-ijv_z_8;-><init>()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$WYtPK6Ebqjgxm8_8Cot-ijv_z_8;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$bX7CTrJVR3B_eQmD43OOHtRIxgw;-><init>(I)V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$bX7CTrJVR3B_eQmD43OOHtRIxgw;->test(Ljava/lang/Object;)Z
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$bXuJGR0fITXNwGnQfQHv9KS-XgY;-><init>()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$bXuJGR0fITXNwGnQfQHv9KS-XgY;->get()Ljava/lang/Object;
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$jZUujzDxrP0hpAqUxnqEf-b-nQc;-><init>()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$jZUujzDxrP0hpAqUxnqEf-b-nQc;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$mq-CHAn1jQBVquxuOUv0eQANHIY;-><init>(Ljava/lang/String;)V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$mq-CHAn1jQBVquxuOUv0eQANHIY;->test(Ljava/lang/Object;)Z
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$sx0Nyvq91kCH_A-4Ctf09G_0u9M;-><init>()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$sx0Nyvq91kCH_A-4Ctf09G_0u9M;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$vXm2C4y9Q-F5yYZNimB-Lr6w-oI;-><init>()V
+PLcom/android/server/om/-$$Lambda$OverlayManagerSettings$vXm2C4y9Q-F5yYZNimB-Lr6w-oI;->applyAsInt(Ljava/lang/Object;)I
+PLcom/android/server/om/IdmapManager;-><init>(Lcom/android/server/pm/Installer;)V
+PLcom/android/server/om/IdmapManager;->createIdmap(Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;I)Z
+PLcom/android/server/om/IdmapManager;->getIdmapPath(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/om/IdmapManager;->idmapExists(Landroid/content/pm/PackageInfo;I)Z
+PLcom/android/server/om/OverlayManagerService$1;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService$1;->getOverlayInfo(Ljava/lang/String;I)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerService$1;->getOverlayInfosForTarget(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/om/OverlayManagerService$1;->handleIncomingUser(ILjava/lang/String;)I
+PLcom/android/server/om/OverlayManagerService$OverlayChangeListener;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService$OverlayChangeListener;-><init>(Lcom/android/server/om/OverlayManagerService;Lcom/android/server/om/OverlayManagerService$1;)V
+PLcom/android/server/om/OverlayManagerService$OverlayChangeListener;->lambda$onOverlaysChanged$0(Lcom/android/server/om/OverlayManagerService$OverlayChangeListener;ILjava/lang/String;)V
+PLcom/android/server/om/OverlayManagerService$OverlayChangeListener;->onOverlaysChanged(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;-><init>()V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->cachePackageInfo(Ljava/lang/String;ILandroid/content/pm/PackageInfo;)V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->forgetPackageInfo(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->getCachedPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->getOverlayPackages(I)Ljava/util/List;
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+PLcom/android/server/om/OverlayManagerService$PackageManagerHelper;->getPackageInfo(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;Lcom/android/server/om/OverlayManagerService$1;)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;->onPackageAdded(Ljava/lang/String;[I)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;->onPackageChanged(Ljava/lang/String;[I)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;->onPackageUpgraded(Ljava/lang/String;[I)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;->onPackageUpgrading(Ljava/lang/String;[I)V
+PLcom/android/server/om/OverlayManagerService$PackageReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/om/OverlayManagerService$UserReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService$UserReceiver;-><init>(Lcom/android/server/om/OverlayManagerService;Lcom/android/server/om/OverlayManagerService$1;)V
+PLcom/android/server/om/OverlayManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;)V
+PLcom/android/server/om/OverlayManagerService;->access$200(Lcom/android/server/om/OverlayManagerService;)Ljava/lang/Object;
+PLcom/android/server/om/OverlayManagerService;->access$300(Lcom/android/server/om/OverlayManagerService;)Lcom/android/server/om/OverlayManagerService$PackageManagerHelper;
+PLcom/android/server/om/OverlayManagerService;->access$400(Lcom/android/server/om/OverlayManagerService;)Lcom/android/server/om/OverlayManagerServiceImpl;
+PLcom/android/server/om/OverlayManagerService;->access$600(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService;->access$700(Lcom/android/server/om/OverlayManagerService;ILjava/lang/String;)V
+PLcom/android/server/om/OverlayManagerService;->getDefaultOverlayPackages()[Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerService;->initIfNeeded()V
+PLcom/android/server/om/OverlayManagerService;->lambda$new$0(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService;->lambda$schedulePersistSettings$1(Lcom/android/server/om/OverlayManagerService;)V
+PLcom/android/server/om/OverlayManagerService;->onBootPhase(I)V
+PLcom/android/server/om/OverlayManagerService;->onStart()V
+PLcom/android/server/om/OverlayManagerService;->onSwitchUser(I)V
+PLcom/android/server/om/OverlayManagerService;->restoreSettings()V
+PLcom/android/server/om/OverlayManagerService;->schedulePersistSettings()V
+PLcom/android/server/om/OverlayManagerService;->updateAssets(ILjava/lang/String;)V
+PLcom/android/server/om/OverlayManagerService;->updateAssets(ILjava/util/List;)V
+PLcom/android/server/om/OverlayManagerService;->updateOverlayPaths(ILjava/util/List;)V
+PLcom/android/server/om/OverlayManagerServiceImpl;-><init>(Lcom/android/server/om/OverlayManagerServiceImpl$PackageManagerHelper;Lcom/android/server/om/IdmapManager;Lcom/android/server/om/OverlayManagerSettings;[Ljava/lang/String;Lcom/android/server/om/OverlayManagerServiceImpl$OverlayChangeListener;)V
+PLcom/android/server/om/OverlayManagerServiceImpl;->calculateNewState(Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;II)I
+PLcom/android/server/om/OverlayManagerServiceImpl;->getEnabledOverlayPackageNames(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/om/OverlayManagerServiceImpl;->getOverlayInfo(Ljava/lang/String;I)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerServiceImpl;->getOverlayInfosForTarget(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/om/OverlayManagerServiceImpl;->mustReinitializeOverlay(Landroid/content/pm/PackageInfo;Landroid/content/om/OverlayInfo;)Z
+PLcom/android/server/om/OverlayManagerServiceImpl;->onTargetPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerServiceImpl;->onTargetPackageChanged(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerServiceImpl;->onTargetPackageUpgraded(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerServiceImpl;->onTargetPackageUpgrading(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerServiceImpl;->updateAllOverlaysForTarget(Ljava/lang/String;II)Z
+PLcom/android/server/om/OverlayManagerServiceImpl;->updateOverlaysForUser(I)Ljava/util/ArrayList;
+PLcom/android/server/om/OverlayManagerServiceImpl;->updateState(Ljava/lang/String;Ljava/lang/String;II)Z
+PLcom/android/server/om/OverlayManagerSettings$BadKeyException;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/om/OverlayManagerSettings$Serializer;->persist(Ljava/util/ArrayList;Ljava/io/OutputStream;)V
+PLcom/android/server/om/OverlayManagerSettings$Serializer;->persistRow(Lcom/android/internal/util/FastXmlSerializer;Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)V
+PLcom/android/server/om/OverlayManagerSettings$Serializer;->restore(Ljava/util/ArrayList;Ljava/io/InputStream;)V
+PLcom/android/server/om/OverlayManagerSettings$Serializer;->restoreRow(Lorg/xmlpull/v1/XmlPullParser;I)Lcom/android/server/om/OverlayManagerSettings$SettingsItem;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;-><init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;IZZILjava/lang/String;)V
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;-><init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZILjava/lang/String;)V
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$000(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Z)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$100(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1000(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1100(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1300(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1400(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1500(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1600(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1700(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1800(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1900(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$200(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$300(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$400(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Ljava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$500(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;Ljava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$600(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$700(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$800(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;I)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$900(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getOverlayInfo()Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getState()I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getTargetPackageName()Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->getUserId()I
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->invalidateCache()V
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->isEnabled()Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->isStatic()Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->setBaseCodePath(Ljava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->setCategory(Ljava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->setEnabled(Z)Z
+PLcom/android/server/om/OverlayManagerSettings$SettingsItem;->setState(I)Z
+PLcom/android/server/om/OverlayManagerSettings;-><init>()V
+PLcom/android/server/om/OverlayManagerSettings;->getEnabled(Ljava/lang/String;I)Z
+PLcom/android/server/om/OverlayManagerSettings;->getOverlayInfo(Ljava/lang/String;I)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings;->getOverlaysForTarget(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/om/OverlayManagerSettings;->getOverlaysForUser(I)Landroid/util/ArrayMap;
+PLcom/android/server/om/OverlayManagerSettings;->getState(Ljava/lang/String;I)I
+PLcom/android/server/om/OverlayManagerSettings;->getUsers()[I
+PLcom/android/server/om/OverlayManagerSettings;->init(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZILjava/lang/String;)V
+PLcom/android/server/om/OverlayManagerSettings;->lambda$bXuJGR0fITXNwGnQfQHv9KS-XgY()Landroid/util/ArrayMap;
+PLcom/android/server/om/OverlayManagerSettings;->lambda$getOverlaysForTarget$0(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings;->lambda$getOverlaysForTarget$1(Ljava/lang/Object;)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings;->lambda$getOverlaysForUser$2(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings;->lambda$getOverlaysForUser$3(Ljava/lang/Object;)Landroid/content/om/OverlayInfo;
+PLcom/android/server/om/OverlayManagerSettings;->lambda$getOverlaysForUser$4(Landroid/content/om/OverlayInfo;)Ljava/lang/String;
+PLcom/android/server/om/OverlayManagerSettings;->lambda$getUsers$5(Ljava/lang/Object;)I
+PLcom/android/server/om/OverlayManagerSettings;->lambda$selectWhereTarget$7(Ljava/lang/String;Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings;->lambda$selectWhereUser$6(ILcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+PLcom/android/server/om/OverlayManagerSettings;->persist(Ljava/io/OutputStream;)V
+PLcom/android/server/om/OverlayManagerSettings;->remove(Ljava/lang/String;I)Z
+PLcom/android/server/om/OverlayManagerSettings;->restore(Ljava/io/InputStream;)V
+PLcom/android/server/om/OverlayManagerSettings;->select(Ljava/lang/String;I)I
+PLcom/android/server/om/OverlayManagerSettings;->selectWhereTarget(Ljava/lang/String;I)Ljava/util/stream/Stream;
+PLcom/android/server/om/OverlayManagerSettings;->selectWhereUser(I)Ljava/util/stream/Stream;
+PLcom/android/server/om/OverlayManagerSettings;->setBaseCodePath(Ljava/lang/String;ILjava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings;->setCategory(Ljava/lang/String;ILjava/lang/String;)Z
+PLcom/android/server/om/OverlayManagerSettings;->setState(Ljava/lang/String;II)Z
+PLcom/android/server/os/-$$Lambda$SchedulingPolicyService$ao2OiSvvlyzmJ0li0c0nhHy-IDk;-><init>(Lcom/android/server/os/SchedulingPolicyService;)V
+PLcom/android/server/os/-$$Lambda$SchedulingPolicyService$ao2OiSvvlyzmJ0li0c0nhHy-IDk;->run()V
+PLcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;->getSerial()Ljava/lang/String;
+PLcom/android/server/os/SchedulingPolicyService$1;-><init>(Lcom/android/server/os/SchedulingPolicyService;)V
+PLcom/android/server/os/SchedulingPolicyService;-><init>()V
+PLcom/android/server/os/SchedulingPolicyService;->disableCpusetBoost(I)I
+PLcom/android/server/os/SchedulingPolicyService;->isPermitted()Z
+PLcom/android/server/os/SchedulingPolicyService;->lambda$new$0(Lcom/android/server/os/SchedulingPolicyService;)V
+PLcom/android/server/os/SchedulingPolicyService;->requestPriority(IIIZ)I
+PLcom/android/server/pm/-$$Lambda$InstantAppRegistry$BuKCbLr_MGBazMPl54-pWTuGHYY;-><init>(J)V
+PLcom/android/server/pm/-$$Lambda$InstantAppRegistry$o-Qxi7Gaam-yhhMK-IMWv499oME;-><init>(Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/-$$Lambda$InstantAppResolverConnection$D-JKXi4qrYjnPQMOwj8UtfZenps;-><init>(Lcom/android/server/pm/InstantAppResolverConnection;)V
+PLcom/android/server/pm/-$$Lambda$InstantAppResolverConnection$D-JKXi4qrYjnPQMOwj8UtfZenps;->run()V
+PLcom/android/server/pm/-$$Lambda$LauncherAppsService$LauncherAppsImpl$MyPackageMonitor$eTair5Mvr14v4M0nq9aQEW2cp-Y;-><init>(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;Ljava/lang/String;I)V
+PLcom/android/server/pm/-$$Lambda$LauncherAppsService$LauncherAppsImpl$MyPackageMonitor$eTair5Mvr14v4M0nq9aQEW2cp-Y;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$1IFDaSQRqG4pqlUtBm87Yzturic;-><init>(Lcom/android/server/pm/PackageManagerService;[Ljava/lang/String;I)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$1IFDaSQRqG4pqlUtBm87Yzturic;->runOrThrow()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$Iz1l7RVtATr5Ybl_zHeYuCbGMvA;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$Iz1l7RVtATr5Ybl_zHeYuCbGMvA;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$mOTJOturHO9FjzNA-qffT913E0M;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Ljava/util/ArrayList;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$mOTJOturHO9FjzNA-qffT913E0M;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$sJ5w9GfSftnZPyv5hBDxQkxDJMU;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/util/List;I)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$sJ5w9GfSftnZPyv5hBDxQkxDJMU;->run()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$yfOQ0T-7_IM-V0KeaeTUW5KgZRQ;-><init>(Lcom/android/server/pm/PackageManagerService;[Ljava/lang/String;I)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerService$yfOQ0T-7_IM-V0KeaeTUW5KgZRQ;->runOrThrow()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$QMV-UHbRIK26QMZL5iM27MchX7U;-><init>()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$QMV-UHbRIK26QMZL5iM27MchX7U;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$ePZ6rsJ05hJ2glmOqcq1_jX6J8w;-><init>()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$ePZ6rsJ05hJ2glmOqcq1_jX6J8w;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$fMBP3pPR7BB2hICieRxkdNG-3H8;-><init>(Lcom/android/server/pm/dex/DexManager;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$fMBP3pPR7BB2hICieRxkdNG-3H8;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$nPt0Hym3GvYeWA2vwfOLFDxZmCE;-><init>(Landroid/util/ArraySet;)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$nPt0Hym3GvYeWA2vwfOLFDxZmCE;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$p5q19y4-2x-i747j_hTNL1EMzt0;-><init>(J)V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$p5q19y4-2x-i747j_hTNL1EMzt0;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$whx96xO50U3fax1NRe1upTcx9jc;-><init>()V
+PLcom/android/server/pm/-$$Lambda$PackageManagerServiceUtils$whx96xO50U3fax1NRe1upTcx9jc;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$AUDgG57FGyGDUVDAjL-7cuiE0pM;-><init>(Lcom/android/server/pm/ShortcutBitmapSaver;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$AUDgG57FGyGDUVDAjL-7cuiE0pM;->run()V
+PLcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$xgjvZfaiKXavxgGCSta_eIdVBnk;-><init>(Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutBitmapSaver$xgjvZfaiKXavxgGCSta_eIdVBnk;->run()V
+PLcom/android/server/pm/-$$Lambda$ShortcutDumpFiles$rwmVVp6PnQCcurF7D6VzrdNqEdk;-><init>([B)V
+PLcom/android/server/pm/-$$Lambda$ShortcutDumpFiles$rwmVVp6PnQCcurF7D6VzrdNqEdk;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutPackage$ZN-r6tS0M7WKGK6nbXyJZPwNRGc;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutPackage$hEXnzlESoRjagj8Pd9f4PrqudKE;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutPackage$hEXnzlESoRjagj8Pd9f4PrqudKE;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/pm/-$$Lambda$ShortcutService$3$WghiV-HLnzJqZabObC5uHCmb960;-><init>(Lcom/android/server/pm/ShortcutService$3;I)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$3$WghiV-HLnzJqZabObC5uHCmb960;->run()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$5PQDuMeuJAK9L5YMuS3D3xeOzEc;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$5PQDuMeuJAK9L5YMuS3D3xeOzEc;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$DzwraUeMWDwA0XDfFxd3sGOsA0E;-><init>(Lcom/android/server/pm/ShortcutService;ILjava/lang/String;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$DzwraUeMWDwA0XDfFxd3sGOsA0E;->run()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$FW40Da1L1EZJ_usDX0ew1qRMmtc;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$FW40Da1L1EZJ_usDX0ew1qRMmtc;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$ShortcutService$K2g8Oho05j5S7zVOkoQrHzM_Gig;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$K2g8Oho05j5S7zVOkoQrHzM_Gig;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$ShortcutService$KKtB89b9du8RtyDY2LIMGlzZzzg;-><init>(Lcom/android/server/pm/ShortcutService;Ljava/util/ArrayList;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$KKtB89b9du8RtyDY2LIMGlzZzzg;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$LocalService$Q0t7aDuDFJ8HWAf1NHW1dGQjOf8;-><init>(Lcom/android/server/pm/ShortcutService$LocalService;ILjava/lang/String;Ljava/util/List;JLandroid/content/ComponentName;IILjava/util/ArrayList;III)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$LocalService$Q0t7aDuDFJ8HWAf1NHW1dGQjOf8;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$LocalService$ltDE7qm9grkumxffFI8cLCFpNqU;-><init>(JLandroid/util/ArraySet;Landroid/content/ComponentName;ZZZZ)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$LocalService$ltDE7qm9grkumxffFI8cLCFpNqU;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$ShortcutService$QFWliMhWloedhnaZCwVKaqKPVb4;-><init>(Lcom/android/server/pm/ShortcutService;JI)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$QFWliMhWloedhnaZCwVKaqKPVb4;->run()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$XepsJlzLd-VitYi8_ThhUsx37Ok;-><init>(Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutUser;I)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$XepsJlzLd-VitYi8_ThhUsx37Ok;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$bdUeaAkcePSCZBDxdJttl1FPOmI;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$bdUeaAkcePSCZBDxdJttl1FPOmI;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$qeFlXbEdNY-s36xnqPf5bs5axg0;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$qeFlXbEdNY-s36xnqPf5bs5axg0;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$vv6Ko6L2p38nn3EYcL5PZxcyRyk;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutService$vv6Ko6L2p38nn3EYcL5PZxcyRyk;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/-$$Lambda$ShortcutUser$XHWlvjfCvG1SoVwGHi3envhmtfM;-><init>(ILjava/lang/String;Ljava/util/function/Consumer;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutUser$XHWlvjfCvG1SoVwGHi3envhmtfM;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$ShortcutUser$bsc89E_40a5X2amehalpqawQ5hY;-><init>()V
+PLcom/android/server/pm/-$$Lambda$ShortcutUser$bsc89E_40a5X2amehalpqawQ5hY;->accept(Ljava/lang/Object;)V
+PLcom/android/server/pm/-$$Lambda$jZzCUQd1whVIqs_s1XMLbFqTP_E;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/-$$Lambda$jZzCUQd1whVIqs_s1XMLbFqTP_E;->run()V
+PLcom/android/server/pm/AbstractStatsBase$1;-><init>(Lcom/android/server/pm/AbstractStatsBase;Ljava/lang/String;Ljava/lang/Object;)V
+PLcom/android/server/pm/AbstractStatsBase$1;->run()V
+PLcom/android/server/pm/AbstractStatsBase;->access$000(Lcom/android/server/pm/AbstractStatsBase;Ljava/lang/Object;)V
+PLcom/android/server/pm/AbstractStatsBase;->access$100(Lcom/android/server/pm/AbstractStatsBase;)Ljava/util/concurrent/atomic/AtomicLong;
+PLcom/android/server/pm/AbstractStatsBase;->access$200(Lcom/android/server/pm/AbstractStatsBase;)Ljava/util/concurrent/atomic/AtomicBoolean;
+PLcom/android/server/pm/AbstractStatsBase;->getFile()Landroid/util/AtomicFile;
+PLcom/android/server/pm/AbstractStatsBase;->read(Ljava/lang/Object;)V
+PLcom/android/server/pm/AbstractStatsBase;->writeImpl(Ljava/lang/Object;)V
+PLcom/android/server/pm/BackgroundDexOptService$1;-><init>(Lcom/android/server/pm/BackgroundDexOptService;Ljava/lang/String;Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)V
+PLcom/android/server/pm/BackgroundDexOptService$1;->run()V
+PLcom/android/server/pm/BackgroundDexOptService$2;-><init>(Lcom/android/server/pm/BackgroundDexOptService;Ljava/lang/String;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;Landroid/app/job/JobParameters;)V
+PLcom/android/server/pm/BackgroundDexOptService$2;->run()V
+PLcom/android/server/pm/BackgroundDexOptService;-><init>()V
+PLcom/android/server/pm/BackgroundDexOptService;->abortIdleOptimizations(J)I
+PLcom/android/server/pm/BackgroundDexOptService;->access$000(Lcom/android/server/pm/BackgroundDexOptService;Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)V
+PLcom/android/server/pm/BackgroundDexOptService;->access$100(Lcom/android/server/pm/BackgroundDexOptService;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;Landroid/content/Context;)I
+PLcom/android/server/pm/BackgroundDexOptService;->getBatteryLevel()I
+PLcom/android/server/pm/BackgroundDexOptService;->getDowngradeUnusedAppsThresholdInMillis()J
+PLcom/android/server/pm/BackgroundDexOptService;->getLowStorageThreshold(Landroid/content/Context;)J
+PLcom/android/server/pm/BackgroundDexOptService;->idleOptimization(Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;Landroid/content/Context;)I
+PLcom/android/server/pm/BackgroundDexOptService;->isBackgroundDexoptDisabled()Z
+PLcom/android/server/pm/BackgroundDexOptService;->notifyPackageChanged(Ljava/lang/String;)V
+PLcom/android/server/pm/BackgroundDexOptService;->notifyPinService(Landroid/util/ArraySet;)V
+PLcom/android/server/pm/BackgroundDexOptService;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/pm/BackgroundDexOptService;->onStopJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/pm/BackgroundDexOptService;->optimizePackages(Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;JZLandroid/util/ArraySet;)I
+PLcom/android/server/pm/BackgroundDexOptService;->postBootUpdate(Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)V
+PLcom/android/server/pm/BackgroundDexOptService;->reconcileSecondaryDexFiles(Lcom/android/server/pm/dex/DexManager;)I
+PLcom/android/server/pm/BackgroundDexOptService;->runIdleOptimization(Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)Z
+PLcom/android/server/pm/BackgroundDexOptService;->runPostBootUpdate(Landroid/app/job/JobParameters;Lcom/android/server/pm/PackageManagerService;Landroid/util/ArraySet;)Z
+PLcom/android/server/pm/BackgroundDexOptService;->schedule(Landroid/content/Context;)V
+PLcom/android/server/pm/BackgroundDexOptService;->shouldDowngrade(J)Z
+PLcom/android/server/pm/CompilerStats$PackageStats;-><init>(Ljava/lang/String;)V
+PLcom/android/server/pm/CompilerStats$PackageStats;->access$000(Lcom/android/server/pm/CompilerStats$PackageStats;)Ljava/util/Map;
+PLcom/android/server/pm/CompilerStats$PackageStats;->getPackageName()Ljava/lang/String;
+PLcom/android/server/pm/CompilerStats$PackageStats;->getStoredPathFromCodePath(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/CompilerStats$PackageStats;->setCompileTime(Ljava/lang/String;J)V
+PLcom/android/server/pm/CompilerStats;->createPackageStats(Ljava/lang/String;)Lcom/android/server/pm/CompilerStats$PackageStats;
+PLcom/android/server/pm/CompilerStats;->getOrCreatePackageStats(Ljava/lang/String;)Lcom/android/server/pm/CompilerStats$PackageStats;
+PLcom/android/server/pm/CompilerStats;->maybeWriteAsync()Z
+PLcom/android/server/pm/CompilerStats;->read()V
+PLcom/android/server/pm/CompilerStats;->read(Ljava/io/Reader;)Z
+PLcom/android/server/pm/CompilerStats;->readInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/CompilerStats;->readInternal(Ljava/lang/Void;)V
+PLcom/android/server/pm/CompilerStats;->write(Ljava/io/Writer;)V
+PLcom/android/server/pm/CompilerStats;->writeInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/CompilerStats;->writeInternal(Ljava/lang/Void;)V
+PLcom/android/server/pm/CrossProfileAppsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/CrossProfileAppsService;->onStart()V
+PLcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/CrossProfileAppsServiceImpl;-><init>(Landroid/content/Context;Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;)V
+PLcom/android/server/pm/DumpState;-><init>()V
+PLcom/android/server/pm/DumpState;->isDumping(I)Z
+PLcom/android/server/pm/DumpState;->onTitlePrinted()Z
+PLcom/android/server/pm/Installer$InstallerException;-><init>(Ljava/lang/String;)V
+PLcom/android/server/pm/Installer$InstallerException;->from(Ljava/lang/Exception;)Lcom/android/server/pm/Installer$InstallerException;
+PLcom/android/server/pm/Installer;->clearAppData(Ljava/lang/String;Ljava/lang/String;IIJ)V
+PLcom/android/server/pm/Installer;->copySystemProfile(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/Installer;->createAppData(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)J
+PLcom/android/server/pm/Installer;->createOatDir(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->createProfileSnapshot(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/Installer;->createUserData(Ljava/lang/String;III)V
+PLcom/android/server/pm/Installer;->destroyAppData(Ljava/lang/String;Ljava/lang/String;IIJ)V
+PLcom/android/server/pm/Installer;->destroyProfileSnapshot(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->dexopt(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->fixupAppData(Ljava/lang/String;I)V
+PLcom/android/server/pm/Installer;->getAppSize(Ljava/lang/String;[Ljava/lang/String;III[J[Ljava/lang/String;Landroid/content/pm/PackageStats;)V
+PLcom/android/server/pm/Installer;->getExternalSize(Ljava/lang/String;II[I)[J
+PLcom/android/server/pm/Installer;->getUserSize(Ljava/lang/String;II[ILandroid/content/pm/PackageStats;)V
+PLcom/android/server/pm/Installer;->hashSecondaryDexFile(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;I)[B
+PLcom/android/server/pm/Installer;->idmap(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/Installer;->isQuotaSupported(Ljava/lang/String;)Z
+PLcom/android/server/pm/Installer;->linkNativeLibraryDirectory(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/Installer;->markBootComplete(Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->mergeProfiles(ILjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/Installer;->moveAb(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/Installer;->prepareAppProfile(Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/Installer;->reconcileSecondaryDexFile(Ljava/lang/String;Ljava/lang/String;I[Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/pm/Installer;->setAppQuota(Ljava/lang/String;IIJ)V
+PLcom/android/server/pm/Installer;->setWarnIfHeld(Ljava/lang/Object;)V
+PLcom/android/server/pm/InstantAppRegistry;->getInstantApplicationDir(Ljava/lang/String;I)Ljava/io/File;
+PLcom/android/server/pm/InstantAppRegistry;->getInstantApplicationsDir(I)Ljava/io/File;
+PLcom/android/server/pm/InstantAppRegistry;->getInstantAppsLPr(I)Ljava/util/List;
+PLcom/android/server/pm/InstantAppRegistry;->getUninstalledInstantAppStatesLPr(I)Ljava/util/List;
+PLcom/android/server/pm/InstantAppRegistry;->getUninstalledInstantApplicationsLPr(I)Ljava/util/List;
+PLcom/android/server/pm/InstantAppRegistry;->isInstantAccessGranted(III)Z
+PLcom/android/server/pm/InstantAppRegistry;->onPackageInstalledLPw(Landroid/content/pm/PackageParser$Package;[I)V
+PLcom/android/server/pm/InstantAppRegistry;->parseMetadataFile(Ljava/io/File;)Lcom/android/server/pm/InstantAppRegistry$UninstalledInstantAppState;
+PLcom/android/server/pm/InstantAppRegistry;->peekInstantCookieFile(Ljava/lang/String;I)Ljava/io/File;
+PLcom/android/server/pm/InstantAppRegistry;->peekOrParseUninstalledInstantAppInfo(Ljava/lang/String;I)Landroid/content/pm/InstantAppInfo;
+PLcom/android/server/pm/InstantAppRegistry;->propagateInstantAppPermissionsIfNeeded(Landroid/content/pm/PackageParser$Package;I)V
+PLcom/android/server/pm/InstantAppRegistry;->pruneInstantApps()V
+PLcom/android/server/pm/InstantAppRegistry;->pruneInstantApps(JJJ)Z
+PLcom/android/server/pm/InstantAppRegistry;->removeUninstalledInstantAppStateLPw(Ljava/util/function/Predicate;I)V
+PLcom/android/server/pm/InstantAppResolver;->computeResolveFilters(Landroid/content/Intent;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Landroid/content/pm/InstantAppResolveInfo;)Ljava/util/List;
+PLcom/android/server/pm/InstantAppResolver;->doInstantAppResolutionPhaseOne(Lcom/android/server/pm/InstantAppResolverConnection;Landroid/content/pm/InstantAppRequest;)Landroid/content/pm/AuxiliaryResolveInfo;
+PLcom/android/server/pm/InstantAppResolver;->filterInstantAppIntent(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;ILjava/lang/String;Landroid/content/pm/InstantAppResolveInfo$InstantAppDigest;Ljava/lang/String;)Landroid/content/pm/AuxiliaryResolveInfo;
+PLcom/android/server/pm/InstantAppResolver;->getLogger()Lcom/android/internal/logging/MetricsLogger;
+PLcom/android/server/pm/InstantAppResolver;->logMetrics(IJLjava/lang/String;I)V
+PLcom/android/server/pm/InstantAppResolver;->sanitizeIntent(Landroid/content/Intent;)Landroid/content/Intent;
+PLcom/android/server/pm/InstantAppResolverConnection$ConnectionException;-><init>(I)V
+PLcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller$1;-><init>(Lcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller;)V
+PLcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller$1;->sendResult(Landroid/os/Bundle;)V
+PLcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller;-><init>()V
+PLcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller;->access$700(Lcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller;Ljava/lang/Object;I)V
+PLcom/android/server/pm/InstantAppResolverConnection$GetInstantAppResolveInfoCaller;->getInstantAppResolveInfoList(Landroid/app/IInstantAppResolver;Landroid/content/Intent;[ILjava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/InstantAppResolverConnection$MyServiceConnection;-><init>(Lcom/android/server/pm/InstantAppResolverConnection;)V
+PLcom/android/server/pm/InstantAppResolverConnection$MyServiceConnection;-><init>(Lcom/android/server/pm/InstantAppResolverConnection;Lcom/android/server/pm/InstantAppResolverConnection$1;)V
+PLcom/android/server/pm/InstantAppResolverConnection$MyServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/pm/InstantAppResolverConnection;-><init>(Landroid/content/Context;Landroid/content/ComponentName;Ljava/lang/String;)V
+PLcom/android/server/pm/InstantAppResolverConnection;->access$100()Z
+PLcom/android/server/pm/InstantAppResolverConnection;->access$200(Lcom/android/server/pm/InstantAppResolverConnection;)Ljava/lang/Object;
+PLcom/android/server/pm/InstantAppResolverConnection;->access$302(Lcom/android/server/pm/InstantAppResolverConnection;Landroid/app/IInstantAppResolver;)Landroid/app/IInstantAppResolver;
+PLcom/android/server/pm/InstantAppResolverConnection;->access$400(Lcom/android/server/pm/InstantAppResolverConnection;)I
+PLcom/android/server/pm/InstantAppResolverConnection;->access$402(Lcom/android/server/pm/InstantAppResolverConnection;I)I
+PLcom/android/server/pm/InstantAppResolverConnection;->access$600()J
+PLcom/android/server/pm/InstantAppResolverConnection;->bind(Ljava/lang/String;)Landroid/app/IInstantAppResolver;
+PLcom/android/server/pm/InstantAppResolverConnection;->getInstantAppResolveInfoList(Landroid/content/Intent;[ILjava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/InstantAppResolverConnection;->lambda$optimisticBind$0(Lcom/android/server/pm/InstantAppResolverConnection;)V
+PLcom/android/server/pm/InstantAppResolverConnection;->optimisticBind()V
+PLcom/android/server/pm/InstantAppResolverConnection;->throwIfCalledOnMainThread()V
+PLcom/android/server/pm/InstantAppResolverConnection;->waitForBindLocked(Ljava/lang/String;)V
+PLcom/android/server/pm/InstructionSets;->getAllDexCodeInstructionSets()[Ljava/lang/String;
+PLcom/android/server/pm/InstructionSets;->getAppDexInstructionSets(Landroid/content/pm/ApplicationInfo;)[Ljava/lang/String;
+PLcom/android/server/pm/IntentFilterVerificationResponse;-><init>(IILjava/util/List;)V
+PLcom/android/server/pm/IntentFilterVerificationState;-><init>(IILjava/lang/String;)V
+PLcom/android/server/pm/IntentFilterVerificationState;->addFilter(Landroid/content/pm/PackageParser$ActivityIntentInfo;)V
+PLcom/android/server/pm/IntentFilterVerificationState;->getFilters()Ljava/util/ArrayList;
+PLcom/android/server/pm/IntentFilterVerificationState;->getHostsString()Ljava/lang/String;
+PLcom/android/server/pm/IntentFilterVerificationState;->getPackageName()Ljava/lang/String;
+PLcom/android/server/pm/IntentFilterVerificationState;->getUserId()I
+PLcom/android/server/pm/IntentFilterVerificationState;->isVerificationComplete()Z
+PLcom/android/server/pm/IntentFilterVerificationState;->isVerified()Z
+PLcom/android/server/pm/IntentFilterVerificationState;->setPendingState()V
+PLcom/android/server/pm/IntentFilterVerificationState;->setState(I)V
+PLcom/android/server/pm/IntentFilterVerificationState;->setVerifierResponse(II)Z
+PLcom/android/server/pm/KeySetHandle;-><init>(J)V
+PLcom/android/server/pm/KeySetHandle;->getId()J
+PLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;-><init>(Lcom/android/server/pm/KeySetManagerService;JLjava/security/PublicKey;)V
+PLcom/android/server/pm/KeySetManagerService;->addKeySetLPw(Landroid/util/ArraySet;)Lcom/android/server/pm/KeySetHandle;
+PLcom/android/server/pm/KeySetManagerService;->addPublicKeyLPw(Ljava/security/PublicKey;)J
+PLcom/android/server/pm/KeySetManagerService;->encodePublicKey(Ljava/security/PublicKey;)Ljava/lang/String;
+PLcom/android/server/pm/KeySetManagerService;->getFreeKeySetIDLPw()J
+PLcom/android/server/pm/KeySetManagerService;->getFreePublicKeyIdLPw()J
+PLcom/android/server/pm/KeySetManagerService;->getIdForPublicKeyLPr(Ljava/security/PublicKey;)J
+PLcom/android/server/pm/KeySetManagerService;->getIdFromKeyIdsLPr(Ljava/util/Set;)J
+PLcom/android/server/pm/KeySetManagerService;->writeKeySetManagerServiceLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/pm/KeySetManagerService;->writeKeySetsLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/pm/KeySetManagerService;->writePublicKeysLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/pm/LauncherAppsService$BroadcastCookie;-><init>(Landroid/os/UserHandle;Ljava/lang/String;II)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;-><init>(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;-><init>(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$1;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->lambda$onShortcutChanged$0(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;Ljava/lang/String;I)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onShortcutChanged(Ljava/lang/String;I)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onShortcutChangedInner(Ljava/lang/String;I)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;-><init>(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;->onCallbackDied(Landroid/os/IInterface;Ljava/lang/Object;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->access$100(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;)Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->access$200(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Landroid/os/UserHandle;Landroid/os/UserHandle;Ljava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->access$300(Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;)Landroid/content/pm/ShortcutServiceInternal;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->addOnAppsChangedListener(Ljava/lang/String;Landroid/content/pm/IOnAppsChangedListener;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->canAccessProfile(ILjava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->checkCallbackCount()V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->ensureShortcutPermission(Ljava/lang/String;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getApplicationInfo(Ljava/lang/String;Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getCallingUserId()I
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getLauncherActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcutConfigActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcuts(Ljava/lang/String;JLjava/lang/String;Ljava/util/List;Landroid/content/ComponentName;ILandroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->hasShortcutHostPermission(Ljava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectCallingUserId()I
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectClearCallingIdentity()J
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectRestoreCallingIdentity(J)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isActivityEnabled(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/UserHandle;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isEnabledProfileOf(Landroid/os/UserHandle;Landroid/os/UserHandle;Ljava/lang/String;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->isPackageEnabled(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Z
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->postToPackageMonitorHandler(Ljava/lang/Runnable;)V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryActivitiesForUser(Ljava/lang/String;Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->resolveActivity(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/UserHandle;)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->startWatchingPackageBroadcasts()V
+PLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->stopWatchingPackageBroadcasts()V
+PLcom/android/server/pm/LauncherAppsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/LauncherAppsService;->onStart()V
+PLcom/android/server/pm/OtaDexoptService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/OtaDexoptService;->main(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/OtaDexoptService;
+PLcom/android/server/pm/OtaDexoptService;->moveAbArtifacts(Lcom/android/server/pm/Installer;)V
+PLcom/android/server/pm/PackageDexOptimizer;->adjustDexoptFlags(I)I
+PLcom/android/server/pm/PackageDexOptimizer;->adjustDexoptNeeded(I)I
+PLcom/android/server/pm/PackageDexOptimizer;->canOptimizePackage(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageDexOptimizer;->createOatDirIfSupported(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageDexOptimizer;->dexOptSecondaryDexPath(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;Lcom/android/server/pm/dex/DexoptOptions;)I
+PLcom/android/server/pm/PackageDexOptimizer;->dexOptSecondaryDexPathLI(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;Lcom/android/server/pm/dex/DexoptOptions;)I
+PLcom/android/server/pm/PackageDexOptimizer;->getDexFlags(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Lcom/android/server/pm/dex/DexoptOptions;)I
+PLcom/android/server/pm/PackageDexOptimizer;->getOatDir(Ljava/io/File;)Ljava/io/File;
+PLcom/android/server/pm/PackageDexOptimizer;->isAppImageEnabled()Z
+PLcom/android/server/pm/PackageDexOptimizer;->isProfileUpdated(Landroid/content/pm/PackageParser$Package;ILjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageDexOptimizer;->performDexOpt(Landroid/content/pm/PackageParser$Package;[Ljava/lang/String;[Ljava/lang/String;Lcom/android/server/pm/CompilerStats$PackageStats;Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Lcom/android/server/pm/dex/DexoptOptions;)I
+PLcom/android/server/pm/PackageDexOptimizer;->performDexOptLI(Landroid/content/pm/PackageParser$Package;[Ljava/lang/String;[Ljava/lang/String;Lcom/android/server/pm/CompilerStats$PackageStats;Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Lcom/android/server/pm/dex/DexoptOptions;)I
+PLcom/android/server/pm/PackageDexOptimizer;->printDexoptFlags(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageDexOptimizer;->systemReady()V
+PLcom/android/server/pm/PackageInstallerService$1;->accept(Ljava/io/File;Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageInstallerService$2;-><init>(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService$2;->run()V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;-><init>(Landroid/os/Looper;)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$200(Lcom/android/server/pm/PackageInstallerService$Callbacks;II)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$700(Lcom/android/server/pm/PackageInstallerService$Callbacks;IIZ)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->access$800(Lcom/android/server/pm/PackageInstallerService$Callbacks;IIF)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->invokeCallback(Landroid/content/pm/IPackageInstallerCallback;Landroid/os/Message;)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->notifySessionActiveChanged(IIZ)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->notifySessionCreated(II)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->notifySessionFinished(IIZ)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->notifySessionProgressChanged(IIF)V
+PLcom/android/server/pm/PackageInstallerService$Callbacks;->register(Landroid/content/pm/IPackageInstallerCallback;I)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback$1;-><init>(Lcom/android/server/pm/PackageInstallerService$InternalCallback;Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback$1;->run()V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;-><init>(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionActiveChanged(Lcom/android/server/pm/PackageInstallerSession;Z)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionFinished(Lcom/android/server/pm/PackageInstallerSession;Z)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionPrepared(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionProgressChanged(Lcom/android/server/pm/PackageInstallerSession;F)V
+PLcom/android/server/pm/PackageInstallerService$InternalCallback;->onSessionSealedBlocking(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService$PackageInstallObserverAdapter;-><init>(Landroid/content/Context;Landroid/content/IntentSender;IZI)V
+PLcom/android/server/pm/PackageInstallerService$PackageInstallObserverAdapter;->onPackageInstalled(Ljava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/PackageInstallerService$PackageInstallObserverAdapter;->onUserActionRequired(Landroid/content/Intent;)V
+PLcom/android/server/pm/PackageInstallerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageInstallerService;->abandonSession(I)V
+PLcom/android/server/pm/PackageInstallerService;->access$000(Lcom/android/server/pm/PackageInstallerService;)Landroid/util/SparseArray;
+PLcom/android/server/pm/PackageInstallerService;->access$100(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService;->access$1000(Lcom/android/server/pm/PackageInstallerService;I)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerService;->access$1100(Lcom/android/server/pm/PackageInstallerService;)Landroid/os/Handler;
+PLcom/android/server/pm/PackageInstallerService;->access$400(Lcom/android/server/pm/PackageInstallerService;)Lcom/android/server/pm/PackageInstallerService$Callbacks;
+PLcom/android/server/pm/PackageInstallerService;->access$600(Lcom/android/server/pm/PackageInstallerService;)V
+PLcom/android/server/pm/PackageInstallerService;->access$900(Lcom/android/server/pm/PackageInstallerService;Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService;->addHistoricalSessionLocked(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerService;->allocateSessionIdLocked()I
+PLcom/android/server/pm/PackageInstallerService;->buildAppIconFile(I)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerService;->buildStageDir(Ljava/lang/String;IZ)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerService;->buildStagingDir(Ljava/lang/String;Z)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerService;->createSession(Landroid/content/pm/PackageInstaller$SessionParams;Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageInstallerService;->createSessionInternal(Landroid/content/pm/PackageInstaller$SessionParams;Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageInstallerService;->getAllSessions(I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageInstallerService;->getMySessions(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageInstallerService;->getSessionCount(Landroid/util/SparseArray;I)I
+PLcom/android/server/pm/PackageInstallerService;->getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;
+PLcom/android/server/pm/PackageInstallerService;->isCallingUidOwner(Lcom/android/server/pm/PackageInstallerSession;)Z
+PLcom/android/server/pm/PackageInstallerService;->newArraySet([Ljava/lang/Object;)Landroid/util/ArraySet;
+PLcom/android/server/pm/PackageInstallerService;->openSession(I)Landroid/content/pm/IPackageInstallerSession;
+PLcom/android/server/pm/PackageInstallerService;->openSessionInternal(I)Landroid/content/pm/IPackageInstallerSession;
+PLcom/android/server/pm/PackageInstallerService;->prepareStageDir(Ljava/io/File;)V
+PLcom/android/server/pm/PackageInstallerService;->readSessionsLocked()V
+PLcom/android/server/pm/PackageInstallerService;->reconcileStagesLocked(Ljava/lang/String;Z)V
+PLcom/android/server/pm/PackageInstallerService;->registerCallback(Landroid/content/pm/IPackageInstallerCallback;I)V
+PLcom/android/server/pm/PackageInstallerService;->setPermissionsResult(IZ)V
+PLcom/android/server/pm/PackageInstallerService;->systemReady()V
+PLcom/android/server/pm/PackageInstallerService;->writeSessionsAsync()V
+PLcom/android/server/pm/PackageInstallerService;->writeSessionsLocked()V
+PLcom/android/server/pm/PackageInstallerSession$1;-><init>()V
+PLcom/android/server/pm/PackageInstallerSession$1;->accept(Ljava/io/File;)Z
+PLcom/android/server/pm/PackageInstallerSession$2;-><init>()V
+PLcom/android/server/pm/PackageInstallerSession$2;->accept(Ljava/io/File;)Z
+PLcom/android/server/pm/PackageInstallerSession$3;-><init>(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerSession$3;->handleMessage(Landroid/os/Message;)Z
+PLcom/android/server/pm/PackageInstallerSession$4;-><init>(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerSession$4;->onPackageInstalled(Ljava/lang/String;ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/PackageInstallerSession;-><init>(Lcom/android/server/pm/PackageInstallerService$InternalCallback;Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Landroid/os/Looper;IILjava/lang/String;ILandroid/content/pm/PackageInstaller$SessionParams;JLjava/io/File;Ljava/lang/String;ZZ)V
+PLcom/android/server/pm/PackageInstallerSession;->abandon()V
+PLcom/android/server/pm/PackageInstallerSession;->access$100(Lcom/android/server/pm/PackageInstallerSession;)Ljava/lang/Object;
+PLcom/android/server/pm/PackageInstallerSession;->access$200(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerSession;->access$300(Lcom/android/server/pm/PackageInstallerSession;)V
+PLcom/android/server/pm/PackageInstallerSession;->access$400(Lcom/android/server/pm/PackageInstallerSession;ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/PackageInstallerSession;->assertApkConsistentLocked(Ljava/lang/String;Landroid/content/pm/PackageParser$ApkLite;)V
+PLcom/android/server/pm/PackageInstallerSession;->assertCallerIsOwnerOrRootLocked()V
+PLcom/android/server/pm/PackageInstallerSession;->assertNoWriteFileTransfersOpenLocked()V
+PLcom/android/server/pm/PackageInstallerSession;->assertPreparedAndNotCommittedOrDestroyedLocked(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageInstallerSession;->assertPreparedAndNotDestroyedLocked(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageInstallerSession;->assertPreparedAndNotSealedLocked(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageInstallerSession;->buildAppIconFile(ILjava/io/File;)Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerSession;->close()V
+PLcom/android/server/pm/PackageInstallerSession;->closeInternal(Z)V
+PLcom/android/server/pm/PackageInstallerSession;->commit(Landroid/content/IntentSender;Z)V
+PLcom/android/server/pm/PackageInstallerSession;->commitLocked()V
+PLcom/android/server/pm/PackageInstallerSession;->computeProgressLocked(Z)V
+PLcom/android/server/pm/PackageInstallerSession;->destroyInternal()V
+PLcom/android/server/pm/PackageInstallerSession;->dispatchSessionFinished(ILjava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/PackageInstallerSession;->doWriteInternal(Ljava/lang/String;JJLandroid/os/ParcelFileDescriptor;)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/pm/PackageInstallerSession;->dump(Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/pm/PackageInstallerSession;->dumpLocked(Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/pm/PackageInstallerSession;->extractNativeLibraries(Ljava/io/File;Ljava/lang/String;Z)V
+PLcom/android/server/pm/PackageInstallerSession;->generateInfo()Landroid/content/pm/PackageInstaller$SessionInfo;
+PLcom/android/server/pm/PackageInstallerSession;->generateInfo(Z)Landroid/content/pm/PackageInstaller$SessionInfo;
+PLcom/android/server/pm/PackageInstallerSession;->getInstallerUid()I
+PLcom/android/server/pm/PackageInstallerSession;->getNames()[Ljava/lang/String;
+PLcom/android/server/pm/PackageInstallerSession;->isInstallerDeviceOwnerOrAffiliatedProfileOwnerLocked()Z
+PLcom/android/server/pm/PackageInstallerSession;->isPrepared()Z
+PLcom/android/server/pm/PackageInstallerSession;->isSealed()Z
+PLcom/android/server/pm/PackageInstallerSession;->mayInheritNativeLibs()Z
+PLcom/android/server/pm/PackageInstallerSession;->maybeRenameFile(Ljava/io/File;Ljava/io/File;)V
+PLcom/android/server/pm/PackageInstallerSession;->needToAskForPermissionsLocked()Z
+PLcom/android/server/pm/PackageInstallerSession;->open()V
+PLcom/android/server/pm/PackageInstallerSession;->openWrite(Ljava/lang/String;JJ)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/pm/PackageInstallerSession;->resolveStageDirLocked()Ljava/io/File;
+PLcom/android/server/pm/PackageInstallerSession;->sealAndValidateLocked()V
+PLcom/android/server/pm/PackageInstallerSession;->setClientProgress(F)V
+PLcom/android/server/pm/PackageInstallerSession;->setPermissionsResult(Z)V
+PLcom/android/server/pm/PackageInstallerSession;->validateInstallLocked(Landroid/content/pm/PackageInfo;)V
+PLcom/android/server/pm/PackageInstallerSession;->write(Lorg/xmlpull/v1/XmlSerializer;Ljava/io/File;)V
+PLcom/android/server/pm/PackageInstallerSession;->writeGrantedRuntimePermissionsLocked(Lorg/xmlpull/v1/XmlSerializer;[Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerException;-><init>(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService$10;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService$10;->run()V
+PLcom/android/server/pm/PackageManagerService$1;->onPermissionGranted(II)V
+PLcom/android/server/pm/PackageManagerService$21;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/pm/PackageManagerService$21;->onChange(Z)V
+PLcom/android/server/pm/PackageManagerService$22;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerService$22;->getMountMode(ILjava/lang/String;)I
+PLcom/android/server/pm/PackageManagerService$22;->hasExternalStorage(ILjava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$23;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerService$23;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/pm/PackageManagerService$2;->onVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/pm/PackageManagerService$3;->onDefaultRuntimePermissionsGranted(I)V
+PLcom/android/server/pm/PackageManagerService$4;-><init>(Lcom/android/server/pm/PackageManagerService;Z)V
+PLcom/android/server/pm/PackageManagerService$4;->onPermissionChanged()V
+PLcom/android/server/pm/PackageManagerService$6;->compare(Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;)I
+PLcom/android/server/pm/PackageManagerService$6;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/pm/PackageManagerService$7;-><init>(Lcom/android/server/pm/PackageManagerService;[ILjava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I)V
+PLcom/android/server/pm/PackageManagerService$7;->run()V
+PLcom/android/server/pm/PackageManagerService$9;-><init>(Lcom/android/server/pm/PackageManagerService;ILcom/android/server/pm/PackageManagerService$InstallArgs;)V
+PLcom/android/server/pm/PackageManagerService$9;->run()V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver$ActionIterGenerator;-><init>(Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;)V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver$ActionIterGenerator;->generate(Landroid/content/pm/PackageParser$ActivityIntentInfo;)Ljava/util/Iterator;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver$CategoriesIterGenerator;-><init>(Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;)V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver$CategoriesIterGenerator;->generate(Landroid/content/pm/PackageParser$ActivityIntentInfo;)Ljava/util/Iterator;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver$IterGenerator;-><init>(Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;)V
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->access$2200(Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver;)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->findMatchingActivity(Ljava/util/List;Landroid/content/pm/ActivityInfo;)Landroid/content/pm/PackageParser$Activity;
+PLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;->getIntentListSubset(Ljava/util/List;Lcom/android/server/pm/PackageManagerService$ActivityIntentResolver$IterGenerator;Ljava/util/Iterator;)V
+PLcom/android/server/pm/PackageManagerService$DefaultContainerConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallParams;)V
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->copyApk(Lcom/android/internal/app/IMediaContainerService;Z)I
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doCopyApk(Lcom/android/internal/app/IMediaContainerService;Z)I
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doPostDeleteLI(Z)Z
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doPostInstall(II)I
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doPreInstall(I)I
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->doRename(ILandroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$FileInstallArgs;->getCodePath()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$HandlerParams;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/UserHandle;)V
+PLcom/android/server/pm/PackageManagerService$HandlerParams;->getUser()Landroid/os/UserHandle;
+PLcom/android/server/pm/PackageManagerService$HandlerParams;->setTraceCookie(I)Lcom/android/server/pm/PackageManagerService$HandlerParams;
+PLcom/android/server/pm/PackageManagerService$HandlerParams;->setTraceMethod(Ljava/lang/String;)Lcom/android/server/pm/PackageManagerService$HandlerParams;
+PLcom/android/server/pm/PackageManagerService$HandlerParams;->startCopy()Z
+PLcom/android/server/pm/PackageManagerService$IFVerificationParams;-><init>(Landroid/content/pm/PackageParser$Package;ZII)V
+PLcom/android/server/pm/PackageManagerService$InstallArgs;->getUser()Landroid/os/UserHandle;
+PLcom/android/server/pm/PackageManagerService$InstallArgs;->isFwdLocked()Z
+PLcom/android/server/pm/PackageManagerService$InstallParams$1;-><init>(Lcom/android/server/pm/PackageManagerService$InstallParams;I)V
+PLcom/android/server/pm/PackageManagerService$InstallParams$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/pm/PackageManagerService$InstallParams;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$OriginInfo;Lcom/android/server/pm/PackageManagerService$MoveInfo;Landroid/content/pm/IPackageInstallObserver2;ILjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/PackageManagerService$VerificationInfo;Landroid/os/UserHandle;Ljava/lang/String;[Ljava/lang/String;Landroid/content/pm/PackageParser$SigningDetails;I)V
+PLcom/android/server/pm/PackageManagerService$InstallParams;->handleReturnCode()V
+PLcom/android/server/pm/PackageManagerService$InstallParams;->handleStartCopy()V
+PLcom/android/server/pm/PackageManagerService$InstallParams;->installLocationPolicy(Landroid/content/pm/PackageInfoLite;)I
+PLcom/android/server/pm/PackageManagerService$InstantAppIntentResolver;-><init>()V
+PLcom/android/server/pm/PackageManagerService$InstantAppIntentResolver;->filterResults(Ljava/util/List;)V
+PLcom/android/server/pm/PackageManagerService$InstantAppIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/pm/PackageManagerService$InstantAppIntentResolver;->newArray(I)[Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/content/Context;Landroid/content/ComponentName;)V
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->addOneIntentFilterVerification(IIILandroid/content/IntentFilter;Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->addOneIntentFilterVerification(IIILandroid/content/pm/PackageParser$ActivityIntentInfo;Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->createDomainVerificationState(IIILjava/lang/String;)Lcom/android/server/pm/IntentFilterVerificationState;
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->getDefaultScheme()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->receiveVerificationResponse(I)V
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->sendVerificationRequest(ILcom/android/server/pm/IntentFilterVerificationState;)V
+PLcom/android/server/pm/PackageManagerService$IntentVerifierProxy;->startVerifications(I)V
+PLcom/android/server/pm/PackageManagerService$MoveCallbacks;->register(Landroid/content/pm/IPackageMoveObserver;)V
+PLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;->addListenerLocked(Landroid/content/pm/IOnPermissionsChangeListener;)V
+PLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;->handleOnPermissionsChanged(I)V
+PLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;->onPermissionsChanged(I)V
+PLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;->removeListenerLocked(Landroid/content/pm/IOnPermissionsChangeListener;)V
+PLcom/android/server/pm/PackageManagerService$OriginInfo;->fromStagedFile(Ljava/io/File;)Lcom/android/server/pm/PackageManagerService$OriginInfo;
+PLcom/android/server/pm/PackageManagerService$PackageFreezer;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService$PackageFreezer;->close()V
+PLcom/android/server/pm/PackageManagerService$PackageFreezer;->finalize()V
+PLcom/android/server/pm/PackageManagerService$PackageHandler;->connectToService()Z
+PLcom/android/server/pm/PackageManagerService$PackageHandler;->disconnectService()V
+PLcom/android/server/pm/PackageManagerService$PackageHandler;->doHandleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/PackageManagerService$PackageHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/PackageManagerService$PackageInstalledInfo;-><init>()V
+PLcom/android/server/pm/PackageManagerService$PackageInstalledInfo;->setReturnCode(I)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->addIsolatedUid(II)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getActivityInfo(Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getApplicationInfo(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getDisabledPackage(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getHomeActivitiesAsUser(Ljava/util/List;I)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getOverlayPackages(I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageInfo(Ljava/lang/String;III)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageList(Landroid/content/pm/PackageManagerInternal$PackageListObserver;)Landroid/content/pm/PackageList;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageTargetSdkVersion(Ljava/lang/String;)I
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageUid(Ljava/lang/String;II)I
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPermissionFlagsTEMP(Ljava/lang/String;Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getSetupWizardPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getTargetPackageNames(I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getUidTargetSdkVersion(I)I
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->grantDefaultPermissionsToDefaultDialerApp(Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;IZ)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isInstantApp(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isInstantAppInstallerComponent(Landroid/content/ComponentName;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isLegacySystemApp(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isPackagePersistent(Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isPackageSuspended(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isResolveActivityComponent(Landroid/content/pm/ComponentInfo;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->pruneInstantApps()V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->queryIntentActivities(Landroid/content/Intent;III)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->queryIntentServices(Landroid/content/Intent;III)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->resolveContentProvider(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;IIZI)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setDeviceAndProfileOwnerPackages(ILjava/lang/String;Landroid/util/SparseArray;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setDialerAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setEnabledOverlayPackages(ILjava/lang/String;Ljava/util/List;)Z
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setExternalSourcesPolicy(Landroid/content/pm/PackageManagerInternal$ExternalSourcesPolicy;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setLocationPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setSimCallManagerPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setSmsAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setSyncAdapterPackagesprovider(Landroid/content/pm/PackageManagerInternal$SyncAdapterPackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setUseOpenWifiAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->setVoiceInteractionPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->updatePermissionFlagsTEMP(Ljava/lang/String;Ljava/lang/String;III)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerNative;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerNative;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$1;)V
+PLcom/android/server/pm/PackageManagerService$PackageManagerNative;->getInstallerForPackage(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageManagerNative;->getNamesForUids([I)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageManagerNative;->getVersionCodeForPackage(Ljava/lang/String;)J
+PLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getStaticOverlayPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService$PackageRemovedInfo;-><init>(Lcom/android/server/pm/PackageSender;)V
+PLcom/android/server/pm/PackageManagerService$PackageRemovedInfo;->populateUsers([ILcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/PackageManagerService$PackageRemovedInfo;->sendPackageRemovedBroadcastInternal(Z)V
+PLcom/android/server/pm/PackageManagerService$PackageRemovedInfo;->sendPackageRemovedBroadcasts(Z)V
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->clear()V
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->get(ILjava/lang/String;)Ljava/util/ArrayList;
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->getOrAllocate(I)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->packagesForUserId(I)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->put(ILjava/lang/String;Ljava/util/ArrayList;)V
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->size()I
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->userIdAt(I)I
+PLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;->userIdCount()I
+PLcom/android/server/pm/PackageManagerService$PostInstallData;-><init>(Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)V
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->access$2400(Lcom/android/server/pm/PackageManagerService$ProviderIntentResolver;)Landroid/util/ArrayMap;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->allowFilterResult(Landroid/content/pm/PackageParser$ProviderIntentInfo;Ljava/util/List;)Z
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/pm/PackageParser$ProviderIntentInfo;)Z
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->newResult(Landroid/content/pm/PackageParser$ProviderIntentInfo;II)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->queryIntentForPackage(Landroid/content/Intent;Ljava/lang/String;ILjava/util/ArrayList;I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->sortResults(Ljava/util/List;)V
+PLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService$VerificationInfo;-><init>(Landroid/net/Uri;Landroid/net/Uri;II)V
+PLcom/android/server/pm/PackageManagerService;->access$1100(Lcom/android/server/pm/PackageManagerService;ILandroid/net/Uri;ILandroid/os/UserHandle;)V
+PLcom/android/server/pm/PackageManagerService;->access$1200(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallArgs;I)V
+PLcom/android/server/pm/PackageManagerService;->access$1300(Lcom/android/server/pm/PackageManagerService;IIZLandroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->access$1400(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageManagerService$IntentFilterVerifier;
+PLcom/android/server/pm/PackageManagerService;->access$1600(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;
+PLcom/android/server/pm/PackageManagerService;->access$200(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/DeviceIdleController$LocalService;
+PLcom/android/server/pm/PackageManagerService;->access$300(Lcom/android/server/pm/PackageManagerService;)J
+PLcom/android/server/pm/PackageManagerService;->access$3100(Lcom/android/server/pm/PackageManagerService;Landroid/app/IActivityManager;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[IZ)V
+PLcom/android/server/pm/PackageManagerService;->access$3200()[I
+PLcom/android/server/pm/PackageManagerService;->access$3300(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)V
+PLcom/android/server/pm/PackageManagerService;->access$3400(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;Ljava/lang/String;[I[I)V
+PLcom/android/server/pm/PackageManagerService;->access$3500(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageInfoLite;)V
+PLcom/android/server/pm/PackageManagerService;->access$3600(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->access$3700()Z
+PLcom/android/server/pm/PackageManagerService;->access$3800(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$InstallParams;)Lcom/android/server/pm/PackageManagerService$InstallArgs;
+PLcom/android/server/pm/PackageManagerService;->access$3900(Lcom/android/server/pm/PackageManagerService;III)Z
+PLcom/android/server/pm/PackageManagerService;->access$400(Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+PLcom/android/server/pm/PackageManagerService;->access$4000(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIZ)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->access$4108(Lcom/android/server/pm/PackageManagerService;)I
+PLcom/android/server/pm/PackageManagerService;->access$4200(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageInfoLite;Ljava/util/List;Lcom/android/server/pm/PackageVerificationState;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->access$4300(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->access$4500(Lcom/android/server/pm/PackageManagerService;Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
+PLcom/android/server/pm/PackageManagerService;->access$500(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/PackageManagerService$DefaultContainerConnection;
+PLcom/android/server/pm/PackageManagerService;->access$5402(Lcom/android/server/pm/PackageManagerService;Z)Z
+PLcom/android/server/pm/PackageManagerService;->access$5700(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;IILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->access$600(Lcom/android/server/pm/PackageManagerService;)Lcom/android/internal/app/IMediaContainerService;
+PLcom/android/server/pm/PackageManagerService;->access$602(Lcom/android/server/pm/PackageManagerService;Lcom/android/internal/app/IMediaContainerService;)Lcom/android/internal/app/IMediaContainerService;
+PLcom/android/server/pm/PackageManagerService;->access$700(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;ZLjava/util/ArrayList;I)V
+PLcom/android/server/pm/PackageManagerService;->access$7000(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/permission/PermissionManagerInternal;
+PLcom/android/server/pm/PackageManagerService;->access$7100(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;JIII)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/PackageManagerService;->access$7200(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/PackageManagerService;->access$7300(Lcom/android/server/pm/PackageManagerService;Landroid/content/ComponentName;III)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService;->access$7400(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIIZZ)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->access$7500(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIIZ)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->access$7700(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;
+PLcom/android/server/pm/PackageManagerService;->access$800(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZZ[Ljava/lang/String;ZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;)V
+PLcom/android/server/pm/PackageManagerService;->access$8000(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageSetting;II)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/PackageManagerService;->access$8100(Lcom/android/server/pm/PackageManagerService;Landroid/content/Intent;Ljava/lang/String;IIZI)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->access$8300(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+PLcom/android/server/pm/PackageManagerService;->access$8400(Lcom/android/server/pm/PackageManagerService;I)I
+PLcom/android/server/pm/PackageManagerService;->access$8500(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;)I
+PLcom/android/server/pm/PackageManagerService;->access$900(Lcom/android/server/pm/PackageManagerService;)Landroid/util/ArraySet;
+PLcom/android/server/pm/PackageManagerService;->addDynamicPermission(Landroid/content/pm/PermissionInfo;Z)Z
+PLcom/android/server/pm/PackageManagerService;->addOnPermissionsChangeListener(Landroid/content/pm/IOnPermissionsChangeListener;)V
+PLcom/android/server/pm/PackageManagerService;->addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z
+PLcom/android/server/pm/PackageManagerService;->addSharedLibrariesLPw(Ljava/util/List;[J[[Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/PackageParser$Package;ZILjava/util/Set;)Ljava/util/Set;
+PLcom/android/server/pm/PackageManagerService;->addSharedLibraryLPr(Ljava/util/Set;Lcom/android/server/pm/PackageManagerService$SharedLibraryEntry;Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->adjustCpuAbisForSharedUserLPw(Ljava/util/Set;Landroid/content/pm/PackageParser$Package;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->apkHasCode(Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService;->applyPostContentProviderResolutionFilter(Ljava/util/List;Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->areWebInstantAppsDisabled()Z
+PLcom/android/server/pm/PackageManagerService;->assertCodePolicy(Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->assertPackageKnownAndInstalled(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->broadcastPackageVerified(ILandroid/net/Uri;ILandroid/os/UserHandle;)V
+PLcom/android/server/pm/PackageManagerService;->canonicalToCurrentPackageNames([Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->checkDefaultBrowser()V
+PLcom/android/server/pm/PackageManagerService;->checkDowngrade(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageInfoLite;)V
+PLcom/android/server/pm/PackageManagerService;->checkPackageFrozen(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->checkSignatures(Ljava/lang/String;Ljava/lang/String;)I
+PLcom/android/server/pm/PackageManagerService;->checkUidSignatures(II)I
+PLcom/android/server/pm/PackageManagerService;->chooseBestActivity(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;I)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->clearAppDataLIF(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->clearAppDataLeafLIF(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->collectAbsoluteCodePaths()Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->createInstallArgs(Lcom/android/server/pm/PackageManagerService$InstallParams;)Lcom/android/server/pm/PackageManagerService$InstallArgs;
+PLcom/android/server/pm/PackageManagerService;->decompressSystemApplications(Ljava/util/List;I)V
+PLcom/android/server/pm/PackageManagerService;->deleteInstalledPackageLIF(Lcom/android/server/pm/PackageSetting;ZI[ILcom/android/server/pm/PackageManagerService$PackageRemovedInfo;ZLandroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->deletePackageLIF(Ljava/lang/String;Landroid/os/UserHandle;Z[IILcom/android/server/pm/PackageManagerService$PackageRemovedInfo;ZLandroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->disableSystemPackageLPw(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->doSendBroadcast(Landroid/app/IActivityManager;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[IZ)V
+PLcom/android/server/pm/PackageManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->enableSystemUserPackages()V
+PLcom/android/server/pm/PackageManagerService;->enforceSystemOrPhoneCaller(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->enforceSystemOrRoot(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->extrasForInstallResult(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)Landroid/os/Bundle;
+PLcom/android/server/pm/PackageManagerService;->filterCandidatesWithDomainPreferredActivitiesLPr(Landroid/content/Intent;ILjava/util/List;Lcom/android/server/pm/PackageManagerService$CrossProfileDomainInfo;I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->findPersistentPreferredActivityLP(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;ZI)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->findSharedNonSystemLibraries(Landroid/content/pm/PackageParser$Package;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->findSharedNonSystemLibrariesRecursive(Landroid/content/pm/PackageParser$Package;Ljava/util/ArrayList;Ljava/util/Set;)V
+PLcom/android/server/pm/PackageManagerService;->findSharedNonSystemLibrariesRecursive(Ljava/util/ArrayList;[JLjava/util/ArrayList;Ljava/util/Set;)V
+PLcom/android/server/pm/PackageManagerService;->findSharedNonSystemLibrary(Ljava/lang/String;J)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService;->finishPackageInstall(IZ)V
+PLcom/android/server/pm/PackageManagerService;->fixUpInstallReason(Ljava/lang/String;II)I
+PLcom/android/server/pm/PackageManagerService;->freeStorage(Ljava/lang/String;JI)V
+PLcom/android/server/pm/PackageManagerService;->freeStorageAndNotify(Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
+PLcom/android/server/pm/PackageManagerService;->freezePackage(Ljava/lang/String;ILjava/lang/String;)Lcom/android/server/pm/PackageManagerService$PackageFreezer;
+PLcom/android/server/pm/PackageManagerService;->freezePackageForInstall(Ljava/lang/String;IILjava/lang/String;)Lcom/android/server/pm/PackageManagerService$PackageFreezer;
+PLcom/android/server/pm/PackageManagerService;->freezePackageForInstall(Ljava/lang/String;ILjava/lang/String;)Lcom/android/server/pm/PackageManagerService$PackageFreezer;
+PLcom/android/server/pm/PackageManagerService;->generateApplicationInfoFromSettingsLPw(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/PackageManagerService;->getActivityManagerInternal()Landroid/app/ActivityManagerInternal;
+PLcom/android/server/pm/PackageManagerService;->getArtManager()Landroid/content/pm/dex/IArtManager;
+PLcom/android/server/pm/PackageManagerService;->getBlockUninstallForUser(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->getChangedPackages(II)Landroid/content/pm/ChangedPackages;
+PLcom/android/server/pm/PackageManagerService;->getDefaultAppsBackup(I)[B
+PLcom/android/server/pm/PackageManagerService;->getDefaultBrowserPackageName(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getDefaultHomeActivity(I)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getDeviceIdleController()Lcom/android/server/DeviceIdleController$LocalService;
+PLcom/android/server/pm/PackageManagerService;->getDexManager()Lcom/android/server/pm/dex/DexManager;
+PLcom/android/server/pm/PackageManagerService;->getHarmfulAppWarning(Ljava/lang/String;I)Ljava/lang/CharSequence;
+PLcom/android/server/pm/PackageManagerService;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getHomeActivitiesAsUser(Ljava/util/List;I)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getHomeIntent()Landroid/content/Intent;
+PLcom/android/server/pm/PackageManagerService;->getInstantAppAndroidId(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getInstantAppInstallerLPr()Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/PackageManagerService;->getInstantAppResolverLPr()Landroid/util/Pair;
+PLcom/android/server/pm/PackageManagerService;->getInstantAppResolverSettingsLPr(Landroid/content/ComponentName;)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getIntentFilterVerificationBackup(I)[B
+PLcom/android/server/pm/PackageManagerService;->getIntentFilterVerifierComponentNameLPr()Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->getLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;I)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->getMatchingCrossProfileIntentFilters(Landroid/content/Intent;Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->getNamesForUids([I)[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getNextCodePath(Ljava/io/File;Ljava/lang/String;)Ljava/io/File;
+PLcom/android/server/pm/PackageManagerService;->getOptimizablePackages()Landroid/util/ArraySet;
+PLcom/android/server/pm/PackageManagerService;->getOrCreateCompilerPackageStats(Landroid/content/pm/PackageParser$Package;)Lcom/android/server/pm/CompilerStats$PackageStats;
+PLcom/android/server/pm/PackageManagerService;->getOrCreateCompilerPackageStats(Ljava/lang/String;)Lcom/android/server/pm/CompilerStats$PackageStats;
+PLcom/android/server/pm/PackageManagerService;->getPackageInstaller()Landroid/content/pm/IPackageInstaller;
+PLcom/android/server/pm/PackageManagerService;->getPackageTargetSdkVersionLockedLPr(Ljava/lang/String;)I
+PLcom/android/server/pm/PackageManagerService;->getPackages()Ljava/util/Collection;
+PLcom/android/server/pm/PackageManagerService;->getParentOrChildPackageChangedSharedUser(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getPermissionControllerPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageManagerService;->getPermissionGrantBackup(I)[B
+PLcom/android/server/pm/PackageManagerService;->getPermissionGroupInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionGroupInfo;
+PLcom/android/server/pm/PackageManagerService;->getPersistentApplications(I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->getPersistentApplicationsInternal(I)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->getPrebuildProfilePath(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getPreferredActivityBackup(I)[B
+PLcom/android/server/pm/PackageManagerService;->getProviderInfo(Landroid/content/ComponentName;II)Landroid/content/pm/ProviderInfo;
+PLcom/android/server/pm/PackageManagerService;->getRequiredButNotReallyRequiredVerifierLPr()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getRequiredInstallerLPr()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getRequiredSharedLibraryLPr(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getRequiredUninstallerLPr()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getServicesSystemSharedLibraryPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getSetupWizardPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getSharedLibraryEntryLPr(Ljava/lang/String;J)Lcom/android/server/pm/PackageManagerService$SharedLibraryEntry;
+PLcom/android/server/pm/PackageManagerService;->getSharedSystemSharedLibraryPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getStorageManagerPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getSystemAvailableFeatures()Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->getSystemSharedLibraryNames()[Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getSystemTextClassifierPackageName()Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->getUidTargetSdkVersionLockedLPr(I)I
+PLcom/android/server/pm/PackageManagerService;->getUnknownSourcesSettings()I
+PLcom/android/server/pm/PackageManagerService;->getUnusedPackages(J)Ljava/util/Set;
+PLcom/android/server/pm/PackageManagerService;->getVerificationTimeout()J
+PLcom/android/server/pm/PackageManagerService;->grantDefaultPermissionsToEnabledImsServices([Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->grantDefaultPermissionsToEnabledTelephonyDataServices([Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->handlePackagePostInstall(Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;ZZZ[Ljava/lang/String;ZLjava/lang/String;Landroid/content/pm/IPackageInstallObserver2;)V
+PLcom/android/server/pm/PackageManagerService;->hasDomainURLs(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerService;->hasNonNegativePriority(Ljava/util/List;)Z
+PLcom/android/server/pm/PackageManagerService;->hasSystemUidErrors()Z
+PLcom/android/server/pm/PackageManagerService;->hasValidDomains(Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+PLcom/android/server/pm/PackageManagerService;->installNewPackageLIF(Landroid/content/pm/PackageParser$Package;IILandroid/os/UserHandle;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;I)V
+PLcom/android/server/pm/PackageManagerService;->installPackageLI(Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)V
+PLcom/android/server/pm/PackageManagerService;->installPackageTracedLI(Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;)V
+PLcom/android/server/pm/PackageManagerService;->installStage(Ljava/lang/String;Ljava/io/File;Landroid/content/pm/IPackageInstallObserver2;Landroid/content/pm/PackageInstaller$SessionParams;Ljava/lang/String;ILandroid/os/UserHandle;Landroid/content/pm/PackageParser$SigningDetails;)V
+PLcom/android/server/pm/PackageManagerService;->isFirstBoot()Z
+PLcom/android/server/pm/PackageManagerService;->isHistoricalPackageUsageAvailable()Z
+PLcom/android/server/pm/PackageManagerService;->isInstantAppResolutionAllowed(Landroid/content/Intent;Ljava/util/List;IZ)Z
+PLcom/android/server/pm/PackageManagerService;->isOnlyCoreApps()Z
+PLcom/android/server/pm/PackageManagerService;->isPermissionRevokedByPolicy(Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->isRecentsAccessingChildProfiles(II)Z
+PLcom/android/server/pm/PackageManagerService;->isSafeMode()Z
+PLcom/android/server/pm/PackageManagerService;->isStorageLow()Z
+PLcom/android/server/pm/PackageManagerService;->isSystemApp(Lcom/android/server/pm/PackageSetting;)Z
+PLcom/android/server/pm/PackageManagerService;->isUidPrivileged(I)Z
+PLcom/android/server/pm/PackageManagerService;->isUserRestricted(ILjava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerService;->isVerificationEnabled(III)Z
+PLcom/android/server/pm/PackageManagerService;->killApplication(Ljava/lang/String;IILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$commitPackageSettings$4(Lcom/android/server/pm/PackageManagerService;Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Ljava/util/ArrayList;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$freeStorageAndNotify$1(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;JILandroid/content/pm/IPackageDataObserver;)V
+PLcom/android/server/pm/PackageManagerService;->lambda$grantDefaultPermissionsToEnabledTelephonyDataServices$8(Lcom/android/server/pm/PackageManagerService;[Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->lambda$new$0(Lcom/android/server/pm/PackageManagerService;Ljava/util/List;I)V
+PLcom/android/server/pm/PackageManagerService;->lambda$revokeDefaultPermissionsFromDisabledTelephonyDataServices$9(Lcom/android/server/pm/PackageManagerService;[Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->matchComponentForVerifier(Ljava/lang/String;Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/pm/PackageManagerService;->matchVerifiers(Landroid/content/pm/PackageInfoLite;Ljava/util/List;Lcom/android/server/pm/PackageVerificationState;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->maybeAddInstantAppInstaller(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;IIZ)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->maybeMigrateAppDataLIF(Landroid/content/pm/PackageParser$Package;I)Z
+PLcom/android/server/pm/PackageManagerService;->needsNetworkVerificationLPr(Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+PLcom/android/server/pm/PackageManagerService;->normalizePackageNameLPr(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerService;->notifyDexLoad(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->notifyFirstLaunch(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->notifyPackageAdded(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->notifyPackageUse(Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->packageIsBrowser(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->performDexOpt(Lcom/android/server/pm/dex/DexoptOptions;)Z
+PLcom/android/server/pm/PackageManagerService;->performDexOptInternalWithDependenciesLI(Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/dex/DexoptOptions;)I
+PLcom/android/server/pm/PackageManagerService;->performDexOptTraced(Lcom/android/server/pm/dex/DexoptOptions;)I
+PLcom/android/server/pm/PackageManagerService;->performDexOptUpgrade(Ljava/util/List;ZIZ)[I
+PLcom/android/server/pm/PackageManagerService;->performDexOptWithStatus(Lcom/android/server/pm/dex/DexoptOptions;)I
+PLcom/android/server/pm/PackageManagerService;->performFstrimIfNeeded()V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataAfterInstallLIF(Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataAndMigrateLIF(Landroid/content/pm/PackageParser$Package;IIZ)V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataContentsLeafLIF(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataLIF(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->prepareAppDataLeafLIF(Landroid/content/pm/PackageParser$Package;II)V
+PLcom/android/server/pm/PackageManagerService;->processPendingInstall(Lcom/android/server/pm/PackageManagerService$InstallArgs;I)V
+PLcom/android/server/pm/PackageManagerService;->queryCrossProfileIntents(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;IIZ)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->queryIntentContentProviders(Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->queryIntentContentProvidersInternal(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->queryPermissionsByGroup(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/PackageManagerService;->querySkipCurrentProfileIntents(Ljava/util/List;Landroid/content/Intent;Ljava/lang/String;II)Landroid/content/pm/ResolveInfo;
+PLcom/android/server/pm/PackageManagerService;->reconcileApps(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->reconcileAppsData(IIZ)V
+PLcom/android/server/pm/PackageManagerService;->reconcileAppsDataLI(Ljava/lang/String;IIZ)V
+PLcom/android/server/pm/PackageManagerService;->reconcileAppsDataLI(Ljava/lang/String;IIZZ)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerService;->registerMoveCallback(Landroid/content/pm/IPackageMoveObserver;)V
+PLcom/android/server/pm/PackageManagerService;->removeOnPermissionsChangeListener(Landroid/content/pm/IOnPermissionsChangeListener;)V
+PLcom/android/server/pm/PackageManagerService;->removePackageDataLIF(Lcom/android/server/pm/PackageSetting;[ILcom/android/server/pm/PackageManagerService$PackageRemovedInfo;IZ)V
+PLcom/android/server/pm/PackageManagerService;->replaceNonSystemPackageLIF(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;IILandroid/os/UserHandle;[ILjava/lang/String;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;I)V
+PLcom/android/server/pm/PackageManagerService;->replacePackageLIF(Landroid/content/pm/PackageParser$Package;IILandroid/os/UserHandle;Ljava/lang/String;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;I)V
+PLcom/android/server/pm/PackageManagerService;->replaceSystemPackageLIF(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;IILandroid/os/UserHandle;[ILjava/lang/String;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;I)V
+PLcom/android/server/pm/PackageManagerService;->resolveUserIds(I)[I
+PLcom/android/server/pm/PackageManagerService;->revokeDefaultPermissionsFromDisabledTelephonyDataServices([Ljava/lang/String;I)V
+PLcom/android/server/pm/PackageManagerService;->scanPackageTracedLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService;->scheduleWritePackageRestrictionsLocked(I)V
+PLcom/android/server/pm/PackageManagerService;->scheduleWriteSettingsLocked()V
+PLcom/android/server/pm/PackageManagerService;->sendFirstLaunchBroadcast(Ljava/lang/String;Ljava/lang/String;[I[I)V
+PLcom/android/server/pm/PackageManagerService;->sendPackageAddedForNewUsers(Ljava/lang/String;ZZI[I[I)V
+PLcom/android/server/pm/PackageManagerService;->sendPackageBroadcast(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/String;Landroid/content/IIntentReceiver;[I[I)V
+PLcom/android/server/pm/PackageManagerService;->sendPackageChangedBroadcast(Ljava/lang/String;ZLjava/util/ArrayList;I)V
+PLcom/android/server/pm/PackageManagerService;->sendSessionCommitBroadcast(Landroid/content/pm/PackageInstaller$SessionInfo;I)V
+PLcom/android/server/pm/PackageManagerService;->serializeRuntimePermissionGrantsLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/PackageManagerService;->setApplicationCategoryHint(Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->setApplicationEnabledSetting(Ljava/lang/String;IIILjava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->setComponentEnabledSetting(Landroid/content/ComponentName;III)V
+PLcom/android/server/pm/PackageManagerService;->setInstallAndUpdateTime(Landroid/content/pm/PackageParser$Package;JJ)V
+PLcom/android/server/pm/PackageManagerService;->setUpInstantAppInstallerActivityLP(Landroid/content/pm/ActivityInfo;)V
+PLcom/android/server/pm/PackageManagerService;->shouldShowRequestPermissionRationale(Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageManagerService;->startIntentFilterVerifications(IZLandroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->systemReady()V
+PLcom/android/server/pm/PackageManagerService;->unsuspendForNonSystemSuspendingPackages(Landroid/util/ArraySet;)V
+PLcom/android/server/pm/PackageManagerService;->updateAllSharedLibrariesLPw(Landroid/content/pm/PackageParser$Package;)Ljava/util/ArrayList;
+PLcom/android/server/pm/PackageManagerService;->updateInstantAppInstallerLocked(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageManagerService;->updateIntentForResolve(Landroid/content/Intent;)Landroid/content/Intent;
+PLcom/android/server/pm/PackageManagerService;->updatePackagesIfNeeded()V
+PLcom/android/server/pm/PackageManagerService;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;III)V
+PLcom/android/server/pm/PackageManagerService;->updateSequenceNumberLP(Lcom/android/server/pm/PackageSetting;[I)V
+PLcom/android/server/pm/PackageManagerService;->updateSettingsInternalLI(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;[I[ILcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/os/UserHandle;I)V
+PLcom/android/server/pm/PackageManagerService;->updateSettingsLI(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;[ILcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Landroid/os/UserHandle;I)V
+PLcom/android/server/pm/PackageManagerService;->updateSharedLibrariesLPr(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->verifyIntentFilter(IILjava/util/List;)V
+PLcom/android/server/pm/PackageManagerService;->verifyIntentFiltersIfNeeded(IIZLandroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/PackageManagerService;->verifyPendingInstall(II)V
+PLcom/android/server/pm/PackageManagerService;->waitForAppDataPrepared()V
+PLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getCompilerFilterForReason(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getReasonName(I)Ljava/lang/String;
+PLcom/android/server/pm/PackageManagerServiceUtils;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/pm/PackageManagerServiceUtils;->applyPackageFilter(Ljava/util/function/Predicate;Ljava/util/Collection;Ljava/util/Collection;Ljava/util/List;Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageManagerServiceUtils;->checkISA(Ljava/lang/String;)Z
+PLcom/android/server/pm/PackageManagerServiceUtils;->getPackageNamesForIntent(Landroid/content/Intent;I)Landroid/util/ArraySet;
+PLcom/android/server/pm/PackageManagerServiceUtils;->getPackagesForDexopt(Ljava/util/Collection;Lcom/android/server/pm/PackageManagerService;)Ljava/util/List;
+PLcom/android/server/pm/PackageManagerServiceUtils;->isApkVerityEnabled()Z
+PLcom/android/server/pm/PackageManagerServiceUtils;->isUnusedSinceTimeInMillis(JJJLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;JJ)Z
+PLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$1(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$2(Landroid/util/ArraySet;Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$3(Lcom/android/server/pm/dex/DexManager;Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$4(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;)I
+PLcom/android/server/pm/PackageManagerServiceUtils;->lambda$getPackagesForDexopt$5(JLandroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/PackageManagerServiceUtils;->lambda$sortPackagesByUsageDate$0(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;)I
+PLcom/android/server/pm/PackageManagerServiceUtils;->sortPackagesByUsageDate(Ljava/util/List;Lcom/android/server/pm/PackageManagerService;)V
+PLcom/android/server/pm/PackageSetting;->areInstallPermissionsFixed()Z
+PLcom/android/server/pm/PackageSetting;->getAppId()I
+PLcom/android/server/pm/PackageSetting;->getSharedUser()Lcom/android/server/pm/SharedUserSetting;
+PLcom/android/server/pm/PackageSetting;->isSharedUser()Z
+PLcom/android/server/pm/PackageSetting;->isUpdatedSystem()Z
+PLcom/android/server/pm/PackageSetting;->setInstallPermissionsFixed(Z)V
+PLcom/android/server/pm/PackageSettingBase;->disableComponentLPw(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageSettingBase;->enableComponentLPw(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageSettingBase;->getCeDataInode(I)J
+PLcom/android/server/pm/PackageSettingBase;->getCurrentEnabledStateLPr(Ljava/lang/String;I)I
+PLcom/android/server/pm/PackageSettingBase;->getDomainVerificationStatusForUser(I)J
+PLcom/android/server/pm/PackageSettingBase;->getInstallReason(I)I
+PLcom/android/server/pm/PackageSettingBase;->getIntentFilterVerificationInfo()Landroid/content/pm/IntentFilterVerificationInfo;
+PLcom/android/server/pm/PackageSettingBase;->modifyUserStateComponents(IZZ)Landroid/content/pm/PackageUserState;
+PLcom/android/server/pm/PackageSettingBase;->queryInstalledUsers([IZ)[I
+PLcom/android/server/pm/PackageSettingBase;->restoreComponentLPw(Ljava/lang/String;I)Z
+PLcom/android/server/pm/PackageSettingBase;->setCeDataInode(JI)V
+PLcom/android/server/pm/PackageSettingBase;->setDomainVerificationStatusForUser(III)V
+PLcom/android/server/pm/PackageSettingBase;->setInstallReason(II)V
+PLcom/android/server/pm/PackageSettingBase;->setInstalled(ZI)V
+PLcom/android/server/pm/PackageSettingBase;->setInstallerPackageName(Ljava/lang/String;)V
+PLcom/android/server/pm/PackageSettingBase;->setNotLaunched(ZI)V
+PLcom/android/server/pm/PackageSettingBase;->setOverlayPaths(Ljava/util/List;I)V
+PLcom/android/server/pm/PackageSettingBase;->setStopped(ZI)V
+PLcom/android/server/pm/PackageSettingBase;->setUpdateAvailable(Z)V
+PLcom/android/server/pm/PackageUsage;->isHistoricalPackageUsageAvailable()Z
+PLcom/android/server/pm/PackageUsage;->parseAsLong(Ljava/lang/String;)J
+PLcom/android/server/pm/PackageUsage;->readInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/PackageUsage;->readInternal(Ljava/util/Map;)V
+PLcom/android/server/pm/PackageUsage;->readLine(Ljava/io/InputStream;Ljava/lang/StringBuffer;)Ljava/lang/String;
+PLcom/android/server/pm/PackageUsage;->readVersion1LP(Ljava/util/Map;Ljava/io/InputStream;Ljava/lang/StringBuffer;)V
+PLcom/android/server/pm/PackageUsage;->writeInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/PackageUsage;->writeInternal(Ljava/util/Map;)V
+PLcom/android/server/pm/PackageVerificationResponse;-><init>(II)V
+PLcom/android/server/pm/PackageVerificationState;-><init>(ILcom/android/server/pm/PackageManagerService$InstallArgs;)V
+PLcom/android/server/pm/PackageVerificationState;->getInstallArgs()Lcom/android/server/pm/PackageManagerService$InstallArgs;
+PLcom/android/server/pm/PackageVerificationState;->isInstallAllowed()Z
+PLcom/android/server/pm/PackageVerificationState;->isVerificationComplete()Z
+PLcom/android/server/pm/PackageVerificationState;->setVerifierResponse(II)Z
+PLcom/android/server/pm/PreferredActivity;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/PreferredComponent;->sameSet([Landroid/content/ComponentName;)Z
+PLcom/android/server/pm/PreferredComponent;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/ProcessLoggingHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/ProcessLoggingHandler;->invalidateProcessLoggingBaseApkHash(Ljava/lang/String;)V
+PLcom/android/server/pm/ProtectedPackages;->getDeviceOwnerOrProfileOwnerPackage(I)Ljava/lang/String;
+PLcom/android/server/pm/ProtectedPackages;->hasDeviceOwnerOrProfileOwner(ILjava/lang/String;)Z
+PLcom/android/server/pm/ProtectedPackages;->isPackageStateProtected(ILjava/lang/String;)Z
+PLcom/android/server/pm/ProtectedPackages;->isProtectedPackage(Ljava/lang/String;)Z
+PLcom/android/server/pm/ProtectedPackages;->setDeviceAndProfileOwnerPackages(ILjava/lang/String;Landroid/util/SparseArray;)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->access$400(Lcom/android/server/pm/Settings$RuntimePermissionPersistence;I)V
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->areDefaultRuntimPermissionsGrantedLPr(I)Z
+PLcom/android/server/pm/Settings$RuntimePermissionPersistence;->onDefaultRuntimePermissionsGrantedLPr(I)V
+PLcom/android/server/pm/Settings;->access$300(Lcom/android/server/pm/Settings;)Landroid/util/SparseArray;
+PLcom/android/server/pm/Settings;->addUserToSettingLPw(Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/Settings;->applyPendingPermissionGrantsLPw(Ljava/lang/String;I)V
+PLcom/android/server/pm/Settings;->areDefaultRuntimePermissionsGrantedLPr(I)Z
+PLcom/android/server/pm/Settings;->createIntentFilterVerificationIfNeededLPw(Ljava/lang/String;Landroid/util/ArraySet;)Landroid/content/pm/IntentFilterVerificationInfo;
+PLcom/android/server/pm/Settings;->createNewSetting(Ljava/lang/String;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;Lcom/android/server/pm/SharedUserSetting;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JIILandroid/os/UserHandle;ZZZLjava/lang/String;Ljava/util/List;Lcom/android/server/pm/UserManagerService;[Ljava/lang/String;[J)Lcom/android/server/pm/PackageSetting;
+PLcom/android/server/pm/Settings;->disableSystemPackageLPw(Ljava/lang/String;Z)Z
+PLcom/android/server/pm/Settings;->dumpSharedUsersLPr(Ljava/io/PrintWriter;Ljava/lang/String;Landroid/util/ArraySet;Lcom/android/server/pm/DumpState;Z)V
+PLcom/android/server/pm/Settings;->getAllSharedUsersLPw()Ljava/util/Collection;
+PLcom/android/server/pm/Settings;->getApplicationEnabledSettingLPr(Ljava/lang/String;I)I
+PLcom/android/server/pm/Settings;->getBlockUninstallLPr(ILjava/lang/String;)Z
+PLcom/android/server/pm/Settings;->getComponentEnabledSettingLPr(Landroid/content/ComponentName;I)I
+PLcom/android/server/pm/Settings;->getDefaultBrowserPackageNameLPw(I)Ljava/lang/String;
+PLcom/android/server/pm/Settings;->getHarmfulAppWarningLPr(Ljava/lang/String;I)Ljava/lang/String;
+PLcom/android/server/pm/Settings;->getInstallerPackageNameLPr(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/Settings;->getIntentFilterVerificationLPr(Ljava/lang/String;)Landroid/content/pm/IntentFilterVerificationInfo;
+PLcom/android/server/pm/Settings;->getIntentFilterVerificationStatusLPr(Ljava/lang/String;I)I
+PLcom/android/server/pm/Settings;->getVolumePackagesLPr(Ljava/lang/String;)Ljava/util/List;
+PLcom/android/server/pm/Settings;->newUserIdLPw(Ljava/lang/Object;)I
+PLcom/android/server/pm/Settings;->onDefaultRuntimePermissionsGrantedLPr(I)V
+PLcom/android/server/pm/Settings;->replacePackageLPw(Ljava/lang/String;Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/Settings;->replaceUserIdLPw(ILjava/lang/Object;)V
+PLcom/android/server/pm/Settings;->setDefaultDialerPackageNameLPw(Ljava/lang/String;I)Z
+PLcom/android/server/pm/Settings;->setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/Settings;->updateIntentFilterVerificationStatusLPw(Ljava/lang/String;II)Z
+PLcom/android/server/pm/Settings;->writeAllDomainVerificationsLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writeAllRuntimePermissionsLPr()V
+PLcom/android/server/pm/Settings;->writeAllUsersPackageRestrictionsLPr()V
+PLcom/android/server/pm/Settings;->writeBlockUninstallPackagesLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writeCrossProfileIntentFiltersLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writeDefaultAppsLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writeDisabledSysPackageLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageSetting;)V
+PLcom/android/server/pm/Settings;->writePackageListLPr()V
+PLcom/android/server/pm/Settings;->writePersistentPreferredActivitiesLPr(Lorg/xmlpull/v1/XmlSerializer;I)V
+PLcom/android/server/pm/Settings;->writePreferredActivitiesLPr(Lorg/xmlpull/v1/XmlSerializer;IZ)V
+PLcom/android/server/pm/Settings;->writeRuntimePermissionsForUserLPr(IZ)V
+PLcom/android/server/pm/SharedUserSetting;->fixSeInfoLocked()V
+PLcom/android/server/pm/SharedUserSetting;->getPackages()Ljava/util/List;
+PLcom/android/server/pm/ShortcutBitmapSaver$PendingItem;-><init>(Landroid/content/pm/ShortcutInfo;[B)V
+PLcom/android/server/pm/ShortcutBitmapSaver$PendingItem;-><init>(Landroid/content/pm/ShortcutInfo;[BLcom/android/server/pm/ShortcutBitmapSaver$1;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->lambda$new$1(Lcom/android/server/pm/ShortcutBitmapSaver;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->lambda$waitForAllSavesLocked$0(Ljava/util/concurrent/CountDownLatch;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->processPendingItems()Z
+PLcom/android/server/pm/ShortcutBitmapSaver;->removeIcon(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->saveBitmapLocked(Landroid/content/pm/ShortcutInfo;ILandroid/graphics/Bitmap$CompressFormat;I)V
+PLcom/android/server/pm/ShortcutBitmapSaver;->waitForAllSavesLocked()Z
+PLcom/android/server/pm/ShortcutDumpFiles;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/pm/ShortcutDumpFiles;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutDumpFiles;->lambda$save$0([BLjava/io/PrintWriter;)V
+PLcom/android/server/pm/ShortcutDumpFiles;->save(Ljava/lang/String;Ljava/util/function/Consumer;)Z
+PLcom/android/server/pm/ShortcutDumpFiles;->save(Ljava/lang/String;[B)Z
+PLcom/android/server/pm/ShortcutLauncher;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;I)V
+PLcom/android/server/pm/ShortcutLauncher;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;ILcom/android/server/pm/ShortcutPackageInfo;)V
+PLcom/android/server/pm/ShortcutLauncher;->ensurePackageInfo()V
+PLcom/android/server/pm/ShortcutLauncher;->getOwnerUserId()I
+PLcom/android/server/pm/ShortcutLauncher;->getPinnedShortcutIds(Ljava/lang/String;I)Landroid/util/ArraySet;
+PLcom/android/server/pm/ShortcutLauncher;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/ShortcutNonPersistentUser;-><init>(Lcom/android/server/pm/ShortcutService;I)V
+PLcom/android/server/pm/ShortcutNonPersistentUser;->hasHostPackage(Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutNonPersistentUser;->setShortcutHostPackage(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/ShortcutPackage;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;)V
+PLcom/android/server/pm/ShortcutPackage;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;Lcom/android/server/pm/ShortcutPackageInfo;)V
+PLcom/android/server/pm/ShortcutPackage;->addOrReplaceDynamicShortcut(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutPackage;->adjustRanks()V
+PLcom/android/server/pm/ShortcutPackage;->areAllActivitiesStillEnabled()Z
+PLcom/android/server/pm/ShortcutPackage;->clearAllImplicitRanks()V
+PLcom/android/server/pm/ShortcutPackage;->deleteAllDynamicShortcuts(Z)V
+PLcom/android/server/pm/ShortcutPackage;->enforceShortcutCountsBeforeOperation(Ljava/util/List;I)V
+PLcom/android/server/pm/ShortcutPackage;->ensureImmutableShortcutsNotIncluded(Ljava/util/List;Z)V
+PLcom/android/server/pm/ShortcutPackage;->ensureImmutableShortcutsNotIncludedWithIds(Ljava/util/List;Z)V
+PLcom/android/server/pm/ShortcutPackage;->ensureNotImmutable(Landroid/content/pm/ShortcutInfo;Z)V
+PLcom/android/server/pm/ShortcutPackage;->ensureNotImmutable(Ljava/lang/String;Z)V
+PLcom/android/server/pm/ShortcutPackage;->findAll(Ljava/util/List;Ljava/util/function/Predicate;I)V
+PLcom/android/server/pm/ShortcutPackage;->findAll(Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;IZ)V
+PLcom/android/server/pm/ShortcutPackage;->findShortcutById(Ljava/lang/String;)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutPackage;->forceDeleteShortcutInner(Ljava/lang/String;)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutPackage;->forceReplaceShortcutInner(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutPackage;->getApiCallCount(Z)I
+PLcom/android/server/pm/ShortcutPackage;->getFileName(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/ShortcutPackage;->getOwnerUserId()I
+PLcom/android/server/pm/ShortcutPackage;->getPackageResources()Landroid/content/res/Resources;
+PLcom/android/server/pm/ShortcutPackage;->getUsedBitmapFiles()Landroid/util/ArraySet;
+PLcom/android/server/pm/ShortcutPackage;->incrementCountForActivity(Landroid/util/ArrayMap;Landroid/content/ComponentName;I)V
+PLcom/android/server/pm/ShortcutPackage;->isShortcutExistsAndVisibleToPublisher(Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutPackage;->lambda$new$2(Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;)I
+PLcom/android/server/pm/ShortcutPackage;->loadFromXml(Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutUser;Lorg/xmlpull/v1/XmlPullParser;Z)Lcom/android/server/pm/ShortcutPackage;
+PLcom/android/server/pm/ShortcutPackage;->parseIntent(Lorg/xmlpull/v1/XmlPullParser;)Landroid/content/Intent;
+PLcom/android/server/pm/ShortcutPackage;->parseShortcut(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;IZ)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutPackage;->publishManifestShortcuts(Ljava/util/List;)Z
+PLcom/android/server/pm/ShortcutPackage;->pushOutExcessShortcuts()Z
+PLcom/android/server/pm/ShortcutPackage;->removeOrphans()V
+PLcom/android/server/pm/ShortcutPackage;->rescanPackageIfNeeded(ZZ)Z
+PLcom/android/server/pm/ShortcutPackage;->resetRateLimiting()V
+PLcom/android/server/pm/ShortcutPackage;->sortShortcutsToActivities()Landroid/util/ArrayMap;
+PLcom/android/server/pm/ShortcutPackage;->tryApiCall(Z)Z
+PLcom/android/server/pm/ShortcutPackageInfo;-><init>(JJLjava/util/ArrayList;Z)V
+PLcom/android/server/pm/ShortcutPackageInfo;->getLastUpdateTime()J
+PLcom/android/server/pm/ShortcutPackageInfo;->getVersionCode()J
+PLcom/android/server/pm/ShortcutPackageInfo;->isBackupAllowed()Z
+PLcom/android/server/pm/ShortcutPackageInfo;->isShadow()Z
+PLcom/android/server/pm/ShortcutPackageInfo;->loadFromXml(Lorg/xmlpull/v1/XmlPullParser;Z)V
+PLcom/android/server/pm/ShortcutPackageInfo;->newEmpty()Lcom/android/server/pm/ShortcutPackageInfo;
+PLcom/android/server/pm/ShortcutPackageInfo;->refreshSignature(Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutPackageItem;)V
+PLcom/android/server/pm/ShortcutPackageInfo;->saveToXml(Lcom/android/server/pm/ShortcutService;Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/ShortcutPackageInfo;->updateFromPackageInfo(Landroid/content/pm/PackageInfo;)V
+PLcom/android/server/pm/ShortcutPackageItem;-><init>(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;Lcom/android/server/pm/ShortcutPackageInfo;)V
+PLcom/android/server/pm/ShortcutPackageItem;->attemptToRestoreIfNeededAndSave()V
+PLcom/android/server/pm/ShortcutPackageItem;->getUser()Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutPackageItem;->refreshPackageSignatureAndSave()V
+PLcom/android/server/pm/ShortcutParser;->createShortcutFromManifest(Lcom/android/server/pm/ShortcutService;ILjava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;IIIIIZ)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutParser;->parseCategories(Lcom/android/server/pm/ShortcutService;Landroid/util/AttributeSet;)Ljava/lang/String;
+PLcom/android/server/pm/ShortcutParser;->parseShortcutAttributes(Lcom/android/server/pm/ShortcutService;Landroid/util/AttributeSet;Ljava/lang/String;Landroid/content/ComponentName;II)Landroid/content/pm/ShortcutInfo;
+PLcom/android/server/pm/ShortcutParser;->parseShortcuts(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutParser;->parseShortcutsOneFile(Lcom/android/server/pm/ShortcutService;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILjava/util/List;)Ljava/util/List;
+PLcom/android/server/pm/ShortcutRequestPinProcessor;-><init>(Lcom/android/server/pm/ShortcutService;Ljava/lang/Object;)V
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->getRequestPinConfirmationActivity(II)Landroid/util/Pair;
+PLcom/android/server/pm/ShortcutRequestPinProcessor;->isRequestPinItemSupported(II)Z
+PLcom/android/server/pm/ShortcutService$1;-><init>()V
+PLcom/android/server/pm/ShortcutService$1;->test(Landroid/content/pm/ResolveInfo;)Z
+PLcom/android/server/pm/ShortcutService$1;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/ShortcutService$2;-><init>()V
+PLcom/android/server/pm/ShortcutService$2;->test(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/pm/ShortcutService$2;->test(Ljava/lang/Object;)Z
+PLcom/android/server/pm/ShortcutService$3;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutService$3;->lambda$onUidGone$1(Lcom/android/server/pm/ShortcutService$3;I)V
+PLcom/android/server/pm/ShortcutService$3;->onUidGone(IZ)V
+PLcom/android/server/pm/ShortcutService$4;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutService$5;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutService$5;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/pm/ShortcutService$FileOutputStreamWithPath;-><init>(Ljava/io/File;)V
+PLcom/android/server/pm/ShortcutService$FileOutputStreamWithPath;->getFile()Ljava/io/File;
+PLcom/android/server/pm/ShortcutService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/ShortcutService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/pm/ShortcutService$Lifecycle;->onStart()V
+PLcom/android/server/pm/ShortcutService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/pm/ShortcutService$LocalService;-><init>(Lcom/android/server/pm/ShortcutService;)V
+PLcom/android/server/pm/ShortcutService$LocalService;-><init>(Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService$1;)V
+PLcom/android/server/pm/ShortcutService$LocalService;->addListener(Landroid/content/pm/ShortcutServiceInternal$ShortcutChangeListener;)V
+PLcom/android/server/pm/ShortcutService$LocalService;->getShortcuts(ILjava/lang/String;JLjava/lang/String;Ljava/util/List;Landroid/content/ComponentName;IIII)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService$LocalService;->getShortcutsInnerLocked(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;JLandroid/content/ComponentName;IILjava/util/ArrayList;III)V
+PLcom/android/server/pm/ShortcutService$LocalService;->hasShortcutHostPermission(ILjava/lang/String;II)Z
+PLcom/android/server/pm/ShortcutService$LocalService;->lambda$getShortcuts$0(Lcom/android/server/pm/ShortcutService$LocalService;ILjava/lang/String;Ljava/util/List;JLandroid/content/ComponentName;IILjava/util/ArrayList;IIILcom/android/server/pm/ShortcutPackage;)V
+PLcom/android/server/pm/ShortcutService$LocalService;->lambda$getShortcutsInnerLocked$1(JLandroid/util/ArraySet;Landroid/content/ComponentName;ZZZZLandroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutService$LocalService;->setShortcutHostPackage(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/ShortcutService;-><init>(Landroid/content/Context;Landroid/os/Looper;Z)V
+PLcom/android/server/pm/ShortcutService;->access$000(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/pm/ShortcutService;->access$1100(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->access$200(Lcom/android/server/pm/ShortcutService;)Ljava/lang/Object;
+PLcom/android/server/pm/ShortcutService;->access$300(Lcom/android/server/pm/ShortcutService;Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->access$400(Lcom/android/server/pm/ShortcutService;)Ljava/util/ArrayList;
+PLcom/android/server/pm/ShortcutService;->access$800(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->access$900(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->addDynamicShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
+PLcom/android/server/pm/ShortcutService;->assignImplicitRanks(Ljava/util/List;)V
+PLcom/android/server/pm/ShortcutService;->canSeeAnyPinnedShortcut(Ljava/lang/String;III)Z
+PLcom/android/server/pm/ShortcutService;->checkPackageChanges(I)V
+PLcom/android/server/pm/ShortcutService;->cleanupDanglingBitmapDirectoriesLocked(I)V
+PLcom/android/server/pm/ShortcutService;->cleanupDanglingBitmapFilesLocked(ILcom/android/server/pm/ShortcutUser;Ljava/lang/String;Ljava/io/File;)V
+PLcom/android/server/pm/ShortcutService;->disableShortcuts(Ljava/lang/String;Ljava/util/List;Ljava/lang/CharSequence;II)V
+PLcom/android/server/pm/ShortcutService;->enableShortcuts(Ljava/lang/String;Ljava/util/List;I)V
+PLcom/android/server/pm/ShortcutService;->enforceMaxActivityShortcuts(I)V
+PLcom/android/server/pm/ShortcutService;->enforceSystem()V
+PLcom/android/server/pm/ShortcutService;->fillInDefaultActivity(Ljava/util/List;)V
+PLcom/android/server/pm/ShortcutService;->fixUpIncomingShortcutInfo(Landroid/content/pm/ShortcutInfo;Z)V
+PLcom/android/server/pm/ShortcutService;->fixUpIncomingShortcutInfo(Landroid/content/pm/ShortcutInfo;ZZ)V
+PLcom/android/server/pm/ShortcutService;->fixUpShortcutResourceNamesAndValues(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutService;->forUpdatedPackages(IJZLjava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutService;->getActivityInfoWithMetadata(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/ShortcutService;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/ShortcutService;->getBackupPayload(I)[B
+PLcom/android/server/pm/ShortcutService;->getBaseStateFile()Landroid/util/AtomicFile;
+PLcom/android/server/pm/ShortcutService;->getDefaultLauncher(I)Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutService;->getDumpPath()Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->getDynamicShortcuts(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/ShortcutService;->getInstalledPackages(I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->getLastResetTimeLocked()J
+PLcom/android/server/pm/ShortcutService;->getLauncherShortcutsLocked(Ljava/lang/String;II)Lcom/android/server/pm/ShortcutLauncher;
+PLcom/android/server/pm/ShortcutService;->getMainActivityIntent()Landroid/content/Intent;
+PLcom/android/server/pm/ShortcutService;->getManifestShortcuts(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/ShortcutService;->getMaxActivityShortcuts()I
+PLcom/android/server/pm/ShortcutService;->getMaxShortcutCountPerActivity(Ljava/lang/String;I)I
+PLcom/android/server/pm/ShortcutService;->getNonPersistentUserLocked(I)Lcom/android/server/pm/ShortcutNonPersistentUser;
+PLcom/android/server/pm/ShortcutService;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->getPackageInfo(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->getPackageInfoWithSignatures(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->getPackageShortcutsForPublisherLocked(Ljava/lang/String;I)Lcom/android/server/pm/ShortcutPackage;
+PLcom/android/server/pm/ShortcutService;->getParentOrSelfUserId(I)I
+PLcom/android/server/pm/ShortcutService;->getPinnedShortcuts(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/ShortcutService;->getShortcutsWithQueryLocked(Ljava/lang/String;IILjava/util/function/Predicate;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/pm/ShortcutService;->getStatStartTime()J
+PLcom/android/server/pm/ShortcutService;->getUidLastForegroundElapsedTimeLocked(I)J
+PLcom/android/server/pm/ShortcutService;->getUserBitmapFilePath(I)Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->getUserFile(I)Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->getUserShortcutsLocked(I)Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutService;->handlePackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->handlePackageChanged(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->handlePackageUpdateFinished(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->handleUnlockUser(I)V
+PLcom/android/server/pm/ShortcutService;->hasShortcutHostPermission(Ljava/lang/String;III)Z
+PLcom/android/server/pm/ShortcutService;->hasShortcutHostPermissionInner(Ljava/lang/String;I)Z
+PLcom/android/server/pm/ShortcutService;->initialize()V
+PLcom/android/server/pm/ShortcutService;->injectApplicationInfoWithUninstalled(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/ShortcutService;->injectBinderCallingPid()I
+PLcom/android/server/pm/ShortcutService;->injectBinderCallingUid()I
+PLcom/android/server/pm/ShortcutService;->injectBuildFingerprint()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutService;->injectDipToPixel(I)I
+PLcom/android/server/pm/ShortcutService;->injectGetActivityInfoWithMetadataWithUninstalled(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/ShortcutService;->injectGetDefaultMainActivity(Ljava/lang/String;I)Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutService;->injectGetLocaleTagsForUser(I)Ljava/lang/String;
+PLcom/android/server/pm/ShortcutService;->injectGetMainActivities(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->injectGetPackageUid(Ljava/lang/String;I)I
+PLcom/android/server/pm/ShortcutService;->injectGetPackagesWithUninstalled(I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->injectGetPinConfirmationActivity(Ljava/lang/String;II)Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutService;->injectGetResourcesForApplicationAsUser(Ljava/lang/String;I)Landroid/content/res/Resources;
+PLcom/android/server/pm/ShortcutService;->injectHasAccessShortcutsPermission(II)Z
+PLcom/android/server/pm/ShortcutService;->injectHasUnlimitedShortcutsApiCallsPermission(II)Z
+PLcom/android/server/pm/ShortcutService;->injectIsActivityEnabledAndExported(Landroid/content/ComponentName;I)Z
+PLcom/android/server/pm/ShortcutService;->injectIsLowRamDevice()Z
+PLcom/android/server/pm/ShortcutService;->injectIsMainActivity(Landroid/content/ComponentName;I)Z
+PLcom/android/server/pm/ShortcutService;->injectIsSafeModeEnabled()Z
+PLcom/android/server/pm/ShortcutService;->injectPackageInfoWithUninstalled(Ljava/lang/String;IZ)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->injectRegisterUidObserver(Landroid/app/IUidObserver;I)V
+PLcom/android/server/pm/ShortcutService;->injectRunOnNewThread(Ljava/lang/Runnable;)V
+PLcom/android/server/pm/ShortcutService;->injectShortcutManagerConstants()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutService;->injectShouldPerformVerification()Z
+PLcom/android/server/pm/ShortcutService;->injectSystemDataPath()Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->injectUserDataPath(I)Ljava/io/File;
+PLcom/android/server/pm/ShortcutService;->injectValidateIconResPackage(Landroid/content/pm/ShortcutInfo;Landroid/graphics/drawable/Icon;)V
+PLcom/android/server/pm/ShortcutService;->injectXmlMetaData(Landroid/content/pm/ActivityInfo;Ljava/lang/String;)Landroid/content/res/XmlResourceParser;
+PLcom/android/server/pm/ShortcutService;->isCallerSystem()Z
+PLcom/android/server/pm/ShortcutService;->isClockValid(J)Z
+PLcom/android/server/pm/ShortcutService;->isEphemeralApp(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/pm/ShortcutService;->isEphemeralApp(Ljava/lang/String;I)Z
+PLcom/android/server/pm/ShortcutService;->isInstalled(Landroid/content/pm/ActivityInfo;)Z
+PLcom/android/server/pm/ShortcutService;->isInstalled(Landroid/content/pm/ApplicationInfo;)Z
+PLcom/android/server/pm/ShortcutService;->isInstalled(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/pm/ShortcutService;->isInstalledOrNull(Landroid/content/pm/ActivityInfo;)Landroid/content/pm/ActivityInfo;
+PLcom/android/server/pm/ShortcutService;->isInstalledOrNull(Landroid/content/pm/ApplicationInfo;)Landroid/content/pm/ApplicationInfo;
+PLcom/android/server/pm/ShortcutService;->isInstalledOrNull(Landroid/content/pm/PackageInfo;)Landroid/content/pm/PackageInfo;
+PLcom/android/server/pm/ShortcutService;->isPackageInstalled(Ljava/lang/String;I)Z
+PLcom/android/server/pm/ShortcutService;->isRequestPinItemSupported(II)Z
+PLcom/android/server/pm/ShortcutService;->isUidForegroundLocked(I)Z
+PLcom/android/server/pm/ShortcutService;->isUserUnlockedL(I)Z
+PLcom/android/server/pm/ShortcutService;->lambda$FW40Da1L1EZJ_usDX0ew1qRMmtc(Landroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutService;->lambda$K2g8Oho05j5S7zVOkoQrHzM_Gig(Landroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutService;->lambda$checkPackageChanges$6(Lcom/android/server/pm/ShortcutService;Ljava/util/ArrayList;Lcom/android/server/pm/ShortcutPackageItem;)V
+PLcom/android/server/pm/ShortcutService;->lambda$getBackupPayload$10(Lcom/android/server/pm/ShortcutLauncher;)V
+PLcom/android/server/pm/ShortcutService;->lambda$getBackupPayload$8(Lcom/android/server/pm/ShortcutPackageItem;)V
+PLcom/android/server/pm/ShortcutService;->lambda$getBackupPayload$9(Lcom/android/server/pm/ShortcutPackage;)V
+PLcom/android/server/pm/ShortcutService;->lambda$handleUnlockUser$0(Lcom/android/server/pm/ShortcutService;JI)V
+PLcom/android/server/pm/ShortcutService;->lambda$notifyListeners$1(Lcom/android/server/pm/ShortcutService;ILjava/lang/String;)V
+PLcom/android/server/pm/ShortcutService;->lambda$rescanUpdatedPackagesLocked$7(Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutUser;ILandroid/content/pm/ApplicationInfo;)V
+PLcom/android/server/pm/ShortcutService;->lambda$vv6Ko6L2p38nn3EYcL5PZxcyRyk(Landroid/content/pm/ShortcutInfo;)Z
+PLcom/android/server/pm/ShortcutService;->loadBaseStateLocked()V
+PLcom/android/server/pm/ShortcutService;->loadConfigurationLocked()V
+PLcom/android/server/pm/ShortcutService;->loadUserInternal(ILjava/io/InputStream;Z)Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutService;->loadUserLocked(I)Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutService;->logDurationStat(IJ)V
+PLcom/android/server/pm/ShortcutService;->notifyListeners(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->onBootPhase(I)V
+PLcom/android/server/pm/ShortcutService;->openIconFileForWrite(ILandroid/content/pm/ShortcutInfo;)Lcom/android/server/pm/ShortcutService$FileOutputStreamWithPath;
+PLcom/android/server/pm/ShortcutService;->packageShortcutsChanged(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->parseBooleanAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutService;->parseBooleanAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Z)Z
+PLcom/android/server/pm/ShortcutService;->parseComponentNameAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutService;->parseIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)I
+PLcom/android/server/pm/ShortcutService;->parseIntentAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/content/Intent;
+PLcom/android/server/pm/ShortcutService;->parseIntentAttributeNoDefault(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/content/Intent;
+PLcom/android/server/pm/ShortcutService;->parseLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)J
+PLcom/android/server/pm/ShortcutService;->parseLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
+PLcom/android/server/pm/ShortcutService;->parseStringAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;IZ)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;Ljava/lang/String;Landroid/content/ComponentName;I)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->removeAllDynamicShortcuts(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->removeIconLocked(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutService;->rescanUpdatedPackagesLocked(IJ)V
+PLcom/android/server/pm/ShortcutService;->saveBaseStateLocked()V
+PLcom/android/server/pm/ShortcutService;->saveDirtyInfo()V
+PLcom/android/server/pm/ShortcutService;->saveIconAndFixUpShortcutLocked(Landroid/content/pm/ShortcutInfo;)V
+PLcom/android/server/pm/ShortcutService;->saveUserInternalLocked(ILjava/io/OutputStream;Z)V
+PLcom/android/server/pm/ShortcutService;->saveUserLocked(I)V
+PLcom/android/server/pm/ShortcutService;->scheduleSaveBaseState()V
+PLcom/android/server/pm/ShortcutService;->scheduleSaveInner(I)V
+PLcom/android/server/pm/ShortcutService;->scheduleSaveUser(I)V
+PLcom/android/server/pm/ShortcutService;->setDynamicShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
+PLcom/android/server/pm/ShortcutService;->setReturnedByServer(Ljava/util/List;)Ljava/util/List;
+PLcom/android/server/pm/ShortcutService;->setShortcutHostPackage(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->shouldBackupApp(Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/pm/ShortcutService;->shrinkBitmap(Landroid/graphics/Bitmap;I)Landroid/graphics/Bitmap;
+PLcom/android/server/pm/ShortcutService;->throwIfUserLockedL(I)V
+PLcom/android/server/pm/ShortcutService;->updateConfigurationLocked(Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutService;->updateShortcuts(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;I)Z
+PLcom/android/server/pm/ShortcutService;->updateTimesLocked()V
+PLcom/android/server/pm/ShortcutService;->verifyCaller(Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutService;->verifyStates()V
+PLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/content/ComponentName;)V
+PLcom/android/server/pm/ShortcutService;->writeAttr(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/content/Intent;)V
+PLcom/android/server/pm/ShortcutService;->writeTagValue(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;J)V
+PLcom/android/server/pm/ShortcutService;->writeTagValue(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Landroid/content/ComponentName;)V
+PLcom/android/server/pm/ShortcutService;->writeTagValue(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/ShortcutUser$PackageWithUser;-><init>(ILjava/lang/String;)V
+PLcom/android/server/pm/ShortcutUser$PackageWithUser;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/pm/ShortcutUser$PackageWithUser;->hashCode()I
+PLcom/android/server/pm/ShortcutUser$PackageWithUser;->of(ILjava/lang/String;)Lcom/android/server/pm/ShortcutUser$PackageWithUser;
+PLcom/android/server/pm/ShortcutUser;-><init>(Lcom/android/server/pm/ShortcutService;I)V
+PLcom/android/server/pm/ShortcutUser;->attemptToRestoreIfNeededAndSave(Lcom/android/server/pm/ShortcutService;Ljava/lang/String;I)V
+PLcom/android/server/pm/ShortcutUser;->clearLauncher()V
+PLcom/android/server/pm/ShortcutUser;->detectLocaleChange()V
+PLcom/android/server/pm/ShortcutUser;->forAllLaunchers(Ljava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutUser;->forAllPackageItems(Ljava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutUser;->forAllPackages(Ljava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutUser;->forPackageItem(Ljava/lang/String;ILjava/util/function/Consumer;)V
+PLcom/android/server/pm/ShortcutUser;->getCachedLauncher()Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutUser;->getKnownLocales()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutUser;->getLastAppScanOsFingerprint()Ljava/lang/String;
+PLcom/android/server/pm/ShortcutUser;->getLastAppScanTime()J
+PLcom/android/server/pm/ShortcutUser;->getLastKnownLauncher()Landroid/content/ComponentName;
+PLcom/android/server/pm/ShortcutUser;->getLauncherShortcuts(Ljava/lang/String;I)Lcom/android/server/pm/ShortcutLauncher;
+PLcom/android/server/pm/ShortcutUser;->getPackageShortcuts(Ljava/lang/String;)Lcom/android/server/pm/ShortcutPackage;
+PLcom/android/server/pm/ShortcutUser;->getPackageShortcutsIfExists(Ljava/lang/String;)Lcom/android/server/pm/ShortcutPackage;
+PLcom/android/server/pm/ShortcutUser;->getUserId()I
+PLcom/android/server/pm/ShortcutUser;->hasPackage(Ljava/lang/String;)Z
+PLcom/android/server/pm/ShortcutUser;->lambda$attemptToRestoreIfNeededAndSave$2(Lcom/android/server/pm/ShortcutPackageItem;)V
+PLcom/android/server/pm/ShortcutUser;->lambda$forPackageItem$0(ILjava/lang/String;Ljava/util/function/Consumer;Lcom/android/server/pm/ShortcutPackageItem;)V
+PLcom/android/server/pm/ShortcutUser;->loadFromXml(Lcom/android/server/pm/ShortcutService;Lorg/xmlpull/v1/XmlPullParser;IZ)Lcom/android/server/pm/ShortcutUser;
+PLcom/android/server/pm/ShortcutUser;->onCalledByPublisher(Ljava/lang/String;)V
+PLcom/android/server/pm/ShortcutUser;->rescanPackageIfNeeded(Ljava/lang/String;Z)V
+PLcom/android/server/pm/ShortcutUser;->saveShortcutPackageItem(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/ShortcutPackageItem;Z)V
+PLcom/android/server/pm/ShortcutUser;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;Z)V
+PLcom/android/server/pm/ShortcutUser;->setLastAppScanOsFingerprint(Ljava/lang/String;)V
+PLcom/android/server/pm/ShortcutUser;->setLastAppScanTime(J)V
+PLcom/android/server/pm/ShortcutUser;->setLauncher(Landroid/content/ComponentName;)V
+PLcom/android/server/pm/ShortcutUser;->setLauncher(Landroid/content/ComponentName;Z)V
+PLcom/android/server/pm/UserDataPreparer;->enforceSerialNumber(Ljava/io/File;I)V
+PLcom/android/server/pm/UserDataPreparer;->getDataSystemCeDirectory(I)Ljava/io/File;
+PLcom/android/server/pm/UserDataPreparer;->getDataUserCeDirectory(Ljava/lang/String;I)Ljava/io/File;
+PLcom/android/server/pm/UserDataPreparer;->getSerialNumber(Ljava/io/File;)I
+PLcom/android/server/pm/UserDataPreparer;->isFileEncryptedEmulatedOnly()Z
+PLcom/android/server/pm/UserDataPreparer;->prepareUserData(III)V
+PLcom/android/server/pm/UserDataPreparer;->prepareUserDataLI(Ljava/lang/String;IIIZ)V
+PLcom/android/server/pm/UserDataPreparer;->reconcileUsers(Ljava/lang/String;Ljava/util/List;)V
+PLcom/android/server/pm/UserDataPreparer;->reconcileUsers(Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V
+PLcom/android/server/pm/UserManagerService$2;-><init>(Lcom/android/server/pm/UserManagerService;Landroid/os/Bundle;I)V
+PLcom/android/server/pm/UserManagerService$2;->run()V
+PLcom/android/server/pm/UserManagerService$3;-><init>(Lcom/android/server/pm/UserManagerService;ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserManagerService$3;->run()V
+PLcom/android/server/pm/UserManagerService$LifeCycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/pm/UserManagerService$LifeCycle;->onBootPhase(I)V
+PLcom/android/server/pm/UserManagerService$LifeCycle;->onStart()V
+PLcom/android/server/pm/UserManagerService$LifeCycle;->onStartUser(I)V
+PLcom/android/server/pm/UserManagerService$LifeCycle;->onUnlockUser(I)V
+PLcom/android/server/pm/UserManagerService$LocalService;->addUserRestrictionsListener(Landroid/os/UserManagerInternal$UserRestrictionsListener;)V
+PLcom/android/server/pm/UserManagerService$LocalService;->getProfileParentId(I)I
+PLcom/android/server/pm/UserManagerService$LocalService;->getUserIds()[I
+PLcom/android/server/pm/UserManagerService$LocalService;->getUserRestriction(ILjava/lang/String;)Z
+PLcom/android/server/pm/UserManagerService$LocalService;->isProfileAccessible(IILjava/lang/String;Z)Z
+PLcom/android/server/pm/UserManagerService$LocalService;->isSettingRestrictedForUser(Ljava/lang/String;ILjava/lang/String;I)Z
+PLcom/android/server/pm/UserManagerService$LocalService;->isUserRunning(I)Z
+PLcom/android/server/pm/UserManagerService$LocalService;->isUserUnlocked(I)Z
+PLcom/android/server/pm/UserManagerService$LocalService;->setDeviceManaged(Z)V
+PLcom/android/server/pm/UserManagerService$LocalService;->setDevicePolicyUserRestrictions(ILandroid/os/Bundle;ZI)V
+PLcom/android/server/pm/UserManagerService$LocalService;->setUserManaged(IZ)V
+PLcom/android/server/pm/UserManagerService$LocalService;->setUserState(II)V
+PLcom/android/server/pm/UserManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/pm/UserManagerService;->access$100(Lcom/android/server/pm/UserManagerService;)Landroid/content/Context;
+PLcom/android/server/pm/UserManagerService;->access$1100(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/UserManagerService;->access$1200(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
+PLcom/android/server/pm/UserManagerService;->access$1300(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService$UserData;)V
+PLcom/android/server/pm/UserManagerService;->access$1400(Lcom/android/server/pm/UserManagerService;ILandroid/os/Bundle;ZI)V
+PLcom/android/server/pm/UserManagerService;->access$1802(Lcom/android/server/pm/UserManagerService;Z)Z
+PLcom/android/server/pm/UserManagerService;->access$1900(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/pm/UserManagerService;->access$200(Lcom/android/server/pm/UserManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/UserManagerService;->access$300(Lcom/android/server/pm/UserManagerService;I)Lcom/android/server/pm/UserManagerService$UserData;
+PLcom/android/server/pm/UserManagerService;->access$3000(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->access$500()Landroid/os/IBinder;
+PLcom/android/server/pm/UserManagerService;->access$600(Lcom/android/server/pm/UserManagerService;)Lcom/android/internal/app/IAppOpsService;
+PLcom/android/server/pm/UserManagerService;->access$700(Lcom/android/server/pm/UserManagerService;)Ljava/util/ArrayList;
+PLcom/android/server/pm/UserManagerService;->applyUserRestrictionsLR(I)V
+PLcom/android/server/pm/UserManagerService;->canAddMoreManagedProfiles(IZ)Z
+PLcom/android/server/pm/UserManagerService;->checkManageUserAndAcrossUsersFullPermission(Ljava/lang/String;)V
+PLcom/android/server/pm/UserManagerService;->checkManageUsersPermission(Ljava/lang/String;)V
+PLcom/android/server/pm/UserManagerService;->cleanupPartialUsers()V
+PLcom/android/server/pm/UserManagerService;->computeEffectiveUserRestrictionsLR(I)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/pm/UserManagerService;->dumpTimeAgo(Ljava/io/PrintWriter;Ljava/lang/StringBuilder;JJ)V
+PLcom/android/server/pm/UserManagerService;->findCurrentGuestUser()Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->getAliveUsersExcludingGuestsCountLU()I
+PLcom/android/server/pm/UserManagerService;->getCredentialOwnerProfile(I)I
+PLcom/android/server/pm/UserManagerService;->getEffectiveUserRestrictions(I)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->getMaxManagedProfiles()I
+PLcom/android/server/pm/UserManagerService;->getPrimaryUser()Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->getProfileParent(I)Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->getProfileParentLU(I)Landroid/content/pm/UserInfo;
+PLcom/android/server/pm/UserManagerService;->getProfilesLU(IZZ)Ljava/util/List;
+PLcom/android/server/pm/UserManagerService;->getUserAccount(I)Ljava/lang/String;
+PLcom/android/server/pm/UserManagerService;->getUserDataNoChecks(I)Lcom/android/server/pm/UserManagerService$UserData;
+PLcom/android/server/pm/UserManagerService;->getUserHandle(I)I
+PLcom/android/server/pm/UserManagerService;->getUserIcon(I)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/pm/UserManagerService;->getUserRestrictionSource(Ljava/lang/String;I)I
+PLcom/android/server/pm/UserManagerService;->getUserRestrictionSources(Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/UserManagerService;->getUserRestrictions(I)Landroid/os/Bundle;
+PLcom/android/server/pm/UserManagerService;->getUserSerialNumber(I)I
+PLcom/android/server/pm/UserManagerService;->hasBaseUserRestriction(Ljava/lang/String;I)Z
+PLcom/android/server/pm/UserManagerService;->hasUserRestriction(Ljava/lang/String;I)Z
+PLcom/android/server/pm/UserManagerService;->isDemoUser(I)Z
+PLcom/android/server/pm/UserManagerService;->isManagedProfile(I)Z
+PLcom/android/server/pm/UserManagerService;->isProfileOf(Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;)Z
+PLcom/android/server/pm/UserManagerService;->isQuietModeEnabled(I)Z
+PLcom/android/server/pm/UserManagerService;->isRestricted()Z
+PLcom/android/server/pm/UserManagerService;->isSameProfileGroup(II)Z
+PLcom/android/server/pm/UserManagerService;->isUserRunning(I)Z
+PLcom/android/server/pm/UserManagerService;->isUserUnlocked(I)Z
+PLcom/android/server/pm/UserManagerService;->isUserUnlockingOrUnlocked(I)Z
+PLcom/android/server/pm/UserManagerService;->onBeforeUnlockUser(I)V
+PLcom/android/server/pm/UserManagerService;->onUserLoggedIn(I)V
+PLcom/android/server/pm/UserManagerService;->propagateUserRestrictionsLR(ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserManagerService;->reconcileUsers(Ljava/lang/String;)V
+PLcom/android/server/pm/UserManagerService;->scheduleWriteUser(Lcom/android/server/pm/UserManagerService$UserData;)V
+PLcom/android/server/pm/UserManagerService;->setDevicePolicyUserRestrictionsInner(ILandroid/os/Bundle;ZI)V
+PLcom/android/server/pm/UserManagerService;->setUserRestriction(Ljava/lang/String;ZI)V
+PLcom/android/server/pm/UserManagerService;->systemReady()V
+PLcom/android/server/pm/UserManagerService;->updateRestrictionsIfNeededLR(ILandroid/os/Bundle;Landroid/util/SparseArray;)Z
+PLcom/android/server/pm/UserManagerService;->updateUserRestrictionsInternalLR(Landroid/os/Bundle;I)V
+PLcom/android/server/pm/UserManagerService;->writeUserLP(Lcom/android/server/pm/UserManagerService$UserData;)V
+PLcom/android/server/pm/UserManagerService;->writeUserLP(Lcom/android/server/pm/UserManagerService$UserData;Ljava/io/OutputStream;)V
+PLcom/android/server/pm/UserRestrictionsUtils;->applyUserRestrictions(Landroid/content/Context;ILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserRestrictionsUtils;->areEqual(Landroid/os/Bundle;Landroid/os/Bundle;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->clone(Landroid/os/Bundle;)Landroid/os/Bundle;
+PLcom/android/server/pm/UserRestrictionsUtils;->dumpRestrictions(Ljava/io/PrintWriter;Ljava/lang/String;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserRestrictionsUtils;->isEmpty(Landroid/os/Bundle;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->isSettingRestrictedForUser(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;I)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->isValidRestriction(Ljava/lang/String;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->mergeAll(Landroid/util/SparseArray;)Landroid/os/Bundle;
+PLcom/android/server/pm/UserRestrictionsUtils;->nonNull(Landroid/os/Bundle;)Landroid/os/Bundle;
+PLcom/android/server/pm/UserRestrictionsUtils;->restrictionsChanged(Landroid/os/Bundle;Landroid/os/Bundle;[Ljava/lang/String;)Z
+PLcom/android/server/pm/UserRestrictionsUtils;->sortToGlobalAndLocal(Landroid/os/Bundle;ZILandroid/os/Bundle;Landroid/os/Bundle;)V
+PLcom/android/server/pm/UserRestrictionsUtils;->writeRestrictions(Lorg/xmlpull/v1/XmlSerializer;Landroid/os/Bundle;Ljava/lang/String;)V
+PLcom/android/server/pm/dex/-$$Lambda$ArtManagerService$MEVzU-orlv4msZVF-bA5NLti04g;-><init>(Landroid/os/ParcelFileDescriptor;Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;Ljava/lang/String;)V
+PLcom/android/server/pm/dex/-$$Lambda$ArtManagerService$MEVzU-orlv4msZVF-bA5NLti04g;->run()V
+PLcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl;->getPackageOptimizationInfo(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;)Landroid/content/pm/dex/PackageOptimizationInfo;
+PLcom/android/server/pm/dex/ArtManagerService;->access$100(Ljava/lang/String;)I
+PLcom/android/server/pm/dex/ArtManagerService;->access$200(Ljava/lang/String;)I
+PLcom/android/server/pm/dex/ArtManagerService;->checkAndroidPermissions(ILjava/lang/String;)Z
+PLcom/android/server/pm/dex/ArtManagerService;->checkShellPermissions(ILjava/lang/String;I)Z
+PLcom/android/server/pm/dex/ArtManagerService;->createProfileSnapshot(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILandroid/content/pm/dex/ISnapshotRuntimeProfileCallback;)V
+PLcom/android/server/pm/dex/ArtManagerService;->destroyProfileSnapshot(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/dex/ArtManagerService;->getCompilationFilterTronValue(Ljava/lang/String;)I
+PLcom/android/server/pm/dex/ArtManagerService;->isRuntimeProfilingEnabled(ILjava/lang/String;)Z
+PLcom/android/server/pm/dex/ArtManagerService;->lambda$postSuccess$1(Landroid/os/ParcelFileDescriptor;Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;Ljava/lang/String;)V
+PLcom/android/server/pm/dex/ArtManagerService;->postSuccess(Ljava/lang/String;Landroid/os/ParcelFileDescriptor;Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;)V
+PLcom/android/server/pm/dex/ArtManagerService;->prepareAppProfiles(Landroid/content/pm/PackageParser$Package;I)V
+PLcom/android/server/pm/dex/ArtManagerService;->prepareAppProfiles(Landroid/content/pm/PackageParser$Package;[I)V
+PLcom/android/server/pm/dex/ArtManagerService;->snapshotAppProfile(Ljava/lang/String;Ljava/lang/String;Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;)V
+PLcom/android/server/pm/dex/ArtManagerService;->snapshotBootImageProfile(Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;)V
+PLcom/android/server/pm/dex/ArtManagerService;->snapshotRuntimeProfile(ILjava/lang/String;Ljava/lang/String;Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback;Ljava/lang/String;)V
+PLcom/android/server/pm/dex/DexLogger;->onReconcileSecondaryDexFile(Landroid/content/pm/ApplicationInfo;Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexLogger;->writeDclEvent(ILjava/lang/String;)V
+PLcom/android/server/pm/dex/DexManager$1;-><init>(Lcom/android/server/pm/dex/DexManager;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/pm/dex/DexManager$1;->onChange(Z)V
+PLcom/android/server/pm/dex/DexManager$2;-><init>(Lcom/android/server/pm/dex/DexManager;Landroid/os/Handler;Landroid/content/ContentResolver;)V
+PLcom/android/server/pm/dex/DexManager$2;->onChange(Z)V
+PLcom/android/server/pm/dex/DexManager$DexSearchResult;-><init>(Lcom/android/server/pm/dex/DexManager;Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager$DexSearchResult;->access$000(Lcom/android/server/pm/dex/DexManager$DexSearchResult;)I
+PLcom/android/server/pm/dex/DexManager$DexSearchResult;->access$100(Lcom/android/server/pm/dex/DexManager$DexSearchResult;)Ljava/lang/String;
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;-><init>(Landroid/content/pm/ApplicationInfo;I)V
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;-><init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->access$200(Lcom/android/server/pm/dex/DexManager$PackageCodeLocations;)Ljava/lang/String;
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->mergeAppDataDirs(Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager$PackageCodeLocations;->updateCodeLocation(Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/pm/dex/DexManager;->access$300(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/pm/dex/DexManager;->access$500()I
+PLcom/android/server/pm/dex/DexManager;->access$700()I
+PLcom/android/server/pm/dex/DexManager;->cachePackageCodeLocation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager;->cachePackageInfo(Landroid/content/pm/PackageInfo;I)V
+PLcom/android/server/pm/dex/DexManager;->dexoptSecondaryDex(Lcom/android/server/pm/dex/DexoptOptions;)Z
+PLcom/android/server/pm/dex/DexManager;->getAllPackagesWithSecondaryDexFiles()Ljava/util/Set;
+PLcom/android/server/pm/dex/DexManager;->getPackageUseInfoOrDefault(Ljava/lang/String;)Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;
+PLcom/android/server/pm/dex/DexManager;->load(Ljava/util/Map;)V
+PLcom/android/server/pm/dex/DexManager;->loadInternal(Ljava/util/Map;)V
+PLcom/android/server/pm/dex/DexManager;->notifyDexLoad(Landroid/content/pm/ApplicationInfo;Ljava/util/List;Ljava/util/List;Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager;->notifyDexLoadInternal(Landroid/content/pm/ApplicationInfo;Ljava/util/List;Ljava/util/List;Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexManager;->notifyPackageInstalled(Landroid/content/pm/PackageInfo;I)V
+PLcom/android/server/pm/dex/DexManager;->notifyPackageUpdated(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
+PLcom/android/server/pm/dex/DexManager;->putIfAbsent(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/pm/dex/DexManager;->reconcileSecondaryDexFiles(Ljava/lang/String;)V
+PLcom/android/server/pm/dex/DexManager;->registerSettingObserver()V
+PLcom/android/server/pm/dex/DexManager;->systemReady()V
+PLcom/android/server/pm/dex/DexoptOptions;-><init>(Ljava/lang/String;II)V
+PLcom/android/server/pm/dex/DexoptOptions;-><init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/pm/dex/DexoptOptions;->getCompilationReason()I
+PLcom/android/server/pm/dex/DexoptOptions;->getCompilerFilter()Ljava/lang/String;
+PLcom/android/server/pm/dex/DexoptOptions;->getPackageName()Ljava/lang/String;
+PLcom/android/server/pm/dex/DexoptOptions;->getSplitName()Ljava/lang/String;
+PLcom/android/server/pm/dex/DexoptOptions;->isBootComplete()Z
+PLcom/android/server/pm/dex/DexoptOptions;->isCheckForProfileUpdates()Z
+PLcom/android/server/pm/dex/DexoptOptions;->isDexoptAsSharedLibrary()Z
+PLcom/android/server/pm/dex/DexoptOptions;->isDexoptIdleBackgroundJob()Z
+PLcom/android/server/pm/dex/DexoptOptions;->isDexoptInstallWithDexMetadata()Z
+PLcom/android/server/pm/dex/DexoptOptions;->isDexoptOnlySecondaryDex()Z
+PLcom/android/server/pm/dex/DexoptOptions;->isDexoptOnlySharedDex()Z
+PLcom/android/server/pm/dex/DexoptOptions;->isDowngrade()Z
+PLcom/android/server/pm/dex/DexoptOptions;->isForce()Z
+PLcom/android/server/pm/dex/DexoptUtils;->encodeClassLoader(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/dex/DexoptUtils;->encodeClassLoaderChain(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/dex/DexoptUtils;->encodeClasspath(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/dex/DexoptUtils;->encodeClasspath([Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/pm/dex/DexoptUtils;->getClassLoaderContexts(Landroid/content/pm/ApplicationInfo;[Ljava/lang/String;[Z)[Ljava/lang/String;
+PLcom/android/server/pm/dex/DexoptUtils;->processContextForDexLoad(Ljava/util/List;Ljava/util/List;)[Ljava/lang/String;
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;-><init>(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)V
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;-><init>(ZILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->access$200(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Ljava/util/Set;
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->access$300(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)I
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->access$400(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->access$600(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->access$700(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Ljava/util/Set;
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->getClassLoaderContext()Ljava/lang/String;
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->getLoaderIsas()Ljava/util/Set;
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->getLoadingPackages()Ljava/util/Set;
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->getOwnerUserId()I
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->isUsedByOtherApps()Z
+PLcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;->merge(Lcom/android/server/pm/dex/PackageDexUsage$DexUseInfo;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;-><init>(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)V
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->access$000(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->access$100(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)Ljava/util/Map;
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->access$500(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)Ljava/util/Map;
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->access$800(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->clearCodePathUsedByOtherApps()Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->getDexUseInfoMap()Ljava/util/Map;
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->isAnyCodePathUsedByOtherApps()Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->isUsedByOtherApps(Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;->mergeCodePathUsedByOtherApps(Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->clearUsedByOtherApps(Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->clonePackageUseInfoMap()Ljava/util/Map;
+PLcom/android/server/pm/dex/PackageDexUsage;->getAllPackagesWithSecondaryDexFiles()Ljava/util/Set;
+PLcom/android/server/pm/dex/PackageDexUsage;->getPackageUseInfo(Ljava/lang/String;)Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;
+PLcom/android/server/pm/dex/PackageDexUsage;->isSupportedVersion(I)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->maybeAddLoadingPackage(Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->maybeReadClassLoaderContext(Ljava/io/BufferedReader;I)Ljava/lang/String;
+PLcom/android/server/pm/dex/PackageDexUsage;->maybeReadLoadingPackages(Ljava/io/BufferedReader;I)Ljava/util/Set;
+PLcom/android/server/pm/dex/PackageDexUsage;->maybeWriteAsync()V
+PLcom/android/server/pm/dex/PackageDexUsage;->read()V
+PLcom/android/server/pm/dex/PackageDexUsage;->read(Ljava/io/Reader;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->readBoolean(Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->readInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->readInternal(Ljava/lang/Void;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->record(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;ZZLjava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->removeDexFile(Lcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;Ljava/lang/String;I)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->removeDexFile(Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/pm/dex/PackageDexUsage;->syncData(Ljava/util/Map;Ljava/util/Map;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->write(Ljava/io/Writer;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->writeBoolean(Z)Ljava/lang/String;
+PLcom/android/server/pm/dex/PackageDexUsage;->writeInternal(Ljava/lang/Object;)V
+PLcom/android/server/pm/dex/PackageDexUsage;->writeInternal(Ljava/lang/Void;)V
+PLcom/android/server/pm/permission/BasePermission;->addToTree(ILandroid/content/pm/PermissionInfo;Lcom/android/server/pm/permission/BasePermission;)Z
+PLcom/android/server/pm/permission/BasePermission;->calculateFootprint(Lcom/android/server/pm/permission/BasePermission;)I
+PLcom/android/server/pm/permission/BasePermission;->comparePermissionInfos(Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;)Z
+PLcom/android/server/pm/permission/BasePermission;->compareStrings(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
+PLcom/android/server/pm/permission/BasePermission;->enforceDeclaredUsedAndRuntimeOrDevelopment(Landroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/permission/BasePermission;->enforcePermissionTree(Ljava/util/Collection;Ljava/lang/String;I)Lcom/android/server/pm/permission/BasePermission;
+PLcom/android/server/pm/permission/BasePermission;->generatePermissionInfo(II)Landroid/content/pm/PermissionInfo;
+PLcom/android/server/pm/permission/BasePermission;->generatePermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
+PLcom/android/server/pm/permission/BasePermission;->getProtectionLevel()I
+PLcom/android/server/pm/permission/BasePermission;->getUid()I
+PLcom/android/server/pm/permission/BasePermission;->isDevelopment()Z
+PLcom/android/server/pm/permission/BasePermission;->isInstaller()Z
+PLcom/android/server/pm/permission/BasePermission;->isPre23()Z
+PLcom/android/server/pm/permission/BasePermission;->isPreInstalled()Z
+PLcom/android/server/pm/permission/BasePermission;->isSetup()Z
+PLcom/android/server/pm/permission/BasePermission;->isSystemTextClassifier()Z
+PLcom/android/server/pm/permission/BasePermission;->isVerifier()Z
+PLcom/android/server/pm/permission/BasePermission;->setPermission(Landroid/content/pm/PackageParser$Permission;)V
+PLcom/android/server/pm/permission/BasePermission;->setSourcePackageSetting(Lcom/android/server/pm/PackageSettingBase;)V
+PLcom/android/server/pm/permission/BasePermission;->updateDynamicPermission(Ljava/util/Collection;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermissionGrant;-><init>(Ljava/lang/String;Z)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->doesPackageSupportRuntimePermissions(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->getDefaultPermissionFiles()[Ljava/io/File;
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->getDefaultProviderAuthorityPackage(Ljava/lang/String;I)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->getDefaultSystemHandlerActivityPackage(Landroid/content/Intent;I)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->getDefaultSystemHandlerServicePackage(Landroid/content/Intent;I)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->getHeadlessSyncAdapterPackages([Ljava/lang/String;I)Ljava/util/List;
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->getPackage(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->getSystemPackage(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantDefaultPermissionExceptions(I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantDefaultPermissions(I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantDefaultPermissionsToDefaultDialerApp(Ljava/lang/String;I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantDefaultPermissionsToDefaultSystemDialerApp(Landroid/content/pm/PackageParser$Package;I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantDefaultPermissionsToDefaultSystemSmsApp(Landroid/content/pm/PackageParser$Package;I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantDefaultPermissionsToEnabledImsServices([Ljava/lang/String;I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantDefaultPermissionsToEnabledTelephonyDataServices([Ljava/lang/String;I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantDefaultSystemHandlerPermissions(I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantPermissionsToSysComponentsAndPrivApps(I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantRuntimePermissions(Landroid/content/pm/PackageParser$Package;Ljava/util/Set;I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantRuntimePermissions(Landroid/content/pm/PackageParser$Package;Ljava/util/Set;ZI)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantRuntimePermissionsForPackage(ILandroid/content/pm/PackageParser$Package;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->isSysComponentOrPersistentPlatformSignedPrivApp(Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->parse(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/Map;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->parseExceptions(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/Map;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->parsePermission(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/List;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->readDefaultPermissionExceptionsLocked()Landroid/util/ArrayMap;
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->revokeDefaultPermissionsFromDisabledTelephonyDataServices([Ljava/lang/String;I)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->setDialerAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->setLocationPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->setSimCallManagerPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->setSmsAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->setSyncAdapterPackagesProvider(Landroid/content/pm/PackageManagerInternal$SyncAdapterPackagesProvider;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->setUseOpenWifiAppPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->setVoiceInteractionPackagesProvider(Landroid/content/pm/PackageManagerInternal$PackagesProvider;)V
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->addDynamicPermission(Landroid/content/pm/PermissionInfo;ZILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)Z
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;II)I
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->getPermissionGroupInfo(Ljava/lang/String;II)Landroid/content/pm/PermissionGroupInfo;
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;II)Landroid/content/pm/PermissionInfo;
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->getPermissionInfoByGroup(Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->getPermissionTEMP(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->grantRequestedRuntimePermissions(Landroid/content/pm/PackageParser$Package;[I[Ljava/lang/String;ILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;ZIILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->revokeRuntimePermissionsIfGroupChanged(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Ljava/util/ArrayList;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->systemReady()V
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->updateAllPermissions(Ljava/lang/String;ZLjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IIIILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->updatePermissions(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;ZLjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->access$100(Lcom/android/server/pm/permission/PermissionManagerService;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->access$1000(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/PackageParser$Package;[I[Ljava/lang/String;ILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->access$1300(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Landroid/content/pm/PackageParser$Package;ZLjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->access$1400(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;ZLjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->access$1600(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Ljava/lang/String;II)I
+PLcom/android/server/pm/permission/PermissionManagerService;->access$1700(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Ljava/lang/String;IIIILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->access$2300(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;II)Landroid/content/pm/PermissionGroupInfo;
+PLcom/android/server/pm/permission/PermissionManagerService;->access$2500(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Ljava/lang/String;II)Landroid/content/pm/PermissionInfo;
+PLcom/android/server/pm/permission/PermissionManagerService;->access$2600(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/permission/PermissionManagerService;->access$2900(Lcom/android/server/pm/permission/PermissionManagerService;)Ljava/lang/Object;
+PLcom/android/server/pm/permission/PermissionManagerService;->access$300(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Ljava/util/ArrayList;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->access$700(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/PermissionInfo;ILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)Z
+PLcom/android/server/pm/permission/PermissionManagerService;->access$900(Lcom/android/server/pm/permission/PermissionManagerService;Ljava/lang/String;Ljava/lang/String;ZIILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->addDynamicPermission(Landroid/content/pm/PermissionInfo;ILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)Z
+PLcom/android/server/pm/permission/PermissionManagerService;->adjustPermissionProtectionFlagsLocked(ILjava/lang/String;I)I
+PLcom/android/server/pm/permission/PermissionManagerService;->calculateCurrentPermissionFootprintLocked(Lcom/android/server/pm/permission/BasePermission;)I
+PLcom/android/server/pm/permission/PermissionManagerService;->enforceGrantRevokeRuntimePermissionPermissions(Ljava/lang/String;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->enforcePermissionCapLocked(Landroid/content/pm/PermissionInfo;Lcom/android/server/pm/permission/BasePermission;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->getPermission(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+PLcom/android/server/pm/permission/PermissionManagerService;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;II)I
+PLcom/android/server/pm/permission/PermissionManagerService;->getPermissionGroupInfo(Ljava/lang/String;II)Landroid/content/pm/PermissionGroupInfo;
+PLcom/android/server/pm/permission/PermissionManagerService;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;II)Landroid/content/pm/PermissionInfo;
+PLcom/android/server/pm/permission/PermissionManagerService;->getPermissionInfoByGroup(Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/permission/PermissionManagerService;->getVolumeUuidForPackage(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+PLcom/android/server/pm/permission/PermissionManagerService;->grantRequestedRuntimePermissions(Landroid/content/pm/PackageParser$Package;[I[Ljava/lang/String;ILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->grantRequestedRuntimePermissionsForUser(Landroid/content/pm/PackageParser$Package;I[Ljava/lang/String;ILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->grantRuntimePermission(Ljava/lang/String;Ljava/lang/String;ZIILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->hasPermission(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
+PLcom/android/server/pm/permission/PermissionManagerService;->isNewPlatformPermissionForPackage(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;)Z
+PLcom/android/server/pm/permission/PermissionManagerService;->isPackageRequestingPermission(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
+PLcom/android/server/pm/permission/PermissionManagerService;->logPermission(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->revokeRuntimePermissionsIfGroupChanged(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Ljava/util/ArrayList;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->revokeUnusedSharedUserPermissionsLocked(Lcom/android/server/pm/SharedUserSetting;[I)[I
+PLcom/android/server/pm/permission/PermissionManagerService;->systemReady()V
+PLcom/android/server/pm/permission/PermissionManagerService;->updateAllPermissions(Ljava/lang/String;ZLjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IIIILcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->updatePermissionTrees(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;I)I
+PLcom/android/server/pm/permission/PermissionManagerService;->updatePermissions(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;Ljava/lang/String;ILjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionManagerService;->updatePermissions(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;ZLjava/util/Collection;Lcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;)V
+PLcom/android/server/pm/permission/PermissionSettings;->addAppOpPackage(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/pm/permission/PermissionSettings;->enforcePermissionTree(Ljava/lang/String;I)Lcom/android/server/pm/permission/BasePermission;
+PLcom/android/server/pm/permission/PermissionSettings;->writePermissionTrees(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/pm/permission/PermissionsState;-><init>(Lcom/android/server/pm/permission/PermissionsState;)V
+PLcom/android/server/pm/permission/PermissionsState;->getInstallPermissionState(Ljava/lang/String;)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+PLcom/android/server/pm/permission/PermissionsState;->getPermissionFlags(Ljava/lang/String;I)I
+PLcom/android/server/pm/permission/PermissionsState;->reset()V
+PLcom/android/server/pm/permission/PermissionsState;->revokeInstallPermission(Lcom/android/server/pm/permission/BasePermission;)I
+PLcom/android/server/pm/permission/PermissionsState;->revokePermission(Lcom/android/server/pm/permission/BasePermission;I)I
+PLcom/android/server/pm/permission/PermissionsState;->setGlobalGids([I)V
+PLcom/android/server/policy/-$$Lambda$PhoneWindowManager$SMVPfeuVGHeByGLchxVc-pxEEMw;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/-$$Lambda$PhoneWindowManager$SMVPfeuVGHeByGLchxVc-pxEEMw;->run()V
+PLcom/android/server/policy/-$$Lambda$PhoneWindowManager$qkEs_boDTAbqA6wKqcLwnsgoklc;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/-$$Lambda$PhoneWindowManager$qkEs_boDTAbqA6wKqcLwnsgoklc;->run()V
+PLcom/android/server/policy/-$$Lambda$oXa0y3A-00RiQs6-KTPBgpkGtgw;-><init>(Lcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;)V
+PLcom/android/server/policy/-$$Lambda$oXa0y3A-00RiQs6-KTPBgpkGtgw;->run()V
+PLcom/android/server/policy/BarController$BarHandler;-><init>(Lcom/android/server/policy/BarController;)V
+PLcom/android/server/policy/BarController$BarHandler;-><init>(Lcom/android/server/policy/BarController;Lcom/android/server/policy/BarController$1;)V
+PLcom/android/server/policy/BarController$BarHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/policy/BarController;-><init>(Ljava/lang/String;IIIIII)V
+PLcom/android/server/policy/BarController;->access$200(Lcom/android/server/policy/BarController;)Lcom/android/server/policy/BarController$OnBarVisibilityChangedListener;
+PLcom/android/server/policy/BarController;->adjustSystemUiVisibilityLw(II)V
+PLcom/android/server/policy/BarController;->checkShowTransientBarLw()Z
+PLcom/android/server/policy/BarController;->getStatusBarInternal()Lcom/android/server/statusbar/StatusBarManagerInternal;
+PLcom/android/server/policy/BarController;->setOnBarVisibilityChangedListener(Lcom/android/server/policy/BarController$OnBarVisibilityChangedListener;Z)V
+PLcom/android/server/policy/BarController;->setShowTransparent(Z)V
+PLcom/android/server/policy/BarController;->setWindow(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/BarController;->skipAnimation()Z
+PLcom/android/server/policy/BarController;->wasRecentlyTranslucent()Z
+PLcom/android/server/policy/GlobalKeyManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/policy/GlobalKeyManager;->handleGlobalKey(Landroid/content/Context;ILandroid/view/KeyEvent;)Z
+PLcom/android/server/policy/GlobalKeyManager;->loadGlobalKeys(Landroid/content/Context;)V
+PLcom/android/server/policy/GlobalKeyManager;->shouldHandleGlobalKey(ILandroid/view/KeyEvent;)Z
+PLcom/android/server/policy/IconUtilities;-><init>(Landroid/content/Context;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation$1;-><init>(Lcom/android/server/policy/ImmersiveModeConfirmation;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation$2;-><init>(Lcom/android/server/policy/ImmersiveModeConfirmation;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation$H;-><init>(Lcom/android/server/policy/ImmersiveModeConfirmation;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation$H;-><init>(Lcom/android/server/policy/ImmersiveModeConfirmation;Lcom/android/server/policy/ImmersiveModeConfirmation$1;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation;-><init>(Landroid/content/Context;)V
+PLcom/android/server/policy/ImmersiveModeConfirmation;->getNavBarExitDuration()J
+PLcom/android/server/policy/ImmersiveModeConfirmation;->getWindowToken()Landroid/os/IBinder;
+PLcom/android/server/policy/ImmersiveModeConfirmation;->loadSetting(I)V
+PLcom/android/server/policy/ImmersiveModeConfirmation;->onPowerKeyDown(ZJZZ)Z
+PLcom/android/server/policy/ImmersiveModeConfirmation;->systemReady()V
+PLcom/android/server/policy/LogDecelerateInterpolator;-><init>(II)V
+PLcom/android/server/policy/LogDecelerateInterpolator;->computeLog(FII)F
+PLcom/android/server/policy/LogDecelerateInterpolator;->getInterpolation(F)F
+PLcom/android/server/policy/PhoneWindowManager$10;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$10;->onShowingChanged()V
+PLcom/android/server/policy/PhoneWindowManager$10;->onTrustedChanged()V
+PLcom/android/server/policy/PhoneWindowManager$13;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$14;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$15;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$15;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/policy/PhoneWindowManager$16;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$16;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/policy/PhoneWindowManager$17;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$18;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$18;->run()V
+PLcom/android/server/policy/PhoneWindowManager$1;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$1;->run()V
+PLcom/android/server/policy/PhoneWindowManager$20;-><init>(Lcom/android/server/policy/PhoneWindowManager;IIILandroid/graphics/Rect;Landroid/graphics/Rect;Lcom/android/server/policy/WindowManagerPolicy$WindowState;Z)V
+PLcom/android/server/policy/PhoneWindowManager$20;->run()V
+PLcom/android/server/policy/PhoneWindowManager$2;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$2;->onDrawn()V
+PLcom/android/server/policy/PhoneWindowManager$3;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$4;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$5;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$5;->onBarVisibilityChanged(Z)V
+PLcom/android/server/policy/PhoneWindowManager$6;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$7;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$8;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$8;->onDown()V
+PLcom/android/server/policy/PhoneWindowManager$8;->onFling(I)V
+PLcom/android/server/policy/PhoneWindowManager$8;->onSwipeFromBottom()V
+PLcom/android/server/policy/PhoneWindowManager$8;->onSwipeFromLeft()V
+PLcom/android/server/policy/PhoneWindowManager$8;->onSwipeFromRight()V
+PLcom/android/server/policy/PhoneWindowManager$8;->onSwipeFromTop()V
+PLcom/android/server/policy/PhoneWindowManager$8;->onUpOrCancel()V
+PLcom/android/server/policy/PhoneWindowManager$9;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$9;->onAppTransitionStartingLocked(ILandroid/os/IBinder;Landroid/os/IBinder;JJJ)I
+PLcom/android/server/policy/PhoneWindowManager$MyOrientationListener$UpdateRunnable;-><init>(Lcom/android/server/policy/PhoneWindowManager$MyOrientationListener;I)V
+PLcom/android/server/policy/PhoneWindowManager$MyOrientationListener$UpdateRunnable;->run()V
+PLcom/android/server/policy/PhoneWindowManager$MyOrientationListener;-><init>(Lcom/android/server/policy/PhoneWindowManager;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/policy/PhoneWindowManager$MyOrientationListener;->onProposedRotationChanged(I)V
+PLcom/android/server/policy/PhoneWindowManager$MyWakeGestureListener;-><init>(Lcom/android/server/policy/PhoneWindowManager;Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/policy/PhoneWindowManager$PolicyHandler;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$PolicyHandler;-><init>(Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager$1;)V
+PLcom/android/server/policy/PhoneWindowManager$PolicyHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/policy/PhoneWindowManager$ScreenLockTimeout;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$ScreenshotRunnable;-><init>(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager$ScreenshotRunnable;-><init>(Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager$1;)V
+PLcom/android/server/policy/PhoneWindowManager$SettingsObserver;-><init>(Lcom/android/server/policy/PhoneWindowManager;Landroid/os/Handler;)V
+PLcom/android/server/policy/PhoneWindowManager$SettingsObserver;->observe()V
+PLcom/android/server/policy/PhoneWindowManager$SettingsObserver;->onChange(Z)V
+PLcom/android/server/policy/PhoneWindowManager;-><init>()V
+PLcom/android/server/policy/PhoneWindowManager;->access$1300(Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->access$2000(Lcom/android/server/policy/PhoneWindowManager;I)V
+PLcom/android/server/policy/PhoneWindowManager;->access$300(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager;->access$3400(Lcom/android/server/policy/PhoneWindowManager;IJ)I
+PLcom/android/server/policy/PhoneWindowManager;->access$3600(Lcom/android/server/policy/PhoneWindowManager;)I
+PLcom/android/server/policy/PhoneWindowManager;->access$400(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager;->addSplashScreen(Landroid/os/IBinder;Ljava/lang/String;ILandroid/content/res/CompatibilityInfo;Ljava/lang/CharSequence;IIIILandroid/content/res/Configuration;I)Lcom/android/server/policy/WindowManagerPolicy$StartingSurface;
+PLcom/android/server/policy/PhoneWindowManager;->addSplashscreenContent(Lcom/android/internal/policy/PhoneWindow;Landroid/content/Context;)V
+PLcom/android/server/policy/PhoneWindowManager;->adjustConfigurationLw(Landroid/content/res/Configuration;II)V
+PLcom/android/server/policy/PhoneWindowManager;->adjustSystemUiVisibilityLw(I)I
+PLcom/android/server/policy/PhoneWindowManager;->adjustWindowParamsLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;Z)V
+PLcom/android/server/policy/PhoneWindowManager;->allowAppAnimationsLw()Z
+PLcom/android/server/policy/PhoneWindowManager;->applyLidSwitchState()V
+PLcom/android/server/policy/PhoneWindowManager;->awakenDreams()V
+PLcom/android/server/policy/PhoneWindowManager;->beginLayoutLw(Lcom/android/server/wm/DisplayFrames;I)V
+PLcom/android/server/policy/PhoneWindowManager;->beginPostLayoutPolicyLw(II)V
+PLcom/android/server/policy/PhoneWindowManager;->bindKeyguard()V
+PLcom/android/server/policy/PhoneWindowManager;->calculateRelevantTaskInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;II)V
+PLcom/android/server/policy/PhoneWindowManager;->canDismissBootAnimation()Z
+PLcom/android/server/policy/PhoneWindowManager;->canReceiveInput(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/policy/PhoneWindowManager;->cancelPendingAccessibilityShortcutAction()V
+PLcom/android/server/policy/PhoneWindowManager;->cancelPendingBackKeyAction()V
+PLcom/android/server/policy/PhoneWindowManager;->cancelPendingPowerKeyAction()V
+PLcom/android/server/policy/PhoneWindowManager;->cancelPendingScreenshotChordAction()V
+PLcom/android/server/policy/PhoneWindowManager;->cancelPreloadRecentApps()V
+PLcom/android/server/policy/PhoneWindowManager;->checkAddPermission(Landroid/view/WindowManager$LayoutParams;[I)I
+PLcom/android/server/policy/PhoneWindowManager;->checkShowToOwnerOnly(Landroid/view/WindowManager$LayoutParams;)Z
+PLcom/android/server/policy/PhoneWindowManager;->chooseNavigationColorWindowLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;I)Lcom/android/server/policy/WindowManagerPolicy$WindowState;
+PLcom/android/server/policy/PhoneWindowManager;->configureNavBarOpacity(IZZZ)I
+PLcom/android/server/policy/PhoneWindowManager;->createHiddenByKeyguardExit(ZZ)Landroid/view/animation/Animation;
+PLcom/android/server/policy/PhoneWindowManager;->createHomeDockIntent()Landroid/content/Intent;
+PLcom/android/server/policy/PhoneWindowManager;->dispatchUnhandledKey(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
+PLcom/android/server/policy/PhoneWindowManager;->enableKeyguard(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->enableScreenAfterBoot()V
+PLcom/android/server/policy/PhoneWindowManager;->finishKeyguardDrawn()V
+PLcom/android/server/policy/PhoneWindowManager;->finishPostLayoutPolicyLw()I
+PLcom/android/server/policy/PhoneWindowManager;->finishPowerKeyPress()V
+PLcom/android/server/policy/PhoneWindowManager;->finishScreenTurningOn()V
+PLcom/android/server/policy/PhoneWindowManager;->finishWindowsDrawn()V
+PLcom/android/server/policy/PhoneWindowManager;->finishedGoingToSleep(I)V
+PLcom/android/server/policy/PhoneWindowManager;->finishedWakingUp()V
+PLcom/android/server/policy/PhoneWindowManager;->focusChangedLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)I
+PLcom/android/server/policy/PhoneWindowManager;->getConfigDisplayHeight(IIIIILandroid/view/DisplayCutout;)I
+PLcom/android/server/policy/PhoneWindowManager;->getConfigDisplayWidth(IIIIILandroid/view/DisplayCutout;)I
+PLcom/android/server/policy/PhoneWindowManager;->getDisplayContext(Landroid/content/Context;I)Landroid/content/Context;
+PLcom/android/server/policy/PhoneWindowManager;->getDreamManager()Landroid/service/dreams/IDreamManager;
+PLcom/android/server/policy/PhoneWindowManager;->getHdmiControl()Lcom/android/server/policy/PhoneWindowManager$HdmiControl;
+PLcom/android/server/policy/PhoneWindowManager;->getKeyguardDrawnTimeout()J
+PLcom/android/server/policy/PhoneWindowManager;->getLayoutHintLw(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;Lcom/android/server/wm/DisplayFrames;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;)Z
+PLcom/android/server/policy/PhoneWindowManager;->getLongIntArray(Landroid/content/res/Resources;I)[J
+PLcom/android/server/policy/PhoneWindowManager;->getMaxMultiPressPowerCount()I
+PLcom/android/server/policy/PhoneWindowManager;->getNavBarPosition()I
+PLcom/android/server/policy/PhoneWindowManager;->getNavigationBarWidth(II)I
+PLcom/android/server/policy/PhoneWindowManager;->getNonDecorDisplayHeight(IIIIILandroid/view/DisplayCutout;)I
+PLcom/android/server/policy/PhoneWindowManager;->getNonDecorDisplayWidth(IIIIILandroid/view/DisplayCutout;)I
+PLcom/android/server/policy/PhoneWindowManager;->getNonDecorInsetsLw(IIILandroid/view/DisplayCutout;Landroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->getResolvedLongPressOnPowerBehavior()I
+PLcom/android/server/policy/PhoneWindowManager;->getStableInsetsLw(IIILandroid/view/DisplayCutout;Landroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->getStatusBarManagerInternal()Lcom/android/server/statusbar/StatusBarManagerInternal;
+PLcom/android/server/policy/PhoneWindowManager;->getStatusBarService()Lcom/android/internal/statusbar/IStatusBarService;
+PLcom/android/server/policy/PhoneWindowManager;->getSystemDecorLayerLw()I
+PLcom/android/server/policy/PhoneWindowManager;->getSystemUiContext()Landroid/content/Context;
+PLcom/android/server/policy/PhoneWindowManager;->getTelecommService()Landroid/telecom/TelecomManager;
+PLcom/android/server/policy/PhoneWindowManager;->getVibrationEffect(I)Landroid/os/VibrationEffect;
+PLcom/android/server/policy/PhoneWindowManager;->goToSleep(JII)V
+PLcom/android/server/policy/PhoneWindowManager;->handleShortPressOnHome()V
+PLcom/android/server/policy/PhoneWindowManager;->handleStartTransitionForKeyguardLw(IJ)I
+PLcom/android/server/policy/PhoneWindowManager;->hasLongPressOnBackBehavior()Z
+PLcom/android/server/policy/PhoneWindowManager;->hasLongPressOnPowerBehavior()Z
+PLcom/android/server/policy/PhoneWindowManager;->hasNavigationBar()Z
+PLcom/android/server/policy/PhoneWindowManager;->hasVeryLongPressOnPowerBehavior()Z
+PLcom/android/server/policy/PhoneWindowManager;->init(Landroid/content/Context;Landroid/view/IWindowManager;Lcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs;)V
+PLcom/android/server/policy/PhoneWindowManager;->initializeHdmiState()V
+PLcom/android/server/policy/PhoneWindowManager;->initializeHdmiStateInternal()V
+PLcom/android/server/policy/PhoneWindowManager;->interceptBackKeyDown()V
+PLcom/android/server/policy/PhoneWindowManager;->interceptBackKeyUp(Landroid/view/KeyEvent;)Z
+PLcom/android/server/policy/PhoneWindowManager;->interceptKeyBeforeDispatching(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Landroid/view/KeyEvent;I)J
+PLcom/android/server/policy/PhoneWindowManager;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
+PLcom/android/server/policy/PhoneWindowManager;->interceptPowerKeyDown(Landroid/view/KeyEvent;Z)V
+PLcom/android/server/policy/PhoneWindowManager;->interceptPowerKeyUp(Landroid/view/KeyEvent;ZZ)V
+PLcom/android/server/policy/PhoneWindowManager;->interceptRingerToggleChord()V
+PLcom/android/server/policy/PhoneWindowManager;->interceptScreenshotChord()V
+PLcom/android/server/policy/PhoneWindowManager;->interceptSystemNavigationKey(Landroid/view/KeyEvent;)V
+PLcom/android/server/policy/PhoneWindowManager;->isAnyPortrait(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->isDefaultOrientationForced()Z
+PLcom/android/server/policy/PhoneWindowManager;->isKeyguardDrawnLw()Z
+PLcom/android/server/policy/PhoneWindowManager;->isKeyguardHostWindow(Landroid/view/WindowManager$LayoutParams;)Z
+PLcom/android/server/policy/PhoneWindowManager;->isKeyguardOccluded()Z
+PLcom/android/server/policy/PhoneWindowManager;->isKeyguardSecure(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->isNavBarEmpty(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->isNavBarForcedShownLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/policy/PhoneWindowManager;->isRotationChoicePossible(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->isScreenOn()Z
+PLcom/android/server/policy/PhoneWindowManager;->isShowingDreamLw()Z
+PLcom/android/server/policy/PhoneWindowManager;->isTheaterModeEnabled()Z
+PLcom/android/server/policy/PhoneWindowManager;->isUserSetupComplete()Z
+PLcom/android/server/policy/PhoneWindowManager;->isValidGlobalKey(I)Z
+PLcom/android/server/policy/PhoneWindowManager;->keepScreenOnStartedLw()V
+PLcom/android/server/policy/PhoneWindowManager;->keepScreenOnStoppedLw()V
+PLcom/android/server/policy/PhoneWindowManager;->lambda$new$0(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager;->lambda$new$1(Lcom/android/server/policy/PhoneWindowManager;)V
+PLcom/android/server/policy/PhoneWindowManager;->launchHomeFromHotKey()V
+PLcom/android/server/policy/PhoneWindowManager;->launchHomeFromHotKey(ZZ)V
+PLcom/android/server/policy/PhoneWindowManager;->layoutNavigationBar(Lcom/android/server/wm/DisplayFrames;ILandroid/graphics/Rect;ZZZZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->layoutScreenDecorWindows(Lcom/android/server/wm/DisplayFrames;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->layoutStatusBar(Lcom/android/server/wm/DisplayFrames;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;IZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->layoutWallpaper(Lcom/android/server/wm/DisplayFrames;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/policy/PhoneWindowManager;->navigationBarPosition(III)I
+PLcom/android/server/policy/PhoneWindowManager;->needSensorRunningLp()Z
+PLcom/android/server/policy/PhoneWindowManager;->offsetInputMethodWindowLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/wm/DisplayFrames;)V
+PLcom/android/server/policy/PhoneWindowManager;->okToAnimate()Z
+PLcom/android/server/policy/PhoneWindowManager;->onConfigurationChanged()V
+PLcom/android/server/policy/PhoneWindowManager;->onKeyguardOccludedChangedLw(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->onOverlayChangedLw()V
+PLcom/android/server/policy/PhoneWindowManager;->onSystemUiStarted()V
+PLcom/android/server/policy/PhoneWindowManager;->performHapticFeedbackLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;IZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->powerPress(JZI)V
+PLcom/android/server/policy/PhoneWindowManager;->prepareAddWindowLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Landroid/view/WindowManager$LayoutParams;)I
+PLcom/android/server/policy/PhoneWindowManager;->readCameraLensCoverState()V
+PLcom/android/server/policy/PhoneWindowManager;->readConfigurationDependentBehaviors()V
+PLcom/android/server/policy/PhoneWindowManager;->readLidState()V
+PLcom/android/server/policy/PhoneWindowManager;->readRotation(I)I
+PLcom/android/server/policy/PhoneWindowManager;->registerShortcutKey(JLcom/android/internal/policy/IShortcutService;)V
+PLcom/android/server/policy/PhoneWindowManager;->removeWindowLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->reportScreenStateToVrManager(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->requestTransientBars(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->rotationForOrientationLw(IIZ)I
+PLcom/android/server/policy/PhoneWindowManager;->rotationHasCompatibleMetricsLw(II)Z
+PLcom/android/server/policy/PhoneWindowManager;->screenTurnedOff()V
+PLcom/android/server/policy/PhoneWindowManager;->screenTurnedOn()V
+PLcom/android/server/policy/PhoneWindowManager;->screenTurningOff(Lcom/android/server/policy/WindowManagerPolicy$ScreenOffListener;)V
+PLcom/android/server/policy/PhoneWindowManager;->screenTurningOn(Lcom/android/server/policy/WindowManagerPolicy$ScreenOnListener;)V
+PLcom/android/server/policy/PhoneWindowManager;->selectAnimationLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;I)I
+PLcom/android/server/policy/PhoneWindowManager;->selectRotationAnimationLw([I)V
+PLcom/android/server/policy/PhoneWindowManager;->sendCloseSystemWindows(Ljava/lang/String;)V
+PLcom/android/server/policy/PhoneWindowManager;->sendSystemKeyToStatusBar(I)V
+PLcom/android/server/policy/PhoneWindowManager;->sendSystemKeyToStatusBarAsync(I)V
+PLcom/android/server/policy/PhoneWindowManager;->setAttachedWindowFrames(Lcom/android/server/policy/WindowManagerPolicy$WindowState;IILcom/android/server/policy/WindowManagerPolicy$WindowState;ZLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Lcom/android/server/wm/DisplayFrames;)V
+PLcom/android/server/policy/PhoneWindowManager;->setCurrentOrientationLw(I)V
+PLcom/android/server/policy/PhoneWindowManager;->setDismissImeOnBackKeyPressed(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->setHdmiPlugged(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->setInitialDisplaySize(Landroid/view/Display;III)V
+PLcom/android/server/policy/PhoneWindowManager;->setKeyguardOccludedLw(ZZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->setLastInputMethodWindowLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/policy/PhoneWindowManager;->setNavBarVirtualKeyHapticFeedbackEnabledLw(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->setRotationLw(I)V
+PLcom/android/server/policy/PhoneWindowManager;->setSafeMode(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->shouldDispatchInputWhenNonInteractive(Landroid/view/KeyEvent;)Z
+PLcom/android/server/policy/PhoneWindowManager;->shouldEnableWakeGestureLp()Z
+PLcom/android/server/policy/PhoneWindowManager;->shouldRotateSeamlessly(II)Z
+PLcom/android/server/policy/PhoneWindowManager;->startActivityAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
+PLcom/android/server/policy/PhoneWindowManager;->startDockOrHome(ZZ)V
+PLcom/android/server/policy/PhoneWindowManager;->startKeyguardExitAnimation(JJ)V
+PLcom/android/server/policy/PhoneWindowManager;->startedGoingToSleep(I)V
+PLcom/android/server/policy/PhoneWindowManager;->startedWakingUp()V
+PLcom/android/server/policy/PhoneWindowManager;->systemBooted()V
+PLcom/android/server/policy/PhoneWindowManager;->systemReady()V
+PLcom/android/server/policy/PhoneWindowManager;->topAppHidesStatusBar()Z
+PLcom/android/server/policy/PhoneWindowManager;->updateLightNavigationBarLw(ILcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)I
+PLcom/android/server/policy/PhoneWindowManager;->updateLockScreenTimeout()V
+PLcom/android/server/policy/PhoneWindowManager;->updateOrientationListenerLp()V
+PLcom/android/server/policy/PhoneWindowManager;->updateRotation(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->updateRotation(ZZ)V
+PLcom/android/server/policy/PhoneWindowManager;->updateScreenOffSleepToken(Z)V
+PLcom/android/server/policy/PhoneWindowManager;->updateSettings()V
+PLcom/android/server/policy/PhoneWindowManager;->updateSystemUiVisibilityLw()I
+PLcom/android/server/policy/PhoneWindowManager;->updateUiMode()V
+PLcom/android/server/policy/PhoneWindowManager;->updateWakeGestureListenerLp()V
+PLcom/android/server/policy/PhoneWindowManager;->updateWindowSleepToken()V
+PLcom/android/server/policy/PhoneWindowManager;->validateRotationAnimationLw(IIZ)Z
+PLcom/android/server/policy/PhoneWindowManager;->wakeUp(JZLjava/lang/String;)Z
+PLcom/android/server/policy/PhoneWindowManager;->wakeUpFromPowerKey(J)V
+PLcom/android/server/policy/PolicyControl;->reloadFromSetting(Landroid/content/Context;)V
+PLcom/android/server/policy/PolicyControl;->setFilters(Ljava/lang/String;)V
+PLcom/android/server/policy/ShortcutManager$ShortcutInfo;-><init>(Ljava/lang/String;Landroid/content/Intent;)V
+PLcom/android/server/policy/ShortcutManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/policy/ShortcutManager;->loadShortcuts()V
+PLcom/android/server/policy/SplashScreenSurface;-><init>(Landroid/view/View;Landroid/os/IBinder;)V
+PLcom/android/server/policy/SplashScreenSurface;->remove()V
+PLcom/android/server/policy/StatusBarController$1$1;-><init>(Lcom/android/server/policy/StatusBarController$1;)V
+PLcom/android/server/policy/StatusBarController$1$1;->run()V
+PLcom/android/server/policy/StatusBarController$1$2;-><init>(Lcom/android/server/policy/StatusBarController$1;JJ)V
+PLcom/android/server/policy/StatusBarController$1$2;->run()V
+PLcom/android/server/policy/StatusBarController$1$4;-><init>(Lcom/android/server/policy/StatusBarController$1;)V
+PLcom/android/server/policy/StatusBarController$1$4;->run()V
+PLcom/android/server/policy/StatusBarController$1;-><init>(Lcom/android/server/policy/StatusBarController;)V
+PLcom/android/server/policy/StatusBarController$1;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/policy/StatusBarController$1;->onAppTransitionPendingLocked()V
+PLcom/android/server/policy/StatusBarController$1;->onAppTransitionStartingLocked(ILandroid/os/IBinder;Landroid/os/IBinder;JJJ)I
+PLcom/android/server/policy/StatusBarController;-><init>()V
+PLcom/android/server/policy/StatusBarController;->getAppTransitionListener()Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener;
+PLcom/android/server/policy/StatusBarController;->setTopAppHidesStatusBar(Z)V
+PLcom/android/server/policy/StatusBarController;->skipAnimation()Z
+PLcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;-><init>(Lcom/android/server/policy/SystemGesturesPointerEventListener;)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;-><init>(Lcom/android/server/policy/SystemGesturesPointerEventListener;Lcom/android/server/policy/SystemGesturesPointerEventListener$1;)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener$FlingGestureDetector;->onSingleTapUp(Landroid/view/MotionEvent;)Z
+PLcom/android/server/policy/SystemGesturesPointerEventListener;-><init>(Landroid/content/Context;Lcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->access$100(Lcom/android/server/policy/SystemGesturesPointerEventListener;)Landroid/widget/OverScroller;
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->access$200(Lcom/android/server/policy/SystemGesturesPointerEventListener;)J
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->access$202(Lcom/android/server/policy/SystemGesturesPointerEventListener;J)J
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->access$300(Lcom/android/server/policy/SystemGesturesPointerEventListener;)Lcom/android/server/policy/SystemGesturesPointerEventListener$Callbacks;
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->captureDown(Landroid/view/MotionEvent;I)V
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->checkNull(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
+PLcom/android/server/policy/SystemGesturesPointerEventListener;->systemReady()V
+PLcom/android/server/policy/WakeGestureListener$1;-><init>(Lcom/android/server/policy/WakeGestureListener;)V
+PLcom/android/server/policy/WakeGestureListener$2;-><init>(Lcom/android/server/policy/WakeGestureListener;)V
+PLcom/android/server/policy/WakeGestureListener;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/policy/WakeGestureListener;->cancelWakeUpTrigger()V
+PLcom/android/server/policy/WakeGestureListener;->isSupported()Z
+PLcom/android/server/policy/WindowManagerPolicy;->getSubWindowLayerFromTypeLw(I)I
+PLcom/android/server/policy/WindowOrientationListener$OrientationJudge;-><init>(Lcom/android/server/policy/WindowOrientationListener;)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge$1;-><init>(Lcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge$1;->run()V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;-><init>(Lcom/android/server/policy/WindowOrientationListener;)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->access$402(Lcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;Z)Z
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->evaluateRotationChangeLocked()I
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->getProposedRotationLocked()I
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->isDesiredRotationAcceptableLocked(J)Z
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->onAccuracyChanged(Landroid/hardware/Sensor;I)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->onSensorChanged(Landroid/hardware/SensorEvent;)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->onTouchEndLocked(J)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->onTouchStartLocked()V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->resetLocked(Z)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->scheduleRotationEvaluationIfNecessaryLocked(J)V
+PLcom/android/server/policy/WindowOrientationListener$OrientationSensorJudge;->unscheduleRotationEvaluationLocked()V
+PLcom/android/server/policy/WindowOrientationListener;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
+PLcom/android/server/policy/WindowOrientationListener;-><init>(Landroid/content/Context;Landroid/os/Handler;I)V
+PLcom/android/server/policy/WindowOrientationListener;->access$000(Lcom/android/server/policy/WindowOrientationListener;)Ljava/lang/Object;
+PLcom/android/server/policy/WindowOrientationListener;->access$100()Z
+PLcom/android/server/policy/WindowOrientationListener;->access$300(Lcom/android/server/policy/WindowOrientationListener;)Landroid/os/Handler;
+PLcom/android/server/policy/WindowOrientationListener;->canDetectOrientation()Z
+PLcom/android/server/policy/WindowOrientationListener;->disable()V
+PLcom/android/server/policy/WindowOrientationListener;->enable(Z)V
+PLcom/android/server/policy/WindowOrientationListener;->getProposedRotation()I
+PLcom/android/server/policy/WindowOrientationListener;->onTouchStart()V
+PLcom/android/server/policy/WindowOrientationListener;->setCurrentRotation(I)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$1;-><init>(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardShowDelegate;-><init>(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardShowDelegate;->onDrawn()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardState;-><init>()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardState;->reset()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;-><init>(Landroid/content/Context;Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->access$000(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)Landroid/content/Context;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->access$100(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->access$200(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$KeyguardState;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->access$300(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;)Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->access$302(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;)Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->bindService(Landroid/content/Context;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->hasKeyguard()Z
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->hasLockscreenWallpaper()Z
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isSecure(I)Z
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onBootCompleted()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onDreamingStarted()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onDreamingStopped()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onFinishedGoingToSleep(IZ)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onFinishedWakingUp()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onScreenTurnedOff()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onScreenTurnedOn()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onScreenTurningOff()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onScreenTurningOn(Lcom/android/server/policy/keyguard/KeyguardServiceDelegate$DrawnListener;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onStartedGoingToSleep(I)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onStartedWakingUp()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->onSystemReady()V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->setKeyguardEnabled(Z)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->setOccluded(ZZ)V
+PLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->startKeyguardExitAnimation(JJ)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;-><init>(Landroid/content/Context;Lcom/android/internal/policy/IKeyguardService;Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isSecure(I)Z
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onBootCompleted()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onDreamingStarted()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onDreamingStopped()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onFinishedGoingToSleep(IZ)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onFinishedWakingUp()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onScreenTurnedOff()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onScreenTurnedOn()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onScreenTurningOff()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onScreenTurningOn(Lcom/android/internal/policy/IKeyguardDrawnCallback;)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onStartedGoingToSleep(I)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onStartedWakingUp()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->onSystemReady()V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->setKeyguardEnabled(Z)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->setOccluded(ZZ)V
+PLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->startKeyguardExitAnimation(JJ)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;-><init>(Landroid/content/Context;Lcom/android/internal/policy/IKeyguardService;Lcom/android/server/policy/keyguard/KeyguardStateMonitor$StateCallback;)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isSecure(I)Z
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onHasLockscreenWallpaperChanged(Z)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onInputRestrictedStateChanged(Z)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onShowingStateChanged(Z)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onSimSecureStateChanged(Z)V
+PLcom/android/server/policy/keyguard/KeyguardStateMonitor;->onTrustedChanged(Z)V
+PLcom/android/server/power/-$$Lambda$BatterySaverPolicy$9q6hxnTofoZqK_ebwl_HDCH8A4A;-><init>(Lcom/android/server/power/BatterySaverPolicy;[Lcom/android/server/power/BatterySaverPolicy$BatterySaverPolicyListener;)V
+PLcom/android/server/power/-$$Lambda$BatterySaverPolicy$9q6hxnTofoZqK_ebwl_HDCH8A4A;->run()V
+PLcom/android/server/power/-$$Lambda$BatterySaverPolicy$DPeh8xGdH0ye3BQJ8Ozaqeu6Y30;-><init>(Lcom/android/server/power/BatterySaverPolicy;)V
+PLcom/android/server/power/BatterySaverPolicy;->getDeviceSpecificConfigResId()I
+PLcom/android/server/power/BatterySaverPolicy;->getGlobalSetting(Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/power/BatterySaverPolicy;->getGpsMode()I
+PLcom/android/server/power/BatterySaverPolicy;->lambda$refreshSettings$1(Lcom/android/server/power/BatterySaverPolicy;[Lcom/android/server/power/BatterySaverPolicy$BatterySaverPolicyListener;)V
+PLcom/android/server/power/BatterySaverPolicy;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/power/BatterySaverPolicy;->refreshSettings()V
+PLcom/android/server/power/BatterySaverPolicy;->systemReady()V
+PLcom/android/server/power/BatterySaverPolicy;->updateConstantsLocked(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/power/Notifier$1;-><init>(Lcom/android/server/power/Notifier;I)V
+PLcom/android/server/power/Notifier$1;->run()V
+PLcom/android/server/power/Notifier$2;-><init>(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier$2;->run()V
+PLcom/android/server/power/Notifier$3;-><init>(Lcom/android/server/power/Notifier;I)V
+PLcom/android/server/power/Notifier$3;->run()V
+PLcom/android/server/power/Notifier$4;-><init>(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier$4;->run()V
+PLcom/android/server/power/Notifier$5;-><init>(Lcom/android/server/power/Notifier;I)V
+PLcom/android/server/power/Notifier$5;->run()V
+PLcom/android/server/power/Notifier$6;-><init>(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier$7;-><init>(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier$7;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/power/Notifier$8;-><init>(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier$8;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/power/Notifier$NotifierHandler;-><init>(Lcom/android/server/power/Notifier;Landroid/os/Looper;)V
+PLcom/android/server/power/Notifier;-><init>(Landroid/os/Looper;Landroid/content/Context;Lcom/android/internal/app/IBatteryStats;Lcom/android/server/power/SuspendBlocker;Lcom/android/server/policy/WindowManagerPolicy;)V
+PLcom/android/server/power/Notifier;->access$000(Lcom/android/server/power/Notifier;)Landroid/app/ActivityManagerInternal;
+PLcom/android/server/power/Notifier;->access$100(Lcom/android/server/power/Notifier;)Lcom/android/server/policy/WindowManagerPolicy;
+PLcom/android/server/power/Notifier;->access$300(Lcom/android/server/power/Notifier;)J
+PLcom/android/server/power/Notifier;->access$400(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier;->access$900(Lcom/android/server/power/Notifier;)V
+PLcom/android/server/power/Notifier;->finishPendingBroadcastLocked()V
+PLcom/android/server/power/Notifier;->handleEarlyInteractiveChange()V
+PLcom/android/server/power/Notifier;->handleLateInteractiveChange()V
+PLcom/android/server/power/Notifier;->isChargingFeedbackEnabled()Z
+PLcom/android/server/power/Notifier;->onLongPartialWakeLockFinish(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/power/Notifier;->onLongPartialWakeLockStart(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/power/Notifier;->onWakeLockChanging(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/power/Notifier;->onWakeUp(Ljava/lang/String;ILjava/lang/String;I)V
+PLcom/android/server/power/Notifier;->onWakefulnessChangeFinished()V
+PLcom/android/server/power/Notifier;->onWakefulnessChangeStarted(II)V
+PLcom/android/server/power/Notifier;->onWiredChargingStarted()V
+PLcom/android/server/power/Notifier;->playChargingStartedSound()V
+PLcom/android/server/power/Notifier;->sendGoToSleepBroadcast()V
+PLcom/android/server/power/Notifier;->sendNextBroadcast()V
+PLcom/android/server/power/Notifier;->sendWakeUpBroadcast()V
+PLcom/android/server/power/Notifier;->showWiredChargingStarted()V
+PLcom/android/server/power/Notifier;->translateOffReason(I)I
+PLcom/android/server/power/Notifier;->updatePendingBroadcastLocked()V
+PLcom/android/server/power/PowerManagerService$1;->acquireSuspendBlocker()V
+PLcom/android/server/power/PowerManagerService$1;->onDisplayStateChange(I)V
+PLcom/android/server/power/PowerManagerService$1;->onStateChanged()V
+PLcom/android/server/power/PowerManagerService$1;->releaseSuspendBlocker()V
+PLcom/android/server/power/PowerManagerService$BatteryReceiver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$BatteryReceiver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$1;)V
+PLcom/android/server/power/PowerManagerService$BatteryReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/power/PowerManagerService$BinderService;->getLastShutdownReason()I
+PLcom/android/server/power/PowerManagerService$BinderService;->getPowerSaveState(I)Landroid/os/PowerSaveState;
+PLcom/android/server/power/PowerManagerService$BinderService;->goToSleep(JII)V
+PLcom/android/server/power/PowerManagerService$BinderService;->isWakeLockLevelSupported(I)Z
+PLcom/android/server/power/PowerManagerService$BinderService;->setDozeAfterScreenOff(Z)V
+PLcom/android/server/power/PowerManagerService$BinderService;->setPowerSaveMode(Z)Z
+PLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockUids(Landroid/os/IBinder;[I)V
+PLcom/android/server/power/PowerManagerService$BinderService;->userActivity(JII)V
+PLcom/android/server/power/PowerManagerService$BinderService;->wakeUp(JLjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/power/PowerManagerService$Constants;->start(Landroid/content/ContentResolver;)V
+PLcom/android/server/power/PowerManagerService$Constants;->updateConstants()V
+PLcom/android/server/power/PowerManagerService$DockReceiver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$DockReceiver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$1;)V
+PLcom/android/server/power/PowerManagerService$DreamReceiver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$DreamReceiver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$1;)V
+PLcom/android/server/power/PowerManagerService$DreamReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/power/PowerManagerService$ForegroundProfileObserver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$ForegroundProfileObserver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$1;)V
+PLcom/android/server/power/PowerManagerService$LocalService;->powerHint(II)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setDeviceIdleMode(Z)Z
+PLcom/android/server/power/PowerManagerService$LocalService;->setDeviceIdleTempWhitelist([I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setDeviceIdleWhitelist([I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setDozeOverrideFromDreamManager(II)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setLightDeviceIdleMode(Z)Z
+PLcom/android/server/power/PowerManagerService$LocalService;->setMaximumScreenOffTimeoutFromDeviceAdmin(IJ)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setScreenBrightnessOverrideFromWindowManager(I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->setUserActivityTimeoutOverrideFromWindowManager(J)V
+PLcom/android/server/power/PowerManagerService$LocalService;->uidActive(I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->uidGone(I)V
+PLcom/android/server/power/PowerManagerService$LocalService;->uidIdle(I)V
+PLcom/android/server/power/PowerManagerService$SettingsObserver;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Handler;)V
+PLcom/android/server/power/PowerManagerService$SettingsObserver;->onChange(ZLandroid/net/Uri;)V
+PLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->release()V
+PLcom/android/server/power/PowerManagerService$UidState;-><init>(I)V
+PLcom/android/server/power/PowerManagerService$UserSwitchedReceiver;-><init>(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService$UserSwitchedReceiver;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$1;)V
+PLcom/android/server/power/PowerManagerService$UserSwitchedReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/power/PowerManagerService$WakeLock;->binderDied()V
+PLcom/android/server/power/PowerManagerService$WakeLock;->updateWorkSource(Landroid/os/WorkSource;)V
+PLcom/android/server/power/PowerManagerService;->access$000(Lcom/android/server/power/PowerManagerService;)Ljava/lang/Object;
+PLcom/android/server/power/PowerManagerService;->access$1076(Lcom/android/server/power/PowerManagerService;I)I
+PLcom/android/server/power/PowerManagerService;->access$1100(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$1400(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->access$1600(Lcom/android/server/power/PowerManagerService;)Z
+PLcom/android/server/power/PowerManagerService;->access$1800(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/SuspendBlocker;
+PLcom/android/server/power/PowerManagerService;->access$1900(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$2000(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$2100(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$2300(Lcom/android/server/power/PowerManagerService;II)V
+PLcom/android/server/power/PowerManagerService;->access$2500(Lcom/android/server/power/PowerManagerService;)V
+PLcom/android/server/power/PowerManagerService;->access$2900(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->access$3600(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->access$3700(Lcom/android/server/power/PowerManagerService;I)Z
+PLcom/android/server/power/PowerManagerService;->access$3900(Lcom/android/server/power/PowerManagerService;JIII)V
+PLcom/android/server/power/PowerManagerService;->access$4000(Lcom/android/server/power/PowerManagerService;JLjava/lang/String;ILjava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->access$4100(Lcom/android/server/power/PowerManagerService;JIII)V
+PLcom/android/server/power/PowerManagerService;->access$4600(Lcom/android/server/power/PowerManagerService;Z)Z
+PLcom/android/server/power/PowerManagerService;->access$5000(Lcom/android/server/power/PowerManagerService;Z)V
+PLcom/android/server/power/PowerManagerService;->access$5500(Lcom/android/server/power/PowerManagerService;I)V
+PLcom/android/server/power/PowerManagerService;->access$5600(Lcom/android/server/power/PowerManagerService;II)V
+PLcom/android/server/power/PowerManagerService;->access$5800(Lcom/android/server/power/PowerManagerService;J)V
+PLcom/android/server/power/PowerManagerService;->canDozeLocked()Z
+PLcom/android/server/power/PowerManagerService;->canDreamLocked()Z
+PLcom/android/server/power/PowerManagerService;->enqueueNotifyLongMsgLocked(J)V
+PLcom/android/server/power/PowerManagerService;->getLastShutdownReasonInternal(Ljava/lang/String;)I
+PLcom/android/server/power/PowerManagerService;->goToSleepInternal(JIII)V
+PLcom/android/server/power/PowerManagerService;->goToSleepNoUpdateLocked(JIII)Z
+PLcom/android/server/power/PowerManagerService;->handleBatteryStateChangedLocked()V
+PLcom/android/server/power/PowerManagerService;->handleSettingsChangedLocked()V
+PLcom/android/server/power/PowerManagerService;->handleUidStateChangeLocked()V
+PLcom/android/server/power/PowerManagerService;->handleUserActivityTimeout()V
+PLcom/android/server/power/PowerManagerService;->handleWakeLockDeath(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->incrementBootCount()V
+PLcom/android/server/power/PowerManagerService;->isDeviceIdleModeInternal()Z
+PLcom/android/server/power/PowerManagerService;->isLightDeviceIdleModeInternal()Z
+PLcom/android/server/power/PowerManagerService;->isScreenLock(Lcom/android/server/power/PowerManagerService$WakeLock;)Z
+PLcom/android/server/power/PowerManagerService;->isWakeLockLevelSupportedInternal(I)Z
+PLcom/android/server/power/PowerManagerService;->logScreenOn()V
+PLcom/android/server/power/PowerManagerService;->logSleepTimeoutRecapturedLocked()V
+PLcom/android/server/power/PowerManagerService;->monitor()V
+PLcom/android/server/power/PowerManagerService;->notifyWakeLockChangingLocked(Lcom/android/server/power/PowerManagerService$WakeLock;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+PLcom/android/server/power/PowerManagerService;->notifyWakeLockLongStartedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+PLcom/android/server/power/PowerManagerService;->readConfigurationLocked()V
+PLcom/android/server/power/PowerManagerService;->setDeviceIdleModeInternal(Z)Z
+PLcom/android/server/power/PowerManagerService;->setDeviceIdleTempWhitelistInternal([I)V
+PLcom/android/server/power/PowerManagerService;->setDeviceIdleWhitelistInternal([I)V
+PLcom/android/server/power/PowerManagerService;->setDozeAfterScreenOffInternal(Z)V
+PLcom/android/server/power/PowerManagerService;->setDozeOverrideFromDreamManagerInternal(II)V
+PLcom/android/server/power/PowerManagerService;->setLightDeviceIdleModeInternal(Z)Z
+PLcom/android/server/power/PowerManagerService;->setLowPowerModeInternal(Z)Z
+PLcom/android/server/power/PowerManagerService;->setMaximumScreenOffTimeoutFromDeviceAdminInternal(IJ)V
+PLcom/android/server/power/PowerManagerService;->setScreenBrightnessOverrideFromWindowManagerInternal(I)V
+PLcom/android/server/power/PowerManagerService;->setUserActivityTimeoutOverrideFromWindowManagerInternal(J)V
+PLcom/android/server/power/PowerManagerService;->setWakefulnessLocked(II)V
+PLcom/android/server/power/PowerManagerService;->shouldNapAtBedTimeLocked()Z
+PLcom/android/server/power/PowerManagerService;->shouldWakeUpWhenPluggedOrUnpluggedLocked(ZIZ)Z
+PLcom/android/server/power/PowerManagerService;->systemReady(Lcom/android/internal/app/IAppOpsService;)V
+PLcom/android/server/power/PowerManagerService;->uidActiveInternal(I)V
+PLcom/android/server/power/PowerManagerService;->uidGoneInternal(I)V
+PLcom/android/server/power/PowerManagerService;->uidIdleInternal(I)V
+PLcom/android/server/power/PowerManagerService;->updateSettingsLocked()V
+PLcom/android/server/power/PowerManagerService;->updateWakeLockDisabledStatesLocked()V
+PLcom/android/server/power/PowerManagerService;->updateWakeLockWorkSourceInternal(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->userActivityInternal(JIII)V
+PLcom/android/server/power/PowerManagerService;->wakeUpInternal(JLjava/lang/String;ILjava/lang/String;I)V
+PLcom/android/server/power/PowerManagerService;->wakeUpNoUpdateLocked(JLjava/lang/String;ILjava/lang/String;I)Z
+PLcom/android/server/power/WirelessChargerDetector$1;-><init>(Lcom/android/server/power/WirelessChargerDetector;)V
+PLcom/android/server/power/WirelessChargerDetector$2;-><init>(Lcom/android/server/power/WirelessChargerDetector;)V
+PLcom/android/server/power/WirelessChargerDetector;-><init>(Landroid/hardware/SensorManager;Lcom/android/server/power/SuspendBlocker;Landroid/os/Handler;)V
+PLcom/android/server/power/WirelessChargerDetector;->update(ZI)Z
+PLcom/android/server/power/batterysaver/-$$Lambda$BatterySaverStateMachine$SSfmWJrD4RBoVg8A8loZrS-jhAo;->run()V
+PLcom/android/server/power/batterysaver/-$$Lambda$BatterySaverStateMachine$fEidyt_9TXlXBpF6D2lhOOrfOC4;-><init>(Lcom/android/server/power/batterysaver/BatterySaverStateMachine;)V
+PLcom/android/server/power/batterysaver/-$$Lambda$BatterySaverStateMachine$fEidyt_9TXlXBpF6D2lhOOrfOC4;->run()V
+PLcom/android/server/power/batterysaver/BatterySaverController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/power/batterysaver/BatterySaverController$MyHandler;->dispatchMessage(Landroid/os/Message;)V
+PLcom/android/server/power/batterysaver/BatterySaverController$MyHandler;->postSystemReady()V
+PLcom/android/server/power/batterysaver/BatterySaverController;->access$000(Lcom/android/server/power/batterysaver/BatterySaverController;)V
+PLcom/android/server/power/batterysaver/BatterySaverController;->access$200(Lcom/android/server/power/batterysaver/BatterySaverController;)Ljava/lang/Object;
+PLcom/android/server/power/batterysaver/BatterySaverController;->access$302(Lcom/android/server/power/batterysaver/BatterySaverController;Z)Z
+PLcom/android/server/power/batterysaver/BatterySaverController;->access$400(Lcom/android/server/power/batterysaver/BatterySaverController;)[Lcom/android/server/power/batterysaver/BatterySaverController$Plugin;
+PLcom/android/server/power/batterysaver/BatterySaverController;->getBatterySaverPolicy()Lcom/android/server/power/BatterySaverPolicy;
+PLcom/android/server/power/batterysaver/BatterySaverController;->getPowerManager()Landroid/os/PowerManager;
+PLcom/android/server/power/batterysaver/BatterySaverController;->isLaunchBoostDisabled()Z
+PLcom/android/server/power/batterysaver/BatterySaverController;->onBatterySaverPolicyChanged(Lcom/android/server/power/BatterySaverPolicy;)V
+PLcom/android/server/power/batterysaver/BatterySaverController;->systemReady()V
+PLcom/android/server/power/batterysaver/BatterySaverController;->updateBatterySavingStats()V
+PLcom/android/server/power/batterysaver/BatterySaverLocationPlugin;->onSystemReady(Lcom/android/server/power/batterysaver/BatterySaverController;)V
+PLcom/android/server/power/batterysaver/BatterySaverLocationPlugin;->updateLocationState(Lcom/android/server/power/batterysaver/BatterySaverController;)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine$1;->onChange(Z)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->access$000(Lcom/android/server/power/batterysaver/BatterySaverStateMachine;)Ljava/lang/Object;
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->doAutoBatterySaverLocked()V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->enableBatterySaverLocked(ZZILjava/lang/String;)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->getGlobalSetting(Ljava/lang/String;I)I
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->lambda$new$1(Lcom/android/server/power/batterysaver/BatterySaverStateMachine;)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->lambda$onBootCompleted$0(Lcom/android/server/power/batterysaver/BatterySaverStateMachine;)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->onBootCompleted()V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->putGlobalSetting(Ljava/lang/String;I)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->refreshSettingsLocked()V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->runOnBgThread(Ljava/lang/Runnable;)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->runOnBgThreadLazy(Ljava/lang/Runnable;I)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->setBatteryStatus(ZIZ)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->setSettingsLocked(ZZI)V
+PLcom/android/server/power/batterysaver/BatterySaverStateMachine;->updateSnoozingLocked(ZLjava/lang/String;)V
+PLcom/android/server/power/batterysaver/BatterySavingStats$BatterySaverState;->fromIndex(I)I
+PLcom/android/server/power/batterysaver/BatterySavingStats$DozeState;->fromIndex(I)I
+PLcom/android/server/power/batterysaver/BatterySavingStats$InteractiveState;->fromIndex(I)I
+PLcom/android/server/power/batterysaver/BatterySavingStats$MetricsLoggerHelper;->reportLocked(IJIIII)V
+PLcom/android/server/power/batterysaver/BatterySavingStats$MetricsLoggerHelper;->transitionStateLocked(IJII)V
+PLcom/android/server/power/batterysaver/BatterySavingStats$Stat;-><init>()V
+PLcom/android/server/power/batterysaver/BatterySavingStats;->access$000(Lcom/android/server/power/batterysaver/BatterySavingStats;)Z
+PLcom/android/server/power/batterysaver/BatterySavingStats;->endLastStateLocked(JII)V
+PLcom/android/server/power/batterysaver/BatterySavingStats;->getBatteryManagerInternal()Landroid/os/BatteryManagerInternal;
+PLcom/android/server/power/batterysaver/BatterySavingStats;->getStat(I)Lcom/android/server/power/batterysaver/BatterySavingStats$Stat;
+PLcom/android/server/power/batterysaver/BatterySavingStats;->injectBatteryLevel()I
+PLcom/android/server/power/batterysaver/BatterySavingStats;->injectBatteryPercent()I
+PLcom/android/server/power/batterysaver/BatterySavingStats;->injectCurrentTime()J
+PLcom/android/server/power/batterysaver/BatterySavingStats;->setSendTronLog(Z)V
+PLcom/android/server/power/batterysaver/BatterySavingStats;->startCharging()V
+PLcom/android/server/power/batterysaver/BatterySavingStats;->startNewStateLocked(IJII)V
+PLcom/android/server/power/batterysaver/BatterySavingStats;->statesToIndex(III)I
+PLcom/android/server/power/batterysaver/BatterySavingStats;->transitionState(III)V
+PLcom/android/server/power/batterysaver/BatterySavingStats;->transitionStateLocked(I)V
+PLcom/android/server/power/batterysaver/CpuFrequencies;-><init>()V
+PLcom/android/server/power/batterysaver/CpuFrequencies;->addToSysFileMap(Ljava/util/Map;)V
+PLcom/android/server/power/batterysaver/CpuFrequencies;->parseString(Ljava/lang/String;)Lcom/android/server/power/batterysaver/CpuFrequencies;
+PLcom/android/server/power/batterysaver/CpuFrequencies;->toSysFileMap()Landroid/util/ArrayMap;
+PLcom/android/server/power/batterysaver/FileUpdater;->injectDefaultValuesFilename()Ljava/io/File;
+PLcom/android/server/power/batterysaver/FileUpdater;->systemReady(Z)V
+PLcom/android/server/print/-$$Lambda$UserState$LdWYUAKz4cbWqoxOD4oZ_ZslKdg;-><init>()V
+PLcom/android/server/print/-$$Lambda$UserState$LdWYUAKz4cbWqoxOD4oZ_ZslKdg;->accept(Ljava/lang/Object;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$1;-><init>(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;Landroid/os/Handler;Landroid/net/Uri;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;-><init>(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;->hadPrintService(Lcom/android/server/print/UserState;Ljava/lang/String;)Z
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;->hasPrintService(Ljava/lang/String;)Z
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$2;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$3;-><init>(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;I)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl$3;->run()V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;-><init>(Lcom/android/server/print/PrintManagerService;Landroid/content/Context;)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->access$000(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;I)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->access$200(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;)Ljava/lang/Object;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->access$400(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;)Landroid/content/Context;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->access$500(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;)Landroid/os/UserManager;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->access$600(Lcom/android/server/print/PrintManagerService$PrintManagerImpl;IZZ)Lcom/android/server/print/UserState;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->getOrCreateUserStateLocked(IZZ)Lcom/android/server/print/UserState;
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->handleUserUnlocked(I)V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->registerBroadcastReceivers()V
+PLcom/android/server/print/PrintManagerService$PrintManagerImpl;->registerContentObservers()V
+PLcom/android/server/print/PrintManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/print/PrintManagerService;->onStart()V
+PLcom/android/server/print/PrintManagerService;->onUnlockUser(I)V
+PLcom/android/server/print/RemotePrintService$RemotePrintServiceClient;-><init>(Lcom/android/server/print/RemotePrintService;)V
+PLcom/android/server/print/RemotePrintService$RemoteServiceConneciton;-><init>(Lcom/android/server/print/RemotePrintService;)V
+PLcom/android/server/print/RemotePrintService$RemoteServiceConneciton;-><init>(Lcom/android/server/print/RemotePrintService;Lcom/android/server/print/RemotePrintService$1;)V
+PLcom/android/server/print/RemotePrintService;-><init>(Landroid/content/Context;Landroid/content/ComponentName;ILcom/android/server/print/RemotePrintSpooler;Lcom/android/server/print/RemotePrintService$PrintServiceCallbacks;)V
+PLcom/android/server/print/RemotePrintService;->getComponentName()Landroid/content/ComponentName;
+PLcom/android/server/print/RemotePrintSpooler$BasePrintSpoolerServiceCallbacks;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$BasePrintSpoolerServiceCallbacks;-><init>(Lcom/android/server/print/RemotePrintSpooler$1;)V
+PLcom/android/server/print/RemotePrintSpooler$ClearCustomPrinterIconCacheCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$ClearCustomPrinterIconCacheCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$ClearCustomPrinterIconCacheCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$GetCustomPrinterIconCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$GetCustomPrinterIconCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$GetCustomPrinterIconCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$GetPrintJobInfoCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$GetPrintJobInfoCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$GetPrintJobInfoCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$GetPrintJobInfosCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$GetPrintJobInfosCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$GetPrintJobInfosCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$MyServiceConnection;-><init>(Lcom/android/server/print/RemotePrintSpooler;)V
+PLcom/android/server/print/RemotePrintSpooler$MyServiceConnection;-><init>(Lcom/android/server/print/RemotePrintSpooler;Lcom/android/server/print/RemotePrintSpooler$1;)V
+PLcom/android/server/print/RemotePrintSpooler$MyServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/print/RemotePrintSpooler$OnCustomPrinterIconLoadedCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$OnCustomPrinterIconLoadedCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$OnCustomPrinterIconLoadedCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$PrintSpoolerClient;-><init>(Lcom/android/server/print/RemotePrintSpooler;)V
+PLcom/android/server/print/RemotePrintSpooler$PrintSpoolerClient;->onAllPrintJobsHandled()V
+PLcom/android/server/print/RemotePrintSpooler$SetPrintJobStateCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$SetPrintJobStateCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$SetPrintJobStateCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler$SetPrintJobTagCaller$1;-><init>(Lcom/android/server/print/RemotePrintSpooler$SetPrintJobTagCaller;)V
+PLcom/android/server/print/RemotePrintSpooler$SetPrintJobTagCaller;-><init>()V
+PLcom/android/server/print/RemotePrintSpooler;-><init>(Landroid/content/Context;IZLcom/android/server/print/RemotePrintSpooler$PrintSpoolerCallbacks;)V
+PLcom/android/server/print/RemotePrintSpooler;->access$100(Lcom/android/server/print/RemotePrintSpooler;)Ljava/lang/Object;
+PLcom/android/server/print/RemotePrintSpooler;->access$1400(Lcom/android/server/print/RemotePrintSpooler;)V
+PLcom/android/server/print/RemotePrintSpooler;->access$202(Lcom/android/server/print/RemotePrintSpooler;Landroid/print/IPrintSpooler;)Landroid/print/IPrintSpooler;
+PLcom/android/server/print/RemotePrintSpooler;->access$300(Lcom/android/server/print/RemotePrintSpooler;)V
+PLcom/android/server/print/RemotePrintSpooler;->bindLocked()V
+PLcom/android/server/print/RemotePrintSpooler;->clearClientLocked()V
+PLcom/android/server/print/RemotePrintSpooler;->getRemoteInstanceLazy()Landroid/print/IPrintSpooler;
+PLcom/android/server/print/RemotePrintSpooler;->increasePriority()V
+PLcom/android/server/print/RemotePrintSpooler;->onAllPrintJobsHandled()V
+PLcom/android/server/print/RemotePrintSpooler;->pruneApprovedPrintServices(Ljava/util/List;)V
+PLcom/android/server/print/RemotePrintSpooler;->removeObsoletePrintJobs()V
+PLcom/android/server/print/RemotePrintSpooler;->setClientLocked()V
+PLcom/android/server/print/RemotePrintSpooler;->throwIfCalledOnMainThread()V
+PLcom/android/server/print/RemotePrintSpooler;->throwIfDestroyedLocked()V
+PLcom/android/server/print/RemotePrintSpooler;->unbindLocked()V
+PLcom/android/server/print/UserState$PrintJobForAppCache;-><init>(Lcom/android/server/print/UserState;)V
+PLcom/android/server/print/UserState$PrintJobForAppCache;-><init>(Lcom/android/server/print/UserState;Lcom/android/server/print/UserState$1;)V
+PLcom/android/server/print/UserState;-><init>(Landroid/content/Context;ILjava/lang/Object;Z)V
+PLcom/android/server/print/UserState;->addServiceLocked(Lcom/android/server/print/RemotePrintService;)V
+PLcom/android/server/print/UserState;->getInstalledComponents()Ljava/util/ArrayList;
+PLcom/android/server/print/UserState;->getPrintServices(I)Ljava/util/List;
+PLcom/android/server/print/UserState;->handleDispatchPrintServicesChanged()V
+PLcom/android/server/print/UserState;->increasePriority()V
+PLcom/android/server/print/UserState;->lambda$LdWYUAKz4cbWqoxOD4oZ_ZslKdg(Lcom/android/server/print/UserState;)V
+PLcom/android/server/print/UserState;->onConfigurationChanged()V
+PLcom/android/server/print/UserState;->onConfigurationChangedLocked()V
+PLcom/android/server/print/UserState;->onPrintServicesChanged()V
+PLcom/android/server/print/UserState;->prunePrintServices()V
+PLcom/android/server/print/UserState;->readConfigurationLocked()V
+PLcom/android/server/print/UserState;->readDisabledPrintServicesLocked()V
+PLcom/android/server/print/UserState;->readInstalledPrintServicesLocked()V
+PLcom/android/server/print/UserState;->readPrintServicesFromSettingLocked(Ljava/lang/String;Ljava/util/Set;)V
+PLcom/android/server/print/UserState;->removeObsoletePrintJobs()V
+PLcom/android/server/print/UserState;->throwIfDestroyedLocked()V
+PLcom/android/server/print/UserState;->updateIfNeededLocked()V
+PLcom/android/server/print/UserState;->upgradePersistentStateIfNeeded()V
+PLcom/android/server/restrictions/RestrictionsManagerService$RestrictionsManagerImpl;-><init>(Lcom/android/server/restrictions/RestrictionsManagerService;Landroid/content/Context;)V
+PLcom/android/server/restrictions/RestrictionsManagerService$RestrictionsManagerImpl;->getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;
+PLcom/android/server/restrictions/RestrictionsManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/restrictions/RestrictionsManagerService;->access$000(Lcom/android/server/restrictions/RestrictionsManagerService;Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/restrictions/RestrictionsManagerService;->access$100(Lcom/android/server/restrictions/RestrictionsManagerService;Ljava/lang/String;)Landroid/os/IBinder;
+PLcom/android/server/restrictions/RestrictionsManagerService;->onStart()V
+PLcom/android/server/search/SearchManagerService$GlobalSearchProviderObserver;-><init>(Lcom/android/server/search/SearchManagerService;Landroid/content/ContentResolver;)V
+PLcom/android/server/search/SearchManagerService$Lifecycle$1;-><init>(Lcom/android/server/search/SearchManagerService$Lifecycle;I)V
+PLcom/android/server/search/SearchManagerService$Lifecycle$1;->run()V
+PLcom/android/server/search/SearchManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/search/SearchManagerService$Lifecycle;->access$000(Lcom/android/server/search/SearchManagerService$Lifecycle;)Lcom/android/server/search/SearchManagerService;
+PLcom/android/server/search/SearchManagerService$Lifecycle;->onStart()V
+PLcom/android/server/search/SearchManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/search/SearchManagerService$MyPackageMonitor;-><init>(Lcom/android/server/search/SearchManagerService;)V
+PLcom/android/server/search/SearchManagerService$MyPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/search/SearchManagerService$MyPackageMonitor;->onSomePackagesChanged()V
+PLcom/android/server/search/SearchManagerService$MyPackageMonitor;->updateSearchables()V
+PLcom/android/server/search/SearchManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/search/SearchManagerService;->access$100(Lcom/android/server/search/SearchManagerService;I)V
+PLcom/android/server/search/SearchManagerService;->access$300(Lcom/android/server/search/SearchManagerService;)Landroid/util/SparseArray;
+PLcom/android/server/search/SearchManagerService;->access$400(Lcom/android/server/search/SearchManagerService;)Landroid/content/Context;
+PLcom/android/server/search/SearchManagerService;->getSearchables(IZ)Lcom/android/server/search/Searchables;
+PLcom/android/server/search/SearchManagerService;->onUnlockUser(I)V
+PLcom/android/server/search/Searchables$1;-><init>()V
+PLcom/android/server/search/Searchables;-><init>(Landroid/content/Context;I)V
+PLcom/android/server/search/Searchables;->findGlobalSearchActivities()Ljava/util/List;
+PLcom/android/server/search/Searchables;->findGlobalSearchActivity(Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/search/Searchables;->findWebSearchActivity(Landroid/content/ComponentName;)Landroid/content/ComponentName;
+PLcom/android/server/search/Searchables;->getDefaultGlobalSearchProvider(Ljava/util/List;)Landroid/content/ComponentName;
+PLcom/android/server/search/Searchables;->getGlobalSearchProviderSetting()Ljava/lang/String;
+PLcom/android/server/search/Searchables;->queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;
+PLcom/android/server/search/Searchables;->updateSearchableList()V
+PLcom/android/server/security/KeyAttestationApplicationIdProviderService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/security/KeyAttestationApplicationIdProviderService;->getKeyAttestationApplicationId(I)Landroid/security/keymaster/KeyAttestationApplicationId;
+PLcom/android/server/security/KeyChainSystemService$1;-><init>(Lcom/android/server/security/KeyChainSystemService;)V
+PLcom/android/server/security/KeyChainSystemService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/security/KeyChainSystemService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/security/KeyChainSystemService;->access$000(Lcom/android/server/security/KeyChainSystemService;Landroid/content/Intent;Landroid/os/UserHandle;)V
+PLcom/android/server/security/KeyChainSystemService;->onStart()V
+PLcom/android/server/security/KeyChainSystemService;->startServiceInBackgroundAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V
+PLcom/android/server/slice/-$$Lambda$PinnedSliceState$KzxFkvfomRuMb5PD8_pIHDIhUUE;-><init>(Lcom/android/server/slice/PinnedSliceState;)V
+PLcom/android/server/slice/-$$Lambda$PinnedSliceState$TZdoqC_LDA8If7sQ7WXz9LM6VHg;-><init>(Lcom/android/server/slice/PinnedSliceState;)V
+PLcom/android/server/slice/-$$Lambda$PinnedSliceState$TZdoqC_LDA8If7sQ7WXz9LM6VHg;->run()V
+PLcom/android/server/slice/-$$Lambda$PinnedSliceState$t5Vl61Ns1u_83c4ri7920sczEu0;-><init>(Lcom/android/server/slice/PinnedSliceState;)V
+PLcom/android/server/slice/-$$Lambda$PinnedSliceState$t5Vl61Ns1u_83c4ri7920sczEu0;->run()V
+PLcom/android/server/slice/-$$Lambda$SliceManagerService$LkusK1jmu9JKJTiMRWqWxNGEGbY;-><init>(Lcom/android/server/slice/SliceManagerService;I)V
+PLcom/android/server/slice/-$$Lambda$SliceManagerService$LkusK1jmu9JKJTiMRWqWxNGEGbY;->get()Ljava/lang/Object;
+PLcom/android/server/slice/-$$Lambda$SliceManagerService$ic_PW16x_KcVi-NszMwHhErqI0s;-><init>(Lcom/android/server/slice/SliceManagerService;I)V
+PLcom/android/server/slice/-$$Lambda$SliceManagerService$ic_PW16x_KcVi-NszMwHhErqI0s;->get()Ljava/lang/Object;
+PLcom/android/server/slice/-$$Lambda$SliceManagerService$pJ39TkC3AEVezLFEPuJgSQSTDJM;-><init>(Lcom/android/server/slice/SliceManagerService;Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/slice/-$$Lambda$SliceManagerService$pJ39TkC3AEVezLFEPuJgSQSTDJM;->run()V
+PLcom/android/server/slice/-$$Lambda$SlicePermissionManager$y3Tun5dTftw8s8sky62syeWR34U;-><init>()V
+PLcom/android/server/slice/PinnedSliceState$ListenerInfo;-><init>(Lcom/android/server/slice/PinnedSliceState;Landroid/os/IBinder;Ljava/lang/String;ZII)V
+PLcom/android/server/slice/PinnedSliceState;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/slice/PinnedSliceState;-><init>(Lcom/android/server/slice/SliceManagerService;Landroid/net/Uri;Ljava/lang/String;)V
+PLcom/android/server/slice/PinnedSliceState;->destroy()V
+PLcom/android/server/slice/PinnedSliceState;->getClient()Landroid/content/ContentProviderClient;
+PLcom/android/server/slice/PinnedSliceState;->getPkg()Ljava/lang/String;
+PLcom/android/server/slice/PinnedSliceState;->getUri()Landroid/net/Uri;
+PLcom/android/server/slice/PinnedSliceState;->handleSendPinned()V
+PLcom/android/server/slice/PinnedSliceState;->handleSendUnpinned()V
+PLcom/android/server/slice/PinnedSliceState;->hasPinOrListener()Z
+PLcom/android/server/slice/PinnedSliceState;->lambda$TZdoqC_LDA8If7sQ7WXz9LM6VHg(Lcom/android/server/slice/PinnedSliceState;)V
+PLcom/android/server/slice/PinnedSliceState;->lambda$t5Vl61Ns1u_83c4ri7920sczEu0(Lcom/android/server/slice/PinnedSliceState;)V
+PLcom/android/server/slice/PinnedSliceState;->mergeSpecs([Landroid/app/slice/SliceSpec;)V
+PLcom/android/server/slice/PinnedSliceState;->pin(Ljava/lang/String;[Landroid/app/slice/SliceSpec;Landroid/os/IBinder;)V
+PLcom/android/server/slice/PinnedSliceState;->setSlicePinned(Z)V
+PLcom/android/server/slice/PinnedSliceState;->unpin(Ljava/lang/String;Landroid/os/IBinder;)Z
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;-><init>(Ljava/lang/String;Lcom/android/server/slice/SlicePermissionManager$PkgUser;Lcom/android/server/slice/DirtyTracker;)V
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->access$000(Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;)Ljava/lang/String;
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->access$100(Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;)Lcom/android/server/slice/SlicePermissionManager$PkgUser;
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->addPath(Ljava/util/List;)V
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->decodeSegments(Ljava/lang/String;)[Ljava/lang/String;
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->encodeSegments([Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->getAuthority()Ljava/lang/String;
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->isPathPrefixMatch([Ljava/lang/String;[Ljava/lang/String;)Z
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->readFrom(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->writeTo(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/slice/SliceClientPermissions;-><init>(Lcom/android/server/slice/SlicePermissionManager$PkgUser;Lcom/android/server/slice/DirtyTracker;)V
+PLcom/android/server/slice/SliceClientPermissions;->access$200()Ljava/lang/String;
+PLcom/android/server/slice/SliceClientPermissions;->createFrom(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/slice/DirtyTracker;)Lcom/android/server/slice/SliceClientPermissions;
+PLcom/android/server/slice/SliceClientPermissions;->getAuthority(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;
+PLcom/android/server/slice/SliceClientPermissions;->getFileName(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Ljava/lang/String;
+PLcom/android/server/slice/SliceClientPermissions;->getOrCreateAuthority(Lcom/android/server/slice/SlicePermissionManager$PkgUser;Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;
+PLcom/android/server/slice/SliceClientPermissions;->grantUri(Landroid/net/Uri;Lcom/android/server/slice/SlicePermissionManager$PkgUser;)V
+PLcom/android/server/slice/SliceClientPermissions;->hasFullAccess()Z
+PLcom/android/server/slice/SliceClientPermissions;->hasPermission(Landroid/net/Uri;I)Z
+PLcom/android/server/slice/SliceClientPermissions;->writeTo(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/slice/SliceManagerService$1;-><init>(Lcom/android/server/slice/SliceManagerService;)V
+PLcom/android/server/slice/SliceManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/slice/SliceManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/slice/SliceManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/slice/SliceManagerService$Lifecycle;->onStart()V
+PLcom/android/server/slice/SliceManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/slice/SliceManagerService$PackageMatchingCache;-><init>(Ljava/util/function/Supplier;)V
+PLcom/android/server/slice/SliceManagerService$PackageMatchingCache;->matches(Ljava/lang/String;)Z
+PLcom/android/server/slice/SliceManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/slice/SliceManagerService;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
+PLcom/android/server/slice/SliceManagerService;->access$100(Lcom/android/server/slice/SliceManagerService;)V
+PLcom/android/server/slice/SliceManagerService;->access$200(Lcom/android/server/slice/SliceManagerService;I)V
+PLcom/android/server/slice/SliceManagerService;->checkAccess(Ljava/lang/String;Landroid/net/Uri;II)I
+PLcom/android/server/slice/SliceManagerService;->checkSlicePermission(Landroid/net/Uri;Ljava/lang/String;II[Ljava/lang/String;)I
+PLcom/android/server/slice/SliceManagerService;->createHandler()Lcom/android/server/ServiceThread;
+PLcom/android/server/slice/SliceManagerService;->createPinnedSlice(Landroid/net/Uri;Ljava/lang/String;)Lcom/android/server/slice/PinnedSliceState;
+PLcom/android/server/slice/SliceManagerService;->enforceAccess(Ljava/lang/String;Landroid/net/Uri;)V
+PLcom/android/server/slice/SliceManagerService;->enforceCrossUser(Ljava/lang/String;Landroid/net/Uri;)V
+PLcom/android/server/slice/SliceManagerService;->enforceOwner(Ljava/lang/String;Landroid/net/Uri;I)V
+PLcom/android/server/slice/SliceManagerService;->getAssistant(I)Ljava/lang/String;
+PLcom/android/server/slice/SliceManagerService;->getAssistantMatcher(I)Lcom/android/server/slice/SliceManagerService$PackageMatchingCache;
+PLcom/android/server/slice/SliceManagerService;->getBackupPayload(I)[B
+PLcom/android/server/slice/SliceManagerService;->getContext()Landroid/content/Context;
+PLcom/android/server/slice/SliceManagerService;->getDefaultHome(I)Ljava/lang/String;
+PLcom/android/server/slice/SliceManagerService;->getHandler()Landroid/os/Handler;
+PLcom/android/server/slice/SliceManagerService;->getHomeMatcher(I)Lcom/android/server/slice/SliceManagerService$PackageMatchingCache;
+PLcom/android/server/slice/SliceManagerService;->getLock()Ljava/lang/Object;
+PLcom/android/server/slice/SliceManagerService;->getOrCreatePinnedSlice(Landroid/net/Uri;Ljava/lang/String;)Lcom/android/server/slice/PinnedSliceState;
+PLcom/android/server/slice/SliceManagerService;->getPinnedSlice(Landroid/net/Uri;)Lcom/android/server/slice/PinnedSliceState;
+PLcom/android/server/slice/SliceManagerService;->getPinnedSlices(Ljava/lang/String;)[Landroid/net/Uri;
+PLcom/android/server/slice/SliceManagerService;->getProviderPkg(Landroid/net/Uri;I)Ljava/lang/String;
+PLcom/android/server/slice/SliceManagerService;->grantSlicePermission(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V
+PLcom/android/server/slice/SliceManagerService;->hasFullSliceAccess(Ljava/lang/String;I)Z
+PLcom/android/server/slice/SliceManagerService;->isAssistant(Ljava/lang/String;I)Z
+PLcom/android/server/slice/SliceManagerService;->isDefaultHomeApp(Ljava/lang/String;I)Z
+PLcom/android/server/slice/SliceManagerService;->isGrantedFullAccess(Ljava/lang/String;I)Z
+PLcom/android/server/slice/SliceManagerService;->lambda$getAssistantMatcher$2(Lcom/android/server/slice/SliceManagerService;I)Ljava/lang/String;
+PLcom/android/server/slice/SliceManagerService;->lambda$getHomeMatcher$3(Lcom/android/server/slice/SliceManagerService;I)Ljava/lang/String;
+PLcom/android/server/slice/SliceManagerService;->lambda$pinSlice$1(Lcom/android/server/slice/SliceManagerService;Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/slice/SliceManagerService;->onUnlockUser(I)V
+PLcom/android/server/slice/SliceManagerService;->pinSlice(Ljava/lang/String;Landroid/net/Uri;[Landroid/app/slice/SliceSpec;Landroid/os/IBinder;)V
+PLcom/android/server/slice/SliceManagerService;->removePinnedSlice(Landroid/net/Uri;)V
+PLcom/android/server/slice/SliceManagerService;->systemReady()V
+PLcom/android/server/slice/SliceManagerService;->unpinSlice(Ljava/lang/String;Landroid/net/Uri;Landroid/os/IBinder;)V
+PLcom/android/server/slice/SliceManagerService;->verifyCaller(Ljava/lang/String;)V
+PLcom/android/server/slice/SlicePermissionManager$H;-><init>(Lcom/android/server/slice/SlicePermissionManager;Landroid/os/Looper;)V
+PLcom/android/server/slice/SlicePermissionManager$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/slice/SlicePermissionManager$ParserHolder;-><init>(Lcom/android/server/slice/SlicePermissionManager;)V
+PLcom/android/server/slice/SlicePermissionManager$ParserHolder;-><init>(Lcom/android/server/slice/SlicePermissionManager;Lcom/android/server/slice/SlicePermissionManager$1;)V
+PLcom/android/server/slice/SlicePermissionManager$ParserHolder;->access$100(Lcom/android/server/slice/SlicePermissionManager$ParserHolder;)Lorg/xmlpull/v1/XmlPullParser;
+PLcom/android/server/slice/SlicePermissionManager$ParserHolder;->access$102(Lcom/android/server/slice/SlicePermissionManager$ParserHolder;Lorg/xmlpull/v1/XmlPullParser;)Lorg/xmlpull/v1/XmlPullParser;
+PLcom/android/server/slice/SlicePermissionManager$ParserHolder;->access$300(Lcom/android/server/slice/SlicePermissionManager$ParserHolder;)Ljava/io/InputStream;
+PLcom/android/server/slice/SlicePermissionManager$ParserHolder;->access$302(Lcom/android/server/slice/SlicePermissionManager$ParserHolder;Ljava/io/InputStream;)Ljava/io/InputStream;
+PLcom/android/server/slice/SlicePermissionManager$ParserHolder;->close()V
+PLcom/android/server/slice/SlicePermissionManager$PkgUser;-><init>(Ljava/lang/String;)V
+PLcom/android/server/slice/SlicePermissionManager$PkgUser;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/slice/SlicePermissionManager$PkgUser;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/slice/SlicePermissionManager$PkgUser;->getUserId()I
+PLcom/android/server/slice/SlicePermissionManager$PkgUser;->hashCode()I
+PLcom/android/server/slice/SlicePermissionManager$PkgUser;->toString()Ljava/lang/String;
+PLcom/android/server/slice/SlicePermissionManager;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/slice/SlicePermissionManager;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
+PLcom/android/server/slice/SlicePermissionManager;-><init>(Landroid/content/Context;Landroid/os/Looper;Ljava/io/File;)V
+PLcom/android/server/slice/SlicePermissionManager;->access$700(Lcom/android/server/slice/SlicePermissionManager;)Landroid/util/ArrayMap;
+PLcom/android/server/slice/SlicePermissionManager;->access$800(Lcom/android/server/slice/SlicePermissionManager;)Landroid/util/ArrayMap;
+PLcom/android/server/slice/SlicePermissionManager;->getClient(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Lcom/android/server/slice/SliceClientPermissions;
+PLcom/android/server/slice/SlicePermissionManager;->getFile(Ljava/lang/String;)Landroid/util/AtomicFile;
+PLcom/android/server/slice/SlicePermissionManager;->getParser(Ljava/lang/String;)Lcom/android/server/slice/SlicePermissionManager$ParserHolder;
+PLcom/android/server/slice/SlicePermissionManager;->getProvider(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Lcom/android/server/slice/SliceProviderPermissions;
+PLcom/android/server/slice/SlicePermissionManager;->grantSliceAccess(Ljava/lang/String;ILjava/lang/String;ILandroid/net/Uri;)V
+PLcom/android/server/slice/SlicePermissionManager;->hasFullAccess(Ljava/lang/String;I)Z
+PLcom/android/server/slice/SlicePermissionManager;->hasPermission(Ljava/lang/String;ILandroid/net/Uri;)Z
+PLcom/android/server/slice/SlicePermissionManager;->writeBackup(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/slice/SliceProviderPermissions$SliceAuthority;-><init>(Ljava/lang/String;Lcom/android/server/slice/DirtyTracker;)V
+PLcom/android/server/slice/SliceProviderPermissions$SliceAuthority;->access$000(Lcom/android/server/slice/SliceProviderPermissions$SliceAuthority;)Ljava/lang/String;
+PLcom/android/server/slice/SliceProviderPermissions$SliceAuthority;->addPkg(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)V
+PLcom/android/server/slice/SliceProviderPermissions$SliceAuthority;->getAuthority()Ljava/lang/String;
+PLcom/android/server/slice/SliceProviderPermissions$SliceAuthority;->readFrom(Lorg/xmlpull/v1/XmlPullParser;)V
+PLcom/android/server/slice/SliceProviderPermissions$SliceAuthority;->writeTo(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/slice/SliceProviderPermissions;-><init>(Lcom/android/server/slice/SlicePermissionManager$PkgUser;Lcom/android/server/slice/DirtyTracker;)V
+PLcom/android/server/slice/SliceProviderPermissions;->access$100()Ljava/lang/String;
+PLcom/android/server/slice/SliceProviderPermissions;->createFrom(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/slice/DirtyTracker;)Lcom/android/server/slice/SliceProviderPermissions;
+PLcom/android/server/slice/SliceProviderPermissions;->getFileName(Lcom/android/server/slice/SlicePermissionManager$PkgUser;)Ljava/lang/String;
+PLcom/android/server/slice/SliceProviderPermissions;->getOrCreateAuthority(Ljava/lang/String;)Lcom/android/server/slice/SliceProviderPermissions$SliceAuthority;
+PLcom/android/server/slice/SliceProviderPermissions;->writeTo(Lorg/xmlpull/v1/XmlSerializer;)V
+PLcom/android/server/soundtrigger/SoundTriggerDbHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/soundtrigger/SoundTriggerDbHelper;->deleteGenericSoundModel(Ljava/util/UUID;)Z
+PLcom/android/server/soundtrigger/SoundTriggerDbHelper;->getGenericSoundModel(Ljava/util/UUID;)Landroid/hardware/soundtrigger/SoundTrigger$GenericSoundModel;
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;-><init>(Ljava/util/UUID;I)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->clearCallback()V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->createKeyphraseModelData(Ljava/util/UUID;)Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->getCallback()Landroid/hardware/soundtrigger/IRecognitionStatusCallback;
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->getHandle()I
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->getModelId()Ljava/util/UUID;
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->getRecognitionConfig()Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->getSoundModel()Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->isKeyphraseModel()Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->isModelLoaded()Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->isModelNotLoaded()Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->isModelStarted()Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->isRequested()Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->setCallback(Landroid/hardware/soundtrigger/IRecognitionStatusCallback;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->setHandle(I)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->setLoaded()V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->setRecognitionConfig(Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->setRequested(Z)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->setSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->setStarted()V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;->setStopped()V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$MyCallStateListener;-><init>(Lcom/android/server/soundtrigger/SoundTriggerHelper;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$MyCallStateListener;->onCallStateChanged(ILjava/lang/String;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper$PowerSaveModeListener;-><init>(Lcom/android/server/soundtrigger/SoundTriggerHelper;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->access$000(Lcom/android/server/soundtrigger/SoundTriggerHelper;)Ljava/lang/Object;
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->access$100(Lcom/android/server/soundtrigger/SoundTriggerHelper;Z)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->computeRecognitionRunningLocked()Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->createKeyphraseModelDataLocked(Ljava/util/UUID;I)Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->getKeyphraseIdFromEvent(Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent;)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->getKeyphraseModelDataLocked(I)Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->getModuleProperties()Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->initializeTelephonyAndPowerStateListeners()V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->internalClearGlobalStateLocked()V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->isKeyphraseRecognitionEvent(Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;)Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->isRecognitionAllowed()Z
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->onCallStateChangedLocked(Z)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->onKeyphraseRecognitionSuccessLocked(Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionEvent;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->onRecognition(Landroid/hardware/soundtrigger/SoundTrigger$RecognitionEvent;)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->onServiceStateChange(I)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->onServiceStateChangedLocked(Z)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->startKeyphraseRecognition(ILandroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->startRecognition(Landroid/hardware/soundtrigger/SoundTrigger$SoundModel;Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;I)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->startRecognitionLocked(Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;Z)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->stopAndUnloadDeadModelsLocked()V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->stopKeyphraseRecognition(ILandroid/hardware/soundtrigger/IRecognitionStatusCallback;)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->stopRecognition(Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->stopRecognitionLocked(Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;Z)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->tryStopAndUnloadLocked(Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;ZZ)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->unloadGenericSoundModel(Ljava/util/UUID;)I
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->updateAllRecognitionsLocked(Z)V
+PLcom/android/server/soundtrigger/SoundTriggerHelper;->updateRecognitionLocked(Lcom/android/server/soundtrigger/SoundTriggerHelper$ModelData;ZZ)I
+PLcom/android/server/soundtrigger/SoundTriggerInternal;-><init>()V
+PLcom/android/server/soundtrigger/SoundTriggerService$1;-><init>(Lcom/android/server/soundtrigger/SoundTriggerService;)V
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;-><init>(Lcom/android/server/soundtrigger/SoundTriggerService;Landroid/content/Context;)V
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;->getModuleProperties()Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;->isInitialized()Z
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;->setSoundTriggerHelper(Lcom/android/server/soundtrigger/SoundTriggerHelper;)V
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;->startRecognition(ILandroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+PLcom/android/server/soundtrigger/SoundTriggerService$LocalSoundTriggerService;->stopRecognition(ILandroid/hardware/soundtrigger/IRecognitionStatusCallback;)I
+PLcom/android/server/soundtrigger/SoundTriggerService$SoundTriggerServiceStub;-><init>(Lcom/android/server/soundtrigger/SoundTriggerService;)V
+PLcom/android/server/soundtrigger/SoundTriggerService$SoundTriggerServiceStub;->deleteSoundModel(Landroid/os/ParcelUuid;)V
+PLcom/android/server/soundtrigger/SoundTriggerService$SoundTriggerServiceStub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/soundtrigger/SoundTriggerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/soundtrigger/SoundTriggerService;->access$000(Lcom/android/server/soundtrigger/SoundTriggerService;Ljava/lang/String;)V
+PLcom/android/server/soundtrigger/SoundTriggerService;->access$200(Lcom/android/server/soundtrigger/SoundTriggerService;)Lcom/android/server/soundtrigger/SoundTriggerHelper;
+PLcom/android/server/soundtrigger/SoundTriggerService;->access$300(Lcom/android/server/soundtrigger/SoundTriggerService;)Lcom/android/server/soundtrigger/SoundTriggerDbHelper;
+PLcom/android/server/soundtrigger/SoundTriggerService;->enforceCallingPermission(Ljava/lang/String;)V
+PLcom/android/server/soundtrigger/SoundTriggerService;->initSoundTriggerHelper()V
+PLcom/android/server/soundtrigger/SoundTriggerService;->onBootPhase(I)V
+PLcom/android/server/soundtrigger/SoundTriggerService;->onStart()V
+PLcom/android/server/soundtrigger/SoundTriggerService;->onStartUser(I)V
+PLcom/android/server/stats/-$$Lambda$StatsCompanionService$HnKmFmrhuaLvGqFujHXRVkF_MsY;-><init>(JILjava/util/List;)V
+PLcom/android/server/stats/-$$Lambda$StatsCompanionService$huFrwWUJ-ABqZn7Xg215J22rAxY;-><init>(JILjava/util/List;)V
+PLcom/android/server/stats/-$$Lambda$StatsCompanionService$jXfS7_WmvALP_3l6Dg3O1qMWGdk;-><init>(JILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService$1;-><init>(Lcom/android/server/stats/StatsCompanionService;)V
+PLcom/android/server/stats/StatsCompanionService$AppUpdateReceiver;-><init>()V
+PLcom/android/server/stats/StatsCompanionService$AppUpdateReceiver;-><init>(Lcom/android/server/stats/StatsCompanionService$1;)V
+PLcom/android/server/stats/StatsCompanionService$AppUpdateReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/stats/StatsCompanionService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/stats/StatsCompanionService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/stats/StatsCompanionService$Lifecycle;->onStart()V
+PLcom/android/server/stats/StatsCompanionService$PullingAlarmReceiver;-><init>()V
+PLcom/android/server/stats/StatsCompanionService$PullingAlarmReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/stats/StatsCompanionService$ShutdownEventReceiver;-><init>()V
+PLcom/android/server/stats/StatsCompanionService$StatsdDeathRecipient;-><init>(Lcom/android/server/stats/StatsCompanionService;)V
+PLcom/android/server/stats/StatsCompanionService$StatsdDeathRecipient;-><init>(Lcom/android/server/stats/StatsCompanionService;Lcom/android/server/stats/StatsCompanionService$1;)V
+PLcom/android/server/stats/StatsCompanionService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/stats/StatsCompanionService;->access$100()Ljava/lang/Object;
+PLcom/android/server/stats/StatsCompanionService;->access$200()Landroid/os/IStatsManager;
+PLcom/android/server/stats/StatsCompanionService;->access$600(Lcom/android/server/stats/StatsCompanionService;)V
+PLcom/android/server/stats/StatsCompanionService;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;
+PLcom/android/server/stats/StatsCompanionService;->fetchStatsdService()Landroid/os/IStatsManager;
+PLcom/android/server/stats/StatsCompanionService;->informAllUidsLocked(Landroid/content/Context;)V
+PLcom/android/server/stats/StatsCompanionService;->pullBluetoothActivityInfo(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullBluetoothBytesTransfer(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullBluetoothData()Landroid/bluetooth/BluetoothActivityEnergyInfo;
+PLcom/android/server/stats/StatsCompanionService;->pullData(I)[Landroid/os/StatsLogEventWrapper;
+PLcom/android/server/stats/StatsCompanionService;->pullDiskSpace(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullKernelUidCpuActiveTime(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullKernelUidCpuClusterTime(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullKernelUidCpuTime(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullMobileBytesTransfer(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullMobileBytesTransferByFgBg(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullModemActivityInfo(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullProcessMemoryState(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullSystemUpTime(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullWifiActivityInfo(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->pullWifiBytesTransfer(ILjava/util/List;)V
+PLcom/android/server/stats/StatsCompanionService;->sayHiToStatsd()V
+PLcom/android/server/stats/StatsCompanionService;->sendDataBroadcast(Landroid/os/IBinder;J)V
+PLcom/android/server/stats/StatsCompanionService;->setPullingAlarm(J)V
+PLcom/android/server/stats/StatsCompanionService;->systemReady()V
+PLcom/android/server/stats/StatsCompanionService;->toIntArray(Ljava/util/List;)[I
+PLcom/android/server/stats/StatsCompanionService;->toLongArray(Ljava/util/List;)[J
+PLcom/android/server/statusbar/-$$Lambda$StatusBarManagerService$yJtT-4wu2t7bMtUpZNqcLBShMU8;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/-$$Lambda$StatusBarManagerService$yJtT-4wu2t7bMtUpZNqcLBShMU8;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$1;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->appTransitionFinished()V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->appTransitionPending()V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->appTransitionStarting(JJ)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->setNotificationDelegate(Lcom/android/server/notification/NotificationDelegate;)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->setSystemUiVisibility(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->setTopAppHidesStatusBar(Z)V
+PLcom/android/server/statusbar/StatusBarManagerService$1;->topAppWindowChanged(Z)V
+PLcom/android/server/statusbar/StatusBarManagerService$2;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService$3;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;I)V
+PLcom/android/server/statusbar/StatusBarManagerService$3;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$4;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;Z)V
+PLcom/android/server/statusbar/StatusBarManagerService$4;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$5;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;Landroid/os/IBinder;IIZ)V
+PLcom/android/server/statusbar/StatusBarManagerService$5;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$6;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/statusbar/StatusBarManagerService$6;->run()V
+PLcom/android/server/statusbar/StatusBarManagerService$7;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService$DisableRecord;-><init>(Lcom/android/server/statusbar/StatusBarManagerService;ILandroid/os/IBinder;)V
+PLcom/android/server/statusbar/StatusBarManagerService$DisableRecord;->isEmpty()Z
+PLcom/android/server/statusbar/StatusBarManagerService$DisableRecord;->setFlags(IILjava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService;-><init>(Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->access$000(Lcom/android/server/statusbar/StatusBarManagerService;)Lcom/android/server/notification/NotificationDelegate;
+PLcom/android/server/statusbar/StatusBarManagerService;->access$002(Lcom/android/server/statusbar/StatusBarManagerService;Lcom/android/server/notification/NotificationDelegate;)Lcom/android/server/notification/NotificationDelegate;
+PLcom/android/server/statusbar/StatusBarManagerService;->access$200(Lcom/android/server/statusbar/StatusBarManagerService;Z)V
+PLcom/android/server/statusbar/StatusBarManagerService;->access$300(Lcom/android/server/statusbar/StatusBarManagerService;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->access$400(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->clearNotificationEffects()V
+PLcom/android/server/statusbar/StatusBarManagerService;->disable(ILandroid/os/IBinder;Ljava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->disableForUser(ILandroid/os/IBinder;Ljava/lang/String;I)V
+PLcom/android/server/statusbar/StatusBarManagerService;->disableLocked(IILandroid/os/IBinder;Ljava/lang/String;I)V
+PLcom/android/server/statusbar/StatusBarManagerService;->enforceExpandStatusBar()V
+PLcom/android/server/statusbar/StatusBarManagerService;->enforceStatusBar()V
+PLcom/android/server/statusbar/StatusBarManagerService;->handleSystemKey(I)V
+PLcom/android/server/statusbar/StatusBarManagerService;->lambda$notifyBarAttachChanged$0(Lcom/android/server/statusbar/StatusBarManagerService;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->notifyBarAttachChanged()V
+PLcom/android/server/statusbar/StatusBarManagerService;->onNotificationClear(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILcom/android/internal/statusbar/NotificationVisibility;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->onNotificationClick(Ljava/lang/String;Lcom/android/internal/statusbar/NotificationVisibility;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->onNotificationExpansionChanged(Ljava/lang/String;ZZ)V
+PLcom/android/server/statusbar/StatusBarManagerService;->onNotificationVisibilityChanged([Lcom/android/internal/statusbar/NotificationVisibility;[Lcom/android/internal/statusbar/NotificationVisibility;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->onPanelHidden()V
+PLcom/android/server/statusbar/StatusBarManagerService;->onPanelRevealed(ZI)V
+PLcom/android/server/statusbar/StatusBarManagerService;->registerStatusBar(Lcom/android/internal/statusbar/IStatusBar;Ljava/util/List;Ljava/util/List;[ILjava/util/List;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->setIconVisibility(Ljava/lang/String;Z)V
+PLcom/android/server/statusbar/StatusBarManagerService;->setImeWindowStatus(Landroid/os/IBinder;IIZ)V
+PLcom/android/server/statusbar/StatusBarManagerService;->setSystemUiVisibility(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Ljava/lang/String;)V
+PLcom/android/server/statusbar/StatusBarManagerService;->topAppWindowChanged(Z)V
+PLcom/android/server/statusbar/StatusBarManagerService;->updateUiVisibilityLocked(IIIILandroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/storage/AppCollector$BackgroundHandler;-><init>(Lcom/android/server/storage/AppCollector;Landroid/os/Looper;Landroid/os/storage/VolumeInfo;Landroid/content/pm/PackageManager;Landroid/os/UserManager;Landroid/app/usage/StorageStatsManager;)V
+PLcom/android/server/storage/AppCollector$BackgroundHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/storage/AppCollector;-><init>(Landroid/content/Context;Landroid/os/storage/VolumeInfo;)V
+PLcom/android/server/storage/AppCollector;->access$100(Lcom/android/server/storage/AppCollector;)Ljava/util/concurrent/CompletableFuture;
+PLcom/android/server/storage/AppCollector;->getPackageStats(J)Ljava/util/List;
+PLcom/android/server/storage/CacheQuotaStrategy$1$1;-><init>(Lcom/android/server/storage/CacheQuotaStrategy$1;Landroid/os/IBinder;)V
+PLcom/android/server/storage/CacheQuotaStrategy$1$1;->run()V
+PLcom/android/server/storage/CacheQuotaStrategy$1;-><init>(Lcom/android/server/storage/CacheQuotaStrategy;)V
+PLcom/android/server/storage/CacheQuotaStrategy$1;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/storage/CacheQuotaStrategy;-><init>(Landroid/content/Context;Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/pm/Installer;Landroid/util/ArrayMap;)V
+PLcom/android/server/storage/CacheQuotaStrategy;->access$000(Lcom/android/server/storage/CacheQuotaStrategy;)Ljava/lang/Object;
+PLcom/android/server/storage/CacheQuotaStrategy;->access$100(Lcom/android/server/storage/CacheQuotaStrategy;)Landroid/app/usage/ICacheQuotaService;
+PLcom/android/server/storage/CacheQuotaStrategy;->access$102(Lcom/android/server/storage/CacheQuotaStrategy;Landroid/app/usage/ICacheQuotaService;)Landroid/app/usage/ICacheQuotaService;
+PLcom/android/server/storage/CacheQuotaStrategy;->access$200(Lcom/android/server/storage/CacheQuotaStrategy;)Ljava/util/List;
+PLcom/android/server/storage/CacheQuotaStrategy;->createServiceConnection()V
+PLcom/android/server/storage/CacheQuotaStrategy;->disconnectService()V
+PLcom/android/server/storage/CacheQuotaStrategy;->getRequestFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/app/usage/CacheQuotaHint;
+PLcom/android/server/storage/CacheQuotaStrategy;->getServiceComponentName()Landroid/content/ComponentName;
+PLcom/android/server/storage/CacheQuotaStrategy;->getUnfulfilledRequests()Ljava/util/List;
+PLcom/android/server/storage/CacheQuotaStrategy;->insertIntoQuotaMap(Ljava/lang/String;IIJ)V
+PLcom/android/server/storage/CacheQuotaStrategy;->onResult(Landroid/os/Bundle;)V
+PLcom/android/server/storage/CacheQuotaStrategy;->pushProcessedQuotas(Ljava/util/List;)V
+PLcom/android/server/storage/CacheQuotaStrategy;->readFromXml(Ljava/io/InputStream;)Landroid/util/Pair;
+PLcom/android/server/storage/CacheQuotaStrategy;->recalculateQuotas()V
+PLcom/android/server/storage/CacheQuotaStrategy;->saveToXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;J)V
+PLcom/android/server/storage/CacheQuotaStrategy;->setupQuotasFromFile()J
+PLcom/android/server/storage/CacheQuotaStrategy;->writeXmlToFile(Ljava/util/List;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$1;-><init>(Lcom/android/server/storage/DeviceStorageMonitorService;Landroid/os/Looper;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$2;-><init>(Lcom/android/server/storage/DeviceStorageMonitorService;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$2;->getMemoryLowThreshold()J
+PLcom/android/server/storage/DeviceStorageMonitorService$2;->isMemoryLow()Z
+PLcom/android/server/storage/DeviceStorageMonitorService$3;-><init>(Lcom/android/server/storage/DeviceStorageMonitorService;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$CacheFileDeletedObserver;-><init>()V
+PLcom/android/server/storage/DeviceStorageMonitorService$State;-><init>()V
+PLcom/android/server/storage/DeviceStorageMonitorService$State;-><init>(Lcom/android/server/storage/DeviceStorageMonitorService$1;)V
+PLcom/android/server/storage/DeviceStorageMonitorService$State;->access$400(III)Z
+PLcom/android/server/storage/DeviceStorageMonitorService$State;->access$500(III)Z
+PLcom/android/server/storage/DeviceStorageMonitorService$State;->isEntering(III)Z
+PLcom/android/server/storage/DeviceStorageMonitorService$State;->isLeaving(III)Z
+PLcom/android/server/storage/DeviceStorageMonitorService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/storage/DeviceStorageMonitorService;->access$100(Lcom/android/server/storage/DeviceStorageMonitorService;)V
+PLcom/android/server/storage/DeviceStorageMonitorService;->check()V
+PLcom/android/server/storage/DeviceStorageMonitorService;->findOrCreateState(Ljava/util/UUID;)Lcom/android/server/storage/DeviceStorageMonitorService$State;
+PLcom/android/server/storage/DeviceStorageMonitorService;->onStart()V
+PLcom/android/server/storage/DeviceStorageMonitorService;->updateBroadcasts(Landroid/os/storage/VolumeInfo;III)V
+PLcom/android/server/storage/DeviceStorageMonitorService;->updateNotifications(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/storage/DiskStatsFileLogger;-><init>(Lcom/android/server/storage/FileCollector$MeasurementResult;Lcom/android/server/storage/FileCollector$MeasurementResult;Ljava/util/List;J)V
+PLcom/android/server/storage/DiskStatsFileLogger;->addAppsToJson(Lorg/json/JSONObject;)V
+PLcom/android/server/storage/DiskStatsFileLogger;->dumpToFile(Ljava/io/File;)V
+PLcom/android/server/storage/DiskStatsFileLogger;->filterOnlyPrimaryUser()Landroid/util/ArrayMap;
+PLcom/android/server/storage/DiskStatsFileLogger;->getJsonRepresentation()Lorg/json/JSONObject;
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;-><init>()V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->finishJob(Z)V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->logToFile(Lcom/android/server/storage/FileCollector$MeasurementResult;Lcom/android/server/storage/FileCollector$MeasurementResult;Ljava/util/List;J)V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->run()V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->setAppCollector(Lcom/android/server/storage/AppCollector;)V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->setContext(Landroid/content/Context;)V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->setDownloadsDirectory(Ljava/io/File;)V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->setJobService(Landroid/app/job/JobService;Landroid/app/job/JobParameters;)V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->setLogOutputFile(Ljava/io/File;)V
+PLcom/android/server/storage/DiskStatsLoggingService$LogRunnable;->setSystemSize(J)V
+PLcom/android/server/storage/DiskStatsLoggingService;-><init>()V
+PLcom/android/server/storage/DiskStatsLoggingService;->isCharging(Landroid/content/Context;)Z
+PLcom/android/server/storage/DiskStatsLoggingService;->isDumpsysTaskEnabled(Landroid/content/ContentResolver;)Z
+PLcom/android/server/storage/DiskStatsLoggingService;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/storage/DiskStatsLoggingService;->schedule(Landroid/content/Context;)V
+PLcom/android/server/storage/FileCollector$MeasurementResult;-><init>()V
+PLcom/android/server/storage/FileCollector$MeasurementResult;->totalAccountedSize()J
+PLcom/android/server/storage/FileCollector;->collectFiles(Ljava/io/File;Lcom/android/server/storage/FileCollector$MeasurementResult;)Lcom/android/server/storage/FileCollector$MeasurementResult;
+PLcom/android/server/storage/FileCollector;->getMeasurementResult(Landroid/content/Context;)Lcom/android/server/storage/FileCollector$MeasurementResult;
+PLcom/android/server/storage/FileCollector;->getMeasurementResult(Ljava/io/File;)Lcom/android/server/storage/FileCollector$MeasurementResult;
+PLcom/android/server/storage/FileCollector;->getSystemSize(Landroid/content/Context;)J
+PLcom/android/server/telecom/TelecomLoaderService$1;-><init>(Lcom/android/server/telecom/TelecomLoaderService;)V
+PLcom/android/server/telecom/TelecomLoaderService$1;->getPackages(I)[Ljava/lang/String;
+PLcom/android/server/telecom/TelecomLoaderService$2;-><init>(Lcom/android/server/telecom/TelecomLoaderService;)V
+PLcom/android/server/telecom/TelecomLoaderService$2;->getPackages(I)[Ljava/lang/String;
+PLcom/android/server/telecom/TelecomLoaderService$3;-><init>(Lcom/android/server/telecom/TelecomLoaderService;)V
+PLcom/android/server/telecom/TelecomLoaderService$3;->getPackages(I)[Ljava/lang/String;
+PLcom/android/server/telecom/TelecomLoaderService$4;-><init>(Lcom/android/server/telecom/TelecomLoaderService;Landroid/os/Handler;Landroid/net/Uri;Landroid/content/pm/PackageManagerInternal;Landroid/net/Uri;)V
+PLcom/android/server/telecom/TelecomLoaderService$5;-><init>(Lcom/android/server/telecom/TelecomLoaderService;Landroid/content/pm/PackageManagerInternal;)V
+PLcom/android/server/telecom/TelecomLoaderService$5;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection$1;-><init>(Lcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;)V
+PLcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;-><init>(Lcom/android/server/telecom/TelecomLoaderService;)V
+PLcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;-><init>(Lcom/android/server/telecom/TelecomLoaderService;Lcom/android/server/telecom/TelecomLoaderService$1;)V
+PLcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/telecom/TelecomLoaderService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/telecom/TelecomLoaderService;->access$100(Lcom/android/server/telecom/TelecomLoaderService;)Landroid/content/Context;
+PLcom/android/server/telecom/TelecomLoaderService;->access$200(Lcom/android/server/telecom/TelecomLoaderService;)Ljava/lang/Object;
+PLcom/android/server/telecom/TelecomLoaderService;->access$300(Lcom/android/server/telecom/TelecomLoaderService;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->access$302(Lcom/android/server/telecom/TelecomLoaderService;Landroid/util/IntArray;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->access$400(Lcom/android/server/telecom/TelecomLoaderService;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->access$402(Lcom/android/server/telecom/TelecomLoaderService;Landroid/util/IntArray;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->access$500(Lcom/android/server/telecom/TelecomLoaderService;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->access$502(Lcom/android/server/telecom/TelecomLoaderService;Landroid/util/IntArray;)Landroid/util/IntArray;
+PLcom/android/server/telecom/TelecomLoaderService;->access$700(Lcom/android/server/telecom/TelecomLoaderService;)Lcom/android/server/telecom/TelecomLoaderService$TelecomServiceConnection;
+PLcom/android/server/telecom/TelecomLoaderService;->access$800(Lcom/android/server/telecom/TelecomLoaderService;Landroid/content/pm/PackageManagerInternal;I)V
+PLcom/android/server/telecom/TelecomLoaderService;->connectToTelecom()V
+PLcom/android/server/telecom/TelecomLoaderService;->onBootPhase(I)V
+PLcom/android/server/telecom/TelecomLoaderService;->onStart()V
+PLcom/android/server/telecom/TelecomLoaderService;->registerCarrierConfigChangedReceiver()V
+PLcom/android/server/telecom/TelecomLoaderService;->registerDefaultAppNotifier()V
+PLcom/android/server/telecom/TelecomLoaderService;->registerDefaultAppProviders()V
+PLcom/android/server/telecom/TelecomLoaderService;->updateSimCallManagerPermissions(Landroid/content/pm/PackageManagerInternal;I)V
+PLcom/android/server/textclassifier/-$$Lambda$6tTWS9-rW6CtxVP0xKRcg3Q5kmI;-><init>(Landroid/service/textclassifier/ITextClassificationCallback;)V
+PLcom/android/server/textclassifier/-$$Lambda$TextClassificationManagerService$0ahBOnx4jsgbPYQhVmIdEMzPn5Q;-><init>(Lcom/android/server/textclassifier/TextClassificationManagerService;Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/TextClassification$Request;Landroid/service/textclassifier/ITextClassificationCallback;)V
+PLcom/android/server/textclassifier/-$$Lambda$TextClassificationManagerService$0ahBOnx4jsgbPYQhVmIdEMzPn5Q;->runOrThrow()V
+PLcom/android/server/textclassifier/-$$Lambda$TextClassificationManagerService$AlzZLOTDy6ySI7ijsc3zdoY2qPo;-><init>(Ljava/lang/String;)V
+PLcom/android/server/textclassifier/-$$Lambda$TextClassificationManagerService$AlzZLOTDy6ySI7ijsc3zdoY2qPo;->accept(Ljava/lang/Object;)V
+PLcom/android/server/textclassifier/-$$Lambda$TextClassificationManagerService$BPyCtyAA7AehDOdMNqubn2TPsH0;-><init>(Lcom/android/server/textclassifier/TextClassificationManagerService;Landroid/view/textclassifier/TextClassificationContext;Landroid/view/textclassifier/TextClassificationSessionId;)V
+PLcom/android/server/textclassifier/-$$Lambda$TextClassificationManagerService$BPyCtyAA7AehDOdMNqubn2TPsH0;->runOrThrow()V
+PLcom/android/server/textclassifier/-$$Lambda$TextClassificationManagerService$Xo8FJ3LmQoamgJ2foxZOcS-n70c;-><init>(Lcom/android/server/textclassifier/TextClassificationManagerService;Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/SelectionEvent;)V
+PLcom/android/server/textclassifier/-$$Lambda$TextClassificationManagerService$Xo8FJ3LmQoamgJ2foxZOcS-n70c;->runOrThrow()V
+PLcom/android/server/textclassifier/TextClassificationManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$Lifecycle;->onStart()V
+PLcom/android/server/textclassifier/TextClassificationManagerService$Lifecycle;->onStartUser(I)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$Lifecycle;->processAnyPendingWork(I)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$PendingRequest;-><init>(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;Landroid/os/IBinder;Lcom/android/server/textclassifier/TextClassificationManagerService;Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$PendingRequest;->access$1000(Lcom/android/server/textclassifier/TextClassificationManagerService$PendingRequest;)Landroid/os/IBinder;
+PLcom/android/server/textclassifier/TextClassificationManagerService$PendingRequest;->access$800(Lcom/android/server/textclassifier/TextClassificationManagerService$PendingRequest;)Ljava/lang/Runnable;
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState$TextClassifierServiceConnection;-><init>(Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState$TextClassifierServiceConnection;-><init>(Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;Lcom/android/server/textclassifier/TextClassificationManagerService$1;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState$TextClassifierServiceConnection;->init(Landroid/service/textclassifier/ITextClassifierService;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState$TextClassifierServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;-><init>(ILandroid/content/Context;Ljava/lang/Object;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;-><init>(ILandroid/content/Context;Ljava/lang/Object;Lcom/android/server/textclassifier/TextClassificationManagerService$1;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;->access$1100(Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;)Ljava/lang/Object;
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;->access$1200(Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;->access$300(Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;)Z
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;->access$400(Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;)Z
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;->bindIfHasPendingRequestsLocked()Z
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;->bindLocked()Z
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;->handlePendingRequestsLocked()V
+PLcom/android/server/textclassifier/TextClassificationManagerService$UserState;->isBoundLocked()Z
+PLcom/android/server/textclassifier/TextClassificationManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;-><init>(Landroid/content/Context;Lcom/android/server/textclassifier/TextClassificationManagerService$1;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->access$100(Lcom/android/server/textclassifier/TextClassificationManagerService;)Ljava/lang/Object;
+PLcom/android/server/textclassifier/TextClassificationManagerService;->access$200(Lcom/android/server/textclassifier/TextClassificationManagerService;I)Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;
+PLcom/android/server/textclassifier/TextClassificationManagerService;->access$600(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;Ljava/lang/String;)Ljava/lang/Runnable;
+PLcom/android/server/textclassifier/TextClassificationManagerService;->getCallingUserStateLocked()Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;
+PLcom/android/server/textclassifier/TextClassificationManagerService;->getUserStateLocked(I)Lcom/android/server/textclassifier/TextClassificationManagerService$UserState;
+PLcom/android/server/textclassifier/TextClassificationManagerService;->lambda$logOnFailure$6(Ljava/lang/String;Ljava/lang/Throwable;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->lambda$onClassifyText$1(Lcom/android/server/textclassifier/TextClassificationManagerService;Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/TextClassification$Request;Landroid/service/textclassifier/ITextClassificationCallback;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->lambda$onCreateTextClassificationSession$4(Lcom/android/server/textclassifier/TextClassificationManagerService;Landroid/view/textclassifier/TextClassificationContext;Landroid/view/textclassifier/TextClassificationSessionId;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->lambda$onSelectionEvent$3(Lcom/android/server/textclassifier/TextClassificationManagerService;Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/SelectionEvent;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->logOnFailure(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;Ljava/lang/String;)Ljava/lang/Runnable;
+PLcom/android/server/textclassifier/TextClassificationManagerService;->onClassifyText(Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/TextClassification$Request;Landroid/service/textclassifier/ITextClassificationCallback;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->onCreateTextClassificationSession(Landroid/view/textclassifier/TextClassificationContext;Landroid/view/textclassifier/TextClassificationSessionId;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->onDestroyTextClassificationSession(Landroid/view/textclassifier/TextClassificationSessionId;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->onSelectionEvent(Landroid/view/textclassifier/TextClassificationSessionId;Landroid/view/textclassifier/SelectionEvent;)V
+PLcom/android/server/textclassifier/TextClassificationManagerService;->validateInput(Ljava/lang/String;Landroid/content/Context;)V
+PLcom/android/server/timezone/PackageStatus;-><init>(ILcom/android/server/timezone/PackageVersions;)V
+PLcom/android/server/timezone/PackageStatusStorage;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/timezone/PackageStatusStorage;-><init>(Ljava/io/File;)V
+PLcom/android/server/timezone/PackageStatusStorage;->getIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)I
+PLcom/android/server/timezone/PackageStatusStorage;->getNullableIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/Integer;
+PLcom/android/server/timezone/PackageStatusStorage;->getPackageStatus()Lcom/android/server/timezone/PackageStatus;
+PLcom/android/server/timezone/PackageStatusStorage;->getPackageStatusLocked()Lcom/android/server/timezone/PackageStatus;
+PLcom/android/server/timezone/PackageStatusStorage;->initialize()V
+PLcom/android/server/timezone/PackageStatusStorage;->parseToPackageStatusTag(Ljava/io/FileInputStream;)Lorg/xmlpull/v1/XmlPullParser;
+PLcom/android/server/timezone/PackageTracker;-><init>(Ljava/time/Clock;Lcom/android/server/timezone/ConfigHelper;Lcom/android/server/timezone/PackageManagerHelper;Lcom/android/server/timezone/PackageStatusStorage;Lcom/android/server/timezone/PackageTrackerIntentHelper;)V
+PLcom/android/server/timezone/PackageTracker;->create(Landroid/content/Context;)Lcom/android/server/timezone/PackageTracker;
+PLcom/android/server/timezone/PackageTracker;->lookupInstalledPackageVersions()Lcom/android/server/timezone/PackageVersions;
+PLcom/android/server/timezone/PackageTracker;->start()Z
+PLcom/android/server/timezone/PackageTracker;->throwIfDeviceSettingsOrAppsAreBad()V
+PLcom/android/server/timezone/PackageTracker;->throwRuntimeExceptionIfNullOrEmpty(Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/timezone/PackageTracker;->triggerUpdateIfNeeded(Z)V
+PLcom/android/server/timezone/PackageTracker;->validateDataAppManifest()Z
+PLcom/android/server/timezone/PackageTracker;->validateUpdaterAppManifest()Z
+PLcom/android/server/timezone/PackageTrackerHelperImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->contentProviderRegistered(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->getCheckTimeAllowedMillis()I
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->getDataAppPackageName()Ljava/lang/String;
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->getFailedCheckRetryCount()I
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->getInstalledPackageVersion(Ljava/lang/String;)J
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->getUpdateAppPackageName()Ljava/lang/String;
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->isPrivilegedApp(Ljava/lang/String;)Z
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->isTrackingEnabled()Z
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->receiverRegistered(Landroid/content/Intent;Ljava/lang/String;)Z
+PLcom/android/server/timezone/PackageTrackerHelperImpl;->usesPermission(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/timezone/PackageTrackerIntentHelperImpl$Receiver;-><init>(Lcom/android/server/timezone/PackageTracker;)V
+PLcom/android/server/timezone/PackageTrackerIntentHelperImpl$Receiver;-><init>(Lcom/android/server/timezone/PackageTracker;Lcom/android/server/timezone/PackageTrackerIntentHelperImpl$1;)V
+PLcom/android/server/timezone/PackageTrackerIntentHelperImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/timezone/PackageTrackerIntentHelperImpl;->initialize(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/timezone/PackageTracker;)V
+PLcom/android/server/timezone/PackageTrackerIntentHelperImpl;->scheduleReliabilityTrigger(J)V
+PLcom/android/server/timezone/PackageTrackerIntentHelperImpl;->unscheduleReliabilityTrigger()V
+PLcom/android/server/timezone/PackageVersions;-><init>(JJ)V
+PLcom/android/server/timezone/PackageVersions;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/timezone/PackageVersions;->toString()Ljava/lang/String;
+PLcom/android/server/timezone/RulesManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/timezone/RulesManagerService$Lifecycle;->onStart()V
+PLcom/android/server/timezone/RulesManagerService;-><init>(Lcom/android/server/timezone/PermissionHelper;Ljava/util/concurrent/Executor;Lcom/android/server/timezone/RulesManagerIntentHelper;Lcom/android/server/timezone/PackageTracker;Lcom/android/timezone/distro/installer/TimeZoneDistroInstaller;)V
+PLcom/android/server/timezone/RulesManagerService;->access$000(Landroid/content/Context;)Lcom/android/server/timezone/RulesManagerService;
+PLcom/android/server/timezone/RulesManagerService;->create(Landroid/content/Context;)Lcom/android/server/timezone/RulesManagerService;
+PLcom/android/server/timezone/RulesManagerService;->notifyIdle()V
+PLcom/android/server/timezone/RulesManagerService;->start()V
+PLcom/android/server/timezone/RulesManagerServiceHelperImpl;-><init>(Landroid/content/Context;)V
+PLcom/android/server/timezone/TimeZoneUpdateIdler;-><init>()V
+PLcom/android/server/timezone/TimeZoneUpdateIdler;->onStartJob(Landroid/app/job/JobParameters;)Z
+PLcom/android/server/timezone/TimeZoneUpdateIdler;->schedule(Landroid/content/Context;J)V
+PLcom/android/server/timezone/TimeZoneUpdateIdler;->unschedule(Landroid/content/Context;)V
+PLcom/android/server/trust/-$$Lambda$TrustManagerService$1$98HKBkg-C1PLlz_Q1vJz1OJtw4c;-><init>()V
+PLcom/android/server/trust/-$$Lambda$TrustManagerService$1$98HKBkg-C1PLlz_Q1vJz1OJtw4c;->run()V
+PLcom/android/server/trust/TrustAgentWrapper$1;-><init>(Lcom/android/server/trust/TrustAgentWrapper;)V
+PLcom/android/server/trust/TrustAgentWrapper$2;-><init>(Lcom/android/server/trust/TrustAgentWrapper;)V
+PLcom/android/server/trust/TrustAgentWrapper$3;-><init>(Lcom/android/server/trust/TrustAgentWrapper;)V
+PLcom/android/server/trust/TrustAgentWrapper$4;-><init>(Lcom/android/server/trust/TrustAgentWrapper;)V
+PLcom/android/server/trust/TrustAgentWrapper$4;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/trust/TrustAgentWrapper;-><init>(Landroid/content/Context;Lcom/android/server/trust/TrustManagerService;Landroid/content/Intent;Landroid/os/UserHandle;)V
+PLcom/android/server/trust/TrustAgentWrapper;->access$100(Lcom/android/server/trust/TrustAgentWrapper;)Landroid/os/Handler;
+PLcom/android/server/trust/TrustAgentWrapper;->access$1000(Lcom/android/server/trust/TrustAgentWrapper;)I
+PLcom/android/server/trust/TrustAgentWrapper;->access$1100(Lcom/android/server/trust/TrustAgentWrapper;)Lcom/android/server/trust/TrustManagerService;
+PLcom/android/server/trust/TrustAgentWrapper;->access$1602(Lcom/android/server/trust/TrustAgentWrapper;Landroid/service/trust/ITrustAgentService;)Landroid/service/trust/ITrustAgentService;
+PLcom/android/server/trust/TrustAgentWrapper;->access$1800(Lcom/android/server/trust/TrustAgentWrapper;)Landroid/service/trust/ITrustAgentServiceCallback;
+PLcom/android/server/trust/TrustAgentWrapper;->access$1900(Lcom/android/server/trust/TrustAgentWrapper;Landroid/service/trust/ITrustAgentServiceCallback;)V
+PLcom/android/server/trust/TrustAgentWrapper;->access$2000(Lcom/android/server/trust/TrustAgentWrapper;)Z
+PLcom/android/server/trust/TrustAgentWrapper;->access$500()Z
+PLcom/android/server/trust/TrustAgentWrapper;->isConnected()Z
+PLcom/android/server/trust/TrustAgentWrapper;->isManagingTrust()Z
+PLcom/android/server/trust/TrustAgentWrapper;->isTrusted()Z
+PLcom/android/server/trust/TrustAgentWrapper;->onDeviceLocked()V
+PLcom/android/server/trust/TrustAgentWrapper;->onDeviceUnlocked()V
+PLcom/android/server/trust/TrustAgentWrapper;->onUnlockAttempt(Z)V
+PLcom/android/server/trust/TrustAgentWrapper;->scheduleRestart()V
+PLcom/android/server/trust/TrustAgentWrapper;->setCallback(Landroid/service/trust/ITrustAgentServiceCallback;)V
+PLcom/android/server/trust/TrustAgentWrapper;->updateDevicePolicyFeatures()Z
+PLcom/android/server/trust/TrustArchive$Event;-><init>(IILandroid/content/ComponentName;Ljava/lang/String;JIZ)V
+PLcom/android/server/trust/TrustArchive$Event;-><init>(IILandroid/content/ComponentName;Ljava/lang/String;JIZLcom/android/server/trust/TrustArchive$1;)V
+PLcom/android/server/trust/TrustArchive;-><init>()V
+PLcom/android/server/trust/TrustArchive;->addEvent(Lcom/android/server/trust/TrustArchive$Event;)V
+PLcom/android/server/trust/TrustArchive;->logAgentConnected(ILandroid/content/ComponentName;)V
+PLcom/android/server/trust/TrustArchive;->logDevicePolicyChanged()V
+PLcom/android/server/trust/TrustManagerService$1;-><init>(Lcom/android/server/trust/TrustManagerService;)V
+PLcom/android/server/trust/TrustManagerService$1;->clearAllFingerprints()V
+PLcom/android/server/trust/TrustManagerService$1;->enforceListenerPermission()V
+PLcom/android/server/trust/TrustManagerService$1;->enforceReportPermission()V
+PLcom/android/server/trust/TrustManagerService$1;->isTrustUsuallyManaged(I)Z
+PLcom/android/server/trust/TrustManagerService$1;->lambda$reportKeyguardShowingChanged$0()V
+PLcom/android/server/trust/TrustManagerService$1;->registerTrustListener(Landroid/app/trust/ITrustListener;)V
+PLcom/android/server/trust/TrustManagerService$1;->reportKeyguardShowingChanged()V
+PLcom/android/server/trust/TrustManagerService$1;->reportUnlockAttempt(ZI)V
+PLcom/android/server/trust/TrustManagerService$1;->unlockedByFingerprintForUser(I)V
+PLcom/android/server/trust/TrustManagerService$2;-><init>(Lcom/android/server/trust/TrustManagerService;)V
+PLcom/android/server/trust/TrustManagerService$2;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/trust/TrustManagerService$3;-><init>(Lcom/android/server/trust/TrustManagerService;)V
+PLcom/android/server/trust/TrustManagerService$3;->onPackageChanged(Ljava/lang/String;I[Ljava/lang/String;)Z
+PLcom/android/server/trust/TrustManagerService$3;->onPackageDisappeared(Ljava/lang/String;I)V
+PLcom/android/server/trust/TrustManagerService$3;->onSomePackagesChanged()V
+PLcom/android/server/trust/TrustManagerService$AgentInfo;-><init>()V
+PLcom/android/server/trust/TrustManagerService$AgentInfo;-><init>(Lcom/android/server/trust/TrustManagerService$1;)V
+PLcom/android/server/trust/TrustManagerService$AgentInfo;->equals(Ljava/lang/Object;)Z
+PLcom/android/server/trust/TrustManagerService$AgentInfo;->hashCode()I
+PLcom/android/server/trust/TrustManagerService$Receiver;-><init>(Lcom/android/server/trust/TrustManagerService;)V
+PLcom/android/server/trust/TrustManagerService$Receiver;-><init>(Lcom/android/server/trust/TrustManagerService;Lcom/android/server/trust/TrustManagerService$1;)V
+PLcom/android/server/trust/TrustManagerService$Receiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/trust/TrustManagerService$Receiver;->register(Landroid/content/Context;)V
+PLcom/android/server/trust/TrustManagerService$SettingsAttrs;-><init>(Landroid/content/ComponentName;Z)V
+PLcom/android/server/trust/TrustManagerService$StrongAuthTracker;-><init>(Lcom/android/server/trust/TrustManagerService;Landroid/content/Context;)V
+PLcom/android/server/trust/TrustManagerService$StrongAuthTracker;->allowTrustFromUnlock(I)V
+PLcom/android/server/trust/TrustManagerService$StrongAuthTracker;->canAgentsRunForUser(I)Z
+PLcom/android/server/trust/TrustManagerService$StrongAuthTracker;->onStrongAuthRequiredChanged(I)V
+PLcom/android/server/trust/TrustManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/trust/TrustManagerService;->access$1500(Lcom/android/server/trust/TrustManagerService;I)Z
+PLcom/android/server/trust/TrustManagerService;->access$1600(Lcom/android/server/trust/TrustManagerService;)Landroid/util/SparseBooleanArray;
+PLcom/android/server/trust/TrustManagerService;->access$1700(Lcom/android/server/trust/TrustManagerService;Landroid/app/trust/ITrustListener;)V
+PLcom/android/server/trust/TrustManagerService;->access$1900(Lcom/android/server/trust/TrustManagerService;ZI)V
+PLcom/android/server/trust/TrustManagerService;->access$200(Lcom/android/server/trust/TrustManagerService;)Landroid/os/Handler;
+PLcom/android/server/trust/TrustManagerService;->access$2100(Lcom/android/server/trust/TrustManagerService;I)V
+PLcom/android/server/trust/TrustManagerService;->access$2400(Lcom/android/server/trust/TrustManagerService;Ljava/lang/String;)V
+PLcom/android/server/trust/TrustManagerService;->access$300(Lcom/android/server/trust/TrustManagerService;)Lcom/android/internal/widget/LockPatternUtils;
+PLcom/android/server/trust/TrustManagerService;->access$400(Lcom/android/server/trust/TrustManagerService;I)I
+PLcom/android/server/trust/TrustManagerService;->access$500(Lcom/android/server/trust/TrustManagerService;)Landroid/content/Context;
+PLcom/android/server/trust/TrustManagerService;->access$800(Lcom/android/server/trust/TrustManagerService;)I
+PLcom/android/server/trust/TrustManagerService;->addListener(Landroid/app/trust/ITrustListener;)V
+PLcom/android/server/trust/TrustManagerService;->aggregateIsTrustManaged(I)Z
+PLcom/android/server/trust/TrustManagerService;->aggregateIsTrusted(I)Z
+PLcom/android/server/trust/TrustManagerService;->dispatchDeviceLocked(IZ)V
+PLcom/android/server/trust/TrustManagerService;->dispatchOnTrustChanged(ZII)V
+PLcom/android/server/trust/TrustManagerService;->dispatchOnTrustManagedChanged(ZI)V
+PLcom/android/server/trust/TrustManagerService;->dispatchUnlockAttempt(ZI)V
+PLcom/android/server/trust/TrustManagerService;->getComponentName(Landroid/content/pm/ResolveInfo;)Landroid/content/ComponentName;
+PLcom/android/server/trust/TrustManagerService;->getSettingsAttrs(Landroid/content/pm/PackageManager;Landroid/content/pm/ResolveInfo;)Lcom/android/server/trust/TrustManagerService$SettingsAttrs;
+PLcom/android/server/trust/TrustManagerService;->isDeviceLockedInner(I)Z
+PLcom/android/server/trust/TrustManagerService;->isTrustUsuallyManagedInternal(I)Z
+PLcom/android/server/trust/TrustManagerService;->maybeEnableFactoryTrustAgents(Lcom/android/internal/widget/LockPatternUtils;I)V
+PLcom/android/server/trust/TrustManagerService;->onBootPhase(I)V
+PLcom/android/server/trust/TrustManagerService;->onStart()V
+PLcom/android/server/trust/TrustManagerService;->onStartUser(I)V
+PLcom/android/server/trust/TrustManagerService;->onUnlockUser(I)V
+PLcom/android/server/trust/TrustManagerService;->refreshAgentList(I)V
+PLcom/android/server/trust/TrustManagerService;->refreshDeviceLockedForUser(I)V
+PLcom/android/server/trust/TrustManagerService;->removeAgentsOfPackage(Ljava/lang/String;)V
+PLcom/android/server/trust/TrustManagerService;->resolveAllowedTrustAgents(Landroid/content/pm/PackageManager;I)Ljava/util/List;
+PLcom/android/server/trust/TrustManagerService;->setDeviceLockedForUser(IZ)V
+PLcom/android/server/trust/TrustManagerService;->updateDevicePolicyFeatures()V
+PLcom/android/server/trust/TrustManagerService;->updateTrust(II)V
+PLcom/android/server/trust/TrustManagerService;->updateTrustAll()V
+PLcom/android/server/twilight/TwilightService$1;-><init>(Lcom/android/server/twilight/TwilightService;)V
+PLcom/android/server/twilight/TwilightService$1;->getLastTwilightState()Lcom/android/server/twilight/TwilightState;
+PLcom/android/server/twilight/TwilightService$1;->unregisterListener(Lcom/android/server/twilight/TwilightListener;)V
+PLcom/android/server/twilight/TwilightService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/twilight/TwilightService;->access$000(Lcom/android/server/twilight/TwilightService;)Landroid/util/ArrayMap;
+PLcom/android/server/twilight/TwilightService;->onBootPhase(I)V
+PLcom/android/server/twilight/TwilightService;->onStart()V
+PLcom/android/server/updates/ConfigUpdateInstallReceiver$1;-><init>(Lcom/android/server/updates/ConfigUpdateInstallReceiver;Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/updates/ConfigUpdateInstallReceiver$1;->run()V
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->access$000(Lcom/android/server/updates/ConfigUpdateInstallReceiver;Landroid/content/Context;Landroid/content/Intent;)[B
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->access$100(Lcom/android/server/updates/ConfigUpdateInstallReceiver;Landroid/content/Intent;)I
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->access$200(Lcom/android/server/updates/ConfigUpdateInstallReceiver;Landroid/content/Intent;)Ljava/lang/String;
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->access$300(Lcom/android/server/updates/ConfigUpdateInstallReceiver;)I
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->access$400(Lcom/android/server/updates/ConfigUpdateInstallReceiver;)[B
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->access$500([B)Ljava/lang/String;
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->access$600(Lcom/android/server/updates/ConfigUpdateInstallReceiver;Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->getAltContent(Landroid/content/Context;Landroid/content/Intent;)[B
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->getContentFromIntent(Landroid/content/Intent;)Landroid/net/Uri;
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->getCurrentContent()[B
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->getCurrentHash([B)Ljava/lang/String;
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->getCurrentVersion()I
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->getRequiredHashFromIntent(Landroid/content/Intent;)Ljava/lang/String;
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->getVersionFromIntent(Landroid/content/Intent;)I
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->install([BI)V
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->postInstall(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->verifyPreviousHash(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->verifyVersion(II)Z
+PLcom/android/server/updates/ConfigUpdateInstallReceiver;->writeUpdate(Ljava/io/File;Ljava/io/File;[B)V
+PLcom/android/server/updates/IntentFirewallInstallReceiver;-><init>()V
+PLcom/android/server/updates/NetworkWatchlistInstallReceiver;-><init>()V
+PLcom/android/server/updates/NetworkWatchlistInstallReceiver;->postInstall(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/updates/SmartSelectionInstallReceiver;-><init>()V
+PLcom/android/server/updates/SmartSelectionInstallReceiver;->verifyVersion(II)Z
+PLcom/android/server/updates/SmsShortCodesInstallReceiver;-><init>()V
+PLcom/android/server/usage/-$$Lambda$UsageStatsService$VoLNrRDaTqGpWDfCW6NTYC92LRY;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/AppIdleHistory$AppUsageHistory;-><init>()V
+PLcom/android/server/usage/AppIdleHistory;-><init>(Ljava/io/File;J)V
+PLcom/android/server/usage/AppIdleHistory;->clearUsage(Ljava/lang/String;I)V
+PLcom/android/server/usage/AppIdleHistory;->dump(Lcom/android/internal/util/IndentingPrintWriter;ILjava/lang/String;)V
+PLcom/android/server/usage/AppIdleHistory;->getAppStandbyBuckets(IZ)Ljava/util/ArrayList;
+PLcom/android/server/usage/AppIdleHistory;->getLongValue(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
+PLcom/android/server/usage/AppIdleHistory;->getScreenOnTimeFile()Ljava/io/File;
+PLcom/android/server/usage/AppIdleHistory;->getTimeSinceLastJobRun(Ljava/lang/String;IJ)J
+PLcom/android/server/usage/AppIdleHistory;->getUserFile(I)Ljava/io/File;
+PLcom/android/server/usage/AppIdleHistory;->readAppIdleTimes(ILandroid/util/ArrayMap;)V
+PLcom/android/server/usage/AppIdleHistory;->readScreenOnTime()V
+PLcom/android/server/usage/AppIdleHistory;->reportUsage(Ljava/lang/String;IIIJJ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;
+PLcom/android/server/usage/AppIdleHistory;->setAppStandbyBucket(Ljava/lang/String;IJII)V
+PLcom/android/server/usage/AppIdleHistory;->setAppStandbyBucket(Ljava/lang/String;IJIIZ)V
+PLcom/android/server/usage/AppIdleHistory;->setLastJobRunTime(Ljava/lang/String;IJ)V
+PLcom/android/server/usage/AppIdleHistory;->updateDisplay(ZJ)V
+PLcom/android/server/usage/AppIdleHistory;->updateLastPrediction(Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;JI)V
+PLcom/android/server/usage/AppIdleHistory;->writeAppIdleDurations()V
+PLcom/android/server/usage/AppIdleHistory;->writeAppIdleTimes(I)V
+PLcom/android/server/usage/AppIdleHistory;->writeScreenOnTime()V
+PLcom/android/server/usage/AppStandbyController$1;-><init>(Lcom/android/server/usage/AppStandbyController;)V
+PLcom/android/server/usage/AppStandbyController$2;-><init>(Lcom/android/server/usage/AppStandbyController;)V
+PLcom/android/server/usage/AppStandbyController$2;->onDisplayChanged(I)V
+PLcom/android/server/usage/AppStandbyController$AppStandbyHandler;-><init>(Lcom/android/server/usage/AppStandbyController;Landroid/os/Looper;)V
+PLcom/android/server/usage/AppStandbyController$DeviceStateReceiver;-><init>(Lcom/android/server/usage/AppStandbyController;)V
+PLcom/android/server/usage/AppStandbyController$DeviceStateReceiver;-><init>(Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController$1;)V
+PLcom/android/server/usage/AppStandbyController$DeviceStateReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usage/AppStandbyController$Injector;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
+PLcom/android/server/usage/AppStandbyController$Injector;->currentTimeMillis()J
+PLcom/android/server/usage/AppStandbyController$Injector;->getAppIdleSettings()Ljava/lang/String;
+PLcom/android/server/usage/AppStandbyController$Injector;->getBootPhase()I
+PLcom/android/server/usage/AppStandbyController$Injector;->getContext()Landroid/content/Context;
+PLcom/android/server/usage/AppStandbyController$Injector;->getDataSystemDirectory()Ljava/io/File;
+PLcom/android/server/usage/AppStandbyController$Injector;->getLooper()Landroid/os/Looper;
+PLcom/android/server/usage/AppStandbyController$Injector;->getRunningUserIds()[I
+PLcom/android/server/usage/AppStandbyController$Injector;->isAppIdleEnabled()Z
+PLcom/android/server/usage/AppStandbyController$Injector;->isDefaultDisplayOn()Z
+PLcom/android/server/usage/AppStandbyController$Injector;->isDeviceIdleMode()Z
+PLcom/android/server/usage/AppStandbyController$Injector;->noteEvent(ILjava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController$Injector;->onBootPhase(I)V
+PLcom/android/server/usage/AppStandbyController$Injector;->registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Landroid/os/Handler;)V
+PLcom/android/server/usage/AppStandbyController$Lock;-><init>()V
+PLcom/android/server/usage/AppStandbyController$PackageReceiver;-><init>(Lcom/android/server/usage/AppStandbyController;)V
+PLcom/android/server/usage/AppStandbyController$PackageReceiver;-><init>(Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController$1;)V
+PLcom/android/server/usage/AppStandbyController$PackageReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usage/AppStandbyController$SettingsObserver;-><init>(Lcom/android/server/usage/AppStandbyController;Landroid/os/Handler;)V
+PLcom/android/server/usage/AppStandbyController$SettingsObserver;->parseLongArray(Ljava/lang/String;[J)[J
+PLcom/android/server/usage/AppStandbyController$SettingsObserver;->registerObserver()V
+PLcom/android/server/usage/AppStandbyController$SettingsObserver;->updateSettings()V
+PLcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;-><init>(Ljava/lang/String;IIIZ)V
+PLcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;->obtain(Ljava/lang/String;IIIZ)Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;
+PLcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;->recycle()V
+PLcom/android/server/usage/AppStandbyController;-><init>(Landroid/content/Context;Landroid/os/Looper;)V
+PLcom/android/server/usage/AppStandbyController;-><init>(Lcom/android/server/usage/AppStandbyController$Injector;)V
+PLcom/android/server/usage/AppStandbyController;->access$200(Lcom/android/server/usage/AppStandbyController;)Lcom/android/server/usage/AppStandbyController$AppStandbyHandler;
+PLcom/android/server/usage/AppStandbyController;->access$300(Lcom/android/server/usage/AppStandbyController;)V
+PLcom/android/server/usage/AppStandbyController;->access$600(Lcom/android/server/usage/AppStandbyController;)Ljava/lang/Object;
+PLcom/android/server/usage/AppStandbyController;->access$700(Lcom/android/server/usage/AppStandbyController;)Lcom/android/server/usage/AppIdleHistory;
+PLcom/android/server/usage/AppStandbyController;->access$800(Lcom/android/server/usage/AppStandbyController;)Landroid/content/Context;
+PLcom/android/server/usage/AppStandbyController;->addActiveDeviceAdmin(Ljava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController;->addListener(Landroid/app/usage/UsageStatsManagerInternal$AppIdleStateChangeListener;)V
+PLcom/android/server/usage/AppStandbyController;->checkIdleStates(I)Z
+PLcom/android/server/usage/AppStandbyController;->clearAppIdleForPackage(Ljava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController;->clearCarrierPrivilegedApps()V
+PLcom/android/server/usage/AppStandbyController;->dumpUser(Lcom/android/internal/util/IndentingPrintWriter;ILjava/lang/String;)V
+PLcom/android/server/usage/AppStandbyController;->fetchCarrierPrivilegedAppsLocked()V
+PLcom/android/server/usage/AppStandbyController;->flushDurationsToDisk()V
+PLcom/android/server/usage/AppStandbyController;->flushToDisk(I)V
+PLcom/android/server/usage/AppStandbyController;->getAppStandbyBuckets(I)Ljava/util/List;
+PLcom/android/server/usage/AppStandbyController;->getIdleUidsForUser(I)[I
+PLcom/android/server/usage/AppStandbyController;->getTimeSinceLastJobRun(Ljava/lang/String;I)J
+PLcom/android/server/usage/AppStandbyController;->informListeners(Ljava/lang/String;IIIZ)V
+PLcom/android/server/usage/AppStandbyController;->informParoleStateChanged()V
+PLcom/android/server/usage/AppStandbyController;->initializeDefaultsForSystemApps(I)V
+PLcom/android/server/usage/AppStandbyController;->isDisplayOn()Z
+PLcom/android/server/usage/AppStandbyController;->notifyBatteryStats(Ljava/lang/String;IZ)V
+PLcom/android/server/usage/AppStandbyController;->onAdminDataAvailable()V
+PLcom/android/server/usage/AppStandbyController;->onBootPhase(I)V
+PLcom/android/server/usage/AppStandbyController;->onDeviceIdleModeChanged()V
+PLcom/android/server/usage/AppStandbyController;->postCheckIdleStates(I)V
+PLcom/android/server/usage/AppStandbyController;->postNextParoleTimeout(JZ)V
+PLcom/android/server/usage/AppStandbyController;->postOneTimeCheckIdleStates()V
+PLcom/android/server/usage/AppStandbyController;->postParoleEndTimeout()V
+PLcom/android/server/usage/AppStandbyController;->postParoleStateChanged()V
+PLcom/android/server/usage/AppStandbyController;->postReportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController;->postReportExemptedSyncScheduled(Ljava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController;->postReportExemptedSyncStart(Ljava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController;->reportExemptedSyncScheduled(Ljava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController;->reportExemptedSyncStart(Ljava/lang/String;I)V
+PLcom/android/server/usage/AppStandbyController;->setActiveAdminApps(Ljava/util/Set;I)V
+PLcom/android/server/usage/AppStandbyController;->setAppIdleEnabled(Z)V
+PLcom/android/server/usage/AppStandbyController;->setAppIdleParoled(Z)V
+PLcom/android/server/usage/AppStandbyController;->setAppStandbyBucket(Ljava/lang/String;IIIJZ)V
+PLcom/android/server/usage/AppStandbyController;->setChargingState(Z)V
+PLcom/android/server/usage/AppStandbyController;->setLastJobRunTime(Ljava/lang/String;IJ)V
+PLcom/android/server/usage/AppStandbyController;->updateChargingStableState()V
+PLcom/android/server/usage/AppStandbyController;->waitForAdminData()V
+PLcom/android/server/usage/AppTimeLimitController$Lock;-><init>()V
+PLcom/android/server/usage/AppTimeLimitController$Lock;-><init>(Lcom/android/server/usage/AppTimeLimitController$1;)V
+PLcom/android/server/usage/AppTimeLimitController$MyHandler;-><init>(Lcom/android/server/usage/AppTimeLimitController;Landroid/os/Looper;)V
+PLcom/android/server/usage/AppTimeLimitController$UserData;-><init>(I)V
+PLcom/android/server/usage/AppTimeLimitController$UserData;-><init>(ILcom/android/server/usage/AppTimeLimitController$1;)V
+PLcom/android/server/usage/AppTimeLimitController$UserData;->access$400(Lcom/android/server/usage/AppTimeLimitController$UserData;)Landroid/util/SparseArray;
+PLcom/android/server/usage/AppTimeLimitController$UserData;->access$500(Lcom/android/server/usage/AppTimeLimitController$UserData;)Ljava/lang/String;
+PLcom/android/server/usage/AppTimeLimitController$UserData;->access$502(Lcom/android/server/usage/AppTimeLimitController$UserData;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usage/AppTimeLimitController$UserData;->access$600(Lcom/android/server/usage/AppTimeLimitController$UserData;)J
+PLcom/android/server/usage/AppTimeLimitController$UserData;->access$602(Lcom/android/server/usage/AppTimeLimitController$UserData;J)J
+PLcom/android/server/usage/AppTimeLimitController$UserData;->access$700(Lcom/android/server/usage/AppTimeLimitController$UserData;)Landroid/util/ArrayMap;
+PLcom/android/server/usage/AppTimeLimitController$UserData;->access$800(Lcom/android/server/usage/AppTimeLimitController$UserData;)I
+PLcom/android/server/usage/AppTimeLimitController;-><init>(Lcom/android/server/usage/AppTimeLimitController$OnLimitReachedListener;Landroid/os/Looper;)V
+PLcom/android/server/usage/AppTimeLimitController;->dump(Ljava/io/PrintWriter;)V
+PLcom/android/server/usage/AppTimeLimitController;->getOrCreateUserDataLocked(I)Lcom/android/server/usage/AppTimeLimitController$UserData;
+PLcom/android/server/usage/AppTimeLimitController;->getUptimeMillis()J
+PLcom/android/server/usage/AppTimeLimitController;->maybeWatchForPackageLocked(Lcom/android/server/usage/AppTimeLimitController$UserData;Ljava/lang/String;J)V
+PLcom/android/server/usage/AppTimeLimitController;->moveToBackground(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/usage/AppTimeLimitController;->moveToForeground(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/usage/IntervalStats$EventTracker;-><init>()V
+PLcom/android/server/usage/IntervalStats$EventTracker;->commitTime(J)V
+PLcom/android/server/usage/IntervalStats$EventTracker;->update(J)V
+PLcom/android/server/usage/IntervalStats;-><init>()V
+PLcom/android/server/usage/IntervalStats;->commitTime(J)V
+PLcom/android/server/usage/IntervalStats;->getOrCreateConfigurationStats(Landroid/content/res/Configuration;)Landroid/app/usage/ConfigurationStats;
+PLcom/android/server/usage/IntervalStats;->incrementAppLaunchCount(Ljava/lang/String;)V
+PLcom/android/server/usage/IntervalStats;->updateConfigurationStats(Landroid/content/res/Configuration;J)V
+PLcom/android/server/usage/IntervalStats;->updateKeyguardHidden(J)V
+PLcom/android/server/usage/IntervalStats;->updateKeyguardShown(J)V
+PLcom/android/server/usage/IntervalStats;->updateScreenInteractive(J)V
+PLcom/android/server/usage/IntervalStats;->updateScreenNonInteractive(J)V
+PLcom/android/server/usage/StorageStatsService$1;-><init>(Lcom/android/server/usage/StorageStatsService;)V
+PLcom/android/server/usage/StorageStatsService$1;->onVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V
+PLcom/android/server/usage/StorageStatsService$H;-><init>(Lcom/android/server/usage/StorageStatsService;Landroid/os/Looper;)V
+PLcom/android/server/usage/StorageStatsService$H;->getInitializedStrategy()Lcom/android/server/storage/CacheQuotaStrategy;
+PLcom/android/server/usage/StorageStatsService$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usage/StorageStatsService$H;->recalculateQuotas(Lcom/android/server/storage/CacheQuotaStrategy;)V
+PLcom/android/server/usage/StorageStatsService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usage/StorageStatsService$Lifecycle;->onStart()V
+PLcom/android/server/usage/StorageStatsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usage/StorageStatsService;->access$000(Lcom/android/server/usage/StorageStatsService;)V
+PLcom/android/server/usage/StorageStatsService;->access$100(Lcom/android/server/usage/StorageStatsService;)Landroid/content/Context;
+PLcom/android/server/usage/StorageStatsService;->access$200(Lcom/android/server/usage/StorageStatsService;)Lcom/android/server/pm/Installer;
+PLcom/android/server/usage/StorageStatsService;->access$300(Lcom/android/server/usage/StorageStatsService;)Landroid/util/ArrayMap;
+PLcom/android/server/usage/StorageStatsService;->enforcePermission(ILjava/lang/String;)V
+PLcom/android/server/usage/StorageStatsService;->getCacheBytes(Ljava/lang/String;Ljava/lang/String;)J
+PLcom/android/server/usage/StorageStatsService;->getDefaultFlags()I
+PLcom/android/server/usage/StorageStatsService;->getFreeBytes(Ljava/lang/String;Ljava/lang/String;)J
+PLcom/android/server/usage/StorageStatsService;->getTotalBytes(Ljava/lang/String;Ljava/lang/String;)J
+PLcom/android/server/usage/StorageStatsService;->invalidateMounts()V
+PLcom/android/server/usage/StorageStatsService;->isCacheQuotaCalculationsEnabled(Landroid/content/ContentResolver;)Z
+PLcom/android/server/usage/StorageStatsService;->isQuotaSupported(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/usage/StorageStatsService;->notifySignificantDelta()V
+PLcom/android/server/usage/StorageStatsService;->queryExternalStatsForUser(Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/ExternalStorageStats;
+PLcom/android/server/usage/StorageStatsService;->queryStatsForUser(Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;
+PLcom/android/server/usage/StorageStatsService;->translate(Landroid/content/pm/PackageStats;)Landroid/app/usage/StorageStats;
+PLcom/android/server/usage/UnixCalendar;-><init>(J)V
+PLcom/android/server/usage/UnixCalendar;->addDays(I)V
+PLcom/android/server/usage/UnixCalendar;->addMonths(I)V
+PLcom/android/server/usage/UnixCalendar;->addWeeks(I)V
+PLcom/android/server/usage/UnixCalendar;->addYears(I)V
+PLcom/android/server/usage/UnixCalendar;->setTimeInMillis(J)V
+PLcom/android/server/usage/UsageStatsDatabase$1;-><init>(Lcom/android/server/usage/UsageStatsDatabase;)V
+PLcom/android/server/usage/UsageStatsDatabase$1;->accept(Ljava/io/File;Ljava/lang/String;)Z
+PLcom/android/server/usage/UsageStatsDatabase;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+PLcom/android/server/usage/UsageStatsDatabase;-><init>(Ljava/io/File;)V
+PLcom/android/server/usage/UsageStatsDatabase;->checkVersionAndBuildLocked()V
+PLcom/android/server/usage/UsageStatsDatabase;->checkinDailyFiles(Lcom/android/server/usage/UsageStatsDatabase$CheckinAction;)Z
+PLcom/android/server/usage/UsageStatsDatabase;->findBestFitBucket(JJ)I
+PLcom/android/server/usage/UsageStatsDatabase;->getBackupPayload(Ljava/lang/String;)[B
+PLcom/android/server/usage/UsageStatsDatabase;->getBuildFingerprint()Ljava/lang/String;
+PLcom/android/server/usage/UsageStatsDatabase;->getLatestUsageStats(I)Lcom/android/server/usage/IntervalStats;
+PLcom/android/server/usage/UsageStatsDatabase;->indexFilesLocked()V
+PLcom/android/server/usage/UsageStatsDatabase;->init(J)V
+PLcom/android/server/usage/UsageStatsDatabase;->isNewUpdate()Z
+PLcom/android/server/usage/UsageStatsDatabase;->prune(J)V
+PLcom/android/server/usage/UsageStatsDatabase;->pruneChooserCountsOlderThan(Ljava/io/File;J)V
+PLcom/android/server/usage/UsageStatsDatabase;->pruneFilesOlderThan(Ljava/io/File;J)V
+PLcom/android/server/usage/UsageStatsDatabase;->putUsageStats(ILcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsDatabase;->queryUsageStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;)Ljava/util/List;
+PLcom/android/server/usage/UsageStatsDatabase;->sanitizeIntervalStatsForBackup(Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsDatabase;->serializeIntervalStats(Lcom/android/server/usage/IntervalStats;)[B
+PLcom/android/server/usage/UsageStatsDatabase;->writeIntervalStatsToStream(Ljava/io/DataOutputStream;Landroid/util/AtomicFile;)V
+PLcom/android/server/usage/UsageStatsService$1;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$1;->onAppIdleStateChanged(Ljava/lang/String;IZII)V
+PLcom/android/server/usage/UsageStatsService$1;->onParoleStateChanged(Z)V
+PLcom/android/server/usage/UsageStatsService$2;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$2;->onUidGone(IZ)V
+PLcom/android/server/usage/UsageStatsService$BinderService;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$BinderService;-><init>(Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService$1;)V
+PLcom/android/server/usage/UsageStatsService$BinderService;->dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/usage/UsageStatsService$BinderService;->getAppStandbyBuckets(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/usage/UsageStatsService$BinderService;->onCarrierPrivilegedAppsChanged()V
+PLcom/android/server/usage/UsageStatsService$BinderService;->queryUsageStats(IJJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;
+PLcom/android/server/usage/UsageStatsService$BinderService;->setAppStandbyBuckets(Landroid/content/pm/ParceledListSlice;I)V
+PLcom/android/server/usage/UsageStatsService$H;-><init>(Lcom/android/server/usage/UsageStatsService;Landroid/os/Looper;)V
+PLcom/android/server/usage/UsageStatsService$LocalService;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$LocalService;-><init>(Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService$1;)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->addAppIdleStateChangeListener(Landroid/app/usage/UsageStatsManagerInternal$AppIdleStateChangeListener;)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->getBackupPayload(ILjava/lang/String;)[B
+PLcom/android/server/usage/UsageStatsService$LocalService;->getIdleUidsForUser(I)[I
+PLcom/android/server/usage/UsageStatsService$LocalService;->getTimeSinceLastJobRun(Ljava/lang/String;I)J
+PLcom/android/server/usage/UsageStatsService$LocalService;->isAppIdleParoleOn()Z
+PLcom/android/server/usage/UsageStatsService$LocalService;->onActiveAdminAdded(Ljava/lang/String;I)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->onAdminDataAvailable()V
+PLcom/android/server/usage/UsageStatsService$LocalService;->queryUsageStatsForUser(IIJJZ)Ljava/util/List;
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportConfigurationChange(Landroid/content/res/Configuration;I)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportEvent(Landroid/content/ComponentName;II)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportExemptedSyncScheduled(Ljava/lang/String;I)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->reportExemptedSyncStart(Ljava/lang/String;I)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->setActiveAdminApps(Ljava/util/Set;I)V
+PLcom/android/server/usage/UsageStatsService$LocalService;->setLastJobRunTime(Ljava/lang/String;IJ)V
+PLcom/android/server/usage/UsageStatsService$UserActionsReceiver;-><init>(Lcom/android/server/usage/UsageStatsService;)V
+PLcom/android/server/usage/UsageStatsService$UserActionsReceiver;-><init>(Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService$1;)V
+PLcom/android/server/usage/UsageStatsService$UserActionsReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usage/UsageStatsService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usage/UsageStatsService;->access$400()Ljava/io/File;
+PLcom/android/server/usage/UsageStatsService;->access$700(Lcom/android/server/usage/UsageStatsService;)Ljava/lang/Object;
+PLcom/android/server/usage/UsageStatsService;->access$800(Lcom/android/server/usage/UsageStatsService;)J
+PLcom/android/server/usage/UsageStatsService;->access$900(Lcom/android/server/usage/UsageStatsService;IJ)Lcom/android/server/usage/UserUsageStatsService;
+PLcom/android/server/usage/UsageStatsService;->cleanUpRemovedUsersLocked()V
+PLcom/android/server/usage/UsageStatsService;->dump([Ljava/lang/String;Ljava/io/PrintWriter;)V
+PLcom/android/server/usage/UsageStatsService;->flushToDisk()V
+PLcom/android/server/usage/UsageStatsService;->flushToDiskLocked()V
+PLcom/android/server/usage/UsageStatsService;->getDpmInternal()Landroid/app/admin/DevicePolicyManagerInternal;
+PLcom/android/server/usage/UsageStatsService;->onBootPhase(I)V
+PLcom/android/server/usage/UsageStatsService;->onNewUpdate(I)V
+PLcom/android/server/usage/UsageStatsService;->onStart()V
+PLcom/android/server/usage/UsageStatsService;->onStatsReloaded()V
+PLcom/android/server/usage/UsageStatsService;->onStatsUpdated()V
+PLcom/android/server/usage/UsageStatsService;->queryEvents(IJJZ)Landroid/app/usage/UsageEvents;
+PLcom/android/server/usage/UsageStatsService;->queryUsageStats(IIJJZ)Ljava/util/List;
+PLcom/android/server/usage/UsageStatsService;->validRange(JJJ)Z
+PLcom/android/server/usage/UsageStatsXml;->parseBeginTime(Landroid/util/AtomicFile;)J
+PLcom/android/server/usage/UsageStatsXml;->parseBeginTime(Ljava/io/File;)J
+PLcom/android/server/usage/UsageStatsXml;->read(Landroid/util/AtomicFile;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXml;->read(Ljava/io/InputStream;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXml;->write(Landroid/util/AtomicFile;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXml;->write(Ljava/io/OutputStream;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXmlV1;->loadConfigStats(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats;)V
+PLcom/android/server/usage/UsageStatsXmlV1;->loadCountAndTime(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/usage/IntervalStats$EventTracker;)V
+PLcom/android/server/usage/UsageStatsXmlV1;->writeConfigStats(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/usage/IntervalStats;Landroid/app/usage/ConfigurationStats;Z)V
+PLcom/android/server/usage/UsageStatsXmlV1;->writeCountAndTime(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;IJ)V
+PLcom/android/server/usage/UserUsageStatsService$1;-><init>()V
+PLcom/android/server/usage/UserUsageStatsService$1;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)V
+PLcom/android/server/usage/UserUsageStatsService$2;-><init>()V
+PLcom/android/server/usage/UserUsageStatsService$3;-><init>()V
+PLcom/android/server/usage/UserUsageStatsService$4;-><init>(Lcom/android/server/usage/UserUsageStatsService;JJZLandroid/util/ArraySet;)V
+PLcom/android/server/usage/UserUsageStatsService$5;-><init>(Lcom/android/server/usage/UserUsageStatsService;Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usage/UserUsageStatsService$5;->checkin(Lcom/android/server/usage/IntervalStats;)Z
+PLcom/android/server/usage/UserUsageStatsService;-><init>(Landroid/content/Context;ILjava/io/File;Lcom/android/server/usage/UserUsageStatsService$StatsUpdatedListener;)V
+PLcom/android/server/usage/UserUsageStatsService;->checkin(Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usage/UserUsageStatsService;->eventToString(I)Ljava/lang/String;
+PLcom/android/server/usage/UserUsageStatsService;->formatDateTime(JZ)Ljava/lang/String;
+PLcom/android/server/usage/UserUsageStatsService;->formatElapsedTime(JZ)Ljava/lang/String;
+PLcom/android/server/usage/UserUsageStatsService;->getBackupPayload(Ljava/lang/String;)[B
+PLcom/android/server/usage/UserUsageStatsService;->init(J)V
+PLcom/android/server/usage/UserUsageStatsService;->loadActiveStats(J)V
+PLcom/android/server/usage/UserUsageStatsService;->notifyNewUpdate()V
+PLcom/android/server/usage/UserUsageStatsService;->persistActiveStats()V
+PLcom/android/server/usage/UserUsageStatsService;->printEvent(Lcom/android/internal/util/IndentingPrintWriter;Landroid/app/usage/UsageEvents$Event;Z)V
+PLcom/android/server/usage/UserUsageStatsService;->printEventAggregation(Lcom/android/internal/util/IndentingPrintWriter;Ljava/lang/String;Lcom/android/server/usage/IntervalStats$EventTracker;Z)V
+PLcom/android/server/usage/UserUsageStatsService;->printIntervalStats(Lcom/android/internal/util/IndentingPrintWriter;Lcom/android/server/usage/IntervalStats;ZZLjava/lang/String;)V
+PLcom/android/server/usage/UserUsageStatsService;->queryEvents(JJZ)Landroid/app/usage/UsageEvents;
+PLcom/android/server/usage/UserUsageStatsService;->queryStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;)Ljava/util/List;
+PLcom/android/server/usage/UserUsageStatsService;->queryUsageStats(IJJ)Ljava/util/List;
+PLcom/android/server/usage/UserUsageStatsService;->rolloverStats(J)V
+PLcom/android/server/usage/UserUsageStatsService;->updateRolloverDeadline()V
+PLcom/android/server/usb/-$$Lambda$UsbHostManager$XT3F5aQci4H6VWSBYBQQNSzpnvs;-><init>(Lcom/android/server/usb/UsbHostManager;)V
+PLcom/android/server/usb/-$$Lambda$UsbHostManager$XT3F5aQci4H6VWSBYBQQNSzpnvs;->run()V
+PLcom/android/server/usb/-$$Lambda$UsbPortManager$FUqGOOupcl6RrRkZBk-BnrRQyPI;-><init>(Lcom/android/server/usb/UsbPortManager;Landroid/content/Intent;)V
+PLcom/android/server/usb/-$$Lambda$UsbPortManager$FUqGOOupcl6RrRkZBk-BnrRQyPI;->run()V
+PLcom/android/server/usb/-$$Lambda$UsbProfileGroupSettingsManager$IQKTzU0q3lyaW9nLL_sbxJPW8ME;-><init>(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)V
+PLcom/android/server/usb/MtpNotificationManager$Receiver;-><init>(Lcom/android/server/usb/MtpNotificationManager;)V
+PLcom/android/server/usb/MtpNotificationManager$Receiver;-><init>(Lcom/android/server/usb/MtpNotificationManager;Lcom/android/server/usb/MtpNotificationManager$1;)V
+PLcom/android/server/usb/MtpNotificationManager;-><init>(Landroid/content/Context;Lcom/android/server/usb/MtpNotificationManager$OnOpenInAppListener;)V
+PLcom/android/server/usb/UsbAlsaManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbAlsaManager;->setPeripheralMidiState(ZII)V
+PLcom/android/server/usb/UsbAlsaManager;->systemReady()V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingHandler;-><init>(Lcom/android/server/usb/UsbDebuggingManager;Landroid/os/Looper;)V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;-><init>(Lcom/android/server/usb/UsbDebuggingManager;)V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;->closeSocketLocked()V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;->listenToSocket()V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;->openSocketLocked()V
+PLcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;->run()V
+PLcom/android/server/usb/UsbDebuggingManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbDebuggingManager;->access$100(Lcom/android/server/usb/UsbDebuggingManager;)Z
+PLcom/android/server/usb/UsbDebuggingManager;->access$102(Lcom/android/server/usb/UsbDebuggingManager;Z)Z
+PLcom/android/server/usb/UsbDebuggingManager;->access$200(Lcom/android/server/usb/UsbDebuggingManager;)Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;
+PLcom/android/server/usb/UsbDebuggingManager;->access$202(Lcom/android/server/usb/UsbDebuggingManager;Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;)Lcom/android/server/usb/UsbDebuggingManager$UsbDebuggingThread;
+PLcom/android/server/usb/UsbDebuggingManager;->setAdbEnabled(Z)V
+PLcom/android/server/usb/UsbDeviceManager$1;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbDeviceManager$2;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbDeviceManager$3;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$4;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$AdbSettingsObserver;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;-><init>(Landroid/os/Looper;Landroid/content/Context;Lcom/android/server/usb/UsbDeviceManager;Lcom/android/server/usb/UsbDebuggingManager;Lcom/android/server/usb/UsbAlsaManager;Lcom/android/server/usb/UsbSettingsManager;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->finishBoot()V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->getAppliedFunctions(J)J
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->getChargingFunctions()J
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->getCurrentAccessory()Landroid/hardware/usb/UsbAccessory;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->getPinnedSharedPrefs(Landroid/content/Context;)Landroid/content/SharedPreferences;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->getSystemProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->isTv()Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->isUsbDataTransferActive(J)Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->isUsbStateChanged(Landroid/content/Intent;)Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->isUsbTransferAllowed()Z
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->putGlobalSettings(Landroid/content/ContentResolver;Ljava/lang/String;I)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->sendMessage(ILjava/lang/Object;Z)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->sendMessage(IZ)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->sendStickyBroadcast(Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateAdbNotification(Z)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateHostState(Landroid/hardware/usb/UsbPort;Landroid/hardware/usb/UsbPortStatus;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateMidiFunction()V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateState(Ljava/lang/String;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbFunctions()V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbNotification(Z)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbStateBroadcastIfNeeded(J)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal$ServiceNotification;-><init>(Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal$ServiceNotification;->onRegistration(Ljava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal$UsbGadgetCallback;-><init>(Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal$UsbGadgetCallback;->getCurrentUsbFunctionsCb(JI)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal$UsbGadgetDeathRecipient;-><init>(Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;-><init>(Landroid/os/Looper;Landroid/content/Context;Lcom/android/server/usb/UsbDeviceManager;Lcom/android/server/usb/UsbDebuggingManager;Lcom/android/server/usb/UsbAlsaManager;Lcom/android/server/usb/UsbSettingsManager;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;->access$600(Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;)Ljava/lang/Object;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;->access$700(Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;)Landroid/hardware/usb/gadget/V1_0/IUsbGadget;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;->access$702(Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;Landroid/hardware/usb/gadget/V1_0/IUsbGadget;)Landroid/hardware/usb/gadget/V1_0/IUsbGadget;
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerHal;->setEnabledFunctions(JZ)V
+PLcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy;->containsFunction(Ljava/lang/String;Ljava/lang/String;)Z
+PLcom/android/server/usb/UsbDeviceManager$UsbUEventObserver;-><init>(Lcom/android/server/usb/UsbDeviceManager;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbUEventObserver;-><init>(Lcom/android/server/usb/UsbDeviceManager;Lcom/android/server/usb/UsbDeviceManager$1;)V
+PLcom/android/server/usb/UsbDeviceManager$UsbUEventObserver;->onUEvent(Landroid/os/UEventObserver$UEvent;)V
+PLcom/android/server/usb/UsbDeviceManager;-><init>(Landroid/content/Context;Lcom/android/server/usb/UsbAlsaManager;Lcom/android/server/usb/UsbSettingsManager;)V
+PLcom/android/server/usb/UsbDeviceManager;->access$100(Lcom/android/server/usb/UsbDeviceManager;)Lcom/android/server/usb/UsbDeviceManager$UsbHandler;
+PLcom/android/server/usb/UsbDeviceManager;->access$400()Ljava/lang/String;
+PLcom/android/server/usb/UsbDeviceManager;->bootCompleted()V
+PLcom/android/server/usb/UsbDeviceManager;->getCurrentAccessory()Landroid/hardware/usb/UsbAccessory;
+PLcom/android/server/usb/UsbDeviceManager;->initRndisAddress()V
+PLcom/android/server/usb/UsbDeviceManager;->onAwakeStateChanged(Z)V
+PLcom/android/server/usb/UsbDeviceManager;->onKeyguardStateChanged(Z)V
+PLcom/android/server/usb/UsbDeviceManager;->onUnlockUser(I)V
+PLcom/android/server/usb/UsbDeviceManager;->setCurrentUser(ILcom/android/server/usb/UsbProfileGroupSettingsManager;)V
+PLcom/android/server/usb/UsbDeviceManager;->systemReady()V
+PLcom/android/server/usb/UsbDeviceManager;->updateUserRestrictions()V
+PLcom/android/server/usb/UsbHostManager;-><init>(Landroid/content/Context;Lcom/android/server/usb/UsbAlsaManager;Lcom/android/server/usb/UsbSettingsManager;)V
+PLcom/android/server/usb/UsbHostManager;->getDeviceList(Landroid/os/Bundle;)V
+PLcom/android/server/usb/UsbHostManager;->isBlackListed(II)Z
+PLcom/android/server/usb/UsbHostManager;->isBlackListed(Ljava/lang/String;)Z
+PLcom/android/server/usb/UsbHostManager;->lambda$XT3F5aQci4H6VWSBYBQQNSzpnvs(Lcom/android/server/usb/UsbHostManager;)V
+PLcom/android/server/usb/UsbHostManager;->logUsbDevice(Lcom/android/server/usb/descriptors/UsbDescriptorParser;)V
+PLcom/android/server/usb/UsbHostManager;->setCurrentUserSettings(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)V
+PLcom/android/server/usb/UsbHostManager;->setUsbDeviceConnectionHandler(Landroid/content/ComponentName;)V
+PLcom/android/server/usb/UsbHostManager;->systemReady()V
+PLcom/android/server/usb/UsbHostManager;->usbDeviceAdded(Ljava/lang/String;II[B)Z
+PLcom/android/server/usb/UsbHostManager;->usbDeviceRemoved(Ljava/lang/String;)V
+PLcom/android/server/usb/UsbPortManager$1;-><init>(Lcom/android/server/usb/UsbPortManager;Landroid/os/Looper;)V
+PLcom/android/server/usb/UsbPortManager$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/usb/UsbPortManager$DeathRecipient;-><init>(Lcom/android/server/usb/UsbPortManager;Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager$HALCallback;-><init>(Lcom/android/internal/util/IndentingPrintWriter;Lcom/android/server/usb/UsbPortManager;)V
+PLcom/android/server/usb/UsbPortManager$HALCallback;->notifyPortStatusChange_1_1(Ljava/util/ArrayList;I)V
+PLcom/android/server/usb/UsbPortManager$PortInfo;-><init>(Ljava/lang/String;I)V
+PLcom/android/server/usb/UsbPortManager$PortInfo;->setStatus(IZIZIZI)Z
+PLcom/android/server/usb/UsbPortManager$PortInfo;->toString()Ljava/lang/String;
+PLcom/android/server/usb/UsbPortManager$RawPortInfo$1;-><init>()V
+PLcom/android/server/usb/UsbPortManager$RawPortInfo;-><init>(Ljava/lang/String;IIZIZIZ)V
+PLcom/android/server/usb/UsbPortManager$ServiceNotification;-><init>(Lcom/android/server/usb/UsbPortManager;)V
+PLcom/android/server/usb/UsbPortManager$ServiceNotification;->onRegistration(Ljava/lang/String;Ljava/lang/String;Z)V
+PLcom/android/server/usb/UsbPortManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbPortManager;->access$000(Lcom/android/server/usb/UsbPortManager;)Z
+PLcom/android/server/usb/UsbPortManager;->access$100(ILcom/android/internal/util/IndentingPrintWriter;Ljava/lang/String;)V
+PLcom/android/server/usb/UsbPortManager;->access$200(Lcom/android/server/usb/UsbPortManager;)Landroid/os/Handler;
+PLcom/android/server/usb/UsbPortManager;->access$300(Lcom/android/server/usb/UsbPortManager;)Ljava/lang/Object;
+PLcom/android/server/usb/UsbPortManager;->access$500(Lcom/android/server/usb/UsbPortManager;Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->access$600(Lcom/android/server/usb/UsbPortManager;Lcom/android/internal/util/IndentingPrintWriter;Ljava/util/ArrayList;)V
+PLcom/android/server/usb/UsbPortManager;->addOrUpdatePortLocked(Ljava/lang/String;IIZIZIZLcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->connectToProxy(Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->handlePortAddedLocked(Lcom/android/server/usb/UsbPortManager$PortInfo;Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->handlePortChangedLocked(Lcom/android/server/usb/UsbPortManager$PortInfo;Lcom/android/internal/util/IndentingPrintWriter;)V
+PLcom/android/server/usb/UsbPortManager;->lambda$sendPortChangedBroadcastLocked$0(Lcom/android/server/usb/UsbPortManager;Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbPortManager;->logAndPrint(ILcom/android/internal/util/IndentingPrintWriter;Ljava/lang/String;)V
+PLcom/android/server/usb/UsbPortManager;->sendPortChangedBroadcastLocked(Lcom/android/server/usb/UsbPortManager$PortInfo;)V
+PLcom/android/server/usb/UsbPortManager;->systemReady()V
+PLcom/android/server/usb/UsbPortManager;->updatePortsLocked(Lcom/android/internal/util/IndentingPrintWriter;Ljava/util/ArrayList;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;-><init>(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;-><init>(Lcom/android/server/usb/UsbProfileGroupSettingsManager;Lcom/android/server/usb/UsbProfileGroupSettingsManager$1;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$MyPackageMonitor;->onPackageAdded(Ljava/lang/String;I)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;-><init>(Ljava/lang/String;Landroid/os/UserHandle;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;-><init>(Ljava/lang/String;Landroid/os/UserHandle;Lcom/android/server/usb/UsbProfileGroupSettingsManager$1;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;-><init>(Landroid/content/Context;Landroid/os/UserHandle;Lcom/android/server/usb/UsbSettingsManager;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->access$000(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)Landroid/os/UserHandle;
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->access$100(Lcom/android/server/usb/UsbProfileGroupSettingsManager;)Landroid/os/UserManager;
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->access$300(Lcom/android/server/usb/UsbProfileGroupSettingsManager;Lcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->handlePackageAdded(Lcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;)V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->handlePackageAddedLocked(Lcom/android/server/usb/UsbProfileGroupSettingsManager$UserPackage;Landroid/content/pm/ActivityInfo;Ljava/lang/String;)Z
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->readSettingsLocked()V
+PLcom/android/server/usb/UsbProfileGroupSettingsManager;->upgradeSingleUserLocked()V
+PLcom/android/server/usb/UsbService$1;-><init>(Lcom/android/server/usb/UsbService;)V
+PLcom/android/server/usb/UsbService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/usb/UsbService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/usb/UsbService$Lifecycle;->onStart()V
+PLcom/android/server/usb/UsbService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/usb/UsbService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbService;->access$200(Lcom/android/server/usb/UsbService;)Lcom/android/server/usb/UsbDeviceManager;
+PLcom/android/server/usb/UsbService;->bootCompleted()V
+PLcom/android/server/usb/UsbService;->getCurrentAccessory()Landroid/hardware/usb/UsbAccessory;
+PLcom/android/server/usb/UsbService;->getDeviceList(Landroid/os/Bundle;)V
+PLcom/android/server/usb/UsbService;->onSwitchUser(I)V
+PLcom/android/server/usb/UsbService;->onUnlockUser(I)V
+PLcom/android/server/usb/UsbService;->systemReady()V
+PLcom/android/server/usb/UsbSettingsManager;-><init>(Landroid/content/Context;)V
+PLcom/android/server/usb/UsbSettingsManager;->getSettingsForProfileGroup(Landroid/os/UserHandle;)Lcom/android/server/usb/UsbProfileGroupSettingsManager;
+PLcom/android/server/usb/descriptors/ByteStream;-><init>([B)V
+PLcom/android/server/usb/descriptors/ByteStream;->available()I
+PLcom/android/server/usb/descriptors/ByteStream;->getByte()B
+PLcom/android/server/usb/descriptors/ByteStream;->getReadCount()I
+PLcom/android/server/usb/descriptors/ByteStream;->getUnsignedByte()I
+PLcom/android/server/usb/descriptors/ByteStream;->resetReadCount()V
+PLcom/android/server/usb/descriptors/ByteStream;->unpackUsbShort()I
+PLcom/android/server/usb/descriptors/UsbConfigDescriptor;-><init>(IB)V
+PLcom/android/server/usb/descriptors/UsbConfigDescriptor;->addInterfaceDescriptor(Lcom/android/server/usb/descriptors/UsbInterfaceDescriptor;)V
+PLcom/android/server/usb/descriptors/UsbConfigDescriptor;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbDescriptor;-><init>(IB)V
+PLcom/android/server/usb/descriptors/UsbDescriptor;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbDescriptor;->postParse(Lcom/android/server/usb/descriptors/ByteStream;)V
+PLcom/android/server/usb/descriptors/UsbDescriptorParser;-><init>(Ljava/lang/String;[B)V
+PLcom/android/server/usb/descriptors/UsbDescriptorParser;->allocDescriptor(Lcom/android/server/usb/descriptors/ByteStream;)Lcom/android/server/usb/descriptors/UsbDescriptor;
+PLcom/android/server/usb/descriptors/UsbDescriptorParser;->getDescriptorString(I)Ljava/lang/String;
+PLcom/android/server/usb/descriptors/UsbDescriptorParser;->getDeviceDescriptor()Lcom/android/server/usb/descriptors/UsbDeviceDescriptor;
+PLcom/android/server/usb/descriptors/UsbDescriptorParser;->parseDescriptors([B)V
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;-><init>(IB)V
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->addConfigDescriptor(Lcom/android/server/usb/descriptors/UsbConfigDescriptor;)V
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->getDeviceReleaseString()Ljava/lang/String;
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->getMfgString(Lcom/android/server/usb/descriptors/UsbDescriptorParser;)Ljava/lang/String;
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->getProductID()I
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->getProductString(Lcom/android/server/usb/descriptors/UsbDescriptorParser;)Ljava/lang/String;
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->getSerialString(Lcom/android/server/usb/descriptors/UsbDescriptorParser;)Ljava/lang/String;
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->getVendorID()I
+PLcom/android/server/usb/descriptors/UsbDeviceDescriptor;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbEndpointDescriptor;-><init>(IB)V
+PLcom/android/server/usb/descriptors/UsbEndpointDescriptor;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbInterfaceDescriptor;-><init>(IB)V
+PLcom/android/server/usb/descriptors/UsbInterfaceDescriptor;->addEndpointDescriptor(Lcom/android/server/usb/descriptors/UsbEndpointDescriptor;)V
+PLcom/android/server/usb/descriptors/UsbInterfaceDescriptor;->parseRawDescriptors(Lcom/android/server/usb/descriptors/ByteStream;)I
+PLcom/android/server/usb/descriptors/UsbUnknown;-><init>(IB)V
+PLcom/android/server/utils/PriorityDump;->dump(Lcom/android/server/utils/PriorityDump$PriorityDumper;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V
+PLcom/android/server/voiceinteraction/DatabaseHelper;-><init>(Landroid/content/Context;)V
+PLcom/android/server/voiceinteraction/DatabaseHelper;->getArrayForCommaSeparatedString(Ljava/lang/String;)[I
+PLcom/android/server/voiceinteraction/DatabaseHelper;->getCommaSeparatedString([I)Ljava/lang/String;
+PLcom/android/server/voiceinteraction/DatabaseHelper;->getKeyphraseSoundModel(IILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;
+PLcom/android/server/voiceinteraction/DatabaseHelper;->updateKeyphraseSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$1;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$1;->getPackages(I)[Ljava/lang/String;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$LocalService;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$2;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$2;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$2;->onSomePackagesChanged()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub$SettingsObserver;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;Landroid/os/Handler;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->access$400(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;)I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->activeServiceSupportsAssist()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->activeServiceSupportsLaunchFromKeyguard()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->closeSystemDialogs(Landroid/os/IBinder;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->deliverNewSession(Landroid/os/IBinder;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->enforceCallingPermission(Ljava/lang/String;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getActiveServiceComponentName()Landroid/content/ComponentName;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getCurAssistant(I)Landroid/content/ComponentName;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getCurInteractor(I)Landroid/content/ComponentName;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getCurRecognizer(I)Landroid/content/ComponentName;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getDspModuleProperties(Landroid/service/voice/IVoiceInteractionService;)Landroid/hardware/soundtrigger/SoundTrigger$ModuleProperties;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getForceVoiceInteractionServicePackage(Landroid/content/res/Resources;)Ljava/lang/String;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getKeyphraseSoundModel(ILjava/lang/String;)Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->getUserDisabledShowContext()I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->hideCurrentSession()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->hideSessionFromSession(Landroid/os/IBinder;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->initForUser(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->isEnrolledForKeyphrase(Landroid/service/voice/IVoiceInteractionService;ILjava/lang/String;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->isSessionRunning()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->onLockscreenShown()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->onSessionHidden()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->onSessionShown()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->registerVoiceInteractionSessionListener(Lcom/android/internal/app/IVoiceInteractionSessionListener;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->setDisabledShowContext(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->setImplLocked(Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->shouldEnableService(Landroid/content/Context;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->showSession(Landroid/service/voice/IVoiceInteractionService;Landroid/os/Bundle;I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->showSessionForActiveService(Landroid/os/Bundle;ILcom/android/internal/app/IVoiceInteractionSessionShowCallback;Landroid/os/IBinder;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->startAssistantActivity(Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;)I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->startRecognition(Landroid/service/voice/IVoiceInteractionService;ILjava/lang/String;Landroid/hardware/soundtrigger/IRecognitionStatusCallback;Landroid/hardware/soundtrigger/SoundTrigger$RecognitionConfig;)I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->stopRecognition(Landroid/service/voice/IVoiceInteractionService;ILandroid/hardware/soundtrigger/IRecognitionStatusCallback;)I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->switchImplementationIfNeeded(Z)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->switchImplementationIfNeededLocked(Z)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->systemRunning(Z)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->unloadAllKeyphraseModels()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;->updateKeyphraseSoundModel(Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseSoundModel;)I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->access$000(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->access$100(Lcom/android/server/voiceinteraction/VoiceInteractionManagerService;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onBootPhase(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onStart()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onStartUser(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerService;->onUnlockUser(I)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$1;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$2;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl$2;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;-><init>(Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$VoiceInteractionManagerServiceStub;ILandroid/content/ComponentName;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->closeSystemDialogsLocked(Landroid/os/IBinder;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->deliverNewSessionLocked(Landroid/os/IBinder;Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->finishLocked(Landroid/os/IBinder;Z)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->getUserDisabledShowContextLocked(I)I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->hideSessionLocked()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->notifySoundModelsChangedLocked()V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->onSessionHidden(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->onSessionShown(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->sessionConnectionGone(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->setDisabledShowContextLocked(II)V
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->showSessionLocked(Landroid/os/Bundle;ILcom/android/internal/app/IVoiceInteractionSessionShowCallback;Landroid/os/IBinder;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->startAssistantActivityLocked(IILandroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;)I
+PLcom/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl;->startLocked()V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$1;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$1;->onShown()V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$2;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$2;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$3;-><init>(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;-><init>(Ljava/lang/Object;Landroid/content/ComponentName;ILandroid/content/Context;Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection$Callback;ILandroid/os/Handler;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->access$100(Lcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->canHandleReceivedAssistDataLocked()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->cancelLocked(Z)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->deliverNewSessionLocked(Landroid/service/voice/IVoiceInteractionSession;Lcom/android/internal/app/IVoiceInteractor;)Z
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->getUserDisabledShowContextLocked()I
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->hideLocked()Z
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->notifyPendingShowCallbacksShownLocked()V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->onAssistDataReceivedLocked(Landroid/os/Bundle;II)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->onAssistScreenshotReceivedLocked(Landroid/graphics/Bitmap;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->onServiceDisconnected(Landroid/content/ComponentName;)V
+PLcom/android/server/voiceinteraction/VoiceInteractionSessionConnection;->showLocked(Landroid/os/Bundle;IILcom/android/internal/app/IVoiceInteractionSessionShowCallback;Ljava/util/List;)Z
+PLcom/android/server/vr/EnabledComponentsObserver$1;-><init>(Lcom/android/server/vr/EnabledComponentsObserver;)V
+PLcom/android/server/vr/EnabledComponentsObserver$1;->onPackageDisappeared(Ljava/lang/String;I)V
+PLcom/android/server/vr/EnabledComponentsObserver$1;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/vr/EnabledComponentsObserver$1;->onSomePackagesChanged()V
+PLcom/android/server/vr/EnabledComponentsObserver;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/util/Collection;)V
+PLcom/android/server/vr/EnabledComponentsObserver;->build(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/String;Landroid/os/Looper;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Ljava/util/Collection;)Lcom/android/server/vr/EnabledComponentsObserver;
+PLcom/android/server/vr/EnabledComponentsObserver;->getCurrentProfileIds()[I
+PLcom/android/server/vr/EnabledComponentsObserver;->getEnabled(I)Landroid/util/ArraySet;
+PLcom/android/server/vr/EnabledComponentsObserver;->isValid(Landroid/content/ComponentName;I)I
+PLcom/android/server/vr/EnabledComponentsObserver;->loadComponentNames(Landroid/content/pm/PackageManager;ILjava/lang/String;Ljava/lang/String;)Landroid/util/ArraySet;
+PLcom/android/server/vr/EnabledComponentsObserver;->loadComponentNamesForUser(I)Landroid/util/ArraySet;
+PLcom/android/server/vr/EnabledComponentsObserver;->loadComponentNamesFromSetting(Ljava/lang/String;I)Landroid/util/ArraySet;
+PLcom/android/server/vr/EnabledComponentsObserver;->onPackagesChanged()V
+PLcom/android/server/vr/EnabledComponentsObserver;->onUsersChanged()V
+PLcom/android/server/vr/EnabledComponentsObserver;->rebuildAll()V
+PLcom/android/server/vr/EnabledComponentsObserver;->sendSettingChanged()V
+PLcom/android/server/vr/SettingsObserver$1;-><init>(Lcom/android/server/vr/SettingsObserver;Ljava/lang/String;)V
+PLcom/android/server/vr/SettingsObserver$2;-><init>(Lcom/android/server/vr/SettingsObserver;Landroid/os/Handler;Landroid/net/Uri;)V
+PLcom/android/server/vr/SettingsObserver;-><init>(Landroid/content/Context;Landroid/os/Handler;Landroid/net/Uri;Ljava/lang/String;)V
+PLcom/android/server/vr/SettingsObserver;->addListener(Lcom/android/server/vr/SettingsObserver$SettingChangeListener;)V
+PLcom/android/server/vr/SettingsObserver;->build(Landroid/content/Context;Landroid/os/Handler;Ljava/lang/String;)Lcom/android/server/vr/SettingsObserver;
+PLcom/android/server/vr/Vr2dDisplay$1;-><init>(Lcom/android/server/vr/Vr2dDisplay;)V
+PLcom/android/server/vr/Vr2dDisplay;-><init>(Landroid/hardware/display/DisplayManager;Landroid/app/ActivityManagerInternal;Lcom/android/server/wm/WindowManagerInternal;Landroid/service/vr/IVrManager;)V
+PLcom/android/server/vr/Vr2dDisplay;->init(Landroid/content/Context;Z)V
+PLcom/android/server/vr/Vr2dDisplay;->startDebugOnlyBroadcastReceiver(Landroid/content/Context;)V
+PLcom/android/server/vr/Vr2dDisplay;->startVrModeListener()V
+PLcom/android/server/vr/VrManagerInternal;-><init>()V
+PLcom/android/server/vr/VrManagerService$1;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$2;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$3;-><init>()V
+PLcom/android/server/vr/VrManagerService$4;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$4;->getVrModeState()Z
+PLcom/android/server/vr/VrManagerService$4;->registerListener(Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService$4;->registerPersistentVrStateListener(Landroid/service/vr/IPersistentVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService$4;->unregisterListener(Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService$5;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$5;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/vr/VrManagerService$LocalService;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$LocalService;-><init>(Lcom/android/server/vr/VrManagerService;Lcom/android/server/vr/VrManagerService$1;)V
+PLcom/android/server/vr/VrManagerService$LocalService;->addPersistentVrModeStateListener(Landroid/service/vr/IPersistentVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService$LocalService;->isCurrentVrListener(Ljava/lang/String;I)Z
+PLcom/android/server/vr/VrManagerService$LocalService;->onScreenStateChanged(Z)V
+PLcom/android/server/vr/VrManagerService$LocalService;->setVrMode(ZLandroid/content/ComponentName;IILandroid/content/ComponentName;)V
+PLcom/android/server/vr/VrManagerService$NotificationAccessManager;-><init>(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService$NotificationAccessManager;-><init>(Lcom/android/server/vr/VrManagerService;Lcom/android/server/vr/VrManagerService$1;)V
+PLcom/android/server/vr/VrManagerService$NotificationAccessManager;->update(Ljava/util/Collection;)V
+PLcom/android/server/vr/VrManagerService$VrState;-><init>(ZZLandroid/content/ComponentName;IILandroid/content/ComponentName;)V
+PLcom/android/server/vr/VrManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/vr/VrManagerService;->access$1400(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;)V
+PLcom/android/server/vr/VrManagerService;->access$1500(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;I)V
+PLcom/android/server/vr/VrManagerService;->access$1600(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;I)V
+PLcom/android/server/vr/VrManagerService;->access$1700(Lcom/android/server/vr/VrManagerService;[Ljava/lang/String;)V
+PLcom/android/server/vr/VrManagerService;->access$1800(Lcom/android/server/vr/VrManagerService;Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->access$1900(Lcom/android/server/vr/VrManagerService;Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->access$2000(Lcom/android/server/vr/VrManagerService;Landroid/service/vr/IPersistentVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->access$2200(Lcom/android/server/vr/VrManagerService;)Z
+PLcom/android/server/vr/VrManagerService;->access$3300(Lcom/android/server/vr/VrManagerService;ZLandroid/content/ComponentName;IILandroid/content/ComponentName;)V
+PLcom/android/server/vr/VrManagerService;->access$3400(Lcom/android/server/vr/VrManagerService;Z)V
+PLcom/android/server/vr/VrManagerService;->access$3500(Lcom/android/server/vr/VrManagerService;Ljava/lang/String;I)Z
+PLcom/android/server/vr/VrManagerService;->access$3800(Lcom/android/server/vr/VrManagerService;)V
+PLcom/android/server/vr/VrManagerService;->addPersistentStateCallback(Landroid/service/vr/IPersistentVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->addStateCallback(Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->consumeAndApplyPendingStateLocked(Z)V
+PLcom/android/server/vr/VrManagerService;->enforceCallerPermissionAnyOf([Ljava/lang/String;)V
+PLcom/android/server/vr/VrManagerService;->getVrMode()Z
+PLcom/android/server/vr/VrManagerService;->grantCoarseLocationPermissionIfNeeded(Ljava/lang/String;I)V
+PLcom/android/server/vr/VrManagerService;->grantNotificationListenerAccess(Ljava/lang/String;I)V
+PLcom/android/server/vr/VrManagerService;->grantNotificationPolicyAccess(Ljava/lang/String;)V
+PLcom/android/server/vr/VrManagerService;->isCurrentVrListener(Ljava/lang/String;I)Z
+PLcom/android/server/vr/VrManagerService;->isDefaultAllowed(Ljava/lang/String;)Z
+PLcom/android/server/vr/VrManagerService;->isPermissionUserUpdated(Ljava/lang/String;Ljava/lang/String;I)Z
+PLcom/android/server/vr/VrManagerService;->onAwakeStateChanged(Z)V
+PLcom/android/server/vr/VrManagerService;->onBootPhase(I)V
+PLcom/android/server/vr/VrManagerService;->onEnabledComponentChanged()V
+PLcom/android/server/vr/VrManagerService;->onKeyguardStateChanged(Z)V
+PLcom/android/server/vr/VrManagerService;->onStart()V
+PLcom/android/server/vr/VrManagerService;->onStartUser(I)V
+PLcom/android/server/vr/VrManagerService;->removeStateCallback(Landroid/service/vr/IVrStateCallbacks;)V
+PLcom/android/server/vr/VrManagerService;->setPersistentModeAndNotifyListenersLocked(Z)V
+PLcom/android/server/vr/VrManagerService;->setScreenOn(Z)V
+PLcom/android/server/vr/VrManagerService;->setSystemState(IZ)V
+PLcom/android/server/vr/VrManagerService;->setUserUnlocked()V
+PLcom/android/server/vr/VrManagerService;->setVrMode(ZLandroid/content/ComponentName;IILandroid/content/ComponentName;)V
+PLcom/android/server/vr/VrManagerService;->updateCurrentVrServiceLocked(ZZLandroid/content/ComponentName;IILandroid/content/ComponentName;)Z
+PLcom/android/server/vr/VrManagerService;->updateVrModeAllowedLocked()V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$KpV9TczlJklVG4VNZncaU86_KtQ;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$KpV9TczlJklVG4VNZncaU86_KtQ;->run()V
+PLcom/android/server/wallpaper/-$$Lambda$WallpaperManagerService$WallpaperConnection$QhODF3v-swnwSYvDbeEhU85gOBw;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$1;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$2;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$3;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$4;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService$4;->run()V
+PLcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;->onBootPhase(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;->onStart()V
+PLcom/android/server/wallpaper/WallpaperManagerService$Lifecycle;->onUnlockUser(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;->doPackagesChangedLocked(ZLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;->onPackageModified(Ljava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;->onPackageUpdateFinished(Ljava/lang/String;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;->onPackageUpdateStarted(Ljava/lang/String;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService$MyPackageMonitor;->onSomePackagesChanged()V
+PLcom/android/server/wallpaper/WallpaperManagerService$ThemeSettingsObserver;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;Landroid/os/Handler;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$ThemeSettingsObserver;->startObserving(Landroid/content/Context;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;Landroid/app/WallpaperInfo;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->attachEngine(Landroid/service/wallpaper/IWallpaperEngine;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->engineShown(Landroid/service/wallpaper/IWallpaperEngine;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;->onWallpaperColorsChanged(Landroid/app/WallpaperColors;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;-><init>(ILjava/lang/String;Ljava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;->access$700(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)Landroid/os/RemoteCallbackList;
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;->cropExists()Z
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperObserver;-><init>(Lcom/android/server/wallpaper/WallpaperManagerService;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperObserver;->dataForEvent(ZZ)Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;
+PLcom/android/server/wallpaper/WallpaperManagerService$WallpaperObserver;->onEvent(ILjava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->access$000(I)Ljava/io/File;
+PLcom/android/server/wallpaper/WallpaperManagerService;->access$500(Lcom/android/server/wallpaper/WallpaperManagerService;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->attachServiceLocked(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperConnection;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->bindWallpaperComponentLocked(Landroid/content/ComponentName;ZZLcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Landroid/os/IRemoteCallback;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->checkPermission(Ljava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->emptyCallbackList(Landroid/os/RemoteCallbackList;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->enforceCallingOrSelfPermissionAndAppOp(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->ensureSaneWallpaperData(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->getAttributeInt(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
+PLcom/android/server/wallpaper/WallpaperManagerService;->getHeightHint()I
+PLcom/android/server/wallpaper/WallpaperManagerService;->getMaximumSizeDimension()I
+PLcom/android/server/wallpaper/WallpaperManagerService;->getThemeColorsLocked(Landroid/app/WallpaperColors;)Landroid/app/WallpaperColors;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaper(Ljava/lang/String;Landroid/app/IWallpaperManagerCallback;ILandroid/os/Bundle;I)Landroid/os/ParcelFileDescriptor;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperColors(II)Landroid/app/WallpaperColors;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperDir(I)Ljava/io/File;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperIdForUser(II)I
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperInfo(I)Landroid/app/WallpaperInfo;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWallpaperSafeLocked(II)Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;
+PLcom/android/server/wallpaper/WallpaperManagerService;->getWidthHint()I
+PLcom/android/server/wallpaper/WallpaperManagerService;->initialize()V
+PLcom/android/server/wallpaper/WallpaperManagerService;->isSetWallpaperAllowed(Ljava/lang/String;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->isWallpaperBackupEligible(II)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->isWallpaperSupported(Ljava/lang/String;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->lambda$switchUser$0(Lcom/android/server/wallpaper/WallpaperManagerService;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->loadSettingsLocked(IZ)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->makeJournaledFile(I)Lcom/android/internal/util/JournaledFile;
+PLcom/android/server/wallpaper/WallpaperManagerService;->migrateFromOld()V
+PLcom/android/server/wallpaper/WallpaperManagerService;->notifyWallpaperColorsChanged(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->onBootPhase(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->onUnlockUser(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->parseWallpaperAttributes(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Z)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->registerWallpaperColorsCallback(Landroid/app/IWallpaperManagerCallback;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->saveSettingsLocked(I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->setInAmbientMode(ZZ)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->setLockWallpaperCallback(Landroid/app/IWallpaperManagerCallback;)Z
+PLcom/android/server/wallpaper/WallpaperManagerService;->switchUser(ILandroid/os/IRemoteCallback;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->switchWallpaper(Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;Landroid/os/IRemoteCallback;)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->systemReady()V
+PLcom/android/server/wallpaper/WallpaperManagerService;->unregisterWallpaperColorsCallback(Landroid/app/IWallpaperManagerCallback;I)V
+PLcom/android/server/wallpaper/WallpaperManagerService;->writeWallpaperAttributes(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Lcom/android/server/wallpaper/WallpaperManagerService$WallpaperData;)V
+PLcom/android/server/webkit/SystemImpl$LazyHolder;->access$100()Lcom/android/server/webkit/SystemImpl;
+PLcom/android/server/webkit/SystemImpl;-><init>()V
+PLcom/android/server/webkit/SystemImpl;-><init>(Lcom/android/server/webkit/SystemImpl$1;)V
+PLcom/android/server/webkit/SystemImpl;->getFactoryPackageVersion(Ljava/lang/String;)J
+PLcom/android/server/webkit/SystemImpl;->getInstance()Lcom/android/server/webkit/SystemImpl;
+PLcom/android/server/webkit/SystemImpl;->getMultiProcessSetting(Landroid/content/Context;)I
+PLcom/android/server/webkit/SystemImpl;->getPackageInfoForProvider(Landroid/webkit/WebViewProviderInfo;)Landroid/content/pm/PackageInfo;
+PLcom/android/server/webkit/SystemImpl;->getPackageInfoForProviderAllUsers(Landroid/content/Context;Landroid/webkit/WebViewProviderInfo;)Ljava/util/List;
+PLcom/android/server/webkit/SystemImpl;->getUserChosenWebViewProvider(Landroid/content/Context;)Ljava/lang/String;
+PLcom/android/server/webkit/SystemImpl;->getWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
+PLcom/android/server/webkit/SystemImpl;->isFallbackLogicEnabled()Z
+PLcom/android/server/webkit/SystemImpl;->isMultiProcessDefaultEnabled()Z
+PLcom/android/server/webkit/SystemImpl;->notifyZygote(Z)V
+PLcom/android/server/webkit/SystemImpl;->onWebViewProviderChanged(Landroid/content/pm/PackageInfo;)I
+PLcom/android/server/webkit/SystemImpl;->readSignatures(Landroid/content/res/XmlResourceParser;)[Ljava/lang/String;
+PLcom/android/server/webkit/SystemImpl;->systemIsDebuggable()Z
+PLcom/android/server/webkit/SystemImpl;->updateUserSetting(Landroid/content/Context;Ljava/lang/String;)V
+PLcom/android/server/webkit/WebViewUpdateService$1;-><init>(Lcom/android/server/webkit/WebViewUpdateService;)V
+PLcom/android/server/webkit/WebViewUpdateService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;-><init>(Lcom/android/server/webkit/WebViewUpdateService;)V
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;-><init>(Lcom/android/server/webkit/WebViewUpdateService;Lcom/android/server/webkit/WebViewUpdateService$1;)V
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;->isMultiProcessEnabled()Z
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;->notifyRelroCreationCompleted()V
+PLcom/android/server/webkit/WebViewUpdateService$BinderService;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
+PLcom/android/server/webkit/WebViewUpdateService;-><init>(Landroid/content/Context;)V
+PLcom/android/server/webkit/WebViewUpdateService;->access$000(Landroid/content/Intent;)Ljava/lang/String;
+PLcom/android/server/webkit/WebViewUpdateService;->access$100(Lcom/android/server/webkit/WebViewUpdateService;)Lcom/android/server/webkit/WebViewUpdateServiceImpl;
+PLcom/android/server/webkit/WebViewUpdateService;->entirePackageChanged(Landroid/content/Intent;)Z
+PLcom/android/server/webkit/WebViewUpdateService;->onStart()V
+PLcom/android/server/webkit/WebViewUpdateService;->packageNameFromIntent(Landroid/content/Intent;)Ljava/lang/String;
+PLcom/android/server/webkit/WebViewUpdateService;->prepareWebViewInSystemServer()V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;-><init>(Landroid/content/Context;Lcom/android/server/webkit/SystemInterface;)V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->existsValidNonFallbackProvider([Landroid/webkit/WebViewProviderInfo;)Z
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->getFallbackProvider([Landroid/webkit/WebViewProviderInfo;)Landroid/webkit/WebViewProviderInfo;
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->getWebViewPackages()[Landroid/webkit/WebViewProviderInfo;
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->handleNewUser(I)V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->isDisabledForAllUsers(Ljava/util/List;)Z
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->isMultiProcessEnabled()Z
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->notifyRelroCreationCompleted()V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->packageStateChanged(Ljava/lang/String;II)V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->prepareWebViewInSystemServer()V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->updateFallbackState([Landroid/webkit/WebViewProviderInfo;)V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->updateFallbackStateOnBoot()V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->updateFallbackStateOnPackageChange(Ljava/lang/String;I)V
+PLcom/android/server/webkit/WebViewUpdateServiceImpl;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
+PLcom/android/server/webkit/WebViewUpdater$ProviderAndPackageInfo;-><init>(Landroid/webkit/WebViewProviderInfo;Landroid/content/pm/PackageInfo;)V
+PLcom/android/server/webkit/WebViewUpdater;-><init>(Landroid/content/Context;Lcom/android/server/webkit/SystemInterface;)V
+PLcom/android/server/webkit/WebViewUpdater;->checkIfRelrosDoneLocked()V
+PLcom/android/server/webkit/WebViewUpdater;->findPreferredWebViewPackage()Landroid/content/pm/PackageInfo;
+PLcom/android/server/webkit/WebViewUpdater;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;
+PLcom/android/server/webkit/WebViewUpdater;->getMinimumVersionCode()J
+PLcom/android/server/webkit/WebViewUpdater;->getValidWebViewPackagesAndInfos()[Lcom/android/server/webkit/WebViewUpdater$ProviderAndPackageInfo;
+PLcom/android/server/webkit/WebViewUpdater;->isInstalledAndEnabledForAllUsers(Ljava/util/List;)Z
+PLcom/android/server/webkit/WebViewUpdater;->isValidProvider(Landroid/webkit/WebViewProviderInfo;Landroid/content/pm/PackageInfo;)Z
+PLcom/android/server/webkit/WebViewUpdater;->notifyRelroCreationCompleted()V
+PLcom/android/server/webkit/WebViewUpdater;->onWebViewProviderChanged(Landroid/content/pm/PackageInfo;)V
+PLcom/android/server/webkit/WebViewUpdater;->packageStateChanged(Ljava/lang/String;I)V
+PLcom/android/server/webkit/WebViewUpdater;->prepareWebViewInSystemServer()V
+PLcom/android/server/webkit/WebViewUpdater;->providerHasValidSignature(Landroid/webkit/WebViewProviderInfo;Landroid/content/pm/PackageInfo;Lcom/android/server/webkit/SystemInterface;)Z
+PLcom/android/server/webkit/WebViewUpdater;->validityResult(Landroid/webkit/WebViewProviderInfo;Landroid/content/pm/PackageInfo;)I
+PLcom/android/server/webkit/WebViewUpdater;->versionCodeGE(JJ)Z
+PLcom/android/server/webkit/WebViewUpdater;->waitForAndGetProvider()Landroid/webkit/WebViewProviderResponse;
+PLcom/android/server/webkit/WebViewUpdater;->webViewIsReadyLocked()Z
+PLcom/android/server/wm/-$$Lambda$01bPtngJg5AqEoOWfW3rWfV7MH4;-><init>()V
+PLcom/android/server/wm/-$$Lambda$01bPtngJg5AqEoOWfW3rWfV7MH4;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$2KrtdmjrY7Nagc4IRqzCk9gDuQU;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/-$$Lambda$2KrtdmjrY7Nagc4IRqzCk9gDuQU;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$8kACnZAYfDhQTXwuOd2shUPmkTE;-><init>(Lcom/android/server/wm/WindowTracing;)V
+PLcom/android/server/wm/-$$Lambda$8kACnZAYfDhQTXwuOd2shUPmkTE;->run()V
+PLcom/android/server/wm/-$$Lambda$AppWindowContainerController$8qyUV78Is6_I1WVMp6w8VGpeuOE;-><init>(Lcom/android/server/policy/WindowManagerPolicy$StartingSurface;)V
+PLcom/android/server/wm/-$$Lambda$AppWindowContainerController$8qyUV78Is6_I1WVMp6w8VGpeuOE;->run()V
+PLcom/android/server/wm/-$$Lambda$AppWindowContainerController$BD6wMjkwgPM5dckzkeLRiPrmx9Y;-><init>(Lcom/android/server/wm/AppWindowContainerController;)V
+PLcom/android/server/wm/-$$Lambda$AppWindowContainerController$BD6wMjkwgPM5dckzkeLRiPrmx9Y;->run()V
+PLcom/android/server/wm/-$$Lambda$AppWindowContainerController$mZqlV7Ety8-HHzaQXVEl4hu-8mc;-><init>(Lcom/android/server/wm/AppWindowContainerController;)V
+PLcom/android/server/wm/-$$Lambda$AppWindowContainerController$mZqlV7Ety8-HHzaQXVEl4hu-8mc;->run()V
+PLcom/android/server/wm/-$$Lambda$AppWindowToken$ErIvy8Kb9OulX2W0_mr0NNBS-KE;-><init>()V
+PLcom/android/server/wm/-$$Lambda$AppWindowToken$ErIvy8Kb9OulX2W0_mr0NNBS-KE;->apply(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$AppWindowToken$jSO6pNpAHzC89v5XTI_Oj39kDGg;-><init>()V
+PLcom/android/server/wm/-$$Lambda$AppWindowToken$jSO6pNpAHzC89v5XTI_Oj39kDGg;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$Dimmer$DimState$jMIg4fVfhKsf8fm7mIcffBmkFt8;-><init>(Lcom/android/server/wm/Dimmer$DimState;)V
+PLcom/android/server/wm/-$$Lambda$Dimmer$DimState$jMIg4fVfhKsf8fm7mIcffBmkFt8;->run()V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$0yxrqH9eGY2qTjH1u_BvaVrXCSA;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$1C_-u_mpQFfKL_O8K1VFzBgPg50;-><init>(II)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$1C_-u_mpQFfKL_O8K1VFzBgPg50;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$2VlyMN8z2sOPqE9-yf-z3-peRMI;-><init>(I)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$2VlyMN8z2sOPqE9-yf-z3-peRMI;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$DisplayContent$5D_ifLpk7QwG-e9ZLZynNnDca9g;-><init>()V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$5D_ifLpk7QwG-e9ZLZynNnDca9g;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$DisplayContent$68_t-1mHyvN9aDP5Tt_BKUPoYT8;-><init>(Lcom/android/server/policy/WindowManagerPolicy;ZZ)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$68_t-1mHyvN9aDP5Tt_BKUPoYT8;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$7uZtakUXzuXqF_Qht5Uq7LUvubI;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$7voe_dEKk2BYMriCvPuvaznb9WQ;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$BgTlvHbVclnASz-MrvERWxyMV-A;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$BgTlvHbVclnASz-MrvERWxyMV-A;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$DisplayContent$D0QJUvhaQkGgoMtOmjw5foY9F8M;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$JYsrGdifTPH6ASJDC3B9YWMD2pw;-><init>(I)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$JYsrGdifTPH6ASJDC3B9YWMD2pw;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$DisplayContent$JibsaX4YnJd0ta_wiDDdSp-PjQk;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$NonAppWindowContainers$FI_O7m2qEDfIRZef3D32AxG-rcs;-><init>()V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$NonAppWindowContainers$nqCymC3xR9b3qaeohnnJJpSiajc;-><init>(Lcom/android/server/wm/DisplayContent$NonAppWindowContainers;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$NonAppWindowContainers$nqCymC3xR9b3qaeohnnJJpSiajc;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/wm/-$$Lambda$DisplayContent$TPj3OjTsuIg5GTLb5nMmFqIghA4;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$TPj3OjTsuIg5GTLb5nMmFqIghA4;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$DisplayContent$fiC19lMy-d_-rvza7hhOSw6bOM8;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$fiC19lMy-d_-rvza7hhOSw6bOM8;->compute(Ljava/lang/Object;I)Ljava/lang/Object;
+PLcom/android/server/wm/-$$Lambda$DisplayContent$hRKjZwmneu0T85LNNY6_Zcs4gKM;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$hRKjZwmneu0T85LNNY6_Zcs4gKM;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$jJlRHCiYzTPceX3tUkQ_1wUz71E;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$jJlRHCiYzTPceX3tUkQ_1wUz71E;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$DisplayContent$mKe0fxS63Jo2y7lFQaTOMepRJDc;-><init>(Lcom/android/server/wm/DisplayContent;Z)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$mKe0fxS63Jo2y7lFQaTOMepRJDc;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$oqhmXZMcpcvgI50swQTzosAcjac;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/policy/WindowManagerPolicy;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$oqhmXZMcpcvgI50swQTzosAcjac;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$qT01Aq6xt_ZOs86A1yDQe-qmPFQ;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$DisplayContent$qxt4izS31fb0LF2uo_OF9DMa7gc;-><init>(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/-$$Lambda$LocalAnimationAdapter$X--EomqUvw4qy89IeeTFTH7aCMo;-><init>(Lcom/android/server/wm/LocalAnimationAdapter;Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
+PLcom/android/server/wm/-$$Lambda$LocalAnimationAdapter$X--EomqUvw4qy89IeeTFTH7aCMo;->run()V
+PLcom/android/server/wm/-$$Lambda$PinnedStackController$PinnedStackControllerCallback$MdGjZinCTxKrX3GJTl1CXkAuFro;-><init>(Lcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;I)V
+PLcom/android/server/wm/-$$Lambda$PinnedStackController$PinnedStackControllerCallback$MdGjZinCTxKrX3GJTl1CXkAuFro;->run()V
+PLcom/android/server/wm/-$$Lambda$RemoteAnimationController$f_Hsu4PN7pGOiq9Nl8vxzEA3wa0;-><init>(Lcom/android/server/wm/RemoteAnimationController;[Landroid/view/RemoteAnimationTarget;)V
+PLcom/android/server/wm/-$$Lambda$RemoteAnimationController$f_Hsu4PN7pGOiq9Nl8vxzEA3wa0;->run()V
+PLcom/android/server/wm/-$$Lambda$RemoteAnimationController$uQS8vaPKQ-E3x_9G8NCxPQmw1fw;-><init>(Lcom/android/server/wm/RemoteAnimationController;)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$0aCEx04eIvMHmZVtI4ucsiK5s9I;-><init>()V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$0aCEx04eIvMHmZVtI4ucsiK5s9I;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$3VVFoec4x74e1MMAq03gYI9kKjo;-><init>(IZ)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$3VVFoec4x74e1MMAq03gYI9kKjo;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$Vvv8jzH2oSE9-eakZwTuKd5NpsU;-><init>()V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$Vvv8jzH2oSE9-eakZwTuKd5NpsU;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$qT2ficAmvrvFcBdiJIGNKxJ8Z9Q;-><init>(Lcom/android/server/wm/RootWindowContainer;)V
+PLcom/android/server/wm/-$$Lambda$RootWindowContainer$qT2ficAmvrvFcBdiJIGNKxJ8Z9Q;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$9Wa9MhcrSX12liOouHtYXEkDU60;-><init>(Lcom/android/server/wm/SurfaceAnimationRunner;)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$9Wa9MhcrSX12liOouHtYXEkDU60;->doFrame(J)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$lSzwjoKEGADoEFOzdEnwriAk0T4;-><init>(Lcom/android/server/wm/SurfaceAnimationRunner;)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$lSzwjoKEGADoEFOzdEnwriAk0T4;->run()V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$puhYAP5tF0mSSJva-eUz59HnrkA;-><init>(Lcom/android/server/wm/SurfaceAnimationRunner;Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;Landroid/animation/ValueAnimator;)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$we7K92eAl3biB_bzyqbv5xCmasE;-><init>(Lcom/android/server/wm/SurfaceAnimationRunner;)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$we7K92eAl3biB_bzyqbv5xCmasE;->makeAnimator()Landroid/animation/ValueAnimator;
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$xDyZdsMrcbp64p4BQmOGPvVnSWA;-><init>(Lcom/android/server/wm/SurfaceAnimationRunner;)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimationRunner$xDyZdsMrcbp64p4BQmOGPvVnSWA;->run()V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimator$SIBia0mND666K8lMCPsoid8pUTI;-><init>(Lcom/android/server/wm/SurfaceAnimator;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimator$SIBia0mND666K8lMCPsoid8pUTI;->run()V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimator$vdRZk66hQVbQCvVXEaQCT1kVmFc;-><init>(Lcom/android/server/wm/SurfaceAnimator;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/-$$Lambda$SurfaceAnimator$vdRZk66hQVbQCvVXEaQCT1kVmFc;->onAnimationFinished(Lcom/android/server/wm/AnimationAdapter;)V
+PLcom/android/server/wm/-$$Lambda$TaskSnapshotController$1IXTXVXjIGs9ncGKW_v40ivZeoI;-><init>()V
+PLcom/android/server/wm/-$$Lambda$TaskSnapshotController$1IXTXVXjIGs9ncGKW_v40ivZeoI;->apply(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$TaskSnapshotController$OPdXuZQLetMnocdH6XV32JbNQ3I;-><init>()V
+PLcom/android/server/wm/-$$Lambda$TaskSnapshotController$OPdXuZQLetMnocdH6XV32JbNQ3I;->getSystemDirectoryForUser(I)Ljava/io/File;
+PLcom/android/server/wm/-$$Lambda$TaskSnapshotController$ewi-Dm2ws6pdTXd1elso7FtoLKw;-><init>(Lcom/android/server/wm/TaskSnapshotController;)V
+PLcom/android/server/wm/-$$Lambda$TaskSnapshotController$ewi-Dm2ws6pdTXd1elso7FtoLKw;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$TaskSnapshotController$q-BG2kMqHK9gvuY43J0TfS4aSVU;-><init>(Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/policy/WindowManagerPolicy$ScreenOffListener;)V
+PLcom/android/server/wm/-$$Lambda$TaskSnapshotController$q-BG2kMqHK9gvuY43J0TfS4aSVU;->run()V
+PLcom/android/server/wm/-$$Lambda$UnknownAppVisibilityController$FYhcjOhYWVp6HX5hr3GGaPg67Gc;-><init>(Lcom/android/server/wm/UnknownAppVisibilityController;)V
+PLcom/android/server/wm/-$$Lambda$UnknownAppVisibilityController$FYhcjOhYWVp6HX5hr3GGaPg67Gc;->run()V
+PLcom/android/server/wm/-$$Lambda$WallpaperController$6pruPGLeSJAwNl9vGfC87eso21w;-><init>(Lcom/android/server/wm/WallpaperController;)V
+PLcom/android/server/wm/-$$Lambda$WallpaperController$Gy7houdzET4VmpY0QJ2v-NX1b7k;-><init>(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/-$$Lambda$WallpaperController$Gy7houdzET4VmpY0QJ2v-NX1b7k;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$WindowAnimationSpec$jKE7Phq2DESkeBondpaNPBLn6Cs;-><init>()V
+PLcom/android/server/wm/-$$Lambda$WindowAnimationSpec$jKE7Phq2DESkeBondpaNPBLn6Cs;->get()Ljava/lang/Object;
+PLcom/android/server/wm/-$$Lambda$WindowAnimator$U3Fu5_RzEyNo8Jt6zTb2ozdXiqM;-><init>(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/-$$Lambda$WindowAnimator$U3Fu5_RzEyNo8Jt6zTb2ozdXiqM;->run()V
+PLcom/android/server/wm/-$$Lambda$WindowAnimator$ddXU8gK8rmDqri0OZVMNa3Y4GHk;-><init>(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/-$$Lambda$WindowAnimator$ddXU8gK8rmDqri0OZVMNa3Y4GHk;->doFrame(J)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$5dMkMeana3BB2vTfpghrIR2jQMg;-><init>(Lcom/android/server/wm/WindowManagerService;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$5dMkMeana3BB2vTfpghrIR2jQMg;->run()V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$CbEzJbdxOpfZ-AMUAcOVQZxepOo;-><init>(Landroid/app/IAssistDataReceiver;Landroid/graphics/Bitmap;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$CbEzJbdxOpfZ-AMUAcOVQZxepOo;->run()V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$Mfs-IxxijHiEAEKbLIL1x_17ck0;-><init>(Z)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$Mfs-IxxijHiEAEKbLIL1x_17ck0;->accept(Ljava/lang/Object;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$XZ-U3HlCFtHp_gydNmNMeRmQMCI;-><init>()V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$XZ-U3HlCFtHp_gydNmNMeRmQMCI;->make(Landroid/view/SurfaceSession;)Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$hBnABSAsqXWvQ0zKwHWE4BZ3Mc0;-><init>()V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$hBnABSAsqXWvQ0zKwHWE4BZ3Mc0;->make()Landroid/view/SurfaceControl$Transaction;
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$qOaUiWHWefHk1N5K-T4WND2mknQ;-><init>(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZZLcom/android/server/policy/WindowManagerPolicy;)V
+PLcom/android/server/wm/-$$Lambda$WindowManagerService$qOaUiWHWefHk1N5K-T4WND2mknQ;->run()V
+PLcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$4Hbamt-LFcbu8AoZBoOZN_LveKQ;-><init>(Lcom/android/server/wm/WindowSurfacePlacer;)V
+PLcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$4Hbamt-LFcbu8AoZBoOZN_LveKQ;->run()V
+PLcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$AnzDJL6vBWwhbuz7sYsAfUAzZko;-><init>(ILandroid/util/ArraySet;)V
+PLcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$AnzDJL6vBWwhbuz7sYsAfUAzZko;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$tJcqA51ohv9DQjcvHOarwInr01s;-><init>()V
+PLcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$tJcqA51ohv9DQjcvHOarwInr01s;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$wCevQN6hMxiB97Eay8ibpi2Xaxo;-><init>()V
+PLcom/android/server/wm/-$$Lambda$WindowSurfacePlacer$wCevQN6hMxiB97Eay8ibpi2Xaxo;->test(Ljava/lang/Object;)Z
+PLcom/android/server/wm/-$$Lambda$WindowToken$tFLHn4S6WuSXW1gp1kvT_sp7WC0;-><init>(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/-$$Lambda$WindowToken$tFLHn4S6WuSXW1gp1kvT_sp7WC0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/wm/-$$Lambda$yACUZqn1Ak-GL14-Nu3kHUSaLX0;-><init>()V
+PLcom/android/server/wm/-$$Lambda$yACUZqn1Ak-GL14-Nu3kHUSaLX0;->startAnimation(Lcom/android/server/wm/SurfaceAnimator;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;Z)V
+PLcom/android/server/wm/-$$Lambda$yVRF8YoeNdTa8GR1wDStVsHu8xM;-><init>(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/-$$Lambda$yVRF8YoeNdTa8GR1wDStVsHu8xM;->run()V
+PLcom/android/server/wm/AnimatingAppWindowTokenRegistry;-><init>()V
+PLcom/android/server/wm/AnimatingAppWindowTokenRegistry;->endDeferringFinished()V
+PLcom/android/server/wm/AnimatingAppWindowTokenRegistry;->notifyAboutToFinish(Lcom/android/server/wm/AppWindowToken;Ljava/lang/Runnable;)Z
+PLcom/android/server/wm/AnimatingAppWindowTokenRegistry;->notifyFinished(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/AnimatingAppWindowTokenRegistry;->notifyStarting(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/AppTokenList;-><init>()V
+PLcom/android/server/wm/AppTransition$1;-><init>(Lcom/android/server/wm/AppTransition;)V
+PLcom/android/server/wm/AppTransition$2;-><init>(Lcom/android/server/wm/AppTransition;)V
+PLcom/android/server/wm/AppTransition;-><init>(Landroid/content/Context;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/AppTransition;->canOverridePendingAppTransition()Z
+PLcom/android/server/wm/AppTransition;->canSkipFirstFrame()Z
+PLcom/android/server/wm/AppTransition;->clear()V
+PLcom/android/server/wm/AppTransition;->fetchAppTransitionSpecsFromFuture()V
+PLcom/android/server/wm/AppTransition;->getAppStackClipMode()I
+PLcom/android/server/wm/AppTransition;->getAppTransition()I
+PLcom/android/server/wm/AppTransition;->getCachedAnimations(Landroid/view/WindowManager$LayoutParams;)Lcom/android/server/AttributeCache$Entry;
+PLcom/android/server/wm/AppTransition;->getCachedAnimations(Ljava/lang/String;I)Lcom/android/server/AttributeCache$Entry;
+PLcom/android/server/wm/AppTransition;->getRemoteAnimationController()Lcom/android/server/wm/RemoteAnimationController;
+PLcom/android/server/wm/AppTransition;->getTransitFlags()I
+PLcom/android/server/wm/AppTransition;->goodToGo(ILcom/android/server/wm/AppWindowToken;Lcom/android/server/wm/AppWindowToken;Landroid/util/ArraySet;Landroid/util/ArraySet;)I
+PLcom/android/server/wm/AppTransition;->isActivityTransit(I)Z
+PLcom/android/server/wm/AppTransition;->isFetchingAppTransitionsSpecs()Z
+PLcom/android/server/wm/AppTransition;->isKeyguardGoingAwayTransit(I)Z
+PLcom/android/server/wm/AppTransition;->isKeyguardTransit(I)Z
+PLcom/android/server/wm/AppTransition;->isNextAppTransitionOpenCrossProfileApps()Z
+PLcom/android/server/wm/AppTransition;->isNextAppTransitionThumbnailDown()Z
+PLcom/android/server/wm/AppTransition;->isNextAppTransitionThumbnailUp()Z
+PLcom/android/server/wm/AppTransition;->isReady()Z
+PLcom/android/server/wm/AppTransition;->isTaskOpenTransit(I)Z
+PLcom/android/server/wm/AppTransition;->isTaskTransit(I)Z
+PLcom/android/server/wm/AppTransition;->isTimeout()Z
+PLcom/android/server/wm/AppTransition;->isTransitionEqual(I)Z
+PLcom/android/server/wm/AppTransition;->loadAnimation(Landroid/view/WindowManager$LayoutParams;IZIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZZI)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->loadAnimationAttr(Landroid/view/WindowManager$LayoutParams;II)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->loadAnimationRes(Ljava/lang/String;I)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->loadKeyguardExitAnimation(I)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppTransition;->needsBoosting()Z
+PLcom/android/server/wm/AppTransition;->notifyAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/wm/AppTransition;->notifyAppTransitionPendingLocked()V
+PLcom/android/server/wm/AppTransition;->notifyAppTransitionStartingLocked(ILandroid/os/IBinder;Landroid/os/IBinder;JJJ)I
+PLcom/android/server/wm/AppTransition;->overridePendingAppTransition(Ljava/lang/String;IILandroid/os/IRemoteCallback;)V
+PLcom/android/server/wm/AppTransition;->overridePendingAppTransitionRemote(Landroid/view/RemoteAnimationAdapter;)V
+PLcom/android/server/wm/AppTransition;->postAnimationCallback()V
+PLcom/android/server/wm/AppTransition;->prepare()Z
+PLcom/android/server/wm/AppTransition;->prepareAppTransitionLocked(IZIZ)Z
+PLcom/android/server/wm/AppTransition;->registerListenerLocked(Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener;)V
+PLcom/android/server/wm/AppTransition;->setAppTransition(II)V
+PLcom/android/server/wm/AppTransition;->setAppTransitionState(I)V
+PLcom/android/server/wm/AppTransition;->setIdle()V
+PLcom/android/server/wm/AppTransition;->setLastAppTransition(ILcom/android/server/wm/AppWindowToken;Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/AppTransition;->setReady()V
+PLcom/android/server/wm/AppTransition;->updateBooster()V
+PLcom/android/server/wm/AppTransition;->updateToTranslucentAnimIfNeeded(II)I
+PLcom/android/server/wm/AppWindowContainerController$1;-><init>(Lcom/android/server/wm/AppWindowContainerController;)V
+PLcom/android/server/wm/AppWindowContainerController$1;->run()V
+PLcom/android/server/wm/AppWindowContainerController$H;-><init>(Lcom/android/server/wm/AppWindowContainerController;Landroid/os/Looper;)V
+PLcom/android/server/wm/AppWindowContainerController$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wm/AppWindowContainerController;-><init>(Lcom/android/server/wm/TaskWindowContainerController;Landroid/view/IApplicationToken;Lcom/android/server/wm/AppWindowContainerListener;IIZZIZZZIIJ)V
+PLcom/android/server/wm/AppWindowContainerController;-><init>(Lcom/android/server/wm/TaskWindowContainerController;Landroid/view/IApplicationToken;Lcom/android/server/wm/AppWindowContainerListener;IIZZIZZZIIJLcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/AppWindowContainerController;->addStartingWindow(Ljava/lang/String;ILandroid/content/res/CompatibilityInfo;Ljava/lang/CharSequence;IIIILandroid/os/IBinder;ZZZZZZ)Z
+PLcom/android/server/wm/AppWindowContainerController;->createAppWindow(Lcom/android/server/wm/WindowManagerService;Landroid/view/IApplicationToken;ZLcom/android/server/wm/DisplayContent;JZZIIIIZZLcom/android/server/wm/AppWindowContainerController;)Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/AppWindowContainerController;->createSnapshot(Landroid/app/ActivityManager$TaskSnapshot;)Z
+PLcom/android/server/wm/AppWindowContainerController;->getOrientation()I
+PLcom/android/server/wm/AppWindowContainerController;->getStartingWindowType(ZZZZZZLandroid/app/ActivityManager$TaskSnapshot;)I
+PLcom/android/server/wm/AppWindowContainerController;->lambda$new$0(Lcom/android/server/wm/AppWindowContainerController;)V
+PLcom/android/server/wm/AppWindowContainerController;->lambda$new$1(Lcom/android/server/wm/AppWindowContainerController;)V
+PLcom/android/server/wm/AppWindowContainerController;->lambda$removeStartingWindow$2(Lcom/android/server/policy/WindowManagerPolicy$StartingSurface;)V
+PLcom/android/server/wm/AppWindowContainerController;->notifyAppResumed(Z)V
+PLcom/android/server/wm/AppWindowContainerController;->notifyAppStopped()V
+PLcom/android/server/wm/AppWindowContainerController;->notifyAppStopping()V
+PLcom/android/server/wm/AppWindowContainerController;->notifyUnknownVisibilityLaunched()V
+PLcom/android/server/wm/AppWindowContainerController;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/AppWindowContainerController;->pauseKeyDispatching()V
+PLcom/android/server/wm/AppWindowContainerController;->registerRemoteAnimations(Landroid/view/RemoteAnimationDefinition;)V
+PLcom/android/server/wm/AppWindowContainerController;->removeContainer(I)V
+PLcom/android/server/wm/AppWindowContainerController;->removeStartingWindow()V
+PLcom/android/server/wm/AppWindowContainerController;->reportStartingWindowDrawn()V
+PLcom/android/server/wm/AppWindowContainerController;->reportWindowsDrawn()V
+PLcom/android/server/wm/AppWindowContainerController;->reportWindowsGone()V
+PLcom/android/server/wm/AppWindowContainerController;->reportWindowsVisible()V
+PLcom/android/server/wm/AppWindowContainerController;->resumeKeyDispatching()V
+PLcom/android/server/wm/AppWindowContainerController;->scheduleAddStartingWindow()V
+PLcom/android/server/wm/AppWindowContainerController;->setOrientation(IILandroid/content/res/Configuration;Z)Landroid/content/res/Configuration;
+PLcom/android/server/wm/AppWindowContainerController;->setVisibility(ZZ)V
+PLcom/android/server/wm/AppWindowContainerController;->snapshotOrientationSameAsTask(Landroid/app/ActivityManager$TaskSnapshot;)Z
+PLcom/android/server/wm/AppWindowContainerController;->startFreezingScreen(I)V
+PLcom/android/server/wm/AppWindowContainerController;->stopFreezingScreen(Z)V
+PLcom/android/server/wm/AppWindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IApplicationToken;ZLcom/android/server/wm/DisplayContent;JZZIIIIZZLcom/android/server/wm/AppWindowContainerController;)V
+PLcom/android/server/wm/AppWindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IApplicationToken;ZLcom/android/server/wm/DisplayContent;Z)V
+PLcom/android/server/wm/AppWindowToken;->addWindow(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->allDrawnStatesConsidered()Z
+PLcom/android/server/wm/AppWindowToken;->applyAnimationLocked(Landroid/view/WindowManager$LayoutParams;IZZ)Z
+PLcom/android/server/wm/AppWindowToken;->canTurnScreenOn()Z
+PLcom/android/server/wm/AppWindowToken;->cancelAnimation()V
+PLcom/android/server/wm/AppWindowToken;->checkKeyguardFlagsChanged()V
+PLcom/android/server/wm/AppWindowToken;->clearAllDrawn()V
+PLcom/android/server/wm/AppWindowToken;->clearAnimatingFlags()V
+PLcom/android/server/wm/AppWindowToken;->clearRelaunching()V
+PLcom/android/server/wm/AppWindowToken;->clearThumbnail()V
+PLcom/android/server/wm/AppWindowToken;->destroySurfaces()V
+PLcom/android/server/wm/AppWindowToken;->destroySurfaces(Z)V
+PLcom/android/server/wm/AppWindowToken;->detachChildren()V
+PLcom/android/server/wm/AppWindowToken;->fillsParent()Z
+PLcom/android/server/wm/AppWindowToken;->finishRelaunching()V
+PLcom/android/server/wm/AppWindowToken;->getAnimationLeashParent()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/AppWindowToken;->getAppAnimationLayer()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/AppWindowToken;->getController()Lcom/android/server/wm/AppWindowContainerController;
+PLcom/android/server/wm/AppWindowToken;->getHighestAnimLayerWindow(Lcom/android/server/wm/WindowState;)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/AppWindowToken;->getImeTargetBelowWindow(Lcom/android/server/wm/WindowState;)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/AppWindowToken;->getLetterboxInsets()Landroid/graphics/Rect;
+PLcom/android/server/wm/AppWindowToken;->getOrientation(I)I
+PLcom/android/server/wm/AppWindowToken;->getOrientationIgnoreVisibility()I
+PLcom/android/server/wm/AppWindowToken;->getRemoteAnimationDefinition()Landroid/view/RemoteAnimationDefinition;
+PLcom/android/server/wm/AppWindowToken;->getStack()Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/AppWindowToken;->getTopFullscreenWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/AppWindowToken;->getTransit()I
+PLcom/android/server/wm/AppWindowToken;->getTransitFlags()I
+PLcom/android/server/wm/AppWindowToken;->hasWindowsAlive()Z
+PLcom/android/server/wm/AppWindowToken;->isFirstChildWindowGreaterThanSecond(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/AppWindowToken;->isFreezingScreen()Z
+PLcom/android/server/wm/AppWindowToken;->isLastWindow(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/AppWindowToken;->isSurfaceShowing()Z
+PLcom/android/server/wm/AppWindowToken;->isVisible()Z
+PLcom/android/server/wm/AppWindowToken;->lambda$shouldUseAppThemeSnapshot$1(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/AppWindowToken;->lambda$showAllWindowsLocked$2(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->loadAnimation(Landroid/view/WindowManager$LayoutParams;IZZ)Landroid/view/animation/Animation;
+PLcom/android/server/wm/AppWindowToken;->notifyAppResumed(Z)V
+PLcom/android/server/wm/AppWindowToken;->notifyAppStopped()V
+PLcom/android/server/wm/AppWindowToken;->onAnimationFinished()V
+PLcom/android/server/wm/AppWindowToken;->onAnimationLeashCreated(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/AppWindowToken;->onAnimationLeashDestroyed(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/AppWindowToken;->onAppTransitionDone()V
+PLcom/android/server/wm/AppWindowToken;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/AppWindowToken;->onFirstWindowDrawn(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)V
+PLcom/android/server/wm/AppWindowToken;->onParentSet()V
+PLcom/android/server/wm/AppWindowToken;->onRemovedFromDisplay()V
+PLcom/android/server/wm/AppWindowToken;->postWindowRemoveStartingWindowCleanup(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->registerRemoteAnimations(Landroid/view/RemoteAnimationDefinition;)V
+PLcom/android/server/wm/AppWindowToken;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/AppWindowToken;->removeChild(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->removeDeadWindows()V
+PLcom/android/server/wm/AppWindowToken;->removeIfPossible()V
+PLcom/android/server/wm/AppWindowToken;->removeImmediately()V
+PLcom/android/server/wm/AppWindowToken;->removeReplacedWindowIfNeeded(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/AppWindowToken;->requestUpdateWallpaperIfNeeded()V
+PLcom/android/server/wm/AppWindowToken;->setAppLayoutChanges(ILjava/lang/String;)V
+PLcom/android/server/wm/AppWindowToken;->setCanTurnScreenOn(Z)V
+PLcom/android/server/wm/AppWindowToken;->setClientHidden(Z)V
+PLcom/android/server/wm/AppWindowToken;->setFillsParent(Z)V
+PLcom/android/server/wm/AppWindowToken;->setHidden(Z)V
+PLcom/android/server/wm/AppWindowToken;->setLayer(Landroid/view/SurfaceControl$Transaction;I)V
+PLcom/android/server/wm/AppWindowToken;->setVisibility(Landroid/view/WindowManager$LayoutParams;ZIZZ)Z
+PLcom/android/server/wm/AppWindowToken;->shouldAnimate(I)Z
+PLcom/android/server/wm/AppWindowToken;->shouldDeferAnimationFinish(Ljava/lang/Runnable;)Z
+PLcom/android/server/wm/AppWindowToken;->shouldFreezeBounds()Z
+PLcom/android/server/wm/AppWindowToken;->shouldUseAppThemeSnapshot()Z
+PLcom/android/server/wm/AppWindowToken;->showAllWindowsLocked()V
+PLcom/android/server/wm/AppWindowToken;->startFreezingScreen()V
+PLcom/android/server/wm/AppWindowToken;->startRelaunching()V
+PLcom/android/server/wm/AppWindowToken;->stopFreezingScreen(ZZ)V
+PLcom/android/server/wm/AppWindowToken;->toString()Ljava/lang/String;
+PLcom/android/server/wm/AppWindowToken;->transferStartingWindow(Landroid/os/IBinder;)Z
+PLcom/android/server/wm/AppWindowToken;->transferStartingWindowFromHiddenAboveTokenIfNeeded()V
+PLcom/android/server/wm/AppWindowToken;->unfreezeBounds()V
+PLcom/android/server/wm/AppWindowToken;->updateAllDrawn()V
+PLcom/android/server/wm/AppWindowToken;->updateReportedVisibilityLocked()V
+PLcom/android/server/wm/AppWindowToken;->waitingForReplacement()Z
+PLcom/android/server/wm/BlackFrame$BlackSurface;-><init>(Lcom/android/server/wm/BlackFrame;Landroid/view/SurfaceControl$Transaction;IIIIILcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/BlackFrame$BlackSurface;->setMatrix(Landroid/view/SurfaceControl$Transaction;Landroid/graphics/Matrix;)V
+PLcom/android/server/wm/BlackFrame;-><init>(Landroid/view/SurfaceControl$Transaction;Landroid/graphics/Rect;Landroid/graphics/Rect;ILcom/android/server/wm/DisplayContent;Z)V
+PLcom/android/server/wm/BlackFrame;->kill()V
+PLcom/android/server/wm/BlackFrame;->setMatrix(Landroid/view/SurfaceControl$Transaction;Landroid/graphics/Matrix;)V
+PLcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;-><init>(Lcom/android/server/wm/BoundsAnimationController;)V
+PLcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;-><init>(Lcom/android/server/wm/BoundsAnimationController;Lcom/android/server/wm/BoundsAnimationController$1;)V
+PLcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;->animationFinished()V
+PLcom/android/server/wm/BoundsAnimationController$AppTransitionNotifier;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/wm/BoundsAnimationController;-><init>(Landroid/content/Context;Lcom/android/server/wm/AppTransition;Landroid/os/Handler;Landroid/animation/AnimationHandler;)V
+PLcom/android/server/wm/BoundsAnimationController;->access$000(Lcom/android/server/wm/BoundsAnimationController;)Z
+PLcom/android/server/wm/ConfigurationContainer;->diffOverrideBounds(Landroid/graphics/Rect;)I
+PLcom/android/server/wm/ConfigurationContainer;->equivalentBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z
+PLcom/android/server/wm/ConfigurationContainer;->equivalentOverrideBounds(Landroid/graphics/Rect;)Z
+PLcom/android/server/wm/ConfigurationContainer;->getMergedOverrideConfiguration()Landroid/content/res/Configuration;
+PLcom/android/server/wm/ConfigurationContainer;->getName()Ljava/lang/String;
+PLcom/android/server/wm/ConfigurationContainer;->hasCompatibleActivityType(Lcom/android/server/wm/ConfigurationContainer;)Z
+PLcom/android/server/wm/ConfigurationContainer;->hasOverrideBounds()Z
+PLcom/android/server/wm/ConfigurationContainer;->inMultiWindowMode()Z
+PLcom/android/server/wm/ConfigurationContainer;->inSplitScreenSecondaryWindowingMode()Z
+PLcom/android/server/wm/ConfigurationContainer;->isActivityTypeRecents()Z
+PLcom/android/server/wm/ConfigurationContainer;->isActivityTypeStandard()Z
+PLcom/android/server/wm/ConfigurationContainer;->onMergedOverrideConfigurationChanged()V
+PLcom/android/server/wm/ConfigurationContainer;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/ConfigurationContainer;->onParentChanged()V
+PLcom/android/server/wm/ConfigurationContainer;->registerConfigurationChangeListener(Lcom/android/server/wm/ConfigurationContainerListener;)V
+PLcom/android/server/wm/ConfigurationContainer;->setActivityType(I)V
+PLcom/android/server/wm/ConfigurationContainer;->setBounds(IIII)I
+PLcom/android/server/wm/ConfigurationContainer;->setBounds(Landroid/graphics/Rect;)I
+PLcom/android/server/wm/ConfigurationContainer;->setWindowingMode(I)V
+PLcom/android/server/wm/ConfigurationContainer;->supportsSplitScreenWindowingMode()Z
+PLcom/android/server/wm/ConfigurationContainer;->unregisterConfigurationChangeListener(Lcom/android/server/wm/ConfigurationContainerListener;)V
+PLcom/android/server/wm/Dimmer$AlphaAnimationSpec;-><init>(FFJ)V
+PLcom/android/server/wm/Dimmer$AlphaAnimationSpec;->apply(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;J)V
+PLcom/android/server/wm/Dimmer$AlphaAnimationSpec;->getDuration()J
+PLcom/android/server/wm/Dimmer$DimAnimatable;-><init>(Lcom/android/server/wm/Dimmer;Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/Dimmer$DimAnimatable;-><init>(Lcom/android/server/wm/Dimmer;Landroid/view/SurfaceControl;Lcom/android/server/wm/Dimmer$1;)V
+PLcom/android/server/wm/Dimmer$DimAnimatable;->getAnimationLeashParent()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/Dimmer$DimAnimatable;->getParentSurfaceControl()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/Dimmer$DimAnimatable;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;
+PLcom/android/server/wm/Dimmer$DimAnimatable;->getSurfaceControl()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/Dimmer$DimAnimatable;->getSurfaceHeight()I
+PLcom/android/server/wm/Dimmer$DimAnimatable;->getSurfaceWidth()I
+PLcom/android/server/wm/Dimmer$DimAnimatable;->makeAnimationLeash()Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/Dimmer$DimAnimatable;->onAnimationLeashCreated(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/Dimmer$DimAnimatable;->onAnimationLeashDestroyed(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/Dimmer$DimState;-><init>(Lcom/android/server/wm/Dimmer;Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/Dimmer$DimState;->lambda$new$0(Lcom/android/server/wm/Dimmer$DimState;)V
+PLcom/android/server/wm/Dimmer;-><init>(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/Dimmer;-><init>(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Dimmer$SurfaceAnimatorStarter;)V
+PLcom/android/server/wm/Dimmer;->access$000(Lcom/android/server/wm/Dimmer;)Lcom/android/server/wm/WindowContainer;
+PLcom/android/server/wm/Dimmer;->dim(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;IF)V
+PLcom/android/server/wm/Dimmer;->dimBelow(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/WindowContainer;F)V
+PLcom/android/server/wm/Dimmer;->getDimDuration(Lcom/android/server/wm/WindowContainer;)J
+PLcom/android/server/wm/Dimmer;->getDimState(Lcom/android/server/wm/WindowContainer;)Lcom/android/server/wm/Dimmer$DimState;
+PLcom/android/server/wm/Dimmer;->makeDimLayer()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/Dimmer;->startAnim(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/SurfaceAnimator;Landroid/view/SurfaceControl$Transaction;FF)V
+PLcom/android/server/wm/Dimmer;->startDimEnter(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/SurfaceAnimator;Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/Dimmer;->startDimExit(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/SurfaceAnimator;Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/DisplayContent$AboveAppWindowContainers;-><init>(Lcom/android/server/wm/DisplayContent;Ljava/lang/String;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/DisplayContent$AboveAppWindowContainers;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;-><init>()V
+PLcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;-><init>(Lcom/android/server/wm/DisplayContent$1;)V
+PLcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;->reset()V
+PLcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;->fillsParent()Z
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;-><init>(Lcom/android/server/wm/DisplayContent;Ljava/lang/String;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->addChild(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->getName()Ljava/lang/String;
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->getOrientation()I
+PLcom/android/server/wm/DisplayContent$NonAppWindowContainers;->lambda$new$0(Lcom/android/server/wm/DisplayContent$NonAppWindowContainers;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowToken;)I
+PLcom/android/server/wm/DisplayContent$NonMagnifiableWindowContainers;-><init>(Lcom/android/server/wm/DisplayContent;Ljava/lang/String;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/DisplayContent$TaskForResizePointSearchResult;-><init>()V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;-><init>(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->addChild(Lcom/android/server/wm/TaskStack;Z)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->addStackReferenceIfNeeded(Lcom/android/server/wm/TaskStack;)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->addStackToDisplay(Lcom/android/server/wm/TaskStack;Z)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->findPositionForStack(ILcom/android/server/wm/TaskStack;Z)I
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->getAppAnimationLayer(I)Landroid/view/SurfaceControl;
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->getOrientation()I
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->getPinnedStack()Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->getSplitScreenDividerAnchor()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->onParentSet()V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->positionChildAt(ILcom/android/server/wm/TaskStack;Z)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->removeChild(Lcom/android/server/wm/TaskStack;)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/DisplayContent$TaskStackContainers;->removeStackReferenceIfNeeded(Lcom/android/server/wm/TaskStack;)V
+PLcom/android/server/wm/DisplayContent;-><init>(Landroid/view/Display;Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/DisplayWindowController;)V
+PLcom/android/server/wm/DisplayContent;->access$300(Lcom/android/server/wm/DisplayContent;)Z
+PLcom/android/server/wm/DisplayContent;->access$500(Lcom/android/server/wm/DisplayContent;)I
+PLcom/android/server/wm/DisplayContent;->access$502(Lcom/android/server/wm/DisplayContent;I)I
+PLcom/android/server/wm/DisplayContent;->access$602(Lcom/android/server/wm/DisplayContent;I)I
+PLcom/android/server/wm/DisplayContent;->addWindowToken(Landroid/os/IBinder;Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/DisplayContent;->adjustDisplaySizeRanges(Landroid/view/DisplayInfo;IIIII)V
+PLcom/android/server/wm/DisplayContent;->applySurfaceChangesTransaction(Z)Z
+PLcom/android/server/wm/DisplayContent;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/DisplayContent;->assignStackOrdering()V
+PLcom/android/server/wm/DisplayContent;->assignWindowLayers(Z)V
+PLcom/android/server/wm/DisplayContent;->calculateDisplayCutoutForRotation(I)Lcom/android/server/wm/utils/WmDisplayCutout;
+PLcom/android/server/wm/DisplayContent;->calculateDisplayCutoutForRotationUncached(Landroid/view/DisplayCutout;I)Lcom/android/server/wm/utils/WmDisplayCutout;
+PLcom/android/server/wm/DisplayContent;->canAddToastWindowForUid(I)Z
+PLcom/android/server/wm/DisplayContent;->canUpdateImeTarget()Z
+PLcom/android/server/wm/DisplayContent;->checkCompleteDeferredRemoval()Z
+PLcom/android/server/wm/DisplayContent;->checkWaitingForWindows()Z
+PLcom/android/server/wm/DisplayContent;->clearLayoutNeeded()V
+PLcom/android/server/wm/DisplayContent;->computeCompatSmallestWidth(ZIIII)I
+PLcom/android/server/wm/DisplayContent;->computeImeTarget(Z)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/DisplayContent;->computeScreenConfiguration(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/DisplayContent;->computeSizeRangesAndScreenLayout(Landroid/view/DisplayInfo;IZIIIFLandroid/content/res/Configuration;)V
+PLcom/android/server/wm/DisplayContent;->configureDisplayPolicy()V
+PLcom/android/server/wm/DisplayContent;->continueUpdateImeTarget()V
+PLcom/android/server/wm/DisplayContent;->convertCropForSurfaceFlinger(Landroid/graphics/Rect;III)V
+PLcom/android/server/wm/DisplayContent;->createStack(IZLcom/android/server/wm/StackWindowController;)Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/DisplayContent;->deferUpdateImeTarget()V
+PLcom/android/server/wm/DisplayContent;->deltaRotation(II)I
+PLcom/android/server/wm/DisplayContent;->findFocusedWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/DisplayContent;->forAllImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+PLcom/android/server/wm/DisplayContent;->getDisplay()Landroid/view/Display;
+PLcom/android/server/wm/DisplayContent;->getDisplayMetrics()Landroid/util/DisplayMetrics;
+PLcom/android/server/wm/DisplayContent;->getLastOrientation()I
+PLcom/android/server/wm/DisplayContent;->getNeedsMenu(Lcom/android/server/wm/WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->getOrientation()I
+PLcom/android/server/wm/DisplayContent;->getPinnedStack()Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/DisplayContent;->getPinnedStackController()Lcom/android/server/wm/PinnedStackController;
+PLcom/android/server/wm/DisplayContent;->getRotation()I
+PLcom/android/server/wm/DisplayContent;->getSession()Landroid/view/SurfaceSession;
+PLcom/android/server/wm/DisplayContent;->hasAccess(I)Z
+PLcom/android/server/wm/DisplayContent;->hasPinnedStack()Z
+PLcom/android/server/wm/DisplayContent;->hasSecureWindowOnScreen()Z
+PLcom/android/server/wm/DisplayContent;->hasSplitScreenPrimaryStack()Z
+PLcom/android/server/wm/DisplayContent;->initializeDisplayBaseInfo()V
+PLcom/android/server/wm/DisplayContent;->inputMethodClientHasFocus(Lcom/android/internal/view/IInputMethodClient;)Z
+PLcom/android/server/wm/DisplayContent;->isReady()Z
+PLcom/android/server/wm/DisplayContent;->isRemovalDeferred()Z
+PLcom/android/server/wm/DisplayContent;->lambda$canAddToastWindowForUid$14(ILcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$canAddToastWindowForUid$15(ILcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$checkWaitingForWindows$20(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$fiC19lMy-d_-rvza7hhOSw6bOM8(Lcom/android/server/wm/DisplayContent;Landroid/view/DisplayCutout;I)Lcom/android/server/wm/utils/WmDisplayCutout;
+PLcom/android/server/wm/DisplayContent;->lambda$getNeedsMenu$17(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$hasSecureWindowOnScreen$21(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$new$2(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$new$6(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/DisplayContent;->lambda$startKeyguardExitOnNonAppWindows$19(Lcom/android/server/policy/WindowManagerPolicy;ZZLcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$updateRotationUnchecked$11(Lcom/android/server/wm/DisplayContent;ZLcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$updateSystemUiVisibility$22(IILcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->lambda$waitForAllWindowsDrawn$24(Lcom/android/server/wm/DisplayContent;Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->layoutAndAssignWindowLayersIfNeeded()V
+PLcom/android/server/wm/DisplayContent;->makeChildSurface(Lcom/android/server/wm/WindowContainer;)Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/DisplayContent;->makeOverlay()Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/DisplayContent;->okToAnimate()Z
+PLcom/android/server/wm/DisplayContent;->okToDisplay()Z
+PLcom/android/server/wm/DisplayContent;->onAppTransitionDone()V
+PLcom/android/server/wm/DisplayContent;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/DisplayContent;->onParentSet()V
+PLcom/android/server/wm/DisplayContent;->performLayout(ZZ)V
+PLcom/android/server/wm/DisplayContent;->positionChildAt(ILcom/android/server/wm/DisplayContent$DisplayChildWindowContainer;Z)V
+PLcom/android/server/wm/DisplayContent;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+PLcom/android/server/wm/DisplayContent;->positionStackAt(ILcom/android/server/wm/TaskStack;)V
+PLcom/android/server/wm/DisplayContent;->prepareFreezingTaskBounds()V
+PLcom/android/server/wm/DisplayContent;->reParentWindowToken(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/DisplayContent;->reapplyMagnificationSpec()V
+PLcom/android/server/wm/DisplayContent;->reduceCompatConfigWidthSize(IIILandroid/util/DisplayMetrics;III)I
+PLcom/android/server/wm/DisplayContent;->reduceConfigLayout(IIFIIII)I
+PLcom/android/server/wm/DisplayContent;->removeAppToken(Landroid/os/IBinder;)V
+PLcom/android/server/wm/DisplayContent;->removeExistingTokensIfPossible()V
+PLcom/android/server/wm/DisplayContent;->removeWindowToken(Landroid/os/IBinder;)Lcom/android/server/wm/WindowToken;
+PLcom/android/server/wm/DisplayContent;->scheduleToastWindowsTimeoutIfNeededLocked(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DisplayContent;->screenshotDisplayLocked(Landroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
+PLcom/android/server/wm/DisplayContent;->setExitingTokensHasVisible(Z)V
+PLcom/android/server/wm/DisplayContent;->setInputMethodTarget(Lcom/android/server/wm/WindowState;Z)V
+PLcom/android/server/wm/DisplayContent;->setLastOrientation(I)V
+PLcom/android/server/wm/DisplayContent;->setLayoutNeeded()V
+PLcom/android/server/wm/DisplayContent;->startKeyguardExitOnNonAppWindows(ZZ)V
+PLcom/android/server/wm/DisplayContent;->updateBaseDisplayMetrics(III)V
+PLcom/android/server/wm/DisplayContent;->updateBaseDisplayMetricsIfNeeded()V
+PLcom/android/server/wm/DisplayContent;->updateBounds()V
+PLcom/android/server/wm/DisplayContent;->updateDisplayAndOrientation(I)Landroid/view/DisplayInfo;
+PLcom/android/server/wm/DisplayContent;->updateDisplayInfo()V
+PLcom/android/server/wm/DisplayContent;->updateRotationUnchecked()Z
+PLcom/android/server/wm/DisplayContent;->updateRotationUnchecked(Z)Z
+PLcom/android/server/wm/DisplayContent;->updateStackBoundsAfterConfigChange(Ljava/util/List;)V
+PLcom/android/server/wm/DisplayContent;->updateSystemUiVisibility(II)V
+PLcom/android/server/wm/DisplayContent;->updateWallpaperForAnimator(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/DisplayContent;->updateWindowsForAnimator(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/DisplayContent;->waitForAllWindowsDrawn()V
+PLcom/android/server/wm/DisplayFrames;-><init>(ILandroid/view/DisplayInfo;Lcom/android/server/wm/utils/WmDisplayCutout;)V
+PLcom/android/server/wm/DisplayFrames;->getInputMethodWindowVisibleHeight()I
+PLcom/android/server/wm/DisplayFrames;->onBeginLayout()V
+PLcom/android/server/wm/DisplayFrames;->onDisplayInfoUpdated(Landroid/view/DisplayInfo;Lcom/android/server/wm/utils/WmDisplayCutout;)V
+PLcom/android/server/wm/DisplaySettings;-><init>()V
+PLcom/android/server/wm/DisplaySettings;->getOverscanLocked(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/DisplaySettings;->readSettingsLocked()V
+PLcom/android/server/wm/DisplayWindowController;-><init>(Landroid/view/Display;Lcom/android/server/wm/WindowContainerListener;)V
+PLcom/android/server/wm/DisplayWindowController;->continueUpdateImeTarget()V
+PLcom/android/server/wm/DisplayWindowController;->deferUpdateImeTarget()V
+PLcom/android/server/wm/DisplayWindowController;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/DisplayWindowController;->positionChildAt(Lcom/android/server/wm/StackWindowController;I)V
+PLcom/android/server/wm/DockedStackDividerController;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/DockedStackDividerController;->animate(J)Z
+PLcom/android/server/wm/DockedStackDividerController;->checkMinimizeChanged(Z)V
+PLcom/android/server/wm/DockedStackDividerController;->getContentWidth()I
+PLcom/android/server/wm/DockedStackDividerController;->getImeHeightAdjustedFor()I
+PLcom/android/server/wm/DockedStackDividerController;->initSnapAlgorithmForRotations()V
+PLcom/android/server/wm/DockedStackDividerController;->isHomeStackResizable()Z
+PLcom/android/server/wm/DockedStackDividerController;->isImeHideRequested()Z
+PLcom/android/server/wm/DockedStackDividerController;->isMinimizedDock()Z
+PLcom/android/server/wm/DockedStackDividerController;->loadDimens()V
+PLcom/android/server/wm/DockedStackDividerController;->notifyAdjustedForImeChanged(ZJ)V
+PLcom/android/server/wm/DockedStackDividerController;->notifyAppTransitionStarting(Landroid/util/ArraySet;I)V
+PLcom/android/server/wm/DockedStackDividerController;->notifyAppVisibilityChanged()V
+PLcom/android/server/wm/DockedStackDividerController;->notifyDockedDividerVisibilityChanged(Z)V
+PLcom/android/server/wm/DockedStackDividerController;->notifyDockedStackExistsChanged(Z)V
+PLcom/android/server/wm/DockedStackDividerController;->notifyDockedStackMinimizedChanged(ZZZ)V
+PLcom/android/server/wm/DockedStackDividerController;->onConfigurationChanged()V
+PLcom/android/server/wm/DockedStackDividerController;->positionDockedStackedDivider(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/DockedStackDividerController;->reevaluateVisibility(Z)V
+PLcom/android/server/wm/DockedStackDividerController;->registerDockedStackListener(Landroid/view/IDockedStackListener;)V
+PLcom/android/server/wm/DockedStackDividerController;->resetImeHideRequested()V
+PLcom/android/server/wm/DockedStackDividerController;->setAdjustedForIme(ZZZLcom/android/server/wm/WindowState;I)V
+PLcom/android/server/wm/DockedStackDividerController;->setMinimizedDockedStack(ZZ)V
+PLcom/android/server/wm/DockedStackDividerController;->setTouchRegion(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/DockedStackDividerController;->setWindow(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/DockedStackDividerController;->wasVisible()Z
+PLcom/android/server/wm/DragDropController$1;-><init>(Lcom/android/server/wm/DragDropController;)V
+PLcom/android/server/wm/DragDropController$DragHandler;-><init>(Lcom/android/server/wm/DragDropController;Lcom/android/server/wm/WindowManagerService;Landroid/os/Looper;)V
+PLcom/android/server/wm/DragDropController;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/Looper;)V
+PLcom/android/server/wm/InputConsumerImpl;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;Ljava/lang/String;Landroid/view/InputChannel;ILandroid/os/UserHandle;)V
+PLcom/android/server/wm/InputConsumerImpl;->getLayerLw(I)I
+PLcom/android/server/wm/InputConsumerImpl;->layout(II)V
+PLcom/android/server/wm/InputConsumerImpl;->linkToDeathRecipient()V
+PLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;-><init>(Lcom/android/server/wm/InputMonitor;)V
+PLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;-><init>(Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor$1;)V
+PLcom/android/server/wm/InputMonitor;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/InputMonitor;->access$700(Lcom/android/server/wm/InputMonitor;)Z
+PLcom/android/server/wm/InputMonitor;->addInputConsumer(Ljava/lang/String;Lcom/android/server/wm/InputConsumerImpl;)V
+PLcom/android/server/wm/InputMonitor;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/InputChannel;ILandroid/os/UserHandle;)V
+PLcom/android/server/wm/InputMonitor;->destroyInputConsumer(Ljava/lang/String;)Z
+PLcom/android/server/wm/InputMonitor;->dispatchUnhandledKey(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;
+PLcom/android/server/wm/InputMonitor;->disposeInputConsumer(Lcom/android/server/wm/InputConsumerImpl;)Z
+PLcom/android/server/wm/InputMonitor;->freezeInputDispatchingLw()V
+PLcom/android/server/wm/InputMonitor;->interceptKeyBeforeDispatching(Lcom/android/server/input/InputWindowHandle;Landroid/view/KeyEvent;I)J
+PLcom/android/server/wm/InputMonitor;->interceptKeyBeforeQueueing(Landroid/view/KeyEvent;I)I
+PLcom/android/server/wm/InputMonitor;->notifyConfigurationChanged()V
+PLcom/android/server/wm/InputMonitor;->pauseDispatchingLw(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/InputMonitor;->resumeDispatchingLw(Lcom/android/server/wm/WindowToken;)V
+PLcom/android/server/wm/InputMonitor;->setEventDispatchingLw(Z)V
+PLcom/android/server/wm/InputMonitor;->setFocusedAppLw(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/InputMonitor;->setInputFocusLw(Lcom/android/server/wm/WindowState;Z)V
+PLcom/android/server/wm/InputMonitor;->setUpdateInputWindowsNeededLw()V
+PLcom/android/server/wm/InputMonitor;->thawInputDispatchingLw()V
+PLcom/android/server/wm/InputMonitor;->updateInputDispatchModeLw()V
+PLcom/android/server/wm/InputMonitor;->waitForInputDevicesReady(J)Z
+PLcom/android/server/wm/KeyguardDisableHandler$KeyguardTokenWatcher;-><init>(Lcom/android/server/wm/KeyguardDisableHandler;Landroid/os/Handler;)V
+PLcom/android/server/wm/KeyguardDisableHandler;-><init>(Landroid/content/Context;Lcom/android/server/policy/WindowManagerPolicy;)V
+PLcom/android/server/wm/KeyguardDisableHandler;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;->canSkipFirstFrame()Z
+PLcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;->needsEarlyWakeup()Z
+PLcom/android/server/wm/LocalAnimationAdapter;-><init>(Lcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;Lcom/android/server/wm/SurfaceAnimationRunner;)V
+PLcom/android/server/wm/LocalAnimationAdapter;->getBackgroundColor()I
+PLcom/android/server/wm/LocalAnimationAdapter;->getDetachWallpaper()Z
+PLcom/android/server/wm/LocalAnimationAdapter;->getDurationHint()J
+PLcom/android/server/wm/LocalAnimationAdapter;->getShowWallpaper()Z
+PLcom/android/server/wm/LocalAnimationAdapter;->getStatusBarTransitionsStartTime()J
+PLcom/android/server/wm/LocalAnimationAdapter;->lambda$startAnimation$0(Lcom/android/server/wm/LocalAnimationAdapter;Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
+PLcom/android/server/wm/LocalAnimationAdapter;->onAnimationCancelled(Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/LocalAnimationAdapter;->startAnimation(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;-><init>(Lcom/android/server/wm/PinnedStackController;)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;-><init>(Lcom/android/server/wm/PinnedStackController;Lcom/android/server/wm/PinnedStackController$1;)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;->lambda$setMinEdgeSize$1(Lcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;I)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackControllerCallback;->setMinEdgeSize(I)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackListenerDeathHandler;-><init>(Lcom/android/server/wm/PinnedStackController;)V
+PLcom/android/server/wm/PinnedStackController$PinnedStackListenerDeathHandler;-><init>(Lcom/android/server/wm/PinnedStackController;Lcom/android/server/wm/PinnedStackController$1;)V
+PLcom/android/server/wm/PinnedStackController;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/PinnedStackController;->access$200(Lcom/android/server/wm/PinnedStackController;)Landroid/os/Handler;
+PLcom/android/server/wm/PinnedStackController;->access$502(Lcom/android/server/wm/PinnedStackController;I)I
+PLcom/android/server/wm/PinnedStackController;->access$600(Lcom/android/server/wm/PinnedStackController;)I
+PLcom/android/server/wm/PinnedStackController;->dpToPx(FLandroid/util/DisplayMetrics;)I
+PLcom/android/server/wm/PinnedStackController;->getDefaultBounds(F)Landroid/graphics/Rect;
+PLcom/android/server/wm/PinnedStackController;->getInsetBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/PinnedStackController;->getMovementBounds(Landroid/graphics/Rect;)Landroid/graphics/Rect;
+PLcom/android/server/wm/PinnedStackController;->getMovementBounds(Landroid/graphics/Rect;ZZ)Landroid/graphics/Rect;
+PLcom/android/server/wm/PinnedStackController;->isValidPictureInPictureAspectRatio(F)Z
+PLcom/android/server/wm/PinnedStackController;->notifyActionsChanged(Ljava/util/List;)V
+PLcom/android/server/wm/PinnedStackController;->notifyImeVisibilityChanged(ZI)V
+PLcom/android/server/wm/PinnedStackController;->notifyMinimizeChanged(Z)V
+PLcom/android/server/wm/PinnedStackController;->notifyMovementBoundsChanged(ZZ)V
+PLcom/android/server/wm/PinnedStackController;->notifyShelfVisibilityChanged(ZI)V
+PLcom/android/server/wm/PinnedStackController;->onConfigurationChanged()V
+PLcom/android/server/wm/PinnedStackController;->onDisplayInfoChanged()V
+PLcom/android/server/wm/PinnedStackController;->registerPinnedStackListener(Landroid/view/IPinnedStackListener;)V
+PLcom/android/server/wm/PinnedStackController;->reloadResources()V
+PLcom/android/server/wm/PinnedStackController;->resetReentrySnapFraction(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/PinnedStackController;->setAdjustedForIme(ZI)V
+PLcom/android/server/wm/PinnedStackController;->setAdjustedForShelf(ZI)V
+PLcom/android/server/wm/PinnedStackController;->transformBoundsToAspectRatio(Landroid/graphics/Rect;FZ)Landroid/graphics/Rect;
+PLcom/android/server/wm/PointerEventDispatcher;-><init>(Landroid/view/InputChannel;)V
+PLcom/android/server/wm/PointerEventDispatcher;->registerInputEventListener(Landroid/view/WindowManagerPolicyConstants$PointerEventListener;)V
+PLcom/android/server/wm/RemoteAnimationController$FinishedCallback;-><init>(Lcom/android/server/wm/RemoteAnimationController;)V
+PLcom/android/server/wm/RemoteAnimationController$FinishedCallback;->onAnimationFinished()V
+PLcom/android/server/wm/RemoteAnimationController$FinishedCallback;->release()V
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;-><init>(Lcom/android/server/wm/RemoteAnimationController;Lcom/android/server/wm/AppWindowToken;Landroid/graphics/Point;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->access$000(Lcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;)Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->createRemoteAppAnimation()Landroid/view/RemoteAnimationTarget;
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getBackgroundColor()I
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getDetachWallpaper()Z
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getDurationHint()J
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getMode()I
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getShowWallpaper()Z
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->getStatusBarTransitionsStartTime()J
+PLcom/android/server/wm/RemoteAnimationController$RemoteAnimationAdapterWrapper;->startAnimation(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;)V
+PLcom/android/server/wm/RemoteAnimationController;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/RemoteAnimationAdapter;Landroid/os/Handler;)V
+PLcom/android/server/wm/RemoteAnimationController;->access$100(Lcom/android/server/wm/RemoteAnimationController;)V
+PLcom/android/server/wm/RemoteAnimationController;->access$1000(Lcom/android/server/wm/RemoteAnimationController;)Landroid/view/RemoteAnimationAdapter;
+PLcom/android/server/wm/RemoteAnimationController;->access$200(Lcom/android/server/wm/RemoteAnimationController;)Lcom/android/server/wm/WindowManagerService;
+PLcom/android/server/wm/RemoteAnimationController;->access$300(Lcom/android/server/wm/RemoteAnimationController;)Landroid/graphics/Rect;
+PLcom/android/server/wm/RemoteAnimationController;->createAnimationAdapter(Lcom/android/server/wm/AppWindowToken;Landroid/graphics/Point;Landroid/graphics/Rect;)Lcom/android/server/wm/AnimationAdapter;
+PLcom/android/server/wm/RemoteAnimationController;->createAnimations()[Landroid/view/RemoteAnimationTarget;
+PLcom/android/server/wm/RemoteAnimationController;->goodToGo()V
+PLcom/android/server/wm/RemoteAnimationController;->lambda$goodToGo$1(Lcom/android/server/wm/RemoteAnimationController;[Landroid/view/RemoteAnimationTarget;)V
+PLcom/android/server/wm/RemoteAnimationController;->linkToDeathOfRunner()V
+PLcom/android/server/wm/RemoteAnimationController;->onAnimationFinished()V
+PLcom/android/server/wm/RemoteAnimationController;->releaseFinishedCallback()V
+PLcom/android/server/wm/RemoteAnimationController;->sendRunningRemoteAnimation(Z)V
+PLcom/android/server/wm/RemoteAnimationController;->unlinkToDeathOfRunner()V
+PLcom/android/server/wm/RootWindowContainer$MyHandler;-><init>(Lcom/android/server/wm/RootWindowContainer;Landroid/os/Looper;)V
+PLcom/android/server/wm/RootWindowContainer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/RootWindowContainer;->closeSystemDialogs(Ljava/lang/String;)V
+PLcom/android/server/wm/RootWindowContainer;->computeFocusedWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/RootWindowContainer;->copyAnimToLayoutParams()Z
+PLcom/android/server/wm/RootWindowContainer;->createDisplayContent(Landroid/view/Display;Lcom/android/server/wm/DisplayWindowController;)Lcom/android/server/wm/DisplayContent;
+PLcom/android/server/wm/RootWindowContainer;->getDisplaysInFocusOrder(Landroid/util/SparseIntArray;)V
+PLcom/android/server/wm/RootWindowContainer;->getWindowTokenDisplay(Lcom/android/server/wm/WindowToken;)Lcom/android/server/wm/DisplayContent;
+PLcom/android/server/wm/RootWindowContainer;->handleResizingWindows()Landroid/util/ArraySet;
+PLcom/android/server/wm/RootWindowContainer;->lambda$new$0(Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/RootWindowContainer;->lambda$setSecureSurfaceState$3(IZLcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/RootWindowContainer;->lambda$static$1(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/RootWindowContainer;->lambda$updateAppOpsState$5(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/RootWindowContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/RootWindowContainer;->prepareFreezingTaskBounds()V
+PLcom/android/server/wm/RootWindowContainer;->removeReplacedWindows()V
+PLcom/android/server/wm/RootWindowContainer;->setDisplayOverrideConfigurationIfNeeded(Landroid/content/res/Configuration;I)[I
+PLcom/android/server/wm/RootWindowContainer;->setGlobalConfigurationIfNeeded(Landroid/content/res/Configuration;Ljava/util/List;)V
+PLcom/android/server/wm/RootWindowContainer;->setSecureSurfaceState(IZ)V
+PLcom/android/server/wm/RootWindowContainer;->updateAppOpsState()V
+PLcom/android/server/wm/RootWindowContainer;->updateStackBoundsAfterConfigChange(Ljava/util/List;)V
+PLcom/android/server/wm/ScreenRotationAnimation;-><init>(Landroid/content/Context;Lcom/android/server/wm/DisplayContent;ZZLcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/ScreenRotationAnimation;->createRotationMatrix(IIILandroid/graphics/Matrix;)V
+PLcom/android/server/wm/ScreenRotationAnimation;->dismiss(Landroid/view/SurfaceControl$Transaction;JFIIII)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->getEnterTransformation()Landroid/view/animation/Transformation;
+PLcom/android/server/wm/ScreenRotationAnimation;->hasAnimations()Z
+PLcom/android/server/wm/ScreenRotationAnimation;->hasScreenshot()Z
+PLcom/android/server/wm/ScreenRotationAnimation;->isAnimating()Z
+PLcom/android/server/wm/ScreenRotationAnimation;->isRotating()Z
+PLcom/android/server/wm/ScreenRotationAnimation;->kill()V
+PLcom/android/server/wm/ScreenRotationAnimation;->setRotation(Landroid/view/SurfaceControl$Transaction;I)V
+PLcom/android/server/wm/ScreenRotationAnimation;->setRotation(Landroid/view/SurfaceControl$Transaction;IJFII)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->setSnapshotTransform(Landroid/view/SurfaceControl$Transaction;Landroid/graphics/Matrix;F)V
+PLcom/android/server/wm/ScreenRotationAnimation;->startAnimation(Landroid/view/SurfaceControl$Transaction;JFIIZII)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->stepAnimation(J)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->stepAnimationLocked(J)Z
+PLcom/android/server/wm/ScreenRotationAnimation;->updateSurfaces(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/Session;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IWindowSessionCallback;Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;)V
+PLcom/android/server/wm/Session;->addToDisplay(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/InputChannel;)I
+PLcom/android/server/wm/Session;->binderDied()V
+PLcom/android/server/wm/Session;->cancelAlertWindowNotification()V
+PLcom/android/server/wm/Session;->finishDrawing(Landroid/view/IWindow;)V
+PLcom/android/server/wm/Session;->getDisplayFrame(Landroid/view/IWindow;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/Session;->getInTouchMode()Z
+PLcom/android/server/wm/Session;->getWindowId(Landroid/os/IBinder;)Landroid/view/IWindowId;
+PLcom/android/server/wm/Session;->killSessionLocked()V
+PLcom/android/server/wm/Session;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/Session;->onWindowSurfaceVisibilityChanged(Lcom/android/server/wm/WindowSurfaceController;ZI)V
+PLcom/android/server/wm/Session;->performHapticFeedback(Landroid/view/IWindow;IZ)Z
+PLcom/android/server/wm/Session;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+PLcom/android/server/wm/Session;->remove(Landroid/view/IWindow;)V
+PLcom/android/server/wm/Session;->sendWallpaperCommand(Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;
+PLcom/android/server/wm/Session;->setHasOverlayUi(Z)V
+PLcom/android/server/wm/Session;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
+PLcom/android/server/wm/Session;->setTransparentRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
+PLcom/android/server/wm/Session;->setWallpaperPosition(Landroid/os/IBinder;FFFF)V
+PLcom/android/server/wm/Session;->updatePointerIcon(Landroid/view/IWindow;)V
+PLcom/android/server/wm/Session;->windowAddedLocked(Ljava/lang/String;)V
+PLcom/android/server/wm/Session;->windowRemovedLocked()V
+PLcom/android/server/wm/SnapshotStartingData;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/SnapshotStartingData;->createStartingSurface(Lcom/android/server/wm/AppWindowToken;)Lcom/android/server/policy/WindowManagerPolicy$StartingSurface;
+PLcom/android/server/wm/SplashScreenStartingData;-><init>(Lcom/android/server/wm/WindowManagerService;Ljava/lang/String;ILandroid/content/res/CompatibilityInfo;Ljava/lang/CharSequence;IIIILandroid/content/res/Configuration;)V
+PLcom/android/server/wm/SplashScreenStartingData;->createStartingSurface(Lcom/android/server/wm/AppWindowToken;)Lcom/android/server/policy/WindowManagerPolicy$StartingSurface;
+PLcom/android/server/wm/StackWindowController$H;-><init>(Ljava/lang/ref/WeakReference;Landroid/os/Looper;)V
+PLcom/android/server/wm/StackWindowController;-><init>(ILcom/android/server/wm/StackWindowListener;IZLandroid/graphics/Rect;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/StackWindowController;->getBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/StackWindowController;->getRawBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/StackWindowController;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/StackWindowController;->positionChildAtBottom(Lcom/android/server/wm/TaskWindowContainerController;Z)V
+PLcom/android/server/wm/StackWindowController;->positionChildAtTop(Lcom/android/server/wm/TaskWindowContainerController;Z)V
+PLcom/android/server/wm/StackWindowController;->removeContainer()V
+PLcom/android/server/wm/StartingData;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/SurfaceAnimationRunner$1;-><init>(Lcom/android/server/wm/SurfaceAnimationRunner;Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;)V
+PLcom/android/server/wm/SurfaceAnimationRunner$1;->onAnimationEnd(Landroid/animation/Animator;)V
+PLcom/android/server/wm/SurfaceAnimationRunner$1;->onAnimationStart(Landroid/animation/Animator;)V
+PLcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;-><init>(Lcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;Landroid/view/SurfaceControl;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/SurfaceAnimationRunner$SfValueAnimator;-><init>(Lcom/android/server/wm/SurfaceAnimationRunner;)V
+PLcom/android/server/wm/SurfaceAnimationRunner$SfValueAnimator;->getAnimationHandler()Landroid/animation/AnimationHandler;
+PLcom/android/server/wm/SurfaceAnimationRunner;-><init>()V
+PLcom/android/server/wm/SurfaceAnimationRunner;-><init>(Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider;Lcom/android/server/wm/SurfaceAnimationRunner$AnimatorFactory;Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/SurfaceAnimationRunner;->access$100(Lcom/android/server/wm/SurfaceAnimationRunner;)Ljava/lang/Object;
+PLcom/android/server/wm/SurfaceAnimationRunner;->access$200(Lcom/android/server/wm/SurfaceAnimationRunner;)Landroid/view/SurfaceControl$Transaction;
+PLcom/android/server/wm/SurfaceAnimationRunner;->access$300(Lcom/android/server/wm/SurfaceAnimationRunner;)Ljava/lang/Object;
+PLcom/android/server/wm/SurfaceAnimationRunner;->access$400(Lcom/android/server/wm/SurfaceAnimationRunner;)Landroid/animation/AnimationHandler;
+PLcom/android/server/wm/SurfaceAnimationRunner;->applyTransaction()V
+PLcom/android/server/wm/SurfaceAnimationRunner;->continueStartingAnimations()V
+PLcom/android/server/wm/SurfaceAnimationRunner;->deferStartingAnimations()V
+PLcom/android/server/wm/SurfaceAnimationRunner;->lambda$9Wa9MhcrSX12liOouHtYXEkDU60(Lcom/android/server/wm/SurfaceAnimationRunner;J)V
+PLcom/android/server/wm/SurfaceAnimationRunner;->lambda$lSzwjoKEGADoEFOzdEnwriAk0T4(Lcom/android/server/wm/SurfaceAnimationRunner;)V
+PLcom/android/server/wm/SurfaceAnimationRunner;->lambda$new$0(Lcom/android/server/wm/SurfaceAnimationRunner;)V
+PLcom/android/server/wm/SurfaceAnimationRunner;->lambda$new$1(Lcom/android/server/wm/SurfaceAnimationRunner;)Landroid/animation/ValueAnimator;
+PLcom/android/server/wm/SurfaceAnimationRunner;->onAnimationCancelled(Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/SurfaceAnimationRunner;->startAnimation(Lcom/android/server/wm/LocalAnimationAdapter$AnimationSpec;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/SurfaceAnimationRunner;->startAnimationLocked(Lcom/android/server/wm/SurfaceAnimationRunner$RunningAnimation;)V
+PLcom/android/server/wm/SurfaceAnimationRunner;->startAnimations(J)V
+PLcom/android/server/wm/SurfaceAnimationRunner;->startPendingAnimationsLocked()V
+PLcom/android/server/wm/SurfaceAnimationThread;-><init>()V
+PLcom/android/server/wm/SurfaceAnimationThread;->ensureThreadLocked()V
+PLcom/android/server/wm/SurfaceAnimationThread;->get()Lcom/android/server/wm/SurfaceAnimationThread;
+PLcom/android/server/wm/SurfaceAnimationThread;->getHandler()Landroid/os/Handler;
+PLcom/android/server/wm/SurfaceAnimator$Animatable;->shouldDeferAnimationFinish(Ljava/lang/Runnable;)Z
+PLcom/android/server/wm/SurfaceAnimator;-><init>(Lcom/android/server/wm/SurfaceAnimator$Animatable;Ljava/lang/Runnable;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/SurfaceAnimator;->cancelAnimation()V
+PLcom/android/server/wm/SurfaceAnimator;->cancelAnimation(Landroid/view/SurfaceControl$Transaction;ZZ)V
+PLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIZ)Landroid/view/SurfaceControl;
+PLcom/android/server/wm/SurfaceAnimator;->endDelayingAnimationStart()V
+PLcom/android/server/wm/SurfaceAnimator;->getFinishedCallback(Ljava/lang/Runnable;)Lcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;
+PLcom/android/server/wm/SurfaceAnimator;->isAnimationStartDelayed()Z
+PLcom/android/server/wm/SurfaceAnimator;->lambda$getFinishedCallback$0(Lcom/android/server/wm/SurfaceAnimator;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/SurfaceAnimator;->lambda$getFinishedCallback$1(Lcom/android/server/wm/SurfaceAnimator;Ljava/lang/Runnable;Lcom/android/server/wm/AnimationAdapter;)V
+PLcom/android/server/wm/SurfaceAnimator;->reparent(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/SurfaceAnimator;->reset(Landroid/view/SurfaceControl$Transaction;Z)V
+PLcom/android/server/wm/SurfaceAnimator;->setLayer(Landroid/view/SurfaceControl$Transaction;I)V
+PLcom/android/server/wm/SurfaceAnimator;->setRelativeLayer(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;I)V
+PLcom/android/server/wm/SurfaceAnimator;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;Z)V
+PLcom/android/server/wm/SurfaceAnimator;->transferAnimation(Lcom/android/server/wm/SurfaceAnimator;)V
+PLcom/android/server/wm/Task;-><init>(ILcom/android/server/wm/TaskStack;ILcom/android/server/wm/WindowManagerService;IZLandroid/app/ActivityManager$TaskDescription;Lcom/android/server/wm/TaskWindowContainerController;)V
+PLcom/android/server/wm/Task;->addChild(Lcom/android/server/wm/AppWindowToken;I)V
+PLcom/android/server/wm/Task;->fillsParent()Z
+PLcom/android/server/wm/Task;->forAllTasks(Ljava/util/function/Consumer;)V
+PLcom/android/server/wm/Task;->forceWindowsScaleable(Z)V
+PLcom/android/server/wm/Task;->getAdjustedAddPosition(I)I
+PLcom/android/server/wm/Task;->getBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/Task;->getController()Lcom/android/server/wm/TaskWindowContainerController;
+PLcom/android/server/wm/Task;->getName()Ljava/lang/String;
+PLcom/android/server/wm/Task;->getTaskDescription()Landroid/app/ActivityManager$TaskDescription;
+PLcom/android/server/wm/Task;->getTopFullscreenAppToken()Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/Task;->hasWindowsAlive()Z
+PLcom/android/server/wm/Task;->isDragResizing()Z
+PLcom/android/server/wm/Task;->isFloating()Z
+PLcom/android/server/wm/Task;->onParentSet()V
+PLcom/android/server/wm/Task;->positionChildAt(ILcom/android/server/wm/AppWindowToken;Z)V
+PLcom/android/server/wm/Task;->prepareFreezingBounds()V
+PLcom/android/server/wm/Task;->removeChild(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/Task;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/Task;->removeIfPossible()V
+PLcom/android/server/wm/Task;->removeImmediately()V
+PLcom/android/server/wm/Task;->setBounds(Landroid/graphics/Rect;)I
+PLcom/android/server/wm/Task;->setSendingToBottom(Z)V
+PLcom/android/server/wm/Task;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/wm/Task;->shouldDeferRemoval()Z
+PLcom/android/server/wm/Task;->showForAllUsers()Z
+PLcom/android/server/wm/Task;->toShortString()Ljava/lang/String;
+PLcom/android/server/wm/Task;->updateDisplayInfo(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/TaskPositioningController;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/input/InputManagerService;Lcom/android/server/wm/InputMonitor;Landroid/app/IActivityManager;Landroid/os/Looper;)V
+PLcom/android/server/wm/TaskSnapshotCache$CacheEntry;-><init>(Landroid/app/ActivityManager$TaskSnapshot;Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/TaskSnapshotCache;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/TaskSnapshotLoader;)V
+PLcom/android/server/wm/TaskSnapshotCache;->getSnapshot(IIZZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotCache;->onAppDied(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/TaskSnapshotCache;->onAppRemoved(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/TaskSnapshotCache;->onTaskRemoved(I)V
+PLcom/android/server/wm/TaskSnapshotCache;->putSnapshot(Lcom/android/server/wm/Task;Landroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/TaskSnapshotCache;->removeRunningEntry(I)V
+PLcom/android/server/wm/TaskSnapshotCache;->tryRestoreFromDisk(IIZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotController;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/TaskSnapshotController;->createStartingSurface(Lcom/android/server/wm/AppWindowToken;Landroid/app/ActivityManager$TaskSnapshot;)Lcom/android/server/policy/WindowManagerPolicy$StartingSurface;
+PLcom/android/server/wm/TaskSnapshotController;->getClosingTasks(Landroid/util/ArraySet;Landroid/util/ArraySet;)V
+PLcom/android/server/wm/TaskSnapshotController;->getInsets(Lcom/android/server/wm/WindowState;)Landroid/graphics/Rect;
+PLcom/android/server/wm/TaskSnapshotController;->getSnapshot(IIZZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotController;->getSnapshotMode(Lcom/android/server/wm/Task;)I
+PLcom/android/server/wm/TaskSnapshotController;->getSystemUiVisibility(Lcom/android/server/wm/Task;)I
+PLcom/android/server/wm/TaskSnapshotController;->handleClosingApps(Landroid/util/ArraySet;)V
+PLcom/android/server/wm/TaskSnapshotController;->lambda$OPdXuZQLetMnocdH6XV32JbNQ3I(I)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotController;->lambda$screenTurningOff$1(Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskSnapshotController;->lambda$screenTurningOff$2(Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/policy/WindowManagerPolicy$ScreenOffListener;)V
+PLcom/android/server/wm/TaskSnapshotController;->lambda$snapshotTask$0(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/TaskSnapshotController;->minRect(Landroid/graphics/Rect;Landroid/graphics/Rect;)Landroid/graphics/Rect;
+PLcom/android/server/wm/TaskSnapshotController;->notifyAppVisibilityChanged(Lcom/android/server/wm/AppWindowToken;Z)V
+PLcom/android/server/wm/TaskSnapshotController;->notifyTaskRemovedFromRecents(II)V
+PLcom/android/server/wm/TaskSnapshotController;->onAppDied(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/TaskSnapshotController;->onAppRemoved(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/TaskSnapshotController;->onTransitionStarting()V
+PLcom/android/server/wm/TaskSnapshotController;->removeObsoleteTaskFiles(Landroid/util/ArraySet;[I)V
+PLcom/android/server/wm/TaskSnapshotController;->screenTurningOff(Lcom/android/server/policy/WindowManagerPolicy$ScreenOffListener;)V
+PLcom/android/server/wm/TaskSnapshotController;->setPersisterPaused(Z)V
+PLcom/android/server/wm/TaskSnapshotController;->shouldDisableSnapshots()Z
+PLcom/android/server/wm/TaskSnapshotController;->snapshotTask(Lcom/android/server/wm/Task;)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotController;->snapshotTasks(Landroid/util/ArraySet;)V
+PLcom/android/server/wm/TaskSnapshotController;->systemReady()V
+PLcom/android/server/wm/TaskSnapshotLoader;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;)V
+PLcom/android/server/wm/TaskSnapshotLoader;->loadTask(IIZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/TaskSnapshotPersister$1;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;Ljava/lang/String;)V
+PLcom/android/server/wm/TaskSnapshotPersister$1;->run()V
+PLcom/android/server/wm/TaskSnapshotPersister$DeleteWriteQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;II)V
+PLcom/android/server/wm/TaskSnapshotPersister$DeleteWriteQueueItem;->write()V
+PLcom/android/server/wm/TaskSnapshotPersister$RemoveObsoleteFilesQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;Landroid/util/ArraySet;[I)V
+PLcom/android/server/wm/TaskSnapshotPersister$RemoveObsoleteFilesQueueItem;->getTaskId(Ljava/lang/String;)I
+PLcom/android/server/wm/TaskSnapshotPersister$RemoveObsoleteFilesQueueItem;->write()V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;IILandroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->onDequeuedLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->onQueuedLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->write()V
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->writeBuffer()Z
+PLcom/android/server/wm/TaskSnapshotPersister$StoreWriteQueueItem;->writeProto()Z
+PLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;)V
+PLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;-><init>(Lcom/android/server/wm/TaskSnapshotPersister;Lcom/android/server/wm/TaskSnapshotPersister$1;)V
+PLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;->onDequeuedLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;->onQueuedLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister;-><init>(Lcom/android/server/wm/TaskSnapshotPersister$DirectoryResolver;)V
+PLcom/android/server/wm/TaskSnapshotPersister;->access$100(Lcom/android/server/wm/TaskSnapshotPersister;)Ljava/lang/Object;
+PLcom/android/server/wm/TaskSnapshotPersister;->access$1000(Lcom/android/server/wm/TaskSnapshotPersister;)Landroid/util/ArraySet;
+PLcom/android/server/wm/TaskSnapshotPersister;->access$200(Lcom/android/server/wm/TaskSnapshotPersister;)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->access$300(Lcom/android/server/wm/TaskSnapshotPersister;)Ljava/util/ArrayDeque;
+PLcom/android/server/wm/TaskSnapshotPersister;->access$402(Lcom/android/server/wm/TaskSnapshotPersister;Z)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->access$600(Lcom/android/server/wm/TaskSnapshotPersister;)Ljava/util/ArrayDeque;
+PLcom/android/server/wm/TaskSnapshotPersister;->access$700(Lcom/android/server/wm/TaskSnapshotPersister;I)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->access$800(Lcom/android/server/wm/TaskSnapshotPersister;I)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->access$900(Lcom/android/server/wm/TaskSnapshotPersister;II)V
+PLcom/android/server/wm/TaskSnapshotPersister;->createDirectory(I)Z
+PLcom/android/server/wm/TaskSnapshotPersister;->deleteSnapshot(II)V
+PLcom/android/server/wm/TaskSnapshotPersister;->ensureStoreQueueDepthLocked()V
+PLcom/android/server/wm/TaskSnapshotPersister;->getBitmapFile(II)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->getDirectory(I)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->getProtoFile(II)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->getReducedResolutionBitmapFile(II)Ljava/io/File;
+PLcom/android/server/wm/TaskSnapshotPersister;->onTaskRemovedFromRecents(II)V
+PLcom/android/server/wm/TaskSnapshotPersister;->persistSnapshot(IILandroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/TaskSnapshotPersister;->removeObsoleteFiles(Landroid/util/ArraySet;[I)V
+PLcom/android/server/wm/TaskSnapshotPersister;->sendToQueueLocked(Lcom/android/server/wm/TaskSnapshotPersister$WriteQueueItem;)V
+PLcom/android/server/wm/TaskSnapshotPersister;->setPaused(Z)V
+PLcom/android/server/wm/TaskSnapshotPersister;->start()V
+PLcom/android/server/wm/TaskSnapshotSurface$1;-><init>(Landroid/os/Looper;)V
+PLcom/android/server/wm/TaskSnapshotSurface$1;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;-><init>(IIIII)V
+PLcom/android/server/wm/TaskSnapshotSurface$SystemBarBackgroundPainter;->setInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskSnapshotSurface$Window;-><init>()V
+PLcom/android/server/wm/TaskSnapshotSurface$Window;->resized(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZLandroid/util/MergedConfiguration;Landroid/graphics/Rect;ZZILandroid/view/DisplayCutout$ParcelableWrapper;)V
+PLcom/android/server/wm/TaskSnapshotSurface$Window;->setOuter(Lcom/android/server/wm/TaskSnapshotSurface;)V
+PLcom/android/server/wm/TaskSnapshotSurface;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/TaskSnapshotSurface$Window;Landroid/view/Surface;Landroid/app/ActivityManager$TaskSnapshot;Ljava/lang/CharSequence;IIIIIILandroid/graphics/Rect;I)V
+PLcom/android/server/wm/TaskSnapshotSurface;->access$000(Lcom/android/server/wm/TaskSnapshotSurface;)Lcom/android/server/wm/WindowManagerService;
+PLcom/android/server/wm/TaskSnapshotSurface;->access$100(Lcom/android/server/wm/TaskSnapshotSurface;)Z
+PLcom/android/server/wm/TaskSnapshotSurface;->access$200(Lcom/android/server/wm/TaskSnapshotSurface;)V
+PLcom/android/server/wm/TaskSnapshotSurface;->access$300(Lcom/android/server/wm/TaskSnapshotSurface;)I
+PLcom/android/server/wm/TaskSnapshotSurface;->access$400()Landroid/os/Handler;
+PLcom/android/server/wm/TaskSnapshotSurface;->create(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/AppWindowToken;Landroid/app/ActivityManager$TaskSnapshot;)Lcom/android/server/wm/TaskSnapshotSurface;
+PLcom/android/server/wm/TaskSnapshotSurface;->drawSizeMatchSnapshot(Landroid/graphics/GraphicBuffer;)V
+PLcom/android/server/wm/TaskSnapshotSurface;->drawSnapshot()V
+PLcom/android/server/wm/TaskSnapshotSurface;->remove()V
+PLcom/android/server/wm/TaskSnapshotSurface;->reportDrawn()V
+PLcom/android/server/wm/TaskSnapshotSurface;->setFrames(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskStack;-><init>(Lcom/android/server/wm/WindowManagerService;ILcom/android/server/wm/StackWindowController;)V
+PLcom/android/server/wm/TaskStack;->addTask(Lcom/android/server/wm/Task;IZZ)V
+PLcom/android/server/wm/TaskStack;->calculateBoundsForWindowModeChange()Landroid/graphics/Rect;
+PLcom/android/server/wm/TaskStack;->computeMinPosition(II)I
+PLcom/android/server/wm/TaskStack;->findHomeTask()Lcom/android/server/wm/Task;
+PLcom/android/server/wm/TaskStack;->findPositionForTask(Lcom/android/server/wm/Task;IZZ)I
+PLcom/android/server/wm/TaskStack;->getAnimatingAppWindowTokenRegistry()Lcom/android/server/wm/AnimatingAppWindowTokenRegistry;
+PLcom/android/server/wm/TaskStack;->getDisplayInfo()Landroid/view/DisplayInfo;
+PLcom/android/server/wm/TaskStack;->getName()Ljava/lang/String;
+PLcom/android/server/wm/TaskStack;->getRawBounds()Landroid/graphics/Rect;
+PLcom/android/server/wm/TaskStack;->getRawBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskStack;->getRelativePosition(Landroid/graphics/Point;)V
+PLcom/android/server/wm/TaskStack;->getSurfaceControl()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/TaskStack;->isAdjustedForIme()Z
+PLcom/android/server/wm/TaskStack;->isAnimatingBounds()Z
+PLcom/android/server/wm/TaskStack;->isAnimatingForIme()Z
+PLcom/android/server/wm/TaskStack;->isMinimizedDockAndHomeStackResizable()Z
+PLcom/android/server/wm/TaskStack;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/TaskStack;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/TaskStack;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/TaskStack;->onParentSet()V
+PLcom/android/server/wm/TaskStack;->positionChildAt(ILcom/android/server/wm/Task;Z)V
+PLcom/android/server/wm/TaskStack;->positionChildAt(ILcom/android/server/wm/Task;ZZ)V
+PLcom/android/server/wm/TaskStack;->prepareFreezingTaskBounds()V
+PLcom/android/server/wm/TaskStack;->removeChild(Lcom/android/server/wm/Task;)V
+PLcom/android/server/wm/TaskStack;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/TaskStack;->removeIfPossible()V
+PLcom/android/server/wm/TaskStack;->setAdjustedBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskStack;->setBounds(Landroid/graphics/Rect;)I
+PLcom/android/server/wm/TaskStack;->setBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;)I
+PLcom/android/server/wm/TaskStack;->toShortString()Ljava/lang/String;
+PLcom/android/server/wm/TaskStack;->updateAdjustedBounds()V
+PLcom/android/server/wm/TaskStack;->updateAnimationBackgroundBounds()V
+PLcom/android/server/wm/TaskStack;->updateBoundsAfterConfigChange()Z
+PLcom/android/server/wm/TaskStack;->updateBoundsForWindowModeChange()V
+PLcom/android/server/wm/TaskStack;->updateDisplayInfo(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskStack;->updateSurfaceBounds()V
+PLcom/android/server/wm/TaskStack;->updateSurfaceSize(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/TaskTapPointerEventListener;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/TaskTapPointerEventListener;->setTouchExcludeRegion(Landroid/graphics/Region;)V
+PLcom/android/server/wm/TaskWindowContainerController$H;-><init>(Ljava/lang/ref/WeakReference;Landroid/os/Looper;)V
+PLcom/android/server/wm/TaskWindowContainerController$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wm/TaskWindowContainerController;-><init>(ILcom/android/server/wm/TaskWindowContainerListener;Lcom/android/server/wm/StackWindowController;ILandroid/graphics/Rect;IZZZLandroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/wm/TaskWindowContainerController;-><init>(ILcom/android/server/wm/TaskWindowContainerListener;Lcom/android/server/wm/StackWindowController;ILandroid/graphics/Rect;IZZZLandroid/app/ActivityManager$TaskDescription;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/TaskWindowContainerController;->createTask(ILcom/android/server/wm/TaskStack;IIZLandroid/app/ActivityManager$TaskDescription;)Lcom/android/server/wm/Task;
+PLcom/android/server/wm/TaskWindowContainerController;->getBounds(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/TaskWindowContainerController;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/TaskWindowContainerController;->positionChildAt(Lcom/android/server/wm/AppWindowContainerController;I)V
+PLcom/android/server/wm/TaskWindowContainerController;->removeContainer()V
+PLcom/android/server/wm/TaskWindowContainerController;->reportSnapshotChanged(Landroid/app/ActivityManager$TaskSnapshot;)V
+PLcom/android/server/wm/TaskWindowContainerController;->setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->allResolved()Z
+PLcom/android/server/wm/UnknownAppVisibilityController;->appRemovedOrHidden(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->clear()V
+PLcom/android/server/wm/UnknownAppVisibilityController;->lambda$FYhcjOhYWVp6HX5hr3GGaPg67Gc(Lcom/android/server/wm/UnknownAppVisibilityController;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->notifyAppResumedFinished(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->notifyLaunched(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->notifyRelayouted(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/UnknownAppVisibilityController;->notifyVisibilitiesUpdated()V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;-><init>()V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;-><init>(Lcom/android/server/wm/WallpaperController$1;)V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->reset()V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->setTopWallpaper(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->setUseTopWallpaperAsTarget(Z)V
+PLcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;->setWallpaperTarget(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WallpaperController;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WallpaperController;->addWallpaperToken(Lcom/android/server/wm/WallpaperWindowToken;)V
+PLcom/android/server/wm/WallpaperController;->adjustWallpaperWindows(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WallpaperController;->adjustWallpaperWindowsForAppTransitionIfNeeded(Lcom/android/server/wm/DisplayContent;Landroid/util/ArraySet;)V
+PLcom/android/server/wm/WallpaperController;->clearLastWallpaperTimeoutTime()V
+PLcom/android/server/wm/WallpaperController;->findWallpaperTarget(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WallpaperController;->getWallpaperTarget()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/WallpaperController;->hideDeferredWallpapersIfNeeded()V
+PLcom/android/server/wm/WallpaperController;->isBelowWallpaperTarget(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WallpaperController;->isWallpaperTargetAnimating()Z
+PLcom/android/server/wm/WallpaperController;->isWallpaperVisible()Z
+PLcom/android/server/wm/WallpaperController;->isWallpaperVisible(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WallpaperController;->lambda$updateWallpaperWindowsTarget$1(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WallpaperController;->sendWindowWallpaperCommand(Lcom/android/server/wm/WindowState;Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;
+PLcom/android/server/wm/WallpaperController;->setWindowWallpaperPosition(Lcom/android/server/wm/WindowState;FFFF)V
+PLcom/android/server/wm/WallpaperController;->updateWallpaperOffset(Lcom/android/server/wm/WindowState;IIZ)Z
+PLcom/android/server/wm/WallpaperController;->updateWallpaperOffsetLocked(Lcom/android/server/wm/WindowState;Z)V
+PLcom/android/server/wm/WallpaperController;->updateWallpaperTokens(Z)V
+PLcom/android/server/wm/WallpaperController;->updateWallpaperVisibility()V
+PLcom/android/server/wm/WallpaperController;->updateWallpaperWindowsTarget(Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;)V
+PLcom/android/server/wm/WallpaperController;->wallpaperTransitionReady()Z
+PLcom/android/server/wm/WallpaperVisibilityListeners;-><init>()V
+PLcom/android/server/wm/WallpaperVisibilityListeners;->notifyWallpaperVisibilityChanged(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WallpaperVisibilityListeners;->registerWallpaperVisibilityListener(Landroid/view/IWallpaperVisibilityListener;I)V
+PLcom/android/server/wm/WallpaperWindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;ZLcom/android/server/wm/DisplayContent;Z)V
+PLcom/android/server/wm/WallpaperWindowToken;->hasVisibleNotDrawnWallpaper()Z
+PLcom/android/server/wm/WallpaperWindowToken;->sendWindowWallpaperCommand(Ljava/lang/String;IIILandroid/os/Bundle;Z)V
+PLcom/android/server/wm/WallpaperWindowToken;->toString()Ljava/lang/String;
+PLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperOffset(IIZ)V
+PLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperVisibility(Z)V
+PLcom/android/server/wm/WallpaperWindowToken;->updateWallpaperWindows(Z)V
+PLcom/android/server/wm/WindowAnimationSpec$TmpValues;-><init>()V
+PLcom/android/server/wm/WindowAnimationSpec$TmpValues;-><init>(Lcom/android/server/wm/WindowAnimationSpec$1;)V
+PLcom/android/server/wm/WindowAnimationSpec;-><init>(Landroid/view/animation/Animation;Landroid/graphics/Point;Landroid/graphics/Rect;ZIZ)V
+PLcom/android/server/wm/WindowAnimationSpec;-><init>(Landroid/view/animation/Animation;Landroid/graphics/Point;Z)V
+PLcom/android/server/wm/WindowAnimationSpec;->calculateStatusBarTransitionStartTime()J
+PLcom/android/server/wm/WindowAnimationSpec;->canSkipFirstFrame()Z
+PLcom/android/server/wm/WindowAnimationSpec;->findAlmostThereFraction(Landroid/view/animation/Interpolator;)F
+PLcom/android/server/wm/WindowAnimationSpec;->findTranslateAnimation(Landroid/view/animation/Animation;)Landroid/view/animation/TranslateAnimation;
+PLcom/android/server/wm/WindowAnimationSpec;->getBackgroundColor()I
+PLcom/android/server/wm/WindowAnimationSpec;->getDetachWallpaper()Z
+PLcom/android/server/wm/WindowAnimationSpec;->getDuration()J
+PLcom/android/server/wm/WindowAnimationSpec;->getShowWallpaper()Z
+PLcom/android/server/wm/WindowAnimationSpec;->lambda$new$0()Lcom/android/server/wm/WindowAnimationSpec$TmpValues;
+PLcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;-><init>(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/WindowAnimator$DisplayContentsAnimator;-><init>(Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator$1;)V
+PLcom/android/server/wm/WindowAnimator;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowAnimator;->addAfterPrepareSurfacesRunnable(Ljava/lang/Runnable;)V
+PLcom/android/server/wm/WindowAnimator;->addDisplayLocked(I)V
+PLcom/android/server/wm/WindowAnimator;->cancelAnimation()V
+PLcom/android/server/wm/WindowAnimator;->getPendingLayoutChanges(I)I
+PLcom/android/server/wm/WindowAnimator;->isAnimating()Z
+PLcom/android/server/wm/WindowAnimator;->isAnimationScheduled()Z
+PLcom/android/server/wm/WindowAnimator;->lambda$new$0(Lcom/android/server/wm/WindowAnimator;)V
+PLcom/android/server/wm/WindowAnimator;->lambda$new$1(Lcom/android/server/wm/WindowAnimator;J)V
+PLcom/android/server/wm/WindowAnimator;->orAnimating(Z)V
+PLcom/android/server/wm/WindowAnimator;->requestRemovalOfReplacedWindows(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowAnimator;->setAnimating(Z)V
+PLcom/android/server/wm/WindowAnimator;->setPendingLayoutChanges(II)V
+PLcom/android/server/wm/WindowAnimator;->setScreenRotationAnimationLocked(ILcom/android/server/wm/ScreenRotationAnimation;)V
+PLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;-><init>(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;-><init>(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowContainer$1;)V
+PLcom/android/server/wm/WindowContainer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowContainer;->addChild(Lcom/android/server/wm/WindowContainer;I)V
+PLcom/android/server/wm/WindowContainer;->addChild(Lcom/android/server/wm/WindowContainer;Ljava/util/Comparator;)V
+PLcom/android/server/wm/WindowContainer;->assignChildLayers()V
+PLcom/android/server/wm/WindowContainer;->assignRelativeLayer(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;I)V
+PLcom/android/server/wm/WindowContainer;->cancelAnimation()V
+PLcom/android/server/wm/WindowContainer;->commitPendingTransaction()V
+PLcom/android/server/wm/WindowContainer;->compareTo(Lcom/android/server/wm/WindowContainer;)I
+PLcom/android/server/wm/WindowContainer;->forAllTasks(Ljava/util/function/Consumer;)V
+PLcom/android/server/wm/WindowContainer;->getAnimationLeashParent()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/WindowContainer;->getAppAnimationLayer(I)Landroid/view/SurfaceControl;
+PLcom/android/server/wm/WindowContainer;->getChildAt(I)Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/wm/WindowContainer;->getController()Lcom/android/server/wm/WindowContainerController;
+PLcom/android/server/wm/WindowContainer;->getOrientation()I
+PLcom/android/server/wm/WindowContainer;->getOrientation(I)I
+PLcom/android/server/wm/WindowContainer;->getParent()Lcom/android/server/wm/ConfigurationContainer;
+PLcom/android/server/wm/WindowContainer;->getParentSurfaceControl()Landroid/view/SurfaceControl;
+PLcom/android/server/wm/WindowContainer;->getParents(Ljava/util/LinkedList;)V
+PLcom/android/server/wm/WindowContainer;->getPrefixOrderIndex()I
+PLcom/android/server/wm/WindowContainer;->getRelativePosition(Landroid/graphics/Point;)V
+PLcom/android/server/wm/WindowContainer;->getSession()Landroid/view/SurfaceSession;
+PLcom/android/server/wm/WindowContainer;->getSurfaceHeight()I
+PLcom/android/server/wm/WindowContainer;->getSurfaceWidth()I
+PLcom/android/server/wm/WindowContainer;->getTopChild()Lcom/android/server/wm/WindowContainer;
+PLcom/android/server/wm/WindowContainer;->hasCommittedReparentToAnimationLeash()Z
+PLcom/android/server/wm/WindowContainer;->hasContentToDisplay()Z
+PLcom/android/server/wm/WindowContainer;->isVisible()Z
+PLcom/android/server/wm/WindowContainer;->makeAnimationLeash()Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/WindowContainer;->makeChildSurface(Lcom/android/server/wm/WindowContainer;)Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/WindowContainer;->makeSurface()Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/WindowContainer;->onAnimationFinished()V
+PLcom/android/server/wm/WindowContainer;->onAnimationLeashCreated(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/WindowContainer;->onAnimationLeashDestroyed(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/WindowContainer;->onChildAdded(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer;->onChildRemoved(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/WindowContainer;->onDescendantOverrideConfigurationChanged()V
+PLcom/android/server/wm/WindowContainer;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowContainer;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/WindowContainer;->onParentResize()V
+PLcom/android/server/wm/WindowContainer;->onParentSet()V
+PLcom/android/server/wm/WindowContainer;->onResize()V
+PLcom/android/server/wm/WindowContainer;->positionChildAt(ILcom/android/server/wm/WindowContainer;Z)V
+PLcom/android/server/wm/WindowContainer;->reassignLayer(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/WindowContainer;->removeChild(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer;->removeIfPossible()V
+PLcom/android/server/wm/WindowContainer;->removeImmediately()V
+PLcom/android/server/wm/WindowContainer;->reparentSurfaceControl(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/WindowContainer;->sendAppVisibilityToClients()V
+PLcom/android/server/wm/WindowContainer;->setController(Lcom/android/server/wm/WindowContainerController;)V
+PLcom/android/server/wm/WindowContainer;->setLayer(Landroid/view/SurfaceControl$Transaction;I)V
+PLcom/android/server/wm/WindowContainer;->setOrientation(I)V
+PLcom/android/server/wm/WindowContainer;->setParent(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer;->setRelativeLayer(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;I)V
+PLcom/android/server/wm/WindowContainer;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;Z)V
+PLcom/android/server/wm/WindowContainer;->transferAnimation(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowContainer;->updateSurfacePosition()V
+PLcom/android/server/wm/WindowContainerController;-><init>(Lcom/android/server/wm/WindowContainerListener;Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowContainerController;->onOverrideConfigurationChanged(Landroid/content/res/Configuration;)V
+PLcom/android/server/wm/WindowContainerController;->removeContainer()V
+PLcom/android/server/wm/WindowContainerController;->setContainer(Lcom/android/server/wm/WindowContainer;)V
+PLcom/android/server/wm/WindowHashMap;-><init>()V
+PLcom/android/server/wm/WindowList;-><init>()V
+PLcom/android/server/wm/WindowList;->addFirst(Ljava/lang/Object;)V
+PLcom/android/server/wm/WindowList;->peekFirst()Ljava/lang/Object;
+PLcom/android/server/wm/WindowList;->peekLast()Ljava/lang/Object;
+PLcom/android/server/wm/WindowManagerInternal$AppTransitionListener;-><init>()V
+PLcom/android/server/wm/WindowManagerInternal$AppTransitionListener;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerInternal$AppTransitionListener;->onAppTransitionPendingLocked()V
+PLcom/android/server/wm/WindowManagerInternal$AppTransitionListener;->onAppTransitionStartingLocked(ILandroid/os/IBinder;Landroid/os/IBinder;JJJ)I
+PLcom/android/server/wm/WindowManagerInternal;-><init>()V
+PLcom/android/server/wm/WindowManagerService$1;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
+PLcom/android/server/wm/WindowManagerService$2;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$3;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$3;->onAppTransitionFinishedLocked(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService$4;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$4;->run()V
+PLcom/android/server/wm/WindowManagerService$5;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$6;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$6;->onOpChanged(ILjava/lang/String;)V
+PLcom/android/server/wm/WindowManagerService$7;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$9;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService$H;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$H;->handleMessage(Landroid/os/Message;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService$1;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->addWindowToken(Landroid/os/IBinder;II)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->getInputMethodWindowVisibleHeight()I
+PLcom/android/server/wm/WindowManagerService$LocalService;->isDockedDividerResizing()Z
+PLcom/android/server/wm/WindowManagerService$LocalService;->isHardKeyboardAvailable()Z
+PLcom/android/server/wm/WindowManagerService$LocalService;->isKeyguardShowingAndNotOccluded()Z
+PLcom/android/server/wm/WindowManagerService$LocalService;->registerAppTransitionListener(Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->removeWindowToken(Landroid/os/IBinder;ZI)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->requestTraversalFromDisplayManager()V
+PLcom/android/server/wm/WindowManagerService$LocalService;->setOnHardKeyboardStatusChangeListener(Lcom/android/server/wm/WindowManagerInternal$OnHardKeyboardStatusChangeListener;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->updateInputMethodWindowStatus(Landroid/os/IBinder;ZZLandroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService$LocalService;->waitForAllWindowsDrawn(Ljava/lang/Runnable;J)V
+PLcom/android/server/wm/WindowManagerService$MousePositionTracker;-><init>()V
+PLcom/android/server/wm/WindowManagerService$MousePositionTracker;-><init>(Lcom/android/server/wm/WindowManagerService$1;)V
+PLcom/android/server/wm/WindowManagerService$MousePositionTracker;->access$1700(Lcom/android/server/wm/WindowManagerService$MousePositionTracker;)Z
+PLcom/android/server/wm/WindowManagerService$RotationWatcher;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/view/IRotationWatcher;Landroid/os/IBinder$DeathRecipient;I)V
+PLcom/android/server/wm/WindowManagerService$SettingsObserver;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService;-><init>(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZZLcom/android/server/policy/WindowManagerPolicy;)V
+PLcom/android/server/wm/WindowManagerService;->access$000(Lcom/android/server/wm/WindowManagerService;)Lcom/android/server/wm/KeyguardDisableHandler;
+PLcom/android/server/wm/WindowManagerService;->access$1100(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService;->access$1400(Lcom/android/server/wm/WindowManagerService;)Z
+PLcom/android/server/wm/WindowManagerService;->access$1500(Lcom/android/server/wm/WindowManagerService;)Lcom/android/server/wm/RecentsAnimationController;
+PLcom/android/server/wm/WindowManagerService;->access$400(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService;->access$700(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowManagerService;->addWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/InputChannel;)I
+PLcom/android/server/wm/WindowManagerService;->addWindowToken(Landroid/os/IBinder;II)V
+PLcom/android/server/wm/WindowManagerService;->canDispatchPointerEvents()Z
+PLcom/android/server/wm/WindowManagerService;->checkBootAnimationCompleteLocked()Z
+PLcom/android/server/wm/WindowManagerService;->checkDrawnWindowsLocked()V
+PLcom/android/server/wm/WindowManagerService;->closeSystemDialogs(Ljava/lang/String;)V
+PLcom/android/server/wm/WindowManagerService;->computeNewConfiguration(I)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->computeNewConfigurationLocked(I)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->continueSurfaceLayout()V
+PLcom/android/server/wm/WindowManagerService;->createInputConsumer(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/InputChannel;)V
+PLcom/android/server/wm/WindowManagerService;->createSurfaceControl(Landroid/view/Surface;ILcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;)I
+PLcom/android/server/wm/WindowManagerService;->createWatermarkInTransaction()V
+PLcom/android/server/wm/WindowManagerService;->deferSurfaceLayout()V
+PLcom/android/server/wm/WindowManagerService;->destroyInputConsumer(Ljava/lang/String;)Z
+PLcom/android/server/wm/WindowManagerService;->destroyPreservedSurfaceLocked()V
+PLcom/android/server/wm/WindowManagerService;->detectSafeMode()Z
+PLcom/android/server/wm/WindowManagerService;->dipToPixel(ILandroid/util/DisplayMetrics;)I
+PLcom/android/server/wm/WindowManagerService;->displayReady()V
+PLcom/android/server/wm/WindowManagerService;->displayReady(I)V
+PLcom/android/server/wm/WindowManagerService;->doesAddToastWindowRequireToken(Ljava/lang/String;ILcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WindowManagerService;->enableScreenAfterBoot()V
+PLcom/android/server/wm/WindowManagerService;->enableScreenIfNeeded()V
+PLcom/android/server/wm/WindowManagerService;->enableScreenIfNeededLocked()V
+PLcom/android/server/wm/WindowManagerService;->excludeWindowTypeFromTapOutTask(I)Z
+PLcom/android/server/wm/WindowManagerService;->executeAppTransition()V
+PLcom/android/server/wm/WindowManagerService;->getAnimationScale(I)F
+PLcom/android/server/wm/WindowManagerService;->getBaseDisplaySize(ILandroid/graphics/Point;)V
+PLcom/android/server/wm/WindowManagerService;->getCameraLensCoverState()I
+PLcom/android/server/wm/WindowManagerService;->getCurrentAnimatorScale()F
+PLcom/android/server/wm/WindowManagerService;->getDefaultDisplayRotation()I
+PLcom/android/server/wm/WindowManagerService;->getDisplayContentOrCreate(I)Lcom/android/server/wm/DisplayContent;
+PLcom/android/server/wm/WindowManagerService;->getDisplaysInFocusOrder(Landroid/util/SparseIntArray;)V
+PLcom/android/server/wm/WindowManagerService;->getDockedStackSide()I
+PLcom/android/server/wm/WindowManagerService;->getForcedDisplayDensityForUserLocked(I)I
+PLcom/android/server/wm/WindowManagerService;->getImeFocusStackLocked()Lcom/android/server/wm/TaskStack;
+PLcom/android/server/wm/WindowManagerService;->getInitialDisplaySize(ILandroid/graphics/Point;)V
+PLcom/android/server/wm/WindowManagerService;->getInputMonitor()Lcom/android/server/wm/InputMonitor;
+PLcom/android/server/wm/WindowManagerService;->getInstance()Lcom/android/server/wm/WindowManagerService;
+PLcom/android/server/wm/WindowManagerService;->getLidState()I
+PLcom/android/server/wm/WindowManagerService;->getNavBarPosition()I
+PLcom/android/server/wm/WindowManagerService;->getPendingAppTransition()I
+PLcom/android/server/wm/WindowManagerService;->getStableInsets(ILandroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->getStableInsetsLocked(ILandroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->getTaskSnapshot(IIZ)Landroid/app/ActivityManager$TaskSnapshot;
+PLcom/android/server/wm/WindowManagerService;->getTransitionAnimationScaleLocked()F
+PLcom/android/server/wm/WindowManagerService;->getWindowAnimationScaleLocked()F
+PLcom/android/server/wm/WindowManagerService;->getWindowDisplayFrame(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->getWindowId(Landroid/os/IBinder;)Landroid/view/IWindowId;
+PLcom/android/server/wm/WindowManagerService;->getWindowManagerLock()Ljava/lang/Object;
+PLcom/android/server/wm/WindowManagerService;->handleAnimatingStoppedAndTransitionLocked()I
+PLcom/android/server/wm/WindowManagerService;->hasNavigationBar()Z
+PLcom/android/server/wm/WindowManagerService;->hasWideColorGamutSupport()Z
+PLcom/android/server/wm/WindowManagerService;->hideBootMessagesLocked()V
+PLcom/android/server/wm/WindowManagerService;->initPolicy()V
+PLcom/android/server/wm/WindowManagerService;->inputMethodClientHasFocus(Lcom/android/internal/view/IInputMethodClient;)Z
+PLcom/android/server/wm/WindowManagerService;->isKeyguardSecure()Z
+PLcom/android/server/wm/WindowManagerService;->isKeyguardShowingAndNotOccluded()Z
+PLcom/android/server/wm/WindowManagerService;->isSafeModeEnabled()Z
+PLcom/android/server/wm/WindowManagerService;->isSecureLocked(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WindowManagerService;->isShowingDream()Z
+PLcom/android/server/wm/WindowManagerService;->lambda$XZ-U3HlCFtHp_gydNmNMeRmQMCI(Landroid/view/SurfaceSession;)Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/WindowManagerService;->lambda$hBnABSAsqXWvQ0zKwHWE4BZ3Mc0()Landroid/view/SurfaceControl$Transaction;
+PLcom/android/server/wm/WindowManagerService;->lambda$main$0(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZZLcom/android/server/policy/WindowManagerPolicy;)V
+PLcom/android/server/wm/WindowManagerService;->lambda$notifyKeyguardFlagsChanged$1(Lcom/android/server/wm/WindowManagerService;Ljava/lang/Runnable;)V
+PLcom/android/server/wm/WindowManagerService;->lambda$requestAssistScreenshot$2(Landroid/app/IAssistDataReceiver;Landroid/graphics/Bitmap;)V
+PLcom/android/server/wm/WindowManagerService;->lambda$updateNonSystemOverlayWindowsVisibilityIfNeeded$7(ZLcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowManagerService;->main(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZZLcom/android/server/policy/WindowManagerPolicy;)Lcom/android/server/wm/WindowManagerService;
+PLcom/android/server/wm/WindowManagerService;->makeSurfaceBuilder(Landroid/view/SurfaceSession;)Landroid/view/SurfaceControl$Builder;
+PLcom/android/server/wm/WindowManagerService;->makeWindowFreezingScreenIfNeededLocked(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowManagerService;->monitor()V
+PLcom/android/server/wm/WindowManagerService;->notifyAppRelaunchesCleared(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService;->notifyAppRelaunching(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService;->notifyAppRelaunchingFinished(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService;->notifyAppResumedFinished(Landroid/os/IBinder;)V
+PLcom/android/server/wm/WindowManagerService;->notifyFocusChanged()V
+PLcom/android/server/wm/WindowManagerService;->notifyKeyguardFlagsChanged(Ljava/lang/Runnable;)V
+PLcom/android/server/wm/WindowManagerService;->notifyKeyguardTrustedChanged()V
+PLcom/android/server/wm/WindowManagerService;->notifyTaskRemovedFromRecents(II)V
+PLcom/android/server/wm/WindowManagerService;->onDisplayChanged(I)V
+PLcom/android/server/wm/WindowManagerService;->onInitReady()V
+PLcom/android/server/wm/WindowManagerService;->onKeyguardOccludedChanged(Z)V
+PLcom/android/server/wm/WindowManagerService;->onKeyguardShowingAndNotOccludedChanged()V
+PLcom/android/server/wm/WindowManagerService;->onOverlayChanged()V
+PLcom/android/server/wm/WindowManagerService;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->onSystemUiStarted()V
+PLcom/android/server/wm/WindowManagerService;->openSession(Landroid/view/IWindowSessionCallback;Lcom/android/internal/view/IInputMethodClient;Lcom/android/internal/view/IInputContext;)Landroid/view/IWindowSession;
+PLcom/android/server/wm/WindowManagerService;->overridePendingAppTransition(Ljava/lang/String;IILandroid/os/IRemoteCallback;)V
+PLcom/android/server/wm/WindowManagerService;->overridePendingAppTransitionRemote(Landroid/view/RemoteAnimationAdapter;)V
+PLcom/android/server/wm/WindowManagerService;->performBootTimeout()V
+PLcom/android/server/wm/WindowManagerService;->performEnableScreen()V
+PLcom/android/server/wm/WindowManagerService;->postWindowRemoveCleanupLocked(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowManagerService;->prepareAppTransition(IZ)V
+PLcom/android/server/wm/WindowManagerService;->prepareAppTransition(IZIZ)V
+PLcom/android/server/wm/WindowManagerService;->prepareNoneTransitionForRelaunching(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/WindowManagerService;->prepareWindowReplacementTransition(Lcom/android/server/wm/AppWindowToken;)Z
+PLcom/android/server/wm/WindowManagerService;->queryWideColorGamutSupport()Z
+PLcom/android/server/wm/WindowManagerService;->readForcedDisplayPropertiesLocked(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->reconfigureDisplayLocked(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->refreshScreenCaptureDisabled(I)V
+PLcom/android/server/wm/WindowManagerService;->registerAppFreezeListener(Lcom/android/server/wm/WindowManagerService$AppFreezeListener;)V
+PLcom/android/server/wm/WindowManagerService;->registerDockedStackListener(Landroid/view/IDockedStackListener;)V
+PLcom/android/server/wm/WindowManagerService;->registerPinnedStackListener(ILandroid/view/IPinnedStackListener;)V
+PLcom/android/server/wm/WindowManagerService;->registerPointerEventListener(Landroid/view/WindowManagerPolicyConstants$PointerEventListener;)V
+PLcom/android/server/wm/WindowManagerService;->registerShortcutKey(JLcom/android/internal/policy/IShortcutService;)V
+PLcom/android/server/wm/WindowManagerService;->registerWallpaperVisibilityListener(Landroid/view/IWallpaperVisibilityListener;I)Z
+PLcom/android/server/wm/WindowManagerService;->removeObsoleteTaskFiles(Landroid/util/ArraySet;[I)V
+PLcom/android/server/wm/WindowManagerService;->removeWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;)V
+PLcom/android/server/wm/WindowManagerService;->removeWindowToken(Landroid/os/IBinder;I)V
+PLcom/android/server/wm/WindowManagerService;->requestAssistScreenshot(Landroid/app/IAssistDataReceiver;)Z
+PLcom/android/server/wm/WindowManagerService;->requestTraversal()V
+PLcom/android/server/wm/WindowManagerService;->screenTurningOff(Lcom/android/server/policy/WindowManagerPolicy$ScreenOffListener;)V
+PLcom/android/server/wm/WindowManagerService;->sendNewConfiguration(I)V
+PLcom/android/server/wm/WindowManagerService;->sendSetRunningRemoteAnimation(IZ)V
+PLcom/android/server/wm/WindowManagerService;->setAnimatorDurationScale(F)V
+PLcom/android/server/wm/WindowManagerService;->setAppFullscreen(Landroid/os/IBinder;Z)V
+PLcom/android/server/wm/WindowManagerService;->setDockedStackDividerTouchRegion(Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowManagerService;->setEventDispatching(Z)V
+PLcom/android/server/wm/WindowManagerService;->setFocusTaskRegionLocked(Lcom/android/server/wm/AppWindowToken;)V
+PLcom/android/server/wm/WindowManagerService;->setFocusedApp(Landroid/os/IBinder;Z)V
+PLcom/android/server/wm/WindowManagerService;->setForceResizableTasks(Z)V
+PLcom/android/server/wm/WindowManagerService;->setHoldScreenLocked(Lcom/android/server/wm/Session;)V
+PLcom/android/server/wm/WindowManagerService;->setInputMethodWindowLocked(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowManagerService;->setInsetsWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
+PLcom/android/server/wm/WindowManagerService;->setKeyguardGoingAway(Z)V
+PLcom/android/server/wm/WindowManagerService;->setKeyguardOrAodShowingOnDefaultDisplay(Z)V
+PLcom/android/server/wm/WindowManagerService;->setNavBarVirtualKeyHapticFeedbackEnabled(Z)V
+PLcom/android/server/wm/WindowManagerService;->setNewDisplayOverrideConfiguration(Landroid/content/res/Configuration;I)[I
+PLcom/android/server/wm/WindowManagerService;->setShelfHeight(ZI)V
+PLcom/android/server/wm/WindowManagerService;->setSupportsPictureInPicture(Z)V
+PLcom/android/server/wm/WindowManagerService;->setTransparentRegionWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/graphics/Region;)V
+PLcom/android/server/wm/WindowManagerService;->setWindowOpaqueLocked(Landroid/os/IBinder;Z)V
+PLcom/android/server/wm/WindowManagerService;->showEmulatorDisplayOverlayIfNeeded()V
+PLcom/android/server/wm/WindowManagerService;->startFreezingDisplayLocked(IILcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowManagerService;->statusBarVisibilityChanged(I)V
+PLcom/android/server/wm/WindowManagerService;->stopFreezingDisplayLocked()V
+PLcom/android/server/wm/WindowManagerService;->systemReady()V
+PLcom/android/server/wm/WindowManagerService;->triggerAnimationFailsafe()V
+PLcom/android/server/wm/WindowManagerService;->tryStartExitingAnimation(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowStateAnimator;ZZ)Z
+PLcom/android/server/wm/WindowManagerService;->unregisterAppFreezeListener(Lcom/android/server/wm/WindowManagerService$AppFreezeListener;)V
+PLcom/android/server/wm/WindowManagerService;->updateAppOpsState()V
+PLcom/android/server/wm/WindowManagerService;->updateCircularDisplayMaskIfNeeded()V
+PLcom/android/server/wm/WindowManagerService;->updateFocusedWindowLocked(IZ)Z
+PLcom/android/server/wm/WindowManagerService;->updateNonSystemOverlayWindowsVisibilityIfNeeded(Lcom/android/server/wm/WindowState;Z)V
+PLcom/android/server/wm/WindowManagerService;->updateOrientationFromAppTokens(Landroid/content/res/Configuration;Landroid/os/IBinder;I)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->updateOrientationFromAppTokens(Landroid/content/res/Configuration;Landroid/os/IBinder;IZ)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->updateOrientationFromAppTokensLocked(I)Z
+PLcom/android/server/wm/WindowManagerService;->updateOrientationFromAppTokensLocked(Landroid/content/res/Configuration;Landroid/os/IBinder;IZ)Landroid/content/res/Configuration;
+PLcom/android/server/wm/WindowManagerService;->updatePointerIcon(Landroid/view/IWindow;)V
+PLcom/android/server/wm/WindowManagerService;->updateRotation(ZZ)V
+PLcom/android/server/wm/WindowManagerService;->updateRotationUnchecked(ZZ)V
+PLcom/android/server/wm/WindowManagerService;->updateStatusBarVisibilityLocked(I)Z
+PLcom/android/server/wm/WindowManagerService;->watchRotation(Landroid/view/IRotationWatcher;I)I
+PLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/view/IWindow;Z)Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/WindowManagerThreadPriorityBooster;-><init>()V
+PLcom/android/server/wm/WindowManagerThreadPriorityBooster;->setAppTransitionRunning(Z)V
+PLcom/android/server/wm/WindowState$1;-><init>()V
+PLcom/android/server/wm/WindowState$1;->compare(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)I
+PLcom/android/server/wm/WindowState$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+PLcom/android/server/wm/WindowState$2;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowState$2;->isInteractive()Z
+PLcom/android/server/wm/WindowState$DeathRecipient;-><init>(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowState$DeathRecipient;-><init>(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState$1;)V
+PLcom/android/server/wm/WindowState$DeathRecipient;->binderDied()V
+PLcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;-><init>()V
+PLcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;->reset()V
+PLcom/android/server/wm/WindowState$WindowId;-><init>(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowState$WindowId;-><init>(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState$1;)V
+PLcom/android/server/wm/WindowState;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/Session;Landroid/view/IWindow;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;IILandroid/view/WindowManager$LayoutParams;IIZ)V
+PLcom/android/server/wm/WindowState;-><init>(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/Session;Landroid/view/IWindow;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;IILandroid/view/WindowManager$LayoutParams;IIZLcom/android/server/wm/WindowState$PowerManagerWrapper;)V
+PLcom/android/server/wm/WindowState;->access$200(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WindowState;->access$300(Lcom/android/server/wm/WindowState;Z)V
+PLcom/android/server/wm/WindowState;->adjustStartingWindowFlags()V
+PLcom/android/server/wm/WindowState;->applyAdjustForImeIfNeeded()V
+PLcom/android/server/wm/WindowState;->applyInsets(Landroid/graphics/Region;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/WindowState;->attach()V
+PLcom/android/server/wm/WindowState;->canAcquireSleepToken()Z
+PLcom/android/server/wm/WindowState;->canBeImeTarget()Z
+PLcom/android/server/wm/WindowState;->checkPolicyVisibilityChange()V
+PLcom/android/server/wm/WindowState;->clearAnimatingFlags()Z
+PLcom/android/server/wm/WindowState;->destroySurface(ZZ)Z
+PLcom/android/server/wm/WindowState;->destroySurfaceUnchecked()V
+PLcom/android/server/wm/WindowState;->dispatchResized(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;ZLandroid/util/MergedConfiguration;ZILandroid/view/DisplayCutout;)V
+PLcom/android/server/wm/WindowState;->dispatchWallpaperVisibility(Z)V
+PLcom/android/server/wm/WindowState;->disposeInputChannel()V
+PLcom/android/server/wm/WindowState;->forAllWindowBottomToTop(Lcom/android/internal/util/ToBooleanFunction;)Z
+PLcom/android/server/wm/WindowState;->forAllWindowTopToBottom(Lcom/android/internal/util/ToBooleanFunction;)Z
+PLcom/android/server/wm/WindowState;->getBackdropFrame(Landroid/graphics/Rect;)Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getDisplayFrameLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getDrawnStateEvaluated()Z
+PLcom/android/server/wm/WindowState;->getFrameLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getGivenContentInsetsLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getGivenInsetsPendingLw()Z
+PLcom/android/server/wm/WindowState;->getGivenVisibleInsetsLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->getHighestAnimLayer()I
+PLcom/android/server/wm/WindowState;->getLastReportedMergedConfiguration(Landroid/util/MergedConfiguration;)V
+PLcom/android/server/wm/WindowState;->getMergedConfiguration(Landroid/util/MergedConfiguration;)V
+PLcom/android/server/wm/WindowState;->getName()Ljava/lang/String;
+PLcom/android/server/wm/WindowState;->getNeedsMenuLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)Z
+PLcom/android/server/wm/WindowState;->getOwningPackage()Ljava/lang/String;
+PLcom/android/server/wm/WindowState;->getOwningUid()I
+PLcom/android/server/wm/WindowState;->getReplacingWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/WindowState;->getRotationAnimationHint()I
+PLcom/android/server/wm/WindowState;->getSession()Landroid/view/SurfaceSession;
+PLcom/android/server/wm/WindowState;->getVisibleFrameLw()Landroid/graphics/Rect;
+PLcom/android/server/wm/WindowState;->hasAppShownWindows()Z
+PLcom/android/server/wm/WindowState;->hasContentToDisplay()Z
+PLcom/android/server/wm/WindowState;->hasDrawnLw()Z
+PLcom/android/server/wm/WindowState;->hasVisibleNotDrawnWallpaper()Z
+PLcom/android/server/wm/WindowState;->hideNonSystemOverlayWindowsWhenVisible()Z
+PLcom/android/server/wm/WindowState;->hidePermanentlyLw()V
+PLcom/android/server/wm/WindowState;->hideWallpaperWindow(ZLjava/lang/String;)V
+PLcom/android/server/wm/WindowState;->initAppOpsState()V
+PLcom/android/server/wm/WindowState;->isClosing()Z
+PLcom/android/server/wm/WindowState;->isDrawFinishedLw()Z
+PLcom/android/server/wm/WindowState;->isFocused()Z
+PLcom/android/server/wm/WindowState;->isInteresting()Z
+PLcom/android/server/wm/WindowState;->isReadyForDisplay()Z
+PLcom/android/server/wm/WindowState;->isRtl()Z
+PLcom/android/server/wm/WindowState;->isSelfOrAncestorWindowAnimatingExit()Z
+PLcom/android/server/wm/WindowState;->isVisibleNow()Z
+PLcom/android/server/wm/WindowState;->isVoiceInteraction()Z
+PLcom/android/server/wm/WindowState;->isWinVisibleLw()Z
+PLcom/android/server/wm/WindowState;->logPerformShow(Ljava/lang/String;)V
+PLcom/android/server/wm/WindowState;->mightAffectAllDrawn()Z
+PLcom/android/server/wm/WindowState;->onAnimationFinished()V
+PLcom/android/server/wm/WindowState;->onAnimationLeashCreated(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;)V
+PLcom/android/server/wm/WindowState;->onAnimationLeashDestroyed(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/WindowState;->onAppVisibilityChanged(ZZ)Z
+PLcom/android/server/wm/WindowState;->onExitAnimationDone()V
+PLcom/android/server/wm/WindowState;->onParentSet()V
+PLcom/android/server/wm/WindowState;->onResize()V
+PLcom/android/server/wm/WindowState;->onSetAppExiting()Z
+PLcom/android/server/wm/WindowState;->onStartFreezingScreen()V
+PLcom/android/server/wm/WindowState;->onStopFreezingScreen()Z
+PLcom/android/server/wm/WindowState;->openInputChannel(Landroid/view/InputChannel;)V
+PLcom/android/server/wm/WindowState;->performShowLocked()Z
+PLcom/android/server/wm/WindowState;->prepareWindowToDisplayDuringRelayout(Z)V
+PLcom/android/server/wm/WindowState;->relayoutVisibleWindow(III)I
+PLcom/android/server/wm/WindowState;->removeIfPossible()V
+PLcom/android/server/wm/WindowState;->removeIfPossible(Z)V
+PLcom/android/server/wm/WindowState;->removeImmediately()V
+PLcom/android/server/wm/WindowState;->removeReplacedWindowIfNeeded(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WindowState;->reportFocusChangedSerialized(ZZ)V
+PLcom/android/server/wm/WindowState;->reportResized()V
+PLcom/android/server/wm/WindowState;->requestUpdateWallpaperIfNeeded()V
+PLcom/android/server/wm/WindowState;->resetAppOpsState()V
+PLcom/android/server/wm/WindowState;->sendAppVisibilityToClients()V
+PLcom/android/server/wm/WindowState;->setDisplayLayoutNeeded()V
+PLcom/android/server/wm/WindowState;->setForceHideNonSystemOverlayWindowIfNeeded(Z)V
+PLcom/android/server/wm/WindowState;->setFrameNumber(J)V
+PLcom/android/server/wm/WindowState;->setHasSurface(Z)V
+PLcom/android/server/wm/WindowState;->setHiddenWhileSuspended(Z)V
+PLcom/android/server/wm/WindowState;->setLastReportedMergedConfiguration(Landroid/util/MergedConfiguration;)V
+PLcom/android/server/wm/WindowState;->setOrientationChanging(Z)V
+PLcom/android/server/wm/WindowState;->setReplacementWindowIfNeeded(Lcom/android/server/wm/WindowState;)Z
+PLcom/android/server/wm/WindowState;->setRequestedSize(II)V
+PLcom/android/server/wm/WindowState;->setShowToOwnerOnlyLocked(Z)V
+PLcom/android/server/wm/WindowState;->setWindowScale(II)V
+PLcom/android/server/wm/WindowState;->setupWindowForRemoveOnExit()V
+PLcom/android/server/wm/WindowState;->shouldKeepVisibleDeadAppWindow()Z
+PLcom/android/server/wm/WindowState;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;)V
+PLcom/android/server/wm/WindowState;->startAnimation(Landroid/view/animation/Animation;)V
+PLcom/android/server/wm/WindowState;->surfaceInsetsChanging()Z
+PLcom/android/server/wm/WindowState;->updateAppOpsState()V
+PLcom/android/server/wm/WindowState;->updateLastInsetValues()V
+PLcom/android/server/wm/WindowState;->updateReportedVisibility(Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;)V
+PLcom/android/server/wm/WindowState;->waitingForReplacement()Z
+PLcom/android/server/wm/WindowStateAnimator;-><init>(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowStateAnimator;->applyAnimationLocked(IZ)Z
+PLcom/android/server/wm/WindowStateAnimator;->applyEnterAnimationLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->createSurfaceLocked(II)Lcom/android/server/wm/WindowSurfaceController;
+PLcom/android/server/wm/WindowStateAnimator;->destroyDeferredSurfaceLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->destroyPreservedSurfaceLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->destroySurface()V
+PLcom/android/server/wm/WindowStateAnimator;->destroySurfaceLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->detachChildren()V
+PLcom/android/server/wm/WindowStateAnimator;->finishDrawingLocked()Z
+PLcom/android/server/wm/WindowStateAnimator;->markPreservedSurfaceForDestroy()V
+PLcom/android/server/wm/WindowStateAnimator;->onAnimationFinished()V
+PLcom/android/server/wm/WindowStateAnimator;->preserveSurfaceLocked()V
+PLcom/android/server/wm/WindowStateAnimator;->resetDrawState()V
+PLcom/android/server/wm/WindowStateAnimator;->setOffsetPositionForStackResize(Z)V
+PLcom/android/server/wm/WindowStateAnimator;->setOpaqueLocked(Z)V
+PLcom/android/server/wm/WindowStateAnimator;->setSecureLocked(Z)V
+PLcom/android/server/wm/WindowStateAnimator;->setTransparentRegionHintLocked(Landroid/graphics/Region;)V
+PLcom/android/server/wm/WindowStateAnimator;->setWallpaperOffset(II)Z
+PLcom/android/server/wm/WindowStateAnimator;->showSurfaceRobustlyLocked()Z
+PLcom/android/server/wm/WindowStateAnimator;->tryChangeFormatInPlaceLocked()Z
+PLcom/android/server/wm/WindowSurfaceController;-><init>(Landroid/view/SurfaceSession;Ljava/lang/String;IIIILcom/android/server/wm/WindowStateAnimator;II)V
+PLcom/android/server/wm/WindowSurfaceController;->destroyNotInTransaction()V
+PLcom/android/server/wm/WindowSurfaceController;->detachChildren()V
+PLcom/android/server/wm/WindowSurfaceController;->getSurface(Landroid/view/Surface;)V
+PLcom/android/server/wm/WindowSurfaceController;->hide(Landroid/view/SurfaceControl$Transaction;Ljava/lang/String;)V
+PLcom/android/server/wm/WindowSurfaceController;->hideSurface(Landroid/view/SurfaceControl$Transaction;)V
+PLcom/android/server/wm/WindowSurfaceController;->prepareToShowInTransaction(FFFFFZ)Z
+PLcom/android/server/wm/WindowSurfaceController;->setCropInTransaction(Landroid/graphics/Rect;Z)V
+PLcom/android/server/wm/WindowSurfaceController;->setOpaque(Z)V
+PLcom/android/server/wm/WindowSurfaceController;->setSecure(Z)V
+PLcom/android/server/wm/WindowSurfaceController;->setShown(Z)V
+PLcom/android/server/wm/WindowSurfaceController;->setSizeInTransaction(IIZ)Z
+PLcom/android/server/wm/WindowSurfaceController;->setTransparentRegionHint(Landroid/graphics/Region;)V
+PLcom/android/server/wm/WindowSurfaceController;->showRobustlyInTransaction()Z
+PLcom/android/server/wm/WindowSurfaceController;->showSurface()Z
+PLcom/android/server/wm/WindowSurfaceController;->updateVisibility()Z
+PLcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;-><init>()V
+PLcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;-><init>(Lcom/android/server/wm/WindowSurfacePlacer$1;)V
+PLcom/android/server/wm/WindowSurfacePlacer;-><init>(Lcom/android/server/wm/WindowManagerService;)V
+PLcom/android/server/wm/WindowSurfacePlacer;->canBeWallpaperTarget(Landroid/util/ArraySet;)Z
+PLcom/android/server/wm/WindowSurfacePlacer;->collectActivityTypes(Landroid/util/ArraySet;Landroid/util/ArraySet;)Landroid/util/ArraySet;
+PLcom/android/server/wm/WindowSurfacePlacer;->containsVoiceInteraction(Landroid/util/ArraySet;)Z
+PLcom/android/server/wm/WindowSurfacePlacer;->continueLayout()V
+PLcom/android/server/wm/WindowSurfacePlacer;->deferLayout()V
+PLcom/android/server/wm/WindowSurfacePlacer;->findAnimLayoutParamsToken(ILandroid/util/ArraySet;)Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/WindowSurfacePlacer;->getAnimLp(Lcom/android/server/wm/AppWindowToken;)Landroid/view/WindowManager$LayoutParams;
+PLcom/android/server/wm/WindowSurfacePlacer;->getTopApp(Landroid/util/ArraySet;Z)Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/WindowSurfacePlacer;->handleAppTransitionReadyLocked()I
+PLcom/android/server/wm/WindowSurfacePlacer;->handleClosingApps(ILandroid/view/WindowManager$LayoutParams;ZLcom/android/server/wm/WindowSurfacePlacer$LayerAndToken;)V
+PLcom/android/server/wm/WindowSurfacePlacer;->handleNonAppWindowsInTransition(II)V
+PLcom/android/server/wm/WindowSurfacePlacer;->handleOpeningApps(ILandroid/view/WindowManager$LayoutParams;Z)Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/WindowSurfacePlacer;->isInLayout()Z
+PLcom/android/server/wm/WindowSurfacePlacer;->lambda$findAnimLayoutParamsToken$1(ILandroid/util/ArraySet;Lcom/android/server/wm/AppWindowToken;)Z
+PLcom/android/server/wm/WindowSurfacePlacer;->lambda$findAnimLayoutParamsToken$2(Lcom/android/server/wm/AppWindowToken;)Z
+PLcom/android/server/wm/WindowSurfacePlacer;->lambda$findAnimLayoutParamsToken$3(Lcom/android/server/wm/AppWindowToken;)Z
+PLcom/android/server/wm/WindowSurfacePlacer;->lambda$new$0(Lcom/android/server/wm/WindowSurfacePlacer;)V
+PLcom/android/server/wm/WindowSurfacePlacer;->lookForHighestTokenWithFilter(Landroid/util/ArraySet;Landroid/util/ArraySet;Ljava/util/function/Predicate;)Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/WindowSurfacePlacer;->maybeUpdateTransitToTranslucentAnim(I)I
+PLcom/android/server/wm/WindowSurfacePlacer;->maybeUpdateTransitToWallpaper(IZZ)I
+PLcom/android/server/wm/WindowSurfacePlacer;->overrideWithRemoteAnimationIfSet(Lcom/android/server/wm/AppWindowToken;ILandroid/util/ArraySet;)V
+PLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement()V
+PLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement(Z)V
+PLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacementLoop()V
+PLcom/android/server/wm/WindowSurfacePlacer;->processApplicationsAnimatingInPlace(I)V
+PLcom/android/server/wm/WindowSurfacePlacer;->requestTraversal()V
+PLcom/android/server/wm/WindowSurfacePlacer;->transitionGoodToGo(ILandroid/util/SparseIntArray;)Z
+PLcom/android/server/wm/WindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;IZLcom/android/server/wm/DisplayContent;Z)V
+PLcom/android/server/wm/WindowToken;-><init>(Lcom/android/server/wm/WindowManagerService;Landroid/os/IBinder;IZLcom/android/server/wm/DisplayContent;ZZ)V
+PLcom/android/server/wm/WindowToken;->addWindow(Lcom/android/server/wm/WindowState;)V
+PLcom/android/server/wm/WindowToken;->asAppWindowToken()Lcom/android/server/wm/AppWindowToken;
+PLcom/android/server/wm/WindowToken;->canLayerAboveSystemBars()Z
+PLcom/android/server/wm/WindowToken;->getHighestAnimLayer()I
+PLcom/android/server/wm/WindowToken;->getName()Ljava/lang/String;
+PLcom/android/server/wm/WindowToken;->getReplacingWindow()Lcom/android/server/wm/WindowState;
+PLcom/android/server/wm/WindowToken;->isEmpty()Z
+PLcom/android/server/wm/WindowToken;->lambda$new$0(Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)I
+PLcom/android/server/wm/WindowToken;->okToAnimate()Z
+PLcom/android/server/wm/WindowToken;->okToDisplay()Z
+PLcom/android/server/wm/WindowToken;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V
+PLcom/android/server/wm/WindowToken;->removeAllWindowsIfPossible()V
+PLcom/android/server/wm/WindowToken;->removeImmediately()V
+PLcom/android/server/wm/WindowToken;->setExiting()V
+PLcom/android/server/wm/WindowToken;->setHidden(Z)V
+PLcom/android/server/wm/WindowToken;->toString()Ljava/lang/String;
+PLcom/android/server/wm/WindowToken;->windowsCanBeWallpaperTarget()Z
+PLcom/android/server/wm/WindowTracing;-><init>(Ljava/io/File;)V
+PLcom/android/server/wm/WindowTracing;->createDefaultAndStartLooper(Landroid/content/Context;)Lcom/android/server/wm/WindowTracing;
+PLcom/android/server/wm/WindowTracing;->loop()V
+PLcom/android/server/wm/WindowTracing;->loopOnce()V
+PLcom/android/server/wm/utils/InsetUtils;->addInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+PLcom/android/server/wm/utils/RotationCache;-><init>(Lcom/android/server/wm/utils/RotationCache$RotationDependentComputation;)V
+PLcom/android/server/wm/utils/RotationCache;->getOrCompute(Ljava/lang/Object;I)Ljava/lang/Object;
+PLcom/android/server/wm/utils/WmDisplayCutout;-><init>(Landroid/view/DisplayCutout;Landroid/util/Size;)V
+PLcom/android/timezone/distro/installer/TimeZoneDistroInstaller;-><init>(Ljava/lang/String;Ljava/io/File;Ljava/io/File;)V
+SPLcom/android/server/-$$Lambda$SystemServerInitThreadPool$7wfLGkZF7FvYZv7xj3ghvuiJJGk;-><init>(Ljava/lang/String;Ljava/lang/Runnable;)V
+SPLcom/android/server/-$$Lambda$SystemServerInitThreadPool$7wfLGkZF7FvYZv7xj3ghvuiJJGk;->run()V
+SPLcom/android/server/-$$Lambda$YWiwiKm_Qgqb55C6tTuq_n2JzdY;-><init>()V
+SPLcom/android/server/-$$Lambda$YWiwiKm_Qgqb55C6tTuq_n2JzdY;->run()V
+SPLcom/android/server/AppOpsService$1;-><init>(Lcom/android/server/AppOpsService;)V
+SPLcom/android/server/AppOpsService$AppOpsManagerInternalImpl;-><init>(Lcom/android/server/AppOpsService;)V
+SPLcom/android/server/AppOpsService$AppOpsManagerInternalImpl;-><init>(Lcom/android/server/AppOpsService;Lcom/android/server/AppOpsService$1;)V
+SPLcom/android/server/AppOpsService$Constants;-><init>(Lcom/android/server/AppOpsService;Landroid/os/Handler;)V
+SPLcom/android/server/AppOpsService$Constants;->updateConstants()V
+SPLcom/android/server/AppOpsService$Ops;-><init>(Ljava/lang/String;Lcom/android/server/AppOpsService$UidState;Z)V
+SPLcom/android/server/AppOpsService$UidState;-><init>(I)V
+SPLcom/android/server/AppOpsService;-><init>(Ljava/io/File;Landroid/os/Handler;)V
+SPLcom/android/server/AppOpsService;->publish(Landroid/content/Context;)V
+SPLcom/android/server/AppOpsService;->readState()V
+SPLcom/android/server/AppOpsService;->readUidOps(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/AppOpsService;->upgradeLocked(I)V
+SPLcom/android/server/DisplayThread;-><init>()V
+SPLcom/android/server/DisplayThread;->ensureThreadLocked()V
+SPLcom/android/server/DisplayThread;->get()Lcom/android/server/DisplayThread;
+SPLcom/android/server/DisplayThread;->getHandler()Landroid/os/Handler;
+SPLcom/android/server/EventLogTags;->writePmCriticalInfo(Ljava/lang/String;)V
+SPLcom/android/server/FgThread;-><init>()V
+SPLcom/android/server/FgThread;->ensureThreadLocked()V
+SPLcom/android/server/FgThread;->get()Lcom/android/server/FgThread;
+SPLcom/android/server/FgThread;->getHandler()Landroid/os/Handler;
+SPLcom/android/server/IntentResolver$1;-><init>()V
+SPLcom/android/server/IntentResolver;-><init>()V
+SPLcom/android/server/IntentResolver;->filterSet()Ljava/util/Set;
+SPLcom/android/server/IoThread;-><init>()V
+SPLcom/android/server/IoThread;->ensureThreadLocked()V
+SPLcom/android/server/IoThread;->get()Lcom/android/server/IoThread;
+SPLcom/android/server/IoThread;->getHandler()Landroid/os/Handler;
+SPLcom/android/server/LockGuard$LockInfo;-><init>()V
+SPLcom/android/server/LockGuard$LockInfo;-><init>(Lcom/android/server/LockGuard$1;)V
+SPLcom/android/server/LockGuard;->findOrCreateLockInfo(Ljava/lang/Object;)Lcom/android/server/LockGuard$LockInfo;
+SPLcom/android/server/LockGuard;->installLock(Ljava/lang/Object;I)Ljava/lang/Object;
+SPLcom/android/server/LockGuard;->installLock(Ljava/lang/Object;IZ)Ljava/lang/Object;
+SPLcom/android/server/LockGuard;->installNewLock(I)Ljava/lang/Object;
+SPLcom/android/server/LockGuard;->installNewLock(IZ)Ljava/lang/Object;
+SPLcom/android/server/LockGuard;->lockToString(I)Ljava/lang/String;
+SPLcom/android/server/RecoverySystemService$BinderService;-><init>(Lcom/android/server/RecoverySystemService;)V
+SPLcom/android/server/RecoverySystemService$BinderService;-><init>(Lcom/android/server/RecoverySystemService;Lcom/android/server/RecoverySystemService$1;)V
+SPLcom/android/server/RecoverySystemService;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/RecoverySystemService;->onStart()V
+SPLcom/android/server/RescueParty$BootThreshold;-><init>()V
+SPLcom/android/server/RescueParty$Threshold;-><init>(IIJ)V
+SPLcom/android/server/RescueParty;->isDisabled()Z
+SPLcom/android/server/RescueParty;->isUsbActive()Z
+SPLcom/android/server/RescueParty;->noteBoot(Landroid/content/Context;)V
+SPLcom/android/server/ServiceThread;-><init>(Ljava/lang/String;IZ)V
+SPLcom/android/server/ServiceThread;->run()V
+SPLcom/android/server/SystemServer;-><init>()V
+SPLcom/android/server/SystemServer;->createSystemContext()V
+SPLcom/android/server/SystemServer;->main([Ljava/lang/String;)V
+SPLcom/android/server/SystemServer;->performPendingShutdown()V
+SPLcom/android/server/SystemServer;->run()V
+SPLcom/android/server/SystemServer;->startBootstrapServices()V
+SPLcom/android/server/SystemServer;->traceBeginAndSlog(Ljava/lang/String;)V
+SPLcom/android/server/SystemServer;->traceEnd()V
+SPLcom/android/server/SystemServerInitThreadPool;-><init>()V
+SPLcom/android/server/SystemServerInitThreadPool;->get()Lcom/android/server/SystemServerInitThreadPool;
+SPLcom/android/server/SystemServerInitThreadPool;->lambda$submit$0(Ljava/lang/String;Ljava/lang/Runnable;)V
+SPLcom/android/server/SystemServerInitThreadPool;->submit(Ljava/lang/Runnable;Ljava/lang/String;)Ljava/util/concurrent/Future;
+SPLcom/android/server/SystemService;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/SystemService;->onBootPhase(I)V
+SPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;)V
+SPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;Z)V
+SPLcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;ZI)V
+SPLcom/android/server/SystemService;->publishLocalService(Ljava/lang/Class;Ljava/lang/Object;)V
+SPLcom/android/server/SystemServiceManager;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/SystemServiceManager;->setStartInfo(ZJJ)V
+SPLcom/android/server/SystemServiceManager;->startService(Lcom/android/server/SystemService;)V
+SPLcom/android/server/SystemServiceManager;->startService(Ljava/lang/Class;)Lcom/android/server/SystemService;
+SPLcom/android/server/SystemServiceManager;->warnIfTooLong(JLcom/android/server/SystemService;Ljava/lang/String;)V
+SPLcom/android/server/ThreadPriorityBooster$1;-><init>(Lcom/android/server/ThreadPriorityBooster;)V
+SPLcom/android/server/ThreadPriorityBooster;-><init>(II)V
+SPLcom/android/server/UiThread;-><init>()V
+SPLcom/android/server/UiThread;->ensureThreadLocked()V
+SPLcom/android/server/UiThread;->get()Lcom/android/server/UiThread;
+SPLcom/android/server/UiThread;->getHandler()Landroid/os/Handler;
+SPLcom/android/server/UiThread;->run()V
+SPLcom/android/server/Watchdog$BinderThreadMonitor;-><init>()V
+SPLcom/android/server/Watchdog$BinderThreadMonitor;-><init>(Lcom/android/server/Watchdog$1;)V
+SPLcom/android/server/Watchdog$HandlerChecker;-><init>(Lcom/android/server/Watchdog;Landroid/os/Handler;Ljava/lang/String;J)V
+SPLcom/android/server/Watchdog$HandlerChecker;->addMonitor(Lcom/android/server/Watchdog$Monitor;)V
+SPLcom/android/server/Watchdog$OpenFdMonitor;-><init>(Ljava/io/File;Ljava/io/File;)V
+SPLcom/android/server/Watchdog$OpenFdMonitor;->create()Lcom/android/server/Watchdog$OpenFdMonitor;
+SPLcom/android/server/Watchdog;-><init>()V
+SPLcom/android/server/Watchdog;->addMonitor(Lcom/android/server/Watchdog$Monitor;)V
+SPLcom/android/server/Watchdog;->addThread(Landroid/os/Handler;)V
+SPLcom/android/server/Watchdog;->addThread(Landroid/os/Handler;J)V
+SPLcom/android/server/Watchdog;->getInstance()Lcom/android/server/Watchdog;
+SPLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$y4b5S_CLdUbDV0ejaQDagLXGZRg;-><init>()V
+SPLcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$y4b5S_CLdUbDV0ejaQDagLXGZRg;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
+SPLcom/android/server/am/-$$Lambda$RecentTasks$NgzE6eN0wIO1cgLW7RzciPDBTHk;-><init>()V
+SPLcom/android/server/am/-$$Lambda$RunningTasks$BGar3HlUsTw-0HzSmfkEWly0moY;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$1RAH1a7gRlnrDczBty2_cTiNlBI;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$3Qs2duXCIzQ1W3uon7k5iYUmOy8;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$5xMsPmGMl_n12-F1m2p9OBuXGrA;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$FNdlAMBaRkRCa4U_pc-uamD9VHw;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$IPqcWaWHIL4UnZEYJhAve5H7KmE;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$K9kaSj6_p5pzfyRh9i93xiC9T3s;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$Ln9-GPCsfrWRlWBInk_Po_Uv-_U;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$O2UuB84QeMcZfsRHiuiFSTwwWHY;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$YDk9fnP8p2R_OweiU9rSGaheQeE;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$YVmGNqlD5lzQCN49aly8kWWz1po;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$a1rNhcYLIsgLeCng0_osaimgbqE;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$bteC39aBoUFmJeWf3dk2BX1xZ6k;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$d9Depygk2x7Vm_pl1RSk9_SSjvA;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$grn5FwM5ofT98exjpSvrJhz-e7s;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$iVGVcx2Ee37igl6ebl_htq_WO9o;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$kftD881t3KfWCASQEbeTkieVI2M;-><init>()V
+SPLcom/android/server/am/-$$Lambda$TaskChangeNotificationController$sw023kIrIGSeLwYwKC0ioKX3zEA;-><init>()V
+SPLcom/android/server/am/ActiveServices$1;-><init>(Lcom/android/server/am/ActiveServices;)V
+SPLcom/android/server/am/ActiveServices;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/ActivityLaunchParamsModifier;-><init>(Lcom/android/server/am/ActivityStackSupervisor;)V
+SPLcom/android/server/am/ActivityManagerConstants;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;)V
+SPLcom/android/server/am/ActivityManagerConstants;->computeEmptyProcessLimit(I)I
+SPLcom/android/server/am/ActivityManagerConstants;->updateMaxCachedProcesses()V
+SPLcom/android/server/am/ActivityManagerService$1;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/ActivityManagerService$2;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/ActivityManagerService$3;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+SPLcom/android/server/am/ActivityManagerService$5;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/lang/String;)V
+SPLcom/android/server/am/ActivityManagerService$5;->run()V
+SPLcom/android/server/am/ActivityManagerService$HiddenApiSettings;-><init>(Landroid/os/Handler;Landroid/content/Context;)V
+SPLcom/android/server/am/ActivityManagerService$Injector;-><init>()V
+SPLcom/android/server/am/ActivityManagerService$Injector;->getAppOpsService(Ljava/io/File;Landroid/os/Handler;)Lcom/android/server/AppOpsService;
+SPLcom/android/server/am/ActivityManagerService$Injector;->getUiHandler(Lcom/android/server/am/ActivityManagerService;)Landroid/os/Handler;
+SPLcom/android/server/am/ActivityManagerService$IntentFirewallInterface;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/ActivityManagerService$IntentFirewallInterface;->getAMSLock()Ljava/lang/Object;
+SPLcom/android/server/am/ActivityManagerService$KillHandler;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+SPLcom/android/server/am/ActivityManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/am/ActivityManagerService$Lifecycle;->getService()Lcom/android/server/am/ActivityManagerService;
+SPLcom/android/server/am/ActivityManagerService$Lifecycle;->onBootPhase(I)V
+SPLcom/android/server/am/ActivityManagerService$Lifecycle;->onStart()V
+SPLcom/android/server/am/ActivityManagerService$LocalService;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/ActivityManagerService$MainHandler;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+SPLcom/android/server/am/ActivityManagerService$UiHandler;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;-><init>()V
+SPLcom/android/server/am/ActivityManagerService$UpdateConfigurationResult;-><init>(Lcom/android/server/am/ActivityManagerService$1;)V
+SPLcom/android/server/am/ActivityManagerService;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/am/ActivityManagerService;->access$1300(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/ActivityManagerService;->createRecentTasks()Lcom/android/server/am/RecentTasks;
+SPLcom/android/server/am/ActivityManagerService;->createStackSupervisor()Lcom/android/server/am/ActivityStackSupervisor;
+SPLcom/android/server/am/ActivityManagerService;->initPowerManagement()V
+SPLcom/android/server/am/ActivityManagerService;->requestPssAllProcsLocked(JZZ)V
+SPLcom/android/server/am/ActivityManagerService;->setInstaller(Lcom/android/server/pm/Installer;)V
+SPLcom/android/server/am/ActivityManagerService;->setSystemServiceManager(Lcom/android/server/SystemServiceManager;)V
+SPLcom/android/server/am/ActivityManagerService;->start()V
+SPLcom/android/server/am/ActivityMetricsLogger$H;-><init>(Lcom/android/server/am/ActivityMetricsLogger;Landroid/os/Looper;)V
+SPLcom/android/server/am/ActivityMetricsLogger;-><init>(Lcom/android/server/am/ActivityStackSupervisor;Landroid/content/Context;Landroid/os/Looper;)V
+SPLcom/android/server/am/ActivityStackSupervisor$ActivityStackSupervisorHandler;-><init>(Lcom/android/server/am/ActivityStackSupervisor;Landroid/os/Looper;)V
+SPLcom/android/server/am/ActivityStackSupervisor$FindTaskResult;-><init>()V
+SPLcom/android/server/am/ActivityStackSupervisor;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Looper;)V
+SPLcom/android/server/am/ActivityStackSupervisor;->createRunningTasks()Lcom/android/server/am/RunningTasks;
+SPLcom/android/server/am/ActivityStackSupervisor;->getChildCount()I
+SPLcom/android/server/am/ActivityStackSupervisor;->initPowerManagement()V
+SPLcom/android/server/am/ActivityStackSupervisor;->initialize()V
+SPLcom/android/server/am/ActivityStackSupervisor;->setRecentTasks(Lcom/android/server/am/RecentTasks;)V
+SPLcom/android/server/am/ActivityStartController$StartHandler;-><init>(Lcom/android/server/am/ActivityStartController;Landroid/os/Looper;)V
+SPLcom/android/server/am/ActivityStartController;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/ActivityStartController;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;Lcom/android/server/am/ActivityStarter$Factory;)V
+SPLcom/android/server/am/ActivityStartInterceptor;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;)V
+SPLcom/android/server/am/ActivityStartInterceptor;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;Landroid/content/Context;Lcom/android/server/am/UserController;)V
+SPLcom/android/server/am/ActivityStarter$DefaultFactory;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;Lcom/android/server/am/ActivityStartInterceptor;)V
+SPLcom/android/server/am/ActivityStarter$DefaultFactory;->setController(Lcom/android/server/am/ActivityStartController;)V
+SPLcom/android/server/am/AppErrors;-><init>(Landroid/content/Context;Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/AppWarnings$ConfigHandler;-><init>(Lcom/android/server/am/AppWarnings;Landroid/os/Looper;)V
+SPLcom/android/server/am/AppWarnings$UiHandler;-><init>(Lcom/android/server/am/AppWarnings;Landroid/os/Looper;)V
+SPLcom/android/server/am/AppWarnings;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/content/Context;Landroid/os/Handler;Landroid/os/Handler;Ljava/io/File;)V
+SPLcom/android/server/am/AppWarnings;->readConfigFromFileAmsThread()V
+SPLcom/android/server/am/BatteryExternalStatsWorker$1;-><init>(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+SPLcom/android/server/am/BatteryExternalStatsWorker$2;-><init>(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+SPLcom/android/server/am/BatteryExternalStatsWorker$2;->run()V
+SPLcom/android/server/am/BatteryExternalStatsWorker;-><init>(Landroid/content/Context;Lcom/android/internal/os/BatteryStatsImpl;)V
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$000(Lcom/android/server/am/BatteryExternalStatsWorker;)I
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$002(Lcom/android/server/am/BatteryExternalStatsWorker;I)I
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$100(Lcom/android/server/am/BatteryExternalStatsWorker;)Ljava/lang/String;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$1000(Lcom/android/server/am/BatteryExternalStatsWorker;)Lcom/android/internal/os/BatteryStatsImpl;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$102(Lcom/android/server/am/BatteryExternalStatsWorker;Ljava/lang/String;)Ljava/lang/String;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$1102(Lcom/android/server/am/BatteryExternalStatsWorker;J)J
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$200(Lcom/android/server/am/BatteryExternalStatsWorker;)Landroid/util/IntArray;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$300(Lcom/android/server/am/BatteryExternalStatsWorker;)Z
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$400(Lcom/android/server/am/BatteryExternalStatsWorker;)Z
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$500(Lcom/android/server/am/BatteryExternalStatsWorker;)Z
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$502(Lcom/android/server/am/BatteryExternalStatsWorker;Z)Z
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$602(Lcom/android/server/am/BatteryExternalStatsWorker;Ljava/util/concurrent/Future;)Ljava/util/concurrent/Future;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$700(Lcom/android/server/am/BatteryExternalStatsWorker;)V
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$800(Lcom/android/server/am/BatteryExternalStatsWorker;)Ljava/lang/Object;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->access$900(Lcom/android/server/am/BatteryExternalStatsWorker;Ljava/lang/String;IZZZ)V
+SPLcom/android/server/am/BatteryExternalStatsWorker;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->cancelCpuSyncDueToWakelockChange()V
+SPLcom/android/server/am/BatteryExternalStatsWorker;->cancelSyncDueToBatteryLevelChangeLocked()V
+SPLcom/android/server/am/BatteryExternalStatsWorker;->lambda$new$0(Ljava/lang/Runnable;)Ljava/lang/Thread;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->scheduleSyncLocked(Ljava/lang/String;I)Ljava/util/concurrent/Future;
+SPLcom/android/server/am/BatteryExternalStatsWorker;->scheduleWrite()Ljava/util/concurrent/Future;
+SPLcom/android/server/am/BatteryStatsService$1;-><init>(Lcom/android/server/am/BatteryStatsService;)V
+SPLcom/android/server/am/BatteryStatsService$LocalService;-><init>(Lcom/android/server/am/BatteryStatsService;)V
+SPLcom/android/server/am/BatteryStatsService$LocalService;-><init>(Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService$1;)V
+SPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;-><init>(Lcom/android/server/am/BatteryStatsService;)V
+SPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->run()V
+SPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->waitWakeup()Ljava/lang/String;
+SPLcom/android/server/am/BatteryStatsService;-><init>(Landroid/content/Context;Ljava/io/File;Landroid/os/Handler;)V
+SPLcom/android/server/am/BatteryStatsService;->fillLowPowerStats(Lcom/android/internal/os/RpmStats;)V
+SPLcom/android/server/am/BatteryStatsService;->initPowerManagement()V
+SPLcom/android/server/am/BatteryStatsService;->publish()V
+SPLcom/android/server/am/BatteryStatsService;->scheduleWriteToDisk()V
+SPLcom/android/server/am/BroadcastQueue$BroadcastHandler;-><init>(Lcom/android/server/am/BroadcastQueue;Landroid/os/Looper;)V
+SPLcom/android/server/am/BroadcastQueue;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;Ljava/lang/String;JZ)V
+SPLcom/android/server/am/ClientLifecycleManager;-><init>()V
+SPLcom/android/server/am/CompatModePackages$CompatHandler;-><init>(Lcom/android/server/am/CompatModePackages;Landroid/os/Looper;)V
+SPLcom/android/server/am/CompatModePackages;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/io/File;Landroid/os/Handler;)V
+SPLcom/android/server/am/InstrumentationReporter;-><init>()V
+SPLcom/android/server/am/KeyguardController;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;)V
+SPLcom/android/server/am/LaunchParamsController$LaunchParams;-><init>()V
+SPLcom/android/server/am/LaunchParamsController;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/LaunchParamsController;->registerDefaultModifiers(Lcom/android/server/am/ActivityStackSupervisor;)V
+SPLcom/android/server/am/LaunchParamsController;->registerModifier(Lcom/android/server/am/LaunchParamsController$LaunchParamsModifier;)V
+SPLcom/android/server/am/LaunchTimeTracker;-><init>()V
+SPLcom/android/server/am/LockTaskController;-><init>(Landroid/content/Context;Lcom/android/server/am/ActivityStackSupervisor;Landroid/os/Handler;)V
+SPLcom/android/server/am/PendingRemoteAnimationRegistry;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;)V
+SPLcom/android/server/am/ProcessList;-><init>()V
+SPLcom/android/server/am/ProcessList;->updateOomLevels(IIZ)V
+SPLcom/android/server/am/ProcessStatsService$1;-><init>(Lcom/android/server/am/ProcessStatsService;)V
+SPLcom/android/server/am/ProcessStatsService;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/io/File;)V
+SPLcom/android/server/am/ProcessStatsService;->isMemFactorLowered()Z
+SPLcom/android/server/am/ProcessStatsService;->updateFile()V
+SPLcom/android/server/am/ProviderMap;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/RecentTasks;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;)V
+SPLcom/android/server/am/RecentTasks;->loadParametersFromResources(Landroid/content/res/Resources;)V
+SPLcom/android/server/am/RecentTasks;->registerCallback(Lcom/android/server/am/RecentTasks$Callbacks;)V
+SPLcom/android/server/am/RunningTasks;-><init>()V
+SPLcom/android/server/am/TaskChangeNotificationController$MainHandler;-><init>(Lcom/android/server/am/TaskChangeNotificationController;Landroid/os/Looper;)V
+SPLcom/android/server/am/TaskChangeNotificationController;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityStackSupervisor;Landroid/os/Handler;)V
+SPLcom/android/server/am/TaskLaunchParamsModifier;-><init>()V
+SPLcom/android/server/am/TaskPersister$LazyTaskWriterThread;-><init>(Lcom/android/server/am/TaskPersister;Ljava/lang/String;)V
+SPLcom/android/server/am/TaskPersister;-><init>(Ljava/io/File;Lcom/android/server/am/ActivityStackSupervisor;Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/RecentTasks;)V
+SPLcom/android/server/am/TaskRecord$TaskActivitiesReport;-><init>()V
+SPLcom/android/server/am/UserController$Injector;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/UserController$Injector;->getContext()Landroid/content/Context;
+SPLcom/android/server/am/UserController$Injector;->getHandler(Landroid/os/Handler$Callback;)Landroid/os/Handler;
+SPLcom/android/server/am/UserController$Injector;->getLockPatternUtils()Lcom/android/internal/widget/LockPatternUtils;
+SPLcom/android/server/am/UserController$Injector;->getUiHandler(Landroid/os/Handler$Callback;)Landroid/os/Handler;
+SPLcom/android/server/am/UserController$UserProgressListener;-><init>()V
+SPLcom/android/server/am/UserController$UserProgressListener;-><init>(Lcom/android/server/am/UserController$1;)V
+SPLcom/android/server/am/UserController;-><init>(Lcom/android/server/am/ActivityManagerService;)V
+SPLcom/android/server/am/UserController;-><init>(Lcom/android/server/am/UserController$Injector;)V
+SPLcom/android/server/am/UserController;->updateStartedUserArrayLU()V
+SPLcom/android/server/am/UserState;-><init>(Landroid/os/UserHandle;)V
+SPLcom/android/server/am/VrController$1;-><init>(Lcom/android/server/am/VrController;)V
+SPLcom/android/server/am/VrController;-><init>(Ljava/lang/Object;)V
+SPLcom/android/server/display/-$$Lambda$VirtualDisplayAdapter$PFyqe-aYIEBicSVtuy5lL_bT8B0;-><init>()V
+SPLcom/android/server/display/DisplayAdapter$1;-><init>(Lcom/android/server/display/DisplayAdapter;Lcom/android/server/display/DisplayDevice;I)V
+SPLcom/android/server/display/DisplayAdapter$1;->run()V
+SPLcom/android/server/display/DisplayAdapter$2;-><init>(Lcom/android/server/display/DisplayAdapter;)V
+SPLcom/android/server/display/DisplayAdapter$2;->run()V
+SPLcom/android/server/display/DisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Ljava/lang/String;)V
+SPLcom/android/server/display/DisplayAdapter;->access$000(Lcom/android/server/display/DisplayAdapter;)Lcom/android/server/display/DisplayAdapter$Listener;
+SPLcom/android/server/display/DisplayAdapter;->createMode(IIF)Landroid/view/Display$Mode;
+SPLcom/android/server/display/DisplayAdapter;->getHandler()Landroid/os/Handler;
+SPLcom/android/server/display/DisplayAdapter;->registerLocked()V
+SPLcom/android/server/display/DisplayAdapter;->sendDisplayDeviceEventLocked(Lcom/android/server/display/DisplayDevice;I)V
+SPLcom/android/server/display/DisplayAdapter;->sendTraversalRequestLocked()V
+SPLcom/android/server/display/DisplayDevice;-><init>(Lcom/android/server/display/DisplayAdapter;Landroid/os/IBinder;Ljava/lang/String;)V
+SPLcom/android/server/display/DisplayDevice;->getDisplayTokenLocked()Landroid/os/IBinder;
+SPLcom/android/server/display/DisplayDevice;->getUniqueId()Ljava/lang/String;
+SPLcom/android/server/display/DisplayDeviceInfo;-><init>()V
+SPLcom/android/server/display/DisplayDeviceInfo;->diff(Lcom/android/server/display/DisplayDeviceInfo;)I
+SPLcom/android/server/display/DisplayDeviceInfo;->equals(Lcom/android/server/display/DisplayDeviceInfo;)Z
+SPLcom/android/server/display/DisplayDeviceInfo;->equals(Ljava/lang/Object;)Z
+SPLcom/android/server/display/DisplayDeviceInfo;->flagsToString(I)Ljava/lang/String;
+SPLcom/android/server/display/DisplayDeviceInfo;->toString()Ljava/lang/String;
+SPLcom/android/server/display/DisplayDeviceInfo;->touchToString(I)Ljava/lang/String;
+SPLcom/android/server/display/DisplayManagerService$BinderService;-><init>(Lcom/android/server/display/DisplayManagerService;)V
+SPLcom/android/server/display/DisplayManagerService$CallbackRecord;-><init>(Lcom/android/server/display/DisplayManagerService;ILandroid/hardware/display/IDisplayManagerCallback;)V
+SPLcom/android/server/display/DisplayManagerService$DisplayAdapterListener;-><init>(Lcom/android/server/display/DisplayManagerService;)V
+SPLcom/android/server/display/DisplayManagerService$DisplayAdapterListener;-><init>(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$1;)V
+SPLcom/android/server/display/DisplayManagerService$DisplayAdapterListener;->onDisplayDeviceEvent(Lcom/android/server/display/DisplayDevice;I)V
+SPLcom/android/server/display/DisplayManagerService$DisplayAdapterListener;->onTraversalRequested()V
+SPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;-><init>(Lcom/android/server/display/DisplayManagerService;Landroid/os/Looper;)V
+SPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;->handleMessage(Landroid/os/Message;)V
+SPLcom/android/server/display/DisplayManagerService$Injector;-><init>()V
+SPLcom/android/server/display/DisplayManagerService$Injector;->getDefaultDisplayDelayTimeout()J
+SPLcom/android/server/display/DisplayManagerService$Injector;->getVirtualDisplayAdapter(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;)Lcom/android/server/display/VirtualDisplayAdapter;
+SPLcom/android/server/display/DisplayManagerService$LocalService;-><init>(Lcom/android/server/display/DisplayManagerService;)V
+SPLcom/android/server/display/DisplayManagerService$LocalService;-><init>(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService$1;)V
+SPLcom/android/server/display/DisplayManagerService$SyncRoot;-><init>()V
+SPLcom/android/server/display/DisplayManagerService;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/display/DisplayManagerService;-><init>(Landroid/content/Context;Lcom/android/server/display/DisplayManagerService$Injector;)V
+SPLcom/android/server/display/DisplayManagerService;->access$1500(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayDevice;)V
+SPLcom/android/server/display/DisplayManagerService;->access$1600(Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayDevice;)V
+SPLcom/android/server/display/DisplayManagerService;->access$1800(Lcom/android/server/display/DisplayManagerService;Z)V
+SPLcom/android/server/display/DisplayManagerService;->access$200(Lcom/android/server/display/DisplayManagerService;)V
+SPLcom/android/server/display/DisplayManagerService;->access$2300(Lcom/android/server/display/DisplayManagerService;Landroid/hardware/display/IDisplayManagerCallback;I)V
+SPLcom/android/server/display/DisplayManagerService;->access$400(Lcom/android/server/display/DisplayManagerService;II)V
+SPLcom/android/server/display/DisplayManagerService;->addLogicalDisplayLocked(Lcom/android/server/display/DisplayDevice;)Lcom/android/server/display/LogicalDisplay;
+SPLcom/android/server/display/DisplayManagerService;->assignDisplayIdLocked(Z)I
+SPLcom/android/server/display/DisplayManagerService;->assignLayerStackLocked(I)I
+SPLcom/android/server/display/DisplayManagerService;->configureColorModeLocked(Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/DisplayDevice;)V
+SPLcom/android/server/display/DisplayManagerService;->deliverDisplayEvent(II)V
+SPLcom/android/server/display/DisplayManagerService;->getFloatArray(Landroid/content/res/TypedArray;)[F
+SPLcom/android/server/display/DisplayManagerService;->handleDisplayDeviceAdded(Lcom/android/server/display/DisplayDevice;)V
+SPLcom/android/server/display/DisplayManagerService;->handleDisplayDeviceAddedLocked(Lcom/android/server/display/DisplayDevice;)V
+SPLcom/android/server/display/DisplayManagerService;->handleDisplayDeviceChanged(Lcom/android/server/display/DisplayDevice;)V
+SPLcom/android/server/display/DisplayManagerService;->loadStableDisplayValuesLocked()V
+SPLcom/android/server/display/DisplayManagerService;->onBootPhase(I)V
+SPLcom/android/server/display/DisplayManagerService;->onStart()V
+SPLcom/android/server/display/DisplayManagerService;->recordStableDisplayStatsIfNeededLocked(Lcom/android/server/display/LogicalDisplay;)V
+SPLcom/android/server/display/DisplayManagerService;->registerDefaultDisplayAdapters()V
+SPLcom/android/server/display/DisplayManagerService;->registerDisplayAdapterLocked(Lcom/android/server/display/DisplayAdapter;)V
+SPLcom/android/server/display/DisplayManagerService;->scheduleTraversalLocked(Z)V
+SPLcom/android/server/display/DisplayManagerService;->sendDisplayEventLocked(II)V
+SPLcom/android/server/display/DisplayManagerService;->updateDisplayStateLocked(Lcom/android/server/display/DisplayDevice;)Ljava/lang/Runnable;
+SPLcom/android/server/display/DisplayManagerService;->updateLogicalDisplaysLocked()Z
+SPLcom/android/server/display/DisplayTransformManager;-><init>()V
+SPLcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;-><init>(Landroid/view/SurfaceControl$PhysicalDisplayInfo;)V
+SPLcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;->hasMatchingMode(Landroid/view/SurfaceControl$PhysicalDisplayInfo;)Z
+SPLcom/android/server/display/LocalDisplayAdapter$HotplugDisplayEventReceiver;-><init>(Lcom/android/server/display/LocalDisplayAdapter;Landroid/os/Looper;)V
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;-><init>(Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;IIZIILandroid/os/IBinder;)V
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->run()V
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayBrightness(I)V
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayState(I)V
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;-><init>(Lcom/android/server/display/LocalDisplayAdapter;Landroid/os/IBinder;I[Landroid/view/SurfaceControl$PhysicalDisplayInfo;I[II)V
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->access$000(Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;)Lcom/android/server/lights/Light;
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->access$100(Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;)Z
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->applyPendingDisplayDeviceInfoChangesLocked()V
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findDisplayInfoIndexLocked(I)I
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->findDisplayModeRecord(Landroid/view/SurfaceControl$PhysicalDisplayInfo;)Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->hasStableUniqueId()Z
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->requestDisplayStateLocked(II)Ljava/lang/Runnable;
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateColorModesLocked([II)Z
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updateDeviceInfoLocked()V
+SPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updatePhysicalDisplayInfoLocked([Landroid/view/SurfaceControl$PhysicalDisplayInfo;I[II)Z
+SPLcom/android/server/display/LocalDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;)V
+SPLcom/android/server/display/LocalDisplayAdapter;->getOverlayContext()Landroid/content/Context;
+SPLcom/android/server/display/LocalDisplayAdapter;->getPowerModeForState(I)I
+SPLcom/android/server/display/LocalDisplayAdapter;->registerLocked()V
+SPLcom/android/server/display/LocalDisplayAdapter;->tryConnectDisplayLocked(I)V
+SPLcom/android/server/display/LogicalDisplay;-><init>(IILcom/android/server/display/DisplayDevice;)V
+SPLcom/android/server/display/LogicalDisplay;->getPrimaryDisplayDeviceLocked()Lcom/android/server/display/DisplayDevice;
+SPLcom/android/server/display/LogicalDisplay;->isValidLocked()Z
+SPLcom/android/server/display/LogicalDisplay;->setRequestedColorModeLocked(I)V
+SPLcom/android/server/display/LogicalDisplay;->updateLocked(Ljava/util/List;)V
+SPLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;-><init>()V
+SPLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->loadConfigurationFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/hardware/display/BrightnessConfiguration;
+SPLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->loadCurveFromXml(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/Pair;
+SPLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->loadFloat(Ljava/lang/String;)F
+SPLcom/android/server/display/PersistentDataStore$BrightnessConfigurations;->loadFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/display/PersistentDataStore$Injector;-><init>()V
+SPLcom/android/server/display/PersistentDataStore$Injector;->openRead()Ljava/io/InputStream;
+SPLcom/android/server/display/PersistentDataStore$StableDeviceValues;-><init>()V
+SPLcom/android/server/display/PersistentDataStore$StableDeviceValues;-><init>(Lcom/android/server/display/PersistentDataStore$1;)V
+SPLcom/android/server/display/PersistentDataStore$StableDeviceValues;->access$100(Lcom/android/server/display/PersistentDataStore$StableDeviceValues;)Landroid/graphics/Point;
+SPLcom/android/server/display/PersistentDataStore$StableDeviceValues;->getDisplaySize()Landroid/graphics/Point;
+SPLcom/android/server/display/PersistentDataStore$StableDeviceValues;->loadFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/display/PersistentDataStore$StableDeviceValues;->loadIntValue(Lorg/xmlpull/v1/XmlPullParser;)I
+SPLcom/android/server/display/PersistentDataStore;-><init>()V
+SPLcom/android/server/display/PersistentDataStore;-><init>(Lcom/android/server/display/PersistentDataStore$Injector;)V
+SPLcom/android/server/display/PersistentDataStore;->clearState()V
+SPLcom/android/server/display/PersistentDataStore;->getColorMode(Lcom/android/server/display/DisplayDevice;)I
+SPLcom/android/server/display/PersistentDataStore;->getDisplayState(Ljava/lang/String;Z)Lcom/android/server/display/PersistentDataStore$DisplayState;
+SPLcom/android/server/display/PersistentDataStore;->getStableDisplaySize()Landroid/graphics/Point;
+SPLcom/android/server/display/PersistentDataStore;->load()V
+SPLcom/android/server/display/PersistentDataStore;->loadDisplaysFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/display/PersistentDataStore;->loadFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/display/PersistentDataStore;->loadIfNeeded()V
+SPLcom/android/server/display/PersistentDataStore;->loadRememberedWifiDisplaysFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/display/VirtualDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;)V
+SPLcom/android/server/display/VirtualDisplayAdapter;-><init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Landroid/content/Context;Landroid/os/Handler;Lcom/android/server/display/DisplayAdapter$Listener;Lcom/android/server/display/VirtualDisplayAdapter$SurfaceControlDisplayFactory;)V
+SPLcom/android/server/display/VirtualDisplayAdapter;->registerLocked()V
+SPLcom/android/server/firewall/AndFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/CategoryFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/FilterFactory;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/FilterFactory;->getTagName()Ljava/lang/String;
+SPLcom/android/server/firewall/IntentFirewall$FirewallHandler;-><init>(Lcom/android/server/firewall/IntentFirewall;Landroid/os/Looper;)V
+SPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;-><init>()V
+SPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;-><init>(Lcom/android/server/firewall/IntentFirewall$1;)V
+SPLcom/android/server/firewall/IntentFirewall$RuleObserver;-><init>(Lcom/android/server/firewall/IntentFirewall;Ljava/io/File;)V
+SPLcom/android/server/firewall/IntentFirewall;-><init>(Lcom/android/server/firewall/IntentFirewall$AMSInterface;Landroid/os/Handler;)V
+SPLcom/android/server/firewall/IntentFirewall;->getRulesDir()Ljava/io/File;
+SPLcom/android/server/firewall/IntentFirewall;->readRulesDir(Ljava/io/File;)V
+SPLcom/android/server/firewall/NotFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/OrFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/PortFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/SenderFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/SenderFilter$2;-><init>()V
+SPLcom/android/server/firewall/SenderFilter$3;-><init>()V
+SPLcom/android/server/firewall/SenderFilter$4;-><init>()V
+SPLcom/android/server/firewall/SenderFilter$5;-><init>()V
+SPLcom/android/server/firewall/SenderPackageFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/SenderPermissionFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$10;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$1;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$2;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$3;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$4;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$5;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$6;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$7;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$8;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$9;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/firewall/StringFilter$ValueProvider;-><init>(Ljava/lang/String;)V
+SPLcom/android/server/lights/Light;-><init>()V
+SPLcom/android/server/lights/LightsManager;-><init>()V
+SPLcom/android/server/lights/LightsService$1;-><init>(Lcom/android/server/lights/LightsService;)V
+SPLcom/android/server/lights/LightsService$1;->getLight(I)Lcom/android/server/lights/Light;
+SPLcom/android/server/lights/LightsService$2;-><init>(Lcom/android/server/lights/LightsService;)V
+SPLcom/android/server/lights/LightsService$LightImpl;-><init>(Lcom/android/server/lights/LightsService;I)V
+SPLcom/android/server/lights/LightsService$LightImpl;-><init>(Lcom/android/server/lights/LightsService;ILcom/android/server/lights/LightsService$1;)V
+SPLcom/android/server/lights/LightsService$LightImpl;->setBrightness(I)V
+SPLcom/android/server/lights/LightsService$LightImpl;->setBrightness(II)V
+SPLcom/android/server/lights/LightsService$LightImpl;->setLightLocked(IIIII)V
+SPLcom/android/server/lights/LightsService$LightImpl;->shouldBeInLowPersistenceMode()Z
+SPLcom/android/server/lights/LightsService;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/lights/LightsService;->onBootPhase(I)V
+SPLcom/android/server/lights/LightsService;->onStart()V
+SPLcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/os/DeviceIdentifiersPolicyService;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/os/DeviceIdentifiersPolicyService;->onStart()V
+SPLcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;-><init>(Lcom/android/server/pm/ParallelPackageParser;Ljava/io/File;I)V
+SPLcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;->run()V
+SPLcom/android/server/pm/AbstractStatsBase;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
+SPLcom/android/server/pm/CompilerStats;-><init>()V
+SPLcom/android/server/pm/Installer$1;-><init>(Lcom/android/server/pm/Installer;)V
+SPLcom/android/server/pm/Installer;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/pm/Installer;-><init>(Landroid/content/Context;Z)V
+SPLcom/android/server/pm/Installer;->assertValidInstructionSet(Ljava/lang/String;)V
+SPLcom/android/server/pm/Installer;->checkBeforeRemote()Z
+SPLcom/android/server/pm/Installer;->clearAppProfiles(Ljava/lang/String;Ljava/lang/String;)V
+SPLcom/android/server/pm/Installer;->connect()V
+SPLcom/android/server/pm/Installer;->invalidateMounts()V
+SPLcom/android/server/pm/Installer;->onStart()V
+SPLcom/android/server/pm/Installer;->rmPackageDir(Ljava/lang/String;)V
+SPLcom/android/server/pm/Installer;->rmdex(Ljava/lang/String;Ljava/lang/String;)V
+SPLcom/android/server/pm/InstantAppRegistry$CookiePersistence;-><init>(Lcom/android/server/pm/InstantAppRegistry;Landroid/os/Looper;)V
+SPLcom/android/server/pm/InstantAppRegistry;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/InstructionSets;->getAppDexInstructionSets(Lcom/android/server/pm/PackageSetting;)[Ljava/lang/String;
+SPLcom/android/server/pm/InstructionSets;->getDexCodeInstructionSet(Ljava/lang/String;)Ljava/lang/String;
+SPLcom/android/server/pm/InstructionSets;->getDexCodeInstructionSets([Ljava/lang/String;)[Ljava/lang/String;
+SPLcom/android/server/pm/KeySetHandle;-><init>(JI)V
+SPLcom/android/server/pm/KeySetHandle;->getRefCountLPr()I
+SPLcom/android/server/pm/KeySetHandle;->setRefCountLPw(I)V
+SPLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;-><init>(Lcom/android/server/pm/KeySetManagerService;JILjava/security/PublicKey;)V
+SPLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;-><init>(Lcom/android/server/pm/KeySetManagerService;JILjava/security/PublicKey;Lcom/android/server/pm/KeySetManagerService$1;)V
+SPLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;->getKey()Ljava/security/PublicKey;
+SPLcom/android/server/pm/KeySetManagerService$PublicKeyHandle;->incrRefCountLPw()V
+SPLcom/android/server/pm/KeySetManagerService;-><init>(Landroid/util/ArrayMap;)V
+SPLcom/android/server/pm/KeySetManagerService;->addRefCountsFromSavedPackagesLPw(Landroid/util/ArrayMap;)V
+SPLcom/android/server/pm/KeySetManagerService;->addScannedPackageLPw(Landroid/content/pm/PackageParser$Package;)V
+SPLcom/android/server/pm/KeySetManagerService;->addSigningKeySetToPackageLPw(Lcom/android/server/pm/PackageSetting;Landroid/util/ArraySet;)V
+SPLcom/android/server/pm/KeySetManagerService;->assertScannedPackageValid(Landroid/content/pm/PackageParser$Package;)V
+SPLcom/android/server/pm/KeySetManagerService;->readKeySetsLPw(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;)V
+SPLcom/android/server/pm/KeySetManagerService;->readKeysLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/pm/KeySetManagerService;->readPublicKeyLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/pm/KeySetManagerService;->shouldCheckUpgradeKeySetLocked(Lcom/android/server/pm/PackageSettingBase;I)Z
+SPLcom/android/server/pm/PackageDexOptimizer;-><init>(Lcom/android/server/pm/Installer;Ljava/lang/Object;Landroid/content/Context;Ljava/lang/String;)V
+SPLcom/android/server/pm/PackageInstallerService$1;-><init>()V
+SPLcom/android/server/pm/PackageInstallerService;->isStageName(Ljava/lang/String;)Z
+SPLcom/android/server/pm/PackageKeySetData;->setProperSigningKeySet(J)V
+SPLcom/android/server/pm/PackageManagerException;-><init>(ILjava/lang/String;)V
+SPLcom/android/server/pm/PackageManagerService$11;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$1;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$2;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$3;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$5;-><init>()V
+SPLcom/android/server/pm/PackageManagerService$6;-><init>()V
+SPLcom/android/server/pm/PackageManagerService$ActivityIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$DefaultContainerConnection;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$FileInstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
+SPLcom/android/server/pm/PackageManagerService$FileInstallArgs;->cleanUp()Z
+SPLcom/android/server/pm/PackageManagerService$FileInstallArgs;->cleanUpResourcesLI()V
+SPLcom/android/server/pm/PackageManagerService$InstallArgs;-><init>(Lcom/android/server/pm/PackageManagerService$OriginInfo;Lcom/android/server/pm/PackageManagerService$MoveInfo;Landroid/content/pm/IPackageInstallObserver2;ILjava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;ILandroid/content/pm/PackageParser$SigningDetails;I)V
+SPLcom/android/server/pm/PackageManagerService$MoveCallbacks;-><init>(Landroid/os/Looper;)V
+SPLcom/android/server/pm/PackageManagerService$OnPermissionChangeListeners;-><init>(Landroid/os/Looper;)V
+SPLcom/android/server/pm/PackageManagerService$OriginInfo;-><init>(Ljava/io/File;ZZ)V
+SPLcom/android/server/pm/PackageManagerService$OriginInfo;->fromNothing()Lcom/android/server/pm/PackageManagerService$OriginInfo;
+SPLcom/android/server/pm/PackageManagerService$PackageHandler;-><init>(Lcom/android/server/pm/PackageManagerService;Landroid/os/Looper;)V
+SPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$1;)V
+SPLcom/android/server/pm/PackageManagerService$PackageParserCallback;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getOverlayApks(Ljava/lang/String;)[Ljava/lang/String;
+SPLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getOverlayPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+SPLcom/android/server/pm/PackageManagerService$PackageParserCallback;->getStaticOverlayPaths(Ljava/util/List;Ljava/lang/String;)[Ljava/lang/String;
+SPLcom/android/server/pm/PackageManagerService$PackageParserCallback;->hasFeature(Ljava/lang/String;)Z
+SPLcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;->findStaticOverlayPackages()V
+SPLcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;->getStaticOverlayPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+SPLcom/android/server/pm/PackageManagerService$PendingPackageBroadcasts;-><init>()V
+SPLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$1;)V
+SPLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->addProvider(Landroid/content/pm/PackageParser$Provider;)V
+SPLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+SPLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->newArray(I)[Landroid/content/pm/PackageParser$ProviderIntentInfo;
+SPLcom/android/server/pm/PackageManagerService$ProviderIntentResolver;->removeProvider(Landroid/content/pm/PackageParser$Provider;)V
+SPLcom/android/server/pm/PackageManagerService$ScanRequest;-><init>(Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/SharedUserSetting;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;IIZLandroid/os/UserHandle;)V
+SPLcom/android/server/pm/PackageManagerService$ScanResult;-><init>(ZLcom/android/server/pm/PackageSetting;Ljava/util/List;)V
+SPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;)V
+SPLcom/android/server/pm/PackageManagerService$ServiceIntentResolver;-><init>(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService$1;)V
+SPLcom/android/server/pm/PackageManagerService$SharedLibraryEntry;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JILjava/lang/String;J)V
+SPLcom/android/server/pm/PackageManagerService;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+SPLcom/android/server/pm/PackageManagerService;->access$2600()Ljava/util/Set;
+SPLcom/android/server/pm/PackageManagerService;->access$2700(Lcom/android/server/pm/PackageManagerService;)Z
+SPLcom/android/server/pm/PackageManagerService;->access$2800(Lcom/android/server/pm/PackageManagerService;)Ljava/util/List;
+SPLcom/android/server/pm/PackageManagerService;->addForInitLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+SPLcom/android/server/pm/PackageManagerService;->addSharedLibraryLPw(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JILjava/lang/String;J)Z
+SPLcom/android/server/pm/PackageManagerService;->adjustScanFlags(ILcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/os/UserHandle;Landroid/content/pm/PackageParser$Package;)I
+SPLcom/android/server/pm/PackageManagerService;->assertPackageIsValid(Landroid/content/pm/PackageParser$Package;II)V
+SPLcom/android/server/pm/PackageManagerService;->calculateBundledApkRoot(Ljava/lang/String;)Ljava/lang/String;
+SPLcom/android/server/pm/PackageManagerService;->clearAppProfilesLIF(Landroid/content/pm/PackageParser$Package;I)V
+SPLcom/android/server/pm/PackageManagerService;->collectCertificatesLI(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;ZZ)V
+SPLcom/android/server/pm/PackageManagerService;->commitScanResultsLocked(Lcom/android/server/pm/PackageManagerService$ScanRequest;Lcom/android/server/pm/PackageManagerService$ScanResult;)V
+SPLcom/android/server/pm/PackageManagerService;->createInstallArgsForExisting(ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Lcom/android/server/pm/PackageManagerService$InstallArgs;
+SPLcom/android/server/pm/PackageManagerService;->deleteTempPackageFiles()V
+SPLcom/android/server/pm/PackageManagerService;->deriveCodePathName(Ljava/lang/String;)Ljava/lang/String;
+SPLcom/android/server/pm/PackageManagerService;->derivePackageAbi(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Z)V
+SPLcom/android/server/pm/PackageManagerService;->getDefaultDisplayMetrics(Landroid/content/Context;Landroid/util/DisplayMetrics;)V
+SPLcom/android/server/pm/PackageManagerService;->isCompatSignatureUpdateNeeded(Landroid/content/pm/PackageParser$Package;)Z
+SPLcom/android/server/pm/PackageManagerService;->isExternal(Lcom/android/server/pm/PackageSetting;)Z
+SPLcom/android/server/pm/PackageManagerService;->isMultiArch(Landroid/content/pm/ApplicationInfo;)Z
+SPLcom/android/server/pm/PackageManagerService;->isRecoverSignatureUpdateNeeded(Landroid/content/pm/PackageParser$Package;)Z
+SPLcom/android/server/pm/PackageManagerService;->isUpgrade()Z
+SPLcom/android/server/pm/PackageManagerService;->locationIsPrivileged(Ljava/lang/String;)Z
+SPLcom/android/server/pm/PackageManagerService;->main(Landroid/content/Context;Lcom/android/server/pm/Installer;ZZ)Lcom/android/server/pm/PackageManagerService;
+SPLcom/android/server/pm/PackageManagerService;->maybeClearProfilesForUpgradesLI(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;)V
+SPLcom/android/server/pm/PackageManagerService;->maybeThrowExceptionForMultiArchCopy(Ljava/lang/String;I)V
+SPLcom/android/server/pm/PackageManagerService;->packageFlagsToInstallFlags(Lcom/android/server/pm/PackageSetting;)I
+SPLcom/android/server/pm/PackageManagerService;->preparePackageParserCache(Z)Ljava/io/File;
+SPLcom/android/server/pm/PackageManagerService;->removeCodePathLI(Ljava/io/File;)V
+SPLcom/android/server/pm/PackageManagerService;->removeDexFiles(Ljava/util/List;[Ljava/lang/String;)V
+SPLcom/android/server/pm/PackageManagerService;->removePackageLI(Landroid/content/pm/PackageParser$Package;Z)V
+SPLcom/android/server/pm/PackageManagerService;->removePackageLI(Lcom/android/server/pm/PackageSetting;Z)V
+SPLcom/android/server/pm/PackageManagerService;->scanDirTracedLI(Ljava/io/File;IIJ)V
+SPLcom/android/server/pm/PackageManagerService;->scanPackageChildLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+SPLcom/android/server/pm/PackageManagerService;->scanPackageOnlyLI(Lcom/android/server/pm/PackageManagerService$ScanRequest;ZJ)Lcom/android/server/pm/PackageManagerService$ScanResult;
+SPLcom/android/server/pm/PackageManagerService;->setBundledAppAbi(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Ljava/lang/String;)V
+SPLcom/android/server/pm/PackageManagerService;->setBundledAppAbisAndRoots(Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/PackageSetting;)V
+SPLcom/android/server/pm/PackageManagerService;->setInstantAppForUser(Lcom/android/server/pm/PackageSetting;IZZ)V
+SPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->checkProperties()V
+SPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->getSystemPropertyName(I)Ljava/lang/String;
+SPLcom/android/server/pm/PackageManagerServiceCompilerMapping;->isFilterAllowedForReason(ILjava/lang/String;)Z
+SPLcom/android/server/pm/PackageManagerServiceUtils;->compareSignatures([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)I
+SPLcom/android/server/pm/PackageManagerServiceUtils;->compressedFileExists(Ljava/lang/String;)Z
+SPLcom/android/server/pm/PackageManagerServiceUtils;->deriveAbiOverride(Ljava/lang/String;Lcom/android/server/pm/PackageSetting;)Ljava/lang/String;
+SPLcom/android/server/pm/PackageManagerServiceUtils;->getCompressedFiles(Ljava/lang/String;)[Ljava/io/File;
+SPLcom/android/server/pm/PackageManagerServiceUtils;->getSettingsProblemFile()Ljava/io/File;
+SPLcom/android/server/pm/PackageManagerServiceUtils;->isApkVerificationForced(Lcom/android/server/pm/PackageSetting;)Z
+SPLcom/android/server/pm/PackageManagerServiceUtils;->logCriticalInfo(ILjava/lang/String;)V
+SPLcom/android/server/pm/PackageManagerServiceUtils;->verifySignatures(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$SigningDetails;ZZ)Z
+SPLcom/android/server/pm/PackageSetting;-><init>(Lcom/android/server/pm/PackageSetting;)V
+SPLcom/android/server/pm/PackageSetting;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JIILjava/lang/String;Ljava/util/List;I[Ljava/lang/String;[J)V
+SPLcom/android/server/pm/PackageSetting;->doCopy(Lcom/android/server/pm/PackageSetting;)V
+SPLcom/android/server/pm/PackageSetting;->getSharedUserId()I
+SPLcom/android/server/pm/PackageSetting;->isForwardLocked()Z
+SPLcom/android/server/pm/PackageSetting;->isPrivileged()Z
+SPLcom/android/server/pm/PackageSettingBase;-><init>(Lcom/android/server/pm/PackageSettingBase;Ljava/lang/String;)V
+SPLcom/android/server/pm/PackageSettingBase;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JIILjava/lang/String;Ljava/util/List;[Ljava/lang/String;[J)V
+SPLcom/android/server/pm/PackageSettingBase;->init(Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V
+SPLcom/android/server/pm/PackageSettingBase;->setEnabled(IILjava/lang/String;)V
+SPLcom/android/server/pm/PackageSettingBase;->setIntentFilterVerificationInfo(Landroid/content/pm/IntentFilterVerificationInfo;)V
+SPLcom/android/server/pm/PackageSettingBase;->setUserState(IJIZZZZZLjava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;Landroid/os/PersistableBundle;ZZLjava/lang/String;Landroid/util/ArraySet;Landroid/util/ArraySet;IIILjava/lang/String;)V
+SPLcom/android/server/pm/PackageSignatures;-><init>()V
+SPLcom/android/server/pm/PackageSignatures;->readXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/ArrayList;)V
+SPLcom/android/server/pm/PackageUsage;-><init>()V
+SPLcom/android/server/pm/ParallelPackageParser$ParseResult;-><init>()V
+SPLcom/android/server/pm/ParallelPackageParser;-><init>([Ljava/lang/String;ZLandroid/util/DisplayMetrics;Ljava/io/File;Landroid/content/pm/PackageParser$Callback;)V
+SPLcom/android/server/pm/ParallelPackageParser;->close()V
+SPLcom/android/server/pm/ParallelPackageParser;->lambda$submit$0(Lcom/android/server/pm/ParallelPackageParser;Ljava/io/File;I)V
+SPLcom/android/server/pm/ParallelPackageParser;->parsePackage(Landroid/content/pm/PackageParser;Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
+SPLcom/android/server/pm/ParallelPackageParser;->submit(Ljava/io/File;I)V
+SPLcom/android/server/pm/ParallelPackageParser;->take()Lcom/android/server/pm/ParallelPackageParser$ParseResult;
+SPLcom/android/server/pm/Policy$PolicyBuilder;-><init>()V
+SPLcom/android/server/pm/Policy$PolicyBuilder;->access$000(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/lang/String;
+SPLcom/android/server/pm/Policy$PolicyBuilder;->access$100(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/util/Set;
+SPLcom/android/server/pm/Policy$PolicyBuilder;->access$200(Lcom/android/server/pm/Policy$PolicyBuilder;)Ljava/util/Map;
+SPLcom/android/server/pm/Policy$PolicyBuilder;->addInnerPackageMapOrThrow(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
+SPLcom/android/server/pm/Policy$PolicyBuilder;->addSignature(Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
+SPLcom/android/server/pm/Policy$PolicyBuilder;->build()Lcom/android/server/pm/Policy;
+SPLcom/android/server/pm/Policy$PolicyBuilder;->setGlobalSeinfoOrThrow(Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
+SPLcom/android/server/pm/Policy$PolicyBuilder;->validateValue(Ljava/lang/String;)Z
+SPLcom/android/server/pm/Policy;-><init>(Lcom/android/server/pm/Policy$PolicyBuilder;)V
+SPLcom/android/server/pm/Policy;-><init>(Lcom/android/server/pm/Policy$PolicyBuilder;Lcom/android/server/pm/Policy$1;)V
+SPLcom/android/server/pm/Policy;->access$400(Lcom/android/server/pm/Policy;)Ljava/util/Set;
+SPLcom/android/server/pm/Policy;->access$500(Lcom/android/server/pm/Policy;)Ljava/lang/String;
+SPLcom/android/server/pm/Policy;->access$600(Lcom/android/server/pm/Policy;)Ljava/util/Map;
+SPLcom/android/server/pm/Policy;->getSignatures()Ljava/util/Set;
+SPLcom/android/server/pm/Policy;->hasInnerPackages()Z
+SPLcom/android/server/pm/PolicyComparator;-><init>()V
+SPLcom/android/server/pm/PolicyComparator;->compare(Lcom/android/server/pm/Policy;Lcom/android/server/pm/Policy;)I
+SPLcom/android/server/pm/PolicyComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
+SPLcom/android/server/pm/PolicyComparator;->foundDuplicate()Z
+SPLcom/android/server/pm/PreferredActivity;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/pm/PreferredActivity;->onReadTag(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;)Z
+SPLcom/android/server/pm/PreferredComponent;-><init>(Lcom/android/server/pm/PreferredComponent$Callbacks;Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/pm/PreferredComponent;->getParseError()Ljava/lang/String;
+SPLcom/android/server/pm/PreferredIntentResolver;-><init>()V
+SPLcom/android/server/pm/PreferredIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+SPLcom/android/server/pm/PreferredIntentResolver;->newArray(I)[Lcom/android/server/pm/PreferredActivity;
+SPLcom/android/server/pm/ProcessLoggingHandler;-><init>()V
+SPLcom/android/server/pm/ProtectedPackages;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/pm/SELinuxMMAC;->readInstallPolicy()Z
+SPLcom/android/server/pm/SELinuxMMAC;->readPackageOrThrow(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/Policy$PolicyBuilder;)V
+SPLcom/android/server/pm/SELinuxMMAC;->readSeinfo(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/pm/SELinuxMMAC;->readSignerOrThrow(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/pm/Policy;
+SPLcom/android/server/pm/SettingBase;-><init>(II)V
+SPLcom/android/server/pm/SettingBase;-><init>(Lcom/android/server/pm/SettingBase;)V
+SPLcom/android/server/pm/SettingBase;->doCopy(Lcom/android/server/pm/SettingBase;)V
+SPLcom/android/server/pm/Settings$KernelPackageState;-><init>()V
+SPLcom/android/server/pm/Settings$KernelPackageState;-><init>(Lcom/android/server/pm/Settings$1;)V
+SPLcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler;-><init>(Lcom/android/server/pm/Settings$RuntimePermissionPersistence;)V
+SPLcom/android/server/pm/Settings$RuntimePermissionPersistence;-><init>(Lcom/android/server/pm/Settings;Ljava/lang/Object;)V
+SPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->parseRuntimePermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;I)V
+SPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->readStateForUserSyncLPr(I)V
+SPLcom/android/server/pm/Settings$VersionInfo;-><init>()V
+SPLcom/android/server/pm/Settings;-><init>(Lcom/android/server/pm/permission/PermissionSettings;Ljava/lang/Object;)V
+SPLcom/android/server/pm/Settings;-><init>(Ljava/io/File;Lcom/android/server/pm/permission/PermissionSettings;Ljava/lang/Object;)V
+SPLcom/android/server/pm/Settings;->access$200(Lcom/android/server/pm/Settings;I)Ljava/io/File;
+SPLcom/android/server/pm/Settings;->addPackageLPw(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IJIILjava/lang/String;Ljava/util/List;[Ljava/lang/String;[J)Lcom/android/server/pm/PackageSetting;
+SPLcom/android/server/pm/Settings;->addPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;)V
+SPLcom/android/server/pm/Settings;->addSharedUserLPw(Ljava/lang/String;III)Lcom/android/server/pm/SharedUserSetting;
+SPLcom/android/server/pm/Settings;->editPreferredActivitiesLPw(I)Lcom/android/server/pm/PreferredIntentResolver;
+SPLcom/android/server/pm/Settings;->enableSystemPackageLPw(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+SPLcom/android/server/pm/Settings;->findOrCreateVersion(Ljava/lang/String;)Lcom/android/server/pm/Settings$VersionInfo;
+SPLcom/android/server/pm/Settings;->getSharedUserLPw(Ljava/lang/String;IIZ)Lcom/android/server/pm/SharedUserSetting;
+SPLcom/android/server/pm/Settings;->getUserPackagesStateBackupFile(I)Ljava/io/File;
+SPLcom/android/server/pm/Settings;->getUserPackagesStateFile(I)Ljava/io/File;
+SPLcom/android/server/pm/Settings;->getUserRuntimePermissionsFile(I)Ljava/io/File;
+SPLcom/android/server/pm/Settings;->insertPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;)V
+SPLcom/android/server/pm/Settings;->isDisabledSystemPackageLPr(Ljava/lang/String;)Z
+SPLcom/android/server/pm/Settings;->pruneSharedUsersLPw()V
+SPLcom/android/server/pm/Settings;->readCrossProfileIntentFiltersLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
+SPLcom/android/server/pm/Settings;->readDefaultAppsLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
+SPLcom/android/server/pm/Settings;->readDisabledSysPackageLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/pm/Settings;->readDomainVerificationLPw(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/PackageSettingBase;)V
+SPLcom/android/server/pm/Settings;->readPersistentPreferredActivitiesLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
+SPLcom/android/server/pm/Settings;->readPreferredActivitiesLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
+SPLcom/android/server/pm/Settings;->updatePackageSetting(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/util/List;Lcom/android/server/pm/UserManagerService;[Ljava/lang/String;[J)V
+SPLcom/android/server/pm/SharedUserSetting;-><init>(Ljava/lang/String;II)V
+SPLcom/android/server/pm/SharedUserSetting;->addPackage(Lcom/android/server/pm/PackageSetting;)V
+SPLcom/android/server/pm/SharedUserSetting;->isPrivileged()Z
+SPLcom/android/server/pm/UserDataPreparer;-><init>(Lcom/android/server/pm/Installer;Ljava/lang/Object;Landroid/content/Context;Z)V
+SPLcom/android/server/pm/UserManagerService$1;-><init>(Lcom/android/server/pm/UserManagerService;)V
+SPLcom/android/server/pm/UserManagerService$LocalService;-><init>(Lcom/android/server/pm/UserManagerService;)V
+SPLcom/android/server/pm/UserManagerService$LocalService;-><init>(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService$1;)V
+SPLcom/android/server/pm/UserManagerService$MainHandler;-><init>(Lcom/android/server/pm/UserManagerService;)V
+SPLcom/android/server/pm/UserManagerService$UserData;-><init>()V
+SPLcom/android/server/pm/UserManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/UserDataPreparer;Ljava/lang/Object;)V
+SPLcom/android/server/pm/UserManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/UserDataPreparer;Ljava/lang/Object;Ljava/io/File;)V
+SPLcom/android/server/pm/UserManagerService;->initDefaultGuestRestrictions()V
+SPLcom/android/server/pm/UserManagerService;->readIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
+SPLcom/android/server/pm/UserManagerService;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
+SPLcom/android/server/pm/UserManagerService;->readUserLP(I)Lcom/android/server/pm/UserManagerService$UserData;
+SPLcom/android/server/pm/UserManagerService;->readUserLP(ILjava/io/InputStream;)Lcom/android/server/pm/UserManagerService$UserData;
+SPLcom/android/server/pm/UserManagerService;->readUserListLP()V
+SPLcom/android/server/pm/UserManagerService;->updateUserIds()V
+SPLcom/android/server/pm/UserManagerService;->upgradeIfNecessaryLP(Landroid/os/Bundle;)V
+SPLcom/android/server/pm/UserRestrictionsUtils;->newSetWithUniqueCheck([Ljava/lang/String;)Ljava/util/Set;
+SPLcom/android/server/pm/UserRestrictionsUtils;->readRestrictions(Lorg/xmlpull/v1/XmlPullParser;)Landroid/os/Bundle;
+SPLcom/android/server/pm/UserRestrictionsUtils;->readRestrictions(Lorg/xmlpull/v1/XmlPullParser;Landroid/os/Bundle;)V
+SPLcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl;-><init>(Lcom/android/server/pm/dex/ArtManagerService;)V
+SPLcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl;-><init>(Lcom/android/server/pm/dex/ArtManagerService;Lcom/android/server/pm/dex/ArtManagerService$1;)V
+SPLcom/android/server/pm/dex/ArtManagerService;-><init>(Landroid/content/Context;Landroid/content/pm/IPackageManager;Lcom/android/server/pm/Installer;Ljava/lang/Object;)V
+SPLcom/android/server/pm/dex/ArtManagerService;->clearAppProfiles(Landroid/content/pm/PackageParser$Package;)V
+SPLcom/android/server/pm/dex/ArtManagerService;->getCompilationReasonTronValue(Ljava/lang/String;)I
+SPLcom/android/server/pm/dex/ArtManagerService;->getPackageProfileNames(Landroid/content/pm/PackageParser$Package;)Landroid/util/ArrayMap;
+SPLcom/android/server/pm/dex/ArtManagerService;->verifyTronLoggingConstants()V
+SPLcom/android/server/pm/dex/DexLogger;-><init>(Landroid/content/pm/IPackageManager;Lcom/android/server/pm/Installer;Ljava/lang/Object;)V
+SPLcom/android/server/pm/dex/DexLogger;->getListener(Landroid/content/pm/IPackageManager;Lcom/android/server/pm/Installer;Ljava/lang/Object;)Lcom/android/server/pm/dex/DexManager$Listener;
+SPLcom/android/server/pm/dex/DexManager;-><init>(Landroid/content/Context;Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageDexOptimizer;Lcom/android/server/pm/Installer;Ljava/lang/Object;Lcom/android/server/pm/dex/DexManager$Listener;)V
+SPLcom/android/server/pm/dex/DexManager;->isPackageSelectedToRunOob(Ljava/lang/String;)Z
+SPLcom/android/server/pm/dex/DexManager;->isPackageSelectedToRunOob(Ljava/util/Collection;)Z
+SPLcom/android/server/pm/dex/DexManager;->maybeLogUnexpectedPackageDetails(Landroid/content/pm/PackageParser$Package;)V
+SPLcom/android/server/pm/dex/PackageDexUsage$PackageUseInfo;-><init>()V
+SPLcom/android/server/pm/dex/PackageDexUsage;-><init>()V
+SPLcom/android/server/pm/permission/BasePermission;->isPermission(Landroid/content/pm/PackageParser$Permission;)Z
+SPLcom/android/server/pm/permission/BasePermission;->setGids([IZ)V
+SPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1;-><init>(Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;Landroid/os/Looper;)V
+SPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;-><init>(Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermissionGrantedCallback;Lcom/android/server/pm/permission/PermissionManagerService;)V
+SPLcom/android/server/pm/permission/PermissionManagerInternal$PermissionCallback;-><init>()V
+SPLcom/android/server/pm/permission/PermissionManagerInternal;-><init>()V
+SPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;)V
+SPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;-><init>(Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerService$1;)V
+SPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->addAllPermissionGroups(Landroid/content/pm/PackageParser$Package;Z)V
+SPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->addAllPermissions(Landroid/content/pm/PackageParser$Package;Z)V
+SPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->getDefaultPermissionGrantPolicy()Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;
+SPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->getPermissionSettings()Lcom/android/server/pm/permission/PermissionSettings;
+SPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerInternalImpl;->removeAllPermissions(Landroid/content/pm/PackageParser$Package;Z)V
+SPLcom/android/server/pm/permission/PermissionManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermissionGrantedCallback;Ljava/lang/Object;)V
+SPLcom/android/server/pm/permission/PermissionManagerService;->access$2700(Lcom/android/server/pm/permission/PermissionManagerService;)Lcom/android/server/pm/permission/PermissionSettings;
+SPLcom/android/server/pm/permission/PermissionManagerService;->access$2800(Lcom/android/server/pm/permission/PermissionManagerService;)Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;
+SPLcom/android/server/pm/permission/PermissionManagerService;->access$400(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/PackageParser$Package;Z)V
+SPLcom/android/server/pm/permission/PermissionManagerService;->access$500(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/PackageParser$Package;Z)V
+SPLcom/android/server/pm/permission/PermissionManagerService;->access$600(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/PackageParser$Package;Z)V
+SPLcom/android/server/pm/permission/PermissionManagerService;->addAllPermissionGroups(Landroid/content/pm/PackageParser$Package;Z)V
+SPLcom/android/server/pm/permission/PermissionManagerService;->create(Landroid/content/Context;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermissionGrantedCallback;Ljava/lang/Object;)Lcom/android/server/pm/permission/PermissionManagerInternal;
+SPLcom/android/server/pm/permission/PermissionSettings;-><init>(Landroid/content/Context;Ljava/lang/Object;)V
+SPLcom/android/server/pm/permission/PermissionSettings;->getPermissionTreeLocked(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+SPLcom/android/server/pm/permission/PermissionSettings;->putPermissionTreeLocked(Ljava/lang/String;Lcom/android/server/pm/permission/BasePermission;)V
+SPLcom/android/server/pm/permission/PermissionSettings;->readPermissionTrees(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/pm/permission/PermissionSettings;->readPermissions(Lorg/xmlpull/v1/XmlPullParser;)V
+SPLcom/android/server/power/BatterySaverPolicy;-><init>(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySavingStats;)V
+SPLcom/android/server/power/BatterySaverPolicy;->addListener(Lcom/android/server/power/BatterySaverPolicy$BatterySaverPolicyListener;)V
+SPLcom/android/server/power/PowerManagerService$1;-><init>(Lcom/android/server/power/PowerManagerService;)V
+SPLcom/android/server/power/PowerManagerService$4;-><init>(Lcom/android/server/power/PowerManagerService;)V
+SPLcom/android/server/power/PowerManagerService$BinderService;-><init>(Lcom/android/server/power/PowerManagerService;)V
+SPLcom/android/server/power/PowerManagerService$BinderService;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$1;)V
+SPLcom/android/server/power/PowerManagerService$Constants;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Handler;)V
+SPLcom/android/server/power/PowerManagerService$LocalService;-><init>(Lcom/android/server/power/PowerManagerService;)V
+SPLcom/android/server/power/PowerManagerService$LocalService;-><init>(Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService$1;)V
+SPLcom/android/server/power/PowerManagerService$LocalService;->getLowPowerState(I)Landroid/os/PowerSaveState;
+SPLcom/android/server/power/PowerManagerService$LocalService;->registerLowPowerModeObserver(Landroid/os/PowerManagerInternal$LowPowerModeListener;)V
+SPLcom/android/server/power/PowerManagerService$PowerManagerHandler;-><init>(Lcom/android/server/power/PowerManagerService;Landroid/os/Looper;)V
+SPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;-><init>(Lcom/android/server/power/PowerManagerService;Ljava/lang/String;)V
+SPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->acquire()V
+SPLcom/android/server/power/PowerManagerService;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/power/PowerManagerService;->access$4400(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/batterysaver/BatterySaverController;
+SPLcom/android/server/power/PowerManagerService;->access$4500(Lcom/android/server/power/PowerManagerService;)Lcom/android/server/power/BatterySaverPolicy;
+SPLcom/android/server/power/PowerManagerService;->createSuspendBlockerLocked(Ljava/lang/String;)Lcom/android/server/power/SuspendBlocker;
+SPLcom/android/server/power/PowerManagerService;->onBootPhase(I)V
+SPLcom/android/server/power/PowerManagerService;->onStart()V
+SPLcom/android/server/power/batterysaver/-$$Lambda$BatterySaverStateMachine$SSfmWJrD4RBoVg8A8loZrS-jhAo;-><init>(Lcom/android/server/power/batterysaver/BatterySaverStateMachine;)V
+SPLcom/android/server/power/batterysaver/-$$Lambda$FileUpdater$NUmipjKCJwbgmFbIcGS3uaz3QFk;-><init>(Lcom/android/server/power/batterysaver/FileUpdater;)V
+SPLcom/android/server/power/batterysaver/BatterySaverController$1;-><init>(Lcom/android/server/power/batterysaver/BatterySaverController;)V
+SPLcom/android/server/power/batterysaver/BatterySaverController$MyHandler;-><init>(Lcom/android/server/power/batterysaver/BatterySaverController;Landroid/os/Looper;)V
+SPLcom/android/server/power/batterysaver/BatterySaverController;-><init>(Ljava/lang/Object;Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/power/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySavingStats;)V
+SPLcom/android/server/power/batterysaver/BatterySaverController;->addListener(Landroid/os/PowerManagerInternal$LowPowerModeListener;)V
+SPLcom/android/server/power/batterysaver/BatterySaverLocationPlugin;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/power/batterysaver/BatterySaverStateMachine$1;-><init>(Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Landroid/os/Handler;)V
+SPLcom/android/server/power/batterysaver/BatterySaverStateMachine;-><init>(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySaverController;)V
+SPLcom/android/server/power/batterysaver/BatterySavingStats$MetricsLoggerHelper;-><init>(Lcom/android/server/power/batterysaver/BatterySavingStats;)V
+SPLcom/android/server/power/batterysaver/BatterySavingStats;-><init>(Ljava/lang/Object;)V
+SPLcom/android/server/power/batterysaver/BatterySavingStats;-><init>(Ljava/lang/Object;Lcom/android/internal/logging/MetricsLogger;)V
+SPLcom/android/server/power/batterysaver/FileUpdater;-><init>(Landroid/content/Context;)V
+SPLcom/android/server/power/batterysaver/FileUpdater;-><init>(Landroid/content/Context;Landroid/os/Looper;II)V
+SPLcom/android/server/wm/ConfigurationContainer;-><init>()V
+SPLcom/android/server/wm/ConfigurationContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 21398e37e6c5..021fdcd84971 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -46,6 +46,7 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Parcelable;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.ResultReceiver;
@@ -622,6 +623,38 @@ public final class AutofillManagerService extends SystemService {
return getWhitelistedCompatModePackages(getWhitelistedCompatModePackagesFromSettings());
}
+ private void send(@NonNull IResultReceiver receiver, int value) {
+ try {
+ receiver.send(value, null);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Error async reporting result to client: " + e);
+ }
+ }
+
+ private void send(@NonNull IResultReceiver receiver, @NonNull Bundle value) {
+ try {
+ receiver.send(0, value);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Error async reporting result to client: " + e);
+ }
+ }
+
+ private void send(@NonNull IResultReceiver receiver, @Nullable String value) {
+ send(receiver, AutofillManager.SyncResultReceiver.bundleFor(value));
+ }
+
+ private void send(@NonNull IResultReceiver receiver, @Nullable String[] value) {
+ send(receiver, AutofillManager.SyncResultReceiver.bundleFor(value));
+ }
+
+ private void send(@NonNull IResultReceiver receiver, @Nullable Parcelable value) {
+ send(receiver, AutofillManager.SyncResultReceiver.bundleFor(value));
+ }
+
+ private void send(@NonNull IResultReceiver receiver, boolean value) {
+ send(receiver, value ? 1 : 0);
+ }
+
@Nullable
@VisibleForTesting
static Map<String, String[]> getWhitelistedCompatModePackages(String setting) {
@@ -827,9 +860,10 @@ public final class AutofillManagerService extends SystemService {
final class AutoFillManagerServiceStub extends IAutoFillManager.Stub {
@Override
- public int addClient(IAutoFillManagerClient client, int userId) {
+ public void addClient(IAutoFillManagerClient client, int userId,
+ @NonNull IResultReceiver receiver) {
+ int flags = 0;
synchronized (mLock) {
- int flags = 0;
if (getServiceForUserLocked(userId).addClientLocked(client)) {
flags |= AutofillManager.FLAG_ADD_CLIENT_ENABLED;
}
@@ -839,8 +873,8 @@ public final class AutofillManagerService extends SystemService {
if (sVerbose) {
flags |= AutofillManager.FLAG_ADD_CLIENT_VERBOSE;
}
- return flags;
}
+ send(receiver, flags);
}
@Override
@@ -874,9 +908,9 @@ public final class AutofillManagerService extends SystemService {
}
@Override
- public int startSession(IBinder activityToken, IBinder appCallback, AutofillId autofillId,
+ public void startSession(IBinder activityToken, IBinder appCallback, AutofillId autofillId,
Rect bounds, AutofillValue value, int userId, boolean hasCallback, int flags,
- ComponentName componentName, boolean compatMode) {
+ ComponentName componentName, boolean compatMode, IResultReceiver receiver) {
activityToken = Preconditions.checkNotNull(activityToken, "activityToken");
appCallback = Preconditions.checkNotNull(appCallback, "appCallback");
@@ -892,61 +926,63 @@ public final class AutofillManagerService extends SystemService {
throw new IllegalArgumentException(packageName + " is not a valid package", e);
}
+ final int sessionId;
synchronized (mLock) {
final AutofillManagerServiceImpl service = getServiceForUserLocked(userId);
- return service.startSessionLocked(activityToken, getCallingUid(), appCallback,
+ sessionId = service.startSessionLocked(activityToken, getCallingUid(), appCallback,
autofillId, bounds, value, hasCallback, componentName, compatMode,
mAllowInstantService, flags);
}
+ send(receiver, sessionId);
}
@Override
- public FillEventHistory getFillEventHistory() throws RemoteException {
+ public void getFillEventHistory(@NonNull IResultReceiver receiver) throws RemoteException {
final int userId = UserHandle.getCallingUserId();
+ FillEventHistory fillEventHistory = null;
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
- return service.getFillEventHistory(getCallingUid());
+ fillEventHistory = service.getFillEventHistory(getCallingUid());
} else if (sVerbose) {
Slog.v(TAG, "getFillEventHistory(): no service for " + userId);
}
}
-
- return null;
+ send(receiver, fillEventHistory);
}
@Override
- public UserData getUserData() throws RemoteException {
+ public void getUserData(@NonNull IResultReceiver receiver) throws RemoteException {
final int userId = UserHandle.getCallingUserId();
+ UserData userData = null;
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
- return service.getUserData(getCallingUid());
+ userData = service.getUserData(getCallingUid());
} else if (sVerbose) {
Slog.v(TAG, "getUserData(): no service for " + userId);
}
}
-
- return null;
+ send(receiver, userData);
}
@Override
- public String getUserDataId() throws RemoteException {
+ public void getUserDataId(@NonNull IResultReceiver receiver) throws RemoteException {
final int userId = UserHandle.getCallingUserId();
+ UserData userData = null;
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
- final UserData userData = service.getUserData(getCallingUid());
- return userData == null ? null : userData.getId();
+ userData = service.getUserData(getCallingUid());
} else if (sVerbose) {
Slog.v(TAG, "getUserDataId(): no service for " + userId);
}
}
-
- return null;
+ final String userDataId = userData == null ? null : userData.getId();
+ send(receiver, userDataId);
}
@Override
@@ -964,89 +1000,96 @@ public final class AutofillManagerService extends SystemService {
}
@Override
- public boolean isFieldClassificationEnabled() throws RemoteException {
+ public void isFieldClassificationEnabled(@NonNull IResultReceiver receiver)
+ throws RemoteException {
final int userId = UserHandle.getCallingUserId();
+ boolean enabled = false;
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
- return service.isFieldClassificationEnabled(getCallingUid());
+ enabled = service.isFieldClassificationEnabled(getCallingUid());
} else if (sVerbose) {
Slog.v(TAG, "isFieldClassificationEnabled(): no service for " + userId);
}
}
-
- return false;
+ send(receiver, enabled);
}
@Override
- public String getDefaultFieldClassificationAlgorithm() throws RemoteException {
+ public void getDefaultFieldClassificationAlgorithm(@NonNull IResultReceiver receiver)
+ throws RemoteException {
final int userId = UserHandle.getCallingUserId();
+ String algorithm = null;
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
- return service.getDefaultFieldClassificationAlgorithm(getCallingUid());
+ algorithm = service.getDefaultFieldClassificationAlgorithm(getCallingUid());
} else {
if (sVerbose) {
Slog.v(TAG, "getDefaultFcAlgorithm(): no service for " + userId);
}
- return null;
}
}
+ send(receiver, algorithm);
}
@Override
- public String[] getAvailableFieldClassificationAlgorithms() throws RemoteException {
+ public void getAvailableFieldClassificationAlgorithms(@NonNull IResultReceiver receiver)
+ throws RemoteException {
final int userId = UserHandle.getCallingUserId();
+ String[] algorithms = null;
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
- return service.getAvailableFieldClassificationAlgorithms(getCallingUid());
+ algorithms = service.getAvailableFieldClassificationAlgorithms(getCallingUid());
} else {
if (sVerbose) {
Slog.v(TAG, "getAvailableFcAlgorithms(): no service for " + userId);
}
- return null;
}
}
+ send(receiver, algorithms);
}
@Override
- public ComponentName getAutofillServiceComponentName() throws RemoteException {
+ public void getAutofillServiceComponentName(@NonNull IResultReceiver receiver)
+ throws RemoteException {
final int userId = UserHandle.getCallingUserId();
+ ComponentName componentName = null;
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
- return service.getServiceComponentName();
+ componentName = service.getServiceComponentName();
} else if (sVerbose) {
Slog.v(TAG, "getAutofillServiceComponentName(): no service for " + userId);
}
}
-
- return null;
+ send(receiver, componentName);
}
@Override
- public boolean restoreSession(int sessionId, IBinder activityToken, IBinder appCallback)
+ public void restoreSession(int sessionId, @NonNull IBinder activityToken,
+ @NonNull IBinder appCallback, @NonNull IResultReceiver receiver)
throws RemoteException {
final int userId = UserHandle.getCallingUserId();
activityToken = Preconditions.checkNotNull(activityToken, "activityToken");
appCallback = Preconditions.checkNotNull(appCallback, "appCallback");
+ boolean restored = false;
synchronized (mLock) {
final AutofillManagerServiceImpl service = mServicesCache.get(userId);
if (service != null) {
- return service.restoreSession(sessionId, getCallingUid(), activityToken,
+ restored = service.restoreSession(sessionId, getCallingUid(), activityToken,
appCallback);
} else if (sVerbose) {
Slog.v(TAG, "restoreSession(): no service for " + userId);
}
}
-
- return false;
+ send(receiver, restored);
}
@Override
@@ -1064,30 +1107,6 @@ public final class AutofillManagerService extends SystemService {
}
@Override
- public int updateOrRestartSession(IBinder activityToken, IBinder appCallback,
- AutofillId autoFillId, Rect bounds, AutofillValue value, int userId,
- boolean hasCallback, int flags, ComponentName componentName, int sessionId,
- int action, boolean compatMode) {
- boolean restart = false;
- synchronized (mLock) {
- final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
- if (service != null) {
- restart = service.updateSessionLocked(sessionId, getCallingUid(), autoFillId,
- bounds, value, action, flags);
- } else if (sVerbose) {
- Slog.v(TAG, "updateOrRestartSession(): no service for " + userId);
- }
- }
- if (restart) {
- return startSession(activityToken, appCallback, autoFillId, bounds, value, userId,
- hasCallback, flags, componentName, compatMode);
- }
-
- // Nothing changed...
- return sessionId;
- }
-
- @Override
public void setAutofillFailure(int sessionId, @NonNull List<AutofillId> ids, int userId) {
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
@@ -1136,23 +1155,27 @@ public final class AutofillManagerService extends SystemService {
}
@Override
- public boolean isServiceSupported(int userId) {
+ public void isServiceSupported(int userId, @NonNull IResultReceiver receiver) {
+ boolean supported = false;
synchronized (mLock) {
- return !mDisabledUsers.get(userId);
+ supported = !mDisabledUsers.get(userId);
}
+ send(receiver, supported);
}
@Override
- public boolean isServiceEnabled(int userId, String packageName) {
+ public void isServiceEnabled(int userId, @NonNull String packageName,
+ @NonNull IResultReceiver receiver) {
+ boolean enabled = false;
synchronized (mLock) {
final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
if (service != null) {
- return Objects.equals(packageName, service.getServicePackageName());
+ enabled = Objects.equals(packageName, service.getServicePackageName());
} else if (sVerbose) {
Slog.v(TAG, "isServiceEnabled(): no service for " + userId);
}
- return false;
}
+ send(receiver, enabled);
}
@Override
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 1ccce177bca8..4206d9a43ae2 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -26,9 +26,11 @@ import static com.android.server.autofill.Helper.sVerbose;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -80,6 +82,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.server.LocalServices;
import com.android.server.autofill.AutofillManagerService.AutofillCompatState;
import com.android.server.autofill.ui.AutoFillUI;
+import com.android.server.wm.ActivityTaskManagerInternal;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -1296,13 +1299,13 @@ final class AutofillManagerServiceImpl {
}
}
- IActivityManager am = ActivityManager.getService();
+ final IActivityTaskManager atm = ActivityTaskManager.getService();
// Only remove sessions which's activities are not known to the activity manager anymore
for (int i = 0; i < numSessionsToRemove; i++) {
try {
// The activity manager cannot resolve activities that have been removed
- if (am.getActivityClassForToken(sessionsToRemove.valueAt(i)) != null) {
+ if (atm.getActivityClassForToken(sessionsToRemove.valueAt(i)) != null) {
sessionsToRemove.removeAt(i);
i--;
numSessionsToRemove--;
diff --git a/services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java b/services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java
index ba544f17c06c..293f908e2708 100644
--- a/services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java
+++ b/services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java
@@ -282,9 +282,13 @@ final class FieldClassificationStrategy {
}
pw.println(impl.flattenToShortString());
- pw.print(prefix); pw.print("Available algorithms: ");
- pw.println(Arrays.toString(getAvailableAlgorithms()));
- pw.print(prefix); pw.print("Default algorithm: "); pw.println(getDefaultAlgorithm());
+ try {
+ pw.print(prefix); pw.print("Available algorithms: ");
+ pw.println(Arrays.toString(getAvailableAlgorithms()));
+ pw.print(prefix); pw.print("Default algorithm: "); pw.println(getDefaultAlgorithm());
+ } catch (Exception e) {
+ pw.print("ERROR CALLING SERVICE: " ); pw.println(e);
+ }
}
private static interface Command {
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index f14c8f1aa7f6..4f45a7770311 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -61,11 +61,12 @@ public final class Helper {
static int sPartitionMaxCount = 10;
/**
- * Maximum number of visible datasets in the dataset picker UI.
+ * Maximum number of visible datasets in the dataset picker UI, or {@code 0} to use default
+ * value from resources.
*
* <p>Can be modified using {@code cmd autofill set max_visible_datasets}.
*/
- public static int sVisibleDatasetsMaxCount = 3;
+ public static int sVisibleDatasetsMaxCount = 0;
/**
* When non-null, overrides whether the UI should be shown on full-screen mode.
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index 3e932e8d6daf..65ad5960ea9c 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -101,9 +101,8 @@ final class RemoteFillService implements DeathRecipient {
public interface FillServiceCallbacks {
void onFillRequestSuccess(int requestId, @Nullable FillResponse response,
@NonNull String servicePackageName, int requestFlags);
- void onFillRequestFailure(int requestId, @Nullable CharSequence message,
- @NonNull String servicePackageName);
- void onFillRequestTimeout(int requestId, @NonNull String servicePackageName);
+ void onFillRequestFailure(int requestId, @Nullable CharSequence message);
+ void onFillRequestTimeout(int requestId);
void onSaveRequestSuccess(@NonNull String servicePackageName,
@Nullable IntentSender intentSender);
// TODO(b/80093094): add timeout here too?
@@ -317,8 +316,7 @@ final class RemoteFillService implements DeathRecipient {
@Nullable CharSequence message) {
mHandler.post(() -> {
if (handleResponseCallbackCommon(pendingRequest)) {
- mCallbacks.onFillRequestFailure(pendingRequest.mRequest.getId(), message,
- mComponentName.getPackageName());
+ mCallbacks.onFillRequestFailure(pendingRequest.mRequest.getId(), message);
}
});
}
@@ -326,8 +324,7 @@ final class RemoteFillService implements DeathRecipient {
private void dispatchOnFillRequestTimeout(@NonNull PendingFillRequest pendingRequest) {
mHandler.post(() -> {
if (handleResponseCallbackCommon(pendingRequest)) {
- mCallbacks.onFillRequestTimeout(pendingRequest.mRequest.getId(),
- mComponentName.getPackageName());
+ mCallbacks.onFillRequestTimeout(pendingRequest.mRequest.getId());
}
});
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 52c3f644c66e..18255c5c39d4 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -16,8 +16,6 @@
package com.android.server.autofill;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_STRUCTURE;
import static android.service.autofill.AutofillFieldClassificationService.EXTRA_SCORES;
import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
@@ -33,11 +31,14 @@ import static com.android.server.autofill.Helper.sPartitionMaxCount;
import static com.android.server.autofill.Helper.sVerbose;
import static com.android.server.autofill.Helper.toArray;
import static com.android.server.autofill.ViewState.STATE_RESTARTED_SESSION;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.IAssistDataReceiver;
import android.app.assist.AssistStructure;
import android.app.assist.AssistStructure.AutofillOverlay;
@@ -94,7 +95,6 @@ import com.android.server.autofill.ui.AutoFillUI;
import com.android.server.autofill.ui.PendingUi;
import java.io.PrintWriter;
-import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -269,7 +269,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// change AssistStructure so it provides a "one-way" writeToParcel() method that
// sends all the data
try {
- structure.ensureDataForAutofill();
+ structure.ensureData();
} catch (RuntimeException e) {
wtf(e, "Exception lazy loading assist structure for %s: %s",
structure.getActivityComponent(), e);
@@ -516,7 +516,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
receiverExtras.putInt(EXTRA_REQUEST_ID, requestId);
final long identity = Binder.clearCallingIdentity();
try {
- if (!ActivityManager.getService().requestAutofillData(mAssistReceiver,
+ if (!ActivityTaskManager.getService().requestAutofillData(mAssistReceiver,
receiverExtras, mActivityToken, flags)) {
Slog.w(TAG, "failed to request autofill data for " + mActivityToken);
}
@@ -704,19 +704,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// FillServiceCallbacks
@Override
- public void onFillRequestFailure(int requestId, @Nullable CharSequence message,
- @NonNull String servicePackageName) {
- onFillRequestFailureOrTimeout(requestId, false, message, servicePackageName);
+ public void onFillRequestFailure(int requestId, @Nullable CharSequence message) {
+ onFillRequestFailureOrTimeout(requestId, false, message);
}
// FillServiceCallbacks
@Override
- public void onFillRequestTimeout(int requestId, @NonNull String servicePackageName) {
- onFillRequestFailureOrTimeout(requestId, true, null, servicePackageName);
+ public void onFillRequestTimeout(int requestId) {
+ onFillRequestFailureOrTimeout(requestId, true, null);
}
private void onFillRequestFailureOrTimeout(int requestId, boolean timedOut,
- @Nullable CharSequence message, @NonNull String servicePackageName) {
+ @Nullable CharSequence message) {
synchronized (mLock) {
if (mDestroyed) {
Slog.w(TAG, "Call to Session#onFillRequestFailureOrTimeout(req=" + requestId
@@ -994,6 +993,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final int requestId = AutofillManager.getRequestIdFromAuthenticationId(authenticationId);
final FillResponse authenticatedResponse = mResponses.get(requestId);
if (authenticatedResponse == null || data == null) {
+ Slog.w(TAG, "no authenticated response");
removeSelf();
return;
}
@@ -1004,6 +1004,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
if (datasetIdx != AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED) {
final Dataset dataset = authenticatedResponse.getDatasets().get(datasetIdx);
if (dataset == null) {
+ Slog.w(TAG, "no dataset with index " + datasetIdx + " on fill response");
removeSelf();
return;
}
@@ -1013,7 +1014,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
final Bundle newClientState = data.getBundle(AutofillManager.EXTRA_CLIENT_STATE);
if (sDebug) {
Slog.d(TAG, "setAuthenticationResultLocked(): result=" + result
- + ", clientState=" + newClientState);
+ + ", clientState=" + newClientState + ", authenticationId=" + authenticationId);
}
if (result instanceof FillResponse) {
logAuthenticationStatusLocked(requestId, MetricsEvent.AUTOFILL_AUTHENTICATED);
@@ -1030,6 +1031,8 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
authenticatedResponse.getDatasets().set(datasetIdx, dataset);
autoFill(requestId, datasetIdx, dataset, false);
} else {
+ Slog.w(TAG, "invalid index (" + datasetIdx + ") for authentication id "
+ + authenticationId);
logAuthenticationStatusLocked(requestId,
MetricsEvent.AUTOFILL_INVALID_DATASET_AUTHENTICATION);
}
@@ -2856,14 +2859,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
requestLog.addTaggedData(tag, value);
}
- private static String requestLogToString(@NonNull LogMaker log) {
- final StringWriter sw = new StringWriter();
- final PrintWriter pw = new PrintWriter(sw);
- dumpRequestLog(pw, log);
- pw.flush();
- return sw.toString();
- }
-
private void wtf(@Nullable Exception e, String fmt, Object...args) {
final String message = String.format(fmt, args);
mWtfHistory.log(message);
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index 8119054f4196..68a495fe9a2f 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -21,7 +21,6 @@ import static com.android.server.autofill.Helper.sFullScreenMode;
import static com.android.server.autofill.Helper.sVerbose;
import static com.android.server.autofill.Helper.sVisibleDatasetsMaxCount;
-import android.annotation.AttrRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent;
@@ -37,7 +36,6 @@ import android.service.autofill.Dataset;
import android.service.autofill.Dataset.DatasetFieldFilter;
import android.service.autofill.FillResponse;
import android.text.TextUtils;
-import android.util.AttributeSet;
import android.util.Slog;
import android.util.TypedValue;
import android.view.KeyEvent;
@@ -54,7 +52,6 @@ import android.view.autofill.IAutofillWindowPresenter;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
-import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
@@ -679,7 +676,7 @@ final class FillUi {
// WM throws an ISE if mContentView was added twice; this should never happen -
// since show() and hide() are always called in the UIThread - but when it does,
// it should not crash the system.
- Slog.e(TAG, "Exception showing window " + params, e);
+ Slog.wtf(TAG, "Exception showing window " + params, e);
mCallback.onDestroy();
}
}
diff --git a/services/backup/OWNERS b/services/backup/OWNERS
index 1c9a43acfa65..645723e655f8 100644
--- a/services/backup/OWNERS
+++ b/services/backup/OWNERS
@@ -1,7 +1,7 @@
+anniemeng@google.com
artikz@google.com
brufino@google.com
bryanmawhinney@google.com
ctate@google.com
jorlow@google.com
mkarpinski@google.com
-
diff --git a/services/backup/java/com/android/server/backup/BackupManagerConstants.java b/services/backup/java/com/android/server/backup/BackupManagerConstants.java
index dd6e6ab2ece1..ec219615dfd4 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerConstants.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerConstants.java
@@ -32,7 +32,7 @@ import com.android.internal.annotations.VisibleForTesting;
* <p>The backup manager constants are encoded as a key value list separated by commas and stored as
* a Settings.Secure.
*/
-class BackupManagerConstants extends KeyValueSettingObserver {
+public class BackupManagerConstants extends KeyValueSettingObserver {
private static final String TAG = "BackupManagerConstants";
private static final String SETTING = Settings.Secure.BACKUP_MANAGER_CONSTANTS;
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index bd51af270dd8..574288af58b4 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -38,6 +38,7 @@ import android.app.AppGlobals;
import android.app.IActivityManager;
import android.app.IBackupAgent;
import android.app.PendingIntent;
+import android.app.backup.BackupAgent;
import android.app.backup.BackupManager;
import android.app.backup.BackupManagerMonitor;
import android.app.backup.FullBackup;
@@ -353,6 +354,11 @@ public class BackupManagerService implements BackupManagerServiceInterface {
mAlarmManager = alarmManager;
}
+ @VisibleForTesting
+ void setPowerManager(PowerManager powerManager) {
+ mPowerManager = powerManager;
+ }
+
public void setBackupManagerBinder(IBackupManager backupManagerBinder) {
mBackupManagerBinder = backupManagerBinder;
}
@@ -699,7 +705,7 @@ public class BackupManagerService implements BackupManagerServiceInterface {
* process-local non-lifecycle agent instance, so we manually set up the context
* topology for it.
*/
- public PackageManagerBackupAgent makeMetadataAgent() {
+ public BackupAgent makeMetadataAgent() {
PackageManagerBackupAgent pmAgent = new PackageManagerBackupAgent(mPackageManager);
pmAgent.attach(mContext);
pmAgent.onCreate();
@@ -779,7 +785,7 @@ public class BackupManagerService implements BackupManagerServiceInterface {
}
@VisibleForTesting
- BackupManagerService(
+ public BackupManagerService(
Context context,
Trampoline parent,
HandlerThread backupThread,
@@ -1744,6 +1750,16 @@ public class BackupManagerService implements BackupManagerServiceInterface {
}
}
+ public void putOperation(int token, Operation operation) {
+ if (MORE_DEBUG) {
+ Slog.d(TAG, "Adding operation token=" + Integer.toHexString(token) + ", operation type="
+ + operation.type);
+ }
+ synchronized (mCurrentOpLock) {
+ mCurrentOperations.put(token, operation);
+ }
+ }
+
public void removeOperation(int token) {
if (MORE_DEBUG) {
Slog.d(TAG, "Removing operation token=" + Integer.toHexString(token));
@@ -2410,25 +2426,30 @@ public class BackupManagerService implements BackupManagerServiceInterface {
public void backupNow() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "backupNow");
- final PowerSaveState result =
- mPowerManager.getPowerSaveState(ServiceType.KEYVALUE_BACKUP);
- if (result.batterySaverEnabled) {
- if (DEBUG) Slog.v(TAG, "Not running backup while in battery save mode");
- KeyValueBackupJob.schedule(mContext, mConstants); // try again in several hours
- } else {
- if (DEBUG) Slog.v(TAG, "Scheduling immediate backup pass");
- synchronized (mQueueLock) {
- // Fire the intent that kicks off the whole shebang...
- try {
- mRunBackupIntent.send();
- } catch (PendingIntent.CanceledException e) {
- // should never happen
- Slog.e(TAG, "run-backup intent cancelled!");
- }
+ long oldId = Binder.clearCallingIdentity();
+ try {
+ final PowerSaveState result =
+ mPowerManager.getPowerSaveState(ServiceType.KEYVALUE_BACKUP);
+ if (result.batterySaverEnabled) {
+ if (DEBUG) Slog.v(TAG, "Not running backup while in battery save mode");
+ KeyValueBackupJob.schedule(mContext, mConstants); // try again in several hours
+ } else {
+ if (DEBUG) Slog.v(TAG, "Scheduling immediate backup pass");
+ synchronized (mQueueLock) {
+ // Fire the intent that kicks off the whole shebang...
+ try {
+ mRunBackupIntent.send();
+ } catch (PendingIntent.CanceledException e) {
+ // should never happen
+ Slog.e(TAG, "run-backup intent cancelled!");
+ }
- // ...and cancel any pending scheduled job, because we've just superseded it
- KeyValueBackupJob.cancel(mContext);
+ // ...and cancel any pending scheduled job, because we've just superseded it
+ KeyValueBackupJob.cancel(mContext);
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(oldId);
}
}
@@ -2901,6 +2922,25 @@ public class BackupManagerService implements BackupManagerServiceInterface {
return currentTransport;
}
+ /**
+ * Returns the {@link ComponentName} of the host service of the selected transport or {@code
+ * null} if no transport selected or if the transport selected is not registered.
+ */
+ @Override
+ @Nullable
+ public ComponentName getCurrentTransportComponent() {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.BACKUP, "getCurrentTransportComponent");
+ long oldId = Binder.clearCallingIdentity();
+ try {
+ return mTransportManager.getCurrentTransportComponent();
+ } catch (TransportNotRegisteredException e) {
+ return null;
+ } finally {
+ Binder.restoreCallingIdentity(oldId);
+ }
+ }
+
// Report all known, available backup transports
@Override
public String[] listAllTransports() {
diff --git a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
index aabe7f611845..f2219a018765 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java
@@ -16,6 +16,7 @@
package com.android.server.backup;
+import android.annotation.Nullable;
import android.app.IBackupAgent;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManagerMonitor;
@@ -132,6 +133,10 @@ public interface BackupManagerServiceInterface {
// Report the name of the currently active transport
String getCurrentTransport();
+ // Report the component name of the host service of the currently active transport
+ @Nullable
+ ComponentName getCurrentTransportComponent();
+
// Report all known, available backup transports
String[] listAllTransports();
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index 2abeaa693bec..787d667afe51 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -19,8 +19,8 @@ package com.android.server.backup;
import android.annotation.Nullable;
import android.app.backup.BackupManager;
import android.app.backup.IBackupManager;
-import android.app.backup.IBackupObserver;
import android.app.backup.IBackupManagerMonitor;
+import android.app.backup.IBackupObserver;
import android.app.backup.IFullBackupRestoreObserver;
import android.app.backup.IRestoreSession;
import android.app.backup.ISelectBackupTransportCallback;
@@ -341,6 +341,17 @@ public class Trampoline extends IBackupManager.Stub {
return (svc != null) ? svc.getCurrentTransport() : null;
}
+ /**
+ * Returns the {@link ComponentName} of the host service of the selected transport or
+ * {@code null} if no transport selected or if the transport selected is not registered.
+ */
+ @Override
+ @Nullable
+ public ComponentName getCurrentTransportComponent() {
+ BackupManagerServiceInterface svc = mService;
+ return (svc != null) ? svc.getCurrentTransportComponent() : null;
+ }
+
@Override
public String[] listAllTransports() throws RemoteException {
BackupManagerServiceInterface svc = mService;
diff --git a/services/backup/java/com/android/server/backup/TransportManager.java b/services/backup/java/com/android/server/backup/TransportManager.java
index 6a1bf178ad60..ddce6bbfd47d 100644
--- a/services/backup/java/com/android/server/backup/TransportManager.java
+++ b/services/backup/java/com/android/server/backup/TransportManager.java
@@ -176,12 +176,30 @@ public class TransportManager {
return mTransportWhitelist;
}
+ /** Returns the name of the selected transport or {@code null} if no transport selected. */
@Nullable
- String getCurrentTransportName() {
+ public String getCurrentTransportName() {
return mCurrentTransportName;
}
/**
+ * Returns the {@link ComponentName} of the host service of the selected transport or
+ * {@code null} if no transport selected.
+ *
+ * @throws TransportNotRegisteredException if the selected transport is not registered.
+ */
+ @Nullable
+ public ComponentName getCurrentTransportComponent()
+ throws TransportNotRegisteredException {
+ synchronized (mTransportLock) {
+ if (mCurrentTransportName == null) {
+ return null;
+ }
+ return getRegisteredTransportComponentOrThrowLocked(mCurrentTransportName);
+ }
+ }
+
+ /**
* Returns the transport name associated with {@code transportComponent}.
*
* @throws TransportNotRegisteredException if the transport is not registered.
@@ -325,6 +343,16 @@ public class TransportManager {
}
@GuardedBy("mTransportLock")
+ private ComponentName getRegisteredTransportComponentOrThrowLocked(String transportName)
+ throws TransportNotRegisteredException {
+ ComponentName transportComponent = getRegisteredTransportComponentLocked(transportName);
+ if (transportComponent == null) {
+ throw new TransportNotRegisteredException(transportName);
+ }
+ return transportComponent;
+ }
+
+ @GuardedBy("mTransportLock")
private TransportDescription getRegisteredTransportDescriptionOrThrowLocked(
ComponentName transportComponent) throws TransportNotRegisteredException {
TransportDescription description =
@@ -424,9 +452,13 @@ public class TransportManager {
* {@link TransportClient#connectAsync(TransportConnectionListener, String)} for more
* details.
* @return A {@link TransportClient} or null if not registered.
+ * @throws IllegalStateException if no transport is selected.
*/
@Nullable
public TransportClient getCurrentTransportClient(String caller) {
+ if (mCurrentTransportName == null) {
+ throw new IllegalStateException("No transport selected");
+ }
synchronized (mTransportLock) {
return getTransportClient(mCurrentTransportName, caller);
}
@@ -440,9 +472,13 @@ public class TransportManager {
* details.
* @return A {@link TransportClient}.
* @throws TransportNotRegisteredException if the transport is not registered.
+ * @throws IllegalStateException if no transport is selected.
*/
public TransportClient getCurrentTransportClientOrThrow(String caller)
throws TransportNotRegisteredException {
+ if (mCurrentTransportName == null) {
+ throw new IllegalStateException("No transport selected");
+ }
synchronized (mTransportLock) {
return getTransportClientOrThrow(mCurrentTransportName, caller);
}
@@ -555,8 +591,9 @@ public class TransportManager {
/** Transport has to be whitelisted and privileged. */
private boolean isTransportTrusted(ComponentName transport) {
if (!mTransportWhitelist.contains(transport)) {
- Slog.w(TAG, "BackupTransport " + transport.flattenToShortString() +
- " not whitelisted.");
+ Slog.w(
+ TAG,
+ "BackupTransport " + transport.flattenToShortString() + " not whitelisted.");
return false;
}
try {
@@ -596,8 +633,9 @@ public class TransportManager {
Bundle extras = new Bundle();
extras.putBoolean(BackupTransport.EXTRA_TRANSPORT_REGISTRATION, true);
- TransportClient transportClient = mTransportClientManager.getTransportClient(
- transportComponent, extras, callerLogString);
+ TransportClient transportClient =
+ mTransportClientManager.getTransportClient(
+ transportComponent, extras, callerLogString);
final IBackupTransport transport;
try {
transport = transportClient.connectOrThrow(callerLogString);
diff --git a/services/backup/java/com/android/server/backup/internal/BackupRequest.java b/services/backup/java/com/android/server/backup/internal/BackupRequest.java
index 20c3cc4c6c76..01e43851661d 100644
--- a/services/backup/java/com/android/server/backup/internal/BackupRequest.java
+++ b/services/backup/java/com/android/server/backup/internal/BackupRequest.java
@@ -16,11 +16,12 @@
package com.android.server.backup.internal;
+import java.util.Objects;
+
/**
* Set of backup services that have pending changes.
*/
public class BackupRequest {
-
public String packageName;
public BackupRequest(String pkgName) {
@@ -30,4 +31,21 @@ public class BackupRequest {
public String toString() {
return "BackupRequest{pkg=" + packageName + "}";
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof BackupRequest)) {
+ return false;
+ }
+ BackupRequest that = (BackupRequest) o;
+ return Objects.equals(packageName, that.packageName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(packageName);
+ }
}
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index cc7304a93bbb..90b4bbd6f5f2 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -30,6 +30,7 @@ import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTOR
import android.annotation.Nullable;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
+import android.app.backup.BackupAgent;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupManager;
@@ -205,10 +206,8 @@ public class PerformBackupTask implements BackupRestoreTask {
* Put this task in the repository of running tasks.
*/
private void registerTask() {
- synchronized (backupManagerService.getCurrentOpLock()) {
- backupManagerService.getCurrentOperations().put(
- mCurrentOpToken, new Operation(OP_PENDING, this, OP_TYPE_BACKUP));
- }
+ backupManagerService.putOperation(
+ mCurrentOpToken, new Operation(OP_PENDING, this, OP_TYPE_BACKUP));
}
/**
@@ -269,7 +268,6 @@ public class PerformBackupTask implements BackupRestoreTask {
if (mOriginalQueue.isEmpty() && mPendingFullBackups.isEmpty()) {
Slog.w(TAG, "Backup begun with an empty queue - nothing to do.");
backupManagerService.addBackupTrace("queue empty at begin");
- BackupObserverUtils.sendBackupFinished(mObserver, BackupManager.SUCCESS);
executeNextState(BackupState.FINAL);
return;
}
@@ -349,8 +347,6 @@ public class PerformBackupTask implements BackupRestoreTask {
// restage everything and try again later.
backupManagerService.resetBackupState(mStateDir); // Just to make sure.
// In case of any other error, it's backup transport error.
- BackupObserverUtils.sendBackupFinished(mObserver,
- BackupManager.ERROR_TRANSPORT_ABORTED);
executeNextState(BackupState.FINAL);
}
}
@@ -361,7 +357,7 @@ public class PerformBackupTask implements BackupRestoreTask {
// The package manager doesn't have a proper <application> etc, but since it's running
// here in the system process we can just set up its agent directly and use a synthetic
// BackupRequest.
- PackageManagerBackupAgent pmAgent = backupManagerService.makeMetadataAgent();
+ BackupAgent pmAgent = backupManagerService.makeMetadataAgent();
mStatus = invokeAgentForBackup(
PACKAGE_MANAGER_SENTINEL,
IBackupAgent.Stub.asInterface(pmAgent.onBind()));
@@ -384,21 +380,11 @@ public class PerformBackupTask implements BackupRestoreTask {
// if things went wrong at this point, we need to
// restage everything and try again later.
backupManagerService.resetBackupState(mStateDir); // Just to make sure.
- BackupObserverUtils.sendBackupFinished(mObserver,
- invokeAgentToObserverError(mStatus));
executeNextState(BackupState.FINAL);
}
}
}
- private int invokeAgentToObserverError(int error) {
- if (error == BackupTransport.AGENT_ERROR) {
- return BackupManager.ERROR_AGENT_FAILURE;
- } else {
- return BackupManager.ERROR_TRANSPORT_ABORTED;
- }
- }
-
// Transport has been initialized and the PM metadata submitted successfully
// if that was warranted. Now we process the single next thing in the queue.
private void invokeNextAgent() {
@@ -897,7 +883,12 @@ public class PerformBackupTask implements BackupRestoreTask {
.sendBackupOnPackageResult(mObserver, pkgName,
BackupManager.ERROR_AGENT_FAILURE);
errorCleanup();
- // agentErrorCleanup() implicitly executes next state properly
+ if (MORE_DEBUG) {
+ Slog.i(TAG, "Agent failure for " + pkgName
+ + " with illegal key: " + key + "; dropped");
+ }
+ executeNextState(mQueue.isEmpty() ? BackupState.FINAL
+ : BackupState.RUNNING_QUEUE);
return;
}
in.skipEntityData();
diff --git a/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java b/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
index 88e0b7fc3045..1ef740db614f 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformInitializeTask.java
@@ -130,9 +130,13 @@ public class PerformInitializeTask implements Runnable {
IBackupTransport transport = transportClient.connectOrThrow(callerLogString);
int status = transport.initializeDevice();
-
- if (status == BackupTransport.TRANSPORT_OK) {
+ if (status != BackupTransport.TRANSPORT_OK) {
+ Slog.e(TAG, "Transport error in initializeDevice()");
+ } else {
status = transport.finishBackup();
+ if (status != BackupTransport.TRANSPORT_OK) {
+ Slog.e(TAG, "Transport error in finishBackup()");
+ }
}
// Okay, the wipe really happened. Clean up our local bookkeeping.
@@ -148,7 +152,6 @@ public class PerformInitializeTask implements Runnable {
} else {
// If this didn't work, requeue this one and try again
// after a suitable interval
- Slog.e(TAG, "Transport error in initializeDevice()");
EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(initialize)");
mBackupManagerService.recordInitPending(true, transportName, transportDirName);
notifyResult(transportName, status);
diff --git a/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedRunnable.java b/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedRunnable.java
new file mode 100644
index 000000000000..dc7044e450b7
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/restore/AdbRestoreFinishedRunnable.java
@@ -0,0 +1,33 @@
+package com.android.server.backup.restore;
+
+import android.app.IBackupAgent;
+import android.os.RemoteException;
+
+import com.android.server.backup.BackupManagerService;
+
+/**
+ * Runner that can be placed on a separate thread to do in-process invocation of the "restore
+ * finished" API asynchronously. Used by adb restore.
+ */
+public class AdbRestoreFinishedRunnable implements Runnable {
+
+ private final IBackupAgent mAgent;
+ private final int mToken;
+ private final BackupManagerService mBackupManagerService;
+
+ AdbRestoreFinishedRunnable(IBackupAgent agent, int token,
+ BackupManagerService backupManagerService) {
+ mAgent = agent;
+ mToken = token;
+ mBackupManagerService = backupManagerService;
+ }
+
+ @Override
+ public void run() {
+ try {
+ mAgent.doRestoreFinished(mToken, mBackupManagerService.getBackupManagerBinder());
+ } catch (RemoteException e) {
+ // never happens; this is used only for local binder calls
+ }
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
index 6bc753000837..1084f52ed36d 100644
--- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
@@ -122,15 +122,17 @@ public class FullRestoreEngine extends RestoreEngine {
// Widget blob to be restored out-of-band
private byte[] mWidgetData = null;
+ private long mAppVersion;
final int mEphemeralOpToken;
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
+ final boolean mIsAdbRestore;
public FullRestoreEngine(BackupManagerService backupManagerService,
BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer,
IBackupManagerMonitor monitor, PackageInfo onlyPackage, boolean allowApks,
- boolean allowObbs, int ephemeralOpToken) {
+ boolean allowObbs, int ephemeralOpToken, boolean isAdbRestore) {
mBackupManagerService = backupManagerService;
mEphemeralOpToken = ephemeralOpToken;
mMonitorTask = monitorTask;
@@ -144,6 +146,7 @@ public class FullRestoreEngine extends RestoreEngine {
mAgentTimeoutParameters = Preconditions.checkNotNull(
backupManagerService.getAgentTimeoutParameters(),
"Timeout parameters cannot be null");
+ mIsAdbRestore = isAdbRestore;
}
public IBackupAgent getAgent() {
@@ -209,7 +212,7 @@ public class FullRestoreEngine extends RestoreEngine {
}
// Now we're really done
tearDownPipes();
- tearDownAgent(mTargetApp);
+ tearDownAgent(mTargetApp, mIsAdbRestore);
mTargetApp = null;
mAgentPackage = null;
}
@@ -218,6 +221,9 @@ public class FullRestoreEngine extends RestoreEngine {
if (info.path.equals(BACKUP_MANIFEST_FILENAME)) {
Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
info);
+ // readAppManifestAndReturnSignatures() will have extracted the version from
+ // the manifest, so we save it to use in adb key-value restore later.
+ mAppVersion = info.version;
PackageManagerInternal pmi = LocalServices.getService(
PackageManagerInternal.class);
RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
@@ -362,7 +368,9 @@ public class FullRestoreEngine extends RestoreEngine {
// All set; now set up the IPC and launch the agent
setUpPipes();
mAgent = mBackupManagerService.bindToAgentSynchronous(mTargetApp,
- ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
+ FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)
+ ? ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL
+ : ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
mAgentPackage = pkg;
} catch (IOException e) {
// fall through to error handling
@@ -419,6 +427,8 @@ public class FullRestoreEngine extends RestoreEngine {
Slog.d(TAG, "Restoring key-value file for " + pkg
+ " : " + info.path);
}
+ // Set the version saved from manifest entry.
+ info.version = mAppVersion;
KeyValueAdbRestoreEngine restoreEngine =
new KeyValueAdbRestoreEngine(
mBackupManagerService,
@@ -506,7 +516,7 @@ public class FullRestoreEngine extends RestoreEngine {
mBackupManagerService.getBackupHandler().removeMessages(
MSG_RESTORE_OPERATION_TIMEOUT);
tearDownPipes();
- tearDownAgent(mTargetApp);
+ tearDownAgent(mTargetApp, false);
mAgent = null;
mPackagePolicies.put(pkg, RestorePolicy.IGNORE);
@@ -559,7 +569,7 @@ public class FullRestoreEngine extends RestoreEngine {
tearDownPipes();
setRunning(false);
if (mustKillAgent) {
- tearDownAgent(mTargetApp);
+ tearDownAgent(mTargetApp, mIsAdbRestore);
}
}
return (info != null);
@@ -588,9 +598,37 @@ public class FullRestoreEngine extends RestoreEngine {
}
}
- private void tearDownAgent(ApplicationInfo app) {
+ private void tearDownAgent(ApplicationInfo app, boolean doRestoreFinished) {
if (mAgent != null) {
- mBackupManagerService.tearDownAgentAndKill(app);
+ try {
+ // In the adb restore case, we do restore-finished here
+ if (doRestoreFinished) {
+ final int token = mBackupManagerService.generateRandomIntegerToken();
+ long fullBackupAgentTimeoutMillis =
+ mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
+ final AdbRestoreFinishedLatch latch = new AdbRestoreFinishedLatch(
+ mBackupManagerService, token);
+ mBackupManagerService.prepareOperationTimeout(
+ token, fullBackupAgentTimeoutMillis, latch, OP_TYPE_RESTORE_WAIT);
+ if (mTargetApp.processName.equals("system")) {
+ if (MORE_DEBUG) {
+ Slog.d(TAG, "system agent - restoreFinished on thread");
+ }
+ Runnable runner = new AdbRestoreFinishedRunnable(mAgent, token,
+ mBackupManagerService);
+ new Thread(runner, "restore-sys-finished-runner").start();
+ } else {
+ mAgent.doRestoreFinished(token,
+ mBackupManagerService.getBackupManagerBinder());
+ }
+
+ latch.await();
+ }
+
+ mBackupManagerService.tearDownAgentAndKill(app);
+ } catch (RemoteException e) {
+ Slog.d(TAG, "Lost app trying to shut down");
+ }
mAgent = null;
}
}
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngineThread.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngineThread.java
new file mode 100644
index 000000000000..7075608674a1
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngineThread.java
@@ -0,0 +1,63 @@
+package com.android.server.backup.restore;
+
+import android.os.ParcelFileDescriptor;
+
+import libcore.io.IoUtils;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+class FullRestoreEngineThread implements Runnable {
+
+ FullRestoreEngine mEngine;
+ InputStream mEngineStream;
+ private final boolean mMustKillAgent;
+
+ FullRestoreEngineThread(FullRestoreEngine engine, ParcelFileDescriptor engineSocket) {
+ mEngine = engine;
+ engine.setRunning(true);
+ // We *do* want this FileInputStream to own the underlying fd, so that
+ // when we are finished with it, it closes this end of the pipe in a way
+ // that signals its other end.
+ mEngineStream = new FileInputStream(engineSocket.getFileDescriptor(), true);
+ // Tell it to be sure to leave the agent instance up after finishing
+ mMustKillAgent = false;
+ }
+
+ //for adb restore
+ FullRestoreEngineThread(FullRestoreEngine engine, InputStream inputStream) {
+ mEngine = engine;
+ engine.setRunning(true);
+ mEngineStream = inputStream;
+ // philippov: in adb agent is killed after restore.
+ mMustKillAgent = true;
+ }
+
+ public boolean isRunning() {
+ return mEngine.isRunning();
+ }
+
+ public int waitForResult() {
+ return mEngine.waitForResult();
+ }
+
+ @Override
+ public void run() {
+ try {
+ while (mEngine.isRunning()) {
+ mEngine.restoreOneFile(mEngineStream, mMustKillAgent, mEngine.mBuffer,
+ mEngine.mOnlyPackage, mEngine.mAllowApks, mEngine.mEphemeralOpToken,
+ mEngine.mMonitor);
+ }
+ } finally {
+ // Because mEngineStream adopted its underlying FD, this also
+ // closes this end of the pipe.
+ IoUtils.closeQuietly(mEngineStream);
+ }
+ }
+
+ public void handleTimeout() {
+ IoUtils.closeQuietly(mEngineStream);
+ mEngine.handleTimeout();
+ }
+}
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index 0c99b4400dd6..32dbad9f92db 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -18,8 +18,6 @@ package com.android.server.backup.restore;
import static com.android.server.backup.BackupManagerService.BACKUP_FILE_HEADER_MAGIC;
import static com.android.server.backup.BackupManagerService.BACKUP_FILE_VERSION;
-import static com.android.server.backup.BackupManagerService.BACKUP_MANIFEST_FILENAME;
-import static com.android.server.backup.BackupManagerService.BACKUP_METADATA_FILENAME;
import static com.android.server.backup.BackupManagerService.DEBUG;
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
import static com.android.server.backup.BackupManagerService.OP_TYPE_RESTORE_WAIT;
@@ -30,15 +28,11 @@ import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
-import android.app.ApplicationThreadConstants;
+
import android.app.IBackupAgent;
-import android.app.backup.FullBackup;
-import android.app.backup.IBackupManagerMonitor;
+import android.app.backup.BackupAgent;
import android.app.backup.IFullBackupRestoreObserver;
import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
@@ -50,18 +44,12 @@ import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
-import com.android.server.backup.FileMetadata;
-import com.android.server.backup.KeyValueAdbRestoreEngine;
import com.android.server.backup.PackageManagerBackupAgent;
import com.android.server.backup.fullbackup.FullBackupObbConnection;
-import com.android.server.backup.utils.BytesReadListener;
import com.android.server.backup.utils.FullBackupRestoreObserverUtils;
import com.android.server.backup.utils.PasswordUtils;
-import com.android.server.backup.utils.RestoreUtils;
-import com.android.server.backup.utils.TarBackupReader;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidAlgorithmParameterException;
@@ -89,7 +77,7 @@ public class PerformAdbRestoreTask implements Runnable {
private final String mCurrentPassword;
private final String mDecryptPassword;
private final AtomicBoolean mLatchObject;
- private final PackageManagerBackupAgent mPackageManagerBackupAgent;
+ private final BackupAgent mPackageManagerBackupAgent;
private final RestoreDeleteObserver mDeleteObserver = new RestoreDeleteObserver();
private IFullBackupRestoreObserver mObserver;
@@ -104,31 +92,6 @@ public class PerformAdbRestoreTask implements Runnable {
private long mBytes;
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
- // Runner that can be placed on a separate thread to do in-process invocation
- // of the "restore finished" API asynchronously. Used by adb restore.
- private static class RestoreFinishedRunnable implements Runnable {
-
- private final IBackupAgent mAgent;
- private final int mToken;
- private final BackupManagerService mBackupManagerService;
-
- RestoreFinishedRunnable(IBackupAgent agent, int token,
- BackupManagerService backupManagerService) {
- mAgent = agent;
- mToken = token;
- mBackupManagerService = backupManagerService;
- }
-
- @Override
- public void run() {
- try {
- mAgent.doRestoreFinished(mToken, mBackupManagerService.getBackupManagerBinder());
- } catch (RemoteException e) {
- // never happens; this is used only for local binder calls
- }
- }
- }
-
// possible handling states for a given package in the restore dataset
private final HashMap<String, RestorePolicy> mPackagePolicies
= new HashMap<>();
@@ -199,23 +162,18 @@ public class PerformAdbRestoreTask implements Runnable {
return;
}
- byte[] buffer = new byte[32 * 1024];
- boolean didRestore;
- do {
- didRestore = restoreOneFile(tarInputStream, false /* mustKillAgent */, buffer,
- null /* onlyPackage */, true /* allowApks */,
- mBackupManagerService.generateRandomIntegerToken(), null /* monitor */);
- } while (didRestore);
+ FullRestoreEngine mEngine = new FullRestoreEngine(mBackupManagerService, null,
+ mObserver, null, null, true, true/*unused*/, 0 /*unused*/, true);
+ FullRestoreEngineThread mEngineThread = new FullRestoreEngineThread(mEngine,
+ tarInputStream);
+ mEngineThread.run();
if (MORE_DEBUG) {
- Slog.v(TAG, "Done consuming input tarfile, total bytes=" + mBytes);
+ Slog.v(TAG, "Done consuming input tarfile.");
}
} catch (IOException e) {
Slog.e(TAG, "Unable to read restore input");
} finally {
- tearDownPipes();
- tearDownAgent(mTargetApp, true);
-
try {
if (rawInStream != null) {
rawInStream.close();
@@ -433,432 +391,4 @@ public class PerformAdbRestoreTask implements Runnable {
return result;
}
-
- boolean restoreOneFile(InputStream instream, boolean mustKillAgent, byte[] buffer,
- PackageInfo onlyPackage, boolean allowApks, int token, IBackupManagerMonitor monitor) {
- BytesReadListener bytesReadListener = new BytesReadListener() {
- @Override
- public void onBytesRead(long bytesRead) {
- mBytes += bytesRead;
- }
- };
- TarBackupReader tarBackupReader = new TarBackupReader(instream,
- bytesReadListener, monitor);
- FileMetadata info;
- try {
- info = tarBackupReader.readTarHeaders();
- if (info != null) {
- if (MORE_DEBUG) {
- info.dump();
- }
-
- final String pkg = info.packageName;
- if (!pkg.equals(mAgentPackage)) {
- // okay, change in package; set up our various
- // bookkeeping if we haven't seen it yet
- if (!mPackagePolicies.containsKey(pkg)) {
- mPackagePolicies.put(pkg, RestorePolicy.IGNORE);
- }
-
- // Clean up the previous agent relationship if necessary,
- // and let the observer know we're considering a new app.
- if (mAgent != null) {
- if (DEBUG) {
- Slog.d(TAG, "Saw new package; finalizing old one");
- }
- // Now we're really done
- tearDownPipes();
- tearDownAgent(mTargetApp, true);
- mTargetApp = null;
- mAgentPackage = null;
- }
- }
-
- if (info.path.equals(BACKUP_MANIFEST_FILENAME)) {
- Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
- info);
- // readAppManifestAndReturnSignatures() will have extracted the version from
- // the manifest, so we save it to use in key-value restore later.
- mAppVersion = info.version;
- PackageManagerInternal pmi = LocalServices.getService(
- PackageManagerInternal.class);
- RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
- mBackupManagerService.getPackageManager(), allowApks,
- info, signatures, pmi);
- mManifestSignatures.put(info.packageName, signatures);
- mPackagePolicies.put(pkg, restorePolicy);
- mPackageInstallers.put(pkg, info.installerPackageName);
- // We've read only the manifest content itself at this point,
- // so consume the footer before looping around to the next
- // input file
- tarBackupReader.skipTarPadding(info.size);
- mObserver = FullBackupRestoreObserverUtils.sendOnRestorePackage(mObserver, pkg);
- } else if (info.path.equals(BACKUP_METADATA_FILENAME)) {
- // Metadata blobs!
- tarBackupReader.readMetadata(info);
-
- // The following only exist because we want to keep refactoring as safe as
- // possible, without changing too much.
- // TODO: Refactor, so that there are no funny things like this.
- // This is read during TarBackupReader.readMetadata().
- mWidgetData = tarBackupReader.getWidgetData();
- // This can be nulled during TarBackupReader.readMetadata().
- monitor = tarBackupReader.getMonitor();
-
- tarBackupReader.skipTarPadding(info.size);
- } else {
- // Non-manifest, so it's actual file data. Is this a package
- // we're ignoring?
- boolean okay = true;
- RestorePolicy policy = mPackagePolicies.get(pkg);
- switch (policy) {
- case IGNORE:
- okay = false;
- break;
-
- case ACCEPT_IF_APK:
- // If we're in accept-if-apk state, then the first file we
- // see MUST be the apk.
- if (info.domain.equals(FullBackup.APK_TREE_TOKEN)) {
- if (DEBUG) {
- Slog.d(TAG, "APK file; installing");
- }
- // Try to install the app.
- String installerPackageName = mPackageInstallers.get(pkg);
- boolean isSuccessfullyInstalled = RestoreUtils.installApk(instream,
- mBackupManagerService.getContext(),
- mDeleteObserver, mManifestSignatures, mPackagePolicies,
- info, installerPackageName, bytesReadListener);
- // good to go; promote to ACCEPT
- mPackagePolicies.put(pkg, isSuccessfullyInstalled
- ? RestorePolicy.ACCEPT
- : RestorePolicy.IGNORE);
- // At this point we've consumed this file entry
- // ourselves, so just strip the tar footer and
- // go on to the next file in the input stream
- tarBackupReader.skipTarPadding(info.size);
- return true;
- } else {
- // File data before (or without) the apk. We can't
- // handle it coherently in this case so ignore it.
- mPackagePolicies.put(pkg, RestorePolicy.IGNORE);
- okay = false;
- }
- break;
-
- case ACCEPT:
- if (info.domain.equals(FullBackup.APK_TREE_TOKEN)) {
- if (DEBUG) {
- Slog.d(TAG, "apk present but ACCEPT");
- }
- // we can take the data without the apk, so we
- // *want* to do so. skip the apk by declaring this
- // one file not-okay without changing the restore
- // policy for the package.
- okay = false;
- }
- break;
-
- default:
- // Something has gone dreadfully wrong when determining
- // the restore policy from the manifest. Ignore the
- // rest of this package's data.
- Slog.e(TAG, "Invalid policy from manifest");
- okay = false;
- mPackagePolicies.put(pkg, RestorePolicy.IGNORE);
- break;
- }
-
- // The path needs to be canonical
- if (!isCanonicalFilePath(info.path)) {
- okay = false;
- }
-
- // If the policy is satisfied, go ahead and set up to pipe the
- // data to the agent.
- if (DEBUG && okay && mAgent != null) {
- Slog.i(TAG, "Reusing existing agent instance");
- }
- if (okay && mAgent == null) {
- if (DEBUG) {
- Slog.d(TAG, "Need to launch agent for " + pkg);
- }
-
- try {
- mTargetApp =
- mBackupManagerService.getPackageManager().getApplicationInfo(
- pkg, 0);
-
- // If we haven't sent any data to this app yet, we probably
- // need to clear it first. Check that.
- if (!mClearedPackages.contains(pkg)) {
- // apps with their own backup agents are
- // responsible for coherently managing a full
- // restore.
- if (mTargetApp.backupAgentName == null) {
- if (DEBUG) {
- Slog.d(TAG,
- "Clearing app data preparatory to full restore");
- }
- mBackupManagerService.clearApplicationDataSynchronous(pkg, true);
- } else {
- if (DEBUG) {
- Slog.d(TAG, "backup agent ("
- + mTargetApp.backupAgentName + ") => no clear");
- }
- }
- mClearedPackages.add(pkg);
- } else {
- if (DEBUG) {
- Slog.d(TAG, "We've initialized this app already; no clear "
- + "required");
- }
- }
-
- // All set; now set up the IPC and launch the agent
- setUpPipes();
- mAgent = mBackupManagerService.bindToAgentSynchronous(mTargetApp,
- FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)
- ? ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL
- : ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL);
- mAgentPackage = pkg;
- } catch (IOException e) {
- // fall through to error handling
- } catch (NameNotFoundException e) {
- // fall through to error handling
- }
-
- if (mAgent == null) {
- Slog.e(TAG, "Unable to create agent for " + pkg);
- okay = false;
- tearDownPipes();
- mPackagePolicies.put(pkg, RestorePolicy.IGNORE);
- }
- }
-
- // Sanity check: make sure we never give data to the wrong app. This
- // should never happen but a little paranoia here won't go amiss.
- if (okay && !pkg.equals(mAgentPackage)) {
- Slog.e(TAG, "Restoring data for " + pkg
- + " but agent is for " + mAgentPackage);
- okay = false;
- }
-
- // At this point we have an agent ready to handle the full
- // restore data as well as a pipe for sending data to
- // that agent. Tell the agent to start reading from the
- // pipe.
- if (okay) {
- boolean agentSuccess = true;
- long toCopy = info.size;
- long restoreAgentTimeoutMillis =
- mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
- try {
- mBackupManagerService.prepareOperationTimeout(
- token, restoreAgentTimeoutMillis, null, OP_TYPE_RESTORE_WAIT);
-
- if (FullBackup.OBB_TREE_TOKEN.equals(info.domain)) {
- if (DEBUG) {
- Slog.d(TAG, "Restoring OBB file for " + pkg
- + " : " + info.path);
- }
- mObbConnection.restoreObbFile(pkg, mPipes[0],
- info.size, info.type, info.path, info.mode,
- info.mtime, token,
- mBackupManagerService.getBackupManagerBinder());
- } else if (FullBackup.KEY_VALUE_DATA_TOKEN.equals(info.domain)) {
- if (DEBUG) {
- Slog.d(TAG, "Restoring key-value file for " + pkg
- + " : " + info.path);
- }
- // Set the version saved from manifest entry.
- info.version = mAppVersion;
- KeyValueAdbRestoreEngine restoreEngine =
- new KeyValueAdbRestoreEngine(
- mBackupManagerService,
- mBackupManagerService.getDataDir(), info, mPipes[0],
- mAgent, token);
- new Thread(restoreEngine, "restore-key-value-runner").start();
- } else {
- if (DEBUG) {
- Slog.d(TAG, "Invoking agent to restore file " + info.path);
- }
- // fire up the app's agent listening on the socket. If
- // the agent is running in the system process we can't
- // just invoke it asynchronously, so we provide a thread
- // for it here.
- if (mTargetApp.processName.equals("system")) {
- Slog.d(TAG, "system process agent - spinning a thread");
- RestoreFileRunnable runner = new RestoreFileRunnable(
- mBackupManagerService, mAgent, info, mPipes[0], token);
- new Thread(runner, "restore-sys-runner").start();
- } else {
- mAgent.doRestoreFile(mPipes[0], info.size, info.type,
- info.domain, info.path, info.mode, info.mtime,
- token, mBackupManagerService.getBackupManagerBinder());
- }
- }
- } catch (IOException e) {
- // couldn't dup the socket for a process-local restore
- Slog.d(TAG, "Couldn't establish restore");
- agentSuccess = false;
- okay = false;
- } catch (RemoteException e) {
- // whoops, remote entity went away. We'll eat the content
- // ourselves, then, and not copy it over.
- Slog.e(TAG, "Agent crashed during full restore");
- agentSuccess = false;
- okay = false;
- }
-
- // Copy over the data if the agent is still good
- if (okay) {
- boolean pipeOkay = true;
- FileOutputStream pipe = new FileOutputStream(
- mPipes[1].getFileDescriptor());
- while (toCopy > 0) {
- int toRead = (toCopy > buffer.length)
- ? buffer.length : (int) toCopy;
- int nRead = instream.read(buffer, 0, toRead);
- if (nRead >= 0) {
- mBytes += nRead;
- }
- if (nRead <= 0) {
- break;
- }
- toCopy -= nRead;
-
- // send it to the output pipe as long as things
- // are still good
- if (pipeOkay) {
- try {
- pipe.write(buffer, 0, nRead);
- } catch (IOException e) {
- Slog.e(TAG, "Failed to write to restore pipe", e);
- pipeOkay = false;
- }
- }
- }
-
- // done sending that file! Now we just need to consume
- // the delta from info.size to the end of block.
- tarBackupReader.skipTarPadding(info.size);
-
- // and now that we've sent it all, wait for the remote
- // side to acknowledge receipt
- agentSuccess = mBackupManagerService.waitUntilOperationComplete(token);
- }
-
- // okay, if the remote end failed at any point, deal with
- // it by ignoring the rest of the restore on it
- if (!agentSuccess) {
- if (DEBUG) {
- Slog.d(TAG, "Agent failure restoring " + pkg + "; now ignoring");
- }
- mBackupManagerService.getBackupHandler().removeMessages(
- MSG_RESTORE_OPERATION_TIMEOUT);
- tearDownPipes();
- tearDownAgent(mTargetApp, false);
- mPackagePolicies.put(pkg, RestorePolicy.IGNORE);
- }
- }
-
- // Problems setting up the agent communication, or an already-
- // ignored package: skip to the next tar stream entry by
- // reading and discarding this file.
- if (!okay) {
- if (DEBUG) {
- Slog.d(TAG, "[discarding file content]");
- }
- long bytesToConsume = (info.size + 511) & ~511;
- while (bytesToConsume > 0) {
- int toRead = (bytesToConsume > buffer.length)
- ? buffer.length : (int) bytesToConsume;
- long nRead = instream.read(buffer, 0, toRead);
- if (nRead >= 0) {
- mBytes += nRead;
- }
- if (nRead <= 0) {
- break;
- }
- bytesToConsume -= nRead;
- }
- }
- }
- }
- } catch (IOException e) {
- if (DEBUG) {
- Slog.w(TAG, "io exception on restore socket read", e);
- }
- // treat as EOF
- info = null;
- }
-
- return (info != null);
- }
-
- private static boolean isCanonicalFilePath(String path) {
- if (path.contains("..") || path.contains("//")) {
- if (MORE_DEBUG) {
- Slog.w(TAG, "Dropping invalid path " + path);
- }
- return false;
- }
-
- return true;
- }
-
- private void setUpPipes() throws IOException {
- mPipes = ParcelFileDescriptor.createPipe();
- }
-
- private void tearDownPipes() {
- if (mPipes != null) {
- try {
- mPipes[0].close();
- mPipes[0] = null;
- mPipes[1].close();
- mPipes[1] = null;
- } catch (IOException e) {
- Slog.w(TAG, "Couldn't close agent pipes", e);
- }
- mPipes = null;
- }
- }
-
- private void tearDownAgent(ApplicationInfo app, boolean doRestoreFinished) {
- if (mAgent != null) {
- try {
- // In the adb restore case, we do restore-finished here
- if (doRestoreFinished) {
- final int token = mBackupManagerService.generateRandomIntegerToken();
- long fullBackupAgentTimeoutMillis =
- mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
- final AdbRestoreFinishedLatch latch = new AdbRestoreFinishedLatch(
- mBackupManagerService, token);
- mBackupManagerService.prepareOperationTimeout(
- token, fullBackupAgentTimeoutMillis, latch, OP_TYPE_RESTORE_WAIT);
- if (mTargetApp.processName.equals("system")) {
- if (MORE_DEBUG) {
- Slog.d(TAG, "system agent - restoreFinished on thread");
- }
- Runnable runner = new RestoreFinishedRunnable(mAgent, token,
- mBackupManagerService);
- new Thread(runner, "restore-sys-finished-runner").start();
- } else {
- mAgent.doRestoreFinished(token,
- mBackupManagerService.getBackupManagerBinder());
- }
-
- latch.await();
- }
-
- mBackupManagerService.tearDownAgentAndKill(app);
- } catch (RemoteException e) {
- Slog.d(TAG, "Lost app trying to shut down");
- }
- mAgent = null;
- }
- }
-
}
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 12d72d8a4637..580f70a046b5 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -841,7 +841,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
final String TAG = "StreamFeederThread";
FullRestoreEngine mEngine;
- EngineThread mEngineThread;
+ FullRestoreEngineThread mEngineThread;
// pipe through which we read data from the transport. [0] read, [1] write
ParcelFileDescriptor[] mTransportPipes;
@@ -867,8 +867,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mCurrentPackage.packageName);
mEngine = new FullRestoreEngine(backupManagerService, this, null,
- mMonitor, mCurrentPackage, false, false, mEphemeralOpToken);
- mEngineThread = new EngineThread(mEngine, mEnginePipes[0]);
+ mMonitor, mCurrentPackage, false, false, mEphemeralOpToken, false);
+ mEngineThread = new FullRestoreEngineThread(mEngine, mEnginePipes[0]);
ParcelFileDescriptor eWriteEnd = mEnginePipes[1];
ParcelFileDescriptor tReadEnd = mTransportPipes[0];
@@ -1031,50 +1031,6 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
}
}
- class EngineThread implements Runnable {
-
- FullRestoreEngine mEngine;
- FileInputStream mEngineStream;
-
- EngineThread(FullRestoreEngine engine, ParcelFileDescriptor engineSocket) {
- mEngine = engine;
- engine.setRunning(true);
- // We *do* want this FileInputStream to own the underlying fd, so that
- // when we are finished with it, it closes this end of the pipe in a way
- // that signals its other end.
- mEngineStream = new FileInputStream(engineSocket.getFileDescriptor(), true);
- }
-
- public boolean isRunning() {
- return mEngine.isRunning();
- }
-
- public int waitForResult() {
- return mEngine.waitForResult();
- }
-
- @Override
- public void run() {
- try {
- while (mEngine.isRunning()) {
- // Tell it to be sure to leave the agent instance up after finishing
- mEngine.restoreOneFile(mEngineStream, false, mEngine.mBuffer,
- mEngine.mOnlyPackage, mEngine.mAllowApks, mEngine.mEphemeralOpToken,
- mEngine.mMonitor);
- }
- } finally {
- // Because mEngineStream adopted its underlying FD, this also
- // closes this end of the pipe.
- IoUtils.closeQuietly(mEngineStream);
- }
- }
-
- public void handleTimeout() {
- IoUtils.closeQuietly(mEngineStream);
- mEngine.handleTimeout();
- }
- }
-
// state FINAL : tear everything down and we're done.
private void finalizeRestore() {
if (MORE_DEBUG) {
diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
index c39cceb538c8..28e9b77c82fc 100644
--- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
@@ -126,7 +126,8 @@ public class AppBackupUtils {
case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER:
case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:
return true;
-
+ case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT:
+ return !app.enabled;
default:
return false;
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index d44fe4dbc450..3865b2779466 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -23,7 +23,6 @@ import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.Preconditions.checkState;
import static com.android.internal.util.function.pooled.PooledLambda.obtainRunnable;
-import android.Manifest;
import android.annotation.CheckResult;
import android.annotation.Nullable;
import android.app.PendingIntent;
@@ -39,6 +38,7 @@ import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageInfo;
+import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.net.NetworkPolicyManager;
import android.os.Binder;
@@ -289,7 +289,10 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
String packageTitle = BidiFormatter.getInstance().unicodeWrap(
getPackageInfo(callingPackage, userId)
.applicationInfo
- .loadSafeLabel(getContext().getPackageManager())
+ .loadSafeLabel(getContext().getPackageManager(),
+ PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
+ PackageItemInfo.SAFE_LABEL_FLAG_TRIM
+ | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE)
.toString());
long identity = Binder.clearCallingIdentity();
try {
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 8da6d1e48ffe..d9519e015f67 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -26,7 +26,6 @@ java_library_static {
"android.hardware.light-V2.0-java",
"android.hardware.power-V1.0-java",
"android.hardware.tv.cec-V1.0-java",
- "android.hidl.manager-V1.0-java",
],
static_libs: [
@@ -37,12 +36,14 @@ java_library_static {
"android.hardware.health-V1.0-java",
"android.hardware.health-V2.0-java",
"android.hardware.weaver-V1.0-java",
+ "android.hardware.biometrics.face-V1.0-java",
"android.hardware.biometrics.fingerprint-V2.1-java",
"android.hardware.oemlock-V1.0-java",
"android.hardware.tetheroffload.control-V1.0-java",
"android.hardware.vibrator-V1.0-java",
"android.hardware.configstore-V1.0-java",
"android.hardware.contexthub-V1.0-java",
+ "android.hidl.manager-V1.0-java",
],
}
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index f79a51b13afd..26ef42f2b1e7 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -172,7 +172,8 @@ class AlarmManagerService extends SystemService {
long mNativeData;
private long mNextWakeup;
private long mNextNonWakeup;
- private long mLastWakeupSet;
+ private long mNextWakeUpSetAt;
+ private long mNextNonWakeUpSetAt;
private long mLastWakeup;
private long mLastTrigger;
private long mLastTickSet;
@@ -1388,7 +1389,19 @@ class AlarmManagerService extends SystemService {
}
synchronized (mLock) {
- return setKernelTime(mNativeData, millis) == 0;
+ final long currentTimeMillis = System.currentTimeMillis();
+ setKernelTime(mNativeData, millis);
+ final TimeZone timeZone = TimeZone.getDefault();
+ final int currentTzOffset = timeZone.getOffset(currentTimeMillis);
+ final int newTzOffset = timeZone.getOffset(millis);
+ if (currentTzOffset != newTzOffset) {
+ Slog.i(TAG, "Timezone offset has changed, updating kernel timezone");
+ setKernelTimezone(mNativeData, -(newTzOffset / 60000));
+ }
+ // The native implementation of setKernelTime can return -1 even when the kernel
+ // time was set correctly, so assume setting kernel time was successful and always
+ // return true.
+ return true;
}
}
@@ -1927,7 +1940,7 @@ class AlarmManagerService extends SystemService {
TimeUtils.formatDuration(nowELAPSED - mLastAlarmDeliveryTime, pw);
pw.println();
pw.print(" Next non-wakeup delivery time: ");
- TimeUtils.formatDuration(nowELAPSED - mNextNonWakeupDeliveryTime, pw);
+ TimeUtils.formatDuration(mNextNonWakeupDeliveryTime, nowELAPSED, pw);
pw.println();
long nextWakeupRTC = mNextWakeup + (nowRTC - nowELAPSED);
@@ -1936,11 +1949,21 @@ class AlarmManagerService extends SystemService {
TimeUtils.formatDuration(mNextNonWakeup, nowELAPSED, pw);
pw.print(" = "); pw.print(mNextNonWakeup);
pw.print(" = "); pw.println(sdf.format(new Date(nextNonWakeupRTC)));
+ pw.print(" set at "); TimeUtils.formatDuration(mNextNonWakeUpSetAt, nowELAPSED, pw);
+ pw.println();
pw.print(" Next wakeup alarm: "); TimeUtils.formatDuration(mNextWakeup, nowELAPSED, pw);
pw.print(" = "); pw.print(mNextWakeup);
pw.print(" = "); pw.println(sdf.format(new Date(nextWakeupRTC)));
- pw.print(" set at "); TimeUtils.formatDuration(mLastWakeupSet, nowELAPSED, pw);
+ pw.print(" set at "); TimeUtils.formatDuration(mNextWakeUpSetAt, nowELAPSED, pw);
pw.println();
+
+ pw.print(" Next kernel non-wakeup alarm: ");
+ TimeUtils.formatDuration(getNextAlarm(mNativeData, ELAPSED_REALTIME), pw);
+ pw.println();
+ pw.print(" Next kernel wakeup alarm: ");
+ TimeUtils.formatDuration(getNextAlarm(mNativeData, ELAPSED_REALTIME_WAKEUP), pw);
+ pw.println();
+
pw.print(" Last wakeup: "); TimeUtils.formatDuration(mLastWakeup, nowELAPSED, pw);
pw.print(" = "); pw.println(mLastWakeup);
pw.print(" Last trigger: "); TimeUtils.formatDuration(mLastTrigger, nowELAPSED, pw);
@@ -2270,7 +2293,7 @@ class AlarmManagerService extends SystemService {
proto.write(AlarmManagerServiceDumpProto.TIME_SINCE_LAST_WAKEUP_MS,
nowElapsed - mLastWakeup);
proto.write(AlarmManagerServiceDumpProto.TIME_SINCE_LAST_WAKEUP_SET_MS,
- nowElapsed - mLastWakeupSet);
+ nowElapsed - mNextWakeUpSetAt);
proto.write(AlarmManagerServiceDumpProto.TIME_CHANGE_EVENT_COUNT, mNumTimeChanged);
final TreeSet<Integer> users = new TreeSet<>();
@@ -2655,16 +2678,53 @@ class AlarmManagerService extends SystemService {
DateFormat.format(pattern, info.getTriggerTime()).toString();
}
+ /**
+ * If the last time AlarmThread woke up precedes any due wakeup or non-wakeup alarm that we set
+ * by more than half a minute, log a wtf.
+ */
+ private void validateLastAlarmExpiredLocked(long nowElapsed) {
+ final StringBuilder errorMsg = new StringBuilder();
+ boolean stuck = false;
+ if (mNextNonWakeup < (nowElapsed - 10_000) && mLastWakeup < mNextNonWakeup) {
+ stuck = true;
+ errorMsg.append("[mNextNonWakeup=");
+ TimeUtils.formatDuration(mNextNonWakeup - nowElapsed, errorMsg);
+ errorMsg.append(" set at ");
+ TimeUtils.formatDuration(mNextNonWakeUpSetAt - nowElapsed, errorMsg);
+ errorMsg.append(", mLastWakeup=");
+ TimeUtils.formatDuration(mLastWakeup - nowElapsed, errorMsg);
+ errorMsg.append(", timerfd_gettime=" + getNextAlarm(mNativeData, ELAPSED_REALTIME));
+ errorMsg.append("];");
+ }
+ if (mNextWakeup < (nowElapsed - 10_000) && mLastWakeup < mNextWakeup) {
+ stuck = true;
+ errorMsg.append("[mNextWakeup=");
+ TimeUtils.formatDuration(mNextWakeup - nowElapsed, errorMsg);
+ errorMsg.append(" set at ");
+ TimeUtils.formatDuration(mNextWakeUpSetAt - nowElapsed, errorMsg);
+ errorMsg.append(", mLastWakeup=");
+ TimeUtils.formatDuration(mLastWakeup - nowElapsed, errorMsg);
+ errorMsg.append(", timerfd_gettime="
+ + getNextAlarm(mNativeData, ELAPSED_REALTIME_WAKEUP));
+ errorMsg.append("];");
+ }
+ if (stuck) {
+ Slog.wtf(TAG, "Alarm delivery stuck: " + errorMsg.toString());
+ }
+ }
+
void rescheduleKernelAlarmsLocked() {
// Schedule the next upcoming wakeup alarm. If there is a deliverable batch
// prior to that which contains no wakeups, we schedule that as well.
+ final long nowElapsed = SystemClock.elapsedRealtime();
+ validateLastAlarmExpiredLocked(nowElapsed);
long nextNonWakeup = 0;
if (mAlarmBatches.size() > 0) {
final Batch firstWakeup = findFirstWakeupBatchLocked();
final Batch firstBatch = mAlarmBatches.get(0);
if (firstWakeup != null) {
mNextWakeup = firstWakeup.start;
- mLastWakeupSet = SystemClock.elapsedRealtime();
+ mNextWakeUpSetAt = nowElapsed;
setLocked(ELAPSED_REALTIME_WAKEUP, firstWakeup.start);
}
if (firstBatch != firstWakeup) {
@@ -2678,6 +2738,7 @@ class AlarmManagerService extends SystemService {
}
if (nextNonWakeup != 0) {
mNextNonWakeup = nextNonWakeup;
+ mNextNonWakeUpSetAt = nowElapsed;
setLocked(ELAPSED_REALTIME, nextNonWakeup);
}
}
@@ -3051,6 +3112,7 @@ class AlarmManagerService extends SystemService {
private native int waitForAlarm(long nativeData);
private native int setKernelTime(long nativeData, long millis);
private native int setKernelTimezone(long nativeData, int minuteswest);
+ private native long getNextAlarm(long nativeData, int type);
private long getWhileIdleMinIntervalLocked(int uid) {
final boolean dozing = mPendingIdleUntil != null;
@@ -3456,9 +3518,13 @@ class AlarmManagerService extends SystemService {
private class AlarmThread extends Thread
{
+ private int mFalseWakeups;
+ private int mWtfThreshold;
public AlarmThread()
{
super("AlarmManager");
+ mFalseWakeups = 0;
+ mWtfThreshold = 10;
}
public void run()
@@ -3571,6 +3637,17 @@ class AlarmManagerService extends SystemService {
}
mPendingNonWakeupAlarms.clear();
}
+ if (mLastTimeChangeRealtime != nowELAPSED && triggerList.isEmpty()) {
+ if (++mFalseWakeups >= mWtfThreshold) {
+ Slog.wtf(TAG, "Too many (" + mFalseWakeups
+ + ") false wakeups, nowElapsed=" + nowELAPSED);
+ if (mWtfThreshold < 100_000) {
+ mWtfThreshold *= 10;
+ } else {
+ mFalseWakeups = 0;
+ }
+ }
+ }
final ArraySet<Pair<String, Integer>> triggerPackages =
new ArraySet<>();
for (int i = 0; i < triggerList.size(); i++) {
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index 786d757557d1..b3f6bd1d41cc 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -22,6 +22,7 @@ import android.app.ActivityThread;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.AppOpsManagerInternal;
+import android.app.AppOpsManagerInternal.CheckOpsDelegate;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -198,7 +199,7 @@ public class AppOpsService extends IAppOpsService.Stub {
@VisibleForTesting
final SparseArray<UidState> mUidStates = new SparseArray<>();
- long mLastUptime;
+ long mLastRealtime;
/*
* These are app op restrictions imposed per user from various parties.
@@ -207,6 +208,8 @@ public class AppOpsService extends IAppOpsService.Stub {
SparseIntArray mProfileOwners;
+ private CheckOpsDelegate mCheckOpsDelegate;
+
/**
* All times are in milliseconds. These constants are kept synchronized with the system
* global Settings. Any access to this class or its fields should be done while
@@ -770,7 +773,7 @@ public class AppOpsService extends IAppOpsService.Stub {
} else {
settleTime = mConstants.BG_STATE_SETTLE_TIME;
}
- uidState.pendingStateCommitTime = SystemClock.uptimeMillis() + settleTime;
+ uidState.pendingStateCommitTime = SystemClock.elapsedRealtime() + settleTime;
}
if (uidState.startNesting != 0) {
// There is some actively running operation... need to find it
@@ -1411,15 +1414,39 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
+ public CheckOpsDelegate getAppOpsServiceDelegate() {
+ synchronized (this) {
+ return mCheckOpsDelegate;
+ }
+ }
+
+ public void setAppOpsServiceDelegate(CheckOpsDelegate delegate) {
+ synchronized (this) {
+ mCheckOpsDelegate = delegate;
+ }
+ }
+
@Override
public int checkOperation(int code, int uid, String packageName) {
- verifyIncomingUid(uid);
- verifyIncomingOp(code);
- String resolvedPackageName = resolvePackageName(uid, packageName);
- if (resolvedPackageName == null) {
- return AppOpsManager.MODE_IGNORED;
+ final CheckOpsDelegate delegate;
+ synchronized (this) {
+ if (mCheckOpsDelegate == null) {
+ return checkOperationImpl(code, uid, packageName);
+ }
+ delegate = mCheckOpsDelegate;
}
+ return delegate.checkOperation(code, uid, packageName,
+ AppOpsService.this::checkOperationImpl);
+ }
+
+ private int checkOperationImpl(int code, int uid, String packageName) {
synchronized (this) {
+ verifyIncomingUid(uid);
+ verifyIncomingOp(code);
+ String resolvedPackageName = resolvePackageName(uid, packageName);
+ if (resolvedPackageName == null) {
+ return AppOpsManager.MODE_IGNORED;
+ }
if (isOpRestrictedLocked(uid, code, resolvedPackageName)) {
return AppOpsManager.MODE_IGNORED;
}
@@ -1439,20 +1466,33 @@ public class AppOpsService extends IAppOpsService.Stub {
@Override
public int checkAudioOperation(int code, int usage, int uid, String packageName) {
- boolean suspended;
- try {
- suspended = isPackageSuspendedForUser(packageName, uid);
- } catch (IllegalArgumentException ex) {
- // Package not found.
- suspended = false;
- }
-
- if (suspended) {
- Slog.i(TAG, "Audio disabled for suspended package=" + packageName + " for uid=" + uid);
- return AppOpsManager.MODE_IGNORED;
+ final CheckOpsDelegate delegate;
+ synchronized (this) {
+ if (mCheckOpsDelegate == null) {
+ return checkAudioOperationImpl(code, usage, uid, packageName);
+ }
+ delegate = mCheckOpsDelegate;
}
+ return delegate.checkAudioOperation(code, usage, uid, packageName,
+ AppOpsService.this::checkAudioOperationImpl);
+ }
+ private int checkAudioOperationImpl(int code, int usage, int uid, String packageName) {
synchronized (this) {
+ boolean suspended;
+ try {
+ suspended = isPackageSuspendedForUser(packageName, uid);
+ } catch (IllegalArgumentException ex) {
+ // Package not found.
+ suspended = false;
+ }
+
+ if (suspended) {
+ Slog.i(TAG, "Audio disabled for suspended package=" + packageName
+ + " for uid=" + uid);
+ return AppOpsManager.MODE_IGNORED;
+ }
+
final int mode = checkRestrictionLocked(code, usage, uid, packageName);
if (mode != AppOpsManager.MODE_ALLOWED) {
return mode;
@@ -1530,10 +1570,10 @@ public class AppOpsService extends IAppOpsService.Stub {
}
@Override
- public int noteProxyOperation(int code, String proxyPackageName,
- int proxiedUid, String proxiedPackageName) {
+ public int noteProxyOperation(int code, int proxyUid,
+ String proxyPackageName, int proxiedUid, String proxiedPackageName) {
+ verifyIncomingUid(proxyUid);
verifyIncomingOp(code);
- final int proxyUid = Binder.getCallingUid();
String resolveProxyPackageName = resolvePackageName(proxyUid, proxyPackageName);
if (resolveProxyPackageName == null) {
return AppOpsManager.MODE_IGNORED;
@@ -1553,6 +1593,18 @@ public class AppOpsService extends IAppOpsService.Stub {
@Override
public int noteOperation(int code, int uid, String packageName) {
+ final CheckOpsDelegate delegate;
+ synchronized (this) {
+ if (mCheckOpsDelegate == null) {
+ return noteOperationImpl(code, uid, packageName);
+ }
+ delegate = mCheckOpsDelegate;
+ }
+ return delegate.noteOperation(code, uid, packageName,
+ AppOpsService.this::noteOperationImpl);
+ }
+
+ private int noteOperationImpl(int code, int uid, String packageName) {
verifyIncomingUid(uid);
verifyIncomingOp(code);
String resolvedPackageName = resolvePackageName(uid, packageName);
@@ -1881,11 +1933,11 @@ public class AppOpsService extends IAppOpsService.Stub {
mUidStates.put(uid, uidState);
} else {
if (uidState.pendingStateCommitTime != 0) {
- if (uidState.pendingStateCommitTime < mLastUptime) {
+ if (uidState.pendingStateCommitTime < mLastRealtime) {
commitUidPendingStateLocked(uidState);
} else {
- mLastUptime = SystemClock.uptimeMillis();
- if (uidState.pendingStateCommitTime < mLastUptime) {
+ mLastRealtime = SystemClock.elapsedRealtime();
+ if (uidState.pendingStateCommitTime < mLastRealtime) {
commitUidPendingStateLocked(uidState);
}
}
@@ -3284,7 +3336,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
if (uidState.pendingStateCommitTime != 0) {
pw.print(" pendingStateCommitTime=");
- TimeUtils.formatDuration(uidState.pendingStateCommitTime, nowUptime, pw);
+ TimeUtils.formatDuration(uidState.pendingStateCommitTime, nowElapsed, pw);
pw.println();
}
if (uidState.startNesting != 0) {
diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java
index 87647ca79fea..5c14459da566 100644
--- a/services/core/java/com/android/server/BatteryService.java
+++ b/services/core/java/com/android/server/BatteryService.java
@@ -41,7 +41,6 @@ import android.os.DropBoxManager;
import android.os.FileUtils;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.IBatteryPropertiesListener;
import android.os.IBatteryPropertiesRegistrar;
import android.os.IBinder;
import android.os.OsProtoEnums;
@@ -1159,12 +1158,7 @@ public final class BatteryService extends SystemService {
// Reduced IBatteryPropertiesRegistrar that only implements getProperty for usage
// in BatteryManager.
private final class BatteryPropertiesRegistrar extends IBatteryPropertiesRegistrar.Stub {
- public void registerListener(IBatteryPropertiesListener listener) {
- Slog.e(TAG, "health: must not call registerListener on battery properties");
- }
- public void unregisterListener(IBatteryPropertiesListener listener) {
- Slog.e(TAG, "health: must not call unregisterListener on battery properties");
- }
+ @Override
public int getProperty(int id, final BatteryProperty prop) throws RemoteException {
traceBegin("HealthGetProperty");
try {
@@ -1214,6 +1208,7 @@ public final class BatteryService extends SystemService {
traceEnd();
}
}
+ @Override
public void scheduleUpdate() throws RemoteException {
traceBegin("HealthScheduleUpdate");
try {
diff --git a/services/core/java/com/android/server/BinderCallsStatsService.java b/services/core/java/com/android/server/BinderCallsStatsService.java
index 1cd853ff3efe..3d779d80b9a1 100644
--- a/services/core/java/com/android/server/BinderCallsStatsService.java
+++ b/services/core/java/com/android/server/BinderCallsStatsService.java
@@ -16,15 +16,28 @@
package com.android.server;
+import android.app.AppGlobals;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.database.ContentObserver;
+import android.net.Uri;
import android.os.Binder;
-import android.os.ServiceManager;
+import android.os.RemoteException;
import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.KeyValueListParser;
import android.util.Slog;
+import com.android.internal.os.BackgroundThread;
import com.android.internal.os.BinderCallsStats;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
public class BinderCallsStatsService extends Binder {
@@ -33,20 +46,92 @@ public class BinderCallsStatsService extends Binder {
private static final String PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING
= "persist.sys.binder_calls_detailed_tracking";
- public static void start() {
- BinderCallsStatsService service = new BinderCallsStatsService();
- ServiceManager.addService("binder_calls_stats", service);
- boolean detailedTrackingEnabled = SystemProperties.getBoolean(
- PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING, false);
-
- if (detailedTrackingEnabled) {
- Slog.i(TAG, "Enabled CPU usage tracking for binder calls. Controlled by "
- + PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING
- + " or via dumpsys binder_calls_stats --enable-detailed-tracking");
- BinderCallsStats.getInstance().setDetailedTracking(true);
+ /** Listens for flag changes. */
+ private static class SettingsObserver extends ContentObserver {
+ private static final String SETTINGS_ENABLED_KEY = "enabled";
+ private static final String SETTINGS_DETAILED_TRACKING_KEY = "detailed_tracking";
+ private static final String SETTINGS_UPLOAD_DATA_KEY = "upload_data";
+ private static final String SETTINGS_SAMPLING_INTERVAL_KEY = "sampling_interval";
+
+ private final Uri mUri = Settings.Global.getUriFor(Settings.Global.BINDER_CALLS_STATS);
+ private final Context mContext;
+ private final KeyValueListParser mParser = new KeyValueListParser(',');
+
+ public SettingsObserver(Context context) {
+ super(BackgroundThread.getHandler());
+ mContext = context;
+ context.getContentResolver().registerContentObserver(mUri, false, this,
+ UserHandle.USER_SYSTEM);
+ // Always kick once to ensure that we match current state
+ onChange();
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri, int userId) {
+ if (mUri.equals(uri)) {
+ onChange();
+ }
+ }
+
+ public void onChange() {
+ // Do not overwrite the default set manually.
+ if (!SystemProperties.get(PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING).isEmpty()) {
+ return;
+ }
+
+ BinderCallsStats stats = BinderCallsStats.getInstance();
+ try {
+ mParser.setString(Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.BINDER_CALLS_STATS));
+ } catch (IllegalArgumentException e) {
+ Slog.e(TAG, "Bad binder call stats settings", e);
+ }
+ stats.setEnabled(
+ mParser.getBoolean(SETTINGS_ENABLED_KEY, BinderCallsStats.ENABLED_DEFAULT));
+ stats.setDetailedTracking(mParser.getBoolean(
+ SETTINGS_DETAILED_TRACKING_KEY, BinderCallsStats.DETAILED_TRACKING_DEFAULT));
+ stats.setSamplingInterval(mParser.getInt(
+ SETTINGS_SAMPLING_INTERVAL_KEY,
+ BinderCallsStats.PERIODIC_SAMPLING_INTERVAL_DEFAULT));
+ }
+ }
+
+ public static class LifeCycle extends SystemService {
+ private BinderCallsStatsService mService;
+
+ public LifeCycle(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onStart() {
+ mService = new BinderCallsStatsService();
+ publishBinderService("binder_calls_stats", mService);
+ boolean detailedTrackingEnabled = SystemProperties.getBoolean(
+ PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING, false);
+
+ if (detailedTrackingEnabled) {
+ Slog.i(TAG, "Enabled CPU usage tracking for binder calls. Controlled by "
+ + PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING
+ + " or via dumpsys binder_calls_stats --enable-detailed-tracking");
+ BinderCallsStats.getInstance().setDetailedTracking(true);
+ }
+ }
+
+ @Override
+ public void onBootPhase(int phase) {
+ if (SystemService.PHASE_SYSTEM_SERVICES_READY == phase) {
+ mService.systemReady(getContext());
+ }
}
}
+ private SettingsObserver mSettingsObserver;
+
+ public void systemReady(Context context) {
+ mSettingsObserver = new SettingsObserver(context);
+ }
+
public static void reset() {
Slog.i(TAG, "Resetting stats");
BinderCallsStats.getInstance().reset();
@@ -54,11 +139,11 @@ public class BinderCallsStatsService extends Binder {
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ boolean verbose = false;
if (args != null) {
for (final String arg : args) {
if ("-a".equals(arg)) {
- // We currently dump all information by default
- continue;
+ verbose = true;
} else if ("--reset".equals(arg)) {
reset();
pw.println("binder_calls_stats reset.");
@@ -84,6 +169,29 @@ public class BinderCallsStatsService extends Binder {
}
}
}
- BinderCallsStats.getInstance().dump(pw);
+ BinderCallsStats.getInstance().dump(pw, getAppIdToPackagesMap(), verbose);
}
+
+ private Map<Integer, String> getAppIdToPackagesMap() {
+ List<PackageInfo> packages;
+ try {
+ packages = AppGlobals.getPackageManager()
+ .getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES,
+ UserHandle.USER_SYSTEM).getList();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ Map<Integer,String> map = new HashMap<>();
+ for (PackageInfo pkg : packages) {
+ String name = pkg.packageName;
+ int uid = pkg.applicationInfo.uid;
+ // Use sharedUserId string as package name if there are collisions
+ if (pkg.sharedUserId != null && map.containsKey(uid)) {
+ name = "shared:" + pkg.sharedUserId;
+ }
+ map.put(uid, name);
+ }
+ return map;
+ }
+
}
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 56b07b04d8d9..d6c43cb0c2f8 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -53,12 +53,16 @@ import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.SystemClock;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.os.UserManagerInternal.UserRestrictionsListener;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
+import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
+import android.util.Log;
import android.util.Slog;
import android.util.StatsLog;
@@ -388,6 +392,15 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
mCallbacks = new RemoteCallbackList<IBluetoothManagerCallback>();
mStateChangeCallbacks = new RemoteCallbackList<IBluetoothStateChangeCallback>();
+ // TODO: We need a more generic way to initialize the persist keys of FeatureFlagUtils
+ boolean isHearingAidEnabled;
+ String value = SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + FeatureFlagUtils.HEARING_AID_SETTINGS);
+ if (!TextUtils.isEmpty(value)) {
+ isHearingAidEnabled = Boolean.parseBoolean(value);
+ Log.v(TAG, "set feature flag HEARING_AID_SETTINGS to " + isHearingAidEnabled);
+ FeatureFlagUtils.setEnabled(context, FeatureFlagUtils.HEARING_AID_SETTINGS, isHearingAidEnabled);
+ }
+
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_BLUETOOTH_ADDRESS_CHANGED);
diff --git a/services/core/java/com/android/server/CommonTimeManagementService.java b/services/core/java/com/android/server/CommonTimeManagementService.java
deleted file mode 100644
index 5cebfa5a6edf..000000000000
--- a/services/core/java/com/android/server/CommonTimeManagementService.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Copyright (C) 2012 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;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.INetworkManagementEventObserver;
-import android.net.InterfaceConfiguration;
-import android.os.Binder;
-import android.os.CommonTimeConfig;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.INetworkManagementService;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemProperties;
-import android.util.Log;
-
-import com.android.internal.util.DumpUtils;
-import com.android.server.net.BaseNetworkObserver;
-
-/**
- * @hide
- * <p>CommonTimeManagementService manages the configuration of the native Common Time service,
- * reconfiguring the native service as appropriate in response to changes in network configuration.
- */
-class CommonTimeManagementService extends Binder {
- /*
- * Constants and globals.
- */
- private static final String TAG = CommonTimeManagementService.class.getSimpleName();
- private static final int NATIVE_SERVICE_RECONNECT_TIMEOUT = 5000;
- private static final String AUTO_DISABLE_PROP = "ro.common_time.auto_disable";
- private static final String ALLOW_WIFI_PROP = "ro.common_time.allow_wifi";
- private static final String SERVER_PRIO_PROP = "ro.common_time.server_prio";
- private static final String NO_INTERFACE_TIMEOUT_PROP = "ro.common_time.no_iface_timeout";
- private static final boolean AUTO_DISABLE;
- private static final boolean ALLOW_WIFI;
- private static final byte BASE_SERVER_PRIO;
- private static final int NO_INTERFACE_TIMEOUT;
- private static final InterfaceScoreRule[] IFACE_SCORE_RULES;
-
- static {
- int tmp;
- AUTO_DISABLE = (0 != SystemProperties.getInt(AUTO_DISABLE_PROP, 1));
- ALLOW_WIFI = (0 != SystemProperties.getInt(ALLOW_WIFI_PROP, 0));
- tmp = SystemProperties.getInt(SERVER_PRIO_PROP, 1);
- NO_INTERFACE_TIMEOUT = SystemProperties.getInt(NO_INTERFACE_TIMEOUT_PROP, 60000);
-
- if (tmp < 1)
- BASE_SERVER_PRIO = 1;
- else
- if (tmp > 30)
- BASE_SERVER_PRIO = 30;
- else
- BASE_SERVER_PRIO = (byte)tmp;
-
- if (ALLOW_WIFI) {
- IFACE_SCORE_RULES = new InterfaceScoreRule[] {
- new InterfaceScoreRule("wlan", (byte)1),
- new InterfaceScoreRule("eth", (byte)2),
- };
- } else {
- IFACE_SCORE_RULES = new InterfaceScoreRule[] {
- new InterfaceScoreRule("eth", (byte)2),
- };
- }
- };
-
- /*
- * Internal state
- */
- private final Context mContext;
- private final Object mLock = new Object();
- private INetworkManagementService mNetMgr;
- private CommonTimeConfig mCTConfig;
- private String mCurIface;
- private Handler mReconnectHandler = new Handler();
- private Handler mNoInterfaceHandler = new Handler();
- private boolean mDetectedAtStartup = false;
- private byte mEffectivePrio = BASE_SERVER_PRIO;
-
- /*
- * Callback handler implementations.
- */
- private INetworkManagementEventObserver mIfaceObserver = new BaseNetworkObserver() {
- @Override
- public void interfaceStatusChanged(String iface, boolean up) {
- reevaluateServiceState();
- }
- @Override
- public void interfaceLinkStateChanged(String iface, boolean up) {
- reevaluateServiceState();
- }
- @Override
- public void interfaceAdded(String iface) {
- reevaluateServiceState();
- }
- @Override
- public void interfaceRemoved(String iface) {
- reevaluateServiceState();
- }
- };
-
- private BroadcastReceiver mConnectivityMangerObserver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- reevaluateServiceState();
- }
- };
-
- private CommonTimeConfig.OnServerDiedListener mCTServerDiedListener =
- () -> scheduleTimeConfigReconnect();
-
- private Runnable mReconnectRunnable = () -> connectToTimeConfig();
-
- private Runnable mNoInterfaceRunnable = () -> handleNoInterfaceTimeout();
-
- /*
- * Public interface (constructor, systemReady and dump)
- */
- public CommonTimeManagementService(Context context) {
- mContext = context;
- }
-
- void systemRunning() {
- if (ServiceManager.checkService(CommonTimeConfig.SERVICE_NAME) == null) {
- Log.i(TAG, "No common time service detected on this platform. " +
- "Common time services will be unavailable.");
- return;
- }
-
- mDetectedAtStartup = true;
-
- IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
- mNetMgr = INetworkManagementService.Stub.asInterface(b);
-
- // Network manager is running along-side us, so we should never receiver a remote exception
- // while trying to register this observer.
- try {
- mNetMgr.registerObserver(mIfaceObserver);
- }
- catch (RemoteException e) { }
-
- // Register with the connectivity manager for connectivity changed intents.
- IntentFilter filter = new IntentFilter();
- filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
- mContext.registerReceiver(mConnectivityMangerObserver, filter);
-
- // Connect to the common time config service and apply the initial configuration.
- connectToTimeConfig();
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
-
- if (!mDetectedAtStartup) {
- pw.println("Native Common Time service was not detected at startup. " +
- "Service is unavailable");
- return;
- }
-
- synchronized (mLock) {
- pw.println("Current Common Time Management Service Config:");
- pw.println(String.format(" Native service : %s",
- (null == mCTConfig) ? "reconnecting"
- : "alive"));
- pw.println(String.format(" Bound interface : %s",
- (null == mCurIface ? "unbound" : mCurIface)));
- pw.println(String.format(" Allow WiFi : %s", ALLOW_WIFI ? "yes" : "no"));
- pw.println(String.format(" Allow Auto Disable : %s", AUTO_DISABLE ? "yes" : "no"));
- pw.println(String.format(" Server Priority : %d", mEffectivePrio));
- pw.println(String.format(" No iface timeout : %d", NO_INTERFACE_TIMEOUT));
- }
- }
-
- /*
- * Inner helper classes
- */
- private static class InterfaceScoreRule {
- public final String mPrefix;
- public final byte mScore;
- public InterfaceScoreRule(String prefix, byte score) {
- mPrefix = prefix;
- mScore = score;
- }
- };
-
- /*
- * Internal implementation
- */
- private void cleanupTimeConfig() {
- mReconnectHandler.removeCallbacks(mReconnectRunnable);
- mNoInterfaceHandler.removeCallbacks(mNoInterfaceRunnable);
- if (null != mCTConfig) {
- mCTConfig.release();
- mCTConfig = null;
- }
- }
-
- private void connectToTimeConfig() {
- // Get access to the common time service configuration interface. If we catch a remote
- // exception in the process (service crashed or no running for w/e reason), schedule an
- // attempt to reconnect in the future.
- cleanupTimeConfig();
- try {
- synchronized (mLock) {
- mCTConfig = new CommonTimeConfig();
- mCTConfig.setServerDiedListener(mCTServerDiedListener);
- mCurIface = mCTConfig.getInterfaceBinding();
- mCTConfig.setAutoDisable(AUTO_DISABLE);
- mCTConfig.setMasterElectionPriority(mEffectivePrio);
- }
-
- if (NO_INTERFACE_TIMEOUT >= 0)
- mNoInterfaceHandler.postDelayed(mNoInterfaceRunnable, NO_INTERFACE_TIMEOUT);
-
- reevaluateServiceState();
- }
- catch (RemoteException e) {
- scheduleTimeConfigReconnect();
- }
- }
-
- private void scheduleTimeConfigReconnect() {
- cleanupTimeConfig();
- Log.w(TAG, String.format("Native service died, will reconnect in %d mSec",
- NATIVE_SERVICE_RECONNECT_TIMEOUT));
- mReconnectHandler.postDelayed(mReconnectRunnable,
- NATIVE_SERVICE_RECONNECT_TIMEOUT);
- }
-
- private void handleNoInterfaceTimeout() {
- if (null != mCTConfig) {
- Log.i(TAG, "Timeout waiting for interface to come up. " +
- "Forcing networkless master mode.");
- if (CommonTimeConfig.ERROR_DEAD_OBJECT == mCTConfig.forceNetworklessMasterMode())
- scheduleTimeConfigReconnect();
- }
- }
-
- private void reevaluateServiceState() {
- String bindIface = null;
- byte bestScore = -1;
- try {
- // Check to see if this interface is suitable to use for time synchronization.
- //
- // TODO : This selection algorithm needs to be enhanced for use with mobile devices. In
- // particular, the choice of whether to a wireless interface or not should not be an all
- // or nothing thing controlled by properties. It would probably be better if the
- // platform had some concept of public wireless networks vs. home or friendly wireless
- // networks (something a user would configure in settings or when a new interface is
- // added). Then this algorithm could pick only wireless interfaces which were flagged
- // as friendly, and be dormant when on public wireless networks.
- //
- // Another issue which needs to be dealt with is the use of driver supplied interface
- // name to determine the network type. The fact that the wireless interface on a device
- // is named "wlan0" is just a matter of convention; its not a 100% rule. For example,
- // there are devices out there where the wireless is name "tiwlan0", not "wlan0". The
- // internal network management interfaces in Android have all of the information needed
- // to make a proper classification, there is just no way (currently) to fetch an
- // interface's type (available from the ConnectionManager) as well as its address
- // (available from either the java.net interfaces or from the NetworkManagment service).
- // Both can enumerate interfaces, but that is no way to correlate their results (no
- // common shared key; although using the interface name in the connection manager would
- // be a good start). Until this gets resolved, we resort to substring searching for
- // tags like wlan and eth.
- //
- String ifaceList[] = mNetMgr.listInterfaces();
- if (null != ifaceList) {
- for (String iface : ifaceList) {
-
- byte thisScore = -1;
- for (InterfaceScoreRule r : IFACE_SCORE_RULES) {
- if (iface.contains(r.mPrefix)) {
- thisScore = r.mScore;
- break;
- }
- }
-
- if (thisScore <= bestScore)
- continue;
-
- InterfaceConfiguration config = mNetMgr.getInterfaceConfig(iface);
- if (null == config)
- continue;
-
- if (config.isActive()) {
- bindIface = iface;
- bestScore = thisScore;
- }
- }
- }
- }
- catch (RemoteException e) {
- // Bad news; we should not be getting remote exceptions from the connectivity manager
- // since it is running in SystemServer along side of us. It probably does not matter
- // what we do here, but go ahead and unbind the common time service in this case, just
- // so we have some defined behavior.
- bindIface = null;
- }
-
- boolean doRebind = true;
- synchronized (mLock) {
- if ((null != bindIface) && (null == mCurIface)) {
- Log.e(TAG, String.format("Binding common time service to %s.", bindIface));
- mCurIface = bindIface;
- } else
- if ((null == bindIface) && (null != mCurIface)) {
- Log.e(TAG, "Unbinding common time service.");
- mCurIface = null;
- } else
- if ((null != bindIface) && (null != mCurIface) && !bindIface.equals(mCurIface)) {
- Log.e(TAG, String.format("Switching common time service binding from %s to %s.",
- mCurIface, bindIface));
- mCurIface = bindIface;
- } else {
- doRebind = false;
- }
- }
-
- if (doRebind && (null != mCTConfig)) {
- byte newPrio = (bestScore > 0)
- ? (byte)(bestScore * BASE_SERVER_PRIO)
- : BASE_SERVER_PRIO;
- if (newPrio != mEffectivePrio) {
- mEffectivePrio = newPrio;
- mCTConfig.setMasterElectionPriority(mEffectivePrio);
- }
-
- int res = mCTConfig.setNetworkBinding(mCurIface);
- if (res != CommonTimeConfig.SUCCESS)
- scheduleTimeConfigReconnect();
-
- else if (NO_INTERFACE_TIMEOUT >= 0) {
- mNoInterfaceHandler.removeCallbacks(mNoInterfaceRunnable);
- if (null == mCurIface)
- mNoInterfaceHandler.postDelayed(mNoInterfaceRunnable, NO_INTERFACE_TIMEOUT);
- }
- }
- }
-}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 701aa06cc703..806e76efb28f 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -130,7 +130,6 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats;
import com.android.internal.net.LegacyVpnInfo;
-import com.android.internal.net.NetworkStatsFactory;
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnInfo;
import com.android.internal.net.VpnProfile;
@@ -158,6 +157,7 @@ import com.android.server.connectivity.NetworkNotificationManager;
import com.android.server.connectivity.NetworkNotificationManager.NotificationType;
import com.android.server.connectivity.PacManager;
import com.android.server.connectivity.PermissionMonitor;
+import com.android.server.connectivity.ProxyTracker;
import com.android.server.connectivity.Tethering;
import com.android.server.connectivity.Vpn;
import com.android.server.connectivity.tethering.TetheringDependencies;
@@ -201,14 +201,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
implements PendingIntent.OnFinished {
private static final String TAG = ConnectivityService.class.getSimpleName();
- public static final String DIAG_ARG = "--diag";
+ private static final String DIAG_ARG = "--diag";
public static final String SHORT_ARG = "--short";
- public static final String TETHERING_ARG = "tethering";
+ private static final String TETHERING_ARG = "tethering";
private static final boolean DBG = true;
private static final boolean VDBG = false;
- private static final boolean LOGD_RULES = false;
private static final boolean LOGD_BLOCKED_NETWORKINFO = true;
// TODO: create better separation between radio types and network types
@@ -243,7 +242,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@VisibleForTesting
@GuardedBy("mVpns")
- protected final SparseArray<Vpn> mVpns = new SparseArray<Vpn>();
+ protected final SparseArray<Vpn> mVpns = new SparseArray<>();
// TODO: investigate if mLockdownEnabled can be removed and replaced everywhere by
// a direct call to LockdownVpnTracker.isEnabled().
@@ -253,24 +252,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
private LockdownVpnTracker mLockdownTracker;
final private Context mContext;
- private int mNetworkPreference;
// 0 is full bad, 100 is full good
private int mDefaultInetConditionPublished = 0;
- private boolean mTestMode;
- private static ConnectivityService sServiceInstance;
-
private INetworkManagementService mNetd;
private INetworkStatsService mStatsService;
private INetworkPolicyManager mPolicyManager;
private NetworkPolicyManagerInternal mPolicyManagerInternal;
- private IIpConnectivityMetrics mIpConnectivityMetrics;
private String mCurrentTcpBufferSizes;
- private static final int ENABLED = 1;
- private static final int DISABLED = 0;
-
private static final SparseArray<String> sMagicDecoderRing = MessageUtils.findMessageNames(
new Class[] { AsyncChannel.class, ConnectivityService.class, NetworkAgent.class,
NetworkAgentInfo.class });
@@ -283,7 +274,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Don't reap networks. This should be passed when some networks have not yet been
// rematched against all NetworkRequests.
DONT_REAP
- };
+ }
private enum UnneededFor {
LINGER, // Determine whether this network is unneeded and should be lingered.
@@ -291,11 +282,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
/**
- * used internally to change our mobile data enabled flag
- */
- private static final int EVENT_CHANGE_MOBILE_DATA_ENABLED = 2;
-
- /**
* used internally to clear a wakelock when transitioning
* from one net to another. Clear happens when we get a new
* network - EVENT_EXPIRE_NET_TRANSITION_WAKELOCK happens
@@ -448,29 +434,21 @@ public class ConnectivityService extends IConnectivityManager.Stub
private int mNetTransitionWakeLockTimeout;
private final PowerManager.WakeLock mPendingIntentWakeLock;
- // track the current default http proxy - tell the world if we get a new one (real change)
- private volatile ProxyInfo mDefaultProxy = null;
- private Object mProxyLock = new Object();
- private boolean mDefaultProxyDisabled = false;
-
- // track the global proxy.
- private ProxyInfo mGlobalProxy = null;
-
- private PacManager mPacManager = null;
+ // A helper object to track the current default HTTP proxy. ConnectivityService needs to tell
+ // the world when it changes.
+ private final ProxyTracker mProxyTracker;
final private SettingsObserver mSettingsObserver;
private UserManager mUserManager;
- NetworkConfig[] mNetConfigs;
- int mNetworksDefined;
+ private NetworkConfig[] mNetConfigs;
+ private int mNetworksDefined;
// the set of network types that can only be enabled by system/sig apps
- List mProtectedNetworks;
+ private List mProtectedNetworks;
- private DataConnectionStats mDataConnectionStats;
-
- TelephonyManager mTelephonyManager;
+ private TelephonyManager mTelephonyManager;
private KeepaliveTracker mKeepaliveTracker;
private NetworkNotificationManager mNotifier;
@@ -513,8 +491,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mLog = log;
}
}
- private final ArrayDeque<ValidationLog> mValidationLogs =
- new ArrayDeque<ValidationLog>(MAX_VALIDATION_LOGS);
+ private final ArrayDeque<ValidationLog> mValidationLogs = new ArrayDeque<>(MAX_VALIDATION_LOGS);
private void addValidationLogs(ReadOnlyLocalLog log, Network network, String name) {
synchronized (mValidationLogs) {
@@ -587,7 +564,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
throw new IllegalStateException(
"legacy list for type " + type + "already initialized");
}
- mTypeLists[type] = new ArrayList<NetworkAgentInfo>();
+ mTypeLists[type] = new ArrayList<>();
}
public boolean isTypeSupported(int type) {
@@ -690,7 +667,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private String naiToString(NetworkAgentInfo nai) {
- String name = (nai != null) ? nai.name() : "null";
+ String name = nai.name();
String state = (nai.networkInfo != null) ?
nai.networkInfo.getState() + "/" + nai.networkInfo.getDetailedState() :
"???/???";
@@ -783,6 +760,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mPolicyManagerInternal = checkNotNull(
LocalServices.getService(NetworkPolicyManagerInternal.class),
"missing NetworkPolicyManagerInternal");
+ mProxyTracker = new ProxyTracker(context, mHandler, EVENT_PROXY_HAS_CHANGED);
mKeyStore = KeyStore.getInstance();
mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
@@ -864,9 +842,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
- mTestMode = mSystemProperties.get("cm.test.mode").equals("true")
- && mSystemProperties.get("ro.build.type").equals("eng");
-
mTethering = makeTethering();
mPermissionMonitor = new PermissionMonitor(mContext, mNetd);
@@ -893,10 +868,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
mSettingsObserver = new SettingsObserver(mContext, mHandler);
registerSettingsCallbacks();
- mDataConnectionStats = new DataConnectionStats(mContext);
- mDataConnectionStats.startMonitoring();
-
- mPacManager = new PacManager(mContext, mHandler, EVENT_PROXY_HAS_CHANGED);
+ final DataConnectionStats dataConnectionStats = new DataConnectionStats(mContext);
+ dataConnectionStats.startMonitoring();
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
@@ -929,6 +902,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
public boolean isTetheringSupported() {
return ConnectivityService.this.isTetheringSupported();
}
+ @Override
+ public NetworkRequest getDefaultNetworkRequest() {
+ return mDefaultRequest;
+ }
};
return new Tethering(mContext, mNetd, mStatsService, mPolicyManager,
IoThread.get().getLooper(), new MockableSystemProperties(),
@@ -946,7 +923,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private NetworkRequest createDefaultInternetRequestForTransport(
int transportType, NetworkRequest.Type type) {
- NetworkCapabilities netCap = new NetworkCapabilities();
+ final NetworkCapabilities netCap = new NetworkCapabilities();
netCap.addCapability(NET_CAPABILITY_INTERNET);
netCap.addCapability(NET_CAPABILITY_NOT_RESTRICTED);
if (transportType > -1) {
@@ -1026,7 +1003,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
throw new IllegalStateException("No free netIds");
}
- private NetworkState getFilteredNetworkState(int networkType, int uid, boolean ignoreBlocked) {
+ private NetworkState getFilteredNetworkState(int networkType, int uid) {
if (mLegacyTypeTracker.isTypeSupported(networkType)) {
final NetworkAgentInfo nai = mLegacyTypeTracker.getNetworkForType(networkType);
final NetworkState state;
@@ -1044,14 +1021,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
state = new NetworkState(info, new LinkProperties(), capabilities,
null, null, null);
}
- filterNetworkStateForUid(state, uid, ignoreBlocked);
+ filterNetworkStateForUid(state, uid, false);
return state;
} else {
return NetworkState.EMPTY;
}
}
- private NetworkAgentInfo getNetworkAgentInfoForNetwork(Network network) {
+ @VisibleForTesting
+ protected NetworkAgentInfo getNetworkAgentInfoForNetwork(Network network) {
if (network == null) {
return null;
}
@@ -1249,7 +1227,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
return state.networkInfo;
}
}
- final NetworkState state = getFilteredNetworkState(networkType, uid, false);
+ final NetworkState state = getFilteredNetworkState(networkType, uid);
return state.networkInfo;
}
@@ -1284,7 +1262,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
public Network getNetworkForType(int networkType) {
enforceAccessPermission();
final int uid = Binder.getCallingUid();
- NetworkState state = getFilteredNetworkState(networkType, uid, false);
+ NetworkState state = getFilteredNetworkState(networkType, uid);
if (!isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid, false)) {
return state.network;
}
@@ -1321,7 +1299,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// default.
enforceAccessPermission();
- HashMap<Network, NetworkCapabilities> result = new HashMap<Network, NetworkCapabilities>();
+ HashMap<Network, NetworkCapabilities> result = new HashMap<>();
NetworkAgentInfo nai = getDefaultNetwork();
NetworkCapabilities nc = getNetworkCapabilitiesInternal(nai);
@@ -1608,15 +1586,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
@VisibleForTesting
protected void registerNetdEventCallback() {
- mIpConnectivityMetrics =
- (IIpConnectivityMetrics) IIpConnectivityMetrics.Stub.asInterface(
- ServiceManager.getService(IpConnectivityLog.SERVICE_NAME));
- if (mIpConnectivityMetrics == null) {
+ final IIpConnectivityMetrics ipConnectivityMetrics =
+ IIpConnectivityMetrics.Stub.asInterface(
+ ServiceManager.getService(IpConnectivityLog.SERVICE_NAME));
+ if (ipConnectivityMetrics == null) {
Slog.wtf(TAG, "Missing IIpConnectivityMetrics");
+ return;
}
try {
- mIpConnectivityMetrics.addNetdEventCallback(
+ ipConnectivityMetrics.addNetdEventCallback(
INetdEventCallback.CALLBACK_CALLER_CONNECTIVITY_SERVICE,
mNetdEventCallback);
} catch (Exception e) {
@@ -1794,7 +1773,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
try {
bs.noteConnectivityChanged(intent.getIntExtra(
ConnectivityManager.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_NONE),
- ni != null ? ni.getState().toString() : "?");
+ ni.getState().toString());
} catch (RemoteException e) {
}
intent.addFlags(Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
@@ -1880,7 +1859,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (iface != null && (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))) {
try {
- // the call fails silently if no idletimer setup for this interface
+ // the call fails silently if no idle timer setup for this interface
mNetd.removeIdleTimer(iface);
} catch (Exception e) {
loge("Exception in removeDataActivityTracking " + e);
@@ -1889,7 +1868,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
/**
- * Reads the network specific MTU size from reources.
+ * Reads the network specific MTU size from resources.
* and set it on it's iface.
*/
private void updateMtu(LinkProperties newLp, LinkProperties oldLp) {
@@ -2255,6 +2234,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
updateCapabilities(oldScore, nai, nai.networkCapabilities);
// If score has changed, rebroadcast to NetworkFactories. b/17726566
if (oldScore != nai.getCurrentScore()) sendUpdatedScoreToFactories(nai);
+ if (valid) handleFreshlyValidatedNetwork(nai);
}
updateInetCondition(nai);
// Let the NetworkAgent know the state of its network
@@ -2349,6 +2329,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
mDefaultRequest.networkCapabilities, nai.networkCapabilities);
}
+ private void handleFreshlyValidatedNetwork(NetworkAgentInfo nai) {
+ if (nai == null) return;
+ // If the Private DNS mode is opportunistic, reprogram the DNS servers
+ // in order to restart a validation pass from within netd.
+ final PrivateDnsConfig cfg = mDnsManager.getPrivateDnsConfig();
+ if (cfg.useTls && TextUtils.isEmpty(cfg.hostname)) {
+ updateDnses(nai.linkProperties, null, nai.network.netId);
+ }
+ }
+
private void handlePrivateDnsSettingsChanged() {
final PrivateDnsConfig cfg = mDnsManager.getPrivateDnsConfig();
@@ -2849,7 +2839,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (!accept) {
// Tell the NetworkAgent to not automatically reconnect to the network.
nai.asyncChannel.sendMessage(NetworkAgent.CMD_PREVENT_AUTOMATIC_RECONNECT);
- // Teardown the nework.
+ // Teardown the network.
teardownUnneededNetwork(nai);
}
@@ -3121,8 +3111,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
public int tether(String iface, String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
if (isTetheringSupported()) {
- final int status = mTethering.tether(iface);
- return status;
+ return mTethering.tether(iface);
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
@@ -3134,8 +3123,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
if (isTetheringSupported()) {
- final int status = mTethering.untether(iface);
- return status;
+ return mTethering.untether(iface);
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
@@ -3367,22 +3355,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
nai.networkMonitor.forceReevaluation(uid);
}
- private ProxyInfo getDefaultProxy() {
- // this information is already available as a world read/writable jvm property
- // so this API change wouldn't have a benifit. It also breaks the passing
- // of proxy info to all the JVMs.
- // enforceAccessPermission();
- synchronized (mProxyLock) {
- ProxyInfo ret = mGlobalProxy;
- if ((ret == null) && !mDefaultProxyDisabled) ret = mDefaultProxy;
- return ret;
- }
- }
-
@Override
public ProxyInfo getProxyForNetwork(Network network) {
- if (network == null) return getDefaultProxy();
- final ProxyInfo globalProxy = getGlobalProxy();
+ if (network == null) return mProxyTracker.getDefaultProxy();
+ final ProxyInfo globalProxy = mProxyTracker.getGlobalProxy();
if (globalProxy != null) return globalProxy;
if (!NetworkUtils.queryUserAccess(Binder.getCallingUid(), network.netId)) return null;
// Don't call getLinkProperties() as it requires ACCESS_NETWORK_STATE permission, which
@@ -3396,80 +3372,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
- // Convert empty ProxyInfo's to null as null-checks are used to determine if proxies are present
- // (e.g. if mGlobalProxy==null fall back to network-specific proxy, if network-specific
- // proxy is null then there is no proxy in place).
- private ProxyInfo canonicalizeProxyInfo(ProxyInfo proxy) {
- if (proxy != null && TextUtils.isEmpty(proxy.getHost())
- && (proxy.getPacFileUrl() == null || Uri.EMPTY.equals(proxy.getPacFileUrl()))) {
- proxy = null;
- }
- return proxy;
- }
-
- // ProxyInfo equality function with a couple modifications over ProxyInfo.equals() to make it
- // better for determining if a new proxy broadcast is necessary:
- // 1. Canonicalize empty ProxyInfos to null so an empty proxy compares equal to null so as to
- // avoid unnecessary broadcasts.
- // 2. Make sure all parts of the ProxyInfo's compare true, including the host when a PAC URL
- // is in place. This is important so legacy PAC resolver (see com.android.proxyhandler)
- // changes aren't missed. The legacy PAC resolver pretends to be a simple HTTP proxy but
- // actually uses the PAC to resolve; this results in ProxyInfo's with PAC URL, host and port
- // all set.
- private boolean proxyInfoEqual(ProxyInfo a, ProxyInfo b) {
- a = canonicalizeProxyInfo(a);
- b = canonicalizeProxyInfo(b);
- // ProxyInfo.equals() doesn't check hosts when PAC URLs are present, but we need to check
- // hosts even when PAC URLs are present to account for the legacy PAC resolver.
- return Objects.equals(a, b) && (a == null || Objects.equals(a.getHost(), b.getHost()));
- }
-
- public void setGlobalProxy(ProxyInfo proxyProperties) {
+ @Override
+ public void setGlobalProxy(final ProxyInfo proxyProperties) {
enforceConnectivityInternalPermission();
-
- synchronized (mProxyLock) {
- if (proxyProperties == mGlobalProxy) return;
- if (proxyProperties != null && proxyProperties.equals(mGlobalProxy)) return;
- if (mGlobalProxy != null && mGlobalProxy.equals(proxyProperties)) return;
-
- String host = "";
- int port = 0;
- String exclList = "";
- String pacFileUrl = "";
- if (proxyProperties != null && (!TextUtils.isEmpty(proxyProperties.getHost()) ||
- !Uri.EMPTY.equals(proxyProperties.getPacFileUrl()))) {
- if (!proxyProperties.isValid()) {
- if (DBG)
- log("Invalid proxy properties, ignoring: " + proxyProperties.toString());
- return;
- }
- mGlobalProxy = new ProxyInfo(proxyProperties);
- host = mGlobalProxy.getHost();
- port = mGlobalProxy.getPort();
- exclList = mGlobalProxy.getExclusionListAsString();
- if (!Uri.EMPTY.equals(proxyProperties.getPacFileUrl())) {
- pacFileUrl = proxyProperties.getPacFileUrl().toString();
- }
- } else {
- mGlobalProxy = null;
- }
- ContentResolver res = mContext.getContentResolver();
- final long token = Binder.clearCallingIdentity();
- try {
- Settings.Global.putString(res, Settings.Global.GLOBAL_HTTP_PROXY_HOST, host);
- Settings.Global.putInt(res, Settings.Global.GLOBAL_HTTP_PROXY_PORT, port);
- Settings.Global.putString(res, Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST,
- exclList);
- Settings.Global.putString(res, Settings.Global.GLOBAL_HTTP_PROXY_PAC, pacFileUrl);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
-
- if (mGlobalProxy == null) {
- proxyProperties = mDefaultProxy;
- }
- sendProxyBroadcast(proxyProperties);
- }
+ mProxyTracker.setGlobalProxy(proxyProperties);
}
private void loadGlobalProxy() {
@@ -3491,20 +3397,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
return;
}
- synchronized (mProxyLock) {
- mGlobalProxy = proxyProperties;
+ synchronized (mProxyTracker.mProxyLock) {
+ mProxyTracker.mGlobalProxy = proxyProperties;
}
}
}
+ @Override
+ @Nullable
public ProxyInfo getGlobalProxy() {
- // this information is already available as a world read/writable jvm property
- // so this API change wouldn't have a benifit. It also breaks the passing
- // of proxy info to all the JVMs.
- // enforceAccessPermission();
- synchronized (mProxyLock) {
- return mGlobalProxy;
- }
+ return mProxyTracker.getGlobalProxy();
}
private void handleApplyDefaultProxy(ProxyInfo proxy) {
@@ -3512,33 +3414,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
&& Uri.EMPTY.equals(proxy.getPacFileUrl())) {
proxy = null;
}
- synchronized (mProxyLock) {
- if (mDefaultProxy != null && mDefaultProxy.equals(proxy)) return;
- if (mDefaultProxy == proxy) return; // catches repeated nulls
- if (proxy != null && !proxy.isValid()) {
- if (DBG) log("Invalid proxy properties, ignoring: " + proxy.toString());
- return;
- }
-
- // This call could be coming from the PacManager, containing the port of the local
- // proxy. If this new proxy matches the global proxy then copy this proxy to the
- // global (to get the correct local port), and send a broadcast.
- // TODO: Switch PacManager to have its own message to send back rather than
- // reusing EVENT_HAS_CHANGED_PROXY and this call to handleApplyDefaultProxy.
- if ((mGlobalProxy != null) && (proxy != null)
- && (!Uri.EMPTY.equals(proxy.getPacFileUrl()))
- && proxy.getPacFileUrl().equals(mGlobalProxy.getPacFileUrl())) {
- mGlobalProxy = proxy;
- sendProxyBroadcast(mGlobalProxy);
- return;
- }
- mDefaultProxy = proxy;
-
- if (mGlobalProxy != null) return;
- if (!mDefaultProxyDisabled) {
- sendProxyBroadcast(proxy);
- }
- }
+ mProxyTracker.setDefaultProxy(proxy);
}
// If the proxy has changed from oldLp to newLp, resend proxy broadcast with default proxy.
@@ -3546,17 +3422,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
// the default proxy (even if it hasn't changed).
// TODO: Deprecate the broadcast extras as they aren't necessarily applicable in a multi-network
// world where an app might be bound to a non-default network.
- private void updateProxy(LinkProperties newLp, LinkProperties oldLp, NetworkAgentInfo nai) {
+ private void updateProxy(LinkProperties newLp, LinkProperties oldLp) {
ProxyInfo newProxyInfo = newLp == null ? null : newLp.getHttpProxy();
ProxyInfo oldProxyInfo = oldLp == null ? null : oldLp.getHttpProxy();
- if (!proxyInfoEqual(newProxyInfo, oldProxyInfo)) {
- sendProxyBroadcast(getDefaultProxy());
+ if (!ProxyTracker.proxyInfoEqual(newProxyInfo, oldProxyInfo)) {
+ mProxyTracker.sendProxyBroadcast(mProxyTracker.getDefaultProxy());
}
}
private void handleDeprecatedGlobalHttpProxy() {
- String proxy = Settings.Global.getString(mContext.getContentResolver(),
+ final String proxy = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.HTTP_PROXY);
if (!TextUtils.isEmpty(proxy)) {
String data[] = proxy.split(":");
@@ -3564,7 +3440,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
return;
}
- String proxyHost = data[0];
+ final String proxyHost = data[0];
int proxyPort = 8080;
if (data.length > 1) {
try {
@@ -3573,27 +3449,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
return;
}
}
- ProxyInfo p = new ProxyInfo(data[0], proxyPort, "");
+ final ProxyInfo p = new ProxyInfo(proxyHost, proxyPort, "");
setGlobalProxy(p);
}
}
- private void sendProxyBroadcast(ProxyInfo proxy) {
- if (proxy == null) proxy = new ProxyInfo("", 0, "");
- if (mPacManager.setCurrentProxyScriptUrl(proxy)) return;
- if (DBG) log("sending Proxy Broadcast for " + proxy);
- Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION);
- intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING |
- Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- intent.putExtra(Proxy.EXTRA_PROXY_INFO, proxy);
- final long ident = Binder.clearCallingIdentity();
- try {
- mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
private static class SettingsObserver extends ContentObserver {
final private HashMap<Uri, Integer> mUriEventMap;
final private Context mContext;
@@ -3601,7 +3461,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
SettingsObserver(Context context, Handler handler) {
super(null);
- mUriEventMap = new HashMap<Uri, Integer>();
+ mUriEventMap = new HashMap<>();
mContext = context;
mHandler = handler;
}
@@ -3907,7 +3767,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
synchronized (mVpns) {
Vpn vpn = mVpns.get(userId);
if (vpn == null) {
- // Shouldn't happen as all codepaths that point here should have checked the Vpn
+ // Shouldn't happen as all code paths that point here should have checked the Vpn
// exists already.
Slog.wtf(TAG, "User " + userId + " has no Vpn configuration");
return false;
@@ -4071,7 +3931,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
url = String.format(url,
mTelephonyManager.getSimSerialNumber() /* ICCID */,
mTelephonyManager.getDeviceId() /* IMEI */,
- phoneNumber /* Phone numer */);
+ phoneNumber /* Phone number */);
}
return url;
@@ -4198,10 +4058,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
};
- private final HashMap<Messenger, NetworkFactoryInfo> mNetworkFactoryInfos =
- new HashMap<Messenger, NetworkFactoryInfo>();
- private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests =
- new HashMap<NetworkRequest, NetworkRequestInfo>();
+ private final HashMap<Messenger, NetworkFactoryInfo> mNetworkFactoryInfos = new HashMap<>();
+ private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests = new HashMap<>();
private static final int MAX_NETWORK_REQUESTS_PER_UID = 100;
// Map from UID to number of NetworkRequests that UID has filed.
@@ -4315,7 +4173,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private ArrayList<Integer> getSignalStrengthThresholds(NetworkAgentInfo nai) {
- final SortedSet<Integer> thresholds = new TreeSet();
+ final SortedSet<Integer> thresholds = new TreeSet<>();
synchronized (nai) {
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
if (nri.request.networkCapabilities.hasSignalStrength() &&
@@ -4324,7 +4182,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
}
- return new ArrayList<Integer>(thresholds);
+ return new ArrayList<>(thresholds);
}
private void updateSignalStrengthThresholds(
@@ -4604,13 +4462,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
// NOTE: Accessed on multiple threads, must be synchronized on itself.
@GuardedBy("mNetworkForRequestId")
- private final SparseArray<NetworkAgentInfo> mNetworkForRequestId =
- new SparseArray<NetworkAgentInfo>();
+ private final SparseArray<NetworkAgentInfo> mNetworkForRequestId = new SparseArray<>();
// NOTE: Accessed on multiple threads, must be synchronized on itself.
@GuardedBy("mNetworkForNetId")
- private final SparseArray<NetworkAgentInfo> mNetworkForNetId =
- new SparseArray<NetworkAgentInfo>();
+ private final SparseArray<NetworkAgentInfo> mNetworkForNetId = new SparseArray<>();
// NOTE: Accessed on multiple threads, synchronized with mNetworkForNetId.
// An entry is first added to mNetIdInUse, prior to mNetworkForNetId, so
// there may not be a strict 1:1 correlation between the two.
@@ -4620,11 +4476,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
// NetworkAgentInfo keyed off its connecting messenger
// TODO - eval if we can reduce the number of lists/hashmaps/sparsearrays
// NOTE: Only should be accessed on ConnectivityServiceThread, except dump().
- private final HashMap<Messenger, NetworkAgentInfo> mNetworkAgentInfos =
- new HashMap<Messenger, NetworkAgentInfo>();
+ private final HashMap<Messenger, NetworkAgentInfo> mNetworkAgentInfos = new HashMap<>();
@GuardedBy("mBlockedAppUids")
- private final HashSet<Integer> mBlockedAppUids = new HashSet();
+ private final HashSet<Integer> mBlockedAppUids = new HashSet<>();
// Note: if mDefaultRequest is changed, NetworkMonitor needs to be updated.
private final NetworkRequest mDefaultRequest;
@@ -4734,7 +4589,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (isDefaultNetwork(networkAgent)) {
handleApplyDefaultProxy(newLp.getHttpProxy());
} else {
- updateProxy(newLp, oldLp, networkAgent);
+ updateProxy(newLp, oldLp);
}
// TODO - move this check to cover the whole function
if (!Objects.equals(newLp, oldLp)) {
@@ -4749,7 +4604,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private void wakeupModifyInterface(String iface, NetworkCapabilities caps, boolean add) {
- // Marks are only available on WiFi interaces. Checking for
+ // Marks are only available on WiFi interfaces. Checking for
// marks on unsupported interfaces is harmless.
if (!caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
return;
@@ -4781,7 +4636,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private void updateInterfaces(LinkProperties newLp, LinkProperties oldLp, int netId,
NetworkCapabilities caps) {
- CompareResult<String> interfaceDiff = new CompareResult<String>(
+ CompareResult<String> interfaceDiff = new CompareResult<>(
oldLp != null ? oldLp.getAllInterfaceNames() : null,
newLp != null ? newLp.getAllInterfaceNames() : null);
for (String iface : interfaceDiff.added) {
@@ -4816,7 +4671,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// add routes before removing old in case it helps with continuous connectivity
- // do this twice, adding non-nexthop routes first, then routes they are dependent on
+ // do this twice, adding non-next-hop routes first, then routes they are dependent on
for (RouteInfo route : routeDiff.added) {
if (route.hasGateway()) continue;
if (VDBG) log("Adding Route [" + route + "] to network " + netId);
@@ -5269,8 +5124,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Find and migrate to this Network any NetworkRequests for
// which this network is now the best.
- ArrayList<NetworkAgentInfo> affectedNetworks = new ArrayList<NetworkAgentInfo>();
- ArrayList<NetworkRequestInfo> addedRequests = new ArrayList<NetworkRequestInfo>();
+ ArrayList<NetworkAgentInfo> affectedNetworks = new ArrayList<>();
+ ArrayList<NetworkRequestInfo> addedRequests = new ArrayList<>();
NetworkCapabilities nc = newNetwork.networkCapabilities;
if (VDBG) log(" network has: " + nc);
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
@@ -5334,7 +5189,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
keep = true;
// Tell NetworkFactories about the new score, so they can stop
// trying to connect if they know they cannot match it.
- // TODO - this could get expensive if we have alot of requests for this
+ // TODO - this could get expensive if we have a lot of requests for this
// network. Think about if there is a way to reduce this. Push
// netid->request mapping to each factory?
sendUpdatedScoreToFactories(nri.request, score);
@@ -5455,7 +5310,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// This has to happen after the notifyNetworkCallbacks as that tickles each
// ConnectivityManager instance so that legacy requests correctly bind dns
- // requests to this network. The legacy users are listening for this bcast
+ // requests to this network. The legacy users are listening for this broadcast
// and will generally do a dns request so they can ensureRouteToHost and if
// they do that before the callbacks happen they'll use the default network.
//
@@ -5520,7 +5375,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// TODO: This may get slow. The "changed" parameter is provided for future optimization
// to avoid the slowness. It is not simply enough to process just "changed", for
// example in the case where "changed"'s score decreases and another network should begin
- // satifying a NetworkRequest that "changed" currently satisfies.
+ // satisfying a NetworkRequest that "changed" currently satisfies.
// Optimization: Only reprocess "changed" if its score improved. This is safe because it
// can only add more NetworkRequests satisfied by "changed", and this is exactly what
@@ -5619,20 +5474,24 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (!networkAgent.everConnected && state == NetworkInfo.State.CONNECTED) {
networkAgent.everConnected = true;
+ if (networkAgent.linkProperties == null) {
+ Slog.wtf(TAG, networkAgent.name() + " connected with null LinkProperties");
+ }
+
handlePerNetworkPrivateDnsConfig(networkAgent, mDnsManager.getPrivateDnsConfig());
updateLinkProperties(networkAgent, null);
- notifyIfacesChangedForNetworkStats();
networkAgent.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
scheduleUnvalidatedPrompt(networkAgent);
if (networkAgent.isVPN()) {
// Temporarily disable the default proxy (not global).
- synchronized (mProxyLock) {
- if (!mDefaultProxyDisabled) {
- mDefaultProxyDisabled = true;
- if (mGlobalProxy == null && mDefaultProxy != null) {
- sendProxyBroadcast(null);
+ synchronized (mProxyTracker.mProxyLock) {
+ if (!mProxyTracker.mDefaultProxyDisabled) {
+ mProxyTracker.mDefaultProxyDisabled = true;
+ if (mProxyTracker.mGlobalProxy == null
+ && mProxyTracker.mDefaultProxy != null) {
+ mProxyTracker.sendProxyBroadcast(null);
}
}
}
@@ -5657,11 +5516,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
} else if (state == NetworkInfo.State.DISCONNECTED) {
networkAgent.asyncChannel.disconnect();
if (networkAgent.isVPN()) {
- synchronized (mProxyLock) {
- if (mDefaultProxyDisabled) {
- mDefaultProxyDisabled = false;
- if (mGlobalProxy == null && mDefaultProxy != null) {
- sendProxyBroadcast(mDefaultProxy);
+ synchronized (mProxyTracker.mProxyLock) {
+ if (mProxyTracker.mDefaultProxyDisabled) {
+ mProxyTracker.mDefaultProxyDisabled = false;
+ if (mProxyTracker.mGlobalProxy == null
+ && mProxyTracker.mDefaultProxy != null) {
+ mProxyTracker.sendProxyBroadcast(mProxyTracker.mDefaultProxy);
}
}
}
@@ -5670,7 +5530,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
disconnectAndDestroyNetwork(networkAgent);
} else if ((oldInfo != null && oldInfo.getState() == NetworkInfo.State.SUSPENDED) ||
state == NetworkInfo.State.SUSPENDED) {
- // going into or coming out of SUSPEND: rescore and notify
+ // going into or coming out of SUSPEND: re-score and notify
if (networkAgent.getCurrentScore() != oldScore) {
rematchAllNetworksAndRequests(networkAgent, oldScore);
}
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index b8f395b74c59..a34c2b93e3bf 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -30,15 +30,15 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.ContentObserver;
import android.hardware.Sensor;
-import android.hardware.SensorManager;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
-import android.location.LocationRequest;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
+import android.location.LocationRequest;
import android.net.ConnectivityManager;
import android.net.INetworkPolicyManager;
import android.net.NetworkInfo;
@@ -82,10 +82,10 @@ import com.android.internal.os.AtomicFile;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
-import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.server.am.BatteryStatsService;
import com.android.server.net.NetworkPolicyManagerInternal;
+import com.android.server.wm.ActivityTaskManagerInternal;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -118,6 +118,7 @@ public class DeviceIdleController extends SystemService
private AlarmManager mAlarmManager;
private IBatteryStats mBatteryStats;
private ActivityManagerInternal mLocalActivityManager;
+ private ActivityTaskManagerInternal mLocalActivityTaskManager;
private PowerManagerInternal mLocalPowerManager;
private PowerManager mPowerManager;
private ConnectivityService mConnectivityService;
@@ -1359,8 +1360,8 @@ public class DeviceIdleController extends SystemService
}
}
- private ActivityManagerInternal.ScreenObserver mScreenObserver =
- new ActivityManagerInternal.ScreenObserver() {
+ private ActivityTaskManagerInternal.ScreenObserver mScreenObserver =
+ new ActivityTaskManagerInternal.ScreenObserver() {
@Override
public void onAwakeStateChanged(boolean isAwake) { }
@@ -1461,6 +1462,7 @@ public class DeviceIdleController extends SystemService
mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
mBatteryStats = BatteryStatsService.getService();
mLocalActivityManager = getLocalService(ActivityManagerInternal.class);
+ mLocalActivityTaskManager = getLocalService(ActivityTaskManagerInternal.class);
mLocalPowerManager = getLocalService(PowerManagerInternal.class);
mPowerManager = getContext().getSystemService(PowerManager.class);
mActiveIdleWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
@@ -1539,7 +1541,7 @@ public class DeviceIdleController extends SystemService
mPowerSaveWhitelistAllAppIdArray, mPowerSaveWhitelistExceptIdleAppIdArray);
mLocalPowerManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray);
- mLocalActivityManager.registerScreenObserver(mScreenObserver);
+ mLocalActivityTaskManager.registerScreenObserver(mScreenObserver);
passWhiteListsToForceAppStandbyTrackerLocked();
updateInteractivityLocked();
diff --git a/services/core/java/com/android/server/DropBoxManagerService.java b/services/core/java/com/android/server/DropBoxManagerService.java
index 887de74f1cf9..b393d8758f3b 100644
--- a/services/core/java/com/android/server/DropBoxManagerService.java
+++ b/services/core/java/com/android/server/DropBoxManagerService.java
@@ -17,12 +17,12 @@
package com.android.server;
import android.app.ActivityManager;
+import android.app.AppOpsManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Binder;
@@ -41,13 +41,13 @@ import android.text.format.Time;
import android.util.ArrayMap;
import android.util.Slog;
-import libcore.io.IoUtils;
-
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.IDropBoxManagerService;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.ObjectUtils;
+import libcore.io.IoUtils;
+
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileDescriptor;
@@ -58,7 +58,6 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Objects;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.zip.GZIPOutputStream;
@@ -145,8 +144,8 @@ public final class DropBoxManagerService extends SystemService {
}
@Override
- public DropBoxManager.Entry getNextEntry(String tag, long millis) {
- return DropBoxManagerService.this.getNextEntry(tag, millis);
+ public DropBoxManager.Entry getNextEntry(String tag, long millis, String callingPackage) {
+ return DropBoxManagerService.this.getNextEntry(tag, millis, callingPackage);
}
@Override
@@ -327,10 +326,29 @@ public final class DropBoxManagerService extends SystemService {
}
}
- public synchronized DropBoxManager.Entry getNextEntry(String tag, long millis) {
- if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.READ_LOGS)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("READ_LOGS permission required");
+ private boolean checkPermission(int callingUid, String callingPackage) {
+ // Callers always need this permission
+ getContext().enforceCallingOrSelfPermission(
+ android.Manifest.permission.READ_LOGS, TAG);
+
+ // Callers also need the ability to read usage statistics
+ switch (getContext().getSystemService(AppOpsManager.class)
+ .noteOp(AppOpsManager.OP_GET_USAGE_STATS, callingUid, callingPackage)) {
+ case AppOpsManager.MODE_ALLOWED:
+ return true;
+ case AppOpsManager.MODE_DEFAULT:
+ getContext().enforceCallingOrSelfPermission(
+ android.Manifest.permission.PACKAGE_USAGE_STATS, TAG);
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public synchronized DropBoxManager.Entry getNextEntry(String tag, long millis,
+ String callingPackage) {
+ if (!checkPermission(Binder.getCallingUid(), callingPackage)) {
+ return null;
}
try {
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 19170f8ff5b0..4b8ece97390f 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -152,7 +152,6 @@ import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RadioButton;
import android.widget.Switch;
import android.widget.TextView;
-import android.widget.Toast;
import com.android.server.wm.WindowManagerInternal;
@@ -211,7 +210,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
static final int MSG_SET_INTERACTIVE = 3030;
static final int MSG_SET_USER_ACTION_NOTIFICATION_SEQUENCE_NUMBER = 3040;
static final int MSG_REPORT_FULLSCREEN_MODE = 3045;
- static final int MSG_SWITCH_IME = 3050;
static final int MSG_HARD_KEYBOARD_SWITCH_CHANGED = 4000;
@@ -326,6 +324,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// Used to bring IME service up to visible adjustment while it is being shown.
final ServiceConnection mVisibleConnection = new ServiceConnection() {
+ @Override public void onBindingDied(ComponentName name) {
+ synchronized (mMethodMap) {
+ if (mVisibleBound) {
+ mContext.unbindService(mVisibleConnection);
+ mVisibleBound = false;
+ }
+ }
+ }
+
@Override public void onServiceConnected(ComponentName name, IBinder service) {
}
@@ -461,6 +468,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
IBinder mCurFocusedWindow;
/**
+ * The last window token that we confirmed that IME started talking to. This is always updated
+ * upon reports from the input method. If the window state is already changed before the report
+ * is handled, this field just keeps the last value.
+ */
+ IBinder mLastImeTargetWindow;
+
+ /**
* {@link WindowManager.LayoutParams#softInputMode} of {@link #mCurFocusedWindow}.
*
* @see #mCurFocusedWindow
@@ -608,7 +622,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private AlertDialog mSwitchingDialog;
private IBinder mSwitchingDialogToken = new Binder();
private View mSwitchingDialogTitleView;
- private Toast mSubtypeSwitchedByShortCutToast;
private InputMethodInfo[] mIms;
private int[] mSubtypeIds;
private LocaleList mLastSystemLocales;
@@ -682,7 +695,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
@GuardedBy("mMethodMap")
- private final WeakHashMap<IBinder, StartInputInfo> mStartInputMap = new WeakHashMap<>();
+ private final WeakHashMap<IBinder, IBinder> mImeTargetWindowMap = new WeakHashMap<>();
/**
* A ring buffer to store the history of {@link StartInputInfo}.
@@ -1412,7 +1425,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private void resetDefaultImeLocked(Context context) {
// Do not reset the default (current) IME when it is a 3rd-party IME
- if (mCurMethodId != null && !InputMethodUtils.isSystemIme(mMethodMap.get(mCurMethodId))) {
+ if (mCurMethodId != null && !mMethodMap.get(mCurMethodId).isSystem()) {
return;
}
final List<InputMethodInfo> suitableImes = InputMethodUtils.getDefaultEnabledImes(
@@ -1803,7 +1816,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
final StartInputInfo info = new StartInputInfo(mCurToken, mCurId, startInputReason,
!initial, mCurFocusedWindow, mCurAttribute, mCurFocusedWindowSoftInputMode,
mCurSeq);
- mStartInputMap.put(startInputToken, info);
+ mImeTargetWindowMap.put(startInputToken, mCurFocusedWindow);
mStartInputHistory.addEntry(info);
final SessionState session = mCurClient.curSession;
@@ -1821,50 +1834,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@GuardedBy("mMethodMap")
@NonNull
- InputBindResult startInputLocked(
- /* @InputMethodClient.StartInputReason */ final int startInputReason,
- IInputMethodClient client, IInputContext inputContext,
- /* @InputConnectionInspector.missingMethods */ final int missingMethods,
- @Nullable EditorInfo attribute, int controlFlags) {
- // If no method is currently selected, do nothing.
- if (mCurMethodId == null) {
- return InputBindResult.NO_IME;
- }
-
- ClientState cs = mClients.get(client.asBinder());
- if (cs == null) {
- throw new IllegalArgumentException("unknown client "
- + client.asBinder());
- }
-
- if (attribute == null) {
- Slog.w(TAG, "Ignoring startInput with null EditorInfo."
- + " uid=" + cs.uid + " pid=" + cs.pid);
- return InputBindResult.NULL_EDITOR_INFO;
- }
-
- try {
- if (!mIWindowManager.inputMethodClientHasFocus(cs.client)) {
- // Check with the window manager to make sure this client actually
- // has a window with focus. If not, reject. This is thread safe
- // because if the focus changes some time before or after, the
- // next client receiving focus that has any interest in input will
- // be calling through here after that change happens.
- if (DEBUG) {
- Slog.w(TAG, "Starting input on non-focused client " + cs.client
- + " (uid=" + cs.uid + " pid=" + cs.pid + ")");
- }
- return InputBindResult.NOT_IME_TARGET_WINDOW;
- }
- } catch (RemoteException e) {
- }
-
- return startInputUncheckedLocked(cs, inputContext, missingMethods, attribute,
- controlFlags, startInputReason);
- }
-
- @GuardedBy("mMethodMap")
- @NonNull
InputBindResult startInputUncheckedLocked(@NonNull ClientState cs, IInputContext inputContext,
/* @InputConnectionInspector.missingMethods */ final int missingMethods,
@NonNull EditorInfo attribute, int controlFlags,
@@ -1892,8 +1861,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// If the screen is on, inform the new client it is active
if (mIsInteractive) {
- executeOrSendMessage(cs.client, mCaller.obtainMessageIO(
- MSG_SET_ACTIVE, mIsInteractive ? 1 : 0, cs));
+ executeOrSendMessage(cs.client, mCaller.obtainMessageIO(MSG_SET_ACTIVE, 1, cs));
}
}
@@ -1992,36 +1960,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return InputBindResult.IME_NOT_CONNECTED;
}
- @NonNull
- private InputBindResult startInput(
- /* @InputMethodClient.StartInputReason */ final int startInputReason,
- IInputMethodClient client, IInputContext inputContext,
- /* @InputConnectionInspector.missingMethods */ final int missingMethods,
- @Nullable EditorInfo attribute, int controlFlags) {
- if (!calledFromValidUser()) {
- return InputBindResult.INVALID_USER;
- }
- synchronized (mMethodMap) {
- if (DEBUG) {
- Slog.v(TAG, "startInput: reason="
- + InputMethodClient.getStartInputReason(startInputReason)
- + " client = " + client.asBinder()
- + " inputContext=" + inputContext
- + " missingMethods="
- + InputConnectionInspector.getMissingMethodFlagsAsString(missingMethods)
- + " attribute=" + attribute
- + " controlFlags=#" + Integer.toHexString(controlFlags));
- }
- final long ident = Binder.clearCallingIdentity();
- try {
- return startInputLocked(startInputReason, client, inputContext, missingMethods,
- attribute, controlFlags);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
-
@Override
public void finishInput(IInputMethodClient client) {
}
@@ -2288,15 +2226,12 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@BinderThread
@SuppressWarnings("deprecation")
@Override
- public void setImeWindowStatus(IBinder token, IBinder startInputToken, int vis,
- int backDisposition) {
+ public void setImeWindowStatus(IBinder token, int vis, int backDisposition) {
if (!calledWithValidToken(token)) {
return;
}
- final StartInputInfo info;
synchronized (mMethodMap) {
- info = mStartInputMap.get(startInputToken);
mImeWindowVis = vis;
mBackDisposition = backDisposition;
updateSystemUiLocked(token, vis, backDisposition);
@@ -2316,8 +2251,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
break;
}
mWindowManagerInternal.updateInputMethodWindowStatus(token,
- (vis & InputMethodService.IME_VISIBLE) != 0,
- dismissImeOnBackKeyPressed, info != null ? info.mTargetWindow : null);
+ (vis & InputMethodService.IME_VISIBLE) != 0, dismissImeOnBackKeyPressed);
}
private void updateSystemUi(IBinder token, int vis, int backDisposition) {
@@ -2326,6 +2260,22 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
+ @BinderThread
+ @Override
+ public void reportStartInput(IBinder token, IBinder startInputToken) {
+ if (!calledWithValidToken(token)) {
+ return;
+ }
+
+ synchronized (mMethodMap) {
+ final IBinder targetWindow = mImeTargetWindowMap.get(startInputToken);
+ if (targetWindow != null && mLastImeTargetWindow != targetWindow) {
+ mWindowManagerInternal.updateInputMethodTargetWindow(token, targetWindow);
+ }
+ mLastImeTargetWindow = targetWindow;
+ }
+ }
+
// Caution! This method is called in this class. Handle multi-user carefully
private void updateSystemUiLocked(IBinder token, int vis, int backDisposition) {
if (!calledWithValidToken(token)) {
@@ -2736,15 +2686,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
int windowFlags, @Nullable EditorInfo attribute, IInputContext inputContext,
/* @InputConnectionInspector.missingMethods */ final int missingMethods,
int unverifiedTargetSdkVersion) {
- final InputBindResult result;
- if (windowToken != null) {
- result = windowGainedFocus(startInputReason, client, windowToken, controlFlags,
- softInputMode, windowFlags, attribute, inputContext, missingMethods,
- unverifiedTargetSdkVersion);
- } else {
- result = startInput(startInputReason, client, inputContext, missingMethods, attribute,
- controlFlags);
+ if (windowToken == null) {
+ Slog.e(TAG, "windowToken cannot be null.");
+ return InputBindResult.NULL;
}
+ final InputBindResult result = startInputOrWindowGainedFocusInternal(startInputReason,
+ client, windowToken, controlFlags, softInputMode, windowFlags, attribute,
+ inputContext, missingMethods, unverifiedTargetSdkVersion);
if (result == null) {
// This must never happen, but just in case.
Slog.wtf(TAG, "InputBindResult is @NonNull. startInputReason="
@@ -2757,9 +2705,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
@NonNull
- private InputBindResult windowGainedFocus(
+ private InputBindResult startInputOrWindowGainedFocusInternal(
/* @InputMethodClient.StartInputReason */ final int startInputReason,
- IInputMethodClient client, IBinder windowToken, int controlFlags,
+ IInputMethodClient client, @NonNull IBinder windowToken, int controlFlags,
/* @android.view.WindowManager.LayoutParams.SoftInputModeFlags */ int softInputMode,
int windowFlags, EditorInfo attribute, IInputContext inputContext,
/* @InputConnectionInspector.missingMethods */ final int missingMethods,
@@ -2770,7 +2718,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
long ident = Binder.clearCallingIdentity();
try {
synchronized (mMethodMap) {
- if (DEBUG) Slog.v(TAG, "windowGainedFocus: reason="
+ if (DEBUG) Slog.v(TAG, "startInputOrWindowGainedFocusInternal: reason="
+ InputMethodClient.getStartInputReason(startInputReason)
+ " client=" + client.asBinder()
+ " inputContext=" + inputContext
@@ -3080,7 +3028,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
: mCurrentSubtype.getLocale();
for (int i = 0; i < N; ++i) {
final InputMethodInfo imi = enabled.get(i);
- if (imi.getSubtypeCount() > 0 && InputMethodUtils.isSystemIme(imi)) {
+ if (imi.getSubtypeCount() > 0 && imi.isSystem()) {
InputMethodSubtype keyboardSubtype =
InputMethodUtils.findLastResortApplicableSubtypeLocked(mRes,
InputMethodUtils.getSubtypes(imi),
@@ -3121,8 +3069,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return false;
}
final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(
- onlyCurrentIme, mMethodMap.get(mCurMethodId), mCurrentSubtype,
- true /* forward */);
+ onlyCurrentIme, mMethodMap.get(mCurMethodId), mCurrentSubtype);
if (nextSubtype == null) {
return false;
}
@@ -3142,8 +3089,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return false;
}
final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(
- false /* onlyCurrentIme */, mMethodMap.get(mCurMethodId), mCurrentSubtype,
- true /* forward */);
+ false /* onlyCurrentIme */, mMethodMap.get(mCurMethodId), mCurrentSubtype);
if (nextSubtype == null) {
return false;
}
@@ -3506,9 +3452,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
case MSG_START_VR_INPUT:
startVrInputMethodNoCheck((ComponentName) msg.obj);
return true;
- case MSG_SWITCH_IME:
- handleSwitchInputMethod(msg.arg1 != 0);
- return true;
case MSG_SET_USER_ACTION_NOTIFICATION_SEQUENCE_NUMBER: {
final int sequenceNumber = msg.arg1;
final ClientState clientState = (ClientState)msg.obj;
@@ -3562,32 +3505,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
- private void handleSwitchInputMethod(final boolean forwardDirection) {
- synchronized (mMethodMap) {
- final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(
- false, mMethodMap.get(mCurMethodId), mCurrentSubtype, forwardDirection);
- if (nextSubtype == null) {
- return;
- }
- setInputMethodLocked(nextSubtype.mImi.getId(), nextSubtype.mSubtypeId);
- final InputMethodInfo newInputMethodInfo = mMethodMap.get(mCurMethodId);
- if (newInputMethodInfo == null) {
- return;
- }
- final CharSequence toastText = InputMethodUtils.getImeAndSubtypeDisplayName(mContext,
- newInputMethodInfo, mCurrentSubtype);
- if (!TextUtils.isEmpty(toastText)) {
- if (mSubtypeSwitchedByShortCutToast == null) {
- mSubtypeSwitchedByShortCutToast = Toast.makeText(mContext, toastText,
- Toast.LENGTH_SHORT);
- } else {
- mSubtypeSwitchedByShortCutToast.setText(toastText);
- }
- mSubtypeSwitchedByShortCutToast.show();
- }
- }
- }
-
private boolean chooseNewDefaultIMELocked() {
final InputMethodInfo imi = InputMethodUtils.getMostApplicableDefaultIME(
mSettings.getEnabledInputMethodListLocked());
@@ -4500,13 +4417,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
@Override
- public void switchInputMethod(boolean forwardDirection) {
- // Do everything in handler so as not to block the caller.
- mHandler.sendMessage(mHandler.obtainMessage(MSG_SWITCH_IME,
- forwardDirection ? 1 : 0, 0));
- }
-
- @Override
public void hideCurrentInputMethod() {
mHandler.removeMessages(MSG_HIDE_CURRENT_INPUT_METHOD);
mHandler.sendEmptyMessage(MSG_HIDE_CURRENT_INPUT_METHOD);
@@ -4518,22 +4428,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}
- private static String imeWindowStatusToString(final int imeWindowVis) {
- final StringBuilder sb = new StringBuilder();
- boolean first = true;
- if ((imeWindowVis & InputMethodService.IME_ACTIVE) != 0) {
- sb.append("Active");
- first = false;
- }
- if ((imeWindowVis & InputMethodService.IME_VISIBLE) != 0) {
- if (!first) {
- sb.append("|");
- }
- sb.append("Visible");
- }
- return sb.toString();
- }
-
@Override
public IInputContentUriToken createInputContentUriToken(@Nullable IBinder token,
@Nullable Uri contentUri, @Nullable String packageName) {
@@ -4645,14 +4539,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
InputMethodClient.softInputModeToString(mCurFocusedWindowSoftInputMode)
+ " client=" + mCurFocusedWindowClient);
focusedWindowClient = mCurFocusedWindowClient;
- p.println(" mCurId=" + mCurId + " mHaveConnect=" + mHaveConnection
- + " mBoundToMethod=" + mBoundToMethod);
+ p.println(" mCurId=" + mCurId + " mHaveConnection=" + mHaveConnection
+ + " mBoundToMethod=" + mBoundToMethod + " mVisibleBound=" + mVisibleBound);
p.println(" mCurToken=" + mCurToken);
p.println(" mCurIntent=" + mCurIntent);
method = mCurMethod;
p.println(" mCurMethod=" + mCurMethod);
p.println(" mEnabledSession=" + mEnabledSession);
- p.println(" mImeWindowVis=" + imeWindowStatusToString(mImeWindowVis));
p.println(" mShowRequested=" + mShowRequested
+ " mShowExplicitlyRequested=" + mShowExplicitlyRequested
+ " mShowForced=" + mShowForced
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index 60f1877d3739..744ed25f160f 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -1481,19 +1481,23 @@ public class IpSecService extends IIpSecService.Stub {
}
}
+ private static final String TUNNEL_OP = "STOPSHIP"; // = AppOpsManager.OP_MANAGE_IPSEC_TUNNELS;
+
private void enforceTunnelPermissions(String callingPackage) {
checkNotNull(callingPackage, "Null calling package cannot create IpSec tunnels");
- switch (getAppOpsManager().noteOp(
- AppOpsManager.OP_MANAGE_IPSEC_TUNNELS,
- Binder.getCallingUid(), callingPackage)) {
- case AppOpsManager.MODE_DEFAULT:
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.MANAGE_IPSEC_TUNNELS, "IpSecService");
- break;
- case AppOpsManager.MODE_ALLOWED:
- return;
- default:
- throw new SecurityException("Request to ignore AppOps for non-legacy API");
+ if (false) { // STOPSHIP if this line is present
+ switch (getAppOpsManager().noteOp(
+ TUNNEL_OP,
+ Binder.getCallingUid(), callingPackage)) {
+ case AppOpsManager.MODE_DEFAULT:
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.MANAGE_IPSEC_TUNNELS, "IpSecService");
+ break;
+ case AppOpsManager.MODE_ALLOWED:
+ return;
+ default:
+ throw new SecurityException("Request to ignore AppOps for non-legacy API");
+ }
}
}
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index abbcdd4b9cb8..b3d88f44275f 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -153,6 +153,10 @@ public class LocationManagerService extends ILocationManager.Stub {
// default background throttling interval if not overriden in settings
private static final long DEFAULT_BACKGROUND_THROTTLE_INTERVAL_MS = 30 * 60 * 1000;
+ // Default value for maximum age of last location returned to applications with foreground-only
+ // location permissions.
+ private static final long DEFAULT_LAST_LOCATION_MAX_AGE_MS = 20 * 60 * 1000;
+
// Location Providers may sometimes deliver location updates
// slightly faster that requested - provide grace period so
// we don't unnecessarily filter events that are otherwise on
@@ -244,6 +248,9 @@ public class LocationManagerService extends ILocationManager.Stub {
private int mCurrentUserId = UserHandle.USER_SYSTEM;
private int[] mCurrentUserProfiles = new int[]{UserHandle.USER_SYSTEM};
+ // Maximum age of last location returned to clients with foreground-only location permissions.
+ private long mLastLocationMaxAgeMs;
+
private GnssLocationProvider.GnssSystemInfoProvider mGnssSystemInfoProvider;
private GnssLocationProvider.GnssMetricsProvider mGnssMetricsProvider;
@@ -311,7 +318,8 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
};
- mAppOps.startWatchingMode(AppOpsManager.OP_COARSE_LOCATION, null, callback);
+ mAppOps.startWatchingMode(AppOpsManager.OP_COARSE_LOCATION, null,
+ AppOpsManager.WATCH_FOREGROUND_CHANGES, callback);
PackageManager.OnPermissionsChangedListener permissionListener
= new PackageManager.OnPermissionsChangedListener() {
@@ -344,6 +352,7 @@ public class LocationManagerService extends ILocationManager.Stub {
updateUserProfiles(mCurrentUserId);
updateBackgroundThrottlingWhitelistLocked();
+ updateLastLocationMaxAgeLocked();
// prepare providers
loadProvidersLocked();
@@ -373,6 +382,18 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}, UserHandle.USER_ALL);
mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.LOCATION_LAST_LOCATION_MAX_AGE_MILLIS),
+ true,
+ new ContentObserver(mLocationHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ synchronized (mLock) {
+ updateLastLocationMaxAgeLocked();
+ }
+ }
+ }
+ );
+ mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(
Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST),
true,
@@ -385,6 +406,7 @@ public class LocationManagerService extends ILocationManager.Stub {
}
}
}, UserHandle.USER_ALL);
+
mPackageMonitor.register(mContext, mLocationHandler.getLooper(), true);
// listen for user change
@@ -783,6 +805,7 @@ public class LocationManagerService extends ILocationManager.Stub {
* location updates.
*/
private final class Receiver implements IBinder.DeathRecipient, PendingIntent.OnFinished {
+ private static final long WAKELOCK_TIMEOUT_MILLIS = 60 * 1000;
final Identity mIdentity;
final int mAllowedResolutionLevel; // resolution level allowed to receiver
@@ -826,6 +849,10 @@ public class LocationManagerService extends ILocationManager.Stub {
workSource = new WorkSource(mIdentity.mUid, mIdentity.mPackageName);
}
mWakeLock.setWorkSource(workSource);
+
+ // For a non-reference counted wakelock, each acquire will reset the timeout, and we
+ // only need to release it once.
+ mWakeLock.setReferenceCounted(false);
}
@Override
@@ -851,6 +878,7 @@ public class LocationManagerService extends ILocationManager.Stub {
for (String p : mUpdateRecords.keySet()) {
s.append(" ").append(mUpdateRecords.get(p).toString());
}
+ s.append(" monitoring location: ").append(mOpMonitoring);
s.append("]");
return s.toString();
}
@@ -923,7 +951,7 @@ public class LocationManagerService extends ILocationManager.Stub {
}
} else {
if (!allowMonitoring
- || mAppOps.checkOpNoThrow(op, mIdentity.mUid, mIdentity.mPackageName)
+ || mAppOps.noteOpNoThrow(op, mIdentity.mUid, mIdentity.mPackageName)
!= AppOpsManager.MODE_ALLOWED) {
mAppOps.finishOp(op, mIdentity.mUid, mIdentity.mPackageName);
return false;
@@ -1086,9 +1114,8 @@ public class LocationManagerService extends ILocationManager.Stub {
// this must be called while synchronized by caller in a synchronized block
// containing the sending of the broadcaset
private void incrementPendingBroadcastsLocked() {
- if (mPendingBroadcasts++ == 0) {
- mWakeLock.acquire();
- }
+ mPendingBroadcasts++;
+ mWakeLock.acquire(WAKELOCK_TIMEOUT_MILLIS);
}
private void decrementPendingBroadcastsLocked() {
@@ -1536,6 +1563,22 @@ public class LocationManagerService extends ILocationManager.Stub {
return -1;
}
+ private static String resolutionLevelToOpStr(int allowedResolutionLevel) {
+ switch(allowedResolutionLevel) {
+ case RESOLUTION_LEVEL_COARSE:
+ return AppOpsManager.OPSTR_COARSE_LOCATION;
+ case RESOLUTION_LEVEL_FINE:
+ return AppOpsManager.OPSTR_FINE_LOCATION;
+ case RESOLUTION_LEVEL_NONE:
+ // The client is not allowed to get any location, so both FINE and COARSE ops will
+ // be denied. Pick the most restrictive one to be safe.
+ return AppOpsManager.OPSTR_FINE_LOCATION;
+ default:
+ // Use the most restrictive ops if not sure.
+ return AppOpsManager.OPSTR_FINE_LOCATION;
+ }
+ }
+
boolean reportLocationAccessNoThrow(
int pid, int uid, String packageName, int allowedResolutionLevel) {
int op = resolutionLevelToOp(allowedResolutionLevel);
@@ -1551,7 +1594,7 @@ public class LocationManagerService extends ILocationManager.Stub {
boolean checkLocationAccess(int pid, int uid, String packageName, int allowedResolutionLevel) {
int op = resolutionLevelToOp(allowedResolutionLevel);
if (op >= 0) {
- if (mAppOps.checkOp(op, uid, packageName) != AppOpsManager.MODE_ALLOWED) {
+ if (mAppOps.noteOp(op, uid, packageName) != AppOpsManager.MODE_ALLOWED) {
return false;
}
}
@@ -1867,6 +1910,14 @@ public class LocationManagerService extends ILocationManager.Stub {
Arrays.asList(setting.split(",")));
}
+ private void updateLastLocationMaxAgeLocked() {
+ mLastLocationMaxAgeMs =
+ Settings.Global.getLong(
+ mContext.getContentResolver(),
+ Settings.Global.LOCATION_LAST_LOCATION_MAX_AGE_MILLIS,
+ DEFAULT_LAST_LOCATION_MAX_AGE_MS);
+ }
+
private boolean isThrottlingExemptLocked(Identity identity) {
if (identity.mUid == Process.SYSTEM_UID) {
return true;
@@ -1960,7 +2011,8 @@ public class LocationManagerService extends ILocationManager.Stub {
return "UpdateRecord[" + mProvider + " " + mReceiver.mIdentity.mPackageName
+ "(" + mReceiver.mIdentity.mUid + (mIsForegroundUid ? " foreground"
: " background")
- + ")" + " " + mRealRequest + "]";
+ + ")" + " " + mRealRequest + " "
+ + mReceiver.mWorkSource + "]";
}
}
@@ -2271,6 +2323,17 @@ public class LocationManagerService extends ILocationManager.Stub {
if (location == null) {
return null;
}
+
+ // Don't return stale location to apps with foreground-only location permission.
+ String op = resolutionLevelToOpStr(allowedResolutionLevel);
+ long locationAgeMs = SystemClock.elapsedRealtime() -
+ location.getElapsedRealtimeNanos() / NANOS_PER_MILLI;
+ if ((locationAgeMs > mLastLocationMaxAgeMs)
+ && (mAppOps.unsafeCheckOp(op, uid, packageName)
+ == AppOpsManager.MODE_FOREGROUND)) {
+ return null;
+ }
+
if (allowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
Location noGPSLocation = location.getExtraLocation(
Location.EXTRA_NO_GPS_LOCATION);
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 6d6fd84dafaa..74d8755497a2 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -98,6 +98,7 @@ import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
+import android.util.StatsLog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -512,6 +513,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub
getBatteryStats().noteMobileRadioPowerState(powerState, tsNanos, uid);
} catch (RemoteException e) {
}
+ StatsLog.write_non_chained(StatsLog.MOBILE_RADIO_POWER_STATE_CHANGED, uid, null,
+ powerState);
}
}
@@ -522,6 +525,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub
getBatteryStats().noteWifiRadioPowerState(powerState, tsNanos, uid);
} catch (RemoteException e) {
}
+ StatsLog.write_non_chained(StatsLog.WIFI_RADIO_POWER_STATE_CHANGED, uid, null,
+ powerState);
}
}
diff --git a/services/core/java/com/android/server/NetworkTimeUpdateService.java b/services/core/java/com/android/server/NetworkTimeUpdateService.java
index 026a206a0c1a..1ff455ea7a8f 100644
--- a/services/core/java/com/android/server/NetworkTimeUpdateService.java
+++ b/services/core/java/com/android/server/NetworkTimeUpdateService.java
@@ -16,314 +16,15 @@
package com.android.server;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.database.ContentObserver;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.Network;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.util.Log;
-import android.util.NtpTrustedTime;
-import android.util.TimeUtils;
-
-import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.util.DumpUtils;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
+import android.os.IBinder;
/**
- * Monitors the network time and updates the system time if it is out of sync
- * and there hasn't been any NITZ update from the carrier recently.
- * If looking up the network time fails for some reason, it tries a few times with a short
- * interval and then resets to checking on longer intervals.
- * <p>
- * If the user enables AUTO_TIME, it will check immediately for the network time, if NITZ wasn't
- * available.
- * </p>
+ * An interface for NetworkTimeUpdateService implementations. Eventually part or all of this service
+ * will be subsumed into {@link com.android.server.timedetector.TimeDetectorService}. In the
+ * meantime this interface allows Android to use either the old or new implementation.
*/
-public class NetworkTimeUpdateService extends Binder {
-
- private static final String TAG = "NetworkTimeUpdateService";
- private static final boolean DBG = false;
-
- private static final int EVENT_AUTO_TIME_CHANGED = 1;
- private static final int EVENT_POLL_NETWORK_TIME = 2;
- private static final int EVENT_NETWORK_CHANGED = 3;
-
- private static final String ACTION_POLL =
- "com.android.server.NetworkTimeUpdateService.action.POLL";
-
- private static final int POLL_REQUEST = 0;
-
- private static final long NOT_SET = -1;
- private long mNitzTimeSetTime = NOT_SET;
- private Network mDefaultNetwork = null;
-
- private final Context mContext;
- private final NtpTrustedTime mTime;
- private final AlarmManager mAlarmManager;
- private final ConnectivityManager mCM;
- private final PendingIntent mPendingPollIntent;
- private final PowerManager.WakeLock mWakeLock;
-
- // NTP lookup is done on this thread and handler
- private Handler mHandler;
- private SettingsObserver mSettingsObserver;
- private NetworkTimeUpdateCallback mNetworkTimeUpdateCallback;
-
- // Normal polling frequency
- private final long mPollingIntervalMs;
- // Try-again polling interval, in case the network request failed
- private final long mPollingIntervalShorterMs;
- // Number of times to try again
- private final int mTryAgainTimesMax;
- // If the time difference is greater than this threshold, then update the time.
- private final int mTimeErrorThresholdMs;
- // Keeps track of how many quick attempts were made to fetch NTP time.
- // During bootup, the network may not have been up yet, or it's taking time for the
- // connection to happen.
- private int mTryAgainCounter;
-
- public NetworkTimeUpdateService(Context context) {
- mContext = context;
- mTime = NtpTrustedTime.getInstance(context);
- mAlarmManager = mContext.getSystemService(AlarmManager.class);
- mCM = mContext.getSystemService(ConnectivityManager.class);
-
- Intent pollIntent = new Intent(ACTION_POLL, null);
- mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0);
-
- mPollingIntervalMs = mContext.getResources().getInteger(
- com.android.internal.R.integer.config_ntpPollingInterval);
- mPollingIntervalShorterMs = mContext.getResources().getInteger(
- com.android.internal.R.integer.config_ntpPollingIntervalShorter);
- mTryAgainTimesMax = mContext.getResources().getInteger(
- com.android.internal.R.integer.config_ntpRetry);
- mTimeErrorThresholdMs = mContext.getResources().getInteger(
- com.android.internal.R.integer.config_ntpThreshold);
-
- mWakeLock = context.getSystemService(PowerManager.class).newWakeLock(
- PowerManager.PARTIAL_WAKE_LOCK, TAG);
- }
+public interface NetworkTimeUpdateService extends IBinder {
/** Initialize the receivers and initiate the first NTP request */
- public void systemRunning() {
- registerForTelephonyIntents();
- registerForAlarms();
-
- HandlerThread thread = new HandlerThread(TAG);
- thread.start();
- mHandler = new MyHandler(thread.getLooper());
- mNetworkTimeUpdateCallback = new NetworkTimeUpdateCallback();
- mCM.registerDefaultNetworkCallback(mNetworkTimeUpdateCallback, mHandler);
-
- mSettingsObserver = new SettingsObserver(mHandler, EVENT_AUTO_TIME_CHANGED);
- mSettingsObserver.observe(mContext);
- }
-
- private void registerForTelephonyIntents() {
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(TelephonyIntents.ACTION_NETWORK_SET_TIME);
- mContext.registerReceiver(mNitzReceiver, intentFilter);
- }
-
- private void registerForAlarms() {
- mContext.registerReceiver(
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- mHandler.obtainMessage(EVENT_POLL_NETWORK_TIME).sendToTarget();
- }
- }, new IntentFilter(ACTION_POLL));
- }
-
- private void onPollNetworkTime(int event) {
- // If Automatic time is not set, don't bother. Similarly, if we don't
- // have any default network, don't bother.
- if (mDefaultNetwork == null) return;
- mWakeLock.acquire();
- try {
- onPollNetworkTimeUnderWakeLock(event);
- } finally {
- mWakeLock.release();
- }
- }
-
- private void onPollNetworkTimeUnderWakeLock(int event) {
- // Force an NTP fix when outdated
- if (mTime.getCacheAge() >= mPollingIntervalMs) {
- if (DBG) Log.d(TAG, "Stale NTP fix; forcing refresh");
- mTime.forceSync();
- }
-
- if (mTime.getCacheAge() < mPollingIntervalMs) {
- // Obtained fresh fix; schedule next normal update
- resetAlarm(mPollingIntervalMs);
- if (isAutomaticTimeRequested()) {
- updateSystemClock(event);
- }
-
- } else {
- // No fresh fix; schedule retry
- mTryAgainCounter++;
- if (mTryAgainTimesMax < 0 || mTryAgainCounter <= mTryAgainTimesMax) {
- resetAlarm(mPollingIntervalShorterMs);
- } else {
- // Try much later
- mTryAgainCounter = 0;
- resetAlarm(mPollingIntervalMs);
- }
- }
- }
-
- private long getNitzAge() {
- if (mNitzTimeSetTime == NOT_SET) {
- return Long.MAX_VALUE;
- } else {
- return SystemClock.elapsedRealtime() - mNitzTimeSetTime;
- }
- }
-
- /**
- * Consider updating system clock based on current NTP fix, if requested by
- * user, significant enough delta, and we don't have a recent NITZ.
- */
- private void updateSystemClock(int event) {
- final boolean forceUpdate = (event == EVENT_AUTO_TIME_CHANGED);
- if (!forceUpdate) {
- if (getNitzAge() < mPollingIntervalMs) {
- if (DBG) Log.d(TAG, "Ignoring NTP update due to recent NITZ");
- return;
- }
-
- final long skew = Math.abs(mTime.currentTimeMillis() - System.currentTimeMillis());
- if (skew < mTimeErrorThresholdMs) {
- if (DBG) Log.d(TAG, "Ignoring NTP update due to low skew");
- return;
- }
- }
-
- SystemClock.setCurrentTimeMillis(mTime.currentTimeMillis());
- }
-
- /**
- * Cancel old alarm and starts a new one for the specified interval.
- *
- * @param interval when to trigger the alarm, starting from now.
- */
- private void resetAlarm(long interval) {
- mAlarmManager.cancel(mPendingPollIntent);
- long now = SystemClock.elapsedRealtime();
- long next = now + interval;
- mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, next, mPendingPollIntent);
- }
-
- /**
- * Checks if the user prefers to automatically set the time.
- */
- private boolean isAutomaticTimeRequested() {
- return Settings.Global.getInt(
- mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0) != 0;
- }
-
- /** Receiver for Nitz time events */
- private BroadcastReceiver mNitzReceiver = new BroadcastReceiver() {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (DBG) Log.d(TAG, "Received " + action);
- if (TelephonyIntents.ACTION_NETWORK_SET_TIME.equals(action)) {
- mNitzTimeSetTime = SystemClock.elapsedRealtime();
- }
- }
- };
-
- /** Handler to do the network accesses on */
- private class MyHandler extends Handler {
-
- public MyHandler(Looper l) {
- super(l);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case EVENT_AUTO_TIME_CHANGED:
- case EVENT_POLL_NETWORK_TIME:
- case EVENT_NETWORK_CHANGED:
- onPollNetworkTime(msg.what);
- break;
- }
- }
- }
-
- private class NetworkTimeUpdateCallback extends NetworkCallback {
- @Override
- public void onAvailable(Network network) {
- Log.d(TAG, String.format("New default network %s; checking time.", network));
- mDefaultNetwork = network;
- // Running on mHandler so invoke directly.
- onPollNetworkTime(EVENT_NETWORK_CHANGED);
- }
-
- @Override
- public void onLost(Network network) {
- if (network.equals(mDefaultNetwork)) mDefaultNetwork = null;
- }
- }
-
- /** Observer to watch for changes to the AUTO_TIME setting */
- private static class SettingsObserver extends ContentObserver {
-
- private int mMsg;
- private Handler mHandler;
-
- SettingsObserver(Handler handler, int msg) {
- super(handler);
- mHandler = handler;
- mMsg = msg;
- }
-
- void observe(Context context) {
- ContentResolver resolver = context.getContentResolver();
- resolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.AUTO_TIME),
- false, this);
- }
-
- @Override
- public void onChange(boolean selfChange) {
- mHandler.obtainMessage(mMsg).sendToTarget();
- }
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- pw.print("PollingIntervalMs: ");
- TimeUtils.formatDuration(mPollingIntervalMs, pw);
- pw.print("\nPollingIntervalShorterMs: ");
- TimeUtils.formatDuration(mPollingIntervalShorterMs, pw);
- pw.println("\nTryAgainTimesMax: " + mTryAgainTimesMax);
- pw.print("TimeErrorThresholdMs: ");
- TimeUtils.formatDuration(mTimeErrorThresholdMs, pw);
- pw.println("\nTryAgainCounter: " + mTryAgainCounter);
- pw.println("NTP cache age: " + mTime.getCacheAge());
- pw.println("NTP cache certainty: " + mTime.getCacheCertainty());
- pw.println();
- }
+ void systemRunning();
}
diff --git a/services/core/java/com/android/server/NewNetworkTimeUpdateService.java b/services/core/java/com/android/server/NewNetworkTimeUpdateService.java
new file mode 100644
index 000000000000..d21741ad356a
--- /dev/null
+++ b/services/core/java/com/android/server/NewNetworkTimeUpdateService.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2010 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;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.Network;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.util.Log;
+import android.util.NtpTrustedTime;
+import android.util.TimeUtils;
+
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.util.DumpUtils;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+/**
+ * Monitors the network time and updates the system time if it is out of sync
+ * and there hasn't been any NITZ update from the carrier recently.
+ * If looking up the network time fails for some reason, it tries a few times with a short
+ * interval and then resets to checking on longer intervals.
+ * <p>
+ * If the user enables AUTO_TIME, it will check immediately for the network time, if NITZ wasn't
+ * available.
+ * </p>
+ */
+public class NewNetworkTimeUpdateService extends Binder implements NetworkTimeUpdateService {
+
+ private static final String TAG = "NetworkTimeUpdateService";
+ private static final boolean DBG = false;
+
+ private static final int EVENT_AUTO_TIME_CHANGED = 1;
+ private static final int EVENT_POLL_NETWORK_TIME = 2;
+ private static final int EVENT_NETWORK_CHANGED = 3;
+
+ private static final String ACTION_POLL =
+ "com.android.server.NetworkTimeUpdateService.action.POLL";
+
+ private static final int POLL_REQUEST = 0;
+
+ private static final long NOT_SET = -1;
+ private long mNitzTimeSetTime = NOT_SET;
+ private Network mDefaultNetwork = null;
+
+ private final Context mContext;
+ private final NtpTrustedTime mTime;
+ private final AlarmManager mAlarmManager;
+ private final ConnectivityManager mCM;
+ private final PendingIntent mPendingPollIntent;
+ private final PowerManager.WakeLock mWakeLock;
+
+ // NTP lookup is done on this thread and handler
+ private Handler mHandler;
+ private SettingsObserver mSettingsObserver;
+ private NetworkTimeUpdateCallback mNetworkTimeUpdateCallback;
+
+ // Normal polling frequency
+ private final long mPollingIntervalMs;
+ // Try-again polling interval, in case the network request failed
+ private final long mPollingIntervalShorterMs;
+ // Number of times to try again
+ private final int mTryAgainTimesMax;
+ // If the time difference is greater than this threshold, then update the time.
+ private final int mTimeErrorThresholdMs;
+ // Keeps track of how many quick attempts were made to fetch NTP time.
+ // During bootup, the network may not have been up yet, or it's taking time for the
+ // connection to happen.
+ private int mTryAgainCounter;
+
+ public NewNetworkTimeUpdateService(Context context) {
+ mContext = context;
+ mTime = NtpTrustedTime.getInstance(context);
+ mAlarmManager = mContext.getSystemService(AlarmManager.class);
+ mCM = mContext.getSystemService(ConnectivityManager.class);
+
+ Intent pollIntent = new Intent(ACTION_POLL, null);
+ mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0);
+
+ mPollingIntervalMs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_ntpPollingInterval);
+ mPollingIntervalShorterMs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_ntpPollingIntervalShorter);
+ mTryAgainTimesMax = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_ntpRetry);
+ mTimeErrorThresholdMs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_ntpThreshold);
+
+ mWakeLock = context.getSystemService(PowerManager.class).newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, TAG);
+ }
+
+ @Override
+ public void systemRunning() {
+ registerForTelephonyIntents();
+ registerForAlarms();
+
+ HandlerThread thread = new HandlerThread(TAG);
+ thread.start();
+ mHandler = new MyHandler(thread.getLooper());
+ mNetworkTimeUpdateCallback = new NetworkTimeUpdateCallback();
+ mCM.registerDefaultNetworkCallback(mNetworkTimeUpdateCallback, mHandler);
+
+ mSettingsObserver = new SettingsObserver(mHandler, EVENT_AUTO_TIME_CHANGED);
+ mSettingsObserver.observe(mContext);
+ }
+
+ private void registerForTelephonyIntents() {
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(TelephonyIntents.ACTION_NETWORK_SET_TIME);
+ mContext.registerReceiver(mNitzReceiver, intentFilter);
+ }
+
+ private void registerForAlarms() {
+ mContext.registerReceiver(
+ new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mHandler.obtainMessage(EVENT_POLL_NETWORK_TIME).sendToTarget();
+ }
+ }, new IntentFilter(ACTION_POLL));
+ }
+
+ private void onPollNetworkTime(int event) {
+ // If Automatic time is not set, don't bother. Similarly, if we don't
+ // have any default network, don't bother.
+ if (mDefaultNetwork == null) return;
+ mWakeLock.acquire();
+ try {
+ onPollNetworkTimeUnderWakeLock(event);
+ } finally {
+ mWakeLock.release();
+ }
+ }
+
+ private void onPollNetworkTimeUnderWakeLock(int event) {
+ // Force an NTP fix when outdated
+ if (mTime.getCacheAge() >= mPollingIntervalMs) {
+ if (DBG) Log.d(TAG, "Stale NTP fix; forcing refresh");
+ mTime.forceRefresh();
+ }
+
+ if (mTime.getCacheAge() < mPollingIntervalMs) {
+ // Obtained fresh fix; schedule next normal update
+ resetAlarm(mPollingIntervalMs);
+ if (isAutomaticTimeRequested()) {
+ updateSystemClock(event);
+ }
+
+ } else {
+ // No fresh fix; schedule retry
+ mTryAgainCounter++;
+ if (mTryAgainTimesMax < 0 || mTryAgainCounter <= mTryAgainTimesMax) {
+ resetAlarm(mPollingIntervalShorterMs);
+ } else {
+ // Try much later
+ mTryAgainCounter = 0;
+ resetAlarm(mPollingIntervalMs);
+ }
+ }
+ }
+
+ private long getNitzAge() {
+ if (mNitzTimeSetTime == NOT_SET) {
+ return Long.MAX_VALUE;
+ } else {
+ return SystemClock.elapsedRealtime() - mNitzTimeSetTime;
+ }
+ }
+
+ /**
+ * Consider updating system clock based on current NTP fix, if requested by
+ * user, significant enough delta, and we don't have a recent NITZ.
+ */
+ private void updateSystemClock(int event) {
+ final boolean forceUpdate = (event == EVENT_AUTO_TIME_CHANGED);
+ if (!forceUpdate) {
+ if (getNitzAge() < mPollingIntervalMs) {
+ if (DBG) Log.d(TAG, "Ignoring NTP update due to recent NITZ");
+ return;
+ }
+
+ final long skew = Math.abs(mTime.currentTimeMillis() - System.currentTimeMillis());
+ if (skew < mTimeErrorThresholdMs) {
+ if (DBG) Log.d(TAG, "Ignoring NTP update due to low skew");
+ return;
+ }
+ }
+
+ SystemClock.setCurrentTimeMillis(mTime.currentTimeMillis());
+ }
+
+ /**
+ * Cancel old alarm and starts a new one for the specified interval.
+ *
+ * @param interval when to trigger the alarm, starting from now.
+ */
+ private void resetAlarm(long interval) {
+ mAlarmManager.cancel(mPendingPollIntent);
+ long now = SystemClock.elapsedRealtime();
+ long next = now + interval;
+ mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, next, mPendingPollIntent);
+ }
+
+ /**
+ * Checks if the user prefers to automatically set the time.
+ */
+ private boolean isAutomaticTimeRequested() {
+ return Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0) != 0;
+ }
+
+ /** Receiver for Nitz time events */
+ private BroadcastReceiver mNitzReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (DBG) Log.d(TAG, "Received " + action);
+ if (TelephonyIntents.ACTION_NETWORK_SET_TIME.equals(action)) {
+ mNitzTimeSetTime = SystemClock.elapsedRealtime();
+ }
+ }
+ };
+
+ /** Handler to do the network accesses on */
+ private class MyHandler extends Handler {
+
+ public MyHandler(Looper l) {
+ super(l);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_AUTO_TIME_CHANGED:
+ case EVENT_POLL_NETWORK_TIME:
+ case EVENT_NETWORK_CHANGED:
+ onPollNetworkTime(msg.what);
+ break;
+ }
+ }
+ }
+
+ private class NetworkTimeUpdateCallback extends NetworkCallback {
+ @Override
+ public void onAvailable(Network network) {
+ Log.d(TAG, String.format("New default network %s; checking time.", network));
+ mDefaultNetwork = network;
+ // Running on mHandler so invoke directly.
+ onPollNetworkTime(EVENT_NETWORK_CHANGED);
+ }
+
+ @Override
+ public void onLost(Network network) {
+ if (network.equals(mDefaultNetwork)) mDefaultNetwork = null;
+ }
+ }
+
+ /** Observer to watch for changes to the AUTO_TIME setting */
+ private static class SettingsObserver extends ContentObserver {
+
+ private int mMsg;
+ private Handler mHandler;
+
+ SettingsObserver(Handler handler, int msg) {
+ super(handler);
+ mHandler = handler;
+ mMsg = msg;
+ }
+
+ void observe(Context context) {
+ ContentResolver resolver = context.getContentResolver();
+ resolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.AUTO_TIME),
+ false, this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ mHandler.obtainMessage(mMsg).sendToTarget();
+ }
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
+ pw.print("PollingIntervalMs: ");
+ TimeUtils.formatDuration(mPollingIntervalMs, pw);
+ pw.print("\nPollingIntervalShorterMs: ");
+ TimeUtils.formatDuration(mPollingIntervalShorterMs, pw);
+ pw.println("\nTryAgainTimesMax: " + mTryAgainTimesMax);
+ pw.print("TimeErrorThresholdMs: ");
+ TimeUtils.formatDuration(mTimeErrorThresholdMs, pw);
+ pw.println("\nTryAgainCounter: " + mTryAgainCounter);
+ pw.println("NTP cache age: " + mTime.getCacheAge());
+ pw.println("NTP cache certainty: " + mTime.getCacheCertainty());
+ pw.println();
+ }
+}
diff --git a/services/core/java/com/android/server/OldNetworkTimeUpdateService.java b/services/core/java/com/android/server/OldNetworkTimeUpdateService.java
new file mode 100644
index 000000000000..068b83d7732e
--- /dev/null
+++ b/services/core/java/com/android/server/OldNetworkTimeUpdateService.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2010 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;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.Network;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.util.Log;
+import android.util.NtpTrustedTime;
+import android.util.TimeUtils;
+
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.util.DumpUtils;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+/**
+ * Monitors the network time and updates the system time if it is out of sync
+ * and there hasn't been any NITZ update from the carrier recently.
+ * If looking up the network time fails for some reason, it tries a few times with a short
+ * interval and then resets to checking on longer intervals.
+ * <p>
+ * If the user enables AUTO_TIME, it will check immediately for the network time, if NITZ wasn't
+ * available.
+ * </p>
+ */
+public class OldNetworkTimeUpdateService extends Binder implements NetworkTimeUpdateService {
+
+ private static final String TAG = "NetworkTimeUpdateService";
+ private static final boolean DBG = false;
+
+ private static final int EVENT_AUTO_TIME_CHANGED = 1;
+ private static final int EVENT_POLL_NETWORK_TIME = 2;
+ private static final int EVENT_NETWORK_CHANGED = 3;
+
+ private static final String ACTION_POLL =
+ "com.android.server.NetworkTimeUpdateService.action.POLL";
+
+ private static final int POLL_REQUEST = 0;
+
+ private static final long NOT_SET = -1;
+ private long mNitzTimeSetTime = NOT_SET;
+ private Network mDefaultNetwork = null;
+
+ private final Context mContext;
+ private final NtpTrustedTime mTime;
+ private final AlarmManager mAlarmManager;
+ private final ConnectivityManager mCM;
+ private final PendingIntent mPendingPollIntent;
+ private final PowerManager.WakeLock mWakeLock;
+
+ // NTP lookup is done on this thread and handler
+ private Handler mHandler;
+ private SettingsObserver mSettingsObserver;
+ private NetworkTimeUpdateCallback mNetworkTimeUpdateCallback;
+
+ // Normal polling frequency
+ private final long mPollingIntervalMs;
+ // Try-again polling interval, in case the network request failed
+ private final long mPollingIntervalShorterMs;
+ // Number of times to try again
+ private final int mTryAgainTimesMax;
+ // If the time difference is greater than this threshold, then update the time.
+ private final int mTimeErrorThresholdMs;
+ // Keeps track of how many quick attempts were made to fetch NTP time.
+ // During bootup, the network may not have been up yet, or it's taking time for the
+ // connection to happen.
+ private int mTryAgainCounter;
+
+ public OldNetworkTimeUpdateService(Context context) {
+ mContext = context;
+ mTime = NtpTrustedTime.getInstance(context);
+ mAlarmManager = mContext.getSystemService(AlarmManager.class);
+ mCM = mContext.getSystemService(ConnectivityManager.class);
+
+ Intent pollIntent = new Intent(ACTION_POLL, null);
+ mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0);
+
+ mPollingIntervalMs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_ntpPollingInterval);
+ mPollingIntervalShorterMs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_ntpPollingIntervalShorter);
+ mTryAgainTimesMax = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_ntpRetry);
+ mTimeErrorThresholdMs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_ntpThreshold);
+
+ mWakeLock = context.getSystemService(PowerManager.class).newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, TAG);
+ }
+
+ @Override
+ public void systemRunning() {
+ registerForTelephonyIntents();
+ registerForAlarms();
+
+ HandlerThread thread = new HandlerThread(TAG);
+ thread.start();
+ mHandler = new MyHandler(thread.getLooper());
+ mNetworkTimeUpdateCallback = new NetworkTimeUpdateCallback();
+ mCM.registerDefaultNetworkCallback(mNetworkTimeUpdateCallback, mHandler);
+
+ mSettingsObserver = new SettingsObserver(mHandler, EVENT_AUTO_TIME_CHANGED);
+ mSettingsObserver.observe(mContext);
+ }
+
+ private void registerForTelephonyIntents() {
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(TelephonyIntents.ACTION_NETWORK_SET_TIME);
+ mContext.registerReceiver(mNitzReceiver, intentFilter);
+ }
+
+ private void registerForAlarms() {
+ mContext.registerReceiver(
+ new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mHandler.obtainMessage(EVENT_POLL_NETWORK_TIME).sendToTarget();
+ }
+ }, new IntentFilter(ACTION_POLL));
+ }
+
+ private void onPollNetworkTime(int event) {
+ // If Automatic time is not set, don't bother. Similarly, if we don't
+ // have any default network, don't bother.
+ if (mDefaultNetwork == null) return;
+ mWakeLock.acquire();
+ try {
+ onPollNetworkTimeUnderWakeLock(event);
+ } finally {
+ mWakeLock.release();
+ }
+ }
+
+ private void onPollNetworkTimeUnderWakeLock(int event) {
+ // Force an NTP fix when outdated
+ if (mTime.getCacheAge() >= mPollingIntervalMs) {
+ if (DBG) Log.d(TAG, "Stale NTP fix; forcing refresh");
+ mTime.forceRefresh();
+ }
+
+ if (mTime.getCacheAge() < mPollingIntervalMs) {
+ // Obtained fresh fix; schedule next normal update
+ resetAlarm(mPollingIntervalMs);
+ if (isAutomaticTimeRequested()) {
+ updateSystemClock(event);
+ }
+
+ } else {
+ // No fresh fix; schedule retry
+ mTryAgainCounter++;
+ if (mTryAgainTimesMax < 0 || mTryAgainCounter <= mTryAgainTimesMax) {
+ resetAlarm(mPollingIntervalShorterMs);
+ } else {
+ // Try much later
+ mTryAgainCounter = 0;
+ resetAlarm(mPollingIntervalMs);
+ }
+ }
+ }
+
+ private long getNitzAge() {
+ if (mNitzTimeSetTime == NOT_SET) {
+ return Long.MAX_VALUE;
+ } else {
+ return SystemClock.elapsedRealtime() - mNitzTimeSetTime;
+ }
+ }
+
+ /**
+ * Consider updating system clock based on current NTP fix, if requested by
+ * user, significant enough delta, and we don't have a recent NITZ.
+ */
+ private void updateSystemClock(int event) {
+ final boolean forceUpdate = (event == EVENT_AUTO_TIME_CHANGED);
+ if (!forceUpdate) {
+ if (getNitzAge() < mPollingIntervalMs) {
+ if (DBG) Log.d(TAG, "Ignoring NTP update due to recent NITZ");
+ return;
+ }
+
+ final long skew = Math.abs(mTime.currentTimeMillis() - System.currentTimeMillis());
+ if (skew < mTimeErrorThresholdMs) {
+ if (DBG) Log.d(TAG, "Ignoring NTP update due to low skew");
+ return;
+ }
+ }
+
+ SystemClock.setCurrentTimeMillis(mTime.currentTimeMillis());
+ }
+
+ /**
+ * Cancel old alarm and starts a new one for the specified interval.
+ *
+ * @param interval when to trigger the alarm, starting from now.
+ */
+ private void resetAlarm(long interval) {
+ mAlarmManager.cancel(mPendingPollIntent);
+ long now = SystemClock.elapsedRealtime();
+ long next = now + interval;
+ mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, next, mPendingPollIntent);
+ }
+
+ /**
+ * Checks if the user prefers to automatically set the time.
+ */
+ private boolean isAutomaticTimeRequested() {
+ return Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0) != 0;
+ }
+
+ /** Receiver for Nitz time events */
+ private BroadcastReceiver mNitzReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (DBG) Log.d(TAG, "Received " + action);
+ if (TelephonyIntents.ACTION_NETWORK_SET_TIME.equals(action)) {
+ mNitzTimeSetTime = SystemClock.elapsedRealtime();
+ }
+ }
+ };
+
+ /** Handler to do the network accesses on */
+ private class MyHandler extends Handler {
+
+ public MyHandler(Looper l) {
+ super(l);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_AUTO_TIME_CHANGED:
+ case EVENT_POLL_NETWORK_TIME:
+ case EVENT_NETWORK_CHANGED:
+ onPollNetworkTime(msg.what);
+ break;
+ }
+ }
+ }
+
+ private class NetworkTimeUpdateCallback extends NetworkCallback {
+ @Override
+ public void onAvailable(Network network) {
+ Log.d(TAG, String.format("New default network %s; checking time.", network));
+ mDefaultNetwork = network;
+ // Running on mHandler so invoke directly.
+ onPollNetworkTime(EVENT_NETWORK_CHANGED);
+ }
+
+ @Override
+ public void onLost(Network network) {
+ if (network.equals(mDefaultNetwork)) mDefaultNetwork = null;
+ }
+ }
+
+ /** Observer to watch for changes to the AUTO_TIME setting */
+ private static class SettingsObserver extends ContentObserver {
+
+ private int mMsg;
+ private Handler mHandler;
+
+ SettingsObserver(Handler handler, int msg) {
+ super(handler);
+ mHandler = handler;
+ mMsg = msg;
+ }
+
+ void observe(Context context) {
+ ContentResolver resolver = context.getContentResolver();
+ resolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.AUTO_TIME),
+ false, this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ mHandler.obtainMessage(mMsg).sendToTarget();
+ }
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
+ pw.print("PollingIntervalMs: ");
+ TimeUtils.formatDuration(mPollingIntervalMs, pw);
+ pw.print("\nPollingIntervalShorterMs: ");
+ TimeUtils.formatDuration(mPollingIntervalShorterMs, pw);
+ pw.println("\nTryAgainTimesMax: " + mTryAgainTimesMax);
+ pw.print("TimeErrorThresholdMs: ");
+ TimeUtils.formatDuration(mTimeErrorThresholdMs, pw);
+ pw.println("\nTryAgainCounter: " + mTryAgainCounter);
+ pw.println("NTP cache age: " + mTime.getCacheAge());
+ pw.println("NTP cache certainty: " + mTime.getCacheCertainty());
+ pw.println();
+ }
+}
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index 5a25f48c38e3..cec2028dddae 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -16,8 +16,16 @@
package com.android.server;
+import static android.app.ActivityManager.UID_OBSERVER_ACTIVE;
+import static android.app.ActivityManager.UID_OBSERVER_GONE;
+
+import android.annotation.IntDef;
import android.annotation.Nullable;
+import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
+import android.app.IActivityManager;
+import android.app.IUidObserver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -32,18 +40,21 @@ import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.MediaStore;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
-import android.system.StructStat;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.ResolverActivity;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
+import com.android.internal.util.function.pooled.PooledLambda;
import dalvik.system.DexFile;
import dalvik.system.VMRuntime;
@@ -53,12 +64,12 @@ import java.io.Closeable;
import java.io.InputStream;
import java.io.DataInputStream;
import java.io.IOException;
-import java.io.EOFException;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.zip.ZipFile;
-import java.util.zip.ZipException;
import java.util.zip.ZipEntry;
/**
@@ -70,16 +81,50 @@ import java.util.zip.ZipEntry;
public final class PinnerService extends SystemService {
private static final boolean DEBUG = false;
private static final String TAG = "PinnerService";
- private static final int MAX_CAMERA_PIN_SIZE = 80 * (1 << 20); //80MB max
+
private static final String PIN_META_FILENAME = "pinlist.meta";
private static final int PAGE_SIZE = (int) Os.sysconf(OsConstants._SC_PAGESIZE);
+ private static final int MATCH_FLAGS = PackageManager.MATCH_DEFAULT_ONLY
+ | PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+
+ private static final int KEY_CAMERA = 0;
+ private static final int KEY_HOME = 1;
+
+ private static final int MAX_CAMERA_PIN_SIZE = 80 * (1 << 20); // 80MB max for camera app.
+ private static final int MAX_HOME_PIN_SIZE = 6 * (1 << 20); // 6MB max for home app.
+
+ @IntDef({KEY_CAMERA, KEY_HOME})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AppKey {}
private final Context mContext;
- private final boolean mShouldPinCamera;
+ private final ActivityManagerInternal mAmInternal;
+ private final IActivityManager mAm;
+
+ /** The list of the statically pinned files. */
+ @GuardedBy("this")
+ private final ArrayList<PinnedFile> mPinnedFiles = new ArrayList<>();
+
+ /** The list of the pinned apps. This is a map from {@link AppKey} to a pinned app. */
+ @GuardedBy("this")
+ private final ArrayMap<Integer, PinnedApp> mPinnedApps = new ArrayMap<>();
+
+ /**
+ * The list of the pinned apps that need to be repinned as soon as the all processes of a given
+ * uid are no longer active. Note that with background dex opt, the new dex/vdex files are only
+ * loaded into the processes once it restarts. So in case background dex opt recompiled these
+ * files, we still need to keep the old ones pinned until the processes restart.
+ * <p>
+ * This is a map from uid to {@link AppKey}
+ */
+ @GuardedBy("this")
+ private final ArrayMap<Integer, Integer> mPendingRepin = new ArrayMap<>();
- /* These lists protected by PinnerService monitor lock */
- private final ArrayList<PinnedFile> mPinnedFiles = new ArrayList<PinnedFile>();
- private final ArrayList<PinnedFile> mPinnedCameraFiles = new ArrayList<PinnedFile>();
+ /**
+ * A set of {@link AppKey} that are configured to be pinned.
+ */
+ private final ArraySet<Integer> mPinKeys = new ArraySet<>();
private BinderService mBinderService;
private PinnerHandler mPinnerHandler = null;
@@ -87,13 +132,13 @@ public final class PinnerService extends SystemService {
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- // If this user's camera app has been updated, update pinned files accordingly.
- if (intent.getAction() == Intent.ACTION_PACKAGE_REPLACED) {
+ // If an app has updated, update pinned files accordingly.
+ if (Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) {
Uri packageUri = intent.getData();
String packageName = packageUri.getSchemeSpecificPart();
ArraySet<String> updatedPackages = new ArraySet<>();
updatedPackages.add(packageName);
- update(updatedPackages);
+ update(updatedPackages, true /* force */);
}
}
};
@@ -102,14 +147,26 @@ public final class PinnerService extends SystemService {
super(context);
mContext = context;
- mShouldPinCamera = context.getResources().getBoolean(
+ boolean shouldPinCamera = context.getResources().getBoolean(
com.android.internal.R.bool.config_pinnerCameraApp);
+ boolean shouldPinHome = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_pinnerHomeApp);
+ if (shouldPinCamera) {
+ mPinKeys.add(KEY_CAMERA);
+ }
+ if (shouldPinHome) {
+ mPinKeys.add(KEY_HOME);
+ }
mPinnerHandler = new PinnerHandler(BackgroundThread.get().getLooper());
+ mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
+ mAm = ActivityManager.getService();
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
filter.addDataScheme("package");
mContext.registerReceiver(mBroadcastReceiver, filter);
+ registerUidListener();
}
@Override
@@ -122,32 +179,39 @@ public final class PinnerService extends SystemService {
publishLocalService(PinnerService.class, this);
mPinnerHandler.obtainMessage(PinnerHandler.PIN_ONSTART_MSG).sendToTarget();
- mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, UserHandle.USER_SYSTEM, 0)
- .sendToTarget();
+ sendPinAppsMessage(UserHandle.USER_SYSTEM);
}
/**
- * Pin camera on user switch.
- * If more than one user is using the device
- * each user may set a different preference for the camera app.
- * Make sure that user's preference is pinned into memory.
+ * Repin apps on user switch.
+ * <p>
+ * If more than one user is using the device each user may set a different preference for the
+ * individual apps. Make sure that user's preference is pinned into memory.
*/
@Override
public void onSwitchUser(int userHandle) {
- mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, userHandle, 0).sendToTarget();
+ sendPinAppsMessage(userHandle);
+ }
+
+ @Override
+ public void onUnlockUser(int userHandle) {
+ sendPinAppsMessage(userHandle);
}
/**
* Update the currently pinned files.
- * Specifically, this only updates camera pinning.
+ * Specifically, this only updates pinning for the apps that need to be pinned.
* The other files pinned in onStart will not need to be updated.
*/
- public void update(ArraySet<String> updatedPackages) {
- ApplicationInfo cameraInfo = getCameraInfo(UserHandle.USER_SYSTEM);
- if (cameraInfo != null && updatedPackages.contains(cameraInfo.packageName)) {
- Slog.i(TAG, "Updating pinned files.");
- mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, UserHandle.USER_SYSTEM, 0)
- .sendToTarget();
+ public void update(ArraySet<String> updatedPackages, boolean force) {
+ int currentUser = ActivityManager.getCurrentUser();
+ for (int i = mPinKeys.size() - 1; i >= 0; i--) {
+ int key = mPinKeys.valueAt(i);
+ ApplicationInfo info = getInfoForKey(key, currentUser);
+ if (info != null && updatedPackages.contains(info.packageName)) {
+ Slog.i(TAG, "Updating pinned files for " + info.packageName + " force=" + force);
+ sendPinAppMessage(key, currentUser, force);
+ }
}
}
@@ -174,25 +238,80 @@ public final class PinnerService extends SystemService {
}
}
- /**
- * Handler for camera pinning message
- */
- private void handlePinCamera(int userHandle) {
- if (!mShouldPinCamera) return;
- if (!pinCamera(userHandle)) {
- if (DEBUG) {
- Slog.v(TAG, "Failed to pin camera.");
+ private void registerUidListener() {
+ try {
+ mAm.registerUidObserver(new IUidObserver.Stub() {
+ @Override
+ public void onUidGone(int uid, boolean disabled) throws RemoteException {
+ mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
+ PinnerService::handleUidGone, PinnerService.this, uid));
+ }
+
+ @Override
+ public void onUidActive(int uid) throws RemoteException {
+ mPinnerHandler.sendMessage(PooledLambda.obtainMessage(
+ PinnerService::handleUidActive, PinnerService.this, uid));
+ }
+
+ @Override
+ public void onUidIdle(int uid, boolean disabled) throws RemoteException {
+ }
+
+ @Override
+ public void onUidStateChanged(int uid, int procState, long procStateSeq)
+ throws RemoteException {
+ }
+
+ @Override
+ public void onUidCachedChanged(int uid, boolean cached) throws RemoteException {
+ }
+ }, UID_OBSERVER_GONE | UID_OBSERVER_ACTIVE, 0, "system");
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to register uid observer", e);
+ }
+ }
+
+ private void handleUidGone(int uid) {
+ updateActiveState(uid, false /* active */);
+ int key;
+ synchronized (this) {
+
+ // In case we have a pending repin, repin now. See mPendingRepin for more information.
+ key = mPendingRepin.getOrDefault(uid, -1);
+ if (key == -1) {
+ return;
+ }
+ mPendingRepin.remove(uid);
+ }
+ pinApp(key, ActivityManager.getCurrentUser(), false /* force */);
+ }
+
+ private void handleUidActive(int uid) {
+ updateActiveState(uid, true /* active */);
+ }
+
+ private void updateActiveState(int uid, boolean active) {
+ synchronized (this) {
+ for (int i = mPinnedApps.size() - 1; i >= 0; i--) {
+ PinnedApp app = mPinnedApps.valueAt(i);
+ if (app.uid == uid) {
+ app.active = active;
+ }
}
}
}
- private void unpinCameraApp() {
- ArrayList<PinnedFile> pinnedCameraFiles;
+ private void unpinApp(@AppKey int key) {
+ ArrayList<PinnedFile> pinnedAppFiles;
synchronized (this) {
- pinnedCameraFiles = new ArrayList<>(mPinnedCameraFiles);
- mPinnedCameraFiles.clear();
+ PinnedApp app = mPinnedApps.get(key);
+ if (app == null) {
+ return;
+ }
+ mPinnedApps.remove(key);
+ pinnedAppFiles = new ArrayList<>(app.mFiles);
}
- for (PinnedFile pinnedFile : pinnedCameraFiles) {
+ for (PinnedFile pinnedFile : pinnedAppFiles) {
pinnedFile.close();
}
}
@@ -206,64 +325,167 @@ public final class PinnerService extends SystemService {
// use INTENT_ACTION_STILL_IMAGE_CAMERA instead of _SECURE. On a
// device without a fbe enabled, the _SECURE intent will never get set.
Intent cameraIntent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
- PackageManager pm = mContext.getPackageManager();
- ResolveInfo cameraResolveInfo = pm.resolveActivityAsUser(cameraIntent,
- PackageManager.MATCH_DEFAULT_ONLY | PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
- userHandle);
- if (cameraResolveInfo == null ) {
- //this is not necessarily an error
- if (DEBUG) {
- Slog.v(TAG, "Unable to resolve camera intent");
- }
+ return getApplicationInfoForIntent(cameraIntent, userHandle);
+ }
+
+ private ApplicationInfo getHomeInfo(int userHandle) {
+ Intent intent = mAmInternal.getHomeIntent();
+ return getApplicationInfoForIntent(intent, userHandle);
+ }
+
+ private ApplicationInfo getApplicationInfoForIntent(Intent intent, int userHandle) {
+ if (intent == null) {
+ return null;
+ }
+ ResolveInfo info = mContext.getPackageManager().resolveActivityAsUser(intent,
+ MATCH_FLAGS, userHandle);
+ if (info == null) {
+ return null;
+ }
+ if (isResolverActivity(info.activityInfo)) {
return null;
}
+ return info.activityInfo.applicationInfo;
+ }
- if (isResolverActivity(cameraResolveInfo.activityInfo))
- {
- if (DEBUG) {
- Slog.v(TAG, "cameraIntent returned resolverActivity");
+ private void sendPinAppsMessage(int userHandle) {
+ mPinnerHandler.sendMessage(PooledLambda.obtainMessage(PinnerService::pinApps, this,
+ userHandle));
+ }
+
+ private void pinApps(int userHandle) {
+ for (int i = mPinKeys.size() - 1; i >= 0; i--) {
+ int key = mPinKeys.valueAt(i);
+ pinApp(key, userHandle, true /* force */);
+ }
+ }
+
+ /**
+ * @see #pinApp(int, int, boolean)
+ */
+ private void sendPinAppMessage(int key, int userHandle, boolean force) {
+ mPinnerHandler.sendMessage(PooledLambda.obtainMessage(PinnerService::pinApp, this,
+ key, userHandle, force));
+ }
+
+ /**
+ * Pins an app of a specific type {@code key}.
+ *
+ * @param force If false, this will not repin the app if it's currently active. See
+ * {@link #mPendingRepin}.
+ */
+ private void pinApp(int key, int userHandle, boolean force) {
+ int uid = getUidForKey(key);
+
+ // In case the app is currently active, don't repin until next process restart. See
+ // mPendingRepin for more information.
+ if (!force && uid != -1) {
+ synchronized (this) {
+ mPendingRepin.put(uid, key);
}
- return null;
+ return;
}
+ unpinApp(key);
+ ApplicationInfo info = getInfoForKey(key, userHandle);
+ if (info != null) {
+ pinApp(key, info);
+ }
+ }
+
+ /**
+ * Checks whether the pinned package with {@code key} is active or not.
- return cameraResolveInfo.activityInfo.applicationInfo;
+ * @return The uid of the pinned app, or {@code -1} otherwise.
+ */
+ private int getUidForKey(@AppKey int key) {
+ synchronized (this) {
+ PinnedApp existing = mPinnedApps.get(key);
+ return existing != null && existing.active
+ ? existing.uid
+ : -1;
+ }
}
/**
- * If the camera app is already pinned, unpin and repin it.
+ * Retrieves the current application info for the given app type.
+ *
+ * @param key The app type to retrieve the info for.
+ * @param userHandle The user id of the current user.
*/
- private boolean pinCamera(int userHandle){
- ApplicationInfo cameraInfo = getCameraInfo(userHandle);
- if (cameraInfo == null) {
- return false;
- }
-
- //unpin after checking that the camera intent has resolved
- //this prevents us from thrashing when switching users with
- //FBE enabled, because the intent won't resolve until the unlock
- unpinCameraApp();
-
- //pin APK
- String camAPK = cameraInfo.sourceDir;
- PinnedFile pf = pinFile(camAPK,
- MAX_CAMERA_PIN_SIZE,
- /*attemptPinIntrospection=*/true);
+ private @Nullable ApplicationInfo getInfoForKey(@AppKey int key, int userHandle) {
+ switch (key) {
+ case KEY_CAMERA:
+ return getCameraInfo(userHandle);
+ case KEY_HOME:
+ return getHomeInfo(userHandle);
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * @return The app type name for {@code key}.
+ */
+ private String getNameForKey(@AppKey int key) {
+ switch (key) {
+ case KEY_CAMERA:
+ return "Camera";
+ case KEY_HOME:
+ return "Home";
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * @return The maximum amount of bytes to be pinned for an app of type {@code key}.
+ */
+ private int getSizeLimitForKey(@AppKey int key) {
+ switch (key) {
+ case KEY_CAMERA:
+ return MAX_CAMERA_PIN_SIZE;
+ case KEY_HOME:
+ return MAX_HOME_PIN_SIZE;
+ default:
+ return 0;
+ }
+ }
+
+ /**
+ * Pins an application.
+ *
+ * @param key The key of the app to pin.
+ * @param appInfo The corresponding app info.
+ */
+ private void pinApp(@AppKey int key, @Nullable ApplicationInfo appInfo) {
+ if (appInfo == null) {
+ return;
+ }
+
+ PinnedApp pinnedApp = new PinnedApp(appInfo);
+ synchronized (this) {
+ mPinnedApps.put(key, pinnedApp);
+ }
+
+ // pin APK
+ int pinSizeLimit = getSizeLimitForKey(key);
+ String apk = appInfo.sourceDir;
+ PinnedFile pf = pinFile(apk, pinSizeLimit, /*attemptPinIntrospection=*/true);
if (pf == null) {
- Slog.e(TAG, "Failed to pin " + camAPK);
- return false;
+ Slog.e(TAG, "Failed to pin " + apk);
+ return;
}
if (DEBUG) {
Slog.i(TAG, "Pinned " + pf.fileName);
}
synchronized (this) {
- mPinnedCameraFiles.add(pf);
+ pinnedApp.mFiles.add(pf);
}
// determine the ABI from either ApplicationInfo or Build
String arch = "arm";
- if (cameraInfo.primaryCpuAbi != null) {
- if (VMRuntime.is64BitAbi(cameraInfo.primaryCpuAbi)) {
+ if (appInfo.primaryCpuAbi != null) {
+ if (VMRuntime.is64BitAbi(appInfo.primaryCpuAbi)) {
arch = arch + "64";
}
} else {
@@ -273,32 +495,29 @@ public final class PinnerService extends SystemService {
}
// get the path to the odex or oat file
- String baseCodePath = cameraInfo.getBaseCodePath();
+ String baseCodePath = appInfo.getBaseCodePath();
String[] files = null;
try {
files = DexFile.getDexFileOutputPaths(baseCodePath, arch);
} catch (IOException ioe) {}
if (files == null) {
- return true;
+ return;
}
//not pinning the oat/odex is not a fatal error
for (String file : files) {
- pf = pinFile(file, MAX_CAMERA_PIN_SIZE, /*attemptPinIntrospection=*/false);
+ pf = pinFile(file, pinSizeLimit, /*attemptPinIntrospection=*/false);
if (pf != null) {
synchronized (this) {
- mPinnedCameraFiles.add(pf);
+ pinnedApp.mFiles.add(pf);
}
if (DEBUG) {
Slog.i(TAG, "Pinned " + pf.fileName);
}
}
}
-
- return true;
}
-
/** mlock length bytes of fileToPin in memory
*
* If attemptPinIntrospection is true, then treat the file to pin as a zip file and
@@ -581,24 +800,38 @@ public final class PinnerService extends SystemService {
}
}
- private synchronized ArrayList<PinnedFile> snapshotPinnedFiles() {
- int nrPinnedFiles = mPinnedFiles.size() + mPinnedCameraFiles.size();
- ArrayList<PinnedFile> pinnedFiles = new ArrayList<>(nrPinnedFiles);
- pinnedFiles.addAll(mPinnedFiles);
- pinnedFiles.addAll(mPinnedCameraFiles);
- return pinnedFiles;
- }
-
private final class BinderService extends Binder {
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- long totalSize = 0;
- for (PinnedFile pinnedFile : snapshotPinnedFiles()) {
- pw.format("%s %s\n", pinnedFile.fileName, pinnedFile.bytesPinned);
- totalSize += pinnedFile.bytesPinned;
+ synchronized (PinnerService.this) {
+ long totalSize = 0;
+ for (PinnedFile pinnedFile : mPinnedFiles) {
+ pw.format("%s %s\n", pinnedFile.fileName, pinnedFile.bytesPinned);
+ totalSize += pinnedFile.bytesPinned;
+ }
+ pw.println();
+ for (int key : mPinnedApps.keySet()) {
+ PinnedApp app = mPinnedApps.get(key);
+ pw.print(getNameForKey(key));
+ pw.print(" uid="); pw.print(app.uid);
+ pw.print(" active="); pw.print(app.active);
+ pw.println();
+ for (PinnedFile pf : mPinnedApps.get(key).mFiles) {
+ pw.print(" "); pw.format("%s %s\n", pf.fileName, pf.bytesPinned);
+ totalSize += pf.bytesPinned;
+ }
+ }
+ pw.format("Total size: %s\n", totalSize);
+ pw.println();
+ if (!mPendingRepin.isEmpty()) {
+ pw.print("Pending repin: ");
+ for (int key : mPendingRepin.values()) {
+ pw.print(getNameForKey(key)); pw.print(' ');
+ }
+ pw.println();
+ }
}
- pw.format("Total size: %s\n", totalSize);
}
}
@@ -634,8 +867,30 @@ public final class PinnerService extends SystemService {
int length;
}
+ /**
+ * Represents an app that was pinned.
+ */
+ private final class PinnedApp {
+
+ /**
+ * The uid of the package being pinned. This stays constant while the package stays
+ * installed.
+ */
+ final int uid;
+
+ /** Whether it is currently active, i.e. there is a running process from that package. */
+ boolean active;
+
+ /** List of pinned files. */
+ final ArrayList<PinnedFile> mFiles = new ArrayList<>();
+
+ private PinnedApp(ApplicationInfo appInfo) {
+ uid = appInfo.uid;
+ active = mAmInternal.isUidActive(uid);
+ }
+ }
+
final class PinnerHandler extends Handler {
- static final int PIN_CAMERA_MSG = 4000;
static final int PIN_ONSTART_MSG = 4001;
public PinnerHandler(Looper looper) {
@@ -645,13 +900,6 @@ public final class PinnerService extends SystemService {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
-
- case PIN_CAMERA_MSG:
- {
- handlePinCamera(msg.arg1);
- }
- break;
-
case PIN_ONSTART_MSG:
{
handlePinOnStart();
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 7a8a70907bf6..838fde0623d3 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -24,22 +24,18 @@ import static android.os.storage.OnObbStateChangeListener.ERROR_NOT_MOUNTED;
import static android.os.storage.OnObbStateChangeListener.ERROR_PERMISSION_DENIED;
import static android.os.storage.OnObbStateChangeListener.MOUNTED;
import static android.os.storage.OnObbStateChangeListener.UNMOUNTED;
-
import static com.android.internal.util.XmlUtils.readIntAttribute;
import static com.android.internal.util.XmlUtils.readLongAttribute;
import static com.android.internal.util.XmlUtils.readStringAttribute;
import static com.android.internal.util.XmlUtils.writeIntAttribute;
import static com.android.internal.util.XmlUtils.writeLongAttribute;
import static com.android.internal.util.XmlUtils.writeStringAttribute;
-
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
import android.Manifest;
import android.annotation.Nullable;
import android.app.ActivityManager;
-import android.app.ActivityManagerInternal;
-import android.app.ActivityManagerInternal.ScreenObserver;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.KeyguardManager;
@@ -125,11 +121,10 @@ import com.android.internal.util.Preconditions;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.pm.PackageManagerService;
import com.android.server.storage.AppFuseBridge;
+import com.android.server.wm.ActivityTaskManagerInternal;
+import com.android.server.wm.ActivityTaskManagerInternal.ScreenObserver;
import com.android.internal.widget.ILockSettings;
-import libcore.io.IoUtils;
-import libcore.util.EmptyArray;
-
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -164,6 +159,9 @@ import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
+import libcore.io.IoUtils;
+import libcore.util.EmptyArray;
+
/**
* Service responsible for various storage media. Connects to {@code vold} to
* watch for and manage dynamically added storage, such as SD cards and USB mass
@@ -221,8 +219,12 @@ class StorageManagerService extends IStorageManager.Stub
private static final boolean DEBUG_EVENTS = false;
private static final boolean DEBUG_OBB = false;
- // Disable this since it messes up long-running cryptfs operations.
- private static final boolean WATCHDOG_ENABLE = false;
+ /**
+ * We now talk to vold over Binder, and it has its own internal lock to
+ * serialize certain calls. All long-running operations have been migrated
+ * to be async with callbacks, so we want watchdog to fire if vold wedges.
+ */
+ private static final boolean WATCHDOG_ENABLE = true;
/**
* Our goal is for all Android devices to be usable as development devices,
@@ -1508,7 +1510,7 @@ class StorageManagerService extends IStorageManager.Stub
}
private void systemReady() {
- LocalServices.getService(ActivityManagerInternal.class)
+ LocalServices.getService(ActivityTaskManagerInternal.class)
.registerScreenObserver(this);
mSystemReady = true;
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 607db4efb63e..ad9fa40e0ab8 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -1588,10 +1588,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
// Wakeup apps for the (SUBSCRIPTION_)PHONE_STATE broadcast.
intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
+ // Create a version of the intent with the number always populated.
Intent intentWithPhoneNumber = new Intent(intent);
- if (!TextUtils.isEmpty(incomingNumber)) {
- intentWithPhoneNumber.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, incomingNumber);
- }
+ intentWithPhoneNumber.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, incomingNumber);
+
// Send broadcast twice, once for apps that have PRIVILEGED permission and once for those
// that have the runtime one
mContext.sendBroadcastAsUser(intentWithPhoneNumber, UserHandle.ALL,
diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java
index f24d8cd0d3b5..c043e18fe5d4 100644
--- a/services/core/java/com/android/server/TextServicesManagerService.java
+++ b/services/core/java/com/android/server/TextServicesManagerService.java
@@ -57,20 +57,20 @@ import android.service.textservice.SpellCheckerService;
import android.text.TextUtils;
import android.util.Slog;
import android.util.SparseArray;
-import android.view.inputmethod.InputMethodManager;
-import android.view.inputmethod.InputMethodSubtype;
import android.view.textservice.SpellCheckerInfo;
import android.view.textservice.SpellCheckerSubtype;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
import java.util.function.Predicate;
public class TextServicesManagerService extends ITextServicesManager.Stub {
@@ -251,7 +251,6 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
for (int j = 0; j < numOnGoingSessionRequests; j++) {
final SessionRequest req = grp.mOnGoingSessionRequests.get(j);
pw.println(" " + "On going Request #" + j + ":");
- ++j;
pw.println(" " + "mTsListener=" + req.mTsListener);
pw.println(" " + "mScListener=" + req.mScListener);
pw.println(
@@ -510,7 +509,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
// TODO: Save SpellCheckerSubtype by supported languages by looking at "locale".
@Override
public SpellCheckerSubtype getCurrentSpellCheckerSubtype(
- String locale, boolean allowImplicitlySelectedSubtype) {
+ boolean allowImplicitlySelectedSubtype) {
final int subtypeHashCode;
final SpellCheckerInfo sci;
final Locale systemLocale;
@@ -538,53 +537,39 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
&& !allowImplicitlySelectedSubtype) {
return null;
}
- String candidateLocale = null;
- if (subtypeHashCode == 0) {
- // Spell checker language settings == "auto"
- final InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
- if (imm != null) {
- final InputMethodSubtype currentInputMethodSubtype =
- imm.getCurrentInputMethodSubtype();
- if (currentInputMethodSubtype != null) {
- final String localeString = currentInputMethodSubtype.getLocale();
- if (!TextUtils.isEmpty(localeString)) {
- // 1. Use keyboard locale if available in the spell checker
- candidateLocale = localeString;
- }
+
+ final int numSubtypes = sci.getSubtypeCount();
+ if (subtypeHashCode != 0) {
+ // Use the user specified spell checker subtype
+ for (int i = 0; i < numSubtypes; ++i) {
+ final SpellCheckerSubtype scs = sci.getSubtypeAt(i);
+ if (scs.hashCode() == subtypeHashCode) {
+ return scs;
}
}
- if (candidateLocale == null) {
- // 2. Use System locale if available in the spell checker
- candidateLocale = systemLocale.toString();
- }
+ return null;
}
- SpellCheckerSubtype candidate = null;
+
+ // subtypeHashCode == 0 means spell checker language settings is "auto"
+
+ if (systemLocale == null) {
+ return null;
+ }
+ SpellCheckerSubtype firstLanguageMatchingSubtype = null;
for (int i = 0; i < sci.getSubtypeCount(); ++i) {
final SpellCheckerSubtype scs = sci.getSubtypeAt(i);
- if (subtypeHashCode == 0) {
- final String scsLocale = scs.getLocale();
- if (candidateLocale.equals(scsLocale)) {
- return scs;
- } else if (candidate == null) {
- if (candidateLocale.length() >= 2 && scsLocale.length() >= 2
- && candidateLocale.startsWith(scsLocale)) {
- // Fall back to the applicable language
- candidate = scs;
- }
- }
- } else if (scs.hashCode() == subtypeHashCode) {
- if (DBG) {
- Slog.w(TAG, "Return subtype " + scs.hashCode() + ", input= " + locale
- + ", " + scs.getLocale());
- }
- // 3. Use the user specified spell check language
+ final Locale scsLocale = scs.getLocaleObject();
+ if (Objects.equals(scsLocale, systemLocale)) {
+ // Exact match wins.
return scs;
}
+ if (firstLanguageMatchingSubtype == null && scsLocale != null
+ && TextUtils.equals(systemLocale.getLanguage(), scsLocale.getLanguage())) {
+ // Remember as a fall back candidate
+ firstLanguageMatchingSubtype = scs;
+ }
}
- // 4. Fall back to the applicable language and return it if not null
- // 5. Simply just return it even if it's null which means we could find no suitable
- // spell check languages
- return candidate;
+ return firstLanguageMatchingSubtype;
}
@Override
@@ -1040,19 +1025,46 @@ public class TextServicesManagerService extends ITextServicesManager.Stub {
private static final class ISpellCheckerServiceCallbackBinder
extends ISpellCheckerServiceCallback.Stub {
@NonNull
- private final SpellCheckerBindGroup mBindGroup;
- @NonNull
- private final SessionRequest mRequest;
+ private final Object mCallbackLock = new Object();
- ISpellCheckerServiceCallbackBinder(@NonNull final SpellCheckerBindGroup bindGroup,
- @NonNull final SessionRequest request) {
- mBindGroup = bindGroup;
- mRequest = request;
+ @GuardedBy("mCallbackLock")
+ @Nullable
+ private WeakReference<SpellCheckerBindGroup> mBindGroup;
+
+ /**
+ * Original {@link SessionRequest} that is associated with this callback.
+ *
+ * <p>Note that {@link SpellCheckerBindGroup#mOnGoingSessionRequests} guarantees that this
+ * {@link SessionRequest} object is kept alive until the request is canceled.</p>
+ */
+ @GuardedBy("mCallbackLock")
+ @Nullable
+ private WeakReference<SessionRequest> mRequest;
+
+ ISpellCheckerServiceCallbackBinder(@NonNull SpellCheckerBindGroup bindGroup,
+ @NonNull SessionRequest request) {
+ synchronized (mCallbackLock) {
+ mBindGroup = new WeakReference<>(bindGroup);
+ mRequest = new WeakReference<>(request);
+ }
}
@Override
public void onSessionCreated(@Nullable ISpellCheckerSession newSession) {
- mBindGroup.onSessionCreated(newSession, mRequest);
+ final SpellCheckerBindGroup group;
+ final SessionRequest request;
+ synchronized (mCallbackLock) {
+ if (mBindGroup == null || mRequest == null) {
+ return;
+ }
+ group = mBindGroup.get();
+ request = mRequest.get();
+ mBindGroup = null;
+ mRequest = null;
+ }
+ if (group != null && request != null) {
+ group.onSessionCreated(newSession, request);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 6b5366a39a43..cb03255923cf 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -19,6 +19,7 @@ package com.android.server;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.IUiModeManager;
import android.app.Notification;
import android.app.NotificationManager;
@@ -81,6 +82,7 @@ final class UiModeManagerService extends SystemService {
private boolean mCarModeEnabled = false;
private boolean mCharging = false;
+ private boolean mPowerSave = false;
private int mDefaultUiModeType;
private boolean mCarModeKeepsScreenOn;
private boolean mDeskModeKeepsScreenOn;
@@ -159,7 +161,14 @@ final class UiModeManagerService extends SystemService {
private final BroadcastReceiver mBatteryReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- mCharging = (intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0);
+ switch (intent.getAction()) {
+ case Intent.ACTION_BATTERY_CHANGED:
+ mCharging = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
+ break;
+ case PowerManager.ACTION_POWER_SAVE_MODE_CHANGING:
+ mPowerSave = intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false);
+ break;
+ }
synchronized (mLock) {
if (mSystemReady) {
updateLocked(0, 0);
@@ -202,8 +211,9 @@ final class UiModeManagerService extends SystemService {
context.registerReceiver(mDockModeReceiver,
new IntentFilter(Intent.ACTION_DOCK_EVENT));
- context.registerReceiver(mBatteryReceiver,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+ batteryFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
+ context.registerReceiver(mBatteryReceiver, batteryFilter);
mConfiguration.setToDefaults();
@@ -456,6 +466,11 @@ final class UiModeManagerService extends SystemService {
uiMode |= mNightMode << 4;
}
+ if (mPowerSave && !mNightModeLocked) {
+ uiMode &= ~Configuration.UI_MODE_NIGHT_NO;
+ uiMode |= Configuration.UI_MODE_NIGHT_YES;
+ }
+
if (LOG) {
Slog.d(TAG,
"updateConfigurationLocked: mDockState=" + mDockState
@@ -475,7 +490,7 @@ final class UiModeManagerService extends SystemService {
mSetUiMode = mConfiguration.uiMode;
try {
- ActivityManager.getService().updateConfiguration(mConfiguration);
+ ActivityTaskManager.getService().updateConfiguration(mConfiguration);
} catch (RemoteException e) {
Slog.w(TAG, "Failure communicating with activity manager", e);
}
@@ -637,7 +652,7 @@ final class UiModeManagerService extends SystemService {
Intent homeIntent = buildHomeIntent(category);
if (Sandman.shouldStartDockApp(getContext(), homeIntent)) {
try {
- int result = ActivityManager.getService().startActivityWithConfig(
+ int result = ActivityTaskManager.getService().startActivityWithConfig(
null, null, homeIntent, null, null, null, 0, 0,
mConfiguration, null, UserHandle.USER_CURRENT);
if (ActivityManager.isStartResultSuccessful(result)) {
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index 5c9b61096ef0..73e27e9b8e8f 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -21,6 +21,7 @@ import android.os.Binder;
import android.os.Build;
import android.os.RemoteException;
import android.system.ErrnoException;
+import android.system.Os;
import android.system.OsConstants;
import android.system.StructRlimit;
import com.android.internal.os.ZygoteConnectionConstants;
@@ -50,6 +51,10 @@ import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -730,14 +735,6 @@ public class Watchdog extends Thread {
return null;
}
- // Don't run the FD monitor on builds that have a global ANR trace file. We're using
- // the ANR trace directory as a quick hack in order to get these traces in bugreports
- // and we wouldn't want to overwrite something important.
- final String dumpDirStr = SystemProperties.get("dalvik.vm.stack-trace-dir", "");
- if (dumpDirStr.isEmpty()) {
- return null;
- }
-
final StructRlimit rlimit;
try {
rlimit = android.system.Os.getrlimit(OsConstants.RLIMIT_NOFILE);
@@ -754,7 +751,7 @@ public class Watchdog extends Thread {
// We do this to avoid having to enumerate the contents of /proc/self/fd in order to
// count the number of descriptors open in the process.
final File fdThreshold = new File("/proc/self/fd/" + (rlimit.rlim_cur - FD_HIGH_WATER_MARK));
- return new OpenFdMonitor(new File(dumpDirStr), fdThreshold);
+ return new OpenFdMonitor(new File("/data/anr"), fdThreshold);
}
OpenFdMonitor(File dumpDir, File fdThreshold) {
@@ -762,23 +759,38 @@ public class Watchdog extends Thread {
mFdHighWaterMark = fdThreshold;
}
+ /**
+ * Dumps open file descriptors and their full paths to a temporary file in {@code mDumpDir}.
+ */
private void dumpOpenDescriptors() {
+ // We cannot exec lsof to get more info about open file descriptors because a newly
+ // forked process will not have the permissions to readlink. Instead list all open
+ // descriptors from /proc/pid/fd and resolve them.
+ List<String> dumpInfo = new ArrayList<>();
+ String fdDirPath = String.format("/proc/%d/fd/", Process.myPid());
+ File[] fds = new File(fdDirPath).listFiles();
+ if (fds == null) {
+ dumpInfo.add("Unable to list " + fdDirPath);
+ } else {
+ for (File f : fds) {
+ String fdSymLink = f.getAbsolutePath();
+ String resolvedPath = "";
+ try {
+ resolvedPath = Os.readlink(fdSymLink);
+ } catch (ErrnoException ex) {
+ resolvedPath = ex.getMessage();
+ }
+ dumpInfo.add(fdSymLink + "\t" + resolvedPath);
+ }
+ }
+
+ // Dump the fds & paths to a temp file.
try {
File dumpFile = File.createTempFile("anr_fd_", "", mDumpDir);
- java.lang.Process proc = new ProcessBuilder()
- .command("/system/bin/lsof", "-p", String.valueOf(Process.myPid()))
- .redirectErrorStream(true)
- .redirectOutput(dumpFile)
- .start();
-
- int returnCode = proc.waitFor();
- if (returnCode != 0) {
- Slog.w(TAG, "Unable to dump open descriptors, lsof return code: "
- + returnCode);
- dumpFile.delete();
- }
- } catch (IOException | InterruptedException ex) {
- Slog.w(TAG, "Unable to dump open descriptors: " + ex);
+ Path out = Paths.get(dumpFile.getAbsolutePath());
+ Files.write(out, dumpInfo, StandardCharsets.UTF_8);
+ } catch (IOException ex) {
+ Slog.w(TAG, "Unable to write open descriptors to file: " + ex);
}
}
diff --git a/services/core/java/com/android/server/accounts/TokenCache.java b/services/core/java/com/android/server/accounts/TokenCache.java
index be91f9831113..2af2f38d8ba7 100644
--- a/services/core/java/com/android/server/accounts/TokenCache.java
+++ b/services/core/java/com/android/server/accounts/TokenCache.java
@@ -125,7 +125,7 @@ import java.util.Objects;
* This is recursive, but it won't spiral out of control because LruCache is
* thread safe and the Evictor can only be removed once.
*/
- Evictor evictor = mTokenEvictors.remove(oldVal.token);
+ Evictor evictor = mTokenEvictors.remove(new Pair<>(k.account.type, oldVal.token));
if (evictor != null) {
evictor.evict();
}
@@ -134,12 +134,13 @@ import java.util.Objects;
public void putToken(Key k, Value v) {
// Prepare for removal by token string.
- Evictor tokenEvictor = mTokenEvictors.get(v.token);
+ Pair<String, String> mapKey = new Pair<>(k.account.type, v.token);
+ Evictor tokenEvictor = mTokenEvictors.get(mapKey);
if (tokenEvictor == null) {
tokenEvictor = new Evictor();
}
tokenEvictor.add(k);
- mTokenEvictors.put(new Pair<>(k.account.type, v.token), tokenEvictor);
+ mTokenEvictors.put(mapKey, tokenEvictor);
// Prepare for removal by associated account.
Evictor accountEvictor = mAccountEvictors.get(k.account);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index d53b6ca8f9c5..350be1a55fea 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -24,7 +24,6 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
@@ -32,6 +31,7 @@ import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
+import android.app.ActivityManagerInternal;
import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.NotificationManager;
@@ -59,7 +59,6 @@ import com.android.internal.messages.nano.SystemMessageProto;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.TransferPipe;
-import com.android.internal.util.CollectionUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.server.AppStateTracker;
@@ -544,6 +543,11 @@ public final class ActiveServices {
if (fgRequired) {
// We are now effectively running a foreground service.
+ ServiceState stracker = r.getTracker();
+ if (stracker != null) {
+ stracker.setForeground(true, mAm.mProcessStats.getMemFactorLocked(),
+ r.lastActivity);
+ }
mAm.mAppOpsService.startOperation(AppOpsManager.getToken(mAm.mAppOpsService),
AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName, true);
}
@@ -1195,13 +1199,14 @@ public final class ActiveServices {
r.app.pid, r.appInfo.uid, "startForeground");
}
boolean alreadyStartedOp = false;
+ boolean stopProcStatsOp = false;
if (r.fgRequired) {
if (DEBUG_SERVICE || DEBUG_BACKGROUND_CHECK) {
Slog.i(TAG, "Service called startForeground() as required: " + r);
}
r.fgRequired = false;
r.fgWaiting = false;
- alreadyStartedOp = true;
+ alreadyStartedOp = stopProcStatsOp = true;
mAm.mHandler.removeMessages(
ActivityManagerService.SERVICE_FOREGROUND_TIMEOUT_MSG, r);
}
@@ -1269,6 +1274,15 @@ public final class ActiveServices {
active.mNumActive++;
}
r.isForeground = true;
+ if (!stopProcStatsOp) {
+ ServiceState stracker = r.getTracker();
+ if (stracker != null) {
+ stracker.setForeground(true,
+ mAm.mProcessStats.getMemFactorLocked(), r.lastActivity);
+ }
+ } else {
+ stopProcStatsOp = false;
+ }
mAm.mAppOpsService.startOperation(
AppOpsManager.getToken(mAm.mAppOpsService),
AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName,
@@ -1290,6 +1304,15 @@ public final class ActiveServices {
}
}
} finally {
+ if (stopProcStatsOp) {
+ // We got through to this point with it actively being started foreground,
+ // and never decided we wanted to keep it like that, so drop it.
+ ServiceState stracker = r.getTracker();
+ if (stracker != null) {
+ stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(),
+ r.lastActivity);
+ }
+ }
if (alreadyStartedOp) {
// If we had previously done a start op for direct foreground start,
// we have cleared the flag so can now drop it.
@@ -1305,6 +1328,11 @@ public final class ActiveServices {
decActiveForegroundAppLocked(smap, r);
}
r.isForeground = false;
+ ServiceState stracker = r.getTracker();
+ if (stracker != null) {
+ stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(),
+ r.lastActivity);
+ }
mAm.mAppOpsService.finishOperation(
AppOpsManager.getToken(mAm.mAppOpsService),
AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
@@ -1394,7 +1422,7 @@ public final class ActiveServices {
private boolean updateServiceClientActivitiesLocked(ProcessRecord proc,
ConnectionRecord modCr, boolean updateLru) {
if (modCr != null && modCr.binding.client != null) {
- if (modCr.binding.client.activities.size() <= 0) {
+ if (!modCr.binding.client.hasActivities()) {
// This connection is from a client without activities, so adding
// and removing is not interesting.
return false;
@@ -1412,7 +1440,7 @@ public final class ActiveServices {
// Binding to ourself is not interesting.
continue;
}
- if (cr.binding.client.activities.size() > 0) {
+ if (cr.binding.client.hasActivities()) {
anyClientActivities = true;
break;
}
@@ -1603,7 +1631,7 @@ public final class ActiveServices {
}
mAm.startAssociationLocked(callerApp.uid, callerApp.processName, callerApp.curProcState,
- s.appInfo.uid, s.name, s.processName);
+ s.appInfo.uid, s.appInfo.longVersionCode, s.name, s.processName);
// Once the apps have become associated, if one of them is caller is ephemeral
// the target app should now be able to see the calling app
mAm.grantEphemeralAccessLocked(callerApp.userId, service,
@@ -1611,7 +1639,8 @@ public final class ActiveServices {
AppBindRecord b = s.retrieveAppBindingLocked(service, callerApp);
ConnectionRecord c = new ConnectionRecord(b, activity,
- connection, flags, clientLabel, clientIntent);
+ connection, flags, clientLabel, clientIntent,
+ callerApp.uid, callerApp.processName);
IBinder binder = connection.asBinder();
ArrayList<ConnectionRecord> clist = s.connections.get(binder);
@@ -1628,6 +1657,7 @@ public final class ActiveServices {
activity.connections.add(c);
}
b.client.connections.add(c);
+ c.startAssociationIfNeeded();
if ((c.flags&Context.BIND_ABOVE_CLIENT) != 0) {
b.client.hasAboveClient = true;
}
@@ -1873,7 +1903,7 @@ public final class ActiveServices {
+ " type=" + resolvedType + " callingUid=" + callingUid);
userId = mAm.mUserController.handleIncomingUser(callingPid, callingUid, userId, false,
- ActivityManagerService.ALLOW_NON_FULL_IN_PROFILE, "service", null);
+ ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE, "service", null);
ServiceMap smap = getServiceMapLocked(userId);
final ComponentName comp = service.getComponent();
@@ -2086,7 +2116,7 @@ public final class ActiveServices {
bumpServiceExecutingLocked(r, execInFg, "bind");
r.app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE);
r.app.thread.scheduleBindService(r, i.intent.getIntent(), rebind,
- r.app.repProcState);
+ r.app.getReportedProcState());
if (!rebind) {
i.requested = true;
}
@@ -2112,7 +2142,7 @@ public final class ActiveServices {
private final boolean scheduleServiceRestartLocked(ServiceRecord r, boolean allowCancel) {
boolean canceled = false;
- if (mAm.isShuttingDownLocked()) {
+ if (mAm.mAtmInternal.isShuttingDown()) {
Slog.w(TAG, "Not scheduling restart of crashed service " + r.shortName
+ " - system is shutting down");
return false;
@@ -2502,7 +2532,7 @@ public final class ActiveServices {
if (DEBUG_MU)
Slog.v(TAG_MU, "realStartServiceLocked, ServiceRecord.uid = " + r.appInfo.uid
+ ", ProcessRecord.uid = " + app.uid);
- r.app = app;
+ r.setProcess(app);
r.restartTime = r.lastActivity = SystemClock.uptimeMillis();
final boolean newService = app.services.add(r);
@@ -2528,7 +2558,7 @@ public final class ActiveServices {
app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE);
app.thread.scheduleCreateService(r, r.serviceInfo,
mAm.compatibilityInfoForPackageLocked(r.serviceInfo.applicationInfo),
- app.repProcState);
+ app.getReportedProcState());
r.postNotification();
created = true;
} catch (DeadObjectException e) {
@@ -2544,7 +2574,7 @@ public final class ActiveServices {
// Cleanup.
if (newService) {
app.services.remove(r);
- r.app = null;
+ r.setProcess(null);
if (SERVICE_RESCHEDULE && DEBUG_DELAYED_SERVICE) {
Slog.w(TAG, " Failed to create Service !!!! ."
+"This will introduce huge delay... "
@@ -2733,6 +2763,7 @@ public final class ActiveServices {
// There is still a connection to the service that is
// being brought down. Mark it as dead.
cr.serviceDead = true;
+ cr.stopAssociation();
try {
cr.conn.connected(r.name, null, true);
} catch (Exception e) {
@@ -2773,6 +2804,11 @@ public final class ActiveServices {
+ r);
r.fgRequired = false;
r.fgWaiting = false;
+ ServiceState stracker = r.getTracker();
+ if (stracker != null) {
+ stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(),
+ r.lastActivity);
+ }
mAm.mAppOpsService.finishOperation(AppOpsManager.getToken(mAm.mAppOpsService),
AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
mAm.mHandler.removeMessages(
@@ -2825,6 +2861,11 @@ public final class ActiveServices {
cancelForegroundNotificationLocked(r);
if (r.isForeground) {
decActiveForegroundAppLocked(smap, r);
+ ServiceState stracker = r.getTracker();
+ if (stracker != null) {
+ stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(),
+ r.lastActivity);
+ }
mAm.mAppOpsService.finishOperation(
AppOpsManager.getToken(mAm.mAppOpsService),
AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName);
@@ -2905,6 +2946,7 @@ public final class ActiveServices {
}
}
b.connections.remove(c);
+ c.stopAssociation();
if (c.activity != null && c.activity != skipAct) {
if (c.activity.connections != null) {
c.activity.connections.remove(c);
@@ -2935,7 +2977,8 @@ public final class ActiveServices {
}
}
- mAm.stopAssociationLocked(b.client.uid, b.client.processName, s.appInfo.uid, s.name);
+ mAm.stopAssociationLocked(b.client.uid, b.client.processName, s.appInfo.uid,
+ s.appInfo.longVersionCode, s.name, s.processName);
if (b.connections.size() == 0) {
b.intent.apps.remove(b.client);
@@ -3120,13 +3163,13 @@ public final class ActiveServices {
}
}
if (finishing) {
- if (r.app != null && !r.app.persistent) {
+ if (r.app != null && !r.app.isPersistent()) {
r.app.services.remove(r);
if (r.whitelistManager) {
updateWhitelistManagerLocked(r.app);
}
}
- r.app = null;
+ r.setProcess(null);
}
}
}
@@ -3210,7 +3253,7 @@ public final class ActiveServices {
&& (filterByClasses == null
|| filterByClasses.contains(service.name.getClassName())));
if (sameComponent
- && (service.app == null || evenPersistent || !service.app.persistent)) {
+ && (service.app == null || evenPersistent || !service.app.isPersistent())) {
if (!doit) {
return true;
}
@@ -3218,14 +3261,14 @@ public final class ActiveServices {
Slog.i(TAG, " Force stopping service " + service);
if (service.app != null) {
service.app.removed = killProcess;
- if (!service.app.persistent) {
+ if (!service.app.isPersistent()) {
service.app.services.remove(service);
if (service.whitelistManager) {
updateWhitelistManagerLocked(service.app);
}
}
}
- service.app = null;
+ service.setProcess(null);
service.isolatedProc = null;
if (mTmpCollectionResults == null) {
mTmpCollectionResults = new ArrayList<>();
@@ -3372,10 +3415,10 @@ public final class ActiveServices {
synchronized (sr.stats.getBatteryStats()) {
sr.stats.stopLaunchedLocked();
}
- if (sr.app != app && sr.app != null && !sr.app.persistent) {
+ if (sr.app != app && sr.app != null && !sr.app.isPersistent()) {
sr.app.services.remove(sr);
}
- sr.app = null;
+ sr.setProcess(null);
sr.isolatedProc = null;
sr.executeNesting = 0;
sr.forceClearTracker();
@@ -3417,7 +3460,7 @@ public final class ActiveServices {
continue;
}
// XXX turned off for now until we have more time to get a better policy.
- if (false && proc != null && !proc.persistent && proc.thread != null
+ if (false && proc != null && !proc.isPersistent() && proc.thread != null
&& proc.pid != 0 && proc.pid != ActivityManagerService.MY_PID
&& proc.setProcState >= ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
proc.kill("bound to service " + sr.name.flattenToShortString()
@@ -3435,7 +3478,7 @@ public final class ActiveServices {
// Unless the process is persistent, this process record is going away,
// so make sure the service is cleaned out of it.
- if (!app.persistent) {
+ if (!app.isPersistent()) {
app.services.removeAt(i);
}
@@ -3545,7 +3588,7 @@ public final class ActiveServices {
if (r.app != null && r.app.pid == ActivityManagerService.MY_PID) {
info.flags |= ActivityManager.RunningServiceInfo.FLAG_SYSTEM_PROCESS;
}
- if (r.app != null && r.app.persistent) {
+ if (r.app != null && r.app.isPersistent()) {
info.flags |= ActivityManager.RunningServiceInfo.FLAG_PERSISTENT_PROCESS;
}
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index 698b6f7d99f2..5f9f4ebcddbc 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -30,16 +30,15 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.FLAG_PRIVATE;
import static android.view.Display.REMOVE_MODE_DESTROY_CONTENT;
+import static com.android.server.am.ActivityDisplayProto.CONFIGURATION_CONTAINER;
+import static com.android.server.am.ActivityDisplayProto.ID;
+import static com.android.server.am.ActivityDisplayProto.STACKS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityDisplayProto.CONFIGURATION_CONTAINER;
-import static com.android.server.am.ActivityDisplayProto.STACKS;
-import static com.android.server.am.ActivityDisplayProto.ID;
import android.annotation.Nullable;
-import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
import android.app.WindowConfiguration;
import android.graphics.Point;
@@ -47,11 +46,13 @@ import android.util.IntArray;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
+
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.ConfigurationContainer;
import com.android.server.wm.DisplayWindowController;
-
import com.android.server.wm.WindowContainerListener;
+
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -90,9 +91,9 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
private IntArray mDisplayAccessUIDs = new IntArray();
/** All tokens used to put activities on this stack to sleep (including mOffToken) */
- final ArrayList<ActivityManagerInternal.SleepToken> mAllSleepTokens = new ArrayList<>();
+ final ArrayList<ActivityTaskManagerInternal.SleepToken> mAllSleepTokens = new ArrayList<>();
/** The token acquired by ActivityStackSupervisor to put stacks on the display to sleep */
- ActivityManagerInternal.SleepToken mOffToken;
+ ActivityTaskManagerInternal.SleepToken mOffToken;
private boolean mSleeping;
@@ -166,19 +167,35 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
mStacks.remove(stack);
final int insertPosition = getTopInsertPosition(stack, position);
mStacks.add(insertPosition, stack);
- mWindowContainerController.positionChildAt(stack.getWindowContainerController(),
- insertPosition);
+ // Since positionChildAt() is called during the creation process of pinned stacks,
+ // ActivityStack#getWindowContainerController() can be null. In this special case,
+ // since DisplayContest#positionStackAt() is called in TaskStack#onConfigurationChanged(),
+ // we don't have to call WindowContainerController#positionChildAt() here.
+ if (stack.getWindowContainerController() != null) {
+ mWindowContainerController.positionChildAt(stack.getWindowContainerController(),
+ insertPosition);
+ }
onStackOrderChanged();
}
private int getTopInsertPosition(ActivityStack stack, int candidatePosition) {
int position = mStacks.size();
- if (position > 0) {
- final ActivityStack topStack = mStacks.get(position - 1);
- if (topStack.getWindowConfiguration().isAlwaysOnTop() && topStack != stack) {
- // If the top stack is always on top, we move this stack just below it.
- position--;
+ if (stack.inPinnedWindowingMode()) {
+ // Stack in pinned windowing mode is z-ordered on-top of all other stacks so okay to
+ // just return the candidate position.
+ return Math.min(position, candidatePosition);
+ }
+ while (position > 0) {
+ final ActivityStack targetStack = mStacks.get(position - 1);
+ if (!targetStack.isAlwaysOnTop()) {
+ // We reached a stack that isn't always-on-top.
+ break;
+ }
+ if (stack.isAlwaysOnTop() && !targetStack.inPinnedWindowingMode()) {
+ // Always on-top non-pinned windowing mode stacks can go anywhere below pinned stack.
+ break;
}
+ position--;
}
return Math.min(position, candidatePosition);
}
@@ -290,7 +307,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
}
}
- final ActivityManagerService service = mSupervisor.mService;
+ final ActivityTaskManagerService service = mSupervisor.mService;
if (!isWindowingModeSupported(windowingMode, service.mSupportsMultiWindow,
service.mSupportsSplitScreenMultiWindow, service.mSupportsFreeformWindowManagement,
service.mSupportsPictureInPicture, activityType)) {
@@ -526,7 +543,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
}
// Make sure the windowing mode we are trying to use makes sense for what is supported.
- final ActivityManagerService service = mSupervisor.mService;
+ final ActivityTaskManagerService service = mSupervisor.mService;
boolean supportsMultiWindow = service.mSupportsMultiWindow;
boolean supportsSplitScreen = service.mSupportsSplitScreenMultiWindow;
boolean supportsFreeform = service.mSupportsFreeformWindowManagement;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index b44ba9c93482..bdfb4ec555ed 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -16,45 +16,22 @@
package com.android.server.am;
-import static android.Manifest.permission.BIND_VOICE_INTERACTION;
import static android.Manifest.permission.CHANGE_CONFIGURATION;
import static android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST;
-import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
-import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
-import static android.Manifest.permission.READ_FRAME_BUFFER;
import static android.Manifest.permission.REMOVE_TASKS;
-import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
-import static android.Manifest.permission.STOP_APP_SWITCHES;
-import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
-import static android.app.ActivityManager.RESIZE_MODE_PRESERVE_WINDOW;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_CONTENT;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_DATA;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_STRUCTURE;
+import static android.app.ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
+import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
+import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
+import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
import static android.app.ActivityThread.PROC_START_SEQ_IDENT;
import static android.app.AppOpsManager.OP_NONE;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
-import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
import static android.content.pm.ApplicationInfo.HIDDEN_API_ENFORCEMENT_DEFAULT;
-import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
-import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
-import static android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY;
-import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
import static android.content.pm.PackageManager.GET_PROVIDERS;
import static android.content.pm.PackageManager.MATCH_ANY_USER;
import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
@@ -63,10 +40,8 @@ import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.content.res.Configuration.UI_MODE_TYPE_TELEVISION;
import static android.net.NetworkPolicyManager.isProcStateAllowedWhileIdleOrPowerSaveMode;
import static android.net.NetworkPolicyManager.isProcStateAllowedWhileOnRestrictBackground;
-import static android.os.Build.VERSION_CODES.N;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_HIGH;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL;
@@ -88,7 +63,6 @@ import static android.os.Process.SCHED_OTHER;
import static android.os.Process.SCHED_RESET_ON_FORK;
import static android.os.Process.SE_UID;
import static android.os.Process.SHELL_UID;
-import static android.os.Process.SIGNAL_QUIT;
import static android.os.Process.SIGNAL_USR1;
import static android.os.Process.SYSTEM_UID;
import static android.os.Process.THREAD_GROUP_BG_NONINTERACTIVE;
@@ -113,20 +87,11 @@ import static android.os.Process.setThreadPriority;
import static android.os.Process.setThreadScheduler;
import static android.os.Process.startWebView;
import static android.os.Process.zygoteProcess;
-import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import static android.provider.Settings.Global.ALWAYS_FINISH_ACTIVITIES;
import static android.provider.Settings.Global.DEBUG_APP;
-import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
-import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
-import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RTL;
-import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS;
import static android.provider.Settings.Global.NETWORK_ACCESS_TIMEOUT_MS;
import static android.provider.Settings.Global.WAIT_FOR_DEBUGGER;
-import static android.provider.Settings.System.FONT_SCALE;
-import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
-import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.Display.INVALID_DISPLAY;
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
import static com.android.internal.util.XmlUtils.readIntAttribute;
import static com.android.internal.util.XmlUtils.readLongAttribute;
@@ -142,8 +107,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_B
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_LIGHT;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CLEANUP;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IMMERSIVE;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LRU;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
@@ -157,20 +120,15 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROCESS_OBS
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROVIDER;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SERVICE;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_URI_PERMISSION;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS;
-import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBILITY;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_WHITELISTS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BACKUP;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CLEANUP;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IMMERSIVE;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LRU;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU;
@@ -181,35 +139,15 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PROCESSES
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PROCESS_OBSERVERS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PROVIDER;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PSS;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RECENTS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SERVICE;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_UID_OBSERVERS;
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_URI_PERMISSION;
-import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
-import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME;
-import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_ONLY;
-import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS;
-import static com.android.server.am.ActivityStackSupervisor.ON_TOP;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
-import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
-import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
import static com.android.server.am.MemoryStatUtil.hasMemcg;
-import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
-import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
-import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT;
-import static com.android.server.am.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE;
-import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_NONE;
-import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
-import static android.view.WindowManager.TRANSIT_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
-import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
-import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
+import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
@@ -222,16 +160,13 @@ import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.StackInfo;
-import android.app.ActivityManager.TaskSnapshot;
import android.app.ActivityManagerInternal;
-import android.app.ActivityManagerInternal.ScreenObserver;
-import android.app.ActivityManagerInternal.SleepToken;
import android.app.ActivityManagerProto;
import android.app.ActivityOptions;
import android.app.ActivityThread;
-import android.app.AlertDialog;
import android.app.AppGlobals;
import android.app.AppOpsManager;
+import android.app.AppOpsManagerInternal.CheckOpsDelegate;
import android.app.ApplicationErrorReport;
import android.app.ApplicationThreadConstants;
import android.app.BroadcastOptions;
@@ -255,22 +190,14 @@ import android.app.Instrumentation;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.app.PictureInPictureParams;
import android.app.ProcessMemoryState;
import android.app.ProfilerInfo;
-import android.app.RemoteAction;
-import android.app.WaitResult;
import android.app.WindowConfiguration.ActivityType;
import android.app.WindowConfiguration.WindowingMode;
-import android.app.admin.DevicePolicyCache;
-import android.app.assist.AssistContent;
-import android.app.assist.AssistStructure;
import android.app.backup.IBackupManager;
-import android.app.servertransaction.ConfigurationChangeItem;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManagerInternal;
import android.appwidget.AppWidgetManager;
-import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ClipData;
import android.content.ComponentCallbacks2;
@@ -278,7 +205,6 @@ import android.content.ComponentName;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.IContentProvider;
import android.content.IIntentReceiver;
import android.content.IIntentSender;
@@ -295,6 +221,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageManagerInternal.CheckPermissionDelegate;
import android.content.pm.ParceledListSlice;
import android.content.pm.PathPermission;
import android.content.pm.PermissionInfo;
@@ -307,13 +234,10 @@ import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.ContentObserver;
-import android.graphics.Bitmap;
-import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.display.DisplayManagerInternal;
import android.location.LocationManager;
import android.media.audiofx.AudioEffect;
-import android.metrics.LogMaker;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Proxy;
@@ -321,13 +245,13 @@ import android.net.ProxyInfo;
import android.net.Uri;
import android.os.BatteryStats;
import android.os.Binder;
+import android.os.BinderProxy;
import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
import android.os.DropBoxManager;
import android.os.Environment;
import android.os.FactoryTest;
-import android.os.FileObserver;
import android.os.FileUtils;
import android.os.Handler;
import android.os.IBinder;
@@ -335,16 +259,14 @@ import android.os.IDeviceIdentifiersPolicyService;
import android.os.IPermissionController;
import android.os.IProcessInfoService;
import android.os.IProgressListener;
-import android.os.LocaleList;
import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
-import android.os.PersistableBundle;
-import android.os.PowerManager;
import android.os.PowerManager.ServiceType;
import android.os.PowerManagerInternal;
import android.os.Process;
+import android.os.RemoteCallback;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ResultReceiver;
@@ -355,7 +277,6 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.TransactionTooLargeException;
-import android.os.UpdateLock;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.WorkSource;
@@ -364,12 +285,8 @@ import android.os.storage.StorageManager;
import android.os.storage.StorageManagerInternal;
import android.provider.Downloads;
import android.provider.Settings;
-import android.service.voice.IVoiceInteractionSession;
-import android.service.voice.VoiceInteractionManagerInternal;
-import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.text.format.DateUtils;
-import android.text.format.Time;
import android.text.style.SuggestionSpan;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -392,41 +309,35 @@ import android.util.proto.ProtoUtils;
import android.view.Gravity;
import android.view.IRecentsAnimationRunner;
import android.view.LayoutInflater;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationDefinition;
import android.view.View;
import android.view.WindowManager;
import android.util.BoostFramework;
import android.view.autofill.AutofillManagerInternal;
+import com.google.android.collect.Lists;
+import com.google.android.collect.Maps;
+
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.app.AssistUtils;
import com.android.internal.app.DumpHeapActivity;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
-import com.android.internal.app.IVoiceInteractor;
import com.android.internal.app.ProcessMap;
import com.android.internal.app.SystemUserHomeActivity;
import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.app.ActivityTrigger;
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.os.BackgroundThread;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.BinderInternal;
-import com.android.internal.os.logging.MetricsLoggerWrapper;
import com.android.internal.os.ByteTransferPipe;
import com.android.internal.os.IResultReceiver;
import com.android.internal.os.ProcessCpuTracker;
import com.android.internal.os.TransferPipe;
import com.android.internal.os.Zygote;
-import com.android.internal.policy.IKeyguardDismissCallback;
-import com.android.internal.policy.KeyguardDismissCallback;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
@@ -434,6 +345,8 @@ import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.MemInfoReader;
import com.android.internal.util.Preconditions;
+import com.android.internal.util.function.QuadFunction;
+import com.android.internal.util.function.TriFunction;
import com.android.server.AlarmManagerInternal;
import com.android.server.AppOpsService;
import com.android.server.AttributeCache;
@@ -451,21 +364,9 @@ import com.android.server.SystemService;
import com.android.server.SystemServiceManager;
import com.android.server.ThreadPriorityBooster;
import com.android.server.Watchdog;
+import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto;
import com.android.server.am.ActivityStack.ActivityState;
import com.android.server.am.MemoryStatUtil.MemoryStat;
-import com.android.server.am.ActivityManagerServiceProto;
-import com.android.server.am.ActivityManagerServiceDumpActivitiesProto;
-import com.android.server.am.ActivityManagerServiceDumpBroadcastsProto;
-import com.android.server.am.ActivityManagerServiceDumpProcessesProto;
-import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto;
-import com.android.server.am.ActivityManagerServiceDumpServicesProto;
-import com.android.server.am.GrantUriProto;
-import com.android.server.am.ImportanceTokenProto;
-import com.android.server.am.MemInfoDumpProto;
-import com.android.server.am.NeededUriGrantsProto;
-import com.android.server.am.ProcessOomProto;
-import com.android.server.am.ProcessToGcProto;
-import com.android.server.am.StickyBroadcastProto;
import com.android.server.firewall.IntentFirewall;
import com.android.server.job.JobSchedulerInternal;
import com.android.server.pm.Installer;
@@ -473,26 +374,20 @@ import com.android.server.pm.Installer.InstallerException;
import com.android.server.pm.dex.DexManager;
import com.android.server.utils.PriorityDump;
import com.android.server.vr.VrManagerInternal;
-import com.android.server.wm.PinnedStackWindowController;
+import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerService;
-import dalvik.system.VMRuntime;
-
-import libcore.io.IoUtils;
-import libcore.util.EmptyArray;
-
-import com.google.android.collect.Lists;
-import com.google.android.collect.Maps;
-
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
@@ -519,6 +414,11 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.BiFunction;
+
+import dalvik.system.VMRuntime;
+import libcore.io.IoUtils;
+import libcore.util.EmptyArray;
public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
@@ -533,8 +433,6 @@ public class ActivityManagerService extends IActivityManager.Stub
private static final String TAG_BROADCAST = TAG + POSTFIX_BROADCAST;
private static final String TAG_CLEANUP = TAG + POSTFIX_CLEANUP;
private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
- private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
- private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE;
private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
private static final String TAG_LRU = TAG + POSTFIX_LRU;
private static final String TAG_MU = TAG + POSTFIX_MU;
@@ -545,13 +443,10 @@ public class ActivityManagerService extends IActivityManager.Stub
private static final String TAG_PROCESSES = TAG + POSTFIX_PROCESSES;
private static final String TAG_PROVIDER = TAG + POSTFIX_PROVIDER;
private static final String TAG_PSS = TAG + POSTFIX_PSS;
- private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS;
private static final String TAG_SERVICE = TAG + POSTFIX_SERVICE;
- private static final String TAG_STACK = TAG + POSTFIX_STACK;
private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
private static final String TAG_UID_OBSERVERS = TAG + POSTFIX_UID_OBSERVERS;
private static final String TAG_URI_PERMISSION = TAG + POSTFIX_URI_PERMISSION;
- private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
// Mock "pretend we're idle now" broadcast action to the job scheduler; declared
// here so that while the job scheduler can depend on AMS, the other way around
@@ -573,13 +468,11 @@ public class ActivityManagerService extends IActivityManager.Stub
static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
+ private static final String ANR_TRACE_DIR = "/data/anr";
+
// Maximum number of receivers an app can register.
private static final int MAX_RECEIVERS_ALLOWED_PER_APP = 1000;
- // Amount of time after a call to stopAppSwitches() during which we will
- // prevent further untrusted switches from happening.
- static final long APP_SWITCH_DELAY_TIME = 5*1000;
-
// How long we wait for a launched process to attach to the activity manager
// before we decide it's never going to come up for real.
static final int PROC_START_TIMEOUT = 10*1000;
@@ -607,17 +500,6 @@ public class ActivityManagerService extends IActivityManager.Stub
// Must be kept in sync with Am.
private static final int INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS = 1 << 0;
- // How long to wait in getAssistContextExtras for the activity and foreground services
- // to respond with the result.
- static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500;
-
- // How long top wait when going through the modern assist (which doesn't need to block
- // on getting this result before starting to launch its UI).
- static final int PENDING_ASSIST_EXTRAS_LONG_TIMEOUT = 2000;
-
- // How long to wait in getAutofillAssistStructure() for the activity to respond with the result.
- static final int PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT = 2000;
-
// Maximum number of persisted Uri grants a package is allowed
static final int MAX_PERSISTED_URI_GRANTS = 128;
@@ -634,11 +516,6 @@ public class ActivityManagerService extends IActivityManager.Stub
/** If a UID observer takes more than this long, send a WTF. */
private static final int SLOW_UID_OBSERVER_THRESHOLD_MS = 20;
- // Access modes for handleIncomingUser.
- static final int ALLOW_NON_FULL = 0;
- static final int ALLOW_NON_FULL_IN_PROFILE = 1;
- static final int ALLOW_FULL_ONLY = 2;
-
// Necessary ApplicationInfo flags to mark an app as persistent
private static final int PERSISTENT_MASK =
ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT;
@@ -650,8 +527,8 @@ public class ActivityManagerService extends IActivityManager.Stub
// Used to indicate that an app transition should be animated.
static final boolean ANIMATE = true;
- // Determines whether to take full screen screenshots
- static final boolean TAKE_FULLSCREEN_SCREENSHOTS = true;
+ // If set, we will push process association information in to procstats.
+ static final boolean TRACK_PROCSTATS_ASSOCIATIONS = true;
/**
* Default value for {@link Settings.Global#NETWORK_ACCESS_TIMEOUT_MS}.
@@ -696,24 +573,10 @@ public class ActivityManagerService extends IActivityManager.Stub
/** All system services */
SystemServiceManager mSystemServiceManager;
- // Wrapper around VoiceInteractionServiceManager
- private AssistUtils mAssistUtils;
-
- // Keeps track of the active voice interaction service component, notified from
- // VoiceInteractionManagerService
- ComponentName mActiveVoiceInteractionServiceComponent;
-
private Installer mInstaller;
/** Run all ActivityStacks through this */
- final ActivityStackSupervisor mStackSupervisor;
- private final KeyguardController mKeyguardController;
-
- private final ActivityStartController mActivityStartController;
-
- private final ClientLifecycleManager mLifecycleManager;
-
- final TaskChangeNotificationController mTaskChangeNotificationController;
+ ActivityStackSupervisor mStackSupervisor;
final InstrumentationReporter mInstrumentationReporter = new InstrumentationReporter();
@@ -721,21 +584,11 @@ public class ActivityManagerService extends IActivityManager.Stub
public final IntentFirewall mIntentFirewall;
- // Whether we should show our dialogs (ANR, crash, etc) or just perform their
- // default action automatically. Important for devices without direct input
- // devices.
- private boolean mShowDialogs = true;
-
- private final VrController mVrController;
-
- // VR Vr2d Display Id.
- int mVr2dDisplayId = INVALID_DISPLAY;
+ public OomAdjProfiler mOomAdjProfiler = new OomAdjProfiler();
// Whether we should use SCHED_FIFO for UI and RenderThreads.
private boolean mUseFifoUiScheduling = false;
- private static final String SYSUI_COMPONENT_NAME = "com.android.systemui/.SystemUIService";
-
BroadcastQueue mFgBroadcastQueue;
BroadcastQueue mBgBroadcastQueue;
// Convenient for easy iteration over the queues. Foreground is first
@@ -754,47 +607,12 @@ public class ActivityManagerService extends IActivityManager.Stub
}
/**
- * The last resumed activity. This is identical to the current resumed activity most
- * of the time but could be different when we're pausing one activity before we resume
- * another activity.
- */
- private ActivityRecord mLastResumedActivity;
-
- /**
- * The activity that is currently being traced as the active resumed activity.
- *
- * @see #updateResumedAppTrace
- */
- private @Nullable ActivityRecord mTracedResumedActivity;
-
- /**
- * If non-null, we are tracking the time the user spends in the currently focused app.
- */
- private AppTimeTracker mCurAppTimeTracker;
-
- /**
- * List of intents that were used to start the most recent tasks.
- */
- private final RecentTasks mRecentTasks;
-
- /**
* The package name of the DeviceOwner. This package is not permitted to have its data cleared.
*/
String mDeviceOwnerName;
- /**
- * The controller for all operations related to locktask.
- */
- private final LockTaskController mLockTaskController;
-
final UserController mUserController;
- /**
- * Packages that are being allowed to perform unrestricted app switches. Mapping is
- * User -> Type -> uid.
- */
- final SparseArray<ArrayMap<String, Integer>> mAllowAppSwitchUids = new SparseArray<>();
-
final AppErrors mAppErrors;
final AppWarnings mAppWarnings;
@@ -827,7 +645,7 @@ public class ActivityManagerService extends IActivityManager.Stub
boolean asProto) {
if (asProto) return;
doDump(fd, pw, new String[]{"activities"}, asProto);
- doDump(fd, pw, new String[]{"service", SYSUI_COMPONENT_NAME}, asProto);
+ doDump(fd, pw, new String[]{"service", "all-platform-critical"}, asProto);
}
@Override
@@ -841,15 +659,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
};
- public boolean canShowErrorDialogs() {
- return mShowDialogs && !mSleeping && !mShuttingDown
- && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
- && !mUserController.hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,
- mUserController.getCurrentUserId())
- && !(UserManager.isDeviceInDemoMode(mContext)
- && mUserController.getCurrentUser().isDemo());
- }
-
private static ThreadPriorityBooster sThreadPriorityBooster = new ThreadPriorityBooster(
THREAD_PRIORITY_FOREGROUND, LockGuard.INDEX_ACTIVITY);
@@ -861,45 +670,6 @@ public class ActivityManagerService extends IActivityManager.Stub
sThreadPriorityBooster.reset();
}
- public class PendingAssistExtras extends Binder implements Runnable {
- public final ActivityRecord activity;
- public boolean isHome;
- public final Bundle extras;
- public final Intent intent;
- public final String hint;
- public final IAssistDataReceiver receiver;
- public final int userHandle;
- public boolean haveResult = false;
- public Bundle result = null;
- public AssistStructure structure = null;
- public AssistContent content = null;
- public Bundle receiverExtras;
-
- public PendingAssistExtras(ActivityRecord _activity, Bundle _extras, Intent _intent,
- String _hint, IAssistDataReceiver _receiver, Bundle _receiverExtras,
- int _userHandle) {
- activity = _activity;
- extras = _extras;
- intent = _intent;
- hint = _hint;
- receiver = _receiver;
- receiverExtras = _receiverExtras;
- userHandle = _userHandle;
- }
-
- @Override
- public void run() {
- Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from " + activity);
- synchronized (this) {
- haveResult = true;
- notifyAll();
- }
- pendingAssistExtrasTimedOut(this);
- }
- }
-
- final ArrayList<PendingAssistExtras> mPendingAssistExtras = new ArrayList<>();
-
/**
* Process management.
*/
@@ -911,7 +681,22 @@ public class ActivityManagerService extends IActivityManager.Stub
* returned by the package manager), and the keys are ApplicationRecord
* objects.
*/
- final ProcessMap<ProcessRecord> mProcessNames = new ProcessMap<ProcessRecord>();
+ final MyProcessMap mProcessNames = new MyProcessMap();
+ final class MyProcessMap extends ProcessMap<ProcessRecord> {
+ @Override
+ public ProcessRecord put(String name, int uid, ProcessRecord value) {
+ final ProcessRecord r = super.put(name, uid, value);
+ mAtmInternal.onProcessAdded(r.getWindowProcessController());
+ return r;
+ }
+
+ @Override
+ public ProcessRecord remove(String name, int uid) {
+ final ProcessRecord r = super.remove(name, uid);
+ mAtmInternal.onProcessRemoved(name, uid);
+ return r;
+ }
+ }
/**
* Tracking long-term execution of processes to look for abuse and other
@@ -922,7 +707,7 @@ public class ActivityManagerService extends IActivityManager.Stub
/**
* The currently running isolated processes.
*/
- final SparseArray<ProcessRecord> mIsolatedProcesses = new SparseArray<ProcessRecord>();
+ final SparseArray<ProcessRecord> mIsolatedProcesses = new SparseArray<>();
/**
* Counter for assigning isolated process uids, to avoid frequently reusing the
@@ -1049,23 +834,6 @@ public class ActivityManagerService extends IActivityManager.Stub
boolean mFullPssPending = false;
/**
- * This is the process holding what we currently consider to be
- * the "home" activity.
- */
- ProcessRecord mHomeProcess;
-
- /**
- * This is the process holding the activity the user last visited that
- * is in a different process from the one they are currently in.
- */
- ProcessRecord mPreviousProcess;
-
- /**
- * The time at which the previous process was last visible.
- */
- long mPreviousProcessVisibleTime;
-
- /**
* Track all uids that have actively running processes.
*/
final SparseArray<UidRecord> mActiveUids = new SparseArray<>();
@@ -1298,32 +1066,6 @@ public class ActivityManagerService extends IActivityManager.Stub
CoreSettingsObserver mCoreSettingsObserver;
- FontScaleSettingObserver mFontScaleSettingObserver;
-
- private final class FontScaleSettingObserver extends ContentObserver {
- private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
- private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
-
- public FontScaleSettingObserver() {
- super(mHandler);
- ContentResolver resolver = mContext.getContentResolver();
- resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
- resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
- UserHandle.USER_ALL);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) {
- if (mFontScaleUri.equals(uri)) {
- updateFontScaleIfNeeded(userId);
- } else if (mHideErrorDialogsUri.equals(uri)) {
- synchronized (ActivityManagerService.this) {
- updateShouldShowDialogsLocked(getGlobalConfiguration());
- }
- }
- }
- }
-
DevelopmentSettingsObserver mDevelopmentSettingsObserver;
private final class DevelopmentSettingsObserver extends ContentObserver {
@@ -1434,32 +1176,6 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
final AppOpsService mAppOpsService;
- /** Current sequencing integer of the configuration, for skipping old configurations. */
- private int mConfigurationSeq;
-
- /**
- * Temp object used when global and/or display override configuration is updated. It is also
- * sent to outer world instead of {@link #getGlobalConfiguration} because we don't trust
- * anyone...
- */
- private Configuration mTempConfig = new Configuration();
-
- private final UpdateConfigurationResult mTmpUpdateConfigurationResult =
- new UpdateConfigurationResult();
- private static final class UpdateConfigurationResult {
- // Configuration changes that were updated.
- int changes;
- // If the activity was relaunched to match the new configuration.
- boolean activityRelaunched;
-
- void reset() {
- changes = 0;
- activityRelaunched = false;
- }
- }
-
- boolean mSuppressResizeConfigChanges;
-
/**
* Hardware-reported OpenGLES version.
*/
@@ -1504,77 +1220,21 @@ public class ActivityManagerService extends IActivityManager.Stub
final Context mUiContext;
/**
- * The time at which we will allow normal application switches again,
- * after a call to {@link #stopAppSwitches()}.
- */
- long mAppSwitchesAllowedTime;
-
- /**
- * This is set to true after the first switch after mAppSwitchesAllowedTime
- * is set; any switches after that will clear the time.
- */
- boolean mDidAppSwitch;
-
- /**
* Last time (in uptime) at which we checked for power usage.
*/
long mLastPowerCheckUptime;
/**
- * Set while we are wanting to sleep, to prevent any
- * activities from being started/resumed.
- *
- * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping.
- *
- * Currently mSleeping is set to true when transitioning into the sleep state, and remains true
- * while in the sleep state until there is a pending transition out of sleep, in which case
- * mSleeping is set to false, and remains false while awake.
- *
- * Whether mSleeping can quickly toggled between true/false without the device actually
- * display changing states is undefined.
- */
- private boolean mSleeping = false;
-
- /**
- * The process state used for processes that are running the top activities.
- * This changes between TOP and TOP_SLEEPING to following mSleeping.
- */
- int mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
-
- /**
- * Set while we are running a voice interaction. This overrides
- * sleeping while it is active.
- */
- IVoiceInteractionSession mRunningVoice;
-
- /**
* For some direct access we need to power manager.
*/
PowerManagerInternal mLocalPowerManager;
/**
- * We want to hold a wake lock while running a voice interaction session, since
- * this may happen with the screen off and we need to keep the CPU running to
- * be able to continue to interact with the user.
- */
- PowerManager.WakeLock mVoiceWakeLock;
-
- /**
* State of external calls telling us if the device is awake or asleep.
*/
private int mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
/**
- * State of external calls telling us if the device is awake or asleep.
- */
- private boolean mKeyguardShown = false;
-
- /**
- * Set if we are shutting down the system, similar to sleeping.
- */
- boolean mShuttingDown = false;
-
- /**
* Current sequence id for oom_adj computation traversal.
*/
int mAdjSeq = 0;
@@ -1671,29 +1331,7 @@ public class ActivityManagerService extends IActivityManager.Stub
String mOrigDebugApp = null;
boolean mOrigWaitForDebugger = false;
boolean mAlwaysFinishActivities = false;
- boolean mForceResizableActivities;
- /**
- * Flag that indicates if multi-window is enabled.
- *
- * For any particular form of multi-window to be enabled, generic multi-window must be enabled
- * in {@link com.android.internal.R.bool#config_supportsMultiWindow} config or
- * {@link Settings.Global#DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES} development option set.
- * At least one of the forms of multi-window must be enabled in order for this flag to be
- * initialized to 'true'.
- *
- * @see #mSupportsSplitScreenMultiWindow
- * @see #mSupportsFreeformWindowManagement
- * @see #mSupportsPictureInPicture
- * @see #mSupportsMultiDisplay
- */
- boolean mSupportsMultiWindow;
- boolean mSupportsSplitScreenMultiWindow;
- boolean mSupportsFreeformWindowManagement;
- boolean mSupportsPictureInPicture;
- boolean mSupportsMultiDisplay;
- boolean mSupportsLeanbackOnly;
- IActivityController mController = null;
- boolean mControllerIsAMonkey = false;
+
String mProfileApp = null;
ProcessRecord mProfileProc = null;
ProfilerInfo mProfilerInfo = null;
@@ -1817,8 +1455,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- final List<ScreenObserver> mScreenObservers = new ArrayList<>();
-
final RemoteCallbackList<IProcessObserver> mProcessObservers = new RemoteCallbackList<>();
ProcessChangeItem[] mActiveProcessChanges = new ProcessChangeItem[5];
@@ -1860,12 +1496,6 @@ public class ActivityManagerService extends IActivityManager.Stub
long mLastWriteTime = 0;
/**
- * Used to retain an update lock when the foreground activity is in
- * immersive mode.
- */
- final UpdateLock mUpdateLock = new UpdateLock("immersive");
-
- /**
* Set to true after the system has finished booting.
*/
boolean mBooted = false;
@@ -1876,6 +1506,8 @@ public class ActivityManagerService extends IActivityManager.Stub
int mBootPhase;
WindowManagerService mWindowManager;
+ ActivityTaskManagerService mActivityTaskManager;
+ ActivityTaskManagerInternal mAtmInternal;
final ActivityThread mSystemThread;
private final class AppDeathRecipient implements IBinder.DeathRecipient {
@@ -1912,8 +1544,6 @@ public class ActivityManagerService extends IActivityManager.Stub
static final int WAIT_FOR_DEBUGGER_UI_MSG = 6;
static final int SERVICE_TIMEOUT_MSG = 12;
static final int UPDATE_TIME_ZONE = 13;
- static final int SHOW_UID_ERROR_UI_MSG = 14;
- static final int SHOW_FINGERPRINT_ERROR_UI_MSG = 15;
static final int PROC_START_TIMEOUT_MSG = 20;
static final int KILL_APPLICATION_MSG = 22;
static final int FINALIZE_PENDING_INTENT_MSG = 23;
@@ -1927,26 +1557,18 @@ public class ActivityManagerService extends IActivityManager.Stub
static final int DISPATCH_PROCESSES_CHANGED_UI_MSG = 31;
static final int DISPATCH_PROCESS_DIED_UI_MSG = 32;
static final int REPORT_MEM_USAGE_MSG = 33;
- static final int IMMERSIVE_MODE_LOCK_MSG = 37;
static final int PERSIST_URI_GRANTS_MSG = 38;
static final int UPDATE_TIME_PREFERENCE_MSG = 41;
- static final int ENTER_ANIMATION_COMPLETE_MSG = 44;
static final int FINISH_BOOTING_MSG = 45;
static final int SEND_LOCALE_TO_MOUNT_DAEMON_MSG = 47;
- static final int DISMISS_DIALOG_UI_MSG = 48;
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 DISPATCH_UIDS_CHANGED_UI_MSG = 53;
- static final int REPORT_TIME_TRACKER_MSG = 54;
static final int SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG = 56;
static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG = 57;
static final int IDLE_UIDS_MSG = 58;
- static final int LOG_STACK_STATE = 60;
- static final int VR_MODE_CHANGE_MSG = 61;
static final int HANDLE_TRUST_STORAGE_UPDATE_MSG = 63;
- static final int DISPATCH_SCREEN_AWAKE_MSG = 64;
- static final int DISPATCH_SCREEN_KEYGUARD_MSG = 65;
static final int SERVICE_FOREGROUND_TIMEOUT_MSG = 66;
static final int DISPATCH_PENDING_INTENT_CANCEL_MSG = 67;
static final int PUSH_TEMP_WHITELIST_UI_MSG = 68;
@@ -1990,11 +1612,6 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
private boolean mUserIsMonkey;
- /** The dimensions of the thumbnails in the Recents UI. */
- int mThumbnailWidth;
- int mThumbnailHeight;
- float mFullscreenThumbnailScale;
-
final ServiceThread mHandlerThread;
final MainHandler mHandler;
final Handler mUiHandler;
@@ -2008,10 +1625,6 @@ public class ActivityManagerService extends IActivityManager.Stub
PackageManagerInternal mPackageManagerInt;
- // VoiceInteraction session ID that changes for each new request except when
- // being called for multiwindow assist in a single session.
- private int mViSessionId = 1000;
-
final boolean mPermissionReviewRequired;
boolean mHasHeavyWeightFeature;
@@ -2084,7 +1697,7 @@ public class ActivityManagerService extends IActivityManager.Stub
return;
}
AppErrorResult res = (AppErrorResult) data.get("result");
- if (mShowDialogs && !mSleeping && !mShuttingDown) {
+ if (mAtmInternal.showStrictModeViolationDialog()) {
Dialog d = new StrictModeViolationDialog(mUiContext,
ActivityManagerService.this, res, proc);
d.show();
@@ -2123,30 +1736,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
} break;
- case SHOW_UID_ERROR_UI_MSG: {
- if (mShowDialogs) {
- AlertDialog d = new BaseErrorDialog(mUiContext);
- d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
- d.setCancelable(false);
- d.setTitle(mUiContext.getText(R.string.android_system_label));
- d.setMessage(mUiContext.getText(R.string.system_error_wipe_data));
- d.setButton(DialogInterface.BUTTON_POSITIVE, mUiContext.getText(R.string.ok),
- obtainMessage(DISMISS_DIALOG_UI_MSG, d));
- d.show();
- }
- } break;
- case SHOW_FINGERPRINT_ERROR_UI_MSG: {
- if (mShowDialogs) {
- AlertDialog d = new BaseErrorDialog(mUiContext);
- d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
- d.setCancelable(false);
- d.setTitle(mUiContext.getText(R.string.android_system_label));
- d.setMessage(mUiContext.getText(R.string.system_error_manufacturer));
- d.setButton(DialogInterface.BUTTON_POSITIVE, mUiContext.getText(R.string.ok),
- obtainMessage(DISMISS_DIALOG_UI_MSG, d));
- d.show();
- }
- } break;
case SHOW_COMPAT_MODE_DIALOG_UI_MSG: {
synchronized (ActivityManagerService.this) {
ActivityRecord ar = (ActivityRecord) msg.obj;
@@ -2175,11 +1764,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
break;
}
- case DISMISS_DIALOG_UI_MSG: {
- final Dialog d = (Dialog) msg.obj;
- d.dismiss();
- break;
- }
case DISPATCH_PROCESSES_CHANGED_UI_MSG: {
dispatchProcessesChanged();
break;
@@ -2242,6 +1826,9 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
callbacks.finishBroadcast();
+ // We have to clean up the RemoteCallbackList here, because otherwise it will
+ // needlessly hold the enclosed callbacks until the remote process dies.
+ callbacks.kill();
} break;
case UPDATE_TIME_ZONE: {
synchronized (ActivityManagerService.this) {
@@ -2332,13 +1919,13 @@ public class ActivityManagerService extends IActivityManager.Stub
}
ActivityRecord root = (ActivityRecord)msg.obj;
- ProcessRecord process = root.app;
+ final WindowProcessController process = root.app;
if (process == null) {
return;
}
try {
- Context context = mContext.createPackageContext(process.info.packageName, 0);
+ Context context = mContext.createPackageContext(process.mInfo.packageName, 0);
String text = mContext.getString(R.string.heavy_weight_notification,
context.getApplicationInfo().loadLabel(context.getPackageManager()));
Notification notification =
@@ -2402,20 +1989,6 @@ public class ActivityManagerService extends IActivityManager.Stub
thread.start();
break;
}
- case IMMERSIVE_MODE_LOCK_MSG: {
- final boolean nextState = (msg.arg1 != 0);
- if (mUpdateLock.isHeld() != nextState) {
- if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE,
- "Applying new update lock state '" + nextState
- + "' for " + (ActivityRecord)msg.obj);
- if (nextState) {
- mUpdateLock.acquire();
- } else {
- mUpdateLock.release();
- }
- }
- break;
- }
case PERSIST_URI_GRANTS_MSG: {
writeGrantedUriPermissions();
break;
@@ -2438,18 +2011,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
break;
}
- case ENTER_ANIMATION_COMPLETE_MSG: {
- synchronized (ActivityManagerService.this) {
- ActivityRecord r = ActivityRecord.forTokenLocked((IBinder) msg.obj);
- if (r != null && r.app != null && r.app.thread != null) {
- try {
- r.app.thread.scheduleEnterAnimationComplete(r.appToken);
- } catch (RemoteException e) {
- }
- }
- }
- break;
- }
case FINISH_BOOTING_MSG: {
if (msg.arg1 != 0) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "FinishBooting");
@@ -2457,7 +2018,7 @@ public class ActivityManagerService extends IActivityManager.Stub
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}
if (msg.arg2 != 0) {
- enableScreenAfterBoot();
+ mAtmInternal.enableScreenAfterBoot(mBooted);
}
break;
}
@@ -2577,10 +2138,6 @@ public class ActivityManagerService extends IActivityManager.Stub
mMemWatchDumpUid = -1;
}
} break;
- case REPORT_TIME_TRACKER_MSG: {
- AppTimeTracker tracker = (AppTimeTracker)msg.obj;
- tracker.deliverResult(mContext);
- } break;
case SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG: {
IUiAutomationConnection connection = (IUiAutomationConnection) msg.obj;
try {
@@ -2595,32 +2152,6 @@ public class ActivityManagerService extends IActivityManager.Stub
case IDLE_UIDS_MSG: {
idleUids();
} break;
- case VR_MODE_CHANGE_MSG: {
- if (!mVrController.onVrModeChanged((ActivityRecord) msg.obj)) {
- return;
- }
- synchronized (ActivityManagerService.this) {
- final boolean disableNonVrUi = mVrController.shouldDisableNonVrUiLocked();
- mWindowManager.disableNonVrUi(disableNonVrUi);
- if (disableNonVrUi) {
- // If we are in a VR mode where Picture-in-Picture mode is unsupported,
- // then remove the pinned stack.
- mStackSupervisor.removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
- }
- }
- } break;
- case DISPATCH_SCREEN_AWAKE_MSG: {
- final boolean isAwake = msg.arg1 != 0;
- for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
- mScreenObservers.get(i).onAwakeStateChanged(isAwake);
- }
- } break;
- case DISPATCH_SCREEN_KEYGUARD_MSG: {
- final boolean isShowing = msg.arg1 != 0;
- for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
- mScreenObservers.get(i).onKeyguardStateChanged(isShowing);
- }
- } break;
case HANDLE_TRUST_STORAGE_UPDATE_MSG: {
synchronized (ActivityManagerService.this) {
for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {
@@ -2793,8 +2324,9 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized (this) {
ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
- app.persistent = true;
+ app.setPersistent(true);
app.pid = MY_PID;
+ app.getWindowProcessController().setPid(MY_PID);
app.maxAdj = ProcessList.SYSTEM_ADJ;
app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
synchronized (mPidsSelfLocked) {
@@ -2825,8 +2357,8 @@ public class ActivityManagerService extends IActivityManager.Stub
public void setWindowManager(WindowManagerService wm) {
synchronized (this) {
mWindowManager = wm;
+ mActivityTaskManager.setWindowManager(wm);
mStackSupervisor.setWindowManager(wm);
- mLockTaskController.setWindowManager(wm);
}
}
@@ -2930,10 +2462,17 @@ public class ActivityManagerService extends IActivityManager.Stub
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
+ private static ActivityTaskManagerService sAtm;
public Lifecycle(Context context) {
super(context);
- mService = new ActivityManagerService(context);
+ mService = new ActivityManagerService(context, sAtm);
+ }
+
+ public static ActivityManagerService startService(
+ SystemServiceManager ssm, ActivityTaskManagerService atm) {
+ sAtm = atm;
+ return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
}
@Override
@@ -3065,7 +2604,6 @@ public class ActivityManagerService extends IActivityManager.Stub
mContext = mInjector.getContext();
mUiContext = null;
GL_ES_VERSION = 0;
- mActivityStartController = null;
mAppErrors = null;
mAppWarnings = null;
mAppOpsService = mInjector.getAppOpsService(null, null);
@@ -3076,21 +2614,14 @@ public class ActivityManagerService extends IActivityManager.Stub
mHandler = null;
mHandlerThread = null;
mIntentFirewall = null;
- mKeyguardController = null;
mPermissionReviewRequired = false;
mProcessCpuThread = null;
mProcessStats = null;
mProviderMap = null;
- mRecentTasks = null;
mServices = null;
- mStackSupervisor = null;
mSystemThread = null;
- mTaskChangeNotificationController = null;
mUiHandler = injector.getUiHandler(null);
mUserController = null;
- mVrController = null;
- mLockTaskController = null;
- mLifecycleManager = null;
mProcStartHandlerThread = null;
mProcStartHandler = null;
mHiddenApiBlacklist = null;
@@ -3098,7 +2629,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// Note: This method is invoked on the main thread but may need to attach various
// handlers to other threads. So take care to be explicit about the looper.
- public ActivityManagerService(Context systemContext) {
+ public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
mInjector = new Injector();
mContext = systemContext;
@@ -3157,6 +2688,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mOnBattery = DEBUG_POWER ? true
: mBatteryStatsService.getActiveStatistics().getIsOnBattery();
mBatteryStatsService.getActiveStatistics().setCallback(this);
+ mOomAdjProfiler.batteryPowerChanged(mOnBattery);
mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
@@ -3166,8 +2698,6 @@ public class ActivityManagerService extends IActivityManager.Stub
mUserController = new UserController(this);
- mVrController = new VrController(this);
-
GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
@@ -3176,21 +2706,13 @@ public class ActivityManagerService extends IActivityManager.Stub
}
mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
- mTempConfig.setToDefaults();
- mTempConfig.setLocales(LocaleList.getDefault());
- mConfigurationSeq = mTempConfig.seq = 1;
- mStackSupervisor = createStackSupervisor();
- mStackSupervisor.onConfigurationChanged(mTempConfig);
- mKeyguardController = mStackSupervisor.getKeyguardController();
mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
- mTaskChangeNotificationController =
- new TaskChangeNotificationController(this, mStackSupervisor, mHandler);
- mActivityStartController = new ActivityStartController(this);
- mRecentTasks = createRecentTasks();
- mStackSupervisor.setRecentTasks(mRecentTasks);
- mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mHandler);
- mLifecycleManager = new ClientLifecycleManager();
+
+ mActivityTaskManager = atm;
+ mActivityTaskManager.setActivityManagerService(this);
+ mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
+ mStackSupervisor = mActivityTaskManager.mStackSupervisor;
mProcessCpuThread = new Thread("CpuTracker") {
@Override
@@ -3244,20 +2766,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
- protected ActivityStackSupervisor createStackSupervisor() {
- final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mHandler.getLooper());
- supervisor.initialize();
- return supervisor;
- }
-
- protected RecentTasks createRecentTasks() {
- return new RecentTasks(this, mStackSupervisor);
- }
-
- RecentTasks getRecentTasks() {
- return mRecentTasks;
- }
-
public void setSystemServiceManager(SystemServiceManager mgr) {
mSystemServiceManager = mgr;
}
@@ -3274,8 +2782,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mAppOpsService.publish(mContext);
Slog.d("AppOps", "AppOpsService published");
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
+ mActivityTaskManager.onActivityManagerInternalAdded();
// Wait for the synchronized block started in mProcessCpuThread,
- // so that any other acccess to mProcessCpuTracker from main thread
+ // so that any other access to mProcessCpuTracker from main thread
// will be blocked during mProcessCpuTracker initialization.
try {
mProcessCpuInitLatch.await();
@@ -3286,18 +2795,10 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- void onUserStoppedLocked(int userId) {
- mRecentTasks.unloadUserDataFromMemoryLocked(userId);
- mAllowAppSwitchUids.remove(userId);
- }
-
public void initPowerManagement() {
- mStackSupervisor.initPowerManagement();
+ mActivityTaskManager.onInitPowerManagement();
mBatteryStatsService.initPowerManagement();
mLocalPowerManager = LocalServices.getService(PowerManagerInternal.class);
- PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
- mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*");
- mVoiceWakeLock.setReferenceCounted(false);
}
private ArraySet<String> getBackgroundLaunchBroadcasts() {
@@ -3476,12 +2977,14 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized(mPidsSelfLocked) {
mOnBattery = DEBUG_POWER ? true : onBattery;
}
+ mOomAdjProfiler.batteryPowerChanged(onBattery);
}
}
@Override
public void batteryStatsReset() {
BinderCallsStatsService.reset();
+ mOomAdjProfiler.reset();
}
@Override
@@ -3552,195 +3055,23 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- /**
- * Update AMS states when an activity is resumed. This should only be called by
- * {@link ActivityStack#onActivityStateChanged(ActivityRecord, ActivityState, String)} when an
- * activity is resumed.
- */
- @GuardedBy("this")
- void setResumedActivityUncheckLocked(ActivityRecord r, String reason) {
- final TaskRecord task = r.getTask();
- if (task.isActivityTypeStandard()) {
- if (mCurAppTimeTracker != r.appTimeTracker) {
- // We are switching app tracking. Complete the current one.
- if (mCurAppTimeTracker != null) {
- mCurAppTimeTracker.stop();
- mHandler.obtainMessage(
- REPORT_TIME_TRACKER_MSG, mCurAppTimeTracker).sendToTarget();
- mStackSupervisor.clearOtherAppTimeTrackers(r.appTimeTracker);
- mCurAppTimeTracker = null;
- }
- if (r.appTimeTracker != null) {
- mCurAppTimeTracker = r.appTimeTracker;
- startTimeTrackingFocusedActivityLocked();
- }
- } else {
- startTimeTrackingFocusedActivityLocked();
- }
- } else {
- r.appTimeTracker = null;
- }
- // TODO: VI Maybe r.task.voiceInteractor || r.voiceInteractor != null
- // TODO: Probably not, because we don't want to resume voice on switching
- // back to this activity
- if (task.voiceInteractor != null) {
- startRunningVoiceLocked(task.voiceSession, r.info.applicationInfo.uid);
- } else {
- finishRunningVoiceLocked();
-
- if (mLastResumedActivity != null) {
- final IVoiceInteractionSession session;
-
- final TaskRecord lastResumedActivityTask = mLastResumedActivity.getTask();
- if (lastResumedActivityTask != null
- && lastResumedActivityTask.voiceSession != null) {
- session = lastResumedActivityTask.voiceSession;
- } else {
- session = mLastResumedActivity.voiceSession;
- }
-
- if (session != null) {
- // We had been in a voice interaction session, but now focused has
- // move to something different. Just finish the session, we can't
- // return to it and retain the proper state and synchronization with
- // the voice interaction service.
- finishVoiceTask(session);
- }
- }
- }
-
- if (mLastResumedActivity != null && r.userId != mLastResumedActivity.userId) {
- mUserController.sendForegroundProfileChanged(r.userId);
- }
- updateResumedAppTrace(r);
- mLastResumedActivity = r;
-
- mWindowManager.setFocusedApp(r.appToken, true);
-
- applyUpdateLockStateLocked(r);
- applyUpdateVrModeLocked(r);
-
- EventLogTags.writeAmSetResumedActivity(
- r == null ? -1 : r.userId,
- r == null ? "NULL" : r.shortComponentName,
- reason);
- }
-
- private void updateResumedAppTrace(@Nullable ActivityRecord resumed) {
- if (mTracedResumedActivity != null) {
- Trace.asyncTraceEnd(TRACE_TAG_ACTIVITY_MANAGER,
- constructResumedTraceName(mTracedResumedActivity.packageName), 0);
- }
- if (resumed != null) {
- Trace.asyncTraceBegin(TRACE_TAG_ACTIVITY_MANAGER,
- constructResumedTraceName(resumed.packageName), 0);
- }
- mTracedResumedActivity = resumed;
- }
-
- private String constructResumedTraceName(String packageName) {
- return "focused app: " + packageName;
- }
-
@Override
public void setFocusedStack(int stackId) {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedStack()");
- if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedStack: stackId=" + stackId);
- final long callingId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final ActivityStack stack = mStackSupervisor.getStack(stackId);
- if (stack == null) {
- Slog.w(TAG, "setFocusedStack: No stack with id=" + stackId);
- return;
- }
- final ActivityRecord r = stack.topRunningActivityLocked();
- if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, "setFocusedStack")) {
- mStackSupervisor.resumeFocusedStackTopActivityLocked();
- }
- }
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
- }
-
- @Override
- public void setFocusedTask(int taskId) {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedTask()");
- if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedTask: taskId=" + taskId);
- final long callingId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
- if (task == null) {
- return;
- }
- final ActivityRecord r = task.topRunningActivityLocked();
- if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, "setFocusedTask")) {
- mStackSupervisor.resumeFocusedStackTopActivityLocked();
- }
- }
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
+ mActivityTaskManager.setFocusedStack(stackId);
}
/** Sets the task stack listener that gets callbacks when a task stack changes. */
@Override
- public void registerTaskStackListener(ITaskStackListener listener) throws RemoteException {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
- "registerTaskStackListener()");
- mTaskChangeNotificationController.registerTaskStackListener(listener);
+ public void registerTaskStackListener(ITaskStackListener listener) {
+ mActivityTaskManager.registerTaskStackListener(listener);
}
/**
* Unregister a task stack listener so that it stops receiving callbacks.
*/
@Override
- public void unregisterTaskStackListener(ITaskStackListener listener) throws RemoteException {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
- "unregisterTaskStackListener()");
- mTaskChangeNotificationController.unregisterTaskStackListener(listener);
- }
-
- @Override
- public void notifyActivityDrawn(IBinder token) {
- if (DEBUG_VISIBILITY) Slog.d(TAG_VISIBILITY, "notifyActivityDrawn: token=" + token);
- synchronized (this) {
- ActivityRecord r = mStackSupervisor.isInAnyStackLocked(token);
- if (r != null) {
- r.getStack().notifyActivityDrawnLocked(r);
- }
- }
- }
-
- final void applyUpdateLockStateLocked(ActivityRecord r) {
- // Modifications to the UpdateLock state are done on our handler, outside
- // the activity manager's locks. The new state is determined based on the
- // state *now* of the relevant activity record. The object is passed to
- // the handler solely for logging detail, not to be consulted/modified.
- final boolean nextState = r != null && r.immersive;
- mHandler.sendMessage(
- mHandler.obtainMessage(IMMERSIVE_MODE_LOCK_MSG, (nextState) ? 1 : 0, 0, r));
- }
-
- final void applyUpdateVrModeLocked(ActivityRecord r) {
- // VR apps are expected to run in a main display. If an app is turning on VR for
- // itself, but lives in a dynamic stack, then make sure that it is moved to the main
- // fullscreen stack before enabling VR Mode.
- // TODO: The goal of this code is to keep the VR app on the main display. When the
- // stack implementation changes in the future, keep in mind that the use of the fullscreen
- // stack is a means to move the activity to the main display and a moveActivityToDisplay()
- // option would be a better choice here.
- if (r.requestedVrComponent != null && r.getDisplayId() != DEFAULT_DISPLAY) {
- Slog.i(TAG, "Moving " + r.shortComponentName + " from stack " + r.getStackId()
- + " to main stack for VR");
- final ActivityStack stack = mStackSupervisor.getDefaultDisplay().getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, r.getActivityType(), true /* toTop */);
- moveTaskToStack(r.getTask().taskId, stack.mStackId, true /* toTop */);
- }
- mHandler.sendMessage(
- mHandler.obtainMessage(VR_MODE_CHANGE_MSG, 0, 0, r));
+ public void unregisterTaskStackListener(ITaskStackListener listener) {
+ mActivityTaskManager.unregisterTaskStackListener(listener);
}
final void showAskCompatModeDialogLocked(ActivityRecord r) {
@@ -3769,7 +3100,7 @@ public class ActivityManagerService extends IActivityManager.Stub
String what, Object obj, ProcessRecord srcApp) {
app.lastActivityTime = now;
- if (app.activities.size() > 0 || app.recentTasks.size() > 0) {
+ if (app.hasActivitiesOrRecentTasks()) {
// Don't want to touch dependent processes that are hosting activities.
return index;
}
@@ -3816,7 +3147,7 @@ public class ActivityManagerService extends IActivityManager.Stub
int lrui = mLruProcesses.lastIndexOf(app);
if (lrui >= 0) {
if (!app.killed) {
- if (app.persistent) {
+ if (app.isPersistent()) {
Slog.w(TAG, "Removing persistent process that hasn't been killed: " + app);
} else {
Slog.wtfStack(TAG, "Removing process that hasn't been killed: " + app);
@@ -3840,8 +3171,8 @@ public class ActivityManagerService extends IActivityManager.Stub
final void updateLruProcessLocked(ProcessRecord app, boolean activityChange,
ProcessRecord client) {
- final boolean hasActivity = app.activities.size() > 0 || app.hasClientActivities
- || app.treatLikeActivity || app.recentTasks.size() > 0;
+ final boolean hasActivity = app.hasActivitiesOrRecentTasks() || app.hasClientActivities
+ || app.treatLikeActivity;
final boolean hasService = false; // not impl yet. app.services.size() > 0;
if (!activityChange && hasActivity) {
// The process has activities, so we are only allowing activity-based adjustments
@@ -3873,7 +3204,7 @@ public class ActivityManagerService extends IActivityManager.Stub
int lrui = mLruProcesses.lastIndexOf(app);
- if (app.persistent && lrui >= 0) {
+ if (app.isPersistent() && lrui >= 0) {
// We don't care about the position of persistent processes, as long as
// they are in the list.
if (DEBUG_LRU) Slog.d(TAG_LRU, "Not moving, persistent: " + app);
@@ -3945,7 +3276,7 @@ public class ActivityManagerService extends IActivityManager.Stub
int nextIndex;
if (hasActivity) {
final int N = mLruProcesses.size();
- if ((app.activities.size() == 0 || app.recentTasks.size() > 0)
+ if ((!app.hasActivities() || app.hasRecentTasks())
&& mLruProcessActivityStart < (N - 1)) {
// Process doesn't have activities, but has clients with
// activities... move it up, but one below the top (the top
@@ -4020,14 +3351,14 @@ public class ActivityManagerService extends IActivityManager.Stub
if (cr.binding != null && !cr.serviceDead && cr.binding.service != null
&& cr.binding.service.app != null
&& cr.binding.service.app.lruSeq != mLruSeq
- && !cr.binding.service.app.persistent) {
+ && !cr.binding.service.app.isPersistent()) {
nextIndex = updateLruProcessInternalLocked(cr.binding.service.app, now, nextIndex,
"service connection", cr, app);
}
}
for (int j=app.conProviders.size()-1; j>=0; j--) {
ContentProviderRecord cpr = app.conProviders.get(j).provider;
- if (cpr.proc != null && cpr.proc.lruSeq != mLruSeq && !cpr.proc.persistent) {
+ if (cpr.proc != null && cpr.proc.lruSeq != mLruSeq && !cpr.proc.isPersistent()) {
nextIndex = updateLruProcessInternalLocked(cpr.proc, now, nextIndex,
"provider reference", cpr, app);
}
@@ -4057,7 +3388,7 @@ public class ActivityManagerService extends IActivityManager.Stub
&& proc.lastCachedPss >= 4000) {
// Turn this condition on to cause killing to happen regularly, for testing.
if (proc.baseProcessTracker != null) {
- proc.baseProcessTracker.reportCachedKill(proc.pkgList, proc.lastCachedPss);
+ proc.baseProcessTracker.reportCachedKill(proc.pkgList.mPkgList, proc.lastCachedPss);
}
proc.kill(Long.toString(proc.lastCachedPss) + "k from cached", true);
} else if (proc != null && !keepIfLarge
@@ -4066,7 +3397,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (DEBUG_PSS) Slog.d(TAG_PSS, "May not keep " + proc + ": pss=" + proc.lastCachedPss);
if (proc.lastCachedPss >= mProcessList.getCachedRestoreThresholdKb()) {
if (proc.baseProcessTracker != null) {
- proc.baseProcessTracker.reportCachedKill(proc.pkgList, proc.lastCachedPss);
+ proc.baseProcessTracker.reportCachedKill(proc.pkgList.mPkgList, proc.lastCachedPss);
}
proc.kill(Long.toString(proc.lastCachedPss) + "k from cached", true);
}
@@ -4080,13 +3411,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- boolean isNextTransitionForward() {
- int transit = mWindowManager.getPendingAppTransition();
- return transit == TRANSIT_ACTIVITY_OPEN
- || transit == TRANSIT_TASK_OPEN
- || transit == TRANSIT_TASK_TO_FRONT;
- }
-
boolean startIsolatedProcess(String entryPoint, String[] entryPointArgs,
String processName, String abiOverride, int uid, Runnable crashHandler) {
synchronized(this) {
@@ -4379,7 +3703,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (app.info.isPrivilegedApp() &&
- DexManager.isPackageSelectedToRunOob(app.pkgList.keySet())) {
+ DexManager.isPackageSelectedToRunOob(app.pkgList.mPkgList.keySet())) {
runtimeFlags |= Zygote.ONLY_USE_SYSTEM_OAT_FILES;
}
@@ -4421,7 +3745,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
app.gids = gids;
- app.requiredAbi = requiredAbi;
+ app.setRequiredAbi(requiredAbi);
app.instructionSet = instructionSet;
// the per-user SELinux context must be set
@@ -4632,7 +3956,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// Ignore
}
- if (app.persistent) {
+ if (app.isPersistent()) {
Watchdog.getInstance().processStarted(app.processName, pid);
}
@@ -4691,7 +4015,7 @@ public class ActivityManagerService extends IActivityManager.Stub
"updateUsageStats: comp=" + component + "res=" + resumed);
final BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
StatsLog.write(StatsLog.ACTIVITY_FOREGROUND_STATE_CHANGED,
- component.app.uid, component.realActivity.getPackageName(),
+ component.app.mUid, component.realActivity.getPackageName(),
component.realActivity.getShortClassName(), resumed ?
StatsLog.ACTIVITY_FOREGROUND_STATE_CHANGED__STATE__FOREGROUND :
StatsLog.ACTIVITY_FOREGROUND_STATE_CHANGED__STATE__BACKGROUND);
@@ -4702,7 +4026,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
synchronized (stats) {
- stats.noteActivityResumedLocked(component.app.uid);
+ stats.noteActivityResumedLocked(component.app.mUid);
}
} else {
if (mUsageStatsService != null) {
@@ -4710,7 +4034,7 @@ public class ActivityManagerService extends IActivityManager.Stub
UsageEvents.Event.MOVE_TO_BACKGROUND);
}
synchronized (stats) {
- stats.noteActivityPausedLocked(component.app.uid);
+ stats.noteActivityPausedLocked(component.app.mUid);
}
}
}
@@ -4749,7 +4073,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// For ANR debugging to verify if the user activity is the one that actually
// launched.
final String myReason = reason + ":" + userId + ":" + resolvedUserId;
- mActivityStartController.startHomeActivity(intent, aInfo, myReason);
+ mActivityTaskManager.getActivityStartController().startHomeActivity(intent, aInfo, myReason);
}
} else {
Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());
@@ -4794,30 +4118,13 @@ public class ActivityManagerService extends IActivityManager.Stub
return mCompatModePackages.compatibilityInfoForPackageLocked(ai);
}
- void enforceNotIsolatedCaller(String caller) {
+ private void enforceNotIsolatedCaller(String caller) {
if (UserHandle.isIsolated(Binder.getCallingUid())) {
throw new SecurityException("Isolated process not allowed to call " + caller);
}
}
@Override
- public int getFrontActivityScreenCompatMode() {
- enforceNotIsolatedCaller("getFrontActivityScreenCompatMode");
- synchronized (this) {
- return mCompatModePackages.getFrontActivityScreenCompatModeLocked();
- }
- }
-
- @Override
- public void setFrontActivityScreenCompatMode(int mode) {
- enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
- "setFrontActivityScreenCompatMode");
- synchronized (this) {
- mCompatModePackages.setFrontActivityScreenCompatModeLocked(mode);
- }
- }
-
- @Override
public int getPackageScreenCompatMode(String packageName) {
enforceNotIsolatedCaller("getPackageScreenCompatMode");
synchronized (this) {
@@ -5154,46 +4461,20 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public final int startActivity(IApplicationThread caller, String callingPackage,
+ public int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
- return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
- resultWho, requestCode, startFlags, profilerInfo, bOptions,
- UserHandle.getCallingUserId());
+ return mActivityTaskManager.startActivity(caller, callingPackage, intent, resolvedType,
+ resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions);
}
@Override
public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
- return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
- resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
- true /*validateIncomingUser*/);
- }
-
- public final int startActivityAsUser(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
- boolean validateIncomingUser) {
- enforceNotIsolatedCaller("startActivity");
-
- userId = mActivityStartController.checkTargetUser(userId, validateIncomingUser,
- Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
-
- // TODO: Switch to user app stacks here.
- return mActivityStartController.obtainStarter(intent, "startActivityAsUser")
- .setCaller(caller)
- .setCallingPackage(callingPackage)
- .setResolvedType(resolvedType)
- .setResultTo(resultTo)
- .setResultWho(resultWho)
- .setRequestCode(requestCode)
- .setStartFlags(startFlags)
- .setProfilerInfo(profilerInfo)
- .setActivityOptions(bOptions)
- .setMayWait(userId)
- .execute();
-
+ return mActivityTaskManager.startActivityAsUser(caller, callingPackage, intent,
+ resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
+ userId);
}
final int startActivityAsUserEmpty(IApplicationThread caller, String callingPackage,
@@ -5232,515 +4513,20 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public final int startActivityAsCaller(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, boolean ignoreTargetSecurity,
- int userId) {
-
- // This is very dangerous -- it allows you to perform a start activity (including
- // permission grants) as any app that may launch one of your own activities. So
- // we will only allow this to be done from activities that are part of the core framework,
- // and then only when they are running as the system.
- final ActivityRecord sourceRecord;
- final int targetUid;
- final String targetPackage;
- final boolean isResolver;
- synchronized (this) {
- if (resultTo == null) {
- throw new SecurityException("Must be called from an activity");
- }
- sourceRecord = mStackSupervisor.isInAnyStackLocked(resultTo);
- if (sourceRecord == null) {
- throw new SecurityException("Called with bad activity token: " + resultTo);
- }
- if (!sourceRecord.info.packageName.equals("android")) {
- throw new SecurityException(
- "Must be called from an activity that is declared in the android package");
- }
- if (sourceRecord.app == null) {
- throw new SecurityException("Called without a process attached to activity");
- }
- if (UserHandle.getAppId(sourceRecord.app.uid) != SYSTEM_UID) {
- // This is still okay, as long as this activity is running under the
- // uid of the original calling activity.
- if (sourceRecord.app.uid != sourceRecord.launchedFromUid) {
- throw new SecurityException(
- "Calling activity in uid " + sourceRecord.app.uid
- + " must be system uid or original calling uid "
- + sourceRecord.launchedFromUid);
- }
- }
- if (ignoreTargetSecurity) {
- if (intent.getComponent() == null) {
- throw new SecurityException(
- "Component must be specified with ignoreTargetSecurity");
- }
- if (intent.getSelector() != null) {
- throw new SecurityException(
- "Selector not allowed with ignoreTargetSecurity");
- }
- }
- targetUid = sourceRecord.launchedFromUid;
- targetPackage = sourceRecord.launchedFromPackage;
- isResolver = sourceRecord.isResolverOrChildActivity();
- }
-
- if (userId == UserHandle.USER_NULL) {
- userId = UserHandle.getUserId(sourceRecord.app.uid);
- }
-
- // TODO: Switch to user app stacks here.
- try {
- return mActivityStartController.obtainStarter(intent, "startActivityAsCaller")
- .setCallingUid(targetUid)
- .setCallingPackage(targetPackage)
- .setResolvedType(resolvedType)
- .setResultTo(resultTo)
- .setResultWho(resultWho)
- .setRequestCode(requestCode)
- .setStartFlags(startFlags)
- .setActivityOptions(bOptions)
- .setMayWait(userId)
- .setIgnoreTargetSecurity(ignoreTargetSecurity)
- .setFilterCallingUid(isResolver ? 0 /* system */ : targetUid)
- .execute();
- } catch (SecurityException e) {
- // XXX need to figure out how to propagate to original app.
- // A SecurityException here is generally actually a fault of the original
- // calling activity (such as a fairly granting permissions), so propagate it
- // back to them.
- /*
- StringBuilder msg = new StringBuilder();
- msg.append("While launching");
- msg.append(intent.toString());
- msg.append(": ");
- msg.append(e.getMessage());
- */
- throw e;
- }
- }
-
- @Override
- public final WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
- enforceNotIsolatedCaller("startActivityAndWait");
- userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
- userId, false, ALLOW_FULL_ONLY, "startActivityAndWait", null);
- WaitResult res = new WaitResult();
- // TODO: Switch to user app stacks here.
- mActivityStartController.obtainStarter(intent, "startActivityAndWait")
- .setCaller(caller)
- .setCallingPackage(callingPackage)
- .setResolvedType(resolvedType)
- .setResultTo(resultTo)
- .setResultWho(resultWho)
- .setRequestCode(requestCode)
- .setStartFlags(startFlags)
- .setActivityOptions(bOptions)
- .setMayWait(userId)
- .setProfilerInfo(profilerInfo)
- .setWaitResult(res)
- .execute();
- return res;
- }
-
- @Override
- public final int startActivityWithConfig(IApplicationThread caller, String callingPackage,
- Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
- int startFlags, Configuration config, Bundle bOptions, int userId) {
- enforceNotIsolatedCaller("startActivityWithConfig");
- userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
- userId, false, ALLOW_FULL_ONLY, "startActivityWithConfig", null);
- // TODO: Switch to user app stacks here.
- return mActivityStartController.obtainStarter(intent, "startActivityWithConfig")
- .setCaller(caller)
- .setCallingPackage(callingPackage)
- .setResolvedType(resolvedType)
- .setResultTo(resultTo)
- .setResultWho(resultWho)
- .setRequestCode(requestCode)
- .setStartFlags(startFlags)
- .setGlobalConfiguration(config)
- .setActivityOptions(bOptions)
- .setMayWait(userId)
- .execute();
- }
-
- @Override
- public int startActivityIntentSender(IApplicationThread caller, IIntentSender target,
- IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo,
- String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions)
- throws TransactionTooLargeException {
- enforceNotIsolatedCaller("startActivityIntentSender");
- // Refuse possible leaked file descriptors
- if (fillInIntent != null && fillInIntent.hasFileDescriptors()) {
- throw new IllegalArgumentException("File descriptors passed in Intent");
- }
-
- if (!(target instanceof PendingIntentRecord)) {
- throw new IllegalArgumentException("Bad PendingIntent object");
- }
-
- PendingIntentRecord pir = (PendingIntentRecord)target;
-
- synchronized (this) {
- // If this is coming from the currently resumed activity, it is
- // effectively saying that app switches are allowed at this point.
- final ActivityStack stack = getFocusedStack();
- if (stack.mResumedActivity != null &&
- stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) {
- mAppSwitchesAllowedTime = 0;
- }
- }
- int ret = pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null,
- resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions);
- return ret;
- }
-
- @Override
- public int startVoiceActivity(String callingPackage, int callingPid, int callingUid,
- Intent intent, String resolvedType, IVoiceInteractionSession session,
- IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo,
- Bundle bOptions, int userId) {
- enforceCallingPermission(BIND_VOICE_INTERACTION, "startVoiceActivity()");
- if (session == null || interactor == null) {
- throw new NullPointerException("null session or interactor");
- }
- userId = mUserController.handleIncomingUser(callingPid, callingUid, userId, false,
- ALLOW_FULL_ONLY, "startVoiceActivity", null);
- // TODO: Switch to user app stacks here.
- return mActivityStartController.obtainStarter(intent, "startVoiceActivity")
- .setCallingUid(callingUid)
- .setCallingPackage(callingPackage)
- .setResolvedType(resolvedType)
- .setVoiceSession(session)
- .setVoiceInteractor(interactor)
- .setStartFlags(startFlags)
- .setProfilerInfo(profilerInfo)
- .setActivityOptions(bOptions)
- .setMayWait(userId)
- .execute();
- }
-
- @Override
- public int startAssistantActivity(String callingPackage, int callingPid, int callingUid,
- Intent intent, String resolvedType, Bundle bOptions, int userId) {
- enforceCallingPermission(BIND_VOICE_INTERACTION, "startAssistantActivity()");
- userId = mUserController.handleIncomingUser(callingPid, callingUid, userId, false,
- ALLOW_FULL_ONLY, "startAssistantActivity", null);
-
- return mActivityStartController.obtainStarter(intent, "startAssistantActivity")
- .setCallingUid(callingUid)
- .setCallingPackage(callingPackage)
- .setResolvedType(resolvedType)
- .setActivityOptions(bOptions)
- .setMayWait(userId)
- .execute();
+ public final int startActivityFromRecents(int taskId, Bundle bOptions) {
+ return mActivityTaskManager.startActivityFromRecents(taskId, bOptions);
}
@Override
public void startRecentsActivity(Intent intent, IAssistDataReceiver assistDataReceiver,
- IRecentsAnimationRunner recentsAnimationRunner) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()");
- final int callingPid = Binder.getCallingPid();
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final ComponentName recentsComponent = mRecentTasks.getRecentsComponent();
- final int recentsUid = mRecentTasks.getRecentsComponentUid();
-
- // Start a new recents animation
- final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor,
- mActivityStartController, mWindowManager, mUserController, callingPid);
- anim.startRecentsActivity(intent, recentsAnimationRunner, recentsComponent,
- recentsUid, assistDataReceiver);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
+ IRecentsAnimationRunner recentsAnimationRunner) {
+ mActivityTaskManager.startRecentsActivity(
+ intent, assistDataReceiver, recentsAnimationRunner);
}
@Override
public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "cancelRecentsAnimation()");
- final long callingUid = Binder.getCallingUid();
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- // Cancel the recents animation synchronously (do not hold the WM lock)
- mWindowManager.cancelRecentsAnimationSynchronously(restoreHomeStackPosition
- ? REORDER_MOVE_TO_ORIGINAL_POSITION
- : REORDER_KEEP_IN_PLACE, "cancelRecentsAnimation/uid=" + callingUid);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public void startLocalVoiceInteraction(IBinder callingActivity, Bundle options)
- throws RemoteException {
- Slog.i(TAG, "Activity tried to startVoiceInteraction");
- synchronized (this) {
- ActivityRecord activity = getFocusedStack().getTopActivity();
- if (ActivityRecord.forTokenLocked(callingActivity) != activity) {
- throw new SecurityException("Only focused activity can call startVoiceInteraction");
- }
- if (mRunningVoice != null || activity.getTask().voiceSession != null
- || activity.voiceSession != null) {
- Slog.w(TAG, "Already in a voice interaction, cannot start new voice interaction");
- return;
- }
- if (activity.pendingVoiceInteractionStart) {
- Slog.w(TAG, "Pending start of voice interaction already.");
- return;
- }
- activity.pendingVoiceInteractionStart = true;
- }
- LocalServices.getService(VoiceInteractionManagerInternal.class)
- .startLocalVoiceInteraction(callingActivity, options);
- }
-
- @Override
- public void stopLocalVoiceInteraction(IBinder callingActivity) throws RemoteException {
- LocalServices.getService(VoiceInteractionManagerInternal.class)
- .stopLocalVoiceInteraction(callingActivity);
- }
-
- @Override
- public boolean supportsLocalVoiceInteraction() throws RemoteException {
- return LocalServices.getService(VoiceInteractionManagerInternal.class)
- .supportsLocalVoiceInteraction();
- }
-
- @GuardedBy("this")
- void onLocalVoiceInteractionStartedLocked(IBinder activity,
- IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
- ActivityRecord activityToCallback = ActivityRecord.forTokenLocked(activity);
- if (activityToCallback == null) return;
- activityToCallback.setVoiceSessionLocked(voiceSession);
-
- // Inform the activity
- try {
- activityToCallback.app.thread.scheduleLocalVoiceInteractionStarted(activity,
- voiceInteractor);
- long token = Binder.clearCallingIdentity();
- try {
- startRunningVoiceLocked(voiceSession, activityToCallback.appInfo.uid);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- // TODO: VI Should we cache the activity so that it's easier to find later
- // rather than scan through all the stacks and activities?
- } catch (RemoteException re) {
- activityToCallback.clearVoiceSessionLocked();
- // TODO: VI Should this terminate the voice session?
- }
- }
-
- @Override
- public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) {
- synchronized (this) {
- if (mRunningVoice != null && mRunningVoice.asBinder() == session.asBinder()) {
- if (keepAwake) {
- mVoiceWakeLock.acquire();
- } else {
- mVoiceWakeLock.release();
- }
- }
- }
- }
-
- @Override
- public boolean startNextMatchingActivity(IBinder callingActivity,
- Intent intent, Bundle bOptions) {
- // Refuse possible leaked file descriptors
- if (intent != null && intent.hasFileDescriptors() == true) {
- throw new IllegalArgumentException("File descriptors passed in Intent");
- }
- SafeActivityOptions options = SafeActivityOptions.fromBundle(bOptions);
-
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(callingActivity);
- if (r == null) {
- SafeActivityOptions.abort(options);
- return false;
- }
- if (r.app == null || r.app.thread == null) {
- // The caller is not running... d'oh!
- SafeActivityOptions.abort(options);
- return false;
- }
- intent = new Intent(intent);
- // The caller is not allowed to change the data.
- intent.setDataAndType(r.intent.getData(), r.intent.getType());
- // And we are resetting to find the next component...
- intent.setComponent(null);
-
- final boolean debug = ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);
-
- ActivityInfo aInfo = null;
- try {
- List<ResolveInfo> resolves =
- AppGlobals.getPackageManager().queryIntentActivities(
- intent, r.resolvedType,
- PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS,
- UserHandle.getCallingUserId()).getList();
-
- // Look for the original activity in the list...
- final int N = resolves != null ? resolves.size() : 0;
- for (int i=0; i<N; i++) {
- ResolveInfo rInfo = resolves.get(i);
- if (rInfo.activityInfo.packageName.equals(r.packageName)
- && rInfo.activityInfo.name.equals(r.info.name)) {
- // We found the current one... the next matching is
- // after it.
- i++;
- if (i<N) {
- aInfo = resolves.get(i).activityInfo;
- }
- if (debug) {
- Slog.v(TAG, "Next matching activity: found current " + r.packageName
- + "/" + r.info.name);
- Slog.v(TAG, "Next matching activity: next is " + ((aInfo == null)
- ? "null" : aInfo.packageName + "/" + aInfo.name));
- }
- break;
- }
- }
- } catch (RemoteException e) {
- }
-
- if (aInfo == null) {
- // Nobody who is next!
- SafeActivityOptions.abort(options);
- if (debug) Slog.d(TAG, "Next matching activity: nothing found");
- return false;
- }
-
- intent.setComponent(new ComponentName(
- aInfo.applicationInfo.packageName, aInfo.name));
- intent.setFlags(intent.getFlags()&~(
- Intent.FLAG_ACTIVITY_FORWARD_RESULT|
- Intent.FLAG_ACTIVITY_CLEAR_TOP|
- Intent.FLAG_ACTIVITY_MULTIPLE_TASK|
- FLAG_ACTIVITY_NEW_TASK));
-
- // Okay now we need to start the new activity, replacing the
- // currently running activity. This is a little tricky because
- // we want to start the new one as if the current one is finished,
- // but not finish the current one first so that there is no flicker.
- // And thus...
- final boolean wasFinishing = r.finishing;
- r.finishing = true;
-
- // Propagate reply information over to the new activity.
- final ActivityRecord resultTo = r.resultTo;
- final String resultWho = r.resultWho;
- final int requestCode = r.requestCode;
- r.resultTo = null;
- if (resultTo != null) {
- resultTo.removeResultsLocked(r, resultWho, requestCode);
- }
-
- final long origId = Binder.clearCallingIdentity();
- // TODO(b/64750076): Check if calling pid should really be -1.
- final int res = mActivityStartController
- .obtainStarter(intent, "startNextMatchingActivity")
- .setCaller(r.app.thread)
- .setResolvedType(r.resolvedType)
- .setActivityInfo(aInfo)
- .setResultTo(resultTo != null ? resultTo.appToken : null)
- .setResultWho(resultWho)
- .setRequestCode(requestCode)
- .setCallingPid(-1)
- .setCallingUid(r.launchedFromUid)
- .setCallingPackage(r.launchedFromPackage)
- .setRealCallingPid(-1)
- .setRealCallingUid(r.launchedFromUid)
- .setActivityOptions(options)
- .execute();
- Binder.restoreCallingIdentity(origId);
-
- r.finishing = wasFinishing;
- if (res != ActivityManager.START_SUCCESS) {
- return false;
- }
- return true;
- }
- }
-
- @Override
- public final int startActivityFromRecents(int taskId, Bundle bOptions) {
- enforceCallerIsRecentsOrHasPermission(START_TASKS_FROM_RECENTS,
- "startActivityFromRecents()");
-
- final int callingPid = Binder.getCallingPid();
- final int callingUid = Binder.getCallingUid();
- final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(bOptions);
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- return mStackSupervisor.startActivityFromRecents(callingPid, callingUid, taskId,
- safeOptions);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public final int startActivities(IApplicationThread caller, String callingPackage,
- Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions,
- int userId) {
- final String reason = "startActivities";
- enforceNotIsolatedCaller(reason);
- userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
- userId, false, ALLOW_FULL_ONLY, reason, null);
- // TODO: Switch to user app stacks here.
- int ret = mActivityStartController.startActivities(caller, -1, callingPackage,
- intents, resolvedTypes, resultTo, SafeActivityOptions.fromBundle(bOptions), userId,
- reason);
- return ret;
- }
-
- @Override
- public void reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle) {
- synchronized (this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return;
- }
- r.reportFullyDrawnLocked(restoredFromBundle);
- }
- }
-
- @Override
- public void setRequestedOrientation(IBinder token, int requestedOrientation) {
- synchronized (this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return;
- }
- final long origId = Binder.clearCallingIdentity();
- try {
- r.setRequestedOrientation(requestedOrientation);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- @Override
- public int getRequestedOrientation(IBinder token) {
- synchronized (this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
- }
- return r.getRequestedOrientation();
- }
+ mActivityTaskManager.cancelRecentsAnimation(restoreHomeStackPosition);
}
/**
@@ -5756,76 +4542,12 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public final boolean finishActivity(IBinder token, int resultCode, Intent resultData,
int finishTask) {
- // Refuse possible leaked file descriptors
- if (resultData != null && resultData.hasFileDescriptors() == true) {
- throw new IllegalArgumentException("File descriptors passed in Intent");
- }
-
- synchronized(this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return true;
- }
- // Keep track of the root activity of the task before we finish it
- TaskRecord tr = r.getTask();
- ActivityRecord rootR = tr.getRootActivity();
- if (rootR == null) {
- Slog.w(TAG, "Finishing task with all activities already finished");
- }
- // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps can
- // finish.
- if (mLockTaskController.activityBlockedFromFinish(r)) {
- return false;
- }
-
- if (mController != null) {
- // Find the first activity that is not finishing.
- ActivityRecord next = r.getStack().topRunningActivityLocked(token, 0);
- if (next != null) {
- // ask watcher if this is allowed
- boolean resumeOK = true;
- try {
- resumeOK = mController.activityResuming(next.packageName);
- } catch (RemoteException e) {
- mController = null;
- Watchdog.getInstance().setActivityController(null);
- }
+ return mActivityTaskManager.finishActivity(token, resultCode, resultData, finishTask);
+ }
- if (!resumeOK) {
- Slog.i(TAG, "Not finishing activity because controller resumed");
- return false;
- }
- }
- }
- final long origId = Binder.clearCallingIdentity();
- try {
- boolean res;
- final boolean finishWithRootActivity =
- finishTask == Activity.FINISH_TASK_WITH_ROOT_ACTIVITY;
- if (finishTask == Activity.FINISH_TASK_WITH_ACTIVITY
- || (finishWithRootActivity && r == rootR)) {
- // If requested, remove the task that is associated to this activity only if it
- // was the root activity in the task. The result code and data is ignored
- // because we don't support returning them across task boundaries. Also, to
- // keep backwards compatibility we remove the task from recents when finishing
- // task with root activity.
- res = mStackSupervisor.removeTaskByIdLocked(tr.taskId, false,
- finishWithRootActivity, "finish-activity");
- if (!res) {
- Slog.i(TAG, "Removing task failed to finish activity");
- }
- } else {
- res = tr.getStack().requestFinishActivityLocked(token, resultCode,
- resultData, "app-request", true);
- if (!res) {
- Slog.i(TAG, "Failed to finish by app-request");
- }
- }
- return res;
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
+ @Override
+ public void setRequestedOrientation(IBinder token, int requestedOrientation) {
+ mActivityTaskManager.setRequestedOrientation(token, requestedOrientation);
}
@Override
@@ -5846,14 +4568,7 @@ public class ActivityManagerService extends IActivityManager.Stub
return;
}
- ArrayList<ActivityRecord> activities = new ArrayList<>(proc.activities);
- for (int i = 0; i < activities.size(); i++) {
- ActivityRecord r = activities.get(i);
- if (!r.finishing && r.isInStackLocked()) {
- r.getStack().finishActivityLocked(r, Activity.RESULT_CANCELED,
- null, "finish-heavy", true);
- }
- }
+ proc.getWindowProcessController().finishActivities();
mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG,
proc.userId, 0));
@@ -5879,117 +4594,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- @Override
- public final void finishSubActivity(IBinder token, String resultWho,
- int requestCode) {
- synchronized(this) {
- final long origId = Binder.clearCallingIdentity();
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r != null) {
- r.getStack().finishSubActivityLocked(r, resultWho, requestCode);
- }
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public boolean finishActivityAffinity(IBinder token) {
- synchronized(this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return false;
- }
-
- // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps
- // can finish.
- final TaskRecord task = r.getTask();
- if (mLockTaskController.activityBlockedFromFinish(r)) {
- return false;
- }
- return task.getStack().finishActivityAffinityLocked(r);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- @Override
- public void finishVoiceTask(IVoiceInteractionSession session) {
- synchronized (this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- // TODO: VI Consider treating local voice interactions and voice tasks
- // differently here
- mStackSupervisor.finishVoiceTask(session);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- }
-
- @Override
- public boolean releaseActivityInstance(IBinder token) {
- synchronized(this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return false;
- }
- return r.getStack().safelyDestroyActivityLocked(r, "app-req");
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- @Override
- public void releaseSomeActivities(IApplicationThread appInt) {
- synchronized(this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- ProcessRecord app = getRecordForAppLocked(appInt);
- mStackSupervisor.releaseSomeActivitiesLocked(app, "low-mem");
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- @Override
- public boolean willActivityBeVisible(IBinder token) {
- synchronized(this) {
- ActivityStack stack = ActivityRecord.getStackLocked(token);
- if (stack != null) {
- return stack.willActivityBeVisibleLocked(token);
- }
- return false;
- }
- }
-
- @Override
- public void overridePendingTransition(IBinder token, String packageName,
- int enterAnim, int exitAnim) {
- synchronized(this) {
- ActivityRecord self = ActivityRecord.isInStackLocked(token);
- if (self == null) {
- return;
- }
-
- final long origId = Binder.clearCallingIdentity();
-
- if (self.isState(ActivityState.RESUMED, ActivityState.PAUSING)) {
- mWindowManager.overridePendingAppTransition(packageName,
- enterAnim, exitAnim, null);
- }
-
- Binder.restoreCallingIdentity(origId);
- }
- }
-
/**
* Main function for removing an existing process from the activity manager
* as a result of that process going away. Clears out all connections
@@ -6013,11 +4617,10 @@ public class ActivityManagerService extends IActivityManager.Stub
}
// Remove this application's activities from active lists.
- boolean hasVisibleActivities = mStackSupervisor.handleAppDiedLocked(app);
+ boolean hasVisibleActivities = mStackSupervisor.handleAppDiedLocked(app.getWindowProcessController());
app.clearRecentTasks();
-
- app.activities.clear();
+ app.clearActivities();
if (app.instr != null) {
Slog.w(TAG, "Crash of app " + app.processName
@@ -6090,7 +4693,7 @@ public class ActivityManagerService extends IActivityManager.Stub
for (int i=mLruProcesses.size()-1; i>=0; i--) {
ProcessRecord rec = mLruProcesses.get(i);
if (rec.thread != null
- && rec.setProcState >= ActivityManager.PROCESS_STATE_CACHED_ACTIVITY) {
+ && rec.setProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
haveBg = true;
break;
}
@@ -6265,57 +4868,20 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- boolean useTombstonedForJavaTraces = false;
- File tracesFile;
-
- final String tracesDirProp = SystemProperties.get("dalvik.vm.stack-trace-dir", "");
- if (tracesDirProp.isEmpty()) {
- // When dalvik.vm.stack-trace-dir is not set, we are using the "old" trace
- // dumping scheme. All traces are written to a global trace file (usually
- // "/data/anr/traces.txt") so the code below must take care to unlink and recreate
- // the file if requested.
- //
- // This mode of operation will be removed in the near future.
-
-
- String globalTracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
- if (globalTracesPath.isEmpty()) {
- Slog.w(TAG, "dumpStackTraces: no trace path configured");
- return null;
- }
-
- tracesFile = new File(globalTracesPath);
- try {
- if (clearTraces && tracesFile.exists()) {
- tracesFile.delete();
- }
+ final File tracesDir = new File(ANR_TRACE_DIR);
+ // Each set of ANR traces is written to a separate file and dumpstate will process
+ // all such files and add them to a captured bug report if they're recent enough.
+ maybePruneOldTraces(tracesDir);
- tracesFile.createNewFile();
- FileUtils.setPermissions(globalTracesPath, 0666, -1, -1); // -rw-rw-rw-
- } catch (IOException e) {
- Slog.w(TAG, "Unable to prepare ANR traces file: " + tracesFile, e);
- return null;
- }
- } else {
- File tracesDir = new File(tracesDirProp);
- // When dalvik.vm.stack-trace-dir is set, we use the "new" trace dumping scheme.
- // Each set of ANR traces is written to a separate file and dumpstate will process
- // all such files and add them to a captured bug report if they're recent enough.
- maybePruneOldTraces(tracesDir);
-
- // NOTE: We should consider creating the file in native code atomically once we've
- // gotten rid of the old scheme of dumping and lot of the code that deals with paths
- // can be removed.
- tracesFile = createAnrDumpFile(tracesDir);
- if (tracesFile == null) {
- return null;
- }
-
- useTombstonedForJavaTraces = true;
+ // NOTE: We should consider creating the file in native code atomically once we've
+ // gotten rid of the old scheme of dumping and lot of the code that deals with paths
+ // can be removed.
+ File tracesFile = createAnrDumpFile(tracesDir);
+ if (tracesFile == null) {
+ return null;
}
- dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, nativePids, extraPids,
- useTombstonedForJavaTraces);
+ dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, nativePids, extraPids);
return tracesFile;
}
@@ -6352,79 +4918,18 @@ public class ActivityManagerService extends IActivityManager.Stub
* since it's the system_server that creates trace files for most ANRs.
*/
private static void maybePruneOldTraces(File tracesDir) {
- final long now = System.currentTimeMillis();
- final File[] traceFiles = tracesDir.listFiles();
-
- if (traceFiles != null) {
- for (File file : traceFiles) {
- if ((now - file.lastModified()) > DAY_IN_MILLIS) {
- if (!file.delete()) {
- Slog.w(TAG, "Unable to prune stale trace file: " + file);
- }
- }
- }
- }
- }
-
- /**
- * Legacy code, do not use. Existing users will be deleted.
- *
- * @deprecated
- */
- @Deprecated
- public static class DumpStackFileObserver extends FileObserver {
- // Keep in sync with frameworks/native/cmds/dumpstate/utils.cpp
- private static final int TRACE_DUMP_TIMEOUT_MS = 10000; // 10 seconds
-
- private final String mTracesPath;
- private boolean mClosed;
-
- public DumpStackFileObserver(String tracesPath) {
- super(tracesPath, FileObserver.CLOSE_WRITE);
- mTracesPath = tracesPath;
- }
-
- @Override
- public synchronized void onEvent(int event, String path) {
- mClosed = true;
- notify();
- }
+ final File[] files = tracesDir.listFiles();
+ if (files == null) return;
- public long dumpWithTimeout(int pid, long timeout) {
- sendSignal(pid, SIGNAL_QUIT);
- final long start = SystemClock.elapsedRealtime();
-
- final long waitTime = Math.min(timeout, TRACE_DUMP_TIMEOUT_MS);
- synchronized (this) {
- try {
- wait(waitTime); // Wait for traces file to be closed.
- } catch (InterruptedException e) {
- Slog.wtf(TAG, e);
+ final int max = SystemProperties.getInt("tombstoned.max_anr_count", 64);
+ final long now = System.currentTimeMillis();
+ Arrays.sort(files, Comparator.comparingLong(File::lastModified).reversed());
+ for (int i = 0; i < files.length; ++i) {
+ if (i > max || (now - files[i].lastModified()) > DAY_IN_MILLIS) {
+ if (!files[i].delete()) {
+ Slog.w(TAG, "Unable to prune stale trace file: " + files[i]);
}
}
-
- // This avoids a corner case of passing a negative time to the native
- // trace in case we've already hit the overall timeout.
- final long timeWaited = SystemClock.elapsedRealtime() - start;
- if (timeWaited >= timeout) {
- return timeWaited;
- }
-
- if (!mClosed) {
- Slog.w(TAG, "Didn't see close of " + mTracesPath + " for pid " + pid +
- ". Attempting native stack collection.");
-
- final long nativeDumpTimeoutMs = Math.min(
- NATIVE_DUMP_TIMEOUT_MS, timeout - timeWaited);
-
- Debug.dumpNativeBacktraceToFileTimeout(pid, mTracesPath,
- (int) (nativeDumpTimeoutMs / 1000));
- }
-
- final long end = SystemClock.elapsedRealtime();
- mClosed = false;
-
- return (end - start);
}
}
@@ -6445,201 +4950,79 @@ public class ActivityManagerService extends IActivityManager.Stub
return SystemClock.elapsedRealtime() - timeStart;
}
- private static void dumpStackTraces(String tracesFile, ArrayList<Integer> firstPids,
- ArrayList<Integer> nativePids, ArrayList<Integer> extraPids,
- boolean useTombstonedForJavaTraces) {
+ public static void dumpStackTraces(String tracesFile, ArrayList<Integer> firstPids,
+ ArrayList<Integer> nativePids, ArrayList<Integer> extraPids) {
// We don't need any sort of inotify based monitoring when we're dumping traces via
// tombstoned. Data is piped to an "intercept" FD installed in tombstoned so we're in full
// control of all writes to the file in question.
- final DumpStackFileObserver observer;
- if (useTombstonedForJavaTraces) {
- observer = null;
- } else {
- // Use a FileObserver to detect when traces finish writing.
- // The order of traces is considered important to maintain for legibility.
- observer = new DumpStackFileObserver(tracesFile);
- }
// We must complete all stack dumps within 20 seconds.
long remainingTime = 20 * 1000;
- try {
- if (observer != null) {
- observer.startWatching();
- }
-
- // First collect all of the stacks of the most important pids.
- if (firstPids != null) {
- int num = firstPids.size();
- for (int i = 0; i < num; i++) {
- if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for pid "
- + firstPids.get(i));
- final long timeTaken;
- if (useTombstonedForJavaTraces) {
- timeTaken = dumpJavaTracesTombstoned(firstPids.get(i), tracesFile, remainingTime);
- } else {
- timeTaken = observer.dumpWithTimeout(firstPids.get(i), remainingTime);
- }
-
- remainingTime -= timeTaken;
- if (remainingTime <= 0) {
- Slog.e(TAG, "Aborting stack trace dump (current firstPid=" + firstPids.get(i) +
- "); deadline exceeded.");
- return;
- }
- if (DEBUG_ANR) {
- Slog.d(TAG, "Done with pid " + firstPids.get(i) + " in " + timeTaken + "ms");
- }
+ // First collect all of the stacks of the most important pids.
+ if (firstPids != null) {
+ int num = firstPids.size();
+ for (int i = 0; i < num; i++) {
+ if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for pid " + firstPids.get(i));
+ final long timeTaken = dumpJavaTracesTombstoned(firstPids.get(i), tracesFile,
+ remainingTime);
+
+ remainingTime -= timeTaken;
+ if (remainingTime <= 0) {
+ Slog.e(TAG, "Aborting stack trace dump (current firstPid=" + firstPids.get(i) +
+ "); deadline exceeded.");
+ return;
}
- }
-
- // Next collect the stacks of the native pids
- if (nativePids != null) {
- for (int pid : nativePids) {
- if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for native pid " + pid);
- final long nativeDumpTimeoutMs = Math.min(NATIVE_DUMP_TIMEOUT_MS, remainingTime);
-
- final long start = SystemClock.elapsedRealtime();
- Debug.dumpNativeBacktraceToFileTimeout(
- pid, tracesFile, (int) (nativeDumpTimeoutMs / 1000));
- final long timeTaken = SystemClock.elapsedRealtime() - start;
-
- remainingTime -= timeTaken;
- if (remainingTime <= 0) {
- Slog.e(TAG, "Aborting stack trace dump (current native pid=" + pid +
- "); deadline exceeded.");
- return;
- }
- if (DEBUG_ANR) {
- Slog.d(TAG, "Done with native pid " + pid + " in " + timeTaken + "ms");
- }
+ if (DEBUG_ANR) {
+ Slog.d(TAG, "Done with pid " + firstPids.get(i) + " in " + timeTaken + "ms");
}
}
+ }
- // Lastly, dump stacks for all extra PIDs from the CPU tracker.
- if (extraPids != null) {
- for (int pid : extraPids) {
- if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for extra pid " + pid);
+ // Next collect the stacks of the native pids
+ if (nativePids != null) {
+ for (int pid : nativePids) {
+ if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for native pid " + pid);
+ final long nativeDumpTimeoutMs = Math.min(NATIVE_DUMP_TIMEOUT_MS, remainingTime);
- final long timeTaken;
- if (useTombstonedForJavaTraces) {
- timeTaken = dumpJavaTracesTombstoned(pid, tracesFile, remainingTime);
- } else {
- timeTaken = observer.dumpWithTimeout(pid, remainingTime);
- }
+ final long start = SystemClock.elapsedRealtime();
+ Debug.dumpNativeBacktraceToFileTimeout(
+ pid, tracesFile, (int) (nativeDumpTimeoutMs / 1000));
+ final long timeTaken = SystemClock.elapsedRealtime() - start;
- remainingTime -= timeTaken;
- if (remainingTime <= 0) {
- Slog.e(TAG, "Aborting stack trace dump (current extra pid=" + pid +
- "); deadline exceeded.");
- return;
- }
+ remainingTime -= timeTaken;
+ if (remainingTime <= 0) {
+ Slog.e(TAG, "Aborting stack trace dump (current native pid=" + pid +
+ "); deadline exceeded.");
+ return;
+ }
- if (DEBUG_ANR) {
- Slog.d(TAG, "Done with extra pid " + pid + " in " + timeTaken + "ms");
- }
+ if (DEBUG_ANR) {
+ Slog.d(TAG, "Done with native pid " + pid + " in " + timeTaken + "ms");
}
}
- } finally {
- if (observer != null) {
- observer.stopWatching();
- }
- }
- }
-
- final void logAppTooSlow(ProcessRecord app, long startTime, String msg) {
- if (true || Build.IS_USER) {
- return;
- }
- String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
- if (tracesPath == null || tracesPath.length() == 0) {
- return;
}
- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
- StrictMode.allowThreadDiskWrites();
- try {
- final File tracesFile = new File(tracesPath);
- final File tracesDir = tracesFile.getParentFile();
- final File tracesTmp = new File(tracesDir, "__tmp__");
- try {
- if (tracesFile.exists()) {
- tracesTmp.delete();
- tracesFile.renameTo(tracesTmp);
- }
- StringBuilder sb = new StringBuilder();
- Time tobj = new Time();
- tobj.set(System.currentTimeMillis());
- sb.append(tobj.format("%Y-%m-%d %H:%M:%S"));
- sb.append(": ");
- TimeUtils.formatDuration(SystemClock.uptimeMillis()-startTime, sb);
- sb.append(" since ");
- sb.append(msg);
- FileOutputStream fos = new FileOutputStream(tracesFile);
- fos.write(sb.toString().getBytes());
- if (app == null) {
- fos.write("\n*** No application process!".getBytes());
- }
- fos.close();
- FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
- } catch (IOException e) {
- Slog.w(TAG, "Unable to prepare slow app traces file: " + tracesPath, e);
- return;
- }
+ // Lastly, dump stacks for all extra PIDs from the CPU tracker.
+ if (extraPids != null) {
+ for (int pid : extraPids) {
+ if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for extra pid " + pid);
- if (app != null && app.pid > 0) {
- ArrayList<Integer> firstPids = new ArrayList<Integer>();
- firstPids.add(app.pid);
- dumpStackTraces(tracesPath, firstPids, null, null, true /* useTombstoned */);
- }
+ final long timeTaken = dumpJavaTracesTombstoned(pid, tracesFile, remainingTime);
- File lastTracesFile = null;
- File curTracesFile = null;
- for (int i=9; i>=0; i--) {
- String name = String.format(Locale.US, "slow%02d.txt", i);
- curTracesFile = new File(tracesDir, name);
- if (curTracesFile.exists()) {
- if (lastTracesFile != null) {
- curTracesFile.renameTo(lastTracesFile);
- } else {
- curTracesFile.delete();
- }
+ remainingTime -= timeTaken;
+ if (remainingTime <= 0) {
+ Slog.e(TAG, "Aborting stack trace dump (current extra pid=" + pid +
+ "); deadline exceeded.");
+ return;
}
- lastTracesFile = curTracesFile;
- }
- tracesFile.renameTo(curTracesFile);
- if (tracesTmp.exists()) {
- tracesTmp.renameTo(tracesFile);
- }
- } finally {
- StrictMode.setThreadPolicy(oldPolicy);
- }
- }
- @GuardedBy("this")
- final void showLaunchWarningLocked(final ActivityRecord cur, final ActivityRecord next) {
- if (!mLaunchWarningShown) {
- mLaunchWarningShown = true;
- mUiHandler.post(new Runnable() {
- @Override
- public void run() {
- synchronized (ActivityManagerService.this) {
- final Dialog d = new LaunchWarningWindow(mContext, cur, next);
- d.show();
- mUiHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- synchronized (ActivityManagerService.this) {
- d.dismiss();
- mLaunchWarningShown = false;
- }
- }
- }, 4000);
- }
+ if (DEBUG_ANR) {
+ Slog.d(TAG, "Done with extra pid " + pid + " in " + timeTaken + "ms");
}
- });
+ }
}
}
@@ -6709,7 +5092,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (appInfo != null) {
forceStopPackageLocked(packageName, appInfo.uid, "clear data");
- mRecentTasks.removeTasksByPackageName(packageName, resolvedUserId);
+ mActivityTaskManager.getRecentTasks().removeTasksByPackageName(packageName, resolvedUserId);
}
}
@@ -6843,7 +5226,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final int NA = apps.size();
for (int ia = 0; ia < NA; ia++) {
final ProcessRecord app = apps.valueAt(ia);
- if (app.persistent) {
+ if (app.isPersistent()) {
// We don't kill persistent processes.
continue;
}
@@ -6880,7 +5263,7 @@ public class ActivityManagerService extends IActivityManager.Stub
* @param maxProcState the process state at or below which to preserve
* processes, or {@code -1} to ignore the process state
*/
- private void killAllBackgroundProcessesExcept(int minTargetSdk, int maxProcState) {
+ void killAllBackgroundProcessesExcept(int minTargetSdk, int maxProcState) {
if (checkCallingPermission(android.Manifest.permission.KILL_BACKGROUND_PROCESSES)
!= PackageManager.PERMISSION_GRANTED) {
final String msg = "Permission Denial: killAllBackgroundProcessesExcept() from pid="
@@ -7098,7 +5481,7 @@ public class ActivityManagerService extends IActivityManager.Stub
proc.baseProcessTracker.addPss(infos[i].getTotalPss(),
infos[i].getTotalUss(), infos[i].getTotalRss(), false,
ProcessStats.ADD_PSS_EXTERNAL_SLOW, endTime-startTime,
- proc.pkgList);
+ proc.pkgList.mPkgList);
}
}
}
@@ -7128,7 +5511,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (proc.thread != null && proc.setAdj == oomAdj) {
// Record this for posterity if the process has been stable.
proc.baseProcessTracker.addPss(pss[i], tmpUss[0], tmpUss[2], false,
- ProcessStats.ADD_PSS_EXTERNAL, endTime-startTime, proc.pkgList);
+ ProcessStats.ADD_PSS_EXTERNAL, endTime-startTime, proc.pkgList.mPkgList);
}
}
}
@@ -7201,7 +5584,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final int NA = apps.size();
for (int ia=0; ia<NA; ia++) {
ProcessRecord app = apps.valueAt(ia);
- if (app.persistent && !evenPersistent) {
+ if (app.isPersistent() && !evenPersistent) {
// we don't kill persistent processes
continue;
}
@@ -7327,7 +5710,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
// Clean-up disabled tasks
- mRecentTasks.cleanupDisabledPackageTasksLocked(packageName, disabledClasses, userId);
+ mActivityTaskManager.getRecentTasks().cleanupDisabledPackageTasksLocked(packageName, disabledClasses, userId);
// Clean-up disabled services.
mServices.bringDownDisabledPackageServicesLocked(
@@ -7394,7 +5777,7 @@ public class ActivityManagerService extends IActivityManager.Stub
ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent,
packageName == null ? ("stop user " + userId) : ("stop " + packageName));
- didSomething |= mActivityStartController.clearPendingActivityLaunches(packageName);
+ didSomething |= mActivityTaskManager.getActivityStartController().clearPendingActivityLaunches(packageName);
if (mStackSupervisor.finishDisabledPackageActivitiesLocked(
packageName, null, doit, evenPersistent, userId)) {
@@ -7541,7 +5924,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// We shouldn't already have a process under this name, but just in case we
// need to clean up whatever may be there now.
ProcessRecord old = removeProcessNameLocked(proc.processName, proc.uid);
- if (old == proc && proc.persistent) {
+ if (old == proc && proc.isPersistent()) {
// We are re-adding a persistent process. Whatevs! Just leave it there.
Slog.w(TAG, "Re-adding persistent process " + proc);
} else if (old != null) {
@@ -7608,7 +5991,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
boolean willRestart = false;
- if (app.persistent && !app.isolated) {
+ if (app.isPersistent() && !app.isolated) {
if (!callerWillRestart) {
willRestart = true;
} else {
@@ -7761,7 +6144,7 @@ public class ActivityManagerService extends IActivityManager.Stub
app.makeActive(thread, mProcessStats);
app.curAdj = app.setAdj = app.verifiedAdj = ProcessList.INVALID_ADJ;
- app.curSchedGroup = app.setSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ app.setCurrentSchedulingGroup(app.setSchedGroup = ProcessList.SCHED_GROUP_DEFAULT);
app.forcingToImportant = null;
updateProcessForegroundLocked(app, false, false);
app.hasShownUi = false;
@@ -7940,7 +6323,7 @@ public class ActivityManagerService extends IActivityManager.Stub
app.instr.mWatcher,
app.instr.mUiAutomationConnection, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
- isRestrictedBackupMode || !normalMode, app.persistent,
+ isRestrictedBackupMode || !normalMode, app.isPersistent(),
new Configuration(getGlobalConfiguration()), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
@@ -7949,7 +6332,7 @@ public class ActivityManagerService extends IActivityManager.Stub
thread.bindApplication(processName, appInfo, providers, null, profilerInfo,
null, null, null, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
- isRestrictedBackupMode || !normalMode, app.persistent,
+ isRestrictedBackupMode || !normalMode, app.isPersistent(),
new Configuration(getGlobalConfiguration()), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
@@ -8060,40 +6443,11 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- @Override
- public final void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
- final long origId = Binder.clearCallingIdentity();
- synchronized (this) {
- ActivityStack stack = ActivityRecord.getStackLocked(token);
- if (stack != null) {
- ActivityRecord r =
- mStackSupervisor.activityIdleInternalLocked(token, false /* fromTimeout */,
- false /* processPausingActivities */, config);
- if (stopProfiling) {
- if ((mProfileProc == r.app) && mProfilerInfo != null) {
- clearProfilerLocked();
- }
- }
- }
- }
- Binder.restoreCallingIdentity(origId);
- }
-
void postFinishBooting(boolean finishBooting, boolean enableScreen) {
mHandler.sendMessage(mHandler.obtainMessage(FINISH_BOOTING_MSG,
finishBooting ? 1 : 0, enableScreen ? 1 : 0));
}
- void enableScreenAfterBoot() {
- EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
- SystemClock.uptimeMillis());
- mWindowManager.enableScreenAfterBoot();
-
- synchronized (this) {
- updateEventDispatchingLocked();
- }
- }
-
@Override
public void showBootMessage(final CharSequence msg, final boolean always) {
if (Binder.getCallingUid() != myUid()) {
@@ -8102,26 +6456,6 @@ public class ActivityManagerService extends IActivityManager.Stub
mWindowManager.showBootMessage(msg, always);
}
- @Override
- public void keyguardGoingAway(int flags) {
- enforceNotIsolatedCaller("keyguardGoingAway");
- final long token = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- mKeyguardController.keyguardGoingAway(flags);
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- /**
- * @return whther the keyguard is currently locked.
- */
- boolean isKeyguardLocked() {
- return mKeyguardController.isKeyguardLocked();
- }
-
final void finishBooting() {
synchronized (this) {
if (!mBootAnimationComplete) {
@@ -8139,8 +6473,13 @@ public class ActivityManagerService extends IActivityManager.Stub
try {
mInstaller.markBootComplete(VMRuntime.getInstructionSet(abi));
} catch (InstallerException e) {
- Slog.w(TAG, "Unable to mark boot complete for abi: " + abi + " (" +
- e.getMessage() +")");
+ if (!VMRuntime.didPruneDalvikCache()) {
+ // This is technically not the right filter, as different zygotes may
+ // have made different pruning decisions. But the log is best effort,
+ // anyways.
+ Slog.w(TAG, "Unable to mark boot complete for abi: " + abi + " (" +
+ e.getMessage() +")");
+ }
}
completedIsas.add(instructionSet);
}
@@ -8293,156 +6632,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (enableScreen) {
- enableScreenAfterBoot();
- }
- }
-
- @Override
- public final void activityResumed(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- synchronized(this) {
- ActivityRecord.activityResumedLocked(token);
- mWindowManager.notifyAppResumedFinished(token);
- }
- Binder.restoreCallingIdentity(origId);
- }
-
- @Override
- public final void activityPaused(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- synchronized(this) {
- ActivityStack stack = ActivityRecord.getStackLocked(token);
- if (stack != null) {
- stack.activityPausedLocked(token, false);
- }
- }
- Binder.restoreCallingIdentity(origId);
- }
-
- @Override
- public final void activityStopped(IBinder token, Bundle icicle,
- PersistableBundle persistentState, CharSequence description) {
- if (DEBUG_ALL) Slog.v(TAG, "Activity stopped: token=" + token);
-
- // Refuse possible leaked file descriptors
- if (icicle != null && icicle.hasFileDescriptors()) {
- throw new IllegalArgumentException("File descriptors passed in Bundle");
- }
-
- final long origId = Binder.clearCallingIdentity();
-
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r != null) {
- r.activityStoppedLocked(icicle, persistentState, description);
- }
- }
-
- trimApplications();
-
- Binder.restoreCallingIdentity(origId);
- }
-
- @Override
- public final void activityDestroyed(IBinder token) {
- if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "ACTIVITY DESTROYED: " + token);
- synchronized (this) {
- ActivityStack stack = ActivityRecord.getStackLocked(token);
- if (stack != null) {
- stack.activityDestroyedLocked(token, "activityDestroyed");
- }
- }
- }
-
- @Override
- public final void activityRelaunched(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- synchronized (this) {
- mStackSupervisor.activityRelaunchedLocked(token);
- }
- Binder.restoreCallingIdentity(origId);
- }
-
- @Override
- public void reportSizeConfigurations(IBinder token, int[] horizontalSizeConfiguration,
- int[] verticalSizeConfigurations, int[] smallestSizeConfigurations) {
- if (DEBUG_CONFIGURATION) Slog.v(TAG, "Report configuration: " + token + " "
- + horizontalSizeConfiguration + " " + verticalSizeConfigurations);
- synchronized (this) {
- ActivityRecord record = ActivityRecord.isInStackLocked(token);
- if (record == null) {
- throw new IllegalArgumentException("reportSizeConfigurations: ActivityRecord not "
- + "found for: " + token);
- }
- record.setSizeConfigurations(horizontalSizeConfiguration,
- verticalSizeConfigurations, smallestSizeConfigurations);
- }
- }
-
- @Override
- public final void notifyLaunchTaskBehindComplete(IBinder token) {
- mStackSupervisor.scheduleLaunchTaskBehindComplete(token);
- }
-
- @Override
- public final void notifyEnterAnimationComplete(IBinder token) {
- mHandler.sendMessage(mHandler.obtainMessage(ENTER_ANIMATION_COMPLETE_MSG, token));
- }
-
- @Override
- public String getCallingPackage(IBinder token) {
- synchronized (this) {
- ActivityRecord r = getCallingRecordLocked(token);
- return r != null ? r.info.packageName : null;
- }
- }
-
- @Override
- public ComponentName getCallingActivity(IBinder token) {
- synchronized (this) {
- ActivityRecord r = getCallingRecordLocked(token);
- return r != null ? r.intent.getComponent() : null;
- }
- }
-
- private ActivityRecord getCallingRecordLocked(IBinder token) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return null;
- }
- return r.resultTo;
- }
-
- @Override
- public ComponentName getActivityClassForToken(IBinder token) {
- synchronized(this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return null;
- }
- return r.intent.getComponent();
- }
- }
-
- @Override
- public String getPackageForToken(IBinder token) {
- synchronized(this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return null;
- }
- return r.packageName;
- }
- }
-
- @Override
- public boolean isRootVoiceInteraction(IBinder token) {
- synchronized(this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return false;
- }
- return r.rootVoiceInteraction;
+ mAtmInternal.enableScreenAfterBoot(mBooted);
}
}
@@ -8938,199 +7128,6 @@ public class ActivityManagerService extends IActivityManager.Stub
return uidRec == null ? ActivityManager.PROCESS_STATE_NONEXISTENT : uidRec.curProcState;
}
- @Override
- public boolean isInMultiWindowMode(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized(this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return false;
- }
- // An activity is consider to be in multi-window mode if its task isn't fullscreen.
- return r.inMultiWindowMode();
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public boolean isInPictureInPictureMode(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized(this) {
- return isInPictureInPictureMode(ActivityRecord.forTokenLocked(token));
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- private boolean isInPictureInPictureMode(ActivityRecord r) {
- if (r == null || r.getStack() == null || !r.inPinnedWindowingMode()
- || r.getStack().isInStackLocked(r) == null) {
- return false;
- }
-
- // If we are animating to fullscreen then we have already dispatched the PIP mode
- // changed, so we should reflect that check here as well.
- final PinnedActivityStack stack = r.getStack();
- final PinnedStackWindowController windowController = stack.getWindowContainerController();
- return !windowController.isAnimatingBoundsToFullscreen();
- }
-
- @Override
- public boolean enterPictureInPictureMode(IBinder token, final PictureInPictureParams params) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized(this) {
- final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
- "enterPictureInPictureMode", token, params);
-
- // If the activity is already in picture in picture mode, then just return early
- if (isInPictureInPictureMode(r)) {
- return true;
- }
-
- // Activity supports picture-in-picture, now check that we can enter PiP at this
- // point, if it is
- if (!r.checkEnterPictureInPictureState("enterPictureInPictureMode",
- false /* beforeStopping */)) {
- return false;
- }
-
- final Runnable enterPipRunnable = () -> {
- // Only update the saved args from the args that are set
- r.pictureInPictureArgs.copyOnlySet(params);
- final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
- final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
- // Adjust the source bounds by the insets for the transition down
- final Rect sourceBounds = new Rect(r.pictureInPictureArgs.getSourceRectHint());
- mStackSupervisor.moveActivityToPinnedStackLocked(r, sourceBounds, aspectRatio,
- "enterPictureInPictureMode");
- final PinnedActivityStack stack = r.getStack();
- stack.setPictureInPictureAspectRatio(aspectRatio);
- stack.setPictureInPictureActions(actions);
- MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid,
- r.shortComponentName, r.supportsEnterPipOnTaskSwitch);
- logPictureInPictureArgs(params);
- };
-
- if (isKeyguardLocked()) {
- // If the keyguard is showing or occluded, then try and dismiss it before
- // entering picture-in-picture (this will prompt the user to authenticate if the
- // device is currently locked).
- try {
- dismissKeyguard(token, new KeyguardDismissCallback() {
- @Override
- public void onDismissSucceeded() throws RemoteException {
- mHandler.post(enterPipRunnable);
- }
- }, null /* message */);
- } catch (RemoteException e) {
- // Local call
- }
- } else {
- // Enter picture in picture immediately otherwise
- enterPipRunnable.run();
- }
- return true;
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public void setPictureInPictureParams(IBinder token, final PictureInPictureParams params) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized(this) {
- final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
- "setPictureInPictureParams", token, params);
-
- // Only update the saved args from the args that are set
- r.pictureInPictureArgs.copyOnlySet(params);
- if (r.inPinnedWindowingMode()) {
- // If the activity is already in picture-in-picture, update the pinned stack now
- // if it is not already expanding to fullscreen. Otherwise, the arguments will
- // be used the next time the activity enters PiP
- final PinnedActivityStack stack = r.getStack();
- if (!stack.isAnimatingBoundsToFullscreen()) {
- stack.setPictureInPictureAspectRatio(
- r.pictureInPictureArgs.getAspectRatio());
- stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
- }
- }
- logPictureInPictureArgs(params);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public int getMaxNumPictureInPictureActions(IBinder token) {
- // Currently, this is a static constant, but later, we may change this to be dependent on
- // the context of the activity
- return 3;
- }
-
- private void logPictureInPictureArgs(PictureInPictureParams params) {
- if (params.hasSetActions()) {
- MetricsLogger.histogram(mContext, "tron_varz_picture_in_picture_actions_count",
- params.getActions().size());
- }
- if (params.hasSetAspectRatio()) {
- LogMaker lm = new LogMaker(MetricsEvent.ACTION_PICTURE_IN_PICTURE_ASPECT_RATIO_CHANGED);
- lm.addTaggedData(MetricsEvent.PICTURE_IN_PICTURE_ASPECT_RATIO, params.getAspectRatio());
- MetricsLogger.action(lm);
- }
- }
-
- /**
- * Checks the state of the system and the activity associated with the given {@param token} to
- * verify that picture-in-picture is supported for that activity.
- *
- * @return the activity record for the given {@param token} if all the checks pass.
- */
- private ActivityRecord ensureValidPictureInPictureActivityParamsLocked(String caller,
- IBinder token, PictureInPictureParams params) {
- if (!mSupportsPictureInPicture) {
- throw new IllegalStateException(caller
- + ": Device doesn't support picture-in-picture mode.");
- }
-
- final ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r == null) {
- throw new IllegalStateException(caller
- + ": Can't find activity for token=" + token);
- }
-
- if (!r.supportsPictureInPicture()) {
- throw new IllegalStateException(caller
- + ": Current activity does not support picture-in-picture.");
- }
-
- if (params.hasSetAspectRatio()
- && !mWindowManager.isValidPictureInPictureAspectRatio(r.getStack().mDisplayId,
- params.getAspectRatio())) {
- final float minAspectRatio = mContext.getResources().getFloat(
- com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
- final float maxAspectRatio = mContext.getResources().getFloat(
- com.android.internal.R.dimen.config_pictureInPictureMaxAspectRatio);
- throw new IllegalArgumentException(String.format(caller
- + ": Aspect ratio is too extreme (must be between %f and %f).",
- minAspectRatio, maxAspectRatio));
- }
-
- // Truncate the number of actions if necessary
- params.truncateActions(getMaxNumPictureInPictureActions(token));
-
- return r;
- }
-
// =========================================================
// PROCESS INFO
// =========================================================
@@ -9257,7 +7254,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- int checkComponentPermission(String permission, int pid, int uid,
+ static int checkComponentPermission(String permission, int pid, int uid,
int owningUid, boolean exported) {
if (pid == MY_PID) {
return PackageManager.PERMISSION_GRANTED;
@@ -9345,15 +7342,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
/**
- * This can be called with or without the global lock held.
- */
- void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
- if (!mRecentTasks.isCallerRecents(Binder.getCallingUid())) {
- enforceCallingPermission(permission, func);
- }
- }
-
- /**
* Determine if UID is holding permissions required to access {@link Uri} in
* the given {@link ProviderInfo}. Final permission checking is always done
* in {@link ContentProvider}.
@@ -10345,18 +8333,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- @Override
- public IBinder getUriPermissionOwnerForActivity(IBinder activityToken) {
- enforceNotIsolatedCaller("getUriPermissionOwnerForActivity");
- synchronized(this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
- if (r == null) {
- throw new IllegalArgumentException("Activity does not exist; token="
- + activityToken);
- }
- return r.getUriPermissionsLocked().getExternalTokenLocked();
- }
- }
/**
* @param uri This uri must NOT contain an embedded userId.
* @param sourceUserId The userId in which the uri is to be resolved.
@@ -10806,494 +8782,55 @@ public class ActivityManagerService extends IActivityManager.Stub
// =========================================================
@Override
- public List<IBinder> getAppTasks(String callingPackage) {
- int callingUid = Binder.getCallingUid();
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized(this) {
- return mRecentTasks.getAppTasksList(callingUid, callingPackage);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override
public List<RunningTaskInfo> getTasks(int maxNum) {
- return getFilteredTasks(maxNum, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED);
+ return mActivityTaskManager.getTasks(maxNum);
}
@Override
public List<RunningTaskInfo> getFilteredTasks(int maxNum, @ActivityType int ignoreActivityType,
@WindowingMode int ignoreWindowingMode) {
- final int callingUid = Binder.getCallingUid();
- ArrayList<RunningTaskInfo> list = new ArrayList<>();
-
- synchronized(this) {
- if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);
-
- final boolean allowed = isGetTasksAllowed("getTasks", Binder.getCallingPid(),
- callingUid);
- mStackSupervisor.getRunningTasks(maxNum, list, ignoreActivityType,
- ignoreWindowingMode, callingUid, allowed);
- }
-
- return list;
- }
-
- private boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
- if (mRecentTasks.isCallerRecents(callingUid)) {
- // Always allow the recents component to get tasks
- return true;
- }
-
- boolean allowed = checkPermission(android.Manifest.permission.REAL_GET_TASKS,
- callingPid, callingUid) == PackageManager.PERMISSION_GRANTED;
- if (!allowed) {
- if (checkPermission(android.Manifest.permission.GET_TASKS,
- callingPid, callingUid) == PackageManager.PERMISSION_GRANTED) {
- // Temporary compatibility: some existing apps on the system image may
- // still be requesting the old permission and not switched to the new
- // one; if so, we'll still allow them full access. This means we need
- // to see if they are holding the old permission and are a system app.
- try {
- if (AppGlobals.getPackageManager().isUidPrivileged(callingUid)) {
- allowed = true;
- if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid
- + " is using old GET_TASKS but privileged; allowing");
- }
- } catch (RemoteException e) {
- }
- }
- }
- if (!allowed) {
- if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid
- + " does not hold REAL_GET_TASKS; limiting output");
- }
- return allowed;
+ return mActivityTaskManager.getFilteredTasks(
+ maxNum, ignoreActivityType, ignoreWindowingMode);
}
@Override
- public ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags,
- int userId) {
- final int callingUid = Binder.getCallingUid();
- userId = mUserController.handleIncomingUser(Binder.getCallingPid(), callingUid, userId,
- false, ALLOW_FULL_ONLY, "getRecentTasks", null);
- final boolean allowed = isGetTasksAllowed("getRecentTasks", Binder.getCallingPid(),
- callingUid);
- final boolean detailed = checkCallingPermission(
- android.Manifest.permission.GET_DETAILED_TASKS)
- == PackageManager.PERMISSION_GRANTED;
-
- synchronized (this) {
- return mRecentTasks.getRecentTasks(maxNum, flags, allowed, detailed, userId,
- callingUid);
- }
- }
-
- @Override
- public ActivityManager.TaskDescription getTaskDescription(int id) {
- synchronized (this) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getTaskDescription()");
- final TaskRecord tr = mStackSupervisor.anyTaskForIdLocked(id,
- MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
- if (tr != null) {
- return tr.lastTaskDescription;
- }
- }
- return null;
- }
-
- @Override
- public int addAppTask(IBinder activityToken, Intent intent,
- ActivityManager.TaskDescription description, Bitmap thumbnail) throws RemoteException {
- final int callingUid = Binder.getCallingUid();
- final long callingIdent = Binder.clearCallingIdentity();
-
- try {
- synchronized (this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
- if (r == null) {
- throw new IllegalArgumentException("Activity does not exist; token="
- + activityToken);
- }
- ComponentName comp = intent.getComponent();
- if (comp == null) {
- throw new IllegalArgumentException("Intent " + intent
- + " must specify explicit component");
- }
- if (thumbnail.getWidth() != mThumbnailWidth
- || thumbnail.getHeight() != mThumbnailHeight) {
- throw new IllegalArgumentException("Bad thumbnail size: got "
- + thumbnail.getWidth() + "x" + thumbnail.getHeight() + ", require "
- + mThumbnailWidth + "x" + mThumbnailHeight);
- }
- if (intent.getSelector() != null) {
- intent.setSelector(null);
- }
- if (intent.getSourceBounds() != null) {
- intent.setSourceBounds(null);
- }
- if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0) {
- if ((intent.getFlags()&Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) == 0) {
- // The caller has added this as an auto-remove task... that makes no
- // sense, so turn off auto-remove.
- intent.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
- }
- }
- final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp,
- STOCK_PM_FLAGS, UserHandle.getUserId(callingUid));
- if (ainfo.applicationInfo.uid != callingUid) {
- throw new SecurityException(
- "Can't add task for another application: target uid="
- + ainfo.applicationInfo.uid + ", calling uid=" + callingUid);
- }
-
- final ActivityStack stack = r.getStack();
- final TaskRecord task = stack.createTaskRecord(
- mStackSupervisor.getNextTaskIdForUserLocked(r.userId), ainfo, intent,
- null /* voiceSession */, null /* voiceInteractor */, !ON_TOP);
- if (!mRecentTasks.addToBottom(task)) {
- // The app has too many tasks already and we can't add any more
- stack.removeTask(task, "addAppTask", REMOVE_TASK_MODE_DESTROYING);
- return INVALID_TASK_ID;
- }
- task.lastTaskDescription.copyFrom(description);
-
- // TODO: Send the thumbnail to WM to store it.
-
- return task.taskId;
- }
- } finally {
- Binder.restoreCallingIdentity(callingIdent);
- }
- }
-
- @Override
- public Point getAppTaskThumbnailSize() {
- synchronized (this) {
- return new Point(mThumbnailWidth, mThumbnailHeight);
- }
+ public void cancelTaskWindowTransition(int taskId) {
+ mActivityTaskManager.cancelTaskWindowTransition(taskId);
}
@Override
- public void setTaskDescription(IBinder token, ActivityManager.TaskDescription td) {
- synchronized (this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r != null) {
- r.setTaskDescription(td);
- final TaskRecord task = r.getTask();
- task.updateTaskDescription();
- mTaskChangeNotificationController.notifyTaskDescriptionChanged(task.taskId, td);
- }
- }
+ public void setTaskResizeable(int taskId, int resizeableMode) {
+ mActivityTaskManager.setTaskResizeable(taskId, resizeableMode);
}
@Override
- public void setTaskResizeable(int taskId, int resizeableMode) {
- synchronized (this) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(
- taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
- if (task == null) {
- Slog.w(TAG, "setTaskResizeable: taskId=" + taskId + " not found");
- return;
- }
- task.setResizeMode(resizeableMode);
- }
+ public ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution) {
+ return mActivityTaskManager.getTaskSnapshot(taskId, reducedResolution);
}
@Override
public void resizeTask(int taskId, Rect bounds, int resizeMode) {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "resizeTask()");
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
- if (task == null) {
- Slog.w(TAG, "resizeTask: taskId=" + taskId + " not found");
- return;
- }
- // Place the task in the right stack if it isn't there already based on
- // the requested bounds.
- // The stack transition logic is:
- // - a null bounds on a freeform task moves that task to fullscreen
- // - a non-null bounds on a non-freeform (fullscreen OR docked) task moves
- // that task to freeform
- // - otherwise the task is not moved
- ActivityStack stack = task.getStack();
- if (!task.getWindowConfiguration().canResizeTask()) {
- throw new IllegalArgumentException("resizeTask not allowed on task=" + task);
- }
- if (bounds == null && stack.getWindowingMode() == WINDOWING_MODE_FREEFORM) {
- stack = stack.getDisplay().getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, stack.getActivityType(), ON_TOP);
- } else if (bounds != null && stack.getWindowingMode() != WINDOWING_MODE_FREEFORM) {
- stack = stack.getDisplay().getOrCreateStack(
- WINDOWING_MODE_FREEFORM, stack.getActivityType(), ON_TOP);
- }
-
- // Reparent the task to the right stack if necessary
- boolean preserveWindow = (resizeMode & RESIZE_MODE_PRESERVE_WINDOW) != 0;
- if (stack != task.getStack()) {
- // Defer resume until the task is resized below
- task.reparent(stack, ON_TOP, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE,
- DEFER_RESUME, "resizeTask");
- preserveWindow = false;
- }
-
- // After reparenting (which only resizes the task to the stack bounds), resize the
- // task to the actual bounds provided
- task.resize(bounds, resizeMode, preserveWindow, !DEFER_RESUME);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ mActivityTaskManager.resizeTask(taskId, bounds, resizeMode);
}
@Override
public Rect getTaskBounds(int taskId) {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "getTaskBounds()");
- long ident = Binder.clearCallingIdentity();
- Rect rect = new Rect();
- try {
- synchronized (this) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
- MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
- if (task == null) {
- Slog.w(TAG, "getTaskBounds: taskId=" + taskId + " not found");
- return rect;
- }
- if (task.getStack() != null) {
- // Return the bounds from window manager since it will be adjusted for various
- // things like the presense of a docked stack for tasks that aren't resizeable.
- task.getWindowContainerBounds(rect);
- } else {
- // Task isn't in window manager yet since it isn't associated with a stack.
- // Return the persist value from activity manager
- if (!task.matchParentBounds()) {
- rect.set(task.getBounds());
- } else if (task.mLastNonFullscreenBounds != null) {
- rect.set(task.mLastNonFullscreenBounds);
- }
- }
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- return rect;
- }
-
- @Override
- public void cancelTaskWindowTransition(int taskId) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
- "cancelTaskWindowTransition()");
- final long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
- MATCH_TASK_IN_STACKS_ONLY);
- if (task == null) {
- Slog.w(TAG, "cancelTaskWindowTransition: taskId=" + taskId + " not found");
- return;
- }
- task.cancelWindowTransition();
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override
- public TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution) {
- enforceCallerIsRecentsOrHasPermission(READ_FRAME_BUFFER, "getTaskSnapshot()");
- final long ident = Binder.clearCallingIdentity();
- try {
- final TaskRecord task;
- synchronized (this) {
- task = mStackSupervisor.anyTaskForIdLocked(taskId,
- MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
- if (task == null) {
- Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
- return null;
- }
- }
- // Don't call this while holding the lock as this operation might hit the disk.
- return task.getSnapshot(reducedResolution);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override
- public Bitmap getTaskDescriptionIcon(String filePath, int userId) {
- userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
- userId, false, ALLOW_FULL_ONLY, "getTaskDescriptionIcon", null);
-
- final File passedIconFile = new File(filePath);
- final File legitIconFile = new File(TaskPersister.getUserImagesDir(userId),
- passedIconFile.getName());
- if (!legitIconFile.getPath().equals(filePath)
- || !filePath.contains(ActivityRecord.ACTIVITY_ICON_SUFFIX)) {
- throw new IllegalArgumentException("Bad file path: " + filePath
- + " passed for userId " + userId);
- }
- return mRecentTasks.getTaskDescriptionIcon(filePath);
- }
-
- @Override
- public void startInPlaceAnimationOnFrontMostApplication(Bundle opts)
- throws RemoteException {
- final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(opts);
- final ActivityOptions activityOptions = safeOptions != null
- ? safeOptions.getOptions(mStackSupervisor)
- : null;
- if (activityOptions == null
- || activityOptions.getAnimationType() != ActivityOptions.ANIM_CUSTOM_IN_PLACE
- || activityOptions.getCustomInPlaceResId() == 0) {
- throw new IllegalArgumentException("Expected in-place ActivityOption " +
- "with valid animation");
- }
- mWindowManager.prepareAppTransition(TRANSIT_TASK_IN_PLACE, false);
- mWindowManager.overridePendingAppTransitionInPlace(activityOptions.getPackageName(),
- activityOptions.getCustomInPlaceResId());
- mWindowManager.executeAppTransition();
+ return mActivityTaskManager.getTaskBounds(taskId);
}
@Override
public void removeStack(int stackId) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "removeStack()");
- synchronized (this) {
- final long ident = Binder.clearCallingIdentity();
- try {
- final ActivityStack stack = mStackSupervisor.getStack(stackId);
- if (stack == null) {
- Slog.w(TAG, "removeStack: No stack with id=" + stackId);
- return;
- }
- if (!stack.isActivityTypeStandardOrUndefined()) {
- throw new IllegalArgumentException(
- "Removing non-standard stack is not allowed.");
- }
- mStackSupervisor.removeStack(stack);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
-
- /**
- * Removes stacks in the input windowing modes from the system if they are of activity type
- * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
- */
- @Override
- public void removeStacksInWindowingModes(int[] windowingModes) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
- "removeStacksInWindowingModes()");
- synchronized (this) {
- final long ident = Binder.clearCallingIdentity();
- try {
- mStackSupervisor.removeStacksInWindowingModes(windowingModes);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
-
- @Override
- public void removeStacksWithActivityTypes(int[] activityTypes) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
- "removeStacksWithActivityTypes()");
- synchronized (this) {
- final long ident = Binder.clearCallingIdentity();
- try {
- mStackSupervisor.removeStacksWithActivityTypes(activityTypes);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
-
- @Override
- public void moveStackToDisplay(int stackId, int displayId) {
- enforceCallingPermission(INTERNAL_SYSTEM_WINDOW, "moveStackToDisplay()");
-
- synchronized (this) {
- final long ident = Binder.clearCallingIdentity();
- try {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "moveStackToDisplay: moving stackId=" + stackId
- + " to displayId=" + displayId);
- mStackSupervisor.moveStackToDisplayLocked(stackId, displayId, ON_TOP);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
+ mActivityTaskManager.removeStack(stackId);
}
@Override
public boolean removeTask(int taskId) {
- enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeTask()");
- synchronized (this) {
- final long ident = Binder.clearCallingIdentity();
- try {
- return mStackSupervisor.removeTaskByIdLocked(taskId, true, REMOVE_FROM_RECENTS,
- "remove-task");
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
+ return mActivityTaskManager.removeTask(taskId);
}
- /**
- * TODO: Add mController hook
- */
@Override
public void moveTaskToFront(int taskId, int flags, Bundle bOptions) {
- enforceCallingPermission(android.Manifest.permission.REORDER_TASKS, "moveTaskToFront()");
-
- if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToFront: moving taskId=" + taskId);
- synchronized(this) {
- moveTaskToFrontLocked(taskId, flags, SafeActivityOptions.fromBundle(bOptions),
- false /* fromRecents */);
- }
- }
-
- void moveTaskToFrontLocked(int taskId, int flags, SafeActivityOptions options,
- boolean fromRecents) {
-
- if (!checkAppSwitchAllowedLocked(Binder.getCallingPid(),
- Binder.getCallingUid(), -1, -1, "Task to front")) {
- SafeActivityOptions.abort(options);
- return;
- }
- final long origId = Binder.clearCallingIdentity();
- try {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
- if (task == null) {
- Slog.d(TAG, "Could not find task for id: "+ taskId);
- return;
- }
- if (mLockTaskController.isLockTaskModeViolation(task)) {
- Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode");
- return;
- }
- ActivityOptions realOptions = options != null
- ? options.getOptions(mStackSupervisor)
- : null;
- mStackSupervisor.findTaskToMoveToFront(task, flags, realOptions, "moveTaskToFront",
- false /* forceNonResizable */);
-
- final ActivityRecord topActivity = task.getTopActivity();
- if (topActivity != null) {
-
- // We are reshowing a task, use a starting window to hide the initial draw delay
- // so the transition can start earlier.
- topActivity.showStartingWindow(null /* prev */, false /* newTask */,
- true /* taskSwitch */, fromRecents);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- SafeActivityOptions.abort(options);
+ mActivityTaskManager.moveTaskToFront(taskId, flags, bOptions);
}
/**
@@ -11317,290 +8854,25 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
@Override
public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot) {
- enforceNotIsolatedCaller("moveActivityTaskToBack");
- synchronized(this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- int taskId = ActivityRecord.getTaskForActivityLocked(token, !nonRoot);
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
- if (task != null) {
- return ActivityRecord.getStackLocked(token).moveTaskToBackLocked(taskId);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- return false;
- }
-
- @Override
- public void moveTaskBackwards(int task) {
- enforceCallingPermission(android.Manifest.permission.REORDER_TASKS,
- "moveTaskBackwards()");
-
- synchronized(this) {
- if (!checkAppSwitchAllowedLocked(Binder.getCallingPid(),
- Binder.getCallingUid(), -1, -1, "Task backwards")) {
- return;
- }
- final long origId = Binder.clearCallingIdentity();
- moveTaskBackwardsLocked(task);
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- private final void moveTaskBackwardsLocked(int task) {
- Slog.e(TAG, "moveTaskBackwards not yet implemented!");
- }
-
- @Override
- public int createStackOnDisplay(int displayId) throws RemoteException {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "createStackOnDisplay()");
- synchronized (this) {
- final ActivityDisplay display =
- mStackSupervisor.getActivityDisplayOrCreateLocked(displayId);
- if (display == null) {
- return INVALID_STACK_ID;
- }
- // TODO(multi-display): Have the caller pass in the windowing mode and activity type.
- final ActivityStack stack = display.createStack(
- WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
- ON_TOP);
- return (stack != null) ? stack.mStackId : INVALID_STACK_ID;
- }
- }
-
- @Override
- public int getActivityDisplayId(IBinder activityToken) throws RemoteException {
- synchronized (this) {
- final ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
- if (stack != null && stack.mDisplayId != INVALID_DISPLAY) {
- return stack.mDisplayId;
- }
- return DEFAULT_DISPLAY;
- }
- }
-
- @Override
- public void exitFreeformMode(IBinder token) throws RemoteException {
- synchronized (this) {
- long ident = Binder.clearCallingIdentity();
- try {
- final ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r == null) {
- throw new IllegalArgumentException(
- "exitFreeformMode: No activity record matching token=" + token);
- }
-
- final ActivityStack stack = r.getStack();
- if (stack == null || !stack.inFreeformWindowingMode()) {
- throw new IllegalStateException(
- "exitFreeformMode: You can only go fullscreen from freeform.");
- }
-
- stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
-
- @Override
- public void setTaskWindowingMode(int taskId, int windowingMode, boolean toTop) {
- if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
- setTaskWindowingModeSplitScreenPrimary(taskId, SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT,
- toTop, ANIMATE, null /* initialBounds */, true /* showRecents */);
- return;
- }
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setTaskWindowingMode()");
- synchronized (this) {
- final long ident = Binder.clearCallingIdentity();
- try {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
- if (task == null) {
- Slog.w(TAG, "setTaskWindowingMode: No task for id=" + taskId);
- return;
- }
-
- if (DEBUG_STACK) Slog.d(TAG_STACK, "setTaskWindowingMode: moving task=" + taskId
- + " to windowingMode=" + windowingMode + " toTop=" + toTop);
-
- if (!task.isActivityTypeStandardOrUndefined()) {
- throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
- + " non-standard task " + taskId + " to windowing mode="
- + windowingMode);
- }
-
- final ActivityStack stack = task.getStack();
- if (toTop) {
- stack.moveToFront("setTaskWindowingMode", task);
- }
- stack.setWindowingMode(windowingMode);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
-
- /**
- * Moves the specified task to the primary-split-screen stack.
- *
- * @param taskId Id of task to move.
- * @param createMode The mode the primary split screen stack should be created in if it doesn't
- * exist already. See
- * {@link android.app.ActivityManager#SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT}
- * and
- * {@link android.app.ActivityManager#SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT}
- * @param toTop If the task and stack should be moved to the top.
- * @param animate Whether we should play an animation for the moving the task.
- * @param initialBounds If the primary stack gets created, it will use these bounds for the
- * stack. Pass {@code null} to use default bounds.
- * @param showRecents If the recents activity should be shown on the other side of the task
- * going into split-screen mode.
- */
- @Override
- public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode, boolean toTop,
- boolean animate, Rect initialBounds, boolean showRecents) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
- "setTaskWindowingModeSplitScreenPrimary()");
- synchronized (this) {
- long ident = Binder.clearCallingIdentity();
- try {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
- if (task == null) {
- Slog.w(TAG, "setTaskWindowingModeSplitScreenPrimary: No task for id=" + taskId);
- return false;
- }
- if (DEBUG_STACK) Slog.d(TAG_STACK,
- "setTaskWindowingModeSplitScreenPrimary: moving task=" + taskId
- + " to createMode=" + createMode + " toTop=" + toTop);
- if (!task.isActivityTypeStandardOrUndefined()) {
- throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
- + " non-standard task " + taskId + " to split-screen windowing mode");
- }
-
- mWindowManager.setDockedStackCreateState(createMode, initialBounds);
- final int windowingMode = task.getWindowingMode();
- final ActivityStack stack = task.getStack();
- if (toTop) {
- stack.moveToFront("setTaskWindowingModeSplitScreenPrimary", task);
- }
- stack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, animate, showRecents,
- false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */);
- return windowingMode != task.getWindowingMode();
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
+ return mActivityTaskManager.moveActivityTaskToBack(token, nonRoot);
}
@Override
public void moveTaskToStack(int taskId, int stackId, boolean toTop) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "moveTaskToStack()");
- synchronized (this) {
- long ident = Binder.clearCallingIdentity();
- try {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
- if (task == null) {
- Slog.w(TAG, "moveTaskToStack: No task for id=" + taskId);
- return;
- }
-
- if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToStack: moving task=" + taskId
- + " to stackId=" + stackId + " toTop=" + toTop);
-
- final ActivityStack stack = mStackSupervisor.getStack(stackId);
- if (stack == null) {
- throw new IllegalStateException(
- "moveTaskToStack: No stack for stackId=" + stackId);
- }
- if (!stack.isActivityTypeStandardOrUndefined()) {
- throw new IllegalArgumentException("moveTaskToStack: Attempt to move task "
- + taskId + " to stack " + stackId);
- }
- if (stack.inSplitScreenPrimaryWindowingMode()) {
- mWindowManager.setDockedStackCreateState(
- SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT, null /* initialBounds */);
- }
- task.reparent(stack, toTop, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE, !DEFER_RESUME,
- "moveTaskToStack");
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
+ mActivityTaskManager.moveTaskToStack(taskId, stackId, toTop);
}
- /**
- * Dismisses split-screen multi-window mode.
- * @param toTop If true the current primary split-screen stack will be placed or left on top.
- */
@Override
- public void dismissSplitScreenMode(boolean toTop) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "dismissSplitScreenMode()");
- final long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final ActivityStack stack =
- mStackSupervisor.getDefaultDisplay().getSplitScreenPrimaryStack();
- if (stack == null) {
- Slog.w(TAG, "dismissSplitScreenMode: primary split-screen stack not found.");
- return;
- }
-
- if (toTop) {
- // Caller wants the current split-screen primary stack to be the top stack after
- // it goes fullscreen, so move it to the front.
- stack.moveToFront("dismissSplitScreenMode");
- } else if (mStackSupervisor.isFocusedStack(stack)) {
- // In this case the current split-screen primary stack shouldn't be the top
- // stack after it goes fullscreen, but it current has focus, so we move the
- // focus to the top-most split-screen secondary stack next to it.
- final ActivityStack otherStack = stack.getDisplay().getTopStackInWindowingMode(
- WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
- if (otherStack != null) {
- otherStack.moveToFront("dismissSplitScreenMode_other");
- }
- }
-
- stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ public void resizeStack(int stackId, Rect destBounds, boolean allowResizeInDockedMode,
+ boolean preserveWindows, boolean animate, int animationDuration) {
+ mActivityTaskManager.resizeStack(stackId, destBounds, allowResizeInDockedMode,
+ preserveWindows, animate, animationDuration);
}
- /**
- * Dismisses Pip
- * @param animate True if the dismissal should be animated.
- * @param animationDuration The duration of the resize animation in milliseconds or -1 if the
- * default animation duration should be used.
- */
@Override
- public void dismissPip(boolean animate, int animationDuration) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "dismissPip()");
- final long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final PinnedActivityStack stack =
- mStackSupervisor.getDefaultDisplay().getPinnedStack();
- if (stack == null) {
- Slog.w(TAG, "dismissPip: pinned stack not found.");
- return;
- }
- if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) {
- throw new IllegalArgumentException("Stack: " + stack
- + " doesn't support animated resize.");
- }
- if (animate) {
- stack.animateResizePinnedStack(null /* sourceHintBounds */,
- null /* destBounds */, animationDuration, false /* fromFullscreen */);
- } else {
- mStackSupervisor.moveTasksToFullscreenStackLocked(stack, true /* onTop */);
- }
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ public ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags,
+ int userId) {
+ return mActivityTaskManager.getRecentTasks(maxNum, flags, userId);
}
/**
@@ -11614,178 +8886,30 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
@Override
public boolean moveTopActivityToPinnedStack(int stackId, Rect bounds) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
- "moveTopActivityToPinnedStack()");
- synchronized (this) {
- if (!mSupportsPictureInPicture) {
- throw new IllegalStateException("moveTopActivityToPinnedStack:"
- + "Device doesn't support picture-in-picture mode");
- }
-
- long ident = Binder.clearCallingIdentity();
- try {
- return mStackSupervisor.moveTopStackActivityToPinnedStackLocked(stackId, bounds);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
-
- @Override
- public void resizeStack(int stackId, Rect destBounds, boolean allowResizeInDockedMode,
- boolean preserveWindows, boolean animate, int animationDuration) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeStack()");
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- if (animate) {
- final PinnedActivityStack stack = mStackSupervisor.getStack(stackId);
- if (stack == null) {
- Slog.w(TAG, "resizeStack: stackId " + stackId + " not found.");
- return;
- }
- if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) {
- throw new IllegalArgumentException("Stack: " + stackId
- + " doesn't support animated resize.");
- }
- stack.animateResizePinnedStack(null /* sourceHintBounds */, destBounds,
- animationDuration, false /* fromFullscreen */);
- } else {
- final ActivityStack stack = mStackSupervisor.getStack(stackId);
- if (stack == null) {
- Slog.w(TAG, "resizeStack: stackId " + stackId + " not found.");
- return;
- }
- mStackSupervisor.resizeStackLocked(stack, destBounds, null /* tempTaskBounds */,
- null /* tempTaskInsetBounds */, preserveWindows,
- allowResizeInDockedMode, !DEFER_RESUME);
- }
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ return mActivityTaskManager.moveTopActivityToPinnedStack(stackId, bounds);
}
@Override
public void resizeDockedStack(Rect dockedBounds, Rect tempDockedTaskBounds,
Rect tempDockedTaskInsetBounds,
Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeDockedStack()");
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- mStackSupervisor.resizeDockedStackLocked(dockedBounds, tempDockedTaskBounds,
- tempDockedTaskInsetBounds, tempOtherTaskBounds, tempOtherTaskInsetBounds,
- PRESERVE_WINDOWS);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ mActivityTaskManager.resizeDockedStack(dockedBounds, tempDockedTaskBounds,
+ tempDockedTaskInsetBounds, tempOtherTaskBounds, tempOtherTaskInsetBounds);
}
@Override
- public void setSplitScreenResizing(boolean resizing) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setSplitScreenResizing()");
- final long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- mStackSupervisor.setSplitScreenResizing(resizing);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override
- public void resizePinnedStack(Rect pinnedBounds, Rect tempPinnedTaskBounds) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizePinnedStack()");
- final long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- mStackSupervisor.resizePinnedStackLocked(pinnedBounds, tempPinnedTaskBounds);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- /**
- * Try to place task to provided position. The final position might be different depending on
- * current user and stacks state. The task will be moved to target stack if it's currently in
- * different stack.
- */
- @Override
public void positionTaskInStack(int taskId, int stackId, int position) {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "positionTaskInStack()");
- synchronized (this) {
- long ident = Binder.clearCallingIdentity();
- try {
- if (DEBUG_STACK) Slog.d(TAG_STACK, "positionTaskInStack: positioning task="
- + taskId + " in stackId=" + stackId + " at position=" + position);
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
- if (task == null) {
- throw new IllegalArgumentException("positionTaskInStack: no task for id="
- + taskId);
- }
-
- final ActivityStack stack = mStackSupervisor.getStack(stackId);
-
- if (stack == null) {
- throw new IllegalArgumentException("positionTaskInStack: no stack for id="
- + stackId);
- }
- if (!stack.isActivityTypeStandardOrUndefined()) {
- throw new IllegalArgumentException("positionTaskInStack: Attempt to change"
- + " the position of task " + taskId + " in/to non-standard stack");
- }
-
- // TODO: Have the callers of this API call a separate reparent method if that is
- // what they intended to do vs. having this method also do reparenting.
- if (task.getStack() == stack) {
- // Change position in current stack.
- stack.positionChildAt(task, position);
- } else {
- // Reparent to new stack.
- task.reparent(stack, position, REPARENT_LEAVE_STACK_IN_PLACE, !ANIMATE,
- !DEFER_RESUME, "positionTaskInStack");
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
+ mActivityTaskManager.positionTaskInStack(taskId, stackId, position);
}
@Override
public List<StackInfo> getAllStackInfos() {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- return mStackSupervisor.getAllStackInfosLocked();
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override
- public StackInfo getStackInfo(int windowingMode, int activityType) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- return mStackSupervisor.getStackInfo(windowingMode, activityType);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ return mActivityTaskManager.getAllStackInfos();
}
@Override
public int getTaskForActivity(IBinder token, boolean onlyRoot) {
- synchronized(this) {
- return ActivityRecord.getTaskForActivityLocked(token, onlyRoot);
- }
+ return mActivityTaskManager.getTaskForActivity(token, onlyRoot);
}
@Override
@@ -11809,161 +8933,23 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized (this) {
if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Whitelisting " + userId + ":" +
Arrays.toString(packages));
- mLockTaskController.updateLockTaskPackages(userId, packages);
- }
- }
-
- @Override
- public void updateLockTaskFeatures(int userId, int flags) {
- final int callingUid = Binder.getCallingUid();
- if (callingUid != 0 && callingUid != SYSTEM_UID) {
- enforceCallingPermission(android.Manifest.permission.UPDATE_LOCK_TASK_PACKAGES,
- "updateLockTaskFeatures()");
- }
- synchronized (this) {
- if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Allowing features " + userId + ":0x" +
- Integer.toHexString(flags));
- mLockTaskController.updateLockTaskFeatures(userId, flags);
- }
- }
-
- private void startLockTaskModeLocked(@Nullable TaskRecord task, boolean isSystemCaller) {
- if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "startLockTaskModeLocked: " + task);
- if (task == null || task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) {
- return;
- }
-
- final ActivityStack stack = mStackSupervisor.getFocusedStack();
- if (stack == null || task != stack.topTask()) {
- throw new IllegalArgumentException("Invalid task, not in foreground");
- }
-
- // {@code isSystemCaller} is used to distinguish whether this request is initiated by the
- // system or a specific app.
- // * System-initiated requests will only start the pinned mode (screen pinning)
- // * App-initiated requests
- // - will put the device in fully locked mode (LockTask), if the app is whitelisted
- // - will start the pinned mode, otherwise
- final int callingUid = Binder.getCallingUid();
- long ident = Binder.clearCallingIdentity();
- try {
- // When a task is locked, dismiss the pinned stack if it exists
- mStackSupervisor.removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
-
- mLockTaskController.startLockTaskMode(task, isSystemCaller, callingUid);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override
- public void startLockTaskModeByToken(IBinder token) {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r == null) {
- return;
- }
- startLockTaskModeLocked(r.getTask(), false /* isSystemCaller */);
- }
- }
-
- @Override
- public void startSystemLockTaskMode(int taskId) throws RemoteException {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startSystemLockTaskMode");
- // This makes inner call to look as if it was initiated by system.
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
-
- // When starting lock task mode the stack must be in front and focused
- task.getStack().moveToFront("startSystemLockTaskMode");
- startLockTaskModeLocked(task, true /* isSystemCaller */);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override
- public void stopLockTaskModeByToken(IBinder token) {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r == null) {
- return;
- }
- stopLockTaskModeInternal(r.getTask(), false /* isSystemCaller */);
- }
- }
-
- /**
- * This API should be called by SystemUI only when user perform certain action to dismiss
- * lock task mode. We should only dismiss pinned lock task mode in this case.
- */
- @Override
- public void stopSystemLockTaskMode() throws RemoteException {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "stopSystemLockTaskMode");
- stopLockTaskModeInternal(null, true /* isSystemCaller */);
- }
-
- private void stopLockTaskModeInternal(@Nullable TaskRecord task, boolean isSystemCaller) {
- final int callingUid = Binder.getCallingUid();
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- mLockTaskController.stopLockTaskMode(task, isSystemCaller, callingUid);
- }
- // Launch in-call UI if a call is ongoing. This is necessary to allow stopping the lock
- // task and jumping straight into a call in the case of emergency call back.
- TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
- if (tm != null) {
- tm.showInCallScreen(false);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
+ mActivityTaskManager.getLockTaskController().updateLockTaskPackages(userId, packages);
}
}
@Override
public boolean isInLockTaskMode() {
- return getLockTaskModeState() != LOCK_TASK_MODE_NONE;
+ return mActivityTaskManager.isInLockTaskMode();
}
@Override
public int getLockTaskModeState() {
- synchronized (this) {
- return mLockTaskController.getLockTaskModeState();
- }
+ return mActivityTaskManager.getLockTaskModeState();
}
@Override
- public void showLockTaskEscapeMessage(IBinder token) {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r == null) {
- return;
- }
- mLockTaskController.showLockTaskToast();
- }
- }
-
- @Override
- public void setDisablePreviewScreenshots(IBinder token, boolean disable)
- throws RemoteException {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- Slog.w(TAG, "setDisablePreviewScreenshots: Unable to find activity for token="
- + token);
- return;
- }
- final long origId = Binder.clearCallingIdentity();
- try {
- r.setDisablePreviewScreenshots(disable);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
+ public void startSystemLockTaskMode(int taskId) throws RemoteException {
+ mActivityTaskManager.startSystemLockTaskMode(taskId);
}
// =========================================================
@@ -12181,7 +9167,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
ContentProviderConnection incProviderCountLocked(ProcessRecord r,
- final ContentProviderRecord cpr, IBinder externalProcessToken, boolean stable) {
+ final ContentProviderRecord cpr, IBinder externalProcessToken, int callingUid,
+ String callingTag, boolean stable) {
if (r != null) {
for (int i=0; i<r.conProviders.size(); i++) {
ContentProviderConnection conn = r.conProviders.get(i);
@@ -12202,6 +9189,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
ContentProviderConnection conn = new ContentProviderConnection(cpr, r);
+ conn.startAssociationIfNeeded();
if (stable) {
conn.stableCount = 1;
conn.numStableIncs = 1;
@@ -12212,10 +9200,10 @@ public class ActivityManagerService extends IActivityManager.Stub
cpr.connections.add(conn);
r.conProviders.add(conn);
startAssociationLocked(r.uid, r.processName, r.curProcState,
- cpr.uid, cpr.name, cpr.info.processName);
+ cpr.uid, cpr.appInfo.longVersionCode, cpr.name, cpr.info.processName);
return conn;
}
- cpr.addExternalProcessHandleLocked(externalProcessToken);
+ cpr.addExternalProcessHandleLocked(externalProcessToken, callingUid, callingTag);
return null;
}
@@ -12234,9 +9222,10 @@ public class ActivityManagerService extends IActivityManager.Stub
conn.unstableCount--;
}
if (conn.stableCount == 0 && conn.unstableCount == 0) {
+ conn.stopAssociation();
cpr.connections.remove(conn);
conn.client.conProviders.remove(conn);
- if (conn.client.setProcState < ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
+ if (conn.client.setProcState < PROCESS_STATE_LAST_ACTIVITY) {
// The client is more important than last activity -- note the time this
// is happening, so we keep the old provider process around a bit as last
// activity to avoid thrashing it.
@@ -12244,7 +9233,8 @@ public class ActivityManagerService extends IActivityManager.Stub
cpr.proc.lastProviderTime = SystemClock.uptimeMillis();
}
}
- stopAssociationLocked(conn.client.uid, conn.client.processName, cpr.uid, cpr.name);
+ stopAssociationLocked(conn.client.uid, conn.client.processName, cpr.uid,
+ cpr.appInfo.longVersionCode, cpr.name, cpr.info.processName);
return true;
}
return false;
@@ -12290,7 +9280,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
private ContentProviderHolder getContentProviderImpl(IApplicationThread caller,
- String name, IBinder token, boolean stable, int userId) {
+ String name, IBinder token, int callingUid, String callingTag, boolean stable,
+ int userId) {
ContentProviderRecord cpr;
ContentProviderConnection conn = null;
ProviderInfo cpi = null;
@@ -12337,14 +9328,17 @@ public class ActivityManagerService extends IActivityManager.Stub
if (providerRunning) {
cpi = cpr.info;
String msg;
- checkTime(startTime, "getContentProviderImpl: before checkContentProviderPermission");
- if ((msg = checkContentProviderPermissionLocked(cpi, r, userId, checkCrossUser))
- != null) {
- throw new SecurityException(msg);
- }
- checkTime(startTime, "getContentProviderImpl: after checkContentProviderPermission");
if (r != null && cpr.canRunHere(r)) {
+ checkTime(startTime,
+ "getContentProviderImpl: before checkContentProviderPermission");
+ if ((msg = checkContentProviderPermissionLocked(cpi, r, userId, checkCrossUser))
+ != null) {
+ throw new SecurityException(msg);
+ }
+ checkTime(startTime,
+ "getContentProviderImpl: after checkContentProviderPermission");
+
// This provider has been published or is in the process
// of being published... but it is also allowed to run
// in the caller's process, so don't make a connection
@@ -12355,6 +9349,7 @@ public class ActivityManagerService extends IActivityManager.Stub
holder.provider = null;
return holder;
}
+
// Don't expose providers between normal apps and instant apps
try {
if (AppGlobals.getPackageManager()
@@ -12364,13 +9359,22 @@ public class ActivityManagerService extends IActivityManager.Stub
} catch (RemoteException e) {
}
+ checkTime(startTime,
+ "getContentProviderImpl: before checkContentProviderPermission");
+ if ((msg = checkContentProviderPermissionLocked(cpi, r, userId, checkCrossUser))
+ != null) {
+ throw new SecurityException(msg);
+ }
+ checkTime(startTime,
+ "getContentProviderImpl: after checkContentProviderPermission");
+
final long origId = Binder.clearCallingIdentity();
checkTime(startTime, "getContentProviderImpl: incProviderCountLocked");
// In this case the provider instance already exists, so we can
// return it right away.
- conn = incProviderCountLocked(r, cpr, token, stable);
+ conn = incProviderCountLocked(r, cpr, token, callingUid, callingTag, stable);
if (conn != null && (conn.stableCount+conn.unstableCount) == 1) {
if (cpr.proc != null && r.setAdj <= ProcessList.PERCEPTIBLE_APP_ADJ) {
// If this is a perceptible app accessing the provider,
@@ -12614,7 +9618,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
mProviderMap.putProviderByName(name, cpr);
- conn = incProviderCountLocked(r, cpr, token, stable);
+ conn = incProviderCountLocked(r, cpr, token, callingUid, callingTag, stable);
if (conn != null) {
conn.waiting = true;
}
@@ -12706,18 +9710,6 @@ public class ActivityManagerService extends IActivityManager.Stub
return AppGlobals.getPackageManager();
}
- ActivityStartController getActivityStartController() {
- return mActivityStartController;
- }
-
- LockTaskController getLockTaskController() {
- return mLockTaskController;
- }
-
- ClientLifecycleManager getLifecycleManager() {
- return mLifecycleManager;
- }
-
PackageManagerInternal getPackageManagerInternalLocked() {
if (mPackageManagerInt == null) {
mPackageManagerInt = LocalServices.getService(PackageManagerInternal.class);
@@ -12737,21 +9729,23 @@ public class ActivityManagerService extends IActivityManager.Stub
}
// The incoming user check is now handled in checkContentProviderPermissionLocked() to deal
// with cross-user grant.
- return getContentProviderImpl(caller, name, null, stable, userId);
+ return getContentProviderImpl(caller, name, null, Binder.getCallingUid(), null, stable,
+ userId);
}
public ContentProviderHolder getContentProviderExternal(
- String name, int userId, IBinder token) {
+ String name, int userId, IBinder token, String tag) {
enforceCallingPermission(android.Manifest.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY,
"Do not have permission in call getContentProviderExternal()");
userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
userId, false, ALLOW_FULL_ONLY, "getContentProvider", null);
- return getContentProviderExternalUnchecked(name, token, userId);
+ return getContentProviderExternalUnchecked(name, token, Binder.getCallingUid(),
+ tag != null ? tag : "*external*", userId);
}
private ContentProviderHolder getContentProviderExternalUnchecked(String name,
- IBinder token, int userId) {
- return getContentProviderImpl(null, name, token, true, userId);
+ IBinder token, int callingUid, String callingTag, int userId) {
+ return getContentProviderImpl(null, name, token, callingUid, callingTag, true, userId);
}
/**
@@ -12873,7 +9867,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
synchronized (dst) {
dst.provider = src.provider;
- dst.proc = r;
+ dst.setProcess(r);
dst.notifyAll();
}
updateOomAdjLocked(r, true);
@@ -13041,7 +10035,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mConstants.start(mContext.getContentResolver());
mCoreSettingsObserver = new CoreSettingsObserver(this);
- mFontScaleSettingObserver = new FontScaleSettingObserver();
+ mActivityTaskManager.installSystemProviders();
mDevelopmentSettingsObserver = new DevelopmentSettingsObserver();
GlobalSettingsToPropertiesMapper.start(mContext.getContentResolver());
@@ -13143,7 +10137,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
ContentProviderHolder holder = null;
try {
- holder = getContentProviderExternalUnchecked(name, null, userId);
+ holder = getContentProviderExternalUnchecked(name, null, callingUid,
+ "*getmimetype*", userId);
if (holder != null) {
return holder.provider.getType(uri);
}
@@ -13227,15 +10222,17 @@ public class ActivityManagerService extends IActivityManager.Stub
// about the process state of the isolated UID *before* it is registered with the
// owning application.
mBatteryStatsService.addIsolatedUid(uid, info.uid);
+ StatsLog.write(StatsLog.ISOLATED_UID_CHANGED, info.uid, uid,
+ StatsLog.ISOLATED_UID_CHANGED__EVENT__CREATED);
}
final ProcessRecord r = new ProcessRecord(this, stats, info, proc, uid);
if (!mBooted && !mBooting
&& userId == UserHandle.USER_SYSTEM
&& (info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
// The system process is initialized to SCHED_GROUP_DEFAULT in init.rc.
- r.curSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ r.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_DEFAULT);
r.setSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- r.persistent = true;
+ r.setPersistent(true);
r.maxAdj = ProcessList.PERSISTENT_PROC_ADJ;
}
if (isolated && isolatedUid != 0) {
@@ -13334,7 +10331,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
- app.persistent = true;
+ app.setPersistent(true);
app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ;
}
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
@@ -13348,17 +10345,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
public void unhandledBack() {
- enforceCallingPermission(android.Manifest.permission.FORCE_BACK,
- "unhandledBack()");
-
- synchronized(this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- getFocusedStack().unhandledBackLocked();
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
+ mActivityTaskManager.unhandledBack();
}
public ParcelFileDescriptor openContentUri(String uriString) throws RemoteException {
@@ -13366,7 +10353,8 @@ public class ActivityManagerService extends IActivityManager.Stub
final int userId = UserHandle.getCallingUserId();
final Uri uri = Uri.parse(uriString);
String name = uri.getAuthority();
- ContentProviderHolder cph = getContentProviderExternalUnchecked(name, null, userId);
+ ContentProviderHolder cph = getContentProviderExternalUnchecked(name, null,
+ Binder.getCallingUid(), "*opencontent*", userId);
ParcelFileDescriptor pfd = null;
if (cph != null) {
// We record the binder invoker's uid in thread-local storage before
@@ -13395,20 +10383,6 @@ public class ActivityManagerService extends IActivityManager.Stub
return pfd;
}
- // Actually is sleeping or shutting down or whatever else in the future
- // is an inactive state.
- boolean isSleepingOrShuttingDownLocked() {
- return isSleepingLocked() || mShuttingDown;
- }
-
- boolean isShuttingDownLocked() {
- return mShuttingDown;
- }
-
- boolean isSleepingLocked() {
- return mSleeping;
- }
-
void reportGlobalUsageEventLocked(int event) {
mUsageStatsService.reportEvent("android", mUserController.getCurrentUserId(), event);
int[] profiles = mUserController.getCurrentProfileIds();
@@ -13425,12 +10399,6 @@ public class ActivityManagerService extends IActivityManager.Stub
: UsageEvents.Event.SCREEN_NON_INTERACTIVE);
}
- void reportCurKeyguardUsageEventLocked() {
- reportGlobalUsageEventLocked(mKeyguardShown
- ? UsageEvents.Event.KEYGUARD_SHOWN
- : UsageEvents.Event.KEYGUARD_HIDDEN);
- }
-
void onWakefulnessChanged(int wakefulness) {
synchronized(this) {
boolean wasAwake = mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE;
@@ -13441,81 +10409,13 @@ public class ActivityManagerService extends IActivityManager.Stub
// Also update state in a special way for running foreground services UI.
mServices.updateScreenStateLocked(isAwake);
reportCurWakefulnessUsageEventLocked();
- mHandler.obtainMessage(DISPATCH_SCREEN_AWAKE_MSG, isAwake ? 1 : 0, 0)
- .sendToTarget();
+ mActivityTaskManager.onScreenAwakeChanged(isAwake);
+ mOomAdjProfiler.onWakefulnessChanged(wakefulness);
}
updateOomAdjLocked();
}
}
- @GuardedBy("this")
- void finishRunningVoiceLocked() {
- if (mRunningVoice != null) {
- mRunningVoice = null;
- mVoiceWakeLock.release();
- updateSleepIfNeededLocked();
- }
- }
-
- void startTimeTrackingFocusedActivityLocked() {
- final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked();
- if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) {
- mCurAppTimeTracker.start(resumedActivity.packageName);
- }
- }
-
- @GuardedBy("this")
- void updateSleepIfNeededLocked() {
- final boolean shouldSleep = !mStackSupervisor.hasAwakeDisplay();
- final boolean wasSleeping = mSleeping;
-
- if (!shouldSleep) {
- // If wasSleeping is true, we need to wake up activity manager state from when
- // we started sleeping. In either case, we need to apply the sleep tokens, which
- // will wake up stacks or put them to sleep as appropriate.
- if (wasSleeping) {
- mSleeping = false;
- startTimeTrackingFocusedActivityLocked();
- mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
- mStackSupervisor.comeOutOfSleepIfNeededLocked();
- }
- mStackSupervisor.applySleepTokensLocked(true /* applyToStacks */);
- if (wasSleeping) {
- updateOomAdjLocked();
- }
- } else if (!mSleeping && shouldSleep) {
- mSleeping = true;
- if (mCurAppTimeTracker != null) {
- mCurAppTimeTracker.stop();
- }
- mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING;
- mStackSupervisor.goingToSleepLocked();
- updateResumedAppTrace(null /* resumed */);
- updateOomAdjLocked();
- }
- }
-
- /** Pokes the task persister. */
- void notifyTaskPersisterLocked(TaskRecord task, boolean flush) {
- mRecentTasks.notifyTaskPersisterLocked(task, flush);
- }
-
- /**
- * Notifies all listeners when the pinned stack animation starts.
- */
- @Override
- public void notifyPinnedStackAnimationStarted() {
- mTaskChangeNotificationController.notifyPinnedStackAnimationStarted();
- }
-
- /**
- * Notifies all listeners when the pinned stack animation ends.
- */
- @Override
- public void notifyPinnedStackAnimationEnded() {
- mTaskChangeNotificationController.notifyPinnedStackAnimationEnded();
- }
-
@Override
public void notifyCleartextNetwork(int uid, byte[] firstPacket) {
mHandler.obtainMessage(NOTIFY_CLEARTEXT_NETWORK_MSG, uid, 0, firstPacket).sendToTarget();
@@ -13529,14 +10429,7 @@ public class ActivityManagerService extends IActivityManager.Stub
+ android.Manifest.permission.SHUTDOWN);
}
- boolean timedout = false;
-
- synchronized(this) {
- mShuttingDown = true;
- mStackSupervisor.prepareForShutdownLocked();
- updateEventDispatchingLocked();
- timedout = mStackSupervisor.shutdownLocked(timeout);
- }
+ final boolean timedout = mAtmInternal.shuttingDown(mBooted, timeout);
mAppOpsService.shutdown();
if (mUsageStatsService != null) {
@@ -13545,70 +10438,17 @@ public class ActivityManagerService extends IActivityManager.Stub
mBatteryStatsService.shutdown();
synchronized (this) {
mProcessStats.shutdownLocked();
- notifyTaskPersisterLocked(null, true);
+ mActivityTaskManager.notifyTaskPersisterLocked(null, true);
}
return timedout;
}
- public final void activitySlept(IBinder token) {
- if (DEBUG_ALL) Slog.v(TAG, "Activity slept: token=" + token);
-
- final long origId = Binder.clearCallingIdentity();
-
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r != null) {
- mStackSupervisor.activitySleptLocked(r);
- }
- }
-
- Binder.restoreCallingIdentity(origId);
- }
-
- @GuardedBy("this")
- void startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid) {
- Slog.d(TAG, "<<< startRunningVoiceLocked()");
- mVoiceWakeLock.setWorkSource(new WorkSource(targetUid));
- if (mRunningVoice == null || mRunningVoice.asBinder() != session.asBinder()) {
- boolean wasRunningVoice = mRunningVoice != null;
- mRunningVoice = session;
- if (!wasRunningVoice) {
- mVoiceWakeLock.acquire();
- updateSleepIfNeededLocked();
- }
- }
- }
-
- private void updateEventDispatchingLocked() {
- mWindowManager.setEventDispatching(mBooted && !mShuttingDown);
- }
-
@Override
public void setLockScreenShown(boolean keyguardShowing, boolean aodShowing,
int secondaryDisplayShowing) {
- if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Requires permission "
- + android.Manifest.permission.DEVICE_POWER);
- }
-
- synchronized(this) {
- long ident = Binder.clearCallingIdentity();
- if (mKeyguardShown != keyguardShowing) {
- mKeyguardShown = keyguardShowing;
- reportCurKeyguardUsageEventLocked();
- }
- try {
- mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing,
- secondaryDisplayShowing);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- mHandler.obtainMessage(DISPATCH_SCREEN_KEYGUARD_MSG, keyguardShowing ? 1 : 0, 0)
- .sendToTarget();
+ mActivityTaskManager.setLockScreenShown(
+ keyguardShowing, aodShowing, secondaryDisplayShowing);
}
@Override
@@ -13625,7 +10465,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final long ident = Binder.clearCallingIdentity();
try {
if (mUserController.shouldConfirmCredentials(userId)) {
- if (mKeyguardController.isKeyguardLocked()) {
+ if (mActivityTaskManager.mKeyguardController.isKeyguardLocked()) {
// Showing launcher to avoid user entering credential twice.
final int currentUserId = mUserController.getCurrentUserId();
startHomeActivityLocked(currentUserId, "notifyLockedProfile");
@@ -13662,69 +10502,12 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public void stopAppSwitches() {
- enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "stopAppSwitches");
- synchronized(this) {
- mAppSwitchesAllowedTime = SystemClock.uptimeMillis()
- + APP_SWITCH_DELAY_TIME;
- mDidAppSwitch = false;
- mActivityStartController.schedulePendingActivityLaunches(APP_SWITCH_DELAY_TIME);
- }
+ mActivityTaskManager.stopAppSwitches();
}
+ @Override
public void resumeAppSwitches() {
- enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "resumeAppSwitches");
- synchronized(this) {
- // Note that we don't execute any pending app switches... we will
- // let those wait until either the timeout, or the next start
- // activity request.
- mAppSwitchesAllowedTime = 0;
- }
- }
-
- boolean checkAllowAppSwitchUid(int uid) {
- ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(UserHandle.getUserId(uid));
- if (types != null) {
- for (int i = types.size() - 1; i >= 0; i--) {
- if (types.valueAt(i).intValue() == uid) {
- return true;
- }
- }
- }
- return false;
- }
-
- boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid,
- int callingPid, int callingUid, String name) {
- if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) {
- return true;
- }
-
- if (mRecentTasks.isCallerRecents(sourceUid)) {
- return true;
- }
-
- int perm = checkComponentPermission(STOP_APP_SWITCHES, sourcePid, sourceUid, -1, true);
- if (perm == PackageManager.PERMISSION_GRANTED) {
- return true;
- }
- if (checkAllowAppSwitchUid(sourceUid)) {
- return true;
- }
-
- // If the actual IPC caller is different from the logical source, then
- // also see if they are allowed to control app switches.
- if (callingUid != -1 && callingUid != sourceUid) {
- perm = checkComponentPermission(STOP_APP_SWITCHES, callingPid, callingUid, -1, true);
- if (perm == PackageManager.PERMISSION_GRANTED) {
- return true;
- }
- if (checkAllowAppSwitchUid(callingUid)) {
- return true;
- }
- }
-
- Slog.w(TAG, name + " request from " + sourceUid + " stopped");
- return false;
+ mActivityTaskManager.resumeAppSwitches();
}
public void setDebugApp(String packageName, boolean waitForDebugger,
@@ -13878,13 +10661,7 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public void setActivityController(IActivityController controller, boolean imAMonkey) {
- enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
- "setActivityController()");
- synchronized (this) {
- mController = controller;
- mControllerIsAMonkey = imAMonkey;
- Watchdog.getInstance().setActivityController(controller);
- }
+ mActivityTaskManager.setActivityController(controller, imAMonkey);
}
@Override
@@ -13909,7 +10686,7 @@ public class ActivityManagerService extends IActivityManager.Stub
public boolean isUserAMonkey() {
synchronized (this) {
// If there is a controller also implies the user is a monkey.
- return (mUserIsMonkey || (mController != null && mControllerIsAMonkey));
+ return mUserIsMonkey || mActivityTaskManager.isControllerAMonkey();
}
}
@@ -14021,7 +10798,10 @@ public class ActivityManagerService extends IActivityManager.Stub
public static long getInputDispatchingTimeoutLocked(ActivityRecord r) {
- return r != null ? getInputDispatchingTimeoutLocked(r.app) : KEY_DISPATCHING_TIMEOUT;
+ if (r == null || !r.hasProcess()) {
+ return KEY_DISPATCHING_TIMEOUT;
+ }
+ return getInputDispatchingTimeoutLocked((ProcessRecord) r.app.mOwner);
}
public static long getInputDispatchingTimeoutLocked(ProcessRecord r) {
@@ -14099,266 +10879,6 @@ public class ActivityManagerService extends IActivityManager.Stub
return true;
}
- @Override
- public Bundle getAssistContextExtras(int requestType) {
- PendingAssistExtras pae = enqueueAssistContext(requestType, null, null, null,
- null, null, true /* focused */, true /* newSessionId */,
- UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT, 0);
- if (pae == null) {
- return null;
- }
- synchronized (pae) {
- while (!pae.haveResult) {
- try {
- pae.wait();
- } catch (InterruptedException e) {
- }
- }
- }
- synchronized (this) {
- buildAssistBundleLocked(pae, pae.result);
- mPendingAssistExtras.remove(pae);
- mUiHandler.removeCallbacks(pae);
- }
- return pae.extras;
- }
-
- @Override
- public boolean isAssistDataAllowedOnCurrentActivity() {
- int userId;
- synchronized (this) {
- final ActivityStack focusedStack = getFocusedStack();
- if (focusedStack == null || focusedStack.isActivityTypeAssistant()) {
- return false;
- }
-
- final ActivityRecord activity = focusedStack.getTopActivity();
- if (activity == null) {
- return false;
- }
- userId = activity.userId;
- }
- return !DevicePolicyCache.getInstance().getScreenCaptureDisabled(userId);
- }
-
- @Override
- public boolean showAssistFromActivity(IBinder token, Bundle args) {
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- ActivityRecord caller = ActivityRecord.forTokenLocked(token);
- ActivityRecord top = getFocusedStack().getTopActivity();
- if (top != caller) {
- Slog.w(TAG, "showAssistFromActivity failed: caller " + caller
- + " is not current top " + top);
- return false;
- }
- if (!top.nowVisible) {
- Slog.w(TAG, "showAssistFromActivity failed: caller " + caller
- + " is not visible");
- return false;
- }
- }
- return mAssistUtils.showSessionForActiveService(args, SHOW_SOURCE_APPLICATION, null,
- token);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override
- public boolean requestAssistContextExtras(int requestType, IAssistDataReceiver receiver,
- Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId) {
- return enqueueAssistContext(requestType, null, null, receiver, receiverExtras,
- activityToken, focused, newSessionId, UserHandle.getCallingUserId(), null,
- PENDING_ASSIST_EXTRAS_LONG_TIMEOUT, 0) != null;
- }
-
- @Override
- public boolean requestAutofillData(IAssistDataReceiver receiver, Bundle receiverExtras,
- IBinder activityToken, int flags) {
- return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTOFILL, null, null,
- receiver, receiverExtras, activityToken, true, true, UserHandle.getCallingUserId(),
- null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT, flags) != null;
- }
-
- private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
- IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken,
- boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout,
- int flags) {
- enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO,
- "enqueueAssistContext()");
-
- synchronized (this) {
- ActivityRecord activity = getFocusedStack().getTopActivity();
- if (activity == null) {
- Slog.w(TAG, "getAssistContextExtras failed: no top activity");
- return null;
- }
- if (activity.app == null || activity.app.thread == null) {
- Slog.w(TAG, "getAssistContextExtras failed: no process for " + activity);
- return null;
- }
- if (focused) {
- if (activityToken != null) {
- ActivityRecord caller = ActivityRecord.forTokenLocked(activityToken);
- if (activity != caller) {
- Slog.w(TAG, "enqueueAssistContext failed: caller " + caller
- + " is not current top " + activity);
- return null;
- }
- }
- } else {
- activity = ActivityRecord.forTokenLocked(activityToken);
- if (activity == null) {
- Slog.w(TAG, "enqueueAssistContext failed: activity for token=" + activityToken
- + " couldn't be found");
- return null;
- }
- if (activity.app == null || activity.app.thread == null) {
- Slog.w(TAG, "enqueueAssistContext failed: no process for " + activity);
- return null;
- }
- }
-
- PendingAssistExtras pae;
- Bundle extras = new Bundle();
- if (args != null) {
- extras.putAll(args);
- }
- extras.putString(Intent.EXTRA_ASSIST_PACKAGE, activity.packageName);
- extras.putInt(Intent.EXTRA_ASSIST_UID, activity.app.uid);
-
- pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, receiverExtras,
- userHandle);
- pae.isHome = activity.isActivityTypeHome();
-
- // Increment the sessionId if necessary
- if (newSessionId) {
- mViSessionId++;
- }
- try {
- activity.app.thread.requestAssistContextExtras(activity.appToken, pae, requestType,
- mViSessionId, flags);
- mPendingAssistExtras.add(pae);
- mUiHandler.postDelayed(pae, timeout);
- } catch (RemoteException e) {
- Slog.w(TAG, "getAssistContextExtras failed: crash calling " + activity);
- return null;
- }
- return pae;
- }
- }
-
- void pendingAssistExtrasTimedOut(PendingAssistExtras pae) {
- IAssistDataReceiver receiver;
- synchronized (this) {
- mPendingAssistExtras.remove(pae);
- receiver = pae.receiver;
- }
- if (receiver != null) {
- // Caller wants result sent back to them.
- Bundle sendBundle = new Bundle();
- // At least return the receiver extras
- sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras);
- try {
- pae.receiver.onHandleAssistData(sendBundle);
- } catch (RemoteException e) {
- }
- }
- }
-
- private void buildAssistBundleLocked(PendingAssistExtras pae, Bundle result) {
- if (result != null) {
- pae.extras.putBundle(Intent.EXTRA_ASSIST_CONTEXT, result);
- }
- if (pae.hint != null) {
- pae.extras.putBoolean(pae.hint, true);
- }
- }
-
- /** Called from an app when assist data is ready. */
- @Override
- public void reportAssistContextExtras(IBinder token, Bundle extras, AssistStructure structure,
- AssistContent content, Uri referrer) {
- PendingAssistExtras pae = (PendingAssistExtras)token;
- synchronized (pae) {
- pae.result = extras;
- pae.structure = structure;
- pae.content = content;
- if (referrer != null) {
- pae.extras.putParcelable(Intent.EXTRA_REFERRER, referrer);
- }
- if (structure != null) {
- structure.setHomeActivity(pae.isHome);
- }
- pae.haveResult = true;
- pae.notifyAll();
- if (pae.intent == null && pae.receiver == null) {
- // Caller is just waiting for the result.
- return;
- }
- }
- // We are now ready to launch the assist activity.
- IAssistDataReceiver sendReceiver = null;
- Bundle sendBundle = null;
- synchronized (this) {
- buildAssistBundleLocked(pae, extras);
- boolean exists = mPendingAssistExtras.remove(pae);
- mUiHandler.removeCallbacks(pae);
- if (!exists) {
- // Timed out.
- return;
- }
-
- if ((sendReceiver=pae.receiver) != null) {
- // Caller wants result sent back to them.
- sendBundle = new Bundle();
- sendBundle.putBundle(ASSIST_KEY_DATA, pae.extras);
- sendBundle.putParcelable(ASSIST_KEY_STRUCTURE, pae.structure);
- sendBundle.putParcelable(ASSIST_KEY_CONTENT, pae.content);
- sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras);
- }
- }
- if (sendReceiver != null) {
- try {
- sendReceiver.onHandleAssistData(sendBundle);
- } catch (RemoteException e) {
- }
- return;
- }
-
- final long ident = Binder.clearCallingIdentity();
- try {
- if (TextUtils.equals(pae.intent.getAction(),
- android.service.voice.VoiceInteractionService.SERVICE_INTERFACE)) {
- pae.intent.putExtras(pae.extras);
- mContext.startServiceAsUser(pae.intent, new UserHandle(pae.userHandle));
- } else {
- pae.intent.replaceExtras(pae.extras);
- pae.intent.setFlags(FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_SINGLE_TOP
- | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- closeSystemDialogs("assist");
-
- try {
- mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle));
- } catch (ActivityNotFoundException e) {
- Slog.w(TAG, "No activity to handle assist action.", e);
- }
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- public boolean launchAssistIntent(Intent intent, int requestType, String hint, int userHandle,
- Bundle args) {
- return enqueueAssistContext(requestType, intent, hint, null, null, null,
- true /* focused */, true /* newSessionId */, userHandle, args,
- PENDING_ASSIST_EXTRAS_TIMEOUT, 0) != null;
- }
-
public void registerProcessObserver(IProcessObserver observer) {
enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
"registerProcessObserver()");
@@ -14424,130 +10944,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public boolean convertFromTranslucent(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return false;
- }
- final boolean translucentChanged = r.changeWindowTranslucency(true);
- if (translucentChanged) {
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
- }
- mWindowManager.setAppFullscreen(token, true);
- return translucentChanged;
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public boolean convertToTranslucent(IBinder token, Bundle options) {
- SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(options);
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return false;
- }
- final TaskRecord task = r.getTask();
- int index = task.mActivities.lastIndexOf(r);
- if (index > 0) {
- ActivityRecord under = task.mActivities.get(index - 1);
- under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
- }
- final boolean translucentChanged = r.changeWindowTranslucency(false);
- if (translucentChanged) {
- r.getStack().convertActivityToTranslucent(r);
- }
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
- mWindowManager.setAppFullscreen(token, false);
- return translucentChanged;
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public Bundle getActivityOptions(IBinder token) {
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r != null) {
- final ActivityOptions activityOptions = r.takeOptionsLocked();
- return activityOptions == null ? null : activityOptions.toBundle();
- }
- return null;
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @Override
- public void setImmersive(IBinder token, boolean immersive) {
- synchronized(this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- throw new IllegalArgumentException();
- }
- r.immersive = immersive;
-
- // update associated state if we're frontmost
- if (r == mStackSupervisor.getResumedActivityLocked()) {
- if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r);
- applyUpdateLockStateLocked(r);
- }
- }
- }
-
- @Override
- public boolean isImmersive(IBinder token) {
- synchronized (this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- throw new IllegalArgumentException();
- }
- return r.immersive;
- }
- }
-
- @Override
- public void setVrThread(int tid) {
- enforceSystemHasVrFeature();
- synchronized (this) {
- synchronized (mPidsSelfLocked) {
- final int pid = Binder.getCallingPid();
- final ProcessRecord proc = mPidsSelfLocked.get(pid);
- mVrController.setVrThreadLocked(tid, pid, proc);
- }
- }
- }
-
- @Override
public void setPersistentVrThread(int tid) {
- if (checkCallingPermission(permission.RESTRICTED_VR_ACCESS) != PERMISSION_GRANTED) {
- final String msg = "Permission Denial: setPersistentVrThread() from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid()
- + " requires " + permission.RESTRICTED_VR_ACCESS;
- Slog.w(TAG, msg);
- throw new SecurityException(msg);
- }
- enforceSystemHasVrFeature();
- synchronized (this) {
- synchronized (mPidsSelfLocked) {
- final int pid = Binder.getCallingPid();
- final ProcessRecord proc = mPidsSelfLocked.get(pid);
- mVrController.setPersistentVrThreadLocked(tid, pid, proc);
- }
- }
+ mActivityTaskManager.setPersistentVrThread(tid);
}
/**
@@ -14598,17 +10996,6 @@ public class ActivityManagerService extends IActivityManager.Stub
return false;
}
- /**
- * Check that we have the features required for VR-related API calls, and throw an exception if
- * not.
- */
- private void enforceSystemHasVrFeature() {
- if (!mContext.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE)) {
- throw new UnsupportedOperationException("VR mode not supported on this device!");
- }
- }
-
@Override
public void setRenderThread(int tid) {
synchronized (this) {
@@ -14631,7 +11018,7 @@ public class ActivityManagerService extends IActivityManager.Stub
Slog.d("UI_FIFO", "Set RenderThread tid " + tid + " for pid " + pid);
}
// promote to FIFO now
- if (proc.curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) {
+ if (proc.getCurrentSchedulingGroup() == ProcessList.SCHED_GROUP_TOP_APP) {
if (DEBUG_OOM_ADJ) Slog.d("UI_FIFO", "Promoting " + tid + "out of band");
if (mUseFifoUiScheduling) {
setThreadScheduler(proc.renderThreadTid,
@@ -14662,46 +11049,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public int setVrMode(IBinder token, boolean enabled, ComponentName packageName) {
- enforceSystemHasVrFeature();
-
- final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
-
- ActivityRecord r;
- synchronized (this) {
- r = ActivityRecord.isInStackLocked(token);
- }
-
- if (r == null) {
- throw new IllegalArgumentException();
- }
-
- int err;
- if ((err = vrService.hasVrPackage(packageName, r.userId)) !=
- VrManagerInternal.NO_ERROR) {
- return err;
- }
-
- // Clear the binder calling uid since this path may call moveToTask().
- final long callingId = Binder.clearCallingIdentity();
- try {
- synchronized(this) {
- r.requestedVrComponent = (enabled) ? packageName : null;
-
- // Update associated state if this activity is currently focused
- if (r == mStackSupervisor.getResumedActivityLocked()) {
- applyUpdateVrModeLocked(r);
- }
- return 0;
- }
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
- }
-
- @Override
public boolean isVrModePackageEnabled(ComponentName packageName) {
- enforceSystemHasVrFeature();
+ mActivityTaskManager.enforceSystemHasVrFeature();
final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
@@ -14710,29 +11059,12 @@ public class ActivityManagerService extends IActivityManager.Stub
}
public boolean isTopActivityImmersive() {
- enforceNotIsolatedCaller("startActivity");
- synchronized (this) {
- ActivityRecord r = getFocusedStack().topRunningActivityLocked();
- return (r != null) ? r.immersive : false;
- }
- }
-
- /**
- * @return whether the system should disable UI modes incompatible with VR mode.
- */
- boolean shouldDisableNonVrUiLocked() {
- return mVrController.shouldDisableNonVrUiLocked();
+ return mActivityTaskManager.isTopActivityImmersive();
}
@Override
public boolean isTopOfTask(IBinder token) {
- synchronized (this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- throw new IllegalArgumentException();
- }
- return r.getTask().getTopActivity() == r;
- }
+ return mActivityTaskManager.isTopOfTask(token);
}
@Override
@@ -14861,6 +11193,11 @@ public class ActivityManagerService extends IActivityManager.Stub
}
mBatteryStatsService.noteWakupAlarm(sourcePkg, sourceUid, workSource, tag);
+ if (workSource != null) {
+ StatsLog.write(StatsLog.WAKEUP_ALARM_OCCURRED, workSource, tag);
+ } else {
+ StatsLog.write_non_chained(StatsLog.WAKEUP_ALARM_OCCURRED, sourceUid, null, tag);
+ }
}
@Override
@@ -15158,7 +11495,7 @@ public class ActivityManagerService extends IActivityManager.Stub
proc.notCachedSinceIdle = true;
proc.initialIdlePss = 0;
proc.nextPssTime = ProcessList.computeNextPssTime(proc.setProcState, null,
- mTestPssMode, isSleepingLocked(), now);
+ mTestPssMode, mAtmInternal.isSleeping(), now);
}
}
}
@@ -15186,78 +11523,22 @@ public class ActivityManagerService extends IActivityManager.Stub
private void retrieveSettings() {
final ContentResolver resolver = mContext.getContentResolver();
- final boolean freeformWindowManagement =
- mContext.getPackageManager().hasSystemFeature(FEATURE_FREEFORM_WINDOW_MANAGEMENT)
- || Settings.Global.getInt(
- resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
-
- final boolean supportsMultiWindow = ActivityManager.supportsMultiWindow(mContext);
- final boolean supportsPictureInPicture = supportsMultiWindow &&
- mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
- final boolean supportsSplitScreenMultiWindow =
- ActivityManager.supportsSplitScreenMultiWindow(mContext);
- final boolean supportsMultiDisplay = mContext.getPackageManager()
- .hasSystemFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
+ mActivityTaskManager.retrieveSettings(resolver);
+
final String debugApp = Settings.Global.getString(resolver, DEBUG_APP);
final boolean waitForDebugger = Settings.Global.getInt(resolver, WAIT_FOR_DEBUGGER, 0) != 0;
final boolean alwaysFinishActivities =
Settings.Global.getInt(resolver, ALWAYS_FINISH_ACTIVITIES, 0) != 0;
- final boolean forceRtl = Settings.Global.getInt(resolver, DEVELOPMENT_FORCE_RTL, 0) != 0;
- final boolean forceResizable = Settings.Global.getInt(
- resolver, DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0;
final long waitForNetworkTimeoutMs = Settings.Global.getLong(resolver,
NETWORK_ACCESS_TIMEOUT_MS, NETWORK_ACCESS_TIMEOUT_DEFAULT_MS);
- final boolean supportsLeanbackOnly =
- mContext.getPackageManager().hasSystemFeature(FEATURE_LEANBACK_ONLY);
mHiddenApiBlacklist.registerObserver();
- // Transfer any global setting for forcing RTL layout, into a System Property
- SystemProperties.set(DEVELOPMENT_FORCE_RTL, forceRtl ? "1":"0");
-
- final Configuration configuration = new Configuration();
- Settings.System.getConfiguration(resolver, configuration);
- if (forceRtl) {
- // This will take care of setting the correct layout direction flags
- configuration.setLayoutDirection(configuration.locale);
- }
-
synchronized (this) {
mDebugApp = mOrigDebugApp = debugApp;
mWaitForDebugger = mOrigWaitForDebugger = waitForDebugger;
mAlwaysFinishActivities = alwaysFinishActivities;
- mSupportsLeanbackOnly = supportsLeanbackOnly;
- mForceResizableActivities = forceResizable;
- final boolean multiWindowFormEnabled = freeformWindowManagement
- || supportsSplitScreenMultiWindow
- || supportsPictureInPicture
- || supportsMultiDisplay;
- if ((supportsMultiWindow || forceResizable) && multiWindowFormEnabled) {
- mSupportsMultiWindow = true;
- mSupportsFreeformWindowManagement = freeformWindowManagement;
- mSupportsSplitScreenMultiWindow = supportsSplitScreenMultiWindow;
- mSupportsPictureInPicture = supportsPictureInPicture;
- mSupportsMultiDisplay = supportsMultiDisplay;
- } else {
- mSupportsMultiWindow = false;
- mSupportsFreeformWindowManagement = false;
- mSupportsSplitScreenMultiWindow = false;
- mSupportsPictureInPicture = false;
- mSupportsMultiDisplay = false;
- }
- mWindowManager.setForceResizableTasks(mForceResizableActivities);
- mWindowManager.setSupportsPictureInPicture(mSupportsPictureInPicture);
- // This happens before any activities are started, so we can change global configuration
- // in-place.
- updateConfigurationLocked(configuration, null, true);
- final Configuration globalConfig = getGlobalConfiguration();
- if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Initial config: " + globalConfig);
-
// Load resources only after the current configuration has been set.
final Resources res = mContext.getResources();
- mThumbnailWidth = res.getDimensionPixelSize(
- com.android.internal.R.dimen.thumbnail_width);
- mThumbnailHeight = res.getDimensionPixelSize(
- com.android.internal.R.dimen.thumbnail_height);
mAppErrors.loadAppsNotReportingCrashesFromConfigLocked(res.getString(
com.android.internal.R.string.config_appsNotReportingCrashes));
mUserController.mUserSwitchUiEnabled = !res.getBoolean(
@@ -15265,14 +11546,6 @@ public class ActivityManagerService extends IActivityManager.Stub
mUserController.mMaxRunningUsers = res.getInteger(
com.android.internal.R.integer.config_multiuserMaxRunningUsers);
- if ((globalConfig.uiMode & UI_MODE_TYPE_TELEVISION) == UI_MODE_TYPE_TELEVISION) {
- mFullscreenThumbnailScale = (float) res
- .getInteger(com.android.internal.R.integer.thumbnail_width_tv) /
- (float) globalConfig.screenWidthDp;
- } else {
- mFullscreenThumbnailScale = res.getFraction(
- com.android.internal.R.fraction.thumbnail_fullscreen_scale, 1, 1);
- }
mWaitForNetworkTimeoutMs = waitForNetworkTimeoutMs;
}
}
@@ -15293,11 +11566,9 @@ public class ActivityManagerService extends IActivityManager.Stub
PackageManager.FEATURE_CANT_SAVE_STATE);
mLocalDeviceIdleController
= LocalServices.getService(DeviceIdleController.LocalService.class);
- mAssistUtils = new AssistUtils(mContext);
- mVrController.onSystemReady();
+ mActivityTaskManager.onSystemReady();
// Make sure we have the current profile info, since it is needed for security checks.
mUserController.onSystemReady();
- mRecentTasks.onSystemReadyLocked();
mAppOpsService.systemReady();
mSystemReady = true;
}
@@ -15424,19 +11695,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
startHomeActivityLocked(currentUserId, "systemReady");
- try {
- if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
- Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
- + " data partition or your device will be unstable.");
- mUiHandler.obtainMessage(SHOW_UID_ERROR_UI_MSG).sendToTarget();
- }
- } catch (RemoteException e) {
- }
-
- if (!Build.isBuildConsistent()) {
- Slog.e(TAG, "Build fingerprint is not consistent, warning user");
- mUiHandler.obtainMessage(SHOW_FINGERPRINT_ERROR_UI_MSG).sendToTarget();
- }
+ mAtmInternal.showSystemReadyErrorDialogsIfNeeded();
long ident = Binder.clearCallingIdentity();
try {
@@ -15477,6 +11736,7 @@ public class ActivityManagerService extends IActivityManager.Stub
public void onLimitReached(int uid) {
Slog.wtf(TAG, "Uid " + uid + " sent too many Binders to uid "
+ Process.myUid());
+ BinderProxy.dumpProxyDebugInfo();
if (uid == Process.SYSTEM_UID) {
Slog.i(TAG, "Skipping kill (uid is SYSTEM)");
} else {
@@ -15571,13 +11831,13 @@ public class ActivityManagerService extends IActivityManager.Stub
public void handleApplicationStrictModeViolation(
IBinder app,
- int violationMask,
+ int penaltyMask,
StrictMode.ViolationInfo info) {
// We're okay if the ProcessRecord is missing; it probably means that
// we're reporting a violation from the system process itself.
final ProcessRecord r = findAppProcess(app, "StrictMode");
- if ((violationMask & StrictMode.PENALTY_DROPBOX) != 0) {
+ if ((penaltyMask & StrictMode.PENALTY_DROPBOX) != 0) {
Integer stackFingerprint = info.hashCode();
boolean logIt = true;
synchronized (mAlreadyLoggedViolatedStacks) {
@@ -15601,7 +11861,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- if ((violationMask & StrictMode.PENALTY_DIALOG) != 0) {
+ if ((penaltyMask & StrictMode.PENALTY_DIALOG) != 0) {
AppErrorResult result = new AppErrorResult();
synchronized (this) {
final long origId = Binder.clearCallingIdentity();
@@ -15611,7 +11871,6 @@ public class ActivityManagerService extends IActivityManager.Stub
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("result", result);
data.put("app", r);
- data.put("violationMask", violationMask);
data.put("info", info);
msg.obj = data;
mUiHandler.sendMessage(msg);
@@ -15715,7 +11974,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final boolean isFatal = Build.IS_ENG || Settings.Global
.getInt(mContext.getContentResolver(), Settings.Global.WTF_IS_FATAL, 0) != 0;
- final boolean isSystem = (r == null) || r.persistent;
+ final boolean isSystem = (r == null) || r.isPersistent();
if (isFatal && !isSystem) {
mAppErrors.crashApplication(r, crashInfo);
@@ -15878,8 +12137,8 @@ public class ActivityManagerService extends IActivityManager.Stub
if (activity != null) {
sb.append("Activity: ").append(activity.shortComponentName).append("\n");
}
- if (parent != null && parent.app != null && parent.app.pid != process.pid) {
- sb.append("Parent-Process: ").append(parent.app.processName).append("\n");
+ if (parent != null && parent.app != null && parent.app.getPid() != process.pid) {
+ sb.append("Parent-Process: ").append(parent.app.mName).append("\n");
}
if (parent != null && parent != activity) {
sb.append("Parent-Activity: ").append(parent.shortComponentName).append("\n");
@@ -15981,25 +12240,27 @@ public class ActivityManagerService extends IActivityManager.Stub
if (!allUsers && app.userId != userId) {
continue;
}
- if ((app.thread != null) && (app.crashing || app.notResponding)) {
+ final boolean crashing = app.isCrashing();
+ final boolean notResponding = app.isNotResponding();
+ if ((app.thread != null) && (crashing || notResponding)) {
// This one's in trouble, so we'll generate a report for it
// crashes are higher priority (in case there's a crash *and* an anr)
ActivityManager.ProcessErrorStateInfo report = null;
- if (app.crashing) {
+ if (crashing) {
report = app.crashingReport;
- } else if (app.notResponding) {
+ } else if (notResponding) {
report = app.notRespondingReport;
}
if (report != null) {
if (errList == null) {
- errList = new ArrayList<ActivityManager.ProcessErrorStateInfo>(1);
+ errList = new ArrayList<>(1);
}
errList.add(report);
} else {
Slog.w(TAG, "Missing app error report, app = " + app.processName +
- " crashing = " + app.crashing +
- " notResponding = " + app.notResponding);
+ " crashing = " + crashing +
+ " notResponding = " + notResponding);
}
}
}
@@ -16021,7 +12282,7 @@ public class ActivityManagerService extends IActivityManager.Stub
return imp;
}
- private void fillInProcMemInfo(ProcessRecord app,
+ private void fillInProcMemInfoLocked(ProcessRecord app,
ActivityManager.RunningAppProcessInfo outInfo,
int clientTargetSdk) {
outInfo.pid = app.pid;
@@ -16029,10 +12290,10 @@ public class ActivityManagerService extends IActivityManager.Stub
if (mHeavyWeightProcess == app) {
outInfo.flags |= ActivityManager.RunningAppProcessInfo.FLAG_CANT_SAVE_STATE;
}
- if (app.persistent) {
+ if (app.isPersistent()) {
outInfo.flags |= ActivityManager.RunningAppProcessInfo.FLAG_PERSISTENT;
}
- if (app.activities.size() > 0) {
+ if (app.hasActivities()) {
outInfo.flags |= ActivityManager.RunningAppProcessInfo.FLAG_HAS_ACTIVITIES;
}
outInfo.lastTrimLevel = app.trimMemoryLevel;
@@ -16041,6 +12302,8 @@ public class ActivityManagerService extends IActivityManager.Stub
outInfo.importance = procStateToImportance(procState, adj, outInfo, clientTargetSdk);
outInfo.importanceReasonCode = app.adjTypeCode;
outInfo.processState = app.curProcState;
+ outInfo.isFocused = (app == getTopAppLocked());
+ outInfo.lastActivityTime = app.lastActivityTime;
}
@Override
@@ -16055,7 +12318,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final boolean allUsers = ActivityManager.checkUidPermission(INTERACT_ACROSS_USERS_FULL,
callingUid) == PackageManager.PERMISSION_GRANTED;
final int userId = UserHandle.getUserId(callingUid);
- final boolean allUids = isGetTasksAllowed(
+ final boolean allUids = mAtmInternal.isGetTasksAllowed(
"getRunningAppProcesses", Binder.getCallingPid(), callingUid);
synchronized (this) {
@@ -16066,12 +12329,12 @@ public class ActivityManagerService extends IActivityManager.Stub
|| (!allUids && app.uid != callingUid)) {
continue;
}
- if ((app.thread != null) && (!app.crashing && !app.notResponding)) {
+ if ((app.thread != null) && (!app.isCrashing() && !app.isNotResponding())) {
// Generate process state info for running application
ActivityManager.RunningAppProcessInfo currApp =
new ActivityManager.RunningAppProcessInfo(app.processName,
app.pid, app.getPackageList());
- fillInProcMemInfo(app, currApp, clientTargetSdk);
+ fillInProcMemInfoLocked(app, currApp, clientTargetSdk);
if (app.adjSource instanceof ProcessRecord) {
currApp.importanceReasonPid = ((ProcessRecord)app.adjSource).pid;
currApp.importanceReasonImportance =
@@ -16079,7 +12342,7 @@ public class ActivityManagerService extends IActivityManager.Stub
app.adjSourceProcState);
} else if (app.adjSource instanceof ActivityRecord) {
ActivityRecord r = (ActivityRecord)app.adjSource;
- if (r.app != null) currApp.importanceReasonPid = r.app.pid;
+ if (r.app != null) currApp.importanceReasonPid = r.app.getPid();
}
if (app.adjTarget instanceof ComponentName) {
currApp.importanceReasonComponent = (ComponentName)app.adjTarget;
@@ -16140,7 +12403,7 @@ public class ActivityManagerService extends IActivityManager.Stub
proc = mPidsSelfLocked.get(Binder.getCallingPid());
}
if (proc != null) {
- fillInProcMemInfo(proc, outState, clientTargetSdk);
+ fillInProcMemInfoLocked(proc, outState, clientTargetSdk);
}
}
}
@@ -16161,23 +12424,6 @@ public class ActivityManagerService extends IActivityManager.Stub
this, in, out, err, args, callback, resultReceiver);
}
- SleepToken acquireSleepToken(String tag, int displayId) {
- synchronized (this) {
- final SleepToken token = mStackSupervisor.createSleepTokenLocked(tag, displayId);
- if (mEnableNetOpts) {
- ActivityStack stack = mStackSupervisor.getLastStack();
- if (stack != null) {
- ActivityRecord r = stack.topRunningActivityLocked();
- if (r != null) {
- networkOptsCheck(1, r.processName);
- }
- }
- }
- updateSleepIfNeededLocked();
- return token;
- }
- }
-
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
PriorityDump.dump(mPriorityDumper, fd, pw, args);
@@ -16321,6 +12567,10 @@ public class ActivityManagerService extends IActivityManager.Stub
synchronized (this) {
dumpLastANRLocked(pw);
}
+ } else if ("lastanr-traces".equals(cmd)) {
+ synchronized (this) {
+ dumpLastANRTracesLocked(pw);
+ }
} else if ("starter".equals(cmd)) {
synchronized (this) {
dumpActivityStarterLocked(pw, dumpPackage);
@@ -16331,14 +12581,16 @@ public class ActivityManagerService extends IActivityManager.Stub
}
} else if ("recents".equals(cmd) || "r".equals(cmd)) {
synchronized (this) {
- if (mRecentTasks != null) {
- mRecentTasks.dump(pw, true /* dumpAll */, dumpPackage);
+ if (mActivityTaskManager.getRecentTasks() != null) {
+ mActivityTaskManager.getRecentTasks().dump(pw, true /* dumpAll */, dumpPackage);
}
}
} else if ("binder-proxies".equals(cmd)) {
if (opti >= args.length) {
+ dumpBinderProxyInterfaceCounts(pw,
+ "Top proxy interface names held by SYSTEM");
dumpBinderProxiesCounts(pw, BinderInternal.nGetBinderProxyPerUidCounts(),
- "Counts of Binder Proxies held by SYSTEM");
+ "Number of proxies per uid held by SYSTEM");
} else {
String uid = args[opti];
opti++;
@@ -16535,8 +12787,8 @@ public class ActivityManagerService extends IActivityManager.Stub
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- if (mRecentTasks != null) {
- mRecentTasks.dump(pw, dumpAll, dumpPackage);
+ if (mActivityTaskManager.getRecentTasks() != null) {
+ mActivityTaskManager.getRecentTasks().dump(pw, dumpAll, dumpPackage);
}
pw.println();
if (dumpAll) {
@@ -16612,8 +12864,8 @@ public class ActivityManagerService extends IActivityManager.Stub
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- if (mRecentTasks != null) {
- mRecentTasks.dump(pw, dumpAll, dumpPackage);
+ if (mActivityTaskManager.getRecentTasks() != null) {
+ mActivityTaskManager.getRecentTasks().dump(pw, dumpAll, dumpPackage);
}
pw.println();
if (dumpAll) {
@@ -16651,6 +12903,11 @@ public class ActivityManagerService extends IActivityManager.Stub
pw.println("-------------------------------------------------------------------------------");
}
dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage, dumpAppId);
+ pw.println();
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ }
+ mOomAdjProfiler.dump(pw);
}
}
Binder.restoreCallingIdentity(origId);
@@ -16670,6 +12927,36 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
+ private void dumpLastANRTracesLocked(PrintWriter pw) {
+ pw.println("ACTIVITY MANAGER LAST ANR TRACES (dumpsys activity lastanr-traces)");
+
+ final File[] files = new File(ANR_TRACE_DIR).listFiles();
+ if (ArrayUtils.isEmpty(files)) {
+ pw.println(" <no ANR has occurred since boot>");
+ return;
+ }
+ // Find the latest file.
+ File latest = null;
+ for (File f : files) {
+ if ((latest == null) || (latest.lastModified() < f.lastModified())) {
+ latest = f;
+ }
+ }
+ pw.print("File: ");
+ pw.print(latest.getName());
+ pw.println();
+ try (BufferedReader in = new BufferedReader(new FileReader(latest))) {
+ String line;
+ while ((line = in.readLine()) != null) {
+ pw.println(line);
+ }
+ } catch (IOException e) {
+ pw.print("Unable to read: ");
+ pw.print(e);
+ pw.println();
+ }
+ }
+
private void dumpActivityContainersLocked(PrintWriter pw) {
pw.println("ACTIVITY MANAGER STARTER (dumpsys activity containers)");
mStackSupervisor.dumpChildrenNames(pw, " ");
@@ -16678,7 +12965,7 @@ public class ActivityManagerService extends IActivityManager.Stub
private void dumpActivityStarterLocked(PrintWriter pw, String dumpPackage) {
pw.println("ACTIVITY MANAGER STARTER (dumpsys activity starter)");
- mActivityStartController.dump(pw, "", dumpPackage);
+ mActivityTaskManager.getActivityStartController().dump(pw, "", dumpPackage);
}
void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
@@ -16841,6 +13128,15 @@ public class ActivityManagerService extends IActivityManager.Stub
return printed;
}
+ void dumpBinderProxyInterfaceCounts(PrintWriter pw, String header) {
+ final BinderProxy.InterfaceCount[] proxyCounts = BinderProxy.getSortedInterfaceCounts(50);
+
+ pw.println(header);
+ for (int i = 0; i < proxyCounts.length; i++) {
+ pw.println(" #" + (i + 1) + ": " + proxyCounts[i]);
+ }
+ }
+
boolean dumpBinderProxiesCounts(PrintWriter pw, SparseIntArray counts, String header) {
if(counts != null) {
pw.println(header);
@@ -16891,11 +13187,11 @@ public class ActivityManagerService extends IActivityManager.Stub
pw.println(" All known processes:");
needSep = true;
}
- pw.print(r.persistent ? " *PERS*" : " *APP*");
+ pw.print(r.isPersistent() ? " *PERS*" : " *APP*");
pw.print(" UID "); pw.print(procs.keyAt(ia));
pw.print(" "); pw.println(r);
r.dump(pw, " ");
- if (r.persistent) {
+ if (r.isPersistent()) {
numPers++;
}
}
@@ -17047,27 +13343,27 @@ public class ActivityManagerService extends IActivityManager.Stub
needSep = false;
mUserController.dump(pw, dumpAll);
}
- if (mHomeProcess != null && (dumpPackage == null
- || mHomeProcess.pkgList.containsKey(dumpPackage))) {
+ if (mActivityTaskManager.mHomeProcess != null && (dumpPackage == null
+ || mActivityTaskManager.mHomeProcess.mPkgList.contains(dumpPackage))) {
if (needSep) {
pw.println();
needSep = false;
}
- pw.println(" mHomeProcess: " + mHomeProcess);
+ pw.println(" mHomeProcess: " + mActivityTaskManager.mHomeProcess);
}
- if (mPreviousProcess != null && (dumpPackage == null
- || mPreviousProcess.pkgList.containsKey(dumpPackage))) {
+ if (mActivityTaskManager.mPreviousProcess != null && (dumpPackage == null
+ || mActivityTaskManager.mPreviousProcess.mPkgList.contains(dumpPackage))) {
if (needSep) {
pw.println();
needSep = false;
}
- pw.println(" mPreviousProcess: " + mPreviousProcess);
+ pw.println(" mPreviousProcess: " + mActivityTaskManager.mPreviousProcess);
}
- if (dumpAll && (mPreviousProcess == null || dumpPackage == null
- || mPreviousProcess.pkgList.containsKey(dumpPackage))) {
+ if (dumpAll && (mActivityTaskManager.mPreviousProcess == null || dumpPackage == null
+ || mActivityTaskManager.mPreviousProcess.mPkgList.contains(dumpPackage))) {
StringBuilder sb = new StringBuilder(128);
sb.append(" mPreviousProcessVisibleTime: ");
- TimeUtils.formatDuration(mPreviousProcessVisibleTime, sb);
+ TimeUtils.formatDuration(mActivityTaskManager.mPreviousProcessVisibleTime, sb);
pw.println(sb);
}
if (mHeavyWeightProcess != null && (dumpPackage == null
@@ -17092,7 +13388,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (dumpAll) {
if (dumpPackage == null) {
- pw.println(" mConfigWillChange: " + getFocusedStack().mConfigWillChange);
+ pw.println(" mConfigWillChange: " + mActivityTaskManager.getFocusedStack().mConfigWillChange);
}
if (mCompatModePackages.getPackages().size() > 0) {
boolean printed = false;
@@ -17168,14 +13464,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (dumpPackage == null) {
pw.println(" mWakefulness="
+ PowerManagerInternal.wakefulnessToString(mWakefulness));
- pw.println(" mSleepTokens=" + mStackSupervisor.mSleepTokens);
- pw.println(" mSleeping=" + mSleeping);
- pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + mTestPssMode);
- if (mRunningVoice != null) {
- pw.println(" mRunningVoice=" + mRunningVoice);
- pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
- }
- pw.println(" mVrController=" + mVrController);
+ mActivityTaskManager.dumpSleepStates(pw, mTestPssMode);
}
if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient
|| mOrigWaitForDebugger) {
@@ -17190,8 +13479,8 @@ public class ActivityManagerService extends IActivityManager.Stub
+ " mOrigWaitForDebugger=" + mOrigWaitForDebugger);
}
}
- if (mCurAppTimeTracker != null) {
- mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
+ if (mActivityTaskManager.mCurAppTimeTracker != null) {
+ mActivityTaskManager.mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
}
if (mMemWatchProcesses.getMap().size() > 0) {
pw.println(" Mem watch processes:");
@@ -17257,10 +13546,10 @@ public class ActivityManagerService extends IActivityManager.Stub
pw.println(" mNativeDebuggingApp=" + mNativeDebuggingApp);
}
}
- if (mAllowAppSwitchUids.size() > 0) {
+ if (mActivityTaskManager.mAllowAppSwitchUids.size() > 0) {
boolean printed = false;
- for (int i = 0; i < mAllowAppSwitchUids.size(); i++) {
- ArrayMap<String, Integer> types = mAllowAppSwitchUids.valueAt(i);
+ for (int i = 0; i < mActivityTaskManager.mAllowAppSwitchUids.size(); i++) {
+ ArrayMap<String, Integer> types = mActivityTaskManager.mAllowAppSwitchUids.valueAt(i);
for (int j = 0; j < types.size(); j++) {
if (dumpPackage == null ||
UserHandle.getAppId(types.valueAt(j).intValue()) == dumpAppId) {
@@ -17273,7 +13562,7 @@ public class ActivityManagerService extends IActivityManager.Stub
printed = true;
}
pw.print(" User ");
- pw.print(mAllowAppSwitchUids.keyAt(i));
+ pw.print(mActivityTaskManager.mAllowAppSwitchUids.keyAt(i));
pw.print(": Type ");
pw.print(types.keyAt(j));
pw.print(" = ");
@@ -17287,9 +13576,9 @@ public class ActivityManagerService extends IActivityManager.Stub
if (mAlwaysFinishActivities) {
pw.println(" mAlwaysFinishActivities=" + mAlwaysFinishActivities);
}
- if (mController != null) {
- pw.println(" mController=" + mController
- + " mControllerIsAMonkey=" + mControllerIsAMonkey);
+ if (mActivityTaskManager.mController != null) {
+ pw.println(" mController=" + mActivityTaskManager.mController
+ + " mControllerIsAMonkey=" + mActivityTaskManager.mControllerIsAMonkey);
}
if (dumpAll) {
pw.println(" Total persistent processes: " + numPers);
@@ -17363,7 +13652,7 @@ public class ActivityManagerService extends IActivityManager.Stub
continue;
}
r.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.PROCS);
- if (r.persistent) {
+ if (r.isPersistent()) {
numPers++;
}
}
@@ -17470,18 +13759,18 @@ public class ActivityManagerService extends IActivityManager.Stub
if (dumpPackage == null) {
mUserController.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.USER_CONTROLLER);
getGlobalConfiguration().writeToProto(proto, ActivityManagerServiceDumpProcessesProto.GLOBAL_CONFIGURATION);
- proto.write(ActivityManagerServiceDumpProcessesProto.CONFIG_WILL_CHANGE, getFocusedStack().mConfigWillChange);
+ proto.write(ActivityManagerServiceDumpProcessesProto.CONFIG_WILL_CHANGE, mActivityTaskManager.getFocusedStack().mConfigWillChange);
}
- if (mHomeProcess != null && (dumpPackage == null
- || mHomeProcess.pkgList.containsKey(dumpPackage))) {
- mHomeProcess.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.HOME_PROC);
+ if (mActivityTaskManager.mHomeProcess != null && (dumpPackage == null
+ || mActivityTaskManager.mHomeProcess.mPkgList.contains(dumpPackage))) {
+ ((ProcessRecord) mActivityTaskManager.mHomeProcess.mOwner).writeToProto(proto, ActivityManagerServiceDumpProcessesProto.HOME_PROC);
}
- if (mPreviousProcess != null && (dumpPackage == null
- || mPreviousProcess.pkgList.containsKey(dumpPackage))) {
- mPreviousProcess.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC);
- proto.write(ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS, mPreviousProcessVisibleTime);
+ if (mActivityTaskManager.mPreviousProcess != null && (dumpPackage == null
+ || mActivityTaskManager.mPreviousProcess.mPkgList.contains(dumpPackage))) {
+ ((ProcessRecord) mActivityTaskManager.mPreviousProcess.mOwner).writeToProto(proto, ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC);
+ proto.write(ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS, mActivityTaskManager.mPreviousProcessVisibleTime);
}
if (mHeavyWeightProcess != null && (dumpPackage == null
@@ -17528,22 +13817,10 @@ public class ActivityManagerService extends IActivityManager.Stub
final long sleepToken = proto.start(ActivityManagerServiceDumpProcessesProto.SLEEP_STATUS);
proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.WAKEFULNESS,
PowerManagerInternal.wakefulnessToProtoEnum(mWakefulness));
- for (SleepToken st : mStackSupervisor.mSleepTokens) {
- proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEP_TOKENS, st.toString());
- }
- proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEPING, mSleeping);
- proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SHUTTING_DOWN, mShuttingDown);
proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.TEST_PSS_MODE, mTestPssMode);
proto.end(sleepToken);
- if (mRunningVoice != null) {
- final long vrToken = proto.start(ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE);
- proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION, mRunningVoice.toString());
- mVoiceWakeLock.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK);
- proto.end(vrToken);
- }
-
- mVrController.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.VR_CONTROLLER);
+ mActivityTaskManager.writeSleepStateToProto(proto);
}
if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient
@@ -17559,8 +13836,9 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- if (mCurAppTimeTracker != null) {
- mCurAppTimeTracker.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER, true);
+ if (mActivityTaskManager.mCurAppTimeTracker != null) {
+ mActivityTaskManager.mCurAppTimeTracker.writeToProto(
+ proto, ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER, true);
}
if (mMemWatchProcesses.getMap().size() > 0) {
@@ -17619,10 +13897,10 @@ public class ActivityManagerService extends IActivityManager.Stub
if (dumpPackage == null) {
proto.write(ActivityManagerServiceDumpProcessesProto.ALWAYS_FINISH_ACTIVITIES, mAlwaysFinishActivities);
- if (mController != null) {
+ if (mActivityTaskManager.mController != null) {
final long token = proto.start(ActivityManagerServiceDumpProcessesProto.CONTROLLER);
- proto.write(ActivityManagerServiceDumpProcessesProto.Controller.CONTROLLER, mController.toString());
- proto.write(ActivityManagerServiceDumpProcessesProto.Controller.IS_A_MONKEY, mControllerIsAMonkey);
+ proto.write(ActivityManagerServiceDumpProcessesProto.Controller.CONTROLLER, mActivityTaskManager.mController.toString());
+ proto.write(ActivityManagerServiceDumpProcessesProto.Controller.IS_A_MONKEY, mActivityTaskManager.mControllerIsAMonkey);
proto.end(token);
}
proto.write(ActivityManagerServiceDumpProcessesProto.TOTAL_PERSISTENT_PROCS, numPers);
@@ -17751,8 +14029,8 @@ public class ActivityManagerService extends IActivityManager.Stub
dumpProcessesToGc(pw, needSep, null);
pw.println();
- pw.println(" mHomeProcess: " + mHomeProcess);
- pw.println(" mPreviousProcess: " + mPreviousProcess);
+ pw.println(" mHomeProcess: " + mActivityTaskManager.mHomeProcess);
+ pw.println(" mPreviousProcess: " + mActivityTaskManager.mPreviousProcess);
if (mHeavyWeightProcess != null) {
pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
}
@@ -17924,20 +14202,20 @@ public class ActivityManagerService extends IActivityManager.Stub
pw.print(prefix); pw.print("ACTIVITY "); pw.print(r.shortComponentName);
pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(r)));
pw.print(" pid=");
- if (r.app != null) pw.println(r.app.pid);
+ if (r.hasProcess()) pw.println(r.app.getPid());
else pw.println("(not running)");
if (dumpAll) {
r.dump(pw, innerPrefix);
}
}
- if (r.app != null && r.app.thread != null) {
+ if (r.attachedToProcess()) {
// flush anything that is already in the PrintWriter since the thread is going
// to write to the file descriptor directly
pw.flush();
try {
TransferPipe tp = new TransferPipe();
try {
- r.app.thread.dumpActivity(tp.getWriteFd(),
+ r.app.getThread().dumpActivity(tp.getWriteFd(),
r.appToken, innerPrefix, args);
tp.go(fd);
} finally {
@@ -18292,9 +14570,9 @@ public class ActivityManagerService extends IActivityManager.Stub
continue;
}
pw.println(String.format("%s%s #%2d: %s",
- prefix, (r.persistent ? persistentLabel : normalLabel),
+ prefix, (r.isPersistent() ? persistentLabel : normalLabel),
i, r.toString()));
- if (r.persistent) {
+ if (r.isPersistent()) {
numPers++;
}
}
@@ -18347,7 +14625,7 @@ public class ActivityManagerService extends IActivityManager.Stub
ProcessRecord r = list.get(i).first;
long token = proto.start(fieldId);
String oomAdj = ProcessList.makeOomAdjString(r.setAdj);
- proto.write(ProcessOomProto.PERSISTENT, r.persistent);
+ proto.write(ProcessOomProto.PERSISTENT, r.isPersistent());
proto.write(ProcessOomProto.NUM, (origList.size()-1)-list.get(i).second);
proto.write(ProcessOomProto.OOM_ADJ, oomAdj);
int schedGroup = ProcessOomProto.SCHED_GROUP_UNKNOWN;
@@ -18370,7 +14648,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
if (r.foregroundActivities) {
proto.write(ProcessOomProto.ACTIVITIES, true);
- } else if (r.foregroundServices) {
+ } else if (r.hasForegroundServices()) {
proto.write(ProcessOomProto.SERVICES, true);
}
proto.write(ProcessOomProto.STATE, ProcessList.makeProcStateProtoEnum(r.curProcState));
@@ -18467,14 +14745,14 @@ public class ActivityManagerService extends IActivityManager.Stub
char foreground;
if (r.foregroundActivities) {
foreground = 'A';
- } else if (r.foregroundServices) {
+ } else if (r.hasForegroundServices()) {
foreground = 'S';
} else {
foreground = ' ';
}
String procState = ProcessList.makeProcStateString(r.curProcState);
pw.print(prefix);
- pw.print(r.persistent ? persistentLabel : normalLabel);
+ pw.print(r.isPersistent() ? persistentLabel : normalLabel);
pw.print(" #");
int num = (origList.size()-1)-list.get(i).second;
if (num < 10) pw.print(' ');
@@ -19089,7 +15367,7 @@ public class ActivityManagerService extends IActivityManager.Stub
thread = r.thread;
pid = r.pid;
oomAdj = r.getSetAdjWithServices();
- hasActivities = r.activities.size() > 0;
+ hasActivities = r.hasActivities();
}
if (thread != null) {
if (!opts.isCheckinRequest && opts.dumpDetails) {
@@ -19156,7 +15434,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (r.thread != null && oomAdj == r.getSetAdjWithServices()) {
// Record this for posterity if the process has been stable.
r.baseProcessTracker.addPss(myTotalPss, myTotalUss, myTotalRss, true,
- reportType, endTime-startTime, r.pkgList);
+ reportType, endTime-startTime, r.pkgList.mPkgList);
}
}
@@ -19592,7 +15870,7 @@ public class ActivityManagerService extends IActivityManager.Stub
thread = r.thread;
pid = r.pid;
oomAdj = r.getSetAdjWithServices();
- hasActivities = r.activities.size() > 0;
+ hasActivities = r.hasActivities();
}
if (thread == null) {
continue;
@@ -19654,7 +15932,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (r.thread != null && oomAdj == r.getSetAdjWithServices()) {
// Record this for posterity if the process has been stable.
r.baseProcessTracker.addPss(myTotalPss, myTotalUss, myTotalRss, true,
- reportType, endTime-startTime, r.pkgList);
+ reportType, endTime-startTime, r.pkgList.mPkgList);
}
}
@@ -19924,6 +16202,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
updateCpuStatsNow();
long[] memtrackTmp = new long[1];
+ long[] swaptrackTmp = new long[2];
final List<ProcessCpuTracker.Stats> stats;
// Get a list of Stats that have vsize > 0
synchronized (mProcessCpuTracker) {
@@ -19934,12 +16213,13 @@ public class ActivityManagerService extends IActivityManager.Stub
final int statsCount = stats.size();
for (int i = 0; i < statsCount; i++) {
ProcessCpuTracker.Stats st = stats.get(i);
- long pss = Debug.getPss(st.pid, null, memtrackTmp);
+ long pss = Debug.getPss(st.pid, swaptrackTmp, memtrackTmp);
if (pss > 0) {
if (infoMap.indexOfKey(st.pid) < 0) {
ProcessMemInfo mi = new ProcessMemInfo(st.name, st.pid,
ProcessList.NATIVE_ADJ, -1, "native", null);
mi.pss = pss;
+ mi.swapPss = swaptrackTmp[1];
mi.memtrack = memtrackTmp[0];
memInfos.add(mi);
}
@@ -19947,14 +16227,17 @@ public class ActivityManagerService extends IActivityManager.Stub
}
long totalPss = 0;
+ long totalSwapPss = 0;
long totalMemtrack = 0;
for (int i=0, N=memInfos.size(); i<N; i++) {
ProcessMemInfo mi = memInfos.get(i);
if (mi.pss == 0) {
- mi.pss = Debug.getPss(mi.pid, null, memtrackTmp);
+ mi.pss = Debug.getPss(mi.pid, swaptrackTmp, memtrackTmp);
+ mi.swapPss = swaptrackTmp[1];
mi.memtrack = memtrackTmp[0];
}
totalPss += mi.pss;
+ totalSwapPss += mi.swapPss;
totalMemtrack += mi.memtrack;
}
Collections.sort(memInfos, new Comparator<ProcessMemInfo>() {
@@ -20116,7 +16399,7 @@ public class ActivityManagerService extends IActivityManager.Stub
memInfoBuilder.append("\n");
memInfoBuilder.append(" Lost RAM: ");
memInfoBuilder.append(stringifyKBSize(memInfo.getTotalSizeKb()
- - totalPss - memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb()
+ - (totalPss - totalSwapPss) - memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb()
- memInfo.getKernelUsedSizeKb() - memInfo.getZramTotalSizeKb()));
memInfoBuilder.append("\n");
Slog.i(TAG, "Low on memory:");
@@ -20220,7 +16503,7 @@ public class ActivityManagerService extends IActivityManager.Stub
ProcessRecord capp = conn.client;
conn.dead = true;
if (conn.stableCount > 0) {
- if (!capp.persistent && capp.thread != null
+ if (!capp.isPersistent() && capp.thread != null
&& capp.pid != 0
&& capp.pid != MY_PID) {
capp.kill("depends on provider "
@@ -20237,7 +16520,8 @@ public class ActivityManagerService extends IActivityManager.Stub
// clean up this connection, we'll just remove it.
cpr.connections.remove(i);
if (conn.client.conProviders.remove(conn)) {
- stopAssociationLocked(capp.uid, capp.processName, cpr.uid, cpr.name);
+ stopAssociationLocked(capp.uid, capp.processName, cpr.uid,
+ cpr.appInfo.longVersionCode, cpr.name, cpr.info.processName);
}
}
}
@@ -20282,8 +16566,8 @@ public class ActivityManagerService extends IActivityManager.Stub
app.waitDialog = null;
}
- app.crashing = false;
- app.notResponding = false;
+ app.setCrashing(false);
+ app.setNotResponding(false);
app.resetPackageList(mProcessStats);
app.unlinkDeathRecipient();
@@ -20313,7 +16597,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
cpr.provider = null;
- cpr.proc = null;
+ cpr.setProcess(null);
}
app.pubProviders.clear();
@@ -20328,7 +16612,8 @@ public class ActivityManagerService extends IActivityManager.Stub
ContentProviderConnection conn = app.conProviders.get(i);
conn.provider.connections.remove(conn);
stopAssociationLocked(app.uid, app.processName, conn.provider.uid,
- conn.provider.name);
+ conn.provider.appInfo.longVersionCode, conn.provider.name,
+ conn.provider.info.processName);
}
app.conProviders.clear();
}
@@ -20392,7 +16677,7 @@ public class ActivityManagerService extends IActivityManager.Stub
return false;
}
- if (!app.persistent || app.isolated) {
+ if (!app.isPersistent() || app.isolated) {
if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_CLEANUP,
"Removing non-persistent process during cleanup: " + app);
if (!replacingPid) {
@@ -20416,12 +16701,7 @@ public class ActivityManagerService extends IActivityManager.Stub
TAG_CLEANUP, "Clean-up removing on hold: " + app);
mProcessesOnHold.remove(app);
- if (app == mHomeProcess) {
- mHomeProcess = null;
- }
- if (app == mPreviousProcess) {
- mPreviousProcess = null;
- }
+ mAtmInternal.onCleanUpApplicationRecord(app.getWindowProcessController());
if (restart && !app.isolated) {
// We have components that still need to be running in the
@@ -20489,8 +16769,8 @@ public class ActivityManagerService extends IActivityManager.Stub
final int callingUid = Binder.getCallingUid();
final boolean canInteractAcrossUsers = (ActivityManager.checkUidPermission(
INTERACT_ACROSS_USERS_FULL, callingUid) == PERMISSION_GRANTED);
- final boolean allowed = isGetTasksAllowed("getServices", Binder.getCallingPid(),
- callingUid);
+ final boolean allowed = mAtmInternal.isGetTasksAllowed("getServices",
+ Binder.getCallingPid(), callingUid);
synchronized (this) {
return mServices.getRunningServiceInfoLocked(maxNum, flags, callingUid,
allowed, canInteractAcrossUsers);
@@ -20865,6 +17145,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// done with this agent
public void unbindBackupAgent(ApplicationInfo appInfo) {
if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "unbindBackupAgent: " + appInfo);
+ enforceCallingPermission("android.permission.CONFIRM_FULL_BACKUP", "unbindBackupAgent");
if (appInfo == null) {
Slog.w(TAG, "unbind backup agent for null app");
return;
@@ -21465,7 +17746,7 @@ public class ActivityManagerService extends IActivityManager.Stub
isCallerSystem = true;
break;
default:
- isCallerSystem = (callerApp != null) && callerApp.persistent;
+ isCallerSystem = (callerApp != null) && callerApp.isPersistent();
break;
}
@@ -21558,14 +17839,16 @@ public class ActivityManagerService extends IActivityManager.Stub
forceStopPackageLocked(list[i], -1, false, true, true,
false, false, userId, "storage unmount");
}
- mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
+ mActivityTaskManager.getRecentTasks().cleanupLocked(
+ UserHandle.USER_ALL);
sendPackageBroadcastLocked(
ApplicationThreadConstants.EXTERNAL_STORAGE_UNAVAILABLE,
list, userId);
}
break;
case Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE:
- mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
+ mActivityTaskManager.getRecentTasks().cleanupLocked(
+ UserHandle.USER_ALL);
break;
case Intent.ACTION_PACKAGE_REMOVED:
case Intent.ACTION_PACKAGE_CHANGED:
@@ -21598,7 +17881,7 @@ public class ActivityManagerService extends IActivityManager.Stub
removeUriPermissionsForPackageLocked(ssp, userId, true,
false);
- mRecentTasks.removeTasksByPackageName(ssp, userId);
+ mActivityTaskManager.getRecentTasks().removeTasksByPackageName(ssp, userId);
mServices.forceStopPackageLocked(ssp, userId);
mAppWarnings.onPackageUninstalled(ssp);
@@ -21628,7 +17911,7 @@ public class ActivityManagerService extends IActivityManager.Stub
Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
synchronized(ActivityManagerService.this) {
- mRecentTasks.onPackagesSuspendedChanged(
+ mActivityTaskManager.getRecentTasks().onPackagesSuspendedChanged(
packageNames, suspended, userHandle);
}
break;
@@ -22402,6 +18685,8 @@ public class ActivityManagerService extends IActivityManager.Stub
// Can't call out of the system process with a lock held, so post a message.
if (app.instr.mUiAutomationConnection != null) {
+ mAppOpsService.setAppOpsServiceDelegate(null);
+ getPackageManagerInternalLocked().setCheckPermissionDelegate(null);
mHandler.obtainMessage(SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG,
app.instr.mUiAutomationConnection).sendToTarget();
}
@@ -22459,69 +18744,19 @@ public class ActivityManagerService extends IActivityManager.Stub
return config;
}
- ActivityStack getFocusedStack() {
- return mStackSupervisor.getFocusedStack();
- }
-
@Override
public StackInfo getFocusedStackInfo() throws RemoteException {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
- long ident = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- ActivityStack focusedStack = getFocusedStack();
- if (focusedStack != null) {
- return mStackSupervisor.getStackInfo(focusedStack.mStackId);
- }
- return null;
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
+ return mActivityTaskManager.getFocusedStackInfo();
}
+ @Override
public Configuration getConfiguration() {
- Configuration ci;
- synchronized(this) {
- ci = new Configuration(getGlobalConfiguration());
- ci.userSetLocale = false;
- }
- return ci;
+ return mActivityTaskManager.getConfiguration();
}
@Override
public void suppressResizeConfigChanges(boolean suppress) throws RemoteException {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "suppressResizeConfigChanges()");
- synchronized (this) {
- mSuppressResizeConfigChanges = suppress;
- }
- }
-
- /**
- * NOTE: For the pinned stack, this method is usually called after the bounds animation has
- * animated the stack to the fullscreen, but can also be called if we are relaunching an
- * activity and clearing the task at the same time.
- */
- @Override
- // TODO: API should just be about changing windowing modes...
- public void moveTasksToFullscreenStack(int fromStackId, boolean onTop) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
- "moveTasksToFullscreenStack()");
- synchronized (this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- final ActivityStack stack = mStackSupervisor.getStack(fromStackId);
- if (stack != null){
- if (!stack.isActivityTypeStandardOrUndefined()) {
- throw new IllegalArgumentException(
- "You can't move tasks from non-standard stacks.");
- }
- mStackSupervisor.moveTasksToFullscreenStackLocked(stack, onTop);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
+ mActivityTaskManager.suppressResizeConfigChanges(suppress);
}
@Override
@@ -22534,34 +18769,7 @@ public class ActivityManagerService extends IActivityManager.Stub
int userId = UserHandle.getCallingUserId();
- synchronized(this) {
- updatePersistentConfigurationLocked(values, userId);
- }
- }
-
- private void updatePersistentConfigurationLocked(Configuration values, @UserIdInt int userId) {
- final long origId = Binder.clearCallingIdentity();
- try {
- updateConfigurationLocked(values, null, false, true, userId, false /* deferResume */);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- private void updateFontScaleIfNeeded(@UserIdInt int userId) {
- final float scaleFactor = Settings.System.getFloatForUser(mContext.getContentResolver(),
- FONT_SCALE, 1.0f, userId);
-
- synchronized (this) {
- if (getGlobalConfiguration().fontScale == scaleFactor) {
- return;
- }
-
- final Configuration configuration
- = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
- configuration.fontScale = scaleFactor;
- updatePersistentConfigurationLocked(configuration, userId);
- }
+ mActivityTaskManager.updatePersistentConfiguration(values, userId);
}
private void enforceWriteSettingsPermission(String func) {
@@ -22585,489 +18793,16 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public boolean updateConfiguration(Configuration values) {
- enforceCallingPermission(CHANGE_CONFIGURATION, "updateConfiguration()");
-
- synchronized(this) {
- if (values == null && mWindowManager != null) {
- // sentinel: fetch the current configuration from the window manager
- values = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
- }
-
- if (mWindowManager != null) {
- // Update OOM levels based on display size.
- mProcessList.applyDisplaySize(mWindowManager);
- }
-
- final long origId = Binder.clearCallingIdentity();
- try {
- if (values != null) {
- Settings.System.clearConfiguration(values);
- }
- updateConfigurationLocked(values, null, false, false /* persistent */,
- UserHandle.USER_NULL, false /* deferResume */,
- mTmpUpdateConfigurationResult);
- return mTmpUpdateConfigurationResult.changes != 0;
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- void updateUserConfigurationLocked() {
- final Configuration configuration = new Configuration(getGlobalConfiguration());
- final int currentUserId = mUserController.getCurrentUserId();
- Settings.System.adjustConfigurationForUser(mContext.getContentResolver(), configuration,
- currentUserId, Settings.System.canWrite(mContext));
- updateConfigurationLocked(configuration, null /* starting */, false /* initLocale */,
- false /* persistent */, currentUserId, false /* deferResume */);
- }
-
- boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
- boolean initLocale) {
- return updateConfigurationLocked(values, starting, initLocale, false /* deferResume */);
- }
-
- boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
- boolean initLocale, boolean deferResume) {
- // pass UserHandle.USER_NULL as userId because we don't persist configuration for any user
- return updateConfigurationLocked(values, starting, initLocale, false /* persistent */,
- UserHandle.USER_NULL, deferResume);
- }
-
- // To cache the list of supported system locales
- private String[] mSupportedSystemLocales = null;
-
- private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
- boolean initLocale, boolean persistent, int userId, boolean deferResume) {
- return updateConfigurationLocked(values, starting, initLocale, persistent, userId,
- deferResume, null /* result */);
- }
-
- /**
- * Do either or both things: (1) change the current configuration, and (2)
- * make sure the given activity is running with the (now) current
- * configuration. Returns true if the activity has been left running, or
- * false if <var>starting</var> is being destroyed to match the new
- * configuration.
- *
- * @param userId is only used when persistent parameter is set to true to persist configuration
- * for that particular user
- */
- private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
- boolean initLocale, boolean persistent, int userId, boolean deferResume,
- UpdateConfigurationResult result) {
- int changes = 0;
- boolean kept = true;
-
- if (mWindowManager != null) {
- mWindowManager.deferSurfaceLayout();
- }
- try {
- if (values != null) {
- changes = updateGlobalConfigurationLocked(values, initLocale, persistent, userId,
- deferResume);
- }
-
- kept = ensureConfigAndVisibilityAfterUpdate(starting, changes);
- } finally {
- if (mWindowManager != null) {
- mWindowManager.continueSurfaceLayout();
- }
- }
-
- if (result != null) {
- result.changes = changes;
- result.activityRelaunched = !kept;
- }
- return kept;
- }
-
- /**
- * Returns true if this configuration change is interesting enough to send an
- * {@link Intent#ACTION_SPLIT_CONFIGURATION_CHANGED} broadcast.
- */
- private static boolean isSplitConfigurationChange(int configDiff) {
- return (configDiff & (ActivityInfo.CONFIG_LOCALE | ActivityInfo.CONFIG_DENSITY)) != 0;
- }
-
- /** Update default (global) configuration and notify listeners about changes. */
- private int updateGlobalConfigurationLocked(@NonNull Configuration values, boolean initLocale,
- boolean persistent, int userId, boolean deferResume) {
- mTempConfig.setTo(getGlobalConfiguration());
- final int changes = mTempConfig.updateFrom(values);
- if (changes == 0) {
- // Since calling to Activity.setRequestedOrientation leads to freezing the window with
- // setting WindowManagerService.mWaitingForConfig to true, it is important that we call
- // performDisplayOverrideConfigUpdate in order to send the new display configuration
- // (even if there are no actual changes) to unfreeze the window.
- performDisplayOverrideConfigUpdate(values, deferResume, DEFAULT_DISPLAY);
- return 0;
- }
-
- if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.i(TAG_CONFIGURATION,
- "Updating global configuration to: " + values);
-
- EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
- StatsLog.write(StatsLog.RESOURCE_CONFIGURATION_CHANGED,
- values.colorMode,
- values.densityDpi,
- values.fontScale,
- values.hardKeyboardHidden,
- values.keyboard,
- values.keyboardHidden,
- values.mcc,
- values.mnc,
- values.navigation,
- values.navigationHidden,
- values.orientation,
- values.screenHeightDp,
- values.screenLayout,
- values.screenWidthDp,
- values.smallestScreenWidthDp,
- values.touchscreen,
- values.uiMode);
-
-
- if (!initLocale && !values.getLocales().isEmpty() && values.userSetLocale) {
- final LocaleList locales = values.getLocales();
- int bestLocaleIndex = 0;
- if (locales.size() > 1) {
- if (mSupportedSystemLocales == null) {
- mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales();
- }
- bestLocaleIndex = Math.max(0, locales.getFirstMatchIndex(mSupportedSystemLocales));
- }
- SystemProperties.set("persist.sys.locale",
- locales.get(bestLocaleIndex).toLanguageTag());
- LocaleList.setDefault(locales, bestLocaleIndex);
- mHandler.sendMessage(mHandler.obtainMessage(SEND_LOCALE_TO_MOUNT_DAEMON_MSG,
- locales.get(bestLocaleIndex)));
- }
-
- mConfigurationSeq = Math.max(++mConfigurationSeq, 1);
- mTempConfig.seq = mConfigurationSeq;
-
- // Update stored global config and notify everyone about the change.
- mStackSupervisor.onConfigurationChanged(mTempConfig);
-
- Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + mTempConfig);
- // TODO(multi-display): Update UsageEvents#Event to include displayId.
- mUsageStatsService.reportConfigurationChange(mTempConfig,
- mUserController.getCurrentUserId());
-
- // TODO: If our config changes, should we auto dismiss any currently showing dialogs?
- updateShouldShowDialogsLocked(mTempConfig);
-
- AttributeCache ac = AttributeCache.instance();
- if (ac != null) {
- ac.updateConfiguration(mTempConfig);
- }
-
- // Make sure all resources in our process are updated right now, so that anyone who is going
- // to retrieve resource values after we return will be sure to get the new ones. This is
- // especially important during boot, where the first config change needs to guarantee all
- // resources have that config before following boot code is executed.
- mSystemThread.applyConfigurationToResources(mTempConfig);
-
- // We need another copy of global config because we're scheduling some calls instead of
- // running them in place. We need to be sure that object we send will be handled unchanged.
- final Configuration configCopy = new Configuration(mTempConfig);
- if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) {
- Message msg = mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG);
- msg.obj = configCopy;
- msg.arg1 = userId;
- mHandler.sendMessage(msg);
- }
-
- for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
- ProcessRecord app = mLruProcesses.get(i);
- try {
- if (app.thread != null) {
- if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Sending to proc "
- + app.processName + " new config " + configCopy);
- mLifecycleManager.scheduleTransaction(app.thread,
- ConfigurationChangeItem.obtain(configCopy));
- }
- } catch (Exception e) {
- Slog.e(TAG_CONFIGURATION, "Failed to schedule configuration change", e);
- }
- }
-
- Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING
- | Intent.FLAG_RECEIVER_FOREGROUND
- | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
- broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null,
- OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
- UserHandle.USER_ALL);
- if ((changes & ActivityInfo.CONFIG_LOCALE) != 0) {
- intent = new Intent(Intent.ACTION_LOCALE_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND
- | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
- | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
- if (initLocale || !mProcessesReady) {
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- }
- broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null,
- OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
- UserHandle.USER_ALL);
- }
-
- // Send a broadcast to PackageInstallers if the configuration change is interesting
- // for the purposes of installing additional splits.
- if (!initLocale && isSplitConfigurationChange(changes)) {
- intent = new Intent(Intent.ACTION_SPLIT_CONFIGURATION_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
- | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
-
- // Typically only app stores will have this permission.
- String[] permissions = new String[] { android.Manifest.permission.INSTALL_PACKAGES };
- broadcastIntentLocked(null, null, intent, null, null, 0, null, null, permissions,
- OP_NONE, null, false, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
- }
-
- // Override configuration of the default display duplicates global config, so we need to
- // update it also. This will also notify WindowManager about changes.
- performDisplayOverrideConfigUpdate(mStackSupervisor.getConfiguration(), deferResume,
- DEFAULT_DISPLAY);
-
- return changes;
+ return mActivityTaskManager.updateConfiguration(values);
}
@Override
- public boolean updateDisplayOverrideConfiguration(Configuration values, int displayId) {
- enforceCallingPermission(CHANGE_CONFIGURATION, "updateDisplayOverrideConfiguration()");
-
- synchronized (this) {
- // Check if display is initialized in AM.
- if (!mStackSupervisor.isDisplayAdded(displayId)) {
- // Call might come when display is not yet added or has already been removed.
- if (DEBUG_CONFIGURATION) {
- Slog.w(TAG, "Trying to update display configuration for non-existing displayId="
- + displayId);
- }
- return false;
- }
-
- if (values == null && mWindowManager != null) {
- // sentinel: fetch the current configuration from the window manager
- values = mWindowManager.computeNewConfiguration(displayId);
- }
-
- if (mWindowManager != null) {
- // Update OOM levels based on display size.
- mProcessList.applyDisplaySize(mWindowManager);
- }
-
- final long origId = Binder.clearCallingIdentity();
- try {
- if (values != null) {
- Settings.System.clearConfiguration(values);
- }
- updateDisplayOverrideConfigurationLocked(values, null /* starting */,
- false /* deferResume */, displayId, mTmpUpdateConfigurationResult);
- return mTmpUpdateConfigurationResult.changes != 0;
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
- boolean updateDisplayOverrideConfigurationLocked(Configuration values, ActivityRecord starting,
- boolean deferResume, int displayId) {
- return updateDisplayOverrideConfigurationLocked(values, starting, deferResume /* deferResume */,
- displayId, null /* result */);
- }
-
- /**
- * Updates override configuration specific for the selected display. If no config is provided,
- * new one will be computed in WM based on current display info.
- */
- private boolean updateDisplayOverrideConfigurationLocked(Configuration values,
- ActivityRecord starting, boolean deferResume, int displayId,
- UpdateConfigurationResult result) {
- int changes = 0;
- boolean kept = true;
-
- if (mWindowManager != null) {
- mWindowManager.deferSurfaceLayout();
- }
- try {
- if (values != null) {
- if (displayId == DEFAULT_DISPLAY) {
- // Override configuration of the default display duplicates global config, so
- // we're calling global config update instead for default display. It will also
- // apply the correct override config.
- changes = updateGlobalConfigurationLocked(values, false /* initLocale */,
- false /* persistent */, UserHandle.USER_NULL /* userId */, deferResume);
- } else {
- changes = performDisplayOverrideConfigUpdate(values, deferResume, displayId);
- }
- }
-
- kept = ensureConfigAndVisibilityAfterUpdate(starting, changes);
- } finally {
- if (mWindowManager != null) {
- mWindowManager.continueSurfaceLayout();
- }
- }
-
- if (result != null) {
- result.changes = changes;
- result.activityRelaunched = !kept;
- }
- return kept;
- }
-
- private int performDisplayOverrideConfigUpdate(Configuration values, boolean deferResume,
- int displayId) {
- mTempConfig.setTo(mStackSupervisor.getDisplayOverrideConfiguration(displayId));
- final int changes = mTempConfig.updateFrom(values);
- if (changes != 0) {
- Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " "
- + mTempConfig + " for displayId=" + displayId);
- mStackSupervisor.setDisplayOverrideConfiguration(mTempConfig, displayId);
-
- final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
- if (isDensityChange && displayId == DEFAULT_DISPLAY) {
- mAppWarnings.onDensityChanged();
-
- killAllBackgroundProcessesExcept(N,
- ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
- }
- }
-
- // Update the configuration with WM first and check if any of the stacks need to be resized
- // due to the configuration change. If so, resize the stacks now and do any relaunches if
- // necessary. This way we don't need to relaunch again afterwards in
- // ensureActivityConfiguration().
- if (mWindowManager != null) {
- final int[] resizedStacks =
- mWindowManager.setNewDisplayOverrideConfiguration(mTempConfig, displayId);
- if (resizedStacks != null) {
- for (int stackId : resizedStacks) {
- resizeStackWithBoundsFromWindowManager(stackId, deferResume);
- }
- }
- }
-
- return changes;
- }
-
- /** Applies latest configuration and/or visibility updates if needed. */
- private boolean ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes) {
- boolean kept = true;
- final ActivityStack mainStack = mStackSupervisor.getFocusedStack();
- // mainStack is null during startup.
- if (mainStack != null) {
- if (changes != 0 && starting == null) {
- // If the configuration changed, and the caller is not already
- // in the process of starting an activity, then find the top
- // activity to check if its configuration needs to change.
- starting = mainStack.topRunningActivityLocked();
- }
-
- if (starting != null) {
- kept = starting.ensureActivityConfiguration(changes,
- false /* preserveWindow */);
- // And we need to make sure at this point that all other activities
- // are made visible with the correct configuration.
- mStackSupervisor.ensureActivitiesVisibleLocked(starting, changes,
- !PRESERVE_WINDOWS);
- }
- }
-
- return kept;
- }
-
- /** Helper method that requests bounds from WM and applies them to stack. */
- private void resizeStackWithBoundsFromWindowManager(int stackId, boolean deferResume) {
- final Rect newStackBounds = new Rect();
- final ActivityStack stack = mStackSupervisor.getStack(stackId);
-
- // TODO(b/71548119): Revert CL introducing below once cause of mismatch is found.
- if (stack == null) {
- final StringWriter writer = new StringWriter();
- final PrintWriter printWriter = new PrintWriter(writer);
- mStackSupervisor.dumpDisplays(printWriter);
- printWriter.flush();
-
- Log.wtf(TAG, "stack not found:" + stackId + " displays:" + writer);
- }
-
- stack.getBoundsForNewConfiguration(newStackBounds);
- mStackSupervisor.resizeStackLocked(
- stack, !newStackBounds.isEmpty() ? newStackBounds : null /* bounds */,
- null /* tempTaskBounds */, null /* tempTaskInsetBounds */,
- false /* preserveWindows */, false /* allowResizeInDockedMode */, deferResume);
- }
-
- /**
- * Decide based on the configuration whether we should show the ANR,
- * crash, etc dialogs. The idea is that if there is no affordance to
- * press the on-screen buttons, or the user experience would be more
- * greatly impacted than the crash itself, we shouldn't show the dialog.
- *
- * A thought: SystemUI might also want to get told about this, the Power
- * dialog / global actions also might want different behaviors.
- */
- private void updateShouldShowDialogsLocked(Configuration config) {
- final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
- && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
- && config.navigation == Configuration.NAVIGATION_NONAV);
- int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
- final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR
- && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
- && modeType != Configuration.UI_MODE_TYPE_TELEVISION
- && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
- final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(),
- HIDE_ERROR_DIALOGS, 0) != 0;
- mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet;
- }
-
- @Override
- public boolean shouldUpRecreateTask(IBinder token, String destAffinity) {
- synchronized (this) {
- ActivityRecord srec = ActivityRecord.forTokenLocked(token);
- if (srec != null) {
- return srec.getStack().shouldUpRecreateTaskLocked(srec, destAffinity);
- }
- }
- return false;
- }
-
- public boolean navigateUpTo(IBinder token, Intent destIntent, int resultCode,
- Intent resultData) {
-
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r != null) {
- return r.getStack().navigateUpToLocked(r, destIntent, resultCode, resultData);
- }
- return false;
- }
- }
-
public int getLaunchedFromUid(IBinder activityToken) {
- ActivityRecord srec;
- synchronized (this) {
- srec = ActivityRecord.forTokenLocked(activityToken);
- }
- if (srec == null) {
- return -1;
- }
- return srec.launchedFromUid;
+ return mActivityTaskManager.getLaunchedFromUid(activityToken);
}
public String getLaunchedFromPackage(IBinder activityToken) {
- ActivityRecord srec;
- synchronized (this) {
- srec = ActivityRecord.forTokenLocked(activityToken);
- }
- if (srec == null) {
- return null;
- }
- return srec.launchedFromPackage;
+ return mActivityTaskManager.getLaunchedFromPackage(activityToken);
}
// =========================================================
@@ -23100,7 +18835,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
Association startAssociationLocked(int sourceUid, String sourceProcess, int sourceState,
- int targetUid, ComponentName targetComponent, String targetProcess) {
+ int targetUid, long targetVersionCode, ComponentName targetComponent,
+ String targetProcess) {
if (!mTrackingAssociations) {
return null;
}
@@ -23136,7 +18872,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
void stopAssociationLocked(int sourceUid, String sourceProcess, int targetUid,
- ComponentName targetComponent) {
+ long targetVersionCode, ComponentName targetComponent, String targetProcess) {
if (!mTrackingAssociations) {
return;
}
@@ -23196,6 +18932,129 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
+ private final ComputeOomAdjWindowCallback mTmpComputeOomAdjWindowCallback =
+ new ComputeOomAdjWindowCallback();
+
+ private final class ComputeOomAdjWindowCallback
+ implements WindowProcessController.ComputeOomAdjCallback {
+
+ ProcessRecord app;
+ int adj;
+ boolean foregroundActivities;
+ int procState;
+ int schedGroup;
+ int appUid;
+ int logUid;
+ int processStateCurTop;
+
+ void initialize(ProcessRecord app, int adj, boolean foregroundActivities,
+ int procState, int schedGroup, int appUid, int logUid, int processStateCurTop) {
+ this.app = app;
+ this.adj = adj;
+ this.foregroundActivities = foregroundActivities;
+ this.procState = procState;
+ this.schedGroup = schedGroup;
+ this.appUid = appUid;
+ this.logUid = logUid;
+ this.processStateCurTop = processStateCurTop;
+ }
+
+ @Override
+ public void onVisibleActivity() {
+ // App has a visible activity; only upgrade adjustment.
+ if (adj > ProcessList.VISIBLE_APP_ADJ) {
+ adj = ProcessList.VISIBLE_APP_ADJ;
+ app.adjType = "vis-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to vis-activity: " + app);
+ }
+ }
+ if (procState > processStateCurTop) {
+ procState = processStateCurTop;
+ app.adjType = "vis-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to vis-activity (top): " + app);
+ }
+ }
+ if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ }
+ app.cached = false;
+ app.empty = false;
+ foregroundActivities = true;
+ }
+
+ @Override
+ public void onPausedActivity() {
+ if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
+ adj = ProcessList.PERCEPTIBLE_APP_ADJ;
+ app.adjType = "pause-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to pause-activity: " + app);
+ }
+ }
+ if (procState > processStateCurTop) {
+ procState = processStateCurTop;
+ app.adjType = "pause-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to pause-activity (top): " + app);
+ }
+ }
+ if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
+ schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ }
+ app.cached = false;
+ app.empty = false;
+ foregroundActivities = true;
+ }
+
+ @Override
+ public void onStoppingActivity(boolean finishing) {
+ if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
+ adj = ProcessList.PERCEPTIBLE_APP_ADJ;
+ app.adjType = "stop-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise adj to stop-activity: " + app);
+ }
+ }
+
+ // For the process state, we will at this point consider the process to be cached. It
+ // will be cached either as an activity or empty depending on whether the activity is
+ // finishing. We do this so that we can treat the process as cached for purposes of
+ // memory trimming (determining current memory level, trim command to send to process)
+ // since there can be an arbitrary number of stopping processes and they should soon all
+ // go into the cached state.
+ if (!finishing) {
+ if (procState > PROCESS_STATE_LAST_ACTIVITY) {
+ procState = PROCESS_STATE_LAST_ACTIVITY;
+ app.adjType = "stop-activity";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to stop-activity: " + app);
+ }
+ }
+ }
+ app.cached = false;
+ app.empty = false;
+ foregroundActivities = true;
+ }
+
+ @Override
+ public void onOtherActivity() {
+ if (procState > PROCESS_STATE_CACHED_ACTIVITY) {
+ procState = PROCESS_STATE_CACHED_ACTIVITY;
+ app.adjType = "cch-act";
+ if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
+ reportOomAdjMessageLocked(TAG_OOM_ADJ,
+ "Raise procstate to cached activity: " + app);
+ }
+ }
+ }
+ }
+
private final boolean computeOomAdjLocked(ProcessRecord app, int cachedAdj, ProcessRecord TOP_APP,
boolean doingAll, long now) {
if (mAdjSeq == app.adjSeq) {
@@ -23206,13 +19065,14 @@ public class ActivityManagerService extends IActivityManager.Stub
// The process is being computed, so there is a cycle. We cannot
// rely on this process's state.
app.containsCycle = true;
+
return false;
}
}
if (app.thread == null) {
app.adjSeq = mAdjSeq;
- app.curSchedGroup = ProcessList.SCHED_GROUP_BACKGROUND;
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_BACKGROUND);
app.curProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
app.curAdj=app.curRawAdj=ProcessList.CACHED_APP_MAX_ADJ;
app.completedAdjSeq = app.adjSeq;
@@ -23225,11 +19085,12 @@ public class ActivityManagerService extends IActivityManager.Stub
app.empty = false;
app.cached = false;
- final int activitiesSize = app.activities.size();
+ final WindowProcessController wpc = app.getWindowProcessController();
final int appUid = app.info.uid;
final int logUid = mCurOomAdjUid;
int prevAppAdj = app.curAdj;
+ int prevProcState = app.curProcState;
if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) {
// The max adjustment doesn't allow this app to be anything
@@ -23241,7 +19102,7 @@ public class ActivityManagerService extends IActivityManager.Stub
app.adjSeq = mAdjSeq;
app.curRawAdj = app.maxAdj;
app.foregroundActivities = false;
- app.curSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_DEFAULT);
app.curProcState = ActivityManager.PROCESS_STATE_PERSISTENT;
// System processes can do UI, and when they do we want to have
// them trim their memory after the user leaves the UI. To
@@ -23250,29 +19111,24 @@ public class ActivityManagerService extends IActivityManager.Stub
app.systemNoUi = true;
if (app == TOP_APP) {
app.systemNoUi = false;
- app.curSchedGroup = ProcessList.SCHED_GROUP_TOP_APP;
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP);
app.adjType = "pers-top-activity";
} else if (app.hasTopUi) {
// sched group/proc state adjustment is below
app.systemNoUi = false;
app.adjType = "pers-top-ui";
- } else if (activitiesSize > 0) {
- for (int j = 0; j < activitiesSize; j++) {
- final ActivityRecord r = app.activities.get(j);
- if (r.visible) {
- app.systemNoUi = false;
- }
- }
+ } else if (wpc.hasVisibleActivities()) {
+ app.systemNoUi = false;
}
if (!app.systemNoUi) {
if (mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE) {
// screen on, promote UI
app.curProcState = ActivityManager.PROCESS_STATE_PERSISTENT_UI;
- app.curSchedGroup = ProcessList.SCHED_GROUP_TOP_APP;
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP);
} else {
// screen off, restrict UI scheduling
app.curProcState = ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- app.curSchedGroup = ProcessList.SCHED_GROUP_RESTRICTED;
+ app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_RESTRICTED);
}
}
app.curAdj = app.maxAdj;
@@ -23283,7 +19139,7 @@ public class ActivityManagerService extends IActivityManager.Stub
app.systemNoUi = false;
- final int PROCESS_STATE_CUR_TOP = mTopProcessState;
+ final int PROCESS_STATE_CUR_TOP = mAtmInternal.getTopProcessState();
// Determine the importance of the process, starting with most
// important to least, and assign an appropriate OOM adjustment.
@@ -23371,120 +19227,23 @@ public class ActivityManagerService extends IActivityManager.Stub
}
// Examine all activities if not already foreground.
- if (!foregroundActivities && activitiesSize > 0) {
- int minLayer = ProcessList.VISIBLE_APP_LAYER_MAX;
- for (int j = 0; j < activitiesSize; j++) {
- final ActivityRecord r = app.activities.get(j);
- if (r.app != app) {
- Log.e(TAG, "Found activity " + r + " in proc activity list using " + r.app
- + " instead of expected " + app);
- if (r.app == null || (r.app.uid == app.uid)) {
- // Only fix things up when they look sane
- r.setProcess(app);
- } else {
- continue;
- }
- }
- if (r.visible) {
- // App has a visible activity; only upgrade adjustment.
- if (adj > ProcessList.VISIBLE_APP_ADJ) {
- adj = ProcessList.VISIBLE_APP_ADJ;
- app.adjType = "vis-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise adj to vis-activity: " + app);
- }
- }
- if (procState > PROCESS_STATE_CUR_TOP) {
- procState = PROCESS_STATE_CUR_TOP;
- app.adjType = "vis-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to vis-activity (top): " + app);
- }
- }
- if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- }
- app.cached = false;
- app.empty = false;
- foregroundActivities = true;
- final TaskRecord task = r.getTask();
- if (task != null && minLayer > 0) {
- final int layer = task.mLayerRank;
- if (layer >= 0 && minLayer > layer) {
- minLayer = layer;
- }
- }
- break;
- } else if (r.isState(ActivityState.PAUSING, ActivityState.PAUSED)) {
- if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
- adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- app.adjType = "pause-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise adj to pause-activity: " + app);
- }
- }
- if (procState > PROCESS_STATE_CUR_TOP) {
- procState = PROCESS_STATE_CUR_TOP;
- app.adjType = "pause-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to pause-activity (top): " + app);
- }
- }
- if (schedGroup < ProcessList.SCHED_GROUP_DEFAULT) {
- schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
- }
- app.cached = false;
- app.empty = false;
- foregroundActivities = true;
- } else if (r.isState(ActivityState.STOPPING)) {
- if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
- adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- app.adjType = "stop-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise adj to stop-activity: " + app);
- }
- }
- // For the process state, we will at this point consider the
- // process to be cached. It will be cached either as an activity
- // or empty depending on whether the activity is finishing. We do
- // this so that we can treat the process as cached for purposes of
- // memory trimming (determing current memory level, trim command to
- // send to process) since there can be an arbitrary number of stopping
- // processes and they should soon all go into the cached state.
- if (!r.finishing) {
- if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
- procState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
- app.adjType = "stop-activity";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to stop-activity: " + app);
- }
- }
- }
- app.cached = false;
- app.empty = false;
- foregroundActivities = true;
- } else {
- if (procState > ActivityManager.PROCESS_STATE_CACHED_ACTIVITY) {
- procState = ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
- app.adjType = "cch-act";
- if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
- reportOomAdjMessageLocked(TAG_OOM_ADJ,
- "Raise procstate to cached activity: " + app);
- }
- }
- }
- }
+ if (!foregroundActivities && wpc.hasActivities()) {
+ mTmpComputeOomAdjWindowCallback.initialize(app, adj, foregroundActivities, procState,
+ schedGroup, appUid, logUid, PROCESS_STATE_CUR_TOP);
+ final int minLayer = wpc.computeOomAdjFromActivities(
+ ProcessList.VISIBLE_APP_LAYER_MAX, mTmpComputeOomAdjWindowCallback);
+
+ adj = mTmpComputeOomAdjWindowCallback.adj;
+ foregroundActivities = mTmpComputeOomAdjWindowCallback.foregroundActivities;
+ procState = mTmpComputeOomAdjWindowCallback.procState;
+ schedGroup = mTmpComputeOomAdjWindowCallback.schedGroup;
+
if (adj == ProcessList.VISIBLE_APP_ADJ) {
adj += minLayer;
}
}
- if (procState > ActivityManager.PROCESS_STATE_CACHED_RECENT && app.recentTasks.size() > 0) {
+
+ if (procState > ActivityManager.PROCESS_STATE_CACHED_RECENT && app.hasRecentTasks()) {
procState = ActivityManager.PROCESS_STATE_CACHED_RECENT;
app.adjType = "cch-rec";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
@@ -23494,7 +19253,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (adj > ProcessList.PERCEPTIBLE_APP_ADJ
|| procState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
- if (app.foregroundServices) {
+ if (app.hasForegroundServices()) {
// The user is aware of this app, so make it visible.
adj = ProcessList.PERCEPTIBLE_APP_ADJ;
procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
@@ -23555,7 +19314,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- if (app == mHomeProcess) {
+ if (wpc == mActivityTaskManager.mHomeProcess) {
if (adj > ProcessList.HOME_APP_ADJ) {
// This process is hosting what we currently consider to be the
// home app, so we don't want to let it go into the background.
@@ -23576,7 +19335,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- if (app == mPreviousProcess && app.activities.size() > 0) {
+ if (wpc == mActivityTaskManager.mPreviousProcess && app.hasActivities()) {
if (adj > ProcessList.PREVIOUS_APP_ADJ) {
// This was the previous process that showed UI to the user.
// We want to try to keep it around more aggressively, to give
@@ -23589,8 +19348,8 @@ public class ActivityManagerService extends IActivityManager.Stub
reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to prev: " + app);
}
}
- if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
- procState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
+ if (procState > PROCESS_STATE_LAST_ACTIVITY) {
+ procState = PROCESS_STATE_LAST_ACTIVITY;
app.adjType = "previous";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to prev: " + app);
@@ -23653,7 +19412,7 @@ public class ActivityManagerService extends IActivityManager.Stub
"Raise procstate to started service: " + app);
}
}
- if (app.hasShownUi && app != mHomeProcess) {
+ if (app.hasShownUi && wpc != mActivityTaskManager.mHomeProcess) {
// If this process has shown some UI, let it immediately
// go to the LRU list because it may be pretty heavy with
// UI stuff. We'll tag it with a label just to help
@@ -23700,23 +19459,29 @@ public class ActivityManagerService extends IActivityManager.Stub
// all connected clients.
ConnectionRecord cr = clist.get(i);
if (cr.binding.client == app) {
- // Binding to ourself is not interesting.
+ // Binding to oneself is not interesting.
continue;
}
+ boolean trackedProcState = false;
if ((cr.flags&Context.BIND_WAIVE_PRIORITY) == 0) {
ProcessRecord client = cr.binding.client;
computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now);
if (client.containsCycle) {
- // We've detected a cycle. We should ignore this connection and allow
- // this process to retry computeOomAdjLocked later in case a later-checked
- // connection from a client would raise its priority legitimately.
+ // We've detected a cycle. We should retry computeOomAdjLocked later in
+ // case a later-checked connection from a client would raise its
+ // priority legitimately.
app.containsCycle = true;
- continue;
+ // If the client has not been completely evaluated, skip using its
+ // priority. Else use the conservative value for now and look for a
+ // better state in the next iteration.
+ if (client.completedAdjSeq < mAdjSeq) {
+ continue;
+ }
}
int clientAdj = client.curRawAdj;
int clientProcState = client.curProcState;
- if (clientProcState >= ActivityManager.PROCESS_STATE_CACHED_ACTIVITY) {
+ if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
// If the other app is cached for any reason, for purposes here
// we are going to consider it empty. The specific cached state
// doesn't propagate except under certain conditions.
@@ -23726,7 +19491,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if ((cr.flags&Context.BIND_ALLOW_OOM_MANAGEMENT) != 0) {
// Not doing bind OOM management, so treat
// this guy more like a started service.
- if (app.hasShownUi && app != mHomeProcess) {
+ if (app.hasShownUi && wpc != mActivityTaskManager.mHomeProcess) {
// If this process has shown some UI, let it immediately
// go to the LRU list because it may be pretty heavy with
// UI stuff. We'll tag it with a label just to help
@@ -23759,7 +19524,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// about letting this process get into the LRU
// list to be killed and restarted if needed for
// memory.
- if (app.hasShownUi && app != mHomeProcess
+ if (app.hasShownUi && wpc != mActivityTaskManager.mHomeProcess
&& clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) {
if (adj >= ProcessList.CACHED_APP_MIN_ADJ) {
adjType = "cch-bound-ui-services";
@@ -23775,6 +19540,8 @@ public class ActivityManagerService extends IActivityManager.Stub
newAdj = ProcessList.PERSISTENT_SERVICE_ADJ;
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
procState = ActivityManager.PROCESS_STATE_PERSISTENT;
+ cr.trackProcState(procState, mAdjSeq, now);
+ trackedProcState = true;
}
} else if ((cr.flags&Context.BIND_NOT_VISIBLE) != 0
&& clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ
@@ -23803,9 +19570,10 @@ public class ActivityManagerService extends IActivityManager.Stub
// This will treat important bound services identically to
// the top app, which may behave differently than generic
// foreground work.
- if (client.curSchedGroup > schedGroup) {
+ final int curSchedGroup = client.getCurrentSchedulingGroup();
+ if (curSchedGroup > schedGroup) {
if ((cr.flags&Context.BIND_IMPORTANT) != 0) {
- schedGroup = client.curSchedGroup;
+ schedGroup = curSchedGroup;
} else {
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
}
@@ -23859,6 +19627,9 @@ public class ActivityManagerService extends IActivityManager.Stub
ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND;
}
}
+ if (!trackedProcState) {
+ cr.trackProcState(clientProcState, mAdjSeq, now);
+ }
if (procState > clientProcState) {
procState = clientProcState;
if (adjType == null) {
@@ -23935,22 +19706,27 @@ public class ActivityManagerService extends IActivityManager.Stub
}
computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now);
if (client.containsCycle) {
- // We've detected a cycle. We should ignore this connection and allow
- // this process to retry computeOomAdjLocked later in case a later-checked
- // connection from a client would raise its priority legitimately.
+ // We've detected a cycle. We should retry computeOomAdjLocked later in
+ // case a later-checked connection from a client would raise its
+ // priority legitimately.
app.containsCycle = true;
- continue;
+ // If the client has not been completely evaluated, skip using its
+ // priority. Else use the conservative value for now and look for a
+ // better state in the next iteration.
+ if (client.completedAdjSeq < mAdjSeq) {
+ continue;
+ }
}
int clientAdj = client.curRawAdj;
int clientProcState = client.curProcState;
- if (clientProcState >= ActivityManager.PROCESS_STATE_CACHED_ACTIVITY) {
+ if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
// If the other app is cached for any reason, for purposes here
// we are going to consider it empty.
clientProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;
}
String adjType = null;
if (adj > clientAdj) {
- if (app.hasShownUi && app != mHomeProcess
+ if (app.hasShownUi && wpc != mActivityTaskManager.mHomeProcess
&& clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) {
adjType = "cch-ui-provider";
} else {
@@ -23988,10 +19764,11 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
}
+ conn.trackProcState(clientProcState, mAdjSeq, now);
if (procState > clientProcState) {
procState = clientProcState;
}
- if (client.curSchedGroup > schedGroup) {
+ if (client.getCurrentSchedulingGroup() > schedGroup) {
schedGroup = ProcessList.SCHED_GROUP_DEFAULT;
}
if (adjType != null) {
@@ -24044,8 +19821,8 @@ public class ActivityManagerService extends IActivityManager.Stub
"Raise adj to recent provider: " + app);
}
}
- if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {
- procState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;
+ if (procState > PROCESS_STATE_LAST_ACTIVITY) {
+ procState = PROCESS_STATE_LAST_ACTIVITY;
app.adjType = "recent-provider";
if (DEBUG_OOM_ADJ_REASON || logUid == appUid) {
reportOomAdjMessageLocked(TAG_OOM_ADJ,
@@ -24107,7 +19884,7 @@ public class ActivityManagerService extends IActivityManager.Stub
} else if (app.treatLikeActivity) {
// This is a cached process, but somebody wants us to treat it like it has
// an activity, okay!
- procState = ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;
+ procState = PROCESS_STATE_CACHED_ACTIVITY;
app.adjType = "cch-as-act";
}
}
@@ -24166,13 +19943,13 @@ public class ActivityManagerService extends IActivityManager.Stub
// 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.curSchedGroup = schedGroup;
+ app.setCurrentSchedulingGroup(schedGroup);
app.curProcState = procState;
app.foregroundActivities = foregroundActivities;
app.completedAdjSeq = mAdjSeq;
- // if curAdj is less than prevAppAdj, then this process was promoted
- return app.curAdj < prevAppAdj;
+ // if curAdj or curProcState improved, then this process was promoted
+ return app.curAdj < prevAppAdj || app.curProcState < prevProcState;
}
/**
@@ -24183,7 +19960,8 @@ public class ActivityManagerService extends IActivityManager.Stub
EventLogTags.writeAmPss(proc.pid, proc.uid, proc.processName, pss * 1024, uss * 1024,
swapPss * 1024, rss * 1024, statType, procState, pssDuration);
proc.lastPssTime = now;
- proc.baseProcessTracker.addPss(pss, uss, rss, true, statType, pssDuration, proc.pkgList);
+ proc.baseProcessTracker.addPss(
+ pss, uss, rss, true, statType, pssDuration, proc.pkgList.mPkgList);
if (DEBUG_PSS) Slog.d(TAG_PSS,
"pss of " + proc.toShortString() + ": " + pss + " lastPss=" + proc.lastPss
+ " state=" + ProcessList.makeProcStateString(procState));
@@ -24250,7 +20028,8 @@ public class ActivityManagerService extends IActivityManager.Stub
+ myProc + " to " + heapdumpFile);
thread.dumpHeap(/* managed= */ true,
/* mallocInfo= */ false, /* runGc= */ false,
- heapdumpFile.toString(), fd);
+ heapdumpFile.toString(), fd,
+ /* finishCallback= */ null);
} catch (RemoteException e) {
}
}
@@ -24323,7 +20102,7 @@ public class ActivityManagerService extends IActivityManager.Stub
app.pssStatType = always ? ProcessStats.ADD_PSS_INTERNAL_ALL_POLL
: ProcessStats.ADD_PSS_INTERNAL_ALL_MEM;
app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState,
- app.procStateMemTracker, mTestPssMode, isSleepingLocked(), now);
+ app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now);
mPendingPssProcesses.add(app);
}
}
@@ -24373,7 +20152,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
return !processingBroadcasts
- && (isSleepingLocked() || mStackSupervisor.allResumedActivitiesIdle());
+ && (mAtmInternal.isSleeping() || mStackSupervisor.allResumedActivitiesIdle());
}
/**
@@ -24533,7 +20312,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
app.kill("excessive cpu " + cputimeUsed + " during " + uptimeSince
+ " dur=" + checkDur + " limit=" + cpuLimit, true);
- app.baseProcessTracker.reportExcessiveCpu(app.pkgList);
+ app.baseProcessTracker.reportExcessiveCpu(app.pkgList.mPkgList);
}
}
app.lastCpuTime = app.curCpuTime;
@@ -24574,12 +20353,13 @@ public class ActivityManagerService extends IActivityManager.Stub
app.verifiedAdj = ProcessList.INVALID_ADJ;
}
- if (app.setSchedGroup != app.curSchedGroup) {
+ final int curSchedGroup = app.getCurrentSchedulingGroup();
+ if (app.setSchedGroup != curSchedGroup) {
int oldSchedGroup = app.setSchedGroup;
- app.setSchedGroup = app.curSchedGroup;
+ app.setSchedGroup = curSchedGroup;
if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mCurOomAdjUid == app.uid) {
String msg = "Setting sched group of " + app.processName
- + " to " + app.curSchedGroup + ": " + app.adjType;
+ + " to " + curSchedGroup + ": " + app.adjType;
reportOomAdjMessageLocked(TAG_OOM_ADJ, msg);
}
if (app.waitingToKill != null && app.curReceivers.isEmpty()
@@ -24588,7 +20368,7 @@ public class ActivityManagerService extends IActivityManager.Stub
success = false;
} else {
int processGroup;
- switch (app.curSchedGroup) {
+ switch (curSchedGroup) {
case ProcessList.SCHED_GROUP_BACKGROUND:
processGroup = THREAD_GROUP_BG_NONINTERACTIVE;
break;
@@ -24610,10 +20390,11 @@ public class ActivityManagerService extends IActivityManager.Stub
} else {
setProcessGroup(app.pid, processGroup);
}
- if (app.curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) {
+ if (curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) {
// do nothing if we already switched to RT
if (oldSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
- mVrController.onTopProcChangedLocked(app);
+ mActivityTaskManager.onTopProcChangedLocked(
+ app.getWindowProcessController());
if (mUseFifoUiScheduling) {
// Switch UI pipeline for app to SCHED_FIFO
app.savedPriority = Process.getThreadPriority(app.pid);
@@ -24644,8 +20425,9 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
} else if (oldSchedGroup == ProcessList.SCHED_GROUP_TOP_APP &&
- app.curSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
- mVrController.onTopProcChangedLocked(app);
+ curSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
+ mActivityTaskManager.onTopProcChangedLocked(
+ app.getWindowProcessController());
if (mUseFifoUiScheduling) {
try {
// Reset UI pipeline to SCHED_OTHER
@@ -24674,7 +20456,7 @@ public class ActivityManagerService extends IActivityManager.Stub
} catch (Exception e) {
if (false) {
Slog.w(TAG, "Failed setting process group of " + app.pid
- + " to " + app.curSchedGroup);
+ + " to " + app.getCurrentSchedulingGroup());
Slog.w(TAG, "at location", e);
}
} finally {
@@ -24686,16 +20468,16 @@ public class ActivityManagerService extends IActivityManager.Stub
app.repForegroundActivities = app.foregroundActivities;
changes |= ProcessChangeItem.CHANGE_ACTIVITIES;
}
- if (app.repProcState != app.curProcState) {
- app.repProcState = app.curProcState;
+ if (app.getReportedProcState() != app.curProcState) {
+ app.setReportedProcState(app.curProcState);
if (app.thread != null) {
try {
if (false) {
//RuntimeException h = new RuntimeException("here");
- Slog.i(TAG, "Sending new process state " + app.repProcState
+ Slog.i(TAG, "Sending new process state " + app.getReportedProcState()
+ " to " + app /*, h*/);
}
- app.thread.setProcessState(app.repProcState);
+ app.thread.setProcessState(app.getReportedProcState());
} catch (RemoteException e) {
}
}
@@ -24720,7 +20502,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
app.lastStateTime = now;
app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState,
- app.procStateMemTracker, mTestPssMode, isSleepingLocked(), now);
+ app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now);
if (DEBUG_PSS) Slog.d(TAG_PSS, "Process state change from "
+ ProcessList.makeProcStateString(app.setProcState) + " to "
+ ProcessList.makeProcStateString(app.curProcState) + " next pss in "
@@ -24731,7 +20513,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mTestPssMode)))) {
if (requestPssLocked(app, app.setProcState)) {
app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState,
- app.procStateMemTracker, mTestPssMode, isSleepingLocked(), now);
+ app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now);
}
} else if (false && DEBUG_PSS) Slog.d(TAG_PSS,
"Not requesting pss of " + app + ": next=" + (app.nextPssTime-now));
@@ -24982,10 +20764,9 @@ public class ActivityManagerService extends IActivityManager.Stub
}
private final void setProcessTrackerStateLocked(ProcessRecord proc, int memFactor, long now) {
- if (proc.thread != null) {
- if (proc.baseProcessTracker != null) {
- proc.baseProcessTracker.setState(proc.repProcState, memFactor, now, proc.pkgList);
- }
+ if (proc.thread != null && proc.baseProcessTracker != null) {
+ proc.baseProcessTracker.setState(
+ proc.getReportedProcState(), memFactor, now, proc.pkgList.mPkgList);
}
}
@@ -25003,8 +20784,8 @@ public class ActivityManagerService extends IActivityManager.Stub
@GuardedBy("this")
final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground,
boolean oomAdj) {
- if (isForeground != proc.foregroundServices) {
- proc.foregroundServices = isForeground;
+ if (isForeground != proc.hasForegroundServices()) {
+ proc.setHasForegroundServices(isForeground);
ArrayList<ProcessRecord> curProcs = mForegroundPackages.get(proc.info.packageName,
proc.info.uid);
if (isForeground) {
@@ -25036,7 +20817,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
private final ActivityRecord resumedAppLocked() {
- ActivityRecord act = mStackSupervisor.getResumedActivityLocked();
+ final ActivityRecord act =
+ mStackSupervisor != null ? mStackSupervisor.getResumedActivityLocked() : null;
String pkg;
int uid;
if (act != null) {
@@ -25049,16 +20831,23 @@ public class ActivityManagerService extends IActivityManager.Stub
// Has the UID or resumed package name changed?
if (uid != mCurResumedUid || (pkg != mCurResumedPackage
&& (pkg == null || !pkg.equals(mCurResumedPackage)))) {
- if (mCurResumedPackage != null) {
- mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_TOP_FINISH,
- mCurResumedPackage, mCurResumedUid);
- }
- mCurResumedPackage = pkg;
- mCurResumedUid = uid;
- if (mCurResumedPackage != null) {
- mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_TOP_START,
- mCurResumedPackage, mCurResumedUid);
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (mCurResumedPackage != null) {
+ mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_TOP_FINISH,
+ mCurResumedPackage, mCurResumedUid);
+ }
+ mCurResumedPackage = pkg;
+ mCurResumedUid = uid;
+ if (mCurResumedPackage != null) {
+ mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_TOP_START,
+ mCurResumedPackage, mCurResumedUid);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
+
}
return act;
}
@@ -25073,7 +20862,8 @@ public class ActivityManagerService extends IActivityManager.Stub
@GuardedBy("this")
final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) {
final ActivityRecord TOP_ACT = resumedAppLocked();
- final ProcessRecord TOP_APP = TOP_ACT != null ? TOP_ACT.app : null;
+ final ProcessRecord TOP_APP = TOP_ACT != null && TOP_ACT.hasProcess()
+ ? (ProcessRecord) TOP_ACT.app.mOwner : null;
final boolean wasCached = app.cached;
mAdjSeq++;
@@ -25096,20 +20886,24 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@GuardedBy("this")
- final void updateOomAdjLocked() {
+ ProcessRecord getTopAppLocked() {
final ActivityRecord TOP_ACT = resumedAppLocked();
- final ProcessRecord TOP_APP = TOP_ACT != null ? TOP_ACT.app : null;
+ if (TOP_ACT != null && TOP_ACT.hasProcess()) {
+ return (ProcessRecord) TOP_ACT.app.mOwner;
+ } else {
+ return null;
+ }
+ }
+
+ @GuardedBy("this")
+ final void updateOomAdjLocked() {
+ mOomAdjProfiler.oomAdjStarted();
+ final ProcessRecord TOP_APP = getTopAppLocked();
final long now = SystemClock.uptimeMillis();
final long nowElapsed = SystemClock.elapsedRealtime();
final long oldTime = now - ProcessList.MAX_EMPTY_TIME;
final int N = mLruProcesses.size();
- if (false) {
- RuntimeException e = new RuntimeException();
- e.fillInStackTrace();
- Slog.i(TAG, "updateOomAdj: top=" + TOP_ACT, e);
- }
-
// Reset state in all uid records.
for (int i=mActiveUids.size()-1; i>=0; i--) {
final UidRecord uidRec = mActiveUids.valueAt(i);
@@ -25118,7 +20912,9 @@ public class ActivityManagerService extends IActivityManager.Stub
uidRec.reset();
}
- mStackSupervisor.rankTaskLayersIfNeeded();
+ if (mStackSupervisor != null) {
+ mStackSupervisor.rankTaskLayersIfNeeded();
+ }
mAdjSeq++;
mNewNumServiceProcs = 0;
@@ -25214,7 +21010,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// to the process, do that now.
if (app.curAdj >= ProcessList.UNKNOWN_ADJ) {
switch (app.curProcState) {
- case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:
+ case PROCESS_STATE_CACHED_ACTIVITY:
case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
case ActivityManager.PROCESS_STATE_CACHED_RECENT:
// This process is a cached process holding activities...
@@ -25272,7 +21068,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// - Continue retrying until no process was promoted.
// - Iterate from least important to most important.
int cycleCount = 0;
- while (retryCycles) {
+ while (retryCycles && cycleCount < 10) {
cycleCount++;
retryCycles = false;
@@ -25287,12 +21083,14 @@ public class ActivityManagerService extends IActivityManager.Stub
for (int i=0; i<N; i++) {
ProcessRecord app = mLruProcesses.get(i);
if (!app.killedByAm && app.thread != null && app.containsCycle == true) {
+
if (computeOomAdjLocked(app, ProcessList.UNKNOWN_ADJ, TOP_APP, true, now)) {
retryCycles = true;
}
}
}
}
+
for (int i=N-1; i>=0; i--) {
ProcessRecord app = mLruProcesses.get(i);
if (!app.killedByAm && app.thread != null) {
@@ -25300,7 +21098,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// Count the number of process types.
switch (app.curProcState) {
- case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:
+ case PROCESS_STATE_CACHED_ACTIVITY:
case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
mNumCachedHiddenProcs++;
numCached++;
@@ -25343,7 +21141,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (uidRec.curProcState > app.curProcState) {
uidRec.curProcState = app.curProcState;
}
- if (app.foregroundServices) {
+ if (app.hasForegroundServices()) {
uidRec.foregroundServices = true;
}
}
@@ -25355,6 +21153,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
}
+ mProcessStats.updateTrackingAssociationsLocked(mAdjSeq, now);
if ((numBServices > mBServiceAppThreshold) && (true == mAllowLowerMemLevel)
&& (selectedAppRecord != null)) {
ProcessList.setOomAdj(selectedAppRecord.pid, selectedAppRecord.info.uid,
@@ -25405,7 +21204,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
mLastMemoryLevel = memFactor;
mLastNumProcesses = mLruProcesses.size();
- boolean allChanged = mProcessStats.setMemFactorLocked(memFactor, !isSleepingLocked(), now);
+ boolean allChanged = mProcessStats.setMemFactorLocked(
+ memFactor, mAtmInternal != null ? !mAtmInternal.isSleeping() : true, now);
final int trackerMemFactor = mProcessStats.getMemFactorLocked();
if (memFactor != ProcessStats.ADJ_MEM_FACTOR_NORMAL) {
if (mLowRamStartTime == 0) {
@@ -25426,8 +21226,8 @@ public class ActivityManagerService extends IActivityManager.Stub
}
int factor = numTrimming/3;
int minFactor = 2;
- if (mHomeProcess != null) minFactor++;
- if (mPreviousProcess != null) minFactor++;
+ if (mActivityTaskManager.mHomeProcess != null) minFactor++;
+ if (mActivityTaskManager.mPreviousProcess != null) minFactor++;
if (factor < minFactor) factor = minFactor;
int curLevel = ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
for (int i=N-1; i>=0; i--) {
@@ -25445,19 +21245,6 @@ public class ActivityManagerService extends IActivityManager.Stub
app.thread.scheduleTrimMemory(curLevel);
} catch (RemoteException e) {
}
- if (false) {
- // For now we won't do this; our memory trimming seems
- // to be good enough at this point that destroying
- // activities causes more harm than good.
- if (curLevel >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE
- && app != mHomeProcess && app != mPreviousProcess) {
- // Need to do this on its own message because the stack may not
- // be in a consistent state at this point.
- // For these apps we will also finish their activities
- // to help them free memory.
- mStackSupervisor.scheduleDestroyAllActivities(app, "trim");
- }
- }
}
app.trimMemoryLevel = curLevel;
step++;
@@ -25652,6 +21439,7 @@ public class ActivityManagerService extends IActivityManager.Stub
Slog.d(TAG_OOM_ADJ, "Did OOM ADJ in " + duration + "ms");
}
}
+ mOomAdjProfiler.oomAdjEnded();
}
@Override
@@ -26008,7 +21796,7 @@ public class ActivityManagerService extends IActivityManager.Stub
// has been removed.
for (int i=mRemovedProcesses.size()-1; i>=0; i--) {
final ProcessRecord app = mRemovedProcesses.get(i);
- if (app.activities.size() == 0 && app.recentTasks.size() == 0
+ if (!app.hasActivitiesOrRecentTasks()
&& app.curReceivers.isEmpty() && app.services.size() == 0) {
Slog.i(
TAG, "Exiting empty application process "
@@ -26027,7 +21815,7 @@ public class ActivityManagerService extends IActivityManager.Stub
cleanUpApplicationRecordLocked(app, false, true, -1, false /*replacingPid*/);
mRemovedProcesses.remove(i);
- if (app.persistent) {
+ if (app.isPersistent()) {
addAppLocked(app.info, null, false, null /* ABI override */);
}
}
@@ -26053,7 +21841,7 @@ public class ActivityManagerService extends IActivityManager.Stub
for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {
ProcessRecord r = mLruProcesses.get(i);
- if (r.thread != null && r.persistent) {
+ if (r.thread != null && r.isPersistent()) {
sendSignal(r.pid, sig);
}
}
@@ -26076,7 +21864,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- private void clearProfilerLocked() {
+ void clearProfilerLocked() {
if (mProfilerInfo !=null && mProfilerInfo.profileFd != null) {
try {
mProfilerInfo.profileFd.close();
@@ -26198,8 +21986,9 @@ public class ActivityManagerService extends IActivityManager.Stub
return proc;
}
+ @Override
public boolean dumpHeap(String process, int userId, boolean managed, boolean mallocInfo,
- boolean runGc, String path, ParcelFileDescriptor fd) throws RemoteException {
+ boolean runGc, String path, ParcelFileDescriptor fd, RemoteCallback finishCallback) {
try {
synchronized (this) {
@@ -26227,7 +22016,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- proc.thread.dumpHeap(managed, mallocInfo, runGc, path, fd);
+ proc.thread.dumpHeap(managed, mallocInfo, runGc, path, fd, finishCallback);
fd = null;
return true;
}
@@ -26548,74 +22337,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public SleepToken acquireSleepToken(String tag, int displayId) {
- Preconditions.checkNotNull(tag);
- return ActivityManagerService.this.acquireSleepToken(tag, displayId);
- }
-
- @Override
- public ComponentName getHomeActivityForUser(int userId) {
- synchronized (ActivityManagerService.this) {
- ActivityRecord homeActivity = mStackSupervisor.getHomeActivityForUser(userId);
- return homeActivity == null ? null : homeActivity.realActivity;
- }
- }
-
- @Override
- public void onUserRemoved(int userId) {
- synchronized (ActivityManagerService.this) {
- ActivityManagerService.this.onUserStoppedLocked(userId);
- }
- mBatteryStatsService.onUserRemoved(userId);
- mUserController.onUserRemoved(userId);
- }
-
- @Override
- public void onLocalVoiceInteractionStarted(IBinder activity,
- IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
- synchronized (ActivityManagerService.this) {
- ActivityManagerService.this.onLocalVoiceInteractionStartedLocked(activity,
- voiceSession, voiceInteractor);
- }
- }
-
- @Override
- public void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp) {
- synchronized (ActivityManagerService.this) {
- mStackSupervisor.getActivityMetricsLogger().notifyTransitionStarting(
- reasons, timestamp);
- }
- }
-
- @Override
- public void notifyAppTransitionFinished() {
- synchronized (ActivityManagerService.this) {
- mStackSupervisor.notifyAppTransitionDone();
- }
- }
-
- @Override
- public void notifyAppTransitionCancelled() {
- synchronized (ActivityManagerService.this) {
- mStackSupervisor.notifyAppTransitionDone();
- }
- }
-
- @Override
- public List<IBinder> getTopVisibleActivities() {
- synchronized (ActivityManagerService.this) {
- return mStackSupervisor.getTopVisibleActivities();
- }
- }
-
- @Override
- public void notifyDockedStackMinimizedChanged(boolean minimized) {
- synchronized (ActivityManagerService.this) {
- mStackSupervisor.setDockedStackMinimized(minimized);
- }
- }
-
- @Override
public void killForegroundAppsForUser(int userHandle) {
synchronized (ActivityManagerService.this) {
final ArrayList<ProcessRecord> procs = new ArrayList<>();
@@ -26625,7 +22346,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final int NA = apps.size();
for (int ia = 0; ia < NA; ia++) {
final ProcessRecord app = apps.valueAt(ia);
- if (app.persistent) {
+ if (app.isPersistent()) {
// We don't kill persistent processes.
continue;
}
@@ -26674,106 +22395,16 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public void updatePersistentConfigurationForUser(@NonNull Configuration values,
- int userId) {
- Preconditions.checkNotNull(values, "Configuration must not be null");
- Preconditions.checkArgumentNonnegative(userId, "userId " + userId + " not supported");
- synchronized (ActivityManagerService.this) {
- updateConfigurationLocked(values, null, false, true, userId,
- false /* deferResume */);
- }
- }
-
- @Override
- public int startActivitiesAsPackage(String packageName, int userId, Intent[] intents,
- Bundle bOptions) {
- Preconditions.checkNotNull(intents, "intents");
- final String[] resolvedTypes = new String[intents.length];
-
- // UID of the package on user userId.
- // "= 0" is needed because otherwise catch(RemoteException) would make it look like
- // packageUid may not be initialized.
- int packageUid = 0;
- final long ident = Binder.clearCallingIdentity();
-
- try {
- for (int i = 0; i < intents.length; i++) {
- resolvedTypes[i] =
- intents[i].resolveTypeIfNeeded(mContext.getContentResolver());
- }
-
- packageUid = AppGlobals.getPackageManager().getPackageUid(
- packageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId);
- } catch (RemoteException e) {
- // Shouldn't happen.
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
-
- synchronized (ActivityManagerService.this) {
- return mActivityStartController.startActivitiesInPackage(
- packageUid, packageName,
- intents, resolvedTypes, null /* resultTo */,
- SafeActivityOptions.fromBundle(bOptions), userId,
- false /* validateIncomingUser */);
- }
- }
-
- @Override
- public int startActivityAsUser(IApplicationThread caller, String callerPacakge,
- Intent intent, Bundle options, int userId) {
- return ActivityManagerService.this.startActivityAsUser(
- caller, callerPacakge, intent,
- intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options, userId,
- false /*validateIncomingUser*/);
- }
-
- @Override
public int getUidProcessState(int uid) {
return getUidState(uid);
}
@Override
- public void notifyKeyguardFlagsChanged(@Nullable Runnable callback) {
- synchronized (ActivityManagerService.this) {
-
- // We might change the visibilities here, so prepare an empty app transition which
- // might be overridden later if we actually change visibilities.
- final boolean wasTransitionSet =
- mWindowManager.getPendingAppTransition() != TRANSIT_NONE;
- if (!wasTransitionSet) {
- mWindowManager.prepareAppTransition(TRANSIT_NONE,
- false /* alwaysKeepCurrent */);
- }
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
-
- // If there was a transition set already we don't want to interfere with it as we
- // might be starting it too early.
- if (!wasTransitionSet) {
- mWindowManager.executeAppTransition();
- }
- }
- if (callback != null) {
- callback.run();
- }
- }
-
- @Override
public boolean isSystemReady() {
// no need to synchronize(this) just to read & return the value
return mSystemReady;
}
- @Override
- public void notifyKeyguardTrustedChanged() {
- synchronized (ActivityManagerService.this) {
- if (mKeyguardController.isKeyguardShowing(DEFAULT_DISPLAY)) {
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
- }
- }
- }
-
/**
* Sets if the given pid has an overlay UI or not.
*
@@ -26801,11 +22432,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- @Override
- public void setRunningRemoteAnimation(int pid, boolean runningRemoteAnimation) {
- ActivityManagerService.this.setRunningRemoteAnimation(pid, runningRemoteAnimation);
- }
-
/**
* Called after the network policy rules are updated by
* {@link com.android.server.net.NetworkPolicyManagerService} for a specific {@param uid}
@@ -26856,29 +22482,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public void notifyActiveVoiceInteractionServiceChanged(ComponentName component) {
- synchronized (ActivityManagerService.this) {
- mActiveVoiceInteractionServiceComponent = component;
- }
- }
-
- /**
- * Called after virtual display Id is updated by
- * {@link com.android.server.vr.Vr2dDisplay} with a specific
- * {@param vrVr2dDisplayId}.
- */
- @Override
- public void setVr2dDisplayId(int vr2dDisplayId) {
- if (DEBUG_STACK) {
- Slog.d(TAG, "setVr2dDisplayId called for: " +
- vr2dDisplayId);
- }
- synchronized (ActivityManagerService.this) {
- mVr2dDisplayId = vr2dDisplayId;
- }
- }
-
- @Override
public void saveANRState(String reason) {
synchronized (ActivityManagerService.this) {
final StringWriter sw = new StringWriter();
@@ -26888,7 +22491,7 @@ public class ActivityManagerService extends IActivityManager.Stub
pw.println(" Reason: " + reason);
}
pw.println();
- mActivityStartController.dump(pw, " ", null);
+ mActivityTaskManager.getActivityStartController().dump(pw, " ", null);
pw.println();
pw.println("-------------------------------------------------------------------------------");
dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */,
@@ -26909,72 +22512,11 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public void setFocusedActivity(IBinder token) {
- synchronized (ActivityManagerService.this) {
- final ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r == null) {
- throw new IllegalArgumentException(
- "setFocusedActivity: No activity record matching token=" + token);
- }
- if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(
- r, "setFocusedActivity")) {
- mStackSupervisor.resumeFocusedStackTopActivityLocked();
- }
- }
- }
-
- @Override
- public void setAllowAppSwitches(@NonNull String type, int uid, int userId) {
- synchronized (ActivityManagerService.this) {
- if (mUserController.isUserRunning(userId, ActivityManager.FLAG_OR_STOPPED)) {
- ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(userId);
- if (types == null) {
- if (uid < 0) {
- return;
- }
- types = new ArrayMap<>();
- mAllowAppSwitchUids.put(userId, types);
- }
- if (uid < 0) {
- types.remove(type);
- } else {
- types.put(type, uid);
- }
- }
- }
- }
-
- @Override
public boolean isRuntimeRestarted() {
return mSystemServiceManager.isRuntimeRestarted();
}
@Override
- public boolean hasRunningActivity(int uid, @Nullable String packageName) {
- if (packageName == null) return false;
-
- synchronized (ActivityManagerService.this) {
- for (int i = 0; i < mLruProcesses.size(); i++) {
- final ProcessRecord processRecord = mLruProcesses.get(i);
- if (processRecord.uid == uid) {
- for (int j = 0; j < processRecord.activities.size(); j++) {
- final ActivityRecord activityRecord = processRecord.activities.get(j);
- if (packageName.equals(activityRecord.packageName)) {
- return true;
- }
- }
- }
- }
- }
- return false;
- }
-
- @Override
- public void registerScreenObserver(ScreenObserver observer) {
- mScreenObservers.add(observer);
- }
-
- @Override
public boolean canStartMoreUsers() {
return mUserController.canStartMoreUsers();
}
@@ -26995,21 +22537,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public boolean isCallerRecents(int callingUid) {
- return getRecentTasks().isCallerRecents(callingUid);
- }
-
- @Override
- public boolean isRecentsComponentHomeActivity(int userId) {
- return getRecentTasks().isRecentsComponentHomeActivity(userId);
- }
-
- @Override
- public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
- ActivityManagerService.this.cancelRecentsAnimation(restoreHomeStackPosition);
- }
-
- @Override
public boolean isUidActive(int uid) {
synchronized (ActivityManagerService.this) {
return isUidActiveLocked(uid);
@@ -27017,6 +22544,11 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
+ public void setRunningRemoteAnimation(int pid, boolean runningRemoteAnimation) {
+ ActivityManagerService.this.setRunningRemoteAnimation(pid, runningRemoteAnimation);
+ }
+
+ @Override
public List<ProcessMemoryState> getMemoryStateForProcesses() {
List<ProcessMemoryState> processMemoryStates = new ArrayList<>();
synchronized (mPidsSelfLocked) {
@@ -27044,8 +22576,137 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
- ActivityManagerService.this.enforceCallerIsRecentsOrHasPermission(permission, func);
+ public int handleIncomingUser(int callingPid, int callingUid, int userId,
+ boolean allowAll, int allowMode, String name, String callerPackage) {
+ return mUserController.handleIncomingUser(callingPid, callingUid, userId, allowAll,
+ allowMode, name, callerPackage);
+ }
+
+ @Override
+ public void enforceCallingPermission(String permission, String func) {
+ ActivityManagerService.this.enforceCallingPermission(permission, func);
+ }
+
+ @Override
+ public int getCurrentUserId() {
+ return mUserController.getCurrentUserIdLU();
+ }
+
+ @Override
+ public boolean isUserRunning(int userId, int flags) {
+ // Holding am lock isn't required to call into user controller.
+ return mUserController.isUserRunning(userId, flags);
+ }
+
+ @Override
+ public void trimApplications() {
+ ActivityManagerService.this.trimApplications();
+ }
+
+ public int getPackageScreenCompatMode(ApplicationInfo ai) {
+ synchronized (ActivityManagerService.this) {
+ return mCompatModePackages.computeCompatModeLocked(ai);
+ }
+ }
+
+ public void setPackageScreenCompatMode(ApplicationInfo ai, int mode) {
+ synchronized (ActivityManagerService.this) {
+ mCompatModePackages.setPackageScreenCompatModeLocked(ai, mode);
+ }
+ }
+
+ public void closeSystemDialogs(String reason) {
+ ActivityManagerService.this.closeSystemDialogs(reason);
+ }
+
+ public void killProcessesForRemovedTask(ArrayList<Object> procsToKill) {
+ synchronized (ActivityManagerService.this) {
+ for (int i = 0; i < procsToKill.size(); i++) {
+ final WindowProcessController wpc =
+ (WindowProcessController) procsToKill.get(i);
+ final ProcessRecord pr = (ProcessRecord) wpc.mOwner;
+ if (pr.setSchedGroup == ProcessList.SCHED_GROUP_BACKGROUND
+ && pr.curReceivers.isEmpty()) {
+ pr.kill("remove task", true);
+ } else {
+ // We delay killing processes that are not in the background or running a
+ // receiver.
+ pr.waitingToKill = "remove task";
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean hasRunningActivity(int uid, @Nullable String packageName) {
+ if (packageName == null) return false;
+
+ synchronized (ActivityManagerService.this) {
+ for (int i = 0; i < mLruProcesses.size(); i++) {
+ final ProcessRecord pr = mLruProcesses.get(i);
+ if (pr.uid != uid) {
+ continue;
+ }
+ if (pr.getWindowProcessController().hasRunningActivity(packageName)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void updateOomAdj() {
+ synchronized (ActivityManagerService.this) {
+ ActivityManagerService.this.updateOomAdjLocked();
+ }
+ }
+
+ @Override
+ public void sendForegroundProfileChanged(int userId) {
+ mUserController.sendForegroundProfileChanged(userId);
+ }
+
+ @Override
+ public boolean shouldConfirmCredentials(int userId) {
+ return mUserController.shouldConfirmCredentials(userId);
+ }
+
+ @Override
+ public int[] getCurrentProfileIds() {
+ return mUserController.getCurrentProfileIds();
+ }
+
+ @Override
+ public UserInfo getCurrentUser() {
+ return mUserController.getCurrentUser();
+ }
+
+ @Override
+ public void ensureNotSpecialUser(int userId) {
+ mUserController.ensureNotSpecialUser(userId);
+ }
+
+ @Override
+ public boolean isCurrentProfile(int userId) {
+ return mUserController.isCurrentProfile(userId);
+ }
+
+ @Override
+ public boolean hasStartedUserState(int userId) {
+ return mUserController.hasStartedUserState(userId);
+ }
+
+ @Override
+ public void finishUserSwitch(Object uss) {
+ mUserController.finishUserSwitch((UserState) uss);
+ }
+
+ @Override
+ public Intent getHomeIntent() {
+ synchronized (ActivityManagerService.this) {
+ return ActivityManagerService.this.getHomeIntent();
+ }
}
}
@@ -27146,21 +22807,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
/**
- * Return the user id of the last resumed activity.
- */
- @Override
- public @UserIdInt int getLastResumedActivityUserId() {
- enforceCallingPermission(
- permission.INTERACT_ACROSS_USERS_FULL, "getLastResumedActivityUserId()");
- synchronized (this) {
- if (mLastResumedActivity == null) {
- return mUserController.getCurrentUserId();
- }
- return mLastResumedActivity.userId;
- }
- }
-
- /**
* Kill processes for the user with id userId and that depend on the package named packageName
*/
@Override
@@ -27194,21 +22840,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback,
- CharSequence message) throws RemoteException {
- if (message != null) {
- enforceCallingPermission(permission.SHOW_KEYGUARD_MESSAGE,
- "dismissKeyguard()");
- }
- final long callingId = Binder.clearCallingIdentity();
- try {
- mKeyguardController.dismissKeyguard(token, callback, message);
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
- }
-
- @Override
public int restartUserInBackground(final int userId) {
return mUserController.restartUser(userId, /* foreground */ false);
}
@@ -27329,85 +22960,141 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public void setShowWhenLocked(IBinder token, boolean showWhenLocked)
- throws RemoteException {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
+ public void startDelegateShellPermissionIdentity(int delegateUid) {
+ if (UserHandle.getCallingAppId() != Process.SHELL_UID
+ && UserHandle.getCallingAppId() != Process.ROOT_UID) {
+ throw new SecurityException("Only the shell can delegate its permissions");
+ }
+
+ // We allow delegation only to one instrumentation started from the shell
+ synchronized (ActivityManagerService.this) {
+ // If there is a delegate it should be the same instance for app ops and permissions.
+ if (mAppOpsService.getAppOpsServiceDelegate()
+ != getPackageManagerInternalLocked().getCheckPermissionDelegate()) {
+ throw new IllegalStateException("Bad shell delegate state");
+ }
+
+ // If the delegate is already set up for the target UID, nothing to do.
+ if (mAppOpsService.getAppOpsServiceDelegate() != null) {
+ if (!(mAppOpsService.getAppOpsServiceDelegate() instanceof ShellDelegate)) {
+ throw new IllegalStateException("Bad shell delegate state");
+ }
+ if (((ShellDelegate) mAppOpsService.getAppOpsServiceDelegate())
+ .getDelegateUid() != delegateUid) {
+ throw new SecurityException("Shell can delegate permissions only "
+ + "to one instrumentation at a time");
+ }
return;
}
- final long origId = Binder.clearCallingIdentity();
- try {
- r.setShowWhenLocked(showWhenLocked);
- } finally {
- Binder.restoreCallingIdentity(origId);
+
+ final int instrCount = mActiveInstrumentation.size();
+ for (int i = 0; i < instrCount; i++) {
+ final ActiveInstrumentation instr = mActiveInstrumentation.get(i);
+ if (instr.mTargetInfo.uid != delegateUid) {
+ continue;
+ }
+ // If instrumentation started from the shell the connection is not null
+ if (instr.mUiAutomationConnection == null) {
+ throw new SecurityException("Shell can delegate its permissions" +
+ " only to an instrumentation started from the shell");
+ }
+
+ // Hook them up...
+ final ShellDelegate shellDelegate = new ShellDelegate(
+ instr.mTargetInfo.packageName, delegateUid);
+ mAppOpsService.setAppOpsServiceDelegate(shellDelegate);
+ getPackageManagerInternalLocked().setCheckPermissionDelegate(shellDelegate);
+ return;
}
}
}
@Override
- public void setTurnScreenOn(IBinder token, boolean turnScreenOn) throws RemoteException {
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return;
- }
- final long origId = Binder.clearCallingIdentity();
- try {
- r.setTurnScreenOn(turnScreenOn);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
+ public void stopDelegateShellPermissionIdentity() {
+ if (UserHandle.getCallingAppId() != Process.SHELL_UID
+ && UserHandle.getCallingAppId() != Process.ROOT_UID) {
+ throw new SecurityException("Only the shell can delegate its permissions");
+ }
+ synchronized (ActivityManagerService.this) {
+ mAppOpsService.setAppOpsServiceDelegate(null);
+ getPackageManagerInternalLocked().setCheckPermissionDelegate(null);
}
}
- @Override
- public void registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition)
- throws RemoteException {
- enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
- "registerRemoteAnimations");
- definition.setCallingPid(Binder.getCallingPid());
- synchronized (this) {
- final ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return;
+ private class ShellDelegate implements CheckOpsDelegate, CheckPermissionDelegate {
+ private final String mTargetPackageName;
+ private final int mTargetUid;
+
+ ShellDelegate(String targetPacakgeName, int targetUid) {
+ mTargetPackageName = targetPacakgeName;
+ mTargetUid = targetUid;
+ }
+
+ int getDelegateUid() {
+ return mTargetUid;
+ }
+
+ @Override
+ public int checkOperation(int code, int uid, String packageName,
+ TriFunction<Integer, Integer, String, Integer> superImpl) {
+ if (uid == mTargetUid) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return superImpl.apply(code, Process.SHELL_UID,
+ "com.android.shell");
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
- final long origId = Binder.clearCallingIdentity();
- try {
- r.registerRemoteAnimations(definition);
- } finally {
- Binder.restoreCallingIdentity(origId);
+ return superImpl.apply(code, uid, packageName);
+ }
+
+ @Override
+ public int checkAudioOperation(int code, int usage, int uid, String packageName,
+ QuadFunction<Integer, Integer, Integer, String, Integer> superImpl) {
+ if (uid == mTargetUid) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return superImpl.apply(code, usage, Process.SHELL_UID,
+ "com.android.shell");
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
+ return superImpl.apply(code, usage, uid, packageName);
}
- }
- @Override
- public void registerRemoteAnimationForNextActivityStart(String packageName,
- RemoteAnimationAdapter adapter) throws RemoteException {
- enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
- "registerRemoteAnimationForNextActivityStart");
- adapter.setCallingPid(Binder.getCallingPid());
- synchronized (this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- mActivityStartController.registerRemoteAnimationForNextActivityStart(packageName,
- adapter);
- } finally {
- Binder.restoreCallingIdentity(origId);
+ @Override
+ public int noteOperation(int code, int uid, String packageName,
+ TriFunction<Integer, Integer, String, Integer> superImpl) {
+ if (uid == mTargetUid) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return mAppOpsService.noteProxyOperation(code, Process.SHELL_UID,
+ "com.android.shell", uid, packageName);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
+ return superImpl.apply(code, uid, packageName);
}
- }
- /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */
- @Override
- public void alwaysShowUnsupportedCompileSdkWarning(ComponentName activity) {
- synchronized (this) {
- final long origId = Binder.clearCallingIdentity();
- try {
- mAppWarnings.alwaysShowUnsupportedCompileSdkWarning(activity);
- } finally {
- Binder.restoreCallingIdentity(origId);
+ @Override
+ public int checkPermission(String permName, String pkgName, int userId,
+ TriFunction<String, String, Integer, Integer> superImpl) {
+ if (mTargetPackageName.equals(pkgName)) {
+ return superImpl.apply(permName, "com.android.shell", userId);
+ }
+ return superImpl.apply(permName, pkgName, userId);
+ }
+
+ @Override
+ public int checkUidPermission(String permName, int uid,
+ BiFunction<String, Integer, Integer> superImpl) {
+ if (uid == mTargetUid) {
+ return superImpl.apply(permName, Process.SHELL_UID);
}
+ return superImpl.apply(permName, uid);
}
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index dc9a5adb5a0c..e6c34755b932 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -18,9 +18,11 @@ package com.android.server.am;
import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.AppGlobals;
import android.app.IActivityController;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.IStopUserCallback;
import android.app.IUidObserver;
import android.app.KeyguardManager;
@@ -56,6 +58,8 @@ import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
+import android.os.RemoteCallback;
+import android.os.RemoteCallback.OnResultListener;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ShellCommand;
@@ -65,6 +69,7 @@ import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
+import android.text.format.Time;
import android.util.ArrayMap;
import android.util.DebugUtils;
import android.util.DisplayMetrics;
@@ -89,6 +94,7 @@ import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.CountDownLatch;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
@@ -96,9 +102,9 @@ import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
-import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
-import static android.app.ActivityManager.RESIZE_MODE_USER;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
+import static android.app.ActivityTaskManager.RESIZE_MODE_SYSTEM;
+import static android.app.ActivityTaskManager.RESIZE_MODE_USER;
+import static android.app.ActivityTaskManager.INVALID_STACK_ID;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.view.Display.INVALID_DISPLAY;
@@ -111,6 +117,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
// IPC interface to activity manager -- don't need to do additional security checks.
final IActivityManager mInterface;
+ final IActivityTaskManager mTaskInterface;
// Internal service impl -- must perform security checks before touching.
final ActivityManagerService mInternal;
@@ -143,6 +150,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
ActivityManagerShellCommand(ActivityManagerService service, boolean dumping) {
mInterface = service;
+ mTaskInterface = service.mActivityTaskManager;
mInternal = service;
mPm = AppGlobals.getPackageManager();
mDumping = dumping;
@@ -471,12 +479,12 @@ final class ActivityManagerShellCommand extends ShellCommand {
options.setLockTaskEnabled(true);
}
if (mWaitOption) {
- result = mInterface.startActivityAndWait(null, null, intent, mimeType,
+ result = mTaskInterface.startActivityAndWait(null, null, intent, mimeType,
null, null, 0, mStartFlags, profilerInfo,
options != null ? options.toBundle() : null, mUserId);
res = result.result;
} else {
- res = mInterface.startActivityAsUser(null, null, intent, mimeType,
+ res = mTaskInterface.startActivityAsUser(null, null, intent, mimeType,
null, null, 0, mStartFlags, profilerInfo,
options != null ? options.toBundle() : null, mUserId);
}
@@ -570,7 +578,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
}
mRepeat--;
if (mRepeat > 0) {
- mInterface.unhandledBack();
+ mTaskInterface.unhandledBack();
}
} while (mRepeat > 0);
return 0;
@@ -872,7 +880,14 @@ final class ActivityManagerShellCommand extends ShellCommand {
}
}
String process = getNextArgRequired();
- String heapFile = getNextArgRequired();
+ String heapFile = getNextArg();
+ if (heapFile == null) {
+ final Time t = new Time();
+ t.set(System.currentTimeMillis());
+ heapFile = "/data/local/tmp/heapdump-" + t.format("%Y%m%d-%H%M%S") + ".prof";
+ }
+ pw.println("File: " + heapFile);
+ pw.flush();
File file = new File(heapFile);
file.delete();
@@ -881,10 +896,28 @@ final class ActivityManagerShellCommand extends ShellCommand {
return -1;
}
- if (!mInterface.dumpHeap(process, userId, managed, mallocInfo, runGc, heapFile, fd)) {
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ final RemoteCallback finishCallback = new RemoteCallback(new OnResultListener() {
+ @Override
+ public void onResult(Bundle result) {
+ latch.countDown();
+ }
+ }, null);
+
+ if (!mInterface.dumpHeap(process, userId, managed, mallocInfo, runGc, heapFile, fd,
+ finishCallback)) {
err.println("HEAP DUMP FAILED on process " + process);
return -1;
}
+ pw.println("Waiting for dump to finish...");
+ pw.flush();
+ try {
+ latch.await();
+ } catch (InterruptedException e) {
+ err.println("Caught InterruptedException");
+ }
+
return 0;
}
@@ -2153,7 +2186,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
int runSuppressResizeConfigChanges(PrintWriter pw) throws RemoteException {
boolean suppress = Boolean.valueOf(getNextArgRequired());
- mInterface.suppressResizeConfigChanges(suppress);
+ mTaskInterface.suppressResizeConfigChanges(suppress);
return 0;
}
@@ -2420,7 +2453,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
int stackId = Integer.parseInt(stackIdStr);
String displayIdStr = getNextArgRequired();
int displayId = Integer.parseInt(displayIdStr);
- mInterface.moveStackToDisplay(stackId, displayId);
+ mTaskInterface.moveStackToDisplay(stackId, displayId);
return 0;
}
@@ -2434,7 +2467,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
throw new RuntimeException(e.getMessage(), e);
}
- final int stackId = mInterface.createStackOnDisplay(displayId);
+ final int stackId = mTaskInterface.createStackOnDisplay(displayId);
if (stackId != INVALID_STACK_ID) {
// TODO: Need proper support if this is used by test...
// container.startActivity(intent);
@@ -2465,7 +2498,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
return -1;
}
- mInterface.moveTaskToStack(taskId, stackId, toTop);
+ mTaskInterface.moveTaskToStack(taskId, stackId, toTop);
return 0;
}
@@ -2499,7 +2532,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
int resizeStackUnchecked(int stackId, Rect bounds, int delayMs, boolean animate)
throws RemoteException {
try {
- mInterface.resizeStack(stackId, bounds, false, false, animate, -1);
+ mTaskInterface.resizeStack(stackId, bounds, false, false, animate, -1);
Thread.sleep(delayMs);
} catch (InterruptedException e) {
}
@@ -2513,7 +2546,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
getErrPrintWriter().println("Error: invalid input bounds");
return -1;
}
- mInterface.resizeDockedStack(bounds, taskBounds, null, null, null);
+ mTaskInterface.resizeDockedStack(bounds, taskBounds, null, null, null);
return 0;
}
@@ -2533,12 +2566,12 @@ final class ActivityManagerShellCommand extends ShellCommand {
String positionStr = getNextArgRequired();
int position = Integer.parseInt(positionStr);
- mInterface.positionTaskInStack(taskId, stackId, position);
+ mTaskInterface.positionTaskInStack(taskId, stackId, position);
return 0;
}
int runStackList(PrintWriter pw) throws RemoteException {
- List<ActivityManager.StackInfo> stacks = mInterface.getAllStackInfos();
+ List<ActivityManager.StackInfo> stacks = mTaskInterface.getAllStackInfos();
for (ActivityManager.StackInfo info : stacks) {
pw.println(info);
}
@@ -2548,7 +2581,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
int runStackInfo(PrintWriter pw) throws RemoteException {
int windowingMode = Integer.parseInt(getNextArgRequired());
int activityType = Integer.parseInt(getNextArgRequired());
- ActivityManager.StackInfo info = mInterface.getStackInfo(windowingMode, activityType);
+ ActivityManager.StackInfo info = mTaskInterface.getStackInfo(windowingMode, activityType);
pw.println(info);
return 0;
}
@@ -2556,7 +2589,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
int runStackRemove(PrintWriter pw) throws RemoteException {
String stackIdStr = getNextArgRequired();
int stackId = Integer.parseInt(stackIdStr);
- mInterface.removeStack(stackId);
+ mTaskInterface.removeStack(stackId);
return 0;
}
@@ -2568,7 +2601,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
return -1;
}
- if (!mInterface.moveTopActivityToPinnedStack(stackId, bounds)) {
+ if (!mTaskInterface.moveTopActivityToPinnedStack(stackId, bounds)) {
getErrPrintWriter().println("Didn't move top activity to pinned stack.");
return -1;
}
@@ -2614,12 +2647,12 @@ final class ActivityManagerShellCommand extends ShellCommand {
int runTaskLock(PrintWriter pw) throws RemoteException {
String taskIdStr = getNextArgRequired();
if (taskIdStr.equals("stop")) {
- mInterface.stopSystemLockTaskMode();
+ mTaskInterface.stopSystemLockTaskMode();
} else {
int taskId = Integer.parseInt(taskIdStr);
- mInterface.startSystemLockTaskMode(taskId);
+ mTaskInterface.startSystemLockTaskMode(taskId);
}
- pw.println("Activity manager is " + (mInterface.isInLockTaskMode() ? "" : "not ") +
+ pw.println("Activity manager is " + (mTaskInterface.isInLockTaskMode() ? "" : "not ") +
"in lockTaskMode");
return 0;
}
@@ -2629,7 +2662,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
final int taskId = Integer.parseInt(taskIdStr);
final String resizeableStr = getNextArgRequired();
final int resizeableMode = Integer.parseInt(resizeableStr);
- mInterface.setTaskResizeable(taskId, resizeableMode);
+ mTaskInterface.setTaskResizeable(taskId, resizeableMode);
return 0;
}
@@ -2648,7 +2681,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
void taskResize(int taskId, Rect bounds, int delay_ms, boolean pretendUserResize)
throws RemoteException {
final int resizeMode = pretendUserResize ? RESIZE_MODE_USER : RESIZE_MODE_SYSTEM;
- mInterface.resizeTask(taskId, bounds, resizeMode);
+ mTaskInterface.resizeTask(taskId, bounds, resizeMode);
try {
Thread.sleep(delay_ms);
} catch (InterruptedException e) {
@@ -2720,14 +2753,14 @@ final class ActivityManagerShellCommand extends ShellCommand {
int runTaskFocus(PrintWriter pw) throws RemoteException {
final int taskId = Integer.parseInt(getNextArgRequired());
pw.println("Setting focus to task " + taskId);
- mInterface.setFocusedTask(taskId);
+ mTaskInterface.setFocusedTask(taskId);
return 0;
}
int runWrite(PrintWriter pw) {
mInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
"registerUidObserver()");
- mInternal.getRecentTasks().flush();
+ mInternal.mActivityTaskManager.getRecentTasks().flush();
pw.println("All tasks persisted.");
return 0;
}
@@ -2752,7 +2785,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
if (res == null) {
return -1;
}
- pw.println(ActivityManager.supportsMultiWindow(mInternal.mContext));
+ pw.println(ActivityTaskManager.supportsMultiWindow(mInternal.mContext));
return 0;
}
@@ -2761,7 +2794,7 @@ final class ActivityManagerShellCommand extends ShellCommand {
if (res == null) {
return -1;
}
- pw.println(ActivityManager.supportsSplitScreenMultiWindow(mInternal.mContext));
+ pw.println(ActivityTaskManager.supportsSplitScreenMultiWindow(mInternal.mContext));
return 0;
}
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index 47d0423550c4..62f8c7285e6e 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -2,7 +2,7 @@ package com.android.server.am;
import static android.app.ActivityManager.START_SUCCESS;
import static android.app.ActivityManager.START_TASK_TO_FRONT;
-import static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT;
+import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_TIMEOUT;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
@@ -133,7 +133,7 @@ class ActivityMetricsLogger {
private final class WindowingModeTransitionInfoSnapshot {
final private ApplicationInfo applicationInfo;
- final private ProcessRecord processRecord;
+ final private WindowProcessController processRecord;
final private String packageName;
final private String launchedActivityName;
final private String launchedActivityLaunchedFromPackage;
@@ -154,7 +154,7 @@ class ActivityMetricsLogger {
launchedActivityLaunchToken = info.launchedActivity.info.launchToken;
launchedActivityAppRecordRequiredAbi = info.launchedActivity.app == null
? null
- : info.launchedActivity.app.requiredAbi;
+ : info.launchedActivity.app.getRequiredAbi();
reason = info.reason;
startingWindowDelayMs = info.startingWindowDelayMs;
bindApplicationDelayMs = info.bindApplicationDelayMs;
@@ -185,6 +185,10 @@ class ActivityMetricsLogger {
mWindowState = WINDOW_STATE_INVALID;
ActivityStack stack = mSupervisor.getFocusedStack();
+ if (stack == null) {
+ return;
+ }
+
if (stack.isActivityTypeAssistant()) {
mWindowState = WINDOW_STATE_ASSISTANT;
return;
@@ -234,7 +238,7 @@ class ActivityMetricsLogger {
* @param launchedActivity the activity that is being launched
*/
void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity) {
- final ProcessRecord processRecord = findProcessForActivity(launchedActivity);
+ final WindowProcessController processRecord = findProcessForActivity(launchedActivity);
final boolean processRunning = processRecord != null;
// We consider this a "process switch" if the process of the activity that gets launched
@@ -242,25 +246,11 @@ class ActivityMetricsLogger {
// of caches might be purged so the time until it produces the first frame is very
// interesting.
final boolean processSwitch = processRecord == null
- || !hasStartedActivity(processRecord, launchedActivity);
+ || !processRecord.hasStartedActivity(launchedActivity);
notifyActivityLaunched(resultCode, launchedActivity, processRunning, processSwitch);
}
- private boolean hasStartedActivity(ProcessRecord record, ActivityRecord launchedActivity) {
- final ArrayList<ActivityRecord> activities = record.activities;
- for (int i = activities.size() - 1; i >= 0; i--) {
- final ActivityRecord activity = activities.get(i);
- if (launchedActivity == activity) {
- continue;
- }
- if (!activity.stopped) {
- return true;
- }
- }
- return false;
- }
-
/**
* Notifies the tracker the the activity is actually launching.
*
@@ -407,7 +397,7 @@ class ActivityMetricsLogger {
}
private void checkVisibility(TaskRecord t, ActivityRecord r) {
- synchronized (mSupervisor.mService) {
+ synchronized (mSupervisor.mService.mGlobalLock) {
final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(
r.getWindowingMode());
@@ -641,7 +631,7 @@ class ActivityMetricsLogger {
return;
}
- final int pid = info.processRecord.pid;
+ final int pid = info.processRecord.getPid();
final int uid = info.applicationInfo.uid;
final MemoryStat memoryStat = readMemoryStatFromFilesystem(uid, pid);
if (memoryStat == null) {
@@ -661,10 +651,10 @@ class ActivityMetricsLogger {
memoryStat.swapInBytes);
}
- private ProcessRecord findProcessForActivity(ActivityRecord launchedActivity) {
+ private WindowProcessController findProcessForActivity(ActivityRecord launchedActivity) {
return launchedActivity != null
- ? mSupervisor.mService.mProcessNames.get(launchedActivity.processName,
- launchedActivity.appInfo.uid)
+ ? mSupervisor.mService.mProcessNames.get(
+ launchedActivity.processName, launchedActivity.appInfo.uid)
: null;
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 95f0ffec7828..45b164090dd4 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -17,7 +17,7 @@
package com.android.server.am;
import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
+import static android.app.ActivityTaskManager.INVALID_STACK_ID;
import static android.app.ActivityManager.TaskDescription.ATTR_TASKDESCRIPTION_PREFIX;
import static android.app.ActivityOptions.ANIM_CLIP_REVEAL;
import static android.app.ActivityOptions.ANIM_CUSTOM;
@@ -236,7 +236,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
private static final String ATTR_COMPONENTSPECIFIED = "component_specified";
static final String ACTIVITY_ICON_SUFFIX = "_activity_icon_";
- final ActivityManagerService service; // owner
+ final ActivityTaskManagerService service; // owner
final IApplicationToken.Stub appToken; // window manager token
AppWindowContainerController mWindowContainerController;
final ActivityInfo info; // all about me
@@ -295,7 +295,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
AppTimeTracker appTimeTracker; // set if we are tracking the time in this app/task/activity
HashSet<ConnectionRecord> connections; // All ConnectionRecord we hold
UriPermissionOwner uriPermissions; // current special URI access perms.
- ProcessRecord app; // if non-null, hosting application
+ WindowProcessController app; // if non-null, hosting application
private ActivityState mState; // current state we are in
Bundle icicle; // last saved activity state
PersistableBundle persistentState; // last persistently saved activity state
@@ -635,7 +635,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
private void scheduleActivityMovedToDisplay(int displayId, Configuration config) {
- if (app == null || app.thread == null) {
+ if (!attachedToProcess()) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.w(TAG,
"Can't report activity moved to display - client not running, activityRecord="
+ this + ", displayId=" + displayId);
@@ -646,7 +646,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
"Reporting activity moved to display" + ", activityRecord=" + this
+ ", displayId=" + displayId + ", config=" + config);
- service.getLifecycleManager().scheduleTransaction(app.thread, appToken,
+ service.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
MoveToDisplayItem.obtain(displayId, config));
} catch (RemoteException e) {
// If process died, whatever.
@@ -654,7 +654,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
private void scheduleConfigurationChanged(Configuration config) {
- if (app == null || app.thread == null) {
+ if (!attachedToProcess()) {
if (DEBUG_CONFIGURATION) Slog.w(TAG,
"Can't report activity configuration update - client not running"
+ ", activityRecord=" + this);
@@ -664,7 +664,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + this + ", config: "
+ config);
- service.getLifecycleManager().scheduleTransaction(app.thread, appToken,
+ service.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
ActivityConfigurationChangeItem.obtain(config));
} catch (RemoteException e) {
// If process died, whatever.
@@ -672,7 +672,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
void updateMultiWindowMode() {
- if (task == null || task.getStack() == null || app == null || app.thread == null) {
+ if (task == null || task.getStack() == null || !attachedToProcess()) {
return;
}
@@ -691,16 +691,15 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
private void scheduleMultiWindowModeChanged(Configuration overrideConfig) {
try {
- service.getLifecycleManager().scheduleTransaction(app.thread, appToken,
- MultiWindowModeChangeItem.obtain(mLastReportedMultiWindowMode,
- overrideConfig));
+ service.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
+ MultiWindowModeChangeItem.obtain(mLastReportedMultiWindowMode, overrideConfig));
} catch (Exception e) {
// If process died, I don't care.
}
}
void updatePictureInPictureMode(Rect targetStackBounds, boolean forceUpdate) {
- if (task == null || task.getStack() == null || app == null || app.thread == null) {
+ if (task == null || task.getStack() == null || !attachedToProcess()) {
return;
}
@@ -719,7 +718,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
private void schedulePictureInPictureModeChanged(Configuration overrideConfig) {
try {
- service.getLifecycleManager().scheduleTransaction(app.thread, appToken,
+ service.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
PipModeChangeItem.obtain(mLastReportedPictureInPictureMode,
overrideConfig));
} catch (Exception e) {
@@ -883,7 +882,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
}
- ActivityRecord(ActivityManagerService _service, ProcessRecord _caller, int _launchedFromPid,
+ ActivityRecord(ActivityTaskManagerService _service, ProcessRecord _caller, int _launchedFromPid,
int _launchedFromUid, String _launchedFromPackage, Intent _intent, String _resolvedType,
ActivityInfo aInfo, Configuration _configuration,
ActivityRecord _resultTo, String _resultWho, int _reqCode,
@@ -1024,7 +1023,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
mPerf = new BoostFramework();
}
- void setProcess(ProcessRecord proc) {
+ void setProcess(WindowProcessController proc) {
app = proc;
final ActivityRecord root = task != null ? task.getRootActivity() : null;
if (root == this) {
@@ -1032,6 +1031,14 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
}
+ boolean hasProcess() {
+ return app != null;
+ }
+
+ boolean attachedToProcess() {
+ return hasProcess() && app.hasThread();
+ }
+
AppWindowContainerController getWindowContainerController() {
return mWindowContainerController;
}
@@ -1150,7 +1157,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
* @return whether the given package name can launch an assist activity.
*/
private boolean canLaunchAssistActivity(String packageName) {
- final ComponentName assistComponent = service.mActiveVoiceInteractionServiceComponent;
+ final ComponentName assistComponent =
+ service.mActiveVoiceInteractionServiceComponent;
if (assistComponent != null) {
return assistComponent.getPackageName().equals(packageName);
}
@@ -1170,8 +1178,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// We only allow home activities to be resizeable if they explicitly requested it.
info.resizeMode = RESIZE_MODE_UNRESIZEABLE;
}
- } else if (realActivity.getClassName().contains(LEGACY_RECENTS_PACKAGE_NAME) ||
- service.getRecentTasks().isRecentsComponent(realActivity, appInfo.uid)) {
+ } else if (realActivity.getClassName().contains(LEGACY_RECENTS_PACKAGE_NAME)
+ || service.getRecentTasks().isRecentsComponent(realActivity, appInfo.uid)) {
activityType = ACTIVITY_TYPE_RECENTS;
} else if (options != null && options.getLaunchActivityType() == ACTIVITY_TYPE_ASSISTANT
&& canLaunchAssistActivity(launchedFromPackage)) {
@@ -1332,7 +1340,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
boolean isKeyguardLocked = service.isKeyguardLocked();
- boolean isCurrentAppLocked = service.getLockTaskModeState() != LOCK_TASK_MODE_NONE;
+ boolean isCurrentAppLocked =
+ service.getLockTaskModeState() != LOCK_TASK_MODE_NONE;
final ActivityDisplay display = getDisplay();
boolean hasPinnedStack = display != null && display.hasPinnedStack();
// Don't return early if !isNotLocked, since we want to throw an exception if the activity
@@ -1373,13 +1382,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
* @return Whether AppOps allows this package to enter picture-in-picture.
*/
private boolean checkEnterPictureInPictureAppOpsState() {
- try {
- return service.getAppOpsService().checkOperation(OP_PICTURE_IN_PICTURE,
- appInfo.uid, packageName) == MODE_ALLOWED;
- } catch (RemoteException e) {
- // Local call
- }
- return false;
+ return service.getAppOpsService().checkOperation(
+ OP_PICTURE_IN_PICTURE, appInfo.uid, packageName) == MODE_ALLOWED;
}
boolean isAlwaysFocusable() {
@@ -1405,13 +1409,13 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
if (service != null) {
- service.mTaskChangeNotificationController.notifyTaskStackChanged();
+ service.getTaskChangeNotificationController().notifyTaskStackChanged();
}
}
UriPermissionOwner getUriPermissionsLocked() {
if (uriPermissions == null) {
- uriPermissions = new UriPermissionOwner(service, this);
+ uriPermissions = new UriPermissionOwner(service.mAm, this);
}
return uriPermissions;
}
@@ -1463,7 +1467,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
*/
final void deliverNewIntentLocked(int callingUid, Intent intent, String referrer) {
// The activity now gets access to the data associated with this Intent.
- service.grantUriPermissionFromIntentLocked(callingUid, packageName,
+ service.mAm.grantUriPermissionFromIntentLocked(callingUid, packageName,
intent, getUriPermissionsLocked(), userId);
final ReferrerIntent rintent = new ReferrerIntent(intent, referrer);
boolean unsent = true;
@@ -1473,13 +1477,13 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// - It is currently resumed or paused. i.e. it is currently visible to the user and we want
// the user to see the visual effects caused by the intent delivery now.
// - The device is sleeping and it is the top activity behind the lock screen (b/6700897).
- if ((mState == RESUMED || mState == PAUSED
- || isTopActivityWhileSleeping) && app != null && app.thread != null) {
+ if ((mState == RESUMED || mState == PAUSED || isTopActivityWhileSleeping)
+ && attachedToProcess()) {
try {
ArrayList<ReferrerIntent> ar = new ArrayList<>(1);
ar.add(rintent);
- service.getLifecycleManager().scheduleTransaction(app.thread, appToken,
- NewIntentItem.obtain(ar, mState == PAUSED));
+ service.getLifecycleManager().scheduleTransaction(
+ app.getThread(), appToken, NewIntentItem.obtain(ar, mState == PAUSED));
unsent = false;
} catch (RemoteException e) {
Slog.w(TAG, "Exception thrown sending new intent to " + this, e);
@@ -1782,7 +1786,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
setVisible(true);
sleeping = false;
- app.pendingUiClean = true;
+ app.setPendingUiClean(true);
if (reportToClient) {
makeClientVisible();
} else {
@@ -1802,13 +1806,13 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
void makeClientVisible() {
mClientVisibilityDeferred = false;
try {
- service.getLifecycleManager().scheduleTransaction(app.thread, appToken,
+ service.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
WindowVisibilityItem.obtain(true /* showWindow */));
if (shouldPauseWhenBecomingVisible()) {
// An activity must be in the {@link PAUSING} state for the system to validate
// the move to {@link PAUSED}.
setState(PAUSING, "makeVisibleIfNeeded");
- service.getLifecycleManager().scheduleTransaction(app.thread, appToken,
+ service.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
PauseActivityItem.obtain(finishing, false /* userLeaving */,
configChangeFlags, false /* dontReport */));
}
@@ -1854,7 +1858,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
stopFreezingScreenLocked(false);
try {
if (returningOptions != null) {
- app.thread.scheduleOnNewActivityOptions(appToken, returningOptions.toBundle());
+ app.getThread().scheduleOnNewActivityOptions(appToken, returningOptions.toBundle());
}
} catch(RemoteException e) {
}
@@ -1888,8 +1892,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
stopped = false;
if (isActivityTypeHome()) {
- ProcessRecord app = task.mActivities.get(0).app;
- if (app != null && app != service.mHomeProcess) {
+ WindowProcessController app = task.mActivities.get(0).app;
+ if (hasProcess() && app != service.mHomeProcess) {
service.mHomeProcess = app;
}
try {
@@ -1915,8 +1919,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// Mark the point when the activity is resuming
// TODO: To be more accurate, the mark should be before the onCreate,
// not after the onResume. But for subsequent starts, onResume is fine.
- if (app != null) {
- cpuTimeAtResume = service.mProcessCpuTracker.getCpuTimeForPid(app.pid);
+ if (hasProcess()) {
+ cpuTimeAtResume = app.getCpuTime();
} else {
cpuTimeAtResume = 0; // Couldn't get the cpu time of process
}
@@ -2012,15 +2016,15 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// IApplicationToken
- public boolean mayFreezeScreenLocked(ProcessRecord app) {
+ public boolean mayFreezeScreenLocked(WindowProcessController app) {
// Only freeze the screen if this activity is currently attached to
// an application, and that application is not blocked or unresponding.
// In any other case, we can't count on getting the screen unfrozen,
// so it is best to leave as-is.
- return app != null && !app.crashing && !app.notResponding;
+ return hasProcess() && !app.isCrashing() && !app.isNotResponding();
}
- public void startFreezingScreenLocked(ProcessRecord app, int configChanges) {
+ public void startFreezingScreenLocked(WindowProcessController app, int configChanges) {
if (mayFreezeScreenLocked(app)) {
mWindowContainerController.startFreezingScreen(configChanges);
}
@@ -2126,7 +2130,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
@Override
public void onStartingWindowDrawn(long timestamp) {
- synchronized (service) {
+ synchronized (service.mGlobalLock) {
mStackSupervisor.getActivityMetricsLogger().notifyStartingWindowDrawn(
getWindowingMode(), timestamp);
}
@@ -2134,7 +2138,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
@Override
public void onWindowsDrawn(long timestamp) {
- synchronized (service) {
+ synchronized (service.mGlobalLock) {
mStackSupervisor.getActivityMetricsLogger().notifyWindowsDrawn(getWindowingMode(),
timestamp);
if (displayStartTime != 0) {
@@ -2151,7 +2155,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
@Override
public void onWindowsVisible() {
- synchronized (service) {
+ synchronized (service.mGlobalLock) {
mStackSupervisor.reportActivityVisibleLocked(this);
if (DEBUG_SWITCH) Log.v(TAG_SWITCH, "windowsVisibleLocked(): " + this);
if (!nowVisible) {
@@ -2179,14 +2183,14 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
mStackSupervisor.processStoppingActivitiesLocked(null /* idleActivity */,
false /* remove */, true /* processPausingActivities */);
}
- service.scheduleAppGcsLocked();
+ service.mAm.scheduleAppGcsLocked();
}
}
}
@Override
public void onWindowsGone() {
- synchronized (service) {
+ synchronized (service.mGlobalLock) {
if (DEBUG_SWITCH) Log.v(TAG_SWITCH, "windowsGone(): " + this);
nowVisible = false;
launching = false;
@@ -2196,20 +2200,22 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
@Override
public boolean keyDispatchingTimedOut(String reason, int windowPid) {
ActivityRecord anrActivity;
- ProcessRecord anrApp;
+ WindowProcessController anrApp;
boolean windowFromSameProcessAsActivity;
- synchronized (service) {
+ synchronized (service.mGlobalLock) {
anrActivity = getWaitingHistoryRecordLocked();
anrApp = app;
windowFromSameProcessAsActivity =
- app == null || app.pid == windowPid || windowPid == -1;
+ !hasProcess() || app.getPid() == windowPid || windowPid == -1;
}
if (windowFromSameProcessAsActivity) {
- return service.inputDispatchingTimedOut(anrApp, anrActivity, this, false, reason);
+ return service.mAm.inputDispatchingTimedOut(
+ (ProcessRecord) anrApp.mOwner, anrActivity, this, false, reason);
} else {
// In this case another process added windows using this activity token. So, we call the
// generic service input dispatch timed out method so that the right process is blamed.
- return service.inputDispatchingTimedOut(windowPid, false /* aboveSystem */, reason) < 0;
+ return service.mAm.inputDispatchingTimedOut(
+ windowPid, false /* aboveSystem */, reason) < 0;
}
}
@@ -2242,7 +2248,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
return (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0
|| (mStackSupervisor.isCurrentProfileLocked(userId)
- && service.mUserController.isUserRunning(userId, 0 /* flags */));
+ && service.mAmInternal.isUserRunning(userId, 0 /* flags */));
}
/**
@@ -2261,9 +2267,9 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
if (!force && sleeping == _sleeping) {
return;
}
- if (app != null && app.thread != null) {
+ if (attachedToProcess()) {
try {
- app.thread.scheduleSleeping(appToken, _sleeping);
+ app.getThread().scheduleSleeping(appToken, _sleeping);
if (_sleeping && !mStackSupervisor.mGoingToSleepActivities.contains(this)) {
mStackSupervisor.mGoingToSleepActivities.add(this);
}
@@ -2312,7 +2318,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
final boolean isDestroyable() {
- if (finishing || app == null) {
+ if (finishing || !hasProcess()) {
// This would be redundant.
return false;
}
@@ -2373,7 +2379,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
final CompatibilityInfo compatInfo =
- service.compatibilityInfoForPackageLocked(info.applicationInfo);
+ service.mAm.compatibilityInfoForPackageLocked(info.applicationInfo);
final boolean shown = mWindowContainerController.addStartingWindow(packageName, theme,
compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags,
prev != null ? prev.appToken : null, newTask, taskSwitch, isProcessRunning(),
@@ -2411,7 +2417,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
}
- service.mTaskChangeNotificationController.notifyActivityRequestedOrientationChanged(
+ service.getTaskChangeNotificationController().notifyActivityRequestedOrientationChanged(
task.taskId, requestedOrientation);
}
@@ -2651,7 +2657,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
// If the activity isn't currently running, just leave the new configuration and it will
// pick that up next time it starts.
- if (app == null || app.thread == null) {
+ if (!attachedToProcess()) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Configuration doesn't matter not running " + this);
stopFreezingScreenLocked(false);
@@ -2672,7 +2678,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
startFreezingScreenLocked(app, globalChanges);
forceNewConfig = false;
preserveWindow &= isResizeOnlyChange(changes);
- if (app == null || app.thread == null) {
+ if (!attachedToProcess()) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Config is destroying non-running " + this);
stack.destroyActivityLocked(this, true, "config");
@@ -2832,7 +2838,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
} else {
lifecycleItem = PauseActivityItem.obtain();
}
- final ClientTransaction transaction = ClientTransaction.obtain(app.thread, appToken);
+ final ClientTransaction transaction = ClientTransaction.obtain(app.getThread(), appToken);
transaction.addCallback(callbackItem);
transaction.setLifecycleStateRequest(lifecycleItem);
service.getLifecycleManager().scheduleTransaction(transaction);
@@ -2849,10 +2855,10 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
results = null;
newIntents = null;
- service.getAppWarningsLocked().onResumeActivity(this);
- service.showAskCompatModeDialogLocked(this);
+ service.mAm.getAppWarningsLocked().onResumeActivity(this);
+ service.mAm.showAskCompatModeDialogLocked(this);
} else {
- service.mHandler.removeMessages(PAUSE_TIMEOUT_MSG, this);
+ service.mAm.mHandler.removeMessages(PAUSE_TIMEOUT_MSG, this);
setState(PAUSED, "relaunchActivityLocked");
}
@@ -2862,11 +2868,11 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
}
private boolean isProcessRunning() {
- ProcessRecord proc = app;
+ WindowProcessController proc = app;
if (proc == null) {
proc = service.mProcessNames.get(processName, info.applicationInfo.uid);
}
- return proc != null && proc.thread != null;
+ return proc != null && proc.hasThread();
}
/**
@@ -2988,7 +2994,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
throw new XmlPullParserException("restoreActivity error intent=" + intent);
}
- final ActivityManagerService service = stackSupervisor.mService;
+ final ActivityTaskManagerService service = stackSupervisor.mService;
final ActivityInfo aInfo = stackSupervisor.resolveActivity(intent, resolvedType, 0, null,
userId, Binder.getCallingUid());
if (aInfo == null) {
@@ -3095,8 +3101,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
proto.write(STATE, mState.toString());
proto.write(VISIBLE, visible);
proto.write(FRONT_OF_TASK, frontOfTask);
- if (app != null) {
- proto.write(PROC_ID, app.pid);
+ if (hasProcess()) {
+ proto.write(PROC_ID, app.getPid());
}
proto.write(TRANSLUCENT, !fullscreen);
proto.end(token);
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 810225b00e8b..b0eb50fcbb52 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -274,7 +274,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// the input bounds right or bottom side minus the width or height divided by this value.
private static final int FIT_WITHIN_BOUNDS_DIVIDER = 3;
- final ActivityManagerService mService;
+ final ActivityTaskManagerService mService;
private final WindowManagerService mWindowManager;
T mWindowContainerController;
@@ -371,9 +371,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
static final int TRANSLUCENT_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6;
private static class ScheduleDestroyArgs {
- final ProcessRecord mOwner;
+ final WindowProcessController mOwner;
final String mReason;
- ScheduleDestroyArgs(ProcessRecord owner, String reason) {
+ ScheduleDestroyArgs(WindowProcessController owner, String reason) {
mOwner = owner;
mReason = reason;
}
@@ -399,8 +399,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// We don't at this point know if the activity is fullscreen,
// so we need to be conservative and assume it isn't.
Slog.w(TAG, "Activity pause timeout for " + r);
- synchronized (mService) {
- if (r.app != null) {
+ synchronized (mService.mGlobalLock) {
+ if (r.hasProcess()) {
mService.logAppTooSlow(r.app, r.pauseTime, "pausing " + r);
}
activityPausedLocked(r.appToken, true);
@@ -408,7 +408,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
} break;
case LAUNCH_TICK_MSG: {
ActivityRecord r = (ActivityRecord)msg.obj;
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
if (r.continueLaunchTickingLocked()) {
mService.logAppTooSlow(r.app, r.launchTickTime, "launching " + r);
}
@@ -419,7 +419,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// We don't at this point know if the activity is fullscreen,
// so we need to be conservative and assume it isn't.
Slog.w(TAG, "Activity destroy timeout for " + r);
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
activityDestroyedLocked(r != null ? r.appToken : null, "destroyTimeout");
}
} break;
@@ -428,7 +428,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// We don't at this point know if the activity is fullscreen,
// so we need to be conservative and assume it isn't.
Slog.w(TAG, "Activity stop timeout for " + r);
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
if (r.isInHistory()) {
r.activityStoppedLocked(null /* icicle */,
null /* persistentState */, null /* description */);
@@ -437,12 +437,12 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
} break;
case DESTROY_ACTIVITIES_MSG: {
ScheduleDestroyArgs args = (ScheduleDestroyArgs)msg.obj;
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
destroyActivitiesLocked(args.mOwner, args.mReason);
}
} break;
case TRANSLUCENT_TIMEOUT_MSG: {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
notifyActivityDrawnLocked(null);
}
} break;
@@ -462,10 +462,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
int windowingMode, int activityType, boolean onTop) {
mStackSupervisor = supervisor;
mService = supervisor.mService;
- mHandler = new ActivityStackHandler(mService.mHandler.getLooper());
+ mHandler = new ActivityStackHandler(supervisor.mLooper);
mWindowManager = mService.mWindowManager;
mStackId = stackId;
- mCurrentUser = mService.mUserController.getCurrentUserId();
+ mCurrentUser = mService.mAmInternal.getCurrentUserId();
mTmpRect2.setEmpty();
// Set display id before setting activity and window type to make sure it won't affect
// stacks on a wrong display.
@@ -511,11 +511,21 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
@Override
public void onConfigurationChanged(Configuration newParentConfig) {
final int prevWindowingMode = getWindowingMode();
+ final boolean prevIsAlwaysOnTop = isAlwaysOnTop();
super.onConfigurationChanged(newParentConfig);
final ActivityDisplay display = getDisplay();
- if (display != null && prevWindowingMode != getWindowingMode()) {
+ if (display == null) {
+ return;
+ }
+ if (prevWindowingMode != getWindowingMode()) {
display.onStackWindowingModeChanged(this);
}
+ if (prevIsAlwaysOnTop != isAlwaysOnTop()) {
+ // Since always on top is only on when the stack is freeform or pinned, the state
+ // can be toggled when the windowing mode changes. We must make sure the stack is
+ // placed properly when always on top state changes.
+ display.positionChildAtTop(this);
+ }
}
@Override
@@ -560,7 +570,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// Looks like we can't launch in split screen mode or the stack we are launching
// doesn't support split-screen mode, go ahead an dismiss split-screen and display a
// warning toast about it.
- mService.mTaskChangeNotificationController.notifyActivityDismissingDockedStack();
+ mService.getTaskChangeNotificationController().notifyActivityDismissingDockedStack();
display.getSplitScreenPrimaryStack().setWindowingMode(WINDOWING_MODE_FULLSCREEN,
false /* animate */, false /* showRecents */,
false /* enteringSplitScreenMode */, true /* deferEnsuringVisibility */);
@@ -581,7 +591,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// Inform the user that they are starting an app that may not work correctly in
// multi-window mode.
final String packageName = topActivity.appInfo.packageName;
- mService.mTaskChangeNotificationController.notifyActivityForcedResizable(
+ mService.getTaskChangeNotificationController().notifyActivityForcedResizable(
topTask.taskId, FORCED_RESIZEABLE_REASON_SPLIT_SCREEN, packageName);
}
@@ -1470,17 +1480,17 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
mStackSupervisor.getLaunchTimeTracker().stopFullyDrawnTraceIfNeeded(getWindowingMode());
- mService.updateCpuStats();
+ mService.mAm.updateCpuStats();
- if (prev.app != null && prev.app.thread != null) {
+ if (prev.attachedToProcess()) {
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueueing pending pause: " + prev);
try {
EventLogTags.writeAmPauseActivity(prev.userId, System.identityHashCode(prev),
prev.shortComponentName, "userLeaving=" + userLeaving);
- mService.updateUsageStats(prev, false);
+ mService.mAm.updateUsageStats(prev, false);
- mService.getLifecycleManager().scheduleTransaction(prev.app.thread, prev.appToken,
- PauseActivityItem.obtain(prev.finishing, userLeaving,
+ mService.getLifecycleManager().scheduleTransaction(prev.app.getThread(),
+ prev.appToken, PauseActivityItem.obtain(prev.finishing, userLeaving,
prev.configChangeFlags, pauseImmediately));
} catch (Exception e) {
// Ignore exception, if process died other code will cleanup.
@@ -1582,7 +1592,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Executing finish of activity: " + prev);
prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE, false,
"completedPausedLocked");
- } else if (prev.app != null) {
+ } else if (prev.hasProcess()) {
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueue pending stop if needed: " + prev
+ " wasStopping=" + wasStopping + " visible=" + prev.visible);
if (mStackSupervisor.mActivitiesWaitingForVisibleActivity.remove(prev)) {
@@ -1639,12 +1649,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
if (prev != null) {
prev.resumeKeyDispatchingLocked();
- if (prev.app != null && prev.cpuTimeAtResume > 0
- && mService.mBatteryStatsService.isOnBattery()) {
- long diff = mService.mProcessCpuTracker.getCpuTimeForPid(prev.app.pid)
- - prev.cpuTimeAtResume;
+ if (prev.hasProcess() && prev.cpuTimeAtResume > 0
+ && mService.mAm.mBatteryStatsService.isOnBattery()) {
+ long diff = prev.app.getCpuTime() - prev.cpuTimeAtResume;
if (diff > 0) {
- BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics();
+ BatteryStatsImpl bsi = mService.mAm.mBatteryStatsService.getActiveStatistics();
synchronized (bsi) {
BatteryStatsImpl.Uid.Proc ps =
bsi.getProcessStatsLocked(prev.info.applicationInfo.uid,
@@ -1664,7 +1673,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
boolean hasPinnedStack = getDisplay() != null && getDisplay().hasPinnedStack();
if (mStackSupervisor.mAppVisibilitiesChangedSinceLastPause
|| hasPinnedStack) {
- mService.mTaskChangeNotificationController.notifyTaskStackChanged();
+ mService.getTaskChangeNotificationController().notifyTaskStackChanged();
mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = false;
}
@@ -1674,6 +1683,16 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
void addToStopping(ActivityRecord r, boolean scheduleIdle, boolean idleDelayed) {
if (!mStackSupervisor.mStoppingActivities.contains(r)) {
mStackSupervisor.mStoppingActivities.add(r);
+
+ // Some activity is waiting for another activity to become visible before it's being
+ // stopped, which means that we also want to wait with stopping this one to avoid
+ // flickers.
+ if (!mStackSupervisor.mActivitiesWaitingForVisibleActivity.isEmpty()
+ && !mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(r)) {
+ if (DEBUG_SWITCH) Slog.i(TAG_SWITCH, "adding to waiting visible activity=" + r
+ + " existing=" + mStackSupervisor.mActivitiesWaitingForVisibleActivity);
+ mStackSupervisor.mActivitiesWaitingForVisibleActivity.add(r);
+ }
}
// If we already have a few activities waiting to stop, then give up
@@ -1924,7 +1943,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
true /* ignoreStopState */);
}
- if (r.app == null || r.app.thread == null) {
+ if (!r.attachedToProcess()) {
if (makeVisibleAndRestartIfNeeded(starting, configChanges, isTop,
resumeNextActivity, r)) {
if (activityNdx >= activities.size()) {
@@ -2156,11 +2175,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
switch (r.getState()) {
case STOPPING:
case STOPPED:
- if (r.app != null && r.app.thread != null) {
+ if (r.attachedToProcess()) {
if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY,
"Scheduling invisibility: " + r);
- mService.getLifecycleManager().scheduleTransaction(r.app.thread, r.appToken,
- WindowVisibilityItem.obtain(false /* showWindow */));
+ mService.getLifecycleManager().scheduleTransaction(r.app.getThread(),
+ r.appToken, WindowVisibilityItem.obtain(false /* showWindow */));
}
// Reset the flag indicating that an app can enter picture-in-picture once the
@@ -2237,9 +2256,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
if (waitingActivity != null) {
mWindowManager.setWindowOpaque(waitingActivity.appToken, false);
- if (waitingActivity.app != null && waitingActivity.app.thread != null) {
+ if (waitingActivity.attachedToProcess()) {
try {
- waitingActivity.app.thread.scheduleTranslucentConversionComplete(
+ waitingActivity.app.getThread().scheduleTranslucentConversionComplete(
waitingActivity.appToken, r != null);
} catch (RemoteException e) {
}
@@ -2348,7 +2367,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
@GuardedBy("mService")
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
- if (!mService.mBooting && !mService.mBooted) {
+ if (!mService.mAm.mBooting && !mService.mAm.mBooted) {
// Not ready yet!
return false;
}
@@ -2408,7 +2427,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// Make sure that the user who owns this activity is started. If not,
// we will just leave it as is because someone should be bringing
// another user's activities to the top of the stack.
- if (!mService.mUserController.hasStartedUserState(next.userId)) {
+ if (!mService.mAmInternal.hasStartedUserState(next.userId)) {
Slog.w(TAG, "Skipping resume of top activity " + next
+ ": user " + next.userId + " is stopped");
if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
@@ -2482,8 +2501,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// at the top of the LRU list, since we know we will be needing it
// very soon and it would be a waste to let it get killed if it
// happens to be sitting towards the end.
- if (next.app != null && next.app.thread != null) {
- mService.updateLruProcessLocked(next.app, true, null);
+ if (next.attachedToProcess()) {
+ next.app.updateProcessInfo(false /* updateServiceConnectionActivities */,
+ true /* updateLru */, true /* activityChange */, false /* updateOomAdj */);
}
if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
if (lastResumed != null) {
@@ -2617,7 +2637,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
mStackSupervisor.mNoAnimActivities.clear();
ActivityStack lastStack = mStackSupervisor.getLastStack();
- if (next.app != null && next.app.thread != null) {
+ if (next.attachedToProcess()) {
if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Resume running: " + next
+ " stopped=" + next.stopped + " visible=" + next.visible);
@@ -2651,16 +2671,16 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
lastStack == null ? null :lastStack.mResumedActivity;
final ActivityState lastState = next.getState();
- mService.updateCpuStats();
+ mService.mAm.updateCpuStats();
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + next
+ " (in existing)");
next.setState(RESUMED, "resumeTopActivityInnerLocked");
- mService.updateLruProcessLocked(next.app, true, null);
+ next.app.updateProcessInfo(false /* updateServiceConnectionActivities */,
+ true /* updateLru */, true /* activityChange */, true /* updateOomAdj */);
updateLRUListLocked(next);
- mService.updateOomAdjLocked();
// Have the window manager re-evaluate the orientation of
// the screen based on the new activity order.
@@ -2702,8 +2722,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
try {
- final ClientTransaction transaction = ClientTransaction.obtain(next.app.thread,
- next.appToken);
+ final ClientTransaction transaction =
+ ClientTransaction.obtain(next.app.getThread(), next.appToken);
// Deliver all pending results.
ArrayList<ResultInfo> a = next.results;
if (a != null) {
@@ -2729,13 +2749,12 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
next.shortComponentName);
next.sleeping = false;
- mService.getAppWarningsLocked().onResumeActivity(next);
- mService.showAskCompatModeDialogLocked(next);
- next.app.pendingUiClean = true;
- next.app.forceProcessStateUpTo(mService.mTopProcessState);
+ mService.mAm.getAppWarningsLocked().onResumeActivity(next);
+ mService.mAm.showAskCompatModeDialogLocked(next);
+ next.app.setPendingUiCleanAndForceProcessStateUpTo(mService.mTopProcessState);
next.clearOptionsLocked();
transaction.setLifecycleStateRequest(
- ResumeActivityItem.obtain(next.app.repProcState,
+ ResumeActivityItem.obtain(next.app.getReportedProcState(),
mService.isNextTransitionForward()));
mService.getLifecycleManager().scheduleTransaction(transaction);
@@ -2858,7 +2877,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
/**
* Used from {@link ActivityStack#positionTask(TaskRecord, int)}.
- * @see ActivityManagerService#positionTaskInStack(int, int, int).
+ * @see ActivityTaskManagerService#positionTaskInStack(int, int, int).
*/
private void insertTaskAtPosition(TaskRecord task, int position) {
if (position >= mTaskHistory.size()) {
@@ -3388,19 +3407,19 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
String resultWho, int requestCode, int resultCode, Intent data) {
if (callingUid > 0) {
- mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
+ mService.mAm.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
data, r.getUriPermissionsLocked(), r.userId);
}
if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r
+ " : who=" + resultWho + " req=" + requestCode
+ " res=" + resultCode + " data=" + data);
- if (mResumedActivity == r && r.app != null && r.app.thread != null) {
+ if (mResumedActivity == r && r.attachedToProcess()) {
try {
ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
list.add(new ResultInfo(resultWho, requestCode,
resultCode, data));
- mService.getLifecycleManager().scheduleTransaction(r.app.thread, r.appToken,
+ mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), r.appToken,
ActivityResultItem.obtain(list));
return;
} catch (Exception e) {
@@ -3515,7 +3534,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
}
- if (r.app != null && r.app.thread != null) {
+ if (r.attachedToProcess()) {
adjustFocusedActivityStack(r, "stopActivity");
r.resumeKeyDispatchingLocked();
try {
@@ -3541,7 +3560,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
EventLogTags.writeAmStopActivity(
r.userId, System.identityHashCode(r), r.shortComponentName);
- mService.getLifecycleManager().scheduleTransaction(r.app.thread, r.appToken,
+ mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), r.appToken,
StopActivityItem.obtain(r.visible, r.configChangeFlags));
if (shouldSleepOrShutDownActivities()) {
r.setSleeping(true);
@@ -3597,7 +3616,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
}
}
- mService.updateOomAdjLocked();
+ mService.updateOomAdj();
}
/**
@@ -3608,7 +3627,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
* @return The task that was finished in this stack, {@code null} if top running activity does
* not belong to the crashed app.
*/
- final TaskRecord finishTopCrashedActivityLocked(ProcessRecord app, String reason) {
+ final TaskRecord finishTopCrashedActivityLocked(WindowProcessController app, String reason) {
ActivityRecord r = topRunningActivityLocked();
TaskRecord finishedTask = null;
if (r == null || r.app != app) {
@@ -3668,13 +3687,12 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// Check if any of the activities are using voice
for (int activityNdx = tr.mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
ActivityRecord r = tr.mActivities.get(activityNdx);
- if (r.voiceSession != null
- && r.voiceSession.asBinder() == sessionBinder) {
+ if (r.voiceSession != null && r.voiceSession.asBinder() == sessionBinder) {
// Inform of cancellation
r.clearVoiceSessionLocked();
try {
- r.app.thread.scheduleLocalVoiceInteractionStarted((IBinder) r.appToken,
- null);
+ r.app.getThread().scheduleLocalVoiceInteractionStarted(
+ r.appToken, null);
} catch (RemoteException re) {
// Ok
}
@@ -3686,7 +3704,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
if (didOne) {
- mService.updateOomAdjLocked();
+ mService.updateOomAdj();
}
}
@@ -3715,12 +3733,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
}
if (r.info.applicationInfo.uid > 0) {
- mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid,
+ mService.mAm.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid,
resultTo.packageName, resultData,
resultTo.getUriPermissionsLocked(), resultTo.userId);
}
- resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode,
- resultData);
+ resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, resultData);
r.resultTo = null;
}
else if (DEBUG_RESULTS) Slog.v(TAG_RESULTS, "No result destination from " + r);
@@ -3785,7 +3802,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
if (DEBUG_VISIBILITY || DEBUG_TRANSITION) Slog.v(TAG_TRANSITION,
"Prepare close transition: finishing " + r);
if (endTask) {
- mService.mTaskChangeNotificationController.notifyTaskRemovalStarted(
+ mService.getTaskChangeNotificationController().notifyTaskRemovalStarted(
task.taskId);
}
mWindowManager.prepareAppTransition(transit, false);
@@ -3876,7 +3893,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
"Moving to STOPPING: "+ r + " (finish requested)");
r.setState(STOPPING, "finishCurrentActivityLocked");
if (oomAdj) {
- mService.updateOomAdjLocked();
+ mService.updateOomAdj();
}
return r;
}
@@ -4019,6 +4036,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
}
+ // TODO: There is a dup. of this block of code in ActivityTaskManagerService.finishActivity
+ // We should consolidate.
IActivityController controller = mService.mController;
if (controller != null) {
ActivityRecord next = topRunningActivityLocked(srec.appToken, 0);
@@ -4063,7 +4082,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// TODO(b/64750076): Check if calling pid should really be -1.
final int res = mService.getActivityStartController()
.obtainStarter(destIntent, "navigateUpTo")
- .setCaller(srec.app.thread)
+ .setCaller(srec.app.getThread())
.setActivityInfo(aInfo)
.setResultTo(parent.appToken)
.setCallingPid(-1)
@@ -4137,7 +4156,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
for (WeakReference<PendingIntentRecord> apr : r.pendingResults) {
PendingIntentRecord rec = apr.get();
if (rec != null) {
- mService.cancelIntentSenderLocked(rec, false);
+ mService.mAm.cancelIntentSenderLocked(rec, false);
}
}
r.pendingResults = null;
@@ -4224,19 +4243,19 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
Iterator<ConnectionRecord> it = r.connections.iterator();
while (it.hasNext()) {
ConnectionRecord c = it.next();
- mService.mServices.removeConnectionLocked(c, null, r);
+ mService.mAm.mServices.removeConnectionLocked(c, null, r);
}
r.connections = null;
}
}
- final void scheduleDestroyActivities(ProcessRecord owner, String reason) {
+ final void scheduleDestroyActivities(WindowProcessController owner, String reason) {
Message msg = mHandler.obtainMessage(DESTROY_ACTIVITIES_MSG);
msg.obj = new ScheduleDestroyArgs(owner, reason);
mHandler.sendMessage(msg);
}
- private void destroyActivitiesLocked(ProcessRecord owner, String reason) {
+ private void destroyActivitiesLocked(WindowProcessController owner, String reason) {
boolean lastIsOpaque = false;
boolean activityRemoved = false;
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
@@ -4281,7 +4300,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
return false;
}
- final int releaseSomeActivitiesLocked(ProcessRecord app, ArraySet<TaskRecord> tasks,
+ final int releaseSomeActivitiesLocked(WindowProcessController app, ArraySet<TaskRecord> tasks,
String reason) {
// Iterate over tasks starting at the back (oldest) first.
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Trying to release some activities in " + app);
@@ -4335,7 +4354,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
final boolean destroyActivityLocked(ActivityRecord r, boolean removeFromApp, String reason) {
if (DEBUG_SWITCH || DEBUG_CLEANUP) Slog.v(TAG_SWITCH,
"Removing activity from " + reason + ": token=" + r
- + ", app=" + (r.app != null ? r.app.processName : "(null)"));
+ + ", app=" + (r.hasProcess() ? r.app.mName : "(null)"));
if (r.isState(DESTROYING, DESTROYED)) {
if (DEBUG_STATES) Slog.v(TAG_STATES, "activity " + r + " already destroying."
@@ -4351,23 +4370,23 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
cleanUpActivityLocked(r, false, false);
- final boolean hadApp = r.app != null;
+ final boolean hadApp = r.hasProcess();
if (hadApp) {
if (removeFromApp) {
- r.app.activities.remove(r);
- if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
- mService.mHeavyWeightProcess = null;
- mService.mHandler.sendEmptyMessage(
+ r.app.removeActivity(r);
+ if (mService.mAm.mHeavyWeightProcess != null
+ && mService.mAm.mHeavyWeightProcess.getWindowProcessController() == r.app
+ && !r.app.hasActivities()) {
+ mService.mAm.mHeavyWeightProcess = null;
+ mService.mAm.mHandler.sendEmptyMessage(
ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
}
- if (r.app.activities.isEmpty()) {
+ if (!r.app.hasActivities()) {
// Update any services we are bound to that might care about whether
// their client may have activities.
- mService.mServices.updateServiceConnectionActivitiesLocked(r.app);
// No longer have activities, so update LRU list and oom adj.
- mService.updateLruProcessLocked(r.app, false, null);
- mService.updateOomAdjLocked();
+ r.app.updateProcessInfo(true, true, false, true);
}
}
@@ -4375,7 +4394,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
try {
if (DEBUG_SWITCH) Slog.i(TAG_SWITCH, "Destroying: " + r);
- mService.getLifecycleManager().scheduleTransaction(r.app.thread, r.appToken,
+ mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), r.appToken,
DestroyActivityItem.obtain(r.finishing, r.configChangeFlags));
} catch (Exception e) {
// We can just ignore exceptions here... if the process
@@ -4466,7 +4485,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
private void removeHistoryRecordsForAppLocked(ArrayList<ActivityRecord> list,
- ProcessRecord app, String listName) {
+ WindowProcessController app, String listName) {
int i = list.size();
if (DEBUG_CLEANUP) Slog.v(TAG_CLEANUP,
"Removing app " + app + " from list " + listName + " with " + i + " entries");
@@ -4482,7 +4501,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
}
- private boolean removeHistoryRecordsForAppLocked(ProcessRecord app) {
+ private boolean removeHistoryRecordsForAppLocked(WindowProcessController app) {
removeHistoryRecordsForAppLocked(mLRUActivities, app, "mLRUActivities");
removeHistoryRecordsForAppLocked(mStackSupervisor.mStoppingActivities, app,
"mStoppingActivities");
@@ -4545,7 +4564,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
r.getTask().taskId, r.shortComponentName,
"proc died without state saved");
if (r.getState() == RESUMED) {
- mService.updateUsageStats(r, false);
+ mService.mAm.updateUsageStats(r, false);
}
}
} else {
@@ -4691,7 +4710,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
mStackSupervisor.resumeFocusedStackTopActivityLocked();
EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, tr.userId, tr.taskId);
- mService.mTaskChangeNotificationController.notifyTaskMovedToFront(tr.taskId);
+ mService.getTaskChangeNotificationController().notifyTaskMovedToFront(tr.taskId);
} finally {
getDisplay().continueUpdateImeTarget();
}
@@ -4813,8 +4832,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// TODO: Figure-out a way to consolidate with resize() method below.
@Override
public void requestResize(Rect bounds) {
- mService.resizeStack(mStackId, bounds, true /* allowResizeInDockedMode */,
- false /* preserveWindows */, false /* animate */, -1 /* animationDuration */);
+ mService.resizeStack(mStackId, bounds,
+ true /* allowResizeInDockedMode */, false /* preserveWindows */,
+ false /* animate */, -1 /* animationDuration */);
}
// TODO: Can only be called from special methods in ActivityStackSupervisor.
@@ -4955,7 +4975,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
|| (packageName == null && r.userId == userId);
if ((userId == UserHandle.USER_ALL || r.userId == userId)
&& (sameComponent || r.getTask() == lastTask)
- && (r.app == null || evenPersistent || !r.app.persistent)) {
+ && (r.app == null || evenPersistent || !r.app.isPersistent())) {
if (!doit) {
if (r.finishing) {
// If this activity is just finishing, then it is not
@@ -4975,8 +4995,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
didSomething = true;
Slog.i(TAG, " Force finishing activity " + r);
if (sameComponent) {
- if (r.app != null) {
- r.app.removed = true;
+ if (r.hasProcess()) {
+ r.app.setRemoved(true);
}
r.app = null;
}
@@ -5047,7 +5067,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
* @param app The app of the activity that died.
* @return result from removeHistoryRecordsForAppLocked.
*/
- boolean handleAppDiedLocked(ProcessRecord app) {
+ boolean handleAppDiedLocked(WindowProcessController app) {
if (mPausingActivity != null && mPausingActivity.app == app) {
if (DEBUG_PAUSE || DEBUG_CLEANUP) Slog.v(TAG_PAUSE,
"App died while pausing: " + mPausingActivity);
@@ -5061,7 +5081,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
return removeHistoryRecordsForAppLocked(app);
}
- void handleAppCrashLocked(ProcessRecord app) {
+ void handleAppCrashLocked(WindowProcessController app) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
@@ -5221,7 +5241,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
// Notify if a task from the pinned stack is being removed (or moved depending on the mode)
if (inPinnedWindowingMode()) {
- mService.mTaskChangeNotificationController.notifyActivityUnpinned();
+ mService.getTaskChangeNotificationController().notifyActivityUnpinned();
}
}
@@ -5339,6 +5359,20 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
}
+ public void setAlwaysOnTop(boolean alwaysOnTop) {
+ if (isAlwaysOnTop() == alwaysOnTop) {
+ return;
+ }
+ super.setAlwaysOnTop(alwaysOnTop);
+ final ActivityDisplay display = getDisplay();
+ // positionChildAtTop() must be called even when always on top gets turned off because we
+ // need to make sure that the stack is moved from among always on top windows to below other
+ // always on top windows. Since the position the stack should be inserted into is calculated
+ // properly in {@link ActivityDisplay#getTopInsertPosition()} in both cases, we can just
+ // request that the stack is put at top here.
+ display.positionChildAtTop(this);
+ }
+
void moveToFrontAndResumeStateIfNeeded(ActivityRecord r, boolean moveToFront, boolean setResume,
boolean setPause, String reason) {
if (!moveToFront) {
@@ -5402,7 +5436,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
}
boolean shouldSleepOrShutDownActivities() {
- return shouldSleepActivities() || mService.isShuttingDownLocked();
+ return shouldSleepActivities() || mService.mShuttingDown;
}
public void writeToProto(ProtoOutputStream proto, long fieldId) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 8d5a01c93000..f2a38e19d1ac 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -24,7 +24,7 @@ import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
import static android.app.ActivityManager.START_DELIVERED_TO_TOP;
import static android.app.ActivityManager.START_TASK_TO_FRONT;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
+import static android.app.ActivityTaskManager.INVALID_STACK_ID;
import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY;
import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SPLIT_SCREEN;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
@@ -51,7 +51,6 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.Display.TYPE_VIRTUAL;
-import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_PICTURE_IN_PICTURE_EXPANDED_TO_FULLSCREEN;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IDLE;
@@ -110,7 +109,9 @@ import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.StackInfo;
-import android.app.ActivityManagerInternal.SleepToken;
+import android.app.ActivityManagerInternal;
+import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.server.wm.ActivityTaskManagerInternal.SleepToken;
import android.app.ActivityOptions;
import android.app.AppOpsManager;
import android.app.ProfilerInfo;
@@ -310,7 +311,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
/** The number of distinct task ids that can be assigned to the tasks of a single user */
private static final int MAX_TASK_IDS_PER_USER = UserHandle.PER_USER_RANGE;
- final ActivityManagerService mService;
+ ActivityTaskManagerService mService;
/** The historial list of recent tasks including inactive tasks */
RecentTasks mRecentTasks;
@@ -586,21 +587,21 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
final ActivityRecord sourceRecord;
final int startFlags;
final ActivityStack stack;
- final ProcessRecord callerApp;
+ final WindowProcessController callerApp;
PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord,
- int _startFlags, ActivityStack _stack, ProcessRecord _callerApp) {
+ int _startFlags, ActivityStack _stack, WindowProcessController app) {
r = _r;
sourceRecord = _sourceRecord;
startFlags = _startFlags;
stack = _stack;
- callerApp = _callerApp;
+ callerApp = app;
}
void sendErrorResult(String message) {
try {
- if (callerApp.thread != null) {
- callerApp.thread.scheduleCrash(message);
+ if (callerApp.hasThread()) {
+ callerApp.getThread().scheduleCrash(message);
}
} catch (RemoteException e) {
Slog.e(TAG, "Exception scheduling crash of failed "
@@ -609,12 +610,17 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
- public ActivityStackSupervisor(ActivityManagerService service, Looper looper) {
+ public ActivityStackSupervisor(ActivityTaskManagerService service, Looper looper) {
mService = service;
mLooper = looper;
mHandler = new ActivityStackSupervisorHandler(looper);
}
+ @VisibleForTesting
+ void setService(ActivityTaskManagerService service) {
+ mService = service;
+ }
+
public void initialize() {
if (mInitialized) {
return;
@@ -622,8 +628,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
mInitialized = true;
mRunningTasks = createRunningTasks();
- mActivityMetricsLogger = new ActivityMetricsLogger(this, mService.mContext,
- mHandler.getLooper());
+ mActivityMetricsLogger = new ActivityMetricsLogger(this, mService.mContext, mHandler.getLooper());
mKeyguardController = new KeyguardController(mService, this);
mLaunchParamsController = new LaunchParamsController(mService);
@@ -666,26 +671,24 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
void setWindowManager(WindowManagerService wm) {
- synchronized (mService) {
- mWindowManager = wm;
- getKeyguardController().setWindowManager(wm);
+ mWindowManager = wm;
+ getKeyguardController().setWindowManager(wm);
- mDisplayManager =
- (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
- mDisplayManager.registerDisplayListener(this, null);
- mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
+ mDisplayManager =
+ (DisplayManager) mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
+ mDisplayManager.registerDisplayListener(this, null);
+ mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
- Display[] displays = mDisplayManager.getDisplays();
- for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) {
- final Display display = displays[displayNdx];
- ActivityDisplay activityDisplay = new ActivityDisplay(this, display);
- mActivityDisplays.put(display.getDisplayId(), activityDisplay);
- calculateDefaultMinimalSizeOfResizeableTasks(activityDisplay);
- }
-
- mHomeStack = mFocusedStack = mLastFocusedStack = getDefaultDisplay().getOrCreateStack(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
+ Display[] displays = mDisplayManager.getDisplays();
+ for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) {
+ final Display display = displays[displayNdx];
+ ActivityDisplay activityDisplay = new ActivityDisplay(this, display);
+ mActivityDisplays.put(display.getDisplayId(), activityDisplay);
+ calculateDefaultMinimalSizeOfResizeableTasks(activityDisplay);
}
+
+ mHomeStack = mFocusedStack = mLastFocusedStack = getDefaultDisplay().getOrCreateStack(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
}
ActivityStack getFocusedStack() {
@@ -713,6 +716,11 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
if (!focusCandidate.isFocusable()) {
// The focus candidate isn't focusable. Move focus to the top stack that is focusable.
focusCandidate = getNextFocusableStackLocked(focusCandidate, false /* ignoreCurrent */);
+ if (focusCandidate == null) {
+ Slog.w(TAG,
+ "setFocusStackUnchecked: No focusable stack found, focus home as default");
+ focusCandidate = mHomeStack;
+ }
}
if (focusCandidate != mFocusedStack) {
@@ -725,7 +733,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
final ActivityRecord r = topRunningActivityLocked();
- if (mService.mBooting || !mService.mBooted) {
+ if (mService.mAm.mBooting || !mService.mAm.mBooted) {
if (r != null && r.idle) {
checkFinishBootingLocked();
}
@@ -757,7 +765,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
boolean resumeHomeStackTask(ActivityRecord prev, String reason) {
- if (!mService.mBooting && !mService.mBooted) {
+ if (!mService.mAm.mBooting && !mService.mAm.mBooted) {
// Not ready yet!
return false;
}
@@ -771,7 +779,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
moveFocusableActivityStackToFrontLocked(r, myReason);
return resumeFocusedStackTopActivityLocked(mHomeStack, prev, null);
}
- return mService.startHomeActivityLocked(mCurrentUser, myReason);
+ return mService.mAm.startHomeActivityLocked(mCurrentUser, myReason);
}
TaskRecord anyTaskForIdLocked(int id) {
@@ -909,7 +917,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// result to an activity belonging to userId. Example case: a document
// picker for personal files, opened by a work app, should still get locked.
if (taskTopActivityIsUser(task, userId)) {
- mService.mTaskChangeNotificationController.notifyTaskProfileLocked(
+ mService.getTaskChangeNotificationController().notifyTaskProfileLocked(
task.taskId, userId);
}
}
@@ -1164,7 +1172,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
if (changed) {
- mService.notifyAll();
+ mService.mGlobalLock.notifyAll();
}
}
@@ -1194,7 +1202,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
if (changed) {
- mService.notifyAll();
+ mService.mGlobalLock.notifyAll();
}
}
@@ -1215,7 +1223,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
if (changed) {
- mService.notifyAll();
+ mService.mGlobalLock.notifyAll();
}
}
@@ -1320,19 +1328,19 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Don't debug things in the system process
if (!aInfo.processName.equals("system")) {
if ((startFlags & ActivityManager.START_FLAG_DEBUG) != 0) {
- mService.setDebugApp(aInfo.processName, true, false);
+ mService.mAm.setDebugApp(aInfo.processName, true, false);
}
if ((startFlags & ActivityManager.START_FLAG_NATIVE_DEBUGGING) != 0) {
- mService.setNativeDebuggingAppLocked(aInfo.applicationInfo, aInfo.processName);
+ mService.mAm.setNativeDebuggingAppLocked(aInfo.applicationInfo, aInfo.processName);
}
if ((startFlags & ActivityManager.START_FLAG_TRACK_ALLOCATION) != 0) {
- mService.setTrackAllocationApp(aInfo.applicationInfo, aInfo.processName);
+ mService.mAm.setTrackAllocationApp(aInfo.applicationInfo, aInfo.processName);
}
if (profilerInfo != null) {
- mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo);
+ mService.mAm.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo);
}
}
final String intentLaunchToken = intent.getLaunchToken();
@@ -1345,7 +1353,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags,
int filterCallingUid) {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
try {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "resolveIntent");
int modifiedFlags = flags
@@ -1362,7 +1370,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// (e.g. AMS.startActivityAsUser).
final long token = Binder.clearCallingIdentity();
try {
- return mService.getPackageManagerInternalLocked().resolveIntent(
+ return mService.mAm.getPackageManagerInternalLocked().resolveIntent(
intent, resolvedType, modifiedFlags, userId, true, filterCallingUid);
} finally {
Binder.restoreCallingIdentity(token);
@@ -1398,12 +1406,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
beginDeferResume();
try {
- r.startFreezingScreenLocked(app, 0);
+ final WindowProcessController proc = app.getWindowProcessController();
+ r.startFreezingScreenLocked(proc, 0);
// schedule launch ticks to collect information about slow apps.
r.startLaunchTickingLocked();
- r.setProcess(app);
+ r.setProcess(proc);
if (getKeyguardController().isKeyguardLocked()) {
r.notifyUnknownVisibilityLaunched();
@@ -1447,12 +1456,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r);
- int idx = app.activities.indexOf(r);
- if (idx < 0) {
- app.activities.add(r);
- }
- mService.updateLruProcessLocked(app, true, null);
- mService.updateOomAdjLocked();
+ proc.addActivityIfNeeded(r);
+ proc.updateProcessInfo(false, true, true, true);
final LockTaskController lockTaskController = mService.getLockTaskController();
if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE
@@ -1484,18 +1489,18 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Home process is the root process of the task.
mService.mHomeProcess = task.mActivities.get(0).app;
}
- mService.notifyPackageUse(r.intent.getComponent().getPackageName(),
+ mService.mAm.notifyPackageUse(r.intent.getComponent().getPackageName(),
PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY);
r.sleeping = false;
r.forceNewConfig = false;
- mService.getAppWarningsLocked().onStartActivity(r);
- mService.showAskCompatModeDialogLocked(r);
- r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
+ mService.mAm.getAppWarningsLocked().onStartActivity(r);
+ mService.mAm.showAskCompatModeDialogLocked(r);
+ r.compat = mService.mAm.compatibilityInfoForPackageLocked(r.info.applicationInfo);
ProfilerInfo profilerInfo = null;
- if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
- if (mService.mProfileProc == null || mService.mProfileProc == app) {
- mService.mProfileProc = app;
- ProfilerInfo profilerInfoSvc = mService.mProfilerInfo;
+ if (mService.mAm.mProfileApp != null && mService.mAm.mProfileApp.equals(app.processName)) {
+ if (mService.mAm.mProfileProc == null || mService.mAm.mProfileProc == app) {
+ mService.mAm.mProfileProc = app;
+ ProfilerInfo profilerInfoSvc = mService.mAm.mProfilerInfo;
if (profilerInfoSvc != null && profilerInfoSvc.profileFile != null) {
if (profilerInfoSvc.profileFd != null) {
try {
@@ -1533,9 +1538,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// and override configs.
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
- r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
- r.persistentState, results, newIntents, mService.isNextTransitionForward(),
- profilerInfo));
+ r.launchedFromPackage, task.voiceInteractor, app.getReportedProcState(),
+ r.icicle, r.persistentState, results, newIntents,
+ mService.isNextTransitionForward(), profilerInfo));
// Set desired final state.
final ActivityLifecycleItem lifecycleItem;
@@ -1549,25 +1554,24 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
-
if ((app.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0
- && mService.mHasHeavyWeightFeature) {
+ && mService.mAm.mHasHeavyWeightFeature) {
// This may be a heavy-weight process! Note that the package
// manager will ensure that only activity can run in the main
// process of the .apk, which is the only thing that will be
// considered heavy-weight.
if (app.processName.equals(app.info.packageName)) {
- if (mService.mHeavyWeightProcess != null
- && mService.mHeavyWeightProcess != app) {
+ if (mService.mAm.mHeavyWeightProcess != null
+ && mService.mAm.mHeavyWeightProcess != app) {
Slog.w(TAG, "Starting new heavy weight process " + app
+ " when already running "
- + mService.mHeavyWeightProcess);
+ + mService.mAm.mHeavyWeightProcess);
}
- mService.mHeavyWeightProcess = app;
- Message msg = mService.mHandler.obtainMessage(
+ mService.mAm.mHeavyWeightProcess = app;
+ Message msg = mService.mAm.mHandler.obtainMessage(
ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
msg.obj = r;
- mService.mHandler.sendMessage(msg);
+ mService.mAm.mHandler.sendMessage(msg);
}
}
@@ -1578,7 +1582,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
Slog.e(TAG, "Second failure launching "
+ r.intent.getComponent().flattenToShortString()
+ ", giving up", e);
- mService.appDiedLocked(app);
+ mService.mAm.appDiedLocked(app);
stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
"2nd-crash", false);
return false;
@@ -1587,7 +1591,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// This is the first time we failed -- restart process and
// retry.
r.launchFailed = true;
- app.activities.remove(r);
+ proc.removeActivity(r);
throw e;
}
} finally {
@@ -1625,7 +1629,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Update any services we are bound to that might care about whether
// their client may have activities.
if (r.app != null) {
- mService.mServices.updateServiceConnectionActivitiesLocked(r.app);
+ r.app.updateServiceConnectionActivities();
}
return true;
@@ -1690,7 +1694,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
void startSpecificActivityLocked(ActivityRecord r,
boolean andResume, boolean checkConfig) {
// Is this activity's application already running?
- ProcessRecord app = mService.getProcessRecordLocked(r.processName,
+ ProcessRecord app = mService.mAm.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid, true);
getLaunchTimeTracker().setLaunchTime(r);
@@ -1704,7 +1708,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// part of the framework so doesn't make sense to track as a
// separate apk in the process.
app.addPackage(r.info.packageName, r.info.applicationInfo.longVersionCode,
- mService.mProcessStats);
+ mService.mAm.mProcessStats);
}
realStartActivityLocked(r, app, andResume, checkConfig);
return;
@@ -1717,7 +1721,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// restart the application.
}
- mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
+ mService.mAm.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
@@ -1733,16 +1737,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
|| !resumedActivity.app.equals(targetActivity.app);
}
- if (sendHint && mService.mLocalPowerManager != null) {
- mService.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 1);
+ if (sendHint && mService.mAm.mLocalPowerManager != null) {
+ mService.mAm.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 1);
mPowerHintSent = true;
}
}
void sendPowerHintForLaunchEndIfNeeded() {
// Trigger launch power hint if activity is launched
- if (mPowerHintSent && mService.mLocalPowerManager != null) {
- mService.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 0);
+ if (mPowerHintSent && mService.mAm.mLocalPowerManager != null) {
+ mService.mAm.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 0);
mPowerHintSent = false;
}
}
@@ -1751,8 +1755,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
String resultWho, int requestCode, int callingPid, int callingUid,
String callingPackage, boolean ignoreTargetSecurity, boolean launchingInTask,
ProcessRecord callerApp, ActivityRecord resultRecord, ActivityStack resultStack) {
- final boolean isCallerRecents = mService.getRecentTasks() != null &&
- mService.getRecentTasks().isCallerRecents(callingUid);
+ final boolean isCallerRecents = mService.getRecentTasks() != null
+ && mService.getRecentTasks().isCallerRecents(callingUid);
final int startAnyPerm = mService.checkPermission(START_ANY_ACTIVITY, callingPid,
callingUid);
if (startAnyPerm == PERMISSION_GRANTED || (isCallerRecents && launchingInTask)) {
@@ -1912,7 +1916,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
private int getComponentRestrictionForCallingPackage(ActivityInfo activityInfo,
String callingPackage, int callingPid, int callingUid, boolean ignoreTargetSecurity) {
- if (!ignoreTargetSecurity && mService.checkComponentPermission(activityInfo.permission,
+ if (!ignoreTargetSecurity && mService.mAm.checkComponentPermission(activityInfo.permission,
callingPid, callingUid, activityInfo.applicationInfo.uid, activityInfo.exported)
== PERMISSION_DENIED) {
return ACTIVITY_RESTRICTION_PERMISSION;
@@ -1927,8 +1931,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return ACTIVITY_RESTRICTION_NONE;
}
- if (mService.mAppOpsService.noteOperation(opCode, callingUid,
- callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ if (mService.getAppOpsService().noteOperation(opCode, callingUid, callingPackage)
+ != AppOpsManager.MODE_ALLOWED) {
if (!ignoreTargetSecurity) {
return ACTIVITY_RESTRICTION_APPOP;
}
@@ -1970,8 +1974,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return ACTIVITY_RESTRICTION_NONE;
}
- if (mService.mAppOpsService.noteOperation(opCode, callingUid,
- callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ if (mService.getAppOpsService().noteOperation(opCode, callingUid, callingPackage)
+ != AppOpsManager.MODE_ALLOWED) {
return ACTIVITY_RESTRICTION_APPOP;
}
@@ -1995,19 +1999,19 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
/**
* Called when the frontmost task is idle.
- * @return the state of mService.mBooting before this was called.
+ * @return the state of mService.mAm.mBooting before this was called.
*/
@GuardedBy("mService")
private boolean checkFinishBootingLocked() {
- final boolean booting = mService.mBooting;
+ final boolean booting = mService.mAm.mBooting;
boolean enableScreen = false;
- mService.mBooting = false;
- if (!mService.mBooted) {
- mService.mBooted = true;
+ mService.mAm.mBooting = false;
+ if (!mService.mAm.mBooted) {
+ mService.mAm.mBooted = true;
enableScreen = true;
}
if (booting || enableScreen) {
- mService.postFinishBooting(booting, enableScreen);
+ mService.mAm.postFinishBooting(booting, enableScreen);
}
return booting;
}
@@ -2056,7 +2060,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
if (allResumedActivitiesIdle()) {
if (r != null) {
- mService.scheduleAppGcsLocked();
+ mService.mAm.scheduleAppGcsLocked();
}
if (mLaunchingActivity.isHeld()) {
@@ -2113,12 +2117,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Complete user switch
if (startingUsers != null) {
for (int i = 0; i < startingUsers.size(); i++) {
- mService.mUserController.finishUserSwitch(startingUsers.get(i));
+ mService.mAmInternal.finishUserSwitch(startingUsers.get(i));
}
}
}
- mService.trimApplications();
+ mService.mAmInternal.trimApplications();
//dump();
//mWindowManager.dump();
@@ -2129,7 +2133,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return r;
}
- boolean handleAppDiedLocked(ProcessRecord app) {
+ boolean handleAppDiedLocked(WindowProcessController app) {
boolean hasVisibleActivities = false;
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);
@@ -2192,7 +2196,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// First, found out what is currently the foreground app, so that
// we don't blow away the previous app if this activity is being
// hosted by the process that is actually still the foreground.
- ProcessRecord fgApp = null;
+ WindowProcessController fgApp = null;
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);
for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
@@ -2211,7 +2215,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Now set this one as the previous process, only if that really
// makes sense to.
- if (r.app != null && fgApp != null && r.app != fgApp
+ if (r.hasProcess() && fgApp != null && r.app != fgApp
&& r.lastVisibleTime > mService.mPreviousProcessVisibleTime
&& r.app != mService.mHomeProcess) {
mService.mPreviousProcess = r.app;
@@ -2261,7 +2265,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
* @param reason Reason to perform this action.
* @return The task that was finished in this stack, {@code null} if haven't found any.
*/
- TaskRecord finishTopCrashedActivitiesLocked(ProcessRecord app, String reason) {
+ TaskRecord finishTopCrashedActivitiesLocked(WindowProcessController app, String reason) {
TaskRecord finishedTask = null;
ActivityStack focusedStack = getFocusedStack();
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
@@ -3113,7 +3117,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
// Find any running services associated with this app and stop if needed.
- mService.mServices.cleanUpRemovedTaskLocked(tr, component, new Intent(tr.getBaseIntent()));
+ mService.mAm.mServices.cleanUpRemovedTaskLocked(tr, component, new Intent(tr.getBaseIntent()));
if (!killProcess) {
return;
@@ -3121,14 +3125,15 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Determine if the process(es) for this task should be killed.
final String pkg = component.getPackageName();
- ArrayList<ProcessRecord> procsToKill = new ArrayList<>();
- ArrayMap<String, SparseArray<ProcessRecord>> pmap = mService.mProcessNames.getMap();
+ ArrayList<Object> procsToKill = new ArrayList<>();
+ ArrayMap<String, SparseArray<WindowProcessController>> pmap =
+ mService.mProcessNames.getMap();
for (int i = 0; i < pmap.size(); i++) {
- SparseArray<ProcessRecord> uids = pmap.valueAt(i);
+ SparseArray<WindowProcessController> uids = pmap.valueAt(i);
for (int j = 0; j < uids.size(); j++) {
- ProcessRecord proc = uids.valueAt(j);
- if (proc.userId != tr.userId) {
+ WindowProcessController proc = uids.valueAt(j);
+ if (proc.mUserId != tr.userId) {
// Don't kill process for a different user.
continue;
}
@@ -3136,21 +3141,18 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// Don't kill the home process along with tasks from the same package.
continue;
}
- if (!proc.pkgList.containsKey(pkg)) {
+ if (!proc.mPkgList.contains(pkg)) {
// Don't kill process that is not associated with this task.
continue;
}
- for (int k = 0; k < proc.activities.size(); k++) {
- TaskRecord otherTask = proc.activities.get(k).getTask();
- if (tr.taskId != otherTask.taskId && otherTask.inRecents) {
- // Don't kill process(es) that has an activity in a different task that is
- // also in recents.
- return;
- }
+ if (!proc.shouldKillProcessForRemovedTask(tr)) {
+ // Don't kill process(es) that has an activity in a different task that is also
+ // in recents.
+ return;
}
- if (proc.foregroundServices) {
+ if (proc.hasForegroundServices()) {
// Don't kill process(es) with foreground service.
return;
}
@@ -3160,17 +3162,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
- // Kill the running processes.
- for (int i = 0; i < procsToKill.size(); i++) {
- ProcessRecord pr = procsToKill.get(i);
- if (pr.setSchedGroup == ProcessList.SCHED_GROUP_BACKGROUND
- && pr.curReceivers.isEmpty()) {
- pr.kill("remove task", true);
- } else {
- // We delay killing processes that are not in the background or running a receiver.
- pr.waitingToKill = "remove task";
- }
- }
+ // Kill the running processes. Post on handle since we don't want to hold the service lock
+ // while calling into AM.
+ final Runnable r = PooledLambda.obtainRunnable(
+ ActivityManagerInternal::killProcessesForRemovedTask, mService.mAmInternal,
+ procsToKill);
+ mService.mH.post(r);
}
/**
@@ -3403,7 +3400,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
resumeFocusedStackTopActivityLocked();
- mService.mTaskChangeNotificationController.notifyActivityPinned(r);
+ mService.getTaskChangeNotificationController().notifyActivityPinned(r);
}
/** Move activity with its stack to front and make the stack focused. */
@@ -3545,7 +3542,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
throw new IllegalStateException("Calling must be system uid");
}
mLaunchingActivity.release();
- mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
+ mService.mAm.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
}
}
@@ -3570,7 +3567,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
long timeRemaining = endTime - System.currentTimeMillis();
if (timeRemaining > 0) {
try {
- mService.wait(timeRemaining);
+ mService.mGlobalLock.wait(timeRemaining);
} catch (InterruptedException e) {
}
} else {
@@ -3670,7 +3667,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
mGoingToSleep.release();
}
if (mService.mShuttingDown) {
- mService.notifyAll();
+ mService.mGlobalLock.notifyAll();
}
}
@@ -3698,7 +3695,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
final ActivityStack stack = r.getStack();
if (isFocusedStack(stack)) {
- mService.updateUsageStats(r, true);
+ mService.mAm.updateUsageStats(r, true);
}
if (allResumedActivitiesComplete()) {
ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
@@ -3708,7 +3705,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
return false;
}
- void handleAppCrashLocked(ProcessRecord app) {
+ void handleAppCrashLocked(WindowProcessController app) {
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);
for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
@@ -3725,7 +3722,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
r.mLaunchTaskBehind = false;
mRecentTasks.add(task);
- mService.mTaskChangeNotificationController.notifyTaskStackChanged();
+ mService.getTaskChangeNotificationController().notifyTaskStackChanged();
r.setVisibility(false);
// When launching tasks behind, update the last active time of the top task after the new
@@ -3810,7 +3807,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
- void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
+ void scheduleDestroyAllActivities(WindowProcessController app, String reason) {
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);
for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
@@ -3820,44 +3817,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
}
- void releaseSomeActivitiesLocked(ProcessRecord app, String reason) {
- // Examine all activities currently running in the process.
- TaskRecord firstTask = null;
+ void releaseSomeActivitiesLocked(WindowProcessController app, String reason) {
// Tasks is non-null only if two or more tasks are found.
- ArraySet<TaskRecord> tasks = null;
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Trying to release some activities in " + app);
- for (int i = 0; i < app.activities.size(); i++) {
- ActivityRecord r = app.activities.get(i);
- // First, if we find an activity that is in the process of being destroyed,
- // then we just aren't going to do anything for now; we want things to settle
- // down before we try to prune more activities.
- if (r.finishing || r.isState(DESTROYING, DESTROYED)) {
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r);
- return;
- }
- // Don't consider any activies that are currently not in a state where they
- // can be destroyed.
- if (r.visible || !r.stopped || !r.haveState
- || r.isState(RESUMED, PAUSING, PAUSED, STOPPING)) {
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r);
- continue;
- }
-
- final TaskRecord task = r.getTask();
- if (task != null) {
- if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Collecting release task " + task
- + " from " + r);
- if (firstTask == null) {
- firstTask = task;
- } else if (firstTask != task) {
- if (tasks == null) {
- tasks = new ArraySet<>();
- tasks.add(firstTask);
- }
- tasks.add(task);
- }
- }
- }
+ ArraySet<TaskRecord> tasks = app.getReleaseSomeActivitiesTasks();
if (tasks == null) {
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Didn't find two or more tasks to release");
return;
@@ -3925,7 +3887,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
/** Checks whether the userid is a profile of the current user. */
boolean isCurrentProfileLocked(int userId) {
if (userId == mCurrentUser) return true;
- return mService.mUserController.isCurrentProfile(userId);
+ return mService.mAmInternal.isCurrentProfile(userId);
}
/**
@@ -3987,6 +3949,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
stops = new ArrayList<>();
}
stops.add(s);
+
+ // Make sure to remove it in all cases in case we entered this block with
+ // shouldSleepOrShutDown
+ mActivitiesWaitingForVisibleActivity.remove(s);
mStoppingActivities.remove(activityNdx);
}
}
@@ -4250,16 +4216,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
pw.print(innerPrefix); pw.println(r.app);
}
}
- if (client && r.app != null && r.app.thread != null) {
+ if (client && r.attachedToProcess()) {
// flush anything that is already in the PrintWriter since the thread is going
// to write to the file descriptor directly
pw.flush();
try {
TransferPipe tp = new TransferPipe();
try {
- r.app.thread.dumpActivity(tp.getWriteFd(), r.appToken, innerPrefix, args);
- // Short timeout, since blocking here can
- // deadlock with the application.
+ r.app.getThread().dumpActivity(
+ tp.getWriteFd(), r.appToken, innerPrefix, args);
+ // Short timeout, since blocking here can deadlock with the application.
tp.go(fd, 2000);
} finally {
tp.kill();
@@ -4326,7 +4292,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
private void handleDisplayAdded(int displayId) {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
getActivityDisplayOrCreateLocked(displayId);
}
}
@@ -4389,7 +4355,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
throw new IllegalArgumentException("Can't remove the primary display.");
}
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
final ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
if (activityDisplay == null) {
return;
@@ -4404,7 +4370,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
private void handleDisplayChanged(int displayId) {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
// TODO: The following code block should be moved into {@link ActivityDisplay}.
if (activityDisplay != null) {
@@ -4568,7 +4534,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
if (preferredDisplayId != actualDisplayId) {
// Display a warning toast that we tried to put a non-resizeable task on a secondary
// display with config different from global config.
- mService.mTaskChangeNotificationController
+ mService.getTaskChangeNotificationController()
.notifyActivityLaunchOnSecondaryDisplayFailed();
return;
}
@@ -4577,7 +4543,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
if (!task.supportsSplitScreenWindowingMode() || forceNonResizable) {
// Display a warning toast that we tried to put an app that doesn't support split-screen
// in split-screen.
- mService.mTaskChangeNotificationController.notifyActivityDismissingDockedStack();
+ mService.getTaskChangeNotificationController().notifyActivityDismissingDockedStack();
// Dismiss docked stack. If task appeared to be in docked stack but is not resizable -
// we need to move it to top of fullscreen stack, otherwise it will be covered.
@@ -4597,7 +4563,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
final int reason = isSecondaryDisplayPreferred
? FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY
: FORCED_RESIZEABLE_REASON_SPLIT_SCREEN;
- mService.mTaskChangeNotificationController.notifyActivityForcedResizable(
+ mService.getTaskChangeNotificationController().notifyActivityForcedResizable(
task.taskId, reason, packageName);
}
}
@@ -4629,7 +4595,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
for (int i = task.mActivities.size() - 1; i >= 0; i--) {
final ActivityRecord r = task.mActivities.get(i);
- if (r.app != null && r.app.thread != null) {
+ if (r.attachedToProcess()) {
mMultiWindowModeChangedActivities.add(r);
}
}
@@ -4652,7 +4618,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
void scheduleUpdatePictureInPictureModeIfNeeded(TaskRecord task, Rect targetStackBounds) {
for (int i = task.mActivities.size() - 1; i >= 0; i--) {
final ActivityRecord r = task.mActivities.get(i);
- if (r.app != null && r.app.thread != null) {
+ if (r.attachedToProcess()) {
mPipModeChangedActivities.add(r);
// If we are scheduling pip change, then remove this activity from multi-window
// change list as the processing of pip change will make sure multi-window changed
@@ -4671,7 +4637,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
mHandler.removeMessages(REPORT_PIP_MODE_CHANGED_MSG);
for (int i = task.mActivities.size() - 1; i >= 0; i--) {
final ActivityRecord r = task.mActivities.get(i);
- if (r.app != null && r.app.thread != null) {
+ if (r.attachedToProcess()) {
r.updatePictureInPictureMode(targetStackBounds, forceUpdate);
}
}
@@ -4721,7 +4687,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
void activityIdleInternal(ActivityRecord r, boolean processPausingActivities) {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
activityIdleInternalLocked(r != null ? r.appToken : null, true /* fromTimeout */,
processPausingActivities, null);
}
@@ -4731,7 +4697,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
public void handleMessage(Message msg) {
switch (msg.what) {
case REPORT_MULTI_WINDOW_MODE_CHANGED_MSG: {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
for (int i = mMultiWindowModeChangedActivities.size() - 1; i >= 0; i--) {
final ActivityRecord r = mMultiWindowModeChangedActivities.remove(i);
r.updateMultiWindowMode();
@@ -4739,7 +4705,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
} break;
case REPORT_PIP_MODE_CHANGED_MSG: {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
for (int i = mPipModeChangedActivities.size() - 1; i >= 0; i--) {
final ActivityRecord r = mPipModeChangedActivities.remove(i);
r.updatePictureInPictureMode(mPipModeChangedTargetStackBounds,
@@ -4761,12 +4727,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
false /* processPausingActivities */);
} break;
case RESUME_TOP_ACTIVITY_MSG: {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
resumeFocusedStackTopActivityLocked();
}
} break;
case SLEEP_TIMEOUT_MSG: {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
if (mService.isSleepingOrShuttingDownLocked()) {
Slog.w(TAG, "Sleep timeout! Sleeping now.");
checkReadyForSleepLocked(false /* allowDelay */);
@@ -4774,7 +4740,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
}
} break;
case LAUNCH_TIMEOUT_MSG: {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
if (mLaunchingActivity.isHeld()) {
Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
if (VALIDATE_WAKE_LOCK_CALLER
@@ -4795,7 +4761,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
handleDisplayRemoved(msg.arg1);
} break;
case LAUNCH_TASK_BEHIND_COMPLETE: {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
ActivityRecord r = ActivityRecord.forTokenLocked((IBinder) msg.obj);
if (r != null) {
handleLaunchTaskBehindCompleteLocked(r);
@@ -4883,7 +4849,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
// If the user must confirm credentials (e.g. when first launching a work app and the
// Work Challenge is present) let startActivityInPackage handle the intercepting.
- if (!mService.mUserController.shouldConfirmCredentials(task.userId)
+ if (!mService.mAmInternal.shouldConfirmCredentials(task.userId)
&& task.getRootActivity() != null) {
final ActivityRecord targetActivity = task.getTopActivity();
@@ -5011,7 +4977,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
@Override
public void release() {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
removeSleepTokenLocked(this);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java
index a7c32009a4c4..110767174e5c 100644
--- a/services/core/java/com/android/server/am/ActivityStartController.java
+++ b/services/core/java/com/android/server/am/ActivityStartController.java
@@ -21,7 +21,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityManagerService.ALLOW_FULL_ONLY;
+import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
import android.app.IApplicationThread;
import android.content.ComponentName;
@@ -65,7 +65,7 @@ public class ActivityStartController {
private static final int DO_PENDING_ACTIVITY_LAUNCHES_MSG = 1;
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mSupervisor;
/** Last home activity record we attempted to start. */
@@ -96,7 +96,7 @@ public class ActivityStartController {
public void handleMessage(Message msg) {
switch(msg.what) {
case DO_PENDING_ACTIVITY_LAUNCHES_MSG:
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
doPendingActivityLaunches(true);
}
break;
@@ -111,22 +111,22 @@ public class ActivityStartController {
*/
private ActivityStarter mLastStarter;
- ActivityStartController(ActivityManagerService service) {
+ ActivityStartController(ActivityTaskManagerService service) {
this(service, service.mStackSupervisor,
new DefaultFactory(service, service.mStackSupervisor,
new ActivityStartInterceptor(service, service.mStackSupervisor)));
}
@VisibleForTesting
- ActivityStartController(ActivityManagerService service, ActivityStackSupervisor supervisor,
+ ActivityStartController(ActivityTaskManagerService service, ActivityStackSupervisor supervisor,
Factory factory) {
mService = service;
mSupervisor = supervisor;
- mHandler = new StartHandler(mService.mHandlerThread.getLooper());
+ mHandler = new StartHandler(mService.mH.getLooper());
mFactory = factory;
mFactory.setController(this);
mPendingRemoteAnimationRegistry = new PendingRemoteAnimationRegistry(service,
- service.mHandler);
+ service.mH);
}
/**
@@ -182,7 +182,7 @@ public class ActivityStartController {
*/
void startSetupActivity() {
// Only do this once per boot.
- if (mService.getCheckedForSetup()) {
+ if (mService.mAm.getCheckedForSetup()) {
return;
}
@@ -190,10 +190,10 @@ public class ActivityStartController {
// version than the last one shown, and we are not running in
// low-level factory test mode.
final ContentResolver resolver = mService.mContext.getContentResolver();
- if (mService.mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL &&
+ if (mService.mAm.mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL &&
Settings.Global.getInt(resolver,
Settings.Global.DEVICE_PROVISIONED, 0) != 0) {
- mService.setCheckedForSetup(true);
+ mService.mAm.setCheckedForSetup(true);
// See if we should be showing the platform update setup UI.
final Intent intent = new Intent(Intent.ACTION_UPGRADE_SETUP);
@@ -237,10 +237,10 @@ public class ActivityStartController {
int checkTargetUser(int targetUserId, boolean validateIncomingUser,
int realCallingPid, int realCallingUid, String reason) {
if (validateIncomingUser) {
- return mService.mUserController.handleIncomingUser(realCallingPid, realCallingUid,
- targetUserId, false, ALLOW_FULL_ONLY, reason, null);
+ return mService.handleIncomingUser(
+ realCallingPid, realCallingUid, targetUserId, reason);
} else {
- mService.mUserController.ensureNotSpecialUser(targetUserId);
+ mService.mAmInternal.ensureNotSpecialUser(targetUserId);
return targetUserId;
}
}
@@ -320,7 +320,7 @@ public class ActivityStartController {
}
final long origId = Binder.clearCallingIdentity();
try {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
ActivityRecord[] outActivity = new ActivityRecord[1];
for (int i=0; i < intents.length; i++) {
Intent intent = intents[i];
@@ -343,7 +343,7 @@ public class ActivityStartController {
null, userId, ActivityStarter.computeResolveFilterUid(
callingUid, realCallingUid, UserHandle.USER_NULL));
// TODO: New, check if this is correct
- aInfo = mService.getActivityInfoForUser(aInfo, userId);
+ aInfo = mService.mAm.getActivityInfoForUser(aInfo, userId);
if (aInfo != null &&
(aInfo.applicationInfo.privateFlags
diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
index ff97db83766e..ca12716e7199 100644
--- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java
+++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
@@ -66,10 +66,9 @@ import com.android.server.LocalServices;
*/
class ActivityStartInterceptor {
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mSupervisor;
private final Context mServiceContext;
- private final UserController mUserController;
// UserManager cannot be final as it's not ready when this class is instantiated during boot
private UserManager mUserManager;
@@ -99,17 +98,17 @@ class ActivityStartInterceptor {
TaskRecord mInTask;
ActivityOptions mActivityOptions;
- ActivityStartInterceptor(ActivityManagerService service, ActivityStackSupervisor supervisor) {
- this(service, supervisor, service.mContext, service.mUserController);
+ ActivityStartInterceptor(
+ ActivityTaskManagerService service, ActivityStackSupervisor supervisor) {
+ this(service, supervisor, service.mContext);
}
@VisibleForTesting
- ActivityStartInterceptor(ActivityManagerService service, ActivityStackSupervisor supervisor,
- Context context, UserController userController) {
+ ActivityStartInterceptor(ActivityTaskManagerService service, ActivityStackSupervisor supervisor,
+ Context context) {
mService = service;
mSupervisor = supervisor;
mServiceContext = context;
- mUserController = userController;
}
/**
@@ -127,7 +126,7 @@ class ActivityStartInterceptor {
private IntentSender createIntentSenderForOriginalIntent(int callingUid, int flags) {
Bundle activityOptions = deferCrossProfileAppsAnimationIfNecessary();
- final IIntentSender target = mService.getIntentSenderLocked(
+ final IIntentSender target = mService.mAm.getIntentSenderLocked(
INTENT_SENDER_ACTIVITY, mCallingPackage, callingUid, mUserId, null /*token*/,
null /*resultCode*/, 0 /*requestCode*/,
new Intent[] { mIntent }, new String[] { mResolvedType },
@@ -238,7 +237,7 @@ class ActivityStartInterceptor {
(mAInfo.applicationInfo.flags & FLAG_SUSPENDED) == 0) {
return false;
}
- final PackageManagerInternal pmi = mService.getPackageManagerInternalLocked();
+ final PackageManagerInternal pmi = mService.mAm.getPackageManagerInternalLocked();
if (pmi == null) {
return false;
}
@@ -297,7 +296,7 @@ class ActivityStartInterceptor {
* @return The intercepting intent if needed.
*/
private Intent interceptWithConfirmCredentialsIfNeeded(ActivityInfo aInfo, int userId) {
- if (!mUserController.shouldConfirmCredentials(userId)) {
+ if (!mService.mAmInternal.shouldConfirmCredentials(userId)) {
return null;
}
// TODO(b/28935539): should allow certain activities to bypass work challenge
@@ -319,7 +318,7 @@ class ActivityStartInterceptor {
private boolean interceptHarmfulAppIfNeeded() {
CharSequence harmfulAppWarning;
try {
- harmfulAppWarning = mService.getPackageManager()
+ harmfulAppWarning = mService.mAm.getPackageManager()
.getHarmfulAppWarning(mAInfo.packageName, mUserId);
} catch (RemoteException ex) {
return false;
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 31c93a13a6b1..7833780de783 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -133,7 +133,7 @@ class ActivityStarter {
private static final String TAG_USER_LEAVING = TAG + POSTFIX_USER_LEAVING;
private static final int INVALID_LAUNCH_MODE = -1;
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mSupervisor;
private final ActivityStartInterceptor mInterceptor;
private final ActivityStartController mController;
@@ -236,14 +236,14 @@ class ActivityStarter {
private final int MAX_STARTER_COUNT = 3;
private ActivityStartController mController;
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private ActivityStackSupervisor mSupervisor;
private ActivityStartInterceptor mInterceptor;
private SynchronizedPool<ActivityStarter> mStarterPool =
new SynchronizedPool<>(MAX_STARTER_COUNT);
- DefaultFactory(ActivityManagerService service,
+ DefaultFactory(ActivityTaskManagerService service,
ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {
mService = service;
mSupervisor = supervisor;
@@ -413,7 +413,7 @@ class ActivityStarter {
}
}
- ActivityStarter(ActivityStartController controller, ActivityManagerService service,
+ ActivityStarter(ActivityStartController controller, ActivityTaskManagerService service,
ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {
mController = controller;
mService = service;
@@ -587,7 +587,7 @@ class ActivityStarter {
ProcessRecord callerApp = null;
if (caller != null) {
- callerApp = mService.getRecordForAppLocked(caller);
+ callerApp = mService.mAm.getRecordForAppLocked(caller);
if (callerApp != null) {
callingPid = callerApp.pid;
callingUid = callerApp.info.uid;
@@ -676,7 +676,7 @@ class ActivityStarter {
&& sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) {
try {
intent.addCategory(Intent.CATEGORY_VOICE);
- if (!mService.getPackageManager().activitySupportsIntent(
+ if (!mService.mAm.getPackageManager().activitySupportsIntent(
intent.getComponent(), intent, resolvedType)) {
Slog.w(TAG,
"Activity being started in current voice task does not support voice: "
@@ -694,7 +694,7 @@ class ActivityStarter {
// If the caller is starting a new voice session, just make sure the target
// is actually allowing it to run this way.
try {
- if (!mService.getPackageManager().activitySupportsIntent(intent.getComponent(),
+ if (!mService.mAm.getPackageManager().activitySupportsIntent(intent.getComponent(),
intent, resolvedType)) {
Slog.w(TAG,
"Activity being started in new voice task does not support: "
@@ -721,13 +721,14 @@ class ActivityStarter {
boolean abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho,
requestCode, callingPid, callingUid, callingPackage, ignoreTargetSecurity,
inTask != null, callerApp, resultRecord, resultStack);
- abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
+ abort |= !mService.mAm.mIntentFirewall.checkStartActivity(intent, callingUid,
callingPid, resolvedType, aInfo.applicationInfo);
+ final WindowProcessController callerWpc =
+ callerApp != null ? callerApp.getWindowProcessController() : null;
// Merge the two options bundles, while realCallerOptions takes precedence.
ActivityOptions checkedOptions = options != null
- ? options.getOptions(intent, aInfo, callerApp, mSupervisor)
- : null;
+ ? options.getOptions(intent, aInfo, callerWpc, mSupervisor) : null;
if (allowPendingRemoteAnimationRegistryLookup) {
checkedOptions = mService.getActivityStartController()
.getPendingRemoteAnimationRegistry()
@@ -774,10 +775,10 @@ class ActivityStarter {
// If permissions need a review before any of the app components can run, we
// launch the review activity and pass a pending intent to start the activity
// we are to launching now after the review is completed.
- if (mService.mPermissionReviewRequired && aInfo != null) {
- if (mService.getPackageManagerInternalLocked().isPermissionsReviewRequired(
+ if (mService.mAm.mPermissionReviewRequired && aInfo != null) {
+ if (mService.mAm.getPackageManagerInternalLocked().isPermissionsReviewRequired(
aInfo.packageName, userId)) {
- IIntentSender target = mService.getIntentSenderLocked(
+ IIntentSender target = mService.mAm.getIntentSenderLocked(
ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage,
callingUid, userId, null, null, 0, new Intent[]{intent},
new String[]{resolvedType}, PendingIntent.FLAG_CANCEL_CURRENT
@@ -827,7 +828,8 @@ class ActivityStarter {
aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/);
}
- ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
+ ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid,
+ callingUid,
callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
mSupervisor, checkedOptions, sourceRecord);
@@ -850,23 +852,13 @@ class ActivityStarter {
if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid,
realCallingPid, realCallingUid, "Activity start")) {
mController.addPendingActivityLaunch(new PendingActivityLaunch(r,
- sourceRecord, startFlags, stack, callerApp));
+ sourceRecord, startFlags, stack, callerWpc));
ActivityOptions.abort(checkedOptions);
return ActivityManager.START_SWITCHES_CANCELED;
}
}
- if (mService.mDidAppSwitch) {
- // This is the second allowed switch since we stopped switches,
- // so now just generally allow switches. Use case: user presses
- // home (switches disabled, switch to home, mDidAppSwitch now true);
- // user taps a home icon (coming from home so allowed, we hit here
- // and now allow anyone to switch again).
- mService.mAppSwitchesAllowedTime = 0;
- } else {
- mService.mDidAppSwitch = true;
- }
-
+ mService.onStartActivitySetDidAppSwitch();
mController.doPendingActivityLaunches(false);
return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,
@@ -882,7 +874,7 @@ class ActivityStarter {
String resolvedType, int userId) {
if (auxiliaryResponse != null && auxiliaryResponse.needsPhaseTwo) {
// request phase two resolution
- mService.getPackageManagerInternalLocked().requestInstantAppResolutionPhaseTwo(
+ mService.mAm.getPackageManagerInternalLocked().requestInstantAppResolutionPhaseTwo(
auxiliaryResponse, originalIntent, resolvedType, callingPackage,
verificationBundle, userId);
}
@@ -933,7 +925,7 @@ class ActivityStarter {
// anyone interested in this piece of information.
switch (startedActivityStack.getWindowingMode()) {
case WINDOWING_MODE_PINNED:
- mService.mTaskChangeNotificationController.notifyPinnedActivityRestartAttempt(
+ mService.getTaskChangeNotificationController().notifyPinnedActivityRestartAttempt(
clearedTask);
break;
case WINDOWING_MODE_SPLIT_SCREEN_PRIMARY:
@@ -982,7 +974,7 @@ class ActivityStarter {
&& !(Intent.ACTION_VIEW.equals(intent.getAction()) && intent.getData() == null)
&& !Intent.ACTION_INSTALL_INSTANT_APP_PACKAGE.equals(intent.getAction())
&& !Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE.equals(intent.getAction())
- && mService.getPackageManagerInternalLocked()
+ && mService.mAm.getPackageManagerInternalLocked()
.isInstantAppInstallerComponent(intent.getComponent())) {
// intercept intents targeted directly to the ephemeral installer the
// ephemeral installer should never be started with a raw Intent; instead
@@ -1024,7 +1016,7 @@ class ActivityStarter {
// Collect information about the target of the Intent.
ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
final ActivityStack stack = mSupervisor.mFocusedStack;
stack.mConfigWillChange = globalConfig != null
&& mService.getGlobalConfiguration().diff(globalConfig) != 0;
@@ -1036,16 +1028,16 @@ class ActivityStarter {
if (aInfo != null &&
(aInfo.applicationInfo.privateFlags
& ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0 &&
- mService.mHasHeavyWeightFeature) {
+ mService.mAm.mHasHeavyWeightFeature) {
// This may be a heavy-weight process! Check to see if we already
// have another, different heavy-weight process running.
if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
- final ProcessRecord heavy = mService.mHeavyWeightProcess;
+ final ProcessRecord heavy = mService.mAm.mHeavyWeightProcess;
if (heavy != null && (heavy.info.uid != aInfo.applicationInfo.uid
|| !heavy.processName.equals(aInfo.processName))) {
int appCallingUid = callingUid;
if (caller != null) {
- ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
+ ProcessRecord callerApp = mService.mAm.getRecordForAppLocked(caller);
if (callerApp != null) {
appCallingUid = callerApp.info.uid;
} else {
@@ -1057,7 +1049,7 @@ class ActivityStarter {
}
}
- IIntentSender target = mService.getIntentSenderLocked(
+ IIntentSender target = mService.mAm.getIntentSenderLocked(
ActivityManager.INTENT_SENDER_ACTIVITY, "android",
appCallingUid, userId, null, null, 0, new Intent[] { intent },
new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
@@ -1070,13 +1062,8 @@ class ActivityStarter {
}
newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
new IntentSender(target));
- if (heavy.activities.size() > 0) {
- ActivityRecord hist = heavy.activities.get(0);
- newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
- hist.packageName);
- newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
- hist.getTask().taskId);
- }
+ heavy.getWindowProcessController().updateIntentForHeavyWeightActivity(
+ newIntent);
newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
aInfo.packageName);
newIntent.setFlags(intent.getFlags());
@@ -1093,7 +1080,7 @@ class ActivityStarter {
callingUid, realCallingUid, mRequest.filterCallingUid));
aInfo = rInfo != null ? rInfo.activityInfo : null;
if (aInfo != null) {
- aInfo = mService.getActivityInfoForUser(aInfo, userId);
+ aInfo = mService.mAm.getActivityInfoForUser(aInfo, userId);
}
}
}
@@ -1113,7 +1100,7 @@ class ActivityStarter {
// do so now. This allows a clean switch, as we are waiting
// for the current activity to pause (so we will not destroy
// it), and have not yet started the next activity.
- mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
+ mService.mAmInternal.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
"updateConfiguration()");
stack.mConfigWillChange = false;
if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
@@ -1131,7 +1118,7 @@ class ActivityStarter {
mSupervisor.mWaitingActivityLaunched.add(outResult);
do {
try {
- mService.wait();
+ mService.mGlobalLock.wait();
} catch (InterruptedException e) {
}
} while (outResult.result != START_TASK_TO_FRONT
@@ -1162,7 +1149,7 @@ class ActivityStarter {
// Note: the timeout variable is not currently not ever set.
do {
try {
- mService.wait();
+ mService.mGlobalLock.wait();
} catch (InterruptedException e) {
}
} while (!outResult.timeout && outResult.who == null);
@@ -1377,7 +1364,7 @@ class ActivityStarter {
final boolean dontStart = top != null && mStartActivity.resultTo == null
&& top.realActivity.equals(mStartActivity.realActivity)
&& top.userId == mStartActivity.userId
- && top.app != null && top.app.thread != null
+ && top.attachedToProcess()
&& ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
|| isLaunchModeOneOf(LAUNCH_SINGLE_TOP, LAUNCH_SINGLE_TASK));
if (dontStart) {
@@ -1431,9 +1418,9 @@ class ActivityStarter {
return result;
}
- mService.grantUriPermissionFromIntentLocked(mCallingUid, mStartActivity.packageName,
+ mService.mAm.grantUriPermissionFromIntentLocked(mCallingUid, mStartActivity.packageName,
mIntent, mStartActivity.getUriPermissionsLocked(), mStartActivity.userId);
- mService.grantEphemeralAccessLocked(mStartActivity.userId, mIntent,
+ mService.mAm.grantEphemeralAccessLocked(mStartActivity.userId, mIntent,
mStartActivity.appInfo.uid, UserHandle.getAppId(mCallingUid));
if (newTask) {
EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, mStartActivity.userId,
@@ -2124,13 +2111,13 @@ class ActivityStarter {
// be not suitable. Let's check other displays.
if (mTargetStack == null && targetDisplayId != sourceStack.mDisplayId) {
// Can't use target display, lets find a stack on the source display.
- mTargetStack = mService.mStackSupervisor.getValidLaunchStackOnDisplay(
+ mTargetStack = mSupervisor.getValidLaunchStackOnDisplay(
sourceStack.mDisplayId, mStartActivity);
}
if (mTargetStack == null) {
// There are no suitable stacks on the target and source display(s). Look on all
// displays.
- mTargetStack = mService.mStackSupervisor.getNextValidLaunchStackLocked(
+ mTargetStack = mSupervisor.getNextValidLaunchStackLocked(
mStartActivity, -1 /* currentFocus */);
}
}
@@ -2261,7 +2248,8 @@ class ActivityStarter {
final ActivityStack stack = task.getStack();
if (stack != null && stack.resizeStackWithLaunchBounds()) {
- mService.resizeStack(stack.mStackId, bounds, true, !PRESERVE_WINDOWS, ANIMATE, -1);
+ mService.resizeStack(
+ stack.mStackId, bounds, true, !PRESERVE_WINDOWS, ANIMATE, -1);
} else {
task.updateOverrideConfiguration(bounds);
}
diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
new file mode 100644
index 000000000000..3ed2875c7377
--- /dev/null
+++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
@@ -0,0 +1,5243 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.am;
+
+import static android.Manifest.permission.BIND_VOICE_INTERACTION;
+import static android.Manifest.permission.CHANGE_CONFIGURATION;
+import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
+import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
+import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
+import static android.Manifest.permission.READ_FRAME_BUFFER;
+import static android.Manifest.permission.REMOVE_TASKS;
+import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
+import static android.Manifest.permission.STOP_APP_SWITCHES;
+import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
+import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
+import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS;
+import static android.provider.Settings.System.FONT_SCALE;
+import static com.android.server.am.ActivityManagerService.dumpStackTraces;
+import static com.android.server.am.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG;
+import static com.android.server.am.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_DATA;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE;
+import static android.app.ActivityTaskManager.INVALID_STACK_ID;
+import static android.app.ActivityTaskManager.RESIZE_MODE_PRESERVE_WINDOW;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.AppOpsManager.OP_NONE;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
+import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
+import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.content.res.Configuration.UI_MODE_TYPE_TELEVISION;
+import static android.os.Build.VERSION_CODES.N;
+import static android.os.Process.SYSTEM_UID;
+import static android.provider.Settings.Global.ALWAYS_FINISH_ACTIVITIES;
+import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
+import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
+import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RTL;
+import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION;
+import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.Display.INVALID_DISPLAY;
+import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
+import static android.view.WindowManager.TRANSIT_NONE;
+import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
+import static android.view.WindowManager.TRANSIT_TASK_OPEN;
+import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IMMERSIVE;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBILITY;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IMMERSIVE;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY;
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
+import static com.android.server.am.ActivityManagerService.ANIMATE;
+import static com.android.server.am.ActivityManagerService.MY_PID;
+import static com.android.server.am.ActivityManagerService.SEND_LOCALE_TO_MOUNT_DAEMON_MSG;
+import static com.android.server.am.ActivityManagerService.STOCK_PM_FLAGS;
+import static com.android.server.am.ActivityManagerService.UPDATE_CONFIGURATION_MSG;
+import static com.android.server.am.ActivityManagerService.checkComponentPermission;
+import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
+import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME;
+import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_ONLY;
+import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS;
+import static com.android.server.am.ActivityStackSupervisor.ON_TOP;
+import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
+import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
+import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
+import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
+import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT;
+import static com.android.server.am.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE;
+import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
+import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
+
+import android.Manifest;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
+import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
+import android.app.ActivityThread;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.database.ContentObserver;
+import android.os.IUserManager;
+import android.os.PowerManager;
+import android.os.ServiceManager;
+import android.os.Trace;
+import android.os.UserManager;
+import android.os.WorkSource;
+import android.view.WindowManager;
+import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.app.IAppOpsService;
+import com.android.server.AppOpsService;
+import com.android.server.pm.UserManagerService;
+import com.android.server.wm.ActivityTaskManagerInternal;
+import android.app.AppGlobals;
+import android.app.IActivityController;
+import android.app.IActivityTaskManager;
+import android.app.IApplicationThread;
+import android.app.IAssistDataReceiver;
+import android.app.ITaskStackListener;
+import android.app.PictureInPictureParams;
+import android.app.ProfilerInfo;
+import android.app.RemoteAction;
+import android.app.WaitResult;
+import android.app.WindowConfiguration;
+import android.app.admin.DevicePolicyCache;
+import android.app.assist.AssistContent;
+import android.app.assist.AssistStructure;
+import android.app.servertransaction.ConfigurationChangeItem;
+import android.app.usage.UsageEvents;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.IIntentSender;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.ResolveInfo;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.metrics.LogMaker;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.FileUtils;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.LocaleList;
+import android.os.Looper;
+import android.os.Message;
+import android.os.PersistableBundle;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.StrictMode;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.os.UpdateLock;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.service.voice.IVoiceInteractionSession;
+import android.service.voice.VoiceInteractionManagerInternal;
+import android.telecom.TelecomManager;
+import android.text.TextUtils;
+import android.text.format.Time;
+import android.util.ArrayMap;
+import android.util.EventLog;
+import android.util.Log;
+import android.util.Slog;
+
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+import android.util.StatsLog;
+import android.util.TimeUtils;
+import android.util.proto.ProtoOutputStream;
+import android.view.IRecentsAnimationRunner;
+import android.view.RemoteAnimationAdapter;
+import android.view.RemoteAnimationDefinition;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.app.AssistUtils;
+import com.android.internal.app.IVoiceInteractor;
+import com.android.internal.app.ProcessMap;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.os.logging.MetricsLoggerWrapper;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.policy.IKeyguardDismissCallback;
+import com.android.internal.policy.KeyguardDismissCallback;
+import com.android.internal.util.Preconditions;
+import com.android.server.AttributeCache;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
+import com.android.server.Watchdog;
+import com.android.server.vr.VrManagerInternal;
+import com.android.server.wm.PinnedStackWindowController;
+import com.android.server.wm.WindowManagerService;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * System service for managing activities and their containers (task, stacks, displays,... ).
+ *
+ * {@hide}
+ */
+public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_AM;
+ private static final String TAG_STACK = TAG + POSTFIX_STACK;
+ private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
+ private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE;
+ private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
+ private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
+ private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
+ private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
+
+ Context mContext;
+ /**
+ * This Context is themable and meant for UI display (AlertDialogs, etc.). The theme can
+ * change at runtime. Use mContext for non-UI purposes.
+ */
+ final Context mUiContext;
+ H mH;
+ UiHandler mUiHandler;
+ ActivityManagerService mAm;
+ ActivityManagerInternal mAmInternal;
+ /* Global service lock used by the package the owns this service. */
+ Object mGlobalLock;
+ ActivityStackSupervisor mStackSupervisor;
+ WindowManagerService mWindowManager;
+ private UserManagerService mUserManager;
+ private AppOpsService mAppOpsService;
+ /** All processes currently running that might have a window organized by name. */
+ final ProcessMap<WindowProcessController> mProcessNames = new ProcessMap<>();
+ /** This is the process holding what we currently consider to be the "home" activity. */
+ WindowProcessController mHomeProcess;
+ /**
+ * This is the process holding the activity the user last visited that is in a different process
+ * from the one they are currently in.
+ */
+ WindowProcessController mPreviousProcess;
+ /** The time at which the previous process was last visible. */
+ long mPreviousProcessVisibleTime;
+
+ /** List of intents that were used to start the most recent tasks. */
+ private RecentTasks mRecentTasks;
+ /** State of external calls telling us if the device is awake or asleep. */
+ private boolean mKeyguardShown = false;
+
+ // Wrapper around VoiceInteractionServiceManager
+ private AssistUtils mAssistUtils;
+
+ // VoiceInteraction session ID that changes for each new request except when
+ // being called for multi-window assist in a single session.
+ private int mViSessionId = 1000;
+
+ // How long to wait in getAssistContextExtras for the activity and foreground services
+ // to respond with the result.
+ private static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500;
+
+ // How long top wait when going through the modern assist (which doesn't need to block
+ // on getting this result before starting to launch its UI).
+ private static final int PENDING_ASSIST_EXTRAS_LONG_TIMEOUT = 2000;
+
+ // How long to wait in getAutofillAssistStructure() for the activity to respond with the result.
+ private static final int PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT = 2000;
+
+ private final ArrayList<PendingAssistExtras> mPendingAssistExtras = new ArrayList<>();
+
+ // Keeps track of the active voice interaction service component, notified from
+ // VoiceInteractionManagerService
+ ComponentName mActiveVoiceInteractionServiceComponent;
+
+ private VrController mVrController;
+ KeyguardController mKeyguardController;
+ private final ClientLifecycleManager mLifecycleManager;
+ private TaskChangeNotificationController mTaskChangeNotificationController;
+ /** The controller for all operations related to locktask. */
+ private LockTaskController mLockTaskController;
+ private ActivityStartController mActivityStartController;
+
+ boolean mSuppressResizeConfigChanges;
+
+ private final UpdateConfigurationResult mTmpUpdateConfigurationResult =
+ new UpdateConfigurationResult();
+
+ static final class UpdateConfigurationResult {
+ // Configuration changes that were updated.
+ int changes;
+ // If the activity was relaunched to match the new configuration.
+ boolean activityRelaunched;
+
+ void reset() {
+ changes = 0;
+ activityRelaunched = false;
+ }
+ }
+
+ /** Current sequencing integer of the configuration, for skipping old configurations. */
+ private int mConfigurationSeq;
+ // To cache the list of supported system locales
+ private String[] mSupportedSystemLocales = null;
+
+ /**
+ * Temp object used when global and/or display override configuration is updated. It is also
+ * sent to outer world instead of {@link #getGlobalConfiguration} because we don't trust
+ * anyone...
+ */
+ private Configuration mTempConfig = new Configuration();
+
+ /** Temporary to avoid allocations. */
+ final StringBuilder mStringBuilder = new StringBuilder(256);
+
+ // Amount of time after a call to stopAppSwitches() during which we will
+ // prevent further untrusted switches from happening.
+ private static final long APP_SWITCH_DELAY_TIME = 5 * 1000;
+
+ /**
+ * The time at which we will allow normal application switches again,
+ * after a call to {@link #stopAppSwitches()}.
+ */
+ private long mAppSwitchesAllowedTime;
+ /**
+ * This is set to true after the first switch after mAppSwitchesAllowedTime
+ * is set; any switches after that will clear the time.
+ */
+ private boolean mDidAppSwitch;
+
+ IActivityController mController = null;
+ boolean mControllerIsAMonkey = false;
+
+ /**
+ * Used to retain an update lock when the foreground activity is in
+ * immersive mode.
+ */
+ private final UpdateLock mUpdateLock = new UpdateLock("immersive");
+
+ /**
+ * Packages that are being allowed to perform unrestricted app switches. Mapping is
+ * User -> Type -> uid.
+ */
+ final SparseArray<ArrayMap<String, Integer>> mAllowAppSwitchUids = new SparseArray<>();
+
+ /** The dimensions of the thumbnails in the Recents UI. */
+ private int mThumbnailWidth;
+ private int mThumbnailHeight;
+ private float mFullscreenThumbnailScale;
+
+ /**
+ * Flag that indicates if multi-window is enabled.
+ *
+ * For any particular form of multi-window to be enabled, generic multi-window must be enabled
+ * in {@link com.android.internal.R.bool#config_supportsMultiWindow} config or
+ * {@link Settings.Global#DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES} development option set.
+ * At least one of the forms of multi-window must be enabled in order for this flag to be
+ * initialized to 'true'.
+ *
+ * @see #mSupportsSplitScreenMultiWindow
+ * @see #mSupportsFreeformWindowManagement
+ * @see #mSupportsPictureInPicture
+ * @see #mSupportsMultiDisplay
+ */
+ boolean mSupportsMultiWindow;
+ boolean mSupportsSplitScreenMultiWindow;
+ boolean mSupportsFreeformWindowManagement;
+ boolean mSupportsPictureInPicture;
+ boolean mSupportsMultiDisplay;
+ boolean mForceResizableActivities;
+
+ final List<ActivityTaskManagerInternal.ScreenObserver> mScreenObservers = new ArrayList<>();
+
+ // VR Vr2d Display Id.
+ int mVr2dDisplayId = INVALID_DISPLAY;
+
+ /**
+ * Set while we are wanting to sleep, to prevent any
+ * activities from being started/resumed.
+ *
+ * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping.
+ *
+ * Currently mSleeping is set to true when transitioning into the sleep state, and remains true
+ * while in the sleep state until there is a pending transition out of sleep, in which case
+ * mSleeping is set to false, and remains false while awake.
+ *
+ * Whether mSleeping can quickly toggled between true/false without the device actually
+ * display changing states is undefined.
+ */
+ private boolean mSleeping = false;
+
+ /**
+ * The process state used for processes that are running the top activities.
+ * This changes between TOP and TOP_SLEEPING to following mSleeping.
+ */
+ int mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
+
+ // Whether we should show our dialogs (ANR, crash, etc) or just perform their default action
+ // automatically. Important for devices without direct input devices.
+ private boolean mShowDialogs = true;
+
+ /** Set if we are shutting down the system, similar to sleeping. */
+ boolean mShuttingDown = false;
+
+ /**
+ * We want to hold a wake lock while running a voice interaction session, since
+ * this may happen with the screen off and we need to keep the CPU running to
+ * be able to continue to interact with the user.
+ */
+ PowerManager.WakeLock mVoiceWakeLock;
+
+ /**
+ * Set while we are running a voice interaction. This overrides sleeping while it is active.
+ */
+ IVoiceInteractionSession mRunningVoice;
+
+ /**
+ * The last resumed activity. This is identical to the current resumed activity most
+ * of the time but could be different when we're pausing one activity before we resume
+ * another activity.
+ */
+ ActivityRecord mLastResumedActivity;
+
+ /**
+ * The activity that is currently being traced as the active resumed activity.
+ *
+ * @see #updateResumedAppTrace
+ */
+ private @Nullable ActivityRecord mTracedResumedActivity;
+
+ /** If non-null, we are tracking the time the user spends in the currently focused app. */
+ AppTimeTracker mCurAppTimeTracker;
+
+ private FontScaleSettingObserver mFontScaleSettingObserver;
+
+ private final class FontScaleSettingObserver extends ContentObserver {
+ private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
+ private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
+
+ public FontScaleSettingObserver() {
+ super(mH);
+ final ContentResolver resolver = mContext.getContentResolver();
+ resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
+ resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
+ UserHandle.USER_ALL);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) {
+ if (mFontScaleUri.equals(uri)) {
+ updateFontScaleIfNeeded(userId);
+ } else if (mHideErrorDialogsUri.equals(uri)) {
+ synchronized (mGlobalLock) {
+ updateShouldShowDialogsLocked(getGlobalConfiguration());
+ }
+ }
+ }
+ }
+
+ ActivityTaskManagerService(Context context) {
+ mContext = context;
+ mUiContext = ActivityThread.currentActivityThread().getSystemUiContext();
+ mLifecycleManager = new ClientLifecycleManager();
+ }
+
+ void onSystemReady() {
+ mAssistUtils = new AssistUtils(mContext);
+ mVrController.onSystemReady();
+ mRecentTasks.onSystemReadyLocked();
+ }
+
+ void onInitPowerManagement() {
+ mStackSupervisor.initPowerManagement();
+ final PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
+ mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*");
+ mVoiceWakeLock.setReferenceCounted(false);
+ }
+
+ void installSystemProviders() {
+ mFontScaleSettingObserver = new FontScaleSettingObserver();
+ }
+
+ void retrieveSettings(ContentResolver resolver) {
+ final boolean freeformWindowManagement =
+ mContext.getPackageManager().hasSystemFeature(FEATURE_FREEFORM_WINDOW_MANAGEMENT)
+ || Settings.Global.getInt(
+ resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
+
+ final boolean supportsMultiWindow = ActivityTaskManager.supportsMultiWindow(mContext);
+ final boolean supportsPictureInPicture = supportsMultiWindow &&
+ mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
+ final boolean supportsSplitScreenMultiWindow =
+ ActivityTaskManager.supportsSplitScreenMultiWindow(mContext);
+ final boolean supportsMultiDisplay = mContext.getPackageManager()
+ .hasSystemFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
+ final boolean alwaysFinishActivities =
+ Settings.Global.getInt(resolver, ALWAYS_FINISH_ACTIVITIES, 0) != 0;
+ final boolean forceRtl = Settings.Global.getInt(resolver, DEVELOPMENT_FORCE_RTL, 0) != 0;
+ final boolean forceResizable = Settings.Global.getInt(
+ resolver, DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0;
+
+ // Transfer any global setting for forcing RTL layout, into a System Property
+ SystemProperties.set(DEVELOPMENT_FORCE_RTL, forceRtl ? "1":"0");
+
+ final Configuration configuration = new Configuration();
+ Settings.System.getConfiguration(resolver, configuration);
+ if (forceRtl) {
+ // This will take care of setting the correct layout direction flags
+ configuration.setLayoutDirection(configuration.locale);
+ }
+
+ synchronized (mGlobalLock) {
+ mForceResizableActivities = forceResizable;
+ final boolean multiWindowFormEnabled = freeformWindowManagement
+ || supportsSplitScreenMultiWindow
+ || supportsPictureInPicture
+ || supportsMultiDisplay;
+ if ((supportsMultiWindow || forceResizable) && multiWindowFormEnabled) {
+ mSupportsMultiWindow = true;
+ mSupportsFreeformWindowManagement = freeformWindowManagement;
+ mSupportsSplitScreenMultiWindow = supportsSplitScreenMultiWindow;
+ mSupportsPictureInPicture = supportsPictureInPicture;
+ mSupportsMultiDisplay = supportsMultiDisplay;
+ } else {
+ mSupportsMultiWindow = false;
+ mSupportsFreeformWindowManagement = false;
+ mSupportsSplitScreenMultiWindow = false;
+ mSupportsPictureInPicture = false;
+ mSupportsMultiDisplay = false;
+ }
+ mWindowManager.setForceResizableTasks(mForceResizableActivities);
+ mWindowManager.setSupportsPictureInPicture(mSupportsPictureInPicture);
+ // This happens before any activities are started, so we can change global configuration
+ // in-place.
+ updateConfigurationLocked(configuration, null, true);
+ final Configuration globalConfig = getGlobalConfiguration();
+ if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Initial config: " + globalConfig);
+
+ // Load resources only after the current configuration has been set.
+ final Resources res = mContext.getResources();
+ mThumbnailWidth = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.thumbnail_width);
+ mThumbnailHeight = res.getDimensionPixelSize(
+ com.android.internal.R.dimen.thumbnail_height);
+
+ if ((globalConfig.uiMode & UI_MODE_TYPE_TELEVISION) == UI_MODE_TYPE_TELEVISION) {
+ mFullscreenThumbnailScale = (float) res
+ .getInteger(com.android.internal.R.integer.thumbnail_width_tv) /
+ (float) globalConfig.screenWidthDp;
+ } else {
+ mFullscreenThumbnailScale = res.getFraction(
+ com.android.internal.R.fraction.thumbnail_fullscreen_scale, 1, 1);
+ }
+ }
+ }
+
+ // TODO: Will be converted to WM lock once transition is complete.
+ void setActivityManagerService(ActivityManagerService am) {
+ mAm = am;
+ mGlobalLock = mAm;
+ mH = new H(mAm.mHandlerThread.getLooper());
+ mUiHandler = new UiHandler();
+
+ mTempConfig.setToDefaults();
+ mTempConfig.setLocales(LocaleList.getDefault());
+ mConfigurationSeq = mTempConfig.seq = 1;
+ mStackSupervisor = createStackSupervisor();
+ mStackSupervisor.onConfigurationChanged(mTempConfig);
+
+ mTaskChangeNotificationController =
+ new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH);
+ mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
+ mActivityStartController = new ActivityStartController(this);
+ mRecentTasks = createRecentTasks();
+ mStackSupervisor.setRecentTasks(mRecentTasks);
+ mVrController = new VrController(mGlobalLock);
+ mKeyguardController = mStackSupervisor.getKeyguardController();
+ }
+
+ void onActivityManagerInternalAdded() {
+ mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
+ }
+
+ protected ActivityStackSupervisor createStackSupervisor() {
+ final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mH.getLooper());
+ supervisor.initialize();
+ return supervisor;
+ }
+
+ void setWindowManager(WindowManagerService wm) {
+ mWindowManager = wm;
+ mLockTaskController.setWindowManager(wm);
+ }
+
+ UserManagerService getUserManager() {
+ if (mUserManager == null) {
+ IBinder b = ServiceManager.getService(Context.USER_SERVICE);
+ mUserManager = (UserManagerService) IUserManager.Stub.asInterface(b);
+ }
+ return mUserManager;
+ }
+
+ AppOpsService getAppOpsService() {
+ if (mAppOpsService == null) {
+ IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE);
+ mAppOpsService = (AppOpsService) IAppOpsService.Stub.asInterface(b);
+ }
+ return mAppOpsService;
+ }
+
+ boolean hasUserRestriction(String restriction, int userId) {
+ return getUserManager().hasUserRestriction(restriction, userId);
+ }
+
+ protected RecentTasks createRecentTasks() {
+ return new RecentTasks(this, mStackSupervisor);
+ }
+
+ RecentTasks getRecentTasks() {
+ return mRecentTasks;
+ }
+
+ ClientLifecycleManager getLifecycleManager() {
+ return mLifecycleManager;
+ }
+
+ ActivityStartController getActivityStartController() {
+ return mActivityStartController;
+ }
+
+ TaskChangeNotificationController getTaskChangeNotificationController() {
+ return mTaskChangeNotificationController;
+ }
+
+ LockTaskController getLockTaskController() {
+ return mLockTaskController;
+ }
+
+ private void start() {
+ LocalServices.addService(ActivityTaskManagerInternal.class, new LocalService());
+ }
+
+ public static final class Lifecycle extends SystemService {
+ private final ActivityTaskManagerService mService;
+
+ public Lifecycle(Context context) {
+ super(context);
+ mService = new ActivityTaskManagerService(context);
+ }
+
+ @Override
+ public void onStart() {
+ publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
+ mService.start();
+ }
+
+ public ActivityTaskManagerService getService() {
+ return mService;
+ }
+ }
+
+ @Override
+ public final int startActivity(IApplicationThread caller, String callingPackage,
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
+ return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
+ resultWho, requestCode, startFlags, profilerInfo, bOptions,
+ UserHandle.getCallingUserId());
+ }
+
+ @Override
+ public final int startActivities(IApplicationThread caller, String callingPackage,
+ Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions,
+ int userId) {
+ final String reason = "startActivities";
+ enforceNotIsolatedCaller(reason);
+ userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, reason);
+ // TODO: Switch to user app stacks here.
+ return getActivityStartController().startActivities(caller, -1, callingPackage, intents,
+ resolvedTypes, resultTo, SafeActivityOptions.fromBundle(bOptions), userId, reason);
+ }
+
+ @Override
+ public int startActivityAsUser(IApplicationThread caller, String callingPackage,
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
+ return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
+ resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
+ true /*validateIncomingUser*/);
+ }
+
+ int startActivityAsUser(IApplicationThread caller, String callingPackage,
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
+ boolean validateIncomingUser) {
+ enforceNotIsolatedCaller("startActivityAsUser");
+
+ userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
+ Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
+
+ // TODO: Switch to user app stacks here.
+ return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
+ .setCaller(caller)
+ .setCallingPackage(callingPackage)
+ .setResolvedType(resolvedType)
+ .setResultTo(resultTo)
+ .setResultWho(resultWho)
+ .setRequestCode(requestCode)
+ .setStartFlags(startFlags)
+ .setProfilerInfo(profilerInfo)
+ .setActivityOptions(bOptions)
+ .setMayWait(userId)
+ .execute();
+
+ }
+
+ @Override
+ public int startActivityIntentSender(IApplicationThread caller, IIntentSender target,
+ IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo,
+ String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions) {
+ enforceNotIsolatedCaller("startActivityIntentSender");
+ // Refuse possible leaked file descriptors
+ if (fillInIntent != null && fillInIntent.hasFileDescriptors()) {
+ throw new IllegalArgumentException("File descriptors passed in Intent");
+ }
+
+ if (!(target instanceof PendingIntentRecord)) {
+ throw new IllegalArgumentException("Bad PendingIntent object");
+ }
+
+ PendingIntentRecord pir = (PendingIntentRecord)target;
+
+ synchronized (mGlobalLock) {
+ // If this is coming from the currently resumed activity, it is
+ // effectively saying that app switches are allowed at this point.
+ final ActivityStack stack = getFocusedStack();
+ if (stack.mResumedActivity != null &&
+ stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) {
+ mAppSwitchesAllowedTime = 0;
+ }
+ }
+ return pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null,
+ resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions);
+ }
+
+ @Override
+ public boolean startNextMatchingActivity(IBinder callingActivity, Intent intent,
+ Bundle bOptions) {
+ // Refuse possible leaked file descriptors
+ if (intent != null && intent.hasFileDescriptors()) {
+ throw new IllegalArgumentException("File descriptors passed in Intent");
+ }
+ SafeActivityOptions options = SafeActivityOptions.fromBundle(bOptions);
+
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(callingActivity);
+ if (r == null) {
+ SafeActivityOptions.abort(options);
+ return false;
+ }
+ if (!r.attachedToProcess()) {
+ // The caller is not running... d'oh!
+ SafeActivityOptions.abort(options);
+ return false;
+ }
+ intent = new Intent(intent);
+ // The caller is not allowed to change the data.
+ intent.setDataAndType(r.intent.getData(), r.intent.getType());
+ // And we are resetting to find the next component...
+ intent.setComponent(null);
+
+ final boolean debug = ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);
+
+ ActivityInfo aInfo = null;
+ try {
+ List<ResolveInfo> resolves =
+ AppGlobals.getPackageManager().queryIntentActivities(
+ intent, r.resolvedType,
+ PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS,
+ UserHandle.getCallingUserId()).getList();
+
+ // Look for the original activity in the list...
+ final int N = resolves != null ? resolves.size() : 0;
+ for (int i=0; i<N; i++) {
+ ResolveInfo rInfo = resolves.get(i);
+ if (rInfo.activityInfo.packageName.equals(r.packageName)
+ && rInfo.activityInfo.name.equals(r.info.name)) {
+ // We found the current one... the next matching is
+ // after it.
+ i++;
+ if (i<N) {
+ aInfo = resolves.get(i).activityInfo;
+ }
+ if (debug) {
+ Slog.v(TAG, "Next matching activity: found current " + r.packageName
+ + "/" + r.info.name);
+ Slog.v(TAG, "Next matching activity: next is " + ((aInfo == null)
+ ? "null" : aInfo.packageName + "/" + aInfo.name));
+ }
+ break;
+ }
+ }
+ } catch (RemoteException e) {
+ }
+
+ if (aInfo == null) {
+ // Nobody who is next!
+ SafeActivityOptions.abort(options);
+ if (debug) Slog.d(TAG, "Next matching activity: nothing found");
+ return false;
+ }
+
+ intent.setComponent(new ComponentName(
+ aInfo.applicationInfo.packageName, aInfo.name));
+ intent.setFlags(intent.getFlags()&~(
+ Intent.FLAG_ACTIVITY_FORWARD_RESULT|
+ Intent.FLAG_ACTIVITY_CLEAR_TOP|
+ Intent.FLAG_ACTIVITY_MULTIPLE_TASK|
+ FLAG_ACTIVITY_NEW_TASK));
+
+ // Okay now we need to start the new activity, replacing the currently running activity.
+ // This is a little tricky because we want to start the new one as if the current one is
+ // finished, but not finish the current one first so that there is no flicker.
+ // And thus...
+ final boolean wasFinishing = r.finishing;
+ r.finishing = true;
+
+ // Propagate reply information over to the new activity.
+ final ActivityRecord resultTo = r.resultTo;
+ final String resultWho = r.resultWho;
+ final int requestCode = r.requestCode;
+ r.resultTo = null;
+ if (resultTo != null) {
+ resultTo.removeResultsLocked(r, resultWho, requestCode);
+ }
+
+ final long origId = Binder.clearCallingIdentity();
+ // TODO(b/64750076): Check if calling pid should really be -1.
+ final int res = getActivityStartController()
+ .obtainStarter(intent, "startNextMatchingActivity")
+ .setCaller(r.app.getThread())
+ .setResolvedType(r.resolvedType)
+ .setActivityInfo(aInfo)
+ .setResultTo(resultTo != null ? resultTo.appToken : null)
+ .setResultWho(resultWho)
+ .setRequestCode(requestCode)
+ .setCallingPid(-1)
+ .setCallingUid(r.launchedFromUid)
+ .setCallingPackage(r.launchedFromPackage)
+ .setRealCallingPid(-1)
+ .setRealCallingUid(r.launchedFromUid)
+ .setActivityOptions(options)
+ .execute();
+ Binder.restoreCallingIdentity(origId);
+
+ r.finishing = wasFinishing;
+ if (res != ActivityManager.START_SUCCESS) {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ @Override
+ public final WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage,
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {
+ final WaitResult res = new WaitResult();
+ synchronized (mGlobalLock) {
+ enforceNotIsolatedCaller("startActivityAndWait");
+ userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+ userId, "startActivityAndWait");
+ // TODO: Switch to user app stacks here.
+ getActivityStartController().obtainStarter(intent, "startActivityAndWait")
+ .setCaller(caller)
+ .setCallingPackage(callingPackage)
+ .setResolvedType(resolvedType)
+ .setResultTo(resultTo)
+ .setResultWho(resultWho)
+ .setRequestCode(requestCode)
+ .setStartFlags(startFlags)
+ .setActivityOptions(bOptions)
+ .setMayWait(userId)
+ .setProfilerInfo(profilerInfo)
+ .setWaitResult(res)
+ .execute();
+ }
+ return res;
+ }
+
+ @Override
+ public final int startActivityWithConfig(IApplicationThread caller, String callingPackage,
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, Configuration config, Bundle bOptions, int userId) {
+ synchronized (mGlobalLock) {
+ enforceNotIsolatedCaller("startActivityWithConfig");
+ userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
+ "startActivityWithConfig");
+ // TODO: Switch to user app stacks here.
+ return getActivityStartController().obtainStarter(intent, "startActivityWithConfig")
+ .setCaller(caller)
+ .setCallingPackage(callingPackage)
+ .setResolvedType(resolvedType)
+ .setResultTo(resultTo)
+ .setResultWho(resultWho)
+ .setRequestCode(requestCode)
+ .setStartFlags(startFlags)
+ .setGlobalConfiguration(config)
+ .setActivityOptions(bOptions)
+ .setMayWait(userId)
+ .execute();
+ }
+ }
+
+ @Override
+ public final int startActivityAsCaller(IApplicationThread caller, String callingPackage,
+ Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
+ int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, boolean ignoreTargetSecurity,
+ int userId) {
+
+ // This is very dangerous -- it allows you to perform a start activity (including
+ // permission grants) as any app that may launch one of your own activities. So
+ // we will only allow this to be done from activities that are part of the core framework,
+ // and then only when they are running as the system.
+ final ActivityRecord sourceRecord;
+ final int targetUid;
+ final String targetPackage;
+ final boolean isResolver;
+ synchronized (mGlobalLock) {
+ if (resultTo == null) {
+ throw new SecurityException("Must be called from an activity");
+ }
+ sourceRecord = mStackSupervisor.isInAnyStackLocked(resultTo);
+ if (sourceRecord == null) {
+ throw new SecurityException("Called with bad activity token: " + resultTo);
+ }
+ if (!sourceRecord.info.packageName.equals("android")) {
+ throw new SecurityException(
+ "Must be called from an activity that is declared in the android package");
+ }
+ if (sourceRecord.app == null) {
+ throw new SecurityException("Called without a process attached to activity");
+ }
+ if (UserHandle.getAppId(sourceRecord.app.mUid) != SYSTEM_UID) {
+ // This is still okay, as long as this activity is running under the
+ // uid of the original calling activity.
+ if (sourceRecord.app.mUid != sourceRecord.launchedFromUid) {
+ throw new SecurityException(
+ "Calling activity in uid " + sourceRecord.app.mUid
+ + " must be system uid or original calling uid "
+ + sourceRecord.launchedFromUid);
+ }
+ }
+ if (ignoreTargetSecurity) {
+ if (intent.getComponent() == null) {
+ throw new SecurityException(
+ "Component must be specified with ignoreTargetSecurity");
+ }
+ if (intent.getSelector() != null) {
+ throw new SecurityException(
+ "Selector not allowed with ignoreTargetSecurity");
+ }
+ }
+ targetUid = sourceRecord.launchedFromUid;
+ targetPackage = sourceRecord.launchedFromPackage;
+ isResolver = sourceRecord.isResolverOrChildActivity();
+ }
+
+ if (userId == UserHandle.USER_NULL) {
+ userId = UserHandle.getUserId(sourceRecord.app.mUid);
+ }
+
+ // TODO: Switch to user app stacks here.
+ try {
+ return getActivityStartController().obtainStarter(intent, "startActivityAsCaller")
+ .setCallingUid(targetUid)
+ .setCallingPackage(targetPackage)
+ .setResolvedType(resolvedType)
+ .setResultTo(resultTo)
+ .setResultWho(resultWho)
+ .setRequestCode(requestCode)
+ .setStartFlags(startFlags)
+ .setActivityOptions(bOptions)
+ .setMayWait(userId)
+ .setIgnoreTargetSecurity(ignoreTargetSecurity)
+ .setFilterCallingUid(isResolver ? 0 /* system */ : targetUid)
+ .execute();
+ } catch (SecurityException e) {
+ // XXX need to figure out how to propagate to original app.
+ // A SecurityException here is generally actually a fault of the original
+ // calling activity (such as a fairly granting permissions), so propagate it
+ // back to them.
+ /*
+ StringBuilder msg = new StringBuilder();
+ msg.append("While launching");
+ msg.append(intent.toString());
+ msg.append(": ");
+ msg.append(e.getMessage());
+ */
+ throw e;
+ }
+ }
+
+ int handleIncomingUser(int callingPid, int callingUid, int userId, String name) {
+ return mAmInternal.handleIncomingUser(callingPid, callingUid, userId, false /* allowAll */,
+ ALLOW_FULL_ONLY, name, null /* callerPackage */);
+ }
+
+ @Override
+ public int startVoiceActivity(String callingPackage, int callingPid, int callingUid,
+ Intent intent, String resolvedType, IVoiceInteractionSession session,
+ IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo,
+ Bundle bOptions, int userId) {
+ mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startVoiceActivity()");
+ if (session == null || interactor == null) {
+ throw new NullPointerException("null session or interactor");
+ }
+ userId = handleIncomingUser(callingPid, callingUid, userId, "startVoiceActivity");
+ // TODO: Switch to user app stacks here.
+ return getActivityStartController().obtainStarter(intent, "startVoiceActivity")
+ .setCallingUid(callingUid)
+ .setCallingPackage(callingPackage)
+ .setResolvedType(resolvedType)
+ .setVoiceSession(session)
+ .setVoiceInteractor(interactor)
+ .setStartFlags(startFlags)
+ .setProfilerInfo(profilerInfo)
+ .setActivityOptions(bOptions)
+ .setMayWait(userId)
+ .execute();
+ }
+
+ @Override
+ public int startAssistantActivity(String callingPackage, int callingPid, int callingUid,
+ Intent intent, String resolvedType, Bundle bOptions, int userId) {
+ mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startAssistantActivity()");
+ userId = handleIncomingUser(callingPid, callingUid, userId, "startAssistantActivity");
+
+ return getActivityStartController().obtainStarter(intent, "startAssistantActivity")
+ .setCallingUid(callingUid)
+ .setCallingPackage(callingPackage)
+ .setResolvedType(resolvedType)
+ .setActivityOptions(bOptions)
+ .setMayWait(userId)
+ .execute();
+ }
+
+ @Override
+ public void startRecentsActivity(Intent intent, IAssistDataReceiver assistDataReceiver,
+ IRecentsAnimationRunner recentsAnimationRunner) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()");
+ final int callingPid = Binder.getCallingPid();
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ComponentName recentsComponent = mRecentTasks.getRecentsComponent();
+ final int recentsUid = mRecentTasks.getRecentsComponentUid();
+
+ // Start a new recents animation
+ final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor,
+ getActivityStartController(), mWindowManager, callingPid);
+ anim.startRecentsActivity(intent, recentsAnimationRunner, recentsComponent,
+ recentsUid, assistDataReceiver);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public final int startActivityFromRecents(int taskId, Bundle bOptions) {
+ enforceCallerIsRecentsOrHasPermission(START_TASKS_FROM_RECENTS,
+ "startActivityFromRecents()");
+
+ final int callingPid = Binder.getCallingPid();
+ final int callingUid = Binder.getCallingUid();
+ final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(bOptions);
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ return mStackSupervisor.startActivityFromRecents(callingPid, callingUid, taskId,
+ safeOptions);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ /**
+ * This is the internal entry point for handling Activity.finish().
+ *
+ * @param token The Binder token referencing the Activity we want to finish.
+ * @param resultCode Result code, if any, from this Activity.
+ * @param resultData Result data (Intent), if any, from this Activity.
+ * @param finishTask Whether to finish the task associated with this Activity.
+ *
+ * @return Returns true if the activity successfully finished, or false if it is still running.
+ */
+ @Override
+ public final boolean finishActivity(IBinder token, int resultCode, Intent resultData,
+ int finishTask) {
+ // Refuse possible leaked file descriptors
+ if (resultData != null && resultData.hasFileDescriptors()) {
+ throw new IllegalArgumentException("File descriptors passed in Intent");
+ }
+
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return true;
+ }
+ // Keep track of the root activity of the task before we finish it
+ TaskRecord tr = r.getTask();
+ ActivityRecord rootR = tr.getRootActivity();
+ if (rootR == null) {
+ Slog.w(TAG, "Finishing task with all activities already finished");
+ }
+ // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps can
+ // finish.
+ if (getLockTaskController().activityBlockedFromFinish(r)) {
+ return false;
+ }
+
+ // TODO: There is a dup. of this block of code in ActivityStack.navigateUpToLocked
+ // We should consolidate.
+ if (mController != null) {
+ // Find the first activity that is not finishing.
+ ActivityRecord next = r.getStack().topRunningActivityLocked(token, 0);
+ if (next != null) {
+ // ask watcher if this is allowed
+ boolean resumeOK = true;
+ try {
+ resumeOK = mController.activityResuming(next.packageName);
+ } catch (RemoteException e) {
+ mController = null;
+ Watchdog.getInstance().setActivityController(null);
+ }
+
+ if (!resumeOK) {
+ Slog.i(TAG, "Not finishing activity because controller resumed");
+ return false;
+ }
+ }
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ boolean res;
+ final boolean finishWithRootActivity =
+ finishTask == Activity.FINISH_TASK_WITH_ROOT_ACTIVITY;
+ if (finishTask == Activity.FINISH_TASK_WITH_ACTIVITY
+ || (finishWithRootActivity && r == rootR)) {
+ // If requested, remove the task that is associated to this activity only if it
+ // was the root activity in the task. The result code and data is ignored
+ // because we don't support returning them across task boundaries. Also, to
+ // keep backwards compatibility we remove the task from recents when finishing
+ // task with root activity.
+ res = mStackSupervisor.removeTaskByIdLocked(tr.taskId, false,
+ finishWithRootActivity, "finish-activity");
+ if (!res) {
+ Slog.i(TAG, "Removing task failed to finish activity");
+ }
+ } else {
+ res = tr.getStack().requestFinishActivityLocked(token, resultCode,
+ resultData, "app-request", true);
+ if (!res) {
+ Slog.i(TAG, "Failed to finish by app-request");
+ }
+ }
+ return res;
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public boolean finishActivityAffinity(IBinder token) {
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return false;
+ }
+
+ // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps
+ // can finish.
+ final TaskRecord task = r.getTask();
+ if (getLockTaskController().activityBlockedFromFinish(r)) {
+ return false;
+ }
+ return task.getStack().finishActivityAffinityLocked(r);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public final void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ WindowProcessController proc = null;
+ synchronized (mGlobalLock) {
+ ActivityStack stack = ActivityRecord.getStackLocked(token);
+ if (stack == null) {
+ return;
+ }
+ final ActivityRecord r = mStackSupervisor.activityIdleInternalLocked(token,
+ false /* fromTimeout */, false /* processPausingActivities */, config);
+ if (r != null) {
+ proc = r.app;
+ }
+ if (stopProfiling && proc != null) {
+ proc.clearProfilerIfNeeded();
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public final void activityResumed(IBinder token) {
+ final long origId = Binder.clearCallingIdentity();
+ synchronized (mGlobalLock) {
+ ActivityRecord.activityResumedLocked(token);
+ mWindowManager.notifyAppResumedFinished(token);
+ }
+ Binder.restoreCallingIdentity(origId);
+ }
+
+ @Override
+ public final void activityPaused(IBinder token) {
+ final long origId = Binder.clearCallingIdentity();
+ synchronized (mGlobalLock) {
+ ActivityStack stack = ActivityRecord.getStackLocked(token);
+ if (stack != null) {
+ stack.activityPausedLocked(token, false);
+ }
+ }
+ Binder.restoreCallingIdentity(origId);
+ }
+
+ @Override
+ public final void activityStopped(IBinder token, Bundle icicle,
+ PersistableBundle persistentState, CharSequence description) {
+ if (DEBUG_ALL) Slog.v(TAG, "Activity stopped: token=" + token);
+
+ // Refuse possible leaked file descriptors
+ if (icicle != null && icicle.hasFileDescriptors()) {
+ throw new IllegalArgumentException("File descriptors passed in Bundle");
+ }
+
+ final long origId = Binder.clearCallingIdentity();
+
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r != null) {
+ r.activityStoppedLocked(icicle, persistentState, description);
+ }
+ }
+
+ mAmInternal.trimApplications();
+
+ Binder.restoreCallingIdentity(origId);
+ }
+
+ @Override
+ public final void activityDestroyed(IBinder token) {
+ if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "ACTIVITY DESTROYED: " + token);
+ synchronized (mGlobalLock) {
+ ActivityStack stack = ActivityRecord.getStackLocked(token);
+ if (stack != null) {
+ stack.activityDestroyedLocked(token, "activityDestroyed");
+ }
+ }
+ }
+
+ @Override
+ public final void activityRelaunched(IBinder token) {
+ final long origId = Binder.clearCallingIdentity();
+ synchronized (mGlobalLock) {
+ mStackSupervisor.activityRelaunchedLocked(token);
+ }
+ Binder.restoreCallingIdentity(origId);
+ }
+
+ public final void activitySlept(IBinder token) {
+ if (DEBUG_ALL) Slog.v(TAG, "Activity slept: token=" + token);
+
+ final long origId = Binder.clearCallingIdentity();
+
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r != null) {
+ mStackSupervisor.activitySleptLocked(r);
+ }
+ }
+
+ Binder.restoreCallingIdentity(origId);
+ }
+
+ @Override
+ public void setRequestedOrientation(IBinder token, int requestedOrientation) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ r.setRequestedOrientation(requestedOrientation);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public int getRequestedOrientation(IBinder token) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
+ }
+ return r.getRequestedOrientation();
+ }
+ }
+
+ @Override
+ public void setImmersive(IBinder token, boolean immersive) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ throw new IllegalArgumentException();
+ }
+ r.immersive = immersive;
+
+ // update associated state if we're frontmost
+ if (r == mStackSupervisor.getResumedActivityLocked()) {
+ if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r);
+ applyUpdateLockStateLocked(r);
+ }
+ }
+ }
+
+ void applyUpdateLockStateLocked(ActivityRecord r) {
+ // Modifications to the UpdateLock state are done on our handler, outside
+ // the activity manager's locks. The new state is determined based on the
+ // state *now* of the relevant activity record. The object is passed to
+ // the handler solely for logging detail, not to be consulted/modified.
+ final boolean nextState = r != null && r.immersive;
+ mH.post(() -> {
+ if (mUpdateLock.isHeld() != nextState) {
+ if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE,
+ "Applying new update lock state '" + nextState + "' for " + r);
+ if (nextState) {
+ mUpdateLock.acquire();
+ } else {
+ mUpdateLock.release();
+ }
+ }
+ });
+ }
+
+ @Override
+ public boolean isImmersive(IBinder token) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ throw new IllegalArgumentException();
+ }
+ return r.immersive;
+ }
+ }
+
+ @Override
+ public boolean isTopActivityImmersive() {
+ enforceNotIsolatedCaller("isTopActivityImmersive");
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = getFocusedStack().topRunningActivityLocked();
+ return (r != null) ? r.immersive : false;
+ }
+ }
+
+ @Override
+ public void overridePendingTransition(IBinder token, String packageName,
+ int enterAnim, int exitAnim) {
+ synchronized (mGlobalLock) {
+ ActivityRecord self = ActivityRecord.isInStackLocked(token);
+ if (self == null) {
+ return;
+ }
+
+ final long origId = Binder.clearCallingIdentity();
+
+ if (self.isState(
+ ActivityStack.ActivityState.RESUMED, ActivityStack.ActivityState.PAUSING)) {
+ mWindowManager.overridePendingAppTransition(packageName,
+ enterAnim, exitAnim, null);
+ }
+
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public int getFrontActivityScreenCompatMode() {
+ enforceNotIsolatedCaller("getFrontActivityScreenCompatMode");
+ ApplicationInfo ai;
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = getFocusedStack().topRunningActivityLocked();
+ if (r == null) {
+ return ActivityManager.COMPAT_MODE_UNKNOWN;
+ }
+ ai = r.info.applicationInfo;
+ }
+
+ return mAmInternal.getPackageScreenCompatMode(ai);
+ }
+
+ @Override
+ public void setFrontActivityScreenCompatMode(int mode) {
+ mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
+ "setFrontActivityScreenCompatMode");
+ ApplicationInfo ai;
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = getFocusedStack().topRunningActivityLocked();
+ if (r == null) {
+ Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity");
+ return;
+ }
+ ai = r.info.applicationInfo;
+ }
+
+ mAmInternal.setPackageScreenCompatMode(ai, mode);
+ }
+
+ @Override
+ public int getLaunchedFromUid(IBinder activityToken) {
+ ActivityRecord srec;
+ synchronized (mGlobalLock) {
+ srec = ActivityRecord.forTokenLocked(activityToken);
+ }
+ if (srec == null) {
+ return -1;
+ }
+ return srec.launchedFromUid;
+ }
+
+ @Override
+ public String getLaunchedFromPackage(IBinder activityToken) {
+ ActivityRecord srec;
+ synchronized (mGlobalLock) {
+ srec = ActivityRecord.forTokenLocked(activityToken);
+ }
+ if (srec == null) {
+ return null;
+ }
+ return srec.launchedFromPackage;
+ }
+
+ @Override
+ public boolean convertFromTranslucent(IBinder token) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return false;
+ }
+ final boolean translucentChanged = r.changeWindowTranslucency(true);
+ if (translucentChanged) {
+ mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
+ }
+ mWindowManager.setAppFullscreen(token, true);
+ return translucentChanged;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public boolean convertToTranslucent(IBinder token, Bundle options) {
+ SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(options);
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return false;
+ }
+ final TaskRecord task = r.getTask();
+ int index = task.mActivities.lastIndexOf(r);
+ if (index > 0) {
+ ActivityRecord under = task.mActivities.get(index - 1);
+ under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
+ }
+ final boolean translucentChanged = r.changeWindowTranslucency(false);
+ if (translucentChanged) {
+ r.getStack().convertActivityToTranslucent(r);
+ }
+ mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
+ mWindowManager.setAppFullscreen(token, false);
+ return translucentChanged;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public void notifyActivityDrawn(IBinder token) {
+ if (DEBUG_VISIBILITY) Slog.d(TAG_VISIBILITY, "notifyActivityDrawn: token=" + token);
+ synchronized (mGlobalLock) {
+ ActivityRecord r = mStackSupervisor.isInAnyStackLocked(token);
+ if (r != null) {
+ r.getStack().notifyActivityDrawnLocked(r);
+ }
+ }
+ }
+
+ @Override
+ public void reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return;
+ }
+ r.reportFullyDrawnLocked(restoredFromBundle);
+ }
+ }
+
+ @Override
+ public int getActivityDisplayId(IBinder activityToken) throws RemoteException {
+ synchronized (mGlobalLock) {
+ final ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
+ if (stack != null && stack.mDisplayId != INVALID_DISPLAY) {
+ return stack.mDisplayId;
+ }
+ return DEFAULT_DISPLAY;
+ }
+ }
+
+ @Override
+ public ActivityManager.StackInfo getFocusedStackInfo() throws RemoteException {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ ActivityStack focusedStack = getFocusedStack();
+ if (focusedStack != null) {
+ return mStackSupervisor.getStackInfo(focusedStack.mStackId);
+ }
+ return null;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public void setFocusedStack(int stackId) {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedStack()");
+ if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedStack: stackId=" + stackId);
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityStack stack = mStackSupervisor.getStack(stackId);
+ if (stack == null) {
+ Slog.w(TAG, "setFocusedStack: No stack with id=" + stackId);
+ return;
+ }
+ final ActivityRecord r = stack.topRunningActivityLocked();
+ if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(
+ r, "setFocusedStack")) {
+ mStackSupervisor.resumeFocusedStackTopActivityLocked();
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ }
+
+ @Override
+ public void setFocusedTask(int taskId) {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedTask()");
+ if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedTask: taskId=" + taskId);
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ if (task == null) {
+ return;
+ }
+ final ActivityRecord r = task.topRunningActivityLocked();
+ if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(r, "setFocusedTask")) {
+ mStackSupervisor.resumeFocusedStackTopActivityLocked();
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ }
+
+ @Override
+ public boolean removeTask(int taskId) {
+ enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeTask()");
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return mStackSupervisor.removeTaskByIdLocked(taskId, true, REMOVE_FROM_RECENTS,
+ "remove-task");
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public boolean shouldUpRecreateTask(IBinder token, String destAffinity) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord srec = ActivityRecord.forTokenLocked(token);
+ if (srec != null) {
+ return srec.getStack().shouldUpRecreateTaskLocked(srec, destAffinity);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean navigateUpTo(IBinder token, Intent destIntent, int resultCode,
+ Intent resultData) {
+
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ if (r != null) {
+ return r.getStack().navigateUpToLocked(r, destIntent, resultCode, resultData);
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Attempts to move a task backwards in z-order (the order of activities within the task is
+ * unchanged).
+ *
+ * There are several possible results of this call:
+ * - if the task is locked, then we will show the lock toast
+ * - if there is a task behind the provided task, then that task is made visible and resumed as
+ * this task is moved to the back
+ * - otherwise, if there are no other tasks in the stack:
+ * - if this task is in the pinned stack, then we remove the stack completely, which will
+ * have the effect of moving the task to the top or bottom of the fullscreen stack
+ * (depending on whether it is visible)
+ * - otherwise, we simply return home and hide this task
+ *
+ * @param token A reference to the activity we wish to move
+ * @param nonRoot If false then this only works if the activity is the root
+ * of a task; if true it will work for any activity in a task.
+ * @return Returns true if the move completed, false if not.
+ */
+ @Override
+ public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot) {
+ enforceNotIsolatedCaller("moveActivityTaskToBack");
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ int taskId = ActivityRecord.getTaskForActivityLocked(token, !nonRoot);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ if (task != null) {
+ return ActivityRecord.getStackLocked(token).moveTaskToBackLocked(taskId);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public Rect getTaskBounds(int taskId) {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "getTaskBounds()");
+ long ident = Binder.clearCallingIdentity();
+ Rect rect = new Rect();
+ try {
+ synchronized (mGlobalLock) {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
+ if (task == null) {
+ Slog.w(TAG, "getTaskBounds: taskId=" + taskId + " not found");
+ return rect;
+ }
+ if (task.getStack() != null) {
+ // Return the bounds from window manager since it will be adjusted for various
+ // things like the presense of a docked stack for tasks that aren't resizeable.
+ task.getWindowContainerBounds(rect);
+ } else {
+ // Task isn't in window manager yet since it isn't associated with a stack.
+ // Return the persist value from activity manager
+ if (!task.matchParentBounds()) {
+ rect.set(task.getBounds());
+ } else if (task.mLastNonFullscreenBounds != null) {
+ rect.set(task.mLastNonFullscreenBounds);
+ }
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ return rect;
+ }
+
+ @Override
+ public ActivityManager.TaskDescription getTaskDescription(int id) {
+ synchronized (mGlobalLock) {
+ enforceCallerIsRecentsOrHasPermission(
+ MANAGE_ACTIVITY_STACKS, "getTaskDescription()");
+ final TaskRecord tr = mStackSupervisor.anyTaskForIdLocked(id,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
+ if (tr != null) {
+ return tr.lastTaskDescription;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void setTaskWindowingMode(int taskId, int windowingMode, boolean toTop) {
+ if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
+ setTaskWindowingModeSplitScreenPrimary(taskId, SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT,
+ toTop, ANIMATE, null /* initialBounds */, true /* showRecents */);
+ return;
+ }
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setTaskWindowingMode()");
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ if (task == null) {
+ Slog.w(TAG, "setTaskWindowingMode: No task for id=" + taskId);
+ return;
+ }
+
+ if (DEBUG_STACK) Slog.d(TAG_STACK, "setTaskWindowingMode: moving task=" + taskId
+ + " to windowingMode=" + windowingMode + " toTop=" + toTop);
+
+ if (!task.isActivityTypeStandardOrUndefined()) {
+ throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
+ + " non-standard task " + taskId + " to windowing mode="
+ + windowingMode);
+ }
+
+ final ActivityStack stack = task.getStack();
+ if (toTop) {
+ stack.moveToFront("setTaskWindowingMode", task);
+ }
+ stack.setWindowingMode(windowingMode);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public String getCallingPackage(IBinder token) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = getCallingRecordLocked(token);
+ return r != null ? r.info.packageName : null;
+ }
+ }
+
+ @Override
+ public ComponentName getCallingActivity(IBinder token) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = getCallingRecordLocked(token);
+ return r != null ? r.intent.getComponent() : null;
+ }
+ }
+
+ private ActivityRecord getCallingRecordLocked(IBinder token) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return null;
+ }
+ return r.resultTo;
+ }
+
+ @Override
+ public void unhandledBack() {
+ mAmInternal.enforceCallingPermission(android.Manifest.permission.FORCE_BACK, "unhandledBack()");
+
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ getFocusedStack().unhandledBackLocked();
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ /**
+ * TODO: Add mController hook
+ */
+ @Override
+ public void moveTaskToFront(int taskId, int flags, Bundle bOptions) {
+ mAmInternal.enforceCallingPermission(android.Manifest.permission.REORDER_TASKS, "moveTaskToFront()");
+
+ if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToFront: moving taskId=" + taskId);
+ synchronized (mGlobalLock) {
+ moveTaskToFrontLocked(taskId, flags, SafeActivityOptions.fromBundle(bOptions),
+ false /* fromRecents */);
+ }
+ }
+
+ void moveTaskToFrontLocked(int taskId, int flags, SafeActivityOptions options,
+ boolean fromRecents) {
+
+ if (!checkAppSwitchAllowedLocked(Binder.getCallingPid(),
+ Binder.getCallingUid(), -1, -1, "Task to front")) {
+ SafeActivityOptions.abort(options);
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ if (task == null) {
+ Slog.d(TAG, "Could not find task for id: "+ taskId);
+ return;
+ }
+ if (getLockTaskController().isLockTaskModeViolation(task)) {
+ Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode");
+ return;
+ }
+ ActivityOptions realOptions = options != null
+ ? options.getOptions(mStackSupervisor)
+ : null;
+ mStackSupervisor.findTaskToMoveToFront(task, flags, realOptions, "moveTaskToFront",
+ false /* forceNonResizable */);
+
+ final ActivityRecord topActivity = task.getTopActivity();
+ if (topActivity != null) {
+
+ // We are reshowing a task, use a starting window to hide the initial draw delay
+ // so the transition can start earlier.
+ topActivity.showStartingWindow(null /* prev */, false /* newTask */,
+ true /* taskSwitch */, fromRecents);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ SafeActivityOptions.abort(options);
+ }
+
+ boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid,
+ int callingPid, int callingUid, String name) {
+ if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) {
+ return true;
+ }
+
+ if (getRecentTasks().isCallerRecents(sourceUid)) {
+ return true;
+ }
+
+ int perm = checkComponentPermission(STOP_APP_SWITCHES, sourcePid, sourceUid, -1, true);
+ if (perm == PackageManager.PERMISSION_GRANTED) {
+ return true;
+ }
+ if (checkAllowAppSwitchUid(sourceUid)) {
+ return true;
+ }
+
+ // If the actual IPC caller is different from the logical source, then
+ // also see if they are allowed to control app switches.
+ if (callingUid != -1 && callingUid != sourceUid) {
+ perm = checkComponentPermission(STOP_APP_SWITCHES, callingPid, callingUid, -1, true);
+ if (perm == PackageManager.PERMISSION_GRANTED) {
+ return true;
+ }
+ if (checkAllowAppSwitchUid(callingUid)) {
+ return true;
+ }
+ }
+
+ Slog.w(TAG, name + " request from " + sourceUid + " stopped");
+ return false;
+ }
+
+ private boolean checkAllowAppSwitchUid(int uid) {
+ ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(UserHandle.getUserId(uid));
+ if (types != null) {
+ for (int i = types.size() - 1; i >= 0; i--) {
+ if (types.valueAt(i).intValue() == uid) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void setActivityController(IActivityController controller, boolean imAMonkey) {
+ mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
+ "setActivityController()");
+ synchronized (mGlobalLock) {
+ mController = controller;
+ mControllerIsAMonkey = imAMonkey;
+ Watchdog.getInstance().setActivityController(controller);
+ }
+ }
+
+ boolean isControllerAMonkey() {
+ synchronized (mGlobalLock) {
+ return mController != null && mControllerIsAMonkey;
+ }
+ }
+
+ @Override
+ public int getTaskForActivity(IBinder token, boolean onlyRoot) {
+ synchronized (mGlobalLock) {
+ return ActivityRecord.getTaskForActivityLocked(token, onlyRoot);
+ }
+ }
+
+ @Override
+ public List<ActivityManager.RunningTaskInfo> getTasks(int maxNum) {
+ return getFilteredTasks(maxNum, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED);
+ }
+
+ @Override
+ public List<ActivityManager.RunningTaskInfo> getFilteredTasks(int maxNum,
+ @WindowConfiguration.ActivityType int ignoreActivityType,
+ @WindowConfiguration.WindowingMode int ignoreWindowingMode) {
+ final int callingUid = Binder.getCallingUid();
+ ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>();
+
+ synchronized (mGlobalLock) {
+ if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);
+
+ final boolean allowed = isGetTasksAllowed("getTasks", Binder.getCallingPid(),
+ callingUid);
+ mStackSupervisor.getRunningTasks(maxNum, list, ignoreActivityType,
+ ignoreWindowingMode, callingUid, allowed);
+ }
+
+ return list;
+ }
+
+ @Override
+ public final void finishSubActivity(IBinder token, String resultWho, int requestCode) {
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r != null) {
+ r.getStack().finishSubActivityLocked(r, resultWho, requestCode);
+ }
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public boolean willActivityBeVisible(IBinder token) {
+ synchronized (mGlobalLock) {
+ ActivityStack stack = ActivityRecord.getStackLocked(token);
+ if (stack != null) {
+ return stack.willActivityBeVisibleLocked(token);
+ }
+ return false;
+ }
+ }
+
+ @Override
+ public void moveTaskToStack(int taskId, int stackId, boolean toTop) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "moveTaskToStack()");
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ if (task == null) {
+ Slog.w(TAG, "moveTaskToStack: No task for id=" + taskId);
+ return;
+ }
+
+ if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToStack: moving task=" + taskId
+ + " to stackId=" + stackId + " toTop=" + toTop);
+
+ final ActivityStack stack = mStackSupervisor.getStack(stackId);
+ if (stack == null) {
+ throw new IllegalStateException(
+ "moveTaskToStack: No stack for stackId=" + stackId);
+ }
+ if (!stack.isActivityTypeStandardOrUndefined()) {
+ throw new IllegalArgumentException("moveTaskToStack: Attempt to move task "
+ + taskId + " to stack " + stackId);
+ }
+ if (stack.inSplitScreenPrimaryWindowingMode()) {
+ mWindowManager.setDockedStackCreateState(
+ SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT, null /* initialBounds */);
+ }
+ task.reparent(stack, toTop, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE, !DEFER_RESUME,
+ "moveTaskToStack");
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public void resizeStack(int stackId, Rect destBounds, boolean allowResizeInDockedMode,
+ boolean preserveWindows, boolean animate, int animationDuration) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeStack()");
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ if (animate) {
+ final PinnedActivityStack stack = mStackSupervisor.getStack(stackId);
+ if (stack == null) {
+ Slog.w(TAG, "resizeStack: stackId " + stackId + " not found.");
+ return;
+ }
+ if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) {
+ throw new IllegalArgumentException("Stack: " + stackId
+ + " doesn't support animated resize.");
+ }
+ stack.animateResizePinnedStack(null /* sourceHintBounds */, destBounds,
+ animationDuration, false /* fromFullscreen */);
+ } else {
+ final ActivityStack stack = mStackSupervisor.getStack(stackId);
+ if (stack == null) {
+ Slog.w(TAG, "resizeStack: stackId " + stackId + " not found.");
+ return;
+ }
+ mStackSupervisor.resizeStackLocked(stack, destBounds,
+ null /* tempTaskBounds */, null /* tempTaskInsetBounds */,
+ preserveWindows, allowResizeInDockedMode, !DEFER_RESUME);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * Moves the specified task to the primary-split-screen stack.
+ *
+ * @param taskId Id of task to move.
+ * @param createMode The mode the primary split screen stack should be created in if it doesn't
+ * exist already. See
+ * {@link android.app.ActivityTaskManager#SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT}
+ * and
+ * {@link android.app.ActivityTaskManager#SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT}
+ * @param toTop If the task and stack should be moved to the top.
+ * @param animate Whether we should play an animation for the moving the task.
+ * @param initialBounds If the primary stack gets created, it will use these bounds for the
+ * stack. Pass {@code null} to use default bounds.
+ * @param showRecents If the recents activity should be shown on the other side of the task
+ * going into split-screen mode.
+ */
+ @Override
+ public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode,
+ boolean toTop, boolean animate, Rect initialBounds, boolean showRecents) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
+ "setTaskWindowingModeSplitScreenPrimary()");
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ if (task == null) {
+ Slog.w(TAG, "setTaskWindowingModeSplitScreenPrimary: No task for id=" + taskId);
+ return false;
+ }
+ if (DEBUG_STACK) Slog.d(TAG_STACK,
+ "setTaskWindowingModeSplitScreenPrimary: moving task=" + taskId
+ + " to createMode=" + createMode + " toTop=" + toTop);
+ if (!task.isActivityTypeStandardOrUndefined()) {
+ throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
+ + " non-standard task " + taskId + " to split-screen windowing mode");
+ }
+
+ mWindowManager.setDockedStackCreateState(createMode, initialBounds);
+ final int windowingMode = task.getWindowingMode();
+ final ActivityStack stack = task.getStack();
+ if (toTop) {
+ stack.moveToFront("setTaskWindowingModeSplitScreenPrimary", task);
+ }
+ stack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, animate, showRecents,
+ false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */);
+ return windowingMode != task.getWindowingMode();
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ /**
+ * Removes stacks in the input windowing modes from the system if they are of activity type
+ * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
+ */
+ @Override
+ public void removeStacksInWindowingModes(int[] windowingModes) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
+ "removeStacksInWindowingModes()");
+
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mStackSupervisor.removeStacksInWindowingModes(windowingModes);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public void removeStacksWithActivityTypes(int[] activityTypes) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
+ "removeStacksWithActivityTypes()");
+
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mStackSupervisor.removeStacksWithActivityTypes(activityTypes);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags,
+ int userId) {
+ final int callingUid = Binder.getCallingUid();
+ userId = handleIncomingUser(Binder.getCallingPid(), callingUid, userId, "getRecentTasks");
+ final boolean allowed = isGetTasksAllowed("getRecentTasks", Binder.getCallingPid(),
+ callingUid);
+ final boolean detailed = checkGetTasksPermission(
+ android.Manifest.permission.GET_DETAILED_TASKS, Binder.getCallingPid(),
+ UserHandle.getAppId(callingUid))
+ == PackageManager.PERMISSION_GRANTED;
+
+ synchronized (mGlobalLock) {
+ return mRecentTasks.getRecentTasks(maxNum, flags, allowed, detailed, userId,
+ callingUid);
+ }
+ }
+
+ @Override
+ public List<ActivityManager.StackInfo> getAllStackInfos() {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ return mStackSupervisor.getAllStackInfosLocked();
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public ActivityManager.StackInfo getStackInfo(int windowingMode, int activityType) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ return mStackSupervisor.getStackInfo(windowingMode, activityType);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "cancelRecentsAnimation()");
+ final long callingUid = Binder.getCallingUid();
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ // Cancel the recents animation synchronously (do not hold the WM lock)
+ mWindowManager.cancelRecentsAnimationSynchronously(restoreHomeStackPosition
+ ? REORDER_MOVE_TO_ORIGINAL_POSITION
+ : REORDER_KEEP_IN_PLACE, "cancelRecentsAnimation/uid=" + callingUid);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public void startLockTaskModeByToken(IBinder token) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ if (r == null) {
+ return;
+ }
+ startLockTaskModeLocked(r.getTask(), false /* isSystemCaller */);
+ }
+ }
+
+ @Override
+ public void startSystemLockTaskMode(int taskId) throws RemoteException {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startSystemLockTaskMode");
+ // This makes inner call to look as if it was initiated by system.
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+
+ // When starting lock task mode the stack must be in front and focused
+ task.getStack().moveToFront("startSystemLockTaskMode");
+ startLockTaskModeLocked(task, true /* isSystemCaller */);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public void stopLockTaskModeByToken(IBinder token) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ if (r == null) {
+ return;
+ }
+ stopLockTaskModeInternal(r.getTask(), false /* isSystemCaller */);
+ }
+ }
+
+ /**
+ * This API should be called by SystemUI only when user perform certain action to dismiss
+ * lock task mode. We should only dismiss pinned lock task mode in this case.
+ */
+ @Override
+ public void stopSystemLockTaskMode() throws RemoteException {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "stopSystemLockTaskMode");
+ stopLockTaskModeInternal(null, true /* isSystemCaller */);
+ }
+
+ private void startLockTaskModeLocked(@Nullable TaskRecord task, boolean isSystemCaller) {
+ if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "startLockTaskModeLocked: " + task);
+ if (task == null || task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) {
+ return;
+ }
+
+ final ActivityStack stack = mStackSupervisor.getFocusedStack();
+ if (stack == null || task != stack.topTask()) {
+ throw new IllegalArgumentException("Invalid task, not in foreground");
+ }
+
+ // {@code isSystemCaller} is used to distinguish whether this request is initiated by the
+ // system or a specific app.
+ // * System-initiated requests will only start the pinned mode (screen pinning)
+ // * App-initiated requests
+ // - will put the device in fully locked mode (LockTask), if the app is whitelisted
+ // - will start the pinned mode, otherwise
+ final int callingUid = Binder.getCallingUid();
+ long ident = Binder.clearCallingIdentity();
+ try {
+ // When a task is locked, dismiss the pinned stack if it exists
+ mStackSupervisor.removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
+
+ getLockTaskController().startLockTaskMode(task, isSystemCaller, callingUid);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ private void stopLockTaskModeInternal(@Nullable TaskRecord task, boolean isSystemCaller) {
+ final int callingUid = Binder.getCallingUid();
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ getLockTaskController().stopLockTaskMode(task, isSystemCaller, callingUid);
+ }
+ // Launch in-call UI if a call is ongoing. This is necessary to allow stopping the lock
+ // task and jumping straight into a call in the case of emergency call back.
+ TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
+ if (tm != null) {
+ tm.showInCallScreen(false);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public boolean isInLockTaskMode() {
+ return getLockTaskModeState() != LOCK_TASK_MODE_NONE;
+ }
+
+ @Override
+ public int getLockTaskModeState() {
+ synchronized (mGlobalLock) {
+ return getLockTaskController().getLockTaskModeState();
+ }
+ }
+
+ @Override
+ public void setTaskDescription(IBinder token, ActivityManager.TaskDescription td) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r != null) {
+ r.setTaskDescription(td);
+ final TaskRecord task = r.getTask();
+ task.updateTaskDescription();
+ mTaskChangeNotificationController.notifyTaskDescriptionChanged(task.taskId, td);
+ }
+ }
+ }
+
+ @Override
+ public Bundle getActivityOptions(IBinder token) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r != null) {
+ final ActivityOptions activityOptions = r.takeOptionsLocked();
+ return activityOptions == null ? null : activityOptions.toBundle();
+ }
+ return null;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public List<IBinder> getAppTasks(String callingPackage) {
+ int callingUid = Binder.getCallingUid();
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ return mRecentTasks.getAppTasksList(callingUid, callingPackage);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public void finishVoiceTask(IVoiceInteractionSession session) {
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ // TODO: VI Consider treating local voice interactions and voice tasks
+ // differently here
+ mStackSupervisor.finishVoiceTask(session);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ }
+
+ @Override
+ public boolean isTopOfTask(IBinder token) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ throw new IllegalArgumentException();
+ }
+ return r.getTask().getTopActivity() == r;
+ }
+ }
+
+ @Override
+ public void notifyLaunchTaskBehindComplete(IBinder token) {
+ mStackSupervisor.scheduleLaunchTaskBehindComplete(token);
+ }
+
+ @Override
+ public void notifyEnterAnimationComplete(IBinder token) {
+ mH.post(() -> {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ if (r != null && r.attachedToProcess()) {
+ try {
+ r.app.getThread().scheduleEnterAnimationComplete(r.appToken);
+ } catch (RemoteException e) {
+ }
+ }
+ }
+
+ });
+ }
+
+ /** Called from an app when assist data is ready. */
+ @Override
+ public void reportAssistContextExtras(IBinder token, Bundle extras, AssistStructure structure,
+ AssistContent content, Uri referrer) {
+ PendingAssistExtras pae = (PendingAssistExtras) token;
+ synchronized (pae) {
+ pae.result = extras;
+ pae.structure = structure;
+ pae.content = content;
+ if (referrer != null) {
+ pae.extras.putParcelable(Intent.EXTRA_REFERRER, referrer);
+ }
+ if (structure != null) {
+ structure.setHomeActivity(pae.isHome);
+ }
+ pae.haveResult = true;
+ pae.notifyAll();
+ if (pae.intent == null && pae.receiver == null) {
+ // Caller is just waiting for the result.
+ return;
+ }
+ }
+ // We are now ready to launch the assist activity.
+ IAssistDataReceiver sendReceiver = null;
+ Bundle sendBundle = null;
+ synchronized (mGlobalLock) {
+ buildAssistBundleLocked(pae, extras);
+ boolean exists = mPendingAssistExtras.remove(pae);
+ mUiHandler.removeCallbacks(pae);
+ if (!exists) {
+ // Timed out.
+ return;
+ }
+
+ if ((sendReceiver = pae.receiver) != null) {
+ // Caller wants result sent back to them.
+ sendBundle = new Bundle();
+ sendBundle.putBundle(ASSIST_KEY_DATA, pae.extras);
+ sendBundle.putParcelable(ASSIST_KEY_STRUCTURE, pae.structure);
+ sendBundle.putParcelable(ASSIST_KEY_CONTENT, pae.content);
+ sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras);
+ }
+ }
+ if (sendReceiver != null) {
+ try {
+ sendReceiver.onHandleAssistData(sendBundle);
+ } catch (RemoteException e) {
+ }
+ return;
+ }
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ if (TextUtils.equals(pae.intent.getAction(),
+ android.service.voice.VoiceInteractionService.SERVICE_INTERFACE)) {
+ pae.intent.putExtras(pae.extras);
+ mContext.startServiceAsUser(pae.intent, new UserHandle(pae.userHandle));
+ } else {
+ pae.intent.replaceExtras(pae.extras);
+ pae.intent.setFlags(FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ mAmInternal.closeSystemDialogs("assist");
+
+ try {
+ mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle));
+ } catch (ActivityNotFoundException e) {
+ Slog.w(TAG, "No activity to handle assist action.", e);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public int addAppTask(IBinder activityToken, Intent intent,
+ ActivityManager.TaskDescription description, Bitmap thumbnail) throws RemoteException {
+ final int callingUid = Binder.getCallingUid();
+ final long callingIdent = Binder.clearCallingIdentity();
+
+ try {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
+ if (r == null) {
+ throw new IllegalArgumentException("Activity does not exist; token="
+ + activityToken);
+ }
+ ComponentName comp = intent.getComponent();
+ if (comp == null) {
+ throw new IllegalArgumentException("Intent " + intent
+ + " must specify explicit component");
+ }
+ if (thumbnail.getWidth() != mThumbnailWidth
+ || thumbnail.getHeight() != mThumbnailHeight) {
+ throw new IllegalArgumentException("Bad thumbnail size: got "
+ + thumbnail.getWidth() + "x" + thumbnail.getHeight() + ", require "
+ + mThumbnailWidth + "x" + mThumbnailHeight);
+ }
+ if (intent.getSelector() != null) {
+ intent.setSelector(null);
+ }
+ if (intent.getSourceBounds() != null) {
+ intent.setSourceBounds(null);
+ }
+ if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0) {
+ if ((intent.getFlags()&Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) == 0) {
+ // The caller has added this as an auto-remove task... that makes no
+ // sense, so turn off auto-remove.
+ intent.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
+ }
+ }
+ final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp,
+ STOCK_PM_FLAGS, UserHandle.getUserId(callingUid));
+ if (ainfo.applicationInfo.uid != callingUid) {
+ throw new SecurityException(
+ "Can't add task for another application: target uid="
+ + ainfo.applicationInfo.uid + ", calling uid=" + callingUid);
+ }
+
+ final ActivityStack stack = r.getStack();
+ final TaskRecord task = stack.createTaskRecord(
+ mStackSupervisor.getNextTaskIdForUserLocked(r.userId), ainfo, intent,
+ null /* voiceSession */, null /* voiceInteractor */, !ON_TOP);
+ if (!mRecentTasks.addToBottom(task)) {
+ // The app has too many tasks already and we can't add any more
+ stack.removeTask(task, "addAppTask", REMOVE_TASK_MODE_DESTROYING);
+ return INVALID_TASK_ID;
+ }
+ task.lastTaskDescription.copyFrom(description);
+
+ // TODO: Send the thumbnail to WM to store it.
+
+ return task.taskId;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingIdent);
+ }
+ }
+
+ @Override
+ public Point getAppTaskThumbnailSize() {
+ synchronized (mGlobalLock) {
+ return new Point(mThumbnailWidth, mThumbnailHeight);
+ }
+ }
+
+ @Override
+ public void setTaskResizeable(int taskId, int resizeableMode) {
+ synchronized (mGlobalLock) {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(
+ taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
+ if (task == null) {
+ Slog.w(TAG, "setTaskResizeable: taskId=" + taskId + " not found");
+ return;
+ }
+ task.setResizeMode(resizeableMode);
+ }
+ }
+
+ @Override
+ public void resizeTask(int taskId, Rect bounds, int resizeMode) {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "resizeTask()");
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ if (task == null) {
+ Slog.w(TAG, "resizeTask: taskId=" + taskId + " not found");
+ return;
+ }
+ // Place the task in the right stack if it isn't there already based on
+ // the requested bounds.
+ // The stack transition logic is:
+ // - a null bounds on a freeform task moves that task to fullscreen
+ // - a non-null bounds on a non-freeform (fullscreen OR docked) task moves
+ // that task to freeform
+ // - otherwise the task is not moved
+ ActivityStack stack = task.getStack();
+ if (!task.getWindowConfiguration().canResizeTask()) {
+ throw new IllegalArgumentException("resizeTask not allowed on task=" + task);
+ }
+ if (bounds == null && stack.getWindowingMode() == WINDOWING_MODE_FREEFORM) {
+ stack = stack.getDisplay().getOrCreateStack(
+ WINDOWING_MODE_FULLSCREEN, stack.getActivityType(), ON_TOP);
+ } else if (bounds != null && stack.getWindowingMode() != WINDOWING_MODE_FREEFORM) {
+ stack = stack.getDisplay().getOrCreateStack(
+ WINDOWING_MODE_FREEFORM, stack.getActivityType(), ON_TOP);
+ }
+
+ // Reparent the task to the right stack if necessary
+ boolean preserveWindow = (resizeMode & RESIZE_MODE_PRESERVE_WINDOW) != 0;
+ if (stack != task.getStack()) {
+ // Defer resume until the task is resized below
+ task.reparent(stack, ON_TOP, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE,
+ DEFER_RESUME, "resizeTask");
+ preserveWindow = false;
+ }
+
+ // After reparenting (which only resizes the task to the stack bounds), resize the
+ // task to the actual bounds provided
+ task.resize(bounds, resizeMode, preserveWindow, !DEFER_RESUME);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public boolean releaseActivityInstance(IBinder token) {
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return false;
+ }
+ return r.getStack().safelyDestroyActivityLocked(r, "app-req");
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public void releaseSomeActivities(IApplicationThread appInt) {
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ WindowProcessController app =
+ mAm.getRecordForAppLocked(appInt).getWindowProcessController();
+ mStackSupervisor.releaseSomeActivitiesLocked(app, "low-mem");
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public void setLockScreenShown(boolean keyguardShowing, boolean aodShowing,
+ int secondaryDisplayShowing) {
+ if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires permission "
+ + android.Manifest.permission.DEVICE_POWER);
+ }
+
+ synchronized (mGlobalLock) {
+ long ident = Binder.clearCallingIdentity();
+ if (mKeyguardShown != keyguardShowing) {
+ mKeyguardShown = keyguardShowing;
+ reportCurKeyguardUsageEventLocked(keyguardShowing);
+ }
+ try {
+ mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing,
+ secondaryDisplayShowing);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ mH.post(() -> {
+ for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
+ mScreenObservers.get(i).onKeyguardStateChanged(keyguardShowing);
+ }
+ });
+ }
+
+ void onScreenAwakeChanged(boolean isAwake) {
+ mH.post(() -> {
+ for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
+ mScreenObservers.get(i).onAwakeStateChanged(isAwake);
+ }
+ });
+ }
+
+ @Override
+ public Bitmap getTaskDescriptionIcon(String filePath, int userId) {
+ userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+ userId, "getTaskDescriptionIcon");
+
+ final File passedIconFile = new File(filePath);
+ final File legitIconFile = new File(TaskPersister.getUserImagesDir(userId),
+ passedIconFile.getName());
+ if (!legitIconFile.getPath().equals(filePath)
+ || !filePath.contains(ActivityRecord.ACTIVITY_ICON_SUFFIX)) {
+ throw new IllegalArgumentException("Bad file path: " + filePath
+ + " passed for userId " + userId);
+ }
+ return mRecentTasks.getTaskDescriptionIcon(filePath);
+ }
+
+ @Override
+ public void startInPlaceAnimationOnFrontMostApplication(Bundle opts) {
+ final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(opts);
+ final ActivityOptions activityOptions = safeOptions != null
+ ? safeOptions.getOptions(mStackSupervisor)
+ : null;
+ if (activityOptions == null
+ || activityOptions.getAnimationType() != ActivityOptions.ANIM_CUSTOM_IN_PLACE
+ || activityOptions.getCustomInPlaceResId() == 0) {
+ throw new IllegalArgumentException("Expected in-place ActivityOption " +
+ "with valid animation");
+ }
+ mWindowManager.prepareAppTransition(TRANSIT_TASK_IN_PLACE, false);
+ mWindowManager.overridePendingAppTransitionInPlace(activityOptions.getPackageName(),
+ activityOptions.getCustomInPlaceResId());
+ mWindowManager.executeAppTransition();
+ }
+
+ @Override
+ public void removeStack(int stackId) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "removeStack()");
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ final ActivityStack stack = mStackSupervisor.getStack(stackId);
+ if (stack == null) {
+ Slog.w(TAG, "removeStack: No stack with id=" + stackId);
+ return;
+ }
+ if (!stack.isActivityTypeStandardOrUndefined()) {
+ throw new IllegalArgumentException(
+ "Removing non-standard stack is not allowed.");
+ }
+ mStackSupervisor.removeStack(stack);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public void moveStackToDisplay(int stackId, int displayId) {
+ mAmInternal.enforceCallingPermission(INTERNAL_SYSTEM_WINDOW, "moveStackToDisplay()");
+
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ if (DEBUG_STACK) Slog.d(TAG_STACK, "moveStackToDisplay: moving stackId=" + stackId
+ + " to displayId=" + displayId);
+ mStackSupervisor.moveStackToDisplayLocked(stackId, displayId, ON_TOP);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public int createStackOnDisplay(int displayId) {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "createStackOnDisplay()");
+ synchronized (mGlobalLock) {
+ final ActivityDisplay display =
+ mStackSupervisor.getActivityDisplayOrCreateLocked(displayId);
+ if (display == null) {
+ return INVALID_STACK_ID;
+ }
+ // TODO(multi-display): Have the caller pass in the windowing mode and activity type.
+ final ActivityStack stack = display.createStack(
+ WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
+ ON_TOP);
+ return (stack != null) ? stack.mStackId : INVALID_STACK_ID;
+ }
+ }
+
+ @Override
+ public void exitFreeformMode(IBinder token) {
+ synchronized (mGlobalLock) {
+ long ident = Binder.clearCallingIdentity();
+ try {
+ final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ if (r == null) {
+ throw new IllegalArgumentException(
+ "exitFreeformMode: No activity record matching token=" + token);
+ }
+
+ final ActivityStack stack = r.getStack();
+ if (stack == null || !stack.inFreeformWindowingMode()) {
+ throw new IllegalStateException(
+ "exitFreeformMode: You can only go fullscreen from freeform.");
+ }
+
+ stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ /** Sets the task stack listener that gets callbacks when a task stack changes. */
+ @Override
+ public void registerTaskStackListener(ITaskStackListener listener) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
+ "registerTaskStackListener()");
+ mTaskChangeNotificationController.registerTaskStackListener(listener);
+ }
+
+ /** Unregister a task stack listener so that it stops receiving callbacks. */
+ @Override
+ public void unregisterTaskStackListener(ITaskStackListener listener) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
+ "unregisterTaskStackListener()");
+ mTaskChangeNotificationController.unregisterTaskStackListener(listener);
+ }
+
+ private void reportCurKeyguardUsageEventLocked(boolean keyguardShowing) {
+ mAm.reportGlobalUsageEventLocked(keyguardShowing
+ ? UsageEvents.Event.KEYGUARD_SHOWN
+ : UsageEvents.Event.KEYGUARD_HIDDEN);
+ }
+
+ @Override
+ public boolean requestAssistContextExtras(int requestType, IAssistDataReceiver receiver,
+ Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId) {
+ return enqueueAssistContext(requestType, null, null, receiver, receiverExtras,
+ activityToken, focused, newSessionId, UserHandle.getCallingUserId(), null,
+ PENDING_ASSIST_EXTRAS_LONG_TIMEOUT, 0) != null;
+ }
+
+ @Override
+ public boolean requestAutofillData(IAssistDataReceiver receiver, Bundle receiverExtras,
+ IBinder activityToken, int flags) {
+ return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTOFILL, null, null,
+ receiver, receiverExtras, activityToken, true, true, UserHandle.getCallingUserId(),
+ null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT, flags) != null;
+ }
+
+ @Override
+ public boolean launchAssistIntent(Intent intent, int requestType, String hint, int userHandle,
+ Bundle args) {
+ return enqueueAssistContext(requestType, intent, hint, null, null, null,
+ true /* focused */, true /* newSessionId */, userHandle, args,
+ PENDING_ASSIST_EXTRAS_TIMEOUT, 0) != null;
+ }
+
+ @Override
+ public Bundle getAssistContextExtras(int requestType) {
+ PendingAssistExtras pae = enqueueAssistContext(requestType, null, null, null,
+ null, null, true /* focused */, true /* newSessionId */,
+ UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT, 0);
+ if (pae == null) {
+ return null;
+ }
+ synchronized (pae) {
+ while (!pae.haveResult) {
+ try {
+ pae.wait();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ synchronized (mGlobalLock) {
+ buildAssistBundleLocked(pae, pae.result);
+ mPendingAssistExtras.remove(pae);
+ mUiHandler.removeCallbacks(pae);
+ }
+ return pae.extras;
+ }
+
+ /**
+ * Binder IPC calls go through the public entry point.
+ * This can be called with or without the global lock held.
+ */
+ private static int checkCallingPermission(String permission) {
+ return checkPermission(
+ permission, Binder.getCallingPid(), UserHandle.getAppId(Binder.getCallingUid()));
+ }
+
+ /** This can be called with or without the global lock held. */
+ void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
+ if (!getRecentTasks().isCallerRecents(Binder.getCallingUid())) {
+ mAmInternal.enforceCallingPermission(permission, func);
+ }
+ }
+
+ @VisibleForTesting
+ int checkGetTasksPermission(String permission, int pid, int uid) {
+ return checkPermission(permission, pid, uid);
+ }
+
+ static int checkPermission(String permission, int pid, int uid) {
+ if (permission == null) {
+ return PackageManager.PERMISSION_DENIED;
+ }
+ return checkComponentPermission(permission, pid, uid, -1, true);
+ }
+
+ boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
+ if (getRecentTasks().isCallerRecents(callingUid)) {
+ // Always allow the recents component to get tasks
+ return true;
+ }
+
+ boolean allowed = checkGetTasksPermission(android.Manifest.permission.REAL_GET_TASKS,
+ callingPid, callingUid) == PackageManager.PERMISSION_GRANTED;
+ if (!allowed) {
+ if (checkGetTasksPermission(android.Manifest.permission.GET_TASKS,
+ callingPid, callingUid) == PackageManager.PERMISSION_GRANTED) {
+ // Temporary compatibility: some existing apps on the system image may
+ // still be requesting the old permission and not switched to the new
+ // one; if so, we'll still allow them full access. This means we need
+ // to see if they are holding the old permission and are a system app.
+ try {
+ if (AppGlobals.getPackageManager().isUidPrivileged(callingUid)) {
+ allowed = true;
+ if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid
+ + " is using old GET_TASKS but privileged; allowing");
+ }
+ } catch (RemoteException e) {
+ }
+ }
+ if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid
+ + " does not hold REAL_GET_TASKS; limiting output");
+ }
+ return allowed;
+ }
+
+ private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
+ IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken,
+ boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout,
+ int flags) {
+ mAmInternal.enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO,
+ "enqueueAssistContext()");
+
+ synchronized (mGlobalLock) {
+ ActivityRecord activity = getFocusedStack().getTopActivity();
+ if (activity == null) {
+ Slog.w(TAG, "getAssistContextExtras failed: no top activity");
+ return null;
+ }
+ if (!activity.attachedToProcess()) {
+ Slog.w(TAG, "getAssistContextExtras failed: no process for " + activity);
+ return null;
+ }
+ if (focused) {
+ if (activityToken != null) {
+ ActivityRecord caller = ActivityRecord.forTokenLocked(activityToken);
+ if (activity != caller) {
+ Slog.w(TAG, "enqueueAssistContext failed: caller " + caller
+ + " is not current top " + activity);
+ return null;
+ }
+ }
+ } else {
+ activity = ActivityRecord.forTokenLocked(activityToken);
+ if (activity == null) {
+ Slog.w(TAG, "enqueueAssistContext failed: activity for token=" + activityToken
+ + " couldn't be found");
+ return null;
+ }
+ if (!activity.attachedToProcess()) {
+ Slog.w(TAG, "enqueueAssistContext failed: no process for " + activity);
+ return null;
+ }
+ }
+
+ PendingAssistExtras pae;
+ Bundle extras = new Bundle();
+ if (args != null) {
+ extras.putAll(args);
+ }
+ extras.putString(Intent.EXTRA_ASSIST_PACKAGE, activity.packageName);
+ extras.putInt(Intent.EXTRA_ASSIST_UID, activity.app.mUid);
+
+ pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, receiverExtras,
+ userHandle);
+ pae.isHome = activity.isActivityTypeHome();
+
+ // Increment the sessionId if necessary
+ if (newSessionId) {
+ mViSessionId++;
+ }
+ try {
+ activity.app.getThread().requestAssistContextExtras(activity.appToken, pae,
+ requestType, mViSessionId, flags);
+ mPendingAssistExtras.add(pae);
+ mUiHandler.postDelayed(pae, timeout);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "getAssistContextExtras failed: crash calling " + activity);
+ return null;
+ }
+ return pae;
+ }
+ }
+
+ private void buildAssistBundleLocked(PendingAssistExtras pae, Bundle result) {
+ if (result != null) {
+ pae.extras.putBundle(Intent.EXTRA_ASSIST_CONTEXT, result);
+ }
+ if (pae.hint != null) {
+ pae.extras.putBoolean(pae.hint, true);
+ }
+ }
+
+ private void pendingAssistExtrasTimedOut(PendingAssistExtras pae) {
+ IAssistDataReceiver receiver;
+ synchronized (mGlobalLock) {
+ mPendingAssistExtras.remove(pae);
+ receiver = pae.receiver;
+ }
+ if (receiver != null) {
+ // Caller wants result sent back to them.
+ Bundle sendBundle = new Bundle();
+ // At least return the receiver extras
+ sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras);
+ try {
+ pae.receiver.onHandleAssistData(sendBundle);
+ } catch (RemoteException e) {
+ }
+ }
+ }
+
+ public class PendingAssistExtras extends Binder implements Runnable {
+ public final ActivityRecord activity;
+ public boolean isHome;
+ public final Bundle extras;
+ public final Intent intent;
+ public final String hint;
+ public final IAssistDataReceiver receiver;
+ public final int userHandle;
+ public boolean haveResult = false;
+ public Bundle result = null;
+ public AssistStructure structure = null;
+ public AssistContent content = null;
+ public Bundle receiverExtras;
+
+ public PendingAssistExtras(ActivityRecord _activity, Bundle _extras, Intent _intent,
+ String _hint, IAssistDataReceiver _receiver, Bundle _receiverExtras,
+ int _userHandle) {
+ activity = _activity;
+ extras = _extras;
+ intent = _intent;
+ hint = _hint;
+ receiver = _receiver;
+ receiverExtras = _receiverExtras;
+ userHandle = _userHandle;
+ }
+
+ @Override
+ public void run() {
+ Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from " + activity);
+ synchronized (this) {
+ haveResult = true;
+ notifyAll();
+ }
+ pendingAssistExtrasTimedOut(this);
+ }
+ }
+
+ @Override
+ public boolean isAssistDataAllowedOnCurrentActivity() {
+ int userId;
+ synchronized (mGlobalLock) {
+ final ActivityStack focusedStack = getFocusedStack();
+ if (focusedStack == null || focusedStack.isActivityTypeAssistant()) {
+ return false;
+ }
+
+ final ActivityRecord activity = focusedStack.getTopActivity();
+ if (activity == null) {
+ return false;
+ }
+ userId = activity.userId;
+ }
+ return !DevicePolicyCache.getInstance().getScreenCaptureDisabled(userId);
+ }
+
+ @Override
+ public boolean showAssistFromActivity(IBinder token, Bundle args) {
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ ActivityRecord caller = ActivityRecord.forTokenLocked(token);
+ ActivityRecord top = getFocusedStack().getTopActivity();
+ if (top != caller) {
+ Slog.w(TAG, "showAssistFromActivity failed: caller " + caller
+ + " is not current top " + top);
+ return false;
+ }
+ if (!top.nowVisible) {
+ Slog.w(TAG, "showAssistFromActivity failed: caller " + caller
+ + " is not visible");
+ return false;
+ }
+ }
+ return mAssistUtils.showSessionForActiveService(args, SHOW_SOURCE_APPLICATION, null,
+ token);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public boolean isRootVoiceInteraction(IBinder token) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return false;
+ }
+ return r.rootVoiceInteraction;
+ }
+ }
+
+ private void onLocalVoiceInteractionStartedLocked(IBinder activity,
+ IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
+ ActivityRecord activityToCallback = ActivityRecord.forTokenLocked(activity);
+ if (activityToCallback == null) return;
+ activityToCallback.setVoiceSessionLocked(voiceSession);
+
+ // Inform the activity
+ try {
+ activityToCallback.app.getThread().scheduleLocalVoiceInteractionStarted(activity,
+ voiceInteractor);
+ long token = Binder.clearCallingIdentity();
+ try {
+ startRunningVoiceLocked(voiceSession, activityToCallback.appInfo.uid);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ // TODO: VI Should we cache the activity so that it's easier to find later
+ // rather than scan through all the stacks and activities?
+ } catch (RemoteException re) {
+ activityToCallback.clearVoiceSessionLocked();
+ // TODO: VI Should this terminate the voice session?
+ }
+ }
+
+ private void startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid) {
+ Slog.d(TAG, "<<< startRunningVoiceLocked()");
+ mVoiceWakeLock.setWorkSource(new WorkSource(targetUid));
+ if (mRunningVoice == null || mRunningVoice.asBinder() != session.asBinder()) {
+ boolean wasRunningVoice = mRunningVoice != null;
+ mRunningVoice = session;
+ if (!wasRunningVoice) {
+ mVoiceWakeLock.acquire();
+ updateSleepIfNeededLocked();
+ }
+ }
+ }
+
+ void finishRunningVoiceLocked() {
+ if (mRunningVoice != null) {
+ mRunningVoice = null;
+ mVoiceWakeLock.release();
+ updateSleepIfNeededLocked();
+ }
+ }
+
+ @Override
+ public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) {
+ synchronized (mGlobalLock) {
+ if (mRunningVoice != null && mRunningVoice.asBinder() == session.asBinder()) {
+ if (keepAwake) {
+ mVoiceWakeLock.acquire();
+ } else {
+ mVoiceWakeLock.release();
+ }
+ }
+ }
+ }
+
+ @Override
+ public ComponentName getActivityClassForToken(IBinder token) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return null;
+ }
+ return r.intent.getComponent();
+ }
+ }
+
+ @Override
+ public String getPackageForToken(IBinder token) {
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return null;
+ }
+ return r.packageName;
+ }
+ }
+
+ @Override
+ public void showLockTaskEscapeMessage(IBinder token) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ if (r == null) {
+ return;
+ }
+ getLockTaskController().showLockTaskToast();
+ }
+ }
+
+ @Override
+ public void keyguardGoingAway(int flags) {
+ enforceNotIsolatedCaller("keyguardGoingAway");
+ final long token = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ mKeyguardController.keyguardGoingAway(flags);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * Try to place task to provided position. The final position might be different depending on
+ * current user and stacks state. The task will be moved to target stack if it's currently in
+ * different stack.
+ */
+ @Override
+ public void positionTaskInStack(int taskId, int stackId, int position) {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "positionTaskInStack()");
+ synchronized (mGlobalLock) {
+ long ident = Binder.clearCallingIdentity();
+ try {
+ if (DEBUG_STACK) Slog.d(TAG_STACK, "positionTaskInStack: positioning task="
+ + taskId + " in stackId=" + stackId + " at position=" + position);
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId);
+ if (task == null) {
+ throw new IllegalArgumentException("positionTaskInStack: no task for id="
+ + taskId);
+ }
+
+ final ActivityStack stack = mStackSupervisor.getStack(stackId);
+
+ if (stack == null) {
+ throw new IllegalArgumentException("positionTaskInStack: no stack for id="
+ + stackId);
+ }
+ if (!stack.isActivityTypeStandardOrUndefined()) {
+ throw new IllegalArgumentException("positionTaskInStack: Attempt to change"
+ + " the position of task " + taskId + " in/to non-standard stack");
+ }
+
+ // TODO: Have the callers of this API call a separate reparent method if that is
+ // what they intended to do vs. having this method also do reparenting.
+ if (task.getStack() == stack) {
+ // Change position in current stack.
+ stack.positionChildAt(task, position);
+ } else {
+ // Reparent to new stack.
+ task.reparent(stack, position, REPARENT_LEAVE_STACK_IN_PLACE, !ANIMATE,
+ !DEFER_RESUME, "positionTaskInStack");
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public void reportSizeConfigurations(IBinder token, int[] horizontalSizeConfiguration,
+ int[] verticalSizeConfigurations, int[] smallestSizeConfigurations) {
+ if (DEBUG_CONFIGURATION) Slog.v(TAG, "Report configuration: " + token + " "
+ + horizontalSizeConfiguration + " " + verticalSizeConfigurations);
+ synchronized (mGlobalLock) {
+ ActivityRecord record = ActivityRecord.isInStackLocked(token);
+ if (record == null) {
+ throw new IllegalArgumentException("reportSizeConfigurations: ActivityRecord not "
+ + "found for: " + token);
+ }
+ record.setSizeConfigurations(horizontalSizeConfiguration,
+ verticalSizeConfigurations, smallestSizeConfigurations);
+ }
+ }
+
+ /**
+ * Dismisses split-screen multi-window mode.
+ * @param toTop If true the current primary split-screen stack will be placed or left on top.
+ */
+ @Override
+ public void dismissSplitScreenMode(boolean toTop) {
+ enforceCallerIsRecentsOrHasPermission(
+ MANAGE_ACTIVITY_STACKS, "dismissSplitScreenMode()");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityStack stack =
+ mStackSupervisor.getDefaultDisplay().getSplitScreenPrimaryStack();
+ if (stack == null) {
+ Slog.w(TAG, "dismissSplitScreenMode: primary split-screen stack not found.");
+ return;
+ }
+
+ if (toTop) {
+ // Caller wants the current split-screen primary stack to be the top stack after
+ // it goes fullscreen, so move it to the front.
+ stack.moveToFront("dismissSplitScreenMode");
+ } else if (mStackSupervisor.isFocusedStack(stack)) {
+ // In this case the current split-screen primary stack shouldn't be the top
+ // stack after it goes fullscreen, but it current has focus, so we move the
+ // focus to the top-most split-screen secondary stack next to it.
+ final ActivityStack otherStack = stack.getDisplay().getTopStackInWindowingMode(
+ WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+ if (otherStack != null) {
+ otherStack.moveToFront("dismissSplitScreenMode_other");
+ }
+ }
+
+ stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * Dismisses Pip
+ * @param animate True if the dismissal should be animated.
+ * @param animationDuration The duration of the resize animation in milliseconds or -1 if the
+ * default animation duration should be used.
+ */
+ @Override
+ public void dismissPip(boolean animate, int animationDuration) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "dismissPip()");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final PinnedActivityStack stack =
+ mStackSupervisor.getDefaultDisplay().getPinnedStack();
+ if (stack == null) {
+ Slog.w(TAG, "dismissPip: pinned stack not found.");
+ return;
+ }
+ if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) {
+ throw new IllegalArgumentException("Stack: " + stack
+ + " doesn't support animated resize.");
+ }
+ if (animate) {
+ stack.animateResizePinnedStack(null /* sourceHintBounds */,
+ null /* destBounds */, animationDuration, false /* fromFullscreen */);
+ } else {
+ mStackSupervisor.moveTasksToFullscreenStackLocked(stack, true /* onTop */);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public void suppressResizeConfigChanges(boolean suppress) throws RemoteException {
+ mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "suppressResizeConfigChanges()");
+ synchronized (mGlobalLock) {
+ mSuppressResizeConfigChanges = suppress;
+ }
+ }
+
+ /**
+ * NOTE: For the pinned stack, this method is usually called after the bounds animation has
+ * animated the stack to the fullscreen, but can also be called if we are relaunching an
+ * activity and clearing the task at the same time.
+ */
+ @Override
+ // TODO: API should just be about changing windowing modes...
+ public void moveTasksToFullscreenStack(int fromStackId, boolean onTop) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
+ "moveTasksToFullscreenStack()");
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ final ActivityStack stack = mStackSupervisor.getStack(fromStackId);
+ if (stack != null){
+ if (!stack.isActivityTypeStandardOrUndefined()) {
+ throw new IllegalArgumentException(
+ "You can't move tasks from non-standard stacks.");
+ }
+ mStackSupervisor.moveTasksToFullscreenStackLocked(stack, onTop);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ /**
+ * Moves the top activity in the input stackId to the pinned stack.
+ *
+ * @param stackId Id of stack to move the top activity to pinned stack.
+ * @param bounds Bounds to use for pinned stack.
+ *
+ * @return True if the top activity of the input stack was successfully moved to the pinned
+ * stack.
+ */
+ @Override
+ public boolean moveTopActivityToPinnedStack(int stackId, Rect bounds) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
+ "moveTopActivityToPinnedStack()");
+ synchronized (mGlobalLock) {
+ if (!mSupportsPictureInPicture) {
+ throw new IllegalStateException("moveTopActivityToPinnedStack:"
+ + "Device doesn't support picture-in-picture mode");
+ }
+
+ long ident = Binder.clearCallingIdentity();
+ try {
+ return mStackSupervisor.moveTopStackActivityToPinnedStackLocked(stackId, bounds);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public boolean isInMultiWindowMode(IBinder token) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return false;
+ }
+ // An activity is consider to be in multi-window mode if its task isn't fullscreen.
+ return r.inMultiWindowMode();
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public boolean isInPictureInPictureMode(IBinder token) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ return isInPictureInPictureMode(ActivityRecord.forTokenLocked(token));
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ private boolean isInPictureInPictureMode(ActivityRecord r) {
+ if (r == null || r.getStack() == null || !r.inPinnedWindowingMode()
+ || r.getStack().isInStackLocked(r) == null) {
+ return false;
+ }
+
+ // If we are animating to fullscreen then we have already dispatched the PIP mode
+ // changed, so we should reflect that check here as well.
+ final PinnedActivityStack stack = r.getStack();
+ final PinnedStackWindowController windowController = stack.getWindowContainerController();
+ return !windowController.isAnimatingBoundsToFullscreen();
+ }
+
+ @Override
+ public boolean enterPictureInPictureMode(IBinder token, final PictureInPictureParams params) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
+ "enterPictureInPictureMode", token, params);
+
+ // If the activity is already in picture in picture mode, then just return early
+ if (isInPictureInPictureMode(r)) {
+ return true;
+ }
+
+ // Activity supports picture-in-picture, now check that we can enter PiP at this
+ // point, if it is
+ if (!r.checkEnterPictureInPictureState("enterPictureInPictureMode",
+ false /* beforeStopping */)) {
+ return false;
+ }
+
+ final Runnable enterPipRunnable = () -> {
+ synchronized (mGlobalLock) {
+ // Only update the saved args from the args that are set
+ r.pictureInPictureArgs.copyOnlySet(params);
+ final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
+ final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
+ // Adjust the source bounds by the insets for the transition down
+ final Rect sourceBounds = new Rect(
+ r.pictureInPictureArgs.getSourceRectHint());
+ mStackSupervisor.moveActivityToPinnedStackLocked(
+ r, sourceBounds, aspectRatio, "enterPictureInPictureMode");
+ final PinnedActivityStack stack = r.getStack();
+ stack.setPictureInPictureAspectRatio(aspectRatio);
+ stack.setPictureInPictureActions(actions);
+ MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid,
+ r.shortComponentName, r.supportsEnterPipOnTaskSwitch);
+ logPictureInPictureArgs(params);
+ }
+ };
+
+ if (isKeyguardLocked()) {
+ // If the keyguard is showing or occluded, then try and dismiss it before
+ // entering picture-in-picture (this will prompt the user to authenticate if the
+ // device is currently locked).
+ dismissKeyguard(token, new KeyguardDismissCallback() {
+ @Override
+ public void onDismissSucceeded() {
+ mH.post(enterPipRunnable);
+ }
+ }, null /* message */);
+ } else {
+ // Enter picture in picture immediately otherwise
+ enterPipRunnable.run();
+ }
+ return true;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public void setPictureInPictureParams(IBinder token, final PictureInPictureParams params) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
+ "setPictureInPictureParams", token, params);
+
+ // Only update the saved args from the args that are set
+ r.pictureInPictureArgs.copyOnlySet(params);
+ if (r.inPinnedWindowingMode()) {
+ // If the activity is already in picture-in-picture, update the pinned stack now
+ // if it is not already expanding to fullscreen. Otherwise, the arguments will
+ // be used the next time the activity enters PiP
+ final PinnedActivityStack stack = r.getStack();
+ if (!stack.isAnimatingBoundsToFullscreen()) {
+ stack.setPictureInPictureAspectRatio(
+ r.pictureInPictureArgs.getAspectRatio());
+ stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
+ }
+ }
+ logPictureInPictureArgs(params);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public int getMaxNumPictureInPictureActions(IBinder token) {
+ // Currently, this is a static constant, but later, we may change this to be dependent on
+ // the context of the activity
+ return 3;
+ }
+
+ private void logPictureInPictureArgs(PictureInPictureParams params) {
+ if (params.hasSetActions()) {
+ MetricsLogger.histogram(mContext, "tron_varz_picture_in_picture_actions_count",
+ params.getActions().size());
+ }
+ if (params.hasSetAspectRatio()) {
+ LogMaker lm = new LogMaker(MetricsEvent.ACTION_PICTURE_IN_PICTURE_ASPECT_RATIO_CHANGED);
+ lm.addTaggedData(MetricsEvent.PICTURE_IN_PICTURE_ASPECT_RATIO, params.getAspectRatio());
+ MetricsLogger.action(lm);
+ }
+ }
+
+ /**
+ * Checks the state of the system and the activity associated with the given {@param token} to
+ * verify that picture-in-picture is supported for that activity.
+ *
+ * @return the activity record for the given {@param token} if all the checks pass.
+ */
+ private ActivityRecord ensureValidPictureInPictureActivityParamsLocked(String caller,
+ IBinder token, PictureInPictureParams params) {
+ if (!mSupportsPictureInPicture) {
+ throw new IllegalStateException(caller
+ + ": Device doesn't support picture-in-picture mode.");
+ }
+
+ final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ if (r == null) {
+ throw new IllegalStateException(caller
+ + ": Can't find activity for token=" + token);
+ }
+
+ if (!r.supportsPictureInPicture()) {
+ throw new IllegalStateException(caller
+ + ": Current activity does not support picture-in-picture.");
+ }
+
+ if (params.hasSetAspectRatio()
+ && !mWindowManager.isValidPictureInPictureAspectRatio(r.getStack().mDisplayId,
+ params.getAspectRatio())) {
+ final float minAspectRatio = mContext.getResources().getFloat(
+ com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
+ final float maxAspectRatio = mContext.getResources().getFloat(
+ com.android.internal.R.dimen.config_pictureInPictureMaxAspectRatio);
+ throw new IllegalArgumentException(String.format(caller
+ + ": Aspect ratio is too extreme (must be between %f and %f).",
+ minAspectRatio, maxAspectRatio));
+ }
+
+ // Truncate the number of actions if necessary
+ params.truncateActions(getMaxNumPictureInPictureActions(token));
+
+ return r;
+ }
+
+ @Override
+ public IBinder getUriPermissionOwnerForActivity(IBinder activityToken) {
+ enforceNotIsolatedCaller("getUriPermissionOwnerForActivity");
+ synchronized (mGlobalLock) {
+ ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
+ if (r == null) {
+ throw new IllegalArgumentException("Activity does not exist; token="
+ + activityToken);
+ }
+ return r.getUriPermissionsLocked().getExternalTokenLocked();
+ }
+ }
+
+ @Override
+ public void resizeDockedStack(Rect dockedBounds, Rect tempDockedTaskBounds,
+ Rect tempDockedTaskInsetBounds,
+ Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeDockedStack()");
+ long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.resizeDockedStackLocked(dockedBounds, tempDockedTaskBounds,
+ tempDockedTaskInsetBounds, tempOtherTaskBounds, tempOtherTaskInsetBounds,
+ PRESERVE_WINDOWS);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public void setSplitScreenResizing(boolean resizing) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setSplitScreenResizing()");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.setSplitScreenResizing(resizing);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * Check that we have the features required for VR-related API calls, and throw an exception if
+ * not.
+ */
+ void enforceSystemHasVrFeature() {
+ if (!mContext.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE)) {
+ throw new UnsupportedOperationException("VR mode not supported on this device!");
+ }
+ }
+
+ @Override
+ public int setVrMode(IBinder token, boolean enabled, ComponentName packageName) {
+ enforceSystemHasVrFeature();
+
+ final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
+
+ ActivityRecord r;
+ synchronized (mGlobalLock) {
+ r = ActivityRecord.isInStackLocked(token);
+ }
+
+ if (r == null) {
+ throw new IllegalArgumentException();
+ }
+
+ int err;
+ if ((err = vrService.hasVrPackage(packageName, r.userId)) !=
+ VrManagerInternal.NO_ERROR) {
+ return err;
+ }
+
+ // Clear the binder calling uid since this path may call moveToTask().
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ r.requestedVrComponent = (enabled) ? packageName : null;
+
+ // Update associated state if this activity is currently focused
+ if (r == mStackSupervisor.getResumedActivityLocked()) {
+ applyUpdateVrModeLocked(r);
+ }
+ return 0;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ }
+
+ @Override
+ public void startLocalVoiceInteraction(IBinder callingActivity, Bundle options) {
+ Slog.i(TAG, "Activity tried to startLocalVoiceInteraction");
+ synchronized (mGlobalLock) {
+ ActivityRecord activity = getFocusedStack().getTopActivity();
+ if (ActivityRecord.forTokenLocked(callingActivity) != activity) {
+ throw new SecurityException("Only focused activity can call startVoiceInteraction");
+ }
+ if (mRunningVoice != null || activity.getTask().voiceSession != null
+ || activity.voiceSession != null) {
+ Slog.w(TAG, "Already in a voice interaction, cannot start new voice interaction");
+ return;
+ }
+ if (activity.pendingVoiceInteractionStart) {
+ Slog.w(TAG, "Pending start of voice interaction already.");
+ return;
+ }
+ activity.pendingVoiceInteractionStart = true;
+ }
+ LocalServices.getService(VoiceInteractionManagerInternal.class)
+ .startLocalVoiceInteraction(callingActivity, options);
+ }
+
+ @Override
+ public void stopLocalVoiceInteraction(IBinder callingActivity) {
+ LocalServices.getService(VoiceInteractionManagerInternal.class)
+ .stopLocalVoiceInteraction(callingActivity);
+ }
+
+ @Override
+ public boolean supportsLocalVoiceInteraction() {
+ return LocalServices.getService(VoiceInteractionManagerInternal.class)
+ .supportsLocalVoiceInteraction();
+ }
+
+ /** Notifies all listeners when the pinned stack animation starts. */
+ @Override
+ public void notifyPinnedStackAnimationStarted() {
+ mTaskChangeNotificationController.notifyPinnedStackAnimationStarted();
+ }
+
+ /** Notifies all listeners when the pinned stack animation ends. */
+ @Override
+ public void notifyPinnedStackAnimationEnded() {
+ mTaskChangeNotificationController.notifyPinnedStackAnimationEnded();
+ }
+
+ @Override
+ public void resizePinnedStack(Rect pinnedBounds, Rect tempPinnedTaskBounds) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizePinnedStack()");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.resizePinnedStackLocked(pinnedBounds, tempPinnedTaskBounds);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public boolean updateDisplayOverrideConfiguration(Configuration values, int displayId) {
+ mAmInternal.enforceCallingPermission(CHANGE_CONFIGURATION, "updateDisplayOverrideConfiguration()");
+
+ synchronized (mGlobalLock) {
+ // Check if display is initialized in AM.
+ if (!mStackSupervisor.isDisplayAdded(displayId)) {
+ // Call might come when display is not yet added or has already been removed.
+ if (DEBUG_CONFIGURATION) {
+ Slog.w(TAG, "Trying to update display configuration for non-existing displayId="
+ + displayId);
+ }
+ return false;
+ }
+
+ if (values == null && mWindowManager != null) {
+ // sentinel: fetch the current configuration from the window manager
+ values = mWindowManager.computeNewConfiguration(displayId);
+ }
+
+ if (mWindowManager != null) {
+ // Update OOM levels based on display size.
+ mAm.mProcessList.applyDisplaySize(mWindowManager);
+ }
+
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ if (values != null) {
+ Settings.System.clearConfiguration(values);
+ }
+ updateDisplayOverrideConfigurationLocked(values, null /* starting */,
+ false /* deferResume */, displayId, mTmpUpdateConfigurationResult);
+ return mTmpUpdateConfigurationResult.changes != 0;
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public boolean updateConfiguration(Configuration values) {
+ mAmInternal.enforceCallingPermission(CHANGE_CONFIGURATION, "updateConfiguration()");
+
+ synchronized (mGlobalLock) {
+ if (values == null && mWindowManager != null) {
+ // sentinel: fetch the current configuration from the window manager
+ values = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
+ }
+
+ if (mWindowManager != null) {
+ // Update OOM levels based on display size.
+ mAm.mProcessList.applyDisplaySize(mWindowManager);
+ }
+
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ if (values != null) {
+ Settings.System.clearConfiguration(values);
+ }
+ updateConfigurationLocked(values, null, false, false /* persistent */,
+ UserHandle.USER_NULL, false /* deferResume */,
+ mTmpUpdateConfigurationResult);
+ return mTmpUpdateConfigurationResult.changes != 0;
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback,
+ CharSequence message) {
+ if (message != null) {
+ mAmInternal.enforceCallingPermission(
+ Manifest.permission.SHOW_KEYGUARD_MESSAGE, "dismissKeyguard()");
+ }
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ mKeyguardController.dismissKeyguard(token, callback, message);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ }
+
+ @Override
+ public void cancelTaskWindowTransition(int taskId) {
+ enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
+ "cancelTaskWindowTransition()");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final TaskRecord task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_ONLY);
+ if (task == null) {
+ Slog.w(TAG, "cancelTaskWindowTransition: taskId=" + taskId + " not found");
+ return;
+ }
+ task.cancelWindowTransition();
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution) {
+ enforceCallerIsRecentsOrHasPermission(READ_FRAME_BUFFER, "getTaskSnapshot()");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ final TaskRecord task;
+ synchronized (mGlobalLock) {
+ task = mStackSupervisor.anyTaskForIdLocked(taskId,
+ MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
+ if (task == null) {
+ Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
+ return null;
+ }
+ }
+ // Don't call this while holding the lock as this operation might hit the disk.
+ return task.getSnapshot(reducedResolution);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public void setDisablePreviewScreenshots(IBinder token, boolean disable) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ Slog.w(TAG, "setDisablePreviewScreenshots: Unable to find activity for token="
+ + token);
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ r.setDisablePreviewScreenshots(disable);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ /** Return the user id of the last resumed activity. */
+ @Override
+ public @UserIdInt
+ int getLastResumedActivityUserId() {
+ mAmInternal.enforceCallingPermission(
+ Manifest.permission.INTERACT_ACROSS_USERS_FULL, "getLastResumedActivityUserId()");
+ synchronized (mGlobalLock) {
+ if (mLastResumedActivity == null) {
+ return getCurrentUserId();
+ }
+ return mLastResumedActivity.userId;
+ }
+ }
+
+ @Override
+ public void updateLockTaskFeatures(int userId, int flags) {
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid != 0 && callingUid != SYSTEM_UID) {
+ mAmInternal.enforceCallingPermission(android.Manifest.permission.UPDATE_LOCK_TASK_PACKAGES,
+ "updateLockTaskFeatures()");
+ }
+ synchronized (mGlobalLock) {
+ if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Allowing features " + userId + ":0x" +
+ Integer.toHexString(flags));
+ getLockTaskController().updateLockTaskFeatures(userId, flags);
+ }
+ }
+
+ @Override
+ public void setShowWhenLocked(IBinder token, boolean showWhenLocked) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ r.setShowWhenLocked(showWhenLocked);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public void setTurnScreenOn(IBinder token, boolean turnScreenOn) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ r.setTurnScreenOn(turnScreenOn);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public void registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition) {
+ mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
+ "registerRemoteAnimations");
+ definition.setCallingPid(Binder.getCallingPid());
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.isInStackLocked(token);
+ if (r == null) {
+ return;
+ }
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ r.registerRemoteAnimations(definition);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public void registerRemoteAnimationForNextActivityStart(String packageName,
+ RemoteAnimationAdapter adapter) {
+ mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
+ "registerRemoteAnimationForNextActivityStart");
+ adapter.setCallingPid(Binder.getCallingPid());
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ getActivityStartController().registerRemoteAnimationForNextActivityStart(
+ packageName, adapter);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */
+ @Override
+ public void alwaysShowUnsupportedCompileSdkWarning(ComponentName activity) {
+ synchronized (mGlobalLock) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ mAm.mAppWarnings.alwaysShowUnsupportedCompileSdkWarning(activity);
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+ }
+
+ @Override
+ public void setVrThread(int tid) {
+ enforceSystemHasVrFeature();
+ synchronized (mGlobalLock) {
+ synchronized (mAm.mPidsSelfLocked) {
+ final int pid = Binder.getCallingPid();
+ final ProcessRecord proc = mAm.mPidsSelfLocked.get(pid);
+ mVrController.setVrThreadLocked(tid, pid, proc.getWindowProcessController());
+ }
+ }
+ }
+
+ @Override
+ public void setPersistentVrThread(int tid) {
+ if (checkCallingPermission(Manifest.permission.RESTRICTED_VR_ACCESS)
+ != PERMISSION_GRANTED) {
+ final String msg = "Permission Denial: setPersistentVrThread() from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid()
+ + " requires " + Manifest.permission.RESTRICTED_VR_ACCESS;
+ Slog.w(TAG, msg);
+ throw new SecurityException(msg);
+ }
+ enforceSystemHasVrFeature();
+ synchronized (mGlobalLock) {
+ synchronized (mAm.mPidsSelfLocked) {
+ final int pid = Binder.getCallingPid();
+ final ProcessRecord proc = mAm.mPidsSelfLocked.get(pid);
+ mVrController.setPersistentVrThreadLocked(tid, pid, proc);
+ }
+ }
+ }
+
+ @Override
+ public void stopAppSwitches() {
+ enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "stopAppSwitches");
+ synchronized (mGlobalLock) {
+ mAppSwitchesAllowedTime = SystemClock.uptimeMillis() + APP_SWITCH_DELAY_TIME;
+ mDidAppSwitch = false;
+ getActivityStartController().schedulePendingActivityLaunches(APP_SWITCH_DELAY_TIME);
+ }
+ }
+
+ @Override
+ public void resumeAppSwitches() {
+ enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "resumeAppSwitches");
+ synchronized (mGlobalLock) {
+ // Note that we don't execute any pending app switches... we will
+ // let those wait until either the timeout, or the next start
+ // activity request.
+ mAppSwitchesAllowedTime = 0;
+ }
+ }
+
+ void onStartActivitySetDidAppSwitch() {
+ if (mDidAppSwitch) {
+ // This is the second allowed switch since we stopped switches, so now just generally
+ // allow switches. Use case:
+ // - user presses home (switches disabled, switch to home, mDidAppSwitch now true);
+ // - user taps a home icon (coming from home so allowed, we hit here and now allow
+ // anyone to switch again).
+ mAppSwitchesAllowedTime = 0;
+ } else {
+ mDidAppSwitch = true;
+ }
+ }
+
+ /** @return whether the system should disable UI modes incompatible with VR mode. */
+ boolean shouldDisableNonVrUiLocked() {
+ return mVrController.shouldDisableNonVrUiLocked();
+ }
+
+ void applyUpdateVrModeLocked(ActivityRecord r) {
+ // VR apps are expected to run in a main display. If an app is turning on VR for
+ // itself, but lives in a dynamic stack, then make sure that it is moved to the main
+ // fullscreen stack before enabling VR Mode.
+ // TODO: The goal of this code is to keep the VR app on the main display. When the
+ // stack implementation changes in the future, keep in mind that the use of the fullscreen
+ // stack is a means to move the activity to the main display and a moveActivityToDisplay()
+ // option would be a better choice here.
+ if (r.requestedVrComponent != null && r.getDisplayId() != DEFAULT_DISPLAY) {
+ Slog.i(TAG, "Moving " + r.shortComponentName + " from stack " + r.getStackId()
+ + " to main stack for VR");
+ final ActivityStack stack = mStackSupervisor.getDefaultDisplay().getOrCreateStack(
+ WINDOWING_MODE_FULLSCREEN, r.getActivityType(), true /* toTop */);
+ moveTaskToStack(r.getTask().taskId, stack.mStackId, true /* toTop */);
+ }
+ mH.post(() -> {
+ if (!mVrController.onVrModeChanged(r)) {
+ return;
+ }
+ synchronized (mGlobalLock) {
+ final boolean disableNonVrUi = mVrController.shouldDisableNonVrUiLocked();
+ mWindowManager.disableNonVrUi(disableNonVrUi);
+ if (disableNonVrUi) {
+ // If we are in a VR mode where Picture-in-Picture mode is unsupported,
+ // then remove the pinned stack.
+ mStackSupervisor.removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
+ }
+ }
+ });
+ }
+
+ ActivityStack getFocusedStack() {
+ return mStackSupervisor.getFocusedStack();
+ }
+
+ /** Pokes the task persister. */
+ void notifyTaskPersisterLocked(TaskRecord task, boolean flush) {
+ mRecentTasks.notifyTaskPersisterLocked(task, flush);
+ }
+
+ void onTopProcChangedLocked(WindowProcessController proc) {
+ mVrController.onTopProcChangedLocked(proc);
+ }
+
+ boolean isKeyguardLocked() {
+ return mKeyguardController.isKeyguardLocked();
+ }
+
+ boolean isNextTransitionForward() {
+ int transit = mWindowManager.getPendingAppTransition();
+ return transit == TRANSIT_ACTIVITY_OPEN
+ || transit == TRANSIT_TASK_OPEN
+ || transit == TRANSIT_TASK_TO_FRONT;
+ }
+
+ void dumpSleepStates(PrintWriter pw, boolean testPssMode) {
+ synchronized (mGlobalLock) {
+ pw.println(" mSleepTokens=" + mStackSupervisor.mSleepTokens);
+ if (mRunningVoice != null) {
+ pw.println(" mRunningVoice=" + mRunningVoice);
+ pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
+ }
+ pw.println(" mSleeping=" + mSleeping);
+ pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode);
+ pw.println(" mVrController=" + mVrController);
+ }
+ }
+
+ void writeSleepStateToProto(ProtoOutputStream proto) {
+ for (ActivityTaskManagerInternal.SleepToken st : mStackSupervisor.mSleepTokens) {
+ proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEP_TOKENS,
+ st.toString());
+ }
+
+ if (mRunningVoice != null) {
+ final long vrToken = proto.start(
+ ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE);
+ proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION,
+ mRunningVoice.toString());
+ mVoiceWakeLock.writeToProto(
+ proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK);
+ proto.end(vrToken);
+ }
+
+ proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEPING, mSleeping);
+ proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SHUTTING_DOWN,
+ mShuttingDown);
+ mVrController.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.VR_CONTROLLER);
+ }
+
+ int getCurrentUserId() {
+ return mAmInternal.getCurrentUserId();
+ }
+
+ private void enforceNotIsolatedCaller(String caller) {
+ if (UserHandle.isIsolated(Binder.getCallingUid())) {
+ throw new SecurityException("Isolated process not allowed to call " + caller);
+ }
+ }
+
+ public Configuration getConfiguration() {
+ Configuration ci;
+ synchronized(mGlobalLock) {
+ ci = new Configuration(getGlobalConfiguration());
+ ci.userSetLocale = false;
+ }
+ return ci;
+ }
+
+ /**
+ * Current global configuration information. Contains general settings for the entire system,
+ * also corresponds to the merged configuration of the default display.
+ */
+ Configuration getGlobalConfiguration() {
+ return mStackSupervisor.getConfiguration();
+ }
+
+ boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
+ boolean initLocale) {
+ return updateConfigurationLocked(values, starting, initLocale, false /* deferResume */);
+ }
+
+ boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
+ boolean initLocale, boolean deferResume) {
+ // pass UserHandle.USER_NULL as userId because we don't persist configuration for any user
+ return updateConfigurationLocked(values, starting, initLocale, false /* persistent */,
+ UserHandle.USER_NULL, deferResume);
+ }
+
+ void updatePersistentConfiguration(Configuration values, @UserIdInt int userId) {
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ updateConfigurationLocked(values, null, false, true, userId,
+ false /* deferResume */);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ void updateUserConfiguration() {
+ synchronized (mGlobalLock) {
+ final Configuration configuration = new Configuration(getGlobalConfiguration());
+ final int currentUserId = mAmInternal.getCurrentUserId();
+ Settings.System.adjustConfigurationForUser(mContext.getContentResolver(), configuration,
+ currentUserId, Settings.System.canWrite(mContext));
+ updateConfigurationLocked(configuration, null /* starting */, false /* initLocale */,
+ false /* persistent */, currentUserId, false /* deferResume */);
+ }
+ }
+
+ private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
+ boolean initLocale, boolean persistent, int userId, boolean deferResume) {
+ return updateConfigurationLocked(values, starting, initLocale, persistent, userId,
+ deferResume, null /* result */);
+ }
+
+ /**
+ * Do either or both things: (1) change the current configuration, and (2)
+ * make sure the given activity is running with the (now) current
+ * configuration. Returns true if the activity has been left running, or
+ * false if <var>starting</var> is being destroyed to match the new
+ * configuration.
+ *
+ * @param userId is only used when persistent parameter is set to true to persist configuration
+ * for that particular user
+ */
+ boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
+ boolean initLocale, boolean persistent, int userId, boolean deferResume,
+ ActivityTaskManagerService.UpdateConfigurationResult result) {
+ int changes = 0;
+ boolean kept = true;
+
+ if (mWindowManager != null) {
+ mWindowManager.deferSurfaceLayout();
+ }
+ try {
+ if (values != null) {
+ changes = updateGlobalConfigurationLocked(values, initLocale, persistent, userId,
+ deferResume);
+ }
+
+ kept = ensureConfigAndVisibilityAfterUpdate(starting, changes);
+ } finally {
+ if (mWindowManager != null) {
+ mWindowManager.continueSurfaceLayout();
+ }
+ }
+
+ if (result != null) {
+ result.changes = changes;
+ result.activityRelaunched = !kept;
+ }
+ return kept;
+ }
+
+ /**
+ * Returns true if this configuration change is interesting enough to send an
+ * {@link Intent#ACTION_SPLIT_CONFIGURATION_CHANGED} broadcast.
+ */
+ private static boolean isSplitConfigurationChange(int configDiff) {
+ return (configDiff & (ActivityInfo.CONFIG_LOCALE | ActivityInfo.CONFIG_DENSITY)) != 0;
+ }
+
+ /** Update default (global) configuration and notify listeners about changes. */
+ private int updateGlobalConfigurationLocked(@NonNull Configuration values, boolean initLocale,
+ boolean persistent, int userId, boolean deferResume) {
+ mTempConfig.setTo(getGlobalConfiguration());
+ final int changes = mTempConfig.updateFrom(values);
+ if (changes == 0) {
+ // Since calling to Activity.setRequestedOrientation leads to freezing the window with
+ // setting WindowManagerService.mWaitingForConfig to true, it is important that we call
+ // performDisplayOverrideConfigUpdate in order to send the new display configuration
+ // (even if there are no actual changes) to unfreeze the window.
+ performDisplayOverrideConfigUpdate(values, deferResume, DEFAULT_DISPLAY);
+ return 0;
+ }
+
+ if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.i(TAG_CONFIGURATION,
+ "Updating global configuration to: " + values);
+
+ EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
+ StatsLog.write(StatsLog.RESOURCE_CONFIGURATION_CHANGED,
+ values.colorMode,
+ values.densityDpi,
+ values.fontScale,
+ values.hardKeyboardHidden,
+ values.keyboard,
+ values.keyboardHidden,
+ values.mcc,
+ values.mnc,
+ values.navigation,
+ values.navigationHidden,
+ values.orientation,
+ values.screenHeightDp,
+ values.screenLayout,
+ values.screenWidthDp,
+ values.smallestScreenWidthDp,
+ values.touchscreen,
+ values.uiMode);
+
+
+ if (!initLocale && !values.getLocales().isEmpty() && values.userSetLocale) {
+ final LocaleList locales = values.getLocales();
+ int bestLocaleIndex = 0;
+ if (locales.size() > 1) {
+ if (mSupportedSystemLocales == null) {
+ mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales();
+ }
+ bestLocaleIndex = Math.max(0, locales.getFirstMatchIndex(mSupportedSystemLocales));
+ }
+ SystemProperties.set("persist.sys.locale",
+ locales.get(bestLocaleIndex).toLanguageTag());
+ LocaleList.setDefault(locales, bestLocaleIndex);
+ mAm.mHandler.sendMessage(mAm.mHandler.obtainMessage(SEND_LOCALE_TO_MOUNT_DAEMON_MSG,
+ locales.get(bestLocaleIndex)));
+ }
+
+ mConfigurationSeq = Math.max(++mConfigurationSeq, 1);
+ mTempConfig.seq = mConfigurationSeq;
+
+ // Update stored global config and notify everyone about the change.
+ mStackSupervisor.onConfigurationChanged(mTempConfig);
+
+ Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + mTempConfig);
+ // TODO(multi-display): Update UsageEvents#Event to include displayId.
+ mAm.mUsageStatsService.reportConfigurationChange(
+ mTempConfig, mAmInternal.getCurrentUserId());
+
+ // TODO: If our config changes, should we auto dismiss any currently showing dialogs?
+ updateShouldShowDialogsLocked(mTempConfig);
+
+ AttributeCache ac = AttributeCache.instance();
+ if (ac != null) {
+ ac.updateConfiguration(mTempConfig);
+ }
+
+ // Make sure all resources in our process are updated right now, so that anyone who is going
+ // to retrieve resource values after we return will be sure to get the new ones. This is
+ // especially important during boot, where the first config change needs to guarantee all
+ // resources have that config before following boot code is executed.
+ mAm.mSystemThread.applyConfigurationToResources(mTempConfig);
+
+ // We need another copy of global config because we're scheduling some calls instead of
+ // running them in place. We need to be sure that object we send will be handled unchanged.
+ final Configuration configCopy = new Configuration(mTempConfig);
+ if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) {
+ Message msg = mAm.mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG);
+ msg.obj = configCopy;
+ msg.arg1 = userId;
+ mAm.mHandler.sendMessage(msg);
+ }
+
+ for (int i = mAm.mLruProcesses.size() - 1; i >= 0; i--) {
+ ProcessRecord app = mAm.mLruProcesses.get(i);
+ try {
+ if (app.thread != null) {
+ if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Sending to proc "
+ + app.processName + " new config " + configCopy);
+ getLifecycleManager().scheduleTransaction(app.thread,
+ ConfigurationChangeItem.obtain(configCopy));
+ }
+ } catch (Exception e) {
+ Slog.e(TAG_CONFIGURATION, "Failed to schedule configuration change", e);
+ }
+ }
+
+ Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING
+ | Intent.FLAG_RECEIVER_FOREGROUND
+ | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
+ mAm.broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null,
+ OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
+ UserHandle.USER_ALL);
+ if ((changes & ActivityInfo.CONFIG_LOCALE) != 0) {
+ intent = new Intent(Intent.ACTION_LOCALE_CHANGED);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
+ | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
+ if (initLocale || !mAm.mProcessesReady) {
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+ }
+ mAm.broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null,
+ OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
+ UserHandle.USER_ALL);
+ }
+
+ // Send a broadcast to PackageInstallers if the configuration change is interesting
+ // for the purposes of installing additional splits.
+ if (!initLocale && isSplitConfigurationChange(changes)) {
+ intent = new Intent(Intent.ACTION_SPLIT_CONFIGURATION_CHANGED);
+ intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
+
+ // Typically only app stores will have this permission.
+ String[] permissions = new String[] { android.Manifest.permission.INSTALL_PACKAGES };
+ mAm.broadcastIntentLocked(null, null, intent, null, null, 0, null, null, permissions,
+ OP_NONE, null, false, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
+ }
+
+ // Override configuration of the default display duplicates global config, so we need to
+ // update it also. This will also notify WindowManager about changes.
+ performDisplayOverrideConfigUpdate(mStackSupervisor.getConfiguration(), deferResume,
+ DEFAULT_DISPLAY);
+
+ return changes;
+ }
+
+ boolean updateDisplayOverrideConfigurationLocked(Configuration values, ActivityRecord starting,
+ boolean deferResume, int displayId) {
+ return updateDisplayOverrideConfigurationLocked(values, starting, deferResume /* deferResume */,
+ displayId, null /* result */);
+ }
+
+ /**
+ * Updates override configuration specific for the selected display. If no config is provided,
+ * new one will be computed in WM based on current display info.
+ */
+ boolean updateDisplayOverrideConfigurationLocked(Configuration values,
+ ActivityRecord starting, boolean deferResume, int displayId,
+ ActivityTaskManagerService.UpdateConfigurationResult result) {
+ int changes = 0;
+ boolean kept = true;
+
+ if (mWindowManager != null) {
+ mWindowManager.deferSurfaceLayout();
+ }
+ try {
+ if (values != null) {
+ if (displayId == DEFAULT_DISPLAY) {
+ // Override configuration of the default display duplicates global config, so
+ // we're calling global config update instead for default display. It will also
+ // apply the correct override config.
+ changes = updateGlobalConfigurationLocked(values, false /* initLocale */,
+ false /* persistent */, UserHandle.USER_NULL /* userId */, deferResume);
+ } else {
+ changes = performDisplayOverrideConfigUpdate(values, deferResume, displayId);
+ }
+ }
+
+ kept = ensureConfigAndVisibilityAfterUpdate(starting, changes);
+ } finally {
+ if (mWindowManager != null) {
+ mWindowManager.continueSurfaceLayout();
+ }
+ }
+
+ if (result != null) {
+ result.changes = changes;
+ result.activityRelaunched = !kept;
+ }
+ return kept;
+ }
+
+ private int performDisplayOverrideConfigUpdate(Configuration values, boolean deferResume,
+ int displayId) {
+ mTempConfig.setTo(mStackSupervisor.getDisplayOverrideConfiguration(displayId));
+ final int changes = mTempConfig.updateFrom(values);
+ if (changes != 0) {
+ Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " "
+ + mTempConfig + " for displayId=" + displayId);
+ mStackSupervisor.setDisplayOverrideConfiguration(mTempConfig, displayId);
+
+ final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
+ if (isDensityChange && displayId == DEFAULT_DISPLAY) {
+ mAm.mAppWarnings.onDensityChanged();
+
+ mAm.killAllBackgroundProcessesExcept(N,
+ ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
+ }
+ }
+
+ // Update the configuration with WM first and check if any of the stacks need to be resized
+ // due to the configuration change. If so, resize the stacks now and do any relaunches if
+ // necessary. This way we don't need to relaunch again afterwards in
+ // ensureActivityConfiguration().
+ if (mWindowManager != null) {
+ final int[] resizedStacks =
+ mWindowManager.setNewDisplayOverrideConfiguration(mTempConfig, displayId);
+ if (resizedStacks != null) {
+ for (int stackId : resizedStacks) {
+ resizeStackWithBoundsFromWindowManager(stackId, deferResume);
+ }
+ }
+ }
+
+ return changes;
+ }
+
+ private void updateEventDispatchingLocked(boolean booted) {
+ mWindowManager.setEventDispatching(booted && !mShuttingDown);
+ }
+
+ void enableScreenAfterBoot(boolean booted) {
+ EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
+ SystemClock.uptimeMillis());
+ mWindowManager.enableScreenAfterBoot();
+
+ synchronized (mGlobalLock) {
+ updateEventDispatchingLocked(booted);
+ }
+ }
+
+ boolean canShowErrorDialogs() {
+ return mShowDialogs && !mSleeping && !mShuttingDown
+ && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
+ && !hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,
+ mAmInternal.getCurrentUserId())
+ && !(UserManager.isDeviceInDemoMode(mContext)
+ && mAmInternal.getCurrentUser().isDemo());
+ }
+
+ /**
+ * Decide based on the configuration whether we should show the ANR,
+ * crash, etc dialogs. The idea is that if there is no affordance to
+ * press the on-screen buttons, or the user experience would be more
+ * greatly impacted than the crash itself, we shouldn't show the dialog.
+ *
+ * A thought: SystemUI might also want to get told about this, the Power
+ * dialog / global actions also might want different behaviors.
+ */
+ private void updateShouldShowDialogsLocked(Configuration config) {
+ final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
+ && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
+ && config.navigation == Configuration.NAVIGATION_NONAV);
+ int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
+ final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR
+ && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
+ && modeType != Configuration.UI_MODE_TYPE_TELEVISION
+ && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
+ final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(),
+ HIDE_ERROR_DIALOGS, 0) != 0;
+ mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet;
+ }
+
+ private void updateFontScaleIfNeeded(@UserIdInt int userId) {
+ final float scaleFactor = Settings.System.getFloatForUser(mContext.getContentResolver(),
+ FONT_SCALE, 1.0f, userId);
+
+ synchronized (this) {
+ if (getGlobalConfiguration().fontScale == scaleFactor) {
+ return;
+ }
+
+ final Configuration configuration
+ = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
+ configuration.fontScale = scaleFactor;
+ updatePersistentConfiguration(configuration, userId);
+ }
+ }
+
+ // Actually is sleeping or shutting down or whatever else in the future
+ // is an inactive state.
+ boolean isSleepingOrShuttingDownLocked() {
+ return isSleepingLocked() || mShuttingDown;
+ }
+
+ boolean isSleepingLocked() {
+ return mSleeping;
+ }
+
+ /**
+ * Update AMS states when an activity is resumed. This should only be called by
+ * {@link ActivityStack#onActivityStateChanged(
+ * ActivityRecord, ActivityStack.ActivityState, String)} when an activity is resumed.
+ */
+ void setResumedActivityUncheckLocked(ActivityRecord r, String reason) {
+ final TaskRecord task = r.getTask();
+ if (task.isActivityTypeStandard()) {
+ if (mCurAppTimeTracker != r.appTimeTracker) {
+ // We are switching app tracking. Complete the current one.
+ if (mCurAppTimeTracker != null) {
+ mCurAppTimeTracker.stop();
+ mH.obtainMessage(
+ REPORT_TIME_TRACKER_MSG, mCurAppTimeTracker).sendToTarget();
+ mStackSupervisor.clearOtherAppTimeTrackers(r.appTimeTracker);
+ mCurAppTimeTracker = null;
+ }
+ if (r.appTimeTracker != null) {
+ mCurAppTimeTracker = r.appTimeTracker;
+ startTimeTrackingFocusedActivityLocked();
+ }
+ } else {
+ startTimeTrackingFocusedActivityLocked();
+ }
+ } else {
+ r.appTimeTracker = null;
+ }
+ // TODO: VI Maybe r.task.voiceInteractor || r.voiceInteractor != null
+ // TODO: Probably not, because we don't want to resume voice on switching
+ // back to this activity
+ if (task.voiceInteractor != null) {
+ startRunningVoiceLocked(task.voiceSession, r.info.applicationInfo.uid);
+ } else {
+ finishRunningVoiceLocked();
+
+ if (mLastResumedActivity != null) {
+ final IVoiceInteractionSession session;
+
+ final TaskRecord lastResumedActivityTask = mLastResumedActivity.getTask();
+ if (lastResumedActivityTask != null
+ && lastResumedActivityTask.voiceSession != null) {
+ session = lastResumedActivityTask.voiceSession;
+ } else {
+ session = mLastResumedActivity.voiceSession;
+ }
+
+ if (session != null) {
+ // We had been in a voice interaction session, but now focused has
+ // move to something different. Just finish the session, we can't
+ // return to it and retain the proper state and synchronization with
+ // the voice interaction service.
+ finishVoiceTask(session);
+ }
+ }
+ }
+
+ if (mLastResumedActivity != null && r.userId != mLastResumedActivity.userId) {
+ mAmInternal.sendForegroundProfileChanged(r.userId);
+ }
+ updateResumedAppTrace(r);
+ mLastResumedActivity = r;
+
+ mWindowManager.setFocusedApp(r.appToken, true);
+
+ applyUpdateLockStateLocked(r);
+ applyUpdateVrModeLocked(r);
+
+ EventLogTags.writeAmSetResumedActivity(
+ r == null ? -1 : r.userId,
+ r == null ? "NULL" : r.shortComponentName,
+ reason);
+ }
+
+ ActivityTaskManagerInternal.SleepToken acquireSleepToken(String tag, int displayId) {
+ synchronized (mGlobalLock) {
+ final ActivityTaskManagerInternal.SleepToken token = mStackSupervisor.createSleepTokenLocked(tag, displayId);
+ updateSleepIfNeededLocked();
+ return token;
+ }
+ }
+
+ void updateSleepIfNeededLocked() {
+ final boolean shouldSleep = !mStackSupervisor.hasAwakeDisplay();
+ final boolean wasSleeping = mSleeping;
+ boolean updateOomAdj = false;
+
+ if (!shouldSleep) {
+ // If wasSleeping is true, we need to wake up activity manager state from when
+ // we started sleeping. In either case, we need to apply the sleep tokens, which
+ // will wake up stacks or put them to sleep as appropriate.
+ if (wasSleeping) {
+ mSleeping = false;
+ startTimeTrackingFocusedActivityLocked();
+ mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
+ mStackSupervisor.comeOutOfSleepIfNeededLocked();
+ }
+ mStackSupervisor.applySleepTokensLocked(true /* applyToStacks */);
+ if (wasSleeping) {
+ updateOomAdj = true;
+ }
+ } else if (!mSleeping && shouldSleep) {
+ mSleeping = true;
+ if (mCurAppTimeTracker != null) {
+ mCurAppTimeTracker.stop();
+ }
+ mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING;
+ mStackSupervisor.goingToSleepLocked();
+ updateResumedAppTrace(null /* resumed */);
+ updateOomAdj = true;
+ }
+ if (updateOomAdj) {
+ mH.post(mAmInternal::updateOomAdj);
+ }
+ }
+
+ void updateOomAdj() {
+ mH.post(mAmInternal::updateOomAdj);
+ }
+
+ private void startTimeTrackingFocusedActivityLocked() {
+ final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked();
+ if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) {
+ mCurAppTimeTracker.start(resumedActivity.packageName);
+ }
+ }
+
+ private void updateResumedAppTrace(@Nullable ActivityRecord resumed) {
+ if (mTracedResumedActivity != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_ACTIVITY_MANAGER,
+ constructResumedTraceName(mTracedResumedActivity.packageName), 0);
+ }
+ if (resumed != null) {
+ Trace.asyncTraceBegin(TRACE_TAG_ACTIVITY_MANAGER,
+ constructResumedTraceName(resumed.packageName), 0);
+ }
+ mTracedResumedActivity = resumed;
+ }
+
+ private String constructResumedTraceName(String packageName) {
+ return "focused app: " + packageName;
+ }
+
+ /** Helper method that requests bounds from WM and applies them to stack. */
+ private void resizeStackWithBoundsFromWindowManager(int stackId, boolean deferResume) {
+ final Rect newStackBounds = new Rect();
+ final ActivityStack stack = mStackSupervisor.getStack(stackId);
+
+ // TODO(b/71548119): Revert CL introducing below once cause of mismatch is found.
+ if (stack == null) {
+ final StringWriter writer = new StringWriter();
+ final PrintWriter printWriter = new PrintWriter(writer);
+ mStackSupervisor.dumpDisplays(printWriter);
+ printWriter.flush();
+
+ Log.wtf(TAG, "stack not found:" + stackId + " displays:" + writer);
+ }
+
+ stack.getBoundsForNewConfiguration(newStackBounds);
+ mStackSupervisor.resizeStackLocked(
+ stack, !newStackBounds.isEmpty() ? newStackBounds : null /* bounds */,
+ null /* tempTaskBounds */, null /* tempTaskInsetBounds */,
+ false /* preserveWindows */, false /* allowResizeInDockedMode */, deferResume);
+ }
+
+ /** Applies latest configuration and/or visibility updates if needed. */
+ private boolean ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes) {
+ boolean kept = true;
+ final ActivityStack mainStack = mStackSupervisor.getFocusedStack();
+ // mainStack is null during startup.
+ if (mainStack != null) {
+ if (changes != 0 && starting == null) {
+ // If the configuration changed, and the caller is not already
+ // in the process of starting an activity, then find the top
+ // activity to check if its configuration needs to change.
+ starting = mainStack.topRunningActivityLocked();
+ }
+
+ if (starting != null) {
+ kept = starting.ensureActivityConfiguration(changes,
+ false /* preserveWindow */);
+ // And we need to make sure at this point that all other activities
+ // are made visible with the correct configuration.
+ mStackSupervisor.ensureActivitiesVisibleLocked(starting, changes,
+ !PRESERVE_WINDOWS);
+ }
+ }
+
+ return kept;
+ }
+
+ void logAppTooSlow(WindowProcessController app, long startTime, String msg) {
+ if (true || Build.IS_USER) {
+ return;
+ }
+
+ StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
+ StrictMode.allowThreadDiskWrites();
+ try {
+ File tracesDir = new File("/data/anr");
+ File tracesFile = null;
+ try {
+ tracesFile = File.createTempFile("app_slow", null, tracesDir);
+
+ StringBuilder sb = new StringBuilder();
+ Time tobj = new Time();
+ tobj.set(System.currentTimeMillis());
+ sb.append(tobj.format("%Y-%m-%d %H:%M:%S"));
+ sb.append(": ");
+ TimeUtils.formatDuration(SystemClock.uptimeMillis()-startTime, sb);
+ sb.append(" since ");
+ sb.append(msg);
+ FileOutputStream fos = new FileOutputStream(tracesFile);
+ fos.write(sb.toString().getBytes());
+ if (app == null) {
+ fos.write("\n*** No application process!".getBytes());
+ }
+ fos.close();
+ FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
+ } catch (IOException e) {
+ Slog.w(TAG, "Unable to prepare slow app traces file: " + tracesFile, e);
+ return;
+ }
+
+ if (app != null && app.getPid() > 0) {
+ ArrayList<Integer> firstPids = new ArrayList<Integer>();
+ firstPids.add(app.getPid());
+ dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, null, null);
+ }
+
+ File lastTracesFile = null;
+ File curTracesFile = null;
+ for (int i=9; i>=0; i--) {
+ String name = String.format(Locale.US, "slow%02d.txt", i);
+ curTracesFile = new File(tracesDir, name);
+ if (curTracesFile.exists()) {
+ if (lastTracesFile != null) {
+ curTracesFile.renameTo(lastTracesFile);
+ } else {
+ curTracesFile.delete();
+ }
+ }
+ lastTracesFile = curTracesFile;
+ }
+ tracesFile.renameTo(curTracesFile);
+ } finally {
+ StrictMode.setThreadPolicy(oldPolicy);
+ }
+ }
+
+ final class H extends Handler {
+ static final int REPORT_TIME_TRACKER_MSG = 1;
+
+ public H(Looper looper) {
+ super(looper, null, true);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case REPORT_TIME_TRACKER_MSG: {
+ AppTimeTracker tracker = (AppTimeTracker) msg.obj;
+ tracker.deliverResult(mContext);
+ } break;
+ }
+ }
+ }
+
+ final class UiHandler extends Handler {
+ static final int DISMISS_DIALOG_UI_MSG = 1;
+
+ public UiHandler() {
+ super(com.android.server.UiThread.get().getLooper(), null, true);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case DISMISS_DIALOG_UI_MSG: {
+ final Dialog d = (Dialog) msg.obj;
+ d.dismiss();
+ break;
+ }
+ }
+ }
+ }
+
+ final class LocalService extends ActivityTaskManagerInternal {
+ @Override
+ public SleepToken acquireSleepToken(String tag, int displayId) {
+ Preconditions.checkNotNull(tag);
+ return ActivityTaskManagerService.this.acquireSleepToken(tag, displayId);
+ }
+
+ @Override
+ public ComponentName getHomeActivityForUser(int userId) {
+ synchronized (mGlobalLock) {
+ ActivityRecord homeActivity = mStackSupervisor.getHomeActivityForUser(userId);
+ return homeActivity == null ? null : homeActivity.realActivity;
+ }
+ }
+
+ @Override
+ public void onLocalVoiceInteractionStarted(IBinder activity,
+ IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
+ synchronized (mGlobalLock) {
+ onLocalVoiceInteractionStartedLocked(activity, voiceSession, voiceInteractor);
+ }
+ }
+
+ @Override
+ public void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp) {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.getActivityMetricsLogger().notifyTransitionStarting(
+ reasons, timestamp);
+ }
+ }
+
+ @Override
+ public void notifyAppTransitionFinished() {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.notifyAppTransitionDone();
+ }
+ }
+
+ @Override
+ public void notifyAppTransitionCancelled() {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.notifyAppTransitionDone();
+ }
+ }
+
+ @Override
+ public List<IBinder> getTopVisibleActivities() {
+ synchronized (mGlobalLock) {
+ return mStackSupervisor.getTopVisibleActivities();
+ }
+ }
+
+ @Override
+ public void notifyDockedStackMinimizedChanged(boolean minimized) {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.setDockedStackMinimized(minimized);
+ }
+ }
+
+ @Override
+ public int startActivitiesAsPackage(String packageName, int userId, Intent[] intents,
+ Bundle bOptions) {
+ Preconditions.checkNotNull(intents, "intents");
+ final String[] resolvedTypes = new String[intents.length];
+
+ // UID of the package on user userId.
+ // "= 0" is needed because otherwise catch(RemoteException) would make it look like
+ // packageUid may not be initialized.
+ int packageUid = 0;
+ final long ident = Binder.clearCallingIdentity();
+
+ try {
+ for (int i = 0; i < intents.length; i++) {
+ resolvedTypes[i] =
+ intents[i].resolveTypeIfNeeded(mContext.getContentResolver());
+ }
+
+ packageUid = AppGlobals.getPackageManager().getPackageUid(
+ packageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId);
+ } catch (RemoteException e) {
+ // Shouldn't happen.
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+
+ synchronized (mGlobalLock) {
+ return getActivityStartController().startActivitiesInPackage(
+ packageUid, packageName,
+ intents, resolvedTypes, null /* resultTo */,
+ SafeActivityOptions.fromBundle(bOptions), userId,
+ false /* validateIncomingUser */);
+ }
+ }
+
+ @Override
+ public int startActivityAsUser(IApplicationThread caller, String callerPacakge,
+ Intent intent, Bundle options, int userId) {
+ return ActivityTaskManagerService.this.startActivityAsUser(
+ caller, callerPacakge, intent,
+ intent.resolveTypeIfNeeded(mContext.getContentResolver()),
+ null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options, userId,
+ false /*validateIncomingUser*/);
+ }
+
+ @Override
+ public void notifyKeyguardFlagsChanged(@Nullable Runnable callback) {
+ synchronized (mGlobalLock) {
+
+ // We might change the visibilities here, so prepare an empty app transition which
+ // might be overridden later if we actually change visibilities.
+ final boolean wasTransitionSet =
+ mWindowManager.getPendingAppTransition() != TRANSIT_NONE;
+ if (!wasTransitionSet) {
+ mWindowManager.prepareAppTransition(TRANSIT_NONE,
+ false /* alwaysKeepCurrent */);
+ }
+ mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
+
+ // If there was a transition set already we don't want to interfere with it as we
+ // might be starting it too early.
+ if (!wasTransitionSet) {
+ mWindowManager.executeAppTransition();
+ }
+ }
+ if (callback != null) {
+ callback.run();
+ }
+ }
+
+ @Override
+ public void notifyKeyguardTrustedChanged() {
+ synchronized (mGlobalLock) {
+ if (mKeyguardController.isKeyguardShowing(DEFAULT_DISPLAY)) {
+ mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
+ }
+ }
+ }
+
+ /**
+ * Called after virtual display Id is updated by
+ * {@link com.android.server.vr.Vr2dDisplay} with a specific
+ * {@param vrVr2dDisplayId}.
+ */
+ @Override
+ public void setVr2dDisplayId(int vr2dDisplayId) {
+ if (DEBUG_STACK) Slog.d(TAG, "setVr2dDisplayId called for: " + vr2dDisplayId);
+ synchronized (mGlobalLock) {
+ mVr2dDisplayId = vr2dDisplayId;
+ }
+ }
+
+ @Override
+ public void setFocusedActivity(IBinder token) {
+ synchronized (mGlobalLock) {
+ final ActivityRecord r = ActivityRecord.forTokenLocked(token);
+ if (r == null) {
+ throw new IllegalArgumentException(
+ "setFocusedActivity: No activity record matching token=" + token);
+ }
+ if (mStackSupervisor.moveFocusableActivityStackToFrontLocked(
+ r, "setFocusedActivity")) {
+ mStackSupervisor.resumeFocusedStackTopActivityLocked();
+ }
+ }
+ }
+
+ @Override
+ public void registerScreenObserver(ScreenObserver observer) {
+ mScreenObservers.add(observer);
+ }
+
+ @Override
+ public boolean isCallerRecents(int callingUid) {
+ return getRecentTasks().isCallerRecents(callingUid);
+ }
+
+ @Override
+ public boolean isRecentsComponentHomeActivity(int userId) {
+ return getRecentTasks().isRecentsComponentHomeActivity(userId);
+ }
+
+ @Override
+ public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
+ ActivityTaskManagerService.this.cancelRecentsAnimation(restoreHomeStackPosition);
+ }
+
+ @Override
+ public void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
+ ActivityTaskManagerService.this.enforceCallerIsRecentsOrHasPermission(permission, func);
+ }
+
+ @Override
+ public void notifyActiveVoiceInteractionServiceChanged(ComponentName component) {
+ synchronized (mGlobalLock) {
+ mActiveVoiceInteractionServiceComponent = component;
+ }
+ }
+
+ @Override
+ public void setAllowAppSwitches(@NonNull String type, int uid, int userId) {
+ if (!mAmInternal.isUserRunning(userId, ActivityManager.FLAG_OR_STOPPED)) {
+ return;
+ }
+ synchronized (mGlobalLock) {
+ ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(userId);
+ if (types == null) {
+ if (uid < 0) {
+ return;
+ }
+ types = new ArrayMap<>();
+ mAllowAppSwitchUids.put(userId, types);
+ }
+ if (uid < 0) {
+ types.remove(type);
+ } else {
+ types.put(type, uid);
+ }
+ }
+ }
+
+ @Override
+ public void onUserStopped(int userId) {
+ synchronized (mGlobalLock) {
+ getRecentTasks().unloadUserDataFromMemoryLocked(userId);
+ mAllowAppSwitchUids.remove(userId);
+ }
+ }
+
+ @Override
+ public boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
+ synchronized (mGlobalLock) {
+ return ActivityTaskManagerService.this.isGetTasksAllowed(
+ caller, callingPid, callingUid);
+ }
+ }
+
+ @Override
+ public void onProcessAdded(WindowProcessController proc) {
+ synchronized (mGlobalLock) {
+ mProcessNames.put(proc.mName, proc.mUid, proc);
+ }
+ }
+
+ @Override
+ public void onProcessRemoved(String name, int uid) {
+ synchronized (mGlobalLock) {
+ mProcessNames.remove(name, uid);
+ }
+ }
+
+ @Override
+ public void onCleanUpApplicationRecord(WindowProcessController proc) {
+ synchronized (mGlobalLock) {
+ if (proc == mHomeProcess) {
+ mHomeProcess = null;
+ }
+ if (proc == mPreviousProcess) {
+ mPreviousProcess = null;
+ }
+ }
+ }
+
+ @Override
+ public int getTopProcessState() {
+ synchronized (mGlobalLock) {
+ return mTopProcessState;
+ }
+ }
+
+ @Override
+ public boolean isSleeping() {
+ synchronized (mGlobalLock) {
+ return isSleepingLocked();
+ }
+ }
+
+ @Override
+ public boolean isShuttingDown() {
+ synchronized (mGlobalLock) {
+ return mShuttingDown;
+ }
+ }
+
+ @Override
+ public boolean shuttingDown(boolean booted, int timeout) {
+ synchronized (mGlobalLock) {
+ mShuttingDown = true;
+ mStackSupervisor.prepareForShutdownLocked();
+ updateEventDispatchingLocked(booted);
+ return mStackSupervisor.shutdownLocked(timeout);
+ }
+ }
+
+ @Override
+ public void enableScreenAfterBoot(boolean booted) {
+ synchronized (mGlobalLock) {
+ EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
+ SystemClock.uptimeMillis());
+ mWindowManager.enableScreenAfterBoot();
+ updateEventDispatchingLocked(booted);
+ }
+ }
+
+ @Override
+ public boolean showStrictModeViolationDialog() {
+ synchronized (mGlobalLock) {
+ return mShowDialogs && !mSleeping && !mShuttingDown;
+ }
+ }
+
+ @Override
+ public void showSystemReadyErrorDialogsIfNeeded() {
+ synchronized (mGlobalLock) {
+ try {
+ if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
+ Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
+ + " data partition or your device will be unstable.");
+ mUiHandler.post(() -> {
+ if (mShowDialogs) {
+ AlertDialog d = new BaseErrorDialog(mUiContext);
+ d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
+ d.setCancelable(false);
+ d.setTitle(mUiContext.getText(R.string.android_system_label));
+ d.setMessage(mUiContext.getText(R.string.system_error_wipe_data));
+ d.setButton(DialogInterface.BUTTON_POSITIVE,
+ mUiContext.getText(R.string.ok),
+ mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
+ d.show();
+ }
+ });
+ }
+ } catch (RemoteException e) {
+ }
+
+ if (!Build.isBuildConsistent()) {
+ Slog.e(TAG, "Build fingerprint is not consistent, warning user");
+ mUiHandler.post(() -> {
+ if (mShowDialogs) {
+ AlertDialog d = new BaseErrorDialog(mUiContext);
+ d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
+ d.setCancelable(false);
+ d.setTitle(mUiContext.getText(R.string.android_system_label));
+ d.setMessage(mUiContext.getText(R.string.system_error_manufacturer));
+ d.setButton(DialogInterface.BUTTON_POSITIVE,
+ mUiContext.getText(R.string.ok),
+ mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
+ d.show();
+ }
+ });
+ }
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/am/AppErrorDialog.java b/services/core/java/com/android/server/am/AppErrorDialog.java
index 68c63a2d595b..cde633dddb3b 100644
--- a/services/core/java/com/android/server/am/AppErrorDialog.java
+++ b/services/core/java/com/android/server/am/AppErrorDialog.java
@@ -92,7 +92,7 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen
attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR
| WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
getWindow().setAttributes(attrs);
- if (mProc.persistent) {
+ if (mProc.isPersistent()) {
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
}
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index a6dafbb1db36..27567a77f1f7 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -25,7 +25,6 @@ import com.android.server.Watchdog;
import android.app.ActivityManager;
import android.app.ActivityOptions;
-import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.ApplicationErrorReport;
import android.app.Dialog;
@@ -45,7 +44,6 @@ import android.provider.Settings;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.EventLog;
-import android.util.Log;
import android.util.Slog;
import android.util.StatsLog;
import android.util.SparseArray;
@@ -57,7 +55,6 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.Set;
import static com.android.server.Watchdog.NATIVE_STACKS_OF_INTEREST;
@@ -314,9 +311,9 @@ class AppErrors {
}
void killAppAtUserRequestLocked(ProcessRecord app, Dialog fromDialog) {
- app.crashing = false;
+ app.setCrashing(false);
app.crashingReport = null;
- app.notResponding = false;
+ app.setNotResponding(false);
app.notRespondingReport = null;
if (app.anrDialog == fromDialog) {
app.anrDialog = null;
@@ -409,7 +406,7 @@ class AppErrors {
// If a persistent app is stuck in a crash loop, the device isn't very
// usable, so we want to consider sending out a rescue party.
- if (r != null && r.persistent) {
+ if (r != null && r.isPersistent()) {
RescueParty.notePersistentAppCrash(mContext, r.uid);
}
@@ -471,7 +468,7 @@ class AppErrors {
mService.removeProcessLocked(r, false, true, "crash");
if (task != null) {
try {
- mService.startActivityFromRecents(task.taskId,
+ mService.mActivityTaskManager.startActivityFromRecents(task.taskId,
ActivityOptions.makeBasic().toBundle());
} catch (IllegalArgumentException e) {
// Hmm, that didn't work, app might have crashed before creating a
@@ -479,7 +476,7 @@ class AppErrors {
final Set<String> cats = task.intent != null
? task.intent.getCategories() : null;
if (cats != null && cats.contains(Intent.CATEGORY_LAUNCHER)) {
- mService.getActivityStartController().startActivityInPackage(
+ mService.mActivityTaskManager.getActivityStartController().startActivityInPackage(
task.mCallingUid, callingPid, callingUid, task.mCallingPackage,
task.intent, null, null, null, 0, 0,
new SafeActivityOptions(ActivityOptions.makeBasic()),
@@ -493,8 +490,8 @@ class AppErrors {
long orig = Binder.clearCallingIdentity();
try {
// Kill it with fire!
- mService.mStackSupervisor.handleAppCrashLocked(r);
- if (!r.persistent) {
+ mService.mStackSupervisor.handleAppCrashLocked(r.getWindowProcessController());
+ if (!r.isPersistent()) {
mService.removeProcessLocked(r, false, false, "crash");
mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
@@ -532,7 +529,7 @@ class AppErrors {
String shortMsg, String longMsg,
String stackTrace, long timeMillis,
int callingPid, int callingUid) {
- if (mService.mController == null) {
+ if (mService.mActivityTaskManager.mController == null) {
return false;
}
@@ -540,7 +537,7 @@ class AppErrors {
String name = r != null ? r.processName : null;
int pid = r != null ? r.pid : callingPid;
int uid = r != null ? r.info.uid : callingUid;
- if (!mService.mController.appCrashed(name, pid,
+ if (!mService.mActivityTaskManager.mController.appCrashed(name, pid,
shortMsg, longMsg, timeMillis, crashInfo.stackTrace)) {
if ("1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"))
&& "Native crash".equals(crashInfo.exceptionClassName)) {
@@ -563,7 +560,7 @@ class AppErrors {
return true;
}
} catch (RemoteException e) {
- mService.mController = null;
+ mService.mActivityTaskManager.mController = null;
Watchdog.getInstance().setActivityController(null);
}
return false;
@@ -571,11 +568,11 @@ class AppErrors {
private boolean makeAppCrashingLocked(ProcessRecord app,
String shortMsg, String longMsg, String stackTrace, AppErrorDialog.Data data) {
- app.crashing = true;
+ app.setCrashing(true);
app.crashingReport = generateProcessError(app,
ActivityManager.ProcessErrorStateInfo.CRASHED, null, shortMsg, longMsg, stackTrace);
startAppProblemLocked(app);
- app.stopFreezingAllLocked();
+ app.getWindowProcessController().stopFreezingActivities();
return handleAppCrashLocked(app, "force-crash" /*reason*/, shortMsg, longMsg, stackTrace,
data);
}
@@ -643,7 +640,7 @@ class AppErrors {
return null;
}
- if (!r.crashing && !r.notResponding && !r.forceCrashReport) {
+ if (!r.isCrashing() && !r.isNotResponding() && !r.forceCrashReport) {
return null;
}
@@ -654,10 +651,10 @@ class AppErrors {
report.time = timeMillis;
report.systemApp = (r.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
- if (r.crashing || r.forceCrashReport) {
+ if (r.isCrashing() || r.forceCrashReport) {
report.type = ApplicationErrorReport.TYPE_CRASH;
report.crashInfo = crashInfo;
- } else if (r.notResponding) {
+ } else if (r.isNotResponding()) {
report.type = ApplicationErrorReport.TYPE_ANR;
report.anrInfo = new ApplicationErrorReport.AnrInfo();
@@ -715,8 +712,8 @@ class AppErrors {
+ " has crashed too many times: killing!");
EventLog.writeEvent(EventLogTags.AM_PROCESS_CRASHED_TOO_MUCH,
app.userId, app.info.processName, app.uid);
- mService.mStackSupervisor.handleAppCrashLocked(app);
- if (!app.persistent) {
+ mService.mStackSupervisor.handleAppCrashLocked(app.getWindowProcessController());
+ if (!app.isPersistent()) {
// We don't want to start this process again until the user
// explicitly does so... but for persistent process, we really
// need to keep it running. If a persistent process is actually
@@ -744,7 +741,7 @@ class AppErrors {
mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
} else {
final TaskRecord affectedTask =
- mService.mStackSupervisor.finishTopCrashedActivitiesLocked(app, reason);
+ mService.mStackSupervisor.finishTopCrashedActivitiesLocked(app.getWindowProcessController(), reason);
if (data != null) {
data.task = affectedTask;
}
@@ -762,21 +759,11 @@ class AppErrors {
// replaced by a third-party app, clear the package preferred activities from packages
// with a home activity running in the process to prevent a repeatedly crashing app
// from blocking the user to manually clear the list.
- final ArrayList<ActivityRecord> activities = app.activities;
- if (app == mService.mHomeProcess && activities.size() > 0
- && (mService.mHomeProcess.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
- for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- final ActivityRecord r = activities.get(activityNdx);
- if (r.isActivityTypeHome()) {
- Log.i(TAG, "Clearing package preferred activities from " + r.packageName);
- try {
- ActivityThread.getPackageManager()
- .clearPackagePreferredActivities(r.packageName);
- } catch (RemoteException c) {
- // pm is in same process, this will never happen.
- }
- }
- }
+ final WindowProcessController proc = app.getWindowProcessController();
+ final WindowProcessController homeProc = mService.mActivityTaskManager.mHomeProcess;
+ if (proc == homeProc && proc.hasActivities()
+ && (homeProc.mInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ proc.clearPackagePreferredForHomeActivities();
}
if (!app.isolated) {
@@ -837,7 +824,8 @@ class AppErrors {
mService.mUserController.getCurrentUserId()) != 0;
final boolean crashSilenced = mAppsNotReportingCrashes != null &&
mAppsNotReportingCrashes.contains(proc.info.packageName);
- if ((mService.canShowErrorDialogs() || showBackground) && !crashSilenced
+ if ((mService.mActivityTaskManager.canShowErrorDialogs() || showBackground)
+ && !crashSilenced
&& (showFirstCrash || showFirstCrashDevOption || data.repeating)) {
proc.crashDialog = dialogToShow = new AppErrorDialog(mContext, mService, data);
} else {
@@ -887,16 +875,16 @@ class AppErrors {
ArrayList<Integer> firstPids = new ArrayList<Integer>(5);
SparseArray<Boolean> lastPids = new SparseArray<Boolean>(20);
- if (mService.mController != null) {
+ if (mService.mActivityTaskManager.mController != null) {
try {
// 0 == continue, -1 = kill process immediately
- int res = mService.mController.appEarlyNotResponding(
+ int res = mService.mActivityTaskManager.mController.appEarlyNotResponding(
app.processName, app.pid, annotation);
if (res < 0 && app.pid != MY_PID) {
app.kill("anr", true);
}
} catch (RemoteException e) {
- mService.mController = null;
+ mService.mActivityTaskManager.mController = null;
Watchdog.getInstance().setActivityController(null);
}
}
@@ -914,13 +902,13 @@ class AppErrors {
synchronized (mService) {
// PowerManager.reboot() can block for a long time, so ignore ANRs while shutting down.
- if (mService.mShuttingDown) {
+ if (mService.mActivityTaskManager.mShuttingDown) {
Slog.i(TAG, "During shutdown skipping ANR: " + app + " " + annotation);
return;
- } else if (app.notResponding) {
+ } else if (app.isNotResponding()) {
Slog.i(TAG, "Skipping duplicate ANR: " + app + " " + annotation);
return;
- } else if (app.crashing) {
+ } else if (app.isCrashing()) {
Slog.i(TAG, "Crashing app skipping ANR: " + app + " " + annotation);
return;
} else if (app.killedByAm) {
@@ -933,7 +921,7 @@ class AppErrors {
// In case we come through here for the same app before completing
// this one, mark as anring now so we will bail out.
- app.notResponding = true;
+ app.setNotResponding(true);
// Log the ANR to the event log.
EventLog.writeEvent(EventLogTags.AM_ANR, app.userId, app.pid,
@@ -946,8 +934,8 @@ class AppErrors {
isSilentANR = !showBackground && !isInterestingForBackgroundTraces(app);
if (!isSilentANR) {
int parentPid = app.pid;
- if (parent != null && parent.app != null && parent.app.pid > 0) {
- parentPid = parent.app.pid;
+ if (parent != null && parent.app != null && parent.app.getPid() > 0) {
+ parentPid = parent.app.getPid();
}
if (parentPid != app.pid) firstPids.add(parentPid);
@@ -958,7 +946,7 @@ class AppErrors {
if (r != null && r.thread != null) {
int pid = r.pid;
if (pid > 0 && pid != app.pid && pid != parentPid && pid != MY_PID) {
- if (r.persistent) {
+ if (r.isPersistent()) {
firstPids.add(pid);
if (DEBUG_ANR) Slog.i(TAG, "Adding persistent proc: " + r);
} else if (r.treatLikeActivity) {
@@ -1054,10 +1042,10 @@ class AppErrors {
mService.addErrorToDropBox("anr", app, app.processName, activity, parent, annotation,
cpuInfo, tracesFile, null);
- if (mService.mController != null) {
+ if (mService.mActivityTaskManager.mController != null) {
try {
// 0 == show dialog, 1 = keep waiting, -1 = kill process immediately
- int res = mService.mController.appNotResponding(
+ int res = mService.mActivityTaskManager.mController.appNotResponding(
app.processName, app.pid, info.toString());
if (res != 0) {
if (res < 0 && app.pid != MY_PID) {
@@ -1070,7 +1058,7 @@ class AppErrors {
return;
}
} catch (RemoteException e) {
- mService.mController = null;
+ mService.mActivityTaskManager.mController = null;
Watchdog.getInstance().setActivityController(null);
}
}
@@ -1100,12 +1088,12 @@ class AppErrors {
private void makeAppNotRespondingLocked(ProcessRecord app,
String activity, String shortMsg, String longMsg) {
- app.notResponding = true;
+ app.setNotResponding(true);
app.notRespondingReport = generateProcessError(app,
ActivityManager.ProcessErrorStateInfo.NOT_RESPONDING,
activity, shortMsg, longMsg, null);
startAppProblemLocked(app);
- app.stopFreezingAllLocked();
+ app.getWindowProcessController().stopFreezingActivities();
}
void handleShowAnrUi(Message msg) {
@@ -1135,7 +1123,7 @@ class AppErrors {
boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
- if (mService.canShowErrorDialogs() || showBackground) {
+ if (mService.mActivityTaskManager.canShowErrorDialogs() || showBackground) {
dialogToShow = new AppNotRespondingDialog(mService, mContext, data);
proc.anrDialog = dialogToShow;
} else {
diff --git a/services/core/java/com/android/server/am/AppNotRespondingDialog.java b/services/core/java/com/android/server/am/AppNotRespondingDialog.java
index 8a88a69a7d82..7c983ff427ad 100644
--- a/services/core/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/core/java/com/android/server/am/AppNotRespondingDialog.java
@@ -157,7 +157,7 @@ final class AppNotRespondingDialog extends BaseErrorDialog implements View.OnCli
System.currentTimeMillis(), null);
}
- app.notResponding = false;
+ app.setNotResponding(false);
app.notRespondingReport = null;
if (app.anrDialog == AppNotRespondingDialog.this) {
app.anrDialog = null;
diff --git a/services/core/java/com/android/server/am/AppTaskImpl.java b/services/core/java/com/android/server/am/AppTaskImpl.java
index bb6c6a0cbf7f..a1f1ff9cc3ec 100644
--- a/services/core/java/com/android/server/am/AppTaskImpl.java
+++ b/services/core/java/com/android/server/am/AppTaskImpl.java
@@ -20,7 +20,6 @@ import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS
import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
import android.app.ActivityManager;
-import android.app.ActivityOptions;
import android.app.IAppTask;
import android.app.IApplicationThread;
import android.content.Intent;
@@ -35,12 +34,12 @@ import android.os.UserHandle;
* only the process that calls getAppTasks() can call the AppTask methods.
*/
class AppTaskImpl extends IAppTask.Stub {
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private int mTaskId;
private int mCallingUid;
- public AppTaskImpl(ActivityManagerService service, int taskId, int callingUid) {
+ public AppTaskImpl(ActivityTaskManagerService service, int taskId, int callingUid) {
mService = service;
mTaskId = taskId;
mCallingUid = callingUid;
@@ -57,7 +56,7 @@ class AppTaskImpl extends IAppTask.Stub {
public void finishAndRemoveTask() {
checkCaller();
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
long origId = Binder.clearCallingIdentity();
try {
// We remove the task from recents to preserve backwards
@@ -75,7 +74,7 @@ class AppTaskImpl extends IAppTask.Stub {
public ActivityManager.RecentTaskInfo getTaskInfo() {
checkCaller();
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
long origId = Binder.clearCallingIdentity();
try {
TaskRecord tr = mService.mStackSupervisor.anyTaskForIdLocked(mTaskId,
@@ -98,7 +97,7 @@ class AppTaskImpl extends IAppTask.Stub {
final int callingUid = Binder.getCallingUid();
final long origId = Binder.clearCallingIdentity();
try {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
mService.mStackSupervisor.startActivityFromRecents(callingPid, callingUid, mTaskId,
null);
}
@@ -115,7 +114,7 @@ class AppTaskImpl extends IAppTask.Stub {
int callingUser = UserHandle.getCallingUserId();
TaskRecord tr;
IApplicationThread appThread;
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
tr = mService.mStackSupervisor.anyTaskForIdLocked(mTaskId,
MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
if (tr == null) {
@@ -141,7 +140,7 @@ class AppTaskImpl extends IAppTask.Stub {
public void setExcludeFromRecents(boolean exclude) {
checkCaller();
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
long origId = Binder.clearCallingIdentity();
try {
TaskRecord tr = mService.mStackSupervisor.anyTaskForIdLocked(mTaskId,
diff --git a/services/core/java/com/android/server/am/AssistDataRequester.java b/services/core/java/com/android/server/am/AssistDataRequester.java
index 9f7621f2e78e..395b0da15f45 100644
--- a/services/core/java/com/android/server/am/AssistDataRequester.java
+++ b/services/core/java/com/android/server/am/AssistDataRequester.java
@@ -17,12 +17,12 @@
package com.android.server.am;
import static android.app.ActivityManager.ASSIST_CONTEXT_FULL;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.OP_NONE;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
+import android.app.ActivityTaskManager;
import android.app.AppOpsManager;
-import android.app.IActivityManager;
import android.app.IAssistDataReceiver;
import android.content.Context;
import android.graphics.Bitmap;
@@ -48,7 +48,6 @@ public class AssistDataRequester extends IAssistDataReceiver.Stub {
public static final String KEY_RECEIVER_EXTRA_COUNT = "count";
public static final String KEY_RECEIVER_EXTRA_INDEX = "index";
- private IActivityManager mService;
private IWindowManager mWindowManager;
private Context mContext;
private AppOpsManager mAppOpsManager;
@@ -117,14 +116,13 @@ public class AssistDataRequester extends IAssistDataReceiver.Stub {
* This can be {@link AppOpsManager#OP_NONE} to indicate that
* screenshots should never be fetched.
*/
- public AssistDataRequester(Context context, IActivityManager service,
+ public AssistDataRequester(Context context,
IWindowManager windowManager, AppOpsManager appOpsManager,
AssistDataRequesterCallbacks callbacks, Object callbacksLock,
int requestStructureAppOps, int requestScreenshotAppOps) {
mCallbacks = callbacks;
mCallbacksLock = callbacksLock;
mWindowManager = windowManager;
- mService = service;
mContext = context;
mAppOpsManager = appOpsManager;
mRequestStructureAppOps = requestStructureAppOps;
@@ -163,7 +161,8 @@ public class AssistDataRequester extends IAssistDataReceiver.Stub {
// Ensure that the current activity supports assist data
boolean isAssistDataAllowed = false;
try {
- isAssistDataAllowed = mService.isAssistDataAllowedOnCurrentActivity();
+ isAssistDataAllowed =
+ ActivityTaskManager.getService().isAssistDataAllowedOnCurrentActivity();
} catch (RemoteException e) {
// Should never happen
}
@@ -188,9 +187,9 @@ public class AssistDataRequester extends IAssistDataReceiver.Stub {
Bundle receiverExtras = new Bundle();
receiverExtras.putInt(KEY_RECEIVER_EXTRA_INDEX, i);
receiverExtras.putInt(KEY_RECEIVER_EXTRA_COUNT, numActivities);
- if (mService.requestAssistContextExtras(ASSIST_CONTEXT_FULL, this,
- receiverExtras, topActivity, /* focused= */ i == 0,
- /* newSessionId= */ i == 0)) {
+ if (ActivityTaskManager.getService().requestAssistContextExtras(
+ ASSIST_CONTEXT_FULL, this, receiverExtras, topActivity,
+ /* focused= */ i == 0, /* newSessionId= */ i == 0)) {
mPendingDataCount++;
} else if (i == 0) {
// Wasn't allowed... given that, let's not do the screenshot either.
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index 49fa902d161d..d9a8818c3988 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -31,6 +31,7 @@ import android.telephony.ModemActivityInfo;
import android.telephony.TelephonyManager;
import android.util.IntArray;
import android.util.Slog;
+import android.util.StatsLog;
import android.util.TimeUtils;
import com.android.internal.annotations.GuardedBy;
@@ -367,6 +368,8 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
// Clean up any UIDs if necessary.
synchronized (mStats) {
for (int uid : uidsToRemove) {
+ StatsLog.write(StatsLog.ISOLATED_UID_CHANGED, -1, uid,
+ StatsLog.ISOLATED_UID_CHANGED__EVENT__REMOVED);
mStats.removeIsolatedUidLocked(uid);
}
mStats.clearPendingRemovedUids();
@@ -543,14 +546,25 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs;
final long scanTimeMs = latest.mControllerScanTimeMs - lastScanMs;
- if (txTimeMs < 0 || rxTimeMs < 0 || scanTimeMs < 0) {
+ if (txTimeMs < 0 || rxTimeMs < 0 || scanTimeMs < 0 || idleTimeMs < 0) {
// The stats were reset by the WiFi system (which is why our delta is negative).
- // Returns the unaltered stats.
- delta.mControllerEnergyUsed = latest.mControllerEnergyUsed;
- delta.mControllerRxTimeMs = latest.mControllerRxTimeMs;
- delta.mControllerTxTimeMs = latest.mControllerTxTimeMs;
- delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs;
- delta.mControllerScanTimeMs = latest.mControllerScanTimeMs;
+ // Returns the unaltered stats. The total on time should not exceed the time
+ // duartion between reports.
+ final long totalOnTimeMs = latest.mControllerTxTimeMs + latest.mControllerRxTimeMs
+ + latest.mControllerIdleTimeMs;
+ if (totalOnTimeMs <= timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) {
+ delta.mControllerEnergyUsed = latest.mControllerEnergyUsed;
+ delta.mControllerRxTimeMs = latest.mControllerRxTimeMs;
+ delta.mControllerTxTimeMs = latest.mControllerTxTimeMs;
+ delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs;
+ delta.mControllerScanTimeMs = latest.mControllerScanTimeMs;
+ } else {
+ delta.mControllerEnergyUsed = 0;
+ delta.mControllerRxTimeMs = 0;
+ delta.mControllerTxTimeMs = 0;
+ delta.mControllerIdleTimeMs = 0;
+ delta.mControllerScanTimeMs = 0;
+ }
Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta);
} else {
final long totalActiveTimeMs = txTimeMs + rxTimeMs;
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index ef23a83cd881..ab9ba0894436 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -59,6 +59,7 @@ import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.PowerProfile;
import com.android.internal.os.RpmStats;
import com.android.internal.util.DumpUtils;
+import com.android.internal.util.ParseUtils;
import com.android.server.LocalServices;
import java.io.File;
@@ -395,6 +396,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
mStats.writeToParcel(out, 0);
}
byte[] data = out.marshall();
+ if (DBG) Slog.d(TAG, "getStatisticsStream parcel size is:" + data.length);
out.recycle();
try {
return ParcelFileDescriptor.fromData(data, "battery-stats");
@@ -1222,6 +1224,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
pw.println(" --proto: write the current aggregate stats (without history) in proto format.");
pw.println(" --history: show only history data.");
pw.println(" --history-start <num>: show only history data starting at given time offset.");
+ pw.println(" --history-create-events <num>: create <num> of battery history events.");
pw.println(" --charged: only output data since last charged.");
pw.println(" --daily: only output full daily data.");
pw.println(" --reset: reset the stats, clearing all current data.");
@@ -1310,8 +1313,21 @@ public final class BatteryStatsService extends IBatteryStats.Stub
dumpHelp(pw);
return;
}
- historyStart = Long.parseLong(args[i]);
+ historyStart = ParseUtils.parseLong(args[i], 0);
writeData = true;
+ } else if ("--history-create-events".equals(arg)) {
+ i++;
+ if (i >= args.length) {
+ pw.println("Missing events argument for --history-create-events");
+ dumpHelp(pw);
+ return;
+ }
+ final long events = ParseUtils.parseLong(args[i], 0);
+ synchronized (mStats) {
+ mStats.createFakeHistoryEvents(events);
+ pw.println("Battery history create events started.");
+ noOutput = true;
+ }
} else if ("-c".equals(arg)) {
useCheckinFormat = true;
flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index c9a26cbb3287..a9fd51d93fe4 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -304,7 +304,7 @@ public final class BroadcastQueue {
app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver,
mService.compatibilityInfoForPackageLocked(r.curReceiver.applicationInfo),
r.resultCode, r.resultData, r.resultExtras, r.ordered, r.userId,
- app.repProcState);
+ app.getReportedProcState());
if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"Process cur broadcast " + r + " DELIVERED for app " + app);
started = true;
@@ -492,7 +492,7 @@ public final class BroadcastQueue {
// correctly ordered with other one-way calls.
try {
app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
- data, extras, ordered, sticky, sendingUser, app.repProcState);
+ data, extras, ordered, sticky, sendingUser, app.getReportedProcState());
// TODO: Uncomment this when (b/28322359) is fixed and we aren't getting
// DeadObjectException when the process isn't actually dead.
//} catch (DeadObjectException ex) {
@@ -618,7 +618,7 @@ public final class BroadcastQueue {
}
if (!skip && (filter.receiverList.app == null || filter.receiverList.app.killed
- || filter.receiverList.app.crashing)) {
+ || filter.receiverList.app.isCrashing())) {
Slog.w(TAG, "Skipping deliver [" + mQueueName + "] " + r
+ " to " + filter.receiverList + ": process gone or crashing");
skip = true;
@@ -885,7 +885,7 @@ public final class BroadcastQueue {
synchronized (mService.mPidsSelfLocked) {
ProcessRecord proc = mService.mPidsSelfLocked.get(
mPendingBroadcast.curApp.pid);
- isDead = proc == null || proc.crashing;
+ isDead = proc == null || proc.isCrashing();
}
} else {
final ProcessRecord proc = mService.mProcessNames.get(
@@ -1210,7 +1210,7 @@ public final class BroadcastQueue {
+ " (uid " + r.callingUid + ")");
skip = true;
}
- if (r.curApp != null && r.curApp.crashing) {
+ if (r.curApp != null && r.curApp.isCrashing()) {
// If the target process is crashing, just skip it.
Slog.w(TAG, "Skipping deliver ordered [" + mQueueName + "] " + r
+ " to " + r.curApp + ": process crashing");
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index 574ca4a340ee..7e15947a1f28 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -32,6 +32,8 @@ import android.util.PrintWriterPrinter;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Arrays;
@@ -298,9 +300,16 @@ final class BroadcastRecord extends Binder {
return new BroadcastRecord(this, intent.maybeStripForHistory());
}
+ @VisibleForTesting
boolean cleanupDisabledPackageReceiversLocked(
String packageName, Set<String> filterByClasses, int userId, boolean doit) {
- if ((userId != UserHandle.USER_ALL && this.userId != userId) || receivers == null) {
+ if (receivers == null) {
+ return false;
+ }
+
+ final boolean cleanupAllUsers = userId == UserHandle.USER_ALL;
+ final boolean sendToAllUsers = this.userId == UserHandle.USER_ALL;
+ if (this.userId != userId && !cleanupAllUsers && !sendToAllUsers) {
return false;
}
@@ -316,7 +325,8 @@ final class BroadcastRecord extends Binder {
final boolean sameComponent = packageName == null
|| (info.applicationInfo.packageName.equals(packageName)
&& (filterByClasses == null || filterByClasses.contains(info.name)));
- if (sameComponent) {
+ if (sameComponent && (cleanupAllUsers
+ || UserHandle.getUserId(info.applicationInfo.uid) == userId)) {
if (!doit) {
return true;
}
diff --git a/services/core/java/com/android/server/am/CompatModePackages.java b/services/core/java/com/android/server/am/CompatModePackages.java
index c6947abf9a26..38254b881f46 100644
--- a/services/core/java/com/android/server/am/CompatModePackages.java
+++ b/services/core/java/com/android/server/am/CompatModePackages.java
@@ -219,25 +219,10 @@ public final class CompatModePackages {
: ActivityManager.COMPAT_MODE_DISABLED;
}
- public boolean getFrontActivityAskCompatModeLocked() {
- ActivityRecord r = mService.getFocusedStack().topRunningActivityLocked();
- if (r == null) {
- return false;
- }
- return getPackageAskCompatModeLocked(r.packageName);
- }
-
public boolean getPackageAskCompatModeLocked(String packageName) {
return (getPackageFlags(packageName)&COMPAT_FLAG_DONT_ASK) == 0;
}
- public void setFrontActivityAskCompatModeLocked(boolean ask) {
- ActivityRecord r = mService.getFocusedStack().topRunningActivityLocked();
- if (r != null) {
- setPackageAskCompatModeLocked(r.packageName, ask);
- }
- }
-
public void setPackageAskCompatModeLocked(String packageName, boolean ask) {
setPackageFlagLocked(packageName, COMPAT_FLAG_DONT_ASK, ask);
}
@@ -255,23 +240,6 @@ public final class CompatModePackages {
}
}
- public int getFrontActivityScreenCompatModeLocked() {
- ActivityRecord r = mService.getFocusedStack().topRunningActivityLocked();
- if (r == null) {
- return ActivityManager.COMPAT_MODE_UNKNOWN;
- }
- return computeCompatModeLocked(r.info.applicationInfo);
- }
-
- public void setFrontActivityScreenCompatModeLocked(int mode) {
- ActivityRecord r = mService.getFocusedStack().topRunningActivityLocked();
- if (r == null) {
- Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity");
- return;
- }
- setPackageScreenCompatModeLocked(r.info.applicationInfo, mode);
- }
-
public int getPackageScreenCompatModeLocked(String packageName) {
ApplicationInfo ai = null;
try {
@@ -297,7 +265,7 @@ public final class CompatModePackages {
setPackageScreenCompatModeLocked(ai, mode);
}
- private void setPackageScreenCompatModeLocked(ApplicationInfo ai, int mode) {
+ void setPackageScreenCompatModeLocked(ApplicationInfo ai, int mode) {
final String packageName = ai.packageName;
int curFlags = getPackageFlags(packageName);
@@ -349,7 +317,7 @@ public final class CompatModePackages {
scheduleWrite();
- final ActivityStack stack = mService.getFocusedStack();
+ final ActivityStack stack = mService.mActivityTaskManager.getFocusedStack();
ActivityRecord starting = stack.restartPackage(packageName);
// Tell all processes that loaded this package about the change.
diff --git a/services/core/java/com/android/server/am/ConnectionRecord.java b/services/core/java/com/android/server/am/ConnectionRecord.java
index 679024ee4c94..fa8e6c431770 100644
--- a/services/core/java/com/android/server/am/ConnectionRecord.java
+++ b/services/core/java/com/android/server/am/ConnectionRecord.java
@@ -16,12 +16,18 @@
package com.android.server.am;
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
+
import android.app.IServiceConnection;
import android.app.PendingIntent;
import android.content.Context;
+import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
+import com.android.internal.app.procstats.AssociationState;
+import com.android.internal.app.procstats.ProcessStats;
+
import java.io.PrintWriter;
/**
@@ -34,6 +40,9 @@ final class ConnectionRecord {
final int flags; // Binding options.
final int clientLabel; // String resource labeling this client.
final PendingIntent clientIntent; // How to launch the client.
+ final int clientUid; // The identity of this connection's client
+ final String clientProcessName; // The source process of this connection's client
+ public AssociationState.SourceState association; // Association tracking
String stringName; // Caching of toString.
boolean serviceDead; // Well is it?
@@ -83,14 +92,54 @@ final class ConnectionRecord {
}
ConnectionRecord(AppBindRecord _binding, ActivityRecord _activity,
- IServiceConnection _conn, int _flags,
- int _clientLabel, PendingIntent _clientIntent) {
+ IServiceConnection _conn, int _flags,
+ int _clientLabel, PendingIntent _clientIntent,
+ int _clientUid, String _clientProcessName) {
binding = _binding;
activity = _activity;
conn = _conn;
flags = _flags;
clientLabel = _clientLabel;
clientIntent = _clientIntent;
+ clientUid = _clientUid;
+ clientProcessName = _clientProcessName;
+ }
+
+ public void startAssociationIfNeeded() {
+ // If we don't already have an active association, create one... but only if this
+ // is an association between two different processes.
+ if (ActivityManagerService.TRACK_PROCSTATS_ASSOCIATIONS
+ && association == null && binding.service.app != null
+ && (binding.service.appInfo.uid != clientUid
+ || !binding.service.processName.equals(clientProcessName))) {
+ ProcessStats.ProcessStateHolder holder = binding.service.app.pkgList.get(
+ binding.service.name.getPackageName());
+ if (holder == null) {
+ Slog.wtf(TAG_AM, "No package in referenced service "
+ + binding.service.name.toShortString() + ": proc=" + binding.service.app);
+ } else if (holder.pkg == null) {
+ Slog.wtf(TAG_AM, "Inactive holder in referenced service "
+ + binding.service.name.toShortString() + ": proc=" + binding.service.app);
+ } else {
+ association = holder.pkg.getAssociationStateLocked(holder.state,
+ binding.service.name.getClassName()).startSource(clientUid,
+ clientProcessName);
+
+ }
+ }
+ }
+
+ public void trackProcState(int procState, int seq, long now) {
+ if (association != null) {
+ association.trackProcState(procState, seq, now);
+ }
+ }
+
+ public void stopAssociation() {
+ if (association != null) {
+ association.stop();
+ association = null;
+ }
}
public String toString() {
diff --git a/services/core/java/com/android/server/am/ContentProviderConnection.java b/services/core/java/com/android/server/am/ContentProviderConnection.java
index f2c9e2fd2297..f2d4f739c8bf 100644
--- a/services/core/java/com/android/server/am/ContentProviderConnection.java
+++ b/services/core/java/com/android/server/am/ContentProviderConnection.java
@@ -18,14 +18,21 @@ package com.android.server.am;
import android.os.Binder;
import android.os.SystemClock;
+import android.util.Slog;
import android.util.TimeUtils;
+import com.android.internal.app.procstats.AssociationState;
+import com.android.internal.app.procstats.ProcessStats;
+
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
+
/**
* Represents a link between a content provider and client.
*/
public final class ContentProviderConnection extends Binder {
public final ContentProviderRecord provider;
public final ProcessRecord client;
+ public AssociationState.SourceState association;
public final long createTime;
public int stableCount;
public int unstableCount;
@@ -45,6 +52,42 @@ public final class ContentProviderConnection extends Binder {
createTime = SystemClock.elapsedRealtime();
}
+ public void startAssociationIfNeeded() {
+ // If we don't already have an active association, create one... but only if this
+ // is an association between two different processes.
+ if (ActivityManagerService.TRACK_PROCSTATS_ASSOCIATIONS
+ && association == null && provider.proc != null
+ && (provider.appInfo.uid != client.uid
+ || !provider.info.processName.equals(client.processName))) {
+ ProcessStats.ProcessStateHolder holder = provider.proc.pkgList.get(
+ provider.name.getPackageName());
+ if (holder == null) {
+ Slog.wtf(TAG_AM, "No package in referenced provider "
+ + provider.name.toShortString() + ": proc=" + provider.proc);
+ } else if (holder.pkg == null) {
+ Slog.wtf(TAG_AM, "Inactive holder in referenced provider "
+ + provider.name.toShortString() + ": proc=" + provider.proc);
+ } else {
+ association = holder.pkg.getAssociationStateLocked(holder.state,
+ provider.name.getClassName()).startSource(client.uid, client.processName);
+
+ }
+ }
+ }
+
+ public void trackProcState(int procState, int seq, long now) {
+ if (association != null) {
+ association.trackProcState(procState, seq, now);
+ }
+ }
+
+ public void stopAssociation() {
+ if (association != null) {
+ association.stop();
+ association = null;
+ }
+ }
+
public String toString() {
StringBuilder sb = new StringBuilder(128);
sb.append("ContentProviderConnection{");
diff --git a/services/core/java/com/android/server/am/ContentProviderRecord.java b/services/core/java/com/android/server/am/ContentProviderRecord.java
index cd39bcd03d36..c22966d631f6 100644
--- a/services/core/java/com/android/server/am/ContentProviderRecord.java
+++ b/services/core/java/com/android/server/am/ContentProviderRecord.java
@@ -16,6 +16,8 @@
package com.android.server.am;
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
+
import android.app.ContentProviderHolder;
import android.content.ComponentName;
import android.content.IContentProvider;
@@ -26,11 +28,14 @@ import android.os.IBinder.DeathRecipient;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.util.ArrayMap;
import android.util.Slog;
+import com.android.internal.app.procstats.AssociationState;
+import com.android.internal.app.procstats.ProcessStats;
+
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.HashMap;
final class ContentProviderRecord implements ComponentName.WithComponentName {
final ActivityManagerService service;
@@ -46,7 +51,7 @@ final class ContentProviderRecord implements ComponentName.WithComponentName {
= new ArrayList<ContentProviderConnection>();
//final HashSet<ProcessRecord> clients = new HashSet<ProcessRecord>();
// Handles for non-framework processes supported by this provider
- HashMap<IBinder, ExternalProcessHandle> externalProcessTokenToHandle;
+ ArrayMap<IBinder, ExternalProcessHandle> externalProcessTokenToHandle;
// Count for external process for which we have no handles.
int externalProcessNoHandleCount;
ProcessRecord proc; // if non-null, hosting process.
@@ -83,22 +88,47 @@ final class ContentProviderRecord implements ComponentName.WithComponentName {
return holder;
}
+ public void setProcess(ProcessRecord proc) {
+ this.proc = proc;
+ if (ActivityManagerService.TRACK_PROCSTATS_ASSOCIATIONS) {
+ for (int iconn = connections.size() - 1; iconn >= 0; iconn--) {
+ final ContentProviderConnection conn = connections.get(iconn);
+ if (proc != null) {
+ conn.startAssociationIfNeeded();
+ } else {
+ conn.stopAssociation();
+ }
+ }
+ if (externalProcessTokenToHandle != null) {
+ for (int iext = externalProcessTokenToHandle.size() - 1; iext >= 0; iext--) {
+ final ExternalProcessHandle handle = externalProcessTokenToHandle.valueAt(iext);
+ if (proc != null) {
+ handle.startAssociationIfNeeded(this);
+ } else {
+ handle.stopAssociation();
+ }
+ }
+ }
+ }
+ }
+
public boolean canRunHere(ProcessRecord app) {
return (info.multiprocess || info.processName.equals(app.processName))
&& uid == app.info.uid;
}
- public void addExternalProcessHandleLocked(IBinder token) {
+ public void addExternalProcessHandleLocked(IBinder token, int callingUid, String callingTag) {
if (token == null) {
externalProcessNoHandleCount++;
} else {
if (externalProcessTokenToHandle == null) {
- externalProcessTokenToHandle = new HashMap<IBinder, ExternalProcessHandle>();
+ externalProcessTokenToHandle = new ArrayMap<>();
}
ExternalProcessHandle handle = externalProcessTokenToHandle.get(token);
if (handle == null) {
- handle = new ExternalProcessHandle(token);
+ handle = new ExternalProcessHandle(token, callingUid, callingTag);
externalProcessTokenToHandle.put(token, handle);
+ handle.startAssociationIfNeeded(this);
}
handle.mAcquisitionCount++;
}
@@ -129,6 +159,7 @@ final class ContentProviderRecord implements ComponentName.WithComponentName {
private void removeExternalProcessHandleInternalLocked(IBinder token) {
ExternalProcessHandle handle = externalProcessTokenToHandle.get(token);
handle.unlinkFromOwnDeathLocked();
+ handle.stopAssociation();
externalProcessTokenToHandle.remove(token);
if (externalProcessTokenToHandle.size() == 0) {
externalProcessTokenToHandle = null;
@@ -234,11 +265,16 @@ final class ContentProviderRecord implements ComponentName.WithComponentName {
private class ExternalProcessHandle implements DeathRecipient {
private static final String LOG_TAG = "ExternalProcessHanldle";
- private final IBinder mToken;
- private int mAcquisitionCount;
+ final IBinder mToken;
+ final int mOwningUid;
+ final String mOwningProcessName;
+ int mAcquisitionCount;
+ AssociationState.SourceState mAssociation;
- public ExternalProcessHandle(IBinder token) {
+ public ExternalProcessHandle(IBinder token, int owningUid, String owningProcessName) {
mToken = token;
+ mOwningUid = owningUid;
+ mOwningProcessName = owningProcessName;
try {
token.linkToDeath(this, 0);
} catch (RemoteException re) {
@@ -250,6 +286,37 @@ final class ContentProviderRecord implements ComponentName.WithComponentName {
mToken.unlinkToDeath(this, 0);
}
+ public void startAssociationIfNeeded(ContentProviderRecord provider) {
+ // If we don't already have an active association, create one... but only if this
+ // is an association between two different processes.
+ if (ActivityManagerService.TRACK_PROCSTATS_ASSOCIATIONS
+ && mAssociation == null && provider.proc != null
+ && (provider.appInfo.uid != mOwningUid
+ || !provider.info.processName.equals(mOwningProcessName))) {
+ ProcessStats.ProcessStateHolder holder = provider.proc.pkgList.get(
+ provider.name.getPackageName());
+ if (holder == null) {
+ Slog.wtf(TAG_AM, "No package in referenced provider "
+ + provider.name.toShortString() + ": proc=" + provider.proc);
+ } else if (holder.pkg == null) {
+ Slog.wtf(TAG_AM, "Inactive holder in referenced provider "
+ + provider.name.toShortString() + ": proc=" + provider.proc);
+ } else {
+ mAssociation = holder.pkg.getAssociationStateLocked(holder.state,
+ provider.name.getClassName()).startSource(mOwningUid,
+ mOwningProcessName);
+
+ }
+ }
+ }
+
+ public void stopAssociation() {
+ if (mAssociation != null) {
+ mAssociation.stop();
+ mAssociation = null;
+ }
+ }
+
@Override
public void binderDied() {
synchronized (service) {
diff --git a/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java b/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java
index d9878cd09fe4..e5add58f287a 100644
--- a/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java
+++ b/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java
@@ -23,13 +23,12 @@ import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
-import android.os.Build;
import android.os.SystemPropertiesProto;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
-import android.widget.CheckBox;
import com.android.internal.R;
import com.android.server.utils.AppInstallerUtil;
@@ -45,7 +44,10 @@ public class DeprecatedTargetSdkVersionDialog {
mPackageName = appInfo.packageName;
final PackageManager pm = context.getPackageManager();
- final CharSequence label = appInfo.loadSafeLabel(pm);
+ final CharSequence label = appInfo.loadSafeLabel(pm,
+ PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
+ PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE
+ | PackageItemInfo.SAFE_LABEL_FLAG_TRIM);
final CharSequence message = context.getString(R.string.deprecated_target_sdk_message);
final AlertDialog.Builder builder = new AlertDialog.Builder(context)
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 30fa72fb69b9..efde70de536b 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -19,6 +19,13 @@ package com.android.server.am;
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
+import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
+import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
+import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
+import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
+import static android.view.WindowManager.TRANSIT_UNSET;
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS;
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE;
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
@@ -27,15 +34,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NA
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
import static com.android.server.am.KeyguardControllerProto.KEYGUARD_OCCLUDED;
import static com.android.server.am.KeyguardControllerProto.KEYGUARD_SHOWING;
-import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
-import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
-import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_UNSET;
-import android.app.ActivityManagerInternal.SleepToken;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.Trace;
@@ -44,6 +43,7 @@ import android.util.proto.ProtoOutputStream;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.wm.ActivityTaskManagerInternal.SleepToken;
import com.android.server.wm.WindowManagerService;
import java.io.PrintWriter;
@@ -58,7 +58,7 @@ class KeyguardController {
private static final String TAG = TAG_WITH_CLASS_NAME ? "KeyguardController" : TAG_AM;
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mStackSupervisor;
private WindowManagerService mWindowManager;
private boolean mKeyguardShowing;
@@ -72,7 +72,7 @@ class KeyguardController {
private SleepToken mSleepToken;
private int mSecondaryDisplayShowing = INVALID_DISPLAY;
- KeyguardController(ActivityManagerService service,
+ KeyguardController(ActivityTaskManagerService service,
ActivityStackSupervisor stackSupervisor) {
mService = service;
mStackSupervisor = stackSupervisor;
diff --git a/services/core/java/com/android/server/am/LaunchParamsController.java b/services/core/java/com/android/server/am/LaunchParamsController.java
index 7ab7f987d301..6415c3ee7f72 100644
--- a/services/core/java/com/android/server/am/LaunchParamsController.java
+++ b/services/core/java/com/android/server/am/LaunchParamsController.java
@@ -38,7 +38,7 @@ import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.
* registered {@link LaunchParamsModifier}s.
*/
class LaunchParamsController {
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private final List<LaunchParamsModifier> mModifiers = new ArrayList<>();
// Temporary {@link LaunchParams} for internal calculations. This is kept separate from
@@ -48,7 +48,7 @@ class LaunchParamsController {
private final LaunchParams mTmpCurrent = new LaunchParams();
private final LaunchParams mTmpResult = new LaunchParams();
- LaunchParamsController(ActivityManagerService service) {
+ LaunchParamsController(ActivityTaskManagerService service) {
mService = service;
}
diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java
index 151ef4942432..4fd01cdeaa3b 100644
--- a/services/core/java/com/android/server/am/LockTaskController.java
+++ b/services/core/java/com/android/server/am/LockTaskController.java
@@ -361,7 +361,7 @@ public class LockTaskController {
* @param task the task that requested the end of lock task mode ({@code null} for quitting app
* pinning mode)
* @param isSystemCaller indicates whether this request comes from the system via
- * {@link ActivityManagerService#stopSystemLockTaskMode()}. If
+ * {@link ActivityTaskManagerService#stopSystemLockTaskMode()}. If
* {@code true}, it means the user intends to stop pinned mode through UI;
* otherwise, it's called by an app and we need to stop locked or pinned
* mode, subject to checks.
@@ -509,7 +509,7 @@ public class LockTaskController {
*
* @param task the task that should be locked.
* @param isSystemCaller indicates whether this request was initiated by the system via
- * {@link ActivityManagerService#startSystemLockTaskMode(int)}. If
+ * {@link ActivityTaskManagerService#startSystemLockTaskMode(int)}. If
* {@code true}, this intends to start pinned mode; otherwise, we look
* at the calling task's mLockTaskAuth to decide which mode to start.
* @param callingUid the caller that requested the launch of lock task mode.
diff --git a/services/core/java/com/android/server/am/NativeCrashListener.java b/services/core/java/com/android/server/am/NativeCrashListener.java
index 9348023fb1f1..6e42aee3ba2a 100644
--- a/services/core/java/com/android/server/am/NativeCrashListener.java
+++ b/services/core/java/com/android/server/am/NativeCrashListener.java
@@ -29,7 +29,6 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.InterruptedIOException;
-import java.net.InetSocketAddress;
/**
* Set up a Unix domain socket that debuggerd will connect() to in
@@ -226,7 +225,7 @@ final class NativeCrashListener extends Thread {
}
if (pr != null) {
// Don't attempt crash reporting for persistent apps
- if (pr.persistent) {
+ if (pr.isPersistent()) {
if (DEBUG) {
Slog.v(TAG, "Skipping report for persistent app " + pr);
}
@@ -260,7 +259,7 @@ final class NativeCrashListener extends Thread {
// even though the process will vanish as soon as we let
// debuggerd proceed.
synchronized (mAm) {
- pr.crashing = true;
+ pr.setCrashing(true);
pr.forceCrashReport = true;
}
diff --git a/services/core/java/com/android/server/am/OomAdjProfiler.java b/services/core/java/com/android/server/am/OomAdjProfiler.java
new file mode 100644
index 000000000000..6230e0dfaa55
--- /dev/null
+++ b/services/core/java/com/android/server/am/OomAdjProfiler.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.am;
+
+import android.os.PowerManagerInternal;
+import android.os.Process;
+import android.os.SystemClock;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.BackgroundThread;
+import com.android.internal.os.ProcessCpuTracker;
+import com.android.internal.util.RingBuffer;
+import com.android.internal.util.function.pooled.PooledLambda;
+
+import java.io.PrintWriter;
+
+public class OomAdjProfiler {
+ @GuardedBy("this")
+ private boolean mOnBattery;
+ @GuardedBy("this")
+ private boolean mScreenOff;
+
+ @GuardedBy("this")
+ private long mOomAdjStartTimeMs;
+ @GuardedBy("this")
+ private boolean mOomAdjStarted;
+
+ @GuardedBy("this")
+ private CpuTimes mOomAdjRunTime = new CpuTimes();
+ @GuardedBy("this")
+ private CpuTimes mSystemServerCpuTime = new CpuTimes();
+
+ @GuardedBy("this")
+ private long mLastSystemServerCpuTimeMs;
+ @GuardedBy("this")
+ private boolean mSystemServerCpuTimeUpdateScheduled;
+ private final ProcessCpuTracker mProcessCpuTracker = new ProcessCpuTracker(false);
+
+ @GuardedBy("this")
+ final RingBuffer<CpuTimes> mOomAdjRunTimesHist = new RingBuffer<>(CpuTimes.class, 10);
+ @GuardedBy("this")
+ final RingBuffer<CpuTimes> mSystemServerCpuTimesHist = new RingBuffer<>(CpuTimes.class, 10);
+
+ void batteryPowerChanged(boolean onBattery) {
+ synchronized (this) {
+ scheduleSystemServerCpuTimeUpdate();
+ mOnBattery = onBattery;
+ }
+ }
+
+ void onWakefulnessChanged(int wakefulness) {
+ synchronized (this) {
+ scheduleSystemServerCpuTimeUpdate();
+ mScreenOff = wakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE;
+ }
+ }
+
+ void oomAdjStarted() {
+ synchronized (this) {
+ mOomAdjStartTimeMs = SystemClock.currentThreadTimeMillis();
+ mOomAdjStarted = true;
+ }
+ }
+
+ void oomAdjEnded() {
+ synchronized (this) {
+ if (!mOomAdjStarted) {
+ return;
+ }
+ mOomAdjRunTime.addCpuTimeMs(SystemClock.currentThreadTimeMillis() - mOomAdjStartTimeMs);
+ }
+ }
+
+ private void scheduleSystemServerCpuTimeUpdate() {
+ synchronized (this) {
+ if (mSystemServerCpuTimeUpdateScheduled) {
+ return;
+ }
+ mSystemServerCpuTimeUpdateScheduled = true;
+ BackgroundThread.getHandler().post(PooledLambda.obtainRunnable(
+ OomAdjProfiler::updateSystemServerCpuTime,
+ this, mOnBattery, mScreenOff).recycleOnUse());
+ }
+ }
+
+ private void updateSystemServerCpuTime(boolean onBattery, boolean screenOff) {
+ final long cpuTimeMs = mProcessCpuTracker.getCpuTimeForPid(Process.myPid());
+ synchronized (this) {
+ mSystemServerCpuTime.addCpuTimeMs(
+ cpuTimeMs - mLastSystemServerCpuTimeMs, onBattery, screenOff);
+ mLastSystemServerCpuTimeMs = cpuTimeMs;
+ mSystemServerCpuTimeUpdateScheduled = false;
+ notifyAll();
+ }
+ }
+
+ void reset() {
+ synchronized (this) {
+ if (mSystemServerCpuTime.isEmpty()) {
+ return;
+ }
+ mOomAdjRunTimesHist.append(mOomAdjRunTime);
+ mSystemServerCpuTimesHist.append(mSystemServerCpuTime);
+ mOomAdjRunTime = new CpuTimes();
+ mSystemServerCpuTime = new CpuTimes();
+ }
+ }
+
+ void dump(PrintWriter pw) {
+ synchronized (this) {
+ if (mSystemServerCpuTimeUpdateScheduled) {
+ while (mSystemServerCpuTimeUpdateScheduled) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ } else {
+ updateSystemServerCpuTime(mOnBattery, mScreenOff);
+ }
+
+ pw.println("System server and oomAdj runtimes (ms) in recent battery sessions "
+ + "(most recent first):");
+ if (!mSystemServerCpuTime.isEmpty()) {
+ pw.print(" ");
+ pw.print("system_server=");
+ pw.print(mSystemServerCpuTime);
+ pw.print(" ");
+ pw.print("oom_adj=");
+ pw.println(mOomAdjRunTime);
+ }
+ final CpuTimes[] systemServerCpuTimes = mSystemServerCpuTimesHist.toArray();
+ final CpuTimes[] oomAdjRunTimes = mOomAdjRunTimesHist.toArray();
+ for (int i = oomAdjRunTimes.length - 1; i >= 0; --i) {
+ pw.print(" ");
+ pw.print("system_server=");
+ pw.print(systemServerCpuTimes[i]);
+ pw.print(" ");
+ pw.print("oom_adj=");
+ pw.println(oomAdjRunTimes[i]);
+ }
+ }
+ }
+
+ private class CpuTimes {
+ private long mOnBatteryTimeMs;
+ private long mOnBatteryScreenOffTimeMs;
+
+ public void addCpuTimeMs(long cpuTimeMs) {
+ addCpuTimeMs(cpuTimeMs, mOnBattery, mScreenOff);
+ }
+
+ public void addCpuTimeMs(long cpuTimeMs, boolean onBattery, boolean screenOff) {
+ if (onBattery) {
+ mOnBatteryTimeMs += cpuTimeMs;
+ if (screenOff) {
+ mOnBatteryScreenOffTimeMs += cpuTimeMs;
+ }
+ }
+ }
+
+ public boolean isEmpty() {
+ return mOnBatteryTimeMs == 0 && mOnBatteryScreenOffTimeMs == 0;
+ }
+
+ public String toString() {
+ return "[" + mOnBatteryTimeMs + "," + mOnBatteryScreenOffTimeMs + "]";
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index e0aa2a261b3c..db0916523056 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -343,12 +343,12 @@ final class PendingIntentRecord extends IIntentSender.Stub {
allIntents[allIntents.length-1] = finalIntent;
allResolvedTypes[allResolvedTypes.length-1] = resolvedType;
- res = owner.getActivityStartController().startActivitiesInPackage(
+ res = owner.mActivityTaskManager.getActivityStartController().startActivitiesInPackage(
uid, key.packageName, allIntents, allResolvedTypes,
resultTo, mergedOptions, userId,
false /* validateIncomingUser */);
} else {
- res = owner.getActivityStartController().startActivityInPackage(uid,
+ res = owner.mActivityTaskManager.getActivityStartController().startActivityInPackage(uid,
callingPid, callingUid, key.packageName, finalIntent,
resolvedType, resultTo, resultWho, requestCode, 0,
mergedOptions, userId, null, "PendingIntentRecord",
diff --git a/services/core/java/com/android/server/am/PendingRemoteAnimationRegistry.java b/services/core/java/com/android/server/am/PendingRemoteAnimationRegistry.java
index 77713f57d017..877d896d433d 100644
--- a/services/core/java/com/android/server/am/PendingRemoteAnimationRegistry.java
+++ b/services/core/java/com/android/server/am/PendingRemoteAnimationRegistry.java
@@ -33,9 +33,9 @@ class PendingRemoteAnimationRegistry {
private final ArrayMap<String, Entry> mEntries = new ArrayMap<>();
private final Handler mHandler;
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
- PendingRemoteAnimationRegistry(ActivityManagerService service, Handler handler) {
+ PendingRemoteAnimationRegistry(ActivityTaskManagerService service, Handler handler) {
mService = service;
mHandler = handler;
}
@@ -74,7 +74,7 @@ class PendingRemoteAnimationRegistry {
this.packageName = packageName;
this.adapter = adapter;
mHandler.postDelayed(() -> {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
final Entry entry = mEntries.get(packageName);
if (entry == this) {
mEntries.remove(packageName);
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index 27269791f568..edc6e5362c8e 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -100,7 +100,7 @@ class PinnedActivityStack extends ActivityStack<PinnedStackWindowController>
// It is guaranteed that the activities requiring the update will be in the pinned stack at
// this point (either reparented before the animation into PiP, or before reparenting after
// the animation out of PiP)
- synchronized(this) {
+ synchronized (mService) {
ArrayList<TaskRecord> tasks = getAllTasks();
for (int i = 0; i < tasks.size(); i++ ) {
mStackSupervisor.updatePictureInPictureMode(tasks.get(i), targetStackBounds,
diff --git a/services/core/java/com/android/server/am/ProcessMemInfo.java b/services/core/java/com/android/server/am/ProcessMemInfo.java
index 83d29e2bba68..6c10a2af9fe6 100644
--- a/services/core/java/com/android/server/am/ProcessMemInfo.java
+++ b/services/core/java/com/android/server/am/ProcessMemInfo.java
@@ -24,6 +24,7 @@ public class ProcessMemInfo {
final String adjType;
final String adjReason;
long pss;
+ long swapPss;
long memtrack;
public ProcessMemInfo(String _name, int _pid, int _oomAdj, int _procState,
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 066861d665a7..7e12f647dc01 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -55,7 +55,7 @@ import java.util.Arrays;
* Full information about a particular process that
* is currently running.
*/
-final class ProcessRecord {
+final class ProcessRecord implements WindowProcessListener {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessRecord" : TAG_AM;
private final ActivityManagerService mService; // where we came from
@@ -66,7 +66,41 @@ final class ProcessRecord {
final int userId; // user of process.
final String processName; // name of the process
// List of packages running in the process
- final ArrayMap<String, ProcessStats.ProcessStateHolder> pkgList = new ArrayMap<>();
+ final PackageList pkgList = new PackageList();
+ final class PackageList {
+ final ArrayMap<String, ProcessStats.ProcessStateHolder> mPkgList = new ArrayMap<>();
+
+ ProcessStats.ProcessStateHolder put(String key, ProcessStats.ProcessStateHolder value) {
+ mWindowProcessController.addPackage(key);
+ return mPkgList.put(key, value);
+ }
+
+ void clear() {
+ mPkgList.clear();
+ mWindowProcessController.clearPackageList();
+ }
+
+ int size() {
+ return mPkgList.size();
+ }
+
+ String keyAt(int index) {
+ return mPkgList.keyAt(index);
+ }
+
+ public ProcessStats.ProcessStateHolder valueAt(int index) {
+ return mPkgList.valueAt(index);
+ }
+
+ ProcessStats.ProcessStateHolder get(String pkgName) {
+ return mPkgList.get(pkgName);
+ }
+
+ boolean containsKey(Object key) {
+ return mPkgList.containsKey(key);
+ }
+ }
+
final ProcessList.ProcStateMemTracker procStateMemTracker
= new ProcessList.ProcStateMemTracker();
UidRecord uidRecord; // overall state of process's uid.
@@ -79,7 +113,7 @@ final class ProcessRecord {
int pid; // The process of this application; 0 if none
String procStatFile; // path to /proc/<pid>/stat
int[] gids; // The gids this process was launched with
- String requiredAbi; // The ABI this process was launched with
+ private String mRequiredAbi;// The ABI this process was launched with
String instructionSet; // The instruction set this process was launched with
boolean starting; // True if the process is being started
long lastActivityTime; // For managing the LRU list
@@ -97,12 +131,11 @@ final class ProcessRecord {
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 curSchedGroup; // Currently desired scheduling class
+ private int mCurSchedGroup; // Currently desired scheduling class
int setSchedGroup; // Last set to background scheduling class
- int vrThreadTid; // Thread currently set for VR scheduling
int trimMemoryLevel; // Last selected memory trimming level
int curProcState = PROCESS_STATE_NONEXISTENT; // Currently computed process state
- int repProcState = PROCESS_STATE_NONEXISTENT; // Last reported process state
+ private int mRepProcState = PROCESS_STATE_NONEXISTENT; // Last reported process state
int setProcState = PROCESS_STATE_NONEXISTENT; // Last set process state in process tracker
int pssProcState = PROCESS_STATE_NONEXISTENT; // Currently requesting pss for
int pssStatType; // The type of stat collection that we are currently requesting
@@ -113,7 +146,7 @@ final class ProcessRecord {
boolean notCachedSinceIdle; // Has this process not been in a cached state since last idle?
boolean hasClientActivities; // Are there any client services with activities?
boolean hasStartedServices; // Are there any started services running in this process?
- boolean foregroundServices; // Running any services that are foreground?
+ private boolean mHasForegroundServices; // Running any services that are foreground?
boolean foregroundActivities; // Running any activities that are foreground?
boolean repForegroundActivities; // Last reported foreground activities.
boolean systemNoUi; // This is a system process, but not currently showing UI.
@@ -174,10 +207,8 @@ final class ProcessRecord {
Object adjTarget; // Debugging: target component impacting oom_adj.
Runnable crashHandler; // Optional local handler to be invoked in the process crash.
- // all activities running in the process
- final ArrayList<ActivityRecord> activities = new ArrayList<>();
- // any tasks this process had run root activities in
- final ArrayList<TaskRecord> recentTasks = new ArrayList<>();
+ // Controller for driving the process state on the window manager side.
+ final private WindowProcessController mWindowProcessController;
// all ServiceRecord running in this process
final ArraySet<ServiceRecord> services = new ArraySet<>();
// services that are currently executing code (need to remain foreground).
@@ -195,11 +226,11 @@ final class ProcessRecord {
String[] isolatedEntryPointArgs; // Arguments to pass to isolatedEntryPoint's main().
boolean execServicesFg; // do we need to be executing services in the foreground?
- boolean persistent; // always keep this application running?
- boolean crashing; // are we in the process of crashing?
+ private boolean mPersistent;// always keep this application running?
+ private boolean mCrashing; // are we in the process of crashing?
Dialog crashDialog; // dialog being displayed due to crash.
boolean forceCrashReport; // suppress normal auto-dismiss of crash dialog & report UI?
- boolean notResponding; // does the app have a not responding dialog?
+ private boolean mNotResponding; // does the app have a not responding dialog?
Dialog anrDialog; // dialog being displayed due to app not resp.
boolean removed; // has app package been removed from device?
boolean debugging; // was app launched for debugging?
@@ -260,7 +291,7 @@ final class ProcessRecord {
}
}
pw.println("}");
- pw.print(prefix); pw.print("requiredAbi="); pw.print(requiredAbi);
+ pw.print(prefix); pw.print("mRequiredAbi="); pw.print(mRequiredAbi);
pw.print(" instructionSet="); pw.println(instructionSet);
if (info.className != null) {
pw.print(prefix); pw.print("class="); pw.println(info.className);
@@ -325,15 +356,12 @@ final class ProcessRecord {
pw.print(" setRaw="); pw.print(setRawAdj);
pw.print(" cur="); pw.print(curAdj);
pw.print(" set="); pw.println(setAdj);
- pw.print(prefix); pw.print("curSchedGroup="); pw.print(curSchedGroup);
+ pw.print(prefix); pw.print("mCurSchedGroup="); pw.print(mCurSchedGroup);
pw.print(" setSchedGroup="); pw.print(setSchedGroup);
pw.print(" systemNoUi="); pw.print(systemNoUi);
pw.print(" trimMemoryLevel="); pw.println(trimMemoryLevel);
- if (vrThreadTid != 0) {
- pw.print(prefix); pw.print("vrThreadTid="); pw.println(vrThreadTid);
- }
pw.print(prefix); pw.print("curProcState="); pw.print(curProcState);
- pw.print(" repProcState="); pw.print(repProcState);
+ pw.print(" mRepProcState="); pw.print(mRepProcState);
pw.print(" pssProcState="); pw.print(pssProcState);
pw.print(" setProcState="); pw.print(setProcState);
pw.print(" lastStateTime=");
@@ -350,8 +378,8 @@ final class ProcessRecord {
pw.print(" hasOverlayUi="); pw.print(hasOverlayUi);
pw.print(" runningRemoteAnimation="); pw.println(runningRemoteAnimation);
}
- if (foregroundServices || forcingToImportant != null) {
- pw.print(prefix); pw.print("foregroundServices="); pw.print(foregroundServices);
+ if (mHasForegroundServices || forcingToImportant != null) {
+ pw.print(prefix); pw.print("mHasForegroundServices="); pw.print(mHasForegroundServices);
pw.print(" forcingToImportant="); pw.println(forcingToImportant);
}
if (reportedInteraction || fgInteractionTime != 0) {
@@ -367,8 +395,8 @@ final class ProcessRecord {
}
pw.println();
}
- if (persistent || removed) {
- pw.print(prefix); pw.print("persistent="); pw.print(persistent);
+ if (mPersistent || removed) {
+ pw.print(prefix); pw.print("persistent="); pw.print(mPersistent);
pw.print(" removed="); pw.println(removed);
}
if (hasClientActivities || foregroundActivities || repForegroundActivities) {
@@ -408,16 +436,16 @@ final class ProcessRecord {
pw.print(" killedByAm="); pw.print(killedByAm);
pw.print(" waitingToKill="); pw.println(waitingToKill);
}
- if (debugging || crashing || crashDialog != null || notResponding
+ if (debugging || mCrashing || crashDialog != null || mNotResponding
|| anrDialog != null || bad) {
pw.print(prefix); pw.print("debugging="); pw.print(debugging);
- pw.print(" crashing="); pw.print(crashing);
+ pw.print(" mCrashing="); pw.print(mCrashing);
pw.print(" "); pw.print(crashDialog);
- pw.print(" notResponding="); pw.print(notResponding);
+ pw.print(" mNotResponding="); pw.print(mNotResponding);
pw.print(" " ); pw.print(anrDialog);
pw.print(" bad="); pw.print(bad);
- // crashing or notResponding is always set before errorReportReceiver
+ // mCrashing or mNotResponding is always set before errorReportReceiver
if (errorReportReceiver != null) {
pw.print(" errorReportReceiver=");
pw.print(errorReportReceiver.flattenToShortString());
@@ -432,18 +460,7 @@ final class ProcessRecord {
pw.print(prefix); pw.print("isolatedEntryPointArgs=");
pw.println(Arrays.toString(isolatedEntryPointArgs));
}
- if (activities.size() > 0) {
- pw.print(prefix); pw.println("Activities:");
- for (int i=0; i<activities.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(activities.get(i));
- }
- }
- if (recentTasks.size() > 0) {
- pw.print(prefix); pw.println("Recent Tasks:");
- for (int i=0; i<recentTasks.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(recentTasks.get(i));
- }
- }
+ mWindowProcessController.dump(pw, prefix);
if (services.size() > 0) {
pw.print(prefix); pw.println("Services:");
for (int i=0; i<services.size(); i++) {
@@ -499,17 +516,20 @@ final class ProcessRecord {
uid = _uid;
userId = UserHandle.getUserId(_uid);
processName = _processName;
- pkgList.put(_info.packageName, new ProcessStats.ProcessStateHolder(_info.longVersionCode));
maxAdj = ProcessList.UNKNOWN_ADJ;
curRawAdj = setRawAdj = ProcessList.INVALID_ADJ;
curAdj = setAdj = verifiedAdj = ProcessList.INVALID_ADJ;
- persistent = false;
+ mPersistent = false;
removed = false;
lastStateTime = lastPssTime = nextPssTime = SystemClock.uptimeMillis();
+ mWindowProcessController = new WindowProcessController(
+ mService.mActivityTaskManager, info, processName, uid, userId, this, this);
+ pkgList.put(_info.packageName, new ProcessStats.ProcessStateHolder(_info.longVersionCode));
}
public void setPid(int _pid) {
pid = _pid;
+ mWindowProcessController.setPid(pid);
procStatFile = null;
shortStringName = null;
stringName = null;
@@ -532,7 +552,7 @@ final class ProcessRecord {
final ProcessState origBase = baseProcessTracker;
if (origBase != null) {
origBase.setState(ProcessStats.STATE_NOTHING,
- tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList);
+ tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList.mPkgList);
origBase.makeInactive();
}
baseProcessTracker = tracker.getProcessStateLocked(info.packageName, uid,
@@ -543,7 +563,7 @@ final class ProcessRecord {
if (holder.state != null && holder.state != origBase) {
holder.state.makeInactive();
}
- holder.state = tracker.getProcessStateLocked(pkgList.keyAt(i), uid,
+ tracker.updateProcessStateHolderLocked(holder, pkgList.keyAt(i), uid,
info.longVersionCode, processName);
if (holder.state != baseProcessTracker) {
holder.state.makeActive();
@@ -551,6 +571,7 @@ final class ProcessRecord {
}
}
thread = _thread;
+ mWindowProcessController.setThread(thread);
}
public void makeInactive(ProcessStatsService tracker) {
@@ -567,11 +588,12 @@ final class ProcessRecord {
+ ",debugging=" + (debugging ? 1 : 0);
android.util.SeempLog.record_str(387, seempStr);
thread = null;
+ mWindowProcessController.setThread(null);
final ProcessState origBase = baseProcessTracker;
if (origBase != null) {
if (origBase != null) {
origBase.setState(ProcessStats.STATE_NOTHING,
- tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList);
+ tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList.mPkgList);
origBase.makeInactive();
}
baseProcessTracker = null;
@@ -580,16 +602,30 @@ final class ProcessRecord {
if (holder.state != null && holder.state != origBase) {
holder.state.makeInactive();
}
+ holder.pkg = null;
holder.state = null;
}
}
}
- public void clearRecentTasks() {
- for (int i = recentTasks.size() - 1; i >= 0; i--) {
- recentTasks.get(i).clearRootProcess();
- }
- recentTasks.clear();
+ boolean hasActivities() {
+ return mWindowProcessController.hasActivities();
+ }
+
+ void clearActivities() {
+ mWindowProcessController.clearActivities();
+ }
+
+ boolean hasActivitiesOrRecentTasks() {
+ return mWindowProcessController.hasActivitiesOrRecentTasks();
+ }
+
+ boolean hasRecentTasks() {
+ return mWindowProcessController.hasRecentTasks();
+ }
+
+ void clearRecentTasks() {
+ mWindowProcessController.clearRecentTasks();
}
/**
@@ -597,12 +633,8 @@ final class ProcessRecord {
* to the user. See HistoryRecord.isInterestingToUserLocked()
*/
public boolean isInterestingToUserLocked() {
- final int size = activities.size();
- for (int i = 0 ; i < size ; i++) {
- ActivityRecord r = activities.get(i);
- if (r.isInterestingToUserLocked()) {
- return true;
- }
+ if (mWindowProcessController.isInterestingToUser()) {
+ return true;
}
final int servicesSize = services.size();
@@ -615,14 +647,6 @@ final class ProcessRecord {
return false;
}
- public void stopFreezingAllLocked() {
- int i = activities.size();
- while (i > 0) {
- i--;
- activities.get(i).stopFreezingScreenLocked(true);
- }
- }
-
public void unlinkDeathRecipient() {
if (deathRecipient != null && thread != null) {
thread.asBinder().unlinkToDeath(deathRecipient, 0);
@@ -702,7 +726,7 @@ final class ProcessRecord {
} else {
pendingStart = false;
}
- if (!persistent) {
+ if (!mPersistent) {
killed = true;
killedByAm = true;
}
@@ -726,7 +750,7 @@ final class ProcessRecord {
proto.write(ProcessRecordProto.ISOLATED_APP_ID, UserHandle.getAppId(uid));
}
}
- proto.write(ProcessRecordProto.PERSISTENT, persistent);
+ proto.write(ProcessRecordProto.PERSISTENT, mPersistent);
proto.end(token);
}
@@ -811,8 +835,7 @@ final class ProcessRecord {
ProcessStats.ProcessStateHolder holder = new ProcessStats.ProcessStateHolder(
versionCode);
if (baseProcessTracker != null) {
- holder.state = tracker.getProcessStateLocked(
- pkg, uid, versionCode, processName);
+ tracker.updateProcessStateHolderLocked(holder, pkg, uid, versionCode, processName);
pkgList.put(pkg, holder);
if (holder.state != baseProcessTracker) {
holder.state.makeActive();
@@ -835,8 +858,8 @@ final class ProcessRecord {
}
public void forceProcessStateUpTo(int newState) {
- if (repProcState > newState) {
- curProcState = repProcState = newState;
+ if (mRepProcState > newState) {
+ curProcState = mRepProcState = newState;
}
}
@@ -848,7 +871,7 @@ final class ProcessRecord {
if (baseProcessTracker != null) {
long now = SystemClock.uptimeMillis();
baseProcessTracker.setState(ProcessStats.STATE_NOTHING,
- tracker.getMemFactorLocked(), now, pkgList);
+ tracker.getMemFactorLocked(), now, pkgList.mPkgList);
if (N != 1) {
for (int i=0; i<N; i++) {
ProcessStats.ProcessStateHolder holder = pkgList.valueAt(i);
@@ -858,14 +881,13 @@ final class ProcessRecord {
}
pkgList.clear();
- ProcessState ps = tracker.getProcessStateLocked(
- info.packageName, uid, info.longVersionCode, processName);
ProcessStats.ProcessStateHolder holder = new ProcessStats.ProcessStateHolder(
info.longVersionCode);
- holder.state = ps;
+ tracker.updateProcessStateHolderLocked(holder, info.packageName, uid,
+ info.longVersionCode, processName);
pkgList.put(info.packageName, holder);
- if (ps != baseProcessTracker) {
- ps.makeActive();
+ if (holder.state != baseProcessTracker) {
+ holder.state.makeActive();
}
}
} else if (N != 1) {
@@ -885,4 +907,135 @@ final class ProcessRecord {
}
return list;
}
+
+ WindowProcessController getWindowProcessController() {
+ return mWindowProcessController;
+ }
+
+ void setCurrentSchedulingGroup(int curSchedGroup) {
+ mCurSchedGroup = curSchedGroup;
+ mWindowProcessController.setCurrentSchedulingGroup(curSchedGroup);
+ }
+
+ int getCurrentSchedulingGroup() {
+ return mCurSchedGroup;
+ }
+
+ void setReportedProcState(int repProcState) {
+ mRepProcState = repProcState;
+ mWindowProcessController.setReportedProcState(repProcState);
+ }
+
+ int getReportedProcState() {
+ return mRepProcState;
+ }
+
+ void setCrashing(boolean crashing) {
+ mCrashing = crashing;
+ mWindowProcessController.setCrashing(crashing);
+ }
+
+ boolean isCrashing() {
+ return mCrashing;
+ }
+
+ void setNotResponding(boolean notResponding) {
+ mNotResponding = notResponding;
+ mWindowProcessController.setNotResponding(notResponding);
+ }
+
+ boolean isNotResponding() {
+ return mNotResponding;
+ }
+
+ void setPersistent(boolean persistent) {
+ mPersistent = persistent;
+ mWindowProcessController.setPersistent(persistent);
+ }
+
+ boolean isPersistent() {
+ return mPersistent;
+ }
+
+ public void setRequiredAbi(String requiredAbi) {
+ mRequiredAbi = requiredAbi;
+ mWindowProcessController.setRequiredAbi(requiredAbi);
+ }
+
+ String getRequiredAbi() {
+ return mRequiredAbi;
+ }
+
+ void setHasForegroundServices(boolean hasForegroundServices) {
+ mHasForegroundServices = hasForegroundServices;
+ mWindowProcessController.setHasForegroundServices(hasForegroundServices);
+ }
+
+ boolean hasForegroundServices() {
+ return mHasForegroundServices;
+ }
+
+ @Override
+ public void clearProfilerIfNeeded() {
+ synchronized (mService) {
+ if (mService.mProfileProc == null || mService.mProfilerInfo == null
+ || mService.mProfileProc != this) {
+ return;
+ }
+ mService.clearProfilerLocked();
+ }
+ }
+
+ @Override
+ public void updateServiceConnectionActivities() {
+ synchronized (mService) {
+ mService.mServices.updateServiceConnectionActivitiesLocked(this);
+ }
+ }
+
+ @Override
+ public void setPendingUiClean(boolean pendingUiClean) {
+ synchronized (mService) {
+ this.pendingUiClean = true;
+ }
+ }
+
+ @Override
+ public void setPendingUiCleanAndForceProcessStateUpTo(int newState) {
+ synchronized (mService) {
+ pendingUiClean = true;
+ forceProcessStateUpTo(newState);
+ }
+ }
+
+ @Override
+ public void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
+ boolean activityChange, boolean updateOomAdj) {
+ synchronized (mService) {
+ if (updateServiceConnectionActivities) {
+ mService.mServices.updateServiceConnectionActivitiesLocked(this);
+ }
+ if (updateLru) {
+ mService.updateLruProcessLocked(this, activityChange, null);
+ }
+ if (updateOomAdj) {
+ mService.updateOomAdjLocked();
+ }
+ }
+ }
+
+ @Override
+ public void setRemoved(boolean removed) {
+ synchronized (mService) {
+ this.removed = removed;
+ }
+ }
+
+ /**
+ * Returns the total time (in milliseconds) spent executing in both user and system code.
+ * Safe to call without lock held.
+ */
+ public long getCpuTime() {
+ return mService.mProcessCpuTracker.getCpuTimeForPid(pid);
+ }
}
diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java
index c10d81b96cbc..f0bd8fa31478 100644
--- a/services/core/java/com/android/server/am/ProcessStatsService.java
+++ b/services/core/java/com/android/server/am/ProcessStatsService.java
@@ -16,14 +16,12 @@
package com.android.server.am;
-import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemProperties;
-import android.service.procstats.ProcessStatsProto;
import android.service.procstats.ProcessStatsServiceDumpProto;
import android.util.ArrayMap;
import android.util.AtomicFile;
@@ -120,11 +118,20 @@ public final class ProcessStatsService extends IProcessStats.Stub {
}
}
+ @GuardedBy("mAm")
+ public void updateProcessStateHolderLocked(ProcessStats.ProcessStateHolder holder,
+ String packageName, int uid, long versionCode, String processName) {
+ holder.pkg = mProcessStats.getPackageStateLocked(packageName, uid, versionCode);
+ holder.state = mProcessStats.getProcessStateLocked(holder.pkg, processName);
+ }
+
+ @GuardedBy("mAm")
public ProcessState getProcessStateLocked(String packageName,
int uid, long versionCode, String processName) {
return mProcessStats.getProcessStateLocked(packageName, uid, versionCode, processName);
}
+ @GuardedBy("mAm")
public ServiceState getServiceStateLocked(String packageName, int uid,
long versionCode, String processName, String className) {
return mProcessStats.getServiceStateLocked(packageName, uid, versionCode, processName,
@@ -174,15 +181,23 @@ public final class ProcessStatsService extends IProcessStats.Stub {
return false;
}
+ @GuardedBy("mAm")
public int getMemFactorLocked() {
return mProcessStats.mMemFactor != ProcessStats.STATE_NOTHING ? mProcessStats.mMemFactor : 0;
}
+ @GuardedBy("mAm")
public void addSysMemUsageLocked(long cachedMem, long freeMem, long zramMem, long kernelMem,
long nativeMem) {
mProcessStats.addSysMemUsage(cachedMem, freeMem, zramMem, kernelMem, nativeMem);
}
+ @GuardedBy("mAm")
+ public void updateTrackingAssociationsLocked(int curSeq, long now) {
+ mProcessStats.updateTrackingAssociationsLocked(curSeq, now);
+ }
+
+ @GuardedBy("mAm")
public boolean shouldWriteNowLocked(long now) {
if (now > (mLastWriteTime+WRITE_PERIOD)) {
if (SystemClock.elapsedRealtime()
@@ -196,6 +211,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
return false;
}
+ @GuardedBy("mAm")
public void shutdownLocked() {
Slog.w(TAG, "Writing process stats before shutdown...");
mProcessStats.mFlags |= ProcessStats.FLAG_SHUTDOWN;
@@ -203,14 +219,17 @@ public final class ProcessStatsService extends IProcessStats.Stub {
mShuttingDown = true;
}
+ @GuardedBy("mAm")
public void writeStateAsyncLocked() {
writeStateLocked(false);
}
+ @GuardedBy("mAm")
public void writeStateSyncLocked() {
writeStateLocked(true);
}
+ @GuardedBy("mAm")
private void writeStateLocked(boolean sync) {
if (mShuttingDown) {
return;
@@ -220,6 +239,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
writeStateLocked(sync, commitPending);
}
+ @GuardedBy("mAm")
public void writeStateLocked(boolean sync, final boolean commit) {
final long totalTime;
synchronized (mPendingWriteLock) {
@@ -298,6 +318,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
}
}
+ @GuardedBy("mAm")
boolean readLocked(ProcessStats stats, AtomicFile file) {
try {
FileInputStream stream = file.openRead();
@@ -342,6 +363,13 @@ public final class ProcessStatsService extends IProcessStats.Stub {
+ ": " + pkgState.mServices.valueAt(isvc));
}
+ final int NASCS = pkgState.mAssociations.size();
+ for (int iasc=0; iasc<NASCS; iasc++) {
+ Slog.w(TAG, " Association "
+ + pkgState.mServices.keyAt(iasc)
+ + ": " + pkgState.mAssociations.valueAt(iasc));
+
+ }
}
}
}
@@ -383,6 +411,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
return filesArray;
}
+ @GuardedBy("mAm")
public void trimHistoricStatesWriteLocked() {
ArrayList<String> filesArray = getCommittedFiles(MAX_HISTORIC_STATES, false, true);
if (filesArray == null) {
@@ -395,6 +424,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
}
}
+ @GuardedBy("mAm")
boolean dumpFilteredProcessesCsvLocked(PrintWriter pw, String header,
boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
boolean sepProcStates, int[] procStates, long now, String reqPackage) {
diff --git a/services/core/java/com/android/server/am/ProviderMap.java b/services/core/java/com/android/server/am/ProviderMap.java
index 2f520027c1ca..29c165733808 100644
--- a/services/core/java/com/android/server/am/ProviderMap.java
+++ b/services/core/java/com/android/server/am/ProviderMap.java
@@ -32,7 +32,6 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
@@ -203,7 +202,7 @@ public final class ProviderMap {
&& (filterByClasses == null
|| filterByClasses.contains(provider.name.getClassName())));
if (sameComponent
- && (provider.proc == null || evenPersistent || !provider.proc.persistent)) {
+ && (provider.proc == null || evenPersistent || !provider.proc.isPersistent())) {
if (!doit) {
return true;
}
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
index 06a30780e9ea..1967c76b23e3 100644
--- a/services/core/java/com/android/server/am/RecentTasks.java
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -41,6 +41,7 @@ import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.AppGlobals;
import android.content.ComponentName;
import android.content.Intent;
@@ -77,6 +78,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@@ -137,8 +139,8 @@ class RecentTasks {
* Save recent tasks information across reboots.
*/
private final TaskPersister mTaskPersister;
- private final ActivityManagerService mService;
- private final UserController mUserController;
+ private final ActivityTaskManagerService mService;
+ private final ActivityStackSupervisor mSupervisor;
/**
* Keeps track of the static recents package/component which is granted additional permissions
@@ -179,22 +181,21 @@ class RecentTasks {
private final TaskActivitiesReport mTmpReport = new TaskActivitiesReport();
@VisibleForTesting
- RecentTasks(ActivityManagerService service, TaskPersister taskPersister,
- UserController userController) {
+ RecentTasks(ActivityTaskManagerService service, TaskPersister taskPersister) {
mService = service;
- mUserController = userController;
+ mSupervisor = mService.mStackSupervisor;
mTaskPersister = taskPersister;
- mGlobalMaxNumTasks = ActivityManager.getMaxRecentTasksStatic();
+ mGlobalMaxNumTasks = ActivityTaskManager.getMaxRecentTasksStatic();
mHasVisibleRecentTasks = true;
}
- RecentTasks(ActivityManagerService service, ActivityStackSupervisor stackSupervisor) {
+ RecentTasks(ActivityTaskManagerService service, ActivityStackSupervisor stackSupervisor) {
final File systemDir = Environment.getDataSystemDirectory();
final Resources res = service.mContext.getResources();
mService = service;
- mUserController = service.mUserController;
+ mSupervisor = mService.mStackSupervisor;
mTaskPersister = new TaskPersister(systemDir, stackSupervisor, service, this);
- mGlobalMaxNumTasks = ActivityManager.getMaxRecentTasksStatic();
+ mGlobalMaxNumTasks = ActivityTaskManager.getMaxRecentTasksStatic();
mHasVisibleRecentTasks = res.getBoolean(com.android.internal.R.bool.config_hasRecents);
loadParametersFromResources(res);
}
@@ -285,7 +286,7 @@ class RecentTasks {
* @return whether the home app is also the active handler of recent tasks.
*/
boolean isRecentsComponentHomeActivity(int userId) {
- final ComponentName defaultHomeActivity = mService.getPackageManagerInternalLocked()
+ final ComponentName defaultHomeActivity = mService.mAm.getPackageManagerInternalLocked()
.getDefaultHomeActivity(userId);
return defaultHomeActivity != null && mRecentsComponent != null &&
defaultHomeActivity.getPackageName().equals(mRecentsComponent.getPackageName());
@@ -441,7 +442,7 @@ class RecentTasks {
}
void flush() {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
syncPersistentTaskIdsLocked();
}
mTaskPersister.flush();
@@ -511,7 +512,7 @@ class RecentTasks {
&& tr.realActivitySuspended != suspended) {
tr.realActivitySuspended = suspended;
if (suspended) {
- mService.mStackSupervisor.removeTaskByIdLocked(tr.taskId, false,
+ mSupervisor.removeTaskByIdLocked(tr.taskId, false,
REMOVE_FROM_RECENTS, "suspended-package");
}
notifyTaskPersisterLocked(tr, false);
@@ -539,7 +540,7 @@ class RecentTasks {
if (tr.userId != userId) continue;
if (!taskPackageName.equals(packageName)) continue;
- mService.mStackSupervisor.removeTaskByIdLocked(tr.taskId, true, REMOVE_FROM_RECENTS,
+ mSupervisor.removeTaskByIdLocked(tr.taskId, true, REMOVE_FROM_RECENTS,
"remove-package-task");
}
}
@@ -556,7 +557,7 @@ class RecentTasks {
final boolean sameComponent = cn != null && cn.getPackageName().equals(packageName)
&& (filterByClasses == null || filterByClasses.contains(cn.getClassName()));
if (sameComponent) {
- mService.mStackSupervisor.removeTaskByIdLocked(tr.taskId, false,
+ mSupervisor.removeTaskByIdLocked(tr.taskId, false,
REMOVE_FROM_RECENTS, "disabled-package");
}
}
@@ -708,6 +709,27 @@ class RecentTasks {
return list;
}
+ @VisibleForTesting
+ Set<Integer> getProfileIds(int userId) {
+ Set<Integer> userIds = new ArraySet<>();
+ final List<UserInfo> profiles = mService.getUserManager().getProfiles(userId,
+ false /* enabledOnly */);
+ for (int i = profiles.size() - 1; i >= 0; --i) {
+ userIds.add(profiles.get(i).id);
+ }
+ return userIds;
+ }
+
+ @VisibleForTesting
+ UserInfo getUserInfo(int userId) {
+ return mService.getUserManager().getUserInfo(userId);
+ }
+
+ @VisibleForTesting
+ int[] getCurrentProfileIds() {
+ return mService.mAmInternal.getCurrentProfileIds();
+ }
+
/**
* @return the list of recent tasks for presentation.
*/
@@ -715,13 +737,13 @@ class RecentTasks {
boolean getTasksAllowed, boolean getDetailedTasks, int userId, int callingUid) {
final boolean withExcluded = (flags & RECENT_WITH_EXCLUDED) != 0;
- if (!mService.isUserRunning(userId, FLAG_AND_UNLOCKED)) {
+ if (!mService.mAm.isUserRunning(userId, FLAG_AND_UNLOCKED)) {
Slog.i(TAG, "user " + userId + " is still locked. Cannot load recents");
return ParceledListSlice.emptyList();
}
loadUserRecentsLocked(userId);
- final Set<Integer> includedUsers = mUserController.getProfileIds(userId);
+ final Set<Integer> includedUsers = getProfileIds(userId);
includedUsers.add(Integer.valueOf(userId));
final ArrayList<ActivityManager.RecentTaskInfo> res = new ArrayList<>();
@@ -1036,10 +1058,10 @@ class RecentTasks {
}
// Remove any tasks that belong to currently quiet profiles
- final int[] profileUserIds = mUserController.getCurrentProfileIds();
+ final int[] profileUserIds = getCurrentProfileIds();
mTmpQuietProfileUserIds.clear();
for (int userId : profileUserIds) {
- final UserInfo userInfo = mUserController.getUserInfo(userId);
+ final UserInfo userInfo = getUserInfo(userId);
if (userInfo != null && userInfo.isManagedProfile() && userInfo.isQuietModeEnabled()) {
mTmpQuietProfileUserIds.put(userId, true);
}
@@ -1205,7 +1227,7 @@ class RecentTasks {
*/
protected boolean isTrimmable(TaskRecord task) {
final ActivityStack stack = task.getStack();
- final ActivityStack homeStack = mService.mStackSupervisor.mHomeStack;
+ final ActivityStack homeStack = mSupervisor.mHomeStack;
// No stack for task, just trim it
if (stack == null) {
diff --git a/services/core/java/com/android/server/am/RecentsAnimation.java b/services/core/java/com/android/server/am/RecentsAnimation.java
index bd49bd193773..1c7ad3f33310 100644
--- a/services/core/java/com/android/server/am/RecentsAnimation.java
+++ b/services/core/java/com/android/server/am/RecentsAnimation.java
@@ -54,11 +54,10 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
private static final String TAG = RecentsAnimation.class.getSimpleName();
private static final boolean DEBUG = false;
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mStackSupervisor;
private final ActivityStartController mActivityStartController;
private final WindowManagerService mWindowManager;
- private final UserController mUserController;
private final ActivityDisplay mDefaultDisplay;
private final int mCallingPid;
@@ -68,15 +67,14 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
// The stack to restore the target stack behind when the animation is finished
private ActivityStack mRestoreTargetBehindStack;
- RecentsAnimation(ActivityManagerService am, ActivityStackSupervisor stackSupervisor,
+ RecentsAnimation(ActivityTaskManagerService atm, ActivityStackSupervisor stackSupervisor,
ActivityStartController activityStartController, WindowManagerService wm,
- UserController userController, int callingPid) {
- mService = am;
+ int callingPid) {
+ mService = atm;
mStackSupervisor = stackSupervisor;
mDefaultDisplay = stackSupervisor.getDefaultDisplay();
mActivityStartController = activityStartController;
mWindowManager = wm;
- mUserController = userController;
mCallingPid = callingPid;
}
@@ -122,7 +120,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunching();
- mService.setRunningRemoteAnimation(mCallingPid, true);
+ mService.mAmInternal.setRunningRemoteAnimation(mCallingPid, true);
mWindowManager.deferSurfaceLayout();
try {
@@ -132,7 +130,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
mService.mContext.getSystemService(Context.APP_OPS_SERVICE);
final AssistDataReceiverProxy proxy = new AssistDataReceiverProxy(
assistDataReceiver, recentsComponent.getPackageName());
- mAssistDataRequester = new AssistDataRequester(mService.mContext, mService,
+ mAssistDataRequester = new AssistDataRequester(mService.mContext,
mWindowManager, appOpsManager, proxy, this, OP_ASSIST_STRUCTURE, OP_NONE);
mAssistDataRequester.requestAssistData(mStackSupervisor.getTopVisibleActivities(),
true /* fetchData */, false /* fetchScreenshots */,
@@ -165,7 +163,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
.setCallingUid(recentsUid)
.setCallingPackage(recentsComponent.getPackageName())
.setActivityOptions(SafeActivityOptions.fromBundle(options.toBundle()))
- .setMayWait(mUserController.getCurrentUserId())
+ .setMayWait(mService.getCurrentUserId())
.execute();
mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
mWindowManager.executeAppTransition();
@@ -210,7 +208,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
}
private void finishAnimation(@RecentsAnimationController.ReorderMode int reorderMode) {
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
if (DEBUG) Slog.d(TAG, "onAnimationFinished(): controller="
+ mWindowManager.getRecentsAnimationController()
+ " reorderMode=" + reorderMode);
@@ -232,7 +230,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
mStackSupervisor.sendPowerHintForLaunchEndIfNeeded();
}
- mService.setRunningRemoteAnimation(mCallingPid, false);
+ mService.mAmInternal.setRunningRemoteAnimation(mCallingPid, false);
mWindowManager.inSurfaceTransaction(() -> {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER,
@@ -317,7 +315,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks,
if (runSychronously) {
finishAnimation(reorderMode);
} else {
- mService.mHandler.post(() -> finishAnimation(reorderMode));
+ mService.mH.post(() -> finishAnimation(reorderMode));
}
}
diff --git a/services/core/java/com/android/server/am/SafeActivityOptions.java b/services/core/java/com/android/server/am/SafeActivityOptions.java
index 55d17a96d20b..f7de7f475b7b 100644
--- a/services/core/java/com/android/server/am/SafeActivityOptions.java
+++ b/services/core/java/com/android/server/am/SafeActivityOptions.java
@@ -117,7 +117,7 @@ class SafeActivityOptions {
* @param callerApp The record of the caller.
*/
ActivityOptions getOptions(@Nullable Intent intent, @Nullable ActivityInfo aInfo,
- @Nullable ProcessRecord callerApp,
+ @Nullable WindowProcessController callerApp,
ActivityStackSupervisor supervisor) throws SecurityException {
if (mOriginalOptions != null) {
checkPermissions(intent, aInfo, callerApp, supervisor, mOriginalOptions,
@@ -186,13 +186,13 @@ class SafeActivityOptions {
}
private void checkPermissions(@Nullable Intent intent, @Nullable ActivityInfo aInfo,
- @Nullable ProcessRecord callerApp, ActivityStackSupervisor supervisor,
+ @Nullable WindowProcessController callerApp, ActivityStackSupervisor supervisor,
ActivityOptions options, int callingPid, int callingUid) {
// If a launch task id is specified, then ensure that the caller is the recents
// component or has the START_TASKS_FROM_RECENTS permission
if (options.getLaunchTaskId() != INVALID_TASK_ID
&& !supervisor.mRecentTasks.isCallerRecents(callingUid)) {
- final int startInTaskPerm = supervisor.mService.checkPermission(
+ final int startInTaskPerm = ActivityTaskManagerService.checkPermission(
START_TASKS_FROM_RECENTS, callingPid, callingUid);
if (startInTaskPerm == PERMISSION_DENIED) {
final String msg = "Permission Denial: starting " + getIntentString(intent)
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 4d89d015b669..8f436206f480 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -500,6 +500,23 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
restartTracker.setRestarting(true, memFactor, now);
}
+ public void setProcess(ProcessRecord _proc) {
+ app = _proc;
+ if (ActivityManagerService.TRACK_PROCSTATS_ASSOCIATIONS) {
+ for (int conni = connections.size() - 1; conni >= 0; conni--) {
+ ArrayList<ConnectionRecord> cr = connections.valueAt(conni);
+ for (int i = 0; i < cr.size(); i++) {
+ final ConnectionRecord conn = cr.get(i);
+ if (_proc != null) {
+ conn.startAssociationIfNeeded();
+ } else {
+ conn.stopAssociation();
+ }
+ }
+ }
+ }
+ }
+
public AppBindRecord retrieveAppBindingLocked(Intent intent,
ProcessRecord app) {
Intent.FilterComparison filter = new Intent.FilterComparison(intent);
diff --git a/services/core/java/com/android/server/am/TEST_MAPPING b/services/core/java/com/android/server/am/TEST_MAPPING
new file mode 100644
index 000000000000..9e11eb0fa603
--- /dev/null
+++ b/services/core/java/com/android/server/am/TEST_MAPPING
@@ -0,0 +1,70 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsActivityManagerDeviceTestCases",
+ "options": [
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "android.support.test.filters.FlakyTest"
+ }
+ ]
+ },
+ {
+ "name": "CtsActivityManagerDeviceSdk25TestCases",
+ "options": [
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "android.support.test.filters.FlakyTest"
+ }
+ ]
+ },
+ {
+ "name": "CtsAppTestCases",
+ "options": [
+ {
+ "include-filter": "android.app.cts.TaskDescriptionTest"
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "android.support.test.filters.FlakyTest"
+ }
+ ]
+ },
+ {
+ "name": "FrameworksServicesTests",
+ "options": [
+ {
+ "include-filter": "com.android.server.am."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "android.support.test.filters.FlakyTest"
+ }
+ ]
+ }
+ ],
+ "postsubmit": [
+ {
+ "name": "CtsActivityManagerDeviceTestCases"
+ },
+ {
+ "name": "CtsActivityManagerDeviceSdk25TestCases"
+ },
+ {
+ "name": "FrameworksServicesTests",
+ "options": [
+ {
+ "include-filter": "com.android.server.am."
+ }
+ ]
+ }
+ ]
+}
diff --git a/services/core/java/com/android/server/am/TaskChangeNotificationController.java b/services/core/java/com/android/server/am/TaskChangeNotificationController.java
index 7896e2dd9883..efb80bee5d6f 100644
--- a/services/core/java/com/android/server/am/TaskChangeNotificationController.java
+++ b/services/core/java/com/android/server/am/TaskChangeNotificationController.java
@@ -52,7 +52,8 @@ class TaskChangeNotificationController {
// Delay in notifying task stack change listeners (in millis)
private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100;
- private final ActivityManagerService mService;
+ // Global lock used by the service the instantiate objects of this class.
+ private final Object mServiceLock;
private final ActivityStackSupervisor mStackSupervisor;
private final Handler mHandler;
@@ -149,7 +150,7 @@ class TaskChangeNotificationController {
public void handleMessage(Message msg) {
switch (msg.what) {
case LOG_STACK_STATE_MSG: {
- synchronized (mService) {
+ synchronized (mServiceLock) {
mStackSupervisor.logStackState();
}
break;
@@ -209,15 +210,15 @@ class TaskChangeNotificationController {
}
}
- public TaskChangeNotificationController(ActivityManagerService service,
+ public TaskChangeNotificationController(Object serviceLock,
ActivityStackSupervisor stackSupervisor, Handler handler) {
- mService = service;
+ mServiceLock = serviceLock;
mStackSupervisor = stackSupervisor;
mHandler = new MainHandler(handler.getLooper());
}
public void registerTaskStackListener(ITaskStackListener listener) {
- synchronized (mService) {
+ synchronized (mServiceLock) {
if (listener != null) {
if (Binder.getCallingPid() == android.os.Process.myPid()) {
if (!mLocalTaskStackListeners.contains(listener)) {
@@ -231,7 +232,7 @@ class TaskChangeNotificationController {
}
public void unregisterTaskStackListener(ITaskStackListener listener) {
- synchronized (mService) {
+ synchronized (mServiceLock) {
if (listener != null) {
if (Binder.getCallingPid() == android.os.Process.myPid()) {
mLocalTaskStackListeners.remove(listener);
@@ -243,7 +244,7 @@ class TaskChangeNotificationController {
}
private void forAllRemoteListeners(TaskStackConsumer callback, Message message) {
- synchronized (mService) {
+ synchronized (mServiceLock) {
for (int i = mRemoteTaskStackListeners.beginBroadcast() - 1; i >= 0; i--) {
try {
// Make a one-way callback to the listener
@@ -257,7 +258,7 @@ class TaskChangeNotificationController {
}
private void forAllLocalListeners(TaskStackConsumer callback, Message message) {
- synchronized (mService) {
+ synchronized (mServiceLock) {
for (int i = mLocalTaskStackListeners.size() - 1; i >= 0; i--) {
try {
callback.accept(mLocalTaskStackListeners.get(i), message);
diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java
index 2689d6a4edec..481bb2bbe118 100644
--- a/services/core/java/com/android/server/am/TaskPersister.java
+++ b/services/core/java/com/android/server/am/TaskPersister.java
@@ -83,7 +83,7 @@ public class TaskPersister {
private static final String TAG_TASK = "task";
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mStackSupervisor;
private final RecentTasks mRecentTasks;
private final SparseArray<SparseBooleanArray> mTaskIdsInFile = new SparseArray<>();
@@ -125,7 +125,7 @@ public class TaskPersister {
ArrayList<WriteQueueItem> mWriteQueue = new ArrayList<WriteQueueItem>();
TaskPersister(File systemDir, ActivityStackSupervisor stackSupervisor,
- ActivityManagerService service, RecentTasks recentTasks) {
+ ActivityTaskManagerService service, RecentTasks recentTasks) {
final File legacyImagesDir = new File(systemDir, IMAGES_DIRNAME);
if (legacyImagesDir.exists()) {
@@ -565,7 +565,7 @@ public class TaskPersister {
private void writeTaskIdsFiles() {
SparseArray<SparseBooleanArray> changedTaskIdsPerUser = new SparseArray<>();
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
for (int userId : mRecentTasks.usersWithRecentsLoadedLocked()) {
SparseBooleanArray taskIdsToSave = mRecentTasks.getTaskIdsForUser(userId);
SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId);
@@ -586,7 +586,7 @@ public class TaskPersister {
private void removeObsoleteFiles(ArraySet<Integer> persistentTaskIds) {
int[] candidateUserIds;
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
// Remove only from directories of the users who have recents in memory synchronized
// with persistent storage.
candidateUserIds = mRecentTasks.usersWithRecentsLoadedLocked();
@@ -652,7 +652,7 @@ public class TaskPersister {
if (probablyDone) {
if (DEBUG) Slog.d(TAG, "Looking for obsolete files.");
persistentTaskIds.clear();
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
if (DEBUG) Slog.d(TAG, "mRecents=" + mRecentTasks);
mRecentTasks.getPersistableTaskIds(persistentTaskIds);
mService.mWindowManager.removeObsoleteTaskFiles(persistentTaskIds,
@@ -736,7 +736,7 @@ public class TaskPersister {
StringWriter stringWriter = null;
TaskRecord task = ((TaskWriteQueueItem) item).mTask;
if (DEBUG) Slog.d(TAG, "Writing task=" + task);
- synchronized (mService) {
+ synchronized (mService.mGlobalLock) {
if (task.inRecents) {
// Still there.
try {
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index d3ac7cb15824..05869bbc3d53 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -16,9 +16,9 @@
package com.android.server.am;
-import static android.app.ActivityManager.RESIZE_MODE_FORCED;
-import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
+import static android.app.ActivityTaskManager.RESIZE_MODE_FORCED;
+import static android.app.ActivityTaskManager.RESIZE_MODE_SYSTEM;
+import static android.app.ActivityTaskManager.INVALID_STACK_ID;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -85,6 +85,7 @@ import android.app.ActivityManager;
import android.app.ActivityManager.TaskDescription;
import android.app.ActivityManager.TaskSnapshot;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.AppGlobals;
import android.app.IActivityManager;
import android.content.ComponentName;
@@ -263,7 +264,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
/** The process that had previously hosted the root activity of this task.
* Used to know that we should try harder to keep this process around, in case the
* user wants to return to it. */
- private ProcessRecord mRootProcess;
+ private WindowProcessController mRootProcess;
/** Takes on same value as first root activity */
boolean isPersistable = false;
@@ -294,7 +295,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
int mCallingUid;
String mCallingPackage;
- final ActivityManagerService mService;
+ final ActivityTaskManagerService mService;
private final Rect mTmpStableBounds = new Rect();
private final Rect mTmpNonDecorBounds = new Rect();
@@ -319,10 +320,10 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
private TaskWindowContainerController mWindowContainerController;
/**
- * Don't use constructor directly. Use {@link #create(ActivityManagerService, int, ActivityInfo,
- * Intent, TaskDescription)} instead.
+ * Don't use constructor directly. Use {@link #create(ActivityTaskManagerService, int,
+ * ActivityInfo, Intent, TaskDescription)} instead.
*/
- TaskRecord(ActivityManagerService service, int _taskId, ActivityInfo info, Intent _intent,
+ TaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info, Intent _intent,
IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) {
mService = service;
userId = UserHandle.getUserId(info.applicationInfo.uid);
@@ -338,14 +339,15 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
setIntent(_intent, info);
setMinDimensions(info);
touchActiveTime();
- mService.mTaskChangeNotificationController.notifyTaskCreated(_taskId, realActivity);
+ mService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity);
}
/**
- * Don't use constructor directly. Use {@link #create(ActivityManagerService, int, ActivityInfo,
+ * Don't use constructor directly.
+ * Use {@link #create(ActivityTaskManagerService, int, ActivityInfo,
* Intent, IVoiceInteractionSession, IVoiceInteractor)} instead.
*/
- TaskRecord(ActivityManagerService service, int _taskId, ActivityInfo info, Intent _intent,
+ TaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info, Intent _intent,
TaskDescription _taskDescription) {
mService = service;
userId = UserHandle.getUserId(info.applicationInfo.uid);
@@ -364,17 +366,17 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
isPersistable = true;
// Clamp to [1, max].
maxRecents = Math.min(Math.max(info.maxRecents, 1),
- ActivityManager.getMaxAppRecentsLimitStatic());
+ ActivityTaskManager.getMaxAppRecentsLimitStatic());
lastTaskDescription = _taskDescription;
touchActiveTime();
- mService.mTaskChangeNotificationController.notifyTaskCreated(_taskId, realActivity);
+ mService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity);
}
/**
* Don't use constructor directly. This is only used by XML parser.
*/
- TaskRecord(ActivityManagerService service, int _taskId, Intent _intent,
+ TaskRecord(ActivityTaskManagerService service, int _taskId, Intent _intent,
Intent _affinityIntent, String _affinity, String _rootAffinity,
ComponentName _realActivity, ComponentName _origActivity, boolean _rootWasReset,
boolean _autoRemoveRecents, boolean _askedCompatMode, int _userId,
@@ -418,7 +420,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
mSupportsPictureInPicture = supportsPictureInPicture;
mMinWidth = minWidth;
mMinHeight = minHeight;
- mService.mTaskChangeNotificationController.notifyTaskCreated(_taskId, realActivity);
+ mService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity);
}
TaskWindowContainerController getWindowContainerController() {
@@ -459,13 +461,13 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
// default configuration the next time it launches.
updateOverrideConfiguration(null);
}
- mService.mTaskChangeNotificationController.notifyTaskRemoved(taskId);
+ mService.getTaskChangeNotificationController().notifyTaskRemoved(taskId);
mWindowContainerController = null;
}
@Override
public void onSnapshotChanged(TaskSnapshot snapshot) {
- mService.mTaskChangeNotificationController.notifyTaskSnapshotChanged(taskId, snapshot);
+ mService.getTaskChangeNotificationController().notifyTaskSnapshotChanged(taskId, snapshot);
}
void setResizeMode(int resizeMode) {
@@ -540,8 +542,14 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
if (r != null && !deferResume) {
kept = r.ensureActivityConfiguration(0 /* globalChanges */,
preserveWindow);
+ // Preserve other windows for resizing because if resizing happens when there
+ // is a dialog activity in the front, the activity that still shows some
+ // content to the user will become black and cause flickers. Note in most cases
+ // this won't cause tons of irrelevant windows being preserved because only
+ // activities in this task may experience a bounds change. Configs for other
+ // activities stay the same.
mService.mStackSupervisor.ensureActivitiesVisibleLocked(r, 0,
- !PRESERVE_WINDOWS);
+ preserveWindow);
if (!kept) {
mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
@@ -1129,7 +1137,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
// activity
reportOut.numRunning = 0;
}
- if (r.app != null && r.app.thread != null) {
+ if (r.attachedToProcess()) {
// Increment the number of actually running activities
reportOut.numRunning++;
}
@@ -1233,7 +1241,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
mCallingPackage = r.launchedFromPackage;
// Clamp to [1, max].
maxRecents = Math.min(Math.max(r.info.maxRecents, 1),
- ActivityManager.getMaxAppRecentsLimitStatic());
+ ActivityTaskManager.getMaxAppRecentsLimitStatic());
} else {
// Otherwise make all added activities match this one.
r.setActivityType(getActivityType());
@@ -1301,7 +1309,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
// We normally notify listeners of task stack changes on pause, however pinned stack
// activities are normally in the paused state so no notification will be sent there
// before the activity is removed. We send it here so instead.
- mService.mTaskChangeNotificationController.notifyTaskStackChanged();
+ mService.getTaskChangeNotificationController().notifyTaskStackChanged();
}
if (mActivities.isEmpty()) {
@@ -1744,7 +1752,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
* @param bounds The bounds of the task.
* @param insetBounds The bounds used to calculate the system insets, which is used here to
* subtract the navigation bar/status bar size from the screen size reported
- * to the application. See {@link IActivityManager#resizeDockedStack}.
+ * to the application. See {@link IActivityTaskManager#resizeDockedStack}.
* @return True if the override configuration was updated.
*/
boolean updateOverrideConfiguration(Rect bounds, @Nullable Rect insetBounds) {
@@ -1839,7 +1847,9 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
final int compatScreenHeightDp = (int) (mTmpNonDecorBounds.height() / density);
// We're only overriding LONG, SIZE and COMPAT parts of screenLayout, so we start override
// calculation with partial default.
- final int sl = Configuration.SCREENLAYOUT_LONG_YES | Configuration.SCREENLAYOUT_SIZE_XLARGE;
+ // Reducing the screen layout starting from its parent config.
+ final int sl = parentConfig.screenLayout &
+ (Configuration.SCREENLAYOUT_LONG_MASK | Configuration.SCREENLAYOUT_SIZE_MASK);
final int longSize = Math.max(compatScreenHeightDp, compatScreenWidthDp);
final int shortSize = Math.min(compatScreenHeightDp, compatScreenWidthDp);
config.screenLayout = Configuration.reduceScreenLayout(sl, longSize, shortSize);
@@ -1907,18 +1917,18 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
}
}
- void setRootProcess(ProcessRecord proc) {
+ void setRootProcess(WindowProcessController proc) {
clearRootProcess();
if (intent != null &&
(intent.getFlags() & Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) == 0) {
mRootProcess = proc;
- proc.recentTasks.add(this);
+ mRootProcess.addRecentTask(this);
}
}
void clearRootProcess() {
if (mRootProcess != null) {
- mRootProcess.recentTasks.remove(this);
+ mRootProcess.removeRecentTask(this);
mRootProcess = null;
}
}
@@ -2204,14 +2214,14 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
sTaskRecordFactory = factory;
}
- static TaskRecord create(ActivityManagerService service, int taskId, ActivityInfo info,
+ static TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
Intent intent, IVoiceInteractionSession voiceSession,
IVoiceInteractor voiceInteractor) {
return getTaskRecordFactory().create(
service, taskId, info, intent, voiceSession, voiceInteractor);
}
- static TaskRecord create(ActivityManagerService service, int taskId, ActivityInfo info,
+ static TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
Intent intent, TaskDescription taskDescription) {
return getTaskRecordFactory().create(service, taskId, info, intent, taskDescription);
}
@@ -2228,14 +2238,14 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
*/
static class TaskRecordFactory {
- TaskRecord create(ActivityManagerService service, int taskId, ActivityInfo info,
+ TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
Intent intent, IVoiceInteractionSession voiceSession,
IVoiceInteractor voiceInteractor) {
return new TaskRecord(
service, taskId, info, intent, voiceSession, voiceInteractor);
}
- TaskRecord create(ActivityManagerService service, int taskId, ActivityInfo info,
+ TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
Intent intent, TaskDescription taskDescription) {
return new TaskRecord(service, taskId, info, intent, taskDescription);
}
@@ -2243,7 +2253,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
/**
* Should only be used when we're restoring {@link TaskRecord} from storage.
*/
- TaskRecord create(ActivityManagerService service, int taskId, Intent intent,
+ TaskRecord create(ActivityTaskManagerService service, int taskId, Intent intent,
Intent affinityIntent, String affinity, String rootAffinity,
ComponentName realActivity, ComponentName origActivity, boolean rootWasReset,
boolean autoRemoveRecents, boolean askedCompatMode, int userId,
@@ -2467,7 +2477,8 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi
}
}
- final TaskRecord task = create(stackSupervisor.mService, taskId, intent, affinityIntent,
+ final TaskRecord task = create(stackSupervisor.mService,
+ taskId, intent, affinityIntent,
affinity, rootAffinity, realActivity, origActivity, rootHasReset,
autoRemoveRecents, askedCompatMode, userId, effectiveUid, lastDescription,
activities, lastTimeOnTop, neverRelinquishIdentity, taskDescription,
diff --git a/services/core/java/com/android/server/am/UnsupportedCompileSdkDialog.java b/services/core/java/com/android/server/am/UnsupportedCompileSdkDialog.java
index b6f6ae6b508c..7348a0d5a365 100644
--- a/services/core/java/com/android/server/am/UnsupportedCompileSdkDialog.java
+++ b/services/core/java/com/android/server/am/UnsupportedCompileSdkDialog.java
@@ -20,6 +20,7 @@ import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.view.Window;
import android.view.WindowManager;
@@ -37,7 +38,10 @@ public class UnsupportedCompileSdkDialog {
mPackageName = appInfo.packageName;
final PackageManager pm = context.getPackageManager();
- final CharSequence label = appInfo.loadSafeLabel(pm);
+ final CharSequence label = appInfo.loadSafeLabel(pm,
+ PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
+ PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE
+ | PackageItemInfo.SAFE_LABEL_FLAG_TRIM);
final CharSequence message = context.getString(R.string.unsupported_compile_sdk_message,
label);
diff --git a/services/core/java/com/android/server/am/UnsupportedDisplaySizeDialog.java b/services/core/java/com/android/server/am/UnsupportedDisplaySizeDialog.java
index 88506632d7c3..1d6438c6e79f 100644
--- a/services/core/java/com/android/server/am/UnsupportedDisplaySizeDialog.java
+++ b/services/core/java/com/android/server/am/UnsupportedDisplaySizeDialog.java
@@ -21,6 +21,7 @@ import com.android.internal.R;
import android.app.AlertDialog;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.view.Window;
import android.view.WindowManager;
@@ -35,7 +36,10 @@ public class UnsupportedDisplaySizeDialog {
mPackageName = appInfo.packageName;
final PackageManager pm = context.getPackageManager();
- final CharSequence label = appInfo.loadSafeLabel(pm);
+ final CharSequence label = appInfo.loadSafeLabel(pm,
+ PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
+ PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE
+ | PackageItemInfo.SAFE_LABEL_FLAG_TRIM);
final CharSequence message = context.getString(
R.string.unsupported_display_size_message, label);
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 18c095725b09..fa670a250886 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -28,9 +28,9 @@ import static android.os.Process.SYSTEM_UID;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityManagerService.ALLOW_FULL_ONLY;
-import static com.android.server.am.ActivityManagerService.ALLOW_NON_FULL;
-import static com.android.server.am.ActivityManagerService.ALLOW_NON_FULL_IN_PROFILE;
+import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
+import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
+import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
import static com.android.server.am.ActivityManagerService.MY_PID;
import static com.android.server.am.UserState.STATE_BOOTING;
import static com.android.server.am.UserState.STATE_RUNNING_LOCKED;
@@ -41,6 +41,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
+import com.android.server.wm.ActivityTaskManagerInternal;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.Dialog;
@@ -80,7 +81,6 @@ import android.os.storage.StorageManager;
import android.text.format.DateUtils;
import android.util.ArraySet;
import android.util.IntArray;
-import android.util.Log;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
@@ -88,7 +88,6 @@ import android.util.SparseIntArray;
import android.util.TimingsTraceLog;
import android.util.proto.ProtoOutputStream;
-import android.view.Window;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -260,11 +259,14 @@ class UserController implements Handler.Callback {
}
void finishUserSwitch(UserState uss) {
- finishUserBoot(uss);
- startProfiles();
- synchronized (mLock) {
- stopRunningUsersLU(mMaxRunningUsers);
- }
+ // This call holds the AM lock so we post to the handler.
+ mHandler.post(() -> {
+ finishUserBoot(uss);
+ startProfiles();
+ synchronized (mLock) {
+ stopRunningUsersLU(mMaxRunningUsers);
+ }
+ });
}
List<Integer> getRunningUsersLU() {
@@ -1574,7 +1576,9 @@ class UserController implements Handler.Callback {
}
boolean hasStartedUserState(int userId) {
- return mStartedUsers.get(userId) != null;
+ synchronized (mLock) {
+ return mStartedUsers.get(userId) != null;
+ }
}
private void updateStartedUserArrayLU() {
@@ -1750,7 +1754,7 @@ class UserController implements Handler.Callback {
return ums != null ? ums.getUserIds() : new int[] { 0 };
}
- UserInfo getUserInfo(int userId) {
+ private UserInfo getUserInfo(int userId) {
return mInjector.getUserManager().getUserInfo(userId);
}
@@ -1776,7 +1780,7 @@ class UserController implements Handler.Callback {
return mInjector.getUserManager().exists(userId);
}
- void enforceShellRestriction(String restriction, int userHandle) {
+ private void enforceShellRestriction(String restriction, int userHandle) {
if (Binder.getCallingUid() == SHELL_UID) {
if (userHandle < 0 || hasUserRestriction(restriction, userHandle)) {
throw new SecurityException("Shell does not have permission to access user "
@@ -1789,16 +1793,6 @@ class UserController implements Handler.Callback {
return mInjector.getUserManager().hasUserRestriction(restriction, userId);
}
- Set<Integer> getProfileIds(int userId) {
- Set<Integer> userIds = new HashSet<>();
- final List<UserInfo> profiles = mInjector.getUserManager().getProfiles(userId,
- false /* enabledOnly */);
- for (UserInfo user : profiles) {
- userIds.add(user.id);
- }
- return userIds;
- }
-
boolean isSameProfileGroup(int callingUserId, int targetUserId) {
if (callingUserId == targetUserId) {
return true;
@@ -2097,9 +2091,7 @@ class UserController implements Handler.Callback {
return mService.mWindowManager;
}
void activityManagerOnUserStopped(int userId) {
- synchronized (mService) {
- mService.onUserStoppedLocked(userId);
- }
+ LocalServices.getService(ActivityTaskManagerInternal.class).onUserStopped(userId);
}
void systemServiceManagerCleanupUser(int userId) {
@@ -2174,9 +2166,7 @@ class UserController implements Handler.Callback {
}
void updateUserConfiguration() {
- synchronized (mService) {
- mService.updateUserConfigurationLocked();
- }
+ mService.mActivityTaskManager.updateUserConfiguration();
}
void clearBroadcastQueueForUser(int userId) {
@@ -2187,7 +2177,7 @@ class UserController implements Handler.Callback {
void loadUserRecents(int userId) {
synchronized (mService) {
- mService.getRecentTasks().loadUserRecentsLocked(userId);
+ mService.mActivityTaskManager.getRecentTasks().loadUserRecentsLocked(userId);
}
}
@@ -2248,12 +2238,12 @@ class UserController implements Handler.Callback {
protected void clearAllLockedTasks(String reason) {
synchronized (mService) {
- mService.getLockTaskController().clearLockedTasks(reason);
+ mService.mActivityTaskManager.getLockTaskController().clearLockedTasks(reason);
}
}
protected boolean isCallerRecents(int callingUid) {
- return mService.getRecentTasks().isCallerRecents(callingUid);
+ return mService.mActivityTaskManager.getRecentTasks().isCallerRecents(callingUid);
}
}
}
diff --git a/services/core/java/com/android/server/am/VrController.java b/services/core/java/com/android/server/am/VrController.java
index 45410d79afe7..366f95a170ff 100644
--- a/services/core/java/com/android/server/am/VrController.java
+++ b/services/core/java/com/android/server/am/VrController.java
@@ -147,14 +147,15 @@ final class VrController {
*
* <p>Note: This must be called with the global ActivityManagerService lock held.
*
- * @param proc is the ProcessRecord of the process that entered or left the TOP_APP scheduling
- * group.
+ * @param proc is the WindowProcessController of the process that entered or left the TOP_APP
+ * scheduling group.
*/
- public void onTopProcChangedLocked(ProcessRecord proc) {
- if (proc.curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) {
- setVrRenderThreadLocked(proc.vrThreadTid, proc.curSchedGroup, true);
+ public void onTopProcChangedLocked(WindowProcessController proc) {
+ final int curSchedGroup = proc.getCurrentSchedulingGroup();
+ if (curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) {
+ setVrRenderThreadLocked(proc.mVrThreadTid, curSchedGroup, true);
} else {
- if (proc.vrThreadTid == mVrRenderThreadTid) {
+ if (proc.mVrThreadTid == mVrRenderThreadTid) {
clearVrRenderThreadLocked(true);
}
}
@@ -190,7 +191,7 @@ final class VrController {
changed = changeVrModeLocked(vrMode, record.app);
if (record.app != null) {
- processId = record.app.pid;
+ processId = record.app.getPid();
}
}
@@ -213,9 +214,9 @@ final class VrController {
*
* @param tid the tid of the thread to set, or 0 to unset the current thread.
* @param pid the pid of the process owning the thread to set.
- * @param proc the ProcessRecord of the process owning the thread to set.
+ * @param proc the WindowProcessController of the process owning the thread to set.
*/
- public void setVrThreadLocked(int tid, int pid, ProcessRecord proc) {
+ public void setVrThreadLocked(int tid, int pid, WindowProcessController proc) {
if (hasPersistentVrFlagSet()) {
Slog.w(TAG, "VR thread cannot be set in persistent VR mode!");
return;
@@ -230,9 +231,9 @@ final class VrController {
if (!inVrMode()) {
Slog.w(TAG, "VR thread cannot be set when not in VR mode!");
} else {
- setVrRenderThreadLocked(tid, proc.curSchedGroup, false);
+ setVrRenderThreadLocked(tid, proc.getCurrentSchedulingGroup(), false);
}
- proc.vrThreadTid = (tid > 0) ? tid : 0;
+ proc.mVrThreadTid = (tid > 0) ? tid : 0;
}
/**
@@ -280,11 +281,11 @@ final class VrController {
* <p>Note: This must be called with the global ActivityManagerService lock held.
*
* @param vrMode {@code true} if the system VR mode is being enabled.
- * @param proc the ProcessRecord of the process enabling the system VR mode.
+ * @param proc the WindowProcessController of the process enabling the system VR mode.
*
* @return {@code true} if our state changed.
*/
- private boolean changeVrModeLocked(boolean vrMode, ProcessRecord proc) {
+ private boolean changeVrModeLocked(boolean vrMode, WindowProcessController proc) {
final int oldVrState = mVrState;
// This is the only place where mVrState should have its FLAG_VR_MODE setting
@@ -299,8 +300,9 @@ final class VrController {
if (changed) {
if (proc != null) {
- if (proc.vrThreadTid > 0) {
- setVrRenderThreadLocked(proc.vrThreadTid, proc.curSchedGroup, false);
+ if (proc.mVrThreadTid > 0) {
+ setVrRenderThreadLocked(
+ proc.mVrThreadTid, proc.getCurrentSchedulingGroup(), false);
}
} else {
clearVrRenderThreadLocked(false);
diff --git a/services/core/java/com/android/server/am/WindowProcessController.java b/services/core/java/com/android/server/am/WindowProcessController.java
new file mode 100644
index 000000000000..817905a5e3d4
--- /dev/null
+++ b/services/core/java/com/android/server/am/WindowProcessController.java
@@ -0,0 +1,531 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.am;
+
+import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RELEASE;
+import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RELEASE;
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
+import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
+import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
+import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
+import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
+import static com.android.server.am.ActivityStack.ActivityState.RESUMED;
+import static com.android.server.am.ActivityStack.ActivityState.STOPPING;
+
+import android.app.Activity;
+import android.app.ActivityTaskManager;
+import android.app.ActivityThread;
+import android.app.IApplicationThread;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.os.RemoteException;
+import android.util.ArraySet;
+import android.util.Log;
+import android.util.Slog;
+
+import com.android.internal.app.HeavyWeightSwitcherActivity;
+import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.internal.util.function.pooled.PooledRunnable;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+/**
+ * The Activity Manager (AM) package manages the lifecycle of processes in the system through
+ * {@link ProcessRecord}. However, it is important for the Window Manager (WM) package to be aware
+ * of the processes and their state since it affects how WM manages windows and activities. This
+ * class that allows the {@link ProcessRecord} object in the AM package to communicate important
+ * changes to its state to the WM package in a structured way. WM package also uses
+ * {@link WindowProcessListener} to request changes to the process state on the AM side.
+ * Note that public calls into this class are assumed to be originating from outside the
+ * window manager so the window manager lock is held and appropriate permissions are checked before
+ * calls are allowed to proceed.
+ */
+public class WindowProcessController {
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowProcessController" : TAG_AM;
+ private static final String TAG_RELEASE = TAG + POSTFIX_RELEASE;
+
+ // all about the first app in the process
+ final ApplicationInfo mInfo;
+ final String mName;
+ final int mUid;
+ // The process of this application; 0 if none
+ private volatile int mPid;
+ // user of process.
+ final int mUserId;
+ // The owner of this window process controller object. Mainly for identification when we
+ // communicate back to the activity manager side.
+ public final Object mOwner;
+ // List of packages running in the process
+ final ArraySet<String> mPkgList = new ArraySet<>();
+ private final WindowProcessListener mListener;
+ private final ActivityTaskManagerService mAtm;
+ // The actual proc... may be null only if 'persistent' is true (in which case we are in the
+ // process of launching the app)
+ private volatile IApplicationThread mThread;
+ // Currently desired scheduling class
+ private volatile int mCurSchedGroup;
+ // Last reported process state;
+ private volatile int mRepProcState = PROCESS_STATE_NONEXISTENT;
+ // are we in the process of crashing?
+ private volatile boolean mCrashing;
+ // does the app have a not responding dialog?
+ private volatile boolean mNotResponding;
+ // always keep this application running?
+ private volatile boolean mPersistent;
+ // The ABI this process was launched with
+ private volatile String mRequiredAbi;
+ // Running any services that are foreground?
+ private volatile boolean mHasForegroundServices;
+
+ // Thread currently set for VR scheduling
+ int mVrThreadTid;
+
+ // all activities running in the process
+ private final ArrayList<ActivityRecord> mActivities = new ArrayList<>();
+ // any tasks this process had run root activities in
+ private final ArrayList<TaskRecord> mRecentTasks = new ArrayList<>();
+
+ WindowProcessController(ActivityTaskManagerService atm, ApplicationInfo info, String name,
+ int uid, int userId, Object owner, WindowProcessListener listener) {
+ mInfo = info;
+ mName = name;
+ mUid = uid;
+ mUserId = userId;
+ mOwner = owner;
+ mListener = listener;
+ mAtm = atm;
+ }
+
+ public void setPid(int pid) {
+ mPid = pid;
+ }
+
+ int getPid() {
+ return mPid;
+ }
+
+ public void setThread(IApplicationThread thread) {
+ mThread = thread;
+ }
+
+ IApplicationThread getThread() {
+ return mThread;
+ }
+
+ boolean hasThread() {
+ return mThread != null;
+ }
+
+ public void setCurrentSchedulingGroup(int curSchedGroup) {
+ mCurSchedGroup = curSchedGroup;
+ }
+
+ int getCurrentSchedulingGroup() {
+ return mCurSchedGroup;
+ }
+
+ public void setReportedProcState(int repProcState) {
+ mRepProcState = repProcState;
+ }
+
+ int getReportedProcState() {
+ return mRepProcState;
+ }
+
+ public void setCrashing(boolean crashing) {
+ mCrashing = crashing;
+ }
+
+ boolean isCrashing() {
+ return mCrashing;
+ }
+
+ public void setNotResponding(boolean notResponding) {
+ mNotResponding = notResponding;
+ }
+
+ boolean isNotResponding() {
+ return mNotResponding;
+ }
+
+ public void setPersistent(boolean persistent) {
+ mPersistent = persistent;
+ }
+
+ boolean isPersistent() {
+ return mPersistent;
+ }
+
+ public void setHasForegroundServices(boolean hasForegroundServices) {
+ mHasForegroundServices = hasForegroundServices;
+ }
+
+ boolean hasForegroundServices() {
+ return mHasForegroundServices;
+ }
+
+ public void setRequiredAbi(String requiredAbi) {
+ mRequiredAbi = requiredAbi;
+ }
+
+ String getRequiredAbi() {
+ return mRequiredAbi;
+ }
+
+ public void addPackage(String packageName) {
+ synchronized (mAtm.mGlobalLock) {
+ mPkgList.add(packageName);
+ }
+ }
+
+ public void clearPackageList() {
+ synchronized (mAtm.mGlobalLock) {
+ mPkgList.clear();
+ }
+ }
+
+ void addActivityIfNeeded(ActivityRecord r) {
+ if (mActivities.contains(r)) {
+ return;
+ }
+ mActivities.add(r);
+ }
+
+ void removeActivity(ActivityRecord r) {
+ mActivities.remove(r);
+ }
+
+ public void clearActivities() {
+ synchronized (mAtm.mGlobalLock) {
+ mActivities.clear();
+ }
+ }
+
+ public boolean hasActivities() {
+ synchronized (mAtm.mGlobalLock) {
+ return !mActivities.isEmpty();
+ }
+ }
+
+ public boolean hasVisibleActivities() {
+ synchronized (mAtm.mGlobalLock) {
+ for (int i = mActivities.size() - 1; i >= 0; --i) {
+ final ActivityRecord r = mActivities.get(i);
+ if (r.visible) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean hasActivitiesOrRecentTasks() {
+ synchronized (mAtm.mGlobalLock) {
+ return !mActivities.isEmpty() || !mRecentTasks.isEmpty();
+ }
+ }
+
+ public void stopFreezingActivities() {
+ synchronized (mAtm.mGlobalLock) {
+ int i = mActivities.size();
+ while (i > 0) {
+ i--;
+ mActivities.get(i).stopFreezingScreenLocked(true);
+ }
+ }
+ }
+
+ public void finishActivities() {
+ synchronized (mAtm.mGlobalLock) {
+ ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities);
+ for (int i = 0; i < activities.size(); i++) {
+ final ActivityRecord r = activities.get(i);
+ if (!r.finishing && r.isInStackLocked()) {
+ r.getStack().finishActivityLocked(r, Activity.RESULT_CANCELED,
+ null, "finish-heavy", true);
+ }
+ }
+ }
+ }
+
+ public boolean isInterestingToUser() {
+ synchronized (mAtm.mGlobalLock) {
+ final int size = mActivities.size();
+ for (int i = 0; i < size; i++) {
+ ActivityRecord r = mActivities.get(i);
+ if (r.isInterestingToUserLocked()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean hasRunningActivity(String packageName) {
+ synchronized (mAtm.mGlobalLock) {
+ for (int i = mActivities.size() - 1; i >= 0; --i) {
+ final ActivityRecord r = mActivities.get(i);
+ if (packageName.equals(r.packageName)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void clearPackagePreferredForHomeActivities() {
+ synchronized (mAtm.mGlobalLock) {
+ for (int i = mActivities.size() - 1; i >= 0; --i) {
+ final ActivityRecord r = mActivities.get(i);
+ if (r.isActivityTypeHome()) {
+ Log.i(TAG, "Clearing package preferred activities from " + r.packageName);
+ try {
+ ActivityThread.getPackageManager()
+ .clearPackagePreferredActivities(r.packageName);
+ } catch (RemoteException c) {
+ // pm is in same process, this will never happen.
+ }
+ }
+ }
+ }
+ }
+
+ boolean hasStartedActivity(ActivityRecord launchedActivity) {
+ for (int i = mActivities.size() - 1; i >= 0; i--) {
+ final ActivityRecord activity = mActivities.get(i);
+ if (launchedActivity == activity) {
+ continue;
+ }
+ if (!activity.stopped) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ public void updateIntentForHeavyWeightActivity(Intent intent) {
+ synchronized (mAtm.mGlobalLock) {
+ if (mActivities.isEmpty()) {
+ return;
+ }
+ ActivityRecord hist = mActivities.get(0);
+ intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, hist.packageName);
+ intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTask().taskId);
+ }
+ }
+
+ boolean shouldKillProcessForRemovedTask(TaskRecord tr) {
+ for (int k = 0; k < mActivities.size(); k++) {
+ final TaskRecord otherTask = mActivities.get(k).getTask();
+ if (tr.taskId != otherTask.taskId && otherTask.inRecents) {
+ // Don't kill process(es) that has an activity in a different task that is
+ // also in recents.
+ return false;
+ }
+ }
+ return true;
+ }
+
+ ArraySet<TaskRecord> getReleaseSomeActivitiesTasks() {
+ // Examine all activities currently running in the process.
+ TaskRecord firstTask = null;
+ // Tasks is non-null only if two or more tasks are found.
+ ArraySet<TaskRecord> tasks = null;
+ if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Trying to release some activities in " + this);
+ for (int i = 0; i < mActivities.size(); i++) {
+ final ActivityRecord r = mActivities.get(i);
+ // First, if we find an activity that is in the process of being destroyed,
+ // then we just aren't going to do anything for now; we want things to settle
+ // down before we try to prune more activities.
+ if (r.finishing || r.isState(DESTROYING, DESTROYED)) {
+ if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r);
+ return null;
+ }
+ // Don't consider any activies that are currently not in a state where they
+ // can be destroyed.
+ if (r.visible || !r.stopped || !r.haveState
+ || r.isState(RESUMED, PAUSING, PAUSED, STOPPING)) {
+ if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r);
+ continue;
+ }
+
+ final TaskRecord task = r.getTask();
+ if (task != null) {
+ if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Collecting release task " + task
+ + " from " + r);
+ if (firstTask == null) {
+ firstTask = task;
+ } else if (firstTask != task) {
+ if (tasks == null) {
+ tasks = new ArraySet<>();
+ tasks.add(firstTask);
+ }
+ tasks.add(task);
+ }
+ }
+ }
+
+ return tasks;
+ }
+
+ public interface ComputeOomAdjCallback {
+ void onVisibleActivity();
+ void onPausedActivity();
+ void onStoppingActivity(boolean finishing);
+ void onOtherActivity();
+ }
+
+ public int computeOomAdjFromActivities(int minTaskLayer, ComputeOomAdjCallback callback) {
+ synchronized (mAtm.mGlobalLock) {
+ final int activitiesSize = mActivities.size();
+ for (int j = 0; j < activitiesSize; j++) {
+ final ActivityRecord r = mActivities.get(j);
+ if (r.app != this) {
+ Log.e(TAG, "Found activity " + r + " in proc activity list using " + r.app
+ + " instead of expected " + this);
+ if (r.app == null || (r.app.mUid == mUid)) {
+ // Only fix things up when they look sane
+ r.setProcess(this);
+ } else {
+ continue;
+ }
+ }
+ if (r.visible) {
+ callback.onVisibleActivity();
+ final TaskRecord task = r.getTask();
+ if (task != null && minTaskLayer > 0) {
+ final int layer = task.mLayerRank;
+ if (layer >= 0 && minTaskLayer > layer) {
+ minTaskLayer = layer;
+ }
+ }
+ break;
+ } else if (r.isState(PAUSING, PAUSED)) {
+ callback.onPausedActivity();
+ } else if (r.isState(STOPPING)) {
+ callback.onStoppingActivity(r.finishing);
+ } else {
+ callback.onOtherActivity();
+ }
+ }
+ }
+
+ return minTaskLayer;
+ }
+
+ void clearProfilerIfNeeded() {
+ if (mListener == null) return;
+ // Posting on handler so WM lock isn't held when we call into AM.
+ mAtm.mH.post(() -> mListener.clearProfilerIfNeeded());
+ }
+
+ void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
+ boolean activityChange, boolean updateOomAdj) {
+ if (mListener == null) return;
+ // Posting on handler so WM lock isn't held when we call into AM.
+ final Runnable r = PooledLambda.obtainRunnable(WindowProcessListener::updateProcessInfo,
+ mListener, updateServiceConnectionActivities, updateLru, activityChange,
+ updateOomAdj);
+ mAtm.mH.post(r);
+ }
+
+ void updateServiceConnectionActivities() {
+ if (mListener == null) return;
+ // Posting on handler so WM lock isn't held when we call into AM.
+ mAtm.mH.post(() -> mListener.updateServiceConnectionActivities());
+ }
+
+ void setPendingUiClean(boolean pendingUiClean) {
+ if (mListener == null) return;
+ // Posting on handler so WM lock isn't held when we call into AM.
+ final Runnable r = PooledLambda.obtainRunnable(
+ WindowProcessListener::setPendingUiClean, mListener, pendingUiClean);
+ mAtm.mH.post(r);
+ }
+
+ void setPendingUiCleanAndForceProcessStateUpTo(int newState) {
+ if (mListener == null) return;
+ // Posting on handler so WM lock isn't held when we call into AM.
+ final Runnable r = PooledLambda.obtainRunnable(
+ WindowProcessListener::setPendingUiCleanAndForceProcessStateUpTo,
+ mListener, newState);
+ mAtm.mH.post(r);
+ }
+
+ void setRemoved(boolean removed) {
+ if (mListener == null) return;
+ // Posting on handler so WM lock isn't held when we call into AM.
+ final Runnable r = PooledLambda.obtainRunnable(
+ WindowProcessListener::setRemoved, mListener, removed);
+ mAtm.mH.post(r);
+ }
+
+ /** Returns the total time (in milliseconds) spent executing in both user and system code. */
+ public long getCpuTime() {
+ return (mListener != null) ? mListener.getCpuTime() : 0;
+ }
+
+ void addRecentTask(TaskRecord task) {
+ mRecentTasks.add(task);
+ }
+
+ void removeRecentTask(TaskRecord task) {
+ mRecentTasks.remove(task);
+ }
+
+ public boolean hasRecentTasks() {
+ synchronized (mAtm.mGlobalLock) {
+ return !mRecentTasks.isEmpty();
+ }
+ }
+
+ public void clearRecentTasks() {
+ synchronized (mAtm.mGlobalLock) {
+ for (int i = mRecentTasks.size() - 1; i >= 0; i--) {
+ mRecentTasks.get(i).clearRootProcess();
+ }
+ mRecentTasks.clear();
+ }
+ }
+
+ public void dump(PrintWriter pw, String prefix) {
+ synchronized (mAtm.mGlobalLock) {
+ if (mActivities.size() > 0) {
+ pw.print(prefix); pw.println("Activities:");
+ for (int i = 0; i < mActivities.size(); i++) {
+ pw.print(prefix); pw.print(" - "); pw.println(mActivities.get(i));
+ }
+ }
+
+ if (mRecentTasks.size() > 0) {
+ pw.println(prefix + "Recent Tasks:");
+ for (int i = 0; i < mRecentTasks.size(); i++) {
+ pw.println(prefix + " - " + mRecentTasks.get(i));
+ }
+ }
+
+ if (mVrThreadTid != 0) {
+ pw.print(prefix); pw.print("mVrThreadTid="); pw.println(mVrThreadTid);
+ }
+ }
+ }
+
+}
diff --git a/services/core/java/com/android/server/am/WindowProcessListener.java b/services/core/java/com/android/server/am/WindowProcessListener.java
new file mode 100644
index 000000000000..2de3e3763028
--- /dev/null
+++ b/services/core/java/com/android/server/am/WindowProcessListener.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.am;
+
+/**
+ * Interface used by the owner/creator of a process that owns windows to listen to changes from the
+ * WM side.
+ * @see WindowProcessController
+ */
+public interface WindowProcessListener {
+
+ /** Clear the profiler record if we are currently profiling this process. */
+ void clearProfilerIfNeeded();
+
+ /** Update the service connection for this process based on activities it might have. */
+ void updateServiceConnectionActivities();
+
+ /** Set or clear flag that we would like to clean-up UI resources for this process. */
+ void setPendingUiClean(boolean pendingUiClean);
+
+ /**
+ * Set flag that we would like to clean-up UI resources for this process and force new process
+ * state.
+ */
+ void setPendingUiCleanAndForceProcessStateUpTo(int newState);
+
+ /** Update the process information. */
+ void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
+ boolean activityChange, boolean updateOomAdj);
+
+ /** Set process package been removed from device. */
+ void setRemoved(boolean removed);
+
+ /** Returns the total time (in milliseconds) spent executing in both user and system code. */
+ long getCpuTime();
+}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 499522ff0e32..2bae6f71855b 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -20,8 +20,6 @@ import static android.Manifest.permission.REMOTE_AUDIO_PLAYBACK;
import static android.media.AudioManager.RINGER_MODE_NORMAL;
import static android.media.AudioManager.RINGER_MODE_SILENT;
import static android.media.AudioManager.RINGER_MODE_VIBRATE;
-import static android.media.AudioManager.STREAM_ALARM;
-import static android.media.AudioManager.STREAM_MUSIC;
import static android.media.AudioManager.STREAM_SYSTEM;
import static android.os.Process.FIRST_APPLICATION_UID;
import static android.provider.Settings.Secure.VOLUME_HUSH_MUTE;
@@ -141,6 +139,7 @@ import com.android.server.audio.AudioServiceEvents.PhoneStateEvent;
import com.android.server.audio.AudioServiceEvents.VolumeEvent;
import com.android.server.audio.AudioServiceEvents.WiredDevConnectEvent;
import com.android.server.pm.UserManagerService;
+import com.android.server.wm.ActivityTaskManagerInternal;
import org.xmlpull.v1.XmlPullParserException;
@@ -730,6 +729,14 @@ public class AudioService extends IAudioService.Stub
int maxCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_steps", -1);
if (maxCallVolume != -1) {
MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = maxCallVolume;
+ }
+
+ int defaultCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_default", -1);
+ if (defaultCallVolume != -1 &&
+ defaultCallVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] &&
+ defaultCallVolume >= MIN_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]) {
+ AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = defaultCallVolume;
+ } else {
AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] =
(maxCallVolume * 3) / 4;
}
@@ -741,7 +748,8 @@ public class AudioService extends IAudioService.Stub
int defaultMusicVolume = SystemProperties.getInt("ro.config.media_vol_default", -1);
if (defaultMusicVolume != -1 &&
- defaultMusicVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]) {
+ defaultMusicVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] &&
+ defaultMusicVolume >= MIN_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]) {
AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = defaultMusicVolume;
} else {
if (isPlatformTelevision()) {
@@ -2051,6 +2059,10 @@ public class AudioService extends IAudioService.Stub
/** @see AudioManager#forceVolumeControlStream(int) */
public void forceVolumeControlStream(int streamType, IBinder cb) {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+ != PackageManager.PERMISSION_GRANTED) {
+ return;
+ }
if (DEBUG_VOL) { Log.d(TAG, String.format("forceVolumeControlStream(%d)", streamType)); }
synchronized(mForceControlStreamLock) {
if (mVolumeControlStream != -1 && streamType != -1) {
@@ -3262,7 +3274,7 @@ public class AudioService extends IAudioService.Stub
return;
}
// Only enable calls from system components
- if (Binder.getCallingUid() >= FIRST_APPLICATION_UID) {
+ if (UserHandle.getCallingAppId() >= FIRST_APPLICATION_UID) {
Log.i(TAG, "In setBluetoothScoOn(), on: "+on+". The calling application Uid: "
+ Binder.getCallingUid() + ", is greater than FIRST_APPLICATION_UID"
+ " exiting from setBluetoothScoOn()");
@@ -3918,6 +3930,10 @@ public class AudioService extends IAudioService.Stub
int delay = checkSendBecomingNoisyIntent(
AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, intState,
AudioSystem.DEVICE_NONE);
+ final String addr = btDevice == null ? "null" : btDevice.getAddress();
+ mDeviceLogger.log(new AudioEventLogger.StringEvent(
+ "A2DP service connected: device addr=" + addr
+ + " state=" + state));
queueMsgUnderWakeLock(mAudioHandler,
MSG_SET_A2DP_SINK_CONNECTION_STATE,
state,
@@ -4797,7 +4813,14 @@ public class AudioService extends IAudioService.Stub
public int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(BluetoothDevice device,
int state, int profile, boolean suppressNoisyIntent, int a2dpVolume)
{
+ mDeviceLogger.log(new AudioEventLogger.StringEvent(
+ "setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent state=" + state
+ // only querying address as this is the only readily available field on the device
+ + " addr=" + device.getAddress()
+ + " prof=" + profile + " supprNoisy=" + suppressNoisyIntent
+ + " vol=" + a2dpVolume));
if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, device)) {
+ mDeviceLogger.log(new AudioEventLogger.StringEvent("A2DP connection state ignored"));
return 0;
}
return setBluetoothA2dpDeviceConnectionStateInt(
@@ -5751,7 +5774,7 @@ public class AudioService extends IAudioService.Stub
case MSG_SET_WIRED_DEVICE_CONNECTION_STATE:
{ WiredDeviceConnectionState connectState =
(WiredDeviceConnectionState)msg.obj;
- mWiredDevLogger.log(new WiredDevConnectEvent(connectState));
+ mDeviceLogger.log(new WiredDevConnectEvent(connectState));
onSetWiredDeviceConnectionState(connectState.mType, connectState.mState,
connectState.mAddress, connectState.mName, connectState.mCaller);
mAudioEventWakeLock.release();
@@ -6206,10 +6229,14 @@ public class AudioService extends IAudioService.Stub
if (!BluetoothAdapter.checkBluetoothAddress(address)) {
address = "";
}
+ mDeviceLogger.log(new AudioEventLogger.StringEvent(
+ "onBluetoothA2dpDeviceConfigChange addr=" + address));
int device = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
synchronized (mConnectedDevices) {
if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, btDevice)) {
+ mDeviceLogger.log(new AudioEventLogger.StringEvent(
+ "A2dp config change ignored"));
return;
}
final String key = makeDeviceListKey(device, address);
@@ -6860,7 +6887,8 @@ public class AudioService extends IAudioService.Stub
// when the user switches back. For managed profiles, we should kill all recording apps
ComponentName homeActivityName = null;
if (!oldUser.isManagedProfile()) {
- homeActivityName = mActivityManagerInternal.getHomeActivityForUser(oldUser.id);
+ homeActivityName = LocalServices.getService(
+ ActivityTaskManagerInternal.class).getHomeActivityForUser(oldUser.id);
}
final String[] permissions = { Manifest.permission.RECORD_AUDIO };
List<PackageInfo> packages;
@@ -7388,19 +7416,20 @@ public class AudioService extends IAudioService.Stub
//==========================================================================================
// AudioService logging and dumpsys
//==========================================================================================
- final int LOG_NB_EVENTS_PHONE_STATE = 20;
- final int LOG_NB_EVENTS_WIRED_DEV_CONNECTION = 30;
- final int LOG_NB_EVENTS_FORCE_USE = 20;
- final int LOG_NB_EVENTS_VOLUME = 40;
- final int LOG_NB_EVENTS_DYN_POLICY = 10;
+ static final int LOG_NB_EVENTS_PHONE_STATE = 20;
+ static final int LOG_NB_EVENTS_DEVICE_CONNECTION = 30;
+ static final int LOG_NB_EVENTS_FORCE_USE = 20;
+ static final int LOG_NB_EVENTS_VOLUME = 40;
+ static final int LOG_NB_EVENTS_DYN_POLICY = 10;
final private AudioEventLogger mModeLogger = new AudioEventLogger(LOG_NB_EVENTS_PHONE_STATE,
"phone state (logged after successfull call to AudioSystem.setPhoneState(int))");
- final private AudioEventLogger mWiredDevLogger = new AudioEventLogger(
- LOG_NB_EVENTS_WIRED_DEV_CONNECTION,
- "wired device connection (logged before onSetWiredDeviceConnectionState() is executed)"
- );
+ // logs for wired + A2DP device connections:
+ // - wired: logged before onSetWiredDeviceConnectionState() is executed
+ // - A2DP: logged at reception of method call
+ final private AudioEventLogger mDeviceLogger = new AudioEventLogger(
+ LOG_NB_EVENTS_DEVICE_CONNECTION, "wired/A2DP device connection");
final private AudioEventLogger mForceUseLogger = new AudioEventLogger(
LOG_NB_EVENTS_FORCE_USE,
@@ -7489,7 +7518,7 @@ public class AudioService extends IAudioService.Stub
pw.println("\nEvent logs:");
mModeLogger.dump(pw);
pw.println("\n");
- mWiredDevLogger.dump(pw);
+ mDeviceLogger.dump(pw);
pw.println("\n");
mForceUseLogger.dump(pw);
pw.println("\n");
diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/common/AuthenticationClient.java
index afd1a94bf506..6e5858a46056 100644
--- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/common/AuthenticationClient.java
@@ -1,5 +1,5 @@
-/**
- * Copyright (C) 2016 The Android Open Source Project
+/*
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -11,25 +11,23 @@
* 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.
+ * limitations under the License
*/
-package com.android.server.fingerprint;
+package com.android.server.biometrics.common;
import android.content.Context;
-import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.IBiometricPromptReceiver;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.statusbar.IStatusBarService;
/**
@@ -51,6 +49,7 @@ public abstract class AuthenticationClient extends ClientMonitor {
private Bundle mBundle;
private IStatusBarService mStatusBarService;
private boolean mInLockout;
+ // TODO: BiometricManager, after other biometric modalities are introduced.
private final FingerprintManager mFingerprintManager;
protected boolean mDialogDismissed;
@@ -62,12 +61,12 @@ public abstract class AuthenticationClient extends ClientMonitor {
try {
mDialogReceiverFromClient.onDialogDismissed(reason);
if (reason == BiometricPrompt.DISMISSED_REASON_USER_CANCEL) {
- onError(FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED,
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_USER_CANCELED,
0 /* vendorCode */);
}
mDialogDismissed = true;
} catch (RemoteException e) {
- Slog.e(TAG, "Unable to notify dialog dismissed", e);
+ Slog.e(getLogTag(), "Unable to notify dialog dismissed", e);
}
stop(true /* initiatedByClient */);
}
@@ -85,11 +84,13 @@ public abstract class AuthenticationClient extends ClientMonitor {
*/
public abstract void onStop();
- public AuthenticationClient(Context context, long halDeviceId, IBinder token,
- IFingerprintServiceReceiver receiver, int targetUserId, int groupId, long opId,
+ public AuthenticationClient(Context context, Metrics metrics,
+ BiometricService.DaemonWrapper daemon, long halDeviceId, IBinder token,
+ BiometricService.ServiceListener listener, int targetUserId, int groupId, long opId,
boolean restricted, String owner, Bundle bundle,
IBiometricPromptReceiver dialogReceiver, IStatusBarService statusBarService) {
- super(context, halDeviceId, token, receiver, targetUserId, groupId, restricted, owner);
+ super(context, metrics, daemon, halDeviceId, token, listener, targetUserId, groupId,
+ restricted, owner);
mOpId = opId;
mBundle = bundle;
mDialogReceiverFromClient = dialogReceiver;
@@ -112,17 +113,17 @@ public abstract class AuthenticationClient extends ClientMonitor {
// If the dialog is showing, the client doesn't need to receive onAcquired messages.
if (mBundle != null) {
try {
- if (acquiredInfo != FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) {
+ if (acquiredInfo != BiometricConstants.BIOMETRIC_ACQUIRED_GOOD) {
mStatusBarService.onFingerprintHelp(
mFingerprintManager.getAcquiredString(acquiredInfo, vendorCode));
}
return false; // acquisition continues
} catch (RemoteException e) {
- Slog.e(TAG, "Remote exception when sending acquired message", e);
+ Slog.e(getLogTag(), "Remote exception when sending acquired message", e);
return true; // client failed
} finally {
// Good scans will keep the device awake
- if (acquiredInfo == FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) {
+ if (acquiredInfo == BiometricConstants.BIOMETRIC_ACQUIRED_GOOD) {
notifyUserActivity();
}
}
@@ -132,7 +133,7 @@ public abstract class AuthenticationClient extends ClientMonitor {
}
@Override
- public boolean onError(int error, int vendorCode) {
+ public boolean onError(long deviceId, int error, int vendorCode) {
if (mDialogDismissed) {
// If user cancels authentication, the application has already received the
// FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED message from onDialogDismissed()
@@ -145,10 +146,10 @@ public abstract class AuthenticationClient extends ClientMonitor {
mStatusBarService.onFingerprintError(
mFingerprintManager.getErrorString(error, vendorCode));
} catch (RemoteException e) {
- Slog.e(TAG, "Remote exception when sending error", e);
+ Slog.e(getLogTag(), "Remote exception when sending error", e);
}
}
- return super.onError(error, vendorCode);
+ return super.onError(deviceId, error, vendorCode);
}
@Override
@@ -166,36 +167,35 @@ public abstract class AuthenticationClient extends ClientMonitor {
com.android.internal.R.string.fingerprint_not_recognized));
}
} catch (RemoteException e) {
- Slog.e(TAG, "Failed to notify Authenticated:", e);
+ Slog.e(getLogTag(), "Failed to notify Authenticated:", e);
}
}
- IFingerprintServiceReceiver receiver = getReceiver();
- if (receiver != null) {
+ final BiometricService.ServiceListener listener = getListener();
+ if (listener != null) {
try {
- MetricsLogger.action(getContext(), MetricsEvent.ACTION_FINGERPRINT_AUTH,
- authenticated);
+ mMetricsLogger.action(mMetrics.actionBiometricAuth(), authenticated);
if (!authenticated) {
- receiver.onAuthenticationFailed(getHalDeviceId());
+ listener.onAuthenticationFailed(getHalDeviceId());
} else {
if (DEBUG) {
- Slog.v(TAG, "onAuthenticated(owner=" + getOwnerString()
+ Slog.v(getLogTag(), "onAuthenticated(owner=" + getOwnerString()
+ ", id=" + fingerId + ", gp=" + groupId + ")");
}
Fingerprint fp = !getIsRestricted()
? new Fingerprint("" /* TODO */, groupId, fingerId, getHalDeviceId())
: null;
- receiver.onAuthenticationSucceeded(getHalDeviceId(), fp, getTargetUserId());
+ listener.onAuthenticationSucceeded(getHalDeviceId(), fp, getTargetUserId());
}
} catch (RemoteException e) {
- Slog.w(TAG, "Failed to notify Authenticated:", e);
+ Slog.w(getLogTag(), "Failed to notify Authenticated:", e);
result = true; // client failed
}
} else {
result = true; // client not listening
}
if (!authenticated) {
- if (receiver != null) {
+ if (listener != null) {
vibrateError();
}
// allow system-defined limit of number of attempts before giving up
@@ -203,17 +203,17 @@ public abstract class AuthenticationClient extends ClientMonitor {
if (lockoutMode != LOCKOUT_NONE) {
try {
mInLockout = true;
- Slog.w(TAG, "Forcing lockout (fp driver code should do this!), mode(" +
+ Slog.w(getLogTag(), "Forcing lockout (fp driver code should do this!), mode(" +
lockoutMode + ")");
stop(false);
int errorCode = lockoutMode == LOCKOUT_TIMED ?
- FingerprintManager.FINGERPRINT_ERROR_LOCKOUT :
- FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT;
+ BiometricConstants.BIOMETRIC_ERROR_LOCKOUT :
+ BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT;
// TODO: if the dialog is showing, this error should be delayed. On a similar
// note, AuthenticationClient should override onError and delay all other errors
// as well, if the dialog is showing
- receiver.onError(getHalDeviceId(), errorCode, 0 /* vendorCode */);
+ listener.onError(getHalDeviceId(), errorCode, 0 /* vendorCode */);
// Send the lockout message to the system dialog
if (mBundle != null) {
@@ -221,12 +221,12 @@ public abstract class AuthenticationClient extends ClientMonitor {
mFingerprintManager.getErrorString(errorCode, 0 /* vendorCode */));
}
} catch (RemoteException e) {
- Slog.w(TAG, "Failed to notify lockout:", e);
+ Slog.w(getLogTag(), "Failed to notify lockout:", e);
}
}
result |= lockoutMode != LOCKOUT_NONE; // in a lockout mode
} else {
- if (receiver != null) {
+ if (listener != null) {
vibrateSuccess();
}
result |= true; // we have a valid fingerprint, done
@@ -241,32 +241,28 @@ public abstract class AuthenticationClient extends ClientMonitor {
*/
@Override
public int start() {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "start authentication: no fingerprint HAL!");
- return ERROR_ESRCH;
- }
onStart();
try {
- final int result = daemon.authenticate(mOpId, getGroupId());
+ final int result = getDaemonWrapper().authenticate(mOpId, getGroupId());
if (result != 0) {
- Slog.w(TAG, "startAuthentication failed, result=" + result);
- MetricsLogger.histogram(getContext(), "fingeprintd_auth_start_error", result);
- onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */);
+ Slog.w(getLogTag(), "startAuthentication failed, result=" + result);
+ mMetricsLogger.histogram(mMetrics.tagAuthStartError(), result);
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ 0 /* vendorCode */);
return result;
}
- if (DEBUG) Slog.w(TAG, "client " + getOwnerString() + " is authenticating...");
+ if (DEBUG) Slog.w(getLogTag(), "client " + getOwnerString() + " is authenticating...");
// If authenticating with system dialog, show the dialog
if (mBundle != null) {
try {
mStatusBarService.showFingerprintDialog(mBundle, mDialogReceiver);
} catch (RemoteException e) {
- Slog.e(TAG, "Unable to show fingerprint dialog", e);
+ Slog.e(getLogTag(), "Unable to show fingerprint dialog", e);
}
}
} catch (RemoteException e) {
- Slog.e(TAG, "startAuthentication failed", e);
+ Slog.e(getLogTag(), "startAuthentication failed", e);
return ERROR_ESRCH;
}
return 0; // success
@@ -275,25 +271,21 @@ public abstract class AuthenticationClient extends ClientMonitor {
@Override
public int stop(boolean initiatedByClient) {
if (mAlreadyCancelled) {
- Slog.w(TAG, "stopAuthentication: already cancelled!");
+ Slog.w(getLogTag(), "stopAuthentication: already cancelled!");
return 0;
}
onStop();
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "stopAuthentication: no fingerprint HAL!");
- return ERROR_ESRCH;
- }
+
try {
- final int result = daemon.cancel();
+ final int result = getDaemonWrapper().cancel();
if (result != 0) {
- Slog.w(TAG, "stopAuthentication failed, result=" + result);
+ Slog.w(getLogTag(), "stopAuthentication failed, result=" + result);
return result;
}
- if (DEBUG) Slog.w(TAG, "client " + getOwnerString() + " is no longer authenticating");
+ if (DEBUG) Slog.w(getLogTag(), "client " + getOwnerString() + " is no longer authenticating");
} catch (RemoteException e) {
- Slog.e(TAG, "stopAuthentication failed", e);
+ Slog.e(getLogTag(), "stopAuthentication failed", e);
return ERROR_ESRCH;
} finally {
// If the user already cancelled authentication (via some interaction with the
@@ -304,29 +296,32 @@ public abstract class AuthenticationClient extends ClientMonitor {
try {
mStatusBarService.hideFingerprintDialog();
} catch (RemoteException e) {
- Slog.e(TAG, "Unable to hide fingerprint dialog", e);
+ Slog.e(getLogTag(), "Unable to hide fingerprint dialog", e);
}
}
}
+
mAlreadyCancelled = true;
return 0; // success
}
@Override
- public boolean onEnrollResult(int fingerId, int groupId, int remaining) {
- if (DEBUG) Slog.w(TAG, "onEnrollResult() called for authenticate!");
+ public boolean onEnrollResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ if (DEBUG) Slog.w(getLogTag(), "onEnrollResult() called for authenticate!");
return true; // Invalid for Authenticate
}
@Override
- public boolean onRemoved(int fingerId, int groupId, int remaining) {
- if (DEBUG) Slog.w(TAG, "onRemoved() called for authenticate!");
+ public boolean onRemoved(BiometricAuthenticator.Identifier identifier, int remaining) {
+ if (DEBUG) Slog.w(getLogTag(), "onRemoved() called for authenticate!");
return true; // Invalid for Authenticate
}
@Override
- public boolean onEnumerationResult(int fingerId, int groupId, int remaining) {
- if (DEBUG) Slog.w(TAG, "onEnumerationResult() called for authenticate!");
+ public boolean onEnumerationResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ if (DEBUG) Slog.w(getLogTag(), "onEnumerationResult() called for authenticate!");
return true; // Invalid for Authenticate
}
}
diff --git a/services/core/java/com/android/server/biometrics/common/BiometricService.java b/services/core/java/com/android/server/biometrics/common/BiometricService.java
new file mode 100644
index 000000000000..41b15751b26c
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/common/BiometricService.java
@@ -0,0 +1,1099 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.common;
+
+import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE;
+
+import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
+import android.app.AlarmManager;
+import android.app.AppOpsManager;
+import android.app.IActivityTaskManager;
+import android.app.PendingIntent;
+import android.app.SynchronousUserSwitchObserver;
+import android.app.TaskStackListener;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.IBiometricPromptReceiver;
+import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
+import android.hardware.fingerprint.Fingerprint;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.DeadObjectException;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.IHwBinder;
+import android.os.IRemoteCallback;
+import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.security.KeyStore;
+import android.util.Slog;
+import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.server.SystemService;
+import com.android.server.biometrics.face.FaceService;
+import com.android.server.biometrics.fingerprint.FingerprintService;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Abstract base class containing all of the business logic for biometric services, e.g.
+ * Fingerprint, Face, Iris.
+ *
+ * @hide
+ */
+public abstract class BiometricService extends SystemService implements IHwBinder.DeathRecipient {
+
+ protected static final boolean DEBUG = true;
+
+ private static final String KEY_LOCKOUT_RESET_USER = "lockout_reset_user";
+ private static final int MSG_USER_SWITCHING = 10;
+ private static final long FAIL_LOCKOUT_TIMEOUT_MS = 30 * 1000;
+ private static final long CANCEL_TIMEOUT_LIMIT = 3000; // max wait for onCancel() from HAL,in ms
+
+ private final Context mContext;
+ private final String mKeyguardPackage;
+ private final AppOpsManager mAppOps;
+ private final SparseBooleanArray mTimedLockoutCleared;
+ private final SparseIntArray mFailedAttempts;
+ private final IActivityTaskManager mActivityTaskManager;
+ private final AlarmManager mAlarmManager;
+ private final PowerManager mPowerManager;
+ private final UserManager mUserManager;
+ private final MetricsLogger mMetricsLogger;
+ private final BiometricTaskStackListener mTaskStackListener = new BiometricTaskStackListener();
+ private final ResetClientStateRunnable mResetClientState = new ResetClientStateRunnable();
+ private final LockoutReceiver mLockoutReceiver = new LockoutReceiver();
+ private final ArrayList<LockoutResetMonitor> mLockoutMonitors = new ArrayList<>();
+
+ protected final Map<Integer, Long> mAuthenticatorIds =
+ Collections.synchronizedMap(new HashMap<>());
+ protected final ResetFailedAttemptsForUserRunnable mResetFailedAttemptsForCurrentUserRunnable =
+ new ResetFailedAttemptsForUserRunnable();
+ protected final H mHandler = new H();
+
+ private ClientMonitor mCurrentClient;
+ private ClientMonitor mPendingClient;
+ private PerformanceStats mPerformanceStats;
+ protected int mCurrentUserId = UserHandle.USER_NULL;
+ // Normal authentications are tracked by mPerformanceMap.
+ protected HashMap<Integer, PerformanceStats> mPerformanceMap = new HashMap<>();
+ // Transactions that make use of CryptoObjects are tracked by mCryptoPerformaceMap.
+ protected HashMap<Integer, PerformanceStats> mCryptoPerformanceMap = new HashMap<>();
+
+ protected class PerformanceStats {
+ public int accept; // number of accepted biometrics
+ public int reject; // number of rejected biometrics
+ public int acquire; // total number of acquisitions. Should be >= accept+reject due to poor
+ // image acquisition in some cases (too fast, too slow, dirty sensor, etc.)
+ public int lockout; // total number of lockouts
+ public int permanentLockout; // total number of permanent lockouts
+ }
+
+ /**
+ * @return the log tag.
+ */
+ protected abstract String getTag();
+
+ /**
+ * @return the biometric utilities for a specific implementation.
+ */
+ protected abstract BiometricUtils getBiometricUtils();
+
+ /**
+ * @return the number of failed attempts after which the user will be temporarily locked out
+ * from using the biometric. A strong auth (pin/pattern/pass) clears this counter.
+ */
+ protected abstract int getFailedAttemptsLockoutTimed();
+
+ /**
+ * @return the number of failed attempts after which the user will be permanently locked out
+ * from using the biometric. A strong auth (pin/pattern/pass) clears this counter.
+ */
+ protected abstract int getFailedAttemptsLockoutPermanent();
+
+ /**
+ * @return the metrics constants for a biometric implementation.
+ */
+ protected abstract Metrics getMetrics();
+
+ /**
+ * @param userId
+ * @return true if the enrollment limit has been reached.
+ */
+ protected abstract boolean hasReachedEnrollmentLimit(int userId);
+
+ /**
+ * Notifies the HAL that the user has changed.
+ * @param userId
+ * @param clientPackage
+ */
+ protected abstract void updateActiveGroup(int userId, String clientPackage);
+
+ /**
+ * @return The protected intent to reset lockout for a specific biometric.
+ */
+ protected abstract String getLockoutResetIntent();
+
+ /**
+ * @return The permission the sender is required to have in order for the lockout reset intent
+ * to be received by the BiometricService implementation.
+ */
+ protected abstract String getLockoutBroadcastPermission();
+
+ /**
+ * @return The HAL ID.
+ */
+ protected abstract long getHalDeviceId();
+
+ /**
+ * This method is called when the user switches. Implementations should probably notify the
+ * HAL.
+ * @param userId
+ */
+ protected abstract void handleUserSwitching(int userId);
+
+ /**
+ * @param userId
+ * @return Returns true if the user has any enrolled biometrics.
+ */
+ protected abstract boolean hasEnrolledBiometrics(int userId);
+
+ /**
+ * @return Returns the MANAGE_* permission string, which is required for enrollment, removal
+ * etc.
+ */
+ protected abstract String getManageBiometricPermission();
+
+ /**
+ * Checks if the caller has permission to use the biometric service - throws a SecurityException
+ * if not.
+ */
+ protected abstract void checkUseBiometricPermission();
+
+ /**
+ * @return Returns one of the {@link AppOpsManager} constants which pertains to the specific
+ * biometric service.
+ */
+ protected abstract int getAppOp();
+
+
+ /**
+ * Notifies clients of any change in the biometric state (active / idle). This is mainly for
+ * Fingerprint navigation gestures.
+ * @param isActive
+ */
+ protected void notifyClientActiveCallbacks(boolean isActive) {}
+
+ protected class AuthenticationClientImpl extends AuthenticationClient {
+
+ public AuthenticationClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
+ IBinder token, ServiceListener listener, int targetUserId, int groupId, long opId,
+ boolean restricted, String owner, Bundle bundle,
+ IBiometricPromptReceiver dialogReceiver,
+ IStatusBarService statusBarService) {
+ super(context, getMetrics(), daemon, halDeviceId, token, listener,
+ targetUserId, groupId, opId, restricted, owner, bundle, dialogReceiver,
+ statusBarService);
+ }
+
+ @Override
+ public void onStart() {
+ try {
+ mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
+ } catch (RemoteException e) {
+ Slog.e(getTag(), "Could not register task stack listener", e);
+ }
+ }
+
+ @Override
+ public void onStop() {
+ try {
+ mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener);
+ } catch (RemoteException e) {
+ Slog.e(getTag(), "Could not unregister task stack listener", e);
+ }
+ }
+
+ @Override
+ public void resetFailedAttempts() {
+ resetFailedAttemptsForUser(true /* clearAttemptCounter */,
+ ActivityManager.getCurrentUser());
+ }
+
+ @Override
+ public void notifyUserActivity() {
+ userActivity();
+ }
+
+ @Override
+ public int handleFailedAttempt() {
+ final int currentUser = ActivityManager.getCurrentUser();
+ mFailedAttempts.put(currentUser, mFailedAttempts.get(currentUser, 0) + 1);
+ mTimedLockoutCleared.put(ActivityManager.getCurrentUser(), false);
+ final int lockoutMode = getLockoutMode();
+ if (lockoutMode == AuthenticationClient.LOCKOUT_PERMANENT) {
+ mPerformanceStats.permanentLockout++;
+ } else if (lockoutMode == AuthenticationClient.LOCKOUT_TIMED) {
+ mPerformanceStats.lockout++;
+ }
+
+ // Failing multiple times will continue to push out the lockout time
+ if (lockoutMode != AuthenticationClient.LOCKOUT_NONE) {
+ scheduleLockoutResetForUser(currentUser);
+ return lockoutMode;
+ }
+ return AuthenticationClient.LOCKOUT_NONE;
+ }
+ }
+
+ protected class EnrollClientImpl extends EnrollClient {
+
+ public EnrollClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
+ IBinder token, ServiceListener listener, int userId, int groupId,
+ byte[] cryptoToken, boolean restricted, String owner) {
+ super(context, getMetrics(), daemon, halDeviceId, token, listener,
+ userId, groupId, cryptoToken, restricted, owner, getBiometricUtils());
+ }
+
+ @Override
+ public void notifyUserActivity() {
+ userActivity();
+ }
+ }
+
+ protected class RemovalClientImpl extends RemovalClient {
+ private boolean mShouldNotify;
+
+ public RemovalClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
+ IBinder token, ServiceListener listener, int fingerId, int groupId, int userId,
+ boolean restricted, String owner) {
+ super(context, getMetrics(), daemon, halDeviceId, token, listener, fingerId, groupId,
+ userId, restricted, owner, getBiometricUtils());
+ }
+
+ public void setShouldNotifyUserActivity(boolean shouldNotify) {
+ mShouldNotify = shouldNotify;
+ }
+
+ @Override
+ public void notifyUserActivity() {
+ if (mShouldNotify) {
+ userActivity();
+ }
+ }
+ }
+
+ protected class EnumerateClientImpl extends EnumerateClient {
+
+ public EnumerateClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
+ IBinder token, ServiceListener listener, int groupId, int userId,
+ boolean restricted, String owner) {
+ super(context, getMetrics(), daemon, halDeviceId, token, listener, groupId, userId,
+ restricted, owner);
+ }
+
+ @Override
+ public void notifyUserActivity() {
+ userActivity();
+ }
+ }
+
+ /**
+ * Wraps the callback interface from Service -> Manager
+ */
+ protected interface ServiceListener {
+ void onEnrollResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) throws RemoteException;
+
+ void onAcquired(long deviceId, int acquiredInfo, int vendorCode)
+ throws RemoteException;
+
+ void onAuthenticationSucceeded(long deviceId,
+ BiometricAuthenticator.Identifier biometric, int userId)
+ throws RemoteException;
+
+ void onAuthenticationFailed(long deviceId)
+ throws RemoteException;
+
+ void onError(long deviceId, int error, int vendorCode)
+ throws RemoteException;
+
+ void onRemoved(BiometricAuthenticator.Identifier identifier,
+ int remaining) throws RemoteException;
+
+ void onEnumerated(BiometricAuthenticator.Identifier identifier,
+ int remaining) throws RemoteException;
+ }
+
+ /**
+ * Wraps a portion of the interface from Service -> Daemon that is used by the ClientMonitor
+ * subclasses.
+ */
+ protected interface DaemonWrapper {
+ int ERROR_ESRCH = 3; // Likely fingerprint HAL is dead. see errno.h.
+ int authenticate(long operationId, int groupId) throws RemoteException;
+ int cancel() throws RemoteException;
+ int remove(int groupId, int biometricId) throws RemoteException;
+ int enumerate() throws RemoteException;
+ int enroll(byte[] cryptoToken, int groupId, int timeout) throws RemoteException;
+ }
+
+ /**
+ * Handler which all subclasses should post events to.
+ */
+ protected final class H extends Handler {
+ @Override
+ public void handleMessage(android.os.Message msg) {
+ switch (msg.what) {
+ case MSG_USER_SWITCHING:
+ handleUserSwitching(msg.arg1);
+ break;
+
+ default:
+ Slog.w(getTag(), "Unknown message:" + msg.what);
+ }
+ }
+ }
+
+ private final class BiometricTaskStackListener extends TaskStackListener {
+ @Override
+ public void onTaskStackChanged() {
+ try {
+ if (!(mCurrentClient instanceof AuthenticationClient)) {
+ return;
+ }
+ final String currentClient = mCurrentClient.getOwnerString();
+ if (isKeyguard(currentClient)) {
+ return; // Keyguard is always allowed
+ }
+ List<ActivityManager.RunningTaskInfo> runningTasks =
+ mActivityTaskManager.getTasks(1);
+ if (!runningTasks.isEmpty()) {
+ final String topPackage = runningTasks.get(0).topActivity.getPackageName();
+ if (!topPackage.contentEquals(currentClient)) {
+ Slog.e(getTag(), "Stopping background authentication, top: " + topPackage
+ + " currentClient: " + currentClient);
+ mCurrentClient.stop(false /* initiatedByClient */);
+ }
+ }
+ } catch (RemoteException e) {
+ Slog.e(getTag(), "Unable to get running tasks", e);
+ }
+ }
+ }
+
+ private final class ResetClientStateRunnable implements Runnable {
+ @Override
+ public void run() {
+ /**
+ * Warning: if we get here, the driver never confirmed our call to cancel the current
+ * operation (authenticate, enroll, remove, enumerate, etc), which is
+ * really bad. The result will be a 3-second delay in starting each new client.
+ * If you see this on a device, make certain the driver notifies with
+ * {@link BiometricConstants#BIOMETRIC_ERROR_CANCELED} in response to cancel()
+ * once it has successfully switched to the IDLE state in the HAL.
+ * Additionally,{@link BiometricConstants#BIOMETRIC_ERROR_CANCELED} should only be sent
+ * in response to an actual cancel() call.
+ */
+ Slog.w(getTag(), "Client "
+ + (mCurrentClient != null ? mCurrentClient.getOwnerString() : "null")
+ + " failed to respond to cancel, starting client "
+ + (mPendingClient != null ? mPendingClient.getOwnerString() : "null"));
+
+ mCurrentClient = null;
+ startClient(mPendingClient, false);
+ }
+ }
+
+ private final class LockoutReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Slog.v(getTag(), "Resetting lockout: " + intent.getAction());
+ if (getLockoutResetIntent().equals(intent.getAction())) {
+ final int user = intent.getIntExtra(KEY_LOCKOUT_RESET_USER, 0);
+ resetFailedAttemptsForUser(false /* clearAttemptCounter */, user);
+ }
+ }
+ }
+
+ private final class ResetFailedAttemptsForUserRunnable implements Runnable {
+ @Override
+ public void run() {
+ resetFailedAttemptsForUser(true /* clearAttemptCounter */,
+ ActivityManager.getCurrentUser());
+ }
+ }
+
+ private final class LockoutResetMonitor implements IBinder.DeathRecipient {
+ private static final long WAKELOCK_TIMEOUT_MS = 2000;
+ private final IBiometricServiceLockoutResetCallback mCallback;
+ private final PowerManager.WakeLock mWakeLock;
+
+ public LockoutResetMonitor(IBiometricServiceLockoutResetCallback callback) {
+ mCallback = callback;
+ mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+ "lockout reset callback");
+ try {
+ mCallback.asBinder().linkToDeath(LockoutResetMonitor.this, 0);
+ } catch (RemoteException e) {
+ Slog.w(getTag(), "caught remote exception in linkToDeath", e);
+ }
+ }
+
+ public void sendLockoutReset() {
+ if (mCallback != null) {
+ try {
+ mWakeLock.acquire(WAKELOCK_TIMEOUT_MS);
+ mCallback.onLockoutReset(getHalDeviceId(), new IRemoteCallback.Stub() {
+ @Override
+ public void sendResult(Bundle data) throws RemoteException {
+ releaseWakelock();
+ }
+ });
+ } catch (DeadObjectException e) {
+ Slog.w(getTag(), "Death object while invoking onLockoutReset: ", e);
+ mHandler.post(mRemoveCallbackRunnable);
+ } catch (RemoteException e) {
+ Slog.w(getTag(), "Failed to invoke onLockoutReset: ", e);
+ releaseWakelock();
+ }
+ }
+ }
+
+ private final Runnable mRemoveCallbackRunnable = new Runnable() {
+ @Override
+ public void run() {
+ releaseWakelock();
+ removeLockoutResetCallback(LockoutResetMonitor.this);
+ }
+ };
+
+ @Override
+ public void binderDied() {
+ Slog.e(getTag(), "Lockout reset callback binder died");
+ mHandler.post(mRemoveCallbackRunnable);
+ }
+
+ private void releaseWakelock() {
+ if (mWakeLock.isHeld()) {
+ mWakeLock.release();
+ }
+ }
+ }
+
+ /**
+ * Initializes the system service.
+ * <p>
+ * Subclasses must define a single argument constructor that accepts the context
+ * and passes it to super.
+ * </p>
+ *
+ * @param context The system server context.
+ */
+ public BiometricService(Context context) {
+ super(context);
+ mContext = context;
+ mKeyguardPackage = ComponentName.unflattenFromString(context.getResources().getString(
+ com.android.internal.R.string.config_keyguardComponent)).getPackageName();
+ mAppOps = context.getSystemService(AppOpsManager.class);
+ mTimedLockoutCleared = new SparseBooleanArray();
+ mFailedAttempts = new SparseIntArray();
+ mActivityTaskManager = ((ActivityTaskManager) context.getSystemService(
+ Context.ACTIVITY_TASK_SERVICE)).getService();
+ mPowerManager = mContext.getSystemService(PowerManager.class);
+ mAlarmManager = mContext.getSystemService(AlarmManager.class);
+ mUserManager = UserManager.get(mContext);
+ mMetricsLogger = new MetricsLogger();
+ mContext.registerReceiver(mLockoutReceiver, new IntentFilter(getLockoutResetIntent()),
+ getLockoutBroadcastPermission(), null /* handler */);
+ }
+
+ @Override
+ public void onStart() {
+ listenForUserSwitches();
+ }
+
+ @Override
+ public void serviceDied(long cookie) {
+ Slog.e(getTag(), "HAL died");
+ mMetricsLogger.count(getMetrics().tagHalDied(), 1);
+ handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ 0 /*vendorCode */);
+ }
+
+ protected ClientMonitor getCurrentClient() {
+ return mCurrentClient;
+ }
+
+ protected ClientMonitor getPendingClient() {
+ return mPendingClient;
+ }
+
+ /**
+ * Callback handlers from the daemon. The caller must put this on a handler.
+ */
+
+ protected void handleAcquired(long deviceId, int acquiredInfo, int vendorCode) {
+ ClientMonitor client = mCurrentClient;
+ if (client != null && client.onAcquired(acquiredInfo, vendorCode)) {
+ removeClient(client);
+ }
+ if (mPerformanceStats != null && getLockoutMode() == AuthenticationClient.LOCKOUT_NONE
+ && client instanceof AuthenticationClient) {
+ // ignore enrollment acquisitions or acquisitions when we're locked out
+ mPerformanceStats.acquire++;
+ }
+ }
+
+ protected void handleAuthenticated(long deviceId, int biometricId, int groupId,
+ ArrayList<Byte> token) {
+ ClientMonitor client = mCurrentClient;
+ if (biometricId != 0) {
+ final byte[] byteToken = new byte[token.size()];
+ for (int i = 0; i < token.size(); i++) {
+ byteToken[i] = token.get(i);
+ }
+ KeyStore.getInstance().addAuthToken(byteToken);
+ }
+ if (client != null && client.onAuthenticated(biometricId, groupId)) {
+ removeClient(client);
+ }
+ if (biometricId != 0) {
+ mPerformanceStats.accept++;
+ } else {
+ mPerformanceStats.reject++;
+ }
+ }
+
+ protected void handleEnrollResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ ClientMonitor client = mCurrentClient;
+ if (client != null && client.onEnrollResult(identifier, remaining)) {
+ removeClient(client);
+ // When enrollment finishes, update this group's authenticator id, as the HAL has
+ // already generated a new authenticator id when the new biometric is enrolled.
+ if (identifier instanceof Fingerprint) {
+ updateActiveGroup(((Fingerprint)identifier).getGroupId(), null);
+ } else {
+ updateActiveGroup(mCurrentUserId, null);
+ }
+
+ }
+ }
+
+ protected void handleError(long deviceId, int error, int vendorCode) {
+ final ClientMonitor client = mCurrentClient;
+
+ if (DEBUG) Slog.v(getTag(), "handleError(client="
+ + (client != null ? client.getOwnerString() : "null") + ", error = " + error + ")");
+
+ if (client != null && client.onError(deviceId, error, vendorCode)) {
+ removeClient(client);
+ }
+
+ if (error == BiometricConstants.BIOMETRIC_ERROR_CANCELED) {
+ mHandler.removeCallbacks(mResetClientState);
+ if (mPendingClient != null) {
+ if (DEBUG) Slog.v(getTag(), "start pending client " + mPendingClient.getOwnerString());
+ startClient(mPendingClient, false);
+ mPendingClient = null;
+ }
+ }
+ }
+
+ protected void handleRemoved(BiometricAuthenticator.Identifier identifier,
+ final int remaining) {
+ if (DEBUG) Slog.w(getTag(), "Removed: fid=" + identifier.getBiometricId()
+ + ", dev=" + identifier.getDeviceId()
+ + ", rem=" + remaining);
+
+ ClientMonitor client = mCurrentClient;
+ if (client != null && client.onRemoved(identifier, remaining)) {
+ removeClient(client);
+ // When the last biometric of a group is removed, update the authenticator id
+ int userId = mCurrentUserId;
+ if (identifier instanceof Fingerprint) {
+ userId = ((Fingerprint) identifier).getGroupId();
+ }
+ if (!hasEnrolledBiometrics(userId)) {
+ updateActiveGroup(userId, null);
+ }
+ }
+ }
+
+ /**
+ * Calls from the Manager. These are still on the calling binder's thread.
+ */
+
+ protected void enrollInternal(EnrollClientImpl client, int userId) {
+ if (hasReachedEnrollmentLimit(userId)) {
+ return;
+ }
+
+ // Group ID is arbitrarily set to parent profile user ID. It just represents
+ // the default biometrics for the user.
+ if (!isCurrentUserOrProfile(userId)) {
+ return;
+ }
+
+ mHandler.post(() -> {
+ startClient(client, true /* initiatedByClient */);
+ });
+ }
+
+ protected void cancelEnrollmentInternal(IBinder token) {
+ mHandler.post(() -> {
+ ClientMonitor client = mCurrentClient;
+ if (client instanceof EnrollClient && client.getToken() == token) {
+ client.stop(client.getToken() == token);
+ }
+ });
+ }
+
+ protected void authenticateInternal(AuthenticationClientImpl client, long opId,
+ String opPackageName) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingPid = Binder.getCallingPid();
+ final int callingUserId = UserHandle.getCallingUserId();
+
+ if (!canUseBiometric(opPackageName, true /* foregroundOnly */, callingUid, callingPid,
+ callingUserId)) {
+ if (DEBUG) Slog.v(getTag(), "authenticate(): reject " + opPackageName);
+ return;
+ }
+
+ mHandler.post(() -> {
+ mMetricsLogger.histogram(getMetrics().tagAuthToken(), opId != 0L ? 1 : 0);
+
+ // Get performance stats object for this user.
+ HashMap<Integer, PerformanceStats> pmap
+ = (opId == 0) ? mPerformanceMap : mCryptoPerformanceMap;
+ PerformanceStats stats = pmap.get(mCurrentUserId);
+ if (stats == null) {
+ stats = new PerformanceStats();
+ pmap.put(mCurrentUserId, stats);
+ }
+ mPerformanceStats = stats;
+
+ startAuthentication(client, opPackageName);
+ });
+ }
+
+ protected void cancelAuthenticationInternal(final IBinder token, final String opPackageName) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingPid = Binder.getCallingPid();
+ final int callingUserId = UserHandle.getCallingUserId();
+
+ if (!canUseBiometric(opPackageName, true /* foregroundOnly */, callingUid, callingPid,
+ callingUserId)) {
+ if (DEBUG) Slog.v(getTag(), "cancelAuthentication(): reject " + opPackageName);
+ return;
+ }
+
+ mHandler.post(() -> {
+ ClientMonitor client = mCurrentClient;
+ if (client instanceof AuthenticationClient) {
+ if (client.getToken() == token) {
+ if (DEBUG) Slog.v(getTag(), "stop client " + client.getOwnerString());
+ client.stop(client.getToken() == token);
+ } else {
+ if (DEBUG) Slog.v(getTag(), "can't stop client "
+ + client.getOwnerString() + " since tokens don't match");
+ }
+ } else if (client != null) {
+ if (DEBUG) Slog.v(getTag(), "can't cancel non-authenticating client "
+ + client.getOwnerString());
+ }
+ });
+ }
+
+ protected void setActiveUserInternal(int userId) {
+ mHandler.post(() -> {
+ updateActiveGroup(userId, null /* clientPackage */);
+ });
+ }
+
+ protected void removeInternal(RemovalClientImpl client) {
+ mHandler.post(() -> {
+ startClient(client, true /* initiatedByClient */);
+ });
+ }
+
+ protected void enumerateInternal(EnumerateClientImpl client) {
+ mHandler.post(() -> {
+ startClient(client, true /* initiatedByClient */);
+ });
+ }
+
+ // Should be done on a handler thread - not on the Binder's thread.
+ private void startAuthentication(AuthenticationClientImpl client, String opPackageName) {
+ updateActiveGroup(client.getGroupId(), opPackageName);
+
+ if (DEBUG) Slog.v(getTag(), "startAuthentication(" + opPackageName + ")");
+
+ int lockoutMode = getLockoutMode();
+ if (lockoutMode != AuthenticationClient.LOCKOUT_NONE) {
+ Slog.v(getTag(), "In lockout mode(" + lockoutMode +
+ ") ; disallowing authentication");
+ int errorCode = lockoutMode == AuthenticationClient.LOCKOUT_TIMED ?
+ BiometricConstants.BIOMETRIC_ERROR_LOCKOUT :
+ BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT;
+ if (!client.onError(getHalDeviceId(), errorCode, 0 /* vendorCode */)) {
+ Slog.w(getTag(), "Cannot send permanent lockout message to client");
+ }
+ return;
+ }
+ startClient(client, true /* initiatedByClient */);
+ }
+
+ protected void addLockoutResetCallback(IBiometricServiceLockoutResetCallback callback) {
+ mHandler.post(() -> {
+ final LockoutResetMonitor monitor = new LockoutResetMonitor(callback);
+ if (!mLockoutMonitors.contains(monitor)) {
+ mLockoutMonitors.add(monitor);
+ }
+ });
+ }
+
+ /**
+ * Helper methods.
+ */
+
+ /**
+ * @param opPackageName name of package for caller
+ * @param requireForeground only allow this call while app is in the foreground
+ * @return true if caller can use the biometric API
+ */
+ protected boolean canUseBiometric(String opPackageName, boolean requireForeground, int uid,
+ int pid, int userId) {
+ checkUseBiometricPermission();
+
+ if (isKeyguard(opPackageName)) {
+ return true; // Keyguard is always allowed
+ }
+ if (!isCurrentUserOrProfile(userId)) {
+ Slog.w(getTag(), "Rejecting " + opPackageName + "; not a current user or profile");
+ return false;
+ }
+ if (mAppOps.noteOp(getAppOp(), uid, opPackageName) != AppOpsManager.MODE_ALLOWED) {
+ Slog.w(getTag(), "Rejecting " + opPackageName + "; permission denied");
+ return false;
+ }
+ if (requireForeground && !(isForegroundActivity(uid, pid) || isCurrentClient(
+ opPackageName))) {
+ Slog.w(getTag(), "Rejecting " + opPackageName + "; not in foreground");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @param opPackageName package of the caller
+ * @return true if this is the same client currently using the biometric
+ */
+ private boolean isCurrentClient(String opPackageName) {
+ return mCurrentClient != null && mCurrentClient.getOwnerString().equals(opPackageName);
+ }
+
+ /**
+ * @return true if this is keyguard package
+ */
+ private boolean isKeyguard(String clientPackage) {
+ return mKeyguardPackage.equals(clientPackage);
+ }
+
+ private int getLockoutMode() {
+ final int currentUser = ActivityManager.getCurrentUser();
+ final int failedAttempts = mFailedAttempts.get(currentUser, 0);
+ if (failedAttempts >= getFailedAttemptsLockoutPermanent()) {
+ return AuthenticationClient.LOCKOUT_PERMANENT;
+ } else if (failedAttempts > 0 &&
+ mTimedLockoutCleared.get(currentUser, false) == false
+ && (failedAttempts % getFailedAttemptsLockoutTimed() == 0)) {
+ return AuthenticationClient.LOCKOUT_TIMED;
+ }
+ return AuthenticationClient.LOCKOUT_NONE;
+ }
+
+ private boolean isForegroundActivity(int uid, int pid) {
+ try {
+ List<ActivityManager.RunningAppProcessInfo> procs =
+ ActivityManager.getService().getRunningAppProcesses();
+ int N = procs.size();
+ for (int i = 0; i < N; i++) {
+ ActivityManager.RunningAppProcessInfo proc = procs.get(i);
+ if (proc.pid == pid && proc.uid == uid
+ && proc.importance <= IMPORTANCE_FOREGROUND_SERVICE) {
+ return true;
+ }
+ }
+ } catch (RemoteException e) {
+ Slog.w(getTag(), "am.getRunningAppProcesses() failed");
+ }
+ return false;
+ }
+
+ /**
+ * Calls the HAL to switch states to the new task. If there's already a current task,
+ * it calls cancel() and sets mPendingClient to begin when the current task finishes
+ * ({@link BiometricConstants#BIOMETRIC_ERROR_CANCELED}).
+ *
+ * @param newClient the new client that wants to connect
+ * @param initiatedByClient true for authenticate, remove and enroll
+ */
+ private void startClient(ClientMonitor newClient, boolean initiatedByClient) {
+ ClientMonitor currentClient = mCurrentClient;
+ if (currentClient != null) {
+ if (DEBUG) Slog.v(getTag(), "request stop current client " +
+ currentClient.getOwnerString());
+
+ // This check only matters for FingerprintService, since enumerate may call back
+ // multiple times.
+ if (currentClient instanceof FingerprintService.EnumerateClientImpl ||
+ currentClient instanceof FingerprintService.RemovalClientImpl) {
+ // This condition means we're currently running internal diagnostics to
+ // remove extra fingerprints in the hardware and/or the software
+ // TODO: design an escape hatch in case client never finishes
+ if (newClient != null) {
+ Slog.w(getTag(), "Internal cleanup in progress but trying to start client "
+ + newClient.getClass().getSuperclass().getSimpleName()
+ + "(" + newClient.getOwnerString() + ")"
+ + ", initiatedByClient = " + initiatedByClient);
+ }
+ } else {
+ currentClient.stop(initiatedByClient);
+ }
+ mPendingClient = newClient;
+ mHandler.removeCallbacks(mResetClientState);
+ mHandler.postDelayed(mResetClientState, CANCEL_TIMEOUT_LIMIT);
+ } else if (newClient != null) {
+ mCurrentClient = newClient;
+ if (DEBUG) Slog.v(getTag(), "starting client "
+ + newClient.getClass().getSuperclass().getSimpleName()
+ + "(" + newClient.getOwnerString() + ")"
+ + ", initiatedByClient = " + initiatedByClient);
+ notifyClientActiveCallbacks(true);
+
+ newClient.start();
+ }
+ }
+
+ protected void removeClient(ClientMonitor client) {
+ if (client != null) {
+ client.destroy();
+ if (client != mCurrentClient && mCurrentClient != null) {
+ Slog.w(getTag(), "Unexpected client: " + client.getOwnerString() + "expected: "
+ + mCurrentClient.getOwnerString());
+ }
+ }
+ if (mCurrentClient != null) {
+ if (DEBUG) Slog.v(getTag(), "Done with client: " + client.getOwnerString());
+ mCurrentClient = null;
+ }
+ if (mPendingClient == null) {
+ notifyClientActiveCallbacks(false);
+ }
+ }
+
+ /**
+ * Populates existing authenticator ids. To be used only during the start of the service.
+ */
+ protected void loadAuthenticatorIds() {
+ // This operation can be expensive, so keep track of the elapsed time. Might need to move to
+ // background if it takes too long.
+ long t = System.currentTimeMillis();
+ mAuthenticatorIds.clear();
+ for (UserInfo user : UserManager.get(getContext()).getUsers(true /* excludeDying */)) {
+ int userId = getUserOrWorkProfileId(null, user.id);
+ if (!mAuthenticatorIds.containsKey(userId)) {
+ updateActiveGroup(userId, null);
+ }
+ }
+
+ t = System.currentTimeMillis() - t;
+ if (t > 1000) {
+ Slog.w(getTag(), "loadAuthenticatorIds() taking too long: " + t + "ms");
+ }
+ }
+
+ /**
+ * @param clientPackage the package of the caller
+ * @return the profile id
+ */
+ protected int getUserOrWorkProfileId(String clientPackage, int userId) {
+ if (!isKeyguard(clientPackage) && isWorkProfile(userId)) {
+ return userId;
+ }
+ return getEffectiveUserId(userId);
+ }
+
+ protected boolean isRestricted() {
+ // Only give privileged apps (like Settings) access to biometric info
+ final boolean restricted = !hasPermission(getManageBiometricPermission());
+ return restricted;
+ }
+
+ protected boolean hasPermission(String permission) {
+ return getContext().checkCallingOrSelfPermission(permission)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
+ protected void checkPermission(String permission) {
+ getContext().enforceCallingOrSelfPermission(permission,
+ "Must have " + permission + " permission.");
+ }
+
+ protected boolean isCurrentUserOrProfile(int userId) {
+ UserManager um = UserManager.get(mContext);
+ if (um == null) {
+ Slog.e(getTag(), "Unable to acquire UserManager");
+ return false;
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ // Allow current user or profiles of the current user...
+ for (int profileId : um.getEnabledProfileIds(ActivityManager.getCurrentUser())) {
+ if (profileId == userId) {
+ return true;
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
+ return false;
+ }
+
+ /***
+ * @param opPackageName the name of the calling package
+ * @return authenticator id for the calling user
+ */
+ protected long getAuthenticatorId(String opPackageName) {
+ final int userId = getUserOrWorkProfileId(opPackageName, UserHandle.getCallingUserId());
+ return mAuthenticatorIds.getOrDefault(userId, 0L);
+ }
+
+ private void scheduleLockoutResetForUser(int userId) {
+ mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ SystemClock.elapsedRealtime() + FAIL_LOCKOUT_TIMEOUT_MS,
+ getLockoutResetIntentForUser(userId));
+ }
+
+ private PendingIntent getLockoutResetIntentForUser(int userId) {
+ return PendingIntent.getBroadcast(mContext, userId,
+ new Intent(getLockoutResetIntent()).putExtra(KEY_LOCKOUT_RESET_USER, userId),
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ private void userActivity() {
+ long now = SystemClock.uptimeMillis();
+ mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+ }
+
+ /**
+ * @param userId
+ * @return true if this is a work profile
+ */
+ private boolean isWorkProfile(int userId) {
+ UserInfo userInfo = null;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ userInfo = mUserManager.getUserInfo(userId);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return userInfo != null && userInfo.isManagedProfile();
+ }
+
+
+ private int getEffectiveUserId(int userId) {
+ UserManager um = UserManager.get(mContext);
+ if (um != null) {
+ final long callingIdentity = Binder.clearCallingIdentity();
+ userId = um.getCredentialOwnerProfile(userId);
+ Binder.restoreCallingIdentity(callingIdentity);
+ } else {
+ Slog.e(getTag(), "Unable to acquire UserManager");
+ }
+ return userId;
+ }
+
+ // Attempt counter should only be cleared when Keyguard goes away or when
+ // a biometric is successfully authenticated.
+ private void resetFailedAttemptsForUser(boolean clearAttemptCounter, int userId) {
+ if (DEBUG && getLockoutMode() != AuthenticationClient.LOCKOUT_NONE) {
+ Slog.v(getTag(), "Reset biometric lockout, clearAttemptCounter=" + clearAttemptCounter);
+ }
+ if (clearAttemptCounter) {
+ mFailedAttempts.put(userId, 0);
+ }
+ mTimedLockoutCleared.put(userId, true);
+ // If we're asked to reset failed attempts externally (i.e. from Keyguard),
+ // the alarm might still be pending; remove it.
+ cancelLockoutResetForUser(userId);
+ notifyLockoutResetMonitors();
+ }
+
+ private void cancelLockoutResetForUser(int userId) {
+ mAlarmManager.cancel(getLockoutResetIntentForUser(userId));
+ }
+
+ private void listenForUserSwitches() {
+ try {
+ ActivityManager.getService().registerUserSwitchObserver(
+ new SynchronousUserSwitchObserver() {
+ @Override
+ public void onUserSwitching(int newUserId) throws RemoteException {
+ mHandler.obtainMessage(MSG_USER_SWITCHING, newUserId, 0 /* unused */)
+ .sendToTarget();
+ }
+ }, getTag());
+ } catch (RemoteException e) {
+ Slog.w(getTag(), "Failed to listen for user switching event" ,e);
+ }
+ }
+
+ private void notifyLockoutResetMonitors() {
+ for (int i = 0; i < mLockoutMonitors.size(); i++) {
+ mLockoutMonitors.get(i).sendLockoutReset();
+ }
+ }
+
+ private void removeLockoutResetCallback(
+ LockoutResetMonitor monitor) {
+ mLockoutMonitors.remove(monitor);
+ }
+} \ No newline at end of file
diff --git a/services/core/java/com/android/server/biometrics/common/BiometricUserState.java b/services/core/java/com/android/server/biometrics/common/BiometricUserState.java
new file mode 100644
index 000000000000..53eaac0670a4
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/common/BiometricUserState.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.common;
+
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.os.AsyncTask;
+import android.os.Environment;
+import android.util.Slog;
+import android.util.Xml;
+
+import com.android.internal.annotations.GuardedBy;
+
+import libcore.io.IoUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Abstract base class for managing biometrics per user across device reboots.
+ * @hide
+ */
+public abstract class BiometricUserState<T extends BiometricAuthenticator.Identifier> {
+ private static final String TAG = "UserState";
+
+ @GuardedBy("this")
+ protected final ArrayList<T> mBiometrics = new ArrayList<>();
+ protected final Context mContext;
+ protected final File mFile;
+
+ private final Runnable mWriteStateRunnable = new Runnable() {
+ @Override
+ public void run() {
+ doWriteState();
+ }
+ };
+
+ /**
+ * @return The tag for the biometrics. There may be multiple instances of a biometric within.
+ */
+ protected abstract String getBiometricsTag();
+
+ /**
+ * @return The file where the biometric metadata should be stored.
+ */
+ protected abstract String getBiometricFile();
+
+ /**
+ * @return The resource for the name template, this is used to generate the default name.
+ */
+ protected abstract int getNameTemplateResource();
+
+ /**
+ * @return A copy of the list.
+ */
+ protected abstract ArrayList<T> getCopy(ArrayList<T> array);
+
+ /**
+ * @return Writes the cached data to persistent storage.
+ */
+ protected abstract void doWriteState();
+
+ /**
+ * @return
+ */
+ protected abstract void parseBiometricsLocked(XmlPullParser parser)
+ throws IOException, XmlPullParserException;
+
+
+ public BiometricUserState(Context context, int userId) {
+ mFile = getFileForUser(userId);
+ mContext = context;
+ synchronized (this) {
+ readStateSyncLocked();
+ }
+ }
+
+ public void addBiometric(T identifier) {
+ synchronized (this) {
+ mBiometrics.add(identifier);
+ scheduleWriteStateLocked();
+ }
+ }
+
+ public void removeBiometric(int biometricId) {
+ synchronized (this) {
+ for (int i = 0; i < mBiometrics.size(); i++) {
+ if (mBiometrics.get(i).getBiometricId() == biometricId) {
+ mBiometrics.remove(i);
+ scheduleWriteStateLocked();
+ break;
+ }
+ }
+ }
+ }
+
+ public void renameBiometric(int biometricId, CharSequence name) {
+ synchronized (this) {
+ for (int i = 0; i < mBiometrics.size(); i++) {
+ if (mBiometrics.get(i).getBiometricId() == biometricId) {
+ BiometricAuthenticator.Identifier identifier = mBiometrics.get(i);
+ identifier.setName(name);
+ scheduleWriteStateLocked();
+ break;
+ }
+ }
+ }
+ }
+
+ public List<T> getBiometrics() {
+ synchronized (this) {
+ return getCopy(mBiometrics);
+ }
+ }
+
+ /**
+ * Finds a unique name for the given fingerprint
+ * @return unique name
+ */
+ public String getUniqueName() {
+ int guess = 1;
+ while (true) {
+ // Not the most efficient algorithm in the world, but there shouldn't be more than 10
+ String name = mContext.getString(getNameTemplateResource(), guess);
+ if (isUnique(name)) {
+ return name;
+ }
+ guess++;
+ }
+ }
+
+ private boolean isUnique(String name) {
+ for (T identifier : mBiometrics) {
+ if (identifier.getName().equals(name)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private File getFileForUser(int userId) {
+ return new File(Environment.getUserSystemDirectory(userId), getBiometricFile());
+ }
+
+ private void scheduleWriteStateLocked() {
+ AsyncTask.execute(mWriteStateRunnable);
+ }
+
+ @GuardedBy("this")
+ private void readStateSyncLocked() {
+ FileInputStream in;
+ if (!mFile.exists()) {
+ return;
+ }
+ try {
+ in = new FileInputStream(mFile);
+ } catch (FileNotFoundException fnfe) {
+ Slog.i(TAG, "No fingerprint state");
+ return;
+ }
+ try {
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(in, null);
+ parseStateLocked(parser);
+
+ } catch (XmlPullParserException | IOException e) {
+ throw new IllegalStateException("Failed parsing settings file: "
+ + mFile , e);
+ } finally {
+ IoUtils.closeQuietly(in);
+ }
+ }
+
+ @GuardedBy("this")
+ private void parseStateLocked(XmlPullParser parser)
+ throws IOException, XmlPullParserException {
+ final int outerDepth = parser.getDepth();
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+
+ String tagName = parser.getName();
+ if (tagName.equals(getBiometricsTag())) {
+ parseBiometricsLocked(parser);
+ }
+ }
+ }
+
+}
diff --git a/services/core/java/com/android/server/biometrics/common/BiometricUtils.java b/services/core/java/com/android/server/biometrics/common/BiometricUtils.java
new file mode 100644
index 000000000000..8f076f169d8a
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/common/BiometricUtils.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.common;
+
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+
+import java.util.List;
+
+/**
+ * Interface for utilities managing biometrics and their relevant settings.
+ * @hide
+ */
+public interface BiometricUtils<T extends BiometricAuthenticator.Identifier> {
+ List<T> getBiometricsForUser(Context context, int userId);
+ void addBiometricForUser(Context context, int userId, T identifier);
+ void removeBiometricForUser(Context context, int userId, int biometricId);
+ void renameBiometricForUser(Context context, int userId, int biometricId, CharSequence name);
+ CharSequence getUniqueName(Context context, int userId);
+} \ No newline at end of file
diff --git a/services/core/java/com/android/server/fingerprint/ClientMonitor.java b/services/core/java/com/android/server/biometrics/common/ClientMonitor.java
index b935ba2a2ea4..699fc32e3464 100644
--- a/services/core/java/com/android/server/fingerprint/ClientMonitor.java
+++ b/services/core/java/com/android/server/biometrics/common/ClientMonitor.java
@@ -1,5 +1,5 @@
-/**
- * Copyright (C) 2016 The Android Open Source Project
+/*
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -11,16 +11,14 @@
* 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.
+ * limitations under the License
*/
-package com.android.server.fingerprint;
+package com.android.server.biometrics.common;
-import android.Manifest;
import android.content.Context;
-import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricConstants;
import android.media.AudioAttributes;
import android.os.IBinder;
import android.os.RemoteException;
@@ -28,23 +26,24 @@ import android.os.VibrationEffect;
import android.os.Vibrator;
import android.util.Slog;
+import com.android.internal.logging.MetricsLogger;
+
import java.util.NoSuchElementException;
/**
- * Abstract base class for keeping track and dispatching events from fingerprint HAL to the
+ * Abstract base class for keeping track and dispatching events from the biometric's HAL to the
* the current client. Subclasses are responsible for coordinating the interaction with
- * fingerprint HAL for the specific action (e.g. authenticate, enroll, enumerate, etc.).
+ * the biometric's HAL for the specific action (e.g. authenticate, enroll, enumerate, etc.).
*/
public abstract class ClientMonitor implements IBinder.DeathRecipient {
- protected static final String TAG = FingerprintService.TAG; // TODO: get specific name
- protected static final int ERROR_ESRCH = 3; // Likely fingerprint HAL is dead. See errno.h.
- protected static final boolean DEBUG = FingerprintService.DEBUG;
- private static final long[] DEFAULT_SUCCESS_VIBRATION_PATTERN = new long[] {0, 30};
+ protected static final int ERROR_ESRCH = 3; // Likely HAL is dead. See errno.h.
+ protected static final boolean DEBUG = BiometricService.DEBUG;
private static final AudioAttributes FINGERPRINT_SONFICATION_ATTRIBUTES =
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
.build();
+
private final Context mContext;
private final long mHalDeviceId;
private final int mTargetUserId;
@@ -54,51 +53,65 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
private final String mOwner;
private final VibrationEffect mSuccessVibrationEffect;
private final VibrationEffect mErrorVibrationEffect;
+ private final BiometricService.DaemonWrapper mDaemon;
+
private IBinder mToken;
- private IFingerprintServiceReceiver mReceiver;
+ private BiometricService.ServiceListener mListener;
+
+ protected final MetricsLogger mMetricsLogger;
+ protected final Metrics mMetrics;
+
protected boolean mAlreadyCancelled;
/**
- * @param context context of FingerprintService
- * @param halDeviceId the HAL device ID of the associated fingerprint hardware
+ * @param context context of BiometricService
+ * @param daemon interface to call back to a specific biometric's daemon
+ * @param halDeviceId the HAL device ID of the associated biometric hardware
* @param token a unique token for the client
- * @param receiver recipient of related events (e.g. authentication)
+ * @param listener recipient of related events (e.g. authentication)
* @param userId target user id for operation
* @param groupId groupId for the fingerprint set
- * @param restricted whether or not client has the {@link Manifest#MANAGE_FINGERPRINT}
+ * @param restricted whether or not client has the MANAGE_* permission
* permission
* @param owner name of the client that owns this
*/
- public ClientMonitor(Context context, long halDeviceId, IBinder token,
- IFingerprintServiceReceiver receiver, int userId, int groupId,boolean restricted,
- String owner) {
+ public ClientMonitor(Context context, Metrics metrics, BiometricService.DaemonWrapper daemon,
+ long halDeviceId, IBinder token, BiometricService.ServiceListener listener, int userId,
+ int groupId, boolean restricted, String owner) {
mContext = context;
+ mMetrics = metrics;
+ mDaemon = daemon;
mHalDeviceId = halDeviceId;
mToken = token;
- mReceiver = receiver;
+ mListener = listener;
mTargetUserId = userId;
mGroupId = groupId;
mIsRestricted = restricted;
mOwner = owner;
mSuccessVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
mErrorVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
+ mMetricsLogger = new MetricsLogger();
try {
if (token != null) {
token.linkToDeath(this, 0);
}
} catch (RemoteException e) {
- Slog.w(TAG, "caught remote exception in linkToDeath: ", e);
+ Slog.w(getLogTag(), "caught remote exception in linkToDeath: ", e);
}
}
+ protected String getLogTag() {
+ return mMetrics.logTag();
+ }
+
/**
- * Contacts fingerprint HAL to start the client.
+ * Contacts the biometric's HAL to start the client.
* @return 0 on success, errno from driver on failure
*/
public abstract int start();
/**
- * Contacts fingerprint HAL to stop the client.
+ * Contacts the biometric's HAL to stop the client.
* @param initiatedByClient whether the operation is at the request of a client
*/
public abstract int stop(boolean initiatedByClient);
@@ -108,56 +121,54 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
*/
public abstract void notifyUserActivity();
- /**
- * Gets the fingerprint daemon from the cached state in the container class.
- */
- public abstract IBiometricsFingerprint getFingerprintDaemon();
-
// Event callbacks from driver. Inappropriate calls is flagged/logged by the
// respective client (e.g. enrolling shouldn't get authenticate events).
// All of these return 'true' if the operation is completed and it's ok to move
- // to the next client (e.g. authentication accepts or rejects a fingerprint).
- public abstract boolean onEnrollResult(int fingerId, int groupId, int rem);
- public abstract boolean onAuthenticated(int fingerId, int groupId);
- public abstract boolean onRemoved(int fingerId, int groupId, int remaining);
- public abstract boolean onEnumerationResult(int fingerId, int groupId, int remaining);
+ // to the next client (e.g. authentication accepts or rejects a biometric).
+ public abstract boolean onEnrollResult(BiometricAuthenticator.Identifier identifier,
+ int remaining);
+ public abstract boolean onAuthenticated(int biometricId, int groupId);
+ public abstract boolean onRemoved(BiometricAuthenticator.Identifier identifier,
+ int remaining);
+ public abstract boolean onEnumerationResult(
+ BiometricAuthenticator.Identifier identifier, int remaining);
/**
- * Called when we get notification from fingerprint HAL that an image has been acquired.
+ * Called when we get notification from the biometric's HAL that an image has been acquired.
* Common to authenticate and enroll.
* @param acquiredInfo info about the current image acquisition
* @return true if client should be removed
*/
public boolean onAcquired(int acquiredInfo, int vendorCode) {
- if (mReceiver == null)
- return true; // client not connected
try {
- mReceiver.onAcquired(getHalDeviceId(), acquiredInfo, vendorCode);
+ if (mListener != null) {
+ mListener.onAcquired(getHalDeviceId(), acquiredInfo, vendorCode);
+ }
return false; // acquisition continues...
} catch (RemoteException e) {
- Slog.w(TAG, "Failed to invoke sendAcquired:", e);
- return true; // client failed
+ Slog.w(getLogTag(), "Failed to invoke sendAcquired", e);
+ return true;
} finally {
// Good scans will keep the device awake
- if (acquiredInfo == FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) {
+ if (acquiredInfo == BiometricConstants.BIOMETRIC_ACQUIRED_GOOD) {
notifyUserActivity();
}
}
}
/**
- * Called when we get notification from fingerprint HAL that an error has occurred with the
+ * Called when we get notification from the biometric's HAL that an error has occurred with the
* current operation. Common to authenticate, enroll, enumerate and remove.
* @param error
* @return true if client should be removed
*/
- public boolean onError(int error, int vendorCode) {
- if (mReceiver != null) {
- try {
- mReceiver.onError(getHalDeviceId(), error, vendorCode);
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to invoke sendError:", e);
+ public boolean onError(long deviceId, int error, int vendorCode) {
+ try {
+ if (mListener != null) {
+ mListener.onError(deviceId, error, vendorCode);
}
+ } catch (RemoteException e) {
+ Slog.w(getLogTag(), "Failed to invoke sendError", e);
}
return true; // errors always remove current client
}
@@ -168,26 +179,28 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
mToken.unlinkToDeath(this, 0);
} catch (NoSuchElementException e) {
// TODO: remove when duplicate call bug is found
- Slog.e(TAG, "destroy(): " + this + ":", new Exception("here"));
+ Slog.e(getLogTag(), "destroy(): " + this + ":", new Exception("here"));
}
mToken = null;
}
- mReceiver = null;
+ mListener = null;
}
@Override
public void binderDied() {
mToken = null;
- mReceiver = null;
- onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */);
+ mListener = null;
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ 0 /* vendorCode */);
}
@Override
protected void finalize() throws Throwable {
try {
if (mToken != null) {
- if (DEBUG) Slog.w(TAG, "removing leaked reference: " + mToken);
- onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */);
+ if (DEBUG) Slog.w(getLogTag(), "removing leaked reference: " + mToken);
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ 0 /* vendorCode */);
}
} finally {
super.finalize();
@@ -206,8 +219,12 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient {
return mOwner;
}
- public final IFingerprintServiceReceiver getReceiver() {
- return mReceiver;
+ public final BiometricService.ServiceListener getListener() {
+ return mListener;
+ }
+
+ public final BiometricService.DaemonWrapper getDaemonWrapper() {
+ return mDaemon;
}
public final boolean getIsRestricted() {
diff --git a/services/core/java/com/android/server/biometrics/common/EnrollClient.java b/services/core/java/com/android/server/biometrics/common/EnrollClient.java
new file mode 100644
index 000000000000..5744fdbd0de0
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/common/EnrollClient.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.common;
+
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricConstants;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+
+import java.util.Arrays;
+
+/**
+ * A class to keep track of the enrollment state for a given client.
+ */
+public abstract class EnrollClient extends ClientMonitor {
+ private static final long MS_PER_SEC = 1000;
+ private static final int ENROLLMENT_TIMEOUT_MS = 60 * 1000; // 1 minute
+ private final byte[] mCryptoToken;
+ private final BiometricUtils mBiometricUtils;
+
+ public EnrollClient(Context context, Metrics metrics, BiometricService.DaemonWrapper daemon,
+ long halDeviceId, IBinder token, BiometricService.ServiceListener listener, int userId,
+ int groupId, byte[] cryptoToken, boolean restricted, String owner,
+ BiometricUtils utils) {
+ super(context, metrics, daemon, halDeviceId, token, listener, userId, groupId, restricted,
+ owner);
+ mBiometricUtils = utils;
+ mCryptoToken = Arrays.copyOf(cryptoToken, cryptoToken.length);
+ }
+
+ @Override
+ public boolean onEnrollResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ if (remaining == 0) {
+ mBiometricUtils.addBiometricForUser(getContext(), getTargetUserId(), identifier);
+ }
+ return sendEnrollResult(identifier, remaining);
+ }
+
+ /*
+ * @return true if we're done.
+ */
+ private boolean sendEnrollResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ vibrateSuccess();
+ mMetricsLogger.action(mMetrics.actionBiometricEnroll());
+ try {
+ getListener().onEnrollResult(identifier, remaining);
+ return remaining == 0;
+ } catch (RemoteException e) {
+ Slog.w(getLogTag(), "Failed to notify EnrollResult:", e);
+ return true;
+ }
+ }
+
+ @Override
+ public int start() {
+ final int timeout = (int) (ENROLLMENT_TIMEOUT_MS / MS_PER_SEC);
+ try {
+ final int result = getDaemonWrapper().enroll(mCryptoToken, getGroupId(), timeout);
+ if (result != 0) {
+ Slog.w(getLogTag(), "startEnroll failed, result=" + result);
+ mMetricsLogger.histogram(mMetrics.tagEnrollStartError(), result);
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ 0 /* vendorCode */);
+ return result;
+ }
+ } catch (RemoteException e) {
+ Slog.e(getLogTag(), "startEnroll failed", e);
+ }
+ return 0; // success
+ }
+
+ @Override
+ public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(getLogTag(), "stopEnroll: already cancelled!");
+ return 0;
+ }
+
+ try {
+ final int result = getDaemonWrapper().cancel();
+ if (result != 0) {
+ Slog.w(getLogTag(), "startEnrollCancel failed, result = " + result);
+ return result;
+ }
+ } catch (RemoteException e) {
+ Slog.e(getLogTag(), "stopEnrollment failed", e);
+ }
+ if (initiatedByClient) {
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_CANCELED,
+ 0 /* vendorCode */);
+ }
+ mAlreadyCancelled = true;
+ return 0;
+ }
+
+ @Override
+ public boolean onRemoved(BiometricAuthenticator.Identifier identifier, int remaining) {
+ if (DEBUG) Slog.w(getLogTag(), "onRemoved() called for enroll!");
+ return true; // Invalid for EnrollClient
+ }
+
+ @Override
+ public boolean onEnumerationResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ if (DEBUG) Slog.w(getLogTag(), "onEnumerationResult() called for enroll!");
+ return true; // Invalid for EnrollClient
+ }
+
+ @Override
+ public boolean onAuthenticated(int biometricId, int groupId) {
+ if (DEBUG) Slog.w(getLogTag(), "onAuthenticated() called for enroll!");
+ return true; // Invalid for EnrollClient
+ }
+
+}
diff --git a/services/core/java/com/android/server/biometrics/common/EnumerateClient.java b/services/core/java/com/android/server/biometrics/common/EnumerateClient.java
new file mode 100644
index 000000000000..e51c1c683e06
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/common/EnumerateClient.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.common;
+
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricConstants;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+
+/**
+ * A class to keep track of the enumeration state for a given client.
+ */
+public abstract class EnumerateClient extends ClientMonitor {
+ public EnumerateClient(Context context, Metrics metrics, BiometricService.DaemonWrapper daemon,
+ long halDeviceId, IBinder token, BiometricService.ServiceListener listener, int groupId,
+ int userId, boolean restricted, String owner) {
+ super(context, metrics, daemon, halDeviceId, token, listener, userId, groupId, restricted,
+ owner);
+ }
+
+ @Override
+ public int start() {
+ // The biometric template ids will be removed when we get confirmation from the HAL
+ try {
+ final int result = getDaemonWrapper().enumerate();
+ if (result != 0) {
+ Slog.w(getLogTag(), "start enumerate for user " + getTargetUserId()
+ + " failed, result=" + result);
+ mMetricsLogger.histogram(mMetrics.tagEnumerateStartError(), result);
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ 0 /* vendorCode */);
+ return result;
+ }
+ } catch (RemoteException e) {
+ Slog.e(getLogTag(), "startEnumeration failed", e);
+ }
+ return 0;
+ }
+
+ @Override
+ public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(getLogTag(), "stopEnumerate: already cancelled!");
+ return 0;
+ }
+
+ try {
+ final int result = getDaemonWrapper().cancel();
+ if (result != 0) {
+ Slog.w(getLogTag(), "stop enumeration failed, result=" + result);
+ return result;
+ }
+ } catch (RemoteException e) {
+ Slog.e(getLogTag(), "stopEnumeration failed", e);
+ return ERROR_ESRCH;
+ }
+
+ // We don't actually stop enumerate, but inform the client that the cancel operation
+ // succeeded so we can start the next operation.
+ if (initiatedByClient) {
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_CANCELED,
+ 0 /* vendorCode */);
+ }
+ mAlreadyCancelled = true;
+ return 0; // success
+ }
+
+ @Override
+ public boolean onEnumerationResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ try {
+ getListener().onEnumerated(identifier, remaining);
+ } catch (RemoteException e) {
+ Slog.w(getLogTag(), "Failed to notify enumerated:", e);
+ }
+ return remaining == 0;
+ }
+
+ @Override
+ public boolean onAuthenticated(int biometricId, int groupId) {
+ if (DEBUG) Slog.w(getLogTag(), "onAuthenticated() called for enumerate!");
+ return true; // Invalid for Enumerate.
+ }
+
+ @Override
+ public boolean onEnrollResult(BiometricAuthenticator.Identifier identifier, int rem) {
+ if (DEBUG) Slog.w(getLogTag(), "onEnrollResult() called for enumerate!");
+ return true; // Invalid for Enumerate.
+ }
+
+ @Override
+ public boolean onRemoved(BiometricAuthenticator.Identifier identifier, int remaining) {
+ if (DEBUG) Slog.w(getLogTag(), "onRemoved() called for enumerate!");
+ return true; // Invalid for Enumerate.
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/common/Metrics.java b/services/core/java/com/android/server/biometrics/common/Metrics.java
new file mode 100644
index 000000000000..eb1a1f82de38
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/common/Metrics.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.common;
+
+public interface Metrics {
+ /** The log tag */
+ String logTag();
+
+ /** Strings for MetricsLogger.count() and MetricsLogger.histogram() */
+ String tagHalDied();
+ String tagAuthToken();
+ String tagAuthStartError();
+ String tagEnrollStartError();
+ String tagEnumerateStartError();
+ String tagRemoveStartError();
+
+ /** Integers for MetricsLogger.action() */
+ int actionBiometricAuth();
+ int actionBiometricEnroll();
+} \ No newline at end of file
diff --git a/services/core/java/com/android/server/biometrics/common/RemovalClient.java b/services/core/java/com/android/server/biometrics/common/RemovalClient.java
new file mode 100644
index 000000000000..23d55397eefc
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/common/RemovalClient.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.common;
+
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricConstants;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Slog;
+
+/**
+ * A class to keep track of the remove state for a given client.
+ */
+public abstract class RemovalClient extends ClientMonitor {
+ private final int mBiometricId;
+ private final BiometricUtils mBiometricUtils;
+
+ public RemovalClient(Context context, Metrics metrics, BiometricService.DaemonWrapper daemon,
+ long halDeviceId, IBinder token, BiometricService.ServiceListener listener,
+ int biometricId, int groupId, int userId, boolean restricted, String owner,
+ BiometricUtils utils) {
+ super(context, metrics, daemon, halDeviceId, token, listener, userId, groupId, restricted,
+ owner);
+ mBiometricId = biometricId;
+ mBiometricUtils = utils;
+ }
+
+ @Override
+ public int start() {
+ // The biometric template ids will be removed when we get confirmation from the HAL
+ try {
+ final int result = getDaemonWrapper().remove(getGroupId(), mBiometricId);
+ if (result != 0) {
+ Slog.w(getLogTag(), "startRemove with id = " + mBiometricId + " failed, result=" +
+ result);
+ mMetricsLogger.histogram(mMetrics.tagRemoveStartError(), result);
+ onError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE,
+ 0 /* vendorCode */);
+ return result;
+ }
+ } catch (RemoteException e) {
+ Slog.e(getLogTag(), "startRemove failed", e);
+ }
+ return 0;
+ }
+
+ @Override
+ public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(getLogTag(), "stopRemove: already cancelled!");
+ return 0;
+ }
+
+ try {
+ final int result = getDaemonWrapper().cancel();
+ if (result != 0) {
+ Slog.w(getLogTag(), "stopRemoval failed, result=" + result);
+ return result;
+ }
+ if (DEBUG) Slog.w(getLogTag(), "client " + getOwnerString() + " is no longer removing");
+ } catch (RemoteException e) {
+ Slog.e(getLogTag(), "stopRemoval failed", e);
+ return ERROR_ESRCH;
+ }
+ mAlreadyCancelled = true;
+ return 0; // success
+ }
+
+ /*
+ * @return true if we're done.
+ */
+ private boolean sendRemoved(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ try {
+ getListener().onRemoved(identifier, remaining);
+ } catch (RemoteException e) {
+ Slog.w(getLogTag(), "Failed to notify Removed:", e);
+ }
+ return remaining == 0;
+ }
+
+ @Override
+ public boolean onRemoved(BiometricAuthenticator.Identifier identifier, int remaining) {
+ if (identifier.getBiometricId() != 0) {
+ mBiometricUtils.removeBiometricForUser(getContext(), getTargetUserId(),
+ identifier.getBiometricId());
+ }
+ return sendRemoved(identifier, remaining);
+ }
+
+ @Override
+ public boolean onEnrollResult(BiometricAuthenticator.Identifier identifier, int rem) {
+ if (DEBUG) Slog.w(getLogTag(), "onEnrollResult() called for remove!");
+ return true; // Invalid for Remove
+ }
+
+ @Override
+ public boolean onAuthenticated(int biometricId, int groupId) {
+ if (DEBUG) Slog.w(getLogTag(), "onAuthenticated() called for remove!");
+ return true; // Invalid for Remove.
+ }
+
+ @Override
+ public boolean onEnumerationResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ if (DEBUG) Slog.w(getLogTag(), "onEnumerationResult() called for remove!");
+ return true; // Invalid for Remove.
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/face/FaceMetrics.java b/services/core/java/com/android/server/biometrics/face/FaceMetrics.java
new file mode 100644
index 000000000000..4c907b1fde07
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/face/FaceMetrics.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.face;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.server.biometrics.common.Metrics;
+
+public class FaceMetrics implements Metrics {
+ @Override
+ public String logTag() {
+ return FaceService.TAG;
+ }
+
+ @Override
+ public String tagHalDied() {
+ return "faced_died";
+ }
+
+ @Override
+ public String tagAuthToken() {
+ return "face_token";
+ }
+
+ @Override
+ public String tagAuthStartError() {
+ return "faced_auth_start_error";
+ }
+
+ @Override
+ public String tagEnrollStartError() {
+ return "faced_enroll_start_error";
+ }
+
+ @Override
+ public String tagEnumerateStartError() {
+ return "faced_enum_start_error";
+ }
+
+ @Override
+ public String tagRemoveStartError() {
+ return "faced_remove_start_error";
+ }
+
+ @Override
+ public int actionBiometricAuth() {
+ return MetricsProto.MetricsEvent.ACTION_FACE_AUTH;
+ }
+
+ @Override
+ public int actionBiometricEnroll() {
+ return MetricsProto.MetricsEvent.ACTION_FACE_ENROLL;
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java
new file mode 100644
index 000000000000..35679a8824b1
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/face/FaceService.java
@@ -0,0 +1,785 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.face;
+
+import static android.Manifest.permission.INTERACT_ACROSS_USERS;
+import static android.Manifest.permission.MANAGE_FACE;
+import static android.Manifest.permission.RESET_FACE_LOCKOUT;
+import static android.Manifest.permission.USE_BIOMETRIC;
+
+import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.IBiometricPromptReceiver;
+import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
+import android.hardware.biometrics.face.V1_0.IBiometricsFace;
+import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback;
+import android.hardware.face.Face;
+import android.hardware.face.IFaceService;
+import android.hardware.face.IFaceServiceReceiver;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.SELinux;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Slog;
+import android.util.proto.ProtoOutputStream;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.util.DumpUtils;
+import com.android.server.SystemServerInitThreadPool;
+import com.android.server.biometrics.common.BiometricService;
+import com.android.server.biometrics.common.BiometricUtils;
+import com.android.server.biometrics.common.Metrics;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A service to manage multiple clients that want to access the face HAL API.
+ * The service is responsible for maintaining a list of clients and dispatching all
+ * face -related events.
+ *
+ * @hide
+ */
+public class FaceService extends BiometricService {
+
+ protected static final String TAG = "FaceService";
+ private static final boolean DEBUG = true;
+ private static final String FACE_DATA_DIR = "facedata";
+ private static final String ACTION_LOCKOUT_RESET =
+ "com.android.server.biometrics.face.ACTION_LOCKOUT_RESET";
+ private static final int MAX_FAILED_ATTEMPTS_LOCKOUT_TIMED = 3;
+ private static final int MAX_FAILED_ATTEMPTS_LOCKOUT_PERMANENT = 12;
+
+ /**
+ * Receives the incoming binder calls from FaceManager.
+ */
+ private final class FaceServiceWrapper extends IFaceService.Stub {
+
+ /**
+ * The following methods contain common code which is shared in biometrics/common.
+ */
+ @Override // Binder call
+ public long preEnroll(IBinder token) {
+ checkPermission(MANAGE_FACE);
+ return startPreEnroll(token);
+ }
+
+ @Override // Binder call
+ public int postEnroll(IBinder token) {
+ checkPermission(MANAGE_FACE);
+ return startPostEnroll(token);
+ }
+
+ @Override // Binder call
+ public void enroll(final IBinder token, final byte[] cryptoToken, final int userId,
+ final IFaceServiceReceiver receiver, final int flags,
+ final String opPackageName) {
+ checkPermission(MANAGE_FACE);
+
+ final boolean restricted = isRestricted();
+ final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper,
+ mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId,
+ 0 /* groupId */, cryptoToken, restricted, opPackageName);
+
+ enrollInternal(client, userId);
+ }
+
+ @Override // Binder call
+ public void cancelEnrollment(final IBinder token) {
+ checkPermission(MANAGE_FACE);
+ cancelEnrollmentInternal(token);
+ }
+
+ @Override // Binder call
+ public void authenticate(final IBinder token, final long opId,
+ final IFaceServiceReceiver receiver, final int flags,
+ final String opPackageName, final Bundle bundle,
+ final IBiometricPromptReceiver dialogReceiver) {
+ final boolean restricted = isRestricted();
+ final AuthenticationClientImpl client = new AuthenticationClientImpl(getContext(),
+ mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver),
+ mCurrentUserId, 0 /* groupId */, opId, restricted, opPackageName, bundle,
+ dialogReceiver, mStatusBarService);
+
+ authenticateInternal(client, opId, opPackageName);
+ }
+
+ @Override // Binder call
+ public void cancelAuthentication(final IBinder token, final String opPackageName) {
+ cancelAuthenticationInternal(token, opPackageName);
+ }
+
+ @Override // Binder call
+ public void setActiveUser(final int userId) {
+ checkPermission(MANAGE_FACE);
+ setActiveUserInternal(userId);
+ }
+
+ @Override // Binder call
+ public void remove(final IBinder token, final int faceId, final int userId,
+ final IFaceServiceReceiver receiver) {
+ checkPermission(MANAGE_FACE);
+
+ if (token == null) {
+ Slog.w(TAG, "remove(): token is null");
+ return;
+ }
+
+ final boolean restricted = isRestricted();
+ final RemovalClientImpl client = new RemovalClientImpl(getContext(), mDaemonWrapper,
+ mHalDeviceId, token, new ServiceListenerImpl(receiver), faceId, 0 /* groupId */,
+ userId, restricted, token.toString());
+ client.setShouldNotifyUserActivity(true);
+ removeInternal(client);
+ }
+
+ @Override
+ public void enumerate(final IBinder token, final int userId,
+ final IFaceServiceReceiver receiver) {
+ checkPermission(MANAGE_FACE);
+
+ final boolean restricted = isRestricted();
+ final EnumerateClientImpl client = new EnumerateClientImpl(getContext(), mDaemonWrapper,
+ mHalDeviceId, token, new ServiceListenerImpl(receiver), userId, userId,
+ restricted, getContext().getOpPackageName());
+ enumerateInternal(client);
+ }
+
+ @Override
+ public void addLockoutResetCallback(final IBiometricServiceLockoutResetCallback callback)
+ throws RemoteException {
+ FaceService.super.addLockoutResetCallback(callback);
+ }
+
+ @Override // Binder call
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) {
+ return;
+ }
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ if (args.length > 0 && "--proto".equals(args[0])) {
+ dumpProto(fd);
+ } else {
+ dumpInternal(pw);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * The following methods don't use any common code from BiometricService
+ */
+
+ // TODO: refactor out common code here
+ @Override // Binder call
+ public boolean isHardwareDetected(long deviceId, String opPackageName) {
+ if (!canUseBiometric(opPackageName, false /* foregroundOnly */,
+ Binder.getCallingUid(), Binder.getCallingPid(),
+ UserHandle.getCallingUserId())) {
+ return false;
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ IBiometricsFace daemon = getFaceDaemon();
+ return daemon != null && mHalDeviceId != 0;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override // Binder call
+ public void rename(final int faceId, final String name) {
+ checkPermission(MANAGE_FACE);
+ if (!isCurrentUserOrProfile(UserHandle.getCallingUserId())) {
+ return;
+ }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ getBiometricUtils().renameBiometricForUser(getContext(), mCurrentUserId,
+ faceId, name);
+ }
+ });
+ }
+
+ @Override // Binder call
+ public List<Face> getEnrolledFaces(int userId, String opPackageName) {
+ if (!canUseBiometric(opPackageName, false /* foregroundOnly */,
+ Binder.getCallingUid(), Binder.getCallingPid(),
+ UserHandle.getCallingUserId())) {
+ return null;
+ }
+
+ return FaceService.this.getEnrolledFaces(userId);
+ }
+
+ @Override // Binder call
+ public boolean hasEnrolledFaces(int userId, String opPackageName) {
+ if (!canUseBiometric(opPackageName, false /* foregroundOnly */,
+ Binder.getCallingUid(), Binder.getCallingPid(),
+ UserHandle.getCallingUserId())) {
+ return false;
+ }
+
+ return FaceService.this.hasEnrolledBiometrics(userId);
+ }
+
+ @Override // Binder call
+ public long getAuthenticatorId(String opPackageName) {
+ // In this method, we're not checking whether the caller is permitted to use face
+ // API because current authenticator ID is leaked (in a more contrived way) via Android
+ // Keystore (android.security.keystore package): the user of that API can create a key
+ // which requires face authentication for its use, and then query the key's
+ // characteristics (hidden API) which returns, among other things, face
+ // authenticator ID which was active at key creation time.
+ //
+ // Reason: The part of Android Keystore which runs inside an app's process invokes this
+ // method in certain cases. Those cases are not always where the developer demonstrates
+ // explicit intent to use face functionality. Thus, to avoiding throwing an
+ // unexpected SecurityException this method does not check whether its caller is
+ // permitted to use face API.
+ //
+ // The permission check should be restored once Android Keystore no longer invokes this
+ // method from inside app processes.
+
+ return FaceService.this.getAuthenticatorId(opPackageName);
+ }
+
+ @Override // Binder call
+ public void resetTimeout(byte[] token) {
+ checkPermission(RESET_FACE_LOCKOUT);
+ // TODO: confirm security token when we move timeout management into the HAL layer.
+ mHandler.post(mResetFailedAttemptsForCurrentUserRunnable);
+ }
+ }
+
+ /**
+ * Receives callbacks from the ClientMonitor implementations. The results are forwarded to
+ * the FaceManager.
+ */
+ private class ServiceListenerImpl implements ServiceListener {
+
+ private IFaceServiceReceiver mFaceServiceReceiver;
+
+ public ServiceListenerImpl(IFaceServiceReceiver receiver) {
+ mFaceServiceReceiver = receiver;
+ }
+
+ @Override
+ public void onEnrollResult(BiometricAuthenticator.Identifier identifier, int remaining)
+ throws RemoteException {
+ if (mFaceServiceReceiver != null) {
+ mFaceServiceReceiver.onEnrollResult(identifier.getDeviceId(),
+ identifier.getBiometricId(),
+ remaining);
+ }
+ }
+
+ @Override
+ public void onAcquired(long deviceId, int acquiredInfo, int vendorCode)
+ throws RemoteException {
+ if (mFaceServiceReceiver != null) {
+ mFaceServiceReceiver.onAcquired(deviceId, acquiredInfo, vendorCode);
+ }
+ }
+
+ @Override
+ public void onAuthenticationSucceeded(long deviceId,
+ BiometricAuthenticator.Identifier biometric, int userId)
+ throws RemoteException {
+ if (mFaceServiceReceiver != null) {
+ if (biometric instanceof Face) {
+ mFaceServiceReceiver.onAuthenticationSucceeded(deviceId, (Face)biometric);
+ } else {
+ Slog.e(TAG, "onAuthenticationSucceeded received non-face biometric");
+ }
+ }
+ }
+
+ @Override
+ public void onAuthenticationFailed(long deviceId) throws RemoteException {
+ if (mFaceServiceReceiver != null) {
+ mFaceServiceReceiver.onAuthenticationFailed(deviceId);
+ }
+ }
+
+ @Override
+ public void onError(long deviceId, int error, int vendorCode) throws RemoteException {
+ if (mFaceServiceReceiver != null) {
+ mFaceServiceReceiver.onError(deviceId, error, vendorCode);
+ }
+ }
+
+ @Override
+ public void onRemoved(BiometricAuthenticator.Identifier identifier,
+ int remaining) throws RemoteException {
+ if (mFaceServiceReceiver != null) {
+ mFaceServiceReceiver.onRemoved(identifier.getDeviceId(),
+ identifier.getBiometricId(), remaining);
+ }
+ }
+
+ @Override
+ public void onEnumerated(BiometricAuthenticator.Identifier identifier, int remaining)
+ throws RemoteException {
+ if (mFaceServiceReceiver != null) {
+
+ }
+ }
+ }
+
+ private final FaceMetrics mFaceMetrics = new FaceMetrics();
+
+ @GuardedBy("this")
+ private IBiometricsFace mDaemon;
+
+ private long mHalDeviceId;
+ private IStatusBarService mStatusBarService;
+
+ /**
+ * Receives callbacks from the HAL.
+ */
+ private IBiometricsFaceClientCallback mDaemonCallback =
+ new IBiometricsFaceClientCallback.Stub() {
+ @Override
+ public void onEnrollResult(final long deviceId, int faceId, int userId,
+ int remaining) {
+ mHandler.post(() -> {
+ final Face face = new Face(getBiometricUtils()
+ .getUniqueName(getContext(), userId), faceId, deviceId);
+ FaceService.super.handleEnrollResult(face, remaining);
+ });
+ }
+
+ @Override
+ public void onAcquired(final long deviceId, final int userId,
+ final int acquiredInfo,
+ final int vendorCode) {
+ mHandler.post(() -> {
+ FaceService.super.handleAcquired(deviceId, acquiredInfo, vendorCode);
+ });
+ }
+
+ @Override
+ public void onAuthenticated(final long deviceId, final int faceId, final int userId,
+ ArrayList<Byte> token) {
+ mHandler.post(() -> {
+ FaceService.super.handleAuthenticated(deviceId, faceId, userId, token);
+ });
+ }
+
+ @Override
+ public void onError(final long deviceId, final int userId, final int error,
+ final int vendorCode) {
+ mHandler.post(() -> {
+ FaceService.super.handleError(deviceId, error, vendorCode);
+
+ // TODO: this chunk of code should be common to all biometric services
+ if (error == BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE) {
+ // If we get HW_UNAVAILABLE, try to connect again later...
+ Slog.w(TAG, "Got ERROR_HW_UNAVAILABLE; try reconnecting next client.");
+ synchronized (this) {
+ mDaemon = null;
+ mHalDeviceId = 0;
+ mCurrentUserId = UserHandle.USER_NULL;
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onRemoved(final long deviceId, final int faceId, final int userId,
+ final int remaining) {
+ mHandler.post(() -> {
+ final Face face = new Face("", faceId, deviceId);
+ FaceService.super.handleRemoved(face, remaining);
+ });
+ }
+
+ @Override
+ public void onEnumerate(long deviceId, ArrayList<Integer> faceIds, int userId)
+ throws RemoteException {
+ // TODO
+ }
+ };
+
+ /**
+ * Wraps the HAL-specific code and is passed to the ClientMonitor implementations so that they
+ * can be shared between the multiple biometric services.
+ */
+ private final DaemonWrapper mDaemonWrapper = new DaemonWrapper() {
+ @Override
+ public int authenticate(long operationId, int groupId) throws RemoteException {
+ IBiometricsFace daemon = getFaceDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "authenticate(): no face HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.authenticate(operationId);
+ }
+
+ @Override
+ public int cancel() throws RemoteException {
+ IBiometricsFace daemon = getFaceDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "cancel(): no face HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.cancel();
+ }
+
+ @Override
+ public int remove(int groupId, int biometricId) throws RemoteException {
+ IBiometricsFace daemon = getFaceDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "remove(): no face HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.remove(biometricId);
+ }
+
+ @Override
+ public int enumerate() throws RemoteException {
+ IBiometricsFace daemon = getFaceDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "enumerate(): no face HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.enumerate();
+ }
+
+ @Override
+ public int enroll(byte[] cryptoToken, int groupId, int timeout) throws RemoteException {
+ IBiometricsFace daemon = getFaceDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "enroll(): no face HAL!");
+ return ERROR_ESRCH;
+ }
+ final ArrayList<Byte> token = new ArrayList<>();
+ for (int i = 0; i < cryptoToken.length; i++) {
+ token.add(cryptoToken[i]);
+ }
+ return daemon.enroll(token, timeout);
+ }
+ };
+
+
+ public FaceService(Context context) {
+ super(context);
+ // TODO: can this be retrieved from AuthenticationClient, or BiometricService?
+ mStatusBarService = IStatusBarService.Stub.asInterface(
+ ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+ }
+
+ @Override
+ public void onStart() {
+ publishBinderService(Context.FACE_SERVICE, new FaceServiceWrapper());
+ SystemServerInitThreadPool.get().submit(this::getFaceDaemon, TAG + ".onStart");
+ }
+
+ @Override
+ public String getTag() {
+ return TAG;
+ }
+
+ @Override
+ protected BiometricUtils getBiometricUtils() {
+ return FaceUtils.getInstance();
+ }
+
+ @Override
+ protected int getFailedAttemptsLockoutTimed() {
+ return MAX_FAILED_ATTEMPTS_LOCKOUT_TIMED;
+ }
+
+ @Override
+ protected int getFailedAttemptsLockoutPermanent() {
+ return MAX_FAILED_ATTEMPTS_LOCKOUT_PERMANENT;
+ }
+
+ @Override
+ protected Metrics getMetrics() {
+ return mFaceMetrics;
+ }
+
+ @Override
+ protected boolean hasReachedEnrollmentLimit(int userId) {
+ final int limit = getContext().getResources().getInteger(
+ com.android.internal.R.integer.config_faceMaxTemplatesPerUser);
+ final int enrolled = FaceService.this.getEnrolledFaces(userId).size();
+ if (enrolled >= limit) {
+ Slog.w(TAG, "Too many faces registered");
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void updateActiveGroup(int userId, String clientPackage) {
+ IBiometricsFace daemon = getFaceDaemon();
+
+ if (daemon != null) {
+ try {
+ userId = getUserOrWorkProfileId(clientPackage, userId);
+ if (userId != mCurrentUserId) {
+ final File baseDir = Environment.getDataVendorDeDirectory(userId);
+ final File faceDir = new File(baseDir, FACE_DATA_DIR);
+ if (!faceDir.exists()) {
+ if (!faceDir.mkdir()) {
+ Slog.v(TAG, "Cannot make directory: " + faceDir.getAbsolutePath());
+ return;
+ }
+ // Calling mkdir() from this process will create a directory with our
+ // permissions (inherited from the containing dir). This command fixes
+ // the label.
+ if (!SELinux.restorecon(faceDir)) {
+ Slog.w(TAG, "Restorecons failed. Directory will have wrong label.");
+ return;
+ }
+ }
+
+ daemon.setActiveUser(userId, faceDir.getAbsolutePath());
+ mCurrentUserId = userId;
+ }
+ mAuthenticatorIds.put(userId,
+ hasEnrolledBiometrics(userId) ? daemon.getAuthenticatorId().value : 0L);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to setActiveUser():", e);
+ }
+ }
+ }
+
+ @Override
+ protected String getLockoutResetIntent() {
+ return ACTION_LOCKOUT_RESET;
+ }
+
+ @Override
+ protected String getLockoutBroadcastPermission() {
+ return RESET_FACE_LOCKOUT;
+ }
+
+ @Override
+ protected long getHalDeviceId() {
+ return mHalDeviceId;
+ }
+
+ @Override
+ protected void handleUserSwitching(int userId) {
+ updateActiveGroup(userId, null);
+ }
+
+ @Override
+ protected boolean hasEnrolledBiometrics(int userId) {
+ if (userId != UserHandle.getCallingUserId()) {
+ checkPermission(INTERACT_ACROSS_USERS);
+ }
+ return getBiometricUtils().getBiometricsForUser(getContext(), userId).size() > 0;
+ }
+
+ @Override
+ protected String getManageBiometricPermission() {
+ return MANAGE_FACE;
+ }
+
+ @Override
+ protected void checkUseBiometricPermission() {
+ checkPermission(USE_BIOMETRIC);
+ }
+
+ @Override
+ protected int getAppOp() {
+ return AppOpsManager.OP_USE_FACE;
+ }
+
+ @Override
+ protected void notifyClientActiveCallbacks(boolean isActive) {
+ // noop for Face.
+ }
+
+ /** Gets the face daemon */
+ private synchronized IBiometricsFace getFaceDaemon() {
+ if (mDaemon == null) {
+ Slog.v(TAG, "mDaemon was null, reconnect to face");
+ try {
+ mDaemon = IBiometricsFace.getService();
+ } catch (java.util.NoSuchElementException e) {
+ // Service doesn't exist or cannot be opened. Logged below.
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to get biometric interface", e);
+ }
+ if (mDaemon == null) {
+ Slog.w(TAG, "face HIDL not available");
+ return null;
+ }
+
+ mDaemon.asBinder().linkToDeath(this, 0);
+
+ try {
+ mHalDeviceId = mDaemon.setCallback(mDaemonCallback).value;
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to open face HAL", e);
+ mDaemon = null; // try again later!
+ }
+
+ if (DEBUG) Slog.v(TAG, "Face HAL id: " + mHalDeviceId);
+ if (mHalDeviceId != 0) {
+ loadAuthenticatorIds();
+ updateActiveGroup(ActivityManager.getCurrentUser(), null);
+ } else {
+ Slog.w(TAG, "Failed to open Face HAL!");
+ MetricsLogger.count(getContext(), "faced_openhal_error", 1);
+ mDaemon = null;
+ }
+ }
+ return mDaemon;
+ }
+
+ private long startPreEnroll(IBinder token) {
+ IBiometricsFace daemon = getFaceDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "startPreEnroll: no face HAL!");
+ return 0;
+ }
+ try {
+ return daemon.preEnroll().value;
+ } catch (RemoteException e) {
+ Slog.e(TAG, "startPreEnroll failed", e);
+ }
+ return 0;
+ }
+
+ private int startPostEnroll(IBinder token) {
+ IBiometricsFace daemon = getFaceDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "startPostEnroll: no face HAL!");
+ return 0;
+ }
+ try {
+ return daemon.postEnroll();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "startPostEnroll failed", e);
+ }
+ return 0;
+ }
+
+ private List<Face> getEnrolledFaces(int userId) {
+ return getBiometricUtils().getBiometricsForUser(getContext(), userId);
+ }
+
+ private void dumpInternal(PrintWriter pw) {
+ JSONObject dump = new JSONObject();
+ try {
+ dump.put("service", "Face Manager");
+
+ JSONArray sets = new JSONArray();
+ for (UserInfo user : UserManager.get(getContext()).getUsers()) {
+ final int userId = user.getUserHandle().getIdentifier();
+ final int N = getBiometricUtils().getBiometricsForUser(getContext(), userId).size();
+ PerformanceStats stats = mPerformanceMap.get(userId);
+ PerformanceStats cryptoStats = mCryptoPerformanceMap.get(userId);
+ JSONObject set = new JSONObject();
+ set.put("id", userId);
+ set.put("count", N);
+ set.put("accept", (stats != null) ? stats.accept : 0);
+ set.put("reject", (stats != null) ? stats.reject : 0);
+ set.put("acquire", (stats != null) ? stats.acquire : 0);
+ set.put("lockout", (stats != null) ? stats.lockout : 0);
+ set.put("permanentLockout", (stats != null) ? stats.permanentLockout : 0);
+ // cryptoStats measures statistics about secure face transactions
+ // (e.g. to unlock password storage, make secure purchases, etc.)
+ set.put("acceptCrypto", (cryptoStats != null) ? cryptoStats.accept : 0);
+ set.put("rejectCrypto", (cryptoStats != null) ? cryptoStats.reject : 0);
+ set.put("acquireCrypto", (cryptoStats != null) ? cryptoStats.acquire : 0);
+ set.put("lockoutCrypto", (cryptoStats != null) ? cryptoStats.lockout : 0);
+ set.put("permanentLockoutCrypto",
+ (cryptoStats != null) ? cryptoStats.permanentLockout : 0);
+ sets.put(set);
+ }
+
+ dump.put("prints", sets);
+ } catch (JSONException e) {
+ Slog.e(TAG, "dump formatting failure", e);
+ }
+ pw.println(dump);
+ }
+
+ private void dumpProto(FileDescriptor fd) {
+ final ProtoOutputStream proto = new ProtoOutputStream(fd);
+ for (UserInfo user : UserManager.get(getContext()).getUsers()) {
+ final int userId = user.getUserHandle().getIdentifier();
+
+ final long userToken = proto.start(FaceServiceDumpProto.USERS);
+
+ proto.write(FaceUserStatsProto.USER_ID, userId);
+ proto.write(FaceUserStatsProto.NUM_FACES,
+ getBiometricUtils().getBiometricsForUser(getContext(), userId).size());
+
+ // Normal face authentications (e.g. lockscreen)
+ final PerformanceStats normal = mPerformanceMap.get(userId);
+ if (normal != null) {
+ final long countsToken = proto.start(FaceUserStatsProto.NORMAL);
+ proto.write(FaceActionStatsProto.ACCEPT, normal.accept);
+ proto.write(FaceActionStatsProto.REJECT, normal.reject);
+ proto.write(FaceActionStatsProto.ACQUIRE, normal.acquire);
+ proto.write(FaceActionStatsProto.LOCKOUT, normal.lockout);
+ proto.write(FaceActionStatsProto.LOCKOUT_PERMANENT, normal.lockout);
+ proto.end(countsToken);
+ }
+
+ // Statistics about secure face transactions (e.g. to unlock password
+ // storage, make secure purchases, etc.)
+ final PerformanceStats crypto = mCryptoPerformanceMap.get(userId);
+ if (crypto != null) {
+ final long countsToken = proto.start(FaceUserStatsProto.CRYPTO);
+ proto.write(FaceActionStatsProto.ACCEPT, crypto.accept);
+ proto.write(FaceActionStatsProto.REJECT, crypto.reject);
+ proto.write(FaceActionStatsProto.ACQUIRE, crypto.acquire);
+ proto.write(FaceActionStatsProto.LOCKOUT, crypto.lockout);
+ proto.write(FaceActionStatsProto.LOCKOUT_PERMANENT, crypto.lockout);
+ proto.end(countsToken);
+ }
+
+ proto.end(userToken);
+ }
+ proto.flush();
+ mPerformanceMap.clear();
+ mCryptoPerformanceMap.clear();
+ }
+} \ No newline at end of file
diff --git a/services/core/java/com/android/server/biometrics/face/FaceUserState.java b/services/core/java/com/android/server/biometrics/face/FaceUserState.java
new file mode 100644
index 000000000000..7d67c62e6446
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/face/FaceUserState.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.face;
+
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.face.Face;
+import android.util.AtomicFile;
+import android.util.Slog;
+import android.util.Xml;
+
+import com.android.server.biometrics.common.BiometricUserState;
+
+import libcore.io.IoUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+
+/**
+ * Class managing the set of faces per user across device reboots.
+ * @hide
+ */
+public class FaceUserState extends BiometricUserState {
+
+ private static final String TAG = "FaceState";
+ private static final String FACE_FILE = "settings_face.xml";
+
+ private static final String TAG_FACES = "faces";
+ private static final String TAG_FACE = "face";
+ private static final String ATTR_NAME = "name";
+ private static final String ATTR_FACE_ID = "faceId";
+ private static final String ATTR_DEVICE_ID = "deviceId";
+
+ public FaceUserState(Context ctx, int userId) {
+ super(ctx, userId);
+ }
+
+ @Override
+ protected String getBiometricsTag() {
+ return TAG_FACES;
+ }
+
+ @Override
+ protected String getBiometricFile() {
+ return FACE_FILE;
+ }
+
+ @Override
+ protected int getNameTemplateResource() {
+ return com.android.internal.R.string.face_name_template;
+ }
+
+ @Override
+ public void addBiometric(BiometricAuthenticator.Identifier identifier) {
+ if (identifier instanceof Face) {
+ super.addBiometric(identifier);
+ } else {
+ Slog.w(TAG, "Attempted to add non-face identifier");
+ }
+ }
+
+ @Override
+ protected ArrayList getCopy(ArrayList array) {
+ ArrayList<Face> result = new ArrayList<>(array.size());
+ for (int i = 0; i < array.size(); i++) {
+ Face f = (Face) array.get(i);
+ result.add(new Face(f.getName(), f.getFaceId(), f.getDeviceId()));
+ }
+ return result;
+ }
+
+ @Override
+ protected void doWriteState() {
+ AtomicFile destination = new AtomicFile(mFile);
+
+ ArrayList<Face> faces;
+
+ synchronized (this) {
+ faces = getCopy(mBiometrics);
+ }
+
+ FileOutputStream out = null;
+ try {
+ out = destination.startWrite();
+
+ XmlSerializer serializer = Xml.newSerializer();
+ serializer.setOutput(out, "utf-8");
+ serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+ serializer.startDocument(null, true);
+ serializer.startTag(null, TAG_FACES);
+
+ final int count = faces.size();
+ for (int i = 0; i < count; i++) {
+ Face f = faces.get(i);
+ serializer.startTag(null, TAG_FACE);
+ serializer.attribute(null, ATTR_FACE_ID, Integer.toString(f.getFaceId()));
+ serializer.attribute(null, ATTR_NAME, f.getName().toString());
+ serializer.attribute(null, ATTR_DEVICE_ID, Long.toString(f.getDeviceId()));
+ serializer.endTag(null, TAG_FACE);
+ }
+
+ serializer.endTag(null, TAG_FACES);
+ serializer.endDocument();
+ destination.finishWrite(out);
+
+ // Any error while writing is fatal.
+ } catch (Throwable t) {
+ Slog.wtf(TAG, "Failed to write settings, restoring backup", t);
+ destination.failWrite(out);
+ throw new IllegalStateException("Failed to write faces", t);
+ } finally {
+ IoUtils.closeQuietly(out);
+ }
+ }
+
+ @Override
+ protected void parseBiometricsLocked(XmlPullParser parser)
+ throws IOException, XmlPullParserException {
+ final int outerDepth = parser.getDepth();
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+
+ String tagName = parser.getName();
+ if (tagName.equals(TAG_FACE)) {
+ String name = parser.getAttributeValue(null, ATTR_NAME);
+ String faceId = parser.getAttributeValue(null, ATTR_FACE_ID);
+ String deviceId = parser.getAttributeValue(null, ATTR_DEVICE_ID);
+ mBiometrics.add(new Face(name, Integer.parseInt(faceId), Integer.parseInt(deviceId)));
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/face/FaceUtils.java b/services/core/java/com/android/server/biometrics/face/FaceUtils.java
new file mode 100644
index 000000000000..a7e85e04e3b1
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/face/FaceUtils.java
@@ -0,0 +1,94 @@
+/**
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.face;
+
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.face.Face;
+import android.text.TextUtils;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.biometrics.common.BiometricUtils;
+
+import java.util.List;
+
+/**
+ * Utility class for dealing with faces and face settings.
+ */
+public class FaceUtils implements BiometricUtils {
+
+ private static final Object sInstanceLock = new Object();
+ private static FaceUtils sInstance;
+
+ @GuardedBy("this")
+ private final SparseArray<FaceUserState> mUsers = new SparseArray<>();
+
+ public static FaceUtils getInstance() {
+ synchronized (sInstanceLock) {
+ if (sInstance == null) {
+ sInstance = new FaceUtils();
+ }
+ }
+ return sInstance;
+ }
+
+ private FaceUtils() {
+ }
+
+ @Override
+ public List<Face> getBiometricsForUser(Context ctx, int userId) {
+ return getStateForUser(ctx, userId).getBiometrics();
+ }
+
+ @Override
+ public void addBiometricForUser(Context ctx, int userId,
+ BiometricAuthenticator.Identifier identifier) {
+ getStateForUser(ctx, userId).addBiometric(identifier);
+ }
+
+ @Override
+ public void removeBiometricForUser(Context ctx, int userId, int faceId) {
+ getStateForUser(ctx, userId).removeBiometric(faceId);
+ }
+
+ @Override
+ public void renameBiometricForUser(Context ctx, int userId, int faceId, CharSequence name) {
+ if (TextUtils.isEmpty(name)) {
+ // Don't do the rename if it's empty
+ return;
+ }
+ getStateForUser(ctx, userId).renameBiometric(faceId, name);
+ }
+
+ @Override
+ public CharSequence getUniqueName(Context context, int userId) {
+ return getStateForUser(context, userId).getUniqueName();
+ }
+
+ private FaceUserState getStateForUser(Context ctx, int userId) {
+ synchronized (this) {
+ FaceUserState state = mUsers.get(userId);
+ if (state == null) {
+ state = new FaceUserState(ctx, userId);
+ mUsers.put(userId, state);
+ }
+ return state;
+ }
+ }
+}
+
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintMetrics.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintMetrics.java
new file mode 100644
index 000000000000..ba8b3b314c00
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintMetrics.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.biometrics.fingerprint;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.server.biometrics.common.Metrics;
+
+public class FingerprintMetrics implements Metrics {
+
+ @Override
+ public String logTag() {
+ return FingerprintService.TAG;
+ }
+
+ @Override
+ public String tagHalDied() {
+ return "fingerprintd_died";
+ }
+
+ @Override
+ public String tagAuthToken() {
+ return "fingerprint_token";
+ }
+
+ @Override
+ public String tagAuthStartError() {
+ return "fingerprintd_auth_start_error";
+ }
+
+ @Override
+ public String tagEnrollStartError() {
+ return "fingerprintd_enroll_start_error";
+ }
+
+ @Override
+ public String tagEnumerateStartError() {
+ return "fingerprintd_enum_start_error";
+ }
+
+ @Override
+ public String tagRemoveStartError() {
+ return "fingerprintd_remove_start_error";
+ }
+
+ @Override
+ public int actionBiometricAuth() {
+ return MetricsProto.MetricsEvent.ACTION_FINGERPRINT_AUTH;
+ }
+
+ @Override
+ public int actionBiometricEnroll() {
+ return MetricsProto.MetricsEvent.ACTION_FINGERPRINT_ENROLL;
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
new file mode 100644
index 000000000000..7004e1b37ed5
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -0,0 +1,1026 @@
+/*
+ * Copyright (C) 2014 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.biometrics.fingerprint;
+
+import static android.Manifest.permission.INTERACT_ACROSS_USERS;
+import static android.Manifest.permission.MANAGE_FINGERPRINT;
+import static android.Manifest.permission.RESET_FINGERPRINT_LOCKOUT;
+import static android.Manifest.permission.USE_BIOMETRIC;
+import static android.Manifest.permission.USE_FINGERPRINT;
+
+import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.biometrics.BiometricConstants;
+import android.hardware.biometrics.IBiometricPromptReceiver;
+import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
+import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
+import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprintClientCallback;
+import android.hardware.fingerprint.Fingerprint;
+import android.hardware.fingerprint.IFingerprintClientActiveCallback;
+import android.hardware.fingerprint.IFingerprintService;
+import android.hardware.fingerprint.IFingerprintServiceReceiver;
+import android.os.Binder;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.IBinder;
+import android.os.PowerManager;
+import android.os.RemoteException;
+import android.os.SELinux;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Slog;
+import android.util.proto.ProtoOutputStream;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.util.DumpUtils;
+import com.android.server.SystemServerInitThreadPool;
+import com.android.server.biometrics.common.BiometricService;
+import com.android.server.biometrics.common.BiometricUtils;
+import com.android.server.biometrics.common.ClientMonitor;
+import com.android.server.biometrics.common.EnumerateClient;
+import com.android.server.biometrics.common.Metrics;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * A service to manage multiple clients that want to access the fingerprint HAL API.
+ * The service is responsible for maintaining a list of clients and dispatching all
+ * fingerprint-related events.
+ *
+ * @hide
+ */
+public class FingerprintService extends BiometricService {
+
+ protected static final String TAG = "FingerprintService";
+ private static final boolean DEBUG = true;
+ private static final boolean CLEANUP_UNUSED_FP = true;
+ private static final String FP_DATA_DIR = "fpdata";
+ private static final String ACTION_LOCKOUT_RESET =
+ "com.android.server.biometrics.fingerprint.ACTION_LOCKOUT_RESET";
+ private static final int MAX_FAILED_ATTEMPTS_LOCKOUT_TIMED = 5;
+ private static final int MAX_FAILED_ATTEMPTS_LOCKOUT_PERMANENT = 20;
+
+ // TODO: This should be refactored into BiometricService
+ private final class UserFingerprint {
+ Fingerprint f;
+ int userId;
+ public UserFingerprint(Fingerprint f, int userId) {
+ this.f = f;
+ this.userId = userId;
+ }
+ }
+
+ /**
+ * Receives the incoming binder calls from FingerprintManager.
+ */
+ private final class FingerprintServiceWrapper extends IFingerprintService.Stub {
+
+ /**
+ * The following methods contain common code which is shared in biometrics/common.
+ */
+
+ @Override // Binder call
+ public long preEnroll(IBinder token) {
+ checkPermission(MANAGE_FINGERPRINT);
+ return startPreEnroll(token);
+ }
+
+ @Override // Binder call
+ public int postEnroll(IBinder token) {
+ checkPermission(MANAGE_FINGERPRINT);
+ return startPostEnroll(token);
+ }
+
+ @Override // Binder call
+ public void enroll(final IBinder token, final byte[] cryptoToken, final int userId,
+ final IFingerprintServiceReceiver receiver, final int flags,
+ final String opPackageName) {
+ checkPermission(MANAGE_FINGERPRINT);
+
+ final boolean restricted = isRestricted();
+ final int groupId = userId; // default group for fingerprint enrollment
+ final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper,
+ mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId, groupId,
+ cryptoToken, restricted, opPackageName);
+
+ enrollInternal(client, userId);
+ }
+
+ @Override // Binder call
+ public void cancelEnrollment(final IBinder token) {
+ checkPermission(MANAGE_FINGERPRINT);
+ cancelEnrollmentInternal(token);
+ }
+
+ @Override // Binder call
+ public void authenticate(final IBinder token, final long opId, final int groupId,
+ final IFingerprintServiceReceiver receiver, final int flags,
+ final String opPackageName, final Bundle bundle,
+ final IBiometricPromptReceiver dialogReceiver) {
+ final boolean restricted = isRestricted();
+ final AuthenticationClientImpl client = new AuthenticationClientImpl(getContext(),
+ mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver),
+ mCurrentUserId, groupId, opId, restricted, opPackageName, bundle,
+ dialogReceiver, mStatusBarService);
+
+ authenticateInternal(client, opId, opPackageName);
+ }
+
+ @Override // Binder call
+ public void cancelAuthentication(final IBinder token, final String opPackageName) {
+ cancelAuthenticationInternal(token, opPackageName);
+ }
+
+ @Override // Binder call
+ public void setActiveUser(final int userId) {
+ checkPermission(MANAGE_FINGERPRINT);
+ setActiveUserInternal(userId);
+ }
+
+ @Override // Binder call
+ public void remove(final IBinder token, final int fingerId, final int groupId,
+ final int userId, final IFingerprintServiceReceiver receiver) {
+ checkPermission(MANAGE_FINGERPRINT);
+
+ if (token == null) {
+ Slog.w(TAG, "remove(): token is null");
+ return;
+ }
+
+ final boolean restricted = isRestricted();
+ final RemovalClientImpl client = new RemovalClientImpl(getContext(), mDaemonWrapper,
+ mHalDeviceId, token, new ServiceListenerImpl(receiver), fingerId, groupId,
+ userId, restricted, token.toString());
+ client.setShouldNotifyUserActivity(true);
+ removeInternal(client);
+ }
+
+ @Override // Binder call
+ public void enumerate(final IBinder token, final int userId,
+ final IFingerprintServiceReceiver receiver) {
+ checkPermission(MANAGE_FINGERPRINT);
+
+ final boolean restricted = isRestricted();
+ final EnumerateClientImpl client = new EnumerateClientImpl(getContext(), mDaemonWrapper,
+ mHalDeviceId, token, new ServiceListenerImpl(receiver), userId, userId,
+ restricted, getContext().getOpPackageName());
+ enumerateInternal(client);
+ }
+
+ @Override
+ public void addLockoutResetCallback(final IBiometricServiceLockoutResetCallback callback)
+ throws RemoteException {
+ FingerprintService.super.addLockoutResetCallback(callback);
+ }
+
+ @Override // Binder call
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) {
+ return;
+ }
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ if (args.length > 0 && "--proto".equals(args[0])) {
+ dumpProto(fd);
+ } else {
+ dumpInternal(pw);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * The following methods don't use any common code from BiometricService
+ */
+
+ // TODO: refactor out common code here
+ @Override // Binder call
+ public boolean isHardwareDetected(long deviceId, String opPackageName) {
+ if (!canUseBiometric(opPackageName, false /* foregroundOnly */,
+ Binder.getCallingUid(), Binder.getCallingPid(),
+ UserHandle.getCallingUserId())) {
+ return false;
+ }
+
+ final long token = Binder.clearCallingIdentity();
+ try {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+ return daemon != null && mHalDeviceId != 0;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override // Binder call
+ public void rename(final int fingerId, final int groupId, final String name) {
+ checkPermission(MANAGE_FINGERPRINT);
+ if (!isCurrentUserOrProfile(groupId)) {
+ return;
+ }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ getBiometricUtils().renameBiometricForUser(getContext(), groupId,
+ fingerId, name);
+ }
+ });
+ }
+
+ @Override // Binder call
+ public List<Fingerprint> getEnrolledFingerprints(int userId, String opPackageName) {
+ if (!canUseBiometric(opPackageName, false /* foregroundOnly */,
+ Binder.getCallingUid(), Binder.getCallingPid(),
+ UserHandle.getCallingUserId())) {
+ return Collections.emptyList();
+ }
+
+ return FingerprintService.this.getEnrolledFingerprints(userId);
+ }
+
+ @Override // Binder call
+ public boolean hasEnrolledFingerprints(int userId, String opPackageName) {
+ if (!canUseBiometric(opPackageName, false /* foregroundOnly */,
+ Binder.getCallingUid(), Binder.getCallingPid(),
+ UserHandle.getCallingUserId())) {
+ return false;
+ }
+
+ return FingerprintService.this.hasEnrolledBiometrics(userId);
+ }
+
+ @Override // Binder call
+ public long getAuthenticatorId(String opPackageName) {
+ // In this method, we're not checking whether the caller is permitted to use fingerprint
+ // API because current authenticator ID is leaked (in a more contrived way) via Android
+ // Keystore (android.security.keystore package): the user of that API can create a key
+ // which requires fingerprint authentication for its use, and then query the key's
+ // characteristics (hidden API) which returns, among other things, fingerprint
+ // authenticator ID which was active at key creation time.
+ //
+ // Reason: The part of Android Keystore which runs inside an app's process invokes this
+ // method in certain cases. Those cases are not always where the developer demonstrates
+ // explicit intent to use fingerprint functionality. Thus, to avoiding throwing an
+ // unexpected SecurityException this method does not check whether its caller is
+ // permitted to use fingerprint API.
+ //
+ // The permission check should be restored once Android Keystore no longer invokes this
+ // method from inside app processes.
+
+ return FingerprintService.super.getAuthenticatorId(opPackageName);
+ }
+
+ @Override // Binder call
+ public void resetTimeout(byte [] token) {
+ checkPermission(RESET_FINGERPRINT_LOCKOUT);
+ // TODO: confirm security token when we move timeout management into the HAL layer.
+ mHandler.post(mResetFailedAttemptsForCurrentUserRunnable);
+ }
+
+ @Override
+ public boolean isClientActive() {
+ checkPermission(MANAGE_FINGERPRINT);
+ synchronized(FingerprintService.this) {
+ return (getCurrentClient() != null) || (getPendingClient() != null);
+ }
+ }
+
+ @Override
+ public void addClientActiveCallback(IFingerprintClientActiveCallback callback) {
+ checkPermission(MANAGE_FINGERPRINT);
+ mClientActiveCallbacks.add(callback);
+ }
+
+ @Override
+ public void removeClientActiveCallback(IFingerprintClientActiveCallback callback) {
+ checkPermission(MANAGE_FINGERPRINT);
+ mClientActiveCallbacks.remove(callback);
+ }
+ }
+
+ /**
+ * Receives callbacks from the ClientMonitor implementations. The results are forwarded to
+ * the FingerprintManager.
+ */
+ private class ServiceListenerImpl implements ServiceListener {
+
+ private IFingerprintServiceReceiver mFingerprintServiceReceiver;
+
+ public ServiceListenerImpl(IFingerprintServiceReceiver receiver) {
+ mFingerprintServiceReceiver = receiver;
+ }
+
+ @Override
+ public void onEnrollResult(BiometricAuthenticator.Identifier identifier, int remaining)
+ throws RemoteException {
+ if (mFingerprintServiceReceiver != null) {
+ // TODO: Pass up the fp directly instead
+ final Fingerprint fp = (Fingerprint) identifier;
+ mFingerprintServiceReceiver.onEnrollResult(fp.getDeviceId(), fp.getBiometricId(),
+ fp.getGroupId(), remaining);
+ }
+ }
+
+ @Override
+ public void onAcquired(long deviceId, int acquiredInfo, int vendorCode)
+ throws RemoteException {
+ if (mFingerprintServiceReceiver != null) {
+ mFingerprintServiceReceiver.onAcquired(deviceId, acquiredInfo, vendorCode);
+ }
+ }
+
+ @Override
+ public void onAuthenticationSucceeded(long deviceId,
+ BiometricAuthenticator.Identifier biometric, int userId)
+ throws RemoteException {
+ if (mFingerprintServiceReceiver != null) {
+ if (biometric == null || biometric instanceof Fingerprint) {
+ mFingerprintServiceReceiver
+ .onAuthenticationSucceeded(deviceId, (Fingerprint) biometric, userId);
+ } else {
+ Slog.e(TAG, "onAuthenticationSucceeded received non-fingerprint biometric");
+ }
+ }
+ }
+
+ @Override
+ public void onAuthenticationFailed(long deviceId) throws RemoteException {
+ if (mFingerprintServiceReceiver != null) {
+ mFingerprintServiceReceiver.onAuthenticationFailed(deviceId);
+ }
+ }
+
+ @Override
+ public void onError(long deviceId, int error, int vendorCode) throws RemoteException {
+ if (mFingerprintServiceReceiver != null) {
+ mFingerprintServiceReceiver.onError(deviceId, error, vendorCode);
+ }
+ }
+
+ @Override
+ public void onRemoved(BiometricAuthenticator.Identifier identifier, int remaining)
+ throws RemoteException {
+ if (mFingerprintServiceReceiver != null) {
+ // TODO: Pass up the fp directly instead
+ final Fingerprint fp = (Fingerprint) identifier;
+ mFingerprintServiceReceiver.onRemoved(fp.getDeviceId(), fp.getBiometricId(),
+ fp.getGroupId(), remaining);
+ }
+ }
+
+ @Override
+ public void onEnumerated(BiometricAuthenticator.Identifier identifier, int remaining)
+ throws RemoteException {
+ if (mFingerprintServiceReceiver != null) {
+ final Fingerprint fp = (Fingerprint) identifier;
+ mFingerprintServiceReceiver.onEnumerated(fp.getDeviceId(), fp.getBiometricId(),
+ fp.getGroupId(), remaining);
+ }
+ }
+ }
+
+ /**
+ * An internal class to help clean up unknown fingerprints in the hardware and software.
+ */
+ private final class InternalEnumerateClient extends BiometricService.EnumerateClientImpl {
+
+ private List<Fingerprint> mEnrolledList;
+ private List<Fingerprint> mUnknownFingerprints = new ArrayList<>(); // list of fp to delete
+
+ public InternalEnumerateClient(Context context, DaemonWrapper daemon, long halDeviceId,
+ IBinder token, ServiceListener listener, int groupId, int userId,
+ boolean restricted, String owner, List<Fingerprint> enrolledList) {
+ super(context, daemon, halDeviceId, token, listener, groupId, userId, restricted,
+ owner);
+ mEnrolledList = enrolledList;
+ }
+
+ private void handleEnumeratedFingerprint(
+ BiometricAuthenticator.Identifier identifier, int remaining) {
+ boolean matched = false;
+ for (int i = 0; i < mEnrolledList.size(); i++) {
+ if (mEnrolledList.get(i).getBiometricId() == identifier.getBiometricId()) {
+ mEnrolledList.remove(i);
+ matched = true;
+ break;
+ }
+ }
+
+ // fingerId 0 means no fingerprints are in hardware
+ if (!matched && identifier.getBiometricId() != 0) {
+ mUnknownFingerprints.add((Fingerprint) identifier);
+ }
+ }
+
+ private void doFingerprintCleanup() {
+ if (mEnrolledList == null) {
+ return;
+ }
+
+ for (Fingerprint f : mEnrolledList) {
+ Slog.e(TAG, "doFingerprintCleanup(): Removing dangling enrolled fingerprint: "
+ + f.getName() + " " + f.getBiometricId() + " " + f.getGroupId()
+ + " " + f.getDeviceId());
+ FingerprintUtils.getInstance().removeBiometricForUser(getContext(),
+ getTargetUserId(), f.getBiometricId());
+ }
+ mEnrolledList.clear();
+ }
+
+ public List<Fingerprint> getUnknownFingerprints() {
+ return mUnknownFingerprints;
+ }
+
+ @Override
+ public boolean onEnumerationResult(BiometricAuthenticator.Identifier identifier,
+ int remaining) {
+ handleEnumeratedFingerprint(identifier, remaining);
+ if (remaining == 0) {
+ doFingerprintCleanup();
+ }
+ return remaining == 0;
+ }
+ }
+
+ /**
+ * An internal class to help clean up unknown fingerprints in hardware and software.
+ */
+ private final class InternalRemovalClient extends BiometricService.RemovalClientImpl {
+ public InternalRemovalClient(Context context,
+ DaemonWrapper daemon, long halDeviceId, IBinder token,
+ ServiceListener listener, int fingerId, int groupId, int userId, boolean restricted,
+ String owner) {
+ super(context, daemon, halDeviceId, token, listener, fingerId, groupId, userId,
+ restricted,
+ owner);
+ }
+ }
+
+ private final FingerprintMetrics mFingerprintMetrics = new FingerprintMetrics();
+ private final CopyOnWriteArrayList<IFingerprintClientActiveCallback> mClientActiveCallbacks =
+ new CopyOnWriteArrayList<>();
+
+ @GuardedBy("this")
+ private IBiometricsFingerprint mDaemon;
+
+ private long mHalDeviceId;
+ private IStatusBarService mStatusBarService;
+ private IBinder mToken = new Binder(); // used for internal FingerprintService enumeration
+ private ArrayList<UserFingerprint> mUnknownFingerprints = new ArrayList<>(); // hw fingerprints
+
+ /**
+ * Receives callbacks from the HAL.
+ */
+ private IBiometricsFingerprintClientCallback mDaemonCallback =
+ new IBiometricsFingerprintClientCallback.Stub() {
+ @Override
+ public void onEnrollResult(final long deviceId, final int fingerId, final int groupId,
+ final int remaining) {
+ mHandler.post(() -> {
+ final Fingerprint fingerprint =
+ new Fingerprint(getBiometricUtils().getUniqueName(getContext(), groupId),
+ groupId, fingerId, deviceId);
+ FingerprintService.super.handleEnrollResult(fingerprint, remaining);
+ });
+ }
+
+ @Override
+ public void onAcquired(final long deviceId, final int acquiredInfo, final int vendorCode) {
+ mHandler.post(() -> {
+ FingerprintService.super.handleAcquired(deviceId, acquiredInfo, vendorCode);
+ });
+ }
+
+ @Override
+ public void onAuthenticated(final long deviceId, final int fingerId, final int groupId,
+ ArrayList<Byte> token) {
+ mHandler.post(() -> {
+ FingerprintService.super.handleAuthenticated(deviceId, fingerId, groupId, token);
+ });
+ }
+
+ @Override
+ public void onError(final long deviceId, final int error, final int vendorCode) {
+ mHandler.post(() -> {
+ ClientMonitor client = getCurrentClient();
+ if (client instanceof InternalRemovalClient
+ || client instanceof InternalEnumerateClient) {
+ clearEnumerateState();
+ }
+ FingerprintService.super.handleError(deviceId, error, vendorCode);
+
+ // TODO: this chunk of code should be common to all biometric services
+ if (error == BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE) {
+ // If we get HW_UNAVAILABLE, try to connect again later...
+ Slog.w(TAG, "Got ERROR_HW_UNAVAILABLE; try reconnecting next client.");
+ synchronized (this) {
+ mDaemon = null;
+ mHalDeviceId = 0;
+ mCurrentUserId = UserHandle.USER_NULL;
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onRemoved(final long deviceId, final int fingerId, final int groupId,
+ final int remaining) {
+ mHandler.post(() -> {
+ ClientMonitor client = getCurrentClient();
+ final Fingerprint fp = new Fingerprint("", groupId, fingerId, deviceId);
+ FingerprintService.super.handleRemoved(fp, remaining);
+ if (client instanceof InternalRemovalClient && !mUnknownFingerprints.isEmpty()) {
+ cleanupUnknownFingerprints();
+ } else if (client instanceof InternalRemovalClient){
+ clearEnumerateState();
+ }
+ });
+ }
+
+ @Override
+ public void onEnumerate(final long deviceId, final int fingerId, final int groupId,
+ final int remaining) {
+ mHandler.post(() -> {
+ // TODO: factor out common enumerate logic if possible
+ final Fingerprint fp = new Fingerprint("", groupId, fingerId, deviceId);
+ FingerprintService.this.handleEnumerate(fp, remaining);
+ });
+
+ }
+ };
+
+ /**
+ * Wraps the HAL-specific code and is passed to the ClientMonitor implementations so that they
+ * can be shared between the multiple biometric services.
+ */
+ private final DaemonWrapper mDaemonWrapper = new DaemonWrapper() {
+ @Override
+ public int authenticate(long operationId, int groupId) throws RemoteException {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "authenticate(): no fingerprint HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.authenticate(operationId, groupId);
+ }
+
+ @Override
+ public int cancel() throws RemoteException {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "cancel(): no fingerprint HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.cancel();
+ }
+
+ @Override
+ public int remove(int groupId, int biometricId) throws RemoteException {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "remove(): no fingerprint HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.remove(groupId, biometricId);
+ }
+
+ @Override
+ public int enumerate() throws RemoteException {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "enumerate(): no fingerprint HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.enumerate();
+ }
+
+ @Override
+ public int enroll(byte[] cryptoToken, int groupId, int timeout) throws RemoteException {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "enroll(): no fingerprint HAL!");
+ return ERROR_ESRCH;
+ }
+ return daemon.enroll(cryptoToken, groupId, timeout);
+ }
+ };
+
+ public FingerprintService(Context context) {
+ super(context);
+ // TODO: can this be retrieved from AuthenticationClient, or BiometricService?
+ mStatusBarService = IStatusBarService.Stub.asInterface(
+ ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ publishBinderService(Context.FINGERPRINT_SERVICE, new FingerprintServiceWrapper());
+ SystemServerInitThreadPool.get().submit(this::getFingerprintDaemon, TAG + ".onStart");
+ }
+
+ @Override
+ protected String getTag() {
+ return TAG;
+ }
+
+ @Override
+ protected BiometricUtils getBiometricUtils() {
+ return FingerprintUtils.getInstance();
+ }
+
+ @Override
+ protected int getFailedAttemptsLockoutTimed() {
+ return MAX_FAILED_ATTEMPTS_LOCKOUT_TIMED;
+ }
+
+ @Override
+ protected int getFailedAttemptsLockoutPermanent() {
+ return MAX_FAILED_ATTEMPTS_LOCKOUT_PERMANENT;
+ }
+
+ @Override
+ protected Metrics getMetrics() {
+ return mFingerprintMetrics;
+ }
+
+ @Override
+ protected boolean hasReachedEnrollmentLimit(int userId) {
+ final int limit = getContext().getResources().getInteger(
+ com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
+ final int enrolled = FingerprintService.this.getEnrolledFingerprints(userId).size();
+ if (enrolled >= limit) {
+ Slog.w(TAG, "Too many fingerprints registered");
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void updateActiveGroup(int userId, String clientPackage) {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+
+ if (daemon != null) {
+ try {
+ userId = getUserOrWorkProfileId(clientPackage, userId);
+ if (userId != mCurrentUserId) {
+ int firstSdkInt = Build.VERSION.FIRST_SDK_INT;
+ if (firstSdkInt < Build.VERSION_CODES.BASE) {
+ Slog.e(TAG, "First SDK version " + firstSdkInt + " is invalid; must be " +
+ "at least VERSION_CODES.BASE");
+ }
+ File baseDir;
+ if (firstSdkInt <= Build.VERSION_CODES.O_MR1) {
+ baseDir = Environment.getUserSystemDirectory(userId);
+ } else {
+ baseDir = Environment.getDataVendorDeDirectory(userId);
+ }
+
+ File fpDir = new File(baseDir, FP_DATA_DIR);
+ if (!fpDir.exists()) {
+ if (!fpDir.mkdir()) {
+ Slog.v(TAG, "Cannot make directory: " + fpDir.getAbsolutePath());
+ return;
+ }
+ // Calling mkdir() from this process will create a directory with our
+ // permissions (inherited from the containing dir). This command fixes
+ // the label.
+ if (!SELinux.restorecon(fpDir)) {
+ Slog.w(TAG, "Restorecons failed. Directory will have wrong label.");
+ return;
+ }
+ }
+
+ daemon.setActiveGroup(userId, fpDir.getAbsolutePath());
+ mCurrentUserId = userId;
+ }
+ mAuthenticatorIds.put(userId,
+ hasEnrolledBiometrics(userId) ? daemon.getAuthenticatorId() : 0L);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to setActiveGroup():", e);
+ }
+ }
+ }
+
+ @Override
+ protected String getLockoutResetIntent() {
+ return ACTION_LOCKOUT_RESET;
+ }
+
+ @Override
+ protected String getLockoutBroadcastPermission() {
+ return RESET_FINGERPRINT_LOCKOUT;
+ }
+
+ @Override
+ protected long getHalDeviceId() {
+ return mHalDeviceId;
+ }
+
+ @Override
+ protected void handleUserSwitching(int userId) {
+ if (getCurrentClient() instanceof InternalRemovalClient
+ || getCurrentClient() instanceof InternalEnumerateClient) {
+ Slog.w(TAG, "User switched while performing cleanup");
+ removeClient(getCurrentClient());
+ clearEnumerateState();
+ }
+ updateActiveGroup(userId, null);
+ doFingerprintCleanupForUser(userId);
+ }
+
+
+ @Override
+ protected boolean hasEnrolledBiometrics(int userId) {
+ if (userId != UserHandle.getCallingUserId()) {
+ checkPermission(INTERACT_ACROSS_USERS);
+ }
+ return getBiometricUtils().getBiometricsForUser(getContext(), userId).size() > 0;
+ }
+
+ @Override
+ protected String getManageBiometricPermission() {
+ return MANAGE_FINGERPRINT;
+ }
+
+ @Override
+ protected void checkUseBiometricPermission() {
+ if (getContext().checkCallingPermission(USE_FINGERPRINT)
+ != PackageManager.PERMISSION_GRANTED) {
+ checkPermission(USE_BIOMETRIC);
+ }
+ }
+
+ @Override
+ protected int getAppOp() {
+ return AppOpsManager.OP_USE_FINGERPRINT;
+ }
+
+ @Override
+ protected void notifyClientActiveCallbacks(boolean isActive) {
+ List<IFingerprintClientActiveCallback> callbacks = mClientActiveCallbacks;
+ for (int i = 0; i < callbacks.size(); i++) {
+ try {
+ callbacks.get(i).onClientActiveChanged(isActive);
+ } catch (RemoteException re) {
+ // If the remote is dead, stop notifying it
+ mClientActiveCallbacks.remove(callbacks.get(i));
+ }
+ }
+ }
+
+ /** Gets the fingerprint daemon */
+ private synchronized IBiometricsFingerprint getFingerprintDaemon() {
+ if (mDaemon == null) {
+ Slog.v(TAG, "mDaemon was null, reconnect to fingerprint");
+ try {
+ mDaemon = IBiometricsFingerprint.getService();
+ } catch (java.util.NoSuchElementException e) {
+ // Service doesn't exist or cannot be opened. Logged below.
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to get biometric interface", e);
+ }
+ if (mDaemon == null) {
+ Slog.w(TAG, "fingerprint HIDL not available");
+ return null;
+ }
+
+ mDaemon.asBinder().linkToDeath(this, 0);
+
+ try {
+ mHalDeviceId = mDaemon.setNotify(mDaemonCallback);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to open fingerprint HAL", e);
+ mDaemon = null; // try again later!
+ }
+
+ if (DEBUG) Slog.v(TAG, "Fingerprint HAL id: " + mHalDeviceId);
+ if (mHalDeviceId != 0) {
+ loadAuthenticatorIds();
+ updateActiveGroup(ActivityManager.getCurrentUser(), null);
+ doFingerprintCleanupForUser(ActivityManager.getCurrentUser());
+ } else {
+ Slog.w(TAG, "Failed to open Fingerprint HAL!");
+ MetricsLogger.count(getContext(), "fingerprintd_openhal_error", 1);
+ mDaemon = null;
+ }
+ }
+ return mDaemon;
+ }
+
+ /**
+ * This method should be called upon connection to the daemon, and when user switches.
+ * @param userId
+ */
+ private void doFingerprintCleanupForUser(int userId) {
+ if (CLEANUP_UNUSED_FP) {
+ enumerateUser(userId);
+ }
+ }
+
+ private void clearEnumerateState() {
+ if (DEBUG) Slog.v(TAG, "clearEnumerateState()");
+ mUnknownFingerprints.clear();
+ }
+
+ private void enumerateUser(int userId) {
+ if (DEBUG) Slog.v(TAG, "Enumerating user(" + userId + ")");
+
+ final boolean restricted = !hasPermission(MANAGE_FINGERPRINT);
+ final List<Fingerprint> enrolledList = getEnrolledFingerprints(userId);
+
+ InternalEnumerateClient client = new InternalEnumerateClient(getContext(), mDaemonWrapper,
+ mHalDeviceId, mToken, new ServiceListenerImpl(null), userId, userId, restricted,
+ getContext().getOpPackageName(), enrolledList);
+ enumerateInternal(client);
+ }
+
+ // Remove unknown fingerprints from hardware
+ private void cleanupUnknownFingerprints() {
+ if (!mUnknownFingerprints.isEmpty()) {
+ UserFingerprint uf = mUnknownFingerprints.get(0);
+ mUnknownFingerprints.remove(uf);
+ boolean restricted = !hasPermission(MANAGE_FINGERPRINT);
+ InternalRemovalClient client = new InternalRemovalClient(getContext(), mDaemonWrapper,
+ mHalDeviceId, mToken, new ServiceListenerImpl(null), uf.f.getBiometricId(),
+ uf.f.getGroupId(), uf.userId, restricted, getContext().getOpPackageName());
+ removeInternal(client);
+ } else {
+ clearEnumerateState();
+ }
+ }
+
+ private void handleEnumerate(Fingerprint fingerprint, int remaining) {
+ ClientMonitor client = getCurrentClient();
+
+ if ( !(client instanceof InternalRemovalClient) && !(client instanceof EnumerateClient) ) {
+ return;
+ }
+ client.onEnumerationResult(fingerprint, remaining);
+
+ // All fingerprints in hardware for this user were enumerated
+ if (remaining == 0) {
+ if (client instanceof InternalEnumerateClient) {
+ List<Fingerprint> unknownFingerprints =
+ ((InternalEnumerateClient) client).getUnknownFingerprints();
+
+ if (!unknownFingerprints.isEmpty()) {
+ Slog.w(TAG, "Adding " + unknownFingerprints.size() +
+ " fingerprints for deletion");
+ }
+ for (Fingerprint f : unknownFingerprints) {
+ mUnknownFingerprints.add(new UserFingerprint(f, client.getTargetUserId()));
+ }
+ removeClient(client);
+ cleanupUnknownFingerprints();
+ } else {
+ removeClient(client);
+ }
+ }
+ }
+
+ private long startPreEnroll(IBinder token) {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "startPreEnroll: no fingerprint HAL!");
+ return 0;
+ }
+ try {
+ return daemon.preEnroll();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "startPreEnroll failed", e);
+ }
+ return 0;
+ }
+
+ private int startPostEnroll(IBinder token) {
+ IBiometricsFingerprint daemon = getFingerprintDaemon();
+ if (daemon == null) {
+ Slog.w(TAG, "startPostEnroll: no fingerprint HAL!");
+ return 0;
+ }
+ try {
+ return daemon.postEnroll();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "startPostEnroll failed", e);
+ }
+ return 0;
+ }
+
+ private List<Fingerprint> getEnrolledFingerprints(int userId) {
+ return getBiometricUtils().getBiometricsForUser(getContext(), userId);
+ }
+
+ private void dumpInternal(PrintWriter pw) {
+ JSONObject dump = new JSONObject();
+ try {
+ dump.put("service", "Fingerprint Manager");
+
+ JSONArray sets = new JSONArray();
+ for (UserInfo user : UserManager.get(getContext()).getUsers()) {
+ final int userId = user.getUserHandle().getIdentifier();
+ final int N = getBiometricUtils().getBiometricsForUser(getContext(), userId).size();
+ PerformanceStats stats = mPerformanceMap.get(userId);
+ PerformanceStats cryptoStats = mCryptoPerformanceMap.get(userId);
+ JSONObject set = new JSONObject();
+ set.put("id", userId);
+ set.put("count", N);
+ set.put("accept", (stats != null) ? stats.accept : 0);
+ set.put("reject", (stats != null) ? stats.reject : 0);
+ set.put("acquire", (stats != null) ? stats.acquire : 0);
+ set.put("lockout", (stats != null) ? stats.lockout : 0);
+ set.put("permanentLockout", (stats != null) ? stats.permanentLockout : 0);
+ // cryptoStats measures statistics about secure fingerprint transactions
+ // (e.g. to unlock password storage, make secure purchases, etc.)
+ set.put("acceptCrypto", (cryptoStats != null) ? cryptoStats.accept : 0);
+ set.put("rejectCrypto", (cryptoStats != null) ? cryptoStats.reject : 0);
+ set.put("acquireCrypto", (cryptoStats != null) ? cryptoStats.acquire : 0);
+ set.put("lockoutCrypto", (cryptoStats != null) ? cryptoStats.lockout : 0);
+ set.put("permanentLockoutCrypto",
+ (cryptoStats != null) ? cryptoStats.permanentLockout : 0);
+ sets.put(set);
+ }
+
+ dump.put("prints", sets);
+ } catch (JSONException e) {
+ Slog.e(TAG, "dump formatting failure", e);
+ }
+ pw.println(dump);
+ }
+
+ private void dumpProto(FileDescriptor fd) {
+ final ProtoOutputStream proto = new ProtoOutputStream(fd);
+ for (UserInfo user : UserManager.get(getContext()).getUsers()) {
+ final int userId = user.getUserHandle().getIdentifier();
+
+ final long userToken = proto.start(FingerprintServiceDumpProto.USERS);
+
+ proto.write(FingerprintUserStatsProto.USER_ID, userId);
+ proto.write(FingerprintUserStatsProto.NUM_FINGERPRINTS,
+ getBiometricUtils().getBiometricsForUser(getContext(), userId).size());
+
+ // Normal fingerprint authentications (e.g. lockscreen)
+ final PerformanceStats normal = mPerformanceMap.get(userId);
+ if (normal != null) {
+ final long countsToken = proto.start(FingerprintUserStatsProto.NORMAL);
+ proto.write(PerformanceStatsProto.ACCEPT, normal.accept);
+ proto.write(PerformanceStatsProto.REJECT, normal.reject);
+ proto.write(PerformanceStatsProto.ACQUIRE, normal.acquire);
+ proto.write(PerformanceStatsProto.LOCKOUT, normal.lockout);
+ proto.write(PerformanceStatsProto.PERMANENT_LOCKOUT, normal.permanentLockout);
+ proto.end(countsToken);
+ }
+
+ // Statistics about secure fingerprint transactions (e.g. to unlock password
+ // storage, make secure purchases, etc.)
+ final PerformanceStats crypto = mCryptoPerformanceMap.get(userId);
+ if (crypto != null) {
+ final long countsToken = proto.start(FingerprintUserStatsProto.CRYPTO);
+ proto.write(PerformanceStatsProto.ACCEPT, crypto.accept);
+ proto.write(PerformanceStatsProto.REJECT, crypto.reject);
+ proto.write(PerformanceStatsProto.ACQUIRE, crypto.acquire);
+ proto.write(PerformanceStatsProto.LOCKOUT, crypto.lockout);
+ proto.write(PerformanceStatsProto.PERMANENT_LOCKOUT, crypto.permanentLockout);
+ proto.end(countsToken);
+ }
+
+ proto.end(userToken);
+ }
+ proto.flush();
+ mPerformanceMap.clear();
+ mCryptoPerformanceMap.clear();
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintUserState.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintUserState.java
new file mode 100644
index 000000000000..9e34ee80d383
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintUserState.java
@@ -0,0 +1,163 @@
+/*
+ * 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.biometrics.fingerprint;
+
+import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.hardware.fingerprint.Fingerprint;
+import android.util.AtomicFile;
+import android.util.Slog;
+import android.util.Xml;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.biometrics.common.BiometricUserState;
+
+import libcore.io.IoUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * Class managing the set of fingerprint per user across device reboots.
+ * @hide
+ */
+public class FingerprintUserState extends BiometricUserState {
+
+ private static final String TAG = "FingerprintState";
+ private static final String FINGERPRINT_FILE = "settings_fingerprint.xml";
+
+ private static final String TAG_FINGERPRINTS = "fingerprints";
+ private static final String TAG_FINGERPRINT = "fingerprint";
+ private static final String ATTR_NAME = "name";
+ private static final String ATTR_GROUP_ID = "groupId";
+ private static final String ATTR_FINGER_ID = "fingerId";
+ private static final String ATTR_DEVICE_ID = "deviceId";
+
+ public FingerprintUserState(Context context, int userId) {
+ super(context, userId);
+ }
+
+ @Override
+ protected String getBiometricsTag() {
+ return TAG_FINGERPRINTS;
+ }
+
+ @Override
+ protected String getBiometricFile() {
+ return FINGERPRINT_FILE;
+ }
+
+ @Override
+ protected int getNameTemplateResource() {
+ return com.android.internal.R.string.fingerprint_name_template;
+ }
+
+ @Override
+ public void addBiometric(BiometricAuthenticator.Identifier identifier) {
+ if (identifier instanceof Fingerprint) {
+ super.addBiometric(identifier);
+ } else {
+ Slog.w(TAG, "Attempted to add non-fingerprint identifier");
+ }
+ }
+
+ @Override
+ protected ArrayList getCopy(ArrayList array) {
+ ArrayList<Fingerprint> result = new ArrayList<>();
+ for (int i = 0; i < array.size(); i++) {
+ Fingerprint fp = (Fingerprint) array.get(i);
+ result.add(new Fingerprint(fp.getName(), fp.getGroupId(), fp.getBiometricId(),
+ fp.getDeviceId()));
+ }
+ return result;
+ }
+
+ @Override
+ protected void doWriteState() {
+ AtomicFile destination = new AtomicFile(mFile);
+
+ ArrayList<Fingerprint> fingerprints;
+
+ synchronized (this) {
+ fingerprints = getCopy(mBiometrics);
+ }
+
+ FileOutputStream out = null;
+ try {
+ out = destination.startWrite();
+
+ XmlSerializer serializer = Xml.newSerializer();
+ serializer.setOutput(out, "utf-8");
+ serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+ serializer.startDocument(null, true);
+ serializer.startTag(null, TAG_FINGERPRINTS);
+
+ final int count = fingerprints.size();
+ for (int i = 0; i < count; i++) {
+ Fingerprint fp = fingerprints.get(i);
+ serializer.startTag(null, TAG_FINGERPRINT);
+ serializer.attribute(null, ATTR_FINGER_ID, Integer.toString(fp.getBiometricId()));
+ serializer.attribute(null, ATTR_NAME, fp.getName().toString());
+ serializer.attribute(null, ATTR_GROUP_ID, Integer.toString(fp.getGroupId()));
+ serializer.attribute(null, ATTR_DEVICE_ID, Long.toString(fp.getDeviceId()));
+ serializer.endTag(null, TAG_FINGERPRINT);
+ }
+
+ serializer.endTag(null, TAG_FINGERPRINTS);
+ serializer.endDocument();
+ destination.finishWrite(out);
+
+ // Any error while writing is fatal.
+ } catch (Throwable t) {
+ Slog.wtf(TAG, "Failed to write settings, restoring backup", t);
+ destination.failWrite(out);
+ throw new IllegalStateException("Failed to write fingerprints", t);
+ } finally {
+ IoUtils.closeQuietly(out);
+ }
+ }
+
+ @GuardedBy("this")
+ @Override
+ protected void parseBiometricsLocked(XmlPullParser parser)
+ throws IOException, XmlPullParserException {
+
+ final int outerDepth = parser.getDepth();
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+
+ String tagName = parser.getName();
+ if (tagName.equals(TAG_FINGERPRINT)) {
+ String name = parser.getAttributeValue(null, ATTR_NAME);
+ String groupId = parser.getAttributeValue(null, ATTR_GROUP_ID);
+ String fingerId = parser.getAttributeValue(null, ATTR_FINGER_ID);
+ String deviceId = parser.getAttributeValue(null, ATTR_DEVICE_ID);
+ mBiometrics.add(new Fingerprint(name, Integer.parseInt(groupId),
+ Integer.parseInt(fingerId), Long.parseLong(deviceId)));
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintUtils.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintUtils.java
index 5fbd735d4ac5..41216e972ebd 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintUtils.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintUtils.java
@@ -14,27 +14,29 @@
* limitations under the License.
*/
-package com.android.server.fingerprint;
+package com.android.server.biometrics.fingerprint;
import android.content.Context;
+import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.fingerprint.Fingerprint;
import android.text.TextUtils;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.server.biometrics.common.BiometricUtils;
import java.util.List;
/**
* Utility class for dealing with fingerprints and fingerprint settings.
*/
-public class FingerprintUtils {
+public class FingerprintUtils implements BiometricUtils {
private static final Object sInstanceLock = new Object();
private static FingerprintUtils sInstance;
@GuardedBy("this")
- private final SparseArray<FingerprintsUserState> mUsers = new SparseArray<>();
+ private final SparseArray<FingerprintUserState> mUsers = new SparseArray<>();
public static FingerprintUtils getInstance() {
synchronized (sInstanceLock) {
@@ -48,31 +50,42 @@ public class FingerprintUtils {
private FingerprintUtils() {
}
- public List<Fingerprint> getFingerprintsForUser(Context ctx, int userId) {
- return getStateForUser(ctx, userId).getFingerprints();
+ @Override
+ public List<Fingerprint> getBiometricsForUser(Context ctx, int userId) {
+ return getStateForUser(ctx, userId).getBiometrics();
}
- public void addFingerprintForUser(Context ctx, int fingerId, int userId) {
- getStateForUser(ctx, userId).addFingerprint(fingerId, userId);
+ @Override
+ public void addBiometricForUser(Context context, int userId,
+ BiometricAuthenticator.Identifier identifier) {
+ getStateForUser(context, userId).addBiometric(identifier);
}
- public void removeFingerprintIdForUser(Context ctx, int fingerId, int userId) {
- getStateForUser(ctx, userId).removeFingerprint(fingerId);
+ @Override
+ public void removeBiometricForUser(Context context, int userId, int fingerId) {
+ getStateForUser(context, userId).removeBiometric(fingerId);
}
- public void renameFingerprintForUser(Context ctx, int fingerId, int userId, CharSequence name) {
+ @Override
+ public void renameBiometricForUser(Context context, int userId, int fingerId,
+ CharSequence name) {
if (TextUtils.isEmpty(name)) {
// Don't do the rename if it's empty
return;
}
- getStateForUser(ctx, userId).renameFingerprint(fingerId, name);
+ getStateForUser(context, userId).renameBiometric(fingerId, name);
}
- private FingerprintsUserState getStateForUser(Context ctx, int userId) {
+ @Override
+ public CharSequence getUniqueName(Context context, int userId) {
+ return getStateForUser(context, userId).getUniqueName();
+ }
+
+ private FingerprintUserState getStateForUser(Context ctx, int userId) {
synchronized (this) {
- FingerprintsUserState state = mUsers.get(userId);
+ FingerprintUserState state = mUsers.get(userId);
if (state == null) {
- state = new FingerprintsUserState(ctx, userId);
+ state = new FingerprintUserState(ctx, userId);
mUsers.put(userId, state);
}
return state;
diff --git a/services/core/java/com/android/server/connectivity/PacManager.java b/services/core/java/com/android/server/connectivity/PacManager.java
index 3a27fcb352aa..c370959dd2cf 100644
--- a/services/core/java/com/android/server/connectivity/PacManager.java
+++ b/services/core/java/com/android/server/connectivity/PacManager.java
@@ -90,7 +90,7 @@ public class PacManager {
private volatile boolean mHasDownloaded;
private Handler mConnectivityHandler;
- private int mProxyMessage;
+ private final int mProxyMessage;
/**
* Used for locking when setting mProxyService and all references to mCurrentPac.
@@ -99,7 +99,7 @@ public class PacManager {
/**
* Runnable to download PAC script.
- * The behavior relies on the assamption it always run on mNetThread to guarantee that the
+ * The behavior relies on the assumption it always runs on mNetThread to guarantee that the
* latest data fetched from mPacUrl is stored in mProxyService.
*/
private Runnable mPacDownloader = new Runnable() {
@@ -133,8 +133,6 @@ public class PacManager {
}
};
- private final HandlerThread mNetThread = new HandlerThread("android.pacmanager",
- android.os.Process.THREAD_PRIORITY_DEFAULT);
private final Handler mNetThreadHandler;
class PacRefreshIntentReceiver extends BroadcastReceiver {
@@ -146,8 +144,10 @@ public class PacManager {
public PacManager(Context context, Handler handler, int proxyMessage) {
mContext = context;
mLastPort = -1;
- mNetThread.start();
- mNetThreadHandler = new Handler(mNetThread.getLooper());
+ final HandlerThread netThread = new HandlerThread("android.pacmanager",
+ android.os.Process.THREAD_PRIORITY_DEFAULT);
+ netThread.start();
+ mNetThreadHandler = new Handler(netThread.getLooper());
mPacRefreshIntent = PendingIntent.getBroadcast(
context, 0, new Intent(ACTION_PAC_REFRESH), 0);
@@ -166,14 +166,14 @@ public class PacManager {
/**
* Updates the PAC Manager with current Proxy information. This is called by
- * the ConnectivityService directly before a broadcast takes place to allow
+ * the ProxyTracker directly before a broadcast takes place to allow
* the PacManager to indicate that the broadcast should not be sent and the
* PacManager will trigger a new broadcast when it is ready.
*
* @param proxy Proxy information that is about to be broadcast.
* @return Returns true when the broadcast should not be sent
*/
- public synchronized boolean setCurrentProxyScriptUrl(ProxyInfo proxy) {
+ synchronized boolean setCurrentProxyScriptUrl(ProxyInfo proxy) {
if (!Uri.EMPTY.equals(proxy.getPacFileUrl())) {
if (proxy.getPacFileUrl().equals(mPacUrl) && (proxy.getPort() > 0)) {
// Allow to send broadcast, nothing to do.
@@ -208,7 +208,7 @@ public class PacManager {
/**
* Does a post and reports back the status code.
*
- * @throws IOException
+ * @throws IOException if the URL is malformed, or the PAC file is too big.
*/
private static String get(Uri pacUri) throws IOException {
URL url = new URL(pacUri.toString());
@@ -254,7 +254,7 @@ public class PacManager {
private String getPacChangeDelay() {
final ContentResolver cr = mContext.getContentResolver();
- /** Check system properties for the default value then use secure settings value, if any. */
+ // Check system properties for the default value then use secure settings value, if any.
String defaultDelay = SystemProperties.get(
"conn." + Settings.Global.PAC_CHANGE_DELAY,
DEFAULT_DELAYS);
@@ -276,10 +276,9 @@ public class PacManager {
getAlarmManager().set(AlarmManager.ELAPSED_REALTIME, timeTillTrigger, mPacRefreshIntent);
}
- private boolean setCurrentProxyScript(String script) {
+ private void setCurrentProxyScript(String script) {
if (mProxyService == null) {
Log.e(TAG, "setCurrentProxyScript: no proxy service");
- return false;
}
try {
mProxyService.setPacFile(script);
@@ -287,7 +286,6 @@ public class PacManager {
} catch (RemoteException e) {
Log.e(TAG, "Unable to set PAC file", e);
}
- return true;
}
private void bind() {
@@ -351,7 +349,7 @@ public class PacManager {
try {
callbackService.getProxyPort(new IProxyPortListener.Stub() {
@Override
- public void setProxyPort(int port) throws RemoteException {
+ public void setProxyPort(int port) {
if (mLastPort != -1) {
// Always need to send if port changed
mHasSentBroadcast = false;
diff --git a/services/core/java/com/android/server/connectivity/ProxyTracker.java b/services/core/java/com/android/server/connectivity/ProxyTracker.java
new file mode 100644
index 000000000000..dc65e1e69834
--- /dev/null
+++ b/services/core/java/com/android/server/connectivity/ProxyTracker.java
@@ -0,0 +1,256 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.connectivity;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Proxy;
+import android.net.ProxyInfo;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Slog;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.Objects;
+
+/**
+ * A class to handle proxy for ConnectivityService.
+ *
+ * @hide
+ */
+public class ProxyTracker {
+ private static final String TAG = ProxyTracker.class.getSimpleName();
+ private static final boolean DBG = true;
+
+ @NonNull
+ private final Context mContext;
+
+ // TODO : make this private and import as much managing logic from ConnectivityService as
+ // possible
+ @NonNull
+ public final Object mProxyLock = new Object();
+ // The global proxy is the proxy that is set device-wide, overriding any network-specific
+ // proxy. Note however that proxies are hints ; the system does not enforce their use. Hence
+ // this value is only for querying.
+ @Nullable
+ @GuardedBy("mProxyLock")
+ public ProxyInfo mGlobalProxy = null;
+ // The default proxy is the proxy that applies to no particular network if the global proxy
+ // is not set. Individual networks have their own settings that override this. This member
+ // is set through setDefaultProxy, which is called when the default network changes proxies
+ // in its LinkProperties, or when ConnectivityService switches to a new default network, or
+ // when PacManager resolves the proxy.
+ @Nullable
+ @GuardedBy("mProxyLock")
+ public volatile ProxyInfo mDefaultProxy = null;
+ // Whether the default proxy is disabled. TODO : make this mDefaultProxyEnabled
+ @GuardedBy("mProxyLock")
+ public boolean mDefaultProxyDisabled = false;
+
+ // The object responsible for Proxy Auto Configuration (PAC).
+ @NonNull
+ private final PacManager mPacManager;
+
+ public ProxyTracker(@NonNull final Context context,
+ @NonNull final Handler connectivityServiceInternalHandler, final int pacChangedEvent) {
+ mContext = context;
+ mPacManager = new PacManager(context, connectivityServiceInternalHandler, pacChangedEvent);
+ }
+
+ // Convert empty ProxyInfo's to null as null-checks are used to determine if proxies are present
+ // (e.g. if mGlobalProxy==null fall back to network-specific proxy, if network-specific
+ // proxy is null then there is no proxy in place).
+ @Nullable
+ private static ProxyInfo canonicalizeProxyInfo(@Nullable final ProxyInfo proxy) {
+ if (proxy != null && TextUtils.isEmpty(proxy.getHost())
+ && (proxy.getPacFileUrl() == null || Uri.EMPTY.equals(proxy.getPacFileUrl()))) {
+ return null;
+ }
+ return proxy;
+ }
+
+ // ProxyInfo equality functions with a couple modifications over ProxyInfo.equals() to make it
+ // better for determining if a new proxy broadcast is necessary:
+ // 1. Canonicalize empty ProxyInfos to null so an empty proxy compares equal to null so as to
+ // avoid unnecessary broadcasts.
+ // 2. Make sure all parts of the ProxyInfo's compare true, including the host when a PAC URL
+ // is in place. This is important so legacy PAC resolver (see com.android.proxyhandler)
+ // changes aren't missed. The legacy PAC resolver pretends to be a simple HTTP proxy but
+ // actually uses the PAC to resolve; this results in ProxyInfo's with PAC URL, host and port
+ // all set.
+ public static boolean proxyInfoEqual(@Nullable final ProxyInfo a, @Nullable final ProxyInfo b) {
+ final ProxyInfo pa = canonicalizeProxyInfo(a);
+ final ProxyInfo pb = canonicalizeProxyInfo(b);
+ // ProxyInfo.equals() doesn't check hosts when PAC URLs are present, but we need to check
+ // hosts even when PAC URLs are present to account for the legacy PAC resolver.
+ return Objects.equals(pa, pb) && (pa == null || Objects.equals(pa.getHost(), pb.getHost()));
+ }
+
+ /**
+ * Gets the default system-wide proxy.
+ *
+ * This will return the global proxy if set, otherwise the default proxy if in use. Note
+ * that this is not necessarily the proxy that any given process should use, as the right
+ * proxy for a process is the proxy for the network this process will use, which may be
+ * different from this value. This value is simply the default in case there is no proxy set
+ * in the network that will be used by a specific process.
+ * @return The default system-wide proxy or null if none.
+ */
+ @Nullable
+ public ProxyInfo getDefaultProxy() {
+ // This information is already available as a world read/writable jvm property.
+ synchronized (mProxyLock) {
+ final ProxyInfo ret = mGlobalProxy;
+ if ((ret == null) && !mDefaultProxyDisabled) return mDefaultProxy;
+ return ret;
+ }
+ }
+
+ /**
+ * Gets the global proxy.
+ *
+ * @return The global proxy or null if none.
+ */
+ @Nullable
+ public ProxyInfo getGlobalProxy() {
+ // This information is already available as a world read/writable jvm property.
+ synchronized (mProxyLock) {
+ return mGlobalProxy;
+ }
+ }
+
+ /**
+ * Sends the system broadcast informing apps about a new proxy configuration.
+ *
+ * Confusingly this method also sets the PAC file URL. TODO : separate this, it has nothing
+ * to do in a "sendProxyBroadcast" method.
+ * @param proxyInfo the proxy spec, or null for no proxy.
+ */
+ // TODO : make the argument NonNull final and the method private
+ public void sendProxyBroadcast(@Nullable ProxyInfo proxyInfo) {
+ if (proxyInfo == null) proxyInfo = new ProxyInfo("", 0, "");
+ if (mPacManager.setCurrentProxyScriptUrl(proxyInfo)) return;
+ if (DBG) Slog.d(TAG, "sending Proxy Broadcast for " + proxyInfo);
+ Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION);
+ intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING |
+ Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ intent.putExtra(Proxy.EXTRA_PROXY_INFO, proxyInfo);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ /**
+ * Sets the global proxy in memory. Also writes the values to the global settings of the device.
+ *
+ * @param proxyInfo the proxy spec, or null for no proxy.
+ */
+ public void setGlobalProxy(@Nullable ProxyInfo proxyInfo) {
+ synchronized (mProxyLock) {
+ // ProxyInfo#equals is not commutative :( and is public API, so it can't be fixed.
+ if (proxyInfo == mGlobalProxy) return;
+ if (proxyInfo != null && proxyInfo.equals(mGlobalProxy)) return;
+ if (mGlobalProxy != null && mGlobalProxy.equals(proxyInfo)) return;
+
+ final String host;
+ final int port;
+ final String exclList;
+ final String pacFileUrl;
+ if (proxyInfo != null && (!TextUtils.isEmpty(proxyInfo.getHost()) ||
+ !Uri.EMPTY.equals(proxyInfo.getPacFileUrl()))) {
+ if (!proxyInfo.isValid()) {
+ if (DBG) Slog.d(TAG, "Invalid proxy properties, ignoring: " + proxyInfo);
+ return;
+ }
+ mGlobalProxy = new ProxyInfo(proxyInfo);
+ host = mGlobalProxy.getHost();
+ port = mGlobalProxy.getPort();
+ exclList = mGlobalProxy.getExclusionListAsString();
+ pacFileUrl = Uri.EMPTY.equals(proxyInfo.getPacFileUrl())
+ ? "" : proxyInfo.getPacFileUrl().toString();
+ } else {
+ host = "";
+ port = 0;
+ exclList = "";
+ pacFileUrl = "";
+ mGlobalProxy = null;
+ }
+ final ContentResolver res = mContext.getContentResolver();
+ final long token = Binder.clearCallingIdentity();
+ try {
+ Settings.Global.putString(res, Settings.Global.GLOBAL_HTTP_PROXY_HOST, host);
+ Settings.Global.putInt(res, Settings.Global.GLOBAL_HTTP_PROXY_PORT, port);
+ Settings.Global.putString(res, Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST,
+ exclList);
+ Settings.Global.putString(res, Settings.Global.GLOBAL_HTTP_PROXY_PAC, pacFileUrl);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+
+ sendProxyBroadcast(mGlobalProxy == null ? mDefaultProxy : proxyInfo);
+ }
+ }
+
+ /**
+ * Sets the default proxy for the device.
+ *
+ * The default proxy is the proxy used for networks that do not have a specific proxy.
+ * @param proxyInfo the proxy spec, or null for no proxy.
+ */
+ public void setDefaultProxy(@Nullable ProxyInfo proxyInfo) {
+ synchronized (mProxyLock) {
+ if (mDefaultProxy != null && mDefaultProxy.equals(proxyInfo)) {
+ return;
+ }
+ if (mDefaultProxy == proxyInfo) return; // catches repeated nulls
+ if (proxyInfo != null && !proxyInfo.isValid()) {
+ if (DBG) Slog.d(TAG, "Invalid proxy properties, ignoring: " + proxyInfo);
+ return;
+ }
+
+ // This call could be coming from the PacManager, containing the port of the local
+ // proxy. If this new proxy matches the global proxy then copy this proxy to the
+ // global (to get the correct local port), and send a broadcast.
+ // TODO: Switch PacManager to have its own message to send back rather than
+ // reusing EVENT_HAS_CHANGED_PROXY and this call to handleApplyDefaultProxy.
+ if ((mGlobalProxy != null) && (proxyInfo != null)
+ && (!Uri.EMPTY.equals(proxyInfo.getPacFileUrl()))
+ && proxyInfo.getPacFileUrl().equals(mGlobalProxy.getPacFileUrl())) {
+ mGlobalProxy = proxyInfo;
+ sendProxyBroadcast(mGlobalProxy);
+ return;
+ }
+ mDefaultProxy = proxyInfo;
+
+ if (mGlobalProxy != null) return;
+ if (!mDefaultProxyDisabled) {
+ sendProxyBroadcast(proxyInfo);
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index b98d099c5fe6..6bfa4cbb821a 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -117,7 +117,6 @@ import com.android.server.LocalServices;
import com.android.server.connectivity.tethering.IControlsTethering;
import com.android.server.connectivity.tethering.IPv6TetheringCoordinator;
import com.android.server.connectivity.tethering.OffloadController;
-import com.android.server.connectivity.tethering.SimChangeListener;
import com.android.server.connectivity.tethering.TetherInterfaceStateMachine;
import com.android.server.connectivity.tethering.TetheringConfiguration;
import com.android.server.connectivity.tethering.TetheringDependencies;
@@ -203,8 +202,6 @@ public class Tethering extends BaseNetworkObserver {
// into a single coherent structure.
private final HashSet<TetherInterfaceStateMachine> mForwardedDownstreams;
private final VersionedBroadcastListener mCarrierConfigChange;
- // TODO: Delete SimChangeListener; it's obsolete.
- private final SimChangeListener mSimChange;
private final TetheringDependencies mDeps;
private volatile TetheringConfiguration mConfig;
@@ -254,14 +251,6 @@ public class Tethering extends BaseNetworkObserver {
updateConfiguration();
reevaluateSimCardProvisioning();
});
- // TODO: Remove SimChangeListener altogether. For now, we retain it
- // for logging purposes in case we need to debug something that might
- // be related to changing signals from ACTION_SIM_STATE_CHANGED to
- // ACTION_CARRIER_CONFIG_CHANGED.
- mSimChange = new SimChangeListener(
- mContext, smHandler, () -> {
- mLog.log("OBSERVED SIM card change");
- });
mStateReceiver = new StateReceiver();
@@ -1357,8 +1346,11 @@ public class Tethering extends BaseNetworkObserver {
// do not currently know how to watch for changes in DUN settings.
maybeUpdateConfiguration();
- final NetworkState ns = mUpstreamNetworkMonitor.selectPreferredUpstreamType(
- mConfig.preferredUpstreamIfaceTypes);
+ final TetheringConfiguration config = mConfig;
+ final NetworkState ns = (config.chooseUpstreamAutomatically)
+ ? mUpstreamNetworkMonitor.getCurrentPreferredUpstream()
+ : mUpstreamNetworkMonitor.selectPreferredUpstreamType(
+ config.preferredUpstreamIfaceTypes);
if (ns == null) {
if (tryCell) {
mUpstreamNetworkMonitor.registerMobileNetworkRequest();
@@ -1387,9 +1379,7 @@ public class Tethering extends BaseNetworkObserver {
}
notifyDownstreamsOfNewUpstreamIface(ifaces);
if (ns != null && pertainsToCurrentUpstream(ns)) {
- // If we already have NetworkState for this network examine
- // it immediately, because there likely will be no second
- // EVENT_ON_AVAILABLE (it was already received).
+ // If we already have NetworkState for this network update it immediately.
handleNewUpstreamNetworkState(ns);
} else if (mCurrentUpstreamIfaceSet == null) {
// There are no available upstream networks.
@@ -1505,15 +1495,6 @@ public class Tethering extends BaseNetworkObserver {
}
switch (arg1) {
- case UpstreamNetworkMonitor.EVENT_ON_AVAILABLE:
- // The default network changed, or DUN connected
- // before this callback was processed. Updates
- // for the current NetworkCapabilities and
- // LinkProperties have been requested (default
- // request) or are being sent shortly (DUN). Do
- // nothing until they arrive; if no updates
- // arrive there's nothing to do.
- break;
case UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES:
handleNewUpstreamNetworkState(ns);
break;
@@ -1545,8 +1526,7 @@ public class Tethering extends BaseNetworkObserver {
return;
}
- mSimChange.startListening();
- mUpstreamNetworkMonitor.start();
+ mUpstreamNetworkMonitor.start(mDeps.getDefaultNetworkRequest());
// TODO: De-duplicate with updateUpstreamWanted() below.
if (upstreamWanted()) {
@@ -1561,7 +1541,6 @@ public class Tethering extends BaseNetworkObserver {
public void exit() {
mOffload.stop();
mUpstreamNetworkMonitor.stop();
- mSimChange.stopListening();
notifyDownstreamsOfNewUpstreamIface(null);
handleNewUpstreamNetworkState(null);
}
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index b77c1443e850..2a80f0e7c291 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -100,8 +100,6 @@ import com.android.server.DeviceIdleController;
import com.android.server.LocalServices;
import com.android.server.net.BaseNetworkObserver;
-import libcore.io.IoUtils;
-
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -123,6 +121,8 @@ import java.util.SortedSet;
import java.util.TreeSet;
import java.util.concurrent.atomic.AtomicInteger;
+import libcore.io.IoUtils;
+
/**
* @hide
*/
@@ -1327,6 +1327,18 @@ public class Vpn {
/* allowedApplications */ null,
/* disallowedApplications */ exemptedPackages);
+ // The UID range of the first user (0-99999) would block the IPSec traffic, which comes
+ // directly from the kernel and is marked as uid=0. So we adjust the range to allow
+ // it through (b/69873852).
+ for (UidRange range : addedRanges) {
+ if (range.start == 0) {
+ addedRanges.remove(range);
+ if (range.stop != 0) {
+ addedRanges.add(new UidRange(1, range.stop));
+ }
+ }
+ }
+
removedRanges.removeAll(addedRanges);
addedRanges.removeAll(mBlockedUsers);
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/SimChangeListener.java b/services/core/java/com/android/server/connectivity/tethering/SimChangeListener.java
deleted file mode 100644
index 33c9355ae64b..000000000000
--- a/services/core/java/com/android/server/connectivity/tethering/SimChangeListener.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2017 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.connectivity.tethering;
-
-import static com.android.internal.telephony.IccCardConstants.INTENT_VALUE_ICC_LOADED;
-import static com.android.internal.telephony.IccCardConstants.INTENT_KEY_ICC_STATE;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.util.VersionedBroadcastListener;
-import android.net.util.VersionedBroadcastListener.IntentCallback;
-import android.os.Handler;
-import android.util.Log;
-
-import com.android.internal.telephony.TelephonyIntents;
-
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Consumer;
-
-
-/**
- * A utility class that runs the provided callback on the provided handler when
- * observing a new SIM card having been loaded.
- *
- * @hide
- */
-public class SimChangeListener extends VersionedBroadcastListener {
- private static final String TAG = SimChangeListener.class.getSimpleName();
- private static final boolean DBG = false;
-
- public SimChangeListener(Context ctx, Handler handler, Runnable onSimCardLoadedCallback) {
- super(TAG, ctx, handler, makeIntentFilter(), makeCallback(onSimCardLoadedCallback));
- }
-
- private static IntentFilter makeIntentFilter() {
- final IntentFilter filter = new IntentFilter();
- filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
- return filter;
- }
-
- private static Consumer<Intent> makeCallback(Runnable onSimCardLoadedCallback) {
- return new Consumer<Intent>() {
- private boolean mSimNotLoadedSeen = false;
-
- @Override
- public void accept(Intent intent) {
- final String state = intent.getStringExtra(INTENT_KEY_ICC_STATE);
- Log.d(TAG, "got Sim changed to state " + state + ", mSimNotLoadedSeen=" +
- mSimNotLoadedSeen);
-
- if (!INTENT_VALUE_ICC_LOADED.equals(state)) {
- mSimNotLoadedSeen = true;
- return;
- }
-
- if (mSimNotLoadedSeen) {
- mSimNotLoadedSeen = false;
- onSimCardLoadedCallback.run();
- }
- }
- };
- }
-}
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
index 3db17ecbb2d9..1bbe8a622ce4 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
@@ -384,7 +384,7 @@ public class TetherInterfaceStateMachine extends StateMachine {
// that adding routes that already exist does not cause an
// error (EEXIST is silently ignored).
mNMService.addInterfaceToLocalNetwork(mIfaceName, toBeAdded);
- } catch (RemoteException e) {
+ } catch (Exception e) {
mLog.e("Failed to add IPv6 routes to local table: " + e);
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
index d7be44d4122c..72f528312076 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
@@ -27,6 +27,7 @@ import static com.android.internal.R.array.config_tether_dhcp_range;
import static com.android.internal.R.array.config_tether_usb_regexs;
import static com.android.internal.R.array.config_tether_upstream_types;
import static com.android.internal.R.array.config_tether_wifi_regexs;
+import static com.android.internal.R.bool.config_tether_upstream_automatic;
import static com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui;
import android.content.Context;
@@ -87,6 +88,7 @@ public class TetheringConfiguration {
public final String[] tetherableBluetoothRegexs;
public final int dunCheck;
public final boolean isDunRequired;
+ public final boolean chooseUpstreamAutomatically;
public final Collection<Integer> preferredUpstreamIfaceTypes;
public final String[] dhcpRanges;
public final String[] defaultIPv4DNS;
@@ -114,6 +116,7 @@ public class TetheringConfiguration {
dunCheck = checkDunRequired(ctx);
configLog.log("DUN check returned: " + dunCheckString(dunCheck));
+ chooseUpstreamAutomatically = getResourceBoolean(ctx, config_tether_upstream_automatic);
preferredUpstreamIfaceTypes = getUpstreamIfaceTypes(ctx, dunCheck);
isDunRequired = preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN);
@@ -150,6 +153,8 @@ public class TetheringConfiguration {
pw.print("isDunRequired: ");
pw.println(isDunRequired);
+ pw.print("chooseUpstreamAutomatically: ");
+ pw.println(chooseUpstreamAutomatically);
dumpStringArray(pw, "preferredUpstreamIfaceTypes",
preferredUpstreamNames(preferredUpstreamIfaceTypes));
@@ -168,6 +173,7 @@ public class TetheringConfiguration {
sj.add(String.format("tetherableBluetoothRegexs:%s",
makeString(tetherableBluetoothRegexs)));
sj.add(String.format("isDunRequired:%s", isDunRequired));
+ sj.add(String.format("chooseUpstreamAutomatically:%s", chooseUpstreamAutomatically));
sj.add(String.format("preferredUpstreamIfaceTypes:%s",
makeString(preferredUpstreamNames(preferredUpstreamIfaceTypes))));
sj.add(String.format("provisioningApp:%s", makeString(provisioningApp)));
@@ -294,6 +300,14 @@ public class TetheringConfiguration {
}
}
+ private static boolean getResourceBoolean(Context ctx, int resId) {
+ try {
+ return ctx.getResources().getBoolean(resId);
+ } catch (Resources.NotFoundException e404) {
+ return false;
+ }
+ }
+
private static String[] getResourceStringArray(Context ctx, int resId) {
try {
final String[] strArray = ctx.getResources().getStringArray(resId);
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
index 0ac7a36e3ffc..605ee9c8ee2e 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
@@ -18,6 +18,7 @@ package com.android.server.connectivity.tethering;
import android.content.Context;
import android.net.INetd;
+import android.net.NetworkRequest;
import android.net.ip.RouterAdvertisementDaemon;
import android.net.util.InterfaceParams;
import android.net.util.NetdService;
@@ -64,4 +65,8 @@ public class TetheringDependencies {
public boolean isTetheringSupported() {
return true;
}
+
+ public NetworkRequest getDefaultNetworkRequest() {
+ return null;
+ }
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
index 2adbfe9d0afd..ffd710c7135c 100644
--- a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
@@ -20,6 +20,9 @@ import static android.net.ConnectivityManager.getNetworkTypeName;
import static android.net.ConnectivityManager.TYPE_NONE;
import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import android.content.Context;
import android.os.Handler;
@@ -74,14 +77,13 @@ public class UpstreamNetworkMonitor {
private static final boolean DBG = false;
private static final boolean VDBG = false;
- public static final int EVENT_ON_AVAILABLE = 1;
- public static final int EVENT_ON_CAPABILITIES = 2;
- public static final int EVENT_ON_LINKPROPERTIES = 3;
- public static final int EVENT_ON_LOST = 4;
+ public static final int EVENT_ON_CAPABILITIES = 1;
+ public static final int EVENT_ON_LINKPROPERTIES = 2;
+ public static final int EVENT_ON_LOST = 3;
public static final int NOTIFY_LOCAL_PREFIXES = 10;
private static final int CALLBACK_LISTEN_ALL = 1;
- private static final int CALLBACK_TRACK_DEFAULT = 2;
+ private static final int CALLBACK_DEFAULT_INTERNET = 2;
private static final int CALLBACK_MOBILE_REQUEST = 3;
private final Context mContext;
@@ -117,7 +119,7 @@ public class UpstreamNetworkMonitor {
mCM = cm;
}
- public void start() {
+ public void start(NetworkRequest defaultNetworkRequest) {
stop();
final NetworkRequest listenAllRequest = new NetworkRequest.Builder()
@@ -125,8 +127,16 @@ public class UpstreamNetworkMonitor {
mListenAllCallback = new UpstreamNetworkCallback(CALLBACK_LISTEN_ALL);
cm().registerNetworkCallback(listenAllRequest, mListenAllCallback, mHandler);
- mDefaultNetworkCallback = new UpstreamNetworkCallback(CALLBACK_TRACK_DEFAULT);
- cm().registerDefaultNetworkCallback(mDefaultNetworkCallback, mHandler);
+ if (defaultNetworkRequest != null) {
+ // This is not really a "request", just a way of tracking the system default network.
+ // It's guaranteed not to actually bring up any networks because it's the same request
+ // as the ConnectivityService default request, and thus shares fate with it. We can't
+ // use registerDefaultNetworkCallback because it will not track the system default
+ // network if there is a VPN that applies to our UID.
+ final NetworkRequest trackDefaultRequest = new NetworkRequest(defaultNetworkRequest);
+ mDefaultNetworkCallback = new UpstreamNetworkCallback(CALLBACK_DEFAULT_INTERNET);
+ cm().requestNetwork(trackDefaultRequest, mDefaultNetworkCallback, mHandler);
+ }
}
public void stop() {
@@ -225,6 +235,20 @@ public class UpstreamNetworkMonitor {
return typeStatePair.ns;
}
+ // Returns null if no current upstream available.
+ public NetworkState getCurrentPreferredUpstream() {
+ final NetworkState dfltState = (mDefaultInternetNetwork != null)
+ ? mNetworkMap.get(mDefaultInternetNetwork)
+ : null;
+ if (!mDunRequired) return dfltState;
+
+ if (isNetworkUsableAndNotCellular(dfltState)) return dfltState;
+
+ // Find a DUN network. Note that code in Tethering causes a DUN request
+ // to be filed, but this might be moved into this class in future.
+ return findFirstDunNetwork(mNetworkMap.values());
+ }
+
public void setCurrentUpstream(Network upstream) {
mTetheringUpstreamNetwork = upstream;
}
@@ -233,72 +257,16 @@ public class UpstreamNetworkMonitor {
return (Set<IpPrefix>) mLocalPrefixes.clone();
}
- private void handleAvailable(int callbackType, Network network) {
- if (VDBG) Log.d(TAG, "EVENT_ON_AVAILABLE for " + network);
-
- if (!mNetworkMap.containsKey(network)) {
- mNetworkMap.put(network,
- new NetworkState(null, null, null, network, null, null));
- }
-
- // Always request whatever extra information we can, in case this
- // was already up when start() was called, in which case we would
- // not have been notified of any information that had not changed.
- switch (callbackType) {
- case CALLBACK_LISTEN_ALL:
- break;
-
- case CALLBACK_TRACK_DEFAULT:
- if (mDefaultNetworkCallback == null) {
- // The callback was unregistered in the interval between
- // ConnectivityService enqueueing onAvailable() and our
- // handling of it here on the mHandler thread.
- //
- // Clean-up of this network entry is deferred to the
- // handling of onLost() by other callbacks.
- //
- // These request*() calls can be deleted post oag/339444.
- return;
- }
- mDefaultInternetNetwork = network;
- break;
-
- case CALLBACK_MOBILE_REQUEST:
- if (mMobileNetworkCallback == null) {
- // The callback was unregistered in the interval between
- // ConnectivityService enqueueing onAvailable() and our
- // handling of it here on the mHandler thread.
- //
- // Clean-up of this network entry is deferred to the
- // handling of onLost() by other callbacks.
- return;
- }
- break;
- }
-
- // Requesting updates for mListenAllCallback is not currently possible
- // because it's a "listen". Two possible solutions to getting updates
- // about networks without waiting for a change (which might never come)
- // are:
- //
- // [1] extend request{NetworkCapabilities,LinkProperties}() to
- // take a Network argument and have ConnectivityService do
- // what's required (if the network satisfies the request)
- //
- // [2] explicitly file a NetworkRequest for each connectivity type
- // listed as a preferred upstream and wait for these callbacks
- // to be notified (requires tracking many more callbacks).
- //
- // Until this is addressed, networks that exist prior to the "listen"
- // registration and which do not subsequently change will not cause
- // us to learn their NetworkCapabilities nor their LinkProperties.
+ private void handleAvailable(Network network) {
+ if (mNetworkMap.containsKey(network)) return;
- // TODO: If sufficient information is available to select a more
- // preferable upstream, do so now and notify the target.
- notifyTarget(EVENT_ON_AVAILABLE, network);
+ if (VDBG) Log.d(TAG, "onAvailable for " + network);
+ mNetworkMap.put(network, new NetworkState(null, null, null, network, null, null));
}
- private void handleNetCap(Network network, NetworkCapabilities newNc) {
+ private void handleNetCap(int callbackType, Network network, NetworkCapabilities newNc) {
+ if (callbackType == CALLBACK_DEFAULT_INTERNET) mDefaultInternetNetwork = network;
+
final NetworkState prev = mNetworkMap.get(network);
if (prev == null || newNc.equals(prev.networkCapabilities)) {
// Ignore notifications about networks for which we have not yet
@@ -360,13 +328,17 @@ public class UpstreamNetworkMonitor {
}
private void handleLost(int callbackType, Network network) {
- if (callbackType == CALLBACK_TRACK_DEFAULT) {
+ if (network.equals(mDefaultInternetNetwork)) {
mDefaultInternetNetwork = null;
- // Receiving onLost() for a default network does not necessarily
- // mean the network is gone. We wait for a separate notification
- // on either the LISTEN_ALL or MOBILE_REQUEST callbacks before
- // clearing all state.
- return;
+ // There are few TODOs within ConnectivityService's rematching code
+ // pertaining to spurious onLost() notifications.
+ //
+ // TODO: simplify this, probably if favor of code that:
+ // - selects a new upstream if mTetheringUpstreamNetwork has
+ // been lost (by any callback)
+ // - deletes the entry from the map only when the LISTEN_ALL
+ // callback gets notified.
+ if (callbackType == CALLBACK_DEFAULT_INTERNET) return;
}
if (!mNetworkMap.containsKey(network)) {
@@ -416,17 +388,19 @@ public class UpstreamNetworkMonitor {
@Override
public void onAvailable(Network network) {
- handleAvailable(mCallbackType, network);
+ handleAvailable(network);
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) {
- handleNetCap(network, newNc);
+ handleNetCap(mCallbackType, network, newNc);
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties newLp) {
handleLinkProp(network, newLp);
+ // TODO(b/110335330): reduce the number of times this is called by
+ // only recomputing on the LISTEN_ALL callback.
recomputeLocalPrefixes();
}
@@ -443,6 +417,8 @@ public class UpstreamNetworkMonitor {
@Override
public void onLost(Network network) {
handleLost(mCallbackType, network);
+ // TODO(b/110335330): reduce the number of times this is called by
+ // only recomputing on the LISTEN_ALL callback.
recomputeLocalPrefixes();
}
}
@@ -518,4 +494,31 @@ public class UpstreamNetworkMonitor {
if (nc == null || !nc.hasSignalStrength()) return "unknown";
return Integer.toString(nc.getSignalStrength());
}
+
+ private static boolean isCellular(NetworkState ns) {
+ return (ns != null) && isCellular(ns.networkCapabilities);
+ }
+
+ private static boolean isCellular(NetworkCapabilities nc) {
+ 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);
+ }
+
+ private static boolean isNetworkUsableAndNotCellular(NetworkState ns) {
+ return (ns != null) && (ns.networkCapabilities != null) && (ns.linkProperties != null) &&
+ !isCellular(ns.networkCapabilities);
+ }
+
+ private static NetworkState findFirstDunNetwork(Iterable<NetworkState> netStates) {
+ for (NetworkState ns : netStates) {
+ if (isCellular(ns) && hasCapability(ns, NET_CAPABILITY_DUN)) return ns;
+ }
+
+ return null;
+ }
}
diff --git a/services/core/java/com/android/server/content/SyncJobService.java b/services/core/java/com/android/server/content/SyncJobService.java
index 089632dbe01c..bfcc629541f8 100644
--- a/services/core/java/com/android/server/content/SyncJobService.java
+++ b/services/core/java/com/android/server/content/SyncJobService.java
@@ -16,12 +16,10 @@
package com.android.server.content;
+import android.annotation.Nullable;
import android.app.job.JobParameters;
import android.app.job.JobService;
-import android.content.Intent;
import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Log;
import android.util.Slog;
@@ -34,78 +32,86 @@ import com.android.internal.annotations.GuardedBy;
public class SyncJobService extends JobService {
private static final String TAG = "SyncManager";
- public static final String EXTRA_MESSENGER = "messenger";
+ private static final Object sLock = new Object();
- private Messenger mMessenger;
+ @GuardedBy("sLock")
+ private static SyncJobService sInstance;
- private final Object mLock = new Object();
+ @GuardedBy("sLock")
+ private static final SparseArray<JobParameters> sJobParamsMap = new SparseArray<>();
- @GuardedBy("mLock")
- private final SparseArray<JobParameters> mJobParamsMap = new SparseArray<>();
+ @GuardedBy("sLock")
+ private static final SparseBooleanArray sStartedSyncs = new SparseBooleanArray();
- @GuardedBy("mLock")
- private final SparseBooleanArray mStartedSyncs = new SparseBooleanArray();
+ @GuardedBy("sLock")
+ private static final SparseLongArray sJobStartUptimes = new SparseLongArray();
- @GuardedBy("mLock")
- private final SparseLongArray mJobStartUptimes = new SparseLongArray();
+ private static final SyncLogger sLogger = SyncLogger.getInstance();
- private final SyncLogger mLogger = SyncLogger.getInstance();
-
- /**
- * This service is started by the SyncManager which passes a messenger object to
- * communicate back with it. It never stops while the device is running.
- */
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- mMessenger = intent.getParcelableExtra(EXTRA_MESSENGER);
- Message m = Message.obtain();
- m.what = SyncManager.SyncHandler.MESSAGE_JOBSERVICE_OBJECT;
- m.obj = this;
- sendMessage(m);
-
- return START_NOT_STICKY;
+ private void updateInstance() {
+ synchronized (SyncJobService.class) {
+ sInstance = this;
+ }
}
- private void sendMessage(Message message) {
- if (mMessenger == null) {
- Slog.e(TAG, "Messenger not initialized.");
- return;
+ @Nullable
+ private static SyncJobService getInstance() {
+ synchronized (sLock) {
+ if (sInstance == null) {
+ Slog.wtf(TAG, "sInstance == null");
+ }
+ return sInstance;
}
- try {
- mMessenger.send(message);
- } catch (RemoteException e) {
- Slog.e(TAG, e.toString());
+ }
+
+ public static boolean isReady() {
+ synchronized (sLock) {
+ return sInstance != null;
}
}
@Override
public boolean onStartJob(JobParameters params) {
+ updateInstance();
+
+ sLogger.purgeOldLogs();
- mLogger.purgeOldLogs();
+ SyncOperation op = SyncOperation.maybeCreateFromJobExtras(params.getExtras());
+
+ if (op == null) {
+ Slog.wtf(TAG, "Got invalid job " + params.getJobId());
+ return false;
+ }
+
+ final boolean readyToSync = SyncManager.readyToSync(op.target.userId);
+
+ sLogger.log("onStartJob() jobid=", params.getJobId(), " op=", op,
+ " readyToSync", readyToSync);
+
+ if (!readyToSync) {
+ // If the user isn't unlocked or the device has been provisioned yet, just stop the job
+ // at this point. If it's a non-periodic sync, ask the job scheduler to reschedule it.
+ // If it's a periodic sync, then just wait until the next cycle.
+ final boolean wantsReschedule = !op.isPeriodic;
+ jobFinished(params, wantsReschedule);
+ return true;
+ }
boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE);
- synchronized (mLock) {
+ synchronized (sLock) {
final int jobId = params.getJobId();
- mJobParamsMap.put(jobId, params);
+ sJobParamsMap.put(jobId, params);
- mStartedSyncs.delete(jobId);
- mJobStartUptimes.put(jobId, SystemClock.uptimeMillis());
+ sStartedSyncs.delete(jobId);
+ sJobStartUptimes.put(jobId, SystemClock.uptimeMillis());
}
Message m = Message.obtain();
m.what = SyncManager.SyncHandler.MESSAGE_START_SYNC;
- SyncOperation op = SyncOperation.maybeCreateFromJobExtras(params.getExtras());
-
- mLogger.log("onStartJob() jobid=", params.getJobId(), " op=", op);
-
- if (op == null) {
- Slog.e(TAG, "Got invalid job " + params.getJobId());
- return false;
- }
if (isLoggable) {
Slog.v(TAG, "Got start job message " + op.target);
}
m.obj = op;
- sendMessage(m);
+ SyncManager.sendMessage(m);
return true;
}
@@ -115,15 +121,22 @@ public class SyncJobService extends JobService {
Slog.v(TAG, "onStopJob called " + params.getJobId() + ", reason: "
+ params.getStopReason());
}
- final boolean readyToSync = SyncManager.readyToSync();
+ final SyncOperation op = SyncOperation.maybeCreateFromJobExtras(params.getExtras());
+ if (op == null) {
+ Slog.wtf(TAG, "Got invalid job " + params.getJobId());
+ return false;
+ }
- mLogger.log("onStopJob() ", mLogger.jobParametersToString(params),
+ final boolean readyToSync = SyncManager.readyToSync(op.target.userId);
+
+ sLogger.log("onStopJob() ", sLogger.jobParametersToString(params),
" readyToSync=", readyToSync);
- synchronized (mLock) {
+
+ synchronized (sLock) {
final int jobId = params.getJobId();
- mJobParamsMap.remove(jobId);
+ sJobParamsMap.remove(jobId);
- final long startUptime = mJobStartUptimes.get(jobId);
+ final long startUptime = sJobStartUptimes.get(jobId);
final long nowUptime = SystemClock.uptimeMillis();
final long runtime = nowUptime - startUptime;
@@ -135,61 +148,57 @@ public class SyncJobService extends JobService {
// WTF if startSyncH() hasn't happened, *unless* onStopJob() was called too soon.
// (1 minute threshold.)
// Also don't wtf when it's not ready to sync.
- if (readyToSync && !mStartedSyncs.get(jobId)) {
+ if (readyToSync && !sStartedSyncs.get(jobId)) {
wtf("Job " + jobId + " didn't start: "
+ " startUptime=" + startUptime
+ " nowUptime=" + nowUptime
+ " params=" + jobParametersToString(params));
}
- } else if (runtime < 10 * 1000) {
- // This happens too in a normal case too, and it's rather too often.
- // Disable it for now.
-// // Job stopped too soon. WTF.
-// wtf("Job " + jobId + " stopped in " + runtime + " ms: "
-// + " startUptime=" + startUptime
-// + " nowUptime=" + nowUptime
-// + " params=" + jobParametersToString(params));
}
- mStartedSyncs.delete(jobId);
- mJobStartUptimes.delete(jobId);
+ sStartedSyncs.delete(jobId);
+ sJobStartUptimes.delete(jobId);
}
Message m = Message.obtain();
m.what = SyncManager.SyncHandler.MESSAGE_STOP_SYNC;
- m.obj = SyncOperation.maybeCreateFromJobExtras(params.getExtras());
- if (m.obj == null) {
- return false;
- }
+ m.obj = op;
// Reschedule if this job was NOT explicitly canceled.
m.arg1 = params.getStopReason() != JobParameters.REASON_CANCELED ? 1 : 0;
// Apply backoff only if stop is called due to timeout.
m.arg2 = params.getStopReason() == JobParameters.REASON_TIMEOUT ? 1 : 0;
- sendMessage(m);
+ SyncManager.sendMessage(m);
return false;
}
- public void callJobFinished(int jobId, boolean needsReschedule, String why) {
- synchronized (mLock) {
- JobParameters params = mJobParamsMap.get(jobId);
- mLogger.log("callJobFinished()",
+ public static void callJobFinished(int jobId, boolean needsReschedule, String why) {
+ final SyncJobService instance = getInstance();
+ if (instance != null) {
+ instance.callJobFinishedInner(jobId, needsReschedule, why);
+ }
+ }
+
+ public void callJobFinishedInner(int jobId, boolean needsReschedule, String why) {
+ synchronized (sLock) {
+ JobParameters params = sJobParamsMap.get(jobId);
+ sLogger.log("callJobFinished()",
" jobid=", jobId,
" needsReschedule=", needsReschedule,
- " ", mLogger.jobParametersToString(params),
+ " ", sLogger.jobParametersToString(params),
" why=", why);
if (params != null) {
jobFinished(params, needsReschedule);
- mJobParamsMap.remove(jobId);
+ sJobParamsMap.remove(jobId);
} else {
Slog.e(TAG, "Job params not found for " + String.valueOf(jobId));
}
}
}
- public void markSyncStarted(int jobId) {
- synchronized (mLock) {
- mStartedSyncs.put(jobId, true);
+ public static void markSyncStarted(int jobId) {
+ synchronized (sLock) {
+ sStartedSyncs.put(jobId, true);
}
}
@@ -203,8 +212,8 @@ public class SyncJobService extends JobService {
}
}
- private void wtf(String message) {
- mLogger.log(message);
+ private static void wtf(String message) {
+ sLogger.log(message);
Slog.wtf(TAG, message);
}
}
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 0a640b8a76c6..d06e78514a5c 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -21,6 +21,7 @@ import android.accounts.AccountAndUser;
import android.accounts.AccountManager;
import android.accounts.AccountManagerInternal;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppGlobals;
@@ -72,7 +73,6 @@ import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
-import android.os.Messenger;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteCallback;
@@ -89,6 +89,7 @@ import android.util.EventLog;
import android.util.Log;
import android.util.Pair;
import android.util.Slog;
+import android.util.SparseBooleanArray;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
@@ -227,7 +228,6 @@ public class SyncManager {
// TODO: add better locking around mRunningAccounts
private volatile AccountAndUser[] mRunningAccounts = INITIAL_ACCOUNTS_ARRAY;
- volatile private PowerManager.WakeLock mHandleAlarmWakeLock;
volatile private PowerManager.WakeLock mSyncManagerWakeLock;
volatile private boolean mDataConnectionIsConnected = false;
volatile private boolean mStorageIsLow = false;
@@ -238,7 +238,6 @@ public class SyncManager {
private final IBatteryStats mBatteryStats;
private JobScheduler mJobScheduler;
private JobSchedulerInternal mJobSchedulerInternal;
- private SyncJobService mSyncJobService;
private SyncStorageEngine mSyncStorageEngine;
@@ -318,16 +317,6 @@ public class SyncManager {
}
};
- private final BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- mBootCompleted = true;
- // Called because it gets all pending jobs and stores them in mScheduledSyncs cache.
- verifyJobScheduler();
- mSyncHandler.onBootCompleted();
- }
- };
-
private final BroadcastReceiver mAccountsUpdatedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -371,14 +360,14 @@ public class SyncManager {
m.sendToTarget();
}
- private void doDatabaseCleanup() {
+ private void removeStaleAccounts() {
for (UserInfo user : mUserManager.getUsers(true)) {
// Skip any partially created/removed users
if (user.partial) continue;
Account[] accountsForUser = AccountManagerService.getSingleton().getAccounts(
user.id, mContext.getOpPackageName());
- mSyncStorageEngine.doDatabaseCleanup(accountsForUser, user.id);
+ mSyncStorageEngine.removeStaleAccounts(accountsForUser, user.id);
}
}
@@ -464,8 +453,8 @@ public class SyncManager {
private final SyncHandler mSyncHandler;
private final SyncManagerConstants mConstants;
- private volatile boolean mBootCompleted = false;
- private volatile boolean mJobServiceReady = false;
+ @GuardedBy("mUnlockedUsers")
+ private final SparseBooleanArray mUnlockedUsers = new SparseBooleanArray();
private ConnectivityManager getConnectivityManager() {
synchronized (this) {
@@ -641,12 +630,6 @@ public class SyncManager {
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(mConnectivityIntentReceiver, intentFilter);
- if (!factoryTest) {
- intentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
- intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
- context.registerReceiver(mBootCompletedReceiver, intentFilter);
- }
-
intentFilter = new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW);
intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_OK);
context.registerReceiver(mStorageIntentReceiver, intentFilter);
@@ -690,14 +673,6 @@ public class SyncManager {
mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
BatteryStats.SERVICE_NAME));
- // This WakeLock is used to ensure that we stay awake between the time that we receive
- // a sync alarm notification and when we finish processing it. We need to do this
- // because we don't do the work in the alarm handler, rather we do it in a message
- // handler.
- mHandleAlarmWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
- HANDLE_SYNC_ALARM_WAKE_LOCK);
- mHandleAlarmWakeLock.setReferenceCounted(false);
-
// This WakeLock is used to ensure that we stay awake while running the sync loop
// message handler. Normally we will hold a sync adapter wake lock while it is being
// synced but during the execution of the sync loop it might finish a sync for
@@ -715,7 +690,6 @@ public class SyncManager {
public void onChange(boolean selfChange) {
mProvisioned |= isDeviceProvisioned();
if (mProvisioned) {
- mSyncHandler.onDeviceProvisioned();
resolver.unregisterContentObserver(this);
}
}
@@ -744,19 +718,6 @@ public class SyncManager {
null, null);
}
- // Set up the communication channel between the scheduled job and the sync manager.
- // This is posted to the *main* looper intentionally, to defer calling startService()
- // until after the lengthy primary boot sequence completes on that thread, to avoid
- // spurious ANR triggering.
- final Intent startServiceIntent = new Intent(mContext, SyncJobService.class);
- startServiceIntent.putExtra(SyncJobService.EXTRA_MESSENGER, new Messenger(mSyncHandler));
- new Handler(mContext.getMainLooper()).post(new Runnable() {
- @Override
- public void run() {
- mContext.startService(startServiceIntent);
- }
- });
-
// Sync adapters were able to access the synced account without the accounts
// permission which circumvents our permission model. Therefore, we require
// sync adapters that don't have access to the account to get user consent.
@@ -768,16 +729,31 @@ public class SyncManager {
mLogger.log("Sync manager initialized: " + Build.FINGERPRINT);
}
- public void onStartUser(int userHandle) {
- mSyncHandler.post(() -> mLogger.log("onStartUser: user=", userHandle));
+ public void onStartUser(int userId) {
+ // Log on the handler to avoid slowing down device boot.
+ mSyncHandler.post(() -> mLogger.log("onStartUser: user=", userId));
}
- public void onUnlockUser(int userHandle) {
- mSyncHandler.post(() -> mLogger.log("onUnlockUser: user=", userHandle));
+ public void onUnlockUser(int userId) {
+ synchronized (mUnlockedUsers) {
+ mUnlockedUsers.put(userId, true);
+ }
+ // Log on the handler to avoid slowing down device boot.
+ mSyncHandler.post(() -> mLogger.log("onUnlockUser: user=", userId));
+ }
+
+ public void onStopUser(int userId) {
+ synchronized (mUnlockedUsers) {
+ mUnlockedUsers.put(userId, false);
+ }
+ // Log on the handler to avoid slowing down user switch.
+ mSyncHandler.post(() -> mLogger.log("onStopUser: user=", userId));
}
- public void onStopUser(int userHandle) {
- mSyncHandler.post(() -> mLogger.log("onStopUser: user=", userHandle));
+ private boolean isUserUnlocked(int userId) {
+ synchronized (mUnlockedUsers) {
+ return mUnlockedUsers.get(userId);
+ }
}
public void onBootPhase(int phase) {
@@ -1820,7 +1796,7 @@ public class SyncManager {
updateRunningAccounts(null /* Don't sync any target */);
// Clean up the storage engine database
- mSyncStorageEngine.doDatabaseCleanup(new Account[0], userId);
+ mSyncStorageEngine.removeStaleAccounts(null, userId);
List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (op.target.userId == userId) {
@@ -2235,8 +2211,13 @@ public class SyncManager {
mSyncStorageEngine.resetTodayStats(/* force=*/ false);
for (AccountAndUser account : accounts) {
- pw.printf("Account %s u%d %s\n",
- account.account.name, account.userId, account.account.type);
+ final boolean unlocked;
+ synchronized (mUnlockedUsers) {
+ unlocked = mUnlockedUsers.get(account.userId);
+ }
+ pw.printf("Account %s u%d %s%s\n",
+ account.account.name, account.userId, account.account.type,
+ (unlocked ? "" : " (locked)"));
pw.println("=======================================================================");
final PrintTable table = new PrintTable(16);
@@ -2872,13 +2853,29 @@ public class SyncManager {
}
}
+ @Nullable
+ private static SyncManager getInstance() {
+ synchronized (SyncManager.class) {
+ if (sInstance == null) {
+ Slog.wtf(TAG, "sInstance == null"); // Maybe called too early?
+ }
+ return sInstance;
+ }
+ }
+
/**
- * @return whether the device is ready to run sync jobs.
+ * @return whether the device is ready to run sync jobs for a given user.
*/
- public static boolean readyToSync() {
- synchronized (SyncManager.class) {
- return sInstance != null && sInstance.mProvisioned && sInstance.mBootCompleted
- && sInstance.mJobServiceReady;
+ public static boolean readyToSync(int userId) {
+ final SyncManager instance = getInstance();
+ return (instance != null) && SyncJobService.isReady()
+ && instance.mProvisioned && instance.isUserUnlocked(userId);
+ }
+
+ public static void sendMessage(Message message) {
+ final SyncManager instance = getInstance();
+ if (instance != null) {
+ instance.mSyncHandler.sendMessage(message);
}
}
@@ -2889,11 +2886,9 @@ public class SyncManager {
class SyncHandler extends Handler {
// Messages that can be sent on mHandler.
private static final int MESSAGE_SYNC_FINISHED = 1;
- private static final int MESSAGE_RELEASE_MESSAGES_FROM_QUEUE = 2;
private static final int MESSAGE_SERVICE_CONNECTED = 4;
private static final int MESSAGE_SERVICE_DISCONNECTED = 5;
private static final int MESSAGE_CANCEL = 6;
- static final int MESSAGE_JOBSERVICE_OBJECT = 7;
static final int MESSAGE_START_SYNC = 10;
static final int MESSAGE_STOP_SYNC = 11;
static final int MESSAGE_SCHEDULE_SYNC = 12;
@@ -2910,86 +2905,17 @@ public class SyncManager {
public final SyncTimeTracker mSyncTimeTracker = new SyncTimeTracker();
private final HashMap<String, PowerManager.WakeLock> mWakeLocks = Maps.newHashMap();
- private List<Message> mUnreadyQueue = new ArrayList<Message>();
-
- void onBootCompleted() {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Slog.v(TAG, "Boot completed.");
- }
- checkIfDeviceReady();
- }
-
- void onDeviceProvisioned() {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "mProvisioned=" + mProvisioned);
- }
- checkIfDeviceReady();
- }
-
- void checkIfDeviceReady() {
- if (mProvisioned && mBootCompleted && mJobServiceReady) {
- synchronized(this) {
- mSyncStorageEngine.restoreAllPeriodicSyncs();
- // Dispatch any stashed messages.
- obtainMessage(MESSAGE_RELEASE_MESSAGES_FROM_QUEUE).sendToTarget();
- }
- }
- }
-
- /**
- * Stash any messages that come to the handler before boot is complete or before the device
- * is properly provisioned (i.e. out of set-up wizard).
- * {@link #onBootCompleted()} and {@link SyncHandler#onDeviceProvisioned} both
- * need to come in before we start syncing.
- * @param msg Message to dispatch at a later point.
- * @return true if a message was enqueued, false otherwise. This is to avoid losing the
- * message if we manage to acquire the lock but by the time we do boot has completed.
- */
- private boolean tryEnqueueMessageUntilReadyToRun(Message msg) {
- synchronized (this) {
- if (!mBootCompleted || !mProvisioned || !mJobServiceReady) {
- // Need to copy the message bc looper will recycle it.
- Message m = Message.obtain(msg);
- mUnreadyQueue.add(m);
- return true;
- } else {
- return false;
- }
- }
- }
-
public SyncHandler(Looper looper) {
super(looper);
}
public void handleMessage(Message msg) {
+ // TODO Do we really need this wake lock?? If we actually needed it, this is probably
+ // not the best place to acquire the lock -- it's probably too late, because the device
+ // could have gone to sleep before we reach here.
+ mSyncManagerWakeLock.acquire();
try {
- mSyncManagerWakeLock.acquire();
- // We only want to enqueue sync related messages until device is ready.
- // Other messages are handled without enqueuing.
- if (msg.what == MESSAGE_JOBSERVICE_OBJECT) {
- Slog.i(TAG, "Got SyncJobService instance.");
- mSyncJobService = (SyncJobService) msg.obj;
- mJobServiceReady = true;
- checkIfDeviceReady();
- } else if (msg.what == SyncHandler.MESSAGE_ACCOUNTS_UPDATED) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Slog.v(TAG, "handleSyncHandlerMessage: MESSAGE_ACCOUNTS_UPDATED");
- }
- EndPoint targets = (EndPoint) msg.obj;
- updateRunningAccountsH(targets);
- } else if (msg.what == MESSAGE_RELEASE_MESSAGES_FROM_QUEUE) {
- if (mUnreadyQueue != null) {
- for (Message m : mUnreadyQueue) {
- handleSyncMessage(m);
- }
- mUnreadyQueue = null;
- }
- } else if (tryEnqueueMessageUntilReadyToRun(msg)) {
- // No work to be done.
- } else {
- handleSyncMessage(msg);
- }
+ handleSyncMessage(msg);
} finally {
mSyncManagerWakeLock.release();
}
@@ -3001,6 +2927,13 @@ public class SyncManager {
try {
mDataConnectionIsConnected = readDataConnectionState();
switch (msg.what) {
+ case MESSAGE_ACCOUNTS_UPDATED:
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Slog.v(TAG, "handleSyncHandlerMessage: MESSAGE_ACCOUNTS_UPDATED");
+ }
+ EndPoint targets = (EndPoint) msg.obj;
+ updateRunningAccountsH(targets);
+ break;
case MESSAGE_SCHEDULE_SYNC:
ScheduleSyncMessagePayload syncPayload =
(ScheduleSyncMessagePayload) msg.obj;
@@ -3069,7 +3002,7 @@ public class SyncManager {
if (isLoggable) {
Slog.v(TAG, "syncFinished" + payload.activeSyncContext.mSyncOperation);
}
- mSyncJobService.callJobFinished(
+ SyncJobService.callJobFinished(
payload.activeSyncContext.mSyncOperation.jobId, false,
"sync finished");
runSyncFinishedOrCanceledH(payload.syncResult,
@@ -3119,7 +3052,7 @@ public class SyncManager {
// which is a soft error.
SyncResult syncResult = new SyncResult();
syncResult.stats.numIoExceptions++;
- mSyncJobService.callJobFinished(
+ SyncJobService.callJobFinished(
currentSyncContext.mSyncOperation.jobId, false,
"service disconnected");
runSyncFinishedOrCanceledH(syncResult, currentSyncContext);
@@ -3138,7 +3071,7 @@ public class SyncManager {
Log.w(TAG, String.format(
"Detected sync making no progress for %s. cancelling.",
monitoredSyncContext));
- mSyncJobService.callJobFinished(
+ SyncJobService.callJobFinished(
monitoredSyncContext.mSyncOperation.jobId, false,
"no network activity");
runSyncFinishedOrCanceledH(
@@ -3175,7 +3108,7 @@ public class SyncManager {
private void deferSyncH(SyncOperation op, long delay, String why) {
mLogger.log("deferSyncH() ", (op.isPeriodic ? "periodic " : ""),
"sync. op=", op, " delay=", delay, " why=", why);
- mSyncJobService.callJobFinished(op.jobId, false, why);
+ SyncJobService.callJobFinished(op.jobId, false, why);
if (op.isPeriodic) {
scheduleSyncOperationH(op.createOneTimeSyncOperation(), delay);
} else {
@@ -3213,7 +3146,7 @@ public class SyncManager {
// assume the clock is correct.
mSyncStorageEngine.setClockValid();
- mSyncJobService.markSyncStarted(op.jobId);
+ SyncJobService.markSyncStarted(op.jobId);
if (mStorageIsLow) {
deferSyncH(op, SYNC_DELAY_ON_LOW_STORAGE, "storage low");
@@ -3226,7 +3159,7 @@ public class SyncManager {
List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation syncOperation: ops) {
if (syncOperation.sourcePeriodicId == op.jobId) {
- mSyncJobService.callJobFinished(op.jobId, false,
+ SyncJobService.callJobFinished(op.jobId, false,
"periodic sync, pending");
return;
}
@@ -3235,7 +3168,7 @@ public class SyncManager {
// executing according to some backoff criteria.
for (ActiveSyncContext asc: mActiveSyncContexts) {
if (asc.mSyncOperation.sourcePeriodicId == op.jobId) {
- mSyncJobService.callJobFinished(op.jobId, false,
+ SyncJobService.callJobFinished(op.jobId, false,
"periodic sync, already running");
return;
}
@@ -3272,13 +3205,13 @@ public class SyncManager {
switch (syncOpState) {
case SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS:
case SYNC_OP_STATE_INVALID: {
- mSyncJobService.callJobFinished(op.jobId, false,
+ SyncJobService.callJobFinished(op.jobId, false,
"invalid op state: " + syncOpState);
} return;
}
if (!dispatchSyncOperation(op)) {
- mSyncJobService.callJobFinished(op.jobId, false, "dispatchSyncOperation() failed");
+ SyncJobService.callJobFinished(op.jobId, false, "dispatchSyncOperation() failed");
}
setAuthorityPendingState(op.target);
@@ -3306,9 +3239,7 @@ public class SyncManager {
if (mLogger.enabled()) {
mLogger.log("updateRunningAccountsH: ", Arrays.toString(mRunningAccounts));
}
- if (mBootCompleted) {
- doDatabaseCleanup();
- }
+ removeStaleAccounts();
AccountAndUser[] accounts = mRunningAccounts;
for (ActiveSyncContext currentSyncContext : mActiveSyncContexts) {
@@ -3453,7 +3384,7 @@ public class SyncManager {
if (op.sourcePeriodicId == syncOperation.jobId || op.jobId == syncOperation.jobId) {
ActiveSyncContext asc = findActiveSyncContextH(syncOperation.jobId);
if (asc != null) {
- mSyncJobService.callJobFinished(syncOperation.jobId, false,
+ SyncJobService.callJobFinished(syncOperation.jobId, false,
"removePeriodicSyncInternalH");
runSyncFinishedOrCanceledH(null, asc);
}
@@ -3662,7 +3593,7 @@ public class SyncManager {
false /* no config settings */)) {
continue;
}
- mSyncJobService.callJobFinished(activeSyncContext.mSyncOperation.jobId, false,
+ SyncJobService.callJobFinished(activeSyncContext.mSyncOperation.jobId, false,
why);
runSyncFinishedOrCanceledH(null /* cancel => no result */, activeSyncContext);
}
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 11f07015ef12..391e3b01da08 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -19,6 +19,7 @@ package com.android.server.content;
import android.accounts.Account;
import android.accounts.AccountAndUser;
import android.accounts.AccountManager;
+import android.annotation.Nullable;
import android.app.backup.BackupManager;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -30,10 +31,6 @@ import android.content.SyncInfo;
import android.content.SyncRequest;
import android.content.SyncStatusInfo;
import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteException;
-import android.database.sqlite.SQLiteQueryBuilder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
@@ -510,10 +507,6 @@ public class SyncStorageEngine {
readAccountInfoLocked();
readStatusLocked();
readStatisticsLocked();
- readAndDeleteLegacyAccountInfoLocked();
- writeAccountInfoLocked();
- writeStatusLocked();
- writeStatisticsLocked();
if (mLogger.enabled()) {
final int size = mAuthorities.size();
@@ -1013,7 +1006,7 @@ public class SyncStorageEngine {
* Called when the set of account has changed, given the new array of
* active accounts.
*/
- public void doDatabaseCleanup(Account[] accounts, int userId) {
+ public void removeStaleAccounts(@Nullable Account[] accounts, int userId) {
synchronized (mAuthorities) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Slog.v(TAG, "Updating for new accounts...");
@@ -1022,8 +1015,9 @@ public class SyncStorageEngine {
Iterator<AccountInfo> accIt = mAccounts.values().iterator();
while (accIt.hasNext()) {
AccountInfo acc = accIt.next();
- if (!ArrayUtils.contains(accounts, acc.accountAndUser.account)
- && acc.accountAndUser.userId == userId) {
+ if ((accounts == null) || (
+ (acc.accountAndUser.userId == userId)
+ && !ArrayUtils.contains(accounts, acc.accountAndUser.account))) {
// This account no longer exists...
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Slog.v(TAG, "Account removed: " + acc.accountAndUser);
@@ -1581,7 +1575,6 @@ public class SyncStorageEngine {
readAccountInfoLocked();
readStatusLocked();
readStatisticsLocked();
- readAndDeleteLegacyAccountInfoLocked();
writeAccountInfoLocked();
writeStatusLocked();
writeStatisticsLocked();
@@ -1998,146 +1991,6 @@ public class SyncStorageEngine {
}
}
- static int getIntColumn(Cursor c, String name) {
- return c.getInt(c.getColumnIndex(name));
- }
-
- static long getLongColumn(Cursor c, String name) {
- return c.getLong(c.getColumnIndex(name));
- }
-
- /**
- * TODO Remove it. It's super old code that was used to migrate the information from a sqlite
- * database that we used a long time ago, and is no longer relevant.
- */
- private void readAndDeleteLegacyAccountInfoLocked() {
- // Look for old database to initialize from.
- File file = mContext.getDatabasePath("syncmanager.db");
- if (!file.exists()) {
- return;
- }
- String path = file.getPath();
- SQLiteDatabase db = null;
- try {
- db = SQLiteDatabase.openDatabase(path, null,
- SQLiteDatabase.OPEN_READONLY);
- } catch (SQLiteException e) {
- }
-
- if (db != null) {
- final boolean hasType = db.getVersion() >= 11;
-
- // Copy in all of the status information, as well as accounts.
- if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
- Slog.v(TAG_FILE, "Reading legacy sync accounts db");
- }
- SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
- qb.setTables("stats, status");
- HashMap<String,String> map = new HashMap<String,String>();
- map.put("_id", "status._id as _id");
- map.put("account", "stats.account as account");
- if (hasType) {
- map.put("account_type", "stats.account_type as account_type");
- }
- map.put("authority", "stats.authority as authority");
- map.put("totalElapsedTime", "totalElapsedTime");
- map.put("numSyncs", "numSyncs");
- map.put("numSourceLocal", "numSourceLocal");
- map.put("numSourcePoll", "numSourcePoll");
- map.put("numSourceServer", "numSourceServer");
- map.put("numSourceUser", "numSourceUser");
- map.put("lastSuccessSource", "lastSuccessSource");
- map.put("lastSuccessTime", "lastSuccessTime");
- map.put("lastFailureSource", "lastFailureSource");
- map.put("lastFailureTime", "lastFailureTime");
- map.put("lastFailureMesg", "lastFailureMesg");
- map.put("pending", "pending");
- qb.setProjectionMap(map);
- qb.appendWhere("stats._id = status.stats_id");
- Cursor c = qb.query(db, null, null, null, null, null, null);
- while (c.moveToNext()) {
- String accountName = c.getString(c.getColumnIndex("account"));
- String accountType = hasType
- ? c.getString(c.getColumnIndex("account_type")) : null;
- if (accountType == null) {
- accountType = "com.google";
- }
- String authorityName = c.getString(c.getColumnIndex("authority"));
- AuthorityInfo authority =
- this.getOrCreateAuthorityLocked(
- new EndPoint(new Account(accountName, accountType),
- authorityName,
- 0 /* legacy is single-user */)
- , -1,
- false);
- if (authority != null) {
- int i = mSyncStatus.size();
- boolean found = false;
- SyncStatusInfo st = null;
- while (i > 0) {
- i--;
- st = mSyncStatus.valueAt(i);
- if (st.authorityId == authority.ident) {
- found = true;
- break;
- }
- }
- if (!found) {
- st = new SyncStatusInfo(authority.ident);
- mSyncStatus.put(authority.ident, st);
- }
- st.totalStats.totalElapsedTime = getLongColumn(c, "totalElapsedTime");
- st.totalStats.numSyncs = getIntColumn(c, "numSyncs");
- st.totalStats.numSourceLocal = getIntColumn(c, "numSourceLocal");
- st.totalStats.numSourcePoll = getIntColumn(c, "numSourcePoll");
- st.totalStats.numSourceOther = getIntColumn(c, "numSourceServer");
- st.totalStats.numSourceUser = getIntColumn(c, "numSourceUser");
- st.totalStats.numSourcePeriodic = 0;
- st.lastSuccessSource = getIntColumn(c, "lastSuccessSource");
- st.lastSuccessTime = getLongColumn(c, "lastSuccessTime");
- st.lastFailureSource = getIntColumn(c, "lastFailureSource");
- st.lastFailureTime = getLongColumn(c, "lastFailureTime");
- st.lastFailureMesg = c.getString(c.getColumnIndex("lastFailureMesg"));
- st.pending = getIntColumn(c, "pending") != 0;
- }
- }
-
- c.close();
-
- // Retrieve the settings.
- qb = new SQLiteQueryBuilder();
- qb.setTables("settings");
- c = qb.query(db, null, null, null, null, null, null);
- while (c.moveToNext()) {
- String name = c.getString(c.getColumnIndex("name"));
- String value = c.getString(c.getColumnIndex("value"));
- if (name == null) continue;
- if (name.equals("listen_for_tickles")) {
- setMasterSyncAutomatically(value == null || Boolean.parseBoolean(value), 0,
- ContentResolver.SYNC_EXEMPTION_NONE, SyncLogger.CALLING_UID_SELF);
- } else if (name.startsWith("sync_provider_")) {
- String provider = name.substring("sync_provider_".length(),
- name.length());
- int i = mAuthorities.size();
- while (i > 0) {
- i--;
- AuthorityInfo authority = mAuthorities.valueAt(i);
- if (authority.target.provider.equals(provider)) {
- authority.enabled = value == null || Boolean.parseBoolean(value);
- authority.syncable = 1;
- }
- }
- }
- }
-
- c.close();
-
- db.close();
-
- (new File(path)).delete();
- }
- }
-
public static final int STATUS_FILE_END = 0;
public static final int STATUS_FILE_ITEM = 100;
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 1c3342a9af42..b97e90487123 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -400,6 +400,7 @@ class AutomaticBrightnessController {
} else if (mLightSensorEnabled) {
mLightSensorEnabled = false;
mAmbientLuxValid = !mResetAmbientLuxAfterWarmUpConfig;
+ mScreenAutoBrightness = -1;
mRecentLightSamples = 0;
mAmbientLightRingBuffer.clear();
mCurrentLightSensorRate = -1;
diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java
index a568fe336f37..c473ef23db3e 100644
--- a/services/core/java/com/android/server/display/BrightnessTracker.java
+++ b/services/core/java/com/android/server/display/BrightnessTracker.java
@@ -19,6 +19,7 @@ package com.android.server.display;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -937,7 +938,7 @@ public class BrightnessTracker {
}
public ActivityManager.StackInfo getFocusedStack() throws RemoteException {
- return ActivityManager.getService().getFocusedStackInfo();
+ return ActivityTaskManager.getService().getFocusedStackInfo();
}
public void scheduleIdleJob(Context context) {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index ba32da433573..20ecbccef194 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1843,7 +1843,7 @@ public final class DisplayManagerService extends SystemService {
+ "display.");
}
}
- if ((flags & VIRTUAL_DISPLAY_FLAG_SECURE) != 0) {
+ if (callingUid != Process.SYSTEM_UID && (flags & VIRTUAL_DISPLAY_FLAG_SECURE) != 0) {
if (!canProjectSecureVideo(projection)) {
throw new SecurityException("Requires CAPTURE_SECURE_VIDEO_OUTPUT "
+ "or an appropriate MediaProjection token to create a "
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 99412c56b274..b124ac78a8ef 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -791,9 +791,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
&& mAutomaticBrightnessController != null;
final boolean userSetBrightnessChanged = updateUserSetScreenBrightness();
- if (userSetBrightnessChanged) {
- mTemporaryScreenBrightness = -1;
- }
// Use the temporary screen brightness if there isn't an override, either from
// WindowManager or based on the display state.
@@ -1514,11 +1511,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
if (mCurrentScreenBrightnessSetting == mPendingScreenBrightnessSetting) {
mPendingScreenBrightnessSetting = -1;
+ mTemporaryScreenBrightness = -1;
return false;
}
mCurrentScreenBrightnessSetting = mPendingScreenBrightnessSetting;
mLastUserSetScreenBrightness = mPendingScreenBrightnessSetting;
mPendingScreenBrightnessSetting = -1;
+ mTemporaryScreenBrightness = -1;
return true;
}
diff --git a/services/core/java/com/android/server/display/DisplayTransformManager.java b/services/core/java/com/android/server/display/DisplayTransformManager.java
index 57a4f0dd526d..d6931e006479 100644
--- a/services/core/java/com/android/server/display/DisplayTransformManager.java
+++ b/services/core/java/com/android/server/display/DisplayTransformManager.java
@@ -17,6 +17,7 @@
package com.android.server.display;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.opengl.Matrix;
import android.os.IBinder;
import android.os.Parcel;
@@ -309,7 +310,7 @@ public class DisplayTransformManager {
private void updateConfiguration() {
try {
- ActivityManager.getService().updateConfiguration(null);
+ ActivityTaskManager.getService().updateConfiguration(null);
} catch (RemoteException e) {
Log.e(TAG, "Could not update configuration", e);
}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index e7bedc60bd52..378d57bf5c31 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -31,8 +31,6 @@ import android.os.Looper;
import android.os.PowerManager;
import android.os.SystemProperties;
import android.os.Trace;
-import android.text.TextUtils;
-import android.util.PathParser;
import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
@@ -405,8 +403,8 @@ final class LocalDisplayAdapter extends DisplayAdapter {
&& SystemProperties.getBoolean(PROPERTY_EMULATOR_CIRCULAR, false))) {
mInfo.flags |= DisplayDeviceInfo.FLAG_ROUND;
}
- mInfo.displayCutout = DisplayCutout.fromResources(res, mInfo.width,
- mInfo.height);
+ mInfo.displayCutout = DisplayCutout.fromResourcesRectApproximation(res,
+ mInfo.width, mInfo.height);
mInfo.type = Display.TYPE_BUILT_IN;
mInfo.densityDpi = (int)(phys.density * 160 + 0.5f);
mInfo.xDpi = phys.xDpi;
diff --git a/services/core/java/com/android/server/fingerprint/EnrollClient.java b/services/core/java/com/android/server/fingerprint/EnrollClient.java
deleted file mode 100644
index c9efcf2fd687..000000000000
--- a/services/core/java/com/android/server/fingerprint/EnrollClient.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Copyright (C) 2016 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.fingerprint;
-
-import android.content.Context;
-import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Slog;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-
-import java.util.Arrays;
-
-/**
- * A class to keep track of the enrollment state for a given client.
- */
-public abstract class EnrollClient extends ClientMonitor {
- private static final long MS_PER_SEC = 1000;
- private static final int ENROLLMENT_TIMEOUT_MS = 60 * 1000; // 1 minute
- private byte[] mCryptoToken;
-
- public EnrollClient(Context context, long halDeviceId, IBinder token,
- IFingerprintServiceReceiver receiver, int userId, int groupId, byte [] cryptoToken,
- boolean restricted, String owner) {
- super(context, halDeviceId, token, receiver, userId, groupId, restricted, owner);
- mCryptoToken = Arrays.copyOf(cryptoToken, cryptoToken.length);
- }
-
- @Override
- public boolean onEnrollResult(int fingerId, int groupId, int remaining) {
- if (groupId != getGroupId()) {
- Slog.w(TAG, "groupId != getGroupId(), groupId: " + groupId +
- " getGroupId():" + getGroupId());
- }
- if (remaining == 0) {
- FingerprintUtils.getInstance().addFingerprintForUser(getContext(), fingerId,
- getTargetUserId());
- }
- return sendEnrollResult(fingerId, groupId, remaining);
- }
-
- /*
- * @return true if we're done.
- */
- private boolean sendEnrollResult(int fpId, int groupId, int remaining) {
- IFingerprintServiceReceiver receiver = getReceiver();
- if (receiver == null)
- return true; // client not listening
-
- vibrateSuccess();
- MetricsLogger.action(getContext(), MetricsEvent.ACTION_FINGERPRINT_ENROLL);
- try {
- receiver.onEnrollResult(getHalDeviceId(), fpId, groupId, remaining);
- return remaining == 0;
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to notify EnrollResult:", e);
- return true;
- }
- }
-
- @Override
- public int start() {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "enroll: no fingerprint HAL!");
- return ERROR_ESRCH;
- }
- final int timeout = (int) (ENROLLMENT_TIMEOUT_MS / MS_PER_SEC);
- try {
- final int result = daemon.enroll(mCryptoToken, getGroupId(), timeout);
- if (result != 0) {
- Slog.w(TAG, "startEnroll failed, result=" + result);
- MetricsLogger.histogram(getContext(), "fingerprintd_enroll_start_error", result);
- onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */);
- return result;
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "startEnroll failed", e);
- }
- return 0; // success
- }
-
- @Override
- public int stop(boolean initiatedByClient) {
- if (mAlreadyCancelled) {
- Slog.w(TAG, "stopEnroll: already cancelled!");
- return 0;
- }
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "stopEnrollment: no fingerprint HAL!");
- return ERROR_ESRCH;
- }
- try {
- final int result = daemon.cancel();
- if (result != 0) {
- Slog.w(TAG, "startEnrollCancel failed, result = " + result);
- return result;
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "stopEnrollment failed", e);
- }
- if (initiatedByClient) {
- onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0 /* vendorCode */);
- }
- mAlreadyCancelled = true;
- return 0;
- }
-
- @Override
- public boolean onRemoved(int fingerId, int groupId, int remaining) {
- if (DEBUG) Slog.w(TAG, "onRemoved() called for enroll!");
- return true; // Invalid for EnrollClient
- }
-
- @Override
- public boolean onEnumerationResult(int fingerId, int groupId, int remaining) {
- if (DEBUG) Slog.w(TAG, "onEnumerationResult() called for enroll!");
- return true; // Invalid for EnrollClient
- }
-
- @Override
- public boolean onAuthenticated(int fingerId, int groupId) {
- if (DEBUG) Slog.w(TAG, "onAuthenticated() called for enroll!");
- return true; // Invalid for EnrollClient
- }
-
-}
diff --git a/services/core/java/com/android/server/fingerprint/EnumerateClient.java b/services/core/java/com/android/server/fingerprint/EnumerateClient.java
deleted file mode 100644
index b6bbd1b7e0ad..000000000000
--- a/services/core/java/com/android/server/fingerprint/EnumerateClient.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * Copyright (C) 2016 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.fingerprint;
-
-import android.content.Context;
-import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Slog;
-import com.android.internal.logging.MetricsLogger;
-
-/**
- * A class to keep track of the enumeration state for a given client.
- */
-public abstract class EnumerateClient extends ClientMonitor {
- public EnumerateClient(Context context, long halDeviceId, IBinder token,
- IFingerprintServiceReceiver receiver, int groupId, int userId,
- boolean restricted, String owner) {
- super(context, halDeviceId, token, receiver, userId, groupId, restricted, owner);
- }
-
- @Override
- public int start() {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- // The fingerprint template ids will be removed when we get confirmation from the HAL
- try {
- final int result = daemon.enumerate();
- if (result != 0) {
- Slog.w(TAG, "start enumerate for user " + getTargetUserId()
- + " failed, result=" + result);
- MetricsLogger.histogram(getContext(), "fingerprintd_enum_start_error", result);
- onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */);
- return result;
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "startEnumeration failed", e);
- }
- return 0;
- }
-
- @Override
- public int stop(boolean initiatedByClient) {
- if (mAlreadyCancelled) {
- Slog.w(TAG, "stopEnumerate: already cancelled!");
- return 0;
- }
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "stopEnumeration: no fingerprint HAL!");
- return ERROR_ESRCH;
- }
- try {
- final int result = daemon.cancel();
- if (result != 0) {
- Slog.w(TAG, "stop enumeration failed, result=" + result);
- return result;
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "stopEnumeration failed", e);
- return ERROR_ESRCH;
- }
-
- // We don't actually stop enumerate, but inform the client that the cancel operation
- // succeeded so we can start the next operation.
- if (initiatedByClient) {
- onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0 /* vendorCode */);
- }
- mAlreadyCancelled = true;
- return 0; // success
- }
-
- @Override
- public boolean onEnumerationResult(int fingerId, int groupId, int remaining) {
- IFingerprintServiceReceiver receiver = getReceiver();
- if (receiver == null)
- return true; // client not listening
- try {
- receiver.onEnumerated(getHalDeviceId(), fingerId, groupId, remaining);
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to notify enumerated:", e);
- }
- return remaining == 0;
- }
-
- @Override
- public boolean onAuthenticated(int fingerId, int groupId) {
- if (DEBUG) Slog.w(TAG, "onAuthenticated() called for enumerate!");
- return true; // Invalid for Enumerate.
- }
-
- @Override
- public boolean onEnrollResult(int fingerId, int groupId, int rem) {
- if (DEBUG) Slog.w(TAG, "onEnrollResult() called for enumerate!");
- return true; // Invalid for Enumerate.
- }
-
- @Override
- public boolean onRemoved(int fingerId, int groupId, int remaining) {
- if (DEBUG) Slog.w(TAG, "onRemoved() called for enumerate!");
- return true; // Invalid for Enumerate.
- }
-}
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
deleted file mode 100644
index 06329e571b43..000000000000
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ /dev/null
@@ -1,1589 +0,0 @@
-/*
- * Copyright (C) 2014 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.fingerprint;
-
-import static android.Manifest.permission.INTERACT_ACROSS_USERS;
-import static android.Manifest.permission.MANAGE_FINGERPRINT;
-import static android.Manifest.permission.RESET_FINGERPRINT_LOCKOUT;
-import static android.Manifest.permission.USE_BIOMETRIC;
-import static android.Manifest.permission.USE_FINGERPRINT;
-import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE;
-
-import android.app.ActivityManager;
-import android.app.ActivityManager.RunningAppProcessInfo;
-import android.app.AlarmManager;
-import android.app.AppOpsManager;
-import android.app.IActivityManager;
-import android.app.PendingIntent;
-import android.app.SynchronousUserSwitchObserver;
-import android.app.TaskStackListener;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
-import android.hardware.biometrics.IBiometricPromptReceiver;
-import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
-import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprintClientCallback;
-import android.hardware.fingerprint.Fingerprint;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.IFingerprintClientActiveCallback;
-import android.hardware.fingerprint.IFingerprintService;
-import android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback;
-import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.DeadObjectException;
-import android.os.Environment;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.IHwBinder;
-import android.os.IRemoteCallback;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.os.RemoteException;
-import android.os.SELinux;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.security.KeyStore;
-import android.util.Slog;
-import android.util.SparseBooleanArray;
-import android.util.SparseIntArray;
-import android.util.proto.ProtoOutputStream;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.statusbar.IStatusBarService;
-import com.android.internal.util.DumpUtils;
-import com.android.server.SystemServerInitThreadPool;
-import com.android.server.SystemService;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-/**
- * A service to manage multiple clients that want to access the fingerprint HAL API.
- * The service is responsible for maintaining a list of clients and dispatching all
- * fingerprint-related events.
- *
- * @hide
- */
-public class FingerprintService extends SystemService implements IHwBinder.DeathRecipient {
- static final String TAG = "FingerprintService";
- static final boolean DEBUG = true;
- private static final boolean CLEANUP_UNUSED_FP = true;
- private static final String FP_DATA_DIR = "fpdata";
- private static final int MSG_USER_SWITCHING = 10;
- private static final String ACTION_LOCKOUT_RESET =
- "com.android.server.fingerprint.ACTION_LOCKOUT_RESET";
- private static final String KEY_LOCKOUT_RESET_USER = "lockout_reset_user";
-
- private class PerformanceStats {
- int accept; // number of accepted fingerprints
- int reject; // number of rejected fingerprints
- int acquire; // total number of acquisitions. Should be >= accept+reject due to poor image
- // acquisition in some cases (too fast, too slow, dirty sensor, etc.)
- int lockout; // total number of lockouts
- int permanentLockout; // total number of permanent lockouts
- }
-
- private final ArrayList<FingerprintServiceLockoutResetMonitor> mLockoutMonitors =
- new ArrayList<>();
- private final CopyOnWriteArrayList<IFingerprintClientActiveCallback> mClientActiveCallbacks =
- new CopyOnWriteArrayList<>();
- private final Map<Integer, Long> mAuthenticatorIds =
- Collections.synchronizedMap(new HashMap<>());
- private final AppOpsManager mAppOps;
- private static final long FAIL_LOCKOUT_TIMEOUT_MS = 30*1000;
- private static final int MAX_FAILED_ATTEMPTS_LOCKOUT_TIMED = 5;
- private static final int MAX_FAILED_ATTEMPTS_LOCKOUT_PERMANENT = 20;
-
- private static final long CANCEL_TIMEOUT_LIMIT = 3000; // max wait for onCancel() from HAL,in ms
- private final String mKeyguardPackage;
- private int mCurrentUserId = UserHandle.USER_NULL;
- private final FingerprintUtils mFingerprintUtils = FingerprintUtils.getInstance();
- private Context mContext;
- private long mHalDeviceId;
- private SparseBooleanArray mTimedLockoutCleared;
- private SparseIntArray mFailedAttempts;
- @GuardedBy("this")
- private IBiometricsFingerprint mDaemon;
- private IStatusBarService mStatusBarService;
- private final IActivityManager mActivityManager;
- private final PowerManager mPowerManager;
- private final AlarmManager mAlarmManager;
- private final UserManager mUserManager;
- private ClientMonitor mCurrentClient;
- private ClientMonitor mPendingClient;
- private PerformanceStats mPerformanceStats;
-
- private IBinder mToken = new Binder(); // used for internal FingerprintService enumeration
- private ArrayList<UserFingerprint> mUnknownFingerprints = new ArrayList<>(); // hw fingerprints
-
- private class UserFingerprint {
- Fingerprint f;
- int userId;
- public UserFingerprint(Fingerprint f, int userId) {
- this.f = f;
- this.userId = userId;
- }
- }
-
- // Normal fingerprint authentications are tracked by mPerformanceMap.
- private HashMap<Integer, PerformanceStats> mPerformanceMap = new HashMap<>();
-
- // Transactions that make use of CryptoObjects are tracked by mCryptoPerformaceMap.
- private HashMap<Integer, PerformanceStats> mCryptoPerformanceMap = new HashMap<>();
-
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case MSG_USER_SWITCHING:
- handleUserSwitching(msg.arg1);
- break;
-
- default:
- Slog.w(TAG, "Unknown message:" + msg.what);
- }
- }
- };
-
- private final BroadcastReceiver mLockoutReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (ACTION_LOCKOUT_RESET.equals(intent.getAction())) {
- final int user = intent.getIntExtra(KEY_LOCKOUT_RESET_USER, 0);
- resetFailedAttemptsForUser(false /* clearAttemptCounter */, user);
- }
- }
- };
-
- private final Runnable mResetFailedAttemptsForCurrentUserRunnable = new Runnable() {
- @Override
- public void run() {
- resetFailedAttemptsForUser(true /* clearAttemptCounter */,
- ActivityManager.getCurrentUser());
- }
- };
-
- private final Runnable mResetClientState = new Runnable() {
- @Override
- public void run() {
- // Warning: if we get here, the driver never confirmed our call to cancel the current
- // operation (authenticate, enroll, remove, enumerate, etc), which is
- // really bad. The result will be a 3-second delay in starting each new client.
- // If you see this on a device, make certain the driver notifies with
- // {@link FingerprintManager#FINGERPRINT_ERROR_CANCEL} in response to cancel()
- // once it has successfully switched to the IDLE state in the fingerprint HAL.
- // Additionally,{@link FingerprintManager#FINGERPRINT_ERROR_CANCEL} should only be sent
- // in response to an actual cancel() call.
- Slog.w(TAG, "Client "
- + (mCurrentClient != null ? mCurrentClient.getOwnerString() : "null")
- + " failed to respond to cancel, starting client "
- + (mPendingClient != null ? mPendingClient.getOwnerString() : "null"));
-
- mCurrentClient = null;
- startClient(mPendingClient, false);
- }
- };
-
- private final TaskStackListener mTaskStackListener = new TaskStackListener() {
- @Override
- public void onTaskStackChanged() {
- try {
- if (!(mCurrentClient instanceof AuthenticationClient)) {
- return;
- }
- final String currentClient = mCurrentClient.getOwnerString();
- if (isKeyguard(currentClient)) {
- return; // Keyguard is always allowed
- }
- List<ActivityManager.RunningTaskInfo> runningTasks = mActivityManager.getTasks(1);
- if (!runningTasks.isEmpty()) {
- final String topPackage = runningTasks.get(0).topActivity.getPackageName();
- if (!topPackage.contentEquals(currentClient)) {
- Slog.e(TAG, "Stopping background authentication, top: " + topPackage
- + " currentClient: " + currentClient);
- mCurrentClient.stop(false /* initiatedByClient */);
- }
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "Unable to get running tasks", e);
- }
- }
- };
-
- public FingerprintService(Context context) {
- super(context);
- mContext = context;
- mKeyguardPackage = ComponentName.unflattenFromString(context.getResources().getString(
- com.android.internal.R.string.config_keyguardComponent)).getPackageName();
- mAppOps = context.getSystemService(AppOpsManager.class);
- mPowerManager = mContext.getSystemService(PowerManager.class);
- mAlarmManager = mContext.getSystemService(AlarmManager.class);
- mContext.registerReceiver(mLockoutReceiver, new IntentFilter(ACTION_LOCKOUT_RESET),
- RESET_FINGERPRINT_LOCKOUT, null /* handler */);
- mUserManager = UserManager.get(mContext);
- mTimedLockoutCleared = new SparseBooleanArray();
- mFailedAttempts = new SparseIntArray();
- mStatusBarService = IStatusBarService.Stub.asInterface(
- ServiceManager.getService(Context.STATUS_BAR_SERVICE));
- mActivityManager = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE))
- .getService();
- }
-
- @Override
- public void serviceDied(long cookie) {
- Slog.v(TAG, "fingerprint HAL died");
- MetricsLogger.count(mContext, "fingerprintd_died", 1);
- handleError(mHalDeviceId, FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE,
- 0 /*vendorCode */);
- }
-
- public synchronized IBiometricsFingerprint getFingerprintDaemon() {
- if (mDaemon == null) {
- Slog.v(TAG, "mDaemon was null, reconnect to fingerprint");
- try {
- mDaemon = IBiometricsFingerprint.getService();
- } catch (java.util.NoSuchElementException e) {
- // Service doesn't exist or cannot be opened. Logged below.
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to get biometric interface", e);
- }
- if (mDaemon == null) {
- Slog.w(TAG, "fingerprint HIDL not available");
- return null;
- }
-
- mDaemon.asBinder().linkToDeath(this, 0);
-
- try {
- mHalDeviceId = mDaemon.setNotify(mDaemonCallback);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to open fingerprint HAL", e);
- mDaemon = null; // try again later!
- }
-
- if (DEBUG) Slog.v(TAG, "Fingerprint HAL id: " + mHalDeviceId);
- if (mHalDeviceId != 0) {
- loadAuthenticatorIds();
- updateActiveGroup(ActivityManager.getCurrentUser(), null);
- doFingerprintCleanupForUser(ActivityManager.getCurrentUser());
- } else {
- Slog.w(TAG, "Failed to open Fingerprint HAL!");
- MetricsLogger.count(mContext, "fingerprintd_openhal_error", 1);
- mDaemon = null;
- }
- }
- return mDaemon;
- }
-
- /** Populates existing authenticator ids. To be used only during the start of the service. */
- private void loadAuthenticatorIds() {
- // This operation can be expensive, so keep track of the elapsed time. Might need to move to
- // background if it takes too long.
- long t = System.currentTimeMillis();
- mAuthenticatorIds.clear();
- for (UserInfo user : UserManager.get(mContext).getUsers(true /* excludeDying */)) {
- int userId = getUserOrWorkProfileId(null, user.id);
- if (!mAuthenticatorIds.containsKey(userId)) {
- updateActiveGroup(userId, null);
- }
- }
-
- t = System.currentTimeMillis() - t;
- if (t > 1000) {
- Slog.w(TAG, "loadAuthenticatorIds() taking too long: " + t + "ms");
- }
- }
-
- /**
- * This method should be called upon connection to the daemon, and when user switches.
- * @param userId
- */
- private void doFingerprintCleanupForUser(int userId) {
- if (CLEANUP_UNUSED_FP) {
- enumerateUser(userId);
- }
- }
-
- private void clearEnumerateState() {
- if (DEBUG) Slog.v(TAG, "clearEnumerateState()");
- mUnknownFingerprints.clear();
- }
-
- private void enumerateUser(int userId) {
- if (DEBUG) Slog.v(TAG, "Enumerating user(" + userId + ")");
- boolean restricted = !hasPermission(MANAGE_FINGERPRINT);
- startEnumerate(mToken, userId, null, restricted, true /* internal */);
- }
-
- // Remove unknown fingerprints from hardware
- private void cleanupUnknownFingerprints() {
- if (!mUnknownFingerprints.isEmpty()) {
- UserFingerprint uf = mUnknownFingerprints.get(0);
- mUnknownFingerprints.remove(uf);
- boolean restricted = !hasPermission(MANAGE_FINGERPRINT);
- startRemove(mToken, uf.f.getFingerId(), uf.f.getGroupId(), uf.userId, null,
- restricted, true /* internal */);
- } else {
- clearEnumerateState();
- }
- }
-
- protected void handleEnumerate(long deviceId, int fingerId, int groupId, int remaining) {
- ClientMonitor client = mCurrentClient;
-
- if ( !(client instanceof InternalRemovalClient) && !(client instanceof EnumerateClient) ) {
- return;
- }
- client.onEnumerationResult(fingerId, groupId, remaining);
-
- // All fingerprints in hardware for this user were enumerated
- if (remaining == 0) {
- if (client instanceof InternalEnumerateClient) {
- List<Fingerprint> unknownFingerprints =
- ((InternalEnumerateClient) client).getUnknownFingerprints();
-
- if (!unknownFingerprints.isEmpty()) {
- Slog.w(TAG, "Adding " + unknownFingerprints.size() +
- " fingerprints for deletion");
- }
- for (Fingerprint f : unknownFingerprints) {
- mUnknownFingerprints.add(new UserFingerprint(f, client.getTargetUserId()));
- }
- removeClient(client);
- cleanupUnknownFingerprints();
- } else {
- removeClient(client);
- }
- }
- }
-
- protected void handleError(long deviceId, int error, int vendorCode) {
- ClientMonitor client = mCurrentClient;
- if (client instanceof InternalRemovalClient || client instanceof InternalEnumerateClient) {
- clearEnumerateState();
- }
- if (client != null && client.onError(error, vendorCode)) {
- removeClient(client);
- }
-
- if (DEBUG) Slog.v(TAG, "handleError(client="
- + (client != null ? client.getOwnerString() : "null") + ", error = " + error + ")");
- // This is the magic code that starts the next client when the old client finishes.
- if (error == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
- mHandler.removeCallbacks(mResetClientState);
- if (mPendingClient != null) {
- if (DEBUG) Slog.v(TAG, "start pending client " + mPendingClient.getOwnerString());
- startClient(mPendingClient, false);
- mPendingClient = null;
- }
- } else if (error == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) {
- // If we get HW_UNAVAILABLE, try to connect again later...
- Slog.w(TAG, "Got ERROR_HW_UNAVAILABLE; try reconnecting next client.");
- synchronized (this) {
- mDaemon = null;
- mHalDeviceId = 0;
- mCurrentUserId = UserHandle.USER_NULL;
- }
- }
- }
-
- protected void handleRemoved(long deviceId, int fingerId, int groupId, int remaining) {
- if (DEBUG) Slog.w(TAG, "Removed: fid=" + fingerId
- + ", gid=" + groupId
- + ", dev=" + deviceId
- + ", rem=" + remaining);
-
- ClientMonitor client = mCurrentClient;
- if (client != null && client.onRemoved(fingerId, groupId, remaining)) {
- removeClient(client);
- // When the last fingerprint of a group is removed, update the authenticator id
- if (!hasEnrolledFingerprints(groupId)) {
- updateActiveGroup(groupId, null);
- }
- }
- if (client instanceof InternalRemovalClient && !mUnknownFingerprints.isEmpty()) {
- cleanupUnknownFingerprints();
- } else if (client instanceof InternalRemovalClient){
- clearEnumerateState();
- }
- }
-
- protected void handleAuthenticated(long deviceId, int fingerId, int groupId,
- ArrayList<Byte> token) {
- ClientMonitor client = mCurrentClient;
- if (fingerId != 0) {
- // Ugh...
- final byte[] byteToken = new byte[token.size()];
- for (int i = 0; i < token.size(); i++) {
- byteToken[i] = token.get(i);
- }
- // Send to Keystore
- KeyStore.getInstance().addAuthToken(byteToken);
- }
- if (client != null && client.onAuthenticated(fingerId, groupId)) {
- removeClient(client);
- }
- if (fingerId != 0) {
- mPerformanceStats.accept++;
- } else {
- mPerformanceStats.reject++;
- }
- }
-
- protected void handleAcquired(long deviceId, int acquiredInfo, int vendorCode) {
- ClientMonitor client = mCurrentClient;
- if (client != null && client.onAcquired(acquiredInfo, vendorCode)) {
- removeClient(client);
- }
- if (mPerformanceStats != null && getLockoutMode() == AuthenticationClient.LOCKOUT_NONE
- && client instanceof AuthenticationClient) {
- // ignore enrollment acquisitions or acquisitions when we're locked out
- mPerformanceStats.acquire++;
- }
- }
-
- protected void handleEnrollResult(long deviceId, int fingerId, int groupId, int remaining) {
- ClientMonitor client = mCurrentClient;
- if (client != null && client.onEnrollResult(fingerId, groupId, remaining)) {
- removeClient(client);
- // When enrollment finishes, update this group's authenticator id, as the HAL has
- // already generated a new authenticator id when the new fingerprint is enrolled.
- updateActiveGroup(groupId, null);
- }
- }
-
- private void userActivity() {
- long now = SystemClock.uptimeMillis();
- mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
- }
-
- void handleUserSwitching(int userId) {
- if (mCurrentClient instanceof InternalRemovalClient
- || mCurrentClient instanceof InternalEnumerateClient) {
- Slog.w(TAG, "User switched while performing cleanup");
- removeClient(mCurrentClient);
- clearEnumerateState();
- }
- updateActiveGroup(userId, null);
- doFingerprintCleanupForUser(userId);
- }
-
- private void removeClient(ClientMonitor client) {
- if (client != null) {
- client.destroy();
- if (client != mCurrentClient && mCurrentClient != null) {
- Slog.w(TAG, "Unexpected client: " + client.getOwnerString() + "expected: "
- + mCurrentClient != null ? mCurrentClient.getOwnerString() : "null");
- }
- }
- if (mCurrentClient != null) {
- if (DEBUG) Slog.v(TAG, "Done with client: " + client.getOwnerString());
- mCurrentClient = null;
- }
- if (mPendingClient == null) {
- notifyClientActiveCallbacks(false);
- }
- }
-
- private int getLockoutMode() {
- final int currentUser = ActivityManager.getCurrentUser();
- final int failedAttempts = mFailedAttempts.get(currentUser, 0);
- if (failedAttempts >= MAX_FAILED_ATTEMPTS_LOCKOUT_PERMANENT) {
- return AuthenticationClient.LOCKOUT_PERMANENT;
- } else if (failedAttempts > 0 &&
- mTimedLockoutCleared.get(currentUser, false) == false
- && (failedAttempts % MAX_FAILED_ATTEMPTS_LOCKOUT_TIMED == 0)) {
- return AuthenticationClient.LOCKOUT_TIMED;
- }
- return AuthenticationClient.LOCKOUT_NONE;
- }
-
- private void scheduleLockoutResetForUser(int userId) {
- mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() + FAIL_LOCKOUT_TIMEOUT_MS,
- getLockoutResetIntentForUser(userId));
- }
-
- private void cancelLockoutResetForUser(int userId) {
- mAlarmManager.cancel(getLockoutResetIntentForUser(userId));
- }
-
- private PendingIntent getLockoutResetIntentForUser(int userId) {
- return PendingIntent.getBroadcast(mContext, userId,
- new Intent(ACTION_LOCKOUT_RESET).putExtra(KEY_LOCKOUT_RESET_USER, userId),
- PendingIntent.FLAG_UPDATE_CURRENT);
- }
-
- public long startPreEnroll(IBinder token) {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "startPreEnroll: no fingerprint HAL!");
- return 0;
- }
- try {
- return daemon.preEnroll();
- } catch (RemoteException e) {
- Slog.e(TAG, "startPreEnroll failed", e);
- }
- return 0;
- }
-
- public int startPostEnroll(IBinder token) {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "startPostEnroll: no fingerprint HAL!");
- return 0;
- }
- try {
- return daemon.postEnroll();
- } catch (RemoteException e) {
- Slog.e(TAG, "startPostEnroll failed", e);
- }
- return 0;
- }
-
- /**
- * Calls fingerprint HAL to switch states to the new task. If there's already a current task,
- * it calls cancel() and sets mPendingClient to begin when the current task finishes
- * ({@link FingerprintManager#FINGERPRINT_ERROR_CANCELED}).
- * @param newClient the new client that wants to connect
- * @param initiatedByClient true for authenticate, remove and enroll
- */
- private void startClient(ClientMonitor newClient, boolean initiatedByClient) {
- ClientMonitor currentClient = mCurrentClient;
- if (currentClient != null) {
- if (DEBUG) Slog.v(TAG, "request stop current client " + currentClient.getOwnerString());
- if (currentClient instanceof InternalEnumerateClient ||
- currentClient instanceof InternalRemovalClient) {
- // This condition means we're currently running internal diagnostics to
- // remove extra fingerprints in the hardware and/or the software
- // TODO: design an escape hatch in case client never finishes
- if (newClient != null) {
- Slog.w(TAG, "Internal cleanup in progress but trying to start client "
- + newClient.getClass().getSuperclass().getSimpleName()
- + "(" + newClient.getOwnerString() + ")"
- + ", initiatedByClient = " + initiatedByClient);
- }
- }
- else {
- currentClient.stop(initiatedByClient);
- }
- mPendingClient = newClient;
- mHandler.removeCallbacks(mResetClientState);
- mHandler.postDelayed(mResetClientState, CANCEL_TIMEOUT_LIMIT);
- } else if (newClient != null) {
- mCurrentClient = newClient;
- if (DEBUG) Slog.v(TAG, "starting client "
- + newClient.getClass().getSuperclass().getSimpleName()
- + "(" + newClient.getOwnerString() + ")"
- + ", initiatedByClient = " + initiatedByClient);
- notifyClientActiveCallbacks(true);
-
- newClient.start();
- }
- }
-
- void startRemove(IBinder token, int fingerId, int groupId, int userId,
- IFingerprintServiceReceiver receiver, boolean restricted, boolean internal) {
- if (token == null) {
- Slog.w(TAG, "startRemove: token is null");
- return;
- }
- if (receiver == null) {
- Slog.w(TAG, "startRemove: receiver is null");
- return;
- }
-
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "startRemove: no fingerprint HAL!");
- return;
- }
-
- if (internal) {
- Context context = getContext();
- InternalRemovalClient client = new InternalRemovalClient(context, mHalDeviceId,
- token, receiver, fingerId, groupId, userId, restricted,
- context.getOpPackageName()) {
- @Override
- public void notifyUserActivity() {
-
- }
- @Override
- public IBiometricsFingerprint getFingerprintDaemon() {
- return FingerprintService.this.getFingerprintDaemon();
- }
- };
- startClient(client, true);
- }
- else {
- RemovalClient client = new RemovalClient(getContext(), mHalDeviceId, token,
- receiver, fingerId, groupId, userId, restricted, token.toString()) {
- @Override
- public void notifyUserActivity() {
- FingerprintService.this.userActivity();
- }
-
- @Override
- public IBiometricsFingerprint getFingerprintDaemon() {
- return FingerprintService.this.getFingerprintDaemon();
- }
- };
- startClient(client, true);
- }
- }
-
- void startEnumerate(IBinder token, int userId,
- IFingerprintServiceReceiver receiver, boolean restricted, boolean internal) {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "startEnumerate: no fingerprint HAL!");
- return;
- }
- if (internal) {
- List<Fingerprint> enrolledList = getEnrolledFingerprints(userId);
- Context context = getContext();
- InternalEnumerateClient client = new InternalEnumerateClient(context, mHalDeviceId,
- token, receiver, userId, userId, restricted, context.getOpPackageName(),
- enrolledList) {
- @Override
- public void notifyUserActivity() {
-
- }
-
- @Override
- public IBiometricsFingerprint getFingerprintDaemon() {
- return FingerprintService.this.getFingerprintDaemon();
- }
- };
- startClient(client, true);
- }
- else {
- EnumerateClient client = new EnumerateClient(getContext(), mHalDeviceId, token,
- receiver, userId, userId, restricted, token.toString()) {
- @Override
- public void notifyUserActivity() {
- FingerprintService.this.userActivity();
- }
-
- @Override
- public IBiometricsFingerprint getFingerprintDaemon() {
- return FingerprintService.this.getFingerprintDaemon();
- }
- };
- startClient(client, true);
- }
- }
-
- public List<Fingerprint> getEnrolledFingerprints(int userId) {
- return mFingerprintUtils.getFingerprintsForUser(mContext, userId);
- }
-
- public boolean hasEnrolledFingerprints(int userId) {
- if (userId != UserHandle.getCallingUserId()) {
- checkPermission(INTERACT_ACROSS_USERS);
- }
- return mFingerprintUtils.getFingerprintsForUser(mContext, userId).size() > 0;
- }
-
- boolean hasPermission(String permission) {
- return getContext().checkCallingOrSelfPermission(permission)
- == PackageManager.PERMISSION_GRANTED;
- }
-
- void checkPermission(String permission) {
- getContext().enforceCallingOrSelfPermission(permission,
- "Must have " + permission + " permission.");
- }
-
- int getEffectiveUserId(int userId) {
- UserManager um = UserManager.get(mContext);
- if (um != null) {
- final long callingIdentity = Binder.clearCallingIdentity();
- userId = um.getCredentialOwnerProfile(userId);
- Binder.restoreCallingIdentity(callingIdentity);
- } else {
- Slog.e(TAG, "Unable to acquire UserManager");
- }
- return userId;
- }
-
- boolean isCurrentUserOrProfile(int userId) {
- UserManager um = UserManager.get(mContext);
- if (um == null) {
- Slog.e(TAG, "Unable to acquire UserManager");
- return false;
- }
-
- final long token = Binder.clearCallingIdentity();
- try {
- // Allow current user or profiles of the current user...
- for (int profileId : um.getEnabledProfileIds(ActivityManager.getCurrentUser())) {
- if (profileId == userId) {
- return true;
- }
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
-
- return false;
- }
-
- private boolean isForegroundActivity(int uid, int pid) {
- try {
- List<RunningAppProcessInfo> procs =
- ActivityManager.getService().getRunningAppProcesses();
- int N = procs.size();
- for (int i = 0; i < N; i++) {
- RunningAppProcessInfo proc = procs.get(i);
- if (proc.pid == pid && proc.uid == uid
- && proc.importance <= IMPORTANCE_FOREGROUND_SERVICE) {
- return true;
- }
- }
- } catch (RemoteException e) {
- Slog.w(TAG, "am.getRunningAppProcesses() failed");
- }
- return false;
- }
-
- /**
- * @param opPackageName name of package for caller
- * @param requireForeground only allow this call while app is in the foreground
- * @return true if caller can use fingerprint API
- */
- private boolean canUseFingerprint(String opPackageName, boolean requireForeground, int uid,
- int pid, int userId) {
- if (getContext().checkCallingPermission(USE_FINGERPRINT)
- != PackageManager.PERMISSION_GRANTED) {
- checkPermission(USE_BIOMETRIC);
- }
-
- if (isKeyguard(opPackageName)) {
- return true; // Keyguard is always allowed
- }
- if (!isCurrentUserOrProfile(userId)) {
- Slog.w(TAG,"Rejecting " + opPackageName + " ; not a current user or profile");
- return false;
- }
- if (mAppOps.noteOp(AppOpsManager.OP_USE_FINGERPRINT, uid, opPackageName)
- != AppOpsManager.MODE_ALLOWED) {
- Slog.w(TAG, "Rejecting " + opPackageName + " ; permission denied");
- return false;
- }
- if (requireForeground && !(isForegroundActivity(uid, pid) || currentClient(opPackageName))){
- Slog.w(TAG, "Rejecting " + opPackageName + " ; not in foreground");
- return false;
- }
- return true;
- }
-
- /**
- * @param opPackageName package of the caller
- * @return true if this is the same client currently using fingerprint
- */
- private boolean currentClient(String opPackageName) {
- return mCurrentClient != null && mCurrentClient.getOwnerString().equals(opPackageName);
- }
-
- /**
- * @param clientPackage
- * @return true if this is keyguard package
- */
- private boolean isKeyguard(String clientPackage) {
- return mKeyguardPackage.equals(clientPackage);
- }
-
- private void addLockoutResetMonitor(FingerprintServiceLockoutResetMonitor monitor) {
- if (!mLockoutMonitors.contains(monitor)) {
- mLockoutMonitors.add(monitor);
- }
- }
-
- private void removeLockoutResetCallback(
- FingerprintServiceLockoutResetMonitor monitor) {
- mLockoutMonitors.remove(monitor);
- }
-
- private void notifyLockoutResetMonitors() {
- for (int i = 0; i < mLockoutMonitors.size(); i++) {
- mLockoutMonitors.get(i).sendLockoutReset();
- }
- }
-
- private void notifyClientActiveCallbacks(boolean isActive) {
- List<IFingerprintClientActiveCallback> callbacks = mClientActiveCallbacks;
- for (int i = 0; i < callbacks.size(); i++) {
- try {
- callbacks.get(i).onClientActiveChanged(isActive);
- } catch (RemoteException re) {
- // If the remote is dead, stop notifying it
- mClientActiveCallbacks.remove(callbacks.get(i));
- }
- }
- }
-
- private void startAuthentication(IBinder token, long opId, int callingUserId, int groupId,
- IFingerprintServiceReceiver receiver, int flags, boolean restricted,
- String opPackageName, Bundle bundle, IBiometricPromptReceiver dialogReceiver) {
- updateActiveGroup(groupId, opPackageName);
-
- if (DEBUG) Slog.v(TAG, "startAuthentication(" + opPackageName + ")");
-
- AuthenticationClient client = new AuthenticationClient(getContext(), mHalDeviceId, token,
- receiver, mCurrentUserId, groupId, opId, restricted, opPackageName, bundle,
- dialogReceiver, mStatusBarService) {
- @Override
- public void onStart() {
- try {
- mActivityManager.registerTaskStackListener(mTaskStackListener);
- } catch (RemoteException e) {
- Slog.e(TAG, "Could not register task stack listener", e);
- }
- }
-
- @Override
- public void onStop() {
- try {
- mActivityManager.unregisterTaskStackListener(mTaskStackListener);
- } catch (RemoteException e) {
- Slog.e(TAG, "Could not unregister task stack listener", e);
- }
- }
-
- @Override
- public int handleFailedAttempt() {
- final int currentUser = ActivityManager.getCurrentUser();
- mFailedAttempts.put(currentUser, mFailedAttempts.get(currentUser, 0) + 1);
- mTimedLockoutCleared.put(ActivityManager.getCurrentUser(), false);
- final int lockoutMode = getLockoutMode();
- if (lockoutMode == AuthenticationClient.LOCKOUT_PERMANENT) {
- mPerformanceStats.permanentLockout++;
- } else if (lockoutMode == AuthenticationClient.LOCKOUT_TIMED) {
- mPerformanceStats.lockout++;
- }
-
- // Failing multiple times will continue to push out the lockout time
- if (lockoutMode != AuthenticationClient.LOCKOUT_NONE) {
- scheduleLockoutResetForUser(currentUser);
- return lockoutMode;
- }
- return AuthenticationClient.LOCKOUT_NONE;
- }
-
- @Override
- public void resetFailedAttempts() {
- FingerprintService.this.resetFailedAttemptsForUser(true /* clearAttemptCounter */,
- ActivityManager.getCurrentUser());
- }
-
- @Override
- public void notifyUserActivity() {
- FingerprintService.this.userActivity();
- }
-
- @Override
- public IBiometricsFingerprint getFingerprintDaemon() {
- return FingerprintService.this.getFingerprintDaemon();
- }
- };
-
- int lockoutMode = getLockoutMode();
- if (lockoutMode != AuthenticationClient.LOCKOUT_NONE) {
- Slog.v(TAG, "In lockout mode(" + lockoutMode +
- ") ; disallowing authentication");
- int errorCode = lockoutMode == AuthenticationClient.LOCKOUT_TIMED ?
- FingerprintManager.FINGERPRINT_ERROR_LOCKOUT :
- FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT;
- if (!client.onError(errorCode, 0 /* vendorCode */)) {
- Slog.w(TAG, "Cannot send permanent lockout message to client");
- }
- return;
- }
- startClient(client, true /* initiatedByClient */);
- }
-
- private void startEnrollment(IBinder token, byte [] cryptoToken, int userId,
- IFingerprintServiceReceiver receiver, int flags, boolean restricted,
- String opPackageName) {
- updateActiveGroup(userId, opPackageName);
-
- final int groupId = userId; // default group for fingerprint enrollment
-
- EnrollClient client = new EnrollClient(getContext(), mHalDeviceId, token, receiver,
- userId, groupId, cryptoToken, restricted, opPackageName) {
-
- @Override
- public IBiometricsFingerprint getFingerprintDaemon() {
- return FingerprintService.this.getFingerprintDaemon();
- }
-
- @Override
- public void notifyUserActivity() {
- FingerprintService.this.userActivity();
- }
- };
- startClient(client, true /* initiatedByClient */);
- }
-
- // attempt counter should only be cleared when Keyguard goes away or when
- // a fingerprint is successfully authenticated
- protected void resetFailedAttemptsForUser(boolean clearAttemptCounter, int userId) {
- if (DEBUG && getLockoutMode() != AuthenticationClient.LOCKOUT_NONE) {
- Slog.v(TAG, "Reset fingerprint lockout, clearAttemptCounter=" + clearAttemptCounter);
- }
- if (clearAttemptCounter) {
- mFailedAttempts.put(userId, 0);
- }
- mTimedLockoutCleared.put(userId, true);
- // If we're asked to reset failed attempts externally (i.e. from Keyguard),
- // the alarm might still be pending; remove it.
- cancelLockoutResetForUser(userId);
- notifyLockoutResetMonitors();
- }
-
- private class FingerprintServiceLockoutResetMonitor implements IBinder.DeathRecipient {
-
- private static final long WAKELOCK_TIMEOUT_MS = 2000;
- private final IFingerprintServiceLockoutResetCallback mCallback;
- private final WakeLock mWakeLock;
-
- public FingerprintServiceLockoutResetMonitor(
- IFingerprintServiceLockoutResetCallback callback) {
- mCallback = callback;
- mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
- "lockout reset callback");
- try {
- mCallback.asBinder().linkToDeath(FingerprintServiceLockoutResetMonitor.this, 0);
- } catch (RemoteException e) {
- Slog.w(TAG, "caught remote exception in linkToDeath", e);
- }
- }
-
- public void sendLockoutReset() {
- if (mCallback != null) {
- try {
- mWakeLock.acquire(WAKELOCK_TIMEOUT_MS);
- mCallback.onLockoutReset(mHalDeviceId, new IRemoteCallback.Stub() {
-
- @Override
- public void sendResult(Bundle data) throws RemoteException {
- releaseWakelock();
- }
- });
- } catch (DeadObjectException e) {
- Slog.w(TAG, "Death object while invoking onLockoutReset: ", e);
- mHandler.post(mRemoveCallbackRunnable);
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to invoke onLockoutReset: ", e);
- releaseWakelock();
- }
- }
- }
-
- private final Runnable mRemoveCallbackRunnable = new Runnable() {
- @Override
- public void run() {
- releaseWakelock();
- removeLockoutResetCallback(FingerprintServiceLockoutResetMonitor.this);
- }
- };
-
- @Override
- public void binderDied() {
- Slog.e(TAG, "Lockout reset callback binder died");
- mHandler.post(mRemoveCallbackRunnable);
- }
-
- private void releaseWakelock() {
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- }
- }
- }
-
- private IBiometricsFingerprintClientCallback mDaemonCallback =
- new IBiometricsFingerprintClientCallback.Stub() {
-
- @Override
- public void onEnrollResult(final long deviceId, final int fingerId, final int groupId,
- final int remaining) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- handleEnrollResult(deviceId, fingerId, groupId, remaining);
- }
- });
- }
-
- @Override
- public void onAcquired(final long deviceId, final int acquiredInfo, final int vendorCode) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- handleAcquired(deviceId, acquiredInfo, vendorCode);
- }
- });
- }
-
- @Override
- public void onAuthenticated(final long deviceId, final int fingerId, final int groupId,
- ArrayList<Byte> token) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- handleAuthenticated(deviceId, fingerId, groupId, token);
- }
- });
- }
-
- @Override
- public void onError(final long deviceId, final int error, final int vendorCode) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- handleError(deviceId, error, vendorCode);
- }
- });
- }
-
- @Override
- public void onRemoved(final long deviceId, final int fingerId, final int groupId, final int remaining) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- handleRemoved(deviceId, fingerId, groupId, remaining);
- }
- });
- }
-
- @Override
- public void onEnumerate(final long deviceId, final int fingerId, final int groupId,
- final int remaining) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- handleEnumerate(deviceId, fingerId, groupId, remaining);
- }
- });
- }
- };
-
- private final class FingerprintServiceWrapper extends IFingerprintService.Stub {
- @Override // Binder call
- public long preEnroll(IBinder token) {
- checkPermission(MANAGE_FINGERPRINT);
- return startPreEnroll(token);
- }
-
- @Override // Binder call
- public int postEnroll(IBinder token) {
- checkPermission(MANAGE_FINGERPRINT);
- return startPostEnroll(token);
- }
-
- @Override // Binder call
- public void enroll(final IBinder token, final byte[] cryptoToken, final int userId,
- final IFingerprintServiceReceiver receiver, final int flags,
- final String opPackageName) {
- checkPermission(MANAGE_FINGERPRINT);
- final int limit = mContext.getResources().getInteger(
- com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
-
- final int enrolled = FingerprintService.this.getEnrolledFingerprints(userId).size();
- if (enrolled >= limit) {
- Slog.w(TAG, "Too many fingerprints registered");
- return;
- }
-
- // Group ID is arbitrarily set to parent profile user ID. It just represents
- // the default fingerprints for the user.
- if (!isCurrentUserOrProfile(userId)) {
- return;
- }
-
- final boolean restricted = isRestricted();
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- startEnrollment(token, cryptoToken, userId, receiver, flags,
- restricted, opPackageName);
- }
- });
- }
-
- private boolean isRestricted() {
- // Only give privileged apps (like Settings) access to fingerprint info
- final boolean restricted = !hasPermission(MANAGE_FINGERPRINT);
- return restricted;
- }
-
- @Override // Binder call
- public void cancelEnrollment(final IBinder token) {
- checkPermission(MANAGE_FINGERPRINT);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- ClientMonitor client = mCurrentClient;
- if (client instanceof EnrollClient && client.getToken() == token) {
- client.stop(client.getToken() == token);
- }
- }
- });
- }
-
- @Override // Binder call
- public void authenticate(final IBinder token, final long opId, final int groupId,
- final IFingerprintServiceReceiver receiver, final int flags,
- final String opPackageName, final Bundle bundle,
- final IBiometricPromptReceiver dialogReceiver) {
- final int callingUid = Binder.getCallingUid();
- final int callingPid = Binder.getCallingPid();
- final int callingUserId = UserHandle.getCallingUserId();
- final boolean restricted = isRestricted();
-
- if (!canUseFingerprint(opPackageName, true /* foregroundOnly */, callingUid, callingPid,
- callingUserId)) {
- if (DEBUG) Slog.v(TAG, "authenticate(): reject " + opPackageName);
- return;
- }
-
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- MetricsLogger.histogram(mContext, "fingerprint_token", opId != 0L ? 1 : 0);
-
- // Get performance stats object for this user.
- HashMap<Integer, PerformanceStats> pmap
- = (opId == 0) ? mPerformanceMap : mCryptoPerformanceMap;
- PerformanceStats stats = pmap.get(mCurrentUserId);
- if (stats == null) {
- stats = new PerformanceStats();
- pmap.put(mCurrentUserId, stats);
- }
- mPerformanceStats = stats;
-
- startAuthentication(token, opId, callingUserId, groupId, receiver,
- flags, restricted, opPackageName, bundle, dialogReceiver);
- }
- });
- }
-
- @Override // Binder call
- public void cancelAuthentication(final IBinder token, final String opPackageName) {
- final int callingUid = Binder.getCallingUid();
- final int callingPid = Binder.getCallingPid();
- final int callingUserId = UserHandle.getCallingUserId();
-
- if (!canUseFingerprint(opPackageName, true /* foregroundOnly */, callingUid, callingPid,
- callingUserId)) {
- if (DEBUG) Slog.v(TAG, "cancelAuthentication(): reject " + opPackageName);
- return;
- }
-
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- ClientMonitor client = mCurrentClient;
- if (client instanceof AuthenticationClient) {
- if (client.getToken() == token) {
- if (DEBUG) Slog.v(TAG, "stop client " + client.getOwnerString());
- client.stop(client.getToken() == token);
- } else {
- if (DEBUG) Slog.v(TAG, "can't stop client "
- + client.getOwnerString() + " since tokens don't match");
- }
- } else if (client != null) {
- if (DEBUG) Slog.v(TAG, "can't cancel non-authenticating client "
- + client.getOwnerString());
- }
- }
- });
- }
-
- @Override // Binder call
- public void setActiveUser(final int userId) {
- checkPermission(MANAGE_FINGERPRINT);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- updateActiveGroup(userId, null);
- }
- });
- }
-
- @Override // Binder call
- public void remove(final IBinder token, final int fingerId, final int groupId,
- final int userId, final IFingerprintServiceReceiver receiver) {
- checkPermission(MANAGE_FINGERPRINT); // TODO: Maybe have another permission
- final boolean restricted = isRestricted();
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- startRemove(token, fingerId, groupId, userId, receiver,
- restricted, false /* internal */);
- }
- });
- }
-
- @Override // Binder call
- public void enumerate(final IBinder token, final int userId,
- final IFingerprintServiceReceiver receiver) {
- checkPermission(MANAGE_FINGERPRINT); // TODO: Maybe have another permission
- final boolean restricted = isRestricted();
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- startEnumerate(token, userId, receiver, restricted, false /* internal */);
- }
- });
- }
-
- @Override // Binder call
- public boolean isHardwareDetected(long deviceId, String opPackageName) {
- if (!canUseFingerprint(opPackageName, false /* foregroundOnly */,
- Binder.getCallingUid(), Binder.getCallingPid(),
- UserHandle.getCallingUserId())) {
- return false;
- }
-
- final long token = Binder.clearCallingIdentity();
- try {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- return daemon != null && mHalDeviceId != 0;
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override // Binder call
- public void rename(final int fingerId, final int groupId, final String name) {
- checkPermission(MANAGE_FINGERPRINT);
- if (!isCurrentUserOrProfile(groupId)) {
- return;
- }
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mFingerprintUtils.renameFingerprintForUser(mContext, fingerId,
- groupId, name);
- }
- });
- }
-
- @Override // Binder call
- public List<Fingerprint> getEnrolledFingerprints(int userId, String opPackageName) {
- if (!canUseFingerprint(opPackageName, false /* foregroundOnly */,
- Binder.getCallingUid(), Binder.getCallingPid(),
- UserHandle.getCallingUserId())) {
- return Collections.emptyList();
- }
-
- return FingerprintService.this.getEnrolledFingerprints(userId);
- }
-
- @Override // Binder call
- public boolean hasEnrolledFingerprints(int userId, String opPackageName) {
- if (!canUseFingerprint(opPackageName, false /* foregroundOnly */,
- Binder.getCallingUid(), Binder.getCallingPid(),
- UserHandle.getCallingUserId())) {
- return false;
- }
-
- return FingerprintService.this.hasEnrolledFingerprints(userId);
- }
-
- @Override // Binder call
- public long getAuthenticatorId(String opPackageName) {
- // In this method, we're not checking whether the caller is permitted to use fingerprint
- // API because current authenticator ID is leaked (in a more contrived way) via Android
- // Keystore (android.security.keystore package): the user of that API can create a key
- // which requires fingerprint authentication for its use, and then query the key's
- // characteristics (hidden API) which returns, among other things, fingerprint
- // authenticator ID which was active at key creation time.
- //
- // Reason: The part of Android Keystore which runs inside an app's process invokes this
- // method in certain cases. Those cases are not always where the developer demonstrates
- // explicit intent to use fingerprint functionality. Thus, to avoiding throwing an
- // unexpected SecurityException this method does not check whether its caller is
- // permitted to use fingerprint API.
- //
- // The permission check should be restored once Android Keystore no longer invokes this
- // method from inside app processes.
-
- return FingerprintService.this.getAuthenticatorId(opPackageName);
- }
-
- @Override // Binder call
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
-
- final long ident = Binder.clearCallingIdentity();
- try {
- if (args.length > 0 && "--proto".equals(args[0])) {
- dumpProto(fd);
- } else {
- dumpInternal(pw);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- @Override // Binder call
- public void resetTimeout(byte [] token) {
- checkPermission(RESET_FINGERPRINT_LOCKOUT);
- // TODO: confirm security token when we move timeout management into the HAL layer.
- mHandler.post(mResetFailedAttemptsForCurrentUserRunnable);
- }
-
- @Override
- public void addLockoutResetCallback(final IFingerprintServiceLockoutResetCallback callback)
- throws RemoteException {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- addLockoutResetMonitor(
- new FingerprintServiceLockoutResetMonitor(callback));
- }
- });
- }
-
- @Override
- public boolean isClientActive() {
- checkPermission(MANAGE_FINGERPRINT);
- synchronized(FingerprintService.this) {
- return (mCurrentClient != null) || (mPendingClient != null);
- }
- }
-
- @Override
- public void addClientActiveCallback(IFingerprintClientActiveCallback callback) {
- checkPermission(MANAGE_FINGERPRINT);
- mClientActiveCallbacks.add(callback);
- }
-
- @Override
- public void removeClientActiveCallback(IFingerprintClientActiveCallback callback) {
- checkPermission(MANAGE_FINGERPRINT);
- mClientActiveCallbacks.remove(callback);
- }
- }
-
- private void dumpInternal(PrintWriter pw) {
- JSONObject dump = new JSONObject();
- try {
- dump.put("service", "Fingerprint Manager");
-
- JSONArray sets = new JSONArray();
- for (UserInfo user : UserManager.get(getContext()).getUsers()) {
- final int userId = user.getUserHandle().getIdentifier();
- final int N = mFingerprintUtils.getFingerprintsForUser(mContext, userId).size();
- PerformanceStats stats = mPerformanceMap.get(userId);
- PerformanceStats cryptoStats = mCryptoPerformanceMap.get(userId);
- JSONObject set = new JSONObject();
- set.put("id", userId);
- set.put("count", N);
- set.put("accept", (stats != null) ? stats.accept : 0);
- set.put("reject", (stats != null) ? stats.reject : 0);
- set.put("acquire", (stats != null) ? stats.acquire : 0);
- set.put("lockout", (stats != null) ? stats.lockout : 0);
- set.put("permanentLockout", (stats != null) ? stats.permanentLockout : 0);
- // cryptoStats measures statistics about secure fingerprint transactions
- // (e.g. to unlock password storage, make secure purchases, etc.)
- set.put("acceptCrypto", (cryptoStats != null) ? cryptoStats.accept : 0);
- set.put("rejectCrypto", (cryptoStats != null) ? cryptoStats.reject : 0);
- set.put("acquireCrypto", (cryptoStats != null) ? cryptoStats.acquire : 0);
- set.put("lockoutCrypto", (cryptoStats != null) ? cryptoStats.lockout : 0);
- set.put("permanentLockoutCrypto",
- (cryptoStats != null) ? cryptoStats.permanentLockout : 0);
- sets.put(set);
- }
-
- dump.put("prints", sets);
- } catch (JSONException e) {
- Slog.e(TAG, "dump formatting failure", e);
- }
- pw.println(dump);
- }
-
- private void dumpProto(FileDescriptor fd) {
- final ProtoOutputStream proto = new ProtoOutputStream(fd);
- for (UserInfo user : UserManager.get(getContext()).getUsers()) {
- final int userId = user.getUserHandle().getIdentifier();
-
- final long userToken = proto.start(FingerprintServiceDumpProto.USERS);
-
- proto.write(FingerprintUserStatsProto.USER_ID, userId);
- proto.write(FingerprintUserStatsProto.NUM_FINGERPRINTS,
- mFingerprintUtils.getFingerprintsForUser(mContext, userId).size());
-
- // Normal fingerprint authentications (e.g. lockscreen)
- final PerformanceStats normal = mPerformanceMap.get(userId);
- if (normal != null) {
- final long countsToken = proto.start(FingerprintUserStatsProto.NORMAL);
- proto.write(PerformanceStatsProto.ACCEPT, normal.accept);
- proto.write(PerformanceStatsProto.REJECT, normal.reject);
- proto.write(PerformanceStatsProto.ACQUIRE, normal.acquire);
- proto.write(PerformanceStatsProto.LOCKOUT, normal.lockout);
- proto.write(PerformanceStatsProto.PERMANENT_LOCKOUT, normal.permanentLockout);
- proto.end(countsToken);
- }
-
- // Statistics about secure fingerprint transactions (e.g. to unlock password
- // storage, make secure purchases, etc.)
- final PerformanceStats crypto = mCryptoPerformanceMap.get(userId);
- if (crypto != null) {
- final long countsToken = proto.start(FingerprintUserStatsProto.CRYPTO);
- proto.write(PerformanceStatsProto.ACCEPT, crypto.accept);
- proto.write(PerformanceStatsProto.REJECT, crypto.reject);
- proto.write(PerformanceStatsProto.ACQUIRE, crypto.acquire);
- proto.write(PerformanceStatsProto.LOCKOUT, crypto.lockout);
- proto.write(PerformanceStatsProto.PERMANENT_LOCKOUT, crypto.permanentLockout);
- proto.end(countsToken);
- }
-
- proto.end(userToken);
- }
- proto.flush();
- mPerformanceMap.clear();
- mCryptoPerformanceMap.clear();
- }
-
- @Override
- public void onStart() {
- publishBinderService(Context.FINGERPRINT_SERVICE, new FingerprintServiceWrapper());
- SystemServerInitThreadPool.get().submit(this::getFingerprintDaemon, TAG + ".onStart");
- listenForUserSwitches();
- }
-
- private void updateActiveGroup(int userId, String clientPackage) {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
-
- if (daemon != null) {
- try {
- userId = getUserOrWorkProfileId(clientPackage, userId);
- if (userId != mCurrentUserId) {
- int firstSdkInt = Build.VERSION.FIRST_SDK_INT;
- if (firstSdkInt < Build.VERSION_CODES.BASE) {
- Slog.e(TAG, "First SDK version " + firstSdkInt + " is invalid; must be " +
- "at least VERSION_CODES.BASE");
- }
- File baseDir;
- if (firstSdkInt <= Build.VERSION_CODES.O_MR1) {
- baseDir = Environment.getUserSystemDirectory(userId);
- } else {
- baseDir = Environment.getDataVendorDeDirectory(userId);
- }
-
- File fpDir = new File(baseDir, FP_DATA_DIR);
- if (!fpDir.exists()) {
- if (!fpDir.mkdir()) {
- Slog.v(TAG, "Cannot make directory: " + fpDir.getAbsolutePath());
- return;
- }
- // Calling mkdir() from this process will create a directory with our
- // permissions (inherited from the containing dir). This command fixes
- // the label.
- if (!SELinux.restorecon(fpDir)) {
- Slog.w(TAG, "Restorecons failed. Directory will have wrong label.");
- return;
- }
- }
-
- daemon.setActiveGroup(userId, fpDir.getAbsolutePath());
- mCurrentUserId = userId;
- }
- mAuthenticatorIds.put(userId,
- hasEnrolledFingerprints(userId) ? daemon.getAuthenticatorId() : 0L);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to setActiveGroup():", e);
- }
- }
- }
-
- /**
- * @param clientPackage the package of the caller
- * @return the profile id
- */
- private int getUserOrWorkProfileId(String clientPackage, int userId) {
- if (!isKeyguard(clientPackage) && isWorkProfile(userId)) {
- return userId;
- }
- return getEffectiveUserId(userId);
- }
-
- /**
- * @param userId
- * @return true if this is a work profile
- */
- private boolean isWorkProfile(int userId) {
- UserInfo userInfo = null;
- final long token = Binder.clearCallingIdentity();
- try {
- userInfo = mUserManager.getUserInfo(userId);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- return userInfo != null && userInfo.isManagedProfile();
- }
-
- private void listenForUserSwitches() {
- try {
- ActivityManager.getService().registerUserSwitchObserver(
- new SynchronousUserSwitchObserver() {
- @Override
- public void onUserSwitching(int newUserId) throws RemoteException {
- mHandler.obtainMessage(MSG_USER_SWITCHING, newUserId, 0 /* unused */)
- .sendToTarget();
- }
- }, TAG);
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to listen for user switching event" ,e);
- }
- }
-
- /***
- * @param opPackageName the name of the calling package
- * @return authenticator id for the calling user
- */
- public long getAuthenticatorId(String opPackageName) {
- final int userId = getUserOrWorkProfileId(opPackageName, UserHandle.getCallingUserId());
- return mAuthenticatorIds.getOrDefault(userId, 0L);
- }
-}
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintsUserState.java b/services/core/java/com/android/server/fingerprint/FingerprintsUserState.java
deleted file mode 100644
index b0cde2dd65ae..000000000000
--- a/services/core/java/com/android/server/fingerprint/FingerprintsUserState.java
+++ /dev/null
@@ -1,272 +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.fingerprint;
-
-import android.content.Context;
-import android.hardware.fingerprint.Fingerprint;
-import android.os.AsyncTask;
-import android.os.Environment;
-import android.util.AtomicFile;
-import android.util.Slog;
-import android.util.Xml;
-
-import com.android.internal.annotations.GuardedBy;
-
-import libcore.io.IoUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Class managing the set of fingerprint per user across device reboots.
- */
-class FingerprintsUserState {
-
- private static final String TAG = "FingerprintState";
- private static final String FINGERPRINT_FILE = "settings_fingerprint.xml";
-
- private static final String TAG_FINGERPRINTS = "fingerprints";
- private static final String TAG_FINGERPRINT = "fingerprint";
- private static final String ATTR_NAME = "name";
- private static final String ATTR_GROUP_ID = "groupId";
- private static final String ATTR_FINGER_ID = "fingerId";
- private static final String ATTR_DEVICE_ID = "deviceId";
-
- private final File mFile;
-
- @GuardedBy("this")
- private final ArrayList<Fingerprint> mFingerprints = new ArrayList<Fingerprint>();
- private final Context mCtx;
-
- public FingerprintsUserState(Context ctx, int userId) {
- mFile = getFileForUser(userId);
- mCtx = ctx;
- synchronized (this) {
- readStateSyncLocked();
- }
- }
-
- public void addFingerprint(int fingerId, int groupId) {
- synchronized (this) {
- mFingerprints.add(new Fingerprint(getUniqueName(), groupId, fingerId, 0));
- scheduleWriteStateLocked();
- }
- }
-
- public void removeFingerprint(int fingerId) {
- synchronized (this) {
- for (int i = 0; i < mFingerprints.size(); i++) {
- if (mFingerprints.get(i).getFingerId() == fingerId) {
- mFingerprints.remove(i);
- scheduleWriteStateLocked();
- break;
- }
- }
- }
- }
-
- public void renameFingerprint(int fingerId, CharSequence name) {
- synchronized (this) {
- for (int i = 0; i < mFingerprints.size(); i++) {
- if (mFingerprints.get(i).getFingerId() == fingerId) {
- Fingerprint old = mFingerprints.get(i);
- mFingerprints.set(i, new Fingerprint(name, old.getGroupId(), old.getFingerId(),
- old.getDeviceId()));
- scheduleWriteStateLocked();
- break;
- }
- }
- }
- }
-
- public List<Fingerprint> getFingerprints() {
- synchronized (this) {
- return getCopy(mFingerprints);
- }
- }
-
- /**
- * Finds a unique name for the given fingerprint
- * @return unique name
- */
- private String getUniqueName() {
- int guess = 1;
- while (true) {
- // Not the most efficient algorithm in the world, but there shouldn't be more than 10
- String name = mCtx.getString(com.android.internal.R.string.fingerprint_name_template,
- guess);
- if (isUnique(name)) {
- return name;
- }
- guess++;
- }
- }
-
- private boolean isUnique(String name) {
- for (Fingerprint fp : mFingerprints) {
- if (fp.getName().equals(name)) {
- return false;
- }
- }
- return true;
- }
-
- private static File getFileForUser(int userId) {
- return new File(Environment.getUserSystemDirectory(userId), FINGERPRINT_FILE);
- }
-
- private final Runnable mWriteStateRunnable = new Runnable() {
- @Override
- public void run() {
- doWriteState();
- }
- };
-
- private void scheduleWriteStateLocked() {
- AsyncTask.execute(mWriteStateRunnable);
- }
-
- private ArrayList<Fingerprint> getCopy(ArrayList<Fingerprint> array) {
- ArrayList<Fingerprint> result = new ArrayList<Fingerprint>(array.size());
- for (int i = 0; i < array.size(); i++) {
- Fingerprint fp = array.get(i);
- result.add(new Fingerprint(fp.getName(), fp.getGroupId(), fp.getFingerId(),
- fp.getDeviceId()));
- }
- return result;
- }
-
- private void doWriteState() {
- AtomicFile destination = new AtomicFile(mFile);
-
- ArrayList<Fingerprint> fingerprints;
-
- synchronized (this) {
- fingerprints = getCopy(mFingerprints);
- }
-
- FileOutputStream out = null;
- try {
- out = destination.startWrite();
-
- XmlSerializer serializer = Xml.newSerializer();
- serializer.setOutput(out, "utf-8");
- serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
- serializer.startDocument(null, true);
- serializer.startTag(null, TAG_FINGERPRINTS);
-
- final int count = fingerprints.size();
- for (int i = 0; i < count; i++) {
- Fingerprint fp = fingerprints.get(i);
- serializer.startTag(null, TAG_FINGERPRINT);
- serializer.attribute(null, ATTR_FINGER_ID, Integer.toString(fp.getFingerId()));
- serializer.attribute(null, ATTR_NAME, fp.getName().toString());
- serializer.attribute(null, ATTR_GROUP_ID, Integer.toString(fp.getGroupId()));
- serializer.attribute(null, ATTR_DEVICE_ID, Long.toString(fp.getDeviceId()));
- serializer.endTag(null, TAG_FINGERPRINT);
- }
-
- serializer.endTag(null, TAG_FINGERPRINTS);
- serializer.endDocument();
- destination.finishWrite(out);
-
- // Any error while writing is fatal.
- } catch (Throwable t) {
- Slog.wtf(TAG, "Failed to write settings, restoring backup", t);
- destination.failWrite(out);
- throw new IllegalStateException("Failed to write fingerprints", t);
- } finally {
- IoUtils.closeQuietly(out);
- }
- }
-
- @GuardedBy("this")
- private void readStateSyncLocked() {
- FileInputStream in;
- if (!mFile.exists()) {
- return;
- }
- try {
- in = new FileInputStream(mFile);
- } catch (FileNotFoundException fnfe) {
- Slog.i(TAG, "No fingerprint state");
- return;
- }
- try {
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(in, null);
- parseStateLocked(parser);
-
- } catch (XmlPullParserException | IOException e) {
- throw new IllegalStateException("Failed parsing settings file: "
- + mFile , e);
- } finally {
- IoUtils.closeQuietly(in);
- }
- }
-
- @GuardedBy("this")
- private void parseStateLocked(XmlPullParser parser)
- throws IOException, XmlPullParserException {
- final int outerDepth = parser.getDepth();
- int type;
- while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
- && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
- if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
- continue;
- }
-
- String tagName = parser.getName();
- if (tagName.equals(TAG_FINGERPRINTS)) {
- parseFingerprintsLocked(parser);
- }
- }
- }
-
- @GuardedBy("this")
- private void parseFingerprintsLocked(XmlPullParser parser)
- throws IOException, XmlPullParserException {
-
- final int outerDepth = parser.getDepth();
- int type;
- while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
- && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
- if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
- continue;
- }
-
- String tagName = parser.getName();
- if (tagName.equals(TAG_FINGERPRINT)) {
- String name = parser.getAttributeValue(null, ATTR_NAME);
- String groupId = parser.getAttributeValue(null, ATTR_GROUP_ID);
- String fingerId = parser.getAttributeValue(null, ATTR_FINGER_ID);
- String deviceId = parser.getAttributeValue(null, ATTR_DEVICE_ID);
- mFingerprints.add(new Fingerprint(name, Integer.parseInt(groupId),
- Integer.parseInt(fingerId), Integer.parseInt(deviceId)));
- }
- }
- }
-
-}
diff --git a/services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java b/services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java
deleted file mode 100644
index 434db98ad373..000000000000
--- a/services/core/java/com/android/server/fingerprint/InternalEnumerateClient.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2017 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.fingerprint;
-
-import android.content.Context;
-import android.hardware.fingerprint.Fingerprint;
-import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.os.IBinder;
-import android.util.Slog;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An internal class to help clean up unknown fingerprints in the hardware and software
- */
-public abstract class InternalEnumerateClient extends EnumerateClient {
-
- private List<Fingerprint> mEnrolledList;
- private List<Fingerprint> mUnknownFingerprints = new ArrayList<>(); // list of fp to delete
-
- public InternalEnumerateClient(Context context, long halDeviceId, IBinder token,
- IFingerprintServiceReceiver receiver, int groupId, int userId,
- boolean restricted, String owner, List<Fingerprint> enrolledList) {
-
- super(context, halDeviceId, token, receiver, userId, groupId, restricted, owner);
- mEnrolledList = enrolledList;
- }
-
- private void handleEnumeratedFingerprint(int fingerId, int groupId, int remaining) {
-
- boolean matched = false;
- for (int i=0; i<mEnrolledList.size(); i++) {
- if (mEnrolledList.get(i).getFingerId() == fingerId) {
- mEnrolledList.remove(i);
- matched = true;
- break;
- }
- }
-
- // fingerId 0 means no fingerprints are in hardware
- if (!matched && fingerId != 0) {
- Fingerprint fingerprint = new Fingerprint("", groupId, fingerId, getHalDeviceId());
- mUnknownFingerprints.add(fingerprint);
- }
- }
-
- private void doFingerprintCleanup() {
-
- if (mEnrolledList == null) {
- return;
- }
-
- for (Fingerprint f : mEnrolledList) {
- Slog.e(TAG, "Internal Enumerate: Removing dangling enrolled fingerprint: "
- + f.getName() + " " + f.getFingerId() + " " + f.getGroupId()
- + " " + f.getDeviceId());
-
- FingerprintUtils.getInstance().removeFingerprintIdForUser(getContext(),
- f.getFingerId(), getTargetUserId());
- }
- mEnrolledList.clear();
- }
-
- public List<Fingerprint> getUnknownFingerprints() {
- return mUnknownFingerprints;
- }
-
- @Override
- public boolean onEnumerationResult(int fingerId, int groupId, int remaining) {
-
- handleEnumeratedFingerprint(fingerId, groupId, remaining);
- if (remaining == 0) {
- doFingerprintCleanup();
- }
-
- return remaining == 0;
- }
-
-}
diff --git a/services/core/java/com/android/server/fingerprint/InternalRemovalClient.java b/services/core/java/com/android/server/fingerprint/InternalRemovalClient.java
deleted file mode 100644
index 19f61feac1f4..000000000000
--- a/services/core/java/com/android/server/fingerprint/InternalRemovalClient.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2017 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.fingerprint;
-
-import android.content.Context;
-import android.os.IBinder;
-import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import com.android.server.fingerprint.RemovalClient;
-
-public abstract class InternalRemovalClient extends RemovalClient {
-
- public InternalRemovalClient(Context context, long halDeviceId, IBinder token,
- IFingerprintServiceReceiver receiver, int fingerId, int groupId, int userId,
- boolean restricted, String owner) {
-
- super(context, halDeviceId, token, receiver, fingerId, groupId, userId, restricted, owner);
-
- }
-}
diff --git a/services/core/java/com/android/server/fingerprint/RemovalClient.java b/services/core/java/com/android/server/fingerprint/RemovalClient.java
deleted file mode 100644
index ffc84888b001..000000000000
--- a/services/core/java/com/android/server/fingerprint/RemovalClient.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * Copyright (C) 2016 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.fingerprint;
-
-import android.content.Context;
-import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.IFingerprintServiceReceiver;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.util.Slog;
-import com.android.internal.logging.MetricsLogger;
-
-/**
- * A class to keep track of the remove state for a given client.
- */
-public abstract class RemovalClient extends ClientMonitor {
- private int mFingerId;
-
- public RemovalClient(Context context, long halDeviceId, IBinder token,
- IFingerprintServiceReceiver receiver, int fingerId, int groupId, int userId,
- boolean restricted, String owner) {
- super(context, halDeviceId, token, receiver, userId, groupId, restricted, owner);
- mFingerId = fingerId;
- }
-
- @Override
- public int start() {
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- // The fingerprint template ids will be removed when we get confirmation from the HAL
- try {
- final int result = daemon.remove(getGroupId(), mFingerId);
- if (result != 0) {
- Slog.w(TAG, "startRemove with id = " + mFingerId + " failed, result=" + result);
- MetricsLogger.histogram(getContext(), "fingerprintd_remove_start_error", result);
- onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */);
- return result;
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "startRemove failed", e);
- }
- return 0;
- }
-
- @Override
- public int stop(boolean initiatedByClient) {
- if (mAlreadyCancelled) {
- Slog.w(TAG, "stopRemove: already cancelled!");
- return 0;
- }
- IBiometricsFingerprint daemon = getFingerprintDaemon();
- if (daemon == null) {
- Slog.w(TAG, "stopRemoval: no fingerprint HAL!");
- return ERROR_ESRCH;
- }
- try {
- final int result = daemon.cancel();
- if (result != 0) {
- Slog.w(TAG, "stopRemoval failed, result=" + result);
- return result;
- }
- if (DEBUG) Slog.w(TAG, "client " + getOwnerString() + " is no longer removing");
- } catch (RemoteException e) {
- Slog.e(TAG, "stopRemoval failed", e);
- return ERROR_ESRCH;
- }
- mAlreadyCancelled = true;
- return 0; // success
- }
-
- /*
- * @return true if we're done.
- */
- private boolean sendRemoved(int fingerId, int groupId, int remaining) {
- IFingerprintServiceReceiver receiver = getReceiver();
- try {
- if (receiver != null) {
- receiver.onRemoved(getHalDeviceId(), fingerId, groupId, remaining);
- }
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to notify Removed:", e);
- }
- return remaining == 0;
- }
-
- @Override
- public boolean onRemoved(int fingerId, int groupId, int remaining) {
- if (fingerId != 0) {
- FingerprintUtils.getInstance().removeFingerprintIdForUser(getContext(), fingerId,
- getTargetUserId());
- }
- return sendRemoved(fingerId, getGroupId(), remaining);
- }
-
- @Override
- public boolean onEnrollResult(int fingerId, int groupId, int rem) {
- if (DEBUG) Slog.w(TAG, "onEnrollResult() called for remove!");
- return true; // Invalid for Remove
- }
-
- @Override
- public boolean onAuthenticated(int fingerId, int groupId) {
- if (DEBUG) Slog.w(TAG, "onAuthenticated() called for remove!");
- return true; // Invalid for Remove.
- }
-
- @Override
- public boolean onEnumerationResult(int fingerId, int groupId, int remaining) {
- if (DEBUG) Slog.w(TAG, "onEnumerationResult() called for remove!");
- return true; // Invalid for Remove.
- }
-
-
-}
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index a2a55e532ef4..3f56619d3f40 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -16,6 +16,7 @@
package com.android.server.hdmi;
+import android.annotation.IntDef;
import android.hardware.hdmi.HdmiDeviceInfo;
/**
@@ -200,6 +201,21 @@ final class Constants {
static final int UNKNOWN_VOLUME = -1;
+ // States of property PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON
+ // to decide if turn on the system audio control when power on the device
+ @IntDef({
+ ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON,
+ USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON,
+ NEVER_SYSTEM_AUDIO_CONTROL_ON_POWER_ON
+ })
+ @interface SystemAudioControlOnPowerOn {}
+ static final int ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON = 0;
+ static final int USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON = 1;
+ static final int NEVER_SYSTEM_AUDIO_CONTROL_ON_POWER_ON = 2;
+
+
+ static final String PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM =
+ "persist.sys.hdmi.addr.audiosystem";
static final String PROPERTY_PREFERRED_ADDRESS_PLAYBACK = "persist.sys.hdmi.addr.playback";
static final String PROPERTY_PREFERRED_ADDRESS_TV = "persist.sys.hdmi.addr.tv";
@@ -219,6 +235,14 @@ final class Constants {
// when it's an active source. True by default.
static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake";
+ // TODO(UI): Set this from UI to decide if turn on System Audio Mode when power on the device
+ /** Property to decide if turn on the system audio control when power on the device
+ * Default is always turn on.
+ * State must be a valid {@link SystemAudioControlOnPowerOn} int.
+ */
+ static final String PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON =
+ "persist.sys.hdmi.system_audio_control_on_power_on";
+
static final int RECORDING_TYPE_DIGITAL_RF = 1;
static final int RECORDING_TYPE_ANALOGUE_RF = 2;
static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3;
diff --git a/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java b/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java
index 2c1a7d5d18e6..15ec486f989b 100644
--- a/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java
+++ b/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java
@@ -85,7 +85,7 @@ final class DelayedMessageBuffer {
void processAllMessages() {
// Use the copied buffer.
- ArrayList<HdmiCecMessage> copiedBuffer = new ArrayList<HdmiCecMessage>(mBuffer);
+ ArrayList<HdmiCecMessage> copiedBuffer = new ArrayList<>(mBuffer);
mBuffer.clear();
for (HdmiCecMessage message : copiedBuffer) {
mDevice.onMessage(message);
@@ -104,7 +104,7 @@ final class DelayedMessageBuffer {
* are associated with
*/
void processMessagesForDevice(int address) {
- ArrayList<HdmiCecMessage> copiedBuffer = new ArrayList<HdmiCecMessage>(mBuffer);
+ ArrayList<HdmiCecMessage> copiedBuffer = new ArrayList<>(mBuffer);
mBuffer.clear();
HdmiLogger.debug("Checking message for address:" + address);
for (HdmiCecMessage message : copiedBuffer) {
@@ -134,7 +134,7 @@ final class DelayedMessageBuffer {
* @param address logical address of the device to be the active source
*/
void processActiveSource(int address) {
- ArrayList<HdmiCecMessage> copiedBuffer = new ArrayList<HdmiCecMessage>(mBuffer);
+ ArrayList<HdmiCecMessage> copiedBuffer = new ArrayList<>(mBuffer);
mBuffer.clear();
for (HdmiCecMessage message : copiedBuffer) {
if (message.getOpcode() == Constants.MESSAGE_ACTIVE_SOURCE
diff --git a/services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java b/services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java
index db8dedbf12cc..b75e75feabb3 100755
--- a/services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java
+++ b/services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java
@@ -386,6 +386,7 @@ final class DeviceDiscoveryAction extends HdmiCecFeatureAction {
return;
case STATE_WAITING_FOR_VENDOR_ID:
queryVendorId(address);
+ return;
default:
return;
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java
index 07c3a3871110..de6cdd48fb09 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java
@@ -110,9 +110,12 @@ final class HdmiCecController {
private final ArrayBlockingQueue<MessageHistoryRecord> mMessageHistory =
new ArrayBlockingQueue<>(MAX_CEC_MESSAGE_HISTORY);
+ private final NativeWrapper mNativeWrapperImpl;
+
// Private constructor. Use HdmiCecController.create().
- private HdmiCecController(HdmiControlService service) {
+ private HdmiCecController(HdmiControlService service, NativeWrapper nativeWrapper) {
mService = service;
+ mNativeWrapperImpl = nativeWrapper;
}
/**
@@ -126,15 +129,24 @@ final class HdmiCecController {
* returns {@code null}.
*/
static HdmiCecController create(HdmiControlService service) {
- HdmiCecController controller = new HdmiCecController(service);
- long nativePtr = nativeInit(controller, service.getServiceLooper().getQueue());
- if (nativePtr == 0L) {
- controller = null;
- return null;
- }
+ return createWithNativeWrapper(service, new NativeWrapperImpl());
+ }
+
+ /**
+ * A factory method with injection of native methods for testing.
+ */
+ static HdmiCecController createWithNativeWrapper(
+ HdmiControlService service, NativeWrapper nativeWrapper) {
+ HdmiCecController controller = new HdmiCecController(service, nativeWrapper);
+ long nativePtr = nativeWrapper
+ .nativeInit(controller, service.getServiceLooper().getQueue());
+ if (nativePtr == 0L) {
+ controller = null;
+ return null;
+ }
- controller.init(nativePtr);
- return controller;
+ controller.init(nativePtr);
+ return controller;
}
private void init(long nativePtr) {
@@ -235,7 +247,7 @@ final class HdmiCecController {
HdmiPortInfo[] getPortInfos() {
- return nativeGetPortInfos(mNativePtr);
+ return mNativeWrapperImpl.nativeGetPortInfos(mNativePtr);
}
/**
@@ -263,7 +275,7 @@ final class HdmiCecController {
int addLogicalAddress(int newLogicalAddress) {
assertRunOnServiceThread();
if (HdmiUtils.isValidAddress(newLogicalAddress)) {
- return nativeAddLogicalAddress(mNativePtr, newLogicalAddress);
+ return mNativeWrapperImpl.nativeAddLogicalAddress(mNativePtr, newLogicalAddress);
} else {
return Result.FAILURE_INVALID_ARGS;
}
@@ -280,7 +292,7 @@ final class HdmiCecController {
for (int i = 0; i < mLocalDevices.size(); ++i) {
mLocalDevices.valueAt(i).clearAddress();
}
- nativeClearLogicalAddress(mNativePtr);
+ mNativeWrapperImpl.nativeClearLogicalAddress(mNativePtr);
}
@ServiceThreadOnly
@@ -300,7 +312,7 @@ final class HdmiCecController {
@ServiceThreadOnly
int getPhysicalAddress() {
assertRunOnServiceThread();
- return nativeGetPhysicalAddress(mNativePtr);
+ return mNativeWrapperImpl.nativeGetPhysicalAddress(mNativePtr);
}
/**
@@ -311,7 +323,7 @@ final class HdmiCecController {
@ServiceThreadOnly
int getVersion() {
assertRunOnServiceThread();
- return nativeGetVersion(mNativePtr);
+ return mNativeWrapperImpl.nativeGetVersion(mNativePtr);
}
/**
@@ -322,7 +334,7 @@ final class HdmiCecController {
@ServiceThreadOnly
int getVendorId() {
assertRunOnServiceThread();
- return nativeGetVendorId(mNativePtr);
+ return mNativeWrapperImpl.nativeGetVendorId(mNativePtr);
}
/**
@@ -335,7 +347,7 @@ final class HdmiCecController {
void setOption(int flag, boolean enabled) {
assertRunOnServiceThread();
HdmiLogger.debug("setOption: [flag:%d, enabled:%b]", flag, enabled);
- nativeSetOption(mNativePtr, flag, enabled);
+ mNativeWrapperImpl.nativeSetOption(mNativePtr, flag, enabled);
}
/**
@@ -349,7 +361,7 @@ final class HdmiCecController {
if (!LanguageTag.isLanguage(language)) {
return;
}
- nativeSetLanguage(mNativePtr, language);
+ mNativeWrapperImpl.nativeSetLanguage(mNativePtr, language);
}
/**
@@ -361,7 +373,7 @@ final class HdmiCecController {
@ServiceThreadOnly
void enableAudioReturnChannel(int port, boolean enabled) {
assertRunOnServiceThread();
- nativeEnableAudioReturnChannel(mNativePtr, port, enabled);
+ mNativeWrapperImpl.nativeEnableAudioReturnChannel(mNativePtr, port, enabled);
}
/**
@@ -373,7 +385,7 @@ final class HdmiCecController {
@ServiceThreadOnly
boolean isConnected(int port) {
assertRunOnServiceThread();
- return nativeIsConnected(mNativePtr, port);
+ return mNativeWrapperImpl.nativeIsConnected(mNativePtr, port);
}
/**
@@ -494,7 +506,8 @@ final class HdmiCecController {
for (int i = 0; i < retryCount; ++i) {
// <Polling Message> is a message which has empty body.
int ret =
- nativeSendCecCommand(mNativePtr, sourceAddress, destinationAddress, EMPTY_BODY);
+ mNativeWrapperImpl.nativeSendCecCommand(
+ mNativePtr, sourceAddress, destinationAddress, EMPTY_BODY);
if (ret == SendMessageResult.SUCCESS) {
return true;
} else if (ret != SendMessageResult.NACK) {
@@ -598,8 +611,8 @@ final class HdmiCecController {
int i = 0;
int errorCode = SendMessageResult.SUCCESS;
do {
- errorCode = nativeSendCecCommand(mNativePtr, cecMessage.getSource(),
- cecMessage.getDestination(), body);
+ errorCode = mNativeWrapperImpl.nativeSendCecCommand(mNativePtr,
+ cecMessage.getSource(), cecMessage.getDestination(), body);
if (errorCode == SendMessageResult.SUCCESS) {
break;
}
@@ -669,9 +682,24 @@ final class HdmiCecController {
pw.decreaseIndent();
}
+ protected interface NativeWrapper {
+ long nativeInit(HdmiCecController handler, MessageQueue messageQueue);
+ int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress, byte[] body);
+ int nativeAddLogicalAddress(long controllerPtr, int logicalAddress);
+ void nativeClearLogicalAddress(long controllerPtr);
+ int nativeGetPhysicalAddress(long controllerPtr);
+ int nativeGetVersion(long controllerPtr);
+ int nativeGetVendorId(long controllerPtr);
+ HdmiPortInfo[] nativeGetPortInfos(long controllerPtr);
+ void nativeSetOption(long controllerPtr, int flag, boolean enabled);
+ void nativeSetLanguage(long controllerPtr, String language);
+ void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag);
+ boolean nativeIsConnected(long controllerPtr, int port);
+ }
+
private static native long nativeInit(HdmiCecController handler, MessageQueue messageQueue);
private static native int nativeSendCecCommand(long controllerPtr, int srcAddress,
- int dstAddress, byte[] body);
+ int dstAddress, byte[] body);
private static native int nativeAddLogicalAddress(long controllerPtr, int logicalAddress);
private static native void nativeClearLogicalAddress(long controllerPtr);
private static native int nativeGetPhysicalAddress(long controllerPtr);
@@ -680,9 +708,74 @@ final class HdmiCecController {
private static native HdmiPortInfo[] nativeGetPortInfos(long controllerPtr);
private static native void nativeSetOption(long controllerPtr, int flag, boolean enabled);
private static native void nativeSetLanguage(long controllerPtr, String language);
- private static native void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag);
+ private static native void nativeEnableAudioReturnChannel(long controllerPtr,
+ int port, boolean flag);
private static native boolean nativeIsConnected(long controllerPtr, int port);
+ private static final class NativeWrapperImpl implements NativeWrapper {
+
+ @Override
+ public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
+ return HdmiCecController.nativeInit(handler, messageQueue);
+ }
+
+ @Override
+ public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress,
+ byte[] body) {
+ return HdmiCecController.nativeSendCecCommand(controllerPtr, srcAddress, dstAddress, body);
+ }
+
+ @Override
+ public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
+ return HdmiCecController.nativeAddLogicalAddress(controllerPtr, logicalAddress);
+ }
+
+ @Override
+ public void nativeClearLogicalAddress(long controllerPtr) {
+ HdmiCecController.nativeClearLogicalAddress(controllerPtr);
+ }
+
+ @Override
+ public int nativeGetPhysicalAddress(long controllerPtr) {
+ return HdmiCecController.nativeGetPhysicalAddress(controllerPtr);
+ }
+
+ @Override
+ public int nativeGetVersion(long controllerPtr) {
+ return HdmiCecController.nativeGetVersion(controllerPtr);
+ }
+
+ @Override
+ public int nativeGetVendorId(long controllerPtr) {
+ return HdmiCecController.nativeGetVendorId(controllerPtr);
+ }
+
+ @Override
+ public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
+ return HdmiCecController.nativeGetPortInfos(controllerPtr);
+ }
+
+ @Override
+ public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {
+ HdmiCecController.nativeSetOption(controllerPtr, flag, enabled);
+ }
+
+ @Override
+ public void nativeSetLanguage(long controllerPtr, String language) {
+ HdmiCecController.nativeSetLanguage(controllerPtr, language);
+ }
+
+ @Override
+ public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {
+ HdmiCecController.nativeEnableAudioReturnChannel(controllerPtr, port, flag);
+ }
+
+ @Override
+ public boolean nativeIsConnected(long controllerPtr, int port) {
+ return HdmiCecController.nativeIsConnected(controllerPtr, port);
+ }
+ }
+
private final class MessageHistoryRecord {
private final long mTime;
private final boolean mIsReceived; // true if received message and false if sent message
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 0cba76ba7346..1dd10f550985 100755
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -16,6 +16,7 @@
package com.android.server.hdmi;
+import android.annotation.Nullable;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.input.InputManager;
import android.os.Handler;
@@ -31,6 +32,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
+import com.android.server.hdmi.HdmiControlService.SendMessageCallback;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
@@ -167,6 +169,8 @@ abstract class HdmiCecLocalDevice {
return new HdmiCecLocalDeviceTv(service);
case HdmiDeviceInfo.DEVICE_PLAYBACK:
return new HdmiCecLocalDevicePlayback(service);
+ case HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM:
+ return new HdmiCecLocalDeviceAudioSystem(service);
default:
return null;
}
@@ -249,11 +253,11 @@ abstract class HdmiCecLocalDevice {
case Constants.MESSAGE_SET_MENU_LANGUAGE:
return handleSetMenuLanguage(message);
case Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS:
- return handleGivePhysicalAddress();
+ return handleGivePhysicalAddress(null);
case Constants.MESSAGE_GIVE_OSD_NAME:
return handleGiveOsdName(message);
case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID:
- return handleGiveDeviceVendorId();
+ return handleGiveDeviceVendorId(null);
case Constants.MESSAGE_GET_CEC_VERSION:
return handleGetCecVersion(message);
case Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS:
@@ -262,14 +266,28 @@ abstract class HdmiCecLocalDevice {
return handleRoutingChange(message);
case Constants.MESSAGE_ROUTING_INFORMATION:
return handleRoutingInformation(message);
+ case Constants.MESSAGE_REQUEST_ARC_INITIATION:
+ return handleRequestArcInitiate(message);
+ case Constants.MESSAGE_REQUEST_ARC_TERMINATION:
+ return handleRequestArcTermination(message);
case Constants.MESSAGE_INITIATE_ARC:
return handleInitiateArc(message);
case Constants.MESSAGE_TERMINATE_ARC:
return handleTerminateArc(message);
+ case Constants.MESSAGE_REPORT_ARC_INITIATED:
+ return handleReportArcInitiate(message);
+ case Constants.MESSAGE_REPORT_ARC_TERMINATED:
+ return handleReportArcTermination(message);
+ case Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST:
+ return handleSystemAudioModeRequest(message);
case Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE:
return handleSetSystemAudioMode(message);
case Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS:
return handleSystemAudioModeStatus(message);
+ case Constants.MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS:
+ return handleGiveSystemAudioModeStatus(message);
+ case Constants.MESSAGE_GIVE_AUDIO_STATUS:
+ return handleGiveAudioStatus(message);
case Constants.MESSAGE_REPORT_AUDIO_STATUS:
return handleReportAudioStatus(message);
case Constants.MESSAGE_STANDBY:
@@ -325,23 +343,23 @@ abstract class HdmiCecLocalDevice {
}
@ServiceThreadOnly
- protected boolean handleGivePhysicalAddress() {
+ protected boolean handleGivePhysicalAddress(@Nullable SendMessageCallback callback) {
assertRunOnServiceThread();
int physicalAddress = mService.getPhysicalAddress();
HdmiCecMessage cecMessage = HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
mAddress, physicalAddress, mDeviceType);
- mService.sendCecCommand(cecMessage);
+ mService.sendCecCommand(cecMessage, callback);
return true;
}
@ServiceThreadOnly
- protected boolean handleGiveDeviceVendorId() {
+ protected boolean handleGiveDeviceVendorId(@Nullable SendMessageCallback callback) {
assertRunOnServiceThread();
int vendorId = mService.getVendorId();
HdmiCecMessage cecMessage = HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
mAddress, vendorId);
- mService.sendCecCommand(cecMessage);
+ mService.sendCecCommand(cecMessage, callback);
return true;
}
@@ -417,10 +435,18 @@ abstract class HdmiCecLocalDevice {
return false;
}
+ protected boolean handleGiveSystemAudioModeStatus(HdmiCecMessage message) {
+ return false;
+ }
+
protected boolean handleSetSystemAudioMode(HdmiCecMessage message) {
return false;
}
+ protected boolean handleSystemAudioModeRequest(HdmiCecMessage message) {
+ return false;
+ }
+
protected boolean handleTerminateArc(HdmiCecMessage message) {
return false;
}
@@ -429,10 +455,30 @@ abstract class HdmiCecLocalDevice {
return false;
}
+ protected boolean handleRequestArcInitiate(HdmiCecMessage message) {
+ return false;
+ }
+
+ protected boolean handleRequestArcTermination(HdmiCecMessage message) {
+ return false;
+ }
+
+ protected boolean handleReportArcInitiate(HdmiCecMessage message) {
+ return false;
+ }
+
+ protected boolean handleReportArcTermination(HdmiCecMessage message) {
+ return false;
+ }
+
protected boolean handleReportAudioStatus(HdmiCecMessage message) {
return false;
}
+ protected boolean handleGiveAudioStatus(HdmiCecMessage message) {
+ return false;
+ }
+
@ServiceThreadOnly
protected boolean handleStandby(HdmiCecMessage message) {
assertRunOnServiceThread();
@@ -514,8 +560,7 @@ abstract class HdmiCecLocalDevice {
static boolean isPowerOffOrToggleCommand(HdmiCecMessage message) {
byte[] params = message.getParams();
return message.getOpcode() == Constants.MESSAGE_USER_CONTROL_PRESSED
- && (params[0] == HdmiCecKeycode.CEC_KEYCODE_POWER
- || params[0] == HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION
+ && (params[0] == HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION
|| params[0] == HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION);
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
new file mode 100644
index 000000000000..3ededfdd2fb3
--- /dev/null
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.hdmi;
+
+import android.hardware.hdmi.HdmiDeviceInfo;
+import android.media.AudioManager;
+import android.os.SystemProperties;
+import android.provider.Settings.Global;
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
+
+/**
+ * Represent a logical device of type {@link HdmiDeviceInfo#DEVICE_AUDIO_SYSTEM} residing in
+ * Android system.
+ */
+public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice {
+
+ private static final String TAG = "HdmiCecLocalDeviceAudioSystem";
+
+ // Whether System audio mode is activated or not.
+ // This becomes true only when all system audio sequences are finished.
+ @GuardedBy("mLock")
+ private boolean mSystemAudioActivated;
+
+ // Whether the System Audio Control feature is enabled or not. True by default.
+ @GuardedBy("mLock")
+ private boolean mSystemAudioControlFeatureEnabled;
+
+ protected HdmiCecLocalDeviceAudioSystem(HdmiControlService service) {
+ super(service, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
+ mSystemAudioControlFeatureEnabled = true;
+ // TODO(amyjojo) make System Audio Control controllable by users
+ /*mSystemAudioControlFeatureEnabled =
+ mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED, true);*/
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected void onAddressAllocated(int logicalAddress, int reason) {
+ assertRunOnServiceThread();
+ mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
+ mAddress, mService.getPhysicalAddress(), mDeviceType));
+ mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
+ mAddress, mService.getVendorId()));
+ startQueuedActions();
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected int getPreferredAddress() {
+ assertRunOnServiceThread();
+ return SystemProperties.getInt(Constants.PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM,
+ Constants.ADDR_UNREGISTERED);
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected void setPreferredAddress(int addr) {
+ assertRunOnServiceThread();
+ SystemProperties.set(Constants.PROPERTY_PREFERRED_ADDRESS_AUDIO_SYSTEM,
+ String.valueOf(addr));
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleReportAudioStatus(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ // TODO(amyjojo): implement report audio status handler
+ HdmiLogger.debug(TAG + "Stub handleReportAudioStatus");
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleInitiateArc(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ // TODO(amyjojo): implement initiate arc handler
+ HdmiLogger.debug(TAG + "Stub handleInitiateArc");
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleReportArcInitiate(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ // TODO(amyjojo): implement report arc initiate handler
+ HdmiLogger.debug(TAG + "Stub handleReportArcInitiate");
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleReportArcTermination(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ // TODO(amyjojo): implement report arc terminate handler
+ HdmiLogger.debug(TAG + "Stub handleReportArcTermination");
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleGiveAudioStatus(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+
+ reportAudioStatus(message);
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleGiveSystemAudioModeStatus(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ mService.sendCecCommand(HdmiCecMessageBuilder
+ .buildReportSystemAudioMode(mAddress, message.getSource(), mSystemAudioActivated));
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleRequestArcInitiate(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ // TODO(b/80296911): Check if ARC supported.
+
+ // TODO(b/80296911): Check if port is ready to accept.
+
+ // TODO(b/80296911): if both true, activate ARC functinality and
+ mService.sendCecCommand(HdmiCecMessageBuilder
+ .buildInitiateArc(mAddress, message.getSource()));
+ // TODO(b/80296911): else, send <Feature Abort>["Unrecongnized opcode"]
+
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleRequestArcTermination(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ // TODO(b/80297105): Check if ARC supported.
+
+ // TODO(b/80297105): Check is currently in arc.
+
+ // TODO(b/80297105): If both true, deactivate ARC functionality and
+ mService.sendCecCommand(HdmiCecMessageBuilder
+ .buildTerminateArc(mAddress, message.getSource()));
+ // TODO(b/80297105): else, send <Feature Abort>["Unrecongnized opcode"]
+
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleSystemAudioModeRequest(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ boolean systemAudioStatusOn = message.getParams().length != 0;
+ if (!setSystemAudioMode(systemAudioStatusOn)) {
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ return true;
+ }
+
+ if (systemAudioStatusOn) {
+ // TODO(amyjojo): Bring up device when it's on standby mode
+
+ // TODO(amyjojo): Switch to the corresponding input
+
+ }
+ // Mute device when feature is turned off and unmute device when feature is turned on
+ boolean currentMuteStatus =
+ mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC);
+ if (currentMuteStatus == systemAudioStatusOn) {
+ mService.getAudioManager().adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ systemAudioStatusOn ? AudioManager.ADJUST_UNMUTE : AudioManager.ADJUST_MUTE, 0);
+ }
+
+ mService.sendCecCommand(HdmiCecMessageBuilder
+ .buildSetSystemAudioMode(mAddress, Constants.ADDR_BROADCAST, systemAudioStatusOn));
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleSetSystemAudioMode(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ if (!setSystemAudioMode(HdmiUtils.parseCommandParamSystemAudioStatus(message))) {
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ }
+ return true;
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean handleSystemAudioModeStatus(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ if (!setSystemAudioMode(HdmiUtils.parseCommandParamSystemAudioStatus(message))) {
+ mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
+ }
+ return true;
+ }
+
+ private void reportAudioStatus(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+
+ int volume = mService.getAudioManager().getStreamVolume(AudioManager.STREAM_MUSIC);
+ boolean mute = mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC);
+ int maxVolume = mService.getAudioManager().getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+ int scaledVolume = VolumeControlAction.scaleToCecVolume(volume, maxVolume);
+
+ mService.sendCecCommand(HdmiCecMessageBuilder
+ .buildReportAudioStatus(mAddress, message.getSource(), scaledVolume, mute));
+ }
+
+ protected boolean setSystemAudioMode(boolean newSystemAudioMode) {
+ if (!isSystemAudioControlFeatureEnabled()) {
+ HdmiLogger.debug("Cannot turn " +
+ (newSystemAudioMode ? "on" : "off") + "system audio mode " +
+ "because the System Audio Control feature is disabled.");
+ return false;
+ }
+ HdmiLogger.debug("System Audio Mode change[old:%b new:%b]",
+ mSystemAudioActivated, newSystemAudioMode);
+ updateAudioManagerForSystemAudio(newSystemAudioMode);
+ synchronized (mLock) {
+ if (mSystemAudioActivated != newSystemAudioMode) {
+ mSystemAudioActivated = newSystemAudioMode;
+ mService.announceSystemAudioModeChange(newSystemAudioMode);
+ }
+ }
+ return true;
+ }
+
+ private void updateAudioManagerForSystemAudio(boolean on) {
+ int device = mService.getAudioManager().setHdmiSystemAudioSupported(on);
+ HdmiLogger.debug("[A]UpdateSystemAudio mode[on=%b] output=[%X]", on, device);
+ }
+
+ protected boolean isSystemAudioControlFeatureEnabled() {
+ synchronized (mLock) {
+ return mSystemAudioControlFeatureEnabled;
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessage.java b/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
index fd0ff9d22bf8..c0056158a9c5 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessage.java
@@ -16,9 +16,11 @@
package com.android.server.hdmi;
+import android.annotation.Nullable;
import libcore.util.EmptyArray;
import java.util.Arrays;
+import java.util.Objects;
/**
* A class to encapsulate HDMI-CEC message used for the devices connected via
@@ -44,6 +46,27 @@ public final class HdmiCecMessage {
mParams = Arrays.copyOf(params, params.length);
}
+ @Override
+ public boolean equals(@Nullable Object message) {
+ if (message instanceof HdmiCecMessage) {
+ HdmiCecMessage that = (HdmiCecMessage) message;
+ return this.mSource == that.getSource() &&
+ this.mDestination == that.getDestination() &&
+ this.mOpcode == that.getOpcode() &&
+ Arrays.equals(this.mParams, that.getParams());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ mSource,
+ mDestination,
+ mOpcode,
+ Arrays.hashCode(mParams));
+ }
+
/**
* Return the source address field of the message. It is the logical address
* of the device which generated the message.
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java
index 9a51e3c4e234..37f96142089a 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java
@@ -211,6 +211,28 @@ public class HdmiCecMessageBuilder {
}
/**
+ * Build &lt;Initiate Arc&gt;
+ *
+ * @param src source address of command
+ * @param dest destination address of command
+ * @return newly created {@link HdmiCecMessage}
+ */
+ static HdmiCecMessage buildInitiateArc(int src, int dest) {
+ return buildCommand(src, dest, Constants.MESSAGE_INITIATE_ARC);
+ }
+
+ /**
+ * Build &lt;Terminate Arc&gt;
+ *
+ * @param src source address of command
+ * @param dest destination address of command
+ * @return newly created {@link HdmiCecMessage}
+ */
+ static HdmiCecMessage buildTerminateArc(int src, int dest) {
+ return buildCommand(src, dest, Constants.MESSAGE_TERMINATE_ARC);
+ }
+
+ /**
* Build &lt;Request Arc Termination&gt;
*
* @param src source address of command
@@ -372,6 +394,34 @@ public class HdmiCecMessageBuilder {
}
/**
+ * Build &lt;Set System Audio Mode&gt; command.
+ *
+ * @param src source address of command
+ * @param des destination address of command
+ * @param systemAudioStatus whether to set System Audio Mode on or off
+ * @return newly created {@link HdmiCecMessage}
+ */
+ static HdmiCecMessage buildSetSystemAudioMode(int src, int des, boolean systemAudioStatus) {
+ return buildCommandWithBooleanParam(src, des, Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE,
+ systemAudioStatus
+ );
+ }
+
+ /**
+ * Build &lt;Report System Audio Mode&gt; command.
+ *
+ * @param src source address of command
+ * @param des destination address of command
+ * @param systemAudioStatus whether System Audio Mode is on or off
+ * @return newly created {@link HdmiCecMessage}
+ */
+ static HdmiCecMessage buildReportSystemAudioMode(int src, int des, boolean systemAudioStatus) {
+ return buildCommandWithBooleanParam(src, des, Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS,
+ systemAudioStatus
+ );
+ }
+
+ /**
* Build &lt;Give Audio Status&gt; command.
*
* @param src source address of command
@@ -383,6 +433,21 @@ public class HdmiCecMessageBuilder {
}
/**
+ * Build &lt;Report Audio Status&gt; command.
+ *
+ * @param src source address of command
+ * @param dest destination address of command
+ * @param volume volume level of current device in param
+ * @param mute mute status of current device in param
+ * @return newly created {@link HdmiCecMessage}
+ */
+ static HdmiCecMessage buildReportAudioStatus(int src, int dest, int volume, boolean mute) {
+ byte status = (byte) ((byte) (mute ? 1 << 7 : 0) | ((byte) volume & 0x7F));
+ byte[] params = new byte[] { status };
+ return buildCommand(src, dest, Constants.MESSAGE_REPORT_AUDIO_STATUS, params);
+ }
+
+ /**
* Build &lt;User Control Pressed&gt; command.
*
* @param src source address of command
@@ -592,6 +657,23 @@ public class HdmiCecMessageBuilder {
return new HdmiCecMessage(src, dest, opcode, params);
}
+ /**
+ * Build a {@link HdmiCecMessage} with a boolean param and other given values.
+ *
+ * @param src source address of command
+ * @param des destination address of command
+ * @param opcode opcode for a message
+ * @param param boolean param for building the command
+ * @return newly created {@link HdmiCecMessage}
+ */
+ private static HdmiCecMessage buildCommandWithBooleanParam(int src, int des,
+ int opcode, boolean param) {
+ byte[] params = new byte[]{
+ param ? (byte) 0b1 : 0b0
+ };
+ return buildCommand(src, des, opcode, params);
+ }
+
private static byte[] physicalAddressToParam(int physicalAddress) {
return new byte[] {
(byte) ((physicalAddress >> 8) & 0xFF),
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
index 8c00be5f25b4..4ad51de2e25b 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
@@ -22,7 +22,7 @@ import android.util.SparseArray;
/**
* A helper class to validates {@link HdmiCecMessage}.
*/
-public final class HdmiCecMessageValidator {
+public class HdmiCecMessageValidator {
private static final String TAG = "HdmiCecMessageValidator";
static final int OK = 0;
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index b06dba9f9627..846adcca2d5a 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -68,6 +68,7 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.SystemService;
@@ -88,14 +89,14 @@ import libcore.util.EmptyArray;
* Provides a service for sending and processing HDMI control messages,
* HDMI-CEC and MHL control command, and providing the information on both standard.
*/
-public final class HdmiControlService extends SystemService {
+public class HdmiControlService extends SystemService {
private static final String TAG = "HdmiControlService";
private final Locale HONG_KONG = new Locale("zh", "HK");
private final Locale MACAU = new Locale("zh", "MO");
static final String PERMISSION = "android.permission.HDMI_CEC";
- // The reason code to initiate intializeCec().
+ // The reason code to initiate initializeCec().
static final int INITIATED_BY_ENABLE_CEC = 0;
static final int INITIATED_BY_BOOT_UP = 1;
static final int INITIATED_BY_SCREEN_ON = 2;
@@ -290,6 +291,9 @@ public final class HdmiControlService extends SystemService {
@Nullable
private PowerManager mPowerManager;
+ @Nullable
+ private Looper mIoLooper;
+
// Last input port before switching to the MHL port. Should switch back to this port
// when the mobile device sends the request one touch play with off.
// Gets invalidated if we go to other port/input.
@@ -383,13 +387,18 @@ public final class HdmiControlService extends SystemService {
@Override
public void onStart() {
- mIoThread.start();
+ if (mIoLooper == null) {
+ mIoThread.start();
+ mIoLooper = mIoThread.getLooper();
+ }
mPowerStatus = HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON;
mProhibitMode = false;
mHdmiControlEnabled = readBooleanSetting(Global.HDMI_CONTROL_ENABLED, true);
mMhlInputChangeEnabled = readBooleanSetting(Global.MHL_INPUT_SWITCHING_ENABLED, true);
- mCecController = HdmiCecController.create(this);
+ if (mCecController == null) {
+ mCecController = HdmiCecController.create(this);
+ }
if (mCecController != null) {
if (mHdmiControlEnabled) {
initializeCec(INITIATED_BY_BOOT_UP);
@@ -398,15 +407,18 @@ public final class HdmiControlService extends SystemService {
Slog.i(TAG, "Device does not support HDMI-CEC.");
return;
}
-
- mMhlController = HdmiMhlControllerStub.create(this);
+ if (mMhlController == null) {
+ mMhlController = HdmiMhlControllerStub.create(this);
+ }
if (!mMhlController.isReady()) {
Slog.i(TAG, "Device does not support MHL-control.");
}
mMhlDevices = Collections.emptyList();
initPortInfo();
- mMessageValidator = new HdmiCecMessageValidator(this);
+ if (mMessageValidator == null) {
+ mMessageValidator = new HdmiCecMessageValidator(this);
+ }
publishBinderService(Context.HDMI_CONTROL_SERVICE, new BinderService());
if (mCecController != null) {
@@ -424,6 +436,16 @@ public final class HdmiControlService extends SystemService {
mMhlController.setOption(OPTION_MHL_SERVICE_CONTROL, ENABLED);
}
+ @VisibleForTesting
+ void setCecController(HdmiCecController cecController) {
+ mCecController = cecController;
+ }
+
+ @VisibleForTesting
+ void setHdmiMhlController(HdmiMhlControllerStub hdmiMhlController) {
+ mMhlController = hdmiMhlController;
+ }
+
@Override
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
@@ -582,7 +604,8 @@ public final class HdmiControlService extends SystemService {
}
@ServiceThreadOnly
- private void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices,
+ @VisibleForTesting
+ protected void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices,
final int initiatedBy) {
assertRunOnServiceThread();
mCecController.clearLogicalAddress();
@@ -649,7 +672,8 @@ public final class HdmiControlService extends SystemService {
// Initialize HDMI port information. Combine the information from CEC and MHL HAL and
// keep them in one place.
@ServiceThreadOnly
- private void initPortInfo() {
+ @VisibleForTesting
+ protected void initPortInfo() {
assertRunOnServiceThread();
HdmiPortInfo[] cecPortInfo = null;
@@ -747,8 +771,19 @@ public final class HdmiControlService extends SystemService {
*
* <p>Declared as package-private.
*/
+ @Nullable
Looper getIoLooper() {
- return mIoThread.getLooper();
+ return mIoLooper;
+ }
+
+ @VisibleForTesting
+ void setIoLooper(Looper ioLooper) {
+ mIoLooper = ioLooper;
+ }
+
+ @VisibleForTesting
+ void setMessageValidator(HdmiCecMessageValidator messageValidator) {
+ mMessageValidator = messageValidator;
}
/**
diff --git a/services/core/java/com/android/server/hdmi/HdmiLogger.java b/services/core/java/com/android/server/hdmi/HdmiLogger.java
index ebe52c0dfbf0..2309293dcbd7 100644
--- a/services/core/java/com/android/server/hdmi/HdmiLogger.java
+++ b/services/core/java/com/android/server/hdmi/HdmiLogger.java
@@ -17,7 +17,6 @@
package com.android.server.hdmi;
import android.annotation.Nullable;
-import android.os.Build;
import android.os.SystemClock;
import android.util.Pair;
import android.util.Slog;
@@ -41,7 +40,7 @@ import java.util.HashMap;
final class HdmiLogger {
private static final String TAG = "HDMI";
// Logging duration for same error message.
- private static final long ERROR_LOG_DURATTION_MILLIS = 20 * 1000; // 20s
+ private static final long ERROR_LOG_DURATION_MILLIS = 20 * 1000; // 20s
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -134,6 +133,6 @@ final class HdmiLogger {
}
private static boolean shouldLogNow(@Nullable Pair<Long, Integer> timing, long curTime) {
- return timing == null || curTime - timing.first > ERROR_LOG_DURATTION_MILLIS;
+ return timing == null || curTime - timing.first > ERROR_LOG_DURATION_MILLIS;
}
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiUtils.java b/services/core/java/com/android/server/hdmi/HdmiUtils.java
index 4ac3bba73e25..2a8117fac68d 100644
--- a/services/core/java/com/android/server/hdmi/HdmiUtils.java
+++ b/services/core/java/com/android/server/hdmi/HdmiUtils.java
@@ -114,7 +114,7 @@ final class HdmiUtils {
*
* @param logicalAddress the logical address to verify
* @param deviceType the device type to check
- * @throw IllegalArgumentException
+ * @throws IllegalArgumentException
*/
static void verifyAddressType(int logicalAddress, int deviceType) {
int actualDeviceType = getTypeFromAddress(logicalAddress);
diff --git a/services/core/java/com/android/server/hdmi/PowerStatusMonitorAction.java b/services/core/java/com/android/server/hdmi/PowerStatusMonitorAction.java
index 6893012342f9..a62d0b63221c 100644
--- a/services/core/java/com/android/server/hdmi/PowerStatusMonitorAction.java
+++ b/services/core/java/com/android/server/hdmi/PowerStatusMonitorAction.java
@@ -38,7 +38,7 @@ public class PowerStatusMonitorAction extends HdmiCecFeatureAction {
private static final int INVALID_POWER_STATUS = POWER_STATUS_UNKNOWN - 1;
// Monitoring interval (60s)
- private static final int MONITIROING_INTERNAL_MS = 60000;
+ private static final int MONITORING_INTERNAL_MS = 60000;
// Timeout once sending <Give Device Power Status>
private static final int REPORT_POWER_STATUS_TIMEOUT_MS = 5000;
@@ -132,7 +132,7 @@ public class PowerStatusMonitorAction extends HdmiCecFeatureAction {
mState = STATE_WAIT_FOR_REPORT_POWER_STATUS;
// Add both timers, monitoring and timeout.
- addTimer(STATE_WAIT_FOR_NEXT_MONITORING, MONITIROING_INTERNAL_MS);
+ addTimer(STATE_WAIT_FOR_NEXT_MONITORING, MONITORING_INTERNAL_MS);
addTimer(STATE_WAIT_FOR_REPORT_POWER_STATUS, REPORT_POWER_STATUS_TIMEOUT_MS);
}
diff --git a/services/core/java/com/android/server/hdmi/RequestArcAction.java b/services/core/java/com/android/server/hdmi/RequestArcAction.java
index 75a79cb0213c..c70101c43d79 100644
--- a/services/core/java/com/android/server/hdmi/RequestArcAction.java
+++ b/services/core/java/com/android/server/hdmi/RequestArcAction.java
@@ -35,7 +35,7 @@ abstract class RequestArcAction extends HdmiCecFeatureAction {
*
* @param source {@link HdmiCecLocalDevice} instance
* @param avrAddress address of AV receiver. It should be AUDIO_SYSTEM type
- * @throw IllegalArugmentException if device type of sourceAddress and avrAddress
+ * @throws IllegalArgumentException if device type of sourceAddress and avrAddress
* is invalid
*/
RequestArcAction(HdmiCecLocalDevice source, int avrAddress) {
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAction.java
index 449b2085715c..a5477e865c40 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioAction.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioAction.java
@@ -60,7 +60,7 @@ abstract class SystemAudioAction extends HdmiCecFeatureAction {
* @param avrAddress logical address of AVR device
* @param targetStatus Whether to enable the system audio mode or not
* @param callback callback interface to be notified when it's done
- * @throw IllegalArugmentException if device type of sourceAddress and avrAddress is invalid
+ * @throws IllegalArgumentException if device type of sourceAddress and avrAddress is invalid
*/
SystemAudioAction(HdmiCecLocalDevice source, int avrAddress, boolean targetStatus,
IHdmiControlCallback callback) {
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java b/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java
index eb5119b8a233..6ddff91a70f7 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java
@@ -32,7 +32,7 @@ final class SystemAudioActionFromAvr extends SystemAudioAction {
* @param avrAddress logical address of AVR device
* @param targetStatus Whether to enable the system audio mode or not
* @param callback callback interface to be notified when it's done
- * @throw IllegalArugmentException if device type of tvAddress and avrAddress is invalid
+ * @throws IllegalArgumentException if device type of tvAddress and avrAddress is invalid
*/
SystemAudioActionFromAvr(HdmiCecLocalDevice source, int avrAddress,
boolean targetStatus, IHdmiControlCallback callback) {
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioActionFromTv.java b/services/core/java/com/android/server/hdmi/SystemAudioActionFromTv.java
index 02ecd1392bc7..5c0c272f59e0 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioActionFromTv.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioActionFromTv.java
@@ -32,7 +32,7 @@ final class SystemAudioActionFromTv extends SystemAudioAction {
* @param avrAddress logical address of AVR device
* @param targetStatus Whether to enable the system audio mode or not
* @param callback callback interface to be notified when it's done
- * @throw IllegalArugmentException if device type of tvAddress is invalid
+ * @throws IllegalArgumentException if device type of tvAddress is invalid
*/
SystemAudioActionFromTv(HdmiCecLocalDevice sourceAddress, int avrAddress,
boolean targetStatus, IHdmiControlCallback callback) {
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java
index d41a36ca031f..13f0f4ae4a92 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java
@@ -64,7 +64,7 @@ final class SystemAudioStatusAction extends HdmiCecFeatureAction {
}
private void handleSendGiveAudioStatusFailure() {
- // Inform to all application that the audio status (volumn, mute) of
+ // Inform to all application that the audio status (volume, mute) of
// the audio amplifier is unknown.
tv().setAudioStatus(false, Constants.UNKNOWN_VOLUME);
diff --git a/services/core/java/com/android/server/input/InputForwarder.java b/services/core/java/com/android/server/input/InputForwarder.java
index bebbc93e9ea5..00af8398d0ff 100644
--- a/services/core/java/com/android/server/input/InputForwarder.java
+++ b/services/core/java/com/android/server/input/InputForwarder.java
@@ -19,7 +19,6 @@ package com.android.server.input;
import android.app.IInputForwarder;
import android.hardware.input.InputManagerInternal;
import android.view.InputEvent;
-import android.os.Binder;
import com.android.server.LocalServices;
@@ -40,7 +39,7 @@ class InputForwarder extends IInputForwarder.Stub {
@Override
public boolean forwardEvent(InputEvent event) {
- return mInputManagerInternal.injectInputEvent(event, mDisplayId,
- INJECT_INPUT_EVENT_MODE_ASYNC);
+ event.setDisplayId(mDisplayId);
+ return mInputManagerInternal.injectInputEvent(event, INJECT_INPUT_EVENT_MODE_ASYNC);
}
} \ No newline at end of file
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 451acf4cfc9c..9df9ba600f2a 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -208,7 +208,7 @@ public class InputManagerService extends IInputManager.Stub
InputWindowHandle inputWindowHandle, boolean monitor);
private static native void nativeUnregisterInputChannel(long ptr, InputChannel inputChannel);
private static native void nativeSetInputFilterEnabled(long ptr, boolean enable);
- private static native int nativeInjectInputEvent(long ptr, InputEvent event, int displayId,
+ private static native int nativeInjectInputEvent(long ptr, InputEvent event,
int injectorPid, int injectorUid, int syncMode, int timeoutMillis,
int policyFlags);
private static native void nativeToggleCapsLock(long ptr, int deviceId);
@@ -592,10 +592,10 @@ public class InputManagerService extends IInputManager.Stub
@Override // Binder call
public boolean injectInputEvent(InputEvent event, int mode) {
- return injectInputEventInternal(event, Display.DEFAULT_DISPLAY, mode);
+ return injectInputEventInternal(event, mode);
}
- private boolean injectInputEventInternal(InputEvent event, int displayId, int mode) {
+ private boolean injectInputEventInternal(InputEvent event, int mode) {
if (event == null) {
throw new IllegalArgumentException("event must not be null");
}
@@ -610,7 +610,7 @@ public class InputManagerService extends IInputManager.Stub
final long ident = Binder.clearCallingIdentity();
final int result;
try {
- result = nativeInjectInputEvent(mPtr, event, displayId, pid, uid, mode,
+ result = nativeInjectInputEvent(mPtr, event, pid, uid, mode,
INJECTION_TIMEOUT_MILLIS, WindowManagerPolicy.FLAG_DISABLE_KEY_REPEAT);
} finally {
Binder.restoreCallingIdentity(ident);
@@ -2080,7 +2080,7 @@ public class InputManagerService extends IInputManager.Stub
synchronized (mInputFilterLock) {
if (!mDisconnected) {
- nativeInjectInputEvent(mPtr, event, Display.DEFAULT_DISPLAY, 0, 0,
+ nativeInjectInputEvent(mPtr, event, 0, 0,
InputManager.INJECT_INPUT_EVENT_MODE_ASYNC, 0,
policyFlags | WindowManagerPolicy.FLAG_FILTERED);
}
@@ -2209,8 +2209,8 @@ public class InputManagerService extends IInputManager.Stub
}
@Override
- public boolean injectInputEvent(InputEvent event, int displayId, int mode) {
- return injectInputEventInternal(event, displayId, mode);
+ public boolean injectInputEvent(InputEvent event, int mode) {
+ return injectInputEventInternal(event, mode);
}
@Override
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index d4d5d80c24b2..640e20f4a3f2 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -68,7 +68,6 @@ import android.os.WorkSource;
import android.os.WorkSource.WorkChain;
import android.provider.Settings;
import android.provider.Telephony.Carriers;
-import android.provider.Telephony.Sms.Intents;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
@@ -254,7 +253,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
// 1 second, or 1 Hz frequency.
private static final long LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS = 1000;
// Default update duration in milliseconds for REQUEST_LOCATION.
- private static final long LOCATION_UPDATE_DURATION_MILLIS = 0;
+ private static final long LOCATION_UPDATE_DURATION_MILLIS = 10 * 1000;
/** simpler wrapper for ProviderRequest + Worksource */
private static class GpsRequest {
@@ -387,6 +386,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
private long mLastFixTime;
private int mPositionMode;
+ private GnssPositionMode mLastPositionMode;
// Current request from underlying location clients.
private ProviderRequest mProviderRequest = null;
@@ -1352,7 +1352,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
// apply request to GPS engine
if (mStarted && hasCapability(GPS_CAPABILITY_SCHEDULING)) {
// change period and/or lowPowerMode
- if (!native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,
+ if (!setPositionMode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,
mFixInterval, 0, 0, mLowPowerMode)) {
Log.e(TAG, "set_position_mode failed in updateRequirements");
}
@@ -1377,6 +1377,24 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
}
}
+ private boolean setPositionMode(int mode, int recurrence, int minInterval,
+ int preferredAccuracy, int preferredTime, boolean lowPowerMode) {
+ GnssPositionMode positionMode = new GnssPositionMode(mode, recurrence, minInterval,
+ preferredAccuracy, preferredTime, lowPowerMode);
+ if (mLastPositionMode != null && mLastPositionMode.equals(positionMode)) {
+ return true;
+ }
+
+ boolean result = native_set_position_mode(mode, recurrence, minInterval,
+ preferredAccuracy, preferredTime, lowPowerMode);
+ if (result) {
+ mLastPositionMode = positionMode;
+ } else {
+ mLastPositionMode = null;
+ }
+ return result;
+ }
+
private void updateClientUids(WorkSource source) {
if (source.equals(mClientSource)) {
return;
@@ -1536,7 +1554,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
int interval = (hasCapability(GPS_CAPABILITY_SCHEDULING) ? mFixInterval : 1000);
mLowPowerMode = (boolean) mProviderRequest.lowPowerMode;
- if (!native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,
+ if (!setPositionMode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC,
interval, 0, 0, mLowPowerMode)) {
mStarted = false;
Log.e(TAG, "set_position_mode failed in startNavigating()");
@@ -2395,28 +2413,7 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt
.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
// listen for events
- IntentFilter intentFilter;
- if (native_is_agps_ril_supported()) {
- intentFilter = new IntentFilter();
- intentFilter.addAction(Intents.DATA_SMS_RECEIVED_ACTION);
- intentFilter.addDataScheme("sms");
- intentFilter.addDataAuthority("localhost", "7275");
- mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this);
-
- intentFilter = new IntentFilter();
- intentFilter.addAction(Intents.WAP_PUSH_RECEIVED_ACTION);
- try {
- intentFilter.addDataType("application/vnd.omaloc-supl-init");
- } catch (IntentFilter.MalformedMimeTypeException e) {
- Log.w(TAG, "Malformed SUPL init mime type");
- }
- mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this);
- } else if (DEBUG) {
- Log.d(TAG, "Skipped registration for SMS/WAP-PUSH messages because AGPS Ril in GPS"
- + " HAL is not supported");
- }
-
- intentFilter = new IntentFilter();
+ IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ALARM_WAKEUP);
intentFilter.addAction(ALARM_TIMEOUT);
intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
diff --git a/services/core/java/com/android/server/location/GnssPositionMode.java b/services/core/java/com/android/server/location/GnssPositionMode.java
new file mode 100644
index 000000000000..36838fc3647f
--- /dev/null
+++ b/services/core/java/com/android/server/location/GnssPositionMode.java
@@ -0,0 +1,46 @@
+package com.android.server.location;
+
+import java.util.Arrays;
+
+/**
+ * Represents a GNSS position mode.
+ */
+public class GnssPositionMode {
+ private final int mode;
+ private final int recurrence;
+ private final int minInterval;
+ private final int preferredAccuracy;
+ private final int preferredTime;
+ private final boolean lowPowerMode;
+
+ public GnssPositionMode(int mode, int recurrence, int minInterval,
+ int preferredAccuracy, int preferredTime, boolean lowPowerMode) {
+ this.mode = mode;
+ this.recurrence = recurrence;
+ this.minInterval = minInterval;
+ this.preferredAccuracy = preferredAccuracy;
+ this.preferredTime = preferredTime;
+ this.lowPowerMode = lowPowerMode;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof GnssPositionMode) {
+ GnssPositionMode that = (GnssPositionMode) other;
+ return mode == that.mode && recurrence == that.recurrence
+ && minInterval == that.minInterval
+ && preferredAccuracy == that.preferredAccuracy
+ && preferredTime == that.preferredTime && lowPowerMode == that.lowPowerMode
+ && this.getClass() == that.getClass();
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(
+ new Object[]{mode, recurrence, minInterval, preferredAccuracy, preferredTime,
+ lowPowerMode, getClass()});
+ }
+}
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 52b3675d362d..5328e75fca58 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -957,12 +957,18 @@ public class LockSettingsService extends ILockSettings.Stub {
@GuardedBy("mSeparateChallengeLock")
private void setSeparateProfileChallengeEnabledLocked(@UserIdInt int userId, boolean enabled,
String managedUserPassword) {
+ final boolean old = getBoolean(SEPARATE_PROFILE_CHALLENGE_KEY, false, userId);
setBoolean(SEPARATE_PROFILE_CHALLENGE_KEY, enabled, userId);
- if (enabled) {
- mStorage.removeChildProfileLock(userId);
- removeKeystoreProfileKey(userId);
- } else {
- tieManagedProfileLockIfNecessary(userId, managedUserPassword);
+ try {
+ if (enabled) {
+ mStorage.removeChildProfileLock(userId);
+ removeKeystoreProfileKey(userId);
+ } else {
+ tieManagedProfileLockIfNecessary(userId, managedUserPassword);
+ }
+ } catch (IllegalStateException e) {
+ setBoolean(SEPARATE_PROFILE_CHALLENGE_KEY, old, userId);
+ throw e;
}
}
@@ -2053,7 +2059,7 @@ public class LockSettingsService extends ILockSettings.Stub {
enforceShell();
final long origId = Binder.clearCallingIdentity();
try {
- (new LockSettingsShellCommand(mContext, new LockPatternUtils(mContext))).exec(
+ (new LockSettingsShellCommand(new LockPatternUtils(mContext))).exec(
this, in, out, err, args, callback, resultReceiver);
} finally {
Binder.restoreCallingIdentity(origId);
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
index 4d2cf321b5ee..085d17d406dc 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
@@ -21,13 +21,13 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
import static com.android.internal.widget.LockPatternUtils.stringToPattern;
import android.app.ActivityManager;
-import android.content.Context;
-import android.os.RemoteException;
import android.os.ShellCommand;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils.RequestThrottledException;
+import java.io.PrintWriter;
+
class LockSettingsShellCommand extends ShellCommand {
private static final String COMMAND_SET_PATTERN = "set-pattern";
@@ -38,20 +38,22 @@ class LockSettingsShellCommand extends ShellCommand {
private static final String COMMAND_SET_DISABLED = "set-disabled";
private static final String COMMAND_VERIFY = "verify";
private static final String COMMAND_GET_DISABLED = "get-disabled";
+ private static final String COMMAND_HELP = "help";
private int mCurrentUserId;
private final LockPatternUtils mLockPatternUtils;
- private final Context mContext;
private String mOld = "";
private String mNew = "";
- LockSettingsShellCommand(Context context, LockPatternUtils lockPatternUtils) {
- mContext = context;
+ LockSettingsShellCommand(LockPatternUtils lockPatternUtils) {
mLockPatternUtils = lockPatternUtils;
}
@Override
public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
try {
mCurrentUserId = ActivityManager.getService().getCurrentUser().id;
@@ -84,6 +86,9 @@ class LockSettingsShellCommand extends ShellCommand {
case COMMAND_GET_DISABLED:
runGetDisabled();
break;
+ case COMMAND_HELP:
+ onHelp();
+ break;
default:
getErrPrintWriter().println("Unknown command: " + cmd);
break;
@@ -103,6 +108,43 @@ class LockSettingsShellCommand extends ShellCommand {
@Override
public void onHelp() {
+ try (final PrintWriter pw = getOutPrintWriter();) {
+ pw.println("lockSettings service commands:");
+ pw.println("");
+ pw.println("NOTE: when lock screen is set, all commands require the --old <CREDENTIAL>"
+ + " argument.");
+ pw.println("");
+ pw.println(" help");
+ pw.println(" Prints this help text.");
+ pw.println("");
+ pw.println(" get-disabled [--old <CREDENTIAL>] [--user USER_ID]");
+ pw.println(" Checks whether lock screen is disabled.");
+ pw.println("");
+ pw.println(" set-disabled [--old <CREDENTIAL>] [--user USER_ID] <true|false>");
+ pw.println(" When true, disables lock screen.");
+ pw.println("");
+ pw.println(" set-pattern [--old <CREDENTIAL>] [--user USER_ID] <PATTERN>");
+ pw.println(" Sets the lock screen as pattern, using the given PATTERN to unlock.");
+ pw.println("");
+ pw.println(" set-pin [--old <CREDENTIAL>] [--user USER_ID] <PIN>");
+ pw.println(" Sets the lock screen as PIN, using the given PIN to unlock.");
+ pw.println("");
+ pw.println(" set-pin [--old <CREDENTIAL>] [--user USER_ID] <PASSWORD>");
+ pw.println(" Sets the lock screen as password, using the given PASSOWRD to unlock.");
+ pw.println("");
+ pw.println(" sp [--old <CREDENTIAL>] [--user USER_ID]");
+ pw.println(" Gets whether synthetic password is enabled.");
+ pw.println("");
+ pw.println(" sp [--old <CREDENTIAL>] [--user USER_ID] <1|0>");
+ pw.println(" Enables / disables synthetic password.");
+ pw.println("");
+ pw.println(" clear [--old <CREDENTIAL>] [--user USER_ID]");
+ pw.println(" Clears the lock credentials.");
+ pw.println("");
+ pw.println(" verify [--old <CREDENTIAL>] [--user USER_ID]");
+ pw.println(" Verifies the lock credentials.");
+ pw.println("");
+ }
}
private void parseArgs() {
@@ -134,27 +176,27 @@ class LockSettingsShellCommand extends ShellCommand {
mLockPatternUtils.isSyntheticPasswordEnabled()));
}
- private void runSetPattern() throws RemoteException {
+ private void runSetPattern() {
mLockPatternUtils.saveLockPattern(stringToPattern(mNew), mOld, mCurrentUserId);
getOutPrintWriter().println("Pattern set to '" + mNew + "'");
}
- private void runSetPassword() throws RemoteException {
+ private void runSetPassword() {
mLockPatternUtils.saveLockPassword(mNew, mOld, PASSWORD_QUALITY_ALPHABETIC, mCurrentUserId);
getOutPrintWriter().println("Password set to '" + mNew + "'");
}
- private void runSetPin() throws RemoteException {
+ private void runSetPin() {
mLockPatternUtils.saveLockPassword(mNew, mOld, PASSWORD_QUALITY_NUMERIC, mCurrentUserId);
getOutPrintWriter().println("Pin set to '" + mNew + "'");
}
- private void runClear() throws RemoteException {
+ private void runClear() {
mLockPatternUtils.clearLock(mOld, mCurrentUserId);
getOutPrintWriter().println("Lock credential cleared");
}
- private void runSetDisabled() throws RemoteException {
+ private void runSetDisabled() {
final boolean disabled = Boolean.parseBoolean(mNew);
mLockPatternUtils.setLockScreenDisabled(disabled, mCurrentUserId);
getOutPrintWriter().println("Lock screen disabled set to " + disabled);
@@ -165,7 +207,7 @@ class LockSettingsShellCommand extends ShellCommand {
getOutPrintWriter().println(isLockScreenDisabled);
}
- private boolean checkCredential() throws RemoteException {
+ private boolean checkCredential() {
final boolean havePassword = mLockPatternUtils.isLockPasswordEnabled(mCurrentUserId);
final boolean havePattern = mLockPatternUtils.isLockPatternEnabled(mCurrentUserId);
if (havePassword || havePattern) {
diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java
index a7df0e23f63b..3eb732157a44 100644
--- a/services/core/java/com/android/server/media/MediaRouterService.java
+++ b/services/core/java/com/android/server/media/MediaRouterService.java
@@ -414,7 +414,9 @@ public final class MediaRouterService extends IMediaRouterService.Stub
}
// We don't need to change a2dp status when bluetooth is not connected.
if (btDevice != null) {
- Slog.v(TAG, "restoreBluetoothA2dp(" + a2dpOn + ")");
+ if (DEBUG) {
+ Slog.d(TAG, "restoreBluetoothA2dp(" + a2dpOn + ")");
+ }
mAudioService.setBluetoothA2dpOn(a2dpOn);
}
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 442354bbb6b9..a49cf44dc775 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -481,7 +481,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
mAudioManagerInternal.adjustStreamVolumeForUid(stream, direction, flags,
packageName, uid);
}
- } catch (IllegalArgumentException e) {
+ } catch (IllegalArgumentException | SecurityException e) {
Log.e(TAG, "Cannot adjust volume: direction=" + direction + ", stream="
+ stream + ", flags=" + flags + ", packageName=" + packageName
+ ", uid=" + uid + ", useSuggested=" + useSuggested
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index addc479404e9..60e9eaab5721 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -160,8 +160,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE);
private static final int MSG_PERFORM_POLL = 1;
- private static final int MSG_UPDATE_IFACES = 2;
- private static final int MSG_REGISTER_GLOBAL_ALERT = 3;
+ private static final int MSG_REGISTER_GLOBAL_ALERT = 2;
/** Flags to control detail level of poll event. */
private static final int FLAG_PERSIST_NETWORK = 0x1;
@@ -325,6 +324,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
wakeLock, getDefaultClock(), TelephonyManager.getDefault(),
new DefaultNetworkStatsSettings(context), new NetworkStatsObservers(),
getDefaultSystemDir(), getDefaultBaseDir());
+ service.registerLocalService();
HandlerThread handlerThread = new HandlerThread(TAG);
Handler.Callback callback = new HandlerCallback(service);
@@ -334,6 +334,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
return service;
}
+ // This must not be called outside of tests, even within the same package, as this constructor
+ // does not register the local service. Use the create() helper above.
@VisibleForTesting
NetworkStatsService(Context context, INetworkManagementService networkManager,
AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
@@ -350,7 +352,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mSystemDir = checkNotNull(systemDir, "missing systemDir");
mBaseDir = checkNotNull(baseDir, "missing baseDir");
mUseBpfTrafficStats = new File("/sys/fs/bpf/traffic_uid_stats_map").exists();
+ }
+ private void registerLocalService() {
LocalServices.addService(NetworkStatsManagerInternal.class,
new NetworkStatsManagerInternalImpl());
}
@@ -1673,10 +1677,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mService.performPoll(flags);
return true;
}
- case MSG_UPDATE_IFACES: {
- mService.updateIfaces(null);
- return true;
- }
case MSG_REGISTER_GLOBAL_ALERT: {
mService.registerGlobalAlert();
return true;
diff --git a/services/core/java/com/android/server/notification/GroupHelper.java b/services/core/java/com/android/server/notification/GroupHelper.java
index ce805aadec77..b1cd62788073 100644
--- a/services/core/java/com/android/server/notification/GroupHelper.java
+++ b/services/core/java/com/android/server/notification/GroupHelper.java
@@ -32,16 +32,17 @@ public class GroupHelper {
private static final String TAG = "GroupHelper";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- protected static final int AUTOGROUP_AT_COUNT = 4;
protected static final String AUTOGROUP_KEY = "ranker_group";
private final Callback mCallback;
+ private final int mAutoGroupAtCount;
// Map of user : <Map of package : notification keys>. Only contains notifications that are not
// grouped by the app (aka no group or sort key).
Map<Integer, Map<String, LinkedHashSet<String>>> mUngroupedNotifications = new HashMap<>();
- public GroupHelper(Callback callback) {;
+ public GroupHelper(int autoGroupAtCount, Callback callback) {
+ mAutoGroupAtCount = autoGroupAtCount;
mCallback = callback;
}
@@ -68,7 +69,7 @@ public class GroupHelper {
notificationsForPackage.add(sbn.getKey());
ungroupedNotificationsByUser.put(sbn.getPackageName(), notificationsForPackage);
- if (notificationsForPackage.size() >= AUTOGROUP_AT_COUNT
+ if (notificationsForPackage.size() >= mAutoGroupAtCount
|| autogroupSummaryExists) {
notificationsToGroup.addAll(notificationsForPackage);
}
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index f7becd518861..af4f4262450e 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -54,6 +54,7 @@ import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
+import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
@@ -73,7 +74,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
-import java.util.stream.Collectors;
/**
* Manages the lifecycle of application-provided services bound by system server.
@@ -117,9 +117,12 @@ abstract public class ManagedServices {
// contains connections to all connected services, including app services
// and system services
private final ArrayList<ManagedServiceInfo> mServices = new ArrayList<>();
- // things that will be put into mServices as soon as they're ready
- private final ArrayList<String> mServicesBinding = new ArrayList<>();
- private final ArraySet<String> mServicesRebinding = new ArraySet<>();
+ /**
+ * The services that have been bound by us. If the service is also connected, it will also
+ * be in {@link #mServices}.
+ */
+ private final ArrayList<Pair<ComponentName, Integer>> mServicesBound = new ArrayList<>();
+ private final ArraySet<Pair<ComponentName, Integer>> mServicesRebinding = new ArraySet<>();
// lists the component names of all enabled (and therefore potentially connected)
// app services for current profiles.
@@ -918,13 +921,13 @@ abstract public class ManagedServices {
final boolean isSystem) {
if (DEBUG) Slog.v(TAG, "registerService: " + name + " u=" + userid);
- final String servicesBindingTag = name.toString() + "/" + userid;
- if (mServicesBinding.contains(servicesBindingTag)) {
- Slog.v(TAG, "Not registering " + name + " as bind is already in progress");
+ final Pair<ComponentName, Integer> servicesBindingTag = Pair.create(name, userid);
+ if (mServicesBound.contains(servicesBindingTag)) {
+ Slog.v(TAG, "Not registering " + name + " is already bound");
// stop registering this thing already! we're working on it
return;
}
- mServicesBinding.add(servicesBindingTag);
+ mServicesBound.add(servicesBindingTag);
final int N = mServices.size();
for (int i = N - 1; i >= 0; i--) {
@@ -935,11 +938,7 @@ abstract public class ManagedServices {
Slog.v(TAG, " disconnecting old " + getCaption() + ": " + info.service);
removeServiceLocked(i);
if (info.connection != null) {
- try {
- mContext.unbindService(info.connection);
- } catch (IllegalArgumentException e) {
- Slog.e(TAG, "failed to unbind " + name, e);
- }
+ unbindService(info.connection, info.component, info.userid);
}
}
}
@@ -970,11 +969,11 @@ abstract public class ManagedServices {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
+ Slog.v(TAG, getCaption() + " service connected: " + name);
boolean added = false;
ManagedServiceInfo info = null;
synchronized (mMutex) {
mServicesRebinding.remove(servicesBindingTag);
- mServicesBinding.remove(servicesBindingTag);
try {
mService = asInterface(binder);
info = newServiceInfo(mService, name,
@@ -992,7 +991,6 @@ abstract public class ManagedServices {
@Override
public void onServiceDisconnected(ComponentName name) {
- mServicesBinding.remove(servicesBindingTag);
Slog.v(TAG, getCaption() + " connection lost: " + name);
}
@@ -1000,12 +998,7 @@ abstract public class ManagedServices {
public void onBindingDied(ComponentName name) {
Slog.w(TAG, getCaption() + " binding died: " + name);
synchronized (mMutex) {
- mServicesBinding.remove(servicesBindingTag);
- try {
- mContext.unbindService(this);
- } catch (IllegalArgumentException e) {
- Slog.e(TAG, "failed to unbind " + name, e);
- }
+ unbindService(this, name, userid);
if (!mServicesRebinding.contains(servicesBindingTag)) {
mServicesRebinding.add(servicesBindingTag);
mHandler.postDelayed(new Runnable() {
@@ -1025,12 +1018,12 @@ abstract public class ManagedServices {
serviceConnection,
BIND_AUTO_CREATE | BIND_FOREGROUND_SERVICE | BIND_ALLOW_WHITELIST_MANAGEMENT,
new UserHandle(userid))) {
- mServicesBinding.remove(servicesBindingTag);
+ mServicesBound.remove(servicesBindingTag);
Slog.w(TAG, "Unable to bind " + getCaption() + " service: " + intent);
return;
}
} catch (SecurityException ex) {
- mServicesBinding.remove(servicesBindingTag);
+ mServicesBound.remove(servicesBindingTag);
Slog.e(TAG, "Unable to bind " + getCaption() + " service: " + intent, ex);
}
}
@@ -1051,13 +1044,7 @@ abstract public class ManagedServices {
if (name.equals(info.component) && info.userid == userid) {
removeServiceLocked(i);
if (info.connection != null) {
- try {
- mContext.unbindService(info.connection);
- } catch (IllegalArgumentException ex) {
- // something happened to the service: we think we have a connection
- // but it's bogus.
- Slog.e(TAG, getCaption() + " " + name + " could not be unbound: " + ex);
- }
+ unbindService(info.connection, info.component, info.userid);
}
}
}
@@ -1122,7 +1109,18 @@ abstract public class ManagedServices {
private void unregisterServiceImpl(IInterface service, int userid) {
ManagedServiceInfo info = removeServiceImpl(service, userid);
if (info != null && info.connection != null && !info.isGuest(this)) {
- mContext.unbindService(info.connection);
+ unbindService(info.connection, info.component, info.userid);
+ }
+ }
+
+ private void unbindService(ServiceConnection connection, ComponentName component, int userId) {
+ try {
+ mContext.unbindService(connection);
+ } catch (IllegalArgumentException e) {
+ Slog.e(TAG, getCaption() + " " + component + " could not be unbound", e);
+ }
+ synchronized (mMutex) {
+ mServicesBound.remove(Pair.create(component, userId));
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 5ba1e0f3e047..9b2deed601dc 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -329,6 +329,8 @@ public class NotificationManagerService extends SystemService {
private long[] mFallbackVibrationPattern;
private boolean mUseAttentionLight;
+ boolean mHasLight = true;
+ boolean mLightEnabled;
boolean mSystemReady;
private boolean mDisableNotificationEffects;
@@ -343,13 +345,14 @@ public class NotificationManagerService extends SystemService {
private int mInterruptionFilter = NotificationListenerService.INTERRUPTION_FILTER_UNKNOWN;
// for enabling and disabling notification pulse behavior
- private boolean mScreenOn = true;
+ boolean mScreenOn = true;
protected boolean mInCall = false;
- private boolean mNotificationPulseEnabled;
+ boolean mNotificationPulseEnabled;
private Uri mInCallNotificationUri;
private AudioAttributes mInCallNotificationAudioAttributes;
private float mInCallNotificationVolume;
+ private Binder mCallNotificationToken = null;
// used as a mutex for access to all active notifications & listeners
final Object mNotificationLock = new Object();
@@ -383,6 +386,7 @@ public class NotificationManagerService extends SystemService {
private static final String ATTR_VERSION = "version";
private RankingHelper mRankingHelper;
+ private PreferencesHelper mPreferencesHelper;
private final UserProfiles mUserProfiles = new UserProfiles();
private NotificationListeners mListeners;
@@ -399,6 +403,7 @@ public class NotificationManagerService extends SystemService {
private SnoozeHelper mSnoozeHelper;
private GroupHelper mGroupHelper;
+ private int mAutoGroupAtCount;
private boolean mIsTelevision;
private MetricsLogger mMetricsLogger;
@@ -521,8 +526,8 @@ public class NotificationManagerService extends SystemService {
while (XmlUtils.nextElementWithin(parser, outerDepth)) {
if (ZenModeConfig.ZEN_TAG.equals(parser.getName())) {
mZenModeHelper.readXml(parser, forRestore);
- } else if (RankingHelper.TAG_RANKING.equals(parser.getName())){
- mRankingHelper.readXml(parser, forRestore);
+ } else if (PreferencesHelper.TAG_RANKING.equals(parser.getName())){
+ mPreferencesHelper.readXml(parser, forRestore);
}
if (mListeners.getConfig().xmlTag.equals(parser.getName())) {
mListeners.readXml(parser, mAllowedManagedServicePackages);
@@ -604,7 +609,7 @@ public class NotificationManagerService extends SystemService {
out.startTag(null, TAG_NOTIFICATION_POLICY);
out.attribute(null, ATTR_VERSION, Integer.toString(DB_VERSION));
mZenModeHelper.writeXml(out, forBackup, null);
- mRankingHelper.writeXml(out, forBackup);
+ mPreferencesHelper.writeXml(out, forBackup);
mListeners.writeXml(out, forBackup);
mAssistants.writeXml(out, forBackup);
mConditionProviders.writeXml(out, forBackup);
@@ -616,7 +621,7 @@ public class NotificationManagerService extends SystemService {
{
final int pid;
final String pkg;
- ITransientNotification callback;
+ final ITransientNotification callback;
int duration;
Binder token;
@@ -633,10 +638,6 @@ public class NotificationManagerService extends SystemService {
this.duration = duration;
}
- void update(ITransientNotification callback) {
- this.callback = callback;
- }
-
void dump(PrintWriter pw, String prefix, DumpFilter filter) {
if (filter != null && !filter.matches(pkg)) return;
pw.println(prefix + this);
@@ -949,7 +950,7 @@ public class NotificationManagerService extends SystemService {
// update system notification channels
SystemNotificationChannels.createAll(context);
mZenModeHelper.updateDefaultZenRules();
- mRankingHelper.onLocaleChanged(context, ActivityManager.getCurrentUser());
+ mPreferencesHelper.onLocaleChanged(context, ActivityManager.getCurrentUser());
}
}
};
@@ -1092,7 +1093,8 @@ public class NotificationManagerService extends SystemService {
mListeners.onPackagesChanged(removingPackage, pkgList, uidList);
mAssistants.onPackagesChanged(removingPackage, pkgList, uidList);
mConditionProviders.onPackagesChanged(removingPackage, pkgList, uidList);
- mRankingHelper.onPackagesChanged(removingPackage, changeUserId, pkgList, uidList);
+ mPreferencesHelper.onPackagesChanged(
+ removingPackage, changeUserId, pkgList, uidList);
savePolicyFile();
}
}
@@ -1152,7 +1154,7 @@ public class NotificationManagerService extends SystemService {
final int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, USER_NULL);
mUserProfiles.updateCache(context);
mZenModeHelper.onUserRemoved(user);
- mRankingHelper.onUserRemoved(user);
+ mPreferencesHelper.onUserRemoved(user);
mListeners.onUserRemoved(user);
mConditionProviders.onUserRemoved(user);
mAssistants.onUserRemoved(user);
@@ -1198,7 +1200,8 @@ public class NotificationManagerService extends SystemService {
ContentResolver resolver = getContext().getContentResolver();
if (uri == null || NOTIFICATION_LIGHT_PULSE_URI.equals(uri)) {
boolean pulseEnabled = Settings.System.getIntForUser(resolver,
- Settings.System.NOTIFICATION_LIGHT_PULSE, 0, UserHandle.USER_CURRENT) != 0;
+ Settings.System.NOTIFICATION_LIGHT_PULSE, 0, UserHandle.USER_CURRENT)
+ != 0;
if (mNotificationPulseEnabled != pulseEnabled) {
mNotificationPulseEnabled = pulseEnabled;
updateNotificationPulse();
@@ -1209,7 +1212,7 @@ public class NotificationManagerService extends SystemService {
Settings.Global.MAX_NOTIFICATION_ENQUEUE_RATE, mMaxPackageEnqueueRate);
}
if (uri == null || NOTIFICATION_BADGING_URI.equals(uri)) {
- mRankingHelper.updateBadgingEnabled();
+ mPreferencesHelper.updateBadgingEnabled();
}
}
}
@@ -1331,6 +1334,9 @@ public class NotificationManagerService extends SystemService {
}
@VisibleForTesting
+ void setPreferencesHelper(PreferencesHelper prefHelper) { mPreferencesHelper = prefHelper; }
+
+ @VisibleForTesting
void setRankingHandler(RankingHandler rankingHandler) {
mRankingHandler = rankingHandler;
}
@@ -1418,9 +1424,13 @@ public class NotificationManagerService extends SystemService {
mRankingHandler.requestSort();
}
});
- mRankingHelper = new RankingHelper(getContext(),
+ mPreferencesHelper = new PreferencesHelper(getContext(),
mPackageManagerClient,
mRankingHandler,
+ mZenModeHelper);
+ mRankingHelper = new RankingHelper(getContext(),
+ mRankingHandler,
+ mPreferencesHelper,
mZenModeHelper,
mUsageStats,
extractorNames);
@@ -1460,6 +1470,8 @@ public class NotificationManagerService extends SystemService {
mInCallNotificationVolume = resources.getFloat(R.dimen.config_inCallNotificationVolume);
mUseAttentionLight = resources.getBoolean(R.bool.config_useAttentionLight);
+ mHasLight =
+ resources.getBoolean(com.android.internal.R.bool.config_intrusiveNotificationLed);
// Don't start allowing notifications until the setup wizard has run once.
// After that, including subsequent boots, init with notifications turned on.
@@ -1568,7 +1580,9 @@ public class NotificationManagerService extends SystemService {
}
private GroupHelper getGroupHelper() {
- return new GroupHelper(new GroupHelper.Callback() {
+ mAutoGroupAtCount =
+ getContext().getResources().getInteger(R.integer.config_autoGroupAtCount);
+ return new GroupHelper(mAutoGroupAtCount, new GroupHelper.Callback() {
@Override
public void addAutoGroup(String key) {
synchronized (mNotificationLock) {
@@ -1671,14 +1685,14 @@ public class NotificationManagerService extends SystemService {
}
}
final NotificationChannel preUpdate =
- mRankingHelper.getNotificationChannel(pkg, uid, channel.getId(), true);
+ mPreferencesHelper.getNotificationChannel(pkg, uid, channel.getId(), true);
- mRankingHelper.updateNotificationChannel(pkg, uid, channel, true);
+ mPreferencesHelper.updateNotificationChannel(pkg, uid, channel, true);
maybeNotifyChannelOwner(pkg, uid, preUpdate, channel);
if (!fromListener) {
final NotificationChannel modifiedChannel =
- mRankingHelper.getNotificationChannel(pkg, uid, channel.getId(), false);
+ mPreferencesHelper.getNotificationChannel(pkg, uid, channel.getId(), false);
mListeners.notifyNotificationChannelChanged(
pkg, UserHandle.getUserHandleForUid(uid),
modifiedChannel, NOTIFICATION_CHANNEL_OR_GROUP_UPDATED);
@@ -1715,8 +1729,8 @@ public class NotificationManagerService extends SystemService {
Preconditions.checkNotNull(pkg);
final NotificationChannelGroup preUpdate =
- mRankingHelper.getNotificationChannelGroup(group.getId(), pkg, uid);
- mRankingHelper.createNotificationChannelGroup(pkg, uid, group,
+ mPreferencesHelper.getNotificationChannelGroup(group.getId(), pkg, uid);
+ mPreferencesHelper.createNotificationChannelGroup(pkg, uid, group,
fromApp);
if (!fromApp) {
maybeNotifyChannelGroupOwner(pkg, uid, preUpdate, group);
@@ -1992,32 +2006,38 @@ public class NotificationManagerService extends SystemService {
long callingId = Binder.clearCallingIdentity();
try {
ToastRecord record;
- int index;
- // All packages aside from the android package can enqueue one toast at a time
- if (!isSystemToast) {
- index = indexOfToastPackageLocked(pkg);
- } else {
- index = indexOfToastLocked(pkg, callback);
- }
-
- // If the package already has a toast, we update its toast
- // in the queue, we don't move it to the end of the queue.
+ int index = indexOfToastLocked(pkg, callback);
+ // If it's already in the queue, we update it in place, we don't
+ // move it to the end of the queue.
if (index >= 0) {
record = mToastQueue.get(index);
record.update(duration);
- try {
- record.callback.hide();
- } catch (RemoteException e) {
- }
- record.update(callback);
} else {
+ // Limit the number of toasts that any given package except the android
+ // package can enqueue. Prevents DOS attacks and deals with leaks.
+ if (!isSystemToast) {
+ int count = 0;
+ final int N = mToastQueue.size();
+ for (int i=0; i<N; i++) {
+ final ToastRecord r = mToastQueue.get(i);
+ if (r.pkg.equals(pkg)) {
+ count++;
+ if (count >= MAX_PACKAGE_NOTIFICATIONS) {
+ Slog.e(TAG, "Package has already posted " + count
+ + " toasts. Not showing more. Package=" + pkg);
+ return;
+ }
+ }
+ }
+ }
+
Binder token = new Binder();
mWindowManagerInternal.addWindowToken(token, TYPE_TOAST, DEFAULT_DISPLAY);
record = new ToastRecord(callingPid, pkg, callback, duration, token);
mToastQueue.add(record);
index = mToastQueue.size() - 1;
+ keepProcessAliveIfNeededLocked(callingPid);
}
- keepProcessAliveIfNeededLocked(callingPid);
// If it's at index 0, it's the current toast. It doesn't matter if it's
// new or just been updated. Call back and tell it to show itself.
// If the callback fails, this will remove it from the list, so don't
@@ -2113,7 +2133,7 @@ public class NotificationManagerService extends SystemService {
public void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) {
enforceSystemOrSystemUI("setNotificationsEnabledForPackage");
- mRankingHelper.setEnabled(pkg, uid, enabled);
+ mPreferencesHelper.setEnabled(pkg, uid, enabled);
// Now, cancel any outstanding notifications that are part of a just-disabled app
if (!enabled) {
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, null, 0, 0, true,
@@ -2151,7 +2171,7 @@ public class NotificationManagerService extends SystemService {
String pkg, int uid, boolean enabled) {
setNotificationsEnabledForPackage(pkg, uid, enabled);
- mRankingHelper.setAppImportanceLocked(pkg, uid);
+ mPreferencesHelper.setAppImportanceLocked(pkg, uid);
}
/**
@@ -2169,25 +2189,25 @@ public class NotificationManagerService extends SystemService {
public boolean areNotificationsEnabledForPackage(String pkg, int uid) {
checkCallerIsSystemOrSameApp(pkg);
- return mRankingHelper.getImportance(pkg, uid) != IMPORTANCE_NONE;
+ return mPreferencesHelper.getImportance(pkg, uid) != IMPORTANCE_NONE;
}
@Override
public int getPackageImportance(String pkg) {
checkCallerIsSystemOrSameApp(pkg);
- return mRankingHelper.getImportance(pkg, Binder.getCallingUid());
+ return mPreferencesHelper.getImportance(pkg, Binder.getCallingUid());
}
@Override
public boolean canShowBadge(String pkg, int uid) {
checkCallerIsSystem();
- return mRankingHelper.canShowBadge(pkg, uid);
+ return mPreferencesHelper.canShowBadge(pkg, uid);
}
@Override
public void setShowBadge(String pkg, int uid, boolean showBadge) {
checkCallerIsSystem();
- mRankingHelper.setShowBadge(pkg, uid, showBadge);
+ mPreferencesHelper.setShowBadge(pkg, uid, showBadge);
savePolicyFile();
}
@@ -2219,12 +2239,12 @@ public class NotificationManagerService extends SystemService {
for (int i = 0; i < channelsSize; i++) {
final NotificationChannel channel = channels.get(i);
Preconditions.checkNotNull(channel, "channel in list is null");
- mRankingHelper.createNotificationChannel(pkg, uid, channel,
+ mPreferencesHelper.createNotificationChannel(pkg, uid, channel,
true /* fromTargetApp */, mConditionProviders.isPackageOrComponentAllowed(
pkg, UserHandle.getUserId(uid)));
mListeners.notifyNotificationChannelChanged(pkg,
UserHandle.getUserHandleForUid(uid),
- mRankingHelper.getNotificationChannel(pkg, uid, channel.getId(), false),
+ mPreferencesHelper.getNotificationChannel(pkg, uid, channel.getId(), false),
NOTIFICATION_CHANNEL_OR_GROUP_ADDED);
}
savePolicyFile();
@@ -2247,7 +2267,7 @@ public class NotificationManagerService extends SystemService {
@Override
public NotificationChannel getNotificationChannel(String pkg, String channelId) {
checkCallerIsSystemOrSameApp(pkg);
- return mRankingHelper.getNotificationChannel(
+ return mPreferencesHelper.getNotificationChannel(
pkg, Binder.getCallingUid(), channelId, false /* includeDeleted */);
}
@@ -2255,7 +2275,7 @@ public class NotificationManagerService extends SystemService {
public NotificationChannel getNotificationChannelForPackage(String pkg, int uid,
String channelId, boolean includeDeleted) {
checkCallerIsSystem();
- return mRankingHelper.getNotificationChannel(pkg, uid, channelId, includeDeleted);
+ return mPreferencesHelper.getNotificationChannel(pkg, uid, channelId, includeDeleted);
}
@Override
@@ -2267,10 +2287,10 @@ public class NotificationManagerService extends SystemService {
}
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channelId, 0, 0, true,
UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null);
- mRankingHelper.deleteNotificationChannel(pkg, callingUid, channelId);
+ mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, channelId);
mListeners.notifyNotificationChannelChanged(pkg,
UserHandle.getUserHandleForUid(callingUid),
- mRankingHelper.getNotificationChannel(pkg, callingUid, channelId, true),
+ mPreferencesHelper.getNotificationChannel(pkg, callingUid, channelId, true),
NOTIFICATION_CHANNEL_OR_GROUP_DELETED);
savePolicyFile();
}
@@ -2278,7 +2298,7 @@ public class NotificationManagerService extends SystemService {
@Override
public NotificationChannelGroup getNotificationChannelGroup(String pkg, String groupId) {
checkCallerIsSystemOrSameApp(pkg);
- return mRankingHelper.getNotificationChannelGroupWithChannels(
+ return mPreferencesHelper.getNotificationChannelGroupWithChannels(
pkg, Binder.getCallingUid(), groupId, false);
}
@@ -2286,7 +2306,7 @@ public class NotificationManagerService extends SystemService {
public ParceledListSlice<NotificationChannelGroup> getNotificationChannelGroups(
String pkg) {
checkCallerIsSystemOrSameApp(pkg);
- return mRankingHelper.getNotificationChannelGroups(
+ return mPreferencesHelper.getNotificationChannelGroups(
pkg, Binder.getCallingUid(), false, false);
}
@@ -2296,10 +2316,10 @@ public class NotificationManagerService extends SystemService {
final int callingUid = Binder.getCallingUid();
NotificationChannelGroup groupToDelete =
- mRankingHelper.getNotificationChannelGroup(groupId, pkg, callingUid);
+ mPreferencesHelper.getNotificationChannelGroup(groupId, pkg, callingUid);
if (groupToDelete != null) {
List<NotificationChannel> deletedChannels =
- mRankingHelper.deleteNotificationChannelGroup(pkg, callingUid, groupId);
+ mPreferencesHelper.deleteNotificationChannelGroup(pkg, callingUid, groupId);
for (int i = 0; i < deletedChannels.size(); i++) {
final NotificationChannel deletedChannel = deletedChannels.get(i);
cancelAllNotificationsInt(MY_UID, MY_PID, pkg, deletedChannel.getId(), 0, 0,
@@ -2330,47 +2350,47 @@ public class NotificationManagerService extends SystemService {
public ParceledListSlice<NotificationChannel> getNotificationChannelsForPackage(String pkg,
int uid, boolean includeDeleted) {
enforceSystemOrSystemUI("getNotificationChannelsForPackage");
- return mRankingHelper.getNotificationChannels(pkg, uid, includeDeleted);
+ return mPreferencesHelper.getNotificationChannels(pkg, uid, includeDeleted);
}
@Override
public int getNumNotificationChannelsForPackage(String pkg, int uid,
boolean includeDeleted) {
enforceSystemOrSystemUI("getNumNotificationChannelsForPackage");
- return mRankingHelper.getNotificationChannels(pkg, uid, includeDeleted)
+ return mPreferencesHelper.getNotificationChannels(pkg, uid, includeDeleted)
.getList().size();
}
@Override
public boolean onlyHasDefaultChannel(String pkg, int uid) {
enforceSystemOrSystemUI("onlyHasDefaultChannel");
- return mRankingHelper.onlyHasDefaultChannel(pkg, uid);
+ return mPreferencesHelper.onlyHasDefaultChannel(pkg, uid);
}
@Override
public int getDeletedChannelCount(String pkg, int uid) {
enforceSystemOrSystemUI("getDeletedChannelCount");
- return mRankingHelper.getDeletedChannelCount(pkg, uid);
+ return mPreferencesHelper.getDeletedChannelCount(pkg, uid);
}
@Override
public int getBlockedChannelCount(String pkg, int uid) {
enforceSystemOrSystemUI("getBlockedChannelCount");
- return mRankingHelper.getBlockedChannelCount(pkg, uid);
+ return mPreferencesHelper.getBlockedChannelCount(pkg, uid);
}
@Override
public ParceledListSlice<NotificationChannelGroup> getNotificationChannelGroupsForPackage(
String pkg, int uid, boolean includeDeleted) {
checkCallerIsSystem();
- return mRankingHelper.getNotificationChannelGroups(pkg, uid, includeDeleted, true);
+ return mPreferencesHelper.getNotificationChannelGroups(pkg, uid, includeDeleted, true);
}
@Override
public NotificationChannelGroup getPopulatedNotificationChannelGroupForPackage(
String pkg, int uid, String groupId, boolean includeDeleted) {
enforceSystemOrSystemUI("getPopulatedNotificationChannelGroupForPackage");
- return mRankingHelper.getNotificationChannelGroupWithChannels(
+ return mPreferencesHelper.getNotificationChannelGroupWithChannels(
pkg, uid, groupId, includeDeleted);
}
@@ -2378,13 +2398,13 @@ public class NotificationManagerService extends SystemService {
public NotificationChannelGroup getNotificationChannelGroupForPackage(
String groupId, String pkg, int uid) {
enforceSystemOrSystemUI("getNotificationChannelGroupForPackage");
- return mRankingHelper.getNotificationChannelGroup(groupId, pkg, uid);
+ return mPreferencesHelper.getNotificationChannelGroup(groupId, pkg, uid);
}
@Override
public ParceledListSlice<NotificationChannel> getNotificationChannels(String pkg) {
checkCallerIsSystemOrSameApp(pkg);
- return mRankingHelper.getNotificationChannels(
+ return mPreferencesHelper.getNotificationChannels(
pkg, Binder.getCallingUid(), false /* includeDeleted */);
}
@@ -2401,12 +2421,12 @@ public class NotificationManagerService extends SystemService {
@Override
public int getBlockedAppCount(int userId) {
checkCallerIsSystem();
- return mRankingHelper.getBlockedAppCount(userId);
+ return mPreferencesHelper.getBlockedAppCount(userId);
}
@Override
public boolean areChannelsBypassingDnd() {
- return mRankingHelper.areChannelsBypassingDnd();
+ return mPreferencesHelper.areChannelsBypassingDnd();
}
@Override
@@ -2429,7 +2449,7 @@ public class NotificationManagerService extends SystemService {
// Reset notification preferences
if (!fromApp) {
- mRankingHelper.onPackagesChanged(
+ mPreferencesHelper.onPackagesChanged(
true, UserHandle.getCallingUserId(), packages, uids);
}
@@ -3122,14 +3142,19 @@ public class NotificationManagerService extends SystemService {
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(getContext(), TAG, pw)) return;
final DumpFilter filter = DumpFilter.parseFromArguments(args);
- if (filter.stats) {
- dumpJson(pw, filter);
- } else if (filter.proto) {
- dumpProto(fd, filter);
- } else if (filter.criticalPriority) {
- dumpNotificationRecords(pw, filter);
- } else {
- dumpImpl(pw, filter);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (filter.stats) {
+ dumpJson(pw, filter);
+ } else if (filter.proto) {
+ dumpProto(fd, filter);
+ } else if (filter.criticalPriority) {
+ dumpNotificationRecords(pw, filter);
+ } else {
+ dumpImpl(pw, filter);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
}
@@ -3405,20 +3430,27 @@ public class NotificationManagerService extends SystemService {
@Override
public void applyEnqueuedAdjustmentFromAssistant(INotificationListener token,
- Adjustment adjustment) throws RemoteException {
+ Adjustment adjustment) {
+ boolean foundEnqueued = false;
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mNotificationLock) {
mAssistants.checkServiceTokenLocked(token);
int N = mEnqueuedNotifications.size();
for (int i = 0; i < N; i++) {
- final NotificationRecord n = mEnqueuedNotifications.get(i);
- if (Objects.equals(adjustment.getKey(), n.getKey())
- && Objects.equals(adjustment.getUser(), n.getUserId())) {
- applyAdjustment(n, adjustment);
+ final NotificationRecord r = mEnqueuedNotifications.get(i);
+ if (Objects.equals(adjustment.getKey(), r.getKey())
+ && Objects.equals(adjustment.getUser(), r.getUserId())) {
+ applyAdjustment(r, adjustment);
+ r.applyAdjustments();
+ foundEnqueued = true;
break;
}
}
+ if (!foundEnqueued) {
+ // adjustment arrived too late to apply to enqueued; apply to posted
+ applyAdjustmentFromAssistant(token, adjustment);
+ }
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -3427,7 +3459,7 @@ public class NotificationManagerService extends SystemService {
@Override
public void applyAdjustmentFromAssistant(INotificationListener token,
- Adjustment adjustment) throws RemoteException {
+ Adjustment adjustment) {
final long identity = Binder.clearCallingIdentity();
try {
synchronized (mNotificationLock) {
@@ -3443,7 +3475,7 @@ public class NotificationManagerService extends SystemService {
@Override
public void applyAdjustmentsFromAssistant(INotificationListener token,
- List<Adjustment> adjustments) throws RemoteException {
+ List<Adjustment> adjustments) {
final long identity = Binder.clearCallingIdentity();
try {
@@ -3489,7 +3521,7 @@ public class NotificationManagerService extends SystemService {
Preconditions.checkNotNull(user);
verifyPrivilegedListener(token, user);
- return mRankingHelper.getNotificationChannels(pkg, getUidForPackageAndUser(pkg, user),
+ return mPreferencesHelper.getNotificationChannels(pkg, getUidForPackageAndUser(pkg, user),
false /* includeDeleted */);
}
@@ -3502,7 +3534,7 @@ public class NotificationManagerService extends SystemService {
verifyPrivilegedListener(token, user);
List<NotificationChannelGroup> groups = new ArrayList<>();
- groups.addAll(mRankingHelper.getNotificationChannelGroups(
+ groups.addAll(mPreferencesHelper.getNotificationChannelGroups(
pkg, getUidForPackageAndUser(pkg, user)));
return new ParceledListSlice<>(groups);
}
@@ -3683,10 +3715,10 @@ public class NotificationManagerService extends SystemService {
JSONObject dump = new JSONObject();
try {
dump.put("service", "Notification Manager");
- dump.put("bans", mRankingHelper.dumpBansJson(filter));
- dump.put("ranking", mRankingHelper.dumpJson(filter));
+ dump.put("bans", mPreferencesHelper.dumpBansJson(filter));
+ dump.put("ranking", mPreferencesHelper.dumpJson(filter));
dump.put("stats", mUsageStats.dumpJson(filter));
- dump.put("channels", mRankingHelper.dumpChannelsJson(filter));
+ dump.put("channels", mPreferencesHelper.dumpChannelsJson(filter));
} catch (JSONException e) {
e.printStackTrace();
}
@@ -3759,6 +3791,7 @@ public class NotificationManagerService extends SystemService {
long rankingToken = proto.start(NotificationServiceDumpProto.RANKING_CONFIG);
mRankingHelper.dump(proto, filter);
+ mPreferencesHelper.dump(proto, filter);
proto.end(rankingToken);
}
@@ -3825,6 +3858,7 @@ public class NotificationManagerService extends SystemService {
pw.println(" ");
}
pw.println(" mUseAttentionLight=" + mUseAttentionLight);
+ pw.println(" mHasLight=" + mHasLight);
pw.println(" mNotificationPulseEnabled=" + mNotificationPulseEnabled);
pw.println(" mSoundNotificationKey=" + mSoundNotificationKey);
pw.println(" mVibrateNotificationKey=" + mVibrateNotificationKey);
@@ -3866,6 +3900,9 @@ public class NotificationManagerService extends SystemService {
pw.println("\n Ranking Config:");
mRankingHelper.dump(pw, " ", filter);
+ pw.println("\n Notification Preferences:");
+ mPreferencesHelper.dump(pw, " ", filter);
+
pw.println("\n Notification listeners:");
mListeners.dump(pw, filter);
pw.print(" mListenerHints: "); pw.println(mListenerHints);
@@ -3929,7 +3966,7 @@ public class NotificationManagerService extends SystemService {
@Override
public NotificationChannel getNotificationChannel(String pkg, int uid, String
channelId) {
- return mRankingHelper.getNotificationChannel(pkg, uid, channelId, false);
+ return mPreferencesHelper.getNotificationChannel(pkg, uid, channelId, false);
}
@Override
@@ -4025,7 +4062,7 @@ public class NotificationManagerService extends SystemService {
if (mIsTelevision && (new Notification.TvExtender(notification)).getChannelId() != null) {
channelId = (new Notification.TvExtender(notification)).getChannelId();
}
- final NotificationChannel channel = mRankingHelper.getNotificationChannel(pkg,
+ final NotificationChannel channel = mPreferencesHelper.getNotificationChannel(pkg,
notificationUid, channelId, false /* includeDeleted */);
if (channel == null) {
final String noChannelStr = "No Channel found for "
@@ -4040,7 +4077,7 @@ public class NotificationManagerService extends SystemService {
+ ", notificationUid=" + notificationUid
+ ", notification=" + notification;
Log.e(TAG, noChannelStr);
- boolean appNotificationsOff = mRankingHelper.getImportance(pkg, notificationUid)
+ boolean appNotificationsOff = mPreferencesHelper.getImportance(pkg, notificationUid)
== NotificationManager.IMPORTANCE_NONE;
if (!appNotificationsOff) {
@@ -4055,7 +4092,7 @@ public class NotificationManagerService extends SystemService {
pkg, opPkg, id, tag, notificationUid, callingPid, notification,
user, null, System.currentTimeMillis());
final NotificationRecord r = new NotificationRecord(getContext(), n, channel);
- r.setIsAppImportanceLocked(mRankingHelper.getIsAppImportanceLocked(pkg, callingUid));
+ r.setIsAppImportanceLocked(mPreferencesHelper.getIsAppImportanceLocked(pkg, callingUid));
if ((notification.flags & Notification.FLAG_FOREGROUND_SERVICE) != 0) {
final boolean fgServiceShown = channel.isFgServiceShown();
@@ -4074,7 +4111,7 @@ public class NotificationManagerService extends SystemService {
channel.unlockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
channel.setFgServiceShown(true);
}
- mRankingHelper.updateNotificationChannel(pkg, notificationUid, channel, false);
+ mPreferencesHelper.updateNotificationChannel(pkg, notificationUid, channel, false);
r.updateNotificationChannel(channel);
}
} else if (!fgServiceShown && !TextUtils.isEmpty(channelId)
@@ -4249,8 +4286,8 @@ public class NotificationManagerService extends SystemService {
return isPackageSuspended;
}
final boolean isBlocked =
- mRankingHelper.isGroupBlocked(pkg, callingUid, r.getChannel().getGroup())
- || mRankingHelper.getImportance(pkg, callingUid)
+ mPreferencesHelper.isGroupBlocked(pkg, callingUid, r.getChannel().getGroup())
+ || mPreferencesHelper.getImportance(pkg, callingUid)
== NotificationManager.IMPORTANCE_NONE
|| r.getChannel().getImportance() == NotificationManager.IMPORTANCE_NONE;
if (isBlocked) {
@@ -4522,6 +4559,15 @@ public class NotificationManagerService extends SystemService {
@GuardedBy("mNotificationLock")
@VisibleForTesting
protected boolean isVisuallyInterruptive(NotificationRecord old, NotificationRecord r) {
+ // Ignore summary updates because we don't display most of the information.
+ if (r.sbn.isGroup() && r.sbn.getNotification().isGroupSummary()) {
+ if (DEBUG_INTERRUPTIVENESS) {
+ Log.v(TAG, "INTERRUPTIVENESS: "
+ + r.getKey() + " is not interruptive: summary");
+ }
+ return false;
+ }
+
if (old == null) {
if (DEBUG_INTERRUPTIVENESS) {
Log.v(TAG, "INTERRUPTIVENESS: "
@@ -4559,15 +4605,6 @@ public class NotificationManagerService extends SystemService {
return false;
}
- // Ignore summary updates because we don't display most of the information.
- if (r.sbn.isGroup() && r.sbn.getNotification().isGroupSummary()) {
- if (DEBUG_INTERRUPTIVENESS) {
- Log.v(TAG, "INTERRUPTIVENESS: "
- + r.getKey() + " is not interruptive: summary");
- }
- return false;
- }
-
final String oldTitle = String.valueOf(oldN.extras.get(Notification.EXTRA_TITLE));
final String newTitle = String.valueOf(newN.extras.get(Notification.EXTRA_TITLE));
if (!Objects.equals(oldTitle, newTitle)) {
@@ -4807,6 +4844,8 @@ public class NotificationManagerService extends SystemService {
buzz = playVibration(record, vibration, hasValidSound);
}
+ } else if ((record.getFlags() & Notification.FLAG_INSISTENT) != 0) {
+ hasValidSound = false;
}
}
}
@@ -4822,8 +4861,7 @@ public class NotificationManagerService extends SystemService {
// light
// release the light
boolean wasShowLights = mLights.remove(key);
- if (record.getLight() != null && aboveThreshold
- && ((record.getSuppressedVisualEffects() & SUPPRESSED_EFFECT_LIGHTS) == 0)) {
+ if (canShowLightsLocked(record, aboveThreshold)) {
mLights.add(key);
updateLightsLocked();
if (mUseAttentionLight) {
@@ -4834,7 +4872,19 @@ public class NotificationManagerService extends SystemService {
updateLightsLocked();
}
if (buzz || beep || blink) {
- record.setInterruptive(true);
+ // Ignore summary updates because we don't display most of the information.
+ if (record.sbn.isGroup() && record.sbn.getNotification().isGroupSummary()) {
+ if (DEBUG_INTERRUPTIVENESS) {
+ Log.v(TAG, "INTERRUPTIVENESS: "
+ + record.getKey() + " is not interruptive: summary");
+ }
+ } else {
+ if (DEBUG_INTERRUPTIVENESS) {
+ Log.v(TAG, "INTERRUPTIVENESS: "
+ + record.getKey() + " is interruptive: alerted");
+ }
+ record.setInterruptive(true);
+ }
MetricsLogger.action(record.getLogMaker()
.setCategory(MetricsEvent.NOTIFICATION_ALERT)
.setType(MetricsEvent.TYPE_OPEN)
@@ -4844,11 +4894,49 @@ public class NotificationManagerService extends SystemService {
}
@GuardedBy("mNotificationLock")
+ boolean canShowLightsLocked(final NotificationRecord record, boolean aboveThreshold) {
+ // device lacks light
+ if (!mHasLight) {
+ return false;
+ }
+ // user turned lights off globally
+ if (!mNotificationPulseEnabled) {
+ return false;
+ }
+ // the notification/channel has no light
+ if (record.getLight() == null) {
+ return false;
+ }
+ // unimportant notification
+ if (!aboveThreshold) {
+ return false;
+ }
+ // suppressed due to DND
+ if ((record.getSuppressedVisualEffects() & SUPPRESSED_EFFECT_LIGHTS) != 0) {
+ return false;
+ }
+ // Suppressed because it's a silent update
+ final Notification notification = record.getNotification();
+ if (record.isUpdate && (notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
+ return false;
+ }
+ // Suppressed because another notification in its group handles alerting
+ if (record.sbn.isGroup() && record.getNotification().suppressAlertingDueToGrouping()) {
+ return false;
+ }
+ // not if in call or the screen's on
+ if (mInCall || mScreenOn) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @GuardedBy("mNotificationLock")
boolean shouldMuteNotificationLocked(final NotificationRecord record) {
// Suppressed because it's a silent update
final Notification notification = record.getNotification();
- if(record.isUpdate
- && (notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
+ if (record.isUpdate && (notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0) {
return true;
}
@@ -4961,23 +5049,31 @@ public class NotificationManagerService extends SystemService {
}
protected void playInCallNotification() {
- new Thread() {
- @Override
- public void run() {
- final long identity = Binder.clearCallingIdentity();
- try {
- final IRingtonePlayer player = mAudioManager.getRingtonePlayer();
- if (player != null) {
- player.play(new Binder(), mInCallNotificationUri,
- mInCallNotificationAudioAttributes,
- mInCallNotificationVolume, false);
+ if (mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_NORMAL
+ && Settings.Secure.getInt(getContext().getContentResolver(),
+ Settings.Secure.IN_CALL_NOTIFICATION_ENABLED, 1) != 0) {
+ new Thread() {
+ @Override
+ public void run() {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ final IRingtonePlayer player = mAudioManager.getRingtonePlayer();
+ if (player != null) {
+ if (mCallNotificationToken != null) {
+ player.stop(mCallNotificationToken);
+ }
+ mCallNotificationToken = new Binder();
+ player.play(mCallNotificationToken, mInCallNotificationUri,
+ mInCallNotificationAudioAttributes,
+ mInCallNotificationVolume, false);
+ }
+ } catch (RemoteException e) {
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
- } catch (RemoteException e) {
- } finally {
- Binder.restoreCallingIdentity(identity);
}
- }
- }.start();
+ }.start();
+ }
}
@GuardedBy("mToastQueue")
@@ -5093,21 +5189,7 @@ public class NotificationManagerService extends SystemService {
int len = list.size();
for (int i=0; i<len; i++) {
ToastRecord r = list.get(i);
- if (r.pkg.equals(pkg) && r.callback.asBinder().equals(cbak)) {
- return i;
- }
- }
- return -1;
- }
-
- @GuardedBy("mToastQueue")
- int indexOfToastPackageLocked(String pkg)
- {
- ArrayList<ToastRecord> list = mToastQueue;
- int len = list.size();
- for (int i=0; i<len; i++) {
- ToastRecord r = list.get(i);
- if (r.pkg.equals(pkg)) {
+ if (r.pkg.equals(pkg) && r.callback.asBinder() == cbak) {
return i;
}
}
@@ -5180,6 +5262,7 @@ public class NotificationManagerService extends SystemService {
ArrayList<ArrayList<SnoozeCriterion>> snoozeCriteriaBefore = new ArrayList<>(N);
ArrayList<Integer> userSentimentBefore = new ArrayList<>(N);
ArrayList<Integer> suppressVisuallyBefore = new ArrayList<>(N);
+ ArrayList<ArrayList<Notification.Action>> smartActionsBefore = new ArrayList<>(N);
for (int i = 0; i < N; i++) {
final NotificationRecord r = mNotificationList.get(i);
orderBefore.add(r.getKey());
@@ -5191,6 +5274,7 @@ public class NotificationManagerService extends SystemService {
snoozeCriteriaBefore.add(r.getSnoozeCriteria());
userSentimentBefore.add(r.getUserSentiment());
suppressVisuallyBefore.add(r.getSuppressedVisualEffects());
+ smartActionsBefore.add(r.getSmartActions());
mRankingHelper.extractSignals(r);
}
mRankingHelper.sort(mNotificationList);
@@ -5205,7 +5289,8 @@ public class NotificationManagerService extends SystemService {
|| !Objects.equals(snoozeCriteriaBefore.get(i), r.getSnoozeCriteria())
|| !Objects.equals(userSentimentBefore.get(i), r.getUserSentiment())
|| !Objects.equals(suppressVisuallyBefore.get(i),
- r.getSuppressedVisualEffects())) {
+ r.getSuppressedVisualEffects())
+ || !Objects.equals(smartActionsBefore.get(i), r.getSmartActions())) {
mHandler.scheduleSendRankingUpdate();
return;
}
@@ -6188,6 +6273,7 @@ public class NotificationManagerService extends SystemService {
Bundle showBadge = new Bundle();
Bundle userSentiment = new Bundle();
Bundle hidden = new Bundle();
+ Bundle smartActions = new Bundle();
for (int i = 0; i < N; i++) {
NotificationRecord record = mNotificationList.get(i);
if (!isVisibleToListener(record.sbn, info)) {
@@ -6215,6 +6301,7 @@ public class NotificationManagerService extends SystemService {
showBadge.putBoolean(key, record.canShowBadge());
userSentiment.putInt(key, record.getUserSentiment());
hidden.putBoolean(key, record.isHidden());
+ smartActions.putParcelableArrayList(key, record.getSmartActions());
}
final int M = keys.size();
String[] keysAr = keys.toArray(new String[M]);
@@ -6225,7 +6312,8 @@ public class NotificationManagerService extends SystemService {
}
return new NotificationRankingUpdate(keysAr, interceptedKeysAr, visibilityOverrides,
suppressedVisualEffects, importanceAr, explanation, overrideGroupKeys,
- channels, overridePeople, snoozeCriteria, showBadge, userSentiment, hidden);
+ channels, overridePeople, snoozeCriteria, showBadge, userSentiment, hidden,
+ smartActions);
}
boolean hasCompanionDevice(ManagedServiceInfo info) {
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 39d0bf58c3b1..0154c72482c7 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -128,6 +128,11 @@ public final class NotificationRecord {
// The most recent update time, or the creation time if no updates.
private long mUpdateTimeMs;
+ // The most recent interruption time, or the creation time if no updates. Differs from the
+ // above value because updates are filtered based on whether they actually interrupted the
+ // user
+ private long mInterruptionTimeMs;
+
// Is this record an update of an old record?
public boolean isUpdate;
private int mPackagePriority;
@@ -154,6 +159,7 @@ public final class NotificationRecord {
private Light mLight;
private String mGroupLogTag;
private String mChannelIdLogTag;
+ private ArrayList<Notification.Action> mSmartActions;
private final List<Adjustment> mAdjustments;
private final NotificationStats mStats;
@@ -180,6 +186,7 @@ public final class NotificationRecord {
mRankingTimeMs = calculateRankingTimeMs(0L);
mCreationTimeMs = sbn.getPostTime();
mUpdateTimeMs = mCreationTimeMs;
+ mInterruptionTimeMs = mCreationTimeMs;
mContext = context;
stats = new NotificationUsageStats.SingleNotificationStats();
mChannel = channel;
@@ -437,6 +444,8 @@ public final class NotificationRecord {
pw.println(prefix + "fullscreenIntent=" + notification.fullScreenIntent);
pw.println(prefix + "contentIntent=" + notification.contentIntent);
pw.println(prefix + "deleteIntent=" + notification.deleteIntent);
+ pw.println(prefix + "number=" + notification.number);
+ pw.println(prefix + "groupAlertBehavior=" + notification.getGroupAlertBehavior());
pw.print(prefix + "tickerText=");
if (!TextUtils.isEmpty(notification.tickerText)) {
@@ -525,6 +534,7 @@ public final class NotificationRecord {
pw.println(prefix + "mCreationTimeMs=" + mCreationTimeMs);
pw.println(prefix + "mVisibleSinceMs=" + mVisibleSinceMs);
pw.println(prefix + "mUpdateTimeMs=" + mUpdateTimeMs);
+ pw.println(prefix + "mInterruptionTimeMs=" + mInterruptionTimeMs);
pw.println(prefix + "mSuppressedVisualEffects= " + mSuppressedVisualEffects);
if (mPreChannelsNotification) {
pw.println(prefix + String.format("defaults=0x%08x flags=0x%08x",
@@ -621,6 +631,9 @@ public final class NotificationRecord {
Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEUTRAL));
}
}
+ if (signals.containsKey(Adjustment.KEY_SMART_ACTIONS)) {
+ setSmartActions(signals.getParcelableArrayList(Adjustment.KEY_SMART_ACTIONS));
+ }
}
}
}
@@ -786,6 +799,10 @@ public final class NotificationRecord {
return mVisibleSinceMs == 0 ? 0 : (int) (now - mVisibleSinceMs);
}
+ public int getInterruptionMs(long now) {
+ return (int) (now - mInterruptionTimeMs);
+ }
+
/**
* Set the visibility of the notification.
*/
@@ -844,7 +861,7 @@ public final class NotificationRecord {
public void setSeen() {
mStats.setSeen();
if (mTextChanged) {
- mIsInterruptive = true;
+ setInterruptive(true);
}
}
@@ -940,6 +957,17 @@ public final class NotificationRecord {
public void setInterruptive(boolean interruptive) {
mIsInterruptive = interruptive;
+ final long now = System.currentTimeMillis();
+ mInterruptionTimeMs = interruptive ? now : mInterruptionTimeMs;
+
+ if (interruptive) {
+ MetricsLogger.action(getLogMaker()
+ .setCategory(MetricsEvent.NOTIFICATION_INTERRUPTION)
+ .setType(MetricsEvent.TYPE_OPEN)
+ .addTaggedData(MetricsEvent.NOTIFICATION_SINCE_INTERRUPTION_MILLIS,
+ getInterruptionMs(now)));
+ MetricsLogger.histogram(mContext, "note_interruptive", getInterruptionMs(now));
+ }
}
public void setTextChanged(boolean textChanged) {
@@ -1025,6 +1053,14 @@ public final class NotificationRecord {
mHasSeenSmartReplies = hasSeenSmartReplies;
}
+ public void setSmartActions(ArrayList<Notification.Action> smartActions) {
+ mSmartActions = smartActions;
+ }
+
+ public ArrayList<Notification.Action> getSmartActions() {
+ return mSmartActions;
+ }
+
/**
* @return all {@link Uri} that should have permission granted to whoever
* will be rendering it. This list has already been vetted to only
@@ -1116,7 +1152,9 @@ public final class NotificationRecord {
sbn.getNotification().isGroupSummary() ? 1 : 0)
.addTaggedData(MetricsEvent.NOTIFICATION_SINCE_CREATE_MILLIS, getLifespanMs(now))
.addTaggedData(MetricsEvent.NOTIFICATION_SINCE_UPDATE_MILLIS, getFreshnessMs(now))
- .addTaggedData(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS, getExposureMs(now));
+ .addTaggedData(MetricsEvent.NOTIFICATION_SINCE_VISIBLE_MILLIS, getExposureMs(now))
+ .addTaggedData(MetricsEvent.NOTIFICATION_SINCE_INTERRUPTION_MILLIS,
+ getInterruptionMs(now));
}
public LogMaker getLogMaker() {
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
new file mode 100644
index 000000000000..dfc61d98c604
--- /dev/null
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -0,0 +1,1373 @@
+/**
+ * Copyright (c) 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_NONE;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationChannelGroup;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
+import android.metrics.LogMaker;
+import android.os.Build;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.service.notification.NotificationListenerService;
+import android.service.notification.RankingHelperProto;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Slog;
+import android.util.SparseBooleanArray;
+import android.util.proto.ProtoOutputStream;
+
+import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.util.Preconditions;
+import com.android.internal.util.XmlUtils;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class PreferencesHelper implements RankingConfig {
+ private static final String TAG = "NotificationPrefHelper";
+ private static final int XML_VERSION = 1;
+
+ @VisibleForTesting
+ static final String TAG_RANKING = "ranking";
+ private static final String TAG_PACKAGE = "package";
+ private static final String TAG_CHANNEL = "channel";
+ private static final String TAG_GROUP = "channelGroup";
+
+ private static final String ATT_VERSION = "version";
+ private static final String ATT_NAME = "name";
+ private static final String ATT_UID = "uid";
+ private static final String ATT_ID = "id";
+ private static final String ATT_PRIORITY = "priority";
+ private static final String ATT_VISIBILITY = "visibility";
+ private static final String ATT_IMPORTANCE = "importance";
+ private static final String ATT_SHOW_BADGE = "show_badge";
+ private static final String ATT_APP_USER_LOCKED_FIELDS = "app_user_locked_fields";
+
+ private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT;
+ private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE;
+ private static final int DEFAULT_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED;
+ private static final boolean DEFAULT_SHOW_BADGE = true;
+ /**
+ * Default value for what fields are user locked. See {@link LockableAppFields} for all lockable
+ * fields.
+ */
+ private static final int DEFAULT_LOCKED_APP_FIELDS = 0;
+
+ /**
+ * All user-lockable fields for a given application.
+ */
+ @IntDef({LockableAppFields.USER_LOCKED_IMPORTANCE})
+ public @interface LockableAppFields {
+ int USER_LOCKED_IMPORTANCE = 0x00000001;
+ }
+
+ // pkg|uid => PackagePreferences
+ private final ArrayMap<String, PackagePreferences> mPackagePreferencess = new ArrayMap<>();
+ // pkg => PackagePreferences
+ private final ArrayMap<String, PackagePreferences> mRestoredWithoutUids = new ArrayMap<>();
+
+
+ private final Context mContext;
+ private final PackageManager mPm;
+ private final RankingHandler mRankingHandler;
+ private final ZenModeHelper mZenModeHelper;
+
+ private SparseBooleanArray mBadgingEnabled;
+ private boolean mAreChannelsBypassingDnd;
+
+
+ public PreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
+ ZenModeHelper zenHelper) {
+ mContext = context;
+ mZenModeHelper = zenHelper;
+ mRankingHandler = rankingHandler;
+ mPm = pm;
+
+ updateBadgingEnabled();
+
+ mAreChannelsBypassingDnd = (mZenModeHelper.getNotificationPolicy().state &
+ NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND) == 1;
+ updateChannelsBypassingDnd();
+
+ }
+
+ public void readXml(XmlPullParser parser, boolean forRestore)
+ throws XmlPullParserException, IOException {
+ int type = parser.getEventType();
+ if (type != XmlPullParser.START_TAG) return;
+ String tag = parser.getName();
+ if (!TAG_RANKING.equals(tag)) return;
+ // Clobber groups and channels with the xml, but don't delete other data that wasn't present
+ // at the time of serialization.
+ mRestoredWithoutUids.clear();
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ tag = parser.getName();
+ if (type == XmlPullParser.END_TAG && TAG_RANKING.equals(tag)) {
+ return;
+ }
+ if (type == XmlPullParser.START_TAG) {
+ if (TAG_PACKAGE.equals(tag)) {
+ int uid = XmlUtils.readIntAttribute(parser, ATT_UID,
+ PackagePreferences.UNKNOWN_UID);
+ String name = parser.getAttributeValue(null, ATT_NAME);
+ if (!TextUtils.isEmpty(name)) {
+ if (forRestore) {
+ try {
+ //TODO: http://b/22388012
+ uid = mPm.getPackageUidAsUser(name,
+ UserHandle.USER_SYSTEM);
+ } catch (PackageManager.NameNotFoundException e) {
+ // noop
+ }
+ }
+
+ PackagePreferences r = getOrCreatePackagePreferences(name, uid,
+ XmlUtils.readIntAttribute(
+ parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE),
+ XmlUtils.readIntAttribute(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
+ XmlUtils.readIntAttribute(
+ parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
+ XmlUtils.readBooleanAttribute(
+ parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
+ r.importance = XmlUtils.readIntAttribute(
+ parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
+ r.priority = XmlUtils.readIntAttribute(
+ parser, ATT_PRIORITY, DEFAULT_PRIORITY);
+ r.visibility = XmlUtils.readIntAttribute(
+ parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
+ r.showBadge = XmlUtils.readBooleanAttribute(
+ parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
+ r.lockedAppFields = XmlUtils.readIntAttribute(parser,
+ ATT_APP_USER_LOCKED_FIELDS, DEFAULT_LOCKED_APP_FIELDS);
+
+ final int innerDepth = parser.getDepth();
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG
+ || parser.getDepth() > innerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+
+ String tagName = parser.getName();
+ // Channel groups
+ if (TAG_GROUP.equals(tagName)) {
+ String id = parser.getAttributeValue(null, ATT_ID);
+ CharSequence groupName = parser.getAttributeValue(null, ATT_NAME);
+ if (!TextUtils.isEmpty(id)) {
+ NotificationChannelGroup group
+ = new NotificationChannelGroup(id, groupName);
+ group.populateFromXml(parser);
+ r.groups.put(id, group);
+ }
+ }
+ // Channels
+ if (TAG_CHANNEL.equals(tagName)) {
+ String id = parser.getAttributeValue(null, ATT_ID);
+ String channelName = parser.getAttributeValue(null, ATT_NAME);
+ int channelImportance = XmlUtils.readIntAttribute(
+ parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
+ if (!TextUtils.isEmpty(id) && !TextUtils.isEmpty(channelName)) {
+ NotificationChannel channel = new NotificationChannel(id,
+ channelName, channelImportance);
+ if (forRestore) {
+ channel.populateFromXmlForRestore(parser, mContext);
+ } else {
+ channel.populateFromXml(parser);
+ }
+ r.channels.put(id, channel);
+ }
+ }
+ }
+
+ try {
+ deleteDefaultChannelIfNeeded(r);
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(TAG, "deleteDefaultChannelIfNeeded - Exception: " + e);
+ }
+ }
+ }
+ }
+ }
+ throw new IllegalStateException("Failed to reach END_DOCUMENT");
+ }
+
+ private PackagePreferences getPackagePreferences(String pkg, int uid) {
+ final String key = packagePreferencesKey(pkg, uid);
+ synchronized (mPackagePreferencess) {
+ return mPackagePreferencess.get(key);
+ }
+ }
+
+ private PackagePreferences getOrCreatePackagePreferences(String pkg, int uid) {
+ return getOrCreatePackagePreferences(pkg, uid,
+ DEFAULT_IMPORTANCE, DEFAULT_PRIORITY, DEFAULT_VISIBILITY, DEFAULT_SHOW_BADGE);
+ }
+
+ private PackagePreferences getOrCreatePackagePreferences(String pkg, int uid, int importance,
+ int priority, int visibility, boolean showBadge) {
+ final String key = packagePreferencesKey(pkg, uid);
+ synchronized (mPackagePreferencess) {
+ PackagePreferences
+ r = (uid == PackagePreferences.UNKNOWN_UID) ? mRestoredWithoutUids.get(pkg)
+ : mPackagePreferencess.get(key);
+ if (r == null) {
+ r = new PackagePreferences();
+ r.pkg = pkg;
+ r.uid = uid;
+ r.importance = importance;
+ r.priority = priority;
+ r.visibility = visibility;
+ r.showBadge = showBadge;
+
+ try {
+ createDefaultChannelIfNeeded(r);
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(TAG, "createDefaultChannelIfNeeded - Exception: " + e);
+ }
+
+ if (r.uid == PackagePreferences.UNKNOWN_UID) {
+ mRestoredWithoutUids.put(pkg, r);
+ } else {
+ mPackagePreferencess.put(key, r);
+ }
+ }
+ return r;
+ }
+ }
+
+ private boolean shouldHaveDefaultChannel(PackagePreferences r) throws
+ PackageManager.NameNotFoundException {
+ final int userId = UserHandle.getUserId(r.uid);
+ final ApplicationInfo applicationInfo =
+ mPm.getApplicationInfoAsUser(r.pkg, 0, userId);
+ if (applicationInfo.targetSdkVersion >= Build.VERSION_CODES.O) {
+ // O apps should not have the default channel.
+ return false;
+ }
+
+ // Otherwise, this app should have the default channel.
+ return true;
+ }
+
+ private void deleteDefaultChannelIfNeeded(PackagePreferences r) throws
+ PackageManager.NameNotFoundException {
+ if (!r.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
+ // Not present
+ return;
+ }
+
+ if (shouldHaveDefaultChannel(r)) {
+ // Keep the default channel until upgraded.
+ return;
+ }
+
+ // Remove Default Channel.
+ r.channels.remove(NotificationChannel.DEFAULT_CHANNEL_ID);
+ }
+
+ private void createDefaultChannelIfNeeded(PackagePreferences r) throws
+ PackageManager.NameNotFoundException {
+ if (r.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
+ r.channels.get(NotificationChannel.DEFAULT_CHANNEL_ID).setName(mContext.getString(
+ com.android.internal.R.string.default_notification_channel_label));
+ return;
+ }
+
+ if (!shouldHaveDefaultChannel(r)) {
+ // Keep the default channel until upgraded.
+ return;
+ }
+
+ // Create Default Channel
+ NotificationChannel channel;
+ channel = new NotificationChannel(
+ NotificationChannel.DEFAULT_CHANNEL_ID,
+ mContext.getString(R.string.default_notification_channel_label),
+ r.importance);
+ channel.setBypassDnd(r.priority == Notification.PRIORITY_MAX);
+ channel.setLockscreenVisibility(r.visibility);
+ if (r.importance != NotificationManager.IMPORTANCE_UNSPECIFIED) {
+ channel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
+ }
+ if (r.priority != DEFAULT_PRIORITY) {
+ channel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
+ }
+ if (r.visibility != DEFAULT_VISIBILITY) {
+ channel.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY);
+ }
+ r.channels.put(channel.getId(), channel);
+ }
+
+ public void writeXml(XmlSerializer out, boolean forBackup) throws IOException {
+ out.startTag(null, TAG_RANKING);
+ out.attribute(null, ATT_VERSION, Integer.toString(XML_VERSION));
+
+ synchronized (mPackagePreferencess) {
+ final int N = mPackagePreferencess.size();
+ for (int i = 0; i < N; i++) {
+ final PackagePreferences r = mPackagePreferencess.valueAt(i);
+ //TODO: http://b/22388012
+ if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) {
+ continue;
+ }
+ final boolean hasNonDefaultSettings =
+ r.importance != DEFAULT_IMPORTANCE
+ || r.priority != DEFAULT_PRIORITY
+ || r.visibility != DEFAULT_VISIBILITY
+ || r.showBadge != DEFAULT_SHOW_BADGE
+ || r.lockedAppFields != DEFAULT_LOCKED_APP_FIELDS
+ || r.channels.size() > 0
+ || r.groups.size() > 0;
+ if (hasNonDefaultSettings) {
+ out.startTag(null, TAG_PACKAGE);
+ out.attribute(null, ATT_NAME, r.pkg);
+ if (r.importance != DEFAULT_IMPORTANCE) {
+ out.attribute(null, ATT_IMPORTANCE, Integer.toString(r.importance));
+ }
+ if (r.priority != DEFAULT_PRIORITY) {
+ out.attribute(null, ATT_PRIORITY, Integer.toString(r.priority));
+ }
+ if (r.visibility != DEFAULT_VISIBILITY) {
+ out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility));
+ }
+ out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge));
+ out.attribute(null, ATT_APP_USER_LOCKED_FIELDS,
+ Integer.toString(r.lockedAppFields));
+
+ if (!forBackup) {
+ out.attribute(null, ATT_UID, Integer.toString(r.uid));
+ }
+
+ for (NotificationChannelGroup group : r.groups.values()) {
+ group.writeXml(out);
+ }
+
+ for (NotificationChannel channel : r.channels.values()) {
+ if (forBackup) {
+ if (!channel.isDeleted()) {
+ channel.writeXmlForBackup(out, mContext);
+ }
+ } else {
+ channel.writeXml(out);
+ }
+ }
+
+ out.endTag(null, TAG_PACKAGE);
+ }
+ }
+ }
+ out.endTag(null, TAG_RANKING);
+ }
+
+ /**
+ * Gets importance.
+ */
+ @Override
+ public int getImportance(String packageName, int uid) {
+ return getOrCreatePackagePreferences(packageName, uid).importance;
+ }
+
+
+ /**
+ * Returns whether the importance of the corresponding notification is user-locked and shouldn't
+ * be adjusted by an assistant (via means of a blocking helper, for example). For the channel
+ * locking field, see {@link NotificationChannel#USER_LOCKED_IMPORTANCE}.
+ */
+ public boolean getIsAppImportanceLocked(String packageName, int uid) {
+ int userLockedFields = getOrCreatePackagePreferences(packageName, uid).lockedAppFields;
+ return (userLockedFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0;
+ }
+
+ @Override
+ public boolean canShowBadge(String packageName, int uid) {
+ return getOrCreatePackagePreferences(packageName, uid).showBadge;
+ }
+
+ @Override
+ public void setShowBadge(String packageName, int uid, boolean showBadge) {
+ getOrCreatePackagePreferences(packageName, uid).showBadge = showBadge;
+ updateConfig();
+ }
+
+ @Override
+ public boolean isGroupBlocked(String packageName, int uid, String groupId) {
+ if (groupId == null) {
+ return false;
+ }
+ PackagePreferences r = getOrCreatePackagePreferences(packageName, uid);
+ NotificationChannelGroup group = r.groups.get(groupId);
+ if (group == null) {
+ return false;
+ }
+ return group.isBlocked();
+ }
+
+ int getPackagePriority(String pkg, int uid) {
+ return getOrCreatePackagePreferences(pkg, uid).priority;
+ }
+
+ int getPackageVisibility(String pkg, int uid) {
+ return getOrCreatePackagePreferences(pkg, uid).visibility;
+ }
+
+ @Override
+ public void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group,
+ boolean fromTargetApp) {
+ Preconditions.checkNotNull(pkg);
+ Preconditions.checkNotNull(group);
+ Preconditions.checkNotNull(group.getId());
+ Preconditions.checkNotNull(!TextUtils.isEmpty(group.getName()));
+ PackagePreferences r = getOrCreatePackagePreferences(pkg, uid);
+ if (r == null) {
+ throw new IllegalArgumentException("Invalid package");
+ }
+ final NotificationChannelGroup oldGroup = r.groups.get(group.getId());
+ if (!group.equals(oldGroup)) {
+ // will log for new entries as well as name/description changes
+ MetricsLogger.action(getChannelGroupLog(group.getId(), pkg));
+ }
+ if (oldGroup != null) {
+ group.setChannels(oldGroup.getChannels());
+
+ if (fromTargetApp) {
+ group.setBlocked(oldGroup.isBlocked());
+ }
+ }
+ r.groups.put(group.getId(), group);
+ }
+
+ @Override
+ public void createNotificationChannel(String pkg, int uid, NotificationChannel channel,
+ boolean fromTargetApp, boolean hasDndAccess) {
+ Preconditions.checkNotNull(pkg);
+ Preconditions.checkNotNull(channel);
+ Preconditions.checkNotNull(channel.getId());
+ Preconditions.checkArgument(!TextUtils.isEmpty(channel.getName()));
+ PackagePreferences r = getOrCreatePackagePreferences(pkg, uid);
+ if (r == null) {
+ throw new IllegalArgumentException("Invalid package");
+ }
+ if (channel.getGroup() != null && !r.groups.containsKey(channel.getGroup())) {
+ throw new IllegalArgumentException("NotificationChannelGroup doesn't exist");
+ }
+ if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(channel.getId())) {
+ throw new IllegalArgumentException("Reserved id");
+ }
+ NotificationChannel existing = r.channels.get(channel.getId());
+ // Keep most of the existing settings
+ if (existing != null && fromTargetApp) {
+ if (existing.isDeleted()) {
+ existing.setDeleted(false);
+
+ // log a resurrected channel as if it's new again
+ MetricsLogger.action(getChannelLog(channel, pkg).setType(
+ com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_OPEN));
+ }
+
+ existing.setName(channel.getName().toString());
+ existing.setDescription(channel.getDescription());
+ existing.setBlockableSystem(channel.isBlockableSystem());
+ if (existing.getGroup() == null) {
+ existing.setGroup(channel.getGroup());
+ }
+
+ // Apps are allowed to downgrade channel importance if the user has not changed any
+ // fields on this channel yet.
+ if (existing.getUserLockedFields() == 0 &&
+ channel.getImportance() < existing.getImportance()) {
+ existing.setImportance(channel.getImportance());
+ }
+
+ // system apps and dnd access apps can bypass dnd if the user hasn't changed any
+ // fields on the channel yet
+ if (existing.getUserLockedFields() == 0 && hasDndAccess) {
+ boolean bypassDnd = channel.canBypassDnd();
+ existing.setBypassDnd(bypassDnd);
+
+ if (bypassDnd != mAreChannelsBypassingDnd) {
+ updateChannelsBypassingDnd();
+ }
+ }
+
+ updateConfig();
+ return;
+ }
+ if (channel.getImportance() < IMPORTANCE_NONE
+ || channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
+ throw new IllegalArgumentException("Invalid importance level");
+ }
+
+ // Reset fields that apps aren't allowed to set.
+ if (fromTargetApp && !hasDndAccess) {
+ channel.setBypassDnd(r.priority == Notification.PRIORITY_MAX);
+ }
+ if (fromTargetApp) {
+ channel.setLockscreenVisibility(r.visibility);
+ }
+ clearLockedFields(channel);
+ if (channel.getLockscreenVisibility() == Notification.VISIBILITY_PUBLIC) {
+ channel.setLockscreenVisibility(
+ NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE);
+ }
+ if (!r.showBadge) {
+ channel.setShowBadge(false);
+ }
+
+ r.channels.put(channel.getId(), channel);
+ if (channel.canBypassDnd() != mAreChannelsBypassingDnd) {
+ updateChannelsBypassingDnd();
+ }
+ MetricsLogger.action(getChannelLog(channel, pkg).setType(
+ com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_OPEN));
+ }
+
+ void clearLockedFields(NotificationChannel channel) {
+ channel.unlockFields(channel.getUserLockedFields());
+ }
+
+ @Override
+ public void updateNotificationChannel(String pkg, int uid, NotificationChannel updatedChannel,
+ boolean fromUser) {
+ Preconditions.checkNotNull(updatedChannel);
+ Preconditions.checkNotNull(updatedChannel.getId());
+ PackagePreferences r = getOrCreatePackagePreferences(pkg, uid);
+ if (r == null) {
+ throw new IllegalArgumentException("Invalid package");
+ }
+ NotificationChannel channel = r.channels.get(updatedChannel.getId());
+ if (channel == null || channel.isDeleted()) {
+ throw new IllegalArgumentException("Channel does not exist");
+ }
+ if (updatedChannel.getLockscreenVisibility() == Notification.VISIBILITY_PUBLIC) {
+ updatedChannel.setLockscreenVisibility(
+ NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE);
+ }
+ if (!fromUser) {
+ updatedChannel.unlockFields(updatedChannel.getUserLockedFields());
+ }
+ if (fromUser) {
+ updatedChannel.lockFields(channel.getUserLockedFields());
+ lockFieldsForUpdate(channel, updatedChannel);
+ }
+ r.channels.put(updatedChannel.getId(), updatedChannel);
+
+ if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(updatedChannel.getId())) {
+ // copy settings to app level so they are inherited by new channels
+ // when the app migrates
+ r.importance = updatedChannel.getImportance();
+ r.priority = updatedChannel.canBypassDnd()
+ ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT;
+ r.visibility = updatedChannel.getLockscreenVisibility();
+ r.showBadge = updatedChannel.canShowBadge();
+ }
+
+ if (!channel.equals(updatedChannel)) {
+ // only log if there are real changes
+ MetricsLogger.action(getChannelLog(updatedChannel, pkg));
+ }
+
+ if (updatedChannel.canBypassDnd() != mAreChannelsBypassingDnd) {
+ updateChannelsBypassingDnd();
+ }
+ updateConfig();
+ }
+
+ @Override
+ public NotificationChannel getNotificationChannel(String pkg, int uid, String channelId,
+ boolean includeDeleted) {
+ Preconditions.checkNotNull(pkg);
+ PackagePreferences r = getOrCreatePackagePreferences(pkg, uid);
+ if (r == null) {
+ return null;
+ }
+ if (channelId == null) {
+ channelId = NotificationChannel.DEFAULT_CHANNEL_ID;
+ }
+ final NotificationChannel nc = r.channels.get(channelId);
+ if (nc != null && (includeDeleted || !nc.isDeleted())) {
+ return nc;
+ }
+ return null;
+ }
+
+ @Override
+ public void deleteNotificationChannel(String pkg, int uid, String channelId) {
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return;
+ }
+ NotificationChannel channel = r.channels.get(channelId);
+ if (channel != null) {
+ channel.setDeleted(true);
+ LogMaker lm = getChannelLog(channel, pkg);
+ lm.setType(com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_CLOSE);
+ MetricsLogger.action(lm);
+
+ if (mAreChannelsBypassingDnd && channel.canBypassDnd()) {
+ updateChannelsBypassingDnd();
+ }
+ }
+ }
+
+ @Override
+ @VisibleForTesting
+ public void permanentlyDeleteNotificationChannel(String pkg, int uid, String channelId) {
+ Preconditions.checkNotNull(pkg);
+ Preconditions.checkNotNull(channelId);
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return;
+ }
+ r.channels.remove(channelId);
+ }
+
+ @Override
+ public void permanentlyDeleteNotificationChannels(String pkg, int uid) {
+ Preconditions.checkNotNull(pkg);
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return;
+ }
+ int N = r.channels.size() - 1;
+ for (int i = N; i >= 0; i--) {
+ String key = r.channels.keyAt(i);
+ if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(key)) {
+ r.channels.remove(key);
+ }
+ }
+ }
+
+ public NotificationChannelGroup getNotificationChannelGroupWithChannels(String pkg,
+ int uid, String groupId, boolean includeDeleted) {
+ Preconditions.checkNotNull(pkg);
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null || groupId == null || !r.groups.containsKey(groupId)) {
+ return null;
+ }
+ NotificationChannelGroup group = r.groups.get(groupId).clone();
+ group.setChannels(new ArrayList<>());
+ int N = r.channels.size();
+ for (int i = 0; i < N; i++) {
+ final NotificationChannel nc = r.channels.valueAt(i);
+ if (includeDeleted || !nc.isDeleted()) {
+ if (groupId.equals(nc.getGroup())) {
+ group.addChannel(nc);
+ }
+ }
+ }
+ return group;
+ }
+
+ public NotificationChannelGroup getNotificationChannelGroup(String groupId, String pkg,
+ int uid) {
+ Preconditions.checkNotNull(pkg);
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return null;
+ }
+ return r.groups.get(groupId);
+ }
+
+ @Override
+ public ParceledListSlice<NotificationChannelGroup> getNotificationChannelGroups(String pkg,
+ int uid, boolean includeDeleted, boolean includeNonGrouped) {
+ Preconditions.checkNotNull(pkg);
+ Map<String, NotificationChannelGroup> groups = new ArrayMap<>();
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return ParceledListSlice.emptyList();
+ }
+ NotificationChannelGroup nonGrouped = new NotificationChannelGroup(null, null);
+ int N = r.channels.size();
+ for (int i = 0; i < N; i++) {
+ final NotificationChannel nc = r.channels.valueAt(i);
+ if (includeDeleted || !nc.isDeleted()) {
+ if (nc.getGroup() != null) {
+ if (r.groups.get(nc.getGroup()) != null) {
+ NotificationChannelGroup ncg = groups.get(nc.getGroup());
+ if (ncg == null) {
+ ncg = r.groups.get(nc.getGroup()).clone();
+ ncg.setChannels(new ArrayList<>());
+ groups.put(nc.getGroup(), ncg);
+
+ }
+ ncg.addChannel(nc);
+ }
+ } else {
+ nonGrouped.addChannel(nc);
+ }
+ }
+ }
+ if (includeNonGrouped && nonGrouped.getChannels().size() > 0) {
+ groups.put(null, nonGrouped);
+ }
+ return new ParceledListSlice<>(new ArrayList<>(groups.values()));
+ }
+
+ public List<NotificationChannel> deleteNotificationChannelGroup(String pkg, int uid,
+ String groupId) {
+ List<NotificationChannel> deletedChannels = new ArrayList<>();
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null || TextUtils.isEmpty(groupId)) {
+ return deletedChannels;
+ }
+
+ r.groups.remove(groupId);
+
+ int N = r.channels.size();
+ for (int i = 0; i < N; i++) {
+ final NotificationChannel nc = r.channels.valueAt(i);
+ if (groupId.equals(nc.getGroup())) {
+ nc.setDeleted(true);
+ deletedChannels.add(nc);
+ }
+ }
+ return deletedChannels;
+ }
+
+ @Override
+ public Collection<NotificationChannelGroup> getNotificationChannelGroups(String pkg,
+ int uid) {
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return new ArrayList<>();
+ }
+ return r.groups.values();
+ }
+
+ @Override
+ public ParceledListSlice<NotificationChannel> getNotificationChannels(String pkg, int uid,
+ boolean includeDeleted) {
+ Preconditions.checkNotNull(pkg);
+ List<NotificationChannel> channels = new ArrayList<>();
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return ParceledListSlice.emptyList();
+ }
+ int N = r.channels.size();
+ for (int i = 0; i < N; i++) {
+ final NotificationChannel nc = r.channels.valueAt(i);
+ if (includeDeleted || !nc.isDeleted()) {
+ channels.add(nc);
+ }
+ }
+ return new ParceledListSlice<>(channels);
+ }
+
+ /**
+ * True for pre-O apps that only have the default channel, or pre O apps that have no
+ * channels yet. This method will create the default channel for pre-O apps that don't have it.
+ * Should never be true for O+ targeting apps, but that's enforced on boot/when an app
+ * upgrades.
+ */
+ public boolean onlyHasDefaultChannel(String pkg, int uid) {
+ PackagePreferences r = getOrCreatePackagePreferences(pkg, uid);
+ if (r.channels.size() == 1
+ && r.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
+ return true;
+ }
+ return false;
+ }
+
+ public int getDeletedChannelCount(String pkg, int uid) {
+ Preconditions.checkNotNull(pkg);
+ int deletedCount = 0;
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return deletedCount;
+ }
+ int N = r.channels.size();
+ for (int i = 0; i < N; i++) {
+ final NotificationChannel nc = r.channels.valueAt(i);
+ if (nc.isDeleted()) {
+ deletedCount++;
+ }
+ }
+ return deletedCount;
+ }
+
+ public int getBlockedChannelCount(String pkg, int uid) {
+ Preconditions.checkNotNull(pkg);
+ int blockedCount = 0;
+ PackagePreferences r = getPackagePreferences(pkg, uid);
+ if (r == null) {
+ return blockedCount;
+ }
+ int N = r.channels.size();
+ for (int i = 0; i < N; i++) {
+ final NotificationChannel nc = r.channels.valueAt(i);
+ if (!nc.isDeleted() && IMPORTANCE_NONE == nc.getImportance()) {
+ blockedCount++;
+ }
+ }
+ return blockedCount;
+ }
+
+ public int getBlockedAppCount(int userId) {
+ int count = 0;
+ synchronized (mPackagePreferencess) {
+ final int N = mPackagePreferencess.size();
+ for (int i = 0; i < N; i++) {
+ final PackagePreferences r = mPackagePreferencess.valueAt(i);
+ if (userId == UserHandle.getUserId(r.uid)
+ && r.importance == IMPORTANCE_NONE) {
+ count++;
+ }
+ }
+ }
+ return count;
+ }
+
+ public void updateChannelsBypassingDnd() {
+ synchronized (mPackagePreferencess) {
+ final int numPackagePreferencess = mPackagePreferencess.size();
+ for (int PackagePreferencesIndex = 0; PackagePreferencesIndex < numPackagePreferencess;
+ PackagePreferencesIndex++) {
+ final PackagePreferences r = mPackagePreferencess.valueAt(PackagePreferencesIndex);
+ final int numChannels = r.channels.size();
+
+ for (int channelIndex = 0; channelIndex < numChannels; channelIndex++) {
+ NotificationChannel channel = r.channels.valueAt(channelIndex);
+ if (!channel.isDeleted() && channel.canBypassDnd()) {
+ // If any channel bypasses DND, synchronize state and return early.
+ if (!mAreChannelsBypassingDnd) {
+ mAreChannelsBypassingDnd = true;
+ updateZenPolicy(true);
+ }
+ return;
+ }
+ }
+ }
+ }
+
+ // If no channels bypass DND, update the zen policy once to disable DND bypass.
+ if (mAreChannelsBypassingDnd) {
+ mAreChannelsBypassingDnd = false;
+ updateZenPolicy(false);
+ }
+ }
+
+ public void updateZenPolicy(boolean areChannelsBypassingDnd) {
+ NotificationManager.Policy policy = mZenModeHelper.getNotificationPolicy();
+ mZenModeHelper.setNotificationPolicy(new NotificationManager.Policy(
+ policy.priorityCategories, policy.priorityCallSenders,
+ policy.priorityMessageSenders, policy.suppressedVisualEffects,
+ (areChannelsBypassingDnd ? NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND
+ : 0)));
+ }
+
+ public boolean areChannelsBypassingDnd() {
+ return mAreChannelsBypassingDnd;
+ }
+
+ /**
+ * Sets importance.
+ */
+ @Override
+ public void setImportance(String pkgName, int uid, int importance) {
+ getOrCreatePackagePreferences(pkgName, uid).importance = importance;
+ updateConfig();
+ }
+
+ public void setEnabled(String packageName, int uid, boolean enabled) {
+ boolean wasEnabled = getImportance(packageName, uid) != IMPORTANCE_NONE;
+ if (wasEnabled == enabled) {
+ return;
+ }
+ setImportance(packageName, uid,
+ enabled ? DEFAULT_IMPORTANCE : IMPORTANCE_NONE);
+ }
+
+ /**
+ * Sets whether any notifications from the app, represented by the given {@code pkgName} and
+ * {@code uid}, have their importance locked by the user. Locked notifications don't get
+ * considered for sentiment adjustments (and thus never show a blocking helper).
+ */
+ public void setAppImportanceLocked(String packageName, int uid) {
+ PackagePreferences PackagePreferences = getOrCreatePackagePreferences(packageName, uid);
+ if ((PackagePreferences.lockedAppFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0) {
+ return;
+ }
+
+ PackagePreferences.lockedAppFields =
+ PackagePreferences.lockedAppFields | LockableAppFields.USER_LOCKED_IMPORTANCE;
+ updateConfig();
+ }
+
+ @VisibleForTesting
+ void lockFieldsForUpdate(NotificationChannel original, NotificationChannel update) {
+ if (original.canBypassDnd() != update.canBypassDnd()) {
+ update.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
+ }
+ if (original.getLockscreenVisibility() != update.getLockscreenVisibility()) {
+ update.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY);
+ }
+ if (original.getImportance() != update.getImportance()) {
+ update.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
+ }
+ if (original.shouldShowLights() != update.shouldShowLights()
+ || original.getLightColor() != update.getLightColor()) {
+ update.lockFields(NotificationChannel.USER_LOCKED_LIGHTS);
+ }
+ if (!Objects.equals(original.getSound(), update.getSound())) {
+ update.lockFields(NotificationChannel.USER_LOCKED_SOUND);
+ }
+ if (!Arrays.equals(original.getVibrationPattern(), update.getVibrationPattern())
+ || original.shouldVibrate() != update.shouldVibrate()) {
+ update.lockFields(NotificationChannel.USER_LOCKED_VIBRATION);
+ }
+ if (original.canShowBadge() != update.canShowBadge()) {
+ update.lockFields(NotificationChannel.USER_LOCKED_SHOW_BADGE);
+ }
+ }
+
+ public void dump(PrintWriter pw, String prefix,
+ @NonNull NotificationManagerService.DumpFilter filter) {
+ pw.print(prefix);
+ pw.println("per-package config:");
+
+ pw.println("PackagePreferencess:");
+ synchronized (mPackagePreferencess) {
+ dumpPackagePreferencess(pw, prefix, filter, mPackagePreferencess);
+ }
+ pw.println("Restored without uid:");
+ dumpPackagePreferencess(pw, prefix, filter, mRestoredWithoutUids);
+ }
+
+ public void dump(ProtoOutputStream proto,
+ @NonNull NotificationManagerService.DumpFilter filter) {
+ synchronized (mPackagePreferencess) {
+ dumpPackagePreferencess(proto, RankingHelperProto.RECORDS, filter,
+ mPackagePreferencess);
+ }
+ dumpPackagePreferencess(proto, RankingHelperProto.RECORDS_RESTORED_WITHOUT_UID, filter,
+ mRestoredWithoutUids);
+ }
+
+ private static void dumpPackagePreferencess(PrintWriter pw, String prefix,
+ @NonNull NotificationManagerService.DumpFilter filter,
+ ArrayMap<String, PackagePreferences> PackagePreferencess) {
+ final int N = PackagePreferencess.size();
+ for (int i = 0; i < N; i++) {
+ final PackagePreferences r = PackagePreferencess.valueAt(i);
+ if (filter.matches(r.pkg)) {
+ pw.print(prefix);
+ pw.print(" AppSettings: ");
+ pw.print(r.pkg);
+ pw.print(" (");
+ pw.print(r.uid == PackagePreferences.UNKNOWN_UID ? "UNKNOWN_UID"
+ : Integer.toString(r.uid));
+ pw.print(')');
+ if (r.importance != DEFAULT_IMPORTANCE) {
+ pw.print(" importance=");
+ pw.print(NotificationListenerService.Ranking.importanceToString(r.importance));
+ }
+ if (r.priority != DEFAULT_PRIORITY) {
+ pw.print(" priority=");
+ pw.print(Notification.priorityToString(r.priority));
+ }
+ if (r.visibility != DEFAULT_VISIBILITY) {
+ pw.print(" visibility=");
+ pw.print(Notification.visibilityToString(r.visibility));
+ }
+ pw.print(" showBadge=");
+ pw.print(Boolean.toString(r.showBadge));
+ pw.println();
+ for (NotificationChannel channel : r.channels.values()) {
+ pw.print(prefix);
+ channel.dump(pw, " ", filter.redact);
+ }
+ for (NotificationChannelGroup group : r.groups.values()) {
+ pw.print(prefix);
+ pw.print(" ");
+ pw.print(" ");
+ pw.println(group);
+ }
+ }
+ }
+ }
+
+ private static void dumpPackagePreferencess(ProtoOutputStream proto, long fieldId,
+ @NonNull NotificationManagerService.DumpFilter filter,
+ ArrayMap<String, PackagePreferences> PackagePreferencess) {
+ final int N = PackagePreferencess.size();
+ long fToken;
+ for (int i = 0; i < N; i++) {
+ final PackagePreferences r = PackagePreferencess.valueAt(i);
+ if (filter.matches(r.pkg)) {
+ fToken = proto.start(fieldId);
+
+ proto.write(RankingHelperProto.RecordProto.PACKAGE, r.pkg);
+ proto.write(RankingHelperProto.RecordProto.UID, r.uid);
+ proto.write(RankingHelperProto.RecordProto.IMPORTANCE, r.importance);
+ proto.write(RankingHelperProto.RecordProto.PRIORITY, r.priority);
+ proto.write(RankingHelperProto.RecordProto.VISIBILITY, r.visibility);
+ proto.write(RankingHelperProto.RecordProto.SHOW_BADGE, r.showBadge);
+
+ for (NotificationChannel channel : r.channels.values()) {
+ channel.writeToProto(proto, RankingHelperProto.RecordProto.CHANNELS);
+ }
+ for (NotificationChannelGroup group : r.groups.values()) {
+ group.writeToProto(proto, RankingHelperProto.RecordProto.CHANNEL_GROUPS);
+ }
+
+ proto.end(fToken);
+ }
+ }
+ }
+
+ public JSONObject dumpJson(NotificationManagerService.DumpFilter filter) {
+ JSONObject ranking = new JSONObject();
+ JSONArray PackagePreferencess = new JSONArray();
+ try {
+ ranking.put("noUid", mRestoredWithoutUids.size());
+ } catch (JSONException e) {
+ // pass
+ }
+ synchronized (mPackagePreferencess) {
+ final int N = mPackagePreferencess.size();
+ for (int i = 0; i < N; i++) {
+ final PackagePreferences r = mPackagePreferencess.valueAt(i);
+ if (filter == null || filter.matches(r.pkg)) {
+ JSONObject PackagePreferences = new JSONObject();
+ try {
+ PackagePreferences.put("userId", UserHandle.getUserId(r.uid));
+ PackagePreferences.put("packageName", r.pkg);
+ if (r.importance != DEFAULT_IMPORTANCE) {
+ PackagePreferences.put("importance",
+ NotificationListenerService.Ranking.importanceToString(
+ r.importance));
+ }
+ if (r.priority != DEFAULT_PRIORITY) {
+ PackagePreferences.put("priority",
+ Notification.priorityToString(r.priority));
+ }
+ if (r.visibility != DEFAULT_VISIBILITY) {
+ PackagePreferences.put("visibility",
+ Notification.visibilityToString(r.visibility));
+ }
+ if (r.showBadge != DEFAULT_SHOW_BADGE) {
+ PackagePreferences.put("showBadge", Boolean.valueOf(r.showBadge));
+ }
+ JSONArray channels = new JSONArray();
+ for (NotificationChannel channel : r.channels.values()) {
+ channels.put(channel.toJson());
+ }
+ PackagePreferences.put("channels", channels);
+ JSONArray groups = new JSONArray();
+ for (NotificationChannelGroup group : r.groups.values()) {
+ groups.put(group.toJson());
+ }
+ PackagePreferences.put("groups", groups);
+ } catch (JSONException e) {
+ // pass
+ }
+ PackagePreferencess.put(PackagePreferences);
+ }
+ }
+ }
+ try {
+ ranking.put("PackagePreferencess", PackagePreferencess);
+ } catch (JSONException e) {
+ // pass
+ }
+ return ranking;
+ }
+
+ /**
+ * Dump only the ban information as structured JSON for the stats collector.
+ *
+ * This is intentionally redundant with {#link dumpJson} because the old
+ * scraper will expect this format.
+ *
+ * @param filter
+ * @return
+ */
+ public JSONArray dumpBansJson(NotificationManagerService.DumpFilter filter) {
+ JSONArray bans = new JSONArray();
+ Map<Integer, String> packageBans = getPackageBans();
+ for (Map.Entry<Integer, String> ban : packageBans.entrySet()) {
+ final int userId = UserHandle.getUserId(ban.getKey());
+ final String packageName = ban.getValue();
+ if (filter == null || filter.matches(packageName)) {
+ JSONObject banJson = new JSONObject();
+ try {
+ banJson.put("userId", userId);
+ banJson.put("packageName", packageName);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ bans.put(banJson);
+ }
+ }
+ return bans;
+ }
+
+ public Map<Integer, String> getPackageBans() {
+ synchronized (mPackagePreferencess) {
+ final int N = mPackagePreferencess.size();
+ ArrayMap<Integer, String> packageBans = new ArrayMap<>(N);
+ for (int i = 0; i < N; i++) {
+ final PackagePreferences r = mPackagePreferencess.valueAt(i);
+ if (r.importance == IMPORTANCE_NONE) {
+ packageBans.put(r.uid, r.pkg);
+ }
+ }
+
+ return packageBans;
+ }
+ }
+
+ /**
+ * Dump only the channel information as structured JSON for the stats collector.
+ *
+ * This is intentionally redundant with {#link dumpJson} because the old
+ * scraper will expect this format.
+ *
+ * @param filter
+ * @return
+ */
+ public JSONArray dumpChannelsJson(NotificationManagerService.DumpFilter filter) {
+ JSONArray channels = new JSONArray();
+ Map<String, Integer> packageChannels = getPackageChannels();
+ for (Map.Entry<String, Integer> channelCount : packageChannels.entrySet()) {
+ final String packageName = channelCount.getKey();
+ if (filter == null || filter.matches(packageName)) {
+ JSONObject channelCountJson = new JSONObject();
+ try {
+ channelCountJson.put("packageName", packageName);
+ channelCountJson.put("channelCount", channelCount.getValue());
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ channels.put(channelCountJson);
+ }
+ }
+ return channels;
+ }
+
+ private Map<String, Integer> getPackageChannels() {
+ ArrayMap<String, Integer> packageChannels = new ArrayMap<>();
+ synchronized (mPackagePreferencess) {
+ for (int i = 0; i < mPackagePreferencess.size(); i++) {
+ final PackagePreferences r = mPackagePreferencess.valueAt(i);
+ int channelCount = 0;
+ for (int j = 0; j < r.channels.size(); j++) {
+ if (!r.channels.valueAt(j).isDeleted()) {
+ channelCount++;
+ }
+ }
+ packageChannels.put(r.pkg, channelCount);
+ }
+ }
+ return packageChannels;
+ }
+
+ public void onUserRemoved(int userId) {
+ synchronized (mPackagePreferencess) {
+ int N = mPackagePreferencess.size();
+ for (int i = N - 1; i >= 0; i--) {
+ PackagePreferences PackagePreferences = mPackagePreferencess.valueAt(i);
+ if (UserHandle.getUserId(PackagePreferences.uid) == userId) {
+ mPackagePreferencess.removeAt(i);
+ }
+ }
+ }
+ }
+
+ protected void onLocaleChanged(Context context, int userId) {
+ synchronized (mPackagePreferencess) {
+ int N = mPackagePreferencess.size();
+ for (int i = 0; i < N; i++) {
+ PackagePreferences PackagePreferences = mPackagePreferencess.valueAt(i);
+ if (UserHandle.getUserId(PackagePreferences.uid) == userId) {
+ if (PackagePreferences.channels.containsKey(
+ NotificationChannel.DEFAULT_CHANNEL_ID)) {
+ PackagePreferences.channels.get(
+ NotificationChannel.DEFAULT_CHANNEL_ID).setName(
+ context.getResources().getString(
+ R.string.default_notification_channel_label));
+ }
+ }
+ }
+ }
+ }
+
+ public void onPackagesChanged(boolean removingPackage, int changeUserId, String[] pkgList,
+ int[] uidList) {
+ if (pkgList == null || pkgList.length == 0) {
+ return; // nothing to do
+ }
+ boolean updated = false;
+ if (removingPackage) {
+ // Remove notification settings for uninstalled package
+ int size = Math.min(pkgList.length, uidList.length);
+ for (int i = 0; i < size; i++) {
+ final String pkg = pkgList[i];
+ final int uid = uidList[i];
+ synchronized (mPackagePreferencess) {
+ mPackagePreferencess.remove(packagePreferencesKey(pkg, uid));
+ }
+ mRestoredWithoutUids.remove(pkg);
+ updated = true;
+ }
+ } else {
+ for (String pkg : pkgList) {
+ // Package install
+ final PackagePreferences r = mRestoredWithoutUids.get(pkg);
+ if (r != null) {
+ try {
+ r.uid = mPm.getPackageUidAsUser(r.pkg, changeUserId);
+ mRestoredWithoutUids.remove(pkg);
+ synchronized (mPackagePreferencess) {
+ mPackagePreferencess.put(packagePreferencesKey(r.pkg, r.uid), r);
+ }
+ updated = true;
+ } catch (PackageManager.NameNotFoundException e) {
+ // noop
+ }
+ }
+ // Package upgrade
+ try {
+ PackagePreferences fullPackagePreferences = getPackagePreferences(pkg,
+ mPm.getPackageUidAsUser(pkg, changeUserId));
+ if (fullPackagePreferences != null) {
+ createDefaultChannelIfNeeded(fullPackagePreferences);
+ deleteDefaultChannelIfNeeded(fullPackagePreferences);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+ }
+
+ if (updated) {
+ updateConfig();
+ }
+ }
+
+ private LogMaker getChannelLog(NotificationChannel channel, String pkg) {
+ return new LogMaker(
+ com.android.internal.logging.nano.MetricsProto.MetricsEvent
+ .ACTION_NOTIFICATION_CHANNEL)
+ .setType(com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_UPDATE)
+ .setPackageName(pkg)
+ .addTaggedData(
+ com.android.internal.logging.nano.MetricsProto.MetricsEvent
+ .FIELD_NOTIFICATION_CHANNEL_ID,
+ channel.getId())
+ .addTaggedData(
+ com.android.internal.logging.nano.MetricsProto.MetricsEvent
+ .FIELD_NOTIFICATION_CHANNEL_IMPORTANCE,
+ channel.getImportance());
+ }
+
+ private LogMaker getChannelGroupLog(String groupId, String pkg) {
+ return new LogMaker(
+ com.android.internal.logging.nano.MetricsProto.MetricsEvent
+ .ACTION_NOTIFICATION_CHANNEL_GROUP)
+ .setType(com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_UPDATE)
+ .addTaggedData(
+ com.android.internal.logging.nano.MetricsProto.MetricsEvent
+ .FIELD_NOTIFICATION_CHANNEL_GROUP_ID,
+ groupId)
+ .setPackageName(pkg);
+ }
+
+
+ public void updateBadgingEnabled() {
+ if (mBadgingEnabled == null) {
+ mBadgingEnabled = new SparseBooleanArray();
+ }
+ boolean changed = false;
+ // update the cached values
+ for (int index = 0; index < mBadgingEnabled.size(); index++) {
+ int userId = mBadgingEnabled.keyAt(index);
+ final boolean oldValue = mBadgingEnabled.get(userId);
+ final boolean newValue = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.NOTIFICATION_BADGING,
+ DEFAULT_SHOW_BADGE ? 1 : 0, userId) != 0;
+ mBadgingEnabled.put(userId, newValue);
+ changed |= oldValue != newValue;
+ }
+ if (changed) {
+ updateConfig();
+ }
+ }
+
+ public boolean badgingEnabled(UserHandle userHandle) {
+ int userId = userHandle.getIdentifier();
+ if (userId == UserHandle.USER_ALL) {
+ return false;
+ }
+ if (mBadgingEnabled.indexOfKey(userId) < 0) {
+ mBadgingEnabled.put(userId,
+ Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.NOTIFICATION_BADGING,
+ DEFAULT_SHOW_BADGE ? 1 : 0, userId) != 0);
+ }
+ return mBadgingEnabled.get(userId, DEFAULT_SHOW_BADGE);
+ }
+
+ private void updateConfig() {
+ mRankingHandler.requestSort();
+ }
+
+ private static String packagePreferencesKey(String pkg, int uid) {
+ return pkg + "|" + uid;
+ }
+
+ private static class PackagePreferences {
+ static int UNKNOWN_UID = UserHandle.USER_NULL;
+
+ String pkg;
+ int uid = UNKNOWN_UID;
+ int importance = DEFAULT_IMPORTANCE;
+ int priority = DEFAULT_PRIORITY;
+ int visibility = DEFAULT_VISIBILITY;
+ boolean showBadge = DEFAULT_SHOW_BADGE;
+ int lockedAppFields = DEFAULT_LOCKED_APP_FIELDS;
+
+ ArrayMap<String, NotificationChannel> channels = new ArrayMap<>();
+ Map<String, NotificationChannelGroup> groups = new ConcurrentHashMap<>();
+ }
+}
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 61b5415ec7a3..f5e58ea9b27b 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -15,123 +15,37 @@
*/
package com.android.server.notification;
-import static android.app.NotificationManager.IMPORTANCE_NONE;
-
-import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ParceledListSlice;
-import android.metrics.LogMaker;
-import android.os.Build;
-import android.os.UserHandle;
-import android.provider.Settings.Secure;
-import android.service.notification.NotificationListenerService.Ranking;
import android.service.notification.RankingHelperProto;
-import android.service.notification.RankingHelperProto.RecordProto;
-import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Slog;
-import android.util.SparseBooleanArray;
import android.util.proto.ProtoOutputStream;
-import com.android.internal.R;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.internal.util.Preconditions;
-import com.android.internal.util.XmlUtils;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-public class RankingHelper implements RankingConfig {
+public class RankingHelper {
private static final String TAG = "RankingHelper";
- private static final int XML_VERSION = 1;
-
- static final String TAG_RANKING = "ranking";
- private static final String TAG_PACKAGE = "package";
- private static final String TAG_CHANNEL = "channel";
- private static final String TAG_GROUP = "channelGroup";
-
- private static final String ATT_VERSION = "version";
- private static final String ATT_NAME = "name";
- private static final String ATT_UID = "uid";
- private static final String ATT_ID = "id";
- private static final String ATT_PRIORITY = "priority";
- private static final String ATT_VISIBILITY = "visibility";
- private static final String ATT_IMPORTANCE = "importance";
- private static final String ATT_SHOW_BADGE = "show_badge";
- private static final String ATT_APP_USER_LOCKED_FIELDS = "app_user_locked_fields";
-
- private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT;
- private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE;
- private static final int DEFAULT_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED;
- private static final boolean DEFAULT_SHOW_BADGE = true;
- /**
- * Default value for what fields are user locked. See {@link LockableAppFields} for all lockable
- * fields.
- */
- private static final int DEFAULT_LOCKED_APP_FIELDS = 0;
-
- /**
- * All user-lockable fields for a given application.
- */
- @IntDef({LockableAppFields.USER_LOCKED_IMPORTANCE})
- public @interface LockableAppFields {
- int USER_LOCKED_IMPORTANCE = 0x00000001;
- }
-
private final NotificationSignalExtractor[] mSignalExtractors;
private final NotificationComparator mPreliminaryComparator;
private final GlobalSortKeyComparator mFinalComparator = new GlobalSortKeyComparator();
- private final ArrayMap<String, Record> mRecords = new ArrayMap<>(); // pkg|uid => Record
private final ArrayMap<String, NotificationRecord> mProxyByGroupTmp = new ArrayMap<>();
- private final ArrayMap<String, Record> mRestoredWithoutUids = new ArrayMap<>(); // pkg => Record
private final Context mContext;
private final RankingHandler mRankingHandler;
- private final PackageManager mPm;
- private SparseBooleanArray mBadgingEnabled;
- private boolean mAreChannelsBypassingDnd;
- private ZenModeHelper mZenModeHelper;
- public RankingHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
+ public RankingHelper(Context context, RankingHandler rankingHandler, RankingConfig config,
ZenModeHelper zenHelper, NotificationUsageStats usageStats, String[] extractorNames) {
mContext = context;
mRankingHandler = rankingHandler;
- mPm = pm;
- mZenModeHelper= zenHelper;
-
mPreliminaryComparator = new NotificationComparator(mContext);
- updateBadgingEnabled();
-
final int N = extractorNames.length;
mSignalExtractors = new NotificationSignalExtractor[N];
for (int i = 0; i < N; i++) {
@@ -140,7 +54,7 @@ public class RankingHelper implements RankingConfig {
NotificationSignalExtractor extractor =
(NotificationSignalExtractor) extractorClass.newInstance();
extractor.initialize(mContext, usageStats);
- extractor.setConfig(this);
+ extractor.setConfig(config);
extractor.setZenHelper(zenHelper);
mSignalExtractors[i] = extractor;
} catch (ClassNotFoundException e) {
@@ -151,10 +65,6 @@ public class RankingHelper implements RankingConfig {
Slog.w(TAG, "Problem accessing extractor " + extractorNames[i] + ".", e);
}
}
-
- mAreChannelsBypassingDnd = (mZenModeHelper.getNotificationPolicy().state &
- NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND) == 1;
- updateChannelsBypassingDnd();
}
@SuppressWarnings("unchecked")
@@ -184,279 +94,6 @@ public class RankingHelper implements RankingConfig {
}
}
- public void readXml(XmlPullParser parser, boolean forRestore)
- throws XmlPullParserException, IOException {
- int type = parser.getEventType();
- if (type != XmlPullParser.START_TAG) return;
- String tag = parser.getName();
- if (!TAG_RANKING.equals(tag)) return;
- // Clobber groups and channels with the xml, but don't delete other data that wasn't present
- // at the time of serialization.
- mRestoredWithoutUids.clear();
- while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
- tag = parser.getName();
- if (type == XmlPullParser.END_TAG && TAG_RANKING.equals(tag)) {
- return;
- }
- if (type == XmlPullParser.START_TAG) {
- if (TAG_PACKAGE.equals(tag)) {
- int uid = XmlUtils.readIntAttribute(parser, ATT_UID, Record.UNKNOWN_UID);
- String name = parser.getAttributeValue(null, ATT_NAME);
- if (!TextUtils.isEmpty(name)) {
- if (forRestore) {
- try {
- //TODO: http://b/22388012
- uid = mPm.getPackageUidAsUser(name, UserHandle.USER_SYSTEM);
- } catch (NameNotFoundException e) {
- // noop
- }
- }
-
- Record r = getOrCreateRecord(name, uid,
- XmlUtils.readIntAttribute(
- parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE),
- XmlUtils.readIntAttribute(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
- XmlUtils.readIntAttribute(
- parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
- XmlUtils.readBooleanAttribute(
- parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
- r.importance = XmlUtils.readIntAttribute(
- parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
- r.priority = XmlUtils.readIntAttribute(
- parser, ATT_PRIORITY, DEFAULT_PRIORITY);
- r.visibility = XmlUtils.readIntAttribute(
- parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
- r.showBadge = XmlUtils.readBooleanAttribute(
- parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
- r.lockedAppFields = XmlUtils.readIntAttribute(parser,
- ATT_APP_USER_LOCKED_FIELDS, DEFAULT_LOCKED_APP_FIELDS);
-
- final int innerDepth = parser.getDepth();
- while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
- && (type != XmlPullParser.END_TAG
- || parser.getDepth() > innerDepth)) {
- if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
- continue;
- }
-
- String tagName = parser.getName();
- // Channel groups
- if (TAG_GROUP.equals(tagName)) {
- String id = parser.getAttributeValue(null, ATT_ID);
- CharSequence groupName = parser.getAttributeValue(null, ATT_NAME);
- if (!TextUtils.isEmpty(id)) {
- NotificationChannelGroup group
- = new NotificationChannelGroup(id, groupName);
- group.populateFromXml(parser);
- r.groups.put(id, group);
- }
- }
- // Channels
- if (TAG_CHANNEL.equals(tagName)) {
- String id = parser.getAttributeValue(null, ATT_ID);
- String channelName = parser.getAttributeValue(null, ATT_NAME);
- int channelImportance = XmlUtils.readIntAttribute(
- parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
- if (!TextUtils.isEmpty(id) && !TextUtils.isEmpty(channelName)) {
- NotificationChannel channel = new NotificationChannel(id,
- channelName, channelImportance);
- if (forRestore) {
- channel.populateFromXmlForRestore(parser, mContext);
- } else {
- channel.populateFromXml(parser);
- }
- r.channels.put(id, channel);
- }
- }
- }
-
- try {
- deleteDefaultChannelIfNeeded(r);
- } catch (NameNotFoundException e) {
- Slog.e(TAG, "deleteDefaultChannelIfNeeded - Exception: " + e);
- }
- }
- }
- }
- }
- throw new IllegalStateException("Failed to reach END_DOCUMENT");
- }
-
- private static String recordKey(String pkg, int uid) {
- return pkg + "|" + uid;
- }
-
- private Record getRecord(String pkg, int uid) {
- final String key = recordKey(pkg, uid);
- synchronized (mRecords) {
- return mRecords.get(key);
- }
- }
-
- private Record getOrCreateRecord(String pkg, int uid) {
- return getOrCreateRecord(pkg, uid,
- DEFAULT_IMPORTANCE, DEFAULT_PRIORITY, DEFAULT_VISIBILITY, DEFAULT_SHOW_BADGE);
- }
-
- private Record getOrCreateRecord(String pkg, int uid, int importance, int priority,
- int visibility, boolean showBadge) {
- final String key = recordKey(pkg, uid);
- synchronized (mRecords) {
- Record r = (uid == Record.UNKNOWN_UID) ? mRestoredWithoutUids.get(pkg) : mRecords.get(
- key);
- if (r == null) {
- r = new Record();
- r.pkg = pkg;
- r.uid = uid;
- r.importance = importance;
- r.priority = priority;
- r.visibility = visibility;
- r.showBadge = showBadge;
-
- try {
- createDefaultChannelIfNeeded(r);
- } catch (NameNotFoundException e) {
- Slog.e(TAG, "createDefaultChannelIfNeeded - Exception: " + e);
- }
-
- if (r.uid == Record.UNKNOWN_UID) {
- mRestoredWithoutUids.put(pkg, r);
- } else {
- mRecords.put(key, r);
- }
- }
- return r;
- }
- }
-
- private boolean shouldHaveDefaultChannel(Record r) throws NameNotFoundException {
- final int userId = UserHandle.getUserId(r.uid);
- final ApplicationInfo applicationInfo = mPm.getApplicationInfoAsUser(r.pkg, 0, userId);
- if (applicationInfo.targetSdkVersion >= Build.VERSION_CODES.O) {
- // O apps should not have the default channel.
- return false;
- }
-
- // Otherwise, this app should have the default channel.
- return true;
- }
-
- private void deleteDefaultChannelIfNeeded(Record r) throws NameNotFoundException {
- if (!r.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
- // Not present
- return;
- }
-
- if (shouldHaveDefaultChannel(r)) {
- // Keep the default channel until upgraded.
- return;
- }
-
- // Remove Default Channel.
- r.channels.remove(NotificationChannel.DEFAULT_CHANNEL_ID);
- }
-
- private void createDefaultChannelIfNeeded(Record r) throws NameNotFoundException {
- if (r.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
- r.channels.get(NotificationChannel.DEFAULT_CHANNEL_ID).setName(
- mContext.getString(R.string.default_notification_channel_label));
- return;
- }
-
- if (!shouldHaveDefaultChannel(r)) {
- // Keep the default channel until upgraded.
- return;
- }
-
- // Create Default Channel
- NotificationChannel channel;
- channel = new NotificationChannel(
- NotificationChannel.DEFAULT_CHANNEL_ID,
- mContext.getString(R.string.default_notification_channel_label),
- r.importance);
- channel.setBypassDnd(r.priority == Notification.PRIORITY_MAX);
- channel.setLockscreenVisibility(r.visibility);
- if (r.importance != NotificationManager.IMPORTANCE_UNSPECIFIED) {
- channel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
- }
- if (r.priority != DEFAULT_PRIORITY) {
- channel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
- }
- if (r.visibility != DEFAULT_VISIBILITY) {
- channel.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY);
- }
- r.channels.put(channel.getId(), channel);
- }
-
- public void writeXml(XmlSerializer out, boolean forBackup) throws IOException {
- out.startTag(null, TAG_RANKING);
- out.attribute(null, ATT_VERSION, Integer.toString(XML_VERSION));
-
- synchronized (mRecords) {
- final int N = mRecords.size();
- for (int i = 0; i < N; i++) {
- final Record r = mRecords.valueAt(i);
- //TODO: http://b/22388012
- if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) {
- continue;
- }
- final boolean hasNonDefaultSettings =
- r.importance != DEFAULT_IMPORTANCE
- || r.priority != DEFAULT_PRIORITY
- || r.visibility != DEFAULT_VISIBILITY
- || r.showBadge != DEFAULT_SHOW_BADGE
- || r.lockedAppFields != DEFAULT_LOCKED_APP_FIELDS
- || r.channels.size() > 0
- || r.groups.size() > 0;
- if (hasNonDefaultSettings) {
- out.startTag(null, TAG_PACKAGE);
- out.attribute(null, ATT_NAME, r.pkg);
- if (r.importance != DEFAULT_IMPORTANCE) {
- out.attribute(null, ATT_IMPORTANCE, Integer.toString(r.importance));
- }
- if (r.priority != DEFAULT_PRIORITY) {
- out.attribute(null, ATT_PRIORITY, Integer.toString(r.priority));
- }
- if (r.visibility != DEFAULT_VISIBILITY) {
- out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility));
- }
- out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge));
- out.attribute(null, ATT_APP_USER_LOCKED_FIELDS,
- Integer.toString(r.lockedAppFields));
-
- if (!forBackup) {
- out.attribute(null, ATT_UID, Integer.toString(r.uid));
- }
-
- for (NotificationChannelGroup group : r.groups.values()) {
- group.writeXml(out);
- }
-
- for (NotificationChannel channel : r.channels.values()) {
- if (forBackup) {
- if (!channel.isDeleted()) {
- channel.writeXmlForBackup(out, mContext);
- }
- } else {
- channel.writeXml(out);
- }
- }
-
- out.endTag(null, TAG_PACKAGE);
- }
- }
- }
- out.endTag(null, TAG_RANKING);
- }
-
- private void updateConfig() {
- final int N = mSignalExtractors.length;
- for (int i = 0; i < N; i++) {
- mSignalExtractors[i].setConfig(this);
- }
- mRankingHandler.requestSort();
- }
-
public void sort(ArrayList<NotificationRecord> notificationList) {
final int N = notificationList.size();
// clear global sort keys
@@ -521,562 +158,6 @@ public class RankingHelper implements RankingConfig {
return Collections.binarySearch(notificationList, target, mFinalComparator);
}
- /**
- * Gets importance.
- */
- @Override
- public int getImportance(String packageName, int uid) {
- return getOrCreateRecord(packageName, uid).importance;
- }
-
-
- /**
- * Returns whether the importance of the corresponding notification is user-locked and shouldn't
- * be adjusted by an assistant (via means of a blocking helper, for example). For the channel
- * locking field, see {@link NotificationChannel#USER_LOCKED_IMPORTANCE}.
- */
- public boolean getIsAppImportanceLocked(String packageName, int uid) {
- int userLockedFields = getOrCreateRecord(packageName, uid).lockedAppFields;
- return (userLockedFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0;
- }
-
- @Override
- public boolean canShowBadge(String packageName, int uid) {
- return getOrCreateRecord(packageName, uid).showBadge;
- }
-
- @Override
- public void setShowBadge(String packageName, int uid, boolean showBadge) {
- getOrCreateRecord(packageName, uid).showBadge = showBadge;
- updateConfig();
- }
-
- @Override
- public boolean isGroupBlocked(String packageName, int uid, String groupId) {
- if (groupId == null) {
- return false;
- }
- Record r = getOrCreateRecord(packageName, uid);
- NotificationChannelGroup group = r.groups.get(groupId);
- if (group == null) {
- return false;
- }
- return group.isBlocked();
- }
-
- int getPackagePriority(String pkg, int uid) {
- return getOrCreateRecord(pkg, uid).priority;
- }
-
- int getPackageVisibility(String pkg, int uid) {
- return getOrCreateRecord(pkg, uid).visibility;
- }
-
- @Override
- public void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group,
- boolean fromTargetApp) {
- Preconditions.checkNotNull(pkg);
- Preconditions.checkNotNull(group);
- Preconditions.checkNotNull(group.getId());
- Preconditions.checkNotNull(!TextUtils.isEmpty(group.getName()));
- Record r = getOrCreateRecord(pkg, uid);
- if (r == null) {
- throw new IllegalArgumentException("Invalid package");
- }
- final NotificationChannelGroup oldGroup = r.groups.get(group.getId());
- if (!group.equals(oldGroup)) {
- // will log for new entries as well as name/description changes
- MetricsLogger.action(getChannelGroupLog(group.getId(), pkg));
- }
- if (oldGroup != null) {
- group.setChannels(oldGroup.getChannels());
-
- if (fromTargetApp) {
- group.setBlocked(oldGroup.isBlocked());
- }
- }
- r.groups.put(group.getId(), group);
- }
-
- @Override
- public void createNotificationChannel(String pkg, int uid, NotificationChannel channel,
- boolean fromTargetApp, boolean hasDndAccess) {
- Preconditions.checkNotNull(pkg);
- Preconditions.checkNotNull(channel);
- Preconditions.checkNotNull(channel.getId());
- Preconditions.checkArgument(!TextUtils.isEmpty(channel.getName()));
- Record r = getOrCreateRecord(pkg, uid);
- if (r == null) {
- throw new IllegalArgumentException("Invalid package");
- }
- if (channel.getGroup() != null && !r.groups.containsKey(channel.getGroup())) {
- throw new IllegalArgumentException("NotificationChannelGroup doesn't exist");
- }
- if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(channel.getId())) {
- throw new IllegalArgumentException("Reserved id");
- }
- NotificationChannel existing = r.channels.get(channel.getId());
- // Keep most of the existing settings
- if (existing != null && fromTargetApp) {
- if (existing.isDeleted()) {
- existing.setDeleted(false);
-
- // log a resurrected channel as if it's new again
- MetricsLogger.action(getChannelLog(channel, pkg).setType(
- MetricsProto.MetricsEvent.TYPE_OPEN));
- }
-
- existing.setName(channel.getName().toString());
- existing.setDescription(channel.getDescription());
- existing.setBlockableSystem(channel.isBlockableSystem());
- if (existing.getGroup() == null) {
- existing.setGroup(channel.getGroup());
- }
-
- // Apps are allowed to downgrade channel importance if the user has not changed any
- // fields on this channel yet.
- if (existing.getUserLockedFields() == 0 &&
- channel.getImportance() < existing.getImportance()) {
- existing.setImportance(channel.getImportance());
- }
-
- // system apps and dnd access apps can bypass dnd if the user hasn't changed any
- // fields on the channel yet
- if (existing.getUserLockedFields() == 0 && hasDndAccess) {
- boolean bypassDnd = channel.canBypassDnd();
- existing.setBypassDnd(bypassDnd);
-
- if (bypassDnd != mAreChannelsBypassingDnd) {
- updateChannelsBypassingDnd();
- }
- }
-
- updateConfig();
- return;
- }
- if (channel.getImportance() < IMPORTANCE_NONE
- || channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
- throw new IllegalArgumentException("Invalid importance level");
- }
-
- // Reset fields that apps aren't allowed to set.
- if (fromTargetApp && !hasDndAccess) {
- channel.setBypassDnd(r.priority == Notification.PRIORITY_MAX);
- }
- if (fromTargetApp) {
- channel.setLockscreenVisibility(r.visibility);
- }
- clearLockedFields(channel);
- if (channel.getLockscreenVisibility() == Notification.VISIBILITY_PUBLIC) {
- channel.setLockscreenVisibility(Ranking.VISIBILITY_NO_OVERRIDE);
- }
- if (!r.showBadge) {
- channel.setShowBadge(false);
- }
-
- r.channels.put(channel.getId(), channel);
- if (channel.canBypassDnd() != mAreChannelsBypassingDnd) {
- updateChannelsBypassingDnd();
- }
- MetricsLogger.action(getChannelLog(channel, pkg).setType(
- MetricsProto.MetricsEvent.TYPE_OPEN));
- }
-
- void clearLockedFields(NotificationChannel channel) {
- channel.unlockFields(channel.getUserLockedFields());
- }
-
- @Override
- public void updateNotificationChannel(String pkg, int uid, NotificationChannel updatedChannel,
- boolean fromUser) {
- Preconditions.checkNotNull(updatedChannel);
- Preconditions.checkNotNull(updatedChannel.getId());
- Record r = getOrCreateRecord(pkg, uid);
- if (r == null) {
- throw new IllegalArgumentException("Invalid package");
- }
- NotificationChannel channel = r.channels.get(updatedChannel.getId());
- if (channel == null || channel.isDeleted()) {
- throw new IllegalArgumentException("Channel does not exist");
- }
- if (updatedChannel.getLockscreenVisibility() == Notification.VISIBILITY_PUBLIC) {
- updatedChannel.setLockscreenVisibility(Ranking.VISIBILITY_NO_OVERRIDE);
- }
- if (!fromUser) {
- updatedChannel.unlockFields(updatedChannel.getUserLockedFields());
- }
- if (fromUser) {
- updatedChannel.lockFields(channel.getUserLockedFields());
- lockFieldsForUpdate(channel, updatedChannel);
- }
- r.channels.put(updatedChannel.getId(), updatedChannel);
-
- if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(updatedChannel.getId())) {
- // copy settings to app level so they are inherited by new channels
- // when the app migrates
- r.importance = updatedChannel.getImportance();
- r.priority = updatedChannel.canBypassDnd()
- ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT;
- r.visibility = updatedChannel.getLockscreenVisibility();
- r.showBadge = updatedChannel.canShowBadge();
- }
-
- if (!channel.equals(updatedChannel)) {
- // only log if there are real changes
- MetricsLogger.action(getChannelLog(updatedChannel, pkg));
- }
-
- if (updatedChannel.canBypassDnd() != mAreChannelsBypassingDnd) {
- updateChannelsBypassingDnd();
- }
- updateConfig();
- }
-
- @Override
- public NotificationChannel getNotificationChannel(String pkg, int uid, String channelId,
- boolean includeDeleted) {
- Preconditions.checkNotNull(pkg);
- Record r = getOrCreateRecord(pkg, uid);
- if (r == null) {
- return null;
- }
- if (channelId == null) {
- channelId = NotificationChannel.DEFAULT_CHANNEL_ID;
- }
- final NotificationChannel nc = r.channels.get(channelId);
- if (nc != null && (includeDeleted || !nc.isDeleted())) {
- return nc;
- }
- return null;
- }
-
- @Override
- public void deleteNotificationChannel(String pkg, int uid, String channelId) {
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return;
- }
- NotificationChannel channel = r.channels.get(channelId);
- if (channel != null) {
- channel.setDeleted(true);
- LogMaker lm = getChannelLog(channel, pkg);
- lm.setType(MetricsProto.MetricsEvent.TYPE_CLOSE);
- MetricsLogger.action(lm);
-
- if (mAreChannelsBypassingDnd && channel.canBypassDnd()) {
- updateChannelsBypassingDnd();
- }
- }
- }
-
- @Override
- @VisibleForTesting
- public void permanentlyDeleteNotificationChannel(String pkg, int uid, String channelId) {
- Preconditions.checkNotNull(pkg);
- Preconditions.checkNotNull(channelId);
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return;
- }
- r.channels.remove(channelId);
- }
-
- @Override
- public void permanentlyDeleteNotificationChannels(String pkg, int uid) {
- Preconditions.checkNotNull(pkg);
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return;
- }
- int N = r.channels.size() - 1;
- for (int i = N; i >= 0; i--) {
- String key = r.channels.keyAt(i);
- if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(key)) {
- r.channels.remove(key);
- }
- }
- }
-
- public NotificationChannelGroup getNotificationChannelGroupWithChannels(String pkg,
- int uid, String groupId, boolean includeDeleted) {
- Preconditions.checkNotNull(pkg);
- Record r = getRecord(pkg, uid);
- if (r == null || groupId == null || !r.groups.containsKey(groupId)) {
- return null;
- }
- NotificationChannelGroup group = r.groups.get(groupId).clone();
- group.setChannels(new ArrayList<>());
- int N = r.channels.size();
- for (int i = 0; i < N; i++) {
- final NotificationChannel nc = r.channels.valueAt(i);
- if (includeDeleted || !nc.isDeleted()) {
- if (groupId.equals(nc.getGroup())) {
- group.addChannel(nc);
- }
- }
- }
- return group;
- }
-
- public NotificationChannelGroup getNotificationChannelGroup(String groupId, String pkg,
- int uid) {
- Preconditions.checkNotNull(pkg);
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return null;
- }
- return r.groups.get(groupId);
- }
-
- @Override
- public ParceledListSlice<NotificationChannelGroup> getNotificationChannelGroups(String pkg,
- int uid, boolean includeDeleted, boolean includeNonGrouped) {
- Preconditions.checkNotNull(pkg);
- Map<String, NotificationChannelGroup> groups = new ArrayMap<>();
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return ParceledListSlice.emptyList();
- }
- NotificationChannelGroup nonGrouped = new NotificationChannelGroup(null, null);
- int N = r.channels.size();
- for (int i = 0; i < N; i++) {
- final NotificationChannel nc = r.channels.valueAt(i);
- if (includeDeleted || !nc.isDeleted()) {
- if (nc.getGroup() != null) {
- if (r.groups.get(nc.getGroup()) != null) {
- NotificationChannelGroup ncg = groups.get(nc.getGroup());
- if (ncg == null) {
- ncg = r.groups.get(nc.getGroup()).clone();
- ncg.setChannels(new ArrayList<>());
- groups.put(nc.getGroup(), ncg);
-
- }
- ncg.addChannel(nc);
- }
- } else {
- nonGrouped.addChannel(nc);
- }
- }
- }
- if (includeNonGrouped && nonGrouped.getChannels().size() > 0) {
- groups.put(null, nonGrouped);
- }
- return new ParceledListSlice<>(new ArrayList<>(groups.values()));
- }
-
- public List<NotificationChannel> deleteNotificationChannelGroup(String pkg, int uid,
- String groupId) {
- List<NotificationChannel> deletedChannels = new ArrayList<>();
- Record r = getRecord(pkg, uid);
- if (r == null || TextUtils.isEmpty(groupId)) {
- return deletedChannels;
- }
-
- r.groups.remove(groupId);
-
- int N = r.channels.size();
- for (int i = 0; i < N; i++) {
- final NotificationChannel nc = r.channels.valueAt(i);
- if (groupId.equals(nc.getGroup())) {
- nc.setDeleted(true);
- deletedChannels.add(nc);
- }
- }
- return deletedChannels;
- }
-
- @Override
- public Collection<NotificationChannelGroup> getNotificationChannelGroups(String pkg,
- int uid) {
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return new ArrayList<>();
- }
- return r.groups.values();
- }
-
- @Override
- public ParceledListSlice<NotificationChannel> getNotificationChannels(String pkg, int uid,
- boolean includeDeleted) {
- Preconditions.checkNotNull(pkg);
- List<NotificationChannel> channels = new ArrayList<>();
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return ParceledListSlice.emptyList();
- }
- int N = r.channels.size();
- for (int i = 0; i < N; i++) {
- final NotificationChannel nc = r.channels.valueAt(i);
- if (includeDeleted || !nc.isDeleted()) {
- channels.add(nc);
- }
- }
- return new ParceledListSlice<>(channels);
- }
-
- /**
- * True for pre-O apps that only have the default channel, or pre O apps that have no
- * channels yet. This method will create the default channel for pre-O apps that don't have it.
- * Should never be true for O+ targeting apps, but that's enforced on boot/when an app
- * upgrades.
- */
- public boolean onlyHasDefaultChannel(String pkg, int uid) {
- Record r = getOrCreateRecord(pkg, uid);
- if (r.channels.size() == 1
- && r.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
- return true;
- }
- return false;
- }
-
- public int getDeletedChannelCount(String pkg, int uid) {
- Preconditions.checkNotNull(pkg);
- int deletedCount = 0;
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return deletedCount;
- }
- int N = r.channels.size();
- for (int i = 0; i < N; i++) {
- final NotificationChannel nc = r.channels.valueAt(i);
- if (nc.isDeleted()) {
- deletedCount++;
- }
- }
- return deletedCount;
- }
-
- public int getBlockedChannelCount(String pkg, int uid) {
- Preconditions.checkNotNull(pkg);
- int blockedCount = 0;
- Record r = getRecord(pkg, uid);
- if (r == null) {
- return blockedCount;
- }
- int N = r.channels.size();
- for (int i = 0; i < N; i++) {
- final NotificationChannel nc = r.channels.valueAt(i);
- if (!nc.isDeleted() && IMPORTANCE_NONE == nc.getImportance()) {
- blockedCount++;
- }
- }
- return blockedCount;
- }
-
- public int getBlockedAppCount(int userId) {
- int count = 0;
- synchronized (mRecords) {
- final int N = mRecords.size();
- for (int i = 0; i < N; i++) {
- final Record r = mRecords.valueAt(i);
- if (userId == UserHandle.getUserId(r.uid)
- && r.importance == IMPORTANCE_NONE) {
- count++;
- }
- }
- }
- return count;
- }
-
- public void updateChannelsBypassingDnd() {
- synchronized (mRecords) {
- final int numRecords = mRecords.size();
- for (int recordIndex = 0; recordIndex < numRecords; recordIndex++) {
- final Record r = mRecords.valueAt(recordIndex);
- final int numChannels = r.channels.size();
-
- for (int channelIndex = 0; channelIndex < numChannels; channelIndex++) {
- NotificationChannel channel = r.channels.valueAt(channelIndex);
- if (!channel.isDeleted() && channel.canBypassDnd()) {
- if (!mAreChannelsBypassingDnd) {
- mAreChannelsBypassingDnd = true;
- updateZenPolicy(true);
- }
- return;
- }
- }
- }
- }
-
- if (mAreChannelsBypassingDnd) {
- mAreChannelsBypassingDnd = false;
- updateZenPolicy(false);
- }
- }
-
- public void updateZenPolicy(boolean areChannelsBypassingDnd) {
- NotificationManager.Policy policy = mZenModeHelper.getNotificationPolicy();
- mZenModeHelper.setNotificationPolicy(new NotificationManager.Policy(
- policy.priorityCategories, policy.priorityCallSenders,
- policy.priorityMessageSenders, policy.suppressedVisualEffects,
- (areChannelsBypassingDnd ? NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND
- : 0)));
- }
-
- public boolean areChannelsBypassingDnd() {
- return mAreChannelsBypassingDnd;
- }
-
- /**
- * Sets importance.
- */
- @Override
- public void setImportance(String pkgName, int uid, int importance) {
- getOrCreateRecord(pkgName, uid).importance = importance;
- updateConfig();
- }
-
- public void setEnabled(String packageName, int uid, boolean enabled) {
- boolean wasEnabled = getImportance(packageName, uid) != IMPORTANCE_NONE;
- if (wasEnabled == enabled) {
- return;
- }
- setImportance(packageName, uid,
- enabled ? DEFAULT_IMPORTANCE : IMPORTANCE_NONE);
- }
-
- /**
- * Sets whether any notifications from the app, represented by the given {@code pkgName} and
- * {@code uid}, have their importance locked by the user. Locked notifications don't get
- * considered for sentiment adjustments (and thus never show a blocking helper).
- */
- public void setAppImportanceLocked(String packageName, int uid) {
- Record record = getOrCreateRecord(packageName, uid);
- if ((record.lockedAppFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0) {
- return;
- }
-
- record.lockedAppFields = record.lockedAppFields | LockableAppFields.USER_LOCKED_IMPORTANCE;
- updateConfig();
- }
-
- @VisibleForTesting
- void lockFieldsForUpdate(NotificationChannel original, NotificationChannel update) {
- if (original.canBypassDnd() != update.canBypassDnd()) {
- update.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
- }
- if (original.getLockscreenVisibility() != update.getLockscreenVisibility()) {
- update.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY);
- }
- if (original.getImportance() != update.getImportance()) {
- update.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
- }
- if (original.shouldShowLights() != update.shouldShowLights()
- || original.getLightColor() != update.getLightColor()) {
- update.lockFields(NotificationChannel.USER_LOCKED_LIGHTS);
- }
- if (!Objects.equals(original.getSound(), update.getSound())) {
- update.lockFields(NotificationChannel.USER_LOCKED_SOUND);
- }
- if (!Arrays.equals(original.getVibrationPattern(), update.getVibrationPattern())
- || original.shouldVibrate() != update.shouldVibrate()) {
- update.lockFields(NotificationChannel.USER_LOCKED_VIBRATION);
- }
- if (original.canShowBadge() != update.canShowBadge()) {
- update.lockFields(NotificationChannel.USER_LOCKED_SHOW_BADGE);
- }
- }
-
public void dump(PrintWriter pw, String prefix,
@NonNull NotificationManagerService.DumpFilter filter) {
final int N = mSignalExtractors.length;
@@ -1088,16 +169,6 @@ public class RankingHelper implements RankingConfig {
pw.print(" ");
pw.println(mSignalExtractors[i].getClass().getSimpleName());
}
-
- pw.print(prefix);
- pw.println("per-package config:");
-
- pw.println("Records:");
- synchronized (mRecords) {
- dumpRecords(pw, prefix, filter, mRecords);
- }
- pw.println("Restored without uid:");
- dumpRecords(pw, prefix, filter, mRestoredWithoutUids);
}
public void dump(ProtoOutputStream proto,
@@ -1105,375 +176,7 @@ public class RankingHelper implements RankingConfig {
final int N = mSignalExtractors.length;
for (int i = 0; i < N; i++) {
proto.write(RankingHelperProto.NOTIFICATION_SIGNAL_EXTRACTORS,
- mSignalExtractors[i].getClass().getSimpleName());
+ mSignalExtractors[i].getClass().getSimpleName());
}
- synchronized (mRecords) {
- dumpRecords(proto, RankingHelperProto.RECORDS, filter, mRecords);
- }
- dumpRecords(proto, RankingHelperProto.RECORDS_RESTORED_WITHOUT_UID, filter,
- mRestoredWithoutUids);
}
-
- private static void dumpRecords(ProtoOutputStream proto, long fieldId,
- @NonNull NotificationManagerService.DumpFilter filter,
- ArrayMap<String, Record> records) {
- final int N = records.size();
- long fToken;
- for (int i = 0; i < N; i++) {
- final Record r = records.valueAt(i);
- if (filter.matches(r.pkg)) {
- fToken = proto.start(fieldId);
-
- proto.write(RecordProto.PACKAGE, r.pkg);
- proto.write(RecordProto.UID, r.uid);
- proto.write(RecordProto.IMPORTANCE, r.importance);
- proto.write(RecordProto.PRIORITY, r.priority);
- proto.write(RecordProto.VISIBILITY, r.visibility);
- proto.write(RecordProto.SHOW_BADGE, r.showBadge);
-
- for (NotificationChannel channel : r.channels.values()) {
- channel.writeToProto(proto, RecordProto.CHANNELS);
- }
- for (NotificationChannelGroup group : r.groups.values()) {
- group.writeToProto(proto, RecordProto.CHANNEL_GROUPS);
- }
-
- proto.end(fToken);
- }
- }
- }
-
- private static void dumpRecords(PrintWriter pw, String prefix,
- @NonNull NotificationManagerService.DumpFilter filter,
- ArrayMap<String, Record> records) {
- final int N = records.size();
- for (int i = 0; i < N; i++) {
- final Record r = records.valueAt(i);
- if (filter.matches(r.pkg)) {
- pw.print(prefix);
- pw.print(" AppSettings: ");
- pw.print(r.pkg);
- pw.print(" (");
- pw.print(r.uid == Record.UNKNOWN_UID ? "UNKNOWN_UID" : Integer.toString(r.uid));
- pw.print(')');
- if (r.importance != DEFAULT_IMPORTANCE) {
- pw.print(" importance=");
- pw.print(Ranking.importanceToString(r.importance));
- }
- if (r.priority != DEFAULT_PRIORITY) {
- pw.print(" priority=");
- pw.print(Notification.priorityToString(r.priority));
- }
- if (r.visibility != DEFAULT_VISIBILITY) {
- pw.print(" visibility=");
- pw.print(Notification.visibilityToString(r.visibility));
- }
- pw.print(" showBadge=");
- pw.print(Boolean.toString(r.showBadge));
- pw.println();
- for (NotificationChannel channel : r.channels.values()) {
- pw.print(prefix);
- pw.print(" ");
- pw.print(" ");
- pw.println(channel);
- }
- for (NotificationChannelGroup group : r.groups.values()) {
- pw.print(prefix);
- pw.print(" ");
- pw.print(" ");
- pw.println(group);
- }
- }
- }
- }
-
- public JSONObject dumpJson(NotificationManagerService.DumpFilter filter) {
- JSONObject ranking = new JSONObject();
- JSONArray records = new JSONArray();
- try {
- ranking.put("noUid", mRestoredWithoutUids.size());
- } catch (JSONException e) {
- // pass
- }
- synchronized (mRecords) {
- final int N = mRecords.size();
- for (int i = 0; i < N; i++) {
- final Record r = mRecords.valueAt(i);
- if (filter == null || filter.matches(r.pkg)) {
- JSONObject record = new JSONObject();
- try {
- record.put("userId", UserHandle.getUserId(r.uid));
- record.put("packageName", r.pkg);
- if (r.importance != DEFAULT_IMPORTANCE) {
- record.put("importance", Ranking.importanceToString(r.importance));
- }
- if (r.priority != DEFAULT_PRIORITY) {
- record.put("priority", Notification.priorityToString(r.priority));
- }
- if (r.visibility != DEFAULT_VISIBILITY) {
- record.put("visibility", Notification.visibilityToString(r.visibility));
- }
- if (r.showBadge != DEFAULT_SHOW_BADGE) {
- record.put("showBadge", Boolean.valueOf(r.showBadge));
- }
- JSONArray channels = new JSONArray();
- for (NotificationChannel channel : r.channels.values()) {
- channels.put(channel.toJson());
- }
- record.put("channels", channels);
- JSONArray groups = new JSONArray();
- for (NotificationChannelGroup group : r.groups.values()) {
- groups.put(group.toJson());
- }
- record.put("groups", groups);
- } catch (JSONException e) {
- // pass
- }
- records.put(record);
- }
- }
- }
- try {
- ranking.put("records", records);
- } catch (JSONException e) {
- // pass
- }
- return ranking;
- }
-
- /**
- * Dump only the ban information as structured JSON for the stats collector.
- *
- * This is intentionally redundant with {#link dumpJson} because the old
- * scraper will expect this format.
- *
- * @param filter
- * @return
- */
- public JSONArray dumpBansJson(NotificationManagerService.DumpFilter filter) {
- JSONArray bans = new JSONArray();
- Map<Integer, String> packageBans = getPackageBans();
- for(Entry<Integer, String> ban : packageBans.entrySet()) {
- final int userId = UserHandle.getUserId(ban.getKey());
- final String packageName = ban.getValue();
- if (filter == null || filter.matches(packageName)) {
- JSONObject banJson = new JSONObject();
- try {
- banJson.put("userId", userId);
- banJson.put("packageName", packageName);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- bans.put(banJson);
- }
- }
- return bans;
- }
-
- public Map<Integer, String> getPackageBans() {
- synchronized (mRecords) {
- final int N = mRecords.size();
- ArrayMap<Integer, String> packageBans = new ArrayMap<>(N);
- for (int i = 0; i < N; i++) {
- final Record r = mRecords.valueAt(i);
- if (r.importance == IMPORTANCE_NONE) {
- packageBans.put(r.uid, r.pkg);
- }
- }
-
- return packageBans;
- }
- }
-
- /**
- * Dump only the channel information as structured JSON for the stats collector.
- *
- * This is intentionally redundant with {#link dumpJson} because the old
- * scraper will expect this format.
- *
- * @param filter
- * @return
- */
- public JSONArray dumpChannelsJson(NotificationManagerService.DumpFilter filter) {
- JSONArray channels = new JSONArray();
- Map<String, Integer> packageChannels = getPackageChannels();
- for(Entry<String, Integer> channelCount : packageChannels.entrySet()) {
- final String packageName = channelCount.getKey();
- if (filter == null || filter.matches(packageName)) {
- JSONObject channelCountJson = new JSONObject();
- try {
- channelCountJson.put("packageName", packageName);
- channelCountJson.put("channelCount", channelCount.getValue());
- } catch (JSONException e) {
- e.printStackTrace();
- }
- channels.put(channelCountJson);
- }
- }
- return channels;
- }
-
- private Map<String, Integer> getPackageChannels() {
- ArrayMap<String, Integer> packageChannels = new ArrayMap<>();
- synchronized (mRecords) {
- for (int i = 0; i < mRecords.size(); i++) {
- final Record r = mRecords.valueAt(i);
- int channelCount = 0;
- for (int j = 0; j < r.channels.size(); j++) {
- if (!r.channels.valueAt(j).isDeleted()) {
- channelCount++;
- }
- }
- packageChannels.put(r.pkg, channelCount);
- }
- }
- return packageChannels;
- }
-
- public void onUserRemoved(int userId) {
- synchronized (mRecords) {
- int N = mRecords.size();
- for (int i = N - 1; i >= 0 ; i--) {
- Record record = mRecords.valueAt(i);
- if (UserHandle.getUserId(record.uid) == userId) {
- mRecords.removeAt(i);
- }
- }
- }
- }
-
- protected void onLocaleChanged(Context context, int userId) {
- synchronized (mRecords) {
- int N = mRecords.size();
- for (int i = 0; i < N; i++) {
- Record record = mRecords.valueAt(i);
- if (UserHandle.getUserId(record.uid) == userId) {
- if (record.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) {
- record.channels.get(NotificationChannel.DEFAULT_CHANNEL_ID).setName(
- context.getResources().getString(
- R.string.default_notification_channel_label));
- }
- }
- }
- }
- }
-
- public void onPackagesChanged(boolean removingPackage, int changeUserId, String[] pkgList,
- int[] uidList) {
- if (pkgList == null || pkgList.length == 0) {
- return; // nothing to do
- }
- boolean updated = false;
- if (removingPackage) {
- // Remove notification settings for uninstalled package
- int size = Math.min(pkgList.length, uidList.length);
- for (int i = 0; i < size; i++) {
- final String pkg = pkgList[i];
- final int uid = uidList[i];
- synchronized (mRecords) {
- mRecords.remove(recordKey(pkg, uid));
- }
- mRestoredWithoutUids.remove(pkg);
- updated = true;
- }
- } else {
- for (String pkg : pkgList) {
- // Package install
- final Record r = mRestoredWithoutUids.get(pkg);
- if (r != null) {
- try {
- r.uid = mPm.getPackageUidAsUser(r.pkg, changeUserId);
- mRestoredWithoutUids.remove(pkg);
- synchronized (mRecords) {
- mRecords.put(recordKey(r.pkg, r.uid), r);
- }
- updated = true;
- } catch (NameNotFoundException e) {
- // noop
- }
- }
- // Package upgrade
- try {
- Record fullRecord = getRecord(pkg,
- mPm.getPackageUidAsUser(pkg, changeUserId));
- if (fullRecord != null) {
- createDefaultChannelIfNeeded(fullRecord);
- deleteDefaultChannelIfNeeded(fullRecord);
- }
- } catch (NameNotFoundException e) {}
- }
- }
-
- if (updated) {
- updateConfig();
- }
- }
-
- private LogMaker getChannelLog(NotificationChannel channel, String pkg) {
- return new LogMaker(MetricsProto.MetricsEvent.ACTION_NOTIFICATION_CHANNEL)
- .setType(MetricsProto.MetricsEvent.TYPE_UPDATE)
- .setPackageName(pkg)
- .addTaggedData(MetricsProto.MetricsEvent.FIELD_NOTIFICATION_CHANNEL_ID,
- channel.getId())
- .addTaggedData(MetricsProto.MetricsEvent.FIELD_NOTIFICATION_CHANNEL_IMPORTANCE,
- channel.getImportance());
- }
-
- private LogMaker getChannelGroupLog(String groupId, String pkg) {
- return new LogMaker(MetricsProto.MetricsEvent.ACTION_NOTIFICATION_CHANNEL_GROUP)
- .setType(MetricsProto.MetricsEvent.TYPE_UPDATE)
- .addTaggedData(MetricsProto.MetricsEvent.FIELD_NOTIFICATION_CHANNEL_GROUP_ID,
- groupId)
- .setPackageName(pkg);
- }
-
- public void updateBadgingEnabled() {
- if (mBadgingEnabled == null) {
- mBadgingEnabled = new SparseBooleanArray();
- }
- boolean changed = false;
- // update the cached values
- for (int index = 0; index < mBadgingEnabled.size(); index++) {
- int userId = mBadgingEnabled.keyAt(index);
- final boolean oldValue = mBadgingEnabled.get(userId);
- final boolean newValue = Secure.getIntForUser(mContext.getContentResolver(),
- Secure.NOTIFICATION_BADGING,
- DEFAULT_SHOW_BADGE ? 1 : 0, userId) != 0;
- mBadgingEnabled.put(userId, newValue);
- changed |= oldValue != newValue;
- }
- if (changed) {
- updateConfig();
- }
- }
-
- public boolean badgingEnabled(UserHandle userHandle) {
- int userId = userHandle.getIdentifier();
- if (userId == UserHandle.USER_ALL) {
- return false;
- }
- if (mBadgingEnabled.indexOfKey(userId) < 0) {
- mBadgingEnabled.put(userId,
- Secure.getIntForUser(mContext.getContentResolver(),
- Secure.NOTIFICATION_BADGING,
- DEFAULT_SHOW_BADGE ? 1 : 0, userId) != 0);
- }
- return mBadgingEnabled.get(userId, DEFAULT_SHOW_BADGE);
- }
-
-
- private static class Record {
- static int UNKNOWN_UID = UserHandle.USER_NULL;
-
- String pkg;
- int uid = UNKNOWN_UID;
- int importance = DEFAULT_IMPORTANCE;
- int priority = DEFAULT_PRIORITY;
- int visibility = DEFAULT_VISIBILITY;
- boolean showBadge = DEFAULT_SHOW_BADGE;
- int lockedAppFields = DEFAULT_LOCKED_APP_FIELDS;
-
- ArrayMap<String, NotificationChannel> channels = new ArrayMap<>();
- Map<String, NotificationChannelGroup> groups = new ConcurrentHashMap<>();
- }
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 669d5565534d..1954ed4bfa45 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -1182,11 +1182,19 @@ public class ZenModeHelper {
}
private void showZenUpgradeNotification(int zen) {
+ final boolean isWatch = mContext.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_WATCH);
final boolean showNotification = mIsBootComplete
&& zen != Global.ZEN_MODE_OFF
+ && !isWatch
&& Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.SHOW_ZEN_UPGRADE_NOTIFICATION, 0) != 0;
+ if (isWatch) {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Global.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
+ }
+
if (showNotification) {
mNotificationManager.notify(TAG, SystemMessage.NOTE_ZEN_UPGRADE,
createZenUpgradeNotification());
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 0774672b2fdc..d6ab5f717568 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -489,7 +489,7 @@ public class BackgroundDexOptService extends JobService {
PinnerService pinnerService = LocalServices.getService(PinnerService.class);
if (pinnerService != null) {
Log.i(TAG, "Pinning optimized code " + updatedPackages);
- pinnerService.update(updatedPackages);
+ pinnerService.update(updatedPackages, false /* force */);
}
}
diff --git a/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java b/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java
index 97f6aa2e52a6..65ccecdcafff 100644
--- a/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java
+++ b/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java
@@ -41,6 +41,7 @@ import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
+import com.android.server.wm.ActivityTaskManagerInternal;
import java.util.ArrayList;
import java.util.List;
@@ -112,7 +113,7 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub {
launchIntent.setPackage(null);
launchIntent.setComponent(component);
- mInjector.getActivityManagerInternal().startActivityAsUser(
+ mInjector.getActivityTaskManagerInternal().startActivityAsUser(
caller, callingPackage, launchIntent,
ActivityOptions.makeOpenCrossProfileAppsAnimation().toBundle(),
user.getIdentifier());
@@ -241,6 +242,11 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub {
public ActivityManagerInternal getActivityManagerInternal() {
return LocalServices.getService(ActivityManagerInternal.class);
}
+
+ @Override
+ public ActivityTaskManagerInternal getActivityTaskManagerInternal() {
+ return LocalServices.getService(ActivityTaskManagerInternal.class);
+ }
}
@VisibleForTesting
@@ -264,5 +270,7 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub {
AppOpsManager getAppOpsManager();
ActivityManagerInternal getActivityManagerInternal();
+
+ ActivityTaskManagerInternal getActivityTaskManagerInternal();
}
}
diff --git a/services/core/java/com/android/server/pm/DumpState.java b/services/core/java/com/android/server/pm/DumpState.java
index f4ee0ce7632a..fe8113372697 100644
--- a/services/core/java/com/android/server/pm/DumpState.java
+++ b/services/core/java/com/android/server/pm/DumpState.java
@@ -43,6 +43,7 @@ public final class DumpState {
public static final int DUMP_SERVICE_PERMISSIONS = 1 << 24;
public static final int OPTION_SHOW_FILTERS = 1 << 0;
+ public static final int OPTION_DUMP_ALL_COMPONENTS = 1 << 1;
private int mTypes;
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 45f1a2b8250a..72f11f78d71d 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -34,6 +34,7 @@ import android.util.Slog;
import com.android.internal.os.BackgroundThread;
import com.android.server.SystemService;
+import dalvik.system.BlockGuard;
import dalvik.system.VMRuntime;
import java.io.FileDescriptor;
@@ -43,7 +44,7 @@ public class Installer extends SystemService {
/* ***************************************************************************
* IMPORTANT: These values are passed to native code. Keep them in sync with
- * frameworks/native/cmds/installd/installd.h
+ * frameworks/native/cmds/installd/installd_constants.h
* **************************************************************************/
/** Application should be visible to everyone */
public static final int DEXOPT_PUBLIC = 1 << 1;
@@ -239,6 +240,11 @@ public class Installer extends SystemService {
long[] ceDataInodes, String[] codePaths, PackageStats stats)
throws InstallerException {
if (!checkBeforeRemote()) return;
+ if (codePaths != null) {
+ for (String codePath : codePaths) {
+ BlockGuard.getVmPolicy().onPathAccess(codePath);
+ }
+ }
try {
final long[] res = mInstalld.getAppSize(uuid, packageNames, userId, flags,
appId, ceDataInodes, codePaths);
@@ -296,6 +302,9 @@ public class Installer extends SystemService {
@Nullable String profileName, @Nullable String dexMetadataPath,
@Nullable String compilationReason) throws InstallerException {
assertValidInstructionSet(instructionSet);
+ BlockGuard.getVmPolicy().onPathAccess(apkPath);
+ BlockGuard.getVmPolicy().onPathAccess(outputPath);
+ BlockGuard.getVmPolicy().onPathAccess(dexMetadataPath);
if (!checkBeforeRemote()) return;
try {
mInstalld.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded, outputPath,
@@ -319,6 +328,7 @@ public class Installer extends SystemService {
public boolean dumpProfiles(int uid, String packageName, String profileName, String codePath)
throws InstallerException {
if (!checkBeforeRemote()) return false;
+ BlockGuard.getVmPolicy().onPathAccess(codePath);
try {
return mInstalld.dumpProfiles(uid, packageName, profileName, codePath);
} catch (Exception e) {
@@ -339,6 +349,8 @@ public class Installer extends SystemService {
public void idmap(String targetApkPath, String overlayApkPath, int uid)
throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(targetApkPath);
+ BlockGuard.getVmPolicy().onPathAccess(overlayApkPath);
try {
mInstalld.idmap(targetApkPath, overlayApkPath, uid);
} catch (Exception e) {
@@ -348,6 +360,7 @@ public class Installer extends SystemService {
public void removeIdmap(String overlayApkPath) throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(overlayApkPath);
try {
mInstalld.removeIdmap(overlayApkPath);
} catch (Exception e) {
@@ -358,6 +371,7 @@ public class Installer extends SystemService {
public void rmdex(String codePath, String instructionSet) throws InstallerException {
assertValidInstructionSet(instructionSet);
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(codePath);
try {
mInstalld.rmdex(codePath, instructionSet);
} catch (Exception e) {
@@ -367,6 +381,7 @@ public class Installer extends SystemService {
public void rmPackageDir(String packageDir) throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(packageDir);
try {
mInstalld.rmPackageDir(packageDir);
} catch (Exception e) {
@@ -439,6 +454,7 @@ public class Installer extends SystemService {
public void linkNativeLibraryDirectory(String uuid, String packageName, String nativeLibPath32,
int userId) throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(nativeLibPath32);
try {
mInstalld.linkNativeLibraryDirectory(uuid, packageName, nativeLibPath32, userId);
} catch (Exception e) {
@@ -459,6 +475,8 @@ public class Installer extends SystemService {
public void linkFile(String relativePath, String fromBase, String toBase)
throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(fromBase);
+ BlockGuard.getVmPolicy().onPathAccess(toBase);
try {
mInstalld.linkFile(relativePath, fromBase, toBase);
} catch (Exception e) {
@@ -469,6 +487,8 @@ public class Installer extends SystemService {
public void moveAb(String apkPath, String instructionSet, String outputPath)
throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(apkPath);
+ BlockGuard.getVmPolicy().onPathAccess(outputPath);
try {
mInstalld.moveAb(apkPath, instructionSet, outputPath);
} catch (Exception e) {
@@ -479,6 +499,8 @@ public class Installer extends SystemService {
public void deleteOdex(String apkPath, String instructionSet, String outputPath)
throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(apkPath);
+ BlockGuard.getVmPolicy().onPathAccess(outputPath);
try {
mInstalld.deleteOdex(apkPath, instructionSet, outputPath);
} catch (Exception e) {
@@ -489,6 +511,7 @@ public class Installer extends SystemService {
public void installApkVerity(String filePath, FileDescriptor verityInput, int contentSize)
throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(filePath);
try {
mInstalld.installApkVerity(filePath, verityInput, contentSize);
} catch (Exception e) {
@@ -499,6 +522,7 @@ public class Installer extends SystemService {
public void assertFsverityRootHashMatches(String filePath, @NonNull byte[] expectedHash)
throws InstallerException {
if (!checkBeforeRemote()) return;
+ BlockGuard.getVmPolicy().onPathAccess(filePath);
try {
mInstalld.assertFsverityRootHashMatches(filePath, expectedHash);
} catch (Exception e) {
@@ -512,6 +536,7 @@ public class Installer extends SystemService {
assertValidInstructionSet(isas[i]);
}
if (!checkBeforeRemote()) return false;
+ BlockGuard.getVmPolicy().onPathAccess(apkPath);
try {
return mInstalld.reconcileSecondaryDexFile(apkPath, packageName, uid, isas,
volumeUuid, flags);
@@ -523,6 +548,7 @@ public class Installer extends SystemService {
public byte[] hashSecondaryDexFile(String dexPath, String packageName, int uid,
@Nullable String volumeUuid, int flags) throws InstallerException {
if (!checkBeforeRemote()) return new byte[0];
+ BlockGuard.getVmPolicy().onPathAccess(dexPath);
try {
return mInstalld.hashSecondaryDexFile(dexPath, packageName, uid, volumeUuid, flags);
} catch (Exception e) {
@@ -571,6 +597,8 @@ public class Installer extends SystemService {
public boolean prepareAppProfile(String pkg, @UserIdInt int userId, @AppIdInt int appId,
String profileName, String codePath, String dexMetadataPath) throws InstallerException {
if (!checkBeforeRemote()) return false;
+ BlockGuard.getVmPolicy().onPathAccess(codePath);
+ BlockGuard.getVmPolicy().onPathAccess(dexMetadataPath);
try {
return mInstalld.prepareAppProfile(pkg, userId, appId, profileName, codePath,
dexMetadataPath);
diff --git a/services/core/java/com/android/server/pm/InstantAppResolver.java b/services/core/java/com/android/server/pm/InstantAppResolver.java
index 9a5dd5e04b07..19cefb8a6ceb 100644
--- a/services/core/java/com/android/server/pm/InstantAppResolver.java
+++ b/services/core/java/com/android/server/pm/InstantAppResolver.java
@@ -265,13 +265,9 @@ public abstract class InstantAppResolver {
| Intent.FLAG_ACTIVITY_NO_HISTORY
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
if (token != null) {
- // TODO(b/72700831): remove populating old extra
- intent.putExtra(Intent.EXTRA_EPHEMERAL_TOKEN, token);
intent.putExtra(Intent.EXTRA_INSTANT_APP_TOKEN, token);
}
if (origIntent.getData() != null) {
- // TODO(b/72700831): remove populating old extra
- intent.putExtra(Intent.EXTRA_EPHEMERAL_HOSTNAME, origIntent.getData().getHost());
intent.putExtra(Intent.EXTRA_INSTANT_APP_HOSTNAME, origIntent.getData().getHost());
}
intent.putExtra(Intent.EXTRA_INSTANT_APP_ACTION, origIntent.getAction());
@@ -308,7 +304,6 @@ public abstract class InstantAppResolver {
null /*bOptions*/, userId);
IntentSender failureSender = new IntentSender(failureIntentTarget);
// TODO(b/72700831): remove populating old extra
- intent.putExtra(Intent.EXTRA_EPHEMERAL_FAILURE, failureSender);
intent.putExtra(Intent.EXTRA_INSTANT_APP_FAILURE, failureSender);
} catch (RemoteException ignore) { /* ignore; same process */ }
}
@@ -327,8 +322,6 @@ public abstract class InstantAppResolver {
| PendingIntent.FLAG_IMMUTABLE,
null /*bOptions*/, userId);
IntentSender successSender = new IntentSender(successIntentTarget);
- // TODO(b/72700831): remove populating old extra
- intent.putExtra(Intent.EXTRA_EPHEMERAL_SUCCESS, successSender);
intent.putExtra(Intent.EXTRA_INSTANT_APP_SUCCESS, successSender);
} catch (RemoteException ignore) { /* ignore; same process */ }
if (verificationBundle != null) {
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index feac8e6a4509..93230401eb20 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -63,6 +63,7 @@ import com.android.internal.os.BackgroundThread;
import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.wm.ActivityTaskManagerInternal;
import java.util.Collections;
import java.util.List;
@@ -107,6 +108,7 @@ public class LauncherAppsService extends SystemService {
private final UserManager mUm;
private final UserManagerInternal mUserManagerInternal;
private final ActivityManagerInternal mActivityManagerInternal;
+ private final ActivityTaskManagerInternal mActivityTaskManagerInternal;
private final ShortcutServiceInternal mShortcutServiceInternal;
private final PackageCallbackList<IOnAppsChangedListener> mListeners
= new PackageCallbackList<IOnAppsChangedListener>();
@@ -122,6 +124,8 @@ public class LauncherAppsService extends SystemService {
LocalServices.getService(UserManagerInternal.class));
mActivityManagerInternal = Preconditions.checkNotNull(
LocalServices.getService(ActivityManagerInternal.class));
+ mActivityTaskManagerInternal = Preconditions.checkNotNull(
+ LocalServices.getService(ActivityTaskManagerInternal.class));
mShortcutServiceInternal = Preconditions.checkNotNull(
LocalServices.getService(ShortcutServiceInternal.class));
mShortcutServiceInternal.addListener(mPackageMonitor);
@@ -521,7 +525,7 @@ public class LauncherAppsService extends SystemService {
@NonNull String publisherPackage, Bundle startActivityOptions, int userId) {
final int code;
try {
- code = mActivityManagerInternal.startActivitiesAsPackage(publisherPackage,
+ code = mActivityTaskManagerInternal.startActivitiesAsPackage(publisherPackage,
userId, intents, startActivityOptions);
if (ActivityManager.isStartResultSuccessful(code)) {
return true; // Success
@@ -618,7 +622,7 @@ public class LauncherAppsService extends SystemService {
} finally {
Binder.restoreCallingIdentity(ident);
}
- mActivityManagerInternal.startActivityAsUser(caller, callingPackage,
+ mActivityTaskManagerInternal.startActivityAsUser(caller, callingPackage,
launchIntent, opts, user.getIdentifier());
}
@@ -641,7 +645,7 @@ public class LauncherAppsService extends SystemService {
} finally {
Binder.restoreCallingIdentity(ident);
}
- mActivityManagerInternal.startActivityAsUser(caller, callingPackage,
+ mActivityTaskManagerInternal.startActivityAsUser(caller, callingPackage,
intent, opts, user.getIdentifier());
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index fa934fe23fff..b92d52cb870a 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -685,13 +685,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
// inserted above to hold the session active.
try {
final Int64Ref last = new Int64Ref(0);
- FileUtils.copy(incomingFd.getFileDescriptor(), targetFd, (long progress) -> {
- if (params.sizeBytes > 0) {
- final long delta = progress - last.value;
- last.value = progress;
- addClientProgress((float) delta / (float) params.sizeBytes);
- }
- }, null, lengthBytes);
+ FileUtils.copy(incomingFd.getFileDescriptor(), targetFd, lengthBytes, null,
+ Runnable::run, (long progress) -> {
+ if (params.sizeBytes > 0) {
+ final long delta = progress - last.value;
+ last.value = progress;
+ addClientProgress((float) delta / (float) params.sizeBytes);
+ }
+ });
} finally {
IoUtils.closeQuietly(targetFd);
IoUtils.closeQuietly(incomingFd);
@@ -930,6 +931,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
@GuardedBy("mLock")
private void commitLocked()
throws PackageManagerException {
+ if (mRelinquished) {
+ Slog.d(TAG, "Ignoring commit after previous commit relinquished control");
+ return;
+ }
if (mDestroyed) {
throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR, "Session destroyed");
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 36e89bf7120e..71a524b323a7 100755
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -24,6 +24,9 @@ import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
+import static android.content.Intent.ACTION_MAIN;
+import static android.content.Intent.CATEGORY_DEFAULT;
+import static android.content.Intent.CATEGORY_HOME;
import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
@@ -57,7 +60,6 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_TEST_ONLY;
import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
import static android.content.pm.PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE;
import static android.content.pm.PackageManager.INSTALL_INTERNAL;
-import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
@@ -88,12 +90,10 @@ import static android.os.storage.StorageManager.FLAG_STORAGE_CE;
import static android.os.storage.StorageManager.FLAG_STORAGE_DE;
import static android.system.OsConstants.O_CREAT;
import static android.system.OsConstants.O_RDWR;
-
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB64_DIR_NAME;
import static com.android.internal.content.NativeLibraryHelper.LIB_DIR_NAME;
-import static com.android.internal.util.ArrayUtils.appendInt;
import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet;
import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
@@ -169,6 +169,7 @@ import android.content.pm.PackageList;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.LegacyPackageDeleteObserver;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageManagerInternal.CheckPermissionDelegate;
import android.content.pm.PackageManagerInternal.PackageListObserver;
import android.content.pm.PackageParser;
import android.content.pm.PackageParser.ActivityIntentInfo;
@@ -291,6 +292,8 @@ import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
+import com.android.internal.util.function.QuadFunction;
+import com.android.internal.util.function.TriFunction;
import com.android.server.AttributeCache;
import com.android.server.DeviceIdleController;
import com.android.server.EventLogTags;
@@ -321,11 +324,7 @@ import com.android.server.pm.permission.PermissionsState;
import com.android.server.pm.permission.PermissionsState.PermissionState;
import com.android.server.security.VerityUtils;
import com.android.server.storage.DeviceStorageMonitorInternal;
-
-import dalvik.system.CloseGuard;
-import dalvik.system.VMRuntime;
-
-import libcore.io.IoUtils;
+import com.android.server.wm.ActivityTaskManagerInternal;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -369,8 +368,13 @@ import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BiFunction;
import java.util.function.Predicate;
+import dalvik.system.CloseGuard;
+import dalvik.system.VMRuntime;
+import libcore.io.IoUtils;
+
/**
* Keep track of all those APKs everywhere.
* <p>
@@ -432,7 +436,6 @@ public class PackageManagerService extends IPackageManager.Stub
private static final boolean DEBUG_ABI_SELECTION = false;
private static final boolean DEBUG_INSTANT = Build.IS_DEBUGGABLE;
- private static final boolean DEBUG_TRIAGED_MISSING = false;
private static final boolean DEBUG_APP_DATA = false;
/** REMOVE. According to Svet, this was only used to reset permissions during development. */
@@ -450,10 +453,6 @@ public class PackageManagerService extends IPackageManager.Stub
private static final int SHELL_UID = Process.SHELL_UID;
private static final int SE_UID = Process.SE_UID;
- // Suffix used during package installation when copying/moving
- // package apks to install directory.
- private static final String INSTALL_PACKAGE_SUFFIX = "-";
-
static final int SCAN_NO_DEX = 1<<0;
static final int SCAN_UPDATE_SIGNATURE = 1<<1;
static final int SCAN_NEW_INSTALL = 1<<2;
@@ -691,11 +690,7 @@ public class PackageManagerService extends IPackageManager.Stub
// as the lock for the global state. Methods that must be called with
// this lock held have the prefix "LP".
@GuardedBy("mPackages")
- final ArrayMap<String, PackageParser.Package> mPackages =
- new ArrayMap<String, PackageParser.Package>();
-
- final ArrayMap<String, Set<String>> mKnownCodebase =
- new ArrayMap<String, Set<String>>();
+ final ArrayMap<String, PackageParser.Package> mPackages = new ArrayMap<>();
// Keys are isolated uids and values are the uid of the application
// that created the isolated proccess.
@@ -794,18 +789,15 @@ public class PackageManagerService extends IPackageManager.Stub
for (PackageParser.Package p : allPackages) {
if (targetPackageName.equals(p.mOverlayTarget) && p.mOverlayIsStatic) {
if (overlayPackages == null) {
- overlayPackages = new ArrayList<PackageParser.Package>();
+ overlayPackages = new ArrayList<>();
}
overlayPackages.add(p);
}
}
if (overlayPackages != null) {
- Comparator<PackageParser.Package> cmp = new Comparator<PackageParser.Package>() {
- public int compare(PackageParser.Package p1, PackageParser.Package p2) {
- return p1.mOverlayPriority - p2.mOverlayPriority;
- }
- };
- Collections.sort(overlayPackages, cmp);
+ Comparator<PackageParser.Package> cmp =
+ Comparator.comparingInt(p -> p.mOverlayPriority);
+ overlayPackages.sort(cmp);
}
return overlayPackages;
}
@@ -819,7 +811,7 @@ public class PackageManagerService extends IPackageManager.Stub
for (PackageParser.Package overlayPackage : overlayPackages) {
if (targetPath == null) {
if (overlayPathList == null) {
- overlayPathList = new ArrayList<String>();
+ overlayPathList = new ArrayList<>();
}
overlayPathList.add(overlayPackage.baseCodePath);
continue;
@@ -835,7 +827,7 @@ public class PackageManagerService extends IPackageManager.Stub
UserHandle.getSharedAppGid(
UserHandle.getUserGid(UserHandle.USER_SYSTEM)));
if (overlayPathList == null) {
- overlayPathList = new ArrayList<String>();
+ overlayPathList = new ArrayList<>();
}
overlayPathList.add(overlayPackage.baseCodePath);
} catch (InstallerException e) {
@@ -877,7 +869,7 @@ public class PackageManagerService extends IPackageManager.Stub
for (PackageParser.Package p : mPackages.values()) {
if (p.mOverlayIsStatic) {
if (mOverlayPackages == null) {
- mOverlayPackages = new ArrayList<PackageParser.Package>();
+ mOverlayPackages = new ArrayList<>();
}
mOverlayPackages.add(p);
}
@@ -938,24 +930,22 @@ public class PackageManagerService extends IPackageManager.Stub
// Mapping from provider base names (first directory in content URI codePath)
// to the provider information.
- final ArrayMap<String, PackageParser.Provider> mProvidersByAuthority =
- new ArrayMap<String, PackageParser.Provider>();
+ final ArrayMap<String, PackageParser.Provider> mProvidersByAuthority = new ArrayMap<>();
// Mapping from instrumentation class names to info about them.
final ArrayMap<ComponentName, PackageParser.Instrumentation> mInstrumentation =
- new ArrayMap<ComponentName, PackageParser.Instrumentation>();
+ new ArrayMap<>();
// Packages whose data we have transfered into another package, thus
// should no longer exist.
- final ArraySet<String> mTransferedPackages = new ArraySet<String>();
+ final ArraySet<String> mTransferedPackages = new ArraySet<>();
// Broadcast actions that are only available to the system.
@GuardedBy("mProtectedBroadcasts")
final ArraySet<String> mProtectedBroadcasts = new ArraySet<>();
/** List of packages waiting for verification. */
- final SparseArray<PackageVerificationState> mPendingVerification
- = new SparseArray<PackageVerificationState>();
+ final SparseArray<PackageVerificationState> mPendingVerification = new SparseArray<>();
final PackageInstallerService mInstallerService;
@@ -1006,7 +996,7 @@ public class PackageManagerService extends IPackageManager.Stub
final ResolveInfo mInstantAppInstallerInfo = new ResolveInfo();
final SparseArray<IntentFilterVerificationState> mIntentFilterVerificationStates
- = new SparseArray<IntentFilterVerificationState>();
+ = new SparseArray<>();
// TODO remove this and go through mPermissonManager directly
final DefaultPermissionGrantPolicy mDefaultPermissionPolicy;
@@ -1017,6 +1007,7 @@ public class PackageManagerService extends IPackageManager.Stub
private UserManagerInternal mUserManagerInternal;
private ActivityManagerInternal mActivityManagerInternal;
+ private ActivityTaskManagerInternal mActivityTaskManagerInternal;
private DeviceIdleController.LocalService mDeviceIdleController;
@@ -1035,7 +1026,6 @@ public class PackageManagerService extends IPackageManager.Stub
pkg = _pkg;
replacing = _replacing;
userId = _userId;
- replacing = _replacing;
verifierUid = _verifierUid;
}
}
@@ -1047,10 +1037,13 @@ public class PackageManagerService extends IPackageManager.Stub
void receiveVerificationResponse(int verificationId);
}
+ @GuardedBy("mPackages")
+ private CheckPermissionDelegate mCheckPermissionDelegate;
+
private class IntentVerifierProxy implements IntentFilterVerifier<ActivityIntentInfo> {
private Context mContext;
private ComponentName mIntentFilterVerifierComponent;
- private ArrayList<Integer> mCurrentIntentFilterVerifications = new ArrayList<Integer>();
+ private ArrayList<Integer> mCurrentIntentFilterVerifications = new ArrayList<>();
public IntentVerifierProxy(Context context, ComponentName verifierComponent) {
mContext = context;
@@ -1140,7 +1133,7 @@ public class PackageManagerService extends IPackageManager.Stub
mIntentFilterVerificationStates.remove(verificationId);
final String packageName = ivs.getPackageName();
- IntentFilterVerificationInfo ivi = null;
+ IntentFilterVerificationInfo ivi;
synchronized (mPackages) {
ivi = mSettings.getIntentFilterVerificationLPr(packageName);
@@ -1245,7 +1238,7 @@ public class PackageManagerService extends IPackageManager.Stub
final SparseArray<ArrayMap<String, ArrayList<String>>> mUidMap;
public PendingPackageBroadcasts() {
- mUidMap = new SparseArray<ArrayMap<String, ArrayList<String>>>(2);
+ mUidMap = new SparseArray<>(2);
}
public ArrayList<String> get(int userId, String packageName) {
@@ -1297,7 +1290,7 @@ public class PackageManagerService extends IPackageManager.Stub
private ArrayMap<String, ArrayList<String>> getOrAllocate(int userId) {
ArrayMap<String, ArrayList<String>> map = mUidMap.get(userId);
if (map == null) {
- map = new ArrayMap<String, ArrayList<String>>();
+ map = new ArrayMap<>();
mUidMap.put(userId, map);
}
return map;
@@ -1312,11 +1305,9 @@ public class PackageManagerService extends IPackageManager.Stub
static final int SEND_PENDING_BROADCAST = 1;
static final int MCS_BOUND = 3;
- static final int END_COPY = 4;
static final int INIT_COPY = 5;
static final int MCS_UNBIND = 6;
static final int START_CLEANING_PACKAGE = 7;
- static final int FIND_INSTALL_LOC = 8;
static final int POST_INSTALL = 9;
static final int MCS_RECONNECT = 10;
static final int MCS_GIVE_UP = 11;
@@ -1341,7 +1332,7 @@ public class PackageManagerService extends IPackageManager.Stub
static UserManagerService sUserManager;
// Stores a list of users whose package restrictions file needs to be updated
- private ArraySet<Integer> mDirtyUsers = new ArraySet<Integer>();
+ private ArraySet<Integer> mDirtyUsers = new ArraySet<>();
final private DefaultContainerConnection mDefContainerConn =
new DefaultContainerConnection();
@@ -1370,7 +1361,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- final SparseArray<PostInstallData> mRunningInstalls = new SparseArray<PostInstallData>();
+ final SparseArray<PostInstallData> mRunningInstalls = new SparseArray<>();
int mNextInstallToken = 1; // nonzero; will be wrapped back to 1 when ++ overflows
// XML tags for backup/restore of various bits of state
@@ -1418,7 +1409,7 @@ public class PackageManagerService extends IPackageManager.Stub
class PackageHandler extends Handler {
private boolean mBound = false;
final ArrayList<HandlerParams> mPendingInstalls =
- new ArrayList<HandlerParams>();
+ new ArrayList<>();
private boolean connectToService() {
if (DEBUG_INSTALL) Log.i(TAG, "Trying to bind to DefaultContainerService");
@@ -1624,9 +1615,6 @@ public class PackageManagerService extends IPackageManager.Stub
int uids[];
Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
synchronized (mPackages) {
- if (mPendingBroadcasts == null) {
- return;
- }
size = mPendingBroadcasts.size();
if (size <= 0) {
// Nothing to be done. Just return
@@ -1901,12 +1889,7 @@ public class PackageManagerService extends IPackageManager.Stub
private PermissionCallback mPermissionCallback = new PermissionCallback() {
@Override
public void onGidsChanged(int appId, int userId) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- killUid(appId, userId, KILL_APP_REASON_GIDS_CHANGED);
- }
- });
+ mHandler.post(() -> killUid(appId, userId, KILL_APP_REASON_GIDS_CHANGED));
}
@Override
public void onPermissionGranted(int uid, int userId) {
@@ -2143,7 +2126,13 @@ public class PackageManagerService extends IPackageManager.Stub
// app's nature doesn't depend on the user, so we can just check
// its browser nature in any user and generalize.
if (packageIsBrowser(packageName, userId)) {
- mSettings.setDefaultBrowserPackageNameLPw(null, userId);
+ // If this browser is restored from user's backup, do not clear
+ // default-browser state for this user
+ final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
+ if (pkgSetting.getInstallReason(userId)
+ != PackageManager.INSTALL_REASON_DEVICE_RESTORE) {
+ mSettings.setDefaultBrowserPackageNameLPw(null, userId);
+ }
}
// We may also need to apply pending (restored) runtime
@@ -2540,13 +2529,11 @@ public class PackageManagerService extends IPackageManager.Stub
requestCopyPreoptedFiles();
}
- String customResolverActivity = Resources.getSystem().getString(
+ String customResolverActivityName = Resources.getSystem().getString(
R.string.config_customResolverActivity);
- if (TextUtils.isEmpty(customResolverActivity)) {
- customResolverActivity = null;
- } else {
+ if (!TextUtils.isEmpty(customResolverActivityName)) {
mCustomResolverComponentName = ComponentName.unflattenFromString(
- customResolverActivity);
+ customResolverActivityName);
}
long startTime = SystemClock.uptimeMillis();
@@ -2584,6 +2571,8 @@ public class PackageManagerService extends IPackageManager.Stub
mIsPreNMR1Upgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N_MR1;
+ int preUpgradeSdkVersion = ver.sdkVersion;
+
// save off the names of pre-existing system packages prior to scanning; we don't
// want to automatically grant runtime permissions for new system apps
if (mPromoteSystemApps) {
@@ -2635,6 +2624,10 @@ public class PackageManagerService extends IPackageManager.Stub
| SCAN_AS_SYSTEM
| SCAN_AS_PRIVILEGED,
0);
+ if (!mPackages.containsKey("android")) {
+ throw new IllegalStateException(
+ "Failed to load frameworks package; check log for warnings");
+ }
// Collect privileged system packages.
final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app");
@@ -3196,6 +3189,58 @@ public class PackageManagerService extends IPackageManager.Stub
checkDefaultBrowser();
+ // If a granted permission is split, all new permissions should be granted too
+ if (mIsUpgrade) {
+ final int callingUid = getCallingUid();
+
+ final int numSplitPerms = PackageParser.SPLIT_PERMISSIONS.length;
+ for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) {
+ final PackageParser.SplitPermissionInfo splitPerm =
+ PackageParser.SPLIT_PERMISSIONS[splitPermNum];
+ final String rootPerm = splitPerm.rootPerm;
+
+ if (preUpgradeSdkVersion >= splitPerm.targetSdk) {
+ continue;
+ }
+
+ final int numPackages = mPackages.size();
+ for (int packageNum = 0; packageNum < numPackages; packageNum++) {
+ final PackageParser.Package pkg = mPackages.valueAt(packageNum);
+
+ if (pkg.applicationInfo.targetSdkVersion >= splitPerm.targetSdk
+ || !pkg.requestedPermissions.contains(rootPerm)) {
+ continue;
+ }
+
+ final int userId = UserHandle.getUserId(pkg.applicationInfo.uid);
+ final String pkgName = pkg.packageName;
+
+ if (checkPermission(rootPerm, pkgName, userId) == PERMISSION_DENIED) {
+ continue;
+ }
+
+ final String[] newPerms = splitPerm.newPerms;
+
+ final int numNewPerms = newPerms.length;
+ for (int newPermNum = 0; newPermNum < numNewPerms; newPermNum++) {
+ final String newPerm = newPerms[newPermNum];
+ if (checkPermission(newPerm, pkgName, userId) == PERMISSION_GRANTED) {
+ continue;
+ }
+
+ if (DEBUG_PERMISSIONS) {
+ Slog.v(TAG, "Granting " + newPerm + " to " + pkgName
+ + " as the root permission " + rootPerm
+ + " is already granted");
+ }
+
+ mPermissionManager.grantRuntimePermission(newPerm, pkgName, true,
+ callingUid, userId, null);
+ }
+ }
+ }
+ }
+
// clear only after permissions and other defaults have been updated
mExistingSystemPackages.clear();
mPromoteSystemApps = false;
@@ -3417,7 +3462,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (ret != PackageManager.INSTALL_SUCCEEDED) {
- if (dstCodePath == null || !dstCodePath.exists()) {
+ if (!dstCodePath.exists()) {
return null;
}
removeCodePathLI(dstCodePath);
@@ -3795,7 +3840,7 @@ public class PackageManagerService extends IPackageManager.Stub
for (ActivityIntentInfo filter : a.intents) {
if (hasValidDomains(filter)) {
if (domains == null) {
- domains = new ArraySet<String>();
+ domains = new ArraySet<>();
}
domains.addAll(filter.getHostsList());
}
@@ -3862,7 +3907,7 @@ public class PackageManagerService extends IPackageManager.Stub
PackageManager.MATCH_ALL, userId);
final int count = list.size();
- List<String> result = new ArrayList<String>(count);
+ List<String> result = new ArrayList<>(count);
for (int i=0; i<count; i++) {
ResolveInfo info = list.get(i);
if (info.activityInfo == null
@@ -3917,16 +3962,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- static int[] appendInts(int[] cur, int[] add) {
- if (add == null) return cur;
- if (cur == null) return add;
- final int N = add.length;
- for (int i=0; i<N; i++) {
- cur = appendInt(cur, add[i]);
- }
- return cur;
- }
-
/**
* Returns whether or not a full application can see an instant application.
* <p>
@@ -3990,7 +4025,7 @@ public class PackageManagerService extends IPackageManager.Stub
? EMPTY_INT_ARRAY : permissionsState.computeGids(userId);
// Compute granted permissions only if package has requested permissions
final Set<String> permissions = ArrayUtils.isEmpty(p.requestedPermissions)
- ? Collections.<String>emptySet() : permissionsState.getPermissions(userId);
+ ? Collections.emptySet() : permissionsState.getPermissions(userId);
PackageInfo packageInfo = PackageParser.generatePackageInfo(p, gids, flags,
ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId);
@@ -4218,7 +4253,7 @@ public class PackageManagerService extends IPackageManager.Stub
* Access may be limited based upon whether the calling or target applications
* are instant applications.
*
- * @see #canAccessInstantApps(int)
+ * @see #canViewInstantApps(int, int)
*/
private boolean filterAppAccessLPr(@Nullable PackageSetting ps, int callingUid,
@Nullable ComponentName component, @ComponentType int componentType, int userId) {
@@ -4275,7 +4310,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
/**
- * @see #filterAppAccessLPr(PackageSetting, int, ComponentName, boolean, int)
+ * @see #filterAppAccessLPr(PackageSetting, int, ComponentName, int, int)
*/
private boolean filterAppAccessLPr(@Nullable PackageSetting ps, int callingUid, int userId) {
return filterAppAccessLPr(ps, callingUid, null, TYPE_UNKNOWN, userId);
@@ -4571,9 +4606,8 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public void deletePreloadsFileCache() {
- if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.SYSTEM_UID)) {
- throw new SecurityException("Only system or settings may call deletePreloadsFileCache");
- }
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE,
+ "deletePreloadsFileCache");
File dir = Environment.getDataPreloadsFileCacheDirectory();
Slog.i(TAG, "Deleting preloaded file cache " + dir);
FileUtils.deleteContents(dir);
@@ -4810,6 +4844,13 @@ public class PackageManagerService extends IPackageManager.Stub
return mActivityManagerInternal;
}
+ private ActivityTaskManagerInternal getActivityTaskManagerInternal() {
+ if (mActivityTaskManagerInternal == null) {
+ mActivityTaskManagerInternal =
+ LocalServices.getService(ActivityTaskManagerInternal.class);
+ }
+ return mActivityTaskManagerInternal;
+ }
private DeviceIdleController.LocalService getDeviceIdleController() {
if (mDeviceIdleController == null) {
@@ -4824,22 +4865,6 @@ public class PackageManagerService extends IPackageManager.Stub
*/
private int updateFlagsForPackage(int flags, int userId, Object cookie) {
final boolean isCallerSystemUser = UserHandle.getCallingUserId() == UserHandle.USER_SYSTEM;
- boolean triaged = true;
- if ((flags & (PackageManager.GET_ACTIVITIES | PackageManager.GET_RECEIVERS
- | PackageManager.GET_SERVICES | PackageManager.GET_PROVIDERS)) != 0) {
- // Caller is asking for component details, so they'd better be
- // asking for specific encryption matching behavior, or be triaged
- if ((flags & (PackageManager.MATCH_DIRECT_BOOT_UNAWARE
- | PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DEBUG_TRIAGED_MISSING)) == 0) {
- triaged = false;
- }
- }
- if ((flags & (PackageManager.MATCH_UNINSTALLED_PACKAGES
- | PackageManager.MATCH_SYSTEM_ONLY
- | PackageManager.MATCH_DEBUG_TRIAGED_MISSING)) == 0) {
- triaged = false;
- }
if ((flags & PackageManager.MATCH_ANY_USER) != 0) {
// require the permission to be held; the calling uid and given user id referring
// to the same user is not sufficient
@@ -4856,10 +4881,6 @@ public class PackageManagerService extends IPackageManager.Stub
// MATCH_UNINSTALLED_PACKAGES to query apps in other profiles. b/31000380
flags |= PackageManager.MATCH_ANY_USER;
}
- if (DEBUG_TRIAGED_MISSING && (Binder.getCallingUid() == Process.SYSTEM_UID) && !triaged) {
- Log.w(TAG, "Caller hasn't been triaged for missing apps; they asked about " + cookie
- + " with flags 0x" + Integer.toHexString(flags), new Throwable());
- }
return updateFlags(flags, userId);
}
@@ -4874,25 +4895,6 @@ public class PackageManagerService extends IPackageManager.Stub
* Update given flags when being used to request {@link ComponentInfo}.
*/
private int updateFlagsForComponent(int flags, int userId, Object cookie) {
- if (cookie instanceof Intent) {
- if ((((Intent) cookie).getFlags() & Intent.FLAG_DEBUG_TRIAGED_MISSING) != 0) {
- flags |= PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
- }
- }
-
- boolean triaged = true;
- // Caller is asking for component details, so they'd better be
- // asking for specific encryption matching behavior, or be triaged
- if ((flags & (PackageManager.MATCH_DIRECT_BOOT_UNAWARE
- | PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DEBUG_TRIAGED_MISSING)) == 0) {
- triaged = false;
- }
- if (DEBUG_TRIAGED_MISSING && (Binder.getCallingUid() == Process.SYSTEM_UID) && !triaged) {
- Log.w(TAG, "Caller hasn't been triaged for missing apps; they asked about " + cookie
- + " with flags 0x" + Integer.toHexString(flags), new Throwable());
- }
-
return updateFlags(flags, userId);
}
@@ -4999,7 +5001,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
private boolean isRecentsAccessingChildProfiles(int callingUid, int targetUserId) {
- if (!getActivityManagerInternal().isCallerRecents(callingUid)) {
+ if (!getActivityTaskManagerInternal().isCallerRecents(callingUid)) {
return false;
}
final long token = Binder.clearCallingIdentity();
@@ -5374,11 +5376,35 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public int checkPermission(String permName, String pkgName, int userId) {
+ final CheckPermissionDelegate checkPermissionDelegate;
+ synchronized (mPackages) {
+ if (mCheckPermissionDelegate == null) {
+ return checkPermissionImpl(permName, pkgName, userId);
+ }
+ checkPermissionDelegate = mCheckPermissionDelegate;
+ }
+ return checkPermissionDelegate.checkPermission(permName, pkgName, userId,
+ PackageManagerService.this::checkPermissionImpl);
+ }
+
+ private int checkPermissionImpl(String permName, String pkgName, int userId) {
return mPermissionManager.checkPermission(permName, pkgName, getCallingUid(), userId);
}
@Override
public int checkUidPermission(String permName, int uid) {
+ final CheckPermissionDelegate checkPermissionDelegate;
+ synchronized (mPackages) {
+ if (mCheckPermissionDelegate == null) {
+ return checkUidPermissionImpl(permName, uid);
+ }
+ checkPermissionDelegate = mCheckPermissionDelegate;
+ }
+ return checkPermissionDelegate.checkUidPermission(permName, uid,
+ PackageManagerService.this::checkUidPermissionImpl);
+ }
+
+ private int checkUidPermissionImpl(String permName, int uid) {
synchronized (mPackages) {
final String[] packageNames = getPackagesForUid(uid);
final PackageParser.Package pkg = (packageNames != null && packageNames.length > 0)
@@ -5800,7 +5826,7 @@ public class PackageManagerService extends IPackageManager.Stub
final int callingUserId = UserHandle.getUserId(callingUid);
synchronized (mPackages) {
if (canViewInstantApps(callingUid, callingUserId)) {
- return new ArrayList<String>(mPackages.keySet());
+ return new ArrayList<>(mPackages.keySet());
}
final String instantAppPkgName = getInstantAppPackageName(callingUid);
final List<String> result = new ArrayList<>();
@@ -6357,6 +6383,17 @@ public class PackageManagerService extends IPackageManager.Stub
return null;
}
+ private boolean isHomeIntent(Intent intent) {
+ return ACTION_MAIN.equals(intent.getAction())
+ && intent.hasCategory(CATEGORY_HOME)
+ && intent.hasCategory(CATEGORY_DEFAULT);
+ }
+
+ private boolean isDeviceProvisioned() {
+ return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
+ android.provider.Settings.Global.DEVICE_PROVISIONED, 0) == 1;
+ }
+
// TODO: handle preferred activities missing while user has amnesia
ResolveInfo findPreferredActivity(Intent intent, String resolvedType, int flags,
List<ResolveInfo> query, int priority, boolean always,
@@ -6441,7 +6478,15 @@ public class PackageManagerService extends IPackageManager.Stub
Slog.v(TAG, " null");
}
}
+ final boolean excludeSetupWizardHomeActivity = isHomeIntent(intent)
+ && !isDeviceProvisioned();
if (ai == null) {
+ // Do not remove launcher's preferred activity during SetupWizard
+ // due to it may not install yet
+ if (excludeSetupWizardHomeActivity) {
+ continue;
+ }
+
// This previously registered preferred activity
// component is no longer known. Most likely an update
// to the app was installed and in the new version this
@@ -6477,25 +6522,34 @@ public class PackageManagerService extends IPackageManager.Stub
// was created, and is not a subset of the preferred set, we need to
// clear it and re-ask the user their preference, if we're looking for
// an "always" type entry.
- if (always && !pa.mPref.sameSet(query)) {
- if (pa.mPref.isSuperset(query)) {
- // some components of the set are no longer present in
- // the query, but the preferred activity can still be reused
- if (DEBUG_PREFERRED) {
- Slog.i(TAG, "Result set changed, but PreferredActivity is"
- + " still valid as only non-preferred components"
- + " were removed for " + intent + " type "
- + resolvedType);
+
+ if (always && !pa.mPref.sameSet(query, excludeSetupWizardHomeActivity)) {
+ if (pa.mPref.isSuperset(query, excludeSetupWizardHomeActivity)) {
+ if (!excludeSetupWizardHomeActivity) {
+ // some components of the set are no longer present in
+ // the query, but the preferred activity can still be reused
+ if (DEBUG_PREFERRED) {
+ Slog.i(TAG, "Result set changed, but PreferredActivity"
+ + " is still valid as only non-preferred"
+ + " components were removed for " + intent
+ + " type " + resolvedType);
+ }
+ // remove obsolete components and re-add the up-to-date
+ // filter
+ PreferredActivity freshPa = new PreferredActivity(pa,
+ pa.mPref.mMatch,
+ pa.mPref.discardObsoleteComponents(query),
+ pa.mPref.mComponent,
+ pa.mPref.mAlways);
+ pir.removeFilter(pa);
+ pir.addFilter(freshPa);
+ changed = true;
+ } else {
+ if (DEBUG_PREFERRED) {
+ Slog.i(TAG, "Do not remove preferred activity for launcher"
+ + " during SetupWizard");
+ }
}
- // remove obsolete components and re-add the up-to-date filter
- PreferredActivity freshPa = new PreferredActivity(pa,
- pa.mPref.mMatch,
- pa.mPref.discardObsoleteComponents(query),
- pa.mPref.mComponent,
- pa.mPref.mAlways);
- pir.removeFilter(pa);
- pir.addFilter(freshPa);
- changed = true;
} else {
Slog.i(TAG,
"Result set changed, dropping preferred activity for "
@@ -6644,7 +6698,7 @@ public class PackageManagerService extends IPackageManager.Stub
flags = updateFlagsForResolve(flags, userId, intent, filterCallingUid, resolveForStart,
comp != null || pkgName != null /*onlyExposedExplicitly*/);
if (comp != null) {
- final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
+ final List<ResolveInfo> list = new ArrayList<>(1);
final ActivityInfo ai = getActivityInfo(comp, flags, userId);
if (ai != null) {
// When specifying an explicit component, we prevent the activity from being
@@ -6700,7 +6754,7 @@ public class PackageManagerService extends IPackageManager.Stub
ResolveInfo xpResolveInfo = querySkipCurrentProfileIntents(matchingFilters, intent,
resolvedType, flags, userId);
if (xpResolveInfo != null) {
- List<ResolveInfo> xpResult = new ArrayList<ResolveInfo>(1);
+ List<ResolveInfo> xpResult = new ArrayList<>(1);
xpResult.add(xpResolveInfo);
return applyPostResolutionFilter(
filterIfNotSystemUser(xpResult, userId), instantAppPkgName,
@@ -7125,12 +7179,12 @@ public class PackageManagerService extends IPackageManager.Stub
candidates.size());
}
- ArrayList<ResolveInfo> result = new ArrayList<ResolveInfo>();
- ArrayList<ResolveInfo> alwaysList = new ArrayList<ResolveInfo>();
- ArrayList<ResolveInfo> undefinedList = new ArrayList<ResolveInfo>();
- ArrayList<ResolveInfo> alwaysAskList = new ArrayList<ResolveInfo>();
- ArrayList<ResolveInfo> neverList = new ArrayList<ResolveInfo>();
- ArrayList<ResolveInfo> matchAllList = new ArrayList<ResolveInfo>();
+ final ArrayList<ResolveInfo> result = new ArrayList<>();
+ final ArrayList<ResolveInfo> alwaysList = new ArrayList<>();
+ final ArrayList<ResolveInfo> undefinedList = new ArrayList<>();
+ final ArrayList<ResolveInfo> alwaysAskList = new ArrayList<>();
+ final ArrayList<ResolveInfo> neverList = new ArrayList<>();
+ final ArrayList<ResolveInfo> matchAllList = new ArrayList<>();
synchronized (mPackages) {
final int count = candidates.size();
@@ -7605,7 +7659,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (comp != null) {
- final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
+ final List<ResolveInfo> list = new ArrayList<>(1);
final ActivityInfo ai = getReceiverInfo(comp, flags, userId);
if (ai != null) {
// When specifying an explicit component, we prevent the activity from being
@@ -7719,7 +7773,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (comp != null) {
- final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
+ final List<ResolveInfo> list = new ArrayList<>(1);
final ServiceInfo si = getServiceInfo(comp, flags, userId);
if (si != null) {
// When specifying an explicit component, we prevent the service from being
@@ -7837,7 +7891,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
if (comp != null) {
- final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
+ final List<ResolveInfo> list = new ArrayList<>(1);
final ProviderInfo pi = getProviderInfo(comp, flags, userId);
if (pi != null) {
// When specifying an explicit component, we prevent the provider from being
@@ -8036,7 +8090,7 @@ public class PackageManagerService extends IPackageManager.Stub
// writer
synchronized (mPackages) {
- ArrayList<PackageInfo> list = new ArrayList<PackageInfo>();
+ ArrayList<PackageInfo> list = new ArrayList<>();
boolean[] tmpBools = new boolean[permissions.length];
if (listUninstalled) {
for (PackageSetting ps : mSettings.mPackages.values()) {
@@ -8053,7 +8107,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- return new ParceledListSlice<PackageInfo>(list);
+ return new ParceledListSlice<>(list);
}
}
@@ -8254,7 +8308,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
private @NonNull List<ApplicationInfo> getPersistentApplicationsInternal(int flags) {
- final ArrayList<ApplicationInfo> finalList = new ArrayList<ApplicationInfo>();
+ final ArrayList<ApplicationInfo> finalList = new ArrayList<>();
// reader
synchronized (mPackages) {
@@ -8383,7 +8437,7 @@ public class PackageManagerService extends IPackageManager.Stub
continue;
}
if (finalList == null) {
- finalList = new ArrayList<ProviderInfo>(3);
+ finalList = new ArrayList<>(3);
}
ProviderInfo info = PackageParser.generateProviderInfo(p, flags,
ps.readUserState(userId), userId);
@@ -8395,8 +8449,8 @@ public class PackageManagerService extends IPackageManager.Stub
}
if (finalList != null) {
- Collections.sort(finalList, mProviderInitOrderSorter);
- return new ParceledListSlice<ProviderInfo>(finalList);
+ finalList.sort(mProviderInitOrderSorter);
+ return new ParceledListSlice<>(finalList);
}
return ParceledListSlice.emptyList();
@@ -8432,7 +8486,7 @@ public class PackageManagerService extends IPackageManager.Stub
private @NonNull List<InstrumentationInfo> queryInstrumentationInternal(String targetPackage,
int flags) {
- ArrayList<InstrumentationInfo> finalList = new ArrayList<InstrumentationInfo>();
+ ArrayList<InstrumentationInfo> finalList = new ArrayList<>();
// reader
synchronized (mPackages) {
@@ -8509,10 +8563,8 @@ public class PackageManagerService extends IPackageManager.Stub
renameStaticSharedLibraryPackage(parseResult.pkg);
}
try {
- if (errorCode == PackageManager.INSTALL_SUCCEEDED) {
- scanPackageChildLI(parseResult.pkg, parseFlags, scanFlags,
- currentTime, null);
- }
+ scanPackageChildLI(parseResult.pkg, parseFlags, scanFlags,
+ currentTime, null);
} catch (PackageManagerException e) {
errorCode = e.error;
Slog.w(TAG, "Failed to scan " + parseResult.scanFile + ": " + e.getMessage());
@@ -8714,7 +8766,7 @@ public class PackageManagerService extends IPackageManager.Stub
* match one in a trusted source, and should be done separately.
*/
private boolean canSkipFullApkVerification(String apkPath) {
- byte[] rootHashObserved = null;
+ final byte[] rootHashObserved;
try {
rootHashObserved = VerityUtils.generateFsverityRootHash(apkPath);
if (rootHashObserved == null) {
@@ -8980,7 +9032,7 @@ public class PackageManagerService extends IPackageManager.Stub
* @param message used as message if SecurityException is thrown
* @throws SecurityException if the caller is not system or root
*/
- private static final void enforceSystemOrRoot(String message) {
+ private static void enforceSystemOrRoot(String message) {
final int uid = Binder.getCallingUid();
if (uid != Process.SYSTEM_UID && uid != Process.ROOT_UID) {
throw new SecurityException(message);
@@ -9245,6 +9297,16 @@ public class PackageManagerService extends IPackageManager.Stub
}
@GuardedBy("mPackages")
+ public CheckPermissionDelegate getCheckPermissionDelegateLocked() {
+ return mCheckPermissionDelegate;
+ }
+
+ @GuardedBy("mPackages")
+ public void setCheckPermissionDelegateLocked(CheckPermissionDelegate delegate) {
+ mCheckPermissionDelegate = delegate;
+ }
+
+ @GuardedBy("mPackages")
private void notifyPackageUseLocked(String packageName, int reason) {
final PackageParser.Package p = mPackages.get(packageName);
if (p == null) {
@@ -9383,7 +9445,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
public ArraySet<String> getOptimizablePackages() {
- ArraySet<String> pkgs = new ArraySet<String>();
+ ArraySet<String> pkgs = new ArraySet<>();
synchronized (mPackages) {
for (PackageParser.Package p : mPackages.values()) {
if (PackageDexOptimizer.canOptimizePackage(p)) {
@@ -10362,9 +10424,12 @@ public class PackageManagerService extends IPackageManager.Stub
compareSignatures(
signatureCheckPs.sharedUser.signatures.mSigningDetails.signatures,
pkg.mSigningDetails.signatures) != PackageManager.SIGNATURE_MATCH) {
- throw new PackageManagerException(
- INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES,
- "Signature mismatch for shared user: " + pkgSetting.sharedUser);
+ // Treat mismatched signatures on system packages using a shared UID as
+ // fatal for the system overall, rather than just failing to install
+ // whichever package happened to be scanned later.
+ throw new IllegalStateException(
+ "Signature mismatch on system package " + pkg.packageName
+ + " for shared user " + pkgSetting.sharedUser);
}
signatureCheckPs.sharedUser.signatures.mSigningDetails = pkg.mSigningDetails;
@@ -10375,12 +10440,11 @@ public class PackageManagerService extends IPackageManager.Stub
+ " signature changed; retaining data.";
reportSettingsProblem(Log.WARN, msg);
} catch (IllegalArgumentException e) {
-
// should never happen: certs matched when checking, but not when comparing
// old to new for sharedUser
- throw new PackageManagerException(INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES,
+ throw new RuntimeException(
"Signing certificates comparison made on incomparable signing details"
- + " but somehow passed verifySignatures!");
+ + " but somehow passed verifySignatures!", e);
}
}
@@ -12406,7 +12470,8 @@ public class PackageManagerService extends IPackageManager.Stub
if (DEBUG_REMOVE) Log.d(TAG, " Activities: " + r);
}
- mPermissionManager.removeAllPermissions(pkg, chatty);
+ final ArrayList<String> allPackageNames = new ArrayList<>(mPackages.keySet());
+ mPermissionManager.removeAllPermissions(pkg, allPackageNames, mPermissionCallback, chatty);
N = pkg.instrumentation.size();
r = null;
@@ -12957,9 +13022,7 @@ public class PackageManagerService extends IPackageManager.Stub
if ((mFlags&PackageManager.GET_RESOLVED_FILTER) != 0) {
res.filter = info;
}
- if (info != null) {
- res.handleAllWebDataURI = info.handleAllWebDataURI();
- }
+ res.handleAllWebDataURI = info.handleAllWebDataURI();
res.priority = info.getPriority();
res.preferredOrder = activity.owner.mPreferredOrder;
//System.out.println("Result: " + res.activityInfo.className +
@@ -12981,7 +13044,7 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
protected void sortResults(List<ResolveInfo> results) {
- Collections.sort(results, mResolvePrioritySorter);
+ results.sort(mResolvePrioritySorter);
}
@Override
@@ -13014,7 +13077,7 @@ public class PackageManagerService extends IPackageManager.Stub
// Keys are String (activity class name), values are Activity.
private final ArrayMap<ComponentName, PackageParser.Activity> mActivities
- = new ArrayMap<ComponentName, PackageParser.Activity>();
+ = new ArrayMap<>();
private int mFlags;
}
@@ -13044,8 +13107,7 @@ public class PackageManagerService extends IPackageManager.Stub
mFlags = flags;
final boolean defaultOnly = (flags&PackageManager.MATCH_DEFAULT_ONLY) != 0;
final int N = packageServices.size();
- ArrayList<PackageParser.ServiceIntentInfo[]> listCut =
- new ArrayList<PackageParser.ServiceIntentInfo[]>(N);
+ ArrayList<PackageParser.ServiceIntentInfo[]> listCut = new ArrayList<>(N);
ArrayList<PackageParser.ServiceIntentInfo> intentFilters;
for (int i = 0; i < N; ++i) {
@@ -13198,7 +13260,7 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
protected void sortResults(List<ResolveInfo> results) {
- Collections.sort(results, mResolvePrioritySorter);
+ results.sort(mResolvePrioritySorter);
}
@Override
@@ -13247,8 +13309,7 @@ public class PackageManagerService extends IPackageManager.Stub
// }
// Keys are String (activity class name), values are Activity.
- private final ArrayMap<ComponentName, PackageParser.Service> mServices
- = new ArrayMap<ComponentName, PackageParser.Service>();
+ private final ArrayMap<ComponentName, PackageParser.Service> mServices = new ArrayMap<>();
private int mFlags;
}
@@ -13280,8 +13341,7 @@ public class PackageManagerService extends IPackageManager.Stub
mFlags = flags;
final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0;
final int N = packageProviders.size();
- ArrayList<PackageParser.ProviderIntentInfo[]> listCut =
- new ArrayList<PackageParser.ProviderIntentInfo[]>(N);
+ ArrayList<PackageParser.ProviderIntentInfo[]> listCut = new ArrayList<>(N);
ArrayList<PackageParser.ProviderIntentInfo> intentFilters;
for (int i = 0; i < N; ++i) {
@@ -13441,7 +13501,7 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
protected void sortResults(List<ResolveInfo> results) {
- Collections.sort(results, mResolvePrioritySorter);
+ results.sort(mResolvePrioritySorter);
}
@Override
@@ -13474,7 +13534,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
private final ArrayMap<ComponentName, PackageParser.Provider> mProviders
- = new ArrayMap<ComponentName, PackageParser.Provider>();
+ = new ArrayMap<>();
private int mFlags;
}
@@ -13559,78 +13619,69 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- private static final Comparator<ResolveInfo> mResolvePrioritySorter =
- new Comparator<ResolveInfo>() {
- public int compare(ResolveInfo r1, ResolveInfo r2) {
- int v1 = r1.priority;
- int v2 = r2.priority;
- //System.out.println("Comparing: q1=" + q1 + " q2=" + q2);
- if (v1 != v2) {
- return (v1 > v2) ? -1 : 1;
- }
- v1 = r1.preferredOrder;
- v2 = r2.preferredOrder;
- if (v1 != v2) {
- return (v1 > v2) ? -1 : 1;
- }
- if (r1.isDefault != r2.isDefault) {
- return r1.isDefault ? -1 : 1;
- }
- v1 = r1.match;
- v2 = r2.match;
- //System.out.println("Comparing: m1=" + m1 + " m2=" + m2);
- if (v1 != v2) {
- return (v1 > v2) ? -1 : 1;
- }
- if (r1.system != r2.system) {
- return r1.system ? -1 : 1;
- }
- if (r1.activityInfo != null) {
- return r1.activityInfo.packageName.compareTo(r2.activityInfo.packageName);
- }
- if (r1.serviceInfo != null) {
- return r1.serviceInfo.packageName.compareTo(r2.serviceInfo.packageName);
- }
- if (r1.providerInfo != null) {
- return r1.providerInfo.packageName.compareTo(r2.providerInfo.packageName);
- }
- return 0;
+ private static final Comparator<ResolveInfo> mResolvePrioritySorter = (r1, r2) -> {
+ int v1 = r1.priority;
+ int v2 = r2.priority;
+ //System.out.println("Comparing: q1=" + q1 + " q2=" + q2);
+ if (v1 != v2) {
+ return (v1 > v2) ? -1 : 1;
+ }
+ v1 = r1.preferredOrder;
+ v2 = r2.preferredOrder;
+ if (v1 != v2) {
+ return (v1 > v2) ? -1 : 1;
+ }
+ if (r1.isDefault != r2.isDefault) {
+ return r1.isDefault ? -1 : 1;
+ }
+ v1 = r1.match;
+ v2 = r2.match;
+ //System.out.println("Comparing: m1=" + m1 + " m2=" + m2);
+ if (v1 != v2) {
+ return (v1 > v2) ? -1 : 1;
+ }
+ if (r1.system != r2.system) {
+ return r1.system ? -1 : 1;
+ }
+ if (r1.activityInfo != null) {
+ return r1.activityInfo.packageName.compareTo(r2.activityInfo.packageName);
+ }
+ if (r1.serviceInfo != null) {
+ return r1.serviceInfo.packageName.compareTo(r2.serviceInfo.packageName);
}
+ if (r1.providerInfo != null) {
+ return r1.providerInfo.packageName.compareTo(r2.providerInfo.packageName);
+ }
+ return 0;
};
- private static final Comparator<ProviderInfo> mProviderInitOrderSorter =
- new Comparator<ProviderInfo>() {
- public int compare(ProviderInfo p1, ProviderInfo p2) {
- final int v1 = p1.initOrder;
- final int v2 = p2.initOrder;
- return (v1 > v2) ? -1 : ((v1 < v2) ? 1 : 0);
- }
+ private static final Comparator<ProviderInfo> mProviderInitOrderSorter = (p1, p2) -> {
+ final int v1 = p1.initOrder;
+ final int v2 = p2.initOrder;
+ return (v1 > v2) ? -1 : ((v1 < v2) ? 1 : 0);
};
@Override
public void sendPackageBroadcast(final String action, final String pkg, final Bundle extras,
final int flags, final String targetPkg, final IIntentReceiver finishedReceiver,
final int[] userIds, int[] instantUserIds) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- try {
- final IActivityManager am = ActivityManager.getService();
- if (am == null) return;
- final int[] resolvedUserIds;
- if (userIds == null) {
- resolvedUserIds = am.getRunningUserIds();
- } else {
- resolvedUserIds = userIds;
- }
+ mHandler.post(() -> {
+ try {
+ final IActivityManager am = ActivityManager.getService();
+ if (am == null) return;
+ final int[] resolvedUserIds;
+ if (userIds == null) {
+ resolvedUserIds = am.getRunningUserIds();
+ } else {
+ resolvedUserIds = userIds;
+ }
+ doSendBroadcast(am, action, pkg, extras, flags, targetPkg, finishedReceiver,
+ resolvedUserIds, false);
+ if (instantUserIds != null && instantUserIds != EMPTY_INT_ARRAY) {
doSendBroadcast(am, action, pkg, extras, flags, targetPkg, finishedReceiver,
- resolvedUserIds, false);
- if (instantUserIds != null && instantUserIds != EMPTY_INT_ARRAY) {
- doSendBroadcast(am, action, pkg, extras, flags, targetPkg, finishedReceiver,
- instantUserIds, true);
- }
- } catch (RemoteException ex) {
+ instantUserIds, true);
}
+ } catch (RemoteException ex) {
}
});
}
@@ -14029,6 +14080,68 @@ public class PackageManagerService extends IPackageManager.Stub
return false;
}
+ @Override
+ public void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) {
+ enforceSystemOrPhoneCaller("setSystemAppHiddenUntilInstalled");
+ synchronized (mPackages) {
+ final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
+ if (pkgSetting == null || !pkgSetting.isSystem()) {
+ return;
+ }
+ PackageParser.Package pkg = pkgSetting.pkg;
+ if (pkg != null && pkg.applicationInfo != null) {
+ pkg.applicationInfo.hiddenUntilInstalled = hidden;
+ }
+ final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(packageName);
+ if (disabledPs == null) {
+ return;
+ }
+ pkg = disabledPs.pkg;
+ if (pkg != null && pkg.applicationInfo != null) {
+ pkg.applicationInfo.hiddenUntilInstalled = hidden;
+ }
+ }
+ }
+
+ @Override
+ public boolean setSystemAppInstallState(String packageName, boolean installed, int userId) {
+ enforceSystemOrPhoneCaller("setSystemAppInstallState");
+ synchronized (mPackages) {
+ final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
+ // The target app should always be in system
+ if (pkgSetting == null || !pkgSetting.isSystem()) {
+ return false;
+ }
+ // Check if the install state is the same
+ if (pkgSetting.getInstalled(userId) == installed) {
+ return false;
+ }
+ }
+
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ if (installed) {
+ // install the app from uninstalled state
+ installExistingPackageAsUser(
+ packageName,
+ userId,
+ 0 /*installFlags*/,
+ PackageManager.INSTALL_REASON_DEVICE_SETUP);
+ return true;
+ }
+
+ // uninstall the app from installed state
+ deletePackageVersioned(
+ new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
+ new LegacyPackageDeleteObserver(null).getBinder(),
+ userId,
+ PackageManager.DELETE_SYSTEM_APP);
+ return true;
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ }
+
private void sendApplicationHiddenForUser(String packageName, PackageSetting pkgSetting,
int userId) {
final PackageRemovedInfo info = new PackageRemovedInfo(this);
@@ -14093,10 +14206,16 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public int installExistingPackageAsUser(String packageName, int userId, int installFlags,
int installReason) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES,
- null);
- PackageSetting pkgSetting;
final int callingUid = Binder.getCallingUid();
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES)
+ != PackageManager.PERMISSION_GRANTED
+ && mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.INSTALL_EXISTING_PACKAGES)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Neither user " + callingUid + " nor current process has "
+ + android.Manifest.permission.INSTALL_PACKAGES + ".");
+ }
+ PackageSetting pkgSetting;
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, true /* checkShell */,
"installExistingPackage for user " + userId);
@@ -14297,25 +14416,22 @@ public class PackageManagerService extends IPackageManager.Stub
} else {
action = Intent.ACTION_MY_PACKAGE_UNSUSPENDED;
}
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- try {
- final IActivityManager am = ActivityManager.getService();
- if (am == null) {
- Slog.wtf(TAG, "IActivityManager null. Cannot send MY_PACKAGE_ "
- + (suspended ? "" : "UN") + "SUSPENDED broadcasts");
- return;
- }
- final int[] targetUserIds = new int[] {userId};
- for (String packageName : affectedPackages) {
- doSendBroadcast(am, action, null, intentExtras,
- Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, packageName, null,
- targetUserIds, false);
- }
- } catch (RemoteException ex) {
- // Shouldn't happen as AMS is in the same process.
+ mHandler.post(() -> {
+ try {
+ final IActivityManager am = ActivityManager.getService();
+ if (am == null) {
+ Slog.wtf(TAG, "IActivityManager null. Cannot send MY_PACKAGE_ "
+ + (suspended ? "" : "UN") + "SUSPENDED broadcasts");
+ return;
+ }
+ final int[] targetUserIds = new int[] {userId};
+ for (String packageName : affectedPackages) {
+ doSendBroadcast(am, action, null, intentExtras,
+ Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, packageName, null,
+ targetUserIds, false);
}
+ } catch (RemoteException ex) {
+ // Shouldn't happen as AMS is in the same process.
}
});
}
@@ -14563,7 +14679,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
final int N = pkgInfo.verifiers.length;
- final List<ComponentName> sufficientVerifiers = new ArrayList<ComponentName>(N + 1);
+ final List<ComponentName> sufficientVerifiers = new ArrayList<>(N + 1);
for (int i = 0; i < N; i++) {
final VerifierInfo verifierInfo = pkgInfo.verifiers[i];
@@ -15073,36 +15189,33 @@ public class PackageManagerService extends IPackageManager.Stub
// are coherent. In the non-restore case, the app has already completed install
// and been launched through some other means, so it is not in a problematic
// state for observers to see the FIRST_LAUNCH signal.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- for (int i = 0; i < mRunningInstalls.size(); i++) {
- final PostInstallData data = mRunningInstalls.valueAt(i);
- if (data.res.returnCode != PackageManager.INSTALL_SUCCEEDED) {
- continue;
- }
- if (packageName.equals(data.res.pkg.applicationInfo.packageName)) {
- // right package; but is it for the right user?
- for (int uIndex = 0; uIndex < data.res.newUsers.length; uIndex++) {
- if (userId == data.res.newUsers[uIndex]) {
- if (DEBUG_BACKUP) {
- Slog.i(TAG, "Package " + packageName
- + " being restored so deferring FIRST_LAUNCH");
- }
- return;
+ mHandler.post(() -> {
+ for (int i = 0; i < mRunningInstalls.size(); i++) {
+ final PostInstallData data = mRunningInstalls.valueAt(i);
+ if (data.res.returnCode != PackageManager.INSTALL_SUCCEEDED) {
+ continue;
+ }
+ if (packageName.equals(data.res.pkg.applicationInfo.packageName)) {
+ // right package; but is it for the right user?
+ for (int uIndex = 0; uIndex < data.res.newUsers.length; uIndex++) {
+ if (userId == data.res.newUsers[uIndex]) {
+ if (DEBUG_BACKUP) {
+ Slog.i(TAG, "Package " + packageName
+ + " being restored so deferring FIRST_LAUNCH");
}
+ return;
}
}
}
- // didn't find it, so not being restored
- if (DEBUG_BACKUP) {
- Slog.i(TAG, "Package " + packageName + " sending normal FIRST_LAUNCH");
- }
- final boolean isInstantApp = isInstantApp(packageName, userId);
- final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId };
- final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
- sendFirstLaunchBroadcast(packageName, installerPackage, userIds, instantUserIds);
}
+ // didn't find it, so not being restored
+ if (DEBUG_BACKUP) {
+ Slog.i(TAG, "Package " + packageName + " sending normal FIRST_LAUNCH");
+ }
+ final boolean isInstantApp = isInstantApp(packageName, userId);
+ final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId };
+ final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
+ sendFirstLaunchBroadcast(packageName, installerPackage, userIds, instantUserIds);
});
}
@@ -15196,15 +15309,13 @@ public class PackageManagerService extends IPackageManager.Stub
final File file;
/**
- * Flag indicating that {@link #file} or {@link #cid} has already been
- * staged, meaning downstream users don't need to defensively copy the
- * contents.
+ * Flag indicating that {@link #file} has already been staged, meaning downstream users
+ * don't need to defensively copy the contents.
*/
final boolean staged;
/**
- * Flag indicating that {@link #file} or {@link #cid} is an already
- * installed app that is being moved.
+ * Flag indicating that {@link #file} is an already installed app that is being moved.
*/
final boolean existing;
@@ -15815,7 +15926,7 @@ public class PackageManagerService extends IPackageManager.Stub
* Rename package into final resting place. All paths on the given
* scanned package should be updated to reflect the rename.
*/
- abstract boolean doRename(int status, PackageParser.Package pkg, String oldCodePath);
+ abstract boolean doRename(int status, PackageParser.Package pkg);
abstract int doPostInstall(int status, int uid);
/** @see PackageSettingBase#codePathString */
@@ -15962,8 +16073,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
};
- int ret = PackageManager.INSTALL_SUCCEEDED;
- ret = imcs.copyPackage(origin.file.getAbsolutePath(), target);
+ int ret = imcs.copyPackage(origin.file.getAbsolutePath(), target);
if (ret != PackageManager.INSTALL_SUCCEEDED) {
Slog.e(TAG, "Failed to copy package");
return ret;
@@ -15992,7 +16102,7 @@ public class PackageManagerService extends IPackageManager.Stub
return status;
}
- boolean doRename(int status, PackageParser.Package pkg, String oldCodePath) {
+ boolean doRename(int status, PackageParser.Package pkg) {
if (status != PackageManager.INSTALL_SUCCEEDED) {
cleanUp();
return false;
@@ -16108,17 +16218,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
/**
- * Extract the StorageManagerService "container ID" from the full code path of an
- * .apk.
- */
- static String cidFromCodePath(String fullCodePath) {
- int eidx = fullCodePath.lastIndexOf("/");
- String subStr1 = fullCodePath.substring(0, eidx);
- int sidx = subStr1.lastIndexOf("/");
- return subStr1.substring(sidx+1, eidx);
- }
-
- /**
* Logic to handle movement of existing installed applications.
*/
class MoveInstallArgs extends InstallArgs {
@@ -16162,7 +16261,7 @@ public class PackageManagerService extends IPackageManager.Stub
return status;
}
- boolean doRename(int status, PackageParser.Package pkg, String oldCodePath) {
+ boolean doRename(int status, PackageParser.Package pkg) {
if (status != PackageManager.INSTALL_SUCCEEDED) {
cleanUp(move.toUuid);
return false;
@@ -16229,51 +16328,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- static String getAsecPackageName(String packageCid) {
- int idx = packageCid.lastIndexOf("-");
- if (idx == -1) {
- return packageCid;
- }
- return packageCid.substring(0, idx);
- }
-
- // Utility method used to create code paths based on package name and available index.
- private static String getNextCodePath(String oldCodePath, String prefix, String suffix) {
- String idxStr = "";
- int idx = 1;
- // Fall back to default value of idx=1 if prefix is not
- // part of oldCodePath
- if (oldCodePath != null) {
- String subStr = oldCodePath;
- // Drop the suffix right away
- if (suffix != null && subStr.endsWith(suffix)) {
- subStr = subStr.substring(0, subStr.length() - suffix.length());
- }
- // If oldCodePath already contains prefix find out the
- // ending index to either increment or decrement.
- int sidx = subStr.lastIndexOf(prefix);
- if (sidx != -1) {
- subStr = subStr.substring(sidx + prefix.length());
- if (subStr != null) {
- if (subStr.startsWith(INSTALL_PACKAGE_SUFFIX)) {
- subStr = subStr.substring(INSTALL_PACKAGE_SUFFIX.length());
- }
- try {
- idx = Integer.parseInt(subStr);
- if (idx <= 1) {
- idx++;
- } else {
- idx--;
- }
- } catch(NumberFormatException e) {
- }
- }
- }
- }
- idxStr = INSTALL_PACKAGE_SUFFIX + Integer.toString(idx);
- return prefix + idxStr;
- }
-
private File getNextCodePath(File targetDir, String packageName) {
File result;
SecureRandom random = new SecureRandom();
@@ -16484,7 +16538,7 @@ public class PackageManagerService extends IPackageManager.Stub
// don't allow a system upgrade unless the upgrade hash matches
if (oldPackage.restrictUpdateHash != null && oldPackage.isSystem()) {
- byte[] digestBytes = null;
+ final byte[] digestBytes;
try {
final MessageDigest digest = MessageDigest.getInstance("SHA-512");
updateDigest(digest, new File(pkg.baseCodePath));
@@ -16609,18 +16663,10 @@ public class PackageManagerService extends IPackageManager.Stub
boolean sysPkg = (isSystemApp(oldPackage));
if (sysPkg) {
// Set the system/privileged/oem/vendor/product flags as needed
- final boolean privileged =
- (oldPackage.applicationInfo.privateFlags
- & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
- final boolean oem =
- (oldPackage.applicationInfo.privateFlags
- & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
- final boolean vendor =
- (oldPackage.applicationInfo.privateFlags
- & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
- final boolean product =
- (oldPackage.applicationInfo.privateFlags
- & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
+ final boolean privileged = isPrivilegedApp(oldPackage);
+ final boolean oem = isOemApp(oldPackage);
+ final boolean vendor = isVendorApp(oldPackage);
+ final boolean product = isProductApp(oldPackage);
final @ParseFlags int systemParseFlags = parseFlags;
final @ScanFlags int systemScanFlags = scanFlags
| SCAN_AS_SYSTEM
@@ -16671,7 +16717,7 @@ public class PackageManagerService extends IPackageManager.Stub
Slog.i(TAG, "upgrading pkg " + deletedPackage + " is ASEC-hosted -> UNAVAILABLE");
}
final int[] uidArray = new int[] { deletedPackage.applicationInfo.uid };
- final ArrayList<String> pkgList = new ArrayList<String>(1);
+ final ArrayList<String> pkgList = new ArrayList<>(1);
pkgList.add(deletedPackage.applicationInfo.packageName);
sendResourcesChangedBroadcast(false, true, pkgList, uidArray, null);
}
@@ -17280,7 +17326,6 @@ public class PackageManagerService extends IPackageManager.Stub
// Get rid of all references to package scan path via parser.
pp = null;
- String oldCodePath = null;
boolean systemApp = false;
synchronized (mPackages) {
// Check if installing already existing package
@@ -17393,7 +17438,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- oldCodePath = mSettings.mPackages.get(pkgName).codePathString;
if (ps.pkg != null && ps.pkg.applicationInfo != null) {
systemApp = (ps.pkg.applicationInfo.flags &
ApplicationInfo.FLAG_SYSTEM) != 0;
@@ -17543,7 +17587,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- if (!args.doRename(res.returnCode, pkg, oldCodePath)) {
+ if (!args.doRename(res.returnCode, pkg)) {
res.setError(INSTALL_FAILED_INSUFFICIENT_STORAGE, "Failed rename");
return;
}
@@ -17900,11 +17944,8 @@ public class PackageManagerService extends IPackageManager.Stub
}
private void deleteTempPackageFiles() {
- final FilenameFilter filter = new FilenameFilter() {
- public boolean accept(File dir, String name) {
- return name.startsWith("vmdl") && name.endsWith(".tmp");
- }
- };
+ final FilenameFilter filter =
+ (dir, name) -> name.startsWith("vmdl") && name.endsWith(".tmp");
for (File file : sDrmAppPrivateInstallDir.listFiles(filter)) {
file.delete();
}
@@ -17941,17 +17982,19 @@ public class PackageManagerService extends IPackageManager.Stub
final int uid = Binder.getCallingUid();
if (!isOrphaned(internalPackageName)
&& !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) {
- try {
- final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
- intent.setData(Uri.fromParts(PACKAGE_SCHEME, packageName, null));
- intent.putExtra(PackageInstaller.EXTRA_CALLBACK, observer.asBinder());
- observer.onUserActionRequired(intent);
- } catch (RemoteException re) {
- }
+ mHandler.post(() -> {
+ try {
+ final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
+ intent.setData(Uri.fromParts(PACKAGE_SCHEME, packageName, null));
+ intent.putExtra(PackageInstaller.EXTRA_CALLBACK, observer.asBinder());
+ observer.onUserActionRequired(intent);
+ } catch (RemoteException re) {
+ }
+ });
return;
}
final boolean deleteAllUsers = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0;
- final int[] users = deleteAllUsers ? sUserManager.getUserIds() : new int[]{ userId };
+ final int[] users = deleteAllUsers ? sUserManager.getUserIds() : new int[]{userId};
if (UserHandle.getUserId(uid) != userId || (deleteAllUsers && users.length > 1)) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
@@ -17959,20 +18002,24 @@ public class PackageManagerService extends IPackageManager.Stub
}
if (isUserRestricted(userId, UserManager.DISALLOW_UNINSTALL_APPS)) {
- try {
- observer.onPackageDeleted(packageName,
- PackageManager.DELETE_FAILED_USER_RESTRICTED, null);
- } catch (RemoteException re) {
- }
+ mHandler.post(() -> {
+ try {
+ observer.onPackageDeleted(packageName,
+ PackageManager.DELETE_FAILED_USER_RESTRICTED, null);
+ } catch (RemoteException re) {
+ }
+ });
return;
}
if (!deleteAllUsers && getBlockUninstallForUser(internalPackageName, userId)) {
- try {
- observer.onPackageDeleted(packageName,
- PackageManager.DELETE_FAILED_OWNER_BLOCKED, null);
- } catch (RemoteException re) {
- }
+ mHandler.post(() -> {
+ try {
+ observer.onPackageDeleted(packageName,
+ PackageManager.DELETE_FAILED_OWNER_BLOCKED, null);
+ } catch (RemoteException re) {
+ }
+ });
return;
}
@@ -17983,56 +18030,53 @@ public class PackageManagerService extends IPackageManager.Stub
? "VERSION_CODE_HIGHEST" : versionCode));
}
// Queue up an async operation since the package deletion may take a little while.
- mHandler.post(new Runnable() {
- public void run() {
- mHandler.removeCallbacks(this);
- int returnCode;
- final PackageSetting ps = mSettings.mPackages.get(internalPackageName);
- boolean doDeletePackage = true;
- if (ps != null) {
- final boolean targetIsInstantApp =
- ps.getInstantApp(UserHandle.getUserId(callingUid));
- doDeletePackage = !targetIsInstantApp
- || canViewInstantApps;
- }
- if (doDeletePackage) {
- if (!deleteAllUsers) {
+ mHandler.post(() -> {
+ int returnCode;
+ final PackageSetting ps = mSettings.mPackages.get(internalPackageName);
+ boolean doDeletePackage = true;
+ if (ps != null) {
+ final boolean targetIsInstantApp =
+ ps.getInstantApp(UserHandle.getUserId(callingUid));
+ doDeletePackage = !targetIsInstantApp
+ || canViewInstantApps;
+ }
+ if (doDeletePackage) {
+ if (!deleteAllUsers) {
+ returnCode = deletePackageX(internalPackageName, versionCode,
+ userId, deleteFlags);
+ } else {
+ int[] blockUninstallUserIds = getBlockUninstallForUsers(
+ internalPackageName, users);
+ // If nobody is blocking uninstall, proceed with delete for all users
+ if (ArrayUtils.isEmpty(blockUninstallUserIds)) {
returnCode = deletePackageX(internalPackageName, versionCode,
userId, deleteFlags);
} else {
- int[] blockUninstallUserIds = getBlockUninstallForUsers(
- internalPackageName, users);
- // If nobody is blocking uninstall, proceed with delete for all users
- if (ArrayUtils.isEmpty(blockUninstallUserIds)) {
- returnCode = deletePackageX(internalPackageName, versionCode,
- userId, deleteFlags);
- } else {
- // Otherwise uninstall individually for users with blockUninstalls=false
- final int userFlags = deleteFlags & ~PackageManager.DELETE_ALL_USERS;
- for (int userId : users) {
- if (!ArrayUtils.contains(blockUninstallUserIds, userId)) {
- returnCode = deletePackageX(internalPackageName, versionCode,
- userId, userFlags);
- if (returnCode != PackageManager.DELETE_SUCCEEDED) {
- Slog.w(TAG, "Package delete failed for user " + userId
- + ", returnCode " + returnCode);
- }
+ // Otherwise uninstall individually for users with blockUninstalls=false
+ final int userFlags = deleteFlags & ~PackageManager.DELETE_ALL_USERS;
+ for (int userId1 : users) {
+ if (!ArrayUtils.contains(blockUninstallUserIds, userId1)) {
+ returnCode = deletePackageX(internalPackageName, versionCode,
+ userId1, userFlags);
+ if (returnCode != PackageManager.DELETE_SUCCEEDED) {
+ Slog.w(TAG, "Package delete failed for user " + userId1
+ + ", returnCode " + returnCode);
}
}
- // The app has only been marked uninstalled for certain users.
- // We still need to report that delete was blocked
- returnCode = PackageManager.DELETE_FAILED_OWNER_BLOCKED;
}
+ // The app has only been marked uninstalled for certain users.
+ // We still need to report that delete was blocked
+ returnCode = PackageManager.DELETE_FAILED_OWNER_BLOCKED;
}
- } else {
- returnCode = PackageManager.DELETE_FAILED_INTERNAL_ERROR;
}
- try {
- observer.onPackageDeleted(packageName, returnCode, null);
- } catch (RemoteException e) {
- Log.i(TAG, "Observer no longer exists.");
- } //end catch
- } //end run
+ } else {
+ returnCode = PackageManager.DELETE_FAILED_INTERNAL_ERROR;
+ }
+ try {
+ observer.onPackageDeleted(packageName, returnCode, null);
+ } catch (RemoteException e) {
+ Log.i(TAG, "Observer no longer exists.");
+ } //end catch
});
}
@@ -18238,8 +18282,8 @@ public class PackageManagerService extends IPackageManager.Stub
return PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER;
}
- PackageSetting uninstalledPs = null;
- PackageParser.Package pkg = null;
+ PackageSetting uninstalledPs;
+ PackageParser.Package pkg;
// for the uninstall-updates case and restricted profiles, remember the per-
// user handle installed state
@@ -18559,13 +18603,10 @@ public class PackageManagerService extends IPackageManager.Stub
if (userIdToKill == UserHandle.USER_ALL
|| userIdToKill >= UserHandle.USER_SYSTEM) {
// If gids changed for this user, kill all affected packages.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- // This has to happen with no lock held.
- killApplication(deletedPs.name, deletedPs.appId,
- KILL_APP_REASON_GIDS_CHANGED);
- }
+ mHandler.post(() -> {
+ // This has to happen with no lock held.
+ killApplication(deletedPs.name, deletedPs.appId,
+ KILL_APP_REASON_GIDS_CHANGED);
});
break;
}
@@ -19507,12 +19548,8 @@ public class PackageManagerService extends IPackageManager.Stub
case PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED: {
writeRuntimePermissions = true;
final int appId = ps.appId;
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- killUid(appId, userId, KILL_APP_REASON_PERMISSIONS_REVOKED);
- }
- });
+ mHandler.post(
+ () -> killUid(appId, userId, KILL_APP_REASON_PERMISSIONS_REVOKED));
} break;
}
}
@@ -19590,33 +19627,31 @@ public class PackageManagerService extends IPackageManager.Stub
}
// Queue up an async operation since the package deletion may take a little while.
- mHandler.post(new Runnable() {
- public void run() {
- final PackageSetting ps = pkg == null ? null : (PackageSetting) pkg.mExtras;
- boolean doClearData = true;
- if (ps != null) {
- final boolean targetIsInstantApp =
- ps.getInstantApp(UserHandle.getUserId(callingUid));
- doClearData = !targetIsInstantApp
- || hasAccessInstantApps == PackageManager.PERMISSION_GRANTED;
- }
- if (doClearData) {
- synchronized (mInstallLock) {
- final int flags = StorageManager.FLAG_STORAGE_DE
- | StorageManager.FLAG_STORAGE_CE;
- // We're only clearing cache files, so we don't care if the
- // app is unfrozen and still able to run
- clearAppDataLIF(pkg, userId, flags | Installer.FLAG_CLEAR_CACHE_ONLY);
- clearAppDataLIF(pkg, userId, flags | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
- }
- clearExternalStorageDataSync(packageName, userId, false);
+ mHandler.post(() -> {
+ final PackageSetting ps = pkg == null ? null : (PackageSetting) pkg.mExtras;
+ boolean doClearData = true;
+ if (ps != null) {
+ final boolean targetIsInstantApp =
+ ps.getInstantApp(UserHandle.getUserId(callingUid));
+ doClearData = !targetIsInstantApp
+ || hasAccessInstantApps == PackageManager.PERMISSION_GRANTED;
+ }
+ if (doClearData) {
+ synchronized (mInstallLock) {
+ final int flags = StorageManager.FLAG_STORAGE_DE
+ | StorageManager.FLAG_STORAGE_CE;
+ // We're only clearing cache files, so we don't care if the
+ // app is unfrozen and still able to run
+ clearAppDataLIF(pkg, userId, flags | Installer.FLAG_CLEAR_CACHE_ONLY);
+ clearAppDataLIF(pkg, userId, flags | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
}
- if (observer != null) {
- try {
- observer.onRemoveCompleted(packageName, true);
- } catch (RemoteException e) {
- Log.i(TAG, "Observer no longer exists.");
- }
+ clearExternalStorageDataSync(packageName, userId, false);
+ }
+ if (observer != null) {
+ try {
+ observer.onRemoveCompleted(packageName, true);
+ } catch (RemoteException e) {
+ Log.i(TAG, "Observer no longer exists.");
}
}
});
@@ -19899,7 +19934,7 @@ public class PackageManagerService extends IPackageManager.Stub
(pa.mPref.mComponent.getPackageName().equals(packageName)
&& pa.mPref.mAlways)) {
if (removed == null) {
- removed = new ArrayList<PreferredActivity>();
+ removed = new ArrayList<>();
}
removed.add(pa);
}
@@ -20063,7 +20098,7 @@ public class PackageManagerService extends IPackageManager.Stub
// Mark entry for removal only if it matches the package name.
if (ppa.mComponent.getPackageName().equals(packageName)) {
if (removed == null) {
- removed = new ArrayList<PersistentPreferredActivity>();
+ removed = new ArrayList<>();
}
removed.add(ppa);
}
@@ -20102,7 +20137,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
return;
}
-Slog.v(TAG, ":: restoreFromXml() : got to tag " + parser.getName());
// this is supposed to be TAG_PREFERRED_BACKUP
if (!expectedStartTag.equals(parser.getName())) {
if (DEBUG_BACKUP) {
@@ -20113,12 +20147,11 @@ Slog.v(TAG, ":: restoreFromXml() : got to tag " + parser.getName());
// skip interfering stuff, then we're aligned with the backing implementation
while ((type = parser.next()) == XmlPullParser.TEXT) { }
-Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
functor.apply(parser, userId);
}
private interface BlobXmlRestorer {
- public void apply(XmlPullParser parser, int userId) throws IOException, XmlPullParserException;
+ void apply(XmlPullParser parser, int userId) throws IOException, XmlPullParserException;
}
/**
@@ -20166,15 +20199,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
restoreFromXml(parser, userId, TAG_PREFERRED_BACKUP,
- new BlobXmlRestorer() {
- @Override
- public void apply(XmlPullParser parser, int userId)
- throws XmlPullParserException, IOException {
- synchronized (mPackages) {
- mSettings.readPreferredActivitiesLPw(parser, userId);
- }
+ (readParser, readUserId) -> {
+ synchronized (mPackages) {
+ mSettings.readPreferredActivitiesLPw(readParser, readUserId);
}
- } );
+ });
} catch (Exception e) {
if (DEBUG_BACKUP) {
Slog.e(TAG, "Exception restoring preferred activities: " + e.getMessage());
@@ -20227,15 +20256,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
restoreFromXml(parser, userId, TAG_DEFAULT_APPS,
- new BlobXmlRestorer() {
- @Override
- public void apply(XmlPullParser parser, int userId)
- throws XmlPullParserException, IOException {
- synchronized (mPackages) {
- mSettings.readDefaultAppsLPw(parser, userId);
- }
+ (parser1, userId1) -> {
+ synchronized (mPackages) {
+ mSettings.readDefaultAppsLPw(parser1, userId1);
}
- } );
+ });
} catch (Exception e) {
if (DEBUG_BACKUP) {
Slog.e(TAG, "Exception restoring default apps: " + e.getMessage());
@@ -20283,16 +20308,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
restoreFromXml(parser, userId, TAG_INTENT_FILTER_VERIFICATION,
- new BlobXmlRestorer() {
- @Override
- public void apply(XmlPullParser parser, int userId)
- throws XmlPullParserException, IOException {
- synchronized (mPackages) {
- mSettings.readAllDomainVerificationsLPr(parser, userId);
- mSettings.writeLPr();
- }
+ (parser1, userId1) -> {
+ synchronized (mPackages) {
+ mSettings.readAllDomainVerificationsLPr(parser1, userId1);
+ mSettings.writeLPr();
}
- } );
+ });
} catch (Exception e) {
if (DEBUG_BACKUP) {
Slog.e(TAG, "Exception restoring preferred activities: " + e.getMessage());
@@ -20340,15 +20361,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
restoreFromXml(parser, userId, TAG_PERMISSION_BACKUP,
- new BlobXmlRestorer() {
- @Override
- public void apply(XmlPullParser parser, int userId)
- throws XmlPullParserException, IOException {
- synchronized (mPackages) {
- processRestoredPermissionGrantsLPr(parser, userId);
- }
+ (parser1, userId1) -> {
+ synchronized (mPackages) {
+ processRestoredPermissionGrantsLPr(parser1, userId1);
}
- } );
+ });
} catch (Exception e) {
if (DEBUG_BACKUP) {
Slog.e(TAG, "Exception restoring preferred activities: " + e.getMessage());
@@ -20536,7 +20553,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
CrossProfileIntentResolver resolver =
mSettings.editCrossProfileIntentResolverLPw(sourceUserId);
ArraySet<CrossProfileIntentFilter> set =
- new ArraySet<CrossProfileIntentFilter>(resolver.filterSet());
+ new ArraySet<>(resolver.filterSet());
for (CrossProfileIntentFilter filter : set) {
if (filter.getOwnerPackage().equals(ownerPackage)) {
resolver.removeFilter(filter);
@@ -20641,9 +20658,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
allHomeCandidates.clear();
if (list != null) {
- for (ResolveInfo ri : list) {
- allHomeCandidates.add(ri);
- }
+ allHomeCandidates.addAll(list);
}
return (preferred == null || preferred.activityInfo == null)
? null
@@ -20773,7 +20788,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
boolean isApp = (className == null);
final boolean isCallerInstantApp = (getInstantAppPackageName(callingUid) != null);
String componentName = isApp ? packageName : className;
- int packageUid = -1;
ArrayList<String> components;
// reader
@@ -21013,7 +21027,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
components = mPendingBroadcasts.get(userId, packageName);
final boolean newPackage = components == null;
if (newPackage) {
- components = new ArrayList<String>();
+ components = new ArrayList<>();
}
if (!components.contains(componentName)) {
components.add(componentName);
@@ -21037,7 +21051,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
long callingId = Binder.clearCallingIdentity();
try {
if (sendNow) {
- packageUid = UserHandle.getUid(userId, pkgSetting.appId);
+ int packageUid = UserHandle.getUid(userId, pkgSetting.appId);
sendPackageChangedBroadcast(packageName,
(flags&PackageManager.DONT_KILL_APP) != 0, components, packageUid);
}
@@ -21128,6 +21142,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
public boolean isOrphaned(String packageName) {
// reader
synchronized (mPackages) {
+ if (!mPackages.containsKey(packageName)) {
+ return false;
+ }
return mSettings.isOrphaned(packageName);
}
}
@@ -21197,6 +21214,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
CarrierAppUtils.disableCarrierAppsUntilPrivileged(mContext.getOpPackageName(), this,
mContext.getContentResolver(), UserHandle.USER_SYSTEM);
+ disableSkuSpecificApps();
+
// Read the compatibilty setting when the system is ready.
boolean compatibilityModeEnabled = android.provider.Settings.Global.getInt(
mContext.getContentResolver(),
@@ -21217,7 +21236,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
// possible for the user flow to never be able to return to that
// situation so here we do a sanity check to make sure we haven't
// left any junk around.
- ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>();
+ ArrayList<PreferredActivity> removed = new ArrayList<>();
for (int i=0; i<mSettings.mPreferredActivities.size(); i++) {
PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i);
removed.clear();
@@ -21345,16 +21364,16 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
}
static String arrayToString(int[] array) {
- StringBuffer buf = new StringBuffer(128);
- buf.append('[');
+ StringBuilder stringBuilder = new StringBuilder(128);
+ stringBuilder.append('[');
if (array != null) {
for (int i=0; i<array.length; i++) {
- if (i > 0) buf.append(", ");
- buf.append(array[i]);
+ if (i > 0) stringBuilder.append(", ");
+ stringBuilder.append(array[i]);
}
}
- buf.append(']');
- return buf.toString();
+ stringBuilder.append(']');
+ return stringBuilder.toString();
}
@Override
@@ -21388,10 +21407,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
// Right now we only know how to print all.
} else if ("-h".equals(opt)) {
pw.println("Package manager dump options:");
- pw.println(" [-h] [-f] [--checkin] [cmd] ...");
+ pw.println(" [-h] [-f] [--checkin] [--all-components] [cmd] ...");
pw.println(" --checkin: dump for a checkin");
pw.println(" -f: print details of intent filters");
pw.println(" -h: print this help");
+ pw.println(" --all-components: include all component names in package dump");
pw.println(" cmd may be one of:");
pw.println(" l[ibraries]: list known shared libraries");
pw.println(" f[eatures]: list device features");
@@ -21419,6 +21439,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
return;
} else if ("--checkin".equals(opt)) {
checkin = true;
+ } else if ("--all-components".equals(opt)) {
+ dumpState.setOptionEnabled(DumpState.OPTION_DUMP_ALL_COMPONENTS);
} else if ("-f".equals(opt)) {
dumpState.setOptionEnabled(DumpState.OPTION_SHOW_FILTERS);
} else if ("--proto".equals(opt)) {
@@ -21984,6 +22006,28 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
}
}
+ //TODO: b/111402650
+ private void disableSkuSpecificApps() {
+ if (!mIsUpgrade && !mFirstBoot) {
+ return;
+ }
+ String apkList[] = mContext.getResources().getStringArray(
+ R.array.config_disableApksUnlessMatchedSku_apk_list);
+ String skuArray[] = mContext.getResources().getStringArray(
+ R.array.config_disableApkUnlessMatchedSku_skus_list);
+ if (ArrayUtils.isEmpty(apkList)) {
+ return;
+ }
+ String sku = SystemProperties.get("ro.boot.hardware.sku");
+ if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) {
+ return;
+ }
+ for (String packageName : apkList) {
+ setSystemAppHiddenUntilInstalled(packageName, true);
+ setSystemAppInstallState(packageName, false, ActivityManager.getCurrentUser());
+ }
+ }
+
private void dumpProto(FileDescriptor fd) {
final ProtoOutputStream proto = new ProtoOutputStream(fd);
@@ -22062,7 +22106,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
ipw.println();
ipw.println("Dexopt state:");
ipw.increaseIndent();
- Collection<PackageParser.Package> packages = null;
+ Collection<PackageParser.Package> packages;
if (packageName != null) {
PackageParser.Package targetPackage = mPackages.get(packageName);
if (targetPackage != null) {
@@ -22089,7 +22133,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
ipw.println();
ipw.println("Compiler stats:");
ipw.increaseIndent();
- Collection<PackageParser.Package> packages = null;
+ Collection<PackageParser.Package> packages;
if (packageName != null) {
PackageParser.Package targetPackage = mPackages.get(packageName);
if (targetPackage != null) {
@@ -22124,9 +22168,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
ArraySet<String> result = new ArraySet<>();
if (iviList.size() > 0) {
for (IntentFilterVerificationInfo ivi : iviList) {
- for (String host : ivi.getDomains()) {
- result.add(host);
- }
+ result.addAll(ivi.getDomains());
}
}
if (filters != null && filters.size() > 0) {
@@ -22218,12 +22260,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
}
private void loadPrivatePackages(final VolumeInfo vol) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- loadPrivatePackagesInner(vol);
- }
- });
+ mHandler.post(() -> loadPrivatePackagesInner(vol));
}
private void loadPrivatePackagesInner(VolumeInfo vol) {
@@ -22314,12 +22351,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
}
private void unloadPrivatePackages(final VolumeInfo vol) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- unloadPrivatePackagesInner(vol);
- }
- });
+ mHandler.post(() -> unloadPrivatePackagesInner(vol));
}
private void unloadPrivatePackagesInner(VolumeInfo vol) {
@@ -22374,23 +22406,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
}
}
- private void assertPackageKnown(String volumeUuid, String packageName)
- throws PackageManagerException {
- synchronized (mPackages) {
- // Normalize package name to handle renamed packages
- packageName = normalizePackageNameLPr(packageName);
-
- final PackageSetting ps = mSettings.mPackages.get(packageName);
- if (ps == null) {
- throw new PackageManagerException("Package " + packageName + " is unknown");
- } else if (!TextUtils.equals(volumeUuid, ps.volumeUuid)) {
- throw new PackageManagerException(
- "Package " + packageName + " found on unknown volume " + volumeUuid
- + "; expected volume " + ps.volumeUuid);
- }
- }
- }
-
private void assertPackageKnownAndInstalled(String volumeUuid, String packageName, int userId)
throws PackageManagerException {
synchronized (mPackages) {
@@ -22503,7 +22518,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
* <p>
* Verifies that directories exist and that ownership and labeling is
* correct for all installed apps.
- * @returns list of skipped non-core packages (if {@code onlyCoreApps} is true)
+ * @return list of skipped non-core packages (if {@code onlyCoreApps} is true)
*/
private List<String> reconcileAppsDataLI(String volumeUuid, int userId, int flags,
boolean migrateAppData, boolean onlyCoreApps) {
@@ -22873,10 +22888,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
@Override
protected void finalize() throws Throwable {
try {
- if (mCloseGuard != null) {
- mCloseGuard.warnIfOpen();
- }
-
+ mCloseGuard.warnIfOpen();
close();
} finally {
super.finalize();
@@ -22920,15 +22932,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
final int callingUid = Binder.getCallingUid();
final UserHandle user = new UserHandle(UserHandle.getUserId(callingUid));
final int moveId = mNextMoveId.getAndIncrement();
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- try {
- movePackageInternal(packageName, volumeUuid, moveId, callingUid, user);
- } catch (PackageManagerException e) {
- Slog.w(TAG, "Failed to move " + packageName, e);
- mMoveCallbacks.notifyStatusChanged(moveId, e.error);
- }
+ mHandler.post(() -> {
+ try {
+ movePackageInternal(packageName, volumeUuid, moveId, callingUid, user);
+ } catch (PackageManagerException e) {
+ Slog.w(TAG, "Failed to move " + packageName, e);
+ mMoveCallbacks.notifyStatusChanged(moveId, e.error);
}
});
return moveId;
@@ -23128,24 +23137,21 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
final MoveInfo move;
if (moveCompleteApp) {
// Kick off a thread to report progress estimates
- new Thread() {
- @Override
- public void run() {
- while (true) {
- try {
- if (installedLatch.await(1, TimeUnit.SECONDS)) {
- break;
- }
- } catch (InterruptedException ignored) {
+ new Thread(() -> {
+ while (true) {
+ try {
+ if (installedLatch.await(1, TimeUnit.SECONDS)) {
+ break;
}
-
- final long deltaFreeBytes = startFreeBytes - measurePath.getUsableSpace();
- final int progress = 10 + (int) MathUtils.constrain(
- ((deltaFreeBytes * 80) / sizeBytes), 0, 80);
- mMoveCallbacks.notifyStatusChanged(moveId, progress);
+ } catch (InterruptedException ignored) {
}
+
+ final long deltaFreeBytes = startFreeBytes - measurePath.getUsableSpace();
+ final int progress = 10 + (int) MathUtils.constrain(
+ ((deltaFreeBytes * 80) / sizeBytes), 0, 80);
+ mMoveCallbacks.notifyStatusChanged(moveId, progress);
}
- }.start();
+ }).start();
final String dataAppName = codeFile.getName();
move = new MoveInfo(moveId, currentVolumeUuid, volumeUuid, packageName,
@@ -23299,12 +23305,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
if (DEBUG_CLEAN_APKS) {
Slog.i(TAG, " Removing package " + packageName);
}
- mHandler.post(new Runnable() {
- public void run() {
- deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST,
- userHandle, 0);
- } //end run
- });
+ //end run
+ mHandler.post(() -> deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST,
+ userHandle, 0));
}
}
}
@@ -23551,12 +23554,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
// TODO Implement atomic delete if package is unused
// It is currently possible that the package will be deleted even if it is installed
// after this method returns.
- mHandler.post(new Runnable() {
- public void run() {
- deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST,
- 0, PackageManager.DELETE_ALL_USERS);
- }
- });
+ mHandler.post(() -> deletePackageX(packageName, PackageManager.VERSION_CODE_HIGHEST,
+ 0, PackageManager.DELETE_ALL_USERS));
}
}
@@ -24373,6 +24372,20 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
PackageManagerService.this.notifyPackageUseLocked(packageName, reason);
}
}
+
+ @Override
+ public CheckPermissionDelegate getCheckPermissionDelegate() {
+ synchronized (mPackages) {
+ return PackageManagerService.this.getCheckPermissionDelegateLocked();
+ }
+ }
+
+ @Override
+ public void setCheckPermissionDelegate(CheckPermissionDelegate delegate) {
+ synchronized (mPackages) {
+ PackageManagerService.this.setCheckPermissionDelegateLocked(delegate);
+ }
+ }
}
@Override
@@ -24408,11 +24421,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
String[] packageNames, int userId) {
enforceSystemOrPhoneCaller("grantDefaultPermissionsToEnabledTelephonyDataServices");
synchronized (mPackages) {
- Binder.withCleanCallingIdentity( () -> {
- mDefaultPermissionPolicy.
- grantDefaultPermissionsToEnabledTelephonyDataServices(
- packageNames, userId);
- });
+ Binder.withCleanCallingIdentity( () -> mDefaultPermissionPolicy.
+ grantDefaultPermissionsToEnabledTelephonyDataServices(
+ packageNames, userId));
}
}
@@ -24421,11 +24432,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
String[] packageNames, int userId) {
enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromDisabledTelephonyDataServices");
synchronized (mPackages) {
- Binder.withCleanCallingIdentity( () -> {
- mDefaultPermissionPolicy.
- revokeDefaultPermissionsFromDisabledTelephonyDataServices(
- packageNames, userId);
- });
+ Binder.withCleanCallingIdentity( () -> mDefaultPermissionPolicy.
+ revokeDefaultPermissionsFromDisabledTelephonyDataServices(
+ packageNames, userId));
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index cd9efdcf8224..d06437e562ed 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -109,6 +109,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.WeakHashMap;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
import libcore.io.IoUtils;
@@ -2930,7 +2931,7 @@ class PackageManagerShellCommand extends ShellCommand {
}
private static class LocalIntentReceiver {
- private final SynchronousQueue<Intent> mResult = new SynchronousQueue<>();
+ private final LinkedBlockingQueue<Intent> mResult = new LinkedBlockingQueue<>();
private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {
@Override
diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java
index 0f4df972ca95..c312fc0eca2f 100644
--- a/services/core/java/com/android/server/pm/PreferredComponent.java
+++ b/services/core/java/com/android/server/pm/PreferredComponent.java
@@ -16,8 +16,10 @@
package com.android.server.pm;
+import android.content.pm.PackageManagerInternal;
import com.android.internal.util.XmlUtils;
+import com.android.server.LocalServices;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -52,6 +54,7 @@ public class PreferredComponent {
private String mParseError;
private final Callbacks mCallbacks;
+ private final String mSetupWizardPackageName;
public interface Callbacks {
public boolean onReadTag(String tagName, XmlPullParser parser)
@@ -66,6 +69,7 @@ public class PreferredComponent {
mAlways = always;
mShortComponent = component.flattenToShortString();
mParseError = null;
+ mSetupWizardPackageName = null;
if (set != null) {
final int N = set.length;
String[] myPackages = new String[N];
@@ -170,6 +174,8 @@ public class PreferredComponent {
mSetPackages = myPackages;
mSetClasses = myClasses;
mSetComponents = myComponents;
+ final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
+ mSetupWizardPackageName = packageManagerInternal.getSetupWizardPackageName();
}
public String getParseError() {
@@ -193,7 +199,7 @@ public class PreferredComponent {
}
}
- public boolean sameSet(List<ResolveInfo> query) {
+ public boolean sameSet(List<ResolveInfo> query, boolean excludeSetupWizardPackage) {
if (mSetPackages == null) {
return query == null;
}
@@ -202,12 +208,18 @@ public class PreferredComponent {
}
final int NQ = query.size();
final int NS = mSetPackages.length;
-
int numMatch = 0;
for (int i=0; i<NQ; i++) {
ResolveInfo ri = query.get(i);
ActivityInfo ai = ri.activityInfo;
boolean good = false;
+
+ // ignore SetupWizard package's launcher capability because it is only existed
+ // during SetupWizard is running
+ if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
+ continue;
+ }
+
for (int j=0; j<NS; j++) {
if (mSetPackages[j].equals(ai.packageName)
&& mSetClasses[j].equals(ai.name)) {
@@ -242,7 +254,7 @@ public class PreferredComponent {
return numMatch == NS;
}
- public boolean isSuperset(List<ResolveInfo> query) {
+ public boolean isSuperset(List<ResolveInfo> query, boolean excludeSetupWizardPackage) {
if (mSetPackages == null) {
return query == null;
}
@@ -251,13 +263,20 @@ public class PreferredComponent {
}
final int NQ = query.size();
final int NS = mSetPackages.length;
- if (NS < NQ) {
+ if (!excludeSetupWizardPackage && NS < NQ) {
return false;
}
for (int i=0; i<NQ; i++) {
ResolveInfo ri = query.get(i);
ActivityInfo ai = ri.activityInfo;
boolean foundMatch = false;
+
+ // ignore SetupWizard package's launcher capability because it is only existed
+ // during SetupWizard is running
+ if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
+ continue;
+ }
+
for (int j=0; j<NS; j++) {
if (mSetPackages[j].equals(ai.packageName) && mSetClasses[j].equals(ai.name)) {
foundMatch = true;
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 5177995a8353..d17697bb86d6 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -83,6 +83,7 @@ import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.CollectionUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.JournaledFile;
@@ -4120,7 +4121,8 @@ public final class Settings {
continue;
}
final boolean shouldInstall = ps.isSystem() &&
- !ArrayUtils.contains(disallowedPackages, ps.name);
+ !ArrayUtils.contains(disallowedPackages, ps.name) &&
+ !ps.pkg.applicationInfo.hiddenUntilInstalled;
// Only system apps are initially installed.
ps.setInstalled(shouldInstall, userHandle);
if (!shouldInstall) {
@@ -4471,7 +4473,7 @@ public final class Settings {
void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
ArraySet<String> permissionNames, PackageSetting ps, SimpleDateFormat sdf,
- Date date, List<UserInfo> users, boolean dumpAll) {
+ Date date, List<UserInfo> users, boolean dumpAll, boolean dumpAllComponents) {
if (checkinTag != null) {
pw.print(checkinTag);
pw.print(",");
@@ -4756,6 +4758,10 @@ public final class Settings {
dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState);
}
+ if (dumpAllComponents) {
+ dumpComponents(pw, prefix + " ", ps);
+ }
+
for (UserInfo user : users) {
pw.print(prefix); pw.print(" User "); pw.print(user.id); pw.print(": ");
pw.print("ceDataInode=");
@@ -4835,6 +4841,8 @@ public final class Settings {
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
final Date date = new Date();
boolean printedSomething = false;
+ final boolean dumpAllComponents =
+ dumpState.isOptionEnabled(DumpState.OPTION_DUMP_ALL_COMPONENTS);
List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
for (final PackageSetting ps : mPackages.values()) {
if (packageName != null && !packageName.equals(ps.realName)
@@ -4857,7 +4865,7 @@ public final class Settings {
printedSomething = true;
}
dumpPackageLPr(pw, " ", checkin ? "pkg" : null, permissionNames, ps, sdf, date, users,
- packageName != null);
+ packageName != null, dumpAllComponents);
}
printedSomething = false;
@@ -4898,7 +4906,7 @@ public final class Settings {
printedSomething = true;
}
dumpPackageLPr(pw, " ", checkin ? "dis" : null, permissionNames, ps, sdf, date,
- users, packageName != null);
+ users, packageName != null, dumpAllComponents);
}
}
}
@@ -5107,6 +5115,28 @@ public final class Settings {
}
}
+ void dumpComponents(PrintWriter pw, String prefix, PackageSetting ps) {
+ dumpComponents(pw, prefix, ps, "activities:", ps.pkg.activities);
+ dumpComponents(pw, prefix, ps, "services:", ps.pkg.services);
+ dumpComponents(pw, prefix, ps, "receivers:", ps.pkg.receivers);
+ dumpComponents(pw, prefix, ps, "providers:", ps.pkg.providers);
+ dumpComponents(pw, prefix, ps, "instrumentations:", ps.pkg.instrumentation);
+ }
+
+ void dumpComponents(PrintWriter pw, String prefix, PackageSetting ps,
+ String label, List<? extends PackageParser.Component<?>> list) {
+ final int size = CollectionUtils.size(list);
+ if (size == 0) {
+ return;
+ }
+ pw.print(prefix);pw.println(label);
+ for (int i = 0; i < size; i++) {
+ final PackageParser.Component<?> component = list.get(i);
+ pw.print(prefix);pw.print(" ");
+ pw.println(component.getComponentName().flattenToShortString());
+ }
+ }
+
public void writeRuntimePermissionsForUserLPr(int userId, boolean sync) {
if (sync) {
mRuntimePermissionsPersistence.writePermissionsForUserSyncLPr(userId);
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 599e5a573437..b9c304890420 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -132,6 +132,7 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import java.util.function.Predicate;
@@ -1573,6 +1574,24 @@ public class ShortcutService extends IShortcutService.Stub {
"Ephemeral apps can't use ShortcutManager");
}
+ private void verifyShortcutInfoPackage(String callerPackage, ShortcutInfo si) {
+ if (si == null) {
+ return;
+ }
+ if (!Objects.equals(callerPackage, si.getPackage())) {
+ android.util.EventLog.writeEvent(0x534e4554, "109824443", -1, "");
+ throw new SecurityException("Shortcut package name mismatch");
+ }
+ }
+
+ private void verifyShortcutInfoPackages(
+ String callerPackage, List<ShortcutInfo> list) {
+ final int size = list.size();
+ for (int i = 0; i < size; i++) {
+ verifyShortcutInfoPackage(callerPackage, list.get(i));
+ }
+ }
+
// Overridden in unit tests to execute r synchronously.
void injectPostToHandler(Runnable r) {
mHandler.post(r);
@@ -1720,6 +1739,7 @@ public class ShortcutService extends IShortcutService.Stub {
verifyCaller(packageName, userId);
final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
+ verifyShortcutInfoPackages(packageName, newShortcuts);
final int size = newShortcuts.size();
final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
@@ -1774,6 +1794,7 @@ public class ShortcutService extends IShortcutService.Stub {
verifyCaller(packageName, userId);
final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
+ verifyShortcutInfoPackages(packageName, newShortcuts);
final int size = newShortcuts.size();
final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
@@ -1859,6 +1880,7 @@ public class ShortcutService extends IShortcutService.Stub {
verifyCaller(packageName, userId);
final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
+ verifyShortcutInfoPackages(packageName, newShortcuts);
final int size = newShortcuts.size();
final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
@@ -1921,6 +1943,7 @@ public class ShortcutService extends IShortcutService.Stub {
Preconditions.checkNotNull(shortcut);
Preconditions.checkArgument(shortcut.isEnabled(), "Shortcut must be enabled");
verifyCaller(packageName, userId);
+ verifyShortcutInfoPackage(packageName, shortcut);
final Intent ret;
synchronized (mLock) {
@@ -1942,6 +1965,7 @@ public class ShortcutService extends IShortcutService.Stub {
private boolean requestPinItem(String packageName, int userId, ShortcutInfo shortcut,
AppWidgetProviderInfo appWidget, Bundle extras, IntentSender resultIntent) {
verifyCaller(packageName, userId);
+ verifyShortcutInfoPackage(packageName, shortcut);
final boolean ret;
synchronized (mLock) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 06c56a05d42a..46935f085911 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -31,7 +31,6 @@ import android.app.IActivityManager;
import android.app.IStopUserCallback;
import android.app.KeyguardManager;
import android.app.PendingIntent;
-import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -72,7 +71,6 @@ import android.os.UserManager.EnforcingUser;
import android.os.UserManagerInternal;
import android.os.UserManagerInternal.UserRestrictionsListener;
import android.os.storage.StorageManager;
-import android.provider.Settings;
import android.security.GateKeeper;
import android.service.gatekeeper.IGateKeeperService;
import android.util.AtomicFile;
@@ -82,7 +80,6 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
-import android.util.SparseLongArray;
import android.util.TimeUtils;
import android.util.Xml;
@@ -101,8 +98,7 @@ import com.android.server.LockGuard;
import com.android.server.SystemService;
import com.android.server.am.UserState;
import com.android.server.storage.DeviceStorageMonitorInternal;
-
-import libcore.io.IoUtils;
+import com.android.server.wm.ActivityTaskManagerInternal;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -125,6 +121,8 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
+import libcore.io.IoUtils;
+
/**
* Service for {@link UserManager}.
*
@@ -2968,9 +2966,9 @@ public class UserManagerService extends IUserManager.Stub {
new Thread() {
@Override
public void run() {
- // Clean up any ActivityManager state
- LocalServices.getService(ActivityManagerInternal.class)
- .onUserRemoved(userHandle);
+ // Clean up any ActivityTaskManager state
+ LocalServices.getService(ActivityTaskManagerInternal.class)
+ .onUserStopped(userHandle);
removeUserState(userHandle);
}
}.start();
@@ -3558,6 +3556,8 @@ public class UserManagerService extends IUserManager.Stub {
switch(cmd) {
case "list":
return runList(pw);
+ default:
+ return shell.handleDefaultCommands(cmd);
}
} catch (RemoteException e) {
pw.println("Remote exception: " + e);
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 1ae59cbea452..50e6f8d5b905 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -1193,12 +1193,27 @@ public final class DefaultPermissionGrantPolicy {
}
}
- private void grantRuntimePermissions(PackageParser.Package pkg, Set<String> permissions,
- boolean systemFixed, boolean ignoreSystemPackage, int userId) {
+ private void grantRuntimePermissions(PackageParser.Package pkg,
+ Set<String> permissionsWithoutSplits, boolean systemFixed, boolean ignoreSystemPackage,
+ int userId) {
if (pkg.requestedPermissions.isEmpty()) {
return;
}
+ final ArraySet<String> permissions = new ArraySet<>(permissionsWithoutSplits);
+
+ // Automatically attempt to grant split permissions to older APKs
+ final int numSplitPerms = PackageParser.SPLIT_PERMISSIONS.length;
+ for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) {
+ final PackageParser.SplitPermissionInfo splitPerm =
+ PackageParser.SPLIT_PERMISSIONS[splitPermNum];
+
+ if (pkg.applicationInfo.targetSdkVersion < splitPerm.targetSdk
+ && permissionsWithoutSplits.contains(splitPerm.rootPerm)) {
+ Collections.addAll(permissions, splitPerm.newPerms);
+ }
+ }
+
List<String> requestedPermissions = pkg.requestedPermissions;
Set<String> grantablePermissions = null;
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java
index a042fedf8b47..80a5fbb6366e 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerInternal.java
@@ -21,19 +21,11 @@ import android.annotation.Nullable;
import android.content.pm.PackageParser;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager.PermissionInfoFlags;
-import android.content.pm.PackageParser.Permission;
-
-import com.android.server.pm.SharedUserSetting;
-import com.android.server.pm.permission.PermissionManagerInternal.PermissionCallback;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
/**
* Internal interfaces to be used by other components within the system server.
@@ -115,7 +107,11 @@ public abstract class PermissionManagerInternal {
*/
public abstract void addAllPermissions(@NonNull PackageParser.Package pkg, boolean chatty);
public abstract void addAllPermissionGroups(@NonNull PackageParser.Package pkg, boolean chatty);
- public abstract void removeAllPermissions(@NonNull PackageParser.Package pkg, boolean chatty);
+ public abstract void removeAllPermissions(
+ @NonNull PackageParser.Package pkg,
+ @NonNull List<String> allPackageNames,
+ @Nullable PermissionCallback permissionCallback,
+ boolean chatty);
public abstract boolean addDynamicPermission(@NonNull PermissionInfo info, boolean async,
int callingUid, @Nullable PermissionCallback callback);
public abstract void removeDynamicPermission(@NonNull String permName, int callingUid,
@@ -189,4 +185,4 @@ public abstract class PermissionManagerInternal {
/** HACK HACK methods to allow for partial migration of data to the PermissionManager class */
public abstract @Nullable BasePermission getPermissionTEMP(@NonNull String permName);
-} \ No newline at end of file
+}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index c51a72406b53..8aed957eebb5 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -19,24 +19,27 @@ package com.android.server.pm.permission;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
+import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
+
import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
import static com.android.server.pm.PackageManagerService.DEBUG_PACKAGE_SCANNING;
import static com.android.server.pm.PackageManagerService.DEBUG_PERMISSIONS;
import static com.android.server.pm.PackageManagerService.DEBUG_REMOVE;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
-import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageParser;
+import android.content.pm.PackageParser.Package;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
-import android.content.pm.PackageParser.Package;
import android.metrics.LogMaker;
+import android.os.AsyncTask;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
@@ -69,17 +72,19 @@ import com.android.server.pm.PackageManagerServiceUtils;
import com.android.server.pm.PackageSetting;
import com.android.server.pm.SharedUserSetting;
import com.android.server.pm.UserManagerService;
-import com.android.server.pm.permission.DefaultPermissionGrantPolicy.DefaultPermissionGrantedCallback;
+import com.android.server.pm.permission.DefaultPermissionGrantPolicy
+ .DefaultPermissionGrantedCallback;
import com.android.server.pm.permission.PermissionManagerInternal.PermissionCallback;
import com.android.server.pm.permission.PermissionsState.PermissionState;
import libcore.util.EmptyArray;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -103,6 +108,16 @@ public class PermissionManagerService {
/** Empty array to avoid allocations */
private static final int[] EMPTY_INT_ARRAY = new int[0];
+ /** If the permission of the value is granted, so is the key */
+ private static final Map<String, String> FULLER_PERMISSION_MAP = new HashMap<>();
+
+ static {
+ FULLER_PERMISSION_MAP.put(Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION);
+ FULLER_PERMISSION_MAP.put(Manifest.permission.INTERACT_ACROSS_USERS,
+ Manifest.permission.INTERACT_ACROSS_USERS_FULL);
+ }
+
/** Lock to protect internal data access */
private final Object mLock;
@@ -233,9 +248,7 @@ public class PermissionManagerService {
return PackageManager.PERMISSION_GRANTED;
}
}
- // Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
- if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
- .hasPermission(Manifest.permission.ACCESS_FINE_LOCATION, userId)) {
+ if (isImpliedPermissionGranted(permissionsState, permName, userId)) {
return PackageManager.PERMISSION_GRANTED;
}
}
@@ -274,9 +287,7 @@ public class PermissionManagerService {
return PackageManager.PERMISSION_GRANTED;
}
}
- // Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
- if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
- .hasPermission(Manifest.permission.ACCESS_FINE_LOCATION, userId)) {
+ if (isImpliedPermissionGranted(permissionsState, permName, userId)) {
return PackageManager.PERMISSION_GRANTED;
}
} else {
@@ -285,8 +296,8 @@ public class PermissionManagerService {
if (perms.contains(permName)) {
return PackageManager.PERMISSION_GRANTED;
}
- if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && perms
- .contains(Manifest.permission.ACCESS_FINE_LOCATION)) {
+ if (FULLER_PERMISSION_MAP.containsKey(permName)
+ && perms.contains(FULLER_PERMISSION_MAP.get(permName))) {
return PackageManager.PERMISSION_GRANTED;
}
}
@@ -294,6 +305,18 @@ public class PermissionManagerService {
return PackageManager.PERMISSION_DENIED;
}
+ /**
+ * Returns {@code true} if the permission can be implied from another granted permission.
+ * <p>Some permissions, such as ACCESS_FINE_LOCATION, imply other permissions,
+ * such as ACCESS_COURSE_LOCATION. If the caller holds an umbrella permission, give
+ * it access to any implied permissions.
+ */
+ private static boolean isImpliedPermissionGranted(PermissionsState permissionsState,
+ String permName, int userId) {
+ return FULLER_PERMISSION_MAP.containsKey(permName)
+ && permissionsState.hasPermission(FULLER_PERMISSION_MAP.get(permName), userId);
+ }
+
private PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags,
int callingUid) {
if (mPackageManagerInt.getInstantAppPackageName(callingUid) != null) {
@@ -455,8 +478,9 @@ public class PermissionManagerService {
" to " + newPermissionGroupName);
try {
- revokeRuntimePermission(permissionName, packageName, false,
- Process.SYSTEM_UID, userId, permissionCallback);
+ revokeRuntimePermission(permissionName, packageName,
+ mSettings.getPermission(permissionName), false,
+ Process.SYSTEM_UID, userId, permissionCallback, false);
} catch (IllegalArgumentException e) {
Slog.e(TAG, "Could not revoke " + permissionName + " from "
+ packageName, e);
@@ -549,9 +573,59 @@ public class PermissionManagerService {
}
- private void removeAllPermissions(PackageParser.Package pkg, boolean chatty) {
+ private void revokeAllPermissions(
+ @NonNull List<BasePermission> bps,
+ @NonNull List<String> allPackageNames,
+ @Nullable PermissionCallback permissionCallback) {
+ AsyncTask.execute(() -> {
+ final int numRemovedPermissions = bps.size();
+ for (int permissionNum = 0; permissionNum < numRemovedPermissions; permissionNum++) {
+ final int[] userIds = mUserManagerInt.getUserIds();
+ final int numUserIds = userIds.length;
+
+ final int numPackages = allPackageNames.size();
+ for (int packageNum = 0; packageNum < numPackages; packageNum++) {
+ final String packageName = allPackageNames.get(packageNum);
+ final ApplicationInfo applicationInfo = mPackageManagerInt.getApplicationInfo(
+ packageName, 0, Process.SYSTEM_UID, UserHandle.USER_SYSTEM);
+ if (applicationInfo != null
+ && applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
+ continue;
+ }
+ for (int userIdNum = 0; userIdNum < numUserIds; userIdNum++) {
+ final int userId = userIds[userIdNum];
+ final String permissionName = bps.get(permissionNum).getName();
+ if (checkPermission(permissionName, packageName, UserHandle.USER_SYSTEM,
+ userId) == PackageManager.PERMISSION_GRANTED) {
+ try {
+ revokeRuntimePermission(
+ permissionName,
+ packageName,
+ bps.get(permissionNum),
+ false,
+ Process.SYSTEM_UID,
+ userId,
+ permissionCallback,
+ true);
+ } catch (IllegalArgumentException e) {
+ Slog.e(TAG, "Could not revoke " + permissionName + " from "
+ + packageName, e);
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+
+ private void removeAllPermissions(
+ @NonNull PackageParser.Package pkg,
+ @NonNull List<String> allPackageNames,
+ @Nullable PermissionCallback permissionCallback,
+ boolean chatty) {
synchronized (mLock) {
int N = pkg.permissions.size();
+ List<BasePermission> bps = new ArrayList<BasePermission>(N);
StringBuilder r = null;
for (int i=0; i<N; i++) {
PackageParser.Permission p = pkg.permissions.get(i);
@@ -560,6 +634,9 @@ public class PermissionManagerService {
bp = mSettings.mPermissionTrees.get(p.info.name);
}
if (bp != null && bp.isPermission(p)) {
+ if ((p.info.getProtection() & PermissionInfo.PROTECTION_DANGEROUS) != 0) {
+ bps.add(bp);
+ }
bp.setPermission(null);
if (DEBUG_REMOVE && chatty) {
if (r == null) {
@@ -578,6 +655,7 @@ public class PermissionManagerService {
}
}
}
+ revokeAllPermissions(bps, allPackageNames, permissionCallback);
if (r != null) {
if (DEBUG_REMOVE) Log.d(TAG, " Permissions: " + r);
}
@@ -1490,9 +1568,10 @@ public class PermissionManagerService {
}
}
-
- private void revokeRuntimePermission(String permName, String packageName,
- boolean overridePolicy, int callingUid, int userId, PermissionCallback callback) {
+
+ private void revokeRuntimePermission(String permName, String packageName, BasePermission bp,
+ boolean overridePolicy, int callingUid, int userId, PermissionCallback callback,
+ boolean permissionRemoved) {
if (!mUserManagerInt.exists(userId)) {
Log.e(TAG, "No such user:" + userId);
return;
@@ -1517,7 +1596,7 @@ public class PermissionManagerService {
if (mPackageManagerInt.filterAppAccess(pkg, Binder.getCallingUid(), userId)) {
throw new IllegalArgumentException("Unknown package: " + packageName);
}
- final BasePermission bp = mSettings.getPermissionLocked(permName);
+
if (bp == null) {
throw new IllegalArgumentException("Unknown permission: " + permName);
}
@@ -2073,8 +2152,10 @@ public class PermissionManagerService {
PermissionManagerService.this.addAllPermissionGroups(pkg, chatty);
}
@Override
- public void removeAllPermissions(Package pkg, boolean chatty) {
- PermissionManagerService.this.removeAllPermissions(pkg, chatty);
+ public void removeAllPermissions(Package pkg, List<String> allPackageNames,
+ PermissionCallback permissionCallback, boolean chatty) {
+ PermissionManagerService.this.removeAllPermissions(
+ pkg, allPackageNames, permissionCallback, chatty);
}
@Override
public boolean addDynamicPermission(PermissionInfo info, boolean async, int callingUid,
@@ -2110,7 +2191,8 @@ public class PermissionManagerService {
boolean overridePolicy, int callingUid, int userId,
PermissionCallback callback) {
PermissionManagerService.this.revokeRuntimePermission(permName, packageName,
- overridePolicy, callingUid, userId, callback);
+ mSettings.getPermission(permName), overridePolicy, callingUid, userId,
+ callback, false);
}
@Override
public void updatePermissions(String packageName, Package pkg, boolean replaceGrant,
diff --git a/services/core/java/com/android/server/policy/BarController.java b/services/core/java/com/android/server/policy/BarController.java
index eca6f9f1ec47..14c985c090a3 100644
--- a/services/core/java/com/android/server/policy/BarController.java
+++ b/services/core/java/com/android/server/policy/BarController.java
@@ -196,7 +196,7 @@ public class BarController {
}
protected boolean skipAnimation() {
- return false;
+ return !mWin.isDrawnLw();
}
private int computeStateLw(boolean wasVis, boolean wasAnim, WindowState win, boolean change) {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index dd448b5f5c38..e2bf0433efde 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -76,6 +76,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CO
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_BAR_EXPANDED;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
@@ -124,7 +125,6 @@ import static android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN;
import static android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION;
import static android.view.WindowManagerGlobal.ADD_OKAY;
import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED;
-
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
import static com.android.server.policy.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED;
@@ -155,7 +155,7 @@ import static com.android.server.wm.WindowManagerPolicyProto.WINDOW_MANAGER_DRAW
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
-import android.app.ActivityManagerInternal.SleepToken;
+import android.app.ActivityTaskManager;
import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.IUiModeManager;
@@ -274,8 +274,8 @@ import com.android.internal.policy.KeyguardDismissCallback;
import com.android.internal.policy.PhoneWindow;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.ScreenshotHelper;
import com.android.internal.util.ScreenShapeHelper;
+import com.android.internal.util.ScreenshotHelper;
import com.android.internal.widget.PointerLocationView;
import com.android.server.GestureLauncherService;
import com.android.server.LocalServices;
@@ -285,10 +285,13 @@ import com.android.server.policy.keyguard.KeyguardServiceDelegate.DrawnListener;
import com.android.server.policy.keyguard.KeyguardStateMonitor.StateCallback;
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.vr.VrManagerInternal;
+import com.android.server.wm.ActivityTaskManagerInternal;
+import com.android.server.wm.ActivityTaskManagerInternal.SleepToken;
import com.android.server.wm.AppTransition;
import com.android.server.wm.DisplayFrames;
import com.android.server.wm.WindowManagerInternal;
import com.android.server.wm.WindowManagerInternal.AppTransitionListener;
+import com.android.server.wm.utils.InsetUtils;
import java.io.File;
import java.io.FileReader;
@@ -476,6 +479,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
WindowManagerInternal mWindowManagerInternal;
PowerManager mPowerManager;
ActivityManagerInternal mActivityManagerInternal;
+ ActivityTaskManagerInternal mActivityTaskManagerInternal;
AutofillManagerInternal mAutofillManagerInternal;
InputManagerInternal mInputManagerInternal;
InputMethodManagerInternal mInputMethodManagerInternal;
@@ -1142,7 +1146,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (mWindowSleepToken != null) {
return;
}
- mWindowSleepToken = mActivityManagerInternal.acquireSleepToken("WindowSleepToken",
+ mWindowSleepToken = mActivityTaskManagerInternal.acquireSleepToken("WindowSleepToken",
DEFAULT_DISPLAY);
};
@@ -2026,6 +2030,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mWindowManagerFuncs = windowManagerFuncs;
mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
+ mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class);
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
@@ -4080,24 +4085,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
hideRecentApps(true, false);
}
- // Handle keyboard layout switching.
- // TODO: Deprecate this behavior when we fully migrate to IME subtype-based layout rotation.
- if (down && repeatCount == 0 && keyCode == KeyEvent.KEYCODE_SPACE
- && ((metaState & KeyEvent.META_CTRL_MASK) != 0)) {
+ // Handle keyboard language switching.
+ final boolean isCtrlOrMetaSpace = keyCode == KeyEvent.KEYCODE_SPACE
+ && (metaState & (KeyEvent.META_CTRL_MASK | KeyEvent.META_META_MASK)) != 0;
+ if (down && repeatCount == 0
+ && (keyCode == KeyEvent.KEYCODE_LANGUAGE_SWITCH || isCtrlOrMetaSpace)) {
int direction = (metaState & KeyEvent.META_SHIFT_MASK) != 0 ? -1 : 1;
mWindowManagerFuncs.switchKeyboardLayout(event.getDeviceId(), direction);
return -1;
}
-
- // Handle input method switching.
- if (down && repeatCount == 0
- && (keyCode == KeyEvent.KEYCODE_LANGUAGE_SWITCH
- || (keyCode == KeyEvent.KEYCODE_SPACE
- && (metaState & KeyEvent.META_META_MASK) != 0))) {
- final boolean forwardDirection = (metaState & KeyEvent.META_SHIFT_MASK) == 0;
- mWindowManagerFuncs.switchInputMethod(forwardDirection);
- return -1;
- }
if (mLanguageSwitchKeyPressed && !down
&& (keyCode == KeyEvent.KEYCODE_LANGUAGE_SWITCH
|| keyCode == KeyEvent.KEYCODE_SPACE)) {
@@ -4542,7 +4538,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
boolean handled = false;
try {
if (event instanceof MotionEvent
@@ -4621,16 +4617,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
// TODO: Should probably be moved into DisplayFrames.
- public boolean getLayoutHintLw(WindowManager.LayoutParams attrs, Rect taskBounds,
- DisplayFrames displayFrames, Rect outFrame, Rect outContentInsets, Rect outStableInsets,
+ public boolean getLayoutHintLw(LayoutParams attrs, Rect taskBounds,
+ DisplayFrames displayFrames, boolean floatingStack, Rect outFrame,
+ Rect outContentInsets, Rect outStableInsets,
Rect outOutsets, DisplayCutout.ParcelableWrapper outDisplayCutout) {
final int fl = PolicyControl.getWindowFlags(null, attrs);
final int pfl = attrs.privateFlags;
final int requestedSysUiVis = PolicyControl.getSystemUiVisibility(null, attrs);
final int sysUiVis = requestedSysUiVis | getImpliedSysUiFlagsForLayout(attrs);
final int displayRotation = displayFrames.mRotation;
- final int displayWidth = displayFrames.mDisplayWidth;
- final int displayHeight = displayFrames.mDisplayHeight;
final boolean useOutsets = outOutsets != null && shouldUseOutsets(attrs, fl);
if (useOutsets) {
@@ -4654,45 +4649,40 @@ public class PhoneWindowManager implements WindowManagerPolicy {
final boolean screenDecor = (pfl & PRIVATE_FLAG_IS_SCREEN_DECOR) != 0;
if (layoutInScreenAndInsetDecor && !screenDecor) {
- int availRight, availBottom;
if (canHideNavigationBar() &&
(sysUiVis & View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) != 0) {
outFrame.set(displayFrames.mUnrestricted);
- availRight = displayFrames.mUnrestricted.right;
- availBottom = displayFrames.mUnrestricted.bottom;
} else {
outFrame.set(displayFrames.mRestricted);
- availRight = displayFrames.mRestricted.right;
- availBottom = displayFrames.mRestricted.bottom;
}
- outStableInsets.set(displayFrames.mStable.left, displayFrames.mStable.top,
- availRight - displayFrames.mStable.right,
- availBottom - displayFrames.mStable.bottom);
- if ((sysUiVis & View.SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) {
+ final Rect sf;
+ if (floatingStack) {
+ sf = null;
+ } else {
+ sf = displayFrames.mStable;
+ }
+
+ final Rect cf;
+ if (floatingStack) {
+ cf = null;
+ } else if ((sysUiVis & View.SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) {
if ((fl & FLAG_FULLSCREEN) != 0) {
- outContentInsets.set(displayFrames.mStableFullscreen.left,
- displayFrames.mStableFullscreen.top,
- availRight - displayFrames.mStableFullscreen.right,
- availBottom - displayFrames.mStableFullscreen.bottom);
+ cf = displayFrames.mStableFullscreen;
} else {
- outContentInsets.set(outStableInsets);
+ cf = displayFrames.mStable;
}
} else if ((fl & FLAG_FULLSCREEN) != 0 || (fl & FLAG_LAYOUT_IN_OVERSCAN) != 0) {
- outContentInsets.setEmpty();
+ cf = displayFrames.mOverscan;
} else {
- outContentInsets.set(displayFrames.mCurrent.left, displayFrames.mCurrent.top,
- availRight - displayFrames.mCurrent.right,
- availBottom - displayFrames.mCurrent.bottom);
+ cf = displayFrames.mCurrent;
}
if (taskBounds != null) {
- calculateRelevantTaskInsets(taskBounds, outContentInsets,
- displayWidth, displayHeight);
- calculateRelevantTaskInsets(taskBounds, outStableInsets,
- displayWidth, displayHeight);
outFrame.intersect(taskBounds);
}
+ InsetUtils.insetsBetweenFrames(outFrame, cf, outContentInsets);
+ InsetUtils.insetsBetweenFrames(outFrame, sf, outStableInsets);
outDisplayCutout.set(displayFrames.mDisplayCutout.calculateRelativeTo(outFrame)
.getDisplayCutout());
return mForceShowSystemBars;
@@ -4713,22 +4703,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
- /**
- * For any given task bounds, the insets relevant for these bounds given the insets relevant
- * for the entire display.
- */
- private void calculateRelevantTaskInsets(Rect taskBounds, Rect inOutInsets, int displayWidth,
- int displayHeight) {
- mTmpRect.set(0, 0, displayWidth, displayHeight);
- mTmpRect.inset(inOutInsets);
- mTmpRect.intersect(taskBounds);
- int leftInset = mTmpRect.left - taskBounds.left;
- int topInset = mTmpRect.top - taskBounds.top;
- int rightInset = taskBounds.right - mTmpRect.right;
- int bottomInset = taskBounds.bottom - mTmpRect.bottom;
- inOutInsets.set(leftInset, topInset, rightInset, bottomInset);
- }
-
private boolean shouldUseOutsets(WindowManager.LayoutParams attrs, int fl) {
return attrs.type == TYPE_WALLPAPER || (fl & (WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN)) != 0;
@@ -4772,8 +4746,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
navTranslucent &= areTranslucentBarsAllowed();
}
boolean statusBarExpandedNotKeyguard = !isKeyguardShowing && mStatusBar != null
- && mStatusBar.getAttrs().height == MATCH_PARENT
- && mStatusBar.getAttrs().width == MATCH_PARENT;
+ && (mStatusBar.getAttrs().privateFlags & PRIVATE_FLAG_STATUS_BAR_EXPANDED) != 0;
// When the navigation bar isn't visible, we put up a fake input window to catch all
// touch events. This way we can detect when the user presses anywhere to bring back the
@@ -5776,7 +5749,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
// Take note if a window wants to acquire a sleep token.
- if (win.isVisibleLw() && (attrs.privateFlags & PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN) != 0
+ if ((attrs.privateFlags & PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN) != 0
&& win.canAcquireSleepToken()) {
mWindowSleepTokenNeeded = true;
}
@@ -5832,9 +5805,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mStatusBarController.setShowTransparent(true /* transparent */);
}
- WindowManager.LayoutParams statusBarAttrs = mStatusBar.getAttrs();
- boolean statusBarExpanded = statusBarAttrs.height == MATCH_PARENT
- && statusBarAttrs.width == MATCH_PARENT;
+ boolean statusBarExpanded =
+ (mStatusBar.getAttrs().privateFlags & PRIVATE_FLAG_STATUS_BAR_EXPANDED) != 0;
boolean topAppHidesStatusBar = topAppHidesStatusBar();
if (mForceStatusBar || mForceStatusBarFromKeyguard || mForceStatusBarTransparent
|| statusBarExpanded) {
@@ -7034,7 +7006,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
} else {
if (DEBUG_WAKEUP) Slog.d(TAG,
"null mKeyguardDelegate: setting mKeyguardDrawComplete.");
- finishKeyguardDrawn();
+ mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE);
}
}
}
@@ -7901,7 +7873,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void updateDreamingSleepToken(boolean acquire) {
if (acquire) {
if (mDreamingSleepToken == null) {
- mDreamingSleepToken = mActivityManagerInternal.acquireSleepToken(
+ mDreamingSleepToken = mActivityTaskManagerInternal.acquireSleepToken(
"Dream", DEFAULT_DISPLAY);
}
} else {
@@ -7916,7 +7888,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void updateScreenOffSleepToken(boolean acquire) {
if (acquire) {
if (mScreenOffSleepToken == null) {
- mScreenOffSleepToken = mActivityManagerInternal.acquireSleepToken(
+ mScreenOffSleepToken = mActivityTaskManagerInternal.acquireSleepToken(
"ScreenOff", DEFAULT_DISPLAY);
}
} else {
@@ -8097,7 +8069,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
sendCloseSystemWindows();
Intent dock = createHomeDockIntent();
if (dock != null) {
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivityAsUser(null, null, dock,
dock.resolveTypeIfNeeded(mContext.getContentResolver()),
null, null, 0,
@@ -8108,7 +8080,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
}
- int result = ActivityManager.getService()
+ int result = ActivityTaskManager.getService()
.startActivityAsUser(null, null, mHomeIntent,
mHomeIntent.resolveTypeIfNeeded(mContext.getContentResolver()),
null, null, 0,
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index a02ee225861d..1ebbe3ac36fa 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -71,7 +71,6 @@ import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
-import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.IBinder;
@@ -568,13 +567,6 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
*/
public void switchKeyboardLayout(int deviceId, int direction);
- /**
- * Switch the input method, to be precise, input method subtype.
- *
- * @param forwardDirection {@code true} to rotate in a forward direction.
- */
- public void switchInputMethod(boolean forwardDirection);
-
public void shutdown(boolean confirm);
public void reboot(boolean confirm);
public void rebootSafeMode(boolean confirm);
@@ -1187,6 +1179,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
* @param taskBounds The bounds of the task this window is on or {@code null} if no task is
* associated with the window.
* @param displayFrames display frames.
+ * @param floatingStack Whether the window's stack is floating.
* @param outFrame The frame of the window.
* @param outContentInsets The areas covered by system windows, expressed as positive insets.
* @param outStableInsets The areas covered by stable system windows irrespective of their
@@ -1197,8 +1190,8 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
* See {@link #isNavBarForcedShownLw(WindowState)}.
*/
default boolean getLayoutHintLw(WindowManager.LayoutParams attrs, Rect taskBounds,
- DisplayFrames displayFrames, Rect outFrame, Rect outContentInsets,
- Rect outStableInsets, Rect outOutsets,
+ DisplayFrames displayFrames, boolean floatingStack,
+ Rect outFrame, Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
DisplayCutout.ParcelableWrapper outDisplayCutout) {
return false;
}
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 81a8c55c5aea..1e0b52adb2f4 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -8,6 +8,7 @@ import static com.android.server.wm.KeyguardServiceDelegateProto.SECURE;
import static com.android.server.wm.KeyguardServiceDelegateProto.SHOWING;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -213,7 +214,7 @@ public class KeyguardServiceDelegate {
// There are no longer any keyguard windows on secondary displays, so pass
// INVALID_DISPLAY. All that means is that showWhenLocked activities on
// secondary displays now get to show.
- ActivityManager.getService().setLockScreenShown(true /* keyguardShowing */,
+ ActivityTaskManager.getService().setLockScreenShown(true /* keyguardShowing */,
false /* aodShowing */, INVALID_DISPLAY);
} catch (RemoteException e) {
// Local call.
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index eecf17acba3f..d44561181aa3 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -47,6 +47,7 @@ import android.os.WorkSource;
import android.provider.Settings;
import android.util.EventLog;
import android.util.Slog;
+import android.util.StatsLog;
import android.view.inputmethod.InputMethodManagerInternal;
import com.android.internal.app.IBatteryStats;
@@ -231,8 +232,13 @@ final class Notifier {
try {
if (workSource != null) {
mBatteryStats.noteLongPartialWakelockStartFromSource(tag, historyTag, workSource);
+ StatsLog.write(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED, workSource,
+ tag, historyTag, StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__ON);
} else {
mBatteryStats.noteLongPartialWakelockStart(tag, historyTag, ownerUid);
+ StatsLog.write_non_chained(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED,
+ ownerUid, null, tag, historyTag,
+ StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__ON);
}
} catch (RemoteException ex) {
// Ignore
@@ -249,8 +255,13 @@ final class Notifier {
try {
if (workSource != null) {
mBatteryStats.noteLongPartialWakelockFinishFromSource(tag, historyTag, workSource);
+ StatsLog.write(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED, workSource,
+ tag, historyTag, StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__OFF);
} else {
mBatteryStats.noteLongPartialWakelockFinish(tag, historyTag, ownerUid);
+ StatsLog.write_non_chained(StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED,
+ ownerUid, null, tag, historyTag,
+ StatsLog.LONG_PARTIAL_WAKELOCK_STATE_CHANGED__STATE__OFF);
}
} catch (RemoteException ex) {
// Ignore
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 697801f7787a..9468dd754619 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -219,8 +219,8 @@ public final class PowerManagerService extends SystemService
private static final int HALT_MODE_REBOOT = 1;
private static final int HALT_MODE_REBOOT_SAFE_MODE = 2;
- // Persistent property for last reboot reason
- private static final String LAST_REBOOT_PROPERTY = "persist.sys.boot.reason";
+ // property for last reboot reason
+ private static final String REBOOT_PROPERTY = "sys.boot.reason";
private final Context mContext;
private final ServiceThread mHandlerThread;
@@ -4398,7 +4398,7 @@ public final class PowerManagerService extends SystemService
final long ident = Binder.clearCallingIdentity();
try {
- return getLastShutdownReasonInternal(LAST_REBOOT_PROPERTY);
+ return getLastShutdownReasonInternal(REBOOT_PROPERTY);
} finally {
Binder.restoreCallingIdentity(ident);
}
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
index dd6d71e3b7a3..4c88bf44d5a8 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
@@ -72,7 +72,7 @@ public class BatterySaverStateMachine {
@GuardedBy("mLock")
private int mBatteryLevel;
- /** Whether the battery level is considered to be "low" or not.*/
+ /** Whether the battery level is considered to be "low" or not. */
@GuardedBy("mLock")
private boolean mIsBatteryLevelLow;
@@ -84,6 +84,9 @@ public class BatterySaverStateMachine {
@GuardedBy("mLock")
private boolean mSettingBatterySaverEnabledSticky;
+ /** Config flag to track if battery saver's sticky behaviour is disabled. */
+ private final boolean mBatterySaverStickyBehaviourDisabled;
+
/**
* Previously known value of Global.LOW_POWER_MODE_TRIGGER_LEVEL.
* (Currently only used in dumpsys.)
@@ -124,6 +127,9 @@ public class BatterySaverStateMachine {
mLock = lock;
mContext = context;
mBatterySaverController = batterySaverController;
+
+ mBatterySaverStickyBehaviourDisabled = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled);
}
private boolean isBatterySaverEnabled() {
@@ -304,7 +310,7 @@ public class BatterySaverStateMachine {
BatterySaverController.REASON_PLUGGED_IN,
"Plugged in");
- } else if (mSettingBatterySaverEnabledSticky) {
+ } else if (mSettingBatterySaverEnabledSticky && !mBatterySaverStickyBehaviourDisabled) {
// Re-enable BS.
enableBatterySaverLocked(/*enable=*/ true, /*manual=*/ true,
BatterySaverController.REASON_STICKY_RESTORE,
@@ -383,8 +389,9 @@ public class BatterySaverStateMachine {
putGlobalSetting(Global.LOW_POWER_MODE, enable ? 1 : 0);
if (manual) {
- mSettingBatterySaverEnabledSticky = enable;
- putGlobalSetting(Global.LOW_POWER_MODE_STICKY, enable ? 1 : 0);
+ mSettingBatterySaverEnabledSticky = !mBatterySaverStickyBehaviourDisabled && enable;
+ putGlobalSetting(Global.LOW_POWER_MODE_STICKY,
+ mSettingBatterySaverEnabledSticky ? 1 : 0);
}
mBatterySaverController.enableBatterySaver(enable, intReason);
@@ -449,6 +456,8 @@ public class BatterySaverStateMachine {
pw.println(mSettingBatterySaverEnabledSticky);
pw.print(" mSettingBatterySaverTriggerThreshold=");
pw.println(mSettingBatterySaverTriggerThreshold);
+ pw.print(" mBatterySaverStickyBehaviourDisabled=");
+ pw.println(mBatterySaverStickyBehaviourDisabled);
}
}
diff --git a/services/core/java/com/android/server/search/SearchManagerService.java b/services/core/java/com/android/server/search/SearchManagerService.java
index c3fa82344941..bc1a12fac393 100644
--- a/services/core/java/com/android/server/search/SearchManagerService.java
+++ b/services/core/java/com/android/server/search/SearchManagerService.java
@@ -17,7 +17,9 @@
package com.android.server.search;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.ISearchManager;
import android.app.SearchManager;
import android.app.SearchableInfo;
@@ -307,7 +309,7 @@ public class SearchManagerService extends ISearchManager.Stub {
Intent intent = new Intent(VoiceInteractionService.SERVICE_INTERFACE);
intent.setComponent(comp);
- IActivityManager am = ActivityManager.getService();
+ IActivityTaskManager am = ActivityTaskManager.getService();
if (args != null) {
args.putInt(Intent.EXTRA_KEY_EVENT, android.view.KeyEvent.KEYCODE_ASSIST);
}
diff --git a/services/core/java/com/android/server/slice/PinnedSliceState.java b/services/core/java/com/android/server/slice/PinnedSliceState.java
index 4e7fb969f398..e139ab86775d 100644
--- a/services/core/java/com/android/server/slice/PinnedSliceState.java
+++ b/services/core/java/com/android/server/slice/PinnedSliceState.java
@@ -154,8 +154,8 @@ public class PinnedSliceState {
}
ContentProviderClient getClient() {
- ContentProviderClient client =
- mService.getContext().getContentResolver().acquireContentProviderClient(mUri);
+ ContentProviderClient client = mService.getContext().getContentResolver()
+ .acquireUnstableContentProviderClient(mUri);
if (client == null) return null;
client.setDetectNotResponding(SLICE_TIMEOUT);
return client;
diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java
index c3b984172802..ded2c1536bb8 100644
--- a/services/core/java/com/android/server/slice/SliceManagerService.java
+++ b/services/core/java/com/android/server/slice/SliceManagerService.java
@@ -42,6 +42,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Binder;
@@ -197,6 +198,7 @@ public class SliceManagerService extends ISliceManager.Stub {
public SliceSpec[] getPinnedSpecs(Uri uri, String pkg) throws RemoteException {
verifyCaller(pkg);
enforceAccess(pkg, uri);
+ uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
return getPinnedSlice(uri).getSpecs();
}
@@ -395,30 +397,11 @@ public class SliceManagerService extends ISliceManager.Stub {
private String getProviderPkg(Uri uri, int user) {
long ident = Binder.clearCallingIdentity();
try {
- IBinder token = new Binder();
- IActivityManager activityManager = ActivityManager.getService();
- ContentProviderHolder holder = null;
String providerName = getUriWithoutUserId(uri).getAuthority();
- try {
- try {
- holder = activityManager.getContentProviderExternal(
- providerName, getUserIdFromUri(uri, user), token);
- if (holder != null && holder.info != null) {
- return holder.info.packageName;
- } else {
- return null;
- }
- } finally {
- if (holder != null && holder.provider != null) {
- activityManager.removeContentProviderExternal(providerName, token);
- }
- }
- } catch (RemoteException e) {
- // Can't happen.
- throw e.rethrowAsRuntimeException();
- }
+ ProviderInfo provider = mContext.getPackageManager().resolveContentProviderAsUser(
+ providerName, 0, getUserIdFromUri(uri, user));
+ return provider.packageName;
} finally {
- // I know, the double finally seems ugly, but seems safest for the identity.
Binder.restoreCallingIdentity(ident);
}
}
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index 37984163e4a9..c7c24a562696 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -18,6 +18,7 @@ package com.android.server.stats;
import android.annotation.Nullable;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
+import android.app.AlarmManager.OnAlarmListener;
import android.app.PendingIntent;
import android.app.ProcessMemoryState;
import android.app.StatsManager;
@@ -56,11 +57,14 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.telephony.ModemActivityInfo;
import android.telephony.TelephonyManager;
+import android.util.ArrayMap;
import android.util.Slog;
import android.util.StatsLog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.net.NetworkStatsFactory;
+import com.android.internal.os.BinderCallsStats;
+import com.android.internal.os.BinderCallsStats.ExportedCallStat;
import com.android.internal.os.KernelCpuSpeedReader;
import com.android.internal.os.KernelUidCpuTimeReader;
import com.android.internal.os.KernelUidCpuClusterTimeReader;
@@ -124,9 +128,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
private static IStatsManager sStatsd;
private static final Object sStatsdLock = new Object();
- private final PendingIntent mAnomalyAlarmIntent;
- private final PendingIntent mPullingAlarmIntent;
- private final PendingIntent mPeriodicAlarmIntent;
+ private final OnAlarmListener mAnomalyAlarmListener = new AnomalyAlarmListener();
+ private final OnAlarmListener mPullingAlarmListener = new PullingAlarmListener();
+ private final OnAlarmListener mPeriodicAlarmListener = new PeriodicAlarmListener();
private final BroadcastReceiver mAppUpdateReceiver;
private final BroadcastReceiver mUserUpdateReceiver;
private final ShutdownEventReceiver mShutdownEventReceiver;
@@ -158,12 +162,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
mContext = context;
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
- mAnomalyAlarmIntent = PendingIntent.getBroadcast(mContext, 0,
- new Intent(mContext, AnomalyAlarmReceiver.class), 0);
- mPullingAlarmIntent = PendingIntent.getBroadcast(
- mContext, 0, new Intent(mContext, PullingAlarmReceiver.class), 0);
- mPeriodicAlarmIntent = PendingIntent.getBroadcast(
- mContext, 0, new Intent(mContext, PeriodicAlarmReceiver.class), 0);
mAppUpdateReceiver = new AppUpdateReceiver();
mUserUpdateReceiver = new BroadcastReceiver() {
@Override
@@ -345,9 +343,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
}
}
- public final static class AnomalyAlarmReceiver extends BroadcastReceiver {
+ public final static class AnomalyAlarmListener implements OnAlarmListener {
@Override
- public void onReceive(Context context, Intent intent) {
+ public void onAlarm() {
Slog.i(TAG, "StatsCompanionService believes an anomaly has occurred at time "
+ System.currentTimeMillis() + "ms.");
synchronized (sStatsdLock) {
@@ -366,9 +364,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
}
}
- public final static class PullingAlarmReceiver extends BroadcastReceiver {
+ public final static class PullingAlarmListener implements OnAlarmListener {
@Override
- public void onReceive(Context context, Intent intent) {
+ public void onAlarm() {
if (DEBUG)
Slog.d(TAG, "Time to poll something.");
synchronized (sStatsdLock) {
@@ -386,9 +384,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
}
}
- public final static class PeriodicAlarmReceiver extends BroadcastReceiver {
+ public final static class PeriodicAlarmListener implements OnAlarmListener {
@Override
- public void onReceive(Context context, Intent intent) {
+ public void onAlarm() {
if (DEBUG)
Slog.d(TAG, "Time to trigger periodic alarm.");
synchronized (sStatsdLock) {
@@ -442,9 +440,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
try {
// using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
// only fire when it awakens.
- // This alarm is inexact, leaving its exactness completely up to the OS optimizations.
- // AlarmManager will automatically cancel any previous mAnomalyAlarmIntent alarm.
- mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, mAnomalyAlarmIntent);
+ // AlarmManager will automatically cancel any previous mAnomalyAlarmListener alarm.
+ mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, TAG + ".anomaly",
+ mAnomalyAlarmListener, null);
} finally {
Binder.restoreCallingIdentity(callingToken);
}
@@ -456,7 +454,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
if (DEBUG) Slog.d(TAG, "Cancelling anomaly alarm");
final long callingToken = Binder.clearCallingIdentity();
try {
- mAlarmManager.cancel(mAnomalyAlarmIntent);
+ mAlarmManager.cancel(mAnomalyAlarmListener);
} finally {
Binder.restoreCallingIdentity(callingToken);
}
@@ -472,7 +470,8 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
try {
// using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
// only fire when it awakens.
- mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, mPeriodicAlarmIntent);
+ mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, TAG + ".periodic",
+ mPeriodicAlarmListener, null);
} finally {
Binder.restoreCallingIdentity(callingToken);
}
@@ -485,7 +484,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
Slog.d(TAG, "Cancelling periodic alarm");
final long callingToken = Binder.clearCallingIdentity();
try {
- mAlarmManager.cancel(mPeriodicAlarmIntent);
+ mAlarmManager.cancel(mPeriodicAlarmListener);
} finally {
Binder.restoreCallingIdentity(callingToken);
}
@@ -493,31 +492,33 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
@Override // Binder call
public void setPullingAlarm(long nextPullTimeMs) {
- enforceCallingPermission();
- if (DEBUG)
- Slog.d(TAG,
- "Setting pulling alarm in about " + (nextPullTimeMs - SystemClock.elapsedRealtime()));
- final long callingToken = Binder.clearCallingIdentity();
- try {
- // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
- // only fire when it awakens.
- mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, nextPullTimeMs, mPullingAlarmIntent);
- } finally {
- Binder.restoreCallingIdentity(callingToken);
- }
+ enforceCallingPermission();
+ if (DEBUG) {
+ Slog.d(TAG, "Setting pulling alarm in about "
+ + (nextPullTimeMs - SystemClock.elapsedRealtime()));
+ }
+ final long callingToken = Binder.clearCallingIdentity();
+ try {
+ // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
+ // only fire when it awakens.
+ mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, nextPullTimeMs, TAG + ".pull",
+ mPullingAlarmListener, null);
+ } finally {
+ Binder.restoreCallingIdentity(callingToken);
+ }
}
@Override // Binder call
public void cancelPullingAlarm() {
- enforceCallingPermission();
- if (DEBUG)
- Slog.d(TAG, "Cancelling pulling alarm");
- final long callingToken = Binder.clearCallingIdentity();
- try {
- mAlarmManager.cancel(mPullingAlarmIntent);
- } finally {
- Binder.restoreCallingIdentity(callingToken);
- }
+ enforceCallingPermission();
+ if (DEBUG)
+ Slog.d(TAG, "Cancelling pulling alarm");
+ final long callingToken = Binder.clearCallingIdentity();
+ try {
+ mAlarmManager.cancel(mPullingAlarmListener);
+ } finally {
+ Binder.restoreCallingIdentity(callingToken);
+ }
}
private void addNetworkStats(
@@ -893,6 +894,26 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
}
}
+ private void pullBinderCallsStats(int tagId, List<StatsLogEventWrapper> pulledData) {
+ List<ExportedCallStat> callStats = BinderCallsStats.getInstance().getExportedCallStats();
+ long elapsedNanos = SystemClock.elapsedRealtimeNanos();
+ for (ExportedCallStat callStat : callStats) {
+ StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 11 /* fields */);
+ e.writeInt(callStat.uid);
+ e.writeString(callStat.className);
+ e.writeString(callStat.methodName);
+ e.writeLong(callStat.callCount);
+ e.writeLong(callStat.exceptionCount);
+ e.writeLong(callStat.latencyMicros);
+ e.writeLong(callStat.maxLatencyMicros);
+ e.writeLong(callStat.cpuTimeMicros);
+ e.writeLong(callStat.maxCpuTimeMicros);
+ e.writeLong(callStat.maxReplySizeBytes);
+ e.writeLong(callStat.maxRequestSizeBytes);
+ pulledData.add(e);
+ }
+ }
+
/**
* Pulls various data.
*/
@@ -975,6 +996,10 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
pullProcessMemoryState(tagId, ret);
break;
}
+ case StatsLog.BINDER_CALLS: {
+ pullBinderCallsStats(tagId, ret);
+ break;
+ }
default:
Slog.w(TAG, "No such tagId data as " + tagId);
return null;
diff --git a/services/core/java/com/android/server/timedetector/SimpleTimeDetectorStrategy.java b/services/core/java/com/android/server/timedetector/SimpleTimeDetectorStrategy.java
new file mode 100644
index 000000000000..7bdc8a32815a
--- /dev/null
+++ b/services/core/java/com/android/server/timedetector/SimpleTimeDetectorStrategy.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timedetector;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.AlarmManager;
+import android.app.timedetector.TimeSignal;
+import android.content.Intent;
+import android.util.Slog;
+import android.util.TimestampedValue;
+
+import com.android.internal.telephony.TelephonyIntents;
+
+import java.io.PrintWriter;
+
+/**
+ * An implementation of TimeDetectorStrategy that passes only NITZ suggestions to
+ * {@link AlarmManager}. The TimeDetectorService handles thread safety: all calls to
+ * this class can be assumed to be single threaded (though the thread used may vary).
+ */
+// @NotThreadSafe
+public final class SimpleTimeDetectorStrategy implements TimeDetectorStrategy {
+
+ private final static String TAG = "timedetector.SimpleTimeDetectorStrategy";
+
+ /**
+ * CLOCK_PARANOIA: The maximum difference allowed between the expected system clock time and the
+ * actual system clock time before a warning is logged. Used to help identify situations where
+ * there is something other than this class setting the system clock.
+ */
+ private static final long SYSTEM_CLOCK_PARANOIA_THRESHOLD_MILLIS = 2 * 1000;
+
+ // @NonNull after initialize()
+ private Callback mCallback;
+
+ // NITZ state.
+ @Nullable private TimestampedValue<Long> mLastNitzTime;
+
+
+ // Information about the last time signal received: Used when toggling auto-time.
+ @Nullable private TimestampedValue<Long> mLastSystemClockTime;
+ private boolean mLastSystemClockTimeSendNetworkBroadcast;
+
+ // System clock state.
+ @Nullable private TimestampedValue<Long> mLastSystemClockTimeSet;
+
+ @Override
+ public void initialize(@NonNull Callback callback) {
+ mCallback = callback;
+ }
+
+ @Override
+ public void suggestTime(@NonNull TimeSignal timeSignal) {
+ if (!TimeSignal.SOURCE_ID_NITZ.equals(timeSignal.getSourceId())) {
+ Slog.w(TAG, "Ignoring signal from unsupported source: " + timeSignal);
+ return;
+ }
+
+ // NITZ logic
+
+ TimestampedValue<Long> newNitzUtcTime = timeSignal.getUtcTime();
+ boolean nitzTimeIsValid = validateNewNitzTime(newNitzUtcTime, mLastNitzTime);
+ if (!nitzTimeIsValid) {
+ return;
+ }
+ // Always store the last NITZ value received, regardless of whether we go on to use it to
+ // update the system clock. This is so that we can validate future NITZ signals.
+ mLastNitzTime = newNitzUtcTime;
+
+ // System clock update logic.
+
+ // Historically, Android has sent a telephony broadcast only when setting the time using
+ // NITZ.
+ final boolean sendNetworkBroadcast =
+ TimeSignal.SOURCE_ID_NITZ.equals(timeSignal.getSourceId());
+
+ final TimestampedValue<Long> newUtcTime = newNitzUtcTime;
+ setSystemClockIfRequired(newUtcTime, sendNetworkBroadcast);
+ }
+
+ private static boolean validateNewNitzTime(TimestampedValue<Long> newNitzUtcTime,
+ TimestampedValue<Long> lastNitzTime) {
+
+ if (lastNitzTime != null) {
+ long referenceTimeDifference =
+ TimestampedValue.referenceTimeDifference(newNitzUtcTime, lastNitzTime);
+ if (referenceTimeDifference < 0 || referenceTimeDifference > Integer.MAX_VALUE) {
+ // Out of order or bogus.
+ Slog.w(TAG, "validateNewNitzTime: Bad NITZ signal received."
+ + " referenceTimeDifference=" + referenceTimeDifference
+ + " lastNitzTime=" + lastNitzTime
+ + " newNitzUtcTime=" + newNitzUtcTime);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void setSystemClockIfRequired(
+ TimestampedValue<Long> time, boolean sendNetworkBroadcast) {
+
+ // Store the last candidate we've seen in all cases so we can set the system clock
+ // when/if time detection is enabled.
+ mLastSystemClockTime = time;
+ mLastSystemClockTimeSendNetworkBroadcast = sendNetworkBroadcast;
+
+ if (!mCallback.isTimeDetectionEnabled()) {
+ Slog.d(TAG, "setSystemClockIfRequired: Time detection is not enabled. time=" + time);
+ return;
+ }
+
+ mCallback.acquireWakeLock();
+ try {
+ long elapsedRealtimeMillis = mCallback.elapsedRealtimeMillis();
+ long actualTimeMillis = mCallback.systemClockMillis();
+
+ // CLOCK_PARANOIA : Check to see if this class owns the clock or if something else
+ // may be setting the clock.
+ if (mLastSystemClockTimeSet != null) {
+ long expectedTimeMillis = TimeDetectorStrategy.getTimeAt(
+ mLastSystemClockTimeSet, elapsedRealtimeMillis);
+ long absSystemClockDifference = Math.abs(expectedTimeMillis - actualTimeMillis);
+ if (absSystemClockDifference > SYSTEM_CLOCK_PARANOIA_THRESHOLD_MILLIS) {
+ Slog.w(TAG, "System clock has not tracked elapsed real time clock. A clock may"
+ + " be inaccurate or something unexpectedly set the system clock."
+ + " elapsedRealtimeMillis=" + elapsedRealtimeMillis
+ + " expectedTimeMillis=" + expectedTimeMillis
+ + " actualTimeMillis=" + actualTimeMillis);
+ }
+ }
+
+ final String reason = "New time signal";
+ adjustAndSetDeviceSystemClock(
+ time, sendNetworkBroadcast, elapsedRealtimeMillis, actualTimeMillis, reason);
+ } finally {
+ mCallback.releaseWakeLock();
+ }
+ }
+
+ @Override
+ public void handleAutoTimeDetectionToggle(boolean enabled) {
+ // If automatic time detection is enabled we update the system clock instantly if we can.
+ // Conversely, if automatic time detection is disabled we leave the clock as it is.
+ if (enabled) {
+ if (mLastSystemClockTime != null) {
+ // Only send the network broadcast if the last candidate would have caused one.
+ final boolean sendNetworkBroadcast = mLastSystemClockTimeSendNetworkBroadcast;
+
+ mCallback.acquireWakeLock();
+ try {
+ long elapsedRealtimeMillis = mCallback.elapsedRealtimeMillis();
+ long actualTimeMillis = mCallback.systemClockMillis();
+
+ final String reason = "Automatic time detection enabled.";
+ adjustAndSetDeviceSystemClock(mLastSystemClockTime, sendNetworkBroadcast,
+ elapsedRealtimeMillis, actualTimeMillis, reason);
+ } finally {
+ mCallback.releaseWakeLock();
+ }
+ }
+ } else {
+ // CLOCK_PARANOIA: We are losing "control" of the system clock so we cannot predict what
+ // it should be in future.
+ mLastSystemClockTimeSet = null;
+ }
+ }
+
+ @Override
+ public void dump(@NonNull PrintWriter pw, @Nullable String[] args) {
+ pw.println("mLastNitzTime=" + mLastNitzTime);
+ pw.println("mLastSystemClockTimeSet=" + mLastSystemClockTimeSet);
+ pw.println("mLastSystemClockTime=" + mLastSystemClockTime);
+ pw.println("mLastSystemClockTimeSendNetworkBroadcast="
+ + mLastSystemClockTimeSendNetworkBroadcast);
+ }
+
+ private void adjustAndSetDeviceSystemClock(
+ TimestampedValue<Long> newTime, boolean sendNetworkBroadcast,
+ long elapsedRealtimeMillis, long actualSystemClockMillis, String reason) {
+
+ // Adjust for the time that has elapsed since the signal was received.
+ long newSystemClockMillis = TimeDetectorStrategy.getTimeAt(newTime, elapsedRealtimeMillis);
+
+ // Check if the new signal would make sufficient difference to the system clock. If it's
+ // below the threshold then ignore it.
+ long absTimeDifference = Math.abs(newSystemClockMillis - actualSystemClockMillis);
+ long systemClockUpdateThreshold = mCallback.systemClockUpdateThresholdMillis();
+ if (absTimeDifference < systemClockUpdateThreshold) {
+ Slog.d(TAG, "adjustAndSetDeviceSystemClock: Not setting system clock. New time and"
+ + " system clock are close enough."
+ + " elapsedRealtimeMillis=" + elapsedRealtimeMillis
+ + " newTime=" + newTime
+ + " reason=" + reason
+ + " systemClockUpdateThreshold=" + systemClockUpdateThreshold
+ + " absTimeDifference=" + absTimeDifference);
+ return;
+ }
+
+ Slog.d(TAG, "Setting system clock using time=" + newTime
+ + " reason=" + reason
+ + " elapsedRealtimeMillis=" + elapsedRealtimeMillis
+ + " newTimeMillis=" + newSystemClockMillis);
+ mCallback.setSystemClock(newSystemClockMillis);
+
+ // CLOCK_PARANOIA : Record the last time this class set the system clock.
+ mLastSystemClockTimeSet = newTime;
+
+ if (sendNetworkBroadcast) {
+ // Send a broadcast that telephony code used to send after setting the clock.
+ // TODO Remove this broadcast as soon as there are no remaining listeners.
+ Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIME);
+ intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+ intent.putExtra("time", newSystemClockMillis);
+ mCallback.sendStickyBroadcast(intent);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorService.java b/services/core/java/com/android/server/timedetector/TimeDetectorService.java
new file mode 100644
index 000000000000..9c830003cab4
--- /dev/null
+++ b/services/core/java/com/android/server/timedetector/TimeDetectorService.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timedetector;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.timedetector.ITimeDetectorService;
+import android.app.timedetector.TimeSignal;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Binder;
+import android.provider.Settings;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.DumpUtils;
+import com.android.server.FgThread;
+import com.android.server.SystemService;
+import com.android.server.timedetector.TimeDetectorStrategy.Callback;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.Objects;
+
+public final class TimeDetectorService extends ITimeDetectorService.Stub {
+ private static final String TAG = "timedetector.TimeDetectorService";
+
+ public static class Lifecycle extends SystemService {
+
+ public Lifecycle(@NonNull Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onStart() {
+ TimeDetectorService service = TimeDetectorService.create(getContext());
+
+ // Publish the binder service so it can be accessed from other (appropriately
+ // permissioned) processes.
+ publishBinderService(Context.TIME_DETECTOR_SERVICE, service);
+ }
+ }
+
+ @NonNull private final Context mContext;
+ @NonNull private final Callback mCallback;
+
+ // The lock used when call the strategy to ensure thread safety.
+ @NonNull private final Object mStrategyLock = new Object();
+
+ @GuardedBy("mStrategyLock")
+ @NonNull private final TimeDetectorStrategy mTimeDetectorStrategy;
+
+ private static TimeDetectorService create(@NonNull Context context) {
+ final TimeDetectorStrategy timeDetector = new SimpleTimeDetectorStrategy();
+ final TimeDetectorStrategyCallbackImpl callback =
+ new TimeDetectorStrategyCallbackImpl(context);
+ timeDetector.initialize(callback);
+
+ TimeDetectorService timeDetectorService =
+ new TimeDetectorService(context, callback, timeDetector);
+
+ // Wire up event listening.
+ ContentResolver contentResolver = context.getContentResolver();
+ contentResolver.registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.AUTO_TIME), true,
+ new ContentObserver(FgThread.getHandler()) {
+ public void onChange(boolean selfChange) {
+ timeDetectorService.handleAutoTimeDetectionToggle();
+ }
+ });
+
+ return timeDetectorService;
+ }
+
+ @VisibleForTesting
+ public TimeDetectorService(@NonNull Context context, @NonNull Callback callback,
+ @NonNull TimeDetectorStrategy timeDetectorStrategy) {
+ mContext = Objects.requireNonNull(context);
+ mCallback = Objects.requireNonNull(callback);
+ mTimeDetectorStrategy = Objects.requireNonNull(timeDetectorStrategy);
+ }
+
+ @Override
+ public void suggestTime(@NonNull TimeSignal timeSignal) {
+ enforceSetTimePermission();
+ Objects.requireNonNull(timeSignal);
+
+ long idToken = Binder.clearCallingIdentity();
+ try {
+ synchronized (mStrategyLock) {
+ mTimeDetectorStrategy.suggestTime(timeSignal);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(idToken);
+ }
+ }
+
+ @VisibleForTesting
+ public void handleAutoTimeDetectionToggle() {
+ synchronized (mStrategyLock) {
+ final boolean timeDetectionEnabled = mCallback.isTimeDetectionEnabled();
+ mTimeDetectorStrategy.handleAutoTimeDetectionToggle(timeDetectionEnabled);
+ }
+ }
+
+ @Override
+ protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw,
+ @Nullable String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
+
+ synchronized (mStrategyLock) {
+ mTimeDetectorStrategy.dump(pw, args);
+ }
+ }
+
+ private void enforceSetTimePermission() {
+ mContext.enforceCallingPermission(android.Manifest.permission.SET_TIME, "set time");
+ }
+} \ No newline at end of file
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategy.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategy.java
new file mode 100644
index 000000000000..e050865d96c7
--- /dev/null
+++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategy.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timedetector;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.timedetector.TimeSignal;
+import android.content.Intent;
+import android.util.TimestampedValue;
+
+import java.io.PrintWriter;
+
+/**
+ * The interface for classes that implement the time detection algorithm used by the
+ * TimeDetectorService. The TimeDetectorService handles thread safety: all calls to implementations
+ * of this interface can be assumed to be single threaded (though the thread used may vary).
+ *
+ * @hide
+ */
+// @NotThreadSafe
+public interface TimeDetectorStrategy {
+
+ /**
+ * The interface used by the strategy to interact with the surrounding service.
+ */
+ interface Callback {
+
+ /**
+ * The absolute threshold below which the system clock need not be updated. i.e. if setting
+ * the system clock would adjust it by less than this (either backwards or forwards) then it
+ * need not be set.
+ */
+ int systemClockUpdateThresholdMillis();
+
+ /** Returns true if automatic time detection is enabled. */
+ boolean isTimeDetectionEnabled();
+
+ /** Acquire a suitable wake lock. Must be followed by {@link #releaseWakeLock()} */
+ void acquireWakeLock();
+
+ /** Returns the elapsedRealtimeMillis clock value. The WakeLock must be held. */
+ long elapsedRealtimeMillis();
+
+ /** Returns the system clock value. The WakeLock must be held. */
+ long systemClockMillis();
+
+ /** Sets the device system clock. The WakeLock must be held. */
+ void setSystemClock(long newTimeMillis);
+
+ /** Release the wake lock acquired by a call to {@link #acquireWakeLock()}. */
+ void releaseWakeLock();
+
+ /** Send the supplied intent as a stick broadcast. */
+ void sendStickyBroadcast(@NonNull Intent intent);
+ }
+
+ /** Initialize the strategy. */
+ void initialize(@NonNull Callback callback);
+
+ /** Process the suggested time. */
+ void suggestTime(@NonNull TimeSignal timeSignal);
+
+ /** Handle the auto-time setting being toggled on or off. */
+ void handleAutoTimeDetectionToggle(boolean enabled);
+
+ /** Dump debug information. */
+ void dump(@NonNull PrintWriter pw, @Nullable String[] args);
+
+ // Utility methods below are to be moved to a better home when one becomes more obvious.
+
+ /**
+ * Adjusts the supplied time value by applying the difference between the reference time
+ * supplied and the reference time associated with the time.
+ */
+ static long getTimeAt(@NonNull TimestampedValue<Long> timeValue, long referenceClockMillisNow) {
+ return (referenceClockMillisNow - timeValue.getReferenceTimeMillis())
+ + timeValue.getValue();
+ }
+}
diff --git a/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java
new file mode 100644
index 000000000000..77b9e6281086
--- /dev/null
+++ b/services/core/java/com/android/server/timedetector/TimeDetectorStrategyCallbackImpl.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timedetector;
+
+import android.annotation.NonNull;
+import android.app.AlarmManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.PowerManager;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Slog;
+
+import java.util.Objects;
+
+/**
+ * The real implementation of {@link TimeDetectorStrategy.Callback} used on device.
+ */
+public final class TimeDetectorStrategyCallbackImpl implements TimeDetectorStrategy.Callback {
+
+ private final static String TAG = "timedetector.TimeDetectorStrategyCallbackImpl";
+
+ private static final int SYSTEM_CLOCK_UPDATE_THRESHOLD_MILLIS_DEFAULT = 2 * 1000;
+
+ /**
+ * If a newly calculated system clock time and the current system clock time differs by this or
+ * more the system clock will actually be updated. Used to prevent the system clock being set
+ * for only minor differences.
+ */
+ private final int mSystemClockUpdateThresholdMillis;
+
+ @NonNull private final Context mContext;
+ @NonNull private final ContentResolver mContentResolver;
+ @NonNull private final PowerManager.WakeLock mWakeLock;
+ @NonNull private final AlarmManager mAlarmManager;
+
+ public TimeDetectorStrategyCallbackImpl(@NonNull Context context) {
+ mContext = Objects.requireNonNull(context);
+ mContentResolver = Objects.requireNonNull(context.getContentResolver());
+
+ PowerManager powerManager = context.getSystemService(PowerManager.class);
+ mWakeLock = Objects.requireNonNull(
+ powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG));
+
+ mAlarmManager = Objects.requireNonNull(context.getSystemService(AlarmManager.class));
+
+ mSystemClockUpdateThresholdMillis =
+ SystemProperties.getInt("ro.sys.time_detector_update_diff",
+ SYSTEM_CLOCK_UPDATE_THRESHOLD_MILLIS_DEFAULT);
+ }
+
+ @Override
+ public int systemClockUpdateThresholdMillis() {
+ return mSystemClockUpdateThresholdMillis;
+ }
+
+ @Override
+ public boolean isTimeDetectionEnabled() {
+ try {
+ return Settings.Global.getInt(mContentResolver, Settings.Global.AUTO_TIME) != 0;
+ } catch (Settings.SettingNotFoundException snfe) {
+ return true;
+ }
+ }
+
+ @Override
+ public void acquireWakeLock() {
+ if (mWakeLock.isHeld()) {
+ Slog.wtf(TAG, "WakeLock " + mWakeLock + " already held");
+ }
+ mWakeLock.acquire();
+ }
+
+ @Override
+ public long elapsedRealtimeMillis() {
+ checkWakeLockHeld();
+ return SystemClock.elapsedRealtime();
+ }
+
+ @Override
+ public long systemClockMillis() {
+ checkWakeLockHeld();
+ return System.currentTimeMillis();
+ }
+
+ @Override
+ public void setSystemClock(long newTimeMillis) {
+ checkWakeLockHeld();
+ mAlarmManager.setTime(newTimeMillis);
+ }
+
+ @Override
+ public void releaseWakeLock() {
+ checkWakeLockHeld();
+ mWakeLock.release();
+ }
+
+ @Override
+ public void sendStickyBroadcast(@NonNull Intent intent) {
+ mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
+ }
+
+ private void checkWakeLockHeld() {
+ if (!mWakeLock.isHeld()) {
+ Slog.wtf(TAG, "WakeLock " + mWakeLock + " not held");
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
new file mode 100644
index 000000000000..5f71b0b3a59a
--- /dev/null
+++ b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timezonedetector;
+
+import com.android.internal.util.DumpUtils;
+import com.android.server.SystemService;
+import android.app.timezonedetector.ITimeZoneDetectorService;
+import android.content.Context;
+import android.util.Slog;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub {
+ private static final String TAG = "timezonedetector.TimeZoneDetectorService";
+
+ public static class Lifecycle extends SystemService {
+
+ public Lifecycle(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onStart() {
+ TimeZoneDetectorService service = TimeZoneDetectorService.create(getContext());
+ // Publish the binder service so it can be accessed from other (appropriately
+ // permissioned) processes.
+ publishBinderService(Context.TIME_ZONE_DETECTOR_SERVICE, service);
+ }
+ }
+
+ private final Context mContext;
+
+ private static TimeZoneDetectorService create(Context context) {
+ return new TimeZoneDetectorService(context);
+ }
+
+ public TimeZoneDetectorService(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public void stubbedCall() {
+ // Empty call for initial tests.
+ Slog.d(TAG, "stubbedCall() called");
+ // TODO: Remove when there are real methods.
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
+ // TODO: Implement when there is state.
+ }
+}
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 44136661bee5..8a135b81e562 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -20,6 +20,7 @@ import android.Manifest;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
+import android.hardware.biometrics.BiometricSourceType;
import android.app.trust.ITrustListener;
import android.app.trust.ITrustManager;
import android.content.BroadcastReceiver;
@@ -130,8 +131,8 @@ public class TrustManagerService extends SystemService {
private final SparseBooleanArray mTrustUsuallyManagedForUser = new SparseBooleanArray();
// set to true only if user can skip bouncer
- @GuardedBy("mUsersUnlockedByFingerprint")
- private final SparseBooleanArray mUsersUnlockedByFingerprint = new SparseBooleanArray();
+ @GuardedBy("mUsersUnlockedByBiometric")
+ private final SparseBooleanArray mUsersUnlockedByBiometric = new SparseBooleanArray();
private final StrongAuthTracker mStrongAuthTracker;
@@ -440,11 +441,11 @@ public class TrustManagerService extends SystemService {
boolean secure = mLockPatternUtils.isSecure(id);
boolean trusted = aggregateIsTrusted(id);
boolean showingKeyguard = true;
- boolean fingerprintAuthenticated = false;
+ boolean biometricAuthenticated = false;
if (mCurrentUser == id) {
- synchronized(mUsersUnlockedByFingerprint) {
- fingerprintAuthenticated = mUsersUnlockedByFingerprint.get(id, false);
+ synchronized(mUsersUnlockedByBiometric) {
+ biometricAuthenticated = mUsersUnlockedByBiometric.get(id, false);
}
try {
showingKeyguard = wm.isKeyguardLocked();
@@ -452,7 +453,7 @@ public class TrustManagerService extends SystemService {
}
}
boolean deviceLocked = secure && showingKeyguard && !trusted &&
- !fingerprintAuthenticated;
+ !biometricAuthenticated;
setDeviceLockedForUser(id, deviceLocked);
}
}
@@ -1021,20 +1022,20 @@ public class TrustManagerService extends SystemService {
}
@Override
- public void unlockedByFingerprintForUser(int userId) {
+ public void unlockedByBiometricForUser(int userId, BiometricSourceType biometricSource) {
enforceReportPermission();
- synchronized(mUsersUnlockedByFingerprint) {
- mUsersUnlockedByFingerprint.put(userId, true);
+ synchronized(mUsersUnlockedByBiometric) {
+ mUsersUnlockedByBiometric.put(userId, true);
}
mHandler.obtainMessage(MSG_REFRESH_DEVICE_LOCKED_FOR_USER, userId,
0 /* arg2 */).sendToTarget();
}
@Override
- public void clearAllFingerprints() {
+ public void clearAllBiometricRecognized(BiometricSourceType biometricSource) {
enforceReportPermission();
- synchronized(mUsersUnlockedByFingerprint) {
- mUsersUnlockedByFingerprint.clear();
+ synchronized(mUsersUnlockedByBiometric) {
+ mUsersUnlockedByBiometric.clear();
}
mHandler.obtainMessage(MSG_REFRESH_DEVICE_LOCKED_FOR_USER, UserHandle.USER_ALL,
0 /* arg2 */).sendToTarget();
@@ -1188,8 +1189,8 @@ public class TrustManagerService extends SystemService {
synchronized (mTrustUsuallyManagedForUser) {
mTrustUsuallyManagedForUser.delete(userId);
}
- synchronized (mUsersUnlockedByFingerprint) {
- mUsersUnlockedByFingerprint.delete(userId);
+ synchronized (mUsersUnlockedByBiometric) {
+ mUsersUnlockedByBiometric.delete(userId);
}
refreshAgentList(userId);
refreshDeviceLockedForUser(userId);
diff --git a/services/core/java/com/android/server/vr/Vr2dDisplay.java b/services/core/java/com/android/server/vr/Vr2dDisplay.java
index 7866e7d44938..a16dbb726613 100644
--- a/services/core/java/com/android/server/vr/Vr2dDisplay.java
+++ b/services/core/java/com/android/server/vr/Vr2dDisplay.java
@@ -4,7 +4,6 @@ import static android.view.Display.INVALID_DISPLAY;
import android.app.ActivityManagerInternal;
import android.app.Vr2dDisplayProperties;
-import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -13,18 +12,15 @@ import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.ImageReader;
-import android.os.Build;
import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemProperties;
import android.service.vr.IPersistentVrStateCallbacks;
import android.service.vr.IVrManager;
import android.util.Log;
import android.view.Surface;
+import com.android.server.LocalServices;
+import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
/**
@@ -230,7 +226,8 @@ class Vr2dDisplay {
resized = true;
}
- if ((displayProperties.getFlags() & Vr2dDisplayProperties.FLAG_VIRTUAL_DISPLAY_ENABLED)
+ if ((displayProperties.getAddedFlags() &
+ Vr2dDisplayProperties.FLAG_VIRTUAL_DISPLAY_ENABLED)
== Vr2dDisplayProperties.FLAG_VIRTUAL_DISPLAY_ENABLED) {
mIsVirtualDisplayAllowed = true;
} else if ((displayProperties.getRemovedFlags() &
@@ -296,6 +293,8 @@ class Vr2dDisplay {
flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
+ flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_SECURE;
+
mVirtualDisplay = mDisplayManager.createVirtualDisplay(null /* projection */,
DISPLAY_NAME, mVirtualDisplayWidth, mVirtualDisplayHeight, mVirtualDisplayDpi,
null /* surface */, flags, null /* callback */, null /* handler */,
@@ -316,7 +315,7 @@ class Vr2dDisplay {
}
private void updateDisplayId(int displayId) {
- mActivityManagerInternal.setVr2dDisplayId(displayId);
+ LocalServices.getService(ActivityTaskManagerInternal.class).setVr2dDisplayId(displayId);
mWindowManagerInternal.setVr2dDisplayId(displayId);
}
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index faa197e984cf..5c45afcfd376 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -18,14 +18,13 @@ package com.android.server.vr;
import static android.view.Display.INVALID_DISPLAY;
import android.Manifest;
-import android.app.ActivityManagerInternal;
-import android.app.ActivityManagerInternal.ScreenObserver;
+import android.annotation.NonNull;
import android.app.ActivityManager;
+import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
import android.app.INotificationManager;
-import android.app.Vr2dDisplayProperties;
import android.app.NotificationManager;
-import android.annotation.NonNull;
+import android.app.Vr2dDisplayProperties;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -59,30 +58,30 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
-
-import com.android.server.FgThread;
-import com.android.server.wm.WindowManagerInternal;
import android.view.inputmethod.InputMethodManagerInternal;
import com.android.internal.R;
import com.android.internal.util.DumpUtils;
+import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemConfig;
import com.android.server.SystemService;
-import com.android.server.utils.ManagedApplicationService.PendingEvent;
+import com.android.server.utils.ManagedApplicationService;
+import com.android.server.utils.ManagedApplicationService.BinderChecker;
import com.android.server.utils.ManagedApplicationService.LogEvent;
import com.android.server.utils.ManagedApplicationService.LogFormattable;
+import com.android.server.utils.ManagedApplicationService.PendingEvent;
import com.android.server.vr.EnabledComponentsObserver.EnabledComponentChangeListener;
-import com.android.server.utils.ManagedApplicationService;
-import com.android.server.utils.ManagedApplicationService.BinderChecker;
+import com.android.server.wm.ActivityTaskManagerInternal;
+import com.android.server.wm.ActivityTaskManagerInternal.ScreenObserver;
+import com.android.server.wm.WindowManagerInternal;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.lang.StringBuilder;
import java.text.SimpleDateFormat;
-import java.util.Arrays;
import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@@ -777,7 +776,7 @@ public class VrManagerService extends SystemService
@Override
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
- LocalServices.getService(ActivityManagerInternal.class)
+ LocalServices.getService(ActivityTaskManagerInternal.class)
.registerScreenObserver(this);
mNotificationManager = INotificationManager.Stub.asInterface(
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 547ab0ed443d..9d68c63cc38c 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -51,7 +51,6 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
-import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapRegionDecoder;
@@ -76,7 +75,6 @@ import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
-import android.provider.Settings;
import android.service.wallpaper.IWallpaperConnection;
import android.service.wallpaper.IWallpaperEngine;
import android.service.wallpaper.IWallpaperService;
@@ -338,102 +336,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
}
- /**
- * Observes changes of theme settings. It will check whether to call
- * notifyWallpaperColorsChanged by the current theme and updated theme.
- * The light theme and dark theme are controlled by the hint values in Wallpaper colors,
- * threrfore, if light theme mode is chosen, HINT_SUPPORTS_DARK_THEME in hint will be
- * removed and then notify listeners.
- */
- private class ThemeSettingsObserver extends ContentObserver {
-
- public ThemeSettingsObserver(Handler handler) {
- super(handler);
- }
-
- public void startObserving(Context context) {
- context.getContentResolver().registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.THEME_MODE),
- false,
- this);
- }
-
- public void stopObserving(Context context) {
- context.getContentResolver().unregisterContentObserver(this);
- }
-
- @Override
- public void onChange(boolean selfChange) {
- onThemeSettingsChanged();
- }
- }
-
- /**
- * Check whether to call notifyWallpaperColorsChanged. Assumed that the theme mode
- * was wallpaper theme mode and dark wallpaper was set, therefoe, the theme was dark.
- * Then theme mode changing to dark theme mode, however, theme should not update since
- * theme was dark already.
- */
- private boolean needUpdateLocked(WallpaperColors colors, int themeMode) {
- if (colors == null) {
- return false;
- }
-
- if (themeMode == mThemeMode) {
- return false;
- }
-
- boolean result = true;
- boolean supportDarkTheme =
- (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_THEME) != 0;
- switch (themeMode) {
- case Settings.Secure.THEME_MODE_WALLPAPER:
- if (mThemeMode == Settings.Secure.THEME_MODE_LIGHT) {
- result = supportDarkTheme;
- } else {
- result = !supportDarkTheme;
- }
- break;
- case Settings.Secure.THEME_MODE_LIGHT:
- if (mThemeMode == Settings.Secure.THEME_MODE_WALLPAPER) {
- result = supportDarkTheme;
- }
- break;
- case Settings.Secure.THEME_MODE_DARK:
- if (mThemeMode == Settings.Secure.THEME_MODE_WALLPAPER) {
- result = !supportDarkTheme;
- }
- break;
- default:
- Slog.w(TAG, "unkonwn theme mode " + themeMode);
- return false;
- }
- mThemeMode = themeMode;
- return result;
- }
-
- void onThemeSettingsChanged() {
- WallpaperData wallpaper;
- synchronized (mLock) {
- wallpaper = mWallpaperMap.get(mCurrentUserId);
- int updatedThemeMode = Settings.Secure.getInt(
- mContext.getContentResolver(), Settings.Secure.THEME_MODE,
- Settings.Secure.THEME_MODE_WALLPAPER);
-
- if (DEBUG) {
- Slog.v(TAG, "onThemeSettingsChanged, mode = " + updatedThemeMode);
- }
-
- if (!needUpdateLocked(wallpaper.primaryColors, updatedThemeMode)) {
- return;
- }
- }
-
- if (wallpaper != null) {
- notifyWallpaperColorsChanged(wallpaper, FLAG_SYSTEM);
- }
- }
-
void notifyLockWallpaperChanged() {
final IWallpaperManagerCallback cb = mKeyguardListener;
if (cb != null) {
@@ -511,7 +413,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
userAllColorListeners.finishBroadcast();
}
- wallpaperColors = getThemeColorsLocked(wallpaperColors);
}
final int count = colorListeners.size();
@@ -580,40 +481,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
/**
- * We can easily change theme by modified colors hint. This function will check
- * current theme mode and return the WallpaperColors fit current theme mode.
- * If color need modified, it will return a copied WallpaperColors which
- * its ColorsHint is modified to fit current theme mode.
- *
- * @param colors a wallpaper primary colors representation
- */
- private WallpaperColors getThemeColorsLocked(WallpaperColors colors) {
- if (colors == null) {
- Slog.w(TAG, "Cannot get theme colors because WallpaperColors is null.");
- return null;
- }
-
- int colorHints = colors.getColorHints();
- boolean supportDarkTheme = (colorHints & WallpaperColors.HINT_SUPPORTS_DARK_THEME) != 0;
- if (mThemeMode == Settings.Secure.THEME_MODE_WALLPAPER ||
- (mThemeMode == Settings.Secure.THEME_MODE_LIGHT && !supportDarkTheme) ||
- (mThemeMode == Settings.Secure.THEME_MODE_DARK && supportDarkTheme)) {
- return colors;
- }
-
- WallpaperColors themeColors = new WallpaperColors(colors.getPrimaryColor(),
- colors.getSecondaryColor(), colors.getTertiaryColor());
-
- if (mThemeMode == Settings.Secure.THEME_MODE_LIGHT) {
- colorHints &= ~WallpaperColors.HINT_SUPPORTS_DARK_THEME;
- } else if (mThemeMode == Settings.Secure.THEME_MODE_DARK) {
- colorHints |= WallpaperColors.HINT_SUPPORTS_DARK_THEME;
- }
- themeColors.setColorHints(colorHints);
- return themeColors;
- }
-
- /**
* Once a new wallpaper has been written via setWallpaper(...), it needs to be cropped
* for display.
*/
@@ -809,7 +676,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
final SparseArray<Boolean> mUserRestorecon = new SparseArray<Boolean>();
int mCurrentUserId = UserHandle.USER_NULL;
boolean mInAmbientMode;
- int mThemeMode;
static class WallpaperData {
@@ -868,7 +734,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
long lastDiedTime;
boolean wallpaperUpdating;
WallpaperObserver wallpaperObserver;
- ThemeSettingsObserver themeSettingsObserver;
/**
* List of callbacks registered they should each be notified when the wallpaper is changed.
@@ -1414,10 +1279,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
wallpaper.wallpaperObserver.stopWatching();
wallpaper.wallpaperObserver = null;
}
- if (wallpaper.themeSettingsObserver != null) {
- wallpaper.themeSettingsObserver.stopObserving(mContext);
- wallpaper.themeSettingsObserver = null;
- }
}
}
@@ -1501,13 +1362,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
systemWallpaper.wallpaperObserver = new WallpaperObserver(systemWallpaper);
systemWallpaper.wallpaperObserver.startWatching();
}
- if (systemWallpaper.themeSettingsObserver == null) {
- systemWallpaper.themeSettingsObserver = new ThemeSettingsObserver(null);
- systemWallpaper.themeSettingsObserver.startObserving(mContext);
- }
- mThemeMode = Settings.Secure.getInt(
- mContext.getContentResolver(), Settings.Secure.THEME_MODE,
- Settings.Secure.THEME_MODE_WALLPAPER);
switchWallpaper(systemWallpaper, reply);
}
@@ -1981,7 +1835,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
synchronized (mLock) {
- return getThemeColorsLocked(wallpaperData.primaryColors);
+ return wallpaperData.primaryColors;
}
}
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdater.java b/services/core/java/com/android/server/webkit/WebViewUpdater.java
index 61a3c0951f64..3e72d981edbe 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdater.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdater.java
@@ -530,6 +530,8 @@ class WebViewUpdater {
mCurrentWebViewPackage.packageName,
mCurrentWebViewPackage.versionName));
}
+ pw.println(String.format(" Minimum targetSdkVersion: %d",
+ UserPackage.MINIMUM_SUPPORTED_SDK));
pw.println(String.format(" Minimum WebView version code: %d",
mMinimumVersionCode));
pw.println(String.format(" Number of relros started: %d",
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
new file mode 100644
index 000000000000..bfecd9d99cd9
--- /dev/null
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.AppProtoEnums;
+import android.app.IActivityManager;
+import android.app.IApplicationThread;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.SystemClock;
+import android.service.voice.IVoiceInteractionSession;
+import android.util.SparseIntArray;
+import android.view.RemoteAnimationAdapter;
+
+import com.android.internal.app.IVoiceInteractor;
+import com.android.server.am.WindowProcessController;
+
+import java.util.List;
+
+/**
+ * Activity Task manager local system service interface.
+ * @hide Only for use within system server
+ */
+public abstract class ActivityTaskManagerInternal {
+
+ /**
+ * Type for {@link #notifyAppTransitionStarting}: The transition was started because we drew
+ * the splash screen.
+ */
+ public static final int APP_TRANSITION_SPLASH_SCREEN =
+ AppProtoEnums.APP_TRANSITION_SPLASH_SCREEN; // 1
+
+ /**
+ * Type for {@link #notifyAppTransitionStarting}: The transition was started because we all
+ * app windows were drawn
+ */
+ public static final int APP_TRANSITION_WINDOWS_DRAWN =
+ AppProtoEnums.APP_TRANSITION_WINDOWS_DRAWN; // 2
+
+ /**
+ * Type for {@link #notifyAppTransitionStarting}: The transition was started because of a
+ * timeout.
+ */
+ public static final int APP_TRANSITION_TIMEOUT =
+ AppProtoEnums.APP_TRANSITION_TIMEOUT; // 3
+
+ /**
+ * Type for {@link #notifyAppTransitionStarting}: The transition was started because of a
+ * we drew a task snapshot.
+ */
+ public static final int APP_TRANSITION_SNAPSHOT =
+ AppProtoEnums.APP_TRANSITION_SNAPSHOT; // 4
+
+ /**
+ * Type for {@link #notifyAppTransitionStarting}: The transition was started because it was a
+ * recents animation and we only needed to wait on the wallpaper.
+ */
+ public static final int APP_TRANSITION_RECENTS_ANIM =
+ AppProtoEnums.APP_TRANSITION_RECENTS_ANIM; // 5
+
+ /**
+ * The bundle key to extract the assist data.
+ */
+ public static final String ASSIST_KEY_DATA = "data";
+
+ /**
+ * The bundle key to extract the assist structure.
+ */
+ public static final String ASSIST_KEY_STRUCTURE = "structure";
+
+ /**
+ * The bundle key to extract the assist content.
+ */
+ public static final String ASSIST_KEY_CONTENT = "content";
+
+ /**
+ * The bundle key to extract the assist receiver extras.
+ */
+ public static final String ASSIST_KEY_RECEIVER_EXTRAS = "receiverExtras";
+
+ public interface ScreenObserver {
+ void onAwakeStateChanged(boolean isAwake);
+ void onKeyguardStateChanged(boolean isShowing);
+ }
+
+ /**
+ * Sleep tokens cause the activity manager to put the top activity to sleep.
+ * They are used by components such as dreams that may hide and block interaction
+ * with underlying activities.
+ */
+ public static abstract class SleepToken {
+
+ /** Releases the sleep token. */
+ public abstract void release();
+ }
+
+ /**
+ * Acquires a sleep token for the specified display with the specified tag.
+ *
+ * @param tag A string identifying the purpose of the token (eg. "Dream").
+ * @param displayId The display to apply the sleep token to.
+ */
+ public abstract SleepToken acquireSleepToken(@NonNull String tag, int displayId);
+
+ /**
+ * Returns home activity for the specified user.
+ *
+ * @param userId ID of the user or {@link android.os.UserHandle#USER_ALL}
+ */
+ public abstract ComponentName getHomeActivityForUser(int userId);
+
+ public abstract void onLocalVoiceInteractionStarted(IBinder callingActivity,
+ IVoiceInteractionSession mSession,
+ IVoiceInteractor mInteractor);
+
+ /**
+ * Callback for window manager to let activity manager know that we are finally starting the
+ * app transition;
+ *
+ * @param reasons A map from windowing mode to a reason integer why the transition was started,
+ * which must be one of the APP_TRANSITION_* values.
+ * @param timestamp The time at which the app transition started in
+ * {@link SystemClock#uptimeMillis()} timebase.
+ */
+ public abstract void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp);
+
+ /**
+ * Callback for window manager to let activity manager know that the app transition was
+ * cancelled.
+ */
+ public abstract void notifyAppTransitionCancelled();
+
+ /**
+ * Callback for window manager to let activity manager know that the app transition is finished.
+ */
+ public abstract void notifyAppTransitionFinished();
+
+ /**
+ * Returns the top activity from each of the currently visible stacks. The first entry will be
+ * the focused activity.
+ */
+ public abstract List<IBinder> getTopVisibleActivities();
+
+ /**
+ * Callback for window manager to let activity manager know that docked stack changes its
+ * minimized state.
+ */
+ public abstract void notifyDockedStackMinimizedChanged(boolean minimized);
+
+ /**
+ * Start activity {@code intents} as if {@code packageName} on user {@code userId} did it.
+ *
+ * - DO NOT call it with the calling UID cleared.
+ * - All the necessary caller permission checks must be done at callsites.
+ *
+ * @return error codes used by {@link IActivityManager#startActivity} and its siblings.
+ */
+ public abstract int startActivitiesAsPackage(String packageName,
+ int userId, Intent[] intents, Bundle bOptions);
+
+ /**
+ * Start activity {@code intent} without calling user-id check.
+ *
+ * - DO NOT call it with the calling UID cleared.
+ * - The caller must do the calling user ID check.
+ *
+ * @return error codes used by {@link IActivityManager#startActivity} and its siblings.
+ */
+ public abstract int startActivityAsUser(IApplicationThread caller, String callingPackage,
+ Intent intent, @Nullable Bundle options, int userId);
+
+ /**
+ * Called when Keyguard flags might have changed.
+ *
+ * @param callback Callback to run after activity visibilities have been reevaluated. This can
+ * be used from window manager so that when the callback is called, it's
+ * guaranteed that all apps have their visibility updated accordingly.
+ */
+ public abstract void notifyKeyguardFlagsChanged(@Nullable Runnable callback);
+
+ /**
+ * Called when the trusted state of Keyguard has changed.
+ */
+ public abstract void notifyKeyguardTrustedChanged();
+
+ /**
+ * Called after virtual display Id is updated by
+ * {@link com.android.server.vr.Vr2dDisplay} with a specific
+ * {@param vr2dDisplayId}.
+ */
+ public abstract void setVr2dDisplayId(int vr2dDisplayId);
+
+ /**
+ * Set focus on an activity.
+ * @param token The IApplicationToken for the activity
+ */
+ public abstract void setFocusedActivity(IBinder token);
+
+ public abstract void registerScreenObserver(ScreenObserver observer);
+
+ /**
+ * Returns is the caller has the same uid as the Recents component
+ */
+ public abstract boolean isCallerRecents(int callingUid);
+
+ /**
+ * Returns whether the recents component is the home activity for the given user.
+ */
+ public abstract boolean isRecentsComponentHomeActivity(int userId);
+
+ /**
+ * Cancels any currently running recents animation.
+ */
+ public abstract void cancelRecentsAnimation(boolean restoreHomeStackPosition);
+
+ /**
+ * This enforces {@code func} can only be called if either the caller is Recents activity or
+ * has {@code permission}.
+ */
+ public abstract void enforceCallerIsRecentsOrHasPermission(String permission, String func);
+
+ /**
+ * Called after the voice interaction service has changed.
+ */
+ public abstract void notifyActiveVoiceInteractionServiceChanged(ComponentName component);
+
+ /**
+ * Set a uid that is allowed to bypass stopped app switches, launching an app
+ * whenever it wants.
+ *
+ * @param type Type of the caller -- unique string the caller supplies to identify itself
+ * and disambiguate with other calles.
+ * @param uid The uid of the app to be allowed, or -1 to clear the uid for this type.
+ * @param userId The user it is allowed for.
+ */
+ public abstract void setAllowAppSwitches(@NonNull String type, int uid, int userId);
+
+ /**
+ * Called when a user has been deleted. This can happen during normal device usage
+ * or just at startup, when partially removed users are purged. Any state persisted by the
+ * ActivityManager should be purged now.
+ *
+ * @param userId The user being cleaned up.
+ */
+ public abstract void onUserStopped(int userId);
+ public abstract boolean isGetTasksAllowed(String caller, int callingPid, int callingUid);
+
+ public abstract void onProcessAdded(WindowProcessController proc);
+ public abstract void onProcessRemoved(String name, int uid);
+ public abstract void onCleanUpApplicationRecord(WindowProcessController proc);
+ public abstract int getTopProcessState();
+
+ public abstract boolean isSleeping();
+ public abstract boolean isShuttingDown();
+ public abstract boolean shuttingDown(boolean booted, int timeout);
+ public abstract void enableScreenAfterBoot(boolean booted);
+ public abstract boolean showStrictModeViolationDialog();
+ public abstract void showSystemReadyErrorDialogsIfNeeded();
+}
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 08d0ae9dcdd8..fa6079c51906 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -19,6 +19,7 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.content.pm.ActivityInfo.COLOR_MODE_DEFAULT;
import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
@@ -1377,7 +1378,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
setAppLayoutChanges(FINISH_LAYOUT_REDO_ANIM, "checkAppWindowsReadyToShow");
// We can now show all of the drawn windows!
- if (!mService.mOpeningApps.contains(this)) {
+ if (!mService.mOpeningApps.contains(this) && canShowWindows()) {
showAllWindowsLocked();
}
}
@@ -2270,4 +2271,21 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
boolean isClosingOrEnteringPip() {
return (isAnimating() && hiddenRequested) || mWillCloseOrEnterPip;
}
+
+ /**
+ * @return Whether we are allowed to show non-starting windows at the moment. We disallow
+ * showing windows during transitions in case we have windows that have wide-color-gamut
+ * color mode set to avoid jank in the middle of the transition.
+ */
+ boolean canShowWindows() {
+ return allDrawn && !(isReallyAnimating() && hasNonDefaultColorWindow());
+ }
+
+ /**
+ * @return true if we have a window that has a non-default color mode set; false otherwise.
+ */
+ private boolean hasNonDefaultColorWindow() {
+ return forAllWindows(ws -> ws.mAttrs.getColorMode() != COLOR_MODE_DEFAULT,
+ true /* topToBottom */);
+ }
}
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java
index b2a12bef5283..bc8c17db6abe 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationController.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java
@@ -210,13 +210,15 @@ public class BoundsAnimationController {
// Ensure that we have prepared the target for animation before we trigger any size
// changes, so it can swap surfaces in to appropriate modes, or do as it wishes
// otherwise.
+ boolean continueAnimation;
if (mPrevSchedulePipModeChangedState == NO_PIP_MODE_CHANGED_CALLBACKS) {
- mTarget.onAnimationStart(mSchedulePipModeChangedState ==
+ continueAnimation = mTarget.onAnimationStart(mSchedulePipModeChangedState ==
SCHEDULE_PIP_MODE_CHANGED_ON_START, false /* forceUpdate */);
// When starting an animation from fullscreen, pause here and wait for the
// windows-drawn signal before we start the rest of the transition down into PiP.
- if (mMoveFromFullscreen && mTarget.shouldDeferStartOnMoveToFullscreen()) {
+ if (continueAnimation && mMoveFromFullscreen
+ && mTarget.shouldDeferStartOnMoveToFullscreen()) {
pause();
}
} else if (mPrevSchedulePipModeChangedState == SCHEDULE_PIP_MODE_CHANGED_ON_END &&
@@ -225,8 +227,19 @@ public class BoundsAnimationController {
// client will not currently receive any picture-in-picture mode change callbacks.
// However, we still need to report to them that they are leaving PiP, so this will
// force an update via a mode changed callback.
- mTarget.onAnimationStart(true /* schedulePipModeChangedCallback */,
- true /* forceUpdate */);
+ continueAnimation = mTarget.onAnimationStart(
+ true /* schedulePipModeChangedCallback */, true /* forceUpdate */);
+ } else {
+ // The animation is already running, but we should check that the TaskStack is still
+ // valid before continuing with the animation
+ continueAnimation = mTarget.isAttached();
+ }
+
+ if (!continueAnimation) {
+ // No point of trying to animate something that isn't attached to the hierarchy
+ // anymore.
+ cancel();
+ return;
}
// Immediately update the task bounds if they have to become larger, but preserve
@@ -348,6 +361,9 @@ public class BoundsAnimationController {
if (DEBUG) Slog.d(TAG, "cancel: mTarget=" + mTarget);
mSkipAnimationEnd = true;
super.cancel();
+
+ // Reset the thread priority of the animation thread if the bounds animation is canceled
+ updateBooster();
}
/**
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationTarget.java b/services/core/java/com/android/server/wm/BoundsAnimationTarget.java
index 68be4e8420a2..5cb80de1a36d 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationTarget.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationTarget.java
@@ -30,8 +30,9 @@ interface BoundsAnimationTarget {
*
* @param schedulePipModeChangedCallback whether or not to schedule the PiP mode changed
* callbacks
+ * @return whether to continue the animation
*/
- void onAnimationStart(boolean schedulePipModeChangedCallback, boolean forceUpdate);
+ boolean onAnimationStart(boolean schedulePipModeChangedCallback, boolean forceUpdate);
/**
* @return Whether the animation should be paused waiting for the windows to draw before
@@ -65,4 +66,9 @@ interface BoundsAnimationTarget {
*/
void onAnimationEnd(boolean schedulePipModeChangedCallback, Rect finalStackSize,
boolean moveToFullscreen);
+
+ /** @return True if the target is attached to the window hierarchy. */
+ default boolean isAttached() {
+ return true;
+ }
}
diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java
index 7df057c86d5a..f2ce63c23cb6 100644
--- a/services/core/java/com/android/server/wm/ConfigurationContainer.java
+++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java
@@ -302,6 +302,18 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
onOverrideConfigurationChanged(mTmpConfig);
}
+ /** Sets the always on top flag for this configuration container.
+ * When you call this function, make sure that the following functions are called as well to
+ * keep proper z-order.
+ * - {@Link DisplayContent#positionStackAt(POSITION_TOP, TaskStack)};
+ * - {@Link ActivityDisplay#positionChildAtTop(ActivityStack)};
+ * */
+ public void setAlwaysOnTop(boolean alwaysOnTop) {
+ mTmpConfig.setTo(getOverrideConfiguration());
+ mTmpConfig.windowConfiguration.setAlwaysOnTop(alwaysOnTop);
+ onOverrideConfigurationChanged(mTmpConfig);
+ }
+
/**
* Returns true if this container is currently in multi-window mode. I.e. sharing the screen
* with another activity.
@@ -513,7 +525,7 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> {
return toString();
}
- boolean isAlwaysOnTop() {
+ public boolean isAlwaysOnTop() {
return mFullConfiguration.windowConfiguration.isAlwaysOnTop();
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index cd8fdbfbc647..115944e33cd2 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -16,7 +16,7 @@
package com.android.server.wm;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -404,7 +404,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
WindowStateAnimator winAnimator = w.mWinAnimator;
final AppWindowToken atoken = w.mAppToken;
if (winAnimator.mDrawState == READY_TO_SHOW) {
- if (atoken == null || atoken.allDrawn) {
+ if (atoken == null || atoken.canShowWindows()) {
if (w.performShowLocked()) {
pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM;
if (DEBUG_LAYOUT_REPEATS) {
@@ -1107,10 +1107,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
if (rotateSeamlessly) {
- forAllWindows(w -> {
- w.mWinAnimator.seamlesslyRotateWindow(getPendingTransaction(),
- oldRotation, rotation);
- }, true /* traverseTopToBottom */);
+ seamlesslyRotate(getPendingTransaction(), oldRotation, rotation);
}
mService.mDisplayManagerInternal.performTraversal(getPendingTransaction());
@@ -1252,11 +1249,21 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
cutout, mInitialDisplayWidth, mInitialDisplayHeight);
}
final boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270);
- final Path bounds = cutout.getBounds().getBoundaryPath();
+ final List<Rect> bounds = WmDisplayCutout.computeSafeInsets(
+ cutout, mInitialDisplayWidth, mInitialDisplayHeight)
+ .getDisplayCutout().getBoundingRects();
transformPhysicalToLogicalCoordinates(rotation, mInitialDisplayWidth, mInitialDisplayHeight,
mTmpMatrix);
- bounds.transform(mTmpMatrix);
- return WmDisplayCutout.computeSafeInsets(DisplayCutout.fromBounds(bounds),
+ final Region region = Region.obtain();
+ for (int i = 0; i < bounds.size(); i++) {
+ final Rect rect = bounds.get(i);
+ final RectF rectF = new RectF(bounds.get(i));
+ mTmpMatrix.mapRect(rectF);
+ rectF.round(rect);
+ region.op(rect, Op.UNION);
+ }
+
+ return WmDisplayCutout.computeSafeInsets(DisplayCutout.fromBounds(region),
rotated ? mInitialDisplayHeight : mInitialDisplayWidth,
rotated ? mInitialDisplayWidth : mInitialDisplayHeight);
}
@@ -1569,6 +1576,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
@VisibleForTesting
+ WindowList<TaskStack> getStacks() {
+ return mTaskStackContainers.mChildren;
+ }
+
+ @VisibleForTesting
TaskStack getTopStack() {
return mTaskStackContainers.getTopStack();
}
@@ -2505,11 +2517,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
if (DEBUG_INPUT_METHOD && updateImeTarget) Slog.v(TAG_WM,
"Proposed new IME target: " + target);
- // Now, a special case -- if the last target's window is in the process of exiting, and the
- // new target is home, keep on the last target to avoid flicker. Home is a special case
- // since its above other stacks in the ordering list, but layed out below the others.
- if (curTarget != null && curTarget.isDisplayedLw() && curTarget.isClosing()
- && (target == null || target.isActivityTypeHome())) {
+ // Now, a special case -- if the last target's window is in the process of exiting, but
+ // not removed, and the new target is home, keep on the last target to avoid flicker.
+ // Home is a special case since its above other stacks in the ordering list, but layed
+ // out below the others.
+ if (curTarget != null && !curTarget.mRemoved && curTarget.isDisplayedLw()
+ && curTarget.isClosing() && (target == null || target.isActivityTypeHome())) {
if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, "New target is home while current target is "
+ "closing, not changing");
return curTarget;
@@ -3425,25 +3438,51 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
* @return The proper position for the stack.
*/
private int findPositionForStack(int requestedPosition, TaskStack stack, boolean adding) {
+ if (stack.inPinnedWindowingMode()) {
+ return POSITION_TOP;
+ }
+
final int topChildPosition = mChildren.size() - 1;
- boolean toTop = requestedPosition == POSITION_TOP;
- toTop |= adding ? requestedPosition >= topChildPosition + 1
- : requestedPosition >= topChildPosition;
- int targetPosition = requestedPosition;
+ int belowAlwaysOnTopPosition = POSITION_BOTTOM;
+ for (int i = topChildPosition; i >= 0; --i) {
+ if (getStacks().get(i) != stack && !getStacks().get(i).isAlwaysOnTop()) {
+ belowAlwaysOnTopPosition = i;
+ break;
+ }
+ }
+
+ // The max possible position we can insert the stack at.
+ int maxPosition = POSITION_TOP;
+ // The min possible position we can insert the stack at.
+ int minPosition = POSITION_BOTTOM;
- if (toTop && stack.getWindowingMode() != WINDOWING_MODE_PINNED && hasPinnedStack()) {
- // The pinned stack is always the top most stack (always-on-top) when it is present.
- TaskStack topStack = mChildren.get(topChildPosition);
- if (topStack.getWindowingMode() != WINDOWING_MODE_PINNED) {
- throw new IllegalStateException("Pinned stack isn't top stack??? " + mChildren);
+ if (stack.isAlwaysOnTop()) {
+ if (hasPinnedStack()) {
+ // Always-on-top stacks go below the pinned stack.
+ maxPosition = getStacks().indexOf(mPinnedStack) - 1;
}
+ // Always-on-top stacks need to be above all other stacks.
+ minPosition = belowAlwaysOnTopPosition !=
+ POSITION_BOTTOM ? belowAlwaysOnTopPosition : topChildPosition;
+ } else {
+ // Other stacks need to be below the always-on-top stacks.
+ maxPosition = belowAlwaysOnTopPosition !=
+ POSITION_BOTTOM ? belowAlwaysOnTopPosition : topChildPosition;
+ }
+
+ int targetPosition = requestedPosition;
+ targetPosition = Math.min(targetPosition, maxPosition);
+ targetPosition = Math.max(targetPosition, minPosition);
- // So, stack is moved just below the pinned stack.
- // When we're adding a new stack the target is the current pinned stack position.
- // When we're positioning an existing stack the target is the position below pinned
- // stack, because WindowContainer#positionAt() first removes element and then adds
- // it to specified place.
- targetPosition = adding ? topChildPosition : topChildPosition - 1;
+ int prevPosition = getStacks().indexOf(stack);
+ // The positions we calculated above (maxPosition, minPosition) do not take into
+ // consideration the following edge cases.
+ // 1) We need to adjust the position depending on the value "adding".
+ // 2) When we are moving a stack to another position, we also need to adjust the
+ // position depending on whether the stack is moving to a higher or lower position.
+ if ((targetPosition != requestedPosition) &&
+ (adding || targetPosition < prevPosition)) {
+ targetPosition++;
}
return targetPosition;
@@ -3535,8 +3574,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
if (isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY)
|| isStackVisible(WINDOWING_MODE_FREEFORM)) {
// Apps and their containers are not allowed to specify an orientation while the
- // docked or freeform stack is visible...except for the home stack/task if the
- // docked stack is minimized and it actually set something.
+ // docked or freeform stack is visible...except for the home stack if the docked
+ // stack is minimized and it actually set something and the bounds is different from
+ // the display.
if (mHomeStack != null && mHomeStack.isVisible()
&& mDividerControllerLocked.isMinimizedDock()
// TODO(b/110159357): Work around to unblock the release for failing test
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index cd8d677c306c..e817d1ab6d1b 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -651,7 +651,7 @@ public class DockedStackDividerController {
if (wasMinimized && mMinimizedDock && containsAppInDockedStack(openingApps)
&& appTransition != TRANSIT_NONE &&
!AppTransition.isKeyguardGoingAwayTransit(appTransition)) {
- if (mService.mAmInternal.isRecentsComponentHomeActivity(mService.mCurrentUserId)) {
+ if (mService.mAtmInternal.isRecentsComponentHomeActivity(mService.mCurrentUserId)) {
// When the home activity is the recents component and we are already minimized,
// then there is nothing to do here since home is already visible
} else {
diff --git a/services/core/java/com/android/server/wm/DragAndDropPermissionsHandler.java b/services/core/java/com/android/server/wm/DragAndDropPermissionsHandler.java
index 70478fe677ed..51d5eea14b44 100644
--- a/services/core/java/com/android/server/wm/DragAndDropPermissionsHandler.java
+++ b/services/core/java/com/android/server/wm/DragAndDropPermissionsHandler.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.content.ClipData;
import android.net.Uri;
import android.os.Binder;
@@ -61,7 +62,7 @@ class DragAndDropPermissionsHandler extends IDragAndDropPermissions.Stub
mActivityToken = activityToken;
// Will throw if Activity is not found.
- IBinder permissionOwner = ActivityManager.getService().
+ IBinder permissionOwner = ActivityTaskManager.getService().
getUriPermissionOwnerForActivity(mActivityToken);
doTake(permissionOwner);
@@ -101,7 +102,7 @@ class DragAndDropPermissionsHandler extends IDragAndDropPermissions.Stub
IBinder permissionOwner = null;
if (mActivityToken != null) {
try {
- permissionOwner = ActivityManager.getService().
+ permissionOwner = ActivityTaskManager.getService().
getUriPermissionOwnerForActivity(mActivityToken);
} catch (Exception e) {
// Activity is destroyed, permissions already revoked.
diff --git a/services/core/java/com/android/server/wm/DragInputEventReceiver.java b/services/core/java/com/android/server/wm/DragInputEventReceiver.java
index bee2bacf83d2..5372d8b6e796 100644
--- a/services/core/java/com/android/server/wm/DragInputEventReceiver.java
+++ b/services/core/java/com/android/server/wm/DragInputEventReceiver.java
@@ -54,7 +54,7 @@ class DragInputEventReceiver extends InputEventReceiver {
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
boolean handled = false;
try {
if (!(event instanceof MotionEvent)
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 281e0a8441e2..a626663c2e67 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -40,6 +40,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
+import android.os.Trace;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Log;
@@ -620,6 +621,8 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
private void updateInputWindows(boolean inDrag) {
+ Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "updateInputWindows");
+
// TODO: multi-display
navInputConsumer = getInputConsumer(INPUT_CONSUMER_NAVIGATION, DEFAULT_DISPLAY);
pipInputConsumer = getInputConsumer(INPUT_CONSUMER_PIP, DEFAULT_DISPLAY);
@@ -645,6 +648,8 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
mService.mInputManager.setInputWindows(mInputWindowHandles, mFocusedInputWindowHandle);
clearInputWindowHandlesLw();
+
+ Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}
@Override
diff --git a/services/core/java/com/android/server/wm/PointerEventDispatcher.java b/services/core/java/com/android/server/wm/PointerEventDispatcher.java
index ab8b8d472d9d..f815fa058d55 100644
--- a/services/core/java/com/android/server/wm/PointerEventDispatcher.java
+++ b/services/core/java/com/android/server/wm/PointerEventDispatcher.java
@@ -36,7 +36,7 @@ public class PointerEventDispatcher extends InputEventReceiver {
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
try {
if (event instanceof MotionEvent
&& (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
@@ -50,7 +50,7 @@ public class PointerEventDispatcher extends InputEventReceiver {
listeners = mListenersArray;
}
for (int i = 0; i < listeners.length; ++i) {
- listeners[i].onPointerEvent(motionEvent, displayId);
+ listeners[i].onPointerEvent(motionEvent);
}
}
} finally {
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 27238017bb27..6f5fea960c7e 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -16,13 +16,13 @@
package com.android.server.wm;
-import static android.app.ActivityManagerInternal.APP_TRANSITION_RECENTS_ANIM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.view.RemoteAnimationTarget.MODE_CLOSING;
import static android.view.WindowManager.INPUT_CONSUMER_RECENTS_ANIMATION;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
+import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_RECENTS_ANIM;
import static com.android.server.wm.AnimationAdapterProto.REMOTE;
import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RECENTS_ANIMATIONS;
@@ -48,11 +48,14 @@ import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
import android.view.inputmethod.InputMethodManagerInternal;
+
+import com.google.android.collect.Sets;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.LocalServices;
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
import com.android.server.wm.utils.InsetUtils;
-import com.google.android.collect.Sets;
+
import java.io.PrintWriter;
import java.util.ArrayList;
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
index 2bfff269e457..cb504607420c 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
@@ -26,6 +26,8 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.annotation.Nullable;
+import android.hardware.power.V1_0.PowerHint;
+import android.os.PowerManagerInternal;
import android.util.ArrayMap;
import android.view.Choreographer;
import android.view.SurfaceControl;
@@ -57,6 +59,7 @@ class SurfaceAnimationRunner {
private final AnimationHandler mAnimationHandler;
private final Transaction mFrameTransaction;
private final AnimatorFactory mAnimatorFactory;
+ private final PowerManagerInternal mPowerManagerInternal;
private boolean mApplyScheduled;
@GuardedBy("mLock")
@@ -70,13 +73,15 @@ class SurfaceAnimationRunner {
@GuardedBy("mLock")
private boolean mAnimationStartDeferred;
- SurfaceAnimationRunner() {
- this(null /* callbackProvider */, null /* animatorFactory */, new Transaction());
+ SurfaceAnimationRunner(PowerManagerInternal powerManagerInternal) {
+ this(null /* callbackProvider */, null /* animatorFactory */, new Transaction(),
+ powerManagerInternal);
}
@VisibleForTesting
SurfaceAnimationRunner(@Nullable AnimationFrameCallbackProvider callbackProvider,
- AnimatorFactory animatorFactory, Transaction frameTransaction) {
+ AnimatorFactory animatorFactory, Transaction frameTransaction,
+ PowerManagerInternal powerManagerInternal) {
SurfaceAnimationThread.getHandler().runWithScissors(() -> mChoreographer = getSfInstance(),
0 /* timeout */);
mFrameTransaction = frameTransaction;
@@ -87,6 +92,7 @@ class SurfaceAnimationRunner {
mAnimatorFactory = animatorFactory != null
? animatorFactory
: SfValueAnimator::new;
+ mPowerManagerInternal = powerManagerInternal;
}
/**
@@ -231,6 +237,7 @@ class SurfaceAnimationRunner {
synchronized (mLock) {
startPendingAnimationsLocked();
}
+ mPowerManagerInternal.powerHint(PowerHint.INTERACTION, 0);
}
private void scheduleApplyTransaction() {
diff --git a/services/core/java/com/android/server/wm/TEST_MAPPING b/services/core/java/com/android/server/wm/TEST_MAPPING
new file mode 100644
index 000000000000..e885afa8031d
--- /dev/null
+++ b/services/core/java/com/android/server/wm/TEST_MAPPING
@@ -0,0 +1,42 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsWindowManagerDeviceTestCases",
+ "options": [
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "android.support.test.filters.FlakyTest"
+ }
+ ]
+ },
+ {
+ "name": "FrameworksServicesTests",
+ "options": [
+ {
+ "include-filter": "com.android.server.wm."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "android.support.test.filters.FlakyTest"
+ }
+ ]
+ }
+ ],
+ "postsubmit": [
+ {
+ "name": "CtsWindowManagerDeviceTestCases"
+ },
+ {
+ "name": "FrameworksServicesTests",
+ "options": [
+ {
+ "include-filter": "com.android.server.wm."
+ }
+ ]
+ }
+ ]
+}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index f87538a2a890..2da77a15b956 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -16,7 +16,7 @@
package com.android.server.wm;
-import static android.app.ActivityManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION;
+import static android.app.ActivityTaskManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION;
import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY;
import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY;
import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION;
@@ -218,7 +218,7 @@ class Task extends WindowContainer<AppWindowToken> {
}
}
- /** @see com.android.server.am.ActivityManagerService#positionTaskInStack(int, int, int). */
+ /** @see com.android.server.am.ActivityTaskManagerService#positionTaskInStack(int, int, int). */
void positionAt(int position) {
mStack.positionChildAt(position, this, false /* includingParents */);
}
@@ -298,7 +298,7 @@ class Task extends WindowContainer<AppWindowToken> {
/**
* Sets the bounds used to calculate the insets. See
- * {@link android.app.IActivityManager#resizeDockedStack} why this is needed.
+ * {@link android.app.IActivityTaskManager#resizeDockedStack} why this is needed.
*/
void setTempInsetBounds(Rect tempInsetBounds) {
if (tempInsetBounds != null) {
@@ -310,7 +310,7 @@ class Task extends WindowContainer<AppWindowToken> {
/**
* Gets the bounds used to calculate the insets. See
- * {@link android.app.IActivityManager#resizeDockedStack} why this is needed.
+ * {@link android.app.IActivityTaskManager#resizeDockedStack} why this is needed.
*/
void getTempInsetBounds(Rect out) {
out.set(mTempInsetBounds);
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index 26c87b738f8c..30f46a05cb72 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -16,8 +16,8 @@
package com.android.server.wm;
-import static android.app.ActivityManager.RESIZE_MODE_USER;
-import static android.app.ActivityManager.RESIZE_MODE_USER_FORCED;
+import static android.app.ActivityTaskManager.RESIZE_MODE_USER;
+import static android.app.ActivityTaskManager.RESIZE_MODE_USER_FORCED;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_POSITIONING;
@@ -29,6 +29,8 @@ import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP;
import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_WIDTH_IN_DP;
import android.annotation.IntDef;
+import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Looper;
@@ -93,6 +95,7 @@ class TaskPositioner {
static final float MIN_ASPECT = 1.2f;
private final WindowManagerService mService;
+ private final IActivityTaskManager mActivityManager;
private WindowPositionerEventReceiver mInputEventReceiver;
private Display mDisplay;
private final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
@@ -126,7 +129,7 @@ class TaskPositioner {
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
if (!(event instanceof MotionEvent)
|| (event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {
return;
@@ -165,7 +168,7 @@ class TaskPositioner {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER,
"wm.TaskPositioner.resizeTask");
try {
- mService.mActivityManager.resizeTask(
+ mActivityManager.resizeTask(
mTask.mTaskId, mWindowDragBounds, RESIZE_MODE_USER);
} catch (RemoteException e) {
}
@@ -198,7 +201,7 @@ class TaskPositioner {
if (wasResizing && !mTmpRect.equals(mWindowDragBounds)) {
// We were using fullscreen surface during resizing. Request
// resizeTask() one last time to restore surface to window size.
- mService.mActivityManager.resizeTask(
+ mActivityManager.resizeTask(
mTask.mTaskId, mWindowDragBounds, RESIZE_MODE_USER_FORCED);
}
} catch(RemoteException e) {}
@@ -216,9 +219,15 @@ class TaskPositioner {
}
}
+ @VisibleForTesting
+ TaskPositioner(WindowManagerService service, IActivityTaskManager activityManager) {
+ mService = service;
+ mActivityManager = activityManager;
+ }
+
/** Use {@link #create(WindowManagerService)} instead **/
TaskPositioner(WindowManagerService service) {
- mService = service;
+ this(service, service.mActivityTaskManager);
}
@VisibleForTesting
@@ -349,8 +358,7 @@ class TaskPositioner {
startDrag(resize, preserveOrientation, startX, startY, mTmpRect);
}
- @VisibleForTesting
- void startDrag(boolean resize, boolean preserveOrientation,
+ protected void startDrag(boolean resize, boolean preserveOrientation,
float startX, float startY, Rect startBounds) {
mCtrlType = CTRL_NONE;
mStartDragX = startX;
@@ -394,7 +402,7 @@ class TaskPositioner {
// guaranteed to happen before subsequent drag resizes.
mService.mH.post(() -> {
try {
- mService.mActivityManager.resizeTask(
+ mActivityManager.resizeTask(
mTask.mTaskId, startBounds, RESIZE_MODE_USER_FORCED);
} catch (RemoteException e) {
}
diff --git a/services/core/java/com/android/server/wm/TaskPositioningController.java b/services/core/java/com/android/server/wm/TaskPositioningController.java
index a3f4ee80dfcb..7d36650f375b 100644
--- a/services/core/java/com/android/server/wm/TaskPositioningController.java
+++ b/services/core/java/com/android/server/wm/TaskPositioningController.java
@@ -21,6 +21,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.annotation.Nullable;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.os.RemoteException;
import android.os.Handler;
import android.os.Looper;
@@ -38,7 +39,7 @@ class TaskPositioningController {
private final WindowManagerService mService;
private final InputManagerService mInputManager;
private final InputMonitor mInputMonitor;
- private final IActivityManager mActivityManager;
+ private final IActivityTaskManager mActivityManager;
private final Handler mHandler;
@GuardedBy("WindowManagerSerivce.mWindowMap")
@@ -53,7 +54,7 @@ class TaskPositioningController {
}
TaskPositioningController(WindowManagerService service, InputManagerService inputManager,
- InputMonitor inputMonitor, IActivityManager activityManager, Looper looper) {
+ InputMonitor inputMonitor, IActivityTaskManager activityManager, Looper looper) {
mService = service;
mInputMonitor = inputMonitor;
mInputManager = inputManager;
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
index a642e6ab744a..21e807eee1e8 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
@@ -39,6 +39,7 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayDeque;
+import java.util.Arrays;
/**
* Persists {@link TaskSnapshot}s to disk.
@@ -399,8 +400,8 @@ class TaskSnapshotPersister {
@VisibleForTesting
RemoveObsoleteFilesQueueItem(ArraySet<Integer> persistentTaskIds,
int[] runningUserIds) {
- mPersistentTaskIds = persistentTaskIds;
- mRunningUserIds = runningUserIds;
+ mPersistentTaskIds = new ArraySet<>(persistentTaskIds);
+ mRunningUserIds = Arrays.copyOf(runningUserIds, runningUserIds.length);
}
@Override
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index 5721bd89b068..67d2be874a31 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -304,6 +304,9 @@ class TaskSnapshotSurface implements StartingSurface {
}
private void drawSizeMismatchSnapshot(GraphicBuffer buffer) {
+ if (!mSurface.isValid()) {
+ throw new IllegalStateException("mSurface does not hold a valid surface.");
+ }
final SurfaceSession session = new SurfaceSession(mSurface);
// Keep a reference to it such that it doesn't get destroyed when finalized.
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 76c9c262cd76..9075b6c7fa49 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -16,8 +16,8 @@
package com.android.server.wm;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
@@ -726,18 +726,33 @@ public class TaskStack extends WindowContainer<Task> implements
@Override
public void onConfigurationChanged(Configuration newParentConfig) {
final int prevWindowingMode = getWindowingMode();
+ final boolean prevIsAlwaysOnTop = isAlwaysOnTop();
super.onConfigurationChanged(newParentConfig);
// Only need to update surface size here since the super method will handle updating
// surface position.
updateSurfaceSize(getPendingTransaction());
final int windowingMode = getWindowingMode();
+ final boolean isAlwaysOnTop = isAlwaysOnTop();
- if (mDisplayContent == null || prevWindowingMode == windowingMode) {
+ if (mDisplayContent == null) {
return;
}
- mDisplayContent.onStackWindowingModeChanged(this);
- updateBoundsForWindowModeChange();
+
+ if (prevWindowingMode != windowingMode) {
+ mDisplayContent.onStackWindowingModeChanged(this);
+ updateBoundsForWindowModeChange();
+ }
+
+ if (prevIsAlwaysOnTop != isAlwaysOnTop) {
+ // positionStackAt(POSITION_TOP, this) must be called even when always on top gets
+ // turned off because we need to make sure that the stack is moved from among always on
+ // top windows to below other always on top windows. Since the position the stack should
+ // be inserted into is calculated properly in
+ // {@link DisplayContent#findPositionForStack()} in both cases, we can just request that
+ // the stack is put at top here.
+ mDisplayContent.positionStackAt(POSITION_TOP, this);
+ }
}
private void updateSurfaceBounds() {
@@ -1614,7 +1629,7 @@ public class TaskStack extends WindowContainer<Task> implements
}
try {
- mService.mActivityManager.resizePinnedStack(stackBounds, tempTaskBounds);
+ mService.mActivityTaskManager.resizePinnedStack(stackBounds, tempTaskBounds);
} catch (RemoteException e) {
// I don't believe you.
}
@@ -1630,9 +1645,14 @@ public class TaskStack extends WindowContainer<Task> implements
}
@Override // AnimatesBounds
- public void onAnimationStart(boolean schedulePipModeChangedCallback, boolean forceUpdate) {
+ public boolean onAnimationStart(boolean schedulePipModeChangedCallback, boolean forceUpdate) {
// Hold the lock since this is called from the BoundsAnimator running on the UiThread
synchronized (mService.mWindowMap) {
+ if (!isAttached()) {
+ // Don't run the animation if the stack is already detached
+ return false;
+ }
+
mBoundsAnimatingRequested = false;
mBoundsAnimating = true;
mCancelCurrentBoundsAnimation = false;
@@ -1647,7 +1667,7 @@ public class TaskStack extends WindowContainer<Task> implements
if (inPinnedWindowingMode()) {
try {
- mService.mActivityManager.notifyPinnedStackAnimationStarted();
+ mService.mActivityTaskManager.notifyPinnedStackAnimationStarted();
} catch (RemoteException e) {
// I don't believe you...
}
@@ -1662,6 +1682,7 @@ public class TaskStack extends WindowContainer<Task> implements
controller.updatePictureInPictureModeForPinnedStackAnimation(null, forceUpdate);
}
}
+ return true;
}
@Override // AnimatesBounds
@@ -1689,9 +1710,9 @@ public class TaskStack extends WindowContainer<Task> implements
}
try {
- mService.mActivityManager.notifyPinnedStackAnimationEnded();
+ mService.mActivityTaskManager.notifyPinnedStackAnimationEnded();
if (moveToFullscreen) {
- mService.mActivityManager.moveTasksToFullscreenStack(mStackId,
+ mService.mActivityTaskManager.moveTasksToFullscreenStack(mStackId,
true /* onTop */);
}
} catch (RemoteException e) {
@@ -1703,38 +1724,49 @@ public class TaskStack extends WindowContainer<Task> implements
}
}
+ @Override
+ public boolean isAttached() {
+ synchronized (mService.mWindowMap) {
+ return mDisplayContent != null;
+ }
+ }
+
/**
* Called immediately prior to resizing the tasks at the end of the pinned stack animation.
*/
public void onPipAnimationEndResize() {
- mBoundsAnimating = false;
- for (int i = 0; i < mChildren.size(); i++) {
- final Task t = mChildren.get(i);
- t.clearPreserveNonFloatingState();
+ synchronized (mService.mWindowMap) {
+ mBoundsAnimating = false;
+ for (int i = 0; i < mChildren.size(); i++) {
+ final Task t = mChildren.get(i);
+ t.clearPreserveNonFloatingState();
+ }
+ mService.requestTraversal();
}
- mService.requestTraversal();
}
@Override
public boolean shouldDeferStartOnMoveToFullscreen() {
- // Workaround for the recents animation -- normally we need to wait for the new activity to
- // show before starting the PiP animation, but because we start and show the home activity
- // early for the recents animation prior to the PiP animation starting, there is no
- // subsequent all-drawn signal. In this case, we can skip the pause when the home stack is
- // already visible and drawn.
- final TaskStack homeStack = mDisplayContent.getHomeStack();
- if (homeStack == null) {
- return true;
- }
- final Task homeTask = homeStack.getTopChild();
- if (homeTask == null) {
- return true;
- }
- final AppWindowToken homeApp = homeTask.getTopVisibleAppToken();
- if (!homeTask.isVisible() || homeApp == null) {
- return true;
+ synchronized (mService.mWindowMap) {
+ // Workaround for the recents animation -- normally we need to wait for the new activity
+ // to show before starting the PiP animation, but because we start and show the home
+ // activity early for the recents animation prior to the PiP animation starting, there
+ // is no subsequent all-drawn signal. In this case, we can skip the pause when the home
+ // stack is already visible and drawn.
+ final TaskStack homeStack = mDisplayContent.getHomeStack();
+ if (homeStack == null) {
+ return true;
+ }
+ final Task homeTask = homeStack.getTopChild();
+ if (homeTask == null) {
+ return true;
+ }
+ final AppWindowToken homeApp = homeTask.getTopVisibleAppToken();
+ if (!homeTask.isVisible() || homeApp == null) {
+ return true;
+ }
+ return !homeApp.allDrawn;
}
- return !homeApp.allDrawn;
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
index 3d8a8ab7cc62..dcd490ecc338 100644
--- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
+++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
@@ -53,14 +53,10 @@ public class TaskTapPointerEventListener implements PointerEventListener {
}
@Override
- public void onPointerEvent(MotionEvent motionEvent, int displayId) {
- if (displayId == getDisplayId()) {
- onPointerEvent(motionEvent);
- }
- }
-
- @Override
public void onPointerEvent(MotionEvent motionEvent) {
+ if (motionEvent.getDisplayId() != getDisplayId()) {
+ return;
+ }
final int action = motionEvent.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 19c5a3d6452a..fee0fcb98427 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -246,6 +246,19 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
+ " is already a child of container=" + child.getParent().getName()
+ " can't add to container=" + getName());
}
+
+ if ((index < 0 && index != POSITION_BOTTOM)
+ || (index > mChildren.size() && index != POSITION_TOP)) {
+ throw new IllegalArgumentException("addChild: invalid position=" + index
+ + ", children number=" + mChildren.size());
+ }
+
+ if (index == POSITION_TOP) {
+ index = mChildren.size();
+ } else if (index == POSITION_BOTTOM) {
+ index = 0;
+ }
+
mChildren.add(index, child);
onChildAdded(child);
@@ -736,6 +749,20 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
/**
+ * Seamlessly rotates the container, by recomputing the location in the new
+ * rotation, and rotating buffers until they are updated for the new rotation.
+ *
+ * @param t the transaction to perform the seamless rotation in
+ * @param oldRotation the rotation we are rotating from
+ * @param newRotation the rotation we are rotating to
+ */
+ void seamlesslyRotate(Transaction t, int oldRotation, int newRotation) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ mChildren.get(i).seamlesslyRotate(t, oldRotation, newRotation);
+ }
+ }
+
+ /**
* Returns true if this container is opaque and fills all the space made available by its parent
* container.
*
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index 6686b80d1e18..0c655180fbc6 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -368,14 +368,25 @@ public abstract class WindowManagerInternal {
* to be synchronized with state in WindowManagerService.
* @param dismissImeOnBackKeyPressed {@code true} if the software keyboard is shown and the back
* key is expected to dismiss the software keyboard.
- * @param targetWindowToken token to identify the target window that the IME is associated with.
- * {@code null} when application, system, or the IME itself decided to
- * change its window visibility before being associated with any target
- * window.
*/
public abstract void updateInputMethodWindowStatus(@NonNull IBinder imeToken,
- boolean imeWindowVisible, boolean dismissImeOnBackKeyPressed,
- @Nullable IBinder targetWindowToken);
+ boolean imeWindowVisible, boolean dismissImeOnBackKeyPressed);
+
+ /**
+ * Notifies WindowManagerService that the current IME window status is being changed.
+ *
+ * <p>Only {@link com.android.server.InputMethodManagerService} is the expected and tested
+ * caller of this method.</p>
+ *
+ * @param imeToken token to track the active input method. Corresponding IME windows can be
+ * identified by checking {@link android.view.WindowManager.LayoutParams#token}.
+ * Note that there is no guarantee that the corresponding window is already
+ * created
+ * @param imeTargetWindowToken token to identify the target window that the IME is associated
+ * with
+ */
+ public abstract void updateInputMethodTargetWindow(@NonNull IBinder imeToken,
+ @NonNull IBinder imeTargetWindowToken);
/**
* Returns true when the hardware keyboard is available.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index fe2447bc4a67..e9800878ba2c 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -21,7 +21,7 @@ import static android.Manifest.permission.MANAGE_APP_TOKENS;
import static android.Manifest.permission.READ_FRAME_BUFFER;
import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS;
import static android.Manifest.permission.RESTRICTED_VR_ACCESS;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
import static android.app.StatusBarManager.DISABLE_MASK;
import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED;
@@ -116,9 +116,11 @@ import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManager.TaskSnapshot;
import android.app.ActivityManagerInternal;
+import android.app.ActivityTaskManager;
import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.IAssistDataReceiver;
import android.app.admin.DevicePolicyCache;
import android.content.BroadcastReceiver;
@@ -223,7 +225,6 @@ import android.view.WindowManager.TransitionFlags;
import android.view.WindowManager.TransitionType;
import android.view.WindowManagerGlobal;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
-import android.view.inputmethod.InputMethodManagerInternal;
import com.android.internal.R;
import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
@@ -348,6 +349,8 @@ public class WindowManagerService extends IWindowManager.Stub
static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1;
static final int UPDATE_FOCUS_PLACING_SURFACES = 2;
static final int UPDATE_FOCUS_WILL_PLACE_SURFACES = 3;
+ /** Indicates we are removing the focused window when updating the focus. */
+ static final int UPDATE_FOCUS_REMOVING_FOCUS = 4;
private static final String SYSTEM_SECURE = "ro.secure";
private static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
@@ -438,7 +441,10 @@ public class WindowManagerService extends IWindowManager.Stub
final WindowManagerPolicy mPolicy;
final IActivityManager mActivityManager;
+ // TODO: Probably not needed once activities are fully in WM.
+ final IActivityTaskManager mActivityTaskManager;
final ActivityManagerInternal mAmInternal;
+ final ActivityTaskManagerInternal mAtmInternal;
final AppOpsManager mAppOps;
final PackageManagerInternal mPmInternal;
@@ -870,7 +876,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
if (atoken.mLaunchTaskBehind) {
try {
- mActivityManager.notifyLaunchTaskBehindComplete(atoken.token);
+ mActivityTaskManager.notifyLaunchTaskBehindComplete(atoken.token);
} catch (RemoteException e) {
}
atoken.mLaunchTaskBehind = false;
@@ -887,7 +893,7 @@ public class WindowManagerService extends IWindowManager.Stub
} else {
atoken.mEnteringAnimation = false;
try {
- mActivityManager.notifyEnterAnimationComplete(atoken.token);
+ mActivityTaskManager.notifyEnterAnimationComplete(atoken.token);
} catch (RemoteException e) {
}
}
@@ -1020,7 +1026,9 @@ public class WindowManagerService extends IWindowManager.Stub
AnimationThread.getHandler(), animationHandler);
mActivityManager = ActivityManager.getService();
+ mActivityTaskManager = ActivityTaskManager.getService();
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
+ mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
AppOpsManager.OnOpChangedInternalListener opListener =
new AppOpsManager.OnOpChangedInternalListener() {
@@ -1071,13 +1079,13 @@ public class WindowManagerService extends IWindowManager.Stub
PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG_WM);
mHoldingScreenWakeLock.setReferenceCounted(false);
- mSurfaceAnimationRunner = new SurfaceAnimationRunner();
+ mSurfaceAnimationRunner = new SurfaceAnimationRunner(mPowerManagerInternal);
mAllowTheaterModeWakeFromLayout = context.getResources().getBoolean(
com.android.internal.R.bool.config_allowTheaterModeWakeFromWindowLayout);
mTaskPositioningController = new TaskPositioningController(
- this, mInputManager, mInputMonitor, mActivityManager, mH.getLooper());
+ this, mInputManager, mInputMonitor, mActivityTaskManager, mH.getLooper());
mDragDropController = new DragDropController(this, mH.getLooper());
LocalServices.addService(WindowManagerInternal.class, new LocalService());
@@ -1473,14 +1481,18 @@ public class WindowManagerService extends IWindowManager.Stub
displayFrames.onDisplayInfoUpdated(displayInfo,
displayContent.calculateDisplayCutoutForRotation(displayInfo.rotation));
final Rect taskBounds;
+ final boolean floatingStack;
if (atoken != null && atoken.getTask() != null) {
taskBounds = mTmpRect;
atoken.getTask().getBounds(mTmpRect);
+ floatingStack = atoken.getTask().isFloating();
} else {
taskBounds = null;
+ floatingStack = false;
}
- if (mPolicy.getLayoutHintLw(win.mAttrs, taskBounds, displayFrames, outFrame,
- outContentInsets, outStableInsets, outOutsets, outDisplayCutout)) {
+ if (mPolicy.getLayoutHintLw(win.mAttrs, taskBounds, displayFrames, floatingStack,
+ outFrame, outContentInsets, outStableInsets, outOutsets,
+ outDisplayCutout)) {
res |= WindowManagerGlobal.ADD_FLAG_ALWAYS_CONSUME_NAV_BAR;
}
@@ -2184,8 +2196,6 @@ public class WindowManagerService extends IWindowManager.Stub
result |= mInTouchMode ? WindowManagerGlobal.RELAYOUT_RES_IN_TOUCH_MODE : 0;
- mInputMonitor.updateInputWindowsLw(true /*force*/);
-
if (DEBUG_LAYOUT) {
Slog.v(TAG_WM, "Relayout complete " + win + ": outFrame=" + outFrame.toShortString());
}
@@ -3298,16 +3308,6 @@ public class WindowManagerService extends IWindowManager.Stub
// Called by window manager policy. Not exposed externally.
@Override
- public void switchInputMethod(boolean forwardDirection) {
- final InputMethodManagerInternal inputMethodManagerInternal =
- LocalServices.getService(InputMethodManagerInternal.class);
- if (inputMethodManagerInternal != null) {
- inputMethodManagerInternal.switchInputMethod(forwardDirection);
- }
- }
-
- // Called by window manager policy. Not exposed externally.
- @Override
public void shutdown(boolean confirm) {
// Pass in the UI context, since ShutdownThread requires it (to show UI).
ShutdownThread.shutdown(ActivityThread.currentActivityThread().getSystemUiContext(),
@@ -4421,7 +4421,7 @@ public class WindowManagerService extends IWindowManager.Stub
*/
void sendNewConfiguration(int displayId) {
try {
- final boolean configUpdated = mActivityManager.updateDisplayOverrideConfiguration(
+ final boolean configUpdated = mActivityTaskManager.updateDisplayOverrideConfiguration(
null /* values */, displayId);
if (!configUpdated) {
// Something changed (E.g. device rotation), but no configuration update is needed.
@@ -4576,7 +4576,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
try {
- mActivityManager.updateConfiguration(null);
+ mActivityTaskManager.updateConfiguration(null);
} catch (RemoteException e) {
}
@@ -4587,7 +4587,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
try {
- mActivityManager.updateConfiguration(null);
+ mActivityTaskManager.updateConfiguration(null);
} catch (RemoteException e) {
}
@@ -4942,7 +4942,7 @@ public class WindowManagerService extends IWindowManager.Stub
case NOTIFY_ACTIVITY_DRAWN:
try {
- mActivityManager.notifyActivityDrawn((IBinder) msg.obj);
+ mActivityTaskManager.notifyActivityDrawn((IBinder) msg.obj);
} catch (RemoteException e) {
}
break;
@@ -5029,16 +5029,16 @@ public class WindowManagerService extends IWindowManager.Stub
}
break;
case NOTIFY_APP_TRANSITION_STARTING: {
- mAmInternal.notifyAppTransitionStarting((SparseIntArray) msg.obj,
+ mAtmInternal.notifyAppTransitionStarting((SparseIntArray) msg.obj,
msg.getWhen());
}
break;
case NOTIFY_APP_TRANSITION_CANCELLED: {
- mAmInternal.notifyAppTransitionCancelled();
+ mAtmInternal.notifyAppTransitionCancelled();
}
break;
case NOTIFY_APP_TRANSITION_FINISHED: {
- mAmInternal.notifyAppTransitionFinished();
+ mAtmInternal.notifyAppTransitionFinished();
}
break;
case WINDOW_HIDE_TIMEOUT: {
@@ -5063,7 +5063,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
break;
case NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED: {
- mAmInternal.notifyDockedStackMinimizedChanged(msg.arg1 == 1);
+ mAtmInternal.notifyDockedStackMinimizedChanged(msg.arg1 == 1);
}
break;
case RESTORE_POINTER_ICON: {
@@ -5082,11 +5082,11 @@ public class WindowManagerService extends IWindowManager.Stub
}
break;
case NOTIFY_KEYGUARD_FLAGS_CHANGED: {
- mAmInternal.notifyKeyguardFlagsChanged((Runnable) msg.obj);
+ mAtmInternal.notifyKeyguardFlagsChanged((Runnable) msg.obj);
}
break;
case NOTIFY_KEYGUARD_TRUSTED_CHANGED: {
- mAmInternal.notifyKeyguardTrustedChanged();
+ mAtmInternal.notifyKeyguardTrustedChanged();
}
break;
case SET_HAS_OVERLAY_UI: {
@@ -5706,9 +5706,9 @@ public class WindowManagerService extends IWindowManager.Stub
boolean imWindowChanged = false;
if (mInputMethodWindow != null) {
final WindowState prevTarget = mInputMethodTarget;
+
final WindowState newTarget =
displayContent.computeImeTarget(true /* updateImeTarget*/);
-
imWindowChanged = prevTarget != newTarget;
if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS
@@ -5756,6 +5756,8 @@ public class WindowManagerService extends IWindowManager.Stub
displayContent.setLayoutNeeded();
if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
displayContent.performLayout(true /*initial*/, updateInputWindows);
+ } else if (mode == UPDATE_FOCUS_REMOVING_FOCUS) {
+ mRoot.performSurfacePlacement(false);
}
}
@@ -6020,7 +6022,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void setRecentsVisibility(boolean visible) {
- mAmInternal.enforceCallerIsRecentsOrHasPermission(android.Manifest.permission.STATUS_BAR,
+ mAtmInternal.enforceCallerIsRecentsOrHasPermission(android.Manifest.permission.STATUS_BAR,
"setRecentsVisibility()");
synchronized (mWindowMap) {
mPolicy.setRecentsVisibilityLw(visible);
@@ -6042,7 +6044,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void setShelfHeight(boolean visible, int shelfHeight) {
- mAmInternal.enforceCallerIsRecentsOrHasPermission(android.Manifest.permission.STATUS_BAR,
+ mAtmInternal.enforceCallerIsRecentsOrHasPermission(android.Manifest.permission.STATUS_BAR,
"setShelfHeight()");
synchronized (mWindowMap) {
getDefaultDisplayContentLocked().getPinnedStackController().setAdjustedForShelf(visible,
@@ -7410,16 +7412,18 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void updateInputMethodWindowStatus(@NonNull IBinder imeToken,
- boolean imeWindowVisible, boolean dismissImeOnBackKeyPressed,
- @Nullable IBinder targetWindowToken) {
+ boolean imeWindowVisible, boolean dismissImeOnBackKeyPressed) {
+ mPolicy.setDismissImeOnBackKeyPressed(dismissImeOnBackKeyPressed);
+ }
+
+ @Override
+ public void updateInputMethodTargetWindow(@NonNull IBinder imeToken,
+ @NonNull IBinder imeTargetWindowToken) {
// TODO (b/34628091): Use this method to address the window animation issue.
if (DEBUG_INPUT_METHOD) {
- Slog.w(TAG_WM, "updateInputMethodWindowStatus: imeToken=" + imeToken
- + " dismissImeOnBackKeyPressed=" + dismissImeOnBackKeyPressed
- + " imeWindowVisible=" + imeWindowVisible
- + " targetWindowToken=" + targetWindowToken);
+ Slog.w(TAG_WM, "updateInputMethodTargetWindow: imeToken=" + imeToken
+ + " imeTargetWindowToken=" + imeTargetWindowToken);
}
- mPolicy.setDismissImeOnBackKeyPressed(dismissImeOnBackKeyPressed);
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 118b01c0d394..c8c4b588f014 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -16,7 +16,7 @@
package com.android.server.wm;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
+import static android.app.ActivityTaskManager.INVALID_STACK_ID;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_DEFAULT;
import static android.app.AppOpsManager.OP_NONE;
@@ -100,6 +100,7 @@ import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER;
import static com.android.server.wm.WindowManagerService.TYPE_LAYER_OFFSET;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
+import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_REMOVING_FOCUS;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_TIMEOUT;
import static com.android.server.wm.WindowManagerService.localLOGV;
@@ -151,6 +152,8 @@ import static com.android.server.wm.WindowStateProto.VIEW_VISIBILITY;
import static com.android.server.wm.WindowStateProto.VISIBLE_FRAME;
import static com.android.server.wm.WindowStateProto.VISIBLE_INSETS;
import static com.android.server.wm.WindowStateProto.WINDOW_CONTAINER;
+import static com.android.server.wm.utils.CoordinateTransforms.transformRect;
+import static com.android.server.wm.utils.CoordinateTransforms.transformToRotation;
import android.annotation.CallSuper;
import android.app.AppOpsManager;
@@ -445,7 +448,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
/**
* Usually empty. Set to the task's tempInsetFrame. See
- *{@link android.app.IActivityManager#resizeDockedStack}.
+ *{@link android.app.IActivityTaskManager#resizeDockedStack}.
*/
private final Rect mInsetFrame = new Rect();
@@ -1812,7 +1815,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
&& (mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0
&& !isDragResizing() && !adjustedForMinimizedDockOrIme
&& getWindowConfiguration().hasMovementAnimations()
- && !mWinAnimator.mLastHidden) {
+ && !mWinAnimator.mLastHidden
+ && !mSeamlesslyRotated) {
startMoveAnimation(left, top);
}
@@ -2061,7 +2065,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (wasVisible && mService.updateOrientationFromAppTokensLocked(displayId)) {
mService.mH.obtainMessage(SEND_NEW_CONFIGURATION, displayId).sendToTarget();
}
- mService.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
+ mService.updateFocusedWindowLocked(mService.mCurrentFocus == this
+ ? UPDATE_FOCUS_REMOVING_FOCUS
+ : UPDATE_FOCUS_NORMAL,
+ true /*updateInputWindows*/);
} finally {
Binder.restoreCallingIdentity(origId);
}
@@ -2130,7 +2137,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
super(inputChannel, mService.mH.getLooper());
}
@Override
- public void onInputEvent(InputEvent event, int displayId) {
+ public void onInputEvent(InputEvent event) {
finishInputEvent(event, true);
}
}
@@ -2448,7 +2455,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
try {
// Note: this calls into ActivityManager, so we must *not* hold the window
// manager lock while calling this.
- mService.mActivityManager.setSplitScreenResizing(false);
+ mService.mActivityTaskManager.setSplitScreenResizing(false);
} catch (RemoteException e) {
// Local call, shouldn't return RemoteException.
throw e.rethrowAsRuntimeException();
@@ -4856,6 +4863,29 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mFrameNumber = frameNumber;
}
+ @Override
+ void seamlesslyRotate(Transaction t, int oldRotation, int newRotation) {
+ if (!isVisibleNow() || mIsWallpaper) {
+ return;
+ }
+ final Matrix transform = mTmpMatrix;
+
+ mService.markForSeamlessRotation(this, true);
+
+ // We rotated the screen, but have not performed a new layout pass yet. In the mean time,
+ // we recompute the coordinates of mFrame in the new orientation, so the surface can be
+ // properly placed.
+ transformToRotation(oldRotation, newRotation, getDisplayInfo(), transform);
+ transformRect(transform, mFrame, null /* tmpRectF */);
+
+ updateSurfacePosition(t);
+ mWinAnimator.seamlesslyRotate(t, oldRotation, newRotation);
+
+ // Dispatch to children only after mFrame has been updated, as it's needed in the
+ // child's updateSurfacePosition.
+ super.seamlesslyRotate(t, oldRotation, newRotation);
+ }
+
private final class MoveAnimationSpec implements AnimationSpec {
private final long mDuration;
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 561c9de219da..14e0e13414a9 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -41,18 +41,18 @@ 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.TYPE_LAYER_MULTIPLIER;
import static com.android.server.wm.WindowManagerService.logWithStack;
-import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
import static com.android.server.wm.WindowStateAnimatorProto.DRAW_STATE;
import static com.android.server.wm.WindowStateAnimatorProto.LAST_CLIP_RECT;
import static com.android.server.wm.WindowStateAnimatorProto.SURFACE;
import static com.android.server.wm.WindowStateAnimatorProto.SYSTEM_DECOR_RECT;
+import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
+import static com.android.server.wm.utils.CoordinateTransforms.transformToRotation;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
-import android.graphics.RectF;
import android.graphics.Region;
import android.os.Debug;
import android.os.Trace;
@@ -366,7 +366,8 @@ class WindowStateAnimator {
mDrawState = READY_TO_SHOW;
boolean result = false;
final AppWindowToken atoken = mWin.mAppToken;
- if (atoken == null || atoken.allDrawn || mWin.mAttrs.type == TYPE_APPLICATION_STARTING) {
+ if (atoken == null || atoken.canShowWindows()
+ || mWin.mAttrs.type == TYPE_APPLICATION_STARTING) {
result = mWin.performShowLocked();
}
return result;
@@ -1497,40 +1498,14 @@ class WindowStateAnimator {
}
}
- void seamlesslyRotateWindow(SurfaceControl.Transaction t,
- int oldRotation, int newRotation) {
+ void seamlesslyRotate(SurfaceControl.Transaction t, int oldRotation, int newRotation) {
final WindowState w = mWin;
- if (!w.isVisibleNow() || w.mIsWallpaper) {
- return;
- }
- final Rect cropRect = mService.mTmpRect;
- final Rect displayRect = mService.mTmpRect2;
- final RectF frameRect = mService.mTmpRectF;
+ // We rotated the screen, but have not received a new buffer with the correct size yet. In
+ // the mean time, we rotate the buffer we have to the new orientation.
final Matrix transform = mService.mTmpTransform;
-
- final float x = w.mFrame.left;
- final float y = w.mFrame.top;
- final float width = w.mFrame.width();
- final float height = w.mFrame.height();
-
- mService.getDefaultDisplayContentLocked().getBounds(displayRect);
- final float displayWidth = displayRect.width();
- final float displayHeight = displayRect.height();
-
- // Compute a transform matrix to undo the coordinate space transformation,
- // and present the window at the same physical position it previously occupied.
- final int deltaRotation = DisplayContent.deltaRotation(newRotation, oldRotation);
- DisplayContent.createRotationMatrix(deltaRotation, x, y, displayWidth, displayHeight,
+ transformToRotation(oldRotation, newRotation, w.mFrame.width(), w.mFrame.height(),
transform);
-
- // We just need to apply a rotation matrix to the window. For example
- // if we have a portrait window and rotate to landscape, the window is still portrait
- // and now extends off the bottom of the screen (and only halfway across). Essentially we
- // apply a transform to display the current buffer at it's old position
- // (in the new coordinate space). We then freeze layer updates until the resize
- // occurs, at which point we undo, them.
- mService.markForSeamlessRotation(w, true);
transform.getValues(mService.mTmpFloats);
float DsDx = mService.mTmpFloats[Matrix.MSCALE_X];
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index d2479604e92b..aced8e46ab10 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -16,18 +16,10 @@
package com.android.server.wm;
-import static android.app.ActivityManagerInternal.APP_TRANSITION_SNAPSHOT;
-import static android.app.ActivityManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
-import static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
-
-import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS;
-import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE;
import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
+import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE;
+import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
@@ -39,12 +31,18 @@ import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
import static android.view.WindowManager.TRANSIT_TASK_OPEN;
import static android.view.WindowManager.TRANSIT_TASK_TO_BACK;
import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
+import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
+import static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
import static android.view.WindowManager.TRANSIT_WALLPAPER_CLOSE;
import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE;
import static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN;
import static android.view.WindowManager.TRANSIT_WALLPAPER_OPEN;
+import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
+import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
+import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SNAPSHOT;
+import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
+import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
import static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit;
-import static com.android.server.wm.AppTransition.isTaskTransit;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
diff --git a/services/core/java/com/android/server/wm/utils/CoordinateTransforms.java b/services/core/java/com/android/server/wm/utils/CoordinateTransforms.java
index 09d7b5de1caf..a2f37a56598d 100644
--- a/services/core/java/com/android/server/wm/utils/CoordinateTransforms.java
+++ b/services/core/java/com/android/server/wm/utils/CoordinateTransforms.java
@@ -22,7 +22,11 @@ import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
import android.annotation.Dimension;
+import android.annotation.Nullable;
import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.view.DisplayInfo;
import android.view.Surface.Rotation;
public class CoordinateTransforms {
@@ -59,4 +63,93 @@ public class CoordinateTransforms {
throw new IllegalArgumentException("Unknown rotation: " + rotation);
}
}
+
+ /**
+ * Sets a matrix such that given a rotation, it transforms that rotation's logical coordinates
+ * to physical coordinates.
+ *
+ * @param rotation the rotation to which the matrix should transform
+ * @param out the matrix to be set
+ */
+ public static void transformLogicalToPhysicalCoordinates(@Rotation int rotation,
+ @Dimension int physicalWidth, @Dimension int physicalHeight, Matrix out) {
+ switch (rotation) {
+ case ROTATION_0:
+ out.reset();
+ break;
+ case ROTATION_90:
+ out.setRotate(90);
+ out.preTranslate(0, -physicalWidth);
+ break;
+ case ROTATION_180:
+ out.setRotate(180);
+ out.preTranslate(-physicalWidth, -physicalHeight);
+ break;
+ case ROTATION_270:
+ out.setRotate(270);
+ out.preTranslate(-physicalHeight, 0);
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown rotation: " + rotation);
+ }
+ }
+
+ /**
+ * Sets a matrix such that given a two rotations, that it transforms coordinates given in the
+ * old rotation to coordinates that refer to the same physical location in the new rotation.
+ *
+ * @param oldRotation the rotation to transform from
+ * @param newRotation the rotation to transform to
+ * @param info the display info
+ * @param out a matrix that will be set to the transform
+ */
+ public static void transformToRotation(@Rotation int oldRotation,
+ @Rotation int newRotation, DisplayInfo info, Matrix out) {
+ final boolean flipped = info.rotation == ROTATION_90 || info.rotation == ROTATION_270;
+ final int h = flipped ? info.logicalWidth : info.logicalHeight;
+ final int w = flipped ? info.logicalHeight : info.logicalWidth;
+
+ final Matrix tmp = new Matrix();
+ transformLogicalToPhysicalCoordinates(oldRotation, w, h, out);
+ transformPhysicalToLogicalCoordinates(newRotation, w, h, tmp);
+ out.postConcat(tmp);
+ }
+
+ /**
+ * Sets a matrix such that given a two rotations, that it transforms coordinates given in the
+ * old rotation to coordinates that refer to the same physical location in the new rotation.
+ *
+ * @param oldRotation the rotation to transform from
+ * @param newRotation the rotation to transform to
+ * @param newWidth the width of the area to transform, in the new rotation
+ * @param newHeight the height of the area to transform, in the new rotation
+ * @param out a matrix that will be set to the transform
+ */
+ public static void transformToRotation(@Rotation int oldRotation,
+ @Rotation int newRotation, int newWidth, int newHeight, Matrix out) {
+ final boolean flipped = newRotation == ROTATION_90 || newRotation == ROTATION_270;
+ final int h = flipped ? newWidth : newHeight;
+ final int w = flipped ? newHeight : newWidth;
+
+ final Matrix tmp = new Matrix();
+ transformLogicalToPhysicalCoordinates(oldRotation, w, h, out);
+ transformPhysicalToLogicalCoordinates(newRotation, w, h, tmp);
+ out.postConcat(tmp);
+ }
+
+ /**
+ * Transforms a rect using a transformation matrix
+ *
+ * @param transform the transformation to apply to the rect
+ * @param inOutRect the rect to transform
+ * @param tmp a temporary value, if null the function will allocate its own.
+ */
+ public static void transformRect(Matrix transform, Rect inOutRect, @Nullable RectF tmp) {
+ if (tmp == null) {
+ tmp = new RectF();
+ }
+ tmp.set(inOutRect);
+ transform.mapRect(tmp);
+ inOutRect.set((int) tmp.left, (int) tmp.top, (int) tmp.right, (int) tmp.bottom);
+ }
}
diff --git a/services/core/java/com/android/server/wm/utils/InsetUtils.java b/services/core/java/com/android/server/wm/utils/InsetUtils.java
index b4a998add374..c5b103fdb40b 100644
--- a/services/core/java/com/android/server/wm/utils/InsetUtils.java
+++ b/services/core/java/com/android/server/wm/utils/InsetUtils.java
@@ -16,8 +16,11 @@
package com.android.server.wm.utils;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.graphics.Rect;
+
/**
* Utility methods to handle insets represented as rects.
*/
@@ -35,4 +38,30 @@ public class InsetUtils {
inOutInsets.right += insetsToAdd.right;
inOutInsets.bottom += insetsToAdd.bottom;
}
+
+ /**
+ * Calculates the insets from the {@code outerFrame} to the {@code innerFrame}.
+ *
+ * Note that if a side of the outer frame is not actually on the outside, the inset for that
+ * side will be clamped to zero.
+ *
+ * @param outerFrame the reference frame from which the insets are calculated
+ * @param innerFrame the inset frame, to which the insets are calculated,
+ * or null to clear the insets.
+ * @param outInsets is set to the result of the inset calculation.
+ */
+ public static void insetsBetweenFrames(@NonNull Rect outerFrame, @Nullable Rect innerFrame,
+ @NonNull Rect outInsets) {
+ if (innerFrame == null) {
+ outInsets.setEmpty();
+ return;
+ }
+ final int w = outerFrame.width();
+ final int h = outerFrame.height();
+ outInsets.set(
+ Math.min(w, Math.max(0, innerFrame.left - outerFrame.left)),
+ Math.min(h, Math.max(0, innerFrame.top - outerFrame.top)),
+ Math.min(w, Math.max(0, outerFrame.right - innerFrame.right)),
+ Math.min(h, Math.max(0, outerFrame.bottom - innerFrame.bottom)));
+ }
}
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 89efe12927ba..9e1191d2c1ef 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -2,6 +2,8 @@ cc_library_static {
name: "libservices.core",
defaults: ["libservices.core-libs"],
+ cpp_std: "c++17",
+
cflags: [
"-Wall",
"-Werror",
diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp
index 47350c11f958..e79612fbf3d3 100644
--- a/services/core/jni/com_android_server_AlarmManagerService.cpp
+++ b/services/core/jni/com_android_server_AlarmManagerService.cpp
@@ -81,6 +81,7 @@ public:
int set(int type, struct timespec *ts);
int setTime(struct timeval *tv);
int waitForAlarm();
+ int getTime(int type, struct itimerspec *spec);
private:
const TimerFds fds;
@@ -118,6 +119,16 @@ int AlarmImpl::set(int type, struct timespec *ts)
return timerfd_settime(fds[type], TFD_TIMER_ABSTIME, &spec, NULL);
}
+int AlarmImpl::getTime(int type, struct itimerspec *spec)
+{
+ if (static_cast<size_t>(type) > ANDROID_ALARM_TYPE_COUNT) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return timerfd_gettime(fds[type], spec);
+}
+
int AlarmImpl::setTime(struct timeval *tv)
{
struct rtc_time rtc;
@@ -183,7 +194,9 @@ int AlarmImpl::waitForAlarm()
uint32_t alarm_idx = events[i].data.u32;
uint64_t unused;
ssize_t err = read(fds[alarm_idx], &unused, sizeof(unused));
- if (err < 0) {
+ // Worth evaluating even if read fails with EAGAIN, since epoll_wait
+ // returned. (see b/78560047#comment34)
+ if (err < 0 && errno != EAGAIN) {
if (alarm_idx == ANDROID_ALARM_TYPE_COUNT && errno == ECANCELED) {
result |= ANDROID_ALARM_TIME_CHANGE_MASK;
} else {
@@ -337,7 +350,7 @@ static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject)
}
for (size_t i = 0; i < fds.size(); i++) {
- fds[i] = timerfd_create(android_alarm_to_clockid[i], 0);
+ fds[i] = timerfd_create(android_alarm_to_clockid[i], TFD_NONBLOCK);
if (fds[i] < 0) {
log_timerfd_create_error(android_alarm_to_clockid[i]);
close(epollfd);
@@ -379,6 +392,23 @@ static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject)
return reinterpret_cast<jlong>(ret);
}
+static jlong android_server_AlarmManagerService_getNextAlarm(JNIEnv*, jobject, jlong nativeData, jint type)
+{
+ AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData);
+ struct itimerspec spec;
+ memset(&spec, 0, sizeof(spec));
+ const int result = impl->getTime(type, &spec);
+ if (result < 0)
+ {
+ ALOGE("timerfd_gettime() failed for fd %d: %s\n", static_cast<int>(type), strerror(errno));
+ return result;
+ }
+ struct timespec nextTimespec = spec.it_value;
+ long long millis = nextTimespec.tv_sec * 1000LL;
+ millis += (nextTimespec.tv_nsec / 1000000LL);
+ return static_cast<jlong>(millis);
+}
+
static void android_server_AlarmManagerService_close(JNIEnv*, jobject, jlong nativeData)
{
AlarmImpl *impl = reinterpret_cast<AlarmImpl *>(nativeData);
@@ -429,6 +459,7 @@ static const JNINativeMethod sMethods[] = {
{"waitForAlarm", "(J)I", (void*)android_server_AlarmManagerService_waitForAlarm},
{"setKernelTime", "(JJ)I", (void*)android_server_AlarmManagerService_setKernelTime},
{"setKernelTimezone", "(JI)I", (void*)android_server_AlarmManagerService_setKernelTimezone},
+ {"getNextAlarm", "(JI)J", (void*)android_server_AlarmManagerService_getNextAlarm},
};
int register_android_server_AlarmManagerService(JNIEnv* env)
diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp
index 016de14f1582..defcfd9a3370 100644
--- a/services/core/jni/com_android_server_VibratorService.cpp
+++ b/services/core/jni/com_android_server_VibratorService.cpp
@@ -93,7 +93,7 @@ bool isValidEffect(jlong effect) {
return false;
}
R val = static_cast<R>(effect);
- auto iter = hardware::hidl_enum_iterator<R>();
+ auto iter = hardware::hidl_enum_range<R>();
return val >= *iter.begin() && val < *std::prev(iter.end());
}
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 27c2faca9d33..52f2d674f993 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -1407,7 +1407,7 @@ static void nativeSetInputFilterEnabled(JNIEnv* /* env */, jclass /* clazz */,
}
static jint nativeInjectInputEvent(JNIEnv* env, jclass /* clazz */,
- jlong ptr, jobject inputEventObj, jint displayId, jint injectorPid, jint injectorUid,
+ jlong ptr, jobject inputEventObj, jint injectorPid, jint injectorUid,
jint syncMode, jint timeoutMillis, jint policyFlags) {
NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
@@ -1420,7 +1420,7 @@ static jint nativeInjectInputEvent(JNIEnv* env, jclass /* clazz */,
}
return (jint) im->getInputManager()->getDispatcher()->injectInputEvent(
- & keyEvent, displayId, injectorPid, injectorUid, syncMode, timeoutMillis,
+ & keyEvent, injectorPid, injectorUid, syncMode, timeoutMillis,
uint32_t(policyFlags));
} else if (env->IsInstanceOf(inputEventObj, gMotionEventClassInfo.clazz)) {
const MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, inputEventObj);
@@ -1430,7 +1430,7 @@ static jint nativeInjectInputEvent(JNIEnv* env, jclass /* clazz */,
}
return (jint) im->getInputManager()->getDispatcher()->injectInputEvent(
- motionEvent, displayId, injectorPid, injectorUid, syncMode, timeoutMillis,
+ motionEvent, injectorPid, injectorUid, syncMode, timeoutMillis,
uint32_t(policyFlags));
} else {
jniThrowRuntimeException(env, "Invalid input event type.");
@@ -1674,7 +1674,7 @@ static const JNINativeMethod gInputManagerMethods[] = {
(void*) nativeUnregisterInputChannel },
{ "nativeSetInputFilterEnabled", "(JZ)V",
(void*) nativeSetInputFilterEnabled },
- { "nativeInjectInputEvent", "(JLandroid/view/InputEvent;IIIIII)I",
+ { "nativeInjectInputEvent", "(JLandroid/view/InputEvent;IIIII)I",
(void*) nativeInjectInputEvent },
{ "nativeToggleCapsLock", "(JI)V",
(void*) nativeToggleCapsLock },
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
index 1c9782fa5565..84de6b4b5281 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
@@ -152,6 +152,11 @@ abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub {
}
@Override
+ public long forceNetworkLogs() {
+ return 0;
+ }
+
+ @Override
public long forceSecurityLogs() {
return 0;
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index b74a582db2de..ed4d4db39db3 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -90,10 +90,12 @@ import android.annotation.UserIdInt;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
+import android.app.ActivityTaskManager;
import android.app.ActivityThread;
import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.IApplicationThread;
import android.app.IServiceConnection;
import android.app.Notification;
@@ -485,6 +487,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
private final SetupContentObserver mSetupContentObserver;
private static boolean ENABLE_LOCK_GUARD = Build.IS_ENG
+ || true // STOPSHIP Remove it.
|| (SystemProperties.getInt("debug.dpm.lock_guard", 0) == 1);
interface Stats {
@@ -1864,6 +1867,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return ActivityManager.getService();
}
+ IActivityTaskManager getIActivityTaskManager() {
+ return ActivityTaskManager.getService();
+ }
+
ActivityManagerInternal getActivityManagerInternal() {
return LocalServices.getService(ActivityManagerInternal.class);
}
@@ -3285,8 +3292,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
private void updateLockTaskFeaturesLocked(int flags, int userId) {
long ident = mInjector.binderClearCallingIdentity();
try {
- mInjector.getIActivityManager()
- .updateLockTaskFeatures(userId, flags);
+ mInjector.getIActivityTaskManager().updateLockTaskFeatures(userId, flags);
} catch (RemoteException e) {
// Not gonna happen.
} finally {
@@ -5189,6 +5195,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
}
+ private void enforceDeviceOwner(ComponentName who) {
+ synchronized (getLockObject()) {
+ getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
+ }
+ }
+
private void enforceProfileOrDeviceOwner(ComponentName who) {
synchronized (getLockObject()) {
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
@@ -5363,9 +5375,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
} else {
// Caller provided - check it is the device owner.
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
}
}
@@ -5455,7 +5465,14 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (generationResult != KeyChain.KEY_GEN_SUCCESS) {
Log.e(LOG_TAG, String.format(
"KeyChain failed to generate a keypair, error %d.", generationResult));
- return false;
+ switch (generationResult) {
+ case KeyChain.KEY_GEN_STRONGBOX_UNAVAILABLE:
+ throw new ServiceSpecificException(
+ DevicePolicyManager.KEY_GEN_STRONGBOX_UNAVAILABLE,
+ String.format("KeyChain error: %d", generationResult));
+ default:
+ return false;
+ }
}
// Set a grant for the caller here so that when the client calls
@@ -6249,7 +6266,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
@Override
- public void reportFailedFingerprintAttempt(int userHandle) {
+ public void reportFailedBiometricAttempt(int userHandle) {
enforceFullCrossUsersPermission(userHandle);
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.BIND_DEVICE_ADMIN, null);
@@ -6260,7 +6277,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
@Override
- public void reportSuccessfulFingerprintAttempt(int userHandle) {
+ public void reportSuccessfulBiometricAttempt(int userHandle) {
enforceFullCrossUsersPermission(userHandle);
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.BIND_DEVICE_ADMIN, null);
@@ -6373,9 +6390,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public void setRecommendedGlobalProxy(ComponentName who, ProxyInfo proxyInfo) {
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
long token = mInjector.binderClearCallingIdentity();
try {
ConnectivityManager connectivityManager = (ConnectivityManager)
@@ -7728,11 +7743,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public void setProfileName(ComponentName who, String profileName) {
Preconditions.checkNotNull(who, "ComponentName is null");
- int userId = UserHandle.getCallingUserId();
- // Check if this is the profile owner (includes device owner).
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
+ enforceProfileOrDeviceOwner(who);
- long id = mInjector.binderClearCallingIdentity();
+ final int userId = UserHandle.getCallingUserId();
+ final long id = mInjector.binderClearCallingIdentity();
try {
mUserManager.setUserName(userId, profileName);
} finally {
@@ -8197,9 +8211,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public void setDefaultSmsApplication(ComponentName admin, String packageName) {
Preconditions.checkNotNull(admin, "ComponentName is null");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(admin);
mInjector.binderWithCleanCallingIdentity(() ->
SmsApplication.setDefaultApplication(packageName, mContext));
}
@@ -8986,10 +8998,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
public boolean removeUser(ComponentName who, UserHandle userHandle) {
Preconditions.checkNotNull(who, "ComponentName is null");
Preconditions.checkNotNull(userHandle, "UserHandle is null");
-
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
final int callingUserId = mInjector.userHandleGetCallingUserId();
final long id = mInjector.binderClearCallingIdentity();
@@ -9049,10 +9058,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
public int startUserInBackground(ComponentName who, UserHandle userHandle) {
Preconditions.checkNotNull(who, "ComponentName is null");
Preconditions.checkNotNull(userHandle, "UserHandle is null");
-
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
final int userId = userHandle.getIdentifier();
if (isManagedProfile(userId)) {
@@ -9084,10 +9090,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
public int stopUser(ComponentName who, UserHandle userHandle) {
Preconditions.checkNotNull(who, "ComponentName is null");
Preconditions.checkNotNull(userHandle, "UserHandle is null");
-
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
final int userId = userHandle.getIdentifier();
if (isManagedProfile(userId)) {
@@ -9155,9 +9158,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public List<UserHandle> getSecondaryUsers(ComponentName who) {
Preconditions.checkNotNull(who, "ComponentName is null");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
final long id = mInjector.binderClearCallingIdentity();
try {
@@ -9179,9 +9180,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public boolean isEphemeralUser(ComponentName who) {
Preconditions.checkNotNull(who, "ComponentName is null");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
- }
+ enforceProfileOrDeviceOwner(who);
final int callingUserId = mInjector.userHandleGetCallingUserId();
final long id = mInjector.binderClearCallingIdentity();
@@ -10000,7 +9999,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public boolean setTime(ComponentName who, long millis) {
Preconditions.checkNotNull(who, "ComponentName is null in setTime");
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
+ enforceDeviceOwner(who);
// Don't allow set time when auto time is on.
if (mInjector.settingsGlobalGetInt(Global.AUTO_TIME, 0) == 1) {
return false;
@@ -10012,7 +10011,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public boolean setTimeZone(ComponentName who, String timeZone) {
Preconditions.checkNotNull(who, "ComponentName is null in setTimeZone");
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
+ enforceDeviceOwner(who);
// Don't allow set timezone when auto timezone is on.
if (mInjector.settingsGlobalGetInt(Global.AUTO_TIME_ZONE, 0) == 1) {
return false;
@@ -10168,7 +10167,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (policy.mStatusBarDisabled != disabled) {
boolean isLockTaskMode = false;
try {
- isLockTaskMode = mInjector.getIActivityManager().getLockTaskModeState()
+ isLockTaskMode = mInjector.getIActivityTaskManager().getLockTaskModeState()
!= LOCK_TASK_MODE_NONE;
} catch (RemoteException e) {
Slog.e(LOG_TAG, "Failed to get LockTask mode");
@@ -10702,7 +10701,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return false;
}
}
-
return false;
}
@@ -11113,9 +11111,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public String getWifiMacAddress(ComponentName admin) {
// Make sure caller has DO.
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(admin);
final long ident = mInjector.binderClearCallingIdentity();
try {
@@ -11153,9 +11149,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
@Override
public boolean isSystemOnlyUser(ComponentName admin) {
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(admin);
final int callingUserId = mInjector.userHandleGetCallingUserId();
return UserManager.isSplitSystemUser() && callingUserId == UserHandle.USER_SYSTEM;
}
@@ -11164,9 +11158,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
public void reboot(ComponentName admin) {
Preconditions.checkNotNull(admin);
// Make sure caller has DO.
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(admin);
long ident = mInjector.binderClearCallingIdentity();
try {
// Make sure there are no ongoing calls on the device.
@@ -11985,9 +11977,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return false;
}
Preconditions.checkNotNull(admin);
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(admin);
final int callingUid = mInjector.binderGetCallingUid();
final AtomicBoolean success = new AtomicBoolean(false);
@@ -12298,6 +12288,20 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
}
+ @Override
+ public long forceNetworkLogs() {
+ enforceShell("forceNetworkLogs");
+ synchronized (getLockObject()) {
+ if (!isNetworkLoggingEnabledInternalLocked()) {
+ throw new IllegalStateException("logging is not available");
+ }
+ if (mNetworkLogger != null) {
+ return mNetworkLogger.forceBatchFinalization();
+ }
+ return 0;
+ }
+ }
+
/** Pauses security and network logging if there are unaffiliated users on the device */
private void maybePauseDeviceWideLoggingLocked() {
if (!areAllUsersAffiliatedWithDeviceLocked()) {
@@ -12600,9 +12604,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
Preconditions.checkNotNull(admin, "ComponentName is null");
Preconditions.checkNotNull(packageName, "packageName is null");
Preconditions.checkNotNull(callback, "callback is null");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
- }
+ enforceProfileOrDeviceOwner(admin);
final int userId = UserHandle.getCallingUserId();
long ident = mInjector.binderClearCallingIdentity();
@@ -12910,9 +12912,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
Preconditions.checkNotNull(who, "ComponentName is null in addOverrideApn");
Preconditions.checkNotNull(apnSetting, "ApnSetting is null in addOverrideApn");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
int operatedId = -1;
Uri resultUri;
@@ -12941,9 +12941,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
Preconditions.checkNotNull(who, "ComponentName is null in updateOverrideApn");
Preconditions.checkNotNull(apnSetting, "ApnSetting is null in updateOverrideApn");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
if (apnId < 0) {
return false;
@@ -12964,9 +12962,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return false;
}
Preconditions.checkNotNull(who, "ComponentName is null in removeOverrideApn");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
return removeOverrideApnUnchecked(apnId);
}
@@ -12992,9 +12988,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return Collections.emptyList();
}
Preconditions.checkNotNull(who, "ComponentName is null in getOverrideApns");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
return getOverrideApnsUnchecked();
}
@@ -13030,9 +13024,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return;
}
Preconditions.checkNotNull(who, "ComponentName is null in setOverrideApnEnabled");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
setOverrideApnsEnabledUnchecked(enabled);
}
@@ -13055,9 +13047,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
return false;
}
Preconditions.checkNotNull(who, "ComponentName is null in isOverrideApnEnabled");
- synchronized (getLockObject()) {
- getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
- }
+ enforceDeviceOwner(who);
Cursor enforceCursor;
final long id = mInjector.binderClearCallingIdentity();
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java
index 0967652fb215..4514492c6ed0 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java
@@ -187,4 +187,8 @@ final class NetworkLogger {
List<NetworkEvent> retrieveLogs(long batchToken) {
return mNetworkLoggingHandler.retrieveFullLogBatch(batchToken);
}
+
+ long forceBatchFinalization() {
+ return mNetworkLoggingHandler.forceBatchFinalization();
+ }
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java
index f91f959d9938..0a7070ffe4f6 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java
@@ -16,6 +16,8 @@
package com.android.server.devicepolicy;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
import android.app.AlarmManager;
import android.app.AlarmManager.OnAlarmListener;
import android.app.admin.DeviceAdminReceiver;
@@ -33,6 +35,7 @@ import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
/**
* A Handler class for managing network logging on a background thread.
@@ -60,6 +63,12 @@ final class NetworkLoggingHandler extends Handler {
/** Delay after which older batches get discarded after a retrieval. */
private static final long RETRIEVED_BATCH_DISCARD_DELAY_MS = 5 * 60 * 1000; // 5m
+ /** Throttle batch finalization to 10 seconds.*/
+ private static final long FORCE_FETCH_THROTTLE_NS = TimeUnit.SECONDS.toNanos(10);
+ /** Timestamp of the last call to finalise a batch. Used for throttling forced finalization.*/
+ @GuardedBy("this")
+ private long mLastFinalizationNanos = -1;
+
/** Do not call into mDpm with locks held */
private final DevicePolicyManagerService mDpm;
private final AlarmManager mAlarmManager;
@@ -155,6 +164,26 @@ final class NetworkLoggingHandler extends Handler {
+ "ms from now.");
}
+ /**
+ * Forces batch finalisation. Throttled to 10 seconds per batch finalisation.
+ * @return the number of milliseconds to wait until batch finalisation can be forced.
+ */
+ long forceBatchFinalization() {
+ Bundle notificationExtras;
+ synchronized (this) {
+ final long toWaitNanos =
+ mLastFinalizationNanos + FORCE_FETCH_THROTTLE_NS - System.nanoTime();
+ if (toWaitNanos > 0) {
+ return NANOSECONDS.toMillis(toWaitNanos) + 1; // Round up.
+ }
+ notificationExtras = finalizeBatchAndBuildDeviceOwnerMessageLocked();
+ }
+ if (notificationExtras != null) {
+ notifyDeviceOwner(notificationExtras);
+ }
+ return 0;
+ }
+
synchronized void pause() {
Slog.d(TAG, "Paused network logging");
mPaused = true;
@@ -192,6 +221,7 @@ final class NetworkLoggingHandler extends Handler {
@GuardedBy("this")
/** @returns extras if a message should be sent to the device owner */
private Bundle finalizeBatchAndBuildDeviceOwnerMessageLocked() {
+ mLastFinalizationNanos = System.nanoTime();
Bundle notificationExtras = null;
if (mNetworkEvents.size() > 0) {
// Assign ids to the events.
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 93d50b7add21..e0a0f07b607e 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -65,6 +65,7 @@ import com.android.internal.util.EmergencyAffordanceManager;
import com.android.internal.widget.ILockSettings;
import com.android.server.accessibility.AccessibilityManagerService;
import com.android.server.am.ActivityManagerService;
+import com.android.server.am.ActivityTaskManagerService;
import com.android.server.audio.AudioService;
import com.android.server.broadcastradio.BroadcastRadioService;
import com.android.server.camera.CameraServiceProxy;
@@ -76,7 +77,8 @@ import com.android.server.display.ColorDisplayService;
import com.android.server.display.DisplayManagerService;
import com.android.server.dreams.DreamManagerService;
import com.android.server.emergency.EmergencyAffordanceService;
-import com.android.server.fingerprint.FingerprintService;
+import com.android.server.biometrics.face.FaceService;
+import com.android.server.biometrics.fingerprint.FingerprintService;
import com.android.server.hdmi.HdmiControlService;
import com.android.server.input.InputManagerService;
import com.android.server.job.JobSchedulerService;
@@ -205,10 +207,10 @@ public final class SystemServer {
"com.android.server.search.SearchManagerService$Lifecycle";
private static final String THERMAL_OBSERVER_CLASS =
"com.google.android.clockwork.ThermalObserver";
- private static final String WEAR_CONFIG_SERVICE_CLASS =
- "com.google.android.clockwork.WearConfigManagerService";
private static final String WEAR_CONNECTIVITY_SERVICE_CLASS =
"com.android.clockwork.connectivity.WearConnectivityService";
+ private static final String WEAR_POWER_SERVICE_CLASS =
+ "com.android.clockwork.power.WearPowerService";
private static final String WEAR_SIDEKICK_SERVICE_CLASS =
"com.google.android.clockwork.sidekick.SidekickService";
private static final String WEAR_DISPLAY_SERVICE_CLASS =
@@ -230,11 +232,15 @@ public final class SystemServer {
private static final String TIME_ZONE_RULES_MANAGER_SERVICE_CLASS =
"com.android.server.timezone.RulesManagerService$Lifecycle";
private static final String IOT_SERVICE_CLASS =
- "com.google.android.things.services.IoTSystemService";
+ "com.android.things.server.IoTSystemService";
private static final String SLICE_MANAGER_SERVICE_CLASS =
"com.android.server.slice.SliceManagerService$Lifecycle";
private static final String CAR_SERVICE_HELPER_SERVICE_CLASS =
"com.android.internal.car.CarServiceHelperService";
+ private static final String TIME_DETECTOR_SERVICE_CLASS =
+ "com.android.server.timedetector.TimeDetectorService$Lifecycle";
+ private static final String TIME_ZONE_DETECTOR_SERVICE_CLASS =
+ "com.android.server.timezonedetector.TimeZoneDetectorService$Lifecycle";
private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
@@ -562,8 +568,11 @@ public final class SystemServer {
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
- mActivityManagerService = mSystemServiceManager.startService(
- ActivityManagerService.Lifecycle.class).getService();
+ // TODO: Might need to move after migration to WM.
+ ActivityTaskManagerService atm = mSystemServiceManager.startService(
+ ActivityTaskManagerService.Lifecycle.class).getService();
+ mActivityManagerService = ActivityManagerService.Lifecycle.startService(
+ mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
@@ -726,7 +735,7 @@ public final class SystemServer {
// Tracks cpu time spent in binder calls
traceBeginAndSlog("StartBinderCallsStatsService");
- BinderCallsStatsService.start();
+ mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class);
traceEnd();
}
@@ -747,7 +756,6 @@ public final class SystemServer {
WindowManagerService wm = null;
SerialService serial = null;
NetworkTimeUpdateService networkTimeUpdater = null;
- CommonTimeManagementService commonTimeMgmtService = null;
InputManagerService inputManager = null;
TelephonyRegistry telephonyRegistry = null;
ConsumerIrService consumerIr = null;
@@ -1280,6 +1288,25 @@ public final class SystemServer {
}
traceEnd();
+ final boolean useNewTimeServices = true;
+ if (useNewTimeServices) {
+ traceBeginAndSlog("StartTimeDetectorService");
+ try {
+ mSystemServiceManager.startService(TIME_DETECTOR_SERVICE_CLASS);
+ } catch (Throwable e) {
+ reportWtf("starting StartTimeDetectorService service", e);
+ }
+ traceEnd();
+
+ traceBeginAndSlog("StartTimeZoneDetectorService");
+ try {
+ mSystemServiceManager.startService(TIME_ZONE_DETECTOR_SERVICE_CLASS);
+ } catch (Throwable e) {
+ reportWtf("starting StartTimeZoneDetectorService service", e);
+ }
+ traceEnd();
+ }
+
if (!isWatch) {
traceBeginAndSlog("StartSearchManagerService");
try {
@@ -1395,7 +1422,7 @@ public final class SystemServer {
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS)
|| context.getResources().getBoolean(R.bool.config_enableAppWidgetService)) {
- traceBeginAndSlog("StartAppWidgerService");
+ traceBeginAndSlog("StartAppWidgetService");
mSystemServiceManager.startService(APPWIDGET_SERVICE_CLASS);
traceEnd();
}
@@ -1445,7 +1472,12 @@ public final class SystemServer {
if (!isWatch) {
traceBeginAndSlog("StartNetworkTimeUpdateService");
try {
- networkTimeUpdater = new NetworkTimeUpdateService(context);
+ if (useNewTimeServices) {
+ networkTimeUpdater = new NewNetworkTimeUpdateService(context);
+ } else {
+ networkTimeUpdater = new OldNetworkTimeUpdateService(context);
+ }
+ Slog.d(TAG, "Using networkTimeUpdater class=" + networkTimeUpdater.getClass());
ServiceManager.addService("network_time_update_service", networkTimeUpdater);
} catch (Throwable e) {
reportWtf("starting NetworkTimeUpdate service", e);
@@ -1453,15 +1485,6 @@ public final class SystemServer {
traceEnd();
}
- traceBeginAndSlog("StartCommonTimeManagementService");
- try {
- commonTimeMgmtService = new CommonTimeManagementService(context);
- ServiceManager.addService("commontime_management", commonTimeMgmtService);
- } catch (Throwable e) {
- reportWtf("starting CommonTimeManagementService service", e);
- }
- traceEnd();
-
traceBeginAndSlog("CertBlacklister");
try {
CertBlacklister blacklister = new CertBlacklister(context);
@@ -1551,6 +1574,12 @@ public final class SystemServer {
}
traceEnd();
+ if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FACE)) {
+ traceBeginAndSlog("StartFaceSensor");
+ mSystemServiceManager.startService(FaceService.class);
+ traceEnd();
+ }
+
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
traceBeginAndSlog("StartFingerprintSensor");
mSystemServiceManager.startService(FingerprintService.class);
@@ -1594,16 +1623,20 @@ public final class SystemServer {
}
if (isWatch) {
- traceBeginAndSlog("StartWearConfigService");
- mSystemServiceManager.startService(WEAR_CONFIG_SERVICE_CLASS);
+ // Must be started before services that depend it, e.g. WearConnectivityService
+ traceBeginAndSlog("StartWearPowerService");
+ mSystemServiceManager.startService(WEAR_POWER_SERVICE_CLASS);
traceEnd();
traceBeginAndSlog("StartWearConnectivityService");
mSystemServiceManager.startService(WEAR_CONNECTIVITY_SERVICE_CLASS);
traceEnd();
- traceBeginAndSlog("StartWearTimeService");
+ traceBeginAndSlog("StartWearDisplayService");
mSystemServiceManager.startService(WEAR_DISPLAY_SERVICE_CLASS);
+ traceEnd();
+
+ traceBeginAndSlog("StartWearTimeService");
mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);
traceEnd();
@@ -1795,7 +1828,6 @@ public final class SystemServer {
final LocationManagerService locationF = location;
final CountryDetectorService countryDetectorF = countryDetector;
final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater;
- final CommonTimeManagementService commonTimeMgmtServiceF = commonTimeMgmtService;
final InputManagerService inputManagerF = inputManager;
final TelephonyRegistry telephonyRegistryF = telephonyRegistry;
final MediaRouterService mediaRouterF = mediaRouter;
@@ -1934,15 +1966,6 @@ public final class SystemServer {
reportWtf("Notifying NetworkTimeService running", e);
}
traceEnd();
- traceBeginAndSlog("MakeCommonTimeManagementServiceReady");
- try {
- if (commonTimeMgmtServiceF != null) {
- commonTimeMgmtServiceF.systemRunning();
- }
- } catch (Throwable e) {
- reportWtf("Notifying CommonTimeManagementService running", e);
- }
- traceEnd();
traceBeginAndSlog("MakeInputManagerServiceReady");
try {
// TODO(BT) Pass parameter to input manager
diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java
index 6dd15b71f6a7..ff10cdec8161 100644
--- a/services/net/java/android/net/ip/IpClient.java
+++ b/services/net/java/android/net/ip/IpClient.java
@@ -232,10 +232,10 @@ public class IpClient extends StateMachine {
// TODO: Find an lighter weight approach.
private class LoggingCallbackWrapper extends Callback {
private static final String PREFIX = "INVOKE ";
- private Callback mCallback;
+ private final Callback mCallback;
public LoggingCallbackWrapper(Callback callback) {
- mCallback = callback;
+ mCallback = (callback != null) ? callback : new Callback();
}
private void log(String msg) {
@@ -610,6 +610,13 @@ public class IpClient extends StateMachine {
private static final int EVENT_DHCPACTION_TIMEOUT = 11;
private static final int EVENT_READ_PACKET_FILTER_COMPLETE = 12;
+ // Internal commands to use instead of trying to call transitionTo() inside
+ // a given State's enter() method. Calling transitionTo() from enter/exit
+ // encounters a Log.wtf() that can cause trouble on eng builds.
+ private static final int CMD_JUMP_STARTED_TO_RUNNING = 100;
+ private static final int CMD_JUMP_RUNNING_TO_STOPPING = 101;
+ private static final int CMD_JUMP_STOPPING_TO_STOPPED = 102;
+
private static final int MAX_LOG_RECORDS = 500;
private static final int MAX_PACKET_RECORDS = 100;
@@ -1433,6 +1440,9 @@ public class IpClient extends StateMachine {
resetLinkProperties();
if (mStartTimeMillis > 0) {
+ // Completed a life-cycle; send a final empty LinkProperties
+ // (cleared in resetLinkProperties() above) and record an event.
+ mCallback.onLinkPropertiesChange(new LinkProperties(mLinkProperties));
recordMetric(IpManagerEvent.COMPLETE_LIFECYCLE);
mStartTimeMillis = 0;
}
@@ -1491,13 +1501,17 @@ public class IpClient extends StateMachine {
public void enter() {
if (mDhcpClient == null) {
// There's no DHCPv4 for which to wait; proceed to stopped.
- transitionTo(mStoppedState);
+ deferMessage(obtainMessage(CMD_JUMP_STOPPING_TO_STOPPED));
}
}
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
+ case CMD_JUMP_STOPPING_TO_STOPPED:
+ transitionTo(mStoppedState);
+ break;
+
case CMD_STOP:
break;
@@ -1531,7 +1545,7 @@ public class IpClient extends StateMachine {
}
if (readyToProceed()) {
- transitionTo(mRunningState);
+ deferMessage(obtainMessage(CMD_JUMP_STARTED_TO_RUNNING));
} else {
// Clear all IPv4 and IPv6 before proceeding to RunningState.
// Clean up any leftover state from an abnormal exit from
@@ -1548,6 +1562,10 @@ public class IpClient extends StateMachine {
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
+ case CMD_JUMP_STARTED_TO_RUNNING:
+ transitionTo(mRunningState);
+ break;
+
case CMD_STOP:
transitionTo(mStoppingState);
break;
@@ -1576,7 +1594,7 @@ public class IpClient extends StateMachine {
return HANDLED;
}
- boolean readyToProceed() {
+ private boolean readyToProceed() {
return (!mLinkProperties.hasIPv4Address() &&
!mLinkProperties.hasGlobalIPv6Address());
}
@@ -1608,13 +1626,13 @@ public class IpClient extends StateMachine {
if (mConfiguration.mEnableIPv6 && !startIPv6()) {
doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV6);
- transitionTo(mStoppingState);
+ enqueueJumpToStoppingState();
return;
}
if (mConfiguration.mEnableIPv4 && !startIPv4()) {
doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV4);
- transitionTo(mStoppingState);
+ enqueueJumpToStoppingState();
return;
}
@@ -1622,7 +1640,7 @@ public class IpClient extends StateMachine {
if ((config != null) && !applyInitialConfig(config)) {
// TODO introduce a new IpManagerEvent constant to distinguish this error case.
doImmediateProvisioningFailure(IpManagerEvent.ERROR_INVALID_PROVISIONING);
- transitionTo(mStoppingState);
+ enqueueJumpToStoppingState();
return;
}
@@ -1636,7 +1654,7 @@ public class IpClient extends StateMachine {
if (mConfiguration.mUsingIpReachabilityMonitor && !startIpReachabilityMonitor()) {
doImmediateProvisioningFailure(
IpManagerEvent.ERROR_STARTING_IPREACHABILITYMONITOR);
- transitionTo(mStoppingState);
+ enqueueJumpToStoppingState();
return;
}
}
@@ -1673,6 +1691,10 @@ public class IpClient extends StateMachine {
resetLinkProperties();
}
+ private void enqueueJumpToStoppingState() {
+ deferMessage(obtainMessage(CMD_JUMP_RUNNING_TO_STOPPING));
+ }
+
private ConnectivityPacketTracker createPacketTracker() {
try {
return new ConnectivityPacketTracker(
@@ -1703,6 +1725,7 @@ public class IpClient extends StateMachine {
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
+ case CMD_JUMP_RUNNING_TO_STOPPING:
case CMD_STOP:
transitionTo(mStoppingState);
break;
diff --git a/services/net/java/android/net/netlink/NetlinkSocket.java b/services/net/java/android/net/netlink/NetlinkSocket.java
index 5af3c299bfc1..cfcba3a84f51 100644
--- a/services/net/java/android/net/netlink/NetlinkSocket.java
+++ b/services/net/java/android/net/netlink/NetlinkSocket.java
@@ -59,10 +59,9 @@ public class NetlinkSocket {
final String errPrefix = "Error in NetlinkSocket.sendOneShotKernelMessage";
final long IO_TIMEOUT = 300L;
- FileDescriptor fd;
+ final FileDescriptor fd = forProto(nlProto);
try {
- fd = forProto(nlProto);
connectToKernel(fd);
sendMessage(fd, msg, 0, msg.length, IO_TIMEOUT);
final ByteBuffer bytes = recvMessage(fd, DEFAULT_RECV_BUFSIZE, IO_TIMEOUT);
@@ -96,9 +95,9 @@ public class NetlinkSocket {
} catch (SocketException e) {
Log.e(TAG, errPrefix, e);
throw new ErrnoException(errPrefix, EIO, e);
+ } finally {
+ IoUtils.closeQuietly(fd);
}
-
- IoUtils.closeQuietly(fd);
}
public static FileDescriptor forProto(int nlProto) throws ErrnoException {
diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java
index 4fbc14c0097f..e8266a574bf5 100644
--- a/services/print/java/com/android/server/print/UserState.java
+++ b/services/print/java/com/android/server/print/UserState.java
@@ -243,7 +243,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks,
intent.setData(Uri.fromParts("printjob", printJob.getId().flattenToString(), null));
intent.putExtra(PrintManager.EXTRA_PRINT_DOCUMENT_ADAPTER, adapter.asBinder());
intent.putExtra(PrintManager.EXTRA_PRINT_JOB, printJob);
- intent.putExtra(DocumentsContract.EXTRA_PACKAGE_NAME, packageName);
+ intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName);
IntentSender intentSender = PendingIntent.getActivityAsUser(
mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT
diff --git a/services/robotests/src/android/app/backup/BackupUtilsTest.java b/services/robotests/src/android/app/backup/BackupUtilsTest.java
new file mode 100644
index 000000000000..04a2a14b50e9
--- /dev/null
+++ b/services/robotests/src/android/app/backup/BackupUtilsTest.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.app.backup;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags;
+import android.content.Context;
+import android.platform.test.annotations.Presubmit;
+
+import com.android.server.testing.FrameworkRobolectricTestRunner;
+import com.android.server.testing.SystemLoaderPackages;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.internal.DoNotInstrument;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@RunWith(FrameworkRobolectricTestRunner.class)
+@Config(manifest = Config.NONE, sdk = 26)
+@SystemLoaderPackages({"android.app.backup"})
+@Presubmit
+@DoNotInstrument
+public class BackupUtilsTest {
+ private Context mContext;
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = RuntimeEnvironment.application;
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenFileAndPathListHasIt() throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(file("a/b.txt"), paths(file("a/b.txt")));
+
+ assertThat(isSpecified).isTrue();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenFileAndPathListHasItsDirectory()
+ throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(file("a/b.txt"), paths(directory("a")));
+
+ assertThat(isSpecified).isTrue();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenFileAndPathListHasOtherFile() throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(file("a/b.txt"), paths(file("a/c.txt")));
+
+ assertThat(isSpecified).isFalse();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenFileAndPathListEmpty() throws Exception {
+ boolean isSpecified = BackupUtils.isFileSpecifiedInPathList(file("a/b.txt"), paths());
+
+ assertThat(isSpecified).isFalse();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenDirectoryAndPathListHasIt() throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(directory("a"), paths(directory("a")));
+
+ assertThat(isSpecified).isTrue();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenDirectoryAndPathListEmpty() throws Exception {
+ boolean isSpecified = BackupUtils.isFileSpecifiedInPathList(directory("a"), paths());
+
+ assertThat(isSpecified).isFalse();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenDirectoryAndPathListHasParent() throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(directory("a/b"), paths(directory("a")));
+
+ assertThat(isSpecified).isFalse();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenFileAndPathListDoesntContainDirectory()
+ throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(file("a/b.txt"), paths(directory("c")));
+
+ assertThat(isSpecified).isFalse();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenFileAndPathListHasDirectoryWhoseNameIsPrefix()
+ throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(file("a/b.txt"), paths(directory("a/b")));
+
+ assertThat(isSpecified).isFalse();
+ }
+
+ @Test
+ public void testIsFileSpecifiedInPathList_whenFileAndPathListHasDirectoryWhoseNameIsPrefix2()
+ throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(
+ file("name/subname.txt"), paths(directory("nam")));
+
+ assertThat(isSpecified).isFalse();
+ }
+
+ @Test
+ public void
+ testIsFileSpecifiedInPathList_whenFileAndPathListContainsFirstNotRelatedAndSecondContainingDirectory()
+ throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(
+ file("a/b.txt"), paths(directory("b"), directory("a")));
+
+ assertThat(isSpecified).isTrue();
+ }
+
+ @Test
+ public void
+ testIsFileSpecifiedInPathList_whenDirectoryAndPathListContainsFirstNotRelatedAndSecondSameDirectory()
+ throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(
+ directory("a/b"), paths(directory("b"), directory("a/b")));
+
+ assertThat(isSpecified).isTrue();
+ }
+
+ @Test
+ public void
+ testIsFileSpecifiedInPathList_whenFileAndPathListContainsFirstNotRelatedFileAndSecondSameFile()
+ throws Exception {
+ boolean isSpecified =
+ BackupUtils.isFileSpecifiedInPathList(
+ file("a/b.txt"), paths(directory("b"), file("a/b.txt")));
+
+ assertThat(isSpecified).isTrue();
+ }
+
+ private File file(String path) throws IOException {
+ File file = new File(mContext.getDataDir(), path);
+ File parent = file.getParentFile();
+ parent.mkdirs();
+ file.createNewFile();
+ if (!file.isFile()) {
+ throw new IOException("Couldn't create file");
+ }
+ return file;
+ }
+
+ private File directory(String path) throws IOException {
+ File directory = new File(mContext.getDataDir(), path);
+ directory.mkdirs();
+ if (!directory.isDirectory()) {
+ throw new IOException("Couldn't create directory");
+ }
+ return directory;
+ }
+
+ private Collection<PathWithRequiredFlags> paths(File... files) {
+ return Stream.of(files)
+ .map(file -> new PathWithRequiredFlags(file.getPath(), 0))
+ .collect(Collectors.toList());
+ }
+}
diff --git a/services/robotests/src/android/app/backup/ForwardingBackupAgent.java b/services/robotests/src/android/app/backup/ForwardingBackupAgent.java
new file mode 100644
index 000000000000..4ff5b7c03a8f
--- /dev/null
+++ b/services/robotests/src/android/app/backup/ForwardingBackupAgent.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.app.backup;
+
+import android.content.Context;
+import android.os.ParcelFileDescriptor;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Useful for spying in {@link BackupAgent} instances since their {@link BackupAgent#onBind()} is
+ * final and always points to the original instance, instead of the spy.
+ *
+ * <p>To use, construct a spy of the desired {@link BackupAgent}, spying on the methods of interest.
+ * Then, where you need to pass the agent, use {@link ForwardingBackupAgent#forward(BackupAgent)}
+ * with the spy.
+ */
+public class ForwardingBackupAgent extends BackupAgent {
+ /** Returns a {@link BackupAgent} that forwards method calls to {@code backupAgent}. */
+ public static BackupAgent forward(BackupAgent backupAgent) {
+ return new ForwardingBackupAgent(backupAgent);
+ }
+
+ private final BackupAgent mBackupAgent;
+
+ private ForwardingBackupAgent(BackupAgent backupAgent) {
+ mBackupAgent = backupAgent;
+ }
+
+ @Override
+ public void onCreate() {
+ mBackupAgent.onCreate();
+ }
+
+ @Override
+ public void onDestroy() {
+ mBackupAgent.onDestroy();
+ }
+
+ @Override
+ public void onBackup(
+ ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState)
+ throws IOException {
+ mBackupAgent.onBackup(oldState, data, newState);
+ }
+
+ @Override
+ public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
+ throws IOException {
+ mBackupAgent.onRestore(data, appVersionCode, newState);
+ }
+
+ @Override
+ public void onRestore(BackupDataInput data, long appVersionCode, ParcelFileDescriptor newState)
+ throws IOException {
+ mBackupAgent.onRestore(data, appVersionCode, newState);
+ }
+
+ @Override
+ public void onFullBackup(FullBackupDataOutput data) throws IOException {
+ mBackupAgent.onFullBackup(data);
+ }
+
+ @Override
+ public void onQuotaExceeded(long backupDataBytes, long quotaBytes) {
+ mBackupAgent.onQuotaExceeded(backupDataBytes, quotaBytes);
+ }
+
+ @Override
+ public void onRestoreFile(
+ ParcelFileDescriptor data, long size, File destination, int type, long mode, long mtime)
+ throws IOException {
+ mBackupAgent.onRestoreFile(data, size, destination, type, mode, mtime);
+ }
+
+ @Override
+ protected void onRestoreFile(
+ ParcelFileDescriptor data,
+ long size,
+ int type,
+ String domain,
+ String path,
+ long mode,
+ long mtime)
+ throws IOException {
+ mBackupAgent.onRestoreFile(data, size, type, domain, path, mode, mtime);
+ }
+
+ @Override
+ public void onRestoreFinished() {
+ mBackupAgent.onRestoreFinished();
+ }
+
+ @Override
+ public void attach(Context context) {
+ mBackupAgent.attach(context);
+ }
+}
diff --git a/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java b/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java
index 53d734bbf723..abaed7c2b6d4 100644
--- a/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java
+++ b/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java
@@ -16,7 +16,7 @@
package com.android.server.backup;
-import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThread;
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startSilentBackupThread;
import static com.android.server.backup.testing.TransportData.backupTransport;
import static com.android.server.backup.testing.TransportData.d2dTransport;
import static com.android.server.backup.testing.TransportData.localTransport;
@@ -34,27 +34,31 @@ import static org.robolectric.Shadows.shadowOf;
import static org.testng.Assert.expectThrows;
import android.app.backup.BackupManager;
+import android.app.backup.IBackupObserver;
import android.app.backup.ISelectBackupTransportCallback;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.os.HandlerThread;
+import android.os.PowerManager;
+import android.os.PowerSaveState;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
-
-import com.android.server.testing.shadows.ShadowAppBackupUtils;
-import com.android.server.testing.shadows.ShadowBackupPolicyEnforcer;
+import com.android.server.backup.internal.BackupRequest;
+import com.android.server.backup.testing.BackupManagerServiceTestUtils;
import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.backup.transport.TransportNotRegisteredException;
import com.android.server.testing.FrameworkRobolectricTestRunner;
import com.android.server.testing.SystemLoaderPackages;
-
+import com.android.server.testing.shadows.ShadowAppBackupUtils;
+import com.android.server.testing.shadows.ShadowBackupPolicyEnforcer;
+import com.android.server.testing.shadows.ShadowBinder;
+import com.android.server.testing.shadows.ShadowKeyValueBackupJob;
+import com.android.server.testing.shadows.ShadowPerformBackupTask;
import java.io.File;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -63,8 +67,8 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowContextWrapper;
-import org.robolectric.shadows.ShadowLog;
import org.robolectric.shadows.ShadowLooper;
import org.robolectric.shadows.ShadowPackageManager;
import org.robolectric.shadows.ShadowSettings;
@@ -72,14 +76,15 @@ import org.robolectric.shadows.ShadowSystemClock;
@RunWith(FrameworkRobolectricTestRunner.class)
@Config(
- manifest = Config.NONE,
- sdk = 26,
- shadows = {ShadowAppBackupUtils.class, ShadowBackupPolicyEnforcer.class}
-)
+ manifest = Config.NONE,
+ sdk = 26,
+ shadows = {ShadowAppBackupUtils.class, ShadowBackupPolicyEnforcer.class})
@SystemLoaderPackages({"com.android.server.backup"})
@Presubmit
public class BackupManagerServiceTest {
private static final String TAG = "BMSTest";
+ private static final String PACKAGE_1 = "some.package.1";
+ private static final String PACKAGE_2 = "some.package.2";
@Mock private TransportManager mTransportManager;
private HandlerThread mBackupThread;
@@ -90,6 +95,7 @@ public class BackupManagerServiceTest {
private Context mContext;
private TransportData mTransport;
private String mTransportName;
+ private ShadowPackageManager mShadowPackageManager;
@Before
public void setUp() throws Exception {
@@ -98,16 +104,22 @@ public class BackupManagerServiceTest {
mTransport = backupTransport();
mTransportName = mTransport.transportName;
- mBackupThread = startBackupThread(this::uncaughtException);
+ // Unrelated exceptions are thrown in the backup thread. Until we mock everything properly
+ // we should not fail tests because of this. This is not flakiness, the exceptions thrown
+ // don't interfere with the tests.
+ mBackupThread = startSilentBackupThread(TAG);
mShadowBackupLooper = shadowOf(mBackupThread.getLooper());
ContextWrapper context = RuntimeEnvironment.application;
+ mShadowPackageManager = shadowOf(context.getPackageManager());
mContext = context;
mShadowContext = shadowOf(context);
File cacheDir = mContext.getCacheDir();
- mBaseStateDir = new File(cacheDir, "base_state_dir");
- mDataDir = new File(cacheDir, "data_dir");
+ // Corresponds to /data/backup
+ mBaseStateDir = new File(cacheDir, "base_state");
+ // Corresponds to /cache/backup_stage
+ mDataDir = new File(cacheDir, "data");
ShadowBackupPolicyEnforcer.setMandatoryBackupTransport(null);
}
@@ -119,13 +131,6 @@ public class BackupManagerServiceTest {
ShadowBackupPolicyEnforcer.setMandatoryBackupTransport(null);
}
- private void uncaughtException(Thread thread, Throwable e) {
- // Unrelated exceptions are thrown in the backup thread. Until we mock everything properly
- // we should not fail tests because of this. This is not flakiness, the exceptions thrown
- // don't interfere with the tests.
- ShadowLog.e(TAG, "Uncaught exception in test thread " + thread.getName(), e);
- }
-
/* Tests for destination string */
@Test
@@ -167,57 +172,54 @@ public class BackupManagerServiceTest {
/* Tests for app eligibility */
@Test
- public void testIsAppEligibleForBackup_whenAppEligible() throws Exception {
+ public void testIsAppEligibleForBackup_whenAppNotEligible() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
- TransportMock transportMock = setUpCurrentTransport(mTransportManager, backupTransport());
- ShadowAppBackupUtils.sAppIsRunningAndEligibleForBackupWithTransport = p -> true;
+ setUpCurrentTransport(mTransportManager, mTransport);
BackupManagerService backupManagerService = createInitializedBackupManagerService();
- boolean result = backupManagerService.isAppEligibleForBackup("app.package");
-
- assertThat(result).isTrue();
+ boolean result = backupManagerService.isAppEligibleForBackup(PACKAGE_1);
- verify(mTransportManager)
- .disposeOfTransportClient(eq(transportMock.transportClient), any());
+ assertThat(result).isFalse();
}
@Test
- public void testIsAppEligibleForBackup_whenAppNotEligible() throws Exception {
+ public void testIsAppEligibleForBackup_whenAppEligible() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
- setUpCurrentTransport(mTransportManager, mTransport);
- ShadowAppBackupUtils.sAppIsRunningAndEligibleForBackupWithTransport = p -> false;
+ TransportMock transportMock = setUpCurrentTransport(mTransportManager, backupTransport());
+ ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
BackupManagerService backupManagerService = createInitializedBackupManagerService();
- boolean result = backupManagerService.isAppEligibleForBackup("app.package");
+ boolean result = backupManagerService.isAppEligibleForBackup(PACKAGE_1);
- assertThat(result).isFalse();
+ assertThat(result).isTrue();
+ verify(mTransportManager)
+ .disposeOfTransportClient(eq(transportMock.transportClient), any());
}
@Test
public void testIsAppEligibleForBackup_withoutPermission() throws Exception {
mShadowContext.denyPermissions(android.Manifest.permission.BACKUP);
setUpCurrentTransport(mTransportManager, mTransport);
+ ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
BackupManagerService backupManagerService = createInitializedBackupManagerService();
expectThrows(
SecurityException.class,
- () -> backupManagerService.isAppEligibleForBackup("app.package"));
+ () -> backupManagerService.isAppEligibleForBackup(PACKAGE_1));
}
@Test
public void testFilterAppsEligibleForBackup() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
TransportMock transportMock = setUpCurrentTransport(mTransportManager, mTransport);
- Map<String, Boolean> packagesMap = new HashMap<>();
- packagesMap.put("package.a", true);
- packagesMap.put("package.b", false);
- ShadowAppBackupUtils.sAppIsRunningAndEligibleForBackupWithTransport = packagesMap::get;
+ ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(PACKAGE_1);
BackupManagerService backupManagerService = createInitializedBackupManagerService();
- String[] packages = packagesMap.keySet().toArray(new String[packagesMap.size()]);
- String[] filtered = backupManagerService.filterAppsEligibleForBackup(packages);
+ String[] filtered =
+ backupManagerService.filterAppsEligibleForBackup(
+ new String[] {PACKAGE_1, PACKAGE_2});
- assertThat(filtered).asList().containsExactly("package.a");
+ assertThat(filtered).asList().containsExactly(PACKAGE_1);
verify(mTransportManager)
.disposeOfTransportClient(eq(transportMock.transportClient), any());
}
@@ -225,12 +227,11 @@ public class BackupManagerServiceTest {
@Test
public void testFilterAppsEligibleForBackup_whenNoneIsEligible() throws Exception {
mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
- ShadowAppBackupUtils.sAppIsRunningAndEligibleForBackupWithTransport = p -> false;
BackupManagerService backupManagerService = createInitializedBackupManagerService();
String[] filtered =
backupManagerService.filterAppsEligibleForBackup(
- new String[] {"package.a", "package.b"});
+ new String[] {PACKAGE_1, PACKAGE_2});
assertThat(filtered).isEmpty();
}
@@ -245,7 +246,7 @@ public class BackupManagerServiceTest {
SecurityException.class,
() ->
backupManagerService.filterAppsEligibleForBackup(
- new String[] {"package.a", "package.b"}));
+ new String[] {PACKAGE_1, PACKAGE_2}));
}
/* Tests for select transport */
@@ -402,6 +403,51 @@ public class BackupManagerServiceTest {
mContext.getContentResolver(), Settings.Secure.BACKUP_TRANSPORT);
}
+ /* Tests for transport attributes */
+
+ @Test
+ public void testGetCurrentTransportComponent() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ when(mTransportManager.getCurrentTransportComponent())
+ .thenReturn(mTransport.getTransportComponent());
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+
+ ComponentName transportComponent = backupManagerService.getCurrentTransportComponent();
+
+ assertThat(transportComponent).isEqualTo(mTransport.getTransportComponent());
+ }
+
+ @Test
+ public void testGetCurrentTransportComponent_whenNoTransportSelected() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ when(mTransportManager.getCurrentTransportComponent()).thenReturn(null);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+
+ ComponentName transportComponent = backupManagerService.getCurrentTransportComponent();
+
+ assertThat(transportComponent).isNull();
+ }
+
+ @Test
+ public void testGetCurrentTransportComponent_whenTransportNotRegistered() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ when(mTransportManager.getCurrentTransportComponent())
+ .thenThrow(TransportNotRegisteredException.class);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+
+ ComponentName transportComponent = backupManagerService.getCurrentTransportComponent();
+
+ assertThat(transportComponent).isNull();
+ }
+
+ @Test
+ public void testGetCurrentTransportComponent_withoutPermission() throws Exception {
+ mShadowContext.denyPermissions(android.Manifest.permission.BACKUP);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+
+ expectThrows(SecurityException.class, backupManagerService::getCurrentTransportComponent);
+ }
+
/* Tests for updating transport attributes */
private static final int PACKAGE_UID = 10;
@@ -608,6 +654,181 @@ public class BackupManagerServiceTest {
"dataManagementLabel"));
}
+ /* Tests for request backup */
+
+ @Mock private IBackupObserver mObserver;
+
+ private void setUpForRequestBackup(String... packages) throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ for (String packageName : packages) {
+ mShadowPackageManager.addPackage(packageName);
+ ShadowAppBackupUtils.setAppRunningAndEligibleForBackupWithTransport(packageName);
+ }
+ setUpCurrentTransport(mTransportManager, mTransport);
+ }
+
+ private void tearDownForRequestBackup() {
+ ShadowPerformBackupTask.reset();
+ }
+
+ @Test
+ public void testRequestBackup_whenPermissionDenied() throws Exception {
+ mShadowContext.denyPermissions(android.Manifest.permission.BACKUP);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+
+ expectThrows(
+ SecurityException.class,
+ () -> backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0));
+ }
+
+ @Test
+ public void testRequestBackup_whenPackagesNull() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+
+ expectThrows(
+ IllegalArgumentException.class,
+ () -> backupManagerService.requestBackup(null, mObserver, 0));
+ verify(mObserver).backupFinished(BackupManager.ERROR_TRANSPORT_ABORTED);
+ }
+
+ @Test
+ public void testRequestBackup_whenPackagesEmpty() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+
+ expectThrows(
+ IllegalArgumentException.class,
+ () -> backupManagerService.requestBackup(new String[0], mObserver, 0));
+ verify(mObserver).backupFinished(BackupManager.ERROR_TRANSPORT_ABORTED);
+ }
+
+ @Test
+ public void testRequestBackup_whenBackupDisabled() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+ backupManagerService.setEnabled(false);
+
+ int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
+
+ assertThat(result).isEqualTo(BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ verify(mObserver).backupFinished(BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ }
+
+ @Test
+ public void testRequestBackup_whenNotProvisioned() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+ backupManagerService.setProvisioned(false);
+
+ int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
+
+ assertThat(result).isEqualTo(BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ verify(mObserver).backupFinished(BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ }
+
+ @Test
+ public void testRequestBackup_whenTransportNotRegistered() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ setUpCurrentTransport(mTransportManager, mTransport.unregistered());
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+ backupManagerService.setEnabled(true);
+ backupManagerService.setProvisioned(true);
+
+ int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
+
+ assertThat(result).isEqualTo(BackupManager.ERROR_TRANSPORT_ABORTED);
+ verify(mObserver).backupFinished(BackupManager.ERROR_TRANSPORT_ABORTED);
+ }
+
+ @Test
+ public void testRequestBackup_whenAppNotEligibleForBackup() throws Exception {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ mShadowPackageManager.addPackage(PACKAGE_1);
+ setUpCurrentTransport(mTransportManager, mTransport);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+ backupManagerService.setEnabled(true);
+ backupManagerService.setProvisioned(true);
+ // Haven't set PACKAGE_1 as eligible
+
+ int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
+
+ assertThat(result).isEqualTo(BackupManager.SUCCESS);
+ verify(mObserver).onResult(PACKAGE_1, BackupManager.ERROR_BACKUP_NOT_ALLOWED);
+ // TODO: We probably don't need to kick-off PerformBackupTask when list is empty
+ tearDownForRequestBackup();
+ }
+
+ @Test
+ @Config(shadows = ShadowPerformBackupTask.class)
+ public void testRequestBackup_whenPackageIsKeyValue() throws Exception {
+ setUpForRequestBackup(PACKAGE_1);
+ BackupManagerService backupManagerService = createBackupManagerServiceForRequestBackup();
+
+ int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
+
+ mShadowBackupLooper.runToEndOfTasks();
+ assertThat(result).isEqualTo(BackupManager.SUCCESS);
+ ShadowPerformBackupTask shadowTask = ShadowPerformBackupTask.getLastCreated();
+ assertThat(shadowTask.getQueue()).containsExactly(new BackupRequest(PACKAGE_1));
+ assertThat(shadowTask.getPendingFullBackups()).isEmpty();
+ // TODO: Assert more about PerformBackupTask
+ tearDownForRequestBackup();
+ }
+
+ @Test
+ @Config(shadows = ShadowPerformBackupTask.class)
+ public void testRequestBackup_whenPackageIsFullBackup() throws Exception {
+ setUpForRequestBackup(PACKAGE_1);
+ ShadowAppBackupUtils.setAppGetsFullBackup(PACKAGE_1);
+ BackupManagerService backupManagerService = createBackupManagerServiceForRequestBackup();
+
+ int result = backupManagerService.requestBackup(new String[] {PACKAGE_1}, mObserver, 0);
+
+ mShadowBackupLooper.runToEndOfTasks();
+ assertThat(result).isEqualTo(BackupManager.SUCCESS);
+ ShadowPerformBackupTask shadowTask = ShadowPerformBackupTask.getLastCreated();
+ assertThat(shadowTask.getQueue()).isEmpty();
+ assertThat(shadowTask.getPendingFullBackups()).containsExactly(PACKAGE_1);
+ // TODO: Assert more about PerformBackupTask
+ tearDownForRequestBackup();
+ }
+
+ @Test
+ @Config(shadows = {ShadowBinder.class, ShadowKeyValueBackupJob.class})
+ public void testBackupNow_clearsCallingIdentityForJobScheduler() {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+ setUpPowerManager(backupManagerService);
+ ShadowBinder.setCallingUid(1);
+
+ backupManagerService.backupNow();
+
+ assertThat(ShadowKeyValueBackupJob.getCallingUid()).isEqualTo(ShadowBinder.LOCAL_UID);
+ assertThat(ShadowBinder.getCallingUid()).isEqualTo(1);
+ }
+
+ @Test
+ @Config(shadows = {ShadowBinder.class, ShadowKeyValueBackupJobException.class})
+ public void testBackupNow_whenExceptionThrown_restoresCallingIdentity() {
+ mShadowContext.grantPermissions(android.Manifest.permission.BACKUP);
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+ setUpPowerManager(backupManagerService);
+ ShadowBinder.setCallingUid(1);
+
+ expectThrows(IllegalArgumentException.class, backupManagerService::backupNow);
+ assertThat(ShadowKeyValueBackupJobException.getCallingUid())
+ .isEqualTo(ShadowBinder.LOCAL_UID);
+ assertThat(ShadowBinder.getCallingUid()).isEqualTo(1);
+ }
+
+ private BackupManagerService createBackupManagerServiceForRequestBackup() {
+ BackupManagerService backupManagerService = createInitializedBackupManagerService();
+ backupManagerService.setEnabled(true);
+ backupManagerService.setProvisioned(true);
+ return backupManagerService;
+ }
+
/* Miscellaneous tests */
@Test
@@ -641,21 +862,26 @@ public class BackupManagerServiceTest {
}
private BackupManagerService createInitializedBackupManagerService() {
- BackupManagerService backupManagerService =
- new BackupManagerService(
- mContext,
- new Trampoline(mContext),
- mBackupThread,
- mBaseStateDir,
- mDataDir,
- mTransportManager);
- mShadowBackupLooper.runToEndOfTasks();
- // Handler instances have their own clock, so advancing looper (with runToEndOfTasks())
- // above does NOT advance the handlers' clock, hence whenever a handler post messages with
- // specific time to the looper the time of those messages will be before the looper's time.
- // To fix this we advance SystemClock as well since that is from where the handlers read
- // time.
- ShadowSystemClock.setCurrentTimeMillis(mShadowBackupLooper.getScheduler().getCurrentTime());
- return backupManagerService;
+ return BackupManagerServiceTestUtils.createInitializedBackupManagerService(
+ mContext, mBackupThread, mBaseStateDir, mDataDir, mTransportManager);
+ }
+
+ private void setUpPowerManager(BackupManagerService backupManagerService) {
+ PowerManager powerManagerMock = mock(PowerManager.class);
+ when(powerManagerMock.getPowerSaveState(anyInt()))
+ .thenReturn(new PowerSaveState.Builder().setBatterySaverEnabled(true).build());
+ backupManagerService.setPowerManager(powerManagerMock);
+ }
+
+ /**
+ * We can't mock the void method {@link #schedule(Context, long, BackupManagerConstants)} so we
+ * extend {@link ShadowKeyValueBackupJob} and throw an exception at the end of the method.
+ */
+ @Implements(KeyValueBackupJob.class)
+ public static class ShadowKeyValueBackupJobException extends ShadowKeyValueBackupJob {
+ public static void schedule(Context ctx, long delay, BackupManagerConstants constants) {
+ ShadowKeyValueBackupJob.schedule(ctx, delay, constants);
+ throw new IllegalArgumentException();
+ }
}
}
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
index b1dad5a87957..2d6dd4d80406 100644
--- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
@@ -16,21 +16,30 @@
package com.android.server.backup;
+import static android.app.backup.ForwardingBackupAgent.forward;
+
+import static com.android.server.backup.BackupManagerService.PACKAGE_MANAGER_SENTINEL;
import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createBackupWakeLock;
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createInitializedBackupManagerService;
import static com.android.server.backup.testing.BackupManagerServiceTestUtils.setUpBackupManagerServiceBasics;
-import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThreadAndGetLooper;
-
+import static com.android.server.backup.testing.TestUtils.uncheck;
import static com.android.server.backup.testing.TransportData.backupTransport;
-
import static com.google.common.truth.Truth.assertThat;
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+import static java.util.Collections.emptyList;
+import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.Collectors.toList;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.intThat;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -38,10 +47,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
-import static java.util.Collections.emptyList;
-import static java.util.stream.Collectors.toCollection;
-import static java.util.stream.Collectors.toList;
-
import android.app.Application;
import android.app.IBackupAgent;
import android.app.backup.BackupAgent;
@@ -52,18 +57,18 @@ import android.app.backup.BackupTransport;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
+import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.os.DeadObjectException;
import android.os.Handler;
-import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.PowerManager;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.util.Pair;
-
import com.android.internal.backup.IBackupTransport;
import com.android.server.backup.internal.BackupHandler;
import com.android.server.backup.internal.BackupRequest;
@@ -79,8 +84,23 @@ import com.android.server.testing.SystemLoaderPackages;
import com.android.server.testing.shadows.ShadowBackupDataInput;
import com.android.server.testing.shadows.ShadowBackupDataOutput;
+import com.google.common.truth.IterableSubject;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Stream;
+
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
@@ -94,18 +114,28 @@ import org.robolectric.shadows.ShadowLooper;
import org.robolectric.shadows.ShadowPackageManager;
import org.robolectric.shadows.ShadowQueuedWork;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Stream;
-
+// TODO: Don't do backup for full-backup
+// TODO: Don't do backup for stopped
+// TODO: Don't do backup for non-eligible
+// TODO: (performBackup() => SUCCESS, finishBackup() => SUCCESS) => delete stage file, renames
+// state file
+// TODO: Check agent writes state file => check file content
+// TODO: Check agent writes new state file => next agent reads it correctly
+// TODO: Check non-incremental has empty state file
+// TODO: Check queue of 2, transport rejecting package but other package proceeds
+// TODO: Check queue in general, behavior w/ multiple packages
+// TODO: Check quota is passed from transport to agent
+// TODO: Check non-incremental and transport requests PM in queue
+// TODO: Verify initialization
@RunWith(FrameworkRobolectricTestRunner.class)
@Config(
- manifest = Config.NONE,
- sdk = 26,
- shadows = {ShadowBackupDataInput.class, ShadowBackupDataOutput.class, ShadowQueuedWork.class}
-)
+ manifest = Config.NONE,
+ sdk = 26,
+ shadows = {
+ ShadowBackupDataInput.class,
+ ShadowBackupDataOutput.class,
+ ShadowQueuedWork.class
+ })
@SystemLoaderPackages({"com.android.server.backup", "android.app.backup"})
@SystemLoaderClasses({IBackupTransport.class, IBackupAgent.class, PackageInfo.class})
@Presubmit
@@ -113,19 +143,22 @@ public class PerformBackupTaskTest {
private static final String PACKAGE_1 = "com.example.package1";
private static final String PACKAGE_2 = "com.example.package2";
- @Mock private BackupManagerService mBackupManagerService;
@Mock private TransportManager mTransportManager;
@Mock private DataChangedJournal mDataChangedJournal;
@Mock private IBackupObserver mObserver;
@Mock private IBackupManagerMonitor mMonitor;
@Mock private OnTaskFinishedListener mListener;
+ private BackupManagerService mBackupManagerService;
private TransportData mTransport;
private ShadowLooper mShadowBackupLooper;
- private BackupHandler mBackupHandler;
+ private Handler mBackupHandler;
private PowerManager.WakeLock mWakeLock;
private ShadowPackageManager mShadowPackageManager;
private FakeIBackupManager mBackupManager;
private File mBaseStateDir;
+ private File mDataDir;
+ private Application mApplication;
+ private Context mContext;
@Before
public void setUp() throws Exception {
@@ -133,116 +166,281 @@ public class PerformBackupTaskTest {
mTransport = backupTransport();
- Application application = RuntimeEnvironment.application;
- File cacheDir = application.getCacheDir();
- mBaseStateDir = new File(cacheDir, "base_state_dir");
- File dataDir = new File(cacheDir, "data_dir");
- assertThat(mBaseStateDir.mkdir()).isTrue();
- assertThat(dataDir.mkdir()).isTrue();
-
- PackageManager packageManager = application.getPackageManager();
- mShadowPackageManager = shadowOf(packageManager);
-
- mWakeLock = createBackupWakeLock(application);
+ mApplication = RuntimeEnvironment.application;
+ mContext = mApplication;
- Looper backupLooper = startBackupThreadAndGetLooper();
- mShadowBackupLooper = shadowOf(backupLooper);
+ File cacheDir = mApplication.getCacheDir();
+ // Corresponds to /data/backup
+ mBaseStateDir = new File(cacheDir, "base_state");
+ // Corresponds to /cache/backup_stage
+ mDataDir = new File(cacheDir, "data");
+ // We create here simulating init.rc
+ mDataDir.mkdirs();
+ assertThat(mDataDir.isDirectory()).isTrue();
- Handler mainHandler = new Handler(Looper.getMainLooper());
- BackupAgentTimeoutParameters agentTimeoutParameters =
- new BackupAgentTimeoutParameters(mainHandler, application.getContentResolver());
- agentTimeoutParameters.start();
+ PackageManager packageManager = mApplication.getPackageManager();
+ mShadowPackageManager = shadowOf(packageManager);
- // We need to mock BMS timeout parameters before initializing the BackupHandler since
- // the constructor of BackupHandler relies on the timeout parameters.
- when(mBackupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
- mBackupHandler = new BackupHandler(mBackupManagerService, backupLooper);
+ mWakeLock = createBackupWakeLock(mApplication);
mBackupManager = spy(FakeIBackupManager.class);
+ mBackupManagerService =
+ spy(
+ createInitializedBackupManagerService(
+ mContext, mBaseStateDir, mDataDir, mTransportManager));
setUpBackupManagerServiceBasics(
mBackupManagerService,
- application,
+ mApplication,
mTransportManager,
packageManager,
- mBackupHandler,
+ mBackupManagerService.getBackupHandler(),
mWakeLock,
- agentTimeoutParameters);
+ mBackupManagerService.getAgentTimeoutParameters());
when(mBackupManagerService.getBaseStateDir()).thenReturn(mBaseStateDir);
- when(mBackupManagerService.getDataDir()).thenReturn(dataDir);
+ when(mBackupManagerService.getDataDir()).thenReturn(mDataDir);
when(mBackupManagerService.getBackupManagerBinder()).thenReturn(mBackupManager);
+
+ mBackupHandler = mBackupManagerService.getBackupHandler();
+ mShadowBackupLooper = shadowOf(mBackupHandler.getLooper());
}
@Test
- public void testRunTask_whenTransportProvidesFlags_passesThemToTheAgent() throws Exception {
+ public void testRunTask_whenQueueEmpty() throws Exception {
+ when(mBackupManagerService.getCurrentToken()).thenReturn(0L);
+ TransportMock transportMock = setUpTransport(mTransport);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, true);
+
+ runTask(task);
+
+ assertThat(mBackupManagerService.getPendingInits()).isEmpty();
+ assertThat(mBackupManagerService.isBackupRunning()).isFalse();
+ assertThat(mBackupManagerService.getCurrentOperations().size()).isEqualTo(0);
+ assertThat(mWakeLock.isHeld()).isFalse();
+ assertDirectory(getStateDirectory(mTransport)).isEmpty();
+ assertDirectory(mDataDir.toPath()).isEmpty();
+ verify(transportMock.transport, never()).initializeDevice();
+ verify(transportMock.transport, never()).performBackup(any(), any(), anyInt());
+ verify(transportMock.transport, never()).finishBackup();
+ verify(mDataChangedJournal).delete();
+ verify(mListener).onFinished(any());
+ verify(mObserver, never()).onResult(any(), anyInt());
+ verify(mObserver).backupFinished(BackupManager.SUCCESS);
+ // TODO: Verify set current token?
+ }
+
+ @Test
+ public void testRunTask_whenQueueEmpty_doesNotChangeStateFiles() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, true);
+ createPmStateFile();
+ Files.write(getStateFile(mTransport, PACKAGE_1), "packageState".getBytes());
+
+ runTask(task);
+
+ assertThat(Files.readAllBytes(getStateFile(mTransport, PACKAGE_MANAGER_SENTINEL))).isEqualTo("pmState".getBytes());
+ assertThat(Files.readAllBytes(getStateFile(mTransport, PACKAGE_1))).isEqualTo("packageState".getBytes());
+ }
+
+ @Test
+ public void testRunTask_whenSinglePackage_aboutAgent() throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
AgentMock agentMock = setUpAgent(PACKAGE_1);
- int flags = BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED;
- when(transportMock.transport.getTransportFlags()).thenReturn(flags);
+ agentOnBackupDo(
+ agentMock,
+ (oldState, dataOutput, newState) -> {
+ writeData(dataOutput, "key", "data".getBytes());
+ writeState(newState, "newState".getBytes());
+ });
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+
+ runTask(task);
+
+ verify(agentMock.agent).onBackup(any(), any(), any());
+ assertThat(Files.readAllBytes(getStateFile(mTransport, PACKAGE_1)))
+ .isEqualTo("newState".getBytes());
+ }
+
+ @Test
+ public void testRunTask_whenSinglePackage_notifiesCorrectly() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ setUpAgentWithData(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+
+ runTask(task);
+
+ verify(mBackupManagerService).logBackupComplete(PACKAGE_1);
+ verify(mObserver).onResult(PACKAGE_1, BackupManager.SUCCESS);
+ verify(mListener).onFinished(any());
+ verify(mObserver).backupFinished(BackupManager.SUCCESS);
+ }
+
+ @Test
+ public void testRunTask_whenSinglePackage_releasesWakeLock() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ setUpAgentWithData(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+
+ runTask(task);
+
+ assertThat(mWakeLock.isHeld()).isFalse();
+ }
+
+ @Test
+ public void testRunTask_whenSinglePackage_updatesBookkeeping() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ setUpAgentWithData(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+
+ runTask(task);
+
+ assertThat(mBackupManagerService.getPendingInits()).isEmpty();
+ assertThat(mBackupManagerService.isBackupRunning()).isFalse();
+ assertThat(mBackupManagerService.getCurrentOperations().size()).isEqualTo(0);
+ verify(mDataChangedJournal).delete();
+ }
+
+ @Test
+ public void testRunTask_whenSinglePackageIncremental_passesOldStateToAgent() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ AgentMock agentMock = setUpAgentWithData(PACKAGE_1);
PerformBackupTask task =
createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
+ false,
PACKAGE_1);
+ createPmStateFile();
+ Files.write(getStateFile(mTransport, PACKAGE_1), "oldState".getBytes());
runTask(task);
- verify(agentMock.agent)
- .onBackup(any(), argThat(dataOutputWithTransportFlags(flags)), any());
+ assertThat(agentMock.oldState).isEqualTo("oldState".getBytes());
}
@Test
- public void testRunTask_whenTransportDoesNotProvidesFlags() throws Exception {
+ public void testRunTask_whenSinglePackageNonIncremental_passesEmptyOldStateToAgent() throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
- AgentMock agentMock = setUpAgent(PACKAGE_1);
+ AgentMock agentMock = setUpAgentWithData(PACKAGE_1);
PerformBackupTask task =
createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
+ true,
PACKAGE_1);
+ createPmStateFile();
+ Files.write(getStateFile(mTransport, PACKAGE_1), "oldState".getBytes());
runTask(task);
- verify(agentMock.agent).onBackup(any(), argThat(dataOutputWithTransportFlags(0)), any());
+ assertThat(agentMock.oldState).isEqualTo(new byte[0]);
}
@Test
- public void testRunTask_whenTransportProvidesFlagsAndMultipleAgents_passesToAll()
- throws Exception {
+ public void testRunTask_whenSinglePackageNonIncremental_doesNotBackUpPm() throws Exception {
+ PackageManagerBackupAgent pmAgent = spy(createPmAgent());
+ when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
TransportMock transportMock = setUpTransport(mTransport);
- List<AgentMock> agentMocks = setUpAgents(PACKAGE_1, PACKAGE_2);
- BackupAgent agent1 = agentMocks.get(0).agent;
- BackupAgent agent2 = agentMocks.get(1).agent;
- int flags = BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED;
- when(transportMock.transport.getTransportFlags()).thenReturn(flags);
+ setUpAgentWithData(PACKAGE_1);
PerformBackupTask task =
createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
+ true,
+ PACKAGE_1);
+
+ runTask(task);
+
+ verify(pmAgent, never()).onBackup(any(), any(), any());
+ }
+
+ @Test
+ public void testRunTask_whenPackageAndPmNonIncremental_backsUpPm() throws Exception {
+ PackageManagerBackupAgent pmAgent = spy(createPmAgent());
+ when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
+ TransportMock transportMock = setUpTransport(mTransport);
+ setUpAgentWithData(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient,
+ mTransport.transportDirName,
+ true,
PACKAGE_1,
- PACKAGE_2);
+ PACKAGE_MANAGER_SENTINEL);
runTask(task);
- verify(agent1).onBackup(any(), argThat(dataOutputWithTransportFlags(flags)), any());
- verify(agent2).onBackup(any(), argThat(dataOutputWithTransportFlags(flags)), any());
+ verify(pmAgent).onBackup(any(), any(), any());
}
@Test
- public void testRunTask_whenTransportChangeFlagsAfterTaskCreation() throws Exception {
+ public void testRunTask_whenSinglePackageIncremental_backsUpPm() throws Exception {
+ PackageManagerBackupAgent pmAgent = spy(createPmAgent());
+ when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
TransportMock transportMock = setUpTransport(mTransport);
- AgentMock agentMock = setUpAgent(PACKAGE_1);
+ setUpAgentWithData(PACKAGE_1);
PerformBackupTask task =
createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
+ false,
PACKAGE_1);
+
+ runTask(task);
+
+ verify(pmAgent).onBackup(any(), any(), any());
+ }
+
+ @Test
+ public void testRunTask_whenSinglePackageNoPmState_initializesTransport() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ setUpAgentWithData(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+ Files.deleteIfExists(getStateFile(mTransport, PACKAGE_MANAGER_SENTINEL));
+
+ runTask(task);
+
+ verify(transportMock.transport).initializeDevice();
+ }
+
+ @Test
+ public void testRunTask_whenSinglePackageWithPmState_doesNotInitializeTransport()
+ throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ setUpAgentWithData(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+ createPmStateFile();
+
+ runTask(task);
+
+ verify(transportMock.transport, never()).initializeDevice();
+ }
+
+ @Test
+ public void testRunTask_whenTransportProvidesFlags_passesThemToTheAgent() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ AgentMock agentMock = setUpAgent(PACKAGE_1);
int flags = BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED;
when(transportMock.transport.getTransportFlags()).thenReturn(flags);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
runTask(task);
@@ -251,20 +449,54 @@ public class PerformBackupTaskTest {
}
@Test
- public void testRunTask_callsListenerAndObserver() throws Exception {
+ public void testRunTask_whenTransportDoesNotProvidesFlags() throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
- setUpAgent(PACKAGE_1);
+ AgentMock agentMock = setUpAgent(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+
+ runTask(task);
+
+ verify(agentMock.agent).onBackup(any(), argThat(dataOutputWithTransportFlags(0)), any());
+ }
+
+ @Test
+ public void testRunTask_whenTransportProvidesFlagsAndMultipleAgents_passesToAll()
+ throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ List<AgentMock> agentMocks = setUpAgents(PACKAGE_1, PACKAGE_2);
+ BackupAgent agent1 = agentMocks.get(0).agent;
+ BackupAgent agent2 = agentMocks.get(1).agent;
+ int flags = BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED;
+ when(transportMock.transport.getTransportFlags()).thenReturn(flags);
PerformBackupTask task =
createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
- PACKAGE_1);
+ PACKAGE_1,
+ PACKAGE_2);
runTask(task);
- verify(mListener).onFinished(any());
- verify(mObserver).backupFinished(eq(BackupManager.SUCCESS));
+ verify(agent1).onBackup(any(), argThat(dataOutputWithTransportFlags(flags)), any());
+ verify(agent2).onBackup(any(), argThat(dataOutputWithTransportFlags(flags)), any());
+ }
+
+ @Test
+ public void testRunTask_whenTransportChangeFlagsAfterTaskCreation() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ AgentMock agentMock = setUpAgent(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+ int flags = BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED;
+ when(transportMock.transport.getTransportFlags()).thenReturn(flags);
+
+ runTask(task);
+
+ verify(agentMock.agent)
+ .onBackup(any(), argThat(dataOutputWithTransportFlags(flags)), any());
}
@Test
@@ -273,10 +505,7 @@ public class PerformBackupTaskTest {
setUpAgent(PACKAGE_1);
PerformBackupTask task =
createPerformBackupTask(
- transportMock.transportClient,
- mTransport.transportDirName,
- emptyList(),
- PACKAGE_1);
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
runTask(task);
@@ -289,54 +518,56 @@ public class PerformBackupTaskTest {
IBackupTransport transportBinder = transportMock.transport;
AgentMock agentMock = setUpAgent(PACKAGE_1);
agentOnBackupDo(
- agentMock.agent,
+ agentMock,
(oldState, dataOutput, newState) -> {
writeData(dataOutput, "key1", "foo".getBytes());
writeData(dataOutput, "key2", "bar".getBytes());
});
PerformBackupTask task =
createPerformBackupTask(
- transportMock.transportClient,
- mTransport.transportDirName,
- emptyList(),
- PACKAGE_1);
- // We need to verify at call time because the file is deleted right after
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+ Path backupDataPath =
+ Files.createTempFile(mContext.getCacheDir().toPath(), "backup", ".tmp");
when(transportBinder.performBackup(argThat(packageInfo(PACKAGE_1)), any(), anyInt()))
- .then(this::mockAndVerifyTransportPerformBackupData);
+ .then(
+ invocation -> {
+ ParcelFileDescriptor backupDataParcelFd = invocation.getArgument(1);
+ FileDescriptor backupDataFd = backupDataParcelFd.getFileDescriptor();
+ Files.copy(
+ new FileInputStream(backupDataFd),
+ backupDataPath,
+ REPLACE_EXISTING);
+ backupDataParcelFd.close();
+ return BackupTransport.TRANSPORT_OK;
+ });
runTask(task);
- // Already verified data in mockAndVerifyPerformBackupData
verify(transportBinder).performBackup(argThat(packageInfo(PACKAGE_1)), any(), anyInt());
- }
-
- private int mockAndVerifyTransportPerformBackupData(InvocationOnMock invocation)
- throws IOException {
- ParcelFileDescriptor data = invocation.getArgument(1);
- // Verifying that what we passed to the transport is what the agent wrote
- BackupDataInput dataInput = new BackupDataInput(data.getFileDescriptor());
+ // Now verify data sent
+ FileInputStream inputStream = new FileInputStream(backupDataPath.toFile());
+ BackupDataInput backupData = new BackupDataInput(inputStream.getFD());
// "key1" => "foo"
- assertThat(dataInput.readNextHeader()).isTrue();
- assertThat(dataInput.getKey()).isEqualTo("key1");
- int size1 = dataInput.getDataSize();
+ assertThat(backupData.readNextHeader()).isTrue();
+ assertThat(backupData.getKey()).isEqualTo("key1");
+ int size1 = backupData.getDataSize();
byte[] data1 = new byte[size1];
- dataInput.readEntityData(data1, 0, size1);
+ backupData.readEntityData(data1, 0, size1);
assertThat(data1).isEqualTo("foo".getBytes());
// "key2" => "bar"
- assertThat(dataInput.readNextHeader()).isTrue();
- assertThat(dataInput.getKey()).isEqualTo("key2");
- int size2 = dataInput.getDataSize();
+ assertThat(backupData.readNextHeader()).isTrue();
+ assertThat(backupData.getKey()).isEqualTo("key2");
+ int size2 = backupData.getDataSize();
byte[] data2 = new byte[size2];
- dataInput.readEntityData(data2, 0, size2);
+ backupData.readEntityData(data2, 0, size2);
assertThat(data2).isEqualTo("bar".getBytes());
// No more
- assertThat(dataInput.readNextHeader()).isFalse();
-
- return BackupTransport.TRANSPORT_OK;
+ assertThat(backupData.readNextHeader()).isFalse();
+ inputStream.close();
}
@Test
@@ -344,13 +575,10 @@ public class PerformBackupTaskTest {
throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
IBackupTransport transportBinder = transportMock.transport;
- setUpAgent(PACKAGE_1);
+ setUpAgentWithData(PACKAGE_1);
PerformBackupTask task =
createPerformBackupTask(
- transportMock.transportClient,
- mTransport.transportDirName,
- emptyList(),
- PACKAGE_1);
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
when(transportBinder.performBackup(argThat(packageInfo(PACKAGE_1)), any(), anyInt()))
.thenReturn(BackupTransport.TRANSPORT_OK);
@@ -364,57 +592,80 @@ public class PerformBackupTaskTest {
TransportMock transportMock = setUpTransport(mTransport);
AgentMock agentMock = setUpAgent(PACKAGE_1);
agentOnBackupDo(
- agentMock.agent,
+ agentMock,
(oldState, dataOutput, newState) -> {
char prohibitedChar = 0xff00;
writeData(dataOutput, prohibitedChar + "key", "foo".getBytes());
});
PerformBackupTask task =
createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+
+ runTask(task);
+
+ verify(mListener).onFinished(any());
+ verify(mObserver).onResult(eq(PACKAGE_1), eq(BackupManager.ERROR_AGENT_FAILURE));
+ verify(agentMock.agentBinder).fail(any());
+ verify(mObserver).backupFinished(BackupManager.SUCCESS);
+ }
+
+ @Test
+ public void testRunTask_whenFirstAgentKeyProhibitedButLastPermitted() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ List<AgentMock> agentMocks = setUpAgents(PACKAGE_1, PACKAGE_2);
+ AgentMock agentMock1 = agentMocks.get(0);
+ AgentMock agentMock2 = agentMocks.get(1);
+ agentOnBackupDo(
+ agentMock1,
+ (oldState, dataOutput, newState) -> {
+ char prohibitedChar = 0xff00;
+ writeData(dataOutput, prohibitedChar + "key", "foo".getBytes());
+ });
+ agentOnBackupDo(
+ agentMock2,
+ (oldState, dataOutput, newState) -> {
+ writeData(dataOutput, "key", "bar".getBytes());
+ });
+ PerformBackupTask task =
+ createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
- PACKAGE_1);
+ PACKAGE_1,
+ PACKAGE_2);
runTask(task);
- // TODO: Should it not call mListener.onFinished()? PerformBackupTask:891 return?
- // verify(mListener).onFinished(any());
+ verify(mListener).onFinished(any());
verify(mObserver).onResult(eq(PACKAGE_1), eq(BackupManager.ERROR_AGENT_FAILURE));
- verify(agentMock.agentBinder).fail(any());
+ verify(agentMock1.agentBinder).fail(any());
+ verify(mObserver).onResult(eq(PACKAGE_2), eq(BackupManager.SUCCESS));
+ verify(mObserver).backupFinished(BackupManager.SUCCESS);
}
@Test
public void testRunTask_whenTransportUnavailable() throws Exception {
TransportMock transportMock = setUpTransport(mTransport.unavailable());
- setUpAgent(PACKAGE_1);
+ setUpAgentWithData(PACKAGE_1);
PerformBackupTask task =
createPerformBackupTask(
- transportMock.transportClient,
- mTransport.transportDirName,
- emptyList(),
- PACKAGE_1);
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
runTask(task);
verify(mListener).onFinished(any());
- // TODO: Should it be 2 times? (PBT.beginBackup() and PBT.finalizeBackup())
- verify(mObserver, times(2)).backupFinished(eq(BackupManager.ERROR_TRANSPORT_ABORTED));
+ verify(mObserver).backupFinished(eq(BackupManager.ERROR_TRANSPORT_ABORTED));
}
@Test
public void testRunTask_whenTransportRejectsPackage() throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
- setUpAgent(PACKAGE_1);
+ setUpAgentWithData(PACKAGE_1);
when(transportMock.transport.performBackup(
argThat(packageInfo(PACKAGE_1)), any(), anyInt()))
.thenReturn(BackupTransport.TRANSPORT_PACKAGE_REJECTED);
PerformBackupTask task =
createPerformBackupTask(
- transportMock.transportClient,
- mTransport.transportDirName,
- emptyList(),
- PACKAGE_1);
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
runTask(task);
@@ -426,7 +677,7 @@ public class PerformBackupTaskTest {
public void testRunTask_whenTransportRejectsFirstPackageButLastSucceeds() throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
IBackupTransport transportBinder = transportMock.transport;
- setUpAgents(PACKAGE_1, PACKAGE_2);
+ setUpAgentsWithData(PACKAGE_1, PACKAGE_2);
when(transportBinder.performBackup(argThat(packageInfo(PACKAGE_1)), any(), anyInt()))
.thenReturn(BackupTransport.TRANSPORT_PACKAGE_REJECTED);
when(transportBinder.performBackup(argThat(packageInfo(PACKAGE_2)), any(), anyInt()))
@@ -435,7 +686,6 @@ public class PerformBackupTaskTest {
createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
PACKAGE_1,
PACKAGE_2);
@@ -450,7 +700,7 @@ public class PerformBackupTaskTest {
public void testRunTask_whenTransportRejectsLastPackageButFirstSucceeds() throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
IBackupTransport transportBinder = transportMock.transport;
- setUpAgents(PACKAGE_1, PACKAGE_2);
+ setUpAgentsWithData(PACKAGE_1, PACKAGE_2);
when(transportBinder.performBackup(argThat(packageInfo(PACKAGE_1)), any(), anyInt()))
.thenReturn(BackupTransport.TRANSPORT_OK);
when(transportBinder.performBackup(argThat(packageInfo(PACKAGE_2)), any(), anyInt()))
@@ -459,7 +709,6 @@ public class PerformBackupTaskTest {
createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
PACKAGE_1,
PACKAGE_2);
@@ -473,16 +722,13 @@ public class PerformBackupTaskTest {
@Test
public void testRunTask_whenTransportReturnsQuotaExceeded() throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
- AgentMock agentMock = setUpAgent(PACKAGE_1);
+ AgentMock agentMock = setUpAgentWithData(PACKAGE_1);
when(transportMock.transport.performBackup(
argThat(packageInfo(PACKAGE_1)), any(), anyInt()))
.thenReturn(BackupTransport.TRANSPORT_QUOTA_EXCEEDED);
PerformBackupTask task =
createPerformBackupTask(
- transportMock.transportClient,
- mTransport.transportDirName,
- emptyList(),
- PACKAGE_1);
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
runTask(task);
@@ -497,18 +743,109 @@ public class PerformBackupTaskTest {
TransportMock transportMock = setUpTransport(mTransport);
PerformBackupTask task =
createPerformBackupTask(
+ transportMock.transportClient, mTransport.transportDirName, PACKAGE_1);
+
+ runTask(task);
+
+ verify(transportMock.transport, never()).performBackup(any(), any(), anyInt());
+ verify(mObserver).onResult(PACKAGE_1, BackupManager.ERROR_PACKAGE_NOT_FOUND);
+ verify(mObserver).backupFinished(BackupManager.SUCCESS);
+ }
+
+ @Test
+ public void testRunTask_whenNonIncrementalAndTransportRequestsNonIncremental()
+ throws Exception {
+ // It's going to be non-incremental because we haven't created any previous state
+ TransportMock transportMock = setUpTransport(mTransport);
+ setUpAgentWithData(PACKAGE_1);
+ when(transportMock.transport.performBackup(
+ argThat(packageInfo(PACKAGE_1)), any(), anyInt()))
+ .thenReturn(BackupTransport.TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED);
+ PerformBackupTask task =
+ createPerformBackupTask(
transportMock.transportClient,
mTransport.transportDirName,
- emptyList(),
+ true,
PACKAGE_1);
runTask(task);
- verify(transportMock.transport, never()).performBackup(any(), any(), anyInt());
- verify(mObserver).onResult(PACKAGE_1, BackupManager.ERROR_PACKAGE_NOT_FOUND);
+ // Error because it was non-incremental already, so transport can't request it
+ verify(mObserver).onResult(PACKAGE_1, BackupManager.ERROR_TRANSPORT_ABORTED);
+ verify(mObserver).backupFinished(BackupManager.ERROR_TRANSPORT_ABORTED);
+ }
+
+ @Test
+ public void testRunTask_whenIncrementalAndTransportRequestsNonIncremental() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ AgentMock agentMock = setUpAgentWithData(PACKAGE_1);
+ IBackupTransport transport = transportMock.transport;
+ when(transport.performBackup(
+ argThat(packageInfo(PACKAGE_1)),
+ any(),
+ intThat(flags -> (flags & BackupTransport.FLAG_INCREMENTAL) != 0)))
+ .thenReturn(BackupTransport.TRANSPORT_NON_INCREMENTAL_BACKUP_REQUIRED);
+ when(transport.performBackup(
+ argThat(packageInfo(PACKAGE_1)),
+ any(),
+ intThat(flags -> (flags & BackupTransport.FLAG_NON_INCREMENTAL) != 0)))
+ .thenReturn(BackupTransport.TRANSPORT_OK);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient,
+ mTransport.transportDirName,
+ false,
+ PACKAGE_1);
+ createPmStateFile();
+ // Write state to be incremental
+ Files.write(getStateFile(mTransport, PACKAGE_1), "oldState".getBytes());
+
+ runTask(task);
+
+ verify(agentMock.agent, times(2)).onBackup(any(), any(), any());
+ verify(mObserver).onResult(PACKAGE_1, BackupManager.SUCCESS);
verify(mObserver).backupFinished(BackupManager.SUCCESS);
}
+ @Test
+ public void testRunTask_whenIncrementalAndTransportUnavailableDuringPmBackup()
+ throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ IBackupTransport transportBinder = transportMock.transport;
+ setUpAgent(PACKAGE_1);
+ when(transportBinder.getBackupQuota(eq(PACKAGE_MANAGER_SENTINEL), anyBoolean()))
+ .thenThrow(DeadObjectException.class);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient,
+ mTransport.transportDirName,
+ false,
+ PACKAGE_1);
+
+ runTask(task);
+
+ verify(mListener).onFinished(any());
+ verify(mObserver).backupFinished(eq(BackupManager.ERROR_TRANSPORT_ABORTED));
+ }
+
+ @Test
+ public void testRunTask_whenIncrementalAndPmAgentFails() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ PackageManagerBackupAgent pmAgent = createThrowingPmAgent();
+ when(mBackupManagerService.makeMetadataAgent()).thenReturn(pmAgent);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient,
+ mTransport.transportDirName,
+ false,
+ PACKAGE_1);
+
+ runTask(task);
+
+ verify(mListener).onFinished(any());
+ verify(mObserver).backupFinished(eq(BackupManager.ERROR_TRANSPORT_ABORTED));
+ }
+
private void runTask(PerformBackupTask task) {
Message message = mBackupHandler.obtainMessage(BackupHandler.MSG_BACKUP_RESTORE_STEP, task);
mBackupHandler.sendMessage(message);
@@ -520,11 +857,18 @@ public class PerformBackupTaskTest {
private TransportMock setUpTransport(TransportData transport) throws Exception {
TransportMock transportMock =
TransportTestUtils.setUpTransport(mTransportManager, transport);
- File stateDir = new File(mBaseStateDir, transport.transportDirName);
- assertThat(stateDir.mkdir()).isTrue();
+ Files.createDirectories(getStateDirectory(transport));
return transportMock;
}
+ private Path getStateDirectory(TransportData transport) {
+ return mBaseStateDir.toPath().resolve(transport.transportDirName);
+ }
+
+ private Path getStateFile(TransportData transport, String packageName) {
+ return getStateDirectory(transport).resolve(packageName);
+ }
+
private List<AgentMock> setUpAgents(String... packageNames) {
return Stream.of(packageNames).map(this::setUpAgent).collect(toList());
}
@@ -545,9 +889,9 @@ public class PerformBackupTaskTest {
spy(IBackupAgent.Stub.asInterface(backupAgent.onBind()));
// Don't crash our only process (in production code this would crash the app, not us)
doNothing().when(backupAgentBinder).fail(any());
- when(mBackupManagerService.bindToAgentSynchronous(
- eq(packageInfo.applicationInfo), anyInt()))
- .thenReturn(backupAgentBinder);
+ doReturn(backupAgentBinder)
+ .when(mBackupManagerService)
+ .bindToAgentSynchronous(eq(packageInfo.applicationInfo), anyInt());
return new AgentMock(backupAgentBinder, backupAgent);
} catch (RemoteException e) {
// Never happens, compiler happy
@@ -555,10 +899,33 @@ public class PerformBackupTaskTest {
}
}
+ private List<AgentMock> setUpAgentsWithData(String... packageNames) {
+ return Stream.of(packageNames).map(this::setUpAgentWithData).collect(toList());
+ }
+
+ private AgentMock setUpAgentWithData(String packageName) {
+ AgentMock agentMock = setUpAgent(packageName);
+
+ uncheck(
+ () ->
+ agentOnBackupDo(
+ agentMock,
+ (oldState, dataOutput, newState) -> {
+ writeData(dataOutput, "key", ("data" + packageName).getBytes());
+ writeState(newState, ("state" + packageName).getBytes());
+ }));
+ return agentMock;
+ }
+
+ private PerformBackupTask createPerformBackupTask(
+ TransportClient transportClient, String transportDirName, String... packages) {
+ return createPerformBackupTask(transportClient, transportDirName, true, packages);
+ }
+
private PerformBackupTask createPerformBackupTask(
TransportClient transportClient,
String transportDirName,
- List<String> pendingFullBackups,
+ boolean nonIncremental,
String... packages) {
ArrayList<BackupRequest> backupRequests =
Stream.of(packages).map(BackupRequest::new).collect(toCollection(ArrayList::new));
@@ -573,13 +940,33 @@ public class PerformBackupTaskTest {
mObserver,
mMonitor,
mListener,
- pendingFullBackups,
+ emptyList(),
/* userInitiated */ false,
- /* nonIncremental */ true);
+ nonIncremental);
mBackupManager.setUp(mBackupHandler, task);
return task;
}
+ private PackageManagerBackupAgent createPmAgent() {
+ PackageManagerBackupAgent pmAgent =
+ new PackageManagerBackupAgent(mApplication.getPackageManager());
+ pmAgent.attach(mApplication);
+ pmAgent.onCreate();
+ return pmAgent;
+ }
+
+ /**
+ * Returns an implementation of PackageManagerBackupAgent that throws RuntimeException in {@link
+ * BackupAgent#onBackup(ParcelFileDescriptor, BackupDataOutput, ParcelFileDescriptor)}
+ */
+ private PackageManagerBackupAgent createThrowingPmAgent() {
+ PackageManagerBackupAgent pmAgent =
+ new ThrowingPackageManagerBackupAgent(mApplication.getPackageManager());
+ pmAgent.attach(mApplication);
+ pmAgent.onCreate();
+ return pmAgent;
+ }
+
/** Matches {@link PackageInfo} whose package name is {@code packageName}. */
private static ArgumentMatcher<PackageInfo> packageInfo(String packageName) {
// We have to test for packageInfo nulity because of Mockito's own stubbing with argThat().
@@ -603,9 +990,49 @@ public class PerformBackupTaskTest {
dataOutput.writeEntityData(data, data.length);
}
- private static void agentOnBackupDo(BackupAgent agent, BackupAgentOnBackup function)
+ private static void writeState(ParcelFileDescriptor newState, byte[] state) throws IOException {
+ OutputStream outputStream = new FileOutputStream(newState.getFileDescriptor());
+ outputStream.write(state);
+ outputStream.flush();
+ }
+
+ /** Prevents the states from being reset and transport initialization. */
+ private void createPmStateFile() throws IOException {
+ Files.write(getStateFile(mTransport, PACKAGE_MANAGER_SENTINEL), "pmState".getBytes());
+ }
+
+ /**
+ * Implements {@code function} for {@link BackupAgent#onBackup(ParcelFileDescriptor,
+ * BackupDataOutput, ParcelFileDescriptor)} of {@code agentMock} and populates {@link
+ * AgentMock#oldState}.
+ */
+ private static void agentOnBackupDo(AgentMock agentMock, BackupAgentOnBackup function)
throws Exception {
- doAnswer(function).when(agent).onBackup(any(), any(), any());
+ doAnswer(
+ (BackupAgentOnBackup)
+ (oldState, dataOutput, newState) -> {
+ ByteArrayOutputStream outputStream =
+ new ByteArrayOutputStream();
+ Utils.transferStreamedData(
+ new FileInputStream(oldState.getFileDescriptor()),
+ outputStream);
+ agentMock.oldState = outputStream.toByteArray();
+ function.onBackup(oldState, dataOutput, newState);
+ })
+ .when(agentMock.agent)
+ .onBackup(any(), any(), any());
+ }
+
+ // TODO: Find some implementation? Extract?
+ private static <T> Iterable<T> oneTimeIterable(Iterator<T> iterator) {
+ return () -> iterator;
+ }
+
+ private static IterableSubject<
+ ? extends IterableSubject<?, Path, Iterable<Path>>, Path, Iterable<Path>>
+ assertDirectory(Path directory) throws IOException {
+ return assertThat(oneTimeIterable(Files.newDirectoryStream(directory).iterator()))
+ .named("directory " + directory);
}
@FunctionalInterface
@@ -629,6 +1056,7 @@ public class PerformBackupTaskTest {
private static class AgentMock {
private final IBackupAgent agentBinder;
private final BackupAgent agent;
+ private byte[] oldState;
private AgentMock(IBackupAgent agentBinder, BackupAgent agent) {
this.agentBinder = agentBinder;
@@ -656,4 +1084,18 @@ public class PerformBackupTaskTest {
mBackupHandler.sendMessage(message);
}
}
+
+ private static class ThrowingPackageManagerBackupAgent extends PackageManagerBackupAgent {
+ ThrowingPackageManagerBackupAgent(PackageManager packageMgr) {
+ super(packageMgr);
+ }
+
+ @Override
+ public void onBackup(
+ ParcelFileDescriptor oldState,
+ BackupDataOutput data,
+ ParcelFileDescriptor newState) {
+ throw new RuntimeException();
+ }
+ }
}
diff --git a/services/robotests/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/src/com/android/server/backup/TransportManagerTest.java
index 7d1b6c86fa1e..051a4a037816 100644
--- a/services/robotests/src/com/android/server/backup/TransportManagerTest.java
+++ b/services/robotests/src/com/android/server/backup/TransportManagerTest.java
@@ -77,10 +77,9 @@ import java.util.stream.Stream;
@RunWith(FrameworkRobolectricTestRunner.class)
@Config(
- manifest = Config.NONE,
- sdk = 26,
- shadows = {FrameworkShadowContextImpl.class}
-)
+ manifest = Config.NONE,
+ sdk = 26,
+ shadows = {FrameworkShadowContextImpl.class})
@SystemLoaderPackages({"com.android.server.backup"})
@Presubmit
public class TransportManagerTest {
@@ -204,8 +203,10 @@ public class TransportManagerTest {
verify(mTransportClientManager)
.getTransportClient(
eq(mTransportA1.getTransportComponent()),
- argThat(bundle ->
- bundle.getBoolean(BackupTransport.EXTRA_TRANSPORT_REGISTRATION)),
+ argThat(
+ bundle ->
+ bundle.getBoolean(
+ BackupTransport.EXTRA_TRANSPORT_REGISTRATION)),
anyString());
}
@@ -224,11 +225,8 @@ public class TransportManagerTest {
@Test
public void testOnPackageRemoved_unregisterTransports() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpPackage(PACKAGE_B, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportB1);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportB1);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportB1);
transportManager.onPackageRemoved(PACKAGE_A);
@@ -237,10 +235,8 @@ public class TransportManagerTest {
@Test
public void testOnPackageRemoved_whenUnknownPackage_nothingHappens() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1);
- TransportManager transportManager = createTransportManager(mTransportA1);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1);
transportManager.onPackageRemoved(PACKAGE_A + "unknown");
@@ -250,10 +246,8 @@ public class TransportManagerTest {
@Test
public void testOnPackageChanged_whenOneComponentChanged_onlyOneTransportReRegistered()
throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportA2);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
// Reset listener to verify calls after registerTransports() above
reset(mListener);
@@ -270,10 +264,8 @@ public class TransportManagerTest {
@Test
public void testOnPackageChanged_whenNoComponentsChanged_doesNotRegisterTransports()
throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1);
- TransportManager transportManager = createTransportManager(mTransportA1);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1);
reset(mListener);
transportManager.onPackageChanged(PACKAGE_A);
@@ -285,10 +277,8 @@ public class TransportManagerTest {
@Test
public void testOnPackageChanged_whenUnknownComponentChanged_noTransportsRegistered()
throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1);
- TransportManager transportManager = createTransportManager(mTransportA1);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1);
reset(mListener);
transportManager.onPackageChanged(PACKAGE_A, PACKAGE_A + ".UnknownComponent");
@@ -299,10 +289,8 @@ public class TransportManagerTest {
@Test
public void testOnPackageChanged_reRegisterTransports() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportA2);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
reset(mListener);
transportManager.onPackageChanged(
@@ -319,10 +307,8 @@ public class TransportManagerTest {
@Test
public void testRegisterAndSelectTransport_whenTransportRegistered() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1);
- TransportManager transportManager = createTransportManager(null, mTransportA1);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(null, mTransportA1);
ComponentName transportComponent = mTransportA1.getTransportComponent();
int result = transportManager.registerAndSelectTransport(transportComponent);
@@ -357,10 +343,8 @@ public class TransportManagerTest {
@Test
public void testGetCurrentTransportName_whenSelectTransportNotCalled_returnsDefaultTransport()
throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportA2);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
String currentTransportName = transportManager.getCurrentTransportName();
@@ -370,10 +354,8 @@ public class TransportManagerTest {
@Test
public void testGetCurrentTransport_whenSelectTransportCalled_returnsSelectedTransport()
throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportA2);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
transportManager.selectTransport(mTransportA2.transportName);
String currentTransportName = transportManager.getCurrentTransportName();
@@ -411,11 +393,39 @@ public class TransportManagerTest {
}
@Test
+ public void testGetCurrentTransportComponent() throws Exception {
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1);
+
+ ComponentName transportComponent = transportManager.getCurrentTransportComponent();
+
+ assertThat(transportComponent).isEqualTo(mTransportA1.getTransportComponent());
+ }
+
+ @Test
+ public void testGetCurrentTransportComponent_whenNoTransportSelected() throws Exception {
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(null, mTransportA1);
+
+ ComponentName transportComponent = transportManager.getCurrentTransportComponent();
+
+ assertThat(transportComponent).isNull();
+ }
+
+ @Test
+ public void testGetCurrentTransportComponent_whenTransportNotRegistered() throws Exception {
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1.unregistered());
+
+ expectThrows(
+ TransportNotRegisteredException.class,
+ transportManager::getCurrentTransportComponent);
+ }
+
+ @Test
public void testGetTransportClient_forRegisteredTransport() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportA2);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
TransportClient transportClient =
transportManager.getTransportClient(mTransportA1.transportName, "caller");
@@ -427,10 +437,8 @@ public class TransportManagerTest {
@Test
public void testGetTransportClient_forOldNameOfTransportThatChangedName_returnsNull()
throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportA2);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
transportManager.updateTransportAttributes(
mTransportA1.getTransportComponent(),
"newName",
@@ -446,12 +454,9 @@ public class TransportManagerTest {
}
@Test
- public void testGetTransportClient_forNewNameOfTransportThatChangedName_returnsCorrectly()
- throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportA2);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2);
- transportManager.registerTransports();
+ public void testGetTransportClient_forNewNameOfTransportThatChangedName() throws Exception {
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
transportManager.updateTransportAttributes(
mTransportA1.getTransportComponent(),
"newName",
@@ -467,11 +472,40 @@ public class TransportManagerTest {
}
@Test
+ public void testGetCurrentTransportClient() throws Exception {
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
+
+ TransportClient transportClient = transportManager.getCurrentTransportClient("caller");
+
+ assertThat(transportClient.getTransportComponent())
+ .isEqualTo(mTransportA1.getTransportComponent());
+ }
+
+ @Test
+ public void testGetCurrentTransportClient_whenNoTransportSelected() throws Exception {
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(null, mTransportA1);
+
+ expectThrows(
+ IllegalStateException.class,
+ () -> transportManager.getCurrentTransportClient("caller"));
+ }
+
+ @Test
+ public void testGetCurrentTransportClientOrThrow_whenNoTransportSelected() throws Exception {
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(null, mTransportA1);
+
+ expectThrows(
+ IllegalStateException.class,
+ () -> transportManager.getCurrentTransportClientOrThrow("caller"));
+ }
+
+ @Test
public void testGetTransportName_forTransportThatChangedName_returnsNewName() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1, mTransportA2);
- TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1, mTransportA2);
transportManager.updateTransportAttributes(
mTransportA1.getTransportComponent(),
"newName",
@@ -505,31 +539,33 @@ public class TransportManagerTest {
@Test
public void testGetTransportAttributes_forRegisteredTransport_returnsCorrectValues()
throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1);
- TransportManager transportManager = createTransportManager(mTransportA1);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1);
Intent configurationIntent =
transportManager.getTransportConfigurationIntent(mTransportA1.transportName);
+ String destinationString =
+ transportManager.getTransportCurrentDestinationString(mTransportA1.transportName);
Intent dataManagementIntent =
transportManager.getTransportDataManagementIntent(mTransportA1.transportName);
String dataManagementLabel =
transportManager.getTransportDataManagementLabel(mTransportA1.transportName);
String transportDirName = transportManager.getTransportDirName(mTransportA1.transportName);
+ String transportDirNameByComponent =
+ transportManager.getTransportDirName(mTransportA1.getTransportComponent());
assertThat(configurationIntent).isEqualTo(mTransportA1.configurationIntent);
+ assertThat(destinationString).isEqualTo(mTransportA1.currentDestinationString);
assertThat(dataManagementIntent).isEqualTo(mTransportA1.dataManagementIntent);
assertThat(dataManagementLabel).isEqualTo(mTransportA1.dataManagementLabel);
assertThat(transportDirName).isEqualTo(mTransportA1.transportDirName);
+ assertThat(transportDirNameByComponent).isEqualTo(mTransportA1.transportDirName);
}
@Test
public void testGetTransportAttributes_forUnregisteredTransport_throws() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpTransports(mTransportA1);
- TransportManager transportManager = createTransportManager(mTransportA1);
- transportManager.registerTransports();
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(mTransportA1);
expectThrows(
TransportNotRegisteredException.class,
@@ -537,6 +573,11 @@ public class TransportManagerTest {
expectThrows(
TransportNotRegisteredException.class,
() ->
+ transportManager.getTransportCurrentDestinationString(
+ mTransportA2.transportName));
+ expectThrows(
+ TransportNotRegisteredException.class,
+ () ->
transportManager.getTransportDataManagementIntent(
mTransportA2.transportName));
expectThrows(
@@ -545,48 +586,69 @@ public class TransportManagerTest {
expectThrows(
TransportNotRegisteredException.class,
() -> transportManager.getTransportDirName(mTransportA2.transportName));
+ expectThrows(
+ TransportNotRegisteredException.class,
+ () -> transportManager.getTransportDirName(mTransportA2.getTransportComponent()));
}
@Test
public void testGetRegisteredTransportNames() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpPackage(PACKAGE_B, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- TransportData[] transportsData = {mTransportA1, mTransportA2, mTransportB1};
- setUpTransports(transportsData);
TransportManager transportManager =
- createTransportManager(mTransportA1, mTransportA2, mTransportB1);
- transportManager.registerTransports();
+ createTransportManagerWithRegisteredTransports(
+ mTransportA1, mTransportA2, mTransportB1);
String[] transportNames = transportManager.getRegisteredTransportNames();
assertThat(transportNames)
.asList()
.containsExactlyElementsIn(
- Stream.of(transportsData)
+ Stream.of(mTransportA1, mTransportA2, mTransportB1)
.map(transportData -> transportData.transportName)
.collect(toList()));
}
@Test
public void testGetRegisteredTransportComponents() throws Exception {
- setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- setUpPackage(PACKAGE_B, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
- TransportData[] transportsData = {mTransportA1, mTransportA2, mTransportB1};
- setUpTransports(transportsData);
TransportManager transportManager =
- createTransportManager(mTransportA1, mTransportA2, mTransportB1);
- transportManager.registerTransports();
+ createTransportManagerWithRegisteredTransports(
+ mTransportA1, mTransportA2, mTransportB1);
ComponentName[] transportNames = transportManager.getRegisteredTransportComponents();
assertThat(transportNames)
.asList()
.containsExactlyElementsIn(
- Stream.of(transportsData)
+ Stream.of(mTransportA1, mTransportA2, mTransportB1)
.map(TransportData::getTransportComponent)
.collect(toList()));
}
+ @Test
+ public void testForEachRegisteredTransport() throws Exception {
+ TransportManager transportManager =
+ createTransportManagerWithRegisteredTransports(
+ mTransportA1, mTransportA2, mTransportB1);
+ List<String> calls = new ArrayList<>();
+
+ transportManager.forEachRegisteredTransport(calls::add);
+
+ assertThat(calls)
+ .containsExactly(
+ mTransportA1.transportName,
+ mTransportA2.transportName,
+ mTransportB1.transportName);
+ }
+
+ @Test
+ public void testForEachRegisteredTransport_whenNoTransportsRegistered() throws Exception {
+ TransportManager transportManager = createTransportManagerWithRegisteredTransports(null);
+ List<String> calls = new ArrayList<>();
+
+ transportManager.forEachRegisteredTransport(calls::add);
+
+ assertThat(calls).isEmpty();
+ }
+
private List<TransportMock> setUpTransports(TransportData... transports) throws Exception {
setUpTransportsForTransportManager(mShadowPackageManager, transports);
List<TransportMock> transportMocks = new ArrayList<>(transports.length);
@@ -611,23 +673,43 @@ public class TransportManagerTest {
mShadowPackageManager.addPackage(packageInfo);
}
+ private TransportManager createTransportManagerWithRegisteredTransports(
+ @Nullable TransportData selectedTransport, TransportData... transports)
+ throws Exception {
+ Set<TransportData> transportSet = merge(selectedTransport, transports);
+ for (TransportData transport : transportSet) {
+ setUpPackage(
+ transport.getTransportComponent().getPackageName(),
+ ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
+ }
+ setUpTransports(transportSet.toArray(new TransportData[transportSet.size()]));
+ TransportManager transportManager = createTransportManager(selectedTransport, transports);
+ transportManager.registerTransports();
+ return transportManager;
+ }
+
private TransportManager createTransportManager(
@Nullable TransportData selectedTransport, TransportData... transports) {
- Set<ComponentName> whitelist =
- concat(Stream.of(selectedTransport), Stream.of(transports))
- .filter(Objects::nonNull)
- .map(TransportData::getTransportComponent)
- .collect(toSet());
TransportManager transportManager =
new TransportManager(
mContext,
- whitelist,
+ merge(selectedTransport, transports)
+ .stream()
+ .map(TransportData::getTransportComponent)
+ .collect(toSet()),
selectedTransport != null ? selectedTransport.transportName : null,
mTransportClientManager);
transportManager.setOnTransportRegisteredListener(mListener);
return transportManager;
}
+ private Set<TransportData> merge(
+ @Nullable TransportData selectedTransport, TransportData... transports) {
+ return concat(Stream.of(selectedTransport), Stream.of(transports))
+ .filter(Objects::nonNull)
+ .collect(toSet());
+ }
+
private void assertRegisteredTransports(
TransportManager transportManager, List<TransportData> transports) {
assertThat(transportManager.getRegisteredTransportComponents())
diff --git a/services/robotests/src/com/android/server/backup/Utils.java b/services/robotests/src/com/android/server/backup/Utils.java
new file mode 100644
index 000000000000..7cdca17e50fc
--- /dev/null
+++ b/services/robotests/src/com/android/server/backup/Utils.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class Utils {
+ public static final int BUFFER_SIZE = 8192;
+
+ public static void transferStreamedData(InputStream in, OutputStream out) throws IOException {
+ transferStreamedData(in, out, BUFFER_SIZE);
+ }
+
+ public static void transferStreamedData(InputStream in, OutputStream out, int bufferSize)
+ throws IOException {
+ byte[] buffer = new byte[bufferSize];
+ int read;
+ while ((read = in.read(buffer)) != -1) {
+ out.write(buffer, 0, read);
+ }
+ }
+
+ private Utils() {}
+}
diff --git a/services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java b/services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java
index 5810c30acbf5..646367e5a8ba 100644
--- a/services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/internal/PerformInitializeTaskTest.java
@@ -19,6 +19,7 @@ package com.android.server.backup.internal;
import static android.app.backup.BackupTransport.TRANSPORT_ERROR;
import static android.app.backup.BackupTransport.TRANSPORT_OK;
+import static com.android.server.backup.testing.TestUtils.assertLogcatContains;
import static com.android.server.backup.testing.TransportData.backupTransport;
import static com.android.server.backup.testing.TransportData.d2dTransport;
import static com.android.server.backup.testing.TransportData.localTransport;
@@ -40,6 +41,7 @@ import android.app.PendingIntent;
import android.app.backup.IBackupObserver;
import android.os.DeadObjectException;
import android.platform.test.annotations.Presubmit;
+import android.util.Log;
import com.android.internal.backup.IBackupTransport;
import com.android.server.backup.BackupManagerService;
@@ -50,6 +52,8 @@ import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.backup.transport.TransportClient;
import com.android.server.testing.FrameworkRobolectricTestRunner;
import com.android.server.testing.SystemLoaderPackages;
+import com.android.server.testing.shadows.ShadowSlog;
+
import org.junit.Before;
import org.junit.Test;
@@ -66,7 +70,7 @@ import java.util.List;
import java.util.stream.Stream;
@RunWith(FrameworkRobolectricTestRunner.class)
-@Config(manifest = Config.NONE, sdk = 26)
+@Config(manifest = Config.NONE, sdk = 26, shadows = ShadowSlog.class)
@SystemLoaderPackages({"com.android.server.backup"})
@Presubmit
public class PerformInitializeTaskTest {
@@ -202,6 +206,32 @@ public class PerformInitializeTaskTest {
}
@Test
+ public void testRun_whenFinishBackupFails_logs() throws Exception {
+ setUpTransport(mTransport);
+ configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR);
+ PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
+
+ performInitializeTask.run();
+
+ assertLogcatContains(
+ BackupManagerService.TAG,
+ log -> log.msg.contains("finishBackup()") && log.type >= Log.ERROR);
+ }
+
+ @Test
+ public void testRun_whenInitializeDeviceFails_logs() throws Exception {
+ setUpTransport(mTransport);
+ configureTransport(mTransportBinder, TRANSPORT_ERROR, 0);
+ PerformInitializeTask performInitializeTask = createPerformInitializeTask(mTransportName);
+
+ performInitializeTask.run();
+
+ assertLogcatContains(
+ BackupManagerService.TAG,
+ log -> log.msg.contains("initializeDevice()") && log.type >= Log.ERROR);
+ }
+
+ @Test
public void testRun_whenFinishBackupFails_schedulesAlarm() throws Exception {
setUpTransport(mTransport);
configureTransport(mTransportBinder, TRANSPORT_OK, TRANSPORT_ERROR);
diff --git a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
index 92d6bbd54fab..c51b75b748c9 100644
--- a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
+++ b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
@@ -77,10 +77,9 @@ import java.util.ArrayDeque;
@RunWith(FrameworkRobolectricTestRunner.class)
@Config(
- manifest = Config.NONE,
- sdk = 26,
- shadows = {ShadowEventLog.class, ShadowPerformUnifiedRestoreTask.class, ShadowBinder.class}
-)
+ manifest = Config.NONE,
+ sdk = 26,
+ shadows = {ShadowEventLog.class, ShadowPerformUnifiedRestoreTask.class, ShadowBinder.class})
@SystemLoaderPackages({"com.android.server.backup"})
@Presubmit
public class ActiveRestoreSessionTest {
@@ -130,6 +129,7 @@ public class ActiveRestoreSessionTest {
mWakeLock = createBackupWakeLock(application);
+ // TODO: Migrate to use spy(createInitializedBackupManagerService())
setUpBackupManagerServiceBasics(
mBackupManagerService,
application,
diff --git a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
index 5a886e33622f..522578fa4eae 100644
--- a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
+++ b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
@@ -16,13 +16,20 @@
package com.android.server.backup.testing;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+import android.annotation.Nullable;
import android.app.Application;
import android.app.IActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.PowerManager;
@@ -30,32 +37,118 @@ import android.util.SparseArray;
import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupManagerService;
+import com.android.server.backup.Trampoline;
import com.android.server.backup.TransportManager;
-import com.android.server.backup.internal.BackupHandler;
+import com.android.server.backup.internal.Operation;
+import org.mockito.stubbing.Answer;
+import org.robolectric.shadows.ShadowLog;
+import org.robolectric.shadows.ShadowLooper;
+import org.robolectric.shadows.ShadowSystemClock;
+
+import java.io.File;
import java.lang.Thread.UncaughtExceptionHandler;
+import java.util.concurrent.atomic.AtomicReference;
/** Test utils for {@link BackupManagerService} and friends. */
public class BackupManagerServiceTestUtils {
- /** Sets up basic mocks for {@link BackupManagerService}. */
+ public static BackupManagerService createInitializedBackupManagerService(
+ Context context, File baseStateDir, File dataDir, TransportManager transportManager) {
+ return createInitializedBackupManagerService(
+ context,
+ startBackupThread(null),
+ baseStateDir,
+ dataDir,
+ transportManager);
+ }
+
+ public static BackupManagerService createInitializedBackupManagerService(
+ Context context,
+ HandlerThread backupThread,
+ File baseStateDir,
+ File dataDir,
+ TransportManager transportManager) {
+ BackupManagerService backupManagerService =
+ new BackupManagerService(
+ context,
+ new Trampoline(context),
+ backupThread,
+ baseStateDir,
+ dataDir,
+ transportManager);
+ ShadowLooper shadowBackupLooper = shadowOf(backupThread.getLooper());
+ shadowBackupLooper.runToEndOfTasks();
+ // Handler instances have their own clock, so advancing looper (with runToEndOfTasks())
+ // above does NOT advance the handlers' clock, hence whenever a handler post messages with
+ // specific time to the looper the time of those messages will be before the looper's time.
+ // To fix this we advance SystemClock as well since that is from where the handlers read
+ // time.
+ ShadowSystemClock.setCurrentTimeMillis(shadowBackupLooper.getScheduler().getCurrentTime());
+ return backupManagerService;
+ }
+
+ /** Sets up basic mocks for {@link BackupManagerService} mock. */
+ @SuppressWarnings("ResultOfMethodCallIgnored")
public static void setUpBackupManagerServiceBasics(
BackupManagerService backupManagerService,
Context context,
TransportManager transportManager,
PackageManager packageManager,
- BackupHandler backupHandler,
+ Handler backupHandler,
PowerManager.WakeLock wakeLock,
BackupAgentTimeoutParameters agentTimeoutParameters) {
+ SparseArray<Operation> operations = new SparseArray<>();
+
when(backupManagerService.getContext()).thenReturn(context);
when(backupManagerService.getTransportManager()).thenReturn(transportManager);
when(backupManagerService.getPackageManager()).thenReturn(packageManager);
when(backupManagerService.getBackupHandler()).thenReturn(backupHandler);
when(backupManagerService.getCurrentOpLock()).thenReturn(new Object());
when(backupManagerService.getQueueLock()).thenReturn(new Object());
- when(backupManagerService.getCurrentOperations()).thenReturn(new SparseArray<>());
+ when(backupManagerService.getCurrentOperations()).thenReturn(operations);
when(backupManagerService.getActivityManager()).thenReturn(mock(IActivityManager.class));
when(backupManagerService.getWakelock()).thenReturn(wakeLock);
when(backupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
+
+ AccessorMock backupEnabled = mockAccessor(false);
+ doAnswer(backupEnabled.getter).when(backupManagerService).isBackupEnabled();
+ doAnswer(backupEnabled.setter).when(backupManagerService).setBackupEnabled(anyBoolean());
+
+ AccessorMock backupRunning = mockAccessor(false);
+ doAnswer(backupEnabled.getter).when(backupManagerService).isBackupRunning();
+ doAnswer(backupRunning.setter).when(backupManagerService).setBackupRunning(anyBoolean());
+
+ doAnswer(
+ invocation -> {
+ operations.put(invocation.getArgument(0), invocation.getArgument(1));
+ return null;
+ })
+ .when(backupManagerService)
+ .putOperation(anyInt(), any());
+ doAnswer(
+ invocation -> {
+ int token = invocation.getArgument(0);
+ operations.remove(token);
+ return null;
+ })
+ .when(backupManagerService)
+ .removeOperation(anyInt());
+ }
+
+ /**
+ * Returns one getter {@link Answer<T>} and one setter {@link Answer<T>} to be easily passed to
+ * Mockito mocking facilities.
+ *
+ * @param defaultValue Value returned by the getter if there was no setter call until then.
+ */
+ public static <T> AccessorMock<T> mockAccessor(T defaultValue) {
+ AtomicReference<T> holder = new AtomicReference<>(defaultValue);
+ return new AccessorMock<>(
+ invocation -> holder.get(),
+ invocation -> {
+ holder.set(invocation.getArgument(0));
+ return null;
+ });
}
public static PowerManager.WakeLock createBackupWakeLock(Application application) {
@@ -88,12 +181,38 @@ public class BackupManagerServiceTestUtils {
* @return The backup thread.
* @see #startBackupThreadAndGetLooper()
*/
- public static HandlerThread startBackupThread(UncaughtExceptionHandler exceptionHandler) {
+ public static HandlerThread startBackupThread(
+ @Nullable UncaughtExceptionHandler exceptionHandler) {
HandlerThread backupThread = new HandlerThread("backup");
backupThread.setUncaughtExceptionHandler(exceptionHandler);
backupThread.start();
return backupThread;
}
+ /**
+ * Similar to {@link #startBackupThread(UncaughtExceptionHandler)} but logging uncaught
+ * exceptions to logcat.
+ *
+ * @param tag Tag used for logging exceptions.
+ * @return The backup thread.
+ * @see #startBackupThread(UncaughtExceptionHandler)
+ */
+ public static HandlerThread startSilentBackupThread(String tag) {
+ return startBackupThread(
+ (thread, e) ->
+ ShadowLog.e(
+ tag, "Uncaught exception in test thread " + thread.getName(), e));
+ }
+
private BackupManagerServiceTestUtils() {}
+
+ public static class AccessorMock<T> {
+ public Answer<T> getter;
+ public Answer<T> setter;
+
+ private AccessorMock(Answer<T> getter, Answer<T> setter) {
+ this.getter = getter;
+ this.setter = setter;
+ }
+ }
}
diff --git a/services/robotests/src/com/android/server/backup/testing/TestUtils.java b/services/robotests/src/com/android/server/backup/testing/TestUtils.java
index 407a1bcaa2e7..3c84424c9630 100644
--- a/services/robotests/src/com/android/server/backup/testing/TestUtils.java
+++ b/services/robotests/src/com/android/server/backup/testing/TestUtils.java
@@ -18,12 +18,10 @@ package com.android.server.backup.testing;
import static com.google.common.truth.Truth.assertThat;
-
-import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
-
import org.robolectric.shadows.ShadowLog;
import java.util.concurrent.Callable;
+import java.util.function.Predicate;
public class TestUtils {
/** Reset logcat with {@link ShadowLog#reset()} before the test case */
@@ -38,6 +36,10 @@ public class TestUtils {
.isTrue();
}
+ public static void assertLogcatContains(String tag, Predicate<ShadowLog.LogItem> predicate) {
+ assertThat(ShadowLog.getLogsForTag(tag).stream().anyMatch(predicate)).isTrue();
+ }
+
/**
* Calls {@link Runnable#run()} and returns if no exception is thrown. Otherwise, if the
* exception is unchecked, rethrow it; if it's checked wrap in a {@link RuntimeException} and
@@ -81,5 +83,11 @@ public class TestUtils {
return new RuntimeException(e);
}
+ /** An equivalent of {@link Runnable} that allows throwing checked exceptions. */
+ @FunctionalInterface
+ public interface ThrowingRunnable {
+ void runOrThrow() throws Exception;
+ }
+
private TestUtils() {}
}
diff --git a/services/robotests/src/com/android/server/backup/testing/TransportTestUtils.java b/services/robotests/src/com/android/server/backup/testing/TransportTestUtils.java
index c00a61dde90a..6625443f9b8e 100644
--- a/services/robotests/src/com/android/server/backup/testing/TransportTestUtils.java
+++ b/services/robotests/src/com/android/server/backup/testing/TransportTestUtils.java
@@ -26,13 +26,13 @@ import static org.mockito.Mockito.when;
import static java.util.stream.Collectors.toList;
+import android.annotation.IntDef;
import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.RemoteException;
-import android.support.annotation.IntDef;
import com.android.internal.backup.IBackupTransport;
import com.android.server.backup.TransportManager;
@@ -42,6 +42,8 @@ import com.android.server.backup.transport.TransportNotRegisteredException;
import org.robolectric.shadows.ShadowPackageManager;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.stream.Stream;
@@ -55,6 +57,9 @@ public class TransportTestUtils {
ShadowPackageManager shadowPackageManager, TransportData... transports)
throws Exception {
for (TransportData transport : transports) {
+ if (transport.transportStatus == TransportStatus.UNREGISTERED) {
+ continue;
+ }
ComponentName transportComponent = transport.getTransportComponent();
String packageName = transportComponent.getPackageName();
ResolveInfo resolveInfo = resolveInfo(transportComponent);
@@ -79,10 +84,21 @@ public class TransportTestUtils {
/** {@code transportName} has to be in the {@link ComponentName} format (with '/') */
public static TransportMock setUpCurrentTransport(
TransportManager transportManager, TransportData transport) throws Exception {
- TransportMock transportMock = setUpTransports(transportManager, transport).get(0);
- if (transportMock.transportClient != null) {
+ TransportMock transportMock = setUpTransport(transportManager, transport);
+ int status = transport.transportStatus;
+ when(transportManager.getCurrentTransportName()).thenReturn(transport.transportName);
+ if (status == TransportStatus.REGISTERED_AVAILABLE
+ || status == TransportStatus.REGISTERED_UNAVAILABLE) {
+ // Transport registered
when(transportManager.getCurrentTransportClient(any()))
.thenReturn(transportMock.transportClient);
+ when(transportManager.getCurrentTransportClientOrThrow(any()))
+ .thenReturn(transportMock.transportClient);
+ } else {
+ // Transport not registered
+ when(transportManager.getCurrentTransportClient(any())).thenReturn(null);
+ when(transportManager.getCurrentTransportClientOrThrow(any()))
+ .thenThrow(TransportNotRegisteredException.class);
}
return transportMock;
}
@@ -195,6 +211,7 @@ public class TransportTestUtils {
TransportStatus.REGISTERED_UNAVAILABLE,
TransportStatus.UNREGISTERED
})
+ @Retention(RetentionPolicy.SOURCE)
public @interface TransportStatus {
int REGISTERED_AVAILABLE = 0;
int REGISTERED_UNAVAILABLE = 1;
diff --git a/services/robotests/src/com/android/server/location/GnssPositionModeTest.java b/services/robotests/src/com/android/server/location/GnssPositionModeTest.java
new file mode 100644
index 000000000000..e6d5355127b0
--- /dev/null
+++ b/services/robotests/src/com/android/server/location/GnssPositionModeTest.java
@@ -0,0 +1,61 @@
+package com.android.server.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.platform.test.annotations.Presubmit;
+
+import com.android.server.testing.FrameworkRobolectricTestRunner;
+import com.android.server.testing.SystemLoaderPackages;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import java.util.HashSet;
+
+/**
+ * Unit tests for {@link GnssPositionMode}.
+ */
+@RunWith(FrameworkRobolectricTestRunner.class)
+@Config(
+ manifest = Config.NONE,
+ sdk = 27
+)
+@SystemLoaderPackages({"com.android.server.location"})
+@Presubmit
+public class GnssPositionModeTest {
+
+ private GnssPositionMode positionMode1 = createGnssPositionMode(0, 1000);
+ private GnssPositionMode positionMode2 = createGnssPositionMode(0, 1000);
+ private GnssPositionMode positionMode3 = createGnssPositionMode(1, 1000);
+
+ @Test
+ public void testHashCode() {
+ assertThat(positionMode1.hashCode()).isEqualTo(positionMode2.hashCode());
+ assertThat(positionMode1.hashCode()).isNotEqualTo(positionMode3.hashCode());
+ assertThat(positionMode1.hashCode()).isNotEqualTo(positionMode3.hashCode());
+
+ HashSet<Integer> hashSet = new HashSet<>();
+ hashSet.add(positionMode1.hashCode());
+ hashSet.add(positionMode2.hashCode());
+ assertThat(hashSet.size()).isEqualTo(1);
+ hashSet.add(positionMode3.hashCode());
+ assertThat(hashSet.size()).isEqualTo(2);
+ }
+
+ @Test
+ public void checkIfEqualsImpliesSameHashCode() {
+ assertTEqualsImpliesSameHashCode(positionMode1, positionMode2);
+ assertTEqualsImpliesSameHashCode(positionMode2, positionMode3);
+ }
+
+ private void assertTEqualsImpliesSameHashCode(GnssPositionMode mode1, GnssPositionMode mode2) {
+ if (mode1.equals(mode2)) {
+ assertThat(mode1.hashCode()).isEqualTo(mode2.hashCode());
+ }
+ }
+
+ private GnssPositionMode createGnssPositionMode(int mode, int minInterval) {
+ return new GnssPositionMode(mode, 0, minInterval, 0, 0, true);
+ }
+}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java b/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
index c3b2f0d769a0..21faa090f003 100644
--- a/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
@@ -17,6 +17,8 @@
package com.android.server.testing.shadows;
import android.annotation.Nullable;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.android.server.backup.transport.TransportClient;
@@ -25,22 +27,49 @@ import com.android.server.backup.utils.AppBackupUtils;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
-import java.util.function.Function;
+import java.util.HashSet;
+import java.util.Set;
@Implements(AppBackupUtils.class)
public class ShadowAppBackupUtils {
- public static Function<String, Boolean> sAppIsRunningAndEligibleForBackupWithTransport;
- static {
- reset();
+ private static final Set<String> sAppsRunningAndEligibleForBackupWithTransport =
+ new HashSet<>();
+ private static final Set<String> sAppsEligibleForBackup = new HashSet<>();
+ private static final Set<String> sAppsGetFullBackup = new HashSet<>();
+
+ public static void setAppRunningAndEligibleForBackupWithTransport(String packageName) {
+ sAppsEligibleForBackup.add(packageName);
+ sAppsRunningAndEligibleForBackupWithTransport.add(packageName);
+ }
+
+ public static void setAppEligibleForBackup(String packageName) {
+ sAppsEligibleForBackup.add(packageName);
+ }
+
+ /** By default the app will be key-value. */
+ public static void setAppGetsFullBackup(String packageName) {
+ sAppsGetFullBackup.add(packageName);
}
@Implementation
public static boolean appIsRunningAndEligibleForBackupWithTransport(
@Nullable TransportClient transportClient, String packageName, PackageManager pm) {
- return sAppIsRunningAndEligibleForBackupWithTransport.apply(packageName);
+ return sAppsRunningAndEligibleForBackupWithTransport.contains(packageName);
+ }
+
+ @Implementation
+ public static boolean appIsEligibleForBackup(ApplicationInfo app, PackageManager pm) {
+ return sAppsEligibleForBackup.contains(app.packageName);
+ }
+
+ @Implementation
+ public static boolean appGetsFullBackup(PackageInfo packageInfo) {
+ return sAppsGetFullBackup.contains(packageInfo.packageName);
}
public static void reset() {
- sAppIsRunningAndEligibleForBackupWithTransport = p -> true;
+ sAppsRunningAndEligibleForBackupWithTransport.clear();
+ sAppsEligibleForBackup.clear();
+ sAppsGetFullBackup.clear();
}
}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowBackupDataOutput.java b/services/robotests/src/com/android/server/testing/shadows/ShadowBackupDataOutput.java
index e78a4b3cdf65..0415235a4d1c 100644
--- a/services/robotests/src/com/android/server/testing/shadows/ShadowBackupDataOutput.java
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowBackupDataOutput.java
@@ -40,6 +40,7 @@ public class ShadowBackupDataOutput {
@Implementation
public void __constructor__(FileDescriptor fd, long quota, int transportFlags) {
try {
+ // This writes 4 bytes
mOutput = new ObjectOutputStream(new FileOutputStream(fd));
} catch (IOException e) {
throw new AssertionError(e);
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowBinder.java b/services/robotests/src/com/android/server/testing/shadows/ShadowBinder.java
new file mode 100644
index 000000000000..043d44bdeaea
--- /dev/null
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowBinder.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.testing.shadows;
+
+import android.os.Binder;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+/**
+ * Extends {@link org.robolectric.shadows.ShadowBinder} with {@link Binder#clearCallingIdentity()}
+ * and {@link Binder#restoreCallingIdentity(long)}. Uses a hardcoded default {@link #LOCAL_UID} to
+ * mimic the local process uid.
+ */
+@Implements(Binder.class)
+public class ShadowBinder extends org.robolectric.shadows.ShadowBinder {
+ public static final Integer LOCAL_UID = 1000;
+ private static Integer originalCallingUid;
+
+ @Implementation
+ public static long clearCallingIdentity() {
+ originalCallingUid = getCallingUid();
+ setCallingUid(LOCAL_UID);
+ return 1L;
+ }
+
+ @Implementation
+ public static void restoreCallingIdentity(long token) {
+ setCallingUid(originalCallingUid);
+ }
+}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java b/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java
new file mode 100644
index 000000000000..3941f1754054
--- /dev/null
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowKeyValueBackupJob.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.testing.shadows;
+
+import android.content.Context;
+import android.os.Binder;
+import com.android.server.backup.BackupManagerConstants;
+import com.android.server.backup.KeyValueBackupJob;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(KeyValueBackupJob.class)
+public class ShadowKeyValueBackupJob {
+ private static int callingUid;
+
+ public static int getCallingUid() {
+ return callingUid;
+ }
+
+ @Implementation
+ public static void schedule(Context ctx, long delay, BackupManagerConstants constants) {
+ callingUid = Binder.getCallingUid();
+ }
+}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowPerformBackupTask.java b/services/robotests/src/com/android/server/testing/shadows/ShadowPerformBackupTask.java
new file mode 100644
index 000000000000..7c10377d0ec7
--- /dev/null
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowPerformBackupTask.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.testing.shadows;
+
+import android.annotation.Nullable;
+import android.app.backup.IBackupManagerMonitor;
+import android.app.backup.IBackupObserver;
+
+import com.android.server.backup.BackupManagerService;
+import com.android.server.backup.DataChangedJournal;
+import com.android.server.backup.internal.BackupRequest;
+import com.android.server.backup.internal.OnTaskFinishedListener;
+import com.android.server.backup.internal.PerformBackupTask;
+import com.android.server.backup.transport.TransportClient;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Implements(PerformBackupTask.class)
+public class ShadowPerformBackupTask {
+ @Nullable private static ShadowPerformBackupTask sLastShadow;
+
+ /**
+ * Retrieves the shadow for the last {@link PerformBackupTask} object created.
+ *
+ * @return The shadow or {@code null} if no object created since last {@link #reset()}.
+ */
+ @Nullable
+ public static ShadowPerformBackupTask getLastCreated() {
+ return sLastShadow;
+ }
+
+ public static void reset() {
+ sLastShadow = null;
+ }
+
+ private OnTaskFinishedListener mListener;
+ private ArrayList<BackupRequest> mQueue;
+ private List<String> mPendingFullBackups;
+
+ @Implementation
+ public void __constructor__(
+ BackupManagerService backupManagerService,
+ TransportClient transportClient,
+ String dirName,
+ ArrayList<BackupRequest> queue,
+ @Nullable DataChangedJournal journal,
+ IBackupObserver observer,
+ IBackupManagerMonitor monitor,
+ @Nullable OnTaskFinishedListener listener,
+ List<String> pendingFullBackups,
+ boolean userInitiated,
+ boolean nonIncremental) {
+ mListener = listener;
+ mQueue = queue;
+ mPendingFullBackups = pendingFullBackups;
+ sLastShadow = this;
+ }
+
+ @Implementation
+ public void execute() {
+ mListener.onFinished("ShadowPerformBackupTask.execute()");
+ }
+
+ public List<BackupRequest> getQueue() {
+ return mQueue;
+ }
+
+ public List<String> getPendingFullBackups() {
+ return mPendingFullBackups;
+ }
+}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java b/services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java
index bf4b61e7aa09..737b0c85d861 100644
--- a/services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowSlog.java
@@ -26,6 +26,86 @@ import org.robolectric.shadows.ShadowLog;
@Implements(Slog.class)
public class ShadowSlog {
@Implementation
+ public static int v(String tag, String msg) {
+ return Log.v(tag, msg);
+ }
+
+ @Implementation
+ public static int v(String tag, String msg, Throwable tr) {
+ return Log.v(tag, msg, tr);
+ }
+
+ @Implementation
+ public static int d(String tag, String msg) {
+ return Log.d(tag, msg);
+ }
+
+ @Implementation
+ public static int d(String tag, String msg, Throwable tr) {
+ return Log.d(tag, msg, tr);
+ }
+
+ @Implementation
+ public static int i(String tag, String msg) {
+ return Log.i(tag, msg);
+ }
+
+ @Implementation
+ public static int i(String tag, String msg, Throwable tr) {
+ return Log.i(tag, msg, tr);
+ }
+
+ @Implementation
+ public static int w(String tag, String msg) {
+ return Log.w(tag, msg);
+ }
+
+ @Implementation
+ public static int w(String tag, String msg, Throwable tr) {
+ return Log.w(tag, msg, tr);
+ }
+
+ @Implementation
+ public static int w(String tag, Throwable tr) {
+ return Log.w(tag, tr);
+ }
+
+ @Implementation
+ public static int e(String tag, String msg) {
+ return Log.e(tag, msg);
+ }
+
+ @Implementation
+ public static int e(String tag, String msg, Throwable tr) {
+ return Log.e(tag, msg, tr);
+ }
+
+ @Implementation
+ public static int wtf(String tag, String msg) {
+ return Log.wtf(tag, msg);
+ }
+
+ @Implementation
+ public static void wtfQuiet(String tag, String msg) {
+ Log.wtf(tag, msg);
+ }
+
+ @Implementation
+ public static int wtfStack(String tag, String msg) {
+ return Log.wtf(tag, msg);
+ }
+
+ @Implementation
+ public static int wtf(String tag, Throwable tr) {
+ return Log.wtf(tag, tr);
+ }
+
+ @Implementation
+ public static int wtf(String tag, String msg, Throwable tr) {
+ return Log.wtf(tag, msg, tr);
+ }
+
+ @Implementation
public static int println(int priority, String tag, String msg) {
return Log.println(priority, tag, msg);
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
index e5c6c6e51430..412e8445fef9 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
@@ -141,4 +141,15 @@ public class AccessibilityServiceConnectionTest {
when(mMockUserState.getBindingServicesLocked())
.thenReturn(new HashSet<>(Arrays.asList(componentName)));
}
+
+ @Test
+ public void binderDied_keysGetFlushed() {
+ IBinder mockBinder = mock(IBinder.class);
+ setServiceBinding(COMPONENT_NAME);
+ mConnection.bindLocked();
+ mConnection.onServiceConnected(COMPONENT_NAME, mockBinder);
+ mConnection.binderDied();
+ assertTrue(mConnection.getServiceInfo().crashed);
+ verify(mMockKeyEventDispatcher).flush(mConnection);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java
index f741c70e4821..583a9dd3a342 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityLaunchParamsModifierTests.java
@@ -50,7 +50,7 @@ import static com.android.server.am.LaunchParamsController.LaunchParamsModifier.
@RunWith(AndroidJUnit4.class)
public class ActivityLaunchParamsModifierTests extends ActivityTestsBase {
private ActivityLaunchParamsModifier mModifier;
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private ActivityStack mStack;
private TaskRecord mTask;
private ActivityRecord mActivity;
@@ -62,7 +62,7 @@ public class ActivityLaunchParamsModifierTests extends ActivityTestsBase {
@Override
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mModifier = new ActivityLaunchParamsModifier(mService.mStackSupervisor);
mCurrent = new LaunchParams();
mResult = new LaunchParams();
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java
new file mode 100644
index 000000000000..28b37c58c799
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityOptionsTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.am;
+
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
+import static org.junit.Assert.assertEquals;
+
+import android.app.ActivityOptions;
+import android.os.Bundle;
+import android.os.Debug;
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.FlakyTest;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/**
+ * atest FrameworksServicesTests:ActivityOptionsTest
+ */
+@MediumTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class ActivityOptionsTest {
+
+ @Test
+ public void testMerge_NoClobber() {
+ // Construct some options with set values
+ ActivityOptions opts = ActivityOptions.makeBasic();
+ opts.setLaunchDisplayId(Integer.MAX_VALUE);
+ opts.setLaunchActivityType(ACTIVITY_TYPE_STANDARD);
+ opts.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ opts.setAvoidMoveToFront();
+ opts.setLaunchTaskId(Integer.MAX_VALUE);
+ opts.setLockTaskEnabled(true);
+ opts.setRotationAnimationHint(ROTATION_ANIMATION_ROTATE);
+ opts.setTaskOverlay(true, true);
+ opts.setSplitScreenCreateMode(SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT);
+ Bundle optsBundle = opts.toBundle();
+
+ // Try and merge the constructed options with a new set of options
+ optsBundle.putAll(ActivityOptions.makeBasic().toBundle());
+
+ // Ensure the set values are not clobbered
+ ActivityOptions restoredOpts = ActivityOptions.fromBundle(optsBundle);
+ assertEquals(Integer.MAX_VALUE, restoredOpts.getLaunchDisplayId());
+ assertEquals(ACTIVITY_TYPE_STANDARD, restoredOpts.getLaunchActivityType());
+ assertEquals(WINDOWING_MODE_FULLSCREEN, restoredOpts.getLaunchWindowingMode());
+ assertEquals(true, restoredOpts.getAvoidMoveToFront());
+ assertEquals(Integer.MAX_VALUE, restoredOpts.getLaunchTaskId());
+ assertEquals(true, restoredOpts.getLockTaskMode());
+ assertEquals(ROTATION_ANIMATION_ROTATE, restoredOpts.getRotationAnimationHint());
+ assertEquals(true, restoredOpts.getTaskOverlay());
+ assertEquals(true, restoredOpts.canTaskOverlayResume());
+ assertEquals(SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT,
+ restoredOpts.getSplitScreenCreateMode());
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
index 5ee1c405bb0e..dd3e5a8a33fe 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
@@ -73,7 +73,7 @@ import org.mockito.invocation.InvocationOnMock;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class ActivityRecordTests extends ActivityTestsBase {
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private TestActivityStack mStack;
private TaskRecord mTask;
private ActivityRecord mActivity;
@@ -83,7 +83,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
mTask = new TaskBuilder(mService.mStackSupervisor).setStack(mStack).build();
@@ -126,7 +126,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
pauseFound.value = true;
}
return null;
- }).when(mActivity.app.thread).scheduleTransaction(any());
+ }).when(mActivity.app.getThread()).scheduleTransaction(any());
mActivity.setState(STOPPED, "testPausingWhenVisibleFromStopped");
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
index 1ce41a641935..f92ca5f02d2b 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
@@ -68,7 +68,7 @@ import java.util.ArrayList;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class ActivityStackSupervisorTests extends ActivityTestsBase {
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private ActivityStackSupervisor mSupervisor;
private ActivityStack mFullscreenStack;
@@ -77,7 +77,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mSupervisor = mService.mStackSupervisor;
mFullscreenStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
@@ -174,7 +174,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
// #notifyAll will be called on the ActivityManagerService. we must hold the object lock
// when this happens.
- synchronized (mSupervisor.mService) {
+ synchronized (mSupervisor.mService.mGlobalLock) {
final WaitResult taskToFrontWait = new WaitResult();
mSupervisor.mWaitingActivityLaunched.add(taskToFrontWait);
mSupervisor.reportWaitingActivityLaunchedIfNeeded(firstActivity, START_TASK_TO_FRONT);
@@ -278,7 +278,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
assertEquals(originalStackCount + 1, defaultDisplay.getChildCount());
// Let's pretend that the app has crashed.
- firstActivity.app.thread = null;
+ firstActivity.app.setThread(null);
mService.mStackSupervisor.finishTopCrashedActivitiesLocked(firstActivity.app, "test");
// Verify that the stack was removed.
@@ -407,4 +407,27 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
// Assert that the primary stack is returned.
assertEquals(primaryStack, result);
}
+
+ /**
+ * Verify split-screen primary stack & task can resized by
+ * {@link android.app.IActivityTaskManager#resizeDockedStack} as expect.
+ */
+ @Test
+ public void testResizeDockedStackForSplitScreenPrimary() throws Exception {
+ final Rect TASK_SIZE = new Rect(0, 0, 600, 600);
+ final Rect STACK_SIZE = new Rect(0, 0, 300, 300);
+
+ // Create primary split-screen stack with a task.
+ final ActivityStack primaryStack = mService.mStackSupervisor.getDefaultDisplay()
+ .createStack(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
+ true /* onTop */);
+ final TaskRecord task = new TaskBuilder(mSupervisor).setStack(primaryStack).build();
+
+ // Resize dock stack.
+ mService.resizeDockedStack(STACK_SIZE, TASK_SIZE, null, null, null);
+
+ // Verify dock stack & its task bounds if is equal as resized result.
+ assertEquals(primaryStack.getBounds(), STACK_SIZE);
+ assertEquals(task.getBounds(), TASK_SIZE);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index 01425ed51b55..6290751576b2 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -19,6 +19,7 @@ package com.android.server.am;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
@@ -61,7 +62,7 @@ import org.junit.Test;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class ActivityStackTests extends ActivityTestsBase {
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private ActivityStackSupervisor mSupervisor;
private ActivityDisplay mDefaultDisplay;
private ActivityStack mStack;
@@ -72,7 +73,7 @@ public class ActivityStackTests extends ActivityTestsBase {
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mSupervisor = mService.mStackSupervisor;
mDefaultDisplay = mService.mStackSupervisor.getDefaultDisplay();
mStack = mDefaultDisplay.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
@@ -473,6 +474,51 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
+ public void testSetAlwaysOnTop() {
+ final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
+ final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
+ WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ assertTrue(mDefaultDisplay.getStackAbove(homeStack) == pinnedStack);
+
+ final TestActivityStack alwaysOnTopStack = createStackForShouldBeVisibleTest(
+ mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
+ true /* onTop */);
+ alwaysOnTopStack.setAlwaysOnTop(true);
+ assertTrue(alwaysOnTopStack.isAlwaysOnTop());
+ // Ensure (non-pinned) always on top stack is put below pinned stack.
+ assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack) == pinnedStack);
+
+ final TestActivityStack nonAlwaysOnTopStack = createStackForShouldBeVisibleTest(
+ mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+ true /* onTop */);
+ // Ensure non always on top stack is put below always on top stacks.
+ assertTrue(mDefaultDisplay.getStackAbove(nonAlwaysOnTopStack) == alwaysOnTopStack);
+
+ final TestActivityStack alwaysOnTopStack2 = createStackForShouldBeVisibleTest(
+ mDefaultDisplay, WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD,
+ true /* onTop */);
+ alwaysOnTopStack2.setAlwaysOnTop(true);
+ assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
+ // Ensure newly created always on top stack is placed above other all always on top stacks.
+ assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack2) == pinnedStack);
+
+ alwaysOnTopStack2.setAlwaysOnTop(false);
+ // Ensure, when always on top is turned off for a stack, the stack is put just below all
+ // other always on top stacks.
+ assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack2) == alwaysOnTopStack);
+ alwaysOnTopStack2.setAlwaysOnTop(true);
+
+ // Ensure always on top state changes properly when windowing mode changes.
+ alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ assertFalse(alwaysOnTopStack2.isAlwaysOnTop());
+ assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack2) == alwaysOnTopStack);
+ alwaysOnTopStack2.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ assertTrue(alwaysOnTopStack2.isAlwaysOnTop());
+ assertTrue(mDefaultDisplay.getStackAbove(alwaysOnTopStack2) == pinnedStack);
+ }
+
+ @Test
public void testSplitScreenMoveToFront() throws Exception {
final TestActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(
mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
index 7948e4cfcaaa..f5ae46cd19ed 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java
@@ -19,7 +19,9 @@ package com.android.server.am;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import android.app.IApplicationThread;
import android.content.Intent;
+import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -49,7 +51,7 @@ import java.util.Random;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class ActivityStartControllerTests extends ActivityTestsBase {
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private ActivityStartController mController;
private Factory mFactory;
private ActivityStarter mStarter;
@@ -57,11 +59,11 @@ public class ActivityStartControllerTests extends ActivityTestsBase {
@Override
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mFactory = mock(Factory.class);
mController = new ActivityStartController(mService, mService.mStackSupervisor, mFactory);
- mStarter = spy(new ActivityStarter(mController, mService, mService.mStackSupervisor,
- mock(ActivityStartInterceptor.class)));
+ mStarter = spy(new ActivityStarter(mController, mService,
+ mService.mStackSupervisor, mock(ActivityStartInterceptor.class)));
doReturn(mStarter).when(mFactory).obtain();
}
@@ -77,11 +79,14 @@ public class ActivityStartControllerTests extends ActivityTestsBase {
final int startFlags = random.nextInt();
final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- final ProcessRecord process= new ProcessRecord(null, null,
- mService.mContext.getApplicationInfo(), "name", 12345);
+ final WindowProcessController wpc = new WindowProcessController(mService,
+ mService.mContext.getApplicationInfo(), "name", 12345,
+ UserHandle.getUserId(12345), mock(Object.class),
+ mock(WindowProcessListener.class));
+ wpc.setThread(mock(IApplicationThread.class));
mController.addPendingActivityLaunch(
- new PendingActivityLaunch(activity, source, startFlags, stack, process));
+ new PendingActivityLaunch(activity, source, startFlags, stack, wpc));
final boolean resume = random.nextBoolean();
mController.doPendingActivityLaunches(resume);
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
index b4b34c507942..420987d03509 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
@@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.when;
+import android.app.ActivityManagerInternal;
import android.app.KeyguardManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.content.Context;
@@ -37,11 +38,13 @@ import android.content.pm.PackageManagerInternal;
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManager;
+import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.testing.DexmakerShareClassLoaderRule;
import com.android.internal.app.SuspendedAppActivity;
import com.android.internal.app.UnlaunchableAppActivity;
+import com.android.internal.app.HarmfulAppWarningActivity;
import com.android.server.LocalServices;
import com.android.server.pm.PackageManagerService;
@@ -55,8 +58,9 @@ import org.mockito.MockitoAnnotations;
* Unit tests for {@link ActivityStartInterceptorTest}.
*
* Build/Install/Run:
- * bit FrameworksServicesTests:com.android.server.am.ActivityStartInterceptorTest
+ * atest FrameworksServicesTests:com.android.server.am.ActivityStartInterceptorTest
*/
+@Presubmit
@SmallTest
public class ActivityStartInterceptorTest {
private static final int TEST_USER_ID = 1;
@@ -79,7 +83,9 @@ public class ActivityStartInterceptorTest {
@Mock
private Context mContext;
@Mock
- private ActivityManagerService mService;
+ private ActivityManagerService mAm;
+ @Mock
+ private ActivityTaskManagerService mService;
@Mock
private ActivityStackSupervisor mSupervisor;
@Mock
@@ -89,11 +95,11 @@ public class ActivityStartInterceptorTest {
@Mock
private UserManager mUserManager;
@Mock
- private UserController mUserController;
- @Mock
private KeyguardManager mKeyguardManager;
@Mock
private PackageManagerService mPackageManager;
+ @Mock
+ private ActivityManagerInternal mAmInternal;
private ActivityStartInterceptor mInterceptor;
private ActivityInfo mAInfo = new ActivityInfo();
@@ -101,19 +107,23 @@ public class ActivityStartInterceptorTest {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mInterceptor = new ActivityStartInterceptor(mService, mSupervisor, mContext,
- mUserController);
+ mService.mAm = mAm;
+ mService.mAmInternal = mAmInternal;
+ mInterceptor = new ActivityStartInterceptor(mService, mSupervisor, mContext);
mInterceptor.setStates(TEST_USER_ID, TEST_REAL_CALLING_PID, TEST_REAL_CALLING_UID,
TEST_START_FLAGS, TEST_CALLING_PACKAGE);
+ // Mock ActivityManagerInternal
+ LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+ LocalServices.addService(ActivityManagerInternal.class, mAmInternal);
+
// Mock DevicePolicyManagerInternal
LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
LocalServices.addService(DevicePolicyManagerInternal.class,
mDevicePolicyManager);
- when(mDevicePolicyManager
- .createShowAdminSupportIntent(TEST_USER_ID, true))
+ when(mDevicePolicyManager.createShowAdminSupportIntent(TEST_USER_ID, true))
.thenReturn(ADMIN_SUPPORT_INTENT);
- when(mService.getPackageManagerInternalLocked()).thenReturn(mPackageManagerInternal);
+ when(mAm.getPackageManagerInternalLocked()).thenReturn(mPackageManagerInternal);
// Mock UserManager
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
@@ -126,7 +136,7 @@ public class ActivityStartInterceptorTest {
thenReturn(CONFIRM_CREDENTIALS_INTENT);
// Mock PackageManager
- when(mService.getPackageManager()).thenReturn(mPackageManager);
+ when(mAm.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.getHarmfulAppWarning(TEST_PACKAGE_NAME, TEST_USER_ID))
.thenReturn(null);
@@ -188,7 +198,7 @@ public class ActivityStartInterceptorTest {
@Test
public void testWorkChallenge() {
// GIVEN that the user the activity is starting as is currently locked
- when(mUserController.shouldConfirmCredentials(TEST_USER_ID)).thenReturn(true);
+ when(mAmInternal.shouldConfirmCredentials(TEST_USER_ID)).thenReturn(true);
// THEN calling intercept returns true
mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null);
@@ -198,6 +208,20 @@ public class ActivityStartInterceptorTest {
}
@Test
+ public void testHarmfulAppWarning() {
+ // GIVEN the package we're about to launch has a harmful app warning set
+ when(mPackageManager.getHarmfulAppWarning(TEST_PACKAGE_NAME, TEST_USER_ID))
+ .thenReturn("This app is bad");
+
+ // THEN calling intercept returns true
+ assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null));
+
+ // THEN the returned intent is the harmful app warning intent
+ assertTrue(mInterceptor.mIntent.getComponent().getClassName().equals(
+ HarmfulAppWarningActivity.class.getName()));
+ }
+
+ @Test
public void testNoInterception() {
// GIVEN that none of the interception conditions are met
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
index 1520859d4aac..267e689f0a91 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
@@ -88,7 +88,7 @@ import java.util.ArrayList;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class ActivityStarterTests extends ActivityTestsBase {
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private ActivityStarter mStarter;
private ActivityStartController mController;
@@ -107,7 +107,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
@Override
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mController = mock(ActivityStartController.class);
mStarter = new ActivityStarter(mController, mService, mService.mStackSupervisor,
mock(ActivityStartInterceptor.class));
@@ -189,20 +189,21 @@ public class ActivityStarterTests extends ActivityTestsBase {
*/
private void verifyStartActivityPreconditions(int preconditions, int launchFlags,
int expectedResult) {
- final ActivityManagerService service = createActivityManagerService();
+ final ActivityTaskManagerService service = mService;
final IPackageManager packageManager = mock(IPackageManager.class);
final ActivityStartController controller = mock(ActivityStartController.class);
final ActivityStarter starter = new ActivityStarter(controller, service,
service.mStackSupervisor, mock(ActivityStartInterceptor.class));
+ prepareStarter(launchFlags);
final IApplicationThread caller = mock(IApplicationThread.class);
// If no caller app, return {@code null} {@link ProcessRecord}.
final ProcessRecord record = containsConditions(preconditions, PRECONDITION_NO_CALLER_APP)
- ? null : new ProcessRecord(null, mock(BatteryStatsImpl.class),
+ ? null : new ProcessRecord(service.mAm, mock(BatteryStatsImpl.class),
mock(ApplicationInfo.class), null, 0);
- doReturn(record).when(service).getRecordForAppLocked(anyObject());
+ doReturn(record).when(service.mAm).getRecordForAppLocked(anyObject());
final Intent intent = new Intent();
intent.setFlags(launchFlags);
@@ -236,8 +237,8 @@ public class ActivityStarterTests extends ActivityTestsBase {
}
if (containsConditions(preconditions, PRECONDITION_DISALLOW_APP_SWITCHING)) {
- doReturn(false).when(service).checkAppSwitchAllowedLocked(anyInt(), anyInt(), anyInt(),
- anyInt(), any());
+ doReturn(false).when(service).checkAppSwitchAllowedLocked(
+ anyInt(), anyInt(), anyInt(), anyInt(), any());
}
if (containsConditions(preconditions,PRECONDITION_CANNOT_START_ANY_ACTIVITY)) {
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index 1cd111fce0ec..f2d3eb6acd47 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -29,11 +29,14 @@ import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
import com.android.server.wm.DisplayWindowController;
import org.junit.Rule;
+import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import android.app.IApplicationThread;
@@ -48,6 +51,7 @@ import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.os.HandlerThread;
import android.os.Looper;
+import android.os.UserHandle;
import android.service.voice.IVoiceInteractionSession;
import android.support.test.InstrumentationRegistry;
import android.testing.DexmakerShareClassLoaderRule;
@@ -101,19 +105,36 @@ public class ActivityTestsBase {
mHandlerThread.quitSafely();
}
- protected ActivityManagerService createActivityManagerService() {
- final ActivityManagerService service =
- setupActivityManagerService(new TestActivityManagerService(mContext));
+ protected ActivityTaskManagerService createActivityTaskManagerService() {
+ final TestActivityTaskManagerService atm =
+ spy(new TestActivityTaskManagerService(mContext));
+ setupActivityManagerService(atm);
+ return atm;
+ }
+
+ ActivityManagerService createActivityManagerService() {
+ final TestActivityTaskManagerService atm =
+ spy(new TestActivityTaskManagerService(mContext));
+ return setupActivityManagerService(atm);
+ }
+
+ ActivityManagerService setupActivityManagerService(TestActivityTaskManagerService atm) {
+ final ActivityManagerService am = spy(new TestActivityManagerService(mContext, atm));
+ setupActivityManagerService(am, atm);
AttributeCache.init(mContext);
- return service;
+ return am;
}
- protected ActivityManagerService setupActivityManagerService(ActivityManagerService service) {
- service = spy(service);
- doReturn(mock(IPackageManager.class)).when(service).getPackageManager();
- doNothing().when(service).grantEphemeralAccessLocked(anyInt(), any(), anyInt(), anyInt());
- service.mWindowManager = prepareMockWindowManager();
- return service;
+ void setupActivityManagerService(ActivityManagerService am, ActivityTaskManagerService atm) {
+ atm.setActivityManagerService(am);
+ atm.mAmInternal = am.new LocalService();
+ am.mAtmInternal = atm.new LocalService();
+ // Makes sure the supervisor is using with the spy object.
+ atm.mStackSupervisor.setService(atm);
+ doReturn(mock(IPackageManager.class)).when(am).getPackageManager();
+ doNothing().when(am).grantEphemeralAccessLocked(anyInt(), any(), anyInt(), anyInt());
+ am.mWindowManager = prepareMockWindowManager();
+ atm.setWindowManager(am.mWindowManager);
}
/**
@@ -125,7 +146,7 @@ public class ActivityTestsBase {
- private final ActivityManagerService mService;
+ private final ActivityTaskManagerService mService;
private ComponentName mComponent;
private TaskRecord mTaskRecord;
@@ -134,7 +155,7 @@ public class ActivityTestsBase {
private ActivityStack mStack;
private int mActivityFlags;
- ActivityBuilder(ActivityManagerService service) {
+ ActivityBuilder(ActivityTaskManagerService service) {
mService = service;
}
@@ -205,10 +226,12 @@ public class ActivityTestsBase {
mTaskRecord.addActivityToTop(activity);
}
- activity.setProcess(new ProcessRecord(null, null,
- mService.mContext.getApplicationInfo(), "name", 12345));
- activity.app.thread = mock(IApplicationThread.class);
-
+ final WindowProcessController wpc = new WindowProcessController(mService,
+ mService.mContext.getApplicationInfo(), "name", 12345,
+ UserHandle.getUserId(12345), mock(Object.class),
+ mock(WindowProcessListener.class));
+ wpc.setThread(mock(IApplicationThread.class));
+ activity.setProcess(wpc);
return activity;
}
}
@@ -316,7 +339,7 @@ public class ActivityTestsBase {
}
private static class TestTaskRecord extends TaskRecord {
- TestTaskRecord(ActivityManagerService service, int _taskId, ActivityInfo info,
+ TestTaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info,
Intent _intent, IVoiceInteractionSession _voiceSession,
IVoiceInteractor _voiceInteractor) {
super(service, _taskId, info, _intent, _voiceSession, _voiceInteractor);
@@ -333,32 +356,24 @@ public class ActivityTestsBase {
}
}
- /**
- * An {@link ActivityManagerService} subclass which provides a test
- * {@link ActivityStackSupervisor}.
- */
- protected static class TestActivityManagerService extends ActivityManagerService {
- private ClientLifecycleManager mLifecycleManager;
+ protected static class TestActivityTaskManagerService extends ActivityTaskManagerService {
private LockTaskController mLockTaskController;
- TestActivityManagerService(Context context) {
+ TestActivityTaskManagerService(Context context) {
super(context);
mSupportsMultiWindow = true;
mSupportsMultiDisplay = true;
mSupportsSplitScreenMultiWindow = true;
mSupportsFreeformWindowManagement = true;
mSupportsPictureInPicture = true;
- mWindowManager = WindowTestUtils.getMockWindowManagerService();
}
@Override
- public ClientLifecycleManager getLifecycleManager() {
- if (mLifecycleManager == null) {
- return super.getLifecycleManager();
- }
- return mLifecycleManager;
+ int handleIncomingUser(int callingPid, int callingUid, int userId, String name) {
+ return userId;
}
+ @Override
public LockTaskController getLockTaskController() {
if (mLockTaskController == null) {
mLockTaskController = spy(super.getLockTaskController());
@@ -367,10 +382,6 @@ public class ActivityTestsBase {
return mLockTaskController;
}
- void setLifecycleManager(ClientLifecycleManager manager) {
- mLifecycleManager = manager;
- }
-
@Override
final protected ActivityStackSupervisor createStackSupervisor() {
final ActivityStackSupervisor supervisor = spy(createTestSupervisor());
@@ -397,12 +408,28 @@ public class ActivityTestsBase {
}
protected ActivityStackSupervisor createTestSupervisor() {
- return new TestActivityStackSupervisor(this, mHandlerThread.getLooper());
+ return new TestActivityStackSupervisor(this, mH.getLooper());
+ }
+ }
+
+ /**
+ * An {@link ActivityManagerService} subclass which provides a test
+ * {@link ActivityStackSupervisor}.
+ */
+ protected static class TestActivityManagerService extends ActivityManagerService {
+
+ TestActivityManagerService(Context context, TestActivityTaskManagerService atm) {
+ super(context, atm);
}
@Override
void updateUsageStats(ActivityRecord component, boolean resumed) {
}
+
+ @Override
+ Configuration getGlobalConfiguration() {
+ return mContext.getResources().getConfiguration();
+ }
}
/**
@@ -413,7 +440,7 @@ public class ActivityTestsBase {
private ActivityDisplay mDisplay;
private KeyguardController mKeyguardController;
- public TestActivityStackSupervisor(ActivityManagerService service, Looper looper) {
+ public TestActivityStackSupervisor(ActivityTaskManagerService service, Looper looper) {
super(service, looper);
mDisplayManager =
(DisplayManager) mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
diff --git a/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java b/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java
index ce88d849a1d4..f74d11645be4 100644
--- a/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AssistDataRequesterTest.java
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.mock;
import android.app.AppOpsManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
@@ -87,6 +88,7 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
private Object mCallbacksLock;
private Handler mHandler;
private IActivityManager mAm;
+ private IActivityTaskManager mAtm;
private IWindowManager mWm;
private AppOpsManager mAppOpsManager;
@@ -104,13 +106,14 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
public void setUp() throws Exception {
super.setUp();
mAm = mock(IActivityManager.class);
+ mAtm = mock(IActivityTaskManager.class);
mWm = mock(IWindowManager.class);
mAppOpsManager = mock(AppOpsManager.class);
mContext = InstrumentationRegistry.getContext();
mHandler = new Handler(Looper.getMainLooper());
mCallbacksLock = new Object();
mCallbacks = new Callbacks();
- mDataRequester = new AssistDataRequester(mContext, mAm, mWm, mAppOpsManager, mCallbacks,
+ mDataRequester = new AssistDataRequester(mContext, mWm, mAppOpsManager, mCallbacks,
mCallbacksLock, OP_ASSIST_STRUCTURE, OP_ASSIST_SCREENSHOT);
// Gate the continuation of the assist data callbacks until we are ready within the tests
@@ -125,7 +128,7 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
}
});
return true;
- }).when(mAm).requestAssistContextExtras(anyInt(), any(), any(), any(), anyBoolean(),
+ }).when(mAtm).requestAssistContextExtras(anyInt(), any(), any(), any(), anyBoolean(),
anyBoolean());
doAnswer(invocation -> {
mHandler.post(() -> {
@@ -142,7 +145,7 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
private void setupMocks(boolean currentActivityAssistAllowed, boolean assistStructureAllowed,
boolean assistScreenshotAllowed) throws Exception {
- doReturn(currentActivityAssistAllowed).when(mAm).isAssistDataAllowedOnCurrentActivity();
+ doReturn(currentActivityAssistAllowed).when(mAtm).isAssistDataAllowedOnCurrentActivity();
doReturn(assistStructureAllowed ? MODE_ALLOWED : MODE_ERRORED).when(mAppOpsManager)
.checkOpNoThrow(eq(OP_ASSIST_STRUCTURE), anyInt(), anyString());
doReturn(assistScreenshotAllowed ? MODE_ALLOWED : MODE_ERRORED).when(mAppOpsManager)
@@ -240,7 +243,7 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
public void testDisallowAssistContextExtras_expectNullDataCallbacks() throws Exception {
setupMocks(CURRENT_ACTIVITY_ASSIST_ALLOWED, CALLER_ASSIST_STRUCTURE_ALLOWED,
CALLER_ASSIST_SCREENSHOT_ALLOWED);
- doReturn(false).when(mAm).requestAssistContextExtras(anyInt(), any(), any(), any(),
+ doReturn(false).when(mAtm).requestAssistContextExtras(anyInt(), any(), any(), any(),
anyBoolean(), anyBoolean());
mDataRequester.requestAssistData(createActivityList(5), FETCH_DATA, FETCH_SCREENSHOTS,
@@ -371,4 +374,4 @@ public class AssistDataRequesterTest extends ActivityTestsBase {
});
}
}
-} \ No newline at end of file
+}
diff --git a/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java b/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
new file mode 100644
index 000000000000..32573899aedd
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/am/BroadcastRecordTest.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.am;
+
+import static org.junit.Assert.assertNull;
+
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.os.Process;
+import android.os.UserHandle;
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Test class for {@link BroadcastRecord}.
+ *
+ * Build/Install/Run:
+ * atest FrameworksServicesTests:com.android.server.am.BroadcastRecordTest
+ */
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class BroadcastRecordTest extends ActivityTestsBase {
+
+ @Test
+ public void testCleanupDisabledPackageReceivers() {
+ final int user0 = UserHandle.USER_SYSTEM;
+ final int user1 = user0 + 1;
+ final String pkgToCleanup = "pkg.a";
+ final String pkgOther = "pkg.b";
+
+ // Receivers contain multiple-user (contains [pkg.a@u0, pkg.a@u1, pkg.b@u0, pkg.b@u1]).
+ final List<ResolveInfo> receiversM = createReceiverInfos(
+ new String[] { pkgToCleanup, pkgOther },
+ new int[] { user0, user1 });
+ // Receivers only contain one user (contains [pkg.a@u0, pkg.b@u0]).
+ final List<ResolveInfo> receiversU0 = excludeReceivers(
+ receiversM, null /* packageName */, user1);
+
+ // With given package:
+ // Send to all users, cleanup a package of all users.
+ final BroadcastRecord recordAllAll = createBroadcastRecord(receiversM, UserHandle.USER_ALL);
+ cleanupDisabledPackageReceivers(recordAllAll, pkgToCleanup, UserHandle.USER_ALL);
+ assertNull(verifyRemaining(recordAllAll, excludeReceivers(receiversM, pkgToCleanup, -1)));
+
+ // Send to all users, cleanup a package of one user.
+ final BroadcastRecord recordAllOne = createBroadcastRecord(receiversM, UserHandle.USER_ALL);
+ cleanupDisabledPackageReceivers(recordAllOne, pkgToCleanup, user0);
+ assertNull(verifyRemaining(recordAllOne,
+ excludeReceivers(receiversM, pkgToCleanup, user0)));
+
+ // Send to one user, cleanup a package of all users.
+ final BroadcastRecord recordOneAll = createBroadcastRecord(receiversU0, user0);
+ cleanupDisabledPackageReceivers(recordOneAll, pkgToCleanup, UserHandle.USER_ALL);
+ assertNull(verifyRemaining(recordOneAll, excludeReceivers(receiversU0, pkgToCleanup, -1)));
+
+ // Send to one user, cleanup a package one user.
+ final BroadcastRecord recordOneOne = createBroadcastRecord(receiversU0, user0);
+ cleanupDisabledPackageReceivers(recordOneOne, pkgToCleanup, user0);
+ assertNull(verifyRemaining(recordOneOne, excludeReceivers(receiversU0, pkgToCleanup, -1)));
+
+ // Without given package (e.g. stop user):
+ // Send to all users, cleanup one user.
+ final BroadcastRecord recordAllM = createBroadcastRecord(receiversM, UserHandle.USER_ALL);
+ cleanupDisabledPackageReceivers(recordAllM, null /* packageName */, user1);
+ assertNull(verifyRemaining(recordAllM,
+ excludeReceivers(receiversM, null /* packageName */, user1)));
+
+ // Send to one user, cleanup one user.
+ final BroadcastRecord recordU0 = createBroadcastRecord(receiversU0, user0);
+ cleanupDisabledPackageReceivers(recordU0, null /* packageName */, user0);
+ assertNull(verifyRemaining(recordU0, Collections.emptyList()));
+ }
+
+ private static void cleanupDisabledPackageReceivers(BroadcastRecord record,
+ String packageName, int userId) {
+ record.cleanupDisabledPackageReceiversLocked(packageName, null /* filterByClasses */,
+ userId, true /* doit */);
+ }
+
+ private static String verifyRemaining(BroadcastRecord record,
+ List<ResolveInfo> expectedRemainingReceivers) {
+ final StringBuilder errorMsg = new StringBuilder();
+
+ for (final Object receiver : record.receivers) {
+ final ResolveInfo resolveInfo = (ResolveInfo) receiver;
+ final ApplicationInfo appInfo = resolveInfo.activityInfo.applicationInfo;
+
+ boolean foundExpected = false;
+ for (final ResolveInfo expectedReceiver : expectedRemainingReceivers) {
+ final ApplicationInfo expectedAppInfo =
+ expectedReceiver.activityInfo.applicationInfo;
+ if (appInfo.packageName.equals(expectedAppInfo.packageName)
+ && UserHandle.getUserId(appInfo.uid) == UserHandle
+ .getUserId(expectedAppInfo.uid)) {
+ foundExpected = true;
+ break;
+ }
+ }
+ if (!foundExpected) {
+ errorMsg.append(appInfo.packageName).append("@")
+ .append('u').append(UserHandle.getUserId(appInfo.uid)).append(' ');
+ }
+ }
+
+ return errorMsg.length() == 0 ? null
+ : errorMsg.insert(0, "Contains unexpected receiver: ").toString();
+ }
+
+ private static ResolveInfo createResolveInfo(String packageName, int uid) {
+ final ResolveInfo resolveInfo = new ResolveInfo();
+ final ActivityInfo activityInfo = new ActivityInfo();
+ final ApplicationInfo appInfo = new ApplicationInfo();
+ appInfo.packageName = packageName;
+ appInfo.uid = uid;
+ activityInfo.applicationInfo = appInfo;
+ resolveInfo.activityInfo = activityInfo;
+ return resolveInfo;
+ }
+
+ /**
+ * Generate (packages.length * userIds.length) receivers.
+ */
+ private static List<ResolveInfo> createReceiverInfos(String[] packages, int[] userIds) {
+ final List<ResolveInfo> receivers = new ArrayList<>();
+ for (int i = 0; i < packages.length; i++) {
+ for (final int userId : userIds) {
+ receivers.add(createResolveInfo(packages[i],
+ UserHandle.getUid(userId, Process.FIRST_APPLICATION_UID + i)));
+ }
+ }
+ return receivers;
+ }
+
+ /**
+ * Create a new list which filters out item if package name or user id is matched.
+ * Null package name or user id < 0 will be considered as don't care.
+ */
+ private static List<ResolveInfo> excludeReceivers(List<ResolveInfo> receivers,
+ String packageName, int userId) {
+ final List<ResolveInfo> excludedList = new ArrayList<>();
+ for (final ResolveInfo receiver : receivers) {
+ if ((packageName != null
+ && !packageName.equals(receiver.activityInfo.applicationInfo.packageName))
+ || (userId > -1 && userId != UserHandle
+ .getUserId(receiver.activityInfo.applicationInfo.uid))) {
+ excludedList.add(receiver);
+ }
+ }
+ return excludedList;
+ }
+
+ private static BroadcastRecord createBroadcastRecord(List<ResolveInfo> receivers, int userId) {
+ return new BroadcastRecord(
+ null /* queue */,
+ new Intent(),
+ null /* callerApp */,
+ null /* callerPackage */,
+ 0 /* callingPid */,
+ 0 /* callingUid */,
+ false /* callerInstantApp */,
+ null /* resolvedType */,
+ null /* requiredPermissions */,
+ 0 /* appOp */,
+ null /* options */,
+ new ArrayList<>(receivers), // Make a copy to not affect the original list.
+ null /* resultTo */,
+ 0 /* resultCode */,
+ null /* resultData */,
+ null /* resultExtras */,
+ false /* serialized */,
+ false /* sticky */,
+ false /* initialSticky */,
+ userId);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java b/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java
index 161c2875bf49..fbe552dbcbbc 100644
--- a/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/LaunchParamsControllerTests.java
@@ -57,14 +57,14 @@ import static org.junit.Assert.assertNotEquals;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class LaunchParamsControllerTests extends ActivityTestsBase {
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private LaunchParamsController mController;
@Before
@Override
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mController = new LaunchParamsController(mService);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java b/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
index 2baf9952cb9e..e73661b0557b 100644
--- a/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/PendingRemoteAnimationRegistryTest.java
@@ -62,7 +62,7 @@ public class PendingRemoteAnimationRegistryTest extends ActivityTestsBase {
mService.mHandlerThread.getThreadHandler().runWithScissors(() -> {
mHandler = new TestHandler(null, mClock);
}, 0);
- mRegistry = new PendingRemoteAnimationRegistry(mService, mHandler);
+ mRegistry = new PendingRemoteAnimationRegistry(mService.mActivityTaskManager, mHandler);
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
index b73ac8934cb0..3547b0ddcadf 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
@@ -16,7 +16,7 @@
package com.android.server.am;
-import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
@@ -40,11 +40,9 @@ import static org.mockito.Mockito.spy;
import static java.lang.Integer.MAX_VALUE;
-import android.annotation.TestApi;
-import android.app.ActivityManager;
import android.app.ActivityManager.RecentTaskInfo;
import android.app.ActivityManager.RunningTaskInfo;
-import android.app.WindowConfiguration;
+import android.app.ActivityTaskManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -96,7 +94,7 @@ public class RecentTasksTest extends ActivityTestsBase {
private static int INVALID_STACK_ID = 999;
private Context mContext = InstrumentationRegistry.getContext();
- private ActivityManagerService mService;
+ private TestActivityTaskManagerService mService;
private ActivityDisplay mDisplay;
private ActivityDisplay mOtherDisplay;
private ActivityStack mStack;
@@ -110,44 +108,15 @@ public class RecentTasksTest extends ActivityTestsBase {
private CallbacksRecorder mCallbacksRecorder;
- class TestUserController extends UserController {
- TestUserController(ActivityManagerService service) {
- super(service);
- }
-
- @Override
- int[] getCurrentProfileIds() {
- return new int[] { TEST_USER_0_ID, TEST_QUIET_USER_ID };
- }
-
- @Override
- Set<Integer> getProfileIds(int userId) {
- Set<Integer> profileIds = new HashSet<>();
- profileIds.add(TEST_USER_0_ID);
- profileIds.add(TEST_QUIET_USER_ID);
- return profileIds;
- }
-
- @Override
- UserInfo getUserInfo(int userId) {
- switch (userId) {
- case TEST_USER_0_ID:
- case TEST_USER_1_ID:
- return DEFAULT_USER_INFO;
- case TEST_QUIET_USER_ID:
- return QUIET_USER_INFO;
- }
- return null;
- }
- }
-
@Before
@Override
public void setUp() throws Exception {
super.setUp();
mTaskPersister = new TestTaskPersister(mContext.getFilesDir());
- mService = setupActivityManagerService(new MyTestActivityManagerService(mContext));
+ mService = spy(new MyTestActivityTaskManagerService(mContext));
+ final ActivityManagerService am = spy(new MyTestActivityManagerService(mContext, mService));
+ setupActivityManagerService(am, mService);
mRecentTasks = (TestRecentTasks) mService.getRecentTasks();
mRecentTasks.loadParametersFromResources(mContext.getResources());
mHomeStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
@@ -675,9 +644,8 @@ public class RecentTasksTest extends ActivityTestsBase {
@Test
public void testNotRecentsComponent_denyApiAccess() throws Exception {
- doReturn(PackageManager.PERMISSION_DENIED).when(mService).checkPermission(anyString(),
- anyInt(), anyInt());
-
+ doReturn(PackageManager.PERMISSION_DENIED).when(mService)
+ .checkGetTasksPermission(anyString(), anyInt(), anyInt());
// Expect the following methods to fail due to recents component not being set
mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.DENY_THROW_SECURITY_EXCEPTION);
testRecentTasksApis(false /* expectNoSecurityException */);
@@ -688,8 +656,8 @@ public class RecentTasksTest extends ActivityTestsBase {
@Test
public void testRecentsComponent_allowApiAccessWithoutPermissions() throws Exception {
- doReturn(PackageManager.PERMISSION_DENIED).when(mService).checkPermission(anyString(),
- anyInt(), anyInt());
+ doReturn(PackageManager.PERMISSION_DENIED).when(mService)
+ .checkGetTasksPermission(anyString(), anyInt(), anyInt());
// Set the recents component and ensure that the following calls do not fail
mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.GRANT);
@@ -736,22 +704,9 @@ public class RecentTasksTest extends ActivityTestsBase {
() -> mService.moveTasksToFullscreenStack(INVALID_STACK_ID, true));
assertSecurityException(expectCallable,
() -> mService.startActivityFromRecents(0, new Bundle()));
- assertSecurityException(expectCallable,
- () -> mService.getTaskSnapshot(0, true));
- assertSecurityException(expectCallable, () -> {
- try {
- mService.registerTaskStackListener(null);
- } catch (RemoteException e) {
- // Ignore
- }
- });
- assertSecurityException(expectCallable, () -> {
- try {
- mService.unregisterTaskStackListener(null);
- } catch (RemoteException e) {
- // Ignore
- }
- });
+ assertSecurityException(expectCallable,() -> mService.getTaskSnapshot(0, true));
+ assertSecurityException(expectCallable,() -> mService.registerTaskStackListener(null));
+ assertSecurityException(expectCallable,() -> mService.unregisterTaskStackListener(null));
assertSecurityException(expectCallable, () -> mService.getTaskDescription(0));
assertSecurityException(expectCallable, () -> mService.cancelTaskWindowTransition(0));
assertSecurityException(expectCallable, () -> mService.startRecentsActivity(null, null,
@@ -794,7 +749,7 @@ public class RecentTasksTest extends ActivityTestsBase {
.setFlags(FLAG_ACTIVITY_NEW_DOCUMENT | flags)
.build();
task.affinity = null;
- task.maxRecents = ActivityManager.getMaxAppRecentsLimitStatic();
+ task.maxRecents = ActivityTaskManager.getMaxAppRecentsLimitStatic();
return task;
}
@@ -836,19 +791,26 @@ public class RecentTasksTest extends ActivityTestsBase {
}
}
- private class MyTestActivityManagerService extends TestActivityManagerService {
- MyTestActivityManagerService(Context context) {
+ private class MyTestActivityTaskManagerService extends TestActivityTaskManagerService {
+ MyTestActivityTaskManagerService(Context context) {
super(context);
}
@Override
- protected ActivityStackSupervisor createTestSupervisor() {
- return new MyTestActivityStackSupervisor(this, mHandlerThread.getLooper());
+ protected RecentTasks createRecentTasks() {
+ return new TestRecentTasks(this, mTaskPersister);
}
@Override
- protected RecentTasks createRecentTasks() {
- return new TestRecentTasks(this, mTaskPersister, new TestUserController(this));
+ protected ActivityStackSupervisor createTestSupervisor() {
+ return new MyTestActivityStackSupervisor(this, mH.getLooper());
+ }
+
+ }
+
+ private class MyTestActivityManagerService extends TestActivityManagerService {
+ MyTestActivityManagerService(Context context, TestActivityTaskManagerService atm) {
+ super(context, atm);
}
@Override
@@ -858,7 +820,7 @@ public class RecentTasksTest extends ActivityTestsBase {
}
private class MyTestActivityStackSupervisor extends TestActivityStackSupervisor {
- public MyTestActivityStackSupervisor(ActivityManagerService service, Looper looper) {
+ public MyTestActivityStackSupervisor(ActivityTaskManagerService service, Looper looper) {
super(service, looper);
}
@@ -961,9 +923,33 @@ public class RecentTasksTest extends ActivityTestsBase {
boolean lastAllowed;
- TestRecentTasks(ActivityManagerService service, TaskPersister taskPersister,
- UserController userController) {
- super(service, taskPersister, userController);
+ TestRecentTasks(ActivityTaskManagerService service, TaskPersister taskPersister) {
+ super(service, taskPersister);
+ }
+
+ @Override
+ Set<Integer> getProfileIds(int userId) {
+ Set<Integer> profileIds = new HashSet<>();
+ profileIds.add(TEST_USER_0_ID);
+ profileIds.add(TEST_QUIET_USER_ID);
+ return profileIds;
+ }
+
+ @Override
+ UserInfo getUserInfo(int userId) {
+ switch (userId) {
+ case TEST_USER_0_ID:
+ case TEST_USER_1_ID:
+ return DEFAULT_USER_INFO;
+ case TEST_QUIET_USER_ID:
+ return QUIET_USER_INFO;
+ }
+ return null;
+ }
+
+ @Override
+ int[] getCurrentProfileIds() {
+ return new int[] { TEST_USER_0_ID, TEST_QUIET_USER_ID };
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java b/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java
index eefd973112f5..b642d263af3c 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RecentsAnimationTest.java
@@ -16,18 +16,16 @@
package com.android.server.am;
-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.WINDOWING_MODE_FULLSCREEN;
-import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -51,10 +49,9 @@ import org.junit.runner.RunWith;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class RecentsAnimationTest extends ActivityTestsBase {
- private static final int TEST_CALLING_PID = 3;
private Context mContext = InstrumentationRegistry.getContext();
- private ActivityManagerService mService;
+ private TestActivityTaskManagerService mService;
private ComponentName mRecentsComponent;
@Before
@@ -63,8 +60,8 @@ public class RecentsAnimationTest extends ActivityTestsBase {
super.setUp();
mRecentsComponent = new ComponentName(mContext.getPackageName(), "RecentsActivity");
- mService = setupActivityManagerService(new MyTestActivityManagerService(mContext));
- AttributeCache.init(mContext);
+ mService = spy(new MyTestActivityTaskManagerService(mContext));
+ setupActivityManagerService(mService);
}
@Test
@@ -99,8 +96,8 @@ public class RecentsAnimationTest extends ActivityTestsBase {
eq(REORDER_KEEP_IN_PLACE), any());
}
- private class MyTestActivityManagerService extends TestActivityManagerService {
- MyTestActivityManagerService(Context context) {
+ private class MyTestActivityTaskManagerService extends TestActivityTaskManagerService {
+ MyTestActivityTaskManagerService(Context context) {
super(context);
}
diff --git a/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
index c6ce7e1188e8..944f20f7ff0f 100644
--- a/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
@@ -50,7 +50,7 @@ import java.util.ArrayList;
public class RunningTasksTest extends ActivityTestsBase {
private Context mContext = InstrumentationRegistry.getContext();
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private RunningTasks mRunningTasks;
@@ -59,7 +59,7 @@ public class RunningTasksTest extends ActivityTestsBase {
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mRunningTasks = new RunningTasks();
}
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java b/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
index 3d323f0eb783..f71a6e75a25f 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java
@@ -57,7 +57,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
private final static Rect STACK_BOUNDS = new Rect(0, 0, STACK_WIDTH, STACK_HEIGHT);
- private ActivityManagerService mService;
+ private ActivityTaskManagerService mService;
private ActivityStack mStack;
private TaskRecord mTask;
@@ -71,7 +71,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase {
public void setUp() throws Exception {
super.setUp();
- mService = createActivityManagerService();
+ mService = createActivityTaskManagerService();
mStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, true /* onTop */);
mStack.requestResize(STACK_BOUNDS);
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
index 057fdc8c10bb..72851d01c0ca 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java
@@ -155,7 +155,8 @@ public class TaskRecordTests extends ActivityTestsBase {
}
private TaskRecord createTaskRecord(int taskId) {
- return new TaskRecord(mService, taskId, new Intent(), null, null, null, null, null, false,
+ return new TaskRecord(mService.mActivityTaskManager, taskId, new Intent(), null, null, null,
+ null, null, false,
false, false, 0, 10050, null, new ArrayList<>(), 0, false, null, 0, 0, 0, 0, 0,
null, 0, false, false, false, 0, 0);
}
@@ -164,7 +165,7 @@ public class TaskRecordTests extends ActivityTestsBase {
private boolean mCreated = false;
@Override
- TaskRecord create(ActivityManagerService service, int taskId, ActivityInfo info,
+ TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
Intent intent,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
mCreated = true;
@@ -172,7 +173,7 @@ public class TaskRecordTests extends ActivityTestsBase {
}
@Override
- TaskRecord create(ActivityManagerService service, int taskId, ActivityInfo info,
+ TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info,
Intent intent,
ActivityManager.TaskDescription taskDescription) {
mCreated = true;
@@ -180,7 +181,7 @@ public class TaskRecordTests extends ActivityTestsBase {
}
@Override
- TaskRecord create(ActivityManagerService service, int taskId, Intent intent,
+ TaskRecord create(ActivityTaskManagerService service, int taskId, Intent intent,
Intent affinityIntent, String affinity, String rootAffinity,
ComponentName realActivity,
ComponentName origActivity, boolean rootWasReset, boolean autoRemoveRecents,
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java b/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
index 0359096892bb..8e87a5f2b689 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.TaskDescription;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
import android.app.ITaskStackListener;
import android.app.Instrumentation.ActivityMonitor;
@@ -68,7 +69,7 @@ public class TaskStackChangedListenerTest {
@After
public void tearDown() throws Exception {
- mService.unregisterTaskStackListener(mTaskStackListener);
+ ActivityTaskManager.getService().unregisterTaskStackListener(mTaskStackListener);
mTaskStackListener = null;
}
@@ -227,7 +228,7 @@ public class TaskStackChangedListenerTest {
private void registerTaskStackChangedListener(ITaskStackListener listener) throws Exception {
mTaskStackListener = listener;
- mService.registerTaskStackListener(listener);
+ ActivityTaskManager.getService().registerTaskStackListener(listener);
}
private void waitForCallback(CountDownLatch latch) {
diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java b/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
index ad21a789b201..45e2865e8e5a 100644
--- a/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
@@ -17,7 +17,9 @@ package com.android.server;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_ERRORED;
+import static android.app.AppOpsManager.OP_COARSE_LOCATION;
import static android.app.AppOpsManager.OP_READ_SMS;
+import static android.app.AppOpsManager.OP_WIFI_SCAN;
import static android.app.AppOpsManager.OP_WRITE_SMS;
import static com.google.common.truth.Truth.assertThat;
@@ -103,6 +105,31 @@ public class AppOpsServiceTest {
assertContainsOp(loggedOps, OP_WRITE_SMS, -1, mTestStartMillis, MODE_ERRORED);
}
+ /**
+ * Tests the scenario where an operation's permission is controlled by another operation.
+ * For example the results of a WIFI_SCAN can be used to infer the location of a user, so the
+ * ACCESS_COARSE_LOCATION op is used to check whether WIFI_SCAN is allowed.
+ */
+ @Test
+ public void testNoteOperationAndGetOpsForPackage_controlledByDifferentOp() {
+ // This op controls WIFI_SCAN
+ mAppOpsService.setMode(OP_COARSE_LOCATION, mMyUid, mMyPackageName, MODE_ALLOWED);
+
+ assertThat(mAppOpsService.noteOperation(OP_WIFI_SCAN, mMyUid, mMyPackageName))
+ .isEqualTo(MODE_ALLOWED);
+
+ assertContainsOp(getLoggedOps(), OP_WIFI_SCAN, mTestStartMillis, -1,
+ MODE_ALLOWED /* default for WIFI_SCAN; this is not changed or used in this test */);
+
+ // Now set COARSE_LOCATION to ERRORED -> this will make WIFI_SCAN disabled as well.
+ mAppOpsService.setMode(OP_COARSE_LOCATION, mMyUid, mMyPackageName, MODE_ERRORED);
+ assertThat(mAppOpsService.noteOperation(OP_WIFI_SCAN, mMyUid, mMyPackageName))
+ .isEqualTo(MODE_ERRORED);
+
+ assertContainsOp(getLoggedOps(), OP_WIFI_SCAN, mTestStartMillis, mTestStartMillis,
+ MODE_ALLOWED /* default for WIFI_SCAN; this is not changed or used in this test */);
+ }
+
// Tests the dumping and restoring of the in-memory state to/from XML.
@Test
public void testStatePersistence() {
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
index 4f18be728d85..6801bd2e164a 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
@@ -214,6 +214,40 @@ public class AppBackupUtilsTest {
}
@Test
+ public void appIsDisabled_stateDefaultManifestEnabled_returnsFalse() throws Exception {
+ ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.flags = 0;
+ applicationInfo.uid = Process.FIRST_APPLICATION_UID;
+ applicationInfo.backupAgentName = CUSTOM_BACKUP_AGENT_NAME;
+ applicationInfo.packageName = TEST_PACKAGE_NAME;
+ applicationInfo.enabled = true;
+
+ PackageManagerStub.sApplicationEnabledSetting =
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
+
+ boolean isDisabled = AppBackupUtils.appIsDisabled(applicationInfo, mPackageManagerStub);
+
+ assertThat(isDisabled).isFalse();
+ }
+
+ @Test
+ public void appIsDisabled_stateDefaultManifestDisabled_returnsTrue() throws Exception {
+ ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.flags = 0;
+ applicationInfo.uid = Process.FIRST_APPLICATION_UID;
+ applicationInfo.backupAgentName = CUSTOM_BACKUP_AGENT_NAME;
+ applicationInfo.packageName = TEST_PACKAGE_NAME;
+ applicationInfo.enabled = false;
+
+ PackageManagerStub.sApplicationEnabledSetting =
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
+
+ boolean isDisabled = AppBackupUtils.appIsDisabled(applicationInfo, mPackageManagerStub);
+
+ assertThat(isDisabled).isTrue();
+ }
+
+ @Test
public void appIsDisabled_stateEnabled_returnsFalse() throws Exception {
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.flags = 0;
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
index cd3928558c4b..2b5b812af4c7 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
@@ -18,6 +18,7 @@ package com.android.server.devicepolicy;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.backup.IBackupManager;
@@ -181,6 +182,11 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi
}
@Override
+ IActivityTaskManager getIActivityTaskManager() {
+ return services.iactivityTaskManager;
+ }
+
+ @Override
ActivityManagerInternal getActivityManagerInternal() {
return services.activityManagerInternal;
}
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 1acecfc8cb05..a23636ca20dc 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -3726,7 +3726,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
private void verifyLockTaskState(int userId, String[] packages, int flags) throws Exception {
verify(getServices().iactivityManager).updateLockTaskPackages(userId, packages);
- verify(getServices().iactivityManager).updateLockTaskFeatures(userId, flags);
+ verify(getServices().iactivityTaskManager).updateLockTaskFeatures(userId, flags);
}
private void verifyCanSetLockTask(int uid, int userId, ComponentName who, String[] packages,
@@ -3819,7 +3819,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
// Lock task packages cleared when loading user data and when the user becomes unaffiliated.
verify(getServices().iactivityManager, times(2)).updateLockTaskPackages(
MANAGED_PROFILE_USER_ID, new String[0]);
- verify(getServices().iactivityManager, times(2)).updateLockTaskFeatures(
+ verify(getServices().iactivityTaskManager, times(2)).updateLockTaskFeatures(
MANAGED_PROFILE_USER_ID, DevicePolicyManager.LOCK_TASK_FEATURE_NONE);
// Verify that lock task packages were not cleared for the DO
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
index e753df1f30ec..4724f1cdd324 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java
@@ -28,6 +28,7 @@ import android.accounts.AccountManager;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.NotificationManager;
import android.app.backup.IBackupManager;
import android.app.usage.UsageStatsManagerInternal;
@@ -91,6 +92,7 @@ public class MockSystemServices {
public final IIpConnectivityMetrics iipConnectivityMetrics;
public final IWindowManager iwindowManager;
public final IActivityManager iactivityManager;
+ public final IActivityTaskManager iactivityTaskManager;
public ActivityManagerInternal activityManagerInternal;
public final IPackageManager ipackageManager;
public final IBackupManager ibackupManager;
@@ -129,6 +131,7 @@ public class MockSystemServices {
iipConnectivityMetrics = mock(IIpConnectivityMetrics.class);
iwindowManager = mock(IWindowManager.class);
iactivityManager = mock(IActivityManager.class);
+ iactivityTaskManager = mock(IActivityTaskManager.class);
activityManagerInternal = mock(ActivityManagerInternal.class);
ipackageManager = mock(IPackageManager.class);
ibackupManager = mock(IBackupManager.class);
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
new file mode 100644
index 000000000000..1089f6984296
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.hdmi;
+
+import android.content.Context;
+import android.hardware.hdmi.HdmiPortInfo;
+import android.os.Looper;
+import android.os.MessageQueue;
+import android.os.test.TestLooper;
+import android.support.test.filters.SmallTest;
+import android.util.Log;
+import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback;
+import com.android.server.hdmi.HdmiCecController.NativeWrapper;
+
+import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM;
+import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_PLAYBACK;
+import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_TV;
+import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
+import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
+import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_2;
+import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_3;
+import static com.android.server.hdmi.Constants.ADDR_SPECIFIC_USE;
+import static com.android.server.hdmi.Constants.ADDR_TV;
+import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
+import static junit.framework.Assert.assertEquals;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link com.android.server.hdmi.HdmiCecController} class.
+ */
+@SmallTest
+@RunWith(JUnit4.class)
+public class HdmiCecControllerTest {
+
+ private static final class NativeWrapperImpl implements NativeWrapper {
+
+ @Override
+ public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
+ return 1L;
+ }
+
+ @Override
+ public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress,
+ byte[] body) {
+ return mOccupied[srcAddress] ? 0 : 1;
+ }
+
+ @Override
+ public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
+ return 0;
+ }
+
+ @Override
+ public void nativeClearLogicalAddress(long controllerPtr) {
+
+ }
+
+ @Override
+ public int nativeGetPhysicalAddress(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public int nativeGetVersion(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public int nativeGetVendorId(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
+ return new HdmiPortInfo[0];
+ }
+
+ @Override
+ public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {
+
+ }
+
+ @Override
+ public void nativeSetLanguage(long controllerPtr, String language) {
+
+ }
+
+ @Override
+ public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {
+
+ }
+
+ @Override
+ public boolean nativeIsConnected(long controllerPtr, int port) {
+ return false;
+ }
+ }
+
+ private class MyHdmiControlService extends HdmiControlService {
+
+ MyHdmiControlService(Context context) {
+ super(context);
+ }
+
+ @Override
+ Looper getIoLooper() {
+ return mMyLooper;
+ }
+
+ @Override
+ Looper getServiceLooper() {
+ return mMyLooper;
+ }
+ }
+
+ private static final String TAG = HdmiCecControllerTest.class.getSimpleName();
+ private HdmiControlService mHdmiControlService;
+ private HdmiCecController mHdmiCecController;
+ private static boolean[] mOccupied = new boolean[15];
+ private int mLogicalAddress = 16;
+ private AllocateAddressCallback mCallback = new AllocateAddressCallback() {
+ @Override
+ public void onAllocated(int deviceType, int logicalAddress) {
+ mLogicalAddress = logicalAddress;
+ }
+ };
+ private Looper mMyLooper;
+ private TestLooper mTestLooper = new TestLooper();
+
+ @Before
+ public void SetUp() {
+ mMyLooper = mTestLooper.getLooper();
+ mMyLooper = mTestLooper.getLooper();
+ mHdmiControlService = new MyHdmiControlService(null);
+ mHdmiCecController = HdmiCecController.createWithNativeWrapper(
+ mHdmiControlService, new NativeWrapperImpl());
+ }
+
+ /**
+ * Tests for {@link HdmiCecController#allocateLogicalAddress}
+ */
+ @Test
+ public void testAllocatLogicalAddress_TvDevicePreferredNotOcupied() {
+ mOccupied[ADDR_TV] = false;
+ mOccupied[ADDR_SPECIFIC_USE] = false;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_TV, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_TV, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_TvDeviceNonPreferredNotOcupied() {
+ mOccupied[ADDR_TV] = false;
+ mOccupied[ADDR_SPECIFIC_USE] = false;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_TV, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_TvDeviceNonPreferredFirstOcupied() {
+ mOccupied[ADDR_TV] = true;
+ mOccupied[ADDR_SPECIFIC_USE] = false;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_SPECIFIC_USE, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_TvDeviceNonPreferredAllOcupied() {
+ mOccupied[ADDR_TV] = true;
+ mOccupied[ADDR_SPECIFIC_USE] = true;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_UNREGISTERED, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_AudioSystemNonPreferredNotOcupied() {
+ mOccupied[ADDR_AUDIO_SYSTEM] = false;
+ mHdmiCecController.allocateLogicalAddress(
+ DEVICE_AUDIO_SYSTEM, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_AUDIO_SYSTEM, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_AudioSystemNonPreferredAllOcupied() {
+ mOccupied[ADDR_AUDIO_SYSTEM] = true;
+ mHdmiCecController.allocateLogicalAddress(
+ DEVICE_AUDIO_SYSTEM, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_UNREGISTERED, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_PlaybackPreferredNotOccupied() {
+ mOccupied[ADDR_PLAYBACK_1] = false;
+ mOccupied[ADDR_PLAYBACK_2] = false;
+ mOccupied[ADDR_PLAYBACK_3] = false;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_PLAYBACK_1, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_PLAYBACK_1, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_PlaybackPreferredOcuppied() {
+ mOccupied[ADDR_PLAYBACK_1] = true;
+ mOccupied[ADDR_PLAYBACK_2] = false;
+ mOccupied[ADDR_PLAYBACK_3] = false;
+ mHdmiCecController.allocateLogicalAddress(
+ DEVICE_PLAYBACK, ADDR_PLAYBACK_1, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_PLAYBACK_2, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_PlaybackNoPreferredNotOcuppied() {
+ mOccupied[ADDR_PLAYBACK_1] = false;
+ mOccupied[ADDR_PLAYBACK_2] = false;
+ mOccupied[ADDR_PLAYBACK_3] = false;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_PLAYBACK_1, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_PlaybackNoPreferredFirstOcuppied() {
+ mOccupied[ADDR_PLAYBACK_1] = true;
+ mOccupied[ADDR_PLAYBACK_2] = false;
+ mOccupied[ADDR_PLAYBACK_3] = false;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_PLAYBACK_2, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_PlaybackNonPreferredFirstTwoOcuppied() {
+ mOccupied[ADDR_PLAYBACK_1] = true;
+ mOccupied[ADDR_PLAYBACK_2] = true;
+ mOccupied[ADDR_PLAYBACK_3] = false;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_PLAYBACK_3, mLogicalAddress);
+ }
+
+ @Test
+ public void testAllocatLogicalAddress_PlaybackNonPreferredAllOcupied() {
+ mOccupied[ADDR_PLAYBACK_1] = true;
+ mOccupied[ADDR_PLAYBACK_2] = true;
+ mOccupied[ADDR_PLAYBACK_3] = true;
+ mHdmiCecController.allocateLogicalAddress(DEVICE_PLAYBACK, ADDR_UNREGISTERED, mCallback);
+ mTestLooper.dispatchAll();
+ assertEquals(ADDR_UNREGISTERED, mLogicalAddress);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
new file mode 100644
index 000000000000..e4cfd5bfbcb5
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.hdmi;
+
+import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
+import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
+import static com.android.server.hdmi.Constants.ADDR_TV;
+import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.assertEquals;
+
+import android.hardware.hdmi.HdmiPortInfo;
+import android.media.AudioManager;
+import android.os.Looper;
+import android.os.MessageQueue;
+import android.os.test.TestLooper;
+import android.support.test.filters.SmallTest;
+import com.android.server.hdmi.HdmiCecController.NativeWrapper;
+import java.util.Arrays;
+import java.util.ArrayList;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@SmallTest
+@RunWith(JUnit4.class)
+/**
+ * Tests for {@link HdmiCecLocalDeviceAudioSystem} class.
+ */
+public class HdmiCecLocalDeviceAudioSystemTest {
+
+ private static final class NativeWrapperImpl implements NativeWrapper {
+
+ private HdmiCecMessage mResultMessage;
+
+ @Override
+ public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
+ return 1L;
+ }
+
+ @Override
+ public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress,
+ byte[] body) {
+ if (body.length != 0) {
+ mResultMessage = HdmiCecMessageBuilder.of(srcAddress, dstAddress, body);
+ }
+ return 1;
+ }
+
+ @Override
+ public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
+ return 0;
+ }
+
+ @Override
+ public void nativeClearLogicalAddress(long controllerPtr) {
+
+ }
+
+ @Override
+ public int nativeGetPhysicalAddress(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public int nativeGetVersion(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public int nativeGetVendorId(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
+ HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[1];
+ hdmiPortInfo[0] = new HdmiPortInfo(1, 1, 0x1000,true, true, true);
+ return hdmiPortInfo;
+ }
+
+ @Override
+ public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {
+
+ }
+
+ @Override
+ public void nativeSetLanguage(long controllerPtr, String language) {
+
+ }
+
+ @Override
+ public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {
+
+ }
+
+ @Override
+ public boolean nativeIsConnected(long controllerPtr, int port) {
+ return false;
+ }
+
+ public HdmiCecMessage getResultMessage() {
+ return mResultMessage;
+ }
+ }
+
+ private HdmiControlService mHdmiControlService;
+ private HdmiCecController mHdmiCecController;
+ private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
+ private NativeWrapperImpl mNativeWrapper;
+ private Looper mMyLooper;
+ private TestLooper mTestLooper = new TestLooper();
+ private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
+ private int mMusicVolume;
+ private int mMusicMaxVolume;
+ private boolean mMusicMute;
+
+ @Before
+ public void SetUp() {
+ mHdmiControlService = new HdmiControlService(null) {
+ @Override
+ AudioManager getAudioManager() {
+ return new AudioManager() {
+ @Override
+ public int getStreamVolume(int streamType) {
+ switch (streamType) {
+ case STREAM_MUSIC:
+ return mMusicVolume;
+ default:
+ return 0;
+ }
+ }
+
+ @Override
+ public boolean isStreamMute(int streamType) {
+ switch (streamType) {
+ case STREAM_MUSIC:
+ return mMusicMute;
+ default:
+ return false;
+ }
+ }
+
+ @Override
+ public int getStreamMaxVolume(int streamType) {
+ switch (streamType) {
+ case STREAM_MUSIC:
+ return mMusicMaxVolume;
+ default:
+ return 100;
+ }
+ }
+
+ @Override
+ public void adjustStreamVolume(int streamType, int direction, int flags) {
+ switch (streamType) {
+ case STREAM_MUSIC:
+ if (direction == AudioManager.ADJUST_UNMUTE) {
+ mMusicMute = false;
+ } else if (direction == AudioManager.ADJUST_MUTE) {
+ mMusicMute = true;
+ }
+ default:
+ }
+ }
+ };
+ }
+ };
+ mMyLooper = mTestLooper.getLooper();
+ mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService);
+ mHdmiCecLocalDeviceAudioSystem.init();
+ mHdmiControlService.setIoLooper(mMyLooper);
+
+ mNativeWrapper = new NativeWrapperImpl();
+ mHdmiCecController = HdmiCecController.createWithNativeWrapper(
+ mHdmiControlService, mNativeWrapper);
+ mHdmiControlService.setCecController(mHdmiCecController);
+ mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
+ mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService));
+
+ mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem);
+ mHdmiControlService.initPortInfo();
+ mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+
+ mTestLooper.dispatchAll();
+ }
+
+ @Test
+ public void handleGiveAudioStatus_volume_10_mute_true() {
+ mMusicVolume = 10;
+ mMusicMute = true;
+ mMusicMaxVolume = 20;
+ int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume);
+ HdmiCecMessage expectMessage = HdmiCecMessageBuilder.buildReportAudioStatus(
+ ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true);
+ HdmiCecMessage messageGive = HdmiCecMessageBuilder.buildGiveAudioStatus(
+ ADDR_TV, ADDR_AUDIO_SYSTEM);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ }
+
+ @Test
+ public void handleGiveSystemAudioModeStatus_off() {
+ HdmiCecMessage expectMessage = HdmiCecMessageBuilder
+ .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
+ HdmiCecMessage messageGive = HdmiCecMessageBuilder
+ .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ }
+
+ @Test
+ public void handleRequestArcInitiate() {
+ // TODO(b/80296911): Add tests when finishing handler impl.
+ HdmiCecMessage expectMessage = HdmiCecMessageBuilder
+ .buildInitiateArc(ADDR_AUDIO_SYSTEM, ADDR_TV);
+ HdmiCecMessage message = HdmiCecMessageBuilder
+ .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ }
+
+ @Test
+ public void handleRequestArcTermination() {
+ // TODO(b/80297105): Add tests when finishing handler impl.
+ HdmiCecMessage expectMessage = HdmiCecMessageBuilder
+ .buildTerminateArc(ADDR_AUDIO_SYSTEM, ADDR_TV);
+ HdmiCecMessage messageRequestOff = HdmiCecMessageBuilder
+ .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(messageRequestOff));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ }
+
+ @Test
+ public void handleSystemAudioModeRequest_turnOffByTv_originalOff() {
+ HdmiCecMessage messageRequest = HdmiCecMessageBuilder
+ .buildSystemAudioModeRequest(ADDR_TV, ADDR_AUDIO_SYSTEM, 2, false);
+ HdmiCecMessage expectMessage = HdmiCecMessageBuilder
+ .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequest));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ }
+
+ @Test
+ public void handleSetSystemAudioMode_setOn() {
+ HdmiCecMessage messageSet = HdmiCecMessageBuilder
+ .buildSetSystemAudioMode(ADDR_TV, ADDR_AUDIO_SYSTEM, true);
+ HdmiCecMessage messageGive = HdmiCecMessageBuilder
+ .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
+
+ // Check if originally off
+ HdmiCecMessage expectMessage = HdmiCecMessageBuilder
+ .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+
+ // Check if correctly turned on
+ expectMessage = HdmiCecMessageBuilder
+ .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet));
+ mTestLooper.dispatchAll();
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ }
+
+ @Test
+ public void handleSystemAudioModeRequest_turnOnByTv_thenTurnOffByTv() {
+ mMusicMute = true;
+ HdmiCecMessage messageRequestOn = HdmiCecMessageBuilder
+ .buildSystemAudioModeRequest(ADDR_TV, ADDR_AUDIO_SYSTEM, 2, true);
+ HdmiCecMessage messageGive = HdmiCecMessageBuilder
+ .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
+ // Turn the feature on
+ HdmiCecMessage expectMessage = HdmiCecMessageBuilder
+ .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOn));
+ mTestLooper.dispatchAll();
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ assertFalse(mMusicMute);
+
+ // Check if feature correctly turned off
+ HdmiCecMessage messageRequestOff = HdmiCecMessageBuilder
+ .buildSystemAudioModeRequest(ADDR_TV, ADDR_AUDIO_SYSTEM, 2, false);
+ expectMessage = HdmiCecMessageBuilder
+ .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
+
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff));
+ mTestLooper.dispatchAll();
+ assertTrue(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive));
+ mTestLooper.dispatchAll();
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ assertTrue(mMusicMute);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
new file mode 100644
index 000000000000..78cb56baf86e
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.hdmi;
+
+import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_TV;
+import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
+import static com.android.server.hdmi.Constants.ADDR_TV;
+import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
+import static com.android.server.hdmi.Constants.MESSAGE_DEVICE_VENDOR_ID;
+import static com.android.server.hdmi.Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS;
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import android.hardware.hdmi.HdmiPortInfo;
+import android.os.test.TestLooper;
+import android.support.test.filters.SmallTest;
+import android.os.MessageQueue;
+import com.android.server.hdmi.HdmiCecController.NativeWrapper;
+import junit.framework.Assert;
+import java.util.Arrays;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@SmallTest
+@RunWith(JUnit4.class)
+/**
+ * Tests for {@link HdmiCecLocalDevice} class.
+ */
+public class HdmiCecLocalDeviceTest {
+
+ private static final class NativeWrapperImpl implements NativeWrapper {
+
+ @Override
+ public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) {
+ return 1L;
+ }
+
+ @Override
+ public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress,
+ byte[] body) {
+ return SendCecCommandFactory(srcAddress, dstAddress, body);
+ }
+
+ @Override
+ public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) {
+ return 0;
+ }
+
+ @Override
+ public void nativeClearLogicalAddress(long controllerPtr) {
+
+ }
+
+ @Override
+ public int nativeGetPhysicalAddress(long controllerPtr) {
+ return mPhysicalAddr;
+ }
+
+ @Override
+ public int nativeGetVersion(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public int nativeGetVendorId(long controllerPtr) {
+ return 0;
+ }
+
+ @Override
+ public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) {
+ return new HdmiPortInfo[0];
+ }
+
+ @Override
+ public void nativeSetOption(long controllerPtr, int flag, boolean enabled) {
+
+ }
+
+ @Override
+ public void nativeSetLanguage(long controllerPtr, String language) {
+
+ }
+
+ @Override
+ public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) {
+
+ }
+
+ @Override
+ public boolean nativeIsConnected(long controllerPtr, int port) {
+ return false;
+ }
+ }
+
+ private static int SendCecCommandFactory(int srcAddress, int dstAddress, byte[] body) {
+ switch(body[0] & 0xFF) {
+ /** {@link Constants#MESSAGE_GIVE_PHYSICAL_ADDRESS} */
+ case MESSAGE_REPORT_PHYSICAL_ADDRESS:
+ case MESSAGE_DEVICE_VENDOR_ID:
+ return srcAddress == mSrcAddr &&
+ dstAddress == mDesAddr &&
+ Arrays.equals(Arrays.copyOfRange(body, 1, body.length), param)? 0 : 1;
+ default:
+ return 1;
+ }
+ }
+
+ private class MyHdmiCecLocalDevice extends HdmiCecLocalDevice {
+
+
+ protected MyHdmiCecLocalDevice(HdmiControlService service, int deviceType) {
+ super(service, deviceType);
+ }
+
+ @Override
+ protected void onAddressAllocated(int logicalAddress, int reason) {
+
+ }
+
+ @Override
+ protected int getPreferredAddress() {
+ return 0;
+ }
+
+ @Override
+ protected void setPreferredAddress(int addr) {
+
+ }
+ }
+
+ private MyHdmiCecLocalDevice mHdmiLocalDevice;
+ private HdmiControlService mHdmiControlService;
+ private HdmiCecController mHdmiCecController;
+ private TestLooper mTestLooper = new TestLooper();
+ private static int mDesAddr = -1;
+ private static int mSrcAddr = -1;
+ private static int mPhysicalAddr = 2;
+ private int callbackResult;
+ private HdmiCecMessageValidator mMessageValidator;
+ private static byte[] param;
+
+ @Before
+ public void SetUp() {
+ mHdmiControlService = new HdmiControlService(null);
+ mHdmiControlService.setIoLooper(mTestLooper.getLooper());
+ mHdmiCecController = HdmiCecController.createWithNativeWrapper(
+ mHdmiControlService, new NativeWrapperImpl());
+ mHdmiControlService.setCecController(mHdmiCecController);
+ mHdmiLocalDevice = new MyHdmiCecLocalDevice(
+ mHdmiControlService, DEVICE_TV);
+ mMessageValidator = new HdmiCecMessageValidator(mHdmiControlService){
+ @Override
+ int isValid(HdmiCecMessage message) {
+ return HdmiCecMessageValidator.OK;
+ }
+ };
+ mHdmiControlService.setMessageValidator(mMessageValidator);
+ }
+
+ @Test
+ public void dispatchMessage_desNotValid() {
+ HdmiCecMessage msg = new HdmiCecMessage(
+ ADDR_TV, ADDR_TV, Constants.MESSAGE_CEC_VERSION, HdmiCecMessage.EMPTY_PARAM);
+ boolean handleResult = mHdmiLocalDevice.dispatchMessage(msg);
+ assertFalse(handleResult);
+ }
+
+ @Test
+ public void handleGivePhysicalAddress_success() {
+ mSrcAddr = ADDR_UNREGISTERED;
+ mDesAddr = ADDR_BROADCAST;
+ param = new byte[] {
+ (byte) ((mPhysicalAddr >> 8) & 0xFF),
+ (byte) (mPhysicalAddr & 0xFF),
+ (byte) (DEVICE_TV & 0xFF)
+ };
+ callbackResult = -1;
+ boolean handleResult = mHdmiLocalDevice.handleGivePhysicalAddress(
+ (int finalResult) -> callbackResult = finalResult);
+ mTestLooper.dispatchAll();
+ /**
+ * Test if CecMessage is sent successfully
+ * SendMessageResult#SUCCESS is defined in HAL as 0
+ */
+ assertEquals(0, callbackResult);
+ assertTrue(handleResult);
+ }
+
+ @Test
+ public void handleGiveDeviceVendorId_success() {
+ mSrcAddr = ADDR_UNREGISTERED;
+ mDesAddr = ADDR_BROADCAST;
+ /** nativeGetVendorId returns 0 */
+ param = new byte[] {
+ (byte) ((0 >> 8) & 0xFF),
+ (byte) (0 & 0xFF),
+ (byte) (0 & 0xFF)
+ };
+ callbackResult = -1;
+ mHdmiLocalDevice.handleGiveDeviceVendorId(
+ (int finalResult) -> callbackResult = finalResult);
+ mTestLooper.dispatchAll();
+ assertEquals(0, callbackResult);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
index 424c08c4c931..2214d74d56b6 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsShellCommandTest.java
@@ -80,7 +80,7 @@ public class LockSettingsShellCommandTest {
MockitoAnnotations.initMocks(this);
final Context context = InstrumentationRegistry.getTargetContext();
mUserId = ActivityManager.getCurrentUser();
- mCommand = new LockSettingsShellCommand(context, mLockPatternUtils);
+ mCommand = new LockSettingsShellCommand(mLockPatternUtils);
}
@Test
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 998ffa09d2b3..2de5d87c063c 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -92,6 +92,7 @@ import com.android.server.SystemService;
import com.android.server.pm.LauncherAppsService.LauncherAppsImpl;
import com.android.server.pm.ShortcutUser.PackageWithUser;
+import com.android.server.wm.ActivityTaskManagerInternal;
import org.junit.Assert;
import org.mockito.ArgumentCaptor;
import org.mockito.invocation.InvocationOnMock;
@@ -613,6 +614,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected UserManagerInternal mMockUserManagerInternal;
protected UsageStatsManagerInternal mMockUsageStatsManagerInternal;
protected ActivityManagerInternal mMockActivityManagerInternal;
+ protected ActivityTaskManagerInternal mMockActivityTaskManagerInternal;
protected static final String CALLING_PACKAGE_1 = "com.android.test.1";
protected static final int CALLING_UID_1 = 10001;
@@ -752,6 +754,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
mMockUserManagerInternal = mock(UserManagerInternal.class);
mMockUsageStatsManagerInternal = mock(UsageStatsManagerInternal.class);
mMockActivityManagerInternal = mock(ActivityManagerInternal.class);
+ mMockActivityTaskManagerInternal = mock(ActivityTaskManagerInternal.class);
LocalServices.removeServiceForTest(PackageManagerInternal.class);
LocalServices.addService(PackageManagerInternal.class, mMockPackageManagerInternal);
@@ -759,6 +762,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
LocalServices.addService(UsageStatsManagerInternal.class, mMockUsageStatsManagerInternal);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
LocalServices.addService(ActivityManagerInternal.class, mMockActivityManagerInternal);
+ LocalServices.addService(ActivityTaskManagerInternal.class, mMockActivityTaskManagerInternal);
LocalServices.removeServiceForTest(UserManagerInternal.class);
LocalServices.addService(UserManagerInternal.class, mMockUserManagerInternal);
@@ -1641,11 +1645,11 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected Intent[] launchShortcutAndGetIntentsInner(Runnable shortcutStarter,
@NonNull String packageName, @NonNull String shortcutId, int userId) {
- reset(mMockActivityManagerInternal);
+ reset(mMockActivityTaskManagerInternal);
shortcutStarter.run();
final ArgumentCaptor<Intent[]> intentsCaptor = ArgumentCaptor.forClass(Intent[].class);
- verify(mMockActivityManagerInternal).startActivitiesAsPackage(
+ verify(mMockActivityTaskManagerInternal).startActivitiesAsPackage(
eq(packageName),
eq(userId),
intentsCaptor.capture(),
@@ -1695,7 +1699,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
protected void assertShortcutNotLaunched(@NonNull String packageName,
@NonNull String shortcutId, int userId) {
- reset(mMockActivityManagerInternal);
+ reset(mMockActivityTaskManagerInternal);
try {
mLauncherApps.startShortcut(packageName, shortcutId, null, null,
UserHandle.of(userId));
@@ -1703,7 +1707,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
} catch (ActivityNotFoundException expected) {
}
// This shouldn't have been called.
- verify(mMockActivityManagerInternal, times(0)).startActivitiesAsPackage(
+ verify(mMockActivityTaskManagerInternal, times(0)).startActivitiesAsPackage(
anyString(),
anyInt(),
any(Intent[].class),
diff --git a/services/tests/servicestests/src/com/android/server/pm/CrossProfileAppsServiceImplTest.java b/services/tests/servicestests/src/com/android/server/pm/CrossProfileAppsServiceImplTest.java
index 33acc447969e..c4c2ad926954 100644
--- a/services/tests/servicestests/src/com/android/server/pm/CrossProfileAppsServiceImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/CrossProfileAppsServiceImplTest.java
@@ -31,6 +31,8 @@ import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
import android.util.SparseArray;
+import com.android.server.wm.ActivityTaskManagerInternal;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -72,6 +74,8 @@ public class CrossProfileAppsServiceImplTest {
private AppOpsManager mAppOpsManager;
@Mock
private ActivityManagerInternal mActivityManagerInternal;
+ @Mock
+ private ActivityTaskManagerInternal mActivityTaskManagerInternal;
private TestInjector mTestInjector;
private ActivityInfo mActivityInfo;
@@ -210,7 +214,7 @@ public class CrossProfileAppsServiceImplTest {
ACTIVITY_COMPONENT,
UserHandle.of(PRIMARY_USER)));
- verify(mActivityManagerInternal, never())
+ verify(mActivityTaskManagerInternal, never())
.startActivityAsUser(
nullable(IApplicationThread.class),
anyString(),
@@ -232,7 +236,7 @@ public class CrossProfileAppsServiceImplTest {
ACTIVITY_COMPONENT,
UserHandle.of(PROFILE_OF_PRIMARY_USER)));
- verify(mActivityManagerInternal, never())
+ verify(mActivityTaskManagerInternal, never())
.startActivityAsUser(
nullable(IApplicationThread.class),
anyString(),
@@ -252,7 +256,7 @@ public class CrossProfileAppsServiceImplTest {
ACTIVITY_COMPONENT,
UserHandle.of(PROFILE_OF_PRIMARY_USER)));
- verify(mActivityManagerInternal, never())
+ verify(mActivityTaskManagerInternal, never())
.startActivityAsUser(
nullable(IApplicationThread.class),
anyString(),
@@ -274,7 +278,7 @@ public class CrossProfileAppsServiceImplTest {
ACTIVITY_COMPONENT,
UserHandle.of(PROFILE_OF_PRIMARY_USER)));
- verify(mActivityManagerInternal, never())
+ verify(mActivityTaskManagerInternal, never())
.startActivityAsUser(
nullable(IApplicationThread.class),
anyString(),
@@ -294,7 +298,7 @@ public class CrossProfileAppsServiceImplTest {
new ComponentName(PACKAGE_TWO, "test"),
UserHandle.of(PROFILE_OF_PRIMARY_USER)));
- verify(mActivityManagerInternal, never())
+ verify(mActivityTaskManagerInternal, never())
.startActivityAsUser(
nullable(IApplicationThread.class),
anyString(),
@@ -314,7 +318,7 @@ public class CrossProfileAppsServiceImplTest {
ACTIVITY_COMPONENT,
UserHandle.of(SECONDARY_USER)));
- verify(mActivityManagerInternal, never())
+ verify(mActivityTaskManagerInternal, never())
.startActivityAsUser(
nullable(IApplicationThread.class),
anyString(),
@@ -333,7 +337,7 @@ public class CrossProfileAppsServiceImplTest {
ACTIVITY_COMPONENT,
UserHandle.of(PRIMARY_USER));
- verify(mActivityManagerInternal)
+ verify(mActivityTaskManagerInternal)
.startActivityAsUser(
nullable(IApplicationThread.class),
eq(PACKAGE_ONE),
@@ -432,5 +436,10 @@ public class CrossProfileAppsServiceImplTest {
public ActivityManagerInternal getActivityManagerInternal() {
return mActivityManagerInternal;
}
+
+ @Override
+ public ActivityTaskManagerInternal getActivityTaskManagerInternal() {
+ return mActivityTaskManagerInternal;
+ }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 7815004c18f9..6c6c9932e34c 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -2904,7 +2904,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
runWithCaller(LAUNCHER_1, USER_0, () -> {
// Not launchable.
doReturn(ActivityManager.START_CLASS_NOT_FOUND)
- .when(mMockActivityManagerInternal).startActivitiesAsPackage(
+ .when(mMockActivityTaskManagerInternal).startActivitiesAsPackage(
anyStringOrNull(), anyInt(),
anyOrNull(Intent[].class), anyOrNull(Bundle.class));
assertStartShortcutThrowsException(CALLING_PACKAGE_1, "s1", USER_0,
@@ -2912,7 +2912,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// Still not launchable.
doReturn(ActivityManager.START_CLASS_NOT_FOUND)
- .when(mMockActivityManagerInternal)
+ .when(mMockActivityTaskManagerInternal)
.startActivitiesAsPackage(
anyStringOrNull(), anyInt(),
anyOrNull(Intent[].class), anyOrNull(Bundle.class));
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
index 97a716f6bd99..cb94ec7caaca 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
@@ -22,7 +22,6 @@ import static android.view.View.SYSTEM_UI_FLAG_FULLSCREEN;
import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
-import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
@@ -309,8 +308,8 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
final Rect stable = new Rect();
final Rect outsets = new Rect();
final DisplayCutout.ParcelableWrapper cutout = new DisplayCutout.ParcelableWrapper();
- mPolicy.getLayoutHintLw(mAppWindow.attrs, null /* taskBounds */, mFrames, frame, content,
- stable, outsets, cutout);
+ mPolicy.getLayoutHintLw(mAppWindow.attrs, null /* taskBounds */, mFrames,
+ false /* floatingStack */, frame, content, stable, outsets, cutout);
assertThat(frame, equalTo(mFrames.mUnrestricted));
assertThat(content, equalTo(new Rect()));
@@ -331,8 +330,8 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
final DisplayCutout.ParcelableWrapper outDisplayCutout =
new DisplayCutout.ParcelableWrapper();
- mPolicy.getLayoutHintLw(mAppWindow.attrs, null, mFrames, outFrame, outContentInsets,
- outStableInsets, outOutsets, outDisplayCutout);
+ mPolicy.getLayoutHintLw(mAppWindow.attrs, null, mFrames, false /* floatingStack */,
+ outFrame, outContentInsets, outStableInsets, outOutsets, outDisplayCutout);
assertThat(outFrame, is(mFrames.mUnrestricted));
assertThat(outContentInsets, is(new Rect(0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT)));
@@ -355,8 +354,35 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
final DisplayCutout.ParcelableWrapper outDisplayCutout =
new DisplayCutout.ParcelableWrapper();
- mPolicy.getLayoutHintLw(mAppWindow.attrs, taskBounds, mFrames, outFrame, outContentInsets,
- outStableInsets, outOutsets, outDisplayCutout);
+ mPolicy.getLayoutHintLw(mAppWindow.attrs, taskBounds, mFrames, false /* floatingStack */,
+ outFrame, outContentInsets, outStableInsets, outOutsets, outDisplayCutout);
+
+ assertThat(outFrame, is(taskBounds));
+ assertThat(outContentInsets, is(new Rect()));
+ assertThat(outStableInsets, is(new Rect()));
+ assertThat(outOutsets, is(new Rect()));
+ assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper()));
+ }
+
+ @Test
+ public void layoutHint_appWindowInTask_outsideContentFrame() {
+ // Initialize DisplayFrames
+ mPolicy.beginLayoutLw(mFrames, 0 /* UI mode */);
+
+ // Task is in the nav bar area (usually does not happen, but this is similar enough to the
+ // possible overlap with the IME)
+ final Rect taskBounds = new Rect(100, mFrames.mContent.bottom + 1,
+ 200, mFrames.mContent.bottom + 10);
+
+ final Rect outFrame = new Rect();
+ final Rect outContentInsets = new Rect();
+ final Rect outStableInsets = new Rect();
+ final Rect outOutsets = new Rect();
+ final DisplayCutout.ParcelableWrapper outDisplayCutout =
+ new DisplayCutout.ParcelableWrapper();
+
+ mPolicy.getLayoutHintLw(mAppWindow.attrs, taskBounds, mFrames, true /* floatingStack */,
+ outFrame, outContentInsets, outStableInsets, outOutsets, outDisplayCutout);
assertThat(outFrame, is(taskBounds));
assertThat(outContentInsets, is(new Rect()));
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
index 2c47a9432eff..1d378020fa4f 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
@@ -37,6 +37,7 @@ import android.graphics.Matrix;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.os.IBinder;
import android.os.UserHandle;
import android.support.test.InstrumentationRegistry;
@@ -172,15 +173,14 @@ public class PhoneWindowManagerTestBase {
}
private static DisplayCutout displayCutoutForRotation(int rotation) {
- Path p = new Path();
- p.addRect(DISPLAY_WIDTH / 4, 0, DISPLAY_WIDTH * 3 / 4, DISPLAY_CUTOUT_HEIGHT,
- Path.Direction.CCW);
+ RectF rectF = new RectF(DISPLAY_WIDTH / 4, 0, DISPLAY_WIDTH * 3 / 4, DISPLAY_CUTOUT_HEIGHT);
Matrix m = new Matrix();
transformPhysicalToLogicalCoordinates(rotation, DISPLAY_WIDTH, DISPLAY_HEIGHT, m);
- p.transform(m);
+ m.mapRect(rectF);
- return DisplayCutout.fromBounds(p);
+ return DisplayCutout.fromBoundingRect((int) rectF.left, (int) rectF.top,
+ (int) rectF.right, (int) rectF.bottom);
}
static class TestContextWrapper extends ContextWrapper {
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
index 5b247253fd9c..0764a56af18f 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
+import android.content.res.Resources;
import android.provider.Settings.Global;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -48,12 +49,18 @@ public class BatterySaverStateMachineTest {
private BatterySaverController mMockBatterySaverController;
private Device mDevice;
private TestableBatterySaverStateMachine mTarget;
+ private Resources mMockResources;
private class MyMockContext extends MockContext {
@Override
public ContentResolver getContentResolver() {
return mMockContextResolver;
}
+
+ @Override
+ public Resources getResources() {
+ return mMockResources;
+ }
}
private DevicePersistedState mPersistedState;
@@ -157,11 +164,15 @@ public class BatterySaverStateMachineTest {
mMockContext = new MyMockContext();
mMockContextResolver = mock(ContentResolver.class);
mMockBatterySaverController = mock(BatterySaverController.class);
+ mMockResources = mock(Resources.class);
doAnswer((inv) -> mDevice.batterySaverEnabled = inv.getArgument(0))
.when(mMockBatterySaverController).enableBatterySaver(anyBoolean(), anyInt());
when(mMockBatterySaverController.isEnabled())
.thenAnswer((inv) -> mDevice.batterySaverEnabled);
+ when(mMockResources.getBoolean(
+ com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled))
+ .thenReturn(false);
mPersistedState = new DevicePersistedState();
initDevice();
@@ -173,7 +184,6 @@ public class BatterySaverStateMachineTest {
mTarget = new TestableBatterySaverStateMachine();
mDevice.pushBatteryStatus();
- mDevice.pushGlobalSettings();
mTarget.onBootCompleted();
}
@@ -498,8 +508,83 @@ public class BatterySaverStateMachineTest {
}
@Test
- public void testNoAutoBatterySaver_fromAdb() {
+ public void testAutoBatterySaver_withStickyDisabled() {
+ when(mMockResources.getBoolean(
+ com.android.internal.R.bool.config_batterySaverStickyBehaviourDisabled))
+ .thenReturn(true);
+ initDevice();
+ mDevice.putGlobalSetting(Global.LOW_POWER_MODE_TRIGGER_LEVEL, 50);
+
+ mTarget.setBatterySaverEnabledManually(true);
+
+ assertEquals(true, mDevice.batterySaverEnabled);
+ assertEquals(100, mPersistedState.batteryLevel);
+ assertEquals(false, mPersistedState.batteryLow);
+
+ mDevice.setBatteryLevel(30);
+
+ assertEquals(true, mDevice.batterySaverEnabled);
+ assertEquals(30, mPersistedState.batteryLevel);
+ assertEquals(true, mPersistedState.batteryLow);
+
+ mDevice.setBatteryLevel(80);
+
+ assertEquals(false, mDevice.batterySaverEnabled); // Not sticky.
+ assertEquals(80, mPersistedState.batteryLevel);
+ assertEquals(false, mPersistedState.batteryLow);
+
+ mDevice.setPowered(true);
+
+ assertEquals(false, mDevice.batterySaverEnabled);
+ assertEquals(80, mPersistedState.batteryLevel);
+ assertEquals(false, mPersistedState.batteryLow);
+ mDevice.setBatteryLevel(30);
+
+ assertEquals(false, mDevice.batterySaverEnabled);
+ assertEquals(30, mPersistedState.batteryLevel);
+ assertEquals(true, mPersistedState.batteryLow);
+
+ mDevice.setPowered(false);
+
+ assertEquals(true, mDevice.batterySaverEnabled); // Restores BS.
+ assertEquals(30, mPersistedState.batteryLevel);
+ assertEquals(true, mPersistedState.batteryLow);
+
+ mDevice.setPowered(true);
+ mDevice.setBatteryLevel(90);
+
+ assertEquals(false, mDevice.batterySaverEnabled);
+ assertEquals(90, mPersistedState.batteryLevel);
+ assertEquals(false, mPersistedState.batteryLow);
+
+ initDevice();
+
+ assertEquals(false, mDevice.batterySaverEnabled);
+ assertEquals(90, mPersistedState.batteryLevel);
+ assertEquals(false, mPersistedState.batteryLow);
+
+ mDevice.setPowered(false);
+
+ assertEquals(false, mDevice.batterySaverEnabled);
+ assertEquals(90, mPersistedState.batteryLevel);
+ assertEquals(false, mPersistedState.batteryLow);
+
+ mTarget.setBatterySaverEnabledManually(false);
+
+ assertEquals(false, mDevice.batterySaverEnabled);
+ assertEquals(90, mPersistedState.batteryLevel);
+ assertEquals(false, mPersistedState.batteryLow);
+
+ initDevice();
+
+ assertEquals(false, mDevice.batterySaverEnabled);
+ assertEquals(90, mPersistedState.batteryLevel);
+ assertEquals(false, mPersistedState.batteryLow);
+ }
+
+ @Test
+ public void testNoAutoBatterySaver_fromAdb() {
assertEquals(0, mDevice.getLowPowerModeTriggerLevel());
assertEquals(false, mDevice.batterySaverEnabled);
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java b/services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java
new file mode 100644
index 000000000000..62f1433f7907
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/timedetector/SimpleTimeZoneDetectorStrategyTest.java
@@ -0,0 +1,513 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timedetector;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.app.timedetector.TimeSignal;
+import android.content.Intent;
+import android.icu.util.Calendar;
+import android.icu.util.GregorianCalendar;
+import android.icu.util.TimeZone;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.TimestampedValue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class SimpleTimeZoneDetectorStrategyTest {
+
+ private static final Scenario SCENARIO_1 = new Scenario.Builder()
+ .setInitialDeviceSystemClockUtc(1977, 1, 1, 12, 0, 0)
+ .setInitialDeviceRealtimeMillis(123456789L)
+ .setActualTimeUtc(2018, 1, 1, 12, 0, 0)
+ .build();
+
+ private Script mScript;
+
+ @Before
+ public void setUp() {
+ mScript = new Script();
+ }
+
+ @Test
+ public void testSuggestTime_nitz_timeDetectionEnabled() {
+ Scenario scenario = SCENARIO_1;
+ mScript.pokeFakeClocks(scenario)
+ .pokeTimeDetectionEnabled(true);
+
+ TimeSignal timeSignal = scenario.createTimeSignalForActual(TimeSignal.SOURCE_ID_NITZ);
+ final int clockIncrement = 1000;
+ long expectSystemClockMillis = scenario.getActualTimeMillis() + clockIncrement;
+
+ mScript.simulateTimePassing(clockIncrement)
+ .simulateTimeSignalReceived(timeSignal)
+ .verifySystemClockWasSetAndResetCallTracking(expectSystemClockMillis);
+ }
+
+ @Test
+ public void testSuggestTime_systemClockThreshold() {
+ Scenario scenario = SCENARIO_1;
+ final int systemClockUpdateThresholdMillis = 1000;
+ mScript.pokeFakeClocks(scenario)
+ .pokeThresholds(systemClockUpdateThresholdMillis)
+ .pokeTimeDetectionEnabled(true);
+
+ TimeSignal timeSignal1 = scenario.createTimeSignalForActual(TimeSignal.SOURCE_ID_NITZ);
+ TimestampedValue<Long> utcTime1 = timeSignal1.getUtcTime();
+
+ final int clockIncrement = 100;
+ // Increment the the device clocks to simulate the passage of time.
+ mScript.simulateTimePassing(clockIncrement);
+
+ long expectSystemClockMillis1 =
+ TimeDetectorStrategy.getTimeAt(utcTime1, mScript.peekElapsedRealtimeMillis());
+
+ // Send the first time signal. It should be used.
+ mScript.simulateTimeSignalReceived(timeSignal1)
+ .verifySystemClockWasSetAndResetCallTracking(expectSystemClockMillis1);
+
+ // Now send another time signal, but one that is too similar to the last one and should be
+ // ignored.
+ int underThresholdMillis = systemClockUpdateThresholdMillis - 1;
+ TimestampedValue<Long> utcTime2 = new TimestampedValue<>(
+ mScript.peekElapsedRealtimeMillis(),
+ mScript.peekSystemClockMillis() + underThresholdMillis);
+ TimeSignal timeSignal2 = new TimeSignal(TimeSignal.SOURCE_ID_NITZ, utcTime2);
+ mScript.simulateTimePassing(clockIncrement)
+ .simulateTimeSignalReceived(timeSignal2)
+ .verifySystemClockWasNotSetAndResetCallTracking();
+
+ // Now send another time signal, but one that is on the threshold and so should be used.
+ TimestampedValue<Long> utcTime3 = new TimestampedValue<>(
+ mScript.peekElapsedRealtimeMillis(),
+ mScript.peekSystemClockMillis() + systemClockUpdateThresholdMillis);
+
+ TimeSignal timeSignal3 = new TimeSignal(TimeSignal.SOURCE_ID_NITZ, utcTime3);
+ mScript.simulateTimePassing(clockIncrement);
+
+ long expectSystemClockMillis3 =
+ TimeDetectorStrategy.getTimeAt(utcTime3, mScript.peekElapsedRealtimeMillis());
+
+ mScript.simulateTimeSignalReceived(timeSignal3)
+ .verifySystemClockWasSetAndResetCallTracking(expectSystemClockMillis3);
+ }
+
+ @Test
+ public void testSuggestTime_nitz_timeDetectionDisabled() {
+ Scenario scenario = SCENARIO_1;
+ mScript.pokeFakeClocks(scenario)
+ .pokeTimeDetectionEnabled(false);
+
+ TimeSignal timeSignal = scenario.createTimeSignalForActual(TimeSignal.SOURCE_ID_NITZ);
+ mScript.simulateTimeSignalReceived(timeSignal)
+ .verifySystemClockWasNotSetAndResetCallTracking();
+ }
+
+ @Test
+ public void testSuggestTime_nitz_invalidNitzReferenceTimesIgnored() {
+ Scenario scenario = SCENARIO_1;
+ final int systemClockUpdateThreshold = 2000;
+ mScript.pokeFakeClocks(scenario)
+ .pokeThresholds(systemClockUpdateThreshold)
+ .pokeTimeDetectionEnabled(true);
+ TimeSignal timeSignal1 = scenario.createTimeSignalForActual(TimeSignal.SOURCE_ID_NITZ);
+ TimestampedValue<Long> utcTime1 = timeSignal1.getUtcTime();
+
+ // Initialize the strategy / device with a time set from NITZ.
+ mScript.simulateTimePassing(100);
+ long expectedSystemClockMillis1 =
+ TimeDetectorStrategy.getTimeAt(utcTime1, mScript.peekElapsedRealtimeMillis());
+ mScript.simulateTimeSignalReceived(timeSignal1)
+ .verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis1);
+
+ // The UTC time increment should be larger than the system clock update threshold so we
+ // know it shouldn't be ignored for other reasons.
+ long validUtcTimeMillis = utcTime1.getValue() + (2 * systemClockUpdateThreshold);
+
+ // Now supply a new signal that has an obviously bogus reference time : older than the last
+ // one.
+ long referenceTimeBeforeLastSignalMillis = utcTime1.getReferenceTimeMillis() - 1;
+ TimestampedValue<Long> utcTime2 = new TimestampedValue<>(
+ referenceTimeBeforeLastSignalMillis, validUtcTimeMillis);
+ TimeSignal timeSignal2 = new TimeSignal(TimeSignal.SOURCE_ID_NITZ, utcTime2);
+ mScript.simulateTimeSignalReceived(timeSignal2)
+ .verifySystemClockWasNotSetAndResetCallTracking();
+
+ // Now supply a new signal that has an obviously bogus reference time : substantially in the
+ // future.
+ long referenceTimeInFutureMillis =
+ utcTime1.getReferenceTimeMillis() + Integer.MAX_VALUE + 1;
+ TimestampedValue<Long> utcTime3 = new TimestampedValue<>(
+ referenceTimeInFutureMillis, validUtcTimeMillis);
+ TimeSignal timeSignal3 = new TimeSignal(TimeSignal.SOURCE_ID_NITZ, utcTime3);
+ mScript.simulateTimeSignalReceived(timeSignal3)
+ .verifySystemClockWasNotSetAndResetCallTracking();
+
+ // Just to prove validUtcTimeMillis is valid.
+ long validReferenceTimeMillis = utcTime1.getReferenceTimeMillis() + 100;
+ TimestampedValue<Long> utcTime4 = new TimestampedValue<>(
+ validReferenceTimeMillis, validUtcTimeMillis);
+ long expectedSystemClockMillis4 =
+ TimeDetectorStrategy.getTimeAt(utcTime4, mScript.peekElapsedRealtimeMillis());
+ TimeSignal timeSignal4 = new TimeSignal(TimeSignal.SOURCE_ID_NITZ, utcTime4);
+ mScript.simulateTimeSignalReceived(timeSignal4)
+ .verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis4);
+ }
+
+ @Test
+ public void testSuggestTime_timeDetectionToggled() {
+ Scenario scenario = SCENARIO_1;
+ final int clockIncrementMillis = 100;
+ final int systemClockUpdateThreshold = 2000;
+ mScript.pokeFakeClocks(scenario)
+ .pokeThresholds(systemClockUpdateThreshold)
+ .pokeTimeDetectionEnabled(false);
+
+ TimeSignal timeSignal1 = scenario.createTimeSignalForActual(TimeSignal.SOURCE_ID_NITZ);
+ TimestampedValue<Long> utcTime1 = timeSignal1.getUtcTime();
+
+ // Simulate time passing.
+ mScript.simulateTimePassing(clockIncrementMillis);
+
+ // Simulate the time signal being received. It should not be used because auto time
+ // detection is off but it should be recorded.
+ mScript.simulateTimeSignalReceived(timeSignal1)
+ .verifySystemClockWasNotSetAndResetCallTracking();
+
+ // Simulate more time passing.
+ mScript.simulateTimePassing(clockIncrementMillis);
+
+ long expectedSystemClockMillis1 =
+ TimeDetectorStrategy.getTimeAt(utcTime1, mScript.peekElapsedRealtimeMillis());
+
+ // Turn on auto time detection.
+ mScript.simulateAutoTimeDetectionToggle()
+ .verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis1);
+
+ // Turn off auto time detection.
+ mScript.simulateAutoTimeDetectionToggle()
+ .verifySystemClockWasNotSetAndResetCallTracking();
+
+ // Receive another valid time signal.
+ // It should be on the threshold and accounting for the clock increments.
+ TimestampedValue<Long> utcTime2 = new TimestampedValue<>(
+ mScript.peekElapsedRealtimeMillis(),
+ mScript.peekSystemClockMillis() + systemClockUpdateThreshold);
+ TimeSignal timeSignal2 = new TimeSignal(TimeSignal.SOURCE_ID_NITZ, utcTime2);
+
+ // Simulate more time passing.
+ mScript.simulateTimePassing(clockIncrementMillis);
+
+ long expectedSystemClockMillis2 =
+ TimeDetectorStrategy.getTimeAt(utcTime2, mScript.peekElapsedRealtimeMillis());
+
+ // The new time, though valid, should not be set in the system clock because auto time is
+ // disabled.
+ mScript.simulateTimeSignalReceived(timeSignal2)
+ .verifySystemClockWasNotSetAndResetCallTracking();
+
+ // Turn on auto time detection.
+ mScript.simulateAutoTimeDetectionToggle()
+ .verifySystemClockWasSetAndResetCallTracking(expectedSystemClockMillis2);
+ }
+
+ @Test
+ public void testSuggestTime_unknownSource() {
+ Scenario scenario = SCENARIO_1;
+ mScript.pokeFakeClocks(scenario)
+ .pokeTimeDetectionEnabled(true);
+
+ TimeSignal timeSignal = scenario.createTimeSignalForActual("unknown");
+ mScript.simulateTimeSignalReceived(timeSignal)
+ .verifySystemClockWasNotSetAndResetCallTracking();
+ }
+
+ /**
+ * A fake implementation of TimeDetectorStrategy.Callback. Besides tracking changes and behaving
+ * like the real thing should, it also asserts preconditions.
+ */
+ private static class FakeCallback implements TimeDetectorStrategy.Callback {
+ private boolean mTimeDetectionEnabled;
+ private boolean mWakeLockAcquired;
+ private long mElapsedRealtimeMillis;
+ private long mSystemClockMillis;
+ private int mSystemClockUpdateThresholdMillis = 2000;
+
+ // Tracking operations.
+ private boolean mSystemClockWasSet;
+ private Intent mBroadcastSent;
+
+ @Override
+ public int systemClockUpdateThresholdMillis() {
+ return mSystemClockUpdateThresholdMillis;
+ }
+
+ @Override
+ public boolean isTimeDetectionEnabled() {
+ return mTimeDetectionEnabled;
+ }
+
+ @Override
+ public void acquireWakeLock() {
+ if (mWakeLockAcquired) {
+ fail("Wake lock already acquired");
+ }
+ mWakeLockAcquired = true;
+ }
+
+ @Override
+ public long elapsedRealtimeMillis() {
+ assertWakeLockAcquired();
+ return mElapsedRealtimeMillis;
+ }
+
+ @Override
+ public long systemClockMillis() {
+ assertWakeLockAcquired();
+ return mSystemClockMillis;
+ }
+
+ @Override
+ public void setSystemClock(long newTimeMillis) {
+ assertWakeLockAcquired();
+ mSystemClockWasSet = true;
+ mSystemClockMillis = newTimeMillis;
+ }
+
+ @Override
+ public void releaseWakeLock() {
+ assertWakeLockAcquired();
+ mWakeLockAcquired = false;
+ }
+
+ @Override
+ public void sendStickyBroadcast(Intent intent) {
+ assertNotNull(intent);
+ mBroadcastSent = intent;
+ }
+
+ // Methods below are for managing the fake's behavior.
+
+ public void pokeSystemClockUpdateThreshold(int thresholdMillis) {
+ mSystemClockUpdateThresholdMillis = thresholdMillis;
+ }
+
+ public void pokeElapsedRealtimeMillis(long elapsedRealtimeMillis) {
+ mElapsedRealtimeMillis = elapsedRealtimeMillis;
+ }
+
+ public void pokeSystemClockMillis(long systemClockMillis) {
+ mSystemClockMillis = systemClockMillis;
+ }
+
+ public void pokeTimeDetectionEnabled(boolean enabled) {
+ mTimeDetectionEnabled = enabled;
+ }
+
+ public long peekElapsedRealtimeMillis() {
+ return mElapsedRealtimeMillis;
+ }
+
+ public long peekSystemClockMillis() {
+ return mSystemClockMillis;
+ }
+
+ public void simulateTimePassing(int incrementMillis) {
+ mElapsedRealtimeMillis += incrementMillis;
+ mSystemClockMillis += incrementMillis;
+ }
+
+ public void verifySystemClockNotSet() {
+ assertFalse(mSystemClockWasSet);
+ }
+
+ public void verifySystemClockWasSet(long expectSystemClockMillis) {
+ assertTrue(mSystemClockWasSet);
+ assertEquals(expectSystemClockMillis, mSystemClockMillis);
+ }
+
+ public void verifyIntentWasBroadcast() {
+ assertTrue(mBroadcastSent != null);
+ }
+
+ public void verifyIntentWasNotBroadcast() {
+ assertNull(mBroadcastSent);
+ }
+
+ public void resetCallTracking() {
+ mSystemClockWasSet = false;
+ mBroadcastSent = null;
+ }
+
+ private void assertWakeLockAcquired() {
+ assertTrue("The operation must be performed only after acquiring the wakelock",
+ mWakeLockAcquired);
+ }
+ }
+
+ /**
+ * A fluent helper class for tests.
+ */
+ private class Script {
+
+ private final FakeCallback mFakeCallback;
+ private final SimpleTimeDetectorStrategy mSimpleTimeDetectorStrategy;
+
+ public Script() {
+ mFakeCallback = new FakeCallback();
+ mSimpleTimeDetectorStrategy = new SimpleTimeDetectorStrategy();
+ mSimpleTimeDetectorStrategy.initialize(mFakeCallback);
+
+ }
+
+ Script pokeTimeDetectionEnabled(boolean enabled) {
+ mFakeCallback.pokeTimeDetectionEnabled(enabled);
+ return this;
+ }
+
+ Script pokeFakeClocks(Scenario scenario) {
+ mFakeCallback.pokeElapsedRealtimeMillis(scenario.getInitialRealTimeMillis());
+ mFakeCallback.pokeSystemClockMillis(scenario.getInitialSystemClockMillis());
+ return this;
+ }
+
+ Script pokeThresholds(int systemClockUpdateThreshold) {
+ mFakeCallback.pokeSystemClockUpdateThreshold(systemClockUpdateThreshold);
+ return this;
+ }
+
+ long peekElapsedRealtimeMillis() {
+ return mFakeCallback.peekElapsedRealtimeMillis();
+ }
+
+ long peekSystemClockMillis() {
+ return mFakeCallback.peekSystemClockMillis();
+ }
+
+ Script simulateTimeSignalReceived(TimeSignal timeSignal) {
+ mSimpleTimeDetectorStrategy.suggestTime(timeSignal);
+ return this;
+ }
+
+ Script simulateAutoTimeDetectionToggle() {
+ boolean enabled = !mFakeCallback.isTimeDetectionEnabled();
+ mFakeCallback.pokeTimeDetectionEnabled(enabled);
+ mSimpleTimeDetectorStrategy.handleAutoTimeDetectionToggle(enabled);
+ return this;
+ }
+
+ Script simulateTimePassing(int clockIncrement) {
+ mFakeCallback.simulateTimePassing(clockIncrement);
+ return this;
+ }
+
+ Script verifySystemClockWasNotSetAndResetCallTracking() {
+ mFakeCallback.verifySystemClockNotSet();
+ mFakeCallback.verifyIntentWasNotBroadcast();
+ mFakeCallback.resetCallTracking();
+ return this;
+ }
+
+ Script verifySystemClockWasSetAndResetCallTracking(long expectSystemClockMillis) {
+ mFakeCallback.verifySystemClockWasSet(expectSystemClockMillis);
+ mFakeCallback.verifyIntentWasBroadcast();
+ mFakeCallback.resetCallTracking();
+ return this;
+ }
+ }
+
+ /**
+ * A starting scenario used during tests. Describes a fictional "physical" reality.
+ */
+ private static class Scenario {
+
+ private final long mInitialDeviceSystemClockMillis;
+ private final long mInitialDeviceRealtimeMillis;
+ private final long mActualTimeMillis;
+
+ Scenario(long initialDeviceSystemClock, long elapsedRealtime, long timeMillis) {
+ mInitialDeviceSystemClockMillis = initialDeviceSystemClock;
+ mActualTimeMillis = timeMillis;
+ mInitialDeviceRealtimeMillis = elapsedRealtime;
+ }
+
+ long getInitialRealTimeMillis() {
+ return mInitialDeviceRealtimeMillis;
+ }
+
+ long getInitialSystemClockMillis() {
+ return mInitialDeviceSystemClockMillis;
+ }
+
+ long getActualTimeMillis() {
+ return mActualTimeMillis;
+ }
+
+ TimeSignal createTimeSignalForActual(String sourceId) {
+ TimestampedValue<Long> time = new TimestampedValue<>(
+ mInitialDeviceRealtimeMillis, mActualTimeMillis);
+ return new TimeSignal(sourceId, time);
+ }
+
+ static class Builder {
+
+ private long mInitialDeviceSystemClockMillis;
+ private long mInitialDeviceRealtimeMillis;
+ private long mActualTimeMillis;
+
+ Builder setInitialDeviceSystemClockUtc(int year, int monthInYear, int day,
+ int hourOfDay, int minute, int second) {
+ mInitialDeviceSystemClockMillis = createUtcTime(year, monthInYear, day, hourOfDay,
+ minute, second);
+ return this;
+ }
+
+ Builder setInitialDeviceRealtimeMillis(long realtimeMillis) {
+ mInitialDeviceRealtimeMillis = realtimeMillis;
+ return this;
+ }
+
+ Builder setActualTimeUtc(int year, int monthInYear, int day, int hourOfDay,
+ int minute, int second) {
+ mActualTimeMillis =
+ createUtcTime(year, monthInYear, day, hourOfDay, minute, second);
+ return this;
+ }
+
+ Scenario build() {
+ return new Scenario(mInitialDeviceSystemClockMillis, mInitialDeviceRealtimeMillis,
+ mActualTimeMillis);
+ }
+ }
+ }
+
+ private static long createUtcTime(int year, int monthInYear, int day, int hourOfDay, int minute,
+ int second) {
+ Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("Etc/UTC"));
+ cal.clear();
+ cal.set(year, monthInYear - 1, day, hourOfDay, minute, second);
+ return cal.getTimeInMillis();
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
new file mode 100644
index 000000000000..ed74cd7b3e53
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timedetector;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.timedetector.TimeSignal;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.TimestampedValue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import com.android.server.timedetector.TimeDetectorStrategy.Callback;
+
+import java.io.PrintWriter;
+
+@RunWith(AndroidJUnit4.class)
+public class TimeDetectorServiceTest {
+
+ private Context mMockContext;
+ private StubbedTimeDetectorStrategy mStubbedTimeDetectorStrategy;
+ private Callback mMockCallback;
+
+ private TimeDetectorService mTimeDetectorService;
+
+ @Before
+ public void setUp() {
+ mMockContext = mock(Context.class);
+ mMockCallback = mock(Callback.class);
+ mStubbedTimeDetectorStrategy = new StubbedTimeDetectorStrategy();
+
+ mTimeDetectorService = new TimeDetectorService(
+ mMockContext, mMockCallback,
+ mStubbedTimeDetectorStrategy);
+ }
+
+ @Test(expected=SecurityException.class)
+ public void testStubbedCall_withoutPermission() {
+ doThrow(new SecurityException("Mock"))
+ .when(mMockContext).enforceCallingPermission(anyString(), any());
+ TimeSignal timeSignal = createNitzTimeSignal();
+
+ try {
+ mTimeDetectorService.suggestTime(timeSignal);
+ } finally {
+ verify(mMockContext).enforceCallingPermission(
+ eq(android.Manifest.permission.SET_TIME), anyString());
+ }
+ }
+
+ @Test
+ public void testSuggestTime() {
+ doNothing().when(mMockContext).enforceCallingPermission(anyString(), any());
+
+ TimeSignal timeSignal = createNitzTimeSignal();
+ mTimeDetectorService.suggestTime(timeSignal);
+
+ verify(mMockContext)
+ .enforceCallingPermission(eq(android.Manifest.permission.SET_TIME), anyString());
+ mStubbedTimeDetectorStrategy.verifySuggestTimeCalled(timeSignal);
+ }
+
+ @Test
+ public void testDump() {
+ when(mMockContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP))
+ .thenReturn(PackageManager.PERMISSION_GRANTED);
+
+ mTimeDetectorService.dump(null, null, null);
+
+ verify(mMockContext).checkCallingOrSelfPermission(eq(android.Manifest.permission.DUMP));
+ mStubbedTimeDetectorStrategy.verifyDumpCalled();
+ }
+
+ @Test
+ public void testAutoTimeDetectionToggle() {
+ when(mMockCallback.isTimeDetectionEnabled()).thenReturn(true);
+
+ mTimeDetectorService.handleAutoTimeDetectionToggle();
+
+ mStubbedTimeDetectorStrategy.verifyHandleAutoTimeDetectionToggleCalled(true);
+
+ when(mMockCallback.isTimeDetectionEnabled()).thenReturn(false);
+
+ mTimeDetectorService.handleAutoTimeDetectionToggle();
+
+ mStubbedTimeDetectorStrategy.verifyHandleAutoTimeDetectionToggleCalled(false);
+ }
+
+ private static TimeSignal createNitzTimeSignal() {
+ TimestampedValue<Long> timeValue = new TimestampedValue<>(100L, 1_000_000L);
+ return new TimeSignal(TimeSignal.SOURCE_ID_NITZ, timeValue);
+ }
+
+ private static class StubbedTimeDetectorStrategy implements TimeDetectorStrategy {
+
+ // Call tracking.
+ private TimeSignal mLastSuggestedTime;
+ private Boolean mLastAutoTimeDetectionToggle;
+ private boolean mDumpCalled;
+
+ @Override
+ public void initialize(Callback ignored) {
+ }
+
+ @Override
+ public void suggestTime(TimeSignal timeSignal) {
+ resetCallTracking();
+ mLastSuggestedTime = timeSignal;
+ }
+
+ @Override
+ public void handleAutoTimeDetectionToggle(boolean enabled) {
+ resetCallTracking();
+ mLastAutoTimeDetectionToggle = enabled;
+ }
+
+ @Override
+ public void dump(PrintWriter pw, String[] args) {
+ resetCallTracking();
+ mDumpCalled = true;
+ }
+
+ void resetCallTracking() {
+ mLastSuggestedTime = null;
+ mLastAutoTimeDetectionToggle = null;
+ mDumpCalled = false;
+ }
+
+ void verifySuggestTimeCalled(TimeSignal expectedSignal) {
+ assertEquals(expectedSignal, mLastSuggestedTime);
+ }
+
+ void verifyHandleAutoTimeDetectionToggleCalled(boolean expectedEnable) {
+ assertNotNull(mLastAutoTimeDetectionToggle);
+ assertEquals(expectedEnable, mLastAutoTimeDetectionToggle);
+ }
+
+ void verifyDumpCalled() {
+ assertTrue(mDumpCalled);
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java
new file mode 100644
index 000000000000..301ded47ee0b
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorStrategyTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timedetector;
+
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.runner.AndroidJUnit4;
+import android.util.TimestampedValue;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class TimeDetectorStrategyTest {
+
+ @Test
+ public void testGetTimeAt() {
+ long timeMillis = 1000L;
+ int referenceTimeMillis = 100;
+ TimestampedValue<Long> timestampedValue =
+ new TimestampedValue<>(referenceTimeMillis, timeMillis);
+ // Reference time is after the timestamp.
+ assertEquals(
+ timeMillis + (125 - referenceTimeMillis),
+ TimeDetectorStrategy.getTimeAt(timestampedValue, 125));
+
+ // Reference time is before the timestamp.
+ assertEquals(
+ timeMillis + (75 - referenceTimeMillis),
+ TimeDetectorStrategy.getTimeAt(timestampedValue, 75));
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
new file mode 100644
index 000000000000..19d31cfafc35
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.timezonedetector;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Unit tests for the {@link TimeZoneDetectorService}.
+ */
+@RunWith(AndroidJUnit4.class)
+public class TimeZoneDetectorServiceTest {
+
+ private TimeZoneDetectorService mTimeZoneDetectorService;
+
+ @Before
+ public void setUp() {
+ final Context context = InstrumentationRegistry.getContext();
+ mTimeZoneDetectorService = new TimeZoneDetectorService(context);
+ }
+
+ @Test
+ public void testStubbedCall() {
+ mTimeZoneDetectorService.stubbedCall();
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
index ff631e74e004..08b522c0c66e 100644
--- a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
@@ -151,11 +151,13 @@ public class BoundsAnimationControllerTests extends WindowTestsBase {
}
@Override
- public void onAnimationStart(boolean schedulePipModeChangedCallback, boolean forceUpdate) {
+ public boolean onAnimationStart(boolean schedulePipModeChangedCallback,
+ boolean forceUpdate) {
mAwaitingAnimationStart = false;
mAnimationStarted = true;
mSchedulePipModeChangedOnStart = schedulePipModeChangedCallback;
mForcePipModeChangedCallback = forceUpdate;
+ return true;
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index ac196f9c80dc..cd8e650406d2 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -17,6 +17,8 @@
package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
@@ -380,21 +382,58 @@ public class DisplayContentTests extends WindowTestsBase {
}
/**
- * This test enforces that the pinned stack is always kept as the top stack.
+ * This test enforces that alwaysOnTop stack is placed at proper position.
*/
@Test
- public void testPinnedStackLocation() {
+ public void testAlwaysOnTopStackLocation() {
+ final TaskStack alwaysOnTopStack = createStackControllerOnStackOnDisplay(
+ WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
+ final Task task = createTaskInStack(alwaysOnTopStack, 0 /* userId */);
+ alwaysOnTopStack.setAlwaysOnTop(true);
+ mDisplayContent.positionStackAt(POSITION_TOP, alwaysOnTopStack);
+ assertTrue(alwaysOnTopStack.isAlwaysOnTop());
+ // Ensure always on top state is synced to the children of the stack.
+ assertTrue(alwaysOnTopStack.getTopChild().isAlwaysOnTop());
+ assertEquals(alwaysOnTopStack, mDisplayContent.getTopStack());
+
final TaskStack pinnedStack = createStackControllerOnStackOnDisplay(
WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
- // Ensure that the pinned stack is the top stack
assertEquals(pinnedStack, mDisplayContent.getPinnedStack());
assertEquals(pinnedStack, mDisplayContent.getTopStack());
- // By default, this should try to create a new stack on top
- final TaskStack otherStack = createTaskStackOnDisplay(mDisplayContent);
- // Ensure that the other stack is on the display.
- assertEquals(mDisplayContent, otherStack.getDisplayContent());
- // Ensure that the pinned stack is still on top
- assertEquals(pinnedStack, mDisplayContent.getTopStack());
+
+ final TaskStack anotherAlwaysOnTopStack = createStackControllerOnStackOnDisplay(
+ WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
+ anotherAlwaysOnTopStack.setAlwaysOnTop(true);
+ mDisplayContent.positionStackAt(POSITION_TOP, anotherAlwaysOnTopStack);
+ assertTrue(anotherAlwaysOnTopStack.isAlwaysOnTop());
+ int topPosition = mDisplayContent.getStacks().size() - 1;
+ // Ensure the new alwaysOnTop stack is put below the pinned stack, but on top of the
+ // existing alwaysOnTop stack.
+ assertEquals(anotherAlwaysOnTopStack, mDisplayContent.getStacks().get(topPosition - 1));
+
+ final TaskStack nonAlwaysOnTopStack = createStackControllerOnStackOnDisplay(
+ WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
+ assertEquals(mDisplayContent, nonAlwaysOnTopStack.getDisplayContent());
+ topPosition = mDisplayContent.getStacks().size() - 1;
+ // Ensure the non-alwaysOnTop stack is put below the three alwaysOnTop stacks, but above the
+ // existing other non-alwaysOnTop stacks.
+ assertEquals(nonAlwaysOnTopStack, mDisplayContent.getStacks().get(topPosition - 3));
+
+ anotherAlwaysOnTopStack.setAlwaysOnTop(false);
+ mDisplayContent.positionStackAt(POSITION_TOP, anotherAlwaysOnTopStack);
+ assertFalse(anotherAlwaysOnTopStack.isAlwaysOnTop());
+ // Ensure, when always on top is turned off for a stack, the stack is put just below all
+ // other always on top stacks.
+ assertEquals(anotherAlwaysOnTopStack, mDisplayContent.getStacks().get(topPosition - 2));
+ anotherAlwaysOnTopStack.setAlwaysOnTop(true);
+
+ // Ensure always on top state changes properly when windowing mode changes.
+ anotherAlwaysOnTopStack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ assertFalse(anotherAlwaysOnTopStack.isAlwaysOnTop());
+ assertEquals(anotherAlwaysOnTopStack, mDisplayContent.getStacks().get(topPosition - 2));
+ anotherAlwaysOnTopStack.setWindowingMode(WINDOWING_MODE_FREEFORM);
+ assertTrue(anotherAlwaysOnTopStack.isAlwaysOnTop());
+ assertEquals(anotherAlwaysOnTopStack, mDisplayContent.getStacks().get(topPosition - 1));
}
/**
diff --git a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
index edac8a5202d7..79e9bb4c769d 100644
--- a/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/SurfaceAnimationRunnerTest.java
@@ -20,24 +20,23 @@ import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.animation.AnimationHandler;
import android.animation.AnimationHandler.AnimationFrameCallbackProvider;
import android.animation.ValueAnimator;
import android.graphics.Matrix;
import android.graphics.Point;
+import android.os.PowerManagerInternal;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import android.util.Log;
import android.view.Choreographer;
import android.view.Choreographer.FrameCallback;
import android.view.SurfaceControl;
@@ -46,7 +45,6 @@ import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import com.android.server.wm.LocalAnimationAdapter.AnimationSpec;
-import com.android.server.wm.SurfaceAnimationRunner.AnimatorFactory;
import org.junit.Before;
import org.junit.Rule;
@@ -71,6 +69,7 @@ public class SurfaceAnimationRunnerTest extends WindowTestsBase {
@Mock SurfaceControl mMockSurface;
@Mock Transaction mMockTransaction;
@Mock AnimationSpec mMockAnimationSpec;
+ @Mock PowerManagerInternal mMockPowerManager;
@Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
private SurfaceAnimationRunner mSurfaceAnimationRunner;
@@ -81,7 +80,7 @@ public class SurfaceAnimationRunnerTest extends WindowTestsBase {
super.setUp();
mFinishCallbackLatch = new CountDownLatch(1);
mSurfaceAnimationRunner = new SurfaceAnimationRunner(null /* callbackProvider */, null,
- mMockTransaction);
+ mMockTransaction, mMockPowerManager);
}
private void finishedCallback() {
@@ -113,7 +112,7 @@ public class SurfaceAnimationRunnerTest extends WindowTestsBase {
@Test
public void testCancel_notStarted() throws Exception {
mSurfaceAnimationRunner = new SurfaceAnimationRunner(new NoOpFrameCallbackProvider(), null,
- mMockTransaction);
+ mMockTransaction, mMockPowerManager);
mSurfaceAnimationRunner
.startAnimation(createTranslateAnimation(), mMockSurface, mMockTransaction,
this::finishedCallback);
@@ -126,7 +125,7 @@ public class SurfaceAnimationRunnerTest extends WindowTestsBase {
@Test
public void testCancel_running() throws Exception {
mSurfaceAnimationRunner = new SurfaceAnimationRunner(new NoOpFrameCallbackProvider(), null,
- mMockTransaction);
+ mMockTransaction, mMockPowerManager);
mSurfaceAnimationRunner.startAnimation(createTranslateAnimation(), mMockSurface,
mMockTransaction, this::finishedCallback);
waitUntilNextFrame();
@@ -156,7 +155,7 @@ public class SurfaceAnimationRunnerTest extends WindowTestsBase {
listener.onAnimationUpdate(animation);
});
}
- }, mMockTransaction);
+ }, mMockTransaction, mMockPowerManager);
when(mMockAnimationSpec.getDuration()).thenReturn(200L);
mSurfaceAnimationRunner.startAnimation(mMockAnimationSpec, mMockSurface, mMockTransaction,
this::finishedCallback);
@@ -184,6 +183,19 @@ public class SurfaceAnimationRunnerTest extends WindowTestsBase {
assertFinishCallbackCalled();
}
+ @Test
+ public void testPowerHint() throws Exception {
+ mSurfaceAnimationRunner = new SurfaceAnimationRunner(new NoOpFrameCallbackProvider(), null,
+ mMockTransaction, mMockPowerManager);
+ mSurfaceAnimationRunner.startAnimation(createTranslateAnimation(), mMockSurface,
+ mMockTransaction, this::finishedCallback);
+ waitUntilNextFrame();
+
+ // TODO: For some reason we don't have access to PowerHint definition from the tests. For
+ // now let's just verify that we got some kind of hint.
+ verify(mMockPowerManager).powerHint(anyInt(), anyInt());
+ }
+
private void waitUntilNextFrame() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
mSurfaceAnimationRunner.mChoreographer.postCallback(Choreographer.CALLBACK_COMMIT,
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java b/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
index 7bf7dd78711c..dc6bbbfe5285 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskPositionerTests.java
@@ -16,18 +16,23 @@
package com.android.server.wm;
+import android.app.IActivityManager;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
+import android.app.IActivityTaskManager;
import android.graphics.Rect;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
+import org.mockito.Mockito;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static com.android.server.wm.TaskPositioner.MIN_ASPECT;
import static com.android.server.wm.WindowManagerService.dipToPixel;
import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_HEIGHT_IN_DP;
@@ -54,6 +59,8 @@ public class TaskPositionerTests extends WindowTestsBase {
private int mMinVisibleWidth;
private int mMinVisibleHeight;
private TaskPositioner mPositioner;
+ private WindowState mWindow;
+ private Rect mDimBounds = new Rect();
@Before
public void setUp() throws Exception {
@@ -69,8 +76,20 @@ public class TaskPositionerTests extends WindowTestsBase {
mMinVisibleWidth = dipToPixel(MINIMUM_VISIBLE_WIDTH_IN_DP, dm);
mMinVisibleHeight = dipToPixel(MINIMUM_VISIBLE_HEIGHT_IN_DP, dm);
- mPositioner = TaskPositioner.create(sWm);
+ mPositioner = new TaskPositioner(sWm, Mockito.mock(IActivityTaskManager.class));
mPositioner.register(mDisplayContent);
+
+ mWindow = Mockito.spy(createWindow(null, TYPE_BASE_APPLICATION, "window"));
+ final Task task = Mockito.spy(mWindow.getTask());
+ Mockito.when(mWindow.getTask()).thenReturn(task);
+
+ Mockito.doAnswer(invocation -> {
+ final Rect rect = (Rect) invocation.getArguments()[0];
+ rect.set(mDimBounds);
+ return (Void) null;
+ }).when(task).getDimBounds(Mockito.any(Rect.class));
+
+ mWindow.getStack().setWindowingMode(WINDOWING_MODE_FREEFORM);
}
@Test
@@ -94,14 +113,14 @@ public class TaskPositionerTests extends WindowTestsBase {
* as does some basic tests (e.g. dragging in Y only will keep X stable).
*/
@Test
- @Ignore
public void testBasicFreeWindowResizing() throws Exception {
final Rect r = new Rect(100, 220, 700, 520);
final int midY = (r.top + r.bottom) / 2;
+ mDimBounds.set(r);
// Start a drag resize starting upper left.
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
assertBoundsEquals(r, mPositioner.getWindowDragBounds());
// Drag to a good landscape size.
@@ -127,8 +146,8 @@ public class TaskPositionerTests extends WindowTestsBase {
mPositioner.getWindowDragBounds());
// Start a drag resize left and see that only the left coord changes..
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, midY, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, midY);
// Drag to the left.
mPositioner.resizeDrag(0.0f, midY);
@@ -155,15 +174,15 @@ public class TaskPositionerTests extends WindowTestsBase {
* This tests that by dragging any edge, the fixed / opposite edge(s) remains anchored.
*/
@Test
- @Ignore
public void testFreeWindowResizingTestAllEdges() throws Exception {
final Rect r = new Rect(100, 220, 700, 520);
final int midX = (r.left + r.right) / 2;
final int midY = (r.top + r.bottom) / 2;
+ mDimBounds.set(r);
// Drag upper left.
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
mPositioner.resizeDrag(0.0f, 0.0f);
assertTrue(r.left != mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -171,8 +190,8 @@ public class TaskPositionerTests extends WindowTestsBase {
assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag upper.
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, midX, r.top - MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, midX, r.top - MOUSE_DELTA_Y);
mPositioner.resizeDrag(0.0f, 0.0f);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -180,8 +199,8 @@ public class TaskPositionerTests extends WindowTestsBase {
assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag upper right.
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, r.right + MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, r.right + MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
mPositioner.resizeDrag(r.right + 100, 0.0f);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertTrue(r.right != mPositioner.getWindowDragBounds().right);
@@ -189,8 +208,8 @@ public class TaskPositionerTests extends WindowTestsBase {
assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag right.
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, r.right + MOUSE_DELTA_X, midY, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, r.right + MOUSE_DELTA_X, midY);
mPositioner.resizeDrag(r.right + 100, 0.0f);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertTrue(r.right != mPositioner.getWindowDragBounds().right);
@@ -198,9 +217,9 @@ public class TaskPositionerTests extends WindowTestsBase {
assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag bottom right.
- mPositioner.startDrag(true /*resizing*/,
+ mPositioner.startDrag(mWindow, true /*resizing*/,
false /*preserveOrientation*/,
- r.right + MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y, r);
+ r.right + MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y);
mPositioner.resizeDrag(r.right + 100, r.bottom + 100);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertTrue(r.right != mPositioner.getWindowDragBounds().right);
@@ -208,8 +227,8 @@ public class TaskPositionerTests extends WindowTestsBase {
assertTrue(r.bottom != mPositioner.getWindowDragBounds().bottom);
// Drag bottom.
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, midX, r.bottom + MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, midX, r.bottom + MOUSE_DELTA_Y);
mPositioner.resizeDrag(r.right + 100, r.bottom + 100);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -217,8 +236,8 @@ public class TaskPositionerTests extends WindowTestsBase {
assertTrue(r.bottom != mPositioner.getWindowDragBounds().bottom);
// Drag bottom left.
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y);
mPositioner.resizeDrag(0.0f, r.bottom + 100);
assertTrue(r.left != mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -226,8 +245,8 @@ public class TaskPositionerTests extends WindowTestsBase {
assertTrue(r.bottom != mPositioner.getWindowDragBounds().bottom);
// Drag left.
- mPositioner.startDrag(true /*resizing*/,
- false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, midX, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ false /*preserveOrientation*/, r.left - MOUSE_DELTA_X, midX);
mPositioner.resizeDrag(0.0f, r.bottom + 100);
assertTrue(r.left != mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -240,12 +259,12 @@ public class TaskPositionerTests extends WindowTestsBase {
* right things upon resizing when dragged from the top left corner.
*/
@Test
- @Ignore
public void testLandscapePreservedWindowResizingDragTopLeft() throws Exception {
final Rect r = new Rect(100, 220, 700, 520);
+ mDimBounds.set(r);
- mPositioner.startDrag(true /*resizing*/,
- true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
assertBoundsEquals(r, mPositioner.getWindowDragBounds());
// Drag to a good landscape size.
@@ -278,13 +297,13 @@ public class TaskPositionerTests extends WindowTestsBase {
* right things upon resizing when dragged from the left corner.
*/
@Test
- @Ignore
public void testLandscapePreservedWindowResizingDragLeft() throws Exception {
final Rect r = new Rect(100, 220, 700, 520);
final int midY = (r.top + r.bottom) / 2;
+ mDimBounds.set(r);
- mPositioner.startDrag(true /*resizing*/,
- true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, midY, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, midY);
// Drag to the left.
mPositioner.resizeDrag(0.0f, midY);
@@ -319,13 +338,13 @@ public class TaskPositionerTests extends WindowTestsBase {
* right things upon resizing when dragged from the top corner.
*/
@Test
- @Ignore
public void testLandscapePreservedWindowResizingDragTop() throws Exception {
final Rect r = new Rect(100, 220, 700, 520);
final int midX = (r.left + r.right) / 2;
+ mDimBounds.set(r);
- mPositioner.startDrag(true /*resizing*/,
- true /*preserveOrientation*/, midX, r.top - MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ true /*preserveOrientation*/, midX, r.top - MOUSE_DELTA_Y);
// Drag to the left (no change).
mPositioner.resizeDrag(0.0f, r.top);
@@ -356,12 +375,12 @@ public class TaskPositionerTests extends WindowTestsBase {
* right things upon resizing when dragged from the top left corner.
*/
@Test
- @Ignore
public void testPortraitPreservedWindowResizingDragTopLeft() throws Exception {
final Rect r = new Rect(330, 100, 630, 600);
+ mDimBounds.set(r);
- mPositioner.startDrag(true /*resizing*/,
- true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
assertBoundsEquals(r, mPositioner.getWindowDragBounds());
// Drag to a good landscape size.
@@ -371,8 +390,8 @@ public class TaskPositionerTests extends WindowTestsBase {
mPositioner.getWindowDragBounds());
// Drag to a good portrait size.
- mPositioner.resizeDrag(500.0f, 0.0f);
- assertBoundsEquals(new Rect(500 + MOUSE_DELTA_X, MOUSE_DELTA_Y, r.right, r.bottom),
+ mPositioner.resizeDrag(400.0f, 0.0f);
+ assertBoundsEquals(new Rect(400 + MOUSE_DELTA_X, MOUSE_DELTA_Y, r.right, r.bottom),
mPositioner.getWindowDragBounds());
// Drag to a too small size for the height and the the width shrinking.
@@ -389,13 +408,13 @@ public class TaskPositionerTests extends WindowTestsBase {
* right things upon resizing when dragged from the left corner.
*/
@Test
- @Ignore
public void testPortraitPreservedWindowResizingDragLeft() throws Exception {
final Rect r = new Rect(330, 100, 630, 600);
final int midY = (r.top + r.bottom) / 2;
+ mDimBounds.set(r);
- mPositioner.startDrag(true /*resizing*/,
- true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, midY, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, midY);
// Drag to the left.
mPositioner.resizeDrag(0.0f, midY);
@@ -432,13 +451,13 @@ public class TaskPositionerTests extends WindowTestsBase {
* right things upon resizing when dragged from the top corner.
*/
@Test
- @Ignore
public void testPortraitPreservedWindowResizingDragTop() throws Exception {
final Rect r = new Rect(330, 100, 630, 600);
final int midX = (r.left + r.right) / 2;
+ mDimBounds.set(r);
- mPositioner.startDrag(true /*resizing*/,
- true /*preserveOrientation*/, midX, r.top - MOUSE_DELTA_Y, r);
+ mPositioner.startDrag(mWindow, true /*resizing*/,
+ true /*preserveOrientation*/, midX, r.top - MOUSE_DELTA_Y);
// Drag to the left (no change).
mPositioner.resizeDrag(0.0f, r.top);
@@ -472,9 +491,9 @@ public class TaskPositionerTests extends WindowTestsBase {
+ ") " + Log.getStackTraceString(new Throwable()));
}
}
- assertEquals(expected.left, actual.left);
- assertEquals(expected.right, actual.right);
- assertEquals(expected.top, actual.top);
- assertEquals(expected.bottom, actual.bottom);
+ assertEquals("left", expected.left, actual.left);
+ assertEquals("right", expected.right, actual.right);
+ assertEquals("top", expected.top, actual.top);
+ assertEquals("bottom", expected.bottom, actual.bottom);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
index b19373efd1b0..21402cee0b55 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java
@@ -59,7 +59,7 @@ public class TaskSnapshotSurfaceTest extends WindowTestsBase {
private void setupSurface(int width, int height, Rect contentInsets, int sysuiVis,
int windowFlags, Rect taskBounds) {
final GraphicBuffer buffer = GraphicBuffer.create(width, height, PixelFormat.RGBA_8888,
- GraphicBuffer.USAGE_SW_READ_NEVER | GraphicBuffer.USAGE_SW_WRITE_NEVER);
+ GraphicBuffer.USAGE_SW_READ_RARELY | GraphicBuffer.USAGE_SW_WRITE_NEVER);
final TaskSnapshot snapshot = new TaskSnapshot(buffer,
ORIENTATION_PORTRAIT, contentInsets, false, 1.0f, true /* isRealSnapshot */,
WINDOWING_MODE_FULLSCREEN, 0 /* systemUiVisibility */, false /* isTranslucent */);
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
index 513c1ecda990..10d7aad967b7 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowConfigurationTests.java
@@ -31,6 +31,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+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_WINDOWING_MODE;
import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
@@ -81,6 +82,11 @@ public class WindowConfigurationTests extends WindowTestsBase {
assertEquals(WINDOW_CONFIG_APP_BOUNDS | WINDOW_CONFIG_WINDOWING_MODE,
winConfig1.diff(winConfig2, false /* compareUndefined */));
+ winConfig2.setAlwaysOnTop(true);
+ assertEquals(WINDOW_CONFIG_APP_BOUNDS | WINDOW_CONFIG_WINDOWING_MODE
+ | WINDOW_CONFIG_ALWAYS_ON_TOP,
+ winConfig1.diff(winConfig2, false /* compareUndefined */));
+
assertEquals(0, config1.diff(config3));
assertEquals(0, config1.diffPublicOnly(config3));
assertEquals(0, winConfig1.diff(winConfig3, false /* compareUndefined */));
@@ -108,6 +114,12 @@ public class WindowConfigurationTests extends WindowTestsBase {
assertNotEquals(winConfig1.compareTo(winConfig2), 0);
winConfig2.setWindowingMode(winConfig1.getWindowingMode());
+ // Different always on top state
+ winConfig2.setAlwaysOnTop(true);
+ assertNotEquals(config1.compareTo(config2), 0);
+ assertNotEquals(winConfig1.compareTo(winConfig2), 0);
+ winConfig2.setAlwaysOnTop(winConfig1.isAlwaysOnTop());
+
// Different bounds
winConfig2.setAppBounds(0, 2, 3, 4);
assertNotEquals(config1.compareTo(config2), 0);
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
index 6c7830e5cf79..f8b282848489 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowContainerTests.java
@@ -256,6 +256,33 @@ public class WindowContainerTests extends WindowTestsBase {
}
@Test
+ public void testAddChildByIndex() throws Exception {
+ final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
+ final TestWindowContainer root = builder.setLayer(0).build();
+
+ final TestWindowContainer child = root.addChildWindow();
+
+ final TestWindowContainer child2 = builder.setLayer(1).build();
+ final TestWindowContainer child3 = builder.setLayer(2).build();
+ final TestWindowContainer child4 = builder.setLayer(3).build();
+
+ // Test adding at top.
+ root.addChild(child2, POSITION_TOP);
+ assertEquals(child2, root.getChildAt(root.getChildrenCount() - 1));
+
+ // Test adding at bottom.
+ root.addChild(child3, POSITION_BOTTOM);
+ assertEquals(child3, root.getChildAt(0));
+
+ // Test adding in the middle.
+ root.addChild(child4, 1);
+ assertEquals(child3, root.getChildAt(0));
+ assertEquals(child4, root.getChildAt(1));
+ assertEquals(child, root.getChildAt(2));
+ assertEquals(child2, root.getChildAt(3));
+ }
+
+ @Test
public void testPositionChildAt() throws Exception {
final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
final TestWindowContainer root = builder.setLayer(0).build();
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
index d91079e3bb1b..d13c3c9efc20 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
@@ -91,15 +91,17 @@ public class WindowManagerServiceRule implements TestRule {
LocalServices.addService(ActivityManagerInternal.class,
mock(ActivityManagerInternal.class));
- final ActivityManagerInternal am =
- LocalServices.getService(ActivityManagerInternal.class);
+ LocalServices.addService(ActivityTaskManagerInternal.class,
+ mock(ActivityTaskManagerInternal.class));
+ final ActivityTaskManagerInternal atm =
+ LocalServices.getService(ActivityTaskManagerInternal.class);
doAnswer((InvocationOnMock invocationOnMock) -> {
final Runnable runnable = invocationOnMock.<Runnable>getArgument(0);
if (runnable != null) {
runnable.run();
}
return null;
- }).when(am).notifyKeyguardFlagsChanged(any());
+ }).when(atm).notifyKeyguardFlagsChanged(any());
InputManagerService ims = mock(InputManagerService.class);
// InputChannel is final and can't be mocked.
@@ -125,6 +127,7 @@ public class WindowManagerServiceRule implements TestRule {
LocalServices.removeServiceForTest(DisplayManagerInternal.class);
LocalServices.removeServiceForTest(PowerManagerInternal.class);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+ LocalServices.removeServiceForTest(ActivityTaskManagerInternal.class);
LocalServices.removeServiceForTest(WindowManagerInternal.class);
LocalServices.removeServiceForTest(WindowManagerPolicy.class);
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
index 85e846db60b7..9f113ad3137e 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -16,6 +16,8 @@
package com.android.server.wm;
+import android.graphics.Rect;
+import android.view.SurfaceControl;
import android.view.WindowManager;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -29,6 +31,8 @@ import java.util.LinkedList;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.hardware.camera2.params.OutputConfiguration.ROTATION_90;
+import static android.view.Surface.ROTATION_0;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
@@ -48,8 +52,10 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
@@ -349,6 +355,32 @@ public class WindowStateTests extends WindowTestsBase {
assertThat(app.getDisplayId(), is(mDisplayContent.getDisplayId()));
}
+ @Test
+ public void testSeamlesslyRotateWindow() {
+ final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+ final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
+
+ app.mHasSurface = true;
+ app.mSurfaceControl = mock(SurfaceControl.class);
+ app.mWinAnimator.mSurfaceController = mock(WindowSurfaceController.class);
+ try {
+ app.mFrame.set(10, 20, 60, 80);
+
+ app.seamlesslyRotate(t, ROTATION_0, ROTATION_90);
+
+ assertTrue(app.mSeamlesslyRotated);
+ assertEquals(new Rect(20, mDisplayInfo.logicalWidth - 60,
+ 80, mDisplayInfo.logicalWidth - 10), app.mFrame);
+
+ verify(t).setPosition(app.mSurfaceControl, app.mFrame.left, app.mFrame.top);
+ verify(app.mWinAnimator.mSurfaceController).setPosition(t, 0, 50, false);
+ verify(app.mWinAnimator.mSurfaceController).setMatrix(t, 0, -1, 1, 0, false);
+ } finally {
+ app.mSurfaceControl = null;
+ app.mHasSurface = false;
+ }
+ }
+
private void testPrepareWindowToDisplayDuringRelayout(boolean wasVisible) {
reset(mPowerManagerWrapper);
final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/CoordinateTransformsTest.java b/services/tests/servicestests/src/com/android/server/wm/utils/CoordinateTransformsTest.java
index 40a10e04c893..361522cfc880 100644
--- a/services/tests/servicestests/src/com/android/server/wm/utils/CoordinateTransformsTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/utils/CoordinateTransformsTest.java
@@ -21,14 +21,19 @@ import static android.view.Surface.ROTATION_180;
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
+import static com.android.server.wm.utils.CoordinateTransforms.transformLogicalToPhysicalCoordinates;
import static com.android.server.wm.utils.CoordinateTransforms.transformPhysicalToLogicalCoordinates;
+
+import static com.android.server.wm.utils.CoordinateTransforms.transformToRotation;
+
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.*;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.PointF;
+import android.view.DisplayInfo;
import org.junit.Before;
import org.junit.Rule;
@@ -41,6 +46,7 @@ public class CoordinateTransformsTest {
private static final int H = 400;
private final Matrix mMatrix = new Matrix();
+ private final Matrix mMatrix2 = new Matrix();
@Rule
public final ErrorCollector mErrorCollector = new ErrorCollector();
@@ -48,39 +54,140 @@ public class CoordinateTransformsTest {
@Before
public void setUp() throws Exception {
mMatrix.setTranslate(0xdeadbeef, 0xdeadbeef);
+ mMatrix2.setTranslate(0xbeefdead, 0xbeefdead);
}
@Test
- public void transformPhysicalToLogicalCoordinates_rot0() throws Exception {
+ public void transformPhysicalToLogicalCoordinates_rot0() {
transformPhysicalToLogicalCoordinates(ROTATION_0, W, H, mMatrix);
assertThat(mMatrix, is(Matrix.IDENTITY_MATRIX));
}
@Test
- public void transformPhysicalToLogicalCoordinates_rot90() throws Exception {
+ public void transformPhysicalToLogicalCoordinates_rot90() {
transformPhysicalToLogicalCoordinates(ROTATION_90, W, H, mMatrix);
- checkDevicePoint(0, 0).mapsToLogicalPoint(0, W);
- checkDevicePoint(W, H).mapsToLogicalPoint(H, 0);
+ checkPoint(0, 0).transformsTo(0, W);
+ checkPoint(W, H).transformsTo(H, 0);
}
@Test
- public void transformPhysicalToLogicalCoordinates_rot180() throws Exception {
+ public void transformPhysicalToLogicalCoordinates_rot180() {
transformPhysicalToLogicalCoordinates(ROTATION_180, W, H, mMatrix);
- checkDevicePoint(0, 0).mapsToLogicalPoint(W, H);
- checkDevicePoint(W, H).mapsToLogicalPoint(0, 0);
+ checkPoint(0, 0).transformsTo(W, H);
+ checkPoint(W, H).transformsTo(0, 0);
}
@Test
- public void transformPhysicalToLogicalCoordinates_rot270() throws Exception {
+ public void transformPhysicalToLogicalCoordinates_rot270() {
transformPhysicalToLogicalCoordinates(ROTATION_270, W, H, mMatrix);
- checkDevicePoint(0, 0).mapsToLogicalPoint(H, 0);
- checkDevicePoint(W, H).mapsToLogicalPoint(0, W);
+ checkPoint(0, 0).transformsTo(H, 0);
+ checkPoint(W, H).transformsTo(0, W);
+ }
+
+ @Test
+ public void transformLogicalToPhysicalCoordinates_rot0() {
+ transformLogicalToPhysicalCoordinates(ROTATION_0, W, H, mMatrix);
+ assertThat(mMatrix, is(Matrix.IDENTITY_MATRIX));
+ }
+
+ @Test
+ public void transformLogicalToPhysicalCoordinates_rot90() {
+ transformLogicalToPhysicalCoordinates(ROTATION_90, W, H, mMatrix);
+
+ checkPoint(0, W).transformsTo(0, 0);
+ checkPoint(H, 0).transformsTo(W, H);
+}
+
+ @Test
+ public void transformLogicalToPhysicalCoordinates_rot180() {
+ transformLogicalToPhysicalCoordinates(ROTATION_180, W, H, mMatrix);
+
+ checkPoint(W, H).transformsTo(0, 0);
+ checkPoint(0, 0).transformsTo(W, H);
+ }
+
+ @Test
+ public void transformLogicalToPhysicalCoordinates_rot270() {
+ transformLogicalToPhysicalCoordinates(ROTATION_270, W, H, mMatrix);
+
+ checkPoint(H, 0).transformsTo(0, 0);
+ checkPoint(0, W).transformsTo(W, H);
+ }
+
+ @Test
+ public void transformLogicalToPhysicalCoordinatesIsInverse_rot0() {
+ transformLogicalToPhysicalCoordinates(ROTATION_0, W, H, mMatrix);
+ transformPhysicalToLogicalCoordinates(ROTATION_0, W, H, mMatrix2);
+
+ assertMatricesAreInverses(mMatrix, mMatrix2);
+ }
+
+ @Test
+ public void transformLogicalToPhysicalCoordinatesIsInverse_rot90() {
+ transformLogicalToPhysicalCoordinates(ROTATION_90, W, H, mMatrix);
+ transformPhysicalToLogicalCoordinates(ROTATION_90, W, H, mMatrix2);
+
+ assertMatricesAreInverses(mMatrix, mMatrix2);
+ }
+
+ @Test
+ public void transformLogicalToPhysicalCoordinatesIsInverse_rot180() {
+ transformLogicalToPhysicalCoordinates(ROTATION_180, W, H, mMatrix);
+ transformPhysicalToLogicalCoordinates(ROTATION_180, W, H, mMatrix2);
+
+ assertMatricesAreInverses(mMatrix, mMatrix2);
+ }
+
+ @Test
+ public void transformLogicalToPhysicalCoordinatesIsInverse_rot270() {
+ transformLogicalToPhysicalCoordinates(ROTATION_270, W, H, mMatrix);
+ transformPhysicalToLogicalCoordinates(ROTATION_270, W, H, mMatrix2);
+
+ assertMatricesAreInverses(mMatrix, mMatrix2);
+ }
+
+ @Test
+ public void transformBetweenRotations_rot180_rot270() {
+ // W,H are flipped, because they need to be given in the new orientation, i.e. ROT_270.
+ transformToRotation(ROTATION_180, ROTATION_270, H, W, mMatrix);
+
+ checkPoint(0, 0).transformsTo(0, W);
+ checkPoint(W, H).transformsTo(H, 0);
+ }
+
+ @Test
+ public void transformBetweenRotations_rot90_rot0() {
+ transformToRotation(ROTATION_180, ROTATION_270, W, H, mMatrix);
+
+ checkPoint(0, 0).transformsTo(0, H);
+ // H,W is bottom right in ROT_90
+ checkPoint(H, W).transformsTo(W, 0);
+ }
+
+ @Test
+ public void transformBetweenRotations_displayInfo() {
+ final DisplayInfo di = new DisplayInfo();
+ di.rotation = ROTATION_90;
+ di.logicalWidth = H; // dimensions are flipped in ROT_90
+ di.logicalHeight = W;
+ transformToRotation(ROTATION_180, ROTATION_270, di, mMatrix);
+
+ // W,H are flipped, because they need to be given in the new orientation, i.e. ROT_270.
+ transformToRotation(ROTATION_180, ROTATION_270, H, W, mMatrix2);
+
+ assertEquals(mMatrix2, mMatrix);
+ }
+
+ private void assertMatricesAreInverses(Matrix matrix, Matrix matrix2) {
+ final Matrix concat = new Matrix();
+ concat.setConcat(matrix, matrix2);
+ assertTrue("expected identity, but was: " + concat, concat.isIdentity());
}
- private DevicePointAssertable checkDevicePoint(int x, int y) {
+ private TransformPointAssertable checkPoint(int x, int y) {
final Point devicePoint = new Point(x, y);
final float[] fs = new float[] {x, y};
mMatrix.mapPoints(fs);
@@ -92,7 +199,7 @@ public class CoordinateTransformsTest {
};
}
- public interface DevicePointAssertable {
- void mapsToLogicalPoint(int x, int y);
+ public interface TransformPointAssertable {
+ void transformsTo(int x, int y);
}
} \ No newline at end of file
diff --git a/services/tests/uiservicestests/Android.mk b/services/tests/uiservicestests/Android.mk
index b98bc8937aa9..840517954a0a 100644
--- a/services/tests/uiservicestests/Android.mk
+++ b/services/tests/uiservicestests/Android.mk
@@ -52,7 +52,7 @@ LOCAL_JNI_SHARED_LIBRARIES := \
libnativehelper \
libnetdaidl \
libui \
- libunwind \
+ libunwindstack \
libutils
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
index 78099996a1a0..dbba2b287382 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java
@@ -19,7 +19,9 @@ import static android.app.Notification.GROUP_ALERT_ALL;
import static android.app.Notification.GROUP_ALERT_CHILDREN;
import static android.app.Notification.GROUP_ALERT_SUMMARY;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_MIN;
+import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_LIGHTS;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull;
@@ -149,6 +151,9 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
mService.setFallbackVibrationPattern(FALLBACK_VIBRATION_PATTERN);
mService.setUsageStats(mUsageStats);
mService.setAccessibilityManager(accessibilityManager);
+ mService.mScreenOn = false;
+ mService.mInCall = false;
+ mService.mNotificationPulseEnabled = true;
}
//
@@ -190,6 +195,11 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
true /* noisy */, false /* buzzy*/, false /* lights */);
}
+ private NotificationRecord getInsistentBeepyOnceNotification() {
+ return getNotificationRecord(mId, true /* insistent */, true /* once */,
+ true /* noisy */, false /* buzzy*/, false /* lights */);
+ }
+
private NotificationRecord getInsistentBeepyLeanbackNotification() {
return getLeanbackNotificationRecord(mId, true /* insistent */, false /* once */,
true /* noisy */, false /* buzzy*/, false /* lights */);
@@ -216,8 +226,13 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
}
private NotificationRecord getLightsNotification() {
+ return getNotificationRecord(mId, false /* insistent */, false /* once */,
+ false /* noisy */, false /* buzzy*/, true /* lights */);
+ }
+
+ private NotificationRecord getLightsOnceNotification() {
return getNotificationRecord(mId, false /* insistent */, true /* once */,
- false /* noisy */, true /* buzzy*/, true /* lights */);
+ false /* noisy */, false /* buzzy*/, true /* lights */);
}
private NotificationRecord getCustomLightsNotification() {
@@ -244,6 +259,12 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
groupKey, groupAlertBehavior, false);
}
+ private NotificationRecord getLightsNotificationRecord(String groupKey,
+ int groupAlertBehavior) {
+ return getNotificationRecord(mId, false, false, false, false, true /*lights*/, true, true,
+ true, groupKey, groupAlertBehavior, false);
+ }
+
private NotificationRecord getNotificationRecord(int id, boolean insistent, boolean once,
boolean noisy, boolean buzzy, boolean lights, boolean defaultVibration,
boolean defaultSound, boolean defaultLights, String groupKey, int groupAlertBehavior,
@@ -369,6 +390,10 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
verify(mVibrator, never()).cancel();
}
+ private void verifyNeverLights() {
+ verify(mLight, never()).setFlashing(anyInt(), anyInt(), anyInt(), anyInt());
+ }
+
private void verifyLights() {
verify(mLight, times(1)).setFlashing(anyInt(), anyInt(), anyInt(), anyInt());
}
@@ -507,6 +532,24 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
assertFalse(s.isInterruptive());
}
+ /**
+ * Tests the case where the user re-posts a {@link Notification} with looping sound where
+ * {@link Notification.Builder#setOnlyAlertOnce(true)} has been called. This should silence
+ * the sound associated with the notification.
+ * @throws Exception
+ */
+ @Test
+ public void testNoisyOnceUpdateDoesCancelAudio() throws Exception {
+ NotificationRecord r = getInsistentBeepyNotification();
+ NotificationRecord s = getInsistentBeepyOnceNotification();
+ s.isUpdate = true;
+
+ mService.buzzBeepBlinkLocked(r);
+ mService.buzzBeepBlinkLocked(s);
+
+ verifyStopAudio();
+ }
+
@Test
public void testQuietUpdateDoesNotCancelAudioFromOther() throws Exception {
NotificationRecord r = getBeepyNotification();
@@ -712,7 +755,8 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
mService.buzzBeepBlinkLocked(summary);
verifyBeepLooped();
- assertTrue(summary.isInterruptive());
+ // summaries are never interruptive for notification counts
+ assertFalse(summary.isInterruptive());
}
@Test
@@ -990,6 +1034,156 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
verify(mAccessibilityService, times(1)).sendAccessibilityEvent(any(), anyInt());
}
+ @Test
+ public void testLightsScreenOn() {
+ mService.mScreenOn = true;
+ NotificationRecord r = getLightsNotification();
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverLights();
+ assertFalse(r.isInterruptive());
+ }
+
+ @Test
+ public void testLightsInCall() {
+ mService.mInCall = true;
+ NotificationRecord r = getLightsNotification();
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverLights();
+ assertFalse(r.isInterruptive());
+ }
+
+ @Test
+ public void testLightsSilentUpdate() {
+ NotificationRecord r = getLightsOnceNotification();
+ mService.buzzBeepBlinkLocked(r);
+ verifyLights();
+ assertTrue(r.isInterruptive());
+
+ r = getLightsOnceNotification();
+ r.isUpdate = true;
+ mService.buzzBeepBlinkLocked(r);
+ // checks that lights happened once, i.e. this new call didn't trigger them again
+ verifyLights();
+ assertFalse(r.isInterruptive());
+ }
+
+ @Test
+ public void testLightsUnimportant() {
+ NotificationRecord r = getLightsNotification();
+ r.setImportance(IMPORTANCE_LOW, "testing");
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverLights();
+ assertFalse(r.isInterruptive());
+ }
+
+ @Test
+ public void testLightsNoLights() {
+ NotificationRecord r = getQuietNotification();
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverLights();
+ assertFalse(r.isInterruptive());
+ }
+
+ @Test
+ public void testLightsNoLightOnDevice() {
+ mService.mHasLight = false;
+ NotificationRecord r = getLightsNotification();
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverLights();
+ assertFalse(r.isInterruptive());
+ }
+
+ @Test
+ public void testLightsLightsOffGlobally() {
+ mService.mNotificationPulseEnabled = false;
+ NotificationRecord r = getLightsNotification();
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverLights();
+ assertFalse(r.isInterruptive());
+ }
+
+ @Test
+ public void testLightsDndIntercepted() {
+ NotificationRecord r = getLightsNotification();
+ r.setSuppressedVisualEffects(SUPPRESSED_EFFECT_LIGHTS);
+ mService.buzzBeepBlinkLocked(r);
+ verifyNeverLights();
+ assertFalse(r.isInterruptive());
+ }
+
+ @Test
+ public void testGroupAlertSummaryNoLightsChild() {
+ NotificationRecord child = getLightsNotificationRecord("a", GROUP_ALERT_SUMMARY);
+
+ mService.buzzBeepBlinkLocked(child);
+
+ verifyNeverLights();
+ assertFalse(child.isInterruptive());
+ }
+
+ @Test
+ public void testGroupAlertSummaryLightsSummary() {
+ NotificationRecord summary = getLightsNotificationRecord("a", GROUP_ALERT_SUMMARY);
+ summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
+
+ mService.buzzBeepBlinkLocked(summary);
+
+ verifyLights();
+ // summaries should never count for interruptiveness counts
+ assertFalse(summary.isInterruptive());
+ }
+
+ @Test
+ public void testGroupAlertSummaryLightsNonGroupChild() {
+ NotificationRecord nonGroup = getLightsNotificationRecord(null, GROUP_ALERT_SUMMARY);
+
+ mService.buzzBeepBlinkLocked(nonGroup);
+
+ verifyLights();
+ assertTrue(nonGroup.isInterruptive());
+ }
+
+ @Test
+ public void testGroupAlertChildNoLightsSummary() {
+ NotificationRecord summary = getLightsNotificationRecord("a", GROUP_ALERT_CHILDREN);
+ summary.getNotification().flags |= Notification.FLAG_GROUP_SUMMARY;
+
+ mService.buzzBeepBlinkLocked(summary);
+
+ verifyNeverLights();
+ assertFalse(summary.isInterruptive());
+ }
+
+ @Test
+ public void testGroupAlertChildLightsChild() {
+ NotificationRecord child = getLightsNotificationRecord("a", GROUP_ALERT_CHILDREN);
+
+ mService.buzzBeepBlinkLocked(child);
+
+ verifyLights();
+ assertTrue(child.isInterruptive());
+ }
+
+ @Test
+ public void testGroupAlertChildLightsNonGroupSummary() {
+ NotificationRecord nonGroup = getLightsNotificationRecord(null, GROUP_ALERT_CHILDREN);
+
+ mService.buzzBeepBlinkLocked(nonGroup);
+
+ verifyLights();
+ assertTrue(nonGroup.isInterruptive());
+ }
+
+ @Test
+ public void testGroupAlertAllLightsGroup() {
+ NotificationRecord group = getLightsNotificationRecord("a", GROUP_ALERT_ALL);
+
+ mService.buzzBeepBlinkLocked(group);
+
+ verifyLights();
+ assertTrue(group.isInterruptive());
+ }
+
static class VibrateRepeatMatcher implements ArgumentMatcher<VibrationEffect> {
private final int mRepeatIndex;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
index 8d4c5b1df7d2..84ef0c9c7a4a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/GroupHelperTest.java
@@ -50,13 +50,14 @@ import java.util.Map;
public class GroupHelperTest extends UiServiceTestCase {
private @Mock GroupHelper.Callback mCallback;
+ private final static int AUTOGROUP_AT_COUNT = 4;
private GroupHelper mGroupHelper;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mGroupHelper = new GroupHelper(mCallback);
+ mGroupHelper = new GroupHelper(AUTOGROUP_AT_COUNT, mCallback);
}
private StatusBarNotification getSbn(String pkg, int id, String tag,
@@ -79,7 +80,7 @@ public class GroupHelperTest extends UiServiceTestCase {
@Test
public void testNoGroup_postingUnderLimit() throws Exception {
final String pkg = "package";
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT - 1; i++) {
mGroupHelper.onNotificationPosted(getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM),
false);
}
@@ -94,12 +95,12 @@ public class GroupHelperTest extends UiServiceTestCase {
public void testNoGroup_multiPackage() throws Exception {
final String pkg = "package";
final String pkg2 = "package2";
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT - 1; i++) {
mGroupHelper.onNotificationPosted(getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM),
false);
}
mGroupHelper.onNotificationPosted(
- getSbn(pkg2, GroupHelper.AUTOGROUP_AT_COUNT, "four", UserHandle.SYSTEM), false);
+ getSbn(pkg2, AUTOGROUP_AT_COUNT, "four", UserHandle.SYSTEM), false);
verify(mCallback, never()).addAutoGroupSummary(
eq(UserHandle.USER_SYSTEM), eq(pkg), anyString());
verify(mCallback, never()).addAutoGroup(anyString());
@@ -110,13 +111,12 @@ public class GroupHelperTest extends UiServiceTestCase {
@Test
public void testNoGroup_multiUser() throws Exception {
final String pkg = "package";
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT - 1; i++) {
mGroupHelper.onNotificationPosted(getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM),
false);
}
mGroupHelper.onNotificationPosted(
- getSbn(pkg, GroupHelper.AUTOGROUP_AT_COUNT, "four", UserHandle.ALL),
- false);
+ getSbn(pkg, AUTOGROUP_AT_COUNT, "four", UserHandle.ALL), false);
verify(mCallback, never()).addAutoGroupSummary(anyInt(), eq(pkg), anyString());
verify(mCallback, never()).addAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroup(anyString());
@@ -126,13 +126,12 @@ public class GroupHelperTest extends UiServiceTestCase {
@Test
public void testNoGroup_someAreGrouped() throws Exception {
final String pkg = "package";
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT - 1; i++) {
mGroupHelper.onNotificationPosted(
getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM), false);
}
mGroupHelper.onNotificationPosted(
- getSbn(pkg, GroupHelper.AUTOGROUP_AT_COUNT, "four", UserHandle.SYSTEM, "a"),
- false);
+ getSbn(pkg, AUTOGROUP_AT_COUNT, "four", UserHandle.SYSTEM, "a"), false);
verify(mCallback, never()).addAutoGroupSummary(
eq(UserHandle.USER_SYSTEM), eq(pkg), anyString());
verify(mCallback, never()).addAutoGroup(anyString());
@@ -144,12 +143,12 @@ public class GroupHelperTest extends UiServiceTestCase {
@Test
public void testPostingOverLimit() throws Exception {
final String pkg = "package";
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT; i++) {
mGroupHelper.onNotificationPosted(
getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM), false);
}
verify(mCallback, times(1)).addAutoGroupSummary(anyInt(), eq(pkg), anyString());
- verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT)).addAutoGroup(anyString());
+ verify(mCallback, times(AUTOGROUP_AT_COUNT)).addAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString());
}
@@ -158,18 +157,18 @@ public class GroupHelperTest extends UiServiceTestCase {
public void testDropToZeroRemoveGroup() throws Exception {
final String pkg = "package";
List<StatusBarNotification> posted = new ArrayList<>();
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT; i++) {
final StatusBarNotification sbn = getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM);
posted.add(sbn);
mGroupHelper.onNotificationPosted(sbn, false);
}
verify(mCallback, times(1)).addAutoGroupSummary(anyInt(), eq(pkg), anyString());
- verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT)).addAutoGroup(anyString());
+ verify(mCallback, times(AUTOGROUP_AT_COUNT)).addAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString());
Mockito.reset(mCallback);
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT - 1; i++) {
mGroupHelper.onNotificationRemoved(posted.remove(0));
}
verify(mCallback, never()).removeAutoGroup(anyString());
@@ -185,28 +184,28 @@ public class GroupHelperTest extends UiServiceTestCase {
public void testAppStartsGrouping() throws Exception {
final String pkg = "package";
List<StatusBarNotification> posted = new ArrayList<>();
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT; i++) {
final StatusBarNotification sbn = getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM);
posted.add(sbn);
mGroupHelper.onNotificationPosted(sbn, false);
}
verify(mCallback, times(1)).addAutoGroupSummary(anyInt(), eq(pkg), anyString());
- verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT)).addAutoGroup(anyString());
+ verify(mCallback, times(AUTOGROUP_AT_COUNT)).addAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString());
Mockito.reset(mCallback);
int i = 0;
- for (i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 2; i++) {
+ for (i = 0; i < AUTOGROUP_AT_COUNT - 2; i++) {
final StatusBarNotification sbn =
getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM, "app group");
mGroupHelper.onNotificationPosted(sbn, false);
}
- verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT - 2)).removeAutoGroup(anyString());
+ verify(mCallback, times(AUTOGROUP_AT_COUNT - 2)).removeAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString());
Mockito.reset(mCallback);
- for (; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) {
+ for (; i < AUTOGROUP_AT_COUNT; i++) {
final StatusBarNotification sbn =
getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM, "app group");
mGroupHelper.onNotificationPosted(sbn, false);
@@ -220,13 +219,13 @@ public class GroupHelperTest extends UiServiceTestCase {
throws Exception {
final String pkg = "package";
List<StatusBarNotification> posted = new ArrayList<>();
- for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) {
+ for (int i = 0; i < AUTOGROUP_AT_COUNT; i++) {
final StatusBarNotification sbn = getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM);
posted.add(sbn);
mGroupHelper.onNotificationPosted(sbn, false);
}
verify(mCallback, times(1)).addAutoGroupSummary(anyInt(), eq(pkg), anyString());
- verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT)).addAutoGroup(anyString());
+ verify(mCallback, times(AUTOGROUP_AT_COUNT)).addAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroup(anyString());
verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString());
Mockito.reset(mCallback);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
index fd674f0c3858..f17a30ddb1b6 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAdjustmentExtractorTest.java
@@ -25,6 +25,9 @@ import static junit.framework.Assert.assertTrue;
import android.app.Notification;
import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.UserHandle;
import android.service.notification.Adjustment;
@@ -54,6 +57,9 @@ public class NotificationAdjustmentExtractorTest extends UiServiceTestCase {
ArrayList<String> people = new ArrayList<>();
people.add("you");
signals.putStringArrayList(Adjustment.KEY_PEOPLE, people);
+ ArrayList<Notification.Action> smartActions = new ArrayList<>();
+ smartActions.add(createAction());
+ signals.putParcelableArrayList(Adjustment.KEY_SMART_ACTIONS, smartActions);
Adjustment adjustment = new Adjustment("pkg", r.getKey(), signals, "", 0);
r.addAdjustment(adjustment);
@@ -66,6 +72,7 @@ public class NotificationAdjustmentExtractorTest extends UiServiceTestCase {
assertTrue(r.getGroupKey().contains(GroupHelper.AUTOGROUP_KEY));
assertEquals(people, r.getPeopleOverride());
assertEquals(snoozeCriteria, r.getSnoozeCriteria());
+ assertEquals(smartActions, r.getSmartActions());
}
@Test
@@ -114,4 +121,11 @@ public class NotificationAdjustmentExtractorTest extends UiServiceTestCase {
0, n, UserHandle.ALL, null, System.currentTimeMillis());
return new NotificationRecord(getContext(), sbn, channel);
}
+
+ private Notification.Action createAction() {
+ return new Notification.Action.Builder(
+ Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),
+ "action",
+ PendingIntent.getBroadcast(getContext(), 0, new Intent("Action"), 0)).build();
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
index 2241047dec0e..ca473c64991f 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationChannelTest.java
@@ -19,20 +19,26 @@ package com.android.server.notification;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNull;
import android.app.NotificationChannel;
+import android.net.Uri;
import android.os.Parcel;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import android.util.Xml;
import com.android.internal.util.FastXmlSerializer;
import com.android.server.UiServiceTestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
+import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@SmallTest
@@ -68,4 +74,23 @@ public class NotificationChannelTest extends UiServiceTestCase {
serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
channel.writeXml(serializer);
}
+
+ @Test
+ public void testBackupEmptySound() throws Exception {
+ NotificationChannel channel = new NotificationChannel("a", "ab", IMPORTANCE_DEFAULT);
+ channel.setSound(Uri.EMPTY, null);
+
+ XmlSerializer serializer = new FastXmlSerializer();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
+ channel.writeXmlForBackup(serializer, getContext());
+
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new BufferedInputStream(
+ new ByteArrayInputStream(baos.toByteArray())), null);
+ NotificationChannel restored = new NotificationChannel("a", "ab", IMPORTANCE_DEFAULT);
+ restored.populateFromXmlForRestore(parser, getContext());
+
+ assertNull(restored.getSound());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
index ef9ba78b8263..742ad65f159a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenerServiceTest.java
@@ -31,11 +31,14 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.app.INotificationManager;
+import android.app.Notification;
import android.app.NotificationChannel;
+import android.app.PendingIntent;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.Parcel;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationListenerService.Ranking;
import android.service.notification.NotificationRankingUpdate;
@@ -91,6 +94,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
assertEquals(getShowBadge(i), ranking.canShowBadge());
assertEquals(getUserSentiment(i), ranking.getUserSentiment());
assertEquals(getHidden(i), ranking.isSuspended());
+ assertActionsEqual(getSmartActions(key, i), ranking.getSmartActions());
}
}
@@ -107,6 +111,7 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
int[] importance = new int[mKeys.length];
Bundle userSentiment = new Bundle();
Bundle mHidden = new Bundle();
+ Bundle smartActions = new Bundle();
for (int i = 0; i < mKeys.length; i++) {
String key = mKeys[i];
@@ -124,11 +129,13 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
showBadge.putBoolean(key, getShowBadge(i));
userSentiment.putInt(key, getUserSentiment(i));
mHidden.putBoolean(key, getHidden(i));
+ smartActions.putParcelableArrayList(key, getSmartActions(key, i));
}
NotificationRankingUpdate update = new NotificationRankingUpdate(mKeys,
interceptedKeys.toArray(new String[0]), visibilityOverrides,
suppressedVisualEffects, importance, explanation, overrideGroupKeys,
- channels, overridePeople, snoozeCriteria, showBadge, userSentiment, mHidden);
+ channels, overridePeople, snoozeCriteria, showBadge, userSentiment, mHidden,
+ smartActions);
return update;
}
@@ -196,6 +203,29 @@ public class NotificationListenerServiceTest extends UiServiceTestCase {
return snooze;
}
+ private ArrayList<Notification.Action> getSmartActions(String key, int index) {
+ ArrayList<Notification.Action> actions = new ArrayList<>();
+ for (int i = 0; i < index; i++) {
+ PendingIntent intent = PendingIntent.getBroadcast(
+ getContext(),
+ index /*requestCode*/,
+ new Intent("ACTION_" + key),
+ 0 /*flags*/);
+ actions.add(new Notification.Action.Builder(null /*icon*/, key, intent).build());
+ }
+ return actions;
+ }
+
+ private void assertActionsEqual(
+ List<Notification.Action> expecteds, List<Notification.Action> actuals) {
+ assertEquals(expecteds.size(), actuals.size());
+ for (int i = 0; i < expecteds.size(); i++) {
+ Notification.Action expected = expecteds.get(i);
+ Notification.Action actual = actuals.get(i);
+ assertEquals(expected.title, actual.title);
+ }
+ }
+
public static class TestListenerService extends NotificationListenerService {
private final IBinder binder = new LocalBinder();
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 a408438b7633..e7a8b581ecdb 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -138,6 +138,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.function.Consumer;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -157,6 +158,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
private TestableLooper mTestableLooper;
@Mock
private RankingHelper mRankingHelper;
+ @Mock private PreferencesHelper mPreferencesHelper;
AtomicFile mPolicyFile;
File mFile;
@Mock
@@ -599,8 +601,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testBlockedNotifications_blockedChannelGroup() throws Exception {
when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false);
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.isGroupBlocked(anyString(), anyInt(), anyString())).thenReturn(true);
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.isGroupBlocked(anyString(), anyInt(), anyString())).thenReturn(true);
NotificationChannel channel = new NotificationChannel("id", "name",
NotificationManager.IMPORTANCE_HIGH);
@@ -1221,36 +1223,36 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testTvExtenderChannelOverride_onTv() throws Exception {
mService.setIsTelevision(true);
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannel(
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannel(
anyString(), anyInt(), eq("foo"), anyBoolean())).thenReturn(
new NotificationChannel("foo", "foo", IMPORTANCE_HIGH));
Notification.TvExtender tv = new Notification.TvExtender().setChannelId("foo");
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0,
generateNotificationRecord(null, tv).getNotification(), 0);
- verify(mRankingHelper, times(1)).getNotificationChannel(
+ verify(mPreferencesHelper, times(1)).getNotificationChannel(
anyString(), anyInt(), eq("foo"), anyBoolean());
}
@Test
public void testTvExtenderChannelOverride_notOnTv() throws Exception {
mService.setIsTelevision(false);
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannel(
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannel(
anyString(), anyInt(), anyString(), anyBoolean())).thenReturn(
mTestNotificationChannel);
Notification.TvExtender tv = new Notification.TvExtender().setChannelId("foo");
mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0,
generateNotificationRecord(null, tv).getNotification(), 0);
- verify(mRankingHelper, times(1)).getNotificationChannel(
+ verify(mPreferencesHelper, times(1)).getNotificationChannel(
anyString(), anyInt(), eq(mTestNotificationChannel.getId()), anyBoolean());
}
@Test
public void testUpdateAppNotifyCreatorBlock() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
mBinderService.setNotificationsEnabledForPackage(PKG, 0, false);
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
@@ -1264,7 +1266,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testUpdateAppNotifyCreatorUnblock() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
mBinderService.setNotificationsEnabledForPackage(PKG, 0, true);
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
@@ -1278,8 +1280,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testUpdateChannelNotifyCreatorBlock() throws Exception {
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
@@ -1304,8 +1306,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
NotificationChannel existingChannel =
new NotificationChannel(mTestNotificationChannel.getId(),
mTestNotificationChannel.getName(), IMPORTANCE_NONE);
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(existingChannel);
@@ -1326,8 +1328,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
NotificationChannel existingChannel =
new NotificationChannel(mTestNotificationChannel.getId(),
mTestNotificationChannel.getName(), IMPORTANCE_MAX);
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(existingChannel);
@@ -1338,8 +1340,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testUpdateGroupNotifyCreatorBlock() throws Exception {
NotificationChannelGroup existing = new NotificationChannelGroup("id", "name");
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannelGroup(eq(existing.getId()), eq(PKG), anyInt()))
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannelGroup(eq(existing.getId()), eq(PKG), anyInt()))
.thenReturn(existing);
NotificationChannelGroup updated = new NotificationChannelGroup("id", "name");
@@ -1361,8 +1363,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
public void testUpdateGroupNotifyCreatorUnblock() throws Exception {
NotificationChannelGroup existing = new NotificationChannelGroup("id", "name");
existing.setBlocked(true);
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannelGroup(eq(existing.getId()), eq(PKG), anyInt()))
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannelGroup(eq(existing.getId()), eq(PKG), anyInt()))
.thenReturn(existing);
mBinderService.updateNotificationChannelGroupForPackage(
@@ -1381,8 +1383,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testUpdateGroupNoNotifyCreatorOtherChanges() throws Exception {
NotificationChannelGroup existing = new NotificationChannelGroup("id", "name");
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannelGroup(eq(existing.getId()), eq(PKG), anyInt()))
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannelGroup(eq(existing.getId()), eq(PKG), anyInt()))
.thenReturn(existing);
mBinderService.updateNotificationChannelGroupForPackage(
@@ -1395,12 +1397,12 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
NotificationChannel channel2 = new NotificationChannel("a", "b", IMPORTANCE_LOW);
- when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(channel2.getId()), anyBoolean()))
.thenReturn(channel2);
@@ -1420,7 +1422,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
NotificationChannelGroup group1 = new NotificationChannelGroup("a", "b");
NotificationChannelGroup group2 = new NotificationChannelGroup("n", "m");
@@ -1440,9 +1442,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
mTestNotificationChannel.setLightColor(Color.CYAN);
- when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
@@ -1458,8 +1460,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
reset(mListeners);
@@ -1475,8 +1477,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
NotificationChannelGroup ncg = new NotificationChannelGroup("a", "b/c");
- mService.setRankingHelper(mRankingHelper);
- when(mRankingHelper.getNotificationChannelGroup(eq(ncg.getId()), eq(PKG), anyInt()))
+ mService.setPreferencesHelper(mPreferencesHelper);
+ when(mPreferencesHelper.getNotificationChannelGroup(eq(ncg.getId()), eq(PKG), anyInt()))
.thenReturn(ncg);
reset(mListeners);
mBinderService.deleteNotificationChannelGroup(PKG, ncg.getId());
@@ -1487,18 +1489,18 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testUpdateNotificationChannelFromPrivilegedListener_success() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
- when(mRankingHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
mBinderService.updateNotificationChannelFromPrivilegedListener(
null, PKG, Process.myUserHandle(), mTestNotificationChannel);
- verify(mRankingHelper, times(1)).updateNotificationChannel(
+ verify(mPreferencesHelper, times(1)).updateNotificationChannel(
anyString(), anyInt(), any(), anyBoolean());
verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
@@ -1508,7 +1510,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testUpdateNotificationChannelFromPrivilegedListener_noAccess() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
@@ -1520,7 +1522,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
// pass
}
- verify(mRankingHelper, never()).updateNotificationChannel(
+ verify(mPreferencesHelper, never()).updateNotificationChannel(
anyString(), anyInt(), any(), anyBoolean());
verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
@@ -1530,7 +1532,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testUpdateNotificationChannelFromPrivilegedListener_badUser() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
@@ -1547,7 +1549,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
// pass
}
- verify(mRankingHelper, never()).updateNotificationChannel(
+ verify(mPreferencesHelper, never()).updateNotificationChannel(
anyString(), anyInt(), any(), anyBoolean());
verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
@@ -1557,7 +1559,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testGetNotificationChannelFromPrivilegedListener_success() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
@@ -1565,13 +1567,13 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mBinderService.getNotificationChannelsFromPrivilegedListener(
null, PKG, Process.myUserHandle());
- verify(mRankingHelper, times(1)).getNotificationChannels(
+ verify(mPreferencesHelper, times(1)).getNotificationChannels(
anyString(), anyInt(), anyBoolean());
}
@Test
public void testGetNotificationChannelFromPrivilegedListener_noAccess() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
@@ -1583,13 +1585,13 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
// pass
}
- verify(mRankingHelper, never()).getNotificationChannels(
+ verify(mPreferencesHelper, never()).getNotificationChannels(
anyString(), anyInt(), anyBoolean());
}
@Test
public void testGetNotificationChannelFromPrivilegedListener_badUser() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
@@ -1605,13 +1607,13 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
// pass
}
- verify(mRankingHelper, never()).getNotificationChannels(
+ verify(mPreferencesHelper, never()).getNotificationChannels(
anyString(), anyInt(), anyBoolean());
}
@Test
public void testGetNotificationChannelGroupsFromPrivilegedListener_success() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
associations.add("a");
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
@@ -1619,12 +1621,12 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
null, PKG, Process.myUserHandle());
- verify(mRankingHelper, times(1)).getNotificationChannelGroups(anyString(), anyInt());
+ verify(mPreferencesHelper, times(1)).getNotificationChannelGroups(anyString(), anyInt());
}
@Test
public void testGetNotificationChannelGroupsFromPrivilegedListener_noAccess() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
@@ -1636,12 +1638,12 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
// pass
}
- verify(mRankingHelper, never()).getNotificationChannelGroups(anyString(), anyInt());
+ verify(mPreferencesHelper, never()).getNotificationChannelGroups(anyString(), anyInt());
}
@Test
public void testGetNotificationChannelGroupsFromPrivilegedListener_badUser() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
List<String> associations = new ArrayList<>();
when(mCompanionMgr.getAssociations(PKG, mUid)).thenReturn(associations);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
@@ -1656,7 +1658,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
// pass
}
- verify(mRankingHelper, never()).getNotificationChannelGroups(anyString(), anyInt());
+ verify(mPreferencesHelper, never()).getNotificationChannelGroups(anyString(), anyInt());
}
@Test
@@ -2181,7 +2183,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testHandleRankingSort_sendsUpdateOnSignalExtractorChange() throws Exception {
- mService.setRankingHelper(mRankingHelper);
+ mService.setPreferencesHelper(mPreferencesHelper);
NotificationManagerService.WorkerHandler handler = mock(
NotificationManagerService.WorkerHandler.class);
mService.setHandler(handler);
@@ -2404,6 +2406,45 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testTooLateAdjustmentTriggersUpdate() throws Exception {
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ mService.addNotification(r);
+ NotificationManagerService.WorkerHandler handler = mock(
+ NotificationManagerService.WorkerHandler.class);
+ mService.setHandler(handler);
+
+ Bundle signals = new Bundle();
+ signals.putInt(Adjustment.KEY_USER_SENTIMENT,
+ NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE);
+ Adjustment adjustment = new Adjustment(
+ r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier());
+ mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment);
+
+ waitForIdle();
+
+ verify(handler, timeout(300).times(1)).scheduleSendRankingUpdate();
+ }
+
+ @Test
+ public void testEnqueuedAdjustmentAppliesAdjustments() throws Exception {
+ final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
+ mService.addEnqueuedNotification(r);
+ NotificationManagerService.WorkerHandler handler = mock(
+ NotificationManagerService.WorkerHandler.class);
+ mService.setHandler(handler);
+
+ Bundle signals = new Bundle();
+ signals.putInt(Adjustment.KEY_USER_SENTIMENT,
+ NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE);
+ Adjustment adjustment = new Adjustment(
+ r.sbn.getPackageName(), r.getKey(), signals, "", r.getUser().getIdentifier());
+ mBinderService.applyEnqueuedAdjustmentFromAssistant(null, adjustment);
+
+ assertEquals(NotificationListenerService.Ranking.USER_SENTIMENT_NEGATIVE,
+ r.getUserSentiment());
+ }
+
+ @Test
public void testRecents() throws Exception {
Set<NotifyingApp> expected = new HashSet<>();
@@ -2576,6 +2617,27 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testVisitUris() throws Exception {
+ final Uri audioContents = Uri.parse("content://com.example/audio");
+ final Uri backgroundImage = Uri.parse("content://com.example/background");
+
+ Bundle extras = new Bundle();
+ extras.putParcelable(Notification.EXTRA_AUDIO_CONTENTS_URI, audioContents);
+ extras.putString(Notification.EXTRA_BACKGROUND_IMAGE_URI, backgroundImage.toString());
+
+ Notification n = new Notification.Builder(mContext, "a")
+ .setContentTitle("notification with uris")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon)
+ .addExtras(extras)
+ .build();
+
+ Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
+ n.visitUris(visitor);
+ verify(visitor, times(1)).accept(eq(audioContents));
+ verify(visitor, times(1)).accept(eq(backgroundImage));
+ }
+
+ @Test
public void testSetNotificationPolicy_preP_setOldFields() {
ZenModeHelper mZenModeHelper = mock(ZenModeHelper.class);
mService.mZenModeHelper = mZenModeHelper;
@@ -2942,6 +3004,20 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testVisualDifference_summaryNewNotification() {
+ Notification.Builder nb2 = new Notification.Builder(mContext, "")
+ .setGroup("bananas")
+ .setFlag(Notification.FLAG_GROUP_SUMMARY, true)
+ .setContentText("bar");
+ StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ nb2.build(), new UserHandle(mUid), null, 0);
+ NotificationRecord r2 =
+ new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
+
+ assertFalse(mService.isVisuallyInterruptive(null, r2));
+ }
+
+ @Test
public void testHideAndUnhideNotificationsOnSuspendedPackageBroadcast() {
// post 2 notification from this package
final NotificationRecord notif1 = generateNotificationRecord(
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
index e28699113a3d..76d349681acb 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
@@ -48,6 +48,7 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
+import android.graphics.drawable.Icon;
import android.media.AudioAttributes;
import android.metrics.LogMaker;
import android.net.Uri;
@@ -61,6 +62,7 @@ import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Slog;
+import com.android.internal.R;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.server.UiServiceTestCase;
@@ -70,6 +72,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
import java.util.Objects;
@SmallTest
@@ -697,4 +700,20 @@ public class NotificationRecordTest extends UiServiceTestCase {
record.calculateGrantableUris();
// should not throw
}
+
+ @Test
+ public void testSmartActions() {
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+ assertNull(record.getSmartActions());
+
+ ArrayList<Notification.Action> smartActions = new ArrayList<>();
+ smartActions.add(new Notification.Action.Builder(
+ Icon.createWithResource(getContext(), R.drawable.btn_default),
+ "text", null).build());
+ record.setSmartActions(smartActions);
+ assertEquals(smartActions, record.getSmartActions());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
new file mode 100644
index 000000000000..02d5869b46d0
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -0,0 +1,1742 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.IMPORTANCE_MAX;
+import static android.app.NotificationManager.IMPORTANCE_NONE;
+import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
+
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.fail;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationChannelGroup;
+import android.app.NotificationManager;
+import android.content.ContentProvider;
+import android.content.Context;
+import android.content.IContentProvider;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.Signature;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.media.AudioAttributes;
+import android.net.Uri;
+import android.os.Build;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.provider.Settings.Secure;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.TestableContentResolver;
+import android.util.ArrayMap;
+import android.util.Xml;
+
+import com.android.internal.util.FastXmlSerializer;
+import com.android.server.UiServiceTestCase;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ThreadLocalRandom;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class PreferencesHelperTest extends UiServiceTestCase {
+ private static final String PKG = "com.android.server.notification";
+ private static final int UID = 0;
+ private static final UserHandle USER = UserHandle.of(0);
+ private static final String UPDATED_PKG = "updatedPkg";
+ private static final int UID2 = 1111;
+ private static final String SYSTEM_PKG = "android";
+ private static final int SYSTEM_UID= 1000;
+ private static final UserHandle USER2 = UserHandle.of(10);
+ private static final String TEST_CHANNEL_ID = "test_channel_id";
+ private static final String TEST_AUTHORITY = "test";
+ private static final Uri SOUND_URI =
+ Uri.parse("content://" + TEST_AUTHORITY + "/internal/audio/media/10");
+ private static final Uri CANONICAL_SOUND_URI =
+ Uri.parse("content://" + TEST_AUTHORITY
+ + "/internal/audio/media/10?title=Test&canonical=1");
+
+ @Mock NotificationUsageStats mUsageStats;
+ @Mock RankingHandler mHandler;
+ @Mock PackageManager mPm;
+ @Mock IContentProvider mTestIContentProvider;
+ @Mock Context mContext;
+ @Mock ZenModeHelper mMockZenModeHelper;
+
+ private NotificationManager.Policy mTestNotificationPolicy;
+
+ private PreferencesHelper mHelper;
+ private AudioAttributes mAudioAttributes;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ UserHandle user = UserHandle.ALL;
+
+ final ApplicationInfo legacy = new ApplicationInfo();
+ legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
+ final ApplicationInfo upgrade = new ApplicationInfo();
+ upgrade.targetSdkVersion = Build.VERSION_CODES.O;
+ when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(legacy);
+ when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(upgrade);
+ when(mPm.getApplicationInfoAsUser(eq(SYSTEM_PKG), anyInt(), anyInt())).thenReturn(upgrade);
+ when(mPm.getPackageUidAsUser(eq(PKG), anyInt())).thenReturn(UID);
+ when(mPm.getPackageUidAsUser(eq(UPDATED_PKG), anyInt())).thenReturn(UID2);
+ when(mPm.getPackageUidAsUser(eq(SYSTEM_PKG), anyInt())).thenReturn(SYSTEM_UID);
+ PackageInfo info = mock(PackageInfo.class);
+ info.signatures = new Signature[] {mock(Signature.class)};
+ when(mPm.getPackageInfoAsUser(eq(SYSTEM_PKG), anyInt(), anyInt())).thenReturn(info);
+ when(mPm.getPackageInfoAsUser(eq(PKG), anyInt(), anyInt()))
+ .thenReturn(mock(PackageInfo.class));
+ when(mContext.getResources()).thenReturn(
+ InstrumentationRegistry.getContext().getResources());
+ when(mContext.getContentResolver()).thenReturn(
+ InstrumentationRegistry.getContext().getContentResolver());
+ when(mContext.getPackageManager()).thenReturn(mPm);
+ when(mContext.getApplicationInfo()).thenReturn(legacy);
+ // most tests assume badging is enabled
+ TestableContentResolver contentResolver = getContext().getContentResolver();
+ contentResolver.setFallbackToExisting(false);
+ Secure.putIntForUser(contentResolver,
+ Secure.NOTIFICATION_BADGING, 1, UserHandle.getUserId(UID));
+
+ ContentProvider testContentProvider = mock(ContentProvider.class);
+ when(testContentProvider.getIContentProvider()).thenReturn(mTestIContentProvider);
+ contentResolver.addProvider(TEST_AUTHORITY, testContentProvider);
+
+ when(mTestIContentProvider.canonicalize(any(), eq(SOUND_URI)))
+ .thenReturn(CANONICAL_SOUND_URI);
+ when(mTestIContentProvider.canonicalize(any(), eq(CANONICAL_SOUND_URI)))
+ .thenReturn(CANONICAL_SOUND_URI);
+ when(mTestIContentProvider.uncanonicalize(any(), eq(CANONICAL_SOUND_URI)))
+ .thenReturn(SOUND_URI);
+
+ mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
+ NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND);
+ when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ resetZenModeHelper();
+
+ mAudioAttributes = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
+ .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
+ .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
+ .build();
+ }
+
+ private NotificationChannel getDefaultChannel() {
+ return new NotificationChannel(NotificationChannel.DEFAULT_CHANNEL_ID, "name",
+ IMPORTANCE_LOW);
+ }
+
+ private ByteArrayOutputStream writeXmlAndPurge(String pkg, int uid, boolean forBackup,
+ String... channelIds)
+ throws Exception {
+ XmlSerializer serializer = new FastXmlSerializer();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
+ serializer.startDocument(null, true);
+ mHelper.writeXml(serializer, forBackup);
+ serializer.endDocument();
+ serializer.flush();
+ for (String channelId : channelIds) {
+ mHelper.permanentlyDeleteNotificationChannel(pkg, uid, channelId);
+ }
+ return baos;
+ }
+
+ private void loadStreamXml(ByteArrayOutputStream stream, boolean forRestore) throws Exception {
+ loadByteArrayXml(stream.toByteArray(), forRestore);
+ }
+
+ private void loadByteArrayXml(byte[] byteArray, boolean forRestore) throws Exception {
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new BufferedInputStream(new ByteArrayInputStream(byteArray)), null);
+ parser.nextTag();
+ mHelper.readXml(parser, forRestore);
+ }
+
+ private void compareChannels(NotificationChannel expected, NotificationChannel actual) {
+ assertEquals(expected.getId(), actual.getId());
+ assertEquals(expected.getName(), actual.getName());
+ assertEquals(expected.getDescription(), actual.getDescription());
+ assertEquals(expected.shouldVibrate(), actual.shouldVibrate());
+ assertEquals(expected.shouldShowLights(), actual.shouldShowLights());
+ assertEquals(expected.getImportance(), actual.getImportance());
+ assertEquals(expected.getLockscreenVisibility(), actual.getLockscreenVisibility());
+ assertEquals(expected.getSound(), actual.getSound());
+ assertEquals(expected.canBypassDnd(), actual.canBypassDnd());
+ assertTrue(Arrays.equals(expected.getVibrationPattern(), actual.getVibrationPattern()));
+ assertEquals(expected.getGroup(), actual.getGroup());
+ assertEquals(expected.getAudioAttributes(), actual.getAudioAttributes());
+ assertEquals(expected.getLightColor(), actual.getLightColor());
+ }
+
+ private void compareGroups(NotificationChannelGroup expected, NotificationChannelGroup actual) {
+ assertEquals(expected.getId(), actual.getId());
+ assertEquals(expected.getName(), actual.getName());
+ assertEquals(expected.getDescription(), actual.getDescription());
+ assertEquals(expected.isBlocked(), actual.isBlocked());
+ }
+
+ private NotificationChannel getChannel() {
+ return new NotificationChannel("id", "name", IMPORTANCE_LOW);
+ }
+
+ private NotificationChannel findChannel(List<NotificationChannel> channels, String id) {
+ for (NotificationChannel channel : channels) {
+ if (channel.getId().equals(id)) {
+ return channel;
+ }
+ }
+ return null;
+ }
+
+ private void resetZenModeHelper() {
+ reset(mMockZenModeHelper);
+ when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
+ }
+
+ @Test
+ public void testChannelXml() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
+ ncg.setBlocked(true);
+ ncg.setDescription("group desc");
+ NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel channel2 =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel2.setDescription("descriptions for all");
+ channel2.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+ channel2.enableLights(true);
+ channel2.setBypassDnd(true);
+ channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ channel2.enableVibration(true);
+ channel2.setGroup(ncg.getId());
+ channel2.setVibrationPattern(new long[]{100, 67, 145, 156});
+ channel2.setLightColor(Color.BLUE);
+
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
+
+ mHelper.setShowBadge(PKG, UID, true);
+ mHelper.setAppImportanceLocked(PKG, UID);
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false, channel1.getId(),
+ channel2.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
+ mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG}, new int[]{UID});
+
+ loadStreamXml(baos, false);
+
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertTrue(mHelper.getIsAppImportanceLocked(PKG, UID));
+ assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
+ compareChannels(channel2,
+ mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
+
+ List<NotificationChannelGroup> actualGroups =
+ mHelper.getNotificationChannelGroups(PKG, UID, false, true).getList();
+ boolean foundNcg = false;
+ for (NotificationChannelGroup actual : actualGroups) {
+ if (ncg.getId().equals(actual.getId())) {
+ foundNcg = true;
+ compareGroups(ncg, actual);
+ } else if (ncg2.getId().equals(actual.getId())) {
+ compareGroups(ncg2, actual);
+ }
+ }
+ assertTrue(foundNcg);
+
+ boolean foundChannel2Group = false;
+ for (NotificationChannelGroup actual : actualGroups) {
+ if (channel2.getGroup().equals(actual.getChannels().get(0).getGroup())) {
+ foundChannel2Group = true;
+ break;
+ }
+ }
+ assertTrue(foundChannel2Group);
+ }
+
+ @Test
+ public void testChannelXmlForBackup() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
+ NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel channel2 =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel2.setDescription("descriptions for all");
+ channel2.setSound(SOUND_URI, mAudioAttributes);
+ channel2.enableLights(true);
+ channel2.setBypassDnd(true);
+ channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ channel2.enableVibration(false);
+ channel2.setGroup(ncg.getId());
+ channel2.setLightColor(Color.BLUE);
+ NotificationChannel channel3 = new NotificationChannel("id3", "NAM3", IMPORTANCE_HIGH);
+ channel3.enableVibration(true);
+
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, false, false);
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true, false);
+
+ mHelper.setShowBadge(PKG, UID, true);
+
+ mHelper.setImportance(UPDATED_PKG, UID2, IMPORTANCE_NONE);
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel1.getId(),
+ channel2.getId(), channel3.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
+ mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG, UPDATED_PKG},
+ new int[]{UID, UID2});
+
+ mHelper.setShowBadge(UPDATED_PKG, UID2, true);
+
+ loadStreamXml(baos, true);
+
+ assertEquals(IMPORTANCE_NONE, mHelper.getImportance(UPDATED_PKG, UID2));
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
+ compareChannels(channel2,
+ mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
+ compareChannels(channel3,
+ mHelper.getNotificationChannel(PKG, UID, channel3.getId(), false));
+
+ List<NotificationChannelGroup> actualGroups =
+ mHelper.getNotificationChannelGroups(PKG, UID, false, true).getList();
+ boolean foundNcg = false;
+ for (NotificationChannelGroup actual : actualGroups) {
+ if (ncg.getId().equals(actual.getId())) {
+ foundNcg = true;
+ compareGroups(ncg, actual);
+ } else if (ncg2.getId().equals(actual.getId())) {
+ compareGroups(ncg2, actual);
+ }
+ }
+ assertTrue(foundNcg);
+
+ boolean foundChannel2Group = false;
+ for (NotificationChannelGroup actual : actualGroups) {
+ if (channel2.getGroup().equals(actual.getChannels().get(0).getGroup())) {
+ foundChannel2Group = true;
+ break;
+ }
+ }
+ assertTrue(foundChannel2Group);
+ }
+
+ @Test
+ public void testBackupXml_backupCanonicalizedSoundUri() throws Exception {
+ NotificationChannel channel =
+ new NotificationChannel("id", "name", IMPORTANCE_LOW);
+ channel.setSound(SOUND_URI, mAudioAttributes);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
+
+ // Testing that in restore we are given the canonical version
+ loadStreamXml(baos, true);
+ verify(mTestIContentProvider).uncanonicalize(any(), eq(CANONICAL_SOUND_URI));
+ }
+
+ @Test
+ public void testRestoreXml_withExistentCanonicalizedSoundUri() throws Exception {
+ Uri localUri = Uri.parse("content://" + TEST_AUTHORITY + "/local/url");
+ Uri canonicalBasedOnLocal = localUri.buildUpon()
+ .appendQueryParameter("title", "Test")
+ .appendQueryParameter("canonical", "1")
+ .build();
+ when(mTestIContentProvider.canonicalize(any(), eq(CANONICAL_SOUND_URI)))
+ .thenReturn(canonicalBasedOnLocal);
+ when(mTestIContentProvider.uncanonicalize(any(), eq(CANONICAL_SOUND_URI)))
+ .thenReturn(localUri);
+ when(mTestIContentProvider.uncanonicalize(any(), eq(canonicalBasedOnLocal)))
+ .thenReturn(localUri);
+
+ NotificationChannel channel =
+ new NotificationChannel("id", "name", IMPORTANCE_LOW);
+ channel.setSound(SOUND_URI, mAudioAttributes);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
+
+ loadStreamXml(baos, true);
+
+ NotificationChannel actualChannel = mHelper.getNotificationChannel(
+ PKG, UID, channel.getId(), false);
+ assertEquals(localUri, actualChannel.getSound());
+ }
+
+ @Test
+ public void testRestoreXml_withNonExistentCanonicalizedSoundUri() throws Exception {
+ Thread.sleep(3000);
+ when(mTestIContentProvider.canonicalize(any(), eq(CANONICAL_SOUND_URI)))
+ .thenReturn(null);
+ when(mTestIContentProvider.uncanonicalize(any(), eq(CANONICAL_SOUND_URI)))
+ .thenReturn(null);
+
+ NotificationChannel channel =
+ new NotificationChannel("id", "name", IMPORTANCE_LOW);
+ channel.setSound(SOUND_URI, mAudioAttributes);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
+
+ loadStreamXml(baos, true);
+
+ NotificationChannel actualChannel = mHelper.getNotificationChannel(
+ PKG, UID, channel.getId(), false);
+ assertEquals(Settings.System.DEFAULT_NOTIFICATION_URI, actualChannel.getSound());
+ }
+
+
+ /**
+ * Although we don't make backups with uncanonicalized uris anymore, we used to, so we have to
+ * handle its restore properly.
+ */
+ @Test
+ public void testRestoreXml_withUncanonicalizedNonLocalSoundUri() throws Exception {
+ // Not a local uncanonicalized uri, simulating that it fails to exist locally
+ when(mTestIContentProvider.canonicalize(any(), eq(SOUND_URI))).thenReturn(null);
+ String id = "id";
+ String backupWithUncanonicalizedSoundUri = "<ranking version=\"1\">\n"
+ + "<package name=\"com.android.server.notification\" show_badge=\"true\">\n"
+ + "<channel id=\"" + id + "\" name=\"name\" importance=\"2\" "
+ + "sound=\"" + SOUND_URI + "\" "
+ + "usage=\"6\" content_type=\"0\" flags=\"1\" show_badge=\"true\" />\n"
+ + "<channel id=\"miscellaneous\" name=\"Uncategorized\" usage=\"5\" "
+ + "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
+ + "</package>\n"
+ + "</ranking>\n";
+
+ loadByteArrayXml(backupWithUncanonicalizedSoundUri.getBytes(), true);
+
+ NotificationChannel actualChannel = mHelper.getNotificationChannel(PKG, UID, id, false);
+ assertEquals(Settings.System.DEFAULT_NOTIFICATION_URI, actualChannel.getSound());
+ }
+
+ @Test
+ public void testBackupRestoreXml_withNullSoundUri() throws Exception {
+ NotificationChannel channel =
+ new NotificationChannel("id", "name", IMPORTANCE_LOW);
+ channel.setSound(null, mAudioAttributes);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
+
+ loadStreamXml(baos, true);
+
+ NotificationChannel actualChannel = mHelper.getNotificationChannel(
+ PKG, UID, channel.getId(), false);
+ assertEquals(null, actualChannel.getSound());
+ }
+
+ @Test
+ public void testChannelXml_backup() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
+ NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel channel2 =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ NotificationChannel channel3 =
+ new NotificationChannel("id3", "name3", IMPORTANCE_LOW);
+ channel3.setGroup(ncg.getId());
+
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
+
+ mHelper.deleteNotificationChannel(PKG, UID, channel1.getId());
+ mHelper.deleteNotificationChannelGroup(PKG, UID, ncg.getId());
+ assertEquals(channel2, mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel1.getId(),
+ channel2.getId(), channel3.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
+ mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG}, new int[]{UID});
+
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray())),
+ null);
+ parser.nextTag();
+ mHelper.readXml(parser, true);
+
+ assertNull(mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
+ assertNull(mHelper.getNotificationChannel(PKG, UID, channel3.getId(), false));
+ assertNull(mHelper.getNotificationChannelGroup(ncg.getId(), PKG, UID));
+ //assertEquals(ncg2, mHelper.getNotificationChannelGroup(ncg2.getId(), PKG, UID));
+ assertEquals(channel2, mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
+ }
+
+ @Test
+ public void testChannelXml_defaultChannelLegacyApp_noUserSettings() throws Exception {
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
+ NotificationChannel.DEFAULT_CHANNEL_ID);
+
+ loadStreamXml(baos, false);
+
+ final NotificationChannel updated = mHelper.getNotificationChannel(PKG, UID,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false);
+ assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, updated.getImportance());
+ assertFalse(updated.canBypassDnd());
+ assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE, updated.getLockscreenVisibility());
+ assertEquals(0, updated.getUserLockedFields());
+ }
+
+ @Test
+ public void testChannelXml_defaultChannelUpdatedApp_userSettings() throws Exception {
+ final NotificationChannel defaultChannel = mHelper.getNotificationChannel(PKG, UID,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false);
+ defaultChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+ mHelper.updateNotificationChannel(PKG, UID, defaultChannel, true);
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
+ NotificationChannel.DEFAULT_CHANNEL_ID);
+
+ loadStreamXml(baos, false);
+
+ assertEquals(NotificationManager.IMPORTANCE_LOW, mHelper.getNotificationChannel(
+ PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false).getImportance());
+ }
+
+ @Test
+ public void testChannelXml_upgradeCreateDefaultChannel() throws Exception {
+ final String preupgradeXml = "<ranking version=\"1\">\n"
+ + "<package name=\"" + PKG
+ + "\" importance=\"" + NotificationManager.IMPORTANCE_HIGH
+ + "\" priority=\"" + Notification.PRIORITY_MAX + "\" visibility=\""
+ + Notification.VISIBILITY_SECRET + "\"" +" uid=\"" + UID + "\" />\n"
+ + "<package name=\"" + UPDATED_PKG + "\" uid=\"" + UID2 + "\" visibility=\""
+ + Notification.VISIBILITY_PRIVATE + "\" />\n"
+ + "</ranking>";
+ XmlPullParser parser = Xml.newPullParser();
+ parser.setInput(new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())),
+ null);
+ parser.nextTag();
+ mHelper.readXml(parser, false);
+
+ final NotificationChannel updated1 =
+ mHelper.getNotificationChannel(PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
+ assertEquals(NotificationManager.IMPORTANCE_HIGH, updated1.getImportance());
+ assertTrue(updated1.canBypassDnd());
+ assertEquals(Notification.VISIBILITY_SECRET, updated1.getLockscreenVisibility());
+ assertEquals(NotificationChannel.USER_LOCKED_IMPORTANCE
+ | NotificationChannel.USER_LOCKED_PRIORITY
+ | NotificationChannel.USER_LOCKED_VISIBILITY,
+ updated1.getUserLockedFields());
+
+ // No Default Channel created for updated packages
+ assertEquals(null, mHelper.getNotificationChannel(UPDATED_PKG, UID2,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false));
+ }
+
+ @Test
+ public void testChannelXml_upgradeDeletesDefaultChannel() throws Exception {
+ final NotificationChannel defaultChannel = mHelper.getNotificationChannel(
+ PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
+ assertTrue(defaultChannel != null);
+ ByteArrayOutputStream baos =
+ writeXmlAndPurge(PKG, UID, false, NotificationChannel.DEFAULT_CHANNEL_ID);
+ // Load package at higher sdk.
+ final ApplicationInfo upgraded = new ApplicationInfo();
+ upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
+ when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
+ loadStreamXml(baos, false);
+
+ // Default Channel should be gone.
+ assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false));
+ }
+
+ @Test
+ public void testDeletesDefaultChannelAfterChannelIsCreated() throws Exception {
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
+ NotificationChannel.DEFAULT_CHANNEL_ID, "bananas");
+
+ // Load package at higher sdk.
+ final ApplicationInfo upgraded = new ApplicationInfo();
+ upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
+ when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
+ loadStreamXml(baos, false);
+
+ // Default Channel should be gone.
+ assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false));
+ }
+
+ @Test
+ public void testLoadingOldChannelsDoesNotDeleteNewlyCreatedChannels() throws Exception {
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
+ NotificationChannel.DEFAULT_CHANNEL_ID, "bananas");
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
+
+ loadStreamXml(baos, false);
+
+ // Should still have the newly created channel that wasn't in the xml.
+ assertTrue(mHelper.getNotificationChannel(PKG, UID, "bananas", false) != null);
+ }
+
+ @Test
+ public void testCreateChannel_blocked() throws Exception {
+ mHelper.setImportance(PKG, UID, IMPORTANCE_NONE);
+
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
+ }
+
+ @Test
+ public void testCreateChannel_badImportance() throws Exception {
+ try {
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE - 1),
+ true, false);
+ fail("Was allowed to create a channel with invalid importance");
+ } catch (IllegalArgumentException e) {
+ // yay
+ }
+ try {
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_UNSPECIFIED),
+ true, false);
+ fail("Was allowed to create a channel with invalid importance");
+ } catch (IllegalArgumentException e) {
+ // yay
+ }
+ try {
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX + 1),
+ true, false);
+ fail("Was allowed to create a channel with invalid importance");
+ } catch (IllegalArgumentException e) {
+ // yay
+ }
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true, false);
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX), true, false);
+ }
+
+
+ @Test
+ public void testUpdate() throws Exception {
+ // no fields locked by user
+ final NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+ channel.enableLights(true);
+ channel.setBypassDnd(true);
+ channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+
+ mHelper.createNotificationChannel(PKG, UID, channel, false, false);
+
+ // same id, try to update all fields
+ final NotificationChannel channel2 =
+ new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
+ channel2.setSound(new Uri.Builder().scheme("test2").build(), mAudioAttributes);
+ channel2.enableLights(false);
+ channel2.setBypassDnd(false);
+ channel2.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
+
+ mHelper.updateNotificationChannel(PKG, UID, channel2, true);
+
+ // all fields should be changed
+ assertEquals(channel2, mHelper.getNotificationChannel(PKG, UID, channel.getId(), false));
+
+ verify(mHandler, times(1)).requestSort();
+ }
+
+ @Test
+ public void testUpdate_preUpgrade_updatesAppFields() throws Exception {
+ mHelper.setImportance(PKG, UID, IMPORTANCE_UNSPECIFIED);
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
+ assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
+ mHelper.getPackageVisibility(PKG, UID));
+ assertFalse(mHelper.getIsAppImportanceLocked(PKG, UID));
+
+ NotificationChannel defaultChannel = mHelper.getNotificationChannel(
+ PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
+
+ defaultChannel.setShowBadge(false);
+ defaultChannel.setImportance(IMPORTANCE_NONE);
+ defaultChannel.setBypassDnd(true);
+ defaultChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+
+ mHelper.setAppImportanceLocked(PKG, UID);
+ mHelper.updateNotificationChannel(PKG, UID, defaultChannel, true);
+
+ // ensure app level fields are changed
+ assertFalse(mHelper.canShowBadge(PKG, UID));
+ assertEquals(Notification.PRIORITY_MAX, mHelper.getPackagePriority(PKG, UID));
+ assertEquals(Notification.VISIBILITY_SECRET, mHelper.getPackageVisibility(PKG, UID));
+ assertEquals(IMPORTANCE_NONE, mHelper.getImportance(PKG, UID));
+ assertTrue(mHelper.getIsAppImportanceLocked(PKG, UID));
+ }
+
+ @Test
+ public void testUpdate_postUpgrade_noUpdateAppFields() throws Exception {
+ final NotificationChannel channel = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+
+ mHelper.createNotificationChannel(PKG, UID, channel, false, false);
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
+ assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
+ mHelper.getPackageVisibility(PKG, UID));
+
+ channel.setShowBadge(false);
+ channel.setImportance(IMPORTANCE_NONE);
+ channel.setBypassDnd(true);
+ channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+
+ mHelper.updateNotificationChannel(PKG, UID, channel, true);
+
+ // ensure app level fields are not changed
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
+ assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
+ mHelper.getPackageVisibility(PKG, UID));
+ assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID));
+ }
+
+ @Test
+ public void testGetNotificationChannel_ReturnsNullForUnknownChannel() throws Exception {
+ assertEquals(null, mHelper.getNotificationChannel(PKG, UID, "garbage", false));
+ }
+
+ @Test
+ public void testCreateChannel_CannotChangeHiddenFields() throws Exception {
+ final NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+ channel.enableLights(true);
+ channel.setBypassDnd(true);
+ channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ channel.setShowBadge(true);
+ int lockMask = 0;
+ for (int i = 0; i < NotificationChannel.LOCKABLE_FIELDS.length; i++) {
+ lockMask |= NotificationChannel.LOCKABLE_FIELDS[i];
+ }
+ channel.lockFields(lockMask);
+
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+
+ NotificationChannel savedChannel =
+ mHelper.getNotificationChannel(PKG, UID, channel.getId(), false);
+
+ assertEquals(channel.getName(), savedChannel.getName());
+ assertEquals(channel.shouldShowLights(), savedChannel.shouldShowLights());
+ assertFalse(savedChannel.canBypassDnd());
+ assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility());
+ assertEquals(channel.canShowBadge(), savedChannel.canShowBadge());
+
+ verify(mHandler, never()).requestSort();
+ }
+
+ @Test
+ public void testCreateChannel_CannotChangeHiddenFieldsAssistant() throws Exception {
+ final NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+ channel.enableLights(true);
+ channel.setBypassDnd(true);
+ channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ channel.setShowBadge(true);
+ int lockMask = 0;
+ for (int i = 0; i < NotificationChannel.LOCKABLE_FIELDS.length; i++) {
+ lockMask |= NotificationChannel.LOCKABLE_FIELDS[i];
+ }
+ channel.lockFields(lockMask);
+
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+
+ NotificationChannel savedChannel =
+ mHelper.getNotificationChannel(PKG, UID, channel.getId(), false);
+
+ assertEquals(channel.getName(), savedChannel.getName());
+ assertEquals(channel.shouldShowLights(), savedChannel.shouldShowLights());
+ assertFalse(savedChannel.canBypassDnd());
+ assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility());
+ assertEquals(channel.canShowBadge(), savedChannel.canShowBadge());
+ }
+
+ @Test
+ public void testClearLockedFields() throws Exception {
+ final NotificationChannel channel = getChannel();
+ mHelper.clearLockedFields(channel);
+ assertEquals(0, channel.getUserLockedFields());
+
+ channel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY
+ | NotificationChannel.USER_LOCKED_IMPORTANCE);
+ mHelper.clearLockedFields(channel);
+ assertEquals(0, channel.getUserLockedFields());
+ }
+
+ @Test
+ public void testLockFields_soundAndVibration() throws Exception {
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
+
+ final NotificationChannel update1 = getChannel();
+ update1.setSound(new Uri.Builder().scheme("test").build(),
+ new AudioAttributes.Builder().build());
+ update1.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
+ mHelper.updateNotificationChannel(PKG, UID, update1, true);
+ assertEquals(NotificationChannel.USER_LOCKED_PRIORITY
+ | NotificationChannel.USER_LOCKED_SOUND,
+ mHelper.getNotificationChannel(PKG, UID, update1.getId(), false)
+ .getUserLockedFields());
+
+ NotificationChannel update2 = getChannel();
+ update2.enableVibration(true);
+ mHelper.updateNotificationChannel(PKG, UID, update2, true);
+ assertEquals(NotificationChannel.USER_LOCKED_PRIORITY
+ | NotificationChannel.USER_LOCKED_SOUND
+ | NotificationChannel.USER_LOCKED_VIBRATION,
+ mHelper.getNotificationChannel(PKG, UID, update2.getId(), false)
+ .getUserLockedFields());
+ }
+
+ @Test
+ public void testLockFields_vibrationAndLights() throws Exception {
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
+
+ final NotificationChannel update1 = getChannel();
+ update1.setVibrationPattern(new long[]{7945, 46 ,246});
+ mHelper.updateNotificationChannel(PKG, UID, update1, true);
+ assertEquals(NotificationChannel.USER_LOCKED_VIBRATION,
+ mHelper.getNotificationChannel(PKG, UID, update1.getId(), false)
+ .getUserLockedFields());
+
+ final NotificationChannel update2 = getChannel();
+ update2.enableLights(true);
+ mHelper.updateNotificationChannel(PKG, UID, update2, true);
+ assertEquals(NotificationChannel.USER_LOCKED_VIBRATION
+ | NotificationChannel.USER_LOCKED_LIGHTS,
+ mHelper.getNotificationChannel(PKG, UID, update2.getId(), false)
+ .getUserLockedFields());
+ }
+
+ @Test
+ public void testLockFields_lightsAndImportance() throws Exception {
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
+
+ final NotificationChannel update1 = getChannel();
+ update1.setLightColor(Color.GREEN);
+ mHelper.updateNotificationChannel(PKG, UID, update1, true);
+ assertEquals(NotificationChannel.USER_LOCKED_LIGHTS,
+ mHelper.getNotificationChannel(PKG, UID, update1.getId(), false)
+ .getUserLockedFields());
+
+ final NotificationChannel update2 = getChannel();
+ update2.setImportance(IMPORTANCE_DEFAULT);
+ mHelper.updateNotificationChannel(PKG, UID, update2, true);
+ assertEquals(NotificationChannel.USER_LOCKED_LIGHTS
+ | NotificationChannel.USER_LOCKED_IMPORTANCE,
+ mHelper.getNotificationChannel(PKG, UID, update2.getId(), false)
+ .getUserLockedFields());
+ }
+
+ @Test
+ public void testLockFields_visibilityAndDndAndBadge() throws Exception {
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
+ assertEquals(0,
+ mHelper.getNotificationChannel(PKG, UID, getChannel().getId(), false)
+ .getUserLockedFields());
+
+ final NotificationChannel update1 = getChannel();
+ update1.setBypassDnd(true);
+ mHelper.updateNotificationChannel(PKG, UID, update1, true);
+ assertEquals(NotificationChannel.USER_LOCKED_PRIORITY,
+ mHelper.getNotificationChannel(PKG, UID, update1.getId(), false)
+ .getUserLockedFields());
+
+ final NotificationChannel update2 = getChannel();
+ update2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ mHelper.updateNotificationChannel(PKG, UID, update2, true);
+ assertEquals(NotificationChannel.USER_LOCKED_PRIORITY
+ | NotificationChannel.USER_LOCKED_VISIBILITY,
+ mHelper.getNotificationChannel(PKG, UID, update2.getId(), false)
+ .getUserLockedFields());
+
+ final NotificationChannel update3 = getChannel();
+ update3.setShowBadge(false);
+ mHelper.updateNotificationChannel(PKG, UID, update3, true);
+ assertEquals(NotificationChannel.USER_LOCKED_PRIORITY
+ | NotificationChannel.USER_LOCKED_VISIBILITY
+ | NotificationChannel.USER_LOCKED_SHOW_BADGE,
+ mHelper.getNotificationChannel(PKG, UID, update3.getId(), false)
+ .getUserLockedFields());
+ }
+
+ @Test
+ public void testDeleteNonExistentChannel() throws Exception {
+ mHelper.deleteNotificationChannelGroup(PKG, UID, "does not exist");
+ }
+
+ @Test
+ public void testGetDeletedChannel() throws Exception {
+ NotificationChannel channel = getChannel();
+ channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+ channel.enableLights(true);
+ channel.setBypassDnd(true);
+ channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ channel.enableVibration(true);
+ channel.setVibrationPattern(new long[]{100, 67, 145, 156});
+
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
+
+ // Does not return deleted channel
+ NotificationChannel response =
+ mHelper.getNotificationChannel(PKG, UID, channel.getId(), false);
+ assertNull(response);
+
+ // Returns deleted channel
+ response = mHelper.getNotificationChannel(PKG, UID, channel.getId(), true);
+ compareChannels(channel, response);
+ assertTrue(response.isDeleted());
+ }
+
+ @Test
+ public void testGetDeletedChannels() throws Exception {
+ Map<String, NotificationChannel> channelMap = new HashMap<>();
+ NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+ channel.enableLights(true);
+ channel.setBypassDnd(true);
+ channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
+ channel.enableVibration(true);
+ channel.setVibrationPattern(new long[]{100, 67, 145, 156});
+ channelMap.put(channel.getId(), channel);
+ NotificationChannel channel2 =
+ new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
+ channelMap.put(channel2.getId(), channel2);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
+
+ mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
+
+ // Returns only non-deleted channels
+ List<NotificationChannel> channels =
+ mHelper.getNotificationChannels(PKG, UID, false).getList();
+ assertEquals(2, channels.size()); // Default channel + non-deleted channel
+ for (NotificationChannel nc : channels) {
+ if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(nc.getId())) {
+ compareChannels(channel2, nc);
+ }
+ }
+
+ // Returns deleted channels too
+ channels = mHelper.getNotificationChannels(PKG, UID, true).getList();
+ assertEquals(3, channels.size()); // Includes default channel
+ for (NotificationChannel nc : channels) {
+ if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(nc.getId())) {
+ compareChannels(channelMap.get(nc.getId()), nc);
+ }
+ }
+ }
+
+ @Test
+ public void testGetDeletedChannelCount() throws Exception {
+ NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ NotificationChannel channel2 =
+ new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel channel3 =
+ new NotificationChannel("id5", "a", NotificationManager.IMPORTANCE_HIGH);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
+
+ mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
+ mHelper.deleteNotificationChannel(PKG, UID, channel3.getId());
+
+ assertEquals(2, mHelper.getDeletedChannelCount(PKG, UID));
+ assertEquals(0, mHelper.getDeletedChannelCount("pkg2", UID2));
+ }
+
+ @Test
+ public void testGetBlockedChannelCount() throws Exception {
+ NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ NotificationChannel channel2 =
+ new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_NONE);
+ NotificationChannel channel3 =
+ new NotificationChannel("id5", "a", NotificationManager.IMPORTANCE_NONE);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
+
+ mHelper.deleteNotificationChannel(PKG, UID, channel3.getId());
+
+ assertEquals(1, mHelper.getBlockedChannelCount(PKG, UID));
+ assertEquals(0, mHelper.getBlockedChannelCount("pkg2", UID2));
+ }
+
+ @Test
+ public void testCreateAndDeleteCanChannelsBypassDnd() throws Exception {
+ // create notification channel that can't bypass dnd
+ // expected result: areChannelsBypassingDnd = false
+ // setNotificationPolicy isn't called since areChannelsBypassingDnd was already false
+ NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ assertFalse(mHelper.areChannelsBypassingDnd());
+ verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
+ resetZenModeHelper();
+
+ // create notification channel that can bypass dnd
+ // expected result: areChannelsBypassingDnd = true
+ NotificationChannel channel2 = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel2.setBypassDnd(true);
+ mHelper.createNotificationChannel(PKG, UID, channel2, true, true);
+ assertTrue(mHelper.areChannelsBypassingDnd());
+ verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
+ resetZenModeHelper();
+
+ // delete channels
+ mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
+ assertTrue(mHelper.areChannelsBypassingDnd()); // channel2 can still bypass DND
+ verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
+ resetZenModeHelper();
+
+ mHelper.deleteNotificationChannel(PKG, UID, channel2.getId());
+ assertFalse(mHelper.areChannelsBypassingDnd());
+ verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
+ resetZenModeHelper();
+ }
+
+ @Test
+ public void testUpdateCanChannelsBypassDnd() throws Exception {
+ // create notification channel that can't bypass dnd
+ // expected result: areChannelsBypassingDnd = false
+ // setNotificationPolicy isn't called since areChannelsBypassingDnd was already false
+ NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ assertFalse(mHelper.areChannelsBypassingDnd());
+ verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
+ resetZenModeHelper();
+
+ // update channel so it CAN bypass dnd:
+ // expected result: areChannelsBypassingDnd = true
+ channel.setBypassDnd(true);
+ mHelper.updateNotificationChannel(PKG, UID, channel, true);
+ assertTrue(mHelper.areChannelsBypassingDnd());
+ verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
+ resetZenModeHelper();
+
+ // update channel so it can't bypass dnd:
+ // expected result: areChannelsBypassingDnd = false
+ channel.setBypassDnd(false);
+ mHelper.updateNotificationChannel(PKG, UID, channel, true);
+ assertFalse(mHelper.areChannelsBypassingDnd());
+ verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
+ resetZenModeHelper();
+ }
+
+ @Test
+ public void testSetupNewZenModeHelper_canBypass() {
+ // start notification policy off with mAreChannelsBypassingDnd = true, but
+ // RankingHelper should change to false
+ mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
+ NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND);
+ when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ assertFalse(mHelper.areChannelsBypassingDnd());
+ verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
+ resetZenModeHelper();
+ }
+
+ @Test
+ public void testSetupNewZenModeHelper_cannotBypass() {
+ // start notification policy off with mAreChannelsBypassingDnd = false
+ mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0, 0);
+ when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
+ mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper);
+ assertFalse(mHelper.areChannelsBypassingDnd());
+ verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
+ resetZenModeHelper();
+ }
+
+ @Test
+ public void testCreateDeletedChannel() throws Exception {
+ long[] vibration = new long[]{100, 67, 145, 156};
+ NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel.setVibrationPattern(vibration);
+
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
+
+ NotificationChannel newChannel = new NotificationChannel(
+ channel.getId(), channel.getName(), NotificationManager.IMPORTANCE_HIGH);
+ newChannel.setVibrationPattern(new long[]{100});
+
+ mHelper.createNotificationChannel(PKG, UID, newChannel, true, false);
+
+ // No long deleted, using old settings
+ compareChannels(channel,
+ mHelper.getNotificationChannel(PKG, UID, newChannel.getId(), false));
+ }
+
+ @Test
+ public void testOnlyHasDefaultChannel() throws Exception {
+ assertTrue(mHelper.onlyHasDefaultChannel(PKG, UID));
+ assertFalse(mHelper.onlyHasDefaultChannel(UPDATED_PKG, UID2));
+
+ mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
+ assertFalse(mHelper.onlyHasDefaultChannel(PKG, UID));
+ }
+
+ @Test
+ public void testCreateChannel_defaultChannelId() throws Exception {
+ try {
+ mHelper.createNotificationChannel(PKG, UID, new NotificationChannel(
+ NotificationChannel.DEFAULT_CHANNEL_ID, "ha", IMPORTANCE_HIGH), true, false);
+ fail("Allowed to create default channel");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ @Test
+ public void testCreateChannel_alreadyExists() throws Exception {
+ long[] vibration = new long[]{100, 67, 145, 156};
+ NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel.setVibrationPattern(vibration);
+
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+
+ NotificationChannel newChannel = new NotificationChannel(
+ channel.getId(), channel.getName(), NotificationManager.IMPORTANCE_HIGH);
+ newChannel.setVibrationPattern(new long[]{100});
+
+ mHelper.createNotificationChannel(PKG, UID, newChannel, true, false);
+
+ // Old settings not overridden
+ compareChannels(channel,
+ mHelper.getNotificationChannel(PKG, UID, newChannel.getId(), false));
+ }
+
+ @Test
+ public void testCreateChannel_noOverrideSound() throws Exception {
+ Uri sound = new Uri.Builder().scheme("test").build();
+ final NotificationChannel channel = new NotificationChannel("id2", "name2",
+ NotificationManager.IMPORTANCE_DEFAULT);
+ channel.setSound(sound, mAudioAttributes);
+ mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+ assertEquals(sound, mHelper.getNotificationChannel(
+ PKG, UID, channel.getId(), false).getSound());
+ }
+
+ @Test
+ public void testPermanentlyDeleteChannels() throws Exception {
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel channel2 =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
+
+ mHelper.permanentlyDeleteNotificationChannels(PKG, UID);
+
+ // Only default channel remains
+ assertEquals(1, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
+ }
+
+ @Test
+ public void testDeleteGroup() throws Exception {
+ NotificationChannelGroup notDeleted = new NotificationChannelGroup("not", "deleted");
+ NotificationChannelGroup deleted = new NotificationChannelGroup("totally", "deleted");
+ NotificationChannel nonGroupedNonDeletedChannel =
+ new NotificationChannel("no group", "so not deleted", IMPORTANCE_HIGH);
+ NotificationChannel groupedButNotDeleted =
+ new NotificationChannel("not deleted", "belongs to notDeleted", IMPORTANCE_DEFAULT);
+ groupedButNotDeleted.setGroup("not");
+ NotificationChannel groupedAndDeleted =
+ new NotificationChannel("deleted", "belongs to deleted", IMPORTANCE_DEFAULT);
+ groupedAndDeleted.setGroup("totally");
+
+ mHelper.createNotificationChannelGroup(PKG, UID, notDeleted, true);
+ mHelper.createNotificationChannelGroup(PKG, UID, deleted, true);
+ mHelper.createNotificationChannel(PKG, UID, nonGroupedNonDeletedChannel, true, false);
+ mHelper.createNotificationChannel(PKG, UID, groupedAndDeleted, true, false);
+ mHelper.createNotificationChannel(PKG, UID, groupedButNotDeleted, true, false);
+
+ mHelper.deleteNotificationChannelGroup(PKG, UID, deleted.getId());
+
+ assertNull(mHelper.getNotificationChannelGroup(deleted.getId(), PKG, UID));
+ assertNotNull(mHelper.getNotificationChannelGroup(notDeleted.getId(), PKG, UID));
+
+ assertNull(mHelper.getNotificationChannel(PKG, UID, groupedAndDeleted.getId(), false));
+ compareChannels(groupedAndDeleted,
+ mHelper.getNotificationChannel(PKG, UID, groupedAndDeleted.getId(), true));
+
+ compareChannels(groupedButNotDeleted,
+ mHelper.getNotificationChannel(PKG, UID, groupedButNotDeleted.getId(), false));
+ compareChannels(nonGroupedNonDeletedChannel, mHelper.getNotificationChannel(
+ PKG, UID, nonGroupedNonDeletedChannel.getId(), false));
+
+ // notDeleted
+ assertEquals(1, mHelper.getNotificationChannelGroups(PKG, UID).size());
+
+ verify(mHandler, never()).requestSort();
+ }
+
+ @Test
+ public void testOnUserRemoved() throws Exception {
+ int[] user0Uids = {98, 235, 16, 3782};
+ int[] user1Uids = new int[user0Uids.length];
+ for (int i = 0; i < user0Uids.length; i++) {
+ user1Uids[i] = UserHandle.PER_USER_RANGE + user0Uids[i];
+
+ final ApplicationInfo legacy = new ApplicationInfo();
+ legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
+ when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(legacy);
+
+ // create records with the default channel for all user 0 and user 1 uids
+ mHelper.getImportance(PKG, user0Uids[i]);
+ mHelper.getImportance(PKG, user1Uids[i]);
+ }
+
+ mHelper.onUserRemoved(1);
+
+ // user 0 records remain
+ for (int i = 0; i < user0Uids.length; i++) {
+ assertEquals(1,
+ mHelper.getNotificationChannels(PKG, user0Uids[i], false).getList().size());
+ }
+ // user 1 records are gone
+ for (int i = 0; i < user1Uids.length; i++) {
+ assertEquals(0,
+ mHelper.getNotificationChannels(PKG, user1Uids[i], false).getList().size());
+ }
+ }
+
+ @Test
+ public void testOnPackageChanged_packageRemoval() throws Exception {
+ // Deleted
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+
+ mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
+
+ assertEquals(0, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
+
+ // Not deleted
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+
+ mHelper.onPackagesChanged(false, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
+ assertEquals(2, mHelper.getNotificationChannels(PKG, UID, false).getList().size());
+ }
+
+ @Test
+ public void testOnPackageChanged_packageRemoval_importance() throws Exception {
+ mHelper.setImportance(PKG, UID, NotificationManager.IMPORTANCE_HIGH);
+
+ mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
+
+ assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID));
+ }
+
+ @Test
+ public void testOnPackageChanged_packageRemoval_groups() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ NotificationChannelGroup ncg2 = new NotificationChannelGroup("group2", "name2");
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
+
+ mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
+
+ assertEquals(0,
+ mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList().size());
+ }
+
+ @Test
+ public void testOnPackageChange_downgradeTargetSdk() throws Exception {
+ // create channel as api 26
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true, false);
+
+ // install new app version targeting 25
+ final ApplicationInfo legacy = new ApplicationInfo();
+ legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
+ when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(legacy);
+ mHelper.onPackagesChanged(
+ false, UserHandle.USER_SYSTEM, new String[]{UPDATED_PKG}, new int[]{UID2});
+
+ // make sure the default channel was readded
+ //assertEquals(2, mHelper.getNotificationChannels(UPDATED_PKG, UID2, false).getList().size());
+ assertNotNull(mHelper.getNotificationChannel(
+ UPDATED_PKG, UID2, NotificationChannel.DEFAULT_CHANNEL_ID, false));
+ }
+
+ @Test
+ public void testRecordDefaults() throws Exception {
+ assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID));
+ assertEquals(true, mHelper.canShowBadge(PKG, UID));
+ assertEquals(1, mHelper.getNotificationChannels(PKG, UID, false).getList().size());
+ }
+
+ @Test
+ public void testCreateGroup() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ assertEquals(ncg, mHelper.getNotificationChannelGroups(PKG, UID).iterator().next());
+ verify(mHandler, never()).requestSort();
+ }
+
+ @Test
+ public void testCannotCreateChannel_badGroup() throws Exception {
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ channel1.setGroup("garbage");
+ try {
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ fail("Created a channel with a bad group");
+ } catch (IllegalArgumentException e) {
+ }
+ }
+
+ @Test
+ public void testCannotCreateChannel_goodGroup() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ channel1.setGroup(ncg.getId());
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+
+ assertEquals(ncg.getId(),
+ mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false).getGroup());
+ }
+
+ @Test
+ public void testGetChannelGroups() throws Exception {
+ NotificationChannelGroup unused = new NotificationChannelGroup("unused", "s");
+ mHelper.createNotificationChannelGroup(PKG, UID, unused, true);
+ NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ NotificationChannelGroup ncg2 = new NotificationChannelGroup("group2", "name2");
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
+
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ channel1.setGroup(ncg.getId());
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ NotificationChannel channel1a =
+ new NotificationChannel("id1a", "name1", NotificationManager.IMPORTANCE_HIGH);
+ channel1a.setGroup(ncg.getId());
+ mHelper.createNotificationChannel(PKG, UID, channel1a, true, false);
+
+ NotificationChannel channel2 =
+ new NotificationChannel("id2", "name1", NotificationManager.IMPORTANCE_HIGH);
+ channel2.setGroup(ncg2.getId());
+ mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
+
+ NotificationChannel channel3 =
+ new NotificationChannel("id3", "name1", NotificationManager.IMPORTANCE_HIGH);
+ mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
+
+ List<NotificationChannelGroup> actual =
+ mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList();
+ assertEquals(3, actual.size());
+ for (NotificationChannelGroup group : actual) {
+ if (group.getId() == null) {
+ assertEquals(2, group.getChannels().size()); // misc channel too
+ assertTrue(channel3.getId().equals(group.getChannels().get(0).getId())
+ || channel3.getId().equals(group.getChannels().get(1).getId()));
+ } else if (group.getId().equals(ncg.getId())) {
+ assertEquals(2, group.getChannels().size());
+ if (group.getChannels().get(0).getId().equals(channel1.getId())) {
+ assertTrue(group.getChannels().get(1).getId().equals(channel1a.getId()));
+ } else if (group.getChannels().get(0).getId().equals(channel1a.getId())) {
+ assertTrue(group.getChannels().get(1).getId().equals(channel1.getId()));
+ } else {
+ fail("expected channel not found");
+ }
+ } else if (group.getId().equals(ncg2.getId())) {
+ assertEquals(1, group.getChannels().size());
+ assertEquals(channel2.getId(), group.getChannels().get(0).getId());
+ }
+ }
+ }
+
+ @Test
+ public void testGetChannelGroups_noSideEffects() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ channel1.setGroup(ncg.getId());
+ mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
+ mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList();
+
+ channel1.setImportance(IMPORTANCE_LOW);
+ mHelper.updateNotificationChannel(PKG, UID, channel1, true);
+
+ List<NotificationChannelGroup> actual =
+ mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList();
+
+ assertEquals(2, actual.size());
+ for (NotificationChannelGroup group : actual) {
+ if (Objects.equals(group.getId(), ncg.getId())) {
+ assertEquals(1, group.getChannels().size());
+ }
+ }
+ }
+
+ @Test
+ public void testCreateChannel_updateName() throws Exception {
+ NotificationChannel nc = new NotificationChannel("id", "hello", IMPORTANCE_DEFAULT);
+ mHelper.createNotificationChannel(PKG, UID, nc, true, false);
+ NotificationChannel actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
+ assertEquals("hello", actual.getName());
+
+ nc = new NotificationChannel("id", "goodbye", IMPORTANCE_HIGH);
+ mHelper.createNotificationChannel(PKG, UID, nc, true, false);
+
+ actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
+ assertEquals("goodbye", actual.getName());
+ assertEquals(IMPORTANCE_DEFAULT, actual.getImportance());
+
+ verify(mHandler, times(1)).requestSort();
+ }
+
+ @Test
+ public void testCreateChannel_addToGroup() throws Exception {
+ NotificationChannelGroup group = new NotificationChannelGroup("group", "");
+ mHelper.createNotificationChannelGroup(PKG, UID, group, true);
+ NotificationChannel nc = new NotificationChannel("id", "hello", IMPORTANCE_DEFAULT);
+ mHelper.createNotificationChannel(PKG, UID, nc, true, false);
+ NotificationChannel actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
+ assertNull(actual.getGroup());
+
+ nc = new NotificationChannel("id", "hello", IMPORTANCE_HIGH);
+ nc.setGroup(group.getId());
+ mHelper.createNotificationChannel(PKG, UID, nc, true, false);
+
+ actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
+ assertNotNull(actual.getGroup());
+ assertEquals(IMPORTANCE_DEFAULT, actual.getImportance());
+
+ verify(mHandler, times(1)).requestSort();
+ }
+
+ @Test
+ public void testDumpChannelsJson() throws Exception {
+ final ApplicationInfo upgrade = new ApplicationInfo();
+ upgrade.targetSdkVersion = Build.VERSION_CODES.O;
+ try {
+ when(mPm.getApplicationInfoAsUser(
+ anyString(), anyInt(), anyInt())).thenReturn(upgrade);
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ ArrayMap<String, Integer> expectedChannels = new ArrayMap<>();
+ int numPackages = ThreadLocalRandom.current().nextInt(1, 5);
+ for (int i = 0; i < numPackages; i++) {
+ String pkgName = "pkg" + i;
+ int numChannels = ThreadLocalRandom.current().nextInt(1, 10);
+ for (int j = 0; j < numChannels; j++) {
+ mHelper.createNotificationChannel(pkgName, UID,
+ new NotificationChannel("" + j, "a", IMPORTANCE_HIGH), true, false);
+ }
+ expectedChannels.put(pkgName, numChannels);
+ }
+
+ // delete the first channel of the first package
+ String pkg = expectedChannels.keyAt(0);
+ mHelper.deleteNotificationChannel("pkg" + 0, UID, "0");
+ // dump should not include deleted channels
+ int count = expectedChannels.get(pkg);
+ expectedChannels.put(pkg, count - 1);
+
+ JSONArray actual = mHelper.dumpChannelsJson(new NotificationManagerService.DumpFilter());
+ assertEquals(numPackages, actual.length());
+ for (int i = 0; i < numPackages; i++) {
+ JSONObject object = actual.getJSONObject(i);
+ assertTrue(expectedChannels.containsKey(object.get("packageName")));
+ assertEquals(expectedChannels.get(object.get("packageName")).intValue(),
+ object.getInt("channelCount"));
+ }
+ }
+
+ @Test
+ public void testBadgingOverrideTrue() throws Exception {
+ Secure.putIntForUser(getContext().getContentResolver(),
+ Secure.NOTIFICATION_BADGING, 1,
+ USER.getIdentifier());
+ mHelper.updateBadgingEnabled(); // would be called by settings observer
+ assertTrue(mHelper.badgingEnabled(USER));
+ }
+
+ @Test
+ public void testBadgingOverrideFalse() throws Exception {
+ Secure.putIntForUser(getContext().getContentResolver(),
+ Secure.NOTIFICATION_BADGING, 0,
+ USER.getIdentifier());
+ mHelper.updateBadgingEnabled(); // would be called by settings observer
+ assertFalse(mHelper.badgingEnabled(USER));
+ }
+
+ @Test
+ public void testBadgingForUserAll() throws Exception {
+ try {
+ mHelper.badgingEnabled(UserHandle.ALL);
+ } catch (Exception e) {
+ fail("just don't throw");
+ }
+ }
+
+ @Test
+ public void testBadgingOverrideUserIsolation() throws Exception {
+ Secure.putIntForUser(getContext().getContentResolver(),
+ Secure.NOTIFICATION_BADGING, 0,
+ USER.getIdentifier());
+ Secure.putIntForUser(getContext().getContentResolver(),
+ Secure.NOTIFICATION_BADGING, 1,
+ USER2.getIdentifier());
+ mHelper.updateBadgingEnabled(); // would be called by settings observer
+ assertFalse(mHelper.badgingEnabled(USER));
+ assertTrue(mHelper.badgingEnabled(USER2));
+ }
+
+ @Test
+ public void testOnLocaleChanged_updatesDefaultChannels() throws Exception {
+ String newLabel = "bananas!";
+ final NotificationChannel defaultChannel = mHelper.getNotificationChannel(PKG, UID,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false);
+ assertFalse(newLabel.equals(defaultChannel.getName()));
+
+ Resources res = mock(Resources.class);
+ when(mContext.getResources()).thenReturn(res);
+ when(res.getString(com.android.internal.R.string.default_notification_channel_label))
+ .thenReturn(newLabel);
+
+ mHelper.onLocaleChanged(mContext, USER.getIdentifier());
+
+ assertEquals(newLabel, mHelper.getNotificationChannel(PKG, UID,
+ NotificationChannel.DEFAULT_CHANNEL_ID, false).getName());
+ }
+
+ @Test
+ public void testIsGroupBlocked_noGroup() throws Exception {
+ assertFalse(mHelper.isGroupBlocked(PKG, UID, null));
+
+ assertFalse(mHelper.isGroupBlocked(PKG, UID, "non existent group"));
+ }
+
+ @Test
+ public void testIsGroupBlocked_notBlocked() throws Exception {
+ NotificationChannelGroup group = new NotificationChannelGroup("id", "name");
+ mHelper.createNotificationChannelGroup(PKG, UID, group, true);
+
+ assertFalse(mHelper.isGroupBlocked(PKG, UID, group.getId()));
+ }
+
+ @Test
+ public void testIsGroupBlocked_blocked() throws Exception {
+ NotificationChannelGroup group = new NotificationChannelGroup("id", "name");
+ mHelper.createNotificationChannelGroup(PKG, UID, group, true);
+ group.setBlocked(true);
+ mHelper.createNotificationChannelGroup(PKG, UID, group, false);
+
+ assertTrue(mHelper.isGroupBlocked(PKG, UID, group.getId()));
+ }
+
+ @Test
+ public void testIsGroup_appCannotResetBlock() throws Exception {
+ NotificationChannelGroup group = new NotificationChannelGroup("id", "name");
+ mHelper.createNotificationChannelGroup(PKG, UID, group, true);
+ NotificationChannelGroup group2 = group.clone();
+ group2.setBlocked(true);
+ mHelper.createNotificationChannelGroup(PKG, UID, group2, false);
+ assertTrue(mHelper.isGroupBlocked(PKG, UID, group.getId()));
+
+ NotificationChannelGroup group3 = group.clone();
+ group3.setBlocked(false);
+ mHelper.createNotificationChannelGroup(PKG, UID, group3, true);
+ assertTrue(mHelper.isGroupBlocked(PKG, UID, group.getId()));
+ }
+
+ @Test
+ public void testGetNotificationChannelGroupWithChannels() throws Exception {
+ NotificationChannelGroup group = new NotificationChannelGroup("group", "");
+ NotificationChannelGroup other = new NotificationChannelGroup("something else", "");
+ mHelper.createNotificationChannelGroup(PKG, UID, group, true);
+ mHelper.createNotificationChannelGroup(PKG, UID, other, true);
+
+ NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_DEFAULT);
+ a.setGroup(group.getId());
+ NotificationChannel b = new NotificationChannel("b", "b", IMPORTANCE_DEFAULT);
+ b.setGroup(other.getId());
+ NotificationChannel c = new NotificationChannel("c", "c", IMPORTANCE_DEFAULT);
+ c.setGroup(group.getId());
+ NotificationChannel d = new NotificationChannel("d", "d", IMPORTANCE_DEFAULT);
+
+ mHelper.createNotificationChannel(PKG, UID, a, true, false);
+ mHelper.createNotificationChannel(PKG, UID, b, true, false);
+ mHelper.createNotificationChannel(PKG, UID, c, true, false);
+ mHelper.createNotificationChannel(PKG, UID, d, true, false);
+ mHelper.deleteNotificationChannel(PKG, UID, c.getId());
+
+ NotificationChannelGroup retrieved = mHelper.getNotificationChannelGroupWithChannels(
+ PKG, UID, group.getId(), true);
+ assertEquals(2, retrieved.getChannels().size());
+ compareChannels(a, findChannel(retrieved.getChannels(), a.getId()));
+ compareChannels(c, findChannel(retrieved.getChannels(), c.getId()));
+
+ retrieved = mHelper.getNotificationChannelGroupWithChannels(
+ PKG, UID, group.getId(), false);
+ assertEquals(1, retrieved.getChannels().size());
+ compareChannels(a, findChannel(retrieved.getChannels(), a.getId()));
+ }
+
+ @Test
+ public void testAndroidPkgCannotBypassDnd_creation() {
+ NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ test.setBypassDnd(true);
+
+ mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, test, true, false);
+
+ assertFalse(mHelper.getNotificationChannel(SYSTEM_PKG, SYSTEM_UID, "A", false)
+ .canBypassDnd());
+ }
+
+ @Test
+ public void testDndPkgCanBypassDnd_creation() {
+ NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ test.setBypassDnd(true);
+
+ mHelper.createNotificationChannel(PKG, UID, test, true, true);
+
+ assertTrue(mHelper.getNotificationChannel(PKG, UID, "A", false).canBypassDnd());
+ }
+
+ @Test
+ public void testNormalPkgCannotBypassDnd_creation() {
+ NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ test.setBypassDnd(true);
+
+ mHelper.createNotificationChannel(PKG, 1000, test, true, false);
+
+ assertFalse(mHelper.getNotificationChannel(PKG, 1000, "A", false).canBypassDnd());
+ }
+
+ @Test
+ public void testAndroidPkgCannotBypassDnd_update() throws Exception {
+ NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, test, true, false);
+
+ NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ update.setBypassDnd(true);
+ mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, update, true, false);
+
+ assertFalse(mHelper.getNotificationChannel(SYSTEM_PKG, SYSTEM_UID, "A", false)
+ .canBypassDnd());
+ }
+
+ @Test
+ public void testDndPkgCanBypassDnd_update() throws Exception {
+ NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(PKG, UID, test, true, true);
+
+ NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ update.setBypassDnd(true);
+ mHelper.createNotificationChannel(PKG, UID, update, true, true);
+
+ assertTrue(mHelper.getNotificationChannel(PKG, UID, "A", false).canBypassDnd());
+ }
+
+ @Test
+ public void testNormalPkgCannotBypassDnd_update() {
+ NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(PKG, 1000, test, true, false);
+ NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
+ update.setBypassDnd(true);
+ mHelper.createNotificationChannel(PKG, 1000, update, true, false);
+ assertFalse(mHelper.getNotificationChannel(PKG, 1000, "A", false).canBypassDnd());
+ }
+
+ @Test
+ public void testGetBlockedAppCount_noApps() {
+ assertEquals(0, mHelper.getBlockedAppCount(0));
+ }
+
+ @Test
+ public void testGetBlockedAppCount_noAppsForUserId() {
+ mHelper.setEnabled(PKG, 100, false);
+ assertEquals(0, mHelper.getBlockedAppCount(9));
+ }
+
+ @Test
+ public void testGetBlockedAppCount_appsForUserId() {
+ mHelper.setEnabled(PKG, 1020, false);
+ mHelper.setEnabled(PKG, 1030, false);
+ mHelper.setEnabled(PKG, 1060, false);
+ mHelper.setEnabled(PKG, 1000, true);
+ assertEquals(3, mHelper.getBlockedAppCount(0));
+ }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 98c6ec42207f..7e0fcc908015 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -15,35 +15,17 @@
*/
package com.android.server.notification;
-import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
-import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.IMPORTANCE_LOW;
-import static android.app.NotificationManager.IMPORTANCE_MAX;
-import static android.app.NotificationManager.IMPORTANCE_NONE;
-import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.fail;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Notification;
import android.app.NotificationChannel;
-import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
import android.content.ContentProvider;
import android.content.Context;
@@ -52,46 +34,26 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
-import android.content.res.Resources;
-import android.graphics.Color;
import android.media.AudioAttributes;
import android.net.Uri;
import android.os.Build;
import android.os.UserHandle;
-import android.provider.Settings;
import android.provider.Settings.Secure;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.TestableContentResolver;
-import android.util.ArrayMap;
-import android.util.Xml;
-import com.android.internal.util.FastXmlSerializer;
import com.android.server.UiServiceTestCase;
-import org.json.JSONArray;
-import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlSerializer;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ThreadLocalRandom;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -118,6 +80,7 @@ public class RankingHelperTest extends UiServiceTestCase {
@Mock IContentProvider mTestIContentProvider;
@Mock Context mContext;
@Mock ZenModeHelper mMockZenModeHelper;
+ @Mock RankingConfig mConfig;
private NotificationManager.Policy mTestNotificationPolicy;
private Notification mNotiGroupGSortA;
@@ -179,9 +142,8 @@ public class RankingHelperTest extends UiServiceTestCase {
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
- mHelper = new RankingHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
+ mHelper = new RankingHelper(getContext(), mHandler, mConfig, mMockZenModeHelper,
mUsageStats, new String[] {ImportanceExtractor.class.getName()});
- resetZenModeHelper();
mNotiGroupGSortA = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setContentTitle("A")
@@ -240,74 +202,6 @@ public class RankingHelperTest extends UiServiceTestCase {
IMPORTANCE_LOW);
}
- private ByteArrayOutputStream writeXmlAndPurge(String pkg, int uid, boolean forBackup,
- String... channelIds)
- throws Exception {
- XmlSerializer serializer = new FastXmlSerializer();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
- serializer.startDocument(null, true);
- mHelper.writeXml(serializer, forBackup);
- serializer.endDocument();
- serializer.flush();
- for (String channelId : channelIds) {
- mHelper.permanentlyDeleteNotificationChannel(pkg, uid, channelId);
- }
- return baos;
- }
-
- private void loadStreamXml(ByteArrayOutputStream stream, boolean forRestore) throws Exception {
- loadByteArrayXml(stream.toByteArray(), forRestore);
- }
-
- private void loadByteArrayXml(byte[] byteArray, boolean forRestore) throws Exception {
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(new BufferedInputStream(new ByteArrayInputStream(byteArray)), null);
- parser.nextTag();
- mHelper.readXml(parser, forRestore);
- }
-
- private void compareChannels(NotificationChannel expected, NotificationChannel actual) {
- assertEquals(expected.getId(), actual.getId());
- assertEquals(expected.getName(), actual.getName());
- assertEquals(expected.getDescription(), actual.getDescription());
- assertEquals(expected.shouldVibrate(), actual.shouldVibrate());
- assertEquals(expected.shouldShowLights(), actual.shouldShowLights());
- assertEquals(expected.getImportance(), actual.getImportance());
- assertEquals(expected.getLockscreenVisibility(), actual.getLockscreenVisibility());
- assertEquals(expected.getSound(), actual.getSound());
- assertEquals(expected.canBypassDnd(), actual.canBypassDnd());
- assertTrue(Arrays.equals(expected.getVibrationPattern(), actual.getVibrationPattern()));
- assertEquals(expected.getGroup(), actual.getGroup());
- assertEquals(expected.getAudioAttributes(), actual.getAudioAttributes());
- assertEquals(expected.getLightColor(), actual.getLightColor());
- }
-
- private void compareGroups(NotificationChannelGroup expected, NotificationChannelGroup actual) {
- assertEquals(expected.getId(), actual.getId());
- assertEquals(expected.getName(), actual.getName());
- assertEquals(expected.getDescription(), actual.getDescription());
- assertEquals(expected.isBlocked(), actual.isBlocked());
- }
-
- private NotificationChannel getChannel() {
- return new NotificationChannel("id", "name", IMPORTANCE_LOW);
- }
-
- private NotificationChannel findChannel(List<NotificationChannel> channels, String id) {
- for (NotificationChannel channel : channels) {
- if (channel.getId().equals(id)) {
- return channel;
- }
- }
- return null;
- }
-
- private void resetZenModeHelper() {
- reset(mMockZenModeHelper);
- when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
- }
-
@Test
public void testFindAfterRankingWithASplitGroup() throws Exception {
ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(3);
@@ -357,1496 +251,4 @@ public class RankingHelperTest extends UiServiceTestCase {
ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>();
mHelper.sort(notificationList);
}
-
- @Test
- public void testChannelXml() throws Exception {
- NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
- ncg.setBlocked(true);
- ncg.setDescription("group desc");
- NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- NotificationChannel channel2 =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel2.setDescription("descriptions for all");
- channel2.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
- channel2.enableLights(true);
- channel2.setBypassDnd(true);
- channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
- channel2.enableVibration(true);
- channel2.setGroup(ncg.getId());
- channel2.setVibrationPattern(new long[]{100, 67, 145, 156});
- channel2.setLightColor(Color.BLUE);
-
- mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
- mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
-
- mHelper.setShowBadge(PKG, UID, true);
- mHelper.setAppImportanceLocked(PKG, UID);
-
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false, channel1.getId(),
- channel2.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
- mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG}, new int[]{UID});
-
- loadStreamXml(baos, false);
-
- assertTrue(mHelper.canShowBadge(PKG, UID));
- assertTrue(mHelper.getIsAppImportanceLocked(PKG, UID));
- assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
- compareChannels(channel2,
- mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
-
- List<NotificationChannelGroup> actualGroups =
- mHelper.getNotificationChannelGroups(PKG, UID, false, true).getList();
- boolean foundNcg = false;
- for (NotificationChannelGroup actual : actualGroups) {
- if (ncg.getId().equals(actual.getId())) {
- foundNcg = true;
- compareGroups(ncg, actual);
- } else if (ncg2.getId().equals(actual.getId())) {
- compareGroups(ncg2, actual);
- }
- }
- assertTrue(foundNcg);
-
- boolean foundChannel2Group = false;
- for (NotificationChannelGroup actual : actualGroups) {
- if (channel2.getGroup().equals(actual.getChannels().get(0).getGroup())) {
- foundChannel2Group = true;
- break;
- }
- }
- assertTrue(foundChannel2Group);
- }
-
- @Test
- public void testChannelXmlForBackup() throws Exception {
- NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
- NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- NotificationChannel channel2 =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel2.setDescription("descriptions for all");
- channel2.setSound(SOUND_URI, mAudioAttributes);
- channel2.enableLights(true);
- channel2.setBypassDnd(true);
- channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
- channel2.enableVibration(false);
- channel2.setGroup(ncg.getId());
- channel2.setLightColor(Color.BLUE);
- NotificationChannel channel3 = new NotificationChannel("id3", "NAM3", IMPORTANCE_HIGH);
- channel3.enableVibration(true);
-
- mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
- mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
- mHelper.createNotificationChannel(PKG, UID, channel3, false, false);
- mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true, false);
-
- mHelper.setShowBadge(PKG, UID, true);
-
- mHelper.setImportance(UPDATED_PKG, UID2, IMPORTANCE_NONE);
-
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel1.getId(),
- channel2.getId(), channel3.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
- mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG, UPDATED_PKG},
- new int[]{UID, UID2});
-
- mHelper.setShowBadge(UPDATED_PKG, UID2, true);
-
- loadStreamXml(baos, true);
-
- assertEquals(IMPORTANCE_NONE, mHelper.getImportance(UPDATED_PKG, UID2));
- assertTrue(mHelper.canShowBadge(PKG, UID));
- assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
- compareChannels(channel2,
- mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
- compareChannels(channel3,
- mHelper.getNotificationChannel(PKG, UID, channel3.getId(), false));
-
- List<NotificationChannelGroup> actualGroups =
- mHelper.getNotificationChannelGroups(PKG, UID, false, true).getList();
- boolean foundNcg = false;
- for (NotificationChannelGroup actual : actualGroups) {
- if (ncg.getId().equals(actual.getId())) {
- foundNcg = true;
- compareGroups(ncg, actual);
- } else if (ncg2.getId().equals(actual.getId())) {
- compareGroups(ncg2, actual);
- }
- }
- assertTrue(foundNcg);
-
- boolean foundChannel2Group = false;
- for (NotificationChannelGroup actual : actualGroups) {
- if (channel2.getGroup().equals(actual.getChannels().get(0).getGroup())) {
- foundChannel2Group = true;
- break;
- }
- }
- assertTrue(foundChannel2Group);
- }
-
- @Test
- public void testBackupXml_backupCanonicalizedSoundUri() throws Exception {
- NotificationChannel channel =
- new NotificationChannel("id", "name", IMPORTANCE_LOW);
- channel.setSound(SOUND_URI, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
-
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
-
- // Testing that in restore we are given the canonical version
- loadStreamXml(baos, true);
- verify(mTestIContentProvider).uncanonicalize(any(), eq(CANONICAL_SOUND_URI));
- }
-
- @Test
- public void testRestoreXml_withExistentCanonicalizedSoundUri() throws Exception {
- Uri localUri = Uri.parse("content://" + TEST_AUTHORITY + "/local/url");
- Uri canonicalBasedOnLocal = localUri.buildUpon()
- .appendQueryParameter("title", "Test")
- .appendQueryParameter("canonical", "1")
- .build();
- when(mTestIContentProvider.canonicalize(any(), eq(CANONICAL_SOUND_URI)))
- .thenReturn(canonicalBasedOnLocal);
- when(mTestIContentProvider.uncanonicalize(any(), eq(CANONICAL_SOUND_URI)))
- .thenReturn(localUri);
- when(mTestIContentProvider.uncanonicalize(any(), eq(canonicalBasedOnLocal)))
- .thenReturn(localUri);
-
- NotificationChannel channel =
- new NotificationChannel("id", "name", IMPORTANCE_LOW);
- channel.setSound(SOUND_URI, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
-
- loadStreamXml(baos, true);
-
- NotificationChannel actualChannel = mHelper.getNotificationChannel(
- PKG, UID, channel.getId(), false);
- assertEquals(localUri, actualChannel.getSound());
- }
-
- @Test
- public void testRestoreXml_withNonExistentCanonicalizedSoundUri() throws Exception {
- Thread.sleep(3000);
- when(mTestIContentProvider.canonicalize(any(), eq(CANONICAL_SOUND_URI)))
- .thenReturn(null);
- when(mTestIContentProvider.uncanonicalize(any(), eq(CANONICAL_SOUND_URI)))
- .thenReturn(null);
-
- NotificationChannel channel =
- new NotificationChannel("id", "name", IMPORTANCE_LOW);
- channel.setSound(SOUND_URI, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
-
- loadStreamXml(baos, true);
-
- NotificationChannel actualChannel = mHelper.getNotificationChannel(
- PKG, UID, channel.getId(), false);
- assertEquals(Settings.System.DEFAULT_NOTIFICATION_URI, actualChannel.getSound());
- }
-
-
- /**
- * Although we don't make backups with uncanonicalized uris anymore, we used to, so we have to
- * handle its restore properly.
- */
- @Test
- public void testRestoreXml_withUncanonicalizedNonLocalSoundUri() throws Exception {
- // Not a local uncanonicalized uri, simulating that it fails to exist locally
- when(mTestIContentProvider.canonicalize(any(), eq(SOUND_URI))).thenReturn(null);
- String id = "id";
- String backupWithUncanonicalizedSoundUri = "<ranking version=\"1\">\n"
- + "<package name=\"com.android.server.notification\" show_badge=\"true\">\n"
- + "<channel id=\"" + id + "\" name=\"name\" importance=\"2\" "
- + "sound=\"" + SOUND_URI + "\" "
- + "usage=\"6\" content_type=\"0\" flags=\"1\" show_badge=\"true\" />\n"
- + "<channel id=\"miscellaneous\" name=\"Uncategorized\" usage=\"5\" "
- + "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
- + "</package>\n"
- + "</ranking>\n";
-
- loadByteArrayXml(backupWithUncanonicalizedSoundUri.getBytes(), true);
-
- NotificationChannel actualChannel = mHelper.getNotificationChannel(PKG, UID, id, false);
- assertEquals(Settings.System.DEFAULT_NOTIFICATION_URI, actualChannel.getSound());
- }
-
- @Test
- public void testBackupRestoreXml_withNullSoundUri() throws Exception {
- NotificationChannel channel =
- new NotificationChannel("id", "name", IMPORTANCE_LOW);
- channel.setSound(null, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel.getId());
-
- loadStreamXml(baos, true);
-
- NotificationChannel actualChannel = mHelper.getNotificationChannel(
- PKG, UID, channel.getId(), false);
- assertEquals(null, actualChannel.getSound());
- }
-
- @Test
- public void testChannelXml_backup() throws Exception {
- NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
- NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- NotificationChannel channel2 =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- NotificationChannel channel3 =
- new NotificationChannel("id3", "name3", IMPORTANCE_LOW);
- channel3.setGroup(ncg.getId());
-
- mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
- mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
- mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
-
- mHelper.deleteNotificationChannel(PKG, UID, channel1.getId());
- mHelper.deleteNotificationChannelGroup(PKG, UID, ncg.getId());
- assertEquals(channel2, mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
-
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel1.getId(),
- channel2.getId(), channel3.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
- mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG}, new int[]{UID});
-
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray())),
- null);
- parser.nextTag();
- mHelper.readXml(parser, true);
-
- assertNull(mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
- assertNull(mHelper.getNotificationChannel(PKG, UID, channel3.getId(), false));
- assertNull(mHelper.getNotificationChannelGroup(ncg.getId(), PKG, UID));
- //assertEquals(ncg2, mHelper.getNotificationChannelGroup(ncg2.getId(), PKG, UID));
- assertEquals(channel2, mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
- }
-
- @Test
- public void testChannelXml_defaultChannelLegacyApp_noUserSettings() throws Exception {
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
- NotificationChannel.DEFAULT_CHANNEL_ID);
-
- loadStreamXml(baos, false);
-
- final NotificationChannel updated = mHelper.getNotificationChannel(PKG, UID,
- NotificationChannel.DEFAULT_CHANNEL_ID, false);
- assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, updated.getImportance());
- assertFalse(updated.canBypassDnd());
- assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE, updated.getLockscreenVisibility());
- assertEquals(0, updated.getUserLockedFields());
- }
-
- @Test
- public void testChannelXml_defaultChannelUpdatedApp_userSettings() throws Exception {
- final NotificationChannel defaultChannel = mHelper.getNotificationChannel(PKG, UID,
- NotificationChannel.DEFAULT_CHANNEL_ID, false);
- defaultChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
- mHelper.updateNotificationChannel(PKG, UID, defaultChannel, true);
-
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
- NotificationChannel.DEFAULT_CHANNEL_ID);
-
- loadStreamXml(baos, false);
-
- assertEquals(NotificationManager.IMPORTANCE_LOW, mHelper.getNotificationChannel(
- PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false).getImportance());
- }
-
- @Test
- public void testChannelXml_upgradeCreateDefaultChannel() throws Exception {
- final String preupgradeXml = "<ranking version=\"1\">\n"
- + "<package name=\"" + PKG
- + "\" importance=\"" + NotificationManager.IMPORTANCE_HIGH
- + "\" priority=\"" + Notification.PRIORITY_MAX + "\" visibility=\""
- + Notification.VISIBILITY_SECRET + "\"" +" uid=\"" + UID + "\" />\n"
- + "<package name=\"" + UPDATED_PKG + "\" uid=\"" + UID2 + "\" visibility=\""
- + Notification.VISIBILITY_PRIVATE + "\" />\n"
- + "</ranking>";
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())),
- null);
- parser.nextTag();
- mHelper.readXml(parser, false);
-
- final NotificationChannel updated1 =
- mHelper.getNotificationChannel(PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
- assertEquals(NotificationManager.IMPORTANCE_HIGH, updated1.getImportance());
- assertTrue(updated1.canBypassDnd());
- assertEquals(Notification.VISIBILITY_SECRET, updated1.getLockscreenVisibility());
- assertEquals(NotificationChannel.USER_LOCKED_IMPORTANCE
- | NotificationChannel.USER_LOCKED_PRIORITY
- | NotificationChannel.USER_LOCKED_VISIBILITY,
- updated1.getUserLockedFields());
-
- // No Default Channel created for updated packages
- assertEquals(null, mHelper.getNotificationChannel(UPDATED_PKG, UID2,
- NotificationChannel.DEFAULT_CHANNEL_ID, false));
- }
-
- @Test
- public void testChannelXml_upgradeDeletesDefaultChannel() throws Exception {
- final NotificationChannel defaultChannel = mHelper.getNotificationChannel(
- PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
- assertTrue(defaultChannel != null);
- ByteArrayOutputStream baos =
- writeXmlAndPurge(PKG, UID, false, NotificationChannel.DEFAULT_CHANNEL_ID);
- // Load package at higher sdk.
- final ApplicationInfo upgraded = new ApplicationInfo();
- upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
- when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
- loadStreamXml(baos, false);
-
- // Default Channel should be gone.
- assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
- NotificationChannel.DEFAULT_CHANNEL_ID, false));
- }
-
- @Test
- public void testDeletesDefaultChannelAfterChannelIsCreated() throws Exception {
- mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
- NotificationChannel.DEFAULT_CHANNEL_ID, "bananas");
-
- // Load package at higher sdk.
- final ApplicationInfo upgraded = new ApplicationInfo();
- upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
- when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
- loadStreamXml(baos, false);
-
- // Default Channel should be gone.
- assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
- NotificationChannel.DEFAULT_CHANNEL_ID, false));
- }
-
- @Test
- public void testLoadingOldChannelsDoesNotDeleteNewlyCreatedChannels() throws Exception {
- ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
- NotificationChannel.DEFAULT_CHANNEL_ID, "bananas");
- mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
-
- loadStreamXml(baos, false);
-
- // Should still have the newly created channel that wasn't in the xml.
- assertTrue(mHelper.getNotificationChannel(PKG, UID, "bananas", false) != null);
- }
-
- @Test
- public void testCreateChannel_blocked() throws Exception {
- mHelper.setImportance(PKG, UID, IMPORTANCE_NONE);
-
- mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true, false);
- }
-
- @Test
- public void testCreateChannel_badImportance() throws Exception {
- try {
- mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE - 1),
- true, false);
- fail("Was allowed to create a channel with invalid importance");
- } catch (IllegalArgumentException e) {
- // yay
- }
- try {
- mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_UNSPECIFIED),
- true, false);
- fail("Was allowed to create a channel with invalid importance");
- } catch (IllegalArgumentException e) {
- // yay
- }
- try {
- mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX + 1),
- true, false);
- fail("Was allowed to create a channel with invalid importance");
- } catch (IllegalArgumentException e) {
- // yay
- }
- mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true, false);
- mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX), true, false);
- }
-
-
- @Test
- public void testUpdate() throws Exception {
- // no fields locked by user
- final NotificationChannel channel =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
- channel.enableLights(true);
- channel.setBypassDnd(true);
- channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
-
- mHelper.createNotificationChannel(PKG, UID, channel, false, false);
-
- // same id, try to update all fields
- final NotificationChannel channel2 =
- new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
- channel2.setSound(new Uri.Builder().scheme("test2").build(), mAudioAttributes);
- channel2.enableLights(false);
- channel2.setBypassDnd(false);
- channel2.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
-
- mHelper.updateNotificationChannel(PKG, UID, channel2, true);
-
- // all fields should be changed
- assertEquals(channel2, mHelper.getNotificationChannel(PKG, UID, channel.getId(), false));
-
- verify(mHandler, times(1)).requestSort();
- }
-
- @Test
- public void testUpdate_preUpgrade_updatesAppFields() throws Exception {
- mHelper.setImportance(PKG, UID, IMPORTANCE_UNSPECIFIED);
- assertTrue(mHelper.canShowBadge(PKG, UID));
- assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
- assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
- mHelper.getPackageVisibility(PKG, UID));
- assertFalse(mHelper.getIsAppImportanceLocked(PKG, UID));
-
- NotificationChannel defaultChannel = mHelper.getNotificationChannel(
- PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
-
- defaultChannel.setShowBadge(false);
- defaultChannel.setImportance(IMPORTANCE_NONE);
- defaultChannel.setBypassDnd(true);
- defaultChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
-
- mHelper.setAppImportanceLocked(PKG, UID);
- mHelper.updateNotificationChannel(PKG, UID, defaultChannel, true);
-
- // ensure app level fields are changed
- assertFalse(mHelper.canShowBadge(PKG, UID));
- assertEquals(Notification.PRIORITY_MAX, mHelper.getPackagePriority(PKG, UID));
- assertEquals(Notification.VISIBILITY_SECRET, mHelper.getPackageVisibility(PKG, UID));
- assertEquals(IMPORTANCE_NONE, mHelper.getImportance(PKG, UID));
- assertTrue(mHelper.getIsAppImportanceLocked(PKG, UID));
- }
-
- @Test
- public void testUpdate_postUpgrade_noUpdateAppFields() throws Exception {
- final NotificationChannel channel = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
-
- mHelper.createNotificationChannel(PKG, UID, channel, false, false);
- assertTrue(mHelper.canShowBadge(PKG, UID));
- assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
- assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
- mHelper.getPackageVisibility(PKG, UID));
-
- channel.setShowBadge(false);
- channel.setImportance(IMPORTANCE_NONE);
- channel.setBypassDnd(true);
- channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
-
- mHelper.updateNotificationChannel(PKG, UID, channel, true);
-
- // ensure app level fields are not changed
- assertTrue(mHelper.canShowBadge(PKG, UID));
- assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
- assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
- mHelper.getPackageVisibility(PKG, UID));
- assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID));
- }
-
- @Test
- public void testGetNotificationChannel_ReturnsNullForUnknownChannel() throws Exception {
- assertEquals(null, mHelper.getNotificationChannel(PKG, UID, "garbage", false));
- }
-
- @Test
- public void testCreateChannel_CannotChangeHiddenFields() throws Exception {
- final NotificationChannel channel =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
- channel.enableLights(true);
- channel.setBypassDnd(true);
- channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
- channel.setShowBadge(true);
- int lockMask = 0;
- for (int i = 0; i < NotificationChannel.LOCKABLE_FIELDS.length; i++) {
- lockMask |= NotificationChannel.LOCKABLE_FIELDS[i];
- }
- channel.lockFields(lockMask);
-
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
-
- NotificationChannel savedChannel =
- mHelper.getNotificationChannel(PKG, UID, channel.getId(), false);
-
- assertEquals(channel.getName(), savedChannel.getName());
- assertEquals(channel.shouldShowLights(), savedChannel.shouldShowLights());
- assertFalse(savedChannel.canBypassDnd());
- assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility());
- assertEquals(channel.canShowBadge(), savedChannel.canShowBadge());
-
- verify(mHandler, never()).requestSort();
- }
-
- @Test
- public void testCreateChannel_CannotChangeHiddenFieldsAssistant() throws Exception {
- final NotificationChannel channel =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
- channel.enableLights(true);
- channel.setBypassDnd(true);
- channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
- channel.setShowBadge(true);
- int lockMask = 0;
- for (int i = 0; i < NotificationChannel.LOCKABLE_FIELDS.length; i++) {
- lockMask |= NotificationChannel.LOCKABLE_FIELDS[i];
- }
- channel.lockFields(lockMask);
-
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
-
- NotificationChannel savedChannel =
- mHelper.getNotificationChannel(PKG, UID, channel.getId(), false);
-
- assertEquals(channel.getName(), savedChannel.getName());
- assertEquals(channel.shouldShowLights(), savedChannel.shouldShowLights());
- assertFalse(savedChannel.canBypassDnd());
- assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility());
- assertEquals(channel.canShowBadge(), savedChannel.canShowBadge());
- }
-
- @Test
- public void testClearLockedFields() throws Exception {
- final NotificationChannel channel = getChannel();
- mHelper.clearLockedFields(channel);
- assertEquals(0, channel.getUserLockedFields());
-
- channel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY
- | NotificationChannel.USER_LOCKED_IMPORTANCE);
- mHelper.clearLockedFields(channel);
- assertEquals(0, channel.getUserLockedFields());
- }
-
- @Test
- public void testLockFields_soundAndVibration() throws Exception {
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
-
- final NotificationChannel update1 = getChannel();
- update1.setSound(new Uri.Builder().scheme("test").build(),
- new AudioAttributes.Builder().build());
- update1.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
- mHelper.updateNotificationChannel(PKG, UID, update1, true);
- assertEquals(NotificationChannel.USER_LOCKED_PRIORITY
- | NotificationChannel.USER_LOCKED_SOUND,
- mHelper.getNotificationChannel(PKG, UID, update1.getId(), false)
- .getUserLockedFields());
-
- NotificationChannel update2 = getChannel();
- update2.enableVibration(true);
- mHelper.updateNotificationChannel(PKG, UID, update2, true);
- assertEquals(NotificationChannel.USER_LOCKED_PRIORITY
- | NotificationChannel.USER_LOCKED_SOUND
- | NotificationChannel.USER_LOCKED_VIBRATION,
- mHelper.getNotificationChannel(PKG, UID, update2.getId(), false)
- .getUserLockedFields());
- }
-
- @Test
- public void testLockFields_vibrationAndLights() throws Exception {
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
-
- final NotificationChannel update1 = getChannel();
- update1.setVibrationPattern(new long[]{7945, 46 ,246});
- mHelper.updateNotificationChannel(PKG, UID, update1, true);
- assertEquals(NotificationChannel.USER_LOCKED_VIBRATION,
- mHelper.getNotificationChannel(PKG, UID, update1.getId(), false)
- .getUserLockedFields());
-
- final NotificationChannel update2 = getChannel();
- update2.enableLights(true);
- mHelper.updateNotificationChannel(PKG, UID, update2, true);
- assertEquals(NotificationChannel.USER_LOCKED_VIBRATION
- | NotificationChannel.USER_LOCKED_LIGHTS,
- mHelper.getNotificationChannel(PKG, UID, update2.getId(), false)
- .getUserLockedFields());
- }
-
- @Test
- public void testLockFields_lightsAndImportance() throws Exception {
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
-
- final NotificationChannel update1 = getChannel();
- update1.setLightColor(Color.GREEN);
- mHelper.updateNotificationChannel(PKG, UID, update1, true);
- assertEquals(NotificationChannel.USER_LOCKED_LIGHTS,
- mHelper.getNotificationChannel(PKG, UID, update1.getId(), false)
- .getUserLockedFields());
-
- final NotificationChannel update2 = getChannel();
- update2.setImportance(IMPORTANCE_DEFAULT);
- mHelper.updateNotificationChannel(PKG, UID, update2, true);
- assertEquals(NotificationChannel.USER_LOCKED_LIGHTS
- | NotificationChannel.USER_LOCKED_IMPORTANCE,
- mHelper.getNotificationChannel(PKG, UID, update2.getId(), false)
- .getUserLockedFields());
- }
-
- @Test
- public void testLockFields_visibilityAndDndAndBadge() throws Exception {
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
- assertEquals(0,
- mHelper.getNotificationChannel(PKG, UID, getChannel().getId(), false)
- .getUserLockedFields());
-
- final NotificationChannel update1 = getChannel();
- update1.setBypassDnd(true);
- mHelper.updateNotificationChannel(PKG, UID, update1, true);
- assertEquals(NotificationChannel.USER_LOCKED_PRIORITY,
- mHelper.getNotificationChannel(PKG, UID, update1.getId(), false)
- .getUserLockedFields());
-
- final NotificationChannel update2 = getChannel();
- update2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
- mHelper.updateNotificationChannel(PKG, UID, update2, true);
- assertEquals(NotificationChannel.USER_LOCKED_PRIORITY
- | NotificationChannel.USER_LOCKED_VISIBILITY,
- mHelper.getNotificationChannel(PKG, UID, update2.getId(), false)
- .getUserLockedFields());
-
- final NotificationChannel update3 = getChannel();
- update3.setShowBadge(false);
- mHelper.updateNotificationChannel(PKG, UID, update3, true);
- assertEquals(NotificationChannel.USER_LOCKED_PRIORITY
- | NotificationChannel.USER_LOCKED_VISIBILITY
- | NotificationChannel.USER_LOCKED_SHOW_BADGE,
- mHelper.getNotificationChannel(PKG, UID, update3.getId(), false)
- .getUserLockedFields());
- }
-
- @Test
- public void testDeleteNonExistentChannel() throws Exception {
- mHelper.deleteNotificationChannelGroup(PKG, UID, "does not exist");
- }
-
- @Test
- public void testGetDeletedChannel() throws Exception {
- NotificationChannel channel = getChannel();
- channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
- channel.enableLights(true);
- channel.setBypassDnd(true);
- channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
- channel.enableVibration(true);
- channel.setVibrationPattern(new long[]{100, 67, 145, 156});
-
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
-
- // Does not return deleted channel
- NotificationChannel response =
- mHelper.getNotificationChannel(PKG, UID, channel.getId(), false);
- assertNull(response);
-
- // Returns deleted channel
- response = mHelper.getNotificationChannel(PKG, UID, channel.getId(), true);
- compareChannels(channel, response);
- assertTrue(response.isDeleted());
- }
-
- @Test
- public void testGetDeletedChannels() throws Exception {
- Map<String, NotificationChannel> channelMap = new HashMap<>();
- NotificationChannel channel =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
- channel.enableLights(true);
- channel.setBypassDnd(true);
- channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
- channel.enableVibration(true);
- channel.setVibrationPattern(new long[]{100, 67, 145, 156});
- channelMap.put(channel.getId(), channel);
- NotificationChannel channel2 =
- new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
- channelMap.put(channel2.getId(), channel2);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
-
- mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
-
- // Returns only non-deleted channels
- List<NotificationChannel> channels =
- mHelper.getNotificationChannels(PKG, UID, false).getList();
- assertEquals(2, channels.size()); // Default channel + non-deleted channel
- for (NotificationChannel nc : channels) {
- if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(nc.getId())) {
- compareChannels(channel2, nc);
- }
- }
-
- // Returns deleted channels too
- channels = mHelper.getNotificationChannels(PKG, UID, true).getList();
- assertEquals(3, channels.size()); // Includes default channel
- for (NotificationChannel nc : channels) {
- if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(nc.getId())) {
- compareChannels(channelMap.get(nc.getId()), nc);
- }
- }
- }
-
- @Test
- public void testGetDeletedChannelCount() throws Exception {
- NotificationChannel channel =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- NotificationChannel channel2 =
- new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
- NotificationChannel channel3 =
- new NotificationChannel("id5", "a", NotificationManager.IMPORTANCE_HIGH);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
-
- mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
- mHelper.deleteNotificationChannel(PKG, UID, channel3.getId());
-
- assertEquals(2, mHelper.getDeletedChannelCount(PKG, UID));
- assertEquals(0, mHelper.getDeletedChannelCount("pkg2", UID2));
- }
-
- @Test
- public void testGetBlockedChannelCount() throws Exception {
- NotificationChannel channel =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- NotificationChannel channel2 =
- new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_NONE);
- NotificationChannel channel3 =
- new NotificationChannel("id5", "a", NotificationManager.IMPORTANCE_NONE);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
-
- mHelper.deleteNotificationChannel(PKG, UID, channel3.getId());
-
- assertEquals(1, mHelper.getBlockedChannelCount(PKG, UID));
- assertEquals(0, mHelper.getBlockedChannelCount("pkg2", UID2));
- }
-
- @Test
- public void testCreateAndDeleteCanChannelsBypassDnd() throws Exception {
- // create notification channel that can't bypass dnd
- // expected result: areChannelsBypassingDnd = false
- // setNotificationPolicy isn't called since areChannelsBypassingDnd was already false
- NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- assertFalse(mHelper.areChannelsBypassingDnd());
- verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
- resetZenModeHelper();
-
- // create notification channel that can bypass dnd
- // expected result: areChannelsBypassingDnd = true
- NotificationChannel channel2 = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel2.setBypassDnd(true);
- mHelper.createNotificationChannel(PKG, UID, channel2, true, true);
- assertTrue(mHelper.areChannelsBypassingDnd());
- verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
- resetZenModeHelper();
-
- // delete channels
- mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
- assertTrue(mHelper.areChannelsBypassingDnd()); // channel2 can still bypass DND
- verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
- resetZenModeHelper();
-
- mHelper.deleteNotificationChannel(PKG, UID, channel2.getId());
- assertFalse(mHelper.areChannelsBypassingDnd());
- verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
- resetZenModeHelper();
- }
-
- @Test
- public void testUpdateCanChannelsBypassDnd() throws Exception {
- // create notification channel that can't bypass dnd
- // expected result: areChannelsBypassingDnd = false
- // setNotificationPolicy isn't called since areChannelsBypassingDnd was already false
- NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- assertFalse(mHelper.areChannelsBypassingDnd());
- verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
- resetZenModeHelper();
-
- // update channel so it CAN bypass dnd:
- // expected result: areChannelsBypassingDnd = true
- channel.setBypassDnd(true);
- mHelper.updateNotificationChannel(PKG, UID, channel, true);
- assertTrue(mHelper.areChannelsBypassingDnd());
- verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
- resetZenModeHelper();
-
- // update channel so it can't bypass dnd:
- // expected result: areChannelsBypassingDnd = false
- channel.setBypassDnd(false);
- mHelper.updateNotificationChannel(PKG, UID, channel, true);
- assertFalse(mHelper.areChannelsBypassingDnd());
- verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
- resetZenModeHelper();
- }
-
- @Test
- public void testSetupNewZenModeHelper_canBypass() {
- // start notification policy off with mAreChannelsBypassingDnd = true, but
- // RankingHelper should change to false
- mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
- NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND);
- when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
- mHelper = new RankingHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
- mUsageStats, new String[] {ImportanceExtractor.class.getName()});
- assertFalse(mHelper.areChannelsBypassingDnd());
- verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
- resetZenModeHelper();
- }
-
- @Test
- public void testSetupNewZenModeHelper_cannotBypass() {
- // start notification policy off with mAreChannelsBypassingDnd = false
- mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0, 0);
- when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
- mHelper = new RankingHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
- mUsageStats, new String[] {ImportanceExtractor.class.getName()});
- assertFalse(mHelper.areChannelsBypassingDnd());
- verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
- resetZenModeHelper();
- }
-
- @Test
- public void testCreateDeletedChannel() throws Exception {
- long[] vibration = new long[]{100, 67, 145, 156};
- NotificationChannel channel =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel.setVibrationPattern(vibration);
-
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- mHelper.deleteNotificationChannel(PKG, UID, channel.getId());
-
- NotificationChannel newChannel = new NotificationChannel(
- channel.getId(), channel.getName(), NotificationManager.IMPORTANCE_HIGH);
- newChannel.setVibrationPattern(new long[]{100});
-
- mHelper.createNotificationChannel(PKG, UID, newChannel, true, false);
-
- // No long deleted, using old settings
- compareChannels(channel,
- mHelper.getNotificationChannel(PKG, UID, newChannel.getId(), false));
- }
-
- @Test
- public void testOnlyHasDefaultChannel() throws Exception {
- assertTrue(mHelper.onlyHasDefaultChannel(PKG, UID));
- assertFalse(mHelper.onlyHasDefaultChannel(UPDATED_PKG, UID2));
-
- mHelper.createNotificationChannel(PKG, UID, getChannel(), true, false);
- assertFalse(mHelper.onlyHasDefaultChannel(PKG, UID));
- }
-
- @Test
- public void testCreateChannel_defaultChannelId() throws Exception {
- try {
- mHelper.createNotificationChannel(PKG, UID, new NotificationChannel(
- NotificationChannel.DEFAULT_CHANNEL_ID, "ha", IMPORTANCE_HIGH), true, false);
- fail("Allowed to create default channel");
- } catch (IllegalArgumentException e) {
- // pass
- }
- }
-
- @Test
- public void testCreateChannel_alreadyExists() throws Exception {
- long[] vibration = new long[]{100, 67, 145, 156};
- NotificationChannel channel =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
- channel.setVibrationPattern(vibration);
-
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
-
- NotificationChannel newChannel = new NotificationChannel(
- channel.getId(), channel.getName(), NotificationManager.IMPORTANCE_HIGH);
- newChannel.setVibrationPattern(new long[]{100});
-
- mHelper.createNotificationChannel(PKG, UID, newChannel, true, false);
-
- // Old settings not overridden
- compareChannels(channel,
- mHelper.getNotificationChannel(PKG, UID, newChannel.getId(), false));
- }
-
- @Test
- public void testCreateChannel_noOverrideSound() throws Exception {
- Uri sound = new Uri.Builder().scheme("test").build();
- final NotificationChannel channel = new NotificationChannel("id2", "name2",
- NotificationManager.IMPORTANCE_DEFAULT);
- channel.setSound(sound, mAudioAttributes);
- mHelper.createNotificationChannel(PKG, UID, channel, true, false);
- assertEquals(sound, mHelper.getNotificationChannel(
- PKG, UID, channel.getId(), false).getSound());
- }
-
- @Test
- public void testPermanentlyDeleteChannels() throws Exception {
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- NotificationChannel channel2 =
- new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
-
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
- mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
-
- mHelper.permanentlyDeleteNotificationChannels(PKG, UID);
-
- // Only default channel remains
- assertEquals(1, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
- }
-
- @Test
- public void testDeleteGroup() throws Exception {
- NotificationChannelGroup notDeleted = new NotificationChannelGroup("not", "deleted");
- NotificationChannelGroup deleted = new NotificationChannelGroup("totally", "deleted");
- NotificationChannel nonGroupedNonDeletedChannel =
- new NotificationChannel("no group", "so not deleted", IMPORTANCE_HIGH);
- NotificationChannel groupedButNotDeleted =
- new NotificationChannel("not deleted", "belongs to notDeleted", IMPORTANCE_DEFAULT);
- groupedButNotDeleted.setGroup("not");
- NotificationChannel groupedAndDeleted =
- new NotificationChannel("deleted", "belongs to deleted", IMPORTANCE_DEFAULT);
- groupedAndDeleted.setGroup("totally");
-
- mHelper.createNotificationChannelGroup(PKG, UID, notDeleted, true);
- mHelper.createNotificationChannelGroup(PKG, UID, deleted, true);
- mHelper.createNotificationChannel(PKG, UID, nonGroupedNonDeletedChannel, true, false);
- mHelper.createNotificationChannel(PKG, UID, groupedAndDeleted, true, false);
- mHelper.createNotificationChannel(PKG, UID, groupedButNotDeleted, true, false);
-
- mHelper.deleteNotificationChannelGroup(PKG, UID, deleted.getId());
-
- assertNull(mHelper.getNotificationChannelGroup(deleted.getId(), PKG, UID));
- assertNotNull(mHelper.getNotificationChannelGroup(notDeleted.getId(), PKG, UID));
-
- assertNull(mHelper.getNotificationChannel(PKG, UID, groupedAndDeleted.getId(), false));
- compareChannels(groupedAndDeleted,
- mHelper.getNotificationChannel(PKG, UID, groupedAndDeleted.getId(), true));
-
- compareChannels(groupedButNotDeleted,
- mHelper.getNotificationChannel(PKG, UID, groupedButNotDeleted.getId(), false));
- compareChannels(nonGroupedNonDeletedChannel, mHelper.getNotificationChannel(
- PKG, UID, nonGroupedNonDeletedChannel.getId(), false));
-
- // notDeleted
- assertEquals(1, mHelper.getNotificationChannelGroups(PKG, UID).size());
-
- verify(mHandler, never()).requestSort();
- }
-
- @Test
- public void testOnUserRemoved() throws Exception {
- int[] user0Uids = {98, 235, 16, 3782};
- int[] user1Uids = new int[user0Uids.length];
- for (int i = 0; i < user0Uids.length; i++) {
- user1Uids[i] = UserHandle.PER_USER_RANGE + user0Uids[i];
-
- final ApplicationInfo legacy = new ApplicationInfo();
- legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
- when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(legacy);
-
- // create records with the default channel for all user 0 and user 1 uids
- mHelper.getImportance(PKG, user0Uids[i]);
- mHelper.getImportance(PKG, user1Uids[i]);
- }
-
- mHelper.onUserRemoved(1);
-
- // user 0 records remain
- for (int i = 0; i < user0Uids.length; i++) {
- assertEquals(1,
- mHelper.getNotificationChannels(PKG, user0Uids[i], false).getList().size());
- }
- // user 1 records are gone
- for (int i = 0; i < user1Uids.length; i++) {
- assertEquals(0,
- mHelper.getNotificationChannels(PKG, user1Uids[i], false).getList().size());
- }
- }
-
- @Test
- public void testOnPackageChanged_packageRemoval() throws Exception {
- // Deleted
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
-
- mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
-
- assertEquals(0, mHelper.getNotificationChannels(PKG, UID, true).getList().size());
-
- // Not deleted
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
-
- mHelper.onPackagesChanged(false, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
- assertEquals(2, mHelper.getNotificationChannels(PKG, UID, false).getList().size());
- }
-
- @Test
- public void testOnPackageChanged_packageRemoval_importance() throws Exception {
- mHelper.setImportance(PKG, UID, NotificationManager.IMPORTANCE_HIGH);
-
- mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
-
- assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID));
- }
-
- @Test
- public void testOnPackageChanged_packageRemoval_groups() throws Exception {
- NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
- mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
- NotificationChannelGroup ncg2 = new NotificationChannelGroup("group2", "name2");
- mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
-
- mHelper.onPackagesChanged(true, UserHandle.USER_SYSTEM, new String[]{PKG}, new int[]{UID});
-
- assertEquals(0,
- mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList().size());
- }
-
- @Test
- public void testOnPackageChange_downgradeTargetSdk() throws Exception {
- // create channel as api 26
- mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true, false);
-
- // install new app version targeting 25
- final ApplicationInfo legacy = new ApplicationInfo();
- legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
- when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(legacy);
- mHelper.onPackagesChanged(
- false, UserHandle.USER_SYSTEM, new String[]{UPDATED_PKG}, new int[]{UID2});
-
- // make sure the default channel was readded
- //assertEquals(2, mHelper.getNotificationChannels(UPDATED_PKG, UID2, false).getList().size());
- assertNotNull(mHelper.getNotificationChannel(
- UPDATED_PKG, UID2, NotificationChannel.DEFAULT_CHANNEL_ID, false));
- }
-
- @Test
- public void testRecordDefaults() throws Exception {
- assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID));
- assertEquals(true, mHelper.canShowBadge(PKG, UID));
- assertEquals(1, mHelper.getNotificationChannels(PKG, UID, false).getList().size());
- }
-
- @Test
- public void testCreateGroup() throws Exception {
- NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
- mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
- assertEquals(ncg, mHelper.getNotificationChannelGroups(PKG, UID).iterator().next());
- verify(mHandler, never()).requestSort();
- }
-
- @Test
- public void testCannotCreateChannel_badGroup() throws Exception {
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- channel1.setGroup("garbage");
- try {
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
- fail("Created a channel with a bad group");
- } catch (IllegalArgumentException e) {
- }
- }
-
- @Test
- public void testCannotCreateChannel_goodGroup() throws Exception {
- NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
- mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- channel1.setGroup(ncg.getId());
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
-
- assertEquals(ncg.getId(),
- mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false).getGroup());
- }
-
- @Test
- public void testGetChannelGroups() throws Exception {
- NotificationChannelGroup unused = new NotificationChannelGroup("unused", "s");
- mHelper.createNotificationChannelGroup(PKG, UID, unused, true);
- NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
- mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
- NotificationChannelGroup ncg2 = new NotificationChannelGroup("group2", "name2");
- mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
-
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- channel1.setGroup(ncg.getId());
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
- NotificationChannel channel1a =
- new NotificationChannel("id1a", "name1", NotificationManager.IMPORTANCE_HIGH);
- channel1a.setGroup(ncg.getId());
- mHelper.createNotificationChannel(PKG, UID, channel1a, true, false);
-
- NotificationChannel channel2 =
- new NotificationChannel("id2", "name1", NotificationManager.IMPORTANCE_HIGH);
- channel2.setGroup(ncg2.getId());
- mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
-
- NotificationChannel channel3 =
- new NotificationChannel("id3", "name1", NotificationManager.IMPORTANCE_HIGH);
- mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
-
- List<NotificationChannelGroup> actual =
- mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList();
- assertEquals(3, actual.size());
- for (NotificationChannelGroup group : actual) {
- if (group.getId() == null) {
- assertEquals(2, group.getChannels().size()); // misc channel too
- assertTrue(channel3.getId().equals(group.getChannels().get(0).getId())
- || channel3.getId().equals(group.getChannels().get(1).getId()));
- } else if (group.getId().equals(ncg.getId())) {
- assertEquals(2, group.getChannels().size());
- if (group.getChannels().get(0).getId().equals(channel1.getId())) {
- assertTrue(group.getChannels().get(1).getId().equals(channel1a.getId()));
- } else if (group.getChannels().get(0).getId().equals(channel1a.getId())) {
- assertTrue(group.getChannels().get(1).getId().equals(channel1.getId()));
- } else {
- fail("expected channel not found");
- }
- } else if (group.getId().equals(ncg2.getId())) {
- assertEquals(1, group.getChannels().size());
- assertEquals(channel2.getId(), group.getChannels().get(0).getId());
- }
- }
- }
-
- @Test
- public void testGetChannelGroups_noSideEffects() throws Exception {
- NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
- mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
-
- NotificationChannel channel1 =
- new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
- channel1.setGroup(ncg.getId());
- mHelper.createNotificationChannel(PKG, UID, channel1, true, false);
- mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList();
-
- channel1.setImportance(IMPORTANCE_LOW);
- mHelper.updateNotificationChannel(PKG, UID, channel1, true);
-
- List<NotificationChannelGroup> actual =
- mHelper.getNotificationChannelGroups(PKG, UID, true, true).getList();
-
- assertEquals(2, actual.size());
- for (NotificationChannelGroup group : actual) {
- if (Objects.equals(group.getId(), ncg.getId())) {
- assertEquals(1, group.getChannels().size());
- }
- }
- }
-
- @Test
- public void testCreateChannel_updateName() throws Exception {
- NotificationChannel nc = new NotificationChannel("id", "hello", IMPORTANCE_DEFAULT);
- mHelper.createNotificationChannel(PKG, UID, nc, true, false);
- NotificationChannel actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
- assertEquals("hello", actual.getName());
-
- nc = new NotificationChannel("id", "goodbye", IMPORTANCE_HIGH);
- mHelper.createNotificationChannel(PKG, UID, nc, true, false);
-
- actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
- assertEquals("goodbye", actual.getName());
- assertEquals(IMPORTANCE_DEFAULT, actual.getImportance());
-
- verify(mHandler, times(1)).requestSort();
- }
-
- @Test
- public void testCreateChannel_addToGroup() throws Exception {
- NotificationChannelGroup group = new NotificationChannelGroup("group", "");
- mHelper.createNotificationChannelGroup(PKG, UID, group, true);
- NotificationChannel nc = new NotificationChannel("id", "hello", IMPORTANCE_DEFAULT);
- mHelper.createNotificationChannel(PKG, UID, nc, true, false);
- NotificationChannel actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
- assertNull(actual.getGroup());
-
- nc = new NotificationChannel("id", "hello", IMPORTANCE_HIGH);
- nc.setGroup(group.getId());
- mHelper.createNotificationChannel(PKG, UID, nc, true, false);
-
- actual = mHelper.getNotificationChannel(PKG, UID, "id", false);
- assertNotNull(actual.getGroup());
- assertEquals(IMPORTANCE_DEFAULT, actual.getImportance());
-
- verify(mHandler, times(1)).requestSort();
- }
-
- @Test
- public void testDumpChannelsJson() throws Exception {
- final ApplicationInfo upgrade = new ApplicationInfo();
- upgrade.targetSdkVersion = Build.VERSION_CODES.O;
- try {
- when(mPm.getApplicationInfoAsUser(
- anyString(), anyInt(), anyInt())).thenReturn(upgrade);
- } catch (PackageManager.NameNotFoundException e) {
- }
- ArrayMap<String, Integer> expectedChannels = new ArrayMap<>();
- int numPackages = ThreadLocalRandom.current().nextInt(1, 5);
- for (int i = 0; i < numPackages; i++) {
- String pkgName = "pkg" + i;
- int numChannels = ThreadLocalRandom.current().nextInt(1, 10);
- for (int j = 0; j < numChannels; j++) {
- mHelper.createNotificationChannel(pkgName, UID,
- new NotificationChannel("" + j, "a", IMPORTANCE_HIGH), true, false);
- }
- expectedChannels.put(pkgName, numChannels);
- }
-
- // delete the first channel of the first package
- String pkg = expectedChannels.keyAt(0);
- mHelper.deleteNotificationChannel("pkg" + 0, UID, "0");
- // dump should not include deleted channels
- int count = expectedChannels.get(pkg);
- expectedChannels.put(pkg, count - 1);
-
- JSONArray actual = mHelper.dumpChannelsJson(new NotificationManagerService.DumpFilter());
- assertEquals(numPackages, actual.length());
- for (int i = 0; i < numPackages; i++) {
- JSONObject object = actual.getJSONObject(i);
- assertTrue(expectedChannels.containsKey(object.get("packageName")));
- assertEquals(expectedChannels.get(object.get("packageName")).intValue(),
- object.getInt("channelCount"));
- }
- }
-
- @Test
- public void testBadgingOverrideTrue() throws Exception {
- Secure.putIntForUser(getContext().getContentResolver(),
- Secure.NOTIFICATION_BADGING, 1,
- USER.getIdentifier());
- mHelper.updateBadgingEnabled(); // would be called by settings observer
- assertTrue(mHelper.badgingEnabled(USER));
- }
-
- @Test
- public void testBadgingOverrideFalse() throws Exception {
- Secure.putIntForUser(getContext().getContentResolver(),
- Secure.NOTIFICATION_BADGING, 0,
- USER.getIdentifier());
- mHelper.updateBadgingEnabled(); // would be called by settings observer
- assertFalse(mHelper.badgingEnabled(USER));
- }
-
- @Test
- public void testBadgingForUserAll() throws Exception {
- try {
- mHelper.badgingEnabled(UserHandle.ALL);
- } catch (Exception e) {
- fail("just don't throw");
- }
- }
-
- @Test
- public void testBadgingOverrideUserIsolation() throws Exception {
- Secure.putIntForUser(getContext().getContentResolver(),
- Secure.NOTIFICATION_BADGING, 0,
- USER.getIdentifier());
- Secure.putIntForUser(getContext().getContentResolver(),
- Secure.NOTIFICATION_BADGING, 1,
- USER2.getIdentifier());
- mHelper.updateBadgingEnabled(); // would be called by settings observer
- assertFalse(mHelper.badgingEnabled(USER));
- assertTrue(mHelper.badgingEnabled(USER2));
- }
-
- @Test
- public void testOnLocaleChanged_updatesDefaultChannels() throws Exception {
- String newLabel = "bananas!";
- final NotificationChannel defaultChannel = mHelper.getNotificationChannel(PKG, UID,
- NotificationChannel.DEFAULT_CHANNEL_ID, false);
- assertFalse(newLabel.equals(defaultChannel.getName()));
-
- Resources res = mock(Resources.class);
- when(mContext.getResources()).thenReturn(res);
- when(res.getString(com.android.internal.R.string.default_notification_channel_label))
- .thenReturn(newLabel);
-
- mHelper.onLocaleChanged(mContext, USER.getIdentifier());
-
- assertEquals(newLabel, mHelper.getNotificationChannel(PKG, UID,
- NotificationChannel.DEFAULT_CHANNEL_ID, false).getName());
- }
-
- @Test
- public void testIsGroupBlocked_noGroup() throws Exception {
- assertFalse(mHelper.isGroupBlocked(PKG, UID, null));
-
- assertFalse(mHelper.isGroupBlocked(PKG, UID, "non existent group"));
- }
-
- @Test
- public void testIsGroupBlocked_notBlocked() throws Exception {
- NotificationChannelGroup group = new NotificationChannelGroup("id", "name");
- mHelper.createNotificationChannelGroup(PKG, UID, group, true);
-
- assertFalse(mHelper.isGroupBlocked(PKG, UID, group.getId()));
- }
-
- @Test
- public void testIsGroupBlocked_blocked() throws Exception {
- NotificationChannelGroup group = new NotificationChannelGroup("id", "name");
- mHelper.createNotificationChannelGroup(PKG, UID, group, true);
- group.setBlocked(true);
- mHelper.createNotificationChannelGroup(PKG, UID, group, false);
-
- assertTrue(mHelper.isGroupBlocked(PKG, UID, group.getId()));
- }
-
- @Test
- public void testIsGroup_appCannotResetBlock() throws Exception {
- NotificationChannelGroup group = new NotificationChannelGroup("id", "name");
- mHelper.createNotificationChannelGroup(PKG, UID, group, true);
- NotificationChannelGroup group2 = group.clone();
- group2.setBlocked(true);
- mHelper.createNotificationChannelGroup(PKG, UID, group2, false);
- assertTrue(mHelper.isGroupBlocked(PKG, UID, group.getId()));
-
- NotificationChannelGroup group3 = group.clone();
- group3.setBlocked(false);
- mHelper.createNotificationChannelGroup(PKG, UID, group3, true);
- assertTrue(mHelper.isGroupBlocked(PKG, UID, group.getId()));
- }
-
- @Test
- public void testGetNotificationChannelGroupWithChannels() throws Exception {
- NotificationChannelGroup group = new NotificationChannelGroup("group", "");
- NotificationChannelGroup other = new NotificationChannelGroup("something else", "");
- mHelper.createNotificationChannelGroup(PKG, UID, group, true);
- mHelper.createNotificationChannelGroup(PKG, UID, other, true);
-
- NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_DEFAULT);
- a.setGroup(group.getId());
- NotificationChannel b = new NotificationChannel("b", "b", IMPORTANCE_DEFAULT);
- b.setGroup(other.getId());
- NotificationChannel c = new NotificationChannel("c", "c", IMPORTANCE_DEFAULT);
- c.setGroup(group.getId());
- NotificationChannel d = new NotificationChannel("d", "d", IMPORTANCE_DEFAULT);
-
- mHelper.createNotificationChannel(PKG, UID, a, true, false);
- mHelper.createNotificationChannel(PKG, UID, b, true, false);
- mHelper.createNotificationChannel(PKG, UID, c, true, false);
- mHelper.createNotificationChannel(PKG, UID, d, true, false);
- mHelper.deleteNotificationChannel(PKG, UID, c.getId());
-
- NotificationChannelGroup retrieved = mHelper.getNotificationChannelGroupWithChannels(
- PKG, UID, group.getId(), true);
- assertEquals(2, retrieved.getChannels().size());
- compareChannels(a, findChannel(retrieved.getChannels(), a.getId()));
- compareChannels(c, findChannel(retrieved.getChannels(), c.getId()));
-
- retrieved = mHelper.getNotificationChannelGroupWithChannels(
- PKG, UID, group.getId(), false);
- assertEquals(1, retrieved.getChannels().size());
- compareChannels(a, findChannel(retrieved.getChannels(), a.getId()));
- }
-
- @Test
- public void testAndroidPkgCannotBypassDnd_creation() {
- NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- test.setBypassDnd(true);
-
- mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, test, true, false);
-
- assertFalse(mHelper.getNotificationChannel(SYSTEM_PKG, SYSTEM_UID, "A", false)
- .canBypassDnd());
- }
-
- @Test
- public void testDndPkgCanBypassDnd_creation() {
- NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- test.setBypassDnd(true);
-
- mHelper.createNotificationChannel(PKG, UID, test, true, true);
-
- assertTrue(mHelper.getNotificationChannel(PKG, UID, "A", false).canBypassDnd());
- }
-
- @Test
- public void testNormalPkgCannotBypassDnd_creation() {
- NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- test.setBypassDnd(true);
-
- mHelper.createNotificationChannel(PKG, 1000, test, true, false);
-
- assertFalse(mHelper.getNotificationChannel(PKG, 1000, "A", false).canBypassDnd());
- }
-
- @Test
- public void testAndroidPkgCannotBypassDnd_update() throws Exception {
- NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, test, true, false);
-
- NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- update.setBypassDnd(true);
- mHelper.createNotificationChannel(SYSTEM_PKG, SYSTEM_UID, update, true, false);
-
- assertFalse(mHelper.getNotificationChannel(SYSTEM_PKG, SYSTEM_UID, "A", false)
- .canBypassDnd());
- }
-
- @Test
- public void testDndPkgCanBypassDnd_update() throws Exception {
- NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(PKG, UID, test, true, true);
-
- NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- update.setBypassDnd(true);
- mHelper.createNotificationChannel(PKG, UID, update, true, true);
-
- assertTrue(mHelper.getNotificationChannel(PKG, UID, "A", false).canBypassDnd());
- }
-
- @Test
- public void testNormalPkgCannotBypassDnd_update() {
- NotificationChannel test = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- mHelper.createNotificationChannel(PKG, 1000, test, true, false);
- NotificationChannel update = new NotificationChannel("A", "a", IMPORTANCE_LOW);
- update.setBypassDnd(true);
- mHelper.createNotificationChannel(PKG, 1000, update, true, false);
- assertFalse(mHelper.getNotificationChannel(PKG, 1000, "A", false).canBypassDnd());
- }
-
- @Test
- public void testGetBlockedAppCount_noApps() {
- assertEquals(0, mHelper.getBlockedAppCount(0));
- }
-
- @Test
- public void testGetBlockedAppCount_noAppsForUserId() {
- mHelper.setEnabled(PKG, 100, false);
- assertEquals(0, mHelper.getBlockedAppCount(9));
- }
-
- @Test
- public void testGetBlockedAppCount_appsForUserId() {
- mHelper.setEnabled(PKG, 1020, false);
- mHelper.setEnabled(PKG, 1030, false);
- mHelper.setEnabled(PKG, 1060, false);
- mHelper.setEnabled(PKG, 1000, true);
- assertEquals(3, mHelper.getBlockedAppCount(0));
- }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
index 942a07acbf9f..96ac93536a8a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
@@ -121,7 +121,7 @@ public class ScheduleCalendarTest extends UiServiceTestCase {
cal.set(Calendar.MINUTE, 15);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
- mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay() + 1};
+ mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay(1)};
mScheduleInfo.startHour = 1;
mScheduleInfo.endHour = 3;
mScheduleInfo.startMinute = 15;
@@ -149,7 +149,7 @@ public class ScheduleCalendarTest extends UiServiceTestCase {
cal.set(Calendar.MINUTE, 15);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
- mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay() + 1};
+ mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay(1)};
mScheduleInfo.startHour = 22;
mScheduleInfo.endHour = 3;
mScheduleInfo.startMinute = 15;
@@ -250,7 +250,7 @@ public class ScheduleCalendarTest extends UiServiceTestCase {
calAlarm.add(Calendar.DATE, 1); // add a day
// ScheduleInfo: day 1, day 2: 9pm-7am
- mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay() + 1};
+ mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay(1)};
mScheduleInfo.startHour = 21;
mScheduleInfo.endHour = 7;
mScheduleInfo.startMinute = 0;
@@ -418,7 +418,7 @@ public class ScheduleCalendarTest extends UiServiceTestCase {
now.set(Calendar.MILLISECOND, 0);
now.add(Calendar.DATE, 1); // add a day
- mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay() + 1};
+ mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay(1)};
mScheduleInfo.startHour = 22;
mScheduleInfo.startMinute = 15;
mScheduleInfo.endHour = 3;
@@ -446,7 +446,7 @@ public class ScheduleCalendarTest extends UiServiceTestCase {
now.set(Calendar.MILLISECOND, 0);
now.add(Calendar.DATE, 1); // add a day
- mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay() + 1};
+ mScheduleInfo.days = new int[] {getTodayDay(), getTodayDay(1)};
mScheduleInfo.startHour = 22;
mScheduleInfo.startMinute = 15;
mScheduleInfo.endHour = 3;
@@ -464,4 +464,10 @@ public class ScheduleCalendarTest extends UiServiceTestCase {
private int getTodayDay() {
return new GregorianCalendar().get(Calendar.DAY_OF_WEEK);
}
+
+ private int getTodayDay(int offset) {
+ Calendar cal = new GregorianCalendar();
+ cal.add(Calendar.DATE, offset);
+ return cal.get(Calendar.DAY_OF_WEEK);
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
index 3c4e333b6be9..82e0fbe0e400 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
@@ -1,16 +1,16 @@
package com.android.server.slice;
+import static android.testing.TestableContentResolver.UNSTABLE;
+
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -71,11 +71,12 @@ public class PinnedSliceStateTest extends UiServiceTestCase {
mSliceService = mock(SliceManagerService.class);
when(mSliceService.getContext()).thenReturn(mContext);
when(mSliceService.getLock()).thenReturn(new Object());
- when(mSliceService.getHandler()).thenReturn(new Handler(TestableLooper.get(this).getLooper()));
+ when(mSliceService.getHandler()).thenReturn(
+ new Handler(TestableLooper.get(this).getLooper()));
mContentProvider = mock(ContentProvider.class);
mIContentProvider = mock(IContentProvider.class);
when(mContentProvider.getIContentProvider()).thenReturn(mIContentProvider);
- mContext.getContentResolver().addProvider(AUTH, mContentProvider);
+ mContext.getContentResolver().addProvider(AUTH, mContentProvider, UNSTABLE);
mPinnedSliceManager = new PinnedSliceState(mSliceService, TEST_URI, "pkg");
}
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
index 43a4e277a582..1db89673d600 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
@@ -18,6 +18,7 @@ import static android.content.ContentProvider.maybeAddUserId;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
@@ -59,7 +60,7 @@ import org.junit.runner.RunWith;
public class SliceManagerServiceTest extends UiServiceTestCase {
private static final String AUTH = "com.android.services.uitests";
- private static final Uri TEST_URI = maybeAddUserId(Uri.parse("content://" + AUTH + "/path"), 0);
+ private static final Uri TEST_URI = Uri.parse("content://" + AUTH + "/path");
private static final SliceSpec[] EMPTY_SPECS = new SliceSpec[]{
};
@@ -93,7 +94,7 @@ public class SliceManagerServiceTest extends UiServiceTestCase {
mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
- verify(mService, times(1)).createPinnedSlice(eq(TEST_URI), anyString());
+ verify(mService, times(1)).createPinnedSlice(eq(maybeAddUserId(TEST_URI, 0)), anyString());
}
@Test
@@ -126,4 +127,19 @@ public class SliceManagerServiceTest extends UiServiceTestCase {
verify(mContextSpy).checkPermission(eq("perm2"), eq(Process.myPid()), eq(Process.myUid()));
}
+ @Test(expected = IllegalStateException.class)
+ public void testNoPinThrow() throws Exception {
+ mService.getPinnedSpecs(TEST_URI, "pkg");
+ }
+
+ @Test
+ public void testGetPinnedSpecs() throws Exception {
+ SliceSpec[] specs = new SliceSpec[] {
+ new SliceSpec("Something", 1) };
+ mService.pinSlice("pkg", TEST_URI, specs, mToken);
+
+ when(mCreatedSliceState.getSpecs()).thenReturn(specs);
+ assertEquals(specs, mService.getPinnedSpecs(TEST_URI, "pkg"));
+ }
+
}
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index 0dce7382290c..4b7e21f2d536 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -27,7 +27,9 @@ import android.util.ArraySet;
import java.util.List;
-class IntervalStats {
+import com.android.internal.annotations.VisibleForTesting;
+
+public class IntervalStats {
public long beginTime;
public long endTime;
public long lastTimeSaved;
@@ -149,7 +151,11 @@ class IntervalStats {
&& eventType != UsageEvents.Event.STANDBY_BUCKET_CHANGED;
}
- void update(String packageName, long timeStamp, int eventType) {
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ public void update(String packageName, long timeStamp, int eventType) {
UsageStats usageStats = getOrCreateUsageStats(packageName);
// TODO(adamlesinski): Ensure that we recover from incorrect event sequences
diff --git a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
index 970546976336..5ab5dc223d9e 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
@@ -42,7 +42,7 @@ import java.util.List;
/**
* Provides an interface to query for UsageStat data from an XML database.
*/
-class UsageStatsDatabase {
+public class UsageStatsDatabase {
private static final int CURRENT_VERSION = 3;
// Current version of the backup schema
@@ -369,7 +369,7 @@ class UsageStatsDatabase {
/**
* Figures out what to extract from the given IntervalStats object.
*/
- interface StatCombiner<T> {
+ public interface StatCombiner<T> {
/**
* Implementations should extract interesting from <code>stats</code> and add it
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 2547f16c5357..dd1ddfaf7342 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -207,8 +207,8 @@ public class UsageStatsService extends SystemService implements
@Override
public void onBootPhase(int phase) {
+ mAppStandby.onBootPhase(phase);
if (phase == PHASE_SYSTEM_SERVICES_READY) {
- mAppStandby.onBootPhase(phase);
// initialize mDpmInternal
getDpmInternal();
@@ -712,13 +712,13 @@ public class UsageStatsService extends SystemService implements
if (mPackageManagerInternal.getPackageUid(pkg, /*flags=*/ 0,
callingUserId) != callingUid) {
- throw new SecurityException("Calling uid " + pkg + " cannot query events"
+ throw new SecurityException("Calling uid " + callingUid + " cannot query events"
+ "for package " + pkg);
}
}
private boolean isCallingUidSystem() {
- final int uid = Binder.getCallingUid();
+ final int uid = UserHandle.getAppId(Binder.getCallingUid()); // ignores user
return uid == Process.SYSTEM_UID;
}
@@ -866,7 +866,7 @@ public class UsageStatsService extends SystemService implements
final long token = Binder.clearCallingIdentity();
try {
return UsageStatsService.this.queryEventsForPackage(userId, beginTime,
- endTime, callingPackage);
+ endTime, pkg);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -973,7 +973,8 @@ public class UsageStatsService extends SystemService implements
final long token = Binder.clearCallingIdentity();
try {
final int packageUid = mPackageManagerInternal.getPackageUid(packageName,
- PackageManager.MATCH_ANY_USER, userId);
+ PackageManager.MATCH_ANY_USER | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+ | PackageManager.MATCH_DIRECT_BOOT_AWARE, userId);
// Caller cannot set their own standby state
if (packageUid == callingUid) {
throw new IllegalArgumentException("Cannot set your own standby bucket");
diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
index aa832ad6b0aa..6a1e97a51453 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
@@ -68,6 +68,7 @@ final class UsageStatsXmlV1 {
private static final String SHORTCUT_ID_ATTR = "shortcutId";
private static final String STANDBY_BUCKET_ATTR = "standbyBucket";
private static final String APP_LAUNCH_COUNT_ATTR = "appLaunchCount";
+ private static final String NOTIFICATION_CHANNEL_ATTR = "notificationChannel";
// Time attributes stored as an offset of the beginTime.
private static final String LAST_TIME_ACTIVE_ATTR = "lastTimeActive";
@@ -189,6 +190,11 @@ final class UsageStatsXmlV1 {
case UsageEvents.Event.STANDBY_BUCKET_CHANGED:
event.mBucketAndReason = XmlUtils.readIntAttribute(parser, STANDBY_BUCKET_ATTR, 0);
break;
+ case UsageEvents.Event.NOTIFICATION_INTERRUPTION:
+ final String channelId =
+ XmlUtils.readStringAttribute(parser, NOTIFICATION_CHANNEL_ATTR);
+ event.mNotificationChannelId = (channelId != null) ? channelId.intern() : null;
+ break;
}
if (statsOut.events == null) {
@@ -307,6 +313,13 @@ final class UsageStatsXmlV1 {
if (event.mBucketAndReason != 0) {
XmlUtils.writeIntAttribute(xml, STANDBY_BUCKET_ATTR, event.mBucketAndReason);
}
+ break;
+ case UsageEvents.Event.NOTIFICATION_INTERRUPTION:
+ if (event.mNotificationChannelId != null) {
+ XmlUtils.writeStringAttribute(
+ xml, NOTIFICATION_CHANNEL_ATTR, event.mNotificationChannelId);
+ }
+ break;
}
xml.endTag(null, EVENT_TAG);
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 9cb98f326e75..7d38e8251b53 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -64,6 +64,9 @@ class UserUsageStatsService {
private String mLastBackgroundedPackage;
private final int mUserId;
+ // STOPSHIP: Temporary member variable for debugging b/110930764.
+ private UsageEvents.Event mLastEvent;
+
private static final long[] INTERVAL_LENGTH = new long[] {
UnixCalendar.DAY_IN_MILLIS, UnixCalendar.WEEK_IN_MILLIS,
UnixCalendar.MONTH_IN_MILLIS, UnixCalendar.YEAR_IN_MILLIS
@@ -156,6 +159,8 @@ class UserUsageStatsService {
+ eventToString(event.mEventType));
}
+ mLastEvent = new UsageEvents.Event(event);
+
if (event.mTimeStamp >= mDailyExpiryDate.getTimeInMillis()) {
// Need to rollover
rolloverStats(event.mTimeStamp);
@@ -306,6 +311,36 @@ class UserUsageStatsService {
Slog.d(TAG, mLogPrefix + "Requesting stats after " + beginTime + " but latest is "
+ currentStats.endTime);
}
+
+ // STOPSHIP: Temporary logging for b/110930764.
+ if (intervalType == UsageStatsManager.INTERVAL_DAILY
+ && mLastEvent.mTimeStamp >= beginTime) {
+ final IntervalStats diskStats = mDatabase.getLatestUsageStats(
+ UsageStatsManager.INTERVAL_DAILY);
+ StringBuilder sb = new StringBuilder(256);
+ sb.append("Last 24 hours of UsageStats missing! timeRange : ");
+ sb.append(beginTime);
+ sb.append(", ");
+ sb.append(endTime);
+ sb.append("\nLast reported Usage Event time : ");
+ sb.append(mLastEvent.mTimeStamp);
+ if (currentStats == null) {
+ sb.append("\nNo in memory event stats available.");
+ } else {
+ sb.append("\nLast in memory event time : ");
+ sb.append(currentStats.endTime);
+ sb.append("\nLast save time: ");
+ sb.append(currentStats.lastTimeSaved);
+ }
+ if (diskStats == null) {
+ sb.append("\nNo on disk event stats available.");
+ } else {
+ sb.append("\nLast on disk event time : ");
+ sb.append(diskStats.endTime);
+ }
+ Slog.wtf(TAG, sb.toString());
+ }
+
// Nothing newer available.
return null;
}
@@ -604,6 +639,9 @@ class UserUsageStatsService {
pw.printPair("standbyBucket", event.getStandbyBucket());
pw.printPair("reason", UsageStatsManager.reasonToString(event.getStandbyReason()));
}
+ if (event.mNotificationChannelId != null) {
+ pw.printPair("channelId", event.mNotificationChannelId);
+ }
pw.printHexPair("flags", event.mFlags);
pw.println();
}
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index cac36c35904e..6e16ad002a21 100755
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -20,7 +20,8 @@ import static com.android.internal.usb.DumpUtils.writeAccessory;
import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull;
import android.app.ActivityManager;
-import android.app.ActivityManagerInternal;
+
+import com.android.server.wm.ActivityTaskManagerInternal;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -98,7 +99,7 @@ import java.util.Set;
/**
* UsbDeviceManager manages USB state in device mode.
*/
-public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver {
+public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObserver {
private static final String TAG = UsbDeviceManager.class.getSimpleName();
private static final boolean DEBUG = false;
@@ -386,7 +387,7 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver
public void systemReady() {
if (DEBUG) Slog.d(TAG, "systemReady");
- LocalServices.getService(ActivityManagerInternal.class).registerScreenObserver(this);
+ LocalServices.getService(ActivityTaskManagerInternal.class).registerScreenObserver(this);
mHandler.sendEmptyMessage(MSG_SYSTEM_READY);
}
diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
index 43f189b26dfa..7a906d0b7aaf 100644
--- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java
@@ -445,38 +445,80 @@ class UsbProfileGroupSettingsManager {
});
}
- // Checks to see if a package matches a device or accessory.
- // Only one of device and accessory should be non-null.
- private boolean packageMatchesLocked(ResolveInfo info, String metaDataName,
- UsbDevice device, UsbAccessory accessory) {
- if (isForwardMatch(info)) {
- return true;
- }
-
+ /**
+ * Get {@link DeviceFilter} for all devices an activity should be launched for.
+ *
+ * @param pm The package manager used to get the device filter files
+ * @param info The {@link ResolveInfo} for the activity that can handle usb device attached
+ * events
+ *
+ * @return The list of {@link DeviceFilter} the activity should be called for or {@code null} if
+ * none
+ */
+ @Nullable
+ static ArrayList<DeviceFilter> getDeviceFilters(@NonNull PackageManager pm,
+ @NonNull ResolveInfo info) {
+ ArrayList<DeviceFilter> filters = null;
ActivityInfo ai = info.activityInfo;
XmlResourceParser parser = null;
try {
- parser = ai.loadXmlMetaData(mPackageManager, metaDataName);
+ parser = ai.loadXmlMetaData(pm, UsbManager.ACTION_USB_DEVICE_ATTACHED);
if (parser == null) {
Slog.w(TAG, "no meta-data for " + info);
- return false;
+ return null;
}
XmlUtils.nextElement(parser);
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName();
- if (device != null && "usb-device".equals(tagName)) {
- DeviceFilter filter = DeviceFilter.read(parser);
- if (filter.matches(device)) {
- return true;
+ if ("usb-device".equals(tagName)) {
+ if (filters == null) {
+ filters = new ArrayList<>(1);
}
+ filters.add(DeviceFilter.read(parser));
}
- else if (accessory != null && "usb-accessory".equals(tagName)) {
- AccessoryFilter filter = AccessoryFilter.read(parser);
- if (filter.matches(accessory)) {
- return true;
+ XmlUtils.nextElement(parser);
+ }
+ } catch (Exception e) {
+ Slog.w(TAG, "Unable to load component info " + info.toString(), e);
+ } finally {
+ if (parser != null) parser.close();
+ }
+ return filters;
+ }
+
+ /**
+ * Get {@link AccessoryFilter} for all accessories an activity should be launched for.
+ *
+ * @param pm The package manager used to get the accessory filter files
+ * @param info The {@link ResolveInfo} for the activity that can handle usb accessory attached
+ * events
+ *
+ * @return The list of {@link AccessoryFilter} the activity should be called for or {@code null}
+ * if none
+ */
+ static @Nullable ArrayList<AccessoryFilter> getAccessoryFilters(@NonNull PackageManager pm,
+ @NonNull ResolveInfo info) {
+ ArrayList<AccessoryFilter> filters = null;
+ ActivityInfo ai = info.activityInfo;
+
+ XmlResourceParser parser = null;
+ try {
+ parser = ai.loadXmlMetaData(pm, UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
+ if (parser == null) {
+ Slog.w(TAG, "no meta-data for " + info);
+ return null;
+ }
+
+ XmlUtils.nextElement(parser);
+ while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+ String tagName = parser.getName();
+ if ("usb-accessory".equals(tagName)) {
+ if (filters == null) {
+ filters = new ArrayList<>(1);
}
+ filters.add(AccessoryFilter.read(parser));
}
XmlUtils.nextElement(parser);
}
@@ -485,6 +527,42 @@ class UsbProfileGroupSettingsManager {
} finally {
if (parser != null) parser.close();
}
+ return filters;
+ }
+
+ // Checks to see if a package matches a device or accessory.
+ // Only one of device and accessory should be non-null.
+ private boolean packageMatchesLocked(ResolveInfo info, UsbDevice device,
+ UsbAccessory accessory) {
+ if (isForwardMatch(info)) {
+ return true;
+ }
+
+ if (device != null) {
+ ArrayList<DeviceFilter> deviceFilters = getDeviceFilters(mPackageManager, info);
+ if (deviceFilters != null) {
+ int numDeviceFilters = deviceFilters.size();
+ for (int i = 0; i < numDeviceFilters; i++) {
+ if (deviceFilters.get(i).matches(device)) {
+ return true;
+ }
+ }
+ }
+ }
+
+ if (accessory != null) {
+ ArrayList<AccessoryFilter> accessoryFilters = getAccessoryFilters(mPackageManager,
+ info);
+ if (accessoryFilters != null) {
+ int numAccessoryFilters = accessoryFilters.size();
+ for (int i = 0; i < numAccessoryFilters; i++) {
+ if (accessoryFilters.get(i).matches(accessory)) {
+ return true;
+ }
+ }
+ }
+ }
+
return false;
}
@@ -502,8 +580,8 @@ class UsbProfileGroupSettingsManager {
ArrayList<ResolveInfo> resolveInfos = new ArrayList<>();
int numProfiles = profiles.size();
for (int i = 0; i < numProfiles; i++) {
- resolveInfos.addAll(mPackageManager.queryIntentActivitiesAsUser(intent,
- PackageManager.GET_META_DATA, profiles.get(i).id));
+ resolveInfos.addAll(mSettingsManager.getSettingsForUser(profiles.get(i).id)
+ .queryIntentActivities(intent));
}
return resolveInfos;
@@ -629,7 +707,7 @@ class UsbProfileGroupSettingsManager {
int count = resolveInfos.size();
for (int i = 0; i < count; i++) {
ResolveInfo resolveInfo = resolveInfos.get(i);
- if (packageMatchesLocked(resolveInfo, intent.getAction(), device, null)) {
+ if (packageMatchesLocked(resolveInfo, device, null)) {
matches.add(resolveInfo);
}
}
@@ -644,7 +722,7 @@ class UsbProfileGroupSettingsManager {
int count = resolveInfos.size();
for (int i = 0; i < count; i++) {
ResolveInfo resolveInfo = resolveInfos.get(i);
- if (packageMatchesLocked(resolveInfo, intent.getAction(), null, accessory)) {
+ if (packageMatchesLocked(resolveInfo, null, accessory)) {
matches.add(resolveInfo);
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbSettingsManager.java b/services/usb/java/com/android/server/usb/UsbSettingsManager.java
index caf05a3538ec..9221825b2d87 100644
--- a/services/usb/java/com/android/server/usb/UsbSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbSettingsManager.java
@@ -33,6 +33,8 @@ import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.dump.DualDumpOutputStream;
+import java.util.List;
+
/**
* Maintains all {@link UsbUserSettingsManager} for all users.
*/
@@ -140,9 +142,10 @@ class UsbSettingsManager {
long token = dump.start(idName, id);
synchronized (mSettingsByUser) {
- int numUsers = mSettingsByUser.size();
+ List<UserInfo> users = mUserManager.getUsers();
+ int numUsers = users.size();
for (int i = 0; i < numUsers; i++) {
- mSettingsByUser.valueAt(i).dump(dump, "user_settings",
+ getSettingsForUser(users.get(i).id).dump(dump, "user_settings",
UsbSettingsManagerProto.USER_SETTINGS);
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java b/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java
index 840950679903..24a2d72415ed 100644
--- a/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java
+++ b/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java
@@ -16,14 +16,22 @@
package com.android.server.usb;
+import static com.android.internal.util.dump.DumpUtils.writeComponentName;
+import static com.android.server.usb.UsbProfileGroupSettingsManager.getAccessoryFilters;
+import static com.android.server.usb.UsbProfileGroupSettingsManager.getDeviceFilters;
+
import android.annotation.NonNull;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
+import android.hardware.usb.AccessoryFilter;
+import android.hardware.usb.DeviceFilter;
import android.hardware.usb.UsbAccessory;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
@@ -32,6 +40,8 @@ import android.hardware.usb.UsbManager;
import android.os.Binder;
import android.os.Process;
import android.os.UserHandle;
+import android.service.usb.UsbAccessoryAttachedActivities;
+import android.service.usb.UsbDeviceAttachedActivities;
import android.service.usb.UsbSettingsAccessoryPermissionProto;
import android.service.usb.UsbSettingsDevicePermissionProto;
import android.service.usb.UsbUserSettingsManagerProto;
@@ -40,7 +50,9 @@ import android.util.SparseBooleanArray;
import com.android.internal.util.dump.DualDumpOutputStream;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
class UsbUserSettingsManager {
private static final String TAG = "UsbUserSettingsManager";
@@ -305,6 +317,18 @@ class UsbUserSettingsManager {
}
}
+ /**
+ * Get all activities that can handle the device/accessory attached intent.
+ *
+ * @param intent The intent to handle
+ *
+ * @return The resolve infos of the activities that can handle the intent
+ */
+ List<ResolveInfo> queryIntentActivities(@NonNull Intent intent) {
+ return mPackageManager.queryIntentActivitiesAsUser(intent, PackageManager.GET_META_DATA,
+ mUser.getIdentifier());
+ }
+
public void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) {
long token = dump.start(idName, id);
@@ -341,6 +365,59 @@ class UsbUserSettingsManager {
dump.end(accessoryPermissionToken);
}
+
+ List<ResolveInfo> deviceAttachedActivities = queryIntentActivities(
+ new Intent(UsbManager.ACTION_USB_DEVICE_ATTACHED));
+ int numDeviceAttachedActivities = deviceAttachedActivities.size();
+ for (int activityNum = 0; activityNum < numDeviceAttachedActivities; activityNum++) {
+ ResolveInfo deviceAttachedActivity = deviceAttachedActivities.get(activityNum);
+
+ long deviceAttachedActivityToken = dump.start("device_attached_activities",
+ UsbUserSettingsManagerProto.DEVICE_ATTACHED_ACTIVITIES);
+
+ writeComponentName(dump, "activity", UsbDeviceAttachedActivities.ACTIVITY,
+ new ComponentName(deviceAttachedActivity.activityInfo.packageName,
+ deviceAttachedActivity.activityInfo.name));
+
+ ArrayList<DeviceFilter> deviceFilters = getDeviceFilters(mPackageManager,
+ deviceAttachedActivity);
+ if (deviceFilters != null) {
+ int numDeviceFilters = deviceFilters.size();
+ for (int filterNum = 0; filterNum < numDeviceFilters; filterNum++) {
+ deviceFilters.get(filterNum).dump(dump, "filters",
+ UsbDeviceAttachedActivities.FILTERS);
+ }
+ }
+
+ dump.end(deviceAttachedActivityToken);
+ }
+
+ List<ResolveInfo> accessoryAttachedActivities =
+ queryIntentActivities(new Intent(UsbManager.ACTION_USB_ACCESSORY_ATTACHED));
+ int numAccessoryAttachedActivities = accessoryAttachedActivities.size();
+ for (int activityNum = 0; activityNum < numAccessoryAttachedActivities; activityNum++) {
+ ResolveInfo accessoryAttachedActivity =
+ accessoryAttachedActivities.get(activityNum);
+
+ long accessoryAttachedActivityToken = dump.start("accessory_attached_activities",
+ UsbUserSettingsManagerProto.ACCESSORY_ATTACHED_ACTIVITIES);
+
+ writeComponentName(dump, "activity", UsbAccessoryAttachedActivities.ACTIVITY,
+ new ComponentName(accessoryAttachedActivity.activityInfo.packageName,
+ accessoryAttachedActivity.activityInfo.name));
+
+ ArrayList<AccessoryFilter> accessoryFilters = getAccessoryFilters(mPackageManager,
+ accessoryAttachedActivity);
+ if (accessoryFilters != null) {
+ int numAccessoryFilters = accessoryFilters.size();
+ for (int filterNum = 0; filterNum < numAccessoryFilters; filterNum++) {
+ accessoryFilters.get(filterNum).dump(dump, "filters",
+ UsbAccessoryAttachedActivities.FILTERS);
+ }
+ }
+
+ dump.end(accessoryAttachedActivityToken);
+ }
}
dump.end(token);
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptor.java b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptor.java
index 3fc5fe320574..ff67667e848d 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptor.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptor.java
@@ -126,6 +126,9 @@ public abstract class UsbDescriptor implements Reporting {
public static final int REQUEST_GET_CONFIGURATION = 0x08;
public static final int REQUEST_SET_CONFIGURATION = 0x09;
+ // USB control transfer timeout
+ public static final int USB_CONTROL_TRANSFER_TIMEOUT_MS = 200;
+
/**
* @throws IllegalArgumentException
*/
@@ -224,7 +227,7 @@ public abstract class UsbDescriptor implements Reporting {
0,
sStringBuffer,
0xFF,
- 0);
+ USB_CONTROL_TRANSFER_TIMEOUT_MS);
if (rdo >= 0) {
usbStr = new String(sStringBuffer, 2, rdo - 2, "UTF-16LE");
} else {
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index 1b842fe936ab..de1771690e60 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -32,7 +32,6 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -53,7 +52,6 @@ import android.media.MediaRecorder;
import android.media.soundtrigger.ISoundTriggerDetectionService;
import android.media.soundtrigger.ISoundTriggerDetectionServiceClient;
import android.media.soundtrigger.SoundTriggerDetectionService;
-import android.media.soundtrigger.SoundTriggerManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -71,7 +69,6 @@ import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.ISoundTriggerService;
-import com.android.internal.util.DumpUtils;
import com.android.internal.util.Preconditions;
import com.android.server.SystemService;
@@ -104,7 +101,6 @@ public class SoundTriggerService extends SystemService {
private final TreeMap<UUID, SoundModel> mLoadedModels;
private Object mCallbacksLock;
private final TreeMap<UUID, IRecognitionStatusCallback> mCallbacks;
- private PowerManager.WakeLock mWakelock;
/** Number of ops run by the {@link RemoteSoundTriggerDetectionService} per package name */
@GuardedBy("mLock")
@@ -300,28 +296,17 @@ public class SoundTriggerService extends SystemService {
Preconditions.checkNotNull(detectionService);
Preconditions.checkNotNull(config);
- return startRecognitionForInt(soundModelId,
- new RemoteSoundTriggerDetectionService(soundModelId.getUuid(),
- params, detectionService, Binder.getCallingUserHandle(), config), config);
-
- }
-
- @Override
- public int startRecognitionForIntent(ParcelUuid soundModelId, PendingIntent callbackIntent,
- SoundTrigger.RecognitionConfig config) {
- return startRecognitionForInt(soundModelId,
- new LocalSoundTriggerRecognitionStatusIntentCallback(soundModelId.getUuid(),
- callbackIntent, config), config);
- }
-
- private int startRecognitionForInt(ParcelUuid soundModelId,
- IRecognitionStatusCallback callback, SoundTrigger.RecognitionConfig config) {
enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER);
+
if (!isInitialized()) return STATUS_ERROR;
if (DEBUG) {
Slog.i(TAG, "startRecognition(): id = " + soundModelId);
}
+ IRecognitionStatusCallback callback =
+ new RemoteSoundTriggerDetectionService(soundModelId.getUuid(), params,
+ detectionService, Binder.getCallingUserHandle(), config);
+
synchronized (mLock) {
SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid());
if (soundModel == null) {
@@ -338,12 +323,6 @@ public class SoundTriggerService extends SystemService {
}
int ret;
switch (soundModel.type) {
- case SoundModel.TYPE_KEYPHRASE: {
- KeyphraseSoundModel keyphraseSoundModel = (KeyphraseSoundModel) soundModel;
- ret = mSoundTriggerHelper.startKeyphraseRecognition(
- keyphraseSoundModel.keyphrases[0].id, keyphraseSoundModel, callback,
- config);
- } break;
case SoundModel.TYPE_GENERIC_SOUND:
ret = mSoundTriggerHelper.startGenericRecognition(soundModel.uuid,
(GenericSoundModel) soundModel, callback, config);
@@ -365,7 +344,7 @@ public class SoundTriggerService extends SystemService {
}
@Override
- public int stopRecognitionForIntent(ParcelUuid soundModelId) {
+ public int stopRecognitionForService(ParcelUuid soundModelId) {
enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER);
if (!isInitialized()) return STATUS_ERROR;
if (DEBUG) {
@@ -388,10 +367,6 @@ public class SoundTriggerService extends SystemService {
}
int ret;
switch (soundModel.type) {
- case SoundModel.TYPE_KEYPHRASE:
- ret = mSoundTriggerHelper.stopKeyphraseRecognition(
- ((KeyphraseSoundModel)soundModel).keyphrases[0].id, callback);
- break;
case SoundModel.TYPE_GENERIC_SOUND:
ret = mSoundTriggerHelper.stopGenericRecognition(soundModel.uuid, callback);
break;
@@ -461,138 +436,6 @@ public class SoundTriggerService extends SystemService {
}
}
- private final class LocalSoundTriggerRecognitionStatusIntentCallback
- extends IRecognitionStatusCallback.Stub {
- private UUID mUuid;
- private PendingIntent mCallbackIntent;
- private RecognitionConfig mRecognitionConfig;
-
- public LocalSoundTriggerRecognitionStatusIntentCallback(UUID modelUuid,
- PendingIntent callbackIntent,
- RecognitionConfig config) {
- mUuid = modelUuid;
- mCallbackIntent = callbackIntent;
- mRecognitionConfig = config;
- }
-
- @Override
- public boolean pingBinder() {
- return mCallbackIntent != null;
- }
-
- @Override
- public void onKeyphraseDetected(SoundTrigger.KeyphraseRecognitionEvent event) {
- if (mCallbackIntent == null) {
- return;
- }
- grabWakeLock();
-
- Slog.w(TAG, "Keyphrase sound trigger event: " + event);
- Intent extras = new Intent();
- extras.putExtra(SoundTriggerManager.EXTRA_MESSAGE_TYPE,
- SoundTriggerManager.FLAG_MESSAGE_TYPE_RECOGNITION_EVENT);
- extras.putExtra(SoundTriggerManager.EXTRA_RECOGNITION_EVENT, event);
- try {
- mCallbackIntent.send(mContext, 0, extras, mCallbackCompletedHandler, null);
- if (!mRecognitionConfig.allowMultipleTriggers) {
- removeCallback(/*releaseWakeLock=*/false);
- }
- } catch (PendingIntent.CanceledException e) {
- removeCallback(/*releaseWakeLock=*/true);
- }
- }
-
- @Override
- public void onGenericSoundTriggerDetected(SoundTrigger.GenericRecognitionEvent event) {
- if (mCallbackIntent == null) {
- return;
- }
- grabWakeLock();
-
- Slog.w(TAG, "Generic sound trigger event: " + event);
- Intent extras = new Intent();
- extras.putExtra(SoundTriggerManager.EXTRA_MESSAGE_TYPE,
- SoundTriggerManager.FLAG_MESSAGE_TYPE_RECOGNITION_EVENT);
- extras.putExtra(SoundTriggerManager.EXTRA_RECOGNITION_EVENT, event);
- try {
- mCallbackIntent.send(mContext, 0, extras, mCallbackCompletedHandler, null);
- if (!mRecognitionConfig.allowMultipleTriggers) {
- removeCallback(/*releaseWakeLock=*/false);
- }
- } catch (PendingIntent.CanceledException e) {
- removeCallback(/*releaseWakeLock=*/true);
- }
- }
-
- @Override
- public void onError(int status) {
- if (mCallbackIntent == null) {
- return;
- }
- grabWakeLock();
-
- Slog.i(TAG, "onError: " + status);
- Intent extras = new Intent();
- extras.putExtra(SoundTriggerManager.EXTRA_MESSAGE_TYPE,
- SoundTriggerManager.FLAG_MESSAGE_TYPE_RECOGNITION_ERROR);
- extras.putExtra(SoundTriggerManager.EXTRA_STATUS, status);
- try {
- mCallbackIntent.send(mContext, 0, extras, mCallbackCompletedHandler, null);
- // Remove the callback, but wait for the intent to finish before we let go of the
- // wake lock
- removeCallback(/*releaseWakeLock=*/false);
- } catch (PendingIntent.CanceledException e) {
- removeCallback(/*releaseWakeLock=*/true);
- }
- }
-
- @Override
- public void onRecognitionPaused() {
- if (mCallbackIntent == null) {
- return;
- }
- grabWakeLock();
-
- Slog.i(TAG, "onRecognitionPaused");
- Intent extras = new Intent();
- extras.putExtra(SoundTriggerManager.EXTRA_MESSAGE_TYPE,
- SoundTriggerManager.FLAG_MESSAGE_TYPE_RECOGNITION_PAUSED);
- try {
- mCallbackIntent.send(mContext, 0, extras, mCallbackCompletedHandler, null);
- } catch (PendingIntent.CanceledException e) {
- removeCallback(/*releaseWakeLock=*/true);
- }
- }
-
- @Override
- public void onRecognitionResumed() {
- if (mCallbackIntent == null) {
- return;
- }
- grabWakeLock();
-
- Slog.i(TAG, "onRecognitionResumed");
- Intent extras = new Intent();
- extras.putExtra(SoundTriggerManager.EXTRA_MESSAGE_TYPE,
- SoundTriggerManager.FLAG_MESSAGE_TYPE_RECOGNITION_RESUMED);
- try {
- mCallbackIntent.send(mContext, 0, extras, mCallbackCompletedHandler, null);
- } catch (PendingIntent.CanceledException e) {
- removeCallback(/*releaseWakeLock=*/true);
- }
- }
-
- private void removeCallback(boolean releaseWakeLock) {
- mCallbackIntent = null;
- synchronized (mCallbacksLock) {
- mCallbacks.remove(mUuid);
- if (releaseWakeLock) {
- mWakelock.release();
- }
- }
- }
- }
-
/**
* Counts the number of operations added in the last 24 hours.
*/
@@ -1165,27 +1008,6 @@ public class SoundTriggerService extends SystemService {
}
}
- private void grabWakeLock() {
- synchronized (mCallbacksLock) {
- if (mWakelock == null) {
- PowerManager pm = ((PowerManager) mContext.getSystemService(Context.POWER_SERVICE));
- mWakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
- }
- mWakelock.acquire();
- }
- }
-
- private PendingIntent.OnFinished mCallbackCompletedHandler = new PendingIntent.OnFinished() {
- @Override
- public void onSendFinished(PendingIntent pendingIntent, Intent intent, int resultCode,
- String resultData, Bundle resultExtras) {
- // We're only ever invoked when the callback is done, so release the lock.
- synchronized (mCallbacksLock) {
- mWakelock.release();
- }
- }
- };
-
public final class LocalSoundTriggerService extends SoundTriggerInternal {
private final Context mContext;
private SoundTriggerHelper mSoundTriggerHelper;
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 44f55511f940..c5d6dc7da5a7 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -19,6 +19,7 @@ package com.android.server.voiceinteraction;
import android.Manifest;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
+import com.android.server.wm.ActivityTaskManagerInternal;
import android.app.AppGlobals;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -88,6 +89,7 @@ public class VoiceInteractionManagerService extends SystemService {
final ContentResolver mResolver;
final DatabaseHelper mDbHelper;
final ActivityManagerInternal mAmInternal;
+ final ActivityTaskManagerInternal mAtmInternal;
final UserManager mUserManager;
final ArraySet<Integer> mLoadedKeyphraseIds = new ArraySet<>();
ShortcutServiceInternal mShortcutServiceInternal;
@@ -104,6 +106,8 @@ public class VoiceInteractionManagerService extends SystemService {
mServiceStub = new VoiceInteractionManagerServiceStub();
mAmInternal = Preconditions.checkNotNull(
LocalServices.getService(ActivityManagerInternal.class));
+ mAtmInternal = Preconditions.checkNotNull(
+ LocalServices.getService(ActivityTaskManagerInternal.class));
mUserManager = Preconditions.checkNotNull(
context.getSystemService(UserManager.class));
@@ -212,7 +216,7 @@ public class VoiceInteractionManagerService extends SystemService {
@Override
public void onShown() {
- mAmInternal.onLocalVoiceInteractionStarted(token,
+ mAtmInternal.onLocalVoiceInteractionStarted(token,
mImpl.mActiveSession.mSession,
mImpl.mActiveSession.mInteractor);
}
@@ -429,11 +433,11 @@ public class VoiceInteractionManagerService extends SystemService {
if (hasComponent) {
mShortcutServiceInternal.setShortcutHostPackage(TAG,
serviceComponent.getPackageName(), mCurUser);
- mAmInternal.setAllowAppSwitches(TAG,
+ mAtmInternal.setAllowAppSwitches(TAG,
serviceInfo.applicationInfo.uid, mCurUser);
} else {
mShortcutServiceInternal.setShortcutHostPackage(TAG, null, mCurUser);
- mAmInternal.setAllowAppSwitches(TAG, -1, mCurUser);
+ mAtmInternal.setAllowAppSwitches(TAG, -1, mCurUser);
}
}
@@ -1181,7 +1185,7 @@ public class VoiceInteractionManagerService extends SystemService {
private void setImplLocked(VoiceInteractionManagerServiceImpl impl) {
mImpl = impl;
- mAmInternal.notifyActiveVoiceInteractionServiceChanged(
+ mAtmInternal.notifyActiveVoiceInteractionServiceChanged(
getActiveServiceComponentName());
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
index 7541b92dbe2c..57e9f661a0b0 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java
@@ -23,10 +23,11 @@ import static android.app.ActivityManager.START_VOICE_NOT_ACTIVE_SESSION;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import android.app.ActivityManager;
-import android.app.ActivityManager.StackId;
-import android.app.ActivityManagerInternal;
import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
+import com.android.server.wm.ActivityTaskManagerInternal;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -48,7 +49,6 @@ import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.view.IWindowManager;
-import com.android.internal.app.IVoiceInteractionSessionListener;
import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import com.android.internal.app.IVoiceInteractor;
import com.android.server.LocalServices;
@@ -71,6 +71,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
final int mUser;
final ComponentName mComponent;
final IActivityManager mAm;
+ final IActivityTaskManager mAtm;
final VoiceInteractionServiceInfo mInfo;
final ComponentName mSessionComponentName;
final IWindowManager mIWindowManager;
@@ -126,6 +127,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
mUser = userHandle;
mComponent = service;
mAm = ActivityManager.getService();
+ mAtm = ActivityTaskManager.getService();
VoiceInteractionServiceInfo info;
try {
info = new VoiceInteractionServiceInfo(context.getPackageManager(), service, mUser);
@@ -168,7 +170,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
activityTokens.add(activityToken);
} else {
// Let's get top activities from all visible stacks
- activityTokens = LocalServices.getService(ActivityManagerInternal.class)
+ activityTokens = LocalServices.getService(ActivityTaskManagerInternal.class)
.getTopVisibleActivities();
}
return mActiveSession.showLocked(args, flags, mDisabledShowContext, showCallback,
@@ -206,7 +208,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
intent = new Intent(intent);
intent.addCategory(Intent.CATEGORY_VOICE);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
- return mAm.startVoiceActivity(mComponent.getPackageName(), callingPid, callingUid,
+ return mAtm.startVoiceActivity(mComponent.getPackageName(), callingPid, callingUid,
intent, resolvedType, mActiveSession.mSession, mActiveSession.mInteractor,
0, null, null, mUser);
} catch (RemoteException e) {
@@ -229,7 +231,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchActivityType(ACTIVITY_TYPE_ASSISTANT);
- return mAm.startAssistantActivity(mComponent.getPackageName(), callingPid, callingUid,
+ return mAtm.startAssistantActivity(mComponent.getPackageName(), callingPid, callingUid,
intent, resolvedType, options.toBundle(), mUser);
} catch (RemoteException e) {
throw new IllegalStateException("Unexpected remote error", e);
@@ -242,7 +244,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
Slog.w(TAG, "setKeepAwake does not match active session");
return;
}
- mAm.setVoiceKeepAwake(mActiveSession.mSession, keepAwake);
+ mAtm.setVoiceKeepAwake(mActiveSession.mSession, keepAwake);
} catch (RemoteException e) {
throw new IllegalStateException("Unexpected remote error", e);
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
index e0d9c7397748..01f5d9c11f3e 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
@@ -16,9 +16,9 @@
package com.android.server.voiceinteraction;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_CONTENT;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_DATA;
-import static android.app.ActivityManagerInternal.ASSIST_KEY_STRUCTURE;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_DATA;
+import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE;
import static android.app.AppOpsManager.OP_ASSIST_SCREENSHOT;
import static android.app.AppOpsManager.OP_ASSIST_STRUCTURE;
import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION;
@@ -27,6 +27,7 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.assist.AssistContent;
@@ -143,7 +144,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection,
mIWindowManager = IWindowManager.Stub.asInterface(
ServiceManager.getService(Context.WINDOW_SERVICE));
mAppOps = context.getSystemService(AppOpsManager.class);
- mAssistDataRequester = new AssistDataRequester(mContext, mAm, mIWindowManager,
+ mAssistDataRequester = new AssistDataRequester(mContext, mIWindowManager,
(AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE),
this, mLock, OP_ASSIST_STRUCTURE, OP_ASSIST_SCREENSHOT);
IBinder permOwner = null;
@@ -359,7 +360,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection,
}
if (mSession != null) {
try {
- mAm.finishVoiceTask(mSession);
+ ActivityTaskManager.getService().finishVoiceTask(mSession);
} catch (RemoteException e) {
}
}
@@ -387,7 +388,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection,
}
if (finishTask && mSession != null) {
try {
- mAm.finishVoiceTask(mSession);
+ ActivityTaskManager.getService().finishVoiceTask(mSession);
} catch (RemoteException e) {
}
}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 96d5af8ddd6a..a9618076a653 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -45,6 +45,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
+import java.nio.channels.Channels;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -894,6 +895,8 @@ public abstract class Connection extends Conferenceable {
private final OutputStreamWriter mPipeToInCall;
private final ParcelFileDescriptor mFdFromInCall;
private final ParcelFileDescriptor mFdToInCall;
+
+ private final FileInputStream mFromInCallFileInputStream;
private char[] mReadBuffer = new char[READ_BUFFER_SIZE];
/**
@@ -902,8 +905,11 @@ public abstract class Connection extends Conferenceable {
public RttTextStream(ParcelFileDescriptor toInCall, ParcelFileDescriptor fromInCall) {
mFdFromInCall = fromInCall;
mFdToInCall = toInCall;
+ mFromInCallFileInputStream = new FileInputStream(fromInCall.getFileDescriptor());
+
+ // Wrap the FileInputStream in a Channel so that it's interruptible.
mPipeFromInCall = new InputStreamReader(
- new FileInputStream(fromInCall.getFileDescriptor()));
+ Channels.newInputStream(Channels.newChannel(mFromInCallFileInputStream)));
mPipeToInCall = new OutputStreamWriter(
new FileOutputStream(toInCall.getFileDescriptor()));
}
@@ -951,7 +957,7 @@ public abstract class Connection extends Conferenceable {
* not entered any new text yet.
*/
public String readImmediately() throws IOException {
- if (mPipeFromInCall.ready()) {
+ if (mFromInCallFileInputStream.available() > 0) {
return read();
} else {
return null;
@@ -2855,9 +2861,21 @@ public abstract class Connection extends Conferenceable {
public void onReject(String replyMessage) {}
/**
- * Notifies the Connection of a request to silence the ringer.
- *
- * @hide
+ * Notifies this Connection of a request to silence the ringer.
+ * <p>
+ * The ringer may be silenced by any of the following methods:
+ * <ul>
+ * <li>{@link TelecomManager#silenceRinger()}</li>
+ * <li>The user presses the volume-down button while a call is ringing.</li>
+ * </ul>
+ * <p>
+ * Self-managed {@link ConnectionService} implementations should override this method in their
+ * {@link Connection} implementation and implement logic to silence their app's ringtone. If
+ * your app set the ringtone as part of the incoming call {@link Notification} (see
+ * {@link #onShowIncomingCallUi()}), it should re-post the notification now, except call
+ * {@link android.app.Notification.Builder#setOnlyAlertOnce(boolean)} with {@code true}. This
+ * will ensure the ringtone sound associated with your {@link android.app.NotificationChannel}
+ * stops playing.
*/
public void onSilence() {}
@@ -2934,7 +2952,29 @@ public abstract class Connection extends Conferenceable {
* <p>
* You should trigger the display of the incoming call user interface for your application by
* showing a {@link Notification} with a full-screen {@link Intent} specified.
- * For example:
+ *
+ * In your application code, you should create a {@link android.app.NotificationChannel} for
+ * incoming call notifications from your app:
+ * <pre><code>
+ * NotificationChannel channel = new NotificationChannel(YOUR_CHANNEL_ID, "Incoming Calls",
+ * NotificationManager.IMPORTANCE_MAX);
+ * // other channel setup stuff goes here.
+ *
+ * // We'll use the default system ringtone for our incoming call notification channel. You can
+ * // use your own audio resource here.
+ * Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+ * channel.setSound(ringtoneUri, new AudioAttributes.Builder()
+ * // Setting the AudioAttributes is important as it identifies the purpose of your
+ * // notification sound.
+ * .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
+ * .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ * .build());
+ *
+ * NotificationManager mgr = getSystemService(NotificationManager.class);
+ * mgr.createNotificationChannel(channel);
+ * </code></pre>
+ * When it comes time to post a notification for your incoming call, ensure it uses your
+ * incoming call {@link android.app.NotificationChannel}.
* <pre><code>
* // Create an intent which triggers your fullscreen incoming call user interface.
* Intent intent = new Intent(Intent.ACTION_MAIN, null);
@@ -2960,11 +3000,14 @@ public abstract class Connection extends Conferenceable {
* builder.setContentTitle("Your notification title");
* builder.setContentText("Your notification content.");
*
- * // Use builder.addAction(..) to add buttons to answer or reject the call.
+ * // Set notification as insistent to cause your ringtone to loop.
+ * Notification notification = builder.build();
+ * notification.flags |= Notification.FLAG_INSISTENT;
*
+ * // Use builder.addAction(..) to add buttons to answer or reject the call.
* NotificationManager notificationManager = mContext.getSystemService(
* NotificationManager.class);
- * notificationManager.notify(YOUR_TAG, YOUR_ID, builder.build());
+ * notificationManager.notify(YOUR_CHANNEL_ID, YOUR_TAG, YOUR_ID, notification);
* </code></pre>
*/
public void onShowIncomingCallUi() {}
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index 178ca68ce493..bc9c8473943b 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -1557,6 +1557,14 @@ public abstract class ConnectionService extends Service {
new DisconnectCause(DisconnectCause.ERROR, "IMPL_RETURNED_NULL_CONNECTION"));
}
+ boolean isSelfManaged =
+ (connection.getConnectionProperties() & Connection.PROPERTY_SELF_MANAGED)
+ == Connection.PROPERTY_SELF_MANAGED;
+ // Self-managed Connections should always use voip audio mode; we default here so that the
+ // local state within the ConnectionService matches the default we assume in Telecom.
+ if (isSelfManaged) {
+ connection.setAudioModeIsVoip(true);
+ }
connection.setTelecomCallId(callId);
if (connection.getState() != Connection.STATE_DISCONNECTED) {
addConnection(request.getAccountHandle(), callId, connection);
@@ -1596,9 +1604,7 @@ public abstract class ConnectionService extends Service {
createIdList(connection.getConferenceables()),
connection.getExtras()));
- if (isIncoming && request.shouldShowIncomingCallUi() &&
- (connection.getConnectionProperties() & Connection.PROPERTY_SELF_MANAGED) ==
- Connection.PROPERTY_SELF_MANAGED) {
+ if (isIncoming && request.shouldShowIncomingCallUi() && isSelfManaged) {
// Tell ConnectionService to show its incoming call UX.
connection.onShowIncomingCallUi();
}
@@ -2078,6 +2084,10 @@ public abstract class ConnectionService extends Service {
* Call to inform Telecom that your {@link ConnectionService} has released call resources (e.g
* microphone, camera).
*
+ * <p>
+ * The {@link ConnectionService} will be disconnected when it failed to call this method within
+ * 5 seconds after {@link #onConnectionServiceFocusLost()} is called.
+ *
* @see ConnectionService#onConnectionServiceFocusLost()
*/
public final void connectionServiceFocusReleased() {
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index bd25ab2b8eab..1aeeca73c0b9 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -47,13 +47,19 @@ import java.util.List;
* before the telecom service will bind to its {@code InCallService} implementation.
* <p>
* Below is an example manifest registration for an {@code InCallService}. The meta-data
- * ({@link TelecomManager#METADATA_IN_CALL_SERVICE_UI}) indicates that this particular
+ * {@link TelecomManager#METADATA_IN_CALL_SERVICE_UI} indicates that this particular
* {@code InCallService} implementation intends to replace the built-in in-call UI.
+ * The meta-data {@link TelecomManager#METADATA_IN_CALL_SERVICE_RINGING} indicates that this
+ * {@link InCallService} will play the ringtone for incoming calls. See
+ * <a href="#incomingCallNotification">below</a> for more information on showing the incoming call
+ * UI and playing the ringtone in your app.
* <pre>
* {@code
* <service android:name="your.package.YourInCallServiceImplementation"
* android:permission="android.permission.BIND_INCALL_SERVICE">
* <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
+ * <meta-data android:name="android.telecom.IN_CALL_SERVICE_RINGING"
+ * android:value="true" />
* <intent-filter>
* <action android:name="android.telecom.InCallService"/>
* </intent-filter>
@@ -80,6 +86,72 @@ import java.util.List;
* to see if they would like your application to be the new default phone app. See the
* {@link TelecomManager#ACTION_CHANGE_DEFAULT_DIALER} intent documentation for more information on
* how to do this.
+ * <p id="incomingCallNotification">
+ * <h2>Showing the Incoming Call Notification</h2>
+ * When your app receives a new incoming call via {@link InCallService#onCallAdded(Call)}, it is
+ * responsible for displaying an incoming call UI for the incoming call. It should do this using
+ * {@link android.app.NotificationManager} APIs to post a new incoming call notification.
+ * <p>
+ * Where your app declares the meta-data {@link TelecomManager#METADATA_IN_CALL_SERVICE_RINGING}, it
+ * is responsible for playing the ringtone for incoming calls. Your app should create a
+ * {@link android.app.NotificationChannel} which specifies the desired ringtone. For example:
+ * <pre><code>
+ * NotificationChannel channel = new NotificationChannel(YOUR_CHANNEL_ID, "Incoming Calls",
+ * NotificationManager.IMPORTANCE_MAX);
+ * // other channel setup stuff goes here.
+ *
+ * // We'll use the default system ringtone for our incoming call notification channel. You can
+ * // use your own audio resource here.
+ * Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+ * channel.setSound(ringtoneUri, new AudioAttributes.Builder()
+ * // Setting the AudioAttributes is important as it identifies the purpose of your
+ * // notification sound.
+ * .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
+ * .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ * .build());
+ *
+ * NotificationManager mgr = getSystemService(NotificationManager.class);
+ * mgr.createNotificationChannel(channel);
+ * </code></pre>
+ * <p>
+ * When your app receives a new incoming call, it creates a {@link android.app.Notification} for the
+ * incoming call and associates it with your incoming call notification channel. You can specify a
+ * {@link android.app.PendingIntent} on the notification which will launch your full screen
+ * incoming call UI. The notification manager framework will display your notification as a
+ * heads-up notification if the user is actively using the phone. When the user is not using the
+ * phone, your full-screen incoming call UI is used instead.
+ * For example:
+ * <pre><code>
+ * // Create an intent which triggers your fullscreen incoming call user interface.
+ * Intent intent = new Intent(Intent.ACTION_MAIN, null);
+ * intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
+ * intent.setClass(context, YourIncomingCallActivity.class);
+ * PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, 0);
+ *
+ * // Build the notification as an ongoing high priority item; this ensures it will show as
+ * // a heads up notification which slides down over top of the current content.
+ * final Notification.Builder builder = new Notification.Builder(context);
+ * builder.setOngoing(true);
+ * builder.setPriority(Notification.PRIORITY_HIGH);
+ *
+ * // Set notification content intent to take user to the fullscreen UI if user taps on the
+ * // notification body.
+ * builder.setContentIntent(pendingIntent);
+ * // Set full screen intent to trigger display of the fullscreen UI when the notification
+ * // manager deems it appropriate.
+ * builder.setFullScreenIntent(pendingIntent, true);
+ *
+ * // Setup notification content.
+ * builder.setSmallIcon( yourIconResourceId );
+ * builder.setContentTitle("Your notification title");
+ * builder.setContentText("Your notification content.");
+ *
+ * // Use builder.addAction(..) to add buttons to answer or reject the call.
+ *
+ * NotificationManager notificationManager = mContext.getSystemService(
+ * NotificationManager.class);
+ * notificationManager.notify(YOUR_CHANNEL_ID, YOUR_TAG, YOUR_ID, builder.build());
+ * </code></pre>
*/
public abstract class InCallService extends Service {
diff --git a/telecomm/java/android/telecom/Log.java b/telecomm/java/android/telecom/Log.java
index 83ca4702287d..0eb991777d74 100644
--- a/telecomm/java/android/telecom/Log.java
+++ b/telecomm/java/android/telecom/Log.java
@@ -46,6 +46,11 @@ public class Log {
private static final int EVENTS_TO_CACHE = 10;
private static final int EVENTS_TO_CACHE_DEBUG = 20;
+ /**
+ * When generating a bug report, include the last X dialable digits when logging phone numbers.
+ */
+ private static final int NUM_DIALABLE_DIGITS_TO_LOG = Build.IS_USER ? 0 : 2;
+
// Generic tag for all Telecom logging
@VisibleForTesting
public static String TAG = "TelecomFramework";
@@ -384,9 +389,15 @@ public class Log {
String textToObfuscate = uri.getSchemeSpecificPart();
if (PhoneAccount.SCHEME_TEL.equals(scheme)) {
+ int numDigitsToObfuscate = getDialableCount(textToObfuscate)
+ - NUM_DIALABLE_DIGITS_TO_LOG;
for (int i = 0; i < textToObfuscate.length(); i++) {
char c = textToObfuscate.charAt(i);
- sb.append(PhoneNumberUtils.isDialable(c) ? "*" : c);
+ boolean isDialable = PhoneNumberUtils.isDialable(c);
+ if (isDialable) {
+ numDigitsToObfuscate--;
+ }
+ sb.append(isDialable && numDigitsToObfuscate >= 0 ? "*" : c);
}
} else if (PhoneAccount.SCHEME_SIP.equals(scheme)) {
for (int i = 0; i < textToObfuscate.length(); i++) {
@@ -405,6 +416,21 @@ public class Log {
}
/**
+ * Determines the number of dialable characters in a string.
+ * @param toCount The string to count dialable characters in.
+ * @return The count of dialable characters.
+ */
+ private static int getDialableCount(String toCount) {
+ int numDialable = 0;
+ for (char c : toCount.toCharArray()) {
+ if (PhoneNumberUtils.isDialable(c)) {
+ numDialable++;
+ }
+ }
+ return numDialable;
+ }
+
+ /**
* Redact personally identifiable information for production users.
* If we are running in verbose mode, return the original string,
* and return "***" otherwise.
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index b3a3bf21cd8b..d25e59f11495 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -156,6 +156,18 @@ public final class PhoneAccount implements Parcelable {
"android.telecom.extra.PLAY_CALL_RECORDING_TONE";
/**
+ * Boolean {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()} which
+ * indicates whether calls for a {@link PhoneAccount} should skip call filtering.
+ * <p>
+ * If not specified, this will default to false; all calls will undergo call filtering unless
+ * specifically exempted (e.g. {@link Connection#PROPERTY_EMERGENCY_CALLBACK_MODE}.) However,
+ * this may be used to skip call filtering when it has already been performed on another device.
+ * @hide
+ */
+ public static final String EXTRA_SKIP_CALL_FILTERING =
+ "android.telecom.extra.SKIP_CALL_FILTERING";
+
+ /**
* Flag indicating that this {@code PhoneAccount} can act as a connection manager for
* other connections. The {@link ConnectionService} associated with this {@code PhoneAccount}
* will be allowed to manage phone calls including using its own proprietary phone-call
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index f9fec4537e11..c782a1d0cafd 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -1283,7 +1283,7 @@ public class TelecomManager {
* @hide
*/
@SystemApi
- public int getCallState() {
+ public @TelephonyManager.CallState int getCallState() {
try {
if (isServiceConnected()) {
return getTelecomService().getCallState();
diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java
index eb8e98e9b528..bec10e86d79a 100644
--- a/telephony/java/android/provider/Telephony.java
+++ b/telephony/java/android/provider/Telephony.java
@@ -25,8 +25,8 @@ import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
-import android.database.Cursor;
import android.database.ContentObserver;
+import android.database.Cursor;
import android.database.sqlite.SqliteWrapper;
import android.net.Uri;
import android.telephony.Rlog;
@@ -40,7 +40,6 @@ import android.util.Patterns;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.SmsApplication;
-
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
@@ -281,6 +280,70 @@ public final class Telephony {
}
/**
+ * Columns in sms_changes table.
+ * @hide
+ */
+ public interface TextBasedSmsChangesColumns {
+ /**
+ * The {@code content://} style URL for this table.
+ * @hide
+ */
+ public static final Uri CONTENT_URI = Uri.parse("content://sms-changes");
+
+ /**
+ * Primary key.
+ * <P>Type: INTEGER (long)</P>
+ * @hide
+ */
+ public static final String ID = "_id";
+
+ /**
+ * Triggers on sms table create a row in this table for each update/delete.
+ * This column is the "_id" of the row from sms table that was updated/deleted.
+ * <P>Type: INTEGER (long)</P>
+ * @hide
+ */
+ public static final String ORIG_ROW_ID = "orig_rowid";
+
+ /**
+ * Triggers on sms table create a row in this table for each update/delete.
+ * This column is the "sub_id" of the row from sms table that was updated/deleted.
+ * @hide
+ * <P>Type: INTEGER (long)</P>
+ */
+ public static final String SUB_ID = "sub_id";
+
+ /**
+ * The type of operation that created this row.
+ * {@link #TYPE_UPDATE} = update op
+ * {@link #TYPE_DELETE} = delete op
+ * @hide
+ * <P>Type: INTEGER (long)</P>
+ */
+ public static final String TYPE = "type";
+
+ /**
+ * One of the possible values for the above column "type". Indicates it is an update op.
+ * @hide
+ */
+ public static final int TYPE_UPDATE = 0;
+
+ /**
+ * One of the possible values for the above column "type". Indicates it is a delete op.
+ * @hide
+ */
+ public static final int TYPE_DELETE = 1;
+
+ /**
+ * This column contains a non-null value only if the operation on sms table is an update op
+ * and the column "read" is changed by the update op.
+ * <P>Type: INTEGER (boolean)</P>
+ * @hide
+ */
+ public static final String NEW_READ_STATUS = "new_read_status";
+ }
+
+ /**
* Contains all text-based SMS messages.
*/
public static final class Sms implements BaseColumns, TextBasedSmsColumns {
@@ -3423,7 +3486,6 @@ public final class Telephony {
/**
* Contains carrier identification information for the current subscriptions.
- * @see SubscriptionManager#getActiveSubscriptionIdList()
*/
public static final class CarrierId implements BaseColumns {
/**
@@ -3531,6 +3593,12 @@ public final class Telephony {
public static final String ICCID_PREFIX = "iccid_prefix";
/**
+ * Certificate for carrier privilege access rules.
+ * <P>Type: TEXT in hex string </P>
+ */
+ public static final String PRIVILEGE_ACCESS_RULE = "privilege_access_rule";
+
+ /**
* The {@code content://} URI for this table.
*/
public static final Uri CONTENT_URI = Uri.parse("content://carrier_id/all");
diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java
index 3b773b3a353d..cac9f2b51b73 100644
--- a/telephony/java/android/telephony/AccessNetworkConstants.java
+++ b/telephony/java/android/telephony/AccessNetworkConstants.java
@@ -16,6 +16,8 @@
package android.telephony;
+import android.annotation.SystemApi;
+
/**
* Contains access network related constants.
*/
@@ -37,6 +39,7 @@ public final class AccessNetworkConstants {
* Wireless transportation type
* @hide
*/
+ @SystemApi
public static final class TransportType {
/** Wireless Wide Area Networks (i.e. Cellular) */
public static final int WWAN = 1;
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index fc3616954b60..cc9f1056b129 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -51,10 +51,13 @@ public class CarrierConfigManager {
public static final String EXTRA_SUBSCRIPTION_INDEX =
SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX;
+ private final Context mContext;
+
/**
* @hide
*/
- public CarrierConfigManager() {
+ public CarrierConfigManager(Context context) {
+ mContext = context;
}
/**
@@ -77,6 +80,30 @@ public class CarrierConfigManager {
public static final String
KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool";
+ /**
+ * Boolean indicating if the "Call forwarding" item is visible in the Call Settings menu.
+ * true means visible. false means gone.
+ * @hide
+ */
+ public static final String KEY_CALL_FORWARDING_VISIBILITY_BOOL =
+ "call_forwarding_visibility_bool";
+
+ /**
+ * Boolean indicating if the "Caller ID" item is visible in the Additional Settings menu.
+ * true means visible. false means gone.
+ * @hide
+ */
+ public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL =
+ "additional_settings_caller_id_visibility_bool";
+
+ /**
+ * Boolean indicating if the "Call Waiting" item is visible in the Additional Settings menu.
+ * true means visible. false means gone.
+ * @hide
+ */
+ public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL =
+ "additional_settings_call_waiting_visibility_bool";
+
/**
* Boolean indicating if the "Call barring" item is visible in the Call Settings menu.
* true means visible. false means gone.
@@ -114,6 +141,14 @@ public class CarrierConfigManager {
KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool";
/**
+ * Flag indicating whether or not sending emergency SMS messages over IMS
+ * is supported when in LTE/limited LTE (Emergency only) service mode..
+ *
+ */
+ public static final String
+ KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL = "support_emergency_sms_over_ims_bool";
+
+ /**
* Indicates if carrier supports emergency sms.
* @hide
*/
@@ -1046,6 +1081,26 @@ public class CarrierConfigManager {
public static final String KEY_CARRIER_NAME_STRING = "carrier_name_string";
/**
+ * Override the registered PLMN name using #KEY_CDMA_HOME_REGISTERED_PLMN_NAME_STRING.
+ *
+ * If true, then the registered PLMN name (only for CDMA/CDMA-LTE and only when not roaming)
+ * will be #KEY_CDMA_HOME_REGISTERED_PLMN_NAME_STRING. If false, or if phone type is not
+ * CDMA/CDMA-LTE or if roaming, then #KEY_CDMA_HOME_REGISTERED_PLMN_NAME_STRING will be ignored.
+ * @hide
+ */
+ public static final String KEY_CDMA_HOME_REGISTERED_PLMN_NAME_OVERRIDE_BOOL =
+ "cdma_home_registered_plmn_name_override_bool";
+
+ /**
+ * String to identify registered PLMN name in CarrierConfig app. This string overrides
+ * registered PLMN name if #KEY_CDMA_HOME_REGISTERED_PLMN_NAME_OVERRIDE_BOOL is true, phone type
+ * is CDMA/CDMA-LTE and device is not in roaming state; otherwise, it will be ignored.
+ * @hide
+ */
+ public static final String KEY_CDMA_HOME_REGISTERED_PLMN_NAME_STRING =
+ "cdma_home_registered_plmn_name_string";
+
+ /**
* If this is true, the SIM card (through Customer Service Profile EF file) will be able to
* prevent manual operator selection. If false, this SIM setting will be ignored and manual
* operator selection will always be available. See CPHS4_2.WW6, CPHS B.4.7.1 for more
@@ -1573,7 +1628,7 @@ public class CarrierConfigManager {
public static final String KEY_EDITABLE_WFC_ROAMING_MODE_BOOL =
"editable_wfc_roaming_mode_bool";
- /**
+ /**
* Determine whether current lpp_mode used for E-911 needs to be kept persistently.
* {@code false} - not keeping the lpp_mode means using default configuration of gps.conf
* when sim is not presented.
@@ -2044,6 +2099,9 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONED_BOOL, false);
sDefaults.putBoolean(KEY_CALL_BARRING_VISIBILITY_BOOL, true);
+ sDefaults.putBoolean(KEY_CALL_FORWARDING_VISIBILITY_BOOL, true);
+ sDefaults.putBoolean(KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL, true);
+ sDefaults.putBoolean(KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL, true);
sDefaults.putBoolean(KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL, false);
sDefaults.putBoolean(KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL, false);
sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true);
@@ -2051,6 +2109,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, false);
sDefaults.putBoolean(KEY_SHOW_CDMA_CHOICES_BOOL, false);
sDefaults.putBoolean(KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL, false);
+ sDefaults.putBoolean(KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL, false);
sDefaults.putBoolean(KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL, true);
sDefaults.putBoolean(KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL, true);
sDefaults.putBoolean(KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL, false);
@@ -2159,6 +2218,8 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_CONFIG_WIFI_DISABLE_IN_ECBM, false);
sDefaults.putBoolean(KEY_CARRIER_NAME_OVERRIDE_BOOL, false);
sDefaults.putString(KEY_CARRIER_NAME_STRING, "");
+ 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.putBoolean(KEY_CARRIER_DEFAULT_DATA_ROAMING_ENABLED_BOOL, false);
sDefaults.putBoolean(KEY_SKIP_CF_FAIL_TO_DISABLE_DIALOG_BOOL, false);
@@ -2336,7 +2397,7 @@ public class CarrierConfigManager {
+ " ICarrierConfigLoader is null");
return null;
}
- return loader.getConfigForSubId(subId);
+ return loader.getConfigForSubId(subId, mContext.getOpPackageName());
} catch (RemoteException ex) {
Rlog.e(TAG, "Error getting config for subId " + subId + ": "
+ ex.toString());
diff --git a/telephony/java/android/telephony/CellIdentity.java b/telephony/java/android/telephony/CellIdentity.java
index 890a6ea7c88e..2a41829dcc2f 100644
--- a/telephony/java/android/telephony/CellIdentity.java
+++ b/telephony/java/android/telephony/CellIdentity.java
@@ -175,7 +175,10 @@ public abstract class CellIdentity implements Parcelable {
}
CellIdentity o = (CellIdentity) other;
- return TextUtils.equals(mAlphaLong, o.mAlphaLong)
+ return mType == o.mType
+ && TextUtils.equals(mMccStr, o.mMccStr)
+ && TextUtils.equals(mMncStr, o.mMncStr)
+ && TextUtils.equals(mAlphaLong, o.mAlphaLong)
&& TextUtils.equals(mAlphaShort, o.mAlphaShort);
}
@@ -233,4 +236,4 @@ public abstract class CellIdentity implements Parcelable {
protected void log(String s) {
Rlog.w(mTag, s);
}
-} \ No newline at end of file
+}
diff --git a/telephony/java/android/telephony/CellIdentityTdscdma.java b/telephony/java/android/telephony/CellIdentityTdscdma.java
index 18ab6d4d2bd6..b99fe466ec46 100644
--- a/telephony/java/android/telephony/CellIdentityTdscdma.java
+++ b/telephony/java/android/telephony/CellIdentityTdscdma.java
@@ -16,9 +16,7 @@
package android.telephony;
-import android.annotation.Nullable;
import android.os.Parcel;
-import android.text.TextUtils;
import java.util.Objects;
@@ -35,6 +33,8 @@ public final class CellIdentityTdscdma extends CellIdentity {
private final int mCid;
// 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown.
private final int mCpid;
+ // 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.3
+ private final int mUarfcn;
/**
* @hide
@@ -44,6 +44,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mCpid = Integer.MAX_VALUE;
+ mUarfcn = Integer.MAX_VALUE;
}
/**
@@ -52,28 +53,12 @@ public final class CellIdentityTdscdma extends CellIdentity {
* @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
* @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
* @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
+ * @param uarfcn 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.3
*
* @hide
*/
- public CellIdentityTdscdma(int mcc, int mnc, int lac, int cid, int cpid) {
- this(String.valueOf(mcc), String.valueOf(mnc), lac, cid, cpid, null, null);
- }
-
- /**
- * @param mcc 3-digit Mobile Country Code in string format
- * @param mnc 2 or 3-digit Mobile Network Code in string format
- * @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
- * @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
- * @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
- *
- * FIXME: This is a temporary constructor to facilitate migration.
- * @hide
- */
- public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid) {
- super(TAG, TYPE_TDSCDMA, mcc, mnc, null, null);
- mLac = lac;
- mCid = cid;
- mCpid = cpid;
+ public CellIdentityTdscdma(int mcc, int mnc, int lac, int cid, int cpid, int uarfcn) {
+ this(String.valueOf(mcc), String.valueOf(mnc), lac, cid, cpid, uarfcn, null, null);
}
/**
@@ -82,22 +67,24 @@ public final class CellIdentityTdscdma extends CellIdentity {
* @param lac 16-bit Location Area Code, 0..65535, INT_MAX if unknown
* @param cid 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown
* @param cpid 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown
+ * @param uarfcn 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.3
* @param alphal long alpha Operator Name String or Enhanced Operator Name String
* @param alphas short alpha Operator Name String or Enhanced Operator Name String
*
* @hide
*/
- public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid,
+ public CellIdentityTdscdma(String mcc, String mnc, int lac, int cid, int cpid, int uarfcn,
String alphal, String alphas) {
super(TAG, TYPE_TDSCDMA, mcc, mnc, alphal, alphas);
mLac = lac;
mCid = cid;
mCpid = cpid;
+ mUarfcn = uarfcn;
}
private CellIdentityTdscdma(CellIdentityTdscdma cid) {
this(cid.mMccStr, cid.mMncStr, cid.mLac, cid.mCid,
- cid.mCpid, cid.mAlphaLong, cid.mAlphaShort);
+ cid.mCpid, cid.mUarfcn, cid.mAlphaLong, cid.mAlphaShort);
}
CellIdentityTdscdma copy() {
@@ -141,9 +128,10 @@ public final class CellIdentityTdscdma extends CellIdentity {
return mCpid;
}
+ /** @hide */
@Override
- public int hashCode() {
- return Objects.hash(mLac, mCid, mCpid, super.hashCode());
+ public int getChannelNumber() {
+ return mUarfcn;
}
@Override
@@ -157,24 +145,29 @@ public final class CellIdentityTdscdma extends CellIdentity {
}
CellIdentityTdscdma o = (CellIdentityTdscdma) other;
- return TextUtils.equals(mMccStr, o.mMccStr)
- && TextUtils.equals(mMncStr, o.mMncStr)
- && mLac == o.mLac
+ return mLac == o.mLac
&& mCid == o.mCid
&& mCpid == o.mCpid
+ && mUarfcn == o.mUarfcn
&& super.equals(other);
}
@Override
+ public int hashCode() {
+ return Objects.hash(mLac, mCid, mCpid, mUarfcn, super.hashCode());
+ }
+
+ @Override
public String toString() {
return new StringBuilder(TAG)
.append(":{ mMcc=").append(mMccStr)
.append(" mMnc=").append(mMncStr)
+ .append(" mAlphaLong=").append(mAlphaLong)
+ .append(" mAlphaShort=").append(mAlphaShort)
.append(" mLac=").append(mLac)
.append(" mCid=").append(mCid)
.append(" mCpid=").append(mCpid)
- .append(" mAlphaLong=").append(mAlphaLong)
- .append(" mAlphaShort=").append(mAlphaShort)
+ .append(" mUarfcn=").append(mUarfcn)
.append("}").toString();
}
@@ -186,6 +179,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
dest.writeInt(mLac);
dest.writeInt(mCid);
dest.writeInt(mCpid);
+ dest.writeInt(mUarfcn);
}
/** Construct from Parcel, type has already been processed */
@@ -194,7 +188,7 @@ public final class CellIdentityTdscdma extends CellIdentity {
mLac = in.readInt();
mCid = in.readInt();
mCpid = in.readInt();
-
+ mUarfcn = in.readInt();
if (DBG) log(toString());
}
diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java
index 984483edd8da..43f9406be79e 100644
--- a/telephony/java/android/telephony/CellIdentityWcdma.java
+++ b/telephony/java/android/telephony/CellIdentityWcdma.java
@@ -35,7 +35,7 @@ public final class CellIdentityWcdma extends CellIdentity {
private final int mCid;
// 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511
private final int mPsc;
- // 16-bit UMTS Absolute RF Channel Number
+ // 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.4
private final int mUarfcn;
/**
@@ -70,7 +70,7 @@ public final class CellIdentityWcdma extends CellIdentity {
* @param lac 16-bit Location Area Code, 0..65535
* @param cid 28-bit UMTS Cell Identity
* @param psc 9-bit UMTS Primary Scrambling Code
- * @param uarfcn 16-bit UMTS Absolute RF Channel Number
+ * @param uarfcn 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.3
*
* @hide
*/
@@ -83,7 +83,7 @@ public final class CellIdentityWcdma extends CellIdentity {
* @param lac 16-bit Location Area Code, 0..65535
* @param cid 28-bit UMTS Cell Identity
* @param psc 9-bit UMTS Primary Scrambling Code
- * @param uarfcn 16-bit UMTS Absolute RF Channel Number
+ * @param uarfcn 16-bit UMTS Absolute RF Channel Number described in TS 25.101 sec. 5.4.3
* @param mccStr 3-digit Mobile Country Code in string format
* @param mncStr 2 or 3-digit Mobile Network Code in string format
* @param alphal long alpha Operator Name String or Enhanced Operator Name String
diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java
index 9232ed7167cc..3aab3fc9e199 100644
--- a/telephony/java/android/telephony/CellInfo.java
+++ b/telephony/java/android/telephony/CellInfo.java
@@ -19,6 +19,7 @@ package android.telephony;
import android.annotation.IntDef;
import android.os.Parcel;
import android.os.Parcelable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -36,6 +37,8 @@ public abstract class CellInfo implements Parcelable {
protected static final int TYPE_LTE = 3;
/** @hide */
protected static final int TYPE_WCDMA = 4;
+ /** @hide */
+ protected static final int TYPE_TDCDMA = 5;
// Type to distinguish where time stamp gets recorded.
@@ -260,6 +263,7 @@ public abstract class CellInfo implements Parcelable {
case TYPE_CDMA: return CellInfoCdma.createFromParcelBody(in);
case TYPE_LTE: return CellInfoLte.createFromParcelBody(in);
case TYPE_WCDMA: return CellInfoWcdma.createFromParcelBody(in);
+ case TYPE_TDCDMA: return CellInfoTdscdma.createFromParcelBody(in);
default: throw new RuntimeException("Bad CellInfo Parcel");
}
}
diff --git a/telephony/java/android/telephony/CellInfoCdma.java b/telephony/java/android/telephony/CellInfoCdma.java
index 6f2f1f677859..6403bc5a16a1 100644
--- a/telephony/java/android/telephony/CellInfoCdma.java
+++ b/telephony/java/android/telephony/CellInfoCdma.java
@@ -21,7 +21,7 @@ import android.os.Parcelable;
import android.telephony.Rlog;
/**
- * Immutable cell information from a point in time.
+ * A {@link CellInfo} representing a CDMA cell that provides identity and measurement info.
*/
public final class CellInfoCdma extends CellInfo implements Parcelable {
diff --git a/telephony/java/android/telephony/CellInfoGsm.java b/telephony/java/android/telephony/CellInfoGsm.java
index 1bedddb6b794..a3a9b315241e 100644
--- a/telephony/java/android/telephony/CellInfoGsm.java
+++ b/telephony/java/android/telephony/CellInfoGsm.java
@@ -21,7 +21,7 @@ import android.os.Parcelable;
import android.telephony.Rlog;
/**
- * Immutable cell information from a point in time.
+ * A {@link CellInfo} representing a GSM cell that provides identity and measurement info.
*/
public final class CellInfoGsm extends CellInfo implements Parcelable {
diff --git a/telephony/java/android/telephony/CellInfoLte.java b/telephony/java/android/telephony/CellInfoLte.java
index 287c9f044a07..b892e89a8517 100644
--- a/telephony/java/android/telephony/CellInfoLte.java
+++ b/telephony/java/android/telephony/CellInfoLte.java
@@ -21,7 +21,7 @@ import android.os.Parcelable;
import android.telephony.Rlog;
/**
- * Immutable cell information from a point in time.
+ * A {@link CellInfo} representing an LTE cell that provides identity and measurement info.
*/
public final class CellInfoLte extends CellInfo implements Parcelable {
diff --git a/telephony/java/android/telephony/CellInfoTdscdma.java b/telephony/java/android/telephony/CellInfoTdscdma.java
new file mode 100644
index 000000000000..7084c51f1b8a
--- /dev/null
+++ b/telephony/java/android/telephony/CellInfoTdscdma.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * A {@link CellInfo} representing a TD-SCDMA cell that provides identity and measurement info.
+ *
+ * @hide
+ */
+public final class CellInfoTdscdma extends CellInfo implements Parcelable {
+
+ private static final String LOG_TAG = "CellInfoTdscdma";
+ private static final boolean DBG = false;
+
+ private CellIdentityTdscdma mCellIdentityTdscdma;
+ private CellSignalStrengthTdscdma mCellSignalStrengthTdscdma;
+
+ /** @hide */
+ public CellInfoTdscdma() {
+ super();
+ mCellIdentityTdscdma = new CellIdentityTdscdma();
+ mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma();
+ }
+
+ /** @hide */
+ public CellInfoTdscdma(CellInfoTdscdma ci) {
+ super(ci);
+ this.mCellIdentityTdscdma = ci.mCellIdentityTdscdma.copy();
+ this.mCellSignalStrengthTdscdma = ci.mCellSignalStrengthTdscdma.copy();
+ }
+
+ public CellIdentityTdscdma getCellIdentity() {
+ return mCellIdentityTdscdma;
+ }
+ /** @hide */
+ public void setCellIdentity(CellIdentityTdscdma cid) {
+ mCellIdentityTdscdma = cid;
+ }
+
+ public CellSignalStrengthTdscdma getCellSignalStrength() {
+ return mCellSignalStrengthTdscdma;
+ }
+ /** @hide */
+ public void setCellSignalStrength(CellSignalStrengthTdscdma css) {
+ mCellSignalStrengthTdscdma = css;
+ }
+
+ /**
+ * @return hash code
+ */
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mCellIdentityTdscdma, mCellSignalStrengthTdscdma);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!super.equals(other)) {
+ return false;
+ }
+ try {
+ CellInfoTdscdma o = (CellInfoTdscdma) other;
+ return mCellIdentityTdscdma.equals(o.mCellIdentityTdscdma)
+ && mCellSignalStrengthTdscdma.equals(o.mCellSignalStrengthTdscdma);
+ } catch (ClassCastException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+
+ sb.append("CellInfoTdscdma:{");
+ sb.append(super.toString());
+ sb.append(" ").append(mCellIdentityTdscdma);
+ sb.append(" ").append(mCellSignalStrengthTdscdma);
+ sb.append("}");
+
+ return sb.toString();
+ }
+
+ /** Implement the Parcelable interface */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags, TYPE_TDCDMA);
+ mCellIdentityTdscdma.writeToParcel(dest, flags);
+ mCellSignalStrengthTdscdma.writeToParcel(dest, flags);
+ }
+
+ /**
+ * Construct a CellInfoTdscdma object from the given parcel
+ * where the token is already been processed.
+ */
+ private CellInfoTdscdma(Parcel in) {
+ super(in);
+ mCellIdentityTdscdma = CellIdentityTdscdma.CREATOR.createFromParcel(in);
+ mCellSignalStrengthTdscdma = CellSignalStrengthTdscdma.CREATOR.createFromParcel(in);
+ }
+
+ /** Implement the Parcelable interface */
+ public static final Creator<CellInfoTdscdma> CREATOR = new Creator<CellInfoTdscdma>() {
+ @Override
+ public CellInfoTdscdma createFromParcel(Parcel in) {
+ in.readInt(); // Skip past token, we know what it is
+ return createFromParcelBody(in);
+ }
+
+ @Override
+ public CellInfoTdscdma[] newArray(int size) {
+ return new CellInfoTdscdma[size];
+ }
+ };
+
+ /** @hide */
+ protected static CellInfoTdscdma createFromParcelBody(Parcel in) {
+ return new CellInfoTdscdma(in);
+ }
+
+ /**
+ * log
+ */
+ private static void log(String s) {
+ Rlog.w(LOG_TAG, s);
+ }
+}
diff --git a/telephony/java/android/telephony/CellInfoWcdma.java b/telephony/java/android/telephony/CellInfoWcdma.java
index 06157022de34..005f3d341ec1 100644
--- a/telephony/java/android/telephony/CellInfoWcdma.java
+++ b/telephony/java/android/telephony/CellInfoWcdma.java
@@ -20,8 +20,10 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.Rlog;
+import java.util.Objects;
+
/**
- * Immutable cell information from a point in time.
+ * A {@link CellInfo} representing a WCDMA cell that provides identity and measurement info.
*/
public final class CellInfoWcdma extends CellInfo implements Parcelable {
@@ -66,7 +68,7 @@ public final class CellInfoWcdma extends CellInfo implements Parcelable {
*/
@Override
public int hashCode() {
- return super.hashCode() + mCellIdentityWcdma.hashCode() + mCellSignalStrengthWcdma.hashCode();
+ return Objects.hash(super.hashCode(), mCellIdentityWcdma, mCellSignalStrengthWcdma);
}
@Override
diff --git a/telephony/java/android/telephony/CellSignalStrength.java b/telephony/java/android/telephony/CellSignalStrength.java
index 2a3ef2197706..6090d5c7b555 100644
--- a/telephony/java/android/telephony/CellSignalStrength.java
+++ b/telephony/java/android/telephony/CellSignalStrength.java
@@ -49,11 +49,11 @@ public abstract class CellSignalStrength {
/**
* Get signal level as an int from 0..4
* <p>
- * @see SIGNAL_STRENGTH_NONE_OR_UNKNOWN
- * @see SIGNAL_STRENGTH_POOR
- * @see SIGNAL_STRENGTH_MODERATE
- * @see SIGNAL_STRENGTH_GOOD
- * @see SIGNAL_STRENGTH_GREAT
+ * @see #SIGNAL_STRENGTH_NONE_OR_UNKNOWN
+ * @see #SIGNAL_STRENGTH_POOR
+ * @see #SIGNAL_STRENGTH_MODERATE
+ * @see #SIGNAL_STRENGTH_GOOD
+ * @see #SIGNAL_STRENGTH_GREAT
*/
public abstract int getLevel();
diff --git a/telephony/java/android/telephony/CellSignalStrengthCdma.java b/telephony/java/android/telephony/CellSignalStrengthCdma.java
index 183f96ddab0b..aa6b207d2f31 100644
--- a/telephony/java/android/telephony/CellSignalStrengthCdma.java
+++ b/telephony/java/android/telephony/CellSignalStrengthCdma.java
@@ -104,7 +104,10 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements
}
/**
- * Get signal level as an int from 0..4
+ * Retrieve an abstract level value for the overall signal strength.
+ *
+ * @return a single integer from 0 to 4 representing the general signal quality.
+ * 0 represents very poor signal strength while 4 represents a very strong signal strength.
*/
@Override
public int getLevel() {
diff --git a/telephony/java/android/telephony/CellSignalStrengthGsm.java b/telephony/java/android/telephony/CellSignalStrengthGsm.java
index 8687cd1c454b..cff159b991c0 100644
--- a/telephony/java/android/telephony/CellSignalStrengthGsm.java
+++ b/telephony/java/android/telephony/CellSignalStrengthGsm.java
@@ -82,7 +82,10 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P
}
/**
- * Get signal level as an int from 0..4
+ * Retrieve an abstract level value for the overall signal strength.
+ *
+ * @return a single integer from 0 to 4 representing the general signal quality.
+ * 0 represents very poor signal strength while 4 represents a very strong signal strength.
*/
@Override
public int getLevel() {
diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java
index 7e86966e2c1b..2f059f412b64 100644
--- a/telephony/java/android/telephony/CellSignalStrengthLte.java
+++ b/telephony/java/android/telephony/CellSignalStrengthLte.java
@@ -86,7 +86,10 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
}
/**
- * Get signal level as an int from 0..4
+ * Retrieve an abstract level value for the overall signal strength.
+ *
+ * @return a single integer from 0 to 4 representing the general signal quality.
+ * 0 represents very poor signal strength while 4 represents a very strong signal strength.
*/
@Override
public int getLevel() {
@@ -121,6 +124,8 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/**
* Get reference signal received quality
+ *
+ * @return the RSRQ if available or Integer.MAX_VALUE if unavailable.
*/
public int getRsrq() {
return mRsrq;
@@ -128,13 +133,17 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/**
* Get reference signal signal-to-noise ratio
+ *
+ * @return the RSSNR if available or Integer.MAX_VALUE if unavailable.
*/
public int getRssnr() {
return mRssnr;
}
/**
- * Get reference signal received power
+ * Get reference signal received power in dBm
+ *
+ * @return the RSRP of the measured cell.
*/
public int getRsrp() {
return mRsrp;
@@ -142,13 +151,17 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/**
* Get channel quality indicator
+ *
+ * @return the CQI if available or Integer.MAX_VALUE if unavailable.
*/
public int getCqi() {
return mCqi;
}
/**
- * Get signal strength as dBm
+ * Get signal strength in dBm
+ *
+ * @return the RSRP of the measured cell.
*/
@Override
public int getDbm() {
@@ -175,7 +188,8 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
* Get the timing advance value for LTE, as a value in range of 0..1282.
* Integer.MAX_VALUE is reported when there is no active RRC
* connection. Refer to 3GPP 36.213 Sec 4.2.3
- * @return the LTE timing advance, if available.
+ *
+ * @return the LTE timing advance if available or Integer.MAX_VALUE if unavailable.
*/
public int getTimingAdvance() {
return mTimingAdvance;
diff --git a/telephony/java/android/telephony/CellSignalStrengthTdscdma.java b/telephony/java/android/telephony/CellSignalStrengthTdscdma.java
new file mode 100644
index 000000000000..41859a3e96d9
--- /dev/null
+++ b/telephony/java/android/telephony/CellSignalStrengthTdscdma.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * Tdscdma signal strength related information.
+ *
+ * @hide
+ */
+public final class CellSignalStrengthTdscdma extends CellSignalStrength implements Parcelable {
+
+ private static final String LOG_TAG = "CellSignalStrengthTdscdma";
+ private static final boolean DBG = false;
+
+ private static final int TDSCDMA_SIGNAL_STRENGTH_GREAT = 12;
+ private static final int TDSCDMA_SIGNAL_STRENGTH_GOOD = 8;
+ private static final int TDSCDMA_SIGNAL_STRENGTH_MODERATE = 5;
+
+ private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5
+ // or Integer.MAX_VALUE if unknown
+ private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 or
+ // Integer.MAX_VALUE if unknown
+ private int mRscp; // Pilot power (0-96, 255) as defined in TS 27.007 8.69 or Integer.MAX_VALUE
+ // if unknown
+
+ /** @hide */
+ public CellSignalStrengthTdscdma() {
+ setDefaultValues();
+ }
+
+ /** @hide */
+ public CellSignalStrengthTdscdma(int ss, int ber, int rscp) {
+ mSignalStrength = ss;
+ mBitErrorRate = ber;
+ mRscp = rscp;
+ }
+
+ /** @hide */
+ public CellSignalStrengthTdscdma(CellSignalStrengthTdscdma s) {
+ copyFrom(s);
+ }
+
+ /** @hide */
+ protected void copyFrom(CellSignalStrengthTdscdma s) {
+ mSignalStrength = s.mSignalStrength;
+ mBitErrorRate = s.mBitErrorRate;
+ mRscp = s.mRscp;
+ }
+
+ /** @hide */
+ @Override
+ public CellSignalStrengthTdscdma copy() {
+ return new CellSignalStrengthTdscdma(this);
+ }
+
+ /** @hide */
+ @Override
+ public void setDefaultValues() {
+ mSignalStrength = Integer.MAX_VALUE;
+ mBitErrorRate = Integer.MAX_VALUE;
+ mRscp = Integer.MAX_VALUE;
+ }
+
+ /**
+ * Retrieve an abstract level value for the overall signal strength.
+ *
+ * @return a single integer from 0 to 4 representing the general signal quality.
+ * 0 represents very poor signal strength while 4 represents a very strong signal strength.
+ */
+ @Override
+ public int getLevel() {
+ int level;
+
+ // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
+ // asu = 0 (-113dB or less) is very weak
+ // signal, its better to show 0 bars to the user in such cases.
+ // asu = 99 is a special case, where the signal strength is unknown.
+ int asu = mSignalStrength;
+ if (asu <= 2 || asu == 99) {
+ level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ } else if (asu >= TDSCDMA_SIGNAL_STRENGTH_GREAT) {
+ level = SIGNAL_STRENGTH_GREAT;
+ } else if (asu >= TDSCDMA_SIGNAL_STRENGTH_GOOD) {
+ level = SIGNAL_STRENGTH_GOOD;
+ } else if (asu >= TDSCDMA_SIGNAL_STRENGTH_MODERATE) {
+ level = SIGNAL_STRENGTH_MODERATE;
+ } else {
+ level = SIGNAL_STRENGTH_POOR;
+ }
+ if (DBG) log("getLevel=" + level);
+ return level;
+ }
+
+ /**
+ * Get the signal strength as dBm
+ */
+ @Override
+ public int getDbm() {
+ int dBm;
+
+ int level = mSignalStrength;
+ int asu = (level == 99 ? Integer.MAX_VALUE : level);
+ if (asu != Integer.MAX_VALUE) {
+ dBm = -113 + (2 * asu);
+ } else {
+ dBm = Integer.MAX_VALUE;
+ }
+ if (DBG) log("getDbm=" + dBm);
+ return dBm;
+ }
+
+ /**
+ * Get the signal level as an asu value between 0..31, 99 is unknown
+ * Asu is calculated based on 3GPP RSRP. Refer to 3GPP 27.007 (Ver 10.3.0) Sec 8.69
+ */
+ @Override
+ public int getAsuLevel() {
+ // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
+ // asu = 0 (-113dB or less) is very weak
+ // signal, its better to show 0 bars to the user in such cases.
+ // asu = 99 is a special case, where the signal strength is unknown.
+ int level = mSignalStrength;
+ if (DBG) log("getAsuLevel=" + level);
+ return level;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mSignalStrength, mBitErrorRate);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ CellSignalStrengthTdscdma s;
+
+ try {
+ s = (CellSignalStrengthTdscdma) o;
+ } catch (ClassCastException ex) {
+ return false;
+ }
+
+ if (o == null) {
+ return false;
+ }
+
+ return mSignalStrength == s.mSignalStrength
+ && mBitErrorRate == s.mBitErrorRate
+ && mRscp == s.mRscp;
+ }
+
+ /**
+ * @return string representation.
+ */
+ @Override
+ public String toString() {
+ return "CellSignalStrengthTdscdma:"
+ + " ss=" + mSignalStrength
+ + " ber=" + mBitErrorRate
+ + " rscp=" + mRscp;
+ }
+
+ /** Implement the Parcelable interface */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ if (DBG) log("writeToParcel(Parcel, int): " + toString());
+ dest.writeInt(mSignalStrength);
+ dest.writeInt(mBitErrorRate);
+ dest.writeInt(mRscp);
+ }
+
+ /**
+ * Construct a SignalStrength object from the given parcel
+ * where the token is already been processed.
+ */
+ private CellSignalStrengthTdscdma(Parcel in) {
+ mSignalStrength = in.readInt();
+ mBitErrorRate = in.readInt();
+ mRscp = in.readInt();
+ if (DBG) log("CellSignalStrengthTdscdma(Parcel): " + toString());
+ }
+
+ /** Implement the Parcelable interface */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface */
+ @SuppressWarnings("hiding")
+ public static final Parcelable.Creator<CellSignalStrengthTdscdma> CREATOR =
+ new Parcelable.Creator<CellSignalStrengthTdscdma>() {
+ @Override
+ public CellSignalStrengthTdscdma createFromParcel(Parcel in) {
+ return new CellSignalStrengthTdscdma(in);
+ }
+
+ @Override
+ public CellSignalStrengthTdscdma[] newArray(int size) {
+ return new CellSignalStrengthTdscdma[size];
+ }
+ };
+
+ /**
+ * log
+ */
+ private static void log(String s) {
+ Rlog.w(LOG_TAG, s);
+ }
+}
diff --git a/telephony/java/android/telephony/CellSignalStrengthWcdma.java b/telephony/java/android/telephony/CellSignalStrengthWcdma.java
index dd32a960db91..21cf0be96931 100644
--- a/telephony/java/android/telephony/CellSignalStrengthWcdma.java
+++ b/telephony/java/android/telephony/CellSignalStrengthWcdma.java
@@ -35,7 +35,13 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
private static final int WCDMA_SIGNAL_STRENGTH_MODERATE = 5;
private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5
- private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5
+ // or Integer.MAX_VALUE if unknown
+ private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 or
+ // Integer.MAX_VALUE if unknown
+ private int mRscp; // bit error rate (0-96, 255) as defined in TS 27.007 8.69 or
+ // Integer.MAX_VALUE if unknown
+ private int mEcNo; // signal to noise radio (0-49, 255) as defined in TS 27.007 8.69 or
+ // Integer.MAX_VALUE if unknown
/** @hide */
public CellSignalStrengthWcdma() {
@@ -43,9 +49,11 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
}
/** @hide */
- public CellSignalStrengthWcdma(int ss, int ber) {
+ public CellSignalStrengthWcdma(int ss, int ber, int rscp, int ecno) {
mSignalStrength = ss;
mBitErrorRate = ber;
+ mRscp = rscp;
+ mEcNo = ecno;
}
/** @hide */
@@ -57,6 +65,8 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
protected void copyFrom(CellSignalStrengthWcdma s) {
mSignalStrength = s.mSignalStrength;
mBitErrorRate = s.mBitErrorRate;
+ mRscp = s.mRscp;
+ mEcNo = s.mEcNo;
}
/** @hide */
@@ -70,10 +80,15 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
public void setDefaultValues() {
mSignalStrength = Integer.MAX_VALUE;
mBitErrorRate = Integer.MAX_VALUE;
+ mRscp = Integer.MAX_VALUE;
+ mEcNo = Integer.MAX_VALUE;
}
/**
- * Get signal level as an int from 0..4
+ * Retrieve an abstract level value for the overall signal strength.
+ *
+ * @return a single integer from 0 to 4 representing the general signal quality.
+ * 0 represents very poor signal strength while 4 represents a very strong signal strength.
*/
@Override
public int getLevel() {
@@ -145,7 +160,10 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
return false;
}
- return mSignalStrength == s.mSignalStrength && mBitErrorRate == s.mBitErrorRate;
+ return mSignalStrength == s.mSignalStrength
+ && mBitErrorRate == s.mBitErrorRate
+ && mRscp == s.mRscp
+ && mEcNo == s.mEcNo;
}
/**
@@ -155,7 +173,9 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
public String toString() {
return "CellSignalStrengthWcdma:"
+ " ss=" + mSignalStrength
- + " ber=" + mBitErrorRate;
+ + " ber=" + mBitErrorRate
+ + " rscp=" + mRscp
+ + " ecno=" + mEcNo;
}
/** Implement the Parcelable interface */
@@ -164,6 +184,8 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
if (DBG) log("writeToParcel(Parcel, int): " + toString());
dest.writeInt(mSignalStrength);
dest.writeInt(mBitErrorRate);
+ dest.writeInt(mRscp);
+ dest.writeInt(mEcNo);
}
/**
@@ -173,6 +195,8 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements
private CellSignalStrengthWcdma(Parcel in) {
mSignalStrength = in.readInt();
mBitErrorRate = in.readInt();
+ mRscp = in.readInt();
+ mEcNo = in.readInt();
if (DBG) log("CellSignalStrengthWcdma(Parcel): " + toString());
}
diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java
index 6db8e825dbf0..53d69f447a56 100644
--- a/telephony/java/android/telephony/LocationAccessPolicy.java
+++ b/telephony/java/android/telephony/LocationAccessPolicy.java
@@ -39,7 +39,8 @@ import java.util.List;
* @hide
*/
public final class LocationAccessPolicy {
- private static final String LOG_TAG = LocationAccessPolicy.class.getSimpleName();
+ private static final String TAG = "LocationAccessPolicy";
+ private static final boolean DBG = false;
/**
* API to determine if the caller has permissions to get cell location.
@@ -52,12 +53,13 @@ public final class LocationAccessPolicy {
*/
public static boolean canAccessCellLocation(@NonNull Context context, @NonNull String pkgName,
int uid, int pid, boolean throwOnDeniedPermission) throws SecurityException {
- Trace.beginSection("TelephonyLohcationCheck");
+ Trace.beginSection("TelephonyLocationCheck");
try {
- // Always allow the phone process to access location. This avoid breaking legacy code
- // that rely on public-facing APIs to access cell location, and it doesn't create a
- // info leak risk because the cell location is stored in the phone process anyway.
- if (uid == Process.PHONE_UID) {
+ // Always allow the phone process and system server to access location. This avoid
+ // breaking legacy code that rely on public-facing APIs to access cell location, and
+ // it doesn't create an info leak risk because the cell location is stored in the phone
+ // process anyway, and the system server already has location access.
+ if (uid == Process.PHONE_UID || uid == Process.SYSTEM_UID || uid == Process.ROOT_UID) {
return true;
}
@@ -72,15 +74,18 @@ public final class LocationAccessPolicy {
pid, uid, "canAccessCellLocation");
} else if (context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION,
pid, uid) == PackageManager.PERMISSION_DENIED) {
+ if (DBG) Log.w(TAG, "Permission checked failed (" + pid + "," + uid + ")");
return false;
}
final int opCode = AppOpsManager.permissionToOpCode(
Manifest.permission.ACCESS_COARSE_LOCATION);
if (opCode != AppOpsManager.OP_NONE && context.getSystemService(AppOpsManager.class)
.noteOpNoThrow(opCode, uid, pkgName) != AppOpsManager.MODE_ALLOWED) {
+ if (DBG) Log.w(TAG, "AppOp check failed (" + uid + "," + pkgName + ")");
return false;
}
if (!isLocationModeEnabled(context, UserHandle.getUserId(uid))) {
+ if (DBG) Log.w(TAG, "Location disabled, failed, (" + uid + ")");
return false;
}
// If the user or profile is current, permission is granted.
@@ -94,7 +99,7 @@ public final class LocationAccessPolicy {
private static boolean isLocationModeEnabled(@NonNull Context context, @UserIdInt int userId) {
LocationManager locationManager = context.getSystemService(LocationManager.class);
if (locationManager == null) {
- Log.w(LOG_TAG, "Couldn't get location manager, denying location access");
+ Log.w(TAG, "Couldn't get location manager, denying location access");
return false;
}
return locationManager.isLocationEnabledForUser(UserHandle.of(userId));
diff --git a/telephony/java/android/telephony/NetworkRegistrationState.java b/telephony/java/android/telephony/NetworkRegistrationState.java
index 0e2e0cea784a..c3931557feb3 100644
--- a/telephony/java/android/telephony/NetworkRegistrationState.java
+++ b/telephony/java/android/telephony/NetworkRegistrationState.java
@@ -18,8 +18,10 @@ package android.telephony;
import android.annotation.IntDef;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import android.telephony.AccessNetworkConstants.TransportType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -30,6 +32,7 @@ import java.util.Objects;
* Description of a mobile network registration state
* @hide
*/
+@SystemApi
public class NetworkRegistrationState implements Parcelable {
/**
* Network domain
@@ -57,15 +60,15 @@ public class NetworkRegistrationState implements Parcelable {
/** Not registered. The device is not currently searching a new operator to register */
public static final int REG_STATE_NOT_REG_NOT_SEARCHING = 0;
/** Registered on home network */
- public static final int REG_STATE_HOME = 1;
+ public static final int REG_STATE_HOME = 1;
/** Not registered. The device is currently searching a new operator to register */
- public static final int REG_STATE_NOT_REG_SEARCHING = 2;
+ public static final int REG_STATE_NOT_REG_SEARCHING = 2;
/** Registration denied */
- public static final int REG_STATE_DENIED = 3;
+ public static final int REG_STATE_DENIED = 3;
/** Registration state is unknown */
- public static final int REG_STATE_UNKNOWN = 4;
+ public static final int REG_STATE_UNKNOWN = 4;
/** Registered on roaming network */
- public static final int REG_STATE_ROAMING = 5;
+ public static final int REG_STATE_ROAMING = 5;
/**
* Supported service type
@@ -77,24 +80,24 @@ public class NetworkRegistrationState implements Parcelable {
SERVICE_TYPE_EMERGENCY})
public @interface ServiceType {}
- public static final int SERVICE_TYPE_VOICE = 1;
- public static final int SERVICE_TYPE_DATA = 2;
- public static final int SERVICE_TYPE_SMS = 3;
- public static final int SERVICE_TYPE_VIDEO = 4;
- public static final int SERVICE_TYPE_EMERGENCY = 5;
-
- /** {@link AccessNetworkConstants.TransportType}*/
- private final int mTransportType;
+ public static final int SERVICE_TYPE_VOICE = 1;
+ public static final int SERVICE_TYPE_DATA = 2;
+ public static final int SERVICE_TYPE_SMS = 3;
+ public static final int SERVICE_TYPE_VIDEO = 4;
+ public static final int SERVICE_TYPE_EMERGENCY = 5;
@Domain
private final int mDomain;
+ /** {@link TransportType} */
+ private final int mTransportType;
+
@RegState
private final int mRegState;
private final int mAccessNetworkTechnology;
- private final int mReasonForDenial;
+ private final int mRejectCause;
private final boolean mEmergencyOnly;
@@ -110,22 +113,35 @@ public class NetworkRegistrationState implements Parcelable {
private DataSpecificRegistrationStates mDataSpecificStates;
/**
- * @param transportType Transport type. Must be {@link AccessNetworkConstants.TransportType}
- * @param domain Network domain. Must be DOMAIN_CS or DOMAIN_PS.
- * @param regState Network registration state.
- * @param accessNetworkTechnology See TelephonyManager NETWORK_TYPE_XXXX.
- * @param reasonForDenial Reason for denial if the registration state is DENIED.
- * @param availableServices The supported service.
- * @param cellIdentity The identity representing a unique cell
+ * @param domain Network domain. Must be a {@link Domain}. For {@link TransportType#WLAN}
+ * transport, this must set to {@link #DOMAIN_PS}.
+ * @param transportType Transport type. Must be one of the{@link TransportType}.
+ * @param regState Network registration state. Must be one of the {@link RegState}. For
+ * {@link TransportType#WLAN} transport, only {@link #REG_STATE_HOME} and
+ * {@link #REG_STATE_NOT_REG_NOT_SEARCHING} are valid states.
+ * @param accessNetworkTechnology Access network technology. Must be one of TelephonyManager
+ * NETWORK_TYPE_XXXX. For {@link TransportType#WLAN} transport, set to
+ * {@link TelephonyManager#NETWORK_TYPE_IWLAN}.
+ * @param rejectCause Reason for denial if the registration state is {@link #REG_STATE_DENIED}.
+ * Depending on {@code accessNetworkTechnology}, the values are defined in 3GPP TS 24.008
+ * 10.5.3.6 for UMTS, 3GPP TS 24.301 9.9.3.9 for LTE, and 3GPP2 A.S0001 6.2.2.44 for CDMA. If
+ * the reject cause is not supported or unknown, set it to 0.
+ * // TODO: Add IWLAN reject cause reference
+ * @param emergencyOnly True if this registration is for emergency only.
+ * @param availableServices The list of the supported services. Each element must be one of
+ * the {@link ServiceType}.
+ * @param cellIdentity The identity representing a unique cell or wifi AP. Set to null if the
+ * information is not available.
*/
- public NetworkRegistrationState(int transportType, int domain, int regState,
- int accessNetworkTechnology, int reasonForDenial, boolean emergencyOnly,
- int[] availableServices, @Nullable CellIdentity cellIdentity) {
- mTransportType = transportType;
+ public NetworkRegistrationState(@Domain int domain, int transportType, @RegState int regState,
+ int accessNetworkTechnology, int rejectCause,
+ boolean emergencyOnly, int[] availableServices,
+ @Nullable CellIdentity cellIdentity) {
mDomain = domain;
+ mTransportType = transportType;
mRegState = regState;
mAccessNetworkTechnology = accessNetworkTechnology;
- mReasonForDenial = reasonForDenial;
+ mRejectCause = rejectCause;
mAvailableServices = availableServices;
mCellIdentity = cellIdentity;
mEmergencyOnly = emergencyOnly;
@@ -135,12 +151,14 @@ public class NetworkRegistrationState implements Parcelable {
* Constructor for voice network registration states.
* @hide
*/
- public NetworkRegistrationState(int transportType, int domain, int regState,
- int accessNetworkTechnology, int reasonForDenial, boolean emergencyOnly,
- int[] availableServices, @Nullable CellIdentity cellIdentity, boolean cssSupported,
- int roamingIndicator, int systemIsInPrl, int defaultRoamingIndicator) {
- this(transportType, domain, regState, accessNetworkTechnology,
- reasonForDenial, emergencyOnly, availableServices, cellIdentity);
+ public NetworkRegistrationState(int domain, int transportType, int regState,
+ int accessNetworkTechnology, int rejectCause,
+ boolean emergencyOnly, int[] availableServices,
+ @Nullable CellIdentity cellIdentity, boolean cssSupported,
+ int roamingIndicator, int systemIsInPrl,
+ int defaultRoamingIndicator) {
+ this(domain, transportType, regState, accessNetworkTechnology, rejectCause, emergencyOnly,
+ availableServices, cellIdentity);
mVoiceSpecificStates = new VoiceSpecificRegistrationStates(cssSupported, roamingIndicator,
systemIsInPrl, defaultRoamingIndicator);
@@ -150,21 +168,22 @@ public class NetworkRegistrationState implements Parcelable {
* Constructor for data network registration states.
* @hide
*/
- public NetworkRegistrationState(int transportType, int domain, int regState,
- int accessNetworkTechnology, int reasonForDenial, boolean emergencyOnly,
- int[] availableServices, @Nullable CellIdentity cellIdentity, int maxDataCalls) {
- this(transportType, domain, regState, accessNetworkTechnology,
- reasonForDenial, emergencyOnly, availableServices, cellIdentity);
+ public NetworkRegistrationState(int domain, int transportType, int regState,
+ int accessNetworkTechnology, int rejectCause,
+ boolean emergencyOnly, int[] availableServices,
+ @Nullable CellIdentity cellIdentity, int maxDataCalls) {
+ this(domain, transportType, regState, accessNetworkTechnology, rejectCause, emergencyOnly,
+ availableServices, cellIdentity);
mDataSpecificStates = new DataSpecificRegistrationStates(maxDataCalls);
}
protected NetworkRegistrationState(Parcel source) {
- mTransportType = source.readInt();
mDomain = source.readInt();
+ mTransportType = source.readInt();
mRegState = source.readInt();
mAccessNetworkTechnology = source.readInt();
- mReasonForDenial = source.readInt();
+ mRejectCause = source.readInt();
mEmergencyOnly = source.readBoolean();
mAvailableServices = source.createIntArray();
mCellIdentity = source.readParcelable(CellIdentity.class.getClassLoader());
@@ -209,10 +228,10 @@ public class NetworkRegistrationState implements Parcelable {
}
/**
- * @return Reason for denial from network.
+ * @return Network reject cause
*/
- public int getReasonForDenial() {
- return mReasonForDenial;
+ public int getRejectCause() {
+ return mRejectCause;
}
/**
@@ -258,12 +277,12 @@ public class NetworkRegistrationState implements Parcelable {
@Override
public String toString() {
return new StringBuilder("NetworkRegistrationState{")
- .append("transportType=").append(mTransportType)
.append(" domain=").append((mDomain == DOMAIN_CS) ? "CS" : "PS")
+ .append("transportType=").append(mTransportType)
.append(" regState=").append(regStateToString(mRegState))
.append(" accessNetworkTechnology=")
.append(TelephonyManager.getNetworkTypeName(mAccessNetworkTechnology))
- .append(" reasonForDenial=").append(mReasonForDenial)
+ .append(" rejectCause=").append(mRejectCause)
.append(" emergencyEnabled=").append(mEmergencyOnly)
.append(" supportedServices=").append(mAvailableServices)
.append(" cellIdentity=").append(mCellIdentity)
@@ -274,8 +293,8 @@ public class NetworkRegistrationState implements Parcelable {
@Override
public int hashCode() {
- return Objects.hash(mTransportType, mDomain, mRegState, mAccessNetworkTechnology,
- mReasonForDenial, mEmergencyOnly, mAvailableServices, mCellIdentity,
+ return Objects.hash(mDomain, mTransportType, mRegState, mAccessNetworkTechnology,
+ mRejectCause, mEmergencyOnly, mAvailableServices, mCellIdentity,
mVoiceSpecificStates, mDataSpecificStates);
}
@@ -288,11 +307,11 @@ public class NetworkRegistrationState implements Parcelable {
}
NetworkRegistrationState other = (NetworkRegistrationState) o;
- return mTransportType == other.mTransportType
- && mDomain == other.mDomain
+ return mDomain == other.mDomain
+ && mTransportType == other.mTransportType
&& mRegState == other.mRegState
&& mAccessNetworkTechnology == other.mAccessNetworkTechnology
- && mReasonForDenial == other.mReasonForDenial
+ && mRejectCause == other.mRejectCause
&& mEmergencyOnly == other.mEmergencyOnly
&& (mAvailableServices == other.mAvailableServices
|| Arrays.equals(mAvailableServices, other.mAvailableServices))
@@ -303,11 +322,11 @@ public class NetworkRegistrationState implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mTransportType);
dest.writeInt(mDomain);
+ dest.writeInt(mTransportType);
dest.writeInt(mRegState);
dest.writeInt(mAccessNetworkTechnology);
- dest.writeInt(mReasonForDenial);
+ dest.writeInt(mRejectCause);
dest.writeBoolean(mEmergencyOnly);
dest.writeIntArray(mAvailableServices);
dest.writeParcelable(mCellIdentity, 0);
diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java
index b431590d8b8e..4354314dac29 100644
--- a/telephony/java/android/telephony/NetworkService.java
+++ b/telephony/java/android/telephony/NetworkService.java
@@ -17,6 +17,7 @@
package android.telephony;
import android.annotation.CallSuper;
+import android.annotation.SystemApi;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
@@ -35,8 +36,8 @@ import java.util.List;
/**
* Base class of network service. Services that extend NetworkService must register the service in
* their AndroidManifest to be detected by the framework. They must be protected by the permission
- * "android.permission.BIND_NETWORK_SERVICE". The network service definition in the manifest must
- * follow the following format:
+ * "android.permission.BIND_TELEPHONY_NETWORK_SERVICE". The network service definition in the
+ * manifest must follow the following format:
* ...
* <service android:name=".xxxNetworkService"
* android:permission="android.permission.BIND_TELEPHONY_NETWORK_SERVICE" >
@@ -46,6 +47,7 @@ import java.util.List;
* </service>
* @hide
*/
+@SystemApi
public abstract class NetworkService extends Service {
private final String TAG = NetworkService.class.getSimpleName();
diff --git a/telephony/java/android/telephony/NetworkServiceCallback.java b/telephony/java/android/telephony/NetworkServiceCallback.java
index ad3b00fdd58b..dbad02fd5640 100644
--- a/telephony/java/android/telephony/NetworkServiceCallback.java
+++ b/telephony/java/android/telephony/NetworkServiceCallback.java
@@ -17,6 +17,7 @@
package android.telephony;
import android.annotation.IntDef;
+import android.annotation.SystemApi;
import android.os.RemoteException;
import android.telephony.NetworkService.NetworkServiceProvider;
@@ -32,6 +33,7 @@ import java.lang.ref.WeakReference;
*
* @hide
*/
+@SystemApi
public class NetworkServiceCallback {
private static final String mTag = NetworkServiceCallback.class.getSimpleName();
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index c2e779e3fa32..842016511d39 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -21,6 +21,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.telecom.TelecomManager;
import com.android.internal.telephony.IPhoneStateListener;
@@ -442,17 +443,21 @@ public class PhoneStateListener {
/**
* Callback invoked when device call state changes.
+ * <p>
+ * Reports the state of Telephony (mobile) calls on the device.
+ * <p>
+ * Note: The state returned here may differ from that returned by
+ * {@link TelephonyManager#getCallState()}. Receivers of this callback should be aware that
+ * calling {@link TelephonyManager#getCallState()} from within this callback may return a
+ * different state than the callback reports.
+ *
* @param state call state
* @param phoneNumber call phone number. If application does not have
* {@link android.Manifest.permission#READ_CALL_LOG READ_CALL_LOG} permission or carrier
* privileges (see {@link TelephonyManager#hasCarrierPrivileges}), an empty string will be
* passed as an argument.
- *
- * @see TelephonyManager#CALL_STATE_IDLE
- * @see TelephonyManager#CALL_STATE_RINGING
- * @see TelephonyManager#CALL_STATE_OFFHOOK
*/
- public void onCallStateChanged(int state, String phoneNumber) {
+ public void onCallStateChanged(@TelephonyManager.CallState int state, String phoneNumber) {
// default implementation empty
}
diff --git a/telephony/java/android/telephony/PreciseDisconnectCause.java b/telephony/java/android/telephony/PreciseDisconnectCause.java
index 2516d5129dc8..46e2adbcfa7f 100644
--- a/telephony/java/android/telephony/PreciseDisconnectCause.java
+++ b/telephony/java/android/telephony/PreciseDisconnectCause.java
@@ -97,7 +97,7 @@ public class PreciseDisconnectCause {
/** This cause is used to report a resource unavailable event only when no other
* cause in the resource unavailable class applies
*/
- public static final int RESOURCES_UNAVAILABLE_OR_UNSPECIFIED = 44;
+ public static final int RESOURCES_UNAVAILABLE_OR_UNSPECIFIED = 47;
/** The requested quality of service (ITU-T X.213) cannot be provided */
public static final int QOS_NOT_AVAIL = 49;
/** The facility could not be provided by the network because the user has no
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 8ffdb21c6165..9e8529e20a7b 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -17,6 +17,7 @@
package android.telephony;
import android.annotation.IntDef;
+import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Bundle;
import android.os.Parcel;
@@ -29,6 +30,7 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
/**
* Contains phone state and service related information.
@@ -722,38 +724,40 @@ public class ServiceState implements Parcelable {
@Override
public int hashCode() {
- return ((mVoiceRegState * 31)
- + (mDataRegState * 37)
- + mVoiceRoamingType
- + mDataRoamingType
- + mChannelNumber
- + Arrays.hashCode(mCellBandwidths)
- + (mIsManualNetworkSelection ? 1 : 0)
- + ((null == mVoiceOperatorAlphaLong) ? 0 : mVoiceOperatorAlphaLong.hashCode())
- + ((null == mVoiceOperatorAlphaShort) ? 0 : mVoiceOperatorAlphaShort.hashCode())
- + ((null == mVoiceOperatorNumeric) ? 0 : mVoiceOperatorNumeric.hashCode())
- + ((null == mDataOperatorAlphaLong) ? 0 : mDataOperatorAlphaLong.hashCode())
- + ((null == mDataOperatorAlphaShort) ? 0 : mDataOperatorAlphaShort.hashCode())
- + ((null == mDataOperatorNumeric) ? 0 : mDataOperatorNumeric.hashCode())
- + mCdmaRoamingIndicator
- + mCdmaDefaultRoamingIndicator
- + (mIsEmergencyOnly ? 1 : 0)
- + (mIsDataRoamingFromRegistration ? 1 : 0));
+ return Objects.hash(
+ mVoiceRegState,
+ mDataRegState,
+ mVoiceRoamingType,
+ mDataRoamingType,
+ mChannelNumber,
+ mCellBandwidths,
+ mVoiceOperatorAlphaLong,
+ mVoiceOperatorAlphaShort,
+ mVoiceOperatorNumeric,
+ mDataOperatorAlphaLong,
+ mDataOperatorAlphaShort,
+ mDataOperatorNumeric,
+ mIsManualNetworkSelection,
+ mRilVoiceRadioTechnology,
+ mRilDataRadioTechnology,
+ mCssIndicator,
+ mNetworkId,
+ mSystemId,
+ mCdmaRoamingIndicator,
+ mCdmaDefaultRoamingIndicator,
+ mCdmaEriIconIndex,
+ mCdmaEriIconMode,
+ mIsEmergencyOnly,
+ mIsDataRoamingFromRegistration,
+ mIsUsingCarrierAggregation,
+ mLteEarfcnRsrpBoost,
+ mNetworkRegistrationStates);
}
@Override
public boolean equals (Object o) {
- ServiceState s;
-
- try {
- s = (ServiceState) o;
- } catch (ClassCastException ex) {
- return false;
- }
-
- if (o == null) {
- return false;
- }
+ if (!(o instanceof ServiceState)) return false;
+ ServiceState s = (ServiceState) o;
return (mVoiceRegState == s.mVoiceRegState
&& mDataRegState == s.mDataRegState
@@ -1533,6 +1537,7 @@ public class ServiceState implements Parcelable {
* @return List of registration states
* @hide
*/
+ @SystemApi
public List<NetworkRegistrationState> getNetworkRegistrationStates() {
synchronized (mNetworkRegistrationStates) {
return new ArrayList<>(mNetworkRegistrationStates);
@@ -1546,6 +1551,7 @@ public class ServiceState implements Parcelable {
* @return List of registration states.
* @hide
*/
+ @SystemApi
public List<NetworkRegistrationState> getNetworkRegistrationStates(int transportType) {
List<NetworkRegistrationState> list = new ArrayList<>();
@@ -1563,12 +1569,14 @@ public class ServiceState implements Parcelable {
/**
* Get the network registration states with given transport type and domain.
*
+ * @param domain The network domain. Must be {@link NetworkRegistrationState#DOMAIN_CS} or
+ * {@link NetworkRegistrationState#DOMAIN_PS}.
* @param transportType The transport type. See {@link AccessNetworkConstants.TransportType}
- * @param domain The network domain. Must be DOMAIN_CS or DOMAIN_PS.
* @return The matching NetworkRegistrationState.
* @hide
*/
- public NetworkRegistrationState getNetworkRegistrationStates(int transportType, int domain) {
+ @SystemApi
+ public NetworkRegistrationState getNetworkRegistrationStates(int domain, int transportType) {
synchronized (mNetworkRegistrationStates) {
for (NetworkRegistrationState networkRegistrationState : mNetworkRegistrationStates) {
if (networkRegistrationState.getTransportType() == transportType
diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java
index 4e5639683a76..95abb910e273 100644
--- a/telephony/java/android/telephony/SignalStrength.java
+++ b/telephony/java/android/telephony/SignalStrength.java
@@ -911,11 +911,8 @@ public class SignalStrength implements Parcelable {
if (rsrpIconLevel != -1) return rsrpIconLevel;
- /* Valid values are (0-63, 99) as defined in TS 36.331 */
- // TODO the range here is probably supposed to be (0..31, 99). It's unclear if anyone relies
- // on the current incorrect range check, so this will be fixed in a future release with more
- // soak time
- if (mLteSignalStrength > 63) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */
+ if (mLteSignalStrength > 31) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (mLteSignalStrength >= 12) rssiIconLevel = SIGNAL_STRENGTH_GREAT;
else if (mLteSignalStrength >= 8) rssiIconLevel = SIGNAL_STRENGTH_GOOD;
else if (mLteSignalStrength >= 5) rssiIconLevel = SIGNAL_STRENGTH_MODERATE;
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index 936505ca407d..d76e39b83801 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -33,9 +33,9 @@ import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.DisplayMetrics;
+import android.util.Log;
import java.util.Arrays;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -105,12 +105,12 @@ public class SubscriptionInfo implements Parcelable {
/**
* Mobile Country Code
*/
- private int mMcc;
+ private String mMcc;
/**
* Mobile Network Code
*/
- private int mMnc;
+ private String mMnc;
/**
* ISO Country code for the subscription's provider
@@ -138,11 +138,11 @@ public class SubscriptionInfo implements Parcelable {
* @hide
*/
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
- CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
- Bitmap icon, int mcc, int mnc, String countryIso) {
+ CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
+ Bitmap icon, String mcc, String mnc, String countryIso) {
this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number,
- roaming, icon, mcc, mnc, countryIso, false /* isEmbedded */,
- null /* accessRules */, null /* accessRules */);
+ roaming, icon, mcc, mnc, countryIso, false /* isEmbedded */,
+ null /* accessRules */, null /* accessRules */);
}
/**
@@ -150,7 +150,7 @@ public class SubscriptionInfo implements Parcelable {
*/
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
- Bitmap icon, int mcc, int mnc, String countryIso, boolean isEmbedded,
+ Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@Nullable UiccAccessRule[] accessRules) {
this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number,
roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, null /* cardId */);
@@ -161,7 +161,7 @@ public class SubscriptionInfo implements Parcelable {
*/
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
- Bitmap icon, int mcc, int mnc, String countryIso, boolean isEmbedded,
+ Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@Nullable UiccAccessRule[] accessRules, String cardId) {
this.mId = id;
this.mIccId = iccId;
@@ -316,15 +316,43 @@ public class SubscriptionInfo implements Parcelable {
/**
* @return the MCC.
+ * @deprecated Use {@link #getMccString()} instead.
*/
+ @Deprecated
public int getMcc() {
- return this.mMcc;
+ try {
+ return this.mMcc == null ? 0 : Integer.valueOf(this.mMcc);
+ } catch (NumberFormatException e) {
+ Log.w(SubscriptionInfo.class.getSimpleName(), "MCC string is not a number");
+ return 0;
+ }
}
/**
* @return the MNC.
+ * @deprecated Use {@link #getMncString()} instead.
*/
+ @Deprecated
public int getMnc() {
+ try {
+ return this.mMnc == null ? 0 : Integer.valueOf(this.mMnc);
+ } catch (NumberFormatException e) {
+ Log.w(SubscriptionInfo.class.getSimpleName(), "MNC string is not a number");
+ return 0;
+ }
+ }
+
+ /**
+ * @return The MCC, as a string.
+ */
+ public String getMccString() {
+ return this.mMcc;
+ }
+
+ /**
+ * @return The MNC, as a string.
+ */
+ public String getMncString() {
return this.mMnc;
}
@@ -425,8 +453,8 @@ public class SubscriptionInfo implements Parcelable {
int iconTint = source.readInt();
String number = source.readString();
int dataRoaming = source.readInt();
- int mcc = source.readInt();
- int mnc = source.readInt();
+ String mcc = source.readString();
+ String mnc = source.readString();
String countryIso = source.readString();
Bitmap iconBitmap = Bitmap.CREATOR.createFromParcel(source);
boolean isEmbedded = source.readBoolean();
@@ -455,8 +483,8 @@ public class SubscriptionInfo implements Parcelable {
dest.writeInt(mIconTint);
dest.writeString(mNumber);
dest.writeInt(mDataRoaming);
- dest.writeInt(mMcc);
- dest.writeInt(mMnc);
+ dest.writeString(mMcc);
+ dest.writeString(mMnc);
dest.writeString(mCountryIso);
mIconBitmap.writeToParcel(dest, flags);
dest.writeBoolean(mIsEmbedded);
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index ece646ca7b2c..17e7c49f6289 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -253,6 +253,20 @@ public class SubscriptionManager {
public static final int SIM_PROVISIONED = 0;
/**
+ * TelephonyProvider column name for the MCC associated with a SIM, stored as a string.
+ * <P>Type: TEXT (String)</P>
+ * @hide
+ */
+ public static final String MCC_STRING = "mcc_string";
+
+ /**
+ * TelephonyProvider column name for the MNC associated with a SIM, stored as a string.
+ * <P>Type: TEXT (String)</P>
+ * @hide
+ */
+ public static final String MNC_STRING = "mnc_string";
+
+ /**
* TelephonyProvider column name for the MCC associated with a SIM.
* <P>Type: INTEGER (int)</P>
* @hide
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 4ed43020201d..c493f8001c2f 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -335,11 +335,18 @@ public class TelephonyManager {
* <p>
* The {@link #EXTRA_STATE} extra indicates the new call state.
* If a receiving app has {@link android.Manifest.permission#READ_CALL_LOG} permission, a second
- * extra {@link #EXTRA_INCOMING_NUMBER} provides the phone number for incoming and outoing calls
- * as a String. Note: If the receiving app has
+ * extra {@link #EXTRA_INCOMING_NUMBER} provides the phone number for incoming and outgoing
+ * calls as a String.
+ * <p>
+ * If the receiving app has
* {@link android.Manifest.permission#READ_CALL_LOG} and
* {@link android.Manifest.permission#READ_PHONE_STATE} permission, it will receive the
- * broadcast twice; one with the phone number and another without it.
+ * broadcast twice; one with the {@link #EXTRA_INCOMING_NUMBER} populated with the phone number,
+ * and another with it blank. Due to the nature of broadcasts, you cannot assume the order
+ * in which these broadcasts will arrive, however you are guaranteed to receive two in this
+ * case. Apps which are interested in the {@link #EXTRA_INCOMING_NUMBER} can ignore the
+ * broadcasts where {@link #EXTRA_INCOMING_NUMBER} is not present in the extras (e.g. where
+ * {@link Intent#hasExtra(String)} returns {@code false}).
* <p class="note">
* This was a {@link android.content.Context#sendStickyBroadcast sticky}
* broadcast in version 1.0, but it is no longer sticky.
@@ -488,10 +495,19 @@ public class TelephonyManager {
public static final String EXTRA_STATE_OFFHOOK = PhoneConstants.State.OFFHOOK.toString();
/**
- * The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast
- * for a String containing the incoming phone number.
- * Only valid when the new call state is RINGING.
- *
+ * Extra key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast
+ * for a String containing the incoming or outgoing phone number.
+ * <p>
+ * This extra is only populated for receivers of the {@link #ACTION_PHONE_STATE_CHANGED}
+ * broadcast which have been granted the {@link android.Manifest.permission#READ_CALL_LOG} and
+ * {@link android.Manifest.permission#READ_PHONE_STATE} permissions.
+ * <p>
+ * For incoming calls, the phone number is only guaranteed to be populated when the
+ * {@link #EXTRA_STATE} changes from {@link #EXTRA_STATE_IDLE} to {@link #EXTRA_STATE_RINGING}.
+ * If the incoming caller is from an unknown number, the extra will be populated with an empty
+ * string.
+ * For outgoing calls, the phone number is only guaranteed to be populated when the
+ * {@link #EXTRA_STATE} changes from {@link #EXTRA_STATE_IDLE} to {@link #EXTRA_STATE_OFFHOOK}.
* <p class="note">
* Retrieve with
* {@link android.content.Intent#getStringExtra(String)}.
@@ -1297,6 +1313,33 @@ public class TelephonyManager {
}
/**
+ * Returns the Type Allocation Code from the IMEI. Return null if Type Allocation Code is not
+ * available.
+ */
+ public String getTypeAllocationCode() {
+ return getTypeAllocationCode(getSlotIndex());
+ }
+
+ /**
+ * Returns the Type Allocation Code from the IMEI. Return null if Type Allocation Code is not
+ * available.
+ *
+ * @param slotIndex of which Type Allocation Code is returned
+ */
+ public String getTypeAllocationCode(int slotIndex) {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) return null;
+
+ try {
+ return telephony.getTypeAllocationCodeForSlot(slotIndex);
+ } catch (RemoteException ex) {
+ return null;
+ } catch (NullPointerException ex) {
+ return null;
+ }
+ }
+
+ /**
* Returns the MEID (Mobile Equipment Identifier). Return null if MEID is not available.
*
* <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
@@ -1332,6 +1375,33 @@ public class TelephonyManager {
}
/**
+ * Returns the Manufacturer Code from the MEID. Return null if Manufacturer Code is not
+ * available.
+ */
+ public String getManufacturerCode() {
+ return getManufacturerCode(getSlotIndex());
+ }
+
+ /**
+ * Returns the Manufacturer Code from the MEID. Return null if Manufacturer Code is not
+ * available.
+ *
+ * @param slotIndex of which Type Allocation Code is returned
+ */
+ public String getManufacturerCode(int slotIndex) {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) return null;
+
+ try {
+ return telephony.getManufacturerCodeForSlot(slotIndex);
+ } catch (RemoteException ex) {
+ return null;
+ } catch (NullPointerException ex) {
+ return null;
+ }
+ }
+
+ /**
* Returns the Network Access Identifier (NAI). Return null if NAI is not available.
*
* <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
@@ -1882,7 +1952,7 @@ public class TelephonyManager {
/**
* Returns the ISO country code equivalent of the MCC (Mobile Country Code) of the current
- * registered operator, or nearby cell information if not registered.
+ * registered operator or the cell nearby, if available.
* .
* <p>
* Note: Result may be unreliable on CDMA networks (use {@link #getPhoneType()} to determine
@@ -1894,7 +1964,7 @@ public class TelephonyManager {
/**
* Returns the ISO country code equivalent of the MCC (Mobile Country Code) of the current
- * registered operator, or nearby cell information if not registered.
+ * registered operator or the cell nearby, if available.
* <p>
* Note: Result may be unreliable on CDMA networks (use {@link #getPhoneType()} to determine
* if on a CDMA network).
@@ -2771,7 +2841,8 @@ public class TelephonyManager {
}
/**
- * Gets all the UICC slots.
+ * Gets all the UICC slots. The objects in the array can be null if the slot info is not
+ * available, which is possible between phone process starting and getting slot info from modem.
*
* @return UiccSlotInfo array.
*
@@ -3290,37 +3361,6 @@ public class TelephonyManager {
}
/**
- * Returns the complete voice mail number. Return null if it is unavailable.
- *
- * @hide
- */
- @RequiresPermission(android.Manifest.permission.CALL_PRIVILEGED)
- public String getCompleteVoiceMailNumber() {
- return getCompleteVoiceMailNumber(getSubId());
- }
-
- /**
- * Returns the complete voice mail number. Return null if it is unavailable.
- *
- * @param subId
- * @hide
- */
- @RequiresPermission(android.Manifest.permission.CALL_PRIVILEGED)
- public String getCompleteVoiceMailNumber(int subId) {
- try {
- IPhoneSubInfo info = getSubscriberInfo();
- if (info == null)
- return null;
- return info.getCompleteVoiceMailNumberForSubscriber(subId);
- } catch (RemoteException ex) {
- return null;
- } catch (NullPointerException ex) {
- // This could happen before phone restarts due to crashing
- return null;
- }
- }
-
- /**
* Sets the voice mail number.
*
* <p>Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
@@ -3454,8 +3494,8 @@ public class TelephonyManager {
*
* @param settings The settings for the filter, or {@code null} to disable the filter.
*
- * @see {@link TelecomManager#getDefaultDialerPackage()}
- * @see {@link CarrierConfigManager#KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY}
+ * @see TelecomManager#getDefaultDialerPackage()
+ * @see CarrierConfigManager#KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY
*/
public void setVisualVoicemailSmsFilterSettings(VisualVoicemailSmsFilterSettings settings) {
if (settings == null) {
@@ -4020,26 +4060,45 @@ public class TelephonyManager {
return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo"));
}
- /** Device call state: No activity. */
+ /**
+ * Device call state: No activity.
+ */
public static final int CALL_STATE_IDLE = 0;
- /** Device call state: Ringing. A new call arrived and is
+ /**
+ * Device call state: Ringing. A new call arrived and is
* ringing or waiting. In the latter case, another call is
- * already active. */
+ * already active.
+ */
public static final int CALL_STATE_RINGING = 1;
- /** Device call state: Off-hook. At least one call exists
- * that is dialing, active, or on hold, and no calls are ringing
- * or waiting. */
+ /**
+ * Device call state: Off-hook. At least one call exists
+ * that is dialing, active, or on hold, and no calls are ringing
+ * or waiting.
+ */
public static final int CALL_STATE_OFFHOOK = 2;
+ /** @hide */
+ @IntDef(prefix = { "CALL_STATE_" }, value = {
+ CALL_STATE_IDLE,
+ CALL_STATE_RINGING,
+ CALL_STATE_OFFHOOK
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface CallState{}
+
/**
- * Returns one of the following constants that represents the current state of all
- * phone calls.
+ * Returns the state of all calls on the device.
+ * <p>
+ * This method considers not only calls in the Telephony stack, but also calls via other
+ * {@link android.telecom.ConnectionService} implementations.
+ * <p>
+ * Note: The call state returned via this method may differ from what is reported by
+ * {@link PhoneStateListener#onCallStateChanged(int, String)}, as that callback only considers
+ * Telephony (mobile) calls.
*
- * {@link TelephonyManager#CALL_STATE_RINGING}
- * {@link TelephonyManager#CALL_STATE_OFFHOOK}
- * {@link TelephonyManager#CALL_STATE_IDLE}
+ * @return the current call state.
*/
- public int getCallState() {
+ public @CallState int getCallState() {
try {
ITelecomService telecom = getTelecomService();
if (telecom != null) {
@@ -4052,23 +4111,31 @@ public class TelephonyManager {
}
/**
- * Returns a constant indicating the call state (cellular) on the device
- * for a subscription.
+ * Returns the Telephony call state for calls on a specific subscription.
+ * <p>
+ * Note: This method considers ONLY telephony/mobile calls, where {@link #getCallState()}
+ * considers the state of calls from other {@link android.telecom.ConnectionService}
+ * implementations.
*
- * @param subId whose call state is returned
+ * @param subId the subscription to check call state for.
* @hide
*/
- public int getCallState(int subId) {
+ public @CallState int getCallState(int subId) {
int phoneId = SubscriptionManager.getPhoneId(subId);
return getCallStateForSlot(phoneId);
}
/**
- * See getCallState.
+ * Returns the Telephony call state for calls on a specific SIM slot.
+ * <p>
+ * Note: This method considers ONLY telephony/mobile calls, where {@link #getCallState()}
+ * considers the state of calls from other {@link android.telecom.ConnectionService}
+ * implementations.
*
+ * @param slotIndex the SIM slot index to check call state for.
* @hide
*/
- public int getCallStateForSlot(int slotIndex) {
+ public @CallState int getCallStateForSlot(int slotIndex) {
try {
ITelephony telephony = getITelephony();
if (telephony == null)
@@ -5442,23 +5509,6 @@ public class TelephonyManager {
}
/**
- * @return true if the IMS resolver is busy resolving a binding and should not be considered
- * available, false if the IMS resolver is idle.
- * @hide
- */
- public boolean isResolvingImsBinding() {
- try {
- ITelephony telephony = getITelephony();
- if (telephony != null) {
- return telephony.isResolvingImsBinding();
- }
- } catch (RemoteException e) {
- Rlog.e(TAG, "isResolvingImsBinding, RemoteException: " + e.getMessage());
- }
- return false;
- }
-
- /**
* Set IMS registration state
*
* @param Registration state
@@ -6564,7 +6614,7 @@ public class TelephonyManager {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
- return telephony.canChangeDtmfToneLength();
+ return telephony.canChangeDtmfToneLength(mSubId, getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#canChangeDtmfToneLength", e);
@@ -6583,7 +6633,7 @@ public class TelephonyManager {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
- return telephony.isWorldPhone();
+ return telephony.isWorldPhone(mSubId, getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#isWorldPhone", e);
@@ -7146,31 +7196,6 @@ public class TelephonyManager {
}
/**
- * Set the ISO country code equivalent of the current registered
- * operator's MCC (Mobile Country Code).
- * @param iso the ISO country code equivalent of the current registered
- * @hide
- */
- public void setNetworkCountryIso(String iso) {
- int phoneId = getPhoneId();
- setNetworkCountryIsoForPhone(phoneId, iso);
- }
-
- /**
- * Set the ISO country code equivalent of the current registered
- * operator's MCC (Mobile Country Code).
- * @param phoneId which phone you want to set
- * @param iso the ISO country code equivalent of the current registered
- * @hide
- */
- public void setNetworkCountryIsoForPhone(int phoneId, String iso) {
- if (SubscriptionManager.isValidPhoneId(phoneId)) {
- setTelephonyProperty(phoneId,
- TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, iso);
- }
- }
-
- /**
* Set the network type currently in use on the device for data transmission.
*
* If this object has been created with {@link #createForSubscriptionId}, applies to the
diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java
index c68a780b1e28..5dc0cff66910 100644
--- a/telephony/java/android/telephony/data/ApnSetting.java
+++ b/telephony/java/android/telephony/data/ApnSetting.java
@@ -24,12 +24,14 @@ import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.Telephony;
+import android.provider.Telephony.Carriers;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.net.InetAddress;
@@ -54,20 +56,31 @@ public class ApnSetting implements Parcelable {
private static final String LOG_TAG = "ApnSetting";
private static final boolean VDBG = false;
- private static final Map<String, Integer> APN_TYPE_STRING_MAP;
- private static final Map<Integer, String> APN_TYPE_INT_MAP;
- private static final Map<String, Integer> PROTOCOL_STRING_MAP;
- private static final Map<Integer, String> PROTOCOL_INT_MAP;
- private static final Map<String, Integer> MVNO_TYPE_STRING_MAP;
- private static final Map<Integer, String> MVNO_TYPE_INT_MAP;
- private static final int NOT_IN_MAP_INT = -1;
- private static final int NO_PORT_SPECIFIED = -1;
+ private static final String V2_FORMAT_REGEX = "^\\[ApnSettingV2\\]\\s*";
+ private static final String V3_FORMAT_REGEX = "^\\[ApnSettingV3\\]\\s*";
+ private static final String V4_FORMAT_REGEX = "^\\[ApnSettingV4\\]\\s*";
+ private static final String V5_FORMAT_REGEX = "^\\[ApnSettingV5\\]\\s*";
- /** All APN types except IA. */
- private static final int TYPE_ALL_BUT_IA = ApnTypes.ALL & (~ApnTypes.IA);
+ /**
+ * Default value for mtu if it's not set. Moved from PhoneConstants.
+ * @hide
+ */
+ public static final int UNSET_MTU = 0;
+ private static final int UNSPECIFIED_INT = -1;
+ private static final String UNSPECIFIED_STRING = "";
- /** APN type for default data traffic and HiPri traffic. */
- public static final int TYPE_DEFAULT = ApnTypes.DEFAULT | ApnTypes.HIPRI;
+ /**
+ * APN type for none. Should only be used for initialization.
+ * @hide
+ */
+ public static final int TYPE_NONE = ApnTypes.NONE;
+ /**
+ * APN type for all APNs.
+ * @hide
+ */
+ public static final int TYPE_ALL = ApnTypes.ALL;
+ /** APN type for default data traffic. */
+ public static final int TYPE_DEFAULT = ApnTypes.DEFAULT;
/** APN type for MMS traffic. */
public static final int TYPE_MMS = ApnTypes.MMS;
/** APN type for SUPL assisted GPS. */
@@ -166,9 +179,16 @@ public class ApnSetting implements Parcelable {
@Retention(RetentionPolicy.SOURCE)
public @interface MvnoType {}
+ private static final Map<String, Integer> APN_TYPE_STRING_MAP;
+ private static final Map<Integer, String> APN_TYPE_INT_MAP;
+ private static final Map<String, Integer> PROTOCOL_STRING_MAP;
+ private static final Map<Integer, String> PROTOCOL_INT_MAP;
+ private static final Map<String, Integer> MVNO_TYPE_STRING_MAP;
+ private static final Map<Integer, String> MVNO_TYPE_INT_MAP;
+
static {
APN_TYPE_STRING_MAP = new ArrayMap<String, Integer>();
- APN_TYPE_STRING_MAP.put("*", TYPE_ALL_BUT_IA);
+ APN_TYPE_STRING_MAP.put("*", TYPE_ALL);
APN_TYPE_STRING_MAP.put("default", TYPE_DEFAULT);
APN_TYPE_STRING_MAP.put("mms", TYPE_MMS);
APN_TYPE_STRING_MAP.put("supl", TYPE_SUPL);
@@ -216,10 +236,10 @@ public class ApnSetting implements Parcelable {
private final String mEntryName;
private final String mApnName;
- private final InetAddress mProxyAddress;
+ private final String mProxyAddress;
private final int mProxyPort;
private final Uri mMmsc;
- private final InetAddress mMmsProxyAddress;
+ private final String mMmsProxyAddress;
private final int mMmsProxyPort;
private final String mUser;
private final String mPassword;
@@ -245,6 +265,8 @@ public class ApnSetting implements Parcelable {
private final int mMvnoType;
private final String mMvnoMatchData;
+ private final int mApnSetId;
+
private boolean mPermanentFailed = false;
/**
@@ -322,6 +344,21 @@ public class ApnSetting implements Parcelable {
}
/**
+ * Returns the APN set id.
+ *
+ * APNs that are part of the same set should be preferred together, e.g. if the
+ * user selects a default APN with apnSetId=1, then we will prefer all APNs with apnSetId = 1.
+ *
+ * If the apnSetId = Carriers.NO_SET_SET(=0) then the APN is not part of a set.
+ *
+ * @return the APN set id
+ * @hide
+ */
+ public int getApnSetId() {
+ return mApnSetId;
+ }
+
+ /**
* Indicates this APN setting is permanently failed and cannot be
* retried by the retry manager anymore.
*
@@ -367,8 +404,19 @@ public class ApnSetting implements Parcelable {
* This is a known problem and will be addressed in a future release.
*
* @return the HTTP proxy address or {@code null} if DNS isn’t available to resolve a hostname
+ * @deprecated use {@link #getProxyAddressAsString()} instead.
*/
+ @Deprecated
public InetAddress getProxyAddress() {
+ return inetAddressFromString(mProxyAddress);
+ }
+
+ /**
+ * Returns the proxy address of the APN.
+ *
+ * @return proxy address.
+ */
+ public String getProxyAddressAsString() {
return mProxyAddress;
}
@@ -396,8 +444,19 @@ public class ApnSetting implements Parcelable {
* restriction. This is a known problem and will be addressed in a future release.
*
* @return the MMS proxy address or {@code null} if DNS isn’t available to resolve a hostname
+ * @deprecated use {@link #getMmsProxyAddressAsString()} instead.
*/
+ @Deprecated
public InetAddress getMmsProxyAddress() {
+ return inetAddressFromString(mMmsProxyAddress);
+ }
+
+ /**
+ * Returns the MMS proxy address of the APN.
+ *
+ * @return MMS proxy address.
+ */
+ public String getMmsProxyAddressAsString() {
return mMmsProxyAddress;
}
@@ -563,25 +622,27 @@ public class ApnSetting implements Parcelable {
this.mMaxConnsTime = builder.mMaxConnsTime;
this.mMvnoType = builder.mMvnoType;
this.mMvnoMatchData = builder.mMvnoMatchData;
+ this.mApnSetId = builder.mApnSetId;
}
/** @hide */
public static ApnSetting makeApnSetting(int id, String operatorNumeric, String entryName,
- String apnName, InetAddress proxy, int port, Uri mmsc, InetAddress mmsProxy,
- int mmsPort, String user, String password, int authType, int mApnTypeBitmask,
- int protocol, int roamingProtocol, boolean carrierEnabled,
- int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns,
- int waitTime, int maxConnsTime, int mtu, int mvnoType, String mvnoMatchData) {
+ String apnName, String proxyAddress, int proxyPort, Uri mmsc,
+ String mmsProxyAddress, int mmsProxyPort, String user, String password,
+ int authType, int mApnTypeBitmask, int protocol, int roamingProtocol,
+ boolean carrierEnabled, int networkTypeBitmask, int profileId, boolean modemCognitive,
+ int maxConns, int waitTime, int maxConnsTime, int mtu, int mvnoType,
+ String mvnoMatchData, int apnSetId) {
return new Builder()
.setId(id)
.setOperatorNumeric(operatorNumeric)
.setEntryName(entryName)
.setApnName(apnName)
- .setProxyAddress(proxy)
- .setProxyPort(port)
+ .setProxyAddress(proxyAddress)
+ .setProxyPort(proxyPort)
.setMmsc(mmsc)
- .setMmsProxyAddress(mmsProxy)
- .setMmsProxyPort(mmsPort)
+ .setMmsProxyAddress(mmsProxyAddress)
+ .setMmsProxyPort(mmsProxyPort)
.setUser(user)
.setPassword(password)
.setAuthType(authType)
@@ -598,12 +659,28 @@ public class ApnSetting implements Parcelable {
.setMtu(mtu)
.setMvnoType(mvnoType)
.setMvnoMatchData(mvnoMatchData)
- .build();
+ .setApnSetId(apnSetId)
+ .buildWithoutCheck();
+ }
+
+ /** @hide */
+ public static ApnSetting makeApnSetting(int id, String operatorNumeric, String entryName,
+ String apnName, String proxyAddress, int proxyPort, Uri mmsc,
+ String mmsProxyAddress, int mmsProxyPort, String user, String password,
+ int authType, int mApnTypeBitmask, int protocol, int roamingProtocol,
+ boolean carrierEnabled, int networkTypeBitmask, int profileId, boolean modemCognitive,
+ int maxConns, int waitTime, int maxConnsTime, int mtu, int mvnoType,
+ String mvnoMatchData) {
+ return makeApnSetting(id, operatorNumeric, entryName, apnName, proxyAddress, proxyPort,
+ mmsc, mmsProxyAddress, mmsProxyPort, user, password, authType, mApnTypeBitmask,
+ protocol, roamingProtocol, carrierEnabled, networkTypeBitmask, profileId,
+ modemCognitive, maxConns, waitTime, maxConnsTime, mtu, mvnoType, mvnoMatchData,
+ Carriers.NO_SET_SET);
}
/** @hide */
public static ApnSetting makeApnSetting(Cursor cursor) {
- final int apnTypesBitmask = parseTypes(
+ final int apnTypesBitmask = getApnTypesBitmaskFromString(
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.TYPE)));
int networkTypeBitmask = cursor.getInt(
cursor.getColumnIndexOrThrow(Telephony.Carriers.NETWORK_TYPE_BITMASK));
@@ -619,25 +696,25 @@ public class ApnSetting implements Parcelable {
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NUMERIC)),
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NAME)),
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN)),
- inetAddressFromString(cursor.getString(
- cursor.getColumnIndexOrThrow(Telephony.Carriers.PROXY))),
+ cursor.getString(
+ cursor.getColumnIndexOrThrow(Telephony.Carriers.PROXY)),
portFromString(cursor.getString(
cursor.getColumnIndexOrThrow(Telephony.Carriers.PORT))),
UriFromString(cursor.getString(
cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSC))),
- inetAddressFromString(cursor.getString(
- cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPROXY))),
+ cursor.getString(
+ cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPROXY)),
portFromString(cursor.getString(
cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPORT))),
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)),
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)),
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)),
apnTypesBitmask,
- nullToNotInMapInt(PROTOCOL_STRING_MAP.get(
- cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)))),
- nullToNotInMapInt(PROTOCOL_STRING_MAP.get(
+ getProtocolIntFromString(
+ cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL))),
+ getProtocolIntFromString(
cursor.getString(cursor.getColumnIndexOrThrow(
- Telephony.Carriers.ROAMING_PROTOCOL)))),
+ Telephony.Carriers.ROAMING_PROTOCOL))),
cursor.getInt(cursor.getColumnIndexOrThrow(
Telephony.Carriers.CARRIER_ENABLED)) == 1,
networkTypeBitmask,
@@ -649,41 +726,225 @@ public class ApnSetting implements Parcelable {
cursor.getInt(cursor.getColumnIndexOrThrow(
Telephony.Carriers.MAX_CONNS_TIME)),
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MTU)),
- nullToNotInMapInt(MVNO_TYPE_STRING_MAP.get(
+ getMvnoTypeIntFromString(
cursor.getString(cursor.getColumnIndexOrThrow(
- Telephony.Carriers.MVNO_TYPE)))),
+ Telephony.Carriers.MVNO_TYPE))),
cursor.getString(cursor.getColumnIndexOrThrow(
- Telephony.Carriers.MVNO_MATCH_DATA)));
+ Telephony.Carriers.MVNO_MATCH_DATA)),
+ cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN_SET_ID)));
}
/** @hide */
public static ApnSetting makeApnSetting(ApnSetting apn) {
return makeApnSetting(apn.mId, apn.mOperatorNumeric, apn.mEntryName, apn.mApnName,
- apn.mProxyAddress, apn.mProxyPort, apn.mMmsc, apn.mMmsProxyAddress, apn.mMmsProxyPort, apn.mUser,
- apn.mPassword, apn.mAuthType, apn.mApnTypeBitmask, apn.mProtocol, apn.mRoamingProtocol,
- apn.mCarrierEnabled, apn.mNetworkTypeBitmask, apn.mProfileId,
- apn.mModemCognitive, apn.mMaxConns, apn.mWaitTime, apn.mMaxConnsTime, apn.mMtu,
- apn.mMvnoType, apn.mMvnoMatchData);
+ apn.mProxyAddress, apn.mProxyPort, apn.mMmsc, apn.mMmsProxyAddress,
+ apn.mMmsProxyPort, apn.mUser, apn.mPassword, apn.mAuthType, apn.mApnTypeBitmask,
+ apn.mProtocol, apn.mRoamingProtocol, apn.mCarrierEnabled, apn.mNetworkTypeBitmask,
+ apn.mProfileId, apn.mModemCognitive, apn.mMaxConns, apn.mWaitTime,
+ apn.mMaxConnsTime, apn.mMtu, apn.mMvnoType, apn.mMvnoMatchData, apn.mApnSetId);
}
- /** @hide */
+ /**
+ * Creates an ApnSetting object from a string.
+ *
+ * @param data the string to read.
+ *
+ * The string must be in one of two formats (newlines added for clarity,
+ * spaces are optional):
+ *
+ * v1 format:
+ * <carrier>, <apn>, <proxy>, <port>, <user>, <password>, <server>,
+ * <mmsc>, <mmsproxy>, <mmsport>, <mcc>, <mnc>, <authtype>,
+ * <type>[| <type>...],
+ *
+ * v2 format:
+ * [ApnSettingV2] <carrier>, <apn>, <proxy>, <port>, <user>, <password>, <server>,
+ * <mmsc>, <mmsproxy>, <mmsport>, <mcc>, <mnc>, <authtype>,
+ * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearerBitmask>,
+ *
+ * v3 format:
+ * [ApnSettingV3] <carrier>, <apn>, <proxy>, <port>, <user>, <password>, <server>,
+ * <mmsc>, <mmsproxy>, <mmsport>, <mcc>, <mnc>, <authtype>,
+ * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearerBitmask>,
+ * <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>,
+ * <mvnoType>, <mvnoMatchData>
+ *
+ * v4 format:
+ * [ApnSettingV4] <carrier>, <apn>, <proxy>, <port>, <user>, <password>, <server>,
+ * <mmsc>, <mmsproxy>, <mmsport>, <mcc>, <mnc>, <authtype>,
+ * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearerBitmask>,
+ * <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>,
+ * <mvnoType>, <mvnoMatchData>, <networkTypeBitmask>
+ *
+ * v5 format:
+ * [ApnSettingV5] <carrier>, <apn>, <proxy>, <port>, <user>, <password>, <server>,
+ * <mmsc>, <mmsproxy>, <mmsport>, <mcc>, <mnc>, <authtype>,
+ * <type>[| <type>...], <protocol>, <roaming_protocol>, <carrierEnabled>, <bearerBitmask>,
+ * <profileId>, <modemCognitive>, <maxConns>, <waitTime>, <maxConnsTime>, <mtu>,
+ * <mvnoType>, <mvnoMatchData>, <networkTypeBitmask>, <apnSetId>
+ *
+ * Note that the strings generated by {@link #toString()} do not contain the username
+ * and password and thus cannot be read by this method.
+ *
+ * This method may return {@code null} if the input string is invalid.
+ *
+ * @hide
+ */
+ public static ApnSetting fromString(String data) {
+ if (data == null) return null;
+
+ int version;
+ // matches() operates on the whole string, so append .* to the regex.
+ if (data.matches(V5_FORMAT_REGEX + ".*")) {
+ version = 5;
+ data = data.replaceFirst(V5_FORMAT_REGEX, "");
+ } else if (data.matches(V4_FORMAT_REGEX + ".*")) {
+ version = 4;
+ data = data.replaceFirst(V4_FORMAT_REGEX, "");
+ } else if (data.matches(V3_FORMAT_REGEX + ".*")) {
+ version = 3;
+ data = data.replaceFirst(V3_FORMAT_REGEX, "");
+ } else if (data.matches(V2_FORMAT_REGEX + ".*")) {
+ version = 2;
+ data = data.replaceFirst(V2_FORMAT_REGEX, "");
+ } else {
+ version = 1;
+ }
+
+ String[] a = data.split("\\s*,\\s*");
+ if (a.length < 14) {
+ return null;
+ }
+
+ int authType;
+ try {
+ authType = Integer.parseInt(a[12]);
+ } catch (NumberFormatException e) {
+ authType = 0;
+ }
+
+ String[] typeArray;
+ String protocol, roamingProtocol;
+ boolean carrierEnabled;
+ int bearerBitmask = 0;
+ int networkTypeBitmask = 0;
+ int profileId = 0;
+ boolean modemCognitive = false;
+ int maxConns = 0;
+ int waitTime = 0;
+ int maxConnsTime = 0;
+ int mtu = UNSET_MTU;
+ String mvnoType = "";
+ String mvnoMatchData = "";
+ int apnSetId = Carriers.NO_SET_SET;
+ if (version == 1) {
+ typeArray = new String[a.length - 13];
+ System.arraycopy(a, 13, typeArray, 0, a.length - 13);
+ protocol = PROTOCOL_INT_MAP.get(PROTOCOL_IP);
+ roamingProtocol = PROTOCOL_INT_MAP.get(PROTOCOL_IP);
+ carrierEnabled = true;
+ } else {
+ if (a.length < 18) {
+ return null;
+ }
+ typeArray = a[13].split("\\s*\\|\\s*");
+ protocol = a[14];
+ roamingProtocol = a[15];
+ carrierEnabled = Boolean.parseBoolean(a[16]);
+
+ bearerBitmask = ServiceState.getBitmaskFromString(a[17]);
+
+ if (a.length > 22) {
+ modemCognitive = Boolean.parseBoolean(a[19]);
+ try {
+ profileId = Integer.parseInt(a[18]);
+ maxConns = Integer.parseInt(a[20]);
+ waitTime = Integer.parseInt(a[21]);
+ maxConnsTime = Integer.parseInt(a[22]);
+ } catch (NumberFormatException e) {
+ }
+ }
+ if (a.length > 23) {
+ try {
+ mtu = Integer.parseInt(a[23]);
+ } catch (NumberFormatException e) {
+ }
+ }
+ if (a.length > 25) {
+ mvnoType = a[24];
+ mvnoMatchData = a[25];
+ }
+ if (a.length > 26) {
+ networkTypeBitmask = ServiceState.getBitmaskFromString(a[26]);
+ }
+ if (a.length > 27) {
+ apnSetId = Integer.parseInt(a[27]);
+ }
+ }
+
+ // If both bearerBitmask and networkTypeBitmask were specified, bearerBitmask would be
+ // ignored.
+ if (networkTypeBitmask == 0) {
+ networkTypeBitmask =
+ ServiceState.convertBearerBitmaskToNetworkTypeBitmask(bearerBitmask);
+ }
+ return makeApnSetting(-1, a[10] + a[11], a[0], a[1], a[2],
+ portFromString(a[3]), UriFromString(a[7]), a[8],
+ portFromString(a[9]), a[4], a[5], authType,
+ getApnTypesBitmaskFromString(TextUtils.join(",", typeArray)),
+ getProtocolIntFromString(protocol), getProtocolIntFromString(roamingProtocol),
+ carrierEnabled, networkTypeBitmask, profileId, modemCognitive, maxConns, waitTime,
+ maxConnsTime, mtu, getMvnoTypeIntFromString(mvnoType), mvnoMatchData, apnSetId);
+ }
+
+ /**
+ * Creates an array of ApnSetting objects from a string.
+ *
+ * @param data the string to read.
+ *
+ * Builds on top of the same format used by fromString, but allows for multiple entries
+ * separated by ";".
+ *
+ * @hide
+ */
+ public static List<ApnSetting> arrayFromString(String data) {
+ List<ApnSetting> retVal = new ArrayList<ApnSetting>();
+ if (TextUtils.isEmpty(data)) {
+ return retVal;
+ }
+ String[] apnStrings = data.split("\\s*;\\s*");
+ for (String apnString : apnStrings) {
+ ApnSetting apn = fromString(apnString);
+ if (apn != null) {
+ retVal.add(apn);
+ }
+ }
+ return retVal;
+ }
+
+ /**
+ * Returns the string representation of ApnSetting.
+ *
+ * This method prints null for unset elements. The output doesn't contain password or user.
+ * @hide
+ */
public String toString() {
StringBuilder sb = new StringBuilder();
- sb.append("[ApnSettingV4] ")
+ sb.append("[ApnSettingV5] ")
.append(mEntryName)
.append(", ").append(mId)
.append(", ").append(mOperatorNumeric)
.append(", ").append(mApnName)
- .append(", ").append(inetAddressToString(mProxyAddress))
+ .append(", ").append(mProxyAddress)
.append(", ").append(UriToString(mMmsc))
- .append(", ").append(inetAddressToString(mMmsProxyAddress))
+ .append(", ").append(mMmsProxyAddress)
.append(", ").append(portToString(mMmsProxyPort))
.append(", ").append(portToString(mProxyPort))
.append(", ").append(mAuthType).append(", ");
- final String[] types = deParseTypes(mApnTypeBitmask).split(",");
- sb.append(TextUtils.join(" | ", types)).append(", ");
- sb.append(", ").append(mProtocol);
- sb.append(", ").append(mRoamingProtocol);
+ final String[] types = getApnTypesStringFromBitmask(mApnTypeBitmask).split(",");
+ sb.append(TextUtils.join(" | ", types));
+ sb.append(", ").append(PROTOCOL_INT_MAP.get(mProtocol));
+ sb.append(", ").append(PROTOCOL_INT_MAP.get(mRoamingProtocol));
sb.append(", ").append(mCarrierEnabled);
sb.append(", ").append(mProfileId);
sb.append(", ").append(mModemCognitive);
@@ -691,10 +952,11 @@ public class ApnSetting implements Parcelable {
sb.append(", ").append(mWaitTime);
sb.append(", ").append(mMaxConnsTime);
sb.append(", ").append(mMtu);
- sb.append(", ").append(mMvnoType);
+ sb.append(", ").append(MVNO_TYPE_INT_MAP.get(mMvnoType));
sb.append(", ").append(mMvnoMatchData);
sb.append(", ").append(mPermanentFailed);
sb.append(", ").append(mNetworkTypeBitmask);
+ sb.append(", ").append(mApnSetId);
return sb.toString();
}
@@ -703,22 +965,34 @@ public class ApnSetting implements Parcelable {
* @hide
*/
public boolean hasMvnoParams() {
- return (mMvnoType != NOT_IN_MAP_INT) && !TextUtils.isEmpty(mMvnoMatchData);
+ return !TextUtils.isEmpty(getMvnoTypeStringFromInt(mMvnoType))
+ && !TextUtils.isEmpty(mMvnoMatchData);
+ }
+
+ private boolean hasApnType(int type) {
+ return (mApnTypeBitmask & type) == type;
}
/** @hide */
public boolean canHandleType(@ApnType int type) {
- return mCarrierEnabled && ((mApnTypeBitmask & type) == type);
+ if (!mCarrierEnabled) {
+ return false;
+ }
+ // DEFAULT can handle HIPRI.
+ if (hasApnType(type) || (type == TYPE_HIPRI && hasApnType(TYPE_DEFAULT))) {
+ return true;
+ }
+ return false;
}
- // check whether the types of two APN same (even only one type of each APN is same)
+ // Check whether the types of two APN same (even only one type of each APN is same).
private boolean typeSameAny(ApnSetting first, ApnSetting second) {
if (VDBG) {
StringBuilder apnType1 = new StringBuilder(first.mApnName + ": ");
- apnType1.append(deParseTypes(first.mApnTypeBitmask));
+ apnType1.append(getApnTypesStringFromBitmask(first.mApnTypeBitmask));
StringBuilder apnType2 = new StringBuilder(second.mApnName + ": ");
- apnType2.append(deParseTypes(second.mApnTypeBitmask));
+ apnType2.append(getApnTypesStringFromBitmask(second.mApnTypeBitmask));
Rlog.d(LOG_TAG, "APN1: is " + apnType1);
Rlog.d(LOG_TAG, "APN2: is " + apnType2);
@@ -738,7 +1012,7 @@ public class ApnSetting implements Parcelable {
}
// TODO - if we have this function we should also have hashCode.
- // Also should handle changes in type order and perhaps case-insensitivity
+ // Also should handle changes in type order and perhaps case-insensitivity.
/** @hide */
public boolean equals(Object o) {
if (o instanceof ApnSetting == false) {
@@ -771,7 +1045,8 @@ public class ApnSetting implements Parcelable {
&& Objects.equals(mMtu, other.mMtu)
&& Objects.equals(mMvnoType, other.mMvnoType)
&& Objects.equals(mMvnoMatchData, other.mMvnoMatchData)
- && Objects.equals(mNetworkTypeBitmask, other.mNetworkTypeBitmask);
+ && Objects.equals(mNetworkTypeBitmask, other.mNetworkTypeBitmask)
+ && Objects.equals(mApnSetId, other.mApnSetId);
}
/**
@@ -815,7 +1090,8 @@ public class ApnSetting implements Parcelable {
&& Objects.equals(mMaxConnsTime, other.mMaxConnsTime)
&& Objects.equals(mMtu, other.mMtu)
&& Objects.equals(mMvnoType, other.mMvnoType)
- && Objects.equals(mMvnoMatchData, other.mMvnoMatchData);
+ && Objects.equals(mMvnoMatchData, other.mMvnoMatchData)
+ && Objects.equals(mApnSetId, other.mApnSetId);
}
/**
@@ -831,7 +1107,7 @@ public class ApnSetting implements Parcelable {
&& Objects.equals(this.mApnName, other.mApnName)
&& !typeSameAny(this, other)
&& xorEquals(this.mProxyAddress, other.mProxyAddress)
- && xorEqualsPort(this.mProxyPort, other.mProxyPort)
+ && xorEqualsInt(this.mProxyPort, other.mProxyPort)
&& xorEquals(this.mProtocol, other.mProtocol)
&& xorEquals(this.mRoamingProtocol, other.mRoamingProtocol)
&& Objects.equals(this.mCarrierEnabled, other.mCarrierEnabled)
@@ -840,86 +1116,86 @@ public class ApnSetting implements Parcelable {
&& Objects.equals(this.mMvnoMatchData, other.mMvnoMatchData)
&& xorEquals(this.mMmsc, other.mMmsc)
&& xorEquals(this.mMmsProxyAddress, other.mMmsProxyAddress)
- && xorEqualsPort(this.mMmsProxyPort, other.mMmsProxyPort))
- && Objects.equals(this.mNetworkTypeBitmask, other.mNetworkTypeBitmask);
- }
-
- // Equal or one is not specified.
- private boolean xorEquals(String first, String second) {
- return (Objects.equals(first, second)
- || TextUtils.isEmpty(first)
- || TextUtils.isEmpty(second));
+ && xorEqualsInt(this.mMmsProxyPort, other.mMmsProxyPort))
+ && Objects.equals(this.mNetworkTypeBitmask, other.mNetworkTypeBitmask)
+ && Objects.equals(mApnSetId, other.mApnSetId);
}
- // Equal or one is not null.
+ // Equal or one is null.
private boolean xorEquals(Object first, Object second) {
return first == null || second == null || first.equals(second);
}
// Equal or one is not specified.
- private boolean xorEqualsPort(int first, int second) {
- return first == NO_PORT_SPECIFIED || second == NO_PORT_SPECIFIED
+ private boolean xorEqualsInt(int first, int second) {
+ return first == UNSPECIFIED_INT || second == UNSPECIFIED_INT
|| Objects.equals(first, second);
}
- private String deParseTypes(int apnTypeBitmask) {
- List<String> types = new ArrayList<>();
- for (Integer type : APN_TYPE_INT_MAP.keySet()) {
- if ((apnTypeBitmask & type) == type) {
- types.add(APN_TYPE_INT_MAP.get(type));
- }
- }
- return TextUtils.join(",", types);
- }
-
private String nullToEmpty(String stringValue) {
- return stringValue == null ? "" : stringValue;
+ return stringValue == null ? UNSPECIFIED_STRING : stringValue;
}
- /** @hide */
- // Called by DPM.
+ /**
+ * @hide
+ * Called by {@link android.app.admin.DevicePolicyManager} to convert this APN into
+ * ContentValue. If a field is not specified then we put "" instead of null.
+ */
public ContentValues toContentValues() {
ContentValues apnValue = new ContentValues();
apnValue.put(Telephony.Carriers.NUMERIC, nullToEmpty(mOperatorNumeric));
apnValue.put(Telephony.Carriers.NAME, nullToEmpty(mEntryName));
apnValue.put(Telephony.Carriers.APN, nullToEmpty(mApnName));
- apnValue.put(Telephony.Carriers.PROXY, mProxyAddress == null ? ""
- : inetAddressToString(mProxyAddress));
- apnValue.put(Telephony.Carriers.PORT, portToString(mProxyPort));
- apnValue.put(Telephony.Carriers.MMSC, mMmsc == null ? "" : UriToString(mMmsc));
- apnValue.put(Telephony.Carriers.MMSPORT, portToString(mMmsProxyPort));
- apnValue.put(Telephony.Carriers.MMSPROXY, mMmsProxyAddress == null
- ? "" : inetAddressToString(mMmsProxyAddress));
+ apnValue.put(Telephony.Carriers.PROXY, nullToEmpty(mProxyAddress));
+ apnValue.put(Telephony.Carriers.PORT, nullToEmpty(portToString(mProxyPort)));
+ apnValue.put(Telephony.Carriers.MMSC, nullToEmpty(UriToString(mMmsc)));
+ apnValue.put(Telephony.Carriers.MMSPORT, nullToEmpty(portToString(mMmsProxyPort)));
+ apnValue.put(Telephony.Carriers.MMSPROXY, nullToEmpty(
+ mMmsProxyAddress));
apnValue.put(Telephony.Carriers.USER, nullToEmpty(mUser));
apnValue.put(Telephony.Carriers.PASSWORD, nullToEmpty(mPassword));
apnValue.put(Telephony.Carriers.AUTH_TYPE, mAuthType);
- String apnType = deParseTypes(mApnTypeBitmask);
+ String apnType = getApnTypesStringFromBitmask(mApnTypeBitmask);
apnValue.put(Telephony.Carriers.TYPE, nullToEmpty(apnType));
apnValue.put(Telephony.Carriers.PROTOCOL,
- nullToEmpty(PROTOCOL_INT_MAP.get(mProtocol)));
+ getProtocolStringFromInt(mProtocol));
apnValue.put(Telephony.Carriers.ROAMING_PROTOCOL,
- nullToEmpty(PROTOCOL_INT_MAP.get(mRoamingProtocol)));
+ getProtocolStringFromInt(mRoamingProtocol));
apnValue.put(Telephony.Carriers.CARRIER_ENABLED, mCarrierEnabled);
- apnValue.put(Telephony.Carriers.MVNO_TYPE,
- nullToEmpty(MVNO_TYPE_INT_MAP.get(mMvnoType)));
+ apnValue.put(Telephony.Carriers.MVNO_TYPE, getMvnoTypeStringFromInt(mMvnoType));
apnValue.put(Telephony.Carriers.NETWORK_TYPE_BITMASK, mNetworkTypeBitmask);
return apnValue;
}
/**
- * @param types comma delimited list of APN types
- * @return bitmask of APN types
+ * @param apnTypeBitmask bitmask of APN types.
+ * @return comma delimited list of APN types.
* @hide
*/
- public static int parseTypes(String types) {
+ public static String getApnTypesStringFromBitmask(int apnTypeBitmask) {
+ List<String> types = new ArrayList<>();
+ for (Integer type : APN_TYPE_INT_MAP.keySet()) {
+ if ((apnTypeBitmask & type) == type) {
+ types.add(APN_TYPE_INT_MAP.get(type));
+ }
+ }
+ return TextUtils.join(",", types);
+ }
+
+ /**
+ * @param types comma delimited list of APN types.
+ * @return bitmask of APN types.
+ * @hide
+ */
+ public static int getApnTypesBitmaskFromString(String types) {
// If unset, set to ALL.
if (TextUtils.isEmpty(types)) {
- return TYPE_ALL_BUT_IA;
+ return TYPE_ALL;
} else {
int result = 0;
for (String str : types.split(",")) {
- Integer type = APN_TYPE_STRING_MAP.get(str);
+ Integer type = APN_TYPE_STRING_MAP.get(str.toLowerCase());
if (type != null) {
result |= type;
}
@@ -928,15 +1204,40 @@ public class ApnSetting implements Parcelable {
}
}
+ /** @hide */
+ public static int getMvnoTypeIntFromString(String mvnoType) {
+ Integer mvnoTypeInt = MVNO_TYPE_STRING_MAP.get(mvnoType);
+ return mvnoTypeInt == null ? UNSPECIFIED_INT : mvnoTypeInt;
+ }
+
+ /** @hide */
+ public static String getMvnoTypeStringFromInt(int mvnoType) {
+ String mvnoTypeString = MVNO_TYPE_INT_MAP.get(mvnoType);
+ return mvnoTypeString == null ? UNSPECIFIED_STRING : mvnoTypeString;
+ }
+
+ /** @hide */
+ public static int getProtocolIntFromString(String protocol) {
+ Integer protocolInt = PROTOCOL_STRING_MAP.get(protocol);
+ return protocolInt == null ? UNSPECIFIED_INT : protocolInt;
+ }
+
+ /** @hide */
+ public static String getProtocolStringFromInt(int protocol) {
+ String protocolString = PROTOCOL_INT_MAP.get(protocol);
+ return protocolString == null ? UNSPECIFIED_STRING : protocolString;
+ }
+
private static Uri UriFromString(String uri) {
return TextUtils.isEmpty(uri) ? null : Uri.parse(uri);
}
private static String UriToString(Uri uri) {
- return uri == null ? "" : uri.toString();
+ return uri == null ? null : uri.toString();
}
- private static InetAddress inetAddressFromString(String inetAddress) {
+ /** @hide */
+ public static InetAddress inetAddressFromString(String inetAddress) {
if (TextUtils.isEmpty(inetAddress)) {
return null;
}
@@ -948,7 +1249,8 @@ public class ApnSetting implements Parcelable {
}
}
- private static String inetAddressToString(InetAddress inetAddress) {
+ /** @hide */
+ public static String inetAddressToString(InetAddress inetAddress) {
if (inetAddress == null) {
return null;
}
@@ -965,7 +1267,7 @@ public class ApnSetting implements Parcelable {
}
private static int portFromString(String strPort) {
- int port = NO_PORT_SPECIFIED;
+ int port = UNSPECIFIED_INT;
if (!TextUtils.isEmpty(strPort)) {
try {
port = Integer.parseInt(strPort);
@@ -977,7 +1279,7 @@ public class ApnSetting implements Parcelable {
}
private static String portToString(int port) {
- return port == NO_PORT_SPECIFIED ? "" : Integer.toString(port);
+ return port == UNSPECIFIED_INT ? null : Integer.toString(port);
}
// Implement Parcelable.
@@ -994,10 +1296,10 @@ public class ApnSetting implements Parcelable {
dest.writeString(mOperatorNumeric);
dest.writeString(mEntryName);
dest.writeString(mApnName);
- dest.writeValue(mProxyAddress);
+ dest.writeString(mProxyAddress);
dest.writeInt(mProxyPort);
dest.writeValue(mMmsc);
- dest.writeValue(mMmsProxyAddress);
+ dest.writeString(mMmsProxyAddress);
dest.writeInt(mMmsProxyPort);
dest.writeString(mUser);
dest.writeString(mPassword);
@@ -1005,7 +1307,7 @@ public class ApnSetting implements Parcelable {
dest.writeInt(mApnTypeBitmask);
dest.writeInt(mProtocol);
dest.writeInt(mRoamingProtocol);
- dest.writeInt(mCarrierEnabled ? 1: 0);
+ dest.writeBoolean(mCarrierEnabled);
dest.writeInt(mMvnoType);
dest.writeInt(mNetworkTypeBitmask);
}
@@ -1015,10 +1317,10 @@ public class ApnSetting implements Parcelable {
final String operatorNumeric = in.readString();
final String entryName = in.readString();
final String apnName = in.readString();
- final InetAddress proxy = (InetAddress)in.readValue(InetAddress.class.getClassLoader());
+ final String proxy = in.readString();
final int port = in.readInt();
final Uri mmsc = (Uri)in.readValue(Uri.class.getClassLoader());
- final InetAddress mmsProxy = (InetAddress)in.readValue(InetAddress.class.getClassLoader());
+ final String mmsProxy = in.readString();
final int mmsPort = in.readInt();
final String user = in.readString();
final String password = in.readString();
@@ -1026,7 +1328,7 @@ public class ApnSetting implements Parcelable {
final int apnTypesBitmask = in.readInt();
final int protocol = in.readInt();
final int roamingProtocol = in.readInt();
- final boolean carrierEnabled = in.readInt() > 0;
+ final boolean carrierEnabled = in.readBoolean();
final int mvnoType = in.readInt();
final int networkTypeBitmask = in.readInt();
@@ -1049,10 +1351,6 @@ public class ApnSetting implements Parcelable {
}
};
- private static int nullToNotInMapInt(Integer value) {
- return value == null ? NOT_IN_MAP_INT : value;
- }
-
/**
* Provides a convenient way to set the fields of a {@link ApnSetting} when creating a new
* instance. The following settings are required to build an {@code ApnSetting}:
@@ -1089,19 +1387,19 @@ public class ApnSetting implements Parcelable {
public static class Builder{
private String mEntryName;
private String mApnName;
- private InetAddress mProxyAddress;
- private int mProxyPort = NO_PORT_SPECIFIED;
+ private String mProxyAddress;
+ private int mProxyPort = UNSPECIFIED_INT;
private Uri mMmsc;
- private InetAddress mMmsProxyAddress;
- private int mMmsProxyPort = NO_PORT_SPECIFIED;
+ private String mMmsProxyAddress;
+ private int mMmsProxyPort = UNSPECIFIED_INT;
private String mUser;
private String mPassword;
private int mAuthType;
private int mApnTypeBitmask;
private int mId;
private String mOperatorNumeric;
- private int mProtocol = NOT_IN_MAP_INT;
- private int mRoamingProtocol = NOT_IN_MAP_INT;
+ private int mProtocol = UNSPECIFIED_INT;
+ private int mRoamingProtocol = UNSPECIFIED_INT;
private int mMtu;
private int mNetworkTypeBitmask;
private boolean mCarrierEnabled;
@@ -1110,8 +1408,9 @@ public class ApnSetting implements Parcelable {
private int mMaxConns;
private int mWaitTime;
private int mMaxConnsTime;
- private int mMvnoType = NOT_IN_MAP_INT;
+ private int mMvnoType = UNSPECIFIED_INT;
private String mMvnoMatchData;
+ private int mApnSetId;
/**
* Default constructor for Builder.
@@ -1206,6 +1505,17 @@ public class ApnSetting implements Parcelable {
}
/**
+ * Sets the APN set id for the APN.
+ *
+ * @param apnSetId the set id for the APN
+ * @hide
+ */
+ public Builder setApnSetId(int apnSetId) {
+ this.mApnSetId = apnSetId;
+ return this;
+ }
+
+ /**
* Sets a human-readable name that describes the APN.
*
* @param entryName the entry name to set for the APN
@@ -1237,8 +1547,20 @@ public class ApnSetting implements Parcelable {
* hostname and a dummy IP address. See {@link ApnSetting.Builder above} for an example.
*
* @param proxy the proxy address to set for the APN
+ * @deprecated use {@link #setProxyAddress(String)} instead.
*/
+ @Deprecated
public Builder setProxyAddress(InetAddress proxy) {
+ this.mProxyAddress = inetAddressToString(proxy);
+ return this;
+ }
+
+ /**
+ * Sets the proxy address of the APN.
+ *
+ * @param proxy the proxy address to set for the APN
+ */
+ public Builder setProxyAddress(String proxy) {
this.mProxyAddress = proxy;
return this;
}
@@ -1276,8 +1598,20 @@ public class ApnSetting implements Parcelable {
* hostname and a dummy IP address. See {@link ApnSetting.Builder above} for an example.
*
* @param mmsProxy the MMS proxy address to set for the APN
+ * @deprecated use {@link #setMmsProxyAddress(String)} instead.
*/
+ @Deprecated
public Builder setMmsProxyAddress(InetAddress mmsProxy) {
+ this.mMmsProxyAddress = inetAddressToString(mmsProxy);
+ return this;
+ }
+
+ /**
+ * Sets the MMS proxy address of the APN.
+ *
+ * @param mmsProxy the MMS proxy address to set for the APN
+ */
+ public Builder setMmsProxyAddress(String mmsProxy) {
this.mMmsProxyAddress = mmsProxy;
return this;
}
@@ -1419,5 +1753,15 @@ public class ApnSetting implements Parcelable {
}
return new ApnSetting(this);
}
+
+ /**
+ * Builds {@link ApnSetting} from this builder. This function doesn't check if
+ * {@link #setApnName(String)} or {@link #setEntryName(String)}, or
+ * {@link #setApnTypeBitmask(int)} is empty.
+ * @hide
+ */
+ public ApnSetting buildWithoutCheck() {
+ return new ApnSetting(this);
+ }
}
}
diff --git a/telephony/java/android/telephony/data/DataCallResponse.java b/telephony/java/android/telephony/data/DataCallResponse.java
index acc247047d10..25f51333350b 100644
--- a/telephony/java/android/telephony/data/DataCallResponse.java
+++ b/telephony/java/android/telephony/data/DataCallResponse.java
@@ -19,6 +19,7 @@ package android.telephony.data;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.net.LinkAddress;
import android.os.Parcel;
import android.os.Parcelable;
@@ -33,6 +34,7 @@ import java.util.Objects;
*
* @hide
*/
+@SystemApi
public final class DataCallResponse implements Parcelable {
private final int mStatus;
private final int mSuggestedRetryTime;
diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java
index dd274c5623be..e8597b221391 100644
--- a/telephony/java/android/telephony/data/DataProfile.java
+++ b/telephony/java/android/telephony/data/DataProfile.java
@@ -16,6 +16,7 @@
package android.telephony.data;
+import android.annotation.SystemApi;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
@@ -29,6 +30,7 @@ import com.android.internal.telephony.RILConstants;
*
* @hide
*/
+@SystemApi
public final class DataProfile implements Parcelable {
// The types indicating the data profile is used on GSM (3GPP) or CDMA (3GPP2) network.
diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java
index 0835f7d9646e..1db58506bb1c 100644
--- a/telephony/java/android/telephony/data/DataService.java
+++ b/telephony/java/android/telephony/data/DataService.java
@@ -20,6 +20,7 @@ import android.annotation.CallSuper;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.app.Service;
import android.content.Intent;
import android.net.LinkProperties;
@@ -43,17 +44,18 @@ import java.util.List;
/**
* Base class of data service. Services that extend DataService must register the service in
* their AndroidManifest to be detected by the framework. They must be protected by the permission
- * "android.permission.BIND_DATA_SERVICE". The data service definition in the manifest must follow
- * the following format:
+ * "android.permission.BIND_TELEPHONY_DATA_SERVICE". The data service definition in the manifest
+ * must follow the following format:
* ...
* <service android:name=".xxxDataService"
- * android:permission="android.permission.BIND_DATA_SERVICE" >
+ * android:permission="android.permission.BIND_TELEPHONY_DATA_SERVICE" >
* <intent-filter>
* <action android:name="android.telephony.data.DataService" />
* </intent-filter>
* </service>
* @hide
*/
+@SystemApi
public abstract class DataService extends Service {
private static final String TAG = DataService.class.getSimpleName();
diff --git a/telephony/java/android/telephony/data/DataServiceCallback.java b/telephony/java/android/telephony/data/DataServiceCallback.java
index bff826086e39..4af31b5e5346 100644
--- a/telephony/java/android/telephony/data/DataServiceCallback.java
+++ b/telephony/java/android/telephony/data/DataServiceCallback.java
@@ -17,6 +17,7 @@
package android.telephony.data;
import android.annotation.IntDef;
+import android.annotation.SystemApi;
import android.net.LinkProperties;
import android.os.RemoteException;
import android.telephony.Rlog;
@@ -34,6 +35,7 @@ import java.util.List;
*
* @hide
*/
+@SystemApi
public class DataServiceCallback {
private static final String TAG = DataServiceCallback.class.getSimpleName();
@@ -123,6 +125,7 @@ public class DataServiceCallback {
*
* @param result The result code. Must be one of the {@link ResultCode}.
*/
+ @SystemApi
public void onSetDataProfileComplete(@ResultCode int result) {
IDataServiceCallback callback = mCallback.get();
if (callback != null) {
diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java
index ea4b9ecc837c..232d02cd3d4a 100644
--- a/telephony/java/android/telephony/ims/ImsReasonInfo.java
+++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java
@@ -415,7 +415,6 @@ public final class ImsReasonInfo implements Parcelable {
* The rejection cause is not known.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_UNKNOWN = 1600;
@@ -423,7 +422,6 @@ public final class ImsReasonInfo implements Parcelable {
* Ongoing call, and call waiting is disabled.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_ONGOING_CALL_WAITING_DISABLED = 1601;
@@ -431,7 +429,6 @@ public final class ImsReasonInfo implements Parcelable {
* A call is ongoing on another sub.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_CALL_ON_OTHER_SUB = 1602;
@@ -439,7 +436,6 @@ public final class ImsReasonInfo implements Parcelable {
* CDMA call collision.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_1X_COLLISION = 1603;
@@ -447,7 +443,6 @@ public final class ImsReasonInfo implements Parcelable {
* IMS is not registered for service yet.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_SERVICE_NOT_REGISTERED = 1604;
@@ -455,7 +450,6 @@ public final class ImsReasonInfo implements Parcelable {
* The call type is not allowed on the current RAT.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_CALL_TYPE_NOT_ALLOWED = 1605;
@@ -463,7 +457,6 @@ public final class ImsReasonInfo implements Parcelable {
* And emergency call is ongoing.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_ONGOING_E911_CALL = 1606;
@@ -471,7 +464,6 @@ public final class ImsReasonInfo implements Parcelable {
* Another call is in the process of being establilshed.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_ONGOING_CALL_SETUP = 1607;
@@ -479,7 +471,6 @@ public final class ImsReasonInfo implements Parcelable {
* Maximum number of allowed calls are already in progress.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_MAX_CALL_LIMIT_REACHED = 1608;
@@ -487,7 +478,6 @@ public final class ImsReasonInfo implements Parcelable {
* Invalid/unsupported SIP headers received.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_UNSUPPORTED_SIP_HEADERS = 1609;
@@ -495,7 +485,6 @@ public final class ImsReasonInfo implements Parcelable {
* Invalid/unsupported SDP headers received.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_UNSUPPORTED_SDP_HEADERS = 1610;
@@ -503,7 +492,6 @@ public final class ImsReasonInfo implements Parcelable {
* A call transfer is in progress.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_ONGOING_CALL_TRANSFER = 1611;
@@ -511,7 +499,6 @@ public final class ImsReasonInfo implements Parcelable {
* An internal error occured while processing the call.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_INTERNAL_ERROR = 1612;
@@ -519,7 +506,6 @@ public final class ImsReasonInfo implements Parcelable {
* Call failure due to lack of dedicated bearer.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_QOS_FAILURE = 1613;
@@ -527,7 +513,6 @@ public final class ImsReasonInfo implements Parcelable {
* A call handover is in progress.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_ONGOING_HANDOVER = 1614;
@@ -535,7 +520,6 @@ public final class ImsReasonInfo implements Parcelable {
* Video calling not supported with TTY.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_VT_TTY_NOT_ALLOWED = 1615;
@@ -543,7 +527,6 @@ public final class ImsReasonInfo implements Parcelable {
* A call upgrade is in progress.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_ONGOING_CALL_UPGRADE = 1616;
@@ -551,7 +534,6 @@ public final class ImsReasonInfo implements Parcelable {
* Call from conference server, when TTY mode is ON.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_CONFERENCE_TTY_NOT_ALLOWED = 1617;
@@ -559,7 +541,6 @@ public final class ImsReasonInfo implements Parcelable {
* A conference call is ongoing.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_ONGOING_CONFERENCE_CALL = 1618;
@@ -567,7 +548,6 @@ public final class ImsReasonInfo implements Parcelable {
* A video call with AVPF is not supported.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_VT_AVPF_NOT_ALLOWED = 1619;
@@ -575,7 +555,6 @@ public final class ImsReasonInfo implements Parcelable {
* And encrypted call is ongoing; other calls not supported.
* <p>
* Used with implicit call rejection.
- * @hide
*/
public static final int CODE_REJECT_ONGOING_ENCRYPTED_CALL = 1620;
@@ -583,8 +562,7 @@ public final class ImsReasonInfo implements Parcelable {
* A CS call is ongoing.
* <p>
* Used with implicit call rejection.
- * @hide
- */
+ */
public static final int CODE_REJECT_ONGOING_CS_CALL = 1621;
/* OEM specific error codes. To be used by OEMs when they don't want to
diff --git a/telephony/java/android/telephony/ims/aidl/IImsMmTelListener.aidl b/telephony/java/android/telephony/ims/aidl/IImsMmTelListener.aidl
index b0d04e094b44..7bbe30a444b9 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsMmTelListener.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsMmTelListener.aidl
@@ -31,4 +31,4 @@ oneway interface IImsMmTelListener {
void onIncomingCall(IImsCallSession c, in Bundle extras);
void onRejectedCall(in ImsCallProfile callProfile, in ImsReasonInfo reason);
void onVoiceMessageCountUpdate(int count);
-} \ No newline at end of file
+}
diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java
index d53769907342..b77881e29f1e 100644
--- a/telephony/java/android/telephony/ims/feature/ImsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java
@@ -341,15 +341,15 @@ public abstract class ImsFeature {
}
}
+ /** @hide */
+ protected Context mContext;
+ /** @hide */
+ protected final Object mLock = new Object();
+
private final Set<IImsFeatureStatusCallback> mStatusCallbacks = Collections.newSetFromMap(
new WeakHashMap<IImsFeatureStatusCallback, Boolean>());
private @ImsState int mState = STATE_UNAVAILABLE;
private int mSlotId = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
- /**
- * @hide
- */
- protected Context mContext;
- private final Object mLock = new Object();
private final RemoteCallbackList<IImsCapabilityCallback> mCapabilityCallbacks
= new RemoteCallbackList<>();
private Capabilities mCapabilityStatus = new Capabilities();
diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
index 5aeaee76841d..6c7a11bca1e8 100644
--- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java
+++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
@@ -22,25 +22,26 @@ import android.os.Bundle;
import android.os.Message;
import android.os.RemoteException;
import android.telecom.TelecomManager;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
-import android.telephony.ims.stub.ImsCallSessionImplBase;
-import android.telephony.ims.stub.ImsSmsImplBase;
+import android.telephony.ims.ImsCallProfile;
+import android.telephony.ims.ImsCallSession;
+import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsMmTelFeature;
import android.telephony.ims.aidl.IImsMmTelListener;
import android.telephony.ims.aidl.IImsSmsListener;
+import android.telephony.ims.stub.ImsCallSessionImplBase;
import android.telephony.ims.stub.ImsEcbmImplBase;
import android.telephony.ims.stub.ImsMultiEndpointImplBase;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.telephony.ims.stub.ImsSmsImplBase;
import android.telephony.ims.stub.ImsUtImplBase;
import android.util.Log;
-import android.telephony.ims.ImsCallProfile;
import android.telephony.ims.ImsReasonInfo;
import com.android.ims.internal.IImsCallSession;
import com.android.ims.internal.IImsEcbm;
import com.android.ims.internal.IImsMultiEndpoint;
import com.android.ims.internal.IImsUt;
-import android.telephony.ims.ImsCallSession;
import com.android.internal.annotations.VisibleForTesting;
import java.lang.annotation.Retention;
@@ -61,20 +62,16 @@ public class MmTelFeature extends ImsFeature {
private final IImsMmTelFeature mImsMMTelBinder = new IImsMmTelFeature.Stub() {
@Override
- public void setListener(IImsMmTelListener l) throws RemoteException {
- synchronized (mLock) {
- MmTelFeature.this.setListener(l);
- }
+ public void setListener(IImsMmTelListener l) {
+ MmTelFeature.this.setListener(l);
}
@Override
public int getFeatureState() throws RemoteException {
- synchronized (mLock) {
- try {
- return MmTelFeature.this.getFeatureState();
- } catch (Exception e) {
- throw new RemoteException(e.getMessage());
- }
+ try {
+ return MmTelFeature.this.getFeatureState();
+ } catch (Exception e) {
+ throw new RemoteException(e.getMessage());
}
}
@@ -138,10 +135,8 @@ public class MmTelFeature extends ImsFeature {
}
@Override
- public int queryCapabilityStatus() throws RemoteException {
- synchronized (mLock) {
- return MmTelFeature.this.queryCapabilityStatus().mCapabilities;
- }
+ public int queryCapabilityStatus() {
+ return MmTelFeature.this.queryCapabilityStatus().mCapabilities;
}
@Override
@@ -158,7 +153,7 @@ public class MmTelFeature extends ImsFeature {
@Override
public void changeCapabilitiesConfiguration(CapabilityChangeRequest request,
- IImsCapabilityCallback c) throws RemoteException {
+ IImsCapabilityCallback c) {
synchronized (mLock) {
MmTelFeature.this.requestChangeEnabledCapabilities(request, c);
}
@@ -173,10 +168,8 @@ public class MmTelFeature extends ImsFeature {
}
@Override
- public void setSmsListener(IImsSmsListener l) throws RemoteException {
- synchronized (mLock) {
- MmTelFeature.this.setSmsListener(l);
- }
+ public void setSmsListener(IImsSmsListener l) {
+ MmTelFeature.this.setSmsListener(l);
}
@Override
@@ -364,9 +357,6 @@ public class MmTelFeature extends ImsFeature {
@Retention(RetentionPolicy.SOURCE)
public @interface ProcessCallResult {}
-
- // Lock for feature synchronization
- private final Object mLock = new Object();
private IImsMmTelListener mListener;
/**
@@ -376,9 +366,9 @@ public class MmTelFeature extends ImsFeature {
private void setListener(IImsMmTelListener listener) {
synchronized (mLock) {
mListener = listener;
- }
- if (mListener != null) {
- onFeatureReady();
+ if (mListener != null) {
+ onFeatureReady();
+ }
}
}
@@ -439,6 +429,26 @@ public class MmTelFeature extends ImsFeature {
}
/**
+ * Notify the framework that a call has been implicitly rejected by this MmTelFeature
+ * during call setup.
+ * @param callProfile The {@link ImsCallProfile} IMS call profile with details.
+ * This can be null if no call information is available for the rejected call.
+ * @param reason The {@link ImsReasonInfo} call rejection reason.
+ */
+ public final void notifyRejectedCall(ImsCallProfile callProfile, ImsReasonInfo reason) {
+ synchronized (mLock) {
+ if (mListener == null) {
+ throw new IllegalStateException("Session is not available.");
+ }
+ try {
+ mListener.onRejectedCall(callProfile, reason);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ /**
*
* @hide
*/
diff --git a/telephony/java/com/android/internal/telephony/CarrierAppUtils.java b/telephony/java/com/android/internal/telephony/CarrierAppUtils.java
index bcad554b579f..a1bea4d417f9 100644
--- a/telephony/java/com/android/internal/telephony/CarrierAppUtils.java
+++ b/telephony/java/com/android/internal/telephony/CarrierAppUtils.java
@@ -21,7 +21,6 @@ import android.content.ContentResolver;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
-import android.content.res.Resources;
import android.os.RemoteException;
import android.provider.Settings;
import android.telephony.TelephonyManager;
@@ -145,6 +144,18 @@ public final class CarrierAppUtils {
telephonyManager.checkCarrierPrivilegesForPackageAnyPhone(packageName) ==
TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
+ // add hiddenUntilInstalled flag for carrier apps and associated apps
+ packageManager.setSystemAppHiddenUntilInstalled(packageName, true);
+ List<ApplicationInfo> associatedAppList = associatedApps.get(packageName);
+ if (associatedAppList != null) {
+ for (ApplicationInfo associatedApp : associatedAppList) {
+ packageManager.setSystemAppHiddenUntilInstalled(
+ associatedApp.packageName,
+ true
+ );
+ }
+ }
+
if (hasPrivileges) {
// Only update enabled state for the app on /system. Once it has been
// updated we shouldn't touch it.
@@ -152,9 +163,14 @@ public final class CarrierAppUtils {
&& (ai.enabledSetting ==
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
|| ai.enabledSetting ==
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED)) {
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
+ || (ai.flags & ApplicationInfo.FLAG_INSTALLED) == 0)) {
Slog.i(TAG, "Update state(" + packageName + "): ENABLED for user "
+ userId);
+ packageManager.setSystemAppInstallState(
+ packageName,
+ true /*installed*/,
+ userId);
packageManager.setApplicationEnabledSetting(
packageName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
@@ -164,15 +180,20 @@ public final class CarrierAppUtils {
}
// Also enable any associated apps for this carrier app.
- List<ApplicationInfo> associatedAppList = associatedApps.get(packageName);
if (associatedAppList != null) {
for (ApplicationInfo associatedApp : associatedAppList) {
if (associatedApp.enabledSetting ==
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
|| associatedApp.enabledSetting ==
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
+ || (associatedApp.flags
+ & ApplicationInfo.FLAG_INSTALLED) == 0) {
Slog.i(TAG, "Update associated state(" + associatedApp.packageName
+ "): ENABLED for user " + userId);
+ packageManager.setSystemAppInstallState(
+ associatedApp.packageName,
+ true /*installed*/,
+ userId);
packageManager.setApplicationEnabledSetting(
associatedApp.packageName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
@@ -190,36 +211,33 @@ public final class CarrierAppUtils {
// updated we shouldn't touch it.
if (!ai.isUpdatedSystemApp()
&& ai.enabledSetting ==
- PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
+ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
+ && (ai.flags & ApplicationInfo.FLAG_INSTALLED) != 0) {
Slog.i(TAG, "Update state(" + packageName
+ "): DISABLED_UNTIL_USED for user " + userId);
- packageManager.setApplicationEnabledSetting(
+ packageManager.setSystemAppInstallState(
packageName,
- PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED,
- 0,
- userId,
- callingPackage);
+ false /*installed*/,
+ userId);
}
// Also disable any associated apps for this carrier app if this is the first
// run. We avoid doing this a second time because it is brittle to rely on the
// distinction between "default" and "enabled".
if (!hasRunOnce) {
- List<ApplicationInfo> associatedAppList = associatedApps.get(packageName);
if (associatedAppList != null) {
for (ApplicationInfo associatedApp : associatedAppList) {
if (associatedApp.enabledSetting
- == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
+ == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
+ && (associatedApp.flags
+ & ApplicationInfo.FLAG_INSTALLED) != 0) {
Slog.i(TAG,
"Update associated state(" + associatedApp.packageName
+ "): DISABLED_UNTIL_USED for user " + userId);
- packageManager.setApplicationEnabledSetting(
+ packageManager.setSystemAppInstallState(
associatedApp.packageName,
- PackageManager
- .COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED,
- 0,
- userId,
- callingPackage);
+ false /*installed*/,
+ userId);
}
}
}
@@ -357,7 +375,8 @@ public final class CarrierAppUtils {
String packageName) {
try {
ApplicationInfo ai = packageManager.getApplicationInfo(packageName,
- PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS, userId);
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
+ | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS, userId);
if (ai != null && ai.isSystemApp()) {
return ai;
}
diff --git a/telephony/java/com/android/internal/telephony/DcParamObject.java b/telephony/java/com/android/internal/telephony/DcParamObject.java
deleted file mode 100644
index fc6b61061134..000000000000
--- a/telephony/java/com/android/internal/telephony/DcParamObject.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2014 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.telephony;
-
-import android.os.Parcelable;
-import android.os.Parcel;
-
-public class DcParamObject implements Parcelable {
-
- private int mSubId;
-
- public DcParamObject(int subId) {
- mSubId = subId;
- }
-
- public DcParamObject(Parcel in) {
- readFromParcel(in);
- }
-
- public int describeContents() {
- return 0;
- }
-
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mSubId);
- }
-
- private void readFromParcel(Parcel in) {
- mSubId = in.readInt();
- }
-
- public static final Parcelable.Creator<DcParamObject> CREATOR = new Parcelable.Creator<DcParamObject>() {
- public DcParamObject createFromParcel(Parcel in) {
- return new DcParamObject(in);
- }
- public DcParamObject[] newArray(int size) {
- return new DcParamObject[size];
- }
- };
-
- public int getSubId() {
- return mSubId;
- }
-}
diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java
index d999c13bb37f..86cb1b74abd3 100644
--- a/telephony/java/com/android/internal/telephony/DctConstants.java
+++ b/telephony/java/com/android/internal/telephony/DctConstants.java
@@ -63,34 +63,25 @@ public class DctConstants {
public static final int EVENT_RADIO_AVAILABLE = BASE + 1;
public static final int EVENT_RECORDS_LOADED = BASE + 2;
public static final int EVENT_TRY_SETUP_DATA = BASE + 3;
- public static final int EVENT_DATA_STATE_CHANGED = BASE + 4;
- public static final int EVENT_POLL_PDP = BASE + 5;
public static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = BASE + 6;
public static final int EVENT_VOICE_CALL_STARTED = BASE + 7;
public static final int EVENT_VOICE_CALL_ENDED = BASE + 8;
public static final int EVENT_DATA_CONNECTION_DETACHED = BASE + 9;
- public static final int EVENT_LINK_STATE_CHANGED = BASE + 10;
public static final int EVENT_ROAMING_ON = BASE + 11;
public static final int EVENT_ROAMING_OFF = BASE + 12;
public static final int EVENT_ENABLE_NEW_APN = BASE + 13;
- public static final int EVENT_RESTORE_DEFAULT_APN = BASE + 14;
public static final int EVENT_DISCONNECT_DONE = BASE + 15;
public static final int EVENT_DATA_CONNECTION_ATTACHED = BASE + 16;
public static final int EVENT_DATA_STALL_ALARM = BASE + 17;
public static final int EVENT_DO_RECOVERY = BASE + 18;
public static final int EVENT_APN_CHANGED = BASE + 19;
- public static final int EVENT_CDMA_DATA_DETACHED = BASE + 20;
- public static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED = BASE + 21;
public static final int EVENT_PS_RESTRICT_ENABLED = BASE + 22;
public static final int EVENT_PS_RESTRICT_DISABLED = BASE + 23;
public static final int EVENT_CLEAN_UP_CONNECTION = BASE + 24;
- public static final int EVENT_CDMA_OTA_PROVISION = BASE + 25;
public static final int EVENT_RESTART_RADIO = BASE + 26;
public static final int EVENT_SET_INTERNAL_DATA_ENABLE = BASE + 27;
- public static final int EVENT_RESET_DONE = BASE + 28;
public static final int EVENT_CLEAN_UP_ALL_CONNECTIONS = BASE + 29;
public static final int CMD_SET_USER_DATA_ENABLE = BASE + 30;
- public static final int CMD_SET_DEPENDENCY_MET = BASE + 31;
public static final int CMD_SET_POLICY_DATA_ENABLE = BASE + 32;
public static final int EVENT_ICC_CHANGED = BASE + 33;
public static final int EVENT_DISCONNECT_DC_RETRYING = BASE + 34;
@@ -112,19 +103,6 @@ public class DctConstants {
/***** Constants *****/
- public static final int APN_INVALID_ID = -1;
- public static final int APN_DEFAULT_ID = 0;
- public static final int APN_MMS_ID = 1;
- public static final int APN_SUPL_ID = 2;
- public static final int APN_DUN_ID = 3;
- public static final int APN_HIPRI_ID = 4;
- public static final int APN_IMS_ID = 5;
- public static final int APN_FOTA_ID = 6;
- public static final int APN_CBS_ID = 7;
- public static final int APN_IA_ID = 8;
- public static final int APN_EMERGENCY_ID = 9;
- public static final int APN_NUM_TYPES = 10;
-
public static final int INVALID = -1;
public static final int DISABLED = 0;
public static final int ENABLED = 1;
diff --git a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
index 511573170bb0..d9471ae2c60d 100644
--- a/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
+++ b/telephony/java/com/android/internal/telephony/ICarrierConfigLoader.aidl
@@ -23,7 +23,7 @@ import android.os.PersistableBundle;
*/
interface ICarrierConfigLoader {
- PersistableBundle getConfigForSubId(int subId);
+ PersistableBundle getConfigForSubId(int subId, String callingPackage);
void notifyConfigChangedForSubId(int subId);
diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
index 93964f3d30a6..abcb15ae4d50 100644
--- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
@@ -125,16 +125,6 @@ interface IPhoneSubInfo {
String getVoiceMailNumberForSubscriber(int subId, String callingPackage);
/**
- * Retrieves the complete voice mail number.
- */
- String getCompleteVoiceMailNumber();
-
- /**
- * Retrieves the complete voice mail number for particular subId
- */
- String getCompleteVoiceMailNumberForSubscriber(int subId);
-
- /**
* Retrieves the Carrier information used to encrypt IMSI and IMPI.
*/
ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int subId, int keyType,
diff --git a/telephony/java/com/android/internal/telephony/ISmsBaseImpl.java b/telephony/java/com/android/internal/telephony/ISmsBaseImpl.java
index 2dd353914b9b..cc1d105ae29e 100644
--- a/telephony/java/com/android/internal/telephony/ISmsBaseImpl.java
+++ b/telephony/java/com/android/internal/telephony/ISmsBaseImpl.java
@@ -1,101 +1,90 @@
-/*
- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+/* Copyright (C) 2018 The Android Open Source Project
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
+ * 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.
*
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.android.internal.telephony;
import android.app.PendingIntent;
import android.net.Uri;
-import android.os.RemoteException;
+import java.lang.UnsupportedOperationException;
import java.util.List;
public class ISmsBaseImpl extends ISms.Stub {
@Override
- public List<SmsRawData> getAllMessagesFromIccEfForSubscriber(int subId, String callingPkg)
- throws android.os.RemoteException {
- throw new RemoteException();
+ public List<SmsRawData> getAllMessagesFromIccEfForSubscriber(int subId, String callingPkg) {
+ throw new UnsupportedOperationException();
}
@Override
public boolean updateMessageOnIccEfForSubscriber(int subId, String callingPkg,
- int messageIndex, int newStatus, byte[] pdu) throws android.os.RemoteException {
- throw new RemoteException();
+ int messageIndex, int newStatus, byte[] pdu) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public boolean copyMessageToIccEfForSubscriber(int subId, String callingPkg, int status,
- byte[] pdu, byte[] smsc) throws android.os.RemoteException {
- throw new RemoteException();
+ byte[] pdu, byte[] smsc) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void sendDataForSubscriber(int subId, String callingPkg, String destAddr,
String scAddr, int destPort, byte[] data, PendingIntent sentIntent,
- PendingIntent deliveryIntent) throws android.os.RemoteException {
- throw new RemoteException();
+ PendingIntent deliveryIntent) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void sendDataForSubscriberWithSelfPermissions(int subId, String callingPkg,
String destAddr, String scAddr, int destPort, byte[] data,
- PendingIntent sentIntent, PendingIntent deliveryIntent) throws android.os.RemoteException {
- throw new RemoteException();
+ PendingIntent sentIntent, PendingIntent deliveryIntent)
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void sendTextForSubscriber(int subId, String callingPkg, String destAddr,
String scAddr, String text, PendingIntent sentIntent,
PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp)
- throws android.os.RemoteException {
- throw new RemoteException();
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void sendTextForSubscriberWithSelfPermissions(int subId, String callingPkg,
String destAddr, String scAddr, String text, PendingIntent sentIntent,
- PendingIntent deliveryIntent, boolean persistMessage) throws android.os.RemoteException {
- throw new RemoteException();
+ PendingIntent deliveryIntent, boolean persistMessage)
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void sendTextForSubscriberWithOptions(int subId, String callingPkg, String destAddr,
String scAddr, String text, PendingIntent sentIntent,
PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp,
- int priority, boolean expectMore, int validityPeriod) throws android.os.RemoteException {
- throw new RemoteException();
+ int priority, boolean expectMore, int validityPeriod)
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void injectSmsPduForSubscriber(
int subId, byte[] pdu, String format, PendingIntent receivedIntent)
- throws android.os.RemoteException {
- throw new RemoteException();
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
@@ -103,8 +92,8 @@ public class ISmsBaseImpl extends ISms.Stub {
String destinationAddress, String scAddress,
List<String> parts, List<PendingIntent> sentIntents,
List<PendingIntent> deliveryIntents, boolean persistMessageForNonDefaultSmsApp)
- throws android.os.RemoteException {
- throw new RemoteException();
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
@@ -112,102 +101,99 @@ public class ISmsBaseImpl extends ISms.Stub {
String destinationAddress, String scAddress,
List<String> parts, List<PendingIntent> sentIntents,
List<PendingIntent> deliveryIntents, boolean persistMessageForNonDefaultSmsApp,
- int priority, boolean expectMore, int validityPeriod) throws android.os.RemoteException {
- throw new RemoteException();
+ int priority, boolean expectMore, int validityPeriod)
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public boolean enableCellBroadcastForSubscriber(int subId, int messageIdentifier, int ranType)
- throws android.os.RemoteException {
- throw new RemoteException();
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public boolean disableCellBroadcastForSubscriber(int subId, int messageIdentifier, int ranType)
- throws android.os.RemoteException {
- throw new RemoteException();
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public boolean enableCellBroadcastRangeForSubscriber(int subId, int startMessageId,
- int endMessageId, int ranType) throws android.os.RemoteException {
- throw new RemoteException();
+ int endMessageId, int ranType) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public boolean disableCellBroadcastRangeForSubscriber(int subId, int startMessageId,
- int endMessageId, int ranType) throws android.os.RemoteException {
- throw new RemoteException();
+ int endMessageId, int ranType) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
- public int getPremiumSmsPermission(String packageName) throws android.os.RemoteException {
- throw new RemoteException();
+ public int getPremiumSmsPermission(String packageName) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
- public int getPremiumSmsPermissionForSubscriber(int subId, String packageName) throws android.os.RemoteException {
- throw new RemoteException();
+ public int getPremiumSmsPermissionForSubscriber(int subId, String packageName)
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
- public void setPremiumSmsPermission(String packageName, int permission) throws android.os.RemoteException {
- throw new RemoteException();
+ public void setPremiumSmsPermission(String packageName, int permission) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void setPremiumSmsPermissionForSubscriber(int subId, String packageName,
- int permission) throws android.os.RemoteException {
- throw new RemoteException();
+ int permission) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
- public boolean isImsSmsSupportedForSubscriber(int subId) throws android.os.RemoteException {
- throw new RemoteException();
+ public boolean isImsSmsSupportedForSubscriber(int subId) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
- public boolean isSmsSimPickActivityNeeded(int subId) throws android.os.RemoteException {
- throw new RemoteException();
+ public boolean isSmsSimPickActivityNeeded(int subId) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
- public int getPreferredSmsSubscription() throws android.os.RemoteException {
- throw new RemoteException();
+ public int getPreferredSmsSubscription() throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
- public String getImsSmsFormatForSubscriber(int subId) throws android.os.RemoteException {
- throw new RemoteException();
+ public String getImsSmsFormatForSubscriber(int subId) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
- public boolean isSMSPromptEnabled() throws android.os.RemoteException {
- throw new RemoteException();
+ public boolean isSMSPromptEnabled() throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void sendStoredText(int subId, String callingPkg, Uri messageUri, String scAddress,
PendingIntent sentIntent, PendingIntent deliveryIntent)
- throws android.os.RemoteException {
- throw new RemoteException();
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public void sendStoredMultipartText(int subId, String callingPkg, Uri messageUri,
String scAddress, List<PendingIntent> sentIntents,
- List<PendingIntent> deliveryIntents) throws android.os.RemoteException {
- throw new RemoteException();
+ List<PendingIntent> deliveryIntents) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
@Override
public String createAppSpecificSmsToken(int subId, String callingPkg, PendingIntent intent)
- throws android.os.RemoteException {
- throw new RemoteException();
- }
-
- @Override
- public int getSmsCapacityOnIccForSubscriber(int subId) throws android.os.RemoteException {
- throw new RemoteException();
+ throws UnsupportedOperationException {
+ throw new UnsupportedOperationException();
}
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 639dd74e974e..d850fbc471ab 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -623,12 +623,6 @@ interface ITelephony {
void setCellInfoListRate(int rateInMillis);
/**
- * get default sim
- * @return sim id
- */
- int getDefaultSim();
-
- /**
* Opens a logical channel to the ICC card.
*
* Input parameters equivalent to TS 27.007 AT+CCHO command.
@@ -823,12 +817,6 @@ interface ITelephony {
IImsConfig getImsConfig(int slotId, int feature);
/**
- * @return true if the IMS resolver is busy resolving a binding and should not be considered
- * available, false if the IMS resolver is idle.
- */
- boolean isResolvingImsBinding();
-
- /**
* @return true if the ImsService to bind to for the slot id specified was set, false otherwise.
*/
boolean setImsService(int slotId, boolean isCarrierImsService, String packageName);
@@ -1129,16 +1117,19 @@ interface ITelephony {
/**
* Whether the DTMF tone length can be changed.
*
+ * @param subId The subscription to use.
+ * @param callingPackage The package making the call.
* @return {@code true} if the DTMF tone length can be changed.
*/
- boolean canChangeDtmfToneLength();
+ boolean canChangeDtmfToneLength(int subId, String callingPackage);
/**
* Whether the device is a world phone.
*
+ * @param callingPackage The package making the call.
* @return {@code true} if the devices is a world phone.
*/
- boolean isWorldPhone();
+ boolean isWorldPhone(int subId, String callingPackage);
/**
* Whether the phone supports TTY mode.
@@ -1204,6 +1195,13 @@ interface ITelephony {
String getImeiForSlot(int slotIndex, String callingPackage);
/**
+ * Returns the Type Allocation Code from the IMEI for the given slot.
+ *
+ * @param slotIndex - Which slot to retrieve the Type Allocation Code from.
+ */
+ String getTypeAllocationCodeForSlot(int slotIndex);
+
+ /**
* Returns the MEID for the given slot.
*
* @param slotIndex - device slot.
@@ -1214,6 +1212,13 @@ interface ITelephony {
String getMeidForSlot(int slotIndex, String callingPackage);
/**
+ * Returns the Manufacturer Code from the MEID for the given slot.
+ *
+ * @param slotIndex - Which slot to retrieve the Manufacturer Code from.
+ */
+ String getManufacturerCodeForSlot(int slotIndex);
+
+ /**
* Returns the device software version.
*
* @param slotIndex - device slot.
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 4656fa3f8c56..0e7c654613e4 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -16,15 +16,6 @@
package com.android.internal.telephony;
-/**
- * TODO: This should probably not be an interface see
- * http://www.javaworld.com/javaworld/javaqa/2001-06/01-qa-0608-constants.html and google with
- * http://www.google.com/search?q=interface+constants&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a
- *
- * Also they should all probably be static final.
- */
-
-import android.os.SystemProperties;
import android.telephony.TelephonyManager;
/**
@@ -234,13 +225,6 @@ public interface RILConstants {
int LCE_STOPPED = 0;
int LCE_ACTIVE = 1;
-/*
-cat include/telephony/ril.h | \
- egrep '^#define' | \
- sed -re 's/^#define +([^ ]+)* +([^ ]+)/ int \1 = \2;/' \
- >>java/android/com.android.internal.telephony/gsm/RILConstants.java
-*/
-
/**
* No restriction at all including voice/SMS/USSD/SS/AV64
* and packet data.
@@ -275,6 +259,18 @@ cat include/telephony/ril.h | \
public static final int DATA_PROFILE_OEM_BASE = 1000;
public static final int DATA_PROFILE_INVALID = 0xFFFFFFFF;
+ /**
+ * The request/response/unsol message IDs below match RIL.h through Android O-MR1.
+ *
+ * RIL.h is at hardware/ril/include/telephony.ril.h; RIL support is deprecated and may
+ * be removed in the future.
+ *
+ * Messages defined after O-MR1 have no corresponding definition in RIL.h.
+ * P-and-later messages start at RIL_REQUEST_HAL_NON_RIL_BASE and
+ * RIL_UNSOL_HAL_NON_RIL_BASE.
+ */
+
+ /* Requests begin */
int RIL_REQUEST_GET_SIM_STATUS = 1;
int RIL_REQUEST_ENTER_SIM_PIN = 2;
int RIL_REQUEST_ENTER_SIM_PUK = 3;
@@ -418,15 +414,20 @@ cat include/telephony/ril.h | \
int RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION = 141;
int RIL_REQUEST_START_NETWORK_SCAN = 142;
int RIL_REQUEST_STOP_NETWORK_SCAN = 143;
- int RIL_REQUEST_GET_SLOT_STATUS = 144;
- int RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING = 145;
- int RIL_REQUEST_START_KEEPALIVE = 146;
- int RIL_REQUEST_STOP_KEEPALIVE = 147;
- int RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA = 148;
- int RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA = 149;
+ int RIL_REQUEST_START_KEEPALIVE = 144;
+ int RIL_REQUEST_STOP_KEEPALIVE = 145;
+ /* The following requests are not defined in RIL.h */
+ int RIL_REQUEST_HAL_NON_RIL_BASE = 200;
+ int RIL_REQUEST_GET_SLOT_STATUS = 200;
+ int RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING = 201;
+ int RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA = 202;
+ int RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA = 203;
+
+ /* Responses begin */
int RIL_RESPONSE_ACKNOWLEDGEMENT = 800;
+ /* Unsols begin */
int RIL_UNSOL_RESPONSE_BASE = 1000;
int RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED = 1000;
int RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED = 1001;
@@ -478,7 +479,10 @@ cat include/telephony/ril.h | \
int RIL_UNSOL_MODEM_RESTART = 1047;
int RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION = 1048;
int RIL_UNSOL_NETWORK_SCAN_RESULT = 1049;
- int RIL_UNSOL_ICC_SLOT_STATUS = 1050;
- int RIL_UNSOL_KEEPALIVE_STATUS = 1051;
- int RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG = 1052;
+ int RIL_UNSOL_KEEPALIVE_STATUS = 1050;
+
+ /* The following unsols are not defined in RIL.h */
+ int RIL_UNSOL_HAL_NON_RIL_BASE = 1100;
+ int RIL_UNSOL_ICC_SLOT_STATUS = 1100;
+ int RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG = 1101;
}
diff --git a/telephony/java/com/android/internal/telephony/uicc/IccUtils.java b/telephony/java/com/android/internal/telephony/uicc/IccUtils.java
index 48ef2bbc8d01..acd5713e0128 100644
--- a/telephony/java/com/android/internal/telephony/uicc/IccUtils.java
+++ b/telephony/java/com/android/internal/telephony/uicc/IccUtils.java
@@ -107,7 +107,7 @@ public class IccUtils {
/**
* PLMN (MCC/MNC) is encoded as per 24.008 10.5.1.3
* Returns a concatenated string of MCC+MNC, stripping
- * all invalid character 'f'
+ * all invalid character 'F'
*/
public static String bcdPlmnToString(byte[] data, int offset) {
if (offset + 3 > data.length) {
diff --git a/test-base/Android.bp b/test-base/Android.bp
index 4d149f7c8919..d25b47727c0b 100644
--- a/test-base/Android.bp
+++ b/test-base/Android.bp
@@ -21,6 +21,7 @@
// Also contains the com.android.internal.util.Predicate[s] classes.
java_library {
name: "android.test.base",
+ installable: true,
srcs: ["src/**/*.java"],
@@ -42,6 +43,7 @@ java_library {
// Also contains the com.android.internal.util.Predicate[s] classes.
java_library {
name: "legacy-test",
+ installable: true,
sdk_version: "current",
static_libs: ["android.test.base"],
@@ -81,3 +83,39 @@ java_library_static {
"junit",
],
}
+
+droiddoc {
+ name: "android-test-base-api-stubs-gen-docs",
+ srcs: [
+ "src/**/*.java",
+ ],
+ custom_template: "droiddoc-templates-sdk",
+ installable: false,
+ args: "-stubpackages android.test:" +
+ "android.test.suitebuilder.annotation:" +
+ "com.android.internal.util:" +
+ "junit.framework -stubsourceonly -nodocs",
+ sdk_version: "current",
+ api_tag_name: "ANDROID_TEST_BASE",
+ api_filename: "android-test-base-api.txt",
+ removed_api_filename: "android-test-base-removed.txt",
+}
+
+// Build the android.test.base.stubs library
+// =========================================
+java_library_static {
+ name: "android.test.base.stubs",
+ srcs: [
+ ":android-test-base-api-stubs-gen-docs",
+ ],
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ unbundled_build: {
+ enabled: false,
+ },
+ },
+ sdk_version: "current",
+ compile_dex: true,
+}
diff --git a/test-base/Android.mk b/test-base/Android.mk
index ebb33deb42d3..baf5726ff8bd 100644
--- a/test-base/Android.mk
+++ b/test-base/Android.mk
@@ -19,59 +19,10 @@ LOCAL_PATH:= $(call my-dir)
# For unbundled build we'll use the prebuilt jar from prebuilts/sdk.
ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)))
-# Generate the stub source files for android.test.base.stubs
-# ==========================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src
-
-ANDROID_TEST_BASE_OUTPUT_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.base.stubs_intermediates/api.txt
-ANDROID_TEST_BASE_OUTPUT_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.base.stubs_intermediates/removed.txt
-
ANDROID_TEST_BASE_API_FILE := $(LOCAL_PATH)/api/android-test-base-current.txt
ANDROID_TEST_BASE_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-base-removed.txt
-LOCAL_DROIDDOC_OPTIONS:= \
- -stubpackages android.test:android.test.suitebuilder.annotation:com.android.internal.util:junit.framework \
- -stubsourceonly \
- -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.base.stubs_intermediates/src \
- -nodocs \
- -api $(ANDROID_TEST_BASE_OUTPUT_API_FILE) \
- -removedApi $(ANDROID_TEST_BASE_OUTPUT_REMOVED_API_FILE) \
-
-LOCAL_UNINSTALLABLE_MODULE := true
-LOCAL_MODULE := android-test-base-api-stubs-gen
-
-include $(BUILD_DROIDDOC)
-
-# Remember the target that will trigger the code generation.
-android_test_base_gen_stamp := $(full_target)
-
-# Add some additional dependencies
-$(ANDROID_TEST_BASE_OUTPUT_API_FILE): $(full_target)
-$(ANDROID_TEST_BASE_OUTPUT_REMOVED_API_FILE): $(full_target)
-
-# Build the android.test.base.stubs library
-# =========================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := android.test.base.stubs
-
-LOCAL_SOURCE_FILES_ALL_GENERATED := true
-LOCAL_SDK_VERSION := current
-
-# Make sure to run droiddoc first to generate the stub source files.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_base_gen_stamp)
-android_test_base_gen_stamp :=
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
+full_classes_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,android.test.base.stubs,,COMMON)/classes.jar
# Archive a copy of the classes.jar in SDK build.
$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.base.stubs.jar)
@@ -83,16 +34,16 @@ $(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.base.stubs.ja
$(eval $(call check-api, \
check-android-test-base-api-current, \
$(ANDROID_TEST_BASE_API_FILE), \
- $(ANDROID_TEST_BASE_OUTPUT_API_FILE), \
+ $(INTERNAL_PLATFORM_ANDROID_TEST_BASE_API_FILE), \
$(ANDROID_TEST_BASE_REMOVED_API_FILE), \
- $(ANDROID_TEST_BASE_OUTPUT_REMOVED_API_FILE), \
+ $(INTERNAL_PLATFORM_ANDROID_TEST_BASE_REMOVED_API_FILE), \
-error 2 -error 3 -error 4 -error 5 -error 6 \
-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
-error 25 -error 26 -error 27, \
cat $(LOCAL_PATH)/api/apicheck_msg_android_test_base.txt, \
check-android-test-base-api, \
- $(call doc-timestamp-for,android-test-base-api-stubs-gen) \
+ $(OUT_DOCS)/android-test-base-api-stubs-gen-docs-stubs.srcjar \
))
.PHONY: check-android-test-base-api
@@ -101,11 +52,11 @@ checkapi: check-android-test-base-api
.PHONY: update-android-test-base-api
update-api: update-android-test-base-api
-update-android-test-base-api: $(ANDROID_TEST_BASE_OUTPUT_API_FILE) | $(ACP)
+update-android-test-base-api: $(INTERNAL_PLATFORM_ANDROID_TEST_BASE_API_FILE) | $(ACP)
@echo Copying current.txt
- $(hide) $(ACP) $(ANDROID_TEST_BASE_OUTPUT_API_FILE) $(ANDROID_TEST_BASE_API_FILE)
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_BASE_API_FILE) $(ANDROID_TEST_BASE_API_FILE)
@echo Copying removed.txt
- $(hide) $(ACP) $(ANDROID_TEST_BASE_OUTPUT_REMOVED_API_FILE) $(ANDROID_TEST_BASE_REMOVED_API_FILE)
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_BASE_REMOVED_API_FILE) $(ANDROID_TEST_BASE_REMOVED_API_FILE)
endif # not TARGET_BUILD_APPS not TARGET_BUILD_PDK=true
diff --git a/test-base/src/android/test/suitebuilder/annotation/Smoke.java b/test-base/src/android/test/suitebuilder/annotation/Smoke.java
index aac293796be1..34563717894f 100644
--- a/test-base/src/android/test/suitebuilder/annotation/Smoke.java
+++ b/test-base/src/android/test/suitebuilder/annotation/Smoke.java
@@ -26,8 +26,6 @@ import java.lang.annotation.Target;
* The <code>android.test.suitebuilder.SmokeTestSuiteBuilder</code>
* will run all tests with this annotation.
*
- * @see android.test.suitebuilder.SmokeTestSuiteBuilder
- *
* @deprecated New tests should be written using the
* <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
diff --git a/test-mock/Android.bp b/test-mock/Android.bp
index bb0736334f87..8d3faaef9f6b 100644
--- a/test-mock/Android.bp
+++ b/test-mock/Android.bp
@@ -18,6 +18,7 @@
// ===================================
java_library {
name: "android.test.mock",
+ installable: true,
java_version: "1.8",
srcs: ["src/**/*.java"],
@@ -27,3 +28,83 @@ java_library {
"framework",
],
}
+
+doc_defaults {
+ name:"android.test.mock.docs-defaults",
+ srcs: ["src/android/test/mock/**/*.java"],
+
+ // Includes the main framework source to ensure that doclava has access to the
+ // visibility information for the base classes of the mock classes. Without it
+ // otherwise hidden methods could be visible.
+ srcs_lib: "framework",
+ srcs_lib_whitelist_dirs: ["core/java"],
+ srcs_lib_whitelist_pkgs: ["android"],
+ libs: [
+ "core-oj",
+ "core-libart",
+ "framework",
+ "conscrypt",
+ "okhttp",
+ "bouncycastle",
+ "ext",
+ ],
+ local_sourcepaths: ["src/android/test/mock"],
+ custom_template: "droiddoc-templates-sdk",
+ installable: false,
+}
+
+android_test_mock_docs_args =
+ "-hide 110 -hide 111 -hide 113 -hide 121 -hide 125 -hide 126 -hide 127 -hide 128 " +
+ "-stubpackages android.test.mock " +
+ "-nodocs "
+
+droiddoc {
+ name: "android.test.mock.docs",
+ defaults: ["android.test.mock.docs-defaults"],
+
+ api_tag_name: "ANDROID_TEST_MOCK",
+ api_filename: "api/android-test-mock-current.txt",
+ removed_api_filename: "api/android-test-mock-removed.txt",
+
+ args: android_test_mock_docs_args,
+}
+
+droiddoc {
+ name: "android.test.mock.docs-system",
+ defaults: ["android.test.mock.docs-defaults"],
+
+ api_tag_name: "ANDROID_TEST_MOCK_SYSTEM",
+ api_filename: "api/android-test-mock-system-current.txt",
+ removed_api_filename: "api/android-test-mock-system-removed.txt",
+
+ args: android_test_mock_docs_args +
+ "-showAnnotation android.annotation.SystemApi ",
+}
+
+java_library_static {
+ name: "android.test.mock.stubs",
+ srcs: [":android.test.mock.docs"],
+ sdk_version: "current",
+ product_variables: {
+ unbundled_build: {
+ // Unbundled apps will use the prebuilt one
+ // prebuilts/sdk/current
+ enabled: false,
+ },
+ },
+ compile_dex: true,
+}
+
+java_library_static {
+ name: "android.test.mock.stubs-system",
+ srcs: [":android.test.mock.docs-system"],
+ sdk_version: "system_current",
+ product_variables: {
+ unbundled_build: {
+ // Unbundled apps will use the prebuilt one
+ // prebuilts/sdk/system_current
+ enabled: false,
+ },
+ },
+ compile_dex: true,
+}
diff --git a/test-mock/Android.mk b/test-mock/Android.mk
index de1b6c7f2ba1..73a7340826a6 100644
--- a/test-mock/Android.mk
+++ b/test-mock/Android.mk
@@ -16,87 +16,30 @@
LOCAL_PATH:= $(call my-dir)
-# Includes the main framework source to ensure that doclava has access to the
-# visibility information for the base classes of the mock classes. Without it
-# otherwise hidden methods could be visible.
-android_test_mock_source_files := \
- $(call all-java-files-under, src/android/test/mock) \
- $(call all-java-files-under, ../core/java/android)
-
-# For unbundled build we'll use the prebuilt jar from prebuilts/sdk.
-ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)))
-
-# Generate the stub source files for android.test.mock.stubs
-# ==========================================================
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(android_test_mock_source_files)
-LOCAL_JAVA_LIBRARIES := core-oj core-libart framework conscrypt okhttp bouncycastle
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src/android/test/mock
-
-ANDROID_TEST_MOCK_OUTPUT_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/api.txt
-ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/removed.txt
-
-ANDROID_TEST_MOCK_API_FILE := $(LOCAL_PATH)/api/android-test-mock-current.txt
-ANDROID_TEST_MOCK_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-removed.txt
-
-LOCAL_DROIDDOC_OPTIONS:= \
- -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \
- -stubpackages android.test.mock \
- -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/src \
- -nodocs \
- -api $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) \
- -removedApi $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE) \
-
-LOCAL_UNINSTALLABLE_MODULE := true
-LOCAL_MODULE := android-test-mock-api-stubs-gen
-
-include $(BUILD_DROIDDOC)
-
-# Remember the target that will trigger the code generation.
-android_test_mock_gen_stamp := $(full_target)
-
-# Add some additional dependencies
-$(ANDROID_TEST_MOCK_OUTPUT_API_FILE): $(full_target)
-$(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE): $(full_target)
-
-# Build the android.test.mock.stubs library
-# =========================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := android.test.mock.stubs
-
-LOCAL_SOURCE_FILES_ALL_GENERATED := true
-
-# Make sure to run droiddoc first to generate the stub source files.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_mock_gen_stamp)
-android_test_mock_gen_stamp :=
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
# Archive a copy of the classes.jar in SDK build.
+full_classes_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,android.test.mock.stubs,,COMMON)/classes.jar
$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.mock.stubs.jar)
# Check that the android.test.mock.stubs library has not changed
# ==============================================================
+ANDROID_TEST_MOCK_API_FILE := $(LOCAL_PATH)/api/android-test-mock-current.txt
+ANDROID_TEST_MOCK_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-removed.txt
# Check that the API we're building hasn't changed from the not-yet-released
# SDK version.
$(eval $(call check-api, \
check-android-test-mock-api-current, \
$(ANDROID_TEST_MOCK_API_FILE), \
- $(ANDROID_TEST_MOCK_OUTPUT_API_FILE), \
+ $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_API_FILE), \
$(ANDROID_TEST_MOCK_REMOVED_API_FILE), \
- $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE), \
+ $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_REMOVED_API_FILE), \
-error 2 -error 3 -error 4 -error 5 -error 6 \
-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
-error 25 -error 26 -error 27, \
cat $(LOCAL_PATH)/api/apicheck_msg_android_test_mock.txt, \
check-android-test-mock-api, \
- $(call doc-timestamp-for,android-test-mock-api-stubs-gen) \
+ $(OUT_DOCS)/android.test.mock.docs-stubs.srcjar \
))
.PHONY: check-android-test-mock-api
@@ -105,84 +48,36 @@ checkapi: check-android-test-mock-api
.PHONY: update-android-test-mock-api
update-api: update-android-test-mock-api
-update-android-test-mock-api: $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) | $(ACP)
+update-android-test-mock-api: $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_API_FILE) | $(ACP)
@echo Copying current.txt
- $(hide) $(ACP) $(ANDROID_TEST_MOCK_OUTPUT_API_FILE) $(ANDROID_TEST_MOCK_API_FILE)
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_API_FILE) $(ANDROID_TEST_MOCK_API_FILE)
@echo Copying removed.txt
- $(hide) $(ACP) $(ANDROID_TEST_MOCK_OUTPUT_REMOVED_API_FILE) $(ANDROID_TEST_MOCK_REMOVED_API_FILE)
-
-# Generate the stub source files for android.test.mock.stubs-system
-# =================================================================
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(android_test_mock_source_files)
-
-LOCAL_JAVA_LIBRARIES := core-oj core-libart framework conscrypt okhttp bouncycastle
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src/android/test/mock
-
-ANDROID_TEST_MOCK_SYSTEM_OUTPUT_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs-system_intermediates/api.txt
-ANDROID_TEST_MOCK_SYSTEM_OUTPUT_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs-system_intermediates/removed.txt
-
-ANDROID_TEST_MOCK_SYSTEM_API_FILE := $(LOCAL_PATH)/api/android-test-mock-system-current.txt
-ANDROID_TEST_MOCK_SYSTEM_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-system-removed.txt
-
-LOCAL_DROIDDOC_OPTIONS:= \
- -stubpackages android.test.mock \
- -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs-system_intermediates/src \
- -nodocs \
- -showAnnotation android.annotation.SystemApi \
- -api $(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_API_FILE) \
- -removedApi $(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_REMOVED_API_FILE) \
-
-LOCAL_UNINSTALLABLE_MODULE := true
-LOCAL_MODULE := android-test-mock-system-api-stubs-gen
-
-include $(BUILD_DROIDDOC)
-
-# Remember the target that will trigger the code generation.
-android_test_mock_system_gen_stamp := $(full_target)
-
-# Add some additional dependencies
-$(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_API_FILE): $(full_target)
-$(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_REMOVED_API_FILE): $(full_target)
-
-# Build the android.test.mock.stubs-system library
-# ================================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := android.test.mock.stubs-system
-
-LOCAL_SOURCE_FILES_ALL_GENERATED := true
-
-# Make sure to run droiddoc first to generate the stub source files.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_mock_system_gen_stamp)
-android_test_mock_system_gen_stamp :=
-
-LOCAL_SDK_VERSION := system_current
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_REMOVED_API_FILE) $(ANDROID_TEST_MOCK_REMOVED_API_FILE)
# Archive a copy of the classes.jar in SDK build.
+full_classes_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,android.test.mock.stubs-system,,COMMON)/classes.jar
$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.mock.stubs_system.jar)
# Check that the android.test.mock.stubs-system library has not changed
# =====================================================================
+ANDROID_TEST_MOCK_SYSTEM_API_FILE := $(LOCAL_PATH)/api/android-test-mock-system-current.txt
+ANDROID_TEST_MOCK_SYSTEM_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-system-removed.txt
# Check that the API we're building hasn't changed from the not-yet-released
# SDK version.
$(eval $(call check-api, \
check-android-test-mock-system-api-current, \
$(ANDROID_TEST_MOCK_SYSTEM_API_FILE), \
- $(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_API_FILE), \
+ $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_SYSTEM_API_FILE), \
$(ANDROID_TEST_MOCK_SYSTEM_REMOVED_API_FILE), \
- $(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_REMOVED_API_FILE), \
+ $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_SYSTEM_REMOVED_API_FILE), \
-error 2 -error 3 -error 4 -error 5 -error 6 \
-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
-error 25 -error 26 -error 27, \
cat $(LOCAL_PATH)/api/apicheck_msg_android_test_mock-system.txt, \
check-android-test-mock-system-api, \
- $(call doc-timestamp-for,android-test-mock-system-api-stubs-gen) \
+ $(OUT_DOCS)/android.test.mock.docs-system-stubs.srcjar \
))
.PHONY: check-android-test-mock-system-api
@@ -191,11 +86,8 @@ checkapi: check-android-test-mock-system-api
.PHONY: update-android-test-mock-system-api
update-api: update-android-test-mock-system-api
-update-android-test-mock-system-api: $(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_API_FILE) | $(ACP)
+update-android-test-mock-system-api: $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_SYSTEM_API_FILE) | $(ACP)
@echo Copying current.txt
- $(hide) $(ACP) $(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_API_FILE) $(ANDROID_TEST_MOCK_SYSTEM_API_FILE)
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_SYSTEM_API_FILE) $(ANDROID_TEST_MOCK_SYSTEM_API_FILE)
@echo Copying removed.txt
- $(hide) $(ACP) $(ANDROID_TEST_MOCK_SYSTEM_OUTPUT_REMOVED_API_FILE) $(ANDROID_TEST_MOCK_SYSTEM_REMOVED_API_FILE)
-
-endif # not TARGET_BUILD_APPS not TARGET_BUILD_PDK=true
-
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_MOCK_SYSTEM_REMOVED_API_FILE) $(ANDROID_TEST_MOCK_SYSTEM_REMOVED_API_FILE)
diff --git a/test-mock/jarjar-rules.txt b/test-mock/jarjar-rules.txt
deleted file mode 120000
index f6f79139d511..000000000000
--- a/test-mock/jarjar-rules.txt
+++ /dev/null
@@ -1 +0,0 @@
-../test-base/jarjar-rules.txt \ No newline at end of file
diff --git a/test-runner/Android.bp b/test-runner/Android.bp
index 1cce2c3cc32c..2caa6c45f16b 100644
--- a/test-runner/Android.bp
+++ b/test-runner/Android.bp
@@ -18,6 +18,7 @@
// =====================================
java_library {
name: "android.test.runner",
+ installable: true,
// Needs to be consistent with the repackaged version of this make target.
java_version: "1.8",
@@ -30,7 +31,7 @@ java_library {
sdk_version: "current",
libs: [
"android.test.base",
- "android.test.mock",
+ "android.test.mock.stubs",
],
}
@@ -46,7 +47,7 @@ java_library {
sdk_version: "current",
libs: [
"android.test.base",
- "android.test.mock",
+ "android.test.mock.stubs",
"junit",
],
}
@@ -76,3 +77,49 @@ java_library_static {
// Pin java_version until jarjar is certified to support later versions. http://b/72703434
java_version: "1.8",
}
+
+droiddoc {
+ name: "android-test-runner-api-stubs-gen-docs",
+ srcs: [
+ "src/**/*.java",
+ ],
+ libs: [
+ "core-oj",
+ "core-libart",
+ "framework",
+ "android.test.base",
+ "android.test.mock",
+ ],
+ custom_template: "droiddoc-templates-sdk",
+ installable: false,
+ args: "-stubpackages android.test:" +
+ "android.test.suitebuilder:" +
+ "junit.runner:" +
+ "junit.textui -stubsourceonly -nodocs",
+ api_tag_name: "ANDROID_TEST_RUNNER",
+ api_filename: "android-test-runner-current.txt",
+ removed_api_filename: "android-test-runner-removed.txt",
+}
+
+// Build the android.test.runner.stubs library
+// =========================================
+java_library_static {
+ name: "android.test.runner.stubs",
+ srcs: [
+ ":android-test-runner-api-stubs-gen-docs",
+ ],
+ libs: [
+ "android.test.base.stubs",
+ "android.test.mock.stubs",
+ ],
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ unbundled_build: {
+ enabled: false,
+ },
+ },
+ sdk_version: "current",
+ compile_dex: true,
+}
diff --git a/test-runner/Android.mk b/test-runner/Android.mk
index 706f6364ef8d..b70d2498d491 100644
--- a/test-runner/Android.mk
+++ b/test-runner/Android.mk
@@ -19,67 +19,10 @@ LOCAL_PATH:= $(call my-dir)
# For unbundled build we'll use the prebuilt jar from prebuilts/sdk.
ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)))
-# Generate the stub source files for android.test.runner.stubs
-# ============================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_JAVA_LIBRARIES := \
- core-oj \
- core-libart \
- framework \
- android.test.base \
- android.test.mock \
-
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src
-
-ANDROID_TEST_RUNNER_OUTPUT_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.runner.stubs_intermediates/api.txt
-ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.runner.stubs_intermediates/removed.txt
-
ANDROID_TEST_RUNNER_API_FILE := $(LOCAL_PATH)/api/android-test-runner-current.txt
ANDROID_TEST_RUNNER_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-runner-removed.txt
-LOCAL_DROIDDOC_OPTIONS:= \
- -stubpackages android.test:android.test.suitebuilder:junit.runner:junit.textui \
- -stubsourceonly \
- -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.runner.stubs_intermediates/src \
- -nodocs \
- -api $(ANDROID_TEST_RUNNER_OUTPUT_API_FILE) \
- -removedApi $(ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE) \
-
-LOCAL_UNINSTALLABLE_MODULE := true
-LOCAL_MODULE := android-test-runner-api-stubs-gen
-
-include $(BUILD_DROIDDOC)
-
-# Remember the target that will trigger the code generation.
-android_test_runner_api_gen_stamp := $(full_target)
-
-# Add some additional dependencies
-$(ANDROID_TEST_RUNNER_OUTPUT_API_FILE): $(full_target)
-$(ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE): $(full_target)
-
-# Build the android.test.runner.stubs library
-# ===========================================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := android.test.runner.stubs
-
-LOCAL_JAVA_LIBRARIES := \
- android.test.base.stubs \
- android.test.mock.stubs \
-
-LOCAL_SOURCE_FILES_ALL_GENERATED := true
-LOCAL_SDK_VERSION := current
-
-# Make sure to run droiddoc first to generate the stub source files.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(android_test_runner_api_gen_stamp)
-android_test_runner_api_gen_stamp :=
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
+full_classes_jar := $(call intermediates-dir-for,JAVA_LIBRARIES,android.test.runner.stubs,,COMMON)/classes.jar
# Archive a copy of the classes.jar in SDK build.
$(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.runner.stubs.jar)
@@ -91,16 +34,16 @@ $(call dist-for-goals,sdk win_sdk,$(full_classes_jar):android.test.runner.stubs.
$(eval $(call check-api, \
check-android-test-runner-api-current, \
$(ANDROID_TEST_RUNNER_API_FILE), \
- $(ANDROID_TEST_RUNNER_OUTPUT_API_FILE), \
+ $(INTERNAL_PLATFORM_ANDROID_TEST_RUNNER_API_FILE), \
$(ANDROID_TEST_RUNNER_REMOVED_API_FILE), \
- $(ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE), \
+ $(INTERNAL_PLATFORM_ANDROID_TEST_RUNNER_REMOVED_API_FILE), \
-error 2 -error 3 -error 4 -error 5 -error 6 \
-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
-error 25 -error 26 -error 27, \
cat $(LOCAL_PATH)/api/apicheck_msg_android_test_runner.txt, \
check-android-test-runner-api, \
- $(call doc-timestamp-for,android-test-runner-api-stubs-gen) \
+ $(OUT_DOCS)/android-test-runner-api-stubs-gen-docs-stubs.srcjar \
))
.PHONY: check-android-test-runner-api
@@ -109,11 +52,11 @@ checkapi: check-android-test-runner-api
.PHONY: update-android-test-runner-api
update-api: update-android-test-runner-api
-update-android-test-runner-api: $(ANDROID_TEST_RUNNER_OUTPUT_API_FILE) | $(ACP)
+update-android-test-runner-api: $(INTERNAL_PLATFORM_ANDROID_TEST_RUNNER_API_FILE) | $(ACP)
@echo Copying current.txt
- $(hide) $(ACP) $(ANDROID_TEST_RUNNER_OUTPUT_API_FILE) $(ANDROID_TEST_RUNNER_API_FILE)
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_RUNNER_API_FILE) $(ANDROID_TEST_RUNNER_API_FILE)
@echo Copying removed.txt
- $(hide) $(ACP) $(ANDROID_TEST_RUNNER_OUTPUT_REMOVED_API_FILE) $(ANDROID_TEST_RUNNER_REMOVED_API_FILE)
+ $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_TEST_RUNNER_REMOVED_API_FILE) $(ANDROID_TEST_RUNNER_REMOVED_API_FILE)
endif # not TARGET_BUILD_APPS not TARGET_BUILD_PDK=true
diff --git a/tests/ActivityTests/Android.mk b/tests/ActivityTests/Android.mk
index 274fc5fcf471..4c68c8bb40c2 100644
--- a/tests/ActivityTests/Android.mk
+++ b/tests/ActivityTests/Android.mk
@@ -9,4 +9,10 @@ LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_MODULE_TAGS := tests
LOCAL_CERTIFICATE := platform
+LOCAL_USE_AAPT2 := true
+# Disable AAPT2 manifest checks to fix:
+# frameworks/base/tests/ActivityTests/AndroidManifest.xml:42: error: unexpected element <preferred> found in <manifest><application><activity>.
+# TODO(b/79755007): Remove when AAPT2 recognizes the manifest elements.
+LOCAL_AAPT_FLAGS += --warn-manifest-validation
+
include $(BUILD_PACKAGE)
diff --git a/tests/ActivityTests/res/values/themes.xml b/tests/ActivityTests/res/values/themes.xml
index c11d2e48834a..1c3053710e7f 100644
--- a/tests/ActivityTests/res/values/themes.xml
+++ b/tests/ActivityTests/res/values/themes.xml
@@ -17,8 +17,6 @@
<resources>
<style name="SlowDialog" parent="@android:style/Theme.Holo.Dialog">
<item name="android:windowAnimationStyle">@style/SlowDialog</item>
- </style>
- <style name="SlowDialog">
<item name="android:windowEnterAnimation">@anim/slow_enter</item>
<item name="android:windowExitAnimation">@anim/slow_exit</item>
</style>
diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
index 6ce66f0f4546..4a6fe49f2676 100644
--- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
@@ -184,7 +184,8 @@ public class AppLaunch extends InstrumentationTestCase {
if (null != launchDirectory && !launchDirectory.isEmpty()) {
launchRootDir = new File(launchDirectory);
if (!launchRootDir.exists() && !launchRootDir.mkdirs()) {
- throw new IOException("Unable to create the destination directory");
+ throw new IOException("Unable to create the destination directory "
+ + launchRootDir + ". Try disabling selinux.");
}
}
@@ -192,7 +193,8 @@ public class AppLaunch extends InstrumentationTestCase {
File launchSubDir = new File(launchRootDir, LAUNCH_SUB_DIRECTORY);
if (!launchSubDir.exists() && !launchSubDir.mkdirs()) {
- throw new IOException("Unable to create the lauch file sub directory");
+ throw new IOException("Unable to create the lauch file sub directory "
+ + launchSubDir + ". Try disabling selinux.");
}
File file = new File(launchSubDir, LAUNCH_FILE);
FileOutputStream outputStream = new FileOutputStream(file);
@@ -769,6 +771,8 @@ public class AppLaunch extends InstrumentationTestCase {
BufferedWriter writer =
new BufferedWriter(new OutputStreamWriter(stream))) {
String cmd = String.format(SIMPLEPERF_APP_CMD, packageName, launchCmd);
+ // In the file, we need to escape any "$".
+ cmd = cmd.replace("$", "\\$");
writer.write(cmd);
}
launchCmd = launchFile.getAbsolutePath();
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp b/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp
new file mode 100644
index 000000000000..0b16b0ecf0c1
--- /dev/null
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp
@@ -0,0 +1,41 @@
+// Copyright (C) 2013 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.
+//
+
+cc_test_library {
+ name: "libsmartcamera_jni",
+
+ sdk_version: "14",
+
+ srcs: [
+ "contrast.cpp",
+ "brightness.cpp",
+ "exposure.cpp",
+ "colorspace.cpp",
+ "histogram.cpp",
+ "frametovalues.cpp",
+ "pixelutils.cpp",
+ "sobeloperator.cpp",
+ "stats_scorer.cpp",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Werror",
+ "-Wno-unused-parameter",
+ ],
+
+ stl: "c++_static",
+}
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.mk b/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.mk
deleted file mode 100644
index 6e0d58a2a881..000000000000
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (C) 2013 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.
-#
-
-FILTERFW_NATIVE_PATH := $(call my-dir)
-
-
-#
-# Build module libfilterframework
-#
-LOCAL_PATH := $(FILTERFW_NATIVE_PATH)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SDK_VERSION := 14
-
-LOCAL_MODULE := libsmartcamera_jni
-
-LOCAL_SRC_FILES := contrast.cpp \
- brightness.cpp \
- exposure.cpp \
- colorspace.cpp \
- histogram.cpp \
- frametovalues.cpp \
- pixelutils.cpp \
- sobeloperator.cpp \
- stats_scorer.cpp
-
-LOCAL_CFLAGS += -Wall -Wextra -Werror -Wno-unused-parameter
-
-LOCAL_NDK_STL_VARIANT := c++_static
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameManager.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameManager.java
index 55ed277a349e..9a4348e07809 100644
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameManager.java
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameManager.java
@@ -354,7 +354,7 @@ public class FrameManager {
assertNotRunning();
FrameSlot slot = getSlot(name);
slot.releaseFrame();
- mFrameSlots.remove(slot);
+ mFrameSlots.remove(name);
}
/**
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
index a7bdabd64684..0787d823756c 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
@@ -106,7 +106,7 @@ public class ColorFiltersMutateActivity extends Activity {
mPorterDuffColor = porterDuffColor;
final PorterDuffColorFilter filter =
(PorterDuffColorFilter) mBlendPaint.getColorFilter();
- filter.setColor(mPorterDuffColor);
+ mBlendPaint.setColorFilter(new PorterDuffColorFilter(porterDuffColor, filter.getMode()));
invalidate();
}
diff --git a/tests/JankBench/Android.mk b/tests/JankBench/Android.mk
index 291ba78758b4..75282ba9a88c 100644
--- a/tests/JankBench/Android.mk
+++ b/tests/JankBench/Android.mk
@@ -19,12 +19,12 @@ LOCAL_RESOURCE_DIR := \
LOCAL_STATIC_ANDROID_LIBRARIES := \
- $(ANDROID_SUPPORT_DESIGN_TARGETS) \
- android-support-v4 \
- android-support-v7-appcompat \
- android-support-v7-cardview \
- android-support-v7-recyclerview \
- android-support-v17-leanback \
+ androidx.design_design \
+ androidx.legacy_legacy-support-v4 \
+ androidx.appcompat_appcompat \
+ androidx.cardview_cardview \
+ androidx.recyclerview_recyclerview \
+ androidx.leanback_leanback \
LOCAL_STATIC_JAVA_LIBRARIES := \
apache-commons-math \
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/app/BenchmarkDashboardFragment.java b/tests/JankBench/app/src/main/java/com/android/benchmark/app/BenchmarkDashboardFragment.java
index b0a97ae0995b..c5edd7ae75e0 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/app/BenchmarkDashboardFragment.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/app/BenchmarkDashboardFragment.java
@@ -16,7 +16,7 @@
package com.android.benchmark.app;
-import android.support.v4.app.Fragment;
+import androidx.fragment.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java b/tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java
index 79bafd62e2a2..47db6020b36f 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/app/HomeActivity.java
@@ -20,8 +20,8 @@ import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Menu;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/app/RunLocalBenchmarksActivity.java b/tests/JankBench/app/src/main/java/com/android/benchmark/app/RunLocalBenchmarksActivity.java
index 7641d0095a70..07c4a938cf9f 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/app/RunLocalBenchmarksActivity.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/app/RunLocalBenchmarksActivity.java
@@ -20,10 +20,10 @@ import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.app.ListFragment;
-import android.support.v7.app.AppCompatActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.fragment.app.ListFragment;
+import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/app/UiResultsFragment.java b/tests/JankBench/app/src/main/java/com/android/benchmark/app/UiResultsFragment.java
index 56e94d538ab5..68aeb4ccd06d 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/app/UiResultsFragment.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/app/UiResultsFragment.java
@@ -19,8 +19,8 @@ package com.android.benchmark.app;
import android.annotation.TargetApi;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.ListFragment;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.ListFragment;
import android.util.Log;
import android.view.FrameMetrics;
import android.widget.SimpleAdapter;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/registry/BenchmarkCategory.java b/tests/JankBench/app/src/main/java/com/android/benchmark/registry/BenchmarkCategory.java
index d91e5798f05b..d13b5692c6b8 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/registry/BenchmarkCategory.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/registry/BenchmarkCategory.java
@@ -16,7 +16,7 @@
package com.android.benchmark.registry;
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/BitmapUploadActivity.java b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/BitmapUploadActivity.java
index f6a528a8a966..787090208d7e 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/BitmapUploadActivity.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/BitmapUploadActivity.java
@@ -25,7 +25,7 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/EditTextInputActivity.java b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/EditTextInputActivity.java
index ea6fb58f4775..3817ab50e120 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/EditTextInputActivity.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/EditTextInputActivity.java
@@ -18,8 +18,8 @@ package com.android.benchmark.ui;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.KeyEvent;
import android.widget.EditText;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/FullScreenOverdrawActivity.java b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/FullScreenOverdrawActivity.java
index 95fce3834f9b..c508bf99ffba 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/FullScreenOverdrawActivity.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/FullScreenOverdrawActivity.java
@@ -23,7 +23,7 @@ import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListActivityBase.java b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListActivityBase.java
index b973bc76c13f..7d7b04c27f84 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListActivityBase.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListActivityBase.java
@@ -18,9 +18,9 @@ package com.android.benchmark.ui;
import android.app.ActionBar;
import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.ListFragment;
-import android.support.v7.app.AppCompatActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.ListFragment;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.Window;
import android.widget.ListAdapter;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListViewScrollActivity.java b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListViewScrollActivity.java
index 3ffb7706675f..8b3a96374de6 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListViewScrollActivity.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ListViewScrollActivity.java
@@ -18,7 +18,7 @@ package com.android.benchmark.ui;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v7.app.ActionBar;
+import androidx.appcompat.app.ActionBar;
import android.view.FrameMetrics;
import android.view.MotionEvent;
import android.widget.ArrayAdapter;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ShadowGridActivity.java b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ShadowGridActivity.java
index 68f75a3f277b..c96899b136d0 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ShadowGridActivity.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/ShadowGridActivity.java
@@ -17,9 +17,9 @@ package com.android.benchmark.ui;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.ListFragment;
-import android.support.v7.app.AppCompatActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.ListFragment;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/FrameTimingStats.java b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/FrameTimingStats.java
index 1fd0998f8dd6..bf882dc83c89 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/FrameTimingStats.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/FrameTimingStats.java
@@ -16,7 +16,7 @@
package com.android.benchmark.ui.automation;
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
import java.io.DataInput;
import java.io.DataInputStream;
diff --git a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/Interaction.java b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/Interaction.java
index 370fed28e1b2..31a26698c6d2 100644
--- a/tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/Interaction.java
+++ b/tests/JankBench/app/src/main/java/com/android/benchmark/ui/automation/Interaction.java
@@ -17,7 +17,7 @@
package com.android.benchmark.ui.automation;
import android.os.SystemClock;
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
import android.view.MotionEvent;
import java.util.ArrayList;
diff --git a/tests/JankBench/app/src/main/res/layout/activity_bitmap_upload.xml b/tests/JankBench/app/src/main/res/layout/activity_bitmap_upload.xml
index 6b3c8992d414..15cd0a4c528e 100644
--- a/tests/JankBench/app/src/main/res/layout/activity_bitmap_upload.xml
+++ b/tests/JankBench/app/src/main/res/layout/activity_bitmap_upload.xml
@@ -22,7 +22,7 @@
android:layout_height="match_parent"
android:padding="10dp"
android:clipToPadding="false">
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
@@ -30,22 +30,22 @@
android:id="@+id/upload_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- </android.support.v7.widget.CardView>
+ </androidx.cardview.widget.CardView>
- <android.support.v4.widget.Space
+ <androidx.legacy.widget.Space
android:layout_height="10dp"
android:layout_width="match_parent" />
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
- <android.support.v4.widget.Space
+ <androidx.legacy.widget.Space
android:layout_height="10dp"
android:layout_width="match_parent" />
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
diff --git a/tests/JankBench/app/src/main/res/layout/activity_home.xml b/tests/JankBench/app/src/main/res/layout/activity_home.xml
index c4f429922aab..fb3074742f5c 100644
--- a/tests/JankBench/app/src/main/res/layout/activity_home.xml
+++ b/tests/JankBench/app/src/main/res/layout/activity_home.xml
@@ -15,7 +15,7 @@
~
-->
-<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
@@ -28,7 +28,7 @@
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
- <android.support.v7.widget.Toolbar
+ <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
@@ -39,4 +39,4 @@
<include layout="@layout/content_main" />
-</android.support.design.widget.CoordinatorLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/tests/JankBench/app/src/main/res/layout/card_row.xml b/tests/JankBench/app/src/main/res/layout/card_row.xml
index 215f9df9b7fd..9ebff8e2d6ca 100644
--- a/tests/JankBench/app/src/main/res/layout/card_row.xml
+++ b/tests/JankBench/app/src/main/res/layout/card_row.xml
@@ -24,7 +24,7 @@
android:paddingBottom="5dp"
android:clipToPadding="false"
android:background="@null">
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
@@ -32,13 +32,13 @@
android:id="@+id/card_text"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- </android.support.v7.widget.CardView>
+ </androidx.cardview.widget.CardView>
- <android.support.v4.widget.Space
+ <androidx.legacy.widget.Space
android:layout_height="match_parent"
android:layout_width="10dp" />
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
diff --git a/tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml b/tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml
index f3100c7ea75d..3c72dc96a8d9 100644
--- a/tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml
+++ b/tests/JankBench/app/src/main/res/layout/fragment_dashboard.xml
@@ -15,7 +15,7 @@
~
-->
-<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
@@ -39,7 +39,7 @@
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp">
- <android.support.v7.widget.Toolbar
+ <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
@@ -59,7 +59,7 @@
</android.support.design.widget.AppBarLayout>
- <android.support.v4.widget.NestedScrollView
+ <androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
@@ -76,7 +76,7 @@
</LinearLayout>
- </android.support.v4.widget.NestedScrollView>
+ </androidx.core.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/start_button"
@@ -88,4 +88,4 @@
android:layout_margin="@dimen/fab_margin"
android:clickable="true"/>
-</android.support.design.widget.CoordinatorLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/tests/LotsOfApps/AndroidManifest.xml b/tests/LotsOfApps/AndroidManifest.xml
index 1a16570e315c..585ddccf8450 100644
--- a/tests/LotsOfApps/AndroidManifest.xml
+++ b/tests/LotsOfApps/AndroidManifest.xml
@@ -7,700 +7,700 @@
<uses-permission android:name="android.permission.VIBRATE" />
<application>
- <activity android:name="00" android:icon="@drawable/ic_launcher_add_folder">
+ <activity android:name="com.android.lotsofapps.activity00" android:icon="@drawable/ic_launcher_add_folder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="01" android:icon="@drawable/ic_launcher_alarmclock">
+ <activity android:name="com.android.lotsofapps.activity01" android:icon="@drawable/ic_launcher_alarmclock">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="02" android:icon="@drawable/ic_launcher_application">
+ <activity android:name="com.android.lotsofapps.activity02" android:icon="@drawable/ic_launcher_application">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="03" android:icon="@drawable/ic_launcher_browser">
+ <activity android:name="com.android.lotsofapps.activity03" android:icon="@drawable/ic_launcher_browser">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="04" android:icon="@drawable/ic_launcher_camera">
+ <activity android:name="com.android.lotsofapps.activity04" android:icon="@drawable/ic_launcher_camera">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="05" android:icon="@drawable/ic_launcher_camera_record">
+ <activity android:name="com.android.lotsofapps.activity05" android:icon="@drawable/ic_launcher_camera_record">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="06" android:icon="@drawable/ic_launcher_contacts">
+ <activity android:name="com.android.lotsofapps.activity06" android:icon="@drawable/ic_launcher_contacts">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="07" android:icon="@drawable/ic_launcher_drm_file">
+ <activity android:name="com.android.lotsofapps.activity07" android:icon="@drawable/ic_launcher_drm_file">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="08" android:icon="@drawable/ic_launcher_folder">
+ <activity android:name="com.android.lotsofapps.activity08" android:icon="@drawable/ic_launcher_folder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="09" android:icon="@drawable/ic_launcher_folder_bluetooth">
+ <activity android:name="com.android.lotsofapps.activity09" android:icon="@drawable/ic_launcher_folder_bluetooth">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="10" android:icon="@drawable/ic_launcher_folder_live">
+ <activity android:name="com.android.lotsofapps.activity10" android:icon="@drawable/ic_launcher_folder_live">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="11" android:icon="@drawable/ic_launcher_folder_live_contacts">
+ <activity android:name="com.android.lotsofapps.activity11" android:icon="@drawable/ic_launcher_folder_live_contacts">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="12" android:icon="@drawable/ic_launcher_folder_live_contacts_phone">
+ <activity android:name="com.android.lotsofapps.activity12" android:icon="@drawable/ic_launcher_folder_live_contacts_phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="13" android:icon="@drawable/ic_launcher_folder_live_contacts_starred">
+ <activity android:name="com.android.lotsofapps.activity13" android:icon="@drawable/ic_launcher_folder_live_contacts_starred">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="14" android:icon="@drawable/ic_launcher_folder_open">
+ <activity android:name="com.android.lotsofapps.activity14" android:icon="@drawable/ic_launcher_folder_open">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="15" android:icon="@drawable/ic_launcher_gallery">
+ <activity android:name="com.android.lotsofapps.activity15" android:icon="@drawable/ic_launcher_gallery">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="16" android:icon="@drawable/ic_launcher_home">
+ <activity android:name="com.android.lotsofapps.activity16" android:icon="@drawable/ic_launcher_home">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="17" android:icon="@drawable/ic_launcher_im">
+ <activity android:name="com.android.lotsofapps.activity17" android:icon="@drawable/ic_launcher_im">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="18" android:icon="@drawable/ic_launcher_musicplayer_2">
+ <activity android:name="com.android.lotsofapps.activity18" android:icon="@drawable/ic_launcher_musicplayer_2">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="19" android:icon="@drawable/ic_launcher_phone">
+ <activity android:name="com.android.lotsofapps.activity19" android:icon="@drawable/ic_launcher_phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="20" android:icon="@drawable/ic_launcher_record_audio">
+ <activity android:name="com.android.lotsofapps.activity20" android:icon="@drawable/ic_launcher_record_audio">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="21" android:icon="@drawable/ic_launcher_settings">
+ <activity android:name="com.android.lotsofapps.activity21" android:icon="@drawable/ic_launcher_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="22" android:icon="@drawable/ic_launcher_shortcut">
+ <activity android:name="com.android.lotsofapps.activity22" android:icon="@drawable/ic_launcher_shortcut">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="23" android:icon="@drawable/ic_launcher_shortcut_browser_bookmark">
+ <activity android:name="com.android.lotsofapps.activity23" android:icon="@drawable/ic_launcher_shortcut_browser_bookmark">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="24" android:icon="@drawable/ic_launcher_contacts">
+ <activity android:name="com.android.lotsofapps.activity24" android:icon="@drawable/ic_launcher_contacts">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="25" android:icon="@drawable/ic_launcher_shortcut_directdial">
+ <activity android:name="com.android.lotsofapps.activity25" android:icon="@drawable/ic_launcher_shortcut_directdial">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="26" android:icon="@drawable/ic_launcher_shortcut_directmessage">
+ <activity android:name="com.android.lotsofapps.activity26" android:icon="@drawable/ic_launcher_shortcut_directmessage">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="27" android:icon="@drawable/ic_launcher_browser">
+ <activity android:name="com.android.lotsofapps.activity27" android:icon="@drawable/ic_launcher_browser">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="28" android:icon="@drawable/ic_launcher_sim_toolkit">
+ <activity android:name="com.android.lotsofapps.activity28" android:icon="@drawable/ic_launcher_sim_toolkit">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="29" android:icon="@drawable/ic_launcher_slideshow_add_sms">
+ <activity android:name="com.android.lotsofapps.activity29" android:icon="@drawable/ic_launcher_slideshow_add_sms">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="20" android:icon="@drawable/ic_launcher_slideshow_default_sms">
+ <activity android:name="com.android.lotsofapps.activity20" android:icon="@drawable/ic_launcher_slideshow_default_sms">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="31" android:icon="@drawable/ic_launcher_smsmms">
+ <activity android:name="com.android.lotsofapps.activity31" android:icon="@drawable/ic_launcher_smsmms">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="32" android:icon="@drawable/ic_launcher_soundrecorder">
+ <activity android:name="com.android.lotsofapps.activity32" android:icon="@drawable/ic_launcher_soundrecorder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="33" android:icon="@drawable/ic_launcher_video_camera">
+ <activity android:name="com.android.lotsofapps.activity33" android:icon="@drawable/ic_launcher_video_camera">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="34" android:icon="@drawable/ic_launcher_video_player">
+ <activity android:name="com.android.lotsofapps.activity34" android:icon="@drawable/ic_launcher_video_player">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="35" android:icon="@drawable/ic_launcher_wallpaper">
+ <activity android:name="com.android.lotsofapps.activity35" android:icon="@drawable/ic_launcher_wallpaper">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="36" android:icon="@drawable/ic_launcher_im">
+ <activity android:name="com.android.lotsofapps.activity36" android:icon="@drawable/ic_launcher_im">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="37" android:icon="@drawable/ic_launcher_musicplayer_2">
+ <activity android:name="com.android.lotsofapps.activity37" android:icon="@drawable/ic_launcher_musicplayer_2">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="38" android:icon="@drawable/ic_launcher_phone">
+ <activity android:name="com.android.lotsofapps.activity38" android:icon="@drawable/ic_launcher_phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="39" android:icon="@drawable/ic_launcher_record_audio">
+ <activity android:name="com.android.lotsofapps.activity39" android:icon="@drawable/ic_launcher_record_audio">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="40" android:icon="@drawable/ic_launcher_settings">
+ <activity android:name="com.android.lotsofapps.activity40" android:icon="@drawable/ic_launcher_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="41" android:icon="@drawable/ic_launcher_shortcut">
+ <activity android:name="com.android.lotsofapps.activity41" android:icon="@drawable/ic_launcher_shortcut">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="42" android:icon="@drawable/ic_launcher_sim_toolkit">
+ <activity android:name="com.android.lotsofapps.activity42" android:icon="@drawable/ic_launcher_sim_toolkit">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="43" android:icon="@drawable/ic_launcher_smsmms">
+ <activity android:name="com.android.lotsofapps.activity43" android:icon="@drawable/ic_launcher_smsmms">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="44" android:icon="@drawable/ic_launcher_soundrecorder">
+ <activity android:name="com.android.lotsofapps.activity44" android:icon="@drawable/ic_launcher_soundrecorder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="45" android:icon="@drawable/ic_launcher_video_camera">
+ <activity android:name="com.android.lotsofapps.activity45" android:icon="@drawable/ic_launcher_video_camera">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="46" android:icon="@drawable/ic_launcher_wallpaper">
+ <activity android:name="com.android.lotsofapps.activity46" android:icon="@drawable/ic_launcher_wallpaper">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="47" android:icon="@drawable/ic_launcher_drm_file">
+ <activity android:name="com.android.lotsofapps.activity47" android:icon="@drawable/ic_launcher_drm_file">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="48" android:icon="@drawable/ic_launcher_contacts">
+ <activity android:name="com.android.lotsofapps.activity48" android:icon="@drawable/ic_launcher_contacts">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="49" android:icon="@drawable/ic_launcher_drm_file">
+ <activity android:name="com.android.lotsofapps.activity49" android:icon="@drawable/ic_launcher_drm_file">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="50" android:icon="@drawable/ic_launcher_add_folder">
+ <activity android:name="com.android.lotsofapps.activity50" android:icon="@drawable/ic_launcher_add_folder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="51" android:icon="@drawable/ic_launcher_alarmclock">
+ <activity android:name="com.android.lotsofapps.activity51" android:icon="@drawable/ic_launcher_alarmclock">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="52" android:icon="@drawable/ic_launcher_application">
+ <activity android:name="com.android.lotsofapps.activity52" android:icon="@drawable/ic_launcher_application">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="53" android:icon="@drawable/ic_launcher_browser">
+ <activity android:name="com.android.lotsofapps.activity53" android:icon="@drawable/ic_launcher_browser">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="54" android:icon="@drawable/ic_launcher_camera">
+ <activity android:name="com.android.lotsofapps.activity54" android:icon="@drawable/ic_launcher_camera">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="55" android:icon="@drawable/ic_launcher_camera_record">
+ <activity android:name="com.android.lotsofapps.activity55" android:icon="@drawable/ic_launcher_camera_record">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="56" android:icon="@drawable/ic_launcher_contacts">
+ <activity android:name="com.android.lotsofapps.activity56" android:icon="@drawable/ic_launcher_contacts">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="57" android:icon="@drawable/ic_launcher_drm_file">
+ <activity android:name="com.android.lotsofapps.activity57" android:icon="@drawable/ic_launcher_drm_file">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="58" android:icon="@drawable/ic_launcher_folder">
+ <activity android:name="com.android.lotsofapps.activity58" android:icon="@drawable/ic_launcher_folder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="59" android:icon="@drawable/ic_launcher_folder_bluetooth">
+ <activity android:name="com.android.lotsofapps.activity59" android:icon="@drawable/ic_launcher_folder_bluetooth">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="60" android:icon="@drawable/ic_launcher_folder_live">
+ <activity android:name="com.android.lotsofapps.activity60" android:icon="@drawable/ic_launcher_folder_live">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="61" android:icon="@drawable/ic_launcher_folder_live_contacts">
+ <activity android:name="com.android.lotsofapps.activity61" android:icon="@drawable/ic_launcher_folder_live_contacts">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="62" android:icon="@drawable/ic_launcher_folder_live_contacts_phone">
+ <activity android:name="com.android.lotsofapps.activity62" android:icon="@drawable/ic_launcher_folder_live_contacts_phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="63" android:icon="@drawable/ic_launcher_folder_live_contacts_starred">
+ <activity android:name="com.android.lotsofapps.activity63" android:icon="@drawable/ic_launcher_folder_live_contacts_starred">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="64" android:icon="@drawable/ic_launcher_folder_open">
+ <activity android:name="com.android.lotsofapps.activity64" android:icon="@drawable/ic_launcher_folder_open">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="65" android:icon="@drawable/ic_launcher_gallery">
+ <activity android:name="com.android.lotsofapps.activity65" android:icon="@drawable/ic_launcher_gallery">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="66" android:icon="@drawable/ic_launcher_home">
+ <activity android:name="com.android.lotsofapps.activity66" android:icon="@drawable/ic_launcher_home">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="67" android:icon="@drawable/ic_launcher_im">
+ <activity android:name="com.android.lotsofapps.activity67" android:icon="@drawable/ic_launcher_im">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="68" android:icon="@drawable/ic_launcher_musicplayer_2">
+ <activity android:name="com.android.lotsofapps.activity68" android:icon="@drawable/ic_launcher_musicplayer_2">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="69" android:icon="@drawable/ic_launcher_phone">
+ <activity android:name="com.android.lotsofapps.activity69" android:icon="@drawable/ic_launcher_phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="70" android:icon="@drawable/ic_launcher_record_audio">
+ <activity android:name="com.android.lotsofapps.activity70" android:icon="@drawable/ic_launcher_record_audio">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="71" android:icon="@drawable/ic_launcher_settings">
+ <activity android:name="com.android.lotsofapps.activity71" android:icon="@drawable/ic_launcher_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="72" android:icon="@drawable/ic_launcher_shortcut">
+ <activity android:name="com.android.lotsofapps.activity72" android:icon="@drawable/ic_launcher_shortcut">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="73" android:icon="@drawable/ic_launcher_shortcut_browser_bookmark">
+ <activity android:name="com.android.lotsofapps.activity73" android:icon="@drawable/ic_launcher_shortcut_browser_bookmark">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="74" android:icon="@drawable/ic_launcher_contacts">
+ <activity android:name="com.android.lotsofapps.activity74" android:icon="@drawable/ic_launcher_contacts">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="75" android:icon="@drawable/ic_launcher_shortcut_directdial">
+ <activity android:name="com.android.lotsofapps.activity75" android:icon="@drawable/ic_launcher_shortcut_directdial">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="76" android:icon="@drawable/ic_launcher_shortcut_directmessage">
+ <activity android:name="com.android.lotsofapps.activity76" android:icon="@drawable/ic_launcher_shortcut_directmessage">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="77" android:icon="@drawable/ic_launcher_browser">
+ <activity android:name="com.android.lotsofapps.activity77" android:icon="@drawable/ic_launcher_browser">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="78" android:icon="@drawable/ic_launcher_sim_toolkit">
+ <activity android:name="com.android.lotsofapps.activity78" android:icon="@drawable/ic_launcher_sim_toolkit">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="79" android:icon="@drawable/ic_launcher_slideshow_add_sms">
+ <activity android:name="com.android.lotsofapps.activity79" android:icon="@drawable/ic_launcher_slideshow_add_sms">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="80" android:icon="@drawable/ic_launcher_slideshow_default_sms">
+ <activity android:name="com.android.lotsofapps.activity80" android:icon="@drawable/ic_launcher_slideshow_default_sms">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="81" android:icon="@drawable/ic_launcher_smsmms">
+ <activity android:name="com.android.lotsofapps.activity81" android:icon="@drawable/ic_launcher_smsmms">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="82" android:icon="@drawable/ic_launcher_soundrecorder">
+ <activity android:name="com.android.lotsofapps.activity82" android:icon="@drawable/ic_launcher_soundrecorder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="83" android:icon="@drawable/ic_launcher_video_camera">
+ <activity android:name="com.android.lotsofapps.activity83" android:icon="@drawable/ic_launcher_video_camera">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="84" android:icon="@drawable/ic_launcher_video_player">
+ <activity android:name="com.android.lotsofapps.activity84" android:icon="@drawable/ic_launcher_video_player">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="85" android:icon="@drawable/ic_launcher_wallpaper">
+ <activity android:name="com.android.lotsofapps.activity85" android:icon="@drawable/ic_launcher_wallpaper">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="86" android:icon="@drawable/ic_launcher_im">
+ <activity android:name="com.android.lotsofapps.activity86" android:icon="@drawable/ic_launcher_im">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="87" android:icon="@drawable/ic_launcher_musicplayer_2">
+ <activity android:name="com.android.lotsofapps.activity87" android:icon="@drawable/ic_launcher_musicplayer_2">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="88" android:icon="@drawable/ic_launcher_phone">
+ <activity android:name="com.android.lotsofapps.activity88" android:icon="@drawable/ic_launcher_phone">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="89" android:icon="@drawable/ic_launcher_record_audio">
+ <activity android:name="com.android.lotsofapps.activity89" android:icon="@drawable/ic_launcher_record_audio">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="90" android:icon="@drawable/ic_launcher_settings">
+ <activity android:name="com.android.lotsofapps.activity90" android:icon="@drawable/ic_launcher_settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="91" android:icon="@drawable/ic_launcher_shortcut">
+ <activity android:name="com.android.lotsofapps.activity91" android:icon="@drawable/ic_launcher_shortcut">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="92" android:icon="@drawable/ic_launcher_sim_toolkit">
+ <activity android:name="com.android.lotsofapps.activity92" android:icon="@drawable/ic_launcher_sim_toolkit">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="93" android:icon="@drawable/ic_launcher_smsmms">
+ <activity android:name="com.android.lotsofapps.activity93" android:icon="@drawable/ic_launcher_smsmms">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="94" android:icon="@drawable/ic_launcher_soundrecorder">
+ <activity android:name="com.android.lotsofapps.activity94" android:icon="@drawable/ic_launcher_soundrecorder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="95" android:icon="@drawable/ic_launcher_video_camera">
+ <activity android:name="com.android.lotsofapps.activity95" android:icon="@drawable/ic_launcher_video_camera">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="96" android:icon="@drawable/ic_launcher_wallpaper">
+ <activity android:name="com.android.lotsofapps.activity96" android:icon="@drawable/ic_launcher_wallpaper">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="97" android:icon="@drawable/ic_launcher_drm_file">
+ <activity android:name="com.android.lotsofapps.activity97" android:icon="@drawable/ic_launcher_drm_file">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="98" android:icon="@drawable/ic_launcher_contacts">
+ <activity android:name="com.android.lotsofapps.activity98" android:icon="@drawable/ic_launcher_contacts">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name="99" android:icon="@drawable/ic_launcher_drm_file">
+ <activity android:name="com.android.lotsofapps.activity99" android:icon="@drawable/ic_launcher_drm_file">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
diff --git a/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java b/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
index 1ae318a96a50..653282d0d365 100644
--- a/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
+++ b/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java
@@ -18,7 +18,9 @@ package com.android.tests.memoryusage;
import android.app.ActivityManager;
import android.app.ActivityManager.ProcessErrorStateInfo;
import android.app.ActivityManager.RunningAppProcessInfo;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
+import android.app.IActivityTaskManager;
import android.app.UiAutomation;
import android.content.Context;
import android.content.Intent;
@@ -66,6 +68,7 @@ public class MemoryUsageTest extends InstrumentationTestCase {
private Map<String, String> mNameToResultKey;
private Set<String> mPersistentProcesses;
private IActivityManager mAm;
+ private IActivityTaskManager mAtm;
@Override
protected void setUp() throws Exception {
@@ -84,6 +87,7 @@ public class MemoryUsageTest extends InstrumentationTestCase {
(MemoryUsageInstrumentation) getInstrumentation();
Bundle args = instrumentation.getBundle();
mAm = ActivityManager.getService();
+ mAtm = ActivityTaskManager.getService();
createMappings();
parseArgs(args);
@@ -316,7 +320,7 @@ public class MemoryUsageTest extends InstrumentationTestCase {
UserHandle.USER_CURRENT);
}
- mAm.startActivityAndWait(null, null, mLaunchIntent, mimeType,
+ mAtm.startActivityAndWait(null, null, mLaunchIntent, mimeType,
null, null, 0, mLaunchIntent.getFlags(), null, null,
UserHandle.USER_CURRENT_OR_SELF);
} catch (RemoteException e) {
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 b763c78207de..b4b5ca7161fc 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
@@ -30,6 +30,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
+import android.os.Trace;
import java.util.ArrayList;
import java.util.Collections;
@@ -42,6 +43,7 @@ class TouchLatencyView extends View implements View.OnTouchListener {
public TouchLatencyView(Context context, AttributeSet attrs) {
super(context, attrs);
+ Trace.beginSection("TouchLatencyView constructor");
setOnTouchListener(this);
setWillNotDraw(false);
mBluePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
@@ -63,48 +65,56 @@ class TouchLatencyView extends View implements View.OnTouchListener {
mBallY = 100.0f;
mVelocityX = 7.0f;
mVelocityY = 7.0f;
+ Trace.endSection();
}
@Override
public boolean onTouch(View view, MotionEvent event) {
+ Trace.beginSection("TouchLatencyView onTouch");
int action = event.getActionMasked();
if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) {
mTouching = true;
invalidate();
+
+ mTouchX = event.getX();
+ mTouchY = event.getY();
} else if (action == MotionEvent.ACTION_UP) {
mTouching = false;
invalidate();
- return true;
- } else {
- return true;
}
- mTouchX = event.getX();
- mTouchY = event.getY();
+ Trace.endSection();
return true;
}
private void drawTouch(Canvas canvas) {
- if (!mTouching) {
- Log.d(LOG_TAG, "Filling background");
- canvas.drawColor(BACKGROUND_COLOR);
- return;
- }
+ Trace.beginSection("TouchLatencyView drawTouch");
- float deltaX = (mTouchX - mLastDrawnX);
- float deltaY = (mTouchY - mLastDrawnY);
- float scaleFactor = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 1.5f;
+ try {
+ if (!mTouching) {
+ Log.d(LOG_TAG, "Filling background");
+ canvas.drawColor(BACKGROUND_COLOR);
+ return;
+ }
- mLastDrawnX = mTouchX;
- mLastDrawnY = mTouchY;
+ float deltaX = (mTouchX - mLastDrawnX);
+ float deltaY = (mTouchY - mLastDrawnY);
+ float scaleFactor = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 1.5f;
- canvas.drawColor(BACKGROUND_COLOR);
- canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + 3 * scaleFactor, mRedPaint);
- canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + 2 * scaleFactor, mYellowPaint);
- canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + scaleFactor, mGreenPaint);
- canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS, mBluePaint);
+ mLastDrawnX = mTouchX;
+ mLastDrawnY = mTouchY;
+
+ canvas.drawColor(BACKGROUND_COLOR);
+ canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + 3 * scaleFactor, mRedPaint);
+ canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + 2 * scaleFactor, mYellowPaint);
+ canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + scaleFactor, mGreenPaint);
+ canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS, mBluePaint);
+ } finally {
+ Trace.endSection();
+ }
}
private void drawBall(Canvas canvas) {
+ Trace.beginSection("TouchLatencyView drawBall");
int width = canvas.getWidth();
int height = canvas.getHeight();
@@ -141,25 +151,29 @@ class TouchLatencyView extends View implements View.OnTouchListener {
canvas.drawColor(BACKGROUND_COLOR);
canvas.drawOval(left, top, right, bottom, mYellowPaint);
invalidate();
+ Trace.endSection();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
-
+ Trace.beginSection("TouchLatencyView onDraw");
if (mMode == 0) {
drawTouch(canvas);
} else {
drawBall(canvas);
}
+ Trace.endSection();
}
public void changeMode(MenuItem item) {
+ Trace.beginSection("TouchLatencyView changeMode");
final int NUM_MODES = 2;
final String modes[] = {"Touch", "Ball"};
mMode = (mMode + 1) % NUM_MODES;
invalidate();
item.setTitle(modes[mMode]);
+ Trace.endSection();
}
private Paint mBluePaint, mGreenPaint, mYellowPaint, mRedPaint;
@@ -178,21 +192,26 @@ public class TouchLatencyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ Trace.beginSection("TouchLatencyActivity onCreate");
setContentView(R.layout.activity_touch_latency);
mTouchView = findViewById(R.id.canvasView);
+ Trace.endSection();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
+ Trace.beginSection("TouchLatencyActivity onCreateOptionsMenu");
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_touch_latency, menu);
+ Trace.endSection();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
+ Trace.beginSection("TouchLatencyActivity onOptionsItemSelected");
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
@@ -203,6 +222,7 @@ public class TouchLatencyActivity extends Activity {
mTouchView.changeMode(item);
}
+ Trace.endSection();
return super.onOptionsItemSelected(item);
}
diff --git a/tests/UiBench/Android.mk b/tests/UiBench/Android.mk
index c8e6c2091d8f..6ec0fbbb5ed9 100644
--- a/tests/UiBench/Android.mk
+++ b/tests/UiBench/Android.mk
@@ -15,12 +15,12 @@ LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_USE_AAPT2 := true
LOCAL_STATIC_ANDROID_LIBRARIES := \
- $(ANDROID_SUPPORT_DESIGN_TARGETS) \
- android-support-v4 \
- android-support-v7-appcompat \
- android-support-v7-cardview \
- android-support-v7-recyclerview \
- android-support-v17-leanback
+ androidx.design_design \
+ androidx.legacy_legacy-support-v4 \
+ androidx.appcompat_appcompat \
+ androidx.cardview_cardview \
+ androidx.recyclerview_recyclerview \
+ androidx.leanback_leanback
LOCAL_PACKAGE_NAME := UiBench
diff --git a/tests/UiBench/res/layout/activity_bitmap_upload.xml b/tests/UiBench/res/layout/activity_bitmap_upload.xml
index 70faa07a6d75..9a8293437c21 100644
--- a/tests/UiBench/res/layout/activity_bitmap_upload.xml
+++ b/tests/UiBench/res/layout/activity_bitmap_upload.xml
@@ -22,7 +22,7 @@
android:layout_height="match_parent"
android:padding="10dp"
android:clipToPadding="false">
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
@@ -30,22 +30,22 @@
android:id="@+id/upload_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- </android.support.v7.widget.CardView>
+ </androidx.cardview.widget.CardView>
- <android.support.v4.widget.Space
+ <androidx.legacy.widget.Space
android:layout_height="10dp"
android:layout_width="match_parent" />
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
- <android.support.v4.widget.Space
+ <androidx.legacy.widget.Space
android:layout_height="10dp"
android:layout_width="match_parent" />
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
diff --git a/tests/UiBench/res/layout/activity_navigation_drawer.xml b/tests/UiBench/res/layout/activity_navigation_drawer.xml
index 8d4bfafd8dd8..282fb7870526 100644
--- a/tests/UiBench/res/layout/activity_navigation_drawer.xml
+++ b/tests/UiBench/res/layout/activity_navigation_drawer.xml
@@ -14,7 +14,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<android.support.v4.widget.DrawerLayout
+<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
@@ -36,4 +36,4 @@
app:headerLayout="@layout/nav_header_navigation_drawer"
app:menu="@menu/activity_navigation_drawer_drawer"/>
-</android.support.v4.widget.DrawerLayout>
+</androidx.drawerlayout.widget.DrawerLayout>
diff --git a/tests/UiBench/res/layout/app_bar_navigation_drawer.xml b/tests/UiBench/res/layout/app_bar_navigation_drawer.xml
index 5657587f7772..b9791341a40b 100644
--- a/tests/UiBench/res/layout/app_bar_navigation_drawer.xml
+++ b/tests/UiBench/res/layout/app_bar_navigation_drawer.xml
@@ -14,7 +14,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<android.support.design.widget.CoordinatorLayout
+<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
@@ -26,11 +26,11 @@
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
- <android.support.v7.widget.Toolbar
+ <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"/>
</android.support.design.widget.AppBarLayout>
-</android.support.design.widget.CoordinatorLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/tests/UiBench/res/layout/card_row.xml b/tests/UiBench/res/layout/card_row.xml
index 215f9df9b7fd..9ebff8e2d6ca 100644
--- a/tests/UiBench/res/layout/card_row.xml
+++ b/tests/UiBench/res/layout/card_row.xml
@@ -24,7 +24,7 @@
android:paddingBottom="5dp"
android:clipToPadding="false"
android:background="@null">
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
@@ -32,13 +32,13 @@
android:id="@+id/card_text"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- </android.support.v7.widget.CardView>
+ </androidx.cardview.widget.CardView>
- <android.support.v4.widget.Space
+ <androidx.legacy.widget.Space
android:layout_height="match_parent"
android:layout_width="10dp" />
- <android.support.v7.widget.CardView
+ <androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
diff --git a/tests/UiBench/res/layout/recycler_view.xml b/tests/UiBench/res/layout/recycler_view.xml
index 54c5b5845ae2..53eab68f7866 100644
--- a/tests/UiBench/res/layout/recycler_view.xml
+++ b/tests/UiBench/res/layout/recycler_view.xml
@@ -14,7 +14,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<android.support.v7.widget.RecyclerView
+<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
diff --git a/tests/UiBench/src/com/android/test/uibench/ActivityTransition.java b/tests/UiBench/src/com/android/test/uibench/ActivityTransition.java
index c212c4cbf61a..50f145a1b171 100644
--- a/tests/UiBench/src/com/android/test/uibench/ActivityTransition.java
+++ b/tests/UiBench/src/com/android/test/uibench/ActivityTransition.java
@@ -22,7 +22,7 @@ import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
diff --git a/tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java b/tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java
index a4d57e173bfa..0f73765e87e7 100644
--- a/tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java
+++ b/tests/UiBench/src/com/android/test/uibench/ActivityTransitionDetails.java
@@ -21,7 +21,7 @@ import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
diff --git a/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java b/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java
index 235e0e61b353..09236ffebdf4 100644
--- a/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/BitmapUploadActivity.java
@@ -23,7 +23,7 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
diff --git a/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java b/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java
index fee7480fa65e..6e24ce1de3aa 100644
--- a/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/ClippedListActivity.java
@@ -17,13 +17,13 @@ package com.android.test.uibench;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.ListFragment;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.ListFragment;
+import androidx.core.view.GravityCompat;
+import androidx.drawerlayout.widget.DrawerLayout;
+import androidx.appcompat.app.ActionBarDrawerToggle;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
diff --git a/tests/UiBench/src/com/android/test/uibench/DialogListActivity.java b/tests/UiBench/src/com/android/test/uibench/DialogListActivity.java
index fe712d5230bb..c87b49b9f66f 100644
--- a/tests/UiBench/src/com/android/test/uibench/DialogListActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/DialogListActivity.java
@@ -16,8 +16,8 @@
package com.android.test.uibench;
import android.os.Bundle;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
diff --git a/tests/UiBench/src/com/android/test/uibench/EditTextTypeActivity.java b/tests/UiBench/src/com/android/test/uibench/EditTextTypeActivity.java
index 08ab5105a5e8..1b2c3c60ffd4 100644
--- a/tests/UiBench/src/com/android/test/uibench/EditTextTypeActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/EditTextTypeActivity.java
@@ -19,7 +19,7 @@ import android.app.Instrumentation;
import android.os.Bundle;
import android.os.Looper;
import android.os.MessageQueue;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.KeyEvent;
import android.widget.EditText;
diff --git a/tests/UiBench/src/com/android/test/uibench/FadingEdgeListActivity.java b/tests/UiBench/src/com/android/test/uibench/FadingEdgeListActivity.java
index 3241e669fb1d..f8e9f03ee599 100644
--- a/tests/UiBench/src/com/android/test/uibench/FadingEdgeListActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/FadingEdgeListActivity.java
@@ -15,7 +15,7 @@
*/
package com.android.test.uibench;
-import android.support.v4.app.ListFragment;
+import androidx.fragment.app.ListFragment;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
diff --git a/tests/UiBench/src/com/android/test/uibench/FullscreenOverdrawActivity.java b/tests/UiBench/src/com/android/test/uibench/FullscreenOverdrawActivity.java
index b9c5fac96a3e..882163bd6b0e 100644
--- a/tests/UiBench/src/com/android/test/uibench/FullscreenOverdrawActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/FullscreenOverdrawActivity.java
@@ -25,7 +25,7 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
/**
diff --git a/tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java b/tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java
index 36d703c8e1a2..b26a660981da 100644
--- a/tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/GlTextureViewActivity.java
@@ -20,7 +20,7 @@ import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.graphics.SurfaceTexture;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
diff --git a/tests/UiBench/src/com/android/test/uibench/InvalidateActivity.java b/tests/UiBench/src/com/android/test/uibench/InvalidateActivity.java
index 81d03ffee0ed..76ed1ae4e445 100644
--- a/tests/UiBench/src/com/android/test/uibench/InvalidateActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/InvalidateActivity.java
@@ -21,8 +21,8 @@ import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
-import android.support.annotation.ColorInt;
-import android.support.v7.app.AppCompatActivity;
+import androidx.annotation.ColorInt;
+import androidx.appcompat.app.AppCompatActivity;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
diff --git a/tests/UiBench/src/com/android/test/uibench/InvalidateTreeActivity.java b/tests/UiBench/src/com/android/test/uibench/InvalidateTreeActivity.java
index b800c26bfc60..804ced14d522 100644
--- a/tests/UiBench/src/com/android/test/uibench/InvalidateTreeActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/InvalidateTreeActivity.java
@@ -19,7 +19,7 @@ import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.graphics.Color;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.ViewGroup;
import android.widget.LinearLayout;
diff --git a/tests/UiBench/src/com/android/test/uibench/MainActivity.java b/tests/UiBench/src/com/android/test/uibench/MainActivity.java
index 79837b6ea250..0a7aa4281b00 100644
--- a/tests/UiBench/src/com/android/test/uibench/MainActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/MainActivity.java
@@ -19,9 +19,9 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.ListFragment;
-import android.support.v7.app.AppCompatActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.ListFragment;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
diff --git a/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java b/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java
index a54110454f7a..6a7761ceaae0 100644
--- a/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/NavigationDrawerActivity.java
@@ -17,11 +17,11 @@ package com.android.test.uibench;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.widget.DrawerLayout;
-import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
+import androidx.core.view.GravityCompat;
+import androidx.drawerlayout.widget.DrawerLayout;
+import androidx.appcompat.app.ActionBarDrawerToggle;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
import android.view.MenuItem;
public class NavigationDrawerActivity extends AppCompatActivity
diff --git a/tests/UiBench/src/com/android/test/uibench/NotificationShadeActivity.java b/tests/UiBench/src/com/android/test/uibench/NotificationShadeActivity.java
index 70deeead6cf1..1ab90fe97c87 100644
--- a/tests/UiBench/src/com/android/test/uibench/NotificationShadeActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/NotificationShadeActivity.java
@@ -18,8 +18,8 @@ package com.android.test.uibench;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.app.AppCompatActivity;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
diff --git a/tests/UiBench/src/com/android/test/uibench/ResizeHWLayerActivity.java b/tests/UiBench/src/com/android/test/uibench/ResizeHWLayerActivity.java
index 23a2713abd40..80d495df142c 100644
--- a/tests/UiBench/src/com/android/test/uibench/ResizeHWLayerActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/ResizeHWLayerActivity.java
@@ -19,7 +19,7 @@ import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.graphics.Color;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
diff --git a/tests/UiBench/src/com/android/test/uibench/SaveLayerInterleaveActivity.java b/tests/UiBench/src/com/android/test/uibench/SaveLayerInterleaveActivity.java
index eec91cb38066..332240d7639b 100644
--- a/tests/UiBench/src/com/android/test/uibench/SaveLayerInterleaveActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/SaveLayerInterleaveActivity.java
@@ -23,7 +23,7 @@ import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
/**
* Test Canvas.saveLayer performance by interleaving drawText/drawRect with saveLayer.
diff --git a/tests/UiBench/src/com/android/test/uibench/ScrollableWebViewActivity.java b/tests/UiBench/src/com/android/test/uibench/ScrollableWebViewActivity.java
index 02c2a0898cdd..e754c3ab5726 100644
--- a/tests/UiBench/src/com/android/test/uibench/ScrollableWebViewActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/ScrollableWebViewActivity.java
@@ -16,7 +16,7 @@
package com.android.test.uibench;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.webkit.WebView;
public class ScrollableWebViewActivity extends AppCompatActivity {
diff --git a/tests/UiBench/src/com/android/test/uibench/ShadowGridActivity.java b/tests/UiBench/src/com/android/test/uibench/ShadowGridActivity.java
index 88847eed17fa..af7c65acafd4 100644
--- a/tests/UiBench/src/com/android/test/uibench/ShadowGridActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/ShadowGridActivity.java
@@ -16,9 +16,9 @@
package com.android.test.uibench;
import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.ListFragment;
-import android.support.v7.app.AppCompatActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.ListFragment;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
diff --git a/tests/UiBench/src/com/android/test/uibench/SlowBindRecyclerViewActivity.java b/tests/UiBench/src/com/android/test/uibench/SlowBindRecyclerViewActivity.java
index e32862f7b7fd..14e59ae46917 100644
--- a/tests/UiBench/src/com/android/test/uibench/SlowBindRecyclerViewActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/SlowBindRecyclerViewActivity.java
@@ -17,8 +17,8 @@ package com.android.test.uibench;
import android.content.Context;
import android.os.Trace;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import com.android.test.uibench.recyclerview.RvBoxAdapter;
import com.android.test.uibench.recyclerview.RvCompatListActivity;
diff --git a/tests/UiBench/src/com/android/test/uibench/SlowNestedRecyclerViewActivity.java b/tests/UiBench/src/com/android/test/uibench/SlowNestedRecyclerViewActivity.java
index 305c05104f95..8fdd4b90c23e 100644
--- a/tests/UiBench/src/com/android/test/uibench/SlowNestedRecyclerViewActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/SlowNestedRecyclerViewActivity.java
@@ -20,8 +20,8 @@ import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.InsetDrawable;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
diff --git a/tests/UiBench/src/com/android/test/uibench/TrivialAnimationActivity.java b/tests/UiBench/src/com/android/test/uibench/TrivialAnimationActivity.java
index 6e984727836e..3ee132efbf50 100644
--- a/tests/UiBench/src/com/android/test/uibench/TrivialAnimationActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/TrivialAnimationActivity.java
@@ -19,7 +19,7 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
public class TrivialAnimationActivity extends AppCompatActivity {
@Override
diff --git a/tests/UiBench/src/com/android/test/uibench/TrivialRecyclerViewActivity.java b/tests/UiBench/src/com/android/test/uibench/TrivialRecyclerViewActivity.java
index 4647ba774b2e..b30055810465 100644
--- a/tests/UiBench/src/com/android/test/uibench/TrivialRecyclerViewActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/TrivialRecyclerViewActivity.java
@@ -15,7 +15,7 @@
*/
package com.android.test.uibench;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView;
import com.android.test.uibench.recyclerview.RvArrayAdapter;
import com.android.test.uibench.recyclerview.RvCompatListActivity;
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/BitmapLoader.java b/tests/UiBench/src/com/android/test/uibench/leanback/BitmapLoader.java
index 8af9d3bca647..ca379daedc1d 100644
--- a/tests/UiBench/src/com/android/test/uibench/leanback/BitmapLoader.java
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/BitmapLoader.java
@@ -21,7 +21,7 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.AsyncTask;
-import android.support.v4.util.LruCache;
+import androidx.collection.LruCache;
import android.util.DisplayMetrics;
import android.widget.ImageView;
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/BrowseActivity.java b/tests/UiBench/src/com/android/test/uibench/leanback/BrowseActivity.java
index d29f0eaf6fdc..804a2f3b9dc8 100644
--- a/tests/UiBench/src/com/android/test/uibench/leanback/BrowseActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/BrowseActivity.java
@@ -13,7 +13,7 @@
*/
package com.android.test.uibench.leanback;
-import android.support.v4.app.FragmentActivity;
+import androidx.fragment.app.FragmentActivity;
import android.app.Activity;
import android.os.Bundle;
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/BrowseFragment.java b/tests/UiBench/src/com/android/test/uibench/leanback/BrowseFragment.java
index 4ab38a66d504..b1cd89d4997d 100644
--- a/tests/UiBench/src/com/android/test/uibench/leanback/BrowseFragment.java
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/BrowseFragment.java
@@ -17,7 +17,7 @@ package com.android.test.uibench.leanback;
import android.os.Bundle;
-public class BrowseFragment extends android.support.v17.leanback.app.BrowseSupportFragment {
+public class BrowseFragment extends androidx.leanback.app.BrowseSupportFragment {
public BrowseFragment() {
}
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/CardPresenter.java b/tests/UiBench/src/com/android/test/uibench/leanback/CardPresenter.java
index 5194555aca01..ba7180050223 100644
--- a/tests/UiBench/src/com/android/test/uibench/leanback/CardPresenter.java
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/CardPresenter.java
@@ -17,9 +17,9 @@ package com.android.test.uibench.leanback;
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.support.v17.leanback.widget.ImageCardView;
-import android.support.v17.leanback.widget.Presenter;
-import android.support.v4.content.res.ResourcesCompat;
+import androidx.leanback.widget.ImageCardView;
+import androidx.leanback.widget.Presenter;
+import androidx.core.content.res.ResourcesCompat;
import android.view.ContextThemeWrapper;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
diff --git a/tests/UiBench/src/com/android/test/uibench/leanback/TestHelper.java b/tests/UiBench/src/com/android/test/uibench/leanback/TestHelper.java
index bf408f7475ac..bcb47327850a 100644
--- a/tests/UiBench/src/com/android/test/uibench/leanback/TestHelper.java
+++ b/tests/UiBench/src/com/android/test/uibench/leanback/TestHelper.java
@@ -19,13 +19,13 @@ import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
-import android.support.v17.leanback.app.BackgroundManager;
-import android.support.v17.leanback.widget.ArrayObjectAdapter;
-import android.support.v17.leanback.widget.HeaderItem;
-import android.support.v17.leanback.widget.ListRow;
-import android.support.v17.leanback.widget.ListRowPresenter;
-import android.support.v17.leanback.widget.ObjectAdapter;
-import android.support.v17.leanback.widget.Presenter;
+import androidx.leanback.app.BackgroundManager;
+import androidx.leanback.widget.ArrayObjectAdapter;
+import androidx.leanback.widget.HeaderItem;
+import androidx.leanback.widget.ListRow;
+import androidx.leanback.widget.ListRowPresenter;
+import androidx.leanback.widget.ObjectAdapter;
+import androidx.leanback.widget.Presenter;
import android.util.DisplayMetrics;
import android.util.TypedValue;
diff --git a/tests/UiBench/src/com/android/test/uibench/listview/CompatListActivity.java b/tests/UiBench/src/com/android/test/uibench/listview/CompatListActivity.java
index bb7f4a302f8c..66595585c525 100644
--- a/tests/UiBench/src/com/android/test/uibench/listview/CompatListActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/listview/CompatListActivity.java
@@ -16,9 +16,9 @@
package com.android.test.uibench.listview;
import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.ListFragment;
-import android.support.v7.app.AppCompatActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.ListFragment;
+import androidx.appcompat.app.AppCompatActivity;
import android.widget.ListAdapter;
public abstract class CompatListActivity extends AppCompatActivity {
diff --git a/tests/UiBench/src/com/android/test/uibench/listview/FadingEdgeListFragment.java b/tests/UiBench/src/com/android/test/uibench/listview/FadingEdgeListFragment.java
index a018b40e8528..538066ef7abf 100644
--- a/tests/UiBench/src/com/android/test/uibench/listview/FadingEdgeListFragment.java
+++ b/tests/UiBench/src/com/android/test/uibench/listview/FadingEdgeListFragment.java
@@ -16,7 +16,7 @@
package com.android.test.uibench.listview;
import android.os.Bundle;
-import android.support.v4.app.ListFragment;
+import androidx.fragment.app.ListFragment;
import android.widget.ListView;
public class FadingEdgeListFragment extends ListFragment {
diff --git a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvArrayAdapter.java b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvArrayAdapter.java
index e5a3a49cf228..7a355c8acfd3 100644
--- a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvArrayAdapter.java
+++ b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvArrayAdapter.java
@@ -15,7 +15,7 @@
*/
package com.android.test.uibench.recyclerview;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvBoxAdapter.java b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvBoxAdapter.java
index 3440f192e7c5..abb1160b6b1a 100644
--- a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvBoxAdapter.java
+++ b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvBoxAdapter.java
@@ -17,7 +17,7 @@ package com.android.test.uibench.recyclerview;
import android.content.Context;
import android.graphics.Color;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView;
import android.util.TypedValue;
import android.view.ViewGroup;
import android.widget.TextView;
diff --git a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java
index 939b66198d72..bd313ad7636d 100644
--- a/tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java
+++ b/tests/UiBench/src/com/android/test/uibench/recyclerview/RvCompatListActivity.java
@@ -17,12 +17,12 @@ package com.android.test.uibench.recyclerview;
import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/media/tests/NativeMidiDemo/Android.mk b/tests/UsageStatsPerfTests/Android.mk
index 316858f667fd..cd29b51e5a24 100644
--- a/media/tests/NativeMidiDemo/Android.mk
+++ b/tests/UsageStatsPerfTests/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2016 The Android Open Source Project
+# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -16,16 +16,19 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
-LOCAL_PACKAGE_NAME := NativeMidiDemo
-#LOCAL_SDK_VERSION := current
+LOCAL_SRC_FILES := \
+ $(call all-java-files-under, src)
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ android-support-test \
+ apct-perftests-utils \
+ services.usage
+
+LOCAL_PACKAGE_NAME := UsageStatsPerfTests
LOCAL_PRIVATE_PLATFORM_APIS := true
-LOCAL_PROGUARD_ENABLED := disabled
-LOCAL_SRC_FILES := $(call all-java-files-under, java)
-LOCAL_JNI_SHARED_LIBRARIES := libnativemidi_jni
+# For android.permission.FORCE_STOP_PACKAGES permission
+LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
-
-# Include packages in subdirectories
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/UsageStatsPerfTests/AndroidManifest.xml b/tests/UsageStatsPerfTests/AndroidManifest.xml
new file mode 100644
index 000000000000..596a79cd8948
--- /dev/null
+++ b/tests/UsageStatsPerfTests/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.frameworks.perftests.usage">
+ <uses-sdk
+ android:minSdkVersion="21" />
+ <uses-permission android:name="android.permission.DUMP" />
+ <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.frameworks.perftests.usage"/>
+</manifest>
diff --git a/tests/UsageStatsPerfTests/AndroidTest.xml b/tests/UsageStatsPerfTests/AndroidTest.xml
new file mode 100644
index 000000000000..c9b51dc5ba07
--- /dev/null
+++ b/tests/UsageStatsPerfTests/AndroidTest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs UsageStats Performance Tests">
+ <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-file-name" value="UsageStatsPerfTests.apk"/>
+ <option name="cleanup-apks" value="true"/>
+ </target_preparer>
+
+ <option name="test-suite-tag" value="apct"/>
+ <option name="test-tag" value="UsageStatsPerfTests"/>
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest">
+ <option name="package" value="com.android.frameworks.perftests.usage"/>
+ <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+ </test>
+</configuration> \ No newline at end of file
diff --git a/tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java b/tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java
new file mode 100644
index 000000000000..8467bee819cb
--- /dev/null
+++ b/tests/UsageStatsPerfTests/src/com/android/frameworks/perftests/usage/tests/UsageStatsDatabasePerfTest.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.frameworks.perftests.usage.tests;
+
+import static junit.framework.Assert.assertEquals;
+
+import com.android.server.usage.UsageStatsDatabase;
+import com.android.server.usage.UsageStatsDatabase.StatCombiner;
+import com.android.server.usage.IntervalStats;
+
+import android.app.usage.EventList;
+import android.app.usage.UsageEvents;
+import android.app.usage.UsageStatsManager;
+import android.content.Context;
+import android.os.SystemClock;
+import android.perftests.utils.ManualBenchmarkState;
+import android.perftests.utils.PerfManualStatusReporter;
+import android.support.test.filters.LargeTest;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class UsageStatsDatabasePerfTest {
+ protected static Context sContext;
+ private static UsageStatsDatabase sUsageStatsDatabase;
+ private static File mTestDir;
+
+ // Represents how many apps might have used in a day by a user with a few apps
+ final static int FEW_PKGS = 10;
+ // Represent how many apps might have used in a day by a user with many apps
+ final static int MANY_PKGS = 50;
+ // Represents how many usage events per app a device might have with light usage
+ final static int LIGHT_USE = 10;
+ // Represents how many usage events per app a device might have with heavy usage
+ final static int HEAVY_USE = 50;
+
+ private static final StatCombiner<UsageEvents.Event> sUsageStatsCombiner =
+ new StatCombiner<UsageEvents.Event>() {
+ @Override
+ public void combine(IntervalStats stats, boolean mutable,
+ List<UsageEvents.Event> accResult) {
+ final int size = stats.events.size();
+ for (int i = 0; i < size; i++) {
+ accResult.add(stats.events.get(i));
+ }
+ }
+ };
+
+
+ @Rule
+ public PerfManualStatusReporter mPerfManualStatusReporter = new PerfManualStatusReporter();
+
+ @BeforeClass
+ public static void setUpOnce() {
+ sContext = InstrumentationRegistry.getTargetContext();
+ mTestDir = new File(sContext.getFilesDir(), "UsageStatsDatabasePerfTest");
+ sUsageStatsDatabase = new UsageStatsDatabase(mTestDir);
+ sUsageStatsDatabase.init(1);
+ }
+
+ private static void populateIntervalStats(IntervalStats intervalStats, int packageCount,
+ int eventsPerPackage) {
+ if (intervalStats.events == null) {
+ intervalStats.events = new EventList();
+ }
+ for (int pkg = 0; pkg < packageCount; pkg++) {
+ UsageEvents.Event event = new UsageEvents.Event();
+ event.mPackage = "fake.package.name" + pkg;
+ event.mTimeStamp = 1;
+ event.mEventType = UsageEvents.Event.MOVE_TO_FOREGROUND;
+ for (int evt = 0; evt < eventsPerPackage; evt++) {
+ intervalStats.events.insert(event);
+ intervalStats.update(event.mPackage, event.mTimeStamp, event.mEventType);
+ }
+ }
+ }
+
+ private static void clearUsageStatsFiles() {
+ File[] intervalDirs = mTestDir.listFiles();
+ for (File intervalDir : intervalDirs) {
+ if (intervalDir.isDirectory()) {
+ File[] usageFiles = intervalDir.listFiles();
+ for (File f : usageFiles) {
+ f.delete();
+ }
+ }
+ }
+ }
+
+ private void runQueryUsageStatsTest(int packageCount, int eventsPerPackage) throws IOException {
+ final ManualBenchmarkState benchmarkState = mPerfManualStatusReporter.getBenchmarkState();
+ IntervalStats intervalStats = new IntervalStats();
+ populateIntervalStats(intervalStats, packageCount, eventsPerPackage);
+ sUsageStatsDatabase.putUsageStats(0, intervalStats);
+ long elapsedTimeNs = 0;
+ while (benchmarkState.keepRunning(elapsedTimeNs)) {
+ final long startTime = SystemClock.elapsedRealtimeNanos();
+ List<UsageEvents.Event> temp = sUsageStatsDatabase.queryUsageStats(
+ UsageStatsManager.INTERVAL_DAILY, 0, 2, sUsageStatsCombiner);
+ final long endTime = SystemClock.elapsedRealtimeNanos();
+ elapsedTimeNs = endTime - startTime;
+ assertEquals(packageCount * eventsPerPackage, temp.size());
+ }
+ }
+
+ private void runPutUsageStatsTest(int packageCount, int eventsPerPackage) throws IOException {
+ final ManualBenchmarkState benchmarkState = mPerfManualStatusReporter.getBenchmarkState();
+ IntervalStats intervalStats = new IntervalStats();
+ populateIntervalStats(intervalStats, packageCount, eventsPerPackage);
+ long elapsedTimeNs = 0;
+ while (benchmarkState.keepRunning(elapsedTimeNs)) {
+ final long startTime = SystemClock.elapsedRealtimeNanos();
+ sUsageStatsDatabase.putUsageStats(0, intervalStats);
+ final long endTime = SystemClock.elapsedRealtimeNanos();
+ elapsedTimeNs = endTime - startTime;
+ clearUsageStatsFiles();
+ }
+ }
+
+ @Test
+ public void testQueryUsageStats_FewPkgsLightUse() throws IOException {
+ runQueryUsageStatsTest(FEW_PKGS, LIGHT_USE);
+ }
+
+ @Test
+ public void testPutUsageStats_FewPkgsLightUse() throws IOException {
+ runPutUsageStatsTest(FEW_PKGS, LIGHT_USE);
+ }
+
+ @Test
+ public void testQueryUsageStats_FewPkgsHeavyUse() throws IOException {
+ runQueryUsageStatsTest(FEW_PKGS, HEAVY_USE);
+ }
+
+ @Test
+ public void testPutUsageStats_FewPkgsHeavyUse() throws IOException {
+ runPutUsageStatsTest(FEW_PKGS, HEAVY_USE);
+ }
+
+ @Test
+ public void testQueryUsageStats_ManyPkgsLightUse() throws IOException {
+ runQueryUsageStatsTest(MANY_PKGS, LIGHT_USE);
+ }
+
+ @Test
+ public void testPutUsageStats_ManyPkgsLightUse() throws IOException {
+ runPutUsageStatsTest(MANY_PKGS, LIGHT_USE);
+ }
+
+ @Test
+ public void testQueryUsageStats_ManyPkgsHeavyUse() throws IOException {
+ runQueryUsageStatsTest(MANY_PKGS, HEAVY_USE);
+ }
+
+ @Test
+ public void testPutUsageStats_ManyPkgsHeavyUse() throws IOException {
+ runPutUsageStatsTest(MANY_PKGS, HEAVY_USE);
+ }
+}
diff --git a/tests/UsageStatsTest/Android.mk b/tests/UsageStatsTest/Android.mk
index 6735c7c8f787..5eed38c86657 100644
--- a/tests/UsageStatsTest/Android.mk
+++ b/tests/UsageStatsTest/Android.mk
@@ -6,7 +6,8 @@ LOCAL_MODULE_TAGS := tests
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+LOCAL_USE_AAPT2 := true
+LOCAL_STATIC_ANDROID_LIBRARIES := androidx.legacy_legacy-support-v4
LOCAL_CERTIFICATE := platform
diff --git a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java
index 05cac10f92c6..3480e96b3547 100644
--- a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java
+++ b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java
@@ -21,7 +21,7 @@ import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
-import android.support.v4.util.CircularArray;
+import androidx.collection.CircularArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/tests/net/Android.mk b/tests/net/Android.mk
index 1bc4fd5ec582..6cc3dd33df42 100644
--- a/tests/net/Android.mk
+++ b/tests/net/Android.mk
@@ -34,6 +34,8 @@ LOCAL_CERTIFICATE := platform
# These are not normally accessible from apps so they must be explicitly included.
LOCAL_JNI_SHARED_LIBRARIES := \
android.hidl.token@1.0 \
+ $(UBSAN_RUNTIME_LIBRARY) \
+ libartbase \
libbacktrace \
libbase \
libbinder \
@@ -54,13 +56,14 @@ LOCAL_JNI_SHARED_LIBRARIES := \
libpcre2 \
libselinux \
libui \
- libunwind \
libutils \
libvintf \
libvndksupport \
libtinyxml2 \
libunwindstack \
- libutilscallstack
+ libutilscallstack \
+ libziparchive \
+ libz
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
diff --git a/tests/net/java/android/net/NetworkCapabilitiesTest.java b/tests/net/java/android/net/NetworkCapabilitiesTest.java
index a112fa627f0a..b40921ff4f84 100644
--- a/tests/net/java/android/net/NetworkCapabilitiesTest.java
+++ b/tests/net/java/android/net/NetworkCapabilitiesTest.java
@@ -303,7 +303,7 @@ public class NetworkCapabilitiesTest {
assertTrue("Request: " + request + ", Network:" + network,
request.satisfiedByNetworkCapabilities(network));
- // Adding capabilities that doesn't exist in the network anyway
+ // Requesting absence of capabilities that network doesn't have. Request should satisfy.
request.addUnwantedCapability(NET_CAPABILITY_WIFI_P2P);
request.addUnwantedCapability(NET_CAPABILITY_NOT_METERED);
assertTrue(request.satisfiedByNetworkCapabilities(network));
@@ -319,7 +319,6 @@ public class NetworkCapabilitiesTest {
assertTrue(request.hasUnwantedCapability(NET_CAPABILITY_NOT_RESTRICTED));
assertFalse(request.hasCapability(NET_CAPABILITY_NOT_RESTRICTED));
-
// Now this request won't be satisfied because network contains NOT_RESTRICTED.
assertFalse(request.satisfiedByNetworkCapabilities(network));
network.removeCapability(NET_CAPABILITY_NOT_RESTRICTED);
diff --git a/tests/net/java/android/net/apf/ApfTest.java b/tests/net/java/android/net/apf/ApfTest.java
index ed9cbabaf0eb..983802035bfb 100644
--- a/tests/net/java/android/net/apf/ApfTest.java
+++ b/tests/net/java/android/net/apf/ApfTest.java
@@ -77,7 +77,7 @@ import org.mockito.MockitoAnnotations;
@SmallTest
public class ApfTest {
private static final int TIMEOUT_MS = 500;
- private final static int MIN_APF_VERSION = 2;
+ private static final int MIN_APF_VERSION = 2;
@Mock IpConnectivityLog mLog;
@Mock Context mContext;
@@ -90,20 +90,30 @@ public class ApfTest {
}
// Expected return codes from APF interpreter.
- private final static int PASS = 1;
- private final static int DROP = 0;
+ private static final int PASS = 1;
+ private static final int DROP = 0;
// Interpreter will just accept packets without link layer headers, so pad fake packet to at
// least the minimum packet size.
- private final static int MIN_PKT_SIZE = 15;
+ private static final int MIN_PKT_SIZE = 15;
private static final ApfCapabilities MOCK_APF_CAPABILITIES =
new ApfCapabilities(2, 1700, ARPHRD_ETHER);
- private final static boolean DROP_MULTICAST = true;
- private final static boolean ALLOW_MULTICAST = false;
+ private static final boolean DROP_MULTICAST = true;
+ private static final boolean ALLOW_MULTICAST = false;
- private final static boolean DROP_802_3_FRAMES = true;
- private final static boolean ALLOW_802_3_FRAMES = false;
+ private static final boolean DROP_802_3_FRAMES = true;
+ private static final boolean ALLOW_802_3_FRAMES = false;
+
+ // Constants for opcode encoding
+ private static final byte LI_OP = (byte)(13 << 3);
+ private static final byte LDDW_OP = (byte)(22 << 3);
+ private static final byte STDW_OP = (byte)(23 << 3);
+ private static final byte SIZE0 = (byte)(0 << 1);
+ private static final byte SIZE8 = (byte)(1 << 1);
+ private static final byte SIZE16 = (byte)(2 << 1);
+ private static final byte SIZE32 = (byte)(3 << 1);
+ private static final byte R1 = 1;
private static ApfConfiguration getDefaultConfig() {
ApfFilter.ApfConfiguration config = new ApfConfiguration();
@@ -304,9 +314,9 @@ public class ApfTest {
// Test multiply.
gen = new ApfGenerator(MIN_APF_VERSION);
- gen.addLoadImmediate(Register.R0, 1234567890);
+ gen.addLoadImmediate(Register.R0, 123456789);
gen.addMul(2);
- gen.addJumpIfR0Equals(1234567890 * 2, gen.DROP_LABEL);
+ gen.addJumpIfR0Equals(123456789 * 2, gen.DROP_LABEL);
assertDrop(gen);
// Test divide.
@@ -369,10 +379,10 @@ public class ApfTest {
// Test multiply.
gen = new ApfGenerator(MIN_APF_VERSION);
- gen.addLoadImmediate(Register.R0, 1234567890);
+ gen.addLoadImmediate(Register.R0, 123456789);
gen.addLoadImmediate(Register.R1, 2);
gen.addMulR1();
- gen.addJumpIfR0Equals(1234567890 * 2, gen.DROP_LABEL);
+ gen.addJumpIfR0Equals(123456789 * 2, gen.DROP_LABEL);
assertDrop(gen);
// Test divide.
@@ -636,29 +646,28 @@ public class ApfTest {
*/
@Test
public void testImmediateEncoding() throws IllegalInstructionException {
- final int LI_OPCODE = 13 << 3;
ApfGenerator gen;
// 0-byte immediate: li R0, 0
- gen = new ApfGenerator(3);
+ gen = new ApfGenerator(4);
gen.addLoadImmediate(Register.R0, 0);
- assertProgramEquals(new byte[]{LI_OPCODE | (0 << 1)}, gen.generate());
+ assertProgramEquals(new byte[]{LI_OP | SIZE0}, gen.generate());
// 1-byte immediate: li R0, 42
- gen = new ApfGenerator(3);
+ gen = new ApfGenerator(4);
gen.addLoadImmediate(Register.R0, 42);
- assertProgramEquals(new byte[]{LI_OPCODE | (1 << 1), 42}, gen.generate());
+ assertProgramEquals(new byte[]{LI_OP | SIZE8, 42}, gen.generate());
// 2-byte immediate: li R1, 0x1234
- gen = new ApfGenerator(3);
+ gen = new ApfGenerator(4);
gen.addLoadImmediate(Register.R1, 0x1234);
- assertProgramEquals(new byte[]{LI_OPCODE | (2 << 1) | 1 , 0x12, 0x34}, gen.generate());
+ assertProgramEquals(new byte[]{LI_OP | SIZE16 | R1, 0x12, 0x34}, gen.generate());
// 4-byte immediate: li R0, 0x12345678
gen = new ApfGenerator(3);
gen.addLoadImmediate(Register.R0, 0x12345678);
assertProgramEquals(
- new byte[]{LI_OPCODE | (3 << 1), 0x12, 0x34, 0x56, 0x78},
+ new byte[]{LI_OP | SIZE32, 0x12, 0x34, 0x56, 0x78},
gen.generate());
}
@@ -667,28 +676,61 @@ public class ApfTest {
*/
@Test
public void testNegativeImmediateEncoding() throws IllegalInstructionException {
- final int LI_OPCODE = 13 << 3;
ApfGenerator gen;
// 1-byte negative immediate: li R0, -42
gen = new ApfGenerator(3);
gen.addLoadImmediate(Register.R0, -42);
- assertProgramEquals(new byte[]{LI_OPCODE | (1 << 1), -42}, gen.generate());
+ assertProgramEquals(new byte[]{LI_OP | SIZE8, -42}, gen.generate());
- // 2-byte negative immediate: li R1, -0x1234
+ // 2-byte negative immediate: li R1, -0x1122
gen = new ApfGenerator(3);
gen.addLoadImmediate(Register.R1, -0x1122);
- assertProgramEquals(new byte[]{LI_OPCODE | (2 << 1) | 1, (byte)0xEE, (byte)0xDE},
+ assertProgramEquals(new byte[]{LI_OP | SIZE16 | R1, (byte)0xEE, (byte)0xDE},
gen.generate());
// 4-byte negative immediate: li R0, -0x11223344
gen = new ApfGenerator(3);
gen.addLoadImmediate(Register.R0, -0x11223344);
assertProgramEquals(
- new byte[]{LI_OPCODE | (3 << 1), (byte)0xEE, (byte)0xDD, (byte)0xCC, (byte)0xBC},
+ new byte[]{LI_OP | SIZE32, (byte)0xEE, (byte)0xDD, (byte)0xCC, (byte)0xBC},
gen.generate());
}
+ /**
+ * Test that the generator correctly emits positive and negative immediates for LDDW/STDW.
+ */
+ @Test
+ public void testLoadStoreDataEncoding() throws IllegalInstructionException {
+ ApfGenerator gen;
+
+ // Load data with no offset: lddw R0, [0 + r1]
+ gen = new ApfGenerator(3);
+ gen.addLoadData(Register.R0, 0);
+ assertProgramEquals(new byte[]{LDDW_OP | SIZE0}, gen.generate());
+
+ // Store data with 8bit negative offset: lddw r0, [-42 + r1]
+ gen = new ApfGenerator(3);
+ gen.addStoreData(Register.R0, -42);
+ assertProgramEquals(new byte[]{STDW_OP | SIZE8, -42}, gen.generate());
+
+ // Store data to R1 with 16bit negative offset: stdw r1, [-0x1122 + r0]
+ gen = new ApfGenerator(3);
+ gen.addStoreData(Register.R1, -0x1122);
+ assertProgramEquals(new byte[]{STDW_OP | SIZE16 | R1, (byte)0xEE, (byte)0xDE},
+ gen.generate());
+
+ // Load data to R1 with 32bit negative offset: lddw r1, [0xDEADBEEF + r0]
+ gen = new ApfGenerator(3);
+ gen.addLoadData(Register.R1, 0xDEADBEEF);
+ assertProgramEquals(
+ new byte[]{LDDW_OP | SIZE32 | R1, (byte)0xDE, (byte)0xAD, (byte)0xBE, (byte)0xEF},
+ gen.generate());
+ }
+
+ /**
+ * Test that the interpreter correctly executes STDW with a negative 8bit offset
+ */
@Test
public void testApfDataWrite() throws IllegalInstructionException, Exception {
byte[] packet = new byte[MIN_PKT_SIZE];
@@ -712,12 +754,15 @@ public class ApfTest {
assertDataMemoryContents(PASS, gen.generate(), packet, data, expected_data);
}
+ /**
+ * Test that the interpreter correctly executes LDDW with a negative 16bit offset
+ */
@Test
public void testApfDataRead() throws IllegalInstructionException, Exception {
// Program that DROPs if address 10 (-6) contains 0x87654321.
ApfGenerator gen = new ApfGenerator(3);
- gen.addLoadImmediate(Register.R1, 10);
- gen.addLoadData(Register.R0, -16); // 10 + -16 = -6 (offset +10 with data_len=16)
+ gen.addLoadImmediate(Register.R1, 1000);
+ gen.addLoadData(Register.R0, -1006); // 1000 + -1006 = -6 (offset +10 with data_len=16)
gen.addJumpIfR0Equals(0x87654321, gen.DROP_LABEL);
byte[] program = gen.generate();
byte[] packet = new byte[MIN_PKT_SIZE];
@@ -737,6 +782,11 @@ public class ApfTest {
assertDataMemoryContents(DROP, program, packet, data, expected_data);
}
+ /**
+ * Test that the interpreter correctly executes LDDW followed by a STDW.
+ * To cover a few more edge cases, LDDW has a 0bit offset, while STDW has a positive 8bit
+ * offset.
+ */
@Test
public void testApfDataReadModifyWrite() throws IllegalInstructionException, Exception {
ApfGenerator gen = new ApfGenerator(3);
@@ -844,7 +894,7 @@ public class ApfTest {
}
private static class TestApfFilter extends ApfFilter {
- public final static byte[] MOCK_MAC_ADDR = {1,2,3,4,5,6};
+ public static final byte[] MOCK_MAC_ADDR = {1,2,3,4,5,6};
private FileDescriptor mWriteSocket;
private final long mFixedTimeMs = SystemClock.elapsedRealtime();
diff --git a/tests/net/java/android/net/ip/IpClientTest.java b/tests/net/java/android/net/ip/IpClientTest.java
index e9e880d1e7c1..89453e0b13b7 100644
--- a/tests/net/java/android/net/ip/IpClientTest.java
+++ b/tests/net/java/android/net/ip/IpClientTest.java
@@ -133,9 +133,18 @@ public class IpClientTest {
verify(mNMService, times(1)).registerObserver(arg.capture());
mObserver = arg.getValue();
reset(mNMService);
+ // Verify IpClient doesn't call onLinkPropertiesChange() when it starts.
+ verify(mCb, never()).onLinkPropertiesChange(any());
+ reset(mCb);
return ipc;
}
+ private static LinkProperties makeEmptyLinkProperties(String iface) {
+ final LinkProperties empty = new LinkProperties();
+ empty.setInterfaceName(iface);
+ return empty;
+ }
+
@Test
public void testNullInterfaceNameMostDefinitelyThrows() throws Exception {
setTestInterfaceParams(null);
@@ -197,6 +206,8 @@ public class IpClientTest {
ipc.shutdown();
verify(mNMService, timeout(100).times(1)).disableIpv6(iface);
verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(iface);
+ verify(mCb, timeout(100).times(1))
+ .onLinkPropertiesChange(eq(makeEmptyLinkProperties(iface)));
}
@Test
@@ -246,6 +257,8 @@ public class IpClientTest {
ipc.shutdown();
verify(mNMService, timeout(100).times(1)).disableIpv6(iface);
verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(iface);
+ verify(mCb, timeout(100).times(1))
+ .onLinkPropertiesChange(eq(makeEmptyLinkProperties(iface)));
}
@Test
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 220858081e93..dbf81d69e50c 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -57,6 +57,7 @@ import static com.android.internal.util.TestUtils.waitForIdleLooper;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -95,6 +96,7 @@ import android.net.ConnectivityManager.TooManyRequestsException;
import android.net.ConnectivityThread;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
+import android.net.InterfaceConfiguration;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
@@ -125,6 +127,7 @@ import android.os.Message;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
@@ -132,6 +135,7 @@ import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.test.mock.MockContentResolver;
+import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
@@ -145,6 +149,7 @@ import com.android.server.connectivity.DefaultNetworkMetrics;
import com.android.server.connectivity.DnsManager;
import com.android.server.connectivity.IpConnectivityMetrics;
import com.android.server.connectivity.MockableSystemProperties;
+import com.android.server.connectivity.Nat464Xlat;
import com.android.server.connectivity.NetworkAgentInfo;
import com.android.server.connectivity.NetworkMonitor;
import com.android.server.connectivity.Vpn;
@@ -161,10 +166,13 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
+import java.net.Inet4Address;
import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -190,6 +198,7 @@ public class ConnectivityServiceTest {
private static final int TIMEOUT_MS = 500;
private static final int TEST_LINGER_DELAY_MS = 120;
+ private static final String CLAT_PREFIX = "v4-";
private static final String MOBILE_IFNAME = "test_rmnet_data0";
private static final String WIFI_IFNAME = "test_wlan0";
@@ -950,6 +959,10 @@ public class ConnectivityServiceTest {
return monitor;
}
+ public Nat464Xlat getNat464Xlat(MockNetworkAgent mna) {
+ return getNetworkAgentInfoForNetwork(mna.getNetwork()).clatd;
+ }
+
@Override
public MultinetworkPolicyTracker createMultinetworkPolicyTracker(
Context c, Handler h, Runnable r) {
@@ -4422,4 +4435,97 @@ public class ConnectivityServiceTest {
mMockVpn.disconnect();
}
+
+ /**
+ * Make simulated InterfaceConfig for Nat464Xlat to query clat lower layer info.
+ */
+ private InterfaceConfiguration getClatInterfaceConfig(LinkAddress la) {
+ InterfaceConfiguration cfg = new InterfaceConfiguration();
+ cfg.setHardwareAddress("11:22:33:44:55:66");
+ cfg.setLinkAddress(la);
+ return cfg;
+ }
+
+ /**
+ * Make expected stack link properties, copied from Nat464Xlat.
+ */
+ private LinkProperties makeClatLinkProperties(LinkAddress la) {
+ LinkAddress clatAddress = la;
+ LinkProperties stacked = new LinkProperties();
+ stacked.setInterfaceName(CLAT_PREFIX + MOBILE_IFNAME);
+ RouteInfo ipv4Default = new RouteInfo(
+ new LinkAddress(Inet4Address.ANY, 0),
+ clatAddress.getAddress(), CLAT_PREFIX + MOBILE_IFNAME);
+ stacked.addRoute(ipv4Default);
+ stacked.addLinkAddress(clatAddress);
+ return stacked;
+ }
+
+ @Test
+ public void testStackedLinkProperties() throws UnknownHostException, RemoteException {
+ final LinkAddress myIpv4 = new LinkAddress("1.2.3.4/24");
+ final LinkAddress myIpv6 = new LinkAddress("2001:db8:1::1/64");
+ final NetworkRequest networkRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_CELLULAR)
+ .addCapability(NET_CAPABILITY_INTERNET)
+ .build();
+ final TestNetworkCallback networkCallback = new TestNetworkCallback();
+ mCm.registerNetworkCallback(networkRequest, networkCallback);
+
+ // Prepare ipv6 only link properties and connect.
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ final LinkProperties cellLp = new LinkProperties();
+ cellLp.setInterfaceName(MOBILE_IFNAME);
+ cellLp.addLinkAddress(myIpv6);
+ cellLp.addRoute(new RouteInfo((IpPrefix) null, myIpv6.getAddress(), MOBILE_IFNAME));
+ cellLp.addRoute(new RouteInfo(myIpv6, null, MOBILE_IFNAME));
+ reset(mNetworkManagementService);
+ when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME))
+ .thenReturn(getClatInterfaceConfig(myIpv4));
+
+ // Connect with ipv6 link properties, then expect clat setup ipv4 and update link
+ // properties properly.
+ mCellNetworkAgent.sendLinkProperties(cellLp);
+ mCellNetworkAgent.connect(true);
+ networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
+ verify(mNetworkManagementService, times(1)).startClatd(MOBILE_IFNAME);
+ Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent);
+
+ // Clat iface up, expect stack link updated.
+ clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true);
+ waitForIdle();
+ List<LinkProperties> stackedLps = mCm.getLinkProperties(mCellNetworkAgent.getNetwork())
+ .getStackedLinks();
+ assertEquals(makeClatLinkProperties(myIpv4), stackedLps.get(0));
+
+ // Change trivial linkproperties and see if stacked link is preserved.
+ cellLp.addDnsServer(InetAddress.getByName("8.8.8.8"));
+ mCellNetworkAgent.sendLinkProperties(cellLp);
+ waitForIdle();
+ networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+
+ List<LinkProperties> stackedLpsAfterChange =
+ mCm.getLinkProperties(mCellNetworkAgent.getNetwork()).getStackedLinks();
+ assertNotEquals(stackedLpsAfterChange, Collections.EMPTY_LIST);
+ assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0));
+
+ // Add ipv4 address, expect stacked linkproperties be cleaned up
+ cellLp.addLinkAddress(myIpv4);
+ cellLp.addRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
+ mCellNetworkAgent.sendLinkProperties(cellLp);
+ waitForIdle();
+ networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+ verify(mNetworkManagementService, times(1)).stopClatd(MOBILE_IFNAME);
+
+ // Clat iface removed, expect linkproperties revert to original one
+ clat.interfaceRemoved(CLAT_PREFIX + MOBILE_IFNAME);
+ waitForIdle();
+ networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+ LinkProperties actualLpAfterIpv4 = mCm.getLinkProperties(mCellNetworkAgent.getNetwork());
+ assertEquals(cellLp, actualLpAfterIpv4);
+
+ // Clean up
+ mCellNetworkAgent.disconnect();
+ mCm.unregisterNetworkCallback(networkCallback);
+ }
}
diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
index e573d3586653..102cb7c77055 100644
--- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
+++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
@@ -50,6 +50,7 @@ import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -592,6 +593,7 @@ public class IpSecServiceParameterizedTest {
}
}
+ @Ignore
@Test
public void testAddTunnelFailsForBadPackageName() throws Exception {
try {
diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java
index f0f3f2c748a0..0d3b8e4a0452 100644
--- a/tests/net/java/com/android/server/connectivity/TetheringTest.java
+++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java
@@ -71,6 +71,7 @@ import android.net.MacAddress;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
+import android.net.NetworkRequest;
import android.net.NetworkState;
import android.net.NetworkUtils;
import android.net.RouteInfo;
@@ -128,6 +129,10 @@ public class TetheringTest {
private static final String TEST_USB_IFNAME = "test_rndis0";
private static final String TEST_WLAN_IFNAME = "test_wlan0";
+ // 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();
+
@Mock private ApplicationInfo mApplicationInfo;
@Mock private Context mContext;
@Mock private INetworkManagementService mNMService;
@@ -238,6 +243,11 @@ public class TetheringTest {
isTetheringSupportedCalls++;
return true;
}
+
+ @Override
+ public NetworkRequest getDefaultNetworkRequest() {
+ return mDefaultRequest;
+ }
}
private static NetworkState buildMobileUpstreamState(boolean withIPv4, boolean withIPv6,
@@ -305,6 +315,8 @@ public class TetheringTest {
.thenReturn(new String[0]);
when(mResources.getIntArray(com.android.internal.R.array.config_tether_upstream_types))
.thenReturn(new int[0]);
+ when(mResources.getBoolean(com.android.internal.R.bool.config_tether_upstream_automatic))
+ .thenReturn(false);
when(mNMService.listInterfaces())
.thenReturn(new String[] {
TEST_MOBILE_IFNAME, TEST_WLAN_IFNAME, TEST_USB_IFNAME});
@@ -458,6 +470,7 @@ public class TetheringTest {
}
private void prepareUsbTethering(NetworkState upstreamState) {
+ when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState);
when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
.thenReturn(upstreamState);
@@ -519,7 +532,7 @@ public class TetheringTest {
TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
verifyNoMoreInteractions(mWifiManager);
verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY);
- verify(mUpstreamNetworkMonitor, times(1)).start();
+ verify(mUpstreamNetworkMonitor, times(1)).start(any(NetworkRequest.class));
// TODO: Figure out why this isn't exactly once, for sendTetherStateChangedBroadcast().
assertTrue(1 <= mTetheringDependencies.isTetheringSupportedCalls);
@@ -630,6 +643,9 @@ public class TetheringTest {
NetworkState upstreamState = buildMobileIPv6UpstreamState();
runUsbTethering(upstreamState);
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+
// Then 464xlat comes up
upstreamState = buildMobile464xlatUpstreamState();
when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
@@ -643,12 +659,31 @@ public class TetheringTest {
upstreamState);
mLooper.dispatchAll();
- // Forwarding is added for 464xlat, and was still added only once for v6
+ // Forwarding is added for 464xlat
verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME);
- verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
- verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME,
TEST_XLAT_MOBILE_IFNAME);
+ // Forwarding was not re-added for v6 (still times(1))
+ verify(mNMService, times(1)).enableNat(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ verify(mNMService, times(1)).startInterfaceForwarding(TEST_USB_IFNAME, TEST_MOBILE_IFNAME);
+ }
+
+ @Test
+ public void configTetherUpstreamAutomaticIgnoresConfigTetherUpstreamTypes() throws Exception {
+ when(mResources.getBoolean(com.android.internal.R.bool.config_tether_upstream_automatic))
+ .thenReturn(true);
+ sendConfigurationChanged();
+
+ // Setup IPv6
+ final NetworkState upstreamState = buildMobileIPv6UpstreamState();
+ runUsbTethering(upstreamState);
+
+ // UpstreamNetworkMonitor should choose upstream automatically
+ // (in this specific case: choose the default network).
+ verify(mUpstreamNetworkMonitor, times(1)).getCurrentPreferredUpstream();
+ verify(mUpstreamNetworkMonitor, never()).selectPreferredUpstreamType(any());
+
+ verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network);
}
@Test
@@ -714,7 +749,7 @@ public class TetheringTest {
TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
verifyNoMoreInteractions(mWifiManager);
verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_TETHER);
- verify(mUpstreamNetworkMonitor, times(1)).start();
+ verify(mUpstreamNetworkMonitor, times(1)).start(any(NetworkRequest.class));
// In tethering mode, in the default configuration, an explicit request
// for a mobile network is also made.
verify(mUpstreamNetworkMonitor, times(1)).registerMobileNetworkRequest();
diff --git a/tests/net/java/com/android/server/connectivity/tethering/SimChangeListenerTest.java b/tests/net/java/com/android/server/connectivity/tethering/SimChangeListenerTest.java
deleted file mode 100644
index f58ea7e9375f..000000000000
--- a/tests/net/java/com/android/server/connectivity/tethering/SimChangeListenerTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2017 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.connectivity.tethering;
-
-import static com.android.internal.telephony.IccCardConstants.INTENT_VALUE_ICC_ABSENT;
-import static com.android.internal.telephony.IccCardConstants.INTENT_VALUE_ICC_LOADED;
-import static com.android.internal.telephony.IccCardConstants.INTENT_KEY_ICC_STATE;
-import static com.android.internal.telephony.TelephonyIntents.ACTION_SIM_STATE_CHANGED;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.reset;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.UserHandle;
-
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.test.BroadcastInterceptingContext;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.runner.RunWith;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class SimChangeListenerTest {
- @Mock private Context mContext;
- private BroadcastInterceptingContext mServiceContext;
- private Handler mHandler;
- private SimChangeListener mSCL;
- private int mCallbackCount;
-
- private void doCallback() { mCallbackCount++; }
-
- private class MockContext extends BroadcastInterceptingContext {
- MockContext(Context base) {
- super(base);
- }
- }
-
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- if (Looper.myLooper() == null) {
- Looper.prepare();
- }
- }
-
- @Before public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- reset(mContext);
- mServiceContext = new MockContext(mContext);
- mHandler = new Handler(Looper.myLooper());
- mCallbackCount = 0;
- mSCL = new SimChangeListener(mServiceContext, mHandler, () -> doCallback());
- }
-
- @After public void tearDown() throws Exception {
- if (mSCL != null) {
- mSCL.stopListening();
- mSCL = null;
- }
- }
-
- private void sendSimStateChangeIntent(String state) {
- final Intent intent = new Intent(ACTION_SIM_STATE_CHANGED);
- intent.putExtra(INTENT_KEY_ICC_STATE, state);
- mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
- }
-
- @Test
- public void testNotSeenFollowedBySeenCallsCallback() {
- mSCL.startListening();
-
- sendSimStateChangeIntent(INTENT_VALUE_ICC_ABSENT);
- sendSimStateChangeIntent(INTENT_VALUE_ICC_LOADED);
- assertEquals(1, mCallbackCount);
-
- sendSimStateChangeIntent(INTENT_VALUE_ICC_ABSENT);
- sendSimStateChangeIntent(INTENT_VALUE_ICC_LOADED);
- assertEquals(2, mCallbackCount);
-
- mSCL.stopListening();
- }
-
- @Test
- public void testNotListeningDoesNotCallback() {
- sendSimStateChangeIntent(INTENT_VALUE_ICC_ABSENT);
- sendSimStateChangeIntent(INTENT_VALUE_ICC_LOADED);
- assertEquals(0, mCallbackCount);
-
- sendSimStateChangeIntent(INTENT_VALUE_ICC_ABSENT);
- sendSimStateChangeIntent(INTENT_VALUE_ICC_LOADED);
- assertEquals(0, mCallbackCount);
- }
-
- @Test
- public void testSeenOnlyDoesNotCallback() {
- mSCL.startListening();
-
- sendSimStateChangeIntent(INTENT_VALUE_ICC_LOADED);
- assertEquals(0, mCallbackCount);
-
- sendSimStateChangeIntent(INTENT_VALUE_ICC_LOADED);
- assertEquals(0, mCallbackCount);
-
- mSCL.stopListening();
- }
-}
diff --git a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
index 9661dc24ca2e..3e21a2cfb7f9 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
@@ -31,6 +31,7 @@ import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -73,6 +74,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
@@ -84,6 +86,10 @@ public class UpstreamNetworkMonitorTest {
private static final boolean INCLUDES = true;
private static final boolean EXCLUDES = false;
+ // 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();
+
@Mock private Context mContext;
@Mock private IConnectivityManager mCS;
@Mock private SharedLog mLog;
@@ -113,6 +119,13 @@ public class UpstreamNetworkMonitorTest {
}
@Test
+ public void testStopWithoutStartIsNonFatal() {
+ mUNM.stop();
+ mUNM.stop();
+ mUNM.stop();
+ }
+
+ @Test
public void testDoesNothingBeforeStarted() {
assertTrue(mCM.hasNoCallbacks());
assertFalse(mUNM.mobileNetworkRequested());
@@ -127,7 +140,7 @@ public class UpstreamNetworkMonitorTest {
public void testDefaultNetworkIsTracked() throws Exception {
assertEquals(0, mCM.trackingDefault.size());
- mUNM.start();
+ mUNM.start(mDefaultRequest);
assertEquals(1, mCM.trackingDefault.size());
mUNM.stop();
@@ -138,7 +151,7 @@ public class UpstreamNetworkMonitorTest {
public void testListensForAllNetworks() throws Exception {
assertTrue(mCM.listening.isEmpty());
- mUNM.start();
+ mUNM.start(mDefaultRequest);
assertFalse(mCM.listening.isEmpty());
assertTrue(mCM.isListeningForAll());
@@ -148,9 +161,11 @@ public class UpstreamNetworkMonitorTest {
@Test
public void testCallbacksRegistered() {
- mUNM.start();
- verify(mCM, times(1)).registerNetworkCallback(any(), any(), any());
- verify(mCM, times(1)).registerDefaultNetworkCallback(any(), any());
+ mUNM.start(mDefaultRequest);
+ verify(mCM, times(1)).registerNetworkCallback(
+ any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
+ verify(mCM, times(1)).requestNetwork(
+ eq(mDefaultRequest), any(NetworkCallback.class), any(Handler.class));
mUNM.stop();
verify(mCM, times(2)).unregisterNetworkCallback(any(NetworkCallback.class));
@@ -161,7 +176,7 @@ public class UpstreamNetworkMonitorTest {
assertFalse(mUNM.mobileNetworkRequested());
assertEquals(0, mCM.requested.size());
- mUNM.start();
+ mUNM.start(mDefaultRequest);
assertFalse(mUNM.mobileNetworkRequested());
assertEquals(0, mCM.requested.size());
@@ -184,17 +199,17 @@ public class UpstreamNetworkMonitorTest {
assertFalse(mUNM.mobileNetworkRequested());
assertEquals(0, mCM.requested.size());
- mUNM.start();
- verify(mCM, Mockito.times(1)).registerNetworkCallback(
+ mUNM.start(mDefaultRequest);
+ verify(mCM, times(1)).registerNetworkCallback(
any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class));
- verify(mCM, Mockito.times(1)).registerDefaultNetworkCallback(
- any(NetworkCallback.class), any(Handler.class));
+ verify(mCM, times(1)).requestNetwork(
+ eq(mDefaultRequest), any(NetworkCallback.class), any(Handler.class));
assertFalse(mUNM.mobileNetworkRequested());
assertEquals(0, mCM.requested.size());
mUNM.updateMobileRequiresDun(true);
mUNM.registerMobileNetworkRequest();
- verify(mCM, Mockito.times(1)).requestNetwork(
+ verify(mCM, times(1)).requestNetwork(
any(NetworkRequest.class), any(NetworkCallback.class), anyInt(), anyInt(),
any(Handler.class));
@@ -222,7 +237,7 @@ public class UpstreamNetworkMonitorTest {
assertFalse(mUNM.mobileNetworkRequested());
assertEquals(0, mCM.requested.size());
- mUNM.start();
+ mUNM.start(mDefaultRequest);
assertFalse(mUNM.mobileNetworkRequested());
assertEquals(0, mCM.requested.size());
@@ -242,7 +257,7 @@ public class UpstreamNetworkMonitorTest {
@Test
public void testUpdateMobileRequiresDun() throws Exception {
- mUNM.start();
+ mUNM.start(mDefaultRequest);
// Test going from no-DUN to DUN correctly re-registers callbacks.
mUNM.updateMobileRequiresDun(false);
@@ -270,7 +285,7 @@ public class UpstreamNetworkMonitorTest {
final Collection<Integer> preferredTypes = new ArrayList<>();
preferredTypes.add(TYPE_WIFI);
- mUNM.start();
+ mUNM.start(mDefaultRequest);
// There are no networks, so there is nothing to select.
assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes));
@@ -334,8 +349,47 @@ public class UpstreamNetworkMonitorTest {
}
@Test
+ public void testGetCurrentPreferredUpstream() throws Exception {
+ mUNM.start(mDefaultRequest);
+ mUNM.updateMobileRequiresDun(false);
+
+ // [0] Mobile connects, DUN not required -> mobile selected.
+ final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+ cellAgent.fakeConnect();
+ mCM.makeDefaultNetwork(cellAgent);
+ assertEquals(cellAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+ // [1] WiFi connects but not validated/promoted to default -> mobile selected.
+ final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
+ wifiAgent.fakeConnect();
+ assertEquals(cellAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+ // [2] WiFi validates and is promoted to the default network -> WiFi selected.
+ mCM.makeDefaultNetwork(wifiAgent);
+ assertEquals(wifiAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+ // [3] DUN required, no other changes -> WiFi still selected
+ mUNM.updateMobileRequiresDun(true);
+ assertEquals(wifiAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+
+ // [4] WiFi no longer validated, mobile becomes default, DUN required -> null selected.
+ mCM.makeDefaultNetwork(cellAgent);
+ assertEquals(null, mUNM.getCurrentPreferredUpstream());
+ // TODO: make sure that a DUN request has been filed. This is currently
+ // triggered by code over in Tethering, but once that has been moved
+ // into UNM we should test for this here.
+
+ // [5] DUN network arrives -> DUN selected
+ final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
+ dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN);
+ dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET);
+ dunAgent.fakeConnect();
+ assertEquals(dunAgent.networkId, mUNM.getCurrentPreferredUpstream().network);
+ }
+
+ @Test
public void testLocalPrefixes() throws Exception {
- mUNM.start();
+ mUNM.start(mDefaultRequest);
// [0] Test minimum set of local prefixes.
Set<IpPrefix> local = mUNM.getLocalPrefixes();
@@ -345,7 +399,7 @@ public class UpstreamNetworkMonitorTest {
// [1] Pretend Wi-Fi connects.
final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI);
- final LinkProperties wifiLp = new LinkProperties();
+ final LinkProperties wifiLp = wifiAgent.linkProperties;
wifiLp.setInterfaceName("wlan0");
final String[] WIFI_ADDRS = {
"fe80::827a:bfff:fe6f:374d", "100.112.103.18",
@@ -358,7 +412,7 @@ public class UpstreamNetworkMonitorTest {
wifiLp.addLinkAddress(new LinkAddress(addrStr + cidr));
}
wifiAgent.fakeConnect();
- wifiAgent.sendLinkProperties(wifiLp);
+ wifiAgent.sendLinkProperties();
local = mUNM.getLocalPrefixes();
assertPrefixSet(local, INCLUDES, alreadySeen);
@@ -372,7 +426,7 @@ public class UpstreamNetworkMonitorTest {
// [2] Pretend mobile connects.
final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
- final LinkProperties cellLp = new LinkProperties();
+ final LinkProperties cellLp = cellAgent.linkProperties;
cellLp.setInterfaceName("rmnet_data0");
final String[] CELL_ADDRS = {
"10.102.211.48", "2001:db8:0:1:b50e:70d9:10c9:433d",
@@ -382,7 +436,7 @@ public class UpstreamNetworkMonitorTest {
cellLp.addLinkAddress(new LinkAddress(addrStr + cidr));
}
cellAgent.fakeConnect();
- cellAgent.sendLinkProperties(cellLp);
+ cellAgent.sendLinkProperties();
local = mUNM.getLocalPrefixes();
assertPrefixSet(local, INCLUDES, alreadySeen);
@@ -394,17 +448,18 @@ public class UpstreamNetworkMonitorTest {
// [3] Pretend DUN connects.
final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR);
dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN);
- final LinkProperties dunLp = new LinkProperties();
+ dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET);
+ final LinkProperties dunLp = dunAgent.linkProperties;
dunLp.setInterfaceName("rmnet_data1");
final String[] DUN_ADDRS = {
"192.0.2.48", "2001:db8:1:2:b50e:70d9:10c9:433d",
};
for (String addrStr : DUN_ADDRS) {
final String cidr = addrStr.contains(":") ? "/64" : "/27";
- cellLp.addLinkAddress(new LinkAddress(addrStr + cidr));
+ dunLp.addLinkAddress(new LinkAddress(addrStr + cidr));
}
dunAgent.fakeConnect();
- dunAgent.sendLinkProperties(dunLp);
+ dunAgent.sendLinkProperties();
local = mUNM.getLocalPrefixes();
assertPrefixSet(local, INCLUDES, alreadySeen);
@@ -442,6 +497,7 @@ public class UpstreamNetworkMonitorTest {
public static class TestConnectivityManager extends ConnectivityManager {
public Map<NetworkCallback, Handler> allCallbacks = new HashMap<>();
public Set<NetworkCallback> trackingDefault = new HashSet<>();
+ public TestNetworkAgent defaultNetwork = null;
public Map<NetworkCallback, NetworkRequest> listening = new HashMap<>();
public Map<NetworkCallback, NetworkRequest> requested = new HashMap<>();
public Map<NetworkCallback, Integer> legacyTypeMap = new HashMap<>();
@@ -483,12 +539,34 @@ public class UpstreamNetworkMonitorTest {
int getNetworkId() { return ++mNetworkId; }
+ void makeDefaultNetwork(TestNetworkAgent agent) {
+ if (Objects.equals(defaultNetwork, agent)) return;
+
+ final TestNetworkAgent formerDefault = defaultNetwork;
+ defaultNetwork = agent;
+
+ for (NetworkCallback cb : trackingDefault) {
+ if (defaultNetwork != null) {
+ cb.onAvailable(defaultNetwork.networkId);
+ cb.onCapabilitiesChanged(
+ defaultNetwork.networkId, defaultNetwork.networkCapabilities);
+ cb.onLinkPropertiesChanged(
+ defaultNetwork.networkId, defaultNetwork.linkProperties);
+ }
+ }
+ }
+
@Override
public void requestNetwork(NetworkRequest req, NetworkCallback cb, Handler h) {
assertFalse(allCallbacks.containsKey(cb));
allCallbacks.put(cb, h);
- assertFalse(requested.containsKey(cb));
- requested.put(cb, req);
+ if (mDefaultRequest.equals(req)) {
+ assertFalse(trackingDefault.contains(cb));
+ trackingDefault.add(cb);
+ } else {
+ assertFalse(requested.containsKey(cb));
+ requested.put(cb, req);
+ }
}
@Override
@@ -524,10 +602,7 @@ public class UpstreamNetworkMonitorTest {
@Override
public void registerDefaultNetworkCallback(NetworkCallback cb, Handler h) {
- assertFalse(allCallbacks.containsKey(cb));
- allCallbacks.put(cb, h);
- assertFalse(trackingDefault.contains(cb));
- trackingDefault.add(cb);
+ fail("Should never be called.");
}
@Override
@@ -561,6 +636,7 @@ public class UpstreamNetworkMonitorTest {
public final Network networkId;
public final int transportType;
public final NetworkCapabilities networkCapabilities;
+ public final LinkProperties linkProperties;
public TestNetworkAgent(TestConnectivityManager cm, int transportType) {
this.cm = cm;
@@ -569,12 +645,14 @@ public class UpstreamNetworkMonitorTest {
networkCapabilities = new NetworkCapabilities();
networkCapabilities.addTransportType(transportType);
networkCapabilities.addCapability(NET_CAPABILITY_INTERNET);
+ linkProperties = new LinkProperties();
}
public void fakeConnect() {
for (NetworkCallback cb : cm.listening.keySet()) {
cb.onAvailable(networkId);
cb.onCapabilitiesChanged(networkId, copy(networkCapabilities));
+ cb.onLinkPropertiesChanged(networkId, copy(linkProperties));
}
}
@@ -584,11 +662,16 @@ public class UpstreamNetworkMonitorTest {
}
}
- public void sendLinkProperties(LinkProperties lp) {
+ public void sendLinkProperties() {
for (NetworkCallback cb : cm.listening.keySet()) {
- cb.onLinkPropertiesChanged(networkId, lp);
+ cb.onLinkPropertiesChanged(networkId, copy(linkProperties));
}
}
+
+ @Override
+ public String toString() {
+ return String.format("TestNetworkAgent: %s %s", networkId, networkCapabilities);
+ }
}
public static class TestStateMachine extends StateMachine {
@@ -618,6 +701,10 @@ public class UpstreamNetworkMonitorTest {
return new NetworkCapabilities(nc);
}
+ static LinkProperties copy(LinkProperties lp) {
+ return new LinkProperties(lp);
+ }
+
static void assertPrefixSet(Set<IpPrefix> prefixes, boolean expectation, String... expected) {
final Set<String> expectedSet = new HashSet<>();
Collections.addAll(expectedSet, expected);
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index e371abcb2645..f89f303a1345 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -227,9 +227,6 @@ public class NetworkStatsServiceTest {
@After
public void tearDown() throws Exception {
- // Registered by NetworkStatsService's constructor.
- LocalServices.removeServiceForTest(NetworkStatsManagerInternal.class);
-
IoUtils.deleteContents(mStatsDir);
mServiceContext = null;
@@ -937,7 +934,6 @@ public class NetworkStatsServiceTest {
// verify service has empty history for wifi
assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
- String callingPackage = "the.calling.package";
long thresholdInBytes = 1L; // very small; should be overriden by framework
DataUsageRequest inputRequest = new DataUsageRequest(
DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdInBytes);
@@ -956,7 +952,7 @@ public class NetworkStatsServiceTest {
// Register and verify request and that binder was called
DataUsageRequest request =
- mService.registerUsageCallback(callingPackage, inputRequest,
+ mService.registerUsageCallback(mServiceContext.getOpPackageName(), inputRequest,
messenger, mBinder);
assertTrue(request.requestId > 0);
assertTrue(Objects.equals(sTemplateWifi, request.template));
diff --git a/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java
index 89bd8d8f1dd4..548a0c22c569 100644
--- a/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java
+++ b/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java
@@ -17,6 +17,7 @@
package com.android.framework.permission.tests;
import android.app.ActivityManager;
+import android.app.ActivityTaskManager;
import android.app.IActivityManager;
import android.content.res.Configuration;
import android.os.RemoteException;
@@ -47,22 +48,12 @@ public class ActivityManagerPermissionTests extends TestCase {
} catch (RemoteException e) {
fail("Unexpected remote exception");
}
-
- try {
- mAm.moveTaskBackwards(-1);
- fail("IActivityManager.moveTaskToFront did not throw SecurityException as"
- + " expected");
- } catch (SecurityException e) {
- // expected
- } catch (RemoteException e) {
- fail("Unexpected remote exception");
- }
}
@SmallTest
public void testCHANGE_CONFIGURATION() {
try {
- mAm.updateConfiguration(new Configuration());
+ ActivityTaskManager.getService().updateConfiguration(new Configuration());
fail("IActivityManager.updateConfiguration did not throw SecurityException as"
+ " expected");
} catch (SecurityException e) {
diff --git a/tests/testables/src/android/testing/TestableContentResolver.java b/tests/testables/src/android/testing/TestableContentResolver.java
index 0850916ccbe5..a0afef8fcda3 100644
--- a/tests/testables/src/android/testing/TestableContentResolver.java
+++ b/tests/testables/src/android/testing/TestableContentResolver.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.IContentProvider;
import android.database.ContentObserver;
import android.net.Uri;
+import android.util.ArrayMap;
import android.util.ArraySet;
import com.google.android.collect.Maps;
@@ -35,7 +36,11 @@ import java.util.Map;
*/
public class TestableContentResolver extends ContentResolver {
- private final Map<String, ContentProvider> mProviders = Maps.newHashMap();
+ public static final int STABLE = 1;
+ public static final int UNSTABLE = 2;
+
+ private final Map<String, ContentProvider> mProviders = new ArrayMap<>();
+ private final Map<String, ContentProvider> mUnstableProviders = new ArrayMap<>();
private final ContentResolver mParent;
private final ArraySet<ContentProvider> mInUse = new ArraySet<>();
private boolean mFallbackToExisting;
@@ -62,7 +67,23 @@ public class TestableContentResolver extends ContentResolver {
* subclasses, or null.
*/
public void addProvider(String name, ContentProvider provider) {
- mProviders.put(name, provider);
+ addProvider(name, provider, STABLE | UNSTABLE);
+ }
+
+ /**
+ * Adds access to a provider based on its authority
+ *
+ * @param name The authority name associated with the provider.
+ * @param provider An instance of {@link android.content.ContentProvider} or one of its
+ * subclasses, or null.
+ */
+ public void addProvider(String name, ContentProvider provider, int flags) {
+ if ((flags & STABLE) != 0) {
+ mProviders.put(name, provider);
+ }
+ if ((flags & UNSTABLE) != 0) {
+ mUnstableProviders.put(name, provider);
+ }
}
@Override
@@ -98,7 +119,7 @@ public class TestableContentResolver extends ContentResolver {
@Override
protected IContentProvider acquireUnstableProvider(Context c, String name) {
- final ContentProvider provider = mProviders.get(name);
+ final ContentProvider provider = mUnstableProviders.get(name);
if (provider != null) {
return provider.getIContentProvider();
} else {
@@ -128,7 +149,8 @@ public class TestableContentResolver extends ContentResolver {
@Override
public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
if (!mFallbackToExisting) return;
- if (!mProviders.containsKey(uri.getAuthority())) {
+ if (!mProviders.containsKey(uri.getAuthority())
+ && !mUnstableProviders.containsKey(uri.getAuthority())) {
super.notifyChange(uri, observer, syncToNetwork);
}
}
diff --git a/tests/testables/tests/src/android/testing/TestableContentResolverTest.java b/tests/testables/tests/src/android/testing/TestableContentResolverTest.java
new file mode 100644
index 000000000000..71afda0748c4
--- /dev/null
+++ b/tests/testables/tests/src/android/testing/TestableContentResolverTest.java
@@ -0,0 +1,61 @@
+package android.testing;
+
+import android.content.ContentProvider;
+import android.content.IContentProvider;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class TestableContentResolverTest {
+
+ @Rule
+ public TestableContext mContext = new TestableContext(InstrumentationRegistry.getContext());
+ private TestableContentResolver mContentResolver;
+
+ @Before
+ public void setup() {
+ mContentResolver = new TestableContentResolver(mContext);
+ mContentResolver.setFallbackToExisting(false);
+ }
+
+ @Test
+ public void testDefaultContentProvider() {
+ ContentProvider provider = Mockito.mock(ContentProvider.class);
+ IContentProvider iprovider = Mockito.mock(IContentProvider.class);
+ Mockito.when(provider.getIContentProvider()).thenReturn(iprovider);
+ mContentResolver.addProvider("test", provider);
+
+ Assert.assertEquals(iprovider, mContentResolver.acquireProvider(mContext, "test"));
+ Assert.assertEquals(iprovider, mContentResolver.acquireUnstableProvider(mContext, "test"));
+ }
+
+ @Test
+ public void testStableContentProvider() {
+ ContentProvider provider = Mockito.mock(ContentProvider.class);
+ IContentProvider iprovider = Mockito.mock(IContentProvider.class);
+ Mockito.when(provider.getIContentProvider()).thenReturn(iprovider);
+ mContentResolver.addProvider("test", provider, TestableContentResolver.STABLE);
+
+ Assert.assertEquals(iprovider, mContentResolver.acquireProvider(mContext, "test"));
+ Assert.assertNull(mContentResolver.acquireUnstableProvider(mContext, "test"));
+ }
+
+ @Test
+ public void testUnstableContentProvider() {
+ ContentProvider provider = Mockito.mock(ContentProvider.class);
+ IContentProvider iprovider = Mockito.mock(IContentProvider.class);
+ Mockito.when(provider.getIContentProvider()).thenReturn(iprovider);
+ mContentResolver.addProvider("test", provider, TestableContentResolver.UNSTABLE);
+
+ Assert.assertEquals(iprovider, mContentResolver.acquireUnstableProvider(mContext, "test"));
+ Assert.assertNull(mContentResolver.acquireProvider(mContext, "test"));
+ }
+}
diff --git a/tests/touchlag/Android.bp b/tests/touchlag/Android.bp
new file mode 100644
index 000000000000..2610cb386da2
--- /dev/null
+++ b/tests/touchlag/Android.bp
@@ -0,0 +1,17 @@
+cc_test {
+ name: "test-touchlag",
+ gtest: false,
+
+ srcs: ["touchlag.cpp"],
+
+ shared_libs: [
+ "libcutils",
+ "libutils",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Werror",
+ ],
+}
diff --git a/tests/touchlag/Android.mk b/tests/touchlag/Android.mk
deleted file mode 100644
index 70b198917547..000000000000
--- a/tests/touchlag/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- touchlag.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils libutils \
-
-LOCAL_MODULE:= test-touchlag
-
-LOCAL_CFLAGS += -Wall -Wextra -Werror
-
-LOCAL_MODULE_TAGS := tests
-
-include $(BUILD_EXECUTABLE)
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 734a5ab8aab4..d02f44edaa4c 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -18,13 +18,10 @@
#include <utils/TypeHelpers.h>
#include <stdarg.h>
-// SSIZE: mingw does not have signed size_t == ssize_t.
// STATUST: mingw does seem to redefine UNKNOWN_ERROR from our enum value, so a cast is necessary.
#if !defined(_WIN32)
-# define SSIZE(x) x
# define STATUST(x) x
#else
-# define SSIZE(x) (signed size_t)x
# define STATUST(x) (status_t)x
#endif
@@ -3040,7 +3037,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<const ResourceFilter>&
sp<AaptFile> strFile = p->getTypeStringsData();
ssize_t amt = data->writeData(strFile->getData(), strFile->getSize());
if (kPrintStringMetrics) {
- fprintf(stderr, "**** type strings: %zd\n", SSIZE(amt));
+ fprintf(stderr, "**** type strings: %zd\n", amt);
}
strAmt += amt;
if (amt < 0) {
@@ -3050,7 +3047,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<const ResourceFilter>&
strFile = p->getKeyStringsData();
amt = data->writeData(strFile->getData(), strFile->getSize());
if (kPrintStringMetrics) {
- fprintf(stderr, "**** key strings: %zd\n", SSIZE(amt));
+ fprintf(stderr, "**** key strings: %zd\n", amt);
}
strAmt += amt;
if (amt < 0) {
@@ -3322,8 +3319,8 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<const ResourceFilter>&
ssize_t amt = (dest->getSize()-strStart);
strAmt += amt;
if (kPrintStringMetrics) {
- fprintf(stderr, "**** value strings: %zd\n", SSIZE(amt));
- fprintf(stderr, "**** total strings: %zd\n", SSIZE(strAmt));
+ fprintf(stderr, "**** value strings: %zd\n", amt);
+ fprintf(stderr, "**** total strings: %zd\n", amt);
}
for (pi=0; pi<flatPackages.size(); pi++) {
diff --git a/tools/aapt/StringPool.cpp b/tools/aapt/StringPool.cpp
index 866291a3b678..37b61bfdffbd 100644
--- a/tools/aapt/StringPool.cpp
+++ b/tools/aapt/StringPool.cpp
@@ -12,13 +12,6 @@
#include "ResourceTable.h"
-// SSIZE: mingw does not have signed size_t == ssize_t.
-#if !defined(_WIN32)
-# define SSIZE(x) x
-#else
-# define SSIZE(x) (signed size_t)x
-#endif
-
// Set to true for noisy debug output.
static const bool kIsDebug = false;
@@ -202,7 +195,7 @@ ssize_t StringPool::add(const String16& value,
if (kIsDebug) {
printf("Adding string %s to pool: pos=%zd eidx=%zd vidx=%zd\n",
- String8(value).string(), SSIZE(pos), SSIZE(eidx), SSIZE(vidx));
+ String8(value).string(), pos, eidx, vidx);
}
return pos;
@@ -598,7 +591,7 @@ ssize_t StringPool::offsetForString(const String16& val) const
const Vector<size_t>* indices = offsetsForString(val);
ssize_t res = indices != NULL && indices->size() > 0 ? indices->itemAt(0) : -1;
if (kIsDebug) {
- printf("Offset for string %s: %zd (%s)\n", String8(val).string(), SSIZE(res),
+ printf("Offset for string %s: %zd (%s)\n", String8(val).string(), res,
res >= 0 ? String8(mEntries[mEntryArray[res]].value).string() : String8());
}
return res;
diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp
index 15ec4afa52dd..861efd5077fe 100644
--- a/tools/aapt/XMLNode.cpp
+++ b/tools/aapt/XMLNode.cpp
@@ -16,13 +16,10 @@
#define O_BINARY 0
#endif
-// SSIZE: mingw does not have signed size_t == ssize_t.
// STATUST: mingw does seem to redefine UNKNOWN_ERROR from our enum value, so a cast is necessary.
#if !defined(_WIN32)
-# define SSIZE(x) x
# define STATUST(x) x
#else
-# define SSIZE(x) (signed size_t)x
# define STATUST(x) (status_t)x
#endif
@@ -1426,7 +1423,7 @@ status_t XMLNode::collect_attr_strings(StringPool* outPool,
idx = outPool->add(attr.name);
if (kIsDebug) {
printf("Adding attr %s (resid 0x%08x) to pool: idx=%zd\n",
- String8(attr.name).string(), id, SSIZE(idx));
+ String8(attr.name).string(), id, idx);
}
if (id != 0) {
while ((ssize_t)outResIds->size() <= idx) {
@@ -1437,7 +1434,7 @@ status_t XMLNode::collect_attr_strings(StringPool* outPool,
}
attr.namePoolIdx = idx;
if (kIsDebug) {
- printf("String %s offset=0x%08zd\n", String8(attr.name).string(), SSIZE(idx));
+ printf("String %s offset=0x%08zd\n", String8(attr.name).string(), idx);
}
}
}
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 48cfc4453d8f..2ecf25b751b6 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -15,6 +15,7 @@
//
toolSources = [
+ "cmd/Command.cpp",
"cmd/Compile.cpp",
"cmd/Convert.cpp",
"cmd/Diff.cpp",
@@ -111,6 +112,7 @@ cc_library_host_static {
"link/XmlReferenceLinker.cpp",
"optimize/MultiApkGenerator.cpp",
"optimize/ResourceDeduper.cpp",
+ "optimize/ResourceFilter.cpp",
"optimize/VersionCollapser.cpp",
"process/SymbolTable.cpp",
"split/TableSplitter.cpp",
@@ -123,7 +125,6 @@ cc_library_host_static {
"ConfigDescription.cpp",
"Debug.cpp",
"DominatorTree.cpp",
- "Flags.cpp",
"java/AnnotationProcessor.cpp",
"java/ClassDefinition.cpp",
"java/JavaClassGenerator.cpp",
diff --git a/tools/aapt2/AppInfo.h b/tools/aapt2/AppInfo.h
index d6f599520d71..75123537116f 100644
--- a/tools/aapt2/AppInfo.h
+++ b/tools/aapt2/AppInfo.h
@@ -31,9 +31,12 @@ struct AppInfo {
// The app's minimum SDK version, if it is defined.
Maybe<int> min_sdk_version;
- // The app's version code, if it is defined.
+ // The app's version code (the lower 32 bits of the long version code), if it is defined.
Maybe<uint32_t> version_code;
+ // The app's version code major (the upper 32 bits of the long version code), if it is defined.
+ Maybe<uint32_t> version_code_major;
+
// The app's revision code, if it is defined.
Maybe<uint32_t> revision_code;
diff --git a/tools/aapt2/Flags.h b/tools/aapt2/Flags.h
deleted file mode 100644
index 3b3ae710dc7b..000000000000
--- a/tools/aapt2/Flags.h
+++ /dev/null
@@ -1,71 +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.
- */
-
-#ifndef AAPT_FLAGS_H
-#define AAPT_FLAGS_H
-
-#include <functional>
-#include <ostream>
-#include <string>
-#include <unordered_set>
-#include <vector>
-
-#include "androidfw/StringPiece.h"
-
-#include "util/Maybe.h"
-
-namespace aapt {
-
-class Flags {
- public:
- Flags& RequiredFlag(const android::StringPiece& name, const android::StringPiece& description,
- std::string* value);
- Flags& RequiredFlagList(const android::StringPiece& name, const android::StringPiece& description,
- std::vector<std::string>* value);
- Flags& OptionalFlag(const android::StringPiece& name, const android::StringPiece& description,
- Maybe<std::string>* value);
- Flags& OptionalFlagList(const android::StringPiece& name, const android::StringPiece& description,
- std::vector<std::string>* value);
- Flags& OptionalFlagList(const android::StringPiece& name, const android::StringPiece& description,
- std::unordered_set<std::string>* value);
- Flags& OptionalSwitch(const android::StringPiece& name, const android::StringPiece& description,
- bool* value);
-
- void Usage(const android::StringPiece& command, std::ostream* out);
-
- bool Parse(const android::StringPiece& command, const std::vector<android::StringPiece>& args,
- std::ostream* outError);
-
- const std::vector<std::string>& GetArgs();
-
- private:
- struct Flag {
- std::string name;
- std::string description;
- std::function<bool(const android::StringPiece& value)> action;
- bool required;
- size_t num_args;
-
- bool parsed;
- };
-
- std::vector<Flag> flags_;
- std::vector<std::string> args_;
-};
-
-} // namespace aapt
-
-#endif // AAPT_FLAGS_H
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index 808b29cfd844..23903c9e05f3 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -29,6 +29,13 @@
#include "androidfw/StringPiece.h"
#include "Diagnostics.h"
+#include "cmd/Command.h"
+#include "cmd/Compile.h"
+#include "cmd/Convert.h"
+#include "cmd/Diff.h"
+#include "cmd/Dump.h"
+#include "cmd/Link.h"
+#include "cmd/Optimize.h"
#include "util/Files.h"
#include "util/Util.h"
@@ -43,114 +50,121 @@ static const char* sMajorVersion = "2";
// Update minor version whenever a feature or flag is added.
static const char* sMinorVersion = "19";
-static void PrintVersion() {
- std::cerr << StringPrintf("Android Asset Packaging Tool (aapt) %s:%s", sMajorVersion,
- sMinorVersion)
- << std::endl;
-}
-
-static void PrintUsage() {
- std::cerr << "\nusage: aapt2 [compile|link|dump|diff|optimize|convert|version] ..." << std::endl;
-}
+/** Prints the version information of AAPT2. */
+class VersionCommand : public Command {
+ public:
+ explicit VersionCommand() : Command("version") {
+ SetDescription("Prints the version of aapt.");
+ }
-extern int Compile(const std::vector<StringPiece>& args, IDiagnostics* diagnostics);
-extern int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics);
-extern int Dump(const std::vector<StringPiece>& args);
-extern int Diff(const std::vector<StringPiece>& args);
-extern int Optimize(const std::vector<StringPiece>& args);
-extern int Convert(const std::vector<StringPiece>& args);
-
-static int ExecuteCommand(const StringPiece& command, const std::vector<StringPiece>& args,
- IDiagnostics* diagnostics) {
- if (command == "compile" || command == "c") {
- return Compile(args, diagnostics);
- } else if (command == "link" || command == "l") {
- return Link(args, diagnostics);
- } else if (command == "dump" || command == "d") {
- return Dump(args);
- } else if (command == "diff") {
- return Diff(args);
- } else if (command == "optimize") {
- return Optimize(args);
- } else if (command == "convert") {
- return Convert(args);
- } else if (command == "version") {
- PrintVersion();
+ int Action(const std::vector<std::string>& /* args */) override {
+ std::cerr << StringPrintf("Android Asset Packaging Tool (aapt) %s:%s", sMajorVersion,
+ sMinorVersion)
+ << std::endl;
return 0;
}
- diagnostics->Error(DiagMessage() << "unknown command '" << command << "'");
- return -1;
-}
+};
+
+/** The main entry point of AAPT. */
+class MainCommand : public Command {
+ public:
+ explicit MainCommand(IDiagnostics* diagnostics) : Command("aapt2"), diagnostics_(diagnostics) {
+ AddOptionalSubcommand(util::make_unique<CompileCommand>(diagnostics));
+ AddOptionalSubcommand(util::make_unique<LinkCommand>(diagnostics));
+ AddOptionalSubcommand(util::make_unique<DumpCommand>());
+ AddOptionalSubcommand(util::make_unique<DiffCommand>());
+ AddOptionalSubcommand(util::make_unique<OptimizeCommand>());
+ AddOptionalSubcommand(util::make_unique<ConvertCommand>());
+ AddOptionalSubcommand(util::make_unique<VersionCommand>());
+ }
-static void RunDaemon(IDiagnostics* diagnostics) {
- std::cout << "Ready" << std::endl;
-
- // Run in daemon mode. The first line of input is the command. This can be 'quit' which ends
- // the daemon mode. Each subsequent line is a single parameter to the command. The end of a
- // invocation is signaled by providing an empty line. At any point, an EOF signal or the
- // command 'quit' will end the daemon mode.
- while (true) {
- std::vector<std::string> raw_args;
- for (std::string line; std::getline(std::cin, line) && !line.empty();) {
- raw_args.push_back(line);
+ int Action(const std::vector<std::string>& args) override {
+ if (args.size() == 0) {
+ diagnostics_->Error(DiagMessage() << "no subcommand specified");
+ } else {
+ diagnostics_->Error(DiagMessage() << "unknown subcommand '" << args[0] << "'");
}
- if (!std::cin) {
- break;
- }
+ Usage(&std::cerr);
+ return -1;
+ }
- // An empty command does nothing.
- if (raw_args.empty()) {
- continue;
- }
+ private:
+ IDiagnostics* diagnostics_;
+};
- if (raw_args[0] == "quit") {
- break;
- }
+/*
+ * Run in daemon mode. The first line of input is the command. This can be 'quit' which ends
+ * the daemon mode. Each subsequent line is a single parameter to the command. The end of a
+ * invocation is signaled by providing an empty line. At any point, an EOF signal or the
+ * command 'quit' will end the daemon mode.
+ */
+class DaemonCommand : public Command {
+ public:
+ explicit DaemonCommand(IDiagnostics* diagnostics) : Command("daemon", "m"),
+ diagnostics_(diagnostics) {
+ SetDescription("Runs aapt in daemon mode. Each subsequent line is a single parameter to the\n"
+ "command. The end of an invocation is signaled by providing an empty line.");
+ }
- std::vector<StringPiece> args;
- args.insert(args.end(), ++raw_args.begin(), raw_args.end());
- int ret = ExecuteCommand(raw_args[0], args, diagnostics);
- if (ret != 0) {
- std::cerr << "Error" << std::endl;
+ int Action(const std::vector<std::string>& /* args */) override {
+ std::cout << "Ready" << std::endl;
+
+ while (true) {
+ std::vector<std::string> raw_args;
+ for (std::string line; std::getline(std::cin, line) && !line.empty();) {
+ raw_args.push_back(line);
+ }
+
+ if (!std::cin) {
+ break;
+ }
+
+ // An empty command does nothing.
+ if (raw_args.empty()) {
+ continue;
+ }
+
+ // End the dameon
+ if (raw_args[0] == "quit") {
+ break;
+ }
+
+ std::vector<StringPiece> args;
+ args.insert(args.end(), raw_args.begin(), raw_args.end());
+ if (MainCommand(diagnostics_).Execute(args, &std::cerr) != 0) {
+ std::cerr << "Error" << std::endl;
+ }
+ std::cerr << "Done" << std::endl;
}
- std::cerr << "Done" << std::endl;
+ std::cout << "Exiting daemon" << std::endl;
+
+ return 0;
}
- std::cout << "Exiting daemon" << std::endl;
-}
+
+ private:
+ IDiagnostics* diagnostics_;
+};
} // namespace aapt
int MainImpl(int argc, char** argv) {
- if (argc < 2) {
- std::cerr << "no command specified\n";
- aapt::PrintUsage();
+ if (argc < 1) {
return -1;
}
- argv += 1;
- argc -= 1;
-
- aapt::StdErrDiagnostics diagnostics;
-
// Collect the arguments starting after the program name and command name.
std::vector<StringPiece> args;
for (int i = 1; i < argc; i++) {
args.push_back(argv[i]);
}
- const StringPiece command(argv[0]);
- if (command != "daemon" && command != "m") {
- // Single execution.
- const int result = aapt::ExecuteCommand(command, args, &diagnostics);
- if (result < 0) {
- aapt::PrintUsage();
- }
- return result;
- }
+ // Add the daemon subcommand here so it cannot be called while executing the daemon
+ aapt::StdErrDiagnostics diagnostics;
+ auto main_command = new aapt::MainCommand(&diagnostics);
+ main_command->AddOptionalSubcommand(aapt::util::make_unique<aapt::DaemonCommand>(&diagnostics));
- aapt::RunDaemon(&diagnostics);
- return 0;
+ return main_command->Execute(args, &std::cerr);
}
int main(int argc, char** argv) {
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 7f48544c0ae4..8719a233d774 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -208,6 +208,15 @@ class SegmentNode : public Node {
}
};
+// A chunk of text in the XML string within a CDATA tags.
+class CdataSegmentNode : public SegmentNode {
+ public:
+
+ void Build(StringBuilder* builder) const override {
+ builder->AppendText(data, /* preserve_spaces */ true);
+ }
+};
+
// A tag that will be encoded into the final flattened string. Tags like <b> or <i>.
class SpanNode : public Node {
public:
@@ -244,6 +253,7 @@ bool ResourceParser::FlattenXmlSubtree(
std::vector<Node*> node_stack;
node_stack.push_back(&root);
+ bool cdata_block = false;
bool saw_span_node = false;
SegmentNode* first_segment = nullptr;
SegmentNode* last_segment = nullptr;
@@ -253,11 +263,15 @@ bool ResourceParser::FlattenXmlSubtree(
const xml::XmlPullParser::Event event = parser->event();
// First take care of any SegmentNodes that should be created.
- if (event == xml::XmlPullParser::Event::kStartElement ||
- event == xml::XmlPullParser::Event::kEndElement) {
+ if (event == xml::XmlPullParser::Event::kStartElement
+ || event == xml::XmlPullParser::Event::kEndElement
+ || event == xml::XmlPullParser::Event::kCdataStart
+ || event == xml::XmlPullParser::Event::kCdataEnd) {
if (!current_text.empty()) {
- std::unique_ptr<SegmentNode> segment_node = util::make_unique<SegmentNode>();
+ std::unique_ptr<SegmentNode> segment_node = (cdata_block)
+ ? util::make_unique<CdataSegmentNode>() : util::make_unique<SegmentNode>();
segment_node->data = std::move(current_text);
+
last_segment = node_stack.back()->AddChild(std::move(segment_node));
if (first_segment == nullptr) {
first_segment = last_segment;
@@ -333,6 +347,16 @@ bool ResourceParser::FlattenXmlSubtree(
}
} break;
+ case xml::XmlPullParser::Event::kCdataStart: {
+ cdata_block = true;
+ break;
+ }
+
+ case xml::XmlPullParser::Event::kCdataEnd: {
+ cdata_block = false;
+ break;
+ }
+
default:
// ignore.
break;
@@ -447,6 +471,9 @@ bool ResourceParser::ParseResources(xml::XmlPullParser* parser) {
parsed_resource.config = config_;
parsed_resource.source = source_.WithLine(parser->line_number());
parsed_resource.comment = std::move(comment);
+ if (options_.visibility) {
+ parsed_resource.visibility_level = options_.visibility.value();
+ }
// Extract the product name if it exists.
if (Maybe<StringPiece> maybe_product = xml::FindNonEmptyAttribute(parser, "product")) {
@@ -774,7 +801,8 @@ std::unique_ptr<Item> ResourceParser::ParseXml(xml::XmlPullParser* parser,
if (allow_raw_value) {
// We can't parse this so return a RawString if we are allowed.
return util::make_unique<RawString>(
- table_->string_pool.MakeRef(raw_value, StringPool::Context(config_)));
+ table_->string_pool.MakeRef(util::TrimWhitespace(raw_value),
+ StringPool::Context(config_)));
}
return {};
}
@@ -836,6 +864,12 @@ bool ResourceParser::ParseString(xml::XmlPullParser* parser,
}
bool ResourceParser::ParsePublic(xml::XmlPullParser* parser, ParsedResource* out_resource) {
+ if (options_.visibility) {
+ diag_->Error(DiagMessage(out_resource->source)
+ << "<public> tag not allowed with --visibility flag");
+ return false;
+ }
+
if (out_resource->config != ConfigDescription::DefaultConfig()) {
diag_->Warn(DiagMessage(out_resource->source)
<< "ignoring configuration '" << out_resource->config << "' for <public> tag");
@@ -878,6 +912,12 @@ bool ResourceParser::ParsePublic(xml::XmlPullParser* parser, ParsedResource* out
}
bool ResourceParser::ParsePublicGroup(xml::XmlPullParser* parser, ParsedResource* out_resource) {
+ if (options_.visibility) {
+ diag_->Error(DiagMessage(out_resource->source)
+ << "<public-group> tag not allowed with --visibility flag");
+ return false;
+ }
+
if (out_resource->config != ConfigDescription::DefaultConfig()) {
diag_->Warn(DiagMessage(out_resource->source)
<< "ignoring configuration '" << out_resource->config
@@ -999,6 +1039,11 @@ bool ResourceParser::ParseSymbolImpl(xml::XmlPullParser* parser,
}
bool ResourceParser::ParseSymbol(xml::XmlPullParser* parser, ParsedResource* out_resource) {
+ if (options_.visibility) {
+ diag_->Error(DiagMessage(out_resource->source)
+ << "<java-symbol> and <symbol> tags not allowed with --visibility flag");
+ return false;
+ }
if (out_resource->config != ConfigDescription::DefaultConfig()) {
diag_->Warn(DiagMessage(out_resource->source)
<< "ignoring configuration '" << out_resource->config << "' for <"
@@ -1070,6 +1115,9 @@ bool ResourceParser::ParseOverlayable(xml::XmlPullParser* parser, ParsedResource
child_resource.name.entry = maybe_name.value().to_string();
child_resource.source = item_source;
child_resource.overlayable = true;
+ if (options_.visibility) {
+ child_resource.visibility_level = options_.visibility.value();
+ }
out_resource->child_resources.push_back(std::move(child_resource));
xml::XmlPullParser::SkipCurrentElement(parser);
@@ -1212,6 +1260,9 @@ bool ResourceParser::ParseAttrImpl(xml::XmlPullParser* parser,
child_resource.name = symbol.symbol.name.value();
child_resource.source = item_source;
child_resource.value = util::make_unique<Id>();
+ if (options_.visibility) {
+ child_resource.visibility_level = options_.visibility.value();
+ }
out_resource->child_resources.push_back(std::move(child_resource));
symbol.symbol.SetComment(std::move(comment));
@@ -1589,6 +1640,9 @@ bool ResourceParser::ParseDeclareStyleable(xml::XmlPullParser* parser,
child_resource.name = child_ref.name.value();
child_resource.source = item_source;
child_resource.comment = std::move(comment);
+ if (options_.visibility) {
+ child_resource.visibility_level = options_.visibility.value();
+ }
if (!ParseAttrImpl(parser, &child_resource, true)) {
error = true;
diff --git a/tools/aapt2/ResourceParser.h b/tools/aapt2/ResourceParser.h
index fb9dbd0cd0fd..68130c2512d3 100644
--- a/tools/aapt2/ResourceParser.h
+++ b/tools/aapt2/ResourceParser.h
@@ -45,6 +45,10 @@ struct ResourceParserOptions {
* warnings.
*/
bool error_on_positional_arguments = true;
+
+ // If visibility was forced, we need to use it when creating a new resource and also error if we
+ // try to parse the <public>, <public-group>, <java-symbol> or <symbol> tags.
+ Maybe<Visibility::Level> visibility;
};
/*
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index 41b4041efb7a..ee496d501113 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -497,6 +497,24 @@ TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedItems) {
EXPECT_THAT(style->entries[0].key.name, Eq(make_value(test::ParseNameOrDie("android:attr/bar"))));
}
+TEST_F(ResourceParserTest, ParseStyleWithRawStringItem) {
+ std::string input = R"(
+ <style name="foo">
+ <item name="bar">
+ com.helloworld.AppClass
+ </item>
+ </style>)";
+ ASSERT_TRUE(TestParse(input));
+
+ Style* style = test::GetValue<Style>(&table_, "style/foo");
+ ASSERT_THAT(style, NotNull());
+ EXPECT_THAT(style->entries[0].value, NotNull());
+ RawString* value = ValueCast<RawString>(style->entries[0].value.get());
+ EXPECT_THAT(value, NotNull());
+ EXPECT_THAT(*value->value, StrEq(R"(com.helloworld.AppClass)"));
+}
+
+
TEST_F(ResourceParserTest, ParseStyleWithInferredParent) {
ASSERT_TRUE(TestParse(R"(<style name="foo.bar"/>)"));
@@ -971,4 +989,40 @@ TEST_F(ResourceParserTest, ParseIdItem) {
ASSERT_FALSE(TestParse(input));
}
+TEST_F(ResourceParserTest, ParseCData) {
+ std::string input = R"(
+ <string name="foo"><![CDATA[some text and ' apostrophe]]></string>)";
+
+ ASSERT_TRUE(TestParse(input));
+ String* output = test::GetValue<String>(&table_, "string/foo");
+ ASSERT_THAT(output, NotNull());
+ EXPECT_THAT(*output, StrValueEq("some text and ' apostrophe"));
+
+ // Double quotes should not change the state of whitespace processing
+ input = R"(<string name="foo2">Hello<![CDATA[ "</string>' ]]> World</string>)";
+ ASSERT_TRUE(TestParse(input));
+ output = test::GetValue<String>(&table_, "string/foo2");
+ ASSERT_THAT(output, NotNull());
+ EXPECT_THAT(*output, StrValueEq(std::string("Hello \"</string>' World").data()));
+
+ // Cdata blocks should not have their whitespace trimmed
+ input = R"(<string name="foo3"> <![CDATA[ text ]]> </string>)";
+ ASSERT_TRUE(TestParse(input));
+ output = test::GetValue<String>(&table_, "string/foo3");
+ ASSERT_THAT(output, NotNull());
+ EXPECT_THAT(*output, StrValueEq(std::string(" text ").data()));
+
+ input = R"(<string name="foo4"> <![CDATA[]]> </string>)";
+ ASSERT_TRUE(TestParse(input));
+ output = test::GetValue<String>(&table_, "string/foo4");
+ ASSERT_THAT(output, NotNull());
+ EXPECT_THAT(*output, StrValueEq(std::string("").data()));
+
+ input = R"(<string name="foo5"> <![CDATA[ ]]> </string>)";
+ ASSERT_TRUE(TestParse(input));
+ output = test::GetValue<String>(&table_, "string/foo5");
+ ASSERT_THAT(output, NotNull());
+ EXPECT_THAT(*output, StrValueEq(std::string(" ").data()));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index 560077cc322c..c48765b7b947 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -797,16 +797,20 @@ StringBuilder::StringBuilder(bool preserve_spaces)
: preserve_spaces_(preserve_spaces), quote_(preserve_spaces) {
}
-StringBuilder& StringBuilder::AppendText(const std::string& text) {
+StringBuilder& StringBuilder::AppendText(const std::string& text, bool preserve_spaces) {
if (!error_.empty()) {
return *this;
}
+ // Enable preserving spaces if it is enabled for this append or the StringBuilder was constructed
+ // to preserve spaces
+ preserve_spaces = (preserve_spaces) ? preserve_spaces : preserve_spaces_;
+
const size_t previous_len = xml_string_.text.size();
Utf8Iterator iter(text);
while (iter.HasNext()) {
char32_t codepoint = iter.Next();
- if (!quote_ && iswspace(codepoint)) {
+ if (!preserve_spaces && !quote_ && iswspace(codepoint)) {
if (!last_codepoint_was_space_) {
// Emit a space if it's the first.
xml_string_.text += ' ';
@@ -827,7 +831,6 @@ StringBuilder& StringBuilder::AppendText(const std::string& text) {
case U't':
xml_string_.text += '\t';
break;
-
case U'n':
xml_string_.text += '\n';
break;
@@ -855,12 +858,12 @@ StringBuilder& StringBuilder::AppendText(const std::string& text) {
break;
}
}
- } else if (!preserve_spaces_ && codepoint == U'"') {
+ } else if (!preserve_spaces && codepoint == U'"') {
// Only toggle the quote state when we are not preserving spaces.
quote_ = !quote_;
- } else if (!quote_ && codepoint == U'\'') {
- // This should be escaped.
+ } else if (!preserve_spaces && !quote_ && codepoint == U'\'') {
+ // This should be escaped when we are not preserving spaces
error_ = StringPrintf("unescaped apostrophe in string\n\"%s\"", text.c_str());
return *this;
diff --git a/tools/aapt2/ResourceUtils.h b/tools/aapt2/ResourceUtils.h
index 7af2fe06b908..410ef28ce78a 100644
--- a/tools/aapt2/ResourceUtils.h
+++ b/tools/aapt2/ResourceUtils.h
@@ -267,8 +267,10 @@ class StringBuilder {
// single quotations can be used without escaping them.
explicit StringBuilder(bool preserve_spaces = false);
- // Appends a chunk of text.
- StringBuilder& AppendText(const std::string& text);
+ // Appends a chunk of text. If preserve_spaces is true, whitespace removal is not performed, and
+ // single quotations can be used without escaping them for this append. Otherwise, the
+ // StringBuilder will behave as it was constructed.
+ StringBuilder& AppendText(const std::string& text, bool preserve_spaces = false);
// Starts a Span (tag) with the given name. The name is expected to be of the form:
// "tag_name;attr1=value;attr2=value;"
diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp
index 11f3fa3bc6cd..5ce464074335 100644
--- a/tools/aapt2/ResourceUtils_test.cpp
+++ b/tools/aapt2/ResourceUtils_test.cpp
@@ -254,6 +254,29 @@ TEST(ResourceUtilsTest, StringBuilderUnicodeCodes) {
TEST(ResourceUtilsTest, StringBuilderPreserveSpaces) {
EXPECT_THAT(ResourceUtils::StringBuilder(true /*preserve_spaces*/).AppendText("\"").to_string(),
Eq("\""));
+
+ // Single quotes should be able to be used without escaping them when preserving spaces and the
+ // spaces should not be trimmed
+ EXPECT_THAT(ResourceUtils::StringBuilder()
+ .AppendText(" hey guys ")
+ .AppendText(" 'this is so cool' ", /* preserve_spaces */ true)
+ .AppendText(" wow ")
+ .to_string(),
+ Eq(" hey guys 'this is so cool' wow "));
+
+ // Reading a double quote while preserving spaces should not change the quote state
+ EXPECT_THAT(ResourceUtils::StringBuilder()
+ .AppendText(" hey guys ")
+ .AppendText(" \"this is so cool' ", /* preserve_spaces */ true)
+ .AppendText(" wow ")
+ .to_string(),
+ Eq(" hey guys \"this is so cool' wow "));
+ EXPECT_THAT(ResourceUtils::StringBuilder()
+ .AppendText(" hey guys\" ")
+ .AppendText(" \"this is so cool' ", /* preserve_spaces */ true)
+ .AppendText(" wow \" ")
+ .to_string(),
+ Eq(" hey guys \"this is so cool' wow "));
}
} // namespace aapt
diff --git a/tools/aapt2/StringPool.cpp b/tools/aapt2/StringPool.cpp
index b37e1fbd9693..8eabd3225d87 100644
--- a/tools/aapt2/StringPool.cpp
+++ b/tools/aapt2/StringPool.cpp
@@ -367,7 +367,7 @@ const std::string kStringTooLarge = "STRING_TOO_LARGE";
static bool EncodeString(const std::string& str, const bool utf8, BigBuffer* out,
IDiagnostics* diag) {
if (utf8) {
- const std::string& encoded = str;
+ const std::string& encoded = util::Utf8ToModifiedUtf8(str);
const ssize_t utf16_length = utf8_to_utf16_length(
reinterpret_cast<const uint8_t*>(encoded.data()), encoded.size());
CHECK(utf16_length >= 0);
diff --git a/tools/aapt2/StringPool_test.cpp b/tools/aapt2/StringPool_test.cpp
index 4b3afe2bb962..0778564ee079 100644
--- a/tools/aapt2/StringPool_test.cpp
+++ b/tools/aapt2/StringPool_test.cpp
@@ -303,6 +303,25 @@ TEST(StringPoolTest, Flatten) {
}
}
+TEST(StringPoolTest, FlattenModifiedUTF8) {
+ using namespace android; // For NO_ERROR on Windows.
+ StdErrDiagnostics diag;
+ StringPool pool;
+ StringPool::Ref ref_a = pool.MakeRef("\xF0\x90\x90\x80"); // 𐐀 (U+10400)
+ StringPool::Ref ref_b = pool.MakeRef("foo \xF0\x90\x90\xB7 bar"); // 𐐷 (U+10437)
+ StringPool::Ref ref_c = pool.MakeRef("\xF0\x90\x90\x80\xF0\x90\x90\xB7");
+
+ BigBuffer buffer(1024);
+ StringPool::FlattenUtf8(&buffer, pool, &diag);
+ std::unique_ptr<uint8_t[]> data = util::Copy(buffer);
+
+ // Check that the 4 byte utf-8 codepoint is encoded using 2 3 byte surrogate pairs
+ ResStringPool test;
+ ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
+ EXPECT_THAT(util::GetString(test, 0), Eq("\xED\xA0\x81\xED\xB0\x80"));
+ EXPECT_THAT(util::GetString(test, 1), Eq("foo \xED\xA0\x81\xED\xB0\xB7 bar"));
+ EXPECT_THAT(util::GetString(test, 2), Eq("\xED\xA0\x81\xED\xB0\x80\xED\xA0\x81\xED\xB0\xB7"));
+}
TEST(StringPoolTest, MaxEncodingLength) {
StdErrDiagnostics diag;
diff --git a/tools/aapt2/Flags.cpp b/tools/aapt2/cmd/Command.cpp
index 84977ab424cc..09411b95bcfe 100644
--- a/tools/aapt2/Flags.cpp
+++ b/tools/aapt2/cmd/Command.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "Flags.h"
+#include "Command.h"
#include <iomanip>
#include <iostream>
@@ -29,87 +29,113 @@ using android::StringPiece;
namespace aapt {
-Flags& Flags::RequiredFlag(const StringPiece& name,
- const StringPiece& description, std::string* value) {
+void Command::AddRequiredFlag(const StringPiece& name,
+ const StringPiece& description, std::string* value) {
auto func = [value](const StringPiece& arg) -> bool {
*value = arg.to_string();
return true;
};
flags_.push_back(Flag{name.to_string(), description.to_string(), func, true, 1, false});
- return *this;
}
-Flags& Flags::RequiredFlagList(const StringPiece& name,
- const StringPiece& description,
- std::vector<std::string>* value) {
+void Command::AddRequiredFlagList(const StringPiece& name,
+ const StringPiece& description,
+ std::vector<std::string>* value) {
auto func = [value](const StringPiece& arg) -> bool {
value->push_back(arg.to_string());
return true;
};
flags_.push_back(Flag{name.to_string(), description.to_string(), func, true, 1, false});
- return *this;
}
-Flags& Flags::OptionalFlag(const StringPiece& name,
- const StringPiece& description,
- Maybe<std::string>* value) {
+void Command::AddOptionalFlag(const StringPiece& name,
+ const StringPiece& description,
+ Maybe<std::string>* value) {
auto func = [value](const StringPiece& arg) -> bool {
*value = arg.to_string();
return true;
};
flags_.push_back(Flag{name.to_string(), description.to_string(), func, false, 1, false});
- return *this;
}
-Flags& Flags::OptionalFlagList(const StringPiece& name,
- const StringPiece& description,
- std::vector<std::string>* value) {
+void Command::AddOptionalFlagList(const StringPiece& name,
+ const StringPiece& description,
+ std::vector<std::string>* value) {
auto func = [value](const StringPiece& arg) -> bool {
value->push_back(arg.to_string());
return true;
};
flags_.push_back(Flag{name.to_string(), description.to_string(), func, false, 1, false});
- return *this;
}
-Flags& Flags::OptionalFlagList(const StringPiece& name,
- const StringPiece& description,
- std::unordered_set<std::string>* value) {
+void Command::AddOptionalFlagList(const StringPiece& name,
+ const StringPiece& description,
+ std::unordered_set<std::string>* value) {
auto func = [value](const StringPiece& arg) -> bool {
value->insert(arg.to_string());
return true;
};
flags_.push_back(Flag{name.to_string(), description.to_string(), func, false, 1, false});
- return *this;
}
-Flags& Flags::OptionalSwitch(const StringPiece& name,
- const StringPiece& description, bool* value) {
+void Command::AddOptionalSwitch(const StringPiece& name,
+ const StringPiece& description, bool* value) {
auto func = [value](const StringPiece& arg) -> bool {
*value = true;
return true;
};
flags_.push_back(Flag{name.to_string(), description.to_string(), func, false, 0, false});
- return *this;
}
-void Flags::Usage(const StringPiece& command, std::ostream* out) {
+void Command::AddOptionalSubcommand(std::unique_ptr<Command>&& subcommand) {
+ subcommand->fullname_ = name_ + " " + subcommand->name_;
+ subcommands_.push_back(std::move(subcommand));
+}
+
+void Command::SetDescription(const android::StringPiece& description) {
+ description_ = description.to_string();
+}
+
+void Command::Usage(std::ostream* out) {
constexpr size_t kWidth = 50;
- *out << command << " [options]";
+ *out << fullname_;
+
+ if (!subcommands_.empty()) {
+ *out << " [subcommand]";
+ }
+
+ *out << " [options]";
for (const Flag& flag : flags_) {
if (flag.required) {
*out << " " << flag.name << " arg";
}
}
- *out << " files...\n\nOptions:\n";
+ *out << " files...\n";
+
+ if (!subcommands_.empty()) {
+ *out << "\nSubcommands:\n";
+ for (auto& subcommand : subcommands_) {
+ std::string argline = subcommand->name_;
+
+ // Split the description by newlines and write out the argument (which is
+ // empty after the first line) followed by the description line. This will make sure
+ // that multiline descriptions are still right justified and aligned.
+ for (StringPiece line : util::Tokenize(subcommand->description_, '\n')) {
+ *out << " " << std::setw(kWidth) << std::left << argline << line << "\n";
+ argline = " ";
+ }
+ }
+ }
+
+ *out << "\nOptions:\n";
for (const Flag& flag : flags_) {
std::string argline = flag.name;
@@ -118,10 +144,8 @@ void Flags::Usage(const StringPiece& command, std::ostream* out) {
}
// Split the description by newlines and write out the argument (which is
- // empty after
- // the first line) followed by the description line. This will make sure
- // that multiline
- // descriptions are still right justified and aligned.
+ // empty after the first line) followed by the description line. This will make sure
+ // that multiline descriptions are still right justified and aligned.
for (StringPiece line : util::Tokenize(flag.description, '\n')) {
*out << " " << std::setw(kWidth) << std::left << argline << line << "\n";
argline = " ";
@@ -132,19 +156,29 @@ void Flags::Usage(const StringPiece& command, std::ostream* out) {
out->flush();
}
-bool Flags::Parse(const StringPiece& command,
- const std::vector<StringPiece>& args,
- std::ostream* out_error) {
+int Command::Execute(const std::vector<android::StringPiece>& args, std::ostream* out_error) {
+ std::vector<std::string> file_args;
+
for (size_t i = 0; i < args.size(); i++) {
StringPiece arg = args[i];
if (*(arg.data()) != '-') {
- args_.push_back(arg.to_string());
+ // Continue parsing as the sub command if the first argument matches one of the subcommands
+ if (i == 0) {
+ for (auto& subcommand : subcommands_) {
+ if (arg == subcommand->name_ || arg==subcommand->short_name_) {
+ return subcommand->Execute(
+ std::vector<android::StringPiece>(args.begin() + 1, args.end()), out_error);
+ }
+ }
+ }
+
+ file_args.push_back(arg.to_string());
continue;
}
if (arg == "-h" || arg == "--help") {
- Usage(command, out_error);
- return false;
+ Usage(out_error);
+ return 1;
}
bool match = false;
@@ -154,7 +188,7 @@ bool Flags::Parse(const StringPiece& command,
i++;
if (i >= args.size()) {
*out_error << flag.name << " missing argument.\n\n";
- Usage(command, out_error);
+ Usage(out_error);
return false;
}
flag.action(args[i]);
@@ -169,21 +203,20 @@ bool Flags::Parse(const StringPiece& command,
if (!match) {
*out_error << "unknown option '" << arg << "'.\n\n";
- Usage(command, out_error);
- return false;
+ Usage(out_error);
+ return 1;
}
}
for (const Flag& flag : flags_) {
if (flag.required && !flag.parsed) {
*out_error << "missing required flag " << flag.name << "\n\n";
- Usage(command, out_error);
- return false;
+ Usage(out_error);
+ return 1;
}
}
- return true;
-}
-const std::vector<std::string>& Flags::GetArgs() { return args_; }
+ return Action(file_args);
+}
} // namespace aapt
diff --git a/tools/aapt2/cmd/Command.h b/tools/aapt2/cmd/Command.h
new file mode 100644
index 000000000000..71dc6fe48da1
--- /dev/null
+++ b/tools/aapt2/cmd/Command.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT_COMMAND_H
+#define AAPT_COMMAND_H
+
+#include <functional>
+#include <ostream>
+#include <string>
+#include <unordered_set>
+#include <vector>
+
+#include "androidfw/StringPiece.h"
+
+#include "util/Maybe.h"
+
+namespace aapt {
+
+class Command {
+ public:
+ explicit Command(const android::StringPiece& name) : name_(name.to_string()),
+ fullname_(name.to_string()) { }
+ explicit Command(const android::StringPiece& name, const android::StringPiece& short_name)
+ : name_(name.to_string()), short_name_(short_name.to_string()), fullname_(name.to_string()) {}
+ virtual ~Command() = default;
+
+ void AddRequiredFlag(const android::StringPiece& name, const android::StringPiece& description,
+ std::string* value);
+ void AddRequiredFlagList(const android::StringPiece& name, const android::StringPiece&
+ description, std::vector<std::string>* value);
+ void AddOptionalFlag(const android::StringPiece& name, const android::StringPiece& description,
+ Maybe<std::string>* value);
+ void AddOptionalFlagList(const android::StringPiece& name,
+ const android::StringPiece& description, std::vector<std::string>* value);
+ void AddOptionalFlagList(const android::StringPiece& name,
+ const android::StringPiece& description, std::unordered_set<std::string>* value);
+ void AddOptionalSwitch(const android::StringPiece& name, const android::StringPiece& description,
+ bool* value);
+ void AddOptionalSubcommand(std::unique_ptr<Command>&& subcommand);
+
+ void SetDescription(const android::StringPiece& name);
+
+ /** Prints the help menu of the command. */
+ void Usage(std::ostream* out);
+
+ /**
+ * Parses the command line arguments, sets the flag variable values, and runs the action of
+ * the command. If the arguments fail to parse to the command and its subcommands, then the action
+ * will not be run and the usage will be printed instead.
+ **/
+ int Execute(const std::vector<android::StringPiece>& args, std::ostream* outError);
+
+ /** The action to preform when the command is executed. */
+ virtual int Action(const std::vector<std::string>& args) = 0;
+
+ private:
+ struct Flag {
+ std::string name;
+ std::string description;
+ std::function<bool(const android::StringPiece& value)> action;
+ bool required;
+ size_t num_args;
+
+ bool parsed;
+ };
+
+ std::string description_;
+ std::string name_;
+ std::string short_name_;
+ std::string fullname_;
+ std::vector<Flag> flags_;
+ std::vector<std::unique_ptr<Command>> subcommands_;
+};
+
+} // namespace aapt
+
+#endif // AAPT_COMMAND_H
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index ab8a4b77a89d..8c1fa9ac0226 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -14,8 +14,9 @@
* limitations under the License.
*/
-#include <dirent.h>
+#include "Compile.h"
+#include <dirent.h>
#include <string>
#include "android-base/errors.h"
@@ -27,9 +28,9 @@
#include "ConfigDescription.h"
#include "Diagnostics.h"
-#include "Flags.h"
#include "ResourceParser.h"
#include "ResourceTable.h"
+#include "cmd/Util.h"
#include "compile/IdAssigner.h"
#include "compile/InlineXmlFormatParser.h"
#include "compile/Png.h"
@@ -120,16 +121,6 @@ static Maybe<ResourcePathData> ExtractResourcePathData(const std::string& path,
extension.to_string(), config_str.to_string(), config};
}
-struct CompileOptions {
- std::string output_path;
- Maybe<std::string> res_dir;
- Maybe<std::string> generate_text_symbols_path;
- bool pseudolocalize = false;
- bool no_png_crunch = false;
- bool legacy_mode = false;
- bool verbose = false;
-};
-
static std::string BuildIntermediateContainerFilename(const ResourcePathData& data) {
std::stringstream name;
name << data.resource_dir;
@@ -226,6 +217,10 @@ static bool CompileTable(IAaptContext* context, const CompileOptions& options,
// If the filename includes donottranslate, then the default translatable is false.
parser_options.translatable = path_data.name.find("donottranslate") == std::string::npos;
+ // If visibility was forced, we need to use it when creating a new resource and also error if
+ // we try to parse the <public>, <public-group>, <java-symbol> or <symbol> tags.
+ parser_options.visibility = options.visibility;
+
ResourceParser res_parser(context->GetDiagnostics(), &table, path_data.source, path_data.config,
parser_options);
if (!res_parser.Parse(&xml_parser)) {
@@ -319,8 +314,16 @@ static bool CompileTable(IAaptContext* context, const CompileOptions& options,
if (!entry->values.empty()) {
auto styleable = static_cast<const Styleable*>(entry->values.front()->value.get());
for (const auto& attr : styleable->entries) {
+ // The visibility of the children under the styleable does not matter as they are
+ // nested under their parent and use its visibility.
r_txt_printer.Print("default int styleable ");
r_txt_printer.Print(entry->name);
+ // If the package name is present, also include it in the mangled name (e.g.
+ // "android")
+ if (!attr.name.value().package.empty()) {
+ r_txt_printer.Print("_");
+ r_txt_printer.Print(MakePackageSafeName(attr.name.value().package));
+ }
r_txt_printer.Print("_");
r_txt_printer.Println(attr.name.value().entry);
}
@@ -687,6 +690,10 @@ class CompileContext : public IAaptContext {
return 0;
}
+ bool IsAutoNamespace() override {
+ return false;
+ }
+
private:
DISALLOW_COPY_AND_ASSIGN(CompileContext);
@@ -694,56 +701,47 @@ class CompileContext : public IAaptContext {
bool verbose_ = false;
};
-// Entry point for compilation phase. Parses arguments and dispatches to the correct steps.
-int Compile(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
- CompileContext context(diagnostics);
- CompileOptions options;
-
- bool verbose = false;
- Flags flags =
- Flags()
- .RequiredFlag("-o", "Output path", &options.output_path)
- .OptionalFlag("--dir", "Directory to scan for resources", &options.res_dir)
- .OptionalFlag("--output-text-symbols",
- "Generates a text file containing the resource symbols in the\n"
- "specified file",
- &options.generate_text_symbols_path)
- .OptionalSwitch("--pseudo-localize",
- "Generate resources for pseudo-locales "
- "(en-XA and ar-XB)",
- &options.pseudolocalize)
- .OptionalSwitch("--no-crunch", "Disables PNG processing", &options.no_png_crunch)
- .OptionalSwitch("--legacy", "Treat errors that used to be valid in AAPT as warnings",
- &options.legacy_mode)
- .OptionalSwitch("-v", "Enables verbose logging", &verbose);
- if (!flags.Parse("aapt2 compile", args, &std::cerr)) {
- return 1;
+int CompileCommand::Action(const std::vector<std::string>& args) {
+ CompileContext context(diagnostic_);
+ context.SetVerbose(options_.verbose);
+
+ if (visibility_) {
+ if (visibility_.value() == "public") {
+ options_.visibility = Visibility::Level::kPublic;
+ } else if (visibility_.value() == "private") {
+ options_.visibility = Visibility::Level::kPrivate;
+ } else if (visibility_.value() == "default") {
+ options_.visibility = Visibility::Level::kUndefined;
+ } else {
+ context.GetDiagnostics()->Error(
+ DiagMessage() << "Unrecognized visibility level passes to --visibility: '"
+ << visibility_.value() << "'. Accepted levels: public, private, default");
+ return 1;
+ }
}
- context.SetVerbose(verbose);
-
std::unique_ptr<IArchiveWriter> archive_writer;
std::vector<ResourcePathData> input_data;
- if (options.res_dir) {
- if (!flags.GetArgs().empty()) {
+ if (options_.res_dir) {
+ if (!args.empty()) {
// Can't have both files and a resource directory.
context.GetDiagnostics()->Error(DiagMessage() << "files given but --dir specified");
- flags.Usage("aapt2 compile", &std::cerr);
+ Usage(&std::cerr);
return 1;
}
- if (!LoadInputFilesFromDir(&context, options, &input_data)) {
+ if (!LoadInputFilesFromDir(&context, options_, &input_data)) {
return 1;
}
- archive_writer = CreateZipFileArchiveWriter(context.GetDiagnostics(), options.output_path);
+ archive_writer = CreateZipFileArchiveWriter(context.GetDiagnostics(), options_.output_path);
} else {
- input_data.reserve(flags.GetArgs().size());
+ input_data.reserve(args.size());
// Collect data from the path for each input file.
- for (const std::string& arg : flags.GetArgs()) {
+ for (const std::string& arg : args) {
std::string error_str;
if (Maybe<ResourcePathData> path_data = ExtractResourcePathData(arg, &error_str)) {
input_data.push_back(std::move(path_data.value()));
@@ -753,7 +751,7 @@ int Compile(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
}
}
- archive_writer = CreateDirectoryArchiveWriter(context.GetDiagnostics(), options.output_path);
+ archive_writer = CreateDirectoryArchiveWriter(context.GetDiagnostics(), options_.output_path);
}
if (!archive_writer) {
@@ -762,7 +760,7 @@ int Compile(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
bool error = false;
for (ResourcePathData& path_data : input_data) {
- if (options.verbose) {
+ if (options_.verbose) {
context.GetDiagnostics()->Note(DiagMessage(path_data.source) << "processing");
}
@@ -783,21 +781,21 @@ int Compile(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
if (*type != ResourceType::kRaw) {
if (path_data.extension == "xml") {
compile_func = &CompileXml;
- } else if ((!options.no_png_crunch && path_data.extension == "png")
+ } else if ((!options_.no_png_crunch && path_data.extension == "png")
|| path_data.extension == "9.png") {
compile_func = &CompilePng;
}
}
} else {
context.GetDiagnostics()->Error(DiagMessage()
- << "invalid file path '" << path_data.source << "'");
+ << "invalid file path '" << path_data.source << "'");
error = true;
continue;
}
// Treat periods as a reserved character that should not be present in a file name
// Legacy support for AAPT which did not reserve periods
- if (compile_func != &CompileFile && !options.legacy_mode
+ if (compile_func != &CompileFile && !options_.legacy_mode
&& std::count(path_data.name.begin(), path_data.name.end(), '.') != 0) {
error = true;
context.GetDiagnostics()->Error(DiagMessage() << "resource file '" << path_data.source.path
@@ -808,7 +806,7 @@ int Compile(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
// Compile the file.
const std::string out_path = BuildIntermediateContainerFilename(path_data);
- error |= !compile_func(&context, options, path_data, archive_writer.get(), out_path);
+ error |= !compile_func(&context, options_, path_data, archive_writer.get(), out_path);
}
return error ? 1 : 0;
}
diff --git a/tools/aapt2/cmd/Compile.h b/tools/aapt2/cmd/Compile.h
index d95cf1c22732..41519520fda1 100644
--- a/tools/aapt2/cmd/Compile.h
+++ b/tools/aapt2/cmd/Compile.h
@@ -1,13 +1,69 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
#ifndef AAPT2_COMPILE_H
#define AAPT2_COMPILE_H
#include "androidfw/StringPiece.h"
+#include "Command.h"
#include "Diagnostics.h"
+#include "ResourceTable.h"
namespace aapt {
- int Compile(const std::vector<android::StringPiece>& args, IDiagnostics* diagnostics);
+struct CompileOptions {
+ std::string output_path;
+ Maybe<std::string> res_dir;
+ Maybe<std::string> generate_text_symbols_path;
+ Maybe<Visibility::Level> visibility;
+ bool pseudolocalize = false;
+ bool no_png_crunch = false;
+ bool legacy_mode = false;
+ bool verbose = false;
+};
+
+class CompileCommand : public Command {
+ public:
+ explicit CompileCommand(IDiagnostics* diagnostic) : Command("compile", "c"),
+ diagnostic_(diagnostic) {
+ SetDescription("Compiles resources to be linked into an apk.");
+ AddRequiredFlag("-o", "Output path", &options_.output_path);
+ AddOptionalFlag("--dir", "Directory to scan for resources", &options_.res_dir);
+ AddOptionalFlag("--output-text-symbols",
+ "Generates a text file containing the resource symbols in the\n"
+ "specified file", &options_.generate_text_symbols_path);
+ AddOptionalSwitch("--pseudo-localize", "Generate resources for pseudo-locales "
+ "(en-XA and ar-XB)", &options_.pseudolocalize);
+ AddOptionalSwitch("--no-crunch", "Disables PNG processing", &options_.no_png_crunch);
+ AddOptionalSwitch("--legacy", "Treat errors that used to be valid in AAPT as warnings",
+ &options_.legacy_mode);
+ AddOptionalSwitch("-v", "Enables verbose logging", &options_.verbose);
+ AddOptionalFlag("--visibility",
+ "Sets the visibility of the compiled resources to the specified\n"
+ "level. Accepted levels: public, private, default", &visibility_);
+ }
+
+ int Action(const std::vector<std::string>& args) override;
+
+ private:
+ IDiagnostics* diagnostic_;
+ CompileOptions options_;
+ Maybe<std::string> visibility_;
+};
}// namespace aapt
diff --git a/tools/aapt2/cmd/Compile_test.cpp b/tools/aapt2/cmd/Compile_test.cpp
index 212f2cf26e0d..d21addf4a081 100644
--- a/tools/aapt2/cmd/Compile_test.cpp
+++ b/tools/aapt2/cmd/Compile_test.cpp
@@ -23,7 +23,8 @@
namespace aapt {
-int TestCompile(std::string path, std::string outDir, bool legacy, StdErrDiagnostics& diag) {
+int TestCompile(const std::string& path, const std::string& outDir, bool legacy,
+ StdErrDiagnostics& diag) {
std::vector<android::StringPiece> args;
args.push_back(path);
args.push_back("-o");
@@ -32,7 +33,7 @@ int TestCompile(std::string path, std::string outDir, bool legacy, StdErrDiagnos
if (legacy) {
args.push_back("--legacy");
}
- return aapt::Compile(args, &diag);
+ return CompileCommand(&diag).Execute(args, &std::cerr);
}
TEST(CompilerTest, MultiplePeriods) {
diff --git a/tools/aapt2/cmd/Convert.cpp b/tools/aapt2/cmd/Convert.cpp
index eb307fb1ddce..4b82eefa7d6f 100644
--- a/tools/aapt2/cmd/Convert.cpp
+++ b/tools/aapt2/cmd/Convert.cpp
@@ -14,12 +14,13 @@
* limitations under the License.
*/
+#include "Convert.h"
+
#include <vector>
#include "android-base/macros.h"
#include "androidfw/StringPiece.h"
-#include "Flags.h"
#include "LoadedApk.h"
#include "ValueVisitor.h"
#include "cmd/Util.h"
@@ -310,6 +311,10 @@ class Context : public IAaptContext {
return 0u;
}
+ bool IsAutoNamespace() override {
+ return false;
+ }
+
bool verbose_ = false;
std::string package_;
@@ -321,37 +326,18 @@ class Context : public IAaptContext {
StdErrDiagnostics diag_;
};
-int Convert(const vector<StringPiece>& args) {
-
- static const char* kOutputFormatProto = "proto";
- static const char* kOutputFormatBinary = "binary";
-
- Context context;
- std::string output_path;
- Maybe<std::string> output_format;
- TableFlattenerOptions options;
- Flags flags =
- Flags()
- .RequiredFlag("-o", "Output path", &output_path)
- .OptionalFlag("--output-format", StringPrintf("Format of the output. Accepted values are "
- "'%s' and '%s'. When not set, defaults to '%s'.", kOutputFormatProto,
- kOutputFormatBinary, kOutputFormatBinary), &output_format)
- .OptionalSwitch("--enable-sparse-encoding",
- "Enables encoding sparse entries using a binary search tree.\n"
- "This decreases APK size at the cost of resource retrieval performance.",
- &options.use_sparse_entries)
- .OptionalSwitch("-v", "Enables verbose logging", &context.verbose_);
- if (!flags.Parse("aapt2 convert", args, &std::cerr)) {
- return 1;
- }
+const char* ConvertCommand::kOutputFormatProto = "proto";
+const char* ConvertCommand::kOutputFormatBinary = "binary";
- if (flags.GetArgs().size() != 1) {
+int ConvertCommand::Action(const std::vector<std::string>& args) {
+ if (args.size() != 1) {
std::cerr << "must supply a single proto APK\n";
- flags.Usage("aapt2 convert", &std::cerr);
+ Usage(&std::cerr);
return 1;
}
- const StringPiece& path = flags.GetArgs()[0];
+ Context context;
+ const StringPiece& path = args[0];
unique_ptr<LoadedApk> apk = LoadedApk::LoadApkFromPath(path, context.GetDiagnostics());
if (apk == nullptr) {
context.GetDiagnostics()->Error(DiagMessage(path) << "failed to load APK");
@@ -367,24 +353,24 @@ int Convert(const vector<StringPiece>& args) {
context.package_ = app_info.value().package;
unique_ptr<IArchiveWriter> writer =
- CreateZipFileArchiveWriter(context.GetDiagnostics(), output_path);
+ CreateZipFileArchiveWriter(context.GetDiagnostics(), output_path_);
if (writer == nullptr) {
return 1;
}
unique_ptr<IApkSerializer> serializer;
- if (!output_format || output_format.value() == kOutputFormatBinary) {
- serializer.reset(new BinaryApkSerializer(&context, apk->GetSource(), options));
- } else if (output_format.value() == kOutputFormatProto) {
+ if (!output_format_ || output_format_.value() == ConvertCommand::kOutputFormatBinary) {
+
+ serializer.reset(new BinaryApkSerializer(&context, apk->GetSource(), options_));
+ } else if (output_format_.value() == ConvertCommand::kOutputFormatProto) {
serializer.reset(new ProtoApkSerializer(&context, apk->GetSource()));
} else {
context.GetDiagnostics()->Error(DiagMessage(path)
- << "Invalid value for flag --output-format: "
- << output_format.value());
+ << "Invalid value for flag --output-format: "
+ << output_format_.value());
return 1;
}
-
return ConvertApk(&context, std::move(apk), serializer.get(), writer.get()) ? 0 : 1;
}
diff --git a/tools/aapt2/cmd/Convert.h b/tools/aapt2/cmd/Convert.h
new file mode 100644
index 000000000000..fcec23d16f78
--- /dev/null
+++ b/tools/aapt2/cmd/Convert.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT2_CONVERT_H
+#define AAPT2_CONVERT_H
+
+#include "Command.h"
+#include "format/binary/TableFlattener.h"
+
+namespace aapt {
+
+class ConvertCommand : public Command {
+ public:
+ explicit ConvertCommand() : Command("convert") {
+ SetDescription("Converts an apk between binary and proto formats.");
+ AddRequiredFlag("-o", "Output path", &output_path_);
+ AddOptionalFlag("--output-format", android::base::StringPrintf("Format of the output. "
+ "Accepted values are '%s' and '%s'. When not set, defaults to '%s'.",
+ kOutputFormatProto, kOutputFormatBinary, kOutputFormatBinary), &output_format_);
+ AddOptionalSwitch("--enable-sparse-encoding",
+ "Enables encoding sparse entries using a binary search tree.\n"
+ "This decreases APK size at the cost of resource retrieval performance.",
+ &options_.use_sparse_entries);
+ AddOptionalSwitch("-v", "Enables verbose logging", &verbose_);
+ }
+
+ int Action(const std::vector<std::string>& args) override;
+
+ private:
+ const static char* kOutputFormatProto;
+ const static char* kOutputFormatBinary;
+
+ TableFlattenerOptions options_;
+ std::string output_path_;
+ Maybe<std::string> output_format_;
+ bool verbose_ = false;
+};
+
+}// namespace aapt
+
+#endif //AAPT2_CONVERT_H
diff --git a/tools/aapt2/cmd/Diff.cpp b/tools/aapt2/cmd/Diff.cpp
index 12113ed8a48a..7875a2bb7a86 100644
--- a/tools/aapt2/cmd/Diff.cpp
+++ b/tools/aapt2/cmd/Diff.cpp
@@ -14,9 +14,10 @@
* limitations under the License.
*/
+#include "Diff.h"
+
#include "android-base/macros.h"
-#include "Flags.h"
#include "LoadedApk.h"
#include "ValueVisitor.h"
#include "process/IResourceTableConsumer.h"
@@ -64,6 +65,10 @@ class DiffContext : public IAaptContext {
return 0;
}
+ bool IsAutoNamespace() override {
+ return false;
+ }
+
private:
std::string empty_;
StdErrDiagnostics diagnostics_;
@@ -344,23 +349,18 @@ static void ZeroOutAppReferences(ResourceTable* table) {
VisitAllValuesInTable(table, &visitor);
}
-int Diff(const std::vector<StringPiece>& args) {
+int DiffCommand::Action(const std::vector<std::string>& args) {
DiffContext context;
- Flags flags;
- if (!flags.Parse("aapt2 diff", args, &std::cerr)) {
- return 1;
- }
-
- if (flags.GetArgs().size() != 2u) {
+ if (args.size() != 2u) {
std::cerr << "must have two apks as arguments.\n\n";
- flags.Usage("aapt2 diff", &std::cerr);
+ Usage(&std::cerr);
return 1;
}
IDiagnostics* diag = context.GetDiagnostics();
- std::unique_ptr<LoadedApk> apk_a = LoadedApk::LoadApkFromPath(flags.GetArgs()[0], diag);
- std::unique_ptr<LoadedApk> apk_b = LoadedApk::LoadApkFromPath(flags.GetArgs()[1], diag);
+ std::unique_ptr<LoadedApk> apk_a = LoadedApk::LoadApkFromPath(args[0], diag);
+ std::unique_ptr<LoadedApk> apk_b = LoadedApk::LoadApkFromPath(args[1], diag);
if (!apk_a || !apk_b) {
return 1;
}
diff --git a/tools/aapt2/cmd/Diff.h b/tools/aapt2/cmd/Diff.h
new file mode 100644
index 000000000000..c38888863be9
--- /dev/null
+++ b/tools/aapt2/cmd/Diff.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT2_DIFF_H
+#define AAPT2_DIFF_H
+
+#include "Command.h"
+
+namespace aapt {
+
+class DiffCommand : public Command {
+ public:
+ explicit DiffCommand() : Command("diff") {
+ SetDescription("Prints the differences in resources of two apks.");
+ }
+
+ int Action(const std::vector<std::string>& args) override;
+};
+
+}// namespace aapt
+
+#endif //AAPT2_DIFF_H
diff --git a/tools/aapt2/cmd/Dump.cpp b/tools/aapt2/cmd/Dump.cpp
index 8e7e5e59bc31..717e757a1bba 100644
--- a/tools/aapt2/cmd/Dump.cpp
+++ b/tools/aapt2/cmd/Dump.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#include "Dump.h"
+
#include <cinttypes>
#include <vector>
@@ -22,7 +24,6 @@
#include "Debug.h"
#include "Diagnostics.h"
-#include "Flags.h"
#include "format/Container.h"
#include "format/binary/BinaryResourceParser.h"
#include "format/proto/ProtoDeserialize.h"
@@ -38,13 +39,6 @@ using ::android::base::StringPrintf;
namespace aapt {
-struct DumpOptions {
- DebugPrintTableOptions print_options;
-
- // The path to a file within an APK to dump.
- Maybe<std::string> file_to_dump_path;
-};
-
static const char* ResourceFileTypeToString(const ResourceFile::Type& type) {
switch (type) {
case ResourceFile::Type::kPng:
@@ -298,6 +292,10 @@ class DumpContext : public IAaptContext {
return 0;
}
+ bool IsAutoNamespace() override {
+ return false;
+ }
+
private:
StdErrDiagnostics diagnostics_;
bool verbose_ = false;
@@ -305,29 +303,13 @@ class DumpContext : public IAaptContext {
} // namespace
-// Entry point for dump command.
-int Dump(const std::vector<StringPiece>& args) {
- bool verbose = false;
- bool no_values = false;
- DumpOptions options;
- Flags flags = Flags()
- .OptionalSwitch("--no-values",
- "Suppresses output of values when displaying resource tables.",
- &no_values)
- .OptionalFlag("--file", "Dumps the specified file from the APK passed as arg.",
- &options.file_to_dump_path)
- .OptionalSwitch("-v", "increase verbosity of output", &verbose);
- if (!flags.Parse("aapt2 dump", args, &std::cerr)) {
- return 1;
- }
-
+int DumpCommand::Action(const std::vector<std::string>& args) {
DumpContext context;
- context.SetVerbose(verbose);
-
- options.print_options.show_sources = true;
- options.print_options.show_values = !no_values;
- for (const std::string& arg : flags.GetArgs()) {
- if (!TryDumpFile(&context, arg, options)) {
+ context.SetVerbose(verbose_);
+ options_.print_options.show_sources = true;
+ options_.print_options.show_values = !no_values_;
+ for (const std::string& arg : args) {
+ if (!TryDumpFile(&context, arg, options_)) {
return 1;
}
}
diff --git a/tools/aapt2/cmd/Dump.h b/tools/aapt2/cmd/Dump.h
new file mode 100644
index 000000000000..4893c8b76041
--- /dev/null
+++ b/tools/aapt2/cmd/Dump.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT2_DUMP_H
+#define AAPT2_DUMP_H
+
+#include "Command.h"
+#include "Debug.h"
+
+namespace aapt {
+
+struct DumpOptions {
+ DebugPrintTableOptions print_options;
+
+ // The path to a file within an APK to dump.
+ Maybe<std::string> file_to_dump_path;
+};
+
+class DumpCommand : public Command {
+ public:
+ DumpCommand() : Command("dump", "d") {
+ SetDescription("Prints resource and manifest information.");
+ AddOptionalSwitch("--no-values", "Suppresses output of values when displaying resource tables.",
+ &no_values_);
+ AddOptionalFlag("--file", "Dumps the specified file from the APK passed as arg.",
+ &options_.file_to_dump_path);
+ AddOptionalSwitch("-v", "increase verbosity of output", &verbose_);
+ }
+
+ int Action(const std::vector<std::string>& args) override;
+
+ private:
+ DumpOptions options_;
+
+ bool verbose_ = false;
+ bool no_values_ = false;
+};
+
+}// namespace aapt
+
+#endif //AAPT2_DUMP_H
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 0910040fb07a..1d508d91f0fa 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+#include "Link.h"
+
#include <sys/stat.h>
#include <cinttypes>
+#include <algorithm>
#include <queue>
#include <unordered_map>
#include <vector>
@@ -28,7 +31,6 @@
#include "AppInfo.h"
#include "Debug.h"
-#include "Flags.h"
#include "LoadedApk.h"
#include "Locale.h"
#include "NameMangler.h"
@@ -73,70 +75,6 @@ using ::android::base::StringPrintf;
namespace aapt {
-enum class OutputFormat {
- kApk,
- kProto,
-};
-
-struct LinkOptions {
- std::string output_path;
- std::string manifest_path;
- std::vector<std::string> include_paths;
- std::vector<std::string> overlay_files;
- std::vector<std::string> assets_dirs;
- bool output_to_directory = false;
- bool auto_add_overlay = false;
- OutputFormat output_format = OutputFormat::kApk;
-
- // Java/Proguard options.
- Maybe<std::string> generate_java_class_path;
- Maybe<std::string> custom_java_package;
- std::set<std::string> extra_java_packages;
- Maybe<std::string> generate_text_symbols_path;
- Maybe<std::string> generate_proguard_rules_path;
- Maybe<std::string> generate_main_dex_proguard_rules_path;
- bool generate_conditional_proguard_rules = false;
- bool generate_non_final_ids = false;
- std::vector<std::string> javadoc_annotations;
- Maybe<std::string> private_symbols;
-
- // Optimizations/features.
- bool no_auto_version = false;
- bool no_version_vectors = false;
- bool no_version_transitions = false;
- bool no_resource_deduping = false;
- bool no_xml_namespaces = false;
- bool do_not_compress_anything = false;
- std::unordered_set<std::string> extensions_to_not_compress;
-
- // Static lib options.
- bool no_static_lib_packages = false;
-
- // AndroidManifest.xml massaging options.
- ManifestFixerOptions manifest_fixer_options;
-
- // Products to use/filter on.
- std::unordered_set<std::string> products;
-
- // Flattening options.
- TableFlattenerOptions table_flattener_options;
-
- // Split APK options.
- TableSplitterOptions table_splitter_options;
- std::vector<SplitConstraints> split_constraints;
- std::vector<std::string> split_paths;
-
- // Stable ID options.
- std::unordered_map<ResourceName, ResourceId> stable_id_map;
- Maybe<std::string> resource_id_map_path;
-
- // When 'true', allow reserved package IDs to be used for applications. Pre-O, the platform
- // treats negative resource IDs [those with a package ID of 0x80 or higher] as invalid.
- // In order to work around this limitation, we allow the use of traditionally reserved
- // resource IDs [those between 0x02 and 0x7E].
- bool allow_reserved_package_id = false;
-};
-
class LinkContext : public IAaptContext {
public:
LinkContext(IDiagnostics* diagnostics)
@@ -199,6 +137,14 @@ class LinkContext : public IAaptContext {
min_sdk_version_ = minSdk;
}
+ bool IsAutoNamespace() override {
+ return auto_namespace_;
+ }
+
+ void SetAutoNamespace(bool val) {
+ auto_namespace_ = val;
+ }
+
private:
DISALLOW_COPY_AND_ASSIGN(LinkContext);
@@ -210,6 +156,7 @@ class LinkContext : public IAaptContext {
SymbolTable symbols_;
bool verbose_ = false;
int min_sdk_version_ = 0;
+ bool auto_namespace_ = false;
};
// A custom delegate that generates compatible pre-O IDs for use with feature splits.
@@ -486,7 +433,7 @@ std::vector<std::unique_ptr<xml::XmlResource>> ResourceFileFlattener::LinkAndVer
return {};
}
- if (options_.update_proguard_spec && !proguard::CollectProguardRules(doc, keep_set_)) {
+ if (options_.update_proguard_spec && !proguard::CollectProguardRules(context_, doc, keep_set_)) {
return {};
}
@@ -771,9 +718,9 @@ static int32_t FindFrameworkAssetManagerCookie(const android::AssetManager& asse
return table.getTableCookie(idx);
}
-class LinkCommand {
+class Linker {
public:
- LinkCommand(LinkContext* context, const LinkOptions& options)
+ Linker(LinkContext* context, const LinkOptions& options)
: options_(options),
context_(context),
final_table_(),
@@ -961,6 +908,18 @@ class LinkCommand {
app_info.version_code = maybe_code.value();
}
+ if (xml::Attribute* version_code_major_attr =
+ manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor")) {
+ Maybe<uint32_t> maybe_code = ResourceUtils::ParseInt(version_code_major_attr->value);
+ if (!maybe_code) {
+ diag->Error(DiagMessage(xml_res->file.source.WithLine(manifest_el->line_number))
+ << "invalid android:versionCodeMajor '"
+ << version_code_major_attr->value << "'");
+ return {};
+ }
+ app_info.version_code_major = maybe_code.value();
+ }
+
if (xml::Attribute* revision_code_attr =
manifest_el->FindAttribute(xml::kSchemaAndroid, "revisionCode")) {
Maybe<uint32_t> maybe_code = ResourceUtils::ParseInt(revision_code_attr->value);
@@ -1702,6 +1661,7 @@ class LinkCommand {
TableMergerOptions table_merger_options;
table_merger_options.auto_add_overlay = options_.auto_add_overlay;
+ table_merger_options.strict_visibility = options_.strict_visibility;
table_merger_ = util::make_unique<TableMerger>(context_, &final_table_, table_merger_options);
if (context_->IsVerbose()) {
@@ -2025,182 +1985,12 @@ class LinkCommand {
Maybe<std::string> included_feature_base_;
};
-int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
- LinkContext context(diagnostics);
- LinkOptions options;
- std::vector<std::string> overlay_arg_list;
- std::vector<std::string> extra_java_packages;
- Maybe<std::string> package_id;
- std::vector<std::string> configs;
- Maybe<std::string> preferred_density;
- Maybe<std::string> product_list;
- bool legacy_x_flag = false;
- bool require_localization = false;
- bool verbose = false;
- bool shared_lib = false;
- bool static_lib = false;
- bool proto_format = false;
- Maybe<std::string> stable_id_file_path;
- std::vector<std::string> split_args;
- Flags flags =
- Flags()
- .RequiredFlag("-o", "Output path.", &options.output_path)
- .RequiredFlag("--manifest", "Path to the Android manifest to build.",
- &options.manifest_path)
- .OptionalFlagList("-I", "Adds an Android APK to link against.", &options.include_paths)
- .OptionalFlagList("-A",
- "An assets directory to include in the APK. These are unprocessed.",
- &options.assets_dirs)
- .OptionalFlagList("-R",
- "Compilation unit to link, using `overlay` semantics.\n"
- "The last conflicting resource given takes precedence.",
- &overlay_arg_list)
- .OptionalFlag("--package-id",
- "Specify the package ID to use for this app. Must be greater or equal to\n"
- "0x7f and can't be used with --static-lib or --shared-lib.",
- &package_id)
- .OptionalFlag("--java", "Directory in which to generate R.java.",
- &options.generate_java_class_path)
- .OptionalFlag("--proguard", "Output file for generated Proguard rules.",
- &options.generate_proguard_rules_path)
- .OptionalFlag("--proguard-main-dex",
- "Output file for generated Proguard rules for the main dex.",
- &options.generate_main_dex_proguard_rules_path)
- .OptionalSwitch("--proguard-conditional-keep-rules",
- "Generate conditional Proguard keep rules.",
- &options.generate_conditional_proguard_rules)
- .OptionalSwitch("--no-auto-version",
- "Disables automatic style and layout SDK versioning.",
- &options.no_auto_version)
- .OptionalSwitch("--no-version-vectors",
- "Disables automatic versioning of vector drawables. Use this only\n"
- "when building with vector drawable support library.",
- &options.no_version_vectors)
- .OptionalSwitch("--no-version-transitions",
- "Disables automatic versioning of transition resources. Use this only\n"
- "when building with transition support library.",
- &options.no_version_transitions)
- .OptionalSwitch("--no-resource-deduping",
- "Disables automatic deduping of resources with\n"
- "identical values across compatible configurations.",
- &options.no_resource_deduping)
- .OptionalSwitch("--enable-sparse-encoding",
- "Enables encoding sparse entries using a binary search tree.\n"
- "This decreases APK size at the cost of resource retrieval performance.",
- &options.table_flattener_options.use_sparse_entries)
- .OptionalSwitch("-x", "Legacy flag that specifies to use the package identifier 0x01.",
- &legacy_x_flag)
- .OptionalSwitch("-z", "Require localization of strings marked 'suggested'.",
- &require_localization)
- .OptionalFlagList("-c",
- "Comma separated list of configurations to include. The default\n"
- "is all configurations.",
- &configs)
- .OptionalFlag("--preferred-density",
- "Selects the closest matching density and strips out all others.",
- &preferred_density)
- .OptionalFlag("--product", "Comma separated list of product names to keep", &product_list)
- .OptionalSwitch("--output-to-dir",
- "Outputs the APK contents to a directory specified by -o.",
- &options.output_to_directory)
- .OptionalSwitch("--no-xml-namespaces",
- "Removes XML namespace prefix and URI information from\n"
- "AndroidManifest.xml and XML binaries in res/*.",
- &options.no_xml_namespaces)
- .OptionalFlag("--min-sdk-version",
- "Default minimum SDK version to use for AndroidManifest.xml.",
- &options.manifest_fixer_options.min_sdk_version_default)
- .OptionalFlag("--target-sdk-version",
- "Default target SDK version to use for AndroidManifest.xml.",
- &options.manifest_fixer_options.target_sdk_version_default)
- .OptionalFlag("--version-code",
- "Version code (integer) to inject into the AndroidManifest.xml if none is\n"
- "present.",
- &options.manifest_fixer_options.version_code_default)
- .OptionalFlag("--version-name",
- "Version name to inject into the AndroidManifest.xml if none is present.",
- &options.manifest_fixer_options.version_name_default)
- .OptionalFlag("--compile-sdk-version-code",
- "Version code (integer) to inject into the AndroidManifest.xml if none is\n"
- "present.",
- &options.manifest_fixer_options.compile_sdk_version)
- .OptionalFlag("--compile-sdk-version-name",
- "Version name to inject into the AndroidManifest.xml if none is present.",
- &options.manifest_fixer_options.compile_sdk_version_codename)
- .OptionalSwitch("--shared-lib", "Generates a shared Android runtime library.",
- &shared_lib)
- .OptionalSwitch("--static-lib", "Generate a static Android library.", &static_lib)
- .OptionalSwitch("--proto-format",
- "Generates compiled resources in Protobuf format.\n"
- "Suitable as input to the bundle tool for generating an App Bundle.",
- &proto_format)
- .OptionalSwitch("--no-static-lib-packages",
- "Merge all library resources under the app's package.",
- &options.no_static_lib_packages)
- .OptionalSwitch("--non-final-ids",
- "Generates R.java without the final modifier. This is implied when\n"
- "--static-lib is specified.",
- &options.generate_non_final_ids)
- .OptionalFlag("--stable-ids", "File containing a list of name to ID mapping.",
- &stable_id_file_path)
- .OptionalFlag("--emit-ids",
- "Emit a file at the given path with a list of name to ID mappings,\n"
- "suitable for use with --stable-ids.",
- &options.resource_id_map_path)
- .OptionalFlag("--private-symbols",
- "Package name to use when generating R.java for private symbols.\n"
- "If not specified, public and private symbols will use the application's\n"
- "package name.",
- &options.private_symbols)
- .OptionalFlag("--custom-package", "Custom Java package under which to generate R.java.",
- &options.custom_java_package)
- .OptionalFlagList("--extra-packages",
- "Generate the same R.java but with different package names.",
- &extra_java_packages)
- .OptionalFlagList("--add-javadoc-annotation",
- "Adds a JavaDoc annotation to all generated Java classes.",
- &options.javadoc_annotations)
- .OptionalFlag("--output-text-symbols",
- "Generates a text file containing the resource symbols of the R class in\n"
- "the specified folder.",
- &options.generate_text_symbols_path)
- .OptionalSwitch("--allow-reserved-package-id",
- "Allows the use of a reserved package ID. This should on be used for\n"
- "packages with a pre-O min-sdk\n",
- &options.allow_reserved_package_id)
- .OptionalSwitch("--auto-add-overlay",
- "Allows the addition of new resources in overlays without\n"
- "<add-resource> tags.",
- &options.auto_add_overlay)
- .OptionalFlag("--rename-manifest-package", "Renames the package in AndroidManifest.xml.",
- &options.manifest_fixer_options.rename_manifest_package)
- .OptionalFlag("--rename-instrumentation-target-package",
- "Changes the name of the target package for instrumentation. Most useful\n"
- "when used in conjunction with --rename-manifest-package.",
- &options.manifest_fixer_options.rename_instrumentation_target_package)
- .OptionalFlagList("-0", "File extensions not to compress.",
- &options.extensions_to_not_compress)
- .OptionalSwitch("--warn-manifest-validation",
- "Treat manifest validation errors as warnings.",
- &options.manifest_fixer_options.warn_validation)
- .OptionalFlagList("--split",
- "Split resources matching a set of configs out to a Split APK.\n"
- "Syntax: path/to/output.apk:<config>[,<config>[...]].\n"
- "On Windows, use a semicolon ';' separator instead.",
- &split_args)
- .OptionalSwitch("-v", "Enables verbose logging.", &verbose)
- .OptionalSwitch("--debug-mode",
- "Inserts android:debuggable=\"true\" in to the application node of the\n"
- "manifest, making the application debuggable even on production devices.",
- &options.manifest_fixer_options.debug_mode);
-
- if (!flags.Parse("aapt2 link", args, &std::cerr)) {
- return 1;
- }
+int LinkCommand::Action(const std::vector<std::string>& args) {
+ LinkContext context(diag_);
// Expand all argument-files passed into the command line. These start with '@'.
std::vector<std::string> arg_list;
- for (const std::string& arg : flags.GetArgs()) {
+ for (const std::string& arg : args) {
if (util::StartsWith(arg, "@")) {
const std::string path = arg.substr(1, arg.size() - 1);
std::string error;
@@ -2214,27 +2004,27 @@ int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
}
// Expand all argument-files passed to -R.
- for (const std::string& arg : overlay_arg_list) {
+ for (const std::string& arg : overlay_arg_list_) {
if (util::StartsWith(arg, "@")) {
const std::string path = arg.substr(1, arg.size() - 1);
std::string error;
- if (!file::AppendArgsFromFile(path, &options.overlay_files, &error)) {
+ if (!file::AppendArgsFromFile(path, &options_.overlay_files, &error)) {
context.GetDiagnostics()->Error(DiagMessage(path) << error);
return 1;
}
} else {
- options.overlay_files.push_back(arg);
+ options_.overlay_files.push_back(arg);
}
}
- if (verbose) {
- context.SetVerbose(verbose);
+ if (verbose_) {
+ context.SetVerbose(verbose_);
}
- if (int{shared_lib} + int{static_lib} + int{proto_format} > 1) {
+ if (int{shared_lib_} + int{static_lib_} + int{proto_format_} > 1) {
context.GetDiagnostics()->Error(
DiagMessage()
- << "only one of --shared-lib, --static-lib, or --proto_format can be defined");
+ << "only one of --shared-lib, --static-lib, or --proto_format can be defined");
return 1;
}
@@ -2242,26 +2032,35 @@ int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
context.SetPackageType(PackageType::kApp);
context.SetPackageId(kAppPackageId);
- if (shared_lib) {
+ if (shared_lib_) {
context.SetPackageType(PackageType::kSharedLib);
context.SetPackageId(0x00);
- } else if (static_lib) {
+ } else if (static_lib_) {
context.SetPackageType(PackageType::kStaticLib);
- options.output_format = OutputFormat::kProto;
- } else if (proto_format) {
- options.output_format = OutputFormat::kProto;
+ options_.output_format = OutputFormat::kProto;
+ } else if (proto_format_) {
+ options_.output_format = OutputFormat::kProto;
+ }
+
+ if (options_.auto_namespace_static_lib) {
+ if (!static_lib_) {
+ context.GetDiagnostics()->Error(
+ DiagMessage() << "--auto-namespace-static-lib can only be used with --static-lib");
+ return 1;
+ }
+ context.SetAutoNamespace(true);
}
- if (package_id) {
+ if (package_id_) {
if (context.GetPackageType() != PackageType::kApp) {
context.GetDiagnostics()->Error(
DiagMessage() << "can't specify --package-id when not building a regular app");
return 1;
}
- const Maybe<uint32_t> maybe_package_id_int = ResourceUtils::ParseInt(package_id.value());
+ const Maybe<uint32_t> maybe_package_id_int = ResourceUtils::ParseInt(package_id_.value());
if (!maybe_package_id_int) {
- context.GetDiagnostics()->Error(DiagMessage() << "package ID '" << package_id.value()
+ context.GetDiagnostics()->Error(DiagMessage() << "package ID '" << package_id_.value()
<< "' is not a valid integer");
return 1;
}
@@ -2269,7 +2068,7 @@ int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
const uint32_t package_id_int = maybe_package_id_int.value();
if (package_id_int > std::numeric_limits<uint8_t>::max()
|| package_id_int == kFrameworkPackageId
- || (!options.allow_reserved_package_id && package_id_int < kAppPackageId)) {
+ || (!options_.allow_reserved_package_id && package_id_int < kAppPackageId)) {
context.GetDiagnostics()->Error(
DiagMessage() << StringPrintf(
"invalid package ID 0x%02x. Must be in the range 0x7f-0xff.", package_id_int));
@@ -2279,71 +2078,71 @@ int Link(const std::vector<StringPiece>& args, IDiagnostics* diagnostics) {
}
// Populate the set of extra packages for which to generate R.java.
- for (std::string& extra_package : extra_java_packages) {
+ for (std::string& extra_package : extra_java_packages_) {
// A given package can actually be a colon separated list of packages.
for (StringPiece package : util::Split(extra_package, ':')) {
- options.extra_java_packages.insert(package.to_string());
+ options_.extra_java_packages.insert(package.to_string());
}
}
- if (product_list) {
- for (StringPiece product : util::Tokenize(product_list.value(), ',')) {
+ if (product_list_) {
+ for (StringPiece product : util::Tokenize(product_list_.value(), ',')) {
if (product != "" && product != "default") {
- options.products.insert(product.to_string());
+ options_.products.insert(product.to_string());
}
}
}
std::unique_ptr<IConfigFilter> filter;
- if (!configs.empty()) {
- filter = ParseConfigFilterParameters(configs, context.GetDiagnostics());
+ if (!configs_.empty()) {
+ filter = ParseConfigFilterParameters(configs_, context.GetDiagnostics());
if (filter == nullptr) {
return 1;
}
- options.table_splitter_options.config_filter = filter.get();
+ options_.table_splitter_options.config_filter = filter.get();
}
- if (preferred_density) {
+ if (preferred_density_) {
Maybe<uint16_t> density =
- ParseTargetDensityParameter(preferred_density.value(), context.GetDiagnostics());
+ ParseTargetDensityParameter(preferred_density_.value(), context.GetDiagnostics());
if (!density) {
return 1;
}
- options.table_splitter_options.preferred_densities.push_back(density.value());
+ options_.table_splitter_options.preferred_densities.push_back(density.value());
}
// Parse the split parameters.
- for (const std::string& split_arg : split_args) {
- options.split_paths.push_back({});
- options.split_constraints.push_back({});
- if (!ParseSplitParameter(split_arg, context.GetDiagnostics(), &options.split_paths.back(),
- &options.split_constraints.back())) {
+ for (const std::string& split_arg : split_args_) {
+ options_.split_paths.push_back({});
+ options_.split_constraints.push_back({});
+ if (!ParseSplitParameter(split_arg, context.GetDiagnostics(), &options_.split_paths.back(),
+ &options_.split_constraints.back())) {
return 1;
}
}
- if (context.GetPackageType() != PackageType::kStaticLib && stable_id_file_path) {
- if (!LoadStableIdMap(context.GetDiagnostics(), stable_id_file_path.value(),
- &options.stable_id_map)) {
+ if (context.GetPackageType() != PackageType::kStaticLib && stable_id_file_path_) {
+ if (!LoadStableIdMap(context.GetDiagnostics(), stable_id_file_path_.value(),
+ &options_.stable_id_map)) {
return 1;
}
}
// Populate some default no-compress extensions that are already compressed.
- options.extensions_to_not_compress.insert(
+ options_.extensions_to_not_compress.insert(
{".jpg", ".jpeg", ".png", ".gif", ".wav", ".mp2", ".mp3", ".ogg",
- ".aac", ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet", ".rtttl",
- ".imy", ".xmf", ".mp4", ".m4a", ".m4v", ".3gp", ".3gpp", ".3g2",
- ".3gpp2", ".amr", ".awb", ".wma", ".wmv", ".webm", ".mkv"});
+ ".aac", ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet", ".rtttl",
+ ".imy", ".xmf", ".mp4", ".m4a", ".m4v", ".3gp", ".3gpp", ".3g2",
+ ".3gpp2", ".amr", ".awb", ".wma", ".wmv", ".webm", ".mkv"});
// Turn off auto versioning for static-libs.
if (context.GetPackageType() == PackageType::kStaticLib) {
- options.no_auto_version = true;
- options.no_version_vectors = true;
- options.no_version_transitions = true;
+ options_.no_auto_version = true;
+ options_.no_version_vectors = true;
+ options_.no_version_transitions = true;
}
- LinkCommand cmd(&context, options);
+ Linker cmd(&context, options_);
return cmd.Run(arg_list);
}
diff --git a/tools/aapt2/cmd/Link.h b/tools/aapt2/cmd/Link.h
new file mode 100644
index 000000000000..434475ee1be5
--- /dev/null
+++ b/tools/aapt2/cmd/Link.h
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT2_LINK_H
+#define AAPT2_LINK_H
+
+#include "Command.h"
+#include "Diagnostics.h"
+#include "Resource.h"
+#include "split/TableSplitter.h"
+#include "format/binary/TableFlattener.h"
+#include "link/ManifestFixer.h"
+
+namespace aapt {
+
+enum class OutputFormat {
+ kApk,
+ kProto,
+};
+
+struct LinkOptions {
+ std::string output_path;
+ std::string manifest_path;
+ std::vector<std::string> include_paths;
+ std::vector<std::string> overlay_files;
+ std::vector<std::string> assets_dirs;
+ bool output_to_directory = false;
+ bool auto_add_overlay = false;
+ OutputFormat output_format = OutputFormat::kApk;
+
+ // Java/Proguard options.
+ Maybe<std::string> generate_java_class_path;
+ Maybe<std::string> custom_java_package;
+ std::set<std::string> extra_java_packages;
+ Maybe<std::string> generate_text_symbols_path;
+ Maybe<std::string> generate_proguard_rules_path;
+ Maybe<std::string> generate_main_dex_proguard_rules_path;
+ bool generate_conditional_proguard_rules = false;
+ bool generate_non_final_ids = false;
+ std::vector<std::string> javadoc_annotations;
+ Maybe<std::string> private_symbols;
+
+ // Optimizations/features.
+ bool no_auto_version = false;
+ bool no_version_vectors = false;
+ bool no_version_transitions = false;
+ bool no_resource_deduping = false;
+ bool no_xml_namespaces = false;
+ bool do_not_compress_anything = false;
+ std::unordered_set<std::string> extensions_to_not_compress;
+
+ // Static lib options.
+ bool no_static_lib_packages = false;
+ bool auto_namespace_static_lib = false;
+
+ // AndroidManifest.xml massaging options.
+ ManifestFixerOptions manifest_fixer_options;
+
+ // Products to use/filter on.
+ std::unordered_set<std::string> products;
+
+ // Flattening options.
+ TableFlattenerOptions table_flattener_options;
+
+ // Split APK options.
+ TableSplitterOptions table_splitter_options;
+ std::vector<SplitConstraints> split_constraints;
+ std::vector<std::string> split_paths;
+
+ // Stable ID options.
+ std::unordered_map<ResourceName, ResourceId> stable_id_map;
+ Maybe<std::string> resource_id_map_path;
+
+ // When 'true', allow reserved package IDs to be used for applications. Pre-O, the platform
+ // treats negative resource IDs [those with a package ID of 0x80 or higher] as invalid.
+ // In order to work around this limitation, we allow the use of traditionally reserved
+ // resource IDs [those between 0x02 and 0x7E].
+ bool allow_reserved_package_id = false;
+
+ // Whether we should fail on definitions of a resource with conflicting visibility.
+ bool strict_visibility = false;
+};
+
+class LinkCommand : public Command {
+ public:
+ explicit LinkCommand(IDiagnostics* diag) : Command("link", "l"),
+ diag_(diag) {
+ SetDescription("Links resources into an apk.");
+ AddRequiredFlag("-o", "Output path.", &options_.output_path);
+ AddRequiredFlag("--manifest", "Path to the Android manifest to build.",
+ &options_.manifest_path);
+ AddOptionalFlagList("-I", "Adds an Android APK to link against.", &options_.include_paths);
+ AddOptionalFlagList("-A", "An assets directory to include in the APK. These are unprocessed.",
+ &options_.assets_dirs);
+ AddOptionalFlagList("-R", "Compilation unit to link, using `overlay` semantics.\n"
+ "The last conflicting resource given takes precedence.", &overlay_arg_list_);
+ AddOptionalFlag("--package-id",
+ "Specify the package ID to use for this app. Must be greater or equal to\n"
+ "0x7f and can't be used with --static-lib or --shared-lib.", &package_id_);
+ AddOptionalFlag("--java", "Directory in which to generate R.java.",
+ &options_.generate_java_class_path);
+ AddOptionalFlag("--proguard", "Output file for generated Proguard rules.",
+ &options_.generate_proguard_rules_path);
+ AddOptionalFlag("--proguard-main-dex",
+ "Output file for generated Proguard rules for the main dex.",
+ &options_.generate_main_dex_proguard_rules_path);
+ AddOptionalSwitch("--proguard-conditional-keep-rules",
+ "Generate conditional Proguard keep rules.",
+ &options_.generate_conditional_proguard_rules);
+ AddOptionalSwitch("--no-auto-version", "Disables automatic style and layout SDK versioning.",
+ &options_.no_auto_version);
+ AddOptionalSwitch("--no-version-vectors",
+ "Disables automatic versioning of vector drawables. Use this only\n"
+ "when building with vector drawable support library.",
+ &options_.no_version_vectors);
+ AddOptionalSwitch("--no-version-transitions",
+ "Disables automatic versioning of transition resources. Use this only\n"
+ "when building with transition support library.",
+ &options_.no_version_transitions);
+ AddOptionalSwitch("--no-resource-deduping", "Disables automatic deduping of resources with\n"
+ "identical values across compatible configurations.",
+ &options_.no_resource_deduping);
+ AddOptionalSwitch("--enable-sparse-encoding",
+ "This decreases APK size at the cost of resource retrieval performance.",
+ &options_.table_flattener_options.use_sparse_entries);
+ AddOptionalSwitch("-x", "Legacy flag that specifies to use the package identifier 0x01.",
+ &legacy_x_flag_);
+ AddOptionalSwitch("-z", "Require localization of strings marked 'suggested'.",
+ &require_localization_);
+ AddOptionalFlagList("-c",
+ "Comma separated list of configurations to include. The default\n"
+ "is all configurations.", &configs_);
+ AddOptionalFlag("--preferred-density",
+ "Selects the closest matching density and strips out all others.",
+ &preferred_density_);
+ AddOptionalFlag("--product", "Comma separated list of product names to keep", &product_list_);
+ AddOptionalSwitch("--output-to-dir", "Outputs the APK contents to a directory specified by -o.",
+ &options_.output_to_directory);
+ AddOptionalSwitch("--no-xml-namespaces", "Removes XML namespace prefix and URI information\n"
+ "from AndroidManifest.xml and XML binaries in res/*.",
+ &options_.no_xml_namespaces);
+ AddOptionalFlag("--min-sdk-version",
+ "Default minimum SDK version to use for AndroidManifest.xml.",
+ &options_.manifest_fixer_options.min_sdk_version_default);
+ AddOptionalFlag("--target-sdk-version",
+ "Default target SDK version to use for AndroidManifest.xml.",
+ &options_.manifest_fixer_options.target_sdk_version_default);
+ AddOptionalFlag("--version-code",
+ "Version code (integer) to inject into the AndroidManifest.xml if none is\n"
+ "present.",
+ &options_.manifest_fixer_options.version_code_default);
+ AddOptionalFlag("--version-name",
+ "Version name to inject into the AndroidManifest.xml if none is present.",
+ &options_.manifest_fixer_options.version_name_default);
+ AddOptionalSwitch("--replace-version",
+ "If --version-code and/or --version-name are specified, these\n"
+ "values will replace any value already in the manifest. By\n"
+ "default, nothing is changed if the manifest already defines\n"
+ "these attributes.",
+ &options_.manifest_fixer_options.replace_version);
+ AddOptionalFlag("--compile-sdk-version-code",
+ "Version code (integer) to inject into the AndroidManifest.xml if none is\n"
+ "present.",
+ &options_.manifest_fixer_options.compile_sdk_version);
+ AddOptionalFlag("--compile-sdk-version-name",
+ "Version name to inject into the AndroidManifest.xml if none is present.",
+ &options_.manifest_fixer_options.compile_sdk_version_codename);
+ AddOptionalSwitch("--shared-lib", "Generates a shared Android runtime library.",
+ &shared_lib_);
+ AddOptionalSwitch("--static-lib", "Generate a static Android library.", &static_lib_);
+ AddOptionalSwitch("--proto-format",
+ "Generates compiled resources in Protobuf format.\n"
+ "Suitable as input to the bundle tool for generating an App Bundle.",
+ &proto_format_);
+ AddOptionalSwitch("--no-static-lib-packages",
+ "Merge all library resources under the app's package.",
+ &options_.no_static_lib_packages);
+ AddOptionalSwitch("--auto-namespace-static-lib",
+ "Automatically namespace resource references when building a static\n"
+ "library.",
+ &options_.auto_namespace_static_lib);
+ AddOptionalSwitch("--non-final-ids",
+ "Generates R.java without the final modifier. This is implied when\n"
+ "--static-lib is specified.",
+ &options_.generate_non_final_ids);
+ AddOptionalFlag("--stable-ids", "File containing a list of name to ID mapping.",
+ &stable_id_file_path_);
+ AddOptionalFlag("--emit-ids",
+ "Emit a file at the given path with a list of name to ID mappings,\n"
+ "suitable for use with --stable-ids.",
+ &options_.resource_id_map_path);
+ AddOptionalFlag("--private-symbols",
+ "Package name to use when generating R.java for private symbols.\n"
+ "If not specified, public and private symbols will use the application's\n"
+ "package name.",
+ &options_.private_symbols);
+ AddOptionalFlag("--custom-package", "Custom Java package under which to generate R.java.",
+ &options_.custom_java_package);
+ AddOptionalFlagList("--extra-packages",
+ "Generate the same R.java but with different package names.",
+ &extra_java_packages_);
+ AddOptionalFlagList("--add-javadoc-annotation",
+ "Adds a JavaDoc annotation to all generated Java classes.",
+ &options_.javadoc_annotations);
+ AddOptionalFlag("--output-text-symbols",
+ "Generates a text file containing the resource symbols of the R class in\n"
+ "the specified folder.",
+ &options_.generate_text_symbols_path);
+ AddOptionalSwitch("--allow-reserved-package-id",
+ "Allows the use of a reserved package ID. This should on be used for\n"
+ "packages with a pre-O min-sdk\n",
+ &options_.allow_reserved_package_id);
+ AddOptionalSwitch("--auto-add-overlay",
+ "Allows the addition of new resources in overlays without\n"
+ "<add-resource> tags.",
+ &options_.auto_add_overlay);
+ AddOptionalFlag("--rename-manifest-package", "Renames the package in AndroidManifest.xml.",
+ &options_.manifest_fixer_options.rename_manifest_package);
+ AddOptionalFlag("--rename-instrumentation-target-package",
+ "Changes the name of the target package for instrumentation. Most useful\n"
+ "when used in conjunction with --rename-manifest-package.",
+ &options_.manifest_fixer_options.rename_instrumentation_target_package);
+ AddOptionalFlagList("-0", "File extensions not to compress.",
+ &options_.extensions_to_not_compress);
+ AddOptionalSwitch("--no-compress", "Do not compress any resources.",
+ &options_.do_not_compress_anything);
+ AddOptionalSwitch("--warn-manifest-validation",
+ "Treat manifest validation errors as warnings.",
+ &options_.manifest_fixer_options.warn_validation);
+ AddOptionalFlagList("--split",
+ "Split resources matching a set of configs out to a Split APK.\n"
+ "Syntax: path/to/output.apk:<config>[,<config>[...]].\n"
+ "On Windows, use a semicolon ';' separator instead.",
+ &split_args_);
+ AddOptionalSwitch("-v", "Enables verbose logging.", &verbose_);
+ AddOptionalSwitch("--debug-mode",
+ "Inserts android:debuggable=\"true\" in to the application node of the\n"
+ "manifest, making the application debuggable even on production devices.",
+ &options_.manifest_fixer_options.debug_mode);
+ AddOptionalSwitch("--strict-visibility",
+ "Do not allow overlays with different visibility levels.",
+ &options_.strict_visibility);
+ }
+
+ int Action(const std::vector<std::string>& args) override;
+
+ private:
+ IDiagnostics* diag_;
+ LinkOptions options_;
+
+ std::vector<std::string> overlay_arg_list_;
+ std::vector<std::string> extra_java_packages_;
+ Maybe<std::string> package_id_;
+ std::vector<std::string> configs_;
+ Maybe<std::string> preferred_density_;
+ Maybe<std::string> product_list_;
+ bool legacy_x_flag_ = false;
+ bool require_localization_ = false;
+ bool verbose_ = false;
+ bool shared_lib_ = false;
+ bool static_lib_ = false;
+ bool proto_format_ = false;
+ Maybe<std::string> stable_id_file_path_;
+ std::vector<std::string> split_args_;
+};
+
+}// namespace aapt
+
+#endif //AAPT2_LINK_H \ No newline at end of file
diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp
index 9c76119f9504..b4cba8c2801c 100644
--- a/tools/aapt2/cmd/Optimize.cpp
+++ b/tools/aapt2/cmd/Optimize.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#include "Optimize.h"
+
#include <memory>
#include <vector>
@@ -24,7 +26,6 @@
#include "androidfw/StringPiece.h"
#include "Diagnostics.h"
-#include "Flags.h"
#include "LoadedApk.h"
#include "ResourceUtils.h"
#include "SdkConstants.h"
@@ -38,6 +39,7 @@
#include "io/Util.h"
#include "optimize/MultiApkGenerator.h"
#include "optimize/ResourceDeduper.h"
+#include "optimize/ResourceFilter.h"
#include "optimize/VersionCollapser.h"
#include "split/TableSplitter.h"
#include "util/Files.h"
@@ -53,33 +55,6 @@ using ::android::base::StringPrintf;
namespace aapt {
-struct OptimizeOptions {
- // Path to the output APK.
- Maybe<std::string> output_path;
- // Path to the output APK directory for splits.
- Maybe<std::string> output_dir;
-
- // Details of the app extracted from the AndroidManifest.xml
- AppInfo app_info;
-
- // Split APK options.
- TableSplitterOptions table_splitter_options;
-
- // List of output split paths. These are in the same order as `split_constraints`.
- std::vector<std::string> split_paths;
-
- // List of SplitConstraints governing what resources go into each split. Ordered by `split_paths`.
- std::vector<SplitConstraints> split_constraints;
-
- TableFlattenerOptions table_flattener_options;
-
- Maybe<std::vector<OutputArtifact>> apk_artifacts;
-
- // Set of artifacts to keep when generating multi-APK splits. If the list is empty, all artifacts
- // are kept and will be written as output.
- std::unordered_set<std::string> kept_artifacts;
-};
-
class OptimizeContext : public IAaptContext {
public:
OptimizeContext() = default;
@@ -129,6 +104,10 @@ class OptimizeContext : public IAaptContext {
return sdk_version_;
}
+ bool IsAutoNamespace() override {
+ return false;
+ }
+
private:
DISALLOW_COPY_AND_ASSIGN(OptimizeContext);
@@ -137,9 +116,9 @@ class OptimizeContext : public IAaptContext {
int sdk_version_ = 0;
};
-class OptimizeCommand {
+class Optimizer {
public:
- OptimizeCommand(OptimizeContext* context, const OptimizeOptions& options)
+ Optimizer(OptimizeContext* context, const OptimizeOptions& options)
: options_(options), context_(context) {
}
@@ -147,6 +126,13 @@ class OptimizeCommand {
if (context_->IsVerbose()) {
context_->GetDiagnostics()->Note(DiagMessage() << "Optimizing APK...");
}
+ if (!options_.resources_blacklist.empty()) {
+ ResourceFilter filter(options_.resources_blacklist);
+ if (!filter.Consume(context_, apk->GetResourceTable())) {
+ context_->GetDiagnostics()->Error(DiagMessage() << "failed filtering resources");
+ return 1;
+ }
+ }
VersionCollapser collapser;
if (!collapser.Consume(context_, apk->GetResourceTable())) {
@@ -284,16 +270,62 @@ class OptimizeCommand {
OptimizeContext* context_;
};
-bool ExtractWhitelistFromConfig(const std::string& path, OptimizeContext* context,
- OptimizeOptions* options) {
+bool ExtractObfuscationWhitelistFromConfig(const std::string& path, OptimizeContext* context,
+ OptimizeOptions* options) {
std::string contents;
if (!ReadFileToString(path, &contents, true)) {
context->GetDiagnostics()->Error(DiagMessage()
<< "failed to parse whitelist from config file: " << path);
return false;
}
- for (const StringPiece& resource_name : util::Tokenize(contents, ',')) {
- options->table_flattener_options.whitelisted_resources.insert(resource_name.to_string());
+ for (StringPiece resource_name : util::Tokenize(contents, ',')) {
+ options->table_flattener_options.whitelisted_resources.insert(
+ resource_name.to_string());
+ }
+ return true;
+}
+
+bool ExtractConfig(const std::string& path, OptimizeContext* context,
+ OptimizeOptions* options) {
+ std::string content;
+ if (!android::base::ReadFileToString(path, &content, true /*follow_symlinks*/)) {
+ context->GetDiagnostics()->Error(DiagMessage(path) << "failed reading whitelist");
+ return false;
+ }
+
+ size_t line_no = 0;
+ for (StringPiece line : util::Tokenize(content, '\n')) {
+ line_no++;
+ line = util::TrimWhitespace(line);
+ if (line.empty()) {
+ continue;
+ }
+
+ auto split_line = util::Split(line, '#');
+ if (split_line.size() < 2) {
+ context->GetDiagnostics()->Error(DiagMessage(line) << "No # found in line");
+ return false;
+ }
+ StringPiece resource_string = split_line[0];
+ StringPiece directives = split_line[1];
+ ResourceNameRef resource_name;
+ if (!ResourceUtils::ParseResourceName(resource_string, &resource_name)) {
+ context->GetDiagnostics()->Error(DiagMessage(line) << "Malformed resource name");
+ return false;
+ }
+ if (!resource_name.package.empty()) {
+ context->GetDiagnostics()->Error(DiagMessage(line)
+ << "Package set for resource. Only use type/name");
+ return false;
+ }
+ for (StringPiece directive : util::Tokenize(directives, ',')) {
+ if (directive == "remove") {
+ options->resources_blacklist.insert(resource_name.ToResourceName());
+ } else if (directive == "no_obfuscate") {
+ options->table_flattener_options.whitelisted_resources.insert(
+ resource_name.entry.to_string());
+ }
+ }
}
return true;
}
@@ -317,76 +349,24 @@ bool ExtractAppDataFromManifest(OptimizeContext* context, const LoadedApk* apk,
return true;
}
-int Optimize(const std::vector<StringPiece>& args) {
- OptimizeContext context;
- OptimizeOptions options;
- Maybe<std::string> config_path;
- Maybe<std::string> whitelist_path;
- Maybe<std::string> target_densities;
- std::vector<std::string> configs;
- std::vector<std::string> split_args;
- std::unordered_set<std::string> kept_artifacts;
- bool verbose = false;
- bool print_only = false;
- Flags flags =
- Flags()
- .OptionalFlag("-o", "Path to the output APK.", &options.output_path)
- .OptionalFlag("-d", "Path to the output directory (for splits).", &options.output_dir)
- .OptionalFlag("-x", "Path to XML configuration file.", &config_path)
- .OptionalSwitch("-p", "Print the multi APK artifacts and exit.", &print_only)
- .OptionalFlag(
- "--target-densities",
- "Comma separated list of the screen densities that the APK will be optimized for.\n"
- "All the resources that would be unused on devices of the given densities will be \n"
- "removed from the APK.",
- &target_densities)
- .OptionalFlag("--whitelist-config-path",
- "Path to the whitelist.cfg file containing whitelisted resources \n"
- "whose names should not be altered in final resource tables.",
- &whitelist_path)
- .OptionalFlagList("-c",
- "Comma separated list of configurations to include. The default\n"
- "is all configurations.",
- &configs)
- .OptionalFlagList("--split",
- "Split resources matching a set of configs out to a "
- "Split APK.\nSyntax: path/to/output.apk;<config>[,<config>[...]].\n"
- "On Windows, use a semicolon ';' separator instead.",
- &split_args)
- .OptionalFlagList("--keep-artifacts",
- "Comma separated list of artifacts to keep. If none are specified,\n"
- "all artifacts will be kept.",
- &kept_artifacts)
- .OptionalSwitch("--enable-sparse-encoding",
- "Enables encoding sparse entries using a binary search tree.\n"
- "This decreases APK size at the cost of resource retrieval performance.",
- &options.table_flattener_options.use_sparse_entries)
- .OptionalSwitch("--enable-resource-obfuscation",
- "Enables obfuscation of key string pool to single value",
- &options.table_flattener_options.collapse_key_stringpool)
- .OptionalSwitch("-v", "Enables verbose logging", &verbose);
-
- if (!flags.Parse("aapt2 optimize", args, &std::cerr)) {
- return 1;
- }
-
- if (flags.GetArgs().size() != 1u) {
+int OptimizeCommand::Action(const std::vector<std::string>& args) {
+ if (args.size() != 1u) {
std::cerr << "must have one APK as argument.\n\n";
- flags.Usage("aapt2 optimize", &std::cerr);
+ Usage(&std::cerr);
return 1;
}
- const std::string& apk_path = flags.GetArgs()[0];
-
- context.SetVerbose(verbose);
+ const std::string& apk_path = args[0];
+ OptimizeContext context;
+ context.SetVerbose(verbose_);
IDiagnostics* diag = context.GetDiagnostics();
- if (config_path) {
- std::string& path = config_path.value();
+ if (config_path_) {
+ std::string& path = config_path_.value();
Maybe<ConfigurationParser> for_path = ConfigurationParser::ForPath(path);
if (for_path) {
- options.apk_artifacts = for_path.value().WithDiagnostics(diag).Parse(apk_path);
- if (!options.apk_artifacts) {
+ options_.apk_artifacts = for_path.value().WithDiagnostics(diag).Parse(apk_path);
+ if (!options_.apk_artifacts) {
diag->Error(DiagMessage() << "Failed to parse the output artifact list");
return 1;
}
@@ -396,28 +376,28 @@ int Optimize(const std::vector<StringPiece>& args) {
return 1;
}
- if (print_only) {
- for (const OutputArtifact& artifact : options.apk_artifacts.value()) {
+ if (print_only_) {
+ for (const OutputArtifact& artifact : options_.apk_artifacts.value()) {
std::cout << artifact.name << std::endl;
}
return 0;
}
- if (!kept_artifacts.empty()) {
- for (const std::string& artifact_str : kept_artifacts) {
+ if (!kept_artifacts_.empty()) {
+ for (const std::string& artifact_str : kept_artifacts_) {
for (const StringPiece& artifact : util::Tokenize(artifact_str, ',')) {
- options.kept_artifacts.insert(artifact.to_string());
+ options_.kept_artifacts.insert(artifact.to_string());
}
}
}
// Since we know that we are going to process the APK (not just print targets), make sure we
// have somewhere to write them to.
- if (!options.output_dir) {
+ if (!options_.output_dir) {
diag->Error(DiagMessage() << "Output directory is required when using a configuration file");
return 1;
}
- } else if (print_only) {
+ } else if (print_only_) {
diag->Error(DiagMessage() << "Asked to print artifacts without providing a configurations");
return 1;
}
@@ -427,50 +407,57 @@ int Optimize(const std::vector<StringPiece>& args) {
return 1;
}
- if (target_densities) {
+ if (target_densities_) {
// Parse the target screen densities.
- for (const StringPiece& config_str : util::Tokenize(target_densities.value(), ',')) {
+ for (const StringPiece& config_str : util::Tokenize(target_densities_.value(), ',')) {
Maybe<uint16_t> target_density = ParseTargetDensityParameter(config_str, diag);
if (!target_density) {
return 1;
}
- options.table_splitter_options.preferred_densities.push_back(target_density.value());
+ options_.table_splitter_options.preferred_densities.push_back(target_density.value());
}
}
std::unique_ptr<IConfigFilter> filter;
- if (!configs.empty()) {
- filter = ParseConfigFilterParameters(configs, diag);
+ if (!configs_.empty()) {
+ filter = ParseConfigFilterParameters(configs_, diag);
if (filter == nullptr) {
return 1;
}
- options.table_splitter_options.config_filter = filter.get();
+ options_.table_splitter_options.config_filter = filter.get();
}
// Parse the split parameters.
- for (const std::string& split_arg : split_args) {
- options.split_paths.emplace_back();
- options.split_constraints.emplace_back();
- if (!ParseSplitParameter(split_arg, diag, &options.split_paths.back(),
- &options.split_constraints.back())) {
+ for (const std::string& split_arg : split_args_) {
+ options_.split_paths.emplace_back();
+ options_.split_constraints.emplace_back();
+ if (!ParseSplitParameter(split_arg, diag, &options_.split_paths.back(),
+ &options_.split_constraints.back())) {
return 1;
}
}
- if (options.table_flattener_options.collapse_key_stringpool) {
- if (whitelist_path) {
- std::string& path = whitelist_path.value();
- if (!ExtractWhitelistFromConfig(path, &context, &options)) {
+ if (options_.table_flattener_options.collapse_key_stringpool) {
+ if (whitelist_path_) {
+ std::string& path = whitelist_path_.value();
+ if (!ExtractObfuscationWhitelistFromConfig(path, &context, &options_)) {
return 1;
}
}
}
- if (!ExtractAppDataFromManifest(&context, apk.get(), &options)) {
+ if (resources_config_path_) {
+ std::string& path = resources_config_path_.value();
+ if (!ExtractConfig(path, &context, &options_)) {
+ return 1;
+ }
+ }
+
+ if (!ExtractAppDataFromManifest(&context, apk.get(), &options_)) {
return 1;
}
- OptimizeCommand cmd(&context, options);
+ Optimizer cmd(&context, options_);
return cmd.Run(std::move(apk));
}
diff --git a/tools/aapt2/cmd/Optimize.h b/tools/aapt2/cmd/Optimize.h
new file mode 100644
index 000000000000..43bc216382fa
--- /dev/null
+++ b/tools/aapt2/cmd/Optimize.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT2_OPTIMIZE_H
+#define AAPT2_OPTIMIZE_H
+
+#include "AppInfo.h"
+#include "Command.h"
+#include "configuration/ConfigurationParser.h"
+#include "format/binary/TableFlattener.h"
+#include "split/TableSplitter.h"
+
+namespace aapt {
+
+struct OptimizeOptions {
+ friend class OptimizeCommand;
+
+ // Path to the output APK.
+ Maybe<std::string> output_path;
+ // Path to the output APK directory for splits.
+ Maybe<std::string> output_dir;
+
+ // Details of the app extracted from the AndroidManifest.xml
+ AppInfo app_info;
+
+ // Blacklist of unused resources that should be removed from the apk.
+ std::unordered_set<ResourceName> resources_blacklist;
+
+ // Split APK options.
+ TableSplitterOptions table_splitter_options;
+
+ // List of output split paths. These are in the same order as `split_constraints`.
+ std::vector<std::string> split_paths;
+
+ // List of SplitConstraints governing what resources go into each split. Ordered by `split_paths`.
+ std::vector<SplitConstraints> split_constraints;
+
+ TableFlattenerOptions table_flattener_options;
+
+ Maybe<std::vector<aapt::configuration::OutputArtifact>> apk_artifacts;
+
+ // Set of artifacts to keep when generating multi-APK splits. If the list is empty, all artifacts
+ // are kept and will be written as output.
+ std::unordered_set<std::string> kept_artifacts;
+};
+
+class OptimizeCommand : public Command {
+ public:
+ explicit OptimizeCommand() : Command("optimize") {
+ SetDescription("Preforms resource optimizations on an apk.");
+ AddOptionalFlag("-o", "Path to the output APK.", &options_.output_path);
+ AddOptionalFlag("-d", "Path to the output directory (for splits).", &options_.output_dir);
+ AddOptionalFlag("-x", "Path to XML configuration file.", &config_path_);
+ AddOptionalSwitch("-p", "Print the multi APK artifacts and exit.", &print_only_);
+ AddOptionalFlag(
+ "--target-densities",
+ "Comma separated list of the screen densities that the APK will be optimized for.\n"
+ "All the resources that would be unused on devices of the given densities will be \n"
+ "removed from the APK.",
+ &target_densities_);
+ AddOptionalFlag("--whitelist-path",
+ "Path to the whitelist.cfg file containing whitelisted resources \n"
+ "whose names should not be altered in final resource tables.",
+ &whitelist_path_);
+ AddOptionalFlag("--resources-config-path",
+ "Path to the resources.cfg file containing the list of resources and \n"
+ "directives to each resource. \n"
+ "Format: type/resource_name#[directive][,directive]",
+ &resources_config_path_);
+ AddOptionalFlagList("-c",
+ "Comma separated list of configurations to include. The default\n"
+ "is all configurations.",
+ &configs_);
+ AddOptionalFlagList("--split",
+ "Split resources matching a set of configs out to a "
+ "Split APK.\nSyntax: path/to/output.apk;<config>[,<config>[...]].\n"
+ "On Windows, use a semicolon ';' separator instead.",
+ &split_args_);
+ AddOptionalFlagList("--keep-artifacts",
+ "Comma separated list of artifacts to keep. If none are specified,\n"
+ "all artifacts will be kept.",
+ &kept_artifacts_);
+ AddOptionalSwitch("--enable-sparse-encoding",
+ "Enables encoding sparse entries using a binary search tree.\n"
+ "This decreases APK size at the cost of resource retrieval performance.",
+ &options_.table_flattener_options.use_sparse_entries);
+ AddOptionalSwitch("--enable-resource-obfuscation",
+ "Enables obfuscation of key string pool to single value",
+ &options_.table_flattener_options.collapse_key_stringpool);
+ AddOptionalSwitch("-v", "Enables verbose logging", &verbose_);
+ }
+
+ int Action(const std::vector<std::string>& args) override;
+
+ private:
+ OptimizeOptions options_;
+
+ Maybe<std::string> config_path_;
+ Maybe<std::string> whitelist_path_;
+ Maybe<std::string> resources_config_path_;
+ Maybe<std::string> target_densities_;
+ std::vector<std::string> configs_;
+ std::vector<std::string> split_args_;
+ std::unordered_set<std::string> kept_artifacts_;
+ bool print_only_ = false;
+ bool verbose_ = false;
+};
+
+}// namespace aapt
+
+#endif //AAPT2_OPTIMIZE_H \ No newline at end of file
diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp
index 8b3a6701b409..c6c82b04ff2e 100644
--- a/tools/aapt2/cmd/Util.cpp
+++ b/tools/aapt2/cmd/Util.cpp
@@ -29,6 +29,7 @@
#include "util/Util.h"
using ::android::StringPiece;
+using ::android::base::StringPrintf;
namespace aapt {
@@ -145,7 +146,7 @@ static xml::NamespaceDecl CreateAndroidNamespaceDecl() {
//
// See frameworks/base/core/java/android/content/pm/PackageParser.java which
// checks this at runtime.
-static std::string MakePackageSafeName(const std::string &name) {
+std::string MakePackageSafeName(const std::string &name) {
std::string result(name);
bool first = true;
for (char &c : result) {
@@ -168,6 +169,7 @@ static std::string MakePackageSafeName(const std::string &name) {
std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info,
const SplitConstraints& constraints) {
const ResourceId kVersionCode(0x0101021b);
+ const ResourceId kVersionCodeMajor(0x01010576);
const ResourceId kRevisionCode(0x010104d5);
const ResourceId kHasCode(0x0101000c);
@@ -184,6 +186,14 @@ std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info,
util::make_unique<BinaryPrimitive>(android::Res_value::TYPE_INT_DEC, version_code)});
}
+ if (app_info.version_code_major) {
+ const uint32_t version_code_major = app_info.version_code_major.value();
+ manifest_el->attributes.push_back(xml::Attribute{
+ xml::kSchemaAndroid, "versionCodeMajor", std::to_string(version_code_major),
+ CreateAttributeWithId(kVersionCodeMajor),
+ util::make_unique<BinaryPrimitive>(android::Res_value::TYPE_INT_DEC, version_code_major)});
+ }
+
if (app_info.revision_code) {
const uint32_t revision_code = app_info.revision_code.value();
manifest_el->attributes.push_back(xml::Attribute{
@@ -355,6 +365,17 @@ Maybe<AppInfo> ExtractAppInfoFromBinaryManifest(const xml::XmlResource& xml_res,
app_info.version_code = maybe_code.value();
}
+ if (const xml::Attribute* version_code_major_attr =
+ manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor")) {
+ Maybe<uint32_t> maybe_code = ExtractCompiledInt(*version_code_major_attr, &error_msg);
+ if (!maybe_code) {
+ diag->Error(DiagMessage(xml_res.file.source.WithLine(manifest_el->line_number))
+ << "invalid android:versionCodeMajor: " << error_msg);
+ return {};
+ }
+ app_info.version_code_major = maybe_code.value();
+ }
+
if (const xml::Attribute* revision_code_attr =
manifest_el->FindAttribute(xml::kSchemaAndroid, "revisionCode")) {
Maybe<uint32_t> maybe_code = ExtractCompiledInt(*revision_code_attr, &error_msg);
@@ -391,4 +412,21 @@ Maybe<AppInfo> ExtractAppInfoFromBinaryManifest(const xml::XmlResource& xml_res,
return app_info;
}
+void SetLongVersionCode(xml::Element* manifest, uint64_t version) {
+ // Write the low bits of the version code to android:versionCode
+ auto version_code = manifest->FindOrCreateAttribute(xml::kSchemaAndroid, "versionCode");
+ version_code->value = StringPrintf("0x%08x", (uint32_t) (version & 0xffffffff));
+ version_code->compiled_value = ResourceUtils::TryParseInt(version_code->value);
+
+ auto version_high = (uint32_t) (version >> 32);
+ if (version_high != 0) {
+ // Write the high bits of the version code to android:versionCodeMajor
+ auto version_major = manifest->FindOrCreateAttribute(xml::kSchemaAndroid, "versionCodeMajor");
+ version_major->value = StringPrintf("0x%08x", version_high);
+ version_major->compiled_value = ResourceUtils::TryParseInt(version_major->value);
+ } else {
+ manifest->RemoveAttribute(xml::kSchemaAndroid, "versionCodeMajor");
+ }
+}
+
} // namespace aapt
diff --git a/tools/aapt2/cmd/Util.h b/tools/aapt2/cmd/Util.h
index 7611c1526104..cf1443e30e1f 100644
--- a/tools/aapt2/cmd/Util.h
+++ b/tools/aapt2/cmd/Util.h
@@ -60,6 +60,18 @@ std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info,
Maybe<AppInfo> ExtractAppInfoFromBinaryManifest(const xml::XmlResource& xml_res,
IDiagnostics* diag);
+// Returns a copy of 'name' which conforms to the regex '[a-zA-Z]+[a-zA-Z0-9_]*' by
+// replacing nonconforming characters with underscores.
+//
+// See frameworks/base/core/java/android/content/pm/PackageParser.java which
+// checks this at runtime.
+std::string MakePackageSafeName(const std::string &name);
+
+// Sets the versionCode and versionCodeMajor attributes to the version code. Attempts to encode the
+// version code using the versionCode attribute only, and encodes using both versionCode and
+// versionCodeMajor if the version code requires more than 32 bits.
+void SetLongVersionCode(xml::Element* manifest, uint64_t version_code);
+
} // namespace aapt
#endif /* AAPT_SPLIT_UTIL_H */
diff --git a/tools/aapt2/cmd/Util_test.cpp b/tools/aapt2/cmd/Util_test.cpp
index 0c527f6a90dc..b9fb5b2868a7 100644
--- a/tools/aapt2/cmd/Util_test.cpp
+++ b/tools/aapt2/cmd/Util_test.cpp
@@ -18,6 +18,7 @@
#include "AppInfo.h"
#include "split/TableSplitter.h"
+#include "test/Builders.h"
#include "test/Test.h"
namespace aapt {
@@ -36,4 +37,51 @@ TEST(UtilTest, SplitNamesAreSanitized) {
EXPECT_EQ(root->FindAttribute("", "targetConfig")->value, "b+sr+Latn,en-rUS-land");
}
+TEST (UtilTest, LongVersionCodeDefined) {
+ auto doc = test::BuildXmlDom(R"(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.aapt.test" android:versionCode="0x1" android:versionCodeMajor="0x1">
+ </manifest>)");
+ SetLongVersionCode(doc->root.get(), 42);
+
+ auto version_code = doc->root->FindAttribute(xml::kSchemaAndroid, "versionCode");
+ ASSERT_NE(version_code, nullptr);
+ EXPECT_EQ(version_code->value, "0x0000002a");
+
+ ASSERT_NE(version_code->compiled_value, nullptr);
+ auto compiled_version_code = ValueCast<BinaryPrimitive>(version_code->compiled_value.get());
+ ASSERT_NE(compiled_version_code, nullptr);
+ EXPECT_EQ(compiled_version_code->value.data, 42U);
+
+ auto version_code_major = doc->root->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor");
+ EXPECT_EQ(version_code_major, nullptr);
+}
+
+TEST (UtilTest, LongVersionCodeUndefined) {
+ auto doc = test::BuildXmlDom(R"(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.aapt.test">
+ </manifest>)");
+ SetLongVersionCode(doc->root.get(), 420000000000);
+
+ auto version_code = doc->root->FindAttribute(xml::kSchemaAndroid, "versionCode");
+ ASSERT_NE(version_code, nullptr);
+ EXPECT_EQ(version_code->value, "0xc9f36800");
+
+ ASSERT_NE(version_code->compiled_value, nullptr);
+ auto compiled_version_code = ValueCast<BinaryPrimitive>(version_code->compiled_value.get());
+ ASSERT_NE(compiled_version_code, nullptr);
+ EXPECT_EQ(compiled_version_code->value.data, 0xc9f36800);
+
+ auto version_code_major = doc->root->FindAttribute(xml::kSchemaAndroid, "versionCodeMajor");
+ ASSERT_NE(version_code_major, nullptr);
+ EXPECT_EQ(version_code_major->value, "0x00000061");
+
+ ASSERT_NE(version_code_major->compiled_value, nullptr);
+ auto compiled_version_code_major = ValueCast<BinaryPrimitive>(
+ version_code_major->compiled_value.get());
+ ASSERT_NE(compiled_version_code_major, nullptr);
+ EXPECT_EQ(compiled_version_code_major->value.data, 0x61);
+}
+
} // namespace aapt
diff --git a/native/webview/Android.mk b/tools/aapt2/integration-tests/AutoNamespaceTest/Android.mk
index a2a93d7d664d..5d7a6f7bedab 100644
--- a/native/webview/Android.mk
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/Android.mk
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2017 The Android Open Source Project
+# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -14,6 +14,5 @@
# limitations under the License.
#
-# Include all the makefiles for subdirectories.
-include $(call all-subdir-makefiles)
-
+LOCAL_PATH := $(call my-dir)
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/Android.mk b/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/Android.mk
new file mode 100644
index 000000000000..91716b9870ea
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/Android.mk
@@ -0,0 +1,29 @@
+#
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := AaptTestAutoNamespace_LibOne
+LOCAL_MODULE_TAGS := tests
+LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_AAPT_NAMESPACES := true
+LOCAL_AAPT_FLAGS := --auto-namespace-static-lib
+# We need this to compile the Java sources of AaptTestStaticLib_LibTwo using javac.
+LOCAL_JAR_EXCLUDE_FILES := none
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/nfc-extras/com.android.nfc_extras.xml b/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/AndroidManifest.xml
index 370145dc62c5..f585840cdb12 100644
--- a/nfc-extras/com.android.nfc_extras.xml
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
+<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,7 +14,4 @@
limitations under the License.
-->
-<permissions>
- <library name="com.android.nfc_extras"
- file="/system/framework/com.android.nfc_extras.jar" />
-</permissions>
+<manifest package="com.example.android.aapt2.autonamespace.staticlib.one" />
diff --git a/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/res/values/values.xml b/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/res/values/values.xml
new file mode 100644
index 000000000000..3e57b0f20739
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/res/values/values.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <!-- An attribute from StaticLibOne -->
+ <attr name="StaticLibOne_attr" format="string" />
+
+ <string name="Foo">Foo</string>
+
+ <declare-styleable name="Widget">
+ <attr name="StaticLibOne_attr" />
+ <attr name="android:text" />
+ </declare-styleable>
+</resources>
diff --git a/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/src/com/example/android/aapt2/autonamespace/staticlib/one/StaticLibOne.java b/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/src/com/example/android/aapt2/autonamespace/staticlib/one/StaticLibOne.java
new file mode 100644
index 000000000000..886d48c7597c
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibOne/src/com/example/android/aapt2/autonamespace/staticlib/one/StaticLibOne.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.aapt2.autonamespace.staticlib.one;
+
+public class StaticLibOne { public static int FooId = R.string.Foo; }
diff --git a/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/Android.mk b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/Android.mk
new file mode 100644
index 000000000000..c85496d38fda
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/Android.mk
@@ -0,0 +1,29 @@
+#
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := AaptTestAutoNamespace_LibTwo
+LOCAL_MODULE_TAGS := tests
+LOCAL_SRC_FILES := $(call all-java-files-under,src)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_SHARED_ANDROID_LIBRARIES := AaptTestAutoNamespace_LibOne
+LOCAL_AAPT_NAMESPACES := true
+LOCAL_AAPT_FLAGS := --auto-namespace-static-lib
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
diff --git a/media/lib/signer/com.android.mediadrm.signer.xml b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/AndroidManifest.xml
index fd3a1158095d..8d3c506c5ac3 100644
--- a/media/lib/signer/com.android.mediadrm.signer.xml
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
+<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,7 +14,4 @@
limitations under the License.
-->
-<permissions>
- <library name="com.android.mediadrm.signer"
- file="/system/framework/com.android.mediadrm.signer.jar" />
-</permissions>
+<manifest package="com.example.android.aapt2.autonamespace.staticlib.two" />
diff --git a/location/lib/com.android.location.provider.xml b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/res/layout/layout_two.xml
index 000e68ffc865..fb202201a03a 100644
--- a/location/lib/com.android.location.provider.xml
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/res/layout/layout_two.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
+<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -14,7 +14,5 @@
limitations under the License.
-->
-<permissions>
- <library name="com.android.location.provider"
- file="/system/framework/com.android.location.provider.jar" />
-</permissions>
+<View xmlns:custom="http://schemas.android.com/apk/res-auto"
+ custom:StaticLibOne_attr="@string/FooBar" />
diff --git a/media/lib/tvremote/com.android.media.tv.remoteprovider.xml b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/res/values/values.xml
index dcf479ac78b3..c532387ee961 100644
--- a/media/lib/tvremote/com.android.media.tv.remoteprovider.xml
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/res/values/values.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
+<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,7 +14,6 @@
limitations under the License.
-->
-<permissions>
- <library name="com.android.media.tv.remoteprovider"
- file="/system/framework/com.android.media.tv.remoteprovider.jar" />
-</permissions> \ No newline at end of file
+<resources>
+ <string name="FooBar">@string/Foo</string>
+</resources>
diff --git a/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/src/com/example/android/aapt2/autonamespace/staticlib/two/StaticLibTwo.java b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/src/com/example/android/aapt2/autonamespace/staticlib/two/StaticLibTwo.java
new file mode 100644
index 000000000000..323f53ae907b
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoNamespaceTest/LibTwo/src/com/example/android/aapt2/autonamespace/staticlib/two/StaticLibTwo.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.aapt2.autonamespace.staticlib.two;
+
+public class StaticLibTwo {
+ // IDs from StaticLibOne
+ public static int FooId = com.example.android.aapt2.autonamespace.staticlib.one.R.string.Foo;
+
+ // IDs from StaticLibTwo
+ public static int FooBarId = R.string.FooBar;
+ public static int LayoutId = R.layout.layout_two;
+}
diff --git a/tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk b/tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk
index 021185f8448b..c723d905db5b 100644
--- a/tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk
+++ b/tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk
@@ -23,6 +23,7 @@ LOCAL_MODULE := AaptTestNamespace_LibOne
LOCAL_SDK_VERSION := current
LOCAL_MODULE_TAGS := tests
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_MIN_SDK_VERSION := 21
# We need this to retain the R.java generated for this library.
LOCAL_JAR_EXCLUDE_FILES := none
diff --git a/tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk b/tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk
index 39bd481a0714..90a7f627e591 100644
--- a/tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk
+++ b/tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk
@@ -24,6 +24,7 @@ LOCAL_SDK_VERSION := current
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := $(call all-java-files-under,src)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_MIN_SDK_VERSION := 21
# We need this to retain the R.java generated for this library.
LOCAL_JAR_EXCLUDE_FILES := none
diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp
index 6b07b1e96261..db1561e17f16 100644
--- a/tools/aapt2/java/JavaClassGenerator.cpp
+++ b/tools/aapt2/java/JavaClassGenerator.cpp
@@ -347,7 +347,9 @@ void JavaClassGenerator::ProcessStyleable(const ResourceNameRef& name, const Res
}
// Add the Styleable array to the Styleable class.
- out_class_def->AddMember(std::move(array_def));
+ if (out_class_def != nullptr) {
+ out_class_def->AddMember(std::move(array_def));
+ }
// Now we emit the indices into the array.
for (size_t i = 0; i < attr_count; i++) {
@@ -578,7 +580,6 @@ bool JavaClassGenerator::Generate(const StringPiece& package_name_to_generate,
if (out_r_txt != nullptr) {
r_txt_printer = util::make_unique<Printer>(out_r_txt);
}
-
// Generate an onResourcesLoaded() callback if requested.
if (out != nullptr && options_.rewrite_callback_options) {
rewrite_method =
diff --git a/tools/aapt2/java/JavaClassGenerator_test.cpp b/tools/aapt2/java/JavaClassGenerator_test.cpp
index e449546f9399..10a97d84f59d 100644
--- a/tools/aapt2/java/JavaClassGenerator_test.cpp
+++ b/tools/aapt2/java/JavaClassGenerator_test.cpp
@@ -438,4 +438,22 @@ TEST(JavaClassGeneratorTest, GenerateOnResourcesLoadedCallbackForSharedLibrary)
EXPECT_THAT(output, HasSubstr("com.boo.R.onResourcesLoaded"));
}
+TEST(JavaClassGeneratorTest, OnlyGenerateRText) {
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId("android", 0x01)
+ .AddValue("android:attr/foo", ResourceId(0x01010000), util::make_unique<Attribute>())
+ .AddValue("android:styleable/hey.dude", ResourceId(0x01020000),
+ test::StyleableBuilder()
+ .AddItem("android:attr/foo", ResourceId(0x01010000))
+ .Build())
+ .Build();
+
+ std::unique_ptr<IAaptContext> context =
+ test::ContextBuilder().SetPackageId(0x01).SetCompilationPackage("android").Build();
+ JavaClassGenerator generator(context.get(), table.get(), {});
+
+ ASSERT_TRUE(generator.Generate("android", nullptr));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp
index ffcef8966654..d03cdb3d8518 100644
--- a/tools/aapt2/java/ProguardRules.cpp
+++ b/tools/aapt2/java/ProguardRules.cpp
@@ -79,8 +79,10 @@ class BaseVisitor : public xml::Visitor {
keep_set_->AddConditionalClass({file_.name, file_.source.WithLine(line_number)}, class_name);
}
- void AddMethod(size_t line_number, const std::string& method_name) {
- keep_set_->AddMethod({file_.name, file_.source.WithLine(line_number)}, method_name);
+ void AddMethod(size_t line_number, const std::string& method_name,
+ const std::string& method_signature) {
+ keep_set_->AddMethod({file_.name, file_.source.WithLine(line_number)},
+ {method_name, method_signature});
}
void AddReference(size_t line_number, Reference* ref) {
@@ -125,7 +127,7 @@ class LayoutVisitor : public BaseVisitor {
AddClass(node->line_number, attr.value);
} else if (attr.namespace_uri == xml::kSchemaAndroid &&
attr.name == "onClick") {
- AddMethod(node->line_number, attr.value);
+ AddMethod(node->line_number, attr.value, "android.view.View");
}
}
@@ -149,7 +151,7 @@ class MenuVisitor : public BaseVisitor {
util::IsJavaClassName(attr.value)) {
AddClass(node->line_number, attr.value);
} else if (attr.name == "onClick") {
- AddMethod(node->line_number, attr.value);
+ AddMethod(node->line_number, attr.value, "android.view.MenuItem");
}
}
}
@@ -189,6 +191,29 @@ class XmlResourceVisitor : public BaseVisitor {
DISALLOW_COPY_AND_ASSIGN(XmlResourceVisitor);
};
+class NavigationVisitor : public BaseVisitor {
+ public:
+ NavigationVisitor(const ResourceFile& file, KeepSet* keep_set, const std::string& package)
+ : BaseVisitor(file, keep_set), package_(package) {
+ }
+
+ void Visit(xml::Element* node) override {
+ const auto& attr = node->FindAttribute(xml::kSchemaAndroid, "name");
+ if (attr != nullptr && !attr->value.empty()) {
+ std::string name = (attr->value[0] == '.') ? package_ + attr->value : attr->value;
+ if (util::IsJavaClassName(name)) {
+ AddClass(node->line_number, name);
+ }
+ }
+
+ BaseVisitor::Visit(node);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(NavigationVisitor);
+ const std::string package_;
+};
+
class TransitionVisitor : public BaseVisitor {
public:
TransitionVisitor(const ResourceFile& file, KeepSet* keep_set) : BaseVisitor(file, keep_set) {
@@ -291,7 +316,7 @@ bool CollectProguardRulesForManifest(xml::XmlResource* res, KeepSet* keep_set, b
return false;
}
-bool CollectProguardRules(xml::XmlResource* res, KeepSet* keep_set) {
+bool CollectProguardRules(IAaptContext* context_, xml::XmlResource* res, KeepSet* keep_set) {
if (!res->root) {
return false;
}
@@ -309,6 +334,12 @@ bool CollectProguardRules(xml::XmlResource* res, KeepSet* keep_set) {
break;
}
+ case ResourceType::kNavigation: {
+ NavigationVisitor visitor(res->file, keep_set, context_->GetCompilationPackage());
+ res->root->Accept(&visitor);
+ break;
+ }
+
case ResourceType::kTransition: {
TransitionVisitor visitor(res->file, keep_set);
res->root->Accept(&visitor);
@@ -336,7 +367,7 @@ void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) {
for (const UsageLocation& location : entry.second) {
printer.Print("# Referenced at ").Println(location.source.to_string());
}
- printer.Print("-keep class ").Print(entry.first).Println(" { <init>(...); }");
+ printer.Print("-keep class ").Print(entry.first).Println(" { <init>(); }");
}
for (const auto& entry : keep_set.conditional_class_set_) {
@@ -367,7 +398,8 @@ void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) {
for (const UsageLocation& location : entry.second) {
printer.Print("# Referenced at ").Println(location.source.to_string());
}
- printer.Print("-keepclassmembers class * { *** ").Print(entry.first).Println("(...); }");
+ printer.Print("-keepclassmembers class * { *** ").Print(entry.first.name)
+ .Print("(").Print(entry.first.signature).Println("); }");
printer.Println();
}
}
diff --git a/tools/aapt2/java/ProguardRules.h b/tools/aapt2/java/ProguardRules.h
index 46827ee7cf93..acaceac41237 100644
--- a/tools/aapt2/java/ProguardRules.h
+++ b/tools/aapt2/java/ProguardRules.h
@@ -40,6 +40,11 @@ struct UsageLocation {
Source source;
};
+struct NameAndSignature {
+ std::string name;
+ std::string signature;
+};
+
class KeepSet {
public:
KeepSet() = default;
@@ -55,8 +60,8 @@ class KeepSet {
conditional_class_set_[class_name].insert(file);
}
- inline void AddMethod(const UsageLocation& file, const std::string& method_name) {
- method_set_[method_name].insert(file);
+ inline void AddMethod(const UsageLocation& file, const NameAndSignature& name_and_signature) {
+ method_set_[name_and_signature].insert(file);
}
inline void AddReference(const UsageLocation& file, const ResourceName& resource_name) {
@@ -71,7 +76,7 @@ class KeepSet {
bool conditional_keep_rules_ = false;
std::map<std::string, std::set<UsageLocation>> manifest_class_set_;
- std::map<std::string, std::set<UsageLocation>> method_set_;
+ std::map<NameAndSignature, std::set<UsageLocation>> method_set_;
std::map<std::string, std::set<UsageLocation>> conditional_class_set_;
std::map<ResourceName, std::set<UsageLocation>> reference_set_;
};
@@ -79,7 +84,7 @@ class KeepSet {
bool CollectProguardRulesForManifest(xml::XmlResource* res, KeepSet* keep_set,
bool main_dex_only = false);
-bool CollectProguardRules(xml::XmlResource* res, KeepSet* keep_set);
+bool CollectProguardRules(IAaptContext* context, xml::XmlResource* res, KeepSet* keep_set);
bool CollectResourceReferences(IAaptContext* context, ResourceTable* table, KeepSet* keep_set);
@@ -100,6 +105,20 @@ inline int operator<(const UsageLocation& lhs, const UsageLocation& rhs) {
return lhs.name.compare(rhs.name);
}
+//
+// NameAndSignature implementation.
+//
+
+inline bool operator<(const NameAndSignature& lhs, const NameAndSignature& rhs) {
+ if (lhs.name < rhs.name) {
+ return true;
+ }
+ if (lhs.name == rhs.name) {
+ return lhs.signature < rhs.signature;
+ }
+ return false;
+}
+
} // namespace proguard
} // namespace aapt
diff --git a/tools/aapt2/java/ProguardRules_test.cpp b/tools/aapt2/java/ProguardRules_test.cpp
index 37d1a5fbaeb8..b5e27e0cb952 100644
--- a/tools/aapt2/java/ProguardRules_test.cpp
+++ b/tools/aapt2/java/ProguardRules_test.cpp
@@ -34,6 +34,31 @@ std::string GetKeepSetString(const proguard::KeepSet& set) {
return out;
}
+TEST(ProguardRulesTest, ManifestRuleDefaultConstructorOnly) {
+ std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
+ <application android:backupAgent="com.foo.BarBackupAgent">
+ <activity android:name="com.foo.BarActivity"/>
+ <service android:name="com.foo.BarService"/>
+ <receiver android:name="com.foo.BarReceiver"/>
+ <provider android:name="com.foo.BarProvider"/>
+ </application>
+ <instrumentation android:name="com.foo.BarInstrumentation"/>
+ </manifest>)");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRulesForManifest(manifest.get(), &set, false));
+
+ std::string actual = GetKeepSetString(set);
+
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarBackupAgent { <init>(); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarActivity { <init>(); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarService { <init>(); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarReceiver { <init>(); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarProvider { <init>(); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarInstrumentation { <init>(); }"));
+}
+
TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) {
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"(
@@ -42,11 +67,11 @@ TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) {
layout->file.name = test::ParseNameOrDie("layout/foo");
proguard::KeepSet set;
- ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set));
std::string actual = GetKeepSetString(set);
- EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }"));
}
TEST(ProguardRulesTest, FragmentClassRuleIsEmitted) {
@@ -56,11 +81,11 @@ TEST(ProguardRulesTest, FragmentClassRuleIsEmitted) {
layout->file.name = test::ParseNameOrDie("layout/foo");
proguard::KeepSet set;
- ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set));
std::string actual = GetKeepSetString(set);
- EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }"));
}
TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) {
@@ -72,12 +97,40 @@ TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) {
layout->file.name = test::ParseNameOrDie("layout/foo");
proguard::KeepSet set;
- ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set));
std::string actual = GetKeepSetString(set);
- EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
- EXPECT_THAT(actual, HasSubstr("com.foo.Baz"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(...); }"));
+}
+
+TEST(ProguardRulesTest, NavigationFragmentNameAndClassRulesAreEmitted) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder()
+ .SetCompilationPackage("com.base").Build();
+ std::unique_ptr<xml::XmlResource> navigation = test::BuildXmlDom(R"(
+ <navigation
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <custom android:id="@id/foo"
+ android:name="com.package.Foo"/>
+ <fragment android:id="@id/bar"
+ android:name="com.package.Bar">
+ <nested android:id="@id/nested"
+ android:name=".Nested"/>
+ </fragment>
+ </navigation>
+ )");
+
+ navigation->file.name = test::ParseNameOrDie("navigation/graph.xml");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), navigation.get(), &set));
+
+ std::string actual = GetKeepSetString(set);
+ EXPECT_THAT(actual, HasSubstr("-keep class com.package.Foo { <init>(...); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.package.Bar { <init>(...); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.base.Nested { <init>(...); }"));
}
TEST(ProguardRulesTest, CustomViewRulesAreEmitted) {
@@ -89,11 +142,11 @@ TEST(ProguardRulesTest, CustomViewRulesAreEmitted) {
layout->file.name = test::ParseNameOrDie("layout/foo");
proguard::KeepSet set;
- ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set));
std::string actual = GetKeepSetString(set);
- EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }"));
}
TEST(ProguardRulesTest, IncludedLayoutRulesAreConditional) {
@@ -125,8 +178,8 @@ TEST(ProguardRulesTest, IncludedLayoutRulesAreConditional) {
ASSERT_TRUE(xml_linker.Consume(context.get(), foo_layout.get()));
proguard::KeepSet set = proguard::KeepSet(true);
- ASSERT_TRUE(proguard::CollectProguardRules(bar_layout.get(), &set));
- ASSERT_TRUE(proguard::CollectProguardRules(foo_layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), bar_layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), foo_layout.get(), &set));
std::string actual = GetKeepSetString(set);
@@ -134,7 +187,6 @@ TEST(ProguardRulesTest, IncludedLayoutRulesAreConditional) {
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }"));
EXPECT_THAT(actual, HasSubstr("int foo"));
EXPECT_THAT(actual, HasSubstr("int bar"));
- EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
}
TEST(ProguardRulesTest, AliasedLayoutRulesAreConditional) {
@@ -147,7 +199,7 @@ TEST(ProguardRulesTest, AliasedLayoutRulesAreConditional) {
proguard::KeepSet set = proguard::KeepSet(true);
set.AddReference({test::ParseNameOrDie("layout/bar"), {}}, layout->file.name);
- ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set));
std::string actual = GetKeepSetString(set);
@@ -155,7 +207,6 @@ TEST(ProguardRulesTest, AliasedLayoutRulesAreConditional) {
EXPECT_THAT(actual, HasSubstr("-if class **.R$layout"));
EXPECT_THAT(actual, HasSubstr("int foo"));
EXPECT_THAT(actual, HasSubstr("int bar"));
- EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
}
TEST(ProguardRulesTest, NonLayoutReferencesAreUnconditional) {
@@ -168,7 +219,7 @@ TEST(ProguardRulesTest, NonLayoutReferencesAreUnconditional) {
proguard::KeepSet set = proguard::KeepSet(true);
set.AddReference({test::ParseNameOrDie("style/MyStyle"), {}}, layout->file.name);
- ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set));
std::string actual = GetKeepSetString(set);
@@ -184,11 +235,12 @@ TEST(ProguardRulesTest, ViewOnClickRuleIsEmitted) {
layout->file.name = test::ParseNameOrDie("layout/foo");
proguard::KeepSet set;
- ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), layout.get(), &set));
std::string actual = GetKeepSetString(set);
- EXPECT_THAT(actual, HasSubstr("bar_method"));
+ EXPECT_THAT(actual, HasSubstr(
+ "-keepclassmembers class * { *** bar_method(android.view.View); }"));
}
TEST(ProguardRulesTest, MenuRulesAreEmitted) {
@@ -203,14 +255,47 @@ TEST(ProguardRulesTest, MenuRulesAreEmitted) {
menu->file.name = test::ParseNameOrDie("menu/foo");
proguard::KeepSet set;
- ASSERT_TRUE(proguard::CollectProguardRules(menu.get(), &set));
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), menu.get(), &set));
std::string actual = GetKeepSetString(set);
- EXPECT_THAT(actual, HasSubstr("on_click"));
- EXPECT_THAT(actual, HasSubstr("com.foo.Bar"));
- EXPECT_THAT(actual, HasSubstr("com.foo.Baz"));
+ EXPECT_THAT(actual, HasSubstr(
+ "-keepclassmembers class * { *** on_click(android.view.MenuItem); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Baz { <init>(...); }"));
EXPECT_THAT(actual, Not(HasSubstr("com.foo.Bat")));
}
+TEST(ProguardRulesTest, TransitionPathMotionRulesAreEmitted) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> transition = test::BuildXmlDom(R"(
+ <changeBounds>
+ <pathMotion class="com.foo.Bar"/>
+ </changeBounds>)");
+ transition->file.name = test::ParseNameOrDie("transition/foo");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transition.get(), &set));
+
+ std::string actual = GetKeepSetString(set);
+
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }"));
+}
+
+TEST(ProguardRulesTest, TransitionRulesAreEmitted) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> transitionSet = test::BuildXmlDom(R"(
+ <transitionSet>
+ <transition class="com.foo.Bar"/>
+ </transitionSet>)");
+ transitionSet->file.name = test::ParseNameOrDie("transition/foo");
+
+ proguard::KeepSet set;
+ ASSERT_TRUE(proguard::CollectProguardRules(context.get(), transitionSet.get(), &set));
+
+ std::string actual = GetKeepSetString(set);
+
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.Bar { <init>(...); }"));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/jni/aapt2_jni.cpp b/tools/aapt2/jni/aapt2_jni.cpp
index ad5ad4c336e5..ba9646f9aeb4 100644
--- a/tools/aapt2/jni/aapt2_jni.cpp
+++ b/tools/aapt2/jni/aapt2_jni.cpp
@@ -25,15 +25,12 @@
#include "ScopedUtfChars.h"
#include "Diagnostics.h"
+#include "cmd/Compile.h"
+#include "cmd/Link.h"
#include "util/Util.h"
using android::StringPiece;
-namespace aapt {
-extern int Compile(const std::vector<StringPiece>& args, IDiagnostics* iDiagnostics);
-extern int Link(const std::vector<StringPiece>& args, IDiagnostics* iDiagnostics);
-}
-
/*
* Converts a java List<String> into C++ vector<ScopedUtfChars>.
*/
@@ -126,7 +123,7 @@ JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeCompile(
list_to_utfchars(env, arguments_obj);
std::vector<StringPiece> compile_args = extract_pieces(compile_args_jni);
JniDiagnostics diagnostics(env, diagnostics_obj);
- return aapt::Compile(compile_args, &diagnostics);
+ return aapt::CompileCommand(&diagnostics).Execute(compile_args, &std::cerr);
}
JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink(JNIEnv* env,
@@ -137,7 +134,7 @@ JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink(JNIEnv*
list_to_utfchars(env, arguments_obj);
std::vector<StringPiece> link_args = extract_pieces(link_args_jni);
JniDiagnostics diagnostics(env, diagnostics_obj);
- return aapt::Link(link_args, &diagnostics);
+ return aapt::LinkCommand(&diagnostics).Execute(link_args, &std::cerr);
}
JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_ping(
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index bfff1487d4be..ee4e70288994 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -261,6 +261,9 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor,
manifest_action.Action(FixCoreAppAttribute);
manifest_action.Action([&](xml::Element* el) -> bool {
if (options_.version_name_default) {
+ if (options_.replace_version) {
+ el->RemoveAttribute(xml::kSchemaAndroid, "versionName");
+ }
if (el->FindAttribute(xml::kSchemaAndroid, "versionName") == nullptr) {
el->attributes.push_back(
xml::Attribute{xml::kSchemaAndroid, "versionName",
@@ -269,6 +272,9 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor,
}
if (options_.version_code_default) {
+ if (options_.replace_version) {
+ el->RemoveAttribute(xml::kSchemaAndroid, "versionCode");
+ }
if (el->FindAttribute(xml::kSchemaAndroid, "versionCode") == nullptr) {
el->attributes.push_back(
xml::Attribute{xml::kSchemaAndroid, "versionCode",
diff --git a/tools/aapt2/link/ManifestFixer.h b/tools/aapt2/link/ManifestFixer.h
index 7d6fad2f0918..98d06fd776d7 100644
--- a/tools/aapt2/link/ManifestFixer.h
+++ b/tools/aapt2/link/ManifestFixer.h
@@ -44,10 +44,12 @@ struct ManifestFixerOptions {
// <instrumentation>.
Maybe<std::string> rename_instrumentation_target_package;
- // The version name to set if 'android:versionName' is not defined in <manifest>.
+ // The version name to set if 'android:versionName' is not defined in <manifest> or if
+ // replace_version is set.
Maybe<std::string> version_name_default;
- // The version code to set if 'android:versionCode' is not defined in <manifest>.
+ // The version code to set if 'android:versionCode' is not defined in <manifest> or if
+ // replace_version is set.
Maybe<std::string> version_code_default;
// The version of the framework being compiled against to set for 'android:compileSdkVersion' in
@@ -65,6 +67,9 @@ struct ManifestFixerOptions {
// Whether to inject the android:debuggable="true" flag into the manifest
bool debug_mode = false;
+
+ // Whether to replace the manifest version with the the command line version
+ bool replace_version = false;
};
// Verifies that the manifest is correctly formed and inserts defaults where specified with
diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp
index 5f406e81f65d..5bc004d62ff2 100644
--- a/tools/aapt2/link/ManifestFixer_test.cpp
+++ b/tools/aapt2/link/ManifestFixer_test.cpp
@@ -349,6 +349,136 @@ TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
EXPECT_THAT(attr->value, StrEq("0x10000000"));
}
+TEST_F(ManifestFixerTest, DontUseDefaultVersionNameAndCode) {
+ManifestFixerOptions options;
+options.version_name_default = std::string("Beta");
+options.version_code_default = std::string("0x10000000");
+
+std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android"
+ android:versionCode="0x20000000"
+ android:versionName="Alpha" />)EOF",
+ options);
+ASSERT_THAT(doc, NotNull());
+
+xml::Element* manifest_el = doc->root.get();
+ASSERT_THAT(manifest_el, NotNull());
+
+xml::Attribute* attr =
+ manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("Alpha"));
+
+attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("0x20000000"));
+}
+
+TEST_F(ManifestFixerTest, ReplaceVersionNameAndCode) {
+ManifestFixerOptions options;
+options.replace_version = true;
+options.version_name_default = std::string("Beta");
+options.version_code_default = std::string("0x10000000");
+
+std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android"
+ android:versionCode="0x20000000"
+ android:versionName="Alpha" />)EOF",
+ options);
+ASSERT_THAT(doc, NotNull());
+
+xml::Element* manifest_el = doc->root.get();
+ASSERT_THAT(manifest_el, NotNull());
+
+xml::Attribute* attr =
+ manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("Beta"));
+
+attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("0x10000000"));
+}
+
+TEST_F(ManifestFixerTest, ReplaceVersionName) {
+ManifestFixerOptions options;
+options.replace_version = true;
+options.version_name_default = std::string("Beta");
+
+std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android"
+ android:versionCode="0x20000000"
+ android:versionName="Alpha" />)EOF",
+ options);
+ASSERT_THAT(doc, NotNull());
+
+xml::Element* manifest_el = doc->root.get();
+ASSERT_THAT(manifest_el, NotNull());
+
+xml::Attribute* attr =
+ manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("Beta"));
+
+attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("0x20000000"));
+}
+
+TEST_F(ManifestFixerTest, ReplaceVersionCode) {
+ManifestFixerOptions options;
+options.replace_version = true;
+options.version_code_default = std::string("0x10000000");
+
+std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android"
+ android:versionCode="0x20000000"
+ android:versionName="Alpha" />)EOF",
+ options);
+ASSERT_THAT(doc, NotNull());
+
+xml::Element* manifest_el = doc->root.get();
+ASSERT_THAT(manifest_el, NotNull());
+
+xml::Attribute* attr =
+ manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("Alpha"));
+
+attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("0x10000000"));
+}
+
+TEST_F(ManifestFixerTest, DontReplaceVersionNameOrCode) {
+ManifestFixerOptions options;
+options.replace_version = true;
+
+std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android"
+ android:versionCode="0x20000000"
+ android:versionName="Alpha" />)EOF",
+ options);
+ASSERT_THAT(doc, NotNull());
+
+xml::Element* manifest_el = doc->root.get();
+ASSERT_THAT(manifest_el, NotNull());
+
+xml::Attribute* attr =
+ manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("Alpha"));
+
+attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
+ASSERT_THAT(attr, NotNull());
+EXPECT_THAT(attr->value, StrEq("0x20000000"));
+}
+
TEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
EXPECT_THAT(Verify("<manifest package=\"android\" coreApp=\"hello\" />"), IsNull());
EXPECT_THAT(Verify("<manifest package=\"android\" coreApp=\"1dp\" />"), IsNull());
diff --git a/tools/aapt2/link/NoDefaultResourceRemover.cpp b/tools/aapt2/link/NoDefaultResourceRemover.cpp
index cfb4b26aba02..5173b8541943 100644
--- a/tools/aapt2/link/NoDefaultResourceRemover.cpp
+++ b/tools/aapt2/link/NoDefaultResourceRemover.cpp
@@ -22,17 +22,7 @@
namespace aapt {
-static bool IsDefaultConfigRequired(const ConfigDescription& config) {
- // We don't want to be overzealous with resource removal, so have strict requirements.
- // If a resource defines a value for a locale-only configuration, the default configuration is
- // required.
- if (ConfigDescription::DefaultConfig().diff(config) == ConfigDescription::CONFIG_LOCALE) {
- return true;
- }
- return false;
-}
-
-static bool KeepResource(const std::unique_ptr<ResourceEntry>& entry) {
+static bool KeepResource(const std::unique_ptr<ResourceEntry>& entry, int minSdk) {
if (entry->visibility.level == Visibility::Level::kPublic) {
// Removing a public API without the developer knowing is bad, so just leave this here for now.
return true;
@@ -44,22 +34,44 @@ static bool KeepResource(const std::unique_ptr<ResourceEntry>& entry) {
}
// There is no default value defined, check if removal is required.
+ bool defaultRequired = false;
for (const auto& config_value : entry->values) {
- if (IsDefaultConfigRequired(config_value->config)) {
- return false;
+ const int config = ConfigDescription::DefaultConfig().diff(config_value->config);
+ // If a resource defines a value for a locale-only configuration, the default configuration is
+ // required.
+ if (config == ConfigDescription::CONFIG_LOCALE) {
+ defaultRequired = true;
+ }
+ // If a resource defines a version-only config, the config value can be used as a default if
+ // the version is at most the minimum sdk version
+ else if (config == ConfigDescription::CONFIG_VERSION
+ && config_value->config.sdkVersion <= minSdk) {
+ return true;
+ }
+ // If a resource defines a value for a density only configuration, then that value could be used
+ // as a default and the entry should not be removed
+ else if (config == ConfigDescription::CONFIG_DENSITY
+ || (config == (ConfigDescription::CONFIG_DENSITY | ConfigDescription::CONFIG_VERSION)
+ && config_value->config.sdkVersion <= minSdk)) {
+ return true;
}
}
- return true;
+
+ return !defaultRequired;
}
bool NoDefaultResourceRemover::Consume(IAaptContext* context, ResourceTable* table) {
- const ConfigDescription default_config = ConfigDescription::DefaultConfig();
for (auto& pkg : table->packages) {
for (auto& type : pkg->types) {
+ // Gather the entries without defaults that must be removed
+ const int minSdk = context->GetMinSdkVersion();
const auto end_iter = type->entries.end();
- const auto new_end_iter =
- std::stable_partition(type->entries.begin(), end_iter, KeepResource);
- for (auto iter = new_end_iter; iter != end_iter; ++iter) {
+ const auto remove_iter = std::stable_partition(type->entries.begin(), end_iter,
+ [&minSdk](const std::unique_ptr<ResourceEntry>& entry) -> bool {
+ return KeepResource(entry, minSdk);
+ });
+
+ for (auto iter = remove_iter; iter != end_iter; ++iter) {
const ResourceName name(pkg->name, type->type, (*iter)->name);
IDiagnostics* diag = context->GetDiagnostics();
diag->Warn(DiagMessage() << "removing resource " << name
@@ -74,7 +86,7 @@ bool NoDefaultResourceRemover::Consume(IAaptContext* context, ResourceTable* tab
}
}
- type->entries.erase(new_end_iter, type->entries.end());
+ type->entries.erase(remove_iter, end_iter);
}
}
return true;
diff --git a/tools/aapt2/link/NoDefaultResourceRemover_test.cpp b/tools/aapt2/link/NoDefaultResourceRemover_test.cpp
index 943709a2af12..d129c9ac8db7 100644
--- a/tools/aapt2/link/NoDefaultResourceRemover_test.cpp
+++ b/tools/aapt2/link/NoDefaultResourceRemover_test.cpp
@@ -46,4 +46,64 @@ TEST(NoDefaultResourceRemoverTest, RemoveEntryWithNoDefaultAndOnlyLocales) {
EXPECT_TRUE(table->FindResource(test::ParseNameOrDie("android:string/baz")));
}
+TEST(NoDefaultResourceRemoverTest, KeepEntryWithLocalesAndDensities) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().SetMinSdkVersion(26).Build();
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId("android", 0x01)
+ .AddSimple("android:drawable/keep1", test::ParseConfigOrDie("mdpi")) // v4
+ .AddSimple("android:drawable/keep1", test::ParseConfigOrDie("en-rGB"))
+ .AddSimple("android:drawable/keep1", test::ParseConfigOrDie("fr-rFR"))
+ .AddSimple("android:drawable/keep2", test::ParseConfigOrDie("fr-rFR"))
+ .AddSimple("android:drawable/keep2", test::ParseConfigOrDie("en-rGB"))
+ .AddSimple("android:drawable/keep2", test::ParseConfigOrDie("xxxhdpi")) // v4
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("fr-rFR"))
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("en-rGB"))
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("w600dp-xhdpi")) // v13
+ .Build();
+
+ NoDefaultResourceRemover remover;
+ ASSERT_TRUE(remover.Consume(context.get(), table.get()));
+
+ EXPECT_TRUE(table->FindResource(test::ParseNameOrDie("android:drawable/keep1")));
+ EXPECT_TRUE(table->FindResource(test::ParseNameOrDie("android:drawable/keep2")));
+ EXPECT_FALSE(table->FindResource(test::ParseNameOrDie("android:drawable/remove1")));
+}
+
+TEST(NoDefaultResourceRemoverTest, RemoveEntryWithLocalesAndDensitiesLowVersion) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().SetMinSdkVersion(3).Build();
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId("android", 0x01)
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("mdpi")) // v4
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("en-rGB"))
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("fr-rFR"))
+ .Build();
+
+ NoDefaultResourceRemover remover;
+ ASSERT_TRUE(remover.Consume(context.get(), table.get()));
+
+ EXPECT_FALSE(table->FindResource(test::ParseNameOrDie("android:drawable/remove1")));
+}
+
+TEST(NoDefaultResourceRemoverTest, KeepEntryWithVersion) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().SetMinSdkVersion(8).Build();
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .SetPackageId("android", 0x01)
+ .AddSimple("android:drawable/keep1", test::ParseConfigOrDie("v8"))
+ .AddSimple("android:drawable/keep1", test::ParseConfigOrDie("en-rGB"))
+ .AddSimple("android:drawable/keep1", test::ParseConfigOrDie("fr-rFR"))
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("v9"))
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("en-rGB"))
+ .AddSimple("android:drawable/remove1", test::ParseConfigOrDie("fr-rFR"))
+ .Build();
+
+ NoDefaultResourceRemover remover;
+ ASSERT_TRUE(remover.Consume(context.get(), table.get()));
+
+ EXPECT_TRUE(table->FindResource(test::ParseNameOrDie("android:drawable/keep1")));
+ EXPECT_FALSE(table->FindResource(test::ParseNameOrDie("android:drawable/remove1")));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index 3a5d5858254d..28e71cc24f79 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -80,7 +80,7 @@ class ReferenceLinkerVisitor : public DescendingValueVisitor {
// Find the attribute in the symbol table and check if it is visible from this callsite.
const SymbolTable::Symbol* symbol = ReferenceLinker::ResolveAttributeCheckVisibility(
- transformed_reference, callsite_, symbols_, &err_str);
+ transformed_reference, callsite_, symbols_, context_->IsAutoNamespace(), &err_str);
if (symbol) {
// Assign our style key the correct ID. The ID may not exist.
entry.key.id = symbol->id;
@@ -202,12 +202,18 @@ bool IsSymbolVisible(const SymbolTable::Symbol& symbol, const Reference& ref,
const SymbolTable::Symbol* ReferenceLinker::ResolveSymbol(const Reference& reference,
const CallSite& callsite,
- SymbolTable* symbols) {
+ SymbolTable* symbols,
+ bool auto_namespace) {
if (reference.name) {
const ResourceName& name = reference.name.value();
if (name.package.empty()) {
// Use the callsite's package name if no package name was defined.
- return symbols->FindByName(ResourceName(callsite.package, name.type, name.entry));
+ const SymbolTable::Symbol* local_symbol =
+ symbols->FindByName(ResourceName(callsite.package, name.type, name.entry));
+ if (!auto_namespace || local_symbol) {
+ return local_symbol;
+ }
+ return symbols->FindByNameInAnyPackage(name);
}
return symbols->FindByName(name);
} else if (reference.id) {
@@ -220,8 +226,9 @@ const SymbolTable::Symbol* ReferenceLinker::ResolveSymbol(const Reference& refer
const SymbolTable::Symbol* ReferenceLinker::ResolveSymbolCheckVisibility(const Reference& reference,
const CallSite& callsite,
SymbolTable* symbols,
+ bool auto_namespace,
std::string* out_error) {
- const SymbolTable::Symbol* symbol = ResolveSymbol(reference, callsite, symbols);
+ const SymbolTable::Symbol* symbol = ResolveSymbol(reference, callsite, symbols, auto_namespace);
if (!symbol) {
if (out_error) *out_error = "not found";
return nullptr;
@@ -235,10 +242,10 @@ const SymbolTable::Symbol* ReferenceLinker::ResolveSymbolCheckVisibility(const R
}
const SymbolTable::Symbol* ReferenceLinker::ResolveAttributeCheckVisibility(
- const Reference& reference, const CallSite& callsite, SymbolTable* symbols,
+ const Reference& reference, const CallSite& callsite, SymbolTable* symbols, bool auto_namespace,
std::string* out_error) {
const SymbolTable::Symbol* symbol =
- ResolveSymbolCheckVisibility(reference, callsite, symbols, out_error);
+ ResolveSymbolCheckVisibility(reference, callsite, symbols, auto_namespace, out_error);
if (!symbol) {
return nullptr;
}
@@ -253,9 +260,10 @@ const SymbolTable::Symbol* ReferenceLinker::ResolveAttributeCheckVisibility(
Maybe<xml::AaptAttribute> ReferenceLinker::CompileXmlAttribute(const Reference& reference,
const CallSite& callsite,
SymbolTable* symbols,
+ bool auto_namespace,
std::string* out_error) {
const SymbolTable::Symbol* symbol =
- ResolveAttributeCheckVisibility(reference, callsite, symbols, out_error);
+ ResolveAttributeCheckVisibility(reference, callsite, symbols, auto_namespace, out_error);
if (!symbol) {
return {};
}
@@ -333,8 +341,8 @@ bool ReferenceLinker::LinkReference(const CallSite& callsite, Reference* referen
xml::ResolvePackage(decls, &transformed_reference);
std::string err_str;
- const SymbolTable::Symbol* s =
- ResolveSymbolCheckVisibility(transformed_reference, callsite, symbols, &err_str);
+ const SymbolTable::Symbol* s = ResolveSymbolCheckVisibility(
+ transformed_reference, callsite, symbols, context->IsAutoNamespace(), &err_str);
if (s) {
// The ID may not exist. This is fine because of the possibility of building
// against libraries without assigned IDs.
diff --git a/tools/aapt2/link/ReferenceLinker.h b/tools/aapt2/link/ReferenceLinker.h
index b0b49457e5dd..7887915a7bb1 100644
--- a/tools/aapt2/link/ReferenceLinker.h
+++ b/tools/aapt2/link/ReferenceLinker.h
@@ -36,10 +36,12 @@ class ReferenceLinker : public IResourceTableConsumer {
ReferenceLinker() = default;
// Performs name mangling and looks up the resource in the symbol table. Uses the callsite's
- // package if the reference has no package name defined (implicit).
+ // package if the reference has no package name defined (implicit), or if auto_namespace is
+ // set try looking in all avaliable packages for a symbol of that name.
// Returns nullptr if the symbol was not found.
static const SymbolTable::Symbol* ResolveSymbol(const Reference& reference,
- const CallSite& callsite, SymbolTable* symbols);
+ const CallSite& callsite, SymbolTable* symbols,
+ bool auto_namespace);
// Performs name mangling and looks up the resource in the symbol table. If the symbol is not
// visible by the reference at the callsite, nullptr is returned.
@@ -47,6 +49,7 @@ class ReferenceLinker : public IResourceTableConsumer {
static const SymbolTable::Symbol* ResolveSymbolCheckVisibility(const Reference& reference,
const CallSite& callsite,
SymbolTable* symbols,
+ bool auto_namespace,
std::string* out_error);
// Same as ResolveSymbolCheckVisibility(), but also makes sure the symbol is an attribute.
@@ -54,13 +57,14 @@ class ReferenceLinker : public IResourceTableConsumer {
static const SymbolTable::Symbol* ResolveAttributeCheckVisibility(const Reference& reference,
const CallSite& callsite,
SymbolTable* symbols,
+ bool auto_namespace,
std::string* out_error);
// Resolves the attribute reference and returns an xml::AaptAttribute if successful.
// If resolution fails, outError holds the error message.
static Maybe<xml::AaptAttribute> CompileXmlAttribute(const Reference& reference,
const CallSite& callsite,
- SymbolTable* symbols,
+ SymbolTable* symbols, bool auto_namespace,
std::string* out_error);
// Writes the resource name to the DiagMessage, using the
diff --git a/tools/aapt2/link/ReferenceLinker_test.cpp b/tools/aapt2/link/ReferenceLinker_test.cpp
index be38b967c986..0b7b1ce03a52 100644
--- a/tools/aapt2/link/ReferenceLinker_test.cpp
+++ b/tools/aapt2/link/ReferenceLinker_test.cpp
@@ -267,7 +267,7 @@ TEST(ReferenceLinkerTest, AppsWithSamePackageButDifferentIdAreVisibleNonPublic)
std::string error;
const CallSite call_site{"com.app.test"};
const SymbolTable::Symbol* symbol = ReferenceLinker::ResolveSymbolCheckVisibility(
- *test::BuildReference("com.app.test:string/foo"), call_site, &table, &error);
+ *test::BuildReference("com.app.test:string/foo"), call_site, &table, false, &error);
ASSERT_THAT(symbol, NotNull());
EXPECT_TRUE(error.empty());
}
@@ -285,13 +285,13 @@ TEST(ReferenceLinkerTest, AppsWithDifferentPackageCanNotUseEachOthersAttribute)
std::string error;
const CallSite call_site{"com.app.ext"};
- EXPECT_FALSE(ReferenceLinker::CompileXmlAttribute(
- *test::BuildReference("com.app.test:attr/foo"), call_site, &table, &error));
+ EXPECT_FALSE(ReferenceLinker::CompileXmlAttribute(*test::BuildReference("com.app.test:attr/foo"),
+ call_site, &table, false, &error));
EXPECT_FALSE(error.empty());
error = "";
ASSERT_TRUE(ReferenceLinker::CompileXmlAttribute(
- *test::BuildReference("com.app.test:attr/public_foo"), call_site, &table, &error));
+ *test::BuildReference("com.app.test:attr/public_foo"), call_site, &table, false, &error));
EXPECT_TRUE(error.empty());
}
@@ -303,19 +303,74 @@ TEST(ReferenceLinkerTest, ReferenceWithNoPackageUsesCallSitePackage) {
.AddSymbol("com.app.lib:string/foo", ResourceId(0x7f010001))
.Build());
- const SymbolTable::Symbol* s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/foo"),
- CallSite{"com.app.test"}, &table);
+ const SymbolTable::Symbol* s = ReferenceLinker::ResolveSymbol(
+ *test::BuildReference("string/foo"), CallSite{"com.app.test"}, &table, false);
ASSERT_THAT(s, NotNull());
EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010000)));
s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/foo"), CallSite{"com.app.lib"},
- &table);
+ &table, false);
ASSERT_THAT(s, NotNull());
EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010001)));
EXPECT_THAT(ReferenceLinker::ResolveSymbol(*test::BuildReference("string/foo"),
- CallSite{"com.app.bad"}, &table),
+ CallSite{"com.app.bad"}, &table, false),
IsNull());
}
+TEST(ReferenceLinkerTest, AutomaticNamespace) {
+ NameMangler mangler(NameManglerPolicy{"com.example.thislib"});
+ SymbolTable table(&mangler);
+ table.AppendSource(
+ test::StaticSymbolSourceBuilder()
+ .AddSymbol("com.example.thislib:string/thislib_string", ResourceId(0x7f010006))
+ .AddSymbol("com.example.thislib:string/explicit_override_string", ResourceId(0x7f010007))
+ .Build());
+ // Lib2 is higher priority than lib1
+ table.AppendSource(
+ test::StaticSymbolSourceBuilder()
+ .AddSymbol("com.example.lib2:string/lib2_string", ResourceId(0x7f010003))
+ .AddSymbol("com.example.lib2:string/explicit_override_string", ResourceId(0x7f010004))
+ .AddSymbol("com.example.lib2:string/implicit_override_string", ResourceId(0x7f010005))
+ .Build());
+ table.AppendSource(
+ test::StaticSymbolSourceBuilder()
+ .AddSymbol("com.example.lib1:string/explicit_override_string", ResourceId(0x7f010001))
+ .AddSymbol("com.example.lib1:string/implicit_override_string", ResourceId(0x7f010002))
+ .Build());
+
+ // Sanity test: Local references are still fine.
+ const SymbolTable::Symbol* s =
+ ReferenceLinker::ResolveSymbol(*test::BuildReference("string/thislib_string"),
+ CallSite{"com.example.thislib"}, &table, true);
+ ASSERT_THAT(s, NotNull());
+ EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010006)));
+
+ // Local references are fine, even if clash with remote ones.
+ s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/explicit_override_string"),
+ CallSite{"com.example.thislib"}, &table, true);
+ ASSERT_THAT(s, NotNull());
+ EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010007)));
+
+ // An unqualified reference to lib2 is rewritten
+ s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/lib2_string"),
+ CallSite{"com.example.thislib"}, &table, true);
+ ASSERT_THAT(s, NotNull());
+ EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010003)));
+
+ // Qualified references are left alone.
+ s = ReferenceLinker::ResolveSymbol(
+ *test::BuildReference("com.example.lib2:string/explicit_override_string"),
+ CallSite{"com.example.thislib"}, &table, true);
+ ASSERT_THAT(s, NotNull());
+ EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010004)));
+
+ // Implicit overrides respect priority ordering.
+ s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/implicit_override_string"),
+ CallSite{"com.example.thislib"}, &table, true);
+ ASSERT_THAT(s, NotNull());
+ EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010005)));
+
+ //
+}
} // namespace aapt
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index e819f51a5634..91a55b337071 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -102,7 +102,17 @@ static bool MergeType(IAaptContext* context, const Source& src, ResourceTableTyp
}
static bool MergeEntry(IAaptContext* context, const Source& src, bool overlay,
- ResourceEntry* dst_entry, ResourceEntry* src_entry) {
+ ResourceEntry* dst_entry, ResourceEntry* src_entry,
+ bool strict_visibility) {
+ if (strict_visibility
+ && dst_entry->visibility.level != Visibility::Level::kUndefined
+ && src_entry->visibility.level != dst_entry->visibility.level) {
+ context->GetDiagnostics()->Error(
+ DiagMessage(src) << "cannot merge resource '" << dst_entry->name << "' with conflicting visibilities: "
+ << "public and private");
+ return false;
+ }
+
// Copy over the strongest visibility.
if (src_entry->visibility.level > dst_entry->visibility.level) {
// Only copy the ID if the source is public, or else the ID is meaningless.
@@ -234,7 +244,7 @@ bool TableMerger::DoMerge(const Source& src, ResourceTable* src_table,
continue;
}
- if (!MergeEntry(context_, src, overlay, dst_entry, src_entry.get())) {
+ if (!MergeEntry(context_, src, overlay, dst_entry, src_entry.get(), options_.strict_visibility)) {
error = true;
continue;
}
diff --git a/tools/aapt2/link/TableMerger.h b/tools/aapt2/link/TableMerger.h
index 47e23dded26f..24c5e1329244 100644
--- a/tools/aapt2/link/TableMerger.h
+++ b/tools/aapt2/link/TableMerger.h
@@ -35,6 +35,8 @@ namespace aapt {
struct TableMergerOptions {
// If true, resources in overlays can be added without previously having existed.
bool auto_add_overlay = false;
+ // If true, resource overlays with conflicting visibility are not allowed.
+ bool strict_visibility = false;
};
// TableMerger takes resource tables and merges all packages within the tables that have the same
diff --git a/tools/aapt2/link/TableMerger_test.cpp b/tools/aapt2/link/TableMerger_test.cpp
index 34461c6b467d..cf504c4f4ce5 100644
--- a/tools/aapt2/link/TableMerger_test.cpp
+++ b/tools/aapt2/link/TableMerger_test.cpp
@@ -241,6 +241,37 @@ TEST_F(TableMergerTest, FailToOverrideConflictingEntryIdsWithOverlay) {
ASSERT_FALSE(merger.Merge({}, overlay.get(), true /*overlay*/));
}
+TEST_F(TableMergerTest, FailConflictingVisibility) {
+ std::unique_ptr<ResourceTable> base =
+ test::ResourceTableBuilder()
+ .SetPackageId("", 0x7f)
+ .SetSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), Visibility::Level::kPublic)
+ .Build();
+ std::unique_ptr<ResourceTable> overlay =
+ test::ResourceTableBuilder()
+ .SetPackageId("", 0x7f)
+ .SetSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), Visibility::Level::kPrivate)
+ .Build();
+
+ // It should fail if the "--strict-visibility" flag is set.
+ ResourceTable final_table;
+ TableMergerOptions options;
+ options.auto_add_overlay = false;
+ options.strict_visibility = true;
+ TableMerger merger(context_.get(), &final_table, options);
+
+ ASSERT_TRUE(merger.Merge({}, base.get(), false /*overlay*/));
+ ASSERT_FALSE(merger.Merge({}, overlay.get(), true /*overlay*/));
+
+ // But it should still pass if the flag is not set.
+ ResourceTable final_table2;
+ options.strict_visibility = false;
+ TableMerger merger2(context_.get(), &final_table2, options);
+
+ ASSERT_TRUE(merger2.Merge({}, base.get(), false /*overlay*/));
+ ASSERT_TRUE(merger2.Merge({}, overlay.get(), true /*overlay*/));
+}
+
TEST_F(TableMergerTest, MergeAddResourceFromOverlay) {
std::unique_ptr<ResourceTable> table_a =
test::ResourceTableBuilder().SetPackageId("", 0x7f).Build();
diff --git a/tools/aapt2/link/XmlReferenceLinker.cpp b/tools/aapt2/link/XmlReferenceLinker.cpp
index 160ff925f6cc..420a1271479d 100644
--- a/tools/aapt2/link/XmlReferenceLinker.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker.cpp
@@ -97,8 +97,8 @@ class XmlVisitor : public xml::PackageAwareVisitor {
attr_ref.private_reference = maybe_package.value().private_namespace;
std::string err_str;
- attr.compiled_attribute =
- ReferenceLinker::CompileXmlAttribute(attr_ref, callsite_, symbols_, &err_str);
+ attr.compiled_attribute = ReferenceLinker::CompileXmlAttribute(
+ attr_ref, callsite_, symbols_, context_->IsAutoNamespace(), &err_str);
if (!attr.compiled_attribute) {
DiagMessage error_msg(source);
diff --git a/tools/aapt2/link/XmlReferenceLinker_test.cpp b/tools/aapt2/link/XmlReferenceLinker_test.cpp
index ef99355e5b5f..d321f8f76d87 100644
--- a/tools/aapt2/link/XmlReferenceLinker_test.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp
@@ -18,6 +18,7 @@
#include "test/Test.h"
+using ::testing::Eq;
using ::testing::IsNull;
using ::testing::NotNull;
@@ -70,12 +71,29 @@ class XmlReferenceLinkerTest : public ::testing::Test {
.Build())
.AddPublicSymbol("com.app.test:attr/attr", ResourceId(0x7f010002),
test::AttributeBuilder().Build())
+ .AddPublicSymbol("com.app.lib:string/lib_string", ResourceId(0x7f020003))
.Build())
.Build();
+
+ auto_namespace_context_ =
+ test::ContextBuilder()
+ .SetCompilationPackage("com.app.test")
+ .SetNameManglerPolicy(NameManglerPolicy{"com.app.test", {"com.android.support"}})
+ .SetAutoNamespace(true)
+ .AddSymbolSource(
+ test::StaticSymbolSourceBuilder()
+ .AddPublicSymbol("android:attr/text", ResourceId(0x01010003),
+ test::AttributeBuilder()
+ .SetTypeMask(android::ResTable_map::TYPE_STRING)
+ .Build())
+ .AddPublicSymbol("com.app.lib:string/lib_string", ResourceId(0x7f020003))
+ .Build())
+ .Build();
}
protected:
std::unique_ptr<IAaptContext> context_;
+ std::unique_ptr<IAaptContext> auto_namespace_context_;
};
TEST_F(XmlReferenceLinkerTest, LinkBasicAttributes) {
@@ -195,6 +213,31 @@ TEST_F(XmlReferenceLinkerTest, LinkAutoResReference) {
EXPECT_EQ(make_value(ResourceId(0x7f020001)), ref->id);
}
+TEST_F(XmlReferenceLinkerTest, LinkAutoNamespaceResReference) {
+ std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"(
+ <View
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:text="@string/lib_string" />)");
+
+ XmlReferenceLinker linker;
+ // Should not link with auto-namespace support disabled.
+ ASSERT_FALSE(linker.Consume(context_.get(), doc.get()));
+ // Should link with auto-namespace enabled.
+ ASSERT_TRUE(linker.Consume(auto_namespace_context_.get(), doc.get()));
+
+ xml::Element* view_el = doc->root.get();
+ ASSERT_THAT(view_el, NotNull());
+
+ xml::Attribute* xml_attr = view_el->FindAttribute(xml::kSchemaAndroid, "text");
+ ASSERT_THAT(xml_attr, NotNull());
+ ASSERT_TRUE(xml_attr->compiled_attribute);
+ EXPECT_EQ(make_value(ResourceId(0x01010003)), xml_attr->compiled_attribute.value().id);
+ Reference* ref = ValueCast<Reference>(xml_attr->compiled_value.get());
+ ASSERT_THAT(ref, NotNull());
+ ASSERT_TRUE(ref->name);
+ EXPECT_EQ(make_value(ResourceId(0x7f020003)), ref->id);
+}
+
TEST_F(XmlReferenceLinkerTest, LinkViewWithShadowedPackageAlias) {
std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"(
<View xmlns:app="http://schemas.android.com/apk/res/android" app:attr="@app:id/id">
diff --git a/tools/aapt2/optimize/MultiApkGenerator.cpp b/tools/aapt2/optimize/MultiApkGenerator.cpp
index 588b3316e6fa..a931343281bc 100644
--- a/tools/aapt2/optimize/MultiApkGenerator.cpp
+++ b/tools/aapt2/optimize/MultiApkGenerator.cpp
@@ -26,6 +26,7 @@
#include "ResourceUtils.h"
#include "ValueVisitor.h"
#include "configuration/ConfigurationParser.h"
+#include "cmd/Util.h"
#include "filter/AbiFilter.h"
#include "filter/Filter.h"
#include "format/Archive.h"
@@ -98,6 +99,10 @@ class ContextWrapper : public IAaptContext {
util::make_unique<SourcePathDiagnostics>(Source{source}, context_->GetDiagnostics());
}
+ bool IsAutoNamespace() override {
+ return context_->IsAutoNamespace();
+ }
+
private:
IAaptContext* context_;
std::unique_ptr<SourcePathDiagnostics> source_diag_;
@@ -265,7 +270,7 @@ bool MultiApkGenerator::UpdateManifest(const OutputArtifact& artifact,
// Make sure the first element is <manifest> with package attribute.
xml::Element* manifest_el = manifest->root.get();
- if (manifest_el == nullptr) {
+ if (!manifest_el) {
return false;
}
@@ -274,21 +279,35 @@ bool MultiApkGenerator::UpdateManifest(const OutputArtifact& artifact,
return false;
}
- // Update the versionCode attribute.
- xml::Attribute* versionCode = manifest_el->FindAttribute(kSchemaAndroid, "versionCode");
- if (versionCode == nullptr) {
+ // Retrieve the versionCode attribute.
+ auto version_code = manifest_el->FindAttribute(kSchemaAndroid, "versionCode");
+ if (!version_code) {
diag->Error(DiagMessage(manifest->file.source) << "manifest must have a versionCode attribute");
return false;
}
- auto* compiled_version = ValueCast<BinaryPrimitive>(versionCode->compiled_value.get());
- if (compiled_version == nullptr) {
+ auto version_code_value = ValueCast<BinaryPrimitive>(version_code->compiled_value.get());
+ if (!version_code_value) {
diag->Error(DiagMessage(manifest->file.source) << "versionCode is invalid");
return false;
}
- int new_version = compiled_version->value.data + artifact.version;
- versionCode->compiled_value = ResourceUtils::TryParseInt(std::to_string(new_version));
+ // Retrieve the versionCodeMajor attribute.
+ auto version_code_major = manifest_el->FindAttribute(kSchemaAndroid, "versionCodeMajor");
+ BinaryPrimitive* version_code_major_value = nullptr;
+ if (version_code_major) {
+ version_code_major_value = ValueCast<BinaryPrimitive>(version_code_major->compiled_value.get());
+ if (!version_code_major_value) {
+ diag->Error(DiagMessage(manifest->file.source) << "versionCodeMajor is invalid");
+ return false;
+ }
+ }
+
+ // Calculate and set the updated version code
+ uint64_t major = (version_code_major_value)
+ ? ((uint64_t) version_code_major_value->value.data) << 32 : 0;
+ uint64_t new_version = (major | version_code_value->value.data) + artifact.version;
+ SetLongVersionCode(manifest_el, new_version);
// Check to see if the minSdkVersion needs to be updated.
if (artifact.android_sdk) {
diff --git a/tools/aapt2/optimize/ResourceFilter.cpp b/tools/aapt2/optimize/ResourceFilter.cpp
new file mode 100644
index 000000000000..250b65197a7d
--- /dev/null
+++ b/tools/aapt2/optimize/ResourceFilter.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "optimize/ResourceFilter.h"
+
+#include "ResourceTable.h"
+
+namespace aapt {
+
+ResourceFilter::ResourceFilter(const std::unordered_set<ResourceName>& blacklist)
+ : blacklist_(blacklist) {
+}
+
+bool ResourceFilter::Consume(IAaptContext* context, ResourceTable* table) {
+ for (auto& package : table->packages) {
+ for (auto& type : package->types) {
+ for (auto it = type->entries.begin(); it != type->entries.end(); ) {
+ ResourceName resource = ResourceName({}, type->type, (*it)->name);
+ if (blacklist_.find(resource) != blacklist_.end()) {
+ it = type->entries.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ }
+ }
+ return true;
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/optimize/ResourceFilter.h b/tools/aapt2/optimize/ResourceFilter.h
new file mode 100644
index 000000000000..d4baf654b0ff
--- /dev/null
+++ b/tools/aapt2/optimize/ResourceFilter.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef AAPT_OPTIMIZE_RESOURCEFILTER_H
+#define AAPT_OPTIMIZE_RESOURCEFILTER_H
+
+#include "android-base/macros.h"
+
+#include "process/IResourceTableConsumer.h"
+
+#include <unordered_set>
+
+namespace aapt {
+
+// Removes non-whitelisted entries from resource table.
+class ResourceFilter : public IResourceTableConsumer {
+ public:
+ explicit ResourceFilter(const std::unordered_set<ResourceName>& blacklist);
+
+ bool Consume(IAaptContext* context, ResourceTable* table) override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ResourceFilter);
+ std::unordered_set<ResourceName> blacklist_;
+};
+
+} // namespace aapt
+
+#endif // AAPT_OPTIMIZE_RESOURCEFILTER_H
diff --git a/tools/aapt2/optimize/ResourceFilter_test.cpp b/tools/aapt2/optimize/ResourceFilter_test.cpp
new file mode 100644
index 000000000000..800b2bfd0403
--- /dev/null
+++ b/tools/aapt2/optimize/ResourceFilter_test.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "optimize/ResourceFilter.h"
+
+#include "ResourceTable.h"
+#include "test/Test.h"
+
+using ::aapt::test::HasValue;
+using ::testing::Not;
+
+namespace aapt {
+
+TEST(ResourceFilterTest, SomeValuesAreFilteredOut) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ const ConfigDescription default_config = {};
+
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .AddString("android:string/notblacklisted", ResourceId{}, default_config, "value")
+ .AddString("android:string/blacklisted", ResourceId{}, default_config, "value")
+ .AddString("android:string/notblacklisted2", ResourceId{}, default_config, "value")
+ .AddString("android:string/blacklisted2", ResourceId{}, default_config, "value")
+ .Build();
+
+ std::unordered_set<ResourceName> blacklist = {
+ ResourceName({}, ResourceType::kString, "blacklisted"),
+ ResourceName({}, ResourceType::kString, "blacklisted2"),
+ };
+
+ ASSERT_TRUE(ResourceFilter(blacklist).Consume(context.get(), table.get()));
+ EXPECT_THAT(table, HasValue("android:string/notblacklisted", default_config));
+ EXPECT_THAT(table, HasValue("android:string/notblacklisted2", default_config));
+ EXPECT_THAT(table, Not(HasValue("android:string/blacklisted", default_config)));
+ EXPECT_THAT(table, Not(HasValue("android:string/blacklisted2", default_config)));
+}
+
+TEST(ResourceFilterTest, TypeIsCheckedBeforeFiltering) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ const ConfigDescription default_config = {};
+
+ std::unique_ptr<ResourceTable> table =
+ test::ResourceTableBuilder()
+ .AddString("android:string/notblacklisted", ResourceId{}, default_config, "value")
+ .AddString("android:string/blacklisted", ResourceId{}, default_config, "value")
+ .AddString("android:drawable/notblacklisted", ResourceId{}, default_config, "value")
+ .AddString("android:drawable/blacklisted", ResourceId{}, default_config, "value")
+ .Build();
+
+ std::unordered_set<ResourceName> blacklist = {
+ ResourceName({}, ResourceType::kString, "blacklisted"),
+ };
+
+ ASSERT_TRUE(ResourceFilter(blacklist).Consume(context.get(), table.get()));
+ EXPECT_THAT(table, HasValue("android:string/notblacklisted", default_config));
+ EXPECT_THAT(table, HasValue("android:drawable/blacklisted", default_config));
+ EXPECT_THAT(table, HasValue("android:drawable/notblacklisted", default_config));
+ EXPECT_THAT(table, Not(HasValue("android:string/blacklisted", default_config)));
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/process/IResourceTableConsumer.h b/tools/aapt2/process/IResourceTableConsumer.h
index 30dad8025900..a3a7719bfe16 100644
--- a/tools/aapt2/process/IResourceTableConsumer.h
+++ b/tools/aapt2/process/IResourceTableConsumer.h
@@ -50,6 +50,7 @@ struct IAaptContext {
virtual NameMangler* GetNameMangler() = 0;
virtual bool IsVerbose() = 0;
virtual int GetMinSdkVersion() = 0;
+ virtual bool IsAutoNamespace() = 0;
};
struct IResourceTableConsumer {
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index fc4c9b537e73..ef2e448b68b8 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -114,6 +114,16 @@ const SymbolTable::Symbol* SymbolTable::FindByName(const ResourceName& name) {
return shared_symbol.get();
}
+const SymbolTable::Symbol* SymbolTable::FindByNameInAnyPackage(const ResourceName& name) {
+ for (auto& source : sources_) {
+ std::string package = source->GetPackageForSymbol(name);
+ if (!package.empty()) {
+ return FindByName(ResourceName(package, name.type, name.entry));
+ }
+ }
+ return {};
+}
+
const SymbolTable::Symbol* SymbolTable::FindById(const ResourceId& id) {
if (const std::shared_ptr<Symbol>& s = id_cache_.get(id)) {
return s.get();
@@ -211,6 +221,25 @@ std::unique_ptr<SymbolTable::Symbol> ResourceTableSymbolSource::FindByName(
return symbol;
}
+std::string ResourceTableSymbolSource::GetPackageForSymbol(const ResourceName& name) {
+ for (auto& package : table_->packages) {
+ ResourceTableType* type = package->FindType(name.type);
+ if (type == nullptr) {
+ continue;
+ }
+ ResourceEntry* entry = type->FindEntry(name.entry);
+ if (entry == nullptr) {
+ continue;
+ }
+ return package->name;
+ }
+ if (name.type == ResourceType::kAttr) {
+ // Recurse and try looking up a private attribute.
+ return GetPackageForSymbol(ResourceName(name.package, ResourceType::kAttrPrivate, name.entry));
+ }
+ return {};
+}
+
bool AssetManagerSymbolSource::AddAssetPath(const StringPiece& path) {
int32_t cookie = 0;
return assets_.addAssetPath(android::String8(path.data(), path.size()), &cookie);
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index 51a2e373596a..c798cbb8d8a2 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -89,6 +89,13 @@ class SymbolTable {
// results are stored in a cache which may evict entries on subsequent calls.
const Symbol* FindByName(const ResourceName& name);
+ // Finds the symbol from any package, for use as part of automatic conversion to namespaces.
+ // This returns the symbol from the highest priority package,
+ // which mimics the behavior of the resource merger and overlays.
+ // NOTE: Never hold on to the result between calls to FindByXXX. The
+ // results are stored in a cache which may evict entries on subsequent calls.
+ const Symbol* FindByNameInAnyPackage(const ResourceName& name);
+
// NOTE: Never hold on to the result between calls to FindByXXX. The
// results are stored in a cache which may evict entries on subsequent calls.
const Symbol* FindById(const ResourceId& id);
@@ -153,6 +160,11 @@ class ISymbolSource {
virtual std::unique_ptr<SymbolTable::Symbol> FindByName(
const ResourceName& name) = 0;
+ // Finds the name of a symbol from any package,
+ // for use as part of automatic conversion to namespaces.
+ // This returns the symbol from the highest priority package,
+ // which mimics the behavior of the resource merger and overlays.
+ virtual std::string GetPackageForSymbol(const ResourceName& name) = 0;
virtual std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) = 0;
// Default implementation tries the name if it exists, else the ID.
@@ -177,6 +189,7 @@ class ResourceTableSymbolSource : public ISymbolSource {
std::unique_ptr<SymbolTable::Symbol> FindByName(
const ResourceName& name) override;
+ std::string GetPackageForSymbol(const ResourceName& name) override;
std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) override {
return {};
}
@@ -197,6 +210,9 @@ class AssetManagerSymbolSource : public ISymbolSource {
std::unique_ptr<SymbolTable::Symbol> FindByName(
const ResourceName& name) override;
+ std::string GetPackageForSymbol(const ResourceName& name) override {
+ return {};
+ }
std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) override;
std::unique_ptr<SymbolTable::Symbol> FindByReference(
const Reference& ref) override;
diff --git a/tools/aapt2/process/SymbolTable_test.cpp b/tools/aapt2/process/SymbolTable_test.cpp
index 1f59d7034300..df40b26a64f4 100644
--- a/tools/aapt2/process/SymbolTable_test.cpp
+++ b/tools/aapt2/process/SymbolTable_test.cpp
@@ -120,4 +120,39 @@ TEST(SymbolTableTest, FindByNameWhenSymbolIsMangledInResTable) {
EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("com.android.other:id/foo")), IsNull());
}
+TEST(SymbolTableTest, FindByNameInAnyPackage) {
+ // This represents lib3 --depends-on--> lib2 --depends-on--> lib1
+
+ NameMangler mangler(NameManglerPolicy{"com.example.lib3"});
+ SymbolTable symbol_table(&mangler);
+ // Lib2 has higher precedence than lib1, as it is closer to the current library (lib3)
+ // in the dependency graph.
+
+ symbol_table.AppendSource(test::StaticSymbolSourceBuilder()
+ .AddPublicSymbol("com.example.lib1:string/foo", ResourceId())
+ .AddSymbol("com.example.lib1:attr/foo", ResourceId(),
+ test::AttributeBuilder()
+ .SetTypeMask(android::ResTable_map::TYPE_FLAGS)
+ .AddItem("one", 0x01)
+ .AddItem("two", 0x02)
+ .Build())
+ .Build());
+ symbol_table.PrependSource(test::StaticSymbolSourceBuilder()
+ .AddPublicSymbol("com.example.lib2:string/foo", ResourceId())
+ .Build());
+
+ // Sanity test
+ EXPECT_THAT(symbol_table.FindByName(test::ParseNameOrDie("string/foo")), IsNull());
+
+ // Test public symbol resolution
+ const SymbolTable::Symbol* const found_string =
+ symbol_table.FindByNameInAnyPackage(test::ParseNameOrDie("string/foo"));
+ ASSERT_THAT(found_string, NotNull());
+
+ // Test attr resolution
+ const SymbolTable::Symbol* const found_attr =
+ symbol_table.FindByNameInAnyPackage(test::ParseNameOrDie("attr/foo"));
+ ASSERT_THAT(found_attr, NotNull());
+}
+
} // namespace aapt
diff --git a/tools/aapt2/test/Context.h b/tools/aapt2/test/Context.h
index 0564db063b9a..a07d79f01dfe 100644
--- a/tools/aapt2/test/Context.h
+++ b/tools/aapt2/test/Context.h
@@ -81,6 +81,10 @@ class Context : public IAaptContext {
return min_sdk_version_;
}
+ bool IsAutoNamespace() override {
+ return auto_namespace_;
+ }
+
private:
DISALLOW_COPY_AND_ASSIGN(Context);
@@ -93,6 +97,7 @@ class Context : public IAaptContext {
NameMangler name_mangler_;
SymbolTable symbols_;
int min_sdk_version_;
+ bool auto_namespace_;
};
class ContextBuilder {
@@ -127,6 +132,11 @@ class ContextBuilder {
return *this;
}
+ ContextBuilder& SetAutoNamespace(bool auto_namespace) {
+ context_->auto_namespace_ = auto_namespace;
+ return *this;
+ }
+
std::unique_ptr<Context> Build() { return std::move(context_); }
private:
@@ -172,6 +182,15 @@ class StaticSymbolSourceBuilder {
return nullptr;
}
+ std::string GetPackageForSymbol(const ResourceName& name) override {
+ for (auto const& imap : name_map_) {
+ if (imap.first.type == name.type && imap.first.entry == name.entry) {
+ return imap.first.package;
+ }
+ }
+ return "";
+ }
+
std::unique_ptr<SymbolTable::Symbol> FindById(ResourceId id) override {
auto iter = id_map_.find(id);
if (iter != id_map_.end()) {
diff --git a/tools/aapt2/util/Util.cpp b/tools/aapt2/util/Util.cpp
index d1c9ca1644d9..9bef54e590c9 100644
--- a/tools/aapt2/util/Util.cpp
+++ b/tools/aapt2/util/Util.cpp
@@ -297,6 +297,53 @@ bool VerifyJavaStringFormat(const StringPiece& str) {
return true;
}
+std::string Utf8ToModifiedUtf8(const std::string& utf8) {
+ // Java uses Modified UTF-8 which only supports the 1, 2, and 3 byte formats of UTF-8. To encode
+ // 4 byte UTF-8 codepoints, Modified UTF-8 allows the use of surrogate pairs in the same format
+ // of CESU-8 surrogate pairs. Calculate the size of the utf8 string with all 4 byte UTF-8
+ // codepoints replaced with 2 3 byte surrogate pairs
+ size_t modified_size = 0;
+ const size_t size = utf8.size();
+ for (size_t i = 0; i < size; i++) {
+ if (((uint8_t) utf8[i] >> 4) == 0xF) {
+ modified_size += 6;
+ i += 3;
+ } else {
+ modified_size++;
+ }
+ }
+
+ // Early out if no 4 byte codepoints are found
+ if (size == modified_size) {
+ return utf8;
+ }
+
+ std::string output;
+ output.reserve(modified_size);
+ for (size_t i = 0; i < size; i++) {
+ if (((uint8_t) utf8[i] >> 4) == 0xF) {
+ auto codepoint = (char32_t) utf32_from_utf8_at(utf8.data(), size, i, nullptr);
+
+ // Calculate the high and low surrogates as UTF-16 would
+ char32_t high = ((codepoint - 0x10000) / 0x400) + 0xD800;
+ char32_t low = ((codepoint - 0x10000) % 0x400) + 0xDC00;
+
+ // Encode each surrogate in UTF-8
+ output.push_back((char) (0xE4 | ((high >> 12) & 0xF)));
+ output.push_back((char) (0x80 | ((high >> 6) & 0x3F)));
+ output.push_back((char) (0x80 | (high & 0x3F)));
+ output.push_back((char) (0xE4 | ((low >> 12) & 0xF)));
+ output.push_back((char) (0x80 | ((low >> 6) & 0x3F)));
+ output.push_back((char) (0x80 | (low & 0x3F)));
+ i += 3;
+ } else {
+ output.push_back(utf8[i]);
+ }
+ }
+
+ return output;
+}
+
std::u16string Utf8ToUtf16(const StringPiece& utf8) {
ssize_t utf16_length = utf8_to_utf16_length(
reinterpret_cast<const uint8_t*>(utf8.data()), utf8.length());
diff --git a/tools/aapt2/util/Util.h b/tools/aapt2/util/Util.h
index 0eb35d18c06e..36b733376e6f 100644
--- a/tools/aapt2/util/Util.h
+++ b/tools/aapt2/util/Util.h
@@ -197,6 +197,9 @@ inline StringBuilder::operator bool() const {
return error_.empty();
}
+// Converts a UTF8 string into Modified UTF8
+std::string Utf8ToModifiedUtf8(const std::string& utf8);
+
// Converts a UTF8 string to a UTF16 string.
std::u16string Utf8ToUtf16(const android::StringPiece& utf8);
std::string Utf16ToUtf8(const android::StringPiece16& utf16);
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index b6cd08697545..acd07c2876c8 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -423,6 +423,15 @@ const Attribute* Element::FindAttribute(const StringPiece& ns, const StringPiece
return nullptr;
}
+void Element::RemoveAttribute(const StringPiece& ns, const StringPiece& name) {
+ auto new_attr_end = std::remove_if(attributes.begin(), attributes.end(),
+ [&](const Attribute& attr) -> bool {
+ return ns == attr.namespace_uri && name == attr.name;
+ });
+
+ attributes.erase(new_attr_end, attributes.end());
+}
+
Attribute* Element::FindOrCreateAttribute(const StringPiece& ns, const StringPiece& name) {
Attribute* attr = FindAttribute(ns, name);
if (attr == nullptr) {
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index 8f3829611f30..a5b2d10fc9e0 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -102,6 +102,8 @@ class Element : public Node {
const android::StringPiece& name) const;
Attribute* FindOrCreateAttribute(const android::StringPiece& ns,
const android::StringPiece& name);
+ void RemoveAttribute(const android::StringPiece& ns,
+ const android::StringPiece& name);
Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name);
const Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name) const;
diff --git a/tools/aapt2/xml/XmlPullParser.cpp b/tools/aapt2/xml/XmlPullParser.cpp
index 402e5a459f4e..a023494ad8f7 100644
--- a/tools/aapt2/xml/XmlPullParser.cpp
+++ b/tools/aapt2/xml/XmlPullParser.cpp
@@ -38,6 +38,7 @@ XmlPullParser::XmlPullParser(InputStream* in) : in_(in), empty_(), depth_(0) {
EndNamespaceHandler);
XML_SetCharacterDataHandler(parser_, CharacterDataHandler);
XML_SetCommentHandler(parser_, CommentDataHandler);
+ XML_SetCdataSectionHandler(parser_, StartCdataSectionHandler, EndCdataSectionHandler);
event_queue_.push(EventData{Event::kStartDocument, 0, depth_++});
}
@@ -287,6 +288,22 @@ void XMLCALL XmlPullParser::CommentDataHandler(void* user_data,
parser->depth_, comment});
}
+void XMLCALL XmlPullParser::StartCdataSectionHandler(void* user_data) {
+ XmlPullParser* parser = reinterpret_cast<XmlPullParser*>(user_data);
+
+ parser->event_queue_.push(EventData{Event::kCdataStart,
+ XML_GetCurrentLineNumber(parser->parser_),
+ parser->depth_ });
+}
+
+void XMLCALL XmlPullParser::EndCdataSectionHandler(void* user_data) {
+ XmlPullParser* parser = reinterpret_cast<XmlPullParser*>(user_data);
+
+ parser->event_queue_.push(EventData{Event::kCdataEnd,
+ XML_GetCurrentLineNumber(parser->parser_),
+ parser->depth_ });
+}
+
Maybe<StringPiece> FindAttribute(const XmlPullParser* parser,
const StringPiece& name) {
auto iter = parser->FindAttribute("", name);
diff --git a/tools/aapt2/xml/XmlPullParser.h b/tools/aapt2/xml/XmlPullParser.h
index 63db66f0b2b7..6ebaa285745b 100644
--- a/tools/aapt2/xml/XmlPullParser.h
+++ b/tools/aapt2/xml/XmlPullParser.h
@@ -52,6 +52,8 @@ class XmlPullParser : public IPackageDeclStack {
kEndElement,
kText,
kComment,
+ kCdataStart,
+ kCdataEnd,
};
/**
@@ -159,6 +161,8 @@ class XmlPullParser : public IPackageDeclStack {
static void XMLCALL EndElementHandler(void* user_data, const char* name);
static void XMLCALL EndNamespaceHandler(void* user_data, const char* prefix);
static void XMLCALL CommentDataHandler(void* user_data, const char* comment);
+ static void XMLCALL StartCdataSectionHandler(void* user_data);
+ static void XMLCALL EndCdataSectionHandler(void* user_data);
struct EventData {
Event event;
@@ -223,6 +227,10 @@ inline ::std::ostream& operator<<(::std::ostream& out,
return out << "Text";
case XmlPullParser::Event::kComment:
return out << "Comment";
+ case XmlPullParser::Event::kCdataStart:
+ return out << "CdataStart";
+ case XmlPullParser::Event::kCdataEnd:
+ return out << "CdataEnd";
}
return out;
}
@@ -240,6 +248,8 @@ inline bool XmlPullParser::NextChildNode(XmlPullParser* parser, size_t start_dep
case Event::kText:
case Event::kComment:
case Event::kStartElement:
+ case Event::kCdataStart:
+ case Event::kCdataEnd:
return true;
default:
break;
diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py
index 70a47cf42755..018e9c9d5f57 100644
--- a/tools/apilint/apilint.py
+++ b/tools/apilint/apilint.py
@@ -69,12 +69,19 @@ class Field():
self.raw = raw.strip(" {;")
self.blame = blame
+ # drop generics for now; may need multiple passes
+ raw = re.sub("<[^<]+?>", "", raw)
+ raw = re.sub("<[^<]+?>", "", raw)
+
raw = raw.split()
self.split = list(raw)
for r in ["field", "volatile", "transient", "public", "protected", "static", "final", "deprecated"]:
while r in raw: raw.remove(r)
+ # ignore annotations for now
+ raw = [ r for r in raw if not r.startswith("@") ]
+
self.typ = raw[0]
self.name = raw[1].strip(";")
if len(raw) >= 4 and raw[2] == "=":
@@ -97,25 +104,39 @@ class Method():
self.raw = raw.strip(" {;")
self.blame = blame
- # drop generics for now
- raw = re.sub("<.+?>", "", raw)
+ # drop generics for now; may need multiple passes
+ raw = re.sub("<[^<]+?>", "", raw)
+ raw = re.sub("<[^<]+?>", "", raw)
+
+ # handle each clause differently
+ raw_prefix, raw_args, _, raw_throws = re.match(r"(.*?)\((.*?)\)( throws )?(.*?);$", raw).groups()
- raw = re.split("[\s(),;]+", raw)
+ # parse prefixes
+ raw = re.split("[\s]+", raw_prefix)
for r in ["", ";"]:
while r in raw: raw.remove(r)
self.split = list(raw)
- for r in ["method", "public", "protected", "static", "final", "deprecated", "abstract", "default"]:
+ for r in ["method", "public", "protected", "static", "final", "deprecated", "abstract", "default", "operator"]:
while r in raw: raw.remove(r)
self.typ = raw[0]
self.name = raw[1]
+
+ # parse args
self.args = []
+ for arg in re.split(",\s*", raw_args):
+ arg = re.split("\s", arg)
+ # ignore annotations for now
+ arg = [ a for a in arg if not a.startswith("@") ]
+ if len(arg[0]) > 0:
+ self.args.append(arg[0])
+
+ # parse throws
self.throws = []
- target = self.args
- for r in raw[2:]:
- if r == "throws": target = self.throws
- else: target.append(r)
+ for throw in re.split(",\s*", raw_throws):
+ self.throws.append(throw)
+
self.ident = ident(self.raw)
def __hash__(self):
@@ -135,12 +156,18 @@ class Class():
self.fields = []
self.methods = []
+ # drop generics for now; may need multiple passes
+ raw = re.sub("<[^<]+?>", "", raw)
+ raw = re.sub("<[^<]+?>", "", raw)
+
raw = raw.split()
self.split = list(raw)
if "class" in raw:
self.fullname = raw[raw.index("class")+1]
elif "interface" in raw:
self.fullname = raw[raw.index("interface")+1]
+ elif "@interface" in raw:
+ self.fullname = raw[raw.index("@interface")+1]
else:
raise ValueError("Funky class type %s" % (self.raw))
@@ -1334,18 +1361,25 @@ def verify_clone(clazz):
error(clazz, m, None, "Provide an explicit copy constructor instead of implementing clone()")
+def is_interesting(clazz):
+ """Test if given class is interesting from an Android PoV."""
+
+ if clazz.pkg.name.startswith("java"): return False
+ if clazz.pkg.name.startswith("junit"): return False
+ if clazz.pkg.name.startswith("org.apache"): return False
+ if clazz.pkg.name.startswith("org.xml"): return False
+ if clazz.pkg.name.startswith("org.json"): return False
+ if clazz.pkg.name.startswith("org.w3c"): return False
+ if clazz.pkg.name.startswith("android.icu."): return False
+ return True
+
+
def examine_clazz(clazz):
"""Find all style issues in the given class."""
notice(clazz)
- if clazz.pkg.name.startswith("java"): return
- if clazz.pkg.name.startswith("junit"): return
- if clazz.pkg.name.startswith("org.apache"): return
- if clazz.pkg.name.startswith("org.xml"): return
- if clazz.pkg.name.startswith("org.json"): return
- if clazz.pkg.name.startswith("org.w3c"): return
- if clazz.pkg.name.startswith("android.icu."): return
+ if not is_interesting(clazz): return
verify_constants(clazz)
verify_enums(clazz)
@@ -1479,6 +1513,7 @@ def show_deprecations_at_birth(cur, prev):
# Remove all existing things so we're left with new
for prev_clazz in prev.values():
cur_clazz = cur[prev_clazz.fullname]
+ if not is_interesting(cur_clazz): continue
sigs = { i.ident: i for i in prev_clazz.ctors }
cur_clazz.ctors = [ i for i in cur_clazz.ctors if i.ident not in sigs ]
@@ -1506,6 +1541,38 @@ def show_deprecations_at_birth(cur, prev):
print
+def show_stats(cur, prev):
+ """Show API stats."""
+
+ stats = collections.defaultdict(int)
+ for cur_clazz in cur.values():
+ if not is_interesting(cur_clazz): continue
+
+ if cur_clazz.fullname not in prev:
+ stats['new_classes'] += 1
+ stats['new_ctors'] += len(cur_clazz.ctors)
+ stats['new_methods'] += len(cur_clazz.methods)
+ stats['new_fields'] += len(cur_clazz.fields)
+ else:
+ prev_clazz = prev[cur_clazz.fullname]
+
+ sigs = { i.ident: i for i in prev_clazz.ctors }
+ ctors = len([ i for i in cur_clazz.ctors if i.ident not in sigs ])
+ sigs = { i.ident: i for i in prev_clazz.methods }
+ methods = len([ i for i in cur_clazz.methods if i.ident not in sigs ])
+ sigs = { i.ident: i for i in prev_clazz.fields }
+ fields = len([ i for i in cur_clazz.fields if i.ident not in sigs ])
+
+ if ctors + methods + fields > 0:
+ stats['extend_classes'] += 1
+ stats['extend_ctors'] += ctors
+ stats['extend_methods'] += methods
+ stats['extend_fields'] += fields
+
+ print "#", "".join([ k.ljust(20) for k in sorted(stats.keys()) ])
+ print " ", "".join([ str(stats[k]).ljust(20) for k in sorted(stats.keys()) ])
+
+
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Enforces common Android public API design \
patterns. It ignores lint messages from a previous API level, if provided.")
@@ -1520,6 +1587,8 @@ if __name__ == "__main__":
help="Show API changes noticed")
parser.add_argument("--show-deprecations-at-birth", action='store_const', const=True,
help="Show API deprecations at birth")
+ parser.add_argument("--show-stats", action='store_const', const=True,
+ help="Show API stats")
args = vars(parser.parse_args())
if args['no_color']:
@@ -1539,6 +1608,14 @@ if __name__ == "__main__":
show_deprecations_at_birth(cur, prev)
sys.exit()
+ if args['show_stats']:
+ with current_file as f:
+ cur = _parse_stream(f)
+ with previous_file as f:
+ prev = _parse_stream(f)
+ show_stats(cur, prev)
+ sys.exit()
+
with current_file as f:
cur_fail, cur_noticed = examine_stream(f)
if not previous_file is None:
diff --git a/tools/apilint/apilint_stats.sh b/tools/apilint/apilint_stats.sh
new file mode 100755
index 000000000000..052d9a5265fe
--- /dev/null
+++ b/tools/apilint/apilint_stats.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+API=28
+while [ $API -gt 14 ]; do
+ echo "# Changes in API $((API))"
+ python tools/apilint/apilint.py --show-stats ../../prebuilts/sdk/$((API))/public/api/android.txt ../../prebuilts/sdk/$((API-1))/public/api/android.txt
+ let API=API-1
+done
diff --git a/tools/bit/util.cpp b/tools/bit/util.cpp
index 922393146b10..a502a9dbe736 100644
--- a/tools/bit/util.cpp
+++ b/tools/bit/util.cpp
@@ -241,6 +241,8 @@ read_file(const string& filename)
char* buf = (char*)malloc(size);
if ((size_t) size != fread(buf, 1, size, file)) {
+ free(buf);
+ fclose(file);
return string();
}
diff --git a/tools/incident_report/main.cpp b/tools/incident_report/main.cpp
index 302d7395f3e4..be33afcf0f38 100644
--- a/tools/incident_report/main.cpp
+++ b/tools/incident_report/main.cpp
@@ -549,6 +549,7 @@ main(int argc, char** argv)
args[argpos++] = NULL;
execvp(args[0], (char*const*)args);
fprintf(stderr, "execvp failed: %s\n", strerror(errno));
+ free(args);
return 0;
} else {
// parent
diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp
index 3689a8f2981e..639f98062b71 100644
--- a/tools/incident_section_gen/main.cpp
+++ b/tools/incident_section_gen/main.cpp
@@ -110,9 +110,7 @@ static bool generateIncidentSectionsCpp(Descriptor const* descriptor)
N = descriptor->field_count();
for (int i=0; i<N; i++) {
const FieldDescriptor* field = descriptor->field(i);
- if (field->type() == FieldDescriptor::TYPE_MESSAGE) {
- sections[field->name()] = field;
- }
+ sections[field->name()] = field;
}
printf("IncidentSection const INCIDENT_SECTIONS[] = {\n");
@@ -404,7 +402,7 @@ static bool generateSectionListCpp(Descriptor const* descriptor) {
for (int i=0; i<descriptor->field_count(); i++) {
const FieldDescriptor* field = descriptor->field(i);
- if (field->type() != FieldDescriptor::TYPE_MESSAGE) {
+ if (field->type() != FieldDescriptor::TYPE_MESSAGE && field->type() != FieldDescriptor::TYPE_STRING) {
continue;
}
const SectionFlags s = getSectionFlags(field);
@@ -412,8 +410,7 @@ static bool generateSectionListCpp(Descriptor const* descriptor) {
case SECTION_NONE:
continue;
case SECTION_FILE:
- printf(" new FileSection(%d, \"%s\", %s),\n", field->number(), s.args().c_str(),
- s.device_specific() ? "true" : "false");
+ printf(" new FileSection(%d, \"%s\"),\n", field->number(), s.args().c_str());
break;
case SECTION_COMMAND:
printf(" new CommandSection(%d,", field->number());
@@ -457,13 +454,13 @@ static bool generateSectionListCpp(Descriptor const* descriptor) {
const FieldDescriptor* field = fieldsInOrder[i];
const string fieldName = getFieldName(field);
const Destination fieldDest = getFieldDest(field);
- const string fieldMessageName = getMessageName(field->message_type(), fieldDest);
-
- skip[i] = true;
-
if (field->type() != FieldDescriptor::TYPE_MESSAGE) {
+ printPrivacy(fieldName, field, "NULL", fieldDest, "NULL");
continue;
}
+
+ skip[i] = true;
+ const string fieldMessageName = getMessageName(field->message_type(), fieldDest);
// generate privacy flags for each section.
if (generatePrivacyFlags(field->message_type(), fieldDest, variableNames, &parents)) {
printPrivacy(fieldName, field, fieldMessageName, fieldDest, "NULL");
diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp
index 140653a490e1..e519909aa026 100644
--- a/tools/stats_log_api_gen/main.cpp
+++ b/tools/stats_log_api_gen/main.cpp
@@ -624,23 +624,19 @@ write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl &attributio
return 0;
}
-static void write_java_usage(
- FILE* out, const string& method_name, const string& atom_code_name,
- const AtomDecl& atom, const AtomDecl &attributionDecl) {
+static void write_java_usage(FILE* out, const string& method_name, const string& atom_code_name,
+ const AtomDecl& atom) {
fprintf(out, " * Usage: StatsLog.%s(StatsLog.%s",
method_name.c_str(), atom_code_name.c_str());
for (vector<AtomField>::const_iterator field = atom.fields.begin();
field != atom.fields.end(); field++) {
if (field->javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- for (auto chainField : attributionDecl.fields) {
- fprintf(out, ", %s[] %s",
- java_type_name(chainField.javaType), chainField.name.c_str());
- }
+ fprintf(out, ", android.os.WorkSource workSource");
} else {
fprintf(out, ", %s %s", java_type_name(field->javaType), field->name.c_str());
}
}
- fprintf(out, ");\n");
+ fprintf(out, ");<br>\n");
}
static void write_java_method(
@@ -666,6 +662,75 @@ static void write_java_method(
}
}
+static void write_java_work_source_method(FILE* out, const set<vector<java_type_t>>& signatures) {
+ fprintf(out, "\n // WorkSource methods.\n");
+ for (set<vector<java_type_t>>::const_iterator signature = signatures.begin();
+ signature != signatures.end(); signature++) {
+ // Determine if there is Attribution in this signature.
+ int attributionArg = -1;
+ int argIndexMax = 0;
+ for (vector<java_type_t>::const_iterator arg = signature->begin();
+ arg != signature->end(); arg++) {
+ argIndexMax++;
+ if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
+ if (attributionArg > -1) {
+ fprintf(stderr, "An atom contains multiple AttributionNode fields.\n");
+ fprintf(stderr, "This is not supported. Aborting WorkSource method writing.\n");
+ fprintf(out, "\n// Invalid for WorkSource: more than one attribution chain.\n");
+ return;
+ }
+ attributionArg = argIndexMax;
+ }
+ }
+ if (attributionArg < 0) {
+ continue;
+ }
+
+ // Method header (signature)
+ fprintf(out, " public static void write(int code");
+ int argIndex = 1;
+ for (vector<java_type_t>::const_iterator arg = signature->begin();
+ arg != signature->end(); arg++) {
+ if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
+ fprintf(out, ", WorkSource ws");
+ } else {
+ fprintf(out, ", %s arg%d", java_type_name(*arg), argIndex);
+ }
+ argIndex++;
+ }
+ fprintf(out, ") {\n");
+
+ // write_non_chained() component. TODO: Remove when flat uids are no longer needed.
+ fprintf(out, " for (int i = 0; i < ws.size(); ++i) {\n");
+ fprintf(out, " write_non_chained(code");
+ for (int argIndex = 1; argIndex <= argIndexMax; argIndex++) {
+ if (argIndex == attributionArg) {
+ fprintf(out, ", ws.get(i), ws.getName(i)");
+ } else {
+ fprintf(out, ", arg%d", argIndex);
+ }
+ }
+ fprintf(out, ");\n");
+ fprintf(out, " }\n"); // close flor-loop
+
+ // write() component.
+ fprintf(out, " ArrayList<WorkSource.WorkChain> workChains = ws.getWorkChains();\n");
+ fprintf(out, " if (workChains != null) {\n");
+ fprintf(out, " for (WorkSource.WorkChain wc : workChains) {\n");
+ fprintf(out, " write(code");
+ for (int argIndex = 1; argIndex <= argIndexMax; argIndex++) {
+ if (argIndex == attributionArg) {
+ fprintf(out, ", wc.getUids(), wc.getTags()");
+ } else {
+ fprintf(out, ", arg%d", argIndex);
+ }
+ }
+ fprintf(out, ");\n");
+ fprintf(out, " }\n"); // close for-loop
+ fprintf(out, " }\n"); // close if
+ fprintf(out, " }\n"); // close method
+ }
+}
static int
write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl &attributionDecl)
@@ -675,6 +740,9 @@ write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl &attributionD
fprintf(out, "\n");
fprintf(out, "package android.util;\n");
fprintf(out, "\n");
+ fprintf(out, "import android.os.WorkSource;\n");
+ fprintf(out, "import java.util.ArrayList;\n");
+ fprintf(out, "\n");
fprintf(out, "\n");
fprintf(out, "/**\n");
fprintf(out, " * API For logging statistics events.\n");
@@ -692,12 +760,11 @@ write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl &attributionD
string constant = make_constant_name(atom->name);
fprintf(out, "\n");
fprintf(out, " /**\n");
- fprintf(out, " * %s %s\n", atom->message.c_str(), atom->name.c_str());
- write_java_usage(out, "write", constant, *atom, attributionDecl);
+ fprintf(out, " * %s %s<br>\n", atom->message.c_str(), atom->name.c_str());
+ write_java_usage(out, "write", constant, *atom);
auto non_chained_decl = atom_code_to_non_chained_decl_map.find(atom->code);
if (non_chained_decl != atom_code_to_non_chained_decl_map.end()) {
- write_java_usage(out, "write_non_chained", constant, *non_chained_decl->second,
- attributionDecl);
+ write_java_usage(out, "write_non_chained", constant, *non_chained_decl->second);
}
fprintf(out, " */\n");
fprintf(out, " public static final int %s = %d;\n", constant.c_str(), atom->code);
@@ -730,6 +797,7 @@ write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl &attributionD
fprintf(out, " // Write methods\n");
write_java_method(out, "write", atoms.signatures, attributionDecl);
write_java_method(out, "write_non_chained", atoms.non_chained_signatures, attributionDecl);
+ write_java_work_source_method(out, atoms.signatures);
fprintf(out, "}\n");
diff --git a/tools/stringslint/stringslint.py b/tools/stringslint/stringslint.py
index d637ff346c82..03c0b9af66a0 100644
--- a/tools/stringslint/stringslint.py
+++ b/tools/stringslint/stringslint.py
@@ -20,11 +20,22 @@ a previous strings file, if provided.
Usage: stringslint.py strings.xml
Usage: stringslint.py strings.xml old_strings.xml
+
+In general:
+* Errors signal issues that must be fixed before submitting, and are only
+ used when there are no false-positives.
+* Warnings signal issues that might need to be fixed, but need manual
+ inspection due to risk of false-positives.
+* Info signal issues that should be fixed to match best-practices, such
+ as providing comments to aid translation.
"""
-import re, sys
+import re, sys, codecs
import lxml.etree as ET
+reload(sys)
+sys.setdefaultencoding('utf8')
+
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
def format(fg=None, bg=None, bright=False, bold=False, dim=False, reset=False):
@@ -43,10 +54,10 @@ def format(fg=None, bg=None, bright=False, bold=False, dim=False, reset=False):
warnings = None
-def warn(tag, msg, actual, expected):
+def warn(tag, msg, actual, expected, color=YELLOW):
global warnings
key = "%s:%d" % (tag.attrib["name"], hash(msg))
- value = "%sLine %d: '%s':%s %s" % (format(fg=YELLOW, bold=True),
+ value = "%sLine %d: '%s':%s %s" % (format(fg=color, bold=True),
tag.sourceline,
tag.attrib["name"],
format(reset=True),
@@ -59,6 +70,46 @@ def warn(tag, msg, actual, expected):
format(reset=True))
warnings[key] = value
+
+def error(tag, msg, actual, expected):
+ warn(tag, msg, actual, expected, RED)
+
+def info(tag, msg, actual, expected):
+ warn(tag, msg, actual, expected, CYAN)
+
+# Escaping logic borrowed from https://stackoverflow.com/a/24519338
+ESCAPE_SEQUENCE_RE = re.compile(r'''
+ ( \\U........ # 8-digit hex escapes
+ | \\u.... # 4-digit hex escapes
+ | \\x.. # 2-digit hex escapes
+ | \\[0-7]{1,3} # Octal escapes
+ | \\N\{[^}]+\} # Unicode characters by name
+ | \\[\\'"abfnrtv] # Single-character escapes
+ )''', re.UNICODE | re.VERBOSE)
+
+def decode_escapes(s):
+ def decode_match(match):
+ return codecs.decode(match.group(0), 'unicode-escape')
+
+ s = re.sub(r"\n\s*", " ", s)
+ s = ESCAPE_SEQUENCE_RE.sub(decode_match, s)
+ s = re.sub(r"%(\d+\$)?[a-z]", "____", s)
+ s = re.sub(r"\^\d+", "____", s)
+ s = re.sub(r"<br/?>", "\n", s)
+ s = re.sub(r"</?[a-z]+>", "", s)
+ return s
+
+def sample_iter(tag):
+ if not isinstance(tag, ET._Comment) and re.match("{.*xliff.*}g", tag.tag) and "example" in tag.attrib:
+ yield tag.attrib["example"]
+ elif tag.text:
+ yield decode_escapes(tag.text)
+ for e in tag:
+ for v in sample_iter(e):
+ yield v
+ if e.tail:
+ yield decode_escapes(e.tail)
+
def lint(path):
global warnings
warnings = {}
@@ -80,35 +131,45 @@ def lint(path):
comment = last_comment
last_comment = None
+ # Prepare string for analysis
+ text = "".join(child.itertext())
+ sample = "".join(sample_iter(child)).strip().strip("'\"")
+
# Validate comment
if comment is None:
- warn(child, "Missing string comment to aid translation",
+ info(child, "Missing string comment to aid translation",
None, None)
continue
if "do not translate" in comment.text.lower():
continue
if "translatable" in child.attrib and child.attrib["translatable"].lower() == "false":
continue
- if re.search("CHAR[ _-]LIMIT=(\d+|NONE|none)", comment.text) is None:
- warn(child, "Missing CHAR LIMIT to aid translation",
+
+ limit = re.search("CHAR[ _-]LIMIT=(\d+|NONE|none)", comment.text)
+ if limit is None:
+ info(child, "Missing CHAR LIMIT to aid translation",
repr(comment), "<!-- Description of string [CHAR LIMIT=32] -->")
+ elif re.match("\d+", limit.group(1)):
+ limit = int(limit.group(1))
+ if len(sample) > limit:
+ warn(child, "Expanded string length is larger than CHAR LIMIT",
+ sample, None)
# Look for common mistakes/substitutions
- text = "".join(child.itertext()).strip()
if "'" in text:
- warn(child, "Turned quotation mark glyphs are more polished",
+ error(child, "Turned quotation mark glyphs are more polished",
text, "This doesn\u2019t need to \u2018happen\u2019 today")
if '"' in text and not text.startswith('"') and text.endswith('"'):
- warn(child, "Turned quotation mark glyphs are more polished",
+ error(child, "Turned quotation mark glyphs are more polished",
text, "This needs to \u201chappen\u201d today")
if "..." in text:
- warn(child, "Ellipsis glyph is more polished",
+ error(child, "Ellipsis glyph is more polished",
text, "Loading\u2026")
if "wi-fi" in text.lower():
- warn(child, "Non-breaking glyph is more polished",
+ error(child, "Non-breaking glyph is more polished",
text, "Wi\u2011Fi")
if "wifi" in text.lower():
- warn(child, "Using non-standard spelling",
+ error(child, "Using non-standard spelling",
text, "Wi\u2011Fi")
if re.search("\d-\d", text):
warn(child, "Ranges should use en dash glyph",
@@ -119,11 +180,17 @@ def lint(path):
if ". " in text:
warn(child, "Only use single space between sentences",
text, "First idea. Second idea.")
+ if re.match(r"^[A-Z\s]{5,}$", text):
+ warn(child, "Actions should use android:textAllCaps in layout; ignore if acronym",
+ text, "Refresh data")
+ if " phone " in text and "product" not in child.attrib:
+ warn(child, "Strings mentioning phones should have variants for tablets",
+ text, None)
# When more than one substitution, require indexes
if len(re.findall("%[^%]", text)) > 1:
if len(re.findall("%[^\d]", text)) > 0:
- warn(child, "Substitutions must be indexed",
+ error(child, "Substitutions must be indexed",
text, "Add %1$s to %2$s")
# Require xliff substitutions
@@ -132,15 +199,15 @@ def lint(path):
if gc.tail and re.search("%[^%]", gc.tail): badsub = True
if re.match("{.*xliff.*}g", gc.tag):
if "id" not in gc.attrib:
- warn(child, "Substitutions must define id attribute",
+ error(child, "Substitutions must define id attribute",
None, "<xliff:g id=\"domain\" example=\"example.com\">%1$s</xliff:g>")
if "example" not in gc.attrib:
- warn(child, "Substitutions must define example attribute",
+ error(child, "Substitutions must define example attribute",
None, "<xliff:g id=\"domain\" example=\"example.com\">%1$s</xliff:g>")
else:
if gc.text and re.search("%[^%]", gc.text): badsub = True
if badsub:
- warn(child, "Substitutions must be inside xliff tags",
+ error(child, "Substitutions must be inside xliff tags",
text, "<xliff:g id=\"domain\" example=\"example.com\">%1$s</xliff:g>")
return warnings
diff --git a/vr/Android.bp b/vr/Android.bp
new file mode 100644
index 000000000000..775ec968f59d
--- /dev/null
+++ b/vr/Android.bp
@@ -0,0 +1,41 @@
+// Copyright (C) 2017 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.
+
+// Library to perform dlopen on the actual shared library.
+cc_library_shared {
+ name: "libdvr_loader",
+ owner: "google",
+ srcs: ["dvr_library_loader.cpp"],
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+}
+
+// Java platform library for vr stuff.
+java_library {
+ name: "com.google.vr.platform",
+ installable: true,
+ owner: "google",
+ required: [
+ "libdvr_loader",
+ "libdvr",
+ ],
+ srcs: ["java/**/*.java"],
+}
+
+prebuilt_etc_xml {
+ name: "com.google.vr.platform.xml",
+ src: "com.google.vr.platform.xml",
+}
diff --git a/vr/Android.mk b/vr/Android.mk
deleted file mode 100644
index 73e9f23ba067..000000000000
--- a/vr/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2017 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.
-LOCAL_PATH := $(call my-dir)
-
-# Library to perform dlopen on the actual shared library.
-include $(CLEAR_VARS)
-LOCAL_MODULE := libdvr_loader
-LOCAL_MODULE_OWNER := google
-LOCAL_SRC_FILES := dvr_library_loader.cpp
-LOCAL_CFLAGS := -Wall -Werror
-include $(BUILD_SHARED_LIBRARY)
-
-# Java platform library for vr stuff.
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.google.vr.platform
-LOCAL_MODULE_OWNER := google
-LOCAL_REQUIRED_MODULES := libdvr_loader libdvr
-LOCAL_SRC_FILES := $(call all-java-files-under, java)
-include $(BUILD_JAVA_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := com.google.vr.platform.xml
-LOCAL_SRC_FILES := com.google.vr.platform.xml
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_OWNER := google
-LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
-include $(BUILD_PREBUILT)
diff --git a/wifi/OWNERS b/wifi/OWNERS
index 0efa4646a80a..0601047d7caa 100644
--- a/wifi/OWNERS
+++ b/wifi/OWNERS
@@ -1,5 +1,6 @@
set noparent
etancohen@google.com
+mplass@google.com
+rpius@google.com
satk@google.com
-silberst@google.com
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index fa83f8f9d572..0dd672fd0098 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -148,6 +148,8 @@ interface IWifiManager
boolean setWifiApConfiguration(in WifiConfiguration wifiConfig, String packageName);
+ void notifyUserOfApBandConversion(String packageName);
+
Messenger getWifiServiceMessenger(String packageName);
void enableTdls(String remoteIPAddress, boolean enable);
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index d96ddf93f3e0..49c7779ba3f8 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -2278,6 +2278,21 @@ public class WifiManager {
}
/**
+ * Method that triggers a notification to the user about a conversion to their saved AP config.
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
+ public void notifyUserOfApBandConversion() {
+ Log.d(TAG, "apBand was converted, notify the user");
+ try {
+ mService.notifyUserOfApBandConversion(mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Enable/Disable TDLS on a specific local route.
*
* <p>
diff --git a/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java b/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java
index f6183fa219a1..984cf7d62aa5 100644
--- a/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java
+++ b/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java
@@ -136,7 +136,7 @@ public final class PpsMoParser {
private static final String NODE_UPDATE_IDENTIFIER = "UpdateIdentifier";
private static final String NODE_AAA_SERVER_TRUST_ROOT = "AAAServerTrustRoot";
private static final String NODE_SUBSCRIPTION_UPDATE = "SubscriptionUpdate";
- private static final String NODE_SUBSCRIPTION_PARAMETER = "SubscriptionParameter";
+ private static final String NODE_SUBSCRIPTION_PARAMETER = "SubscriptionParameters";
private static final String NODE_TYPE_OF_SUBSCRIPTION = "TypeOfSubscription";
private static final String NODE_USAGE_LIMITS = "UsageLimits";
private static final String NODE_DATA_LIMIT = "DataLimit";
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
index a68bcd98cac5..98a595b513a1 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
@@ -20,6 +20,8 @@ import android.os.Parcelable;
import android.os.Parcel;
import android.util.Log;
+import java.util.Objects;
+
import java.util.regex.Pattern;
import java.util.regex.Matcher;
@@ -315,6 +317,11 @@ public class WifiP2pDevice implements Parcelable {
}
@Override
+ public int hashCode() {
+ return Objects.hashCode(deviceAddress);
+ }
+
+ @Override
public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("Device: ").append(deviceName);
diff --git a/wifi/tests/Android.mk b/wifi/tests/Android.mk
index 2cb45514e061..73341ac55b67 100644
--- a/wifi/tests/Android.mk
+++ b/wifi/tests/Android.mk
@@ -34,10 +34,6 @@ local_java_files := $(filter %.java,$(LOCAL_SRC_FILES))
# This only works if the class name matches the file name and the directory structure
# matches the package.
local_classes := $(subst /,.,$(patsubst src/%.java,%,$(local_java_files)))
-# Utility variables to allow replacing a space with a comma
-comma:= ,
-empty:=
-space:= $(empty) $(empty)
# Convert class name list to jacoco exclude list
# This appends a * to all classes and replace the space separators with commas.
# These patterns will match all classes in this module and their inner classes.
diff --git a/wifi/tests/assets/pps/PerProviderSubscription.xml b/wifi/tests/assets/pps/PerProviderSubscription.xml
index 1fb83094a002..e4472ce19d51 100644
--- a/wifi/tests/assets/pps/PerProviderSubscription.xml
+++ b/wifi/tests/assets/pps/PerProviderSubscription.xml
@@ -368,7 +368,7 @@
</Node>
</Node>
<Node>
- <NodeName>SubscriptionParameter</NodeName>
+ <NodeName>SubscriptionParameters</NodeName>
<Node>
<NodeName>CreationDate</NodeName>
<Value>2016-02-01T10:00:00Z</Value>
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceTest.java
new file mode 100644
index 000000000000..e49247520ac7
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017 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.net.wifi.p2p;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Unit test harness for {@link android.net.wifi.p2p.WifiP2pDevice}
+ */
+public class WifiP2pDeviceTest {
+
+ /**
+ * Check equals and hashCode consistency
+ */
+ @Test
+ public void testEqualsWithHashCode() throws Exception {
+ WifiP2pDevice dev_a = new WifiP2pDevice();
+ dev_a.deviceAddress = new String("02:90:4c:a0:92:54");
+ WifiP2pDevice dev_b = new WifiP2pDevice();
+ dev_b.deviceAddress = new String("02:90:4c:a0:92:54");
+
+ assertTrue(dev_a.equals(dev_b));
+ assertEquals(dev_a.hashCode(), dev_b.hashCode());
+ }
+}